diff options
Diffstat (limited to 'src')
375 files changed, 30237 insertions, 12298 deletions
diff --git a/src/common/Makefile.nmake b/src/common/Makefile.nmake index b8c5dd4fea..a1c819fffa 100644 --- a/src/common/Makefile.nmake +++ b/src/common/Makefile.nmake @@ -7,8 +7,8 @@ LIBOR_OBJECTS = address.obj backtrace.obj compat.obj container.obj di_ops.obj \ log.obj memarea.obj mempool.obj procmon.obj sandbox.obj util.obj \ util_codedigest.obj -LIBOR_CRYPTO_OBJECTS = aes.obj crypto.obj crypto_format.obj torgzip.obj tortls.obj \ - crypto_curve25519.obj curve25519-donna.obj +LIBOR_CRYPTO_OBJECTS = aes.obj crypto.obj crypto_format.obj compress.obj compress_zlib.obj \ + tortls.obj crypto_curve25519.obj curve25519-donna.obj LIBOR_EVENT_OBJECTS = compat_libevent.obj diff --git a/src/common/address.c b/src/common/address.c index 2693239146..c5d0e918ca 100644 --- a/src/common/address.c +++ b/src/common/address.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1198,7 +1198,7 @@ tor_addr_hash(const tor_addr_t *addr) /* LCOV_EXCL_START */ tor_fragile_assert(); return 0; - /* LCOV_EXCL_END */ + /* LCOV_EXCL_STOP */ } } diff --git a/src/common/address.h b/src/common/address.h index 0dc6edae37..ce85b3d81d 100644 --- a/src/common/address.h +++ b/src/common/address.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/aes.c b/src/common/aes.c index 35c2d1e3a5..73abef143e 100644 --- a/src/common/aes.c +++ b/src/common/aes.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/aes.h b/src/common/aes.h index 1cda53f2fa..6fd9c3ea16 100644 --- a/src/common/aes.h +++ b/src/common/aes.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Implements a minimal interface to counter-mode AES. */ diff --git a/src/common/backtrace.c b/src/common/backtrace.c index 61096952d8..0f0fa857bf 100644 --- a/src/common/backtrace.c +++ b/src/common/backtrace.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/backtrace.h b/src/common/backtrace.h index b53fd2c668..8cd1dcf06c 100644 --- a/src/common/backtrace.h +++ b/src/common/backtrace.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_BACKTRACE_H diff --git a/src/common/compat.c b/src/common/compat.c index 0dbede6bed..390cff7dba 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat.h b/src/common/compat.h index ee1c9454de..68fad9b598 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_H diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c index 4a3b1af922..1146d02168 100644 --- a/src/common/compat_libevent.c +++ b/src/common/compat_libevent.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Tor Project, Inc. */ +/* Copyright (c) 2009-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat_libevent.h b/src/common/compat_libevent.h index c2e34764e4..96c48d53a1 100644 --- a/src/common/compat_libevent.h +++ b/src/common/compat_libevent.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Tor Project, Inc. */ +/* Copyright (c) 2009-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_LIBEVENT_H diff --git a/src/common/compat_openssl.h b/src/common/compat_openssl.h index 1bfe188075..2b94fe5b4e 100644 --- a/src/common/compat_openssl.h +++ b/src/common/compat_openssl.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_OPENSSL_H diff --git a/src/common/compat_pthreads.c b/src/common/compat_pthreads.c index c1ae66c1d2..8e4b833573 100644 --- a/src/common/compat_pthreads.c +++ b/src/common/compat_pthreads.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat_threads.c b/src/common/compat_threads.c index f4809060d6..c593e9af8d 100644 --- a/src/common/compat_threads.c +++ b/src/common/compat_threads.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -94,51 +94,73 @@ in_main_thread(void) } #if defined(HAVE_EVENTFD) || defined(HAVE_PIPE) -/* As write(), but retry on EINTR */ +/* As write(), but retry on EINTR, and return the negative error code on + * error. */ static int write_ni(int fd, const void *buf, size_t n) { int r; again: r = (int) write(fd, buf, n); - if (r < 0 && errno == EINTR) - goto again; + if (r < 0) { + if (errno == EINTR) + goto again; + else + return -errno; + } return r; } -/* As read(), but retry on EINTR */ +/* As read(), but retry on EINTR, and return the negative error code on error. + */ static int read_ni(int fd, void *buf, size_t n) { int r; again: r = (int) read(fd, buf, n); - if (r < 0 && errno == EINTR) - goto again; + if (r < 0) { + if (errno == EINTR) + goto again; + else + return -errno; + } return r; } #endif -/** As send(), but retry on EINTR. */ +/** As send(), but retry on EINTR, and return the negative error code on + * error. */ static int send_ni(int fd, const void *buf, size_t n, int flags) { int r; again: r = (int) send(fd, buf, n, flags); - if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd))) - goto again; + if (r < 0) { + int error = tor_socket_errno(fd); + if (ERRNO_IS_EINTR(error)) + goto again; + else + return -error; + } return r; } -/** As recv(), but retry on EINTR. */ +/** As recv(), but retry on EINTR, and return the negative error code on + * error. */ static int recv_ni(int fd, void *buf, size_t n, int flags) { int r; again: r = (int) recv(fd, buf, n, flags); - if (r < 0 && ERRNO_IS_EINTR(tor_socket_errno(fd))) - goto again; + if (r < 0) { + int error = tor_socket_errno(fd); + if (ERRNO_IS_EINTR(error)) + goto again; + else + return -error; + } return r; } @@ -149,7 +171,7 @@ eventfd_alert(int fd) { uint64_t u = 1; int r = write_ni(fd, (void*)&u, sizeof(u)); - if (r < 0 && errno != EAGAIN) + if (r < 0 && -r != EAGAIN) return -1; return 0; } @@ -160,8 +182,8 @@ eventfd_drain(int fd) { uint64_t u = 0; int r = read_ni(fd, (void*)&u, sizeof(u)); - if (r < 0 && errno != EAGAIN) - return -1; + if (r < 0 && -r != EAGAIN) + return r; return 0; } #endif @@ -172,8 +194,8 @@ static int pipe_alert(int fd) { ssize_t r = write_ni(fd, "x", 1); - if (r < 0 && errno != EAGAIN) - return -1; + if (r < 0 && -r != EAGAIN) + return (int)r; return 0; } @@ -188,7 +210,7 @@ pipe_drain(int fd) r = read_ni(fd, buf, sizeof(buf)); } while (r > 0); if (r < 0 && errno != EAGAIN) - return -1; + return -errno; /* A value of r = 0 means EOF on the fd so successfully drained. */ return 0; } @@ -200,13 +222,13 @@ static int sock_alert(tor_socket_t fd) { ssize_t r = send_ni(fd, "x", 1, 0); - if (r < 0 && !ERRNO_IS_EAGAIN(tor_socket_errno(fd))) - return -1; + if (r < 0 && !ERRNO_IS_EAGAIN(-r)) + return (int)r; return 0; } /** Drain all the input from a socket <b>fd</b>, and ignore it. Return 0 on - * success, -1 on error. */ + * success, -errno on error. */ static int sock_drain(tor_socket_t fd) { @@ -215,8 +237,8 @@ sock_drain(tor_socket_t fd) do { r = recv_ni(fd, buf, sizeof(buf), 0); } while (r > 0); - if (r < 0 && !ERRNO_IS_EAGAIN(tor_socket_errno(fd))) - return -1; + if (r < 0 && !ERRNO_IS_EAGAIN(-r)) + return (int)r; /* A value of r = 0 means EOF on the fd so successfully drained. */ return 0; } @@ -330,3 +352,49 @@ alert_sockets_close(alert_sockets_t *socks) socks->read_fd = socks->write_fd = -1; } +/* + * XXXX We might be smart to move to compiler intrinsics or real atomic + * XXXX operations at some point. But not yet. + * + */ + +/** Initialize a new atomic counter with the value 0 */ +void +atomic_counter_init(atomic_counter_t *counter) +{ + memset(counter, 0, sizeof(*counter)); + tor_mutex_init_nonrecursive(&counter->mutex); +} +/** Clean up all resources held by an atomic counter. */ +void +atomic_counter_destroy(atomic_counter_t *counter) +{ + tor_mutex_uninit(&counter->mutex); + memset(counter, 0, sizeof(*counter)); +} +/** Add a value to an atomic counter. */ +void +atomic_counter_add(atomic_counter_t *counter, size_t add) +{ + tor_mutex_acquire(&counter->mutex); + counter->val += add; + tor_mutex_release(&counter->mutex); +} +/** Subtract a value from an atomic counter. */ +void +atomic_counter_sub(atomic_counter_t *counter, size_t sub) +{ + // this relies on unsigned overflow, but that's fine. + atomic_counter_add(counter, -sub); +} +/** Return the current value of an atomic counter */ +size_t +atomic_counter_get(atomic_counter_t *counter) +{ + size_t val; + tor_mutex_acquire(&counter->mutex); + val = counter->val; + tor_mutex_release(&counter->mutex); + return val; +} + diff --git a/src/common/compat_threads.h b/src/common/compat_threads.h index 171a9f93ff..9fa3d0d0b7 100644 --- a/src/common/compat_threads.h +++ b/src/common/compat_threads.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_COMPAT_THREADS_H @@ -147,5 +147,19 @@ void *tor_threadlocal_get(tor_threadlocal_t *threadlocal); */ void tor_threadlocal_set(tor_threadlocal_t *threadlocal, void *value); +/** + * Atomic counter type; holds a size_t value. + */ +typedef struct atomic_counter_t { + tor_mutex_t mutex; + size_t val; +} atomic_counter_t; + +void atomic_counter_init(atomic_counter_t *counter); +void atomic_counter_destroy(atomic_counter_t *counter); +void atomic_counter_add(atomic_counter_t *counter, size_t add); +void atomic_counter_sub(atomic_counter_t *counter, size_t sub); +size_t atomic_counter_get(atomic_counter_t *counter); + #endif diff --git a/src/common/compat_time.c b/src/common/compat_time.c index d044bbe1d7..2ccaa36e49 100644 --- a/src/common/compat_time.c +++ b/src/common/compat_time.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat_time.h b/src/common/compat_time.h index 2262446e57..90194c5ebc 100644 --- a/src/common/compat_time.h +++ b/src/common/compat_time.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compat_winthreads.c b/src/common/compat_winthreads.c index 735be4ad17..915368b94f 100644 --- a/src/common/compat_winthreads.c +++ b/src/common/compat_winthreads.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/compress.c b/src/common/compress.c new file mode 100644 index 0000000000..6fe4569868 --- /dev/null +++ b/src/common/compress.c @@ -0,0 +1,593 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress.c + * \brief Common compression API. + **/ + +#include "orconfig.h" + +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> +#include <string.h> +#include "torint.h" + +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_lzma.h" +#include "compress_none.h" +#include "compress_zlib.h" +#include "compress_zstd.h" + +/** Total number of bytes allocated for compression state overhead. */ +static atomic_counter_t total_compress_allocation; + +/** @{ */ +/* These macros define the maximum allowable compression factor. Anything of + * size greater than CHECK_FOR_COMPRESSION_BOMB_AFTER is not allowed to + * have an uncompression factor (uncompressed size:compressed size ratio) of + * any greater than MAX_UNCOMPRESSION_FACTOR. + * + * Picking a value for MAX_UNCOMPRESSION_FACTOR is a trade-off: we want it to + * be small to limit the attack multiplier, but we also want it to be large + * enough so that no legitimate document --even ones we might invent in the + * future -- ever compresses by a factor of greater than + * MAX_UNCOMPRESSION_FACTOR. Within those parameters, there's a reasonably + * large range of possible values. IMO, anything over 8 is probably safe; IMO + * anything under 50 is probably sufficient. + */ +#define MAX_UNCOMPRESSION_FACTOR 25 +#define CHECK_FOR_COMPRESSION_BOMB_AFTER (1024*64) +/** @} */ + +/** Return true if uncompressing an input of size <b>in_size</b> to an input of + * size at least <b>size_out</b> looks like a compression bomb. */ +int +tor_compress_is_compression_bomb(size_t size_in, size_t size_out) +{ + if (size_in == 0 || size_out < CHECK_FOR_COMPRESSION_BOMB_AFTER) + return 0; + + return (size_out / size_in > MAX_UNCOMPRESSION_FACTOR); +} + +/** Guess the size that <b>in_len</b> will be after compression or + * decompression. */ +static size_t +guess_compress_size(int compress, compress_method_t method, + compression_level_t compression_level, + size_t in_len) +{ + // ignore these for now. + (void)compression_level; + if (method == NO_METHOD) { + /* Guess that we'll need an extra byte, to avoid a needless realloc + * for nul-termination */ + return (in_len < SIZE_MAX) ? in_len + 1 : in_len; + } + + /* Always guess a factor of 2. */ + if (compress) { + in_len /= 2; + } else { + if (in_len < SIZE_T_CEILING/2) + in_len *= 2; + } + return MAX(in_len, 1024); +} + +/** Internal function to implement tor_compress/tor_uncompress, depending on + * whether <b>compress</b> is set. All arguments are as for tor_compress or + * tor_uncompress. */ +static int +tor_compress_impl(int compress, + char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method, + compression_level_t compression_level, + int complete_only, + int protocol_warn_level) +{ + tor_compress_state_t *stream; + int rv; + + stream = tor_compress_new(compress, method, compression_level); + + if (stream == NULL) + return -1; + + size_t in_len_orig = in_len; + size_t out_remaining, out_alloc; + char *outptr; + + out_remaining = out_alloc = + guess_compress_size(compress, method, compression_level, in_len); + *out = outptr = tor_malloc(out_remaining); + + const int finish = complete_only || compress; + + while (1) { + switch (tor_compress_process(stream, + &outptr, &out_remaining, + &in, &in_len, finish)) { + case TOR_COMPRESS_DONE: + if (in_len == 0 || compress) { + goto done; + } else { + // More data is present, and we're decompressing. So we may need to + // reinitialize the stream if we are handling multiple concatenated + // inputs. + tor_compress_free(stream); + stream = tor_compress_new(compress, method, compression_level); + } + break; + case TOR_COMPRESS_OK: + if (compress || complete_only) { + goto err; + } else { + goto done; + } + break; + case TOR_COMPRESS_BUFFER_FULL: { + if (!compress && outptr < *out+out_alloc) { + // A buffer error in this case means that we have a problem + // with our input. + log_fn(protocol_warn_level, LD_PROTOCOL, + "Possible truncated or corrupt compressed data"); + goto err; + } + if (out_alloc >= SIZE_T_CEILING / 2) { + log_warn(LD_GENERAL, "While %scompresing data: ran out of space.", + compress?"":"un"); + goto err; + } + if (!compress && + tor_compress_is_compression_bomb(in_len_orig, out_alloc)) { + // This should already have been caught down in the backend logic. + // LCOV_EXCL_START + tor_assert_nonfatal_unreached(); + goto err; + // LCOV_EXCL_STOP + } + const size_t offset = outptr - *out; + out_alloc *= 2; + *out = tor_realloc(*out, out_alloc); + outptr = *out + offset; + out_remaining = out_alloc - offset; + break; + } + case TOR_COMPRESS_ERROR: + log_fn(protocol_warn_level, LD_GENERAL, + "Error while %scompresing data: bad input?", + compress?"":"un"); + goto err; // bad data. + default: + // LCOV_EXCL_START + tor_assert_nonfatal_unreached(); + goto err; + // LCOV_EXCL_STOP + } + } + done: + *out_len = outptr - *out; + if (compress && tor_compress_is_compression_bomb(*out_len, in_len_orig)) { + log_warn(LD_BUG, "We compressed something and got an insanely high " + "compression factor; other Tors would think this was a " + "compression bomb."); + goto err; + } + if (!compress) { + // NUL-terminate our output. + if (out_alloc == *out_len) + *out = tor_realloc(*out, out_alloc + 1); + (*out)[*out_len] = '\0'; + } + rv = 0; + goto out; + + err: + tor_free(*out); + *out_len = 0; + rv = -1; + goto out; + + out: + tor_compress_free(stream); + return rv; +} + +/** Given <b>in_len</b> bytes at <b>in</b>, compress them into a newly + * allocated buffer, using the method described in <b>method</b>. Store the + * compressed string in *<b>out</b>, and its length in *<b>out_len</b>. + * Return 0 on success, -1 on failure. + */ +int +tor_compress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method) +{ + return tor_compress_impl(1, out, out_len, in, in_len, method, + BEST_COMPRESSION, + 1, LOG_WARN); +} + +/** Given zero or more compressed strings of total length <b>in_len</b> bytes + * at <b>in</b>, uncompress them into a newly allocated buffer, using the + * method described in <b>method</b>. Store the uncompressed string in + * *<b>out</b>, and its length in *<b>out_len</b>. Return 0 on success, -1 on + * failure. + * + * If any bytes are written to <b>out</b>, an extra byte NUL is always + * written at the end, but not counted in <b>out_len</b>. This is a + * safety feature to ensure that the output can be treated as a + * NUL-terminated string -- though of course, callers should check + * out_len anyway. + * + * If <b>complete_only</b> is true, we consider a truncated input as a + * failure; otherwise we decompress as much as we can. Warn about truncated + * or corrupt inputs at <b>protocol_warn_level</b>. + */ +int +tor_uncompress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method, + int complete_only, + int protocol_warn_level) +{ + return tor_compress_impl(0, out, out_len, in, in_len, method, + BEST_COMPRESSION, + complete_only, protocol_warn_level); +} + +/** Try to tell whether the <b>in_len</b>-byte string in <b>in</b> is likely + * to be compressed or not. If it is, return the likeliest compression method. + * Otherwise, return UNKNOWN_METHOD. + */ +compress_method_t +detect_compression_method(const char *in, size_t in_len) +{ + if (in_len > 2 && fast_memeq(in, "\x1f\x8b", 2)) { + return GZIP_METHOD; + } else if (in_len > 2 && (in[0] & 0x0f) == 8 && + (ntohs(get_uint16(in)) % 31) == 0) { + return ZLIB_METHOD; + } else if (in_len > 2 && + fast_memeq(in, "\x5d\x00\x00", 3)) { + return LZMA_METHOD; + } else if (in_len > 3 && + fast_memeq(in, "\x28\xb5\x2f\xfd", 4)) { + return ZSTD_METHOD; + } else { + return UNKNOWN_METHOD; + } +} + +/** Return 1 if a given <b>method</b> is supported; otherwise 0. */ +int +tor_compress_supports_method(compress_method_t method) +{ + switch (method) { + case GZIP_METHOD: + case ZLIB_METHOD: + return tor_zlib_method_supported(); + case LZMA_METHOD: + return tor_lzma_method_supported(); + case ZSTD_METHOD: + return tor_zstd_method_supported(); + case NO_METHOD: + return 1; + case UNKNOWN_METHOD: + default: + return 0; + } +} + +/** + * Return a bitmask of the supported compression types, where 1<<m is + * set in the bitmask if and only if compression with method <b>m</b> is + * supported. + */ +unsigned +tor_compress_get_supported_method_bitmask(void) +{ + static unsigned supported = 0; + if (supported == 0) { + compress_method_t m; + for (m = NO_METHOD; m <= UNKNOWN_METHOD; ++m) { + if (tor_compress_supports_method(m)) { + supported |= (1u << m); + } + } + } + return supported; +} + +/** Table of compression method names. These should have an "x-" prefix, + * if they are not listed in the IANA content coding registry. */ +static const struct { + const char *name; + compress_method_t method; +} compression_method_names[] = { + { "gzip", GZIP_METHOD }, + { "deflate", ZLIB_METHOD }, + // We call this "x-tor-lzma" rather than "x-lzma", because we impose a + // lower maximum memory usage on the decoding side. + { "x-tor-lzma", LZMA_METHOD }, + { "x-zstd" , ZSTD_METHOD }, + { "identity", NO_METHOD }, + + /* Later entries in this table are not canonical; these are recognized but + * not emitted. */ + { "x-gzip", GZIP_METHOD }, +}; + +/** Return the canonical string representation of the compression method + * <b>method</b>, or NULL if the method isn't recognized. */ +const char * +compression_method_get_name(compress_method_t method) +{ + unsigned i; + for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) { + if (method == compression_method_names[i].method) + return compression_method_names[i].name; + } + return NULL; +} + +/** Return the compression method represented by the string <b>name</b>, or + * UNKNOWN_METHOD if the string isn't recognized. */ +compress_method_t +compression_method_get_by_name(const char *name) +{ + unsigned i; + for (i = 0; i < ARRAY_LENGTH(compression_method_names); ++i) { + if (!strcmp(compression_method_names[i].name, name)) + return compression_method_names[i].method; + } + return UNKNOWN_METHOD; +} + +/** Return a string representation of the version of the library providing the + * compression method given in <b>method</b>. Returns NULL if <b>method</b> is + * unknown or unsupported. */ +const char * +tor_compress_version_str(compress_method_t method) +{ + switch (method) { + case GZIP_METHOD: + case ZLIB_METHOD: + return tor_zlib_get_version_str(); + case LZMA_METHOD: + return tor_lzma_get_version_str(); + case ZSTD_METHOD: + return tor_zstd_get_version_str(); + case NO_METHOD: + case UNKNOWN_METHOD: + default: + return NULL; + } +} + +/** Return a string representation of the version of the library, found at + * compile time, providing the compression method given in <b>method</b>. + * Returns NULL if <b>method</b> is unknown or unsupported. */ +const char * +tor_compress_header_version_str(compress_method_t method) +{ + switch (method) { + case GZIP_METHOD: + case ZLIB_METHOD: + return tor_zlib_get_header_version_str(); + case LZMA_METHOD: + return tor_lzma_get_header_version_str(); + case ZSTD_METHOD: + return tor_zstd_get_header_version_str(); + case NO_METHOD: + case UNKNOWN_METHOD: + default: + return NULL; + } +} + +/** Return the approximate number of bytes allocated for all + * supported compression schemas. */ +size_t +tor_compress_get_total_allocation(void) +{ + return atomic_counter_get(&total_compress_allocation) + + tor_zlib_get_total_allocation() + + tor_lzma_get_total_allocation() + + tor_zstd_get_total_allocation(); +} + +/** Internal state for an incremental compression/decompression. The body of + * this struct is not exposed. */ +struct tor_compress_state_t { + compress_method_t method; /**< The compression method. */ + + union { + tor_zlib_compress_state_t *zlib_state; + tor_lzma_compress_state_t *lzma_state; + tor_zstd_compress_state_t *zstd_state; + } u; /**< Compression backend state. */ +}; + +/** Construct and return a tor_compress_state_t object using <b>method</b>. If + * <b>compress</b>, it's for compression; otherwise it's for decompression. */ +tor_compress_state_t * +tor_compress_new(int compress, compress_method_t method, + compression_level_t compression_level) +{ + tor_compress_state_t *state; + + state = tor_malloc_zero(sizeof(tor_compress_state_t)); + state->method = method; + + switch (method) { + case GZIP_METHOD: + case ZLIB_METHOD: { + tor_zlib_compress_state_t *zlib_state = + tor_zlib_compress_new(compress, method, compression_level); + + if (zlib_state == NULL) + goto err; + + state->u.zlib_state = zlib_state; + break; + } + case LZMA_METHOD: { + tor_lzma_compress_state_t *lzma_state = + tor_lzma_compress_new(compress, method, compression_level); + + if (lzma_state == NULL) + goto err; + + state->u.lzma_state = lzma_state; + break; + } + case ZSTD_METHOD: { + tor_zstd_compress_state_t *zstd_state = + tor_zstd_compress_new(compress, method, compression_level); + + if (zstd_state == NULL) + goto err; + + state->u.zstd_state = zstd_state; + break; + } + case NO_METHOD: { + break; + } + case UNKNOWN_METHOD: + goto err; + } + + atomic_counter_add(&total_compress_allocation, + sizeof(tor_compress_state_t)); + return state; + + err: + tor_free(state); + return NULL; +} + +/** Compress/decompress some bytes using <b>state</b>. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_compress_process(tor_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ + tor_assert(state != NULL); + + switch (state->method) { + case GZIP_METHOD: + case ZLIB_METHOD: + return tor_zlib_compress_process(state->u.zlib_state, + out, out_len, in, in_len, + finish); + case LZMA_METHOD: + return tor_lzma_compress_process(state->u.lzma_state, + out, out_len, in, in_len, + finish); + case ZSTD_METHOD: + return tor_zstd_compress_process(state->u.zstd_state, + out, out_len, in, in_len, + finish); + case NO_METHOD: + return tor_cnone_compress_process(out, out_len, in, in_len, + finish); + case UNKNOWN_METHOD: + goto err; + } + + err: + return TOR_COMPRESS_ERROR; +} + +/** Deallocate <b>state</b>. */ +void +tor_compress_free(tor_compress_state_t *state) +{ + if (state == NULL) + return; + + switch (state->method) { + case GZIP_METHOD: + case ZLIB_METHOD: + tor_zlib_compress_free(state->u.zlib_state); + break; + case LZMA_METHOD: + tor_lzma_compress_free(state->u.lzma_state); + break; + case ZSTD_METHOD: + tor_zstd_compress_free(state->u.zstd_state); + break; + case NO_METHOD: + break; + case UNKNOWN_METHOD: + break; + } + + atomic_counter_sub(&total_compress_allocation, + sizeof(tor_compress_state_t)); + tor_free(state); +} + +/** Return the approximate number of bytes allocated for <b>state</b>. */ +size_t +tor_compress_state_size(const tor_compress_state_t *state) +{ + tor_assert(state != NULL); + + size_t size = sizeof(tor_compress_state_t); + + switch (state->method) { + case GZIP_METHOD: + case ZLIB_METHOD: + size += tor_zlib_compress_state_size(state->u.zlib_state); + break; + case LZMA_METHOD: + size += tor_lzma_compress_state_size(state->u.lzma_state); + break; + case ZSTD_METHOD: + size += tor_zstd_compress_state_size(state->u.zstd_state); + break; + case NO_METHOD: + case UNKNOWN_METHOD: + break; + } + + return size; +} + +/** Initialize all compression modules. */ +void +tor_compress_init(void) +{ + atomic_counter_init(&total_compress_allocation); + + tor_zlib_init(); + tor_lzma_init(); + tor_zstd_init(); +} + diff --git a/src/common/compress.h b/src/common/compress.h new file mode 100644 index 0000000000..5b47c5d458 --- /dev/null +++ b/src/common/compress.h @@ -0,0 +1,88 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress.h + * \brief Headers for compress.c + **/ + +#ifndef TOR_COMPRESS_H +#define TOR_COMPRESS_H + +/** Enumeration of what kind of compression to use. Only ZLIB_METHOD and + * GZIP_METHOD is guaranteed to be supported by the compress/uncompress + * functions here. Call tor_compress_supports_method() to check if a given + * compression schema is supported by Tor. */ +typedef enum { + NO_METHOD=0, // This method must be first. + GZIP_METHOD=1, + ZLIB_METHOD=2, + LZMA_METHOD=3, + ZSTD_METHOD=4, + UNKNOWN_METHOD=5, // This method must be last. Add new ones in the middle. +} compress_method_t; + +/** + * Enumeration to define tradeoffs between memory usage and compression level. + * BEST_COMPRESSION saves the most bandwidth; LOW_COMPRESSION saves the most + * memory. + **/ +typedef enum { + BEST_COMPRESSION, HIGH_COMPRESSION, MEDIUM_COMPRESSION, LOW_COMPRESSION +} compression_level_t; + +int tor_compress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method); + +int tor_uncompress(char **out, size_t *out_len, + const char *in, size_t in_len, + compress_method_t method, + int complete_only, + int protocol_warn_level); + +compress_method_t detect_compression_method(const char *in, size_t in_len); + +int tor_compress_is_compression_bomb(size_t size_in, size_t size_out); + +int tor_compress_supports_method(compress_method_t method); +unsigned tor_compress_get_supported_method_bitmask(void); +const char * compression_method_get_name(compress_method_t method); +compress_method_t compression_method_get_by_name(const char *name); + +const char *tor_compress_version_str(compress_method_t method); + +const char *tor_compress_header_version_str(compress_method_t method); + +size_t tor_compress_get_total_allocation(void); + +/** Return values from tor_compress_process; see that function's documentation + * for details. */ +typedef enum { + TOR_COMPRESS_OK, + TOR_COMPRESS_DONE, + TOR_COMPRESS_BUFFER_FULL, + TOR_COMPRESS_ERROR +} tor_compress_output_t; + +/** Internal state for an incremental compression/decompression. */ +typedef struct tor_compress_state_t tor_compress_state_t; + +tor_compress_state_t *tor_compress_new(int compress, + compress_method_t method, + compression_level_t level); + +tor_compress_output_t tor_compress_process(tor_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); +void tor_compress_free(tor_compress_state_t *state); + +size_t tor_compress_state_size(const tor_compress_state_t *state); + +void tor_compress_init(void); + +#endif // TOR_COMPRESS_H. + diff --git a/src/common/compress_lzma.c b/src/common/compress_lzma.c new file mode 100644 index 0000000000..b5393a6ba6 --- /dev/null +++ b/src/common/compress_lzma.c @@ -0,0 +1,351 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_lzma.c + * \brief Compression backend for LZMA. + * + * This module should never be invoked directly. Use the compress module + * instead. + **/ + +#include "orconfig.h" + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_lzma.h" + +#ifdef HAVE_LZMA +#include <lzma.h> +#endif + +/** The maximum amount of memory we allow the LZMA decoder to use, in bytes. */ +#define MEMORY_LIMIT (16 * 1024 * 1024) + +/** Total number of bytes allocated for LZMA state. */ +static atomic_counter_t total_lzma_allocation; + +#ifdef HAVE_LZMA +/** Given <b>level</b> return the memory level. */ +static int +memory_level(compression_level_t level) +{ + switch (level) { + default: + case BEST_COMPRESSION: + case HIGH_COMPRESSION: return 6; + case MEDIUM_COMPRESSION: return 4; + case LOW_COMPRESSION: return 2; + } +} + +/** Convert a given <b>error</b> to a human readable error string. */ +static const char * +lzma_error_str(lzma_ret error) +{ + switch (error) { + case LZMA_OK: + return "Operation completed successfully"; + case LZMA_STREAM_END: + return "End of stream"; + case LZMA_NO_CHECK: + return "Input stream lacks integrity check"; + case LZMA_UNSUPPORTED_CHECK: + return "Unable to calculate integrity check"; + case LZMA_GET_CHECK: + return "Integrity check available"; + case LZMA_MEM_ERROR: + return "Unable to allocate memory"; + case LZMA_MEMLIMIT_ERROR: + return "Memory limit reached"; + case LZMA_FORMAT_ERROR: + return "Unknown file format"; + case LZMA_OPTIONS_ERROR: + return "Unsupported options"; + case LZMA_DATA_ERROR: + return "Corrupt input data"; + case LZMA_BUF_ERROR: + return "Unable to progress"; + case LZMA_PROG_ERROR: + return "Programming error"; + default: + return "Unknown LZMA error"; + } +} +#endif // HAVE_LZMA. + +/** Return 1 if LZMA compression is supported; otherwise 0. */ +int +tor_lzma_method_supported(void) +{ +#ifdef HAVE_LZMA + return 1; +#else + return 0; +#endif +} + +/** Return a string representation of the version of the currently running + * version of liblzma. Returns NULL if LZMA is unsupported. */ +const char * +tor_lzma_get_version_str(void) +{ +#ifdef HAVE_LZMA + return lzma_version_string(); +#else + return NULL; +#endif +} + +/** Return a string representation of the version of liblzma used at + * compilation time. Returns NULL if LZMA is unsupported. */ +const char * +tor_lzma_get_header_version_str(void) +{ +#ifdef HAVE_LZMA + return LZMA_VERSION_STRING; +#else + return NULL; +#endif +} + +/** Internal LZMA state for incremental compression/decompression. + * The body of this struct is not exposed. */ +struct tor_lzma_compress_state_t { +#ifdef HAVE_LZMA + lzma_stream stream; /**< The LZMA stream. */ +#endif + + int compress; /**< True if we are compressing; false if we are inflating */ + + /** Number of bytes read so far. Used to detect compression bombs. */ + size_t input_so_far; + /** Number of bytes written so far. Used to detect compression bombs. */ + size_t output_so_far; + + /** Approximate number of bytes allocated for this object. */ + size_t allocation; +}; + +#ifdef HAVE_LZMA +/** Return an approximate number of bytes stored in memory to hold the LZMA + * encoder/decoder state. */ +static size_t +tor_lzma_state_size_precalc(int compress, compression_level_t level) +{ + uint64_t memory_usage; + + if (compress) + memory_usage = lzma_easy_encoder_memusage(memory_level(level)); + else + memory_usage = lzma_easy_decoder_memusage(memory_level(level)); + + if (memory_usage == UINT64_MAX) { + log_warn(LD_GENERAL, "Unsupported compression level passed to LZMA %s", + compress ? "encoder" : "decoder"); + goto err; + } + + if (memory_usage + sizeof(tor_lzma_compress_state_t) > SIZE_MAX) + memory_usage = SIZE_MAX; + else + memory_usage += sizeof(tor_lzma_compress_state_t); + + return (size_t)memory_usage; + + err: + return 0; +} +#endif // HAVE_LZMA. + +/** Construct and return a tor_lzma_compress_state_t object using + * <b>method</b>. If <b>compress</b>, it's for compression; otherwise it's for + * decompression. */ +tor_lzma_compress_state_t * +tor_lzma_compress_new(int compress, + compress_method_t method, + compression_level_t level) +{ + tor_assert(method == LZMA_METHOD); + +#ifdef HAVE_LZMA + tor_lzma_compress_state_t *result; + lzma_ret retval; + lzma_options_lzma stream_options; + + // Note that we do not explicitly initialize the lzma_stream object here, + // since the LZMA_STREAM_INIT "just" initializes all members to 0, which is + // also what `tor_malloc_zero()` does. + result = tor_malloc_zero(sizeof(tor_lzma_compress_state_t)); + result->compress = compress; + result->allocation = tor_lzma_state_size_precalc(compress, level); + + if (compress) { + lzma_lzma_preset(&stream_options, memory_level(level)); + + retval = lzma_alone_encoder(&result->stream, &stream_options); + + if (retval != LZMA_OK) { + log_warn(LD_GENERAL, "Error from LZMA encoder: %s (%u).", + lzma_error_str(retval), retval); + goto err; + } + } else { + retval = lzma_alone_decoder(&result->stream, MEMORY_LIMIT); + + if (retval != LZMA_OK) { + log_warn(LD_GENERAL, "Error from LZMA decoder: %s (%u).", + lzma_error_str(retval), retval); + goto err; + } + } + + atomic_counter_add(&total_lzma_allocation, result->allocation); + return result; + + err: + tor_free(result); + return NULL; +#else // HAVE_LZMA. + (void)compress; + (void)method; + (void)level; + + return NULL; +#endif // HAVE_LZMA. +} + +/** Compress/decompress some bytes using <b>state</b>. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_lzma_compress_process(tor_lzma_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ +#ifdef HAVE_LZMA + lzma_ret retval; + lzma_action action; + + tor_assert(state != NULL); + tor_assert(*in_len <= UINT_MAX); + tor_assert(*out_len <= UINT_MAX); + + state->stream.next_in = (unsigned char *)*in; + state->stream.avail_in = *in_len; + state->stream.next_out = (unsigned char *)*out; + state->stream.avail_out = *out_len; + + action = finish ? LZMA_FINISH : LZMA_RUN; + + retval = lzma_code(&state->stream, action); + + state->input_so_far += state->stream.next_in - ((unsigned char *)*in); + state->output_so_far += state->stream.next_out - ((unsigned char *)*out); + + *out = (char *)state->stream.next_out; + *out_len = state->stream.avail_out; + *in = (const char *)state->stream.next_in; + *in_len = state->stream.avail_in; + + if (! state->compress && + tor_compress_is_compression_bomb(state->input_so_far, + state->output_so_far)) { + log_warn(LD_DIR, "Possible compression bomb; abandoning stream."); + return TOR_COMPRESS_ERROR; + } + + switch (retval) { + case LZMA_OK: + if (state->stream.avail_out == 0 || finish) + return TOR_COMPRESS_BUFFER_FULL; + + return TOR_COMPRESS_OK; + + case LZMA_BUF_ERROR: + if (state->stream.avail_in == 0 && !finish) + return TOR_COMPRESS_OK; + + return TOR_COMPRESS_BUFFER_FULL; + + case LZMA_STREAM_END: + return TOR_COMPRESS_DONE; + + // We list all the possible values of `lzma_ret` here to silence the + // `switch-enum` warning and to detect if a new member was added. + case LZMA_NO_CHECK: + case LZMA_UNSUPPORTED_CHECK: + case LZMA_GET_CHECK: + case LZMA_MEM_ERROR: + case LZMA_MEMLIMIT_ERROR: + case LZMA_FORMAT_ERROR: + case LZMA_OPTIONS_ERROR: + case LZMA_DATA_ERROR: + case LZMA_PROG_ERROR: + default: + log_warn(LD_GENERAL, "LZMA %s didn't finish: %s.", + state->compress ? "compression" : "decompression", + lzma_error_str(retval)); + return TOR_COMPRESS_ERROR; + } +#else // HAVE_LZMA. + (void)state; + (void)out; + (void)out_len; + (void)in; + (void)in_len; + (void)finish; + return TOR_COMPRESS_ERROR; +#endif // HAVE_LZMA. +} + +/** Deallocate <b>state</b>. */ +void +tor_lzma_compress_free(tor_lzma_compress_state_t *state) +{ + if (state == NULL) + return; + + atomic_counter_sub(&total_lzma_allocation, state->allocation); + +#ifdef HAVE_LZMA + lzma_end(&state->stream); +#endif + + tor_free(state); +} + +/** Return the approximate number of bytes allocated for <b>state</b>. */ +size_t +tor_lzma_compress_state_size(const tor_lzma_compress_state_t *state) +{ + tor_assert(state != NULL); + return state->allocation; +} + +/** Return the approximate number of bytes allocated for all LZMA states. */ +size_t +tor_lzma_get_total_allocation(void) +{ + return atomic_counter_get(&total_lzma_allocation); +} + +/** Initialize the lzma module */ +void +tor_lzma_init(void) +{ + atomic_counter_init(&total_lzma_allocation); +} + diff --git a/src/common/compress_lzma.h b/src/common/compress_lzma.h new file mode 100644 index 0000000000..1433c89f88 --- /dev/null +++ b/src/common/compress_lzma.h @@ -0,0 +1,43 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_lzma.h + * \brief Header for compress_lzma.c + **/ + +#ifndef TOR_COMPRESS_LZMA_H +#define TOR_COMPRESS_LZMA_H + +int tor_lzma_method_supported(void); + +const char *tor_lzma_get_version_str(void); + +const char *tor_lzma_get_header_version_str(void); + +/** Internal state for an incremental LZMA compression/decompression. */ +typedef struct tor_lzma_compress_state_t tor_lzma_compress_state_t; + +tor_lzma_compress_state_t * +tor_lzma_compress_new(int compress, + compress_method_t method, + compression_level_t compression_level); + +tor_compress_output_t +tor_lzma_compress_process(tor_lzma_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); + +void tor_lzma_compress_free(tor_lzma_compress_state_t *state); + +size_t tor_lzma_compress_state_size(const tor_lzma_compress_state_t *state); + +size_t tor_lzma_get_total_allocation(void); + +void tor_lzma_init(void); + +#endif // TOR_COMPRESS_LZMA_H. + diff --git a/src/common/compress_none.c b/src/common/compress_none.c new file mode 100644 index 0000000000..b76e6010ec --- /dev/null +++ b/src/common/compress_none.c @@ -0,0 +1,53 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_lzma.c + * \brief Compression backend for identity compression. + * + * We actually define this backend so that we can treat the identity transform + * as another case of compression. + * + * This module should never be invoked directly. Use the compress module + * instead. + **/ + +#include "orconfig.h" + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_none.h" + +/** Transfer some bytes using the identity transformation. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_cnone_compress_process(char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ + size_t n_to_copy = MIN(*in_len, *out_len); + + memcpy(*out, *in, n_to_copy); + *out += n_to_copy; + *in += n_to_copy; + *out_len -= n_to_copy; + *in_len -= n_to_copy; + if (*in_len == 0) { + return finish ? TOR_COMPRESS_DONE : TOR_COMPRESS_OK; + } else { + return TOR_COMPRESS_BUFFER_FULL; + } +} + diff --git a/src/common/compress_none.h b/src/common/compress_none.h new file mode 100644 index 0000000000..d1ebb4b625 --- /dev/null +++ b/src/common/compress_none.h @@ -0,0 +1,20 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_none.h + * \brief Header for compress_none.c + **/ + +#ifndef TOR_COMPRESS_NONE_H +#define TOR_COMPRESS_NONE_H + +tor_compress_output_t +tor_cnone_compress_process(char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); + +#endif // TOR_COMPRESS_NONE_H. + diff --git a/src/common/compress_zlib.c b/src/common/compress_zlib.c new file mode 100644 index 0000000000..284542e885 --- /dev/null +++ b/src/common/compress_zlib.c @@ -0,0 +1,304 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_zlib.c + * \brief Compression backend for gzip and zlib. + * + * This module should never be invoked directly. Use the compress module + * instead. + **/ + +#include "orconfig.h" + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_zlib.h" + +/* zlib 1.2.4 and 1.2.5 do some "clever" things with macros. Instead of + saying "(defined(FOO) ? FOO : 0)" they like to say "FOO-0", on the theory + that nobody will care if the compile outputs a no-such-identifier warning. + + Sorry, but we like -Werror over here, so I guess we need to define these. + I hope that zlib 1.2.6 doesn't break these too. +*/ +#ifndef _LARGEFILE64_SOURCE +#define _LARGEFILE64_SOURCE 0 +#endif +#ifndef _LFS64_LARGEFILE +#define _LFS64_LARGEFILE 0 +#endif +#ifndef _FILE_OFFSET_BITS +#define _FILE_OFFSET_BITS 0 +#endif +#ifndef off64_t +#define off64_t int64_t +#endif + +#include <zlib.h> + +#if defined ZLIB_VERNUM && ZLIB_VERNUM < 0x1200 +#error "We require zlib version 1.2 or later." +#endif + +static size_t tor_zlib_state_size_precalc(int inflate, + int windowbits, int memlevel); + +/** Total number of bytes allocated for zlib state */ +static atomic_counter_t total_zlib_allocation; + +/** Given <b>level</b> return the memory level. */ +static int +memory_level(compression_level_t level) +{ + switch (level) { + default: + case BEST_COMPRESSION: return 9; + case HIGH_COMPRESSION: return 8; + case MEDIUM_COMPRESSION: return 7; + case LOW_COMPRESSION: return 6; + } +} + +/** Return the 'bits' value to tell zlib to use <b>method</b>.*/ +static inline int +method_bits(compress_method_t method, compression_level_t level) +{ + /* Bits+16 means "use gzip" in zlib >= 1.2 */ + const int flag = method == GZIP_METHOD ? 16 : 0; + switch (level) { + default: + case BEST_COMPRESSION: + case HIGH_COMPRESSION: return flag + 15; + case MEDIUM_COMPRESSION: return flag + 13; + case LOW_COMPRESSION: return flag + 11; + } +} + +/** Return 1 if zlib/gzip compression is supported; otherwise 0. */ +int +tor_zlib_method_supported(void) +{ + /* We currently always support zlib/gzip, but we keep this function around in + * case we some day decide to deprecate zlib/gzip support. + */ + return 1; +} + +/** Return a string representation of the version of the currently running + * version of zlib. */ +const char * +tor_zlib_get_version_str(void) +{ + return zlibVersion(); +} + +/** Return a string representation of the version of the version of zlib +* used at compilation. */ +const char * +tor_zlib_get_header_version_str(void) +{ + return ZLIB_VERSION; +} + +/** Internal zlib state for an incremental compression/decompression. + * The body of this struct is not exposed. */ +struct tor_zlib_compress_state_t { + struct z_stream_s stream; /**< The zlib stream */ + int compress; /**< True if we are compressing; false if we are inflating */ + + /** Number of bytes read so far. Used to detect zlib bombs. */ + size_t input_so_far; + /** Number of bytes written so far. Used to detect zlib bombs. */ + size_t output_so_far; + + /** Approximate number of bytes allocated for this object. */ + size_t allocation; +}; + +/** Return an approximate number of bytes used in RAM to hold a state with + * window bits <b>windowBits</b> and compression level 'memlevel' */ +static size_t +tor_zlib_state_size_precalc(int inflate_, int windowbits, int memlevel) +{ + windowbits &= 15; + +#define A_FEW_KILOBYTES 2048 + + if (inflate_) { + /* From zconf.h: + + "The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects." + */ + return sizeof(tor_zlib_compress_state_t) + sizeof(struct z_stream_s) + + (1 << 15) + A_FEW_KILOBYTES; + } else { + /* Also from zconf.h: + + "The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + ... plus a few kilobytes for small objects." + */ + return sizeof(tor_zlib_compress_state_t) + sizeof(struct z_stream_s) + + (1 << (windowbits + 2)) + (1 << (memlevel + 9)) + A_FEW_KILOBYTES; + } +#undef A_FEW_KILOBYTES +} + +/** Construct and return a tor_zlib_compress_state_t object using + * <b>method</b>. If <b>compress</b>, it's for compression; otherwise it's for + * decompression. */ +tor_zlib_compress_state_t * +tor_zlib_compress_new(int compress_, + compress_method_t method, + compression_level_t compression_level) +{ + tor_zlib_compress_state_t *out; + int bits, memlevel; + + if (! compress_) { + /* use this setting for decompression, since we might have the + * max number of window bits */ + compression_level = BEST_COMPRESSION; + } + + out = tor_malloc_zero(sizeof(tor_zlib_compress_state_t)); + out->stream.zalloc = Z_NULL; + out->stream.zfree = Z_NULL; + out->stream.opaque = NULL; + out->compress = compress_; + bits = method_bits(method, compression_level); + memlevel = memory_level(compression_level); + if (compress_) { + if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED, + bits, memlevel, + Z_DEFAULT_STRATEGY) != Z_OK) + goto err; // LCOV_EXCL_LINE + } else { + if (inflateInit2(&out->stream, bits) != Z_OK) + goto err; // LCOV_EXCL_LINE + } + out->allocation = tor_zlib_state_size_precalc(!compress_, bits, memlevel); + + atomic_counter_add(&total_zlib_allocation, out->allocation); + + return out; + + err: + tor_free(out); + return NULL; +} + +/** Compress/decompress some bytes using <b>state</b>. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_zlib_compress_process(tor_zlib_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ + int err; + tor_assert(state != NULL); + if (*in_len > UINT_MAX || + *out_len > UINT_MAX) { + return TOR_COMPRESS_ERROR; + } + + state->stream.next_in = (unsigned char*) *in; + state->stream.avail_in = (unsigned int)*in_len; + state->stream.next_out = (unsigned char*) *out; + state->stream.avail_out = (unsigned int)*out_len; + + if (state->compress) { + err = deflate(&state->stream, finish ? Z_FINISH : Z_NO_FLUSH); + } else { + err = inflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH); + } + + state->input_so_far += state->stream.next_in - ((unsigned char*)*in); + state->output_so_far += state->stream.next_out - ((unsigned char*)*out); + + *out = (char*) state->stream.next_out; + *out_len = state->stream.avail_out; + *in = (const char *) state->stream.next_in; + *in_len = state->stream.avail_in; + + if (! state->compress && + tor_compress_is_compression_bomb(state->input_so_far, + state->output_so_far)) { + log_warn(LD_DIR, "Possible zlib bomb; abandoning stream."); + return TOR_COMPRESS_ERROR; + } + + switch (err) + { + case Z_STREAM_END: + return TOR_COMPRESS_DONE; + case Z_BUF_ERROR: + if (state->stream.avail_in == 0 && !finish) + return TOR_COMPRESS_OK; + return TOR_COMPRESS_BUFFER_FULL; + case Z_OK: + if (state->stream.avail_out == 0 || finish) + return TOR_COMPRESS_BUFFER_FULL; + return TOR_COMPRESS_OK; + default: + log_warn(LD_GENERAL, "Gzip returned an error: %s", + state->stream.msg ? state->stream.msg : "<no message>"); + return TOR_COMPRESS_ERROR; + } +} + +/** Deallocate <b>state</b>. */ +void +tor_zlib_compress_free(tor_zlib_compress_state_t *state) +{ + if (state == NULL) + return; + + atomic_counter_sub(&total_zlib_allocation, state->allocation); + + if (state->compress) + deflateEnd(&state->stream); + else + inflateEnd(&state->stream); + + tor_free(state); +} + +/** Return the approximate number of bytes allocated for <b>state</b>. */ +size_t +tor_zlib_compress_state_size(const tor_zlib_compress_state_t *state) +{ + tor_assert(state != NULL); + return state->allocation; +} + +/** Return the approximate number of bytes allocated for all zlib states. */ +size_t +tor_zlib_get_total_allocation(void) +{ + return atomic_counter_get(&total_zlib_allocation); +} + +/** Set up global state for the zlib module */ +void +tor_zlib_init(void) +{ + atomic_counter_init(&total_zlib_allocation); +} + diff --git a/src/common/compress_zlib.h b/src/common/compress_zlib.h new file mode 100644 index 0000000000..df5c196ac7 --- /dev/null +++ b/src/common/compress_zlib.h @@ -0,0 +1,43 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_zlib.h + * \brief Header for compress_zlib.c + **/ + +#ifndef TOR_COMPRESS_ZLIB_H +#define TOR_COMPRESS_ZLIB_H + +int tor_zlib_method_supported(void); + +const char *tor_zlib_get_version_str(void); + +const char *tor_zlib_get_header_version_str(void); + +/** Internal state for an incremental zlib/gzip compression/decompression. */ +typedef struct tor_zlib_compress_state_t tor_zlib_compress_state_t; + +tor_zlib_compress_state_t * +tor_zlib_compress_new(int compress, + compress_method_t method, + compression_level_t compression_level); + +tor_compress_output_t +tor_zlib_compress_process(tor_zlib_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); + +void tor_zlib_compress_free(tor_zlib_compress_state_t *state); + +size_t tor_zlib_compress_state_size(const tor_zlib_compress_state_t *state); + +size_t tor_zlib_get_total_allocation(void); + +void tor_zlib_init(void); + +#endif // TOR_COMPRESS_ZLIB_H. + diff --git a/src/common/compress_zstd.c b/src/common/compress_zstd.c new file mode 100644 index 0000000000..99d05c37bd --- /dev/null +++ b/src/common/compress_zstd.c @@ -0,0 +1,401 @@ +/* Copyright (c) 2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_zstd.c + * \brief Compression backend for Zstandard. + * + * This module should never be invoked directly. Use the compress module + * instead. + **/ + +#include "orconfig.h" + +#include "util.h" +#include "torlog.h" +#include "compress.h" +#include "compress_zstd.h" + +#ifdef HAVE_ZSTD +#include <zstd.h> +#endif + +/** Total number of bytes allocated for Zstandard state. */ +static atomic_counter_t total_zstd_allocation; + +#ifdef HAVE_ZSTD +/** Given <b>level</b> return the memory level. */ +static int +memory_level(compression_level_t level) +{ + switch (level) { + default: + case BEST_COMPRESSION: + case HIGH_COMPRESSION: return 9; + case MEDIUM_COMPRESSION: return 8; + case LOW_COMPRESSION: return 7; + } +} +#endif // HAVE_ZSTD. + +/** Return 1 if Zstandard compression is supported; otherwise 0. */ +int +tor_zstd_method_supported(void) +{ +#ifdef HAVE_ZSTD + return 1; +#else + return 0; +#endif +} + +/** Return a string representation of the version of the currently running + * version of libzstd. Returns NULL if Zstandard is unsupported. */ +const char * +tor_zstd_get_version_str(void) +{ +#ifdef HAVE_ZSTD + static char version_str[16]; + size_t version_number; + + version_number = ZSTD_versionNumber(); + tor_snprintf(version_str, sizeof(version_str), + "%lu.%lu.%lu", + version_number / 10000 % 100, + version_number / 100 % 100, + version_number % 100); + + return version_str; +#else + return NULL; +#endif +} + +/** Return a string representation of the version of the version of libzstd + * used at compilation time. Returns NULL if Zstandard is unsupported. */ +const char * +tor_zstd_get_header_version_str(void) +{ +#ifdef HAVE_ZSTD + return ZSTD_VERSION_STRING; +#else + return NULL; +#endif +} + +/** Internal Zstandard state for incremental compression/decompression. + * The body of this struct is not exposed. */ +struct tor_zstd_compress_state_t { +#ifdef HAVE_ZSTD + union { + /** Compression stream. Used when <b>compress</b> is true. */ + ZSTD_CStream *compress_stream; + /** Decompression stream. Used when <b>compress</b> is false. */ + ZSTD_DStream *decompress_stream; + } u; /**< Zstandard stream objects. */ +#endif // HAVE_ZSTD. + + int compress; /**< True if we are compressing; false if we are inflating */ + + /** Number of bytes read so far. Used to detect compression bombs. */ + size_t input_so_far; + /** Number of bytes written so far. Used to detect compression bombs. */ + size_t output_so_far; + + /** Approximate number of bytes allocated for this object. */ + size_t allocation; +}; + +#ifdef HAVE_ZSTD +/** Return an approximate number of bytes stored in memory to hold the + * Zstandard compression/decompression state. */ +static size_t +tor_zstd_state_size_precalc(int compress, int preset) +{ + tor_assert(preset > 0); + + size_t memory_usage = sizeof(tor_zstd_compress_state_t); + + // The Zstandard library provides a number of functions that would be useful + // here, but they are, unfortunately, still considered experimental and are + // thus only available in libzstd if we link against the library statically. + // + // The code in this function tries to approximate the calculations without + // being able to use the following: + // + // - We do not have access to neither the internal members of ZSTD_CStream + // and ZSTD_DStream and their internal context objects. + // + // - We cannot use ZSTD_sizeof_CStream() and ZSTD_sizeof_DStream() since they + // are unexposed. + // + // In the future it might be useful to check if libzstd have started + // providing these functions in a stable manner and simplify this function. + if (compress) { + // We try to approximate the ZSTD_sizeof_CStream(ZSTD_CStream *stream) + // function here. This function uses the following fields to make its + // estimate: + + // - sizeof(ZSTD_CStream): Around 192 bytes on a 64-bit machine: + memory_usage += 192; + + // - ZSTD_sizeof_CCtx(stream->cctx): This function requires access to + // variables that are not exposed via the public API. We use a _very_ + // simplified function to calculate the estimated amount of bytes used in + // this struct. + // memory_usage += (preset - 0.5) * 1024 * 1024; + memory_usage += (preset * 1024 * 1024) - (512 * 1024); + // - ZSTD_sizeof_CDict(stream->cdictLocal): Unused in Tor: 0 bytes. + // - stream->outBuffSize: 128 KB: + memory_usage += 128 * 1024; + // - stream->inBuffSize: 2048 KB: + memory_usage += 2048 * 1024; + } else { + // We try to approximate the ZSTD_sizeof_DStream(ZSTD_DStream *stream) + // function here. This function uses the following fields to make its + // estimate: + + // - sizeof(ZSTD_DStream): Around 208 bytes on a 64-bit machine: + memory_usage += 208; + // - ZSTD_sizeof_DCtx(stream->dctx): Around 150 KB. + memory_usage += 150 * 1024; + + // - ZSTD_sizeof_DDict(stream->ddictLocal): Unused in Tor: 0 bytes. + // - stream->inBuffSize: 0 KB. + // - stream->outBuffSize: 0 KB. + } + + return memory_usage; +} +#endif // HAVE_ZSTD. + +/** Construct and return a tor_zstd_compress_state_t object using + * <b>method</b>. If <b>compress</b>, it's for compression; otherwise it's for + * decompression. */ +tor_zstd_compress_state_t * +tor_zstd_compress_new(int compress, + compress_method_t method, + compression_level_t level) +{ + tor_assert(method == ZSTD_METHOD); + +#ifdef HAVE_ZSTD + const int preset = memory_level(level); + tor_zstd_compress_state_t *result; + size_t retval; + + result = tor_malloc_zero(sizeof(tor_zstd_compress_state_t)); + result->compress = compress; + result->allocation = tor_zstd_state_size_precalc(compress, preset); + + if (compress) { + result->u.compress_stream = ZSTD_createCStream(); + + if (result->u.compress_stream == NULL) { + log_warn(LD_GENERAL, "Error while creating Zstandard stream"); + goto err; + } + + retval = ZSTD_initCStream(result->u.compress_stream, preset); + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard stream initialization error: %s", + ZSTD_getErrorName(retval)); + goto err; + } + } else { + result->u.decompress_stream = ZSTD_createDStream(); + + if (result->u.decompress_stream == NULL) { + log_warn(LD_GENERAL, "Error while creating Zstandard stream"); + goto err; + } + + retval = ZSTD_initDStream(result->u.decompress_stream); + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard stream initialization error: %s", + ZSTD_getErrorName(retval)); + goto err; + } + } + + atomic_counter_add(&total_zstd_allocation, result->allocation); + return result; + + err: + if (compress) { + ZSTD_freeCStream(result->u.compress_stream); + } else { + ZSTD_freeDStream(result->u.decompress_stream); + } + + tor_free(result); + return NULL; +#else // HAVE_ZSTD. + (void)compress; + (void)method; + (void)level; + + return NULL; +#endif // HAVE_ZSTD. +} + +/** Compress/decompress some bytes using <b>state</b>. Read up to + * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes + * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, + * we've reached the end of the input. + * + * Return TOR_COMPRESS_DONE if we've finished the entire + * compression/decompression. + * Return TOR_COMPRESS_OK if we're processed everything from the input. + * Return TOR_COMPRESS_BUFFER_FULL if we're out of space on <b>out</b>. + * Return TOR_COMPRESS_ERROR if the stream is corrupt. + */ +tor_compress_output_t +tor_zstd_compress_process(tor_zstd_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish) +{ +#ifdef HAVE_ZSTD + size_t retval; + + tor_assert(state != NULL); + tor_assert(*in_len <= UINT_MAX); + tor_assert(*out_len <= UINT_MAX); + + ZSTD_inBuffer input = { *in, *in_len, 0 }; + ZSTD_outBuffer output = { *out, *out_len, 0 }; + + if (state->compress) { + retval = ZSTD_compressStream(state->u.compress_stream, + &output, &input); + } else { + retval = ZSTD_decompressStream(state->u.decompress_stream, + &output, &input); + } + + state->input_so_far += input.pos; + state->output_so_far += output.pos; + + *out = (char *)output.dst + output.pos; + *out_len = output.size - output.pos; + *in = (char *)input.src + input.pos; + *in_len = input.size - input.pos; + + if (! state->compress && + tor_compress_is_compression_bomb(state->input_so_far, + state->output_so_far)) { + log_warn(LD_DIR, "Possible compression bomb; abandoning stream."); + return TOR_COMPRESS_ERROR; + } + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard %s didn't finish: %s.", + state->compress ? "compression" : "decompression", + ZSTD_getErrorName(retval)); + return TOR_COMPRESS_ERROR; + } + + if (state->compress && !finish) { + retval = ZSTD_flushStream(state->u.compress_stream, &output); + + *out = (char *)output.dst + output.pos; + *out_len = output.size - output.pos; + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard compression unable to flush: %s.", + ZSTD_getErrorName(retval)); + return TOR_COMPRESS_ERROR; + } + + if (retval > 0) + return TOR_COMPRESS_BUFFER_FULL; + } + + if (!finish) { + // We're not done with the input, so no need to flush. + return TOR_COMPRESS_OK; + } else if (state->compress && finish) { + retval = ZSTD_endStream(state->u.compress_stream, &output); + + *out = (char *)output.dst + output.pos; + *out_len = output.size - output.pos; + + if (ZSTD_isError(retval)) { + log_warn(LD_GENERAL, "Zstandard compression unable to write " + "epilogue: %s.", + ZSTD_getErrorName(retval)); + return TOR_COMPRESS_ERROR; + } + + // endStream returns the number of bytes that is needed to write the + // epilogue. + if (retval > 0) + return TOR_COMPRESS_BUFFER_FULL; + + return TOR_COMPRESS_DONE; + } else { + // ZSTD_flushStream returns 0 if the frame is done, or >0 if it + // is incomplete. + return (retval == 0) ? TOR_COMPRESS_DONE : TOR_COMPRESS_OK; + } + +#else // HAVE_ZSTD. + (void)state; + (void)out; + (void)out_len; + (void)in; + (void)in_len; + (void)finish; + + return TOR_COMPRESS_ERROR; +#endif // HAVE_ZSTD. +} + +/** Deallocate <b>state</b>. */ +void +tor_zstd_compress_free(tor_zstd_compress_state_t *state) +{ + if (state == NULL) + return; + + atomic_counter_sub(&total_zstd_allocation, state->allocation); + +#ifdef HAVE_ZSTD + if (state->compress) { + ZSTD_freeCStream(state->u.compress_stream); + } else { + ZSTD_freeDStream(state->u.decompress_stream); + } +#endif // HAVE_ZSTD. + + tor_free(state); +} + +/** Return the approximate number of bytes allocated for <b>state</b>. */ +size_t +tor_zstd_compress_state_size(const tor_zstd_compress_state_t *state) +{ + tor_assert(state != NULL); + return state->allocation; +} + +/** Return the approximate number of bytes allocated for all Zstandard + * states. */ +size_t +tor_zstd_get_total_allocation(void) +{ + return atomic_counter_get(&total_zstd_allocation); +} + +/** Initialize the zstd module */ +void +tor_zstd_init(void) +{ + atomic_counter_init(&total_zstd_allocation); +} + diff --git a/src/common/compress_zstd.h b/src/common/compress_zstd.h new file mode 100644 index 0000000000..d3e65c2f16 --- /dev/null +++ b/src/common/compress_zstd.h @@ -0,0 +1,43 @@ +/* Copyright (c) 2003, Roger Dingledine + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file compress_zstd.h + * \brief Header for compress_zstd.c + **/ + +#ifndef TOR_COMPRESS_ZSTD_H +#define TOR_COMPRESS_ZSTD_H + +int tor_zstd_method_supported(void); + +const char *tor_zstd_get_version_str(void); + +const char *tor_zstd_get_header_version_str(void); + +/** Internal state for an incremental Zstandard compression/decompression. */ +typedef struct tor_zstd_compress_state_t tor_zstd_compress_state_t; + +tor_zstd_compress_state_t * +tor_zstd_compress_new(int compress, + compress_method_t method, + compression_level_t compression_level); + +tor_compress_output_t +tor_zstd_compress_process(tor_zstd_compress_state_t *state, + char **out, size_t *out_len, + const char **in, size_t *in_len, + int finish); + +void tor_zstd_compress_free(tor_zstd_compress_state_t *state); + +size_t tor_zstd_compress_state_size(const tor_zstd_compress_state_t *state); + +size_t tor_zstd_get_total_allocation(void); + +void tor_zstd_init(void); + +#endif // TOR_COMPRESS_ZSTD_H. + diff --git a/src/common/confline.c b/src/common/confline.c new file mode 100644 index 0000000000..d4468f80ea --- /dev/null +++ b/src/common/confline.c @@ -0,0 +1,338 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "compat.h" +#include "confline.h" +#include "torlog.h" +#include "util.h" + +/** Helper: allocate a new configuration option mapping 'key' to 'val', + * append it to *<b>lst</b>. */ +void +config_line_append(config_line_t **lst, + const char *key, + const char *val) +{ + tor_assert(lst); + + config_line_t *newline; + + newline = tor_malloc_zero(sizeof(config_line_t)); + newline->key = tor_strdup(key); + newline->value = tor_strdup(val); + newline->next = NULL; + while (*lst) + lst = &((*lst)->next); + + (*lst) = newline; +} + +/** Helper: allocate a new configuration option mapping 'key' to 'val', + * and prepend it to *<b>lst</b> */ +void +config_line_prepend(config_line_t **lst, + const char *key, + const char *val) +{ + tor_assert(lst); + + config_line_t *newline; + + newline = tor_malloc_zero(sizeof(config_line_t)); + newline->key = tor_strdup(key); + newline->value = tor_strdup(val); + newline->next = *lst; + *lst = newline; +} + +/** Return the first line in <b>lines</b> whose key is exactly <b>key</b>, or + * NULL if no such key exists. + * + * (In options parsing, this is for handling commandline-only options only; + * other options should be looked up in the appropriate data structure.) */ +const config_line_t * +config_line_find(const config_line_t *lines, + const char *key) +{ + const config_line_t *cl; + for (cl = lines; cl; cl = cl->next) { + if (!strcmp(cl->key, key)) + return cl; + } + return NULL; +} + +/** Helper: parse the config string and strdup into key/value + * strings. Set *result to the list, or NULL if parsing the string + * failed. Return 0 on success, -1 on failure. Warn and ignore any + * misformatted lines. + * + * If <b>extended</b> is set, then treat keys beginning with / and with + as + * indicating "clear" and "append" respectively. */ +int +config_get_lines(const char *string, config_line_t **result, int extended) +{ + config_line_t *list = NULL, **next; + char *k, *v; + const char *parse_err; + + next = &list; + do { + k = v = NULL; + string = parse_config_line_from_str_verbose(string, &k, &v, &parse_err); + if (!string) { + log_warn(LD_CONFIG, "Error while parsing configuration: %s", + parse_err?parse_err:"<unknown>"); + config_free_lines(list); + tor_free(k); + tor_free(v); + return -1; + } + if (k && v) { + unsigned command = CONFIG_LINE_NORMAL; + if (extended) { + if (k[0] == '+') { + char *k_new = tor_strdup(k+1); + tor_free(k); + k = k_new; + command = CONFIG_LINE_APPEND; + } else if (k[0] == '/') { + char *k_new = tor_strdup(k+1); + tor_free(k); + k = k_new; + tor_free(v); + v = tor_strdup(""); + command = CONFIG_LINE_CLEAR; + } + } + /* This list can get long, so we keep a pointer to the end of it + * rather than using config_line_append over and over and getting + * n^2 performance. */ + *next = tor_malloc_zero(sizeof(config_line_t)); + (*next)->key = k; + (*next)->value = v; + (*next)->next = NULL; + (*next)->command = command; + next = &((*next)->next); + } else { + tor_free(k); + tor_free(v); + } + } while (*string); + + *result = list; + return 0; +} + +/** + * Free all the configuration lines on the linked list <b>front</b>. + */ +void +config_free_lines(config_line_t *front) +{ + config_line_t *tmp; + + while (front) { + tmp = front; + front = tmp->next; + + tor_free(tmp->key); + tor_free(tmp->value); + tor_free(tmp); + } +} + +/** Return a newly allocated deep copy of the lines in <b>inp</b>. */ +config_line_t * +config_lines_dup(const config_line_t *inp) +{ + return config_lines_dup_and_filter(inp, NULL); +} + +/** Return a newly allocated deep copy of the lines in <b>inp</b>, + * but only the ones that match <b>key</b>. */ +config_line_t * +config_lines_dup_and_filter(const config_line_t *inp, + const char *key) +{ + config_line_t *result = NULL; + config_line_t **next_out = &result; + while (inp) { + if (key && strcasecmpstart(inp->key, key)) { + inp = inp->next; + continue; + } + *next_out = tor_malloc_zero(sizeof(config_line_t)); + (*next_out)->key = tor_strdup(inp->key); + (*next_out)->value = tor_strdup(inp->value); + inp = inp->next; + next_out = &((*next_out)->next); + } + (*next_out) = NULL; + return result; +} + +/** Return true iff a and b contain identical keys and values in identical + * order. */ +int +config_lines_eq(config_line_t *a, config_line_t *b) +{ + while (a && b) { + if (strcasecmp(a->key, b->key) || strcmp(a->value, b->value)) + return 0; + a = a->next; + b = b->next; + } + if (a || b) + return 0; + return 1; +} + +/** Return the number of lines in <b>a</b> whose key is <b>key</b>. */ +int +config_count_key(const config_line_t *a, const char *key) +{ + int n = 0; + while (a) { + if (!strcasecmp(a->key, key)) { + ++n; + } + a = a->next; + } + return n; +} + +/** Given a string containing part of a configuration file or similar format, + * advance past comments and whitespace and try to parse a single line. If we + * parse a line successfully, set *<b>key_out</b> to a new string holding the + * key portion and *<b>value_out</b> to a new string holding the value portion + * of the line, and return a pointer to the start of the next line. If we run + * out of data, return a pointer to the end of the string. If we encounter an + * error, return NULL and set *<b>err_out</b> (if provided) to an error + * message. + */ +const char * +parse_config_line_from_str_verbose(const char *line, char **key_out, + char **value_out, + const char **err_out) +{ + /* + See torrc_format.txt for a description of the (silly) format this parses. + */ + const char *key, *val, *cp; + int continuation = 0; + + tor_assert(key_out); + tor_assert(value_out); + + *key_out = *value_out = NULL; + key = val = NULL; + /* Skip until the first keyword. */ + while (1) { + while (TOR_ISSPACE(*line)) + ++line; + if (*line == '#') { + while (*line && *line != '\n') + ++line; + } else { + break; + } + } + + if (!*line) { /* End of string? */ + *key_out = *value_out = NULL; + return line; + } + + /* Skip until the next space or \ followed by newline. */ + key = line; + while (*line && !TOR_ISSPACE(*line) && *line != '#' && + ! (line[0] == '\\' && line[1] == '\n')) + ++line; + *key_out = tor_strndup(key, line-key); + + /* Skip until the value. */ + while (*line == ' ' || *line == '\t') + ++line; + + val = line; + + /* Find the end of the line. */ + if (*line == '\"') { // XXX No continuation handling is done here + if (!(line = unescape_string(line, value_out, NULL))) { + if (err_out) + *err_out = "Invalid escape sequence in quoted string"; + return NULL; + } + while (*line == ' ' || *line == '\t') + ++line; + if (*line == '\r' && *(++line) == '\n') + ++line; + if (*line && *line != '#' && *line != '\n') { + if (err_out) + *err_out = "Excess data after quoted string"; + return NULL; + } + } else { + /* Look for the end of the line. */ + while (*line && *line != '\n' && (*line != '#' || continuation)) { + if (*line == '\\' && line[1] == '\n') { + continuation = 1; + line += 2; + } else if (*line == '#') { + do { + ++line; + } while (*line && *line != '\n'); + if (*line == '\n') + ++line; + } else { + ++line; + } + } + + if (*line == '\n') { + cp = line++; + } else { + cp = line; + } + /* Now back cp up to be the last nonspace character */ + while (cp>val && TOR_ISSPACE(*(cp-1))) + --cp; + + tor_assert(cp >= val); + + /* Now copy out and decode the value. */ + *value_out = tor_strndup(val, cp-val); + if (continuation) { + char *v_out, *v_in; + v_out = v_in = *value_out; + while (*v_in) { + if (*v_in == '#') { + do { + ++v_in; + } while (*v_in && *v_in != '\n'); + if (*v_in == '\n') + ++v_in; + } else if (v_in[0] == '\\' && v_in[1] == '\n') { + v_in += 2; + } else { + *v_out++ = *v_in++; + } + } + *v_out = '\0'; + } + } + + if (*line == '#') { + do { + ++line; + } while (*line && *line != '\n'); + } + while (TOR_ISSPACE(*line)) ++line; + + return line; +} + diff --git a/src/common/confline.h b/src/common/confline.h new file mode 100644 index 0000000000..477c6929a2 --- /dev/null +++ b/src/common/confline.h @@ -0,0 +1,49 @@ +/* Copyright (c) 2001 Matej Pfajfar. + * Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_CONFLINE_H +#define TOR_CONFLINE_H + +/** Ordinary configuration line. */ +#define CONFIG_LINE_NORMAL 0 +/** Appends to previous configuration for the same option, even if we + * would ordinary replace it. */ +#define CONFIG_LINE_APPEND 1 +/* Removes all previous configuration for an option. */ +#define CONFIG_LINE_CLEAR 2 + +/** A linked list of lines in a config file, or elsewhere */ +typedef struct config_line_t { + char *key; + char *value; + struct config_line_t *next; + + /** What special treatment (if any) does this line require? */ + unsigned int command:2; + /** If true, subsequent assignments to this linelist should replace + * it, not extend it. Set only on the first item in a linelist in an + * or_options_t. */ + unsigned int fragile:1; +} config_line_t; + +void config_line_append(config_line_t **lst, + const char *key, const char *val); +void config_line_prepend(config_line_t **lst, + const char *key, const char *val); +config_line_t *config_lines_dup(const config_line_t *inp); +config_line_t *config_lines_dup_and_filter(const config_line_t *inp, + const char *key); +const config_line_t *config_line_find(const config_line_t *lines, + const char *key); +int config_lines_eq(config_line_t *a, config_line_t *b); +int config_count_key(const config_line_t *a, const char *key); +int config_get_lines(const char *string, config_line_t **result, int extended); +void config_free_lines(config_line_t *front); +const char *parse_config_line_from_str_verbose(const char *line, + char **key_out, char **value_out, + const char **err_out); +#endif + diff --git a/src/common/container.c b/src/common/container.c index 1448ab403c..689e7e55e9 100644 --- a/src/common/container.c +++ b/src/common/container.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/container.h b/src/common/container.h index 00c3ca81ad..db68d892f5 100644 --- a/src/common/container.h +++ b/src/common/container.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CONTAINER_H @@ -224,6 +224,7 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join, #define SMARTLIST_FOREACH_END(var) \ var = NULL; \ + (void) var ## _sl_idx; \ } STMT_END /** diff --git a/src/common/crypto.c b/src/common/crypto.c index 7cb3330bde..a68510103e 100644 --- a/src/common/crypto.c +++ b/src/common/crypto.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -467,7 +467,7 @@ crypto_new_pk_from_rsa_(RSA *rsa) return env; } -/** Helper, used by tor-checkkey.c and tor-gencert.c. Return the RSA from a +/** Helper, used by tor-gencert.c. Return the RSA from a * crypto_pk_t. */ RSA * crypto_pk_get_rsa_(crypto_pk_t *env) @@ -3459,3 +3459,15 @@ crypto_global_cleanup(void) /** @} */ +#ifdef USE_DMALLOC +/** Tell the crypto library to use Tor's allocation functions rather than + * calling libc's allocation functions directly. Return 0 on success, -1 + * on failure. */ +int +crypto_use_tor_alloc_functions(void) +{ + int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); + return r ? 0 : -1; +} +#endif + diff --git a/src/common/crypto.h b/src/common/crypto.h index 42345f80e8..c70d91c262 100644 --- a/src/common/crypto.h +++ b/src/common/crypto.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -131,6 +131,10 @@ int crypto_early_init(void) ATTR_WUR; int crypto_global_init(int hardwareAccel, const char *accelName, const char *accelPath) ATTR_WUR; +#ifdef USE_DMALLOC +int crypto_use_tor_alloc_functions(void); +#endif + void crypto_thread_cleanup(void); int crypto_global_cleanup(void); diff --git a/src/common/crypto_curve25519.c b/src/common/crypto_curve25519.c index 5f328e124c..b99f13a93b 100644 --- a/src/common/crypto_curve25519.c +++ b/src/common/crypto_curve25519.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/crypto_curve25519.h b/src/common/crypto_curve25519.h index 4011820949..e7790edac0 100644 --- a/src/common/crypto_curve25519.h +++ b/src/common/crypto_curve25519.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_CURVE25519_H diff --git a/src/common/crypto_ed25519.c b/src/common/crypto_ed25519.c index 525d25a3e0..188e18c710 100644 --- a/src/common/crypto_ed25519.c +++ b/src/common/crypto_ed25519.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -32,8 +32,6 @@ #include "ed25519/ref10/ed25519_ref10.h" #include "ed25519/donna/ed25519_donna_tor.h" -#include <openssl/sha.h> - static void pick_ed25519_impl(void); /** An Ed25519 implementation, as a set of function pointers. */ @@ -442,14 +440,16 @@ ed25519_keypair_from_curve25519_keypair(ed25519_keypair_t *out, { const char string[] = "Derive high part of ed25519 key from curve25519 key"; ed25519_public_key_t pubkey_check; - SHA512_CTX ctx; - uint8_t sha512_output[64]; + crypto_digest_t *ctx; + uint8_t sha512_output[DIGEST512_LEN]; memcpy(out->seckey.seckey, inp->seckey.secret_key, 32); - SHA512_Init(&ctx); - SHA512_Update(&ctx, out->seckey.seckey, 32); - SHA512_Update(&ctx, string, sizeof(string)); - SHA512_Final(sha512_output, &ctx); + + ctx = crypto_digest512_new(DIGEST_SHA512); + crypto_digest_add_bytes(ctx, (const char*)out->seckey.seckey, 32); + crypto_digest_add_bytes(ctx, (const char*)string, sizeof(string)); + crypto_digest_get_digest(ctx, (char *)sha512_output, sizeof(sha512_output)); + crypto_digest_free(ctx); memcpy(out->seckey.seckey + 32, sha512_output, 32); ed25519_public_key_generate(&out->pubkey, &out->seckey); diff --git a/src/common/crypto_ed25519.h b/src/common/crypto_ed25519.h index f4a4adad68..77a3313adc 100644 --- a/src/common/crypto_ed25519.h +++ b/src/common/crypto_ed25519.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_ED25519_H diff --git a/src/common/crypto_format.c b/src/common/crypto_format.c index aa2a9d1fb0..1d090a8770 100644 --- a/src/common/crypto_format.c +++ b/src/common/crypto_format.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/crypto_format.h b/src/common/crypto_format.h index 86c29d319c..390916cf04 100644 --- a/src/common/crypto_format.h +++ b/src/common/crypto_format.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_FORMAT_H diff --git a/src/common/crypto_pwbox.c b/src/common/crypto_pwbox.c index 31e37c007d..db8892e376 100644 --- a/src/common/crypto_pwbox.c +++ b/src/common/crypto_pwbox.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/crypto_s2k.c b/src/common/crypto_s2k.c index 5dbd2ad91f..076df815a9 100644 --- a/src/common/crypto_s2k.c +++ b/src/common/crypto_s2k.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/crypto_s2k.h b/src/common/crypto_s2k.h index 9b186450b1..04212b868a 100644 --- a/src/common/crypto_s2k.h +++ b/src/common/crypto_s2k.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CRYPTO_S2K_H_INCLUDED diff --git a/src/common/di_ops.c b/src/common/di_ops.c index 4ed49e1164..e47998107d 100644 --- a/src/common/di_ops.c +++ b/src/common/di_ops.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/di_ops.h b/src/common/di_ops.h index 0a154302bf..e174fcc4e4 100644 --- a/src/common/di_ops.h +++ b/src/common/di_ops.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/handles.h b/src/common/handles.h index 1ee2322579..6d7262ab80 100644 --- a/src/common/handles.h +++ b/src/common/handles.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/include.am b/src/common/include.am index 40c463c9d9..51b7da65f5 100644 --- a/src/common/include.am +++ b/src/common/include.am @@ -84,6 +84,7 @@ LIBOR_A_SRC = \ src/common/compat.c \ src/common/compat_threads.c \ src/common/compat_time.c \ + src/common/confline.c \ src/common/container.c \ src/common/log.c \ src/common/memarea.c \ @@ -93,6 +94,7 @@ LIBOR_A_SRC = \ src/common/util_format.c \ src/common/util_process.c \ src/common/sandbox.c \ + src/common/storagedir.c \ src/common/workqueue.c \ $(libor_extra_source) \ $(threads_impl_source) \ @@ -103,11 +105,15 @@ src/common/src_common_libor_testing_a-log.$(OBJEXT) \ LIBOR_CRYPTO_A_SRC = \ src/common/aes.c \ + src/common/compress.c \ + src/common/compress_lzma.c \ + src/common/compress_none.c \ + src/common/compress_zlib.c \ + src/common/compress_zstd.c \ src/common/crypto.c \ src/common/crypto_pwbox.c \ src/common/crypto_s2k.c \ src/common/crypto_format.c \ - src/common/torgzip.c \ src/common/tortls.c \ src/common/crypto_curve25519.c \ src/common/crypto_ed25519.c @@ -143,6 +149,12 @@ COMMONHEADERS = \ src/common/compat_openssl.h \ src/common/compat_threads.h \ src/common/compat_time.h \ + src/common/compress.h \ + src/common/compress_lzma.h \ + src/common/compress_none.h \ + src/common/compress_zlib.h \ + src/common/compress_zstd.h \ + src/common/confline.h \ src/common/container.h \ src/common/crypto.h \ src/common/crypto_curve25519.h \ @@ -157,9 +169,9 @@ COMMONHEADERS = \ src/common/procmon.h \ src/common/pubsub.h \ src/common/sandbox.h \ + src/common/storagedir.h \ src/common/testsupport.h \ src/common/timers.h \ - src/common/torgzip.h \ src/common/torint.h \ src/common/torlog.h \ src/common/tortls.h \ diff --git a/src/common/log.c b/src/common/log.c index 5f7151bf0c..6a5819064a 100644 --- a/src/common/log.c +++ b/src/common/log.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1086,7 +1086,7 @@ add_file_log(const log_severity_list_t *severity, const char *filename, int open_flags = O_WRONLY|O_CREAT; open_flags |= truncate_log ? O_TRUNC : O_APPEND; - fd = tor_open_cloexec(filename, open_flags, 0644); + fd = tor_open_cloexec(filename, open_flags, 0640); if (fd<0) return -1; if (tor_fd_seekend(fd)<0) { @@ -1177,7 +1177,7 @@ static const char *domain_list[] = { "GENERAL", "CRYPTO", "NET", "CONFIG", "FS", "PROTOCOL", "MM", "HTTP", "APP", "CONTROL", "CIRC", "REND", "BUG", "DIR", "DIRSERV", "OR", "EDGE", "ACCT", "HIST", "HANDSHAKE", "HEARTBEAT", "CHANNEL", - "SCHED", "GUARD", NULL + "SCHED", "GUARD", "CONSDIFF", NULL }; /** Return a bitmask for the log domain for which <b>domain</b> is the name, diff --git a/src/common/memarea.c b/src/common/memarea.c index 7d16b702e3..659d1edf54 100644 --- a/src/common/memarea.c +++ b/src/common/memarea.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Tor Project, Inc. */ +/* Copyright (c) 2008-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** \file memarea.c @@ -12,6 +12,9 @@ #include "util.h" #include "compat.h" #include "torlog.h" +#include "container.h" + +#ifndef DISABLE_MEMORY_SENTINELS /** If true, we try to detect any attempts to write beyond the length of a * memarea. */ @@ -304,3 +307,91 @@ memarea_assert_ok(memarea_t *area) } } +#else + +struct memarea_t { + smartlist_t *pieces; +}; + +memarea_t * +memarea_new(void) +{ + memarea_t *ma = tor_malloc_zero(sizeof(memarea_t)); + ma->pieces = smartlist_new(); + return ma; +} +void +memarea_drop_all(memarea_t *area) +{ + memarea_clear(area); + smartlist_free(area->pieces); + tor_free(area); +} +void +memarea_clear(memarea_t *area) +{ + SMARTLIST_FOREACH(area->pieces, void *, p, tor_free_(p)); + smartlist_clear(area->pieces); +} +int +memarea_owns_ptr(const memarea_t *area, const void *ptr) +{ + SMARTLIST_FOREACH(area->pieces, const void *, p, if (ptr == p) return 1;); + return 0; +} + +void * +memarea_alloc(memarea_t *area, size_t sz) +{ + void *result = tor_malloc(sz); + smartlist_add(area->pieces, result); + return result; +} + +void * +memarea_alloc_zero(memarea_t *area, size_t sz) +{ + void *result = tor_malloc_zero(sz); + smartlist_add(area->pieces, result); + return result; +} +void * +memarea_memdup(memarea_t *area, const void *s, size_t n) +{ + void *r = memarea_alloc(area, n); + memcpy(r, s, n); + return r; +} +char * +memarea_strdup(memarea_t *area, const char *s) +{ + size_t n = strlen(s); + char *r = memarea_alloc(area, n+1); + memcpy(r, s, n); + r[n] = 0; + return r; +} +char * +memarea_strndup(memarea_t *area, const char *s, size_t n) +{ + size_t ln = strnlen(s, n); + char *r = memarea_alloc(area, ln+1); + memcpy(r, s, ln); + r[ln] = 0; + return r; +} +void +memarea_get_stats(memarea_t *area, + size_t *allocated_out, size_t *used_out) +{ + (void)area; + *allocated_out = *used_out = 128; +} +void +memarea_assert_ok(memarea_t *area) +{ + (void)area; +} + +#endif + diff --git a/src/common/memarea.h b/src/common/memarea.h index 85bca51ad3..85012c1c34 100644 --- a/src/common/memarea.h +++ b/src/common/memarea.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2008-2016, The Tor Project, Inc. */ +/* Copyright (c) 2008-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Tor dependencies */ diff --git a/src/common/procmon.c b/src/common/procmon.c index c485c760c7..d49e7f18f5 100644 --- a/src/common/procmon.c +++ b/src/common/procmon.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/procmon.h b/src/common/procmon.h index 49ead24092..b07cff2c4a 100644 --- a/src/common/procmon.h +++ b/src/common/procmon.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/pubsub.c b/src/common/pubsub.c index b3faf40e00..336e8a6e7f 100644 --- a/src/common/pubsub.c +++ b/src/common/pubsub.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/pubsub.h b/src/common/pubsub.h index bbb4f02a42..6f4ce08754 100644 --- a/src/common/pubsub.h +++ b/src/common/pubsub.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/sandbox.c b/src/common/sandbox.c index 8e72ebf137..7826b2d40c 100644 --- a/src/common/sandbox.c +++ b/src/common/sandbox.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -20,7 +20,7 @@ #endif /** Malloc mprotect limit in bytes. */ -#define MALLOC_MP_LIM 1048576 +#define MALLOC_MP_LIM (16*1024*1024) #include <stdio.h> #include <string.h> @@ -155,6 +155,7 @@ static int filter_nopar_gen[] = { #ifdef __NR_getgid32 SCMP_SYS(getgid32), #endif + SCMP_SYS(getpid), #ifdef __NR_getrlimit SCMP_SYS(getrlimit), #endif diff --git a/src/common/sandbox.h b/src/common/sandbox.h index c5963e3119..a6b83153af 100644 --- a/src/common/sandbox.h +++ b/src/common/sandbox.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/storagedir.c b/src/common/storagedir.c new file mode 100644 index 0000000000..309d42db17 --- /dev/null +++ b/src/common/storagedir.c @@ -0,0 +1,542 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "container.h" +#include "compat.h" +#include "confline.h" +#include "memarea.h" +#include "sandbox.h" +#include "storagedir.h" +#include "torlog.h" +#include "util.h" + +#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_STAT_H +#include <sys/stat.h> +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> +#endif + +#define FNAME_MIN_NUM 1000 + +/** A storage_dir_t represents a directory full of similar cached + * files. Filenames are decimal integers. Files can be cleaned as needed + * to limit total disk usage. */ +struct storage_dir_t { + /** Directory holding the files for this storagedir. */ + char *directory; + /** Either NULL, or a directory listing of the directory (as a smartlist + * of strings */ + smartlist_t *contents; + /** The largest number of non-temporary files we'll place in the + * directory. */ + int max_files; + /** If true, then 'usage' has been computed. */ + int usage_known; + /** The total number of bytes used in this directory */ + uint64_t usage; +}; + +/** Create or open a new storage directory at <b>dirname</b>, with + * capacity for up to <b>max_files</b> files. + */ +storage_dir_t * +storage_dir_new(const char *dirname, int max_files) +{ + if (check_private_dir(dirname, CPD_CREATE, NULL) < 0) + return NULL; + + storage_dir_t *d = tor_malloc_zero(sizeof(storage_dir_t)); + d->directory = tor_strdup(dirname); + d->max_files = max_files; + return d; +} + +/** + * Drop all in-RAM storage for <b>d</b>. Does not delete any files. + */ +void +storage_dir_free(storage_dir_t *d) +{ + if (d == NULL) + return; + tor_free(d->directory); + if (d->contents) { + SMARTLIST_FOREACH(d->contents, char *, cp, tor_free(cp)); + smartlist_free(d->contents); + } + tor_free(d); +} + +/** + * Tell the sandbox (if any) configured by <b>cfg</b> to allow the + * operations that <b>d</b> will need. + * + * The presence of this function is why we need an upper limit on the + * number of filers in a storage_dir_t: we need to approve file + * operaitons one by one. + */ +int +storage_dir_register_with_sandbox(storage_dir_t *d, sandbox_cfg_t **cfg) +{ + int problems = 0; + int idx; + for (idx = FNAME_MIN_NUM; idx < FNAME_MIN_NUM + d->max_files; ++idx) { + char *path = NULL, *tmppath = NULL; + tor_asprintf(&path, "%s/%d", d->directory, idx); + tor_asprintf(&tmppath, "%s/%d.tmp", d->directory, idx); + + problems += sandbox_cfg_allow_open_filename(cfg, tor_strdup(path)); + problems += sandbox_cfg_allow_open_filename(cfg, tor_strdup(tmppath)); + problems += sandbox_cfg_allow_stat_filename(cfg, tor_strdup(path)); + problems += sandbox_cfg_allow_stat_filename(cfg, tor_strdup(tmppath)); + problems += sandbox_cfg_allow_rename(cfg, + tor_strdup(tmppath), tor_strdup(path)); + + tor_free(path); + tor_free(tmppath); + } + + return problems ? -1 : 0; +} + +/** + * Remove all files in <b>d</b> whose names end with ".tmp". + * + * Requires that the contents field of <b>d</b> is set. + */ +static void +storage_dir_clean_tmpfiles(storage_dir_t *d) +{ + if (!d->contents) + return; + SMARTLIST_FOREACH_BEGIN(d->contents, char *, fname) { + if (strcmpend(fname, ".tmp")) + continue; + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + if (unlink(sandbox_intern_string(path))) { + log_warn(LD_FS, "Unable to unlink %s", escaped(path)); + tor_free(path); + continue; + } + tor_free(path); + SMARTLIST_DEL_CURRENT(d->contents, fname); + tor_free(fname); + } SMARTLIST_FOREACH_END(fname); + + d->usage_known = 0; +} + +/** + * Re-scan the directory <b>d</b> to learn its contents. + */ +static int +storage_dir_rescan(storage_dir_t *d) +{ + if (d->contents) { + SMARTLIST_FOREACH(d->contents, char *, cp, tor_free(cp)); + smartlist_free(d->contents); + } + d->usage = 0; + d->usage_known = 0; + if (NULL == (d->contents = tor_listdir(d->directory))) { + return -1; + } + storage_dir_clean_tmpfiles(d); + return 0; +} + +/** + * Return a smartlist containing the filenames within <b>d</b>. + */ +const smartlist_t * +storage_dir_list(storage_dir_t *d) +{ + if (! d->contents) + storage_dir_rescan(d); + return d->contents; +} + +/** + * Return the total number of bytes used for storage in <b>d</b>. + */ +uint64_t +storage_dir_get_usage(storage_dir_t *d) +{ + if (d->usage_known) + return d->usage; + + uint64_t total = 0; + SMARTLIST_FOREACH_BEGIN(storage_dir_list(d), const char *, cp) { + char *path = NULL; + struct stat st; + tor_asprintf(&path, "%s/%s", d->directory, cp); + if (stat(sandbox_intern_string(path), &st) == 0) { + total += st.st_size; + } + tor_free(path); + } SMARTLIST_FOREACH_END(cp); + + d->usage = total; + d->usage_known = 1; + return d->usage; +} + +/** Mmap a specified file within <b>d</b>. */ +tor_mmap_t * +storage_dir_map(storage_dir_t *d, const char *fname) +{ + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + tor_mmap_t *result = tor_mmap_file(path); + tor_free(path); + return result; +} + +/** Read a file within <b>d</b> into a newly allocated buffer. Set + * *<b>sz_out</b> to its size. */ +uint8_t * +storage_dir_read(storage_dir_t *d, const char *fname, int bin, size_t *sz_out) +{ + const int flags = bin ? RFTS_BIN : 0; + + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + struct stat st; + char *contents = read_file_to_str(path, flags, &st); + if (contents && sz_out) { + // it fits in RAM, so we know its size is less than SIZE_MAX + tor_assert((uint64_t)st.st_size <= SIZE_MAX); + *sz_out = (size_t) st.st_size; + } + + tor_free(path); + return (uint8_t *) contents; +} + +/** Helper: Find an unused filename within the directory */ +static char * +find_unused_fname(storage_dir_t *d) +{ + if (!d->contents) { + if (storage_dir_rescan(d) < 0) + return NULL; + } + + char buf[16]; + int i; + /* Yuck; this is quadratic. Fortunately, that shouldn't matter much, + * since disk writes are more expensive by a lot. */ + for (i = FNAME_MIN_NUM; i < FNAME_MIN_NUM + d->max_files; ++i) { + tor_snprintf(buf, sizeof(buf), "%d", i); + if (!smartlist_contains_string(d->contents, buf)) { + return tor_strdup(buf); + } + } + return NULL; +} + +/** Helper: As storage_dir_save_bytes_to_file, but store a smartlist of + * sized_chunk_t rather than a single byte array. */ +static int +storage_dir_save_chunks_to_file(storage_dir_t *d, + const smartlist_t *chunks, + int binary, + char **fname_out) +{ + uint64_t total_length = 0; + char *fname = find_unused_fname(d); + if (!fname) + return -1; + + SMARTLIST_FOREACH(chunks, const sized_chunk_t *, ch, + total_length += ch->len); + + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + + int r = write_chunks_to_file(path, chunks, binary, 0); + if (r == 0) { + if (d->usage_known) + d->usage += total_length; + if (fname_out) { + *fname_out = tor_strdup(fname); + } + if (d->contents) + smartlist_add(d->contents, tor_strdup(fname)); + } + tor_free(fname); + tor_free(path); + return r; +} + +/** Try to write the <b>length</b> bytes at <b>data</b> into a new file + * in <b>d</b>. On success, return 0 and set *<b>fname_out</b> to a + * newly allocated string containing the filename. On failure, return + * -1. */ +int +storage_dir_save_bytes_to_file(storage_dir_t *d, + const uint8_t *data, + size_t length, + int binary, + char **fname_out) +{ + smartlist_t *chunks = smartlist_new(); + sized_chunk_t chunk = { (const char *)data, length }; + smartlist_add(chunks, &chunk); + int r = storage_dir_save_chunks_to_file(d, chunks, binary, fname_out); + smartlist_free(chunks); + return r; +} + +/** + * As storage_dir_save_bytes_to_file, but saves a NUL-terminated string + * <b>str</b>. + */ +int +storage_dir_save_string_to_file(storage_dir_t *d, + const char *str, + int binary, + char **fname_out) +{ + return storage_dir_save_bytes_to_file(d, + (const uint8_t*)str, strlen(str), binary, fname_out); +} + +/** + * As storage_dir_save_bytes_to_file, but associates the data with the + * key-value pairs in <b>labels</b>. Files + * stored in this format can be recovered with storage_dir_map_labeled + * or storage_dir_read_labeled(). + */ +int +storage_dir_save_labeled_to_file(storage_dir_t *d, + const config_line_t *labels, + const uint8_t *data, + size_t length, + char **fname_out) +{ + /* + * The storage format is to prefix the data with the key-value pairs in + * <b>labels</b>, and a single NUL separator. But code outside this module + * MUST NOT rely on that format. + */ + + smartlist_t *chunks = smartlist_new(); + memarea_t *area = memarea_new(); + const config_line_t *line; + for (line = labels; line; line = line->next) { + sized_chunk_t *sz = memarea_alloc(area, sizeof(sized_chunk_t)); + sz->len = strlen(line->key) + 1 + strlen(line->value) + 1; + const size_t allocated = sz->len + 1; + char *bytes = memarea_alloc(area, allocated); + tor_snprintf(bytes, allocated, "%s %s\n", line->key, line->value); + sz->bytes = bytes; + smartlist_add(chunks, sz); + } + + sized_chunk_t *nul = memarea_alloc(area, sizeof(sized_chunk_t)); + nul->len = 1; + nul->bytes = "\0"; + smartlist_add(chunks, nul); + + sized_chunk_t *datachunk = memarea_alloc(area, sizeof(sized_chunk_t)); + datachunk->bytes = (const char *)data; + datachunk->len = length; + smartlist_add(chunks, datachunk); + + int r = storage_dir_save_chunks_to_file(d, chunks, 1, fname_out); + smartlist_free(chunks); + memarea_drop_all(area); + return r; +} + +/** + * Map a file that was created with storage_dir_save_labeled(). On failure, + * return NULL. On success, write a set of newly allocated labels into to + * *<b>labels_out</b>, a pointer to the into *<b>data_out</b>, and the data's + * into *<b>sz_out</b>. On success, also return a tor_mmap_t object whose + * contents should not be used -- it needs to be kept around, though, for as + * long as <b>data_out</b> is going to be valid. + */ +tor_mmap_t * +storage_dir_map_labeled(storage_dir_t *dir, + const char *fname, + config_line_t **labels_out, + const uint8_t **data_out, + size_t *sz_out) +{ + tor_mmap_t *m = storage_dir_map(dir, fname); + if (! m) + goto err; + const char *nulp = memchr(m->data, '\0', m->size); + if (! nulp) + goto err; + if (labels_out && config_get_lines(m->data, labels_out, 0) < 0) + goto err; + size_t offset = nulp - m->data + 1; + tor_assert(offset <= m->size); + *data_out = (const uint8_t *)(m->data + offset); + *sz_out = m->size - offset; + + return m; + err: + tor_munmap_file(m); + return NULL; +} + +/** As storage_dir_map_labeled, but return a new byte array containing the + * data. */ +uint8_t * +storage_dir_read_labeled(storage_dir_t *dir, + const char *fname, + config_line_t **labels_out, + size_t *sz_out) +{ + const uint8_t *data = NULL; + tor_mmap_t *m = storage_dir_map_labeled(dir, fname, labels_out, + &data, sz_out); + if (m == NULL) + return NULL; + uint8_t *result = tor_memdup(data, *sz_out); + tor_munmap_file(m); + return result; +} + +/** + * Remove the file called <b>fname</b> from <b>d</b>. + */ +void +storage_dir_remove_file(storage_dir_t *d, + const char *fname) +{ + char *path = NULL; + tor_asprintf(&path, "%s/%s", d->directory, fname); + const char *ipath = sandbox_intern_string(path); + + uint64_t size = 0; + if (d->usage_known) { + struct stat st; + if (stat(ipath, &st) == 0) { + size = st.st_size; + } + } + if (unlink(ipath) == 0) { + d->usage -= size; + } else { + log_warn(LD_FS, "Unable to unlink %s", escaped(path)); + tor_free(path); + return; + } + if (d->contents) { + smartlist_string_remove(d->contents, fname); + } + + tor_free(path); +} + +/** Helper type: used to sort the members of storage directory by mtime. */ +typedef struct shrinking_dir_entry_t { + time_t mtime; + uint64_t size; + char *path; +} shrinking_dir_entry_t; + +/** Helper: use with qsort to sort shrinking_dir_entry_t structs. */ +static int +shrinking_dir_entry_compare(const void *a_, const void *b_) +{ + const shrinking_dir_entry_t *a = a_; + const shrinking_dir_entry_t *b = b_; + + if (a->mtime < b->mtime) + return -1; + else if (a->mtime > b->mtime) + return 1; + else + return 0; +} + +/** + * Try to free space by removing the oldest files in <b>d</b>. Delete + * until no more than <b>target_size</b> bytes are left, and at least + * <b>min_to_remove</b> files have been removed... or until there is + * nothing left to remove. + * + * Return 0 on success; -1 on failure. + */ +int +storage_dir_shrink(storage_dir_t *d, + uint64_t target_size, + int min_to_remove) +{ + if (d->usage_known && d->usage <= target_size && !min_to_remove) { + /* Already small enough. */ + return 0; + } + + if (storage_dir_rescan(d) < 0) + return -1; + + const uint64_t orig_usage = storage_dir_get_usage(d); + if (orig_usage <= target_size && !min_to_remove) { + /* Okay, small enough after rescan! */ + return 0; + } + + const int n = smartlist_len(d->contents); + shrinking_dir_entry_t *ents = tor_calloc(n, sizeof(shrinking_dir_entry_t)); + SMARTLIST_FOREACH_BEGIN(d->contents, const char *, fname) { + shrinking_dir_entry_t *ent = &ents[fname_sl_idx]; + struct stat st; + tor_asprintf(&ent->path, "%s/%s", d->directory, fname); + if (stat(sandbox_intern_string(ent->path), &st) == 0) { + ent->mtime = st.st_mtime; + ent->size = st.st_size; + } + } SMARTLIST_FOREACH_END(fname); + + qsort(ents, n, sizeof(shrinking_dir_entry_t), shrinking_dir_entry_compare); + + int idx = 0; + while ((d->usage > target_size || min_to_remove > 0) && idx < n) { + if (unlink(sandbox_intern_string(ents[idx].path)) == 0) { + if (! BUG(d->usage < ents[idx].size)) { + d->usage -= ents[idx].size; + } + --min_to_remove; + } + ++idx; + } + + for (idx = 0; idx < n; ++idx) { + tor_free(ents[idx].path); + } + tor_free(ents); + + storage_dir_rescan(d); + + return 0; +} + +/** Remove all files in <b>d</b>. */ +int +storage_dir_remove_all(storage_dir_t *d) +{ + return storage_dir_shrink(d, 0, d->max_files); +} + +/** + * Return the largest number of non-temporary files we're willing to + * store in <b>d</b>. + */ +int +storage_dir_get_max_files(storage_dir_t *d) +{ + return d->max_files; +} + diff --git a/src/common/storagedir.h b/src/common/storagedir.h new file mode 100644 index 0000000000..db25057e65 --- /dev/null +++ b/src/common/storagedir.h @@ -0,0 +1,51 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_STORAGEDIR_H +#define TOR_STORAGEDIR_H + +typedef struct storage_dir_t storage_dir_t; +struct config_line_t; +struct sandbox_cfg_elem; + +storage_dir_t * storage_dir_new(const char *dirname, int n_files); +void storage_dir_free(storage_dir_t *d); +int storage_dir_register_with_sandbox(storage_dir_t *d, + struct sandbox_cfg_elem **cfg); +const smartlist_t *storage_dir_list(storage_dir_t *d); +uint64_t storage_dir_get_usage(storage_dir_t *d); +tor_mmap_t *storage_dir_map(storage_dir_t *d, const char *fname); +uint8_t *storage_dir_read(storage_dir_t *d, const char *fname, int bin, + size_t *sz_out); +int storage_dir_save_bytes_to_file(storage_dir_t *d, + const uint8_t *data, + size_t length, + int binary, + char **fname_out); +int storage_dir_save_string_to_file(storage_dir_t *d, + const char *data, + int binary, + char **fname_out); +int storage_dir_save_labeled_to_file(storage_dir_t *d, + const struct config_line_t *labels, + const uint8_t *data, + size_t length, + char **fname_out); +tor_mmap_t *storage_dir_map_labeled(storage_dir_t *dir, + const char *fname, + struct config_line_t **labels_out, + const uint8_t **data_out, + size_t *size_out); +uint8_t *storage_dir_read_labeled(storage_dir_t *d, const char *fname, + struct config_line_t **labels_out, + size_t *sz_out); +void storage_dir_remove_file(storage_dir_t *d, + const char *fname); +int storage_dir_shrink(storage_dir_t *d, + uint64_t target_size, + int min_to_remove); +int storage_dir_remove_all(storage_dir_t *d); +int storage_dir_get_max_files(storage_dir_t *d); + +#endif + diff --git a/src/common/testsupport.h b/src/common/testsupport.h index 9ad2ba77e0..9fc96199b4 100644 --- a/src/common/testsupport.h +++ b/src/common/testsupport.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TESTSUPPORT_H diff --git a/src/common/timers.c b/src/common/timers.c index e1ad47b15b..6f4a6c30f0 100644 --- a/src/common/timers.c +++ b/src/common/timers.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/timers.h b/src/common/timers.h index c5246a3335..e816630e6d 100644 --- a/src/common/timers.h +++ b/src/common/timers.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TIMERS_H diff --git a/src/common/torgzip.c b/src/common/torgzip.c deleted file mode 100644 index 04ae353cf4..0000000000 --- a/src/common/torgzip.c +++ /dev/null @@ -1,584 +0,0 @@ -/* Copyright (c) 2004, Roger Dingledine. - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file torgzip.c - * \brief A simple in-memory gzip implementation. - **/ - -#include "orconfig.h" - -#include <stdlib.h> -#include <stdio.h> -#include <assert.h> -#include <string.h> -#include "torint.h" - -#ifdef HAVE_NETINET_IN_H -#include <netinet/in.h> -#endif - -#include "util.h" -#include "torlog.h" -#include "torgzip.h" - -/* zlib 1.2.4 and 1.2.5 do some "clever" things with macros. Instead of - saying "(defined(FOO) ? FOO : 0)" they like to say "FOO-0", on the theory - that nobody will care if the compile outputs a no-such-identifier warning. - - Sorry, but we like -Werror over here, so I guess we need to define these. - I hope that zlib 1.2.6 doesn't break these too. -*/ -#ifndef _LARGEFILE64_SOURCE -#define _LARGEFILE64_SOURCE 0 -#endif -#ifndef _LFS64_LARGEFILE -#define _LFS64_LARGEFILE 0 -#endif -#ifndef _FILE_OFFSET_BITS -#define _FILE_OFFSET_BITS 0 -#endif -#ifndef off64_t -#define off64_t int64_t -#endif - -#include <zlib.h> - -#if defined ZLIB_VERNUM && ZLIB_VERNUM < 0x1200 -#error "We require zlib version 1.2 or later." -#endif - -static size_t tor_zlib_state_size_precalc(int inflate, - int windowbits, int memlevel); - -/** Total number of bytes allocated for zlib state */ -static size_t total_zlib_allocation = 0; - -/** Return a string representation of the version of the currently running - * version of zlib. */ -const char * -tor_zlib_get_version_str(void) -{ - return zlibVersion(); -} - -/** Return a string representation of the version of the version of zlib -* used at compilation. */ -const char * -tor_zlib_get_header_version_str(void) -{ - return ZLIB_VERSION; -} - -/** Return the 'bits' value to tell zlib to use <b>method</b>.*/ -static inline int -method_bits(compress_method_t method, zlib_compression_level_t level) -{ - /* Bits+16 means "use gzip" in zlib >= 1.2 */ - const int flag = method == GZIP_METHOD ? 16 : 0; - switch (level) { - default: - case HIGH_COMPRESSION: return flag + 15; - case MEDIUM_COMPRESSION: return flag + 13; - case LOW_COMPRESSION: return flag + 11; - } -} - -static inline int -get_memlevel(zlib_compression_level_t level) -{ - switch (level) { - default: - case HIGH_COMPRESSION: return 8; - case MEDIUM_COMPRESSION: return 7; - case LOW_COMPRESSION: return 6; - } -} - -/** @{ */ -/* These macros define the maximum allowable compression factor. Anything of - * size greater than CHECK_FOR_COMPRESSION_BOMB_AFTER is not allowed to - * have an uncompression factor (uncompressed size:compressed size ratio) of - * any greater than MAX_UNCOMPRESSION_FACTOR. - * - * Picking a value for MAX_UNCOMPRESSION_FACTOR is a trade-off: we want it to - * be small to limit the attack multiplier, but we also want it to be large - * enough so that no legitimate document --even ones we might invent in the - * future -- ever compresses by a factor of greater than - * MAX_UNCOMPRESSION_FACTOR. Within those parameters, there's a reasonably - * large range of possible values. IMO, anything over 8 is probably safe; IMO - * anything under 50 is probably sufficient. - */ -#define MAX_UNCOMPRESSION_FACTOR 25 -#define CHECK_FOR_COMPRESSION_BOMB_AFTER (1024*64) -/** @} */ - -/** Return true if uncompressing an input of size <b>in_size</b> to an input - * of size at least <b>size_out</b> looks like a compression bomb. */ -static int -is_compression_bomb(size_t size_in, size_t size_out) -{ - if (size_in == 0 || size_out < CHECK_FOR_COMPRESSION_BOMB_AFTER) - return 0; - - return (size_out / size_in > MAX_UNCOMPRESSION_FACTOR); -} - -/** Given <b>in_len</b> bytes at <b>in</b>, compress them into a newly - * allocated buffer, using the method described in <b>method</b>. Store the - * compressed string in *<b>out</b>, and its length in *<b>out_len</b>. - * Return 0 on success, -1 on failure. - */ -int -tor_gzip_compress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method) -{ - struct z_stream_s *stream = NULL; - size_t out_size, old_size; - off_t offset; - - tor_assert(out); - tor_assert(out_len); - tor_assert(in); - tor_assert(in_len < UINT_MAX); - - *out = NULL; - - stream = tor_malloc_zero(sizeof(struct z_stream_s)); - stream->zalloc = Z_NULL; - stream->zfree = Z_NULL; - stream->opaque = NULL; - stream->next_in = (unsigned char*) in; - stream->avail_in = (unsigned int)in_len; - - if (deflateInit2(stream, Z_BEST_COMPRESSION, Z_DEFLATED, - method_bits(method, HIGH_COMPRESSION), - get_memlevel(HIGH_COMPRESSION), - Z_DEFAULT_STRATEGY) != Z_OK) { - //LCOV_EXCL_START -- we can only provoke failure by giving junk arguments. - log_warn(LD_GENERAL, "Error from deflateInit2: %s", - stream->msg?stream->msg:"<no message>"); - goto err; - //LCOV_EXCL_STOP - } - - /* Guess 50% compression. */ - out_size = in_len / 2; - if (out_size < 1024) out_size = 1024; - *out = tor_malloc(out_size); - stream->next_out = (unsigned char*)*out; - stream->avail_out = (unsigned int)out_size; - - while (1) { - switch (deflate(stream, Z_FINISH)) - { - case Z_STREAM_END: - goto done; - case Z_OK: - /* In case zlib doesn't work as I think .... */ - if (stream->avail_out >= stream->avail_in+16) - break; - case Z_BUF_ERROR: - offset = stream->next_out - ((unsigned char*)*out); - old_size = out_size; - out_size *= 2; - if (out_size < old_size) { - log_warn(LD_GENERAL, "Size overflow in compression."); - goto err; - } - *out = tor_realloc(*out, out_size); - stream->next_out = (unsigned char*)(*out + offset); - if (out_size - offset > UINT_MAX) { - log_warn(LD_BUG, "Ran over unsigned int limit of zlib while " - "uncompressing."); - goto err; - } - stream->avail_out = (unsigned int)(out_size - offset); - break; - default: - log_warn(LD_GENERAL, "Gzip compression didn't finish: %s", - stream->msg ? stream->msg : "<no message>"); - goto err; - } - } - done: - *out_len = stream->total_out; -#if defined(OpenBSD) - /* "Hey Rocky! Watch me change an unsigned field to a signed field in a - * third-party API!" - * "Oh, that trick will just make people do unsafe casts to the unsigned - * type in their cross-platform code!" - * "Don't be foolish. I'm _sure_ they'll have the good sense to make sure - * the newly unsigned field isn't negative." */ - tor_assert(stream->total_out >= 0); -#endif - if (deflateEnd(stream)!=Z_OK) { - // LCOV_EXCL_START -- unreachable if we handled the zlib structure right - tor_assert_nonfatal_unreached(); - log_warn(LD_BUG, "Error freeing gzip structures"); - goto err; - // LCOV_EXCL_STOP - } - tor_free(stream); - - if (is_compression_bomb(*out_len, in_len)) { - log_warn(LD_BUG, "We compressed something and got an insanely high " - "compression factor; other Tors would think this was a zlib bomb."); - goto err; - } - - return 0; - err: - if (stream) { - deflateEnd(stream); - tor_free(stream); - } - tor_free(*out); - return -1; -} - -/** Given zero or more zlib-compressed or gzip-compressed strings of - * total length - * <b>in_len</b> bytes at <b>in</b>, uncompress them into a newly allocated - * buffer, using the method described in <b>method</b>. Store the uncompressed - * string in *<b>out</b>, and its length in *<b>out_len</b>. Return 0 on - * success, -1 on failure. - * - * If <b>complete_only</b> is true, we consider a truncated input as a - * failure; otherwise we decompress as much as we can. Warn about truncated - * or corrupt inputs at <b>protocol_warn_level</b>. - */ -int -tor_gzip_uncompress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method, - int complete_only, - int protocol_warn_level) -{ - struct z_stream_s *stream = NULL; - size_t out_size, old_size; - off_t offset; - int r; - - tor_assert(out); - tor_assert(out_len); - tor_assert(in); - tor_assert(in_len < UINT_MAX); - - *out = NULL; - - stream = tor_malloc_zero(sizeof(struct z_stream_s)); - stream->zalloc = Z_NULL; - stream->zfree = Z_NULL; - stream->opaque = NULL; - stream->next_in = (unsigned char*) in; - stream->avail_in = (unsigned int)in_len; - - if (inflateInit2(stream, - method_bits(method, HIGH_COMPRESSION)) != Z_OK) { - // LCOV_EXCL_START -- can only hit this if we give bad inputs. - log_warn(LD_GENERAL, "Error from inflateInit2: %s", - stream->msg?stream->msg:"<no message>"); - goto err; - // LCOV_EXCL_STOP - } - - out_size = in_len * 2; /* guess 50% compression. */ - if (out_size < 1024) out_size = 1024; - if (out_size >= SIZE_T_CEILING || out_size > UINT_MAX) - goto err; - - *out = tor_malloc(out_size); - stream->next_out = (unsigned char*)*out; - stream->avail_out = (unsigned int)out_size; - - while (1) { - switch (inflate(stream, complete_only ? Z_FINISH : Z_SYNC_FLUSH)) - { - case Z_STREAM_END: - if (stream->avail_in == 0) - goto done; - /* There may be more compressed data here. */ - if ((r = inflateEnd(stream)) != Z_OK) { - log_warn(LD_BUG, "Error freeing gzip structures"); - goto err; - } - if (inflateInit2(stream, - method_bits(method,HIGH_COMPRESSION)) != Z_OK) { - log_warn(LD_GENERAL, "Error from second inflateInit2: %s", - stream->msg?stream->msg:"<no message>"); - goto err; - } - break; - case Z_OK: - if (!complete_only && stream->avail_in == 0) - goto done; - /* In case zlib doesn't work as I think.... */ - if (stream->avail_out >= stream->avail_in+16) - break; - case Z_BUF_ERROR: - if (stream->avail_out > 0) { - log_fn(protocol_warn_level, LD_PROTOCOL, - "possible truncated or corrupt zlib data"); - goto err; - } - offset = stream->next_out - (unsigned char*)*out; - old_size = out_size; - out_size *= 2; - if (out_size < old_size) { - log_warn(LD_GENERAL, "Size overflow in uncompression."); - goto err; - } - if (is_compression_bomb(in_len, out_size)) { - log_warn(LD_GENERAL, "Input looks like a possible zlib bomb; " - "not proceeding."); - goto err; - } - if (out_size >= SIZE_T_CEILING) { - log_warn(LD_BUG, "Hit SIZE_T_CEILING limit while uncompressing."); - goto err; - } - *out = tor_realloc(*out, out_size); - stream->next_out = (unsigned char*)(*out + offset); - if (out_size - offset > UINT_MAX) { - log_warn(LD_BUG, "Ran over unsigned int limit of zlib while " - "uncompressing."); - goto err; - } - stream->avail_out = (unsigned int)(out_size - offset); - break; - default: - log_warn(LD_GENERAL, "Gzip decompression returned an error: %s", - stream->msg ? stream->msg : "<no message>"); - goto err; - } - } - done: - *out_len = stream->next_out - (unsigned char*)*out; - r = inflateEnd(stream); - tor_free(stream); - if (r != Z_OK) { - log_warn(LD_BUG, "Error freeing gzip structures"); - goto err; - } - - /* NUL-terminate output. */ - if (out_size == *out_len) - *out = tor_realloc(*out, out_size + 1); - (*out)[*out_len] = '\0'; - - return 0; - err: - if (stream) { - inflateEnd(stream); - tor_free(stream); - } - if (*out) { - tor_free(*out); - } - return -1; -} - -/** Try to tell whether the <b>in_len</b>-byte string in <b>in</b> is likely - * to be compressed or not. If it is, return the likeliest compression method. - * Otherwise, return UNKNOWN_METHOD. - */ -compress_method_t -detect_compression_method(const char *in, size_t in_len) -{ - if (in_len > 2 && fast_memeq(in, "\x1f\x8b", 2)) { - return GZIP_METHOD; - } else if (in_len > 2 && (in[0] & 0x0f) == 8 && - (ntohs(get_uint16(in)) % 31) == 0) { - return ZLIB_METHOD; - } else { - return UNKNOWN_METHOD; - } -} - -/** Internal state for an incremental zlib compression/decompression. The - * body of this struct is not exposed. */ -struct tor_zlib_state_t { - struct z_stream_s stream; /**< The zlib stream */ - int compress; /**< True if we are compressing; false if we are inflating */ - - /** Number of bytes read so far. Used to detect zlib bombs. */ - size_t input_so_far; - /** Number of bytes written so far. Used to detect zlib bombs. */ - size_t output_so_far; - - /** Approximate number of bytes allocated for this object. */ - size_t allocation; -}; - -/** Construct and return a tor_zlib_state_t object using <b>method</b>. If - * <b>compress</b>, it's for compression; otherwise it's for - * decompression. */ -tor_zlib_state_t * -tor_zlib_new(int compress_, compress_method_t method, - zlib_compression_level_t compression_level) -{ - tor_zlib_state_t *out; - int bits, memlevel; - - if (! compress_) { - /* use this setting for decompression, since we might have the - * max number of window bits */ - compression_level = HIGH_COMPRESSION; - } - - out = tor_malloc_zero(sizeof(tor_zlib_state_t)); - out->stream.zalloc = Z_NULL; - out->stream.zfree = Z_NULL; - out->stream.opaque = NULL; - out->compress = compress_; - bits = method_bits(method, compression_level); - memlevel = get_memlevel(compression_level); - if (compress_) { - if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED, - bits, memlevel, - Z_DEFAULT_STRATEGY) != Z_OK) - goto err; // LCOV_EXCL_LINE - } else { - if (inflateInit2(&out->stream, bits) != Z_OK) - goto err; // LCOV_EXCL_LINE - } - out->allocation = tor_zlib_state_size_precalc(!compress_, bits, memlevel); - - total_zlib_allocation += out->allocation; - - return out; - - err: - tor_free(out); - return NULL; -} - -/** Compress/decompress some bytes using <b>state</b>. Read up to - * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes - * to *<b>out</b>, adjusting the values as we go. If <b>finish</b> is true, - * we've reached the end of the input. - * - * Return TOR_ZLIB_DONE if we've finished the entire compression/decompression. - * Return TOR_ZLIB_OK if we're processed everything from the input. - * Return TOR_ZLIB_BUF_FULL if we're out of space on <b>out</b>. - * Return TOR_ZLIB_ERR if the stream is corrupt. - */ -tor_zlib_output_t -tor_zlib_process(tor_zlib_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish) -{ - int err; - tor_assert(*in_len <= UINT_MAX); - tor_assert(*out_len <= UINT_MAX); - state->stream.next_in = (unsigned char*) *in; - state->stream.avail_in = (unsigned int)*in_len; - state->stream.next_out = (unsigned char*) *out; - state->stream.avail_out = (unsigned int)*out_len; - - if (state->compress) { - err = deflate(&state->stream, finish ? Z_FINISH : Z_NO_FLUSH); - } else { - err = inflate(&state->stream, finish ? Z_FINISH : Z_SYNC_FLUSH); - } - - state->input_so_far += state->stream.next_in - ((unsigned char*)*in); - state->output_so_far += state->stream.next_out - ((unsigned char*)*out); - - *out = (char*) state->stream.next_out; - *out_len = state->stream.avail_out; - *in = (const char *) state->stream.next_in; - *in_len = state->stream.avail_in; - - if (! state->compress && - is_compression_bomb(state->input_so_far, state->output_so_far)) { - log_warn(LD_DIR, "Possible zlib bomb; abandoning stream."); - return TOR_ZLIB_ERR; - } - - switch (err) - { - case Z_STREAM_END: - return TOR_ZLIB_DONE; - case Z_BUF_ERROR: - if (state->stream.avail_in == 0 && !finish) - return TOR_ZLIB_OK; - return TOR_ZLIB_BUF_FULL; - case Z_OK: - if (state->stream.avail_out == 0 || finish) - return TOR_ZLIB_BUF_FULL; - return TOR_ZLIB_OK; - default: - log_warn(LD_GENERAL, "Gzip returned an error: %s", - state->stream.msg ? state->stream.msg : "<no message>"); - return TOR_ZLIB_ERR; - } -} - -/** Deallocate <b>state</b>. */ -void -tor_zlib_free(tor_zlib_state_t *state) -{ - if (!state) - return; - - total_zlib_allocation -= state->allocation; - - if (state->compress) - deflateEnd(&state->stream); - else - inflateEnd(&state->stream); - - tor_free(state); -} - -/** Return an approximate number of bytes used in RAM to hold a state with - * window bits <b>windowBits</b> and compression level 'memlevel' */ -static size_t -tor_zlib_state_size_precalc(int inflate_, int windowbits, int memlevel) -{ - windowbits &= 15; - -#define A_FEW_KILOBYTES 2048 - - if (inflate_) { - /* From zconf.h: - - "The memory requirements for inflate are (in bytes) 1 << windowBits - that is, 32K for windowBits=15 (default value) plus a few kilobytes - for small objects." - */ - return sizeof(tor_zlib_state_t) + sizeof(struct z_stream_s) + - (1 << 15) + A_FEW_KILOBYTES; - } else { - /* Also from zconf.h: - - "The memory requirements for deflate are (in bytes): - (1 << (windowBits+2)) + (1 << (memLevel+9)) - ... plus a few kilobytes for small objects." - */ - return sizeof(tor_zlib_state_t) + sizeof(struct z_stream_s) + - (1 << (windowbits + 2)) + (1 << (memlevel + 9)) + A_FEW_KILOBYTES; - } -#undef A_FEW_KILOBYTES -} - -/** Return the approximate number of bytes allocated for <b>state</b>. */ -size_t -tor_zlib_state_size(const tor_zlib_state_t *state) -{ - return state->allocation; -} - -/** Return the approximate number of bytes allocated for all zlib states. */ -size_t -tor_zlib_get_total_allocation(void) -{ - return total_zlib_allocation; -} - diff --git a/src/common/torgzip.h b/src/common/torgzip.h deleted file mode 100644 index 00f62dcb45..0000000000 --- a/src/common/torgzip.h +++ /dev/null @@ -1,72 +0,0 @@ -/* Copyright (c) 2003, Roger Dingledine - * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -/** - * \file torgzip.h - * \brief Headers for torgzip.h - **/ - -#ifndef TOR_TORGZIP_H -#define TOR_TORGZIP_H - -/** Enumeration of what kind of compression to use. Only ZLIB_METHOD is - * guaranteed to be supported by the compress/uncompress functions here; - * GZIP_METHOD may be supported if we built against zlib version 1.2 or later - * and is_gzip_supported() returns true. */ -typedef enum { - NO_METHOD=0, GZIP_METHOD=1, ZLIB_METHOD=2, UNKNOWN_METHOD=3 -} compress_method_t; - -/** - * Enumeration to define tradeoffs between memory usage and compression level. - * HIGH_COMPRESSION saves the most bandwidth; LOW_COMPRESSION saves the most - * memory. - **/ -typedef enum { - HIGH_COMPRESSION, MEDIUM_COMPRESSION, LOW_COMPRESSION -} zlib_compression_level_t; - -int -tor_gzip_compress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method); -int -tor_gzip_uncompress(char **out, size_t *out_len, - const char *in, size_t in_len, - compress_method_t method, - int complete_only, - int protocol_warn_level); - -int is_gzip_supported(void); - -const char * -tor_zlib_get_version_str(void); - -const char * -tor_zlib_get_header_version_str(void); - -compress_method_t detect_compression_method(const char *in, size_t in_len); - -/** Return values from tor_zlib_process; see that function's documentation for - * details. */ -typedef enum { - TOR_ZLIB_OK, TOR_ZLIB_DONE, TOR_ZLIB_BUF_FULL, TOR_ZLIB_ERR -} tor_zlib_output_t; -/** Internal state for an incremental zlib compression/decompression. */ -typedef struct tor_zlib_state_t tor_zlib_state_t; -tor_zlib_state_t *tor_zlib_new(int compress, compress_method_t method, - zlib_compression_level_t level); - -tor_zlib_output_t tor_zlib_process(tor_zlib_state_t *state, - char **out, size_t *out_len, - const char **in, size_t *in_len, - int finish); -void tor_zlib_free(tor_zlib_state_t *state); - -size_t tor_zlib_state_size(const tor_zlib_state_t *state); -size_t tor_zlib_get_total_allocation(void); - -#endif - diff --git a/src/common/torint.h b/src/common/torint.h index 58c30f41a8..ee31459e94 100644 --- a/src/common/torint.h +++ b/src/common/torint.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/torlog.h b/src/common/torlog.h index bc957858d9..6e374b1c11 100644 --- a/src/common/torlog.h +++ b/src/common/torlog.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -101,8 +101,10 @@ #define LD_SCHED (1u<<22) /** Guard nodes */ #define LD_GUARD (1u<<23) +/** Generation and application of consensus diffs. */ +#define LD_CONSDIFF (1u<<24) /** Number of logging domains in the code. */ -#define N_LOGGING_DOMAINS 24 +#define N_LOGGING_DOMAINS 25 /** This log message is not safe to send to a callback-based logger * immediately. Used as a flag, not a log domain. */ diff --git a/src/common/tortls.c b/src/common/tortls.c index 1fe91edf0e..fadf52fa0a 100644 --- a/src/common/tortls.c +++ b/src/common/tortls.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -17,6 +17,7 @@ #include "orconfig.h" #define TORTLS_PRIVATE +#define TORTLS_OPENSSL_PRIVATE #include <assert.h> #ifdef _WIN32 /*wrkard for dtls1.h >= 0.9.8m of "#include <winsock.h>"*/ @@ -483,8 +484,22 @@ MOCK_IMPL(STATIC X509 *, * then we might pick a time where we're about to expire. Lastly, be * sure to start on a day boundary. */ time_t now = time(NULL); - start_time = crypto_rand_time_range(now - cert_lifetime, now) + 2*24*3600; - start_time -= start_time % (24*3600); + /* Our certificate lifetime will be cert_lifetime no matter what, but if we + * start cert_lifetime in the past, we'll have 0 real lifetime. instead we + * start up to (cert_lifetime - min_real_lifetime - start_granularity) in + * the past. */ + const time_t min_real_lifetime = 24*3600; + const time_t start_granularity = 24*3600; + time_t earliest_start_time = now - cert_lifetime + min_real_lifetime + + start_granularity; + /* Don't actually start in the future! */ + if (earliest_start_time >= now) + earliest_start_time = now - 1; + start_time = crypto_rand_time_range(earliest_start_time, now); + /* Round the start time back to the start of a day. */ + start_time -= start_time % start_granularity; + + end_time = start_time + cert_lifetime; tor_assert(rsa); tor_assert(cname); @@ -518,7 +533,6 @@ MOCK_IMPL(STATIC X509 *, if (!X509_time_adj(X509_get_notBefore(x509),0,&start_time)) goto error; - end_time = start_time + cert_lifetime; if (!X509_time_adj(X509_get_notAfter(x509),0,&end_time)) goto error; if (!X509_set_pubkey(x509, pkey)) @@ -2250,6 +2264,24 @@ check_cert_lifetime_internal(int severity, const X509 *cert, return 0; } +#ifdef TOR_UNIT_TESTS +/* Testing only: return a new x509 cert with the same contents as <b>inp</b>, + but with the expiration time <b>new_expiration_time</b>, signed with + <b>signing_key</b>. */ +STATIC tor_x509_cert_t * +tor_x509_cert_replace_expiration(const tor_x509_cert_t *inp, + time_t new_expiration_time, + crypto_pk_t *signing_key) +{ + X509 *newc = X509_dup(inp->cert); + X509_time_adj(X509_get_notAfter(newc), 0, &new_expiration_time); + EVP_PKEY *pk = crypto_pk_get_evp_pkey_(signing_key, 1); + tor_assert(X509_sign(newc, pk, EVP_sha256())); + EVP_PKEY_free(pk); + return tor_x509_cert_new(newc); +} +#endif + /** Return the number of bytes available for reading from <b>tls</b>. */ int diff --git a/src/common/tortls.h b/src/common/tortls.h index 6510fdbe64..fd0186cf90 100644 --- a/src/common/tortls.h +++ b/src/common/tortls.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TORTLS_H @@ -63,12 +63,17 @@ typedef enum { } tor_tls_state_t; #define tor_tls_state_bitfield_t ENUM_BF(tor_tls_state_t) +struct x509_st; +struct ssl_st; +struct ssl_ctx_st; +struct ssl_session_st; + /** Holds a SSL_CTX object and related state used to configure TLS * connections. */ typedef struct tor_tls_context_t { int refcnt; - SSL_CTX *ctx; + struct ssl_ctx_st *ctx; tor_x509_cert_t *my_link_cert; tor_x509_cert_t *my_id_cert; tor_x509_cert_t *my_auth_cert; @@ -78,7 +83,7 @@ typedef struct tor_tls_context_t { /** Structure that we use for a single certificate. */ struct tor_x509_cert_t { - X509 *cert; + struct x509_st *cert; uint8_t *encoded; size_t encoded_len; unsigned pkey_digests_set : 1; @@ -92,7 +97,7 @@ struct tor_x509_cert_t { struct tor_tls_t { uint32_t magic; tor_tls_context_t *context; /** A link to the context object for this tls. */ - SSL *ssl; /**< An OpenSSL SSL object. */ + struct ssl_st *ssl; /**< An OpenSSL SSL object. */ int socket; /**< The underlying file descriptor for this TLS connection. */ char *address; /**< An address to log when describing this connection. */ tor_tls_state_bitfield_t state : 3; /**< The current SSL state, @@ -128,35 +133,45 @@ struct tor_tls_t { STATIC int tor_errno_to_tls_error(int e); STATIC int tor_tls_get_error(tor_tls_t *tls, int r, int extra, const char *doing, int severity, int domain); -STATIC tor_tls_t *tor_tls_get_by_ssl(const SSL *ssl); +STATIC tor_tls_t *tor_tls_get_by_ssl(const struct ssl_st *ssl); STATIC void tor_tls_allocate_tor_tls_object_ex_data_index(void); +#ifdef TORTLS_OPENSSL_PRIVATE STATIC int always_accept_verify_cb(int preverify_ok, X509_STORE_CTX *x509_ctx); -STATIC int tor_tls_classify_client_ciphers(const SSL *ssl, +STATIC int tor_tls_classify_client_ciphers(const struct ssl_st *ssl, STACK_OF(SSL_CIPHER) *peer_ciphers); -STATIC int tor_tls_client_is_using_v2_ciphers(const SSL *ssl); +#endif +STATIC int tor_tls_client_is_using_v2_ciphers(const struct ssl_st *ssl); MOCK_DECL(STATIC void, try_to_extract_certs_from_tls, - (int severity, tor_tls_t *tls, X509 **cert_out, X509 **id_cert_out)); + (int severity, tor_tls_t *tls, struct x509_st **cert_out, + struct x509_st **id_cert_out)); #ifndef HAVE_SSL_SESSION_GET_MASTER_KEY -STATIC size_t SSL_SESSION_get_master_key(SSL_SESSION *s, uint8_t *out, +STATIC size_t SSL_SESSION_get_master_key(struct ssl_session_st *s, + uint8_t *out, size_t len); #endif -STATIC void tor_tls_debug_state_callback(const SSL *ssl, int type, int val); -STATIC void tor_tls_server_info_callback(const SSL *ssl, int type, int val); -STATIC int tor_tls_session_secret_cb(SSL *ssl, void *secret, +STATIC void tor_tls_debug_state_callback(const struct ssl_st *ssl, + int type, int val); +STATIC void tor_tls_server_info_callback(const struct ssl_st *ssl, + int type, int val); +#ifdef TORTLS_OPENSSL_PRIVATE +STATIC int tor_tls_session_secret_cb(struct ssl_st *ssl, void *secret, int *secret_len, STACK_OF(SSL_CIPHER) *peer_ciphers, CONST_IF_OPENSSL_1_1_API SSL_CIPHER **cipher, void *arg); STATIC int find_cipher_by_id(const SSL *ssl, const SSL_METHOD *m, uint16_t cipher); -MOCK_DECL(STATIC X509*, tor_tls_create_certificate,(crypto_pk_t *rsa, +#endif +MOCK_DECL(STATIC struct x509_st *, tor_tls_create_certificate, + (crypto_pk_t *rsa, crypto_pk_t *rsa_sign, const char *cname, const char *cname_sign, unsigned int cert_lifetime)); STATIC tor_tls_context_t *tor_tls_context_new(crypto_pk_t *identity, unsigned int key_lifetime, unsigned flags, int is_client); -MOCK_DECL(STATIC tor_x509_cert_t *, tor_x509_cert_new,(X509 *x509_cert)); +MOCK_DECL(STATIC tor_x509_cert_t *, tor_x509_cert_new, + (struct x509_st *x509_cert)); STATIC int tor_tls_context_init_one(tor_tls_context_t **ppcontext, crypto_pk_t *identity, unsigned int key_lifetime, @@ -172,6 +187,11 @@ extern tor_tls_context_t *client_tls_context; extern uint16_t v2_cipher_list[]; extern uint64_t total_bytes_written_over_tls; extern uint64_t total_bytes_written_by_tls; + +STATIC tor_x509_cert_t *tor_x509_cert_replace_expiration( + const tor_x509_cert_t *inp, + time_t new_expiration_time, + crypto_pk_t *signing_key); #endif #endif /* endif TORTLS_PRIVATE */ diff --git a/src/common/util.c b/src/common/util.c index f980fa296c..ca2a0c4a9c 100644 --- a/src/common/util.c +++ b/src/common/util.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -2118,7 +2118,7 @@ read_all(tor_socket_t fd, char *buf, size_t count, int isSocket) return -1; } - while (numread != count) { + while (numread < count) { if (isSocket) result = tor_socket_recv(fd, buf+numread, count-numread, 0); else @@ -3045,137 +3045,6 @@ unescape_string(const char *s, char **result, size_t *size_out) } } -/** Given a string containing part of a configuration file or similar format, - * advance past comments and whitespace and try to parse a single line. If we - * parse a line successfully, set *<b>key_out</b> to a new string holding the - * key portion and *<b>value_out</b> to a new string holding the value portion - * of the line, and return a pointer to the start of the next line. If we run - * out of data, return a pointer to the end of the string. If we encounter an - * error, return NULL and set *<b>err_out</b> (if provided) to an error - * message. - */ -const char * -parse_config_line_from_str_verbose(const char *line, char **key_out, - char **value_out, - const char **err_out) -{ - /* - See torrc_format.txt for a description of the (silly) format this parses. - */ - const char *key, *val, *cp; - int continuation = 0; - - tor_assert(key_out); - tor_assert(value_out); - - *key_out = *value_out = NULL; - key = val = NULL; - /* Skip until the first keyword. */ - while (1) { - while (TOR_ISSPACE(*line)) - ++line; - if (*line == '#') { - while (*line && *line != '\n') - ++line; - } else { - break; - } - } - - if (!*line) { /* End of string? */ - *key_out = *value_out = NULL; - return line; - } - - /* Skip until the next space or \ followed by newline. */ - key = line; - while (*line && !TOR_ISSPACE(*line) && *line != '#' && - ! (line[0] == '\\' && line[1] == '\n')) - ++line; - *key_out = tor_strndup(key, line-key); - - /* Skip until the value. */ - while (*line == ' ' || *line == '\t') - ++line; - - val = line; - - /* Find the end of the line. */ - if (*line == '\"') { // XXX No continuation handling is done here - if (!(line = unescape_string(line, value_out, NULL))) { - if (err_out) - *err_out = "Invalid escape sequence in quoted string"; - return NULL; - } - while (*line == ' ' || *line == '\t') - ++line; - if (*line == '\r' && *(++line) == '\n') - ++line; - if (*line && *line != '#' && *line != '\n') { - if (err_out) - *err_out = "Excess data after quoted string"; - return NULL; - } - } else { - /* Look for the end of the line. */ - while (*line && *line != '\n' && (*line != '#' || continuation)) { - if (*line == '\\' && line[1] == '\n') { - continuation = 1; - line += 2; - } else if (*line == '#') { - do { - ++line; - } while (*line && *line != '\n'); - if (*line == '\n') - ++line; - } else { - ++line; - } - } - - if (*line == '\n') { - cp = line++; - } else { - cp = line; - } - /* Now back cp up to be the last nonspace character */ - while (cp>val && TOR_ISSPACE(*(cp-1))) - --cp; - - tor_assert(cp >= val); - - /* Now copy out and decode the value. */ - *value_out = tor_strndup(val, cp-val); - if (continuation) { - char *v_out, *v_in; - v_out = v_in = *value_out; - while (*v_in) { - if (*v_in == '#') { - do { - ++v_in; - } while (*v_in && *v_in != '\n'); - if (*v_in == '\n') - ++v_in; - } else if (v_in[0] == '\\' && v_in[1] == '\n') { - v_in += 2; - } else { - *v_out++ = *v_in++; - } - } - *v_out = '\0'; - } - } - - if (*line == '#') { - do { - ++line; - } while (*line && *line != '\n'); - } - while (TOR_ISSPACE(*line)) ++line; - - return line; -} - /** Expand any homedir prefix on <b>filename</b>; return a newly allocated * string. */ char * @@ -4175,10 +4044,10 @@ tor_process_get_stdout_pipe(process_handle_t *process_handle) } #else /* DOCDOC tor_process_get_stdout_pipe */ -FILE * +int tor_process_get_stdout_pipe(process_handle_t *process_handle) { - return process_handle->stdout_handle; + return process_handle->stdout_pipe; } #endif @@ -4609,10 +4478,6 @@ tor_spawn_background(const char *const filename, const char **argv, log_warn(LD_GENERAL, "Failed to set stderror/stdout/stdin pipes " "nonblocking in parent process: %s", strerror(errno)); } - /* Open the buffered IO streams */ - process_handle->stdout_handle = fdopen(process_handle->stdout_pipe, "r"); - process_handle->stderr_handle = fdopen(process_handle->stderr_pipe, "r"); - process_handle->stdin_handle = fdopen(process_handle->stdin_pipe, "r"); *process_handle_out = process_handle; return process_handle->status; @@ -4659,14 +4524,9 @@ tor_process_handle_destroy,(process_handle_t *process_handle, if (process_handle->stdin_pipe) CloseHandle(process_handle->stdin_pipe); #else - if (process_handle->stdout_handle) - fclose(process_handle->stdout_handle); - - if (process_handle->stderr_handle) - fclose(process_handle->stderr_handle); - - if (process_handle->stdin_handle) - fclose(process_handle->stdin_handle); + close(process_handle->stdout_pipe); + close(process_handle->stderr_pipe); + close(process_handle->stdin_pipe); clear_waitpid_callback(process_handle->waitpid_cb); #endif @@ -4952,7 +4812,7 @@ tor_read_all_handle(HANDLE h, char *buf, size_t count, if (count > SIZE_T_CEILING || count > SSIZE_MAX) return -1; - while (numread != count) { + while (numread < count) { /* Check if there is anything to read */ retval = PeekNamedPipe(h, NULL, 0, NULL, &byte_count, NULL); if (!retval) { @@ -4998,19 +4858,19 @@ tor_read_all_handle(HANDLE h, char *buf, size_t count, return (ssize_t)numread; } #else -/** Read from a handle <b>h</b> into <b>buf</b>, up to <b>count</b> bytes. If +/** Read from a handle <b>fd</b> into <b>buf</b>, up to <b>count</b> bytes. If * <b>process</b> is NULL, the function will return immediately if there is * nothing more to read. Otherwise data will be read until end of file, or * <b>count</b> bytes are read. Returns the number of bytes read, or -1 on * error. Sets <b>eof</b> to true if <b>eof</b> is not NULL and the end of the * file has been reached. */ ssize_t -tor_read_all_handle(FILE *h, char *buf, size_t count, +tor_read_all_handle(int fd, char *buf, size_t count, const process_handle_t *process, int *eof) { size_t numread = 0; - char *retval; + ssize_t result; if (eof) *eof = 0; @@ -5018,34 +4878,28 @@ tor_read_all_handle(FILE *h, char *buf, size_t count, if (count > SIZE_T_CEILING || count > SSIZE_MAX) return -1; - while (numread != count) { - /* Use fgets because that is what we use in log_from_pipe() */ - retval = fgets(buf+numread, (int)(count-numread), h); - if (NULL == retval) { - if (feof(h)) { - log_debug(LD_GENERAL, "fgets() reached end of file"); - if (eof) - *eof = 1; + while (numread < count) { + result = read(fd, buf+numread, count-numread); + + if (result == 0) { + log_debug(LD_GENERAL, "read() reached end of file"); + if (eof) + *eof = 1; + break; + } else if (result < 0 && errno == EAGAIN) { + if (process) + continue; + else break; - } else { - if (EAGAIN == errno) { - if (process) - continue; - else - break; - } else { - log_warn(LD_GENERAL, "fgets() from handle failed: %s", - strerror(errno)); - return -1; - } - } + } else if (result < 0) { + log_warn(LD_GENERAL, "read() failed: %s", strerror(errno)); + return -1; } - tor_assert(retval != NULL); - tor_assert(strlen(retval) + numread <= count); - numread += strlen(retval); + + numread += result; } - log_debug(LD_GENERAL, "fgets() read %d bytes from handle", (int)numread); + log_debug(LD_GENERAL, "read() read %d bytes from handle", (int)numread); return (ssize_t)numread; } #endif @@ -5059,7 +4913,7 @@ tor_read_all_from_process_stdout(const process_handle_t *process_handle, return tor_read_all_handle(process_handle->stdout_pipe, buf, count, process_handle); #else - return tor_read_all_handle(process_handle->stdout_handle, buf, count, + return tor_read_all_handle(process_handle->stdout_pipe, buf, count, process_handle, NULL); #endif } @@ -5073,7 +4927,7 @@ tor_read_all_from_process_stderr(const process_handle_t *process_handle, return tor_read_all_handle(process_handle->stderr_pipe, buf, count, process_handle); #else - return tor_read_all_handle(process_handle->stderr_handle, buf, count, + return tor_read_all_handle(process_handle->stderr_pipe, buf, count, process_handle, NULL); #endif } @@ -5267,11 +5121,10 @@ log_from_handle(HANDLE *pipe, int severity) #else /** Return a smartlist containing lines outputted from - * <b>handle</b>. Return NULL on error, and set + * <b>fd</b>. Return NULL on error, and set * <b>stream_status_out</b> appropriately. */ MOCK_IMPL(smartlist_t *, -tor_get_lines_from_handle, (FILE *handle, - enum stream_status *stream_status_out)) +tor_get_lines_from_handle, (int fd, enum stream_status *stream_status_out)) { enum stream_status stream_status; char stdout_buf[400]; @@ -5280,13 +5133,13 @@ tor_get_lines_from_handle, (FILE *handle, while (1) { memset(stdout_buf, 0, sizeof(stdout_buf)); - stream_status = get_string_from_pipe(handle, + stream_status = get_string_from_pipe(fd, stdout_buf, sizeof(stdout_buf) - 1); if (stream_status != IO_STREAM_OKAY) goto done; if (!lines) lines = smartlist_new(); - smartlist_add_strdup(lines, stdout_buf); + smartlist_split_string(lines, stdout_buf, "\n", 0, 0); } done: @@ -5294,20 +5147,20 @@ tor_get_lines_from_handle, (FILE *handle, return lines; } -/** Read from stream, and send lines to log at the specified log level. +/** Read from fd, and send lines to log at the specified log level. * Returns 1 if stream is closed normally, -1 if there is a error reading, and * 0 otherwise. Handles lines from tor-fw-helper and * tor_spawn_background() specially. */ static int -log_from_pipe(FILE *stream, int severity, const char *executable, +log_from_pipe(int fd, int severity, const char *executable, int *child_status) { char buf[256]; enum stream_status r; for (;;) { - r = get_string_from_pipe(stream, buf, sizeof(buf) - 1); + r = get_string_from_pipe(fd, buf, sizeof(buf) - 1); if (r == IO_STREAM_CLOSED) { return 1; @@ -5332,7 +5185,7 @@ log_from_pipe(FILE *stream, int severity, const char *executable, } #endif -/** Reads from <b>stream</b> and stores input in <b>buf_out</b> making +/** Reads from <b>fd</b> and stores input in <b>buf_out</b> making * sure it's below <b>count</b> bytes. * If the string has a trailing newline, we strip it off. * @@ -5348,52 +5201,28 @@ log_from_pipe(FILE *stream, int severity, const char *executable, * IO_STREAM_OKAY: If everything went okay and we got a string * in <b>buf_out</b>. */ enum stream_status -get_string_from_pipe(FILE *stream, char *buf_out, size_t count) +get_string_from_pipe(int fd, char *buf_out, size_t count) { - char *retval; - size_t len; + ssize_t ret; tor_assert(count <= INT_MAX); - retval = fgets(buf_out, (int)count, stream); + ret = read(fd, buf_out, count); - if (!retval) { - if (feof(stream)) { - /* Program has closed stream (probably it exited) */ - /* TODO: check error */ - return IO_STREAM_CLOSED; - } else { - if (EAGAIN == errno) { - /* Nothing more to read, try again next time */ - return IO_STREAM_EAGAIN; - } else { - /* There was a problem, abandon this child process */ - return IO_STREAM_TERM; - } - } - } else { - len = strlen(buf_out); - if (len == 0) { - /* this probably means we got a NUL at the start of the string. */ - return IO_STREAM_EAGAIN; - } + if (ret == 0) + return IO_STREAM_CLOSED; + else if (ret < 0 && errno == EAGAIN) + return IO_STREAM_EAGAIN; + else if (ret < 0) + return IO_STREAM_TERM; - if (buf_out[len - 1] == '\n') { - /* Remove the trailing newline */ - buf_out[len - 1] = '\0'; - } else { - /* No newline; check whether we overflowed the buffer */ - if (!feof(stream)) - log_info(LD_GENERAL, - "Line from stream was truncated: %s", buf_out); - /* TODO: What to do with this error? */ - } - - return IO_STREAM_OKAY; - } + if (buf_out[ret - 1] == '\n') { + /* Remove the trailing newline */ + buf_out[ret - 1] = '\0'; + } else + buf_out[ret] = '\0'; - /* We should never get here */ - return IO_STREAM_TERM; + return IO_STREAM_OKAY; } /** Parse a <b>line</b> from tor-fw-helper and issue an appropriate @@ -5630,7 +5459,7 @@ tor_check_port_forwarding(const char *filename, #ifdef _WIN32 stderr_status = log_from_handle(child_handle->stderr_pipe, LOG_INFO); #else - stderr_status = log_from_pipe(child_handle->stderr_handle, + stderr_status = log_from_pipe(child_handle->stderr_pipe, LOG_INFO, filename, &retval); #endif if (handle_fw_helper_output(filename, child_handle) < 0) { diff --git a/src/common/util.h b/src/common/util.h index 13fcc5142d..18eb57f1bc 100644 --- a/src/common/util.h +++ b/src/common/util.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -163,9 +163,9 @@ int64_t clamp_double_to_int64(double number); void simplify_fraction64(uint64_t *numer, uint64_t *denom); /* Compute the CEIL of <b>a</b> divided by <b>b</b>, for nonnegative <b>a</b> - * and positive <b>b</b>. Works on integer types only. Not defined if a+b can - * overflow. */ -#define CEIL_DIV(a,b) (((a)+(b)-1)/(b)) + * and positive <b>b</b>. Works on integer types only. Not defined if a+(b-1) + * can overflow. */ +#define CEIL_DIV(a,b) (((a)+((b)-1))/(b)) /* Return <b>v</b> if it's between <b>min</b> and <b>max</b>. Otherwise * return <b>min</b> if <b>v</b> is smaller than <b>min</b>, or <b>max</b> if @@ -322,7 +322,7 @@ enum stream_status { const char *stream_status_to_string(enum stream_status stream_status); -enum stream_status get_string_from_pipe(FILE *stream, char *buf, size_t count); +enum stream_status get_string_from_pipe(int fd, char *buf, size_t count); MOCK_DECL(int,tor_unlink,(const char *pathname)); @@ -389,9 +389,6 @@ char *read_file_to_str_until_eof(int fd, size_t max_bytes_to_read, size_t *sz_out) ATTR_MALLOC; const char *unescape_string(const char *s, char **result, size_t *size_out); -const char *parse_config_line_from_str_verbose(const char *line, - char **key_out, char **value_out, - const char **err_out); char *expand_filename(const char *filename); MOCK_DECL(struct smartlist_t *, tor_listdir, (const char *dirname)); int path_is_relative(const char *filename); @@ -463,9 +460,6 @@ struct process_handle_t { int stdin_pipe; int stdout_pipe; int stderr_pipe; - FILE *stdin_handle; - FILE *stdout_handle; - FILE *stderr_handle; pid_t pid; /** If the process has not given us a SIGCHLD yet, this has the * waitpid_callback_t that gets invoked once it has. Otherwise this @@ -488,7 +482,7 @@ int tor_split_lines(struct smartlist_t *sl, char *buf, int len); ssize_t tor_read_all_handle(HANDLE h, char *buf, size_t count, const process_handle_t *process); #else -ssize_t tor_read_all_handle(FILE *h, char *buf, size_t count, +ssize_t tor_read_all_handle(int fd, char *buf, size_t count, const process_handle_t *process, int *eof); #endif @@ -502,7 +496,7 @@ int tor_process_get_pid(process_handle_t *process_handle); #ifdef _WIN32 HANDLE tor_process_get_stdout_pipe(process_handle_t *process_handle); #else -FILE *tor_process_get_stdout_pipe(process_handle_t *process_handle); +int tor_process_get_stdout_pipe(process_handle_t *process_handle); #endif #ifdef _WIN32 @@ -511,7 +505,7 @@ tor_get_lines_from_handle,(HANDLE *handle, enum stream_status *stream_status)); #else MOCK_DECL(struct smartlist_t *, -tor_get_lines_from_handle,(FILE *handle, +tor_get_lines_from_handle,(int fd, enum stream_status *stream_status)); #endif diff --git a/src/common/util_bug.c b/src/common/util_bug.c index c7bfdefe80..3d990e3700 100644 --- a/src/common/util_bug.c +++ b/src/common/util_bug.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/util_bug.h b/src/common/util_bug.h index e02778110b..7879f880ec 100644 --- a/src/common/util_bug.h +++ b/src/common/util_bug.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/util_format.c b/src/common/util_format.c index 6e0a04586a..1f7b8b03aa 100644 --- a/src/common/util_format.c +++ b/src/common/util_format.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -22,13 +22,16 @@ #include <stdlib.h> /* Return the base32 encoded size in bytes using the source length srclen. - * The NUL terminated byte is added as well since every base32 encoding - * requires enough space for it. */ + * + * (WATCH OUT: This API counts the terminating NUL byte, but + * base64_encode_size does not.) + */ size_t base32_encoded_size(size_t srclen) { size_t enclen; - enclen = CEIL_DIV(srclen*8, 5) + 1; + tor_assert(srclen < SIZE_T_CEILING / 8); + enclen = BASE32_NOPAD_BUFSIZE(srclen); tor_assert(enclen < INT_MAX && enclen > srclen); return enclen; } @@ -41,7 +44,6 @@ base32_encode(char *dest, size_t destlen, const char *src, size_t srclen) size_t nbits = srclen * 8; size_t bit; - tor_assert(srclen < SIZE_T_CEILING/8); /* We need enough space for the encoded data and the extra NUL byte. */ tor_assert(base32_encoded_size(srclen) <= destlen); tor_assert(destlen < SIZE_T_CEILING); @@ -51,9 +53,10 @@ base32_encode(char *dest, size_t destlen, const char *src, size_t srclen) for (i=0,bit=0; bit < nbits; ++i, bit+=5) { /* set v to the 16-bit value starting at src[bits/8], 0-padded. */ - v = ((uint8_t)src[bit/8]) << 8; - if (bit+5<nbits) - v += (uint8_t)src[(bit/8)+1]; + size_t idx = bit / 8; + v = ((uint8_t)src[idx]) << 8; + if (idx+1 < srclen) + v += (uint8_t)src[idx+1]; /* set u to the 5-bit value at the bit'th bit of buf. */ u = (v >> (11-(bit%8))) & 0x1F; dest[i] = BASE32_CHARS[u]; @@ -133,6 +136,9 @@ base32_decode(char *dest, size_t destlen, const char *src, size_t srclen) /** Return the Base64 encoded size of <b>srclen</b> bytes of data in * bytes. * + * (WATCH OUT: This API <em>does not</em> count the terminating NUL byte, + * but base32_encoded_size does.) + * * If <b>flags</b>&BASE64_ENCODE_MULTILINE is true, return the size * of the encoded output as multiline output (64 character, `\n' terminated * lines). @@ -141,19 +147,16 @@ size_t base64_encode_size(size_t srclen, int flags) { size_t enclen; + + /* Use INT_MAX for overflow checking because base64_encode() returns int. */ tor_assert(srclen < INT_MAX); + tor_assert(CEIL_DIV(srclen, 3) < INT_MAX / 4); - if (srclen == 0) - return 0; + enclen = BASE64_LEN(srclen); + if (flags & BASE64_ENCODE_MULTILINE) + enclen += CEIL_DIV(enclen, BASE64_OPENSSL_LINELEN); - enclen = ((srclen - 1) / 3) * 4 + 4; - if (flags & BASE64_ENCODE_MULTILINE) { - size_t remainder = enclen % BASE64_OPENSSL_LINELEN; - enclen += enclen / BASE64_OPENSSL_LINELEN; - if (remainder) - enclen++; - } - tor_assert(enclen < INT_MAX && enclen > srclen); + tor_assert(enclen < INT_MAX && (enclen == 0 || enclen > srclen)); return enclen; } @@ -310,39 +313,6 @@ base64_encode_nopad(char *dest, size_t destlen, return (int)(out - dest); } -/** As base64_decode, but do not require any padding on the input */ -int -base64_decode_nopad(uint8_t *dest, size_t destlen, - const char *src, size_t srclen) -{ - if (srclen > SIZE_T_CEILING - 4) - return -1; - char *buf = tor_malloc(srclen + 4); - memcpy(buf, src, srclen+1); - size_t buflen; - switch (srclen % 4) - { - case 0: - default: - buflen = srclen; - break; - case 1: - tor_free(buf); - return -1; - case 2: - memcpy(buf+srclen, "==", 3); - buflen = srclen + 2; - break; - case 3: - memcpy(buf+srclen, "=", 2); - buflen = srclen + 1; - break; - } - int n = base64_decode((char*)dest, destlen, buf, buflen); - tor_free(buf); - return n; -} - #undef BASE64_OPENSSL_LINELEN /** @{ */ @@ -392,15 +362,9 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) const char *eos = src+srclen; uint32_t n=0; int n_idx=0; - char *dest_orig = dest; + size_t di = 0; - /* Max number of bits == srclen*6. - * Number of bytes required to hold all bits == (srclen*6)/8. - * Yes, we want to round down: anything that hangs over the end of a - * byte is padding. */ - if (!size_mul_check(srclen, 3) || destlen < (srclen*3)/4) - return -1; - if (destlen > SIZE_T_CEILING) + if (destlen > INT_MAX) return -1; /* Make sure we leave no uninitialized data in the destination buffer. */ @@ -428,9 +392,11 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) n = (n<<6) | v; if ((++n_idx) == 4) { /* We've accumulated 24 bits in n. Flush them. */ - *dest++ = (n>>16); - *dest++ = (n>>8) & 0xff; - *dest++ = (n) & 0xff; + if (destlen < 3 || di > destlen - 3) + return -1; + dest[di++] = (n>>16); + dest[di++] = (n>>8) & 0xff; + dest[di++] = (n) & 0xff; n_idx = 0; n = 0; } @@ -448,18 +414,21 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen) return -1; case 2: /* 12 leftover bits: The last 4 are padding and the first 8 are data. */ - *dest++ = n >> 4; + if (destlen < 1 || di > destlen - 1) + return -1; + dest[di++] = n >> 4; break; case 3: /* 18 leftover bits: The last 2 are padding and the first 16 are data. */ - *dest++ = n >> 10; - *dest++ = n >> 2; + if (destlen < 2 || di > destlen - 2) + return -1; + dest[di++] = n >> 10; + dest[di++] = n >> 2; } - tor_assert((dest-dest_orig) <= (ssize_t)destlen); - tor_assert((dest-dest_orig) <= INT_MAX); + tor_assert(di <= destlen); - return (int)(dest-dest_orig); + return (int)di; } #undef X #undef SP @@ -475,7 +444,8 @@ base16_encode(char *dest, size_t destlen, const char *src, size_t srclen) const char *end; char *cp; - tor_assert(destlen >= srclen*2+1); + tor_assert(srclen < SIZE_T_CEILING / 2 - 1); + tor_assert(destlen >= BASE16_BUFSIZE(srclen)); tor_assert(destlen < SIZE_T_CEILING); /* Make sure we leave no uninitialized data in the destination buffer. */ diff --git a/src/common/util_format.h b/src/common/util_format.h index 20ac711d10..adf48c0077 100644 --- a/src/common/util_format.h +++ b/src/common/util_format.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001, Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_UTIL_FORMAT_H @@ -10,6 +10,26 @@ #include "testsupport.h" #include "torint.h" +/** @{ */ +/** These macros don't check for overflow. Use them only for constant inputs + * (like array declarations). The *_LEN macros are the raw encoding lengths + * (without terminating NUL), while the *_BUFSIZE macros count the terminating + * NUL. */ +#define BASE64_LEN(n) (CEIL_DIV((n), 3) * 4) +#define BASE32_LEN(n) (CEIL_DIV((n), 5) * 8) +#define BASE16_LEN(n) ((n) * 2) + +#define BASE64_BUFSIZE(n) (BASE64_LEN(n) + 1) +#define BASE32_BUFSIZE(n) (BASE32_LEN(n) + 1) +#define BASE16_BUFSIZE(n) (BASE16_LEN(n) + 1) + +#define BASE64_NOPAD_LEN(n) (CEIL_DIV((n) * 4, 3) +#define BASE32_NOPAD_LEN(n) (CEIL_DIV((n) * 8, 5) + +#define BASE64_NOPAD_BUFSIZE(n) (BASE64_NOPAD_LEN(n) + 1)) +#define BASE32_NOPAD_BUFSIZE(n) (BASE32_NOPAD_LEN(n) + 1)) +/** @} */ + #define BASE64_ENCODE_MULTILINE 1 size_t base64_encode_size(size_t srclen, int flags); int base64_encode(char *dest, size_t destlen, const char *src, size_t srclen, @@ -17,8 +37,6 @@ int base64_encode(char *dest, size_t destlen, const char *src, size_t srclen, int base64_decode(char *dest, size_t destlen, const char *src, size_t srclen); int base64_encode_nopad(char *dest, size_t destlen, const uint8_t *src, size_t srclen); -int base64_decode_nopad(uint8_t *dest, size_t destlen, - const char *src, size_t srclen); /** Characters that can appear (case-insensitively) in a base32 encoding. */ #define BASE32_CHARS "abcdefghijklmnopqrstuvwxyz234567" diff --git a/src/common/util_process.c b/src/common/util_process.c index abda63720c..9e9679b099 100644 --- a/src/common/util_process.c +++ b/src/common/util_process.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/util_process.h b/src/common/util_process.h index d38301a354..c3a63498b5 100644 --- a/src/common/util_process.h +++ b/src/common/util_process.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/common/workqueue.c b/src/common/workqueue.c index e1fb663a2a..ec6e257b4c 100644 --- a/src/common/workqueue.c +++ b/src/common/workqueue.c @@ -510,12 +510,13 @@ replyqueue_get_socket(replyqueue_t *rq) void replyqueue_process(replyqueue_t *queue) { - if (queue->alert.drain_fn(queue->alert.read_fd) < 0) { + int r = queue->alert.drain_fn(queue->alert.read_fd); + if (r < 0) { //LCOV_EXCL_START static ratelim_t warn_limit = RATELIM_INIT(7200); log_fn_ratelim(&warn_limit, LOG_WARN, LD_GENERAL, "Failure from drain_fd: %s", - tor_socket_strerror(tor_socket_errno(queue->alert.read_fd))); + tor_socket_strerror(-r)); //LCOV_EXCL_STOP } diff --git a/src/common/workqueue.h b/src/common/workqueue.h index 54276767b0..7b483eb7ac 100644 --- a/src/common/workqueue.h +++ b/src/common/workqueue.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_WORKQUEUE_H @@ -16,7 +16,7 @@ typedef struct threadpool_s threadpool_t; typedef struct workqueue_entry_s workqueue_entry_t; /** Possible return value from a work function: */ -typedef enum { +typedef enum workqueue_reply_t { WQ_RPL_REPLY = 0, /** indicates success */ WQ_RPL_ERROR = 1, /** indicates fatal error */ WQ_RPL_SHUTDOWN = 2, /** indicates thread is shutting down */ diff --git a/src/config/geoip b/src/config/geoip index 90e7f4c43e..02a4b31630 100644 --- a/src/config/geoip +++ b/src/config/geoip @@ -1,4 +1,4 @@ -# Last updated based on February 8 2017 Maxmind GeoLite2 Country +# Last updated based on May 2 2017 Maxmind GeoLite2 Country # wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz # gunzip GeoLite2-Country.mmdb.gz # python mmdb-convert.py GeoLite2-Country.mmdb @@ -39,17 +39,23 @@ 18219008,18350079,IN 18350080,18874367,CN 18874368,18907135,MY -18907136,18924031,SG +18907136,18923519,SG +18923520,18924031,HK 18924032,18924287,TW -18924288,18924799,SG +18924288,18924799,HK 18924800,18925055,TW -18925056,18926079,SG +18925056,18925567,HK +18925568,18926079,SG 18926080,18926207,TW 18926208,18926335,SG 18926336,18926463,TW 18926464,18926591,SG 18926592,18926719,TW -18926720,18939903,SG +18926720,18927615,SG +18927616,18929663,TW +18929664,18931711,KR +18931712,18933759,JP +18933760,18939903,SG 18939904,19005439,JP 19005440,19005440,CN 19005441,19136511,TW @@ -167,11 +173,17 @@ 48234496,49283071,IT 49283072,49807359,DE 49807360,50331647,SE -50331648,68182079,US +50331648,68118783,US +68118784,68119039,CA +68119040,68169727,US +68169728,68171775,CA +68171776,68182079,US 68182080,68182095,GB 68182096,68305407,US 68305408,68305919,MX -68305920,69342463,US +68305920,68978687,US +68978688,68980735,CA +68980736,69342463,US 69342464,69342719,GB 69342720,69370367,US 69370368,69370373,CA @@ -221,7 +233,8 @@ 84418560,84418815,UA 84418816,84419071,RU 84419072,84419327,UA -84419328,84420607,RU +84419328,84419583,NL +84419584,84420607,RU 84420608,84421631,GB 84421632,84421759,MX 84421760,84421887,PA @@ -298,7 +311,9 @@ 85395456,85395711,TR 85395968,85396223,LU 85396480,85397503,ES -85398528,85398783,SA +85398016,85398047,NO +85398528,85399039,SA +85399040,85399047,CH 85399552,85400063,FR 85400576,85400583,ES 85401600,85403647,IT @@ -319,8 +334,7 @@ 85733376,85737471,GB 85737472,85753855,DE 85753856,85770239,IL -85770240,85778431,ES -85778432,85786623,DE +85770240,85786623,IR 85786624,85852159,IL 85852160,86015999,AE 86016000,86018047,BG @@ -596,7 +610,9 @@ 86467208,86467211,IE 86467212,86467320,FR 86467321,86467321,FI -86467322,86467999,FR +86467322,86467535,FR +86467536,86467543,IT +86467544,86467999,FR 86468000,86468003,PL 86468004,86468055,FR 86468056,86468056,DE @@ -678,9 +694,7 @@ 86497280,86499327,NL 86499328,86503423,FR 86503424,86505471,DE -86505472,86505727,GB -86505728,86505983,US -86505984,86507519,GB +86505472,86507519,GB 86507520,86573055,ES 86573056,86638591,SA 86638592,86671359,RU @@ -702,7 +716,9 @@ 86769664,86773759,RU 86773760,86777855,GB 86777856,86779903,AZ -86779904,86786047,RU +86779904,86781183,RU +86781184,86781439,NL +86781440,86786047,RU 86786048,86788095,NO 86788096,86790143,NL 86790144,86794239,TR @@ -814,12 +830,16 @@ 87755520,87755775,KG 87755776,87756799,RU 87756800,87758847,ES -87758848,87761919,RU +87758848,87761407,RU +87761408,87761663,CZ +87761664,87761919,RU 87761920,87762431,FR 87762432,87762943,UA 87762944,87763967,KZ 87763968,87766527,RU -87766528,87818239,CZ +87766528,87769087,CZ +87769088,87777279,ES +87777280,87818239,CZ 87818240,87883775,PL 87883776,87885823,IT 87885824,87889919,RU @@ -848,11 +868,393 @@ 87957504,87957759,ES 87957760,87958527,GB 87958528,87959039,CZ -87959040,87959551,NL +87959040,87959539,NL +87959540,87959547,BE +87959548,87959551,NL 87959552,87960063,DE 87960064,87960575,GB 87960576,87962111,US -87962112,87965695,GB +87962112,87962623,GB +87962624,87963647,CZ +87963648,87963651,US +87963652,87963655,AS +87963656,87963659,AI +87963660,87963663,AG +87963664,87963667,AR +87963668,87963671,AW +87963672,87963675,BS +87963676,87963679,BB +87963680,87963683,BZ +87963684,87963687,BM +87963688,87963691,BO +87963692,87963695,VG +87963696,87963699,KY +87963700,87963703,CL +87963704,87963707,CN +87963708,87963711,CO +87963712,87963715,CK +87963716,87963719,CR +87963720,87963723,CU +87963724,87963727,DM +87963728,87963731,DO +87963732,87963735,EC +87963736,87963739,SV +87963740,87963743,FK +87963744,87963747,FJ +87963748,87963751,GD +87963752,87963755,GP +87963756,87963759,GU +87963760,87963763,GT +87963764,87963767,GY +87963768,87963771,HT +87963772,87963775,HN +87963776,87963779,JM +87963780,87963783,KI +87963784,87963787,MS +87963788,87963791,NR +87963792,87963795,NC +87963796,87963799,NI +87963800,87963803,NU +87963804,87963807,NF +87963808,87963811,KP +87963812,87963815,PW +87963816,87963819,PA +87963820,87963823,PG +87963824,87963827,PY +87963828,87963831,PE +87963832,87963835,PH +87963836,87963839,PN +87963840,87963843,PR +87963844,87963847,KN +87963848,87963851,LC +87963852,87963855,VC +87963856,87963859,WS +87963860,87963863,SB +87963864,87963867,SR +87963868,87963871,SZ +87963872,87963875,TK +87963876,87963879,TO +87963880,87963883,TT +87963884,87963887,TC +87963888,87963891,TV +87963892,87963895,UY +87963896,87963911,US +87963912,87963915,DE +87963916,87963955,US +87963956,87963959,CA +87963960,87963963,GB +87963964,87963999,US +87964000,87964003,VU +87964004,87964007,VE +87964008,87964163,US +87964164,87964167,AS +87964168,87964171,AI +87964172,87964175,AG +87964176,87964179,AR +87964180,87964183,AW +87964184,87964187,BS +87964188,87964191,BB +87964192,87964195,BZ +87964196,87964199,BM +87964200,87964203,BO +87964204,87964207,VG +87964208,87964211,KY +87964212,87964215,CL +87964216,87964219,CO +87964220,87964223,CK +87964224,87964227,CR +87964228,87964231,CU +87964232,87964235,DM +87964236,87964239,DO +87964240,87964243,EC +87964244,87964247,SV +87964248,87964251,FK +87964252,87964255,FJ +87964256,87964259,GD +87964260,87964263,GP +87964264,87964267,GT +87964268,87964271,GY +87964272,87964275,HT +87964276,87964279,HN +87964280,87964283,JM +87964284,87964287,KI +87964288,87964291,MS +87964292,87964295,NR +87964296,87964299,NC +87964300,87964303,NI +87964304,87964307,NU +87964308,87964311,NF +87964312,87964315,PA +87964316,87964319,PY +87964320,87964323,PE +87964324,87964327,PN +87964328,87964331,PR +87964332,87964335,KN +87964336,87964339,LC +87964340,87964343,PM +87964344,87964347,VC +87964348,87964351,WS +87964352,87964355,SB +87964356,87964359,SR +87964360,87964363,SZ +87964364,87964367,TK +87964368,87964371,TO +87964372,87964375,TT +87964376,87964379,TC +87964380,87964383,TV +87964384,87964387,UY +87964388,87964403,US +87964404,87964407,DE +87964408,87964447,US +87964448,87964451,CA +87964452,87964455,GB +87964456,87964491,US +87964492,87964495,VU +87964496,87964499,VE +87964500,87964671,US +87964672,87964675,CZ +87964676,87964679,AD +87964680,87964683,AO +87964684,87964687,AM +87964688,87964691,AZ +87964692,87964695,BH +87964696,87964699,BD +87964700,87964703,BY +87964704,87964707,BJ +87964708,87964711,BT +87964712,87964715,BA +87964716,87964719,BW +87964720,87964723,BN +87964724,87964727,BG +87964728,87964731,BF +87964732,87964735,BI +87964736,87964739,KH +87964740,87964743,CM +87964744,87964747,CV +87964748,87964751,CF +87964752,87964755,TD +87964756,87964759,CN +87964760,87964763,CX +87964764,87964767,CC +87964768,87964771,KM +87964772,87964775,CD +87964776,87964779,CI +87964780,87964783,CY +87964784,87964787,EG +87964788,87964791,GQ +87964792,87964795,ER +87964796,87964799,EE +87964800,87964803,ET +87964804,87964807,FO +87964808,87964811,GA +87964812,87964815,GM +87964816,87964819,GE +87964820,87964823,GH +87964824,87964827,GI +87964828,87964831,GR +87964832,87964835,GL +87964836,87964839,GU +87964840,87964843,GW +87964844,87964847,GN +87964848,87964851,IR +87964852,87964855,IQ +87964856,87964859,IE +87964860,87964863,JO +87964864,87964867,KZ +87964868,87964871,KE +87964872,87964875,KW +87964876,87964879,KG +87964880,87964883,LA +87964884,87964887,LV +87964888,87964891,LB +87964892,87964895,LS +87964896,87964899,LR +87964900,87964903,LY +87964904,87964907,LI +87964908,87964911,LT +87964912,87964915,MO +87964916,87964919,MK +87964920,87964923,MG +87964924,87964927,MW +87964928,87964931,MV +87964932,87964935,ML +87964936,87964939,MT +87964940,87964943,MR +87964944,87964947,MU +87964948,87964951,MD +87964952,87964955,MC +87964956,87964959,MN +87964960,87964963,ME +87964964,87964967,MA +87964968,87964971,MZ +87964972,87964975,MM +87964976,87964979,NA +87964980,87964983,NP +87964984,87964987,NE +87964988,87964991,NG +87964992,87964995,KP +87964996,87964999,OM +87965000,87965003,PK +87965004,87965007,PW +87965008,87965011,PS +87965012,87965015,PG +87965016,87965019,PH +87965020,87965023,QA +87965024,87965027,DJ +87965028,87965031,CG +87965032,87965035,RO +87965036,87965039,RW +87965040,87965043,SH +87965044,87965047,SM +87965048,87965051,ST +87965052,87965055,SA +87965056,87965059,SN +87965060,87965063,RS +87965064,87965067,SL +87965068,87965071,SK +87965072,87965075,SI +87965076,87965079,SO +87965080,87965083,LK +87965084,87965087,SD +87965088,87965091,SJ +87965092,87965095,SY +87965096,87965099,TJ +87965100,87965103,TZ +87965104,87965107,TH +87965108,87965111,TG +87965112,87965115,TN +87965116,87965119,TM +87965120,87965123,UG +87965124,87965127,UA +87965128,87965131,AE +87965132,87965135,UZ +87965136,87965139,VA +87965140,87965143,VN +87965144,87965147,YE +87965148,87965151,ZM +87965152,87965155,ZW +87965156,87965183,CZ +87965184,87965187,GB +87965188,87965191,AD +87965192,87965195,AO +87965196,87965199,AM +87965200,87965203,AZ +87965204,87965207,BH +87965208,87965211,BD +87965212,87965215,BY +87965216,87965219,BJ +87965220,87965223,BT +87965224,87965227,BA +87965228,87965231,BW +87965232,87965235,BN +87965236,87965239,BG +87965240,87965243,BF +87965244,87965247,BI +87965248,87965251,KH +87965252,87965255,CM +87965256,87965259,CV +87965260,87965263,CF +87965264,87965267,TD +87965268,87965271,CX +87965272,87965275,CC +87965276,87965279,KM +87965280,87965283,CD +87965284,87965287,CI +87965288,87965291,CY +87965292,87965295,EG +87965296,87965299,GQ +87965300,87965303,ER +87965304,87965307,EE +87965308,87965311,ET +87965312,87965315,FO +87965316,87965319,GA +87965320,87965323,GM +87965324,87965327,GE +87965328,87965331,GH +87965332,87965335,GI +87965336,87965339,GR +87965340,87965343,GL +87965344,87965347,GW +87965348,87965351,GN +87965352,87965355,IR +87965356,87965359,IQ +87965360,87965363,IE +87965364,87965367,JO +87965368,87965371,KZ +87965372,87965375,KE +87965376,87965379,KW +87965380,87965383,KG +87965384,87965387,LA +87965388,87965391,LV +87965392,87965395,LB +87965396,87965399,LS +87965400,87965403,LR +87965404,87965407,LY +87965408,87965411,LI +87965412,87965415,LT +87965416,87965419,MO +87965420,87965423,MK +87965424,87965427,MG +87965428,87965431,MW +87965432,87965435,MV +87965436,87965439,ML +87965440,87965443,MT +87965444,87965447,MR +87965448,87965451,MU +87965452,87965455,MD +87965456,87965459,MC +87965460,87965463,MN +87965464,87965467,ME +87965468,87965471,MA +87965472,87965475,MZ +87965476,87965479,MM +87965480,87965483,NA +87965484,87965487,NP +87965488,87965491,NE +87965492,87965495,NG +87965496,87965499,OM +87965500,87965503,PK +87965504,87965507,PS +87965508,87965511,QA +87965512,87965515,DJ +87965516,87965519,CG +87965520,87965523,RO +87965524,87965527,RW +87965528,87965531,SH +87965532,87965535,PM +87965536,87965539,SM +87965540,87965543,ST +87965544,87965547,SA +87965548,87965551,SN +87965552,87965555,RS +87965556,87965559,SL +87965560,87965563,SK +87965564,87965567,SI +87965568,87965571,SO +87965572,87965575,LK +87965576,87965579,SD +87965580,87965583,SJ +87965584,87965587,SY +87965588,87965591,TJ +87965592,87965595,TZ +87965596,87965599,TH +87965600,87965603,TG +87965604,87965607,TN +87965608,87965611,TM +87965612,87965615,UG +87965616,87965619,PT +87965620,87965623,US +87965624,87965627,UA +87965628,87965631,AE +87965632,87965635,UZ +87965636,87965639,VA +87965640,87965643,VN +87965644,87965647,YE +87965648,87965651,ZM +87965652,87965655,ZW +87965656,87965659,PT +87965660,87965663,US +87965664,87965695,GB 87965696,87967743,DE 87967744,87969791,IT 87969792,87970815,IM @@ -934,15 +1336,12 @@ 90503168,90505215,IL 90505216,90515455,RU 90515456,90516479,GB -90516480,90516735,DE +90516480,90516735,DK 90516736,90516991,RO -90516992,90517503,NL +90516992,90517503,FR 90517504,90518527,GB 90518528,90529791,RU -90529792,90533119,NL -90533120,90533375,DE -90533376,90533631,NL -90533632,90533887,GB +90529792,90533887,NL 90533888,90537983,EE 90537984,90540031,RU 90540032,90544127,GB @@ -1269,9 +1668,11 @@ 92750912,92750943,PT 92750944,92751243,FR 92751244,92751247,ES -92751248,92751711,FR -92751712,92751712,DE -92751713,92752031,FR +92751248,92751631,FR +92751632,92751647,CH +92751648,92751711,FR +92751712,92751807,DE +92751808,92752031,FR 92752032,92752063,FI 92752064,92753079,FR 92753080,92753087,ES @@ -1320,7 +1721,9 @@ 92762056,92762059,GB 92762060,92762127,FR 92762128,92762135,ES -92762136,92762383,FR +92762136,92762279,FR +92762280,92762283,GB +92762284,92762383,FR 92762384,92762391,ES 92762392,92762719,FR 92762720,92762751,PT @@ -1332,14 +1735,15 @@ 92764224,92764287,ES 92764288,92764687,FR 92764688,92764703,ES -92764704,92764911,FR +92764704,92764863,FR +92764864,92764879,ES +92764880,92764911,FR 92764912,92764927,GB 92764928,92765423,FR 92765424,92765427,GB 92765428,92766015,FR 92766016,92766047,ES -92766048,92777839,FR -92777840,92777855,FI +92766048,92777855,FR 92777856,92777983,GB 92777984,92778431,FR 92778432,92778495,ES @@ -1398,7 +1802,9 @@ 92787708,92787711,FI 92787712,92788127,FR 92788128,92788131,FI -92788132,92788479,FR +92788132,92788399,FR +92788400,92788415,FI +92788416,92788479,FR 92788480,92788495,FI 92788496,92789119,FR 92789120,92789183,ES @@ -1428,7 +1834,9 @@ 92794692,92794695,ES 92794696,92795631,FR 92795632,92795639,CZ -92795640,92796687,FR +92795640,92796575,FR +92796576,92796579,GB +92796580,92796687,FR 92796688,92796691,DE 92796692,92796879,FR 92796880,92796895,FI @@ -1439,7 +1847,9 @@ 92797356,92797359,DE 92797360,92797679,FR 92797680,92797695,FI -92797696,92798975,FR +92797696,92798591,FR +92798592,92798623,PT +92798624,92798975,FR 92798976,93323263,RU 93323264,93335551,CH 93335552,93339647,IL @@ -1495,7 +1905,9 @@ 93715968,93716479,NL 93716480,93749247,GB 93749248,93753343,IT -93753344,93765631,GB +93753344,93756415,GB +93756416,93757439,FR +93757440,93765631,GB 93765632,93774847,SE 93774848,93775871,NO 93775872,93782015,SE @@ -1547,7 +1959,9 @@ 94043136,94044159,RO 94044160,94109695,SY 94109696,94175231,SA -94175232,94176511,SE +94175232,94175487,SE +94175488,94175743,CZ +94175744,94176511,SE 94176512,94176767,US 94176768,94177535,SE 94177536,94177791,IT @@ -1564,7 +1978,9 @@ 94183424,94183935,RU 94183936,94184191,SE 94184192,94184447,RU -94184448,94187007,SE +94184448,94186239,SE +94186240,94186495,IT +94186496,94187007,SE 94187008,94187263,GB 94187264,94187775,SE 94187776,94188031,NO @@ -1775,10 +2191,18 @@ 96172800,96173055,GP 96173056,96174079,MF 96174080,96206847,HU -96206848,96247807,RU +96206848,96245759,RU +96245760,96246783,KZ +96246784,96247807,RU 96247808,96248831,NL -96248832,96258047,RU -96258048,96260095,NL +96248832,96251903,RU +96251904,96252159,DE +96252160,96252927,NL +96252928,96259071,RU +96259072,96259327,NL +96259328,96259583,RO +96259584,96259839,US +96259840,96260095,NL 96260096,96262143,RU 96262144,96262399,NL 96262400,96264191,RU @@ -1809,12 +2233,15 @@ 96325632,96327679,RU 96327680,96327935,NL 96327936,96328191,RO -96328192,96329727,RU +96328192,96328447,US +96328448,96328703,UA +96328704,96329727,RU 96329728,96333823,GB 96333824,96335871,RU 96335872,96336895,NL -96336896,96337151,US -96337152,96337919,NL +96336896,96337151,CZ +96337152,96337663,NL +96337664,96337919,US 96337920,96403455,IR 96403456,96468991,AZ 96468992,96731135,AE @@ -1859,9 +2286,7 @@ 96757884,96757887,ES 96757888,96758247,FR 96758248,96758251,DE -96758252,96759311,FR -96759312,96759327,ES -96759328,96759735,FR +96758252,96759735,FR 96759736,96759739,ES 96759740,96760099,FR 96760100,96760103,IE @@ -1885,7 +2310,11 @@ 96764384,96764399,FI 96764400,96766063,FR 96766064,96766079,ES -96766080,96766911,FR +96766080,96766259,FR +96766260,96766263,ES +96766264,96766267,FR +96766268,96766271,ES +96766272,96766911,FR 96766912,96766915,GB 96766916,96767031,FR 96767032,96767035,GB @@ -2044,7 +2473,9 @@ 97437696,97439743,AT 97439744,97444863,NL 97444864,97445887,PT -97445888,97447935,RS +97445888,97446911,RS +97446912,97447167,XK +97447168,97447935,RS 97447936,97452031,PL 97452032,97517567,UA 97517568,98566143,IR @@ -2190,7 +2621,11 @@ 100532480,100532735,US 100532736,100548872,RO 100548873,100548873,TR -100548874,100554999,RO +100548874,100552863,RO +100552864,100552871,AT +100552872,100554447,RO +100554448,100554463,DE +100554464,100554999,RO 100555000,100555000,DE 100555001,100555007,RO 100555008,100555263,DE @@ -2227,7 +2662,9 @@ 100559872,100559935,US 100559936,100560127,RO 100560128,100560383,US -100560384,100560639,RO +100560384,100560455,RO +100560456,100560463,US +100560464,100560639,RO 100560640,100560643,US 100560644,100560727,RO 100560728,100560751,US @@ -2267,18 +2704,37 @@ 100663296,121195295,US 121195296,121195327,IT 121195328,134221823,US -134221824,134221824,DE -134221825,134222335,US -134222336,134222336,DE -134222337,134223871,US -134223872,134223872,GB -134223873,134224383,US -134224384,134224384,GB -134224385,134247423,US +134221824,134222079,DE +134222080,134222335,US +134222336,134222379,DE +134222380,134222380,US +134222381,134222404,DE +134222405,134222405,US +134222406,134222452,DE +134222453,134222453,US +134222454,134222476,DE +134222477,134222477,US +134222478,134222523,DE +134222524,134222524,US +134222525,134222526,DE +134222527,134222527,US +134222528,134222538,DE +134222539,134222539,US +134222540,134222556,DE +134222557,134222557,US +134222558,134222591,DE +134222592,134223871,US +134223872,134224127,GB +134224128,134224383,US +134224384,134224639,GB +134224640,134227967,US +134227968,134228223,SG +134228224,134228479,JP +134228480,134247423,US 134247424,134247424,DE -134247425,134445823,US -134445824,134445887,GU -134445888,134738943,US +134247425,134443007,US +134443008,134447103,GU +134447104,134738943,US 134738944,134739199,CA 134739200,135192575,US 135192576,135200767,MX @@ -2302,13 +2758,17 @@ 135776256,135778303,GU 135778304,135792639,US 135792640,135794687,CA -135794688,135945727,US +135794688,135925759,US +135925760,135926783,VI +135926784,135945727,US 135945728,135945983,CA 135945984,136054015,US 136054016,136054271,GB 136054272,136175615,US 136175616,136175871,CA -136175872,136237055,US +136175872,136176383,US +136176384,136176639,CA +136176640,136237055,US 136237056,136239103,CA 136239104,136404991,US 136404992,136407039,CA @@ -2349,10 +2809,16 @@ 214698304,214698311,VI 214698312,214777855,US 214777856,214782975,PR -214782976,219187465,US +214782976,214787583,US +214787584,214787711,PR +214787712,214787839,US +214787840,214788095,PR +214788096,219187465,US 219187468,219249919,US 219249920,219250175,GB -219250176,221642751,US +219250176,219512063,US +219512064,219512319,GB +219512320,221642751,US 221642752,221773823,AU 221773824,222494719,US 222494720,222527487,SG @@ -2440,11 +2906,26 @@ 225080896,225081855,US 225081856,225082367,AU 225082368,225082879,GB -225082880,225443839,US +225082880,225084415,US +225084416,225085439,FR +225085440,225085951,NL +225085952,225086463,FR +225086464,225086975,NL +225086976,225087487,FR +225087488,225088511,US +225088512,225089023,SG +225089024,225089535,IE +225089536,225443839,US 225443840,225705983,JP 225705984,226230271,US 226230272,226295807,KR -226295808,234881023,US +226295808,226361343,US +226361344,226492415,IN +226492416,231866367,US +231866368,231997439,AU +231997440,233046015,US +233046016,233177087,SG +233177088,234881023,US 234881024,234883071,CN 234883072,234884095,JP 234884096,234885119,CN @@ -2466,7 +2947,7 @@ 234950656,234951679,AU 234951680,234952703,HK 234952704,234953727,CN -234953728,234954751,SG +234953728,234954751,US 234954752,234958591,NZ 234958592,234958847,AU 234958848,234971135,NZ @@ -2551,7 +3032,8 @@ 248512512,249561087,CN 249561088,251658239,VN 251658240,257532415,US -257532416,257532671,AU +257532416,257532423,AU +257532432,257532671,AU 257532672,257534463,US 257534464,257534719,IN 257534720,257597951,US @@ -2640,8 +3122,7 @@ 289787904,289789951,DE 289789952,289791999,US 289792000,289794047,AE -289794048,289795071,US -289795072,289796095,GB +289794048,289796095,GB 289796096,289798143,TR 289798144,289800191,SA 289800192,289948927,US @@ -2770,7 +3251,8 @@ 301989024,301989031,MO 301989032,301989119,US 301989120,301989375,AU -301989376,323243895,US +301989376,301989631,SG +301989632,323243895,US 323243896,323243903,FR 323243904,332132119,US 332132120,332132127,IL @@ -2815,19 +3297,11 @@ 385939968,385940479,NL 385940480,385942527,US 385942528,385943551,NL -385943552,385950719,US -385950720,385951743,NL -385951744,385957887,US +385943552,385957887,US 385957888,385961983,NL -385961984,386002431,US -386002432,386002943,NL -386002944,386003199,US +385961984,386003199,US 386003200,386003967,NL -386003968,386006015,US -386006016,386007039,NL -386007040,386010623,US -386010624,386011135,NL -386011136,386012159,US +386003968,386012159,US 386012160,386012671,NL 386012672,386013183,US 386013184,386013695,NL @@ -2849,13 +3323,9 @@ 386088960,386089983,NL 386089984,386095615,US 386095616,386096127,NL -386096128,386100735,US -386100736,386101247,NL -386101248,386109439,US +386096128,386109439,US 386109440,386113535,NL -386113536,386125823,US -386125824,386134015,NL -386134016,386191359,US +386113536,386191359,US 386191360,386195455,NL 386195456,386201599,US 386201600,386203135,NL @@ -2870,20 +3340,14 @@ 386245632,386247679,US 386247680,386248703,NL 386248704,386297855,US -386297856,386301951,NL +386297856,386298879,NL +386298880,386300415,US +386300416,386301951,NL 386301952,386383871,US 386383872,386387967,NL -386387968,386398207,US -386398208,386398719,NL -386398720,386398975,US -386398976,386399231,NL -386399232,386400255,US +386387968,386400255,US 386400256,386404351,NL -386404352,386408447,US -386408448,386412543,NL -386412544,386453503,US -386453504,386457599,NL -386457600,386465791,US +386404352,386465791,US 386465792,386469887,NL 386469888,386498559,US 386498560,386502655,NL @@ -2892,26 +3356,22 @@ 386523136,386593279,US 386593280,386594815,NL 386594816,386595071,US -386595072,386596095,NL -386596096,386613247,US -386613248,386617343,NL -386617344,386656255,US +386595072,386595327,NL +386595328,386595583,US +386595584,386596095,NL +386596096,386656255,US 386656256,386656511,NL 386656512,386662399,US -386662400,386670591,NL -386670592,386682879,US +386662400,386666495,NL +386666496,386682879,US 386682880,386691071,NL -386691072,386711551,US -386711552,386715647,NL -386715648,386736127,US -386736128,386744319,NL -386744320,386774527,US +386691072,386736127,US +386736128,386740223,NL +386740224,386774527,US 386774528,386775039,NL 386775040,386783231,US 386783232,386783743,NL -386783744,386784255,US -386784256,386785279,NL -386785280,386789375,US +386783744,386789375,US 386789376,386797567,NL 386797568,386816511,US 386816512,386818047,NL @@ -2919,22 +3379,16 @@ 386826752,386827263,NL 386827264,386828287,US 386828288,386829311,NL -386829312,386842623,US -386842624,386846719,NL -386846720,386862079,US +386829312,386862079,US 386862080,386862335,JP 386862336,386862591,KR 386862592,386868735,US 386868736,386868991,NL 386868992,386875391,US 386875392,386879487,NL -386879488,386887679,US -386887680,386891775,NL -386891776,386892799,US +386879488,386892799,US 386892800,386893311,NL -386893312,386904063,US -386904064,386905087,NL -386905088,386923519,US +386893312,386923519,US 386923520,386924543,NL 386924544,387055615,CA 387055616,387121151,PR @@ -2943,11 +3397,11 @@ 387833856,387975167,US 387975168,387976191,NL 387976192,387976703,US -387976704,387978751,NL -387978752,387979263,US -387979264,387980799,NL -387980800,387985407,US -387985408,387996159,NL +387976704,387977727,NL +387977728,387979263,US +387979264,387980287,NL +387980288,387994623,US +387994624,387996159,NL 387996160,387997695,US 387997696,388005887,NL 388005888,388029439,US @@ -2972,27 +3426,25 @@ 388206592,388207103,NL 388207104,388207871,US 388207872,388208127,NL -388208128,388222975,US -388222976,388227071,NL -388227072,388272127,US +388208128,388223999,US +388224000,388225023,NL +388225024,388272127,US 388272128,388284415,NL 388284416,388288511,US 388288512,388293631,NL 388293632,388294143,US -388294144,388300799,NL -388300800,388308991,US +388294144,388296703,NL +388296704,388308991,US 388308992,388317183,NL 388317184,388325375,US 388325376,388329471,NL 388329472,388341759,US 388341760,388345855,NL -388345856,388354047,US -388354048,388358143,NL -388358144,388366335,US +388345856,388366335,US 388366336,388392447,NL 388392448,388397055,US -388397056,388399103,NL -388399104,388419583,US +388397056,388398079,NL +388398080,388419583,US 388419584,388423679,NL 388423680,388440063,US 388440064,388444159,NL @@ -3004,11 +3456,7 @@ 388481024,388485119,NL 388485120,388493311,US 388493312,388501503,NL -388501504,388513791,US -388513792,388514915,NL -388514916,388514916,US -388514917,388517887,NL -388517888,388526079,US +388501504,388526079,US 388526080,388530175,NL 388530176,388538367,US 388538368,388542463,NL @@ -3032,17 +3480,15 @@ 388788224,388792319,NL 388792320,388812799,US 388812800,388816895,NL -388816896,388842239,US -388842240,388842495,NL -388842496,388843519,US +388816896,388843519,US 388843520,388844543,NL -388844544,388844799,US -388844800,388845055,NL -388845056,388849663,US +388844544,388849663,US 388849664,388853759,NL 388853760,388857855,US -388857856,388878335,NL -388878336,388885503,US +388857856,388863999,NL +388864000,388866047,US +388866048,388870143,NL +388870144,388885503,US 388885504,388890623,NL 388890624,388893695,US 388893696,388894719,NL @@ -3064,13 +3510,11 @@ 389044224,389045247,NL 389045248,389060607,US 389060608,389061631,NL -389061632,389070847,US -389070848,389078015,NL +389061632,389074943,US +389074944,389078015,NL 389078016,389079039,US 389079040,389083135,NL -389083136,389090303,US -389090304,389091327,NL -389091328,389102079,US +389083136,389102079,US 389102080,389102591,NL 389102592,389136383,US 389136384,389140479,NL @@ -3082,57 +3526,51 @@ 389185536,389201919,NL 389201920,389242879,US 389242880,389251071,NL -389251072,389259263,US -389259264,389267455,NL -389267456,389271551,US -389271552,389292031,NL +389251072,389273599,US +389273600,389283839,NL +389283840,389287935,US +389287936,389292031,NL 389292032,389296127,US 389296128,389300223,NL 389300224,389319167,US 389319168,389319679,NL 389319680,389320191,US 389320192,389320447,NL -389320448,389328895,US -389328896,389341183,NL +389320448,389332991,US +389332992,389341183,NL 389341184,389349375,US 389349376,389365759,NL -389365760,389390335,US -389390336,389398527,NL -389398528,389402623,US -389402624,389419007,NL +389365760,389410815,US +389410816,389419007,NL 389419008,389435391,US -389435392,389455871,NL -389455872,389480447,US -389480448,389484543,NL -389484544,389495295,US +389435392,389443583,NL +389443584,389447679,US +389447680,389455871,NL +389455872,389495295,US 389495296,389495807,NL 389495808,389509119,US 389509120,389513215,NL 389513216,389515263,US 389515264,389521407,NL -389521408,389537791,US -389537792,389541887,NL -389541888,389554175,US +389521408,389554175,US 389554176,389562367,NL -389562368,389611519,US -389611520,389619711,NL +389562368,389615615,US +389615616,389619711,NL 389619712,389628415,US 389628416,389628927,NL 389628928,389631999,US 389632000,389641215,NL -389641216,389701119,US -389701120,389701631,NL -389701632,389730303,US +389641216,389730303,US 389730304,389734399,NL -389734400,389754879,US -389754880,389765631,NL +389734400,389764095,US +389764096,389765631,NL 389765632,389767167,US 389767168,389775359,NL 389775360,389812223,US 389812224,389816319,NL 389816320,389825791,US -389825792,389826559,NL -389826560,389852159,US +389825792,389826047,NL +389826048,389852159,US 389852160,389853183,NL 389853184,389857279,US 389857280,389873663,NL @@ -3142,17 +3580,13 @@ 389924864,389925375,NL 389925376,389926911,US 389926912,389936127,NL -389936128,389937151,US -389937152,389937663,NL -389937664,389937919,US -389937920,389938175,NL -389938176,389938687,US -389938688,389940223,NL +389936128,389937407,US +389937408,389937663,NL +389937664,389939711,US +389939712,389940223,NL 389940224,389941503,US 389941504,389941759,NL -389941760,389952767,US -389952768,389953023,NL -389953024,389954815,US +389941760,389954815,US 389954816,389955071,NL 389955072,389964287,US 389964288,389966335,NL @@ -3169,12 +3603,10 @@ 389992448,389996543,US 389996544,389996799,NL 389996800,389996800,SG -389996801,389999871,US -389999872,390000127,NL -390000128,390011903,US -390011904,390012927,NL -390012928,390021119,US -390021120,390030847,NL +389996801,390026751,US +390026752,390029311,NL +390029312,390029823,US +390029824,390030847,NL 390030848,390033407,US 390033408,390043135,NL 390043136,390063615,US @@ -3195,9 +3627,7 @@ 390143232,390148095,NL 390148096,390165503,US 390165504,390166527,NL -390166528,390181887,US -390181888,390182143,NL -390182144,390184959,US +390166528,390184959,US 390184960,390193151,NL 390193152,390205439,US 390205440,390209535,NL @@ -3212,8 +3642,8 @@ 390279168,390284799,US 390284800,390285311,NL 390285312,390286847,US -390286848,390295551,NL -390295552,390299647,US +390286848,390291455,NL +390291456,390299647,US 390299648,390304767,NL 390304768,390332159,US 390332160,390332415,GB @@ -3221,9 +3651,7 @@ 390731776,390732031,NL 390732032,390732287,US 390732288,390732799,NL -390732800,390733823,US -390733824,390737919,NL -390737920,390746111,US +390732800,390746111,US 390746112,390758399,NL 390758400,390767615,US 390767616,390768639,NL @@ -3233,15 +3661,9 @@ 390972928,390973951,NL 390973952,390975487,US 390975488,390976511,NL -390976512,390980607,US -390980608,390981631,NL -390981632,390985727,US -390985728,390987775,NL -390987776,390995967,US +390976512,390995967,US 390995968,391020543,NL -391020544,391081983,US -391081984,391086079,NL -391086080,391110655,US +391020544,391110655,US 391110656,391110911,IL 391110912,391111167,GB 391111168,391111935,US @@ -3250,7 +3672,11 @@ 391112704,391113471,NL 391113472,391116543,US 391116544,391116799,NL -391116800,391368703,US +391116800,391331839,US +391331840,391333887,NL +391333888,391344127,US +391344128,391348223,NL +391348224,391368703,US 391368704,391372799,CA 391372800,391376895,US 391376896,391380991,CA @@ -3262,11 +3688,9 @@ 391937536,391937791,CA 391937792,391938047,IE 391938048,391946239,CA -391946240,391960639,US -391960640,391960647,RO -391960648,391961711,US -391961712,391961719,RO -391961720,392044351,US +391946240,391960335,US +391960336,391960351,GB +391960352,392044351,US 392044352,392044359,CA 392044360,392054271,US 392054272,392054527,CA @@ -3274,7 +3698,11 @@ 392055944,392055951,GB 392055952,392073319,US 392073320,392073327,CA -392073328,392114895,US +392073328,392103471,US +392103472,392103479,GB +392103480,392112815,US +392112816,392112823,GB +392112824,392114895,US 392114896,392114903,TH 392114904,392245247,US 392245248,392249343,SG @@ -3363,11 +3791,9 @@ 392675040,392675071,SG 392675072,392684479,US 392684480,392684511,IE -392684512,392684527,NL -392684528,392684543,US +392684512,392684543,NL 392684544,392684575,IE -392684576,392684591,NL -392684592,392684607,US +392684576,392684607,NL 392684608,392684639,IE 392684640,392684655,NL 392684656,392684671,US @@ -3393,8 +3819,7 @@ 392685088,392685103,NL 392685104,392685119,US 392685120,392685151,IE -392685152,392685167,NL -392685168,392686607,US +392685152,392686607,US 392686608,392686623,AT 392686624,392686639,FI 392686640,392686655,IE @@ -3495,7 +3920,8 @@ 392689888,392689903,AT 392689904,392689919,IE 392689920,392689983,US -392689984,392690015,SG +392689984,392689999,SG +392690000,392690015,HK 392690016,392690031,KR 392690032,392690047,MY 392690048,392690079,US @@ -3524,26 +3950,70 @@ 392691440,392691455,AT 392691456,392765439,US 392765440,392765695,GB -392765696,393166847,US +392765696,392849663,US +392849664,392849919,NL +392849920,392850687,US +392850688,392850943,NL +392850944,392851455,US +392851456,392852479,NL +392852480,392852735,US +392852736,392852991,NL +392852992,393007103,US +393007104,393008639,NL +393008640,393008895,US +393008896,393011199,NL +393011200,393019391,US +393019392,393042015,NL +393042016,393042023,US +393042024,393042087,NL +393042088,393042095,US +393042096,393042143,NL +393042144,393042151,US +393042152,393042719,NL +393042720,393042727,US +393042728,393084927,NL +393084928,393150463,US +393150464,393152511,NL +393152512,393154559,US +393154560,393158655,NL +393158656,393166847,US 393166848,393170943,CA 393170944,394264575,US 394264576,394264831,CA 394270720,394271231,NL 394296320,394296831,NL 394297344,394297599,US -394330112,394854399,US +394330112,394788863,US +394821632,394821887,US 394854400,394854655,CA -394919936,395051007,US +394887168,394887423,US +394919936,394920191,US +394952704,394952959,CA +394985472,394985727,US +395018240,395018495,CA 395051008,395051263,CA +395083776,395084031,US 395116544,395116799,US +395149312,395149567,CA 395182080,395182335,CA -395247616,395247871,US -395313152,395706367,US -395706368,395837439,CA -395837440,395968511,US -395968512,395969023,CA +395214848,395215103,US +395247616,395313407,US +395345920,395346175,CA +395378688,395576319,US +395608064,395608319,CA +395640832,395641087,US +395673600,395673855,CA +395706368,395706623,CA +395739136,395739391,US +395771904,395837439,CA +395837440,395903231,US +395935744,395935999,CA +395968512,396034047,CA 396034048,396034303,US -396099584,396754943,US +396066816,396067071,CA +396099584,396230911,US +396263424,396263679,CA +396296192,396754943,US 396754944,396755199,CA 396820480,396820735,US 396886016,397410303,US @@ -3566,15 +4036,9 @@ 398532608,398536703,NL 398536704,398566911,US 398566912,398567423,NL -398567424,398617599,US -398617600,398618623,NL -398618624,398635007,US -398635008,398644223,NL -398644224,398644735,US +398567424,398644735,US 398644736,398645247,NL -398645248,398647295,US -398647296,398656511,NL -398656512,398657535,US +398645248,398657535,US 398657536,398658559,NL 398658560,398667775,US 398667776,398675967,NL @@ -3606,9 +4070,7 @@ 399032320,399036415,NL 399036416,399055871,US 399055872,399056383,NL -399056384,399075839,US -399075840,399076863,NL -399076864,399087615,US +399056384,399087615,US 399087616,399088639,NL 399088640,399089663,US 399089664,399114239,NL @@ -3617,8 +4079,8 @@ 399126016,399143935,US 399143936,399145471,NL 399145472,399147007,US -399147008,399159295,NL -399159296,399175679,US +399147008,399155199,NL +399155200,399175679,US 399175680,399179775,NL 399179776,399280127,US 399280128,399280639,NL @@ -3626,16 +4088,16 @@ 399280896,399281151,NL 399281152,399331327,US 399331328,399339519,NL -399339520,399342335,US -399342336,399342591,NL -399342592,399353855,US +399339520,399353855,US 399353856,399354879,NL 399354880,399355391,US 399355392,399359999,NL -399360000,399365119,US -399365120,399366143,NL -399366144,399367167,US -399367168,399378943,NL +399360000,399367167,US +399367168,399367679,NL +399367680,399368191,US +399368192,399372287,NL +399372288,399376383,US +399376384,399378943,NL 399378944,399380479,US 399380480,399388671,NL 399388672,399396863,US @@ -3648,45 +4110,39 @@ 399486976,399491071,NL 399491072,399495167,US 399495168,399503359,NL -399503360,399591935,US -399591936,399593471,NL -399593472,399601663,US -399601664,399619583,NL -399619584,399621631,US -399621632,399639551,NL -399639552,399688191,US +399503360,399622143,US +399622144,399630335,NL +399630336,399688191,US 399688192,399688703,NL 399688704,399734527,US 399734528,399735807,NL 399735808,399738879,US -399738880,399739647,NL +399738880,399739135,NL +399739136,399739391,US +399739392,399739647,NL 399739648,399740927,US 399740928,399749119,NL 399749120,399797247,US 399797248,399797759,NL -399797760,399818751,US -399818752,399822847,NL -399822848,399870975,US +399797760,399870975,US 399870976,399871999,NL 399872000,399908863,US 399908864,399919615,NL 399919616,399921151,US -399921152,399958015,NL +399921152,399949823,NL +399949824,399953919,US +399953920,399958015,NL 399958016,399969279,US 399969280,399969535,NL 399969536,399970303,US 399970304,399980031,NL 399980032,399981567,US 399981568,399982079,NL -399982080,399990783,US -399990784,399991295,NL -399991296,399998975,US +399982080,399998975,US 399998976,399999487,NL 399999488,400021247,US 400021248,400021503,NL -400021504,400033279,US -400033280,400033791,NL -400033792,400034815,US +400021504,400034815,US 400034816,400035327,NL 400035328,400047103,US 400047104,400047615,NL @@ -3695,8 +4151,8 @@ 400064512,400083455,US 400083456,400084991,NL 400084992,400093183,US -400093184,400101375,NL -400101376,400111103,US +400093184,400097279,NL +400097280,400111103,US 400111104,400111615,NL 400111616,400112639,US 400112640,400113663,NL @@ -3726,18 +4182,18 @@ 400263168,400263679,NL 400263680,400264703,US 400264704,400265215,NL -400265216,400270847,US -400270848,400271359,NL -400271360,400283647,US +400265216,400283647,US 400283648,400284671,NL 400284672,400293887,US 400293888,400302079,NL 400302080,400400383,US 400400384,400430079,NL -400430080,400431103,US -400431104,400442367,NL +400430080,400432639,US +400432640,400442367,NL 400442368,400482303,US -400482304,400527359,NL +400482304,400486399,NL +400486400,400494591,US +400494592,400527359,NL 400527360,400543743,US 400543744,400551935,NL 400551936,400623615,US @@ -3845,7 +4301,11 @@ 401387008,401387263,RU 401387264,401400871,US 401400872,401400879,NO -401400880,401547263,US +401400880,401419775,US +401419776,401420031,CA +401420032,401420287,US +401420288,401420543,CA +401420544,401547263,US 401547264,401555455,CA 401555456,402096639,US 402096640,402096895,FR @@ -4082,9 +4542,7 @@ 412958720,413007871,CA 413007872,413908991,US 413908992,413925375,PR -413925376,414503135,US -414503136,414503167,CA -414503168,415760383,US +413925376,415760383,US 415760384,416022527,CA 416022528,416059391,US 416059392,416063487,CA @@ -4113,7 +4571,7 @@ 417775616,417796095,CA 417796096,417800191,US 417800192,417808383,BS -417808384,417816575,CA +417808384,417820671,CA 417820672,417857535,US 417857536,417923071,AR 417923072,418060287,US @@ -4175,7 +4633,9 @@ 455245824,455258111,JP 455258112,455258623,SG 455258624,455258688,KH -455258689,455260671,SG +455258689,455260416,SG +455260417,455260430,KH +455260431,455260671,SG 455260672,455260674,KH 455260675,455260927,SG 455260928,455260960,KH @@ -4194,7 +4654,7 @@ 456265728,456269823,ID 456269824,456271871,HK 456271872,456273919,CN -456273920,456278015,SG +456273920,456278015,HK 456278016,456286207,AU 456286208,456294399,JP 456294400,456327167,CN @@ -4237,8 +4697,8 @@ 459541504,459542527,IN 459542528,459543295,HK 459543296,459543551,TW -459543552,459543807,MO -459543808,459544575,HK +459543552,459544063,MO +459544064,459544575,HK 459544576,459545599,IN 459545600,459547647,JP 459547648,459548159,AU @@ -4356,7 +4816,9 @@ 461012992,461045759,KR 461045760,461047807,ID 461047808,461049855,JP -461049856,461050879,TH +461049856,461050111,TH +461050112,461050367,SG +461050368,461050879,TH 461050880,461051903,NZ 461051904,461054975,AU 461054976,461055999,HK @@ -4383,7 +4845,9 @@ 461111296,461127679,IN 461127680,461131775,PH 461131776,461135871,ID -461135872,461144063,AU +461135872,461143329,AU +461143330,461143331,US +461143332,461144063,AU 461144064,461209599,KR 461209600,461225983,SG 461225984,461227007,WF @@ -4469,7 +4933,8 @@ 520355840,520421375,ES 520421376,520486911,RO 520486912,520488959,NL -520488960,520489471,UA +520488960,520489215,UA +520489216,520489471,CH 520489472,520489727,EG 520489728,520489983,GR 520489984,520490020,RU @@ -4559,7 +5024,8 @@ 520882176,520884223,IT 520884224,520888319,MK 520888320,520896511,DE -520896512,520898559,BE +520896512,520898303,BE +520898304,520898559,US 520900608,520902655,GB 520902656,520902784,NL 520902785,520912895,GB @@ -4742,7 +5208,9 @@ 521793536,521795583,RU 521795584,521797631,PL 521797632,521928703,IT -521928704,521945087,RU +521928704,521929087,RU +521929088,521929151,UA +521929152,521945087,RU 521945088,521953279,GB 521953280,521961471,RU 521961472,521969663,CZ @@ -4839,7 +5307,7 @@ 523024896,523025407,DE 523025408,523025663,UA 523025664,523025919,CH -523025920,523026175,BG +523025920,523026175,UA 523026176,523026431,GB 523026432,523030527,TR 523030528,523034623,FR @@ -4853,9 +5321,7 @@ 523190272,523192319,FI 523192320,523194367,ES 523194368,523196415,DE -523196416,523197183,AE -523197184,523197695,DE -523197696,523198463,AE +523196416,523198463,AE 523198464,523202559,CZ 523202560,523223039,RU 523223040,523225087,AM @@ -4972,11 +5438,12 @@ 529800704,529800959,CZ 529800960,529806079,RU 529806080,529809407,UA -529809408,529817599,RU -529817600,529818623,CZ +529809408,529817855,RU +529817856,529818623,CZ 529818624,529826303,RU 529826304,529826815,CZ -529826816,529829887,RU +529826816,529828863,RU +529828864,529829887,KZ 529829888,529830911,UZ 529830912,529831935,RU 529831936,529833983,SY @@ -4984,9 +5451,9 @@ 529838080,529842175,UA 529842176,529843199,ES 529843200,529843711,RU -529843712,529845503,CZ -529845504,529845759,UA -529845760,529846271,CZ +529843712,529844735,CZ +529844736,529845503,RU +529845504,529846271,UA 529846272,529847295,UZ 529847296,529848319,GB 529848320,529848575,NL @@ -5087,8 +5554,8 @@ 531428200,531428263,GB 531428264,531428271,IT 531428272,531428279,GB -531428280,531428295,IT -531428296,531428351,GB +531428280,531428287,IT +531428288,531428351,GB 531428352,531428359,IT 531428360,531428439,GB 531428440,531428447,IT @@ -5139,8 +5606,7 @@ 532209664,532210687,DE 532210688,532212223,RU 532212224,532212479,ME -532212480,532212735,NL -532212736,532213759,RU +532212480,532213759,RU 532213760,532214015,GB 532214016,532221951,RU 532221952,532223999,IT @@ -5177,7 +5643,9 @@ 532344320,532344371,FR 532344372,532344372,GB 532344373,532344575,FR -532344576,532347391,GB +532344576,532346367,GB +532346368,532346623,NL +532346624,532347391,GB 532347392,532347903,DE 532347904,532348927,GB 532348928,532365311,IE @@ -5198,7 +5666,7 @@ 532368640,532370431,DE 532370432,532371455,FI 532371456,532372479,DE -532372480,532372735,LU +532372480,532372735,NL 532372736,532372767,GB 532372768,532372783,CA 532372784,532372799,BR @@ -5234,8 +5702,8 @@ 532738048,532740095,GB 532740096,532742143,KG 532742144,532746239,GB -532746240,532750335,IT -532750336,532750847,SM +532746240,532750591,IT +532750592,532750847,SM 532750848,532752383,IT 532752384,532754431,BE 532754432,532756479,FR @@ -5365,7 +5833,7 @@ 534157312,534157567,TR 534157568,534157823,DE 534157824,534158079,IR -534158080,534158591,DE +534158080,534158591,ES 534158592,534158847,NL 534158848,534161407,DE 534161408,534163455,IR @@ -5378,7 +5846,9 @@ 534181888,534183935,IR 534183936,534249471,AE 534249472,534253567,GB -534253568,534257663,FR +534253568,534254607,FR +534254608,534254623,US +534254624,534257663,FR 534257664,534259711,SE 534259712,534261759,CH 534261760,534263807,GB @@ -5397,7 +5867,9 @@ 534347776,534348031,US 534348032,534348287,GB 534348288,534348543,US -534348544,534355967,GB +534348544,534349071,GB +534349072,534349079,US +534349080,534355967,GB 534355968,534364159,GR 534364160,534366207,FI 534366208,534368255,IT @@ -5415,7 +5887,9 @@ 534513216,534513279,VG 534513280,534513407,NL 534513408,534513663,SE -534513664,534515455,US +534513664,534514687,US +534514688,534515199,DE +534515200,534515455,US 534515456,534515711,SE 534515712,534515967,GB 534515968,534516735,US @@ -5468,8 +5942,7 @@ 534663168,534675455,ES 534675456,534691839,GB 534691840,534693887,FR -534693888,534695935,NL -534695936,534700031,GB +534693888,534700031,GB 534700032,534708223,JO 534708224,534740991,TR 534740992,534749183,BA @@ -5536,9 +6009,9 @@ 540825348,540825348,CA 540825349,540826383,US 540826384,540826399,CA -540826400,540832575,US -540832576,540832591,CA -540832592,543690751,US +540826400,540831743,US +540831744,540833791,CA +540833792,543690751,US 543690752,543691007,AR 543691008,543691263,US 543691264,543691775,BR @@ -5555,7 +6028,9 @@ 597426176,597688319,DE 597688320,598736895,US 598736896,598867967,GB -598867968,603979775,US +598867968,599130111,US +599130112,599261183,CA +599261184,603979775,US 603979776,603980799,CN 603980800,603981823,NP 603981824,604110847,CN @@ -5589,7 +6064,6 @@ 620703744,620704767,NZ 620704768,620705791,BD 620705792,620706815,HK -620706816,620707839,US 620707840,620708863,IN 620708864,620709887,HK 620709888,620711935,AU @@ -5639,8 +6113,7 @@ 620777472,620781567,NL 620781568,620783615,GB 620783616,620785663,ES -620785664,620785919,DE -620785920,620786687,US +620785664,620786687,DE 620786688,620787199,IE 620787200,620787711,DE 620787712,620789503,RU @@ -5715,11 +6188,13 @@ 621427712,621427967,GB 621427968,621428735,NL 621428736,621429759,IR -621429760,621430527,DE +621429760,621430271,DE +621430272,621430527,ES 621430528,621430783,GB 621430784,621432831,ES 621432832,621436927,IT -621436928,621440255,DE +621436928,621439999,DE +621440000,621440255,ES 621440256,621440511,IR 621440512,621442047,DE 621442048,621442303,ES @@ -5820,12 +6295,9 @@ 622510080,622512127,PL 622512128,622514175,DE 622514176,622518271,NO -622518272,622518783,GB -622518784,622519281,NL -622519282,622519282,GB -622519283,622519295,NL +622518272,622519295,GB 622519296,622519551,FR -622519552,622520319,NL +622519552,622520319,GB 622520320,622522367,RU 622522368,622524415,FR 622524416,622526463,ES @@ -5931,7 +6403,7 @@ 623822848,623824895,GB 623824896,623826943,CZ 623826944,623827967,UA -623827968,623828991,MD +623827968,623828991,BG 623828992,623837183,UA 623837184,623902719,PL 623902720,623919103,CZ @@ -5986,7 +6458,9 @@ 624640952,624640959,PT 624640960,624641187,FR 624641188,624641191,ES -624641192,624641855,FR +624641192,624641535,FR +624641536,624641551,IE +624641552,624641855,FR 624641856,624641887,GB 624641888,624641983,FR 624641984,624642015,ES @@ -6008,9 +6482,7 @@ 624643244,624643247,ES 624643248,624643423,FR 624643424,624643459,ES -624643460,624643999,FR -624644000,624644015,GB -624644016,624644031,FR +624643460,624644031,FR 624644032,624644063,FI 624644064,624644095,ES 624644096,624644115,FR @@ -6160,7 +6632,11 @@ 624665612,624665615,ES 624665616,624665663,FR 624665664,624665695,ES -624665696,624666167,FR +624665696,624665903,FR +624665904,624665919,FI +624665920,624665999,FR +624666000,624666015,GB +624666016,624666167,FR 624666168,624666175,GB 624666176,624666219,FR 624666220,624666223,DE @@ -6302,8 +6778,8 @@ 624680800,624680895,FR 624680896,624680927,ES 624680928,624681023,FR -624681024,624681071,ES -624681072,624681083,FR +624681024,624681055,ES +624681056,624681083,FR 624681084,624681087,ES 624681088,624681535,FR 624681536,624681599,ES @@ -6386,9 +6862,7 @@ 624687784,624687791,PT 624687792,624687827,FR 624687828,624687831,ES -624687832,624687903,FR -624687904,624687919,ES -624687920,624687923,FR +624687832,624687923,FR 624687924,624687927,ES 624687928,624688007,FR 624688008,624688015,ES @@ -6482,7 +6956,8 @@ 625519104,625520135,NL 625520136,625520447,US 625520448,625520495,NL -625520496,625520639,US +625520496,625520511,US +625520512,625520639,NL 625520640,625522687,RU 625522688,625523455,SE 625523456,625523711,NO @@ -6571,7 +7046,7 @@ 628029440,628031487,GB 628031488,628064255,MM 628064256,628080639,PK -628080640,628097023,HU +628080640,628097023,BD 628097024,628230143,RU 628230144,628232191,IT 628232192,628236287,RU @@ -6779,7 +7254,8 @@ 630820096,630820351,RO 630820352,630820607,ES 630820608,630820863,US -630820864,630828031,RO +630820864,630827007,RO +630827008,630828031,NL 630828032,630828543,SE 630828544,630829055,BG 630829056,630833151,IR @@ -6832,13 +7308,14 @@ 631036416,631036543,GB 631036544,631037951,RO 631037952,631038207,BG -631038208,631039999,RO +631038208,631038975,RO +631038976,631039999,NL 631040000,631043071,IR 631043072,631043583,RO 631043584,631043839,TR 631043840,631044095,MD 631044096,631045119,IR -631045120,631046143,RO +631045120,631046143,NL 631046144,631048191,DK 631048192,631050239,FR 631050240,631054335,RU @@ -7008,7 +7485,9 @@ 635200168,635200175,IT 635200176,635200263,GB 635200264,635200271,IT -635200272,635200335,GB +635200272,635200279,GB +635200280,635200287,IT +635200288,635200335,GB 635200336,635200343,IT 635200344,635200431,GB 635200432,635200439,IT @@ -7026,9 +7505,7 @@ 635201160,635201167,IT 635201168,635201183,GB 635201184,635201191,IT -635201192,635201263,GB -635201264,635201271,IT -635201272,635201295,GB +635201192,635201295,GB 635201296,635201303,IT 635201304,635203583,GB 635203584,635207679,JO @@ -7068,8 +7545,8 @@ 635725824,635727871,US 635727872,635729919,RU 635729920,635731967,DE -635731968,635732223,SC -635732224,635732735,DE +635731968,635732479,SC +635732480,635732735,DE 635732736,635732991,IR 635732992,635733209,DE 635733210,635733210,PT @@ -7096,7 +7573,9 @@ 635865856,635866111,US 635866112,635871487,RU 635871488,635871743,UA -635871744,635893503,RU +635871744,635891967,RU +635891968,635892223,GB +635892224,635893503,RU 635893504,635893759,AZ 635893760,635894527,RU 635894528,635894783,KZ @@ -7120,8 +7599,7 @@ 636168192,636170239,GB 636170240,636170495,PL 636170496,636170751,IS -636170752,636171007,CH -636171008,636171263,AT +636170752,636171263,CH 636171264,636171519,CL 636171520,636171775,ES 636171776,636172031,GB @@ -7141,7 +7619,14 @@ 636190720,636223487,RU 636223488,636485631,IQ 636485632,636747775,SA -636747776,636764159,FR +636747776,636753407,FR +636753408,636753919,US +636753920,636753938,NL +636753939,636753941,DE +636753942,636754072,NL +636754073,636754075,DE +636754076,636754175,NL +636754176,636764159,FR 636764160,636780543,GB 636780544,636813311,HR 636813312,636878847,AE @@ -7217,41 +7702,63 @@ 637337088,637337599,RU 637337600,637403135,NO 637403136,637534207,IR -637534208,639242239,US +637534208,638910463,US +638910464,638918655,CA +638918656,639242239,US 639242240,639246335,CA 639246336,639442943,US 639442944,639451135,CA -639451136,641738239,US +639451136,639459327,US +639459328,639467519,CA +639467520,641738239,US 641738240,641738495,CA 641738496,641761535,US 641761536,641761791,CA -641761792,641765375,US -641765376,641765887,CA -641765888,641769471,US -641769472,641769983,CA +641761792,641763327,US +641763328,641767423,CA +641767424,641768447,US +641768448,641769983,CA 641769984,641770495,US -641770496,641771839,CA -641771840,641773055,US -641773056,641775615,CA -641775616,641779199,US +641770496,641772543,CA +641772544,641773055,US +641773056,641776639,CA +641776640,641777663,US +641777664,641777919,CA +641777920,641778175,US +641778176,641778687,CA +641778688,641779199,US 641779200,641779327,CA 641779328,641779711,US -641779712,641780223,CA -641780224,641781503,US -641781504,641781759,CA -641781760,641826815,US +641779712,641781759,CA +641781760,641789951,US +641789952,641790975,CA +641790976,641826815,US 641826816,641827839,MX 641827840,641828351,US -641828352,641830911,MX -641830912,642094335,US -642094336,642095103,CA +641828352,641832959,MX +641832960,642089471,US +642089472,642089727,CA +642089728,642092543,US +642092544,642092799,CA +642092800,642093055,US +642093056,642095103,CA 642095104,642096127,US 642096128,642096639,CA -642096640,642113535,US +642096640,642097151,US +642097152,642105343,CA +642105344,642113535,US 642113536,642115583,AU 642115584,642387967,US 642387968,642392063,CA -642392064,643219519,US +642392064,642394111,US +642394112,642396159,CA +642396160,642793471,US +642793472,642794495,CA +642794496,642797567,US +642797568,642797823,CA +642797824,642799615,US +642799616,642801663,CA +642801664,643219519,US 643219520,643219523,CA 643219524,643219526,US 643219527,643219527,CA @@ -7262,70 +7769,102 @@ 643294208,643294719,US 643294720,643294975,RU 643294976,643295231,DE -643295232,643296767,US +643295232,643295487,PR +643295488,643295743,US +643295744,643295999,PR +643296000,643296255,US +643296256,643296511,PR +643296512,643296767,US 643296768,643297023,PR 643297024,643299583,US 643299584,643299839,HK -643299840,643318847,US -643318848,643318911,CA -643318912,643321855,US -643321856,643325951,CA -643325952,644051967,US +643299840,643302911,US +643302912,643303423,CA +643303424,643317759,US +643317760,643325951,CA +643325952,643346431,US +643346432,643346943,CA +643346944,643362815,US +643362816,643363327,CA +643363328,644051967,US 644051968,644052479,MF 644052480,644052735,GP 644052736,644052991,MF 644052992,644055039,US 644055040,644055807,CA 644055808,644056063,US -644056064,644057087,CA -644057088,644058623,US -644058624,644058879,CA +644056064,644057599,CA +644057600,644058111,US +644058112,644058879,CA 644058880,644059135,US 644059136,644059647,CA 644059648,644060159,US -644060160,644061183,CA -644061184,644067327,US -644067328,644069375,CA -644069376,644070143,US -644070144,644070399,CA -644070400,644070911,US -644070912,644071167,CA -644071168,644084479,US +644060160,644061631,CA +644061632,644061663,US +644061664,644062719,CA +644062720,644062975,US +644062976,644065023,CA +644065024,644065055,US +644065056,644065279,CA +644065280,644066303,US +644066304,644066815,CA +644066816,644067327,US +644067328,644071423,CA +644071424,644084479,US 644084480,644084735,GU 644084736,644239615,US 644239616,644239871,CA -644239872,644323391,US -644323392,644323407,CA -644323408,644403199,US -644403200,644403327,CA -644403328,644422911,US +644239872,644247551,US +644247552,644249599,CA +644249600,644323327,US +644323328,644325375,CA +644325376,644388863,US +644388864,644389375,CA +644389376,644389503,US +644389504,644390911,CA +644390912,644399103,US +644399104,644399359,CA +644399360,644403199,US +644403200,644403711,CA +644403712,644407807,US +644407808,644408319,CA +644408320,644413439,US +644413440,644414463,CA +644414464,644422911,US 644422912,644423423,JP -644423424,644634367,US +644423424,644569087,US +644569088,644571135,PR +644571136,644629759,US +644629760,644630015,CA +644630016,644634367,US 644634368,644636671,CA -644636672,644718847,US -644718848,644718911,CA -644718912,644719103,RU -644719104,644719359,US -644719360,644719615,CA -644719616,644720127,US -644720128,644720639,CA +644636672,644718719,US +644718720,644718783,CA +644718784,644718847,US +644718848,644718943,CA +644718944,644719359,US +644719360,644720639,CA 644720640,644759551,US -644759552,644760575,CA -644760576,644761087,US -644761088,644761343,CA -644761344,644763903,US -644763904,644764159,CA -644764160,644765439,US -644765440,644765695,CA -644765696,644767878,US +644759552,644761599,CA +644761600,644763647,US +644763648,644767743,CA +644767744,644767878,US 644767879,644767879,CA -644767880,644835071,US +644767880,644773887,US +644773888,644775935,CA +644775936,644833279,US +644833280,644834815,CA +644834816,644834817,US +644834818,644834818,CA +644834819,644835071,US 644835072,644835327,CA -644835328,644838143,US -644838144,644838399,CA -644838400,644838911,US -644838912,644839679,CA -644839680,644845839,US +644835328,644836351,US +644836352,644837375,CA +644837376,644838143,US +644838144,644839679,CA +644839680,644840447,US +644840448,644841471,CA +644841472,644845839,US 644845840,644845840,RU 644845841,644845841,US 644845842,644845855,RU @@ -7333,39 +7872,55 @@ 644845864,644846079,RU 644846080,644874495,US 644874496,644874751,CA -644874752,644877311,US +644874752,644875007,US +644875008,644875263,CA +644875264,644877311,US 644877312,644877439,CA -644877440,644897791,US -644897792,644898047,CA -644898048,644900863,US -644900864,644902911,CA -644902912,644980735,US +644877440,644896767,US +644896768,644902911,CA +644902912,644903170,US +644903171,644903171,CA +644903172,644903423,US +644903424,644903935,CA +644903936,644980735,US 644980736,644980991,CA 644980992,644981759,US -644981760,644982783,CA +644981760,644982399,CA +644982400,644982527,US +644982528,644982783,CA 644982784,644986111,US 644986112,644986367,CA -644986368,645187071,US -645187072,645187327,CA -645187328,645221119,US +644986368,644987135,US +644987136,644987903,CA +644987904,645185535,US +645185536,645193727,CA +645193728,645221119,US 645221120,645222399,CA -645222400,645227775,US -645227776,645228031,CA -645228032,645481405,US -645481406,645481406,CA -645481407,645485567,US -645485568,645485695,CA -645485696,645485823,US -645485824,645486079,CA -645486080,645486591,US -645486592,645486847,CA -645486848,645487103,US -645487104,645487615,CA -645487616,645487871,US -645487872,645487935,CA -645487936,645547399,US +645222400,645223935,US +645223936,645224191,CA +645224192,645224959,US +645224960,645225215,CA +645225216,645225471,US +645225472,645225983,CA +645225984,645227519,US +645227520,645228031,CA +645228032,645229055,US +645229056,645230079,CA +645230080,645480447,US +645480448,645482495,CA +645482496,645484543,US +645484544,645488639,CA +645488640,645525503,US +645525504,645529599,CA +645529600,645539839,US +645539840,645540863,CA +645540864,645547399,US 645547400,645547407,CA -645547408,645611519,US +645547408,645576703,US +645576704,645576997,CA +645576998,645576998,US +645576999,645577215,CA +645577216,645611519,US 645611520,645615615,MX 645615616,645644351,US 645644352,645644415,MX @@ -7384,38 +7939,42 @@ 645713920,645744639,US 645744640,645745663,GB 645745664,645873663,US -645873664,645873919,CA -645873920,645984255,US +645873664,645877759,CA +645877760,645980159,US +645980160,645982719,CA +645982720,645984255,US 645984256,645988351,CA 645988352,645989450,US 645989451,645989451,CA -645989452,646084097,US -646084098,646084098,CA -646084099,646160383,US +645989452,646082559,US +646082560,646083583,CA +646083584,646084095,US +646084096,646084351,CA +646084352,646084607,US +646084608,646086655,CA +646086656,646160383,US 646160384,646164479,CA -646164480,646195560,US -646195561,646195561,CA -646195562,646197247,US -646197248,646197759,CA -646197760,646198032,US -646198033,646198033,CA -646198034,646198042,US -646198043,646198043,CA -646198044,646198271,US -646198272,646198783,CA -646198784,646199384,US -646199385,646199385,CA -646199386,646199807,US -646199808,646200319,CA -646200320,646250495,US -646250496,646256639,CA -646256640,646711807,US +646164480,646193151,US +646193152,646194943,CA +646194944,646195199,US +646195200,646198783,CA +646198784,646199295,US +646199296,646201343,CA +646201344,646250495,US +646250496,646258687,CA +646258688,646262783,US +646262784,646264831,CA +646264832,646711807,US 646711808,646712319,CA -646712320,646735103,US -646735104,646735231,CA -646735232,646765839,US +646712320,646734847,US +646734848,646735359,CA +646735360,646764543,US +646764544,646765823,CA +646765824,646765839,US 646765840,646765847,CA -646765848,653434879,US +646765848,646766079,US +646766080,646766591,CA +646766592,653434879,US 653434880,653443071,CA 653443072,654311423,US 654311424,654311679,CN @@ -7439,7 +7998,9 @@ 675447168,675447295,HK 675447296,675447423,US 675447424,675447551,BR -675447552,675545087,US +675447552,675448575,US +675448576,675449087,GB +675449088,675545087,US 675545088,675610623,NL 675610624,675635199,IE 675635200,675643391,CA @@ -7458,7 +8019,9 @@ 676176192,676176255,US 676176256,676176383,HK 676176384,676176639,IE -676176640,676192767,US +676176640,676179455,US +676179456,676179711,IE +676179712,676192767,US 676192768,676192895,HK 676192896,676193023,IE 676193024,676193535,US @@ -7496,7 +8059,11 @@ 677020192,677020479,US 677020480,677020543,GB 677020544,677020607,KR -677020608,677021951,US +677020608,677020927,US +677020928,677020959,NL +677020960,677020991,BR +677020992,677021023,IE +677021024,677021951,US 677021952,677021983,JP 677021984,677022079,US 677022080,677022143,IN @@ -7511,22 +8078,35 @@ 677022464,677022527,US 677022528,677022591,GB 677022592,677022655,KR -677022656,677023103,US -677023104,677023111,IE -677023112,677380095,US +677022656,677023007,US +677023008,677023039,NL +677023040,677023071,BR +677023072,677023135,IE +677023136,677023167,NL +677023168,677023935,US +677023936,677023967,NL +677023968,677023999,BR +677024000,677024031,IE +677024032,677380095,US 677380096,677380127,AU 677380128,677380159,IE 677380160,677380191,NL 677380192,677380543,US -677380544,677380719,SG -677380720,677380895,KR +677380544,677380583,SG +677380584,677380591,US +677380592,677380719,SG +677380720,677380759,KR +677380760,677380767,US +677380768,677380895,KR 677380896,677380927,AU 677380928,677380943,IN 677380944,677380959,FI 677380960,677380991,AU 677380992,677381055,US 677381056,677381071,FI -677381072,677381247,HK +677381072,677381111,HK +677381112,677381119,US +677381120,677381247,HK 677381248,677381375,US 677381376,677381407,AT 677381408,677381423,NL @@ -7598,7 +8178,7 @@ 677385984,677385999,FI 677386000,677386015,US 677386016,677386047,IN -677386048,677386063,CA +677386048,677386063,HK 677386064,677386095,US 677386096,677386111,BR 677386112,677386127,CA @@ -7633,12 +8213,12 @@ 677387320,677387327,FI 677387328,677387455,AT 677387456,677387487,FI -677387488,677387663,SG +677387488,677387663,US 677387664,677387839,HK 677387840,677387863,AT 677387864,677387967,US 677387968,677388007,FI -677388008,677388183,KR +677388008,677388183,US 677388184,677388223,FI 677388224,677388351,US 677388352,677388527,MY @@ -7682,7 +8262,7 @@ 677393744,677393759,NL 677393760,677393855,US 677393856,677393863,FI -677393864,677393927,BR +677393864,677393927,US 677393928,677394279,JP 677394280,677394287,FI 677394288,677394303,AU @@ -7724,18 +8304,13 @@ 677655552,677678079,US 677678080,677678591,IN 677678592,677679103,US -677679104,677679263,AU -677679264,677679327,US -677679328,677679615,AU +677679104,677679615,AU 677679616,677680639,US -677680640,677680767,AU -677680768,677680831,US -677680832,677681119,AU -677681120,677681151,US +677680640,677681151,AU 677681152,677683199,JP 677683200,677685247,CA -677685248,677686271,GB -677686272,677707775,US +677685248,677687295,GB +677687296,677707775,US 677707776,677708799,NL 677708800,677709823,AT 677709824,677713919,NL @@ -7799,12 +8374,27 @@ 677839328,677839343,FI 677839344,677839359,AT 677839360,677840319,US -677840320,677840639,NL +677840320,677840335,NL +677840336,677840367,IE +677840368,677840383,AT +677840384,677840399,NL +677840400,677840431,IE +677840432,677840447,AT +677840448,677840463,NL +677840464,677840495,IE +677840496,677840511,AT +677840512,677840543,NL +677840544,677840559,IE +677840560,677840575,AT +677840576,677840591,NL +677840592,677840623,IE +677840624,677840639,AT 677840640,677841919,US 677841920,677841935,FI 677841936,677841951,IE 677841952,677841967,AT -677841968,677841999,FI +677841968,677841983,NL +677841984,677841999,FI 677842000,677842015,IE 677842016,677842031,AT 677842032,677842047,NL @@ -8016,14 +8606,21 @@ 678202368,678203135,IE 678203136,678203391,NL 678203392,678205183,US -678205184,678205439,NL -678205440,678205695,US +678205184,678205695,NL 678205696,678205951,KR 678205952,678206463,CA 678206464,678206719,KR 678206720,678206975,IE 678206976,678207487,AU -678207488,678428671,US +678207488,678207999,IE +678208000,678208255,US +678208256,678208511,GB +678208512,678209023,IE +678209024,678209279,GB +678209280,678209791,IE +678209792,678211583,US +678211584,678212607,NL +678212608,678428671,US 678428672,678436863,IE 678436864,678437887,US 678437888,678438015,IE @@ -8042,9 +8639,7 @@ 678543360,678592511,US 678592512,678623193,NL 678623194,678623194,US -678623195,678625279,NL -678625280,678633471,IE -678633472,678641663,NL +678623195,678641663,NL 678641664,678649855,AU 678649856,678658047,IE 678658048,678690815,JP @@ -8085,21 +8680,9 @@ 691650560,691666943,GH 691666944,691732479,NG 691732480,691798015,TZ -691798016,691814399,ZM -691814400,691814655,ZW -691814656,691815935,ZM -691815936,691816191,ZW -691816192,691816447,ZM -691816448,691816703,ZW -691816704,691816959,ZM -691816960,691817215,ZW -691817216,691821823,ZM -691821824,691822079,ZW -691822080,691823871,ZM -691823872,691824127,ZW -691824128,691824639,ZM -691824640,691825151,ZW -691825152,691857407,ZM +691798016,691806207,ZM +691806208,691830783,ZW +691830784,691857407,ZM 691857408,691858175,KE 691858176,691863551,ZM 691863552,691929087,ZA @@ -8130,7 +8713,9 @@ 692625408,692626687,KE 692626688,692626943,AO 692626944,692633599,KE -692633600,692641791,MU +692633600,692637903,MU +692637904,692637911,KE +692637912,692641791,MU 692641792,692649983,GA 692649984,692658175,NG 692658176,692666367,ZA @@ -8176,7 +8761,9 @@ 692852736,692854783,GH 692854784,692856831,ZA 692856832,692858879,MU -692858880,692860927,MW +692858880,692859135,MW +692859136,692859391,UG +692859392,692860927,MW 692860928,692862975,ZA 692862976,692869119,NG 692869120,692871167,TZ @@ -8206,8 +8793,8 @@ 692932608,692934655,CM 692934656,692936703,BW 692936704,692940799,ZA -692940800,692941055,MA -692941056,692941567,CA +692940800,692941311,MA +692941312,692941567,CA 692941568,692942847,MA 692942848,692944895,GA 692944896,692946943,MZ @@ -8314,7 +8901,7 @@ 693073920,693074943,SS 693074944,693075967,CV 693075968,693076991,CM -693076992,693078015,ZW +693076992,693078015,MU 693078016,693079039,BW 693079040,693080063,KE 693080064,693081087,NG @@ -8341,7 +8928,10 @@ 693103616,693104639,GN 693104640,693105663,ZA 693105664,693106687,MZ -693106688,693107711,ZA +693106688,693106951,TZ +693106952,693106959,ZA +693106960,693107199,TZ +693107200,693107711,ZA 693107712,693239807,KE 693239808,693370879,SN 693370880,693403647,ZA @@ -8389,16 +8979,15 @@ 696926208,696928255,ZA 696928256,696930303,BW 696930304,696932351,RW -696932352,696932607,EG +696932352,696932607,BJ 696932608,696932863,NG -696932864,696933375,EG +696932864,696933375,BJ 696933376,696934399,ZA 696934400,696942591,BF 696942592,696950783,MR 696950784,696958975,NG 696958976,696963071,TZ -696963072,696965119,UG -696965120,696966143,NG +696963072,696966143,UG 696966144,696967167,TZ 696967168,696971263,MZ 696971264,696974335,KE @@ -8414,7 +9003,9 @@ 698056704,698089471,EG 698089472,698220543,ZA 698220544,698351615,GA -698351616,699400191,ZA +698351616,699334655,ZA +699334656,699342847,ZM +699342848,699400191,ZA 699400192,699465727,EG 699465728,699531263,ZA 699531264,699662335,EG @@ -8463,7 +9054,7 @@ 700381184,700382207,EG 700382208,700383231,KE 700383232,700399615,EG -700399616,700400639,AO +700399616,700400639,BW 700400640,700401663,CI 700401664,700402687,MZ 700402688,700403711,UG @@ -8474,6 +9065,7 @@ 700407808,700408831,GH 700408832,700409855,CM 700409856,700410879,LR +700410880,700411903,NG 700412928,700413951,ZM 700413952,700414975,SC 700414976,700432383,ZA @@ -8563,13 +9155,11 @@ 701423616,701431807,NG 701431808,701439999,CI 701440000,701448191,MG -701448192,701457919,KE -701457920,701458175,CG -701458176,701458831,KE +701448192,701458831,KE 701458832,701458847,CG 701458848,701462783,KE -701462784,701463039,CG -701463040,701463807,KE +701462784,701463295,CG +701463296,701463807,KE 701463808,701464063,CG 701464064,701464319,KE 701464320,701464351,CG @@ -8632,8 +9222,9 @@ 702066688,702066943,PL 702066944,702067199,NL 702067200,702067711,PL -702067712,702070527,CM -702070528,702070783,RU +702067712,702068735,NL +702068736,702070271,CM +702070272,702070783,RU 702070784,702074879,ZA 702074880,702076927,BW 702076928,702078975,TZ @@ -8679,9 +9270,13 @@ 702328832,702332927,TZ 702332928,702337023,MZ 702337024,702341119,UG -702341120,702342259,MU +702341120,702342111,MU +702342112,702342127,KE +702342128,702342259,MU 702342260,702342263,KE -702342264,702344199,MU +702342264,702343039,MU +702343040,702343103,KE +702343104,702344199,MU 702344200,702344971,KE 702344972,702345215,MU 702345216,702349311,KE @@ -8699,7 +9294,7 @@ 702398464,702402559,CV 702402560,702410751,ZA 702410752,702414847,AO -702414848,702416895,UG +702414848,702416895,MU 702416896,702418943,KE 702418944,702420991,ZM 702420992,702423039,TZ @@ -8830,9 +9425,9 @@ 703774720,703791103,ZA 703791104,703856639,CD 703856640,703922175,CM -703922176,703971327,ZA -703971328,703975423,NG -703975424,704118783,ZA +703922176,703954943,ZA +703954944,703987711,NG +703987712,704118783,ZA 704118784,704380927,MA 704380928,704643071,LY 704643072,704644095,CN @@ -8988,9 +9583,9 @@ 736188416,736189439,JP 736189440,736190463,IN 736190464,736191487,PK -736191488,736192511,HK +736191488,736193535,HK 736193536,736194559,MY -736194560,736195583,AU +736194560,736195583,NZ 736195584,736196607,IN 736196608,736198655,CN 736198656,736199679,AU @@ -9068,7 +9663,7 @@ 736394240,736395263,HK 736395264,736396287,MN 736396288,736398335,CN -736398336,736400383,IN +736398336,736399359,IN 736400384,736402431,CN 736402432,736402687,NZ 736402688,736402943,SG @@ -9135,7 +9730,6 @@ 736482304,736483327,HK 736483328,736485375,CN 736485376,736486399,IN -736486400,736487423,NP 736487424,736489471,CN 736489472,736491519,JP 736491520,736493567,ID @@ -9193,7 +9787,7 @@ 736559104,736560127,HK 736560128,736561151,MY 736561152,736562175,HK -736562176,736563199,CN +736562176,736563199,SG 736563200,736564223,HK 736564224,736565247,BD 736565248,736566271,AU @@ -9329,9 +9923,7 @@ 737264640,737265663,CN 737265664,737266687,AU 737266688,737267711,HK -737267712,737276927,CN -737276928,737277951,IN -737277952,737279999,CN +737267712,737279999,CN 737280000,737281023,BD 737281024,737282047,SG 737282048,737288191,CN @@ -9386,7 +9978,9 @@ 737369088,737370111,HK 737370112,737371135,NP 737371136,737375231,HK -737375232,737376255,AU +737375232,737375743,AU +737375744,737375999,SG +737376000,737376255,AU 737376256,737377279,HK 737377280,737378303,PH 737378304,737379327,CN @@ -9446,9 +10040,7 @@ 737502208,737503231,IN 737503232,737505279,SG 737505280,737506303,AU -737506304,737507327,BD -737507328,737507583,AU -737507584,737508351,BD +737506304,737508351,BD 737508352,737509375,MY 737509376,737510399,PK 737510400,737511423,AU @@ -9475,7 +10067,8 @@ 737530880,737531903,NC 737531904,737532927,KH 737532928,737533183,HK -737533184,737533439,PH +737533184,737533184,PH +737533185,737533439,MY 737533440,737533695,VN 737533696,737533951,TW 737533952,737534975,AU @@ -9875,12 +10468,93 @@ 738193408,738194431,TH 738194432,738195455,CN 738195456,738197503,KR -738197504,747175935,US +738197504,746786303,US +746786304,746786559,GB +746786560,747175935,US 747175936,747241471,NL -747241472,755105791,US +747241472,747671807,US +747671808,747672063,GB +747672064,755105791,US 755105792,755179519,CA 755179520,755236863,US +755236864,755237673,CL 755237674,755237674,US +755237675,755237887,CL +755237888,755258367,BR +755258368,755259391,HN +755259392,755260415,EC +755260416,755261439,AR +755261440,755261695,BR +755261696,755261951,AR +755261952,755262463,BO +755262464,755263487,AR +755263488,755269631,BR +755269632,755270655,HN +755270656,755271679,BR +755271680,755272703,HN +755272704,755277823,BR +755277824,755279871,AR +755279872,755280895,CL +755280896,755281919,HN +755281920,755287039,BR +755287040,755288063,HN +755288064,755289087,EC +755289088,755290111,HN +755290112,755292159,BR +755292160,755293183,AR +755293184,755301375,BR +755301376,755303423,AR +755303424,755304447,BR +755304448,755305471,DO +755305472,755305727,SV +755305728,755305983,BO +755305984,755306239,BR +755306240,755306495,AR +755306496,755307519,BR +755307520,755309567,AR +755309568,755310591,HN +755310592,755315711,BR +755315712,755316735,MX +755316736,755317759,PE +755317760,755318783,CR +755318784,755319807,HN +755319808,755320831,PE +755320832,755321855,BR +755321856,755322879,HN +755322880,755325951,BR +755325952,755326975,MX +755326976,755332095,BR +755332096,755333119,GT +755333120,755335167,CL +755335168,755340287,BR +755340288,755342335,AR +755342336,755343359,BR +755343360,755345407,CO +755345408,755346431,BR +755346432,755347455,CO +755347456,755348479,BR +755348480,755351551,CO +755351552,755357695,BR +755357696,755358719,NI +755358720,755368959,BR +755368960,755371007,AR +755371008,755378175,BR +755378176,755379199,DO +755379200,755381247,HN +755381248,755383295,BR +755383296,755384319,MX +755384320,755385343,BR +755385344,755386367,AR +755386368,755394559,BR +755394560,755395583,AR +755395584,755401727,BR +755401728,755402751,AR +755402752,755403775,BR +755403776,755404799,MX +755404800,755417087,BR +755422208,755423231,AR +755425280,755429375,BR +755431424,755433471,UY 756023296,757071871,US 757071872,757071911,NL 757071912,757071919,US @@ -9900,7 +10574,9 @@ 757072776,757072791,US 757072792,757072895,NL 757072896,757072903,US -757072904,757073007,NL +757072904,757072911,NL +757072912,757072919,US +757072920,757073007,NL 757073008,757073023,US 757073024,757073047,NL 757073048,757073055,US @@ -9921,8 +10597,7 @@ 757110784,757112831,DE 757112832,757113343,US 757113344,757113855,NL -757113856,757115903,US -757115904,757116927,NL +757113856,757116927,US 757116928,757118975,GB 757118976,757119999,NL 757120000,757121023,AU @@ -9961,7 +10636,9 @@ 757716736,757716991,NZ 757716992,757721599,US 757721600,757721855,PH -757721856,757729279,US +757721856,757727231,US +757727232,757728255,VI +757728256,757729279,US 757729280,757731327,CA 757731328,757733375,US 757733376,757734399,CA @@ -10051,13 +10728,9 @@ 757789440,757789567,NP 757789568,757790975,US 757790976,757791231,WS -757791232,757792767,US -757792768,757793279,CA -757793280,757793791,US +757791232,757793791,US 757793792,757794047,CA -757794048,757794815,US -757794816,757795071,CY -757795072,757795839,US +757794048,757795839,US 757795840,757796351,CA 757796352,757796863,US 757796864,757797375,CA @@ -10066,8 +10739,11 @@ 757798400,757799167,US 757799168,757799423,CA 757799424,757799935,US -757799936,757800959,CA +757799936,757800191,CA +757800192,757800447,US +757800448,757800959,CA 757800960,757809151,US +757809152,757809407,CA 757809408,757809663,RO 757809664,757809919,GB 757817344,757858303,US @@ -10115,9 +10791,7 @@ 758702080,758710271,NL 758710272,758747391,US 758747392,758747647,LT -758747648,758750463,US -758750464,758750719,IN -758750720,758752199,US +758747648,758752199,US 758752200,758752207,FI 758752208,758779903,US 758779904,758783999,CA @@ -10313,7 +10987,13 @@ 759693960,759693975,GR 759693976,759726079,US 759726080,759791615,CA -759791616,759824639,US +759791616,759799807,US +759799808,759801855,IL +759801856,759802367,US +759802368,759803391,CA +759803392,759803903,US +759803904,759804927,GB +759804928,759824639,US 759824640,759824895,SA 759824896,759825151,CR 759825152,759825407,US @@ -10361,22 +11041,30 @@ 759848960,759955455,CA 759955456,759963647,US 759963648,759965759,NL -759965760,759975935,US -759975936,759977471,DE -759977472,759977983,US -759977984,759979007,DE -759979008,759980031,US +759965760,759966207,US +759966208,759966719,NL +759966720,759967743,FR +759967744,759968767,JP +759968768,759975935,US +759975936,759980031,DE 759980032,759984127,JP -759984128,759985151,AU -759985152,759988223,US -759988224,759990783,GB -759990784,759992319,US -759992320,759996415,SG -759996416,760004607,US -760004608,760006967,JP -760006968,760007039,US +759984128,759986175,AU +759986176,759988223,US +759988224,759992319,GB +759992320,759997439,SG +759997440,760000511,US +760000512,760004607,SG +760004608,760006983,JP +760006984,760006987,US +760006988,760007007,JP +760007008,760007039,US 760007040,760012799,JP -760012800,760111103,US +760012800,760023039,US +760023040,760026367,JP +760026368,760026623,HK +760026624,760029183,JP +760029184,760031743,SG +760031744,760111103,US 760111104,760119295,CA 760119296,760127487,US 760127488,760152063,CA @@ -10437,7 +11125,8 @@ 762398720,762399743,CN 762399744,762400767,IN 762400768,762401023,HK -762401024,762401791,US +762401024,762401279,US +762401280,762401791,KR 762401792,762402815,TH 762402816,762403839,IN 762403840,762404863,AU @@ -10721,7 +11410,7 @@ 762848768,762849279,BD 762849280,762850303,IN 762850304,762851327,HK -762851328,762852351,IN +762851328,762851839,IN 762852352,762853375,HK 762853376,762855423,IN 762855424,762857471,KR @@ -10753,7 +11442,7 @@ 762884096,762885119,JP 762885120,762887167,HK 762887168,762888191,IN -762888192,762890239,JP +762888192,762889215,JP 762890240,762890495,KR 762890496,762890751,TW 762890752,762891007,HK @@ -10903,7 +11592,7 @@ 763182080,763183103,IN 763183104,763183615,HK 763183616,763183871,LT -763183872,763184127,HK +763183872,763184127,JP 763184128,763185151,IN 763186176,763194367,CN 763194368,763196415,HK @@ -10913,7 +11602,9 @@ 763200512,763201535,IN 763201536,763202559,CN 763202560,763207679,IN -763207680,763209727,HK +763207680,763208703,HK +763208704,763208959,US +763208960,763209727,HK 763209728,763210751,NZ 763210752,763214847,IN 763214848,763215871,JP @@ -10972,7 +11663,10 @@ 763280384,763281407,IN 763281408,763282431,AU 763282432,763285503,IN -763285504,763286527,SG +763285504,763286017,SG +763286018,763286018,US +763286019,763286271,SG +763286272,763286527,US 763286528,763287551,CN 763287552,763288575,HK 763288576,763289599,CN @@ -10988,6 +11682,7 @@ 763299840,763301887,CN 763301888,763304959,IN 763304960,763305983,JP +763305984,763307007,SG 763307008,763308031,CN 763308032,763310079,IN 763310080,763311103,BD @@ -11022,7 +11717,10 @@ 763343872,763344895,AU 763344896,763345919,HK 763345920,763353087,IN -763353088,763354111,CN +763353088,763353343,HK +763353344,763353599,CN +763353600,763353855,TW +763353856,763354111,CN 763354112,763360255,IN 763360256,763362303,BD 763362304,763363327,VN @@ -11037,6 +11735,7 @@ 768868352,769130495,ZM 769130496,769392639,MA 769392640,769404927,ZA +769404928,769405183,TZ 769405184,769405439,ZA 769405440,769405951,CI 769405952,769406975,GN @@ -11214,7 +11913,8 @@ 771683840,771684095,MV 771684096,771684351,MH 771684352,771685375,CN -771685376,771686399,HK +771685376,771685631,JP +771685632,771686399,HK 771686400,771719167,CN 771719168,771720191,US 771720192,771750911,CN @@ -11229,9 +11929,7 @@ 772282624,772282879,KZ 772282880,772283391,RU 772283392,772283647,ES -772283648,772284159,RU -772284160,772284415,UZ -772284416,772284927,RU +772283648,772284927,RU 772284928,772285183,UA 772285184,772285439,UZ 772285440,772285695,RU @@ -11292,7 +11990,9 @@ 772884480,772886527,LB 772886528,772888575,FR 772888576,772890623,GB -772890624,772892671,NL +772890624,772892033,NL +772892034,772892041,RU +772892042,772892671,NL 772892672,772894719,GB 772894720,772896767,PL 772896768,772898815,RS @@ -11569,7 +12269,6 @@ 773800960,773801215,SG 773801216,773801471,US 773801472,773801983,CY -773801984,773804031,IQ 773804032,773806079,GB 773806080,773808127,BE 773808128,773810175,IL @@ -11701,7 +12400,8 @@ 774162739,774162743,UA 774162744,774162778,US 774162779,774162784,CA -774162785,774162788,UA +774162785,774162787,UA +774162788,774162788,VA 774162789,774162798,CA 774162799,774162803,BN 774162804,774162808,TM @@ -11893,9 +12593,9 @@ 778304306,778304306,SI 778304307,778305535,AL 778305536,778371071,IR -778371072,778388893,GB -778388894,778388894,DE -778388895,778395647,GB +778371072,778388479,GB +778388480,778389503,DE +778389504,778395647,GB 778395648,778436607,DE 778436608,778461183,RO 778461184,778461439,TR @@ -11908,7 +12608,7 @@ 778466304,778467327,RO 778467328,778473471,IR 778473472,778474495,RO -778474496,778475519,GB +778474496,778475519,US 778475520,778475775,CH 778475776,778476031,RO 778476032,778476287,MD @@ -11916,7 +12616,9 @@ 778477568,778477695,NL 778477696,778480639,RO 778480640,778480895,MD -778480896,778481663,RO +778480896,778481151,RO +778481152,778481407,GB +778481408,778481663,RO 778481664,778481919,MD 778481920,778482943,GB 778482944,778483199,MD @@ -11983,9 +12685,7 @@ 778666880,778666943,GB 778666944,778667175,FR 778667176,778667179,ES -778667180,778667295,FR -778667296,778667311,GB -778667312,778667347,FR +778667180,778667347,FR 778667348,778667351,GB 778667352,778667499,FR 778667500,778667503,GB @@ -12369,7 +13069,9 @@ 781975552,782106623,NO 782106624,782254079,RU 782254080,782270463,UA -782270464,782313471,RU +782270464,782311167,RU +782311168,782311423,UA +782311424,782313471,RU 782313472,782313727,UA 782313728,782317567,RU 782317568,782317695,IN @@ -12424,9 +13126,7 @@ 782667776,782671871,NL 782671872,782672655,LT 782672656,782672663,VG -782672664,782672783,LT -782672784,782672791,CH -782672792,782672871,LT +782672664,782672871,LT 782672872,782672879,IL 782672880,782673935,LT 782673936,782673943,EE @@ -12626,8 +13326,7 @@ 784334848,784457743,FR 784457744,784458751,GB 784458752,784458767,FR -784458768,784459775,GB -784459776,784461823,IT +784458768,784461823,GB 784461824,784465919,FR 784465920,784596991,SE 784596992,784728063,TR @@ -12775,15 +13474,11 @@ 786919880,786919887,IT 786919888,786920191,GB 786920192,786920199,IT -786920200,786920223,GB -786920224,786920231,IT -786920232,786920615,GB +786920200,786920615,GB 786920616,786920623,IT 786920624,786920839,GB 786920840,786920847,IT -786920848,786920855,GB -786920856,786920863,IT -786920864,786920999,GB +786920848,786920999,GB 786921000,786921007,IT 786921008,786921087,GB 786921088,786921095,IT @@ -12939,8 +13634,7 @@ 787711488,787711999,GB 787712000,787712255,MT 787712256,787712511,MA -787712512,787712767,DE -787712768,787713023,IT +787712512,787713023,DE 787713024,787713279,LV 787713280,787713535,SE 787713536,787713791,BG @@ -12954,13 +13648,18 @@ 787715584,787715839,BH 787715840,787718143,NL 787718144,787718655,RU -787718656,787720191,NL -787720192,787722239,RU +787718656,787719167,NL +787719168,787719423,RU +787719424,787719935,NL +787719936,787722239,RU 787722240,787722751,NL 787722752,787725311,RU -787725312,787742207,NL -787742208,787742463,RU -787742464,787750143,NL +787725312,787741695,NL +787741696,787741951,RU +787741952,787742207,NL +787742208,787742719,RU +787742720,787749887,NL +787749888,787750143,US 787750144,787750159,BD 787750160,787750175,BT 787750176,787750191,BN @@ -12977,7 +13676,9 @@ 787750336,787750351,PK 787750352,787750367,PG 787750368,787750383,LK -787750384,787750911,NL +787750384,787750399,NL +787750400,787750655,US +787750656,787750911,NL 787750912,787755007,GB 787755008,787759103,NL 787759104,787767295,PS @@ -13069,7 +13770,8 @@ 788261376,788261631,GB 788261632,788262143,DE 788262144,788262399,IR -788262400,788267007,DE +788262400,788265215,DE +788265216,788267007,ES 788267008,788271103,SE 788271104,788275199,DE 788275200,788279295,AL @@ -13173,9 +13875,7 @@ 789577728,790102015,US 790102016,790429695,CA 790429696,790626303,IN -790626304,790841343,US -790841344,790841599,CA -790841600,792002559,US +790626304,792002559,US 792002560,792068095,IT 792068096,792199167,CA 792199168,792330239,US @@ -13183,14 +13883,21 @@ 792723456,793247743,DE 793247744,793313279,NZ 793313280,793378815,DE -793378816,794329087,US +793378816,793395199,JP +793395200,794329087,US 794329088,794361855,SG 794361856,794369288,HK 794369289,794369289,CN 794369290,794378239,HK 794378240,794427391,US 794427392,794460159,HK -794460160,794558463,US +794460160,794492927,US +794492928,794501119,JP +794501120,794532607,US +794532608,794532863,HK +794532864,794533631,US +794533632,794533887,HK +794533888,794558463,US 794558464,796917759,CN 796917760,797442047,CA 797442048,800522240,US @@ -13349,7 +14056,8 @@ 839348480,839348735,AT 839348736,839348991,GB 839348992,839349247,AT -839349248,839350271,DE +839349248,839349759,DE +839349760,839350271,US 839350272,839351295,NL 839351296,839352063,DE 839352064,839357439,NL @@ -13457,7 +14165,9 @@ 871038976,871104511,SA 871104512,872153087,GB 872153088,872284159,SA -872284160,872286871,FR +872284160,872286271,FR +872286272,872286335,ES +872286336,872286871,FR 872286872,872286875,CZ 872286876,872288159,FR 872288160,872288191,ES @@ -13515,7 +14225,9 @@ 872304832,872304895,ES 872304896,872305439,FR 872305440,872305471,GB -872305472,872306183,FR +872305472,872305655,FR +872305656,872305663,GB +872305664,872306183,FR 872306184,872306191,US 872306192,872306367,FR 872306368,872306399,GB @@ -13552,7 +14264,9 @@ 872316799,872321183,FR 872321184,872321215,FI 872321216,872321279,ES -872321280,872322943,FR +872321280,872321379,FR +872321380,872321383,GB +872321384,872322943,FR 872322944,872323071,GB 872323072,872323135,FR 872323136,872323199,ES @@ -13618,7 +14332,9 @@ 872346816,872346879,ES 872346880,872346978,FR 872346979,872346979,DE -872346980,872347063,FR +872346980,872347039,FR +872347040,872347055,GB +872347056,872347063,FR 872347064,872347067,PT 872347068,872348959,FR 872348960,872348975,GB @@ -13669,9 +14385,7 @@ 872374592,872374655,ES 872374656,872375007,FR 872375008,872375039,PT -872375040,872375215,FR -872375216,872375231,ES -872375232,872375295,FR +872375040,872375295,FR 872375296,872375423,NL 872375424,872375807,FR 872375808,872375871,GB @@ -13770,7 +14484,10 @@ 873725952,874250239,US 874250240,874381311,DE 874381312,874512383,IE -874512384,875560959,US +874512384,875446271,US +875446272,875454463,FR +875454464,875495423,US +875495424,875560959,FR 875560960,875823103,IE 875823104,876085247,US 876085248,876150783,GB @@ -13826,9 +14543,11 @@ 878578944,878579199,AU 878579200,878579455,CA 878579456,878579711,GB -878579712,878579967,US +878579712,878579967,FR 878579968,878580223,DE -878580224,878581759,US +878580224,878580735,US +878580736,878580991,IN +878580992,878581759,US 878581760,878582783,IE 878582784,878583807,US 878583808,878591999,GB @@ -13870,8 +14589,9 @@ 878639296,878639311,GB 878639312,878639327,CA 878639328,878639359,US -878639360,878639375,CN -878639376,878648831,US +878639360,878639391,CN +878639392,878639407,FR +878639408,878648831,US 878648832,878649343,JP 878649344,878649855,US 878649856,878650111,JP @@ -13884,14 +14604,17 @@ 878657536,878666751,IN 878666752,878667775,US 878667776,878668799,IE -878668800,878669823,US +878668800,878669567,US +878669568,878669823,KR 878669824,878673919,IE 878673920,878675967,AU 878675968,878676735,BR 878676736,878678271,US 878678272,878679039,CA 878679040,878679807,GB -878679808,878690303,US +878679808,878680575,US +878680576,878681343,FR +878681344,878690303,US 878690304,878694399,KR 878694400,878695423,US 878695424,878696447,SG @@ -13908,7 +14631,7 @@ 878705408,878705663,US 878705664,878705919,KR 878705920,878706175,GB -878706176,878706431,US +878706176,878706431,FR 878706432,878706447,BR 878706448,878706463,AU 878706464,878706479,SG @@ -13917,9 +14640,13 @@ 878706512,878706559,US 878706560,878706575,DE 878706576,878706591,CN -878706592,879763583,US +878706592,879757055,US +879757056,879757311,CA +879757312,879763583,US 879763584,879763711,CA -879763712,879788031,US +879763712,879772543,US +879772544,879772671,CA +879772672,879788031,US 879788032,879788159,NL 879788160,879788287,IE 879788288,879788543,GB @@ -13953,7 +14680,10 @@ 879821440,879821567,HK 879821568,879821695,SG 879821696,879821823,KR -879821824,879829119,US +879821824,879822079,JP +879822080,879822335,AU +879822336,879822591,IN +879822592,879829119,US 879829120,879829247,SG 879829248,879829375,JP 879829376,879829503,HK @@ -13969,7 +14699,10 @@ 879837504,879837567,HK 879837568,879837631,SG 879837632,879837695,KR -879837696,879841343,US +879837696,879837823,JP +879837824,879837951,AU +879837952,879838079,IN +879838080,879841343,US 879841344,879841407,SG 879841408,879841471,JP 879841472,879841535,HK @@ -13979,7 +14712,11 @@ 879841792,879841919,KR 879841920,880216831,US 880216832,880217087,CA -880217088,880269311,US +880217088,880261119,US +880261120,880262143,SG +880262144,880263167,US +880263168,880264191,IE +880264192,880269311,US 880269312,880271359,JP 880271360,880543743,US 880543744,880545791,CA @@ -14000,14 +14737,58 @@ 880879234,880879234,CA 880879235,880881663,US 880881664,880885759,PR -880885760,881859327,US +880885760,881360895,US +881360896,881377279,GB +881377280,881410047,NL +881410048,881459199,US +881459200,881475583,CA +881475584,881491967,US +881491968,881524735,IE +881524736,881557503,CA +881557504,881573887,HK +881573888,881590271,SG +881590272,881639423,IN +881639424,881655807,JP +881655808,881672191,KR +881672192,881737727,US +881737728,881754111,IE +881754112,881770495,GB +881770496,881786879,NL +881786880,881819647,US +881819648,881836031,FR +881836032,881859327,US 881859328,881859583,CA 881859584,881868799,US 881868800,881876991,IT -881876992,882843337,US +881876992,882130943,US +882130944,882147327,SG +882147328,882163711,US +882163712,882180095,NL +882180096,882196479,US +882196480,882212863,NL +882212864,882327551,US +882327552,882343935,GB +882343936,882573311,US +882573312,882581503,CA +882581504,882589695,US +882589696,882597887,IE +882597888,882606079,JP +882606080,882638847,IE +882638848,882647039,CA +882647040,882655231,JP +882655232,882679807,US +882679808,882687999,AU +882688000,882704383,IE +882704384,882720767,US +882720768,882769919,NL +882769920,882802687,IE +882802688,882810879,AU +882810880,882843337,US 882843340,882843751,US -882843754,882851942,US -882851944,883097599,US +882843754,882851839,US +882851840,882851942,IN +882851944,882860031,IN +882860032,883097599,US 883097600,883163135,SG 883163136,883228671,IE 883228672,883294207,US @@ -14070,7 +14851,10 @@ 887652352,887654399,CA 887654400,887656447,AU 887656448,887656959,KR -887656960,887685119,US +887656960,887657215,US +887657216,887657471,NL +887657472,887657727,IE +887657728,887685119,US 887685120,887701503,CA 887701504,887717887,US 887717888,887750655,NL @@ -14097,7 +14881,14 @@ 888116288,888116351,CA 888116352,888120447,US 888120448,888120511,CA -888120512,888274943,US +888120512,888120735,US +888120736,888120767,KR +888120768,888120831,GB +888120832,888126207,US +888126208,888126335,GB +888126336,888126719,IN +888126720,888127103,CA +888127104,888274943,US 888274944,888291327,CA 888291328,888348671,US 888348672,888356863,JP @@ -14117,7 +14908,12 @@ 888488960,888491007,US 888491008,888492031,IN 888492032,888493055,SG -888493056,888569855,US +888493056,888494079,IN +888494080,888495103,IE +888495104,888496127,JP +888496128,888497151,IN +888497152,888498175,KR +888498176,888569855,US 888569856,888573951,HK 888573952,888578047,US 888578048,888586239,JP @@ -14126,9 +14922,19 @@ 888758272,889016319,US 889016320,889020415,SG 889020416,889028607,JP -889028608,889061375,US -889061376,889094143,JP -889094144,889192447,US +889028608,889036799,US +889036800,889039871,IN +889039872,889041919,JP +889041920,889042943,NL +889042944,889043967,IE +889043968,889046015,KR +889046016,889048063,CA +889048064,889050111,AU +889050112,889051135,SG +889051136,889052159,HK +889052160,889135103,US +889135104,889143295,AU +889143296,889192447,US 889192448,897238054,DE 897238056,905969663,DE 905969664,910163967,US @@ -14156,7 +14962,9 @@ 916191011,916193279,IE 916193280,916979711,US 916979712,917045247,JP -917045248,917110783,SG +917045248,917089018,SG +917089019,917089019,IN +917089020,917110783,SG 917110784,917241855,IE 917241856,917635071,US 917635072,917700607,JP @@ -14202,9 +15010,7 @@ 921657344,921657599,JP 921657600,921658111,US 921658112,921658879,IE -921658880,921661951,US -921661952,921662207,IE -921662208,921662463,US +921658880,921662463,US 921662464,921665535,KR 921665536,921747455,US 921747456,921748479,AU @@ -14220,10 +15026,7 @@ 921755648,921755903,US 921755904,921756159,JP 921756160,921756671,SG -921756672,921758719,US -921758720,921759743,KR -921759744,921759999,DE -921760000,921760767,US +921756672,921760767,US 921760768,921761791,BR 921761792,922091519,US 922091520,922189311,IE @@ -14523,8 +15326,8 @@ 962854912,962856959,SG 962856960,964689919,FR 964689920,968753151,BE -968753152,968761343,NL -968761344,968818687,CH +968753152,968757247,NL +968757248,968818687,CH 968818688,968819711,DE 968819712,968851455,BE 968851456,968852479,US @@ -14843,7 +15646,8 @@ 1024262144,1024327679,SG 1024327680,1024327935,US 1024327936,1024328191,AU -1024328192,1024328703,US +1024328192,1024328447,HK +1024328448,1024328703,US 1024328704,1024329727,CN 1024329728,1024330751,JP 1024330752,1024331775,AU @@ -14912,7 +15716,9 @@ 1026408448,1026416639,JP 1026416640,1026420735,CN 1026420736,1026422783,JP -1026422784,1026424831,AU +1026422784,1026423039,AU +1026423040,1026423295,SG +1026423296,1026424831,AU 1026424832,1026490623,JP 1026490624,1026491135,SG 1026491136,1026491903,JP @@ -15006,7 +15812,9 @@ 1040449536,1040457727,FR 1040457728,1040465919,ME 1040465920,1040474111,DE -1040474112,1040482303,CZ +1040474112,1040477183,CZ +1040477184,1040477184,KG +1040477185,1040482303,CZ 1040482304,1040515071,BE 1040515072,1040547839,GB 1040547840,1040580607,RU @@ -15025,14 +15833,16 @@ 1040983552,1040983807,FO 1040983808,1040990207,DK 1040990208,1040998399,CY -1040998400,1041002495,EG +1040998400,1041002495,SD 1041002496,1041004543,KE 1041004544,1041006591,EG 1041006592,1041039359,CH 1041039360,1041072127,SE 1041072128,1041080319,GB 1041080320,1041088511,IT -1041088512,1041096703,AT +1041088512,1041093631,AT +1041093632,1041094143,US +1041094144,1041096703,AT 1041096704,1041235967,ES 1041235968,1041244159,UA 1041244160,1041252351,RU @@ -15060,7 +15870,9 @@ 1041728560,1041728655,FR 1041728656,1041728671,IT 1041728672,1041748991,FR -1041749248,1041760255,FR +1041749248,1041752319,FR +1041752320,1041752575,AT +1041752576,1041760255,FR 1041760256,1041768447,DE 1041768448,1041776639,NO 1041776640,1041784831,CZ @@ -15150,10 +15962,11 @@ 1043897344,1043897855,NG 1043897856,1043899391,GB 1043899392,1043899647,CG -1043899648,1043907071,GB -1043907072,1043907327,NG -1043907328,1043910143,GB -1043910400,1043919442,GB +1043899648,1043902463,GB +1043902464,1043908607,US +1043908608,1043910143,DE +1043910400,1043910655,DE +1043910656,1043919442,GB 1043919443,1043919443,SS 1043919444,1043920895,GB 1043920896,1043921919,UG @@ -15202,7 +16015,9 @@ 1044589056,1044589311,DE 1044589312,1044625631,GB 1044625632,1044625647,RS -1044625648,1044636671,GB +1044625648,1044627391,GB +1044627392,1044627455,ES +1044627456,1044636671,GB 1044636672,1044637695,DE 1044637696,1044638463,GB 1044638464,1044638719,DE @@ -15222,7 +16037,9 @@ 1044692423,1044692423,IM 1044692424,1044692991,GG 1044692992,1044697087,AT -1044697088,1044699135,DE +1044697088,1044697343,DE +1044697344,1044698111,AT +1044698112,1044699135,DE 1044699136,1044701183,AT 1044701184,1044709375,EG 1044709376,1044717567,RU @@ -15320,7 +16137,8 @@ 1045323776,1045364735,FI 1045364736,1045430271,DK 1045430272,1045446655,DE -1045446656,1045454847,SK +1045446656,1045453823,HU +1045453824,1045454847,SK 1045454848,1045460991,DE 1045460992,1045461503,FR 1045461504,1045461631,DE @@ -15346,9 +16164,7 @@ 1045755904,1045757951,UA 1045757952,1045790719,LV 1045790720,1045798911,FR -1045798912,1045824355,IT -1045824356,1045824359,SI -1045824360,1045889023,IT +1045798912,1045889023,IT 1045889024,1045921791,ES 1045921792,1045954559,PL 1045954560,1045987327,BE @@ -15393,7 +16209,9 @@ 1046482952,1046482952,DE 1046482953,1046483199,GB 1046483200,1046483231,DE -1046483232,1046485303,GB +1046483232,1046484711,GB +1046484712,1046484719,DE +1046484720,1046485303,GB 1046485304,1046485311,DE 1046485312,1046485903,GB 1046485904,1046485911,DE @@ -15411,7 +16229,9 @@ 1046489472,1046489487,ES 1046489488,1046489503,GB 1046489504,1046489519,DE -1046489520,1046489999,GB +1046489520,1046489975,GB +1046489976,1046489983,DE +1046489984,1046489999,GB 1046490000,1046490007,DE 1046490008,1046492471,GB 1046492472,1046492479,DE @@ -15455,11 +16275,7 @@ 1046498688,1046498695,DE 1046498696,1046498799,GB 1046498800,1046498807,DE -1046498808,1046499255,GB -1046499256,1046499263,DE -1046499264,1046499367,GB -1046499368,1046499375,DE -1046499376,1046502106,GB +1046498808,1046502106,GB 1046502107,1046502108,DE 1046502109,1046503095,GB 1046503096,1046503103,DE @@ -15485,7 +16301,9 @@ 1046524488,1046524495,DE 1046524496,1046524615,GB 1046524616,1046524623,DE -1046524624,1046525351,GB +1046524624,1046524647,GB +1046524648,1046524655,DE +1046524656,1046525351,GB 1046525352,1046525359,DE 1046525360,1046525439,GB 1046525440,1046525695,DE @@ -15493,7 +16311,9 @@ 1046525952,1046527999,DE 1046528000,1046528335,GB 1046528336,1046528383,DE -1046528384,1046528535,GB +1046528384,1046528505,GB +1046528506,1046528506,DE +1046528507,1046528535,GB 1046528536,1046528543,DE 1046528544,1046529023,GB 1046529024,1046530047,DE @@ -15507,8 +16327,8 @@ 1046533538,1046533538,DE 1046533539,1046533615,GB 1046533616,1046533631,DE -1046533632,1046535439,GB -1046535440,1046535448,DE +1046533632,1046535447,GB +1046535448,1046535448,DE 1046535449,1046535623,GB 1046535624,1046535631,DE 1046535632,1046535665,GB @@ -15552,10 +16372,10 @@ 1046773760,1046781951,FR 1046781952,1046791167,GB 1046791168,1046792191,IT -1046792192,1046793215,IN +1046792192,1046793215,US 1046793216,1046794239,GB -1046794240,1046794495,US -1046794496,1046796287,GB +1046794240,1046795007,US +1046795008,1046796287,GB 1046796288,1046797311,US 1046797312,1046798335,GB 1046798336,1046806527,HU @@ -15612,8 +16432,7 @@ 1047527424,1047529471,US 1047529472,1047530495,NL 1047530496,1047531007,GB -1047531008,1047531263,RS -1047531264,1047533567,BE +1047531008,1047533567,BE 1047533568,1047534847,DE 1047534848,1047535103,BE 1047535104,1047535359,US @@ -15670,12 +16489,14 @@ 1047658496,1047724031,EG 1047728128,1047732223,SE 1047735770,1047735770,DE +1047736552,1047736553,US 1047740544,1047740671,DE 1047758911,1047758911,CZ 1047759119,1047759119,AT 1047759125,1047759125,AT 1047759754,1047759754,FR 1047759834,1047759834,CZ +1047763266,1047763267,SE 1047781856,1047781871,DE 1047782690,1047782690,GB 1047787520,1047787775,ES @@ -15759,6 +16580,8 @@ 1048981248,1048981503,GB 1048987480,1048987487,DE 1048991960,1048991967,DE +1048992528,1048992535,DE +1048992608,1048992615,DE 1049006080,1049006335,DE 1049008128,1049009151,DE 1049016320,1049018367,DE @@ -15797,14 +16620,10 @@ 1049493504,1049559039,FI 1049559040,1049698303,DE 1049698304,1049699071,NL -1049699328,1049699583,NL -1049699584,1049699839,BW -1049699840,1049700351,NL +1049699328,1049700351,NL 1049700352,1049702399,DE 1049702400,1049706495,NL -1049706496,1049716735,GB -1049716736,1049717759,IQ -1049717760,1049722879,GB +1049706496,1049722879,GB 1049722880,1049731071,IS 1049731072,1049739263,FI 1049739264,1049755647,NL @@ -15919,7 +16738,7 @@ 1051984752,1051984767,DE 1051990016,1051991039,DE 1052001280,1052002303,DE -1052011264,1052012031,DE +1052011264,1052012287,DE 1052017536,1052017567,DE 1052041216,1052041471,DE 1052041472,1052043215,GB @@ -17006,9 +17825,7 @@ 1056874752,1056874943,IE 1056874944,1056874975,GB 1056874976,1056875007,IE -1056875008,1056875663,GB -1056875664,1056875671,IE -1056875672,1056964607,GB +1056875008,1056964607,GB 1056964608,1061227263,US 1061227264,1061227519,BO 1061227520,1061558271,US @@ -17067,7 +17884,11 @@ 1064221952,1064222207,MX 1064222208,1064445183,US 1064445184,1064445439,PK -1064445440,1065493759,US +1064445440,1065372927,US +1065372928,1065372959,PR +1065372960,1065372991,US +1065372992,1065373055,PR +1065373056,1065493759,US 1065493760,1065494015,GB 1065494016,1065506047,US 1065506048,1065506559,GB @@ -17151,7 +17972,9 @@ 1068017664,1068018175,YE 1068018176,1068123135,US 1068123136,1068123647,BB -1068123648,1068175871,US +1068123648,1068157847,US +1068157848,1068157851,CA +1068157852,1068175871,US 1068175872,1068176383,YE 1068176384,1068199935,US 1068199936,1068204031,CA @@ -17308,7 +18131,9 @@ 1073049065,1073049065,CW 1073049066,1073049599,US 1073049600,1073052671,BS -1073052672,1073116159,US +1073052672,1073075199,US +1073075200,1073075455,CA +1073075456,1073116159,US 1073116160,1073117183,GB 1073117184,1073118207,US 1073118208,1073118719,NL @@ -17455,21 +18280,23 @@ 1074937856,1074946047,CA 1074946048,1074962431,US 1074962432,1074970623,CA -1074970624,1075265535,US +1074970624,1074976703,US +1074976704,1074976735,GB +1074976736,1075265535,US 1075265536,1075269631,KR 1075269632,1075421183,US 1075421184,1075429375,CA 1075429376,1075478527,US 1075478528,1075494911,CA -1075494912,1075576831,US +1075494912,1075558655,US +1075558656,1075558911,VI +1075558912,1075576831,US 1075576832,1075576895,NO 1075576896,1075576896,SE 1075576897,1075585023,NO 1075585024,1075609599,US 1075609600,1075613695,TT -1075617792,1075769343,US -1075769344,1075773439,CA -1075773440,1075855359,US +1075617792,1075855359,US 1075855360,1075871743,DO 1075871744,1075904511,US 1075904512,1075920895,JP @@ -17535,9 +18362,7 @@ 1076005632,1076006399,US 1076006400,1076006655,CA 1076006656,1076006911,US -1076006912,1076007167,CA -1076007168,1076007423,US -1076007424,1076007935,CA +1076006912,1076007935,CA 1076007936,1076008447,US 1076008448,1076009215,CA 1076009216,1076009727,US @@ -17601,14 +18426,13 @@ 1076424704,1076428799,CA 1076428800,1076543487,US 1076543488,1076559871,CA -1076559872,1076625407,US -1076690944,1076756479,US +1076559872,1076756479,US 1076756480,1076772863,CA 1076772864,1076823009,US 1076823010,1076823011,CR 1076823012,1076850687,US -1076850688,1076850943,CA -1076850944,1076855044,US +1076850688,1076851711,CA +1076851712,1076855044,US 1076855045,1076855045,MX 1076855046,1076879505,US 1076879506,1076879507,CA @@ -17658,9 +18482,7 @@ 1077977088,1077985279,CA 1077985280,1077993471,US 1077993472,1078001663,CA -1078001664,1078065039,US -1078065040,1078065047,CA -1078065048,1078067199,US +1078001664,1078067199,US 1078067200,1078071295,BS 1078071296,1078075391,CA 1078075392,1078124543,US @@ -17735,7 +18557,9 @@ 1078517760,1078525951,CA 1078525952,1078575359,US 1078575360,1078575615,CA -1078575616,1078722559,US +1078575616,1078594815,US +1078594816,1078594943,HK +1078594944,1078722559,US 1078722560,1078734847,AR 1078734848,1078737919,CO 1078737920,1078738943,EC @@ -17765,9 +18589,7 @@ 1079320576,1079322831,CA 1079322832,1079322839,US 1079322840,1079328767,CA -1079328768,1079378175,US -1079378176,1079378943,CA -1079378944,1079379199,US +1079328768,1079379199,US 1079379200,1079379455,CA 1079379456,1079383039,US 1079383040,1079383295,VG @@ -17840,15 +18662,13 @@ 1079567360,1079567615,AU 1079567616,1079574527,US 1079574528,1079578623,PR -1079582720,1079623679,US +1079578624,1079623679,US 1079623680,1079627775,PR 1079627776,1079664639,US 1079664640,1079668735,CA 1079668736,1079669247,US 1079669248,1079669759,NL -1079669760,1079675903,US -1079675904,1079676415,CA -1079676416,1079861247,US +1079669760,1079861247,US 1079861248,1079865343,CA 1079865344,1079917055,US 1079917056,1079917311,KY @@ -17909,7 +18729,9 @@ 1081037312,1081037567,CA 1081037568,1081038335,US 1081038336,1081040895,CA -1081040896,1081212927,US +1081040896,1081129983,US +1081129984,1081130495,CA +1081130496,1081212927,US 1081212928,1081278463,CA 1081278464,1081369599,US 1081369600,1081370111,CO @@ -17983,7 +18805,9 @@ 1082945536,1082949631,CA 1082949632,1082982399,US 1082982400,1083015167,CA -1083015168,1083267583,US +1083015168,1083142399,US +1083142400,1083142655,IN +1083142656,1083267583,US 1083267584,1083268095,JP 1083268096,1083396095,US 1083396096,1083400191,BM @@ -18038,9 +18862,13 @@ 1087398912,1087399423,GB 1087399424,1087405407,US 1087405408,1087405423,MX -1087405424,1087413895,US +1087405424,1087413879,US +1087413880,1087413883,ES +1087413884,1087413895,US 1087413896,1087413903,DE -1087413904,1087416985,US +1087413904,1087414783,US +1087414784,1087415039,CA +1087415040,1087416985,US 1087416986,1087416986,GB 1087416987,1087418367,US 1087418368,1087419391,GB @@ -18059,7 +18887,7 @@ 1087466888,1087496703,US 1087496704,1087496959,CA 1087496960,1087501471,US -1087501472,1087501479,GB +1087501472,1087501479,HK 1087501480,1087501535,US 1087501536,1087501695,HK 1087501696,1087501775,US @@ -18094,19 +18922,21 @@ 1087725568,1087726015,GB 1087726016,1087726047,FR 1087726048,1087727615,GB -1087727616,1087741951,US +1087727616,1087735743,US +1087735744,1087735807,CA +1087735808,1087741951,US 1087741952,1087743569,FR 1087743570,1087743570,GB 1087743571,1087743597,FR 1087743598,1087743598,US 1087743599,1087746047,FR 1087746048,1087758335,US -1087758336,1087761919,PR -1087761920,1087762431,US -1087762432,1087766527,PR +1087758336,1087766527,PR 1087766528,1087798943,US 1087798944,1087798975,CA -1087798976,1087837359,US +1087798976,1087821567,US +1087821568,1087821823,GB +1087821824,1087837359,US 1087837360,1087837367,BR 1087837368,1087837695,US 1087837696,1087837951,BR @@ -18127,9 +18957,7 @@ 1087950120,1088012767,US 1088012768,1088012775,PR 1088012776,1088684031,US -1088684032,1088740351,CA -1088740352,1088741375,US -1088741376,1088946175,CA +1088684032,1088946175,CA 1088946176,1089055999,US 1089056256,1089057279,US 1089057536,1089151231,US @@ -18138,7 +18966,9 @@ 1089152256,1089152511,NL 1089152512,1089153279,US 1089153280,1089153535,SG -1089153536,1089167359,US +1089153536,1089154303,US +1089154304,1089154559,SG +1089154560,1089167359,US 1089167360,1089171455,CA 1089171456,1089183231,US 1089183232,1089183487,GB @@ -18176,14 +19006,8 @@ 1089462528,1089462783,US 1089462784,1089463039,CA 1089463040,1089463295,US -1089463296,1089464319,CA -1089464320,1089465855,US -1089465856,1089466367,GB -1089466368,1089526783,US -1089526784,1089527039,VE -1089527040,1089579519,US -1089579520,1089580031,VE -1089580032,1089881599,US +1089463296,1089465343,CA +1089465344,1089881599,US 1089881600,1089882111,GB 1089882112,1089882623,US 1089882624,1089883135,GB @@ -18274,8 +19098,8 @@ 1093120416,1093120431,CA 1093120432,1093120511,US 1093120512,1093120767,GB -1093120768,1093121023,US -1093121024,1093122047,CA +1093120768,1093121535,US +1093121536,1093122047,CA 1093122048,1093122175,US 1093122176,1093122303,CA 1093122304,1093122751,US @@ -18286,13 +19110,13 @@ 1093123952,1093123967,CA 1093123968,1093126143,US 1093126144,1093126399,CA -1093126400,1093126911,US -1093126912,1093127167,CA -1093127168,1093128447,US -1093128448,1093129215,CA +1093126400,1093128447,US +1093128448,1093128703,CA +1093128704,1093128959,US +1093128960,1093129215,CA 1093129216,1093130751,US -1093130752,1093131007,CA -1093131008,1093132543,US +1093130752,1093131263,CA +1093131264,1093132543,US 1093132544,1093133055,CA 1093133056,1093135359,US 1093135360,1093135615,CA @@ -18347,12 +19171,7 @@ 1094064872,1094064887,IE 1094064888,1094065087,US 1094065088,1094065119,IE -1094065120,1094065151,US -1094065152,1094065535,NL -1094065536,1094065855,US -1094065856,1094066047,NL -1094066048,1094066159,US -1094066160,1094066175,NL +1094065120,1094066175,US 1094066176,1094066407,IE 1094066408,1094066415,US 1094066416,1094066431,IE @@ -18390,7 +19209,9 @@ 1094124544,1094124799,IE 1094124800,1094139039,US 1094139040,1094139051,IE -1094139052,1094146047,US +1094139052,1094139063,US +1094139064,1094139067,CN +1094139068,1094146047,US 1094146048,1094146079,KR 1094146080,1094146111,HK 1094146112,1094146143,SG @@ -18435,20 +19256,18 @@ 1097785344,1097830399,US 1097830400,1097834495,CA 1097834496,1097896191,US -1097896192,1097896447,VI -1097896448,1097896959,US -1097896960,1097897215,VI -1097897216,1097948415,US -1097948416,1097948927,VI -1097948928,1097951743,US -1097951744,1097951999,VI -1097952000,1097952255,US -1097952256,1097953279,VI +1097896192,1097897471,VI +1097897472,1097947135,US +1097947136,1097949183,VI +1097949184,1097951231,US +1097951232,1097953279,VI 1097953280,1098070271,US 1098070272,1098070279,GR 1098070280,1098070295,US 1098070296,1098070303,BE -1098070304,1098178383,US +1098070304,1098096287,US +1098096288,1098096295,BR +1098096296,1098178383,US 1098178384,1098178391,CA 1098178392,1098891623,US 1098891624,1098891631,AU @@ -18480,9 +19299,7 @@ 1101425920,1101426175,EC 1101426176,1101459455,US 1101459456,1101461503,BB -1101461504,1101469695,US -1101469696,1101471743,HN -1101471744,1101475839,US +1101461504,1101475839,US 1101475840,1101479935,CO 1101479936,1101484031,US 1101484032,1101488127,CO @@ -18514,9 +19331,7 @@ 1101869056,1101869567,GH 1101869568,1101871103,US 1101871104,1101873151,BO -1101873152,1101905407,US -1101905408,1101905663,GH -1101905664,1101992063,US +1101873152,1101992063,US 1101992064,1101992191,NL 1101992192,1102004735,US 1102004736,1102004991,IN @@ -18637,7 +19452,9 @@ 1109934592,1109934847,GB 1109934848,1110126591,US 1110126592,1110130687,CA -1110130688,1110270207,US +1110130688,1110248623,US +1110248624,1110248631,CA +1110248632,1110270207,US 1110270208,1110270335,CA 1110270336,1110310911,US 1110310912,1110376447,CA @@ -18677,11 +19494,13 @@ 1110473984,1110474239,CA 1110474240,1110540287,US 1110540288,1110573055,CA -1110573056,1110587391,PR -1110587392,1110595776,US -1110595777,1110598655,PR -1110598656,1110599167,US -1110599168,1110638591,PR +1110573056,1110591487,PR +1110591488,1110593023,US +1110593024,1110593279,PR +1110593280,1110593535,US +1110593536,1110595583,PR +1110595584,1110595776,US +1110595777,1110638591,PR 1110638592,1110642687,US 1110642688,1110644735,CA 1110644736,1110654463,US @@ -18710,21 +19529,35 @@ 1111195648,1111212031,CA 1111220224,1111228415,US 1111228416,1111244799,AR -1111244800,1111982079,US +1111244800,1111916543,US +1111916544,1111922687,CA +1111922688,1111924735,US +1111924736,1111928831,CA +1111928832,1111929855,US +1111929856,1111931135,CA +1111931136,1111931391,US +1111931392,1111931903,CA +1111931904,1111932927,US +1111932928,1111938047,CA +1111938048,1111941119,US +1111941120,1111943167,CA +1111943168,1111982079,US 1111982080,1111998463,IT -1111998464,1112424447,US +1111998464,1112408063,US +1112408064,1112410111,IL +1112410112,1112412671,US +1112412672,1112413183,NL +1112413184,1112413695,CH +1112413696,1112414207,CA +1112414208,1112424447,US 1112432640,1112440831,CA 1112440832,1112498175,US -1112498176,1112500223,IR -1112500224,1112500735,US -1112500736,1112501247,IR -1112501248,1112502271,US -1112502272,1112502527,IR -1112502528,1112502783,US -1112502784,1112504319,IR -1112504320,1112530943,US +1112498176,1112506367,IR +1112506368,1112530943,US 1112530944,1112539135,CA -1112539136,1112867327,US +1112539136,1112653823,US +1112653824,1112657919,VG +1112657920,1112867327,US 1112867328,1112867583,BS 1112867584,1112869887,US 1112869888,1112870143,CA @@ -18738,8 +19571,7 @@ 1112907776,1112907783,CA 1112907784,1112931327,US 1112931328,1112931839,CA -1112931840,1112932095,US -1112932352,1113591807,US +1112931840,1113591807,US 1113591808,1113595903,CA 1113595904,1113596415,CL 1113596416,1113596927,GT @@ -18763,9 +19595,9 @@ 1113661440,1113669631,US 1113669632,1113677823,CA 1113677824,1113681919,US -1113686016,1113696575,US -1113696576,1113696639,CA -1113696640,1113718783,US +1113686016,1113697279,US +1113697280,1113697791,BM +1113697792,1113718783,US 1113718784,1113743359,DO 1113743360,1113854207,US 1113854208,1113854463,CA @@ -18794,8 +19626,10 @@ 1114513408,1114513471,SA 1114513472,1114513571,US 1114513572,1114513599,SA -1114513600,1114514687,US -1114514688,1114515455,SA +1114513600,1114514719,US +1114514720,1114514751,SA +1114514752,1114514943,US +1114514944,1114515455,SA 1114515456,1114515463,US 1114515464,1114515471,CA 1114515472,1114517503,US @@ -18806,7 +19640,9 @@ 1114520576,1114520831,PH 1114520832,1114523971,US 1114523972,1114523975,BM -1114523976,1114524031,US +1114523976,1114523999,US +1114524000,1114524007,BM +1114524008,1114524031,US 1114524032,1114524415,JM 1114524416,1114524671,ZA 1114524672,1114533375,US @@ -18819,9 +19655,7 @@ 1114681344,1114685439,CA 1114685440,1114730495,US 1114730496,1114734591,CA -1114734592,1114877183,US -1114877184,1114877439,CY -1114877440,1115112575,US +1114734592,1115112575,US 1115112576,1115112607,IN 1115112608,1115113471,US 1115113472,1115114495,HN @@ -18829,9 +19663,7 @@ 1115114752,1115115007,GT 1115115008,1115115519,US 1115115520,1115116543,HN -1115116544,1115117055,US -1115117056,1115117311,GB -1115117312,1115117567,US +1115116544,1115117567,US 1115117568,1115118591,HN 1115118592,1115119615,SV 1115119616,1115127807,US @@ -18933,9 +19765,7 @@ 1118141184,1118141439,CA 1118141440,1118141695,US 1118141696,1118141951,CA -1118141952,1118155183,US -1118155184,1118155199,CA -1118155200,1118158847,US +1118141952,1118158847,US 1118158848,1118167039,CA 1118167040,1118474239,US 1118474240,1118478335,CA @@ -18990,25 +19820,15 @@ 1118989312,1118989823,KE 1118989824,1118994175,US 1118994176,1118994431,LR -1118994432,1119109119,US +1118994432,1119072255,US +1119072256,1119073279,CA +1119073280,1119109119,US 1119109120,1119109375,CA 1119109376,1119109631,US 1119109632,1119109887,CA 1119109888,1119110143,US 1119110144,1119111167,CA -1119111168,1119166463,US -1119171072,1119171327,US -1119171360,1119171383,US -1119171384,1119171391,CA -1119171392,1119171583,US -1119172056,1119172063,US -1119172096,1119172159,US -1119172192,1119172199,US -1119172200,1119172207,CA -1119172256,1119172263,US -1119172352,1119172863,US -1119172864,1119173631,MX -1119174656,1119199231,US +1119111168,1119199231,US 1119199232,1119207169,MN 1119207170,1119207170,US 1119207171,1119207423,MN @@ -19171,16 +19991,19 @@ 1121005568,1121009663,CA 1121009664,1121038335,US 1121038336,1121042431,CA -1121042432,1121230847,US +1121042432,1121203199,US +1121203200,1121204223,JM +1121204224,1121205247,US +1121205248,1121205759,PR +1121205760,1121206271,LC +1121206272,1121230847,US 1121230848,1121239039,CA 1121239040,1121247231,US 1121247232,1121250303,CA 1121250304,1121250815,BZ 1121250816,1121252863,CA 1121252864,1121253119,BZ -1121253120,1121253887,CA -1121253888,1121254143,BZ -1121254144,1121255423,CA +1121253120,1121255423,CA 1121255424,1121763327,US 1121763328,1121767423,CA 1121767424,1121878015,US @@ -19208,14 +20031,18 @@ 1122476032,1122480127,PR 1122480128,1122493439,US 1122493440,1122493951,PR -1122493952,1122497327,US +1122493952,1122494463,US +1122494464,1122496511,PR +1122496512,1122497327,US 1122497328,1122497343,BR 1122497344,1122533375,US 1122533376,1122535423,GB 1122535424,1122538495,KR 1122538496,1122635775,US 1122635776,1122639871,CA -1122639872,1123123199,US +1122639872,1122667071,US +1122667072,1122667135,CH +1122667136,1123123199,US 1123123200,1123127295,CA 1123127296,1123180543,US 1123180544,1123184639,CA @@ -19295,7 +20122,9 @@ 1125147626,1125156304,US 1125156305,1125156305,DE 1125156306,1125228543,US -1125228544,1125229055,GB +1125228544,1125228647,GB +1125228648,1125228651,FI +1125228652,1125229055,GB 1125229056,1125237277,US 1125237278,1125237278,GB 1125237279,1125237919,US @@ -19346,7 +20175,9 @@ 1128817408,1128817663,NL 1128817664,1130535935,US 1130535936,1130536191,FR -1130536192,1133461247,US +1130536192,1130536959,US +1130536960,1130539007,GU +1130539008,1133461247,US 1133461248,1133461503,CA 1133461504,1133785351,US 1133785352,1133785359,IE @@ -19377,9 +20208,7 @@ 1137369088,1137371135,CA 1137371136,1137378815,US 1137378816,1137379071,UA -1137379072,1137385471,US -1137385472,1137387519,IL -1137387520,1137426431,US +1137379072,1137426431,US 1137426432,1137442815,PR 1137442816,1137491967,US 1137491968,1137508351,CA @@ -19387,16 +20216,17 @@ 1137524736,1137541119,CA 1137541120,1137623039,US 1137623040,1137639423,PR -1137639424,1137681583,US +1137639424,1137656831,US +1137656832,1137657855,GB +1137657856,1137658879,DE +1137658880,1137681583,US 1137681584,1137681599,AR 1137681600,1137704959,US 1137704960,1137712383,CA 1137712384,1137712639,US 1137712640,1137713151,CA 1137713152,1137717247,US -1137721344,1137758207,US -1137758208,1137758463,GB -1137758464,1137836031,US +1137721344,1137836031,US 1137840128,1137840383,CA 1137840384,1137840895,US 1137840896,1137841151,DE @@ -19437,7 +20267,9 @@ 1138180096,1138184191,US 1138184192,1138184447,SG 1138184448,1138184703,US -1138184704,1138184959,HK +1138184704,1138184714,CN +1138184715,1138184715,HK +1138184716,1138184959,CN 1138184960,1138185215,AU 1138185216,1138185727,CA 1138185728,1138185983,ZA @@ -19448,10 +20280,16 @@ 1138204672,1138212863,US 1138212864,1138216959,CA 1138216960,1138372607,US -1138372608,1138372863,AS -1138372864,1138374655,US -1138374656,1138374911,AS -1138374912,1138419711,US +1138372608,1138373631,AS +1138373632,1138373887,US +1138373888,1138374143,AS +1138374144,1138374399,US +1138374400,1138374911,AS +1138374912,1138375423,US +1138375424,1138375679,AS +1138375680,1138417407,US +1138417408,1138417663,CA +1138417664,1138419711,US 1138419712,1138419967,DE 1138419968,1138474239,US 1138474240,1138474751,CA @@ -19481,18 +20319,18 @@ 1138774016,1138778111,CA 1138778112,1138780671,US 1138780672,1138780679,CA -1138780680,1138786303,US +1138780680,1138781183,US +1138781184,1138781695,CA +1138781696,1138786303,US 1138786304,1138819071,PR 1138819072,1138851839,CA 1138851840,1138917375,US 1138917376,1138937855,CA 1138937856,1138941951,US 1138941952,1138950143,CA -1138950144,1138958335,US -1138958336,1138959103,IL -1138959104,1138959615,US -1138959616,1138959871,IL -1138959872,1138970111,US +1138950144,1138956799,US +1138956800,1138957311,CA +1138957312,1138970111,US 1138970112,1138970367,IN 1138970368,1139146751,US 1139146752,1139154943,GT @@ -19501,7 +20339,9 @@ 1139167744,1139168767,PR 1139168768,1139169279,US 1139169280,1139169791,PR -1139169792,1139176447,US +1139169792,1139170303,US +1139170304,1139171327,PR +1139171328,1139176447,US 1139176448,1139176703,PR 1139176704,1139179519,US 1139179520,1139195903,CA @@ -19509,15 +20349,7 @@ 1139216384,1139220479,CA 1139220480,1139265535,US 1139265536,1139269631,CA -1139269632,1143258367,US -1143258368,1143258495,CA -1143258496,1144098815,US -1144098816,1144099071,CA -1144099072,1144796287,US -1144796288,1144796799,CA -1144796800,1144866687,US -1144866688,1144866815,CA -1144866816,1145099519,US +1139269632,1145099519,US 1145099520,1145099697,SA 1145099698,1145099699,US 1145099700,1145099775,SA @@ -19552,7 +20384,9 @@ 1145503744,1145520127,CA 1145520128,1150287871,US 1150287872,1150812159,CA -1150812160,1151889407,US +1150812160,1151867903,US +1151867904,1151868927,CA +1151868928,1151889407,US 1151889408,1151892703,CA 1151892704,1151892711,DZ 1151892712,1151897599,CA @@ -19586,9 +20420,7 @@ 1157755248,1157755263,GR 1157755264,1157758207,US 1157758208,1157758463,RU -1157758464,1157913215,US -1157913216,1157913279,CA -1157913280,1157914194,US +1157758464,1157914194,US 1157914195,1157914202,IN 1157914203,1157931007,US 1157931008,1157935103,BS @@ -19605,14 +20437,11 @@ 1158152192,1158183467,US 1158183468,1158183468,GB 1158183469,1158234111,US -1158234112,1158242047,CA -1158242048,1158242303,US -1158242304,1158249727,CA -1158249728,1158295807,US +1158234112,1158250495,CA +1158250496,1158295807,US 1158295808,1158296063,GB 1158296064,1158316031,US 1158316032,1158318847,CA -1158319037,1158319037,CA 1158319104,1158322242,CA 1158322243,1158322243,US 1158322244,1158324223,CA @@ -19808,7 +20637,11 @@ 1161773056,1161777151,SZ 1161777152,1161818111,US 1161818112,1161822207,CA -1161822208,1161833967,US +1161822208,1161830852,US +1161830853,1161830853,BZ +1161830854,1161831181,US +1161831182,1161831182,BZ +1161831183,1161833967,US 1161833968,1161833975,DE 1161833976,1161834979,US 1161834980,1161834980,BZ @@ -19820,9 +20653,9 @@ 1161835227,1161835227,BZ 1161835228,1161835230,US 1161835231,1161835231,PH -1161835232,1161837174,US -1161837175,1161837175,BZ -1161837176,1161837567,US +1161835232,1161835948,US +1161835949,1161835949,BZ +1161835950,1161837567,US 1161837568,1161837823,JP 1161837824,1161885695,US 1161885696,1161886207,JP @@ -19931,29 +20764,21 @@ 1163538576,1163538591,CA 1163538592,1163539199,US 1163539200,1163539455,CA -1163539456,1163540351,US +1163539456,1163539711,US +1163539712,1163539967,CA +1163539968,1163540351,US 1163540352,1163540479,CA 1163540480,1163540735,US -1163540736,1163541503,CA -1163541504,1163542015,VG -1163542016,1163542527,CA +1163540736,1163542527,CA 1163542528,1163543295,US 1163543296,1163543551,CA -1163543552,1163544831,US -1163544832,1163545087,CA -1163545088,1163546015,US +1163543552,1163544575,US +1163544576,1163545599,CA +1163545600,1163546015,US 1163546016,1163546031,CA 1163546032,1163546623,US -1163546624,1163546879,CA -1163546880,1163547135,US -1163547136,1163547391,CA -1163547392,1163547647,US -1163547648,1163547903,CA -1163547904,1163548159,US -1163548160,1163549695,CA -1163549696,1163549951,US -1163549952,1163550207,CA -1163550208,1163550815,US +1163546624,1163550719,CA +1163550720,1163550815,US 1163550816,1163550831,CA 1163550832,1163550847,US 1163550848,1163550975,CA @@ -19986,10 +20811,8 @@ 1163565312,1163567103,US 1163567104,1163568127,CA 1163568128,1163571199,US -1163571200,1163571967,CA -1163571968,1163572223,US -1163572224,1163572479,CA -1163572480,1163573439,US +1163571200,1163573247,CA +1163573248,1163573439,US 1163573440,1163573503,IN 1163573504,1163575039,US 1163575040,1163575295,IN @@ -20022,7 +20845,8 @@ 1163588864,1163589631,CA 1163589632,1167851519,US 1167851520,1168113663,CA -1168113664,1168138239,US +1168113664,1168121855,MM +1168121856,1168138239,US 1168138240,1168146431,JM 1168146432,1168211967,US 1168211968,1168220159,CA @@ -20035,8 +20859,10 @@ 1168424960,1168461823,US 1168461824,1168465919,CA 1168465920,1168474111,US -1168474112,1168488447,CA -1168488448,1168490495,US +1168474112,1168488703,CA +1168488704,1168489471,US +1168489472,1168489983,CA +1168489984,1168490495,US 1168490496,1168506879,CA 1168506880,1168510975,US 1168510976,1168515071,CA @@ -20097,7 +20923,9 @@ 1168965120,1168965375,CA 1168965376,1168973823,US 1168973824,1168982015,CA -1168982016,1169203199,US +1168982016,1169031167,US +1169031168,1169035263,DE +1169035264,1169203199,US 1169203200,1169211391,CA 1169211392,1170190335,US 1170190336,1170190847,GB @@ -20194,8 +21022,8 @@ 1177033728,1177059327,US 1177059328,1177061375,CA 1177061376,1177062143,US -1177062144,1177075455,CA -1177075456,1177164415,US +1177062144,1177075711,CA +1177075712,1177164415,US 1177164416,1177164543,CA 1177164544,1177164863,US 1177164864,1177164895,CA @@ -20333,12 +21161,10 @@ 1210420480,1210421503,US 1210421504,1210421551,CA 1210421552,1210449919,US -1210449920,1210545471,CA -1210545472,1210545503,US -1210545504,1210557823,CA -1210557824,1210557951,US -1210557952,1210580991,CA -1210580992,1210865262,US +1210449920,1210580991,CA +1210580992,1210847231,US +1210847232,1210851327,BR +1210851328,1210865262,US 1210865263,1210865270,MY 1210865271,1210925055,US 1210925056,1210941439,CA @@ -20348,9 +21174,7 @@ 1211032272,1211032287,DO 1211032288,1211033087,US 1211033088,1211033599,CO -1211033600,1211035711,US -1211035712,1211035775,CA -1211035776,1211038007,US +1211033600,1211038007,US 1211038008,1211038011,TT 1211038012,1211038063,US 1211038064,1211038079,TT @@ -20399,8 +21223,7 @@ 1211391217,1211391217,IT 1211391218,1211432959,US 1211432960,1211473919,CA -1211473920,1211482111,US -1211498496,1211596799,US +1211473920,1211596799,US 1211596800,1211605999,CA 1211606000,1211606003,US 1211606004,1211613183,CA @@ -20425,28 +21248,20 @@ 1224091904,1224092159,NL 1224092160,1224094463,US 1224094464,1224094719,NL -1224094720,1224095231,US -1224095232,1224095487,NL -1224095488,1224104959,US -1224104960,1224105471,NL -1224105472,1224107007,US -1224107008,1224107519,NL -1224107520,1224112127,US -1224112128,1224113151,NL -1224113152,1224118271,US +1224094720,1224118271,US 1224118272,1224119807,NL 1224119808,1224124415,US 1224124416,1224126463,NL 1224126464,1224138751,US 1224138752,1224140799,NL -1224140800,1224151039,US -1224151040,1224152575,NL -1224152576,1224157695,US +1224140800,1224157695,US 1224157696,1224158207,NL 1224158208,1224167935,US 1224167936,1224169471,NL 1224169472,1224169983,US -1224169984,1224173567,NL +1224169984,1224171519,NL +1224171520,1224173055,US +1224173056,1224173567,NL 1224173568,1224184063,US 1224184064,1224184319,NL 1224184320,1224189951,US @@ -20463,9 +21278,7 @@ 1224200192,1224200959,NL 1224200960,1224201215,US 1224201216,1224202239,NL -1224202240,1224210431,US -1224210432,1224212479,NL -1224212480,1224327167,US +1224202240,1224327167,US 1224327168,1224327295,NL 1224327296,1224327935,US 1224327936,1224327943,CA @@ -20491,9 +21304,9 @@ 1224523559,1224523559,JM 1224523560,1224523775,US 1224523776,1224540159,JM -1224540160,1237189631,US -1237189632,1237189759,CA -1237189760,1241743359,US +1224540160,1224728575,US +1224728576,1224736767,HK +1224736768,1241743359,US 1241743360,1241759743,CA 1241759744,1242300415,US 1242300416,1242562559,CA @@ -20532,9 +21345,13 @@ 1247124480,1247124991,PR 1247124992,1247129599,US 1247129600,1247133695,NL -1247133696,1248864255,US +1247133696,1247498239,US +1247498240,1247502335,CA +1247502336,1248864255,US 1248864256,1248866303,CA -1248866304,1248885759,US +1248866304,1248877311,US +1248877312,1248877567,CA +1248877568,1248885759,US 1248885760,1248886783,CA 1248886784,1248899071,US 1248899072,1248900095,CA @@ -20554,7 +21371,9 @@ 1248946176,1248947199,VG 1248947200,1248964607,US 1248964608,1248966655,CA -1248966656,1248997375,US +1248966656,1248979711,US +1248979712,1248979967,IE +1248979968,1248997375,US 1248997376,1248998399,ID 1248999424,1249003519,US 1249003520,1249005567,CA @@ -20563,7 +21382,8 @@ 1249011712,1249019903,US 1249019904,1249020927,CA 1249020928,1249023999,US -1249026048,1249029119,US +1249024000,1249025023,CA +1249025536,1249029119,US 1249029120,1249030143,CA 1249030144,1249036287,US 1249036288,1249037311,TC @@ -20580,8 +21400,7 @@ 1249103104,1249103871,CA 1249103872,1249106943,US 1249106944,1249107967,CA -1249107968,1249128447,US -1249129472,1249130495,US +1249107968,1249130495,US 1249130496,1249131519,JM 1249131520,1249139711,US 1249139712,1249140268,MF @@ -20591,7 +21410,9 @@ 1249142016,1249142271,GB 1249142272,1249146879,US 1249146880,1249147903,CA -1249147904,1249163263,US +1249147904,1249160703,US +1249160704,1249161215,GB +1249161216,1249163263,US 1249163264,1249165311,CA 1249165312,1249171455,US 1249171456,1249173503,CA @@ -20675,12 +21496,11 @@ 1249710144,1249710207,CN 1249710208,1249710271,NL 1249710272,1249710591,BE -1249710592,1249710847,NL -1249710848,1249716479,US +1249710592,1249716479,US 1249716480,1249716735,TW 1249716736,1249717759,US 1249717760,1249718015,FI -1249718016,1249718271,NL +1249718016,1249718271,BE 1249718272,1249720319,US 1249720320,1249720351,AU 1249720352,1249720367,JP @@ -20754,10 +21574,16 @@ 1249721836,1249722111,US 1249722112,1249722367,IN 1249722368,1249724671,US -1249724672,1249724694,NL -1249724696,1249724927,NL +1249724672,1249724694,BE +1249724696,1249724927,BE 1249724928,1249725183,FI -1249725184,1249736959,US +1249725184,1249726207,US +1249726208,1249726463,FI +1249726464,1249726719,US +1249726720,1249726975,IE +1249726976,1249734655,US +1249734656,1249734911,FI +1249734912,1249736959,US 1249737472,1249752319,US 1249752320,1249752575,BE 1249752576,1249754111,US @@ -20822,9 +21648,7 @@ 1256054400,1256054783,CZ 1256054784,1256079359,US 1256079360,1256087551,KY -1256087552,1262783886,US -1262783887,1262783887,CA -1262783888,1263525887,US +1256087552,1263525887,US 1263525888,1263534079,CA 1263534080,1264717823,US 1264717824,1264718079,CA @@ -20861,9 +21685,7 @@ 1275674624,1275707391,US 1275707392,1275711487,CA 1275711488,1275712511,US -1275712512,1275714047,CA -1275714048,1275714559,US -1275714560,1275715583,CA +1275712512,1275715583,CA 1275715584,1275756543,US 1275756544,1275772927,CA 1275772928,1275789311,US @@ -20911,10 +21733,8 @@ 1279974016,1279975423,US 1279975424,1279976959,CA 1279976960,1279977215,US -1279977216,1279977471,CA -1279977472,1279977727,US -1279977728,1279977983,CA -1279977984,1279979775,US +1279977216,1279978495,CA +1279978496,1279979775,US 1279979776,1279980031,CA 1279980032,1279980287,US 1279980288,1279981567,CA @@ -20939,8 +21759,8 @@ 1280126976,1280131071,JP 1280131072,1280139263,CA 1280139264,1280242175,US -1280242176,1280242687,CA -1280242688,1291845631,US +1280242176,1280243199,CA +1280243200,1291845631,US 1291845632,1292894207,DE 1292894208,1293156351,NO 1293156352,1293549567,DE @@ -20964,7 +21784,9 @@ 1294532608,1294598143,RU 1294598144,1294606335,IT 1294606336,1294610431,IR -1294610432,1294619647,IT +1294610432,1294611455,IT +1294611456,1294611711,IR +1294611712,1294619647,IT 1294619648,1294626815,IR 1294626816,1294630911,IT 1294630912,1294663679,LB @@ -21002,13 +21824,7 @@ 1296237056,1296237311,FR 1296237312,1296237439,IE 1296237440,1296237567,IT -1296237568,1296237823,IE -1296237824,1296237824,GB -1296237825,1296237825,IE -1296237826,1296237826,GB -1296237827,1296237878,IE -1296237879,1296237879,GB -1296237880,1296238591,IE +1296237568,1296238591,GB 1296238592,1296239103,NL 1296239104,1296239231,IE 1296239232,1296239359,NL @@ -21038,8 +21854,7 @@ 1296248448,1296248575,DE 1296248576,1296248703,IE 1296248704,1296248831,FR -1296248832,1296248959,IE -1296248960,1296249023,DE +1296248832,1296249023,IE 1296249024,1296249087,GB 1296249088,1296249279,IE 1296249280,1296249343,DE @@ -21143,7 +21958,9 @@ 1296578560,1296580607,FI 1296580608,1296582655,CH 1296582656,1296584703,IE -1296584704,1296586751,RU +1296584704,1296585215,RU +1296585216,1296585471,GB +1296585472,1296586751,RU 1296586752,1296588799,FR 1296588800,1296590847,SE 1296590848,1296592895,ES @@ -21282,7 +22099,9 @@ 1297072128,1297088511,PL 1297088512,1297121279,AT 1297121280,1297154047,SE -1297154048,1297154815,RO +1297154048,1297154303,RO +1297154304,1297154559,US +1297154560,1297154815,RO 1297154816,1297155071,MD 1297155072,1297155583,RO 1297155584,1297156095,SE @@ -21314,7 +22133,7 @@ 1297184768,1297185279,BZ 1297185280,1297185791,RO 1297185792,1297185919,NL -1297185920,1297186815,RO +1297185920,1297186815,US 1297186816,1297188863,IR 1297188864,1297190143,RO 1297190144,1297190399,ES @@ -21322,7 +22141,8 @@ 1297190656,1297190911,IT 1297190912,1297195007,IR 1297195008,1297195135,NL -1297195136,1297196799,RO +1297195136,1297196031,US +1297196032,1297196799,RO 1297196800,1297197055,CN 1297197056,1297202175,RO 1297202176,1297202687,SE @@ -21381,7 +22201,8 @@ 1297727488,1297743871,MD 1297743872,1297760255,DE 1297760256,1297776639,LT -1297776640,1297793023,DE +1297776640,1297784831,DE +1297784832,1297793023,PT 1297793024,1297809407,UA 1297809408,1297825791,PL 1297825792,1297838079,RU @@ -21463,11 +22284,7 @@ 1298137088,1298661375,GB 1298661376,1298677759,FR 1298677760,1298694143,IR -1298694144,1298705663,US -1298705664,1298706175,GB -1298706176,1298709503,US -1298709504,1298710271,IT -1298710272,1298710527,US +1298694144,1298710527,US 1298710528,1298726911,CZ 1298726912,1298743295,RS 1298743296,1298757631,FI @@ -21508,12 +22325,13 @@ 1299103744,1299120127,NO 1299120128,1299136511,SI 1299136512,1299169279,HU -1299169280,1299172863,GB -1299172864,1299173375,NL +1299169280,1299171327,GB +1299171328,1299172351,US +1299172352,1299173375,GB 1299173376,1299174399,FR 1299174400,1299178495,GB -1299178496,1299179519,CH -1299179520,1299185663,FR +1299178496,1299180543,CH +1299180544,1299185663,FR 1299185664,1299447807,PL 1299447808,1299709951,AT 1299709952,1299783679,UA @@ -21522,7 +22340,9 @@ 1299955712,1299963903,RU 1299963904,1299972095,UA 1299972096,1300234239,IL -1300234240,1300889599,FR +1300234240,1300824063,FR +1300824064,1300874239,IL +1300874240,1300889599,FR 1300889600,1301020671,IL 1301020672,1302331391,FR 1302331392,1303379967,NL @@ -21544,7 +22364,9 @@ 1306279936,1306288127,IT 1306288128,1306296319,AT 1306296320,1306312703,RU -1306312704,1306320895,UZ +1306312704,1306317823,UZ +1306317824,1306318847,NL +1306318848,1306320895,RU 1306320896,1306329087,DE 1306329088,1306337279,BA 1306337280,1306345471,HU @@ -21591,7 +22413,8 @@ 1307192064,1307192319,GB 1307192320,1307192575,US 1307192576,1307192831,DE -1307192832,1307193343,CZ +1307192832,1307193087,US +1307193088,1307193343,CZ 1307193344,1307195391,NO 1307195392,1307197439,CH 1307197440,1307205631,HU @@ -21746,7 +22569,8 @@ 1307819432,1307819439,FI 1307819440,1307819447,LU 1307819448,1307819519,NL -1307819520,1307820031,GB +1307819520,1307819775,GB +1307819776,1307820031,BE 1307820032,1307824127,ES 1307824128,1307828223,HU 1307828224,1307832319,NL @@ -21800,7 +22624,11 @@ 1308020736,1308024831,BG 1308024832,1308030975,RU 1308030976,1308033023,UA -1308033024,1308037119,DE +1308033024,1308033685,DE +1308033686,1308033686,GB +1308033687,1308035427,DE +1308035428,1308035428,GB +1308035429,1308037119,DE 1308037120,1308041215,UA 1308041216,1308049407,RU 1308049408,1308053503,DK @@ -21826,7 +22654,9 @@ 1309314048,1309314303,CZ 1309314304,1309409279,PL 1309409280,1309671423,IT -1309671424,1309933567,IE +1309671424,1309862911,IE +1309862912,1309863167,GB +1309863168,1309933567,IE 1309933568,1310195711,BE 1310195712,1310197759,RU 1310197760,1310199807,CZ @@ -22040,6 +22870,7 @@ 1315729408,1315729663,IE 1315730176,1315730431,NL 1315731712,1315731967,DE +1315731968,1315732223,IE 1315732224,1315732991,DE 1315732992,1315733247,NL 1315733504,1315737599,NL @@ -22122,7 +22953,11 @@ 1317404672,1317437439,IT 1317437440,1317470207,HR 1317470208,1317470463,CY -1317470464,1317474303,TR +1317470464,1317471231,TR +1317471232,1317471743,CY +1317471744,1317471999,TR +1317472000,1317472255,CY +1317472256,1317474303,TR 1317474304,1317478399,CY 1317478400,1317502975,TR 1317502976,1317535743,IE @@ -22187,7 +23022,10 @@ 1317680000,1317680063,GB 1317680064,1317680071,AO 1317680072,1317683199,GB -1317683200,1317699583,DE +1317683200,1317685247,DE +1317685248,1317686271,BE +1317686272,1317687295,NL +1317687296,1317699583,DE 1317699584,1317715967,RU 1317715968,1317732351,SA 1317732352,1317748735,HU @@ -22394,7 +23232,7 @@ 1332616192,1332616319,GB 1332616320,1332616447,US 1332616448,1332616703,CZ -1332616704,1332616959,UA +1332616704,1332616959,NL 1332616960,1332617087,RU 1332617088,1332617215,CA 1332617216,1332621311,CZ @@ -22434,11 +23272,10 @@ 1334091776,1334099967,LT 1334099968,1334108159,IR 1334108160,1334116351,BE -1334116352,1334117631,FI -1334117632,1334117887,AX -1334117888,1334118399,FI -1334118400,1334118655,AX -1334118656,1334124543,FI +1334116352,1334123519,AX +1334123520,1334123903,FI +1334123904,1334124031,AX +1334124032,1334124543,FI 1334124544,1334125055,AT 1334125056,1334127359,DE 1334127360,1334127615,AT @@ -22467,8 +23304,8 @@ 1334296576,1334304767,UA 1334304768,1334312959,RU 1334312960,1334316031,SE -1334316032,1334316159,NO -1334316160,1334345727,SE +1334316032,1334316095,NO +1334316096,1334345727,SE 1334345728,1334378495,RU 1334378496,1334379023,FR 1334379024,1334379039,FI @@ -22478,7 +23315,9 @@ 1334379972,1334379975,DE 1334379976,1334380031,FR 1334380032,1334380287,PL -1334380288,1334382975,FR +1334380288,1334381983,FR +1334381984,1334382015,FI +1334382016,1334382975,FR 1334382976,1334383103,GB 1334383104,1334383679,FR 1334383680,1334383743,ES @@ -22515,7 +23354,10 @@ 1334392848,1334392863,FI 1334392864,1334392895,FR 1334392896,1334392959,GB -1334392960,1334411263,FR +1334392960,1334394879,FR +1334394880,1334409599,IT +1334409600,1334409607,DE +1334409608,1334411263,IT 1334411264,1334444031,RU 1334444032,1334503935,SE 1334503936,1334504191,DK @@ -22623,7 +23465,9 @@ 1334833152,1334837247,FR 1334837248,1335885823,ES 1335885824,1336016895,NO -1336016896,1336147967,PL +1336016896,1336049663,PL +1336049664,1336066047,ES +1336066048,1336147967,PL 1336147968,1336279039,RU 1336279040,1336410111,GR 1336410112,1336541183,PT @@ -22734,14 +23578,12 @@ 1342753792,1342754047,FR 1342754048,1342756863,YT 1342756864,1342757119,FR -1342757120,1342758143,YT -1342758144,1342758399,FR -1342758400,1342758655,YT +1342757120,1342758655,YT 1342758656,1342758911,FR 1342758912,1342759935,YT 1342759936,1342760447,FR -1342760448,1342760703,YT -1342760704,1342761215,FR +1342760448,1342760959,YT +1342760960,1342761215,FR 1342761216,1342761471,YT 1342761472,1342761727,FR 1342761728,1342761983,YT @@ -22761,7 +23603,11 @@ 1342834688,1342842879,JO 1342842880,1342844927,FR 1342844928,1342853119,JO -1342853120,1342959049,FR +1342853120,1342869503,FR +1342869504,1342871551,JO +1342871552,1342875647,FR +1342875648,1342877695,JO +1342877696,1342959049,FR 1342959050,1342959050,RE 1342959051,1342988287,FR 1342988288,1342989055,US @@ -22808,7 +23654,11 @@ 1343225856,1343750143,IT 1343750144,1344798719,ES 1344798720,1345323007,GB -1345323008,1345847295,PL +1345323008,1345404927,PL +1345404928,1345421311,ES +1345421312,1345601535,PL +1345601536,1345617919,ES +1345617920,1345847295,PL 1345847296,1345978367,NL 1345978368,1346109439,ES 1346109440,1346240511,NL @@ -23251,11 +24101,7 @@ 1347296233,1347296240,JO 1347296241,1347296264,SE 1347296265,1347296272,US -1347296273,1347297071,SE -1347297072,1347297079,US -1347297080,1347297151,SE -1347297152,1347297159,SL -1347297160,1347297279,SE +1347296273,1347297279,SE 1347297280,1347305471,UA 1347305472,1347309567,AL 1347309568,1347313663,DE @@ -23313,7 +24159,8 @@ 1347534848,1347538943,DE 1347538944,1347543039,RU 1347543040,1347547135,SK -1347547136,1347551231,DE +1347547136,1347551167,DE +1347551168,1347551231,PL 1347551232,1347555327,IT 1347555328,1347559423,PL 1347559424,1347567615,RU @@ -23353,7 +24200,9 @@ 1347674112,1347682303,RU 1347682304,1347686399,DE 1347690496,1347694591,SE -1347694592,1347706879,GB +1347694592,1347696375,GB +1347696376,1347696383,US +1347696384,1347706879,GB 1347706880,1347710975,IT 1347710976,1347715071,RU 1347715072,1347717375,ES @@ -23423,6 +24272,7 @@ 1347932160,1347936255,SK 1347936256,1347940351,FR 1347940352,1347944447,BA +1347944448,1347944959,ZA 1347945472,1347946495,NG 1347947520,1347948543,DZ 1347948544,1347952639,DE @@ -23653,9 +24503,8 @@ 1353275248,1353275255,ES 1353275256,1353277439,GB 1353277440,1353279487,CH -1353279488,1353279583,GB -1353279584,1353279591,IT -1353279592,1353286143,GB +1353279488,1353280511,IT +1353280512,1353286143,GB 1353286336,1353286367,GB 1353286400,1353287959,GB 1353287960,1353287967,IE @@ -23675,7 +24524,9 @@ 1353312448,1353312479,CH 1353312480,1353312511,GB 1353312512,1353312767,CH -1353312768,1353315327,GB +1353312768,1353313167,GB +1353313168,1353313175,IT +1353313176,1353315327,GB 1353315328,1353316351,ES 1353316352,1353318399,GB 1353318400,1353383935,SE @@ -23713,7 +24564,19 @@ 1355284480,1355415551,BE 1355415552,1355546623,NO 1355546624,1355808767,IT -1355808768,1356005375,DK +1355808768,1355841535,DK +1355841536,1355857919,CH +1355857920,1355862015,LU +1355862016,1355864063,DK +1355864064,1355866111,GB +1355866112,1355868159,LT +1355868160,1355870207,DE +1355870208,1355872255,DK +1355872256,1355873279,IT +1355873280,1355873791,GB +1355873792,1355874047,GG +1355874048,1355874303,DE +1355874304,1356005375,DK 1356005376,1356070911,IT 1356070912,1356201983,NO 1356201984,1356333055,FR @@ -23721,7 +24584,9 @@ 1356464128,1356513497,CH 1356513498,1356513498,US 1356513499,1356595199,CH -1356595200,1356857343,FI +1356595200,1356789759,FI +1356789760,1356790271,AX +1356790272,1356857343,FI 1356857344,1356922879,ES 1356922880,1356988415,GB 1356988416,1357053951,DE @@ -23755,7 +24620,9 @@ 1357323008,1357323015,CG 1357323264,1357323775,GB 1357323776,1357323791,FI -1357323792,1357324287,GB +1357323792,1357323807,GB +1357323808,1357323839,NO +1357323840,1357324287,GB 1357324288,1357324295,RU 1357324296,1357324327,PL 1357326336,1357326337,ES @@ -23768,8 +24635,9 @@ 1357328696,1357328703,IT 1357328704,1357328711,IE 1357328896,1357329159,NL +1357329168,1357329183,NL 1357329408,1357329415,BE -1357330944,1357331199,GB +1357330944,1357331207,GB 1357335808,1357336063,IT 1357337600,1357337647,NL 1357337664,1357337727,NL @@ -23804,6 +24672,7 @@ 1357368352,1357368383,NL 1357368576,1357368831,NL 1357369344,1357369599,RO +1357370368,1357370623,SA 1357371392,1357371647,GB 1357372416,1357372927,GB 1357373468,1357373471,GB @@ -23815,6 +24684,7 @@ 1357375216,1357375223,ES 1357375224,1357375423,GB 1357375424,1357375487,IE +1357375504,1357375551,GB 1357377536,1357378647,FR 1357378656,1357378671,FR 1357378816,1357379071,FR @@ -23853,7 +24723,6 @@ 1357884160,1357884415,GB 1357885120,1357885183,DE 1357885200,1357885215,AT -1357885248,1357885311,SE 1357885952,1357886207,SE 1357889024,1357889279,GB 1357889280,1357889535,SE @@ -23907,7 +24776,9 @@ 1357979648,1357983743,KZ 1357983744,1357983919,GB 1357983920,1357983927,IT -1357983928,1357984103,GB +1357983928,1357984087,GB +1357984088,1357984095,IT +1357984096,1357984103,GB 1357984104,1357984111,IT 1357984112,1357984167,GB 1357984168,1357984175,IT @@ -24048,7 +24919,10 @@ 1358512128,1358516223,DZ 1358516224,1358520319,BY 1358520320,1358524415,GB -1358528512,1358536703,RU +1358528512,1358530815,RU +1358530816,1358532607,KZ +1358532608,1358534655,RU +1358534656,1358536703,KZ 1358536704,1358540799,HU 1358540800,1358548991,RU 1358548992,1358551039,NL @@ -24191,7 +25065,8 @@ 1359119104,1359119199,ES 1359119200,1359119231,NL 1359119232,1359119359,ES -1359119360,1359121407,DE +1359119360,1359120383,IT +1359120384,1359121407,DE 1359121408,1359122431,ES 1359122432,1359123967,DE 1359123968,1359124479,ES @@ -24294,7 +25169,9 @@ 1360211200,1360211967,CZ 1360211968,1360216063,GB 1360216064,1360224255,RU -1360224256,1360228351,ES +1360224256,1360224767,ES +1360224768,1360224895,FR +1360224896,1360228351,ES 1360228352,1360232447,FI 1360232448,1360236543,RU 1360236544,1360240639,AT @@ -24435,7 +25312,7 @@ 1360654336,1360658431,EE 1360658432,1360666623,PL 1360666624,1360674815,NO -1360674816,1360676863,DZ +1360674816,1360676863,NG 1360676864,1360678911,ZA 1360678912,1360683007,RU 1360683008,1360691199,GB @@ -24691,7 +25568,7 @@ 1365028864,1365032959,NL 1365032960,1365033471,US 1365033472,1365033599,PT -1365033600,1365033983,US +1365033600,1365033983,GB 1365033984,1365035007,SE 1365035008,1365039103,GB 1365039104,1365039135,FI @@ -24892,12 +25769,8 @@ 1371996928,1372000255,GB 1372000256,1372001279,UG 1372001280,1372012543,GB -1372012544,1372013567,ZM -1372013568,1372014079,GB -1372014080,1372014335,NG -1372014336,1372016127,GB -1372016128,1372016383,GH -1372016384,1372017583,GB +1372012544,1372016639,DE +1372016640,1372017583,GB 1372017584,1372017599,CD 1372017600,1372020735,GB 1372020736,1372022783,CD @@ -24957,6 +25830,7 @@ 1372684544,1372684799,DE 1372685664,1372685679,DE 1372688384,1372689407,DE +1372689920,1372690175,DE 1372690432,1372691455,DE 1372693504,1372694015,DE 1372697344,1372697599,DE @@ -25035,9 +25909,7 @@ 1380188160,1380450303,GB 1380450304,1380712447,NL 1380712448,1380974591,RO -1380974592,1381084671,IL -1381084672,1381085183,SY -1381085184,1381105663,IL +1380974592,1381105663,IL 1381105664,1381236735,DE 1381236736,1381367807,IT 1381367808,1381498879,ES @@ -25130,7 +26002,9 @@ 1383243776,1383251967,YE 1383251968,1383260159,CZ 1383260160,1383268351,RU -1383268352,1383272191,IR +1383268352,1383268607,IR +1383268608,1383269375,NL +1383269376,1383272191,IR 1383272192,1383272447,NL 1383272448,1383276543,IR 1383276544,1383284735,KZ @@ -25179,7 +26053,9 @@ 1383514112,1383522303,FI 1383522304,1383523839,BG 1383523840,1383524095,GB -1383524096,1383530495,BG +1383524096,1383524863,BG +1383524864,1383525119,GB +1383525120,1383530495,BG 1383530496,1383538687,DE 1383538688,1383546879,IT 1383546880,1383555071,BG @@ -25297,7 +26173,9 @@ 1385290632,1385290632,IS 1385291344,1385291344,IS 1385291776,1385299967,TR -1385299968,1385308159,BG +1385299968,1385303039,BG +1385303040,1385303551,DK +1385303552,1385308159,BG 1385308160,1385316351,RU 1385316352,1385324543,NO 1385324544,1385332735,BE @@ -25363,8 +26241,7 @@ 1386283008,1386348543,NL 1386348544,1386414079,RU 1386414080,1386422271,GB -1386422272,1386422783,IT -1386422784,1386423295,GB +1386422272,1386423295,IT 1386423296,1386424319,FR 1386424320,1386424575,NL 1386424576,1386425087,GB @@ -25396,7 +26273,7 @@ 1386449396,1386449399,PT 1386449400,1386449403,RU 1386449404,1386449407,DE -1386449408,1386449663,IL +1386449408,1386449663,GB 1386449664,1386449919,HK 1386449920,1386449920,US 1386449921,1386450175,IL @@ -25472,8 +26349,6 @@ 1388587520,1388588031,GB 1388589056,1388589823,GB 1388591104,1388591359,AU -1388591616,1388591631,US -1388591648,1388591663,US 1388593152,1388601343,RU 1388601344,1388609535,SE 1388609536,1388617727,RU @@ -25564,14 +26439,18 @@ 1388796683,1388796687,GB 1388796688,1388797951,NL 1388797952,1388806143,RU -1388806144,1388806783,DE +1388806144,1388806399,CH +1388806400,1388806655,DE +1388806656,1388806783,CH 1388806784,1388806911,GB -1388806912,1388807839,DE -1388807840,1388807855,CH -1388807856,1388814335,DE +1388806912,1388811775,CH +1388811776,1388812031,DE +1388812032,1388814335,CH 1388814336,1388816383,FI 1388816384,1388818431,AX -1388818432,1388822527,SE +1388818432,1388819455,SE +1388819456,1388820479,AX +1388820480,1388822527,SE 1388822528,1388830719,AM 1388830720,1388838911,FI 1388838912,1388871679,RU @@ -25749,6 +26628,7 @@ 1401094144,1401159679,HR 1401159680,1401225215,PT 1401225216,1401241599,DE +1401242632,1401242632,DE 1401246720,1401257983,DE 1401271296,1401274367,DE 1401278464,1401283583,DE @@ -26051,7 +26931,9 @@ 1403581952,1403582207,US 1403582208,1403584511,SE 1403584512,1403600895,DE -1403600896,1403617279,FR +1403600896,1403601519,FR +1403601520,1403601535,MC +1403601536,1403617279,FR 1403617280,1403633663,DE 1403633664,1403650047,RU 1403650048,1403666431,DE @@ -26079,8 +26961,8 @@ 1404026880,1404043263,ES 1404043264,1404051455,EE 1404051456,1404059647,HR -1404059648,1404076543,SE -1404076544,1404084223,LV +1404059648,1404076031,SE +1404076032,1404084223,LV 1404084224,1404099327,LT 1404099328,1404099583,SE 1404099584,1404103167,LT @@ -26104,9 +26986,7 @@ 1404194816,1404198911,LT 1404198912,1404200959,SE 1404200960,1404207103,HR -1404207104,1404209151,LV -1404209152,1404210175,SE -1404210176,1404212223,LV +1404207104,1404212223,LV 1404212224,1404215295,SE 1404215296,1404219391,LV 1404219392,1404220415,SE @@ -26115,8 +26995,8 @@ 1404222464,1404222975,LV 1404222976,1404225535,SE 1404225536,1404231679,LV -1404231680,1404232703,SE -1404232704,1404233215,LV +1404231680,1404231935,SE +1404231936,1404233215,LV 1404233216,1404234239,SE 1404234240,1404239871,HR 1404239872,1404242687,EE @@ -26177,7 +27057,8 @@ 1404875776,1404876799,LT 1404876800,1404887039,SE 1404887040,1404895231,LT -1404895232,1404921855,NL +1404895232,1404903423,SE +1404903424,1404921855,NL 1404921856,1404927999,LT 1404928000,1404944383,SE 1404944384,1404960767,LT @@ -26254,9 +27135,7 @@ 1405855232,1405855487,FR 1405855488,1405855743,MQ 1405855744,1405855999,FR -1405856000,1405857279,MQ -1405857280,1405857791,FR -1405857792,1405860607,MQ +1405856000,1405860607,MQ 1405860608,1405860863,FR 1405860864,1405862911,MQ 1405862912,1405863423,FR @@ -26264,8 +27143,8 @@ 1405863936,1405865471,FR 1405865472,1405869311,MQ 1405869312,1405869567,FR -1405869568,1405872895,MQ -1405872896,1405873407,FR +1405869568,1405873151,MQ +1405873152,1405873407,FR 1405873408,1405878271,MQ 1405878272,1406140415,FR 1406140416,1406205951,CZ @@ -26275,7 +27154,9 @@ 1406402560,1406468095,GR 1406468096,1406533631,ES 1406533632,1406599167,FR -1406599168,1406664703,AT +1406599168,1406652671,AT +1406652672,1406652927,DE +1406652928,1406664703,AT 1406664704,1406672895,FI 1406672896,1406681087,HU 1406681088,1406689279,GB @@ -26325,9 +27206,9 @@ 1406926848,1406935039,IT 1406935040,1406951423,RU 1406951424,1406959615,PL -1406959616,1406964351,DE -1406964352,1406964479,NL -1406964480,1406967807,DE +1406959616,1406964223,DE +1406964224,1406964735,NL +1406964736,1406967807,DE 1406967808,1406975999,RU 1406976000,1406984191,IE 1406984192,1407000575,RU @@ -26562,7 +27443,12 @@ 1410539520,1410547711,GB 1410547712,1410555903,CZ 1410555904,1410564095,GB -1410564096,1410568501,SE +1410564096,1410567320,SE +1410567321,1410567321,NO +1410567322,1410567322,FI +1410567323,1410567323,EE +1410567324,1410567324,IT +1410567325,1410568501,SE 1410568502,1410568502,DK 1410568503,1410568991,SE 1410568992,1410569007,NO @@ -26615,9 +27501,7 @@ 1411449728,1411449791,DE 1411449792,1411450303,IT 1411450304,1411450367,DE -1411450368,1411481855,IT -1411481856,1411483903,DE -1411483904,1411514367,IT +1411450368,1411514367,IT 1411514368,1411579903,FI 1411579904,1411645439,NL 1411645440,1411710975,EG @@ -26666,7 +27550,6 @@ 1411907584,1411911679,GB 1411911680,1411915775,US 1411915776,1411919871,GB -1411919872,1411921919,DE 1411921920,1411922175,GB 1411922176,1411922431,DE 1411922432,1411923967,GB @@ -26675,8 +27558,8 @@ 1411961612,1411961612,IE 1411961613,1411973119,PL 1411973120,1411999743,SI -1411999744,1412001023,BA -1412001024,1412002815,SI +1411999744,1412001279,BA +1412001280,1412002815,SI 1412002816,1412003839,BA 1412003840,1412005887,SI 1412005888,1412038655,NL @@ -26699,15 +27582,14 @@ 1412406272,1412408831,RU 1412408832,1412409343,RO 1412409344,1412412159,RU -1412412160,1412412671,RO +1412412160,1412412415,RO +1412412416,1412412671,GB 1412412672,1412413439,RU 1412413440,1412413951,RO 1412413952,1412414719,RU 1412414720,1412414975,RO 1412414976,1412415487,RU -1412415488,1412423679,IR -1412423680,1412425727,AE -1412425728,1412431871,IR +1412415488,1412431871,IR 1412431872,1412562943,NO 1412562944,1412628479,EE 1412628480,1412644863,TR @@ -26725,7 +27607,7 @@ 1412796928,1412800511,US 1412801536,1412804607,US 1412804864,1412805631,US -1412806144,1412808703,US +1412806656,1412808703,US 1412808704,1412825087,RU 1412832768,1412833023,SL 1412841472,1412857855,UZ @@ -26855,7 +27737,7 @@ 1424619856,1424619863,BE 1424619864,1424621567,GB 1424621568,1424625663,PL -1424625664,1424629759,GB +1424625664,1424629759,US 1424629760,1424633855,PL 1424633856,1424637951,MD 1424637952,1424642047,FI @@ -26872,7 +27754,9 @@ 1424818176,1424850943,RU 1424850944,1424883711,LV 1424883712,1424916479,DK -1424916480,1424949247,BG +1424916480,1424928767,BG +1424928768,1424929279,DK +1424929280,1424949247,BG 1424949248,1424965631,RO 1424965632,1424982015,FR 1424982016,1425014783,FI @@ -26929,13 +27813,15 @@ 1425478912,1425479679,RO 1425479680,1425480703,BG 1425480704,1425481727,RO -1425481728,1425482751,GB +1425481728,1425482751,US 1425482752,1425484799,RO 1425484800,1425485311,MD 1425485312,1425485823,BG 1425485824,1425486847,RO 1425486848,1425487359,MD -1425487360,1425489407,RO +1425487360,1425488639,RO +1425488640,1425488895,US +1425488896,1425489407,RO 1425489408,1425489663,NL 1425489664,1425506303,RO 1425506304,1425509887,NO @@ -27047,11 +27933,7 @@ 1428142080,1428144127,DE 1428144128,1428152319,FR 1428152320,1428160511,PL -1428160512,1428183111,IT -1428183112,1428183119,SI -1428183120,1428183143,IT -1428183144,1428183151,SI -1428183152,1428260863,IT +1428160512,1428260863,IT 1428260864,1428261119,GB 1428261120,1429209087,IT 1429209088,1430257663,ES @@ -27093,7 +27975,9 @@ 1432024064,1432025087,DE 1432025088,1432027135,GB 1432027136,1432035327,IE -1432035328,1432043519,GB +1432035328,1432038399,GB +1432038400,1432039423,NL +1432039424,1432043519,GB 1432043520,1432051711,ES 1432051712,1432054015,RU 1432054016,1432054271,RO @@ -27179,7 +28063,9 @@ 1433600000,1433608191,DE 1433608192,1433608447,TR 1433608448,1433608703,NL -1433608704,1433610239,GB +1433608704,1433609215,GB +1433609216,1433609727,SE +1433609728,1433610239,GB 1433610240,1433611263,US 1433611264,1433614335,GB 1433614336,1433615027,DE @@ -27359,17 +28245,19 @@ 1437335552,1437597695,RU 1437597696,1438121983,DE 1438121984,1438126079,NL -1438126080,1438127359,CZ -1438127360,1438127615,SE -1438127616,1438127871,BE -1438127872,1438130175,CZ +1438126080,1438130175,CZ 1438130176,1438138367,NL 1438138368,1438146559,FR -1438146560,1438154751,MT +1438146560,1438147583,MT +1438147584,1438147839,SE +1438147840,1438148095,BE +1438148096,1438148351,GB +1438148352,1438154751,MT 1438154752,1438171135,DK 1438171136,1438173183,GB 1438173184,1438179327,IM -1438179328,1438181375,NL +1438179328,1438180351,ES +1438180352,1438181375,NL 1438181376,1438183423,SA 1438183424,1438184447,PS 1438184448,1438185471,CH @@ -27383,7 +28271,9 @@ 1438384128,1438400511,FI 1438400512,1438433279,SE 1438433280,1438515199,GB -1438515200,1438553855,DE +1438515200,1438539775,DE +1438539776,1438547967,NL +1438547968,1438553855,DE 1438553856,1438554111,BR 1438554112,1438554623,US 1438554624,1438555135,DE @@ -27553,7 +28443,9 @@ 1439459328,1439459839,IR 1439459840,1439460607,RO 1439460608,1439460863,MD -1439460864,1439462655,RO +1439460864,1439461375,RO +1439461376,1439462399,IT +1439462400,1439462655,RO 1439462656,1439462911,MD 1439462912,1439463167,RO 1439463168,1439463423,IT @@ -27567,7 +28459,10 @@ 1439468544,1439469567,ES 1439469568,1439470335,RO 1439470336,1439470591,IT -1439470592,1439475711,RO +1439470592,1439471615,US +1439471616,1439473663,RO +1439473664,1439474687,US +1439474688,1439475711,RO 1439475712,1439475967,IN 1439475968,1439476735,RO 1439476736,1439477759,IN @@ -27627,8 +28522,8 @@ 1440251904,1440284671,SK 1440284672,1440317439,FI 1440317440,1440322559,BG -1440322560,1440323071,DE -1440323072,1440325631,BG +1440322560,1440322815,DE +1440322816,1440325631,BG 1440325632,1440326655,DE 1440326656,1440328703,BG 1440328704,1440329727,DE @@ -27819,7 +28714,8 @@ 1449706496,1449707519,MD 1449707520,1449709567,SE 1449709568,1449709823,GB -1449709824,1449710591,RO +1449709824,1449710079,US +1449710080,1449710591,RO 1449710592,1449711103,GB 1449711104,1449713151,RO 1449713152,1449714175,GB @@ -27838,7 +28734,8 @@ 1449724928,1449725439,GB 1449725440,1449726463,RO 1449726464,1449726719,NL -1449726720,1449727999,RO +1449726720,1449726975,RO +1449726976,1449727999,NO 1449728000,1449728255,MD 1449728256,1449729023,RO 1449729024,1449730047,ES @@ -27849,7 +28746,7 @@ 1449738240,1449742335,RO 1449742336,1449744383,MD 1449744384,1449748479,RO -1449748480,1449749503,GB +1449748480,1449749503,US 1449749504,1449750527,RO 1449750528,1449752575,SE 1449752576,1449754623,RO @@ -27962,7 +28859,8 @@ 1449879168,1449879295,TH 1449879296,1449880319,RO 1449880320,1449880575,MD -1449880576,1449883647,RO +1449880576,1449881087,US +1449881088,1449883647,RO 1449883648,1449885695,BE 1449885696,1449889791,GB 1449889792,1449893887,IR @@ -28122,13 +29020,7 @@ 1467432960,1467449343,BG 1467449344,1467457535,SI 1467457536,1467465727,EE -1467465728,1467465759,NL -1467465760,1467465791,DE -1467465792,1467465799,NL -1467465800,1467465983,DE -1467465984,1467466015,NL -1467466016,1467466495,DE -1467466496,1467466751,NL +1467465728,1467466751,NL 1467466752,1467472895,DE 1467472896,1467473919,NL 1467473920,1467482111,RU @@ -28151,7 +29043,9 @@ 1467584512,1467593727,BG 1467593728,1467597823,DE 1467597824,1467604991,BG -1467604992,1467744255,DE +1467604992,1467611135,DE +1467611136,1467613183,BG +1467613184,1467744255,DE 1467744256,1467777023,GB 1467777024,1467875327,ES 1467875328,1467940863,BG @@ -28333,11 +29227,7 @@ 1475559424,1475563007,GR 1475563008,1475563263,BG 1475563264,1475563519,GR -1475563520,1475565183,BG -1475565184,1475565311,GR -1475565312,1475566207,BG -1475566208,1475566335,GR -1475566336,1475575807,BG +1475563520,1475575807,BG 1475575808,1475592191,AT 1475592192,1475608575,GB 1475608576,1475624959,RU @@ -28438,7 +29328,8 @@ 1475870720,1475878911,NO 1475878912,1475887103,IT 1475887104,1475895295,PL -1475895296,1475903487,GB +1475895296,1475901439,GB +1475901440,1475903487,CH 1475903488,1475911679,IR 1475911680,1475919871,MD 1475919872,1475928063,IT @@ -28459,12 +29350,12 @@ 1476010112,1476011327,RS 1476011328,1476011775,XK 1476011776,1476012095,RS -1476012096,1476012287,XK -1476012288,1476013055,RS -1476013056,1476013311,XK -1476013312,1476013567,RS -1476013568,1476013823,XK -1476013824,1476014079,RS +1476012096,1476012176,XK +1476012177,1476012177,RS +1476012178,1476012250,XK +1476012251,1476012251,RS +1476012252,1476012287,XK +1476012288,1476014079,RS 1476014080,1476014127,XK 1476014128,1476014135,RS 1476014136,1476014591,XK @@ -28531,13 +29422,7 @@ 1476378624,1476386815,KZ 1476386816,1476395007,RU 1476395008,1478492159,ES -1478492160,1479738383,IT -1479738384,1479738391,SI -1479738392,1479738479,IT -1479738480,1479738487,SI -1479738488,1480413711,IT -1480413712,1480413719,SI -1480413720,1480589311,IT +1478492160,1480589311,IT 1480589312,1481637887,DE 1481637888,1481646079,SE 1481646080,1481654271,RU @@ -28570,7 +29455,9 @@ 1481834496,1481842687,GL 1481842688,1481843007,SE 1481843008,1481843039,NO -1481843040,1481850879,SE +1481843040,1481844959,SE +1481844960,1481844991,NO +1481844992,1481850879,SE 1481850880,1481859071,DK 1481859072,1481867263,GB 1481867264,1481875455,SE @@ -28583,9 +29470,13 @@ 1481908224,1481916415,NO 1481916416,1481924607,ES 1481924608,1481932799,SA -1481932800,1481937183,GB +1481932800,1481936959,GB +1481936960,1481936975,FR +1481936976,1481937183,GB 1481937184,1481937199,NL -1481937200,1481940991,GB +1481937200,1481937207,GB +1481937208,1481937215,FR +1481937216,1481940991,GB 1481940992,1481949183,NO 1481949184,1481957375,RU 1481957376,1481965567,SE @@ -28621,9 +29512,7 @@ 1483210752,1483735039,GB 1483735040,1483997183,FI 1483997184,1484128255,AT -1484128256,1484237823,LT -1484237824,1484238847,PK -1484238848,1484259327,LT +1484128256,1484259327,LT 1484259328,1484783615,FR 1484783616,1484849151,DE 1484849152,1484914687,SE @@ -28652,7 +29541,713 @@ 1486159872,1486192639,IS 1486192640,1486225407,IT 1486225408,1486258175,DE -1486258176,1486292991,GB +1486258176,1486258463,GB +1486258464,1486258477,US +1486258478,1486258479,GB +1486258480,1486258495,US +1486258496,1486258543,GB +1486258544,1486258551,US +1486258552,1486258567,GB +1486258568,1486258583,US +1486258584,1486258591,GB +1486258592,1486258607,US +1486258608,1486258671,GB +1486258672,1486258751,US +1486258752,1486258815,GB +1486258816,1486258847,US +1486258848,1486258863,GB +1486258864,1486258895,US +1486258896,1486258911,GB +1486258912,1486258943,US +1486258944,1486258959,GB +1486258960,1486258967,US +1486258968,1486258975,GB +1486258976,1486258999,US +1486259000,1486259039,GB +1486259040,1486259071,US +1486259072,1486259087,GB +1486259088,1486259095,US +1486259096,1486259183,GB +1486259184,1486259207,US +1486259208,1486259231,GB +1486259232,1486259239,US +1486259240,1486259287,GB +1486259288,1486259295,US +1486259296,1486259455,GB +1486259456,1486259471,US +1486259472,1486259503,GB +1486259504,1486259511,US +1486259512,1486259559,GB +1486259560,1486259567,US +1486259568,1486259575,GB +1486259576,1486259583,US +1486259584,1486259631,GB +1486259632,1486259639,US +1486259640,1486259663,GB +1486259664,1486259679,US +1486259680,1486259711,GB +1486259712,1486259775,US +1486259776,1486259807,GB +1486259808,1486259871,US +1486259872,1486259999,GB +1486260000,1486260031,US +1486260032,1486260095,GB +1486260096,1486260119,US +1486260120,1486260135,GB +1486260136,1486260143,US +1486260144,1486260183,GB +1486260184,1486260191,US +1486260192,1486260239,GB +1486260240,1486260287,US +1486260288,1486260327,GB +1486260328,1486260335,US +1486260336,1486260383,GB +1486260384,1486260401,US +1486260402,1486260402,GB +1486260403,1486260407,US +1486260408,1486260415,GB +1486260416,1486260431,US +1486260432,1486260435,GB +1486260436,1486260437,US +1486260438,1486260463,GB +1486260464,1486260479,US +1486260480,1486260735,GB +1486260736,1486260767,US +1486260768,1486260863,GB +1486260864,1486261023,US +1486261024,1486261135,GB +1486261136,1486261139,US +1486261140,1486261151,GB +1486261152,1486261247,US +1486261248,1486263295,GB +1486263296,1486263311,US +1486263312,1486263327,GB +1486263328,1486263391,US +1486263392,1486263423,GB +1486263424,1486263439,US +1486263440,1486263463,GB +1486263464,1486263471,US +1486263472,1486263487,GB +1486263488,1486263583,US +1486263584,1486263599,GB +1486263600,1486263631,US +1486263632,1486263663,GB +1486263664,1486263823,US +1486263824,1486263947,GB +1486263948,1486263959,US +1486263960,1486263983,GB +1486263984,1486264015,US +1486264016,1486264031,GB +1486264032,1486264063,US +1486264064,1486264143,GB +1486264144,1486264145,US +1486264146,1486264223,GB +1486264224,1486264255,US +1486264256,1486264319,GB +1486264320,1486264351,US +1486264352,1486264399,GB +1486264400,1486264407,US +1486264408,1486264409,GB +1486264410,1486264411,US +1486264412,1486264447,GB +1486264448,1486264479,US +1486264480,1486264703,GB +1486264704,1486264711,US +1486264712,1486264751,GB +1486264752,1486264767,US +1486264768,1486269439,GB +1486269440,1486269455,US +1486269456,1486269487,GB +1486269488,1486269519,US +1486269520,1486269535,GB +1486269536,1486269567,US +1486269568,1486269583,GB +1486269584,1486269615,US +1486269616,1486269631,GB +1486269632,1486269647,US +1486269648,1486269663,GB +1486269664,1486269679,US +1486269680,1486269711,GB +1486269712,1486269719,US +1486269720,1486269735,GB +1486269736,1486269743,US +1486269744,1486269751,GB +1486269752,1486269791,US +1486269792,1486269799,GB +1486269800,1486269815,US +1486269816,1486269823,GB +1486269824,1486269855,US +1486269856,1486269871,GB +1486269872,1486269903,US +1486269904,1486269919,GB +1486269920,1486269954,US +1486269955,1486269955,GB +1486269956,1486269975,US +1486269976,1486269983,GB +1486269984,1486269999,US +1486270000,1486270015,GB +1486270016,1486270031,US +1486270032,1486270039,GB +1486270040,1486270079,US +1486270080,1486270143,GB +1486270144,1486270159,US +1486270160,1486270175,GB +1486270176,1486270351,US +1486270352,1486270367,GB +1486270368,1486270375,US +1486270376,1486270391,GB +1486270392,1486270399,US +1486270400,1486270415,GB +1486270416,1486270431,US +1486270432,1486270447,GB +1486270448,1486270455,US +1486270456,1486270991,GB +1486270992,1486270999,US +1486271000,1486271103,GB +1486271104,1486271159,US +1486271160,1486271167,GB +1486271168,1486271175,US +1486271176,1486271199,GB +1486271200,1486271215,US +1486271216,1486271751,GB +1486271752,1486271759,US +1486271760,1486271775,GB +1486271776,1486271791,US +1486271792,1486271807,GB +1486271808,1486271815,US +1486271816,1486271823,GB +1486271824,1486271831,US +1486271832,1486271871,GB +1486271872,1486271935,US +1486271936,1486271943,GB +1486271944,1486271983,US +1486271984,1486272047,GB +1486272048,1486272063,US +1486272064,1486272079,GB +1486272080,1486272127,US +1486272128,1486272263,GB +1486272264,1486272279,US +1486272280,1486272287,GB +1486272288,1486272295,US +1486272296,1486272303,GB +1486272304,1486272311,US +1486272312,1486272351,GB +1486272352,1486272359,US +1486272360,1486272367,GB +1486272368,1486272383,US +1486272384,1486272399,GB +1486272400,1486272431,US +1486272432,1486272439,GB +1486272440,1486272447,US +1486272448,1486272455,GB +1486272456,1486272463,US +1486272464,1486272479,GB +1486272480,1486272503,US +1486272504,1486272505,GB +1486272506,1486272583,US +1486272584,1486272623,GB +1486272624,1486272639,US +1486272640,1486272663,GB +1486272664,1486272671,US +1486272672,1486272687,GB +1486272688,1486272695,US +1486272696,1486272703,GB +1486272704,1486272799,US +1486272800,1486272815,GB +1486272816,1486272831,US +1486272832,1486272839,GB +1486272840,1486272879,US +1486272880,1486272911,GB +1486272912,1486272959,US +1486272960,1486272975,GB +1486272976,1486272983,US +1486272984,1486272999,GB +1486273000,1486273015,US +1486273016,1486273023,GB +1486273024,1486273031,US +1486273032,1486273033,GB +1486273034,1486273035,US +1486273036,1486273087,GB +1486273088,1486273103,US +1486273104,1486273111,GB +1486273112,1486273119,US +1486273120,1486273127,GB +1486273128,1486273135,US +1486273136,1486273143,GB +1486273144,1486273151,US +1486273152,1486273159,GB +1486273160,1486273183,US +1486273184,1486273199,GB +1486273200,1486273295,US +1486273296,1486273303,GB +1486273304,1486273311,US +1486273312,1486273319,GB +1486273320,1486273327,US +1486273328,1486273335,GB +1486273336,1486273343,US +1486273344,1486273367,GB +1486273368,1486273375,US +1486273376,1486273383,GB +1486273384,1486273391,US +1486273392,1486273399,GB +1486273400,1486273439,US +1486273440,1486273447,GB +1486273448,1486273463,US +1486273464,1486273503,GB +1486273504,1486273535,US +1486273536,1486273543,GB +1486273544,1486273551,US +1486273552,1486273559,GB +1486273560,1486273567,US +1486273568,1486273583,GB +1486273584,1486273599,US +1486273600,1486273631,GB +1486273632,1486273863,US +1486273864,1486273879,GB +1486273880,1486273887,US +1486273888,1486273919,GB +1486273920,1486274047,US +1486274048,1486274079,GB +1486274080,1486274095,US +1486274096,1486274111,GB +1486274112,1486274143,US +1486274144,1486274175,GB +1486274176,1486274191,US +1486274192,1486274223,GB +1486274224,1486274231,US +1486274232,1486274255,GB +1486274256,1486274263,US +1486274264,1486274271,GB +1486274272,1486274295,US +1486274296,1486274335,GB +1486274336,1486274351,US +1486274352,1486274359,GB +1486274360,1486274367,US +1486274368,1486274399,GB +1486274400,1486274455,US +1486274456,1486274463,GB +1486274464,1486274487,US +1486274488,1486274495,GB +1486274496,1486274519,US +1486274520,1486274527,GB +1486274528,1486274543,US +1486274544,1486274551,GB +1486274552,1486274623,US +1486274624,1486274631,GB +1486274632,1486274639,US +1486274640,1486274655,GB +1486274656,1486274671,US +1486274672,1486274679,GB +1486274680,1486274687,US +1486274688,1486274719,GB +1486274720,1486274751,US +1486274752,1486274763,GB +1486274764,1486274767,US +1486274768,1486274799,GB +1486274800,1486274815,US +1486274816,1486275071,GB +1486275072,1486275079,US +1486275080,1486275095,GB +1486275096,1486275119,US +1486275120,1486275127,GB +1486275128,1486275207,US +1486275208,1486275223,GB +1486275224,1486275279,US +1486275280,1486275311,GB +1486275312,1486275327,US +1486275328,1486275335,GB +1486275336,1486275351,US +1486275352,1486275359,GB +1486275360,1486275367,US +1486275368,1486275383,GB +1486275384,1486275399,US +1486275400,1486275407,GB +1486275408,1486275415,US +1486275416,1486275431,GB +1486275432,1486275447,US +1486275448,1486275519,GB +1486275520,1486275583,US +1486275584,1486275591,GB +1486275592,1486275607,US +1486275608,1486275647,GB +1486275648,1486275695,US +1486275696,1486275775,GB +1486275776,1486275815,US +1486275816,1486275823,GB +1486275824,1486275839,US +1486275840,1486275887,GB +1486275888,1486275919,US +1486275920,1486275951,GB +1486275952,1486275999,US +1486276000,1486276047,GB +1486276048,1486276095,US +1486276096,1486276103,GB +1486276104,1486276111,US +1486276112,1486276135,GB +1486276136,1486276183,US +1486276184,1486276191,GB +1486276192,1486276199,US +1486276200,1486276319,GB +1486276320,1486276375,US +1486276376,1486276399,GB +1486276400,1486276407,US +1486276408,1486276479,GB +1486276480,1486276551,US +1486276552,1486276575,GB +1486276576,1486276607,US +1486276608,1486276671,GB +1486276672,1486276703,US +1486276704,1486276711,GB +1486276712,1486276719,US +1486276720,1486276735,GB +1486276736,1486276751,US +1486276752,1486276767,GB +1486276768,1486276783,US +1486276784,1486276791,GB +1486276792,1486276839,US +1486276840,1486276863,GB +1486276864,1486276879,US +1486276880,1486276895,GB +1486276896,1486276903,US +1486276904,1486276911,GB +1486276912,1486276919,US +1486276920,1486276943,GB +1486276944,1486276951,US +1486276952,1486276975,GB +1486276976,1486276983,US +1486276984,1486276991,GB +1486276992,1486277055,US +1486277056,1486277063,GB +1486277064,1486277079,US +1486277080,1486277087,GB +1486277088,1486277095,US +1486277096,1486277111,GB +1486277112,1486277127,US +1486277128,1486277135,GB +1486277136,1486277167,US +1486277168,1486277175,GB +1486277176,1486277183,US +1486277184,1486277187,GB +1486277188,1486277191,US +1486277192,1486277207,GB +1486277208,1486277215,US +1486277216,1486277231,GB +1486277232,1486277263,US +1486277264,1486277279,GB +1486277280,1486277311,US +1486277312,1486277343,GB +1486277344,1486277351,US +1486277352,1486277359,GB +1486277360,1486277367,US +1486277368,1486277375,GB +1486277376,1486277423,US +1486277424,1486277431,GB +1486277432,1486277439,US +1486277440,1486277503,GB +1486277504,1486277511,US +1486277512,1486277527,GB +1486277528,1486277535,US +1486277536,1486277559,GB +1486277560,1486277583,US +1486277584,1486277591,GB +1486277592,1486277599,US +1486277600,1486277607,GB +1486277608,1486277727,US +1486277728,1486277735,GB +1486277736,1486277743,US +1486277744,1486277759,GB +1486277760,1486277775,US +1486277776,1486277783,GB +1486277784,1486277807,US +1486277808,1486277815,GB +1486277816,1486277823,US +1486277824,1486277863,GB +1486277864,1486277871,US +1486277872,1486277895,GB +1486277896,1486277935,US +1486277936,1486277943,GB +1486277944,1486277951,US +1486277952,1486277991,GB +1486277992,1486278039,US +1486278040,1486278055,GB +1486278056,1486278079,US +1486278080,1486278095,GB +1486278096,1486278143,US +1486278144,1486278399,GB +1486278400,1486278511,US +1486278512,1486278527,GB +1486278528,1486278551,US +1486278552,1486278567,GB +1486278568,1486278575,US +1486278576,1486278583,GB +1486278584,1486278623,US +1486278624,1486278639,GB +1486278640,1486278663,US +1486278664,1486278679,GB +1486278680,1486278687,US +1486278688,1486278695,GB +1486278696,1486278743,US +1486278744,1486278791,GB +1486278792,1486278799,US +1486278800,1486278815,GB +1486278816,1486278943,US +1486278944,1486278951,GB +1486278952,1486279039,US +1486279040,1486279103,GB +1486279104,1486279151,US +1486279152,1486279161,GB +1486279162,1486279163,US +1486279164,1486279295,GB +1486279296,1486279319,US +1486279320,1486279327,GB +1486279328,1486279343,US +1486279344,1486279359,GB +1486279360,1486279375,US +1486279376,1486279383,GB +1486279384,1486279407,US +1486279408,1486279479,GB +1486279480,1486279583,US +1486279584,1486279599,GB +1486279600,1486279623,US +1486279624,1486279631,GB +1486279632,1486279647,US +1486279648,1486279663,GB +1486279664,1486279671,US +1486279672,1486279679,GB +1486279680,1486279687,US +1486279688,1486279703,GB +1486279704,1486279727,US +1486279728,1486279735,GB +1486279736,1486279751,US +1486279752,1486279775,GB +1486279776,1486279791,US +1486279792,1486279799,GB +1486279800,1486279807,US +1486279808,1486279839,GB +1486279840,1486279855,US +1486279856,1486279887,GB +1486279888,1486279935,US +1486279936,1486279991,GB +1486279992,1486279999,US +1486280000,1486280023,GB +1486280024,1486280151,US +1486280152,1486280159,GB +1486280160,1486280167,US +1486280168,1486280191,GB +1486280192,1486280319,US +1486280320,1486280335,GB +1486280336,1486280367,US +1486280368,1486280383,GB +1486280384,1486280391,US +1486280392,1486280399,GB +1486280400,1486280415,US +1486280416,1486280423,GB +1486280424,1486280447,US +1486280448,1486280455,GB +1486280456,1486280463,US +1486280464,1486280487,GB +1486280488,1486280495,US +1486280496,1486280511,GB +1486280512,1486280537,US +1486280538,1486280539,GB +1486280540,1486280541,US +1486280542,1486280543,GB +1486280544,1486280559,US +1486280560,1486280567,GB +1486280568,1486280647,US +1486280648,1486280655,GB +1486280656,1486280679,US +1486280680,1486280687,GB +1486280688,1486280695,US +1486280696,1486281983,GB +1486281984,1486282111,US +1486282112,1486282143,GB +1486282144,1486282159,US +1486282160,1486282263,GB +1486282264,1486282271,US +1486282272,1486282279,GB +1486282280,1486282287,US +1486282288,1486282303,GB +1486282304,1486282383,US +1486282384,1486282415,GB +1486282416,1486282423,US +1486282424,1486282431,GB +1486282432,1486282559,US +1486282560,1486282567,GB +1486282568,1486282575,US +1486282576,1486282591,GB +1486282592,1486282599,US +1486282600,1486282639,GB +1486282640,1486282719,US +1486282720,1486283007,GB +1486283008,1486283023,US +1486283024,1486283031,GB +1486283032,1486283095,US +1486283096,1486283263,GB +1486283264,1486283271,US +1486283272,1486283279,GB +1486283280,1486283295,US +1486283296,1486283391,GB +1486283392,1486283455,US +1486283456,1486283495,GB +1486283496,1486283511,US +1486283512,1486283647,GB +1486283648,1486283695,US +1486283696,1486283711,GB +1486283712,1486283775,US +1486283776,1486283831,GB +1486283832,1486283839,US +1486283840,1486283855,GB +1486283856,1486283871,US +1486283872,1486283903,GB +1486283904,1486283911,US +1486283912,1486283927,GB +1486283928,1486283935,US +1486283936,1486283951,GB +1486283952,1486283991,US +1486283992,1486284007,GB +1486284008,1486284023,US +1486284024,1486284039,GB +1486284040,1486284047,US +1486284048,1486284063,GB +1486284064,1486284167,US +1486284168,1486284191,GB +1486284192,1486284215,US +1486284216,1486284223,GB +1486284224,1486284471,US +1486284472,1486284479,GB +1486284480,1486284543,US +1486284544,1486284599,GB +1486284600,1486284623,US +1486284624,1486284647,GB +1486284648,1486284655,US +1486284656,1486284671,GB +1486284672,1486284735,US +1486284736,1486284743,GB +1486284744,1486284799,US +1486284800,1486284815,GB +1486284816,1486284823,US +1486284824,1486284831,GB +1486284832,1486284839,US +1486284840,1486284855,GB +1486284856,1486284871,US +1486284872,1486284879,GB +1486284880,1486284895,US +1486284896,1486284903,GB +1486284904,1486284919,US +1486284920,1486284959,GB +1486284960,1486284983,US +1486284984,1486284991,GB +1486284992,1486284999,US +1486285000,1486285023,GB +1486285024,1486285039,US +1486285040,1486285055,GB +1486285056,1486285071,US +1486285072,1486285095,GB +1486285096,1486285103,US +1486285104,1486285135,GB +1486285136,1486285143,US +1486285144,1486285151,GB +1486285152,1486285153,US +1486285154,1486285167,GB +1486285168,1486285223,US +1486285224,1486285231,GB +1486285232,1486285439,US +1486285440,1486285447,GB +1486285448,1486285471,US +1486285472,1486285487,GB +1486285488,1486285519,US +1486285520,1486285535,GB +1486285536,1486285599,US +1486285600,1486285631,GB +1486285632,1486285663,US +1486285664,1486285695,GB +1486285696,1486285703,US +1486285704,1486285711,GB +1486285712,1486285727,US +1486285728,1486285735,GB +1486285736,1486285743,US +1486285744,1486285759,GB +1486285760,1486285823,US +1486285824,1486285951,GB +1486285952,1486286079,US +1486286080,1486286351,GB +1486286352,1486286391,US +1486286392,1486286399,GB +1486286400,1486286415,US +1486286416,1486286431,GB +1486286432,1486286447,US +1486286448,1486286455,GB +1486286456,1486286463,US +1486286464,1486286495,GB +1486286496,1486286527,US +1486286528,1486286575,GB +1486286576,1486286583,US +1486286584,1486286591,GB +1486286592,1486286687,US +1486286688,1486286719,GB +1486286720,1486286735,US +1486286736,1486286743,GB +1486286744,1486286751,US +1486286752,1486286759,GB +1486286760,1486286767,US +1486286768,1486286815,GB +1486286816,1486286847,US +1486286848,1486287831,GB +1486287832,1486287847,US +1486287848,1486288079,GB +1486288080,1486288087,US +1486288088,1486288095,GB +1486288096,1486288151,US +1486288152,1486288167,GB +1486288168,1486288183,US +1486288184,1486288215,GB +1486288216,1486288223,US +1486288224,1486288271,GB +1486288272,1486288319,US +1486288320,1486288351,GB +1486288352,1486288383,US +1486288384,1486288639,GB +1486288640,1486288663,US +1486288664,1486288679,GB +1486288680,1486288687,US +1486288688,1486288703,GB +1486288704,1486288735,US +1486288736,1486288751,GB +1486288752,1486288759,US +1486288760,1486288767,GB +1486288768,1486288791,US +1486288792,1486288799,GB +1486288800,1486288823,US +1486288824,1486288903,GB +1486288904,1486288905,US +1486288906,1486288907,GB +1486288908,1486288909,US +1486288910,1486288911,GB +1486288912,1486288935,US +1486288936,1486288943,GB +1486288944,1486288951,US +1486288952,1486288991,GB +1486288992,1486288999,US +1486289000,1486289015,GB +1486289016,1486289023,US +1486289024,1486289535,GB +1486289536,1486289567,US +1486289568,1486289583,GB +1486289584,1486289599,US +1486289600,1486289615,GB +1486289616,1486289631,US +1486289632,1486289767,GB +1486289768,1486289791,US +1486289792,1486289823,GB +1486289824,1486289839,US +1486289840,1486289863,GB +1486289864,1486289871,US +1486289872,1486289883,GB +1486289884,1486289919,US +1486289920,1486290623,GB +1486290624,1486290943,US +1486290944,1486292991,GB 1486292992,1486295039,RU 1486295040,1486297087,ES 1486297088,1486299135,IE @@ -28730,7 +30325,9 @@ 1489665792,1489666047,IT 1489666048,1489674239,GB 1489674240,1489676287,NL -1489676288,1489688575,GB +1489676288,1489678943,GB +1489678944,1489678959,US +1489678960,1489688575,GB 1489688576,1489688831,IL 1489688832,1489689087,GB 1489689088,1489689343,IL @@ -28788,7 +30385,11 @@ 1490305024,1490321407,DK 1490321408,1490325503,GB 1490325504,1490328575,FR -1490328576,1490337791,GB +1490328576,1490336767,GB +1490336768,1490337023,ES +1490337024,1490337279,GB +1490337280,1490337535,ES +1490337536,1490337791,GB 1490337792,1490354175,RU 1490354176,1490386943,SA 1490386944,1490403327,CH @@ -28940,6 +30541,7 @@ 1495160240,1495160255,FR 1495160256,1495160263,GB 1495160320,1495160575,FR +1495160576,1495160831,CN 1495162112,1495162367,DE 1495162496,1495162499,DE 1495162608,1495162623,GB @@ -29168,7 +30770,8 @@ 1495467008,1495468031,RO 1495468032,1495470079,MD 1495470080,1495472127,NL -1495472128,1495474175,RO +1495472128,1495473151,RO +1495473152,1495474175,GB 1495474176,1495474431,NL 1495474432,1495474687,RO 1495474688,1495474943,MD @@ -29177,8 +30780,7 @@ 1495478272,1495479295,RO 1495479296,1495479551,TR 1495479552,1495480319,RO -1495480320,1495480575,NL -1495480576,1495480831,RO +1495480320,1495480831,NL 1495480832,1495481343,IR 1495481344,1495482367,RO 1495482368,1495484415,IR @@ -29234,8 +30836,8 @@ 1495531520,1495535615,RO 1495535616,1495536127,IR 1495536128,1495537663,RO -1495539712,1495540735,RO -1495540736,1495540991,NL +1495539712,1495540735,US +1495540736,1495540991,GB 1495540992,1495541247,RO 1495541248,1495541759,GB 1495541760,1495543807,RO @@ -29282,8 +30884,8 @@ 1495589376,1495589887,IR 1495589888,1495590143,IT 1495590144,1495590655,RO -1495590656,1495591935,US -1495591936,1495596031,RO +1495590656,1495592959,US +1495592960,1495596031,RO 1495596032,1495596543,IR 1495596544,1495596799,RO 1495596800,1495597055,MD @@ -29298,9 +30900,12 @@ 1495607552,1495607807,RO 1495607808,1495608319,IR 1495608320,1495609343,MD -1495609344,1495617535,RO +1495609344,1495613439,RO +1495613440,1495614463,GB +1495614464,1495617535,RO 1495617536,1495618559,ES -1495618560,1495620607,RO +1495618560,1495619583,BE +1495619584,1495620607,AT 1495620608,1495621375,GB 1495621376,1495621631,RO 1495621632,1495621887,GB @@ -29331,18 +30936,21 @@ 1495653376,1495654399,KZ 1495654400,1495654911,RO 1495654912,1495655167,NL -1495655168,1495655423,BG -1495655424,1495656959,RO +1495655168,1495655423,GB +1495655424,1495656447,US +1495656448,1495656959,RO 1495656960,1495657215,GB -1495657216,1495658495,RO +1495657216,1495657471,RO +1495657472,1495658495,US 1495658496,1495662591,IR 1495662592,1495668735,RO 1495668736,1495669247,IR 1495669248,1495669503,GB -1495669504,1495670783,RO +1495669504,1495669759,RO +1495669760,1495670783,IL 1495670784,1495671807,MD 1495671808,1495672319,RO -1495672320,1495672575,NL +1495672320,1495672575,GB 1495672576,1495672831,MD 1495672832,1495674879,ES 1495674880,1495677951,RO @@ -29351,7 +30959,8 @@ 1495680000,1495682047,RO 1495682048,1495683071,MD 1495683072,1495687167,IR -1495687168,1495688703,RO +1495687168,1495688191,NL +1495688192,1495688703,RO 1495688704,1495689215,IR 1495689216,1495689727,RO 1495689728,1495690239,DE @@ -29361,14 +30970,16 @@ 1495695360,1495699455,RO 1495699456,1495700479,GB 1495700480,1495701503,FR -1495701504,1495704575,RO +1495701504,1495703551,RO +1495703552,1495704575,NL 1495704576,1495705599,KZ 1495705600,1495709695,RO 1495709696,1495713791,IR 1495713792,1495715839,ES 1495715840,1495716863,RO 1495716864,1495717887,IR -1495717888,1495723519,RO +1495717888,1495719935,ES +1495719936,1495723519,RO 1495723520,1495724031,FR 1495724032,1495724287,GB 1495724288,1495724543,RO @@ -29389,7 +31000,7 @@ 1495749632,1495750655,MD 1495750656,1495752703,RO 1495752704,1495754751,MD -1495754752,1495755775,RO +1495754752,1495755775,NL 1495755776,1495756031,PL 1495756032,1495756799,RO 1495756800,1495758847,MD @@ -29412,9 +31023,12 @@ 1495767040,1495769087,ES 1495769088,1495771135,RO 1495771136,1495772159,PL -1495772160,1495775743,RO +1495772160,1495772671,US +1495772672,1495775743,RO 1495775744,1495776255,IR -1495776256,1495782399,RO +1495776256,1495781375,RO +1495781376,1495781631,IR +1495781632,1495782399,RO 1495782400,1495782911,GB 1495782912,1495783167,RO 1495783168,1495783423,GB @@ -29444,7 +31058,8 @@ 1495815168,1495816191,ES 1495816192,1495816703,RO 1495816704,1495817215,IR -1495817216,1495820799,RO +1495817216,1495817471,US +1495817472,1495820799,RO 1495820800,1495821311,IR 1495821312,1495821823,DE 1495821824,1495822335,IR @@ -29523,7 +31138,8 @@ 1495931648,1495931903,BG 1495931904,1495932159,RO 1495932160,1495932415,US -1495932416,1495932927,RO +1495932416,1495932671,RO +1495932672,1495932927,GB 1495932928,1495933439,IR 1495933440,1495934975,RO 1495934976,1495935231,GB @@ -29569,7 +31185,8 @@ 1495976960,1495977983,KZ 1495977984,1495979007,RO 1495979008,1495979263,NL -1495979264,1495979775,RO +1495979264,1495979519,US +1495979520,1495979775,RO 1495979776,1495980031,GB 1495980032,1495982079,RO 1495982080,1495983103,MD @@ -29635,7 +31252,9 @@ 1496066816,1496067071,QA 1496067072,1496072191,RO 1496072192,1496074239,ES -1496074240,1496082175,RO +1496074240,1496078335,RO +1496078336,1496079359,MD +1496079360,1496082175,RO 1496082176,1496082431,GB 1496082432,1496083967,RO 1496083968,1496084479,FR @@ -29712,7 +31331,9 @@ 1496182784,1496183039,ES 1496183040,1496183551,US 1496183552,1496184063,ES -1496184064,1496184831,US +1496184064,1496184740,US +1496184741,1496184741,ES +1496184742,1496184831,US 1496184832,1496188927,RO 1496188928,1496189951,ES 1496189952,1496190975,RO @@ -29721,8 +31342,8 @@ 1496197120,1496197631,MD 1496197632,1496198143,RO 1496198144,1496198655,IR -1496198656,1496198911,NL -1496198912,1496199167,GB +1496198656,1496198656,US +1496198657,1496199167,GB 1496199168,1496202239,RO 1496202240,1496202751,IR 1496202752,1496203263,RO @@ -29749,11 +31370,13 @@ 1496238080,1496240127,IQ 1496240128,1496242175,RO 1496242176,1496243199,IR -1496243200,1496248595,RO -1496248596,1496248596,MD -1496248597,1496253439,RO +1496243200,1496248575,RO +1496248576,1496248831,MD +1496248832,1496253439,RO 1496253440,1496254463,ES -1496254464,1496260607,RO +1496254464,1496256255,RO +1496256256,1496256511,US +1496256512,1496260607,RO 1496260608,1496261119,IT 1496261120,1496262655,RO 1496262656,1496263167,BG @@ -29989,17 +31612,11 @@ 1503854592,1503887359,RU 1503887360,1503895567,DE 1503895568,1503895571,IT -1503895572,1503895663,DE -1503895664,1503895671,FR -1503895672,1503895679,DE +1503895572,1503895679,DE 1503895680,1503895687,IT -1503895688,1503895927,DE -1503895928,1503895935,DK -1503895936,1503896159,DE +1503895688,1503896159,DE 1503896160,1503896175,CH -1503896176,1503896343,DE -1503896344,1503896351,AT -1503896352,1503896411,DE +1503896176,1503896411,DE 1503896412,1503896415,AT 1503896416,1503897367,DE 1503897368,1503897375,BE @@ -30059,9 +31676,11 @@ 1504051200,1504083967,FI 1504083968,1504116735,DE 1504116736,1504149503,PL -1504149504,1504149693,GB +1504149504,1504149691,GB +1504149692,1504149693,US 1504149694,1504149694,IE -1504149695,1504149759,GB +1504149695,1504149695,US +1504149696,1504149759,GB 1504149760,1504150015,ES 1504150016,1504150271,GB 1504150272,1504150527,DE @@ -30138,13 +31757,7 @@ 1505646848,1505647103,PL 1505647104,1505648639,CZ 1505648640,1505656831,LT -1505665024,1505669491,IT -1505669492,1505669495,SI -1505669496,1505670159,IT -1505670160,1505670163,SI -1505670164,1505672239,IT -1505672240,1505672243,SI -1505672244,1505673215,IT +1505665024,1505673215,IT 1505673216,1505681407,BG 1505681408,1505689599,RU 1505689600,1505697791,NO @@ -30153,7 +31766,7 @@ 1505714176,1505722367,LV 1505722368,1505738751,PL 1505738752,1505746943,GB -1505746944,1505751039,IL +1505746944,1505751039,UA 1505751040,1505755135,RU 1505755136,1506017279,GB 1506017280,1506082815,IR @@ -30402,10 +32015,7 @@ 1508818944,1508830719,RO 1508830720,1508831487,SK 1508831488,1508835327,RO -1508835328,1508843519,CZ -1508843520,1508847615,GB -1508847616,1508849663,CZ -1508849664,1508851711,GB +1508835328,1508851711,CZ 1508851712,1508868095,PL 1508868096,1508884479,RU 1508884480,1508900863,DK @@ -30432,8 +32042,8 @@ 1509494784,1509498879,RU 1509498880,1509502975,DE 1509502976,1509507071,RU -1509507072,1509507327,GB -1509507328,1509507583,DE +1509507072,1509507199,GB +1509507200,1509507583,DE 1509507584,1509509375,GB 1509509376,1509509631,BE 1509509632,1509511167,GB @@ -30513,8 +32123,8 @@ 1510616832,1510617087,FR 1510617088,1510618111,RE 1510618112,1510618367,FR -1510618368,1510618879,RE -1510618880,1510619391,FR +1510618368,1510619135,RE +1510619136,1510619391,FR 1510619392,1510619647,RE 1510619648,1510619903,FR 1510619904,1510621183,RE @@ -30648,8 +32258,8 @@ 1512327680,1512328959,GP 1512328960,1512329215,FR 1512329216,1512332287,GP -1512332288,1512333055,FR -1512333056,1512333567,GP +1512332288,1512332799,FR +1512332800,1512333567,GP 1512333568,1512335615,FR 1512335616,1512336383,GP 1512336384,1512336639,FR @@ -30752,7 +32362,8 @@ 1518476288,1518476799,EE 1518476800,1518477311,SE 1518477312,1518481407,EE -1518481408,1518501887,SE +1518481408,1518493695,SE +1518493696,1518501887,LV 1518501888,1518503935,EE 1518503936,1518510079,LT 1518510080,1518516223,LV @@ -30767,10 +32378,8 @@ 1518565376,1518567423,SE 1518567424,1518583807,LV 1518583808,1518600191,HR -1518600192,1518633215,SE -1518633216,1518633471,NL -1518633472,1518641151,SE -1518641152,1518649343,NL +1518600192,1518641151,SE +1518641152,1518649343,HR 1518649344,1518665727,SE 1518665728,1518723071,LV 1518723072,1518727167,EE @@ -30801,7 +32410,8 @@ 1519208704,1519210495,LV 1519210496,1519214591,LT 1519214592,1519222783,LV -1519222784,1519271935,SE +1519222784,1519263743,SE +1519263744,1519271935,LV 1519271936,1519288319,NL 1519288320,1519292415,SE 1519292416,1519294463,LT @@ -30836,9 +32446,7 @@ 1520009216,1520041983,SY 1520041984,1520074751,RU 1520074752,1520107519,BG -1520107520,1520139767,GB -1520139768,1520139775,IE -1520139776,1520140287,GB +1520107520,1520140287,GB 1520140288,1520173055,RU 1520173056,1520205823,PL 1520205824,1520230399,RU @@ -30889,14 +32497,16 @@ 1532675072,1532682239,UA 1532682240,1532690431,LV 1532690432,1532755967,FR -1532755968,1532756991,DE -1532756992,1532774143,BG +1532755968,1532756223,GR +1532756224,1532756479,RO +1532756480,1532756735,UA +1532756736,1532774143,BG 1532774144,1532774399,CH 1532774400,1532784639,BG 1532784640,1532785151,TR 1532785152,1532787711,BG -1532787712,1532789759,DE -1532789760,1532795903,BG +1532787712,1532788735,DE +1532788736,1532795903,BG 1532795904,1532796927,DE 1532796928,1532797951,BG 1532797952,1532798975,DE @@ -31165,7 +32775,9 @@ 1534717344,1534717359,GB 1534717360,1534717739,FR 1534717740,1534717743,GB -1534717744,1534717995,FR +1534717744,1534717887,FR +1534717888,1534717895,GB +1534717896,1534717995,FR 1534717996,1534717999,GB 1534718000,1534718087,FR 1534718088,1534718091,ES @@ -31234,7 +32846,9 @@ 1534988288,1535049727,ES 1535049728,1535115263,SK 1535115264,1535116287,AT -1535116288,1535148031,SE +1535116288,1535123455,SE +1535123456,1535131647,LV +1535131648,1535148031,HR 1535148032,1535197183,AT 1535197184,1535203359,EE 1535203360,1535205375,SE @@ -31364,7 +32978,9 @@ 1535563372,1535563375,FI 1535563376,1535563455,FR 1535563456,1535563519,IE -1535563520,1535566143,FR +1535563520,1535564351,FR +1535564352,1535564415,IE +1535564416,1535566143,FR 1535566144,1535566159,ES 1535566160,1535566563,FR 1535566564,1535566567,GB @@ -31623,7 +33239,7 @@ 1539186688,1539194879,LV 1539194880,1539203071,RU 1539203072,1539204095,NL -1539204096,1539205119,IN +1539204096,1539205119,US 1539205120,1539206143,NL 1539206144,1539207167,GB 1539207168,1539211263,RU @@ -31907,7 +33523,8 @@ 1539530240,1539530751,AT 1539530752,1539531263,UA 1539531264,1539531775,RO -1539531776,1539532799,RU +1539531776,1539532543,RU +1539532544,1539532799,CZ 1539532800,1539533311,DE 1539533312,1539533823,CZ 1539533824,1539534335,PL @@ -32027,7 +33644,9 @@ 1539649024,1539649535,LB 1539649536,1539650559,UA 1539650560,1539651583,RU -1539651584,1539652607,UA +1539651584,1539651839,UA +1539651840,1539652095,RU +1539652096,1539652607,UA 1539652608,1539653631,IL 1539653632,1539654655,RU 1539655680,1539656703,NL @@ -32187,7 +33806,6 @@ 1539738112,1539738367,DK 1539738368,1539738623,DE 1539738624,1539738879,UA -1539738880,1539739135,NL 1539739136,1539739391,AT 1539739392,1539739647,UA 1539739648,1539739903,DK @@ -32211,7 +33829,6 @@ 1539745024,1539745279,GB 1539745280,1539745535,GI 1539745792,1539746303,DK -1539746816,1539747071,DK 1539747072,1539747327,CH 1539747328,1539747583,NL 1539747584,1539747839,UA @@ -32323,8 +33940,7 @@ 1539779840,1539780095,NL 1539780096,1539780351,RU 1539780608,1539780863,PL -1539780864,1539781119,RO -1539781120,1539781375,NL +1539780864,1539781375,RO 1539781376,1539781631,PL 1539781632,1539781887,HU 1539781888,1539782143,IL @@ -32355,7 +33971,6 @@ 1539788544,1539788799,HR 1539788800,1539789055,RU 1539789568,1539789823,DE -1539789824,1539790079,NL 1539790080,1539790335,CH 1539790336,1539790591,LV 1539790848,1539791103,DE @@ -32808,7 +34423,10 @@ 1540217856,1540218879,GB 1540218880,1540219903,RU 1540219904,1540220927,PL -1540220928,1540221951,US +1540220928,1540220991,US +1540220992,1540221439,NL +1540221440,1540221567,US +1540221568,1540221951,NL 1540221952,1540223999,RU 1540224000,1540225023,PL 1540225024,1540226047,GB @@ -33019,7 +34637,6 @@ 1540356608,1540357119,DE 1540357120,1540357631,RU 1540357632,1540358143,FR -1540358144,1540358399,RU 1540358400,1540358655,GB 1540358656,1540358911,SE 1540358912,1540359167,GB @@ -33152,7 +34769,6 @@ 1540396032,1540396287,NO 1540396288,1540396543,AM 1540396544,1540396799,PL -1540396800,1540397055,RU 1540397056,1540397311,IT 1540397312,1540397823,UA 1540397824,1540398079,DE @@ -33232,7 +34848,6 @@ 1540421376,1540421631,PL 1540421632,1540422143,RU 1540422144,1540422399,PL -1540422400,1540422655,UA 1540422656,1540422911,GB 1540422912,1540423423,RU 1540423424,1540423679,BA @@ -33496,8 +35111,8 @@ 1540554752,1540555775,SE 1540555776,1540556799,UZ 1540556800,1540557823,DE -1540557824,1540559871,UA -1540559872,1540562943,RU +1540557824,1540558848,UA +1540558849,1540562943,RU 1540562944,1540563967,AT 1540563968,1540564991,RU 1540564992,1540566015,DE @@ -33663,7 +35278,6 @@ 1540660224,1540660479,RU 1540660480,1540660735,FR 1540660736,1540660991,RU -1540660992,1540661247,RO 1540661760,1540662015,RO 1540662272,1540662527,RO 1540662528,1540662783,PL @@ -34343,7 +35957,7 @@ 1540981504,1540981759,DE 1540981760,1540982015,PL 1540982016,1540982271,DK -1540982272,1540982783,GB +1540982272,1540982527,GB 1540982784,1540983295,RU 1540983296,1540983551,ME 1540983808,1540984063,FR @@ -34670,7 +36284,6 @@ 1541177344,1541177599,CH 1541177600,1541177855,DE 1541177856,1541178111,RO -1541178112,1541178367,RU 1541178368,1541178623,GB 1541178624,1541178879,RU 1541178880,1541179135,DE @@ -35032,7 +36645,7 @@ 1541362944,1541363199,DK 1541363200,1541363455,UA 1541363456,1541363711,IE -1541363712,1541364223,UA +1541363712,1541363967,UA 1541364224,1541364479,RU 1541364480,1541364735,AT 1541364736,1541364991,SE @@ -35299,7 +36912,8 @@ 1541476352,1541477375,GB 1541477376,1541479423,RU 1541479424,1541480447,PL -1541480448,1541481471,RO +1541480448,1541480959,US +1541480960,1541481471,RO 1541481472,1541485567,UA 1541485568,1541486591,IR 1541486592,1541487615,UA @@ -35388,9 +37002,7 @@ 1541568000,1541568511,SE 1541568512,1541569535,RU 1541569536,1541570559,NL -1541570560,1541571583,RU -1541571584,1541572607,UA -1541572608,1541573119,RU +1541570560,1541573119,RU 1541573120,1541573631,UA 1541573632,1541574655,RU 1541574656,1541575167,SE @@ -36057,7 +37669,7 @@ 1541963520,1541964031,UA 1541964288,1541964543,NL 1541964544,1541965823,RU -1541965824,1541966847,NL +1541965824,1541966847,US 1541966848,1541967871,PL 1541967872,1541968895,RU 1541968896,1541969919,GB @@ -36226,7 +37838,6 @@ 1542068224,1542069759,UA 1542069760,1542070015,DE 1542070016,1542071295,UA -1542071296,1542071551,CN 1542071552,1542071807,UA 1542071808,1542072319,DE 1542072320,1542073343,UA @@ -36686,7 +38297,7 @@ 1542351616,1542351871,PL 1542351872,1542353151,RU 1542353152,1542353407,SA -1542353408,1542353919,RU +1542353664,1542353919,RU 1542353920,1542354943,IT 1542354944,1542355711,RU 1542355712,1542355967,GB @@ -36730,7 +38341,6 @@ 1542378496,1542378751,DK 1542379008,1542379519,GB 1542379520,1542379775,PL -1542379776,1542380031,RU 1542380032,1542380287,RO 1542380288,1542380543,BE 1542380544,1542380799,FR @@ -36875,7 +38485,7 @@ 1542454272,1542454783,NO 1542454784,1542455039,PL 1542455040,1542455295,SE -1542455296,1542455551,CH +1542455296,1542455551,US 1542455552,1542455807,RO 1542455808,1542456319,GB 1542456320,1542456831,RO @@ -36974,7 +38584,6 @@ 1542507520,1542508543,NO 1542508544,1542509567,RU 1542509568,1542510079,CY -1542510080,1542510335,RU 1542510592,1542510847,SI 1542510848,1542511103,DE 1542511104,1542511871,RU @@ -37196,8 +38805,9 @@ 1542904320,1542904575,IL 1542904576,1542904831,RU 1542904832,1542914047,UA -1542914048,1542922239,RU -1542922240,1542930431,UA +1542914048,1542923263,RU +1542923264,1542923775,BG +1542923776,1542930431,UA 1542930432,1542930943,CZ 1542930944,1542931455,IR 1542931456,1542932479,RU @@ -37242,9 +38852,7 @@ 1545863168,1545895935,RU 1545895936,1545928703,BA 1545928704,1545961471,SI -1545961472,1545994751,RU -1545994752,1545995007,CZ -1545995008,1545995519,RU +1545961472,1545995519,RU 1545995520,1545996287,CZ 1545996288,1545998335,RU 1545998336,1546000383,CZ @@ -37316,7 +38924,15 @@ 1546276864,1546278911,IT 1546278912,1546280959,RU 1546280960,1546283007,IT -1546283008,1546285055,DE +1546283008,1546283463,DE +1546283464,1546283471,FR +1546283472,1546283827,DE +1546283828,1546283835,FR +1546283836,1546284287,DE +1546284288,1546284291,FR +1546284292,1546284469,DE +1546284470,1546284471,FR +1546284472,1546285055,DE 1546285056,1546287103,PL 1546287104,1546289151,GB 1546289152,1546291199,RU @@ -37599,11 +39215,17 @@ 1550996224,1550996479,AU 1550996480,1550998527,RO 1550998528,1550998783,IT -1550998784,1551007743,RO +1550998784,1551000575,RO +1551000576,1551001599,NL +1551001600,1551007743,RO 1551007744,1551106047,MD 1551106048,1551237119,DE 1551237120,1551302655,GR -1551368192,1551499263,NL +1551368192,1551450111,NL +1551450112,1551452159,SG +1551452160,1551454207,NL +1551454208,1551456255,US +1551456256,1551499263,NL 1551503360,1551504383,GB 1551504384,1551505407,FR 1551516672,1551517695,IT @@ -37651,7 +39273,9 @@ 1558079872,1558079887,GB 1558079888,1558081175,FR 1558081176,1558081183,BE -1558081184,1558082943,FR +1558081184,1558082139,FR +1558082140,1558082143,ES +1558082144,1558082943,FR 1558082944,1558082959,PL 1558082960,1558083775,FR 1558083776,1558083791,DE @@ -37665,7 +39289,9 @@ 1558084656,1558084659,BE 1558084660,1558085055,FR 1558085056,1558085071,GB -1558085072,1558091351,FR +1558085072,1558088319,FR +1558088320,1558088323,ES +1558088324,1558091351,FR 1558091352,1558091352,ES 1558091353,1558093531,FR 1558093532,1558093532,HR @@ -37679,7 +39305,9 @@ 1558102508,1558102508,DE 1558102509,1558103159,FR 1558103160,1558103167,GB -1558103168,1558106901,FR +1558103168,1558103967,FR +1558103968,1558103999,ES +1558104000,1558106901,FR 1558106902,1558106902,DE 1558106903,1558107391,FR 1558107392,1558107455,NL @@ -37700,11 +39328,25 @@ 1558119424,1558122495,RU 1558122496,1558123007,SG 1558123008,1558123519,RU -1558123520,1558126591,LU +1558123520,1558125567,LU +1558125568,1558126079,SG +1558126080,1558126335,DE +1558126336,1558126591,LU 1558126592,1558128639,RU -1558128640,1558129663,LU +1558128640,1558128895,US +1558128896,1558129151,LU +1558129152,1558129407,RU +1558129408,1558129663,LU 1558129664,1558130687,US -1558130688,1558138879,LU +1558130688,1558131199,AU +1558131200,1558131711,LU +1558131712,1558132223,HK +1558132224,1558136831,LU +1558136832,1558137087,RU +1558137088,1558137343,KR +1558137344,1558137855,CZ +1558137856,1558138367,HK +1558138368,1558138879,AU 1558138880,1558139135,RU 1558139136,1558139391,NL 1558139392,1558139903,US @@ -37712,16 +39354,27 @@ 1558140160,1558140415,RU 1558140416,1558140671,SG 1558140672,1558140927,RU -1558140928,1558141439,LU +1558140928,1558141183,LU +1558141184,1558141184,CY +1558141185,1558141439,LU 1558141440,1558141695,CY 1558141696,1558141951,RU -1558141952,1558142463,LU +1558141952,1558142463,PL 1558142464,1558142719,US -1558142720,1558147583,LU +1558142720,1558142975,SG +1558142976,1558143231,US +1558143232,1558143743,LU +1558143744,1558143999,RU +1558144000,1558144255,LU +1558144256,1558145023,RU +1558145024,1558145535,LU +1558145536,1558145791,RU +1558145792,1558146047,US +1558146048,1558146815,RU +1558146816,1558147583,LU 1558147584,1558147839,RU 1558147840,1558148095,LU -1558148096,1558148351,SG -1558148352,1558148607,LU +1558148096,1558148607,SG 1558148608,1558149631,US 1558149632,1558150143,RU 1558150144,1558150655,DE @@ -37806,12 +39459,17 @@ 1559838720,1559855103,UA 1559855104,1559887871,HU 1559887872,1559920639,PT -1559920640,1559932927,LU +1559920640,1559921407,LU +1559921408,1559921663,FR +1559921664,1559932159,LU +1559932160,1559932415,FR +1559932416,1559932927,LU 1559932928,1559934975,DE 1559934976,1559937023,LU 1559937024,1559943167,DE 1559943168,1559944191,LU -1559944192,1559945727,FR +1559944192,1559945215,FR +1559945216,1559945727,LU 1559945728,1559946751,GB 1559946752,1559947519,DE 1559947520,1559948287,LU @@ -37829,10 +39487,9 @@ 1560117248,1560125439,CZ 1560125440,1560135679,RU 1560135680,1560135807,UA -1560135808,1560135935,CZ -1560135936,1560139775,GB -1560139776,1560141823,CZ -1560141824,1560143871,GB +1560135808,1560136447,CZ +1560136448,1560139775,GB +1560139776,1560143871,CZ 1560143872,1560145919,FR 1560145920,1560150015,CZ 1560150016,1560182783,NL @@ -37840,7 +39497,11 @@ 1560215552,1560281087,RU 1560281088,1562378239,FR 1562378240,1564999679,IT -1564999680,1565239295,UA +1564999680,1565224959,UA +1565224960,1565227007,BG +1565227008,1565227519,UA +1565227520,1565229055,BG +1565229056,1565239295,UA 1565239296,1565241343,RU 1565241344,1565294591,UA 1565294592,1565302783,PT @@ -37854,7 +39515,9 @@ 1565786112,1565917183,BY 1565917184,1565934591,RS 1565934592,1565935103,XK -1565935104,1566048255,RS +1565935104,1566019583,RS +1566019584,1566020095,XK +1566020096,1566048255,RS 1566048256,1566052351,RU 1566056448,1566060543,IT 1566060544,1566064639,UA @@ -37950,7 +39613,8 @@ 1566384128,1566386175,CZ 1566386176,1566388223,FR 1566388224,1566388479,HK -1566388480,1566390271,LU +1566388480,1566390015,LU +1566390016,1566390271,US 1566390272,1566392319,LT 1566392320,1566394367,ES 1566394368,1566394528,NO @@ -38198,7 +39862,7 @@ 1567826432,1567827455,RO 1567827456,1567827711,BG 1567827712,1567830015,RO -1567830016,1567831039,DE +1567830016,1567831039,US 1567831040,1567832831,RO 1567832832,1567833087,GB 1567833088,1567833599,NL @@ -38219,7 +39883,8 @@ 1567850496,1567852543,RO 1567852544,1567854591,MD 1567854592,1567856639,IR -1567856640,1567857663,RO +1567856640,1567857407,RO +1567857408,1567857663,US 1567857664,1567858687,ES 1567858688,1567860735,SE 1567860736,1567861247,BE @@ -38369,10 +40034,9 @@ 1570619392,1570621439,BA 1570621440,1570625535,RU 1570625536,1570627583,GB -1570627584,1570635775,RU -1570635776,1570644767,FR -1570644768,1570644775,GB -1570644776,1570644991,FR +1570627584,1570629631,KG +1570629632,1570635775,RU +1570635776,1570644991,FR 1570644992,1570645247,GB 1570645248,1570652159,FR 1570652160,1570660863,SE @@ -38412,8 +40076,8 @@ 1571426048,1571426303,UA 1571426304,1571428351,RU 1571428352,1571428607,CZ -1571428608,1571428863,UA -1571428864,1571429375,CZ +1571428608,1571429119,UA +1571429120,1571429375,CZ 1571429376,1571430399,BY 1571430400,1571430911,UA 1571430912,1571431167,BY @@ -38479,7 +40143,7 @@ 1571484160,1571484671,CZ 1571484672,1571484927,KZ 1571484928,1571486719,RU -1571486720,1571486975,CZ +1571486720,1571486975,BY 1571486976,1571487231,NL 1571487232,1571488767,RU 1571488768,1571489023,CZ @@ -38787,9 +40451,8 @@ 1572669440,1572673535,RU 1572673536,1572675583,AT 1572675584,1572677631,ES -1572677632,1572681983,RU -1572681984,1572682239,NL -1572682240,1572683775,RU +1572677632,1572681727,RU +1572681728,1572683775,NL 1572683776,1572685823,CH 1572685824,1572689919,RU 1572689920,1572691967,ES @@ -38863,6 +40526,7 @@ 1572835328,1572837375,IE 1572837376,1572839423,DK 1572839424,1572841471,DE +1572841728,1572841983,GB 1572842752,1572843007,NL 1572843520,1572845567,JO 1572845568,1572847615,FR @@ -39002,7 +40666,9 @@ 1578596352,1578596863,GB 1578596864,1578602495,FR 1578602496,1578604543,NL -1578604544,1578606591,RU +1578604544,1578605014,RU +1578605015,1578605015,GB +1578605016,1578606591,RU 1578606592,1578608639,DE 1578608640,1578610687,CZ 1578610688,1578611039,FR @@ -39053,7 +40719,9 @@ 1578614496,1578614511,DE 1578614512,1578614583,FR 1578614584,1578614591,GB -1578614592,1578631167,FR +1578614592,1578615915,FR +1578615916,1578615916,GB +1578615917,1578631167,FR 1578631168,1578637311,IR 1578637312,1578651647,RO 1578651648,1578657791,IR @@ -39116,10 +40784,7 @@ 1580125952,1580126207,GB 1580126208,1580128255,CY 1580128256,1580129279,NL -1580129280,1580129535,GB -1580129536,1580130079,US -1580130080,1580130095,GB -1580130096,1580130303,US +1580129280,1580130303,GB 1580130304,1580134399,CY 1580134400,1580135423,SE 1580135424,1580136447,GB @@ -39128,7 +40793,11 @@ 1580137472,1580138495,SE 1580138496,1580150783,IT 1580150784,1580154879,SY -1580154880,1580204031,IT +1580154880,1580199935,IT +1580199936,1580200959,SY +1580200960,1580201983,IT +1580201984,1580203007,SY +1580203008,1580204031,IT 1580204032,1580335103,SA 1580335104,1580466175,RU 1580466176,1580597247,RO @@ -39167,9 +40836,7 @@ 1582252032,1582268415,TR 1582268416,1582284799,DE 1582284800,1582301183,BH -1582301184,1583089271,IT -1583089272,1583089279,SI -1583089280,1583349759,IT +1582301184,1583349759,IT 1583349760,1583611903,SA 1583611904,1583615999,LV 1583616000,1583617791,NL @@ -39227,8 +40894,8 @@ 1583780432,1583780447,GB 1583780448,1583780455,IT 1583780456,1583780743,GB -1583780744,1583780759,IT -1583780760,1583780767,GB +1583780744,1583780751,IT +1583780752,1583780767,GB 1583780768,1583780775,IT 1583780776,1583780791,GB 1583780792,1583780799,IT @@ -39242,9 +40909,7 @@ 1583781672,1583781679,IT 1583781680,1583781863,GB 1583781864,1583781871,IT -1583781872,1583782239,GB -1583782240,1583782247,IT -1583782248,1583782415,GB +1583781872,1583782415,GB 1583782416,1583782423,IT 1583782424,1583782431,GB 1583782432,1583782439,IT @@ -39332,7 +40997,9 @@ 1585258496,1585260543,GB 1585260544,1585264639,RU 1585264640,1585265663,MT -1585265664,1585266687,IM +1585265664,1585265967,IM +1585265968,1585265983,FR +1585265984,1585266687,IM 1585266688,1585270783,DE 1585270784,1585272831,IT 1585272832,1585274879,RU @@ -39415,7 +41082,8 @@ 1585440768,1585442815,IT 1585442816,1585446911,RU 1585446912,1585577983,KW -1585577984,1585709055,UA +1585577984,1585643519,DE +1585643520,1585709055,UA 1585709056,1585840127,PT 1585840128,1585971199,DE 1585971200,1585979391,AT @@ -39558,7 +41226,8 @@ 1588594688,1588602879,IR 1588602880,1588603135,RO 1588603136,1588603391,BG -1588603392,1588604927,RO +1588603392,1588603903,RO +1588603904,1588604927,IT 1588604928,1588609023,IR 1588609024,1588613119,MD 1588613120,1588617215,IR @@ -39577,11 +41246,14 @@ 1588640768,1588641279,LT 1588641280,1588641535,RO 1588641536,1588641791,GB -1588641792,1588643839,ES +1588641792,1588642303,ES +1588642304,1588642559,DK +1588642560,1588642815,NL +1588642816,1588643839,ES 1588643840,1588649983,RO 1588649984,1588652031,SE 1588652032,1588652159,NL -1588652160,1588654079,RO +1588652160,1588654079,LT 1588654080,1588658175,DE 1588658176,1588659199,RO 1588659200,1588659711,GB @@ -39593,19 +41265,20 @@ 1588663808,1588664063,GB 1588664064,1588664319,RO 1588664320,1588664575,TH -1588664576,1588664831,VG -1588664832,1588665087,RO +1588664576,1588665087,RO 1588665088,1588665343,GB 1588665344,1588673535,RO 1588673536,1588674559,BG -1588674560,1588676607,RO +1588674560,1588674815,RO +1588674816,1588675071,US +1588675072,1588675583,RO +1588675584,1588676607,IT 1588676608,1588678655,IR 1588678656,1588680703,RO 1588680704,1588682751,LU 1588682752,1588684799,RO 1588684800,1588685055,TH -1588685056,1588685311,VG -1588685312,1588686847,RO +1588685056,1588686847,RO 1588686848,1588687103,NO 1588687104,1588687359,GB 1588687360,1588688383,RO @@ -39649,8 +41322,9 @@ 1589551104,1589560319,BG 1589560320,1589561343,GI 1589561344,1589563391,NL -1589563392,1589573631,BG -1589573632,1589574655,GB +1589563392,1589569535,HK +1589569536,1589573631,BG +1589573632,1589574655,US 1589574656,1589575679,BG 1589575680,1589608447,RU 1589608448,1589616639,SE @@ -39824,7 +41498,11 @@ 1592577024,1592590335,BG 1592590336,1592594431,FI 1592594432,1592598527,DE -1592598528,1592623103,FI +1592598528,1592600575,FI +1592600576,1592601599,NL +1592601600,1592606719,FI +1592606720,1592608767,SG +1592608768,1592623103,FI 1592623104,1592655871,RU 1592655872,1592786943,FR 1592786944,1592803327,PL @@ -39964,10 +41642,9 @@ 1596858368,1596858879,CZ 1596858880,1596859391,RU 1596859392,1596859903,CZ -1596859904,1596860415,RU -1596860416,1596861439,BY +1596859904,1596861439,RU 1596861440,1596861951,UA -1596861952,1596862207,BY +1596861952,1596862207,CZ 1596862208,1596866559,RU 1596866560,1596868607,UZ 1596868608,1596869631,RU @@ -40003,7 +41680,10 @@ 1596888064,1596889599,RU 1596889600,1596889855,KG 1596889856,1596890111,UA -1596890112,1596890623,RU +1596890112,1596890367,RU +1596890368,1596890619,UA +1596890620,1596890620,RU +1596890621,1596890623,UA 1596890624,1596890879,CZ 1596890880,1596891135,RU 1596891136,1596892159,UA @@ -40026,8 +41706,8 @@ 1596930383,1596930383,TM 1596930384,1596931071,CZ 1596931072,1596931583,BY -1596931584,1596932095,CZ -1596932096,1596940287,RU +1596931584,1596931839,CZ +1596931840,1596940287,RU 1596940288,1596940543,CZ 1596940544,1596940799,RU 1596940800,1596941055,UA @@ -40071,9 +41751,7 @@ 1596968960,1596973055,BA 1596973056,1596975103,BY 1596975104,1596975359,CZ -1596975360,1596977663,RU -1596977664,1596977919,CZ -1596977920,1596978431,RU +1596975360,1596978431,RU 1596978432,1596978944,CZ 1596978945,1596978945,RU 1596978946,1596980223,CZ @@ -40213,8 +41891,7 @@ 1602291712,1602293759,SA 1602293760,1602295807,GB 1602295808,1602297855,NL -1602297856,1602299391,IL -1602299392,1602299903,GB +1602297856,1602299903,IL 1602299904,1602301951,GR 1602301952,1602303999,DE 1602304000,1602306047,RU @@ -40514,19 +42191,11 @@ 1605099520,1605107711,RU 1605107712,1605108247,GB 1605108248,1605108255,IT -1605108256,1605108583,GB -1605108584,1605108591,IT -1605108592,1605109079,GB -1605109080,1605109087,IT -1605109088,1605109223,GB -1605109224,1605109231,IT -1605109232,1605109351,GB +1605108256,1605109351,GB 1605109352,1605109359,IT 1605109360,1605109495,GB 1605109496,1605109503,IT -1605109504,1605110183,GB -1605110184,1605110191,IT -1605110192,1605110263,GB +1605109504,1605110263,GB 1605110264,1605110271,IT 1605110272,1605110303,GB 1605110304,1605110311,IT @@ -40769,9 +42438,7 @@ 1611005952,1611007999,NL 1611008000,1611009023,US 1611009024,1611010047,NL -1611010048,1611016703,US -1611016704,1611016959,NL -1611016960,1611036671,US +1611010048,1611036671,US 1611036672,1611037183,NL 1611037184,1611042815,US 1611042816,1611046911,NL @@ -40856,9 +42523,7 @@ 1632305152,1632321535,CA 1632321536,1632354303,US 1632354304,1632362495,CA -1632362496,1632979455,US -1632979456,1632979583,CA -1632979584,1634414591,US +1632362496,1634414591,US 1634414592,1634418687,CA 1634418688,1634447359,US 1634447360,1634451455,CA @@ -40894,9 +42559,7 @@ 1654554624,1654558719,CA 1654558720,1654648831,US 1654648832,1654652927,CA -1654652928,1660561023,US -1660561024,1660561151,CA -1660561152,1673527295,US +1654652928,1673527295,US 1673527296,1673560063,CA 1673560064,1673986047,US 1673986048,1674051583,CA @@ -40964,7 +42627,9 @@ 1699618816,1699627007,CN 1699627008,1699643391,SG 1699643392,1699676159,HK -1699676160,1699741695,KR +1699676160,1699714047,KR +1699714048,1699714815,AU +1699714816,1699741695,KR 1699741696,1700793343,CN 1700793344,1700794367,VN 1700794368,1700798463,CN @@ -41041,9 +42706,12 @@ 1710882816,1710948351,KR 1710948352,1710949375,CN 1710949376,1710950399,NP -1710950400,1711210495,CN +1710950400,1710972671,CN +1710972672,1710972927,TW +1710972928,1711210495,CN 1711210496,1711276031,ID 1724715556,1724715556,MU +1727528960,1728053247,ZA 1728053248,1728120063,AU 1728120064,1728120319,SG 1728120320,1728120575,IN @@ -41362,7 +43030,6 @@ 1728488192,1728488447,MY 1728488448,1728488703,IN 1728488704,1728488959,TH -1728488960,1728489215,HK 1728489216,1728490495,IN 1728490496,1728491519,KR 1728491520,1728492543,HK @@ -41431,7 +43098,7 @@ 1728549632,1728549887,AU 1728549888,1728550911,IN 1728550912,1728551935,JP -1728551936,1728552959,MY +1728551936,1728552959,SG 1728552960,1728553983,HK 1728553984,1728555007,AU 1728555008,1728556031,NZ @@ -41618,7 +43285,6 @@ 1728733184,1728734207,ID 1728734208,1728735231,SG 1728735232,1728736255,ID -1728736256,1728736511,HK 1728736512,1728736767,IN 1728736768,1728737023,ID 1728737280,1728738303,JP @@ -41737,7 +43403,6 @@ 1728836608,1728837631,HK 1728837632,1728838655,KR 1728838656,1728839679,ID -1728839680,1728839935,MN 1728839936,1728840191,IN 1728840192,1728840447,SG 1728840448,1728842751,AU @@ -41779,8 +43444,7 @@ 1728872448,1728873471,AU 1728873472,1728874495,IN 1728874496,1728875519,CN -1728875520,1728876543,HK -1728876544,1728877567,MY +1728875520,1728877567,MY 1728877568,1728878591,HK 1728878592,1728879615,MY 1728879616,1728880127,IN @@ -41976,7 +43640,6 @@ 1729042944,1729044479,HK 1729044480,1729045503,JP 1729045504,1729046015,ID -1729046016,1729046271,HK 1729046272,1729046527,JP 1729046528,1729047551,BD 1729047552,1729048575,AU @@ -42265,7 +43928,7 @@ 1729314816,1729317887,CN 1729317888,1729319423,ID 1729319424,1729319935,SG -1729319936,1729320959,HK +1729319936,1729320959,US 1729320960,1729321983,IN 1729321984,1729323007,AU 1729323008,1729324031,VN @@ -42389,7 +44052,7 @@ 1729441792,1729442815,AU 1729442816,1729443839,IN 1729443840,1729444351,AU -1729444352,1729444863,AE +1729444352,1729444863,IN 1729444864,1729445887,TW 1729445888,1729446399,SG 1729446400,1729446911,IN @@ -42443,7 +44106,7 @@ 1729532928,1729533951,MY 1729533952,1729534975,JP 1729534976,1729535999,TW -1729536000,1729537023,HK +1729536000,1729537023,MY 1729537024,1729537791,ID 1729537792,1729538047,JP 1729538048,1729538559,ID @@ -42518,7 +44181,6 @@ 1729600512,1729601535,VN 1729601536,1729603583,CN 1729603584,1729604607,HK -1729604608,1729605119,IN 1729605120,1729605375,AU 1729605376,1729605631,ID 1729605632,1729606655,CN @@ -42725,7 +44387,9 @@ 1729807360,1729808383,MY 1729808384,1729808895,IN 1729808896,1729809407,AU -1729809408,1729810431,IN +1729809408,1729809663,IN +1729809664,1729810175,US +1729810176,1729810431,IN 1729810432,1729812479,ID 1729812480,1729813503,IN 1729813504,1729814527,SG @@ -43103,7 +44767,7 @@ 1730377728,1730378239,IN 1730378240,1730378495,HK 1730378496,1730378751,IN -1730378752,1730379775,HK +1730378752,1730379775,US 1730379776,1730380799,AU 1730380800,1730381823,IN 1730381824,1730382847,MY @@ -43277,8 +44941,7 @@ 1730594816,1730596863,IN 1730597888,1730598911,PH 1730599424,1730599935,VU -1730599936,1730604031,CN -1730604032,1730605055,NP +1730599936,1730605055,CN 1730605056,1730607103,IN 1730608128,1730609151,CN 1730609152,1730610687,IN @@ -43392,7 +45055,7 @@ 1730768640,1730768895,BD 1730769920,1730770943,HK 1730770944,1730771967,ID -1730771968,1730772991,CN +1730771968,1730772991,HK 1730772992,1730774015,SG 1730774016,1730775039,HK 1730775040,1730776063,JP @@ -43501,7 +45164,7 @@ 1730895872,1730898943,CN 1730898944,1730899967,MO 1730899968,1730900991,IN -1730900992,1730901247,HK +1730900992,1730901247,AU 1730901248,1730901503,SG 1730901504,1730901759,DE 1730901760,1730902015,AU @@ -43557,7 +45220,7 @@ 1730948608,1730949119,AU 1730949120,1730951167,IN 1730951168,1730952191,CN -1730952192,1730953215,HK +1730952192,1730954239,HK 1730954240,1730955263,SG 1730955264,1730957311,BD 1730957312,1730958335,CN @@ -43663,7 +45326,7 @@ 1731161088,1731162111,CN 1731162112,1731163135,HK 1731163136,1731165183,CN -1731165184,1731167231,IN +1731165184,1731166207,IN 1731167232,1731168255,ID 1731168256,1731170559,CN 1731170560,1731170687,HK @@ -43711,7 +45374,7 @@ 1731206656,1731206911,PH 1731206912,1731207167,JP 1731207168,1731208191,IN -1731208192,1731210239,JP +1731208192,1731209215,JP 1731210240,1731211263,IN 1731211264,1731211775,HK 1731211776,1731212287,IN @@ -43766,7 +45429,7 @@ 1731275776,1731276799,KR 1731276800,1731279871,IN 1731279872,1731280895,HK -1731280896,1731281919,JP +1731280896,1731281919,TH 1731281920,1731282175,IN 1731282176,1731282431,PK 1731282432,1731282943,PH @@ -43880,14 +45543,13 @@ 1731423232,1731424255,HK 1731424256,1731425279,AU 1731425280,1731426303,IN -1731426304,1731427327,BD 1731427328,1731428351,KH 1731428352,1731428607,IN 1731428864,1731429119,AU 1731429120,1731429375,ID 1731429376,1731431423,IN 1731431424,1731431935,TR -1731431936,1731432191,TW +1731431936,1731432191,HK 1731432192,1731432447,TR 1731432448,1731433471,HK 1731433472,1731435519,IN @@ -43934,12 +45596,12 @@ 1731484672,1731485695,VN 1731485696,1731488767,CN 1731488768,1731489791,JP -1731489792,1731490815,HK +1731489792,1731490559,HK +1731490560,1731490815,TW 1731490816,1731491839,AU 1731491840,1731492863,ID 1731492864,1731493887,IN 1731493888,1731495167,JP -1731495168,1731495423,SG 1731495424,1731495935,BD 1731495936,1731496959,IN 1731496960,1731497983,BD @@ -44045,8 +45707,7 @@ 1731608576,1731609599,IN 1731609600,1731610623,AU 1731610624,1731611647,KR -1731611648,1731612159,PK -1731612672,1731614719,PK +1731611648,1731614719,PK 1731614720,1731615743,JP 1731615744,1731616767,ID 1731616768,1731620351,IN @@ -44222,7 +45883,8 @@ 1731804160,1731805183,KR 1731806208,1731806463,AU 1731806464,1731807231,IN -1731807232,1731807999,SG +1731807232,1731807743,SG +1731807744,1731807999,JP 1731808000,1731808255,DK 1731808256,1731809279,CN 1731809280,1731811583,IN @@ -44246,8 +45908,8 @@ 1731827712,1731828735,PK 1731828736,1731829759,SG 1731829760,1731830783,IN -1731830784,1731831039,SG -1731831040,1731831807,AU +1731830784,1731831551,SG +1731831552,1731831807,AU 1731831808,1731832831,PK 1731832832,1731836927,IN 1731836928,1731837951,MY @@ -44325,7 +45987,6 @@ 1731957760,1731958783,CN 1731958784,1731959807,IN 1731959808,1731960831,KR -1731960832,1731961855,AU 1731961856,1731962879,CN 1731962880,1731963903,BD 1731963904,1731964927,KH @@ -44394,7 +46055,12 @@ 1732043776,1732044799,CN 1732044800,1732045823,HK 1732045824,1732046847,CN -1732046848,1732047871,AU +1732046848,1732046943,AU +1732046944,1732046951,CN +1732046952,1732046959,GB +1732046960,1732046967,AU +1732046968,1732046975,GB +1732046976,1732047871,AU 1732047872,1732048895,IN 1732048896,1732049919,HK 1732049920,1732050943,PH @@ -44463,8 +46129,7 @@ 1732127744,1732128767,HK 1732128768,1732129023,SG 1732129024,1732129279,NZ -1732129280,1732129535,AU -1732129536,1732129791,HK +1732129280,1732129791,AU 1732129792,1732130815,CN 1732130816,1732134911,IN 1732134912,1732140031,CN @@ -44534,7 +46199,10 @@ 1732318208,1732318719,IN 1732318720,1732318975,AU 1732318976,1732322303,IN -1732322304,1732324351,CN +1732322304,1732322815,CN +1732322816,1732323327,HK +1732323328,1732323839,CN +1732323840,1732324351,HK 1732324352,1732325375,JP 1732325376,1732337663,CN 1732337664,1732338175,ID @@ -44563,8 +46231,9 @@ 1732374528,1732375551,US 1732375552,1732376575,AU 1732376576,1732377599,US -1732377600,1732377855,NZ -1732377856,1732378623,AU +1732377600,1732377855,AU +1732377856,1732378111,NZ +1732378112,1732378623,AU 1732378624,1732384767,IN 1732384768,1732385279,BD 1732385280,1732385791,AU @@ -44611,7 +46280,9 @@ 1732422400,1732422655,JP 1732422656,1732423679,IN 1732423680,1732424703,BD -1732424704,1732425727,HK +1732424704,1732424705,HK +1732424706,1732424707,CN +1732424708,1732425727,HK 1732425728,1732426751,KH 1732426752,1732428799,KR 1732428800,1732429823,ID @@ -44664,8 +46335,8 @@ 1732504576,1732505599,IN 1732505600,1732506623,ID 1732506624,1732507647,IN -1732507648,1732507648,PH -1732507649,1732508671,AU +1732507648,1732507903,PH +1732507904,1732508671,AU 1732508672,1732509695,CN 1732509696,1732510719,ID 1732510720,1732511743,BD @@ -44687,16 +46358,15 @@ 1732536832,1732537087,AU 1732537088,1732537343,MN 1732537344,1732537855,AT -1732537856,1732538367,BZ +1732537856,1732538111,BZ +1732538112,1732538367,LT 1732538368,1732539391,IN 1732539392,1732540415,BD 1732540416,1732541439,US 1732541440,1732541695,AU 1732541696,1732542463,SG 1732542464,1732543487,CN -1732543488,1732543743,SG -1732543744,1732543999,IL -1732544000,1732544511,SG +1732543488,1732544511,SG 1732544512,1732545023,ID 1732545024,1732545279,TW 1732545280,1732545535,MM @@ -44704,7 +46374,8 @@ 1732546560,1732547583,JP 1732547584,1732549631,KR 1732549632,1732550655,PH -1732550656,1732552703,AU +1732550656,1732551679,AU +1732551680,1732552703,SG 1732552704,1732554751,HK 1732554752,1732555263,IN 1732555264,1732555775,AU @@ -44839,11 +46510,12 @@ 1732705280,1732707327,CN 1732707328,1732708351,AU 1732708352,1732709375,ID -1732709376,1732710399,HK +1732709376,1732710143,HK +1732710144,1732710399,JP 1732710400,1732712447,IN 1732712448,1732712703,HK 1732712704,1732712959,AF -1732712960,1732713215,US +1732712960,1732713215,SG 1732713216,1732713471,AU 1732713472,1732714495,HK 1732714496,1732715519,CN @@ -44922,7 +46594,7 @@ 1732811776,1732812799,IN 1732812800,1732813311,HK 1732813312,1732813823,MY -1732813824,1732814847,MO +1732813824,1732814847,CN 1732814848,1732815871,IN 1732815872,1732816895,CN 1732816896,1732817919,IN @@ -44948,12 +46620,12 @@ 1732852480,1732852735,AU 1732852736,1732853759,ID 1732853760,1732854271,AU -1732854272,1732854783,US +1732854272,1732854783,HK 1732854784,1732855807,PH 1732855808,1732857855,ID 1732857856,1732858367,KI 1732858368,1732859903,AU -1732859904,1732860927,HK +1732859904,1732860927,CN 1732860928,1732861951,IN 1732861952,1732862975,CN 1732862976,1732863999,PK @@ -44965,7 +46637,9 @@ 1732869632,1732869887,AU 1732869888,1732870143,IN 1732870144,1732875263,CN -1732875264,1732878335,IN +1732875264,1732877567,IN +1732877568,1732877823,US +1732877824,1732878335,IN 1732878336,1732879359,HK 1732879360,1732880383,KH 1732880384,1732881407,CN @@ -45066,7 +46740,7 @@ 1732995072,1732998143,CN 1732998144,1732998399,AU 1732998400,1732998655,HK -1732998656,1732998911,SG +1732998656,1732998911,JP 1732998912,1732999167,CA 1732999168,1733000191,CN 1733000192,1733001215,IN @@ -45128,7 +46802,10 @@ 1733057280,1733057535,IN 1733057536,1733058559,CN 1733058560,1733060607,IN -1733060608,1733061631,CN +1733060608,1733060863,JP +1733060864,1733061119,US +1733061120,1733061375,CN +1733061376,1733061631,US 1733061632,1733062655,IN 1733062656,1733063679,HK 1733063680,1733064703,TH @@ -45293,7 +46970,7 @@ 1733224448,1733225471,ID 1733225472,1733226751,IN 1733226752,1733227007,AU -1733227008,1733227519,TH +1733227008,1733227519,MY 1733227520,1733228543,IN 1733228544,1733230591,BD 1733230592,1733231615,IN @@ -45369,7 +47046,7 @@ 1733309440,1733309695,IN 1733309696,1733309951,AU 1733309952,1733313791,IN -1733313792,1733314047,AU +1733313792,1733314047,SG 1733314048,1733314559,BD 1733314560,1733315583,CN 1733315584,1733315839,NZ @@ -45464,10 +47141,7 @@ 1733406720,1733407743,JP 1733407744,1733407999,TH 1733408000,1733408511,IN -1733408512,1733408767,CN -1733408768,1733409279,HK -1733409280,1733409535,DE -1733409536,1733409791,CN +1733408512,1733409791,CN 1733409792,1733411327,IN 1733411328,1733411839,ID 1733411840,1733412863,BD @@ -45490,7 +47164,7 @@ 1733425152,1733425663,ID 1733425664,1733427199,IN 1733427200,1733428223,GB -1733428224,1733428735,HK +1733428224,1733428735,US 1733428736,1733429247,ID 1733429248,1733430271,BD 1733430272,1733431295,ID @@ -45542,7 +47216,7 @@ 1733485568,1733486591,MY 1733486592,1733486847,MM 1733486848,1733487103,ID -1733487104,1733487615,IN +1733487104,1733487615,US 1733487616,1733488639,CN 1733488640,1733490175,ID 1733490176,1733490431,NZ @@ -45643,7 +47317,7 @@ 1733585920,1733586943,CN 1733586944,1733587967,GB 1733587968,1733588991,ID -1733588992,1733590015,AU +1733588992,1733590015,IN 1733590016,1733591039,JP 1733591040,1733592063,IN 1733592064,1733592319,MV @@ -45675,15 +47349,402 @@ 1733616640,1733618687,ID 1733618688,1733620735,IN 1733620736,1733621759,BD -1733621760,1733622015,MY +1733621760,1733622015,AU 1733622016,1733622271,ID -1733622272,1733622527,IN +1733622272,1733622783,IN 1733622784,1733623807,BD 1733623808,1733624831,NZ 1733624832,1733625855,ID 1733625856,1733626879,IN 1733626880,1733627903,ID 1733627904,1733628927,IN +1733628928,1733630975,CN +1733630976,1733631999,NZ +1733632000,1733633023,BD +1733633024,1733634047,AU +1733634048,1733634559,IN +1733634560,1733635071,US +1733635072,1733639167,CN +1733639168,1733641215,ID +1733641216,1733642239,PH +1733642240,1733643263,HK +1733643264,1733644287,IN +1733644288,1733645311,KR +1733645312,1733646335,CN +1733646336,1733647871,IN +1733647872,1733648383,ID +1733648384,1733650431,IN +1733650432,1733651455,MM +1733651456,1733652479,MY +1733652480,1733653503,BD +1733653504,1733654015,ID +1733654016,1733654527,IN +1733654528,1733655551,ID +1733655552,1733656575,IN +1733656576,1733657599,PK +1733657600,1733657855,MN +1733657856,1733658111,IN +1733658112,1733658367,PH +1733658368,1733658623,AU +1733658624,1733659647,CN +1733659648,1733660671,IN +1733660672,1733661695,CN +1733661696,1733662719,ID +1733662720,1733663231,PK +1733663232,1733663487,IN +1733663488,1733663743,NZ +1733663744,1733665791,BD +1733665792,1733669887,CN +1733669888,1733670911,IN +1733670912,1733671679,SG +1733671680,1733671935,US +1733671936,1733672959,HK +1733672960,1733676031,BD +1733676032,1733678079,IN +1733678080,1733678335,HK +1733678336,1733678591,SG +1733678592,1733679103,AU +1733679104,1733680127,BD +1733680128,1733681151,ID +1733681152,1733682175,CN +1733682176,1733683199,IN +1733683200,1733686271,BD +1733686272,1733687295,CN +1733687296,1733688319,AU +1733688320,1733689343,HK +1733689344,1733691391,IN +1733691392,1733692415,PK +1733692416,1733695487,IN +1733695488,1733695999,ID +1733696000,1733696255,IN +1733696256,1733696511,AU +1733696512,1733698559,CN +1733698560,1733699583,PK +1733699584,1733700607,IN +1733700608,1733701631,CN +1733701632,1733702655,TH +1733702656,1733703679,PK +1733703680,1733704191,NP +1733704192,1733704703,AU +1733704704,1733705727,CN +1733705728,1733706751,HK +1733706752,1733707007,JP +1733707008,1733707519,CN +1733707520,1733707775,US +1733707776,1733709823,HK +1733709824,1733710847,CN +1733710848,1733711615,KR +1733711616,1733712895,CN +1733712896,1733713407,AU +1733713408,1733713663,ID +1733713664,1733713919,IN +1733713920,1733714431,AU +1733714432,1733714687,JP +1733714688,1733714943,SG +1733714944,1733715455,ID +1733715456,1733715711,AU +1733715712,1733715967,ID +1733715968,1733716991,IN +1733716992,1733718015,BD +1733718016,1733719039,AU +1733719040,1733720063,IN +1733720064,1733721087,PH +1733721088,1733722111,AF +1733722112,1733722367,AU +1733722368,1733722623,CN +1733722624,1733723135,MY +1733723136,1733724159,PK +1733724160,1733724415,AU +1733724416,1733724671,IN +1733724672,1733731327,ID +1733731328,1733732351,IN +1733732352,1733733375,AU +1733733376,1733734911,IN +1733734912,1733735423,MY +1733735424,1733736447,IN +1733736448,1733737471,PH +1733737472,1733738495,AU +1733738496,1733741567,BD +1733741568,1733756927,CN +1733756928,1733757951,HK +1733757952,1733758975,LK +1733758976,1733759999,ID +1733760000,1733761023,CN +1733761024,1733763071,IN +1733763072,1733764095,CN +1733764096,1733764351,BD +1733764352,1733764607,ID +1733764608,1733765119,AU +1733765120,1733770239,IN +1733770240,1733771263,ID +1733771264,1733771775,IN +1733771776,1733772287,ID +1733772288,1733772543,AU +1733772544,1733772799,MN +1733772800,1733773311,ID +1733773312,1733774335,CN +1733774336,1733777407,ID +1733777408,1733777663,AF +1733777664,1733778175,IN +1733778176,1733778431,AU +1733778432,1733779455,IN +1733779456,1733780479,CN +1733780480,1733782527,IN +1733782528,1733783551,US +1733783552,1733784575,BD +1733784576,1733785599,KR +1733785600,1733785855,IN +1733785856,1733786111,NZ +1733786112,1733786623,IN +1733786624,1733787647,LK +1733787648,1733788671,IN +1733788672,1733789695,CN +1733789696,1733790719,BD +1733790720,1733791743,IN +1733791744,1733792767,JP +1733793792,1733794815,ID +1733794816,1733795839,HK +1733795840,1733796351,ID +1733796352,1733796607,PK +1733796608,1733796863,AU +1733796864,1733799935,IN +1733799936,1733800959,JP +1733800960,1733801983,CN +1733801984,1733803007,ID +1733803008,1733803263,MV +1733803264,1733804031,SG +1733804032,1733805055,PK +1733805056,1733806079,ID +1733806080,1733806335,IN +1733806336,1733806591,ID +1733806592,1733806847,IN +1733806848,1733807103,AU +1733807104,1733808127,IN +1733808128,1733809151,AU +1733809152,1733810175,BD +1733810176,1733810431,AU +1733810432,1733810687,TH +1733810688,1733811199,AU +1733811200,1733812223,VN +1733812224,1733813247,CN +1733813248,1733814271,ID +1733814272,1733816063,BD +1733816064,1733816319,NZ +1733816320,1733817343,HK +1733817344,1733819391,BD +1733819392,1733819903,IN +1733819904,1733820159,AU +1733820160,1733820415,MN +1733820416,1733821439,IN +1733821440,1733826559,CN +1733826560,1733827583,BD +1733827584,1733828607,IN +1733828608,1733830655,CN +1733830656,1733831167,IN +1733831168,1733831423,PH +1733831424,1733831679,SG +1733831680,1733832703,JP +1733832704,1733833727,MM +1733833728,1733835775,IN +1733835776,1733837823,CN +1733837824,1733838847,PH +1733838848,1733839871,CN +1733839872,1733840383,IN +1733840384,1733840639,AU +1733840640,1733840895,SG +1733840896,1733843967,IN +1733843968,1733844991,HK +1733844992,1733847039,CN +1733847040,1733848063,NZ +1733848064,1733852159,VN +1733852160,1733855231,IN +1733855232,1733855743,BD +1733855744,1733855999,IN +1733856000,1733856255,CN +1733856256,1733857279,BD +1733857280,1733859327,AU +1733859328,1733859839,CN +1733859840,1733860095,AU +1733860096,1733860351,KH +1733860352,1733861887,IN +1733861888,1733862143,KH +1733862144,1733862399,NC +1733862400,1733863423,CN +1733863424,1733864447,ID +1733864448,1733865471,IN +1733865472,1733866495,CN +1733866496,1733867007,AU +1733867008,1733867263,IN +1733867264,1733867519,AU +1733867520,1733869567,CN +1733869568,1733870591,AF +1733870592,1733874687,ID +1733874688,1733875711,CN +1733875712,1733879039,IN +1733879040,1733879295,ID +1733879296,1733879807,NZ +1733879808,1733880831,BD +1733880832,1733882879,IN +1733882880,1733887999,ID +1733888000,1733888255,IN +1733888256,1733889023,AU +1733889024,1733890047,PH +1733890048,1733890559,IN +1733890560,1733891071,NZ +1733891072,1733892095,TW +1733892096,1733893119,BD +1733893120,1733894143,CN +1733894144,1733895167,ID +1733895168,1733895679,IN +1733895680,1733896191,AU +1733896192,1733897215,IN +1733897216,1733898239,KR +1733898240,1733899263,MM +1733899264,1733903359,IN +1733903360,1733904383,US +1733904384,1733904639,HK +1733904640,1733904895,AU +1733904896,1733905407,IN +1733905408,1733906431,ID +1733906432,1733907455,AU +1733907456,1733910527,VN +1733910528,1733916671,CN +1733916672,1733917695,VN +1733917696,1733918719,ID +1733918720,1733919743,HK +1733919744,1733920767,GB +1733920768,1733921023,IN +1733921024,1733921279,HK +1733921280,1733921791,ID +1733921792,1733922815,SG +1733922816,1733923839,HK +1733923840,1733924863,CN +1733924864,1733925375,AF +1733925376,1733925887,ID +1733925888,1733926911,NP +1733926912,1733928703,ID +1733928704,1733928959,AU +1733928960,1733929983,IN +1733929984,1733931007,CN +1733931008,1733933055,MM +1733933056,1733945343,CN +1733945344,1733946367,IN +1733946368,1733948415,PH +1733948416,1733949439,BD +1733949440,1733949695,ID +1733949696,1733949951,IN +1733949952,1733950463,ID +1733950464,1733951487,IN +1733951488,1733952255,BD +1733952256,1733952511,AU +1733952512,1733953279,IN +1733953280,1733953535,PK +1733953536,1733954559,ID +1733954560,1733955071,BD +1733955072,1733955327,NZ +1733955328,1733955583,AU +1733955584,1733956607,JP +1733956608,1733957631,AU +1733957632,1733958655,ID +1733958656,1733959679,JP +1733959680,1733961727,IN +1733961728,1733962751,TH +1733962752,1733963775,IN +1733963776,1733964543,AU +1733964544,1733964799,HK +1733964800,1733965823,CN +1733965824,1733966335,HK +1733966336,1733966847,AU +1733966848,1733967871,IN +1733967872,1733968127,ID +1733968128,1733968895,AU +1733968896,1733970943,IN +1733970944,1733971199,HK +1733971200,1733971455,AU +1733971456,1733971711,NZ +1733971712,1733971967,IN +1733971968,1733972991,HK +1733972992,1733974015,NP +1733974016,1733975039,AU +1733975040,1733976063,CN +1733976064,1733977087,IN +1733977088,1733986303,CN +1733986304,1733987327,HK +1733987328,1733988351,AU +1733988352,1733989375,NP +1733989376,1733990399,KH +1733990400,1733991423,CN +1733991424,1733993471,IN +1733993472,1733994495,JP +1733994496,1733995519,CN +1733995520,1733995775,HK +1733995776,1733996031,CN +1733996032,1733996543,NZ +1733996544,1733997567,CN +1733997568,1733998591,IN +1733998592,1733999103,NZ +1733999104,1733999615,IN +1733999616,1734001663,CN +1734001664,1734002687,ID +1734002688,1734003199,IN +1734003200,1734003455,PH +1734003456,1734003711,HK +1734003712,1734004735,IN +1734004736,1734004991,AU +1734004992,1734005247,KR +1734005248,1734005503,ID +1734005504,1734005759,AU +1734005760,1734006783,BD +1734006784,1734007807,AU +1734007808,1734011903,VN +1734011904,1734013951,IN +1734013952,1734014975,KR +1734014976,1734018047,ID +1734018048,1734019071,JP +1734019072,1734020095,HK +1734020096,1734021119,ID +1734021120,1734022143,IN +1734022144,1734026239,ID +1734026240,1734028287,CN +1734028288,1734029311,ID +1734029312,1734030335,IN +1734030336,1734031103,BD +1734031104,1734031359,PH +1734031360,1734032383,HK +1734032384,1734032895,MM +1734032896,1734033407,IN +1734033408,1734034431,MY +1734034432,1734039295,IN +1734039296,1734039551,ID +1734039552,1734043647,IN +1734043648,1734044159,BD +1734044160,1734044191,PR +1734044192,1734044255,CN +1734044256,1734044287,KR +1734044288,1734044447,CN +1734044448,1734044479,US +1734044480,1734044511,CN +1734044512,1734044543,US +1734044544,1734045695,CN +1734045696,1734046207,PH +1734046208,1734046719,PG +1734046720,1734049023,IN +1734049024,1734049279,SG +1734049280,1734049535,HK +1734049536,1734049791,IN +1734049792,1734050815,BD +1734050816,1734052863,IN +1734052864,1734053887,PH +1734053888,1734054911,BD +1734054912,1734055935,AU +1734055936,1734056959,CN +1734056960,1734057983,HK +1734057984,1734059007,IN +1734059008,1734060031,AU +1734060032,1734061055,BD +1734061056,1734062079,NZ +1734062080,1734063103,CN +1734063104,1734064127,IN 1740636160,1740644351,CN 1740644352,1740645375,IN 1740645376,1740647423,HK @@ -45775,8 +47836,7 @@ 1740771328,1740772351,CN 1740772352,1740776447,IN 1740776448,1740777471,HK -1740777472,1740777983,JP -1740777984,1740778239,MO +1740777472,1740778239,JP 1740778240,1740778495,HK 1740778496,1740779519,IN 1740779520,1740780543,AU @@ -45817,7 +47877,7 @@ 1740822016,1740822527,AU 1740822528,1740825599,IN 1740825856,1740826111,AU -1740826112,1740826623,CN +1740826112,1740826623,SG 1740826624,1740827647,IN 1740827648,1740828671,HK 1740828672,1740829695,IN @@ -45832,8 +47892,7 @@ 1740837376,1740837887,ID 1740837888,1740838911,MY 1740838912,1740839935,IN -1740839936,1740840191,SG -1740840192,1740840959,ID +1740839936,1740840959,ID 1740840960,1740841983,SG 1740841984,1740845055,IN 1740845056,1740846079,HK @@ -45866,6 +47925,7 @@ 1740876288,1740876799,AU 1740876800,1740880639,IN 1740880640,1740880895,HK +1740880896,1740881919,SG 1740881920,1740882943,CN 1740882944,1740884991,IN 1740884992,1740885503,BD @@ -45922,9 +47982,10 @@ 1740951552,1740957695,IN 1740957696,1740958719,BD 1740958720,1740959743,VN -1740959744,1740960255,NL -1740960256,1740960767,IN -1740960768,1740962815,VN +1740959744,1740960767,NL +1740960768,1740962303,VN +1740962304,1740962559,TW +1740962560,1740962815,VN 1740962816,1740964863,SG 1740964864,1740965887,HK 1740965888,1740966399,IN @@ -46098,8 +48159,10 @@ 1741178880,1741183999,IN 1741184000,1741185023,BD 1741185024,1741186047,JP -1741186048,1741188095,IN -1741188096,1741191167,HK +1741186048,1741188607,IN +1741188608,1741188863,US +1741188864,1741189119,IN +1741189120,1741191167,HK 1741191168,1741192191,VN 1741192192,1741193215,HK 1741193216,1741194239,ID @@ -46208,7 +48271,9 @@ 1741456384,1741457407,IN 1741457408,1741462527,CN 1741462528,1741466623,IN -1741466624,1741467647,JP +1741466624,1741466879,JP +1741466880,1741467391,HK +1741467392,1741467647,JP 1741467648,1741469695,HK 1741469696,1741472767,IN 1741472768,1741473791,CN @@ -46240,7 +48305,6 @@ 1741493248,1741494271,HK 1741494272,1741495295,KH 1741495296,1741497343,AU -1741497344,1741497855,PH 1741497856,1741498111,NZ 1741498112,1741498367,IN 1741498368,1741500415,CN @@ -46352,11 +48416,10 @@ 1741631488,1741632511,CN 1741632512,1741636607,IN 1741636608,1741637631,HK -1741637632,1741638655,PH +1741637632,1741638655,MY 1741638656,1741639679,NZ 1741639680,1741640703,NP 1741640704,1741641727,PK -1741641728,1741642751,BD 1741642752,1741643007,AU 1741643008,1741643263,HK 1741643264,1741643775,AU @@ -46449,7 +48512,6 @@ 1741756416,1741756927,AU 1741756928,1741757439,IN 1741757440,1741758463,HK -1741758464,1741759487,US 1741759488,1741760511,IN 1741760512,1741761535,HK 1741761536,1741762559,AU @@ -46461,7 +48523,10 @@ 1741765632,1741766655,HK 1741766656,1741768703,IN 1741768704,1741769727,AU -1741769728,1741770751,PK +1741769728,1741769983,PK +1741769984,1741770239,DK +1741770240,1741770495,PK +1741770496,1741770751,PR 1741770752,1741771775,BD 1741771776,1741772799,PK 1741772800,1741774591,IN @@ -46471,7 +48536,6 @@ 1741775616,1741775871,IN 1741775872,1741776895,HK 1741776896,1741777919,MY -1741777920,1741778431,AU 1741778432,1741778943,IN 1741778944,1741779967,CN 1741779968,1741780991,JP @@ -46483,7 +48547,7 @@ 1741785088,1741786111,CN 1741786112,1741788159,IN 1741788160,1741789183,JP -1741789184,1741790207,AU +1741789184,1741789695,AU 1741790208,1741791231,MY 1741791232,1741792255,AU 1741792256,1741794303,SG @@ -46512,8 +48576,8 @@ 1741815808,1741816831,CN 1741816832,1741817855,PK 1741817856,1741818367,PH -1741818368,1741818879,AU -1741818880,1741819903,US +1741818368,1741819902,AU +1741819903,1741819903,PK 1741819904,1741820927,BD 1741820928,1741821951,PH 1741821952,1741822975,AU @@ -46680,7 +48744,7 @@ 1741989888,1741990143,GB 1741990144,1741990911,SG 1741991936,1741992191,MY -1741992192,1741992959,IN +1741992192,1741992447,IN 1741992960,1741993983,TH 1741993984,1741995007,HK 1741995008,1741996031,JP @@ -46750,7 +48814,8 @@ 1742093312,1742095359,IN 1742095360,1742095615,KR 1742095616,1742095871,US -1742095872,1742096383,MM +1742095872,1742096127,LT +1742096128,1742096383,MM 1742096384,1742097407,JP 1742097408,1742098431,NP 1742098432,1742099455,BD @@ -46979,7 +49044,9 @@ 1742451712,1742452735,VN 1742452736,1742453759,CN 1742453760,1742454783,PH -1742454784,1742455807,HK +1742454784,1742455295,HK +1742455296,1742455551,US +1742455552,1742455807,HK 1742455808,1742456063,TH 1742456064,1742456831,ID 1742456832,1742460415,IN @@ -47309,7 +49376,6 @@ 1742990336,1742991359,IN 1742991360,1742992383,ID 1742992384,1742993407,LK -1742993408,1742994431,JP 1742994432,1742995455,ID 1742995456,1742996479,BD 1742996480,1742997503,TH @@ -47379,7 +49445,8 @@ 1743062528,1743063039,AU 1743063040,1743064063,SG 1743064064,1743064575,ID -1743065088,1743066111,TW +1743065088,1743065599,TW +1743065600,1743066111,IN 1743066112,1743067135,CN 1743067136,1743068159,IN 1743068160,1743069183,HK @@ -47464,7 +49531,6 @@ 1743145984,1743147007,NZ 1743147008,1743147263,AU 1743147264,1743147519,NZ -1743147520,1743147775,MN 1743147776,1743148031,ID 1743148032,1743149055,IN 1743149056,1743150079,KR @@ -47479,8 +49545,7 @@ 1743158272,1743159295,MY 1743160320,1743161343,TH 1743161344,1743162367,HK -1743162368,1743162623,BZ -1743162624,1743162879,AQ +1743162368,1743162879,BZ 1743162880,1743163135,KR 1743163136,1743163391,BZ 1743163392,1743166463,IN @@ -47555,7 +49620,8 @@ 1743240192,1743241215,SG 1743241216,1743242239,JP 1743242240,1743244287,ID -1743244288,1743245311,AU +1743244288,1743244799,AU +1743244800,1743245311,AF 1743245312,1743248383,IN 1743248384,1743248895,SG 1743248896,1743249407,IN @@ -48279,7 +50345,6 @@ 1744097280,1744098303,JP 1744098304,1744099327,NZ 1744099328,1744101375,JP -1744101376,1744102399,HK 1744102400,1744103423,FJ 1744103424,1744104447,CN 1744104448,1744105471,AU @@ -48606,7 +50671,8 @@ 1744411648,1744412671,LA 1744412672,1744413695,TW 1744413696,1744417791,CN -1744417792,1744418815,IN +1744417792,1744418559,IN +1744418560,1744418815,AU 1744418816,1744419839,JP 1744419840,1744421887,CN 1744421888,1744422911,HK @@ -48832,7 +50898,7 @@ 1744655872,1744656383,ID 1744656384,1744657407,VN 1744657408,1744658431,AU -1744658432,1744659455,HK +1744658432,1744659455,CA 1744659456,1744660479,JP 1744660480,1744660735,IN 1744660736,1744660991,MY @@ -48900,7 +50966,6 @@ 1744727040,1744728063,HK 1744728064,1744729087,CN 1744730112,1744731135,MN -1744731136,1744731647,IN 1744731648,1744732159,ID 1744732160,1744733183,IN 1744733184,1744734207,NZ @@ -48924,7 +50989,6 @@ 1744750080,1744750591,US 1744750592,1744752639,IN 1744752640,1744753663,HK -1744753664,1744754687,SG 1744754688,1744755711,VN 1744755712,1744756735,HK 1744756736,1744757759,PF @@ -48955,7 +51019,6 @@ 1744778752,1744779263,AU 1744779264,1744780287,CN 1744780288,1744781311,HK -1744781312,1744782335,JP 1744782336,1744783359,CN 1744783360,1744786431,IN 1744786432,1744787455,VN @@ -49059,12 +51122,12 @@ 1747736864,1747736895,SG 1747736896,1747737055,US 1747737056,1747737119,GB -1747737120,1747737183,US -1747737184,1747737215,AU -1747737216,1747737247,US +1747737120,1747737215,AU +1747737216,1747737247,SG 1747737248,1747737279,KR 1747737280,1747737311,NL -1747737312,1747737407,US +1747737312,1747737343,HK +1747737344,1747737407,US 1747737408,1747737439,IE 1747737440,1747737535,US 1747737536,1747737567,HK @@ -49161,7 +51224,9 @@ 1747770816,1747770943,US 1747770944,1747771007,SE 1747771008,1747771135,AU -1747771136,1747777679,US +1747771136,1747772459,US +1747772460,1747772491,FR +1747772492,1747777679,US 1747777680,1747777743,CA 1747777744,1747777791,NL 1747777792,1747779071,US @@ -49195,7 +51260,11 @@ 1747912704,1747912959,NL 1747912960,1747913215,US 1747913216,1747913471,IE -1747913472,1747915775,US +1747913472,1747913727,US +1747913728,1747913983,IE +1747913984,1747914239,FI +1747914240,1747914495,AT +1747914496,1747915775,US 1747915776,1747916287,GB 1747916288,1747926015,US 1747926016,1747926527,CA @@ -49246,7 +51315,11 @@ 1749450240,1749465087,US 1749465088,1749465599,NL 1749465600,1749476863,US -1749476864,1749496319,NL +1749476864,1749479423,NL +1749479424,1749487615,US +1749487616,1749491711,NL +1749491712,1749495807,US +1749495808,1749496319,NL 1749496320,1749497855,US 1749497856,1749499391,NL 1749499392,1749508095,US @@ -49269,8 +51342,10 @@ 1749618176,1749618687,NL 1749618688,1749635071,US 1749635072,1749636095,NL -1749636096,1749685247,US -1749685248,1749686783,NL +1749636096,1749647359,US +1749647360,1749655551,NL +1749655552,1749686527,US +1749686528,1749686783,NL 1749686784,1749696511,US 1749696512,1749698047,NL 1749698048,1749698559,US @@ -49308,9 +51383,17 @@ 1750080512,1750096383,US 1750096384,1750106111,NL 1750106112,1750123007,US -1750123008,1750153727,NL +1750123008,1750126079,NL +1750126080,1750126591,US +1750126592,1750142975,NL +1750142976,1750147071,US +1750147072,1750151167,NL +1750151168,1750152191,US +1750152192,1750153727,NL 1750153728,1750154239,US -1750154240,1750172671,NL +1750154240,1750159359,NL +1750159360,1750163455,US +1750163456,1750172671,NL 1750172672,1750174719,US 1750174720,1750175743,NL 1750175744,1750192127,US @@ -49322,10 +51405,16 @@ 1750224384,1750224895,US 1750224896,1750252543,NL 1750252544,1750253055,US -1750253056,1750321663,NL +1750253056,1750294015,NL +1750294016,1750294527,US +1750294528,1750310911,NL +1750310912,1750315007,US +1750315008,1750320127,NL +1750320128,1750321151,US +1750321152,1750321663,NL 1750321664,1750323199,US -1750323200,1750331391,NL -1750331392,1750350847,US +1750323200,1750327295,NL +1750327296,1750350847,US 1750350848,1750351871,NL 1750351872,1750368255,US 1750368256,1750373375,NL @@ -49340,12 +51429,18 @@ 1750425600,1750443519,US 1750443520,1750444031,NL 1750444032,1750463487,US -1750463488,1750494207,NL +1750463488,1750482943,NL +1750482944,1750492159,US +1750492160,1750492671,NL +1750492672,1750493183,US +1750493184,1750494207,NL 1750494208,1750494719,US 1750494720,1750514687,NL 1750514688,1750515199,US -1750515200,1750552575,NL -1750552576,1750573055,US +1750515200,1750534655,NL +1750534656,1750536191,US +1750536192,1750544383,NL +1750544384,1750573055,US 1750573056,1750597631,NL 1750597632,1750664191,US 1750664192,1750665727,NL @@ -49586,11 +51681,18 @@ 1753491456,1753493503,GB 1753493504,1753494527,US 1753494528,1753494783,IL -1753494784,1753497407,US +1753494784,1753496575,US +1753496576,1753497407,CA 1753497408,1753497455,PH -1753497456,1753499391,US +1753497456,1753497599,CA +1753497600,1753499391,US 1753499392,1753499647,PH -1753499648,1753511167,US +1753499648,1753499903,AE +1753499904,1753500159,US +1753500160,1753500415,SK +1753500416,1753507391,US +1753507392,1753507439,KR +1753507440,1753511167,US 1753511168,1753511423,FR 1753511424,1753512703,US 1753512704,1753512959,SG @@ -49602,9 +51704,9 @@ 1753517568,1753517823,NO 1753517824,1753518591,US 1753518592,1753518847,JP -1753518848,1753520447,US -1753520448,1753520495,GB -1753520496,1753522431,US +1753518848,1753520383,US +1753520384,1753520639,GB +1753520640,1753522431,US 1753522432,1753522687,FR 1753522688,1753526015,US 1753526016,1753526271,DE @@ -49647,7 +51749,9 @@ 1754210304,1754223615,US 1754223616,1754223623,MX 1754223624,1754223631,AU -1754223632,1754251519,US +1754223632,1754226687,US +1754226688,1754228735,IL +1754228736,1754251519,US 1754251520,1754251775,LY 1754251776,1754252031,US 1754252032,1754252287,MR @@ -50061,7 +52165,11 @@ 1755839744,1755839999,ER 1755840000,1755840255,AL 1755840256,1755840511,RU -1755840512,1756049407,US +1755840512,1755846623,US +1755846624,1755846631,GB +1755846632,1755863327,US +1755863328,1755863335,GB +1755863336,1756049407,US 1756049408,1756053503,CA 1756053504,1756086271,US 1756086272,1756090367,CA @@ -50087,13 +52195,15 @@ 1757457408,1757458431,CA 1757458432,1757460479,US 1757460480,1757462527,VI -1757462528,1757472767,US +1757462528,1757466623,US +1757466624,1757468671,CA +1757468672,1757472767,US 1757472768,1757473791,CA 1757473792,1757487103,US 1757487104,1757489151,CA 1757489152,1757491199,US 1757491200,1757497343,CA -1757497344,1757502463,US +1757497344,1757501439,US 1757502464,1757503487,CA 1757503488,1757505535,US 1757505536,1757506559,CA @@ -50325,7 +52435,8 @@ 1759526400,1759526655,JE 1759526656,1759526911,FO 1759526912,1759528959,IL -1759528960,1759535103,US +1759528960,1759531007,US +1759531008,1759535103,SG 1759535104,1759543295,CA 1759543296,1759547391,US 1759547392,1759548415,NL @@ -50398,10 +52509,9 @@ 1760819200,1760819455,IT 1760819456,1760819711,GB 1760819712,1760819967,MA -1760819968,1760820223,HK -1760820224,1760820479,US +1760819968,1760820479,US 1760820480,1760820735,CA -1760820736,1760823295,US +1760820736,1760822271,US 1760823296,1760824319,PT 1760824320,1760837631,US 1760837632,1760839679,CA @@ -50503,8 +52613,10 @@ 1761214464,1761222655,MF 1761222656,1761230847,US 1761230848,1761239039,CA -1761239040,1761255423,US -1761255424,1761255679,CN +1761239040,1761241343,US +1761241344,1761241599,ID +1761241600,1761255423,US +1761255424,1761255679,CO 1761255680,1761255935,NZ 1761255936,1761256191,DK 1761256192,1761256447,HR @@ -50568,13 +52680,15 @@ 1761507328,1761507615,US 1761507616,1761507711,GB 1761507712,1761508351,US +1761508352,1761509375,VG 1761509376,1761515519,US 1761515520,1761517567,CA 1761517568,1761519615,US 1761519616,1761521663,PR 1761521664,1761522687,US 1761522688,1761523711,CA -1761523712,1761526783,US +1761523712,1761524735,US +1761525760,1761526783,US 1761526784,1761527807,CA 1761527808,1761544191,US 1761544192,1761546239,CA @@ -50594,7 +52708,7 @@ 1761600512,1761601535,US 1761601536,1761602559,VC 1761602560,1761606655,US -1761606656,1761607679,VC +1761606656,1761607679,LC 1761607680,1762613861,ZA 1762613862,1762613862,US 1762613863,1762656255,ZA @@ -50618,7 +52732,9 @@ 1762695168,1762701311,ZA 1762701312,1762703359,FR 1762703360,1762705407,GB -1762705408,1762768895,MU +1762705408,1762764799,MU +1762764800,1762766847,NL +1762766848,1762768895,SE 1762768896,1762770943,DE 1762770944,1762783231,MU 1762783232,1762791423,KE @@ -50626,7 +52742,8 @@ 1762795520,1762799615,TZ 1762799616,1762803711,MZ 1762803712,1762820095,ZA -1762820096,1762942975,MU +1762820096,1762824191,GB +1762824192,1762942975,MU 1762942976,1762947071,NL 1762947072,1762951167,SE 1762951168,1762955263,DE @@ -50658,7 +52775,9 @@ 1763402240,1763402751,KE 1763402752,1763405823,MU 1763405824,1763407871,ZA -1763407872,1763418111,MU +1763407872,1763413503,MU +1763413504,1763414015,ZA +1763414016,1763418111,MU 1763418112,1763429887,ZA 1763429888,1763438591,KE 1763438592,1763442687,UG @@ -50675,7 +52794,7 @@ 1763581952,1763598335,MU 1763598336,1763602431,IN 1763602432,1763606527,NL -1763606528,1763610623,MU +1763606528,1763610623,SE 1763610624,1763614719,DE 1763614720,1763631103,MU 1763631104,1763635199,AE @@ -50684,9 +52803,8 @@ 1763657728,1763659775,ZA 1763659776,1763661823,MU 1763661824,1763663871,FR -1763663872,1763690495,MU -1763690496,1763692543,ZA -1763692544,1763694591,MU +1763663872,1763688447,MU +1763688448,1763694591,ZA 1763694592,1763696639,FR 1763696640,1763704831,MU 1763704832,1764753407,EG @@ -50698,7 +52816,8 @@ 1769996288,1772093439,MA 1772093440,1772617727,KE 1772617728,1773142015,AO -1773142016,1773273087,ZA +1773142016,1773207551,LR +1773207552,1773273087,ZA 1773273088,1773404159,RW 1773404160,1773666303,EG 1773666304,1773928447,ZA @@ -50898,10 +53017,8 @@ 1805737984,1805742079,CA 1805742080,1805752575,US 1805752576,1805753087,CA -1805753088,1805754111,US -1805754112,1805754129,CA -1805754130,1805754130,US -1805754131,1805754367,CA +1805753088,1805754175,US +1805754176,1805754367,CA 1805754368,1805756415,US 1805756928,1806131199,US 1806132224,1806132479,US @@ -50942,16 +53059,23 @@ 1806263552,1806263807,KR 1806263808,1806401535,US 1806401536,1806434303,CA -1806434304,1806925823,US +1806434304,1806514463,US +1806514464,1806514495,GB +1806514496,1806515231,US +1806515232,1806515263,GB +1806515264,1806532927,US +1806532928,1806532959,GB +1806532960,1806925823,US 1806925824,1806958591,CA -1806958592,1807056895,US +1806958592,1807044095,US +1807044096,1807044351,NL +1807044352,1807056895,US 1807056896,1807057151,AU 1807057664,1807057919,GB 1807057920,1807058431,US 1807058688,1807058943,US 1807058944,1807059199,GB 1807059200,1807059455,NL -1807060992,1807062015,CA 1807062016,1807062271,US 1807063040,1807072255,US 1807072256,1807073023,CA @@ -50977,7 +53101,9 @@ 1807694848,1807695359,JP 1807695360,1807695871,FR 1807695872,1807699967,VI -1807699968,1807707311,US +1807699968,1807706793,US +1807706794,1807706794,CN +1807706795,1807707311,US 1807707312,1807707312,JP 1807707313,1807732735,US 1807732736,1807736831,GP @@ -51052,9 +53178,7 @@ 1816001792,1816002559,NL 1816002560,1816068095,US 1816068096,1816133631,CA -1816133632,1816542463,US -1816542464,1816542719,CA -1816542720,1819976622,US +1816133632,1819976622,US 1819976623,1819976623,RE 1819976624,1822429183,US 1822429184,1822433279,CA @@ -51121,7 +53245,9 @@ 1823356160,1823356415,NL 1823356416,1823356671,US 1823356672,1823356927,NL -1823356928,1823361791,US +1823356928,1823358799,US +1823358800,1823358807,GB +1823358808,1823361791,US 1823361792,1823362303,CA 1823362304,1823375359,US 1823375360,1823379455,CA @@ -51145,7 +53271,9 @@ 1831337984,1831862271,DE 1831862272,1832124415,PT 1832124416,1832386559,IT -1832386560,1832448895,DK +1832386560,1832435711,DK +1832435712,1832435967,SE +1832435968,1832448895,DK 1832448896,1832449023,SE 1832449024,1832449535,DK 1832449536,1832449663,SE @@ -51153,8 +53281,10 @@ 1832460288,1832460799,SE 1832460800,1832484351,DK 1832484352,1832484607,SE -1832484608,1832554495,DK -1832554496,1832555007,SE +1832484608,1832496127,DK +1832496128,1832496383,SE +1832496384,1832550399,DK +1832550400,1832555007,SE 1832555008,1832648703,DK 1832648704,1832681471,HR 1832681472,1832714239,RU @@ -51185,11 +53315,7 @@ 1832799232,1832800255,FR 1832800256,1832800767,MQ 1832800768,1832801279,FR -1832801280,1832802303,MQ -1832802304,1832803583,FR -1832803584,1832803839,MQ -1832803840,1832804351,FR -1832804352,1832806399,MQ +1832801280,1832806399,MQ 1832806400,1832808447,GP 1832808448,1832812543,FR 1832812544,1832845311,RU @@ -51263,9 +53389,9 @@ 1833315968,1833316351,IM 1833316352,1833318399,DK 1833318400,1833320447,GB -1833320448,1833321215,IQ -1833321216,1833321471,AE -1833321472,1833322495,IQ +1833320448,1833321282,IQ +1833321283,1833321283,AE +1833321284,1833322495,IQ 1833322496,1833324543,IT 1833324544,1833326591,NO 1833326592,1833327103,GB @@ -51499,9 +53625,7 @@ 1835913216,1835917311,RU 1835917312,1835917919,GB 1835917920,1835917935,IT -1835917936,1835917959,GB -1835917960,1835917967,IT -1835917968,1835918439,GB +1835917936,1835918439,GB 1835918440,1835918447,IT 1835918448,1835918519,GB 1835918520,1835918527,IT @@ -51513,15 +53637,9 @@ 1835918848,1835918855,IT 1835918856,1835919415,GB 1835919416,1835919423,IT -1835919424,1835919511,GB -1835919512,1835919519,IT -1835919520,1835919751,GB +1835919424,1835919751,GB 1835919752,1835919759,IT -1835919760,1835919983,GB -1835919984,1835919991,IT -1835919992,1835921079,GB -1835921080,1835921087,IT -1835921088,1835921111,GB +1835919760,1835921111,GB 1835921112,1835921127,IT 1835921128,1835921159,GB 1835921160,1835921167,IT @@ -51535,27 +53653,23 @@ 1835922672,1835922679,IT 1835922680,1835923151,GB 1835923152,1835923159,IT -1835923160,1835923511,GB -1835923512,1835923527,IT +1835923160,1835923519,GB +1835923520,1835923527,IT 1835923528,1835923679,GB 1835923680,1835923687,IT 1835923688,1835923719,GB 1835923720,1835923727,IT 1835923728,1835924287,GB 1835924288,1835924295,IT -1835924296,1835924375,GB -1835924376,1835924383,IT -1835924384,1835925007,GB +1835924296,1835924815,GB +1835924816,1835924823,IT +1835924824,1835925007,GB 1835925008,1835925015,IT 1835925016,1835925111,GB 1835925112,1835925119,IT -1835925120,1835925159,GB -1835925160,1835925167,IT -1835925168,1835925191,GB +1835925120,1835925191,GB 1835925192,1835925199,IT -1835925200,1835925327,GB -1835925328,1835925335,IT -1835925336,1835925383,GB +1835925200,1835925383,GB 1835925384,1835925391,IT 1835925392,1835925479,GB 1835925480,1835925487,IT @@ -51885,7 +53999,8 @@ 1839529984,1839562751,RU 1839562752,1839595519,BA 1839595520,1839603711,SA -1839603712,1839618047,RO +1839603712,1839609855,RO +1839609856,1839618047,KZ 1839618048,1839628287,SA 1839628288,1839661055,RO 1839661056,1839693823,ES @@ -52000,7 +54115,11 @@ 1841926101,1841930239,NL 1841930240,1841938431,KG 1841938432,1841946623,RU -1841946624,1841954815,UA +1841946624,1841946658,PT +1841946659,1841946659,UA +1841946660,1841948671,PT +1841948672,1841948927,UA +1841948928,1841954815,PT 1841954816,1841971199,RU 1841971200,1841979391,CZ 1841979392,1841982975,NL @@ -52134,7 +54253,8 @@ 1843806208,1843822591,IR 1843822592,1843838975,RU 1843838976,1843839487,IR -1843839488,1843839999,DE +1843839488,1843839743,ES +1843839744,1843839999,DE 1843840000,1843840255,TR 1843840256,1843840767,DE 1843840768,1843841023,SE @@ -52146,18 +54266,19 @@ 1843843584,1843843839,AT 1843843840,1843844863,DE 1843844864,1843845119,GB -1843845120,1843845631,DE +1843845120,1843845631,ES 1843845632,1843845887,GB 1843845888,1843846143,DE 1843846144,1843846399,GB 1843846400,1843846655,IR -1843846656,1843846911,DE +1843846656,1843846911,ES 1843846912,1843847167,IR 1843847168,1843851775,DE 1843851776,1843852031,IR 1843852032,1843852799,DE 1843852800,1843853311,IR -1843853312,1843854079,DE +1843853312,1843853823,DE +1843853824,1843854079,ES 1843854080,1843854335,IR 1843854336,1843855359,DE 1843855360,1843871743,PL @@ -52178,8 +54299,7 @@ 1843943424,1843945471,CH 1843945472,1843947519,FR 1843947520,1843949567,RU -1843949568,1843950591,ES -1843950592,1843951615,BY +1843949568,1843951615,ES 1843951616,1843955711,DE 1843955712,1843957759,IT 1843957760,1843959807,CZ @@ -52316,11 +54436,7 @@ 1844310016,1844318207,FR 1844318208,1844322303,IT 1844322304,1844326399,CZ -1844326400,1844330239,DK -1844330240,1844330303,LU -1844330304,1844330423,DK -1844330424,1844330439,LU -1844330440,1844330495,DK +1844326400,1844330495,DK 1844330496,1844334591,GB 1844334592,1844342783,RU 1844342784,1844346879,IT @@ -52358,7 +54474,9 @@ 1844772864,1844838399,RS 1844838400,1844903935,GB 1844903936,1844969471,NO -1844969472,1845006335,RU +1844969472,1844984831,RU +1844984832,1844985343,GE +1844985344,1845006335,RU 1845006336,1845010431,KZ 1845010432,1845022719,RU 1845022720,1845023743,KZ @@ -52371,9 +54489,7 @@ 1845027584,1845027839,ES 1845027840,1845029887,RU 1845029888,1845030143,KZ -1845030144,1845030911,RU -1845030912,1845031935,GE -1845031936,1845035007,RU +1845030144,1845035007,RU 1845035008,1845100543,GB 1845100544,1845166079,DE 1845166080,1845231615,UA @@ -52423,8 +54539,7 @@ 1847853056,1848115199,PK 1848115200,1848377343,CN 1848377344,1848378367,BD -1848378368,1848379391,HK -1848379392,1848380415,IN +1848378368,1848380415,IN 1848380416,1848381439,CN 1848381440,1848382463,NZ 1848382464,1848383487,JP @@ -52461,7 +54576,9 @@ 1848832000,1848836095,JP 1848836096,1849032703,CN 1849032704,1849065471,JP -1849065472,1849163775,PH +1849065472,1849092607,PH +1849092608,1849092863,US +1849092864,1849163775,PH 1849163776,1849819135,CN 1849819136,1849950207,JP 1849950208,1850212351,KR @@ -52759,8 +54876,8 @@ 1886978048,1886986239,KR 1886986240,1886990335,TW 1886990336,1886994431,IN -1886994432,1887005695,TW -1887005696,1887010815,HK +1886994432,1887006719,TW +1887006720,1887010815,HK 1887010816,1887019007,TH 1887019008,1887027199,HK 1887027200,1887043583,KR @@ -52845,7 +54962,8 @@ 1897175040,1897176063,JP 1897176064,1897176319,SG 1897176320,1897176575,HK -1897176576,1897177087,SG +1897176576,1897176831,JP +1897176832,1897177087,US 1897177088,1897201663,JP 1897201664,1897209855,KR 1897209856,1897213951,AU @@ -52885,7 +55003,9 @@ 1897743616,1897744575,SI 1897744576,1897744607,SG 1897744608,1897746176,SI -1897746177,1897758719,US +1897746177,1897748511,US +1897748512,1897748514,HK +1897748515,1897758719,US 1897758720,1897779199,KR 1897779200,1897781247,AU 1897781248,1897783295,JP @@ -52983,10 +55103,11 @@ 1909481472,1909587967,CN 1909587968,1909719039,MY 1909719040,1909735423,CN +1909735424,1909736713,IN +1909736715,1909743615,IN 1909743616,1909744639,AU 1909744640,1909745663,CN 1909745664,1909746687,JP -1909746688,1909747711,MY 1909747712,1909751807,ID 1909751808,1909759999,JP 1909760000,1909762047,ID @@ -53536,7 +55657,53 @@ 1959661568,1959662591,IN 1959662592,1959663615,LK 1959663616,1959664639,SG -1959664640,1959665663,ID +1959664640,1959668735,ID +1959668736,1959670783,BD +1959670784,1959671807,HK +1959671808,1959673855,BD +1959673856,1959674879,PK +1959674880,1959675903,JP +1959675904,1959676927,US +1959676928,1959677951,SG +1959677952,1959678975,AU +1959678976,1959679999,PK +1959680000,1959681023,BD +1959681024,1959682047,CN +1959682048,1959683071,IN +1959683072,1959683327,US +1959683328,1959684095,CN +1959684096,1959685119,SC +1959685120,1959686143,PH +1959686144,1959687167,TH +1959687168,1959688191,HK +1959688192,1959689215,JP +1959689216,1959690239,TH +1959690240,1959691263,AU +1959691264,1959692287,BD +1959692288,1959693311,MM +1959693312,1959694335,PK +1959694336,1959698431,IN +1959698432,1959699455,NZ +1959699456,1959700479,PK +1959700480,1959701503,SE +1959701504,1959702527,NZ +1959702528,1959703551,CN +1959703552,1959704575,LK +1959704576,1959705599,AU +1959705600,1959707647,BD +1959707648,1959708671,ID +1959708672,1959709695,IN +1959709696,1959710719,SG +1959710720,1959711743,HK +1959711744,1959712767,ID +1959712768,1959713791,AU +1959713792,1959714815,IN +1959714816,1959715839,PH +1959715840,1959716863,AU +1959716864,1959719935,ID +1959719936,1959720959,LK +1959720960,1959721983,MY +1959721984,1959723007,BD 1959723008,1960050687,CN 1960050688,1960058879,KR 1960058880,1960067071,VN @@ -53571,8 +55738,8 @@ 1960211904,1960211967,SG 1960211968,1960212479,AU 1960212480,1960212582,IN -1960212584,1960212735,IN -1960212736,1960214015,SG +1960212584,1960212991,IN +1960212992,1960214015,SG 1960214016,1960214271,IN 1960214272,1960214527,SG 1960214528,1960574975,CN @@ -53618,7 +55785,7 @@ 1964146688,1964171263,JP 1964171264,1964173311,BD 1964173568,1964173823,JP -1964173824,1964174079,HK +1964173824,1964174079,US 1964174080,1964174335,AU 1964174336,1964174591,SG 1964174621,1964174621,TW @@ -53726,8 +55893,10 @@ 1970798592,1970800639,SG 1970800640,1970802943,AU 1970802944,1970803199,SG -1970803200,1970803711,AU -1970803712,1970804223,HK +1970803200,1970803455,AU +1970803456,1970803711,IN +1970803712,1970803967,HK +1970803968,1970804223,SG 1970804224,1970804479,AU 1970804480,1970804735,SG 1970804736,1970806783,KH @@ -53814,8 +55983,7 @@ 1986509824,1986510847,JP 1986510848,1986519039,KR 1986519040,1986523135,PK -1986523136,1986523904,HK -1986523905,1986525183,CN +1986523136,1986525183,CN 1986525184,1986527231,BN 1986527232,1986723839,JP 1986723840,1986740223,AU @@ -54047,67 +56215,8 @@ 2001829888,2001841247,HK 2001841248,2001841248,SA 2001841249,2001846271,HK -2001846272,2001855231,SG -2001855232,2001855263,US -2001855264,2001855743,SG -2001855744,2001855999,HK -2001856000,2001856127,SG -2001856128,2001856151,CZ -2001856152,2001856155,SG -2001856156,2001856159,CZ -2001856160,2001856191,SG -2001856192,2001856199,CZ -2001856200,2001857279,SG -2001857280,2001857535,HK -2001857536,2001857791,SG -2001857792,2001858047,HK -2001858048,2001858319,SG -2001858320,2001858335,US -2001858336,2001858639,SG -2001858640,2001858655,US -2001858656,2001859071,SG -2001859072,2001859327,HK -2001859328,2001860143,SG -2001860144,2001860159,US -2001860160,2001860351,SG -2001860352,2001860607,HK -2001860608,2001860655,SG -2001860656,2001860659,US -2001860660,2001860661,HK -2001860662,2001860664,US -2001860665,2001860665,HK -2001860666,2001860667,US -2001860668,2001860668,HK -2001860669,2001860671,US -2001860672,2001860991,SG -2001860992,2001860995,US -2001860996,2001860997,HK -2001860998,2001861001,US -2001861002,2001861003,HK -2001861004,2001861007,US -2001861008,2001861263,SG -2001861264,2001861265,US -2001861266,2001861267,HK -2001861268,2001861268,US -2001861269,2001861269,HK -2001861270,2001861271,US -2001861272,2001861272,HK -2001861273,2001861273,US -2001861274,2001861274,HK -2001861275,2001861279,US -2001861280,2001862079,SG -2001862080,2001862101,US -2001862102,2001862102,HK -2001862103,2001862116,US -2001862117,2001862118,HK -2001862119,2001862124,US -2001862125,2001862125,HK -2001862126,2001862128,US -2001862129,2001862131,HK -2001862132,2001862143,US -2001862144,2001862303,SG -2001862304,2001862335,HK -2001862336,2001862655,SG +2001846272,2001854463,SG +2001854464,2001862655,HK 2001862656,2001864703,AU 2001864704,2001870847,JP 2001870848,2001879039,KR @@ -54256,7 +56365,6 @@ 2019078144,2019082239,IN 2019082240,2019098623,HK 2019098624,2019115007,PH -2019115008,2019117055,US 2019117056,2019119103,IN 2019119104,2019121151,NZ 2019121152,2019123199,ID @@ -54325,7 +56433,7 @@ 2032926720,2033057791,AU 2033057792,2033074175,CN 2033074176,2033075199,PK -2033075200,2033077247,BD +2033075200,2033076223,BD 2033077248,2033078271,CN 2033078272,2033079295,HK 2033079296,2033088511,IN @@ -54361,7 +56469,8 @@ 2033625088,2033627135,HK 2033627136,2033629183,CN 2033629184,2033630207,AU -2033630208,2033631231,HK +2033630208,2033630463,CN +2033630464,2033631231,HK 2033631232,2033647615,KR 2033647616,2033663999,CN 2033664000,2033696767,KR @@ -54628,7 +56737,9 @@ 2063110144,2063111167,JP 2063111168,2063114239,AU 2063114240,2063115263,IN -2063115264,2063118159,JP +2063115264,2063116871,JP +2063116872,2063116879,KR +2063116880,2063118159,JP 2063118160,2063118191,PH 2063118192,2063118287,JP 2063118288,2063118303,PH @@ -55042,7 +57153,9 @@ 2097610752,2097643519,AU 2097643520,2097676287,KR 2097676288,2098200575,JP -2098200576,2098724863,IN +2098200576,2098593791,IN +2098593792,2098594303,SG +2098594304,2098724863,IN 2098724864,2098987007,TH 2098987008,2099183615,JP 2099183616,2099199999,MO @@ -55163,8 +57276,8 @@ 2147497216,2147497471,RO 2147497472,2147498239,DE 2147498240,2147498495,RO -2147498496,2147500287,DE -2147500288,2147501055,NL +2147498496,2147500031,DE +2147500032,2147501055,NL 2147501056,2147501311,SK 2147501312,2147501823,NL 2147501824,2147502079,US @@ -55296,9 +57409,7 @@ 2155827200,2155831295,PL 2155831296,2155833343,RU 2155833344,2155833855,SE -2155833856,2155834371,NL -2155834372,2155834373,SE -2155834374,2155834623,NL +2155833856,2155834623,NL 2155834624,2155834879,LU 2155834880,2155835391,NL 2155835392,2155839487,RO @@ -55332,7 +57443,9 @@ 2156920832,2156986367,CA 2156986368,2159017983,US 2159017984,2159083519,DE -2159083520,2159149055,US +2159083520,2159110463,US +2159110464,2159110495,CA +2159110496,2159149055,US 2159149056,2159280127,CH 2159280128,2159542271,US 2159542272,2159607807,AU @@ -55385,7 +57498,9 @@ 2166030336,2166095871,AT 2166095872,2166292479,US 2166292480,2166358015,GB -2166358016,2166571007,US +2166358016,2166472703,US +2166472704,2166473727,CA +2166473728,2166571007,US 2166571008,2166575103,GB 2166575104,2166594563,US 2166594564,2166594564,DE @@ -55419,7 +57534,9 @@ 2171076608,2171142143,FR 2171142144,2172256255,US 2172256256,2172272639,GH -2172272640,2172289023,RE +2172272640,2172277247,RE +2172277248,2172277759,FR +2172277760,2172289023,RE 2172289024,2172321791,AO 2172321792,2172452863,US 2172452864,2172518399,NL @@ -55589,7 +57706,9 @@ 2187264000,2187329535,AU 2187329536,2187331583,US 2187331584,2187332607,CA -2187332608,2187460607,US +2187332608,2187333631,US +2187333632,2187334143,DE +2187334144,2187460607,US 2187460608,2187526143,FR 2187526144,2187591679,US 2187591680,2187657215,SE @@ -55609,7 +57728,9 @@ 2188718162,2188718162,SI 2188718338,2188718338,AT 2188718474,2188718474,AT -2188719380,2188719380,NL +2188719360,2188719615,NL +2188719616,2188719743,FR +2188719744,2188719871,DE 2188724464,2188724464,NL 2188725248,2188725503,NL 2188726272,2188730367,ES @@ -55619,7 +57740,13 @@ 2188740608,2188741631,DE 2188749056,2188749311,US 2188754432,2188754687,RU -2188763136,2188771327,IT +2188763136,2188769471,IT +2188769472,2188769503,DE +2188769504,2188769599,IT +2188769600,2188769631,DE +2188769632,2188769663,IT +2188769664,2188770175,DE +2188770176,2188771327,IT 2188771328,2188836863,US 2188901754,2188901754,GB 2188902400,2188967935,FR @@ -55638,8 +57765,8 @@ 2190140416,2190737407,NL 2190737408,2190802943,GB 2190802944,2190803967,DE -2190803968,2190804991,PL -2190804992,2190868479,DE +2190803968,2190804735,PL +2190804736,2190868479,DE 2190868480,2191065087,US 2191065088,2191130623,JP 2191130624,2191196159,US @@ -55713,17 +57840,13 @@ 2193707656,2193707663,IT 2193707664,2193707751,GB 2193707752,2193707759,IT -2193707760,2193707767,GB -2193707768,2193707775,IT -2193707776,2193707791,GB +2193707760,2193707791,GB 2193707792,2193707799,IT 2193707800,2193707839,GB 2193707840,2193707847,IT 2193707848,2193708375,GB 2193708376,2193708383,IT -2193708384,2193708863,GB -2193708864,2193708871,IT -2193708872,2193709199,GB +2193708384,2193709199,GB 2193709200,2193709215,IT 2193709216,2193711103,GB 2193711104,2193713151,DE @@ -55794,7 +57917,7 @@ 2197798912,2197815295,IR 2197815296,2197816319,BO 2197816320,2197828607,BR -2197828608,2197829631,CL +2197828608,2197829631,AR 2197829632,2197833727,BR 2197833728,2197834751,CR 2197834752,2197841919,BR @@ -55806,9 +57929,7 @@ 2197849088,2197850111,BR 2197850112,2197851135,CO 2197851136,2197858303,BR -2197858304,2197858431,CO -2197858432,2197858447,CW -2197858448,2197859327,CO +2197858304,2197859327,CO 2197859328,2197860351,CL 2197860352,2197865471,BR 2197865472,2197866495,ES @@ -55850,9 +57971,7 @@ 2204172288,2204237823,SE 2204237824,2204303359,US 2204303360,2204368895,DE -2204368896,2204369407,PA -2204369408,2204369663,US -2204369664,2204369919,PA +2204368896,2204369919,PA 2204369920,2204376063,BR 2204376064,2204377087,CL 2204377088,2204378111,BR @@ -55883,18 +58002,13 @@ 2204893184,2204894207,AR 2204894208,2204895231,PA 2204895232,2204897279,BR -2204897280,2204897447,HN -2204897448,2204897455,CA -2204897456,2204898095,HN -2204898096,2204898111,CR -2204898112,2204898303,HN +2204897280,2204898303,HN 2204898304,2204899327,PA 2204899328,2204902399,BR 2204902400,2204903423,CR 2204903424,2204904447,AR 2204904448,2204910591,BR -2204910592,2204910847,AR -2204910848,2204911615,CL +2204910592,2204911615,CL 2204911616,2204913663,BR 2204913664,2204914687,AR 2204914688,2204929023,BR @@ -55906,9 +58020,7 @@ 2204943360,2204946431,BR 2204946432,2204947455,CL 2204947456,2204952575,BR -2204952576,2204952767,HN -2204952768,2204952775,US -2204952776,2204953599,HN +2204952576,2204953599,HN 2204953600,2204958719,BR 2204958720,2205089791,US 2205089792,2205155327,GB @@ -55957,7 +58069,9 @@ 2207776768,2207842303,CH 2207842304,2207846399,US 2207846400,2207848447,NL -2207848448,2207907839,US +2207848448,2207852543,US +2207852544,2207853055,RS +2207853056,2207907839,US 2207907840,2207973375,IT 2207973376,2208038911,NL 2208038912,2208235519,US @@ -55995,8 +58109,8 @@ 2209087488,2209153023,AU 2209153024,2209218559,DE 2209218560,2209284095,NL -2209284096,2209349631,IT -2209349632,2209411839,US +2209284096,2209349632,IT +2209349633,2209411839,US 2209411840,2209412095,NL 2209412096,2209415167,US 2209415168,2209480703,FI @@ -56094,11 +58208,15 @@ 2214068224,2214133759,JP 2214133760,2214264831,US 2214264832,2214330367,GB -2214330368,2214399047,US +2214330368,2214398975,US +2214398976,2214398983,CN +2214398984,2214399047,US 2214399048,2214399055,IE -2214399056,2214399071,US +2214399056,2214399071,CN 2214399072,2214399135,SG -2214399136,2214399295,US +2214399136,2214399215,US +2214399216,2214399223,CN +2214399224,2214399295,US 2214399296,2214399303,SG 2214399304,2214399331,US 2214399332,2214399339,HK @@ -56150,9 +58268,7 @@ 2214460416,2214461439,NL 2214461440,2214526975,FR 2214526976,2214527999,BR -2214528000,2214528333,AR -2214528334,2214528334,NL -2214528335,2214529023,AR +2214528000,2214529023,AR 2214529024,2214530047,BR 2214530048,2214531071,AR 2214531072,2214537215,BR @@ -56239,20 +58355,27 @@ 2230649728,2230653063,US 2230653064,2230653135,BR 2230653136,2230655559,US -2230655560,2230655711,IE +2230655560,2230655575,IE +2230655576,2230655583,US +2230655584,2230655711,IE 2230655712,2230655775,US 2230655776,2230655791,IE 2230655792,2230656351,US 2230656352,2230656423,AT -2230656424,2230656495,FI +2230656424,2230656431,US +2230656432,2230656495,FI 2230656496,2230656983,US 2230656984,2230656991,IE 2230656992,2230657007,US 2230657008,2230657023,IE 2230657024,2230657215,US -2230657216,2230657343,FI +2230657216,2230657231,FI +2230657232,2230657239,US +2230657240,2230657343,FI 2230657344,2230657559,US -2230657560,2230657727,IE +2230657560,2230657591,IE +2230657592,2230657599,US +2230657600,2230657727,IE 2230657728,2230657775,US 2230657776,2230657815,FI 2230657816,2230657879,US @@ -56306,7 +58429,9 @@ 2230664192,2230664647,US 2230664648,2230664703,AT 2230664704,2230664727,US -2230664728,2230664871,IE +2230664728,2230664735,IE +2230664736,2230664743,US +2230664744,2230664871,IE 2230664872,2230665087,US 2230665088,2230665183,AT 2230665184,2230665295,US @@ -56426,7 +58551,9 @@ 2230713936,2230713983,SG 2230713984,2230714047,KR 2230714048,2230714079,BR -2230714080,2230714255,MY +2230714080,2230714119,MY +2230714120,2230714127,US +2230714128,2230714255,MY 2230714256,2230714287,BR 2230714288,2230714303,US 2230714304,2230714311,CL @@ -56450,11 +58577,7 @@ 2231333888,2231335935,BR 2231335936,2231336959,MX 2231336960,2231337983,BR -2231337984,2231338639,HN -2231338640,2231338647,US -2231338648,2231338695,HN -2231338696,2231338703,US -2231338704,2231339007,HN +2231337984,2231339007,HN 2231339008,2231346175,BR 2231346176,2231347199,PY 2231347200,2231355391,BR @@ -56567,9 +58690,11 @@ 2255749120,2255814655,US 2255814656,2255880191,CA 2255880192,2255945727,US -2255945728,2255998975,DE -2255998976,2256003071,FR -2256003072,2256011263,DE +2255945728,2255994879,DE +2255994880,2256003071,FR +2256003072,2256006655,DE +2256006656,2256006911,FR +2256006912,2256011263,DE 2256011264,2256535551,US 2256535552,2256543743,GB 2256543744,2256551935,US @@ -56790,7 +58915,9 @@ 2259304976,2259304991,US 2259304992,2259305407,NL 2259305408,2259305439,US -2259305440,2259306431,NL +2259305440,2259306239,NL +2259306240,2259306367,US +2259306368,2259306431,NL 2259306432,2259308543,US 2259308544,2259312639,IE 2259312640,2259314687,NL @@ -56810,9 +58937,7 @@ 2259342848,2259343359,IE 2259343360,2259343615,HK 2259343616,2259343871,BR -2259343872,2259348479,US -2259348480,2259348991,NL -2259348992,2259352575,US +2259343872,2259352575,US 2259352576,2259353343,IE 2259353344,2259353599,US 2259353600,2259419135,DE @@ -56853,7 +58978,9 @@ 2262040576,2262106111,FR 2262106112,2262171647,GB 2262171648,2262237183,FR -2262237184,2262499327,US +2262237184,2262414335,US +2262414336,2262415359,IN +2262415360,2262499327,US 2262499328,2262630399,GB 2262630400,2262722809,NL 2262722811,2262724071,NL @@ -56884,13 +59011,18 @@ 2264909312,2264909567,DE 2264909568,2264909823,TR 2264909824,2264911871,IR -2264911872,2264920575,DE -2264920576,2264920831,ES +2264911872,2264912383,DE +2264912384,2264912895,ES +2264912896,2264913663,DE +2264913664,2264913919,ES +2264913920,2264920319,DE +2264920320,2264920831,ES 2264920832,2264921343,DE 2264921344,2264921855,IR 2264921856,2264922111,DE 2264922112,2264922623,IR -2264922624,2264924159,DE +2264922624,2264922879,ES +2264922880,2264924159,DE 2264924160,2264989695,CA 2264989696,2265605887,US 2265605888,2265606143,GB @@ -56957,7 +59089,9 @@ 2282264832,2283151359,US 2283151360,2283159551,IN 2283159552,2291142655,US -2291142656,2291204095,NL +2291142656,2291154943,NL +2291154944,2291171327,GB +2291171328,2291204095,NL 2291204096,2291269631,PR 2291269632,2291281919,US 2291281920,2291286015,JP @@ -57069,8 +59203,7 @@ 2302404608,2302405631,JP 2302405632,2302406655,HK 2302406656,2302408703,IN -2302408704,2302409727,AU -2302409728,2302410751,JP +2302408704,2302410751,AU 2302410752,2302541823,SE 2302541824,2302607359,CH 2302607360,2302625761,SC @@ -57102,7 +59235,9 @@ 2303340640,2303340671,FI 2303340672,2303341283,FR 2303341284,2303341287,FI -2303341288,2303342459,FR +2303341288,2303341951,FR +2303341952,2303341967,ES +2303341968,2303342459,FR 2303342460,2303342463,DE 2303342464,2303343039,FR 2303343040,2303343103,PT @@ -57112,9 +59247,13 @@ 2303343488,2303343615,IE 2303343616,2303343827,FR 2303343828,2303343831,DE -2303343832,2303344639,FR +2303343832,2303344471,FR +2303344472,2303344479,IE +2303344480,2303344639,FR 2303344640,2303344895,GB -2303344896,2303349119,FR +2303344896,2303348863,FR +2303348864,2303348991,GB +2303348992,2303349119,FR 2303349120,2303349247,ES 2303349248,2303349383,FR 2303349384,2303349391,NL @@ -57122,7 +59261,9 @@ 2303350784,2303351039,ES 2303351040,2303351055,FR 2303351056,2303351071,GB -2303351072,2303353215,FR +2303351072,2303352523,FR +2303352524,2303352524,GB +2303352525,2303353215,FR 2303353216,2303353343,GB 2303353344,2303353783,FR 2303353784,2303353787,GB @@ -57152,13 +59293,17 @@ 2303382880,2303382895,ES 2303382896,2303383503,FR 2303383504,2303383519,GB -2303383520,2303384959,FR +2303383520,2303383807,FR +2303383808,2303383935,ES +2303383936,2303384959,FR 2303384960,2303384991,GB 2303384992,2303385087,FR 2303385088,2303385103,FI 2303385104,2303388415,FR 2303388416,2303388543,ES -2303388544,2303392843,FR +2303388544,2303391007,FR +2303391008,2303391039,IE +2303391040,2303392843,FR 2303392844,2303392847,FI 2303392848,2303393535,FR 2303393536,2303393567,PT @@ -57286,7 +59431,8 @@ 2315257856,2315258879,AR 2315258880,2315259903,CL 2315259904,2315266047,BR -2315266048,2315267071,VE +2315266048,2315266559,VE +2315266560,2315267071,CO 2315267072,2315270143,BR 2315270144,2315271167,AR 2315271168,2315278335,BR @@ -57332,7 +59478,8 @@ 2317395968,2317396223,NO 2317396224,2317398015,US 2317398016,2317398271,GB -2317398272,2317413375,US +2317398272,2317412351,US +2317412352,2317413375,CA 2317413376,2317413631,ID 2317413632,2317414655,US 2317414656,2317414911,AU @@ -57356,9 +59503,7 @@ 2317638656,2317639679,HN 2317639680,2317640703,AR 2317640704,2317649919,BR -2317649920,2317649991,HN -2317649992,2317649999,US -2317650000,2317650943,HN +2317649920,2317650943,HN 2317650944,2317651967,BR 2317651968,2317652991,PE 2317652992,2317654015,AR @@ -57381,9 +59526,7 @@ 2318598144,2318663679,CA 2318663680,2319122431,US 2319122432,2319123455,AR -2319123456,2319123999,HN -2319124000,2319124007,US -2319124008,2319124479,HN +2319123456,2319124479,HN 2319124480,2319125503,VE 2319125504,2319126527,UY 2319126528,2319127551,CR @@ -57406,9 +59549,7 @@ 2319165440,2319167487,AR 2319167488,2319168511,HN 2319169536,2319174655,BR -2319174656,2319175647,HN -2319175648,2319175663,BR -2319175664,2319175679,HN +2319174656,2319175679,HN 2319175680,2319184895,BR 2319184896,2319185919,AR 2319185920,2319187967,BR @@ -57418,10 +59559,12 @@ 2319450112,2319581183,US 2319581184,2319646719,IT 2319646720,2319728639,US -2319728640,2319740927,DE -2319740928,2319745023,US -2319745024,2319757311,GB -2319757312,2319843327,US +2319728640,2319741951,DE +2319741952,2319742975,US +2319742976,2319743999,NL +2319744000,2319745023,DE +2319745024,2319761407,GB +2319761408,2319843327,US 2319843328,2319908863,IT 2319908864,2319974399,AU 2319974400,2320039935,US @@ -57445,13 +59588,7 @@ 2321420288,2321430527,BR 2321430528,2321431551,CR 2321431552,2321446911,BR -2321446912,2321447263,HN -2321447264,2321447279,NL -2321447280,2321447647,HN -2321447648,2321447679,NL -2321447680,2321447727,HN -2321447728,2321447743,NL -2321447744,2321447935,HN +2321446912,2321447935,HN 2321447936,2321452031,BR 2321452032,2321453055,MX 2321453056,2321454079,HN @@ -57490,13 +59627,7 @@ 2321743872,2321744895,SV 2321744896,2321745919,AR 2321745920,2321753087,BR -2321753088,2321753359,HN -2321753360,2321753375,NL -2321753376,2321753599,HN -2321753600,2321753607,NL -2321753608,2321753927,HN -2321753928,2321753935,NL -2321753936,2321754111,HN +2321753088,2321754111,HN 2321754112,2321755135,BR 2321755136,2321756159,UY 2321756160,2321769471,BR @@ -57729,9 +59860,9 @@ 2327472128,2327476223,BR 2327476224,2327477247,CL 2327477248,2327480319,BR -2327480320,2327481055,HN -2327481056,2327481071,US -2327481072,2327481343,HN +2327480320,2327481007,HN +2327481008,2327481023,US +2327481024,2327481343,HN 2327481344,2327482367,AR 2327482368,2327483391,BR 2327483392,2327485439,AR @@ -57744,11 +59875,9 @@ 2327494656,2327496703,BR 2327496704,2327497727,MX 2327497728,2327498751,BR -2327498752,2327499055,HN -2327499056,2327499063,CL -2327499064,2327499655,HN -2327499656,2327499663,CL -2327499664,2327499775,HN +2327498752,2327499343,HN +2327499344,2327499351,CL +2327499352,2327499775,HN 2327499776,2327501823,AR 2327501824,2327507967,BR 2327507968,2327508991,AR @@ -57759,8 +59888,8 @@ 2327969792,2328035327,AU 2328035328,2328100863,FR 2328100864,2328199167,US -2328199168,2328207359,CA -2328207360,2328231935,US +2328199168,2328211455,CA +2328211456,2328231935,US 2328231936,2328297471,GB 2328313856,2328317951,NL 2328342528,2328342783,DE @@ -57846,7 +59975,9 @@ 2330198016,2330263551,CH 2330263552,2330267647,US 2330267648,2330271743,CA -2330271744,2330394623,US +2330271744,2330288127,US +2330288128,2330290175,CN +2330290176,2330394623,US 2330394624,2330460159,FR 2330460160,2330525695,AT 2330525696,2330591231,SE @@ -57865,7 +59996,7 @@ 2331508736,2331574271,GB 2331574272,2331639807,FI 2331639808,2331770879,GB -2331770880,2331836415,AU +2331770880,2331836415,HK 2331836416,2331901951,GB 2331901952,2331967487,US 2331967488,2331980799,BR @@ -57961,14 +60092,12 @@ 2335768576,2335834111,CA 2335834112,2335899647,SE 2335899648,2335924223,IN -2335924224,2335928319,SG -2335928320,2335932415,IN +2335924224,2335932415,SG 2335932416,2335940607,DE 2335940608,2335948799,GB -2335948800,2335951266,SG -2335951267,2335951267,GB -2335951268,2335952895,SG -2335952896,2335954943,DE +2335948800,2335949823,SG +2335949824,2335951871,GB +2335951872,2335954943,DE 2335954944,2335965183,SG 2335965184,2335994879,US 2335994880,2335995903,CA @@ -58022,7 +60151,9 @@ 2340683776,2340749311,AU 2340749312,2340814847,GB 2340814848,2340880383,AU -2340880384,2341273599,US +2340880384,2341126143,US +2341126144,2341134335,CY +2341134336,2341273599,US 2341273600,2341339135,KW 2341339136,2341404671,CA 2341404672,2341470207,GB @@ -58101,8 +60232,7 @@ 2354053120,2354118655,CA 2354184192,2354249727,US 2354249728,2354315263,AU -2354315264,2354380799,US -2354380800,2354446335,NL +2354315264,2354446335,US 2354446336,2354511871,FR 2354511872,2354839551,US 2354839552,2354905087,TW @@ -58166,7 +60296,7 @@ 2364407808,2364538879,US 2364538880,2364604415,CN 2364604416,2364671487,US -2364671488,2364671743,MO +2364671488,2364671743,HK 2364671744,2364675839,US 2364675840,2364676095,CA 2364676096,2364676863,US @@ -58265,7 +60395,8 @@ 2372225024,2372225791,US 2372225792,2372226303,NL 2372226304,2372226559,SG -2372226560,2372227583,SE +2372226560,2372227071,US +2372227072,2372227583,SE 2372227584,2372228607,KR 2372228608,2372229119,US 2372229120,2372229375,FR @@ -58407,7 +60538,11 @@ 2378203648,2378210559,FI 2378210560,2378211071,NO 2378211072,2378235903,FI -2378235904,2378301439,ES +2378235904,2378239039,ES +2378239040,2378239071,CA +2378239072,2378239175,ES +2378239176,2378239179,CA +2378239180,2378301439,ES 2378301440,2378303231,FR 2378303488,2378366975,FR 2378366976,2378432511,US @@ -58427,9 +60562,23 @@ 2379284480,2380201983,US 2380201984,2380267519,KR 2380267520,2380398591,US -2380398592,2380434431,IL +2380398592,2380420095,IL +2380420096,2380420863,GB +2380420864,2380430847,IL +2380430848,2380431103,GB +2380431104,2380431615,IL +2380431616,2380431871,US +2380431872,2380432127,TH +2380432128,2380432383,US +2380432384,2380434431,IL 2380434432,2380435455,US -2380435456,2380464127,IL +2380435456,2380455935,IL +2380455936,2380456447,US +2380456448,2380456959,IL +2380456960,2380457215,NL +2380457216,2380457727,US +2380457728,2380457983,HK +2380457984,2380464127,IL 2380464128,2380464639,FR 2380464640,2380465151,US 2380465152,2380465407,FR @@ -58533,9 +60682,13 @@ 2387476480,2387542015,CA 2387542016,2387607551,US 2387607552,2388328447,CA -2388328448,2388350207,US +2388328448,2388330495,US +2388330496,2388332543,NL +2388332544,2388350207,US 2388350208,2388350463,LK -2388350464,2388393983,US +2388350464,2388367359,US +2388367360,2388369407,NL +2388369408,2388393983,US 2388393984,2389245951,CA 2389245952,2389311487,US 2389311488,2389639167,CA @@ -58578,7 +60731,8 @@ 2392025088,2392063999,US 2392064000,2392096767,CA 2392096768,2392129535,US -2392129536,2392489983,CA +2392129536,2392457215,CA +2392457216,2392489983,RO 2392489984,2392514559,US 2392514560,2394947583,CA 2394947584,2395013119,US @@ -58595,9 +60749,7 @@ 2398945280,2399010815,CA 2399010816,2399109119,US 2399109120,2399141887,PR -2399141888,2399148031,BR -2399148032,2399149055,DO -2399149056,2399150079,BR +2399141888,2399150079,BR 2399150080,2399151103,BQ 2399151104,2399158271,BR 2399158272,2399159295,AR @@ -58617,7 +60769,9 @@ 2399184896,2399185919,AR 2399185920,2399186943,TT 2399186944,2399202303,BR -2399202304,2399203327,HN +2399202304,2399202591,HN +2399202592,2399202623,NL +2399202624,2399203327,HN 2399203328,2399204351,CL 2399204352,2399205375,AR 2399205376,2399206399,PE @@ -58688,33 +60842,7 @@ 2408182784,2408183807,AR 2408183808,2408185855,BR 2408185856,2409562111,US -2409562112,2409563135,GB -2409563136,2409564159,US -2409564160,2409565695,GB -2409565696,2409566207,US -2409566208,2409569791,GB -2409569792,2409570047,US -2409570048,2409570559,GB -2409570560,2409570815,US -2409570816,2409571327,GB -2409571328,2409572351,US -2409572352,2409576447,GB -2409576448,2409576959,US -2409576960,2409580543,GB -2409580544,2409580799,US -2409580800,2409581311,GB -2409581312,2409581567,US -2409581568,2409585151,GB -2409585152,2409585407,US -2409585408,2409585535,GB -2409585536,2409586175,US -2409586176,2409587199,GB -2409587200,2409588735,US -2409588736,2409616383,GB -2409616384,2409616895,US -2409616896,2409618175,GB -2409618176,2409618431,US -2409618432,2409627647,GB +2409562112,2409627647,GB 2409627648,2409693183,ZA 2409693184,2409758719,AT 2409758720,2409824255,US @@ -58852,7 +60980,7 @@ 2416085760,2416086015,GB 2416086016,2416086271,SG 2416086272,2416087039,GB -2416087040,2416091135,NL +2416087040,2416091135,US 2416091136,2416093183,ES 2416093184,2416095231,NL 2416095232,2416111615,US @@ -59024,7 +61152,7 @@ 2419082240,2419083263,HK 2419083264,2419085311,IN 2419085312,2419086079,MM -2419086080,2419086335,HK +2419086080,2419086335,AU 2419086336,2419087359,BD 2419087360,2419088383,CN 2419088384,2419089407,KR @@ -59034,8 +61162,7 @@ 2419090432,2419091455,KR 2419091456,2419091711,US 2419091712,2419091967,SG -2419091968,2419092223,US -2419092224,2419092479,SG +2419091968,2419092479,US 2419092480,2419094527,BD 2419094528,2419095551,AU 2419095552,2419096575,PK @@ -59131,7 +61258,9 @@ 2427536896,2427537151,US 2427537152,2427544575,NO 2427544832,2427584511,NO -2427584512,2427650047,GB +2427584512,2427625471,GB +2427625472,2427633663,ES +2427633664,2427650047,GB 2427650048,2427846655,NO 2427846656,2428183562,US 2428183564,2428567551,US @@ -59178,12 +61307,17 @@ 2432630784,2432696319,CN 2432696320,2433247231,NL 2433247232,2433247487,GB -2433247488,2433646591,NL +2433247488,2433630207,NL +2433630208,2433638399,GB +2433638400,2433646591,SE 2433646592,2433647615,DE -2433647616,2433648639,US +2433647616,2433648639,CA 2433648640,2433650687,DE 2433650688,2433654783,US -2433654784,2433679359,DE +2433654784,2433662975,IT +2433662976,2433675263,DE +2433675264,2433677311,PL +2433677312,2433679359,AT 2433679360,2433810431,NL 2433810432,2433875967,GB 2433875968,2435055615,NL @@ -59193,8 +61327,8 @@ 2436366336,2436628479,NL 2436628480,2436630527,BE 2436630528,2436632575,NL -2436632576,2436633599,DK -2436633600,2436694015,BE +2436632576,2436634623,DK +2436634624,2436694015,BE 2436694016,2436759551,NL 2436759552,2436767743,GB 2436768000,2436775935,GB @@ -59338,7 +61472,8 @@ 2453864448,2453929983,CH 2453929984,2454061055,US 2454061056,2454126591,GB -2454126592,2454150655,US +2454126592,2454149631,US +2454149632,2454150655,CA 2454150656,2454151167,AE 2454151168,2454192127,US 2454192128,2454257663,NO @@ -59371,8 +61506,8 @@ 2455175168,2455240703,GB 2455240704,2455244799,US 2455244800,2455244943,AU -2455244944,2455244944,US -2455244945,2455245055,AU +2455244944,2455244945,US +2455244946,2455245055,AU 2455245056,2455245311,US 2455245312,2455245567,AU 2455245568,2455245823,NL @@ -59469,11 +61604,21 @@ 2457379840,2457380095,CZ 2457380096,2457380863,RU 2457380864,2457381631,UA -2457381632,2457382911,CZ -2457382912,2457389055,RU -2457389056,2457391103,CZ -2457391104,2457393151,RU -2457393152,2457396223,CZ +2457381632,2457381887,CZ +2457381888,2457382399,RU +2457382400,2457382911,CZ +2457382912,2457383935,RU +2457383936,2457384959,UA +2457384960,2457388031,RU +2457388032,2457388543,CZ +2457388544,2457388799,UA +2457388800,2457390591,CZ +2457390592,2457392127,RU +2457392128,2457394431,CZ +2457394432,2457394687,RU +2457394688,2457394943,CZ +2457394944,2457395455,RU +2457395456,2457396223,CZ 2457396224,2457397247,DE 2457397248,2457403391,RU 2457403392,2457520895,US @@ -59576,49 +61721,47 @@ 2462350336,2462351359,CN 2462351360,2462384127,GM 2462384128,2462449663,US -2462449664,2462460415,GB -2462460416,2462460799,US -2462460800,2462463487,GB -2462463488,2462464895,US -2462464896,2462465023,GB -2462465024,2462465535,US -2462465536,2462467583,GB -2462467584,2462468351,US -2462468352,2462469375,GB -2462469376,2462471167,US -2462471168,2462472447,GB +2462449664,2462463999,GB +2462464000,2462464767,US +2462464768,2462467583,GB +2462467584,2462468095,US +2462468096,2462469631,GB +2462469632,2462470143,US +2462470144,2462472447,GB 2462472448,2462472703,US 2462472704,2462473471,GB 2462473472,2462473727,US -2462473728,2462474239,GB -2462474240,2462474751,US -2462474752,2462475007,GB -2462475008,2462475135,US -2462475136,2462476031,GB -2462476032,2462476287,US -2462476288,2462477311,GB +2462473728,2462477311,GB 2462477312,2462478335,US -2462478336,2462479359,GB -2462479360,2462479871,US -2462479872,2462500351,GB +2462478336,2462500351,GB 2462500352,2462500863,US -2462500864,2462503167,GB -2462503168,2462503679,US -2462503680,2462503935,GB -2462503936,2462504191,US -2462504192,2462505471,GB -2462505472,2462507519,US -2462507520,2462507775,GB -2462507776,2462508031,US -2462508032,2462509823,GB -2462509824,2462510079,US -2462510080,2462510847,GB -2462510848,2462511103,US -2462511104,2462514175,GB -2462514176,2462515199,US -2462515200,2462526602,GB +2462500864,2462506495,GB +2462506496,2462507007,US +2462507008,2462515199,GB +2462515200,2462519295,US +2462519296,2462520319,GB +2462520320,2462521599,US +2462521600,2462521855,GB +2462521856,2462523391,US +2462523392,2462526602,GB 2462526603,2462526603,US -2462526604,2462580736,GB +2462526604,2462531583,GB +2462531584,2462533631,US +2462533632,2462535167,GB +2462535168,2462535679,US +2462535680,2462539775,GB +2462539776,2462540799,US +2462540800,2462541055,GB +2462541056,2462547967,US +2462547968,2462556415,GB +2462556416,2462559231,US +2462559232,2462560255,GB +2462560256,2462564351,US +2462564352,2462572543,GB +2462572544,2462574079,US +2462574080,2462574591,GB +2462574592,2462580735,US +2462580736,2462580736,GB 2462580737,2462582015,US 2462582016,2462582271,GB 2462582272,2462583039,US @@ -59655,7 +61798,9 @@ 2462607104,2462607359,GB 2462607360,2462609919,US 2462609920,2462610175,GB -2462610176,2462614527,US +2462610176,2462610943,US +2462610944,2462611199,GB +2462611200,2462614527,US 2462614528,2462614783,GB 2462614784,2462615551,US 2462615552,2462615807,GB @@ -59717,7 +61862,8 @@ 2465671168,2465672703,IE 2465672704,2465672959,BG 2465672960,2465673215,IE -2465673216,2465677311,GB +2465673216,2465673471,IM +2465673472,2465677311,GB 2465677312,2465679359,IT 2465679360,2465681407,NL 2465681408,2465683455,SE @@ -59827,7 +61973,9 @@ 2472083456,2472148991,GB 2472148992,2472214527,US 2472214528,2472280063,RS -2472280064,2472312831,US +2472280064,2472296447,US +2472296448,2472300543,CA +2472300544,2472312831,US 2472312832,2472345599,JP 2472345600,2472411135,BE 2472411136,2472476671,FR @@ -59926,9 +62074,9 @@ 2481586688,2481587199,GB 2481587200,2481848319,IL 2481848320,2482175999,US -2482176000,2482208767,FI +2482176000,2482208767,GB 2482208768,2482216959,US -2482216960,2482225151,FI +2482216960,2482225151,GB 2482225152,2482233343,SG 2482233344,2482241535,CN 2482241536,2482634751,US @@ -59952,7 +62100,9 @@ 2486928896,2486929151,CA 2486929152,2486929407,US 2486929408,2486929663,CA -2486929664,2486946815,US +2486929664,2486945535,US +2486945536,2486945551,CA +2486945552,2486946815,US 2486946816,2486947327,CA 2486947328,2486949887,US 2486949888,2486951423,CA @@ -59964,7 +62114,9 @@ 2486960128,2487025663,FR 2487025664,2487156735,US 2487156736,2487222271,PT -2487222272,2487369727,US +2487222272,2487363583,US +2487363584,2487365631,CA +2487365632,2487369727,US 2487369728,2487386111,PF 2487386112,2487394303,SG 2487394304,2487418879,US @@ -59972,7 +62124,9 @@ 2487549952,2487615487,PT 2487615488,2487681023,US 2487681024,2487746559,PT -2487746560,2488205311,US +2487746560,2488066047,US +2488066048,2488074239,IL +2488074240,2488205311,US 2488205312,2488270847,GB 2488270848,2488336383,US 2488336384,2488401919,PL @@ -60052,13 +62206,9 @@ 2496004096,2496069631,AT 2496069632,2496135167,US 2496135168,2496200703,NL -2496200704,2497682431,MX -2497682432,2497683455,EC -2497683456,2498475007,MX +2496200704,2498475007,MX 2498475008,2498476031,EC -2498476032,2499110519,MX -2499110520,2499110527,NI -2499110528,2499477503,MX +2498476032,2499477503,MX 2499477504,2499543039,DE 2499543040,2499545087,GB 2499545088,2499547135,IE @@ -60095,9 +62245,15 @@ 2500144896,2500145151,IE 2500145152,2500149247,US 2500149248,2500150271,GB -2500150272,2500150655,US +2500150272,2500150559,US +2500150560,2500150591,GB +2500150592,2500150655,US 2500150656,2500150719,GB -2500150720,2500155647,US +2500150720,2500154751,US +2500154752,2500154815,GB +2500154816,2500155199,US +2500155200,2500155391,GB +2500155392,2500155647,US 2500155648,2500155903,GB 2500155904,2500161023,US 2500161024,2500161535,GB @@ -60105,16 +62261,18 @@ 2500161792,2500162047,GB 2500162048,2500162559,US 2500162560,2500163071,GB -2500163072,2500166207,US -2500166208,2500166223,GB -2500166224,2500170751,US +2500163072,2500165631,US +2500165632,2500169727,GB +2500169728,2500170751,US 2500170752,2500170752,FI 2500170753,2500177935,US 2500177936,2500177943,PL 2500177944,2500180735,US 2500180736,2500180991,HR 2500180992,2500182015,US -2500182016,2500188679,GB +2500182016,2500188223,GB +2500188224,2500188287,CH +2500188288,2500188679,GB 2500188680,2500188687,CH 2500188688,2500190207,GB 2500190208,2500190975,US @@ -60160,18 +62318,20 @@ 2500238048,2500238055,FR 2500238056,2500239359,IT 2500239360,2500243455,FR -2500243456,2500247551,US +2500243456,2500245503,US +2500245504,2500246015,GB +2500246016,2500246271,US +2500246272,2500246527,GB +2500246528,2500247551,US 2500247552,2500255743,ES 2500255744,2500268031,US 2500268032,2500272127,ES 2500272128,2500273407,GB -2500273408,2500275455,US -2500275456,2500275711,GB -2500275712,2500276223,US -2500276224,2500276735,GB +2500273408,2500275199,US +2500275200,2500276735,GB 2500276736,2500276991,US -2500276992,2500277055,GB -2500277056,2500278751,US +2500276992,2500277247,GB +2500277248,2500278751,US 2500278752,2500279295,GB 2500279296,2500288511,US 2500288512,2500290815,FR @@ -60195,9 +62355,9 @@ 2500535374,2500535374,IE 2500535375,2500535399,US 2500535400,2500535407,IE -2500535408,2500537687,US -2500537688,2500537695,GB -2500537696,2500542751,US +2500535408,2500536319,US +2500536320,2500538367,GB +2500538368,2500542751,US 2500542752,2500542755,NL 2500542756,2500544767,US 2500544768,2500545023,GR @@ -60207,9 +62367,9 @@ 2500549272,2500549279,ES 2500549280,2500550143,US 2500550144,2500550655,UA -2500550656,2500553759,US -2500553760,2500553767,GB -2500553768,2500554379,US +2500550656,2500553727,US +2500553728,2500554239,GB +2500554240,2500554379,US 2500554380,2500554487,DE 2500554488,2500556295,US 2500556296,2500556303,CZ @@ -60246,7 +62406,9 @@ 2500665344,2500666111,US 2500666368,2500666463,US 2500666464,2500666471,LU -2500666472,2500680447,US +2500666472,2500674623,US +2500674624,2500674687,DE +2500674688,2500680447,US 2500680448,2500680703,SE 2500680704,2500681759,US 2500681760,2500681767,PL @@ -60258,7 +62420,11 @@ 2500687872,2500689919,FR 2500689920,2500694015,US 2500694016,2500697087,IT -2500697088,2500719103,US +2500697088,2500702463,US +2500702464,2500702471,GB +2500702472,2500702719,US +2500702720,2500702975,NL +2500702976,2500719103,US 2500719104,2500721151,IE 2500721152,2500723799,US 2500723800,2500723807,ES @@ -60277,11 +62443,11 @@ 2500746776,2500748543,US 2500748544,2500748799,ES 2500748800,2500755455,US -2500755456,2500763647,GB +2500755456,2500761631,GB +2500761632,2500761639,FR +2500761640,2500763647,GB 2500763648,2500984831,US -2500984832,2500997119,GB -2500997120,2500999167,US -2500999168,2501033983,GB +2500984832,2501033983,GB 2501033984,2501574655,US 2501574656,2501640191,KZ 2501640192,2502033407,US @@ -60292,10 +62458,12 @@ 2502047744,2502049791,ES 2502049792,2502098943,US 2502098944,2502164479,IT -2502164480,2502165503,GB -2502165504,2502173695,US +2502164480,2502165759,GB +2502165760,2502173695,US 2502173696,2502174207,DE -2502174208,2502221823,US +2502174208,2502180863,US +2502180864,2502181119,FI +2502181120,2502221823,US 2502221824,2502222591,ES 2502222592,2502222847,US 2502222848,2502223871,ES @@ -60370,10 +62538,8 @@ 2505469952,2505474047,NL 2505474048,2505482239,US 2505482240,2505484287,NL -2505484288,2505487871,US -2505487872,2505488127,FR -2505488128,2505488383,US -2505488384,2505490431,FR +2505484288,2505486335,US +2505486336,2505490431,FR 2505490432,2505498623,HR 2505498624,2505502719,US 2505502720,2505503743,UA @@ -60414,7 +62580,11 @@ 2506530816,2506555391,ES 2506555392,2507124735,US 2507124736,2507124991,IN -2507124992,2508062719,US +2507124992,2507145215,US +2507173888,2507174143,US +2507175936,2507177983,CA +2507183360,2507183615,US +2507210752,2508062719,US 2508062720,2508064767,CH 2508064768,2508066815,ES 2508066816,2508068863,RU @@ -60479,7 +62649,7 @@ 2509936640,2509937919,AT 2509937920,2509938175,IT 2509938176,2509938431,US -2509938432,2509938687,AT +2509938432,2509938687,DE 2509938688,2509942783,GB 2509942784,2509946879,UA 2509946880,2509963263,BE @@ -60601,9 +62771,7 @@ 2513102904,2513103895,FR 2513103896,2513103935,PT 2513103936,2513103967,IE -2513103968,2513104819,FR -2513104820,2513104823,PL -2513104824,2513106239,FR +2513103968,2513106239,FR 2513106240,2513106303,IE 2513106304,2513107079,FR 2513107080,2513107083,FI @@ -60625,7 +62793,9 @@ 2513764352,2514419711,DE 2514419712,2514485247,GB 2514485248,2514681599,DE -2514681856,2515189759,DE +2514681856,2515140607,DE +2515140608,2515142655,US +2515142656,2515189759,DE 2515189760,2515206143,US 2515206144,2515271679,GB 2515271680,2515599359,DE @@ -60679,7 +62849,10 @@ 2522813440,2522814463,TH 2522814464,2522815487,SG 2522815488,2522816511,TH -2522816512,2523201535,JP +2522816512,2522824703,JP +2522824704,2522834943,SG +2522834944,2522841087,VN +2522841088,2523201535,JP 2523201536,2523267071,AU 2523267072,2523463679,US 2523463680,2523529215,CA @@ -60778,7 +62951,9 @@ 2525298688,2525626367,US 2525626368,2525757439,CN 2525757440,2525822975,GR -2525822976,2526085119,US +2525822976,2525954047,US +2525954048,2526019583,GB +2526019584,2526085119,US 2526085120,2526216191,IT 2526216192,2526412799,US 2526412800,2526478335,KR @@ -60876,14 +63051,14 @@ 2533294080,2533359615,CN 2533359616,2533375999,UA 2533376000,2533392383,HU -2533392384,2534823255,IT -2534823256,2534823263,SI -2534823264,2538602495,IT +2533392384,2538602495,IT 2538602496,2538604967,FR 2538604968,2538604975,ES 2538604976,2538605271,FR 2538605272,2538605279,ES -2538605280,2538605471,FR +2538605280,2538605375,FR +2538605376,2538605379,GB +2538605380,2538605471,FR 2538605472,2538605503,PT 2538605504,2538605903,FR 2538605904,2538605919,ES @@ -60928,7 +63103,9 @@ 2538633552,2538633567,IE 2538633568,2538634227,FR 2538634228,2538634231,DE -2538634232,2538634559,FR +2538634232,2538634331,FR +2538634332,2538634335,DE +2538634336,2538634559,FR 2538634560,2538634623,GB 2538634624,2538634879,FR 2538634880,2538635007,GB @@ -60950,7 +63127,9 @@ 2538646272,2538646399,BE 2538646400,2538646783,FR 2538646784,2538647039,CZ -2538647040,2538648015,FR +2538647040,2538647823,FR +2538647824,2538647831,FI +2538647832,2538648015,FR 2538648016,2538648031,ES 2538648032,2538648591,FR 2538648592,2538648623,BE @@ -60986,14 +63165,16 @@ 2538653932,2538653935,FR 2538653936,2538653939,GB 2538653940,2538655071,FR -2538655072,2538655103,ES +2538655072,2538655103,FI 2538655104,2538656959,FR 2538656960,2538656975,ES 2538656976,2538657135,FR 2538657136,2538657139,RO 2538657140,2538657439,FR 2538657440,2538657443,ES -2538657444,2538657967,FR +2538657444,2538657855,FR +2538657856,2538657919,ES +2538657920,2538657967,FR 2538657968,2538657983,IE 2538657984,2538658327,FR 2538658328,2538658331,IE @@ -61064,42 +63245,19 @@ 2548563968,2548826111,IR 2548826112,2548829695,AT 2548829696,2548829951,NL -2548829952,2548829973,AT -2548829974,2548829974,DE -2548829975,2548830035,AT -2548830036,2548830036,DE -2548830037,2548830736,AT -2548830737,2548830737,IT -2548830738,2548830949,AT -2548830950,2548830950,IT -2548830951,2548830975,AT +2548829952,2548830207,DE +2548830208,2548830463,US +2548830464,2548830719,DE +2548830720,2548830975,IT 2548830976,2548831231,GB -2548831232,2548831297,AT -2548831298,2548831298,HK -2548831299,2548831383,AT -2548831384,2548831384,HK -2548831385,2548831404,AT -2548831405,2548831405,HK -2548831406,2548831501,AT -2548831502,2548831502,FR -2548831503,2548831505,AT -2548831506,2548831506,FR -2548831507,2548831534,AT -2548831535,2548831535,FR -2548831536,2548831735,AT -2548831736,2548831736,FR -2548831737,2548831963,AT -2548831964,2548831964,US -2548831965,2548832017,AT -2548832018,2548832018,ES -2548832019,2548832049,AT -2548832050,2548832050,ES -2548832051,2548832628,AT -2548832629,2548832629,PL -2548832630,2548832767,AT +2548831232,2548831487,HK +2548831488,2548831743,FR +2548831744,2548831999,US +2548832000,2548832255,ES +2548832256,2548832511,IS +2548832512,2548832767,PL 2548832768,2548833279,CH -2548833280,2548833535,AT -2548833536,2548833791,NL +2548833280,2548833791,NL 2548833792,2548834303,AT 2548834304,2548842495,GB 2548842496,2548848639,RU @@ -61263,7 +63421,9 @@ 2557673472,2557739007,DK 2557739008,2557870079,US 2557870080,2557935615,ID -2557935616,2558918655,US +2557935616,2558658499,US +2558658500,2558658500,PR +2558658501,2558918655,US 2558918656,2558984191,GB 2558984192,2559246335,US 2559246336,2559311871,CL @@ -61330,7 +63490,8 @@ 2572681216,2572746751,SE 2572746752,2572944127,US 2572944128,2572944383,LT -2572944384,2572947455,US +2572944384,2572945407,US +2572945408,2572947455,ID 2572947456,2572950271,PL 2572950272,2572950527,ES 2572950528,2572951551,DE @@ -61341,7 +63502,7 @@ 2572954368,2572954623,HK 2572954624,2572954879,AU 2572954880,2572955391,HK -2572955392,2572955647,BG +2572955392,2572955647,DE 2572955648,2572959743,FR 2572959744,2572960255,DE 2572960256,2572960511,SE @@ -61370,7 +63531,10 @@ 2572986112,2572986367,IE 2572986368,2572986623,PL 2572986624,2572986879,PT -2572986880,2572988415,DE +2572986880,2572987391,DE +2572987392,2572987647,NO +2572987648,2572987903,LU +2572987904,2572988415,DE 2572988416,2572989439,IT 2572989440,2572989695,GR 2572989696,2572989823,PL @@ -61467,8 +63631,7 @@ 2584744000,2584744191,ZA 2584744192,2584744447,NL 2584744448,2584744511,AU -2584744512,2584744575,ZA -2584744576,2584744703,DE +2584744512,2584744703,DE 2584744704,2584744959,US 2584744960,2584745023,AU 2584745024,2584745215,ZA @@ -61593,7 +63756,8 @@ 2584763456,2584763903,ZA 2584763904,2584763967,HK 2584763968,2584763999,DE -2584764000,2584764671,ZA +2584764000,2584764415,ZA +2584764416,2584764671,MA 2584764672,2584767231,US 2584767232,2584767487,TR 2584767488,2584768511,US @@ -61601,8 +63765,9 @@ 2584770560,2584773631,US 2584773632,2584773887,GB 2584773888,2584775423,US -2584775424,2584775679,KE -2584775680,2584779775,US +2584775424,2584775679,ZA +2584775680,2584776703,MA +2584776704,2584779775,US 2584779776,2584780031,NL 2584780032,2584780287,US 2584780288,2584780543,ES @@ -61611,7 +63776,7 @@ 2584782336,2584789759,US 2584789760,2584790015,NL 2584790016,2584790783,US -2584790784,2584791039,CN +2584790784,2584791039,HK 2584791040,2584791295,US 2584791296,2584791551,FR 2584791552,2584796159,US @@ -61715,11 +63880,7 @@ 2586957312,2586968127,US 2586968128,2586968319,FR 2586968320,2587018239,US -2587018240,2587018495,IE -2587018496,2587018671,US -2587018672,2587018687,IE -2587018688,2587019263,US -2587019264,2587020799,IE +2587018240,2587020799,IE 2587020800,2587021823,US 2587021824,2587022847,IE 2587022848,2587050239,US @@ -61762,10 +63923,10 @@ 2587481970,2587481970,LB 2587481971,2587484159,US 2587484160,2587492351,GB -2587492352,2587496447,ES -2587496448,2587498495,US -2587498496,2587498751,ES -2587498752,2587504639,US +2587492352,2587497471,ES +2587497472,2587498495,US +2587498496,2587499007,ES +2587499008,2587504639,US 2587504640,2587508735,ES 2587508736,2587525119,GB 2587525120,2587541503,US @@ -61778,7 +63939,9 @@ 2587594256,2587594751,GB 2587594752,2587596799,US 2587596800,2587598847,GB -2587598848,2587623423,US +2587598848,2587607295,US +2587607296,2587607551,DE +2587607552,2587623423,US 2587623424,2587631615,BG 2587631616,2587631871,US 2587631872,2587632127,ES @@ -61786,11 +63949,13 @@ 2587639808,2587640063,GB 2587640064,2587648511,US 2587648512,2587649023,ES -2587649024,2587674623,US +2587649024,2587650815,US +2587650816,2587651071,ES +2587651072,2587674623,US 2587674624,2587676671,IT -2587676672,2587681279,US -2587681280,2587682815,ES -2587682816,2587697151,US +2587676672,2587680767,US +2587680768,2587683839,ES +2587683840,2587697151,US 2587697152,2587697407,GB 2587697408,2587698175,US 2587698176,2587699199,GB @@ -61801,10 +63966,8 @@ 2587714560,2587926527,US 2587926528,2587930623,BG 2587930624,2587938815,US -2587938816,2587939839,PR -2587939840,2587940607,US -2587940608,2587940863,PR -2587940864,2587951103,US +2587938816,2587942911,PR +2587942912,2587951103,US 2587951104,2587952127,ZA 2587952128,2587953151,NG 2587953152,2587954175,MU @@ -61983,7 +64146,7 @@ 2591555584,2591571967,GH 2591571968,2591588351,NG 2591588352,2591604735,MG -2591604736,2591605759,MU +2591604736,2591605759,ZA 2591605760,2591606783,KE 2591606784,2591610879,MU 2591610880,2591612927,ZM @@ -61994,9 +64157,7 @@ 2591948800,2591981567,MG 2591981568,2591997951,CM 2591997952,2592006143,ZA -2592006144,2592007167,TZ -2592007168,2592009215,ZA -2592009216,2592022527,TZ +2592006144,2592022527,TZ 2592022528,2592026623,BJ 2592026624,2592026879,US 2592026880,2592027391,ZA @@ -62017,12 +64178,15 @@ 2592043008,2592047103,ZA 2592047104,2592079871,AO 2592079872,2593128447,EG +2593128448,2593652735,MA 2593652736,2594177023,KE -2596274176,2596339711,SC -2596339712,2597322751,ZA +2594177024,2595225599,GH +2595225600,2596274175,EG +2596274176,2597322751,ZA 2597322752,2598371327,US 2598371328,2598895615,UG 2598895616,2599157759,CI +2599157760,2599419903,EG 2599419904,2600468479,DZ 2600468480,2600534015,ZM 2600534016,2600665087,US @@ -62293,7 +64457,9 @@ 2618028544,2618029055,GB 2618029056,2618032127,CA 2618032128,2618097663,US -2618097664,2618163199,NZ +2618097664,2618115583,NZ +2618115584,2618116095,SG +2618116096,2618163199,NZ 2618163200,2618228735,IT 2618228736,2618294271,US 2618359808,2618425343,PL @@ -62312,6 +64478,7 @@ 2619539456,2619604991,ES 2619604992,2619735295,US 2619735552,2619736063,US +2619768832,2619801599,ZA 2619801600,2620063743,US 2620063744,2620129279,GB 2620129280,2620194815,CA @@ -62537,13 +64704,12 @@ 2627141632,2627354706,US 2627354707,2627354707,HK 2627354708,2627403775,US +2627403776,2627469311,ZA 2627469312,2627731455,TZ 2627731456,2631925759,EG 2631925760,2632450047,ZA 2632450048,2632974335,US -2632974336,2633236479,ZA -2633236480,2633302015,SC -2633302016,2634022911,ZA +2632974336,2634022911,ZA 2634022912,2634088447,CN 2634088448,2635202559,JP 2635202560,2635268095,CN @@ -62571,12 +64737,11 @@ 2637629024,2637629311,IE 2637629312,2637629375,US 2637629376,2637629439,IE -2637629440,2637629503,US -2637629504,2637629567,NL +2637629440,2637629567,NL 2637629568,2637629583,US 2637629584,2637629599,NL 2637629600,2637629631,IE -2637629632,2637629663,US +2637629632,2637629663,NL 2637629664,2637629807,IE 2637629808,2637629823,US 2637629824,2637629951,IE @@ -62584,7 +64749,9 @@ 2637630112,2637630119,IE 2637630120,2637630127,US 2637630128,2637630143,IE -2637630144,2637630479,US +2637630144,2637630207,US +2637630208,2637630335,NL +2637630336,2637630479,US 2637630480,2637630495,IE 2637630496,2637630655,US 2637630656,2637630783,IE @@ -62602,9 +64769,7 @@ 2637638672,2637638815,IE 2637638816,2637638879,US 2637638880,2637638911,IE -2637638912,2637639167,US -2637639168,2637639199,IE -2637639200,2637639359,US +2637638912,2637639359,US 2637639360,2637639423,IE 2637639424,2637639551,US 2637639552,2637639679,IE @@ -62634,13 +64799,13 @@ 2637686512,2637686527,IE 2637686528,2637686655,US 2637686656,2637686783,IE -2637686784,2637686847,US -2637686848,2637686975,IE +2637686784,2637686855,US +2637686856,2637686975,IE 2637686976,2637687215,US 2637687216,2637687615,IE 2637687616,2637687679,US -2637687680,2637688447,IE -2637688448,2637688479,US +2637687680,2637688319,IE +2637688320,2637688479,US 2637688480,2637688831,IE 2637688832,2637722143,US 2637722144,2637722175,IE @@ -62657,17 +64822,19 @@ 2637746176,2637746183,FI 2637746184,2637746191,IE 2637746192,2637746199,NL -2637746200,2637746223,US +2637746200,2637746207,FI +2637746208,2637746215,IE +2637746216,2637746223,US 2637746224,2637746231,AT -2637746232,2637746687,US +2637746232,2637746247,US +2637746248,2637746255,FI +2637746256,2637746687,US 2637746688,2637746695,KR 2637746696,2637746743,US 2637746744,2637746751,HK 2637746752,2637746759,SG -2637746760,2637756687,US -2637756688,2637756703,NL -2637756704,2637757423,US -2637757424,2637757439,NL +2637746760,2637756415,US +2637756416,2637757439,NL 2637757440,2637758463,IE 2637758464,2637997055,US 2637997056,2637997311,AU @@ -62704,9 +64871,10 @@ 2640408576,2640410623,NL 2640410624,2640411135,US 2640411136,2640411391,MX -2640411392,2640411647,NL -2640411648,2640412671,US -2640412672,2640423935,NL +2640411392,2640412671,US +2640412672,2640417023,NL +2640417024,2640417279,CA +2640417280,2640423935,NL 2640423936,2640429055,ES 2640429056,2640445439,NL 2640445440,2640510975,US @@ -62919,7 +65087,9 @@ 2650603520,2650669055,CO 2650669056,2650734591,US 2650734592,2650800127,CN -2650800128,2652528639,US +2650800128,2652512255,US +2652512256,2652520447,CA +2652520448,2652528639,US 2652528640,2652528895,AR 2652528896,2652537607,US 2652537616,2652541183,US @@ -63106,7 +65276,8 @@ 2666070016,2666135551,SE 2666135552,2666201087,GB 2666201088,2667053055,US -2667053056,2667118591,NO +2667053056,2667085823,NO +2667085824,2667118591,DK 2667118592,2667184127,HU 2667184128,2667249663,RU 2667249664,2667315199,CL @@ -63124,7 +65295,9 @@ 2667534336,2667536383,PL 2667536384,2667536575,AT 2667536576,2667536583,FR -2667536584,2667537087,AT +2667536584,2667536615,AT +2667536616,2667536623,FR +2667536624,2667537087,AT 2667537088,2667537119,FR 2667537120,2667537151,AT 2667537152,2667537215,FR @@ -63150,17 +65323,15 @@ 2667565431,2667566335,AT 2667566336,2667566591,US 2667566592,2667566847,DE -2667566848,2667566925,AT -2667566926,2667566926,FR -2667566927,2667567103,AT +2667566848,2667567103,FR 2667567104,2667569151,SE 2667569152,2667571199,GB 2667571200,2667573247,ES 2667573248,2667575295,IT 2667575296,2667577343,SK 2667577344,2667642879,SA -2667642880,2667708415,US -2667708416,2667773951,CA +2667642880,2667712511,US +2667712512,2667773951,CA 2667773952,2667970559,US 2667970560,2668036095,CA 2668036096,2668101631,SE @@ -63285,10 +65456,12 @@ 2675245056,2675255295,NZ 2675255296,2675257343,PH 2675257344,2675261439,US -2675261440,2675269631,NZ +2675261440,2675269631,TW 2675269632,2675271679,PH 2675271680,2675279871,NZ -2675279872,2675281919,MY +2675279872,2675280383,MY +2675280384,2675280895,TH +2675280896,2675281919,ID 2675281920,2675286015,NZ 2675286016,2675294207,US 2675294208,2675296255,NL @@ -63301,14 +65474,16 @@ 2675574240,2675574271,IT 2675574272,2675574895,US 2675574896,2675574903,NL -2675574904,2675576703,US +2675574904,2675575951,US +2675575952,2675575953,SA +2675575954,2675576703,US 2675576704,2675576711,JO 2675576712,2675589119,US 2675589120,2675605503,DE 2675605504,2675605791,US -2675605792,2675605799,CZ +2675605792,2675605799,IT 2675605800,2675605807,US -2675605808,2675605811,CZ +2675605808,2675605811,IT 2675605812,2675605951,US 2675605952,2675605961,CZ 2675605962,2675605962,DE @@ -63317,9 +65492,13 @@ 2675605965,2675605967,CZ 2675605968,2675606271,US 2675606272,2675606527,IT -2675606528,2675606975,US +2675606528,2675606571,US +2675606572,2675606575,IT +2675606576,2675606975,US 2675606976,2675607039,IT -2675607040,2675608751,US +2675607040,2675608735,US +2675608736,2675608739,IT +2675608740,2675608751,US 2675608752,2675608767,HK 2675608768,2675608983,US 2675608984,2675608991,AU @@ -63339,9 +65518,9 @@ 2675613464,2675613471,IL 2675613472,2675613599,US 2675613600,2675613631,JP -2675613632,2675614687,US -2675614688,2675614719,NL -2675614720,2675624399,US +2675613632,2675614975,US +2675614976,2675614991,NL +2675614992,2675624399,US 2675624400,2675624415,CN 2675624416,2675626239,US 2675626240,2675626271,GB @@ -63380,9 +65559,13 @@ 2677622784,2677623039,IE 2677623040,2677635071,US 2677635072,2677636095,CN -2677636096,2677642239,US +2677636096,2677639167,US +2677639168,2677639679,CA +2677639680,2677641215,US +2677641216,2677641471,CA +2677641472,2677642239,US 2677642240,2677642495,ES -2677642496,2677642751,US +2677642496,2677642751,CA 2677642752,2677643007,SE 2677643008,2677644347,US 2677644348,2677644348,GB @@ -63636,6 +65819,9 @@ 2684344320,2684346367,NL 2684346368,2684354559,FI 2684354560,2684387327,MU +2684387328,2684403711,SN +2684403712,2684411903,ZA +2684411904,2684420095,BJ 2684420096,2684616703,US 2684616704,2684682239,NZ 2684682240,2684747775,GB @@ -63645,18 +65831,42 @@ 2684944384,2685009919,GB 2685009920,2685075455,US 2685075456,2685599743,JP -2685599744,2685607935,US -2685612032,2685613055,MO +2685599744,2685603839,US +2685604864,2685605887,PK +2685605888,2685607935,US +2685608960,2685609983,ZA +2685611008,2685612031,BR +2685612032,2685613055,CN 2685613056,2685614079,TW +2685616128,2685617151,ID +2685626368,2685627391,US 2685628416,2685632511,ZA +2685640704,2685641727,US +2685642752,2685644799,BR +2685649920,2685650943,ZA 2685652992,2685656063,CN 2685656064,2685657087,IN +2685657088,2685658111,ID +2685661184,2685665279,BR 2685665280,2685668351,IN 2685668352,2685669375,SG +2685670400,2685671423,BR +2685673472,2685674495,BR 2685675520,2685676543,PH 2685676544,2685677567,JP 2685677568,2685678591,CN 2685678592,2685681663,HK +2685681664,2685683711,BR +2685683712,2685684735,BD +2685685760,2685689855,BR +2685706240,2685707263,BR +2685707264,2685708287,EC +2685708288,2685709311,BR +2685709312,2685710335,CL +2685710336,2685712383,BR +2685713408,2685714431,CL +2685714432,2685718527,BR +2685718528,2685719551,US 2685724672,2685726719,CA 2685730816,2685796351,JP 2685861888,2686320639,JP @@ -63675,7 +65885,8 @@ 2688221184,2688286719,CH 2688286720,2688352255,DE 2688352256,2688418825,CH -2688418827,2688420351,CH +2688418827,2688420095,CH +2688420096,2688420351,US 2688420352,2688420607,CN 2688420608,2688420863,CH 2688420864,2688421119,AU @@ -63691,6 +65902,7 @@ 2689204224,2689269759,JP 2689269760,2689335295,TR 2689335296,2689400831,US +2689400832,2689466367,MA 2689466368,2689531903,IT 2689531904,2689535999,US 2689536000,2689536511,GB @@ -63728,7 +65940,9 @@ 2689835520,2689835775,AU 2689835776,2689925119,US 2689925120,2689990655,CH -2689990656,2690383871,US +2689990656,2690187263,US +2690187264,2690318335,MA +2690318336,2690383871,US 2690383872,2690449407,FR 2690449408,2690646015,US 2690646016,2690711551,SG @@ -63739,10 +65953,26 @@ 2690973696,2691104767,US 2691104768,2691170303,FR 2691170304,2691235839,GB +2691235840,2691301375,MA 2691301376,2691366911,CA 2691366912,2691760127,US 2691825664,2691891199,HU -2691891200,2692218879,ZA +2691891200,2691956735,SA +2691956736,2692153343,ZA +2692169728,2692173823,SC +2692173824,2692175871,ZA +2692177920,2692178943,ZA +2692180992,2692182015,GH +2692182016,2692184063,MZ +2692184064,2692185087,ZA +2692185088,2692186111,NG +2692194304,2692202495,GA +2692205568,2692206591,GH +2692206592,2692207615,SZ +2692209664,2692214783,ZA +2692214784,2692215807,AO +2692215808,2692216319,KE +2692216832,2692218879,ZA 2692218880,2692284415,CI 2692284416,2692546559,ZA 2692546560,2694316031,US @@ -63810,13 +66040,19 @@ 2699362304,2699624447,US 2699624448,2699689983,JP 2699755520,2699821055,JP -2699886592,2699968511,JP +2699886592,2699955199,JP +2699955200,2699956223,TH +2699956224,2699957247,BD +2699957248,2699957503,JP +2699959808,2699960063,JP +2699960320,2699968511,JP 2699968512,2699969535,CN 2699969536,2699972607,IN 2699972608,2699973631,NZ 2699973632,2699974655,HK 2699974656,2699976703,IN 2699977728,2699977983,JP +2699978752,2699980799,BR 2700017664,2700214271,JP 2700214272,2700247039,NA 2700247040,2700263423,UG @@ -63824,19 +66060,11 @@ 2700279808,2700935167,JP 2700935168,2701066239,US 2701066240,2701131775,BG -2701131776,2701131807,HN -2701131808,2701131823,CA -2701131824,2701132159,HN -2701132160,2701132175,CR -2701132176,2701132543,HN -2701132544,2701132559,CR -2701132560,2701134447,HN -2701134448,2701134463,US -2701134464,2701136047,HN -2701136048,2701136055,US -2701136056,2701139135,HN -2701139136,2701139151,UY -2701139152,2701139967,HN +2701131776,2701132391,HN +2701132392,2701132399,CR +2701132400,2701137903,HN +2701137904,2701137911,BR +2701137912,2701139967,HN 2701139968,2701148159,NI 2701148160,2701149183,AR 2701149184,2701150207,HN @@ -63874,8 +66102,7 @@ 2702573568,2702581759,AR 2702581760,2702583807,VE 2702583808,2702585855,MX -2702585856,2702586367,PA -2702586368,2702587903,CW +2702585856,2702587903,CW 2702587904,2702589951,BR 2702589952,2702606335,GF 2702606336,2702639103,BO @@ -63903,7 +66130,11 @@ 2704277504,2704343039,FR 2704343040,2704408575,US 2704408576,2704474111,AU -2704474112,2704478207,US +2704474112,2704476159,US +2704476160,2704476415,GB +2704476416,2704476927,US +2704476928,2704477183,GB +2704477184,2704478207,US 2704478208,2704478463,SG 2704478464,2704485119,US 2704485120,2704485375,AU @@ -63964,17 +66195,120 @@ 2708865024,2708930559,JP 2708930560,2709127167,US 2709127168,2709192703,KR -2709192704,2709225471,ZA +2709192704,2709192959,US +2709192960,2709193983,ZA +2709193984,2709194239,US +2709194240,2709194495,ZA +2709194496,2709195007,US +2709195008,2709195263,ZA +2709195264,2709196031,US +2709196032,2709198335,ZA +2709198336,2709198847,US +2709198848,2709199103,ZA +2709199104,2709199359,US +2709199360,2709200383,ZA +2709200384,2709200639,US +2709200640,2709200895,ZA +2709200896,2709201407,US +2709201408,2709202175,ZA +2709202176,2709202943,US +2709202944,2709203711,ZA +2709203712,2709203967,US +2709203968,2709204991,ZA +2709204992,2709205247,US +2709205248,2709205759,ZA +2709205760,2709206271,US +2709206272,2709207039,ZA +2709207040,2709207295,US +2709207296,2709207551,ZA +2709207552,2709207807,US +2709207808,2709208063,ZA +2709208064,2709208319,US +2709208320,2709208575,ZA +2709208576,2709208831,US +2709208832,2709209343,ZA +2709209344,2709209599,US +2709209600,2709210367,ZA +2709210368,2709211135,US +2709211136,2709211903,ZA +2709211904,2709212159,US +2709212160,2709212415,ZA +2709212416,2709212927,US +2709212928,2709213183,ZA +2709213184,2709213439,US +2709213440,2709213951,ZA +2709213952,2709214719,US +2709214720,2709214975,ZA +2709214976,2709215999,US +2709216000,2709216255,ZA +2709216256,2709216511,US +2709216512,2709216767,ZA +2709216768,2709217023,US +2709217024,2709217791,ZA +2709217792,2709218559,US +2709218560,2709219071,ZA +2709219072,2709219327,US +2709219328,2709219839,ZA +2709219840,2709220095,US +2709220096,2709221119,ZA +2709221120,2709221375,US +2709221376,2709221887,ZA +2709221888,2709222399,US +2709222400,2709222655,ZA +2709222656,2709222911,US +2709222912,2709223423,ZA +2709223424,2709224703,US +2709224704,2709224959,ZA +2709224960,2709225471,US 2709225472,2709225727,ES 2709225728,2709225983,ZA 2709225984,2709226239,ES -2709226240,2709242111,ZA +2709226240,2709226495,ZA +2709226496,2709226511,DE +2709226512,2709227775,ZA +2709227776,2709228031,US +2709228032,2709228287,ZA +2709228288,2709228543,US +2709228544,2709228767,ZA +2709228768,2709228783,DE +2709228784,2709229695,ZA +2709229696,2709229711,DE +2709229712,2709230799,ZA +2709230800,2709230815,DE +2709230816,2709230879,ZA +2709230880,2709230895,DE +2709230896,2709231103,ZA +2709231104,2709231119,DE +2709231120,2709232127,ZA +2709232128,2709232383,DE +2709232384,2709232639,ZA +2709232640,2709232895,DE +2709232896,2709233151,US +2709233152,2709233407,DE +2709233408,2709235199,ZA +2709235200,2709235455,DE +2709235456,2709235711,US +2709235712,2709235967,DE +2709235968,2709236223,US +2709236224,2709236479,DE +2709236480,2709238271,ZA +2709238272,2709238527,DE +2709238528,2709238783,ZA +2709238784,2709239039,DE +2709239040,2709240319,ZA +2709240320,2709240575,DE +2709240576,2709240831,ZA +2709240832,2709241087,DE +2709241088,2709241343,US +2709241344,2709241599,DE +2709241600,2709241855,ZA +2709241856,2709242111,DE 2709242112,2709242367,US 2709242368,2709242623,ZA 2709242624,2709242879,US -2709242880,2709243135,ZA +2709242880,2709243135,DE 2709243136,2709243391,US -2709243392,2709243647,ZA +2709243392,2709243647,DE 2709243648,2709243903,US 2709243904,2709244159,ZA 2709244160,2709244415,US @@ -63982,17 +66316,42 @@ 2709244672,2709244927,US 2709244928,2709245183,ZA 2709245184,2709245439,US -2709245440,2709245695,ZA +2709245440,2709245695,DE 2709245696,2709245951,US 2709245952,2709246207,ZA 2709246208,2709246463,US -2709246464,2709247231,ZA +2709246464,2709246735,ZA +2709246736,2709246751,HK +2709246752,2709246847,ZA +2709246848,2709246863,HK +2709246864,2709246959,ZA +2709246960,2709246975,HK +2709246976,2709247231,ZA 2709247232,2709247487,MY -2709247488,2709247743,ZA +2709247488,2709247743,DE 2709247744,2709247999,US 2709248000,2709248255,ZA 2709248256,2709248511,US -2709248512,2709258239,ZA +2709248512,2709249535,ZA +2709249536,2709249791,DE +2709249792,2709250047,ZA +2709250048,2709250303,DE +2709250304,2709251071,ZA +2709251072,2709251327,DE +2709251328,2709251839,ZA +2709251840,2709252095,GB +2709252096,2709252351,DE +2709252352,2709253375,ZA +2709253376,2709253631,US +2709253632,2709254399,ZA +2709254400,2709254655,US +2709254656,2709255935,ZA +2709255936,2709256191,US +2709256192,2709256703,ZA +2709256704,2709256959,DE +2709256960,2709257471,ZA +2709257472,2709257727,US +2709257728,2709258239,ZA 2709258240,2709389311,US 2709389312,2709454847,SG 2709454848,2709716991,US @@ -64028,9 +66387,7 @@ 2714238976,2714304511,TH 2714304512,2714370263,US 2714370264,2714370271,SG -2714370272,2714370799,US -2714370800,2714370815,PH -2714370816,2714370895,US +2714370272,2714370895,US 2714370896,2714370911,CN 2714370912,2714371679,US 2714371680,2714371711,CA @@ -64044,7 +66401,9 @@ 2714373280,2714373287,NL 2714373288,2714373743,US 2714373744,2714373759,IN -2714373760,2714376223,US +2714373760,2714375039,US +2714375040,2714375055,ID +2714375056,2714376223,US 2714376224,2714376239,JP 2714376240,2714377103,US 2714377104,2714377119,IN @@ -64054,7 +66413,11 @@ 2714378464,2714378495,HK 2714378496,2714379103,US 2714379104,2714379135,HK -2714379136,2714381951,US +2714379136,2714380031,US +2714380032,2714380287,HK +2714380288,2714381311,US +2714381312,2714381567,HK +2714381568,2714381951,US 2714381952,2714381983,HK 2714381984,2714382530,US 2714382531,2714382531,HK @@ -64066,15 +66429,15 @@ 2714403997,2714403997,JP 2714403998,2714404789,US 2714404790,2714404790,JP -2714404791,2714405071,US -2714405072,2714405087,JP -2714405088,2714405151,US +2714404791,2714405151,US 2714405152,2714405167,JP 2714405168,2714405311,US 2714405312,2714405327,CA 2714405328,2714405727,US 2714405728,2714405759,JP -2714405760,2714407113,US +2714405760,2714405829,US +2714405830,2714405831,JP +2714405832,2714407113,US 2714407114,2714407114,JP 2714407115,2714407160,US 2714407161,2714407161,JP @@ -64084,15 +66447,11 @@ 2714408704,2714408719,JP 2714408720,2714408959,US 2714408960,2714408991,JP -2714408992,2714412655,US -2714412656,2714412671,VN -2714412672,2714413343,US +2714408992,2714413343,US 2714413344,2714413359,PH 2714413360,2714417215,US 2714417216,2714417247,JP -2714417248,2714419079,US -2714419080,2714419087,MU -2714419088,2714419743,US +2714417248,2714419743,US 2714419744,2714419775,SG 2714419776,2714419871,US 2714419872,2714419903,SG @@ -64106,9 +66465,21 @@ 2714422880,2714422911,SG 2714422912,2714428767,US 2714428768,2714428783,JP -2714428784,2714433295,US +2714428784,2714429532,US +2714429533,2714429533,JP +2714429534,2714430301,US +2714430302,2714430303,JP +2714430304,2714432775,US +2714432776,2714432783,JP +2714432784,2714433295,US 2714433296,2714433311,JP -2714433312,2714697727,US +2714433312,2714433535,US +2714433536,2714433791,JP +2714433792,2714434911,US +2714434912,2714434927,JP +2714434928,2714435055,US +2714435056,2714435071,JP +2714435072,2714697727,US 2714697728,2714763263,CN 2714763264,2715025407,US 2715025408,2715090943,VE @@ -64125,15 +66496,24 @@ 2716729344,2716794879,CL 2716794880,2717253631,US 2717253632,2717319167,TH -2717319168,2717646847,US +2717319168,2717384703,US +2717450240,2717581311,US +2717581312,2717646847,RO 2717646848,2717712383,KW 2717712384,2717843455,US 2717843456,2717908991,VE 2717908992,2717974527,CA 2717974528,2718629887,US 2718629888,2718695423,GB -2718695424,2718752767,US -2718755840,2718756863,US +2718695424,2718745599,US +2718745600,2718746623,AR +2718748672,2718749695,PK +2718749696,2718750719,BD +2718750720,2718750975,US +2718750976,2718751231,BL +2718751232,2718752767,US +2718752768,2718754815,PR +2718754816,2718756863,US 2718756864,2718758911,IN 2718758912,2718760959,US 2718760960,2718826495,GB @@ -64235,8 +66615,7 @@ 2728288256,2728289279,AE 2728289280,2728290303,PL 2728290304,2728291327,US -2728291328,2728291839,NL -2728291840,2728292351,US +2728291328,2728292351,NL 2728292352,2728293375,DE 2728293376,2728294399,JP 2728294400,2728295423,US @@ -64251,8 +66630,8 @@ 2728304640,2728306687,SG 2728306688,2728308735,US 2728308736,2728309759,HK -2728309760,2728310783,SE -2728310784,2728311807,US +2728309760,2728310015,RU +2728310016,2728311807,US 2728311808,2728312831,KR 2728312832,2728313087,FR 2728313088,2728313855,US @@ -64294,27 +66673,23 @@ 2731682816,2731685887,US 2731685888,2731686911,CA 2731686912,2731688959,US -2731688960,2731689983,VG -2731689984,2731711487,US +2731688960,2731689471,VG +2731689472,2731711487,US 2731711488,2731712511,AG 2731712512,2731714559,CA 2731714560,2731717631,US 2731717632,2731718655,CA 2731718656,2731728895,US 2731728896,2731729919,CA -2731729920,2731761663,US +2731729920,2731739647,US +2731739648,2731740159,CA +2731740160,2731761663,US 2731761664,2731763711,CA 2731763712,2731765759,US 2731765760,2731767807,CA 2731767808,2731768079,US 2731768080,2731768083,CA -2731768084,2731768183,US -2731768184,2731768191,CA -2731768192,2731768383,US -2731768384,2731768391,CA -2731768392,2731769391,US -2731769392,2731769399,CA -2731769400,2731769471,US +2731768084,2731769471,US 2731769472,2731769475,CA 2731769476,2731771903,US 2731771904,2731772927,KY @@ -64349,7 +66724,8 @@ 2731843584,2731845631,PR 2731845632,2731853823,US 2731853824,2731855871,CA -2731855872,2731856895,VC +2731855872,2731856383,LC +2731856384,2731856895,VC 2731856896,2731862015,US 2731862016,2731864063,CA 2731864064,2731870207,US @@ -64373,11 +66749,17 @@ 2732107776,2732109823,US 2732110848,2732111871,US 2732111872,2732113919,CA -2732113920,2732131327,US +2732113920,2732126207,US +2732127232,2732128767,US +2732128768,2732129023,NL +2732129024,2732131327,US 2732131328,2732132351,CA -2732132352,2732189695,US +2732132352,2732145151,US +2732145664,2732146687,CA +2732146688,2732189695,US 2732189696,2732192767,CA -2732192768,2732201983,US +2732192768,2732194559,US +2732194816,2732201983,US 2732201984,2732203007,VG 2732203008,2732204031,US 2732204032,2732206079,CA @@ -64402,7 +66784,8 @@ 2732321024,2732321279,BM 2732321280,2732321535,CA 2732321536,2732321791,GB -2732321792,2732322815,CA +2732321792,2732322047,US +2732322048,2732322815,CA 2732322816,2732336127,US 2732336128,2732337151,CA 2732337152,2732349439,US @@ -64417,7 +66800,7 @@ 2732375040,2732376063,CA 2732376064,2732379135,US 2732379136,2732380159,CA -2732380160,2732389631,US +2732380160,2732389375,US 2732389888,2732390143,IT 2732390144,2732390399,US 2732390400,2732391423,CA @@ -64458,9 +66841,7 @@ 2732549120,2732550143,CA 2732550144,2732580863,US 2732580864,2732582911,CA -2732582912,2733882879,US -2733882880,2733883135,CA -2733883136,2733903871,US +2732582912,2733903871,US 2733903872,2733904895,PR 2733904896,2733907967,CA 2733907968,2733911039,US @@ -64493,7 +66874,9 @@ 2733953024,2733954047,CA 2733954048,2733958143,US 2733958144,2733959167,CA -2733959168,2733963263,US +2733959168,2733960191,US +2733960192,2733961215,CA +2733961216,2733963263,US 2733963264,2733964287,CA 2733964288,2733979647,US 2733979648,2733980671,CA @@ -64530,8 +66913,7 @@ 2734105600,2734106623,CA 2734106624,2734119935,US 2734119936,2734120959,CA -2734120960,2734123007,VG -2734123008,2734125055,US +2734120960,2734125055,US 2734125056,2734129151,CA 2734129152,2734139391,US 2734139392,2734140415,CA @@ -64555,7 +66937,10 @@ 2734206976,2734209023,CA 2734209024,2734218239,US 2734218240,2734218751,CA -2734218752,2734229503,US +2734218752,2734219263,US +2734221312,2734224415,US +2734224416,2734224431,GB +2734224432,2734229503,US 2734229504,2734230527,CA 2734230528,2734237695,US 2734237696,2734238719,CA @@ -64571,9 +66956,7 @@ 2734296064,2734297087,CA 2734297088,2734304255,US 2734304256,2734305279,CA -2734305280,2734330367,US -2734330368,2734330431,IT -2734330432,2734330623,US +2734305280,2734330623,US 2734330624,2734330879,IT 2734330880,2734335999,US 2734336000,2734338047,CA @@ -64619,10 +67002,12 @@ 2734457856,2734458879,CA 2734458880,2734467327,US 2734467328,2734467583,CA -2734467584,2734471167,US +2734467584,2734467839,US +2734467840,2734468095,GB +2734468096,2734471167,US 2734471168,2734472191,CA 2734472192,2734473215,AG -2734473216,2734477311,US +2734473216,2734479359,US 2734479360,2734481407,CA 2734481408,2734485503,US 2734485504,2734486527,CA @@ -64777,7 +67162,7 @@ 2738210816,2738214911,IN 2738214912,2738215935,HK 2738215936,2738216959,CN -2738216960,2738217983,HK +2738216960,2738217983,MY 2738217984,2738220031,AU 2738221056,2738222079,CN 2738222080,2738223103,MO @@ -64919,9 +67304,7 @@ 2756313088,2756378623,US 2756378624,2756444159,AU 2756444160,2756509695,US -2756509696,2756556543,CL -2756556544,2756557311,PE -2756557312,2756575231,CL +2756509696,2756575231,CL 2756575232,2756640767,SG 2756640768,2756706303,US 2756706304,2756771839,AU @@ -64955,7 +67338,9 @@ 2760114816,2760114847,FI 2760114848,2760115327,FR 2760115328,2760115455,GB -2760115456,2760115775,FR +2760115456,2760115711,FR +2760115712,2760115719,IE +2760115720,2760115775,FR 2760115776,2760115839,ES 2760115840,2760116207,FR 2760116208,2760116223,FI @@ -65025,9 +67410,7 @@ 2760137216,2760137471,GB 2760137472,2760137535,FR 2760137536,2760137599,ES -2760137600,2760138335,FR -2760138336,2760138367,FI -2760138368,2760143039,FR +2760137600,2760143039,FR 2760143040,2760143103,ES 2760143104,2760143615,FR 2760143616,2760143871,GB @@ -65100,9 +67483,12 @@ 2760168128,2760168191,IE 2760168192,2760168319,FR 2760168320,2760168447,GB -2760168448,2760169679,FR +2760168448,2760169471,FR +2760169472,2760169503,FI +2760169504,2760169679,FR 2760169680,2760169695,ES -2760169696,2760170047,FR +2760169696,2760169983,FR +2760169984,2760170047,ES 2760170048,2760170111,FI 2760170112,2760170815,FR 2760170816,2760170847,PT @@ -65254,6 +67640,8 @@ 2772828160,2772959231,US 2772959232,2773010431,CZ 2773010688,2773024767,CZ +2773085184,2773086207,SL +2773086208,2773090303,ZA 2773090304,2773221375,US 2773221376,2773286911,JP 2773286912,2773745663,US @@ -65318,13 +67706,11 @@ 2779971584,2780037119,US 2780037120,2780039167,ZA 2780039168,2780043263,US -2780043264,2780075007,ZA -2780075008,2780075263,US -2780075264,2780075394,ZA -2780075395,2780075395,US -2780075396,2780075449,ZA -2780075450,2780075450,US -2780075451,2780102655,ZA +2780043264,2780073471,ZA +2780073472,2780073727,AU +2780073728,2780075007,ZA +2780075008,2780075519,US +2780075520,2780102655,ZA 2780102656,2780168191,US 2780168192,2780299263,CL 2780299264,2780364799,US @@ -65413,21 +67799,23 @@ 2783008256,2783008767,IT 2783008768,2783009279,BE 2783009280,2783010815,US -2783010944,2783011071,PH +2783010944,2783011071,HK 2783011072,2783011327,US 2783011328,2783011839,AU 2783011840,2783012351,JP 2783012352,2783012607,TW 2783012608,2783012863,US 2783012864,2783013887,IN -2783013888,2783182847,US +2783013888,2783150079,US +2783150080,2783154175,DE +2783154176,2783182847,US 2783182848,2783248383,AU 2783248384,2783313919,KR 2783313920,2783379455,US 2783379456,2783380991,SC 2783380992,2783381503,NZ -2783381504,2783382527,SC -2783382528,2783383551,US +2783381504,2783383039,SC +2783383040,2783383551,US 2783383552,2783387647,CA 2783387648,2783391743,GB 2783391744,2783395839,US @@ -65550,7 +67938,9 @@ 2807237632,2807259647,US 2807260160,2807271679,US 2807271680,2807271935,AU -2807271936,2807496703,US +2807271936,2807288345,US +2807288346,2807288346,PR +2807288347,2807496703,US 2807496704,2807562239,DE 2807562240,2807566335,US 2807566336,2807574527,CA @@ -65678,9 +68068,7 @@ 2815988416,2815988863,US 2815988864,2815988895,GB 2815988896,2816159743,US -2816159744,2816159999,IN -2816160000,2816162815,US -2816162816,2816163839,IN +2816159744,2816163839,IN 2816163840,2816262143,US 2816262144,2816263167,IE 2816263168,2816264191,GB @@ -65706,9 +68094,10 @@ 2817061120,2817277951,US 2817277952,2817294335,NL 2817294336,2817325055,US -2817325312,2817933056,US -2817933057,2817933057,CA -2817933058,2817986303,US +2817325312,2817933055,US +2817933056,2817933311,CA +2817933312,2817933567,PR +2817933568,2817986303,US 2817986560,2818002943,US 2818002944,2818003722,GB 2818003724,2818004991,GB @@ -65759,9 +68148,7 @@ 2818229248,2818231295,BR 2818231296,2818232319,PE 2818232320,2818233343,AR -2818233344,2818234095,HN -2818234096,2818234111,IT -2818234112,2818234367,HN +2818233344,2818234367,HN 2818234368,2818235391,BR 2818235392,2818236415,GT 2818236416,2818244607,BR @@ -65779,20 +68166,22 @@ 2818620416,2818623487,BR 2818623488,2818625535,AR 2818625536,2818626559,BR -2818626560,2818626783,HN -2818626784,2818626799,BR -2818626800,2818627583,HN +2818626560,2818627583,HN 2818627584,2818628607,BR 2818628608,2818629631,MX 2818629632,2818634751,BR 2818634752,2818635775,CO 2818635776,2818637823,BR 2818637824,2818670591,AU -2818670592,2818687299,US +2818670592,2818671423,US +2818671424,2818671439,AU +2818671440,2818687299,US 2818687300,2818687303,JP 2818687304,2818688903,US 2818688904,2818688927,NL -2818688928,2822584319,US +2818688928,2818689479,US +2818689480,2818689487,AU +2818689488,2822584319,US 2822584320,2822586367,NL 2822586368,2822590463,US 2822590464,2822591629,IE @@ -65813,19 +68202,7 @@ 2822733824,2822734143,HK 2822734144,2822734159,US 2822734160,2822742015,HK -2822742016,2822742079,SG -2822742080,2822742111,US -2822742112,2822742175,SG -2822742176,2822742207,US -2822742208,2822742319,SG -2822742320,2822742335,US -2822742336,2822742687,SG -2822742688,2822742703,US -2822742704,2822742975,SG -2822742976,2822743007,US -2822743008,2822747391,SG -2822747392,2822747439,US -2822747440,2822750207,SG +2822742016,2822750207,SG 2822750208,2822758399,HK 2822758400,2822766591,SG 2822766592,2822848997,US @@ -65855,14 +68232,12 @@ 2824489984,2824492031,BR 2824492032,2824493055,AR 2824493056,2824494079,BR -2824494080,2824495103,VE -2824495104,2824495263,HN -2824495264,2824495279,DE -2824495280,2824496087,HN -2824496088,2824496095,NL -2824496096,2824496127,HN +2824494080,2824495103,CO +2824495104,2824496127,HN 2824496128,2824498175,BR -2824498176,2824499199,HN +2824498176,2824498527,HN +2824498528,2824498535,FR +2824498536,2824499199,HN 2824499200,2824503295,BR 2824503296,2824504319,AR 2824504320,2824510463,BR @@ -65935,7 +68310,9 @@ 2826978048,2826985471,ZA 2826985472,2826987519,NZ 2826987520,2826989567,GB -2826989568,2827026431,ZA +2826989568,2827024895,ZA +2827024896,2827025407,US +2827025408,2827026431,ZA 2827026432,2827091967,US 2827091968,2827157503,AU 2827157504,2827223039,KR @@ -65997,7 +68374,9 @@ 2830441472,2830445567,BR 2830445568,2830446591,AR 2830446592,2830447615,BR -2830447616,2830448639,HN +2830447616,2830447647,HN +2830447648,2830447655,US +2830447656,2830448639,HN 2830448640,2830452735,BR 2830452736,2830453759,AR 2830453760,2830454783,MX @@ -66016,7 +68395,10 @@ 2830482432,2830486527,BR 2830486528,2830488575,AR 2830488576,2830492671,BR -2830492672,2830493695,HN +2830492672,2830492895,HN +2830492896,2830492927,UY +2830492928,2830492935,US +2830492936,2830493695,HN 2830493696,2830499839,BR 2830499840,2830586879,US 2830587136,2830761983,US @@ -66150,7 +68532,9 @@ 2832010240,2832023551,BR 2832023552,2832024575,CR 2832024576,2832025599,BR -2832025600,2832026623,HN +2832025600,2832026015,HN +2832026016,2832026031,DE +2832026032,2832026623,HN 2832026624,2832030719,BR 2832030720,2832031743,AR 2832031744,2832032767,BO @@ -66191,7 +68575,10 @@ 2833476608,2833481727,BR 2833481728,2833482751,HN 2833482752,2833484799,BR -2833484800,2833485823,HN +2833484800,2833485311,HN +2833485312,2833485519,US +2833485520,2833485527,BE +2833485528,2833485823,US 2833485824,2833486847,AR 2833486848,2833501183,BR 2833501184,2833502207,AR @@ -66200,7 +68587,9 @@ 2833512448,2833513471,BR 2833513472,2833514495,AR 2833514496,2833525759,BR -2833525760,2833526783,HN +2833525760,2833526639,HN +2833526640,2833526655,FR +2833526656,2833526783,HN 2833526784,2833527807,CR 2833527808,2833528831,MX 2833528832,2833529855,AR @@ -66257,7 +68646,9 @@ 2834030592,2834034687,CA 2834034688,2834497535,US 2834497536,2834563071,SV -2834563072,2834825215,US +2834563072,2834690047,US +2834690048,2834694143,CA +2834694144,2834825215,US 2834825216,2834956287,KR 2834956288,2835087359,US 2835087360,2835152895,AU @@ -66288,15 +68679,15 @@ 2837970944,2838036479,US 2838036480,2838233087,CH 2838233088,2838237183,GB -2838237184,2838247551,US -2838247552,2838247583,NL -2838247584,2838255167,US +2838237184,2838255167,US 2838255168,2838255199,JP 2838255200,2838260095,US 2838260096,2838260127,IE 2838260128,2838261759,US 2838261760,2838265855,GB -2838265856,2838298623,US +2838265856,2838276159,US +2838276160,2838276191,NL +2838276192,2838298623,US 2838298624,2838298655,NL 2838298656,2838298687,US 2838298688,2838298975,NL @@ -66313,13 +68704,15 @@ 2838300672,2838300927,US 2838300928,2838301119,NL 2838301120,2838301183,US -2838301184,2838301695,NL +2838301184,2838301191,NL +2838301192,2838301199,US +2838301200,2838301695,NL 2838301696,2838301951,US -2838301952,2838304127,NL +2838301952,2838302111,NL +2838302112,2838302127,US +2838302128,2838304127,NL 2838304128,2838304159,US -2838304160,2838304223,NL -2838304224,2838304255,US -2838304256,2838304319,NL +2838304160,2838304319,NL 2838304320,2838304383,US 2838304384,2838304447,NL 2838304448,2838304511,US @@ -66329,23 +68722,27 @@ 2838305120,2838305151,US 2838305152,2838305247,NL 2838305248,2838305279,US -2838305280,2838305503,NL -2838305504,2838305535,US -2838305536,2838307055,NL +2838305280,2838305663,NL +2838305664,2838305727,US +2838305728,2838307055,NL 2838307056,2838307063,US 2838307064,2838307135,NL -2838307136,2838307167,US -2838307168,2838307199,NL -2838307200,2838307231,US -2838307232,2838307295,NL +2838307136,2838307183,US +2838307184,2838307295,NL 2838307296,2838307303,US 2838307304,2838307311,NL 2838307312,2838307327,US -2838307328,2838307903,NL -2838307904,2838307967,US -2838307968,2838315023,NL +2838307328,2838307647,NL +2838307648,2838307679,US +2838307680,2838307903,NL +2838307904,2838307999,US +2838308000,2838308191,NL +2838308192,2838308223,US +2838308224,2838315023,NL 2838315024,2838315039,US -2838315040,2838315279,NL +2838315040,2838315151,NL +2838315152,2838315167,US +2838315168,2838315279,NL 2838315280,2838315295,US 2838315296,2838315391,NL 2838315392,2838315407,US @@ -66357,9 +68754,7 @@ 2838315741,2838315741,US 2838315742,2838315799,NL 2838315800,2838315801,US -2838315802,2838315839,NL -2838315840,2838315871,US -2838315872,2838316063,NL +2838315802,2838316063,NL 2838316064,2838316079,US 2838316080,2838316591,NL 2838316592,2838316607,US @@ -66373,9 +68768,9 @@ 2838318512,2838318527,US 2838318528,2838318655,NL 2838318656,2838318687,US -2838318688,2838319135,NL -2838319136,2838319167,US -2838319168,2838320191,NL +2838318688,2838318867,NL +2838318868,2838318871,US +2838318872,2838320191,NL 2838320192,2838320192,US 2838320193,2838320543,NL 2838320544,2838320551,US @@ -66390,22 +68785,26 @@ 2838323104,2838323535,NL 2838323536,2838323551,US 2838323552,2838324039,NL -2838324040,2838324047,US -2838324048,2838324063,NL +2838324040,2838324055,US +2838324056,2838324063,NL 2838324064,2838324065,US 2838324066,2838324415,NL 2838324416,2838324423,US -2838324424,2838325343,NL +2838324424,2838324735,NL +2838324736,2838324767,US +2838324768,2838325343,NL 2838325344,2838325375,US 2838325376,2838325439,NL 2838325440,2838325471,JP 2838325472,2838325983,NL 2838325984,2838326015,US -2838326016,2838327087,NL -2838327088,2838327103,US -2838327104,2838328079,NL -2838328080,2838328095,US -2838328096,2838328159,NL +2838326016,2838326591,NL +2838326592,2838326623,US +2838326624,2838327623,NL +2838327624,2838327631,US +2838327632,2838328079,NL +2838328080,2838328111,US +2838328112,2838328159,NL 2838328160,2838328167,US 2838328168,2838328259,NL 2838328260,2838328260,US @@ -66425,17 +68824,19 @@ 2838331568,2838331583,US 2838331584,2838331655,NL 2838331656,2838331663,US -2838331664,2838331807,NL +2838331664,2838331711,NL +2838331712,2838331727,US +2838331728,2838331807,NL 2838331808,2838331839,US 2838331840,2838333903,NL 2838333904,2838333919,US 2838333920,2838334335,NL 2838334336,2838334351,US -2838334352,2838337279,NL +2838334352,2838337239,NL +2838337240,2838337247,US +2838337248,2838337279,NL 2838337280,2838337295,US -2838337296,2838337375,NL -2838337376,2838337407,US -2838337408,2838337759,NL +2838337296,2838337759,NL 2838337760,2838337761,IN 2838337762,2838337763,US 2838337764,2838338271,NL @@ -66467,15 +68868,15 @@ 2838341952,2838341967,US 2838341968,2838343071,NL 2838343072,2838343103,US -2838343104,2838343711,NL -2838343712,2838343743,US -2838343744,2838344451,NL +2838343104,2838344451,NL 2838344452,2838344455,US 2838344456,2838344457,NL 2838344458,2838344459,US 2838344460,2838344463,NL 2838344464,2838344479,US -2838344480,2838344919,NL +2838344480,2838344917,NL +2838344918,2838344918,US +2838344919,2838344919,NL 2838344920,2838344927,US 2838344928,2838345215,NL 2838345216,2838345231,US @@ -66494,8 +68895,10 @@ 2838346720,2838347031,NL 2838347032,2838347039,US 2838347040,2838347231,NL -2838347232,2838347271,US -2838347272,2838347487,NL +2838347232,2838347263,US +2838347264,2838347279,NL +2838347280,2838347295,US +2838347296,2838347487,NL 2838347488,2838347519,US 2838347520,2838348063,NL 2838348064,2838348079,US @@ -66517,11 +68920,11 @@ 2838350912,2838350927,US 2838350928,2838351295,NL 2838351296,2838351327,US -2838351328,2838351623,NL -2838351624,2838351631,US -2838351632,2838351711,NL +2838351328,2838351711,NL 2838351712,2838351743,CO -2838351744,2838352575,NL +2838351744,2838352143,NL +2838352144,2838352159,US +2838352160,2838352575,NL 2838352576,2838352583,US 2838352584,2838352591,NL 2838352592,2838352599,US @@ -66538,8 +68941,8 @@ 2838357384,2838358687,NL 2838358688,2838358719,US 2838358720,2838358975,NL -2838358976,2838359007,US -2838359008,2838360047,NL +2838358976,2838358991,US +2838358992,2838360047,NL 2838360048,2838360063,US 2838360064,2838360639,NL 2838360640,2838360735,US @@ -66575,7 +68978,9 @@ 2838400704,2838400735,US 2838400736,2838400895,NL 2838400896,2838400959,US -2838400960,2838401023,NL +2838400960,2838400991,NL +2838400992,2838401007,US +2838401008,2838401023,NL 2838401024,2838405119,GB 2838405120,2838405183,NL 2838405184,2838405215,US @@ -66587,21 +68992,25 @@ 2838406088,2838406095,US 2838406096,2838406271,NL 2838406272,2838406279,US -2838406280,2838406463,NL -2838406464,2838406495,US -2838406496,2838408143,NL -2838408144,2838408159,US -2838408160,2838408735,NL +2838406280,2838406687,NL +2838406688,2838406719,US +2838406720,2838406959,NL +2838406960,2838406967,US +2838406968,2838407103,NL +2838407104,2838407119,US +2838407120,2838408591,NL +2838408592,2838408599,US +2838408600,2838408735,NL 2838408736,2838408767,US 2838408768,2838408799,NL 2838408800,2838408831,US -2838408832,2838408863,NL -2838408864,2838408895,US -2838408896,2838409439,NL +2838408832,2838409439,NL 2838409440,2838409471,US 2838409472,2838409479,NL 2838409480,2838409503,US -2838409504,2838410191,NL +2838409504,2838409599,NL +2838409600,2838409615,US +2838409616,2838410191,NL 2838410192,2838410199,US 2838410200,2838410367,NL 2838410368,2838410399,US @@ -66609,7 +69018,14 @@ 2838410896,2838410911,US 2838410912,2838411327,NL 2838411328,2838411359,US -2838411360,2838415391,NL +2838411360,2838414207,NL +2838414208,2838414271,US +2838414272,2838414815,NL +2838414816,2838414879,US +2838414880,2838414911,JP +2838414912,2838415167,NL +2838415168,2838415183,US +2838415184,2838415391,NL 2838415392,2838415487,US 2838415488,2838415655,NL 2838415656,2838415663,US @@ -66619,9 +69035,15 @@ 2838416424,2838416431,US 2838416432,2838416479,NL 2838416480,2838416511,US -2838416512,2838418143,NL +2838416512,2838416623,NL +2838416624,2838416639,AF +2838416640,2838418143,NL 2838418144,2838418175,US -2838418176,2838429983,NL +2838418176,2838418687,NL +2838418688,2838418751,US +2838418752,2838419455,NL +2838419456,2838421503,US +2838421504,2838429983,NL 2838429984,2838430015,US 2838430016,2838431039,NL 2838431040,2838431135,US @@ -66641,19 +69063,19 @@ 2838433920,2838433951,US 2838433952,2838435519,NL 2838435520,2838435551,US -2838435552,2838436031,NL -2838436032,2838436063,US -2838436064,2838436815,NL +2838435552,2838436815,NL 2838436816,2838436831,US 2838436832,2838437359,NL 2838437360,2838437361,US -2838437362,2838437631,NL -2838437632,2838437663,US -2838437664,2838438127,NL +2838437362,2838438127,NL 2838438128,2838438135,US -2838438136,2838439935,NL +2838438136,2838438463,NL +2838438464,2838438495,US +2838438496,2838439935,NL 2838439936,2838439943,US -2838439944,2838441215,NL +2838439944,2838440111,NL +2838440112,2838440127,US +2838440128,2838441215,NL 2838441216,2838441247,US 2838441248,2838441375,NL 2838441376,2838441407,US @@ -66667,27 +69089,95 @@ 2838444096,2838444159,US 2838444160,2838444223,NL 2838444224,2838444255,US -2838444256,2838445695,NL -2838445696,2838445727,US -2838445728,2838445951,NL +2838444256,2838445951,NL 2838445952,2838445983,US -2838445984,2838478975,NL +2838445984,2838446079,NL +2838446080,2838446087,US +2838446088,2838446095,NL +2838446096,2838446111,US +2838446112,2838446143,NL +2838446144,2838446175,US +2838446176,2838446223,NL +2838446224,2838446239,US +2838446240,2838446319,NL +2838446320,2838446327,US +2838446328,2838446431,NL +2838446432,2838446439,US +2838446440,2838446559,NL +2838446560,2838446623,US +2838446624,2838446631,NL +2838446632,2838446639,US +2838446640,2838446783,NL +2838446784,2838446787,US +2838446788,2838446847,NL +2838446848,2838446911,US +2838446912,2838447127,NL +2838447128,2838447135,US +2838447136,2838447167,NL +2838447168,2838447183,US +2838447184,2838447335,NL +2838447336,2838447343,US +2838447344,2838447471,NL +2838447472,2838447487,US +2838447488,2838447759,NL +2838447760,2838447775,US +2838447776,2838448223,NL +2838448224,2838448239,US +2838448240,2838448255,NL +2838448256,2838448271,US +2838448272,2838448591,NL +2838448592,2838448607,US +2838448608,2838448799,NL +2838448800,2838448815,US +2838448816,2838448895,NL +2838448896,2838448959,US +2838448960,2838449375,NL +2838449376,2838449391,US +2838449392,2838449535,NL +2838449536,2838449663,US +2838449664,2838461535,NL +2838461536,2838461567,US +2838461568,2838461823,NL +2838461824,2838461855,US +2838461856,2838461951,NL +2838461952,2838461983,US +2838461984,2838462111,NL +2838462112,2838462119,US +2838462120,2838463583,NL +2838463584,2838463615,US +2838463616,2838465599,NL +2838465600,2838465615,US +2838465616,2838465663,NL +2838465664,2838465671,US +2838465672,2838465711,NL +2838465712,2838465727,US +2838465728,2838466063,NL +2838466064,2838466079,US +2838466080,2838466607,NL +2838466608,2838466623,US +2838466624,2838466687,NL +2838466688,2838466719,US +2838466720,2838466959,NL +2838466960,2838466975,US +2838466976,2838478975,NL 2838478976,2838479007,US -2838479008,2838479455,NL +2838479008,2838479207,NL +2838479208,2838479215,US +2838479216,2838479431,NL +2838479432,2838479439,US +2838479440,2838479455,NL 2838479456,2838479487,US 2838479488,2838480127,NL 2838480128,2838480159,US -2838480160,2838480223,NL -2838480224,2838480255,US -2838480256,2838480319,NL +2838480160,2838480319,NL 2838480320,2838480323,IE 2838480324,2838480335,NL 2838480336,2838480351,US -2838480352,2838481807,NL -2838481808,2838481823,US -2838481824,2838481855,NL +2838480352,2838481855,NL 2838481856,2838481887,US -2838481888,2838482959,NL +2838481888,2838482695,NL +2838482696,2838482703,US +2838482704,2838482959,NL 2838482960,2838482967,IE 2838482968,2838482975,US 2838482976,2838482991,NL @@ -66702,7 +69192,79 @@ 2838483328,2838483335,US 2838483336,2838483487,NL 2838483488,2838483519,US -2838483520,2838560767,NL +2838483520,2838484839,NL +2838484840,2838484843,US +2838484844,2838485151,NL +2838485152,2838485183,US +2838485184,2838485375,NL +2838485376,2838485407,US +2838485408,2838485695,NL +2838485696,2838485727,US +2838485728,2838486463,NL +2838486464,2838486495,US +2838486496,2838487647,NL +2838487648,2838487679,US +2838487680,2838487743,NL +2838487744,2838487807,US +2838487808,2838488663,NL +2838488664,2838488671,US +2838488672,2838491943,NL +2838491944,2838491951,US +2838491952,2838492479,NL +2838492480,2838492511,US +2838492512,2838492679,NL +2838492680,2838492687,US +2838492688,2838492959,NL +2838492960,2838492967,US +2838492968,2838493711,NL +2838493712,2838493727,US +2838493728,2838494655,NL +2838494656,2838494671,US +2838494672,2838496127,NL +2838496128,2838496159,US +2838496160,2838511887,NL +2838511888,2838511903,BR +2838511904,2838511935,NL +2838511936,2838511951,JP +2838511952,2838511983,NL +2838511984,2838511999,JP +2838512000,2838512047,NL +2838512048,2838512079,US +2838512080,2838512255,NL +2838512256,2838512271,US +2838512272,2838512303,NL +2838512304,2838512319,US +2838512320,2838512351,NL +2838512352,2838512367,AF +2838512368,2838512519,NL +2838512520,2838512543,US +2838512544,2838512655,NL +2838512656,2838512671,US +2838512672,2838512879,NL +2838512880,2838512895,US +2838512896,2838526983,NL +2838526984,2838527039,US +2838527040,2838527055,NL +2838527056,2838527071,US +2838527072,2838527223,NL +2838527224,2838527231,US +2838527232,2838527279,NL +2838527280,2838527295,US +2838527296,2838527439,NL +2838527440,2838527455,US +2838527456,2838527535,NL +2838527536,2838527567,US +2838527568,2838527695,NL +2838527696,2838527711,US +2838527712,2838528255,NL +2838528256,2838528271,US +2838528272,2838528431,NL +2838528432,2838528447,US +2838528448,2838529167,NL +2838529168,2838529183,US +2838529184,2838530095,NL +2838530096,2838530111,US +2838530112,2838560767,NL 2838560768,2838626303,CH 2838626304,2838626399,US 2838626400,2838626431,SA @@ -66710,9 +69272,7 @@ 2838626576,2838626591,CN 2838626592,2838628319,US 2838628320,2838628351,DE -2838628352,2838629331,US -2838629332,2838629333,SA -2838629334,2838631367,US +2838628352,2838631367,US 2838631368,2838631375,SA 2838631376,2838631871,US 2838631872,2838631903,DE @@ -66723,7 +69283,9 @@ 2838632096,2838632127,DE 2838632128,2838633295,US 2838633296,2838633311,SA -2838633312,2838642719,US +2838633312,2838641263,US +2838641264,2838641279,NL +2838641280,2838642719,US 2838642720,2838642723,AE 2838642724,2838643407,US 2838643408,2838643408,GB @@ -66747,13 +69309,17 @@ 2838650528,2838650559,GB 2838650560,2838653631,US 2838653632,2838653639,GB -2838653640,2838657295,US +2838653640,2838653646,US +2838653647,2838653647,GB +2838653648,2838657295,US 2838657296,2838657299,AE 2838657300,2838658607,US 2838658608,2838658623,NL 2838658624,2838659007,US 2838659008,2838659023,GB -2838659024,2838663167,US +2838659024,2838659431,US +2838659432,2838659439,GB +2838659440,2838663167,US 2838663168,2838663175,NL 2838663176,2838663807,US 2838663808,2838663809,BO @@ -66761,15 +69327,17 @@ 2838664080,2838664095,BO 2838664096,2838664167,US 2838664168,2838664175,VN -2838664176,2838664727,US -2838664728,2838664735,ZA -2838664736,2838665759,US +2838664176,2838665759,US 2838665760,2838665791,JP 2838665792,2838669519,US 2838669520,2838669535,NL 2838669536,2838670623,US 2838670624,2838670655,NL -2838670656,2838708223,US +2838670656,2838678319,US +2838678320,2838678327,GB +2838678328,2838680639,US +2838680640,2838680655,GB +2838680656,2838708223,US 2838708224,2838724607,NO 2838724608,2838757375,US 2838757376,2838822911,CH @@ -66780,9 +69348,9 @@ 2838843328,2838859777,US 2838859778,2838859779,HK 2838859780,2838865007,US -2838865008,2838865015,CZ +2838865008,2838865015,CA 2838865016,2838865019,US -2838865020,2838865023,CZ +2838865020,2838865023,CA 2838865024,2838866247,US 2838866248,2838866255,CA 2838866256,2838867855,US @@ -66815,35 +69383,39 @@ 2838931014,2838931015,CZ 2838931016,2838931016,US 2838931017,2838931023,CZ -2838931024,2838931667,US -2838931668,2838931671,CZ -2838931672,2838933919,US +2838931024,2838931647,US +2838931648,2838931663,NO +2838931664,2838933919,US 2838933920,2838933951,NL 2838933952,2838938991,US 2838938992,2838939007,AU 2838939008,2838946735,US 2838946736,2838946751,CA -2838946752,2838957535,US +2838946752,2838950703,US +2838950704,2838950719,NL +2838950720,2838957535,US 2838957536,2838957551,HK -2838957552,2838958991,US -2838958992,2838958999,CZ -2838959000,2838960815,US +2838957552,2838960815,US 2838960816,2838960819,CZ 2838960820,2838960821,US 2838960822,2838960827,CZ 2838960828,2838960829,US 2838960830,2838960831,CZ -2838960832,2838961023,US -2838961024,2838961031,CZ -2838961032,2838968671,US +2838960832,2838968671,US 2838968672,2838968687,CN 2838968688,2838969167,US 2838969168,2838969183,AF -2838969184,2838969535,US +2838969184,2838969456,US +2838969457,2838969457,HK +2838969458,2838969535,US 2838969536,2838969536,IL 2838969537,2838969587,US 2838969588,2838969588,AF -2838969589,2838969737,US +2838969589,2838969591,US +2838969592,2838969592,HK +2838969593,2838969710,US +2838969711,2838969711,HK +2838969712,2838969737,US 2838969738,2838969738,ES 2838969739,2838969828,US 2838969829,2838969829,NL @@ -66855,7 +69427,9 @@ 2838989672,2838989679,CA 2838989680,2838990719,US 2838990720,2838990751,CA -2838990752,2838995823,US +2838990752,2838994239,US +2838994240,2838994255,NO +2838994256,2838995823,US 2838995824,2838995839,NL 2838995840,2838996063,US 2838996064,2838996095,HK @@ -66865,14 +69439,28 @@ 2838999408,2838999423,AF 2838999424,2839001263,US 2839001264,2839001279,CA -2839001280,2839010815,US -2839010816,2839010847,NL -2839010848,2839035903,US +2839001280,2839019687,US +2839019688,2839019695,JP +2839019696,2839035903,US 2839035904,2839052287,KR -2839052288,2839085055,US +2839052288,2839055039,US +2839055040,2839055041,NL +2839055042,2839055727,US +2839055728,2839055743,NL +2839055744,2839085055,US 2839085056,2839117823,MX 2839117824,2839150591,BR -2839150592,2840015359,US +2839150592,2839313471,US +2839313472,2839313475,NL +2839313476,2839313759,US +2839313760,2839313775,NL +2839313776,2839363679,US +2839363680,2839363683,NL +2839363684,2839363685,US +2839363686,2839363687,NL +2839363688,2839379615,US +2839379616,2839379631,NL +2839379632,2840015359,US 2840015360,2840015615,GB 2840015616,2843803647,US 2843803648,2843869183,ZA @@ -66916,7 +69504,7 @@ 2851023872,2851024895,ZA 2851024896,2851025919,NG 2851025920,2851026943,GH -2851026944,2851027967,DZ +2851026944,2851027967,NG 2851027968,2851028991,ZA 2851028992,2851030015,CI 2851030016,2851031039,ZA @@ -66945,8 +69533,10 @@ 2851055616,2851057663,KE 2851057664,2851060735,ZA 2851060736,2851062783,NG -2851062784,2851063807,ZA -2851063808,2851065855,SC +2851062784,2851063807,SL +2851063808,2851064319,SC +2851064320,2851064831,NA +2851064832,2851065855,SC 2851065856,2851066879,ZA 2851066880,2851067903,CD 2851067904,2851071999,ZA @@ -66973,7 +69563,7 @@ 2852076032,2852077567,ZA 2852077568,2852078591,CD 2852078592,2852079615,TN -2852079616,2852080639,GB +2852079616,2852080639,CG 2852080640,2852081663,ZA 2852081664,2852082687,BW 2852082688,2852083711,EG @@ -66989,7 +69579,7 @@ 2852092928,2852093951,NG 2852093952,2852094975,ZA 2852094976,2852095999,MZ -2852096000,2852097023,SD +2852096000,2852097023,SS 2852097024,2852098047,NG 2852098048,2852099071,ZA 2852099072,2852100095,GA @@ -67001,7 +69591,9 @@ 2852107264,2852108287,NG 2852108288,2852109311,TZ 2852109312,2852110335,CD -2852110336,2852112383,ZA +2852110336,2852111103,ZA +2852111104,2852111359,NG +2852111360,2852112383,ZA 2852112384,2852113407,KE 2852113408,2852114431,CD 2852114432,2852115455,NG @@ -67044,9 +69636,11 @@ 2855288832,2855305215,GB 2855305216,2855309311,HK 2855309312,2855469055,US -2855469056,2855484671,PY -2855484672,2855485439,AR -2855485440,2855501823,UY +2855469056,2855484415,PY +2855484416,2855484671,AR +2855484672,2855484927,PY +2855484928,2855485183,AR +2855485184,2855501823,UY 2855501824,2855534591,AR 2855534592,2855706623,US 2855706880,2856058879,US @@ -67066,7 +69660,9 @@ 2857082880,2857086975,CA 2857086976,2857140223,US 2857140224,2857140735,CA -2857140736,2857238527,US +2857140736,2857152511,US +2857152512,2857153535,HK +2857153536,2857238527,US 2857238528,2857248767,BR 2857248768,2857249791,CO 2857249792,2857250815,AR @@ -67207,7 +69803,10 @@ 2857574400,2857575423,AR 2857575424,2857579519,BR 2857579520,2857580543,AR -2857580544,2857585663,BR +2857580544,2857581055,BR +2857581056,2857581311,AR +2857581312,2857581567,CO +2857581568,2857585663,BR 2857585664,2857586687,VE 2857586688,2857593855,BR 2857593856,2857594879,AR @@ -67439,8 +70038,12 @@ 2867851264,2867852287,BR 2867852288,2867853311,AR 2867853312,2867855359,BR -2867855360,2868117503,US -2868117504,2868127743,BR +2867855360,2868057087,US +2868057088,2868058111,BR +2868058112,2868117503,US +2868117504,2868122623,BR +2868122624,2868123647,GB +2868123648,2868127743,BR 2868127744,2868128767,HN 2868128768,2868129791,BR 2868129792,2868130815,AR @@ -67470,7 +70073,10 @@ 2868178944,2868179967,HN 2868179968,2868183039,BR 2868183040,2868184063,CW -2868184064,2868193279,BR +2868184064,2868191743,BR +2868191744,2868191999,VE +2868192000,2868192255,BO +2868192256,2868193279,BR 2868193280,2868194303,HN 2868194304,2868195327,BR 2868195328,2868196351,CL @@ -67478,7 +70084,7 @@ 2868197376,2868198399,HN 2868198400,2868205567,BR 2868205568,2868206591,MX -2868206592,2868223999,BR +2868206592,2868225023,BR 2868225024,2868226047,DO 2868226048,2868227071,AR 2868227072,2868230143,BR @@ -67489,27 +70095,74 @@ 2868242432,2868243455,AR 2868243456,2868244479,BR 2868244480,2868245503,CR -2868245504,2868247551,BR -2868248576,2868253695,BR +2868245504,2868253695,BR 2868253696,2868254719,AR 2868254720,2868257791,BR 2868257792,2868259839,AR +2868259840,2868260863,BR 2868260864,2868261887,AR -2868261888,2868262911,HN +2868261888,2868263935,HN 2868263936,2868264959,BR +2868264960,2868265983,CL 2868265984,2868268031,BR +2868268032,2868268287,AR +2868268288,2868268543,VE 2868268544,2868268799,AR +2868268800,2868269055,VE 2868269056,2868270079,BR +2868270080,2868271103,EC 2868271104,2868272127,AR 2868272128,2868273151,VE -2868273152,2868277247,BR +2868273152,2868274175,BR +2868274176,2868275199,CR +2868275200,2868277247,BR 2868277248,2868278271,CO -2868281344,2868283391,BR -2868294656,2868295679,AR -2868295680,2868305919,BR -2868307968,2868310015,BR +2868278272,2868286463,BR +2868286464,2868287487,CR +2868287488,2868288511,NI +2868288512,2868289535,CR +2868289536,2868290559,TT +2868290560,2868292607,BR +2868292608,2868293631,CL +2868293632,2868295679,AR +2868295680,2868304895,BR +2868304896,2868305919,PA +2868305920,2868311039,BR 2868311040,2868312063,AR 2868312064,2868314111,BR +2868314112,2868315135,CO +2868315136,2868328447,BR +2868328448,2868329471,AR +2868329472,2868333567,BR +2868333568,2868334591,AR +2868334592,2868335615,BR +2868335616,2868336639,HN +2868336640,2868337663,AR +2868337664,2868338687,CL +2868338688,2868339711,AR +2868339712,2868344831,BR +2868344832,2868345855,AR +2868345856,2868346879,BR +2868346880,2868348927,MX +2868348928,2868349951,CL +2868349952,2868350975,AR +2868350976,2868353023,BR +2868353024,2868354047,PA +2868354048,2868355071,BR +2868355072,2868356095,BO +2868356096,2868357119,CL +2868357120,2868358143,UY +2868358144,2868360191,MX +2868360192,2868361215,BR +2868361216,2868363263,MX +2868363264,2868366335,BR +2868366336,2868367359,CL +2868367360,2868368383,BR +2868368384,2868369407,VE +2868369408,2868370431,CL +2868370432,2868371455,BZ +2868371456,2868373503,MX +2868373504,2868379647,BR 2868379648,2868380159,IN 2868380160,2868380671,BR 2868380672,2868380927,US @@ -67563,7 +70216,8 @@ 2868578816,2868579327,IN 2868579328,2868581375,US 2868581376,2868581887,IN -2868581888,2868586495,US +2868581888,2868584447,US +2868584448,2868586495,GB 2868586496,2868588543,IN 2868588544,2868591615,US 2868591616,2868592639,IN @@ -67572,16 +70226,17 @@ 2868599808,2868604415,US 2868604416,2868604927,IN 2868604928,2868628639,US -2868628672,2868658175,US +2868628672,2868632575,US +2868632576,2868633087,BR +2868633088,2868658175,US 2868658176,2868659199,GB 2868659200,2868660223,US 2868660480,2868662271,US 2868662528,2868673023,US 2868673024,2868673279,FR 2868673280,2868673535,ZA -2868673536,2868674336,US -2868674337,2868674337,SE -2868674338,2868674559,US +2868673536,2868674303,US +2868674304,2868674559,SE 2868674560,2868682751,AU 2868682752,2868682752,US 2868682754,2868688895,US @@ -67611,7 +70266,9 @@ 2868814848,2868815871,AR 2868815872,2868816895,BR 2868816896,2868817919,VE -2868817920,2868818943,HN +2868817920,2868818887,HN +2868818888,2868818895,IT +2868818896,2868818943,HN 2868818944,2868825087,BR 2868825088,2868826111,AR 2868826112,2868828159,BR @@ -67734,14 +70391,29 @@ 2890162176,2890163199,PA 2890163200,2890164223,PT 2890164224,2890165247,TH -2890165248,2890168319,AU +2890165248,2890166271,DE +2890166272,2890168319,AU 2890168320,2890169343,CW -2890169344,2890170367,AU -2890170368,2890172415,US +2890169344,2890170367,AM +2890170368,2890171391,DJ +2890171392,2890172415,US 2890172416,2890173439,PL 2890173440,2890174463,US -2890174464,2890174719,SG -2890174720,2890956799,US +2890174464,2890175231,SG +2890175232,2890176511,US +2890176512,2890177535,RS +2890177536,2890182655,US +2890182656,2890183679,EC +2890183680,2890184703,SE +2890184704,2890185727,ZA +2890185728,2890187775,US +2890187776,2890188799,IT +2890188800,2890189823,LK +2890189824,2890191871,US +2890191872,2890192895,CZ +2890192896,2890194943,US +2890194944,2890195967,HU +2890195968,2890956799,US 2890956800,2890989567,AE 2890989568,2891017215,US 2891017216,2891017471,JP @@ -67754,7 +70426,11 @@ 2891059200,2891120639,US 2891251712,2891272191,US 2891272192,2891274239,CA -2891274240,2891282431,US +2891274240,2891277823,US +2891277824,2891278079,GB +2891278080,2891279103,US +2891279104,2891279359,GB +2891279360,2891282431,US 2891282432,2891283455,PR 2891283456,2891284479,CA 2891284480,2891364351,US @@ -67763,7 +70439,11 @@ 2891378688,2891380735,CA 2891380736,2891403263,US 2891403264,2891407359,CA -2891407360,2891796479,US +2891407360,2891780095,US +2891780096,2891786239,CA +2891786240,2891790335,US +2891790336,2891791359,CA +2891791360,2891796479,US 2891796480,2891800575,CA 2891800576,2891807231,US 2891807232,2891807487,GB @@ -67774,31 +70454,45 @@ 2891841792,2891842303,US 2891842304,2891843327,GB 2891843328,2891844095,US -2891844096,2891844351,FR +2891844096,2891844351,CL 2891844352,2891845119,US 2891845120,2891845631,DE 2891845632,2891845887,US 2891845888,2891846399,DE -2891846400,2891846655,CH +2891846400,2891846655,NL 2891846656,2891846911,US 2891846912,2891847167,NL 2891847168,2891848447,US -2891848448,2891848959,JP +2891848448,2891848703,JP +2891848704,2891848959,AR 2891848960,2891849215,BN 2891849216,2891850239,US 2891850240,2891850495,TH -2891850496,2891850751,SG -2891850752,2891853567,US +2891850496,2891850751,AM +2891850752,2891851263,US +2891851264,2891851519,AM +2891851520,2891853567,US 2891853568,2891853823,SG -2891853824,2891854335,US +2891853824,2891854079,US +2891854080,2891854335,IN 2891854336,2891855615,NL 2891855616,2891856127,SE 2891856128,2891856383,LU -2891856384,2891857919,US +2891856384,2891856895,US +2891856896,2891857151,CU +2891857152,2891857919,US 2891857920,2891858175,ES 2891858176,2891858431,TR 2891858432,2891858687,CA -2891858688,2891862527,US +2891858688,2891859455,US +2891859456,2891859711,NO +2891859712,2891859967,AT +2891859968,2891860223,ES +2891860224,2891860479,NL +2891860480,2891860735,CH +2891860736,2891861247,GB +2891861248,2891861503,AU +2891861504,2891862527,US 2891862528,2891863039,KR 2891863040,2891863295,FR 2891863296,2891863551,AU @@ -67825,8 +70519,10 @@ 2891974656,2891976703,CA 2891976704,2891982847,US 2891982848,2891984895,CA -2891984896,2892021759,US -2892021760,2892038143,CA +2891984896,2892015615,US +2892015616,2892016639,PR +2892016640,2892017663,US +2892017664,2892038143,CA 2892038144,2892040191,US 2892040192,2892042239,CA 2892042240,2892050431,US @@ -67892,7 +70588,11 @@ 2892401920,2892402047,MF 2892402048,2892402175,US 2892402176,2892402303,MP -2892402304,2892420607,US +2892402304,2892414975,US +2892414976,2892415231,GB +2892415232,2892417791,US +2892417792,2892418047,GB +2892418048,2892420607,US 2892420608,2892420863,CA 2892420864,2892421631,US 2892421632,2892421887,CA @@ -67906,7 +70606,8 @@ 2892496896,2892505087,US 2892505088,2892513279,SG 2892513280,2892529663,JP -2892529664,2892906495,US +2892529664,2892537855,DE +2892537856,2892906495,US 2892906496,2892910591,CA 2892910592,2892943743,US 2892943744,2892943871,LR @@ -67939,7 +70640,8 @@ 2892989696,2892989951,VE 2892989952,2892990207,US 2892990208,2892990463,CA -2892990464,2892990975,IT +2892990464,2892990719,US +2892990720,2892990975,IT 2892990976,2892991231,GB 2892991232,2892991487,US 2892991488,2892991999,GB @@ -68039,9 +70741,7 @@ 2896301500,2896301500,DE 2896301501,2896429280,US 2896429281,2896429281,CA -2896429282,2896691455,US -2896691456,2896691711,BR -2896691712,2897018879,US +2896429282,2897018879,US 2897018880,2897149951,DE 2897149952,2897215487,US 2897215488,2897739775,DE @@ -68060,9 +70760,19 @@ 2899574784,2899902463,GB 2899902464,2899967999,US 2899968000,2900099071,CA -2900099072,2901740455,US +2900099072,2901475327,US +2901475328,2901477375,NL +2901477376,2901485567,US +2901485568,2901489663,NL +2901489664,2901491711,US +2901491712,2901493759,NL +2901493760,2901496831,US +2901496832,2901497855,NL +2901497856,2901740455,US 2901740456,2901740463,CA -2901740464,2902200319,US +2901740464,2901751295,US +2901751296,2901751551,GB +2901751552,2902200319,US 2902200320,2902204415,CN 2902204416,2902208511,US 2902208512,2902212607,CN @@ -68075,7 +70785,17 @@ 2902405936,2902405951,US 2902405952,2902408191,CA 2902408192,2902409215,GB -2902409216,2902476543,US +2902409216,2902417407,US +2902417408,2902421503,NL +2902421504,2902427647,US +2902427648,2902429695,NL +2902429696,2902441983,US +2902441984,2902446079,NL +2902446080,2902450175,US +2902450176,2902454271,NL +2902454272,2902456319,US +2902456320,2902458367,NL +2902458368,2902476543,US 2902476544,2902476799,CW 2902476800,2902487551,US 2902487552,2902488063,CA @@ -68086,8 +70806,7 @@ 2904817664,2904981503,US 2904981504,2905002152,NL 2905002153,2905002153,US -2905002154,2905005087,NL -2905005096,2905014271,NL +2905002154,2905014271,NL 2905014272,2905038847,IN 2905038848,2905047039,SG 2905047040,2905079807,HK @@ -68099,9 +70818,15 @@ 2905348096,2905348351,PH 2905348352,2905348863,US 2905348864,2905349119,NZ -2905349120,2905387519,US +2905349120,2905376207,US +2905376208,2905376223,GB +2905376224,2905387519,US 2905387520,2905388031,CA -2905388032,2905401855,US +2905388032,2905390879,US +2905390880,2905390895,GB +2905390896,2905391599,US +2905391600,2905391615,GB +2905391616,2905401855,US 2905401856,2905402111,CA 2905402112,2905402519,US 2905402520,2905402527,IN @@ -68124,11 +70849,16 @@ 2915106560,2915195647,US 2915195648,2915195903,CL 2915195904,2915196159,NL -2915196160,2915196927,US +2915196160,2915196415,TW +2915196416,2915196927,US 2915196928,2915197183,IE 2915197184,2915197439,US 2915197440,2915197695,FI -2915197696,2915250175,US +2915197696,2915215359,US +2915215360,2915215615,JP +2915215616,2915216127,NL +2915216128,2915216383,TW +2915216384,2915250175,US 2915250176,2915254271,CA 2915254272,2915516415,US 2915516416,2915516671,NL @@ -68139,8 +70869,8 @@ 2915520512,2915520642,AU 2915520643,2915520643,US 2915520644,2915520671,AU -2915520672,2915520735,US -2915520736,2915521023,AU +2915520672,2915520767,US +2915520768,2915521023,AU 2915521024,2915521279,JP 2915521280,2915521535,PL 2915521536,2915526911,US @@ -68173,9 +70903,7 @@ 2915894592,2915958783,US 2915958784,2916024319,CA 2916024320,2916163583,US -2916163584,2916167375,CA -2916167376,2916167383,US -2916167384,2916168159,CA +2916163584,2916168159,CA 2916168160,2916168167,US 2916168168,2916171775,CA 2916171776,2916184063,US @@ -68183,21 +70911,18 @@ 2916196352,2916253695,US 2916253696,2916286463,CA 2916286464,2916294655,US -2916294656,2916295679,IL -2916295680,2916319231,US +2916294656,2916296703,IL +2916296704,2916302847,US +2916302848,2916303359,CA +2916303360,2916303871,DE +2916303872,2916304383,CA +2916304384,2916304895,US +2916304896,2916305919,GB +2916305920,2916319231,US 2916319232,2916335615,PR 2916335616,2916368383,US 2916368384,2916401151,CA -2916401152,2916401407,US -2916401408,2916402175,DE -2916402176,2916402431,US -2916402432,2916407295,DE -2916407296,2916407551,US -2916407552,2916409343,DE -2916409344,2916409599,US -2916409600,2916410879,DE -2916410880,2916411135,GB -2916411136,2916417535,DE +2916401152,2916417535,DE 2916417536,2916515839,US 2916515840,2916519935,CA 2916519936,2916581375,US @@ -68226,19 +70951,13 @@ 2917099520,2917100543,NL 2917100544,2917101567,US 2917101568,2917106175,NL -2917106176,2917106431,US -2917106432,2917106687,NL -2917106688,2917112831,US +2917106176,2917112831,US 2917112832,2917113855,NL 2917113856,2917115903,US 2917115904,2917116927,NL -2917116928,2917117951,US -2917117952,2917122047,NL -2917122048,2917167905,US +2917116928,2917167905,US 2917167906,2917167906,BZ -2917167907,2917170854,US -2917170855,2917170855,UA -2917170856,2917171199,US +2917167907,2917171199,US 2917171200,2917175295,CA 2917175296,2917195775,US 2917195776,2917203967,CA @@ -68289,9 +71008,17 @@ 2917656832,2917657087,CN 2917657088,2917660671,US 2917660672,2917661183,GB -2917661184,2917676031,US -2917676032,2917676287,CA -2917676288,2917699839,US +2917661184,2917675263,US +2917675264,2917675519,CN +2917675520,2917676031,US +2917676032,2917676287,IN +2917676288,2917687295,US +2917687296,2917687551,RO +2917687552,2917688063,US +2917688064,2917688319,RO +2917688320,2917693951,US +2917693952,2917694207,CN +2917694208,2917699839,US 2917699840,2917700351,CA 2917700352,2917700959,US 2917700960,2917700967,CN @@ -68303,7 +71030,9 @@ 2917710592,2917710847,CA 2917710848,2917713919,US 2917713920,2917714175,CA -2917714176,2917842175,US +2917714176,2917828351,US +2917828352,2917828479,IN +2917828480,2917842175,US 2917842176,2917842431,CA 2917842432,2918014975,US 2918014976,2918023167,CA @@ -68315,7 +71044,9 @@ 2918154240,2918170623,CA 2918170624,2918174463,US 2918174464,2918174719,MX -2918174720,2918187007,US +2918174720,2918180351,US +2918180352,2918180863,CA +2918180864,2918187007,US 2918187008,2918187263,CA 2918187264,2918187775,US 2918187776,2918188031,CA @@ -68344,7 +71075,9 @@ 2918407424,2918408191,PR 2918408192,2918432767,US 2918432768,2918436863,CA -2918436864,2918463231,US +2918436864,2918459391,US +2918459392,2918459647,CA +2918459648,2918463231,US 2918463232,2918463487,CA 2918463488,2918469631,US 2918469632,2918472703,CA @@ -68352,7 +71085,9 @@ 2918473216,2918473727,CA 2918473728,2918477823,US 2918477824,2918481919,CA -2918481920,2918502911,US +2918481920,2918498535,US +2918498536,2918498539,JP +2918498540,2918502911,US 2918502912,2918503167,SG 2918503168,2918527231,US 2918527232,2918527487,FR @@ -68431,8 +71166,8 @@ 2921512960,2921530367,US 2921530368,2921530879,DE 2921530880,2921541119,US -2921541120,2921541375,DE -2921541376,2921542143,US +2921541120,2921541631,DE +2921541632,2921542143,US 2921542144,2921542399,CA 2921542400,2921545215,US 2921545216,2921545727,DE @@ -68497,7 +71232,11 @@ 2928261712,2928261887,CA 2928261888,2928263167,US 2928263168,2928279551,CA -2928279552,2928312319,US +2928279552,2928283647,US +2928283648,2928287743,SG +2928287744,2928304127,US +2928304128,2928305151,NL +2928305152,2928312319,US 2928312320,2928316415,CA 2928316416,2928320511,HK 2928320512,2928328703,US @@ -68664,7 +71403,6 @@ 2947593216,2947594239,HK 2947594240,2947595263,IN 2947595264,2947596287,CN -2947596288,2947597311,IN 2947597312,2947598335,JP 2947598336,2947602431,AU 2947602432,2947603455,NZ @@ -68697,7 +71435,8 @@ 2953461760,2953465855,ES 2953465856,2953466127,GB 2953466368,2953466879,GB -2953467392,2953467647,GB +2953466880,2953467135,RO +2953467392,2953467903,GB 2953467904,2953469951,BE 2953469952,2953478143,CH 2953478144,2953503551,SE @@ -68737,9 +71476,7 @@ 2954822592,2954822599,GB 2954822600,2954822927,FR 2954822928,2954822931,DE -2954822932,2954823215,FR -2954823216,2954823223,IE -2954823224,2954823259,FR +2954822932,2954823259,FR 2954823260,2954823263,GB 2954823264,2954823687,FR 2954823688,2954823695,NL @@ -68885,9 +71622,7 @@ 2954835444,2954835447,ES 2954835448,2954835451,FR 2954835452,2954835455,ES -2954835456,2954835475,FR -2954835476,2954835479,ES -2954835480,2954835511,FR +2954835456,2954835511,FR 2954835512,2954835519,ES 2954835520,2954835619,FR 2954835620,2954835620,ES @@ -68951,9 +71686,7 @@ 2954840612,2954840615,GB 2954840616,2954840767,FR 2954840768,2954840775,GB -2954840776,2954840783,FR -2954840784,2954840799,ES -2954840800,2954840927,FR +2954840776,2954840927,FR 2954840928,2954840931,DE 2954840932,2954841023,FR 2954841024,2954841087,ES @@ -68970,7 +71703,9 @@ 2954841852,2954841855,ES 2954841856,2954842075,FR 2954842076,2954842079,GB -2954842080,2954842239,FR +2954842080,2954842111,FR +2954842112,2954842143,FI +2954842144,2954842239,FR 2954842240,2954842243,ES 2954842244,2954842247,FR 2954842248,2954842251,ES @@ -68984,9 +71719,7 @@ 2954843044,2954843047,GB 2954843048,2954843187,FR 2954843188,2954843191,GB -2954843192,2954843479,FR -2954843480,2954843487,GB -2954843488,2954843503,FR +2954843192,2954843503,FR 2954843504,2954843507,ES 2954843508,2954843759,FR 2954843760,2954843771,ES @@ -69136,7 +71869,9 @@ 2954873696,2954873727,FI 2954873728,2954873839,FR 2954873840,2954873847,ES -2954873848,2954873919,FR +2954873848,2954873879,FR +2954873880,2954873887,PT +2954873888,2954873919,FR 2954873920,2954873983,IE 2954873984,2954874111,GB 2954874112,2954874127,FR @@ -69194,9 +71929,7 @@ 2954878608,2954878623,FI 2954878624,2954878695,FR 2954878696,2954878703,IE -2954878704,2954878707,FR -2954878708,2954878711,GB -2954878712,2954878855,FR +2954878704,2954878855,FR 2954878856,2954878863,IE 2954878864,2954878899,FR 2954878900,2954878903,GB @@ -69308,7 +72041,9 @@ 2956602368,2956602623,NL 2956602624,2956602879,SE 2956602880,2956603135,GB -2956603136,2956607487,RU +2956603136,2956605439,RU +2956605440,2956605695,DE +2956605696,2956607487,RU 2956607488,2956611583,PS 2956611584,2956613631,IT 2956613632,2956614911,GB @@ -69728,8 +72463,8 @@ 2960752640,2960769023,RU 2960769024,2960773119,UA 2960773120,2960777215,RU -2960777216,2960785407,UA -2960785408,2960793599,RU +2960777216,2960789503,UA +2960789504,2960793599,RU 2960793600,2960797695,CZ 2960797696,2960805887,RU 2960805888,2960807935,KZ @@ -69771,7 +72506,8 @@ 2960932864,2960933887,IR 2960933888,2960934655,GB 2960934656,2960934911,NL -2960934912,2960941055,RO +2960934912,2960936959,RO +2960936960,2960941055,KZ 2960941056,2960943103,AM 2960943104,2960945151,RO 2960945152,2960945663,GB @@ -69818,9 +72554,7 @@ 2961065216,2961065471,AU 2961065472,2961065727,SE 2961065728,2961066239,HK -2961066240,2961066751,DE -2961066752,2961067007,BG -2961067008,2961067519,DE +2961066240,2961067519,DE 2961067520,2961067775,GB 2961067776,2961068543,DE 2961068544,2961068799,NL @@ -69844,7 +72578,8 @@ 2961102848,2961103871,DE 2961103872,2961104895,RO 2961104896,2961106943,GB -2961106944,2961108991,RO +2961106944,2961107967,NL +2961107968,2961108991,RO 2961108992,2961111039,GB 2961111040,2961112063,PL 2961112064,2961113087,RO @@ -69913,7 +72648,9 @@ 2967446016,2967446527,RO 2967446528,2967446783,IT 2967446784,2967447039,DE -2967447040,2967451647,RO +2967447040,2967450879,RO +2967450880,2967451135,US +2967451136,2967451647,RO 2967451648,2967452671,KZ 2967452672,2967453183,RO 2967453184,2967453439,GB @@ -69974,15 +72711,11 @@ 2984615936,2984935423,MX 2984935424,2984936447,AR 2984936448,2984937471,BR -2984937472,2984937607,HN -2984937608,2984937615,US -2984937616,2984938079,HN -2984938080,2984938095,US -2984938096,2984938239,HN -2984938240,2984938255,US -2984938256,2984938847,HN -2984938848,2984938863,CA -2984938864,2984939519,HN +2984937472,2984937503,HN +2984937504,2984937511,US +2984937512,2984938759,HN +2984938760,2984938767,CA +2984938768,2984939519,HN 2984939520,2984951807,BR 2984951808,2984968191,EC 2984968192,2985033727,BR @@ -70282,7 +73015,9 @@ 2988459648,2988459679,GB 2988459680,2988459687,FR 2988459688,2988459691,PL -2988459692,2988459715,FR +2988459692,2988459695,FR +2988459696,2988459699,IE +2988459700,2988459715,FR 2988459716,2988459719,FI 2988459720,2988459863,FR 2988459864,2988459867,ES @@ -70309,9 +73044,7 @@ 2988461704,2988461707,GB 2988461708,2988461799,FR 2988461800,2988461807,ES -2988461808,2988462159,FR -2988462160,2988462167,ES -2988462168,2988462331,FR +2988461808,2988462331,FR 2988462332,2988462335,ES 2988462336,2988462747,FR 2988462748,2988462751,ES @@ -70357,7 +73090,9 @@ 2988466088,2988466095,PT 2988466096,2988466098,FR 2988466099,2988466099,BE -2988466100,2988474687,FR +2988466100,2988474535,FR +2988474536,2988474543,GB +2988474544,2988474687,FR 2988474688,2988474703,FI 2988474704,2988474959,FR 2988474960,2988474975,FI @@ -70512,9 +73247,7 @@ 2988488992,2988489023,ES 2988489024,2988489167,FR 2988489168,2988489175,PT -2988489176,2988489367,FR -2988489368,2988489371,GB -2988489372,2988489375,FR +2988489176,2988489375,FR 2988489376,2988489379,ES 2988489380,2988489475,FR 2988489476,2988489479,GB @@ -70619,7 +73352,9 @@ 2988504984,2988504987,ES 2988504988,2988505151,FR 2988505152,2988505167,GB -2988505168,2988505279,FR +2988505168,2988505215,FR +2988505216,2988505247,ES +2988505248,2988505279,FR 2988505280,2988505311,ES 2988505312,2988505375,FR 2988505376,2988505391,GB @@ -70660,9 +73395,7 @@ 2988508608,2988508639,ES 2988508640,2988508847,FR 2988508848,2988508855,GB -2988508856,2988508959,FR -2988508960,2988508975,ES -2988508976,2988509491,FR +2988508856,2988509491,FR 2988509492,2988509495,IE 2988509496,2988509511,FR 2988509512,2988509515,PL @@ -70682,9 +73415,7 @@ 2988511024,2988511027,GB 2988511028,2988511747,FR 2988511748,2988511751,GB -2988511752,2988511955,FR -2988511956,2988511959,ES -2988511960,2988512127,FR +2988511752,2988512127,FR 2988512128,2988512143,ES 2988512144,2988512199,FR 2988512200,2988512207,ES @@ -70827,7 +73558,9 @@ 2988529824,2988529855,ES 2988529856,2988530047,FR 2988530048,2988530049,GB -2988530050,2988530087,FR +2988530050,2988530067,FR +2988530068,2988530071,DE +2988530072,2988530087,FR 2988530088,2988530091,NL 2988530092,2988530399,FR 2988530400,2988530403,ES @@ -70912,7 +73645,9 @@ 2988544768,2988544775,ES 2988544776,2988544799,FR 2988544800,2988544831,FI -2988544832,2988545515,FR +2988544832,2988544835,FR +2988544836,2988544843,ES +2988544844,2988545515,FR 2988545516,2988545519,GB 2988545520,2988545579,FR 2988545580,2988545583,ES @@ -71036,9 +73771,7 @@ 2988554036,2988554039,ES 2988554040,2988554239,FR 2988554240,2988554495,ES -2988554496,2988554539,FR -2988554540,2988554543,GB -2988554544,2988554815,FR +2988554496,2988554815,FR 2988554816,2988554879,GB 2988554880,2988554931,FR 2988554932,2988554935,ES @@ -71371,7 +74104,7 @@ 2997521152,2997521407,US 2997521408,2997521663,UY 2997521664,2997521919,IN -2997521920,2997522175,US +2997521920,2997522175,NL 2997522176,2997522431,GB 2997522432,2997522687,IT 2997522688,2997522943,BE @@ -71607,7 +74340,9 @@ 3000759552,3000760607,RU 3000760608,3000760623,UA 3000760624,3000762367,RU -3000762368,3001004031,RS +3000762368,3000865279,RS +3000865280,3000865791,XK +3000865792,3001004031,RS 3001004032,3001005567,XK 3001005568,3001024511,RS 3001024512,3001548799,NL @@ -71639,66 +74374,10 @@ 3001862144,3001863167,EE 3001863168,3001864191,LT 3001864192,3001868287,RU -3001868288,3001868847,FR -3001868848,3001868851,AU -3001868852,3001868855,MX -3001868856,3001868859,KR -3001868860,3001868863,FR -3001868864,3001868867,TR -3001868868,3001868871,ID -3001868872,3001868875,CH -3001868876,3001868879,PL -3001868880,3001868883,BE -3001868884,3001868887,SE -3001868888,3001868891,SA -3001868892,3001868895,TW -3001868896,3001868899,SJ -3001868900,3001868903,AT -3001868904,3001868907,AR -3001868908,3001868911,ZA -3001868912,3001868915,IR -3001868916,3001868919,TH -3001868920,3001868923,DK -3001868924,3001868927,GR -3001868928,3001868931,AE -3001868932,3001868935,VE -3001868936,3001868939,CD -3001868940,3001868943,FI -3001868944,3001868947,MY -3001868948,3001868951,PT -3001868952,3001868955,HK -3001868956,3001868959,SG -3001868960,3001868963,EG -3001868964,3001868967,NG -3001868968,3001868971,IL -3001868972,3001868975,IE -3001868976,3001868979,CL -3001868980,3001868983,CZ -3001868984,3001868987,PH -3001868988,3001868991,PK -3001868992,3001868995,RO -3001868996,3001868999,DZ -3001869000,3001869003,PE -3001869004,3001869007,NZ -3001869008,3001869011,KZ -3001869012,3001869015,UA -3001869016,3001869019,KW -3001869020,3001869023,QA -3001869024,3001869027,HU -3001869028,3001869031,BD -3001869032,3001869035,VN -3001869036,3001869039,MA -3001869040,3001869043,SK -3001869044,3001869047,AO -3001869048,3001869051,IQ -3001869052,3001869055,LY -3001869056,3001869311,RU +3001868288,3001869311,US 3001869312,3001870335,FR 3001870336,3001871359,HK -3001871360,3001871615,GR -3001871616,3001871871,PL -3001871872,3001872127,PT -3001872128,3001872383,RO +3001871360,3001872383,US 3001872384,3001876479,RU 3001876480,3001880575,IT 3001880576,3001884671,RU @@ -71775,7 +74454,9 @@ 3002650624,3002652671,FR 3002652672,3002654719,DE 3002654720,3002656767,NL -3002656768,3002658815,RU +3002656768,3002657068,RU +3002657069,3002657069,EE +3002657070,3002658815,RU 3002658816,3002660863,DE 3002660864,3002662911,CZ 3002662912,3002664959,DE @@ -71938,52 +74619,21 @@ 3003129088,3003129343,CO 3003129344,3003129599,BO 3003129600,3003129855,HN -3003129856,3003130111,MX -3003130112,3003130367,CR -3003130368,3003130623,MX -3003130624,3003131647,CR -3003131648,3003133183,MX -3003133184,3003133695,CR -3003133696,3003134719,MX -3003134720,3003134975,CR -3003134976,3003135487,MX -3003135488,3003136255,CR -3003136256,3003137279,MX -3003137280,3003137791,CR -3003137792,3003138047,MX -3003138048,3003138559,HN -3003138560,3003139071,PA -3003139072,3003139583,HN -3003139584,3003140351,PA -3003140352,3003140607,HN -3003140608,3003141375,PA -3003141376,3003141631,HN -3003141632,3003141887,PA -3003141888,3003143679,HN -3003143680,3003144447,PA -3003144448,3003146239,HN -3003146240,3003146495,PA -3003146496,3003147007,GT -3003147008,3003147263,PA -3003147264,3003148031,GT -3003148032,3003148543,PA -3003148544,3003148799,GT -3003148800,3003149311,PA -3003149312,3003150335,GT -3003150336,3003151871,SV -3003151872,3003152383,PA -3003152384,3003152639,SV -3003152640,3003152895,PA -3003152896,3003154431,SV +3003129856,3003138047,MX +3003138048,3003146239,HN +3003146240,3003148287,GT +3003148288,3003150335,CR +3003150336,3003154431,SV 3003154432,3003154687,CL 3003154688,3003154943,EC 3003154944,3003159039,AR 3003159040,3003159295,CO -3003159296,3003160575,AR +3003159296,3003159807,AR +3003159808,3003160063,BR +3003160064,3003160575,AR 3003160576,3003160831,CL 3003160832,3003161087,PE -3003161088,3003161343,CO -3003161344,3003161599,CL +3003161088,3003161599,CL 3003161600,3003162623,UY 3003162624,3003170815,CR 3003170816,3003171071,GT @@ -71998,9 +74648,7 @@ 3003174400,3003174911,BR 3003174912,3003179007,CR 3003179008,3003187199,AR -3003187200,3003189215,CO -3003189216,3003189247,AT -3003189248,3003252735,CO +3003187200,3003252735,CO 3003252736,3003449343,CL 3003449344,3003514879,SV 3003514880,3003645951,PE @@ -72014,57 +74662,26 @@ 3005218816,3005349887,CO 3005349888,3005480959,BR 3005480960,3005874175,AR -3005874176,3005875455,PA -3005875456,3005875711,CO -3005875712,3005879807,PA -3005879808,3005880063,CO -3005880064,3005881343,PA -3005881344,3005881599,CO -3005881600,3005883135,PA -3005883136,3005883391,CO -3005883392,3005886975,PA -3005886976,3005887487,CO -3005887488,3005887999,PA -3005888000,3005888255,CO -3005888256,3005890047,PA -3005890048,3005890303,CO -3005890304,3005890559,PA -3005890560,3005891583,CO -3005891584,3005891839,PA -3005891840,3005892095,CO -3005892096,3005893119,PA -3005893120,3005893631,CO -3005893632,3005893887,PA -3005893888,3005894911,CO -3005894912,3005895167,PA -3005895168,3005895935,CO -3005895936,3005896703,PA -3005896704,3005898495,CO -3005898496,3005898751,PA -3005898752,3005900799,CO -3005900800,3005901055,PA -3005901056,3005901311,CO -3005901312,3005901567,PA -3005901568,3005902079,CO -3005902080,3005902335,PA -3005902336,3005905407,CO -3005905408,3005905663,PA -3005905664,3005906943,CO -3005906944,3005911039,PA -3005911040,3005911295,CO -3005911296,3005911551,PA -3005911552,3005911807,CO -3005911808,3005912063,PA -3005912064,3005912575,CO -3005912576,3005912831,PA -3005912832,3005913087,CO -3005913088,3005913343,PA -3005913344,3005915135,CO +3005874176,3005897983,PA +3005897984,3005898239,CO +3005898240,3005898495,PA +3005898496,3005898751,CO +3005898752,3005901823,PA +3005901824,3005902079,CO +3005902080,3005902591,PA +3005902592,3005902847,CO +3005902848,3005903615,PA +3005903616,3005903871,CO +3005903872,3005905663,PA +3005905664,3005905919,CO +3005905920,3005906431,PA +3005906432,3005906687,CO +3005906688,3005914623,PA +3005914624,3005915135,CO 3005915136,3005918207,AR 3005918208,3005919231,CO 3005919232,3005923327,AR 3005923328,3005939711,BZ -3005939712,3005956095,CR 3005956096,3005960191,AR 3005960192,3005965311,PE 3005965312,3005966335,AR @@ -72073,54 +74690,34 @@ 3005972480,3005988863,CH 3005988864,3006005247,DO 3006005248,3006267391,VE -3006267392,3006267647,PA -3006267648,3006267903,NI -3006267904,3006268671,PA -3006268672,3006268927,NI -3006268928,3006271231,PA -3006271232,3006271487,NI -3006271488,3006273535,PA -3006273536,3006273791,NI -3006273792,3006275583,PA -3006275584,3006275839,NI -3006275840,3006276095,PA -3006276096,3006276351,NI -3006276352,3006277887,PA -3006277888,3006278143,NI -3006278144,3006279167,PA -3006279168,3006279423,NI -3006279424,3006283519,PA -3006283520,3006283775,NI -3006283776,3006286335,CR -3006286336,3006286847,PA -3006286848,3006287615,CR -3006287616,3006287871,PA -3006287872,3006288127,CR -3006288128,3006288383,PA -3006288384,3006289151,CR -3006289152,3006289407,PA -3006289408,3006290687,CR -3006290688,3006290943,PA -3006290944,3006291967,CR -3006291968,3006308351,PA -3006308352,3006308863,CR -3006308864,3006309631,PA -3006309632,3006310655,CR -3006310656,3006310911,PA -3006310912,3006312447,CR -3006312448,3006312703,PA -3006312704,3006315007,CR -3006315008,3006315263,PA -3006315264,3006315775,CR -3006315776,3006316031,PA -3006316032,3006316543,CR -3006316544,3006321151,PA -3006321152,3006321407,CR -3006321408,3006321663,PA -3006321664,3006324735,CR +3006267392,3006283775,PA +3006283776,3006284031,CR +3006284032,3006284543,PA +3006284544,3006284799,CR +3006284800,3006286335,PA +3006286336,3006286591,CR +3006286592,3006288127,PA +3006288128,3006288383,CR +3006288384,3006308351,PA +3006308352,3006308607,CR +3006308608,3006309887,PA +3006309888,3006310143,CR +3006310144,3006313727,PA +3006313728,3006313983,CR +3006313984,3006314239,PA +3006314240,3006314751,CR +3006314752,3006320639,PA +3006320640,3006320895,CR +3006320896,3006323967,PA +3006323968,3006324223,CR +3006324224,3006324479,PA +3006324480,3006324735,CR 3006324736,3006328831,PA -3006328832,3006330623,NI -3006330624,3006330879,PA +3006328832,3006329087,NI +3006329088,3006329343,PA +3006329344,3006329599,NI +3006329600,3006330623,PA +3006330624,3006330879,NI 3006330880,3006331903,CR 3006331904,3006332927,AR 3006332928,3006349311,EC @@ -72136,27 +74733,9 @@ 3006480384,3006484479,DO 3006484480,3006488575,AR 3006488576,3006496767,CO -3006496768,3006500351,CR -3006500352,3006500607,MX -3006500608,3006506239,CR -3006506240,3006506495,MX -3006506496,3006506751,CR -3006506752,3006507007,MX -3006507008,3006507519,CR -3006507520,3006507775,MX -3006507776,3006512895,CR -3006512896,3006513151,MX -3006513152,3006513663,PA -3006513664,3006514431,CR -3006514432,3006514687,PA -3006514688,3006516479,CR -3006516480,3006516735,PA -3006516736,3006517503,CR -3006517504,3006517759,NI -3006517760,3006518527,CR -3006518528,3006519295,NI -3006519296,3006521343,CR -3006521344,3006528511,AR +3006496768,3006521343,CR +3006521344,3006527487,AR +3006527488,3006528511,BR 3006528512,3006529535,BZ 3006529536,3006660607,DO 3006660608,3006791679,BR @@ -72168,7 +74747,6 @@ 3007070208,3007078399,CL 3007078400,3007082495,AR 3007082496,3007086591,BO -3007086592,3007090687,PA 3007090688,3007091199,NL 3007091200,3007092223,RU 3007092224,3007092479,VE @@ -72176,28 +74754,14 @@ 3007092736,3007094783,AR 3007094784,3007096831,CR 3007096832,3007098879,AR -3007098880,3007099463,HN -3007099464,3007099471,IN -3007099472,3007099631,HN -3007099632,3007099639,GB -3007099640,3007100055,HN -3007100056,3007100063,BR -3007100064,3007100407,HN -3007100408,3007100415,PH -3007100416,3007100647,HN -3007100648,3007100655,MX -3007100656,3007100887,HN -3007100888,3007100895,PH -3007100896,3007100927,HN +3007098880,3007100927,HN 3007100928,3007102975,AR 3007102976,3007103999,US 3007104000,3007106047,AR 3007106048,3007107071,PE 3007107072,3007108095,AR 3007108096,3007109119,TT -3007109120,3007111167,AR -3007111168,3007112191,PE -3007112192,3007115263,AR +3007109120,3007115263,AR 3007115264,3007116287,CO 3007116288,3007117311,EC 3007117312,3007122431,AR @@ -72212,18 +74776,25 @@ 3007153168,3007153183,DE 3007153184,3007153279,CL 3007153280,3007153407,US -3007153408,3007153919,DE +3007153408,3007153663,DE +3007153664,3007153679,CL +3007153680,3007153695,DE +3007153696,3007153919,CL 3007153920,3007154175,US 3007154176,3007154191,CL 3007154192,3007154207,DE 3007154208,3007154303,CL 3007154304,3007154687,US -3007154688,3007154943,DE +3007154688,3007154703,CL +3007154704,3007154719,DE +3007154720,3007154943,CL 3007154944,3007155199,US -3007155200,3007155327,DE +3007155200,3007155215,CL +3007155216,3007155231,DE +3007155232,3007155327,CL 3007155328,3007155711,US 3007155712,3007155967,DE -3007155968,3007156223,US +3007155968,3007156223,AT 3007156224,3007156351,DE 3007156352,3007156479,US 3007156480,3007156495,ES @@ -72341,25 +74912,28 @@ 3007171856,3007171871,US 3007171872,3007171873,BR 3007171874,3007171875,CL -3007171876,3007171903,BR -3007171904,3007172095,CL +3007171876,3007172095,BR 3007172096,3007172351,US 3007172352,3007172383,FR 3007172384,3007172415,BE -3007172416,3007172607,CL +3007172416,3007172479,CL +3007172480,3007172607,BR 3007172608,3007172863,US -3007172864,3007172991,BR +3007172864,3007172991,CL 3007172992,3007173023,IS 3007173024,3007173055,NZ -3007173056,3007173119,BR +3007173056,3007173059,CL +3007173060,3007173071,BR +3007173072,3007173119,CL 3007173120,3007173375,US 3007173376,3007173407,NO 3007173408,3007173439,SE -3007173440,3007173631,BR +3007173440,3007173443,CL +3007173444,3007173491,BR +3007173492,3007173631,CL 3007173632,3007173663,NO 3007173664,3007173695,NZ -3007173696,3007173887,BR -3007173888,3007174015,US +3007173696,3007174015,BR 3007174016,3007174047,NL 3007174048,3007174079,FR 3007174080,3007174271,BR @@ -72373,13 +74947,15 @@ 3007175680,3007175935,GB 3007175936,3007175967,NZ 3007175968,3007175999,BE -3007176000,3007176319,BR +3007176000,3007176319,CL 3007176320,3007176351,SE 3007176352,3007176383,FR -3007176384,3007176447,BR +3007176384,3007176447,CL 3007176448,3007176703,US 3007176704,3007177727,IN -3007177728,3007181055,US +3007177728,3007179007,US +3007179008,3007179263,KR +3007179264,3007181055,US 3007181056,3007181183,BR 3007181184,3007181215,IT 3007181216,3007181247,IS @@ -72407,55 +74983,13 @@ 3007184128,3007184383,KW 3007184384,3007184895,BR 3007184896,3007250431,AR -3007250432,3007268095,CR -3007268096,3007268607,PA -3007268608,3007269631,CR -3007269632,3007270143,PA -3007270144,3007270911,CR -3007270912,3007271167,PA -3007271168,3007272191,CR -3007272192,3007272447,PA -3007272448,3007272959,CR -3007272960,3007273215,PA -3007273216,3007273727,CR -3007273728,3007274239,PA -3007274240,3007274751,CR -3007274752,3007275007,PA -3007275008,3007279359,CR -3007279360,3007279871,PA -3007279872,3007280639,CR -3007280640,3007280895,PA -3007280896,3007281151,CR -3007281152,3007281919,PA -3007281920,3007283199,CR -3007283200,3007284479,PA -3007284480,3007284991,CR -3007284992,3007285247,PA -3007285248,3007285759,CR -3007285760,3007286271,PA +3007250432,3007284735,CR +3007284736,3007284991,PA +3007284992,3007286015,CR +3007286016,3007286271,PA 3007286272,3007286783,CR -3007286784,3007287295,PA -3007287296,3007287551,CR -3007287552,3007288063,MX -3007288064,3007289087,CR -3007289088,3007289343,MX -3007289344,3007290367,CR -3007290368,3007290623,PA -3007290624,3007291135,CR -3007291136,3007291391,PA -3007291392,3007292415,CR -3007292416,3007292671,MX -3007292672,3007293439,CR -3007293440,3007293951,MX -3007293952,3007294207,CR -3007294208,3007294463,MX -3007294464,3007294719,CR -3007294720,3007294975,MX -3007294976,3007296255,CR -3007296256,3007296511,MX -3007296512,3007296767,CR -3007296768,3007297023,MX -3007297024,3007299583,CR +3007286784,3007287039,PA +3007287040,3007299583,CR 3007299584,3007301631,PA 3007301632,3007305727,AR 3007305728,3007307775,BZ @@ -72485,7 +75019,9 @@ 3025603216,3025603231,CN 3025603232,3025603247,HK 3025603248,3025603257,CN -3025603258,3025603327,IN +3025603258,3025603259,IN +3025603260,3025603271,HK +3025603272,3025603327,IN 3025603328,3025603335,GU 3025603336,3025603583,IN 3025603584,3025603839,SG @@ -72508,14 +75044,10 @@ 3025612800,3025612815,IN 3025612816,3025612831,SG 3025612832,3025612895,IN -3025612896,3025613067,SG -3025613068,3025613071,IN -3025613072,3025613087,SG +3025612896,3025613087,SG 3025613088,3025613119,IN -3025613120,3025613175,SG -3025613176,3025613183,IN -3025613184,3025613311,SG -3025613312,3025616895,IN +3025613120,3025613327,SG +3025613328,3025616895,IN 3025616896,3025617439,SG 3025617440,3025617447,IN 3025617448,3025617455,SG @@ -72540,8 +75072,10 @@ 3025621760,3025622015,IN 3025622016,3025622275,SG 3025622276,3025622279,IN -3025622280,3025622351,SG -3025622352,3025623055,IN +3025622280,3025622399,SG +3025622400,3025622527,IN +3025622528,3025622783,ID +3025622784,3025623055,IN 3025623056,3025623103,SG 3025623104,3025623247,IN 3025623248,3025623251,HK @@ -72550,7 +75084,9 @@ 3025623552,3025623807,SG 3025623808,3025624063,IN 3025624064,3025624319,TW -3025624320,3025625343,IN +3025624320,3025624335,IN +3025624336,3025624343,HK +3025624344,3025625343,IN 3025625344,3025625375,SG 3025625376,3025625391,IN 3025625392,3025625395,CA @@ -72585,9 +75121,7 @@ 3025631776,3025631839,HK 3025631840,3025631999,IN 3025632000,3025632255,HK -3025632256,3025632427,SG -3025632428,3025632431,IN -3025632432,3025632439,SG +3025632256,3025632439,SG 3025632440,3025632447,IN 3025632448,3025632463,SG 3025632464,3025632479,HK @@ -72612,9 +75146,14 @@ 3025638028,3025638031,IN 3025638032,3025638047,HK 3025638048,3025638063,MY -3025638064,3025638279,IN -3025638280,3025638287,SG -3025638288,3025638399,IN +3025638064,3025638143,IN +3025638144,3025638175,MY +3025638176,3025638183,SG +3025638184,3025638199,IN +3025638200,3025638207,SG +3025638208,3025638279,IN +3025638280,3025638303,SG +3025638304,3025638399,IN 3025638400,3025638655,SG 3025638656,3025638783,IN 3025638784,3025638791,HK @@ -72638,11 +75177,15 @@ 3025640000,3025640191,IN 3025640192,3025640447,JP 3025640448,3025640835,MY -3025640836,3025641727,IN +3025640836,3025640839,IN +3025640840,3025640855,MY +3025640856,3025640863,IN +3025640864,3025640895,MY +3025640896,3025641727,IN 3025641728,3025641751,HK 3025641752,3025641759,IN -3025641760,3025641775,HK -3025641776,3025641983,IN +3025641760,3025641779,HK +3025641780,3025641983,IN 3025641984,3025642495,HK 3025642496,3025642751,SG 3025642752,3025647103,IN @@ -72744,8 +75287,8 @@ 3029715456,3029716991,JP 3029716992,3029721087,PK 3029721088,3029722111,IN -3029722112,3029722367,AU -3029722368,3029723135,IN +3029722112,3029722623,AU +3029722624,3029723135,IN 3029723136,3029724159,BD 3029724160,3029725183,CN 3029725184,3029727231,IN @@ -72858,7 +75401,8 @@ 3034492928,3034497023,JP 3034497024,3034499071,AU 3034499072,3034500095,HK -3034500096,3034501119,TW +3034500096,3034501118,PH +3034501119,3034501119,TW 3034501120,3034502143,VU 3034502144,3034503167,IN 3034503168,3034504191,ID @@ -72870,7 +75414,8 @@ 3035193344,3035197439,JP 3035197440,3035198463,SG 3035198464,3035198719,KR -3035198720,3035199487,HK +3035198720,3035198975,SG +3035198976,3035199487,HK 3035199488,3035200511,IN 3035200512,3035202559,AU 3035202560,3035205631,JP @@ -72923,7 +75468,8 @@ 3039395840,3039396351,US 3039396352,3039396607,NL 3039396608,3039412223,US -3039412224,3039412479,CL +3039412224,3039412351,CL +3039412352,3039412479,BR 3039412480,3039412735,SG 3039412736,3039412991,TW 3039412992,3039413503,US @@ -72937,7 +75483,9 @@ 3039415808,3039416575,US 3039416576,3039416591,CL 3039416592,3039416607,SG -3039416608,3039416713,CL +3039416608,3039416639,CL +3039416640,3039416703,BR +3039416704,3039416713,CL 3039416714,3039416715,US 3039416716,3039416719,SG 3039416720,3039416735,CL @@ -72952,11 +75500,12 @@ 3039418112,3039418623,US 3039418624,3039418879,BR 3039418880,3039419135,US -3039419136,3039419583,BR +3039419136,3039419391,BR +3039419392,3039419583,CL 3039419584,3039419647,SG 3039419648,3039419839,BR 3039419840,3039419903,SG -3039419904,3039420415,BR +3039419904,3039420415,CL 3039420416,3039428607,AR 3039428608,3039559679,CL 3039559680,3039821823,AR @@ -72980,9 +75529,7 @@ 3044212736,3044245503,HN 3044245504,3044278271,BO 3044278272,3044417535,AR -3044417536,3044418047,CY -3044418048,3044421631,PA -3044421632,3044425727,CY +3044417536,3044425727,PA 3044425728,3044446207,AR 3044446208,3044450303,CO 3044450304,3044454399,CL @@ -73003,65 +75550,32 @@ 3048123392,3048126463,AR 3048126464,3048128511,ES 3048128512,3048132607,AR -3048132608,3048135935,CR -3048135936,3048136447,PA -3048136448,3048144895,CR +3048132608,3048144895,CR 3048144896,3048210431,EC 3048210432,3048275967,PE 3048275968,3048292351,AR -3048292352,3048292607,BZ -3048292608,3048292799,HN -3048292800,3048292807,ES -3048292808,3048293375,HN -3048293376,3048293599,BZ -3048293600,3048293615,ES -3048293616,3048295343,BZ -3048295344,3048295351,CA -3048295352,3048295631,BZ -3048295632,3048295647,CA -3048295648,3048297407,BZ -3048297408,3048297423,CA -3048297424,3048298687,BZ -3048298688,3048298719,US -3048298720,3048298799,BZ -3048298800,3048298807,US -3048298808,3048299487,BZ -3048299488,3048299503,BR -3048299504,3048301935,BZ -3048301936,3048301951,CA -3048301952,3048302295,BZ -3048302296,3048302303,CA -3048302304,3048302815,BZ -3048302816,3048302823,NL -3048302824,3048303303,BZ -3048303304,3048303311,NL -3048303312,3048304031,BZ -3048304032,3048304047,NL -3048304048,3048304663,BZ -3048304664,3048304671,CR -3048304672,3048304919,BZ -3048304920,3048304927,CR -3048304928,3048304999,BZ -3048305000,3048305007,CR -3048305008,3048305063,BZ -3048305064,3048305071,CR -3048305072,3048305471,BZ -3048305472,3048305487,US -3048305488,3048305503,BZ -3048305504,3048305519,US -3048305520,3048305983,BZ -3048305984,3048305991,US -3048305992,3048306671,BZ -3048306672,3048306679,US -3048306680,3048307607,BZ -3048307608,3048307615,CA -3048307616,3048307967,BZ -3048307968,3048307983,CA -3048307984,3048308103,BZ -3048308104,3048308111,CA -3048308112,3048308295,BZ -3048308296,3048308303,CR -3048308304,3048308735,BZ +3048292352,3048293271,CA +3048293272,3048293279,ES +3048293280,3048294399,CA +3048294400,3048294627,BZ +3048294628,3048294631,BR +3048294632,3048294759,BZ +3048294760,3048294767,BR +3048294768,3048296351,BZ +3048296352,3048296383,CA +3048296384,3048296751,BZ +3048296752,3048296759,CA +3048296760,3048299599,BZ +3048299600,3048299607,BR +3048299608,3048299655,BZ +3048299656,3048299663,BR +3048299664,3048300543,BZ +3048300544,3048300863,US +3048300864,3048300895,CA +3048300896,3048301311,US +3048301312,3048301343,CA +3048301344,3048304639,US +3048304640,3048308735,BZ 3048308736,3048325119,BO 3048325120,3048331263,AR 3048331264,3048332287,GY @@ -73081,15 +75595,9 @@ 3049111552,3049119743,AR 3049119744,3049127935,HN 3049127936,3049193471,CL -3049193472,3049255935,PA -3049255936,3049256959,US -3049256960,3049259007,PA -3049259008,3049283583,AR -3049283584,3049291775,BZ +3049259008,3049291775,AR 3049291776,3049324543,CO -3049324544,3049362175,CR -3049362176,3049362431,NI -3049362432,3049521151,CR +3049324544,3049521151,CR 3049521152,3049586687,EC 3049586688,3049635839,PA 3049635840,3049652223,AR @@ -73112,8 +75620,7 @@ 3050700816,3050701055,BR 3050701056,3050701311,DE 3050701312,3050701327,IE -3050701328,3050701439,BR -3050701440,3050701567,US +3050701328,3050701567,BR 3050701568,3050701823,DE 3050701824,3050701839,SG 3050701840,3050702079,BR @@ -73140,7 +75647,9 @@ 3050705424,3050705663,BR 3050705664,3050705919,US 3050705920,3050705935,AU -3050705936,3050706175,BR +3050705936,3050705983,BR +3050705984,3050706047,US +3050706048,3050706175,BR 3050706176,3050706431,US 3050706432,3050706447,NL 3050706448,3050706687,BR @@ -73158,41 +75667,42 @@ 3050708496,3050708735,BR 3050708736,3050708991,US 3050708992,3050709007,AT -3050709008,3050709119,BR -3050709120,3050709247,US +3050709008,3050709247,BR 3050709248,3050709503,DE 3050709504,3050709519,TH -3050709520,3050709631,BR -3050709632,3050709759,US +3050709520,3050709759,BR 3050709760,3050710015,NL 3050710016,3050710031,ES -3050710032,3050710079,BR -3050710080,3050710527,US +3050710032,3050710271,BR +3050710272,3050710527,US 3050710528,3050710543,FR -3050710544,3050710655,BR -3050710656,3050711039,US +3050710544,3050710783,BR +3050710784,3050711039,US 3050711040,3050711055,AU 3050711056,3050711295,BR 3050711296,3050711551,US 3050711552,3050711567,EE -3050711568,3050711807,BR +3050711568,3050711615,BR +3050711616,3050711679,US +3050711680,3050711807,BR 3050711808,3050712063,US 3050712064,3050712079,FR -3050712080,3050712127,BR -3050712128,3050712575,US +3050712080,3050712319,BR +3050712320,3050712575,US 3050712576,3050712591,PL 3050712592,3050712831,BR 3050712832,3050713087,US 3050713088,3050713103,LV -3050713104,3050713343,BR -3050713344,3050713599,US +3050713104,3050713215,BR +3050713216,3050713599,US 3050713600,3050713855,NL -3050713856,3050714111,BR -3050714112,3050714367,US +3050713856,3050714367,US 3050714368,3050714623,GB 3050714624,3050714879,BR 3050714880,3050715135,ES -3050715136,3050748159,US +3050715136,3050724351,US +3050724352,3050724607,BG +3050724608,3050748159,US 3050748160,3050748415,GB 3050748416,3050753023,US 3050753024,3050753279,BR @@ -73215,8 +75725,8 @@ 3050767888,3050768127,BR 3050768128,3050768383,US 3050768384,3050768399,AT -3050768400,3050768511,BR -3050768512,3050768895,US +3050768400,3050768639,BR +3050768640,3050768895,US 3050768896,3050768911,CZ 3050768912,3050769151,BR 3050769152,3050769407,US @@ -73233,8 +75743,8 @@ 3050770960,3050771199,BR 3050771200,3050771455,US 3050771456,3050771471,SG -3050771472,3050771583,BR -3050771584,3050771967,US +3050771472,3050771711,BR +3050771712,3050771967,US 3050771968,3050771983,EE 3050771984,3050772223,BR 3050772224,3050772479,US @@ -73267,7 +75777,7 @@ 3050776832,3050777087,US 3050777088,3050777103,AU 3050777104,3050777343,BR -3050777344,3050777599,US +3050777344,3050777599,RO 3050777600,3050777615,HK 3050777616,3050777855,BR 3050777856,3050778111,US @@ -73276,7 +75786,23 @@ 3050778368,3050778623,US 3050778624,3050778639,TR 3050778640,3050778879,BR -3050778880,3050800383,US +3050778880,3050789375,US +3050789376,3050789503,BR +3050789504,3050789631,US +3050789632,3050789759,BR +3050789760,3050789887,US +3050789888,3050789967,BR +3050789968,3050789968,US +3050789969,3050790015,BR +3050790016,3050790143,US +3050790144,3050790271,BR +3050790272,3050790399,US +3050790400,3050790463,BR +3050790464,3050790464,US +3050790465,3050790527,BR +3050790528,3050790655,US +3050790656,3050790783,BR +3050790784,3050800383,US 3050800384,3050800399,AL 3050800400,3050800415,AD 3050800416,3050800431,AI @@ -73369,35 +75895,25 @@ 3050805312,3050805375,FI 3050805376,3050805759,US 3050805760,3050805791,DK -3050805792,3050816255,US +3050805792,3050811391,US +3050811392,3050811647,HK +3050811648,3050816255,US 3050816256,3050816511,NL -3050816512,3050829567,US +3050816512,3050827263,US +3050827264,3050827519,BR +3050827520,3050829567,US 3050829568,3050829823,UA 3050829824,3050831871,US 3050831872,3051356159,BR -3051356160,3051372543,CR -3051372544,3051372799,PA -3051372800,3051373055,CR -3051373056,3051374591,PA -3051374592,3051374847,CR -3051374848,3051375871,PA -3051375872,3051376895,CR -3051376896,3051377151,PA -3051377152,3051379455,CR -3051379456,3051379711,PA -3051379712,3051380735,CR +3051356160,3051374335,CR +3051374336,3051374591,PA +3051374592,3051380735,CR 3051380736,3051388927,AR -3051388928,3051389695,US +3051388928,3051389183,PA +3051389184,3051389439,NL +3051389440,3051389695,PA 3051389696,3051389951,NL -3051389952,3051390719,US -3051390720,3051390975,NL -3051390976,3051394047,US -3051394048,3051394303,NL -3051394304,3051395071,US -3051395072,3051395583,NL -3051395584,3051395839,PA -3051395840,3051396351,US -3051396352,3051397119,PA +3051389952,3051397119,PA 3051397120,3051398143,CO 3051398144,3051399167,AR 3051399168,3051400191,DO @@ -73416,7 +75932,6 @@ 3051454464,3051456511,SV 3051456512,3051457535,AR 3051457536,3051460607,CL -3051460608,3051462655,AR 3051462656,3051470847,PE 3051470848,3051479039,AR 3051479040,3051487231,CU @@ -73424,29 +75939,7 @@ 3051552768,3051618303,BO 3051618304,3051880447,AR 3051880448,3051913215,CO -3051913216,3051963135,CR -3051963136,3051963391,PA -3051963392,3051964671,CR -3051964672,3051964927,PA -3051964928,3051965183,CR -3051965184,3051965439,PA -3051965440,3051965695,CR -3051965696,3051965951,PA -3051965952,3051968511,CR -3051968512,3051968767,PA -3051968768,3051969535,CR -3051969536,3051969791,PA -3051969792,3051971071,CR -3051971072,3051971327,PA -3051971328,3051971839,CR -3051971840,3051972351,PA -3051972352,3051973887,CR -3051973888,3051974143,PA -3051974144,3051974399,CR -3051974400,3051974655,PA -3051974656,3051976191,CR -3051976192,3051976447,PA -3051976448,3051983871,CR +3051913216,3051983871,CR 3051983872,3051984895,BR 3051984896,3051995135,CR 3051995136,3052011519,PE @@ -73690,13 +76183,12 @@ 3078619136,3081437183,CN 3081437184,3081502719,MY 3081502720,3081764863,CN -3081764864,3081844735,JP -3081844736,3081846783,AU +3081764864,3081842687,JP +3081842688,3081846783,AU 3081846784,3081847807,TW 3081847808,3081848831,KR 3081848832,3081850879,SG -3081850880,3081851391,HK -3081851392,3081851903,SG +3081850880,3081851903,HK 3081851904,3081852927,JP 3081852928,3081854975,HK 3081854976,3081859071,MN @@ -73723,21 +76215,11 @@ 3088449536,3088515071,TH 3088515072,3088629759,US 3088629760,3088633855,NL -3088633856,3088654335,US -3088654336,3088658431,NL -3088658432,3088673535,US -3088673536,3088673791,NL -3088673792,3088686591,US +3088633856,3088686591,US 3088686592,3088687103,NL 3088687104,3088701439,US 3088701440,3088702463,NL -3088702464,3088708607,US -3088708608,3088709631,NL -3088709632,3088710655,US -3088710656,3088711167,NL -3088711168,3088753919,US -3088753920,3088754175,NL -3088754176,3088785407,US +3088702464,3088785407,US 3088785408,3088786431,NL 3088786432,3088812031,US 3088812032,3088812799,NL @@ -73748,24 +76230,22 @@ 3088829952,3088830463,NL 3088830464,3088830975,US 3088830976,3088831487,NL -3088831488,3088845311,US -3088845312,3088845823,NL -3088845824,3088856063,US -3088856064,3088857599,NL +3088831488,3088856063,US +3088856064,3088856575,NL +3088856576,3088857087,US +3088857088,3088857599,NL 3088857600,3088858111,US 3088858112,3088858623,NL -3088858624,3088861695,US -3088861696,3088862719,NL -3088862720,3088863231,US +3088858624,3088863231,US 3088863232,3088863743,NL 3088863744,3088863999,US 3088864000,3088864255,NL -3088864256,3088866303,US -3088866304,3088866815,NL -3088866816,3088867839,US +3088864256,3088867839,US 3088867840,3088868351,NL 3088868352,3088868607,US -3088868608,3088870143,NL +3088868608,3088868863,NL +3088868864,3088869375,US +3088869376,3088870143,NL 3088870144,3088871423,US 3088871424,3088871935,NL 3088871936,3088880639,US @@ -73776,9 +76256,7 @@ 3088902144,3088902655,NL 3088902656,3088913663,US 3088913664,3088913919,NL -3088913920,3088924671,US -3088924672,3088925695,NL -3088925696,3088998399,US +3088913920,3088998399,US 3088998400,3089002495,NL 3089002496,3089027071,US 3089027072,3089031167,NL @@ -73788,9 +76266,7 @@ 3090292224,3090292735,NL 3090292736,3090325503,US 3090325504,3090329599,NL -3090329600,3090387455,US -3090387456,3090387711,NL -3090387712,3090387967,US +3090329600,3090387967,US 3090387968,3090388479,NL 3090388480,3090389503,US 3090389504,3090389631,CA @@ -73806,15 +76282,9 @@ 3091976192,3091980287,CA 3091980288,3092381695,US 3092381696,3092447231,TH -3092447232,3092567039,US -3092567040,3092568063,NL -3092568064,3092572671,US +3092447232,3092572671,US 3092572672,3092573183,NL -3092573184,3092578303,US -3092578304,3092582399,NL -3092582400,3092615167,US -3092615168,3092619263,NL -3092619264,3092623359,US +3092573184,3092623359,US 3092623360,3092627455,NL 3092627456,3092634367,US 3092634368,3092634623,NL @@ -73841,14 +76311,14 @@ 3092692992,3092697087,US 3092697088,3092697599,NL 3092697600,3092701183,US -3092701184,3092703231,NL -3092703232,3092704255,US +3092701184,3092702207,NL +3092702208,3092704255,US 3092704256,3092705279,NL 3092705280,3092754431,US -3092754432,3092759039,NL -3092759040,3092764671,US -3092764672,3092766719,NL -3092766720,3093168127,US +3092754432,3092758527,NL +3092758528,3092764671,US +3092764672,3092766207,NL +3092766208,3093168127,US 3093168128,3093200895,CA 3093200896,3093213183,US 3093213184,3093217279,CA @@ -73891,8 +76361,8 @@ 3096969216,3097143823,US 3097143824,3097143831,BD 3097143832,3097493503,US -3097493504,3097755647,CA -3097755648,3098095615,US +3097493504,3097772031,CA +3097772032,3098095615,US 3098095616,3098099711,CA 3098099712,3098099967,US 3098099968,3098100735,SE @@ -73918,10 +76388,14 @@ 3098181632,3098185727,CA 3098185728,3098263551,US 3098263552,3098271743,CA -3098271744,3098411007,US -3098411008,3098415103,PK -3098415104,3098435583,US -3098435584,3098437631,IL +3098271744,3098412031,US +3098412032,3098413055,CA +3098413056,3098428415,US +3098428416,3098428927,RU +3098428928,3098429439,SE +3098429440,3098431487,GB +3098431488,3098436607,US +3098436608,3098437631,IL 3098437632,3098476543,US 3098476544,3098492927,CA 3098492928,3098494719,US @@ -74003,12 +76477,18 @@ 3103869952,3103870207,RU 3103870208,3103870463,IR 3103870464,3103870719,MD +3103870720,3103870975,SE 3103870976,3103871231,IT 3103871232,3103871487,RU 3103871488,3103871743,SE 3103871744,3103871999,CZ 3103872000,3103872511,UA 3103872512,3103872767,FI +3103872768,3103873023,HR +3103873024,3103873279,SE +3103873280,3103873535,FR +3103873536,3103873791,CZ +3103873792,3103874047,PL 3103916032,3103917055,CH 3103917056,3103918079,IT 3103918080,3103919103,DE @@ -74175,16 +76655,7 @@ 3104078848,3104079871,FR 3104079872,3104080895,GB 3104080896,3104081919,GR -3104081920,3104082175,DK -3104082176,3104082343,LU -3104082344,3104082431,DK -3104082432,3104082687,LU -3104082688,3104082751,DK -3104082752,3104082767,LU -3104082768,3104082799,DK -3104082800,3104082815,LU -3104082816,3104082895,DK -3104082896,3104082943,LU +3104081920,3104082943,DK 3104082944,3104083967,IT 3104083968,3104084991,RU 3104084992,3104085247,NL @@ -74480,7 +76951,8 @@ 3104377856,3104378879,DE 3104378880,3104379215,GB 3104379216,3104379223,CZ -3104379224,3104379647,GB +3104379224,3104379391,GB +3104379392,3104379647,CH 3104379648,3104379903,AT 3104379904,3104380927,FR 3104380928,3104381951,DK @@ -74557,7 +77029,8 @@ 3104457984,3104458495,DE 3104458496,3104459775,IR 3104459776,3104460799,IT -3104460800,3104462847,ES +3104460800,3104461823,ES +3104461824,3104462847,CZ 3104462848,3104463871,GB 3104463872,3104464895,DE 3104464896,3104465919,NL @@ -74589,7 +77062,11 @@ 3104495616,3104496639,JO 3104496640,3104497663,DK 3104497664,3104498687,CH -3104498688,3104500735,NL +3104498688,3104498695,NL +3104498696,3104498703,US +3104498704,3104499391,NL +3104499392,3104499399,US +3104499400,3104500735,NL 3104500736,3104501759,CZ 3104501760,3104502783,LY 3104502784,3104503807,DE @@ -74651,7 +77128,7 @@ 3104558080,3104559103,GB 3104559104,3104560127,FI 3104560128,3104561151,TR -3104561152,3104562175,FR +3104561152,3104562175,NL 3104562176,3104563199,ES 3104563200,3104564223,IT 3104564224,3104565247,RU @@ -74792,7 +77269,7 @@ 3104703488,3104704511,RU 3104704512,3104705535,IT 3104705536,3104706559,DE -3104706560,3104707583,UA +3104706560,3104707583,RU 3104707584,3104708607,TR 3104708608,3104709631,ES 3104709632,3104710655,NL @@ -74802,7 +77279,6 @@ 3104714752,3104715775,DE 3104715776,3104716799,AT 3104716800,3104717823,ES -3104717824,3104718847,GB 3104718848,3104719871,TR 3104719872,3104720895,RU 3104720896,3104721919,PL @@ -74903,7 +77379,8 @@ 3104818176,3104819199,TR 3104819200,3104820223,CH 3104820224,3104821247,GB -3104821248,3104822271,RU +3104821248,3104821503,RU +3104821504,3104822271,NL 3104822272,3104823295,FI 3104823296,3104824319,NO 3104824320,3104825343,NL @@ -74953,7 +77430,7 @@ 3104868352,3104869375,RU 3104869376,3104870399,DK 3104870400,3104871423,PL -3104871424,3104872447,CY +3104871424,3104872447,RU 3104872448,3104873471,GB 3104873472,3104874495,DK 3104874496,3104875519,GB @@ -75316,7 +77793,7 @@ 3105233920,3105234943,IR 3105234944,3105235967,LB 3105235968,3105236991,IT -3105236992,3105238015,GB +3105236992,3105238015,FR 3105238016,3105239039,DE 3105239040,3105240063,FR 3105240064,3105241087,CH @@ -75444,8 +77921,8 @@ 3105374208,3105375231,GB 3105375232,3105375295,IT 3105375296,3105375327,DE -3105375328,3105375367,CA -3105375368,3105375375,DE +3105375328,3105375359,CA +3105375360,3105375375,DE 3105375376,3105375391,US 3105375392,3105375551,IT 3105375552,3105375615,DE @@ -75546,7 +78023,7 @@ 3105460224,3105461247,GB 3105461248,3105462271,PL 3105462272,3105463295,RU -3105464320,3105465343,BE +3105464320,3105465343,NL 3105465344,3105466367,DE 3105466368,3105467391,BE 3105467392,3105468415,GB @@ -75581,7 +78058,7 @@ 3105496064,3105497087,RU 3105497088,3105498111,IR 3105498112,3105499135,DE -3105499136,3105501183,RU +3105499136,3105500159,RU 3105501184,3105502207,FI 3105502208,3105503231,RU 3105503232,3105504255,NL @@ -75754,7 +78231,9 @@ 3105673216,3105674239,DE 3105674240,3105675263,GB 3105675264,3105676287,ES -3105676288,3105678335,NL +3105676288,3105677055,NL +3105677056,3105677311,US +3105677312,3105678335,NL 3105678336,3105679359,DE 3105679360,3105680383,FR 3105680384,3105681407,UA @@ -75999,7 +78478,7 @@ 3105925120,3105926143,BE 3105926144,3105927167,BA 3105927168,3105928191,IL -3105928192,3105928447,ES +3105928192,3105928447,NL 3105928448,3105929215,CZ 3105929216,3105930239,RU 3105930240,3105931263,PT @@ -76054,9 +78533,10 @@ 3105969664,3105969727,DE 3105969728,3105970175,GB 3105970176,3105971199,FR -3105971200,3105972223,GB +3105971200,3105972223,CN 3105972224,3105973247,DK -3105973248,3105974271,US +3105973248,3105974048,US +3105974049,3105974271,NL 3105974272,3105975295,MD 3105975296,3105976319,TR 3105976320,3105977343,LB @@ -76161,7 +78641,8 @@ 3106061312,3106062335,NL 3106062336,3106063359,ES 3106063360,3106064383,DE -3106064384,3106065407,NL +3106064384,3106065151,NL +3106065152,3106065407,MD 3106065408,3106066431,IT 3106066432,3106067455,GB 3106067456,3106068479,DE @@ -76200,7 +78681,7 @@ 3106104320,3106105343,UA 3106105344,3106106367,AE 3106106368,3106106623,US -3106106624,3106107391,BG +3106106624,3106107391,DE 3106107392,3106108415,NL 3106108416,3106110463,RU 3106110464,3106111487,GB @@ -76424,7 +78905,9 @@ 3106318336,3106319359,AT 3106319360,3106320383,DK 3106320384,3106321407,HR -3106321408,3106322431,DK +3106321408,3106321663,DK +3106321664,3106321919,SE +3106321920,3106322431,DK 3106322432,3106323455,ME 3106323456,3106324479,CZ 3106324480,3106325503,AL @@ -76441,7 +78924,7 @@ 3106333696,3106334719,GB 3106334720,3106335743,NL 3106335744,3106336767,NO -3106336768,3106337791,US +3106336768,3106337791,DE 3106337792,3106338815,GB 3106338816,3106339839,PL 3106339840,3106340863,IT @@ -76576,7 +79059,6 @@ 3106462720,3106463743,IT 3106463744,3106464767,IR 3106464768,3106465791,PL -3106466048,3106466303,NL 3106466816,3106467839,EE 3106467840,3106468863,IR 3106468864,3106470911,DE @@ -76715,7 +79197,8 @@ 3106592768,3106593791,LU 3106593792,3106594815,GB 3106594816,3106595839,IR -3106595840,3106596863,RU +3106595840,3106596095,EE +3106596096,3106596863,RU 3106596864,3106597887,FR 3106597888,3106598911,GB 3106598912,3106599935,ES @@ -76946,7 +79429,8 @@ 3106821760,3106821887,CN 3106821888,3106822015,RU 3106822016,3106822143,JP -3106822144,3106824191,CH +3106822144,3106823167,CH +3106823168,3106824191,PL 3106824192,3106825215,RU 3106825216,3106826239,IT 3106826240,3106827263,PL @@ -77298,7 +79782,8 @@ 3107173376,3107174399,PL 3107174400,3107175423,DE 3107175424,3107176447,HU -3107176448,3107177471,NL +3107176448,3107176703,NL +3107176704,3107177471,GB 3107177472,3107178495,AT 3107178496,3107179519,IR 3107179520,3107180543,SA @@ -77307,7 +79792,9 @@ 3107182592,3107183615,FR 3107183616,3107184639,IQ 3107184640,3107185663,SE -3107185664,3107186687,CZ +3107185664,3107185919,GB +3107185920,3107186431,US +3107186432,3107186687,GB 3107186688,3107187711,NO 3107187712,3107188735,MT 3107188736,3107189759,CZ @@ -77424,7 +79911,10 @@ 3107307520,3107308543,IT 3107308544,3107310591,RO 3107310592,3107311615,DE -3107311616,3107312639,IL +3107311616,3107311871,IL +3107311872,3107312127,US +3107312128,3107312383,FR +3107312384,3107312639,IL 3107312640,3107313663,SE 3107313664,3107315711,DE 3107315712,3107316735,GB @@ -77907,7 +80397,7 @@ 3107788800,3107789823,RU 3107789824,3107791871,DE 3107791872,3107792895,RU -3107792896,3107793919,AT +3107792896,3107793919,DE 3107793920,3107794943,TR 3107794944,3107795967,LB 3107795968,3107796991,NL @@ -78109,7 +80599,7 @@ 3108001792,3108002815,GB 3108002816,3108003839,RO 3108003840,3108004863,DE -3108004864,3108005887,GB +3108004864,3108005887,US 3108005888,3108006911,LT 3108006912,3108007935,NL 3108007936,3108008959,DE @@ -78254,7 +80744,9 @@ 3108149248,3108150271,FR 3108150272,3108151295,CH 3108151296,3108152319,CY -3108152320,3108153343,GB +3108152320,3108152575,GB +3108152576,3108152831,DE +3108152832,3108153343,GB 3108153344,3108154367,NL 3108154368,3108155391,ES 3108155392,3108156415,DE @@ -78333,7 +80825,7 @@ 3108237312,3108238335,LT 3108238336,3108239359,RU 3108239360,3108240383,GB -3108240384,3108240639,CZ +3108240384,3108240639,UA 3108240640,3108240895,RU 3108240896,3108241407,CZ 3108241408,3108242431,GB @@ -78728,12 +81220,12 @@ 3108647936,3108648959,FR 3108648960,3108649983,IM 3108649984,3108651007,CZ -3108651008,3108651519,DE -3108651520,3108651775,US -3108651776,3108652031,DE +3108651008,3108652031,DE 3108652032,3108653055,CH 3108653056,3108654079,GI -3108654080,3108655103,NL +3108654080,3108654591,NL +3108654592,3108654847,GB +3108654848,3108655103,NL 3108655104,3108656127,ES 3108656128,3108657151,PL 3108657152,3108658175,RS @@ -78912,9 +81404,7 @@ 3108850688,3108851711,PL 3108851712,3108852039,GB 3108852040,3108852047,IT -3108852048,3108852079,GB -3108852080,3108852087,IT -3108852088,3108852735,GB +3108852048,3108852735,GB 3108852736,3108853759,IT 3108853760,3108854783,TR 3108854784,3108855807,CH @@ -78944,7 +81434,9 @@ 3108873984,3108874111,SG 3108874112,3108874239,ID 3108874240,3108875263,ES -3108875264,3108876287,GB +3108875264,3108875439,GB +3108875440,3108875447,IT +3108875448,3108876287,GB 3108876288,3108877311,ES 3108877312,3108878335,FR 3108878336,3108879359,ES @@ -78960,8 +81452,7 @@ 3108889600,3108893695,RU 3108893696,3108894719,FI 3108894720,3108894975,IL -3108894976,3108895231,RO -3108895232,3108895743,GB +3108894976,3108895743,US 3108895744,3108896767,AT 3108896768,3108897791,ES 3108897792,3108899839,GB @@ -79369,8 +81860,7 @@ 3109280768,3109281791,IL 3109281792,3109282815,HU 3109282816,3109283839,DE -3109283840,3109284095,PL -3109284096,3109284863,IE +3109283840,3109284863,IE 3109284864,3109285887,FR 3109285888,3109286911,RU 3109286912,3109287935,TR @@ -79517,7 +82007,9 @@ 3109430272,3109431295,IR 3109431296,3109431807,IL 3109431808,3109432319,IT -3109432320,3109433343,MT +3109432320,3109432831,MT +3109432832,3109433087,SE +3109433088,3109433343,MT 3109433344,3109435391,FR 3109435392,3109436415,UA 3109436416,3109437439,SM @@ -79746,8 +82238,9 @@ 3109673216,3109673439,SE 3109673451,3109673451,NO 3109673456,3109673471,SE -3109673472,3109673695,GB +3109673472,3109673703,GB 3109673704,3109673704,IN +3109673705,3109673727,GB 3109673728,3109673983,AU 3109673984,3109675007,FR 3109675008,3109677055,DE @@ -79772,7 +82265,7 @@ 3109692416,3109693439,CH 3109693440,3109694463,AT 3109694464,3109695487,CY -3109695488,3109696511,DE +3109695488,3109696511,GB 3109696512,3109697535,DK 3109697536,3109698559,PT 3109698560,3109699071,NO @@ -79838,8 +82331,6 @@ 3109763072,3109765119,IT 3109765120,3109766143,NO 3109766144,3109767167,ES -3109767168,3109767935,UA -3109767936,3109768191,NL 3109768192,3109769215,GB 3109769216,3109770239,AT 3109770240,3109771263,GB @@ -79856,7 +82347,7 @@ 3109783552,3109784575,ES 3109784576,3109785599,HU 3109785600,3109786623,AT -3109786624,3109787647,US +3109786624,3109787647,IT 3109787648,3109788671,NO 3109788672,3109789695,BA 3109789696,3109790719,IT @@ -79885,7 +82376,9 @@ 3109818368,3109819391,NL 3109819392,3109820415,FR 3109820416,3109820671,US -3109820672,3109821439,GB +3109820672,3109820927,GB +3109820928,3109821183,CA +3109821184,3109821439,GB 3109821440,3109822463,SY 3109822464,3109823487,RU 3109823488,3109824511,FR @@ -79911,11 +82404,12 @@ 3109844992,3109845503,DE 3109845504,3109845759,GB 3109845760,3109846015,DE -3109846016,3109847039,GB +3109846016,3109847039,CH 3109847040,3109848063,AE 3109848064,3109849087,BG 3109849088,3109852159,RU -3109852160,3109854207,DE +3109852160,3109853183,NL +3109853184,3109854207,DE 3109854208,3109855231,PL 3109855232,3109856255,DE 3109856256,3109857279,IT @@ -79942,7 +82436,8 @@ 3109877760,3109878783,PL 3109878784,3109879807,GB 3109879808,3109880319,US -3109880320,3109880831,CZ +3109880320,3109880575,CZ +3109880576,3109880831,ES 3109880832,3109881855,FR 3109881856,3109882879,AT 3109882880,3109883903,NL @@ -80637,7 +83132,8 @@ 3110540288,3110541311,LB 3110541312,3110542335,RU 3110542336,3110543359,HK -3110543360,3110545407,NL +3110543360,3110544383,NL +3110544384,3110545407,ES 3110545408,3110546431,UA 3110546432,3110547455,DE 3110547456,3110547967,SE @@ -81079,12 +83575,13 @@ 3111024640,3111025663,AT 3111025664,3111026687,DE 3111026688,3111027967,RU -3111027968,3111028223,GB -3111028224,3111028735,UA +3111027968,3111028735,UA 3111028736,3111029759,AT 3111029760,3111031807,SK 3111031808,3111032831,NO -3111032832,3111033855,DE +3111032832,3111033343,DE +3111033344,3111033599,CH +3111033600,3111033855,DE 3111033856,3111035903,ES 3111035904,3111036927,GE 3111036928,3111037951,RU @@ -81129,7 +83626,7 @@ 3111079936,3111080959,NL 3111080960,3111081983,RU 3111081984,3111083007,HU -3111083008,3111084031,UA +3111083008,3111084031,CA 3111084032,3111085055,CZ 3111085056,3111086079,RU 3111086080,3111087103,KZ @@ -81312,7 +83809,7 @@ 3111268352,3111269375,BE 3111269376,3111270399,RO 3111270400,3111271423,NO -3111271424,3111272447,NL +3111271424,3111272447,GB 3111272448,3111273471,ES 3111273472,3111274495,SA 3111274496,3111275519,IR @@ -81391,8 +83888,7 @@ 3111343104,3111344127,GB 3111344128,3111344383,NL 3111344384,3111344639,DE -3111344640,3111344895,NL -3111344896,3111345151,US +3111344640,3111345151,US 3111345152,3111346175,RO 3111346176,3111347199,RU 3111347200,3111348223,LB @@ -81485,7 +83981,7 @@ 3111444480,3111445503,SA 3111445504,3111446527,RU 3111446528,3111447551,DE -3111447552,3111447775,GB +3111447552,3111447775,NL 3111447776,3111447807,AT 3111447808,3111448063,GB 3111448064,3111448319,BG @@ -81513,9 +84009,7 @@ 3111467008,3111469055,FR 3111469056,3111470079,EE 3111470080,3111471103,AE -3111471104,3111471359,NL -3111471360,3111471615,RO -3111471616,3111473151,NL +3111471104,3111473151,NL 3111473152,3111474175,BG 3111474176,3111475199,PL 3111475200,3111475711,SE @@ -81688,7 +84182,8 @@ 3111653120,3111653375,DK 3111653376,3111654399,RO 3111654400,3111654911,GB -3111654912,3111655423,FR +3111654912,3111655167,DE +3111655168,3111655423,FR 3111655424,3111656447,NO 3111656448,3111657471,LB 3111657472,3111658239,GB @@ -81778,7 +84273,8 @@ 3111752704,3111753727,IT 3111753728,3111754751,BG 3111754752,3111755775,IT -3111755776,3111756799,NO +3111755776,3111756543,NO +3111756544,3111756799,US 3111756800,3111757823,NL 3111757824,3111758335,NZ 3111758336,3111758591,NL @@ -81787,7 +84283,7 @@ 3111759872,3111760127,IS 3111760128,3111760383,AQ 3111760384,3111760639,GB -3111760640,3111760895,IS +3111760640,3111760895,LT 3111760896,3111761919,NL 3111761920,3111762943,SY 3111762944,3111763967,NL @@ -81877,8 +84373,7 @@ 3111853056,3111854079,GP 3111854080,3111855103,NO 3111855104,3111856127,IT -3111856128,3111857151,KZ -3111857152,3111858175,RU +3111856128,3111858175,RU 3111858176,3111859199,PL 3111859200,3111860223,EE 3111860224,3111861247,ES @@ -81904,7 +84399,7 @@ 3111882752,3111886847,GB 3111886848,3111887871,PL 3111887872,3111888895,RU -3111888896,3111889919,DE +3111888896,3111889919,IE 3111889920,3111890943,RU 3111890944,3111891967,AT 3111891968,3111892991,FR @@ -81994,7 +84489,7 @@ 3111990272,3111991295,FR 3111991296,3111992319,RU 3111992320,3111993343,RS -3111993344,3111994367,GB +3111993344,3111994367,US 3111994368,3111995391,IT 3111995392,3111996415,RU 3111996416,3111997439,ES @@ -82289,7 +84784,7 @@ 3112268800,3112269823,IR 3112269824,3112270847,RS 3112270848,3112271871,IR -3112271872,3112272895,RU +3112271872,3112272895,UA 3112272896,3112273919,IE 3112273920,3112274943,CZ 3112274944,3112275967,IR @@ -82942,7 +85437,9 @@ 3112973312,3112973567,SE 3112973568,3112973823,DE 3112973824,3112974079,UA -3112974080,3112974335,SE +3112974080,3112974083,HU +3112974084,3112974087,AT +3112974088,3112974335,HU 3112974336,3112975359,IR 3112975360,3112977407,ES 3112977408,3112978431,FR @@ -82955,8 +85452,7 @@ 3112984576,3112985599,AE 3112985600,3112986623,PL 3112986624,3112987647,DE -3112987648,3112988671,HU -3112988672,3112988927,AT +3112987648,3112988927,HU 3112988928,3112989183,NL 3112989184,3112989439,ES 3112989440,3112989695,AT @@ -83032,7 +85528,9 @@ 3113064448,3113065471,SE 3113065472,3113066495,NO 3113066496,3113067519,LT -3113067520,3113068543,DE +3113067520,3113067935,DE +3113067936,3113067936,US +3113067937,3113068543,DE 3113068544,3113069567,IR 3113069568,3113070591,IT 3113070592,3113071615,GB @@ -83093,8 +85591,8 @@ 3113123840,3113124863,GB 3113124864,3113125887,RU 3113125888,3113126911,FR -3113126912,3113127167,US -3113127168,3113127423,NL +3113126912,3113127167,NL +3113127168,3113127423,GB 3113127424,3113127935,AT 3113127936,3113128959,NL 3113128960,3113129983,CH @@ -83219,7 +85717,11 @@ 3113246976,3113247231,RU 3113247232,3113247487,FR 3113247488,3113247743,RU -3113247744,3113248767,GB +3113247744,3113247999,US +3113248000,3113248031,DE +3113248032,3113248063,US +3113248064,3113248255,DE +3113248256,3113248767,GB 3113248768,3113249791,NL 3113249792,3113250815,GB 3113250816,3113251839,FR @@ -83261,8 +85763,7 @@ 3113287680,3113288703,AL 3113288704,3113289727,EE 3113289728,3113290751,IR -3113290752,3113291775,GB -3113291776,3113292799,NL +3113290752,3113292799,NL 3113292800,3113293823,AT 3113293824,3113294847,NL 3113294848,3113295871,IL @@ -83406,7 +85907,9 @@ 3113425152,3113425407,SK 3113425408,3113425919,CZ 3113425920,3113426943,KW -3113426944,3113427967,IM +3113426944,3113427455,IM +3113427456,3113427711,NL +3113427712,3113427967,US 3113427968,3113428991,RU 3113428992,3113430015,IR 3113430016,3113431039,CZ @@ -83452,10 +85955,9 @@ 3113470976,3113471999,FR 3113472000,3113473023,GB 3113473024,3113473279,FR -3113473280,3113473535,GB +3113473280,3113473535,SE 3113473536,3113473791,ES -3113473792,3113474047,GB -3113474048,3113475071,DE +3113473792,3113475071,DE 3113475072,3113479167,FR 3113479168,3113480191,SE 3113480192,3113481215,FR @@ -83529,8 +86031,7 @@ 3113552896,3113553919,UA 3113553920,3113554943,NO 3113554944,3113555967,UA -3113555968,3113556223,NL -3113556224,3113556991,BZ +3113555968,3113556991,NL 3113556992,3113558015,DE 3113558016,3113559039,IT 3113559040,3113560063,NL @@ -83801,7 +86302,7 @@ 3113759744,3113760767,FR 3113760768,3113761791,BE 3113761792,3113762815,ES -3113762816,3113763327,SK +3113762816,3113763327,CZ 3113763328,3113763839,US 3113763840,3113764863,VA 3113764864,3113765887,IE @@ -83818,8 +86319,7 @@ 3113777152,3113778175,PL 3113778176,3113779199,TR 3113779200,3113780223,GB -3113780224,3113780479,KZ -3113780480,3113781247,RU +3113780224,3113781247,RU 3113781248,3113782271,BY 3113782272,3113783295,IT 3113783296,3113784319,TR @@ -83889,7 +86389,9 @@ 3113853952,3113854975,US 3113854976,3113855999,ES 3113856000,3113857023,GB -3113857024,3113858047,DE +3113857024,3113857279,BR +3113857280,3113857535,MX +3113857536,3113858047,DE 3113858048,3113859071,UA 3113859072,3113860095,IR 3113860096,3113861119,NL @@ -83912,8 +86414,7 @@ 3113877504,3113878527,ES 3113878528,3113879551,US 3113879552,3113880575,ES -3113880576,3113880831,NL -3113880832,3113881599,UA +3113880576,3113881599,NL 3113881600,3113882623,RO 3113882624,3113883647,RU 3113883648,3113884671,ES @@ -83956,7 +86457,7 @@ 3113922560,3113923583,DK 3113923584,3113924607,UA 3113924608,3113925631,IR -3113925632,3113926655,KW +3113925632,3113926655,DE 3113926656,3113927679,RU 3113927680,3113928703,ES 3113928704,3113929727,RU @@ -84166,7 +86667,6 @@ 3114141696,3114142719,ES 3114142720,3114143743,DE 3114143744,3114144767,AT -3114144768,3114145791,FR 3114145792,3114146815,AT 3114146816,3114147839,IT 3114147840,3114148863,SY @@ -84210,7 +86710,7 @@ 3114173680,3114173695,GB 3114173696,3114174463,DE 3114174464,3114175231,NL -3114175232,3114175487,HU +3114175232,3114175487,US 3114175488,3114176511,IT 3114176512,3114177535,NL 3114177536,3114177775,DE @@ -84243,8 +86743,7 @@ 3114199040,3114201087,IT 3114201088,3114203135,GB 3114203136,3114203391,RO -3114203392,3114203647,NL -3114203648,3114203903,GB +3114203392,3114203903,NL 3114203904,3114204159,DE 3114204160,3114205183,ES 3114205184,3114206207,IT @@ -84404,7 +86903,10 @@ 3114359808,3114360831,PL 3114360832,3114361855,ES 3114361856,3114362879,CH -3114362880,3114363903,NL +3114362880,3114363135,NL +3114363136,3114363391,DE +3114363392,3114363647,GB +3114363648,3114363903,NL 3114363904,3114364927,TR 3114364928,3114365951,IR 3114365952,3114366975,ES @@ -84429,7 +86931,9 @@ 3114384384,3114385407,GB 3114385408,3114386431,IT 3114386432,3114387455,NL -3114387456,3114388479,US +3114387456,3114387711,JP +3114387712,3114387967,AU +3114387968,3114388479,US 3114388480,3114389503,HU 3114389504,3114390527,NL 3114390528,3114391551,SE @@ -84442,11 +86946,11 @@ 3114397696,3114398719,CZ 3114398720,3114399743,AT 3114399744,3114400767,GB -3114400768,3114401023,SK -3114401024,3114401791,CZ +3114400768,3114401791,CZ 3114401792,3114402815,HU 3114402816,3114403839,CZ -3114403840,3114404863,BG +3114403840,3114404351,NL +3114404352,3114404863,BG 3114404864,3114405887,RU 3114405888,3114406911,CY 3114406912,3114407935,UA @@ -84477,9 +86981,7 @@ 3114421248,3114422271,SK 3114422272,3114423295,FR 3114423296,3114424319,MD -3114424320,3114424575,NL -3114424576,3114424831,GB -3114424832,3114425343,NL +3114424320,3114425343,NL 3114425344,3114426367,RU 3114426368,3114427391,PL 3114427392,3114428415,GB @@ -84543,7 +87045,8 @@ 3114488832,3114489855,SE 3114489856,3114490879,IR 3114490880,3114491903,CH -3114491904,3114492927,GB +3114491904,3114492159,US +3114492160,3114492927,GB 3114492928,3114493951,NL 3114493952,3114495999,RO 3114496000,3114497023,DE @@ -84681,7 +87184,7 @@ 3114616832,3114617855,DK 3114617856,3114618879,GB 3114618880,3114619903,SE -3114619904,3114620927,DE +3114619904,3114620927,US 3114620928,3114621951,IT 3114621952,3114622975,PT 3114622976,3114623999,BG @@ -84711,8 +87214,7 @@ 3114649600,3114650623,RU 3114650624,3114651647,IR 3114651648,3114652671,CH -3114652672,3114653695,US -3114653696,3114654719,DE +3114652672,3114654719,US 3114654720,3114655743,BG 3114655744,3114656767,RU 3114656768,3114657791,DE @@ -84781,7 +87283,7 @@ 3114726400,3114727423,SE 3114727424,3114728447,BE 3114728448,3114729471,GB -3114729472,3114730495,RO +3114729472,3114730495,AU 3114730496,3114731519,GB 3114731520,3114732543,CH 3114732544,3114733567,SY @@ -84794,7 +87296,8 @@ 3114742784,3114743807,IR 3114743808,3114744831,MD 3114744832,3114745855,TR -3114745856,3114747903,RO +3114745856,3114746879,CA +3114746880,3114747903,FR 3114747904,3114748927,IR 3114748928,3114749951,GB 3114749952,3114750975,CH @@ -84831,9 +87334,7 @@ 3114781696,3114782719,NL 3114782720,3114783743,CZ 3114783744,3114784767,PL -3114784768,3114785023,RU -3114785024,3114785279,BZ -3114785280,3114785791,RU +3114784768,3114785791,RU 3114785792,3114786815,FR 3114786816,3114787839,RU 3114787840,3114788863,GB @@ -84909,10 +87410,10 @@ 3114862592,3114863615,AT 3114863616,3114864639,DK 3114864640,3114865663,UA -3114865664,3114866687,US +3114865664,3114866687,IR 3114866688,3114867711,IT 3114867712,3114869759,GB -3114869760,3114870783,US +3114869760,3114870783,IR 3114870784,3114871807,SE 3114871808,3114872831,IT 3114872832,3114873855,MD @@ -84927,7 +87428,9 @@ 3114882048,3114883071,CH 3114883072,3114884095,FR 3114884096,3114885119,CH -3114885120,3114886143,PT +3114885120,3114885375,PT +3114885376,3114885631,DE +3114885632,3114886143,PT 3114886144,3114887167,RU 3114887168,3114888191,DE 3114888192,3114890239,NL @@ -84958,16 +87461,15 @@ 3114915840,3114916863,RU 3114916864,3114917887,LB 3114917888,3114918911,IT -3114918912,3114919423,CH -3114919424,3114919679,UA -3114919680,3114919935,CH +3114918912,3114919935,CH 3114919936,3114920703,GB 3114920704,3114920959,NL 3114920960,3114921983,IT 3114921984,3114923007,CH 3114923008,3114924031,GB 3114924032,3114925055,HU -3114925056,3114926079,DE +3114925056,3114925311,US +3114925312,3114926079,DE 3114926080,3114927103,RU 3114927104,3114928127,NL 3114928128,3114929151,GB @@ -85021,7 +87523,11 @@ 3114977280,3114978303,PL 3114978304,3114979327,RU 3114979328,3114980351,NL -3114980352,3114984447,RO +3114980352,3114981375,DE +3114981376,3114982399,PL +3114982400,3114983423,JP +3114983424,3114983679,RO +3114983680,3114984447,PL 3114984448,3114985471,CZ 3114985472,3114986495,CY 3114986496,3114987519,IR @@ -85096,7 +87602,7 @@ 3115058176,3115059199,BE 3115059200,3115060223,DE 3115060224,3115062271,FR -3115062272,3115063295,GB +3115062272,3115063295,US 3115063296,3115064319,EE 3115064320,3115066367,MD 3115066368,3115067391,NL @@ -85129,10 +87635,13 @@ 3115092992,3115094015,IT 3115094016,3115094527,DE 3115094528,3115095039,NL -3115095040,3115096063,DE +3115095040,3115095551,DE +3115095552,3115096063,CH 3115096064,3115097087,FR 3115097088,3115098111,LT -3115098112,3115100159,NL +3115098112,3115099391,NL +3115099392,3115099647,US +3115099648,3115100159,NL 3115100160,3115101183,ES 3115101184,3115102207,GB 3115102208,3115103231,ES @@ -85161,7 +87670,9 @@ 3115127808,3115128831,NL 3115128832,3115129855,DE 3115129856,3115130879,BA -3115130880,3115131903,DE +3115130880,3115131234,DE +3115131235,3115131235,US +3115131236,3115131903,DE 3115131904,3115132927,RU 3115132928,3115133951,KW 3115133952,3115134975,ES @@ -85206,9 +87717,9 @@ 3115176960,3115177983,IT 3115177984,3115179007,NL 3115179008,3115180031,SE -3115180032,3115180799,DE -3115180800,3115181055,MT -3115181056,3115182079,DE +3115180032,3115180543,DE +3115180544,3115180799,CY +3115180800,3115182079,DE 3115182080,3115183103,NL 3115183104,3115184127,IT 3115184128,3115185151,DE @@ -85222,7 +87733,8 @@ 3115192320,3115193343,HU 3115193344,3115194367,TR 3115194368,3115195391,FI -3115195392,3115196415,DE +3115195392,3115195647,TR +3115195648,3115196415,DE 3115196416,3115197439,LI 3115197440,3115198463,DE 3115198464,3115199487,NL @@ -85240,7 +87752,7 @@ 3115210752,3115211775,FR 3115211776,3115212799,CZ 3115212800,3115213823,GE -3115213824,3115214847,UA +3115213824,3115214847,US 3115214848,3115215871,CH 3115215872,3115216895,GB 3115216896,3115217919,PL @@ -85319,7 +87831,9 @@ 3115290624,3115291647,GB 3115291648,3115292671,FR 3115292672,3115293695,GB -3115293696,3115294719,RU +3115293696,3115293951,US +3115293952,3115294463,RU +3115294464,3115294719,IN 3115294720,3115295743,GB 3115295744,3115296767,NL 3115296768,3115297791,IE @@ -85389,7 +87903,7 @@ 3115366400,3115367423,SE 3115367424,3115368447,ES 3115368448,3115369471,BG -3115369472,3115370495,GB +3115369472,3115370495,MT 3115370496,3115371519,IT 3115371520,3115372543,GB 3115372544,3115373567,LB @@ -85401,19 +87915,22 @@ 3115378688,3115379711,FR 3115379712,3115380735,CH 3115380736,3115381759,GB -3115381760,3115382783,NO +3115381760,3115382271,NO +3115382272,3115382783,SE 3115382784,3115383807,GB 3115383808,3115384831,DE 3115384832,3115385855,TJ 3115385856,3115387903,SK 3115387904,3115388927,MK 3115388928,3115389951,AT -3115389952,3115391999,GB +3115389952,3115390719,GB +3115390720,3115390975,NL +3115390976,3115391999,GB 3115392000,3115393023,AL 3115393024,3115395071,IT 3115395072,3115396095,ES 3115396096,3115397119,FR -3115397120,3115398143,GB +3115397120,3115398143,MT 3115398144,3115399167,RU 3115399168,3115400191,BG 3115400192,3115401215,RU @@ -85460,7 +87977,7 @@ 3115441152,3115442175,NL 3115442176,3115443199,FR 3115443200,3115444223,GB -3115444224,3115445247,US +3115444224,3115445247,IR 3115445248,3115446271,RU 3115446272,3115447295,UA 3115447296,3115448319,IT @@ -85592,15 +88109,14 @@ 3115582464,3115583487,GB 3115583488,3115584511,NL 3115584512,3115584767,AT -3115584768,3115585535,CZ +3115584768,3115585023,US +3115585024,3115585535,CZ 3115585536,3115586559,RU 3115586560,3115587583,CH 3115587584,3115588607,DE 3115588608,3115589631,TR 3115589632,3115590655,GB -3115590656,3115591167,GR -3115591168,3115591183,DE -3115591184,3115591423,GR +3115590656,3115591423,GR 3115591424,3115591679,NL 3115591680,3115592703,CH 3115592704,3115593727,BE @@ -85640,8 +88156,8 @@ 3115628544,3115629567,GB 3115629568,3115630591,RU 3115630592,3115631615,GB -3115631616,3115631871,US -3115631872,3115632639,NL +3115631616,3115631871,NL +3115631872,3115632639,US 3115632640,3115633663,RU 3115633664,3115635711,PL 3115635712,3115636735,RU @@ -85656,7 +88172,8 @@ 3115644928,3115645951,RU 3115645952,3115647999,SE 3115648000,3115649023,FR -3115649024,3115650047,NL +3115649280,3115649535,GB +3115649536,3115649791,DE 3115650048,3115651071,DE 3115651072,3115652095,UA 3115652096,3115653119,DK @@ -85713,7 +88230,7 @@ 3115708416,3115709439,RO 3115709440,3115710463,RU 3115710464,3115711487,GE -3115711488,3115714559,BG +3115711488,3115714559,ES 3115714560,3115715583,GB 3115715584,3115717631,RU 3115717632,3115718655,UA @@ -85726,9 +88243,7 @@ 3115725312,3115725567,DE 3115725568,3115726847,GB 3115726848,3115727871,NL -3115727872,3115728127,GB -3115728128,3115728383,US -3115728384,3115728703,GB +3115727872,3115728703,GB 3115728704,3115728735,NL 3115728736,3115728895,GB 3115728896,3115729919,FR @@ -85801,8 +88316,7 @@ 3115801600,3115802623,LB 3115802624,3115802879,NL 3115802880,3115803135,RO -3115803136,3115803391,NL -3115803392,3115803647,RO +3115803136,3115803647,NL 3115803648,3115804671,GB 3115804672,3115804927,CH 3115804928,3115805183,IT @@ -85871,8 +88385,7 @@ 3115869184,3115870207,DE 3115870208,3115871231,SY 3115871232,3115872255,NL -3115872256,3115872511,PL -3115872512,3115873279,GB +3115872256,3115873279,GB 3115873280,3115874303,CH 3115874304,3115875327,GB 3115875328,3115876351,PL @@ -85971,7 +88484,8 @@ 3115973632,3115974655,UA 3115974656,3115975679,RU 3115975680,3115976703,GB -3115976704,3115977727,NL +3115976704,3115977215,US +3115977216,3115977727,NL 3115977728,3115978751,IT 3115978752,3115980799,PL 3115980800,3115981823,DE @@ -86006,7 +88520,8 @@ 3116008448,3116009471,NO 3116009472,3116010495,BG 3116010496,3116011519,RU -3116011520,3116012543,DE +3116011520,3116012031,DE +3116012032,3116012543,US 3116012544,3116013567,BE 3116013568,3116015615,PL 3116015616,3116016639,CZ @@ -86091,9 +88606,8 @@ 3116102656,3116103679,FR 3116103680,3116104703,HU 3116104704,3116105727,SE -3116105728,3116106751,DE -3116106752,3116107007,US -3116107008,3116107263,JP +3116105728,3116107007,DE +3116107008,3116107263,US 3116107264,3116107775,DE 3116107776,3116108799,ES 3116108800,3116109823,RU @@ -86105,9 +88619,11 @@ 3116114944,3116115967,TR 3116115968,3116116991,NL 3116116992,3116118015,CH -3116118016,3116120063,DE +3116118016,3116119039,DE +3116119040,3116119295,AT +3116119296,3116120063,DE 3116120064,3116121087,HU -3116121088,3116122111,GB +3116121344,3116122111,PT 3116122112,3116123135,DE 3116123136,3116124159,PL 3116124160,3116125183,DE @@ -86140,10 +88656,960 @@ 3116153856,3116154879,SK 3116154880,3116155903,RU 3116155904,3116156927,CH +3116156928,3116157951,DE +3116157952,3116158975,RU +3116158976,3116161023,ES +3116161024,3116162047,AL +3116162048,3116163071,GB +3116163072,3116164095,SE +3116164096,3116165119,BG +3116165120,3116166143,GB +3116166144,3116167167,SK +3116167168,3116170239,DE +3116170240,3116171263,GB +3116171264,3116172287,DE +3116172288,3116173311,CZ +3116173312,3116174335,NL +3116174336,3116176383,RU +3116176384,3116177407,FR +3116177408,3116178431,DE +3116178432,3116179455,SE +3116179456,3116180479,CZ +3116180480,3116181503,RO +3116181504,3116182527,GB +3116182528,3116183551,RO +3116183552,3116184575,SE +3116184576,3116185599,TR +3116185600,3116185855,US +3116185856,3116186623,GB +3116186624,3116187647,IT +3116187648,3116188671,ES +3116188672,3116189695,MD +3116189696,3116190719,NL +3116190720,3116191743,IT +3116191744,3116192767,AT +3116192768,3116193791,SE +3116193792,3116194815,LB +3116194816,3116195839,CZ +3116195840,3116196863,DE +3116196864,3116197887,RU +3116197888,3116198911,NL +3116198912,3116199935,ES +3116199936,3116200191,DE +3116200192,3116200447,FR +3116200448,3116200703,HU +3116200704,3116200959,CZ +3116200960,3116201983,DE +3116201984,3116203007,IR +3116203008,3116204031,PL +3116204032,3116205055,TR +3116205056,3116206079,RU +3116206080,3116207103,PL +3116207104,3116208127,UA +3116208128,3116209151,GB +3116209152,3116210175,CH +3116210176,3116211199,LT +3116211200,3116212223,FR +3116212224,3116213247,NL +3116213248,3116214271,RU +3116214272,3116215295,RO +3116215296,3116216319,FR +3116216320,3116217343,ES +3116217344,3116218367,NL +3116218368,3116219391,UA +3116219392,3116220415,FR +3116220416,3116221439,RU +3116221440,3116222463,BG +3116222464,3116223487,GB +3116223488,3116224511,PL +3116224512,3116225535,GE +3116225536,3116226559,PL +3116226560,3116227583,GE +3116227584,3116228607,DE +3116228608,3116229631,ES +3116229632,3116230655,DE +3116230656,3116231679,GB +3116231680,3116232703,FR +3116232704,3116233727,NL +3116233728,3116234751,UA +3116234752,3116235775,GB +3116235776,3116238847,RU +3116238848,3116239871,UA +3116239872,3116240895,IE +3116240896,3116241151,NL +3116241152,3116241407,FR +3116241408,3116241919,TR +3116241920,3116242943,IR +3116242944,3116243967,NL +3116243968,3116244991,LB +3116244992,3116246015,CH +3116246016,3116247039,BG +3116247040,3116248063,RU +3116248064,3116249087,GB +3116249088,3116249343,AT +3116249344,3116249599,DE +3116249600,3116249855,CH +3116249856,3116250111,AT +3116250112,3116251135,DE +3116251136,3116252159,US +3116252160,3116253183,MD +3116253184,3116254207,NL +3116254208,3116255231,DE +3116255232,3116256255,GB +3116256256,3116257279,AT +3116257280,3116257535,CR +3116257536,3116258303,AT +3116258304,3116259327,NL +3116259328,3116260351,FR +3116260352,3116261375,US +3116261376,3116262399,BG +3116262400,3116263423,ES +3116263424,3116264447,RU +3116264448,3116265471,NL +3116265472,3116266495,CZ +3116266496,3116268543,RU +3116268544,3116269567,DE +3116269568,3116270591,GB +3116270592,3116271615,AL +3116271616,3116272639,IT +3116272640,3116273663,DE +3116273664,3116274687,SE +3116274688,3116275711,UA +3116275712,3116276735,RS +3116276736,3116277759,DE +3116277760,3116278783,IT +3116278784,3116279807,RU +3116279808,3116281855,NO +3116281856,3116282879,ES +3116282880,3116285951,RU +3116285952,3116286975,DE +3116286976,3116287999,GB +3116288000,3116290047,IE +3116290048,3116294143,IT +3116294144,3116295167,US +3116295168,3116297215,NL +3116297216,3116298239,DE +3116298240,3116299263,ES +3116299264,3116300287,CH +3116300288,3116301311,CZ +3116301312,3116302335,ES +3116302336,3116303359,NL +3116303360,3116304383,PT +3116304384,3116305407,ES +3116305408,3116306431,NL +3116306432,3116307455,EE +3116307456,3116308479,ES +3116308480,3116309503,NO +3116309504,3116310527,KZ +3116310528,3116311551,RU +3116311552,3116312575,FR +3116312576,3116314623,ES +3116314624,3116315647,FR +3116315648,3116316671,TJ +3116316672,3116317695,RU +3116317696,3116318719,IT +3116318720,3116319743,ES +3116319744,3116320767,CH +3116320768,3116321791,NL +3116321792,3116322815,IR +3116322816,3116323839,UA +3116323840,3116324863,GB +3116324864,3116325887,ES +3116325888,3116326911,FR +3116326912,3116327935,IT +3116327936,3116328959,NL +3116328960,3116329983,IT +3116329984,3116331007,DE +3116331008,3116332031,UA +3116332032,3116333055,RO +3116333056,3116334079,DE +3116334080,3116335103,NL +3116335104,3116336127,BE +3116336128,3116337151,NL +3116337152,3116338175,SA +3116338176,3116339199,RU +3116339200,3116340223,CH +3116340224,3116341247,UA +3116341248,3116342271,FR +3116342272,3116343295,IE +3116343296,3116344319,GB +3116344320,3116345343,AL +3116345344,3116346367,MD +3116346368,3116347391,DE +3116347392,3116348415,UA +3116348416,3116349439,IT +3116349440,3116350463,CZ +3116350464,3116351487,HU +3116351488,3116352511,FI +3116352512,3116353535,RU +3116353536,3116354559,FR +3116354560,3116355583,IL +3116355584,3116356607,GB +3116356608,3116357631,RU +3116357632,3116358655,DE +3116358656,3116359679,GE +3116359680,3116360703,DE +3116360704,3116361727,US +3116361728,3116362751,IS +3116362752,3116363775,CH +3116363776,3116364799,NL +3116364800,3116365823,PL +3116365824,3116367871,ES +3116367872,3116368895,NL +3116368896,3116369919,GI +3116369920,3116370943,IR +3116370944,3116371967,FI +3116371968,3116372991,NL +3116372992,3116374015,RU +3116374016,3116375039,FI +3116375040,3116376063,DE +3116376064,3116377087,BE +3116377088,3116378111,DE +3116378112,3116379135,GB +3116379136,3116380159,BE +3116380160,3116381183,DE +3116381184,3116382207,LB +3116382208,3116382719,RU +3116382720,3116382975,AQ +3116382976,3116383231,SC +3116383232,3116384255,RU +3116384256,3116385279,DE +3116385280,3116386047,US +3116386048,3116386303,GB +3116386304,3116387327,ES +3116387328,3116388351,DE +3116388352,3116389375,GB +3116389376,3116390399,BG +3116390400,3116391423,IE +3116391424,3116392447,GB +3116392448,3116393471,DE +3116393472,3116394495,PL +3116394496,3116395519,NL +3116395520,3116396543,RU +3116396544,3116397567,IR +3116397568,3116398591,ES +3116398592,3116399615,RO +3116399616,3116399871,IL +3116399872,3116400639,NL +3116400640,3116401663,FI +3116401664,3116402687,NL +3116402688,3116403711,IT +3116403712,3116404735,DE +3116404736,3116405759,NL +3116405760,3116406783,FR +3116406784,3116407807,IE +3116407808,3116408831,RU +3116408832,3116409855,LB +3116409856,3116410879,GB +3116410880,3116412927,DE +3116412928,3116413951,GB +3116413952,3116414975,ES +3116414976,3116415231,NL +3116415232,3116415999,BE +3116416000,3116417023,NL +3116417024,3116418047,CH +3116418048,3116419071,FI +3116419072,3116420095,DE +3116420096,3116421119,BE +3116421120,3116422143,ES +3116422144,3116423167,NL +3116423168,3116424191,UA +3116424192,3116425215,ES +3116425216,3116426239,AT +3116426240,3116427263,GB +3116427264,3116428287,NO +3116428288,3116429311,KW +3116429312,3116430335,PL +3116430336,3116431359,RU +3116431360,3116432383,UA +3116432384,3116433407,HU +3116433408,3116434431,ES +3116434432,3116435455,TR +3116435456,3116436479,ES +3116436480,3116437503,AM +3116437504,3116439551,RU +3116439552,3116440575,LT +3116440576,3116441599,MD +3116441600,3116443135,GB +3116443136,3116443391,FR +3116443392,3116443647,AT +3116443648,3116444671,DE +3116444672,3116445695,FR +3116445696,3116447743,RO +3116447744,3116448767,BG +3116448768,3116449791,EE +3116449792,3116450815,DE +3116450816,3116451839,ES +3116451840,3116452863,NL +3116452864,3116453887,FI +3116453888,3116454911,DE +3116454912,3116455935,CZ +3116455936,3116456959,RU +3116456960,3116457983,NO +3116457984,3116459007,MD +3116459008,3116460031,CZ +3116460032,3116461055,ES +3116461056,3116462079,FR +3116462080,3116464127,PL +3116464128,3116465151,DK +3116465152,3116466175,SE +3116466176,3116467199,CZ +3116467200,3116468223,AZ +3116468224,3116470271,RU +3116470272,3116471295,DE +3116471296,3116472319,GB +3116472320,3116473343,AE +3116473344,3116474367,GB +3116474368,3116475391,PL +3116475392,3116476415,TR +3116476416,3116477439,GB +3116477440,3116478463,ES +3116478464,3116479487,JO +3116479488,3116480511,CH +3116480512,3116481535,NL +3116481536,3116482559,IT +3116482560,3116483583,AT +3116483584,3116484607,RU +3116484608,3116485631,ES +3116485632,3116486655,RU +3116486656,3116488703,IR +3116488704,3116489727,NL +3116489728,3116490751,HU +3116490752,3116491775,CH +3116491776,3116492799,DE +3116492800,3116493823,IR +3116493824,3116494847,DK +3116494848,3116495871,NL +3116495872,3116496895,CH +3116496896,3116497919,RU +3116497920,3116498943,IT +3116498944,3116499967,NL +3116499968,3116500991,IT +3116500992,3116502015,IQ +3116502016,3116504063,NL +3116504064,3116505087,AT +3116505088,3116507135,ES +3116507136,3116508159,RU +3116508160,3116509183,DE +3116509184,3116510207,GB +3116510208,3116511231,CZ +3116511232,3116515327,ES +3116515328,3116516351,UA +3116516352,3116517375,CZ +3116517376,3116518399,SY +3116518400,3116519423,IR +3116519424,3116520447,RU +3116520448,3116521471,BE +3116521472,3116522495,GB +3116522496,3116523519,LU +3116523520,3116524543,TR +3116524544,3116525567,ES +3116525568,3116526335,RU +3116526336,3116526591,GB +3116526592,3116527615,ES +3116527616,3116528639,GB +3116528640,3116529663,NL +3116529664,3116530687,UA +3116530688,3116531711,SY +3116531712,3116532735,FR +3116532736,3116533759,SA +3116533760,3116534783,NL +3116534784,3116535807,DE +3116535808,3116536831,AT +3116536832,3116537855,DE +3116537856,3116538879,LB +3116538880,3116539903,FR +3116539904,3116540927,NL +3116540928,3116541951,FR +3116541952,3116542975,GB +3116542976,3116543999,TR +3116544000,3116545023,ES +3116545024,3116546047,CH +3116546048,3116547071,FR +3116547072,3116548095,UA +3116548096,3116549119,NL +3116549120,3116550143,TJ +3116550144,3116551167,IT +3116551168,3116552191,FR +3116552192,3116553215,ES +3116553216,3116554239,PL +3116554240,3116555263,DE +3116555264,3116557311,PL +3116557312,3116558335,NL +3116558336,3116559359,FR +3116559360,3116560383,DE +3116560384,3116561407,IL +3116561408,3116562431,IR +3116562432,3116563455,NL +3116563456,3116564479,GB +3116564480,3116565503,DK +3116565504,3116566527,MD +3116566528,3116567551,UA +3116567552,3116568575,GB +3116568576,3116569599,RO +3116569600,3116570623,EE +3116570624,3116571647,RU +3116571648,3116572671,BE +3116572672,3116573695,SA +3116573696,3116574719,ES +3116574720,3116575743,UA +3116575744,3116576767,ES +3116576768,3116577791,TR +3116577792,3116578815,HU +3116578816,3116579839,GB +3116579840,3116580863,AT +3116580864,3116581887,RO +3116581888,3116582911,CH +3116582912,3116583935,IR +3116583936,3116584959,TR +3116584960,3116587007,CZ +3116587008,3116588031,FR +3116588032,3116589055,SE +3116589056,3116590079,ES +3116590080,3116591103,DE +3116591104,3116592127,GB +3116592128,3116593151,ES +3116593152,3116594175,DE +3116594176,3116595199,GB +3116595200,3116596223,DK +3116596224,3116597247,GB +3116597248,3116598271,IT +3116598272,3116599295,GB +3116599296,3116600319,BE +3116600320,3116601343,NO +3116601344,3116602367,RU +3116602368,3116603391,DE +3116603392,3116604415,RU +3116604416,3116605439,SI +3116605440,3116606463,MD +3116606464,3116607487,GB +3116607488,3116607743,IL +3116607744,3116608511,RU +3116608512,3116609535,DK +3116609536,3116610559,ES +3116610560,3116611583,DE +3116611584,3116612607,MD +3116612608,3116613631,RU +3116613632,3116614655,PL +3116614656,3116615679,CH +3116615680,3116616703,GB +3116616704,3116617727,ES +3116617728,3116618751,NO +3116618752,3116619775,NL +3116619776,3116620799,DE +3116620800,3116621823,NL +3116621824,3116622847,CZ +3116622848,3116623871,TR +3116623872,3116624895,SE +3116624896,3116625919,GL +3116625920,3116626943,RU +3116626944,3116627967,NL +3116627968,3116628991,FR +3116628992,3116630015,TR +3116630016,3116631039,UA +3116631040,3116632063,FI +3116632064,3116633087,CH +3116633088,3116634111,RO +3116634112,3116635135,ES +3116635136,3116636159,DE +3116636160,3116637183,US +3116637184,3116638207,NL +3116638208,3116639231,ES +3116639232,3116640255,SE +3116640256,3116641279,ES +3116641280,3116642303,NL +3116642304,3116643327,IT +3116643328,3116644351,HU +3116644352,3116645375,ES +3116645376,3116646399,NL +3116646400,3116647423,ES +3116647424,3116648447,UA +3116648448,3116649471,FR +3116649472,3116650495,DK +3116650496,3116651519,GB +3116651520,3116652543,CH +3116652544,3116653567,NO +3116653568,3116654591,NL +3116654592,3116656639,GB +3116656640,3116657663,CH +3116657664,3116658687,DE +3116658688,3116659711,ES +3116659712,3116660735,RU +3116660736,3116661759,DE +3116661760,3116662783,UA +3116662784,3116663807,CH +3116663808,3116664831,GB +3116664832,3116665855,CH +3116665856,3116667903,SY +3116667904,3116668927,IR +3116668928,3116669951,SE +3116669952,3116670975,AT +3116670976,3116673023,IT +3116673024,3116674047,RU +3116674048,3116675071,NL +3116675072,3116676095,AT +3116676096,3116677119,AL +3116677120,3116678143,RU +3116678144,3116679167,NL +3116679168,3116681215,MD +3116681216,3116682239,ES +3116682240,3116684287,GB +3116684288,3116686335,UZ +3116686336,3116687359,NL +3116687360,3116688383,DE +3116688384,3116689407,PL +3116689408,3116690431,FI +3116690432,3116691455,RU +3116691456,3116692479,AT +3116692480,3116693503,RU +3116693504,3116696575,ES +3116696576,3116697599,MK +3116697600,3116698623,IT +3116698624,3116699647,RU +3116699648,3116700671,NL +3116700672,3116701695,SY +3116701696,3116702719,NL +3116702720,3116703743,DE +3116703744,3116704767,RU +3116704768,3116705791,BE +3116705792,3116706815,CH +3116706816,3116707839,AT +3116707840,3116708863,ES +3116708864,3116711935,GB +3116711936,3116712959,ES +3116712960,3116713983,IR +3116713984,3116715007,RU +3116715008,3116716031,ES +3116716032,3116717055,NL +3116717056,3116718079,FR +3116718080,3116719103,ES +3116719104,3116720127,SE +3116720128,3116721151,LU +3116721152,3116724223,FR +3116724224,3116725247,IR +3116725248,3116726271,NO +3116726272,3116727295,MD +3116727296,3116728319,TR +3116728320,3116729343,IT +3116729344,3116729599,DE +3116729600,3116730367,CH +3116730368,3116731391,DK +3116731392,3116732415,IT +3116732416,3116733439,RU +3116733440,3116734463,DK +3116734464,3116735487,BG +3116735488,3116736511,FR +3116736512,3116737535,GB +3116737536,3116738559,DE +3116738560,3116739583,DK +3116739584,3116740607,DE +3116740608,3116741631,JO +3116741632,3116742655,PL +3116742656,3116743679,FR +3116743680,3116744703,NL +3116744704,3116745727,DE +3116745728,3116746751,TR +3116746752,3116747775,ES +3116747776,3116748031,IL +3116748032,3116748287,US +3116748288,3116748799,IL +3116748800,3116749823,NO +3116749824,3116750847,IT +3116750848,3116751871,ES +3116751872,3116752895,NO +3116752896,3116753919,SE +3116753920,3116754943,IT +3116754944,3116755967,RU +3116755968,3116756991,DE +3116756992,3116758015,NL +3116758016,3116759039,ES +3116759040,3116760063,DE +3116760064,3116761087,FR +3116761088,3116762111,PL +3116762112,3116763135,SE +3116763136,3116763146,US +3116763147,3116763166,GB +3116763167,3116763167,FR +3116763168,3116763168,AU +3116763169,3116763177,US +3116763178,3116763178,FR +3116763179,3116763182,US +3116763183,3116763183,FR +3116763184,3116763189,US +3116763190,3116763190,FR +3116763191,3116763193,US +3116763194,3116763194,FR +3116763195,3116763196,US +3116763197,3116763197,AU +3116763198,3116763201,US +3116763202,3116763202,FR +3116763203,3116763213,US +3116763214,3116763214,FR +3116763215,3116763234,US +3116763235,3116763235,FR +3116763236,3116763240,US +3116763241,3116763241,FR +3116763242,3116763246,US +3116763247,3116763247,FR +3116763248,3116763252,US +3116763253,3116763253,FR +3116763254,3116763255,US +3116763256,3116763256,FR +3116763257,3116763259,US +3116763260,3116763260,FR +3116763261,3116763265,US +3116763266,3116763266,FR +3116763267,3116763268,US +3116763269,3116763269,FR +3116763270,3116763270,US +3116763271,3116763271,FR +3116763272,3116763275,US +3116763276,3116763276,FR +3116763277,3116763278,US +3116763279,3116763279,FR +3116763280,3116763286,US +3116763287,3116763287,FR +3116763288,3116763303,US +3116763304,3116763304,FR +3116763305,3116763306,US +3116763307,3116763307,FR +3116763308,3116763402,US +3116763403,3116763422,GB +3116763423,3116763436,US +3116763437,3116763437,FR +3116763438,3116763440,US +3116763441,3116763441,FR +3116763442,3116763451,US +3116763452,3116763452,FR +3116763453,3116763458,US +3116763459,3116763459,FR +3116763460,3116763463,US +3116763464,3116763464,FR +3116763465,3116763469,US +3116763470,3116763470,FR +3116763471,3116763474,US +3116763475,3116763475,FR +3116763476,3116763480,US +3116763481,3116763481,FR +3116763482,3116763483,US +3116763484,3116763484,FR +3116763485,3116763487,US +3116763488,3116763488,FR +3116763489,3116763492,US +3116763493,3116763493,FR +3116763494,3116763499,US +3116763500,3116763500,FR +3116763501,3116763503,US +3116763504,3116763504,FR +3116763505,3116763512,US +3116763513,3116763513,FR +3116763514,3116763515,US +3116763516,3116763516,AU +3116763517,3116763517,FR +3116763518,3116763520,US +3116763521,3116763521,FR +3116763522,3116763524,US +3116763525,3116763525,FR +3116763526,3116763528,US +3116763529,3116763529,FR +3116763530,3116763533,US +3116763534,3116763534,FR +3116763535,3116763538,US +3116763539,3116763539,FR +3116763540,3116763658,US +3116763659,3116763678,FR +3116763679,3116763680,US +3116763681,3116763681,FR +3116763682,3116763684,US +3116763685,3116763685,FR +3116763686,3116763687,US +3116763688,3116763688,FR +3116763689,3116763692,US +3116763693,3116763693,FR +3116763694,3116763699,US +3116763700,3116763700,FR +3116763701,3116763705,US +3116763706,3116763706,FR +3116763707,3116763717,US +3116763718,3116763718,FR +3116763719,3116763722,US +3116763723,3116763723,FR +3116763724,3116763729,US +3116763730,3116763730,FR +3116763731,3116763742,US +3116763743,3116763743,FR +3116763744,3116763747,US +3116763748,3116763748,FR +3116763749,3116763751,US +3116763752,3116763752,FR +3116763753,3116763756,US +3116763757,3116763757,FR +3116763758,3116763769,US +3116763770,3116763770,FR +3116763771,3116763774,US +3116763775,3116763775,FR +3116763776,3116763778,US +3116763779,3116763779,FR +3116763780,3116763782,US +3116763783,3116763783,FR +3116763784,3116763787,US +3116763788,3116763788,FR +3116763789,3116763791,US +3116763792,3116763792,FR +3116763793,3116763796,US +3116763797,3116763797,FR +3116763798,3116763830,US +3116763831,3116763831,AU +3116763832,3116763914,US +3116763915,3116763934,FR +3116763935,3116763935,AU +3116763936,3116763945,US +3116763946,3116763946,FR +3116763947,3116763949,US +3116763950,3116763950,FR +3116763951,3116763951,US +3116763952,3116763952,FR +3116763953,3116763954,US +3116763955,3116763955,FR +3116763956,3116763958,US +3116763959,3116763959,FR +3116763960,3116763966,US +3116763967,3116763967,FR +3116763968,3116763980,US +3116763981,3116763981,FR +3116763982,3116763984,US +3116763985,3116763985,FR +3116763986,3116763995,US +3116763996,3116763996,FR +3116763997,3116764000,US +3116764001,3116764001,FR +3116764002,3116764003,US +3116764004,3116764004,FR +3116764005,3116764007,US +3116764008,3116764008,FR +3116764009,3116764012,US +3116764013,3116764013,FR +3116764014,3116764016,US +3116764017,3116764017,FR +3116764018,3116764022,US +3116764023,3116764023,FR +3116764024,3116764024,US +3116764025,3116764025,FR +3116764026,3116764031,US +3116764032,3116764032,FR +3116764033,3116764038,US +3116764039,3116764039,FR +3116764040,3116764045,US +3116764046,3116764046,FR +3116764047,3116764145,US +3116764146,3116764146,FR +3116764147,3116764159,US +3116764160,3116764175,GB +3116764176,3116764191,US +3116764192,3116765183,GB +3116765184,3116766207,PL +3116766208,3116767231,FR +3116767232,3116768255,DE +3116768256,3116769279,GB +3116769280,3116770303,LT +3116770304,3116772351,RU +3116772352,3116773375,MD +3116773376,3116774399,ES +3116774400,3116775423,TR +3116775424,3116775679,RO +3116775680,3116776447,NL +3116776448,3116777471,IT +3116777472,3116778495,ES +3116778496,3116779519,GB +3116779520,3116780543,TR +3116780544,3116781567,FR +3116781568,3116782591,SE +3116782592,3116783615,GB +3116783616,3116784639,DE +3116784640,3116785663,NO +3116785664,3116786687,IT +3116786688,3116787711,ES +3116787712,3116788735,CY +3116788736,3116789759,ES +3116789760,3116790783,RU +3116790784,3116792831,IT +3116792832,3116793855,TR +3116793856,3116794879,FR +3116794880,3116795903,GB +3116795904,3116796927,LT +3116796928,3116797951,CH +3116797952,3116798975,IS +3116798976,3116799999,DE +3116800000,3116801023,RU +3116801024,3116802047,IT +3116802048,3116803071,IR +3116803072,3116804095,NL +3116804096,3116805119,HU +3116805120,3116806143,SY +3116806144,3116809215,ES +3116809216,3116810239,GB +3116810240,3116811263,SE +3116811264,3116812287,TR +3116812288,3116813311,DE +3116813312,3116814335,CH +3116814336,3116815359,IT +3116815360,3116816383,MD +3116816384,3116818431,DE +3116818432,3116819455,FR +3116819456,3116820479,GB +3116820480,3116822527,AT +3116822528,3116823551,US +3116823552,3116824575,RO +3116824576,3116825599,FR +3116825600,3116826623,IR +3116826624,3116827647,DE +3116827648,3116829695,RU +3116829696,3116830719,CY +3116830720,3116831743,GB +3116831744,3116832767,MD +3116832768,3116833791,IT +3116833792,3116834815,HU +3116834816,3116835839,FR +3116835840,3116836863,BG +3116836864,3116837887,FR +3116837888,3116838911,ES +3116838912,3116839935,IT +3116839936,3116841983,GB +3116841984,3116843007,DE +3116843008,3116844031,IR +3116844032,3116845055,DE +3116845056,3116846079,IT +3116846080,3116847103,DE +3116847104,3116848127,AT +3116848128,3116849151,CZ +3116849152,3116850175,TR +3116850176,3116851199,NL +3116851200,3116852223,UA +3116852224,3116854271,DE +3116854272,3116855295,NL +3116855296,3116856319,IT +3116856320,3116857343,NL +3116857344,3116858367,RS +3116858368,3116859391,NL +3116859392,3116860415,GB +3116860416,3116861439,DE +3116861440,3116862463,SE +3116862464,3116863487,DE +3116863488,3116864511,RU +3116864512,3116865535,ES +3116865536,3116866559,AT +3116866560,3116867583,ES +3116867584,3116868607,RU +3116868608,3116869631,GB +3116869632,3116870655,SE +3116870656,3116871679,RO +3116871680,3116872703,CH +3116872704,3116873727,BE +3116873728,3116874751,FR +3116874752,3116875775,NL +3116875776,3116876799,DE +3116876800,3116877823,IR +3116877824,3116878847,FR +3116878848,3116879871,DE +3116879872,3116880895,IR +3116880896,3116881919,ES +3116881920,3116882943,DE +3116882944,3116883967,GB +3116883968,3116884991,US +3116884992,3116886015,ES +3116886016,3116887039,NL +3116887040,3116888063,DK +3116888064,3116889087,GB +3116889088,3116890111,SY +3116890112,3116891135,LU +3116891136,3116892159,PL +3116892160,3116893183,HR +3116893184,3116895231,DE +3116895232,3116896255,ES +3116896256,3116897279,RU +3116897280,3116898303,TR +3116898304,3116899327,ES +3116899328,3116900351,TR +3116900352,3116901375,DE +3116901376,3116902399,GB +3116902400,3116903423,BG +3116903424,3116905471,PL +3116905472,3116906495,AE +3116906496,3116907519,DE +3116907520,3116908543,UA +3116908544,3116909567,GB +3116909568,3116910591,EE +3116910592,3116911615,DK +3116911616,3116912639,ES +3116912640,3116913663,PL +3116913664,3116914687,IE +3116914688,3116915711,IT +3116915712,3116916735,GB +3116916736,3116919807,NL +3116919808,3116920831,CZ +3116920832,3116921855,ES +3116921856,3116922367,SG +3116922368,3116922623,GB +3116922624,3116922879,NL +3116922880,3116923903,PL +3116923904,3116924927,OM +3116924928,3116925951,JO +3116925952,3116926975,NL +3116926976,3116927999,DE +3116928000,3116929023,RU +3116929024,3116930047,FR +3116930048,3116931071,IT +3116931072,3116932095,RU +3116932096,3116933119,BG +3116933120,3116934143,RU +3116934144,3116935167,FR +3116935168,3116936191,RU +3116936192,3116937215,GB +3116937216,3116938239,RO +3116938240,3116939263,IT +3116939264,3116940287,SE +3116940288,3116941055,RU +3116941056,3116941311,FI +3116941312,3116942335,FR +3116942336,3116943359,CY +3116943360,3116944383,FR +3116944384,3116945407,GB +3116945408,3116946431,US +3116946432,3116947455,AL +3116947456,3116948479,RU +3116948480,3116949503,CH +3116949504,3116950527,DE +3116950528,3116951551,ES +3116951552,3116952575,NL +3116952576,3116953599,FR +3116953600,3116954623,RU +3116954624,3116955647,NL +3116955648,3116956671,AL +3116956672,3116957695,NO +3116957696,3116958719,GB +3116958720,3116959743,ES +3116959744,3116960767,DE +3116960768,3116961791,CZ +3116961792,3116962815,NL +3116962816,3116963839,DE +3116963840,3116964863,GE +3116964864,3116965887,RU +3116965888,3116966911,GB +3116966912,3116967935,BG +3116967936,3116968959,DE +3116968960,3116969983,RU +3116969984,3116971007,IR +3116971008,3116972031,RU +3116972032,3116973055,GR +3116973056,3116974079,GB +3116974080,3116975103,IT +3116975104,3116976127,PL +3116976128,3116977151,ES +3116977152,3116978175,IT +3116978176,3116979199,BG 3117416448,3117417471,FR 3120562176,3120594943,CO 3120594944,3120599039,AR -3120599040,3120601087,EC 3120601088,3120602111,AR 3120602112,3120603135,BO 3120603136,3120610303,AR @@ -86160,29 +89626,25 @@ 3120691200,3120693247,CO 3120693248,3120726015,BO 3120726016,3120734207,HN -3120734208,3120735487,RU +3120734208,3120735487,BZ 3120735488,3120735743,NL -3120735744,3120735999,BZ -3120736000,3120736255,RU +3120735744,3120736255,BZ 3120736256,3120736511,EC 3120736512,3120736767,BZ 3120736768,3120737023,RU -3120737024,3120737279,BZ -3120737280,3120737535,RU -3120737536,3120738303,BZ +3120737024,3120737791,BZ +3120737792,3120738303,EC 3120738304,3120742399,CW 3120742400,3120754687,PY 3120754688,3120755711,CR 3120755712,3120756735,GF -3120757504,3120757759,BZ +3120756736,3120757759,BR 3120757760,3120758783,CL 3120758784,3120824319,EC 3120824320,3120840703,CR 3120840704,3120857087,AR 3120857088,3120922623,EC -3120922624,3120922879,PA -3120922880,3120922943,CR -3120922944,3120930815,PA +3120922624,3120930815,PA 3120930816,3120934911,CR 3120934912,3120949247,AR 3120949248,3120951295,CL @@ -86198,9 +89660,7 @@ 3121872896,3122003967,CL 3122003968,3122135039,AR 3122135040,3122282495,VE -3122282496,3122290687,US -3122290688,3122292735,AR -3122292736,3122294783,US +3122282496,3122294783,AR 3122294784,3122298879,CR 3122298880,3122331647,VE 3122331648,3122364415,BO @@ -86211,30 +89671,7 @@ 3122700288,3122716671,CR 3122716672,3122722815,HN 3122722816,3122724863,SV -3122724864,3122726911,US -3122726912,3122728447,AR -3122728448,3122728959,US -3122728960,3122729471,AR -3122729472,3122729983,US -3122729984,3122731007,AR -3122731008,3122731519,US -3122731520,3122732031,AR -3122732032,3122733055,US -3122733056,3122734079,AR -3122734080,3122734591,US -3122734592,3122735103,AR -3122735104,3122735615,US -3122735616,3122736127,AR -3122736128,3122736383,US -3122736384,3122737407,AR -3122737408,3122738431,US -3122738432,3122739199,AR -3122739200,3122739455,US -3122739456,3122739711,AR -3122739712,3122740223,US -3122740224,3122740479,AR -3122740480,3122740735,US -3122740736,3122741247,AR +3122724864,3122741247,AR 3122741248,3122757631,DO 3122757632,3122774015,EC 3122774016,3122790399,AR @@ -86261,21 +89698,10 @@ 3124840448,3124842495,CL 3124842496,3124844543,AR 3124844544,3124845567,BZ -3124845568,3124846591,CR 3124846592,3124848639,AR -3124848640,3124849663,PA +3124848640,3124849663,BR 3124849664,3124850687,AR -3124850688,3124851471,HN -3124851472,3124851487,CM -3124851488,3124851855,HN -3124851856,3124851863,IN -3124851864,3124852175,HN -3124852176,3124852191,PH -3124852192,3124853103,HN -3124853104,3124853119,VN -3124853120,3124853887,HN -3124853888,3124853903,FR -3124853904,3124854783,HN +3124850688,3124854783,HN 3124854784,3124887551,CL 3124887552,3124953087,EC 3124953088,3125018623,CL @@ -86285,30 +89711,13 @@ 3125673984,3125805055,CL 3125805056,3126329343,CO 3126329344,3126853631,VE -3126853632,3126855807,AR -3126855808,3126855935,US -3126855936,3126857855,AR -3126857856,3126857983,US -3126857984,3126858495,AR -3126858496,3126858623,US -3126858624,3126860415,AR -3126860416,3126860543,US -3126860544,3126860671,AR -3126860672,3126860799,US -3126860800,3126861311,AR -3126861312,3126861439,US -3126861440,3126862591,AR -3126862592,3126862719,US -3126862720,3126863999,AR -3126864000,3126864127,US -3126864128,3126870015,AR -3126870016,3126873343,VE -3126873344,3126873599,PA -3126873600,3126874111,VE +3126853632,3126870015,AR +3126870016,3126874111,VE 3126874112,3126878207,CR -3126878208,3126882303,PA -3126882304,3126886399,US -3126886400,3126918143,AR +3126878208,3126886399,PA +3126886400,3126906879,AR +3126906880,3126910975,TT +3126910976,3126918143,AR 3126918144,3126919167,HN 3126919168,3127115775,CO 3127115776,3127181311,AR @@ -86328,17 +89737,13 @@ 3130284032,3130286079,DO 3130286080,3130290175,PA 3130290176,3130302463,AR -3130302464,3130302975,CY -3130302976,3130312703,PA +3130302464,3130306559,PA +3130306560,3130310655,CO 3130312704,3130314751,AR 3130314752,3130315775,CL 3130315776,3130316799,CR -3130316800,3130317823,AW -3130317824,3130318847,CW -3130318848,3130319871,AR -3130319872,3130320639,RU -3130320640,3130320895,BR -3130320896,3130327039,AR +3130316800,3130318847,CW +3130318848,3130327039,AR 3130327040,3130458111,DO 3130458112,3130523647,GT 3130523648,3130654719,AR @@ -86358,27 +89763,23 @@ 3132096512,3132211199,CR 3132211200,3132227583,AR 3132227584,3132293119,EC -3132293120,3132295647,HN -3132295648,3132295679,UY -3132295680,3132297791,HN -3132297792,3132297807,US -3132297808,3132297839,HN -3132297840,3132297855,US -3132297856,3132297887,HN -3132297888,3132297903,US -3132297904,3132300383,HN -3132300384,3132300391,US -3132300392,3132302319,HN -3132302320,3132302335,NL -3132302336,3132302975,HN -3132302976,3132302983,NL -3132302984,3132304303,HN -3132304304,3132304311,DE -3132304312,3132306239,HN -3132306240,3132306271,DE -3132306272,3132308367,HN -3132308368,3132308375,US -3132308376,3132309503,HN +3132293120,3132298007,HN +3132298008,3132298015,US +3132298016,3132298127,HN +3132298128,3132298143,US +3132298144,3132301727,HN +3132301728,3132301743,NL +3132301744,3132304127,HN +3132304128,3132304383,US +3132304384,3132304607,HN +3132304608,3132304623,DE +3132304624,3132305143,HN +3132305144,3132305151,NL +3132305152,3132307823,HN +3132307824,3132307839,US +3132307840,3132308775,HN +3132308776,3132308783,US +3132308784,3132309503,HN 3132309504,3132313599,CR 3132313600,3132317695,CL 3132317696,3132321791,CO @@ -86391,21 +89792,28 @@ 3132588032,3132620799,CO 3132620800,3132915711,VE 3132915712,3132948479,PA -3132948480,3133014015,AR +3132948480,3132981247,AR +3132981248,3132997631,AW +3132997632,3133014015,AR 3133014016,3133046783,HT 3133046784,3133067263,AR -3133067264,3133071359,PA -3133071360,3133071871,CY -3133071872,3133073407,PA +3133067264,3133073407,PA 3133073408,3133074431,CW 3133074432,3133075455,CL 3133075456,3133079551,CW 3133079552,3133145087,AR 3133145088,3133311999,BR 3133312000,3133313023,MX -3133313024,3136985087,BR -3136985088,3136986111,AR -3136986112,3140614143,BR +3133313024,3133317119,BR +3133321216,3136983039,BR +3136984064,3136985087,BR +3136985088,3136985947,AR +3136985948,3136985951,BR +3136985952,3136986015,AR +3136986016,3136986023,BR +3136986024,3136986111,AR +3136986112,3140587519,BR +3140599808,3140614143,BR 3140614144,3140616191,CR 3140616192,3145727999,BR 3145728000,3149135871,MX @@ -86451,7 +89859,13 @@ 3156672512,3156738047,GB 3156738048,3156803583,DE 3156803584,3156869119,TR -3156869120,3156901887,LU +3156869120,3156876287,LU +3156876288,3156877311,RU +3156877312,3156893695,LU +3156893696,3156894719,IN +3156894720,3156897791,LU +3156897792,3156899839,US +3156899840,3156901887,SG 3156901888,3156906239,NL 3156906240,3156907007,LU 3156907008,3156908031,RU @@ -86578,8 +89992,8 @@ 3158638592,3158704127,LT 3158704128,3158835199,KW 3158835200,3158851583,IQ -3158851584,3158852607,NL -3158852608,3158853119,ES +3158851584,3158852863,NL +3158852864,3158853119,ES 3158853120,3158853631,NL 3158853632,3158855679,RU 3158855680,3158857727,US @@ -86762,7 +90176,7 @@ 3161571328,3161587711,UZ 3161587712,3161604095,RU 3161604096,3161612287,PL -3161612288,3161613311,BR +3161612288,3161613311,US 3161613312,3161614335,IT 3161614336,3161614847,US 3161614848,3161615103,ES @@ -86990,13 +90404,9 @@ 3164946160,3164946175,GB 3164946176,3164946351,FR 3164946352,3164946367,GB -3164946368,3164946435,FR -3164946436,3164946439,PT -3164946440,3164946479,FR +3164946368,3164946479,FR 3164946480,3164946483,ES -3164946484,3164946499,FR -3164946500,3164946503,GB -3164946504,3164946527,FR +3164946484,3164946527,FR 3164946528,3164946559,FI 3164946560,3164947023,FR 3164947024,3164947039,FI @@ -87057,9 +90467,7 @@ 3164960392,3164960395,GB 3164960396,3164960439,FR 3164960440,3164960443,DE -3164960444,3164960511,FR -3164960512,3164960527,ES -3164960528,3164960671,FR +3164960444,3164960671,FR 3164960672,3164960675,ES 3164960676,3164960699,FR 3164960700,3164960703,ES @@ -87112,9 +90520,7 @@ 3164970414,3164970415,IT 3164970416,3164970631,FR 3164970632,3164970639,ES -3164970640,3164970847,FR -3164970848,3164970851,IE -3164970852,3164970927,FR +3164970640,3164970927,FR 3164970928,3164970943,ES 3164970944,3164971479,FR 3164971480,3164971483,FI @@ -87157,7 +90563,9 @@ 3164978624,3164978655,ES 3164978656,3164979151,FR 3164979152,3164979155,ES -3164979156,3164995583,FR +3164979156,3164995345,FR +3164995346,3164995346,GB +3164995347,3164995583,FR 3164995584,3165030399,NL 3165030400,3165031423,GB 3165031424,3165032447,NL @@ -87165,7 +90573,9 @@ 3165036544,3165038591,DE 3165038592,3165040639,GB 3165040640,3165044735,SG -3165044736,3165047807,NL +3165044736,3165045759,DE +3165045760,3165046783,SG +3165046784,3165047807,NL 3165047808,3165061119,SG 3165061120,3165126655,SK 3165126656,3165192191,RU @@ -87217,7 +90627,7 @@ 3165452800,3165453055,AT 3165453056,3165453311,US 3165453312,3165453567,PE -3165453568,3165453823,ES +3165453568,3165453823,US 3165453824,3165454335,AT 3165454336,3165519871,RO 3165519872,3165585407,DE @@ -87259,7 +90669,8 @@ 3167753216,3167755263,ES 3167755264,3167757311,RO 3167757312,3167757823,BE -3167757824,3167758335,US +3167757824,3167757824,US +3167757825,3167758335,GB 3167758336,3167758463,NL 3167758464,3167760383,RO 3167760384,3167762431,GB @@ -87281,7 +90692,7 @@ 3167780864,3167783935,RO 3167783936,3167784447,ES 3167784448,3167784703,CA -3167784704,3167784959,ES +3167784704,3167784959,PT 3167784960,3167797247,IR 3167797248,3167798271,MD 3167798272,3167798783,RO @@ -87349,8 +90760,7 @@ 3168005888,3168006143,NL 3168006144,3168008191,SE 3168008192,3168008447,RO -3168008448,3168008703,GB -3168008704,3168010239,US +3168008448,3168010239,DE 3168010240,3168011519,MD 3168011520,3168011775,RO 3168011776,3168012287,IR @@ -87366,13 +90776,15 @@ 3168020480,3168022527,MD 3168022528,3168035839,IR 3168035840,3168036863,RO -3168036864,3168037887,GB +3168036864,3168037887,US 3168037888,3168038399,SE 3168038400,3168038911,RO 3168038912,3168039935,MD 3168039936,3168040959,BE 3168040960,3168041215,DE -3168041216,3168047103,RO +3168041216,3168044799,RO +3168044800,3168045055,US +3168045056,3168047103,RO 3168047104,3168049151,IR 3168049152,3168049407,RO 3168049408,3168049663,IT @@ -87441,7 +90853,7 @@ 3168145408,3168147455,RO 3168147456,3168147967,FR 3168147968,3168151551,RO -3168151552,3168153599,DE +3168151552,3168153599,US 3168153600,3168154111,RO 3168154112,3168154367,SG 3168154368,3168155135,RO @@ -87586,7 +90998,8 @@ 3169851392,3169853439,NL 3169853440,3169854463,AU 3169854464,3169855487,ES -3169855488,3169856511,RO +3169855488,3169855999,US +3169856000,3169856511,RO 3169856512,3169857023,IT 3169857024,3169862911,RO 3169862912,3169863167,IT @@ -87717,103 +91130,24 @@ 3187826688,3187834879,AR 3187834880,3187843071,CW 3187843072,3187846143,AW -3187846144,3187849215,CW -3187849216,3187849471,CO -3187849472,3187851263,CW +3187846144,3187851263,CW 3187851264,3187855359,PY -3187855360,3187855871,CY -3187855872,3187857407,PA +3187855360,3187857407,PA 3187857408,3187859455,CR 3187859456,3187863551,PA 3187863552,3187908607,AR -3187908608,3187910655,CO -3187910656,3187913727,CL -3187913728,3187913983,PT -3187913984,3187914751,CL +3187910656,3187914751,CL 3187914752,3187916799,BO 3187916800,3187933183,CO -3187933184,3187933311,HN -3187933312,3187933341,GT +3187933184,3187933341,GT 3187933342,3187933342,HN -3187933343,3187935519,GT -3187935520,3187935527,HN -3187935528,3187935543,GT -3187935544,3187935551,HN -3187935552,3187935607,GT -3187935608,3187935615,HN -3187935616,3187936047,GT -3187936048,3187936063,HN -3187936064,3187936583,GT -3187936584,3187936591,HN -3187936592,3187936711,GT -3187936712,3187936719,HN -3187936720,3187937799,GT -3187937800,3187937807,HN -3187937808,3187939847,GT -3187939848,3187939855,HN -3187939856,3187940479,GT -3187940480,3187940543,HN -3187940544,3187940823,GT -3187940824,3187940831,HN -3187940832,3187940963,GT -3187940964,3187940967,HN -3187940968,3187941207,GT -3187941208,3187941215,HN -3187941216,3187941647,GT -3187941648,3187941655,HN -3187941656,3187942271,GT -3187942272,3187942279,HN -3187942280,3187942563,GT -3187942564,3187942567,HN -3187942568,3187943055,GT -3187943056,3187943063,HN -3187943064,3187943127,GT -3187943128,3187943135,HN -3187943136,3187943399,GT -3187943400,3187943403,HN -3187943404,3187943551,GT -3187943552,3187943679,HN -3187943680,3187944383,GT -3187944384,3187944399,HN -3187944400,3187944671,GT -3187944672,3187944679,HN -3187944680,3187944773,GT +3187933343,3187944351,GT +3187944352,3187944359,HN +3187944360,3187944773,GT 3187944774,3187944774,HN -3187944775,3187944831,GT -3187944832,3187944835,HN -3187944836,3187944855,GT -3187944856,3187944859,HN -3187944860,3187945343,GT -3187945344,3187945471,HN -3187945472,3187945971,GT -3187945972,3187945975,HN -3187945976,3187946111,GT -3187946112,3187946239,HN -3187946240,3187946495,GT -3187946496,3187946511,HN -3187946512,3187946639,GT -3187946640,3187946647,HN -3187946648,3187946687,GT -3187946688,3187946695,HN -3187946696,3187946887,GT -3187946888,3187946895,HN -3187946896,3187946975,GT -3187946976,3187946979,HN -3187946980,3187947983,GT -3187947984,3187947987,HN -3187947988,3187947999,GT -3187948000,3187948159,HN -3187948160,3187948367,GT -3187948368,3187948375,HN -3187948376,3187948479,GT -3187948480,3187948543,HN -3187948544,3187948799,GT -3187948800,3187948927,HN -3187948928,3187949115,GT -3187949116,3187949119,HN -3187949120,3187949311,GT -3187949312,3187949439,HN -3187949440,3187949567,GT +3187944775,3187948031,GT +3187948032,3187948159,HN +3187948160,3187949567,GT 3187949568,3187950126,BQ 3187950127,3187950127,CW 3187950128,3187953663,BQ @@ -87841,23 +91175,18 @@ 3188113408,3188117503,HN 3188117504,3188121599,AR 3188121600,3188125695,TT -3188125696,3188137175,AR -3188137176,3188137183,DE -3188137184,3188146175,AR -3188146176,3188148911,CO -3188148912,3188148915,PE -3188148916,3188152171,CO -3188152172,3188152175,PE -3188152176,3188170751,CO +3188125696,3188146175,AR +3188146176,3188149335,CO +3188149336,3188149339,PE +3188149340,3188170751,CO 3188170752,3188174847,CR 3188174848,3188178943,BR 3188178944,3188187135,CR -3188187136,3188203519,AR +3188187136,3188199423,AR 3188203520,3188207615,DO 3188207616,3188211711,AR 3188211712,3188228095,CL 3188228096,3188236287,PE -3188236288,3188237311,PA 3188237312,3188239359,VE 3188239360,3188240383,PE 3188240384,3188241407,CO @@ -87867,17 +91196,7 @@ 3188248576,3188248703,CL 3188248704,3188260863,CO 3188260864,3188269055,AR -3188269056,3188269439,MX -3188269440,3188269567,CO -3188269568,3188269823,MX -3188269824,3188270079,PA -3188270080,3188270335,MX -3188270336,3188270719,PA -3188270720,3188270783,MX -3188270784,3188270847,PA -3188270848,3188271103,BR -3188271104,3188273151,MX -3188273152,3188275199,PA +3188269056,3188275199,PA 3188275200,3188277247,CL 3188277248,3188293631,CO 3188293632,3188301823,VE @@ -87888,33 +91207,15 @@ 3188400128,3188408319,AR 3188408320,3188416511,BO 3188416512,3188445183,AR -3188445184,3188449279,PE 3188449280,3188453375,HN 3188453376,3188473855,EC 3188473856,3188482047,PE 3188482048,3188490239,AR 3188490240,3188498431,CO -3188498432,3188511103,AR -3188511104,3188511231,US -3188511232,3188512127,AR -3188512128,3188512255,US -3188512256,3188513407,AR -3188513408,3188513535,US -3188513536,3188516095,AR -3188516096,3188516223,US -3188516224,3188517119,AR -3188517120,3188517247,US -3188517248,3188517759,AR -3188517760,3188517887,US -3188517888,3188518271,AR -3188518272,3188518399,US -3188518400,3188523007,AR +3188498432,3188523007,AR 3188523008,3188539391,CO -3188539392,3188542207,CL -3188542208,3188542463,US -3188542464,3188543487,CL -3188543488,3188543999,CY -3188544000,3188545535,PA +3188539392,3188543487,CL +3188543488,3188545535,PA 3188545536,3188547583,AR 3188547584,3188551679,CO 3188551680,3188552703,AR @@ -87936,8 +91237,7 @@ 3188662272,3188670463,BR 3188670464,3188674559,HN 3188674560,3188678655,AR -3188678656,3188682751,BR -3188682752,3188686847,AR +3188678656,3188686847,BR 3188686848,3188690943,EC 3188690944,3188695039,CU 3188695040,3188697087,EC @@ -87959,23 +91259,22 @@ 3191095296,3191099391,EC 3191099392,3191103487,AR 3191103488,3191107583,VE -3191107584,3191108271,PE -3191108272,3191108287,MX -3191108288,3191108607,PE -3191108608,3191108639,MX -3191108640,3191108959,PE +3191107584,3191108959,PE 3191108960,3191108991,CO 3191108992,3191109119,PE -3191109120,3191111167,MX -3191111168,3191111679,PE +3191109120,3191109631,MX +3191109632,3191111679,PE 3191111680,3191128063,PY 3191128064,3191132159,EC 3191132160,3191136255,AR 3191136256,3191144447,DO -3191144448,3191152639,SV -3191152640,3191155711,NI +3191144448,3191153663,SV +3191153664,3191154175,NI +3191154176,3191154687,SV +3191154688,3191155711,NI 3191155712,3191156223,SV -3191156224,3191156735,NI +3191156224,3191156479,NI +3191156480,3191156735,SV 3191156736,3191169023,HN 3191169024,3191193599,SV 3191193600,3191209983,HN @@ -87986,66 +91285,31 @@ 3191439360,3191455743,EC 3191455744,3191472127,AR 3191472128,3191603199,TT -3191603200,3191603455,CO -3191603456,3191603519,GT -3191603520,3191603583,PR -3191603584,3191603647,CO -3191603648,3191603711,SV -3191603712,3191607295,CO +3191603200,3191607295,CO 3191607296,3191607551,MX 3191607552,3191610111,CO 3191610112,3191610367,PE -3191610368,3191610623,CO -3191610624,3191611135,PE -3191611136,3191611391,CO +3191610368,3191611391,CO 3191611392,3191619583,VE -3191619584,3191619903,CL +3191619584,3191619903,CO 3191619904,3191619935,VE -3191619936,3191623679,CL -3191623680,3191625727,CO -3191625728,3191626751,CL -3191626752,3191627263,CO -3191627264,3191627519,CL -3191627520,3191635967,CO +3191619936,3191635967,CO 3191635968,3191652351,AR -3191652352,3191668991,CO -3191668992,3191669247,PY -3191669248,3191670015,CO -3191670016,3191670271,AR -3191670272,3191670783,CO -3191670784,3191672831,CL -3191672832,3191673343,CO -3191673344,3191676927,CL -3191676928,3191677951,US -3191677952,3191678207,AR -3191678208,3191678719,US -3191678720,3191678975,AR -3191678976,3191680767,US -3191680768,3191681279,AR -3191681280,3191681535,US -3191681536,3191682303,AR -3191682304,3191682559,US -3191682560,3191683071,AR -3191683072,3191685119,US -3191685120,3191693311,CO +3191652352,3191693311,CO 3191693312,3191701503,AR 3191701504,3191709695,CO 3191709696,3191709951,BR 3191709952,3191714815,CO 3191714816,3191715071,AR 3191715072,3191719935,CO -3191719936,3191720015,AR -3191720016,3191720959,CO +3191719936,3191719999,AR +3191720000,3191720959,CO 3191720960,3191721471,AR 3191721472,3191721983,CO 3191721984,3191722495,AR 3191722496,3191724799,CO 3191724800,3191725311,AR -3191725312,3191732735,CO -3191732736,3191732991,AR -3191732992,3191734079,CO -3191734080,3191734143,US -3191734144,3191734271,CO +3191725312,3191734271,CO 3191734272,3191799807,SV 3191799808,3191865343,EC 3191865344,3191930879,UY @@ -88058,120 +91322,47 @@ 3193143296,3193176063,TT 3193176064,3193307135,CO 3193307136,3193438207,SV -3193438208,3193569279,CW -3193569280,3193573087,CO -3193573088,3193573095,US -3193573096,3193575311,CO +3193438208,3193503743,CW +3193569280,3193575167,CO +3193575168,3193575295,PE +3193575296,3193575311,CO 3193575312,3193575327,PE -3193575328,3193579263,CO -3193579264,3193579519,EC -3193579520,3193582591,CO -3193582592,3193583103,EC -3193583104,3193589503,CO -3193589504,3193589759,EC -3193589760,3193590527,CO -3193590528,3193590655,EC -3193590656,3193591807,CO -3193591808,3193592063,EC -3193592064,3193592319,CO -3193592320,3193592575,EC -3193592576,3193595391,CO +3193575328,3193590655,CO +3193590656,3193590783,EC +3193590784,3193595391,CO 3193595392,3193595647,EC -3193595648,3193599743,CO -3193599744,3193600255,EC -3193600256,3193604351,CO -3193604352,3193604607,EC -3193604608,3193604863,CO -3193604864,3193605631,EC -3193605632,3193606143,CO -3193606144,3193606399,EC -3193606400,3193606655,CO -3193606656,3193607167,EC -3193607168,3193617151,CO -3193617152,3193617407,EC -3193617408,3193618943,CO +3193595648,3193606527,CO +3193606528,3193606655,EC +3193606656,3193618431,CO +3193618432,3193618559,US +3193618560,3193618943,CO 3193618944,3193619071,EC -3193619072,3193621759,CO -3193621760,3193623551,EC -3193623552,3193624063,CO -3193624064,3193624575,EC -3193624576,3193625599,CO +3193619072,3193625599,CO 3193625600,3193625855,EC -3193625856,3193626111,CO -3193626112,3193626623,US -3193626624,3193628927,CO -3193628928,3193629695,EC -3193629696,3193630975,CO -3193630976,3193631231,EC -3193631232,3193634559,CO -3193634560,3193634815,EC +3193625856,3193626367,CO +3193626368,3193626623,US +3193626624,3193628671,CO +3193628672,3193629183,EC +3193629184,3193631103,CO +3193631104,3193631231,EC +3193631232,3193634687,CO +3193634688,3193634815,EC 3193634816,3193700351,CL -3193700352,3193722751,HN -3193722752,3193722879,GT -3193722880,3193724927,HN +3193700352,3193724927,HN 3193724928,3193729023,AR 3193729024,3193733119,CU -3193733120,3193735167,AR -3193735168,3193735935,US -3193735936,3193736191,AR -3193736192,3193736959,US -3193736960,3193737215,AR -3193737216,3193739007,US -3193739008,3193739263,AR -3193739264,3193742335,US -3193742336,3193742591,AR -3193742592,3193742847,US -3193742848,3193743231,AR -3193743232,3193743359,US -3193743360,3193743743,AR -3193743744,3193744127,US -3193744128,3193744639,AR -3193744640,3193745407,US -3193745408,3193746431,AR -3193746432,3193746687,US -3193746688,3193746751,AR -3193746752,3193746815,US -3193746816,3193746879,AR -3193746880,3193748479,US -3193748480,3193748863,AR -3193748864,3193750271,US -3193750272,3193750527,AR -3193750528,3193750783,US -3193750784,3193751039,AR -3193751040,3193751551,US -3193751552,3193751807,AR -3193751808,3193752959,US -3193752960,3193753087,AR -3193753088,3193753343,US -3193753344,3193753471,AR -3193753472,3193753599,US -3193753600,3193754111,AR -3193754112,3193754367,US -3193754368,3193754623,AR -3193754624,3193754751,US -3193754752,3193755007,AR -3193755008,3193755519,US -3193755520,3193755647,AR -3193755648,3193755775,US -3193755776,3193756415,AR -3193756416,3193756543,US -3193756544,3193756799,AR -3193756800,3193756927,US -3193756928,3193757055,AR -3193757056,3193757183,US -3193757184,3193765887,AR +3193733120,3193740543,AR +3193740544,3193740799,US +3193740800,3193765887,AR 3193765888,3193774079,TT -3193774080,3193775103,PA 3193775104,3193776127,GY 3193776128,3193777151,AR 3193777152,3193778175,VE 3193778176,3193782271,AR 3193782272,3193798655,TT 3193798656,3193806847,CO -3193806848,3193808895,CR -3193808896,3193809663,US -3193809664,3193810943,CR -3193810944,3193815039,PY +3193806848,3193810943,CR +3193810944,3193811967,PY 3193815040,3193823231,AR 3193823232,3193827327,CL 3193827328,3193828351,CR @@ -88199,37 +91390,21 @@ 3194077184,3194085375,CO 3194085376,3194093567,VE 3194093568,3194126335,SR -3194126336,3194126591,GT -3194126592,3194126847,NL -3194126848,3194126911,GT -3194126912,3194126975,PE -3194126976,3194127103,GT -3194127104,3194127359,BR -3194127360,3194127871,AR -3194127872,3194128127,PE -3194128128,3194128383,BR +3194126336,3194128383,AR 3194128384,3194129407,NI 3194129408,3194129663,AR 3194129664,3194129671,BR -3194129672,3194129919,AR -3194129920,3194130047,BR +3194129672,3194130047,AR 3194130048,3194130175,CO -3194130176,3194130303,CL -3194130304,3194130431,AR -3194130432,3194130687,BR -3194130688,3194130943,AR -3194130944,3194132991,BR -3194132992,3194133247,CL -3194133248,3194134527,BR -3194134528,3194135551,AR -3194135552,3194136319,BR -3194136320,3194136447,CO -3194136448,3194136575,GT +3194130176,3194130303,AR +3194130304,3194130431,BR +3194130432,3194135551,AR +3194135552,3194136063,BR +3194136064,3194136575,AR 3194136576,3194137087,BR -3194137088,3194139647,AR -3194139648,3194139903,BR -3194139904,3194140159,AR -3194140160,3194142719,CR +3194137088,3194139903,AR +3194139904,3194140159,BR +3194140160,3194142719,AR 3194142720,3194159103,CL 3194159104,3194165247,HN 3194165248,3194175487,SV @@ -88249,7 +91424,8 @@ 3194368000,3194370047,BO 3194370048,3194372095,PA 3194372096,3194380287,HT -3194380288,3194388479,US +3194380288,3194384383,US +3194384384,3194388479,BZ 3194388480,3194396671,PE 3194396672,3194413055,CO 3194413056,3194421247,CL @@ -88259,19 +91435,14 @@ 3194441728,3194445823,AR 3194445824,3194449031,CO 3194449032,3194449047,CL -3194449048,3194449175,CO -3194449176,3194449183,PE -3194449184,3194454015,CO +3194449048,3194454015,CO 3194454016,3194458111,AR 3194458112,3194462207,CL 3194462208,3194466303,BR 3194466304,3194467327,AR 3194467328,3194468351,DO 3194468352,3194469375,US -3194469376,3194469631,CA -3194469632,3194469887,CR -3194469888,3194470143,US -3194470144,3194470399,CR +3194469376,3194470399,CR 3194470400,3194486783,AR 3194486784,3194494975,BO 3194494976,3194511359,AR @@ -88279,9 +91450,7 @@ 3194515456,3194519551,GT 3194519552,3194535935,PY 3194535936,3194585087,AR -3194585088,3194586623,HN -3194586624,3194586879,US -3194586880,3194589183,HN +3194585088,3194589183,HN 3194589184,3194591231,AR 3194591232,3194592255,PA 3194592256,3194593279,GY @@ -88290,7 +91459,7 @@ 3194596352,3194597375,HT 3194597376,3194601471,AR 3194601472,3194602495,CW -3194602496,3194610943,AR +3194603520,3194610943,AR 3194610944,3194611199,CO 3194611200,3194613503,AR 3194613504,3194613759,CL @@ -88303,39 +91472,16 @@ 3194640384,3194642431,BZ 3194642432,3194646527,AR 3194646528,3194648575,DO -3194648576,3194652159,AR -3194652160,3194652415,MX -3194652416,3194652671,AR -3194652672,3194652701,MX -3194652702,3194652705,AR -3194652706,3194654719,MX -3194654720,3194659839,AR -3194659840,3194660351,US -3194660352,3194661119,AR -3194661120,3194661375,US -3194661376,3194661887,AR -3194661888,3194662399,US -3194662400,3194663167,AR -3194663168,3194664447,US -3194664448,3194664959,AR -3194664960,3194665215,US -3194665216,3194665471,AR -3194665472,3194665727,US -3194665728,3194665983,AR -3194665984,3194666239,US -3194666240,3194667007,AR +3194648576,3194667007,AR 3194667008,3194675199,GT -3194675200,3194679295,PA 3194679296,3194683391,BO 3194683392,3194687487,CU 3194687488,3194691583,CO 3194691584,3194699775,BO 3194699776,3194705919,EC -3194705920,3194707711,CR -3194707712,3194707967,US +3194705920,3194707967,CR 3194707968,3194716159,AR 3194716160,3194724351,HN -3194724352,3194728447,PA 3194728448,3194729471,CL 3194729472,3194730495,PE 3194730496,3194732543,AR @@ -88350,7 +91496,6 @@ 3194757120,3194765311,AR 3194765312,3194767359,EC 3194767360,3194768383,CR -3194768384,3194769407,AR 3194769408,3194773503,PE 3194773504,3194781695,BR 3194781696,3194798079,CL @@ -88359,15 +91504,8 @@ 3194804224,3194805247,AR 3194805248,3194806271,CR 3194806272,3194814463,AR -3194814464,3194818559,PA -3194818560,3194818815,CO -3194818816,3194819071,AR -3194819072,3194819583,CO -3194819584,3194819839,AR -3194819840,3194820095,CO -3194820096,3194820351,AR -3194820352,3194820607,CO -3194820608,3194830847,AR +3194814464,3194822655,CO +3194822656,3194830847,AR 3194830848,3194838015,BR 3194838016,3194839039,MX 3194839040,3194863615,CO @@ -88381,38 +91519,16 @@ 3194925056,3194929151,AR 3194929152,3194937343,EC 3194937344,3194945535,AR -3194945536,3194953215,GT -3194953216,3194953343,NI -3194953344,3194953471,GT -3194953472,3194953599,NI -3194953600,3194953727,GT -3194953728,3194959871,AR -3194959872,3194960383,US -3194960384,3194960895,AR -3194960896,3194961151,US -3194961152,3194961407,AR -3194961408,3194961919,US +3194945536,3194953727,GT +3194953728,3194961919,AR 3194961920,3194970111,EC -3194970112,3194974207,PA 3194974208,3194976255,AR 3194976256,3194977279,VE 3194977280,3194978303,AR -3194978304,3194978559,PA -3194978560,3194978687,CW -3194978688,3194982911,PA -3194982912,3194983039,US -3194983040,3194984191,PA -3194984192,3194984319,US -3194984320,3194984831,PA -3194984832,3194984959,GB -3194984960,3194985471,PA -3194985472,3194985599,US -3194985600,3194994687,PA 3194994688,3195023359,AR 3195023360,3195024383,CL 3195024384,3195025407,UY 3195025408,3195043839,AR -3195043840,3195056127,CO 3195056128,3195060223,AR 3195060224,3195061247,US 3195061248,3195062271,AR @@ -88425,22 +91541,7 @@ 3195067392,3195068415,CR 3195068416,3195076607,CW 3195076608,3195084799,CL -3195084800,3195085055,CR -3195085056,3195086335,NI -3195086336,3195087359,CR -3195087360,3195087615,NI -3195087616,3195088127,CR -3195088128,3195088639,NI -3195088640,3195088895,CR -3195088896,3195089919,NI -3195089920,3195090431,CR -3195090432,3195090687,NI -3195090688,3195091199,CR -3195091200,3195091455,NI -3195091456,3195092223,CR -3195092224,3195092479,NI -3195092480,3195092735,CR -3195092736,3195092991,NI +3195084800,3195092991,NI 3195092992,3195097087,DO 3195097088,3195099135,CR 3195099136,3195100159,GT @@ -88452,9 +91553,8 @@ 3195138048,3195139071,DO 3195139072,3195140095,CL 3195140096,3195142143,CR -3195142144,3195142399,MX -3195142400,3195142655,PA -3195142656,3195142911,VE +3195142144,3195142783,PA +3195142784,3195142911,VE 3195142912,3195143039,EC 3195143040,3195143167,UY 3195143168,3195143295,GT @@ -88466,19 +91566,12 @@ 3195203584,3195205631,VE 3195205632,3195206655,PE 3195206656,3195207679,CL -3195207680,3195209687,GT -3195209688,3195209695,PR -3195209696,3195211775,GT +3195207680,3195211775,GT 3195211776,3195214988,BZ 3195214989,3195214989,RU 3195214990,3195215871,BZ 3195215872,3195224063,AR -3195224064,3195232255,PA -3195232256,3195234559,CR -3195234560,3195234815,PA -3195234816,3195235327,CR -3195235328,3195235583,PA -3195235584,3195236351,CR +3195232256,3195236351,CR 3195236352,3195240447,AR 3195240448,3195256831,HT 3195256832,3195265023,AR @@ -88493,7 +91586,7 @@ 3195576320,3195580415,CL 3195580416,3195584511,AR 3195584512,3195592703,HT -3195592704,3195596799,PA +3195596391,3195596391,PA 3195596800,3195597823,CR 3195597824,3195598847,AR 3195598848,3195600895,VE @@ -88517,17 +91610,12 @@ 3195721728,3195723775,VE 3195723776,3195731967,AR 3195731968,3195736063,EC -3195736064,3195736575,BQ -3195736576,3195736831,AI -3195736832,3195737087,BQ +3195736064,3195737087,BQ 3195737088,3195738111,CW 3195738112,3195740159,HN -3195740160,3195740415,US -3195740416,3195740927,PA -3195740928,3195741055,US +3195740160,3195741055,PA 3195741056,3195741087,HN -3195741088,3195741695,US -3195741696,3195744255,PA +3195741088,3195744255,PA 3195744256,3195748351,EC 3195748352,3195752447,CL 3195752448,3195763711,AR @@ -88535,38 +91623,16 @@ 3195764736,3195768831,CR 3195768832,3195772927,AR 3195772928,3195781119,VE -3195781120,3195785215,PA -3195785216,3195785311,HN -3195785312,3195785343,CA -3195785344,3195785375,HN -3195785376,3195785407,DE -3195785408,3195785815,HN -3195785816,3195785823,DE -3195785824,3195786015,HN -3195786016,3195786023,ES -3195786024,3195786191,HN -3195786192,3195786199,US -3195786200,3195786479,HN -3195786480,3195786487,CA -3195786488,3195786527,HN -3195786528,3195786543,US -3195786544,3195786991,HN -3195786992,3195787007,CA -3195787008,3195787127,HN -3195787128,3195787135,DE -3195787136,3195787215,HN -3195787216,3195787231,US -3195787232,3195787607,HN -3195787608,3195787615,DE -3195787616,3195788159,HN -3195788160,3195788167,CA -3195788168,3195788415,HN -3195788416,3195788423,US -3195788424,3195788919,HN -3195788920,3195788927,CA -3195788928,3195789087,HN -3195789088,3195789119,CA -3195789120,3195789311,HN +3195781120,3195785215,BR +3195785216,3195785407,HN +3195785408,3195785439,DE +3195785440,3195785735,HN +3195785736,3195785743,GB +3195785744,3195786239,HN +3195786240,3195786287,US +3195786288,3195786295,ES +3195786296,3195786751,US +3195786752,3195789311,HN 3195789312,3195793407,PA 3195793408,3195801599,AR 3195801600,3195803647,HN @@ -88574,13 +91640,7 @@ 3195804672,3195805695,VE 3195805696,3195807743,NI 3195807744,3195807871,US -3195807872,3195808383,BZ -3195808384,3195808895,US -3195808896,3195809151,BZ -3195809152,3195809279,US -3195809280,3195809407,BZ -3195809408,3195809535,US -3195809536,3195809791,BZ +3195807872,3195809791,BZ 3195809792,3195811839,PE 3195811840,3195813887,AR 3195813888,3195822079,DO @@ -88594,23 +91654,16 @@ 3195853824,3195854847,GY 3195854848,3195859967,AR 3195859968,3195862015,CR -3195862016,3195863039,AR 3195863040,3196092415,CO 3196092416,3196125183,PY 3196125184,3196190719,BO 3196190720,3196207103,HN 3196207104,3196223487,CO 3196223488,3196305407,EC -3196305408,3196316183,CO -3196316184,3196316191,CW -3196316192,3196321791,CO +3196305408,3196321791,CO 3196321792,3196583935,UY -3196583936,3196690687,AR -3196690688,3196690943,UY -3196690944,3196846079,AR -3196846080,3196874431,PA -3196874432,3196874447,PG -3196874448,3196977151,PA +3196583936,3196846079,AR +3196846080,3196977151,PA 3196977152,3197042687,VE 3197042688,3197075455,CO 3197075456,3197108223,GT @@ -88654,8 +91707,7 @@ 3199729664,3199762431,NI 3199762432,3199778815,CO 3199778816,3199779839,AR -3199779840,3199780735,CR -3199780736,3199780863,US +3199779840,3199780863,CR 3199780864,3199782911,CO 3199782912,3199784959,AR 3199784960,3199785983,EC @@ -88673,15 +91725,13 @@ 3200565248,3200569343,HT 3200569344,3200573439,CL 3200573440,3200577535,AR -3200577536,3200579583,EC +3200577536,3200579583,BR 3200579584,3200581631,AR 3200581632,3200614399,BZ 3200614400,3200647167,AR 3200647168,3201302527,VE 3201302528,3201433599,CL -3201433600,3201435135,AR -3201435136,3201435263,US -3201435264,3201441791,AR +3201433600,3201441791,AR 3201441792,3201442047,US 3201442048,3201499135,AR 3201499136,3201515519,CL @@ -88706,78 +91756,103 @@ 3201630208,3201695743,TT 3201695744,3201761279,EC 3201761280,3201826815,CL -3201826816,3201851391,AR -3201851392,3201855487,EC +3201826816,3201851863,AR +3201851864,3201851867,EC +3201851868,3201852519,AR +3201852520,3201852527,EC +3201852528,3201854143,AR +3201854144,3201854151,EC +3201854152,3201854463,AR +3201854464,3201854975,EC +3201854976,3201855295,AR +3201855296,3201855311,EC +3201855312,3201855487,AR 3201855488,3201859583,PE 3201859584,3201863679,CO -3201863680,3201865727,CL -3201865728,3201867775,CO -3201867776,3201875967,PE -3201875968,3201880063,CO +3201863680,3201864633,AR +3201864634,3201864634,CL +3201864635,3201865215,AR +3201865216,3201865471,CL +3201865472,3201866607,AR +3201866608,3201866623,CO +3201866624,3201866863,AR +3201866864,3201866871,CO +3201866872,3201867775,AR +3201867776,3201869823,PE +3201869824,3201870911,AR +3201870912,3201870943,PE +3201870944,3201872739,AR +3201872740,3201872740,PE +3201872741,3201873827,AR +3201873828,3201873831,PE +3201873832,3201875071,AR +3201875072,3201875079,PE +3201875080,3201876991,AR +3201876992,3201877247,CO +3201877248,3201877268,AR +3201877269,3201877269,CO +3201877270,3201877503,AR +3201877504,3201878015,CO +3201878016,3201878527,AR +3201878528,3201878783,CO +3201878784,3201879039,AR +3201879040,3201880063,CO 3201880064,3201884159,EC -3201884160,3201889279,VE +3201884160,3201888511,VE +3201888512,3201889279,AR 3201889280,3201889535,US -3201889536,3201894399,VE -3201894400,3201906111,AR -3201906112,3201906175,CO -3201906176,3201906687,AR -3201906688,3201908735,CO +3201889536,3201889791,VE +3201889792,3201890097,AR +3201890098,3201890098,VE +3201890099,3201891071,AR +3201891072,3201891327,VE +3201891328,3201891583,AR +3201891584,3201891839,VE +3201891840,3201892351,AR +3201892352,3201894399,VE +3201894400,3201904639,AR +3201904640,3201906687,CO +3201906688,3201907233,AR +3201907234,3201907234,CO +3201907235,3201907265,AR +3201907266,3201907266,CO +3201907267,3201907359,AR +3201907360,3201907391,CO +3201907392,3201908223,AR +3201908224,3201908735,CO 3201908736,3201916927,AR 3201916928,3201917183,CO 3201917184,3201917527,AR 3201917528,3201917535,CO -3201917536,3201917951,AR -3201917952,3201918975,CO -3201918976,3201925119,AR +3201917536,3201918795,AR +3201918796,3201918799,CO +3201918800,3201918975,AR +3201918976,3201919999,CO +3201920000,3201925119,AR 3201925120,3201957887,CL 3201957888,3202088959,PA -3202088960,3202127999,AR -3202128000,3202128015,CW -3202128016,3202220031,AR +3202088960,3202220031,AR 3202220032,3202351103,PE 3202351104,3202875391,AR 3202875392,3203399679,PE 3203399680,3203465215,CO -3203465216,3203494143,CR -3203494144,3203494271,CO -3203494272,3203530751,CR -3203530752,3203531519,CO -3203531520,3203531775,PA -3203531776,3203532287,CO -3203532288,3203532543,PA -3203532544,3203532799,CO -3203532800,3203534847,PA -3203534848,3203535871,CO -3203535872,3203536383,PA -3203536384,3203536895,CO +3203465216,3203530751,CR +3203530752,3203536895,CO 3203536896,3203537919,HN -3203537920,3203538431,GT -3203538432,3203538687,PA -3203538688,3203538943,CO +3203537920,3203538943,CO 3203538944,3203539967,BZ 3203539968,3203543551,CO 3203543552,3203544575,GT -3203544576,3203545087,CO -3203545088,3203545599,GT -3203545600,3203547135,CO -3203547136,3203549183,PA -3203549184,3203553279,CO -3203553280,3203553535,CR -3203553536,3203556863,CO -3203556864,3203557119,DO -3203557120,3203561471,CO -3203561472,3203562495,SV -3203562496,3203563775,CO -3203563776,3203564031,PA -3203564032,3203564543,CO +3203544576,3203548927,CO +3203548928,3203549183,PA +3203549184,3203562239,CO +3203562240,3203562495,SV +3203562496,3203564543,CO 3203564544,3203565055,DO -3203565056,3203565567,CO -3203565568,3203566079,CR -3203566080,3203566591,CO +3203565056,3203565567,CR +3203565568,3203566591,CO 3203566592,3203566847,PA -3203566848,3203566975,CO -3203566976,3203567103,DO -3203567104,3203568639,CO +3203566848,3203568639,CO 3203568640,3203569663,SV 3203569664,3203570303,CO 3203570304,3203570431,SV @@ -88786,7 +91861,9 @@ 3203661824,3203923967,AR 3203923968,3204448255,CO 3204448256,3208642559,BR -3208642560,3209691135,CO +3208642560,3209412607,CO +3209412608,3209413631,US +3209413632,3209691135,CO 3209691136,3210084351,AR 3210084352,3210215423,BR 3210215424,3210739711,CO @@ -88796,10 +91873,10 @@ 3210740480,3210740735,US 3210740736,3210742015,BR 3210742016,3210742031,IT -3210742032,3210742063,BR +3210742032,3210742047,BR +3210742048,3210742063,CL 3210742064,3210742079,US -3210742080,3210742271,BR -3210742272,3210742527,CL +3210742080,3210742527,CL 3210742528,3210742543,KR 3210742544,3210742560,CL 3210742561,3210742561,BR @@ -88817,16 +91894,16 @@ 3210743552,3210743567,TH 3210743568,3210743615,BR 3210743616,3210743679,FR -3210743680,3210743807,BR +3210743680,3210743807,CL 3210743808,3210744063,US 3210744064,3210744079,TR -3210744080,3210744095,CL -3210744096,3210744127,BR +3210744080,3210744127,BR 3210744128,3210744191,FR -3210744192,3210744575,US +3210744192,3210744319,BR +3210744320,3210744575,US 3210744576,3210744591,BE -3210744592,3210744703,BR -3210744704,3210744831,US +3210744592,3210744607,BR +3210744608,3210744831,CL 3210744832,3210744863,NZ 3210744864,3210744895,IS 3210744896,3210744959,CL @@ -88834,46 +91911,49 @@ 3210745088,3210745343,US 3210745344,3210745359,RU 3210745360,3210745375,BR -3210745376,3210745471,CL +3210745376,3210745407,CL +3210745408,3210745471,BR 3210745472,3210745599,DE 3210745600,3210745855,US 3210745856,3210745871,IT -3210745872,3210745919,BR -3210745920,3210746367,US +3210745872,3210746047,CL +3210746048,3210746111,BR +3210746112,3210746367,US 3210746368,3210746383,SE -3210746384,3210746623,BR -3210746624,3210746879,US +3210746384,3210746495,BR +3210746496,3210746879,US 3210746880,3210746895,CH -3210746896,3210747007,CL -3210747008,3210747135,BR +3210746896,3210746943,CL +3210746944,3210747135,BR 3210747136,3210748159,US 3210748160,3210748175,JP -3210748176,3210748287,BR -3210748288,3210748415,US +3210748176,3210748191,BR +3210748192,3210748351,CL +3210748352,3210748415,BR 3210748416,3210748671,GB -3210748672,3210752255,US -3210752256,3210752511,SG +3210748672,3210749439,CL +3210749440,3210752255,US +3210752256,3210752511,CL 3210752512,3210755839,US 3210755840,3210755855,MY -3210755856,3210755871,BR -3210755872,3210755967,CL -3210755968,3210756095,BR -3210756096,3210756351,SG +3210755856,3210756095,BR +3210756096,3210756351,CL 3210756352,3210756607,US 3210756608,3210756863,DE 3210756864,3210757119,RU -3210757120,3210758911,US +3210757120,3210757631,US +3210757632,3210758143,BR +3210758144,3210758911,US 3210758912,3210759167,GH 3210759168,3210764031,US 3210764032,3210764047,IE 3210764048,3210764063,BR 3210764064,3210764095,CL -3210764096,3210764159,US -3210764160,3210764287,BR +3210764096,3210764287,BR 3210764288,3210765055,US 3210765056,3210765071,SE -3210765072,3210765311,BR -3210765312,3210765567,CL +3210765072,3210765087,BR +3210765088,3210765567,CL 3210765568,3210765823,US 3210765824,3210766079,ES 3210766080,3210766335,CL @@ -88890,57 +91970,83 @@ 3210769920,3210770175,TR 3210770176,3210771199,US 3210771200,3210771215,TH -3210771216,3210771455,CL +3210771216,3210771263,CL +3210771264,3210771455,BR 3210771456,3210772479,US 3210772480,3210772735,CL 3210772736,3210773247,US 3210773248,3210773503,MY 3210773504,3210773519,PL -3210773520,3210773759,BR +3210773520,3210773535,BR +3210773536,3210773759,CL 3210773760,3210774271,US 3210774272,3210774287,NO -3210774288,3210774527,BR +3210774288,3210774303,BR +3210774304,3210774527,CL 3210774528,3210774783,US 3210774784,3210774799,IT -3210774800,3210775039,BR +3210774800,3210774815,BR +3210774816,3210774911,CL +3210774912,3210775039,BR 3210775040,3210775295,US 3210775296,3210775311,CH -3210775312,3210775551,BR +3210775312,3210775327,BR +3210775328,3210775551,CL 3210775552,3210775807,US -3210775808,3210776319,CL +3210775808,3210775935,CL +3210775936,3210776063,BR +3210776064,3210776191,CL +3210776192,3210776319,BR 3210776320,3210776575,US -3210776576,3210776831,CL +3210776576,3210776703,CL +3210776704,3210776831,BR 3210776832,3210777087,US -3210777088,3210777599,CL +3210777088,3210777215,CL +3210777216,3210777343,BR +3210777344,3210777471,CL +3210777472,3210777599,BR 3210777600,3210778367,US 3210778368,3210778623,IE 3210778624,3210781951,US 3210781952,3210782207,IT 3210782208,3210782975,US 3210782976,3210782991,TR -3210782992,3210783231,CL +3210782992,3210783039,CL +3210783040,3210783231,BR 3210783232,3210783487,US 3210783488,3210783503,JP -3210783504,3210783743,CL +3210783504,3210783551,CL +3210783552,3210783743,BR 3210783744,3210783999,US 3210784000,3210784015,JP -3210784016,3210784255,CL +3210784016,3210784063,CL +3210784064,3210784255,BR 3210784256,3210784511,US 3210784512,3210784527,BE -3210784528,3210784767,CL +3210784528,3210784575,CL +3210784576,3210784767,BR 3210784768,3210785791,US -3210785792,3210786047,BR +3210785792,3210786047,CL 3210786048,3210786063,AU -3210786064,3210786303,CL +3210786064,3210786111,CL +3210786112,3210786303,BR 3210786304,3210786559,US 3210786560,3210786575,GR 3210786576,3210786591,BR -3210786592,3210787071,CL +3210786592,3210786623,CL +3210786624,3210786687,BR +3210786688,3210787071,CL 3210787072,3210788863,US 3210788864,3210789119,HR -3210789120,3210795007,US +3210789120,3210791935,US +3210791936,3210792447,CL +3210792448,3210792959,US +3210792960,3210793471,GB +3210793472,3210795007,US 3210795008,3210796031,IL -3210796032,3210798847,US +3210796032,3210798079,US +3210798080,3210798591,CL +3210798592,3210798847,US 3210798848,3210799103,ES 3210799104,3210802431,US 3210802432,3210802687,ES @@ -88966,15 +92072,12 @@ 3210825728,3210827775,BZ 3210827776,3210829823,DO 3210829824,3210830847,AR -3210830848,3210831871,PE +3210830848,3210831359,PE +3210831360,3210831871,BR 3210831872,3210832895,DO 3210832896,3210835967,AR 3210835968,3210838015,PY -3210838016,3210868735,AR -3210868736,3210869759,US -3210869760,3210870271,AR -3210870272,3210870527,US -3210870528,3210870783,AR +3210838016,3210870783,AR 3210870784,3210903551,CO 3210903552,3210919935,PE 3210919936,3210920959,GT @@ -88989,58 +92092,57 @@ 3211071744,3211071999,DE 3211072000,3211072027,US 3211072028,3211072057,BR -3211072058,3211072287,US +3211072058,3211072127,US +3211072128,3211072255,BR +3211072256,3211072287,US 3211072288,3211072319,NZ -3211072320,3211072511,US +3211072320,3211072511,BR 3211072512,3211073023,NL 3211073024,3211073279,GB 3211073280,3211073535,FR 3211073536,3211074047,US -3211074048,3211074303,NL +3211074048,3211074303,CL 3211074304,3211074559,ES 3211074560,3211074815,NL 3211074816,3211075071,US 3211075072,3211075325,DK 3211075326,3211075326,CL 3211075327,3211075327,DK -3211075328,3211075583,NL +3211075328,3211075583,CL 3211075584,3211076095,US 3211076096,3211076607,LT 3211076608,3211079935,US 3211079936,3211080191,NG 3211080192,3211080703,US 3211080704,3211080959,GB -3211080960,3211081215,IQ +3211080960,3211081215,CL 3211081216,3211081727,CH 3211081728,3211082239,US 3211082240,3211082495,BN 3211082496,3211082751,GB 3211082752,3211083007,SG -3211083008,3211083519,US +3211083008,3211083263,US +3211083264,3211083519,BR 3211083520,3211083775,HK 3211083776,3211083791,RU 3211083792,3211083839,CL 3211083840,3211083855,GB -3211083856,3211083903,DE +3211083856,3211083871,DE +3211083872,3211083903,CL 3211083904,3211084031,FR -3211084032,3211084287,DE +3211084032,3211084287,CL 3211084288,3211084303,NL -3211084304,3211084351,DE +3211084304,3211084351,CL 3211084352,3211084367,GB -3211084368,3211084543,DE -3211084544,3211084559,CL +3211084368,3211084383,DE +3211084384,3211084559,CL 3211084560,3211084575,DE 3211084576,3211084671,CL 3211084672,3211084799,BY 3211084800,3211084815,AT -3211084816,3211084863,CL +3211084816,3211084863,DE 3211084864,3211084879,GB -3211084880,3211084895,DE -3211084896,3211084927,CL -3211084928,3211085055,DE -3211085056,3211085071,CL -3211085072,3211085087,DE -3211085088,3211085311,CL +3211084880,3211085311,DE 3211085312,3211085327,GB 3211085328,3211085375,CL 3211085376,3211085391,GB @@ -89050,13 +92152,19 @@ 3211085600,3211085695,CL 3211085696,3211085823,GE 3211085824,3211085839,TH -3211085840,3211085887,DE +3211085840,3211085887,CL 3211085888,3211085903,GB -3211085904,3211086335,DE +3211085904,3211085919,DE +3211085920,3211086095,CL +3211086096,3211086111,DE +3211086112,3211086335,CL 3211086336,3211086351,FR 3211086352,3211086367,DE 3211086368,3211086463,CL -3211086464,3211086847,DE +3211086464,3211086591,DE +3211086592,3211086607,CL +3211086608,3211086623,DE +3211086624,3211086847,CL 3211086848,3211086863,PL 3211086864,3211087359,DE 3211087360,3211087375,GB @@ -89112,13 +92220,13 @@ 3211096064,3211096079,GB 3211096080,3211097103,DE 3211097104,3211097151,GB -3211097152,3211097215,CL +3211097152,3211097215,DE 3211097216,3211097343,GB -3211097344,3211097359,CL -3211097360,3211097375,DE -3211097376,3211097599,CL +3211097344,3211097599,DE 3211097600,3211097855,US -3211097856,3211098111,DE +3211097856,3211097871,CL +3211097872,3211097887,DE +3211097888,3211098111,CL 3211098112,3211098367,US 3211098368,3211098383,CL 3211098384,3211098399,DE @@ -89131,11 +92239,9 @@ 3211099680,3211099711,GB 3211099712,3211099775,DE 3211099776,3211099903,GB -3211099904,3211099919,CL -3211099920,3211099935,DE -3211099936,3211100159,CL +3211099904,3211100159,DE 3211100160,3211101951,US -3211101952,3211102207,SG +3211101952,3211102207,CL 3211102208,3211102335,AU 3211102336,3211102463,BR 3211102464,3211102591,AU @@ -89144,14 +92250,17 @@ 3211102848,3211102975,BR 3211102976,3211103103,AU 3211103104,3211103231,BR -3211103232,3211104767,AU -3211104768,3211105791,US +3211103232,3211104447,AU +3211104448,3211104511,BR +3211104512,3211104703,AU +3211104704,3211104767,BR +3211104768,3211105279,GB +3211105280,3211105791,US 3211105792,3211106303,ES 3211106304,3211111423,US 3211111424,3211112447,JP 3211112448,3211112959,US -3211112960,3211113215,CL -3211113216,3211113471,SG +3211112960,3211113471,CL 3211113472,3211113727,GB 3211113728,3211113983,LT 3211113984,3211114239,US @@ -89184,49 +92293,25 @@ 3211145216,3211147263,NI 3211147264,3211148287,CR 3211148288,3211165695,CO -3211165696,3211165951,HN -3211165952,3211165983,UY -3211165984,3211166415,HN -3211166416,3211166431,UY -3211166432,3211167487,HN -3211167488,3211167503,US -3211167504,3211167519,HN -3211167520,3211167527,US -3211167528,3211167927,HN -3211167928,3211167935,US -3211167936,3211171487,HN -3211171488,3211171503,ES -3211171504,3211171511,HN -3211171512,3211171519,ES -3211171520,3211171791,HN -3211171792,3211171807,ES -3211171808,3211172047,HN -3211172048,3211172063,NL -3211172064,3211173183,HN -3211173184,3211173199,NL -3211173200,3211173279,HN -3211173280,3211173295,NL -3211173296,3211174415,HN -3211174416,3211174431,CA -3211174432,3211174687,HN -3211174688,3211174703,CA -3211174704,3211174719,HN -3211174720,3211174735,CA -3211174736,3211175199,HN -3211175200,3211175215,BR -3211175216,3211175295,HN -3211175296,3211175327,BR -3211175328,3211177831,HN -3211177832,3211177839,CR -3211177840,3211178583,HN +3211165696,3211165727,HN +3211165728,3211165735,UY +3211165736,3211166559,HN +3211166560,3211166567,UY +3211166568,3211171071,HN +3211171072,3211171327,US +3211171328,3211172671,HN +3211172672,3211172687,NL +3211172688,3211178583,HN 3211178584,3211178591,ES -3211178592,3211178671,HN -3211178672,3211178703,ES -3211178704,3211180887,HN -3211180888,3211180895,CR -3211180896,3211181119,HN -3211181120,3211181135,CR -3211181136,3211182079,HN +3211178592,3211179087,HN +3211179088,3211179103,US +3211179104,3211179215,HN +3211179216,3211179231,US +3211179232,3211180687,HN +3211180688,3211180695,BR +3211180696,3211181439,HN +3211181440,3211181447,CA +3211181448,3211182079,HN 3211182080,3211194367,CO 3211194368,3211195391,DO 3211195392,3211214847,AR @@ -89311,7 +92396,8 @@ 3220033536,3220037631,IE 3220037632,3220039679,US 3220039680,3220040703,NL -3220040704,3220041215,JP +3220040704,3220040959,JP +3220040960,3220041215,BR 3220041216,3220041471,HK 3220041472,3220041727,BR 3220041728,3220042239,JP @@ -89325,7 +92411,10 @@ 3220063744,3220066303,US 3220066304,3220070399,JP 3220070400,3220078591,IE -3220078592,3220127743,US +3220078592,3220080639,BR +3220080640,3220094975,US +3220094976,3220103167,BR +3220103168,3220127743,US 3220127744,3220135935,AU 3220135936,3220152319,JP 3220152320,3220161535,AU @@ -89405,7 +92494,9 @@ 3221656832,3221657087,AU 3221657088,3221664255,US 3221664512,3221757951,US -3221757952,3221759999,MY +3221757952,3221758975,MY +3221758976,3221759231,AU +3221759232,3221759999,MY 3221760000,3221761023,IN 3221761024,3221779455,US 3221779456,3221780479,IN @@ -89442,6 +92533,7 @@ 3222036992,3222037247,CA 3222037248,3222037503,GB 3222037504,3222040575,US +3222040576,3222041599,BR 3222042624,3222044927,US 3222044928,3222045183,CA 3222045184,3222056447,US @@ -89640,10 +92732,8 @@ 3223435008,3223437311,US 3223437312,3223447551,CH 3223447552,3223447807,US -3223447808,3223448063,NL -3223448064,3223449087,US -3223449088,3223449343,NL -3223449344,3223453183,US +3223447808,3223449599,NL +3223449600,3223453183,US 3223453184,3223453439,DE 3223453440,3223458559,US 3223458560,3223458815,GB @@ -89667,7 +92757,7 @@ 3223481088,3223481343,SE 3223481344,3223483391,US 3223483392,3223483647,NL -3223483904,3223499519,US +3223483648,3223499519,US 3223499520,3223499775,FI 3223499776,3223504639,US 3223504640,3223504895,CA @@ -89807,7 +92897,7 @@ 3223906304,3223909375,CA 3223909376,3223911935,US 3223911936,3223912191,CA -3223912448,3223938815,US +3223912192,3223938815,US 3223938816,3223946239,GB 3223946240,3223947519,CH 3223947520,3223948287,US @@ -90116,8 +93206,8 @@ 3225081088,3225081343,CA 3225081344,3225082367,US 3225082368,3225082623,IT -3225082624,3225084671,US -3225084672,3225085183,NL +3225082624,3225084415,US +3225084416,3225085183,NL 3225085184,3225085439,ES 3225085440,3225089279,US 3225089280,3225089535,CA @@ -90334,7 +93424,9 @@ 3225847552,3225847807,AU 3225847808,3225848063,IT 3225848064,3225848831,US -3225848832,3225853951,DE +3225848832,3225849855,DE +3225849856,3225850111,US +3225850112,3225853951,DE 3225853952,3225857023,US 3225857024,3225857279,CA 3225857280,3225857535,US @@ -90451,9 +93543,7 @@ 3226067456,3226067711,BE 3226067712,3226068223,US 3226068224,3226068479,GB -3226068480,3226074879,US -3226074880,3226075135,AT -3226075136,3226110719,US +3226068480,3226110719,US 3226110720,3226128639,AU 3226128640,3226140927,US 3226140928,3226143487,CA @@ -90582,8 +93672,7 @@ 3226581248,3226583295,US 3226583296,3226583551,CA 3226583552,3226583807,SE -3226583808,3226585087,US -3226587136,3226590207,US +3226583808,3226590207,US 3226590208,3226591231,NL 3226591232,3226592255,CA 3226592256,3226592767,US @@ -90874,8 +93963,8 @@ 3227312384,3227320319,US 3227320320,3227362047,FR 3227362048,3227362303,US -3227362304,3227362559,GB -3227362560,3227385855,FR +3227362304,3227363327,GB +3227363328,3227385855,FR 3227385856,3227391999,US 3227392000,3227392255,PT 3227392256,3227393023,US @@ -90975,18 +94064,13 @@ 3227467776,3227468287,US 3227468288,3227468799,CA 3227468800,3227484159,US -3227484160,3227503871,CA -3227503872,3227504127,US -3227504128,3227517183,CA -3227517184,3227518719,ZA -3227518720,3227519231,MU -3227519232,3227521279,ZA +3227484160,3227517183,CA +3227517184,3227521279,ZA 3227521280,3227521791,US 3227521792,3227522559,ZA 3227522560,3227522815,MU 3227522816,3227523071,US -3227523072,3227524607,MU -3227524608,3227525119,ZA +3227523072,3227525119,ZA 3227525120,3227525375,MU 3227525376,3227526143,ZA 3227526144,3227526399,US @@ -91031,8 +94115,7 @@ 3227559168,3227559423,GB 3227559424,3227559935,ZA 3227559936,3227562239,US -3227562240,3227562495,MU -3227562496,3227566079,ZA +3227562240,3227566079,ZA 3227566080,3227566335,US 3227566336,3227566847,MU 3227566848,3227568127,ZA @@ -91243,16 +94326,14 @@ 3227804672,3227804927,US 3227804928,3227805183,CA 3227805184,3227805439,SG -3227805440,3227805695,FI +3227805440,3227805695,GB 3227805696,3227806463,US -3227806464,3227806495,FI -3227806496,3227806527,GB -3227806528,3227806719,FI +3227806464,3227806719,GB 3227806720,3227806975,US 3227806976,3227807039,SG 3227807040,3227807743,US -3227807744,3227812351,FI -3227812608,3227813375,FI +3227807744,3227812351,GB +3227812608,3227813375,GB 3227813376,3227813631,US 3227813632,3227815167,GB 3227815168,3227815935,US @@ -91261,7 +94342,8 @@ 3227818496,3227818751,GB 3227818752,3227819263,MX 3227819264,3227819519,AR -3227819520,3227822847,MX +3227819520,3227822079,MX +3227822336,3227822847,MX 3227822848,3227823103,HN 3227823104,3227824383,MX 3227824384,3227824639,BR @@ -91317,9 +94399,9 @@ 3227879680,3227879935,GB 3227879936,3227880959,US 3227880960,3227881215,EG -3227881216,3227883319,US -3227883320,3227883320,CA -3227883321,3227885823,US +3227881216,3227883007,US +3227883008,3227883519,CA +3227883520,3227885823,US 3227885824,3227887871,ES 3227887872,3227888127,PR 3227888128,3227888383,BE @@ -91513,6 +94595,7 @@ 3228297984,3228298495,NL 3228298496,3228309247,US 3228309248,3228311039,DE +3228311296,3228311551,DE 3228311808,3228312063,DE 3228312320,3228316159,DE 3228316160,3228316415,US @@ -91796,7 +94879,9 @@ 3229391360,3229391615,CN 3229391616,3229391871,AT 3229391872,3229395455,US -3229395456,3229408255,RU +3229395456,3229401087,RU +3229401088,3229405183,GB +3229405184,3229408255,RU 3229408256,3229412095,US 3229412096,3229412351,DE 3229412352,3229412607,US @@ -92119,8 +95204,8 @@ 3230318592,3230318847,GB 3230318848,3230321663,US 3230321664,3230321919,PT -3230321920,3230323199,US -3230323200,3230323711,AT +3230321920,3230323455,US +3230323456,3230323711,AT 3230323712,3230327807,US 3230327808,3230328063,AT 3230328064,3230328319,GB @@ -92152,16 +95237,20 @@ 3230370560,3230370815,US 3230370816,3230372607,CA 3230372608,3230372863,US -3230372864,3230374399,CA -3230374400,3230374655,US -3230374656,3230383359,CA +3230372864,3230383359,CA 3230383360,3230383615,US 3230383616,3230384127,CA 3230384128,3230384383,MF 3230384384,3230387455,CA 3230387456,3230387711,US 3230387712,3230400255,CA -3230400256,3230400767,US +3230400256,3230402559,US +3230402560,3230404607,BR +3230406656,3230414847,BR +3230414848,3230415871,CL +3230415872,3230416895,AR +3230424064,3230425087,EC +3230432256,3230432767,CO 3230433280,3230436351,CN 3230436352,3230437375,AU 3230437376,3230439423,PK @@ -92176,10 +95265,15 @@ 3230460928,3230463999,IN 3230465024,3230466047,BD 3230531584,3230662655,ZA +3230679040,3230681087,BR 3230681088,3230683135,FR 3230683136,3230686207,BD 3230686208,3230687231,ID +3230687232,3230695423,BR 3230695424,3230728191,US +3230777344,3230779391,BR +3230783488,3230784511,BR +3230784512,3230785535,MX 3230785536,3230823679,US 3230823680,3230823935,DK 3230823936,3230824191,US @@ -92779,7 +95873,8 @@ 3231737600,3231738367,US 3231738368,3231738623,NL 3231738624,3231739135,US -3231739136,3231739647,NL +3231739136,3231739391,GB +3231739392,3231739647,PL 3231739648,3231739903,BR 3231739904,3231742719,US 3231742720,3231742975,FR @@ -93115,9 +96210,7 @@ 3233487872,3233488895,CA 3233488896,3233546751,US 3233546752,3233547007,CA -3233547008,3233547519,US -3233547520,3233547775,CA -3233547776,3233548799,US +3233547008,3233548799,US 3233548800,3233549055,PT 3233549056,3233549311,BR 3233549312,3233557247,US @@ -93127,7 +96220,7 @@ 3233562368,3233562879,GB 3233562880,3233563135,FR 3233563136,3233563903,US -3233563904,3233564159,GB +3233563904,3233564159,NL 3233564160,3233564415,US 3233564416,3233564671,NZ 3233564672,3233564927,US @@ -93149,8 +96242,7 @@ 3233575936,3233576191,RU 3233576192,3233576447,GB 3233576448,3233577215,US -3233577216,3233577471,AT -3233577472,3233577727,GB +3233577216,3233577727,NL 3233577728,3233578239,US 3233578240,3233578495,GB 3233578496,3233578751,US @@ -93198,7 +96290,7 @@ 3233617664,3233617919,GB 3233617920,3233618175,JP 3233618176,3233620479,US -3233620480,3233620735,AU +3233620480,3233620735,NZ 3233620736,3233620991,US 3233620992,3233622015,CA 3233622016,3233622271,US @@ -93250,8 +96342,7 @@ 3233676288,3233677311,US 3233677312,3233677567,CA 3233677568,3233684991,US -3233684992,3233685247,MX -3233685248,3233685503,BR +3233684992,3233685503,MX 3233685504,3233688575,US 3233688576,3233688831,GB 3233688832,3233692159,US @@ -93375,7 +96466,7 @@ 3234015744,3234016255,IE 3234016256,3234019327,AU 3234019328,3234023423,US -3234023424,3234023679,PL +3234023424,3234023679,NL 3234023680,3234030079,US 3234030080,3234030335,DE 3234030336,3234031103,US @@ -93446,20 +96537,14 @@ 3234198784,3234199039,US 3234199040,3234201343,CA 3234201344,3234203647,US -3234203648,3234205183,BR -3234205184,3234205439,AR -3234205440,3234205695,BR +3234203648,3234205695,AR 3234205696,3234226431,US 3234226432,3234226687,IN 3234226688,3234226983,US 3234226984,3234226991,CA 3234226992,3234227455,US -3234227456,3234227839,CA -3234227840,3234227871,US -3234227872,3234227903,CA -3234227904,3234227935,US -3234227936,3234227951,CA -3234227952,3234228223,US +3234227456,3234227711,CA +3234227712,3234228223,US 3234228224,3234228287,CA 3234228288,3234229215,US 3234229216,3234229223,SE @@ -93506,7 +96591,7 @@ 3234557440,3234564607,US 3234564608,3234566911,KR 3234566912,3234568703,US -3234568704,3234568959,AU +3234568704,3234568959,NZ 3234568960,3234569215,US 3234569728,3234569983,CL 3234569984,3234574335,US @@ -93606,7 +96691,9 @@ 3234841600,3234841855,PT 3234841856,3234842367,AU 3234842368,3234842623,US -3234842624,3234844415,BR +3234842624,3234843647,BR +3234843648,3234844159,MX +3234844160,3234844415,BR 3234844416,3234853375,US 3234853376,3234853631,TH 3234853632,3234853887,US @@ -93625,7 +96712,9 @@ 3235044376,3235044383,GB 3235044384,3235045375,US 3235045376,3235045887,CA -3235045888,3235065343,US +3235045888,3235046831,US +3235046832,3235046847,AF +3235046848,3235065343,US 3235065344,3235065855,CA 3235065856,3235068511,US 3235068512,3235068575,IT @@ -93649,12 +96738,17 @@ 3235641856,3235642111,US 3235642112,3235643135,CA 3235643136,3235745791,US -3235745792,3235745792,DE -3235745793,3235747839,US +3235745792,3235746047,DE +3235746048,3235746303,US +3235746304,3235746559,DE +3235746560,3235747839,US 3235747840,3235748095,GB 3235748096,3235748351,US 3235748352,3235748607,GB -3235748608,3235774719,US +3235748608,3235753983,US +3235753984,3235754239,SG +3235754240,3235754495,JP +3235754496,3235774719,US 3235774720,3235776767,CA 3235776768,3235800575,US 3235800576,3235801087,CA @@ -93748,13 +96842,13 @@ 3236102400,3236106239,PH 3236106240,3236140543,US 3236140544,3236141055,CA -3236141056,3236142335,US -3236142336,3236142463,CA -3236142464,3236146195,US +3236141056,3236146195,US 3236146196,3236146199,GB 3236146200,3236147063,US 3236147064,3236147071,FR -3236147072,3236157951,US +3236147072,3236156959,US +3236156960,3236156967,GB +3236156968,3236157951,US 3236157952,3236158207,GB 3236158208,3236167935,US 3236167936,3236175871,CA @@ -93953,13 +97047,7 @@ 3237036544,3237036799,CN 3237036800,3237038079,US 3237038080,3237038335,CA -3237038336,3237038847,US -3237038848,3237038863,AE -3237038864,3237038879,US -3237038880,3237038911,AE -3237038912,3237038927,US -3237038928,3237039103,AE -3237039104,3237039183,US +3237038336,3237039183,US 3237039184,3237039199,IN 3237039200,3237039215,US 3237039216,3237039295,IN @@ -93971,9 +97059,7 @@ 3237040896,3237041151,IN 3237041152,3237041183,US 3237041184,3237041199,IN -3237041200,3237041407,US -3237041408,3237041663,CA -3237041664,3237043967,US +3237041200,3237043967,US 3237043968,3237044223,CH 3237044224,3237046647,US 3237046648,3237046655,SE @@ -93981,7 +97067,8 @@ 3237047040,3237047295,FR 3237047296,3237048831,US 3237048832,3237049087,IN -3237049088,3237049599,CA +3237049088,3237049343,US +3237049344,3237049599,CA 3237049600,3237050111,US 3237050112,3237050159,GB 3237050160,3237050175,US @@ -93994,7 +97081,8 @@ 3237125312,3237154815,US 3237154816,3237155839,ES 3237155840,3237156863,AU -3237156864,3237167103,US +3237156864,3237170175,US +3237170176,3237171199,CA 3237171200,3237182463,US 3237182464,3237183487,NL 3237183488,3237205503,US @@ -94066,7 +97154,9 @@ 3237554432,3237554434,SG 3237554435,3237554435,US 3237554436,3237554463,SG -3237554464,3237568511,US +3237554464,3237554943,US +3237554944,3237555199,SG +3237555200,3237568511,US 3237568512,3237572607,CA 3237572608,3237576703,US 3237576704,3237609471,CA @@ -94116,94 +97206,43 @@ 3237773312,3237777407,CA 3237777408,3237781503,US 3237781504,3237785599,CA -3237785600,3237785647,CN -3237785648,3237785663,US -3237785664,3237785743,CN -3237785744,3237785751,US -3237785752,3237785839,CN -3237785840,3237785855,US -3237785856,3237785943,CN -3237785944,3237785951,US -3237785952,3237786047,CN -3237786048,3237786055,US -3237786056,3237786151,CN -3237786152,3237786159,US -3237786160,3237786239,CN -3237786240,3237786247,US -3237786248,3237786303,CN -3237786304,3237786319,US -3237786320,3237786415,CN -3237786416,3237786423,US -3237786424,3237786527,CN -3237786528,3237786535,US -3237786536,3237786711,CN -3237786712,3237786719,US -3237786720,3237786759,CN -3237786760,3237786767,US -3237786768,3237786975,CN -3237786976,3237786983,US -3237786984,3237787103,CN -3237787104,3237787111,US -3237787112,3237787159,CN -3237787160,3237787167,US -3237787168,3237787287,CN -3237787288,3237787295,US -3237787296,3237787375,CN -3237787376,3237787383,US -3237787384,3237787455,CN -3237787456,3237787463,US -3237787464,3237787551,CN -3237787552,3237787559,US -3237787560,3237787695,CN -3237787696,3237787703,US -3237787704,3237787719,CN -3237787720,3237787727,US -3237787728,3237787759,CN -3237787760,3237787767,US -3237787768,3237787839,CN -3237787840,3237787847,US -3237787848,3237788023,CN -3237788024,3237788031,US -3237788032,3237788079,CN -3237788080,3237788087,US -3237788088,3237788151,CN -3237788152,3237788159,US -3237788160,3237788223,CN -3237788224,3237788239,US -3237788240,3237788279,CN -3237788280,3237788287,US -3237788288,3237788455,CN -3237788456,3237788471,US -3237788472,3237788487,CN -3237788488,3237788551,US -3237788552,3237788559,CN -3237788560,3237788583,US -3237788584,3237788591,CN -3237788592,3237788727,US -3237788728,3237788855,CN -3237788856,3237788863,US -3237788864,3237788903,CN -3237788904,3237788911,US -3237788912,3237788927,CN -3237788928,3237788935,US -3237788936,3237788943,CN -3237788944,3237788951,US -3237788952,3237789071,CN -3237789072,3237789079,US -3237789080,3237789247,CN -3237789248,3237789255,US -3237789256,3237789311,CN -3237789312,3237789319,US -3237789320,3237789367,CN -3237789368,3237789375,US -3237789376,3237789415,CN -3237789416,3237789423,US -3237789424,3237789479,CN -3237789480,3237789487,US -3237789488,3237789647,CN -3237789648,3237789655,US -3237789656,3237789695,CN -3237789696,3237797887,US +3237785600,3237786967,US +3237786968,3237786975,CN +3237786976,3237787175,US +3237787176,3237787191,CN +3237787192,3237787215,US +3237787216,3237787223,CN +3237787224,3237787279,US +3237787280,3237787287,CN +3237787288,3237787327,US +3237787328,3237787343,CN +3237787344,3237787423,US +3237787424,3237787431,CN +3237787432,3237787439,US +3237787440,3237787447,CN +3237787448,3237787463,US +3237787464,3237787471,CN +3237787472,3237787567,US +3237787568,3237787575,CN +3237787576,3237787607,US +3237787608,3237787615,CN +3237787616,3237787687,US +3237787688,3237787695,CN +3237787696,3237787847,US +3237787848,3237787855,CN +3237787856,3237788063,US +3237788064,3237788071,CN +3237788072,3237788087,US +3237788088,3237788095,CN +3237788096,3237788103,US +3237788104,3237788111,CN +3237788112,3237788135,US +3237788136,3237788143,CN +3237788144,3237788183,US +3237788184,3237788207,CN +3237788208,3237788343,US +3237788344,3237788359,CN +3237788360,3237797887,US 3237797888,3237801983,CA 3237801984,3237858303,US 3237858304,3237863423,CA @@ -94474,7 +97513,7 @@ 3237969152,3237969407,RO 3237969408,3238002687,US 3238002688,3238008831,NL -3238008832,3238010879,ES +3238008832,3238010879,HU 3238010880,3238017023,CH 3238017024,3238018303,DK 3238018304,3238018559,UA @@ -94650,7 +97689,7 @@ 3239063552,3239075839,DE 3239075840,3239076095,GB 3239076096,3239076351,DE -3239076352,3239076607,RU +3239076352,3239076607,CH 3239076608,3239076863,PL 3239076864,3239077119,NL 3239077120,3239077375,UA @@ -94666,7 +97705,7 @@ 3239088640,3239088895,DK 3239088896,3239089151,IL 3239089152,3239089407,RO -3239089408,3239089919,GB +3239089664,3239089919,GB 3239089920,3239090175,DE 3239090176,3239090431,SI 3239090432,3239090687,ES @@ -94798,7 +97837,7 @@ 3239264768,3239266303,RU 3239266816,3239267327,UA 3239267328,3239267839,FR -3239267840,3239268351,DE +3239267840,3239268351,CH 3239268352,3239268863,SE 3239268864,3239269375,RU 3239269376,3239270399,UA @@ -94807,8 +97846,7 @@ 3239271424,3239271935,AT 3239271936,3239272447,CH 3239272960,3239273471,GB -3239273472,3239273983,UA -3239273984,3239274495,RU +3239273472,3239274495,RU 3239274496,3239275007,PL 3239275520,3239276543,UA 3239276544,3239277055,LU @@ -95834,7 +98872,7 @@ 3240855552,3240857599,IT 3240857600,3240857855,PL 3240858624,3240858879,PL -3240859136,3240859391,GB +3240859136,3240859391,NL 3240859392,3240859647,SE 3240859648,3240861183,CH 3240861184,3240861439,AT @@ -96111,11 +99149,15 @@ 3242609920,3242610047,GB 3242610048,3242610271,FR 3242610272,3242610303,FI -3242610304,3242615167,FR +3242610304,3242614527,FR +3242614528,3242614783,PL +3242614784,3242615167,FR 3242615168,3242615295,IE 3242615296,3242615871,FR 3242615872,3242615935,PL -3242615936,3242616191,FR +3242615936,3242616029,FR +3242616030,3242616030,NL +3242616031,3242616191,FR 3242616192,3242616319,ES 3242616320,3242616991,FR 3242616992,3242616992,IT @@ -96128,7 +99170,10 @@ 3242618496,3242620223,FR 3242620224,3242620239,PT 3242620240,3242620255,ES -3242620256,3242622975,FR +3242620256,3242622915,FR +3242622916,3242622927,PL +3242622928,3242622959,FR +3242622960,3242622975,PL 3242622976,3242655743,IT 3242655744,3242721279,NO 3242721280,3242852351,CH @@ -96288,7 +99333,6 @@ 3244819456,3244819711,GB 3244819712,3244819967,RO 3244819968,3244820223,NL -3244820224,3244820479,UA 3244820480,3244820735,BE 3244820736,3244820991,DE 3244820992,3244821247,SI @@ -96555,7 +99599,7 @@ 3244897536,3244897791,RU 3244897792,3244898047,GB 3244898048,3244898303,DE -3244898304,3244898559,IR +3244898304,3244898559,KW 3244898560,3244898815,GI 3244899072,3244899327,RU 3244899328,3244899583,BG @@ -96662,7 +99706,7 @@ 3244929792,3244930047,RU 3244930048,3244930303,PL 3244930304,3244930559,AT -3244930560,3244930815,GB +3244930560,3244930815,CA 3244930816,3244931071,NL 3244931328,3244931583,RO 3244931584,3244931839,FR @@ -96823,7 +99867,6 @@ 3245066240,3245067263,UA 3245067264,3245068287,GB 3245069312,3245070335,PL -3245070336,3245071359,RU 3245071360,3245072383,NL 3245072384,3245073407,UA 3245073408,3245076479,RU @@ -97031,7 +100074,9 @@ 3245215744,3245217791,UA 3245217792,3245218815,DE 3245218816,3245219839,AT -3245219840,3245221887,FI +3245219840,3245220863,FI +3245220864,3245221119,SE +3245221120,3245221887,FI 3245221888,3245223935,DE 3245223936,3245225471,NL 3245225728,3245225983,NL @@ -97209,7 +100254,8 @@ 3246129152,3246131711,RU 3246131712,3246132735,SY 3246132736,3246132991,DE -3246132992,3246135807,RU +3246132992,3246134271,RU +3246134784,3246135807,RU 3246135808,3246136831,SY 3246136832,3246138879,RU 3246138880,3246139391,SY @@ -97244,7 +100290,7 @@ 3246182400,3246186495,SY 3246186496,3246187519,RU 3246187520,3246190591,SY -3246190592,3246191615,GB +3246190592,3246191615,US 3246191616,3246192639,DE 3246192640,3246193663,PS 3246193664,3246194175,SY @@ -97255,7 +100301,7 @@ 3246329088,3246329855,ES 3246350848,3246351103,ES 3246351616,3246352639,ES -3246360576,3246362623,US +3246359552,3246362623,US 3246362624,3246371073,ES 3246371074,3246371074,PT 3246371075,3246379007,ES @@ -97441,7 +100487,7 @@ 3247366144,3247370495,FI 3247371008,3247371263,PL 3247371264,3247371519,SE -3247371520,3247371775,GB +3247371520,3247371775,CA 3247371776,3247372031,RU 3247372032,3247372287,FI 3247372288,3247372543,RO @@ -97676,7 +100722,6 @@ 3248792320,3248792343,GB 3248792352,3248792407,GB 3248792416,3248792439,GB -3248792456,3248792463,GB 3248792480,3248792527,GB 3248792536,3248792575,GB 3248796608,3248796863,GB @@ -98237,6 +101282,7 @@ 3250642944,3250651135,CH 3250651136,3250659327,IT 3250659328,3250660607,GB +3250661376,3250662399,GB 3250667520,3250675711,PL 3250675712,3250683903,GB 3250683904,3250692095,CH @@ -98305,8 +101351,7 @@ 3251114496,3251114751,RU 3251114752,3251115007,RO 3251115008,3251115263,PL -3251115264,3251115519,RU -3251115520,3251115775,UA +3251115264,3251115775,RU 3251115776,3251116031,BE 3251116288,3251116543,GB 3251117056,3251117311,BG @@ -98378,7 +101423,8 @@ 3251151104,3251151359,UA 3251151360,3251151615,DE 3251151872,3251152127,NL -3251152128,3251152639,RO +3251152128,3251152383,RO +3251152384,3251152639,GB 3251152896,3251153151,RU 3251153408,3251153663,TR 3251153664,3251153919,FR @@ -98418,7 +101464,7 @@ 3251163904,3251164159,RU 3251164160,3251164415,UA 3251164416,3251164671,IT -3251164672,3251164927,NL +3251164672,3251164927,GB 3251164928,3251165439,PL 3251165696,3251165951,DE 3251165952,3251166207,UA @@ -98587,7 +101633,6 @@ 3251269120,3251269375,DK 3251269376,3251269631,FR 3251269888,3251270143,GB -3251270144,3251270399,PL 3251270400,3251270655,NO 3251270656,3251270911,DE 3251270912,3251271167,PL @@ -98658,12 +101703,10 @@ 3251634176,3251896319,FI 3251896320,3252158463,NO 3252158464,3252174847,LT -3252174848,3252176127,NL -3252176128,3252177919,SE +3252174848,3252175871,NL +3252175872,3252177919,SE 3252177920,3252178943,HR -3252178944,3252179199,SE -3252179200,3252179967,NL -3252179968,3252191231,SE +3252178944,3252191231,SE 3252191232,3252196351,HR 3252196352,3252197119,LT 3252197120,3252197375,SE @@ -98672,8 +101715,8 @@ 3252220928,3252221183,SE 3252221184,3252222463,LT 3252222464,3252223487,SE -3252223488,3252223999,LT -3252224000,3252232319,SE +3252223488,3252224511,LT +3252224512,3252232319,SE 3252232320,3252232576,NL 3252232577,3252256767,SE 3252256768,3252273151,EE @@ -98968,7 +102011,11 @@ 3253248000,3253248255,DE 3253248256,3253270527,RU 3253270528,3253271551,BY -3253271552,3253338111,RU +3253271552,3253313535,RU +3253313536,3253313791,NL +3253313792,3253317631,RU +3253317632,3253319679,GB +3253319680,3253338111,RU 3253338112,3253338367,PL 3253338368,3253380351,SE 3253380352,3253380607,GB @@ -99151,7 +102198,8 @@ 3253704704,3253705215,UA 3253705728,3253706239,DE 3253706240,3253706751,RO -3253706752,3253708799,DE +3253707264,3253707775,DE +3253707776,3253708287,MD 3253708800,3253709311,DK 3253709312,3253709823,UA 3253709824,3253710335,RO @@ -99191,129 +102239,193 @@ 3253729792,3253730303,UA 3253730304,3253730815,RO 3253730816,3253731327,UA -3253731328,3253731583,DE -3253731584,3253737215,GB +3253731328,3253731713,DE +3253731714,3253731714,GB +3253731715,3253731839,DE +3253731840,3253732351,GB +3253732352,3253733375,DE +3253733376,3253734399,GB +3253734400,3253734979,DE +3253734980,3253734980,GB +3253734981,3253735167,DE +3253735168,3253735423,GB +3253735424,3253735425,DE +3253735426,3253735426,GB +3253735427,3253735679,DE +3253735680,3253735935,GB +3253735936,3253737215,DE 3253737216,3253737471,ES -3253737472,3253737791,GB +3253737472,3253737605,DE +3253737606,3253737606,GB +3253737607,3253737791,DE 3253737792,3253737807,FR -3253737808,3253737823,GB +3253737808,3253737823,DE 3253737824,3253737831,PL 3253737832,3253737839,AT -3253737840,3253737847,GB +3253737840,3253737847,DE 3253737848,3253737855,HU -3253737856,3253738559,GB +3253737856,3253738495,DE +3253738496,3253738559,GB 3253738560,3253738567,CZ 3253738568,3253738569,BE 3253738570,3253738570,US 3253738571,3253738575,BE -3253738576,3253741679,GB +3253738576,3253740543,GB +3253740544,3253741615,DE +3253741616,3253741631,GB +3253741632,3253741679,DE 3253741680,3253741695,RU -3253741696,3253741730,GB +3253741696,3253741730,DE 3253741731,3253741731,SE -3253741732,3253742227,GB +3253741732,3253741816,DE +3253741817,3253741817,GB +3253741818,3253742079,DE +3253742080,3253742227,GB 3253742228,3253742228,US -3253742229,3253744415,GB +3253742229,3253742335,GB +3253742336,3253742591,DE +3253742592,3253744415,GB 3253744416,3253744447,CH 3253744448,3253744511,GB 3253744512,3253744512,US -3253744513,3253745983,GB +3253744513,3253744895,GB +3253744896,3253744908,DE +3253744909,3253744909,GB +3253744910,3253745919,DE +3253745920,3253745983,GB 3253745984,3253745999,SE 3253746000,3253746007,DK 3253746008,3253746015,IE 3253746016,3253746023,AT 3253746024,3253746031,CH 3253746032,3253746039,FI -3253746040,3253746047,GB +3253746040,3253746047,DE 3253746048,3253746111,IT 3253746112,3253746175,DE -3253746176,3253760511,GB +3253746176,3253746431,GB +3253746432,3253746559,DE +3253746560,3253746687,GB +3253746688,3253747711,DE +3253747712,3253759999,GB +3253760000,3253760511,DE 3253760512,3253760767,FR -3253760768,3253761407,GB +3253760768,3253761407,DE 3253761408,3253761416,ES 3253761417,3253761417,GB 3253761418,3253761471,ES -3253761472,3253762815,GB +3253761472,3253762815,DE 3253762816,3253762943,CH -3253762944,3253763071,GB +3253762944,3253762948,DE +3253762949,3253762949,GB +3253762950,3253763071,DE 3253763072,3253763327,SE -3253763328,3253765119,GB +3253763328,3253763583,DE +3253763584,3253763839,GB +3253763840,3253764095,DE +3253764096,3253765119,GB 3253765120,3253765183,ES 3253765184,3253765247,FR 3253765248,3253765279,PL 3253765280,3253765295,NL 3253765296,3253765311,BE 3253765312,3253765375,TR -3253765376,3253766463,GB +3253765376,3253766143,DE +3253766144,3253766463,GB 3253766464,3253766527,NL 3253766528,3253766655,GB 3253766656,3253766911,FR 3253766912,3253767167,GB 3253767168,3253767615,DE 3253767616,3253767675,IE -3253767676,3253767679,DE -3253767680,3253767711,GB -3253767712,3253767743,DE -3253767744,3253768369,GB +3253767676,3253767811,DE +3253767812,3253767812,GB +3253767813,3253767935,DE +3253767936,3253768369,GB 3253768370,3253768370,ES 3253768371,3253768393,GB 3253768394,3253768394,SE 3253768395,3253768565,GB 3253768566,3253768566,DE -3253768567,3253769362,GB -3253769363,3253769363,DE -3253769364,3253769455,GB -3253769456,3253769463,DE -3253769464,3253770983,GB -3253770984,3253770984,DE -3253770985,3253771199,GB -3253771200,3253771263,IE -3253771264,3253771561,GB +3253768567,3253768703,GB +3253768704,3253768729,DE +3253768730,3253768730,GB +3253768731,3253770657,DE +3253770658,3253770658,GB +3253770659,3253770699,DE +3253770700,3253770700,GB +3253770701,3253770991,DE +3253770992,3253770999,GB +3253771000,3253771165,DE +3253771166,3253771166,GB +3253771167,3253771199,DE +3253771200,3253771217,IE +3253771218,3253771219,GB +3253771220,3253771263,IE +3253771264,3253771519,DE +3253771520,3253771561,GB 3253771562,3253771562,DE -3253771563,3253772063,GB -3253772064,3253772095,DE -3253772096,3253772519,GB -3253772520,3253772527,DE -3253772528,3253773055,GB -3253773056,3253773311,DE -3253773312,3253774583,GB -3253774584,3253774591,DE -3253774592,3253775183,GB +3253771563,3253771775,GB +3253771776,3253771792,DE +3253771793,3253771793,GB +3253771794,3253772191,DE +3253772192,3253772207,GB +3253772208,3253772311,DE +3253772312,3253772319,GB +3253772320,3253774335,DE +3253774336,3253774583,GB +3253774584,3253775135,DE +3253775136,3253775151,GB +3253775152,3253775183,DE 3253775184,3253775191,FR -3253775192,3253775215,GB -3253775216,3253775223,DE -3253775224,3253775586,GB -3253775587,3253775587,DE -3253775588,3253775599,GB +3253775192,3253775401,DE +3253775402,3253775402,GB +3253775403,3253775468,DE +3253775469,3253775469,GB +3253775470,3253775599,DE 3253775600,3253775607,IT -3253775608,3253775807,GB +3253775608,3253775615,DE +3253775616,3253775807,GB 3253775808,3253775823,DE -3253775824,3253776159,GB -3253776160,3253776175,DE -3253776176,3253776303,GB +3253775824,3253775871,GB +3253775872,3253776303,DE 3253776304,3253776311,ES -3253776312,3253776809,GB +3253776312,3253776383,DE +3253776384,3253776809,GB 3253776810,3253776810,CH -3253776811,3253777791,GB +3253776811,3253777407,GB +3253777408,3253777791,DE 3253777792,3253777855,FR -3253777856,3253778231,GB +3253777856,3253778231,DE 3253778232,3253778239,FR -3253778240,3253778271,GB -3253778272,3253778287,DE -3253778288,3253778391,GB +3253778240,3253778391,DE 3253778392,3253778399,IT -3253778400,3253778751,GB +3253778400,3253778751,DE 3253778752,3253778879,BE -3253778880,3253779215,GB -3253779216,3253779247,DE -3253779248,3253781247,GB -3253781248,3253781415,DE +3253778880,3253778911,DE +3253778912,3253778943,NL +3253778944,3253779135,DE +3253779136,3253779167,NL +3253779168,3253779455,DE +3253779456,3253779711,GB +3253779712,3253781415,DE 3253781416,3253781423,GB 3253781424,3253781503,DE 3253781504,3253781615,GB 3253781616,3253781631,FR -3253781632,3253783487,GB +3253781632,3253782015,GB +3253782016,3253782527,DE +3253782528,3253783487,GB 3253783488,3253783519,DE -3253783520,3253796863,GB +3253783520,3253783551,GB +3253783552,3253784803,DE +3253784804,3253784804,GB +3253784805,3253785123,DE +3253785124,3253785124,GB +3253785125,3253788079,DE +3253788080,3253788082,GB +3253788083,3253794303,DE +3253794304,3253796607,GB +3253796608,3253796863,DE 3253796864,3253862399,SE 3253862400,3253862655,GB 3253862656,3253882879,FR @@ -99445,7 +102557,9 @@ 3254487264,3254487295,KM 3254487296,3254487419,CF 3254487420,3254487559,FR -3254487560,3254487803,CI +3254487560,3254487567,CI +3254487568,3254487575,FR +3254487576,3254487803,CI 3254487804,3254488431,FR 3254488432,3254488447,MG 3254488448,3254489087,FR @@ -99727,7 +102841,6 @@ 3254893568,3254894079,CZ 3254894080,3254894335,CH 3254894336,3254894591,SK -3254894592,3254894847,DK 3254894848,3254895103,UA 3254895104,3254895359,GB 3254895360,3254895615,UA @@ -100114,9 +103227,7 @@ 3255743744,3255743999,US 3255744000,3255752959,SE 3255752960,3255753215,LI -3255753216,3255760895,SE -3255760896,3255761151,FO -3255761152,3255762431,SE +3255753216,3255762431,SE 3255762432,3255762943,BE 3255762944,3255771135,DE 3255779328,3255787519,DE @@ -100167,7 +103278,7 @@ 3256410112,3256410623,TR 3256410624,3256411135,GR 3256411136,3256411647,FR -3256411648,3256412159,DE +3256411648,3256412159,CH 3256412672,3256413183,RO 3256413184,3256413695,UA 3256413696,3256414207,PL @@ -100450,9 +103561,9 @@ 3257467904,3257468927,IT 3257469184,3257469439,IT 3257469952,3257470975,PL -3257470976,3257471999,FI +3257470976,3257471999,GB 3257472000,3257472511,SG -3257472512,3257475071,FI +3257472512,3257475071,GB 3257476864,3257477119,DE 3257481472,3257481727,DE 3257482240,3257482751,GB @@ -100702,7 +103813,10 @@ 3258230784,3258232831,NO 3258232832,3258249215,SE 3258249216,3258253311,NO -3258253312,3258269695,NL +3258253312,3258265599,NL +3258267648,3258268671,NL +3258268672,3258268927,IT +3258269184,3258269695,NL 3258271744,3258272767,NL 3258272768,3258273791,FR 3258273792,3258288127,NL @@ -100760,10 +103874,11 @@ 3258511360,3258515455,CH 3258515456,3258580991,FR 3258580992,3258587135,SY -3258587136,3258588159,GB +3258587136,3258588159,US 3258588160,3258593279,RU 3258593280,3258595327,SY -3258595328,3258599423,RU +3258595328,3258597375,RU +3258597888,3258599423,RU 3258599424,3258600959,PS 3258600960,3258613759,RU 3258613760,3258619903,SY @@ -100773,7 +103888,7 @@ 3258621952,3258630143,RU 3258630144,3258634239,SE 3258634240,3258636287,SY -3258636288,3258637311,GB +3258636288,3258637311,US 3258637312,3258637823,PS 3258637824,3258638335,RU 3258638336,3258642431,SY @@ -100830,7 +103945,7 @@ 3258771456,3258772479,KZ 3258772480,3258773503,RU 3258773504,3258774015,FR -3258774016,3258774271,UA +3258774016,3258774271,RU 3258774272,3258774527,DK 3258774528,3258776063,RU 3258776064,3258776319,GE @@ -100931,7 +104046,6 @@ 3259302400,3259303423,CH 3259303424,3259305983,SE 3259305984,3259310079,NL -3259310336,3259311103,DK 3259311104,3259311615,DE 3259317248,3259318271,CH 3259318272,3259318343,GB @@ -100997,8 +104111,8 @@ 3259334544,3259334551,IE 3259334552,3259334655,GB 3259334656,3259338751,DE -3259338752,3259339263,GB -3259339520,3259341823,GB +3259338752,3259339007,GB +3259340800,3259341823,GB 3259342848,3259344895,CH 3259347456,3259347711,CH 3259348224,3259348479,CH @@ -101024,7 +104138,7 @@ 3259454976,3259457279,SE 3259457280,3259457535,IT 3259457536,3259466239,SE -3259466240,3259466495,LI +3259466240,3259466495,HU 3259466496,3259470847,SE 3259470848,3259471871,US 3259471872,3259479807,SE @@ -101261,7 +104375,7 @@ 3261759488,3261767679,IE 3261767680,3261775871,RS 3261775872,3261776383,PL -3261776384,3261777407,RU +3261776384,3261776895,RU 3261777408,3261777449,GB 3261777450,3261777451,NL 3261777452,3261777919,GB @@ -101350,8 +104464,8 @@ 3262034512,3262034519,AX 3262034520,3262034943,FI 3262034944,3262035199,AX -3262035200,3262036991,FI -3262036992,3262038015,AX +3262035200,3262035967,FI +3262035968,3262038015,AX 3262038016,3262038271,FR 3262038528,3262038783,IL 3262038784,3262039039,NO @@ -101640,10 +104754,33 @@ 3262473200,3262473203,ES 3262473204,3262473211,DE 3262473212,3262473215,FR -3262473216,3262473323,JP -3262473324,3262473327,KR -3262473328,3262473471,JP -3262473472,3262473473,DE +3262473216,3262473231,DE +3262473232,3262473239,JP +3262473240,3262473243,DE +3262473244,3262473247,JP +3262473248,3262473251,DE +3262473252,3262473255,JP +3262473256,3262473271,DE +3262473272,3262473283,JP +3262473284,3262473295,DE +3262473296,3262473299,JP +3262473300,3262473303,DE +3262473304,3262473315,JP +3262473316,3262473319,DE +3262473320,3262473323,JP +3262473324,3262473339,DE +3262473340,3262473347,JP +3262473348,3262473355,DE +3262473356,3262473371,JP +3262473372,3262473379,DE +3262473380,3262473383,JP +3262473384,3262473403,DE +3262473404,3262473415,JP +3262473416,3262473439,DE +3262473440,3262473443,JP +3262473444,3262473459,DE +3262473460,3262473467,JP +3262473468,3262473473,DE 3262473474,3262473478,US 3262473479,3262473480,CA 3262473481,3262473483,US @@ -101704,7 +104841,7 @@ 3262473972,3262473983,US 3262473984,3262473985,DE 3262473986,3262473986,TW -3262473987,3262473987,IN +3262473987,3262473987,DE 3262473988,3262473988,SG 3262473989,3262473989,IN 3262473990,3262473990,SG @@ -101713,23 +104850,26 @@ 3262473993,3262473993,IN 3262473994,3262473995,TW 3262473996,3262473996,MY -3262473997,3262473998,ID +3262473997,3262473997,ID +3262473998,3262473998,DE 3262473999,3262473999,TW 3262474000,3262474000,SG 3262474001,3262474001,TW -3262474002,3262474002,MY +3262474002,3262474002,DE 3262474003,3262474003,TW 3262474004,3262474004,SG 3262474005,3262474005,TW 3262474006,3262474007,SG 3262474008,3262474009,TW 3262474010,3262474010,SG -3262474011,3262474011,ID +3262474011,3262474011,DE 3262474012,3262474013,SG 3262474014,3262474014,HK 3262474015,3262474016,SG 3262474017,3262474018,MY -3262474019,3262474026,SG +3262474019,3262474024,SG +3262474025,3262474025,DE +3262474026,3262474026,SG 3262474027,3262474027,CN 3262474028,3262474030,SG 3262474031,3262474031,IN @@ -101742,12 +104882,15 @@ 3262474038,3262474038,MY 3262474039,3262474039,TW 3262474040,3262474041,MY -3262474042,3262474042,CN +3262474042,3262474042,DE 3262474043,3262474043,SG -3262474044,3262474044,GB -3262474045,3262474048,SG +3262474044,3262474044,DE +3262474045,3262474047,SG +3262474048,3262474048,DE 3262474049,3262474049,IN -3262474050,3262474061,SG +3262474050,3262474051,SG +3262474052,3262474052,DE +3262474053,3262474061,SG 3262474062,3262474063,CN 3262474064,3262474064,TW 3262474065,3262474065,IN @@ -101762,10 +104905,12 @@ 3262474076,3262474076,MY 3262474077,3262474077,SG 3262474078,3262474078,IN -3262474079,3262474079,MY +3262474079,3262474079,DE 3262474080,3262474083,SG -3262474084,3262474084,TW -3262474085,3262474087,SG +3262474084,3262474084,DE +3262474085,3262474085,SG +3262474086,3262474086,DE +3262474087,3262474087,SG 3262474088,3262474088,MY 3262474089,3262474089,SG 3262474090,3262474091,MY @@ -101773,10 +104918,12 @@ 3262474095,3262474095,HK 3262474096,3262474097,SG 3262474098,3262474098,MY -3262474099,3262474102,SG +3262474099,3262474100,SG +3262474101,3262474101,DE +3262474102,3262474102,SG 3262474103,3262474103,MY 3262474104,3262474104,CN -3262474105,3262474105,IN +3262474105,3262474105,DE 3262474106,3262474106,MY 3262474107,3262474107,CN 3262474108,3262474108,HK @@ -101786,36 +104933,33 @@ 3262474113,3262474113,PH 3262474114,3262474114,IN 3262474115,3262474115,SG -3262474116,3262474116,TW -3262474117,3262474117,IN +3262474116,3262474117,DE 3262474118,3262474118,TH 3262474119,3262474119,TW -3262474120,3262474120,BN -3262474121,3262474121,TW +3262474120,3262474121,DE 3262474122,3262474122,SG 3262474123,3262474125,MY 3262474126,3262474126,IN -3262474127,3262474128,SG +3262474127,3262474127,SG +3262474128,3262474128,DE 3262474129,3262474130,MY 3262474131,3262474131,IN -3262474132,3262474133,MY +3262474132,3262474133,DE 3262474134,3262474134,CN 3262474135,3262474136,SG -3262474137,3262474137,TW -3262474138,3262474139,CN +3262474137,3262474138,DE +3262474139,3262474139,CN 3262474140,3262474140,TW 3262474141,3262474142,SG 3262474143,3262474143,PH 3262474144,3262474150,SG 3262474151,3262474151,MY 3262474152,3262474152,SG -3262474153,3262474153,IN -3262474154,3262474154,SG -3262474155,3262474155,MY -3262474156,3262474156,IN +3262474153,3262474156,DE 3262474157,3262474157,SG 3262474158,3262474159,MY -3262474160,3262474162,SG +3262474160,3262474161,DE +3262474162,3262474162,SG 3262474163,3262474163,MY 3262474164,3262474164,IN 3262474165,3262474165,CN @@ -101824,83 +104968,93 @@ 3262474168,3262474168,TW 3262474169,3262474169,DE 3262474170,3262474170,SG -3262474171,3262474171,MY +3262474171,3262474171,DE 3262474172,3262474172,SG -3262474173,3262474173,CN +3262474173,3262474173,DE 3262474174,3262474174,TW 3262474175,3262474175,SG 3262474176,3262474176,MY -3262474177,3262474177,SG +3262474177,3262474177,DE 3262474178,3262474178,TW 3262474179,3262474179,CN 3262474180,3262474180,MY 3262474181,3262474181,SG 3262474182,3262474182,MY -3262474183,3262474185,SG +3262474183,3262474183,SG +3262474184,3262474184,DE +3262474185,3262474185,SG 3262474186,3262474186,MY 3262474187,3262474187,SG 3262474188,3262474188,MY 3262474189,3262474189,SG 3262474190,3262474190,CN 3262474191,3262474192,SG -3262474193,3262474193,PH +3262474193,3262474193,DE 3262474194,3262474194,SG 3262474195,3262474195,MY -3262474196,3262474196,IN -3262474197,3262474198,SG +3262474196,3262474197,DE +3262474198,3262474198,SG 3262474199,3262474199,CN -3262474200,3262474200,MY +3262474200,3262474200,DE 3262474201,3262474201,SG 3262474202,3262474203,CN 3262474204,3262474204,IN 3262474205,3262474205,SG -3262474206,3262474206,IN +3262474206,3262474206,DE 3262474207,3262474207,MY 3262474208,3262474208,SG -3262474209,3262474209,MY -3262474210,3262474210,TW +3262474209,3262474210,DE 3262474211,3262474211,SG 3262474212,3262474212,MY 3262474213,3262474213,SG 3262474214,3262474214,CN -3262474215,3262474215,IN +3262474215,3262474215,DE 3262474216,3262474216,SG -3262474217,3262474217,MY +3262474217,3262474217,DE 3262474218,3262474218,SG 3262474219,3262474219,MY -3262474220,3262474222,IN +3262474220,3262474220,IN +3262474221,3262474221,DE +3262474222,3262474222,IN 3262474223,3262474223,SG 3262474224,3262474224,MY 3262474225,3262474225,SG 3262474226,3262474226,MY -3262474227,3262474227,IN +3262474227,3262474227,DE 3262474228,3262474228,SG -3262474229,3262474230,IN +3262474229,3262474230,DE 3262474231,3262474231,SG -3262474232,3262474234,IN +3262474232,3262474232,DE +3262474233,3262474233,IN +3262474234,3262474234,DE 3262474235,3262474236,MY -3262474237,3262474238,SG -3262474239,3262474239,DE -3262474240,3262474255,AU -3262474256,3262474259,NZ -3262474260,3262474263,AU -3262474264,3262474267,NZ -3262474268,3262474271,AU -3262474272,3262474275,NZ -3262474276,3262474367,AU -3262474368,3262474371,NZ -3262474372,3262474395,AU -3262474396,3262474399,NZ -3262474400,3262474463,AU -3262474464,3262474467,NZ -3262474468,3262474495,AU -3262474496,3262474631,DE +3262474237,3262474237,DE +3262474238,3262474238,SG +3262474239,3262474475,DE +3262474476,3262474479,AU +3262474480,3262474631,DE 3262474632,3262474635,DK -3262474636,3262474791,DE -3262474792,3262474815,JP -3262474816,3262474895,DE -3262474896,3262475007,JP -3262475008,3262475009,DE +3262474636,3262474795,DE +3262474796,3262474799,JP +3262474800,3262474807,DE +3262474808,3262474815,JP +3262474816,3262474899,DE +3262474900,3262474907,JP +3262474908,3262474911,DE +3262474912,3262474915,JP +3262474916,3262474919,DE +3262474920,3262474935,JP +3262474936,3262474939,DE +3262474940,3262474947,JP +3262474948,3262474951,DE +3262474952,3262474959,JP +3262474960,3262474963,DE +3262474964,3262474971,JP +3262474972,3262474975,DE +3262474976,3262474987,JP +3262474988,3262474991,DE +3262474992,3262475003,JP +3262475004,3262475009,DE 3262475010,3262475011,US 3262475012,3262475012,DE 3262475013,3262475019,US @@ -102274,7 +105428,7 @@ 3262477468,3262477471,AT 3262477472,3262477475,DE 3262477476,3262477479,FR -3262477480,3262477483,SE +3262477480,3262477483,DE 3262477484,3262477487,NL 3262477488,3262477503,DE 3262477504,3262477507,FR @@ -102953,8 +106107,7 @@ 3262479754,3262479754,FR 3262479755,3262479755,NL 3262479756,3262479756,FR -3262479757,3262479757,SE -3262479758,3262479763,DE +3262479757,3262479763,DE 3262479764,3262479764,FR 3262479765,3262479765,DE 3262479766,3262479766,CH @@ -103281,7 +106434,7 @@ 3263100416,3263100671,DE 3263100672,3263100927,GB 3263100928,3263101183,AT -3263101184,3263101439,SE +3263101184,3263101439,US 3263101440,3263101695,DK 3263101952,3263102207,LT 3263102208,3263102463,GB @@ -103377,7 +106530,8 @@ 3263632384,3263632639,UA 3263632640,3263633151,RU 3263633152,3263633663,UA -3263633664,3263635455,RU +3263633664,3263633919,RU +3263634432,3263635455,RU 3263635456,3263636223,UA 3263636224,3263636479,RU 3263636480,3263636991,UA @@ -103387,7 +106541,7 @@ 3263638528,3263639039,UA 3263639040,3263639295,RU 3263639296,3263639551,DE -3263639552,3263640575,GB +3263639552,3263640575,US 3263640576,3263647743,RU 3263647744,3263651619,LT 3263651620,3263651620,RU @@ -103399,7 +106553,7 @@ 3263657472,3263657727,DE 3263657728,3263660031,RU 3263660032,3263661055,DE -3263661056,3263666175,RU +3263661568,3263666175,RU 3263666176,3263676415,AZ 3263676416,3263678463,RU 3263678464,3263680511,DE @@ -103627,7 +106781,9 @@ 3264610304,3264614399,FR 3264614400,3264614911,GB 3264614912,3264615167,SE -3264615168,3264616263,GB +3264615168,3264615575,GB +3264615576,3264615579,CH +3264615580,3264616263,GB 3264616264,3264616271,CH 3264616272,3264616335,GB 3264616336,3264616337,CH @@ -103686,7 +106842,8 @@ 3264670720,3264671231,FR 3264671232,3264671743,PL 3264671744,3264672255,DE -3264672256,3264672767,RO +3264672256,3264672511,FR +3264672512,3264672767,RO 3264672768,3264673279,CH 3264673280,3264673791,PL 3264673792,3264674303,CH @@ -103950,9 +107107,7 @@ 3265650688,3265658879,SE 3265658880,3265724415,AT 3265724416,3265789951,FR -3265789952,3265824767,GB -3265824768,3265825023,US -3265825024,3265867775,GB +3265789952,3265867775,GB 3265868288,3265868543,GB 3265868800,3265869055,DE 3265871872,3265875967,GB @@ -104594,9 +107749,7 @@ 3270672384,3270680575,GB 3270680576,3270684671,IL 3270684672,3270688767,FR -3270688768,3270716167,IT -3270716168,3270716171,SI -3270716172,3270772079,IT +3270688768,3270772079,IT 3270772080,3270772087,NL 3270772088,3270836223,IT 3270836224,3270901759,DE @@ -104689,9 +107842,7 @@ 3271163904,3271219967,FR 3271219968,3271220223,GP 3271220224,3271229439,FR -3271229440,3271280687,FI -3271280688,3271280703,SE -3271280704,3271360511,FI +3271229440,3271360511,FI 3271360512,3271363407,GB 3271363408,3271363415,AT 3271363416,3271363423,GB @@ -104849,7 +108000,7 @@ 3271744512,3271745023,AT 3271745024,3271745535,PL 3271745536,3271746047,GB -3271746048,3271746559,RO +3271746048,3271746559,CZ 3271746560,3271747071,US 3271747072,3271747583,KZ 3271747584,3271748095,RU @@ -105054,6 +108205,7 @@ 3272216912,3272216927,DE 3272216960,3272217007,GB 3272217088,3272217151,GB +3272217152,3272217159,BE 3272217216,3272217279,BE 3272217280,3272217303,DE 3272217304,3272217327,BE @@ -105196,7 +108348,6 @@ 3272478464,3272478719,FI 3272478720,3272478975,GB 3272478976,3272479231,UA -3272479232,3272479487,GB 3272479488,3272479743,SA 3272479744,3272480255,SE 3272480256,3272480511,FR @@ -105473,7 +108624,7 @@ 3273340128,3273340143,DE 3273340144,3273340415,GB 3273340928,3273341711,FR -3273341760,3273341823,FR +3273341752,3273341831,FR 3273341888,3273341951,FR 3273342022,3273342022,GB 3273342034,3273342034,GB @@ -105537,6 +108688,7 @@ 3273374856,3273374863,GB 3273374896,3273374903,GB 3273374912,3273374931,GB +3273375168,3273375168,GB 3273375232,3273375551,DE 3273375744,3273375871,DE 3273376000,3273376255,DE @@ -105928,7 +109080,6 @@ 3274579968,3274580991,UA 3274580992,3274581503,PL 3274581504,3274581759,NL -3274581760,3274582015,RU 3274582016,3274583039,PL 3274583040,3274584063,DE 3274584064,3274585087,GB @@ -106245,6 +109396,8 @@ 3275423808,3275423839,GB 3275423872,3275424295,GB 3275424320,3275424383,GB +3275424416,3275424427,GB +3275424432,3275424439,GB 3275424480,3275424487,GB 3275424496,3275424639,GB 3275424648,3275424703,GB @@ -106368,7 +109521,8 @@ 3275475376,3275475399,GB 3275475408,3275475447,GB 3275475456,3275475791,GB -3275475800,3275475831,GB +3275475800,3275475807,GB +3275475824,3275475831,GB 3275475840,3275475871,GB 3275475876,3275475879,GB 3275475968,3275476223,GB @@ -106662,9 +109816,7 @@ 3276028384,3276028391,FR 3276028392,3276028543,GB 3276028544,3276028671,FR -3276028672,3276029375,GB -3276029376,3276029439,FR -3276029440,3276030591,GB +3276028672,3276030591,GB 3276030592,3276030607,FR 3276030608,3276031479,GB 3276031480,3276031487,FR @@ -106769,8 +109921,8 @@ 3276300288,3276304383,DE 3276304384,3276304639,BG 3276304640,3276305407,GB -3276305408,3276306943,IL -3276306944,3276308479,NL +3276305408,3276306431,IL +3276306432,3276308479,NL 3276308480,3276309503,GB 3276309504,3276310527,AT 3276310528,3276311551,PT @@ -106842,6 +109994,7 @@ 3276528128,3276528191,GB 3276530688,3276531711,NL 3276532590,3276532590,GR +3276532608,3276532608,GB 3276533248,3276533311,SI 3276536752,3276536783,HU 3276537344,3276537599,AT @@ -106867,7 +110020,8 @@ 3276687872,3276688383,KW 3276688384,3276688895,DE 3276688896,3276689407,ES -3276689408,3276690431,GB +3276689408,3276689919,GB +3276689920,3276690431,IT 3276690432,3276690943,NL 3276690944,3276691455,GR 3276691456,3276691967,RO @@ -107267,9 +110421,13 @@ 3276873760,3276873791,ES 3276873792,3276873983,GB 3276873984,3276874239,ES -3276874240,3276874959,GB +3276874240,3276874351,GB +3276874352,3276874367,ES +3276874368,3276874959,GB 3276874960,3276874975,NL -3276874976,3276880427,GB +3276874976,3276876279,GB +3276876280,3276876283,DK +3276876284,3276880427,GB 3276880428,3276880431,DK 3276880432,3276881811,GB 3276881812,3276881815,FR @@ -107293,7 +110451,9 @@ 3276889088,3276889215,IT 3276889216,3276890175,GB 3276890176,3276890191,US -3276890192,3276893695,GB +3276890192,3276892287,GB +3276892288,3276892303,IT +3276892304,3276893695,GB 3276893696,3276893951,IT 3276893952,3276897727,GB 3276897728,3276897791,BE @@ -107359,9 +110519,13 @@ 3276929024,3276931071,GB 3276931072,3276939263,KZ 3276939264,3276955647,DE -3276955648,3276958719,GB +3276955648,3276956159,GB +3276956160,3276957695,ES +3276957696,3276958719,GB 3276958720,3276959743,IL -3276959744,3276963839,GB +3276959744,3276962815,ES +3276962816,3276963327,GB +3276963328,3276963839,ES 3276963840,3276964351,IL 3276964352,3276964863,RO 3276965376,3276966399,RU @@ -107496,7 +110660,6 @@ 3277360128,3277360639,BG 3277360640,3277361151,CZ 3277361152,3277361663,PL -3277361664,3277362175,RU 3277362176,3277362687,ES 3277363200,3277363711,ES 3277363712,3277364223,RU @@ -107641,7 +110804,9 @@ 3277716480,3277716991,SE 3277716992,3277717503,IT 3277717504,3277725695,YE -3277725696,3277733887,CH +3277725696,3277730559,CH +3277730560,3277730563,GB +3277730564,3277733887,CH 3277733888,3277742079,DE 3277742080,3277745151,FI 3277745152,3277746175,CH @@ -107983,9 +111148,7 @@ 3278939356,3278939379,US 3278939380,3278939383,BR 3278939384,3278939391,US -3278939392,3278939395,DE -3278939396,3278939399,GB -3278939400,3278939403,DE +3278939392,3278939403,DE 3278939404,3278939407,CH 3278939408,3278939419,DE 3278939420,3278939423,IE @@ -108053,45 +111216,41 @@ 3278939900,3278939903,IT 3278939904,3278939907,HK 3278939908,3278939911,MY -3278939912,3278939915,TH -3278939916,3278939923,SG -3278939924,3278939927,CN +3278939912,3278939919,DE +3278939920,3278939923,SG +3278939924,3278939927,DE 3278939928,3278939931,SG 3278939932,3278939935,IN 3278939936,3278939939,MY -3278939940,3278939943,SG -3278939944,3278939947,TW +3278939940,3278939947,DE 3278939948,3278939951,SG 3278939952,3278939955,MY -3278939956,3278939959,SG -3278939960,3278939963,CN +3278939956,3278939963,DE 3278939964,3278939967,MY 3278939968,3278939971,TW -3278939972,3278939979,MY -3278939980,3278939983,TH -3278939984,3278939987,DE -3278939988,3278939991,CN +3278939972,3278939975,MY +3278939976,3278939991,DE 3278939992,3278939995,SG -3278939996,3278939999,MY -3278940000,3278940011,SG -3278940012,3278940015,ID -3278940016,3278940059,SG +3278939996,3278939999,DE +3278940000,3278940007,SG +3278940008,3278940015,DE +3278940016,3278940043,SG +3278940044,3278940047,DE +3278940048,3278940059,SG 3278940060,3278940067,CN 3278940068,3278940071,TW -3278940072,3278940083,SG -3278940084,3278940091,MY +3278940072,3278940079,DE +3278940080,3278940083,SG +3278940084,3278940087,DE +3278940088,3278940091,MY 3278940092,3278940095,SG -3278940096,3278940099,IN +3278940096,3278940099,DE 3278940100,3278940103,SG 3278940104,3278940107,MY -3278940108,3278940127,SG -3278940128,3278940131,TW -3278940132,3278940135,BD -3278940136,3278940139,SG -3278940140,3278940143,IN -3278940144,3278940151,MY -3278940152,3278940155,IN -3278940156,3278940159,PH +3278940108,3278940111,SG +3278940112,3278940115,DE +3278940116,3278940127,SG +3278940128,3278940159,DE 3278940160,3278940163,GR 3278940164,3278940167,CH 3278940168,3278940171,DE @@ -108401,75 +111560,50 @@ 3278942184,3278942203,DE 3278942204,3278942207,CH 3278942208,3278942211,TW -3278942212,3278942227,AU -3278942228,3278942231,NZ -3278942232,3278942243,AU -3278942244,3278942247,NZ -3278942248,3278942255,AU -3278942256,3278942259,NZ -3278942260,3278942271,AU -3278942272,3278942275,NZ -3278942276,3278942291,AU -3278942292,3278942295,NZ -3278942296,3278942299,PG -3278942300,3278942355,AU -3278942356,3278942359,NZ -3278942360,3278942383,AU -3278942384,3278942387,NZ -3278942388,3278942399,AU -3278942400,3278942403,NZ -3278942404,3278942435,AU -3278942436,3278942439,DE -3278942440,3278942443,AU +3278942212,3278942443,DE 3278942444,3278942447,NZ -3278942448,3278942455,AU -3278942456,3278942463,DE +3278942448,3278942463,DE 3278942464,3278942467,SG 3278942468,3278942471,MY -3278942472,3278942475,IN -3278942476,3278942483,SG -3278942484,3278942487,CN +3278942472,3278942479,DE +3278942480,3278942483,SG +3278942484,3278942487,DE 3278942488,3278942491,IN 3278942492,3278942495,MY -3278942496,3278942499,CN +3278942496,3278942499,DE 3278942500,3278942507,MY 3278942508,3278942511,TH 3278942512,3278942515,SG -3278942516,3278942519,PH -3278942520,3278942539,IN -3278942540,3278942543,TW -3278942544,3278942547,PK -3278942548,3278942551,MY +3278942516,3278942519,DE +3278942520,3278942523,IN +3278942524,3278942527,DE +3278942528,3278942531,IN +3278942532,3278942551,DE 3278942552,3278942555,TW 3278942556,3278942559,IN -3278942560,3278942571,MY +3278942560,3278942563,DE +3278942564,3278942571,MY 3278942572,3278942575,IN -3278942576,3278942579,MY -3278942580,3278942583,TW -3278942584,3278942587,SG -3278942588,3278942591,CN +3278942576,3278942591,DE 3278942592,3278942595,TW -3278942596,3278942599,IN +3278942596,3278942599,DE 3278942600,3278942603,SG 3278942604,3278942607,TW -3278942608,3278942611,TH -3278942612,3278942615,PH +3278942608,3278942615,DE 3278942616,3278942627,SG 3278942628,3278942635,MY -3278942636,3278942643,SG -3278942644,3278942647,MY -3278942648,3278942651,IN +3278942636,3278942639,SG +3278942640,3278942651,DE 3278942652,3278942655,MY -3278942656,3278942667,SG -3278942668,3278942671,MY +3278942656,3278942659,DE +3278942660,3278942667,SG +3278942668,3278942671,DE 3278942672,3278942675,SG -3278942676,3278942679,HK +3278942676,3278942679,DE 3278942680,3278942683,TW 3278942684,3278942687,DE 3278942688,3278942691,SG -3278942692,3278942695,IN -3278942696,3278942699,SG -3278942700,3278942703,TW +3278942692,3278942703,DE 3278942704,3278942707,MY 3278942708,3278942719,SG 3278942720,3278942721,DE @@ -108589,7 +111723,7 @@ 3278942890,3278942890,ES 3278942891,3278942894,DE 3278942895,3278942895,NL -3278942896,3278942896,GB +3278942896,3278942896,DE 3278942897,3278942897,CH 3278942898,3278942899,NL 3278942900,3278942903,DE @@ -108689,7 +111823,7 @@ 3278943050,3278943050,IT 3278943051,3278943056,DE 3278943057,3278943057,CH -3278943058,3278943058,FR +3278943058,3278943058,DE 3278943059,3278943059,CH 3278943060,3278943065,DE 3278943066,3278943066,GB @@ -109380,9 +112514,7 @@ 3278944051,3278944051,BE 3278944052,3278944052,AT 3278944053,3278944053,IT -3278944054,3278944054,DE -3278944055,3278944055,IT -3278944056,3278944058,DE +3278944054,3278944058,DE 3278944059,3278944059,ES 3278944060,3278944060,BE 3278944061,3278944061,FR @@ -110214,7 +113346,15 @@ 3280134144,3280142335,IT 3280142336,3280207871,RU 3280207872,3280273407,FR -3280273408,3280338943,RU +3280273408,3280325119,RU +3280325120,3280325631,US +3280325632,3280326655,ES +3280326656,3280327167,US +3280327168,3280327679,RU +3280327680,3280328703,ES +3280328704,3280329727,RU +3280329728,3280330751,IQ +3280330752,3280338943,RU 3280338944,3280347135,GB 3280347136,3280355327,NO 3280355328,3280371711,GR @@ -110391,7 +113531,13 @@ 3280935088,3280935095,ES 3280935096,3280935119,GB 3280935120,3280935127,FR -3280935128,3280952783,GB +3280935128,3280941387,GB +3280941388,3280941395,DE +3280941396,3280942191,GB +3280942192,3280942207,DK +3280942208,3280952331,GB +3280952332,3280952335,DE +3280952336,3280952783,GB 3280952784,3280952799,DE 3280952800,3280955707,GB 3280955708,3280955711,DE @@ -110451,7 +113597,9 @@ 3281028992,3281029055,GB 3281030400,3281035263,GB 3281035264,3281043455,CH -3281043456,3281059839,RU +3281043456,3281049615,RU +3281049616,3281049622,GI +3281049623,3281059839,RU 3281059840,3281062911,DE 3281063040,3281063111,DE 3281063168,3281125375,DE @@ -110610,7 +113758,7 @@ 3282194432,3282195455,UA 3282195456,3282196479,IE 3282196480,3282197503,UA -3282197504,3282198527,RU +3282198272,3282198527,HR 3282198528,3282206719,GB 3282206720,3282223103,CH 3282223104,3282231295,BE @@ -110618,7 +113766,9 @@ 3282239488,3282305023,SE 3282305024,3282370559,PL 3282370560,3282436095,FI -3282436096,3282477055,GB +3282436096,3282468095,GB +3282468096,3282468351,DE +3282468352,3282477055,GB 3282477056,3282485247,RU 3282485248,3282493439,GI 3282493440,3282501631,NG @@ -110750,7 +113900,18 @@ 3283271680,3283279871,RU 3283279872,3283288063,SE 3283288064,3283419135,DE -3283419136,3283484671,DK +3283419136,3283451903,IR +3283451904,3283460095,NO +3283460096,3283464191,GB +3283464192,3283468287,IT +3283468288,3283472383,FI +3283472384,3283476479,CZ +3283476480,3283480575,LU +3283480576,3283482623,LT +3283482624,3283483647,SK +3283483648,3283484159,ES +3283484160,3283484415,DE +3283484416,3283484671,ES 3283484672,3283484927,UA 3283484928,3283485183,NL 3283485184,3283485439,DE @@ -110888,7 +114049,8 @@ 3283980288,3283980799,RO 3283980800,3283981823,CH 3283981824,3283982335,RO -3283982848,3283983359,RO +3283982848,3283983103,SE +3283983104,3283983359,RO 3283983360,3283983871,CY 3283983872,3283984383,GB 3283984384,3283984895,SE @@ -111023,7 +114185,7 @@ 3284084224,3284084735,UA 3284084736,3284085247,RU 3284085248,3284085759,DE -3284085760,3284086783,RO +3284086272,3284086783,RO 3284086784,3284087295,CZ 3284087296,3284087807,RU 3284087808,3284088319,IL @@ -111049,9 +114211,11 @@ 3284099328,3284099583,HU 3284099584,3284100095,GR 3284100096,3284100607,AM +3284100608,3284101119,US 3284101120,3284101631,UA 3284101632,3284102143,GB 3284102144,3284102399,DK +3284102627,3284102627,DK 3284102656,3284103167,AT 3284103168,3284103679,NL 3284103680,3284104191,DE @@ -111245,7 +114409,6 @@ 3285118976,3285119487,RU 3285119488,3285119999,RO 3285120000,3285120511,RU -3285120512,3285121023,RO 3285121024,3285121535,SE 3285121536,3285122047,CY 3285122048,3285123071,RU @@ -111305,11 +114468,12 @@ 3285406720,3285407743,UA 3285407744,3285408767,RU 3285408768,3285409791,GB -3285409792,3285412863,RU +3285409792,3285410815,UA +3285410816,3285412863,RU 3285412864,3285413887,UA -3285413888,3285414911,RU -3285414912,3285415935,UA -3285415936,3285419007,RU +3285413888,3285414978,RU +3285414979,3285414979,UA +3285414980,3285419007,RU 3285419008,3285420031,SE 3285420032,3285425151,UA 3285425152,3285426175,LV @@ -111346,7 +114510,7 @@ 3285480960,3285481215,CH 3285488576,3285488639,CY 3285495296,3285495807,ES -3285501328,3285501359,CZ +3285501312,3285501359,CZ 3285501696,3285501951,GB 3285510144,3285512191,GB 3285515776,3285515799,GR @@ -111454,11 +114618,12 @@ 3285924992,3285924995,FR 3285924996,3285924999,CZ 3285925000,3285925007,RU -3285925008,3285925055,DE +3285925008,3285925059,DE 3285925060,3285925063,CH 3285925064,3285925071,RU 3285925072,3285925079,PL 3285925080,3285925087,IT +3285925088,3285925103,DE 3285925164,3285925171,CH 3285926432,3285926463,CH 3285926592,3285926623,DE @@ -111468,9 +114633,10 @@ 3285931528,3285931559,DE 3285931560,3285931567,HU 3285931568,3285931575,DE +3285931584,3285931599,DE 3285935872,3285936127,GB 3285936136,3285936147,FR -3285936152,3285936167,FR +3285936152,3285936175,FR 3285939136,3285939175,GB 3285939184,3285939191,GB 3285939744,3285939759,GB @@ -111479,23 +114645,24 @@ 3285941248,3285941503,ES 3285943808,3285944063,CH 3285947136,3285947159,NL +3285947168,3285947175,NL 3285949604,3285949607,CH 3285949856,3285949887,ES 3285950208,3285950463,IT 3285951648,3285951679,ES 3285953536,3285953665,GB -3285953672,3285953679,GB -3285953696,3285953727,GB +3285953672,3285953735,GB 3285953792,3285953919,GB 3285954048,3285954303,AE 3285954560,3285954567,RO 3285954568,3285954575,PL 3285954576,3285954815,GB 3285958144,3285958399,BG -3285961984,3285961991,GB +3285961984,3285961995,GB 3285962752,3285963775,DE 3285964800,3285964935,DE -3285964944,3285964959,DE +3285964944,3285964991,DE +3285964992,3285965007,HU 3285965056,3285966079,DE 3285968896,3285970943,GB 3285975040,3286013695,FR @@ -112024,7 +115191,6 @@ 3287668736,3287668991,SI 3287668992,3287669247,PL 3287669248,3287669503,LI -3287669504,3287669759,MD 3287669760,3287670015,RO 3287670016,3287670271,UA 3287670272,3287670527,PL @@ -112184,7 +115350,9 @@ 3287965696,3287973887,RS 3287973888,3287982079,CZ 3287982080,3287990271,EE -3287990272,3287996415,SI +3287990272,3287994367,SI +3287994368,3287995391,BA +3287995392,3287996415,SI 3287996416,3287998463,BA 3287998464,3288006655,IT 3288006656,3288072191,GR @@ -112326,6 +115494,7 @@ 3288569856,3288570111,CU 3288570112,3288570367,JM 3288570368,3288577023,ZA +3288577280,3288577535,NG 3288578048,3288580095,JM 3288580096,3288588287,BB 3288588288,3288608255,ZA @@ -112358,7 +115527,8 @@ 3288785408,3288785663,UG 3288785664,3288785919,TZ 3288785920,3288786175,NG -3288786944,3288787967,ZA +3288786176,3288786431,KE +3288786688,3288787967,ZA 3288787968,3288788223,EG 3288788224,3288792831,ZA 3288792832,3288793087,AO @@ -112466,7 +115636,8 @@ 3289230848,3289231359,GH 3289231360,3289233919,ZA 3289233920,3289234175,TZ -3289234176,3289235455,ZA +3289234176,3289235199,ZA +3289235200,3289235455,KE 3289235456,3289237503,GH 3289237504,3289238015,ZA 3289238016,3289238271,KE @@ -112494,7 +115665,9 @@ 3289320448,3289321471,ZA 3289321472,3289325567,IN 3289325568,3289333759,SA -3289333760,3289391103,ZA +3289333760,3289382911,ZA +3289382912,3289387007,NL +3289387008,3289391103,ZA 3289391104,3289440255,SC 3289440256,3289448447,ZA 3289448448,3289645055,SC @@ -112535,14 +115708,15 @@ 3290171392,3290172159,ZA 3290172160,3290172415,KE 3290172416,3290181631,ZA -3290181632,3290181887,US -3290181888,3290182399,PR -3290182400,3290182655,US -3290182656,3290183423,PR +3290181632,3290181759,PR +3290181760,3290181887,US +3290181888,3290183423,PR 3290183424,3290183679,US -3290183680,3290184959,PR -3290184960,3290185215,US -3290185216,3290185727,PR +3290183680,3290185105,PR +3290185106,3290185106,US +3290185107,3290185107,PR +3290185108,3290185108,US +3290185109,3290185727,PR 3290185728,3290226687,ZA 3290226688,3290230783,MZ 3290230784,3290234879,BF @@ -112626,12 +115800,8 @@ 3291045888,3291078655,ZA 3291078656,3291086847,DZ 3291086848,3291103231,PR -3291103232,3291123711,ZA -3291123712,3291135999,BG -3291136000,3291140095,ZA -3291140096,3291144191,BG -3291144192,3291148287,ZA -3291148288,3291152383,BG +3291103232,3291119615,ZA +3291119616,3291152383,BG 3291152384,3291168767,ZA 3291168768,3291176959,TZ 3291176960,3291185151,ZW @@ -112704,7 +115874,8 @@ 3291287552,3291291647,ZA 3291291648,3291295743,TZ 3291295744,3291299839,NG -3291299840,3291313151,ZA +3291299840,3291312127,ZA +3291312128,3291313151,MU 3291313152,3291314175,NG 3291314176,3291315199,ZA 3291315200,3291316223,UG @@ -112748,7 +115919,9 @@ 3291387904,3291388927,BJ 3291388928,3291389307,GA 3291389308,3291389311,KM -3291389312,3291389951,GA +3291389312,3291389343,GA +3291389344,3291389347,CG +3291389348,3291389951,GA 3291389952,3291397119,ZA 3291397120,3291398143,EG 3291398144,3291406335,ZM @@ -112761,8 +115934,8 @@ 3291430912,3291432703,ZA 3291432704,3291432959,NA 3291432960,3291434239,ZA -3291434752,3291435519,ZA -3291435520,3291437823,NA +3291434752,3291436031,ZA +3291436032,3291437823,NA 3291437824,3291438079,ZA 3291438080,3291439103,NA 3291439104,3291447295,NG @@ -112809,34 +115982,72 @@ 3291554816,3291555071,CD 3291555328,3291555583,CM 3291555840,3291556095,GN +3291556352,3291556607,SN +3291556864,3291557119,TG 3291611136,3291611647,ZA 3291611648,3291611903,MU 3291611904,3291612159,ZA 3291612160,3291613183,NG 3291613184,3291615231,SN 3291615232,3291616255,ML +3291616256,3291616511,TZ +3291616512,3291616767,KE +3291616768,3291617279,EG 3291617280,3291619327,GH 3291619328,3291627519,GA 3291627520,3291643903,ZA -3291676672,3291742207,ZA -3291742208,3291742463,US -3291742464,3291742591,GB +3291643904,3291660287,MZ +3291660288,3291742207,ZA +3291742208,3291742464,US +3291742465,3291742591,GB 3291742592,3291742719,IE -3291742720,3291750399,US -3291750400,3291750655,GB -3291750656,3291757311,US +3291742720,3291744767,US +3291744768,3291745023,MX +3291745024,3291745791,US +3291745792,3291746047,MX +3291746048,3291750399,US +3291750400,3291750655,IT +3291750656,3291750911,US +3291750912,3291751167,SG +3291751168,3291751423,US +3291751424,3291751679,SG +3291751680,3291751935,US +3291751936,3291752191,HK +3291752192,3291753471,US +3291753472,3291753727,GB +3291753728,3291753983,US +3291753984,3291754239,JP +3291754240,3291754495,US +3291754496,3291754751,AU +3291754752,3291755007,GB +3291755008,3291755263,AU +3291755264,3291755519,US +3291755520,3291755775,AU +3291755776,3291756543,US +3291756544,3291756799,AU +3291756800,3291757311,US 3291757312,3291757567,GB -3291757568,3291758079,US +3291757568,3291757823,AU +3291757824,3291758079,US 3291758080,3291758335,GB -3291758336,3291762175,US +3291758336,3291760639,US +3291760640,3291760895,AU +3291760896,3291762175,US 3291762176,3291762431,GB -3291762432,3291763199,US +3291762432,3291762687,AU +3291762688,3291763199,US 3291763200,3291763455,GB 3291763456,3291763711,US 3291763712,3291763967,GB -3291763968,3291813375,US +3291763968,3291766271,US +3291766272,3291766527,AU +3291766528,3291766783,US +3291766784,3291767039,AU +3291767040,3291813375,US 3291813376,3291813631,GB -3291813632,3291815423,US +3291813632,3291813887,US +3291813888,3291814143,GB +3291814144,3291815423,US 3291815424,3291815679,GB 3291815680,3291817471,US 3291817472,3291817983,NL @@ -112847,77 +116058,61 @@ 3291821568,3291823103,US 3291823104,3291823359,DE 3291823360,3291824127,US -3291824128,3291824383,GB -3291824384,3291826175,US +3291824128,3291824639,GB +3291824640,3291826175,US 3291826176,3291826431,CA 3291826432,3291827199,US 3291827200,3291827455,CA 3291827456,3291828223,US 3291828224,3291828479,GB -3291828480,3291878143,US -3291878144,3291878399,CA -3291878400,3291880703,US -3291880704,3291880959,CA -3291880960,3291883775,US +3291828480,3291879935,US +3291879936,3291880191,AU +3291880192,3291883775,US 3291883776,3291884031,CA -3291884032,3291884543,US -3291884544,3291884799,CA -3291884800,3291886335,US +3291884032,3291884287,US +3291884288,3291884543,NZ +3291884544,3291886335,US 3291886336,3291886591,CA -3291886592,3291887359,US +3291886592,3291887103,US +3291887104,3291887359,GB 3291887360,3291887615,FR 3291887616,3291888895,US 3291888896,3291889151,FR -3291889152,3291893759,US +3291889152,3291891455,US +3291891456,3291891711,GB +3291891712,3291893759,US 3291893760,3291894015,CA 3291894016,3291906047,US 3291906048,3291907071,LK 3291907072,3291939063,US 3291939064,3291939064,GB -3291939065,3291943423,US +3291939065,3291939327,US +3291939328,3291939583,IN +3291939584,3291943423,US 3291943424,3291943679,FR -3291943680,3291971583,US +3291943680,3291945727,US +3291945728,3291945983,GB +3291945984,3291971583,US 3291971584,3291972607,JP 3291972608,3292004351,US -3292004352,3292004607,SC +3292004352,3292004607,SE 3292004608,3292004863,DK -3292004864,3292005119,US -3292005120,3292006143,SC -3292006144,3292007423,US +3292004864,3292005375,US +3292005376,3292005631,CZ +3292005632,3292005887,SC +3292005888,3292007423,US 3292007424,3292007679,SC -3292007680,3292008703,US -3292008704,3292008959,SC -3292008960,3292012031,US -3292012032,3292012799,SC -3292012800,3292014847,US -3292014848,3292015103,SC -3292015104,3292016383,US -3292016384,3292016895,SC -3292016896,3292017407,US -3292017408,3292017663,SC -3292017664,3292018175,US -3292018176,3292018431,SC -3292018432,3292018943,US -3292018944,3292019455,SC +3292007680,3292019199,US +3292019200,3292019455,SC 3292019456,3292019711,US 3292019712,3292019967,SC 3292019968,3292022015,US 3292022016,3292022271,SC 3292022272,3292023295,US -3292023296,3292023807,SC -3292023808,3292027391,US -3292027392,3292027647,SC -3292027648,3292029183,US -3292029184,3292029439,SC -3292029440,3292029695,US -3292029696,3292030207,SC -3292030208,3292030463,US -3292030464,3292030975,SC -3292030976,3292031743,US +3292023296,3292023551,SC +3292023552,3292031743,US 3292031744,3292032255,SC -3292032256,3292032511,US -3292032512,3292032767,SC -3292032768,3292033791,US +3292032256,3292033791,US 3292033792,3292034047,SC 3292034048,3292034303,US 3292034304,3292034559,SC @@ -112926,54 +116121,22 @@ 3292036096,3292036351,US 3292036352,3292036607,SC 3292036608,3292036863,US -3292036864,3292037375,SC -3292037376,3292037631,US -3292037632,3292037887,SC -3292037888,3292038655,US -3292038656,3292038911,SC -3292038912,3292039167,US -3292039168,3292039679,SC -3292039680,3292040191,US -3292040192,3292040447,SC -3292040448,3292040703,US -3292040704,3292040959,SC -3292040960,3292041471,US -3292041472,3292041727,SC -3292041728,3292041983,US -3292041984,3292042239,SC -3292042240,3292044031,US -3292044032,3292044287,SC -3292044288,3292044543,US -3292044544,3292044799,SC -3292044800,3292047103,US +3292036864,3292037119,SC +3292037120,3292047103,US 3292047104,3292047359,SC 3292047360,3292049663,US 3292049664,3292049919,SC -3292049920,3292050175,US -3292050176,3292050687,SC -3292050688,3292051455,US -3292051456,3292051711,SC -3292051712,3292052991,US -3292052992,3292053247,SC -3292053248,3292054015,US +3292049920,3292050431,US +3292050432,3292050687,SC +3292050688,3292054015,US 3292054016,3292054271,SC -3292054272,3292058111,US -3292058112,3292058879,SC -3292058880,3292059135,US +3292054272,3292059135,US 3292059136,3292059391,SC -3292059392,3292060159,US -3292060160,3292060415,SC -3292060416,3292060671,US -3292060672,3292060927,SC -3292060928,3292061951,US -3292061952,3292062207,SC -3292062208,3292062719,US -3292062720,3292062975,SC -3292062976,3292064767,US -3292064768,3292065535,SC -3292065536,3292065791,US -3292065792,3292066303,SC -3292066304,3292069375,US +3292059392,3292065023,US +3292065024,3292065279,SC +3292065280,3292065791,US +3292065792,3292066047,SC +3292066048,3292069375,US 3292069376,3292069631,DE 3292069632,3292069887,AU 3292069888,3292070143,SE @@ -112981,283 +116144,127 @@ 3292070400,3292070655,US 3292070656,3292070911,SC 3292070912,3292071167,CZ -3292071168,3292071423,US -3292071424,3292071679,SC -3292071680,3292076543,US -3292076544,3292076799,SC -3292076800,3292078335,US -3292078336,3292078591,SC -3292078592,3292078847,US +3292071168,3292078847,US 3292078848,3292079103,SC -3292079104,3292079615,US -3292079616,3292079871,SC -3292079872,3292080383,US +3292079104,3292080383,US 3292080384,3292080639,SC 3292080640,3292081151,US 3292081152,3292081407,SC -3292081408,3292081663,US -3292081664,3292081919,SC -3292081920,3292082175,US -3292082176,3292082687,SC -3292082688,3292082943,US -3292082944,3292083199,SC -3292083200,3292083967,US -3292083968,3292084223,SC -3292084224,3292085247,US +3292081408,3292082431,US +3292082432,3292082687,SC +3292082688,3292085247,US 3292085248,3292085503,SC 3292085504,3292085759,US -3292085760,3292087295,SC -3292087296,3292088319,US -3292088320,3292088831,SC -3292088832,3292089087,US -3292089088,3292089599,SC -3292089600,3292090879,US -3292090880,3292091135,SC -3292091136,3292093183,US -3292093184,3292093439,SC -3292093440,3292093695,US +3292085760,3292086015,SC +3292086016,3292093695,US 3292093696,3292093951,SC -3292093952,3292094975,US -3292094976,3292095231,SC -3292095232,3292096767,US -3292096768,3292097023,SC -3292097024,3292098303,US -3292098304,3292098559,SC -3292098560,3292099071,US -3292099072,3292099583,SC -3292099584,3292101375,US -3292101376,3292101631,SC -3292101632,3292102911,US -3292102912,3292103167,SC -3292103168,3292104191,US -3292104192,3292104447,SC -3292104448,3292104959,US +3292093952,3292099327,US +3292099328,3292099583,SC +3292099584,3292104959,US 3292104960,3292105215,SC -3292105216,3292105727,US -3292105728,3292106239,SC +3292105216,3292105983,US +3292105984,3292106239,SC 3292106240,3292106751,US 3292106752,3292107007,SC 3292107008,3292108031,US 3292108032,3292108287,SC 3292108288,3292109567,US 3292109568,3292109823,SC -3292109824,3292110591,US -3292110592,3292110847,SC -3292110848,3292111103,US -3292111104,3292111359,SC -3292111360,3292112127,US +3292109824,3292112127,US 3292112128,3292112383,SC 3292112384,3292113919,US -3292113920,3292114431,SC -3292114432,3292115967,US +3292113920,3292114175,SC +3292114176,3292115967,US 3292115968,3292116223,SC -3292116224,3292120319,US -3292120320,3292120575,SC -3292120576,3292124671,US -3292124672,3292124927,SC -3292124928,3292125695,US +3292116224,3292125695,US 3292125696,3292125951,SC -3292125952,3292126975,US -3292126976,3292127231,SC -3292127232,3292128767,US +3292125952,3292128767,US 3292128768,3292129023,SC -3292129024,3292129535,US -3292129536,3292129791,SC -3292129792,3292131071,US -3292131072,3292131327,SC -3292131328,3292133631,US +3292129024,3292133631,US 3292133632,3292133887,SC 3292133888,3292134911,US -3292134912,3292135167,SC +3292134912,3292135167,DE 3292135168,3292135423,AU -3292135424,3292135679,SC +3292135424,3292135679,SE 3292135680,3292135935,DK 3292135936,3292136447,US 3292136448,3292136703,CZ -3292136704,3292136959,US -3292136960,3292137471,SC -3292137472,3292139775,US -3292139776,3292140799,SC -3292140800,3292141055,US -3292141056,3292141311,SC -3292141312,3292141567,US +3292136704,3292137215,US +3292137216,3292137471,SC +3292137472,3292140031,US +3292140032,3292140287,SC +3292140288,3292141567,US 3292141568,3292142079,SC -3292142080,3292142335,US -3292142336,3292142591,SC -3292142592,3292146175,US -3292146176,3292146431,SC -3292146432,3292147711,US -3292147712,3292147967,SC -3292147968,3292150527,US -3292150528,3292150783,SC -3292150784,3292151039,US -3292151040,3292151295,SC -3292151296,3292153087,US -3292153088,3292153343,SC -3292153344,3292153855,US +3292142080,3292153855,US 3292153856,3292154111,SC -3292154112,3292154879,US -3292154880,3292155135,SC -3292155136,3292156415,US -3292156416,3292156671,SC -3292156672,3292157183,US -3292157184,3292157439,SC -3292157440,3292157695,US -3292157696,3292157951,SC -3292157952,3292159999,US +3292154112,3292159999,US 3292160000,3292160255,SC -3292160256,3292161023,US -3292161024,3292161279,SC -3292161280,3292162047,US -3292162048,3292162303,SC -3292162304,3292163327,US +3292160256,3292163327,US 3292163328,3292163583,SC -3292163584,3292166655,US -3292166656,3292167167,SC -3292167168,3292167423,US -3292167424,3292168191,SC -3292168192,3292169983,US -3292169984,3292170495,SC -3292170496,3292170751,US -3292170752,3292171007,SC -3292171008,3292171519,US -3292171520,3292171775,SC -3292171776,3292172543,US -3292172544,3292172799,SC -3292172800,3292173311,US -3292173312,3292173823,SC -3292173824,3292175103,US +3292163584,3292167935,US +3292167936,3292168191,SC +3292168192,3292173311,US +3292173312,3292173567,SC +3292173568,3292175103,US 3292175104,3292175359,SC -3292175360,3292176895,US -3292176896,3292177407,SC +3292175360,3292177151,US +3292177152,3292177407,SC 3292177408,3292178175,US 3292178176,3292178431,SC -3292178432,3292179199,US -3292179200,3292179711,SC -3292179712,3292180735,US -3292180736,3292181247,SC -3292181248,3292181503,US -3292181504,3292181759,SC -3292181760,3292182015,US -3292182016,3292182271,SC -3292182272,3292183039,US +3292178432,3292180991,US +3292180992,3292181247,SC +3292181248,3292183039,US 3292183040,3292183295,SC 3292183296,3292186623,US 3292186624,3292186879,SC -3292186880,3292188671,US -3292188672,3292189183,SC -3292189184,3292189439,US -3292189440,3292189695,SC -3292189696,3292191999,US -3292192000,3292192255,SC -3292192256,3292196607,US +3292186880,3292196607,US 3292196608,3292196863,SC -3292196864,3292197375,US -3292197376,3292197631,SC -3292197632,3292197887,US -3292197888,3292198399,SC -3292198400,3292199423,US -3292199424,3292199679,SC -3292199680,3292200447,US +3292196864,3292200447,US 3292200448,3292200703,DE 3292200704,3292200959,AU 3292200960,3292201215,SE 3292201216,3292201471,DK 3292201472,3292201983,US -3292201984,3292202495,SC -3292202496,3292203007,US -3292203008,3292203263,SC -3292203264,3292204799,US -3292204800,3292205311,SC -3292205312,3292205823,US -3292205824,3292206335,SC -3292206336,3292206591,US +3292201984,3292202239,CZ +3292202240,3292205823,US +3292205824,3292206079,SC +3292206080,3292206591,US 3292206592,3292206847,SC -3292206848,3292207359,US -3292207360,3292208127,SC -3292208128,3292208639,US -3292208640,3292208895,SC -3292208896,3292209663,US +3292206848,3292207615,US +3292207616,3292207871,SC +3292207872,3292209663,US 3292209664,3292209919,SC 3292209920,3292210175,US 3292210176,3292210431,SC -3292210432,3292211455,US -3292211456,3292211967,SC -3292211968,3292212735,US -3292212736,3292212991,SC -3292212992,3292214783,US +3292210432,3292214783,US 3292214784,3292215039,SC 3292215040,3292215295,US 3292215296,3292215551,SC 3292215552,3292216319,US 3292216320,3292216575,SC -3292216576,3292217343,US -3292217344,3292217599,SC -3292217600,3292218879,US -3292218880,3292219135,SC -3292219136,3292220415,US -3292220416,3292220671,SC -3292220672,3292220927,US +3292216576,3292220927,US 3292220928,3292221183,SC -3292221184,3292222207,US -3292222208,3292222463,SC -3292222464,3292224511,US -3292224512,3292224767,SC -3292224768,3292225279,US -3292225280,3292225535,SC -3292225536,3292226303,US -3292226304,3292226559,SC -3292226560,3292227071,US +3292221184,3292227071,US 3292227072,3292227327,SC -3292227328,3292227839,US -3292227840,3292228095,SC -3292228096,3292228607,US -3292228608,3292229631,SC -3292229632,3292230911,US -3292230912,3292231167,SC -3292231168,3292231679,US +3292227328,3292231679,US 3292231680,3292231935,SC -3292231936,3292232447,US -3292232448,3292232959,SC -3292232960,3292233471,US -3292233472,3292233983,SC -3292233984,3292235007,US -3292235008,3292235519,SC -3292235520,3292236031,US -3292236032,3292236287,SC -3292236288,3292238079,US -3292238080,3292238335,SC -3292238336,3292239615,US +3292231936,3292233471,US +3292233472,3292233727,SC +3292233728,3292239615,US 3292239616,3292239871,SC -3292239872,3292240383,US -3292240384,3292240639,SC -3292240640,3292243711,US +3292239872,3292243711,US 3292243712,3292243967,SC 3292243968,3292244991,US 3292244992,3292245247,SC -3292245248,3292245503,US -3292245504,3292245759,SC -3292245760,3292246783,US +3292245248,3292246783,US 3292246784,3292247039,SC -3292247040,3292248575,US -3292248576,3292248831,SC -3292248832,3292249855,US -3292249856,3292250111,SC -3292250112,3292252159,US -3292252160,3292252671,SC -3292252672,3292253183,US -3292253184,3292253439,SC -3292253440,3292254207,US -3292254208,3292254719,SC -3292254720,3292255487,US +3292247040,3292252415,US +3292252416,3292252671,SC +3292252672,3292255487,US 3292255488,3292255743,SC 3292255744,3292259327,US -3292259328,3292259839,SC -3292259840,3292260351,US -3292260352,3292260607,SC -3292260608,3292263167,US -3292263168,3292263423,SC -3292263424,3292265983,US +3292259328,3292259583,SC +3292259584,3292265983,US 3292265984,3292266239,DE 3292266240,3292266495,SC 3292266496,3292266751,TZ @@ -113268,6 +116275,8 @@ 3292274688,3292274943,ZA 3292275712,3292275967,KE 3292276224,3292276479,GN +3292276736,3292276991,SN +3292277248,3292277503,TG 3292332032,3292334079,MU 3292334080,3292336127,TZ 3292336128,3292340223,ZA @@ -113308,24 +116317,28 @@ 3300953088,3300954111,MU 3300954112,3300958207,NG 3300958208,3301113855,ZA -3301113856,3301138431,NG +3301113856,3301117951,AF +3301117952,3301138431,NG 3301138432,3301140479,ZA -3301140480,3301146623,NG -3301146624,3301171199,ZA -3301171200,3301172223,IN -3301172224,3301173247,ZA -3301173248,3301173759,UG -3301173760,3301175295,ZA -3301175296,3301179391,EG +3301140480,3301146111,NG +3301146112,3301146367,ZA +3301146368,3301146623,NG +3301146624,3301163007,IN +3301163008,3301171199,ZA +3301171200,3301172223,NG +3301172224,3301173759,UG +3301173760,3301174271,ZA +3301174272,3301175295,UG +3301175296,3301179391,AF 3301179392,3301179903,RU -3301179904,3301181183,SC -3301181184,3301185535,US +3301179904,3301181439,SC +3301181440,3301185535,US 3301185536,3301187583,GB 3301187584,3301189631,FR 3301189632,3301191679,US 3301191680,3301191935,CA -3301191936,3301192447,SE -3301192448,3301192703,CA +3301191936,3301192191,SE +3301192192,3301192703,CA 3301192704,3301192959,SE 3301192960,3301193215,CA 3301193216,3301193727,SE @@ -113360,115 +116373,131 @@ 3301238784,3301240831,US 3301240832,3301242879,SE 3301242880,3301244927,GB -3301244928,3301245439,US -3301245440,3301246975,SE -3301246976,3301310463,SC +3301244928,3301245951,US +3301245952,3301246975,SE +3301246976,3301252095,SC +3301252096,3301253119,US +3301253120,3301254143,SC +3301254144,3301255167,US +3301255168,3301257215,SC +3301257216,3301258239,US +3301258240,3301263359,SC +3301263360,3301264383,US +3301264384,3301271551,SC +3301271552,3301272575,US +3301272576,3301279743,SC +3301279744,3301280767,PR +3301280768,3301281791,SC +3301281792,3301282815,US +3301282816,3301283839,SC +3301283840,3301284863,US +3301284864,3301289983,SC +3301289984,3301291007,PT +3301291008,3301292031,PL +3301292032,3301294079,SC +3301294080,3301295103,LU +3301295104,3301301247,SC +3301301248,3301302271,CZ +3301302272,3301304319,SC +3301304320,3301305343,FR +3301305344,3301306367,AT +3301306368,3301307391,IN +3301307392,3301308415,SC +3301308416,3301309439,SG +3301309440,3301310463,SC 3301310464,3301310719,ZA 3301310720,3301311487,SC 3301311488,3301313535,SE 3301313536,3301314559,SC 3301314560,3301315583,SE 3301315584,3301318655,SC -3301318656,3301375999,SE -3301376000,3301376767,SC +3301318656,3301320447,SE +3301320448,3301320959,US +3301320960,3301322751,SE +3301322752,3301323007,CA +3301323008,3301325567,SE +3301325568,3301325823,US +3301325824,3301330943,SE +3301330944,3301331199,HU +3301331200,3301337087,SE +3301337088,3301337343,US +3301337344,3301343487,SE +3301343488,3301343743,US +3301343744,3301345535,SE +3301345536,3301345791,DK +3301345792,3301349119,SE +3301349120,3301349375,CH +3301349376,3301351679,SE +3301351680,3301351935,US +3301351936,3301353983,SE +3301353984,3301354239,US +3301354240,3301355263,SE +3301355264,3301355519,US +3301355520,3301364479,SE +3301364480,3301364735,NO +3301364736,3301367551,SE +3301367552,3301367807,PR +3301367808,3301373183,SE +3301373184,3301373439,US +3301373440,3301375231,SE +3301375232,3301375487,US +3301375488,3301375743,SE +3301375744,3301375999,US +3301376000,3301376255,SC +3301376256,3301376511,US +3301376512,3301376767,SC 3301376768,3301377023,US 3301377024,3301377279,SC -3301377280,3301377791,US -3301377792,3301378047,SC -3301378048,3301378559,US -3301378560,3301379327,SC -3301379328,3301379583,US +3301377280,3301378559,US +3301378560,3301379071,SC +3301379072,3301379583,US 3301379584,3301379839,SC -3301379840,3301381631,US -3301381632,3301382399,SC -3301382400,3301384447,US -3301384448,3301384703,SC -3301384704,3301385471,US -3301385472,3301385727,SC -3301385728,3301389567,US -3301389568,3301390335,SC -3301390336,3301390591,US -3301390592,3301391103,SC -3301391104,3301391359,US +3301379840,3301387007,US +3301387008,3301387263,ES +3301387264,3301390079,US +3301390080,3301390335,SC +3301390336,3301391359,US 3301391360,3301391615,SC -3301391616,3301392127,US -3301392128,3301392383,SC -3301392384,3301394175,US -3301394176,3301394431,SC -3301394432,3301396479,US -3301396480,3301396735,SC -3301396736,3301397247,US +3301391616,3301395199,US +3301395200,3301395455,PR +3301395456,3301397247,US 3301397248,3301397503,SC 3301397504,3301397759,US 3301397760,3301398015,SC -3301398016,3301398783,US -3301398784,3301399039,SC -3301399040,3301400575,US -3301400576,3301400831,SC -3301400832,3301401343,US -3301401344,3301401855,SC -3301401856,3301402111,US -3301402112,3301402367,SC -3301402368,3301402623,US -3301402624,3301402879,SC -3301402880,3301403391,US +3301398016,3301401343,US +3301401344,3301401599,SC +3301401600,3301403391,US 3301403392,3301403647,SC 3301403648,3301404415,US -3301404416,3301404671,SC +3301404416,3301404671,NZ 3301404672,3301404927,US 3301404928,3301405183,SC 3301405184,3301407999,US 3301408000,3301408255,SC -3301408256,3301409535,US -3301409536,3301409791,SC -3301409792,3301411327,US -3301411328,3301411583,SC -3301411584,3301411839,US -3301411840,3301412095,SC -3301412096,3301412607,US -3301412608,3301412863,SC -3301412864,3301413887,US -3301413888,3301414399,SC -3301414400,3301417215,US -3301417216,3301417471,SC -3301417472,3301418751,US -3301418752,3301419519,SC -3301419520,3301420799,US -3301420800,3301421567,SC +3301408256,3301411583,US +3301411584,3301411839,PR +3301411840,3301412863,US +3301412864,3301413119,CA +3301413120,3301419007,US +3301419008,3301419519,SC +3301419520,3301421311,US +3301421312,3301421567,SC 3301421568,3301422079,US 3301422080,3301422335,SC 3301422336,3301422591,US 3301422592,3301422847,SC -3301422848,3301423615,US -3301423616,3301423871,SC -3301423872,3301424383,US +3301422848,3301424383,US 3301424384,3301424639,SC 3301424640,3301424895,US -3301424896,3301425663,SC -3301425664,3301426687,US -3301426688,3301426943,SC -3301426944,3301427199,US -3301427200,3301427455,SC -3301427456,3301429503,US -3301429504,3301430015,SC -3301430016,3301431039,US -3301431040,3301431295,SC -3301431296,3301431551,US -3301431552,3301431807,SC -3301431808,3301432575,US -3301432576,3301433087,SC -3301433088,3301434623,US -3301434624,3301434879,SC -3301434880,3301435903,US -3301435904,3301436159,SC -3301436160,3301436415,US -3301436416,3301436927,SC -3301436928,3301437183,US +3301424896,3301425151,SC +3301425152,3301432831,US +3301432832,3301433087,SC +3301433088,3301437183,US 3301437184,3301437439,SC -3301437440,3301438719,US -3301438720,3301439231,SC -3301439232,3301440255,US -3301440256,3301440767,SC +3301437440,3301438975,US +3301438976,3301439231,SC +3301439232,3301440511,US +3301440512,3301440767,SC 3301440768,3301441535,US 3301441536,3301442351,ZA 3301442352,3301442359,NG @@ -113512,7 +116541,7 @@ 3301466112,3301470207,ER 3301470208,3301474303,NG 3301474304,3301490687,MA -3301490688,3301494783,ZA +3301490688,3301494783,CD 3301494784,3301498879,BW 3301502976,3301507071,MA 3301507328,3301507583,MU @@ -113567,20 +116596,11 @@ 3302496256,3302498303,EG 3302498304,3302502399,NA 3302502400,3302505471,AO -3302505472,3302505969,NA -3302505970,3302505971,AO -3302505972,3302506055,NA -3302506056,3302506057,AO -3302506058,3302506083,NA -3302506084,3302506085,AO -3302506086,3302506165,NA -3302506166,3302506167,AO -3302506168,3302506191,NA -3302506192,3302506193,AO -3302506194,3302506387,NA -3302506388,3302506391,AO -3302506392,3302506495,NA -3302506496,3302514687,KE +3302505472,3302505679,NA +3302505680,3302505681,AO +3302505682,3302506495,NA +3302506496,3302509567,KE +3302509568,3302514687,MU 3302514688,3302522879,ZA 3302522880,3302523903,KE 3302523904,3302525951,ZA @@ -113595,6 +116615,7 @@ 3302532096,3302533119,NA 3302533120,3302533631,MU 3302533632,3302533887,ZA +3302533888,3302534143,MU 3302534144,3302535167,ZA 3302535168,3302536191,UG 3302536192,3302537215,GH @@ -113697,7 +116718,7 @@ 3302961152,3302977535,ZA 3302977536,3302981631,NG 3302981632,3302985727,ZA -3302985728,3302987775,DJ +3302985728,3302987775,GM 3302987776,3302989823,SD 3302989824,3302993919,KE 3302993920,3302998015,MA @@ -113707,15 +116728,97 @@ 3303013376,3303013631,SN 3303013632,3303014399,KE 3303014400,3304062975,TN -3304062976,3304456191,SC +3304062976,3304066559,SC +3304066560,3304066815,CA +3304066816,3304077311,SC +3304077312,3304077567,DK +3304077568,3304077823,SC +3304077824,3304078079,FR +3304078080,3304084991,SC +3304084992,3304085247,US +3304085248,3304102655,SC +3304102656,3304102911,US +3304102912,3304107263,SC +3304107264,3304107519,PL +3304107520,3304108799,SC +3304108800,3304109055,AU +3304109056,3304109311,SC +3304109312,3304109567,BE +3304109568,3304115967,SC +3304115968,3304116223,US +3304116224,3304120575,SC +3304120576,3304120831,US +3304120832,3304126975,SC +3304126976,3304127231,FR +3304127232,3304194303,SC +3304194304,3304194559,US +3304194560,3304212223,SC +3304212224,3304212479,FR +3304212480,3304213247,SC +3304213248,3304213503,LV +3304213504,3304213759,SC +3304213760,3304214015,AT +3304214016,3304218367,SC +3304218368,3304218623,PR +3304218624,3304223231,SC +3304223232,3304223487,US +3304223488,3304226047,SC +3304226048,3304226559,US +3304226560,3304227839,SC +3304227840,3304228095,RU +3304228096,3304228863,SC +3304228864,3304229119,DE +3304229120,3304229375,DK +3304229376,3304232703,SC +3304232704,3304232959,CH +3304232960,3304233215,SC +3304233216,3304233471,GB +3304233472,3304233727,SC +3304233728,3304233983,US +3304233984,3304246271,SC +3304246272,3304246527,BE +3304246528,3304249343,SC +3304249344,3304249599,NL +3304249600,3304326143,SC +3304326144,3304326399,DE +3304326400,3304327935,SC +3304327936,3304328191,HK +3304328192,3304340735,SC +3304340736,3304340991,US +3304340992,3304342783,SC +3304342784,3304343039,IN +3304343040,3304343551,SC +3304343552,3304343807,DE +3304343808,3304353023,SC +3304353024,3304353535,US +3304353536,3304358399,SC +3304358400,3304358655,BR +3304358656,3304360191,SC +3304360192,3304360447,DK +3304360448,3304397823,SC +3304397824,3304399871,US +3304399872,3304408063,SC +3304408064,3304411135,US +3304411136,3304419327,SC +3304419328,3304420351,US +3304420352,3304424447,SC +3304424448,3304425471,US +3304425472,3304432639,SC +3304432640,3304433663,NL +3304433664,3304442879,SC +3304442880,3304443903,AU +3304443904,3304451071,SC +3304451072,3304452095,AT +3304452096,3304454143,SC +3304454144,3304455167,SG +3304455168,3304456191,SC 3304456192,3304521727,NG 3304521728,3304528895,US 3304528896,3304529919,SC 3304529920,3304535295,US 3304535296,3304536063,SC 3304536064,3304538111,CA -3304538112,3304539135,SC -3304539136,3304548351,US +3304538112,3304548351,US 3304548352,3304549375,SC 3304549376,3304562687,US 3304562688,3304563711,GB @@ -113746,10 +116849,52 @@ 3304669184,3304685567,TZ 3304685568,3304701951,ZA 3304701952,3304718335,AO +3304718336,3304734719,ZA +3304734720,3304751103,BJ 3304751104,3304759295,ZA +3304763392,3304767487,LR +3304771584,3304773631,KE 3304775680,3304781823,ZA 3304781824,3304782847,AO 3304782848,3304783871,MU +3304783872,3304801023,ZA +3304801024,3304801279,GH +3304801280,3304801791,SC +3304801792,3304802047,GH +3304802048,3304802559,SC +3304802560,3304802815,GH +3304802816,3304803327,SC +3304803328,3304803583,GH +3304803584,3304804095,SC +3304804096,3304804351,NG +3304804352,3304804863,SC +3304804864,3304805119,NG +3304805120,3304805631,SC +3304805632,3304805887,NG +3304805888,3304806399,SC +3304806400,3304806655,ZA +3304806656,3304807167,SC +3304807168,3304807423,ZA +3304807424,3304807935,SC +3304807936,3304808191,ZA +3304808192,3304808703,SC +3304808704,3304808959,ZA +3304808960,3304809471,SC +3304809472,3304809727,KE +3304809728,3304810239,SC +3304810240,3304810495,KE +3304810496,3304811007,SC +3304811008,3304811263,KE +3304811264,3304811775,SC +3304811776,3304812031,KE +3304812032,3304816639,SC +3304816640,3304820735,ZA +3304821760,3304822783,MU +3304822784,3304823807,BJ +3304824832,3304841215,ZA +3304841216,3304843263,NG +3304843264,3304845311,ZA +3304845312,3304846335,GQ 3304846336,3304847359,SC 3304847360,3304848383,ZA 3304848384,3304849407,MU @@ -113800,9 +116945,9 @@ 3315204096,3315269631,ET 3315269632,3315286015,ZA 3315286016,3315286527,KE -3315286528,3315288413,MU -3315288414,3315288414,KE -3315288415,3315289343,MU +3315286528,3315288319,MU +3315288320,3315288575,KE +3315288576,3315289343,MU 3315289344,3315289599,KE 3315289600,3315291135,MU 3315291136,3315293183,KE @@ -113996,7 +117141,9 @@ 3321364480,3321430015,KE 3321430016,3321495551,MZ 3321495552,3321561087,TZ -3321561088,3321593855,SD +3321561088,3321570815,SD +3321570816,3321571071,SS +3321571072,3321593855,SD 3321593856,3321626623,GH 3321626624,3321692159,SD 3321692160,3321708543,NG @@ -114210,9 +117357,9 @@ 3322683392,3322691583,AR 3322691584,3322691607,US 3322691608,3322691615,RO -3322691616,3322691791,US -3322691792,3322691799,CA -3322691800,3322691839,US +3322691616,3322691775,US +3322691776,3322691791,CA +3322691792,3322691839,US 3322691840,3322692095,SE 3322692096,3322692103,US 3322692104,3322692111,RO @@ -114230,7 +117377,10 @@ 3322693248,3322693263,BR 3322693264,3322693271,US 3322693272,3322693279,BR -3322693280,3322694319,US +3322693280,3322693287,SG +3322693288,3322693307,US +3322693308,3322693311,CA +3322693312,3322694319,US 3322694320,3322694327,CA 3322694328,3322694895,US 3322694896,3322694911,GB @@ -114250,12 +117400,17 @@ 3322697416,3322697423,RO 3322697424,3322697431,US 3322697432,3322697439,CA -3322697440,3322698303,US +3322697440,3322697951,US +3322697952,3322697983,CA +3322697984,3322698303,US 3322698304,3322698367,IL 3322698368,3322698383,US 3322698384,3322698391,CA 3322698392,3322698399,RO -3322698400,3322699223,US +3322698400,3322699199,US +3322699200,3322699207,PK +3322699208,3322699215,US +3322699216,3322699223,CA 3322699224,3322699231,RO 3322699232,3322700095,US 3322700096,3322700127,FR @@ -114269,9 +117424,7 @@ 3322706632,3322706639,GB 3322706640,3322706651,US 3322706652,3322706655,CA -3322706656,3322707119,US -3322707120,3322707127,CA -3322707128,3322707359,US +3322706656,3322707359,US 3322707360,3322707391,PK 3322707392,3322707743,US 3322707744,3322707751,CA @@ -114293,15 +117446,9 @@ 3322768608,3322768623,IN 3322768624,3322769327,US 3322769328,3322769343,IN -3322769344,3322775551,US -3322775552,3322777599,CA -3322777600,3322785791,US -3322785792,3322796799,CA -3322796800,3322801663,US -3322801664,3322801919,CA -3322801920,3322804223,US -3322804224,3322805759,CA -3322805760,3322875903,US +3322769344,3322773503,US +3322773504,3322806271,CA +3322806272,3322875903,US 3322880000,3322888191,AU 3322888192,3322888815,US 3322888816,3322888823,IN @@ -114330,9 +117477,7 @@ 3322893984,3322893991,BR 3322893992,3322894207,US 3322894208,3322894215,CN -3322894216,3322894335,US -3322894336,3322894399,HK -3322894400,3322894703,US +3322894216,3322894703,US 3322894704,3322894719,IN 3322894720,3322897063,US 3322897064,3322897071,QA @@ -114494,10 +117639,11 @@ 3322956616,3322956623,DE 3322956624,3322962431,NL 3322962432,3322962687,GB -3322962688,3322962943,US +3322962688,3322962943,ES 3322962944,3322963455,NL 3322963456,3322964479,GB -3322964480,3322969343,US +3322964480,3322964991,NL +3322964992,3322969343,US 3322969344,3322970111,NL 3322970112,3323002879,CA 3323002880,3323013887,US @@ -114567,13 +117713,7 @@ 3323241728,3323241983,CA 3323241984,3323242511,US 3323242512,3323242527,BD -3323242528,3323242559,US -3323242560,3323242575,GB -3323242576,3323242591,US -3323242592,3323242607,GB -3323242608,3323242623,US -3323242624,3323242703,AE -3323242704,3323243087,US +3323242528,3323243087,US 3323243088,3323243095,IE 3323243096,3323243103,GB 3323243104,3323243143,US @@ -114611,9 +117751,7 @@ 3323245560,3323245567,CN 3323245568,3323246463,US 3323246464,3323246591,CN -3323246592,3323247359,US -3323247360,3323247423,CA -3323247424,3323270420,US +3323246592,3323270420,US 3323270421,3323270421,CH 3323270422,3323339263,US 3323339776,3323340031,CA @@ -114638,7 +117776,9 @@ 3323416400,3323416479,GB 3323416480,3323437823,US 3323437824,3323438079,CA -3323438080,3323441043,US +3323438080,3323440703,US +3323440704,3323440735,GB +3323440736,3323441043,US 3323441044,3323441047,GB 3323441048,3323444847,US 3323444848,3323444863,CA @@ -114703,7 +117843,9 @@ 3323660544,3323661311,US 3323661312,3323662335,CA 3323662336,3323674623,US -3323674624,3323678031,CA +3323674624,3323677991,CA +3323677992,3323677995,US +3323677996,3323678031,CA 3323678032,3323678047,US 3323678048,3323678055,CA 3323678056,3323678059,MX @@ -114722,8 +117864,7 @@ 3323678172,3323678175,US 3323678176,3323678195,CA 3323678196,3323678199,VE -3323678200,3323678207,CA -3323678208,3323678463,US +3323678200,3323678463,US 3323678464,3323678523,CA 3323678524,3323678527,US 3323678528,3323678583,CA @@ -114748,14 +117889,14 @@ 3323681424,3323681439,CA 3323681440,3323681455,AE 3323681456,3323681479,CA -3323681480,3323681487,IN +3323681480,3323681487,GB 3323681488,3323681519,CA 3323681520,3323681527,SI 3323681528,3323681535,CA 3323681536,3323681567,IN 3323681568,3323681583,US 3323681584,3323681591,CA -3323681592,3323681599,PL +3323681592,3323681599,US 3323681600,3323681631,CA 3323681632,3323681663,NO 3323681664,3323681727,CA @@ -114771,7 +117912,8 @@ 3323682752,3323682767,US 3323682768,3323682771,CA 3323682772,3323682775,RO -3323682776,3323682839,CA +3323682776,3323682831,CA +3323682832,3323682839,IN 3323682840,3323682843,BD 3323682844,3323682947,CA 3323682948,3323682951,US @@ -114786,13 +117928,17 @@ 3323683008,3323683039,AU 3323683040,3323683071,CA 3323683072,3323683103,BA -3323683104,3323683215,CA +3323683104,3323683123,CA +3323683124,3323683127,BR +3323683128,3323683215,CA 3323683216,3323683223,VN 3323683224,3323683295,CA 3323683296,3323683299,CL 3323683300,3323683359,CA 3323683360,3323683367,MY -3323683368,3323683427,CA +3323683368,3323683399,CA +3323683400,3323683403,BR +3323683404,3323683427,CA 3323683428,3323683431,IT 3323683432,3323683439,PL 3323683440,3323683447,CA @@ -114801,7 +117947,9 @@ 3323683536,3323683551,AU 3323683552,3323683583,CA 3323683584,3323683591,PA -3323683592,3323683707,CA +3323683592,3323683679,CA +3323683680,3323683683,FR +3323683684,3323683707,CA 3323683708,3323683711,US 3323683712,3323683839,GP 3323683840,3323683871,CA @@ -114819,7 +117967,8 @@ 3323684232,3323684239,CA 3323684240,3323684243,GB 3323684244,3323684271,CA -3323684272,3323684287,US +3323684272,3323684279,FR +3323684280,3323684287,ES 3323684288,3323684291,IN 3323684292,3323684387,CA 3323684388,3323684391,MX @@ -114827,21 +117976,24 @@ 3323684396,3323684399,IN 3323684400,3323684415,CA 3323684416,3323684431,DE -3323684432,3323684439,US -3323684440,3323684443,CA +3323684432,3323684435,US +3323684436,3323684443,CA 3323684444,3323684447,IN 3323684448,3323684463,CA 3323684464,3323684479,US -3323684480,3323684543,CA +3323684480,3323684503,CA +3323684504,3323684507,IN +3323684508,3323684543,CA 3323684544,3323684559,US 3323684560,3323684607,CA 3323684608,3323684611,BR -3323684612,3323684695,CA +3323684612,3323684615,CA +3323684616,3323684619,US +3323684620,3323684695,CA 3323684696,3323684703,US 3323684704,3323684735,CA 3323684736,3323684739,IN -3323684740,3323684767,CA -3323684768,3323684783,VG +3323684740,3323684783,CA 3323684784,3323684799,CO 3323684800,3323684835,CA 3323684836,3323684839,MX @@ -114862,7 +118014,8 @@ 3323685264,3323685271,US 3323685272,3323685275,CA 3323685276,3323685287,US -3323685288,3323685311,CA +3323685288,3323685295,CA +3323685296,3323685311,PL 3323685312,3323685315,VG 3323685316,3323685319,CA 3323685320,3323685327,CO @@ -114870,7 +118023,9 @@ 3323685344,3323685347,BZ 3323685348,3323685351,IN 3323685352,3323685359,US -3323685360,3323685407,CA +3323685360,3323685391,CA +3323685392,3323685399,MX +3323685400,3323685407,CA 3323685408,3323685411,MX 3323685412,3323685415,US 3323685416,3323685419,AR @@ -114897,7 +118052,9 @@ 3323685952,3323686047,CA 3323686048,3323686051,US 3323686052,3323686055,AR -3323686056,3323686135,CA +3323686056,3323686095,CA +3323686096,3323686111,US +3323686112,3323686135,CA 3323686136,3323686143,MX 3323686144,3323686159,NO 3323686160,3323686163,US @@ -114909,9 +118066,9 @@ 3323686264,3323686271,US 3323686272,3323686287,CA 3323686288,3323686303,US -3323686304,3323686335,ES +3323686304,3323686335,IT 3323686336,3323686367,CA -3323686368,3323686371,VI +3323686368,3323686371,IN 3323686372,3323686383,CA 3323686384,3323686391,US 3323686392,3323686439,CA @@ -114922,12 +118079,13 @@ 3323686624,3323686631,NL 3323686632,3323686639,BR 3323686640,3323686655,US -3323686656,3323686683,CA +3323686656,3323686663,CA +3323686664,3323686667,US +3323686668,3323686683,CA 3323686684,3323686687,IN 3323686688,3323686847,CA -3323686848,3323686851,VE -3323686852,3323686907,CA -3323686908,3323686911,US +3323686848,3323686851,US +3323686852,3323686911,CA 3323686912,3323686943,BR 3323686944,3323686975,IN 3323686976,3323687031,CA @@ -114953,7 +118111,9 @@ 3323687428,3323687431,BZ 3323687432,3323687567,CA 3323687568,3323687571,PL -3323687572,3323687591,CA +3323687572,3323687575,CA +3323687576,3323687583,ES +3323687584,3323687591,CA 3323687592,3323687599,US 3323687600,3323687711,CA 3323687712,3323687715,US @@ -114965,9 +118125,7 @@ 3323687916,3323687919,US 3323687920,3323687935,CA 3323687936,3323687999,US -3323688000,3323688047,CA -3323688048,3323688051,BD -3323688052,3323688059,CA +3323688000,3323688059,CA 3323688060,3323688063,GB 3323688064,3323688135,CA 3323688136,3323688143,US @@ -114975,7 +118133,9 @@ 3323688168,3323688175,BR 3323688176,3323688207,CA 3323688208,3323688215,AR -3323688216,3323688287,CA +3323688216,3323688255,CA +3323688256,3323688271,BR +3323688272,3323688287,CA 3323688288,3323688303,PA 3323688304,3323688319,CA 3323688320,3323688335,US @@ -114983,13 +118143,15 @@ 3323688392,3323688395,ID 3323688396,3323688415,CA 3323688416,3323688447,DE -3323688448,3323688471,CA +3323688448,3323688463,CA +3323688464,3323688467,US +3323688468,3323688471,CA 3323688472,3323688479,US -3323688480,3323688543,CA +3323688480,3323688531,CA +3323688532,3323688535,EC +3323688536,3323688543,CA 3323688544,3323688551,VE -3323688552,3323688555,CA -3323688556,3323688559,IN -3323688560,3323688563,CA +3323688552,3323688563,CA 3323688564,3323688567,CL 3323688568,3323688571,VE 3323688572,3323688603,CA @@ -115003,14 +118165,11 @@ 3323688844,3323688847,CA 3323688848,3323688855,PT 3323688856,3323688863,CL -3323688864,3323688879,US -3323688880,3323688895,CA -3323688896,3323688911,IN -3323688912,3323688943,CA +3323688864,3323688943,CA 3323688944,3323688947,AU -3323688948,3323689023,CA -3323689024,3323689039,US -3323689040,3323689071,CA +3323688948,3323689055,CA +3323689056,3323689059,FR +3323689060,3323689071,CA 3323689072,3323689079,ID 3323689080,3323689167,CA 3323689168,3323689183,US @@ -115030,8 +118189,10 @@ 3323689400,3323689403,DE 3323689404,3323689407,BR 3323689408,3323689435,CA -3323689436,3323689439,US -3323689440,3323689519,CA +3323689436,3323689439,MY +3323689440,3323689455,CA +3323689456,3323689471,PK +3323689472,3323689519,CA 3323689520,3323689527,ES 3323689528,3323689559,CA 3323689560,3323689583,US @@ -115039,20 +118200,24 @@ 3323689600,3323689663,US 3323689664,3323689715,CA 3323689716,3323689719,US -3323689720,3323689863,CA +3323689720,3323689815,CA +3323689816,3323689823,US +3323689824,3323689863,CA 3323689864,3323689871,PE 3323689872,3323689879,IT 3323689880,3323689927,CA 3323689928,3323689935,US 3323689936,3323689983,CA 3323689984,3323690015,RS -3323690016,3323690095,CA +3323690016,3323690047,CA +3323690048,3323690063,PK +3323690064,3323690095,CA 3323690096,3323690111,PK -3323690112,3323690223,CA +3323690112,3323690199,CA +3323690200,3323690207,US +3323690208,3323690223,CA 3323690224,3323690235,US -3323690236,3323690251,CA -3323690252,3323690255,BR -3323690256,3323690263,CA +3323690236,3323690263,CA 3323690264,3323690267,BR 3323690268,3323690351,CA 3323690352,3323690359,AE @@ -115063,15 +118228,7 @@ 3323740160,3323748351,GB 3323748352,3323805695,US 3323805696,3323805951,GB -3323805952,3324031999,US -3324032000,3324032255,KN -3324032256,3324035583,US -3324035584,3324035839,KN -3324035840,3324036351,US -3324036352,3324036607,KN -3324036608,3324047359,US -3324047360,3324047615,KN -3324047616,3324051455,US +3323805952,3324051455,US 3324051456,3324182527,CA 3324182528,3324193279,US 3324193280,3324193791,CA @@ -115660,7 +118817,9 @@ 3324939520,3324939535,RO 3324939536,3324939567,US 3324939568,3324939583,RO -3324939584,3324942855,US +3324939584,3324939735,US +3324939736,3324939739,CA +3324939740,3324942855,US 3324942856,3324942863,RO 3324942864,3324943047,US 3324943048,3324943055,CA @@ -115695,7 +118854,9 @@ 3325120077,3325120081,MX 3325120082,3325120423,US 3325120424,3325120431,IN -3325120432,3325128703,US +3325120432,3325122559,US +3325122560,3325123071,CA +3325123072,3325128703,US 3325128704,3325129215,TH 3325129216,3325131775,US 3325131776,3325132031,AU @@ -115721,7 +118882,8 @@ 3325198424,3325198559,CA 3325198560,3325198575,PA 3325198576,3325198583,CA -3325198584,3325198591,US +3325198584,3325198587,ES +3325198588,3325198591,US 3325198592,3325198619,CA 3325198620,3325198623,AR 3325198624,3325198627,ES @@ -115734,7 +118896,11 @@ 3325198704,3325198719,US 3325198720,3325198751,CA 3325198752,3325198755,LK -3325198756,3325198815,CA +3325198756,3325198759,US +3325198760,3325198779,CA +3325198780,3325198783,MX +3325198784,3325198811,CA +3325198812,3325198815,US 3325198816,3325198823,DE 3325198824,3325198831,CA 3325198832,3325198847,US @@ -115750,9 +118916,11 @@ 3325199072,3325199079,US 3325199080,3325199103,CA 3325199104,3325199119,DE -3325199120,3325199123,CA -3325199124,3325199127,TR -3325199128,3325199255,CA +3325199120,3325199127,CA +3325199128,3325199131,US +3325199132,3325199143,CA +3325199144,3325199147,US +3325199148,3325199255,CA 3325199256,3325199259,BR 3325199260,3325199291,CA 3325199292,3325199295,US @@ -115770,10 +118938,10 @@ 3325199492,3325199495,BR 3325199496,3325199559,CA 3325199560,3325199567,US -3325199568,3325199623,CA +3325199568,3325199583,BR +3325199584,3325199623,CA 3325199624,3325199627,BE -3325199628,3325199647,CA -3325199648,3325199655,ID +3325199628,3325199655,CA 3325199656,3325199663,US 3325199664,3325199775,CA 3325199776,3325199779,BR @@ -115810,9 +118978,9 @@ 3325200312,3325200315,IN 3325200316,3325200323,CA 3325200324,3325200327,IL -3325200328,3325200451,CA -3325200452,3325200455,US -3325200456,3325200463,CA +3325200328,3325200455,CA +3325200456,3325200459,US +3325200460,3325200463,CA 3325200464,3325200467,US 3325200468,3325200567,CA 3325200568,3325200571,US @@ -115821,10 +118989,13 @@ 3325200728,3325200731,US 3325200732,3325200739,CA 3325200740,3325200747,US -3325200748,3325200807,CA +3325200748,3325200767,CA +3325200768,3325200783,ID +3325200784,3325200807,CA 3325200808,3325200811,TR 3325200812,3325200815,IE -3325200816,3325200831,CA +3325200816,3325200827,CA +3325200828,3325200831,CO 3325200832,3325200863,BA 3325200864,3325200879,ES 3325200880,3325200891,CA @@ -115859,8 +119030,8 @@ 3325201288,3325201367,CA 3325201368,3325201375,MY 3325201376,3325201391,CA -3325201392,3325201415,US -3325201416,3325201427,CA +3325201392,3325201407,US +3325201408,3325201427,CA 3325201428,3325201431,US 3325201432,3325201439,CA 3325201440,3325201447,IN @@ -115873,7 +119044,9 @@ 3325201592,3325201599,PT 3325201600,3325201603,CA 3325201604,3325201615,US -3325201616,3325201647,CA +3325201616,3325201627,CA +3325201628,3325201631,US +3325201632,3325201647,CA 3325201648,3325201655,US 3325201656,3325201663,ES 3325201664,3325201671,CO @@ -115901,7 +119074,7 @@ 3325202280,3325202327,CA 3325202328,3325202331,AU 3325202332,3325202367,CA -3325202368,3325202371,PE +3325202368,3325202371,PH 3325202372,3325202375,FR 3325202376,3325202395,CA 3325202396,3325202399,IN @@ -115909,29 +119082,33 @@ 3325204480,3325205503,US 3325205504,3325206428,CA 3325206429,3325206429,US -3325206430,3325206623,CA +3325206430,3325206543,CA +3325206544,3325206551,DO +3325206552,3325206555,US +3325206556,3325206559,CZ +3325206560,3325206623,CA 3325206624,3325206625,RO 3325206626,3325206626,CA 3325206627,3325206627,RO 3325206628,3325206639,CA 3325206640,3325206671,US 3325206672,3325206679,BR -3325206680,3325206683,US -3325206684,3325206687,CA +3325206680,3325206683,CL +3325206684,3325206687,SE 3325206688,3325206719,US 3325206720,3325206799,CA 3325206800,3325206815,US -3325206816,3325206823,CA -3325206824,3325206831,PL +3325206816,3325206831,CA 3325206832,3325206839,US 3325206840,3325206847,BG 3325206848,3325206879,CA 3325206880,3325206911,BA -3325206912,3325206915,CA +3325206912,3325206915,BR 3325206916,3325206919,US 3325206920,3325206935,CA 3325206936,3325206943,HR -3325206944,3325207055,CA +3325206944,3325207051,CA +3325207052,3325207055,US 3325207056,3325207059,GB 3325207060,3325207071,CA 3325207072,3325207103,MX @@ -115941,13 +119118,18 @@ 3325207120,3325207131,CA 3325207132,3325207135,US 3325207136,3325207167,BD -3325207168,3325207283,CA +3325207168,3325207271,CA +3325207272,3325207279,IN +3325207280,3325207283,CA 3325207284,3325207287,US 3325207288,3325207379,CA 3325207380,3325207383,US -3325207384,3325207455,CA -3325207456,3325207471,GB -3325207472,3325207591,CA +3325207384,3325207415,CA +3325207416,3325207423,US +3325207424,3325207439,UA +3325207440,3325207503,CA +3325207504,3325207519,US +3325207520,3325207591,CA 3325207592,3325207599,EC 3325207600,3325207699,CA 3325207700,3325207703,LU @@ -115961,8 +119143,7 @@ 3325208064,3325208095,BS 3325208096,3325208119,CA 3325208120,3325208123,US -3325208124,3325208127,IN -3325208128,3325208171,CA +3325208124,3325208171,CA 3325208172,3325208175,BR 3325208176,3325208187,CA 3325208188,3325208191,IN @@ -115980,9 +119161,7 @@ 3325208492,3325208495,US 3325208496,3325208543,CA 3325208544,3325208547,US -3325208548,3325208639,CA -3325208640,3325208647,US -3325208648,3325208735,CA +3325208548,3325208735,CA 3325208736,3325208743,HK 3325208744,3325208747,CA 3325208748,3325208751,CZ @@ -115990,13 +119169,12 @@ 3325208828,3325208831,EG 3325208832,3325208939,CA 3325208940,3325208943,AU -3325208944,3325208999,CA +3325208944,3325208947,BR +3325208948,3325208999,CA 3325209000,3325209003,AU 3325209004,3325209023,CA 3325209024,3325209055,US -3325209056,3325209063,CA -3325209064,3325209067,US -3325209068,3325209083,CA +3325209056,3325209083,CA 3325209084,3325209087,US 3325209088,3325209091,CA 3325209092,3325209095,AR @@ -116011,8 +119189,7 @@ 3325209232,3325209247,DE 3325209248,3325209295,CA 3325209296,3325209311,US -3325209312,3325209323,CA -3325209324,3325209327,BR +3325209312,3325209327,CA 3325209328,3325209343,US 3325209344,3325209359,RO 3325209360,3325209379,CA @@ -116020,11 +119197,13 @@ 3325209384,3325209387,CA 3325209388,3325209407,US 3325209408,3325209411,GB -3325209412,3325209423,CA -3325209424,3325209439,US -3325209440,3325209475,CA +3325209412,3325209435,CA +3325209436,3325209439,NG +3325209440,3325209447,CA +3325209448,3325209451,MT +3325209452,3325209475,CA 3325209476,3325209479,US -3325209480,3325209483,FR +3325209480,3325209483,IN 3325209484,3325209491,CA 3325209492,3325209495,CN 3325209496,3325209543,CA @@ -116033,17 +119212,13 @@ 3325209568,3325209575,US 3325209576,3325209579,CA 3325209580,3325209583,US -3325209584,3325209631,CA -3325209632,3325209635,US -3325209636,3325209639,CA +3325209584,3325209639,CA 3325209640,3325209647,TR 3325209648,3325209655,CA 3325209656,3325209663,CH 3325209664,3325209679,US -3325209680,3325209691,CA -3325209692,3325209695,US -3325209696,3325209759,CA -3325209760,3325209775,US +3325209680,3325209767,CA +3325209768,3325209775,US 3325209776,3325209779,CA 3325209780,3325209783,ID 3325209784,3325209915,CA @@ -116081,7 +119256,9 @@ 3325210636,3325210639,FR 3325210640,3325210671,CA 3325210672,3325210687,BR -3325210688,3325210711,CA +3325210688,3325210703,CA +3325210704,3325210707,US +3325210708,3325210711,CA 3325210712,3325210719,IN 3325210720,3325210751,US 3325210752,3325210791,CA @@ -116091,18 +119268,19 @@ 3325210852,3325210863,CA 3325210864,3325210879,US 3325210880,3325210959,CA -3325210960,3325210991,US +3325210960,3325210975,IN +3325210976,3325210991,US 3325210992,3325211087,CA 3325211088,3325211091,US 3325211092,3325211095,CA 3325211096,3325211103,US -3325211104,3325211111,FR -3325211112,3325211115,CA -3325211116,3325211119,GB +3325211104,3325211119,CA 3325211120,3325211127,US 3325211128,3325211135,CA 3325211136,3325211143,ID -3325211144,3325211159,CA +3325211144,3325211151,CA +3325211152,3325211155,US +3325211156,3325211159,CA 3325211160,3325211167,US 3325211168,3325211175,CA 3325211176,3325211183,US @@ -116126,12 +119304,12 @@ 3325211420,3325211423,US 3325211424,3325211647,CA 3325211648,3325211807,US -3325211808,3325211855,CA +3325211808,3325211839,CA +3325211840,3325211855,US 3325211856,3325211859,CL 3325211860,3325211863,CA 3325211864,3325211871,NO -3325211872,3325211879,CA -3325211880,3325211883,PE +3325211872,3325211883,CA 3325211884,3325211887,US 3325211888,3325211895,RO 3325211896,3325211967,CA @@ -116139,7 +119317,8 @@ 3325212000,3325212007,US 3325212008,3325212087,CA 3325212088,3325212091,BZ -3325212092,3325212127,CA +3325212092,3325212095,US +3325212096,3325212127,CA 3325212128,3325212143,IN 3325212144,3325212151,US 3325212152,3325212155,MX @@ -116152,17 +119331,20 @@ 3325212204,3325212207,ID 3325212208,3325212215,CA 3325212216,3325212223,HR -3325212224,3325212495,CA -3325212496,3325212511,ID +3325212224,3325212295,CA +3325212296,3325212303,IN +3325212304,3325212495,CA +3325212496,3325212503,FR +3325212504,3325212511,HU 3325212512,3325212515,CY 3325212516,3325212559,CA 3325212560,3325212575,BR -3325212576,3325212579,CA -3325212580,3325212583,US -3325212584,3325212587,CA +3325212576,3325212587,CA 3325212588,3325212591,BR 3325212592,3325212599,US -3325212600,3325212647,CA +3325212600,3325212611,CA +3325212612,3325212615,BR +3325212616,3325212647,CA 3325212648,3325212655,US 3325212656,3325212719,CA 3325212720,3325212727,ID @@ -116170,9 +119352,7 @@ 3325212732,3325212735,AE 3325212736,3325212771,CA 3325212772,3325212775,US -3325212776,3325212783,CA -3325212784,3325212799,US -3325212800,3325212927,CA +3325212776,3325212927,CA 3325212928,3325212943,LK 3325212944,3325213023,CA 3325213024,3325213055,EE @@ -116211,9 +119391,7 @@ 3325213712,3325213715,AR 3325213716,3325213951,CA 3325213952,3325213983,BA -3325213984,3325213991,CA -3325213992,3325213995,US -3325213996,3325214015,CA +3325213984,3325214015,CA 3325214016,3325214063,US 3325214064,3325214071,CA 3325214072,3325214079,AE @@ -116225,10 +119403,11 @@ 3325214152,3325214155,US 3325214156,3325214163,CA 3325214164,3325214167,BR -3325214168,3325214187,CA +3325214168,3325214171,CA +3325214172,3325214175,US +3325214176,3325214187,CA 3325214188,3325214191,US -3325214192,3325214239,CA -3325214240,3325214255,US +3325214192,3325214255,CA 3325214256,3325214259,SA 3325214260,3325214263,US 3325214264,3325214463,CA @@ -116236,26 +119415,24 @@ 3325214480,3325214499,CA 3325214500,3325214503,PA 3325214504,3325214583,CA -3325214584,3325214587,US -3325214588,3325214623,CA +3325214584,3325214591,US +3325214592,3325214623,CA 3325214624,3325214639,DE 3325214640,3325214647,FR 3325214648,3325214703,CA 3325214704,3325214719,AU 3325214720,3325214735,CA 3325214736,3325214739,US -3325214740,3325214815,CA +3325214740,3325214783,CA +3325214784,3325214791,US +3325214792,3325214815,CA 3325214816,3325214823,US 3325214824,3325214831,BR -3325214832,3325214975,CA -3325214976,3325214979,ES -3325214980,3325215055,CA +3325214832,3325215055,CA 3325215056,3325215059,IT 3325215060,3325215079,CA 3325215080,3325215087,BR -3325215088,3325215103,CA -3325215104,3325215107,IN -3325215108,3325215127,CA +3325215088,3325215127,CA 3325215128,3325215131,US 3325215132,3325215135,BZ 3325215136,3325215175,CA @@ -116263,8 +119440,7 @@ 3325215184,3325215203,CA 3325215204,3325215207,GB 3325215208,3325215211,FR -3325215212,3325215247,CA -3325215248,3325215263,US +3325215212,3325215263,CA 3325215264,3325215295,IN 3325215296,3325215299,US 3325215300,3325215303,IN @@ -116277,10 +119453,12 @@ 3325215472,3325215475,ES 3325215476,3325215495,CA 3325215496,3325215503,BR -3325215504,3325215667,CA +3325215504,3325215611,CA +3325215612,3325215615,BR +3325215616,3325215667,CA 3325215668,3325215675,BR 3325215676,3325215719,CA -3325215720,3325215727,US +3325215720,3325215727,MX 3325215728,3325215731,CA 3325215732,3325215735,BR 3325215736,3325215743,CA @@ -116295,7 +119473,9 @@ 3325215912,3325215915,IN 3325215916,3325215919,GB 3325215920,3325215927,US -3325215928,3325215951,CA +3325215928,3325215931,CA +3325215932,3325215935,BR +3325215936,3325215951,CA 3325215952,3325215967,BE 3325215968,3325215983,CA 3325215984,3325215999,VE @@ -116314,14 +119494,15 @@ 3325216116,3325216119,US 3325216120,3325216239,CA 3325216240,3325216243,BR -3325216244,3325216247,IN -3325216248,3325216319,CA +3325216244,3325216319,CA 3325216320,3325216327,US 3325216328,3325216359,CA 3325216360,3325216363,GB 3325216364,3325216367,CA -3325216368,3325216375,US -3325216376,3325216447,CA +3325216368,3325216383,US +3325216384,3325216399,CA +3325216400,3325216415,BR +3325216416,3325216447,CA 3325216448,3325216463,FR 3325216464,3325216527,CA 3325216528,3325216531,US @@ -116345,11 +119526,14 @@ 3325217224,3325217227,AU 3325217228,3325217231,CA 3325217232,3325217235,US -3325217236,3325217247,CA +3325217236,3325217243,CA +3325217244,3325217247,US 3325217248,3325217279,BA 3325217280,3325217307,CA 3325217308,3325217311,HK -3325217312,3325217471,CA +3325217312,3325217403,CA +3325217404,3325217407,FR +3325217408,3325217471,CA 3325217472,3325217503,IE 3325217504,3325217651,CA 3325217652,3325217655,AE @@ -116364,17 +119548,15 @@ 3325217888,3325217939,CA 3325217940,3325217943,US 3325217944,3325217951,CO -3325217952,3325217975,CA -3325217976,3325217987,US -3325217988,3325218015,CA -3325218016,3325218031,ES -3325218032,3325218039,CA +3325217952,3325217971,CA +3325217972,3325217975,US +3325217976,3325217983,CA +3325217984,3325217987,US +3325217988,3325218039,CA 3325218040,3325218047,US 3325218048,3325218139,CA 3325218140,3325218147,GB -3325218148,3325218151,CA -3325218152,3325218155,US -3325218156,3325218159,CA +3325218148,3325218159,CA 3325218160,3325218167,US 3325218168,3325218207,CA 3325218208,3325218239,US @@ -116388,7 +119570,9 @@ 3325218488,3325218491,US 3325218492,3325218519,CA 3325218520,3325218523,US -3325218524,3325218559,CA +3325218524,3325218531,CA +3325218532,3325218535,US +3325218536,3325218559,CA 3325218560,3325218567,US 3325218568,3325218583,CA 3325218584,3325218591,IN @@ -116416,7 +119600,9 @@ 3325219468,3325219475,US 3325219476,3325219503,CA 3325219504,3325219511,VG -3325219512,3325219535,CA +3325219512,3325219515,CA +3325219516,3325219519,BR +3325219520,3325219535,CA 3325219536,3325219551,PK 3325219552,3325219583,CA 3325219584,3325219599,US @@ -116434,7 +119620,8 @@ 3325219808,3325219811,US 3325219812,3325219839,CA 3325219840,3325219871,TN -3325219872,3325219919,CA +3325219872,3325219875,BR +3325219876,3325219919,CA 3325219920,3325219931,US 3325219932,3325219935,CA 3325219936,3325219951,US @@ -116456,7 +119643,7 @@ 3325220408,3325220411,US 3325220412,3325220415,BZ 3325220416,3325220511,CA -3325220512,3325220519,PL +3325220512,3325220519,BR 3325220520,3325220579,CA 3325220580,3325220583,BZ 3325220584,3325220587,US @@ -116476,7 +119663,9 @@ 3325220896,3325220927,FR 3325220928,3325220959,CA 3325220960,3325220967,EC -3325220968,3325221043,CA +3325220968,3325220975,CA +3325220976,3325220983,MX +3325220984,3325221043,CA 3325221044,3325221047,CL 3325221048,3325221055,CA 3325221056,3325221119,BR @@ -116487,28 +119676,34 @@ 3325221264,3325221279,TW 3325221280,3325221295,CA 3325221296,3325221299,US -3325221300,3325221439,CA +3325221300,3325221307,CA +3325221308,3325221311,VE +3325221312,3325221439,CA 3325221440,3325221443,PE 3325221444,3325221451,CA 3325221452,3325221455,US 3325221456,3325221467,CA 3325221468,3325221471,FR 3325221472,3325221567,CA -3325221568,3325221599,US +3325221568,3325221575,MX +3325221576,3325221583,CA +3325221584,3325221599,US 3325221600,3325221615,CA 3325221616,3325221623,GB 3325221624,3325221727,CA 3325221728,3325221731,US -3325221732,3325221751,CA +3325221732,3325221739,CA +3325221740,3325221743,BR +3325221744,3325221751,CA 3325221752,3325221755,IN 3325221756,3325221779,CA 3325221780,3325221783,US 3325221784,3325221787,BR -3325221788,3325221795,CA -3325221796,3325221807,US -3325221808,3325221819,CA -3325221820,3325221823,US -3325221824,3325221831,CA +3325221788,3325221791,VN +3325221792,3325221795,CA +3325221796,3325221799,US +3325221800,3325221807,BR +3325221808,3325221831,CA 3325221832,3325221839,BG 3325221840,3325221851,CA 3325221852,3325221855,BZ @@ -116531,8 +119726,10 @@ 3325222392,3325222395,BR 3325222396,3325222399,FR 3325222400,3325222463,US -3325222464,3325222535,CA -3325222536,3325222559,US +3325222464,3325222479,CA +3325222480,3325222483,US +3325222484,3325222543,CA +3325222544,3325222559,ID 3325222560,3325222567,CA 3325222568,3325222571,US 3325222572,3325222575,LK @@ -116547,7 +119744,8 @@ 3325222668,3325222671,MX 3325222672,3325222687,CA 3325222688,3325222703,GB -3325222704,3325222735,CA +3325222704,3325222719,CA +3325222720,3325222735,AU 3325222736,3325222751,US 3325222752,3325222783,MX 3325222784,3325222843,CA @@ -116555,7 +119753,7 @@ 3325222848,3325222851,CA 3325222852,3325222855,BZ 3325222856,3325222947,CA -3325222948,3325222951,US +3325222948,3325222951,AE 3325222952,3325222963,CA 3325222964,3325222967,VE 3325222968,3325222983,CA @@ -116582,20 +119780,23 @@ 3325223304,3325223311,RO 3325223312,3325223335,CA 3325223336,3325223343,US -3325223344,3325223375,CA +3325223344,3325223347,CA +3325223348,3325223351,IN +3325223352,3325223355,MX +3325223356,3325223375,CA 3325223376,3325223391,US 3325223392,3325223399,CA 3325223400,3325223407,US 3325223408,3325223427,CA 3325223428,3325223431,US 3325223432,3325223463,CA -3325223464,3325223471,PL +3325223464,3325223471,US 3325223472,3325223535,CA 3325223536,3325223551,AT 3325223552,3325223583,IE 3325223584,3325223619,CA -3325223620,3325223623,BR -3325223624,3325223643,CA +3325223620,3325223631,BR +3325223632,3325223643,CA 3325223644,3325223647,CZ 3325223648,3325223663,DE 3325223664,3325223723,CA @@ -116609,13 +119810,11 @@ 3325223856,3325223871,AU 3325223872,3325223907,CA 3325223908,3325223911,VE -3325223912,3325223915,US -3325223916,3325223919,CA +3325223912,3325223919,CA 3325223920,3325223935,BR 3325223936,3325223967,CA 3325223968,3325223991,US -3325223992,3325223995,FR -3325223996,3325224031,CA +3325223992,3325224031,CA 3325224032,3325224039,US 3325224040,3325224043,CO 3325224044,3325224047,CA @@ -116636,7 +119835,9 @@ 3325224392,3325224399,CA 3325224400,3325224415,AU 3325224416,3325224419,US -3325224420,3325224551,CA +3325224420,3325224479,CA +3325224480,3325224511,US +3325224512,3325224551,CA 3325224552,3325224559,BR 3325224560,3325224647,CA 3325224648,3325224651,IN @@ -116652,9 +119853,9 @@ 3325224736,3325224751,LK 3325224752,3325224767,CA 3325224768,3325224783,FR -3325224784,3325224787,CA -3325224788,3325224791,FR -3325224792,3325224807,CA +3325224784,3325224795,CA +3325224796,3325224799,HR +3325224800,3325224807,CA 3325224808,3325224815,GB 3325224816,3325224823,FR 3325224824,3325224831,CA @@ -116685,8 +119886,7 @@ 3325225316,3325225319,ES 3325225320,3325225367,CA 3325225368,3325225371,US -3325225372,3325225375,IN -3325225376,3325225407,CA +3325225372,3325225407,CA 3325225408,3325225411,IN 3325225412,3325225415,CA 3325225416,3325225419,AU @@ -116708,14 +119908,14 @@ 3325225736,3325225743,US 3325225744,3325225775,CA 3325225776,3325225783,US -3325225784,3325225787,TR -3325225788,3325225799,CA +3325225784,3325225799,CA 3325225800,3325225807,IN 3325225808,3325225819,CA 3325225820,3325225823,US 3325225824,3325225899,CA 3325225900,3325225911,CY -3325225912,3325225919,CA +3325225912,3325225915,CA +3325225916,3325225919,BR 3325225920,3325225923,EG 3325225924,3325225943,CA 3325225944,3325225951,PL @@ -116728,7 +119928,11 @@ 3325226072,3325226075,BR 3325226076,3325226087,CA 3325226088,3325226091,EC -3325226092,3325226179,CA +3325226092,3325226095,CA +3325226096,3325226099,PL +3325226100,3325226159,CA +3325226160,3325226167,FR +3325226168,3325226179,CA 3325226180,3325226183,BR 3325226184,3325226187,US 3325226188,3325226239,CA @@ -116737,13 +119941,19 @@ 3325226288,3325226303,GB 3325226304,3325226307,CA 3325226308,3325226311,FR -3325226312,3325226343,CA +3325226312,3325226315,DE +3325226316,3325226343,CA 3325226344,3325226347,IN -3325226348,3325226495,CA +3325226348,3325226439,CA +3325226440,3325226443,VN +3325226444,3325226495,CA 3325226496,3325227007,US 3325227008,3325227039,CA 3325227040,3325227071,BR -3325227072,3325227107,CA +3325227072,3325227087,US +3325227088,3325227099,CA +3325227100,3325227103,US +3325227104,3325227107,CA 3325227108,3325227111,AR 3325227112,3325227119,US 3325227120,3325227223,CA @@ -116800,9 +120010,7 @@ 3325228616,3325228623,US 3325228624,3325228675,CA 3325228676,3325228683,US -3325228684,3325228695,CA -3325228696,3325228703,FR -3325228704,3325228735,CA +3325228684,3325228735,CA 3325228736,3325228739,FR 3325228740,3325228783,CA 3325228784,3325228787,US @@ -116810,9 +120018,8 @@ 3325228808,3325228815,PL 3325228816,3325228823,CA 3325228824,3325228831,BR -3325228832,3325228871,CA -3325228872,3325228875,US -3325228876,3325228931,CA +3325228832,3325228863,US +3325228864,3325228931,CA 3325228932,3325228935,LU 3325228936,3325228991,CA 3325228992,3325229007,BR @@ -116820,8 +120027,7 @@ 3325229072,3325229079,IN 3325229080,3325229083,CA 3325229084,3325229087,US -3325229088,3325229167,CA -3325229168,3325229175,PL +3325229088,3325229175,CA 3325229176,3325229183,IN 3325229184,3325229247,US 3325229248,3325229255,CA @@ -116833,11 +120039,10 @@ 3325229328,3325229331,US 3325229332,3325229351,CA 3325229352,3325229359,BR -3325229360,3325229363,CA -3325229364,3325229367,US -3325229368,3325229411,CA +3325229360,3325229411,CA 3325229412,3325229415,RU -3325229416,3325229471,CA +3325229416,3325229463,CA +3325229464,3325229471,BR 3325229472,3325229487,US 3325229488,3325229499,CA 3325229500,3325229503,IN @@ -116867,7 +120072,7 @@ 3325229956,3325229959,US 3325229960,3325229975,CA 3325229976,3325229979,IN -3325229980,3325229983,US +3325229980,3325229983,BR 3325229984,3325229991,CA 3325229992,3325229999,IN 3325230000,3325230007,CA @@ -116881,7 +120086,7 @@ 3325230096,3325230103,CA 3325230104,3325230111,US 3325230112,3325230119,CA -3325230120,3325230123,US +3325230120,3325230123,MA 3325230124,3325230127,CL 3325230128,3325230135,CA 3325230136,3325230143,FR @@ -116903,10 +120108,12 @@ 3325230716,3325230751,US 3325230752,3325230779,CA 3325230780,3325230783,BR -3325230784,3325230975,CA -3325230976,3325230991,US +3325230784,3325230983,CA +3325230984,3325230991,US 3325230992,3325231007,FR -3325231008,3325231095,CA +3325231008,3325231071,CA +3325231072,3325231079,US +3325231080,3325231095,CA 3325231096,3325231099,US 3325231100,3325231103,BR 3325231104,3325232127,US @@ -116937,7 +120144,8 @@ 3325290240,3325290495,CA 3325290496,3325296383,US 3325296384,3325296639,CA -3325296640,3325304831,US +3325296640,3325304063,US +3325304064,3325304831,AS 3325304832,3325305087,CA 3325305088,3325307903,US 3325307904,3325308927,GB @@ -117658,9 +120866,13 @@ 3333783552,3333801727,US 3333801728,3333801983,CA 3333801984,3333825791,US -3333826048,3333859839,US +3333826048,3333829631,US +3333829632,3333830143,IN +3333830144,3333859839,US 3333859840,3333860095,BM -3333860096,3333939455,US +3333860096,3333871103,US +3333871104,3333871359,CA +3333871360,3333939455,US 3333939456,3333939711,CA 3333939712,3333988607,US 3333988608,3333988863,BR @@ -117716,7 +120928,9 @@ 3335005648,3335005663,US 3335005664,3335005759,CN 3335005760,3335005823,US -3335005824,3335008127,CN +3335005824,3335008071,CN +3335008072,3335008079,US +3335008080,3335008127,CN 3335008128,3335008255,US 3335008256,3335009175,CN 3335009176,3335009183,US @@ -117888,9 +121102,7 @@ 3337895616,3337895679,US 3337895680,3337895935,CN 3337895936,3337900031,PR -3337900032,3337948671,US -3337948672,3337949183,CA -3337949184,3337957375,US +3337900032,3337957375,US 3337957376,3337959423,CA 3337959424,3337960447,US 3337960448,3337961471,CA @@ -117910,7 +121122,9 @@ 3337961664,3337961671,CA 3337961672,3337962623,US 3337962624,3337962751,CA -3337962752,3337963639,US +3337962752,3337962799,US +3337962800,3337962807,GB +3337962808,3337963639,US 3337963640,3337963647,CA 3337963648,3337963775,US 3337963776,3337963783,AZ @@ -118102,7 +121316,9 @@ 3338912768,3338913023,EC 3338913024,3338916351,US 3338916352,3338916479,CN -3338916480,3338964991,US +3338916480,3338921219,US +3338921220,3338921220,PT +3338921221,3338964991,US 3338964992,3338965247,CA 3338965248,3338976767,US 3338976768,3338977023,CA @@ -118168,15 +121384,11 @@ 3339264000,3339270399,US 3339270400,3339270655,CA 3339271168,3339327999,US -3339328512,3339328783,CA -3339328784,3339328791,US -3339328792,3339328831,CA +3339328512,3339328831,CA 3339328832,3339328895,US 3339328896,3339328943,CA 3339328944,3339328959,AE -3339328960,3339329023,CA -3339329024,3339329151,GB -3339329152,3339329279,CA +3339328960,3339329279,CA 3339329280,3339329407,US 3339329408,3339329439,CA 3339329440,3339329455,GB @@ -118352,8 +121564,7 @@ 3340085248,3340086271,US 3340087296,3340088319,US 3340088320,3340089343,CA -3340089344,3340090367,US -3340091392,3340097535,US +3340089344,3340097535,US 3340097536,3340098559,CA 3340098560,3340107775,US 3340107776,3340369919,CA @@ -118375,7 +121586,9 @@ 3340429824,3340430079,PA 3340430080,3340453375,US 3340453376,3340453887,BM -3340453888,3340460031,US +3340453888,3340454911,US +3340454912,3340455167,DE +3340455168,3340460031,US 3340460032,3340462079,PR 3340462080,3340481535,US 3340481536,3340482559,CA @@ -118566,14 +121779,14 @@ 3341533952,3341534207,CA 3341534720,3341535007,US 3341535008,3341535015,ID -3341535016,3341535031,US +3341535016,3341535023,GH +3341535024,3341535031,PA 3341535032,3341535039,VN 3341535040,3341535047,MA -3341535048,3341535087,US -3341535088,3341535095,BD -3341535096,3341535151,US -3341535152,3341535171,CN -3341535172,3341535183,US +3341535048,3341535055,GH +3341535056,3341535151,US +3341535152,3341535167,CN +3341535168,3341535183,US 3341535184,3341535187,ID 3341535188,3341535195,US 3341535196,3341535199,SA @@ -118639,7 +121852,8 @@ 3341837312,3341837743,CA 3341837744,3341837747,US 3341837748,3341838335,CA -3341838336,3341854551,US +3341838336,3341838591,GB +3341838592,3341854551,US 3341854552,3341854559,SG 3341854560,3341863935,US 3341863936,3341864447,AG @@ -118728,8 +121942,10 @@ 3342795264,3342831103,US 3342831104,3342831359,IN 3342831360,3342878967,US -3342878976,3342879551,US -3342879568,3342979587,US +3342878976,3342879231,US +3342879488,3342879551,NL +3342879568,3342879743,NL +3342879744,3342979587,US 3342979592,3343013887,US 3343013888,3343015695,CA 3343015696,3343015727,US @@ -118862,9 +122078,9 @@ 3343653632,3343653695,CA 3343653696,3343656511,US 3343656512,3343656575,VI -3343656576,3343747583,US -3343747584,3343748095,VE -3343748096,3343858687,US +3343656576,3343656703,US +3343656704,3343656959,VI +3343656960,3343858687,US 3343858688,3343859199,VG 3343859200,3343922975,US 3343922976,3343923007,PA @@ -118926,9 +122142,19 @@ 3344381224,3344381255,US 3344381256,3344381263,CA 3344381264,3344381271,MX -3344381272,3344406527,US +3344381272,3344381887,US +3344381888,3344381893,ES +3344381894,3344406527,US 3344406528,3344408575,CA -3344408576,3344415679,US +3344408576,3344411135,US +3344411136,3344411151,BM +3344411152,3344411295,US +3344411296,3344411327,BM +3344411328,3344411519,US +3344411520,3344411535,BM +3344411536,3344411631,US +3344411632,3344411647,BM +3344411648,3344415679,US 3344415680,3344415743,AR 3344415744,3344429055,US 3344429056,3344429343,CA @@ -118992,9 +122218,7 @@ 3344964608,3344965631,CA 3344965632,3344973823,US 3344973824,3344974847,BM -3344974848,3344978207,US -3344978208,3344978215,BD -3344978216,3344979967,US +3344974848,3344979967,US 3344979968,3344982015,CA 3344982016,3345007615,US 3345007616,3345008639,CA @@ -119014,48 +122238,46 @@ 3345318944,3345318975,CY 3345318976,3345321471,US 3345321472,3345321983,GB -3345321984,3345322495,US -3345322496,3345322503,BR -3345322504,3345327103,US +3345321984,3345327103,US 3345327104,3345328127,CA 3345328128,3345332287,US -3345332288,3345332295,BR +3345332288,3345332295,GH 3345332296,3345332303,PK 3345332304,3345332311,US -3345332312,3345332319,BR +3345332312,3345332319,LK 3345332320,3345332327,PT 3345332328,3345332339,US -3345332340,3345332343,BR +3345332340,3345332343,GH 3345332344,3345332347,VN 3345332348,3345332351,CY 3345332352,3345332375,US 3345332376,3345332383,CA -3345332384,3345332399,US -3345332400,3345332403,BR -3345332404,3345332411,ID +3345332384,3345332403,US +3345332404,3345332407,GH +3345332408,3345332411,ID 3345332412,3345332423,US 3345332424,3345332431,MY 3345332432,3345332435,VN 3345332436,3345332439,GB -3345332440,3345332455,US -3345332456,3345332459,MY +3345332440,3345332451,US +3345332452,3345332455,IN +3345332456,3345332459,GH 3345332460,3345332463,US -3345332464,3345332471,BR -3345332472,3345332475,US -3345332476,3345332479,CN -3345332480,3345332487,US +3345332464,3345332471,VN +3345332472,3345332487,US 3345332488,3345332495,AU 3345332496,3345332503,CA -3345332504,3345332511,US -3345332512,3345332519,ID +3345332504,3345332515,BR +3345332516,3345332519,GH 3345332520,3345332583,US 3345332584,3345332587,CY -3345332588,3345332591,ID +3345332588,3345332591,BR 3345332592,3345332595,US 3345332596,3345332599,BD 3345332600,3345332603,US 3345332604,3345332607,ID -3345332608,3345332655,US +3345332608,3345332647,US +3345332648,3345332655,ID 3345332656,3345332659,CY 3345332660,3345332667,US 3345332668,3345332671,ID @@ -119069,7 +122291,8 @@ 3345332864,3345333055,VN 3345333056,3345333183,US 3345333184,3345333215,IN -3345333216,3345333223,US +3345333216,3345333219,CN +3345333220,3345333223,GH 3345333224,3345333227,MX 3345333228,3345333231,CY 3345333232,3345333247,US @@ -119155,7 +122378,8 @@ 3345409950,3345410032,US 3345410033,3345410036,GB 3345410037,3345412095,US -3345414144,3345418239,US +3345412096,3345413119,CA +3345413120,3345418239,US 3345418240,3345419519,NL 3345419520,3345422847,US 3345423360,3345424383,TC @@ -119192,9 +122416,7 @@ 3345447680,3345448447,FR 3345448448,3345448703,BE 3345448704,3345448959,DE -3345448960,3345666567,US -3345666568,3345666591,IN -3345666592,3345666623,US +3345448960,3345666623,US 3345666624,3345666639,NO 3345666640,3345667103,US 3345667104,3345667119,IN @@ -119321,10 +122543,8 @@ 3346793472,3346793983,US 3346794496,3346923519,US 3346923520,3346989055,CA -3346989056,3347014143,US -3347014144,3347014255,CA -3347014256,3347014271,CY -3347014272,3347014399,CA +3346989056,3347013631,US +3347013632,3347014399,CA 3347014400,3347014655,US 3347014656,3347015167,CA 3347015168,3347015295,QA @@ -119402,9 +122622,9 @@ 3349648166,3349648168,NG 3349648169,3349649407,US 3349649408,3349653503,CA -3349653504,3349702623,US -3349702624,3349702655,LK -3349702656,3349723199,US +3349653504,3349723175,US +3349723176,3349723183,LK +3349723184,3349723199,US 3349723200,3349723215,PK 3349723216,3349723260,US 3349723261,3349723265,CA @@ -119560,7 +122780,7 @@ 3350836268,3350836275,IN 3350836276,3350836279,ZA 3350836280,3350836283,CA -3350836284,3350836991,US +3350836736,3350836991,US 3350836992,3350837247,CA 3350837248,3350837759,US 3350837760,3350843391,CA @@ -119648,9 +122868,7 @@ 3351058944,3351059455,CA 3351059456,3351071743,US 3351071744,3351072767,CA -3351072768,3351074260,US -3351074261,3351074261,BR -3351074262,3351074271,US +3351072768,3351074271,US 3351074272,3351074272,GT 3351074273,3351074283,US 3351074284,3351074284,BR @@ -119665,25 +122883,25 @@ 3351074376,3351074377,DE 3351074378,3351074379,US 3351074380,3351074380,DE -3351074381,3351074384,US -3351074385,3351074385,CL -3351074386,3351074386,US +3351074381,3351074381,US +3351074382,3351074382,KW +3351074383,3351074386,US 3351074387,3351074387,BR 3351074388,3351074388,DE 3351074389,3351074389,US 3351074390,3351074390,DE 3351074391,3351074391,BR 3351074392,3351074392,CL -3351074393,3351074393,US -3351074394,3351074395,UA +3351074393,3351074394,US +3351074395,3351074395,TR 3351074396,3351074396,BR -3351074397,3351074397,UA -3351074398,3351074402,US +3351074397,3351074402,US 3351074403,3351074403,BR 3351074404,3351074404,CL 3351074405,3351074405,US 3351074406,3351074406,CA -3351074407,3351074409,BR +3351074407,3351074407,US +3351074408,3351074409,BR 3351074410,3351074410,DE 3351074411,3351074411,US 3351074412,3351074413,PA @@ -119693,20 +122911,19 @@ 3351074419,3351074419,IN 3351074420,3351074422,US 3351074423,3351074423,UA -3351074424,3351074426,US +3351074424,3351074424,GB +3351074425,3351074426,US 3351074427,3351074427,DE 3351074428,3351074429,US 3351074430,3351074430,BR -3351074431,3351074439,US +3351074431,3351074434,US +3351074435,3351074435,BR +3351074436,3351074439,US 3351074440,3351074440,CA 3351074441,3351074444,US 3351074445,3351074445,CA 3351074446,3351074446,CL -3351074447,3351074451,US -3351074452,3351074452,IN -3351074453,3351074453,US -3351074454,3351074457,IN -3351074458,3351074463,US +3351074447,3351074463,US 3351074464,3351074466,BR 3351074467,3351074472,US 3351074473,3351074473,BR @@ -119728,9 +122945,7 @@ 3351074558,3351074558,CA 3351074559,3351074690,US 3351074691,3351074691,BR -3351074692,3351074708,US -3351074709,3351074709,CA -3351074710,3351074711,US +3351074692,3351074711,US 3351074712,3351074712,TR 3351074713,3351074728,US 3351074729,3351074729,EG @@ -119766,19 +122981,17 @@ 3351196672,3351197695,US 3351197696,3351197711,PT 3351197712,3351197715,EG -3351197716,3351197719,CN +3351197716,3351197719,GH 3351197720,3351197735,US 3351197736,3351197739,CY -3351197740,3351197743,BR +3351197740,3351197743,PK 3351197744,3351197751,VN 3351197752,3351197759,PT 3351197760,3351197775,US 3351197776,3351197783,BR -3351197784,3351197787,US -3351197788,3351197791,GT +3351197784,3351197791,US 3351197792,3351197795,IN -3351197796,3351197799,BR -3351197800,3351197803,SI +3351197796,3351197803,BR 3351197804,3351197807,AE 3351197808,3351197827,US 3351197828,3351197831,VN @@ -119788,9 +123001,10 @@ 3351197844,3351197847,CN 3351197848,3351197859,US 3351197860,3351197863,CY -3351197864,3351197867,VN +3351197864,3351197867,US 3351197868,3351197871,CY -3351197872,3351197887,US +3351197872,3351197879,US +3351197880,3351197887,GH 3351197888,3351197891,MX 3351197892,3351197895,VN 3351197896,3351197899,BR @@ -119798,12 +123012,16 @@ 3351197904,3351197911,VN 3351197912,3351197983,US 3351197984,3351198015,MX -3351198016,3351198031,US +3351198016,3351198023,US +3351198024,3351198031,GH 3351198032,3351198039,MD 3351198040,3351198047,AE -3351198048,3351198071,US +3351198048,3351198059,US +3351198060,3351198063,GH +3351198064,3351198071,BR 3351198072,3351198079,VN -3351198080,3351198095,US +3351198080,3351198091,US +3351198092,3351198095,GT 3351198096,3351198103,MX 3351198104,3351198111,VN 3351198112,3351198131,US @@ -119812,18 +123030,18 @@ 3351198152,3351198155,GB 3351198156,3351198159,EG 3351198160,3351198171,US -3351198172,3351198175,AU +3351198172,3351198175,GH 3351198176,3351198179,BD -3351198180,3351198187,US -3351198188,3351198191,GH -3351198192,3351198195,CN -3351198196,3351198207,US +3351198180,3351198183,US +3351198184,3351198191,GH +3351198192,3351198207,US 3351198208,3351198215,VN 3351198216,3351198223,AE 3351198224,3351198231,US 3351198232,3351198235,CA 3351198236,3351198239,US -3351198240,3351198251,ID +3351198240,3351198247,VN +3351198248,3351198251,ID 3351198252,3351198255,GH 3351198256,3351198259,VN 3351198260,3351198263,DE @@ -119831,20 +123049,21 @@ 3351198272,3351198279,ID 3351198280,3351198335,US 3351198336,3351198351,CA -3351198352,3351198359,US +3351198352,3351198355,GT +3351198356,3351198359,US 3351198360,3351198363,GB 3351198364,3351198371,US 3351198372,3351198383,CA -3351198384,3351198387,MX +3351198384,3351198387,GH 3351198388,3351198391,US 3351198392,3351198399,TR 3351198400,3351198403,US 3351198404,3351198407,IN 3351198408,3351198411,BR 3351198412,3351198415,GB -3351198416,3351198423,CL +3351198416,3351198423,GT 3351198424,3351198427,RO -3351198428,3351198431,US +3351198428,3351198431,BR 3351198432,3351198439,IN 3351198440,3351198447,US 3351198448,3351198463,JO @@ -119852,16 +123071,18 @@ 3351198476,3351198479,CY 3351198480,3351198487,BR 3351198488,3351198495,US -3351198496,3351198503,VN -3351198504,3351198507,US +3351198496,3351198499,PK +3351198500,3351198507,US 3351198508,3351198511,CY 3351198512,3351198515,US -3351198516,3351198519,ID +3351198516,3351198519,BR 3351198520,3351198527,IN 3351198528,3351198535,RU 3351198536,3351198539,CY -3351198540,3351198559,US -3351198560,3351198567,LK +3351198540,3351198551,US +3351198552,3351198559,VN +3351198560,3351198563,BR +3351198564,3351198567,CN 3351198568,3351198575,US 3351198576,3351198579,CY 3351198580,3351198607,US @@ -119963,7 +123184,9 @@ 3351357440,3351359487,CA 3351359488,3351372799,US 3351372800,3351373823,BM -3351373824,3351380223,US +3351373824,3351375871,US +3351375872,3351376895,PR +3351376896,3351380223,US 3351380224,3351380479,CA 3351380480,3351380991,US 3351380992,3351381759,CA @@ -120098,14 +123321,13 @@ 3351696384,3351696639,CA 3351696640,3351697407,US 3351697408,3351698431,CA -3351698432,3351699303,US -3351699304,3351699305,CA -3351699306,3351699306,US -3351699307,3351699311,CA -3351699312,3351706367,US +3351698432,3351698943,US +3351698944,3351699455,CA +3351699456,3351706367,US 3351706368,3351706623,CA 3351706624,3351850239,US -3351850496,3351855871,US +3351850496,3351855615,US +3351855616,3351855871,GB 3351856128,3351860223,US 3351860224,3351861247,KY 3351861248,3351869439,US @@ -120176,9 +123398,15 @@ 3352916535,3352916541,BR 3352916542,3352916542,US 3352916543,3352916557,BR -3352916558,3352916566,US +3352916558,3352916561,US +3352916562,3352916562,GB +3352916563,3352916564,BR +3352916565,3352916566,US 3352916567,3352916584,BR -3352916585,3352916607,US +3352916585,3352916586,US +3352916587,3352916592,BR +3352916593,3352916593,AE +3352916594,3352916607,US 3352916608,3352916615,BR 3352916616,3352916619,US 3352916620,3352916635,BR @@ -120188,7 +123416,9 @@ 3352916640,3352916640,BR 3352916641,3352916648,US 3352916649,3352916689,BR -3352916690,3352918015,US +3352916690,3352916690,US +3352916691,3352916694,BR +3352916695,3352918015,US 3352918016,3352919039,CA 3352919040,3353335303,US 3353335304,3353335309,NL @@ -120203,8 +123433,8 @@ 3353335334,3353335335,US 3353335336,3353335339,NL 3353335340,3353335341,US -3353335342,3353335349,NL -3353335350,3353335353,US +3353335342,3353335347,NL +3353335348,3353335353,US 3353335354,3353335359,NL 3353335360,3353335361,US 3353335362,3353335363,NL @@ -120219,8 +123449,8 @@ 3353335391,3353335392,US 3353335393,3353335394,NL 3353335395,3353335396,US -3353335397,3353335406,NL -3353335407,3353335407,US +3353335397,3353335404,NL +3353335405,3353335407,US 3353335408,3353335411,NL 3353335412,3353335414,US 3353335415,3353335420,NL @@ -120405,24 +123635,26 @@ 3354507296,3354507299,VN 3354507300,3354507303,US 3354507304,3354507307,IN -3354507308,3354507311,MA -3354507312,3354507315,BR -3354507316,3354507327,US -3354507328,3354507335,MD +3354507308,3354507315,BR +3354507316,3354507319,US +3354507320,3354507323,PK +3354507324,3354507327,US +3354507328,3354507335,RU 3354507336,3354507343,US -3354507344,3354507347,IN -3354507348,3354507351,BR +3354507344,3354507347,BR +3354507348,3354507351,CN 3354507352,3354507359,AU 3354507360,3354507363,EG 3354507364,3354507367,CY 3354507368,3354507375,CA 3354507376,3354507383,ID -3354507384,3354507387,BR -3354507388,3354507391,CN +3354507384,3354507387,CN +3354507388,3354507391,BR 3354507392,3354507399,CA 3354507400,3354507403,EG 3354507404,3354507407,CN -3354507408,3354507439,US +3354507408,3354507431,US +3354507432,3354507439,MY 3354507440,3354507443,CY 3354507444,3354507447,JO 3354507448,3354507459,US @@ -120432,30 +123664,32 @@ 3354507472,3354507475,MY 3354507476,3354507479,CY 3354507480,3354507483,BR -3354507484,3354507507,US -3354507508,3354507511,PK +3354507484,3354507511,US 3354507512,3354507519,MA 3354507520,3354507535,US -3354507536,3354507539,CN +3354507536,3354507539,ID 3354507540,3354507543,HU 3354507544,3354507551,US -3354507552,3354507567,CN +3354507552,3354507559,NI +3354507560,3354507567,CN 3354507568,3354507575,VN 3354507576,3354507583,AE 3354507584,3354507591,US 3354507592,3354507599,CY 3354507600,3354507607,US 3354507608,3354507611,CN -3354507612,3354507615,US +3354507612,3354507615,BR 3354507616,3354507623,IN -3354507624,3354507631,EG +3354507624,3354507631,CN 3354507632,3354507639,US -3354507640,3354507647,MD -3354507648,3354507655,US -3354507656,3354507659,ID +3354507640,3354507643,CN +3354507644,3354507647,ID +3354507648,3354507655,CN +3354507656,3354507659,CA 3354507660,3354507667,CY 3354507668,3354507671,BR -3354507672,3354507683,IN +3354507672,3354507679,US +3354507680,3354507683,GH 3354507684,3354507687,PT 3354507688,3354507691,CA 3354507692,3354507703,US @@ -120472,7 +123706,8 @@ 3354507760,3354507767,LK 3354507768,3354507775,US 3354507776,3354507779,CY -3354507780,3354507787,US +3354507780,3354507783,US +3354507784,3354507787,BR 3354507788,3354507791,CY 3354507792,3354507803,US 3354507804,3354507807,CY @@ -120494,7 +123729,7 @@ 3354507928,3354507931,US 3354507932,3354507943,CY 3354507944,3354507959,US -3354507960,3354507967,AE +3354507960,3354507967,GH 3354507968,3354507983,MX 3354507984,3354507991,AE 3354507992,3354507999,PK @@ -120504,7 +123739,7 @@ 3354508036,3354508039,BR 3354508040,3354508043,US 3354508044,3354508047,DK -3354508048,3354508051,US +3354508048,3354508051,BR 3354508052,3354508055,VN 3354508056,3354508059,AU 3354508060,3354508063,BR @@ -120525,7 +123760,8 @@ 3354508140,3354508143,CY 3354508144,3354508147,MY 3354508148,3354508151,BB -3354508152,3354508163,US +3354508152,3354508159,US +3354508160,3354508163,GH 3354508164,3354508167,CY 3354508168,3354508187,US 3354508188,3354508191,VN @@ -120543,7 +123779,9 @@ 3354508248,3354508251,VN 3354508252,3354508255,US 3354508256,3354508259,EG -3354508260,3354508271,US +3354508260,3354508263,US +3354508264,3354508267,TH +3354508268,3354508271,US 3354508272,3354508275,TW 3354508276,3354508287,US 3354508288,3354508303,CY @@ -120558,8 +123796,7 @@ 3354508360,3354508367,AU 3354508368,3354508375,BD 3354508376,3354508383,MA -3354508384,3354508391,US -3354508392,3354508395,BR +3354508384,3354508395,US 3354508396,3354508399,VN 3354508400,3354508423,US 3354508424,3354508431,MD @@ -120569,8 +123806,7 @@ 3354508456,3354508487,US 3354508488,3354508491,VN 3354508492,3354508495,CY -3354508496,3354508515,US -3354508516,3354508519,VN +3354508496,3354508519,US 3354508520,3354508527,IN 3354508528,3354508535,AE 3354508536,3354508543,BD @@ -120578,7 +123814,8 @@ 3354508560,3354508571,US 3354508572,3354508575,CN 3354508576,3354508579,BR -3354508580,3354508603,US +3354508580,3354508583,AE +3354508584,3354508603,US 3354508604,3354508607,CY 3354508608,3354508623,US 3354508624,3354508639,MX @@ -120619,9 +123856,9 @@ 3354509256,3354509263,US 3354509264,3354509279,BR 3354509280,3354509283,AU -3354509284,3354509287,ID +3354509284,3354509287,GH 3354509288,3354509291,CY -3354509292,3354509295,US +3354509292,3354509295,IN 3354509296,3354509299,CA 3354509300,3354509391,US 3354509392,3354509399,CN @@ -120668,7 +123905,9 @@ 3354737152,3354770687,US 3354770688,3354770943,CA 3354770944,3354788095,US -3354788096,3354806383,CA +3354788096,3354789887,CA +3354789888,3354790399,US +3354790400,3354806383,CA 3354806384,3354806399,US 3354806400,3354806639,CA 3354806640,3354806655,SE @@ -120689,8 +123928,8 @@ 3355012608,3355017215,CA 3355017216,3355052287,US 3355052288,3355052543,AU -3355052544,3355053311,CA -3355053312,3355249151,US +3355052544,3355053055,CA +3355053056,3355249151,US 3355249152,3355249663,CA 3355249664,3355260927,US 3355260928,3355262719,CA @@ -120747,7 +123986,7 @@ 3355418112,3355418367,US 3355418368,3355418371,BR 3355418372,3355418375,US -3355418376,3355418379,VN +3355418376,3355418379,GH 3355418380,3355418383,BR 3355418384,3355418395,US 3355418396,3355418399,GT @@ -120780,28 +124019,23 @@ 3355449344,3355450367,CU 3355450368,3355451391,EC 3355451392,3355458559,BR -3355458560,3355458591,HN -3355458592,3355458599,US -3355458600,3355459071,HN +3355458560,3355459071,HN 3355459072,3355459327,BR 3355459328,3355459583,EC -3355459584,3355459839,PA 3355459840,3355460095,VE 3355460096,3355460351,CL 3355460352,3355460607,BR -3355460608,3355460863,UY -3355460864,3355461887,BR +3355460608,3355461119,UY +3355461120,3355461887,BR 3355461888,3355463423,EC 3355463424,3355463935,AR 3355463936,3355464191,BR 3355464192,3355464447,CL 3355464448,3355464959,MX -3355464960,3355465727,BR -3355465728,3355465983,UY +3355464960,3355465215,BR +3355465216,3355465983,UY 3355465984,3355466239,BR -3355466240,3355466751,MX -3355466752,3355467007,BR -3355467008,3355467263,MX +3355466240,3355467263,MX 3355467264,3355467519,US 3355467520,3355467775,MX 3355467776,3355468799,AR @@ -120836,7 +124070,6 @@ 3355491072,3355491327,CO 3355491328,3355494655,AR 3355494656,3355494911,CO -3355494912,3355495423,PA 3355495424,3355496447,UY 3355496448,3355498495,AR 3355498496,3355500543,US @@ -120855,7 +124088,7 @@ 3355539200,3355539455,VE 3355539456,3355540479,CL 3355540480,3355540735,CO -3355540736,3355540991,BZ +3355540736,3355540991,BR 3355540992,3355541503,CO 3355541504,3355545599,CL 3355545600,3355547647,VE @@ -120892,12 +124125,13 @@ 3355615232,3355623423,SR 3355623424,3355639807,CL 3355639808,3355642367,VE -3355642368,3355642879,PA 3355642880,3355643903,UY 3355643904,3355647999,BR 3355648000,3355668991,AR 3355668992,3355669247,PE -3355669248,3355672575,AR +3355669248,3355669503,AR +3355669504,3355670527,VE +3355670528,3355672575,AR 3355672576,3355677183,CO 3355677184,3355677439,GT 3355677440,3355682815,CO @@ -120907,7 +124141,7 @@ 3355688960,3355689471,CO 3355689472,3355689727,HN 3355689728,3355689983,AR -3355689984,3355693055,PA +3355691008,3355693055,PA 3355693056,3355695103,CL 3355695104,3355697151,AR 3355697152,3355701503,HN @@ -120932,8 +124166,7 @@ 3355774976,3355779071,VE 3355779072,3355781119,BR 3355781120,3355783167,VE -3355783168,3355785215,AR -3355785216,3355787263,CR +3355783168,3355787263,CR 3355787264,3355803647,AR 3355803648,3355820031,VE 3355820032,3355836415,AR @@ -120951,13 +124184,12 @@ 3355850752,3355852799,CW 3355852800,3355856639,CL 3355856640,3355856895,PA -3355856896,3355858943,EC 3355860992,3355869183,CL 3355869184,3355870719,BR 3355870720,3355871231,CR 3355871232,3355873279,BR 3355873280,3355875327,BQ -3355875328,3355877375,MX +3355875328,3355877375,PA 3355877376,3355885567,CO 3355885568,3355901951,GT 3355901952,3355902975,BR @@ -120975,7 +124207,8 @@ 3355928064,3355928575,CA 3355928576,3355929087,GB 3355929088,3355929599,US -3355929600,3355930623,PA +3355929600,3355930367,PA +3355930368,3355930623,HK 3355930624,3355934719,BR 3355934720,3355939839,AR 3355939840,3355940863,SR @@ -120989,7 +124222,7 @@ 3356033792,3356034047,CL 3356034048,3356035071,PY 3356035072,3356037119,MX -3356037120,3356041215,CO +3356037120,3356041215,BR 3356041216,3356049407,CR 3356049408,3356049663,CL 3356049664,3356051455,BR @@ -121007,11 +124240,11 @@ 3356057856,3356059135,CL 3356059136,3356060671,BR 3356060672,3356061695,CL -3356061696,3356062463,BR +3356061696,3356062207,BR +3356062208,3356062463,CL 3356062464,3356062719,JM 3356062720,3356063743,CR -3356063744,3356063999,HN -3356064000,3356064255,BR +3356063744,3356064255,HN 3356064256,3356064511,CL 3356064512,3356065791,BR 3356065792,3356066047,CL @@ -121026,15 +124259,13 @@ 3356073472,3356073983,CO 3356073984,3356075263,BR 3356075264,3356076287,BO -3356076288,3356077055,BR -3356077056,3356077567,MX +3356076288,3356076543,AR +3356076544,3356077567,MX 3356077568,3356078079,BR 3356078080,3356078335,EC 3356078336,3356079359,CL 3356079360,3356079615,AR -3356079616,3356080127,MX -3356080128,3356080383,BR -3356080384,3356080639,MX +3356079616,3356080639,MX 3356080640,3356080895,BR 3356080896,3356082431,NI 3356082432,3356082687,CL @@ -121054,18 +124285,18 @@ 3356089088,3356089343,AR 3356089344,3356090623,BR 3356090624,3356090879,CL -3356090880,3356091135,BR -3356091136,3356091391,AR +3356090880,3356091391,AR 3356091392,3356091647,CL -3356091648,3356091903,BR -3356091904,3356092927,CL -3356092928,3356093183,BR +3356091648,3356091903,AR +3356091904,3356093183,CL 3356093184,3356093951,AR 3356093952,3356094975,CL 3356094976,3356096255,AR 3356096256,3356096511,CL 3356096512,3356096767,EC -3356096768,3356097791,BR +3356096768,3356097023,BR +3356097024,3356097535,CL +3356097536,3356097791,BR 3356097792,3356098303,AR 3356098304,3356098559,GT 3356098560,3356099583,CL @@ -121074,31 +124305,17 @@ 3356102400,3356102655,PA 3356102656,3356105727,CL 3356105728,3356106751,SV -3356106752,3356107263,HN -3356107264,3356107327,BR -3356107328,3356107519,HN -3356107520,3356107551,BR -3356107552,3356107975,HN -3356107976,3356107983,IS -3356107984,3356108063,HN -3356108064,3356108071,IT -3356108072,3356109119,HN -3356109120,3356109135,FR -3356109136,3356109263,HN -3356109264,3356109271,DE -3356109272,3356109495,HN -3356109496,3356109503,IT -3356109504,3356109687,HN -3356109688,3356109695,CA -3356109696,3356110527,HN -3356110528,3356110543,US -3356110544,3356110847,HN +3356106752,3356110495,HN +3356110496,3356110503,US +3356110504,3356110847,HN 3356110848,3356113919,BR 3356113920,3356114943,UY 3356114944,3356123135,PE 3356123136,3356131839,AR 3356131840,3356132351,PE -3356132352,3356134143,BR +3356132352,3356133375,BR +3356133376,3356133887,CO +3356133888,3356134143,BR 3356134144,3356134655,AR 3356134656,3356134911,PY 3356134912,3356135167,DO @@ -121108,11 +124325,10 @@ 3356135936,3356136191,BR 3356136192,3356137471,EC 3356137472,3356137727,JM -3356137728,3356137983,BR +3356137728,3356137983,HN 3356137984,3356138239,CO 3356138240,3356138495,US -3356138496,3356138751,BR -3356138752,3356139007,BO +3356138496,3356139007,BO 3356139008,3356139263,CL 3356139264,3356139519,BR 3356139520,3356139775,US @@ -121125,7 +124341,8 @@ 3356142848,3356143103,GT 3356143104,3356143615,CO 3356143616,3356144127,CR -3356144128,3356145151,BR +3356144128,3356144639,BR +3356144640,3356145151,AR 3356145152,3356145407,CL 3356145408,3356145663,BR 3356145664,3356145919,CL @@ -121150,7 +124367,8 @@ 3356151296,3356151551,BR 3356151552,3356151807,AR 3356151808,3356152063,CL -3356152064,3356152575,BR +3356152064,3356152319,EC +3356152320,3356152575,MX 3356152576,3356152831,CL 3356152832,3356154623,MX 3356154624,3356154879,AR @@ -121176,16 +124394,12 @@ 3356171520,3356171775,AR 3356171776,3356172031,NI 3356172032,3356172287,SV -3356172288,3356172543,PE -3356172544,3356172799,AR -3356172800,3356174335,PE +3356172288,3356174335,PE 3356174336,3356176383,CO 3356176384,3356180479,PE 3356180480,3356190719,CL -3356190720,3356192767,DO 3356192768,3356194815,AR -3356196864,3356213247,KY -3356213248,3356229631,VE +3356196864,3356229631,VE 3356229632,3356233727,BR 3356233728,3356237823,CL 3356237824,3356246015,GT @@ -121198,7 +124412,6 @@ 3356265472,3356267007,CL 3356267008,3356267263,PY 3356267264,3356268799,CL -3356268800,3356269055,PA 3356269056,3356269311,AR 3356269312,3356269823,UY 3356269824,3356270079,BR @@ -121247,14 +124460,8 @@ 3356332032,3356334079,CU 3356334080,3356336127,BO 3356336128,3356336895,SV -3356336896,3356338175,HN -3356338176,3356339967,SV -3356339968,3356341247,HN -3356341248,3356341503,SV -3356341504,3356342271,HN -3356342272,3356343039,SV -3356343040,3356343551,HN -3356343552,3356344319,SV +3356336896,3356337151,HN +3356337152,3356344319,SV 3356344320,3356360703,CO 3356360704,3356362751,CL 3356362752,3356363519,VE @@ -121273,7 +124480,6 @@ 3356380160,3356380927,CL 3356380928,3356381183,DO 3356381184,3356381439,CL -3356381440,3356381695,PA 3356381696,3356381951,CL 3356381952,3356382207,EC 3356382208,3356389375,CL @@ -121282,17 +124488,15 @@ 3356390400,3356390655,AR 3356390656,3356391167,CL 3356391168,3356391423,PA -3356393472,3356413439,CL -3356413440,3356413951,CO -3356413952,3356419839,CL -3356419840,3356419967,CO -3356419968,3356420863,CL -3356420864,3356421375,CO -3356421376,3356421503,CL -3356421504,3356422143,CO -3356422144,3356425471,CL -3356425472,3356425599,CO -3356425600,3356426239,CL +3356393472,3356413567,CL +3356413568,3356413823,CO +3356413824,3356420287,CL +3356420288,3356420351,CO +3356420352,3356420863,CL +3356420864,3356420991,CO +3356420992,3356421119,CL +3356421120,3356421247,CO +3356421248,3356426239,CL 3356426240,3356427263,BR 3356427264,3356491775,US 3356491776,3356493823,PE @@ -121301,9 +124505,8 @@ 3356499968,3356508159,MX 3356508160,3356508671,AR 3356508672,3356509183,CR -3356509184,3356509439,VE -3356509440,3356509503,US -3356509504,3356510207,VE +3356509184,3356509695,CO +3356509696,3356510207,VE 3356510208,3356511999,AR 3356512000,3356512255,CO 3356512256,3356514303,AR @@ -121370,7 +124573,7 @@ 3357190144,3357192191,DO 3357192192,3357194239,PY 3357194240,3357196287,AR -3357196288,3357212671,CW +3357196288,3357204479,CW 3357212672,3357368319,CL 3357368320,3357376511,CO 3357376512,3357403135,CL @@ -121403,160 +124606,40 @@ 3357424640,3357425663,CL 3357425664,3357442047,CO 3357442048,3357442303,NI -3357442304,3357442319,GT -3357442320,3357442327,HN -3357442328,3357442335,GT -3357442336,3357442343,HN -3357442344,3357442391,GT -3357442392,3357442395,HN -3357442396,3357442559,GT -3357442560,3357442815,NI -3357442816,3357443071,SV -3357443072,3357443327,NI -3357443328,3357443583,GT -3357443584,3357444351,HN -3357444352,3357444479,GT -3357444480,3357444487,HN -3357444488,3357444607,GT -3357444608,3357444863,SV -3357444864,3357448407,GT -3357448408,3357448415,SV -3357448416,3357448447,GT -3357448448,3357448703,SV -3357448704,3357448959,GT -3357448960,3357449727,HN -3357449728,3357450751,GT -3357450752,3357451007,SV -3357451008,3357451119,GT -3357451120,3357451127,HN -3357451128,3357451143,GT -3357451144,3357451151,HN -3357451152,3357451263,GT -3357451264,3357451519,HN -3357451520,3357451775,NI -3357451776,3357452287,GT -3357452288,3357452799,HN -3357452800,3357453055,NI -3357453056,3357453071,GT -3357453072,3357453079,SV -3357453080,3357453135,GT -3357453136,3357453151,SV -3357453152,3357453311,GT +3357442304,3357449471,GT +3357449472,3357449727,HN +3357449728,3357453311,GT 3357453312,3357453567,HN -3357453568,3357454591,GT -3357454592,3357454847,NI -3357454848,3357455103,HN -3357455104,3357455359,SV -3357455360,3357455871,GT +3357453568,3357455871,GT 3357455872,3357456127,NI -3357456128,3357456639,GT -3357456640,3357456895,HN -3357456896,3357457711,GT -3357457712,3357457727,CR -3357457728,3357457919,GT -3357457920,3357458047,HN -3357458048,3357458431,GT +3357456128,3357457919,GT +3357457920,3357458431,HN 3357458432,3357474815,CL -3357474816,3357475015,US -3357475016,3357475019,AR -3357475020,3357475071,US -3357475072,3357475887,AR -3357475888,3357475903,VE -3357475904,3357475999,AR -3357476000,3357476015,VE -3357476016,3357476031,AR -3357476032,3357476047,VE -3357476048,3357476071,AR -3357476072,3357476079,VE -3357476080,3357476255,AR -3357476256,3357476271,VE -3357476272,3357476287,AR -3357476288,3357476351,VE -3357476352,3357476479,AR -3357476480,3357476607,EC -3357476608,3357476687,AR -3357476688,3357476703,US -3357476704,3357476735,AR -3357476736,3357476799,US -3357476800,3357476863,AR +3357474816,3357475071,US +3357475072,3357476863,AR 3357476864,3357477375,EC -3357477376,3357477423,AR -3357477424,3357477431,EC -3357477432,3357477543,AR -3357477544,3357477551,EC -3357477552,3357477887,AR +3357477376,3357477887,AR 3357477888,3357478911,CO -3357478912,3357479063,AR -3357479064,3357479071,CO -3357479072,3357479087,AR -3357479088,3357479095,CO -3357479096,3357479135,AR -3357479136,3357479151,CO -3357479152,3357479183,AR -3357479184,3357479191,CO -3357479192,3357479215,AR -3357479216,3357479223,CO -3357479224,3357479551,AR -3357479552,3357479679,CO -3357479680,3357479863,AR -3357479864,3357479867,CO -3357479868,3357479871,AR -3357479872,3357479879,CO -3357479880,3357480031,AR -3357480032,3357480039,CO -3357480040,3357480103,AR -3357480104,3357480111,CO -3357480112,3357480159,AR -3357480160,3357480175,CO -3357480176,3357480335,AR -3357480336,3357480343,CO -3357480344,3357480359,AR -3357480360,3357480367,CO -3357480368,3357480407,AR -3357480408,3357480415,CO -3357480416,3357480463,AR -3357480464,3357480479,CO -3357480480,3357480511,AR -3357480512,3357480543,CO -3357480544,3357480703,AR -3357480704,3357480711,CO -3357480712,3357480719,AR -3357480720,3357480735,CO -3357480736,3357480751,AR -3357480752,3357480767,CO -3357480768,3357480799,AR -3357480800,3357480807,CO -3357480808,3357480959,AR -3357480960,3357483007,EC +3357478912,3357480423,AR +3357480424,3357480427,CO +3357480428,3357482591,AR +3357482592,3357482623,EC +3357482624,3357482865,AR +3357482866,3357482866,EC +3357482867,3357483007,AR 3357483008,3357491199,CL 3357491200,3357499391,CO 3357499392,3357507583,PE 3357507584,3357515775,VE 3357515776,3357523967,SV 3357523968,3357532159,CO -3357532160,3357556735,AR -3357556736,3357556991,VE -3357556992,3357557759,MX -3357557760,3357559295,EC -3357559296,3357559551,CA -3357559552,3357559807,US -3357559808,3357559935,AR -3357559936,3357560063,VE -3357560064,3357560159,AR -3357560160,3357560167,VE -3357560168,3357560175,AR -3357560176,3357560183,VE -3357560184,3357560199,AR -3357560200,3357560207,VE -3357560208,3357560247,AR -3357560248,3357560255,VE -3357560256,3357560263,AR -3357560264,3357560271,VE -3357560272,3357560319,AR -3357560320,3357560575,MX -3357560576,3357560831,US -3357560832,3357561855,CO -3357561856,3357581311,AR +3357532160,3357556991,AR +3357556992,3357557247,MX +3357557248,3357561199,AR +3357561200,3357561215,CO +3357561216,3357561247,AR +3357561248,3357561279,CO +3357561280,3357581311,AR 3357581312,3357589503,CL 3357589504,3357605887,BZ 3357605888,3357606911,MX @@ -121609,21 +124692,12 @@ 3357728768,3357736959,BR 3357736960,3357745151,VE 3357745152,3357753343,CO -3357753344,3357757487,VE -3357757488,3357757495,BO -3357757496,3357773823,VE -3357773824,3357775871,PA +3357753344,3357773823,VE 3357775872,3357776127,US 3357776128,3357776383,UY 3357776384,3357776895,US 3357776896,3357777919,CL -3357777920,3357778415,GT -3357778416,3357778423,SV -3357778424,3357784319,GT -3357784320,3357784335,SV -3357784336,3357784503,GT -3357784504,3357784511,SV -3357784512,3357786111,GT +3357777920,3357786111,GT 3357786112,3357802495,VE 3357802496,3357868031,MX 3357868032,3357933567,PE @@ -121632,156 +124706,75 @@ 3358023680,3358064639,MX 3358064640,3358130175,UY 3358130176,3358131199,EC -3358131200,3358131327,AR -3358131328,3358131455,CO -3358131456,3358131839,AR -3358131840,3358131967,CO -3358131968,3358131983,AR -3358131984,3358132031,CO -3358132032,3358132087,AR -3358132088,3358132095,CO -3358132096,3358132127,AR -3358132128,3358132135,CO -3358132136,3358132607,AR -3358132608,3358132735,CO -3358132736,3358132975,AR -3358132976,3358133119,EC -3358133120,3358133247,AR -3358133248,3358133759,VE -3358133760,3358142719,AR -3358142720,3358142975,US -3358142976,3358143231,CO -3358143232,3358143487,VE -3358143488,3358143999,US -3358144000,3358144127,CL -3358144128,3358144255,AR -3358144256,3358144511,CL -3358144512,3358145023,VE -3358145024,3358149695,AR -3358149696,3358149703,CO -3358149704,3358149719,AR -3358149720,3358149727,CO -3358149728,3358150015,AR -3358150016,3358150143,CO -3358150144,3358150423,AR -3358150424,3358150431,CO -3358150432,3358150479,AR -3358150480,3358150655,CO -3358150656,3358150911,EC -3358150912,3358151039,AR -3358151040,3358151167,EC -3358151168,3358151263,AR -3358151264,3358151271,EC -3358151272,3358151423,AR -3358151424,3358151679,EC -3358151680,3358152703,PE -3358152704,3358152959,US -3358152960,3358153215,EC -3358153216,3358153279,AR -3358153280,3358153311,US -3358153312,3358153343,AR -3358153344,3358153535,US -3358153536,3358153599,AR -3358153600,3358153663,PR -3358153664,3358153703,AR -3358153704,3358153711,PR -3358153712,3358153727,AR -3358153728,3358153983,EC -3358153984,3358154239,US -3358154240,3358154751,CL -3358154752,3358158847,PE -3358158848,3358159159,AR -3358159160,3358159167,US -3358159168,3358159359,AR -3358159360,3358159615,EC -3358159616,3358159871,US +3358131200,3358144639,AR +3358144640,3358144767,VE +3358144768,3358154495,AR +3358154496,3358154751,CL +3358154752,3358158079,AR +3358158080,3358158207,PE +3358158208,3358158335,AR +3358158336,3358158591,PE +3358158592,3358159871,AR 3358159872,3358160895,VE 3358160896,3358236671,AR 3358236672,3358244863,CL 3358244864,3358261247,DO -3358261248,3358264063,AR -3358264064,3358264319,PY -3358264320,3358326783,AR +3358261248,3358326783,AR 3358326784,3358392319,VE 3358392320,3358457855,AR -3358457856,3358523391,PA -3358523392,3358523903,VE -3358523904,3358526463,AR -3358526464,3358527487,VE -3358527488,3358530815,AR -3358530816,3358530943,VE -3358530944,3358531071,AR -3358531072,3358531583,VE -3358531584,3358531839,AR -3358531840,3358532351,VE -3358532352,3358532863,AR -3358532864,3358533631,VE -3358533632,3358533887,AR -3358533888,3358534399,VE -3358534400,3358538751,AR -3358538752,3358539519,VE -3358539520,3358543615,AR -3358543616,3358543871,VE -3358543872,3358544127,MX +3358457856,3358482175,PA +3358482176,3358482431,BZ +3358482432,3358523391,PA +3358523392,3358523903,AR +3358523904,3358525951,VE +3358525952,3358526719,AR +3358526720,3358527487,VE +3358527488,3358530047,AR +3358530048,3358530303,VE +3358530304,3358530815,AR +3358530816,3358534143,VE +3358534144,3358534655,AR +3358534656,3358535167,VE +3358535168,3358535679,AR +3358535680,3358536447,VE +3358536448,3358536703,AR +3358536704,3358543359,VE +3358543360,3358543615,AR +3358543616,3358544127,VE 3358544128,3358544383,AR -3358544384,3358545407,VE -3358545408,3358547967,AR -3358547968,3358548223,VE -3358548224,3358548479,AR -3358548480,3358548623,VE +3358544384,3358545919,VE +3358545920,3358547967,AR +3358547968,3358548623,VE 3358548624,3358548639,AR -3358548640,3358549759,VE -3358549760,3358553855,AR -3358553856,3358554879,VE -3358554880,3358555135,AR -3358555136,3358556159,VE -3358556160,3358558463,AR -3358558464,3358558591,PY -3358558592,3358559231,AR -3358559232,3358560255,VE -3358560256,3358561791,AR -3358561792,3358562303,VE -3358562304,3358562399,AR -3358562400,3358562407,PE -3358562408,3358563327,AR -3358563328,3358564095,CO -3358564096,3358564351,MX -3358564352,3358566975,AR -3358566976,3358567103,VE -3358567104,3358567167,AR -3358567168,3358567231,VE -3358567232,3358567263,AR -3358567264,3358567327,VE -3358567328,3358567343,AR -3358567344,3358567375,VE -3358567376,3358567391,AR -3358567392,3358567407,VE -3358567408,3358567423,AR -3358567424,3358568959,CO -3358568960,3358569471,AR -3358569472,3358570495,VE -3358570496,3358570751,MX -3358570752,3358571263,PE -3358571264,3358572543,MX -3358572544,3358577151,AR -3358577152,3358577407,PE -3358577408,3358578431,AR -3358578432,3358578687,VE -3358578688,3358579967,CO -3358579968,3358587903,AR -3358587904,3358588927,CL +3358548640,3358550015,VE +3358550016,3358552063,AR +3358552064,3358553087,VE +3358553088,3358553599,AR +3358553600,3358554111,VE +3358554112,3358560767,AR +3358560768,3358562303,VE +3358562304,3358563327,AR +3358563328,3358564095,VE +3358564096,3358564351,AR +3358564352,3358565375,VE +3358565376,3358566399,AR +3358566400,3358566911,VE +3358566912,3358567423,AR +3358567424,3358568447,CO +3358568448,3358570495,VE +3358570496,3358578687,AR +3358578688,3358579711,CO +3358579712,3358580735,VE +3358580736,3358584831,AR +3358584832,3358586879,VE +3358586880,3358587903,AR +3358587904,3358588927,VE 3358588928,3358654463,PE 3358654464,3358658559,AR 3358658560,3358660607,CL 3358660608,3358662655,AR -3358662656,3358666751,BR -3358666752,3358667663,AR -3358667664,3358667671,BR -3358667672,3358668031,AR -3358668032,3358668287,BR -3358668288,3358668799,AR -3358668800,3358669055,BR -3358669056,3358695423,AR +3358662656,3358670847,BR +3358670848,3358695423,AR 3358695424,3358703615,GT 3358703616,3358715903,AR 3358715904,3358717951,EC @@ -121797,7 +124790,6 @@ 3358752768,3358756863,BB 3358756864,3358760959,CL 3358760960,3358769151,AR -3358769152,3358777343,HT 3358777344,3358779391,CR 3358779392,3358781439,EC 3358781440,3358851071,AR @@ -121805,8 +124797,8 @@ 3358855168,3358859263,BR 3358859264,3358887935,MX 3358887936,3358892031,HN -3358892032,3358918655,MX -3358918656,3358924799,BR +3358892032,3358916607,MX +3358916608,3358924799,BR 3358924800,3358965759,MX 3358965760,3358973951,BR 3358973952,3358982143,MX @@ -121815,10 +124807,7 @@ 3359080448,3359096831,CU 3359096832,3359105023,CL 3359105024,3359109119,EC -3359109120,3359109375,US -3359109376,3359110079,AR -3359110080,3359110143,GB -3359110144,3359111167,AR +3359109120,3359111167,AR 3359111168,3359113215,EC 3359113216,3359244287,MX 3359244288,3359260671,US @@ -121834,17 +124823,9 @@ 3359318016,3359356927,AR 3359356928,3359357951,VE 3359357952,3359358975,US -3359358976,3359363071,AR -3359363072,3359367167,PA -3359367168,3359375359,AR +3359358976,3359375359,AR 3359375360,3359440895,PE -3359440896,3359461951,AR -3359461952,3359462015,HN -3359462016,3359462271,AR -3359462272,3359462335,UY -3359462336,3359463399,AR -3359463400,3359463407,CO -3359463408,3359463679,AR +3359440896,3359463679,AR 3359463680,3359463743,HN 3359463744,3359477759,AR 3359477760,3359478015,UY @@ -121877,56 +124858,38 @@ 3359598592,3359599615,EC 3359599616,3359621119,AR 3359621120,3359637503,EC -3359637504,3359789583,MX -3359789584,3359789599,US -3359789600,3359789823,MX -3359789824,3359789887,US -3359789888,3359797247,MX +3359637504,3359797247,MX 3359797248,3359801343,BR 3359801344,3359899647,MX 3359899648,3359916031,CL 3359916032,3359932415,AR 3359932416,3359948799,MX -3359948800,3359989247,AR -3359989248,3359989503,US -3359989504,3359989759,AR +3359948800,3359989759,AR 3359989760,3359997951,CO 3359997952,3360006143,AR 3360006144,3360014335,EC 3360014336,3360096255,AR 3360096256,3360104447,UY -3360104448,3360116735,CO +3360104448,3360112639,CO +3360112640,3360116735,BR 3360116736,3360118783,BO 3360118784,3360120831,AR -3360120832,3360124927,CO 3360124928,3360125439,US 3360125440,3360125951,VE 3360125952,3360127999,BR -3360128000,3360128319,HN -3360128320,3360128327,IT -3360128328,3360128543,HN -3360128544,3360128575,US -3360128576,3360129023,HN +3360128000,3360128775,HN +3360128776,3360128783,BE +3360128784,3360129023,HN 3360129024,3360145407,VE 3360145408,3360153599,CL 3360153600,3360157695,AR 3360157696,3360159743,VE 3360159744,3360161791,BQ -3360161792,3360229007,CL -3360229008,3360229012,US -3360229013,3360229013,CL -3360229014,3360229023,US -3360229024,3360231775,CL -3360231776,3360231807,US -3360231808,3360246783,CL -3360246784,3360247039,AR -3360247040,3360251903,CL +3360161792,3360251903,CL 3360251904,3360253951,BO 3360253952,3360255999,SV 3360256000,3360260095,CL -3360260096,3360260351,AR -3360260352,3360260607,US -3360260608,3360276479,AR +3360260096,3360276479,AR 3360276480,3360278527,VE 3360278528,3360280575,EC 3360280576,3360282623,CL @@ -121936,9 +124899,7 @@ 3360342016,3360354303,VE 3360354304,3360356351,PA 3360356352,3360358399,CR -3360358400,3360358911,CL -3360358912,3360358919,CO -3360358920,3360366591,CL +3360358400,3360366591,CL 3360366592,3360382975,CO 3360382976,3360399359,VE 3360399360,3360403455,BO @@ -121954,49 +124915,13 @@ 3360669696,3360686079,MX 3360686080,3360698367,AR 3360698368,3360699135,UY -3360699136,3360705535,AR -3360705536,3360705791,US -3360705792,3360707071,AR -3360707072,3360707327,US -3360707328,3360707583,AR -3360707584,3360708095,US -3360708096,3360708223,AR -3360708224,3360708351,US -3360708352,3360708479,AR -3360708480,3360708863,US -3360708864,3360708991,AR -3360708992,3360709247,US -3360709248,3360709631,AR -3360709632,3360709759,US -3360709760,3360710271,AR -3360710272,3360710399,US -3360710400,3360710527,AR -3360710528,3360710655,US +3360699136,3360710655,AR 3360710656,3360718847,HT 3360718848,3360763903,AR -3360763904,3360765951,GT 3360765952,3360767999,CO -3360768000,3360772351,AR -3360772352,3360772479,BO -3360772480,3360780303,AR -3360780304,3360780319,BR -3360780320,3360780399,AR -3360780400,3360780415,BR -3360780416,3360780991,AR -3360780992,3360780995,BR -3360780996,3360781055,AR -3360781056,3360781071,BR -3360781072,3360781791,AR -3360781792,3360781795,MX -3360781796,3360781839,AR -3360781840,3360781847,DO -3360781848,3360781943,AR -3360781944,3360781947,MX -3360781948,3360782167,AR -3360782168,3360782175,MX -3360782176,3360782239,AR -3360782240,3360782247,MX -3360782248,3360788479,AR +3360768000,3360781599,AR +3360781600,3360781615,BS +3360781616,3360788479,AR 3360788480,3360790527,CL 3360790528,3360849919,AR 3360849920,3360882687,VE @@ -122008,7 +124933,9 @@ 3361030144,3361034239,VE 3361034240,3361036287,EC 3361036288,3361046527,AR -3361046528,3361052671,BO +3361046528,3361048575,BO +3361048576,3361049599,AR +3361049600,3361052671,BO 3361052672,3361054463,AR 3361054464,3361054719,PE 3361054720,3361058815,NI @@ -122052,28 +124979,7 @@ 3361726464,3361734655,MX 3361734656,3362258943,BR 3362258944,3362324479,CL -3362324480,3362324735,AR -3362324736,3362324991,US -3362324992,3362326015,AR -3362326016,3362326271,US -3362326272,3362327039,AR -3362327040,3362327551,US -3362327552,3362328063,AR -3362328064,3362328575,US -3362328576,3362337279,AR -3362337280,3362338047,US -3362338048,3362338559,AR -3362338560,3362338815,US -3362338816,3362339327,AR -3362339328,3362339583,US -3362339584,3362342143,AR -3362342144,3362342399,PA -3362342400,3362343423,AR -3362343424,3362343679,US -3362343680,3362344447,AR -3362344448,3362344959,US -3362344960,3362348799,AR -3362348800,3362349055,US +3362324480,3362349055,AR 3362349056,3362351103,CR 3362351104,3362353151,AR 3362353152,3362355199,EC @@ -122081,15 +124987,14 @@ 3362357248,3362381823,BO 3362381824,3362390015,EC 3362390016,3362422783,PE -3362422784,3362426879,CO -3362426880,3362428927,PA +3362426880,3362428927,BR 3362428928,3362430975,CL 3362430976,3362447359,CO -3362447360,3362448895,HN -3362448896,3362449151,SV -3362449152,3362449407,HN -3362449408,3362450175,SV -3362450176,3362451455,HN +3362447360,3362448383,SV +3362448384,3362448895,HN +3362448896,3362450175,SV +3362450176,3362450431,HN +3362450432,3362451455,SV 3362451456,3362452479,AR 3362452480,3362452991,BO 3362452992,3362453247,HN @@ -122115,19 +125020,9 @@ 3362529280,3362537471,PA 3362537472,3362545663,AR 3362545664,3362549759,PE -3362549760,3362551871,AR -3362551872,3362551887,MX -3362551888,3362552143,AR -3362552144,3362552159,PR -3362552160,3362552431,AR -3362552432,3362552447,MX -3362552448,3362553023,AR -3362553024,3362553039,PR -3362553040,3362553167,AR -3362553168,3362553183,DO -3362553184,3362553247,AR -3362553248,3362553263,CO -3362553264,3362553855,AR +3362549760,3362552575,AR +3362552576,3362552591,MX +3362552592,3362553855,AR 3362553856,3362557951,PY 3362557952,3362562047,AR 3362570240,3362586623,UY @@ -122149,17 +125044,13 @@ 3362711552,3362713599,EC 3362713600,3362714623,VE 3362714624,3362714879,HN -3362714880,3362716415,VE -3362716416,3362716671,CR -3362716672,3362717695,VE +3362714880,3362717695,VE 3362717696,3362815999,CL 3362816000,3362832383,AR 3362832384,3362838527,CO 3362838528,3362840575,EC 3362840576,3362897919,CL -3362897920,3362903551,HT -3362903552,3362904063,MX -3362904064,3362914303,HT +3362897920,3362914303,HT 3362914304,3362930687,CO 3362930688,3362934783,CL 3362934784,3362936831,AR @@ -122176,9 +125067,7 @@ 3362992128,3362996223,AR 3362996224,3363000319,UY 3363000320,3363004415,AR -3363012608,3363013967,PA -3363013968,3363013975,NI -3363013976,3363024895,PA +3363012608,3363024895,PA 3363024896,3363025151,HN 3363025152,3363025407,PA 3363025408,3363025663,CO @@ -122200,15 +125089,11 @@ 3363471360,3363487743,CR 3363487744,3363504127,CO 3363504128,3363512319,PE -3363512320,3363554047,AR -3363554048,3363554175,US -3363554176,3363554303,AR -3363554304,3363554431,BR -3363554432,3363554943,AR -3363554944,3363555327,US -3363555328,3363555839,AR -3363555840,3363556607,US -3363556608,3363557375,AR +3363512320,3363553919,AR +3363553920,3363554047,US +3363554048,3363554175,AR +3363554176,3363554303,US +3363554304,3363557375,AR 3363557376,3363559423,BZ 3363559424,3363561471,AR 3363565568,3363569663,AR @@ -122222,45 +125107,35 @@ 3363601920,3363602175,AR 3363602176,3363602431,PA 3363602432,3363610623,CW -3363614720,3363617791,AR -3363617792,3363618815,PE +3363614720,3363618815,AR 3363618816,3363627007,UY 3363627008,3363635199,EC 3363635200,3363651583,UY 3363651584,3363667967,AR 3363667968,3363676159,EC 3363676160,3363678207,TT -3363680256,3363682303,GT 3363682304,3363684351,VE 3363684352,3363708927,EC 3363708928,3363713023,CL 3363713024,3363713279,EC 3363713280,3363714047,CL -3363714048,3363715583,PE -3363715584,3363715839,CL -3363715840,3363716607,PE -3363716608,3363716863,AR -3363716864,3363717119,PE +3363714048,3363715839,PE +3363715840,3363716095,CL +3363716096,3363717119,PE 3363717120,3363733503,CL 3363733504,3363831807,AR 3363831808,3367763967,BR -3367763968,3367774207,MX -3367774208,3367776255,BR -3367776256,3367788543,MX -3367788544,3367796735,BR -3367796736,3367804927,MX +3367763968,3367804927,MX 3367804928,3367840767,BR -3367840768,3367841023,HN -3367841024,3367841039,CA -3367841040,3367841407,HN -3367841408,3367841423,CA -3367841424,3367841791,HN +3367840768,3367841791,HN 3367841792,3368052991,BR 3368052992,3368053247,PE 3368053248,3368053503,CO 3368053504,3368086527,BR 3368086528,3368087551,CR -3368087552,3368601799,BR +3368087552,3368157183,BR +3368157184,3368173567,MX +3368173568,3368601799,BR 3368601801,3370188799,BR 3370188800,3370196991,MX 3370196992,3370214399,BR @@ -122274,21 +125149,22 @@ 3370507264,3370512383,BR 3370514432,3370515455,BR 3370515456,3370516479,AR -3370516480,3371106303,BR +3370516480,3370926079,BR +3370926080,3370942463,MX +3370942464,3371106303,BR 3371106304,3371122687,MX 3371122688,3378511871,BR 3378511872,3380506879,MX 3380506880,3380507135,BR 3380507136,3380744191,MX +3380744192,3380745215,CO 3380745216,3380746239,BR 3380746240,3380747263,PE 3380747264,3380748287,BR 3380748288,3380761087,MX 3380761088,3380761599,VE 3380761600,3380764671,BR -3380764672,3380808191,MX -3380808192,3380808703,CR -3380808704,3380811775,MX +3380764672,3380811775,MX 3380811776,3380813823,BR 3380813824,3380815103,MX 3380815104,3380815359,CR @@ -122305,7 +125181,8 @@ 3380818176,3380818431,PA 3380818432,3380818687,DO 3380818688,3380818943,PY -3380818944,3380822527,MX +3380818944,3380822015,MX +3380822272,3380822527,MX 3380822528,3380822783,NI 3380822784,3380823039,PE 3380823040,3380824063,BR @@ -122317,7 +125194,6 @@ 3380825600,3380825855,CO 3380825856,3380826111,AR 3380826112,3380828159,BR -3380828160,3380828671,MX 3380828672,3380829183,CO 3380829184,3380830207,BR 3380830208,3380830463,MX @@ -122325,7 +125201,7 @@ 3380830720,3380831231,PA 3380831232,3380831743,MX 3380831744,3380831999,AR -3380832000,3380832255,SR +3380832000,3380832255,BR 3380832256,3380832767,MX 3380832768,3380833279,DO 3380833280,3380833791,MX @@ -122362,8 +125238,8 @@ 3381387264,3381448703,MX 3381448704,3381452799,BR 3381452800,3381453823,AR -3381453824,3381455871,BR -3381455872,3381456895,US +3381453824,3381456383,BR +3381456384,3381456895,US 3381456896,3381460991,BR 3381460992,3381944319,MX 3381944320,3381946367,BR @@ -122371,9 +125247,9 @@ 3381947392,3381952511,BR 3381952512,3381960703,MX 3381960704,3381962751,BR -3381962752,3381963559,HN -3381963560,3381963567,FR -3381963568,3381963775,HN +3381962752,3381963711,HN +3381963712,3381963727,CA +3381963728,3381963775,HN 3381963776,3381968895,BR 3381968896,3381972991,MX 3381972992,3381974015,BR @@ -122411,7 +125287,8 @@ 3382587392,3382588415,HN 3382588416,3382589439,PE 3382589440,3382591487,BR -3382591488,3382602751,MX +3382591488,3382599679,MX +3382601728,3382602751,MX 3382602752,3382603775,BR 3382603776,3382605823,MX 3382605824,3382607871,AR @@ -122427,17 +125304,12 @@ 3382661120,3382662143,MX 3382662144,3382665215,BR 3382665216,3382669311,MX -3382669312,3382669567,SV -3382669568,3382669823,GT -3382669824,3382670079,HN -3382670080,3382670335,GT +3382669312,3382670335,GT 3382670336,3382672383,BR 3382672384,3382677503,MX 3382677504,3382681599,BR -3382681600,3382683647,MX 3382683648,3382685695,CL -3382685696,3382686655,MX -3382686656,3382686719,US +3382685696,3382686719,MX 3382686720,3382689791,BR 3382689792,3382695935,MX 3382695936,3382696959,AR @@ -122450,14 +125322,6 @@ 3383701504,3383705599,BR 3383705600,3383754751,MX 3383754752,3384147967,AR -3384147968,3384154879,US -3384154880,3384155135,HN -3384155136,3384156159,US -3384156160,3384160255,PA -3384160256,3384164351,US -3384164352,3384183807,PA -3384183808,3384184831,VE -3384184832,3384213503,PA 3384213504,3384279039,EC 3384279040,3384410111,CO 3384410112,3384672255,CL @@ -122469,7 +125333,6 @@ 3386114048,3386245119,AR 3386245120,3386376191,CL 3386376192,3386392575,CO -3386392576,3386408959,CW 3386408960,3386425343,GT 3386425344,3386441727,AR 3386441728,3386458111,PY @@ -122486,7 +125349,9 @@ 3386548224,3386556415,CR 3386556416,3386562047,PA 3386562048,3386562303,PE -3386562304,3386572799,PA +3386562304,3386571263,PA +3386571264,3386571519,BZ +3386571520,3386572799,PA 3386572800,3386589183,EC 3386589184,3386601471,AR 3386601472,3386605567,CO @@ -122530,7 +125395,6 @@ 3386769408,3386773503,VE 3386773504,3386774527,AR 3386774528,3386777599,BR -3386777600,3386781695,CW 3386781696,3386783743,PY 3386783744,3386784767,AR 3386784768,3386785791,GT @@ -122545,16 +125409,32 @@ 3387424768,3387502599,CO 3387502600,3387502607,JP 3387502608,3387555839,CO -3387555840,3387568127,AR -3387568128,3387572223,PE +3387555840,3387568879,AR +3387568880,3387568883,PE +3387568884,3387570673,AR +3387570674,3387570674,PE +3387570675,3387570847,AR +3387570848,3387570863,PE +3387570864,3387570943,AR +3387570944,3387571071,PE +3387571072,3387572223,AR 3387572224,3387576319,CO 3387576320,3387578367,EC 3387578368,3387584511,AR -3387584512,3387588607,PE -3387588608,3387600895,AR +3387584512,3387585535,PE +3387585536,3387600895,AR 3387600896,3387604991,CO -3387604992,3387613183,EC -3387613184,3387617279,VE +3387604992,3387609959,AR +3387609960,3387609967,EC +3387609968,3387611007,AR +3387611008,3387611135,EC +3387611136,3387613811,AR +3387613812,3387613812,VE +3387613813,3387613831,AR +3387613832,3387613839,VE +3387613840,3387615615,AR +3387615616,3387615743,VE +3387615744,3387617279,AR 3387617280,3387619327,CO 3387619328,3387686911,AR 3387686912,3387736063,CL @@ -122679,7 +125559,6 @@ 3389212672,3389213183,IN 3389213184,3389213439,AU 3389213440,3389213695,MY -3389213696,3389213951,US 3389213952,3389214207,IN 3389214208,3389214463,SG 3389214464,3389214719,AU @@ -123037,9 +125916,7 @@ 3389970432,3389971199,NZ 3389971200,3389971711,CN 3389971712,3389971967,AU -3389971968,3389972479,CN -3389972480,3389972735,US -3389972736,3389973503,CN +3389971968,3389973503,CN 3389973504,3389973759,NZ 3389973760,3389974271,AU 3389974272,3389974527,CN @@ -123155,9 +126032,7 @@ 3391192320,3391356927,JP 3391356928,3391414783,NZ 3391414784,3391415039,CN -3391415040,3391441407,NZ -3391441408,3391441663,PH -3391441664,3391444479,NZ +3391415040,3391444479,NZ 3391444480,3391444991,VN 3391444992,3391453183,NZ 3391453184,3391453439,ID @@ -123606,7 +126481,9 @@ 3391848448,3391848959,AU 3391848960,3391849471,IN 3391849472,3391851007,AU -3391851264,3391852543,AU +3391851008,3391851263,SG +3391851264,3391851519,JP +3391851520,3391852543,AU 3391852544,3391856639,CN 3391856640,3391864831,ID 3391864832,3391866879,TW @@ -123694,7 +126571,9 @@ 3392073728,3392077823,ID 3392077824,3392079871,AU 3392079872,3392086015,JP -3392086016,3392094207,AU +3392086016,3392089599,PK +3392089600,3392089855,AU +3392089856,3392094207,PK 3392094208,3392098559,ID 3392098560,3392098815,AU 3392098816,3392099327,CN @@ -123880,12 +126759,13 @@ 3392799488,3392799743,AU 3392799744,3392800767,JP 3392800768,3392802815,SG -3392802816,3392806911,JP +3392802816,3392805887,JP +3392805888,3392806911,HK 3392806912,3392815103,AU 3392815104,3392819199,ID 3392819200,3392823295,MY 3392823296,3392824319,KH -3392824320,3392824831,AU +3392824320,3392824575,AU 3392824832,3392825343,IN 3392825344,3392826367,CN 3392826368,3392827391,BD @@ -124575,7 +127455,8 @@ 3395059712,3395067903,PH 3395067904,3395076095,HK 3395076096,3395080191,ID -3395080192,3395084287,AU +3395080192,3395082239,AU +3395082240,3395084287,NZ 3395084288,3395088383,IN 3395088384,3395091455,AU 3395091456,3395093503,CN @@ -124624,6 +127505,8 @@ 3395182848,3395190783,SG 3395190784,3395198975,JP 3395198976,3395199999,IN +3395200000,3395200511,BD +3395200512,3395200767,TH 3395200768,3395201023,MY 3395201024,3395202047,TH 3395202048,3395203071,IN @@ -124663,8 +127546,7 @@ 3397027072,3397027327,PH 3397027328,3397027839,IN 3397027840,3397029887,JP -3397029888,3397031423,MY -3397031680,3397033983,MY +3397029888,3397033983,MY 3397033984,3397038079,ID 3397038080,3397058559,JP 3397058560,3397066751,MU @@ -124675,7 +127557,9 @@ 3397087232,3397088255,HK 3397088256,3397090303,CN 3397090304,3397091327,TW -3397091328,3397099519,GU +3397091328,3397093375,MP +3397093376,3397097471,GU +3397097472,3397099519,MP 3397099520,3397103615,HK 3397103616,3397105663,LA 3397105664,3397107711,JP @@ -124754,7 +127638,9 @@ 3397338040,3397338043,SG 3397338044,3397338375,HK 3397338376,3397338379,JP -3397338380,3397339647,HK +3397338380,3397338423,HK +3397338424,3397338427,JP +3397338428,3397339647,HK 3397339648,3397339687,SG 3397339688,3397340927,HK 3397340928,3397341183,TH @@ -124831,8 +127717,7 @@ 3397531648,3397532671,SG 3397532672,3397533695,JP 3397533696,3397551359,HK -3397551616,3397557247,HK -3397557252,3397557252,HK +3397551616,3397557279,HK 3397557504,3397566463,HK 3397566464,3397574655,AU 3397574656,3397582847,CN @@ -125204,7 +128089,8 @@ 3399827456,3399835647,AU 3399839744,3399841791,JP 3399841792,3399842815,HK -3399842816,3399843839,AU +3399842816,3399843583,AU +3399843584,3399843839,US 3399843840,3399852031,TW 3399852032,3399856127,JP 3399856128,3399860223,CN @@ -125241,7 +128127,9 @@ 3399995392,3399999487,KR 3399999488,3400000475,JP 3400000476,3400000479,US -3400000480,3400003583,JP +3400000480,3400002303,JP +3400002304,3400002367,HK +3400002368,3400003583,JP 3400003584,3400005631,AU 3400005632,3400006143,JP 3400006400,3400007679,JP @@ -125255,8 +128143,7 @@ 3400032256,3400040447,AU 3400040448,3400044543,CN 3400044544,3400045567,IN -3400045568,3400046591,HK -3400046592,3400047615,KR +3400045568,3400047615,HK 3400047616,3400048639,IN 3400048640,3400056831,CN 3400056832,3400060927,TW @@ -125394,7 +128281,9 @@ 3400648816,3400648831,HK 3400648832,3400649943,JP 3400649944,3400649951,HK -3400649952,3400650409,JP +3400649952,3400650143,JP +3400650144,3400650159,HK +3400650160,3400650409,JP 3400650410,3400650410,AU 3400650411,3400650751,JP 3400650752,3400654847,AU @@ -125425,7 +128314,6 @@ 3400849408,3400851455,MN 3400851456,3400859647,AU 3400859648,3400860671,HK -3400860672,3400861695,IN 3400861696,3400862719,CN 3400862720,3400864767,BD 3400864768,3400865791,AU @@ -125877,7 +128765,8 @@ 3406622720,3406623743,CN 3406623744,3406625023,AU 3406625024,3406625279,NF -3406625280,3406631423,AU +3406625280,3406625791,AU +3406626816,3406631423,AU 3406631424,3406631679,CN 3406631680,3406632959,AU 3406632960,3406633215,CN @@ -126068,7 +128957,7 @@ 3406976768,3406977023,CN 3406977024,3406980095,AU 3406980096,3406980607,CN -3406980608,3406981375,AU +3406980608,3406981119,AU 3406981376,3406981631,CN 3406981632,3406981887,AU 3406981888,3406982143,CN @@ -126258,7 +129147,7 @@ 3407258368,3407258623,CN 3407258624,3407259135,AU 3407259136,3407259391,CN -3407259392,3407260159,AU +3407259648,3407260159,AU 3407260160,3407260415,CN 3407260416,3407261695,AU 3407261696,3407263743,HK @@ -127114,9 +130003,8 @@ 3409871872,3409873663,AU 3409873664,3409873919,CN 3409873920,3409875967,AU -3409875968,3409876839,JP -3409876840,3409876847,AU -3409876848,3409876991,JP +3409875968,3409876735,JP +3409876736,3409876991,AU 3409876992,3409878015,TH 3409878016,3409879295,AU 3409879296,3409879551,CN @@ -127200,7 +130088,9 @@ 3410959360,3410959615,VN 3410959616,3410959871,ID 3410959872,3410960383,AU -3410960384,3410964479,GB +3410960384,3410960447,GB +3410960448,3410960463,SG +3410960464,3410964479,GB 3410964480,3410968575,JP 3410968576,3410984959,NZ 3410984960,3411017727,TW @@ -127929,7 +130819,9 @@ 3414409216,3414413311,JP 3414413312,3414417407,TH 3414417408,3414425599,HK -3414425600,3414433791,AU +3414425600,3414431743,AU +3414431744,3414432767,US +3414432768,3414433791,AU 3414433792,3414441983,CN 3414441984,3414450175,AU 3414450176,3414458367,JP @@ -127941,7 +130833,8 @@ 3414491136,3414523903,TW 3414523904,3414532095,JP 3414532096,3414540287,KR -3414540288,3414555647,JP +3414540288,3414554623,JP +3414554624,3414555647,AU 3414555648,3414556671,PK 3414556672,3414605823,AU 3414605824,3414616063,IN @@ -128157,7 +131050,8 @@ 3416710144,3416711167,HK 3416711168,3416719359,AU 3416719360,3416721407,PH -3416721408,3416723455,VN +3416721408,3416723199,VN +3416723200,3416723455,TW 3416723456,3416724479,KH 3416724480,3416725503,HK 3416725504,3416726527,AU @@ -128217,7 +131111,9 @@ 3416930816,3416931327,CN 3416931328,3416932351,IN 3416932352,3416936447,PK -3416936448,3416939007,AU +3416936448,3416937215,AU +3416937216,3416937471,HK +3416937472,3416939007,AU 3416939008,3416939519,HK 3416939520,3416940543,AU 3416940544,3416948735,KR @@ -128348,7 +131244,6 @@ 3418162688,3418163199,CN 3418163200,3418165247,PH 3418165248,3418167295,MY -3418167296,3418167551,IN 3418167552,3418167807,AU 3418167808,3418168319,HK 3418168320,3418169343,VN @@ -128548,7 +131443,11 @@ 3419529216,3419537407,CN 3419537408,3419541503,HK 3419541504,3419553791,KR -3419553792,3419557631,AU +3419553792,3419556095,AU +3419556096,3419556351,CN +3419556352,3419556607,AU +3419556608,3419556863,CN +3419556864,3419557631,AU 3419557888,3419558399,ID 3419558400,3419558655,AU 3419558656,3419559935,ID @@ -128677,9 +131576,15 @@ 3423092848,3423093759,VI 3423093760,3423094783,US 3423094784,3423095807,CA -3423095808,3423131647,US +3423095808,3423128575,US +3423129088,3423129343,NG +3423129600,3423131647,US 3423131648,3423133695,PL -3423133696,3423143935,US +3423133696,3423135999,US +3423136000,3423136255,CA +3423136256,3423137023,US +3423137024,3423137279,CA +3423137280,3423143935,US 3423143936,3423145983,CA 3423145984,3423162367,US 3423162368,3423163391,CA @@ -128688,14 +131593,12 @@ 3423182848,3423184895,CA 3423184896,3423258623,US 3423258624,3423260671,CA -3423260672,3423264831,US -3423264832,3423264863,NG -3423264864,3423268863,US +3423260672,3423268863,US 3423268864,3423269887,CA 3423269888,3423285247,US 3423285248,3423287295,CA -3423287296,3423288319,VG -3423288320,3423303679,US +3423287296,3423287807,VG +3423287808,3423303679,US 3423303680,3423304703,CA 3423304704,3423311871,US 3423311872,3423313151,VI @@ -128708,11 +131611,17 @@ 3423366496,3423371263,US 3423371264,3423375359,ZA 3423375360,3423379455,CA -3423379456,3423416319,US +3423379456,3423410175,US +3423410176,3423412223,BM +3423412224,3423416319,US 3423416320,3423417343,CA 3423417344,3423430655,US 3423430656,3423431679,TC -3423431680,3423468543,US +3423431680,3423465471,US +3423465472,3423465727,VC +3423465728,3423465983,US +3423465984,3423466239,VC +3423466240,3423468543,US 3423468544,3423469567,CA 3423469568,3423473663,US 3423473664,3423474687,CA @@ -128737,7 +131646,9 @@ 3423586304,3423588351,US 3423590400,3423602687,US 3423602688,3423603711,KN -3423603712,3423626239,US +3423603712,3423614975,US +3423614976,3423615487,CA +3423615488,3423626239,US 3423626240,3423627263,CA 3423627264,3423629311,US 3423629312,3423630335,AG @@ -128750,9 +131661,7 @@ 3423705856,3423725423,US 3423725424,3423725427,CA 3423725428,3423731711,US -3423731712,3423752191,AE -3423752192,3423756287,US -3423756288,3423797247,AE +3423731712,3423797247,AE 3423797248,3423797503,US 3423797504,3423801087,CA 3423801088,3423801343,US @@ -128792,7 +131701,9 @@ 3425173504,3425304575,CA 3425304576,3425471487,US 3425471488,3425472511,CA -3425472512,3425697791,US +3425472512,3425516799,US +3425516800,3425517055,MX +3425517056,3425697791,US 3425697792,3425699839,CA 3425699840,3425714175,US 3425714176,3425722367,CA @@ -128801,12 +131712,12 @@ 3425847040,3425869167,CA 3425869168,3425869183,US 3425869184,3425894399,CA -3425894400,3425994495,US -3425994496,3425994751,CA -3425994752,3426007807,US +3425894400,3426007807,US 3426008064,3426013183,US 3426013184,3426013439,IL -3426013440,3426369023,US +3426013440,3426356991,US +3426356992,3426357247,CA +3426357248,3426369023,US 3426369024,3426369535,CA 3426369536,3426387967,US 3426387968,3426388991,MX @@ -128841,7 +131752,8 @@ 3427133184,3427408393,US 3427408395,3427487743,US 3427487744,3427487999,GB -3427488000,3427503871,US +3427488000,3427503615,US +3427503616,3427503871,AU 3427503872,3427504127,SG 3427504128,3427618303,US 3427618304,3427618559,CA @@ -128936,7 +131848,7 @@ 3427767808,3427769599,US 3427769600,3427770111,JP 3427770112,3427770367,NO -3427770368,3427770623,GB +3427770368,3427770623,US 3427770624,3427771391,CH 3427771392,3427771647,US 3427771648,3427771903,CA @@ -128951,8 +131863,7 @@ 3427774720,3427775231,DE 3427775232,3427776511,US 3427776512,3427776767,CZ -3427776768,3427777023,US -3427777024,3427777279,NL +3427776768,3427777279,US 3427777280,3427777535,DE 3427777536,3427777791,US 3427777792,3427778047,HK @@ -128963,8 +131874,7 @@ 3427779328,3427780095,US 3427780096,3427780351,GB 3427780352,3427780863,DE -3427780864,3427781375,US -3427781376,3427781631,GB +3427780864,3427781631,US 3427781632,3427781887,BE 3427781888,3427782399,US 3427782400,3427782655,GB @@ -128986,7 +131896,7 @@ 3427790080,3427790847,US 3427790848,3427791103,IT 3427791104,3427791615,DE -3427791616,3427791871,GB +3427791616,3427791871,US 3427791872,3427792383,CA 3427792384,3427792639,NL 3427792640,3427793407,SG @@ -128997,22 +131907,19 @@ 3427796992,3427831551,US 3427831552,3427831807,MX 3427831808,3427860479,US -3427860480,3428025343,CA -3428025344,3428025855,US -3428025856,3428057087,CA +3427860480,3428057087,CA 3428057088,3428286719,US 3428286720,3428286975,CA 3428286976,3428296959,US 3428296960,3428297215,CL 3428297216,3428299519,US 3428299520,3428299775,ZA -3428299776,3428302079,US -3428302080,3428302335,CA -3428302336,3428306175,US +3428299776,3428306175,US 3428306176,3428306431,PE 3428306432,3428318975,US 3428318976,3428319231,CA -3428319232,3428399359,US +3428319232,3428398079,US +3428399104,3428399359,US 3428399360,3428399615,CA 3428399616,3428434943,US 3428434944,3428435199,CA @@ -129023,16 +131930,14 @@ 3428582912,3428585215,US 3428585216,3428585471,CA 3428585472,3428585983,US -3428585984,3428586495,CA -3428586496,3428587007,US -3428587008,3428587519,CA +3428585984,3428586239,CA +3428586240,3428587263,US +3428587264,3428587519,CA 3428587520,3428587775,US -3428587776,3428588287,CA -3428588288,3428588543,US +3428587776,3428588031,CA +3428588032,3428588543,US 3428588544,3428588799,CA -3428588800,3428589311,US -3428589312,3428589567,CA -3428589568,3428591871,US +3428588800,3428591871,US 3428591872,3428592127,CA 3428592128,3428592383,US 3428592384,3428593919,CA @@ -129057,7 +131962,9 @@ 3428605184,3428607999,US 3428608000,3428609023,CA 3428609024,3428610047,US -3428610048,3428611071,CA +3428610048,3428610559,CA +3428610560,3428610815,US +3428610816,3428611071,CA 3428611072,3428612607,US 3428612608,3428613887,CA 3428613888,3428614143,US @@ -129098,9 +132005,7 @@ 3428660736,3428661503,CA 3428661504,3428743167,US 3428743168,3428744191,CA -3428744192,3428752383,US -3428752384,3428753407,GH -3428753408,3428958207,US +3428744192,3428958207,US 3428958208,3428962303,CO 3428962304,3429027839,US 3429027840,3429028351,GB @@ -129124,9 +132029,7 @@ 3429957632,3430073343,US 3430073600,3430074111,US 3430074112,3430074367,AU -3430074368,3430328831,US -3430328832,3430329087,GH -3430329088,3430354943,US +3430074368,3430354943,US 3430354944,3430356991,PR 3430356992,3430417151,US 3430417152,3430417167,BR @@ -129206,9 +132109,7 @@ 3431518144,3431520767,US 3431521024,3431526921,US 3431526923,3431596287,US -3431596288,3431602687,CA -3431602688,3431602943,US -3431602944,3431606271,CA +3431596288,3431606271,CA 3431606272,3431609343,US 3431609344,3431613439,CA 3431613440,3431613695,US @@ -129231,9 +132132,7 @@ 3431745024,3431745279,BE 3431745280,3431745791,US 3431745792,3431746047,GB -3431746048,3431746559,US -3431746560,3431746815,DE -3431746816,3431747071,US +3431746048,3431747071,US 3431747072,3431747327,LU 3431747328,3431748607,US 3431748608,3431749119,FR @@ -129246,7 +132145,9 @@ 3431755008,3431755775,NL 3431755776,3431759615,CA 3431759616,3431759871,DE -3431759872,3432004607,US +3431759872,3431851007,US +3431851008,3431851263,GB +3431851264,3432004607,US 3432004608,3432005631,CA 3432005632,3432009215,US 3432009216,3432009471,PR @@ -129258,9 +132159,7 @@ 3432133888,3432134143,GB 3432134144,3432205311,US 3432205312,3432206335,CA -3432206336,3432280063,US -3432280064,3432280319,GB -3432280320,3432324607,US +3432206336,3432324607,US 3432324608,3432324863,CA 3432324864,3432329215,US 3432329216,3432330239,DE @@ -129295,13 +132194,23 @@ 3432689152,3432689663,CA 3432689664,3432695807,US 3432695808,3432697855,CA -3432697856,3432736255,US +3432697856,3432726271,US +3432726272,3432726527,CA +3432726528,3432736255,US 3432736256,3432736511,GB 3432736512,3432737279,US 3432737280,3432737535,SG 3432737536,3432738303,US 3432738304,3432738559,GB -3432738560,3432807423,US +3432738560,3432748799,US +3432748800,3432749055,PA +3432749056,3432749311,US +3432749312,3432749567,BG +3432749568,3432749823,US +3432749824,3432750079,BG +3432750080,3432750335,US +3432750336,3432750591,BG +3432750592,3432807423,US 3432807424,3432808447,CA 3432808448,3433955583,US 3433955584,3433964799,CA @@ -129329,27 +132238,13 @@ 3434807552,3434831359,CA 3434831360,3434831615,US 3434831616,3434872575,CA -3434872576,3434913951,US -3434913952,3434913959,AG -3434913960,3434914047,US -3434914048,3434914303,DM -3434914304,3434914559,VG -3434914560,3434914815,AG -3434914816,3434915327,VG -3434915328,3434915583,DM -3434915584,3434915839,KN -3434915840,3434916095,LC -3434916096,3434916351,US -3434916352,3434916607,DM -3434916608,3434916863,AG -3434916864,3434917119,US -3434917120,3434917375,LC -3434917376,3434917887,AG -3434917888,3435069439,US +3434872576,3435069439,US 3435069440,3435134975,CA -3435134976,3435216637,US -3435216639,3435216650,US -3435216652,3435271423,US +3435134976,3435216383,US +3435216384,3435216637,DE +3435216639,3435216650,DE +3435216652,3435216895,DE +3435216896,3435271423,US 3435271424,3435271679,CA 3435271680,3435507711,US 3435507712,3435511807,CA @@ -129412,7 +132307,9 @@ 3437343232,3437343487,US 3437343488,3437350911,CA 3437350912,3437351423,US -3437351424,3437358847,CA +3437351424,3437353471,CA +3437353472,3437353727,SG +3437353728,3437358847,CA 3437358848,3437359103,US 3437359104,3437428735,CA 3437428736,3437691391,US @@ -129464,9 +132361,7 @@ 3437731584,3437731615,AF 3437731616,3437734399,US 3437734400,3437734655,SG -3437734656,3437736447,US -3437736448,3437737471,CL -3437737472,3437748223,US +3437734656,3437748223,US 3437748224,3437748479,GB 3437748480,3437748991,NL 3437748992,3437749247,US @@ -129502,7 +132397,9 @@ 3438132560,3438132575,CA 3438132576,3438137183,US 3438137184,3438137191,CA -3438137192,3438215423,US +3438137192,3438139391,US +3438139392,3438140415,GB +3438140416,3438215423,US 3438215424,3438215935,CA 3438215936,3438216191,US 3438216192,3438217983,CA @@ -129522,23 +132419,21 @@ 3438542848,3438608383,CA 3438608384,3438610125,US 3438610126,3438610126,DE -3438610127,3438610325,US +3438610127,3438610169,US +3438610170,3438610170,PL +3438610171,3438610325,US 3438610326,3438610326,GB 3438610327,3438610408,US 3438610409,3438610410,GB 3438610411,3438734335,US 3438734336,3438735359,CA -3438735360,3438813183,US -3438813184,3438814207,GH -3438814208,3438895103,US +3438735360,3438895103,US 3438895104,3438896639,HN 3438896640,3439059711,US 3439059712,3439059967,PR 3439059968,3439071103,US 3439071104,3439071135,MX -3439071136,3448303615,US -3448303616,3448303871,KY -3448303872,3448338687,US +3439071136,3448338687,US 3448338688,3448339455,GB 3448339456,3448377343,US 3448377344,3448377855,AG @@ -129576,15 +132471,7 @@ 3449100288,3449100799,HK 3449100800,3449101311,AU 3449101312,3449159679,US -3449159680,3449160703,CA -3449160704,3449161471,US -3449161472,3449163519,CA -3449163520,3449163775,US -3449163776,3449165055,CA -3449165056,3449165311,US -3449165312,3449165567,CA -3449165568,3449166079,US -3449166080,3449168639,CA +3449159680,3449168639,CA 3449168640,3449168895,US 3449168896,3449169151,CA 3449169152,3449169663,US @@ -130181,9 +133068,7 @@ 3455132160,3455133695,BO 3455133696,3455320063,US 3455320064,3455322111,FR -3455322112,3455328255,US -3455328256,3455329279,DO -3455329280,3455330815,US +3455322112,3455330815,US 3455330816,3455331327,ES 3455331328,3455333887,US 3455333888,3455334399,NL @@ -130193,11 +133078,11 @@ 3455359232,3455359487,ES 3455359488,3455418367,US 3455418368,3455418879,KY -3455418880,3455421439,US -3455421440,3455421951,BE -3455421952,3455453439,US +3455418880,3455453439,US 3455453440,3455453695,HT -3455453696,3455551999,US +3455453696,3455488103,US +3455488104,3455488111,CA +3455488112,3455551999,US 3455552000,3455552255,EC 3455552256,3455566079,US 3455566080,3455566335,EC @@ -130354,7 +133239,9 @@ 3458195456,3458196479,SG 3458196480,3458233343,US 3458233344,3458234367,CA -3458234368,3458813951,US +3458234368,3458806783,US +3458806784,3458807807,GB +3458807808,3458813951,US 3458813952,3458818047,CA 3458818048,3458820095,US 3458820096,3458820351,CA @@ -130531,7 +133418,10 @@ 3460453632,3460453887,BS 3460453888,3460507647,US 3460507648,3460507903,MX -3460507904,3460801023,US +3460507904,3460762367,US +3460762368,3460762623,CA +3460762624,3460762879,US +3460763648,3460801023,US 3460801280,3460878335,US 3460878336,3460878591,CA 3460878592,3460880383,US @@ -130675,7 +133565,9 @@ 3461515776,3461516031,CA 3461516032,3461516287,US 3461516288,3461516543,IL -3461516544,3461808127,US +3461516544,3461554175,US +3461554176,3461556223,CA +3461558272,3461808127,US 3461808128,3461873663,CA 3461873664,3461897727,US 3461897728,3461897983,CA @@ -130770,8 +133662,10 @@ 3462635008,3462635263,US 3462635264,3462635519,SG 3462635520,3462660295,US -3462660296,3462660303,GB -3462660304,3462661375,US +3462660296,3462660303,SG +3462660304,3462660327,US +3462660328,3462660335,SG +3462660336,3462661375,US 3462661376,3462661631,SG 3462661632,3463004159,US 3463004160,3463006207,CO @@ -130822,9 +133716,9 @@ 3464202240,3464202495,CA 3464202496,3464203007,US 3464203008,3464203263,SE -3464203264,3464203519,DE -3464203520,3464204799,US -3464204800,3464205311,NL +3464203264,3464204799,US +3464204800,3464205055,DK +3464205056,3464205311,NL 3464205312,3464205567,SE 3464205568,3464205823,US 3464205824,3464205951,AF @@ -130952,7 +133846,8 @@ 3466489856,3466490111,CA 3466490112,3466558207,US 3466558208,3466558463,EC -3466558464,3466756095,US +3466558464,3466717445,US +3466717450,3466756095,US 3466756096,3466772479,CA 3466772480,3466846207,US 3466846208,3466854399,CA @@ -131164,11 +134059,7 @@ 3468468224,3468545791,US 3468545792,3468546047,SG 3468546048,3468597759,US -3468597760,3468598015,SG -3468598016,3468598143,US -3468598144,3468598175,SG -3468598176,3468598271,US -3468598272,3468598391,SG +3468597760,3468598391,SG 3468598392,3468598399,NL 3468598400,3468599039,SG 3468599040,3468599295,HK @@ -131180,17 +134071,15 @@ 3468623872,3468656639,CA 3468656640,3468658175,US 3468658176,3468658431,KY -3468658432,3468682399,US -3468682400,3468682415,HK -3468682416,3468682447,US +3468658432,3468682447,US 3468682448,3468682463,SG 3468682464,3468682495,US 3468682496,3468682559,HK 3468682560,3468682575,US 3468682576,3468682591,HK 3468682592,3468682607,US -3468682608,3468682639,SG -3468682640,3468682735,HK +3468682608,3468682671,SG +3468682672,3468682735,HK 3468682736,3468682751,US 3468682752,3468682911,HK 3468682912,3468682927,US @@ -131248,7 +134137,9 @@ 3468688912,3468688927,NL 3468688928,3468688943,US 3468688944,3468688959,IE -3468688960,3468977919,US +3468688960,3468802303,US +3468802304,3468802559,CA +3468802560,3468977919,US 3468978176,3469032191,US 3469032448,3469055743,US 3469055744,3469055999,CA @@ -131306,8 +134197,7 @@ 3470755840,3470756095,MU 3470756096,3470761983,US 3470761984,3470770175,CA -3470770176,3470778367,US -3470786560,3470794751,US +3470770176,3470794751,US 3470794752,3470802943,PA 3470802944,3470884863,US 3470884864,3470885887,HK @@ -131332,26 +134222,17 @@ 3471558656,3471560703,CA 3471560704,3471570943,US 3471570944,3471572991,CA -3471572992,3472245759,US -3472245760,3472245760,GB -3472245761,3472246783,US -3472246784,3472246784,GB -3472246785,3472248319,US -3472248320,3472248320,GB -3472248321,3472249343,US +3471572992,3472249343,US 3472249344,3472249599,CA -3472249600,3472250367,US -3472250368,3472250368,GB -3472250369,3472252415,US -3472252416,3472252416,GB -3472252417,3472256511,US -3472256512,3472256767,GB -3472256768,3472259583,US -3472259584,3472259584,GB -3472259585,3472375807,US +3472249600,3472257599,US +3472257600,3472257631,MX +3472257632,3472257663,MY +3472257664,3472375807,US 3472375808,3472392191,PR 3472392192,3472408575,CA -3472408576,3472721919,US +3472408576,3472678911,US +3472678912,3472687103,PL +3472687104,3472721919,US 3472721920,3472723967,CA 3472723968,3473039359,US 3473039360,3473040639,BM @@ -131423,9 +134304,8 @@ 3475909144,3475909359,US 3475909360,3475909367,IE 3475909368,3475910655,US -3475910656,3475911167,SG -3475911296,3475911487,SG -3475911488,3475911551,HK +3475910656,3475911519,SG +3475911520,3475911551,HK 3475911552,3475912959,SG 3475912960,3475913215,US 3475913216,3475914751,SG @@ -131492,7 +134372,9 @@ 3475953024,3475953663,US 3475953664,3475953919,IE 3475953920,3475954175,SG -3475954176,3475955711,US +3475954176,3475954547,US +3475954548,3475954551,PT +3475954552,3475955711,US 3475955712,3475959807,SG 3475959808,3475996671,US 3475996672,3476029439,CA @@ -131504,7 +134386,9 @@ 3476447232,3476455423,CA 3476455424,3476881407,US 3476881408,3476946943,CA -3476946944,3477384735,US +3476946944,3477384711,US +3477384712,3477384719,CN +3477384720,3477384735,US 3477384736,3477384743,IE 3477384744,3477384783,US 3477384784,3477384799,IE @@ -131686,7 +134570,9 @@ 3481812992,3481822063,CA 3481822064,3481822079,US 3481822080,3481829375,CA -3481829376,3481937919,US +3481829376,3481843199,US +3481843200,3481843711,GB +3481843712,3481937919,US 3481937920,3481938943,GB 3481938944,3481951977,US 3481951978,3481951978,DE @@ -131790,11 +134676,7 @@ 3482048000,3482048511,US 3482048512,3482048767,CA 3482048768,3482049791,US -3482049792,3482050559,CA -3482050560,3482051327,US -3482051328,3482051583,CA -3482051584,3482051839,US -3482051840,3482052863,CA +3482049792,3482052863,CA 3482052864,3482053631,US 3482053632,3482053887,CA 3482053888,3482053999,US @@ -131810,8 +134692,10 @@ 3482779648,3482910719,US 3482910720,3482927103,CA 3482927104,3483025407,US -3483025408,3483037695,DE -3483037696,3483435007,US +3483025408,3483041791,DE +3483041792,3483296004,US +3483296005,3483296005,BE +3483296006,3483435007,US 3483435008,3483533311,CA 3483533312,3483631615,US 3483631616,3483697151,CA @@ -131820,9 +134704,7 @@ 3483791624,3483791631,US 3483791632,3483791815,PR 3483791816,3483791823,US -3483791824,3483793919,PR -3483793920,3483794431,US -3483794432,3483795455,PR +3483791824,3483795455,PR 3483795456,3483828223,US 3483828224,3483836415,CA 3483836416,3483844607,US @@ -131947,9 +134829,7 @@ 3485969152,3485969152,GB 3485969153,3485969663,US 3485969664,3485969664,GB -3485969665,3485969919,US -3485969920,3485969920,GB -3485969921,3485970431,US +3485969665,3485970431,US 3485970432,3485970943,CA 3485970944,3485972991,US 3485972992,3485973247,CA @@ -132269,7 +135149,11 @@ 3489398784,3489399039,IT 3489399040,3489464319,US 3489464320,3489529855,CA -3489529856,3489562623,US +3489529856,3489535999,US +3489536000,3489538047,IE +3489538048,3489547263,US +3489547264,3489548287,IE +3489548288,3489562623,US 3489566720,3489575935,US 3489575936,3489576191,CN 3489576192,3489576703,US @@ -132305,13 +135189,11 @@ 3490265344,3490267135,CO 3490267136,3490488319,US 3490488320,3490489343,PR -3490489344,3490703615,US +3490489344,3490702847,US +3490702848,3490703103,AS +3490703104,3490703615,US 3490703616,3490703871,PR -3490703872,3490786047,US -3490786048,3490786303,PR -3490786304,3490879231,US -3490879232,3490879487,PR -3490879488,3491381247,US +3490703872,3491381247,US 3491381248,3491389439,BM 3491389440,3491476991,US 3491476992,3491478527,VI @@ -132336,15 +135218,21 @@ 3492812760,3492812763,JP 3492812764,3492845823,US 3492845824,3492846079,CH -3492846080,3492866047,US +3492846080,3492863999,US +3492864000,3492865023,CA +3492865024,3492866047,US 3492866048,3492868095,GB 3492868096,3492877954,US 3492877955,3492877955,CA -3492877956,3492894015,US +3492877956,3492880745,US +3492880746,3492880746,ES +3492880747,3492894015,US 3492894016,3492894207,GB 3492894208,3492896767,US 3492896768,3492897791,GB -3492897792,3492906495,US +3492897792,3492904217,US +3492904218,3492904218,AT +3492904219,3492906495,US 3492906752,3492909989,US 3492909990,3492909990,DE 3492909991,3492912127,US @@ -132352,9 +135240,13 @@ 3492912384,3492921855,US 3492921856,3492922111,VI 3492922112,3492926079,US -3492926096,3492933376,US +3492926096,3492931583,US +3492931584,3492933119,CA +3492933120,3492933375,US +3492933376,3492933376,CA 3492933377,3492933377,CH -3492933378,3492939022,US +3492933378,3492933631,CA +3492933632,3492939022,US 3492939023,3492939023,DE 3492939024,3492944127,US 3492944128,3492944383,VE @@ -132364,13 +135256,17 @@ 3492957696,3492958207,VI 3492958208,3492962303,US 3492962304,3492963327,GB -3492963328,3492994047,US +3492963328,3492969471,US +3492969472,3492969727,VI +3492969728,3492994047,US 3492994048,3492995071,GB 3492995072,3492998655,US 3492998656,3492999136,GB 3492999137,3492999137,US 3492999138,3492999167,GB -3492999168,3493039359,US +3492999168,3493007359,US +3493007360,3493008383,GB +3493008384,3493039359,US 3493039360,3493039615,AR 3493039616,3493073151,US 3493073152,3493073407,BO @@ -132384,8 +135280,7 @@ 3493140224,3493140479,DE 3493140480,3493244927,US 3493244928,3493249023,PR -3493249024,3493863423,US -3493864448,3493866495,US +3493249024,3493866495,US 3493866496,3493867519,VG 3493867520,3493881855,US 3493881856,3493882879,CA @@ -132414,7 +135309,8 @@ 3494011088,3494011095,US 3494011136,3494011231,US 3494011232,3494011247,HK -3494011264,3494014975,US +3494011264,3494011903,US +3494012928,3494014975,US 3494014976,3494017023,CA 3494017024,3494043647,US 3494043648,3494045695,CA @@ -132446,15 +135342,15 @@ 3494184960,3494187007,CA 3494187008,3494191359,US 3494191360,3494191615,DE -3494191616,3494191626,US -3494191627,3494191627,GB -3494191628,3494191871,US +3494191616,3494191871,GB 3494191872,3494192127,NL 3494192128,3494192383,US 3494192384,3494192639,JP 3494192640,3494197247,US 3494197248,3494198271,CA -3494198272,3494244351,US +3494198272,3494211583,US +3494211584,3494212607,NL +3494212608,3494244351,US 3494244352,3494246399,CA 3494246400,3494247423,US 3494247424,3494250495,CA @@ -132524,9 +135420,7 @@ 3494627328,3494628351,BM 3494628352,3494651903,US 3494651904,3494652927,CA -3494652928,3494655359,US -3494655360,3494655423,GB -3494655424,3494655743,US +3494652928,3494655743,US 3494655744,3494655759,GB 3494655760,3494660095,US 3494660096,3494661119,CA @@ -132562,19 +135456,21 @@ 3494862848,3494863871,DM 3494863872,3494866943,US 3494866944,3494867967,CA -3494867968,3494874111,US +3494867968,3494871039,US +3494872064,3494874111,US 3494874112,3494874367,ES 3494874368,3494874879,US 3494874880,3494874911,ES 3494874912,3494893567,US 3494893568,3494894591,CA 3494894592,3494917119,US -3494917120,3494917631,CA -3494917632,3494928383,US +3494917120,3494918143,CA +3494918144,3494928383,US 3494928384,3494930431,CA 3494930432,3494938623,US 3494938624,3494939647,CA -3494939648,3494950655,US +3494939648,3494948863,US +3494949888,3494950655,US 3494950656,3494950911,PH 3494950912,3494964223,US 3494964224,3494965247,PR @@ -132608,7 +135504,8 @@ 3495090176,3495091199,KY 3495091200,3495098367,US 3495098368,3495100415,CA -3495100416,3495120895,US +3495100416,3495100927,IE +3495100928,3495120895,US 3495120896,3495122943,AG 3495122944,3495153663,US 3495153664,3495155711,CA @@ -132661,7 +135558,8 @@ 3495475200,3495477247,CA 3495477248,3495478271,US 3495478272,3495479295,CA -3495479296,3495505919,US +3495479296,3495481343,US +3495483392,3495505919,US 3495505920,3495507967,CA 3495507968,3495515135,US 3495515136,3495516159,CA @@ -132683,7 +135581,9 @@ 3495618560,3495619583,CA 3495619584,3495620607,US 3495620608,3495622655,CA -3495622656,3495673855,US +3495622656,3495651327,US +3495653376,3495654399,CA +3495654400,3495673855,US 3495673856,3495674879,MF 3495674880,3495675162,VG 3495675163,3495675163,US @@ -132705,7 +135605,9 @@ 3495749632,3495749856,CA 3495749857,3495749861,RU 3495749862,3495750655,CA -3495750656,3495815167,US +3495750656,3495758335,US +3495758336,3495758847,CA +3495758848,3495815167,US 3495815168,3495817215,CA 3495817216,3495828479,US 3495828480,3495829503,CA @@ -132833,22 +135735,11 @@ 3499436032,3499436287,DE 3499436288,3499450367,US 3499450368,3499451391,IN -3499451392,3499705343,US -3499705344,3499705855,TZ +3499451392,3499705855,US 3499705856,3499706367,MG 3499706368,3499986943,US 3499986944,3499988991,KY -3499988992,3500015871,US -3500015872,3500016127,AG -3500016128,3500016383,US -3500016384,3500016639,KN -3500016640,3500016895,US -3500016896,3500017151,DM -3500017152,3500018943,US -3500018944,3500019199,LC -3500019200,3500019455,US -3500019456,3500019711,LC -3500019712,3500126207,US +3499988992,3500126207,US 3500126208,3500126463,SE 3500126464,3500126719,GB 3500126720,3500351487,US @@ -132968,9 +135859,13 @@ 3507012608,3507012639,GR 3507012640,3507025407,US 3507025408,3507025663,IQ -3507025664,3507054591,US +3507025664,3507037183,US +3507037184,3507037439,DE +3507037440,3507054591,US 3507054592,3507055615,CN -3507055616,3507060735,US +3507055616,3507055903,US +3507055904,3507055911,HK +3507055912,3507060735,US 3507060736,3507068927,CN 3507068928,3507290111,US 3507290112,3507355647,AR @@ -133352,11 +136247,15 @@ 3510788448,3510788479,GB 3510788480,3510844415,US 3510844416,3510844927,CA -3510844928,3511140351,US +3510844928,3510935551,US +3510935552,3510943743,CA +3510943744,3511140351,US 3511140352,3511156735,CA 3511156736,3511257855,US 3511257856,3511258111,CN -3511258112,3511812095,US +3511258112,3511314215,US +3511314216,3511314223,CA +3511314224,3511812095,US 3511812096,3511844863,CA 3511844864,3512012095,US 3512012096,3512012159,GB @@ -133454,11 +136353,7 @@ 3512397824,3512401919,CA 3512401920,3512418303,US 3512418304,3512451071,CA -3512451072,3512465407,PR -3512465408,3512465663,US -3512465664,3512466687,PR -3512466688,3512466943,US -3512466944,3512467455,PR +3512451072,3512467455,PR 3512467456,3512532991,US 3512532992,3512598527,GB 3512598528,3512647679,US @@ -133613,9 +136508,7 @@ 3517054976,3517095935,US 3517095936,3517100031,CA 3517100032,3517112319,US -3517112320,3517116159,CA -3517116160,3517116415,US -3517116416,3517120511,CA +3517112320,3517120511,CA 3517120512,3517233151,US 3517233152,3517235199,GU 3517235200,3517382655,US @@ -133627,11 +136520,7 @@ 3517385440,3517385471,US 3517385472,3517385727,CA 3517385728,3517385983,US -3517385984,3517387263,CA -3517387264,3517387519,US -3517387520,3517387775,CA -3517387776,3517388287,US -3517388288,3517388799,CA +3517385984,3517388799,CA 3517388800,3517389311,US 3517389312,3517389567,CA 3517389568,3517389823,US @@ -133864,7 +136753,9 @@ 3519901696,3519930367,US 3519934464,3519938559,CA 3519938560,3519946751,IL -3519946752,3519967231,US +3519946752,3519948287,US +3519948288,3519948799,DE +3519948800,3519967231,US 3519967232,3519969279,CA 3519969280,3519971071,US 3519971072,3519971327,CA @@ -133887,7 +136778,8 @@ 3520937984,3520954367,CA 3520954368,3520994815,US 3520994816,3520995071,GB -3520995072,3520999423,US +3520995072,3520995135,JP +3520995136,3520999423,US 3520999424,3521003519,CA 3521003520,3521028095,US 3521028096,3521032191,CA @@ -133932,9 +136824,7 @@ 3522101248,3522109439,CA 3522109440,3522118143,US 3522118144,3522118655,GB -3522118656,3522118911,US -3522118912,3522119679,GB -3522119680,3522119935,US +3522118656,3522119935,US 3522119936,3522120191,LY 3522120192,3522120447,US 3522120448,3522121215,AE @@ -133959,7 +136849,9 @@ 3522174976,3522179071,BM 3522179072,3522195455,US 3522195456,3522199551,CA -3522199552,3522854911,US +3522199552,3522816767,US +3522816768,3522817023,CA +3522817024,3522854911,US 3522854912,3522871295,CA 3522871296,3522893823,US 3522893824,3522894847,CA @@ -134114,10 +137006,11 @@ 3524282368,3524288511,IN 3524288512,3524289535,HK 3524289536,3524290559,IN -3524290560,3524291583,CN +3524290560,3524291327,CN +3524291328,3524291583,TW 3524291584,3524294655,IN 3524294656,3524295679,SG -3524295680,3524296703,PH +3524295680,3524296703,MY 3524296704,3524313087,CN 3524313088,3524329471,KR 3524329472,3524362239,TW @@ -134294,7 +137187,14 @@ 3526926336,3526934527,JP 3526934528,3526942719,CN 3526942720,3526950911,AU -3526950912,3527002111,JP +3526950912,3526951935,MY +3526951936,3526952959,JP +3526952960,3526953983,ID +3526953984,3526971439,JP +3526971440,3526971443,HK +3526971444,3526971667,JP +3526971668,3526971671,HK +3526971672,3527002111,JP 3527002112,3527003647,IN 3527003648,3527004159,JP 3527004160,3527008255,ID @@ -134351,13 +137251,15 @@ 3534758976,3534759039,PH 3534759040,3534759167,AU 3534759168,3534759215,JP -3534759216,3534760447,AU +3534759216,3534759963,AU +3534759964,3534759967,US +3534759968,3534760447,AU 3534760448,3534760959,NZ 3534760960,3534761983,AU 3534761984,3534763775,HK -3534764032,3534785279,HK -3534785280,3534785535,SG -3534785536,3534786815,HK +3534764032,3534785043,HK +3534785044,3534785047,SG +3534785048,3534786815,HK 3534786816,3534787327,MY 3534787328,3534787583,TH 3534787584,3534863443,HK @@ -134430,7 +137332,9 @@ 3541565440,3541696511,MY 3541696512,3542089727,AU 3542089728,3542847487,KR -3542847488,3542851583,US +3542847488,3542851071,US +3542851072,3542851327,DE +3542851328,3542851583,US 3542851584,3544186879,KR 3544186880,3544711167,CN 3544711168,3545235455,TW @@ -134530,7 +137434,9 @@ 3557343232,3557351423,DE 3557351424,3557356543,RU 3557356544,3557357311,NL -3557357312,3557359615,RU +3557357312,3557358079,RU +3557358080,3557358847,NL +3557358848,3557359615,RU 3557359616,3557359991,JE 3557359992,3557359999,GB 3557360000,3557360047,JE @@ -134629,7 +137535,9 @@ 3557892096,3557900287,IE 3557900288,3557916671,AT 3557916672,3557924863,NO -3557924864,3557933055,FI +3557924864,3557928959,AX +3557928960,3557931007,FI +3557931008,3557933055,AX 3557933056,3557941247,IT 3557941248,3557957631,DE 3557957632,3557965823,SI @@ -134670,8 +137578,8 @@ 3558178816,3558187007,BG 3558187008,3558195199,DE 3558195200,3558196327,GB -3558196328,3558196343,IT -3558196344,3558197247,GB +3558196328,3558196351,IT +3558196352,3558197247,GB 3558197248,3558199295,US 3558199296,3558203391,GB 3558203392,3558211583,ES @@ -134681,18 +137589,22 @@ 3558230016,3558231039,PL 3558231040,3558231551,RU 3558231552,3558231807,SK -3558231808,3558232063,FR +3558231808,3558232063,RU 3558232064,3558232575,LB 3558232576,3558236159,RU 3558236160,3558244351,GB 3558244352,3558252543,IT 3558252544,3558260735,KE 3558260736,3558268927,UA -3558268928,3558273279,GI -3558273280,3558273535,GB -3558273536,3558275839,GI +3558268928,3558269439,GB +3558269440,3558269695,GI +3558269696,3558270167,GB +3558270168,3558270168,GI +3558270169,3558270463,GB +3558270464,3558275839,GI 3558275840,3558276095,HK -3558276096,3558277119,GI +3558276096,3558276351,GB +3558276352,3558277119,GI 3558277120,3558285951,GB 3558285952,3558286079,DE 3558286080,3558286591,GB @@ -134724,11 +137636,7 @@ 3558350848,3558359039,RU 3558359040,3558367231,GB 3558367232,3558371327,LT -3558371328,3558372383,AT -3558372384,3558372607,BG -3558372608,3558372735,AT -3558372736,3558372863,ES -3558372864,3558375423,AT +3558371328,3558375423,AT 3558375424,3558383615,CZ 3558383616,3558391807,HU 3558391808,3558399999,LU @@ -134784,7 +137692,9 @@ 3558842368,3558850559,SE 3558850560,3558851327,GB 3558851328,3558851335,ES -3558851336,3558854135,GB +3558851336,3558851815,GB +3558851816,3558851823,ES +3558851824,3558854135,GB 3558854136,3558854143,ES 3558854144,3558856703,GB 3558856704,3558858751,US @@ -134850,8 +137760,8 @@ 3559164160,3559178239,GB 3559178240,3559186431,LB 3559186432,3559194623,RU -3559194624,3559197535,SE -3559197536,3559197567,FI +3559194624,3559197551,SE +3559197552,3559197567,FI 3559197568,3559200143,SE 3559200144,3559200151,FI 3559200152,3559200255,SE @@ -135341,7 +138251,7 @@ 3560941088,3560941091,DE 3560941092,3560941095,BE 3560941096,3560941099,AT -3560941100,3560941103,IT +3560941100,3560941103,DE 3560941104,3560941107,FR 3560941108,3560941119,DE 3560941120,3560941123,BE @@ -135755,7 +138665,7 @@ 3560943196,3560943197,IT 3560943198,3560943198,DE 3560943199,3560943199,PT -3560943200,3560943200,AT +3560943200,3560943200,DE 3560943201,3560943201,IT 3560943202,3560943202,IL 3560943203,3560943204,DE @@ -135985,8 +138895,7 @@ 3560943526,3560943526,IT 3560943527,3560943529,DE 3560943530,3560943530,CH -3560943531,3560943532,DE -3560943533,3560943533,HU +3560943531,3560943533,DE 3560943534,3560943534,BY 3560943535,3560943535,FR 3560943536,3560943536,BE @@ -136381,50 +139290,50 @@ 3560944880,3560944883,DE 3560944884,3560944887,ES 3560944888,3560944891,CH -3560944892,3560944895,DE -3560944896,3560944899,TW +3560944892,3560944899,DE 3560944900,3560944903,SG 3560944904,3560944907,MY -3560944908,3560944919,SG -3560944920,3560944923,MY +3560944908,3560944915,DE +3560944916,3560944919,SG +3560944920,3560944923,DE 3560944924,3560944927,CN -3560944928,3560944931,MY +3560944928,3560944931,DE 3560944932,3560944935,SG 3560944936,3560944943,CN 3560944944,3560944947,MY -3560944948,3560944951,SG -3560944952,3560944955,TW +3560944948,3560944955,DE 3560944956,3560944959,SG -3560944960,3560944963,IN +3560944960,3560944963,DE 3560944964,3560944967,MY 3560944968,3560944971,SG 3560944972,3560944975,CN -3560944976,3560944987,IN +3560944976,3560944979,IN +3560944980,3560944983,DE +3560944984,3560944987,IN 3560944988,3560944991,SG 3560944992,3560944995,MY 3560944996,3560944999,SG 3560945000,3560945003,MY -3560945004,3560945007,IN +3560945004,3560945007,DE 3560945008,3560945011,SG -3560945012,3560945015,DE -3560945016,3560945027,IN +3560945012,3560945019,DE +3560945020,3560945023,IN +3560945024,3560945027,DE 3560945028,3560945031,MY 3560945032,3560945035,IN 3560945036,3560945039,CN 3560945040,3560945043,SG 3560945044,3560945047,TW -3560945048,3560945059,IN +3560945048,3560945059,DE 3560945060,3560945063,SG 3560945064,3560945067,MY 3560945068,3560945075,IN -3560945076,3560945083,CN -3560945084,3560945087,IN -3560945088,3560945091,DE +3560945076,3560945091,DE 3560945092,3560945095,SG 3560945096,3560945099,CN 3560945100,3560945103,SG 3560945104,3560945107,MY -3560945108,3560945111,TW +3560945108,3560945111,DE 3560945112,3560945115,SG 3560945116,3560945119,IN 3560945120,3560945123,CN @@ -136434,31 +139343,24 @@ 3560945140,3560945143,SG 3560945144,3560945147,IN 3560945148,3560945151,SG -3560945152,3560945153,DE -3560945154,3560945156,AU -3560945157,3560945157,NZ -3560945158,3560945167,AU -3560945168,3560945168,DE -3560945169,3560945169,AU -3560945170,3560945191,DE -3560945192,3560945192,AU -3560945193,3560945194,DE -3560945195,3560945195,AU -3560945196,3560945204,DE -3560945205,3560945205,AU -3560945206,3560945206,IN -3560945207,3560945209,AU -3560945210,3560945227,DE -3560945228,3560945231,IN -3560945232,3560945267,DE -3560945268,3560945271,AU -3560945272,3560945275,DE -3560945276,3560945279,AU -3560945280,3560945355,JP +3560945152,3560945279,DE +3560945280,3560945295,JP +3560945296,3560945299,DE +3560945300,3560945311,JP +3560945312,3560945315,DE +3560945316,3560945323,JP +3560945324,3560945327,DE +3560945328,3560945331,JP +3560945332,3560945335,DE +3560945336,3560945339,JP +3560945340,3560945343,DE +3560945344,3560945351,JP +3560945352,3560945355,DE 3560945356,3560945359,TH -3560945360,3560945403,JP -3560945404,3560945407,TH -3560945408,3560945409,DE +3560945360,3560945379,JP +3560945380,3560945387,DE +3560945388,3560945403,JP +3560945404,3560945409,DE 3560945410,3560945410,MY 3560945411,3560945411,TW 3560945412,3560945412,CN @@ -136530,23 +139432,21 @@ 3560945503,3560945539,DE 3560945540,3560945543,SG 3560945544,3560945551,IN -3560945552,3560945555,DE -3560945556,3560945559,IN -3560945560,3560945563,DE +3560945552,3560945563,DE 3560945564,3560945567,SG -3560945568,3560945571,DE -3560945572,3560945575,IN +3560945568,3560945575,DE 3560945576,3560945579,SG 3560945580,3560945583,MY 3560945584,3560945587,SG 3560945588,3560945591,TW -3560945592,3560945603,SG -3560945604,3560945607,US -3560945608,3560945611,IN +3560945592,3560945595,SG +3560945596,3560945599,DE +3560945600,3560945603,SG +3560945604,3560945611,DE 3560945612,3560945619,SG 3560945620,3560945627,CN 3560945628,3560945635,SG -3560945636,3560945639,CN +3560945636,3560945639,DE 3560945640,3560945643,SG 3560945644,3560945647,MY 3560945648,3560945651,IN @@ -136852,13 +139752,32 @@ 3560947436,3560947439,DE 3560947440,3560947443,BR 3560947444,3560947455,US -3560947456,3560947495,JP -3560947496,3560947499,KR -3560947500,3560947663,JP -3560947664,3560947667,DE -3560947668,3560947686,JP -3560947687,3560947687,DE -3560947688,3560947711,JP +3560947456,3560947463,DE +3560947464,3560947475,JP +3560947476,3560947507,DE +3560947508,3560947511,JP +3560947512,3560947523,DE +3560947524,3560947527,JP +3560947528,3560947535,DE +3560947536,3560947543,JP +3560947544,3560947551,DE +3560947552,3560947555,JP +3560947556,3560947559,DE +3560947560,3560947567,JP +3560947568,3560947571,DE +3560947572,3560947591,JP +3560947592,3560947603,DE +3560947604,3560947607,JP +3560947608,3560947623,DE +3560947624,3560947631,JP +3560947632,3560947655,DE +3560947656,3560947659,JP +3560947660,3560947667,DE +3560947668,3560947683,JP +3560947684,3560947687,DE +3560947688,3560947703,JP +3560947704,3560947707,DE +3560947708,3560947711,JP 3560947712,3560955903,SE 3560955904,3560964095,BE 3560964096,3560996863,NL @@ -136959,7 +139878,9 @@ 3561609216,3561611263,FR 3561611264,3561611519,GB 3561611520,3561611775,FR -3561611776,3561615359,GB +3561611776,3561613759,GB +3561613760,3561613823,FR +3561613824,3561615359,GB 3561615360,3561617407,FR 3561617408,3561618431,IE 3561618432,3561618877,GB @@ -137039,7 +139960,9 @@ 3562059520,3562061823,ES 3562070016,3562078207,DE 3562078208,3562086399,SK -3562094592,3562102449,GB +3562094592,3562094911,GB +3562094912,3562094975,CH +3562094976,3562102449,GB 3562102450,3562102450,DE 3562102451,3562110607,GB 3562110608,3562110623,FR @@ -137088,7 +140011,13 @@ 3562422272,3562430463,IR 3562430464,3562431231,UA 3562431232,3562431487,RU -3562431488,3562438655,UA +3562431488,3562431999,UA +3562432000,3562432255,NL +3562432256,3562433535,UA +3562433536,3562434047,NL +3562434048,3562435071,UA +3562435072,3562435583,NL +3562435584,3562438655,UA 3562438656,3562463231,DE 3562463232,3562471423,UA 3562471424,3562479615,PL @@ -137404,7 +140333,9 @@ 3564363776,3564371967,UA 3564371968,3564380159,DE 3564380160,3564388351,FI -3564388352,3564396543,SE +3564388352,3564391135,SE +3564391136,3564391167,US +3564391168,3564396543,SE 3564396544,3564404735,RU 3564404736,3564412927,BG 3564412928,3564421119,IL @@ -137455,7 +140386,9 @@ 3564733260,3564733263,DE 3564733264,3564733343,GB 3564733344,3564733351,DE -3564733352,3564734207,GB +3564733352,3564733807,GB +3564733808,3564733823,DE +3564733824,3564734207,GB 3564734458,3564734458,DE 3564734464,3564734741,GB 3564734742,3564734742,DE @@ -137507,14 +140440,12 @@ 3564882688,3564883071,GB 3564883072,3564883079,NL 3564883080,3564883199,GB -3564883200,3564883455,NL -3564883456,3564886015,GB +3564883200,3564883967,NL +3564883968,3564886015,GB 3564886016,3564886527,NL 3564886528,3564886719,GB 3564886720,3564886751,NL -3564886752,3564888479,GB -3564888480,3564888495,NL -3564888496,3564888991,GB +3564886752,3564888991,GB 3564888992,3564889007,ES 3564889008,3564889633,GB 3564889634,3564889634,NL @@ -137524,8 +140455,9 @@ 3564892160,3564896255,NL 3564896256,3564904447,RU 3564904448,3564912639,DE -3564912640,3564915711,NL -3564915712,3564916735,IN +3564912640,3564914687,NL +3564914688,3564915711,GB +3564915712,3564916735,US 3564916736,3564917759,MX 3564917760,3564918783,US 3564918784,3564920831,IT @@ -137759,7 +140691,9 @@ 3567173632,3567239167,GB 3567239168,3567241215,NL 3567241472,3567255551,NL -3567255552,3567321087,PL +3567255552,3567263743,PL +3567263744,3567271935,ES +3567271936,3567321087,PL 3567321088,3567353855,GB 3567353856,3567386623,CH 3567386624,3567388351,GB @@ -137804,7 +140738,9 @@ 3567490048,3567490303,ES 3567490304,3567499007,GB 3567499008,3567499135,ES -3567499136,3567500543,GB +3567499136,3567499519,GB +3567499520,3567499775,ES +3567499776,3567500543,GB 3567500544,3567500799,ES 3567500800,3567502615,GB 3567502616,3567502623,ES @@ -137875,9 +140811,7 @@ 3568484352,3568486655,NL 3568486912,3568492543,NL 3568492544,3568500735,RS -3568500736,3568510975,IL -3568510976,3568511487,SY -3568511488,3568566271,IL +3568500736,3568566271,IL 3568566272,3568585471,FR 3568585728,3568599039,FR 3568599040,3568631807,PL @@ -138250,8 +141184,11 @@ 3572355072,3572356095,CH 3572356096,3572357119,GB 3572357120,3572358143,NL -3572358144,3572360191,GB -3572360192,3572361215,ES +3572358144,3572359167,GB +3572359168,3572360191,US +3572360192,3572360831,ES +3572360832,3572360895,MX +3572360896,3572361215,ES 3572361216,3572362239,LT 3572362240,3572363263,ES 3572363264,3572364287,RS @@ -138324,7 +141261,9 @@ 3574174840,3574174847,ES 3574174848,3574182904,GB 3574182905,3574182905,ES -3574182906,3574186799,GB +3574182906,3574183423,GB +3574183424,3574183679,ES +3574183680,3574186799,GB 3574186800,3574186815,ES 3574186816,3574187007,GB 3574187008,3574188031,ES @@ -138347,8 +141286,8 @@ 3574530208,3574530239,DE 3574530240,3574594559,SE 3574594560,3574595583,GB -3574595584,3574596863,GP -3574596864,3574597119,MQ +3574595584,3574596607,GP +3574596608,3574597119,MQ 3574597120,3574598655,GP 3574598656,3574599679,MQ 3574599680,3574603775,GP @@ -138361,7 +141300,9 @@ 3574792192,3574824959,CZ 3574824960,3574830079,GB 3574830080,3574831103,NL -3574831104,3574842367,GB +3574831104,3574841629,GB +3574841630,3574841630,NL +3574841631,3574842367,GB 3574842368,3574842623,NL 3574842624,3574857727,GB 3574857728,3574923263,DE @@ -138392,7 +141333,9 @@ 3575624960,3575631103,GB 3575631360,3575638181,GB 3575638183,3575644159,GB -3575644160,3575646975,FR +3575644160,3575646303,FR +3575646304,3575646319,ES +3575646320,3575646975,FR 3575646976,3575647231,GB 3575647232,3575648223,FR 3575648224,3575648255,PT @@ -138418,9 +141361,7 @@ 3575658304,3575658367,FI 3575658368,3575659007,FR 3575659008,3575659071,ES -3575659072,3575659167,FR -3575659168,3575659183,FI -3575659184,3575659863,FR +3575659072,3575659863,FR 3575659864,3575659867,GB 3575659868,3575660155,FR 3575660156,3575660159,GB @@ -138440,9 +141381,7 @@ 3575671616,3575671679,FI 3575671680,3575671855,FR 3575671856,3575671871,GB -3575671872,3575672879,FR -3575672880,3575672895,GB -3575672896,3575673087,FR +3575671872,3575673087,FR 3575673088,3575673343,GB 3575673344,3575676255,FR 3575676256,3575676271,GB @@ -138747,7 +141686,10 @@ 3578363904,3578396671,NL 3578396672,3578462207,TR 3578462208,3578527743,NL -3578527744,3578658815,PL +3578527744,3578576895,PL +3578576896,3578593279,ES +3578593280,3578626047,PL +3578626048,3578658815,ES 3578658816,3578724351,GB 3578724352,3578732543,RU 3578732544,3578740735,IE @@ -138921,7 +141863,9 @@ 3579838464,3580039167,ES 3580039168,3580039199,NL 3580039200,3580039231,AT -3580039232,3580039515,ES +3580039232,3580039247,ES +3580039248,3580039423,IT +3580039424,3580039515,ES 3580039516,3580039551,NL 3580039552,3580100607,ES 3580100608,3580108799,LV @@ -138934,7 +141878,9 @@ 3580135936,3580136447,SE 3580136448,3580141567,HR 3580141568,3580142591,LV -3580142592,3580149759,SE +3580142592,3580143615,SE +3580143616,3580145663,LV +3580145664,3580149759,SE 3580149760,3580166143,EE 3580166144,3580198911,SE 3580198912,3580199935,LV @@ -138944,8 +141890,7 @@ 3580203648,3580203775,AT 3580203776,3580204031,SE 3580204032,3580204543,LT -3580204544,3580205055,NL -3580205056,3580206079,SE +3580204544,3580206079,SE 3580206080,3580207103,HR 3580207104,3580208127,LV 3580208128,3580209151,EE @@ -138971,16 +141916,14 @@ 3580244992,3580246015,LT 3580246016,3580248063,LV 3580248064,3580254207,EE -3580254208,3580259327,LV -3580259328,3580260351,SE +3580254208,3580260351,LV 3580260352,3580265471,AT 3580265472,3580265727,SE 3580265728,3580268543,EE 3580268544,3580272639,LV 3580272640,3580280831,SE -3580280832,3580289023,NL -3580289024,3580297215,HR -3580297216,3580329983,NL +3580280832,3580297215,HR +3580297216,3580329983,SE 3580329984,3580338175,EE 3580338176,3580338687,SE 3580338688,3580339199,HR @@ -139022,9 +141965,7 @@ 3580698624,3580702719,PL 3580702720,3580706815,RU 3580706816,3580708863,KG -3580708864,3580709887,RU -3580709888,3580710399,US -3580710400,3580710911,RU +3580708864,3580710911,RU 3580710912,3580715007,UA 3580715008,3580719103,RU 3580719104,3580723199,NL @@ -139072,7 +142013,11 @@ 3582074880,3582077439,GB 3582077440,3582077471,DE 3582077472,3582083071,GB -3582083072,3582091263,BG +3582083072,3582085631,BG +3582085632,3582085887,DK +3582085888,3582087167,BG +3582087168,3582089215,DK +3582089216,3582091263,BG 3582091264,3582099455,QA 3582099456,3582107647,GB 3582107648,3582115839,NL @@ -139190,7 +142135,9 @@ 3582861312,3582869503,RU 3582869504,3582877695,NO 3582877696,3582885887,AT -3582885888,3582894079,TR +3582885888,3582892031,TR +3582892032,3582892543,US +3582892544,3582894079,TR 3582894080,3582902271,CH 3582902272,3582910463,RU 3582910464,3582916607,SI @@ -139337,8 +142284,7 @@ 3583959040,3583967231,NO 3583967232,3583969279,TR 3583969280,3583969791,FR -3583969792,3583970815,GB -3583970816,3583971327,US +3583969792,3583971327,US 3583971328,3583973887,NL 3583973888,3583974399,IT 3583974400,3583975423,TR @@ -139545,9 +142491,11 @@ 3585523712,3585531903,LV 3585531904,3585540095,AT 3585540096,3585548287,DE -3585548288,3585553151,RU -3585553152,3585553407,NL -3585553408,3585556479,RU +3585548288,3585550335,NL +3585550336,3585550399,DE +3585550400,3585553919,NL +3585553920,3585555007,RU +3585555008,3585556479,NL 3585556480,3585564671,DE 3585564672,3585572863,RU 3585572864,3585581055,IT @@ -139680,13 +142628,12 @@ 3586162688,3586179071,FI 3586179072,3586195455,ES 3586195456,3586203647,RU -3586203648,3586205695,KE +3586203648,3586205695,ZA 3586205696,3586207743,BW 3586207744,3586207999,ZA -3586208256,3586208767,ZA -3586208768,3586211071,KE +3586208256,3586211071,ZA 3586211072,3586211327,BW -3586211328,3586211839,KE +3586211328,3586211839,ZA 3586211840,3586228223,CH 3586228224,3586244607,BE 3586244608,3586246655,NL @@ -139706,7 +142653,9 @@ 3586342912,3586359295,ES 3586359296,3586375679,PL 3586375680,3586392063,CZ -3586392064,3586408447,NL +3586392064,3586405375,NL +3586405376,3586406399,RU +3586406400,3586408447,NL 3586408448,3586424831,BA 3586424832,3586441215,CH 3586441216,3586457599,DE @@ -139729,10 +142678,7 @@ 3586596864,3586605055,GB 3586605056,3586621439,SE 3586621696,3586625535,NL -3586625536,3586628095,GB -3586628096,3586628118,NL -3586628119,3586628119,GB -3586628120,3586628127,NL +3586625536,3586628127,GB 3586628128,3586628159,AT 3586628160,3586628191,IE 3586628192,3586628223,NL @@ -139741,15 +142687,17 @@ 3586628288,3586628319,GB 3586628320,3586628351,AT 3586628352,3586629631,GB -3586629632,3586634047,IE +3586629632,3586631935,IE +3586631936,3586632191,CN +3586632192,3586634047,IE 3586634048,3586634079,NL 3586634080,3586634783,IE 3586634784,3586634815,NL 3586634816,3586634847,IE 3586634848,3586634911,NL 3586634912,3586634943,FI -3586634944,3586635263,NL -3586635264,3586635519,IE +3586634944,3586635007,NL +3586635008,3586635519,IE 3586635520,3586635775,NL 3586635776,3586637823,IE 3586637824,3586654207,PL @@ -139798,15 +142746,19 @@ 3586850816,3586867199,NO 3586867200,3586883583,FR 3586883584,3586899967,IT -3586899968,3586911007,DE -3586911008,3586911039,BE -3586911040,3586916351,DE +3586899968,3586910207,DE +3586910208,3586910719,NL +3586910720,3586911231,BE +3586911232,3586916351,DE 3586916352,3586924543,IT 3586924544,3586925695,FI 3586925696,3586925759,AX 3586925760,3586925823,FI 3586925824,3586926079,SE -3586926080,3586932735,FI +3586926080,3586926591,FI +3586926592,3586929663,AX +3586929664,3586930687,FI +3586930688,3586932735,AX 3586932736,3586949119,LB 3586949120,3586965503,SE 3586965504,3586981887,NL @@ -139836,7 +142788,8 @@ 3587194880,3587211263,GB 3587211264,3587219455,AT 3587219456,3587227647,RU -3587227648,3587231231,GB +3587227648,3587227648,NL +3587227649,3587231231,GB 3587231232,3587231263,NL 3587231264,3587233087,GB 3587233088,3587233095,NL @@ -139858,7 +142811,12 @@ 3587242672,3587242679,NL 3587242680,3587244031,GB 3587244032,3587260415,IT -3587260416,3587284991,DE +3587260416,3587278591,DE +3587278592,3587279359,PT +3587279360,3587279615,DE +3587279616,3587280383,PT +3587280384,3587281151,DE +3587281152,3587284991,PT 3587291136,3587292159,FR 3587293184,3587309567,IT 3587309568,3587325951,GB @@ -139868,7 +142826,11 @@ 3587375104,3587383295,TR 3587383296,3587391487,CZ 3587391488,3587407871,KZ -3587407872,3587420159,BE +3587407872,3587408127,BE +3587408128,3587408383,NL +3587408384,3587415039,BE +3587415040,3587415807,NL +3587415808,3587420159,BE 3587420160,3587421183,NL 3587421184,3587421439,BE 3587421440,3587423743,NL @@ -139983,7 +142945,19 @@ 3588751360,3588767743,TR 3588779648,3588779775,GB 3588784128,3588800511,CH -3588800512,3588816895,RU +3588800512,3588801535,RU +3588801536,3588802047,KZ +3588802048,3588802815,RU +3588802816,3588803071,KZ +3588803072,3588807167,RU +3588807168,3588808959,KZ +3588808960,3588810239,RU +3588810240,3588810751,KZ +3588810752,3588813311,RU +3588813312,3588814079,KZ +3588814080,3588814335,RU +3588814336,3588814847,KZ +3588814848,3588816895,RU 3588816896,3588833279,IT 3588833280,3588849663,RO 3588849664,3588857855,IE @@ -140078,14 +143052,18 @@ 3589722032,3589734399,BE 3589734400,3589738495,ZA 3589738496,3589739519,EG -3589739520,3589742591,ZA +3589739520,3589740543,GB +3589740544,3589742591,ZA 3589742592,3589746175,NL 3589746176,3589746687,US 3589746688,3589767167,NL 3589767168,3589810431,RU 3589810432,3589810687,PL 3589810688,3589816319,RU -3589825792,3589826047,DE +3589819562,3589819563,GB +3589825792,3589825807,DE +3589825808,3589825809,US +3589825810,3589826047,DE 3589826718,3589826718,AT 3589827584,3589827647,DE 3589827712,3589827839,DE @@ -140097,7 +143075,13 @@ 3589849088,3589865471,GB 3589865472,3589881855,GR 3589881856,3589890047,NL -3589890048,3589931007,GB +3589890048,3589904639,GB +3589904640,3589905151,KZ +3589905152,3589905407,GB +3589905408,3589905663,KZ +3589905664,3589905919,GB +3589905920,3589906175,KZ +3589906176,3589931007,GB 3589931008,3589947391,SI 3589947392,3589963775,FI 3589963776,3589980159,ES @@ -140112,7 +143096,9 @@ 3589999032,3589999039,DE 3589999040,3590000191,GB 3590000192,3590000207,DE -3590000208,3590005055,GB +3590000208,3590001967,GB +3590001968,3590001983,IT +3590001984,3590005055,GB 3590005056,3590005071,DE 3590005072,3590005119,GB 3590005120,3590005135,IT @@ -140214,8 +143200,8 @@ 3624257536,3624271871,US 3624271872,3624272383,SY 3624272384,3624272447,US -3624272448,3624272451,CA -3624272452,3624272639,US +3624272448,3624272455,CA +3624272456,3624272639,US 3624272640,3624272895,DZ 3624272896,3624281087,US 3624281088,3624281343,HT @@ -140284,11 +143270,17 @@ 3624480768,3624484863,CA 3624484864,3624525823,US 3624529920,3624534015,CA -3624534016,3624587263,US +3624534016,3624536063,US +3624536064,3624538111,IL +3624538112,3624540671,US +3624540672,3624541183,GB +3624541184,3624587263,US 3624587264,3624591359,JM 3624591360,3624592383,US 3624592384,3624593919,CA -3624593920,3624714239,US +3624593920,3624595455,US +3624595456,3624599551,IN +3624599552,3624714239,US 3624714240,3624722431,SG 3624722432,3624730623,US 3624730624,3624796159,CA @@ -140318,18 +143310,18 @@ 3625295872,3625346047,US 3625346048,3625346303,AR 3625346304,3625418751,US -3625418752,3625420031,CA -3625420032,3625420543,US -3625420544,3625422591,CA -3625422592,3625422847,US -3625422848,3625426943,CA +3625418752,3625426943,CA 3625426944,3625508863,US 3625508864,3625512959,CA 3625512960,3625631743,US 3625631744,3625639935,CA -3625639936,3626091519,US +3625639936,3625959423,US +3625959424,3625963519,GB +3625963520,3626091519,US 3626091520,3626092031,AR -3626092032,3626234111,US +3626092032,3626233655,US +3626233656,3626233663,GB +3626233664,3626234111,US 3626234112,3626234367,GB 3626234368,3626270719,US 3626270720,3626287103,CA @@ -140350,7 +143342,8 @@ 3626926080,3626934271,CA 3626934272,3627044863,US 3627044864,3627048959,CA -3627053056,3627065343,US +3627048960,3627049983,AG +3627049984,3627065343,US 3627065344,3627069439,CA 3627069440,3627220223,US 3627220224,3627220479,CA @@ -140454,7 +143447,12 @@ 3628657920,3628658175,BS 3628658176,3628679167,US 3628679168,3628683263,CA -3628683264,3628834815,US +3628683264,3628744703,US +3628744704,3628746751,IL +3628746752,3628747775,US +3628747776,3628748287,LU +3628748288,3628748799,AU +3628748800,3628834815,US 3628834816,3628843007,CA 3628843008,3628848639,US 3628848896,3629187071,US @@ -140472,8 +143470,8 @@ 3629201936,3629201939,US 3629201940,3629202103,CA 3629202104,3629202107,US -3629202108,3629203199,CA -3629203200,3629318143,US +3629202108,3629203455,CA +3629203456,3629318143,US 3629318144,3629326335,CA 3629326336,3629539327,US 3629539328,3629547519,CA @@ -140582,9 +143580,9 @@ 3630102784,3630103807,CA 3630103808,3630104063,US 3630104064,3630104575,CA -3630104576,3630141951,US -3630141952,3630142207,CA -3630142208,3630148095,US +3630104576,3630137343,US +3630137344,3630145535,CA +3630145536,3630148095,US 3630148096,3630148607,CA 3630148608,3630148863,US 3630148864,3630149119,CA @@ -140592,11 +143590,9 @@ 3630151680,3630152191,CA 3630152192,3630152703,US 3630152704,3630152959,CA -3630152960,3630156287,US -3630156288,3630156543,CA -3630156544,3630157311,US -3630157312,3630157567,CA -3630157568,3630159615,US +3630152960,3630153727,US +3630153728,3630157823,CA +3630157824,3630159615,US 3630159616,3630159871,CA 3630159872,3630160127,US 3630160128,3630160383,CA @@ -140612,9 +143608,11 @@ 3630165504,3630166015,CA 3630166016,3630169855,US 3630169856,3630170111,CA -3630170112,3630309375,US +3630170112,3630313471,US 3630313472,3630317567,CA -3630317568,3630375423,US +3630317568,3630354431,US +3630354432,3630358527,BR +3630358528,3630375423,US 3630375424,3630383103,CA 3630383104,3630391295,US 3630391296,3630395391,CA @@ -140637,14 +143635,11 @@ 3630850048,3630854143,CA 3630854144,3630866431,US 3630866432,3630870527,GT -3630870528,3630895103,US -3630895104,3630895104,GB -3630895105,3630895615,US +3630870528,3630895615,US 3630895616,3630895871,CA 3630895872,3630897407,US 3630897408,3630897408,GB -3630897409,3630897663,CA -3630897664,3630900735,US +3630897409,3630900735,US 3630900736,3630900991,CA 3630900992,3630905599,US 3630905600,3630905855,CA @@ -140725,7 +143720,7 @@ 3632881664,3632889855,CA 3632889856,3632898047,US 3632898048,3632902143,CA -3632906240,3632971775,US +3632902144,3632971775,US 3632971776,3632988159,CA 3632988160,3633029119,US 3633029120,3633029631,PY @@ -140779,9 +143774,7 @@ 3633885184,3633889279,US 3633889280,3633893375,CA 3633893376,3633971199,US -3633971200,3633974527,CA -3633974528,3633974783,US -3633974784,3634020351,CA +3633971200,3634020351,CA 3634020352,3634037247,US 3634037248,3634037759,CA 3634037760,3634040063,US @@ -140813,14 +143806,14 @@ 3634749440,3634880511,US 3634880512,3634888703,CA 3634888704,3634913279,US -3634913280,3634914815,CA -3634914816,3634915071,US -3634915072,3634915663,CA +3634913280,3634915663,CA 3634915664,3634915679,US 3634915680,3634921471,CA 3634921472,3634925567,US 3634925568,3634929663,CA -3634929664,3635044351,US +3634929664,3635015935,US +3635015936,3635016191,CA +3635016192,3635044351,US 3635048448,3635051103,US 3635051104,3635051119,CA 3635051120,3635051439,US @@ -140831,10 +143824,10 @@ 3635142656,3635146751,CA 3635146752,3635159039,US 3635159040,3635163135,CA -3635163136,3635167487,US +3635163136,3635167231,US +3635167232,3635167487,NL 3635167488,3635167743,ES -3635167744,3635167999,IT -3635168000,3635171071,US +3635167744,3635171071,NL 3635171072,3635171327,CA 3635171328,3635187967,US 3635187968,3635188223,CN @@ -141006,7 +143999,9 @@ 3637665792,3637669887,CA 3637669888,3637706751,US 3637706752,3637739519,CA -3637739520,3638165503,US +3637739520,3637821439,US +3637821440,3637829631,CA +3637829632,3638165503,US 3638165504,3638181887,CA 3638181888,3638214399,US 3638214400,3638214655,GR @@ -141026,7 +144021,11 @@ 3638399744,3638399999,CH 3638400000,3638401087,US 3638401088,3638401119,CA -3638401120,3638500125,US +3638401120,3638401151,US +3638401152,3638401423,CA +3638401424,3638401443,US +3638401444,3638403071,CA +3638403072,3638500125,US 3638500126,3638500126,CA 3638500127,3638509567,US 3638509568,3638534143,CA @@ -141034,7 +144033,9 @@ 3638697984,3638706175,CA 3638706176,3638874111,US 3638874112,3638878207,CA -3638878208,3638898943,US +3638878208,3638880511,US +3638880512,3638880767,CA +3638880768,3638898943,US 3638898944,3638899455,MX 3638899456,3638984703,US 3638984704,3638992895,GT @@ -141091,9 +144092,7 @@ 3639400448,3639401471,RS 3639401472,3639402239,US 3639402240,3639402495,GH -3639402496,3639513239,US -3639513240,3639513243,AE -3639513244,3639525375,US +3639402496,3639525375,US 3639529472,3639533567,US 3639533568,3639537663,CA 3639537664,3639550207,US @@ -141126,9 +144125,7 @@ 3639593984,3639595007,GB 3639595008,3639607295,US 3639607296,3639611391,CA -3639611392,3639656447,US -3639656448,3639660543,CA -3639660544,3639664639,US +3639611392,3639664639,US 3639664640,3639668735,CA 3639668736,3639672831,US 3639672832,3639681023,CL @@ -141139,6 +144136,7 @@ 3639692288,3639704573,US 3639704574,3639704574,GB 3639704575,3639730175,US +3639730176,3639734271,CA 3639734272,3639736575,US 3639736576,3639736831,HK 3639736832,3639737343,US @@ -141147,7 +144145,98 @@ 3639737375,3639737599,GB 3639737600,3639737629,US 3639737630,3639737630,GB -3639737631,3639902207,US +3639737631,3639887815,US +3639887816,3639887831,CA +3639887832,3639888351,US +3639888352,3639888359,CA +3639888360,3639888687,US +3639888688,3639888695,CA +3639888696,3639888719,US +3639888720,3639888727,CA +3639888728,3639888767,US +3639888768,3639888775,CA +3639888776,3639888967,US +3639888968,3639888975,CA +3639888976,3639889047,US +3639889048,3639889055,CA +3639889056,3639889063,US +3639889064,3639889071,CA +3639889072,3639889471,US +3639889472,3639889479,CA +3639889480,3639889487,US +3639889488,3639889495,CA +3639889496,3639889647,US +3639889648,3639889655,CA +3639889656,3639889767,US +3639889768,3639889775,CA +3639889776,3639889783,US +3639889784,3639889791,CA +3639889792,3639889815,US +3639889816,3639889823,CA +3639889824,3639889943,US +3639889944,3639889951,CA +3639889952,3639889991,US +3639889992,3639889999,CA +3639890000,3639890055,US +3639890056,3639890063,CA +3639890064,3639890079,US +3639890080,3639890095,CA +3639890096,3639890135,US +3639890136,3639890143,CA +3639890144,3639890239,US +3639890240,3639890247,CA +3639890248,3639890263,US +3639890264,3639890271,CA +3639890272,3639890311,US +3639890312,3639890327,CA +3639890328,3639890399,US +3639890400,3639890415,CA +3639890416,3639890447,US +3639890448,3639890455,CA +3639890456,3639890535,US +3639890536,3639890559,CA +3639890560,3639890607,US +3639890608,3639890623,CA +3639890624,3639890799,US +3639890800,3639890815,CA +3639890816,3639890863,US +3639890864,3639890871,CA +3639890872,3639890887,US +3639890888,3639890903,CA +3639890904,3639890919,US +3639890920,3639890935,CA +3639890936,3639891063,US +3639891064,3639891071,CA +3639891072,3639891127,US +3639891128,3639891135,CA +3639891136,3639891143,US +3639891144,3639891151,CA +3639891152,3639891159,US +3639891160,3639891167,CA +3639891168,3639891359,US +3639891360,3639891367,CA +3639891368,3639891447,US +3639891448,3639891455,CA +3639891456,3639891567,US +3639891568,3639891575,CA +3639891576,3639891623,US +3639891624,3639891639,CA +3639891640,3639891767,US +3639891768,3639891775,CA +3639891776,3639891799,US +3639891800,3639891807,CA +3639891808,3639891847,US +3639891848,3639891855,CA +3639891856,3639891911,US +3639891912,3639891919,CA +3639891920,3639893471,US +3639893472,3639893487,CA +3639893488,3639893495,US +3639893496,3639893503,CA +3639893504,3639893759,ID +3639893760,3639893855,US +3639893856,3639893863,CA +3639893864,3639902207,US 3639902208,3639918591,PE 3639918592,3639934975,AR 3639934976,3640023079,US @@ -141159,9 +144248,12 @@ 3640201216,3640205311,US 3640205312,3640209407,BM 3640209408,3640213503,CA -3640213504,3640288255,US +3640213504,3640287231,US +3640287232,3640287743,HK +3640287744,3640288255,US 3640288256,3640289279,PH -3640289280,3640291327,HK +3640289280,3640290303,HK +3640290304,3640291327,CN 3640291328,3640312319,US 3640312320,3640312575,NI 3640312576,3640312831,US @@ -141355,7 +144447,9 @@ 3641888768,3641892863,IT 3641892864,3641896959,ES 3641896960,3641901055,BG -3641901056,3641905151,RO +3641901056,3641901311,RO +3641901312,3641901567,US +3641901568,3641905151,RO 3641905152,3641909247,NL 3641909248,3641913343,AT 3641913344,3641917439,FR @@ -141408,19 +144502,21 @@ 3642032128,3642036223,PS 3642036224,3642040319,HU 3642040320,3642048511,BY -3642048512,3642048767,IL +3642048512,3642048767,US 3642048768,3642049023,DE 3642049024,3642049279,CH 3642049280,3642049535,NO -3642049536,3642050047,GB +3642049536,3642049791,SE +3642049792,3642050047,FI 3642050048,3642050303,FR 3642050304,3642050559,GB 3642050560,3642050815,ES 3642050816,3642051071,IT 3642051072,3642051327,CA -3642051328,3642051583,JP +3642051328,3642051583,US 3642051584,3642051839,TR -3642051840,3642056703,GB +3642051840,3642054399,DE +3642054400,3642056703,US 3642056704,3642060799,RU 3642060800,3642064895,KE 3642064896,3642068991,IT @@ -141453,7 +144549,7 @@ 3642118144,3642122239,GB 3642122240,3642126335,ES 3642126336,3642130431,IL -3642130432,3642134527,DE +3642130432,3642134527,CH 3642134528,3642138623,GB 3642138624,3642142719,RU 3642142720,3642146815,MT @@ -141564,10 +144660,10 @@ 3642535936,3642540031,IS 3642540032,3642544127,SE 3642544128,3642552319,RU -3642552320,3642553855,UA -3642553856,3642553936,RU -3642553937,3642553937,US -3642553938,3642554367,RU +3642552320,3642553343,UA +3642553344,3642553599,RU +3642553600,3642553855,UA +3642553856,3642554367,RU 3642554368,3642554623,LT 3642554624,3642554720,UA 3642554721,3642554721,LV @@ -141588,7 +144684,6 @@ 3642609664,3642613759,ZA 3642613760,3642617855,FI 3642617856,3642621951,JO -3642621952,3642626047,IT 3642626048,3642628607,BE 3642628864,3642630143,BE 3642630144,3642634239,DK @@ -142222,9 +145317,7 @@ 3645764052,3645764052,FR 3645764053,3645764055,DE 3645764056,3645764056,BE -3645764057,3645764057,DE -3645764058,3645764058,TR -3645764059,3645764059,DE +3645764057,3645764059,DE 3645764060,3645764060,FR 3645764061,3645764061,IT 3645764062,3645764062,SE @@ -142777,8 +145870,9 @@ 3647965696,3647965951,CH 3647965952,3647966207,DE 3647966208,3647967231,GB -3647967232,3647968255,BE -3647968256,3647968895,DE +3647967232,3647967759,DE +3647967760,3647967775,BE +3647967776,3647968895,DE 3647968896,3647968911,FR 3647968912,3647969327,DE 3647969328,3647969335,IT @@ -142837,7 +145931,9 @@ 3647994880,3647995391,BE 3647995392,3647995903,DE 3647995904,3648004095,RU -3648004096,3648007167,GB +3648004096,3648004837,GB +3648004838,3648004838,RU +3648004839,3648007167,GB 3648007168,3648007679,US 3648007680,3648007935,RU 3648007936,3648008191,GB @@ -142979,7 +146075,9 @@ 3648512000,3648516095,NL 3648516096,3648519167,RS 3648519168,3648520191,MK -3648520192,3648747227,NL +3648520192,3648745820,NL +3648745821,3648745821,US +3648745822,3648747227,NL 3648747228,3648747228,US 3648747229,3648747229,NL 3648747230,3648747230,US @@ -143202,8 +146300,8 @@ 3650921391,3650922799,GB 3650922800,3650922815,FR 3650922816,3650926591,GB -3650926592,3650929663,ES -3650929664,3650929831,GB +3650926592,3650928639,ES +3650928640,3650929831,GB 3650929832,3650929839,DK 3650929840,3650929847,BE 3650929848,3650929855,FR @@ -143317,8 +146415,10 @@ 3651870720,3651874815,IT 3651874816,3651878911,PL 3651878912,3651883007,IT -3651883008,3651884287,CD -3651884288,3651885839,BE +3651883008,3651884543,CD +3651884544,3651885055,BE +3651885056,3651885311,CD +3651885312,3651885839,BE 3651885840,3651885843,CD 3651885844,3651887103,BE 3651887104,3651891199,GB @@ -143342,8 +146442,7 @@ 3651944448,3651948543,ES 3651948544,3651952639,FO 3651952640,3651954175,AE -3651954176,3651958783,IR -3651958784,3651960831,AE +3651954176,3651960831,IR 3651960832,3651964927,GB 3651964928,3651969023,SK 3651969024,3651977215,DE @@ -143392,7 +146491,103 @@ 3652173824,3652177919,AT 3652177920,3652182015,CY 3652182016,3652190207,DE -3652190208,3652648959,GB +3652190208,3652583423,GB +3652583424,3652583487,FR +3652583488,3652583503,NL +3652583504,3652583551,FR +3652583552,3652583583,FI +3652583584,3652584447,FR +3652584448,3652584575,GB +3652584576,3652584639,IE +3652584640,3652584895,FR +3652584896,3652584927,PT +3652584928,3652584959,FR +3652584960,3652585023,ES +3652585024,3652585087,FR +3652585088,3652585151,ES +3652585152,3652585791,FR +3652585792,3652585823,FI +3652585824,3652585983,FR +3652585984,3652586047,ES +3652586048,3652590783,FR +3652590784,3652590847,ES +3652590848,3652591615,FR +3652591616,3652591743,GB +3652591744,3652593023,FR +3652593024,3652593055,PT +3652593056,3652593215,FR +3652593216,3652593279,IE +3652593280,3652593407,FR +3652593408,3652593471,ES +3652593472,3652593631,FR +3652593632,3652593663,PT +3652593664,3652596479,FR +3652596480,3652596543,ES +3652596544,3652597887,FR +3652597888,3652597903,GB +3652597904,3652608191,FR +3652608192,3652608223,PT +3652608224,3652609023,FR +3652609024,3652609279,GB +3652609280,3652609503,FR +3652609504,3652609535,FI +3652609536,3652609919,FR +3652609920,3652609983,ES +3652609984,3652611231,FR +3652611232,3652611263,PT +3652611264,3652611679,FR +3652611680,3652611711,PT +3652611712,3652612223,FR +3652612224,3652612287,ES +3652612288,3652612351,FR +3652612352,3652612479,GB +3652612480,3652612543,IE +3652612544,3652613375,FR +3652613376,3652613407,FI +3652613408,3652620671,FR +3652620672,3652620735,PT +3652620736,3652620799,FR +3652620800,3652620831,PT +3652620832,3652621375,FR +3652621376,3652621439,ES +3652621440,3652622271,FR +3652622272,3652622335,GB +3652622336,3652631807,FR +3652631808,3652631823,GB +3652631824,3652638655,FR +3652638656,3652638719,ES +3652638720,3652638815,FR +3652638816,3652638847,FI +3652638848,3652638975,GB +3652638976,3652640575,FR +3652640576,3652640703,GB +3652640704,3652640767,FR +3652640768,3652640831,ES +3652640832,3652641727,FR +3652641728,3652641791,GB +3652641792,3652642111,FR +3652642112,3652642175,IE +3652642176,3652642367,FR +3652642368,3652642431,GB +3652642432,3652642719,FR +3652642720,3652642751,PT +3652642752,3652643583,FR +3652643584,3652643647,ES +3652643648,3652644199,FR +3652644200,3652644215,ES +3652644216,3652644247,FR +3652644248,3652644255,ES +3652644256,3652644351,FR +3652644352,3652644383,FI +3652644384,3652645119,FR +3652645120,3652645503,GB +3652645504,3652645663,FR +3652645664,3652645695,FI +3652645696,3652646015,FR +3652646016,3652646079,ES +3652646080,3652646655,FR +3652646656,3652646719,ES +3652646720,3652648959,FR 3652648960,3652714495,IE 3652714496,3653238783,DE 3653238784,3653369855,CH @@ -143769,7 +146964,9 @@ 3715653632,3715655679,BD 3715655680,3715657727,IN 3715657728,3715661823,SG -3715661824,3715672063,AU +3715661824,3715665919,AU +3715665920,3715666175,GB +3715666176,3715672063,AU 3715672064,3715674111,JP 3715674112,3715678207,HK 3715678208,3715694591,PK diff --git a/src/config/geoip6 b/src/config/geoip6 index 70c6f965c6..529dc8f8f3 100644 --- a/src/config/geoip6 +++ b/src/config/geoip6 @@ -1,4 +1,4 @@ -# Last updated based on February 8 2017 Maxmind GeoLite2 Country +# Last updated based on May 2 2017 Maxmind GeoLite2 Country # wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz # gunzip GeoLite2-Country.mmdb.gz # python mmdb-convert.py GeoLite2-Country.mmdb @@ -177,15 +177,25 @@ 2001:470:1f0b:11d3::,2001:470:1f14:ffff:ffff:ffff:ffff:ffff,US 2001:470:1f15::,2001:470:1f15:b3:ffff:ffff:ffff:ffff,RU 2001:470:1f15:b4::,2001:470:1f15:b4:ffff:ffff:ffff:ffff,NL -2001:470:1f15:b5::,2001:470:1f15:44f:ffff:ffff:ffff:ffff,RU +2001:470:1f15:b5::,2001:470:1f15:16b:ffff:ffff:ffff:ffff,RU +2001:470:1f15:16c::,2001:470:1f15:16c:ffff:ffff:ffff:ffff,NL +2001:470:1f15:16d::,2001:470:1f15:44f:ffff:ffff:ffff:ffff,RU 2001:470:1f15:450::,2001:470:1f15:450:ffff:ffff:ffff:ffff,NL -2001:470:1f15:451::,2001:470:1f15:5ab:ffff:ffff:ffff:ffff,RU +2001:470:1f15:451::,2001:470:1f15:500:ffff:ffff:ffff:ffff,RU +2001:470:1f15:501::,2001:470:1f15:501:ffff:ffff:ffff:ffff,NL +2001:470:1f15:502::,2001:470:1f15:582:ffff:ffff:ffff:ffff,RU +2001:470:1f15:583::,2001:470:1f15:583:ffff:ffff:ffff:ffff,NL +2001:470:1f15:584::,2001:470:1f15:5ab:ffff:ffff:ffff:ffff,RU 2001:470:1f15:5ac::,2001:470:1f15:5ac:ffff:ffff:ffff:ffff,NL 2001:470:1f15:5ad::,2001:470:1f15:9c5:ffff:ffff:ffff:ffff,RU 2001:470:1f15:9c6::,2001:470:1f15:9c6:ffff:ffff:ffff:ffff,AT 2001:470:1f15:9c7::,2001:470:1f15:a5e:ffff:ffff:ffff:ffff,RU 2001:470:1f15:a5f::,2001:470:1f15:a60:ffff:ffff:ffff:ffff,NL -2001:470:1f15:a61::,2001:470:1f15:110b:ffff:ffff:ffff:ffff,RU +2001:470:1f15:a61::,2001:470:1f15:b25:ffff:ffff:ffff:ffff,RU +2001:470:1f15:b26::,2001:470:1f15:b26:ffff:ffff:ffff:ffff,NL +2001:470:1f15:b27::,2001:470:1f15:10db:ffff:ffff:ffff:ffff,RU +2001:470:1f15:10dc::,2001:470:1f15:10dc:ffff:ffff:ffff:ffff,NL +2001:470:1f15:10dd::,2001:470:1f15:110b:ffff:ffff:ffff:ffff,RU 2001:470:1f15:110c::,2001:470:1f15:110c:ffff:ffff:ffff:ffff,BE 2001:470:1f15:110d::,2001:470:1f15:7fff:ffff:ffff:ffff:ffff,RU 2001:470:1f15:8000::,2001:470:1f1c:ffff:ffff:ffff:ffff:ffff,US @@ -252,15 +262,21 @@ 2001:470:785a::,2001:470:785a:ffff:ffff:ffff:ffff:ffff,AT 2001:470:785b::,2001:470:7a99:ffff:ffff:ffff:ffff:ffff,US 2001:470:7a9a::,2001:470:7a9a:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7a9b::,2001:470:7ba6:ffff:ffff:ffff:ffff:ffff,US +2001:470:7a9b::,2001:470:7ad5:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ad6::,2001:470:7ad6:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7ad7::,2001:470:7ba6:ffff:ffff:ffff:ffff:ffff,US 2001:470:7ba7::,2001:470:7ba7:7fff:ffff:ffff:ffff:ffff,NL 2001:470:7ba7:8000::,2001:470:7baf:ffff:ffff:ffff:ffff:ffff,US 2001:470:7bb0::,2001:470:7bb0:7fff:ffff:ffff:ffff:ffff,BE 2001:470:7bb0:8000::,2001:470:7bbf:ffff:ffff:ffff:ffff:ffff,US 2001:470:7bc0::,2001:470:7bc0:ffff:ffff:ffff:ffff:ffff,NL -2001:470:7bc1::,2001:470:7e38:ffff:ffff:ffff:ffff:ffff,US +2001:470:7bc1::,2001:470:7d6a:ffff:ffff:ffff:ffff:ffff,US +2001:470:7d6b::,2001:470:7d6b:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7d6c::,2001:470:7e38:ffff:ffff:ffff:ffff:ffff,US 2001:470:7e39::,2001:470:7e39:7fff:ffff:ffff:ffff:ffff,NL -2001:470:7e39:8000::,2001:470:8091:ffff:ffff:ffff:ffff:ffff,US +2001:470:7e39:8000::,2001:470:7ea5:ffff:ffff:ffff:ffff:ffff,US +2001:470:7ea6::,2001:470:7ea6:ffff:ffff:ffff:ffff:ffff,NL +2001:470:7ea7::,2001:470:8091:ffff:ffff:ffff:ffff:ffff,US 2001:470:8092::,2001:470:8092:7fff:ffff:ffff:ffff:ffff,CN 2001:470:8092:8000::,2001:470:80b6:ffff:ffff:ffff:ffff:ffff,US 2001:470:80b7::,2001:470:80b7:7fff:ffff:ffff:ffff:ffff,CN @@ -294,7 +310,9 @@ 2001:470:cd93:8000::,2001:470:cd93:ffff:ffff:ffff:ffff:ffff,FR 2001:470:cd94::,2001:470:d6b8:ffff:ffff:ffff:ffff:ffff,US 2001:470:d6b9::,2001:470:d6b9:7fff:ffff:ffff:ffff:ffff,RU -2001:470:d6b9:8000::,2001:470:da01:ffff:ffff:ffff:ffff:ffff,US +2001:470:d6b9:8000::,2001:470:d6ee:ffff:ffff:ffff:ffff:ffff,US +2001:470:d6ef::,2001:470:d6ef:ffff:ffff:ffff:ffff:ffff,FR +2001:470:d6f0::,2001:470:da01:ffff:ffff:ffff:ffff:ffff,US 2001:470:da02::,2001:470:da02:7fff:ffff:ffff:ffff:ffff,AR 2001:470:da02:8000::,2001:470:dc5c:ffff:ffff:ffff:ffff:ffff,US 2001:470:dc5d::,2001:470:dc5d:7fff:ffff:ffff:ffff:ffff,SE @@ -459,6 +477,7 @@ 2001:504:60::,2001:504:62:ffff:ffff:ffff:ffff:ffff,US 2001:504:63::,2001:504:63:ffff:ffff:ffff:ffff:ffff,DM 2001:504:64::,2001:504:68:ffff:ffff:ffff:ffff:ffff,US +2001:504:69::,2001:504:69:ffff:ffff:ffff:ffff:ffff,CA 2001:506::,2001:506:1:ffff:ffff:ffff:ffff:ffff,US 2001:506:8::,2001:506:8:ffff:ffff:ffff:ffff:ffff,US 2001:506:20::,2001:506:20:ffff:ffff:ffff:ffff:ffff,CA @@ -491,7 +510,9 @@ 2001:580::,2001:580:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:590::,2001:590:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:598::,2001:598:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:5a0::,2001:5a0:36ff:ffff:ffff:ffff:ffff:ffff,US +2001:5a0::,2001:5a0:3600:ffff:ffff:ffff:ffff:ffff,US +2001:5a0:3601::,2001:5a0:3601:ffff:ffff:ffff:ffff:ffff,CA +2001:5a0:3602::,2001:5a0:36ff:ffff:ffff:ffff:ffff:ffff,US 2001:5a0:3700::,2001:5a0:3700:ff:ffff:ffff:ffff:ffff,CA 2001:5a0:3700:100::,2001:5a0:3700:ffff:ffff:ffff:ffff:ffff,US 2001:5a0:3701::,2001:5a0:3701:ffff:ffff:ffff:ffff:ffff,CA @@ -573,6 +594,7 @@ 2001:678:9c::,2001:678:9c:ffff:ffff:ffff:ffff:ffff,SK 2001:678:a0::,2001:678:a0:ffff:ffff:ffff:ffff:ffff,FI 2001:678:a4::,2001:678:a4:ffff:ffff:ffff:ffff:ffff,AT +2001:678:a8::,2001:678:a8:ffff:ffff:ffff:ffff:ffff,DE 2001:678:ac::,2001:678:ac:ffff:ffff:ffff:ffff:ffff,SE 2001:678:b0::,2001:678:b3:ffff:ffff:ffff:ffff:ffff,IR 2001:678:c0::,2001:678:c0:ffff:ffff:ffff:ffff:ffff,DE @@ -750,6 +772,48 @@ 2001:678:384::,2001:678:384:ffff:ffff:ffff:ffff:ffff,RU 2001:678:388::,2001:678:388:ffff:ffff:ffff:ffff:ffff,PL 2001:678:38c::,2001:678:38c:ffff:ffff:ffff:ffff:ffff,PL +2001:678:390::,2001:678:390:ffff:ffff:ffff:ffff:ffff,NL +2001:678:394::,2001:678:394:ffff:ffff:ffff:ffff:ffff,SE +2001:678:398::,2001:678:398:ffff:ffff:ffff:ffff:ffff,CZ +2001:678:39c::,2001:678:39c:ffff:ffff:ffff:ffff:ffff,SA +2001:678:3a0::,2001:678:3a0:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3a4::,2001:678:3a4:ffff:ffff:ffff:ffff:ffff,SE +2001:678:3a8::,2001:678:3a8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3ac::,2001:678:3ac:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3b0::,2001:678:3b0:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3b4::,2001:678:3b4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3b8::,2001:678:3b8:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3bc::,2001:678:3bc:ffff:ffff:ffff:ffff:ffff,FR +2001:678:3c0::,2001:678:3c0:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3c4::,2001:678:3c4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3c8::,2001:678:3c8:ffff:ffff:ffff:ffff:ffff,GR +2001:678:3cc::,2001:678:3cc:ffff:ffff:ffff:ffff:ffff,FR +2001:678:3d0::,2001:678:3d0:ffff:ffff:ffff:ffff:ffff,RU +2001:678:3d4::,2001:678:3d4:ffff:ffff:ffff:ffff:ffff,NL +2001:678:3d8::,2001:678:3d8:ffff:ffff:ffff:ffff:ffff,GB +2001:678:3dc::,2001:678:3dc:ffff:ffff:ffff:ffff:ffff,AT +2001:678:3e0::,2001:678:3e0:ffff:ffff:ffff:ffff:ffff,NL +2001:678:3e4::,2001:678:3e4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3e8::,2001:678:3e8:ffff:ffff:ffff:ffff:ffff,PL +2001:678:3ec::,2001:678:3ec:ffff:ffff:ffff:ffff:ffff,SE +2001:678:3f0::,2001:678:3f0:ffff:ffff:ffff:ffff:ffff,NO +2001:678:3f4::,2001:678:3f4:ffff:ffff:ffff:ffff:ffff,DE +2001:678:3f8::,2001:678:3f8:ffff:ffff:ffff:ffff:ffff,UA +2001:678:3fc::,2001:678:3fc:ffff:ffff:ffff:ffff:ffff,FR +2001:678:400::,2001:678:400:ffff:ffff:ffff:ffff:ffff,DE +2001:678:404::,2001:678:404:ffff:ffff:ffff:ffff:ffff,RS +2001:678:408::,2001:678:408:ffff:ffff:ffff:ffff:ffff,ME +2001:678:40c::,2001:678:40c:ffff:ffff:ffff:ffff:ffff,RU +2001:678:410::,2001:678:410:ffff:ffff:ffff:ffff:ffff,RU +2001:678:414::,2001:678:414:ffff:ffff:ffff:ffff:ffff,DE +2001:678:418::,2001:678:418:ffff:ffff:ffff:ffff:ffff,GB +2001:678:41c::,2001:678:41c:ffff:ffff:ffff:ffff:ffff,UA +2001:678:420::,2001:678:420:ffff:ffff:ffff:ffff:ffff,RU +2001:678:424::,2001:678:424:ffff:ffff:ffff:ffff:ffff,GB +2001:678:428::,2001:678:428:ffff:ffff:ffff:ffff:ffff,NL +2001:678:42c::,2001:678:42c:ffff:ffff:ffff:ffff:ffff,SI +2001:678:430::,2001:678:433:ffff:ffff:ffff:ffff:ffff,GB +2001:678:440::,2001:678:440:ffff:ffff:ffff:ffff:ffff,SE 2001:67c::,2001:67c::ffff:ffff:ffff:ffff:ffff,IE 2001:67c:4::,2001:67c:4:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:8::,2001:67c:8:ffff:ffff:ffff:ffff:ffff,CH @@ -773,7 +837,7 @@ 2001:67c:58::,2001:67c:58:ffff:ffff:ffff:ffff:ffff,SI 2001:67c:5c::,2001:67c:5c:ffff:ffff:ffff:ffff:ffff,BE 2001:67c:60::,2001:67c:60:ffff:ffff:ffff:ffff:ffff,NL -2001:67c:64::,2001:67c:64:ffff:ffff:ffff:ffff:ffff,ES +2001:67c:64::,2001:67c:64:ffff:ffff:ffff:ffff:ffff,HU 2001:67c:68::,2001:67c:68:ffff:ffff:ffff:ffff:ffff,CZ 2001:67c:6c::,2001:67c:6c:ffff:ffff:ffff:ffff:ffff,IS 2001:67c:70::,2001:67c:70:ffff:ffff:ffff:ffff:ffff,FR @@ -814,7 +878,6 @@ 2001:67c:fc::,2001:67c:fc:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:100::,2001:67c:100:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:104::,2001:67c:104:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:108::,2001:67c:108:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:10c::,2001:67c:10c:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:110::,2001:67c:110:ffff:ffff:ffff:ffff:ffff,FI 2001:67c:114::,2001:67c:114:ffff:ffff:ffff:ffff:ffff,NL @@ -990,6 +1053,7 @@ 2001:67c:3b8::,2001:67c:3b8:ffff:ffff:ffff:ffff:ffff,IE 2001:67c:3bc::,2001:67c:3bc:ffff:ffff:ffff:ffff:ffff,DK 2001:67c:3c0::,2001:67c:3c0:ffff:ffff:ffff:ffff:ffff,DK +2001:67c:3c4::,2001:67c:3c4:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:3c8::,2001:67c:3c8:ffff:ffff:ffff:ffff:ffff,EE 2001:67c:3cc::,2001:67c:3cc:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:3d0::,2001:67c:3d0:ffff:ffff:ffff:ffff:ffff,NL @@ -1022,9 +1086,10 @@ 2001:67c:440::,2001:67c:440:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:444::,2001:67c:444:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:448::,2001:67c:448:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:44c::,2001:67c:44c:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:450::,2001:67c:450:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:454::,2001:67c:454:ffff:ffff:ffff:ffff:ffff,CZ -2001:67c:458::,2001:67c:458:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:458::,2001:67c:458:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:45c::,2001:67c:45c:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:460::,2001:67c:460:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:464::,2001:67c:464:ffff:ffff:ffff:ffff:ffff,TR @@ -1100,7 +1165,6 @@ 2001:67c:584::,2001:67c:584:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:588::,2001:67c:588:ffff:ffff:ffff:ffff:ffff,RO 2001:67c:58c::,2001:67c:58c:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:590::,2001:67c:590:ffff:ffff:ffff:ffff:ffff,NO 2001:67c:594::,2001:67c:594:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:598::,2001:67c:598:ffff:ffff:ffff:ffff:ffff,NO 2001:67c:59c::,2001:67c:59c:ffff:ffff:ffff:ffff:ffff,HU @@ -1179,6 +1243,7 @@ 2001:67c:6c4::,2001:67c:6c4:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:6c8::,2001:67c:6c8:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:6cc::,2001:67c:6cc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:6d0::,2001:67c:6d0:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:6d4::,2001:67c:6d4:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:6d8::,2001:67c:6d8:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:6dc::,2001:67c:6dc:ffff:ffff:ffff:ffff:ffff,RU @@ -1192,6 +1257,7 @@ 2001:67c:6fc::,2001:67c:6fc:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:700::,2001:67c:700:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:704::,2001:67c:704:ffff:ffff:ffff:ffff:ffff,AT +2001:67c:708::,2001:67c:708:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:70c::,2001:67c:70c:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:710::,2001:67c:710:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:714::,2001:67c:714:ffff:ffff:ffff:ffff:ffff,NO @@ -1231,7 +1297,6 @@ 2001:67c:7a0::,2001:67c:7a0:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:7a4::,2001:67c:7a4:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:7a8::,2001:67c:7a8:ffff:ffff:ffff:ffff:ffff,DK -2001:67c:7ac::,2001:67c:7ac:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:7b0::,2001:67c:7b0:ffff:ffff:ffff:ffff:ffff,CZ 2001:67c:7b4::,2001:67c:7b4:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:7b8::,2001:67c:7b8:ffff:ffff:ffff:ffff:ffff,SE @@ -1359,12 +1424,15 @@ 2001:67c:11dc::,2001:67c:11dc:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:11e0::,2001:67c:11e0:ffff:ffff:ffff:ffff:ffff,BG 2001:67c:11e4::,2001:67c:11e4:ffff:ffff:ffff:ffff:ffff,PL -2001:67c:11e8::,2001:67c:11e8:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:11ec::,2001:67c:11ec:ffff:ffff:ffff:ffff:ffff,TR 2001:67c:11f0::,2001:67c:11f0:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:11f4::,2001:67c:11f4:ffff:ffff:ffff:ffff:ffff,AT 2001:67c:11f8::,2001:67c:11f8:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:11fc::,2001:67c:11fc:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1200::,2001:67c:1200:ffff:ffff:ffff:ffff:ffff,NL +2001:67c:1204::,2001:67c:1204:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:1208::,2001:67c:1208:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:120c::,2001:67c:120c:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:1210::,2001:67c:1213:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1220::,2001:67c:1223:ffff:ffff:ffff:ffff:ffff,CZ 2001:67c:1230::,2001:67c:1233:ffff:ffff:ffff:ffff:ffff,US @@ -1407,13 +1475,16 @@ 2001:67c:12d4::,2001:67c:12d4:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:12d8::,2001:67c:12d8:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:12dc::,2001:67c:12dc:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:12e0::,2001:67c:12e0:ffff:ffff:ffff:ffff:ffff,KG 2001:67c:12e4::,2001:67c:12e4:ffff:ffff:ffff:ffff:ffff,SA 2001:67c:12e8::,2001:67c:12e9:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:12f0::,2001:67c:12f0:ffff:ffff:ffff:ffff:ffff,DE +2001:67c:12f4::,2001:67c:12f4:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:12f8::,2001:67c:12f8:ffff:ffff:ffff:ffff:ffff,DK 2001:67c:12fc::,2001:67c:12fc:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:1300::,2001:67c:1300:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:1304::,2001:67c:1304:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:1308::,2001:67c:1308:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:130c::,2001:67c:130c:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:1310::,2001:67c:1310:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:1314::,2001:67c:1314:ffff:ffff:ffff:ffff:ffff,CZ @@ -1635,6 +1706,7 @@ 2001:67c:1780::,2001:67c:1780:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:1784::,2001:67c:1784:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:1788::,2001:67c:1788:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:178c::,2001:67c:178c:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:1790::,2001:67c:1790:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1794::,2001:67c:1794:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:1798::,2001:67c:1798:ffff:ffff:ffff:ffff:ffff,CZ @@ -1680,7 +1752,6 @@ 2001:67c:183c::,2001:67c:183c:ffff:ffff:ffff:ffff:ffff,BE 2001:67c:1840::,2001:67c:1840:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1844::,2001:67c:1844:ffff:ffff:ffff:ffff:ffff,RO -2001:67c:1848::,2001:67c:1848:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:184c::,2001:67c:184c:ffff:ffff:ffff:ffff:ffff,FR 2001:67c:1850::,2001:67c:1850:ffff:ffff:ffff:ffff:ffff,FI 2001:67c:1854::,2001:67c:1854:ffff:ffff:ffff:ffff:ffff,RO @@ -1807,7 +1878,6 @@ 2001:67c:1b6c::,2001:67c:1b6c:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:1b70::,2001:67c:1b70:ffff:ffff:ffff:ffff:ffff,AT 2001:67c:1b74::,2001:67c:1b74:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:1b78::,2001:67c:1b78:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1b7c::,2001:67c:1b7c:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1b80::,2001:67c:1b80:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:1b84::,2001:67c:1b84:ffff:ffff:ffff:ffff:ffff,DE @@ -1858,6 +1928,7 @@ 2001:67c:203c::,2001:67c:203c:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2040::,2001:67c:2040:ffff:ffff:ffff:ffff:ffff,AE 2001:67c:2044::,2001:67c:2044:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2048::,2001:67c:2048:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:204c::,2001:67c:204c:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:2050::,2001:67c:2050:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2054::,2001:67c:2054:ffff:ffff:ffff:ffff:ffff,DE @@ -1904,6 +1975,7 @@ 2001:67c:2104::,2001:67c:2104:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2108::,2001:67c:2108:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:210c::,2001:67c:210c:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2110::,2001:67c:2110:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:2114::,2001:67c:2114:ffff:ffff:ffff:ffff:ffff,IS 2001:67c:2118::,2001:67c:2118:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:211c::,2001:67c:211c:ffff:ffff:ffff:ffff:ffff,AT @@ -1950,6 +2022,7 @@ 2001:67c:21b8::,2001:67c:21b8:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:21bc::,2001:67c:21bc:ffff:ffff:ffff:ffff:ffff,BG 2001:67c:21c0::,2001:67c:21c0:ffff:ffff:ffff:ffff:ffff,CH +2001:67c:21c4::,2001:67c:21c4:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:21c8::,2001:67c:21c8:ffff:ffff:ffff:ffff:ffff,BG 2001:67c:21cc::,2001:67c:21cc:ffff:ffff:ffff:ffff:ffff,ES 2001:67c:21d0::,2001:67c:21d0:ffff:ffff:ffff:ffff:ffff,CZ @@ -1975,7 +2048,6 @@ 2001:67c:2224::,2001:67c:2224:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2228::,2001:67c:2228:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:222c::,2001:67c:222c:ffff:ffff:ffff:ffff:ffff,SK -2001:67c:2230::,2001:67c:2230:ffff:ffff:ffff:ffff:ffff,BE 2001:67c:2234::,2001:67c:2234:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:2238::,2001:67c:2238:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:223c::,2001:67c:223c:ffff:ffff:ffff:ffff:ffff,DE @@ -2294,7 +2366,6 @@ 2001:67c:276c::,2001:67c:276c:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2770::,2001:67c:2770:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2774::,2001:67c:2774:ffff:ffff:ffff:ffff:ffff,AE -2001:67c:2778::,2001:67c:2778:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:277c::,2001:67c:277c:ffff:ffff:ffff:ffff:ffff,DK 2001:67c:2780::,2001:67c:2780:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2784::,2001:67c:2784:ffff:ffff:ffff:ffff:ffff,FI @@ -2386,6 +2457,7 @@ 2001:67c:28e0::,2001:67c:28e0:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:28e4::,2001:67c:28e4:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:28e8::,2001:67c:28e8:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:28ec::,2001:67c:28ec:ffff:ffff:ffff:ffff:ffff,AT 2001:67c:28f0::,2001:67c:28f0:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:28f4::,2001:67c:28f4:ffff:ffff:ffff:ffff:ffff,SI 2001:67c:28f8::,2001:67c:28f8:ffff:ffff:ffff:ffff:ffff,LT @@ -2487,6 +2559,7 @@ 2001:67c:2b0c::,2001:67c:2b0c:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2b10::,2001:67c:2b10:ffff:ffff:ffff:ffff:ffff,CZ 2001:67c:2b14::,2001:67c:2b14:ffff:ffff:ffff:ffff:ffff,UA +2001:67c:2b18::,2001:67c:2b18:ffff:ffff:ffff:ffff:ffff,FR 2001:67c:2b1c::,2001:67c:2b1c:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2b20::,2001:67c:2b20:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:2b24::,2001:67c:2b24:ffff:ffff:ffff:ffff:ffff,SE @@ -2503,6 +2576,7 @@ 2001:67c:2b50::,2001:67c:2b50:ffff:ffff:ffff:ffff:ffff,AT 2001:67c:2b54::,2001:67c:2b54:ffff:ffff:ffff:ffff:ffff,CH 2001:67c:2b58::,2001:67c:2b58:ffff:ffff:ffff:ffff:ffff,SE +2001:67c:2b5c::,2001:67c:2b5c:ffff:ffff:ffff:ffff:ffff,SK 2001:67c:2b60::,2001:67c:2b60:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2b64::,2001:67c:2b64:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:2b68::,2001:67c:2b68:ffff:ffff:ffff:ffff:ffff,RO @@ -2510,6 +2584,7 @@ 2001:67c:2b70::,2001:67c:2b70:ffff:ffff:ffff:ffff:ffff,DK 2001:67c:2b74::,2001:67c:2b74:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2b78::,2001:67c:2b79:ffff:ffff:ffff:ffff:ffff,GR +2001:67c:2b80::,2001:67c:2b80:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2b84::,2001:67c:2b84:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2b88::,2001:67c:2b88:ffff:ffff:ffff:ffff:ffff,RU 2001:67c:2b8c::,2001:67c:2b8c:ffff:ffff:ffff:ffff:ffff,RU @@ -2526,7 +2601,6 @@ 2001:67c:2bb8::,2001:67c:2bb8:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2bbc::,2001:67c:2bbc:ffff:ffff:ffff:ffff:ffff,RO 2001:67c:2bc0::,2001:67c:2bc0:ffff:ffff:ffff:ffff:ffff,SE -2001:67c:2bc4::,2001:67c:2bc4:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2bc8::,2001:67c:2bc8:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2bcc::,2001:67c:2bcc:ffff:ffff:ffff:ffff:ffff,LV 2001:67c:2bd0::,2001:67c:2bd0:ffff:ffff:ffff:ffff:ffff,SE @@ -2534,6 +2608,7 @@ 2001:67c:2bd8::,2001:67c:2bd8:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2be0::,2001:67c:2be0:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:2be4::,2001:67c:2be4:ffff:ffff:ffff:ffff:ffff,PL +2001:67c:2be8::,2001:67c:2be8:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2bec::,2001:67c:2bec:ffff:ffff:ffff:ffff:ffff,PL 2001:67c:2bf0::,2001:67c:2bf0:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2bf4::,2001:67c:2bf4:ffff:ffff:ffff:ffff:ffff,RU @@ -2656,6 +2731,7 @@ 2001:67c:2df8::,2001:67c:2df8:ffff:ffff:ffff:ffff:ffff,SE 2001:67c:2dfc::,2001:67c:2dfc:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2e00::,2001:67c:2e00:ffff:ffff:ffff:ffff:ffff,RU +2001:67c:2e04::,2001:67c:2e04:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2e08::,2001:67c:2e08:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2e0c::,2001:67c:2e0c:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2e10::,2001:67c:2e10:ffff:ffff:ffff:ffff:ffff,AT @@ -2721,7 +2797,6 @@ 2001:67c:2f04::,2001:67c:2f04:ffff:ffff:ffff:ffff:ffff,NL 2001:67c:2f08::,2001:67c:2f08:ffff:ffff:ffff:ffff:ffff,GB 2001:67c:2f0c::,2001:67c:2f0c:ffff:ffff:ffff:ffff:ffff,DE -2001:67c:2f10::,2001:67c:2f10:ffff:ffff:ffff:ffff:ffff,UA 2001:67c:2f14::,2001:67c:2f14:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2f18::,2001:67c:2f18:ffff:ffff:ffff:ffff:ffff,CZ 2001:67c:2f1c::,2001:67c:2f1c:ffff:ffff:ffff:ffff:ffff,GB @@ -2732,6 +2807,7 @@ 2001:67c:2f30::,2001:67c:2f30:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2f34::,2001:67c:2f34:ffff:ffff:ffff:ffff:ffff,AT 2001:67c:2f38::,2001:67c:2f38:ffff:ffff:ffff:ffff:ffff,GB +2001:67c:2f3c::,2001:67c:2f3c:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2f40::,2001:67c:2f40:ffff:ffff:ffff:ffff:ffff,BG 2001:67c:2f44::,2001:67c:2f44:ffff:ffff:ffff:ffff:ffff,DE 2001:67c:2f48::,2001:67c:2f48:ffff:ffff:ffff:ffff:ffff,UA @@ -2812,7 +2888,7 @@ 2001:708::,2001:708:ffff:ffff:ffff:ffff:ffff:ffff,FI 2001:710::,2001:710:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:718::,2001:71f:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2001:720::,2001:720:ffff:ffff:ffff:ffff:ffff:ffff,ES +2001:720::,2001:727:ffff:ffff:ffff:ffff:ffff:ffff,ES 2001:728::,2001:728:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:730::,2001:737:ffff:ffff:ffff:ffff:ffff:ffff,AT 2001:738::,2001:738:ffff:ffff:ffff:ffff:ffff:ffff,HU @@ -2999,11 +3075,16 @@ 2001:7f8:a7::,2001:7f8:a7:ffff:ffff:ffff:ffff:ffff,RU 2001:7f8:a8::,2001:7f8:a8:ffff:ffff:ffff:ffff:ffff,IR 2001:7f8:a9::,2001:7f8:a9:ffff:ffff:ffff:ffff:ffff,MD +2001:7f8:aa::,2001:7f8:aa:ffff:ffff:ffff:ffff:ffff,SE 2001:7f8:ab::,2001:7f8:ab:ffff:ffff:ffff:ffff:ffff,IT 2001:7f8:ac::,2001:7f8:ac:ffff:ffff:ffff:ffff:ffff,RU 2001:7f8:ad::,2001:7f8:ad:ffff:ffff:ffff:ffff:ffff,SE 2001:7f8:ae::,2001:7f8:ae:ffff:ffff:ffff:ffff:ffff,CZ 2001:7f8:af::,2001:7f8:af:ffff:ffff:ffff:ffff:ffff,FI +2001:7f8:b0::,2001:7f8:b0:ffff:ffff:ffff:ffff:ffff,SE +2001:7f8:b1::,2001:7f8:b1:ffff:ffff:ffff:ffff:ffff,FR +2001:7f8:b2::,2001:7f8:b2:ffff:ffff:ffff:ffff:ffff,CZ +2001:7f8:b3::,2001:7f8:b3:ffff:ffff:ffff:ffff:ffff,PL 2001:7f9:4::,2001:7f9:4:ffff:ffff:ffff:ffff:ffff,AL 2001:7f9:8::,2001:7f9:8:ffff:ffff:ffff:ffff:ffff,AM 2001:7f9:c::,2001:7f9:c:ffff:ffff:ffff:ffff:ffff,PL @@ -3021,7 +3102,6 @@ 2001:7fa:f::,2001:7fa:f:ffff:ffff:ffff:ffff:ffff,ID 2001:7fa:10::,2001:7fa:10:ffff:ffff:ffff:ffff:ffff,CN 2001:7fa:11::,2001:7fa:11:ffff:ffff:ffff:ffff:ffff,AU -2001:7fc::,2001:7fc:1:ffff:ffff:ffff:ffff:ffff,DE 2001:7fe::,2001:7fe:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:808::,2001:80f:ffff:ffff:ffff:ffff:ffff:ffff,PL 2001:810::,2001:810:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -3094,7 +3174,9 @@ 2001:978:2300::,2001:978:2300:7fff:ffff:ffff:ffff:ffff,GB 2001:978:2300:8000::,2001:978:29ff:ffff:ffff:ffff:ffff:ffff,DE 2001:978:2a00::,2001:978:2a00:ffff:ffff:ffff:ffff:ffff,IE -2001:978:2a01::,2001:978:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:978:2a01::,2001:978:73ff:ffff:ffff:ffff:ffff:ffff,DE +2001:978:7400::,2001:978:7400:ffff:ffff:ffff:ffff:ffff,FI +2001:978:7401::,2001:978:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:980::,2001:987:ffff:ffff:ffff:ffff:ffff:ffff,NL 2001:988::,2001:988:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:990::,2001:990:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -3115,7 +3197,7 @@ 2001:a18::,2001:a1f:ffff:ffff:ffff:ffff:ffff:ffff,LU 2001:a20::,2001:a20:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:a30::,2001:a30:ffff:ffff:ffff:ffff:ffff:ffff,IT -2001:a38::,2001:a38:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:a38::,2001:a3f:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:a40::,2001:a40:ffff:ffff:ffff:ffff:ffff:ffff,PT 2001:a48::,2001:a48:ffff:ffff:ffff:ffff:ffff:ffff,PL 2001:a50::,2001:a50:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -3162,7 +3244,7 @@ 2001:b40::,2001:b40:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:b48::,2001:b4f:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:b50::,2001:b50:ffff:ffff:ffff:ffff:ffff:ffff,DK -2001:b58::,2001:b58:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:b58::,2001:b5f:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:b60::,2001:b67:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:b68::,2001:b68:ffff:ffff:ffff:ffff:ffff:ffff,HR 2001:b70::,2001:b70:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -3177,7 +3259,7 @@ 2001:bc8::,2001:bc8:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:bd0::,2001:bd0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:be0::,2001:be7:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:be8::,2001:be8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2001:be8::,2001:bef:ffff:ffff:ffff:ffff:ffff:ffff,SE 2001:bf0::,2001:bf7:130f:ffff:ffff:ffff:ffff:ffff,DE 2001:bf7:1310::,2001:bf7:1310:7fff:ffff:ffff:ffff:ffff,NL 2001:bf7:1310:8000::,2001:bf7:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -3327,7 +3409,6 @@ 2001:df0:19::,2001:df0:1d:ffff:ffff:ffff:ffff:ffff,VN 2001:df0:1e::,2001:df0:1e:ffff:ffff:ffff:ffff:ffff,TH 2001:df0:1f::,2001:df0:1f:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:20::,2001:df0:3f:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:40::,2001:df0:40:ffff:ffff:ffff:ffff:ffff,VN 2001:df0:42::,2001:df0:42:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:43::,2001:df0:43:ffff:ffff:ffff:ffff:ffff,JP @@ -3511,7 +3592,6 @@ 2001:df0:25e::,2001:df0:25e:ffff:ffff:ffff:ffff:ffff,JP 2001:df0:260::,2001:df0:260:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:261::,2001:df0:261:ffff:ffff:ffff:ffff:ffff,NZ -2001:df0:262::,2001:df0:262:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:263::,2001:df0:263:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:264::,2001:df0:264:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:265::,2001:df0:265:ffff:ffff:ffff:ffff:ffff,TH @@ -3549,7 +3629,6 @@ 2001:df0:29f::,2001:df0:29f:ffff:ffff:ffff:ffff:ffff,BD 2001:df0:2a0::,2001:df0:2a0:ffff:ffff:ffff:ffff:ffff,MY 2001:df0:2a1::,2001:df0:2a1:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:2a2::,2001:df0:2a2:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:2a3::,2001:df0:2a3:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:2a4::,2001:df0:2a4:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:2a5::,2001:df0:2a5:ffff:ffff:ffff:ffff:ffff,SG @@ -3606,8 +3685,7 @@ 2001:df0:2fc::,2001:df0:2fc:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:2fd::,2001:df0:2fd:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:2fe::,2001:df0:2ff:ffff:ffff:ffff:ffff:ffff,AU -2001:df0:300::,2001:df0:311:ffff:ffff:ffff:ffff:ffff,SG -2001:df0:314::,2001:df0:317:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:300::,2001:df0:317:ffff:ffff:ffff:ffff:ffff,SG 2001:df0:400::,2001:df0:400:ffff:ffff:ffff:ffff:ffff,SG 2001:df0:401::,2001:df0:401:ffff:ffff:ffff:ffff:ffff,JP 2001:df0:402::,2001:df0:403:ffff:ffff:ffff:ffff:ffff,AU @@ -3697,7 +3775,7 @@ 2001:df0:1b00::,2001:df0:1b00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:1c00::,2001:df0:1c00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:1d00::,2001:df0:1d00:ffff:ffff:ffff:ffff:ffff,MV -2001:df0:1e00::,2001:df0:1e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:1e00::,2001:df0:1e01:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:1f00::,2001:df0:1f00:ffff:ffff:ffff:ffff:ffff,MV 2001:df0:2000::,2001:df0:2000:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:2100::,2001:df0:2100:ffff:ffff:ffff:ffff:ffff,AU @@ -3710,7 +3788,6 @@ 2001:df0:2800::,2001:df0:2800:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:2900::,2001:df0:2900:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:2a00::,2001:df0:2a00:ffff:ffff:ffff:ffff:ffff,VN -2001:df0:2b00::,2001:df0:2b00:ffff:ffff:ffff:ffff:ffff,BD 2001:df0:2d00::,2001:df0:2d00:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:2e00::,2001:df0:2e00:ffff:ffff:ffff:ffff:ffff,CN 2001:df0:2f00::,2001:df0:2f00:ffff:ffff:ffff:ffff:ffff,IN @@ -3729,98 +3806,196 @@ 2001:df0:3d00::,2001:df0:3d00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:3e00::,2001:df0:3e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:3f00::,2001:df0:3f00:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:4000::,2001:df0:4000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:4100::,2001:df0:4100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:4200::,2001:df0:4200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4300::,2001:df0:4300:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:4400::,2001:df0:4400:ffff:ffff:ffff:ffff:ffff,ID -2001:df0:4600::,2001:df0:4601:ffff:ffff:ffff:ffff:ffff,US +2001:df0:4500::,2001:df0:4500:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:4700::,2001:df0:4700:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:4800::,2001:df0:4800:ffff:ffff:ffff:ffff:ffff,HK -2001:df0:4a00::,2001:df0:4a00:ffff:ffff:ffff:ffff:ffff,PK +2001:df0:4900::,2001:df0:4900:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:4b00::,2001:df0:4b00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:4d00::,2001:df0:4d00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:4e00::,2001:df0:4e00:ffff:ffff:ffff:ffff:ffff,TW +2001:df0:4f00::,2001:df0:4f00:ffff:ffff:ffff:ffff:ffff,MN 2001:df0:5000::,2001:df0:5000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:5100::,2001:df0:5100:ffff:ffff:ffff:ffff:ffff,PK 2001:df0:5200::,2001:df0:5200:ffff:ffff:ffff:ffff:ffff,IN -2001:df0:5600::,2001:df0:5600:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:5300::,2001:df0:5300:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:5500::,2001:df0:5500:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:5700::,2001:df0:5700:ffff:ffff:ffff:ffff:ffff,NZ 2001:df0:5800::,2001:df0:5800:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:5900::,2001:df0:5900:ffff:ffff:ffff:ffff:ffff,NP 2001:df0:5a00::,2001:df0:5a00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:5b00::,2001:df0:5b00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:5c00::,2001:df0:5c00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:5d00::,2001:df0:5d00:ffff:ffff:ffff:ffff:ffff,CN 2001:df0:5e00::,2001:df0:5e00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:5f00::,2001:df0:5f00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:6000::,2001:df0:6000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:6100::,2001:df0:6100:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:6200::,2001:df0:6200:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:6300::,2001:df0:6300:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:6400::,2001:df0:6400:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:6500::,2001:df0:6500:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:6600::,2001:df0:6600:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:6700::,2001:df0:6700:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:6800::,2001:df0:6800:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:6900::,2001:df0:6900:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:6a00::,2001:df0:6a00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:6b00::,2001:df0:6b00:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:6d00::,2001:df0:6d00:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:6e00::,2001:df0:6e00:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:6f00::,2001:df0:6f00:ffff:ffff:ffff:ffff:ffff,MY 2001:df0:7000::,2001:df0:7000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:7100::,2001:df0:7100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:7200::,2001:df0:7200:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:7300::,2001:df0:7300:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:7400::,2001:df0:7400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:7500::,2001:df0:7500:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:7600::,2001:df0:7600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:7700::,2001:df0:7700:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:7900::,2001:df0:7900:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:7a00::,2001:df0:7a00:ffff:ffff:ffff:ffff:ffff,TL +2001:df0:7b00::,2001:df0:7b00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:7c00::,2001:df0:7c00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:7d00::,2001:df0:7d00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:7e00::,2001:df0:7e00:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:7f00::,2001:df0:7f00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:8000::,2001:df0:8000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8100::,2001:df0:8100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:8200::,2001:df0:8200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:8300::,2001:df0:8300:ffff:ffff:ffff:ffff:ffff,PH 2001:df0:8400::,2001:df0:8400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8500::,2001:df0:8500:ffff:ffff:ffff:ffff:ffff,JP 2001:df0:8600::,2001:df0:8600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8700::,2001:df0:8700:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:8800::,2001:df0:8800:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:8900::,2001:df0:8900:ffff:ffff:ffff:ffff:ffff,PK 2001:df0:8a00::,2001:df0:8a00:ffff:ffff:ffff:ffff:ffff,NP +2001:df0:8b00::,2001:df0:8b00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:8c00::,2001:df0:8c00:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:8d00::,2001:df0:8d00:ffff:ffff:ffff:ffff:ffff,MV 2001:df0:8e00::,2001:df0:8e00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:8f00::,2001:df0:8f00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9100::,2001:df0:9100:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:9200::,2001:df0:9200:ffff:ffff:ffff:ffff:ffff,MM +2001:df0:9300::,2001:df0:9300:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:9400::,2001:df0:9400:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:9500::,2001:df0:9500:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:9600::,2001:df0:9600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:9700::,2001:df0:9700:ffff:ffff:ffff:ffff:ffff,PH 2001:df0:9800::,2001:df0:9800:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:9900::,2001:df0:9900:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:9a00::,2001:df0:9a00:ffff:ffff:ffff:ffff:ffff,CN +2001:df0:9b00::,2001:df0:9b00:ffff:ffff:ffff:ffff:ffff,VN 2001:df0:9c00::,2001:df0:9c00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:9d00::,2001:df0:9d00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:9e00::,2001:df0:9e00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:9f00::,2001:df0:9f00:ffff:ffff:ffff:ffff:ffff,KH 2001:df0:a000::,2001:df0:a000:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a100::,2001:df0:a100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:a200::,2001:df0:a200:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:a300::,2001:df0:a300:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:a500::,2001:df0:a500:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:a600::,2001:df0:a600:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a700::,2001:df0:a700:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:a800::,2001:df0:a800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:a900::,2001:df0:a900:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:aa00::,2001:df0:aa00:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:ab00::,2001:df0:ab00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:ac00::,2001:df0:ac00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:ad00::,2001:df0:ad00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:ae00::,2001:df0:ae00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:af00::,2001:df0:af00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:b000::,2001:df0:b000:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:b100::,2001:df0:b100:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:b200::,2001:df0:b200:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:b300::,2001:df0:b300:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:b400::,2001:df0:b400:ffff:ffff:ffff:ffff:ffff,JP +2001:df0:b500::,2001:df0:b500:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:b600::,2001:df0:b600:ffff:ffff:ffff:ffff:ffff,BD +2001:df0:b700::,2001:df0:b700:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:b800::,2001:df0:b800:ffff:ffff:ffff:ffff:ffff,PH +2001:df0:b900::,2001:df0:b900:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:ba00::,2001:df0:ba00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:bb00::,2001:df0:bb00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:bc00::,2001:df0:bc00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:bd00::,2001:df0:bd00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:be00::,2001:df0:be00:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:bf00::,2001:df0:bf00:ffff:ffff:ffff:ffff:ffff,PH 2001:df0:c000::,2001:df0:c000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:c100::,2001:df0:c100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:c200::,2001:df0:c200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c300::,2001:df0:c300:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:c400::,2001:df0:c400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:c500::,2001:df0:c500:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:c600::,2001:df0:c600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:c700::,2001:df0:c700:ffff:ffff:ffff:ffff:ffff,SG 2001:df0:c800::,2001:df0:c800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:c900::,2001:df0:c900:ffff:ffff:ffff:ffff:ffff,PK 2001:df0:ca00::,2001:df0:ca00:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:cb00::,2001:df0:cb00:ffff:ffff:ffff:ffff:ffff,NZ 2001:df0:cc00::,2001:df0:cc00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:cd00::,2001:df0:cd00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:ce00::,2001:df0:ce00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:cf00::,2001:df0:cf00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:d000::,2001:df0:d000:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:d100::,2001:df0:d100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:d200::,2001:df0:d200:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:d300::,2001:df0:d301:ffff:ffff:ffff:ffff:ffff,IN 2001:df0:d400::,2001:df0:d400:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:d500::,2001:df0:d500:ffff:ffff:ffff:ffff:ffff,AF 2001:df0:d600::,2001:df0:d600:ffff:ffff:ffff:ffff:ffff,MY +2001:df0:d700::,2001:df0:d700:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:d900::,2001:df0:d900:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:db00::,2001:df0:db03:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:dc00::,2001:df0:dc00:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:dd00::,2001:df0:dd00:ffff:ffff:ffff:ffff:ffff,KH 2001:df0:de00::,2001:df0:de00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:df00::,2001:df0:df00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df0:e100::,2001:df0:e100:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:e200::,2001:df0:e200:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e300::,2001:df0:e300:ffff:ffff:ffff:ffff:ffff,HK 2001:df0:e400::,2001:df0:e400:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:e500::,2001:df0:e500:ffff:ffff:ffff:ffff:ffff,NZ 2001:df0:e600::,2001:df0:e600:ffff:ffff:ffff:ffff:ffff,SG +2001:df0:e700::,2001:df0:e700:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:e800::,2001:df0:e800:ffff:ffff:ffff:ffff:ffff,AU +2001:df0:e900::,2001:df0:e900:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:ea00::,2001:df0:ea00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:eb00::,2001:df0:eb00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:ec00::,2001:df0:ec00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:ed00::,2001:df0:ed00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:ee00::,2001:df0:ee00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:ef00::,2001:df0:ef00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:f000::,2001:df0:f000:ffff:ffff:ffff:ffff:ffff,HK +2001:df0:f100::,2001:df0:f100:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:f200::,2001:df0:f200:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f300::,2001:df0:f300:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:f400::,2001:df0:f401:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:f500::,2001:df0:f500:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:f600::,2001:df0:f600:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:f700::,2001:df0:f700:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:f800::,2001:df0:f800:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:f900::,2001:df0:f900:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:fa00::,2001:df0:fa00:ffff:ffff:ffff:ffff:ffff,ID +2001:df0:fb00::,2001:df0:fb00:ffff:ffff:ffff:ffff:ffff,ID 2001:df0:fc00::,2001:df0:fc01:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:fd00::,2001:df0:fd00:ffff:ffff:ffff:ffff:ffff,AU 2001:df0:fe00::,2001:df0:fe00:ffff:ffff:ffff:ffff:ffff,IN +2001:df0:ff00::,2001:df0:ff00:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:100::,2001:df1:100:ffff:ffff:ffff:ffff:ffff,IN 2001:df1:200::,2001:df1:200:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:300::,2001:df1:300:ffff:ffff:ffff:ffff:ffff,IN 2001:df1:400::,2001:df1:400:ffff:ffff:ffff:ffff:ffff,BD +2001:df1:500::,2001:df1:500:ffff:ffff:ffff:ffff:ffff,ID 2001:df1:600::,2001:df1:600:ffff:ffff:ffff:ffff:ffff,HK +2001:df1:700::,2001:df1:700:ffff:ffff:ffff:ffff:ffff,BD 2001:df1:800::,2001:df1:801:ffff:ffff:ffff:ffff:ffff,SG +2001:df1:900::,2001:df1:900:ffff:ffff:ffff:ffff:ffff,PH 2001:df1:a00::,2001:df1:a00:ffff:ffff:ffff:ffff:ffff,NZ +2001:df1:b00::,2001:df1:b00:ffff:ffff:ffff:ffff:ffff,PG 2001:df1:c00::,2001:df1:c00:ffff:ffff:ffff:ffff:ffff,IN 2001:df1:e00::,2001:df1:e00:ffff:ffff:ffff:ffff:ffff,IN 2001:df1:1200::,2001:df1:1200:ffff:ffff:ffff:ffff:ffff,ID @@ -3832,9 +4007,8 @@ 2001:df1:1e00::,2001:df1:1e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df1:2000::,2001:df1:2000:ffff:ffff:ffff:ffff:ffff,AU 2001:df1:2200::,2001:df1:2200:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:2400::,2001:df1:2400:ffff:ffff:ffff:ffff:ffff,PH +2001:df1:2400::,2001:df1:2401:ffff:ffff:ffff:ffff:ffff,PH 2001:df1:2600::,2001:df1:2600:ffff:ffff:ffff:ffff:ffff,ID -2001:df1:2800::,2001:df1:2800:ffff:ffff:ffff:ffff:ffff,SG 2001:df1:2a00::,2001:df1:2a00:ffff:ffff:ffff:ffff:ffff,MY 2001:df1:2c00::,2001:df1:2c00:ffff:ffff:ffff:ffff:ffff,AU 2001:df1:2e00::,2001:df1:2e00:ffff:ffff:ffff:ffff:ffff,IN @@ -3899,7 +4073,6 @@ 2001:df1:a800::,2001:df1:a800:ffff:ffff:ffff:ffff:ffff,SG 2001:df1:aa00::,2001:df1:aa00:ffff:ffff:ffff:ffff:ffff,ID 2001:df1:ac00::,2001:df1:ac00:ffff:ffff:ffff:ffff:ffff,HK -2001:df1:ae00::,2001:df1:ae01:ffff:ffff:ffff:ffff:ffff,AU 2001:df1:b000::,2001:df1:b000:ffff:ffff:ffff:ffff:ffff,TH 2001:df1:b200::,2001:df1:b200:ffff:ffff:ffff:ffff:ffff,HK 2001:df1:b400::,2001:df1:b400:ffff:ffff:ffff:ffff:ffff,AU @@ -4090,7 +4263,6 @@ 2001:df3:3800::,2001:df3:3800:ffff:ffff:ffff:ffff:ffff,ID 2001:df3:3a00::,2001:df3:3a00:ffff:ffff:ffff:ffff:ffff,PH 2001:df3:3c00::,2001:df3:3c00:ffff:ffff:ffff:ffff:ffff,IN -2001:df3:3e00::,2001:df3:3e00:ffff:ffff:ffff:ffff:ffff,SG 2001:df3:4000::,2001:df3:4000:ffff:ffff:ffff:ffff:ffff,NZ 2001:df3:4200::,2001:df3:4200:ffff:ffff:ffff:ffff:ffff,HK 2001:df3:4400::,2001:df3:4400:ffff:ffff:ffff:ffff:ffff,IN @@ -4273,7 +4445,7 @@ 2001:df4:b200::,2001:df4:b200:ffff:ffff:ffff:ffff:ffff,ID 2001:df4:b400::,2001:df4:b400:ffff:ffff:ffff:ffff:ffff,JP 2001:df4:b600::,2001:df4:b600:ffff:ffff:ffff:ffff:ffff,AU -2001:df4:ba00::,2001:df4:ba00:ffff:ffff:ffff:ffff:ffff,PH +2001:df4:ba00::,2001:df4:ba01:ffff:ffff:ffff:ffff:ffff,PH 2001:df4:bc00::,2001:df4:bc00:ffff:ffff:ffff:ffff:ffff,IN 2001:df4:be00::,2001:df4:be00:ffff:ffff:ffff:ffff:ffff,SG 2001:df4:c000::,2001:df4:c000:ffff:ffff:ffff:ffff:ffff,ID @@ -4368,6 +4540,7 @@ 2001:df5:7800::,2001:df5:7800:ffff:ffff:ffff:ffff:ffff,CN 2001:df5:7a00::,2001:df5:7a00:ffff:ffff:ffff:ffff:ffff,SG 2001:df5:7c00::,2001:df5:7c00:ffff:ffff:ffff:ffff:ffff,IN +2001:df5:7e00::,2001:df5:7e00:ffff:ffff:ffff:ffff:ffff,BD 2001:df5:8000::,2001:df5:8000:ffff:ffff:ffff:ffff:ffff,SG 2001:df5:8200::,2001:df5:8200:ffff:ffff:ffff:ffff:ffff,AU 2001:df5:8400::,2001:df5:8400:ffff:ffff:ffff:ffff:ffff,SG @@ -4519,7 +4692,6 @@ 2001:df6:b400::,2001:df6:b400:ffff:ffff:ffff:ffff:ffff,MY 2001:df6:b600::,2001:df6:b600:ffff:ffff:ffff:ffff:ffff,AU 2001:df6:b800::,2001:df6:b800:ffff:ffff:ffff:ffff:ffff,SG -2001:df6:ba00::,2001:df6:ba00:ffff:ffff:ffff:ffff:ffff,AU 2001:df6:bc00::,2001:df6:bc00:ffff:ffff:ffff:ffff:ffff,HK 2001:df6:be00::,2001:df6:be00:ffff:ffff:ffff:ffff:ffff,NZ 2001:df6:c200::,2001:df6:c200:ffff:ffff:ffff:ffff:ffff,AU @@ -4566,7 +4738,6 @@ 2001:df7:1600::,2001:df7:1600:ffff:ffff:ffff:ffff:ffff,HK 2001:df7:1a00::,2001:df7:1a00:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:1c00::,2001:df7:1c00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:1e00::,2001:df7:1e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:2000::,2001:df7:2000:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:2200::,2001:df7:2200:ffff:ffff:ffff:ffff:ffff,TH 2001:df7:2400::,2001:df7:2400:ffff:ffff:ffff:ffff:ffff,AU @@ -4596,7 +4767,6 @@ 2001:df7:5400::,2001:df7:5400:ffff:ffff:ffff:ffff:ffff,ID 2001:df7:5600::,2001:df7:5600:ffff:ffff:ffff:ffff:ffff,JP 2001:df7:5a00::,2001:df7:5a00:ffff:ffff:ffff:ffff:ffff,ID -2001:df7:5c00::,2001:df7:5c00:ffff:ffff:ffff:ffff:ffff,HK 2001:df7:5e00::,2001:df7:5e00:ffff:ffff:ffff:ffff:ffff,AU 2001:df7:6000::,2001:df7:6000:ffff:ffff:ffff:ffff:ffff,IN 2001:df7:6200::,2001:df7:6200:ffff:ffff:ffff:ffff:ffff,AU @@ -4956,7 +5126,16 @@ 2001:18e8::,2001:18e8:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:18f0::,2001:18f0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2001:18f8::,2001:18f8:ffff:ffff:ffff:ffff:ffff:ffff,CA -2001:1900::,2001:1900:5:1::1c5,US +2001:1900::,2001:1900:1::53:ff,US +2001:1900:1::53:100,2001:1900:1::53:1ff,SG +2001:1900:1::53:200,2001:1900:1::53:2ff,JP +2001:1900:1::53:300,2001:1900:1::53:80ff,US +2001:1900:1::53:8100,2001:1900:1::53:81ff,SG +2001:1900:1::53:8200,2001:1900:1::53:82ff,JP +2001:1900:1::53:8300,2001:1900:2::53:ff,US +2001:1900:2::53:100,2001:1900:2::53:1ff,GB +2001:1900:2::53:200,2001:1900:2::53:2ff,DE +2001:1900:2::53:300,2001:1900:5:1::1c5,US 2001:1900:5:1::1c6,2001:1900:5:1::1c6,SI 2001:1900:5:1::1c7,2001:1900:5:2:2::93d,US 2001:1900:5:2:2::93e,2001:1900:5:2:2::93e,SI @@ -5009,7 +5188,7 @@ 2001:19f8::,2001:19f8:ffff:ffff:ffff:ffff:ffff:ffff,US 2001:1a08::,2001:1a08:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:1a10::,2001:1a17:ffff:ffff:ffff:ffff:ffff:ffff,QA -2001:1a18::,2001:1a18:ffff:ffff:ffff:ffff:ffff:ffff,CY +2001:1a18::,2001:1a1f:ffff:ffff:ffff:ffff:ffff:ffff,CY 2001:1a20::,2001:1a20:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:1a28::,2001:1a28:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:1a30::,2001:1a30:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -5044,9 +5223,9 @@ 2001:1b20::,2001:1b20:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:1b28::,2001:1b28:ffff:ffff:ffff:ffff:ffff:ffff,EE 2001:1b30::,2001:1b37:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:1b38::,2001:1b38:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1b38::,2001:1b3f:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:1b40::,2001:1b40:ffff:ffff:ffff:ffff:ffff:ffff,GB -2001:1b48::,2001:1b48:ffff:ffff:ffff:ffff:ffff:ffff,FR +2001:1b48::,2001:1b4f:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:1b50::,2001:1b57:ffff:ffff:ffff:ffff:ffff:ffff,CH 2001:1b58::,2001:1b58:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:1b60::,2001:1b67:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -5310,6 +5489,7 @@ 2001:43f8:a0::,2001:43f8:a0:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f8:b0::,2001:43f8:b0:ffff:ffff:ffff:ffff:ffff,SL 2001:43f8:c0::,2001:43f8:c1:ffff:ffff:ffff:ffff:ffff,KE +2001:43f8:d0::,2001:43f8:d0:ffff:ffff:ffff:ffff:ffff,MU 2001:43f8:e0::,2001:43f8:e0:ffff:ffff:ffff:ffff:ffff,TZ 2001:43f8:100::,2001:43f8:100:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f8:110::,2001:43f8:110:ffff:ffff:ffff:ffff:ffff,MU @@ -5443,6 +5623,13 @@ 2001:43f8:ca0::,2001:43f8:ca0:ffff:ffff:ffff:ffff:ffff,CI 2001:43f8:cb0::,2001:43f8:cb0:ffff:ffff:ffff:ffff:ffff,KE 2001:43f8:cc0::,2001:43f8:ccf:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:ce0::,2001:43f8:ce0:ffff:ffff:ffff:ffff:ffff,TZ +2001:43f8:cf0::,2001:43f8:cf1:ffff:ffff:ffff:ffff:ffff,SN +2001:43f8:d00::,2001:43f8:d00:ffff:ffff:ffff:ffff:ffff,MU +2001:43f8:d10::,2001:43f8:d11:ffff:ffff:ffff:ffff:ffff,TG +2001:43f8:d20::,2001:43f8:d2f:ffff:ffff:ffff:ffff:ffff,ZA +2001:43f8:d40::,2001:43f8:d40:ffff:ffff:ffff:ffff:ffff,UG +2001:43f8:d50::,2001:43f8:d50:ffff:ffff:ffff:ffff:ffff,ZA 2001:43f8:e00::,2001:43f8:eff:ffff:ffff:ffff:ffff:ffff,MU 2001:4400::,2001:4403:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2001:4408::,2001:4408:ffff:ffff:ffff:ffff:ffff:ffff,IN @@ -5705,7 +5892,7 @@ 2001:4b88::,2001:4b88:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:4b90::,2001:4b90:ffff:ffff:ffff:ffff:ffff:ffff,FR 2001:4b98::,2001:4b9f:ffff:ffff:ffff:ffff:ffff:ffff,FR -2001:4ba0::,2001:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ba0::,2001:4ba7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:4ba8::,2001:4baf:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2001:4bb0::,2001:4bb0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:4bb8::,2001:4bb8:ffff:ffff:ffff:ffff:ffff:ffff,AT @@ -5742,16 +5929,14 @@ 2001:4c88::,2001:4c88:ffff:ffff:ffff:ffff:ffff:ffff,IR 2001:4c90::,2001:4c97:ffff:ffff:ffff:ffff:ffff:ffff,IT 2001:4c98::,2001:4c98:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4ca0::,2001:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4ca8::,2001:4ca8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ca0::,2001:4ca8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:4cb0::,2001:4cb0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2001:4cb8::,2001:4cbf:ffff:ffff:ffff:ffff:ffff:ffff,NL 2001:4cc0::,2001:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,PT 2001:4cc8::,2001:4cc8:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2001:4cd0::,2001:4cd0:ffff:ffff:ffff:ffff:ffff:ffff,IL 2001:4cd8::,2001:4cd8:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4ce0::,2001:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2001:4ce8::,2001:4cf8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2001:4ce0::,2001:4cf8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:4d00::,2001:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AM 2001:4d08::,2001:4d08:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:4d10::,2001:4d10:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -5775,7 +5960,9 @@ 2001:4dc8::,2001:4dc8:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:4dd0::,2001:4dd7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2001:4dd8::,2001:4dd8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2001:4de0::,2001:4de0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2001:4de0::,2001:4de0:4ff:ffff:ffff:ffff:ffff:ffff,NL +2001:4de0:500::,2001:4de0:5ff:ffff:ffff:ffff:ffff:ffff,SE +2001:4de0:600::,2001:4de0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2001:4de8::,2001:4de8:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2001:4df0::,2001:4df0:ffff:ffff:ffff:ffff:ffff:ffff,IL 2001:8000::,2001:8fff:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -6024,8 +6211,8 @@ 2400:6100::,2400:6100:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:6140::,2400:6140:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:6180::,2400:6180:ff:ffff:ffff:ffff:ffff:ffff,SG -2400:6180:100::,2400:6180:100:7fff:ffff:ffff:ffff:ffff,IN -2400:6180:100:8000::,2400:6180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:6180:100::,2400:6180:1ff:ffff:ffff:ffff:ffff:ffff,IN +2400:6180:200::,2400:6180:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:61c0::,2400:61c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6200::,2400:6200:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:6240::,2400:6240:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -6046,8 +6233,8 @@ 2400:6500:0:7400::,2400:6500::74ff:ffff:ffff:ffff:ffff,KR 2400:6500:0:7500::,2400:6500::75ff:ffff:ffff:ffff:ffff,IN 2400:6500:0:7600::,2400:6500:100:70ff:ffff:ffff:ffff:ffff,SG -2400:6500:100:7100::,2400:6500:100:71ff:ffff:ffff:ffff:ffff,CN -2400:6500:100:7200::,2400:6500:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:6500:100:7100::,2400:6500:100:72ff:ffff:ffff:ffff:ffff,CN +2400:6500:100:7300::,2400:6500:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:6540::,2400:6540:ffff:ffff:ffff:ffff:ffff:ffff,VN 2400:6580::,2400:6580:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:65c0::,2400:65c0:ffff:ffff:ffff:ffff:ffff:ffff,IN @@ -6201,7 +6388,7 @@ 2400:89c0::,2400:89c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:8a00::,2400:8a00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:8a40::,2400:8a40:ffff:ffff:ffff:ffff:ffff:ffff,IN -2400:8a80::,2400:8a80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:8a80::,2400:8a81:ffff:ffff:ffff:ffff:ffff:ffff,PH 2400:8ac0::,2400:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:8b00::,2400:8b00:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:8b40::,2400:8b40:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -6280,6 +6467,7 @@ 2400:9f40::,2400:9f40:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:9f80::,2400:9f80:ffff:ffff:ffff:ffff:ffff:ffff,KR 2400:9fc0::,2400:9fc0:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:a000::,2400:a000:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:a040::,2400:a040:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:a080::,2400:a080:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:a0c0::,2400:a0c0:ffff:ffff:ffff:ffff:ffff:ffff,PK @@ -6304,70 +6492,142 @@ 2400:a680::,2400:a680:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:a6c0::,2400:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:a700::,2400:a700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a740::,2400:a740:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:a780::,2400:a780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a7c0::,2400:a7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:a800::,2400:a800:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:a840::,2400:a840:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:a880::,2400:a880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:a8c0::,2400:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:a900::,2400:a900:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a940::,2400:a940:ffff:ffff:ffff:ffff:ffff:ffff,PH 2400:a980::,2400:a987:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:a9c0::,2400:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:aa00::,2400:aa00:ffff:ffff:ffff:ffff:ffff:ffff,LA +2400:aa40::,2400:aa40:ffff:ffff:ffff:ffff:ffff:ffff,MY 2400:aa80::,2400:aa80:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:aac0::,2400:aac0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:ab00::,2400:ab00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:ab40::,2400:ab40:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:ab80::,2400:ab80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:abc0::,2400:abc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ac00::,2400:ac00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:ac40::,2400:ac40:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:ac80::,2400:ac80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:acc0::,2400:acc0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:ad00::,2400:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:ad40::,2400:ad40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:ad80::,2400:ad80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:adc0::,2400:addf:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:ae00::,2400:ae00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ae40::,2400:ae40:ffff:ffff:ffff:ffff:ffff:ffff,MY 2400:ae80::,2400:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:aec0::,2400:aec0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:af40::,2400:af40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:af80::,2400:af80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:afc0::,2400:afc0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:b000::,2400:b000:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:b040::,2400:b040:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:b080::,2400:b080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:b0c0::,2400:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:b100::,2400:b100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b140::,2400:b140:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:b180::,2400:b180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:b1c0::,2400:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:b200::,2400:b200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b240::,2400:b240:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:b2c0::,2400:b2c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:b300::,2400:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b340::,2400:b340:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:b380::,2400:b380:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:b3c0::,2400:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:b400::,2400:b400:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:b440::,2400:b440:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:b480::,2400:b480:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:b4c0::,2400:b4c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:b500::,2400:b500:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b540::,2400:b540:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:b580::,2400:b580:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:b5c0::,2400:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,TH 2400:b600::,2400:b600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b640::,2400:b640:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:b680::,2400:b680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:b6c0::,2400:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:b700::,2400:b700:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b740::,2400:b740:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:b780::,2400:b780:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b7c0::,2400:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:b800::,2400:b800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b840::,2400:b840:ffff:ffff:ffff:ffff:ffff:ffff,TH 2400:b880::,2400:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:b8c0::,2400:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:b940::,2400:b940:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:b980::,2400:b980:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:b9c0::,2400:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ba00::,2400:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ba40::,2400:ba41:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ba80::,2400:ba80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:bac0::,2400:bac0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:bb00::,2400:bb00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:bb40::,2400:bb40:ffff:ffff:ffff:ffff:ffff:ffff,PA +2400:bbc0::,2400:bbc0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:bc00::,2400:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:bc40::,2400:bc40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:bc80::,2400:bc80:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:bcc0::,2400:bcc0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:bd00::,2400:bd00:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:bd40::,2400:bd40:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:bdc0::,2400:bdc0:ffff:ffff:ffff:ffff:ffff:ffff,AF 2400:be00::,2400:be00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:be40::,2400:be40:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:be80::,2400:be80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:bec0::,2400:bec0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:bf00::,2400:bf00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:bf40::,2400:bf40:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:bf80::,2400:bf80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:bfc0::,2400:bfc0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:c000::,2400:c000:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:c040::,2400:c040:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:c080::,2400:c080:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:c0c0::,2400:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,VU 2400:c100::,2400:c100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c140::,2400:c140:ffff:ffff:ffff:ffff:ffff:ffff,VN 2400:c180::,2400:c180:ffff:ffff:ffff:ffff:ffff:ffff,LA +2400:c1c0::,2400:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:c200::,2400:c200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:c240::,2400:c240:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c2c0::,2400:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:c300::,2400:c300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c340::,2400:c340:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:c380::,2400:c380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:c3c0::,2400:c3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:c400::,2400:c400:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:c401::,2400:c401:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:c440::,2400:c440:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:c4c0::,2400:c4c0:ffff:ffff:ffff:ffff:ffff:ffff,MY 2400:c500::,2400:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:c540::,2400:c540:ffff:ffff:ffff:ffff:ffff:ffff,TH 2400:c580::,2400:c580:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:c5c0::,2400:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,TH 2400:c600::,2400:c600:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:c640::,2400:c640:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:c680::,2400:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c6c0::,2400:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:c700::,2400:c700:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:c740::,2400:c740:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:c780::,2400:c780:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:c7c0::,2400:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:c800::,2400:c807:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:c840::,2400:c840:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:c880::,2400:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:c8c0::,2400:c8c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:c900::,2400:c900:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:c940::,2400:c940:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:c980::,2400:c980:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:c9c0::,2400:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ca00::,2400:ca00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ca40::,2400:ca40:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cac0::,2400:cac0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cb00::,2400:cb00:18:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:19::,2400:cb00:19:ffff:ffff:ffff:ffff:ffff,FR 2400:cb00:1a::,2400:cb00:1f:ffff:ffff:ffff:ffff:ffff,US @@ -6381,8 +6641,7 @@ 2400:cb00:29::,2400:cb00:29:ffff:ffff:ffff:ffff:ffff,CA 2400:cb00:2a::,2400:cb00:30:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:31::,2400:cb00:31:ffff:ffff:ffff:ffff:ffff,CZ -2400:cb00:32::,2400:cb00:32:ffff:ffff:ffff:ffff:ffff,SE -2400:cb00:33::,2400:cb00:33:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:32::,2400:cb00:33:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:34::,2400:cb00:34:ffff:ffff:ffff:ffff:ffff,KR 2400:cb00:35::,2400:cb00:35:ffff:ffff:ffff:ffff:ffff,SG 2400:cb00:36::,2400:cb00:37:ffff:ffff:ffff:ffff:ffff,US @@ -6391,7 +6650,7 @@ 2400:cb00:3a::,2400:cb00:3f:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:40::,2400:cb00:40:ffff:ffff:ffff:ffff:ffff,ES 2400:cb00:41::,2400:cb00:41:ffff:ffff:ffff:ffff:ffff,CO -2400:cb00:42::,2400:cb00:42:ffff:ffff:ffff:ffff:ffff,BR +2400:cb00:42::,2400:cb00:42:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:43::,2400:cb00:43:ffff:ffff:ffff:ffff:ffff,PE 2400:cb00:44::,2400:cb00:44:ffff:ffff:ffff:ffff:ffff,AR 2400:cb00:45::,2400:cb00:45:ffff:ffff:ffff:ffff:ffff,ZA @@ -6435,151 +6694,304 @@ 2400:cb00:81::,2400:cb00:81:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:82::,2400:cb00:82:ffff:ffff:ffff:ffff:ffff,UA 2400:cb00:83::,2400:cb00:83:ffff:ffff:ffff:ffff:ffff,NO -2400:cb00:84::,2400:cb00:84:ffff:ffff:ffff:ffff:ffff,AU -2400:cb00:85::,2400:cb00:85:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:84::,2400:cb00:85:ffff:ffff:ffff:ffff:ffff,AU 2400:cb00:86::,2400:cb00:86:ffff:ffff:ffff:ffff:ffff,TH 2400:cb00:87::,2400:cb00:87:ffff:ffff:ffff:ffff:ffff,RU 2400:cb00:88::,2400:cb00:88:ffff:ffff:ffff:ffff:ffff,GR 2400:cb00:89::,2400:cb00:89:ffff:ffff:ffff:ffff:ffff,ES 2400:cb00:8a::,2400:cb00:8f:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:90::,2400:cb00:90:ffff:ffff:ffff:ffff:ffff,PA -2400:cb00:91::,2400:cb00:95:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:91::,2400:cb00:94:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:95::,2400:cb00:95:ffff:ffff:ffff:ffff:ffff,EC 2400:cb00:96::,2400:cb00:96:ffff:ffff:ffff:ffff:ffff,AO 2400:cb00:97::,2400:cb00:97:ffff:ffff:ffff:ffff:ffff,BR -2400:cb00:98::,2400:cb00:103:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:98::,2400:cb00:ff:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:100::,2400:cb00:100:ffff:ffff:ffff:ffff:ffff,DE +2400:cb00:101::,2400:cb00:103:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:104::,2400:cb00:104:ffff:ffff:ffff:ffff:ffff,TH 2400:cb00:105::,2400:cb00:105:ffff:ffff:ffff:ffff:ffff,CW 2400:cb00:106::,2400:cb00:106:ffff:ffff:ffff:ffff:ffff,US 2400:cb00:107::,2400:cb00:107:ffff:ffff:ffff:ffff:ffff,PT -2400:cb00:108::,2400:cb00:113:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:108::,2400:cb00:110:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:111::,2400:cb00:111:ffff:ffff:ffff:ffff:ffff,LK +2400:cb00:112::,2400:cb00:112:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:113::,2400:cb00:113:ffff:ffff:ffff:ffff:ffff,ZA 2400:cb00:114::,2400:cb00:114:ffff:ffff:ffff:ffff:ffff,AT -2400:cb00:115::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:115::,2400:cb00:116:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:117::,2400:cb00:117:ffff:ffff:ffff:ffff:ffff,AM +2400:cb00:118::,2400:cb00:11f:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:120::,2400:cb00:120:ffff:ffff:ffff:ffff:ffff,RS +2400:cb00:121::,2400:cb00:121:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:122::,2400:cb00:122:ffff:ffff:ffff:ffff:ffff,DJ +2400:cb00:123::,2400:cb00:123:ffff:ffff:ffff:ffff:ffff,HU +2400:cb00:124::,2400:cb00:125:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:126::,2400:cb00:126:ffff:ffff:ffff:ffff:ffff,IT +2400:cb00:127::,2400:cb00:127:ffff:ffff:ffff:ffff:ffff,US +2400:cb00:128::,2400:cb00:128:ffff:ffff:ffff:ffff:ffff,SE +2400:cb00:129::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US +2400:cb40::,2400:cb40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cb80::,2400:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cbc0::,2400:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cc00::,2400:cc00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:cc40::,2400:cc40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cc80::,2400:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ccc0::,2400:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cd00::,2400:cd00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:cd40::,2400:cd40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cd80::,2400:cd80:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:cdc0::,2400:cdc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ce00::,2400:ce00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ce40::,2400:ce40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ce80::,2400:ce80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:cec0::,2400:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:cf00::,2400:cf00:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:cf40::,2400:cf40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:cf80::,2400:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:cfc0::,2400:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d000::,2400:d000:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:d040::,2400:d040:ffff:ffff:ffff:ffff:ffff:ffff,LK +2400:d0c0::,2400:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d100::,2400:d100:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d140::,2400:d140:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:d180::,2400:d180:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:d1c0::,2400:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d200::,2400:d200:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d240::,2400:d240:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:d280::,2400:d280:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:d2c0::,2400:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:d300::,2400:d300:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d340::,2400:d340:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:d380::,2400:d380:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d3c0::,2400:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:d400::,2400:d400:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d440::,2400:d440:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d480::,2400:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d4c0::,2400:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:d500::,2400:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:d540::,2400:d540:ffff:ffff:ffff:ffff:ffff:ffff,AF 2400:d580::,2400:d580:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:d5c0::,2400:d5c0:ffff:ffff:ffff:ffff:ffff:ffff,AF 2400:d600::,2400:d600:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d640::,2400:d640:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:d680::,2400:d680:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:d6c0::,2400:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:d700::,2400:d700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:d740::,2400:d740:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:d780::,2400:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:d7c0::,2400:d7c0:ffff:ffff:ffff:ffff:ffff:ffff,PK 2400:d800::,2400:d803:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:d840::,2400:d840:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:d880::,2400:d880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:d8c0::,2400:d8c0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:d900::,2400:d900:ffff:ffff:ffff:ffff:ffff:ffff,LK +2400:d940::,2400:d940:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:d980::,2400:d980:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:d9c0::,2400:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:da00::,2400:da00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:da40::,2400:da40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:da80::,2400:da80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:dac0::,2400:dac0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:db00::,2400:db00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:db40::,2400:db40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:db80::,2400:db80:ffff:ffff:ffff:ffff:ffff:ffff,MN +2400:dbc0::,2400:dbc0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:dc00::,2400:dc00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:dc40::,2400:dc40:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:dc80::,2400:dc80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:dcc0::,2400:dcc0:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:dd00::,2400:dd0f:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:dd40::,2400:dd40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:dd80::,2400:dd80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ddc0::,2400:ddc0:ffff:ffff:ffff:ffff:ffff:ffff,JP 2400:de00::,2400:de00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:de40::,2400:de40:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:de80::,2400:de80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:dec0::,2400:dec0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:df00::,2400:df00:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:df40::,2400:df40:ffff:ffff:ffff:ffff:ffff:ffff,TW 2400:df80::,2400:df80:ffff:ffff:ffff:ffff:ffff:ffff,MY +2400:dfc0::,2400:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:e000::,2400:e000:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:e040::,2400:e040:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e0c0::,2400:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:e100::,2400:e100:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:e140::,2400:e140:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:e180::,2400:e180:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:e1c0::,2400:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:e200::,2400:e200:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e240::,2400:e240:ffff:ffff:ffff:ffff:ffff:ffff,VN +2400:e2c0::,2400:e2c0:ffff:ffff:ffff:ffff:ffff:ffff,VN 2400:e300::,2400:e300:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e340::,2400:e340:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:e3c0::,2400:e3c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:e400::,2400:e400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:e440::,2400:e440:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:e480::,2400:e480:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:e4c0::,2400:e4c0:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:e500::,2400:e500:ffff:ffff:ffff:ffff:ffff:ffff,AF +2400:e540::,2400:e540:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e5c0::,2400:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e640::,2400:e640:ffff:ffff:ffff:ffff:ffff:ffff,AF 2400:e680::,2400:e680:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e6c0::,2400:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:e740::,2400:e740:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:e780::,2400:e780:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:e7c0::,2400:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:e840::,2400:e840:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:e880::,2400:e880:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:e8c0::,2400:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:e900::,2400:e900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:e940::,2400:e940:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2400:e980::,2400:e980:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:e9c0::,2400:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:ea00::,2400:ea00:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:ea40::,2400:ea40:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:ea80::,2400:ea80:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:eac0::,2400:eac0:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:eb00::,2400:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:eb40::,2400:eb40:ffff:ffff:ffff:ffff:ffff:ffff,US 2400:eb80::,2400:eb80:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:ebc0::,2400:ebc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ec00::,2400:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:ec40::,2400:ec40:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:ec80::,2400:ec80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:ecc0::,2400:ecc0:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:ed00::,2400:ed00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:ed40::,2400:ed40:ffff:ffff:ffff:ffff:ffff:ffff,VN 2400:ed80::,2400:ed80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:edc0::,2400:edc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ee00::,2400:ee00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:ee40::,2400:ee40:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:ee80::,2400:ee80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2400:eec0::,2400:eec0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ef00::,2400:ef00:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:ef40::,2400:ef40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:ef80::,2400:ef80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:efc0::,2400:efc0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2400:f000::,2400:f000:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f040::,2400:f040:ffff:ffff:ffff:ffff:ffff:ffff,SG 2400:f080::,2400:f080:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:f0c0::,2400:f0c0:ffff:ffff:ffff:ffff:ffff:ffff,NP 2400:f100::,2400:f100:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f140::,2400:f140:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:f180::,2400:f180:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:f1c0::,2400:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:f200::,2400:f200:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:f240::,2400:f240:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:f280::,2400:f280:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:f2c0::,2400:f2c0:ffff:ffff:ffff:ffff:ffff:ffff,PH 2400:f300::,2400:f300:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:f340::,2400:f340:ffff:ffff:ffff:ffff:ffff:ffff,ID 2400:f380::,2400:f380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:f3c0::,2400:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2400:f400::,2400:f400:ffff:ffff:ffff:ffff:ffff:ffff,JP +2400:f440::,2400:f440:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:f480::,2400:f480:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:f4c0::,2400:f4c0:ffff:ffff:ffff:ffff:ffff:ffff,TH +2400:f540::,2400:f540:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:f580::,2400:f580:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:f5c0::,2400:f5c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:f600::,2400:f600:ffff:ffff:ffff:ffff:ffff:ffff,PH +2400:f640::,2400:f640:ffff:ffff:ffff:ffff:ffff:ffff,AU 2400:f680::,2400:f680:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:f6c0::,2400:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,NP 2400:f700::,2400:f700:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f740::,2400:f740:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:f780::,2400:f780:ffff:ffff:ffff:ffff:ffff:ffff,IN +2400:f7c0::,2400:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:f800::,2400:f800:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f840::,2400:f840:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:f880::,2400:f880:ffff:ffff:ffff:ffff:ffff:ffff,HK +2400:f8c0::,2400:f8c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:f900::,2400:f900:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:f940::,2400:f940:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:f980::,2400:f980:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:f9c0::,2400:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:fa00::,2400:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:fa40::,2400:fa40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:fa80::,2400:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:fac0::,2400:fac0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:fb00::,2400:fb00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2400:fb40::,2400:fb40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:fb80::,2400:fb80:ffff:ffff:ffff:ffff:ffff:ffff,SG +2400:fbc0::,2400:fbc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:fc00::,2400:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PK +2400:fc40::,2400:fc40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:fc80::,2400:fc80:ffff:ffff:ffff:ffff:ffff:ffff,TW +2400:fcc0::,2400:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2400:fd00::,2400:fd00:ffff:ffff:ffff:ffff:ffff:ffff,BD +2400:fd40::,2400:fd40:ffff:ffff:ffff:ffff:ffff:ffff,SC 2400:fd80::,2400:fd80:ffff:ffff:ffff:ffff:ffff:ffff,KR +2400:fdc0::,2400:fdc0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2400:fe00::,2400:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2400:fe40::,2400:fe40:ffff:ffff:ffff:ffff:ffff:ffff,MM 2400:fe80::,2400:fe80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:fec0::,2400:fec0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2400:ff00::,2400:ff00:ffff:ffff:ffff:ffff:ffff:ffff,LK +2400:ff40::,2400:ff40:ffff:ffff:ffff:ffff:ffff:ffff,AU +2400:ffc0::,2400:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401::,2401:1:ffff:ffff:ffff:ffff:ffff:ffff,PK +2401:40::,2401:40:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:80::,2401:80:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:c0::,2401:c0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:100::,2401:100:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:140::,2401:140:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:180::,2401:180:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:1c0::,2401:1c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:200::,2401:200:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:240::,2401:240:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:280::,2401:280:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:2c0::,2401:2c0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:300::,2401:300:ffff:ffff:ffff:ffff:ffff:ffff,HK +2401:340::,2401:340:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:380::,2401:380:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:3c0::,2401:3c0:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:400::,2401:403:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:440::,2401:440:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:4c0::,2401:4c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:4c1:c202:1193:f0a8:d737:3761:2b87,2401:4c1:c202:1193:f0a8:d737:3761:2b87,US 2401:500::,2401:500:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:540::,2401:540:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:580::,2401:580:ffff:ffff:ffff:ffff:ffff:ffff,BD +2401:5c0::,2401:5c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2401:600::,2401:600:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:640::,2401:640:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:680::,2401:680:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:6c0::,2401:6c0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:700::,2401:700:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:740::,2401:740:ffff:ffff:ffff:ffff:ffff:ffff,PH 2401:780::,2401:780:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:7c0::,2401:7c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:800::,2401:800:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:840::,2401:840:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:880::,2401:880:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:8c0::,2401:8c0:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:900::,2401:900:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:940::,2401:940:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:980::,2401:980:ffff:ffff:ffff:ffff:ffff:ffff,JP +2401:9c0::,2401:9c0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:a00::,2401:a00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:a40::,2401:a40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:a80::,2401:a80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:ac0::,2401:ac0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:b00::,2401:b00:ffff:ffff:ffff:ffff:ffff:ffff,MY +2401:b40::,2401:b40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:b80::,2401:b80:ffff:ffff:ffff:ffff:ffff:ffff,PH +2401:bc0::,2401:bc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:c00::,2401:c00:ffff:ffff:ffff:ffff:ffff:ffff,NC +2401:c40::,2401:c40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:c80::,2401:c80:ffff:ffff:ffff:ffff:ffff:ffff,NZ +2401:cc0::,2401:cc0:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:d00::,2401:d00:ffff:ffff:ffff:ffff:ffff:ffff,SG +2401:d40::,2401:d40:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:d80::,2401:d80:ffff:ffff:ffff:ffff:ffff:ffff,AU +2401:dc0::,2401:dc0:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:e00::,2401:e00:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:e40::,2401:e40:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:e80::,2401:e80:ffff:ffff:ffff:ffff:ffff:ffff,TH +2401:ec0::,2401:ec0:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:f00::,2401:f00:ffff:ffff:ffff:ffff:ffff:ffff,ID +2401:f40::,2401:f40:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:f80::,2401:f80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:1000::,2401:1000:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:1100::,2401:1100:ffff:ffff:ffff:ffff:ffff:ffff,HK @@ -6588,7 +7000,6 @@ 2401:1300::,2401:1300:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2401:1380::,2401:1380:ffff:ffff:ffff:ffff:ffff:ffff,HK 2401:1400::,2401:1400:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:1480::,2401:1480:ffff:ffff:ffff:ffff:ffff:ffff,KH 2401:1500::,2401:1500:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:1580::,2401:1580:ffff:ffff:ffff:ffff:ffff:ffff,SG 2401:1600::,2401:1600:ffff:ffff:ffff:ffff:ffff:ffff,PH @@ -6687,6 +7098,7 @@ 2401:4400::,2401:4400:ffff:ffff:ffff:ffff:ffff:ffff,AU 2401:4480::,2401:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:4580::,2401:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN +2401:4600::,2401:4600:ffff:ffff:ffff:ffff:ffff:ffff,BD 2401:4680::,2401:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN 2401:4700::,2401:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:4780::,2401:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -7009,7 +7421,6 @@ 2401:f580::,2401:f580:ffff:ffff:ffff:ffff:ffff:ffff,IN 2401:f680::,2401:f680:ffff:ffff:ffff:ffff:ffff:ffff,PG 2401:f700::,2401:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU -2401:f780::,2401:f780:ffff:ffff:ffff:ffff:ffff:ffff,NP 2401:f800::,2401:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP 2401:f880::,2401:f880:ffff:ffff:ffff:ffff:ffff:ffff,MY 2401:f900::,2401:f900:ffff:ffff:ffff:ffff:ffff:ffff,SG @@ -7017,7 +7428,9 @@ 2401:fa00::,2401:fa00::7fff:ffff:ffff:ffff:ffff,AU 2401:fa00:0:8000::,2401:fa00::ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:1::,2401:fa00:1:7fff:ffff:ffff:ffff:ffff,TW -2401:fa00:1:8000::,2401:fa00:3:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:1:8000::,2401:fa00:3:fcff:ffff:ffff:ffff:ffff,IN +2401:fa00:3:fd00::,2401:fa00:3:fd00:ffff:ffff:ffff:ffff,SG +2401:fa00:3:fd01::,2401:fa00:3:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:4::,2401:fa00:4:ffff:ffff:ffff:ffff:ffff,JP 2401:fa00:5::,2401:fa00:6:7fff:ffff:ffff:ffff:ffff,IN 2401:fa00:6:8000::,2401:fa00:6:ffff:ffff:ffff:ffff:ffff,AU @@ -7032,9 +7445,12 @@ 2401:fa00:11:8000::,2401:fa00:11:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:12::,2401:fa00:12:ffff:ffff:ffff:ffff:ffff,NZ 2401:fa00:13::,2401:fa00:13:ffff:ffff:ffff:ffff:ffff,HK -2401:fa00:14::,2401:fa00:17:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:14::,2401:fa00:16:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:17::,2401:fa00:17:ffff:ffff:ffff:ffff:ffff,KR 2401:fa00:18::,2401:fa00:18:7fff:ffff:ffff:ffff:ffff,PH -2401:fa00:18:8000::,2401:fa00:1b:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:18:8000::,2401:fa00:18:ffff:ffff:ffff:ffff:ffff,IN +2401:fa00:19::,2401:fa00:19:ffff:ffff:ffff:ffff:ffff,TH +2401:fa00:1a::,2401:fa00:1b:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:1c::,2401:fa00:1c:ffff:ffff:ffff:ffff:ffff,KR 2401:fa00:1d::,2401:fa00:1e:ffff:ffff:ffff:ffff:ffff,IN 2401:fa00:1f::,2401:fa00:1f:7fff:ffff:ffff:ffff:ffff,JP @@ -7098,7 +7514,6 @@ 2402:1200::,2402:1200:ffff:ffff:ffff:ffff:ffff:ffff,ID 2402:1280::,2402:1280:ffff:ffff:ffff:ffff:ffff:ffff,AU 2402:1300::,2402:1300:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:1380::,2402:1380:ffff:ffff:ffff:ffff:ffff:ffff,BD 2402:1400::,2402:1400:ffff:ffff:ffff:ffff:ffff:ffff,JP 2402:1500::,2402:1500:ffff:ffff:ffff:ffff:ffff:ffff,HK 2402:1580::,2402:1580:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -7234,7 +7649,6 @@ 2402:5900::,2402:5900:ffff:ffff:ffff:ffff:ffff:ffff,SG 2402:5980::,2402:5980:ffff:ffff:ffff:ffff:ffff:ffff,SG 2402:5a00::,2402:5a00:ffff:ffff:ffff:ffff:ffff:ffff,JP -2402:5a80::,2402:5a80:ffff:ffff:ffff:ffff:ffff:ffff,PG 2402:5b00::,2402:5b00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2402:5b80::,2402:5b80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2402:5c00::,2402:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -7284,7 +7698,6 @@ 2402:7300::,2402:7300:ffff:ffff:ffff:ffff:ffff:ffff,HK 2402:7380::,2402:7380:7ff:ffff:ffff:ffff:ffff:ffff,JP 2402:7380:800::,2402:7380:fff:ffff:ffff:ffff:ffff:ffff,HK -2402:7380:1000::,2402:7380:ffff:ffff:ffff:ffff:ffff:ffff,CN 2402:7400::,2402:7400:ffff:ffff:ffff:ffff:ffff:ffff,AU 2402:7480::,2402:7481:ffff:ffff:ffff:ffff:ffff:ffff,SG 2402:7500::,2402:7500:ffff:ffff:ffff:ffff:ffff:ffff,TW @@ -7321,7 +7734,6 @@ 2402:8400::,2402:8400:ffff:ffff:ffff:ffff:ffff:ffff,IN 2402:8480::,2402:8480:ffff:ffff:ffff:ffff:ffff:ffff,AU 2402:8500::,2402:8500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:8580::,2402:8580:ffff:ffff:ffff:ffff:ffff:ffff,HK 2402:8600::,2402:8600:ffff:ffff:ffff:ffff:ffff:ffff,ID 2402:8680::,2402:8680:ffff:ffff:ffff:ffff:ffff:ffff,IN 2402:8700::,2402:8700:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -7370,7 +7782,9 @@ 2402:9e80::,2402:9e80:13:ffff:ffff:ffff:ffff:ffff,HK 2402:9e80:14::,2402:9e80:14:ffff:ffff:ffff:ffff:ffff,VN 2402:9e80:15::,2402:9e80:15:ffff:ffff:ffff:ffff:ffff,US -2402:9e80:16::,2402:9e80:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:9e80:16::,2402:9e80:18:ffff:ffff:ffff:ffff:ffff,HK +2402:9e80:19::,2402:9e80:19:ffff:ffff:ffff:ffff:ffff,KR +2402:9e80:1a::,2402:9e80:ffff:ffff:ffff:ffff:ffff:ffff,HK 2402:9f00::,2402:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2402:9f80::,2402:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2402:a000::,2402:a000:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -7446,7 +7860,7 @@ 2402:c400::,2402:c400:ffff:ffff:ffff:ffff:ffff:ffff,JP 2402:c480::,2402:c480:ffff:ffff:ffff:ffff:ffff:ffff,HK 2402:c500::,2402:c500:ffff:ffff:ffff:ffff:ffff:ffff,AU -2402:c580::,2402:c580:ffff:ffff:ffff:ffff:ffff:ffff,HK +2402:c580::,2402:c580:ffff:ffff:ffff:ffff:ffff:ffff,US 2402:c600::,2402:c600:ffff:ffff:ffff:ffff:ffff:ffff,JP 2402:c680::,2402:c680:ffff:ffff:ffff:ffff:ffff:ffff,HK 2402:c700::,2402:c700:ffff:ffff:ffff:ffff:ffff:ffff,VN @@ -8156,7 +8570,6 @@ 2404:1900::,2404:1900:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:1980::,2404:1980:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:1a00::,2404:1a00:ffff:ffff:ffff:ffff:ffff:ffff,TH -2404:1a80::,2404:1a80:ffff:ffff:ffff:ffff:ffff:ffff,NZ 2404:1b00::,2404:1b00:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:1b80::,2404:1b80:ffff:ffff:ffff:ffff:ffff:ffff,IN 2404:1c00::,2404:1c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ @@ -8190,7 +8603,6 @@ 2404:2a80:15::,2404:2a80:15:ffff:ffff:ffff:ffff:ffff,US 2404:2a80:16::,2404:2a80:ffff:ffff:ffff:ffff:ffff:ffff,HK 2404:2b00::,2404:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AU -2404:2b80::,2404:2b80:ffff:ffff:ffff:ffff:ffff:ffff,BD 2404:2c00::,2404:2c00:ffff:ffff:ffff:ffff:ffff:ffff,NP 2404:2c80::,2404:2c80:ffff:ffff:ffff:ffff:ffff:ffff,ID 2404:2d00::,2404:2d00:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -8254,7 +8666,6 @@ 2404:4d00::,2404:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2404:4d80::,2404:4d80:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:4e00::,2404:4e00:ffff:ffff:ffff:ffff:ffff:ffff,SG -2404:4e80::,2404:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2404:4f00::,2404:4f01:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:4f80::,2404:4f80:ffff:ffff:ffff:ffff:ffff:ffff,BD 2404:5000::,2404:5000:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -8281,10 +8692,11 @@ 2404:5a80::,2404:5a80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2404:5b00::,2404:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2404:5b80::,2404:5b80:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2404:5c00::,2404:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:5c80::,2404:5c80:ffff:ffff:ffff:ffff:ffff:ffff,IN 2404:5d00::,2404:5d00:ffff:ffff:ffff:ffff:ffff:ffff,CN -2404:5d80::,2404:5d80:ffff:ffff:ffff:ffff:ffff:ffff,JP +2404:5d80::,2404:5d80:5fff:ffff:ffff:ffff:ffff:ffff,JP +2404:5d80:6000::,2404:5d80:60ff:ffff:ffff:ffff:ffff:ffff,AU +2404:5d80:6100::,2404:5d80:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:5e00::,2404:5e00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:5e80::,2404:5e80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2404:5f00::,2404:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -8309,7 +8721,9 @@ 2404:6800:4003::,2404:6800:4003:ffff:ffff:ffff:ffff:ffff,SG 2404:6800:4004::,2404:6800:4007:ffff:ffff:ffff:ffff:ffff,AU 2404:6800:4008::,2404:6800:4008:ffff:ffff:ffff:ffff:ffff,TW -2404:6800:4009::,2404:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU +2404:6800:4009::,2404:6800:400a:ffff:ffff:ffff:ffff:ffff,AU +2404:6800:400b::,2404:6800:400b:ffff:ffff:ffff:ffff:ffff,JP +2404:6800:400c::,2404:6800:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:6900::,2404:6900:ffff:ffff:ffff:ffff:ffff:ffff,HK 2404:6980::,2404:6980:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:6a00::,2404:6a00:ffff:ffff:ffff:ffff:ffff:ffff,NZ @@ -8334,7 +8748,6 @@ 2404:7400::,2404:7400:ffff:ffff:ffff:ffff:ffff:ffff,PH 2404:7480::,2404:7480:ffff:ffff:ffff:ffff:ffff:ffff,HK 2404:7500::,2404:7500:ffff:ffff:ffff:ffff:ffff:ffff,BD -2404:7580::,2404:7587:ffff:ffff:ffff:ffff:ffff:ffff,PK 2404:7600::,2404:7600:ffff:ffff:ffff:ffff:ffff:ffff,CN 2404:7680::,2404:7680:ffff:ffff:ffff:ffff:ffff:ffff,PK 2404:7700::,2404:7700:ffff:ffff:ffff:ffff:ffff:ffff,IN @@ -8346,7 +8759,6 @@ 2404:7a00::,2404:7a00:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:7a80::,2404:7a87:ffff:ffff:ffff:ffff:ffff:ffff,JP 2404:7b00::,2404:7b00:ffff:ffff:ffff:ffff:ffff:ffff,IN -2404:7b80::,2404:7b80:ffff:ffff:ffff:ffff:ffff:ffff,PK 2404:7c00::,2404:7c00:ffff:ffff:ffff:ffff:ffff:ffff,NP 2404:7c80::,2404:7c80:ffff:ffff:ffff:ffff:ffff:ffff,IN 2404:7d00::,2404:7d00:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -8356,7 +8768,6 @@ 2404:7f00::,2404:7f00:ffff:ffff:ffff:ffff:ffff:ffff,AU 2404:7f80::,2404:7f80:ffff:ffff:ffff:ffff:ffff:ffff,IN 2404:8000::,2404:8000:ffff:ffff:ffff:ffff:ffff:ffff,ID -2404:8080::,2404:8081:ffff:ffff:ffff:ffff:ffff:ffff,US 2404:8100::,2404:8100:ffff:ffff:ffff:ffff:ffff:ffff,MY 2404:8180::,2404:8180:ffff:ffff:ffff:ffff:ffff:ffff,PK 2404:8200::,2404:8200:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -8624,7 +9035,9 @@ 2405:80::,2405:80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2405:100::,2405:100:ffff:ffff:ffff:ffff:ffff:ffff,ID 2405:180::,2405:180:ffff:ffff:ffff:ffff:ffff:ffff,AU -2405:200::,2405:207:ffff:ffff:ffff:ffff:ffff:ffff,IN +2405:200::,2405:205:4204:563c::1e49:20a4,IN +2405:205:4204:563c::1e49:20a5,2405:205:4204:563c::1e49:20a5,US +2405:205:4204:563c::1e49:20a6,2405:207:ffff:ffff:ffff:ffff:ffff:ffff,IN 2405:400::,2405:400:ffff:ffff:ffff:ffff:ffff:ffff,MH 2405:480::,2405:480:ffff:ffff:ffff:ffff:ffff:ffff,CN 2405:500::,2405:500:ffff:ffff:ffff:ffff:ffff:ffff,ID @@ -8706,7 +9119,9 @@ 2405:2000:2200::,2405:2000:2200:ff:ffff:ffff:ffff:ffff,MY 2405:2000:2200:100::,2405:2000:22ff:ffff:ffff:ffff:ffff:ffff,IN 2405:2000:2300::,2405:2000:2300:ff:ffff:ffff:ffff:ffff,MY -2405:2000:2300:100::,2405:2000:ffc7:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:2300:100::,2405:2000:24ff:ffff:ffff:ffff:ffff:ffff,IN +2405:2000:2500::,2405:2000:2500:ffff:ffff:ffff:ffff:ffff,JP +2405:2000:2501::,2405:2000:ffc7:ffff:ffff:ffff:ffff:ffff,IN 2405:2000:ffc8::,2405:2000:ffc8:ffff:ffff:ffff:ffff:ffff,SG 2405:2000:ffc9::,2405:2001::ffff:ffff:ffff:ffff:ffff,IN 2405:2001:1::,2405:2001:1:ff:ffff:ffff:ffff:ffff,SG @@ -8959,7 +9374,6 @@ 2405:9b00::,2405:9b00:ffff:ffff:ffff:ffff:ffff:ffff,CN 2405:9b80::,2405:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2405:9c00::,2405:9c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ -2405:9c80::,2405:9c83:ffff:ffff:ffff:ffff:ffff:ffff,IN 2405:9d00::,2405:9d00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2405:9d80::,2405:9d80:ffff:ffff:ffff:ffff:ffff:ffff,VN 2405:9e00::,2405:9e00:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -9156,7 +9570,6 @@ 2406:400::,2406:400:ffff:ffff:ffff:ffff:ffff:ffff,TH 2406:480::,2406:480:ffff:ffff:ffff:ffff:ffff:ffff,TH 2406:500::,2406:500:ffff:ffff:ffff:ffff:ffff:ffff,JP -2406:580::,2406:580:ffff:ffff:ffff:ffff:ffff:ffff,AU 2406:600::,2406:600:ffff:ffff:ffff:ffff:ffff:ffff,JP 2406:680::,2406:680:ffff:ffff:ffff:ffff:ffff:ffff,SG 2406:700::,2406:700:ffff:ffff:ffff:ffff:ffff:ffff,JP @@ -9636,7 +10049,17 @@ 2406:dafc:a000::,2406:dafc:a0ff:ffff:ffff:ffff:ffff:ffff,IN 2406:dafc:a100::,2406:dafc:bfff:ffff:ffff:ffff:ffff:ffff,US 2406:dafc:c000::,2406:dafc:c0ff:ffff:ffff:ffff:ffff:ffff,AU -2406:dafc:c100::,2406:daff:ffff:ffff:ffff:ffff:ffff:ffff,US +2406:dafc:c100::,2406:daff:1fff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:2000::,2406:daff:20ff:ffff:ffff:ffff:ffff:ffff,KR +2406:daff:2100::,2406:daff:3fff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:4000::,2406:daff:40ff:ffff:ffff:ffff:ffff:ffff,JP +2406:daff:4100::,2406:daff:7fff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:8000::,2406:daff:80ff:ffff:ffff:ffff:ffff:ffff,SG +2406:daff:8100::,2406:daff:9fff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:a000::,2406:daff:a0ff:ffff:ffff:ffff:ffff:ffff,IN +2406:daff:a100::,2406:daff:bfff:ffff:ffff:ffff:ffff:ffff,US +2406:daff:c000::,2406:daff:c0ff:ffff:ffff:ffff:ffff:ffff,AU +2406:daff:c100::,2406:daff:ffff:ffff:ffff:ffff:ffff:ffff,US 2406:db00::,2406:db00:ffff:ffff:ffff:ffff:ffff:ffff,IN 2406:db80::,2406:db80:ffff:ffff:ffff:ffff:ffff:ffff,CN 2406:dc00::,2406:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -10203,6 +10626,7 @@ 2408:8000::,2408:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN 2409:10::,2409:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP 2409:250::,2409:25f:ffff:ffff:ffff:ffff:ffff:ffff,JP +2409:4000::,2409:43ff:ffff:ffff:ffff:ffff:ffff:ffff,IN 2409:8000::,2409:8fff:ffff:ffff:ffff:ffff:ffff:ffff,CN 240a::,240a:7f:ffff:ffff:ffff:ffff:ffff:ffff,JP 240a:8000::,240a:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN @@ -10264,7 +10688,11 @@ 2600:1ffc:1000::,2600:1ffc:10ff:ffff:ffff:ffff:ffff:ffff,CA 2600:1ffc:1100::,2600:1ffc:dfff:ffff:ffff:ffff:ffff:ffff,US 2600:1ffc:e000::,2600:1ffc:e0ff:ffff:ffff:ffff:ffff:ffff,BR -2600:1ffc:e100::,2600:200f:ffff:ffff:ffff:ffff:ffff:ffff,US +2600:1ffc:e100::,2600:1fff:fff:ffff:ffff:ffff:ffff:ffff,US +2600:1fff:1000::,2600:1fff:10ff:ffff:ffff:ffff:ffff:ffff,CA +2600:1fff:1100::,2600:1fff:dfff:ffff:ffff:ffff:ffff:ffff,US +2600:1fff:e000::,2600:1fff:e0ff:ffff:ffff:ffff:ffff:ffff,BR +2600:1fff:e100::,2600:200f:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:2100::,2600:210f:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:2200::,2600:220f:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:2300::,2600:230f:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -10294,7 +10722,7 @@ 2600:7000::,2600:70ff:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:7400::,2600:740f:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:7800::,2600:780f:ffff:ffff:ffff:ffff:ffff:ffff,US -2600:7c00::,2600:7c0f:ffff:ffff:ffff:ffff:ffff:ffff,VC +2600:7c00::,2600:7c0f:ffff:ffff:ffff:ffff:ffff:ffff,LC 2600:8000::,2600:80ff:ffff:ffff:ffff:ffff:ffff:ffff,US 2600:8400::,2600:840f:ffff:ffff:ffff:ffff:ffff:ffff,BB 2600:8800::,2600:880f:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -10313,6 +10741,28 @@ 2602:233::,2602:233:ffff:ffff:ffff:ffff:ffff:ffff,US 2602:240::,2602:25f:ffff:ffff:ffff:ffff:ffff:ffff,US 2602:300::,2602:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2602:fef4::,2602:fef4:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef5::,2602:fef5:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef6::,2602:fef6:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef7::,2602:fef7:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef8::,2602:fef8:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fef9::,2602:fef9:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fefa::,2602:fefa:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fefb::,2602:fefb:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fefc::,2602:fefc:fff:ffff:ffff:ffff:ffff:ffff,CA +2602:fefd::,2602:fefd:fff:ffff:ffff:ffff:ffff:ffff,US +2602:fefe::,2602:fefe:fff:ffff:ffff:ffff:ffff:ffff,US +2602:feff::,2602:feff:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff00::,2602:ff00:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff01::,2602:ff01:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff02::,2602:ff02:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff04::,2602:ff04:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff05::,2602:ff05:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff06::,2602:ff06:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff07::,2602:ff07:fff:ffff:ffff:ffff:ffff:ffff,CW +2602:ff08::,2602:ff08:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff09::,2602:ff09:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff0a::,2602:ff0a:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff0b::,2602:ff0b:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff0c::,2602:ff0c:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff0d::,2602:ff0d:fff:ffff:ffff:ffff:ffff:ffff,CA @@ -10344,8 +10794,7 @@ 2602:ff27::,2602:ff27:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff28::,2602:ff28:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff29::,2602:ff29:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff2a::,2602:ff2a:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff2b::,2602:ff2b:fff:ffff:ffff:ffff:ffff:ffff,US +2602:ff2a::,2602:ff2b:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff2c::,2602:ff2c:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff2d::,2602:ff2d:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff2e::,2602:ff2e:fff:ffff:ffff:ffff:ffff:ffff,US @@ -10408,7 +10857,6 @@ 2602:ff67::,2602:ff67:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff68::,2602:ff68:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff69::,2602:ff69:fff:ffff:ffff:ffff:ffff:ffff,US -2602:ff6a::,2602:ff6a:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff6b::,2602:ff6b:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ff6c::,2602:ff6c:fff:ffff:ffff:ffff:ffff:ffff,CA 2602:ff6d::,2602:ff6d:fff:ffff:ffff:ffff:ffff:ffff,CA @@ -10458,7 +10906,6 @@ 2602:ff9d::,2602:ff9d:fff:ffff:ffff:ffff:ffff:ffff,CA 2602:ff9f::,2602:ff9f:fff:ffff:ffff:ffff:ffff:ffff,CA 2602:ffa0::,2602:ffa0:fff:ffff:ffff:ffff:ffff:ffff,VG -2602:ffa1::,2602:ffa1:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffa2::,2602:ffa2:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffa3::,2602:ffa3:fff:ffff:ffff:ffff:ffff:ffff,US 2602:ffa4::,2602:ffa4:fff:ffff:ffff:ffff:ffff:ffff,US @@ -10553,9 +11000,11 @@ 2602:ffff::,2602:ffff:fff:ffff:ffff:ffff:ffff:ffff,US 2603::,2603:100f:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1010::,2603:1010::ffff:ffff:ffff:ffff:ffff,AU -2603:1010:1::,2603:1010:ff:ffff:ffff:ffff:ffff:ffff,US -2603:1010:100::,2603:1010:1ff:ffff:ffff:ffff:ffff:ffff,AU -2603:1010:200::,2603:1015:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1010:1::,2603:1010:1:ffff:ffff:ffff:ffff:ffff,US +2603:1010:2::,2603:1010:2:ffff:ffff:ffff:ffff:ffff,AU +2603:1010:3::,2603:1010:ff:ffff:ffff:ffff:ffff:ffff,US +2603:1010:100::,2603:1010:200:ffff:ffff:ffff:ffff:ffff,AU +2603:1010:201::,2603:1015:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1016::,2603:1016::4c:ffff:ffff:ffff:ffff,AU 2603:1016:0:4d::,2603:1016:1f:ffff:ffff:ffff:ffff:ffff,US 2603:1016:20::,2603:1016:2f:ffff:ffff:ffff:ffff:ffff,AU @@ -10567,7 +11016,7 @@ 2603:1019:200::,2603:1019:2ff:ffff:ffff:ffff:ffff:ffff,AU 2603:1019:300::,2603:101f:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1020::,2603:1020:ff:ffff:ffff:ffff:ffff:ffff,IE -2603:1020:100::,2603:1020:1ff:ffff:ffff:ffff:ffff:ffff,US +2603:1020:100::,2603:1020:1ff:ffff:ffff:ffff:ffff:ffff,AT 2603:1020:200::,2603:1020:2ff:ffff:ffff:ffff:ffff:ffff,NL 2603:1020:300::,2603:1020:4ff:ffff:ffff:ffff:ffff:ffff,GB 2603:1020:500::,2603:1020:5ff:ffff:ffff:ffff:ffff:ffff,US @@ -10594,8 +11043,10 @@ 2603:1026:700::,2603:1026:7ff:ffff:ffff:ffff:ffff:ffff,US 2603:1026:800::,2603:1026:8ff:ffff:ffff:ffff:ffff:ffff,GB 2603:1026:900::,2603:1026:fff:ffff:ffff:ffff:ffff:ffff,US -2603:1026:1000::,2603:1026:1fff:ffff:ffff:ffff:ffff:ffff,IE -2603:1026:2000::,2603:1027::1:ffff:ffff:ffff:ffff,US +2603:1026:1000::,2603:1026:10ff:ffff:ffff:ffff:ffff:ffff,IE +2603:1026:1100::,2603:1026:12ff:ffff:ffff:ffff:ffff:ffff,FR +2603:1026:1300::,2603:1026:13ff:ffff:ffff:ffff:ffff:ffff,NL +2603:1026:1400::,2603:1027::1:ffff:ffff:ffff:ffff,US 2603:1027:0:2::,2603:1027::3:ffff:ffff:ffff:ffff,NL 2603:1027:0:4::,2603:1027::4:ffff:ffff:ffff:ffff,IE 2603:1027:0:5::,2603:1027::5:ffff:ffff:ffff:ffff,US @@ -10631,12 +11082,18 @@ 2603:1030:f00::,2603:1030:10ff:ffff:ffff:ffff:ffff:ffff,CA 2603:1030:1100::,2603:1036:aff:ffff:ffff:ffff:ffff:ffff,US 2603:1036:b00::,2603:1036:cff:ffff:ffff:ffff:ffff:ffff,CA -2603:1036:d00::,2603:1039:dff:ffff:ffff:ffff:ffff:ffff,US +2603:1036:d00::,2603:1037::d:ffff:ffff:ffff:ffff,US +2603:1037:0:e::,2603:1037::f:ffff:ffff:ffff:ffff,CA +2603:1037:0:10::,2603:1037::8d:ffff:ffff:ffff:ffff,US +2603:1037:0:8e::,2603:1037::8f:ffff:ffff:ffff:ffff,CA +2603:1037:0:90::,2603:1039:dff:ffff:ffff:ffff:ffff:ffff,US 2603:1039:e00::,2603:1039:eff:ffff:ffff:ffff:ffff:ffff,CA 2603:1039:f00::,2603:1039:fff:ffff:ffff:ffff:ffff:ffff,US 2603:1039:1000::,2603:1039:10ff:ffff:ffff:ffff:ffff:ffff,CA 2603:1039:1100::,2603:1039:1100:ffff:ffff:ffff:ffff:ffff,PR -2603:1039:1101::,2603:1040:1ff:ffff:ffff:ffff:ffff:ffff,US +2603:1039:1101::,2603:103f:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1040::,2603:1040:ff:ffff:ffff:ffff:ffff:ffff,SG +2603:1040:100::,2603:1040:1ff:ffff:ffff:ffff:ffff:ffff,MY 2603:1040:200::,2603:1040:2ff:ffff:ffff:ffff:ffff:ffff,HK 2603:1040:300::,2603:1040:3ff:ffff:ffff:ffff:ffff:ffff,US 2603:1040:400::,2603:1040:4ff:ffff:ffff:ffff:ffff:ffff,JP @@ -10648,7 +11105,9 @@ 2603:1040:a00::,2603:1040:aff:ffff:ffff:ffff:ffff:ffff,IN 2603:1040:b00::,2603:1040:bff:ffff:ffff:ffff:ffff:ffff,US 2603:1040:c00::,2603:1040:cff:ffff:ffff:ffff:ffff:ffff,IN -2603:1040:d00::,2603:1045:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:d00::,2603:1040:dff:ffff:ffff:ffff:ffff:ffff,US +2603:1040:e00::,2603:1040:eff:ffff:ffff:ffff:ffff:ffff,KR +2603:1040:f00::,2603:1045:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1046::,2603:1046:ff:ffff:ffff:ffff:ffff:ffff,SG 2603:1046:100::,2603:1046:1ff:ffff:ffff:ffff:ffff:ffff,KR 2603:1046:200::,2603:1046:2ff:ffff:ffff:ffff:ffff:ffff,HK @@ -10681,7 +11140,10 @@ 2603:1047:0:5::,2603:1047::5:ffff:ffff:ffff:ffff,HK 2603:1047:0:6::,2603:1047::6:ffff:ffff:ffff:ffff,SG 2603:1047:0:7::,2603:1047::7:ffff:ffff:ffff:ffff,KR -2603:1047:0:8::,2603:1047::3f:ffff:ffff:ffff:ffff,US +2603:1047:0:8::,2603:1047::9:ffff:ffff:ffff:ffff,JP +2603:1047:0:a::,2603:1047::b:ffff:ffff:ffff:ffff,AU +2603:1047:0:c::,2603:1047::d:ffff:ffff:ffff:ffff,IN +2603:1047:0:e::,2603:1047::3f:ffff:ffff:ffff:ffff,US 2603:1047:0:40::,2603:1047::40:ffff:ffff:ffff:ffff,JP 2603:1047:0:41::,2603:1047::41:ffff:ffff:ffff:ffff,SG 2603:1047:0:42::,2603:1047::42:ffff:ffff:ffff:ffff,JP @@ -10699,7 +11161,10 @@ 2603:1047:0:85::,2603:1047::85:ffff:ffff:ffff:ffff,HK 2603:1047:0:86::,2603:1047::86:ffff:ffff:ffff:ffff,SG 2603:1047:0:87::,2603:1047::87:ffff:ffff:ffff:ffff,KR -2603:1047:0:88::,2603:1047::bf:ffff:ffff:ffff:ffff,US +2603:1047:0:88::,2603:1047::89:ffff:ffff:ffff:ffff,JP +2603:1047:0:8a::,2603:1047::8b:ffff:ffff:ffff:ffff,AU +2603:1047:0:8c::,2603:1047::8d:ffff:ffff:ffff:ffff,IN +2603:1047:0:8e::,2603:1047::bf:ffff:ffff:ffff:ffff,US 2603:1047:0:c0::,2603:1047::c0:ffff:ffff:ffff:ffff,JP 2603:1047:0:c1::,2603:1047::c1:ffff:ffff:ffff:ffff,SG 2603:1047:0:c2::,2603:1047::c2:ffff:ffff:ffff:ffff,JP @@ -10728,7 +11193,9 @@ 2603:1049:e00::,2603:1049:eff:ffff:ffff:ffff:ffff:ffff,IN 2603:1049:f00::,2603:1049:fff:ffff:ffff:ffff:ffff:ffff,US 2603:1049:1000::,2603:1049:10ff:ffff:ffff:ffff:ffff:ffff,IN -2603:1049:1100::,2603:1050:20f:ffff:ffff:ffff:ffff:ffff,US +2603:1049:1100::,2603:1050::ffff:ffff:ffff:ffff:ffff,US +2603:1050:1::,2603:1050:1:ffff:ffff:ffff:ffff:ffff,BR +2603:1050:2::,2603:1050:20f:ffff:ffff:ffff:ffff:ffff,US 2603:1050:210::,2603:1050:21f:ffff:ffff:ffff:ffff:ffff,CL 2603:1050:220::,2603:1055:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1056::,2603:1056:2:3f:ffff:ffff:ffff:ffff,BR @@ -10744,7 +11211,9 @@ 2603:1056:400::,2603:1056:4ff:ffff:ffff:ffff:ffff:ffff,BR 2603:1056:500::,2603:1056:5ff:ffff:ffff:ffff:ffff:ffff,US 2603:1056:600::,2603:1056:6ff:ffff:ffff:ffff:ffff:ffff,CL -2603:1056:700::,2603:1058:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1056:700::,2603:1057:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:1058::,2603:1058:1f:ffff:ffff:ffff:ffff:ffff,CL +2603:1058:20::,2603:1058:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:1059::,2603:1059::ffff:ffff:ffff:ffff:ffff,BR 2603:1059:1::,2603:1059:1:ffff:ffff:ffff:ffff:ffff,CL 2603:1059:2::,2603:1059:f:ffff:ffff:ffff:ffff:ffff,US @@ -10758,6 +11227,8 @@ 2603:4000::,2603:40ff:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:5000::,2603:50ff:ffff:ffff:ffff:ffff:ffff:ffff,US 2603:6000::,2603:60ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:7000::,2603:70ff:ffff:ffff:ffff:ffff:ffff:ffff,US +2603:8000::,2603:80ff:ffff:ffff:ffff:ffff:ffff:ffff,US 2604::,2604::ffff:ffff:ffff:ffff:ffff:ffff,US 2604:10::,2604:10:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:50::,2604:50:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -10831,89 +11302,169 @@ 2604:1200::,2604:1200:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1240::,2604:1240:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1280::,2604:1280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:12c0::,2604:12c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1300::,2604:1300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1340::,2604:1340:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1380::,2604:1380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:13c0::,2604:13c0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1400::,2604:1400:ffff:ffff:ffff:ffff:ffff:ffff,PR +2604:1440::,2604:1440:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1480::,2604:1480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:14c0::,2604:14c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1500::,2604:1500:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1540::,2604:1540:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1580::,2604:1580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:15c0::,2604:15c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1600::,2604:1600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1640::,2604:1640:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1680::,2604:1680:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:16c0::,2604:16c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1700::,2604:1700:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1740::,2604:1740:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1780::,2604:1780:ffff:ffff:ffff:ffff:ffff:ffff,KY +2604:17c0::,2604:17c0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1800::,2604:1800:ffff:ffff:ffff:ffff:ffff:ffff,GP +2604:1840::,2604:1840:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1880::,2604:1880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:18c0::,2604:18c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1900::,2604:1900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1940::,2604:1940:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1980::,2604:1980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:19c0::,2604:19c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1a00::,2604:1a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1a40::,2604:1a40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1a80::,2604:1a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1ac0::,2604:1ac0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1b00::,2604:1b00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1b40::,2604:1b40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1b80::,2604:1b80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1bc0::,2604:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1c00::,2604:1c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1c40::,2604:1c40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1c80::,2604:1c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1cc0::,2604:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,PR 2604:1d00::,2604:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1d40::,2604:1d40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1d80::,2604:1d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1dc0::,2604:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1e00::,2604:1e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1e40::,2604:1e40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1e80::,2604:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1ec0::,2604:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:1f00::,2604:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:1f40::,2604:1f40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:1f80::,2604:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:1fc0::,2604:1fc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2000::,2604:2000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2040::,2604:2040:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2080::,2604:2080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:20c0::,2604:20c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2100::,2604:2100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2140::,2604:2140:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2180::,2604:2180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:21c0::,2604:21c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2200::,2604:2200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2240::,2604:2240:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2280::,2604:2280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:22c0::,2604:22c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2300::,2604:2300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2340::,2604:2340:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2380::,2604:2380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:23c0::,2604:23c0:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:2400::,2604:2400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2440::,2604:2440:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2480::,2604:2480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:24c0::,2604:24c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2500::,2604:2500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2540::,2604:2540:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2580::,2604:2580:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:25c0::,2604:25c0:ffff:ffff:ffff:ffff:ffff:ffff,CW 2604:2600::,2604:2600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2640::,2604:2640:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2680::,2604:2680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:26c0::,2604:26c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2700::,2604:2700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2740::,2604:2740:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2780::,2604:2780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:27c0::,2604:27c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2800::,2604:2800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2840::,2604:2840:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:2880::,2604:2880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:28c0::,2604:28c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2900::,2604:2900:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2940::,2604:2940:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2980::,2604:2980:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:29c0::,2604:29c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2a00::,2604:2a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2a40::,2604:2a40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2a80::,2604:2a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2ac0::,2604:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2b00::,2604:2b00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2b40::,2604:2b40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2b80::,2604:2b80:fff:ffff:ffff:ffff:ffff:ffff,CA +2604:2bc0::,2604:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2c00::,2604:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2c40::,2604:2c40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2c80::,2604:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2cc0::,2604:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2d00::,2604:2d00:fff:ffff:ffff:ffff:ffff:ffff,US +2604:2d40::,2604:2d40:ffff:ffff:ffff:ffff:ffff:ffff,PR 2604:2d80::,2604:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2dc0::,2604:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2e00::,2604:2e00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2e40::,2604:2e40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2e80::,2604:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2ec0::,2604:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2f00::,2604:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:2f40::,2604:2f40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:2f80::,2604:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:2fc0::,2604:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3000::,2604:3000:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3040::,2604:3040:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3080::,2604:3080:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:30c0::,2604:30c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3100::,2604:3100:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3140::,2604:3140:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3180::,2604:3180:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:31c0::,2604:31c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3200::,2604:3200:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3240::,2604:3240:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3280::,2604:3280:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:32c0::,2604:32c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3300::,2604:3300:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3340::,2604:3340:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3380::,2604:3380:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:33c0::,2604:33c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3400::,2604:3400:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3440::,2604:3440:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3480::,2604:3480:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:34c0::,2604:34c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3500::,2604:3500:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3540::,2604:3540:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3580::,2604:3580:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:35c0::,2604:35c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3600::,2604:3600:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3640::,2604:3640:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3680::,2604:3680:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:36c0::,2604:36c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3700::,2604:3700:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3740::,2604:3740:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3780::,2604:3780:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:37c0::,2604:37c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3800::,2604:3800:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3840::,2604:3840:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3880::,2604:3880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:38c0::,2604:38c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3940::,2604:3940:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:39c0::,2604:39c0:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3a00::,2604:3a00:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:3a40::,2604:3a40:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3a80::,2604:3a80:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:3b00::,2604:3b00:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:3b80::,2604:3b80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3c00::,2604:3c00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3c80::,2604:3c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:3d00::,2604:3d00:ffff:ffff:ffff:ffff:ffff:ffff,CA +2604:3d00::,2604:3d0f:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:3d80::,2604:3d80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3e00::,2604:3e00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:3e80::,2604:3e80:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11078,7 +11629,6 @@ 2604:9280::,2604:9280:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9300::,2604:9300:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9380::,2604:9380:ffff:ffff:ffff:ffff:ffff:ffff,CA -2604:9400::,2604:9400:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9480::,2604:9480:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9500::,2604:9500:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9580::,2604:9580:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11097,7 +11647,7 @@ 2604:9c80::,2604:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9d00::,2604:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9d80::,2604:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US -2604:9e00::,2604:9e01:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:9e00::,2604:9e0f:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9e80::,2604:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CA 2604:9f00::,2604:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:9f80::,2604:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11117,8 +11667,8 @@ 2604:a780::,2604:a780:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:a800::,2604:a800:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:a880::,2604:a880:cac:ffff:ffff:ffff:ffff:ffff,US -2604:a880:cad::,2604:a880:cad:ffff:ffff:ffff:ffff:ffff,CA -2604:a880:cae::,2604:a880:ffff:ffff:ffff:ffff:ffff:ffff,US +2604:a880:cad::,2604:a880:cad:7fff:ffff:ffff:ffff:ffff,CA +2604:a880:cad:8000::,2604:a880:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:a900::,2604:a900:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:a980::,2604:a980:ffff:ffff:ffff:ffff:ffff:ffff,US 2604:aa00::,2604:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11305,7 +11855,6 @@ 2605:900::,2605:900:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:980::,2605:980:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:a00::,2605:a00:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:a80::,2605:a80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b80::,2605:b81:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:c00::,2605:c00:ffff:ffff:ffff:ffff:ffff:ffff,CA 2605:d00::,2605:d00:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11369,9 +11918,7 @@ 2605:2b80::,2605:2b80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2c00::,2605:2c00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2c80::,2605:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:2d80::,2605:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2e00::,2605:2e00:fff:ffff:ffff:ffff:ffff:ffff,CA -2605:2e80::,2605:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:2f00::,2605:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:3000::,2605:3000:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:3080::,2605:3080:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11622,7 +12169,6 @@ 2605:b180::,2605:b180:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b200::,2605:b200:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b280::,2605:b280:ffff:ffff:ffff:ffff:ffff:ffff,US -2605:b300::,2605:b300:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b380::,2605:b380:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b400::,2605:b400:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:b480::,2605:b480:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -11713,7 +12259,6 @@ 2605:e100::,2605:e100:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:e180::,2605:e180:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:e200::,2605:e200:ffff:ffff:ffff:ffff:ffff:ffff,CA -2605:e280::,2605:e280:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:e300::,2605:e300:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:e380::,2605:e380:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:e400::,2605:e400:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -11788,7 +12333,6 @@ 2605:fe80::,2605:fe80:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:ff00::,2605:ff00:ffff:ffff:ffff:ffff:ffff:ffff,US 2605:ff80::,2605:ff80:ffff:ffff:ffff:ffff:ffff:ffff,US -2606::,2606::ffff:ffff:ffff:ffff:ffff:ffff,US 2606:80::,2606:80:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:100::,2606:100:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:180::,2606:180:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -12014,7 +12558,6 @@ 2606:5780::,2606:5780:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5800::,2606:5800:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5880::,2606:5880:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:5900::,2606:5900:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5980::,2606:5980:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:5a00::,2606:5a00:ffff:ffff:ffff:ffff:ffff:ffff,VI 2606:5a80::,2606:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -12116,7 +12659,6 @@ 2606:8c00::,2606:8c00:ffff:ffff:ffff:ffff:ffff:ffff,CA 2606:8c80::,2606:8c80:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:8d00::,2606:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US -2606:8d80::,2606:8d80:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:8e80::,2606:8e80:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:8f00::,2606:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US 2606:8f80::,2606:8f80:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -12643,7 +13185,6 @@ 2607:9600::,2607:9600:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:9680::,2607:9680:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:9700::,2607:9700:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:9780::,2607:9780:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:9800::,2607:9800:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:9880::,2607:9880:ffff:ffff:ffff:ffff:ffff:ffff,CA 2607:9980::,2607:9980:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -12714,7 +13255,6 @@ 2607:ba80::,2607:ba80:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:bb00::,2607:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:bb80::,2607:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US -2607:bc00::,2607:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:bc80::,2607:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:bd00::,2607:bd00:ffff:ffff:ffff:ffff:ffff:ffff,CA 2607:bd80::,2607:bd80:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -12907,6 +13447,7 @@ 2607:f2f8::,2607:f2f8:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f300::,2607:f300:fff:ffff:ffff:ffff:ffff:ffff,US 2607:f308::,2607:f308:ffff:ffff:ffff:ffff:ffff:ffff,US +2607:f310::,2607:f310:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f318::,2607:f318:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f330::,2607:f330:ffff:ffff:ffff:ffff:ffff:ffff,US 2607:f338::,2607:f338:ffff:ffff:ffff:ffff:ffff:ffff,CA @@ -13340,7 +13881,6 @@ 2610:e0::,2610:e0:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:e8::,2610:e8:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:f0::,2610:f0:ffff:ffff:ffff:ffff:ffff:ffff,US -2610:f8::,2610:f8:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:100::,2610:100:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:108::,2610:108:ffff:ffff:ffff:ffff:ffff:ffff,US 2610:120::,2610:120:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -13488,7 +14028,7 @@ 2620:0:cc8::,2620::cc9:ffff:ffff:ffff:ffff:ffff,US 2620:0:cca::,2620::cca:ffff:ffff:ffff:ffff:ffff,SG 2620:0:ccb::,2620::ccd:ffff:ffff:ffff:ffff:ffff,US -2620:0:cce::,2620::cce:ffff:ffff:ffff:ffff:ffff,HK +2620:0:cce::,2620::cce:ffff:ffff:ffff:ffff:ffff,CN 2620:0:ccf::,2620::ccf:ffff:ffff:ffff:ffff:ffff,AU 2620:0:ce0::,2620::ce0:ffff:ffff:ffff:ffff:ffff,US 2620:0:cf0::,2620::cf0:ffff:ffff:ffff:ffff:ffff,US @@ -13507,8 +14047,7 @@ 2620:0:e10::,2620::e10:ffff:ffff:ffff:ffff:ffff,US 2620:0:e20::,2620::e23:ffff:ffff:ffff:ffff:ffff,US 2620:0:e30::,2620::e30:ffff:ffff:ffff:ffff:ffff,US -2620:0:e50::,2620::e50:ffff:ffff:ffff:ffff:ffff,US -2620:0:e60::,2620::e60:ffff:ffff:ffff:ffff:ffff,US +2620:0:e50::,2620::e60:ffff:ffff:ffff:ffff:ffff,US 2620:0:e80::,2620::e80:ffff:ffff:ffff:ffff:ffff,US 2620:0:e90::,2620::e90:ffff:ffff:ffff:ffff:ffff,US 2620:0:ea0::,2620::eb0:ffff:ffff:ffff:ffff:ffff,US @@ -13772,7 +14311,6 @@ 2620:11:e000::,2620:11:e000:ffff:ffff:ffff:ffff:ffff,US 2620:12::,2620:12::ffff:ffff:ffff:ffff:ffff,US 2620:12:2000::,2620:12:2000:ffff:ffff:ffff:ffff:ffff,US -2620:12:4000::,2620:12:4000:ffff:ffff:ffff:ffff:ffff,US 2620:12:6000::,2620:12:6000:ffff:ffff:ffff:ffff:ffff,US 2620:12:8000::,2620:12:8000:ffff:ffff:ffff:ffff:ffff,US 2620:12:a000::,2620:12:a000:ffff:ffff:ffff:ffff:ffff,US @@ -13785,39 +14323,75 @@ 2620:13:8000::,2620:13:8000:ffff:ffff:ffff:ffff:ffff,US 2620:13:a000::,2620:13:a000:ffff:ffff:ffff:ffff:ffff,US 2620:13:c000::,2620:13:c000:ffff:ffff:ffff:ffff:ffff,US +2620:13:e000::,2620:13:e000:ffff:ffff:ffff:ffff:ffff,US 2620:14::,2620:14::ffff:ffff:ffff:ffff:ffff,US +2620:14:2000::,2620:14:2000:ffff:ffff:ffff:ffff:ffff,CA 2620:14:4000::,2620:14:4000:ffff:ffff:ffff:ffff:ffff,US +2620:14:6000::,2620:14:6000:ffff:ffff:ffff:ffff:ffff,CA 2620:14:8000::,2620:14:8000:ffff:ffff:ffff:ffff:ffff,US +2620:14:a000::,2620:14:a000:ffff:ffff:ffff:ffff:ffff,US 2620:14:c000::,2620:14:c000:ffff:ffff:ffff:ffff:ffff,CA +2620:14:e000::,2620:14:e000:ffff:ffff:ffff:ffff:ffff,US 2620:15::,2620:15::ffff:ffff:ffff:ffff:ffff,US +2620:15:2000::,2620:15:2000:ffff:ffff:ffff:ffff:ffff,US +2620:15:6000::,2620:15:6000:ffff:ffff:ffff:ffff:ffff,CA 2620:15:8000::,2620:15:8000:ffff:ffff:ffff:ffff:ffff,US +2620:15:a000::,2620:15:a000:ffff:ffff:ffff:ffff:ffff,US 2620:15:c000::,2620:15:c000:ffff:ffff:ffff:ffff:ffff,US +2620:15:e000::,2620:15:e000:ffff:ffff:ffff:ffff:ffff,US 2620:16::,2620:16::ffff:ffff:ffff:ffff:ffff,CA +2620:16:2000::,2620:16:2000:ffff:ffff:ffff:ffff:ffff,US 2620:16:4000::,2620:16:4000:ffff:ffff:ffff:ffff:ffff,US +2620:16:6000::,2620:16:6000:ffff:ffff:ffff:ffff:ffff,US 2620:16:8000::,2620:16:8000:ffff:ffff:ffff:ffff:ffff,US +2620:16:a000::,2620:16:a000:ffff:ffff:ffff:ffff:ffff,US 2620:16:c000::,2620:16:c000:ffff:ffff:ffff:ffff:ffff,US +2620:16:e000::,2620:16:e000:ffff:ffff:ffff:ffff:ffff,US 2620:17::,2620:17::ffff:ffff:ffff:ffff:ffff,US +2620:17:2000::,2620:17:2000:ffff:ffff:ffff:ffff:ffff,US 2620:17:4000::,2620:17:4000:ffff:ffff:ffff:ffff:ffff,US +2620:17:6000::,2620:17:6000:ffff:ffff:ffff:ffff:ffff,CA 2620:17:8000::,2620:17:800f:ffff:ffff:ffff:ffff:ffff,US +2620:17:a000::,2620:17:a000:ffff:ffff:ffff:ffff:ffff,US 2620:17:c000::,2620:17:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:17:e000::,2620:17:e000:ffff:ffff:ffff:ffff:ffff,US 2620:18::,2620:18::ffff:ffff:ffff:ffff:ffff,US +2620:18:2000::,2620:18:2000:ffff:ffff:ffff:ffff:ffff,US 2620:18:4000::,2620:18:4000:ffff:ffff:ffff:ffff:ffff,US +2620:18:6000::,2620:18:6000:ffff:ffff:ffff:ffff:ffff,CA 2620:18:8000::,2620:18:8000:ffff:ffff:ffff:ffff:ffff,US +2620:18:a000::,2620:18:a000:ffff:ffff:ffff:ffff:ffff,US 2620:18:c000::,2620:18:c000:ffff:ffff:ffff:ffff:ffff,KN +2620:18:e000::,2620:18:e000:ffff:ffff:ffff:ffff:ffff,US 2620:19::,2620:19::ffff:ffff:ffff:ffff:ffff,US +2620:19:2000::,2620:19:2000:ffff:ffff:ffff:ffff:ffff,CA 2620:19:4000::,2620:19:4000:ffff:ffff:ffff:ffff:ffff,CA +2620:19:6000::,2620:19:6000:ffff:ffff:ffff:ffff:ffff,US 2620:19:8000::,2620:19:8000:ffff:ffff:ffff:ffff:ffff,US +2620:19:a000::,2620:19:a000:ffff:ffff:ffff:ffff:ffff,US +2620:19:e000::,2620:19:e00f:ffff:ffff:ffff:ffff:ffff,CA 2620:1a::,2620:1a::ffff:ffff:ffff:ffff:ffff,US +2620:1a:2000::,2620:1a:200f:ffff:ffff:ffff:ffff:ffff,US 2620:1a:4000::,2620:1a:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1a:6000::,2620:1a:6000:ffff:ffff:ffff:ffff:ffff,CA 2620:1a:8000::,2620:1a:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1a:a000::,2620:1a:a000:ffff:ffff:ffff:ffff:ffff,US 2620:1a:c000::,2620:1a:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1a:e000::,2620:1a:e000:ffff:ffff:ffff:ffff:ffff,US 2620:1b::,2620:1b:f:ffff:ffff:ffff:ffff:ffff,US +2620:1b:2000::,2620:1b:2000:ffff:ffff:ffff:ffff:ffff,US 2620:1b:4000::,2620:1b:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:6000::,2620:1b:6000:ffff:ffff:ffff:ffff:ffff,US 2620:1b:8000::,2620:1b:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:a000::,2620:1b:a000:ffff:ffff:ffff:ffff:ffff,US 2620:1b:c000::,2620:1b:c000:ffff:ffff:ffff:ffff:ffff,US +2620:1b:e000::,2620:1b:e000:ffff:ffff:ffff:ffff:ffff,US 2620:1c::,2620:1c::ffff:ffff:ffff:ffff:ffff,US +2620:1c:2000::,2620:1c:2000:ffff:ffff:ffff:ffff:ffff,US 2620:1c:4000::,2620:1c:4000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:6000::,2620:1c:6000:ffff:ffff:ffff:ffff:ffff,US 2620:1c:8000::,2620:1c:8000:ffff:ffff:ffff:ffff:ffff,US +2620:1c:a000::,2620:1c:a000:ffff:ffff:ffff:ffff:ffff,US 2620:1c:c000::,2620:1c:c000:ffff:ffff:ffff:ffff:ffff,US 2620:1d::,2620:1d:f:ffff:ffff:ffff:ffff:ffff,US 2620:1d:4000::,2620:1d:4000:ffff:ffff:ffff:ffff:ffff,US @@ -13961,7 +14535,6 @@ 2620:40:8000::,2620:40:8000:ffff:ffff:ffff:ffff:ffff,US 2620:40:c000::,2620:40:c000:ffff:ffff:ffff:ffff:ffff,US 2620:41::,2620:41:1:ffff:ffff:ffff:ffff:ffff,US -2620:41:4000::,2620:41:4000:ffff:ffff:ffff:ffff:ffff,US 2620:41:8000::,2620:41:8000:ffff:ffff:ffff:ffff:ffff,US 2620:42::,2620:42::ffff:ffff:ffff:ffff:ffff,US 2620:42:4000::,2620:42:4000:ffff:ffff:ffff:ffff:ffff,US @@ -14012,7 +14585,6 @@ 2620:4e::,2620:4e::ffff:ffff:ffff:ffff:ffff,US 2620:4e:4000::,2620:4e:4000:ffff:ffff:ffff:ffff:ffff,CA 2620:4e:8000::,2620:4e:8000:ffff:ffff:ffff:ffff:ffff,US -2620:4e:c000::,2620:4e:c000:ffff:ffff:ffff:ffff:ffff,US 2620:4f::,2620:4f::ffff:ffff:ffff:ffff:ffff,US 2620:4f:4000::,2620:4f:4000:ffff:ffff:ffff:ffff:ffff,US 2620:4f:8000::,2620:4f:8000:ffff:ffff:ffff:ffff:ffff,US @@ -14289,7 +14861,6 @@ 2620:96:8000::,2620:96:8000:ffff:ffff:ffff:ffff:ffff,US 2620:96:c000::,2620:96:c000:ffff:ffff:ffff:ffff:ffff,US 2620:97::,2620:97::ffff:ffff:ffff:ffff:ffff,US -2620:97:4000::,2620:97:4000:ffff:ffff:ffff:ffff:ffff,US 2620:97:8000::,2620:97:8000:ffff:ffff:ffff:ffff:ffff,US 2620:97:c000::,2620:97:c000:ffff:ffff:ffff:ffff:ffff,US 2620:98::,2620:98::ffff:ffff:ffff:ffff:ffff,US @@ -14300,7 +14871,6 @@ 2620:99:8000::,2620:99:8000:ffff:ffff:ffff:ffff:ffff,US 2620:99:c000::,2620:99:c000:ffff:ffff:ffff:ffff:ffff,US 2620:9a::,2620:9a::ffff:ffff:ffff:ffff:ffff,CA -2620:9a:4000::,2620:9a:4000:ffff:ffff:ffff:ffff:ffff,US 2620:9a:8000::,2620:9a:8000:ffff:ffff:ffff:ffff:ffff,US 2620:9b::,2620:9b::ffff:ffff:ffff:ffff:ffff,US 2620:9b:4000::,2620:9b:4000:ffff:ffff:ffff:ffff:ffff,US @@ -14340,7 +14910,7 @@ 2620:a3:c020::,2620:a3:c020:ffff:ffff:ffff:ffff:ffff,US 2620:a3:e030::,2620:a3:e030:ffff:ffff:ffff:ffff:ffff,US 2620:a4:40::,2620:a4:40:ffff:ffff:ffff:ffff:ffff,US -2620:a4:2050::,2620:a4:2050:ffff:ffff:ffff:ffff:ffff,US +2620:a4:2050::,2620:a4:205f:ffff:ffff:ffff:ffff:ffff,US 2620:a4:4060::,2620:a4:4060:ffff:ffff:ffff:ffff:ffff,US 2620:a4:6070::,2620:a4:6070:ffff:ffff:ffff:ffff:ffff,US 2620:a4:8080::,2620:a4:8080:ffff:ffff:ffff:ffff:ffff,US @@ -14663,7 +15233,7 @@ 2620:f5:8000::,2620:f5:8000:ffff:ffff:ffff:ffff:ffff,US 2620:f5:c000::,2620:f5:c000:ffff:ffff:ffff:ffff:ffff,US 2620:f6::,2620:f6::ffff:ffff:ffff:ffff:ffff,CA -2620:f6:4000::,2620:f6:4000:ffff:ffff:ffff:ffff:ffff,US +2620:f6:4000::,2620:f6:400f:ffff:ffff:ffff:ffff:ffff,US 2620:f6:8000::,2620:f6:8000:ffff:ffff:ffff:ffff:ffff,US 2620:f6:c000::,2620:f6:c000:ffff:ffff:ffff:ffff:ffff,CA 2620:f7::,2620:f7::ffff:ffff:ffff:ffff:ffff,US @@ -14792,7 +15362,6 @@ 2620:105:a000::,2620:105:a00f:ffff:ffff:ffff:ffff:ffff,US 2620:105:b000::,2620:105:b0ff:ffff:ffff:ffff:ffff:ffff,US 2620:105:c000::,2620:105:c00f:ffff:ffff:ffff:ffff:ffff,US -2620:105:d000::,2620:105:d0ff:ffff:ffff:ffff:ffff:ffff,US 2620:105:e000::,2620:105:e0ff:ffff:ffff:ffff:ffff:ffff,US 2620:105:f000::,2620:105:f0ff:ffff:ffff:ffff:ffff:ffff,US 2620:106::,2620:106:f:ffff:ffff:ffff:ffff:ffff,US @@ -15084,7 +15653,6 @@ 2620:117:c000::,2620:117:c0ff:ffff:ffff:ffff:ffff:ffff,US 2620:117:d000::,2620:117:d0ff:ffff:ffff:ffff:ffff:ffff,CA 2620:117:e000::,2620:117:e0ff:ffff:ffff:ffff:ffff:ffff,US -2620:117:f000::,2620:117:f00f:ffff:ffff:ffff:ffff:ffff,US 2620:118::,2620:118:f:ffff:ffff:ffff:ffff:ffff,US 2620:118:1000::,2620:118:10ff:ffff:ffff:ffff:ffff:ffff,US 2620:118:2000::,2620:118:20ff:ffff:ffff:ffff:ffff:ffff,US @@ -15435,6 +16003,32 @@ 2620:12d:8000::,2620:12d:80ff:ffff:ffff:ffff:ffff:ffff,US 2620:12d:9000::,2620:12d:90ff:ffff:ffff:ffff:ffff:ffff,US 2620:12d:a000::,2620:12d:a00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:b000::,2620:12d:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:c000::,2620:12d:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:d000::,2620:12d:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:12d:e000::,2620:12d:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12d:f000::,2620:12d:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e::,2620:12e:f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:1000::,2620:12e:100f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:2000::,2620:12e:200f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:3000::,2620:12e:300f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:4000::,2620:12e:400f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:5000::,2620:12e:50ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:6000::,2620:12e:60ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:7000::,2620:12e:700f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:8000::,2620:12e:80ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:9000::,2620:12e:900f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:a000::,2620:12e:a0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:b000::,2620:12e:b00f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:c000::,2620:12e:c00f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:d000::,2620:12e:d00f:ffff:ffff:ffff:ffff:ffff,US +2620:12e:e000::,2620:12e:e0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12e:f000::,2620:12e:f0ff:ffff:ffff:ffff:ffff:ffff,US +2620:12f::,2620:12f:f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:1000::,2620:12f:100f:ffff:ffff:ffff:ffff:ffff,US +2620:12f:2000::,2620:12f:20ff:ffff:ffff:ffff:ffff:ffff,US +2620:12f:3000::,2620:12f:30ff:ffff:ffff:ffff:ffff:ffff,US +2620:12f:4000::,2620:12f:400f:ffff:ffff:ffff:ffff:ffff,US 2620:140::,2620:140:3ff:ffff:ffff:ffff:ffff:ffff,US 2620:141::,2620:141:fff:ffff:ffff:ffff:ffff:ffff,US 2620:143::,2620:143:7ff:ffff:ffff:ffff:ffff:ffff,US @@ -15464,8 +16058,7 @@ 2620:15c::,2620:15c:4:ffff:ffff:ffff:ffff:ffff,US 2620:15c:5::,2620:15c:5:ffff:ffff:ffff:ffff:ffff,BR 2620:15c:6::,2620:15c:fff:ffff:ffff:ffff:ffff:ffff,US -2620:15d::,2620:15e:fff:ffff:ffff:ffff:ffff:ffff,US -2620:15f::,2620:15f:fff:ffff:ffff:ffff:ffff:ffff,US +2620:15d::,2620:15f:fff:ffff:ffff:ffff:ffff:ffff,US 2620:160::,2620:160:ffff:ffff:ffff:ffff:ffff:ffff,US 2620:162::,2620:162:fff:ffff:ffff:ffff:ffff:ffff,US 2620:163::,2620:163:fff:ffff:ffff:ffff:ffff:ffff,US @@ -15494,6 +16087,8 @@ 2620:182::,2620:182:fff:ffff:ffff:ffff:ffff:ffff,US 2620:183::,2620:183:fff:ffff:ffff:ffff:ffff:ffff,US 2620:184::,2620:184:fff:ffff:ffff:ffff:ffff:ffff,US +2620:185::,2620:185:fff:ffff:ffff:ffff:ffff:ffff,US +2620:186::,2620:186:fff:ffff:ffff:ffff:ffff:ffff,US 2620:190::,2620:190:ffff:ffff:ffff:ffff:ffff:ffff,US 2620:1a0::,2620:1a0:ffff:ffff:ffff:ffff:ffff:ffff,US 2620:1b0::,2620:1b0:ffff:ffff:ffff:ffff:ffff:ffff,US @@ -15765,7 +16360,6 @@ 2801:0:1b0::,2801::1b0:ffff:ffff:ffff:ffff:ffff,AR 2801:0:1c0::,2801::1c7:ffff:ffff:ffff:ffff:ffff,CO 2801:0:1d0::,2801::1d7:ffff:ffff:ffff:ffff:ffff,AR -2801:0:1e0::,2801::1e0:ffff:ffff:ffff:ffff:ffff,CO 2801:0:1f0::,2801::1f0:ffff:ffff:ffff:ffff:ffff,PY 2801:0:200::,2801::200:ffff:ffff:ffff:ffff:ffff,VE 2801:0:210::,2801::210:ffff:ffff:ffff:ffff:ffff,CO @@ -15806,13 +16400,13 @@ 2801:0:4c0::,2801::4c0:ffff:ffff:ffff:ffff:ffff,CO 2801:0:4d0::,2801::4d0:ffff:ffff:ffff:ffff:ffff,EC 2801:0:4e0::,2801::4e0:ffff:ffff:ffff:ffff:ffff,CL -2801:0:4f0::,2801::4f0:ffff:ffff:ffff:ffff:ffff,CO 2801:0:2000::,2801::2fff:ffff:ffff:ffff:ffff:ffff,UY 2801:1::,2801:1:ffff:ffff:ffff:ffff:ffff:ffff,CR 2801:2::,2801:2:ffff:ffff:ffff:ffff:ffff:ffff,CL 2801:10::,2801:10:7:ffff:ffff:ffff:ffff:ffff,AR 2801:10:1000::,2801:10:1000:ffff:ffff:ffff:ffff:ffff,AR 2801:10:2000::,2801:10:2000:ffff:ffff:ffff:ffff:ffff,AR +2801:10:3000::,2801:10:3000:ffff:ffff:ffff:ffff:ffff,CO 2801:10:4000::,2801:10:4000:ffff:ffff:ffff:ffff:ffff,AR 2801:10:5000::,2801:10:5000:ffff:ffff:ffff:ffff:ffff,BO 2801:10:6000::,2801:10:6000:ffff:ffff:ffff:ffff:ffff,HN @@ -15832,6 +16426,7 @@ 2801:11:9000::,2801:11:9000:ffff:ffff:ffff:ffff:ffff,CO 2801:11:a000::,2801:11:a000:ffff:ffff:ffff:ffff:ffff,VE 2801:11:c000::,2801:11:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:11:d000::,2801:11:d000:ffff:ffff:ffff:ffff:ffff,AR 2801:11:e000::,2801:11:e000:ffff:ffff:ffff:ffff:ffff,CO 2801:12::,2801:12::ffff:ffff:ffff:ffff:ffff,PY 2801:12:1000::,2801:12:1000:ffff:ffff:ffff:ffff:ffff,BO @@ -15842,6 +16437,7 @@ 2801:12:8000::,2801:12:8000:ffff:ffff:ffff:ffff:ffff,AR 2801:12:9000::,2801:12:9000:ffff:ffff:ffff:ffff:ffff,AR 2801:12:c000::,2801:12:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:12:d000::,2801:12:d000:ffff:ffff:ffff:ffff:ffff,BO 2801:12:e000::,2801:12:e000:ffff:ffff:ffff:ffff:ffff,PA 2801:13::,2801:13::ffff:ffff:ffff:ffff:ffff,VE 2801:13:1000::,2801:13:1000:ffff:ffff:ffff:ffff:ffff,AR @@ -15853,11 +16449,12 @@ 2801:13:9000::,2801:13:9000:ffff:ffff:ffff:ffff:ffff,AR 2801:13:a000::,2801:13:a000:ffff:ffff:ffff:ffff:ffff,CO 2801:13:c000::,2801:13:c000:ffff:ffff:ffff:ffff:ffff,TT +2801:13:d000::,2801:13:d000:ffff:ffff:ffff:ffff:ffff,AR 2801:13:e000::,2801:13:e000:ffff:ffff:ffff:ffff:ffff,CO 2801:14::,2801:14::ffff:ffff:ffff:ffff:ffff,CO 2801:14:1000::,2801:14:1000:ffff:ffff:ffff:ffff:ffff,CL 2801:14:2000::,2801:14:2000:ffff:ffff:ffff:ffff:ffff,AR -2801:14:4000::,2801:14:4000:ffff:ffff:ffff:ffff:ffff,CO +2801:14:3000::,2801:14:3000:ffff:ffff:ffff:ffff:ffff,CO 2801:14:5000::,2801:14:5000:ffff:ffff:ffff:ffff:ffff,NI 2801:14:6000::,2801:14:6000:ffff:ffff:ffff:ffff:ffff,BO 2801:14:8000::,2801:14:8000:ffff:ffff:ffff:ffff:ffff,CO @@ -15876,6 +16473,7 @@ 2801:15:9000::,2801:15:9000:ffff:ffff:ffff:ffff:ffff,AR 2801:15:a000::,2801:15:a000:ffff:ffff:ffff:ffff:ffff,DO 2801:15:c000::,2801:15:c000:ffff:ffff:ffff:ffff:ffff,GT +2801:15:d000::,2801:15:d000:ffff:ffff:ffff:ffff:ffff,CL 2801:15:e000::,2801:15:e000:ffff:ffff:ffff:ffff:ffff,DO 2801:16::,2801:16::ffff:ffff:ffff:ffff:ffff,CW 2801:16:e0::,2801:16:e0:ffff:ffff:ffff:ffff:ffff,GY @@ -15888,6 +16486,7 @@ 2801:16:9000::,2801:16:9000:ffff:ffff:ffff:ffff:ffff,BO 2801:16:a000::,2801:16:a000:ffff:ffff:ffff:ffff:ffff,CR 2801:16:c000::,2801:16:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:16:d000::,2801:16:d000:ffff:ffff:ffff:ffff:ffff,AR 2801:17::,2801:17::ffff:ffff:ffff:ffff:ffff,CL 2801:17:1000::,2801:17:1000:ffff:ffff:ffff:ffff:ffff,HN 2801:17:2000::,2801:17:2000:ffff:ffff:ffff:ffff:ffff,PY @@ -15898,10 +16497,12 @@ 2801:17:9000::,2801:17:9000:ffff:ffff:ffff:ffff:ffff,PA 2801:17:a000::,2801:17:a000:ffff:ffff:ffff:ffff:ffff,HT 2801:17:c000::,2801:17:c000:ffff:ffff:ffff:ffff:ffff,PA +2801:17:d000::,2801:17:d000:ffff:ffff:ffff:ffff:ffff,CO 2801:17:e000::,2801:17:e000:ffff:ffff:ffff:ffff:ffff,AR 2801:18::,2801:18::ffff:ffff:ffff:ffff:ffff,CR 2801:18:1000::,2801:18:1000:ffff:ffff:ffff:ffff:ffff,PA 2801:18:2000::,2801:18:2000:ffff:ffff:ffff:ffff:ffff,CO +2801:18:3000::,2801:18:3000:ffff:ffff:ffff:ffff:ffff,CO 2801:18:5000::,2801:18:5000:ffff:ffff:ffff:ffff:ffff,CO 2801:18:6000::,2801:18:6000:ffff:ffff:ffff:ffff:ffff,AR 2801:18:8000::,2801:18:8000:ffff:ffff:ffff:ffff:ffff,AR @@ -15920,17 +16521,16 @@ 2801:19:9000::,2801:19:9000:ffff:ffff:ffff:ffff:ffff,AR 2801:19:a000::,2801:19:a000:ffff:ffff:ffff:ffff:ffff,BO 2801:19:c000::,2801:19:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:19:d000::,2801:19:d000:ffff:ffff:ffff:ffff:ffff,BO 2801:19:e000::,2801:19:e000:ffff:ffff:ffff:ffff:ffff,CO 2801:1a::,2801:1a::ffff:ffff:ffff:ffff:ffff,CO 2801:1a:1000::,2801:1a:1000:ffff:ffff:ffff:ffff:ffff,CL -2801:1a:2000::,2801:1a:2000:ffff:ffff:ffff:ffff:ffff,SR -2801:1a:4000::,2801:1a:4000:ffff:ffff:ffff:ffff:ffff,CO 2801:1a:5000::,2801:1a:5000:ffff:ffff:ffff:ffff:ffff,AR -2801:1a:6000::,2801:1a:6000:ffff:ffff:ffff:ffff:ffff,CR 2801:1a:8000::,2801:1a:8000:ffff:ffff:ffff:ffff:ffff,CL 2801:1a:9000::,2801:1a:9000:ffff:ffff:ffff:ffff:ffff,DO 2801:1a:a000::,2801:1a:a000:ffff:ffff:ffff:ffff:ffff,AR 2801:1a:c000::,2801:1a:c000:ffff:ffff:ffff:ffff:ffff,CO +2801:1a:d000::,2801:1a:d000:ffff:ffff:ffff:ffff:ffff,AR 2801:1a:e000::,2801:1a:e000:ffff:ffff:ffff:ffff:ffff,DO 2801:1b::,2801:1b::ffff:ffff:ffff:ffff:ffff,CR 2801:1b:1000::,2801:1b:1000:ffff:ffff:ffff:ffff:ffff,CL @@ -15942,10 +16542,12 @@ 2801:1b:9000::,2801:1b:9000:ffff:ffff:ffff:ffff:ffff,CL 2801:1b:a000::,2801:1b:a000:ffff:ffff:ffff:ffff:ffff,AR 2801:1b:c000::,2801:1b:c000:ffff:ffff:ffff:ffff:ffff,PA +2801:1b:d000::,2801:1b:d000:ffff:ffff:ffff:ffff:ffff,CO 2801:1b:e000::,2801:1b:e000:ffff:ffff:ffff:ffff:ffff,NI 2801:1c::,2801:1c::ffff:ffff:ffff:ffff:ffff,PY -2801:1c:1000::,2801:1c:1000:ffff:ffff:ffff:ffff:ffff,PE +2801:1c:1000::,2801:1c:1000:ffff:ffff:ffff:ffff:ffff,AR 2801:1c:2000::,2801:1c:2000:ffff:ffff:ffff:ffff:ffff,PE +2801:1c:3000::,2801:1c:3000:ffff:ffff:ffff:ffff:ffff,SV 2801:1c:4000::,2801:1c:4000:ffff:ffff:ffff:ffff:ffff,CO 2801:1c:5000::,2801:1c:5000:ffff:ffff:ffff:ffff:ffff,CL 2801:1c:6000::,2801:1c:6000:ffff:ffff:ffff:ffff:ffff,PA @@ -15964,6 +16566,7 @@ 2801:1d:9000::,2801:1d:9000:ffff:ffff:ffff:ffff:ffff,CO 2801:1d:a000::,2801:1d:a00f:ffff:ffff:ffff:ffff:ffff,CR 2801:1d:c000::,2801:1d:c000:ffff:ffff:ffff:ffff:ffff,AR +2801:1d:d000::,2801:1d:d000:ffff:ffff:ffff:ffff:ffff,BO 2801:1d:e000::,2801:1d:e000:ffff:ffff:ffff:ffff:ffff,CO 2801:1e::,2801:1e::ffff:ffff:ffff:ffff:ffff,EC 2801:1e:1000::,2801:1e:1000:ffff:ffff:ffff:ffff:ffff,AR @@ -15974,17 +16577,18 @@ 2801:1e:8000::,2801:1e:8000:ffff:ffff:ffff:ffff:ffff,CR 2801:1e:9000::,2801:1e:9000:ffff:ffff:ffff:ffff:ffff,SV 2801:1e:a000::,2801:1e:a000:ffff:ffff:ffff:ffff:ffff,AR +2801:1e:d000::,2801:1e:d000:ffff:ffff:ffff:ffff:ffff,CO 2801:1e:e000::,2801:1e:e000:ffff:ffff:ffff:ffff:ffff,SV 2801:1f::,2801:1f::ffff:ffff:ffff:ffff:ffff,AR 2801:1f:1000::,2801:1f:1000:ffff:ffff:ffff:ffff:ffff,HN 2801:1f:2000::,2801:1f:2000:ffff:ffff:ffff:ffff:ffff,CR -2801:1f:4000::,2801:1f:4000:ffff:ffff:ffff:ffff:ffff,CR 2801:1f:5000::,2801:1f:5000:ffff:ffff:ffff:ffff:ffff,CO 2801:1f:6000::,2801:1f:6000:ffff:ffff:ffff:ffff:ffff,AR 2801:1f:8000::,2801:1f:8000:ffff:ffff:ffff:ffff:ffff,AR 2801:1f:9000::,2801:1f:9000:ffff:ffff:ffff:ffff:ffff,AR 2801:1f:a000::,2801:1f:a000:ffff:ffff:ffff:ffff:ffff,CL 2801:1f:c000::,2801:1f:c000:ffff:ffff:ffff:ffff:ffff,CR +2801:1f:d000::,2801:1f:d000:ffff:ffff:ffff:ffff:ffff,CO 2801:1f:e000::,2801:1f:e000:ffff:ffff:ffff:ffff:ffff,AR 2801:80::,2801:80::ffff:ffff:ffff:ffff:ffff,BR 2801:80:10::,2801:80:10:ffff:ffff:ffff:ffff:ffff,BR @@ -16321,6 +16925,16 @@ 2801:80:1be0::,2801:80:1be0:ffff:ffff:ffff:ffff:ffff,BR 2801:80:1bf0::,2801:80:1bf0:ffff:ffff:ffff:ffff:ffff,BR 2801:80:1c00::,2801:80:1c00:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c10::,2801:80:1c10:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c20::,2801:80:1c20:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c30::,2801:80:1c30:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c40::,2801:80:1c4f:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c60::,2801:80:1c60:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c70::,2801:80:1c70:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c80::,2801:80:1c80:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1c90::,2801:80:1c90:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1ca0::,2801:80:1ca0:ffff:ffff:ffff:ffff:ffff,BR +2801:80:1cb0::,2801:80:1cb0:ffff:ffff:ffff:ffff:ffff,BR 2801:82::,2801:82:ffff:ffff:ffff:ffff:ffff:ffff,BR 2801:84::,2801:84:ffff:ffff:ffff:ffff:ffff:ffff,BR 2801:86::,2801:86:ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -16379,6 +16993,7 @@ 2801:110::,2801:110:1fff:ffff:ffff:ffff:ffff:ffff,CO 2801:118::,2801:118:ff:ffff:ffff:ffff:ffff:ffff,AR 2801:120::,2801:120:ffff:ffff:ffff:ffff:ffff:ffff,AR +2801:124::,2801:124:f:ffff:ffff:ffff:ffff:ffff,CO 2801:128::,2801:128:fff:ffff:ffff:ffff:ffff:ffff,UY 2801:130::,2801:130:fff:ffff:ffff:ffff:ffff:ffff,CO 2801:138::,2801:138:ff:ffff:ffff:ffff:ffff:ffff,PA @@ -16401,6 +17016,7 @@ 2801:1b0::,2801:1b0:ff:ffff:ffff:ffff:ffff:ffff,CO 2801:1b8::,2801:1b8:f:ffff:ffff:ffff:ffff:ffff,UY 2801:1c0::,2801:1c0:1ff:ffff:ffff:ffff:ffff:ffff,AR +2801:1c4::,2801:1c4:f:ffff:ffff:ffff:ffff:ffff,CO 2801:1c8::,2801:1c8:fff:ffff:ffff:ffff:ffff:ffff,CO 2801:1d0::,2801:1d0:f:ffff:ffff:ffff:ffff:ffff,CO 2801:1d8::,2801:1d8:fff:ffff:ffff:ffff:ffff:ffff,CO @@ -16429,6 +17045,7 @@ 2803:100::,2803:100:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:140::,2803:140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:180::,2803:180:ffff:ffff:ffff:ffff:ffff:ffff,NI +2803:1c0::,2803:1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:200::,2803:200:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:240::,2803:240:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:280::,2803:280:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16443,6 +17060,7 @@ 2803:500::,2803:500:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:540::,2803:540:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:580::,2803:580:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5c0::,2803:5c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:600::,2803:600:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:640::,2803:640:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:680::,2803:680:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16457,6 +17075,7 @@ 2803:900::,2803:900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:940::,2803:940:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:980::,2803:980:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:9c0::,2803:9c0:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:a00::,2803:a00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a40::,2803:a40:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:a80::,2803:a80:ffff:ffff:ffff:ffff:ffff:ffff,CO @@ -16474,6 +17093,7 @@ 2803:e00::,2803:e00:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:e40::,2803:e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e80::,2803:e80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:ec0::,2803:ec0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:f00::,2803:f00:48a:ffff:ffff:ffff:ffff:ffff,PE 2803:f00:48b::,2803:f00:48e:ffff:ffff:ffff:ffff:ffff,CO 2803:f00:48f::,2803:f00:4a9:ffff:ffff:ffff:ffff:ffff,PE @@ -16488,6 +17108,7 @@ 2803:1100::,2803:1100:ffff:ffff:ffff:ffff:ffff:ffff,CW 2803:1140::,2803:1140:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:1180::,2803:1180:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:11c0::,2803:11c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1200::,2803:1200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:1240::,2803:1240:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1280::,2803:1280:ffff:ffff:ffff:ffff:ffff:ffff,PE @@ -16504,6 +17125,7 @@ 2803:1600::,2803:1600:ffff:ffff:ffff:ffff:ffff:ffff,BQ 2803:1640::,2803:1640:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:1680::,2803:1680:ffff:ffff:ffff:ffff:ffff:ffff,GF +2803:16c0::,2803:16c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1700::,2803:1700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1740::,2803:1740:ffff:ffff:ffff:ffff:ffff:ffff,GF 2803:1780::,2803:1780:ffff:ffff:ffff:ffff:ffff:ffff,CO @@ -16511,7 +17133,7 @@ 2803:1840::,2803:1840:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1900::,2803:1900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1940::,2803:1940:ffff:ffff:ffff:ffff:ffff:ffff,AR -2803:1980::,2803:1980:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:19c0::,2803:19c0:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:1a00::,2803:1a00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:1a40::,2803:1a40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1a80::,2803:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CR @@ -16528,6 +17150,7 @@ 2803:1e00::,2803:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:1e40::,2803:1e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1e80::,2803:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:1ec0::,2803:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:1f00::,2803:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1f40::,2803:1f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:1f80::,2803:1f80:ffff:ffff:ffff:ffff:ffff:ffff,VE @@ -16537,6 +17160,7 @@ 2803:20c0::,2803:20c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2140::,2803:2140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2180::,2803:2180:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:21c0::,2803:21c0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:2200::,2803:2200:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:2240::,2803:2240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2280::,2803:2280:ffff:ffff:ffff:ffff:ffff:ffff,BZ @@ -16554,6 +17178,7 @@ 2803:2600::,2803:2600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2640::,2803:2640:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:2680::,2803:2680:ffff:ffff:ffff:ffff:ffff:ffff,UY +2803:26c0::,2803:26c0:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:2700::,2803:2700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2740::,2803:2740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2780::,2803:2780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16564,6 +17189,7 @@ 2803:2900::,2803:2900:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:2940::,2803:2940:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:2980::,2803:2980:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:29c0::,2803:29c0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:2a00::,2803:2a00:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:2a40::,2803:2a40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2a80::,2803:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CO @@ -16581,6 +17207,7 @@ 2803:2e00::,2803:2e00:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:2e40::,2803:2e40:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:2e80::,2803:2e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:2ec0::,2803:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:2f00::,2803:2f00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:2f40::,2803:2f40:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:2f80::,2803:2f80:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -16590,6 +17217,7 @@ 2803:3100::,2803:3100:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:3140::,2803:3140:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:3180::,2803:3180:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:31c0::,2803:31c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3200::,2803:3200:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:3240::,2803:3240:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:3280::,2803:3280:ffff:ffff:ffff:ffff:ffff:ffff,GT @@ -16607,6 +17235,7 @@ 2803:3600::,2803:3600:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:3640::,2803:3640:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:3680::,2803:3680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:36c0::,2803:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:3700::,2803:3700:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:3740::,2803:3740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3780::,2803:3780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16617,6 +17246,7 @@ 2803:3900::,2803:3900:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:3940::,2803:3940:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3980::,2803:3980:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:39c0::,2803:39c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:3a00::,2803:3a00:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:3a40::,2803:3a40:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:3a80::,2803:3a80:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16634,6 +17264,7 @@ 2803:3e00::,2803:3e00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3e40::,2803:3e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3e80::,2803:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:3ec0::,2803:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:3f00::,2803:3f00:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:3f40::,2803:3f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:3f80::,2803:3f80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16644,6 +17275,7 @@ 2803:4100::,2803:4100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4140::,2803:4140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4180::,2803:4180:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:41c0::,2803:41c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:4200::,2803:4200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:4240::,2803:4240:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:4280::,2803:4280:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16658,9 +17290,11 @@ 2803:4500::,2803:4500:ffff:ffff:ffff:ffff:ffff:ffff,CW 2803:4540::,2803:4540:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:4580::,2803:4580:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:45c0::,2803:45c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4600::,2803:4600:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:4640::,2803:4640:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:4680::,2803:4680:ffff:ffff:ffff:ffff:ffff:ffff,TT +2803:46c0::,2803:46c0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:4700::,2803:4700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4740::,2803:4740:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:4780::,2803:4780:ffff:ffff:ffff:ffff:ffff:ffff,PE @@ -16671,6 +17305,7 @@ 2803:4900::,2803:4900:ffff:ffff:ffff:ffff:ffff:ffff,BQ 2803:4940::,2803:4940:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4980::,2803:4980:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:49c0::,2803:49c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4a40::,2803:4a40:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:4a80::,2803:4a80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4ac0::,2803:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,BO @@ -16687,6 +17322,7 @@ 2803:4e00::,2803:4e00:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:4e40::,2803:4e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4e80::,2803:4e80:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:4ec0::,2803:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:4f00::,2803:4f00:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:4f40::,2803:4f40:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:4f80::,2803:4f80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16697,6 +17333,7 @@ 2803:5100::,2803:5100:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:5140::,2803:5140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5180::,2803:5180:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:51c0::,2803:51c0:ffff:ffff:ffff:ffff:ffff:ffff,SX 2803:5200::,2803:5200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:5240::,2803:5240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5280::,2803:5280:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -16714,6 +17351,7 @@ 2803:5600::,2803:5600:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:5640::,2803:5640:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:5680::,2803:5680:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:56c0::,2803:56c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:5700::,2803:5700:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:5740::,2803:5740:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:5780::,2803:5780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16723,6 +17361,7 @@ 2803:5900::,2803:5900:ffff:ffff:ffff:ffff:ffff:ffff,GF 2803:5940::,2803:5940:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:5980::,2803:5980:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:59c0::,2803:59c0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:5a00::,2803:5a00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5a40::,2803:5a40:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:5a80::,2803:5a80:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -16740,6 +17379,7 @@ 2803:5e00::,2803:5e00:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:5e40::,2803:5e40:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:5e80::,2803:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:5ec0::,2803:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:5f40::,2803:5f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:5f80::,2803:5f80:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:6000::,2803:6000:ffff:ffff:ffff:ffff:ffff:ffff,CR @@ -16749,6 +17389,7 @@ 2803:6100::,2803:6100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6140::,2803:6140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6180::,2803:6180:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:61c0::,2803:61c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6200::,2803:6200:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:6240::,2803:6240:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:6280::,2803:6280:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -16765,6 +17406,7 @@ 2803:6580::,2803:6580:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:6600::,2803:6600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6680::,2803:6680:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:66c0::,2803:66c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6700::,2803:6700:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:6740::,2803:6740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6780::,2803:6780:ffff:ffff:ffff:ffff:ffff:ffff,SV @@ -16775,6 +17417,7 @@ 2803:6900::,2803:6900:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:6940::,2803:6940:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:6980::,2803:6980:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:69c0::,2803:69c0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:6a00::,2803:6a00:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:6a40::,2803:6a40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6a80::,2803:6a80:ffff:ffff:ffff:ffff:ffff:ffff,NI @@ -16792,6 +17435,7 @@ 2803:6e00::,2803:6e00:ffff:ffff:ffff:ffff:ffff:ffff,SR 2803:6e40::,2803:6e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:6e80::,2803:6e80:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:6ec0::,2803:6ec0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:6f00::,2803:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:6f40::,2803:6f40:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:6f80::,2803:6f80:ffff:ffff:ffff:ffff:ffff:ffff,CO @@ -16802,6 +17446,7 @@ 2803:7100::,2803:7100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7140::,2803:7140:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:7180::,2803:7180:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:71c0::,2803:71c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7200::,2803:7200:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:7240::,2803:7240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7280::,2803:7280:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -16819,6 +17464,7 @@ 2803:7600::,2803:7600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7640::,2803:7640:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:7680::,2803:7680:ffff:ffff:ffff:ffff:ffff:ffff,BO +2803:76c0::,2803:76c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7700::,2803:7700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7740::,2803:7740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7780::,2803:7780:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16829,6 +17475,7 @@ 2803:7900::,2803:7900:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:7940::,2803:7940:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7980::,2803:7980:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:79c0::,2803:79c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7a00::,2803:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:7a40::,2803:7a40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7a80::,2803:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CR @@ -16846,6 +17493,7 @@ 2803:7e00::,2803:7e00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7e40::,2803:7e40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:7e80::,2803:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:7ec0::,2803:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:7f00::,2803:7f00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:7f40::,2803:7f40:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:7f80::,2803:7f80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16856,6 +17504,7 @@ 2803:8100::,2803:8100:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:8140::,2803:8140:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8180::,2803:8180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:81c0::,2803:81c0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:8200::,2803:8200:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:8240::,2803:8240:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8280::,2803:8280:ffff:ffff:ffff:ffff:ffff:ffff,VE @@ -16870,9 +17519,11 @@ 2803:8500::,2803:8500:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8540::,2803:8540:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8580::,2803:8580:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:85c0::,2803:85c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8600::,2803:8600:ffff:ffff:ffff:ffff:ffff:ffff,HT 2803:8640::,2803:8640:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8680::,2803:8680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:86c0::,2803:86c0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:8700::,2803:8700:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:8740::,2803:8740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8780::,2803:8780:ffff:ffff:ffff:ffff:ffff:ffff,BZ @@ -16883,6 +17534,7 @@ 2803:8900::,2803:8900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8940::,2803:8940:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8980::,2803:8980:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:89c0::,2803:89c0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:8a40::,2803:8a40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8a80::,2803:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8ac0::,2803:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -16899,6 +17551,7 @@ 2803:8e00::,2803:8e00:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8e40::,2803:8e40:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:8e80::,2803:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PY +2803:8ec0::,2803:8ec0:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:8f00::,2803:8f00:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:8f40::,2803:8f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:8f80::,2803:8f80:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16909,6 +17562,7 @@ 2803:9100::,2803:9100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9140::,2803:9140:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:9180::,2803:9180:ffff:ffff:ffff:ffff:ffff:ffff,CR +2803:91c0::,2803:91c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9200::,2803:9200:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:9240::,2803:9240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9280::,2803:9280:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16926,6 +17580,7 @@ 2803:9600::,2803:9600:ffff:ffff:ffff:ffff:ffff:ffff,CW 2803:9640::,2803:9640:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:9680::,2803:9680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:96c0::,2803:96c0:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:9740::,2803:9740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9780::,2803:9780:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9800::,2803:9800:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16935,6 +17590,7 @@ 2803:9900::,2803:9900:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:9940::,2803:9940:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9980::,2803:9980:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:99c0::,2803:99c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9a00::,2803:9a00:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:9a40::,2803:9a40:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:9a80::,2803:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CO @@ -16952,6 +17608,7 @@ 2803:9e00::,2803:9e00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9e40::,2803:9e40:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:9e80::,2803:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:9ec0::,2803:9ec0:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:9f00::,2803:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9f40::,2803:9f40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:9f80::,2803:9f80:ffff:ffff:ffff:ffff:ffff:ffff,HN @@ -16962,6 +17619,7 @@ 2803:a100::,2803:a100:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:a140::,2803:a140:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:a180::,2803:a180:ffff:ffff:ffff:ffff:ffff:ffff,DO +2803:a1c0::,2803:a1c0:ffff:ffff:ffff:ffff:ffff:ffff,NI 2803:a200::,2803:a200:ffff:ffff:ffff:ffff:ffff:ffff,SR 2803:a240::,2803:a240:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:a280::,2803:a280:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -16978,6 +17636,7 @@ 2803:a600::,2803:a600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a640::,2803:a640:ffff:ffff:ffff:ffff:ffff:ffff,DO 2803:a680::,2803:a680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:a6c0::,2803:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:a700::,2803:a700:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:a740::,2803:a740:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:a780::,2803:a780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -16988,6 +17647,7 @@ 2803:a900::,2803:a900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:a940::,2803:a940:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:a980::,2803:a980:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:a9c0::,2803:a9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:aa00::,2803:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:aa40::,2803:aa40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:aa80::,2803:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CR @@ -17005,6 +17665,7 @@ 2803:ae00::,2803:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ae40::,2803:ae40:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:ae80::,2803:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:aec0::,2803:aec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:af00::,2803:af00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:af40::,2803:af40:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:af80::,2803:af80:ffff:ffff:ffff:ffff:ffff:ffff,PY @@ -17014,6 +17675,7 @@ 2803:b100::,2803:b100:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:b140::,2803:b140:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:b180::,2803:b180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:b1c0::,2803:b1c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:b200::,2803:b200:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:b240::,2803:b240:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:b280::,2803:b280:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -17031,6 +17693,7 @@ 2803:b600::,2803:b600:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:b640::,2803:b640:ffff:ffff:ffff:ffff:ffff:ffff,AW 2803:b680::,2803:b680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:b6c0::,2803:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:b700::,2803:b700:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:b740::,2803:b740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:b780::,2803:b780:ffff:ffff:ffff:ffff:ffff:ffff,NI @@ -17040,6 +17703,7 @@ 2803:b8c0::,2803:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:b900::,2803:b900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:b940::,2803:b940:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:b9c0::,2803:b9c0:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:ba00::,2803:ba00:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:ba40::,2803:ba40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ba80::,2803:ba80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17057,6 +17721,7 @@ 2803:be00::,2803:be00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:be40::,2803:be40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:be80::,2803:be80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:bec0::,2803:bec0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:bf00::,2803:bf00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:bf40::,2803:bf40:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:bf80::,2803:bf80:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -17067,6 +17732,7 @@ 2803:c100::,2803:c100:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:c140::,2803:c140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c180::,2803:c180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:c1c0::,2803:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c200::,2803:c200:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:c240::,2803:c240:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:c280::,2803:c280:ffff:ffff:ffff:ffff:ffff:ffff,EC @@ -17081,9 +17747,11 @@ 2803:c500::,2803:c500:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c540::,2803:c540:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:c580::,2803:c580:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:c5c0::,2803:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,EC 2803:c600::,2803:c600:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:c640::,2803:c640:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c680::,2803:c680:ffff:ffff:ffff:ffff:ffff:ffff,HT +2803:c6c0::,2803:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c700::,2803:c700:ffff:ffff:ffff:ffff:ffff:ffff,GF 2803:c740::,2803:c740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c780::,2803:c780:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17094,6 +17762,7 @@ 2803:c900::,2803:c900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:c940::,2803:c940:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:c980::,2803:c980:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:c9c0::,2803:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ca00::,2803:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ca40::,2803:ca40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ca80::,2803:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -17111,6 +17780,7 @@ 2803:ce00::,2803:ce00:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:ce40::,2803:ce40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ce80::,2803:ce80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:cec0::,2803:cec0:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:cf00::,2803:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:cf40::,2803:cf40:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:cf80::,2803:cf80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17123,6 +17793,7 @@ 2803:d100::,2803:d100:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:d140::,2803:d140:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:d180::,2803:d180:ffff:ffff:ffff:ffff:ffff:ffff,EC +2803:d1c0::,2803:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:d200::,2803:d200:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:d240::,2803:d240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:d280::,2803:d280:ffff:ffff:ffff:ffff:ffff:ffff,PY @@ -17134,11 +17805,12 @@ 2803:d480::,2803:d480:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:d4c0::,2803:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:d500::,2803:d500:ffff:ffff:ffff:ffff:ffff:ffff,BZ -2803:d540::,2803:d540:ffff:ffff:ffff:ffff:ffff:ffff,VE +2803:d540::,2803:d540:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:d580::,2803:d580:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:d600::,2803:d600:ffff:ffff:ffff:ffff:ffff:ffff,UY 2803:d640::,2803:d640:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:d680::,2803:d680:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:d6c0::,2803:d6c0:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:d700::,2803:d700:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:d740::,2803:d740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:d780::,2803:d780:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -17149,6 +17821,7 @@ 2803:d900::,2803:d900:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:d940::,2803:d940:ffff:ffff:ffff:ffff:ffff:ffff,VE 2803:d980::,2803:d980:ffff:ffff:ffff:ffff:ffff:ffff,PA +2803:d9c0::,2803:d9c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:da00::,2803:da00:ffff:ffff:ffff:ffff:ffff:ffff,GY 2803:da40::,2803:da40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:da80::,2803:da80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17166,6 +17839,7 @@ 2803:de00::,2803:de00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:de40::,2803:de40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:de80::,2803:de80:ffff:ffff:ffff:ffff:ffff:ffff,CO +2803:dec0::,2803:dec0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:df00::,2803:df00:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:df40::,2803:df40:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:df80::,2803:df80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17176,6 +17850,7 @@ 2803:e100::,2803:e100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e140::,2803:e140:ffff:ffff:ffff:ffff:ffff:ffff,PY 2803:e180::,2803:e180:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:e1c0::,2803:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,GT 2803:e200::,2803:e200:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e240::,2803:e240:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:e280::,2803:e280:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17193,6 +17868,7 @@ 2803:e600::,2803:e600:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:e640::,2803:e640:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:e680::,2803:e680:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:e6c0::,2803:e6c0:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:e700::,2803:e700:ffff:ffff:ffff:ffff:ffff:ffff,HN 2803:e740::,2803:e740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e780::,2803:e780:ffff:ffff:ffff:ffff:ffff:ffff,PY @@ -17202,6 +17878,7 @@ 2803:e8c0::,2803:e8c0:ffff:ffff:ffff:ffff:ffff:ffff,CL 2803:e900::,2803:e900:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:e940::,2803:e940:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:e9c0::,2803:e9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ea00::,2803:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ea40::,2803:ea40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ea80::,2803:ea80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17220,6 +17897,7 @@ 2803:ee00::,2803:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ee40::,2803:ee40:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:ee80::,2803:ee80:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:eec0::,2803:eec0:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:ef00::,2803:ef00:ffff:ffff:ffff:ffff:ffff:ffff,PA 2803:ef40::,2803:ef40:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ef80::,2803:ef80:ffff:ffff:ffff:ffff:ffff:ffff,CL @@ -17230,6 +17908,7 @@ 2803:f100::,2803:f100:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f140::,2803:f140:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f180::,2803:f180:ffff:ffff:ffff:ffff:ffff:ffff,HN +2803:f1c0::,2803:f1c0:ffff:ffff:ffff:ffff:ffff:ffff,PE 2803:f200::,2803:f200:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f240::,2803:f240:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f280::,2803:f280:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -17247,6 +17926,7 @@ 2803:f600::,2803:f600:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:f640::,2803:f640:ffff:ffff:ffff:ffff:ffff:ffff,BQ 2803:f680::,2803:f680:ffff:ffff:ffff:ffff:ffff:ffff,AR +2803:f6c0::,2803:f6c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f700::,2803:f700:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f740::,2803:f740:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:f780::,2803:f780:ffff:ffff:ffff:ffff:ffff:ffff,DO @@ -17256,6 +17936,7 @@ 2803:f900::,2803:f900:ffff:ffff:ffff:ffff:ffff:ffff,BZ 2803:f940::,2803:f940:ffff:ffff:ffff:ffff:ffff:ffff,SX 2803:f980::,2803:f980:ffff:ffff:ffff:ffff:ffff:ffff,CL +2803:f9c0::,2803:f9c0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:fa00::,2803:fa00:ffff:ffff:ffff:ffff:ffff:ffff,BO 2803:fa40::,2803:fa40:ffff:ffff:ffff:ffff:ffff:ffff,SV 2803:fa80::,2803:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AR @@ -17273,6 +17954,7 @@ 2803:fe00::,2803:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CO 2803:fe40::,2803:fe40:ffff:ffff:ffff:ffff:ffff:ffff,CR 2803:fe80::,2803:fe80:ffff:ffff:ffff:ffff:ffff:ffff,PE +2803:fec0::,2803:fec0:ffff:ffff:ffff:ffff:ffff:ffff,AR 2803:ff40::,2803:ff40:ffff:ffff:ffff:ffff:ffff:ffff,SR 2803:ff80::,2803:ff80:ffff:ffff:ffff:ffff:ffff:ffff,CO 2804::,2804::ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -19213,6 +19895,7 @@ 2804:1f28::,2804:1f28:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1f2a::,2804:1f2a:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:1f2c::,2804:1f2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:1f2e::,2804:1f2e:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:2000::,2804:2000:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:2004::,2804:2004:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:2008::,2804:2008:ffff:ffff:ffff:ffff:ffff:ffff,BR @@ -20837,6 +21520,219 @@ 2804:396c::,2804:396c:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:3970::,2804:3970:ffff:ffff:ffff:ffff:ffff:ffff,BR 2804:3974::,2804:3974:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3978::,2804:3978:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:397c::,2804:397c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3980::,2804:3980:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3984::,2804:3984:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3988::,2804:3988:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:398c::,2804:398c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3990::,2804:3990:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3994::,2804:3994:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3998::,2804:3998:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:399c::,2804:399c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39a0::,2804:39a0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39a4::,2804:39a4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39a8::,2804:39a8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39ac::,2804:39ac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39b0::,2804:39b0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39b4::,2804:39b4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39b8::,2804:39b8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39bc::,2804:39bc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c0::,2804:39c0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c4::,2804:39c4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39c8::,2804:39c8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39cc::,2804:39cc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39d0::,2804:39d0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39d4::,2804:39d4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39d8::,2804:39d8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39dc::,2804:39dc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39e0::,2804:39e0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39e4::,2804:39e4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39e8::,2804:39e8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39ec::,2804:39ec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39f0::,2804:39f0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39f4::,2804:39f4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39f8::,2804:39f8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:39fc::,2804:39fc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a00::,2804:3a00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a04::,2804:3a04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a08::,2804:3a08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a0c::,2804:3a0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a10::,2804:3a10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a14::,2804:3a14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a18::,2804:3a18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a1c::,2804:3a1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a20::,2804:3a20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a24::,2804:3a24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a28::,2804:3a28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a2c::,2804:3a2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a30::,2804:3a30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a34::,2804:3a34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a38::,2804:3a38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a3c::,2804:3a3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a40::,2804:3a40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a44::,2804:3a44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a48::,2804:3a48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a4c::,2804:3a4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a50::,2804:3a50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a54::,2804:3a54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a58::,2804:3a58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a5c::,2804:3a5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a60::,2804:3a60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a64::,2804:3a64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a68::,2804:3a68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a6c::,2804:3a6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a70::,2804:3a70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a74::,2804:3a74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a78::,2804:3a78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a7c::,2804:3a7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a80::,2804:3a80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a84::,2804:3a84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a88::,2804:3a88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a8c::,2804:3a8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a90::,2804:3a90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a94::,2804:3a94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a98::,2804:3a98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3a9c::,2804:3a9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aa0::,2804:3aa0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aa4::,2804:3aa4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aa8::,2804:3aa8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aac::,2804:3aac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ab0::,2804:3ab0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ab4::,2804:3ab4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ab8::,2804:3ab8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3abc::,2804:3abc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac0::,2804:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac4::,2804:3ac4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ac8::,2804:3ac8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3acc::,2804:3acc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ad0::,2804:3ad0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ad4::,2804:3ad4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ad8::,2804:3ad8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3adc::,2804:3adc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ae0::,2804:3ae0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ae4::,2804:3ae4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ae8::,2804:3ae8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3aec::,2804:3aec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3af0::,2804:3af0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3af4::,2804:3af4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3af8::,2804:3af8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3afc::,2804:3afc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b00::,2804:3b00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b04::,2804:3b04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b08::,2804:3b08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b0c::,2804:3b0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b10::,2804:3b10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b14::,2804:3b14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b18::,2804:3b18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b1c::,2804:3b1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b20::,2804:3b20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b24::,2804:3b24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b28::,2804:3b28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b2c::,2804:3b2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b30::,2804:3b30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b34::,2804:3b34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b38::,2804:3b38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b3c::,2804:3b3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b40::,2804:3b40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b44::,2804:3b44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b48::,2804:3b48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b4c::,2804:3b4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b50::,2804:3b50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b54::,2804:3b54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b58::,2804:3b58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b5c::,2804:3b5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b60::,2804:3b60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b64::,2804:3b64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b68::,2804:3b68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b6c::,2804:3b6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b70::,2804:3b70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b74::,2804:3b74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b78::,2804:3b78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b7c::,2804:3b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b80::,2804:3b80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b84::,2804:3b84:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b88::,2804:3b88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b8c::,2804:3b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b90::,2804:3b90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b94::,2804:3b94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b98::,2804:3b98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3b9c::,2804:3b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ba0::,2804:3ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ba4::,2804:3ba4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ba8::,2804:3ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bac::,2804:3bac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bb0::,2804:3bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bb4::,2804:3bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bb8::,2804:3bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bbc::,2804:3bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bc0::,2804:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bc4::,2804:3bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bc8::,2804:3bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bcc::,2804:3bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bd0::,2804:3bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bd4::,2804:3bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bd8::,2804:3bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bdc::,2804:3bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3be0::,2804:3be0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3be4::,2804:3be4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3be8::,2804:3be8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bec::,2804:3bec:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bf0::,2804:3bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bf4::,2804:3bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bf8::,2804:3bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3bfc::,2804:3bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c00::,2804:3c00:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c04::,2804:3c04:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c08::,2804:3c08:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c0c::,2804:3c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c10::,2804:3c10:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c14::,2804:3c14:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c18::,2804:3c18:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c1c::,2804:3c1c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c20::,2804:3c20:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c24::,2804:3c24:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c28::,2804:3c28:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c2c::,2804:3c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c30::,2804:3c30:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c34::,2804:3c34:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c38::,2804:3c38:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c3c::,2804:3c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c40::,2804:3c40:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c44::,2804:3c44:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c48::,2804:3c48:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c4c::,2804:3c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c50::,2804:3c50:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c54::,2804:3c54:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c58::,2804:3c58:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c5c::,2804:3c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c60::,2804:3c60:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c64::,2804:3c64:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c68::,2804:3c68:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c6c::,2804:3c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c70::,2804:3c70:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c74::,2804:3c74:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c78::,2804:3c78:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c7c::,2804:3c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c80::,2804:3c80:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c84::,2804:3c84:ffff:ffff:ffff:ffff:ffff:ffff,US +2804:3c88::,2804:3c88:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c8c::,2804:3c8c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c90::,2804:3c90:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c94::,2804:3c94:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c98::,2804:3c98:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3c9c::,2804:3c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ca0::,2804:3ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ca4::,2804:3ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3ca8::,2804:3ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cac::,2804:3cac:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cb0::,2804:3cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cb4::,2804:3cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cb8::,2804:3cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cbc::,2804:3cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cc0::,2804:3cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cc4::,2804:3cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR +2804:3cc8::,2804:3cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR 2806::,2806:f:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:200::,2806:216::ffff:ffff:ffff:ffff:ffff,MX 2806:217::,2806:220:ffff:ffff:ffff:ffff:ffff:ffff,MX @@ -20847,14 +21743,13 @@ 2806:250::,2806:250:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:260::,2806:260:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:270::,2806:270:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:280::,2806:287:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:289::,2806:289:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:290::,2806:290:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:280::,2806:290:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2a0::,2806:2a0:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2b0::,2806:2b0:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2c0::,2806:2c0:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2d0::,2806:2d0:ffff:ffff:ffff:ffff:ffff:ffff,MX -2806:2e0::,2806:2e0:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2e0::,2806:2e2:ffff:ffff:ffff:ffff:ffff:ffff,MX +2806:2e4::,2806:2e4:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:2f0::,2806:2f0:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:300::,2806:300:ffff:ffff:ffff:ffff:ffff:ffff,MX 2806:310::,2806:310:ffff:ffff:ffff:ffff:ffff:ffff,MX @@ -21180,7 +22075,7 @@ 2a00:15f0::,2a00:15f0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a00:15f8::,2a00:15f8:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1600::,2a00:1607:ffff:ffff:ffff:ffff:ffff:ffff,SI -2a00:1610::,2a00:1618:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a00:1610::,2a00:161f:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a00:1620::,2a00:1620:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:1628::,2a00:1628:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a00:1630::,2a00:1637:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -21206,7 +22101,6 @@ 2a00:16f8::,2a00:16f8:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:1700::,2a00:1700:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1708::,2a00:1708:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:1710::,2a00:1710:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a00:1718::,2a00:1718:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a00:1720::,2a00:1720:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:1728::,2a00:1728:ffff:ffff:ffff:ffff:ffff:ffff,BG @@ -21297,7 +22191,7 @@ 2a00:1a00::,2a00:1a00:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:1a08::,2a00:1a08:ffff:ffff:ffff:ffff:ffff:ffff,KZ 2a00:1a10::,2a00:1a17:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:1a18::,2a00:1a18:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a00:1a18::,2a00:1a1f:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:1a20::,2a00:1a27:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a00:1a28::,2a00:1a28:23ff:ffff:ffff:ffff:ffff:ffff,SE 2a00:1a28:2400::,2a00:1a28:24ff:ffff:ffff:ffff:ffff:ffff,FI @@ -21346,7 +22240,7 @@ 2a00:1b68::,2a00:1b68:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1b70::,2a00:1b70:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a00:1b78::,2a00:1b78:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1b80::,2a00:1b80:ffff:ffff:ffff:ffff:ffff:ffff,BA +2a00:1b80::,2a00:1b87:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a00:1b88::,2a00:1b88:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:1b90::,2a00:1b90:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a00:1b98::,2a00:1b98:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -21359,7 +22253,7 @@ 2a00:1bd0::,2a00:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:1bd8::,2a00:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:1be0::,2a00:1be0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a00:1be8::,2a00:1be8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a00:1be8::,2a00:1bef:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:1bf0::,2a00:1bf0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:1bf8::,2a00:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:1c00::,2a00:1c00:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -21375,9 +22269,9 @@ 2a00:1c50::,2a00:1c50:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a00:1c58::,2a00:1c58:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:1c60::,2a00:1c60:ffff:ffff:ffff:ffff:ffff:ffff,PT -2a00:1c68::,2a00:1c68:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a00:1c68::,2a00:1c68:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:1c70::,2a00:1c70:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:1c78::,2a00:1c78:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:1c78::,2a00:1c7f:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1c80::,2a00:1c87:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a00:1c88::,2a00:1c88:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1c90::,2a00:1c90:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -21468,7 +22362,7 @@ 2a00:1f48::,2a00:1f4f:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:1f50::,2a00:1f50:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a00:1f58::,2a00:1f5f:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a00:1f60::,2a00:1f60:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a00:1f60::,2a00:1f67:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:1f68::,2a00:1f68:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a00:1f70::,2a00:1f70:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:1f78::,2a00:1f7f:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -21753,7 +22647,7 @@ 2a00:6120::,2a00:6120:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a00:6140::,2a00:6140:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a00:6160::,2a00:6160:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a00:6180::,2a00:6180:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a00:6180::,2a00:6187:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a00:61a0::,2a00:61a7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a00:61c0::,2a00:61c7:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a00:61e0::,2a00:61e0:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -21961,7 +22855,9 @@ 2a00:79e0:23::,2a00:79e0:23:ffff:ffff:ffff:ffff:ffff,GB 2a00:79e0:24::,2a00:79e0:26:ffff:ffff:ffff:ffff:ffff,CH 2a00:79e0:27::,2a00:79e0:27:ffff:ffff:ffff:ffff:ffff,NL -2a00:79e0:28::,2a00:79e0:ffe2:4ff:ffff:ffff:ffff:ffff,CH +2a00:79e0:28::,2a00:79e0:30:ffff:ffff:ffff:ffff:ffff,CH +2a00:79e0:31::,2a00:79e0:31:ffff:ffff:ffff:ffff:ffff,SK +2a00:79e0:32::,2a00:79e0:ffe2:4ff:ffff:ffff:ffff:ffff,CH 2a00:79e0:ffe2:500::,2a00:79e0:ffe2:5ff:ffff:ffff:ffff:ffff,IE 2a00:79e0:ffe2:600::,2a00:79e1:abb:ffff:ffff:ffff:ffff:ffff,CH 2a00:79e1:abc::,2a00:79e1:abc:ff:ffff:ffff:ffff:ffff,GB @@ -22062,7 +22958,6 @@ 2a00:8600::,2a00:8600:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:8620::,2a00:8620:ffff:ffff:ffff:ffff:ffff:ffff,BA 2a00:8640::,2a00:8647:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:8660::,2a00:8660:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:8680::,2a00:8680:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a00:86a0::,2a00:86a0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:86c0::,2a00:86c0:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -22153,7 +23048,7 @@ 2a00:91e0::,2a00:91e0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:9200::,2a00:9200:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:9220::,2a00:9220:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a00:9240::,2a00:9240:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:9240::,2a00:9247:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:9260::,2a00:9267:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a00:9280::,2a00:9280:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a00:92a0::,2a00:92a7:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -22204,7 +23099,7 @@ 2a00:97a0::,2a00:97a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:97c0::,2a00:97c0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:97e0::,2a00:97e0:ffff:ffff:ffff:ffff:ffff:ffff,DK -2a00:9800::,2a00:9801:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a00:9800::,2a00:9807:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:9820::,2a00:9820:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:9840::,2a00:9840:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:9860::,2a00:9860:ffff:ffff:ffff:ffff:ffff:ffff,HR @@ -22400,7 +23295,6 @@ 2a00:b0a0::,2a00:b0a0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:b0c0::,2a00:b0c0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a00:b0e0::,2a00:b0e0:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a00:b100::,2a00:b100:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:b120::,2a00:b120:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:b140::,2a00:b140:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a00:b160::,2a00:b160:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -22538,6 +23432,7 @@ 2a00:c2a0::,2a00:c2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:c2c0::,2a00:c2c0:fffe:ffff:ffff:ffff:ffff:ffff,NL 2a00:c2c0:ffff::,2a00:c2c0:ffff:ffff:ffff:ffff:ffff:ffff,US +2a00:c2c1::,2a00:c2c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:c2e0::,2a00:c2e0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:c300::,2a00:c307:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:c320::,2a00:c320:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -22578,7 +23473,6 @@ 2a00:c780::,2a00:c780:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:c7a0::,2a00:c7a0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:c7c0::,2a00:c7c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a00:c7e0::,2a00:c7e0:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a00:c800::,2a00:c800:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a00:c820::,2a00:c820:ffff:ffff:ffff:ffff:ffff:ffff,BY 2a00:c840::,2a00:c840:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -22764,7 +23658,7 @@ 2a00:dea0::,2a00:dea0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:dec0::,2a00:dec0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a00:dee0::,2a00:dee0:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a00:df00::,2a00:df00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a00:df00::,2a00:df07:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:df20::,2a00:df20:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:df40::,2a00:df40:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a00:df60::,2a00:df60:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -22814,7 +23708,7 @@ 2a00:e520::,2a00:e520:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:e540::,2a00:e540:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a00:e560::,2a00:e560:ffff:ffff:ffff:ffff:ffff:ffff,BE -2a00:e580::,2a00:e580:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a00:e580::,2a00:e587:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a00:e5a0::,2a00:e5a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a00:e5c0::,2a00:e5c0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a00:e5e0::,2a00:e5e0:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -23001,7 +23895,7 @@ 2a00:fd20::,2a00:fd20:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a00:fd40::,2a00:fd40:5:ffff:ffff:ffff:ffff:ffff,NL 2a00:fd40:6::,2a00:fd40:7:ffff:ffff:ffff:ffff:ffff,SK -2a00:fd40:8::,2a00:fd40:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a00:fd40:8::,2a00:fd47:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a00:fd60::,2a00:fd60:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:fd80::,2a00:fd80:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a00:fda0::,2a00:fda0:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -23068,46 +23962,15 @@ 2a01:111:2000:4::,2a01:111:2000:4:ffff:ffff:ffff:ffff,US 2a01:111:2000:5::,2a01:111:2000:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2001::,2a01:111:2001:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2002::,2a01:111:2004:3:ffff:ffff:ffff:ffff,GB -2a01:111:2004:4::,2a01:111:2004:7:ffff:ffff:ffff:ffff,US -2a01:111:2004:8::,2a01:111:2004:8:ffff:ffff:ffff:ffff,GB -2a01:111:2004:9::,2a01:111:2004:9:ffff:ffff:ffff:ffff,US -2a01:111:2004:a::,2a01:111:2004:b:ffff:ffff:ffff:ffff,GB -2a01:111:2004:c::,2a01:111:2004:d:ffff:ffff:ffff:ffff,US -2a01:111:2004:e::,2a01:111:2005:2:ffff:ffff:ffff:ffff,GB -2a01:111:2005:3::,2a01:111:2005:5:ffff:ffff:ffff:ffff,US -2a01:111:2005:6::,2a01:111:2006::ffff:ffff:ffff:ffff,GB -2a01:111:2006:1::,2a01:111:2006:1:ffff:ffff:ffff:ffff,US -2a01:111:2006:2::,2a01:111:2006:7:ffff:ffff:ffff:ffff,GB -2a01:111:2006:8::,2a01:111:2006:e:ffff:ffff:ffff:ffff,US -2a01:111:2006:f::,2a01:111:2006:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2002::,2a01:111:2003:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2004::,2a01:111:2006:ffff:ffff:ffff:ffff:ffff,US 2a01:111:2007::,2a01:111:2007:ffff:ffff:ffff:ffff:ffff,AU 2a01:111:2008::,2a01:111:2008:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2009::,2a01:111:200b::ffff:ffff:ffff:ffff,GB -2a01:111:200b:1::,2a01:111:200b:9:ffff:ffff:ffff:ffff,US -2a01:111:200b:a::,2a01:111:200c:3:ffff:ffff:ffff:ffff,GB -2a01:111:200c:4::,2a01:111:200c:6:ffff:ffff:ffff:ffff,US -2a01:111:200c:7::,2a01:111:200c:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:200d::,2a01:111:200d::ffff:ffff:ffff:ffff,US -2a01:111:200d:1::,2a01:111:200e:1:ffff:ffff:ffff:ffff,GB -2a01:111:200e:2::,2a01:111:200e:2:ffff:ffff:ffff:ffff,US -2a01:111:200e:3::,2a01:111:200f:2:ffff:ffff:ffff:ffff,GB -2a01:111:200f:3::,2a01:111:200f:3:ffff:ffff:ffff:ffff,US -2a01:111:200f:4::,2a01:111:200f:4:ffff:ffff:ffff:ffff,GB -2a01:111:200f:5::,2a01:111:200f:5:ffff:ffff:ffff:ffff,US -2a01:111:200f:6::,2a01:111:200f:11:ffff:ffff:ffff:ffff,GB -2a01:111:200f:12::,2a01:111:200f:13:ffff:ffff:ffff:ffff,US -2a01:111:200f:14::,2a01:111:2010:3:ffff:ffff:ffff:ffff,GB -2a01:111:2010:4::,2a01:111:2010:5:ffff:ffff:ffff:ffff,US -2a01:111:2010:6::,2a01:111:2011:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2012::,2a01:111:2012:1:ffff:ffff:ffff:ffff,US -2a01:111:2012:2::,2a01:111:2013::ffff:ffff:ffff:ffff,GB -2a01:111:2013:1::,2a01:111:2013:2:ffff:ffff:ffff:ffff,US -2a01:111:2013:3::,2a01:111:2013:4:ffff:ffff:ffff:ffff,GB -2a01:111:2013:5::,2a01:111:2013:7:ffff:ffff:ffff:ffff,US -2a01:111:2013:8::,2a01:111:2013:8:ffff:ffff:ffff:ffff,GB -2a01:111:2013:9::,2a01:111:2013:a:ffff:ffff:ffff:ffff,US -2a01:111:2013:b::,2a01:111:2015:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2009::,2a01:111:2009:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:200a::,2a01:111:2010:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2011::,2a01:111:2011:ffff:ffff:ffff:ffff:ffff,PR +2a01:111:2012::,2a01:111:2013:ffff:ffff:ffff:ffff:ffff,US +2a01:111:2014::,2a01:111:2015:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2016::,2a01:111:2016::ffff:ffff:ffff:ffff,US 2a01:111:2016:1::,2a01:111:2016:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2017::,2a01:111:2017:ffff:ffff:ffff:ffff:ffff,BR @@ -23116,7 +23979,8 @@ 2a01:111:201b::,2a01:111:201c:ffff:ffff:ffff:ffff:ffff,US 2a01:111:201d::,2a01:111:201d:ffff:ffff:ffff:ffff:ffff,HK 2a01:111:201e::,2a01:111:201f:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2020::,2a01:111:2022:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2020::,2a01:111:2020:ffff:ffff:ffff:ffff:ffff,NL +2a01:111:2021::,2a01:111:2022:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2023::,2a01:111:2023::ffff:ffff:ffff:ffff,SE 2a01:111:2023:1::,2a01:111:2025:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2026::,2a01:111:2026:ffff:ffff:ffff:ffff:ffff,IE @@ -23127,19 +23991,15 @@ 2a01:111:202b::,2a01:111:202b:ffff:ffff:ffff:ffff:ffff,IE 2a01:111:202c::,2a01:111:202f:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2030::,2a01:111:2030:ffff:ffff:ffff:ffff:ffff,JP -2a01:111:2031::,2a01:111:2031:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:2032::,2a01:111:2032:1:ffff:ffff:ffff:ffff,HK -2a01:111:2032:2::,2a01:111:2032:2:ffff:ffff:ffff:ffff,GB -2a01:111:2032:3::,2a01:111:2032:3:ffff:ffff:ffff:ffff,HK -2a01:111:2032:4::,2a01:111:2032:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2031::,2a01:111:2031:ffff:ffff:ffff:ffff:ffff,SG +2a01:111:2032::,2a01:111:2032:ffff:ffff:ffff:ffff:ffff,HK 2a01:111:2033::,2a01:111:2033:ffff:ffff:ffff:ffff:ffff,IE 2a01:111:2034::,2a01:111:2034:ffff:ffff:ffff:ffff:ffff,AU 2a01:111:2035::,2a01:111:2035:ffff:ffff:ffff:ffff:ffff,SG 2a01:111:2036::,2a01:111:2036:ffff:ffff:ffff:ffff:ffff,JP 2a01:111:2037::,2a01:111:2037:ffff:ffff:ffff:ffff:ffff,NL 2a01:111:2038::,2a01:111:2038:ffff:ffff:ffff:ffff:ffff,US -2a01:111:2039::,2a01:111:2039::ffff:ffff:ffff:ffff,AU -2a01:111:2039:1::,2a01:111:2039:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2039::,2a01:111:2039:ffff:ffff:ffff:ffff:ffff,AU 2a01:111:203a::,2a01:111:203a:ffff:ffff:ffff:ffff:ffff,BR 2a01:111:203b::,2a01:111:203b:ffff:ffff:ffff:ffff:ffff,AT 2a01:111:203c::,2a01:111:203c:ffff:ffff:ffff:ffff:ffff,US @@ -23147,9 +24007,9 @@ 2a01:111:203e::,2a01:111:2040:ffff:ffff:ffff:ffff:ffff,IN 2a01:111:2041::,2a01:111:2041:ffff:ffff:ffff:ffff:ffff,US 2a01:111:2042::,2a01:111:2042:ffff:ffff:ffff:ffff:ffff,FI -2a01:111:2043::,2a01:111:2044:5:ffff:ffff:ffff:ffff,GB -2a01:111:2044:6::,2a01:111:2044:8:ffff:ffff:ffff:ffff,IE -2a01:111:2044:9::,2a01:111:2045:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2043::,2a01:111:2043:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:2044::,2a01:111:2044:ffff:ffff:ffff:ffff:ffff,IE +2a01:111:2045::,2a01:111:2045:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:2046::,2a01:111:2046:ffff:ffff:ffff:ffff:ffff,JP 2a01:111:2047::,2a01:111:2048:ffff:ffff:ffff:ffff:ffff,CA 2a01:111:2049::,2a01:111:207f:ffff:ffff:ffff:ffff:ffff,GB @@ -23157,26 +24017,12 @@ 2a01:111:2081::,2a01:111:f00f:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:f010::,2a01:111:f013:ffff:ffff:ffff:ffff:ffff,US 2a01:111:f014::,2a01:111:f0ff:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f100::,2a01:111:f100:fff:ffff:ffff:ffff:ffff,US -2a01:111:f100:1000::,2a01:111:f100:1004:ffff:ffff:ffff:ffff,GB -2a01:111:f100:1005::,2a01:111:f100:1006:ffff:ffff:ffff:ffff,US -2a01:111:f100:1007::,2a01:111:f100:1007:ffff:ffff:ffff:ffff,GB -2a01:111:f100:1008::,2a01:111:f100:1008:ffff:ffff:ffff:ffff,US -2a01:111:f100:1009::,2a01:111:f100:2000:ffff:ffff:ffff:ffff,GB -2a01:111:f100:2001::,2a01:111:f100:2001:ffff:ffff:ffff:ffff,US -2a01:111:f100:2002::,2a01:111:f100:4002:ffff:ffff:ffff:ffff,GB -2a01:111:f100:4003::,2a01:111:f100:4003:ffff:ffff:ffff:ffff,US -2a01:111:f100:4004::,2a01:111:f100:6000:ffff:ffff:ffff:ffff,GB -2a01:111:f100:6001::,2a01:111:f100:6002:ffff:ffff:ffff:ffff,HK -2a01:111:f100:6003::,2a01:111:f100:7000:ffff:ffff:ffff:ffff,GB -2a01:111:f100:7001::,2a01:111:f100:7001:ffff:ffff:ffff:ffff,SG -2a01:111:f100:7002::,2a01:111:f100:8000:ffff:ffff:ffff:ffff,GB -2a01:111:f100:8001::,2a01:111:f100:8002:ffff:ffff:ffff:ffff,NL -2a01:111:f100:8003::,2a01:111:f100:8fff:ffff:ffff:ffff:ffff,GB -2a01:111:f100:9000::,2a01:111:f100:9fff:ffff:ffff:ffff:ffff,NL -2a01:111:f100:a000::,2a01:111:f100:a001:ffff:ffff:ffff:ffff,GB -2a01:111:f100:a002::,2a01:111:f100:a003:ffff:ffff:ffff:ffff,IE -2a01:111:f100:a004::,2a01:111:f100:afff:ffff:ffff:ffff:ffff,GB +2a01:111:f100::,2a01:111:f100:4fff:ffff:ffff:ffff:ffff,US +2a01:111:f100:5000::,2a01:111:f100:5fff:ffff:ffff:ffff:ffff,GB +2a01:111:f100:6000::,2a01:111:f100:6fff:ffff:ffff:ffff:ffff,HK +2a01:111:f100:7000::,2a01:111:f100:7fff:ffff:ffff:ffff:ffff,SG +2a01:111:f100:8000::,2a01:111:f100:9fff:ffff:ffff:ffff:ffff,NL +2a01:111:f100:a000::,2a01:111:f100:afff:ffff:ffff:ffff:ffff,IE 2a01:111:f100:b000::,2a01:111:f100:bfff:ffff:ffff:ffff:ffff,US 2a01:111:f100:c000::,2a01:111:f100:cfff:ffff:ffff:ffff:ffff,IE 2a01:111:f100:d000::,2a01:111:f100:dfff:ffff:ffff:ffff:ffff,US @@ -23209,7 +24055,9 @@ 2a01:111:f330:1795::,2a01:111:f330:17cf:ffff:ffff:ffff:ffff,GB 2a01:111:f330:17d0::,2a01:111:f330:17d0:ffff:ffff:ffff:ffff,US 2a01:111:f330:17d1::,2a01:111:f3ff:ffff:ffff:ffff:ffff:ffff,GB -2a01:111:f400::,2a01:111:f400:5c:ffff:ffff:ffff:ffff,US +2a01:111:f400::,2a01:111:f400:29:ffff:ffff:ffff:ffff,US +2a01:111:f400:2a::,2a01:111:f400:3d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:3e::,2a01:111:f400:5c:ffff:ffff:ffff:ffff,US 2a01:111:f400:5d::,2a01:111:f400:3ff:ffff:ffff:ffff:ffff,GB 2a01:111:f400:400::,2a01:111:f400:1bff:ffff:ffff:ffff:ffff,US 2a01:111:f400:1c00::,2a01:111:f400:1c07:ffff:ffff:ffff:ffff,HK @@ -23218,7 +24066,9 @@ 2a01:111:f400:1c20::,2a01:111:f400:1c27:ffff:ffff:ffff:ffff,BR 2a01:111:f400:1c28::,2a01:111:f400:23ff:ffff:ffff:ffff:ffff,GB 2a01:111:f400:2400::,2a01:111:f400:2413:ffff:ffff:ffff:ffff,IE -2a01:111:f400:2414::,2a01:111:f400:2491:ffff:ffff:ffff:ffff,US +2a01:111:f400:2414::,2a01:111:f400:247f:ffff:ffff:ffff:ffff,US +2a01:111:f400:2480::,2a01:111:f400:2490:ffff:ffff:ffff:ffff,GB +2a01:111:f400:2491::,2a01:111:f400:2491:ffff:ffff:ffff:ffff,US 2a01:111:f400:2492::,2a01:111:f400:27ff:ffff:ffff:ffff:ffff,GB 2a01:111:f400:2800::,2a01:111:f400:2c00:ffff:ffff:ffff:ffff,US 2a01:111:f400:2c01::,2a01:111:f400:2c02:ffff:ffff:ffff:ffff,GB @@ -23261,7 +24111,9 @@ 2a01:111:f400:508e::,2a01:111:f400:508e:ffff:ffff:ffff:ffff,AT 2a01:111:f400:508f::,2a01:111:f400:5093:ffff:ffff:ffff:ffff,GB 2a01:111:f400:5094::,2a01:111:f400:5095:ffff:ffff:ffff:ffff,AT -2a01:111:f400:5096::,2a01:111:f400:50a9:ffff:ffff:ffff:ffff,FI +2a01:111:f400:5096::,2a01:111:f400:5098:ffff:ffff:ffff:ffff,FI +2a01:111:f400:5099::,2a01:111:f400:5099:ffff:ffff:ffff:ffff,GB +2a01:111:f400:509a::,2a01:111:f400:50a9:ffff:ffff:ffff:ffff,FI 2a01:111:f400:50aa::,2a01:111:f400:50e6:ffff:ffff:ffff:ffff,GB 2a01:111:f400:50e7::,2a01:111:f400:50f7:ffff:ffff:ffff:ffff,US 2a01:111:f400:50f8::,2a01:111:f400:5101:ffff:ffff:ffff:ffff,GB @@ -23271,14 +24123,18 @@ 2a01:111:f400:510e::,2a01:111:f400:5115:ffff:ffff:ffff:ffff,GB 2a01:111:f400:5116::,2a01:111:f400:511e:ffff:ffff:ffff:ffff,US 2a01:111:f400:511f::,2a01:111:f400:513d:ffff:ffff:ffff:ffff,GB -2a01:111:f400:513e::,2a01:111:f400:514b:ffff:ffff:ffff:ffff,IE +2a01:111:f400:513e::,2a01:111:f400:5140:ffff:ffff:ffff:ffff,IE +2a01:111:f400:5141::,2a01:111:f400:5141:ffff:ffff:ffff:ffff,GB +2a01:111:f400:5142::,2a01:111:f400:514b:ffff:ffff:ffff:ffff,IE 2a01:111:f400:514c::,2a01:111:f400:514c:ffff:ffff:ffff:ffff,GB 2a01:111:f400:514d::,2a01:111:f400:514e:ffff:ffff:ffff:ffff,IE 2a01:111:f400:514f::,2a01:111:f400:5175:ffff:ffff:ffff:ffff,GB 2a01:111:f400:5176::,2a01:111:f400:5176:ffff:ffff:ffff:ffff,IE 2a01:111:f400:5177::,2a01:111:f400:517f:ffff:ffff:ffff:ffff,GB 2a01:111:f400:5180::,2a01:111:f400:518a:ffff:ffff:ffff:ffff,AU -2a01:111:f400:518b::,2a01:111:f400:5199:ffff:ffff:ffff:ffff,US +2a01:111:f400:518b::,2a01:111:f400:518c:ffff:ffff:ffff:ffff,US +2a01:111:f400:518d::,2a01:111:f400:518d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:518e::,2a01:111:f400:5199:ffff:ffff:ffff:ffff,US 2a01:111:f400:519a::,2a01:111:f400:51ad:ffff:ffff:ffff:ffff,GB 2a01:111:f400:51ae::,2a01:111:f400:51bf:ffff:ffff:ffff:ffff,US 2a01:111:f400:51c0::,2a01:111:f400:5236:ffff:ffff:ffff:ffff,GB @@ -23355,7 +24211,7 @@ 2a01:111:f400:609a::,2a01:111:f400:60a5:ffff:ffff:ffff:ffff,GB 2a01:111:f400:60a6::,2a01:111:f400:60a6:ffff:ffff:ffff:ffff,BR 2a01:111:f400:60a7::,2a01:111:f400:60a8:ffff:ffff:ffff:ffff,CA -2a01:111:f400:60a9::,2a01:111:f400:60a9:ffff:ffff:ffff:ffff,US +2a01:111:f400:60a9::,2a01:111:f400:60a9:ffff:ffff:ffff:ffff,GB 2a01:111:f400:60aa::,2a01:111:f400:60ab:ffff:ffff:ffff:ffff,DE 2a01:111:f400:60ac::,2a01:111:f400:60ac:ffff:ffff:ffff:ffff,US 2a01:111:f400:60ad::,2a01:111:f400:60ad:ffff:ffff:ffff:ffff,CA @@ -23375,7 +24231,9 @@ 2a01:111:f400:708a::,2a01:111:f400:708a:ffff:ffff:ffff:ffff,GB 2a01:111:f400:708b::,2a01:111:f400:7091:ffff:ffff:ffff:ffff,US 2a01:111:f400:7092::,2a01:111:f400:70b1:ffff:ffff:ffff:ffff,GB -2a01:111:f400:70b2::,2a01:111:f400:70d1:ffff:ffff:ffff:ffff,HK +2a01:111:f400:70b2::,2a01:111:f400:70b5:ffff:ffff:ffff:ffff,HK +2a01:111:f400:70b6::,2a01:111:f400:70b6:ffff:ffff:ffff:ffff,GB +2a01:111:f400:70b7::,2a01:111:f400:70d1:ffff:ffff:ffff:ffff,HK 2a01:111:f400:70d2::,2a01:111:f400:70e6:ffff:ffff:ffff:ffff,GB 2a01:111:f400:70e7::,2a01:111:f400:7116:ffff:ffff:ffff:ffff,IE 2a01:111:f400:7117::,2a01:111:f400:73ff:ffff:ffff:ffff:ffff,GB @@ -23396,7 +24254,13 @@ 2a01:111:f400:7e08::,2a01:111:f400:7e08:ffff:ffff:ffff:ffff,NL 2a01:111:f400:7e09::,2a01:111:f400:7e09:ffff:ffff:ffff:ffff,AT 2a01:111:f400:7e0a::,2a01:111:f400:7e0a:ffff:ffff:ffff:ffff,IE -2a01:111:f400:7e0b::,2a01:111:f400:7e40:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e0b::,2a01:111:f400:7e0b:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e0c::,2a01:111:f400:7e0c:ffff:ffff:ffff:ffff,IE +2a01:111:f400:7e0d::,2a01:111:f400:7e0d:ffff:ffff:ffff:ffff,FI +2a01:111:f400:7e0e::,2a01:111:f400:7e0e:ffff:ffff:ffff:ffff,AT +2a01:111:f400:7e0f::,2a01:111:f400:7e1d:ffff:ffff:ffff:ffff,GB +2a01:111:f400:7e1e::,2a01:111:f400:7e1e:ffff:ffff:ffff:ffff,NL +2a01:111:f400:7e1f::,2a01:111:f400:7e40:ffff:ffff:ffff:ffff,GB 2a01:111:f400:7e41::,2a01:111:f400:7e41:ffff:ffff:ffff:ffff,US 2a01:111:f400:7e42::,2a01:111:f400:7e44:ffff:ffff:ffff:ffff,GB 2a01:111:f400:7e45::,2a01:111:f400:7e45:ffff:ffff:ffff:ffff,US @@ -23668,7 +24532,13 @@ 2a01:111:f400:ff8d::,2a01:111:f400:ff8d:ffff:ffff:ffff:ffff,GB 2a01:111:f400:ff8e::,2a01:111:f400:ff8e:ffff:ffff:ffff:ffff,HK 2a01:111:f400:ff8f::,2a01:111:f400:ff8f:ffff:ffff:ffff:ffff,SG -2a01:111:f400:ff90::,2a01:111:f400:ffff:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ff90::,2a01:111:f400:ffc2:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ffc3::,2a01:111:f400:ffc3:ffff:ffff:ffff:ffff,IE +2a01:111:f400:ffc4::,2a01:111:f400:ffcb:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ffcc::,2a01:111:f400:ffcc:ffff:ffff:ffff:ffff,FI +2a01:111:f400:ffcd::,2a01:111:f400:ffe7:ffff:ffff:ffff:ffff,GB +2a01:111:f400:ffe8::,2a01:111:f400:ffe9:ffff:ffff:ffff:ffff,US +2a01:111:f400:ffea::,2a01:111:f400:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:f401::,2a01:111:f401::ffff:ffff:ffff:ffff,US 2a01:111:f401:1::,2a01:111:f401:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:f402::,2a01:111:f402:7ff:ffff:ffff:ffff:ffff,US @@ -23698,8 +24568,8 @@ 2a01:111:f402:5c00::,2a01:111:f402:5fff:ffff:ffff:ffff:ffff,AU 2a01:111:f402:6000::,2a01:111:f402:6fff:ffff:ffff:ffff:ffff,GB 2a01:111:f402:7000::,2a01:111:f402:73ff:ffff:ffff:ffff:ffff,AU -2a01:111:f402:7400::,2a01:111:f402:87ff:ffff:ffff:ffff:ffff,GB -2a01:111:f402:8800::,2a01:111:f402:8bff:ffff:ffff:ffff:ffff,NL +2a01:111:f402:7400::,2a01:111:f402:83ff:ffff:ffff:ffff:ffff,GB +2a01:111:f402:8400::,2a01:111:f402:8bff:ffff:ffff:ffff:ffff,NL 2a01:111:f402:8c00::,2a01:111:f402:93ff:ffff:ffff:ffff:ffff,GB 2a01:111:f402:9400::,2a01:111:f402:97ff:ffff:ffff:ffff:ffff,IE 2a01:111:f402:9800::,2a01:111:f402:9bff:ffff:ffff:ffff:ffff,GB @@ -23765,7 +24635,7 @@ 2a01:111:f406:b800::,2a01:111:f4ff:ffff:ffff:ffff:ffff:ffff,GB 2a01:111:f500::,2a01:111:f5ff:ffff:ffff:ffff:ffff:ffff,US 2a01:111:f600::,2a01:111:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a01:120::,2a01:120:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:120::,2a01:127:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:130::,2a01:138:a01c:ffff:ffff:ffff:ffff:ffff,DE 2a01:138:a01d::,2a01:138:a01d:ffff:ffff:ffff:ffff:ffff,CH 2a01:138:a01e::,2a01:13f:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -23851,6 +24721,7 @@ 2a01:3e0:402::,2a01:3e0:403:ffff:ffff:ffff:ffff:ffff,FR 2a01:3e0:501::,2a01:3e0:501:ffff:ffff:ffff:ffff:ffff,RU 2a01:3e0:502::,2a01:3e0:502:ffff:ffff:ffff:ffff:ffff,DE +2a01:3e0:701::,2a01:3e0:701:ffff:ffff:ffff:ffff:ffff,GB 2a01:3e0:801::,2a01:3e0:801:ffff:ffff:ffff:ffff:ffff,FR 2a01:3e0:d01::,2a01:3e0:d02:ffff:ffff:ffff:ffff:ffff,GB 2a01:3e0:1101::,2a01:3e0:1101:ffff:ffff:ffff:ffff:ffff,NL @@ -23867,7 +24738,9 @@ 2a01:3e0:3300::,2a01:3e0:3300:ff:ffff:ffff:ffff:ffff,BG 2a01:3e0:3400::,2a01:3e0:3400:ff:ffff:ffff:ffff:ffff,HU 2a01:3e0:3500::,2a01:3e0:3500:ff:ffff:ffff:ffff:ffff,LU -2a01:3e0:ff24::,2a01:3e0:ff24:ffff:ffff:ffff:ffff:ffff,DE +2a01:3e0:3600::,2a01:3e0:3600:1ff:ffff:ffff:ffff:ffff,SA +2a01:3e0:3700::,2a01:3e0:3700:ff:ffff:ffff:ffff:ffff,SA +2a01:3e0:ff24::,2a01:3e0:ff25:ffff:ffff:ffff:ffff:ffff,DE 2a01:3e8::,2a01:3e8:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:3f0::,2a01:3f7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a01:3f8::,2a01:3f8:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -23997,7 +24870,7 @@ 2a01:7c8::,2a01:7c8:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:7d0::,2a01:7d0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:7d8::,2a01:7d8:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a01:7e0::,2a01:7e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a01:7e0::,2a01:7e7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:7e8::,2a01:7e8:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a01:7f0::,2a01:7f0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a01:7f8::,2a01:7f8:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -24274,7 +25147,7 @@ 2a01:61e0::,2a01:61e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:6200::,2a01:6200:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a01:6220::,2a01:6220:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a01:6240::,2a01:6240:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:6240::,2a01:6247:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:6260::,2a01:6260:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:6280::,2a01:6280:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a01:62a0::,2a01:62a0:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -24652,7 +25525,7 @@ 2a01:9060::,2a01:9060:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a01:9080::,2a01:9080:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a01:90a0::,2a01:90a0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:90c0::,2a01:90c0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a01:90c0::,2a01:90c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:90e0::,2a01:90e0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a01:9100::,2a01:9107:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a01:9120::,2a01:9120:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -24665,7 +25538,7 @@ 2a01:9200::,2a01:9200:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:9220::,2a01:9220:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a01:9240::,2a01:9240:ffff:ffff:ffff:ffff:ffff:ffff,AZ -2a01:9260::,2a01:9260:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a01:9260::,2a01:9260:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:9280::,2a01:9280:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a01:92a0::,2a01:92a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a01:92c0::,2a01:92c0:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -24697,7 +25570,7 @@ 2a01:9620::,2a01:9627:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a01:9640::,2a01:9640:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a01:9660::,2a01:9660:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a01:9680::,2a01:9680:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a01:9680::,2a01:9687:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a01:96a0::,2a01:96a0:ffff:ffff:ffff:ffff:ffff:ffff,KG 2a01:96c0::,2a01:96c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:96e0::,2a01:96e0:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -24793,7 +25666,7 @@ 2a01:a220::,2a01:a220:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:a240::,2a01:a240:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a01:a260::,2a01:a260:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a01:a280::,2a01:a280:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a01:a280::,2a01:a283:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a01:a2a0::,2a01:a2a0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a01:a2c0::,2a01:a2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a01:a2e0::,2a01:a2e0:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -24959,7 +25832,7 @@ 2a01:b760::,2a01:b760:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a01:b780::,2a01:b780:ffff:ffff:ffff:ffff:ffff:ffff,MK 2a01:b7a0::,2a01:b7a0:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a01:b7c0::,2a01:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a01:b7c0::,2a01:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a01:b7e0::,2a01:b7e0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a01:b800::,2a01:b800:ffff:ffff:ffff:ffff:ffff:ffff,RS 2a01:b820::,2a01:b820:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -25093,7 +25966,7 @@ 2a02:1e0::,2a02:1e8:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:1f0::,2a02:1f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:1f8::,2a02:1f8:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:200::,2a02:200:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a02:200::,2a02:207:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:208::,2a02:208:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:210::,2a02:210:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:218::,2a02:21f:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -25172,7 +26045,7 @@ 2a02:480::,2a02:480:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a02:488::,2a02:488:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:490::,2a02:490:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:498::,2a02:498:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:498::,2a02:49f:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:4a0::,2a02:4a0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:4a8::,2a02:4a8:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:4b0::,2a02:4b0:ffff:ffff:ffff:ffff:ffff:ffff,BE @@ -25242,7 +26115,7 @@ 2a02:6e0::,2a02:6e0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:6e8::,2a02:6e8:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:6f0::,2a02:6f0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a02:6f8::,2a02:6f8:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:6f8::,2a02:6f8:ffff:ffff:ffff:ffff:ffff:ffff,CY 2a02:700::,2a02:700:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:708::,2a02:708:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:710::,2a02:710:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -25332,8 +26205,8 @@ 2a02:9a8::,2a02:9a8:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:9b0::,2a02:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a02:9b8::,2a02:9b9:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a02:9c0::,2a02:9c0:ffff:ffff:ffff:ffff:ffff:ffff,JO -2a02:9c8::,2a02:9c8:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a02:9c0::,2a02:9c7:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a02:9c8::,2a02:9cf:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:9d0::,2a02:9d0:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a02:9d8::,2a02:9d8:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:9e0::,2a02:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -25343,7 +26216,8 @@ 2a02:a00::,2a02:a00:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:a08::,2a02:a08:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:a10::,2a02:a10::ffff:ffff:ffff:ffff:ffff,US -2a02:a10:1::,2a02:a10:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:a10:1::,2a02:a10:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a02:a11::,2a02:a17:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:a18::,2a02:a18:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:a20::,2a02:a20:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:a28::,2a02:a28:ffff:ffff:ffff:ffff:ffff:ffff,CZ @@ -25449,7 +26323,7 @@ 2a02:d78::,2a02:d78:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:d80::,2a02:d80:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a02:d88::,2a02:d88:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:d90::,2a02:d90:ffff:ffff:ffff:ffff:ffff:ffff,SI +2a02:d90::,2a02:d97:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a02:d98::,2a02:d98:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:da8::,2a02:da8:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:db0::,2a02:db0:ffff:ffff:ffff:ffff:ffff:ffff,UA @@ -25500,7 +26374,7 @@ 2a02:f30::,2a02:f30:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:f38::,2a02:f38:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:f40::,2a02:f40:ffff:ffff:ffff:ffff:ffff:ffff,PL -2a02:f48::,2a02:f48:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a02:f48::,2a02:f4f:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a02:f50::,2a02:f50:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a02:f58::,2a02:f58:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:f60::,2a02:f60:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -25555,7 +26429,7 @@ 2a02:13e0::,2a02:13e0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a02:13e8::,2a02:13e8:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:13f0::,2a02:13f0:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a02:13f8::,2a02:13f8:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:13f8::,2a02:13ff:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:1400::,2a02:143f:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:1600::,2a02:1600:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a02:1608::,2a02:1608:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -25647,7 +26521,7 @@ 2a02:20b8::,2a02:20b8:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a02:20c0::,2a02:20c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:20c8::,2a02:20c8:ffff:ffff:ffff:ffff:ffff:ffff,NO -2a02:20d0::,2a02:20d0:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a02:20d0::,2a02:20d7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:20d8::,2a02:20d8:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:20e0::,2a02:20e7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:20f0::,2a02:20f0:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -25790,7 +26664,7 @@ 2a02:2568::,2a02:2568:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:2578::,2a02:2578:ffff:ffff:ffff:ffff:ffff:ffff,BH 2a02:2580::,2a02:2587:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a02:2588::,2a02:2588:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2588::,2a02:258f:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:2590::,2a02:2590:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a02:25a0::,2a02:25a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:25a8::,2a02:25af:ffff:ffff:ffff:ffff:ffff:ffff,PL @@ -25810,7 +26684,7 @@ 2a02:2618::,2a02:2618:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:2620::,2a02:2620:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:2628::,2a02:2628:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a02:2630::,2a02:2630:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a02:2630::,2a02:2637:ffff:ffff:ffff:ffff:ffff:ffff,LT 2a02:2638::,2a02:2638:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:2640::,2a02:2647:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a02:2648::,2a02:2648:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -25877,7 +26751,9 @@ 2a02:2808:3001::,2a02:2808:3001:ffff:ffff:ffff:ffff:ffff,RU 2a02:2808:3002::,2a02:2808:5300:ffff:ffff:ffff:ffff:ffff,CZ 2a02:2808:5301::,2a02:2808:5301:ffff:ffff:ffff:ffff:ffff,RU -2a02:2808:5302::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:5302::,2a02:2808:5400:ffff:ffff:ffff:ffff:ffff,CZ +2a02:2808:5401::,2a02:2808:5401:ffff:ffff:ffff:ffff:ffff,FI +2a02:2808:5402::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:2810::,2a02:2810:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a02:2818::,2a02:2818:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a02:2820::,2a02:2820:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -25927,7 +26803,11 @@ 2a02:2990::,2a02:2990:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:2998::,2a02:2998:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:29a0::,2a02:29a0:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a02:29a8::,2a02:29b0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a02:29a8::,2a02:29a8:3ff:ffff:ffff:ffff:ffff:ffff,NL +2a02:29a8:400::,2a02:29a8:4ff:ffff:ffff:ffff:ffff:ffff,SG +2a02:29a8:500::,2a02:29a8:7ff:ffff:ffff:ffff:ffff:ffff,NL +2a02:29a8:800::,2a02:29a8:8ff:ffff:ffff:ffff:ffff:ffff,US +2a02:29a8:900::,2a02:29b0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:29b8::,2a02:29b8:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a02:29c0::,2a02:29c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:29c8::,2a02:29c8:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -25972,7 +26852,9 @@ 2a02:2b00::,2a02:2b00:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a02:2b08::,2a02:2b08:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:2b10::,2a02:2b10:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:2b18::,2a02:2b18:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a02:2b18::,2a02:2b18::7fff:ffff:ffff:ffff:ffff,RU +2a02:2b18:0:8000::,2a02:2b18::ffff:ffff:ffff:ffff:ffff,UA +2a02:2b18:1::,2a02:2b18:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:2b20::,2a02:2b20:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a02:2b28::,2a02:2b28:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:2b30::,2a02:2b30:ffff:ffff:ffff:ffff:ffff:ffff,UA @@ -26182,7 +27064,7 @@ 2a02:5480::,2a02:5480:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a02:54a0::,2a02:54a0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a02:54c0::,2a02:54c0:ffff:ffff:ffff:ffff:ffff:ffff,AT -2a02:54e0::,2a02:54e0:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a02:54e0::,2a02:54e7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:5500::,2a02:5507:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:5520::,2a02:5520:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:5540::,2a02:5540:ffff:ffff:ffff:ffff:ffff:ffff,ES @@ -26292,7 +27174,6 @@ 2a02:6280::,2a02:6280:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a02:62a0::,2a02:62a0:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a02:62c0::,2a02:62c0:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a02:62e0::,2a02:62e0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:6300::,2a02:6300:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a02:6320::,2a02:6320:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a02:6340::,2a02:6340:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -26453,7 +27334,7 @@ 2a02:76c0::,2a02:76c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:76e0::,2a02:76e0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:7700::,2a02:7700:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:7720::,2a02:7720:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a02:7720::,2a02:7727:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a02:7740::,2a02:7740:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a02:7760::,2a02:7760:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a02:7780::,2a02:7780:ffff:ffff:ffff:ffff:ffff:ffff,CY @@ -26671,7 +27552,7 @@ 2a02:d600::,2a02:d607:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:d640::,2a02:d647:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a02:d680::,2a02:d683:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a02:d6a0::,2a02:d6a3:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a02:d6a0::,2a02:d6a7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:d6c0::,2a02:d6c7:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a02:d700::,2a02:d707:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a02:d740::,2a02:d747:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -26818,7 +27699,6 @@ 2a02:f8c0::,2a02:f8c7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a02:f900::,2a02:f907:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a02:f940::,2a02:f947:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a02:f980::,2a02:f987:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:f9c0::,2a02:f9c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a02:fa00::,2a02:fa07:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a02:fa40::,2a02:fa47:ffff:ffff:ffff:ffff:ffff:ffff,TR @@ -27374,6 +28254,7 @@ 2a03:40a0::,2a03:40a0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:40c0::,2a03:40c0:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a03:40e0::,2a03:40e0:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:4100::,2a03:4107:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4140::,2a03:4140:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:4160::,2a03:4160:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:4180::,2a03:4180:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -27400,7 +28281,6 @@ 2a03:4480::,2a03:4480:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a03:44a0::,2a03:44a0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:44c0::,2a03:44c0:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a03:44e0::,2a03:44e0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:4500::,2a03:4500:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:4520::,2a03:4520:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a03:4540::,2a03:4540:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -27421,7 +28301,7 @@ 2a03:4720::,2a03:4720:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a03:4740::,2a03:4740:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4760::,2a03:4760:ffff:ffff:ffff:ffff:ffff:ffff,CZ -2a03:4780::,2a03:4780:ffff:ffff:ffff:ffff:ffff:ffff,KW +2a03:4780::,2a03:4787:ffff:ffff:ffff:ffff:ffff:ffff,KW 2a03:47a0::,2a03:47a0:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a03:47c0::,2a03:47c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a03:4800::,2a03:4800:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -27469,6 +28349,7 @@ 2a03:4a80:b::,2a03:4a80:b:ffff:ffff:ffff:ffff:ffff,AE 2a03:4a80:c::,2a03:4a80:fffe:ffff:ffff:ffff:ffff:ffff,NL 2a03:4a80:ffff::,2a03:4a80:ffff:ffff:ffff:ffff:ffff:ffff,US +2a03:4a81::,2a03:4a87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4aa0::,2a03:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:4ac0::,2a03:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ 2a03:4ae0::,2a03:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,CH @@ -27545,7 +28426,7 @@ 2a03:53e0::,2a03:53e0:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a03:5400::,2a03:5400:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a03:5420::,2a03:5420:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:5440::,2a03:5440:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a03:5440::,2a03:5447:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a03:5460::,2a03:5460:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:5480::,2a03:5480:ffff:ffff:ffff:ffff:ffff:ffff,LI 2a03:54a0::,2a03:54a0:ffff:ffff:ffff:ffff:ffff:ffff,IR @@ -27640,7 +28521,7 @@ 2a03:6060::,2a03:6060:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:6080::,2a03:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:60c0::,2a03:60c0::ffff:ffff:ffff:ffff:ffff,US -2a03:60c0:1::,2a03:60c0:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a03:60c0:1::,2a03:60c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:60e0::,2a03:60e0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:6100::,2a03:6100:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a03:6120::,2a03:6120:ffff:ffff:ffff:ffff:ffff:ffff,UA @@ -27654,7 +28535,7 @@ 2a03:6220::,2a03:6220:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a03:6240::,2a03:6240:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a03:6260::,2a03:6260:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:6280::,2a03:6280:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:6280::,2a03:6287:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:62a0::,2a03:62a0:3500:ffff:ffff:ffff:ffff:ffff,AU 2a03:62a0:3501::,2a03:62a0:3501:7fff:ffff:ffff:ffff:ffff,FI 2a03:62a0:3501:8000::,2a03:62a0:ffff:ffff:ffff:ffff:ffff:ffff,AU @@ -27819,7 +28700,7 @@ 2a03:7720::,2a03:7720:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a03:7740::,2a03:7740:ffff:ffff:ffff:ffff:ffff:ffff,AZ 2a03:7760::,2a03:7760:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a03:7780::,2a03:7780:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a03:7780::,2a03:7787:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:77a0::,2a03:77a0:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:77c0::,2a03:77c0:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a03:77e0::,2a03:77e0:4401:1098::63,GB @@ -27984,7 +28865,7 @@ 2a03:8ac0:251::,2a03:8ac0:ffff:ffff:ffff:ffff:ffff:ffff,US 2a03:8ae0::,2a03:8ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:8b00::,2a03:8b00:ffff:ffff:ffff:ffff:ffff:ffff,SM -2a03:8b20::,2a03:8b20:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:8b20::,2a03:8b20:ffff:ffff:ffff:ffff:ffff:ffff,HR 2a03:8b40::,2a03:8b40:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a03:8b60::,2a03:8b60:ffff:ffff:ffff:ffff:ffff:ffff,SY 2a03:8b80::,2a03:8b80:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -28027,7 +28908,25 @@ 2a03:9060::,2a03:9060:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:9080::,2a03:9080:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:90a0::,2a03:90a0:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a03:90c0::,2a03:90c0:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:90c0::,2a03:90c0:f:ffff:ffff:ffff:ffff:ffff,AT +2a03:90c0:10::,2a03:90c0:1f:ffff:ffff:ffff:ffff:ffff,NL +2a03:90c0:20::,2a03:90c0:3f:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:40::,2a03:90c0:4f:ffff:ffff:ffff:ffff:ffff,DE +2a03:90c0:50::,2a03:90c0:5f:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:60::,2a03:90c0:6f:ffff:ffff:ffff:ffff:ffff,SG +2a03:90c0:70::,2a03:90c0:7f:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:80::,2a03:90c0:8f:ffff:ffff:ffff:ffff:ffff,LU +2a03:90c0:90::,2a03:90c0:9f:ffff:ffff:ffff:ffff:ffff,CY +2a03:90c0:a0::,2a03:90c0:bf:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:c0::,2a03:90c0:cf:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:d0::,2a03:90c0:df:ffff:ffff:ffff:ffff:ffff,PL +2a03:90c0:e0::,2a03:90c0:998f:ffff:ffff:ffff:ffff:ffff,AT +2a03:90c0:9990::,2a03:90c0:9994:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:9995::,2a03:90c0:9995:ffff:ffff:ffff:ffff:ffff,SG +2a03:90c0:9996::,2a03:90c0:9996:ffff:ffff:ffff:ffff:ffff,US +2a03:90c0:9997::,2a03:90c0:9997:ffff:ffff:ffff:ffff:ffff,DE +2a03:90c0:9998::,2a03:90c0:999f:ffff:ffff:ffff:ffff:ffff,RU +2a03:90c0:99a0::,2a03:90c0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:90e0::,2a03:90e0:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a03:9100::,2a03:9100:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:9120::,2a03:9120:ffff:ffff:ffff:ffff:ffff:ffff,BY @@ -28311,7 +29210,7 @@ 2a03:ad20::,2a03:ad27:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:ad40::,2a03:ad40:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a03:ad60::,2a03:ad60:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:ad80::,2a03:ad80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a03:ad80::,2a03:ad87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:ada0::,2a03:ada0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:adc0::,2a03:adc0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:ade0::,2a03:ade0:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -28354,6 +29253,7 @@ 2a03:b300::,2a03:b300:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:b340::,2a03:b340:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a03:b380::,2a03:b380:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a03:b3c0::,2a03:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:b400::,2a03:b400:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:b440::,2a03:b440:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:b480::,2a03:b480:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -28362,7 +29262,7 @@ 2a03:b540::,2a03:b540:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a03:b580::,2a03:b580:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a03:b5c0::,2a03:b5c0:ffff:ffff:ffff:ffff:ffff:ffff,FR -2a03:b600::,2a03:b600:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:b600::,2a03:b607:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:b640::,2a03:b640:ffff:ffff:ffff:ffff:ffff:ffff,JO 2a03:b680::,2a03:b680:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:b6c0::,2a03:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -28427,7 +29327,7 @@ 2a03:c5c0::,2a03:c5c0:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a03:c600::,2a03:c600:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:c640::,2a03:c640:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a03:c680::,2a03:c680:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a03:c680::,2a03:c687:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a03:c6c0::,2a03:c6c0:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a03:c700::,2a03:c700:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:c740::,2a03:c740:ffff:ffff:ffff:ffff:ffff:ffff,BY @@ -28533,7 +29433,6 @@ 2a03:e040::,2a03:e040:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:e080::,2a03:e080:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a03:e0c0::,2a03:e0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a03:e100::,2a03:e100:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:e140::,2a03:e140:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a03:e180::,2a03:e180:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a03:e1c0::,2a03:e1c0:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -28592,7 +29491,13 @@ 2a03:ef00::,2a03:ef00:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a03:ef40::,2a03:ef47:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a03:ef80::,2a03:ef80:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a03:efc0::,2a03:efc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a03:efc0::,2a03:efc0:6ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:efc0:700::,2a03:efc0:7ff:ffff:ffff:ffff:ffff:ffff,FR +2a03:efc0:800::,2a03:efc0:8ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:efc0:900::,2a03:efc0:9ff:ffff:ffff:ffff:ffff:ffff,ES +2a03:efc0:a00::,2a03:efc0:10ff:ffff:ffff:ffff:ffff:ffff,GB +2a03:efc0:1100::,2a03:efc0:11ff:ffff:ffff:ffff:ffff:ffff,DE +2a03:efc0:1200::,2a03:efc7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a03:f000::,2a03:f000:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a03:f040::,2a03:f040:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a03:f080::,2a03:f080:ffff:ffff:ffff:ffff:ffff:ffff,AT @@ -28872,7 +29777,9 @@ 2a04:3480::,2a04:3487:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:34c0::,2a04:34c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:3500::,2a04:3507:ffff:ffff:ffff:ffff:ffff:ffff,IE -2a04:3540::,2a04:3547:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:3540::,2a04:3542:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a04:3543::,2a04:3543:ffff:ffff:ffff:ffff:ffff:ffff,SG +2a04:3544::,2a04:3547:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a04:3580::,2a04:3587:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a04:35c0::,2a04:35c7:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a04:3600::,2a04:3607:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -29089,7 +29996,7 @@ 2a04:6a00::,2a04:6a07:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:6a40::,2a04:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:6a80::,2a04:6a87:ffff:ffff:ffff:ffff:ffff:ffff,SE -2a04:6ac0::,2a04:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a04:6ac0::,2a04:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a04:6b00::,2a04:6b07:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a04:6b40::,2a04:6b47:ffff:ffff:ffff:ffff:ffff:ffff,GG 2a04:6b80::,2a04:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NO @@ -29414,7 +30321,6 @@ 2a04:ba40::,2a04:ba47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:ba80::,2a04:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:bac0::,2a04:bac7:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a04:bb00::,2a04:bb07:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a04:bb40::,2a04:bb47:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a04:bb80::,2a04:bb87:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a04:bbc0::,2a04:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -29488,7 +30394,6 @@ 2a04:c9c0::,2a04:c9c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:ca00::,2a04:ca07:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a04:ca40::,2a04:ca47:ffff:ffff:ffff:ffff:ffff:ffff,TR -2a04:ca80::,2a04:ca87:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a04:cac0::,2a04:cac7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a04:cb00::,2a04:cb07:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a04:cb40::,2a04:cb47:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -30547,11 +31452,19 @@ 2a05:d050:c080::,2a05:d050:c08f:ffff:ffff:ffff:ffff:ffff,GB 2a05:d050:c090::,2a05:d050:c0bf:ffff:ffff:ffff:ffff:ffff,IE 2a05:d050:c0c0::,2a05:d050:c0cf:ffff:ffff:ffff:ffff:ffff,GB -2a05:d050:c0d0::,2a05:d07c:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d050:c0d0::,2a05:d07c:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07c:2000::,2a05:d07c:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d07c:2100::,2a05:d07c:3fff:ffff:ffff:ffff:ffff:ffff,IE 2a05:d07c:4000::,2a05:d07c:40ff:ffff:ffff:ffff:ffff:ffff,DE 2a05:d07c:4100::,2a05:d07c:bfff:ffff:ffff:ffff:ffff:ffff,IE 2a05:d07c:c000::,2a05:d07c:c0ff:ffff:ffff:ffff:ffff:ffff,GB -2a05:d07c:c100::,2a05:d07f:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07c:c100::,2a05:d07f:1fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07f:2000::,2a05:d07f:20ff:ffff:ffff:ffff:ffff:ffff,FR +2a05:d07f:2100::,2a05:d07f:3fff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07f:4000::,2a05:d07f:40ff:ffff:ffff:ffff:ffff:ffff,DE +2a05:d07f:4100::,2a05:d07f:bfff:ffff:ffff:ffff:ffff:ffff,IE +2a05:d07f:c000::,2a05:d07f:c0ff:ffff:ffff:ffff:ffff:ffff,GB +2a05:d07f:c100::,2a05:d07f:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a05:d400::,2a05:d407:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a05:d440::,2a05:d447:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a05:d480::,2a05:d487:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -30601,7 +31514,9 @@ 2a05:dfc0:1ee4::,2a05:dfc0:1ee4:ffff:ffff:ffff:ffff:ffff,CA 2a05:dfc0:1ee5::,2a05:dfc0:6938:ffff:ffff:ffff:ffff:ffff,GB 2a05:dfc0:6939::,2a05:dfc0:6939:ffff:ffff:ffff:ffff:ffff,NL -2a05:dfc0:693a::,2a05:dfc7:7:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc0:693a::,2a05:dfc7:4:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:5::,2a05:dfc7:5:ffff:ffff:ffff:ffff:ffff,AQ +2a05:dfc7:6::,2a05:dfc7:7:ffff:ffff:ffff:ffff:ffff,GB 2a05:dfc7:8::,2a05:dfc7:8:7fff:ffff:ffff:ffff:ffff,SG 2a05:dfc7:8:8000::,2a05:dfc7:8:ffff:ffff:ffff:ffff:ffff,GB 2a05:dfc7:9::,2a05:dfc7:9:7fff:ffff:ffff:ffff:ffff,SG @@ -30614,7 +31529,14 @@ 2a05:dfc7:30::,2a05:dfc7:30:ffff:ffff:ffff:ffff:ffff,US 2a05:dfc7:31::,2a05:dfc7:3f:ffff:ffff:ffff:ffff:ffff,GB 2a05:dfc7:40::,2a05:dfc7:40:ffff:ffff:ffff:ffff:ffff,BY -2a05:dfc7:41::,2a05:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:41::,2a05:dfc7:5352:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:5353::,2a05:dfc7:5353:ffff:ffff:ffff:ffff:ffff,AQ +2a05:dfc7:5354::,2a05:dfc7:beee:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:beef::,2a05:dfc7:beef:ffff:ffff:ffff:ffff:ffff,AQ +2a05:dfc7:bef0::,2a05:dfc7:dfc6:ffff:ffff:ffff:ffff:ffff,GB +2a05:dfc7:dfc7::,2a05:dfc7:dfc7:ffff:ffff:ffff:ffff:ffff,UA +2a05:dfc7:dfc8::,2a05:dfc7:dfc8:ffff:ffff:ffff:ffff:ffff,US +2a05:dfc7:dfc9::,2a05:dfc7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a05:e000::,2a05:e007:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a05:e040::,2a05:e047:ffff:ffff:ffff:ffff:ffff:ffff,KZ 2a05:e080::,2a05:e087:ffff:ffff:ffff:ffff:ffff:ffff,IE @@ -30650,7 +31572,6 @@ 2a05:e840::,2a05:e847:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a05:e880::,2a05:e887:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a05:e8c0::,2a05:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a05:e900::,2a05:e907:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a05:e940::,2a05:e947:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a05:e980::,2a05:e987:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a05:e9c0::,2a05:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL @@ -31708,7 +32629,13 @@ 2a06:e881:200::,2a06:e881:2ff:ffff:ffff:ffff:ffff:ffff,AT 2a06:e881:300::,2a06:e881:14ff:ffff:ffff:ffff:ffff:ffff,CH 2a06:e881:1500::,2a06:e881:150f:ffff:ffff:ffff:ffff:ffff,GB -2a06:e881:1510::,2a06:e887:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:1510::,2a06:e881:16ff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:1700::,2a06:e881:170f:ffff:ffff:ffff:ffff:ffff,DE +2a06:e881:1710::,2a06:e881:1fff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:2000::,2a06:e881:200f:ffff:ffff:ffff:ffff:ffff,DE +2a06:e881:2010::,2a06:e881:20ff:ffff:ffff:ffff:ffff:ffff,CH +2a06:e881:2100::,2a06:e881:210f:ffff:ffff:ffff:ffff:ffff,DE +2a06:e881:2110::,2a06:e887:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a06:e8c0::,2a06:e8c7:ffff:ffff:ffff:ffff:ffff:ffff,LV 2a06:e900::,2a06:e907:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a06:e940::,2a06:e947:ffff:ffff:ffff:ffff:ffff:ffff,RU @@ -31919,7 +32846,13 @@ 2a07:1b80::,2a07:1b87:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a07:1bc0::,2a07:1bc7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a07:1c00::,2a07:1c07:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a07:1c40::,2a07:1c47:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c40::,2a07:1c44:609:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:60a::,2a07:1c44:60a:ffff:ffff:ffff:ffff:ffff,DE +2a07:1c44:60b::,2a07:1c44:619:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:61a::,2a07:1c44:61a:ffff:ffff:ffff:ffff:ffff,KR +2a07:1c44:61b::,2a07:1c44:6ff:ffff:ffff:ffff:ffff:ffff,AT +2a07:1c44:700::,2a07:1c44:70f:ffff:ffff:ffff:ffff:ffff,US +2a07:1c44:710::,2a07:1c47:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a07:1c80::,2a07:1c87:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a07:1cc0::,2a07:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a07:1d00::,2a07:1d07:ffff:ffff:ffff:ffff:ffff:ffff,IR @@ -32105,8 +33038,8 @@ 2a07:4b80::,2a07:4b87:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a07:4bc0::,2a07:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a07:4c00::,2a07:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a07:4c40::,2a07:4c47:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a07:4c80::,2a07:4c87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a07:4c40::,2a07:4c47:ffff:ffff:ffff:ffff:ffff:ffff,US +2a07:4c80::,2a07:4c87:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:4cc0::,2a07:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a07:4d00::,2a07:4d07:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a07:4d40::,2a07:4d47:ffff:ffff:ffff:ffff:ffff:ffff,FR @@ -32183,7 +33116,7 @@ 2a07:5f00::,2a07:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a07:5f40::,2a07:5f47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a07:5f80::,2a07:5f87:ffff:ffff:ffff:ffff:ffff:ffff,NL -2a07:5fc0::,2a07:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:5fc0::,2a07:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:6000::,2a07:6007:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a07:6040::,2a07:6047:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a07:6080::,2a07:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -32217,7 +33150,7 @@ 2a07:6780::,2a07:6787:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a07:67c0::,2a07:67c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a07:6800::,2a07:6807:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a07:6840::,2a07:6847:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a07:6840::,2a07:6847:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:6880::,2a07:6887:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a07:68c0::,2a07:68c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:6900::,2a07:6907:ffff:ffff:ffff:ffff:ffff:ffff,PA @@ -32245,7 +33178,7 @@ 2a07:6e80::,2a07:6e87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:6ec0::,2a07:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a07:6f00::,2a07:6f07:ffff:ffff:ffff:ffff:ffff:ffff,ES -2a07:6f40::,2a07:6f47:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:6f40::,2a07:6f47:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:6f80::,2a07:6f87:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a07:6fc0::,2a07:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a07:7000::,2a07:7007:ffff:ffff:ffff:ffff:ffff:ffff,TR @@ -32275,7 +33208,7 @@ 2a07:7600::,2a07:7607:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:7640::,2a07:7647:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a07:7680::,2a07:7687:ffff:ffff:ffff:ffff:ffff:ffff,IT -2a07:76c0::,2a07:76c7:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a07:76c0::,2a07:76c7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:7700::,2a07:7707:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:7740::,2a07:7747:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a07:7780::,2a07:7787:ffff:ffff:ffff:ffff:ffff:ffff,UA @@ -32435,7 +33368,7 @@ 2a07:9c00::,2a07:9c07:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a07:9c40::,2a07:9c47:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a07:9c80::,2a07:9c87:ffff:ffff:ffff:ffff:ffff:ffff,RO -2a07:9cc0::,2a07:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a07:9cc0::,2a07:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a07:9d00::,2a07:9d07:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a07:9d40::,2a07:9d47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a07:9d80::,2a07:9d87:ffff:ffff:ffff:ffff:ffff:ffff,DE @@ -32608,7 +33541,7 @@ 2a07:c740::,2a07:c747:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:c780::,2a07:c787:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a07:c7c0::,2a07:c7c7:ffff:ffff:ffff:ffff:ffff:ffff,HU -2a07:c800::,2a07:c807:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a07:c800::,2a07:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a07:c840::,2a07:c847:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a07:c880::,2a07:c887:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a07:c8c0::,2a07:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,RO @@ -32622,408 +33555,794 @@ 2a07:cac0::,2a07:cac7:ffff:ffff:ffff:ffff:ffff:ffff,CY 2a07:cb00::,2a07:cb00:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a07:cb40::,2a07:cb47:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a07:d000::,2a07:d0ff:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a08::,2a08:1fff:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a::,2a0a:7:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:40::,2a0a:47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:80::,2a0a:87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:c0::,2a0a:c7:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0a:100::,2a0a:107:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:140::,2a0a:147:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:180::,2a0a:187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1c0::,2a0a:1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:200::,2a0a:200:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0a:240::,2a0a:247:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0a:280::,2a0a:287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2c0::,2a0a:2c0:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:300::,2a0a:307:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:340::,2a0a:347:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:380::,2a0a:387:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:3c0::,2a0a:3c0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:400::,2a0a:400:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:440::,2a0a:447:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:480::,2a0a:487:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:4c0::,2a0a:4c0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:500::,2a0a:507:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:540::,2a0a:547:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:580::,2a0a:580:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:5c0::,2a0a:5c7:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:600::,2a0a:607:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:640::,2a0a:647:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:680::,2a0a:687:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:6c0::,2a0a:6c7:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:700::,2a0a:707:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:740::,2a0a:747:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:780::,2a0a:780:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7c0::,2a0a:7c7:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:800::,2a0a:807:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:840::,2a0a:847:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:880::,2a0a:880:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8c0::,2a0a:8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:900::,2a0a:907:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:940::,2a0a:947:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:980::,2a0a:987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:9c0::,2a0a:9c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:a00::,2a0a:a00:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a40::,2a0a:a43:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:a80::,2a0a:a87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:ac0::,2a0a:ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ 2a0a:b00::,2a0a:b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:b40::,2a0a:b47:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:b80::,2a0a:b87:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:bc0::,2a0a:bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:c00::,2a0a:c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:c40::,2a0a:c47:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:c80::,2a0a:c87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:cc0::,2a0a:cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:d00::,2a0a:d07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:d40::,2a0a:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:d80::,2a0a:d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:dc0::,2a0a:dc7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:e00::,2a0a:e07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:e40::,2a0a:e47:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:e80::,2a0a:e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:ec0::,2a0a:ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:f00::,2a0a:f07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:f40::,2a0a:f40:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a0a:f80::,2a0a:f87:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:fc0::,2a0a:fc7:ffff:ffff:ffff:ffff:ffff:ffff,IE 2a0a:1000::,2a0a:1007:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:1040::,2a0a:1047:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:10c0::,2a0a:10c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:1100::,2a0a:1107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1140::,2a0a:1147:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1180::,2a0a:1187:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:11c0::,2a0a:11c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:1200::,2a0a:1207:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1240::,2a0a:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1280::,2a0a:1287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:12c0::,2a0a:12c0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1300::,2a0a:1307:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1340::,2a0a:1347:ffff:ffff:ffff:ffff:ffff:ffff,PT 2a0a:1380::,2a0a:1387:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:13c0::,2a0a:13c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1400::,2a0a:1407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:1440::,2a0a:1447:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1480::,2a0a:1487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:14c0::,2a0a:14c0:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:1500::,2a0a:1507:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:1540::,2a0a:1547:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:1580::,2a0a:1587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:15c0::,2a0a:15c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:1600::,2a0a:1607:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:1640::,2a0a:1647:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1680::,2a0a:1687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:16c0::,2a0a:16c0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:1700::,2a0a:1707:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:1740::,2a0a:1747:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:1780::,2a0a:1787:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:17c0::,2a0a:17c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:1800::,2a0a:1800:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1840::,2a0a:1847:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1880::,2a0a:1887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:18c0::,2a0a:18c7:ffff:ffff:ffff:ffff:ffff:ffff,SA 2a0a:1900::,2a0a:1907:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:1940::,2a0a:1947:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:1980::,2a0a:1987:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:19c0::,2a0a:19c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1a00::,2a0a:1a07:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:1a40::,2a0a:1a40:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1a80::,2a0a:1a87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:1ac0::,2a0a:1ac7:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:1b00::,2a0a:1b07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:1b40::,2a0a:1b40:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a0a:1b80::,2a0a:1b87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:1bc0::,2a0a:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1c00::,2a0a:1c07:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:1c40::,2a0a:1c47:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:1c80::,2a0a:1c87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:1cc0::,2a0a:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:1d00::,2a0a:1d00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:1d40::,2a0a:1d40:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:1d80::,2a0a:1d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:1dc0::,2a0a:1dc7:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a0a:1e00::,2a0a:1e07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:1e40::,2a0a:1e40:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:1e80::,2a0a:1e87:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:1ec0::,2a0a:1ec1:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:1f00::,2a0a:1f07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:1f40::,2a0a:1f47:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:1f80::,2a0a:1f87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:1fc0::,2a0a:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2000::,2a0a:2007:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:2040::,2a0a:2047:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:2080::,2a0a:2087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:20c0::,2a0a:20c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:2100::,2a0a:2107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:2140::,2a0a:2147:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2180::,2a0a:2187:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:21c0::,2a0a:21c7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:2200::,2a0a:2200:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:2240::,2a0a:2247:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:2280::,2a0a:2287:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:22c0::,2a0a:22c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:2300::,2a0a:2307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2340::,2a0a:2347:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2380::,2a0a:2380:ffff:ffff:ffff:ffff:ffff:ffff,LV +2a0a:23c0::,2a0a:23c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:2400::,2a0a:2400:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:2440::,2a0a:2440:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:2480::,2a0a:2487:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:24c0::,2a0a:24c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:2500::,2a0a:2500:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:2540::,2a0a:2547:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:2580::,2a0a:2587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:25c0::,2a0a:25c7:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:2600::,2a0a:2607:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:2640::,2a0a:2647:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2680::,2a0a:2687:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:26c0::,2a0a:26c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:2700::,2a0a:2707:ffff:ffff:ffff:ffff:ffff:ffff,RU -2a0a:2780::,2a0a:2787:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:2740::,2a0a:2747:ffff:ffff:ffff:ffff:ffff:ffff,JO +2a0a:2780::,2a0a:2783:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:2784::,2a0a:2784:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:2785::,2a0a:2787:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:27c0::,2a0a:27c0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:2800::,2a0a:2807:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:2840::,2a0a:2847:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a0a:2880::,2a0a:2887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:28c0::,2a0a:28c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:2900::,2a0a:2907:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:2940::,2a0a:2947:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:2980::,2a0a:2987:ffff:ffff:ffff:ffff:ffff:ffff,TJ +2a0a:29c0::,2a0a:29c0:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:2a00::,2a0a:2a00:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:2a40::,2a0a:2a47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:2a80::,2a0a:2a87:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:2ac0::,2a0a:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:2b00::,2a0a:2b00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2b40::,2a0a:2b47:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:2b80::,2a0a:2b87:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:2bc0::,2a0a:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2c00::,2a0a:2c07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:2c40::,2a0a:2c47:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:2c80::,2a0a:2c87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:2cc0::,2a0a:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:2d00::,2a0a:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2d40::,2a0a:2d47:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0a:2d80::,2a0a:2d87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:2dc0::,2a0a:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:2e00::,2a0a:2e07:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:2e40::,2a0a:2e47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:2e80::,2a0a:2e87:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:2ec0::,2a0a:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:2f00::,2a0a:2f07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:2f40::,2a0a:2f40:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:2f80::,2a0a:2f80:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:2fc0::,2a0a:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:3000::,2a0a:3000:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3040::,2a0a:3047:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:3080::,2a0a:3087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:30c0::,2a0a:30c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:3100::,2a0a:3107:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3140::,2a0a:3147:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:3180::,2a0a:3187:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:31c0::,2a0a:31c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:3200::,2a0a:3207:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3240::,2a0a:3240:ffff:ffff:ffff:ffff:ffff:ffff,IQ 2a0a:3280::,2a0a:3287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:32c0::,2a0a:32c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:3300::,2a0a:3307:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:3340::,2a0a:3347:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:3380::,2a0a:3387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:33c0::,2a0a:33c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:3400::,2a0a:3407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:3440::,2a0a:3447:ffff:ffff:ffff:ffff:ffff:ffff,AM 2a0a:3480::,2a0a:3487:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:34c0::,2a0a:34c3:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:3500::,2a0a:3507:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3540::,2a0a:3547:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:3580::,2a0a:3587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:35c0::,2a0a:35c7:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:3600::,2a0a:3607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3640::,2a0a:3647:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:3680::,2a0a:3687:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:36c0::,2a0a:36c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:3700::,2a0a:3707:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:3740::,2a0a:3747:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:3780::,2a0a:3787:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:37c0::,2a0a:37c7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:3800::,2a0a:3807:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:3840::,2a0a:3847:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:3880::,2a0a:3887:ffff:ffff:ffff:ffff:ffff:ffff,AM +2a0a:38c0::,2a0a:38c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:3900::,2a0a:3907:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:3940::,2a0a:3947:ffff:ffff:ffff:ffff:ffff:ffff,AE 2a0a:3980::,2a0a:3980:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:39c0::,2a0a:39c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:3a00::,2a0a:3a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3a40::,2a0a:3a40:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:3a80::,2a0a:3a87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:3ac0::,2a0a:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:3b00::,2a0a:3b00:ffff:ffff:ffff:ffff:ffff:ffff,DE -2a0a:3b80::,2a0a:3b80:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:3b40::,2a0a:3b47:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3bc0::,2a0a:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:3c00::,2a0a:3c00:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:3c40::,2a0a:3c47:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:3c80::,2a0a:3c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3cc0::,2a0a:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:3d00::,2a0a:3d00:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:3d40::,2a0a:3d47:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:3d80::,2a0a:3d87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:3dc0::,2a0a:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:3e00::,2a0a:3e07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:3e40::,2a0a:3e47:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:3e80::,2a0a:3e87:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:3ec0::,2a0a:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:3f00::,2a0a:3f00:ffff:ffff:ffff:ffff:ffff:ffff,LT +2a0a:3f40::,2a0a:3f40:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:3f80::,2a0a:3f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:3fc0::,2a0a:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a0a:4000::,2a0a:4007:ffff:ffff:ffff:ffff:ffff:ffff,HU +2a0a:4040::,2a0a:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:4080::,2a0a:4087:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:40c0::,2a0a:40c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:4100::,2a0a:4107:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4140::,2a0a:4147:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:4180::,2a0a:4187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:41c0::,2a0a:41c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:4200::,2a0a:4207:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0a:4240::,2a0a:4247:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4280::,2a0a:4287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:42c0::,2a0a:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:4300::,2a0a:4307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4340::,2a0a:4347:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4380::,2a0a:4387:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:43c0::,2a0a:43c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4400::,2a0a:4407:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:4440::,2a0a:4440:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:4480::,2a0a:4487:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:44c0::,2a0a:44c7:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:4500::,2a0a:4507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4540::,2a0a:4540:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4580::,2a0a:4587:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:45c0::,2a0a:45c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4600::,2a0a:4607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4640::,2a0a:4647:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:4680::,2a0a:4687:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:46c0::,2a0a:46c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:4700::,2a0a:4707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:4740::,2a0a:4747:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:4780::,2a0a:4787:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:47c0::,2a0a:47c7:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:4800::,2a0a:4807:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:4840::,2a0a:4847:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4880::,2a0a:4887:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:48c0::,2a0a:48c7:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:4900::,2a0a:4907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:4940::,2a0a:4947:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:4980::,2a0a:4987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:49c0::,2a0a:49c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4a00::,2a0a:4a07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:4a40::,2a0a:4a47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:4a80::,2a0a:4a87:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:4ac0::,2a0a:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:4b00::,2a0a:4b07:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:4b40::,2a0a:4b47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:4b80::,2a0a:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:4bc0::,2a0a:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4c00::,2a0a:4c06:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4c07::,2a0a:4c07::ffff:ffff:ffff:ffff:ffff,CA 2a0a:4c07:1::,2a0a:4c07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4c40::,2a0a:4c40:ffff:ffff:ffff:ffff:ffff:ffff,GR 2a0a:4c80::,2a0a:4c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4cc0::,2a0a:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:4d00::,2a0a:4d07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:4d40::,2a0a:4d40:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:4d80::,2a0a:4d87:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:4dc0::,2a0a:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:4e00::,2a0a:4e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:4e40::,2a0a:4e47:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:4e80::,2a0a:4e87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:4ec0::,2a0a:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:4f00::,2a0a:4f07:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:4f40::,2a0a:4f40:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:4f80::,2a0a:4f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:4fc0::,2a0a:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:5000::,2a0a:5007:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:5040::,2a0a:5040:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:5080::,2a0a:5087:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:50c0::,2a0a:50c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:5100::,2a0a:5107:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:5140::,2a0a:5147:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:5180::,2a0a:5187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:51c0::,2a0a:51c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:5200::,2a0a:5200:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:5240::,2a0a:5247:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a0a:5280::,2a0a:5287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:52c0::,2a0a:52c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:5300::,2a0a:5307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5340::,2a0a:5347:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:5380::,2a0a:5387:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:53c0::,2a0a:53c7:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:5400::,2a0a:5407:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:5440::,2a0a:5447:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:5480::,2a0a:5487:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:54c0::,2a0a:54c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:5500::,2a0a:5507:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5540::,2a0a:5547:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:5580::,2a0a:5587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:55c0::,2a0a:55c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:5600::,2a0a:5607:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5640::,2a0a:5640:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:5680::,2a0a:5687:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:56c0::,2a0a:56c7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:5700::,2a0a:5707:ffff:ffff:ffff:ffff:ffff:ffff,IS +2a0a:5740::,2a0a:5740:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:5780::,2a0a:5780:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:57c0::,2a0a:57c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:5800::,2a0a:5807:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:5840::,2a0a:5840:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:5880::,2a0a:5887:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:58c0::,2a0a:58c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:5900::,2a0a:5907:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:5940::,2a0a:5947:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:5980::,2a0a:5987:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:59c0::,2a0a:59c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:5a00::,2a0a:5a07:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:5a40::,2a0a:5a47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:5a80::,2a0a:5a87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:5ac0::,2a0a:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:5b00::,2a0a:5b07:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0a:5b40::,2a0a:5b47:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:5b80::,2a0a:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5bc0::,2a0a:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:5c00::,2a0a:5c07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:5c40::,2a0a:5c47:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:5c80::,2a0a:5c87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:5cc0::,2a0a:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:5d00::,2a0a:5d00:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:5d40::,2a0a:5d47:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:5d80::,2a0a:5d87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:5dc0::,2a0a:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:5e00::,2a0a:5e07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:5e40::,2a0a:5e40:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:5e80::,2a0a:5e87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:5ec0::,2a0a:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:5f00::,2a0a:5f07:ffff:ffff:ffff:ffff:ffff:ffff,IE +2a0a:5f40::,2a0a:5f40:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:5f80::,2a0a:5f87:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:5fc0::,2a0a:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:6000::,2a0a:6007:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:6040::,2a0a:6047:ffff:ffff:ffff:ffff:ffff:ffff,GL 2a0a:6080::,2a0a:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:60c0::,2a0a:60c0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:6100::,2a0a:6107:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:6140::,2a0a:6147:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6180::,2a0a:6187:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:61c0::,2a0a:61c7:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:6200::,2a0a:6200:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6240::,2a0a:6247:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:6280::,2a0a:6287:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:62c0::,2a0a:62c0:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:6300::,2a0a:6307:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:6340::,2a0a:6347:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6380::,2a0a:6387:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:63c0::,2a0a:63c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:6400::,2a0a:6407:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:6440::,2a0a:6447:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:6480::,2a0a:6487:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0a:64c0::,2a0a:64c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6500::,2a0a:6507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6540::,2a0a:6547:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:6580::,2a0a:6580:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:65c0::,2a0a:65c0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6600::,2a0a:6607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6640::,2a0a:6647:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:6680::,2a0a:6680:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:66c0::,2a0a:66c0:ffff:ffff:ffff:ffff:ffff:ffff,HU 2a0a:6700::,2a0a:6707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6740::,2a0a:6747:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:6780::,2a0a:6787:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:67c0::,2a0a:67c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6800::,2a0a:6807:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:6840::,2a0a:6847:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:6880::,2a0a:6887:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:68c0::,2a0a:68c0:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6900::,2a0a:6907:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:6940::,2a0a:6947:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:6980::,2a0a:6980:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:69c0::,2a0a:69c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6a00::,2a0a:6a07:ffff:ffff:ffff:ffff:ffff:ffff,IQ +2a0a:6a40::,2a0a:6a47:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:6a80::,2a0a:6a87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6ac0::,2a0a:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6b00::,2a0a:6b07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:6b40::,2a0a:6b47:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:6b80::,2a0a:6b87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:6bc0::,2a0a:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6c00::,2a0a:6c07:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:6c40::,2a0a:6c47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:6c80::,2a0a:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6cc0::,2a0a:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:6d00::,2a0a:6d07:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:6d40::,2a0a:6d47:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:6d80::,2a0a:6d87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:6dc0::,2a0a:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:6e00::,2a0a:6e00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:6e40::,2a0a:6e47:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:6e80::,2a0a:6e87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:6ec0::,2a0a:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:6f00::,2a0a:6f07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:6f40::,2a0a:6f47:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:6f80::,2a0a:6f80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:6fc0::,2a0a:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:7000::,2a0a:7007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7040::,2a0a:7047:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7080::,2a0a:7087:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:70c0::,2a0a:70c7:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:7100::,2a0a:7107:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7140::,2a0a:7147:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7180::,2a0a:7187:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:71c0::,2a0a:71c0:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:7200::,2a0a:7207:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7240::,2a0a:7240:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:7280::,2a0a:7287:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:72c0::,2a0a:72c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:7300::,2a0a:7300:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:7340::,2a0a:7347:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:7380::,2a0a:7387:ffff:ffff:ffff:ffff:ffff:ffff,KZ +2a0a:73c0::,2a0a:73c7:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:7400::,2a0a:7407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:7440::,2a0a:7447:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7480::,2a0a:7487:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:74c0::,2a0a:74c0:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:7500::,2a0a:7500:ffff:ffff:ffff:ffff:ffff:ffff,TJ +2a0a:7540::,2a0a:7547:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:7580::,2a0a:7587:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:75c0::,2a0a:75c0:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:7600::,2a0a:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7640::,2a0a:7647:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:7680::,2a0a:7687:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:76c0::,2a0a:76c0:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7700::,2a0a:7707:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7740::,2a0a:7747:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:7780::,2a0a:7787:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:77c0::,2a0a:77c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7800::,2a0a:7807:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:7840::,2a0a:7847:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:7880::,2a0a:7887:ffff:ffff:ffff:ffff:ffff:ffff,BE +2a0a:78c0::,2a0a:78c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:7900::,2a0a:7907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:7940::,2a0a:7940:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:7980::,2a0a:7987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:79c0::,2a0a:79c7:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:7a00::,2a0a:7a04:7fff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:7a04:8000::,2a0a:7a04:8000:ffff:ffff:ffff:ffff:ffff,US 2a0a:7a04:8001::,2a0a:7a04:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:7a05::,2a0a:7a05:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:7a06::,2a0a:7a07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7a40::,2a0a:7a47:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0a:7a80::,2a0a:7a80:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:7ac0::,2a0a:7ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:7b00::,2a0a:7b07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:7b40::,2a0a:7b47:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:7b80::,2a0a:7b87:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:7bc0::,2a0a:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:7c00::,2a0a:7c07:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:7c40::,2a0a:7c40:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:7c80::,2a0a:7c80:ffff:ffff:ffff:ffff:ffff:ffff,AT +2a0a:7cc0::,2a0a:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:7d00::,2a0a:7d07:ffff:ffff:ffff:ffff:ffff:ffff,CH +2a0a:7d40::,2a0a:7d40:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:7d80::,2a0a:7d87:ffff:ffff:ffff:ffff:ffff:ffff,BY +2a0a:7dc0::,2a0a:7dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7e00::,2a0a:7e03:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:7e04::,2a0a:7e04::ffff:ffff:ffff:ffff:ffff,US 2a0a:7e04:1::,2a0a:7e07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7e40::,2a0a:7e47:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a0a:7e80::,2a0a:7e87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:7ec0::,2a0a:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:7f00::,2a0a:7f07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:7f40::,2a0a:7f47:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:7f80::,2a0a:7f87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:7fc0::,2a0a:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:8000::,2a0a:8007:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:8040::,2a0a:8047:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:80c0::,2a0a:80c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:8100::,2a0a:8107:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:8140::,2a0a:8140:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:8180::,2a0a:8187:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:81c0::,2a0a:81c7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:8200::,2a0a:8207:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:8240::,2a0a:8247:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:8280::,2a0a:8287:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:82c0::,2a0a:82c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:8300::,2a0a:8307:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8340::,2a0a:8347:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:8380::,2a0a:8387:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:83c0::,2a0a:83c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:8400::,2a0a:8407:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:8440::,2a0a:8447:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:8480::,2a0a:8480:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:84c0::,2a0a:84c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:8500::,2a0a:8507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8540::,2a0a:8547:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:8580::,2a0a:8587:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:85c0::,2a0a:85c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:8600::,2a0a:8604:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:8605::,2a0a:8605::ffff:ffff:ffff:ffff:ffff,US 2a0a:8605:1::,2a0a:8605:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:8606::,2a0a:8606:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:8607::,2a0a:8607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:8640::,2a0a:8647:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:8680::,2a0a:8687:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:86c0::,2a0a:86c7:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:8700::,2a0a:8707:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:8740::,2a0a:8747:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:8780::,2a0a:8787:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:87c0::,2a0a:87c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:8800::,2a0a:8807:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:8840::,2a0a:8847:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:8880::,2a0a:8887:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:88c0::,2a0a:88c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:8900::,2a0a:8907:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:8940::,2a0a:8947:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:8980::,2a0a:8987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:89c0::,2a0a:89c7:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a0a:8a00::,2a0a:8a00:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:8a40::,2a0a:8a40:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:8a80::,2a0a:8a87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8ac0::,2a0a:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:8b00::,2a0a:8b07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:8b40::,2a0a:8b47:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:8b80::,2a0a:8b87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8bc0::,2a0a:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:8c00::,2a0a:8c07:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:8c40::,2a0a:8c47:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:8c80::,2a0a:8c87:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:8cc0::,2a0a:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:8d00::,2a0a:8d07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:8d40::,2a0a:8d47:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:8d80::,2a0a:8d87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8dc0::,2a0a:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:8e00::,2a0a:8e01:1236:ffff:ffff:ffff:ffff:ffff,US 2a0a:8e01:1237::,2a0a:8e01:1237:ffff:ffff:ffff:ffff:ffff,CA 2a0a:8e01:1238::,2a0a:8e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:8e40::,2a0a:8e47:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:8e80::,2a0a:8e87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:8ec0::,2a0a:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:8f00::,2a0a:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:8f40::,2a0a:8f47:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:8f80::,2a0a:8f87:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:8fc0::,2a0a:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:9000::,2a0a:9007:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0a:9040::,2a0a:9047:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:9080::,2a0a:9087:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:90c0::,2a0a:90c7:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0a:9100::,2a0a:9107:ffff:ffff:ffff:ffff:ffff:ffff,LB +2a0a:9140::,2a0a:9147:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0a:9180::,2a0a:9180:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:91c0::,2a0a:91c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:9200::,2a0a:9204:ab6c:ffff:ffff:ffff:ffff:ffff,US 2a0a:9204:ab6d::,2a0a:9204:ab6d:ffff:ffff:ffff:ffff:ffff,CA 2a0a:9204:ab6e::,2a0a:9207:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9240::,2a0a:9247:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:9280::,2a0a:9287:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:92c0::,2a0a:92c7:ffff:ffff:ffff:ffff:ffff:ffff,CY 2a0a:9300::,2a0a:9307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:9340::,2a0a:9340:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0a:9380::,2a0a:9387:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:93c0::,2a0a:93c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:9400::,2a0a:9407:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:9440::,2a0a:9447:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:9480::,2a0a:9480:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0a:94c0::,2a0a:94c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:9500::,2a0a:9507:ffff:ffff:ffff:ffff:ffff:ffff,FI +2a0a:9540::,2a0a:9547:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:9580::,2a0a:9587:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:95c0::,2a0a:95c0:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0a:9600::,2a0a:9603:49cd:ffff:ffff:ffff:ffff:ffff,US 2a0a:9603:49ce::,2a0a:9603:49ce:ffff:ffff:ffff:ffff:ffff,CA 2a0a:9603:49cf::,2a0a:9607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9640::,2a0a:9647:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:9680::,2a0a:9687:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:96c0::,2a0a:96c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:9700::,2a0a:9700:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:9740::,2a0a:9740:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:9780::,2a0a:9787:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:97c0::,2a0a:97c7:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:9800::,2a0a:9807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9840::,2a0a:9847:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:9880::,2a0a:9887:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:98c0::,2a0a:98c7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:9900::,2a0a:9907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9940::,2a0a:9947:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:9980::,2a0a:9987:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:99c0::,2a0a:99c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:9a00::,2a0a:9a02:b3d1:ffff:ffff:ffff:ffff:ffff,US 2a0a:9a02:b3d2::,2a0a:9a02:b3d2:ffff:ffff:ffff:ffff:ffff,CA 2a0a:9a02:b3d3::,2a0a:9a07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9a40::,2a0a:9a47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:9a80::,2a0a:9a80:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9ac0::,2a0a:9ac7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:9b00::,2a0a:9b07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9b40::,2a0a:9b47:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:9b80::,2a0a:9b80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:9bc0::,2a0a:9bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:9c00::,2a0a:9c07:ffff:ffff:ffff:ffff:ffff:ffff,SA +2a0a:9c40::,2a0a:9c47:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:9c80::,2a0a:9c80:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0a:9cc0::,2a0a:9cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:9d00::,2a0a:9d00:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:9d40::,2a0a:9d47:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:9d80::,2a0a:9d87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9dc0::,2a0a:9dc7:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0a:9e00::,2a0a:9e07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9e40::,2a0a:9e47:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:9e80::,2a0a:9e87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:9ec0::,2a0a:9ec7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:9f00::,2a0a:9f07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:9f40::,2a0a:9f47:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:9f80::,2a0a:9f87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:9fc0::,2a0a:9fc7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:a000::,2a0a:a000:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a040::,2a0a:a047:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:a080::,2a0a:a087:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:a0c0::,2a0a:a0c7:ffff:ffff:ffff:ffff:ffff:ffff,AL 2a0a:a100::,2a0a:a100:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:a140::,2a0a:a147:ffff:ffff:ffff:ffff:ffff:ffff,IL 2a0a:a180::,2a0a:a180:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:a1c0::,2a0a:a1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:a200::,2a0a:a207:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:a280::,2a0a:a280:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a2c0::,2a0a:a2c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:a300::,2a0a:a307:ffff:ffff:ffff:ffff:ffff:ffff,RO +2a0a:a340::,2a0a:a347:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:a380::,2a0a:a387:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:a3c0::,2a0a:a3c0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:a400::,2a0a:a407:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:a440::,2a0a:a447:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:a480::,2a0a:a487:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0a:a4c0::,2a0a:a4c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:a500::,2a0a:a507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a540::,2a0a:a547:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:a580::,2a0a:a587:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:a5c0::,2a0a:a5c0:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:a600::,2a0a:a607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:a640::,2a0a:a640:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:a680::,2a0a:a687:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:a6c0::,2a0a:a6c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:a700::,2a0a:a707:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:a740::,2a0a:a747:ffff:ffff:ffff:ffff:ffff:ffff,LU 2a0a:a780::,2a0a:a787:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0a:a7c0::,2a0a:a7c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:a800::,2a0a:a807:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:a840::,2a0a:a847:ffff:ffff:ffff:ffff:ffff:ffff,MD 2a0a:a880::,2a0a:a887:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:a8c0::,2a0a:a8c0:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:a900::,2a0a:a900:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0a:a940::,2a0a:a947:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:a980::,2a0a:a987:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:a9c0::,2a0a:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:aa00::,2a0a:aa03:ffff:ffff:ffff:ffff:ffff:ffff,CY +2a0a:aa40::,2a0a:aa40:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:aa80::,2a0a:aa87:ffff:ffff:ffff:ffff:ffff:ffff,IM +2a0a:aac0::,2a0a:aac0:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:ab00::,2a0a:ab07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:ab40::,2a0a:ab47:ffff:ffff:ffff:ffff:ffff:ffff,AE 2a0a:ab80::,2a0a:ab80:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:abc0::,2a0a:abc7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:ac00::,2a0a:ac07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:ac40::,2a0a:ac40:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:ac80::,2a0a:ac87:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0a:acc0::,2a0a:acc7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:ad00::,2a0a:ad07:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:ad40::,2a0a:ad47:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:ad80::,2a0a:ad87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:adc0::,2a0a:adc7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:ae00::,2a0a:ae07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:ae40::,2a0a:ae47:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:ae80::,2a0a:ae87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:aec0::,2a0a:aec7:ffff:ffff:ffff:ffff:ffff:ffff,LI 2a0a:af00::,2a0a:af07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:af40::,2a0a:af47:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:af80::,2a0a:af87:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:afc0::,2a0a:afc7:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:b000::,2a0a:b000:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b040::,2a0a:b047:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:b080::,2a0a:b087:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:b0c0::,2a0a:b0c7:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:b100::,2a0a:b107:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b140::,2a0a:b140:ffff:ffff:ffff:ffff:ffff:ffff,MK 2a0a:b180::,2a0a:b187:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:b1c0::,2a0a:b1c7:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:b200::,2a0a:b207:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:b240::,2a0a:b247:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0a:b280::,2a0a:b287:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0a:b2c0::,2a0a:b2c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:b300::,2a0a:b307:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0a:b340::,2a0a:b347:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0a:b380::,2a0a:b387:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b3c0::,2a0a:b3c7:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:b400::,2a0a:b407:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:b440::,2a0a:b447:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:b480::,2a0a:b487:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b4c0::,2a0a:b4c7:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:b500::,2a0a:b507:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:b540::,2a0a:b540:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:b580::,2a0a:b587:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0a:b5c0::,2a0a:b5c7:ffff:ffff:ffff:ffff:ffff:ffff,CY 2a0a:b600::,2a0a:b607:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:b640::,2a0a:b640::ffff:ffff:ffff:ffff:ffff,GB +2a0a:b640:1::,2a0a:b640:1:ffff:ffff:ffff:ffff:ffff,SG +2a0a:b640:2::,2a0a:b647:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0a:b680::,2a0a:b687:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:b6c0::,2a0a:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:b700::,2a0a:b707:ffff:ffff:ffff:ffff:ffff:ffff,GE +2a0a:b740::,2a0a:b747:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:b780::,2a0a:b787:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0a:b7c0::,2a0a:b7c7:ffff:ffff:ffff:ffff:ffff:ffff,FI 2a0a:b800::,2a0a:b807:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b840::,2a0a:b847:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0a:b880::,2a0a:b887:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0a:b8c0::,2a0a:b8c0:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0a:b900::,2a0a:b907:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b940::,2a0a:b947:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:b980::,2a0a:b980:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:b9c0::,2a0a:b9c7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:ba00::,2a0a:ba07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:ba40::,2a0a:ba47:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0a:ba80::,2a0a:ba87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:bac0::,2a0a:bac7:ffff:ffff:ffff:ffff:ffff:ffff,AL 2a0a:bb00::,2a0a:bb07:ffff:ffff:ffff:ffff:ffff:ffff,LI +2a0a:bb40::,2a0a:bb47:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0a:bb80::,2a0a:bb87:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0a:bbc0::,2a0a:bbc7:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:bc00::,2a0a:bc07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0a:bc40::,2a0a:bc40:ffff:ffff:ffff:ffff:ffff:ffff,IR 2a0a:bc80::,2a0a:bc87:ffff:ffff:ffff:ffff:ffff:ffff,UA +2a0a:bcc0::,2a0a:bcc7:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0a:bd00::,2a0a:bd00:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:bd40::,2a0a:bd47:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0a:bd80::,2a0a:bd80:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0a:bdc0::,2a0a:bdc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0a:be00::,2a0a:be07:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0a:be40::,2a0a:be47:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:be80::,2a0a:be87:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0a:bec0::,2a0a:bec7:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0a:bf00::,2a0a:bf07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0a:bf40::,2a0a:bf47:ffff:ffff:ffff:ffff:ffff:ffff,IS 2a0a:bf80::,2a0a:bf87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0a:c000::,2a0a:c007:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0a:c080::,2a0a:c087:ffff:ffff:ffff:ffff:ffff:ffff,SE @@ -33163,7 +34482,7 @@ 2a0b:380::,2a0b:387:ffff:ffff:ffff:ffff:ffff:ffff,DK 2a0b:400::,2a0b:407:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0b:480::,2a0b:487:ffff:ffff:ffff:ffff:ffff:ffff,UA -2a0b:500::,2a0b:507:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:500::,2a0b:507:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0b:580::,2a0b:580:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:600::,2a0b:600:ffff:ffff:ffff:ffff:ffff:ffff,NO 2a0b:680::,2a0b:687:ffff:ffff:ffff:ffff:ffff:ffff,SE @@ -33255,7 +34574,7 @@ 2a0b:3180::,2a0b:3187:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:3200::,2a0b:3207:ffff:ffff:ffff:ffff:ffff:ffff,FR 2a0b:3280::,2a0b:3280:ffff:ffff:ffff:ffff:ffff:ffff,GB -2a0b:3300::,2a0b:3307:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3300::,2a0b:3307:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0b:3380::,2a0b:3387:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0b:3400::,2a0b:3407:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:3480::,2a0b:3487:ffff:ffff:ffff:ffff:ffff:ffff,FI @@ -33263,7 +34582,7 @@ 2a0b:3580::,2a0b:3587:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0b:3600::,2a0b:3607:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0b:3680::,2a0b:3687:ffff:ffff:ffff:ffff:ffff:ffff,BG -2a0b:3700::,2a0b:3707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:3700::,2a0b:3707:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0b:3780::,2a0b:3780:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:3800::,2a0b:3807:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:3880::,2a0b:3880:ffff:ffff:ffff:ffff:ffff:ffff,GB @@ -33368,7 +34687,8 @@ 2a0b:6a00::,2a0b:6a07:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:6a80::,2a0b:6a87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0b:6b00::,2a0b:6b07:ffff:ffff:ffff:ffff:ffff:ffff,IR -2a0b:6b80::,2a0b:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:6b80::,2a0b:6b83:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:6b84::,2a0b:6b87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:6c00::,2a0b:6c07:ffff:ffff:ffff:ffff:ffff:ffff,EE 2a0b:6c80::,2a0b:6c87:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:6d00::,2a0b:6d07:ffff:ffff:ffff:ffff:ffff:ffff,SE @@ -33423,7 +34743,7 @@ 2a0b:8580::,2a0b:8587:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0b:8600::,2a0b:8607:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a0b:8680::,2a0b:8687:ffff:ffff:ffff:ffff:ffff:ffff,BY -2a0b:8700::,2a0b:8707:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:8700::,2a0b:8707:ffff:ffff:ffff:ffff:ffff:ffff,US 2a0b:8780::,2a0b:8787:ffff:ffff:ffff:ffff:ffff:ffff,BE 2a0b:8800::,2a0b:8807:ffff:ffff:ffff:ffff:ffff:ffff,RO 2a0b:8880::,2a0b:8887:ffff:ffff:ffff:ffff:ffff:ffff,FI @@ -33546,7 +34866,7 @@ 2a0b:c300::,2a0b:c307:ffff:ffff:ffff:ffff:ffff:ffff,SI 2a0b:c380::,2a0b:c387:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:c400::,2a0b:c407:ffff:ffff:ffff:ffff:ffff:ffff,CH -2a0b:c480::,2a0b:c480:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:c480::,2a0b:c487:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:c500::,2a0b:c500:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:c580::,2a0b:c587:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:c600::,2a0b:c607:ffff:ffff:ffff:ffff:ffff:ffff,IT @@ -33568,57 +34888,120 @@ 2a0b:ce00::,2a0b:ce07:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:ce80::,2a0b:ce87:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:cf00::,2a0b:cf07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:cf80::,2a0b:cf87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:d000::,2a0b:d007:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d080::,2a0b:d080:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0b:d100::,2a0b:d107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:d180::,2a0b:d180:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0b:d200::,2a0b:d207:ffff:ffff:ffff:ffff:ffff:ffff,IL +2a0b:d280::,2a0b:d287:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:d300::,2a0b:d307:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:d380::,2a0b:d387:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:d400::,2a0b:d407:ffff:ffff:ffff:ffff:ffff:ffff,IR +2a0b:d480::,2a0b:d487:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:d500::,2a0b:d507:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:d580::,2a0b:d580:ffff:ffff:ffff:ffff:ffff:ffff,OM 2a0b:d600::,2a0b:d607:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d680::,2a0b:d680:ffff:ffff:ffff:ffff:ffff:ffff,IT 2a0b:d700::,2a0b:d707:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:d780::,2a0b:d787:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0b:d800::,2a0b:d807:ffff:ffff:ffff:ffff:ffff:ffff,TR +2a0b:d880::,2a0b:d887:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0b:d900::,2a0b:d907:ffff:ffff:ffff:ffff:ffff:ffff,HK +2a0b:d980::,2a0b:d987:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:da00::,2a0b:da07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:da80::,2a0b:da87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:db00::,2a0b:db07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:db80::,2a0b:db87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:dc00::,2a0b:dc07:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:dc80::,2a0b:dc87:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:dd00::,2a0b:dd07:ffff:ffff:ffff:ffff:ffff:ffff,MD +2a0b:dd80::,2a0b:dd87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:de00::,2a0b:de07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:de80::,2a0b:de87:ffff:ffff:ffff:ffff:ffff:ffff,AT 2a0b:df00::,2a0b:df00:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:df80::,2a0b:df87:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:e000::,2a0b:e007:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e080::,2a0b:e081:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0b:e100::,2a0b:e107:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e180::,2a0b:e187:ffff:ffff:ffff:ffff:ffff:ffff,CZ 2a0b:e200::,2a0b:e207:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:e280::,2a0b:e287:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:e300::,2a0b:e300:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:e380::,2a0b:e387:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:e400::,2a0b:e407:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:e480::,2a0b:e487:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:e500::,2a0b:e501:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e580::,2a0b:e587:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:e600::,2a0b:e607:ffff:ffff:ffff:ffff:ffff:ffff,HR +2a0b:e680::,2a0b:e687:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0b:e700::,2a0b:e707:ffff:ffff:ffff:ffff:ffff:ffff,PL +2a0b:e780::,2a0b:e787:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0b:e800::,2a0b:e807:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:e880::,2a0b:e887:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:e900::,2a0b:e907:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:e980::,2a0b:e987:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:ea00::,2a0b:ea00:ffff:ffff:ffff:ffff:ffff:ffff,IT +2a0b:ea80::,2a0b:ea80:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0b:eb00::,2a0b:eb07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:eb80::,2a0b:eb87:ffff:ffff:ffff:ffff:ffff:ffff,UA 2a0b:ec00::,2a0b:ec07:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:ec80::,2a0b:ec87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:ed00::,2a0b:ed07:ffff:ffff:ffff:ffff:ffff:ffff,RU +2a0b:ed80::,2a0b:ed87:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:ee00::,2a0b:ee07:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:ee80::,2a0b:ee87:ffff:ffff:ffff:ffff:ffff:ffff,CH 2a0b:ef00::,2a0b:ef07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:ef80::,2a0b:ef87:ffff:ffff:ffff:ffff:ffff:ffff,TR 2a0b:f000::,2a0b:f000:ffff:ffff:ffff:ffff:ffff:ffff,US +2a0b:f080::,2a0b:f080:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:f100::,2a0b:f107:ffff:ffff:ffff:ffff:ffff:ffff,SK +2a0b:f180::,2a0b:f180:ffff:ffff:ffff:ffff:ffff:ffff,GB 2a0b:f200::,2a0b:f200:ffff:ffff:ffff:ffff:ffff:ffff,NO +2a0b:f280::,2a0b:f287:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:f300::,2a0b:f307:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:f380::,2a0b:f387:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:f400::,2a0b:f400:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:f480::,2a0b:f480:ffff:ffff:ffff:ffff:ffff:ffff,BG 2a0b:f500::,2a0b:f507:ffff:ffff:ffff:ffff:ffff:ffff,CZ +2a0b:f580::,2a0b:f587:ffff:ffff:ffff:ffff:ffff:ffff,GE 2a0b:f600::,2a0b:f607:ffff:ffff:ffff:ffff:ffff:ffff,NL +2a0b:f680::,2a0b:f687:ffff:ffff:ffff:ffff:ffff:ffff,SK 2a0b:f700::,2a0b:f707:ffff:ffff:ffff:ffff:ffff:ffff,DK +2a0b:f780::,2a0b:f787:ffff:ffff:ffff:ffff:ffff:ffff,PL 2a0b:f800::,2a0b:f800:ffff:ffff:ffff:ffff:ffff:ffff,BG +2a0b:f880::,2a0b:f887:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:f900::,2a0b:f907:ffff:ffff:ffff:ffff:ffff:ffff,SE +2a0b:f980::,2a0b:f987:ffff:ffff:ffff:ffff:ffff:ffff,DE 2a0b:fa00::,2a0b:fa07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:fa80::,2a0b:fa87:ffff:ffff:ffff:ffff:ffff:ffff,ES 2a0b:fb00::,2a0b:fb07:ffff:ffff:ffff:ffff:ffff:ffff,DE +2a0b:fb80::,2a0b:fb87:ffff:ffff:ffff:ffff:ffff:ffff,NL 2a0b:fc00::,2a0b:fc07:ffff:ffff:ffff:ffff:ffff:ffff,PT +2a0b:fc80::,2a0b:fc87:ffff:ffff:ffff:ffff:ffff:ffff,LB 2a0b:fd00::,2a0b:fd00:ffff:ffff:ffff:ffff:ffff:ffff,FR +2a0b:fd80::,2a0b:fd87:ffff:ffff:ffff:ffff:ffff:ffff,SE 2a0b:fe00::,2a0b:fe07:ffff:ffff:ffff:ffff:ffff:ffff,ES +2a0b:fe80::,2a0b:fe87:ffff:ffff:ffff:ffff:ffff:ffff,RU 2a0b:ff00::,2a0b:ff07:ffff:ffff:ffff:ffff:ffff:ffff,GB +2a0b:ff80::,2a0b:ff87:ffff:ffff:ffff:ffff:ffff:ffff,RU 2c0e::,2c0e:fff:ffff:ffff:ffff:ffff:ffff:ffff,EG 2c0e:2000::,2c0e:2fff:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0e:4000::,2c0e:40ff:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f000::,2c0f:f000:ffff:ffff:ffff:ffff:ffff:ffff,DZ +2c0f:f008::,2c0f:f008:ffff:ffff:ffff:ffff:ffff:ffff,KE +2c0f:f010::,2c0f:f010:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f018::,2c0f:f018:ffff:ffff:ffff:ffff:ffff:ffff,BJ +2c0f:f020::,2c0f:f020:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f028::,2c0f:f028:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f030::,2c0f:f030:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f038::,2c0f:f038:ffff:ffff:ffff:ffff:ffff:ffff,GA +2c0f:f040::,2c0f:f040:ffff:ffff:ffff:ffff:ffff:ffff,SN +2c0f:f048::,2c0f:f048:ffff:ffff:ffff:ffff:ffff:ffff,CG +2c0f:f050::,2c0f:f050:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f058::,2c0f:f058:ffff:ffff:ffff:ffff:ffff:ffff,TZ +2c0f:f060::,2c0f:f060:ffff:ffff:ffff:ffff:ffff:ffff,AO +2c0f:f068::,2c0f:f068:ffff:ffff:ffff:ffff:ffff:ffff,SO 2c0f:f200::,2c0f:f200:ffff:ffff:ffff:ffff:ffff:ffff,UG 2c0f:f208::,2c0f:f208:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f210::,2c0f:f210:ffff:ffff:ffff:ffff:ffff:ffff,ZA @@ -33682,6 +35065,7 @@ 2c0f:f3e0::,2c0f:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,GA 2c0f:f3e8::,2c0f:f3e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f3f0::,2c0f:f3f0:ffff:ffff:ffff:ffff:ffff:ffff,ZA +2c0f:f3f8::,2c0f:f3f8:ffff:ffff:ffff:ffff:ffff:ffff,KE 2c0f:f400::,2c0f:f400:ffff:ffff:ffff:ffff:ffff:ffff,ZA 2c0f:f408::,2c0f:f408:ffff:ffff:ffff:ffff:ffff:ffff,KE 2c0f:f410::,2c0f:f410:ffff:ffff:ffff:ffff:ffff:ffff,NG diff --git a/src/ext/byteorder.h b/src/ext/byteorder.h new file mode 100644 index 0000000000..c8ba52184b --- /dev/null +++ b/src/ext/byteorder.h @@ -0,0 +1,67 @@ +/* <MIT License> + Copyright (c) 2013-2014 Marek Majkowski <marek@popcount.org> + + 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. + </MIT License> + + Original location: + https://github.com/majek/csiphash/ + + Solution inspired by code from: + Samuel Neves (supercop/crypto_auth/siphash24/little) + djb (supercop/crypto_auth/siphash24/little2) + Jean-Philippe Aumasson (https://131002.net/siphash/siphash24.c) +*/ + +/* This code is extracted from csiphash.h */ + +#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ + __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ +# define _le64toh(x) ((uint64_t)(x)) +#elif defined(_WIN32) +/* Windows is always little endian, unless you're on xbox360 + http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx */ +# define _le64toh(x) ((uint64_t)(x)) +#elif defined(__APPLE__) +# include <libkern/OSByteOrder.h> +# define _le64toh(x) OSSwapLittleToHostInt64(x) +#elif defined(sun) || defined(__sun) +# include <sys/byteorder.h> +# define _le64toh(x) LE_64(x) + +#else + +/* See: http://sourceforge.net/p/predef/wiki/Endianness/ */ +# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) +# include <sys/endian.h> +# else +# include <endian.h> +# endif +# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ + __BYTE_ORDER == __LITTLE_ENDIAN +# define _le64toh(x) ((uint64_t)(x)) +# else +# if defined(OpenBSD) +# define _le64toh(x) letoh64(x) +# else +# define _le64toh(x) le64toh(x) +# endif +# endif + +#endif diff --git a/src/ext/csiphash.c b/src/ext/csiphash.c index 8348c66048..1029bbbad3 100644 --- a/src/ext/csiphash.c +++ b/src/ext/csiphash.c @@ -35,41 +35,7 @@ #include "util.h" /* for memcpy */ #include <string.h> - -#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) && \ - __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ -# define _le64toh(x) ((uint64_t)(x)) -#elif defined(_WIN32) -/* Windows is always little endian, unless you're on xbox360 - http://msdn.microsoft.com/en-us/library/b0084kay(v=vs.80).aspx */ -# define _le64toh(x) ((uint64_t)(x)) -#elif defined(__APPLE__) -# include <libkern/OSByteOrder.h> -# define _le64toh(x) OSSwapLittleToHostInt64(x) -#elif defined(sun) || defined(__sun) -# include <sys/byteorder.h> -# define _le64toh(x) LE_64(x) - -#else - -/* See: http://sourceforge.net/p/predef/wiki/Endianness/ */ -# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) -# include <sys/endian.h> -# else -# include <endian.h> -# endif -# if defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \ - __BYTE_ORDER == __LITTLE_ENDIAN -# define _le64toh(x) ((uint64_t)(x)) -# else -# if defined(OpenBSD) -# define _le64toh(x) letoh64(x) -# else -# define _le64toh(x) le64toh(x) -# endif -# endif - -#endif +#include "byteorder.h" #define ROTATE(x, b) (uint64_t)( ((x) << (b)) | ( (x) >> (64 - (b))) ) diff --git a/src/ext/ed25519/donna/ed25519-hash-custom.h b/src/ext/ed25519/donna/ed25519-hash-custom.h index 7dc249129d..609451abd5 100644 --- a/src/ext/ed25519/donna/ed25519-hash-custom.h +++ b/src/ext/ed25519/donna/ed25519-hash-custom.h @@ -9,3 +9,34 @@ void ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen); */ +#include "crypto.h" + +typedef struct ed25519_hash_context { + crypto_digest_t *ctx; +} ed25519_hash_context; + + +static void +ed25519_hash_init(ed25519_hash_context *ctx) +{ + ctx->ctx = crypto_digest512_new(DIGEST_SHA512); +} +static void +ed25519_hash_update(ed25519_hash_context *ctx, const uint8_t *in, size_t inlen) +{ + crypto_digest_add_bytes(ctx->ctx, (const char *)in, inlen); +} +static void +ed25519_hash_final(ed25519_hash_context *ctx, uint8_t *hash) +{ + crypto_digest_get_digest(ctx->ctx, (char *)hash, DIGEST512_LEN); + crypto_digest_free(ctx->ctx); + ctx->ctx = NULL; +} +static void +ed25519_hash(uint8_t *hash, const uint8_t *in, size_t inlen) +{ + crypto_digest512((char *)hash, (const char *)in, inlen, + DIGEST_SHA512); +} + diff --git a/src/ext/ed25519/ref10/crypto_hash_sha512.h b/src/ext/ed25519/ref10/crypto_hash_sha512.h index 0278571522..5dad935c79 100644 --- a/src/ext/ed25519/ref10/crypto_hash_sha512.h +++ b/src/ext/ed25519/ref10/crypto_hash_sha512.h @@ -1,30 +1,32 @@ /* Added for Tor. */ -#include <openssl/sha.h> +#include "crypto.h" /* Set 'out' to the 512-bit SHA512 hash of the 'len'-byte string in 'inp' */ #define crypto_hash_sha512(out, inp, len) \ - SHA512((inp), (len), (out)) + crypto_digest512((char *)(out), (const char *)(inp), (len), DIGEST_SHA512) /* Set 'out' to the 512-bit SHA512 hash of the 'len1'-byte string in 'inp1', * concatenated with the 'len2'-byte string in 'inp2'. */ #define crypto_hash_sha512_2(out, inp1, len1, inp2, len2) \ do { \ - SHA512_CTX sha_ctx_; \ - SHA512_Init(&sha_ctx_); \ - SHA512_Update(&sha_ctx_, (inp1), (len1)); \ - SHA512_Update(&sha_ctx_, (inp2), (len2)); \ - SHA512_Final((out), &sha_ctx_); \ - } while(0) + crypto_digest_t *sha_ctx_; \ + sha_ctx_ = crypto_digest512_new(DIGEST_SHA512); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp1), (len1)); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp2), (len2)); \ + crypto_digest_get_digest(sha_ctx_, (char *)out, DIGEST512_LEN); \ + crypto_digest_free(sha_ctx_); \ + } while (0) /* Set 'out' to the 512-bit SHA512 hash of the 'len1'-byte string in 'inp1', * concatenated with the 'len2'-byte string in 'inp2', concatenated with * the 'len3'-byte string in 'len3'. */ #define crypto_hash_sha512_3(out, inp1, len1, inp2, len2, inp3, len3) \ do { \ - SHA512_CTX sha_ctx_; \ - SHA512_Init(&sha_ctx_); \ - SHA512_Update(&sha_ctx_, (inp1), (len1)); \ - SHA512_Update(&sha_ctx_, (inp2), (len2)); \ - SHA512_Update(&sha_ctx_, (inp3), (len3)); \ - SHA512_Final((out), &sha_ctx_); \ + crypto_digest_t *sha_ctx_; \ + sha_ctx_ = crypto_digest512_new(DIGEST_SHA512); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp1), (len1)); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp2), (len2)); \ + crypto_digest_add_bytes(sha_ctx_, (const char *)(inp3), (len3)); \ + crypto_digest_get_digest(sha_ctx_, (char *)out, DIGEST512_LEN); \ + crypto_digest_free(sha_ctx_); \ } while(0) diff --git a/src/ext/ht.h b/src/ext/ht.h index a441d0b685..caa420e9b5 100644 --- a/src/ext/ht.h +++ b/src/ext/ht.h @@ -1,6 +1,6 @@ /* Copyright (c) 2002, Christopher Clark. * Copyright (c) 2005-2006, Nick Mathewson. - * Copyright (c) 2007-2015, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See license at end. */ /* Based on ideas by Christopher Clark and interfaces from Niels Provos. */ diff --git a/src/ext/include.am b/src/ext/include.am index f00f3e031e..7ec2e43312 100644 --- a/src/ext/include.am +++ b/src/ext/include.am @@ -5,6 +5,7 @@ EXTRA_DIST += src/ext/README EXTHEADERS = \ src/ext/ht.h \ + src/ext/byteorder.h \ src/ext/tinytest.h \ src/ext/tor_readpassphrase.h \ src/ext/strlcat.c \ @@ -100,6 +101,7 @@ noinst_LIBRARIES += $(LIBED25519_REF10) src_ext_ed25519_donna_libed25519_donna_a_CFLAGS=\ @CFLAGS_CONSTTIME@ \ -DED25519_CUSTOMRANDOM \ + -DED25519_CUSTOMHASH \ -DED25519_SUFFIX=_donna src_ext_ed25519_donna_libed25519_donna_a_SOURCES= \ diff --git a/src/ext/keccak-tiny/keccak-tiny-unrolled.c b/src/ext/keccak-tiny/keccak-tiny-unrolled.c index d1342c3601..d8d7fe335a 100644 --- a/src/ext/keccak-tiny/keccak-tiny-unrolled.c +++ b/src/ext/keccak-tiny/keccak-tiny-unrolled.c @@ -10,28 +10,21 @@ #include <string.h> #include "crypto.h" +#include "byteorder.h" /******** Endianness conversion helpers ********/ static inline uint64_t loadu64le(const unsigned char *x) { - uint64_t r = 0; - size_t i; - - for (i = 0; i < 8; ++i) { - r |= (uint64_t)x[i] << 8 * i; - } - return r; + uint64_t r; + memcpy(&r, x, sizeof(r)); + return _le64toh(r); } static inline void storeu64le(uint8_t *x, uint64_t u) { - size_t i; - - for(i=0; i<8; ++i) { - x[i] = u; - u >>= 8; - } + uint64_t val = _le64toh(u); + memcpy(x, &val, sizeof(u)); } /******** The Keccak-f[1600] permutation ********/ diff --git a/src/ext/trunnel/trunnel-impl.h b/src/ext/trunnel/trunnel-impl.h index bc805851b1..85c847b3fd 100644 --- a/src/ext/trunnel/trunnel-impl.h +++ b/src/ext/trunnel/trunnel-impl.h @@ -5,7 +5,7 @@ /* trunnel-impl.h -- Implementation helpers for trunnel, included by * generated trunnel files * - * Copyright 2014-2015, The Tor Project, Inc. + * Copyright 2014-2017, The Tor Project, Inc. * See license at the end of this file for copying information. */ diff --git a/src/ext/trunnel/trunnel.c b/src/ext/trunnel/trunnel.c index 8f72351277..6a42417241 100644 --- a/src/ext/trunnel/trunnel.c +++ b/src/ext/trunnel/trunnel.c @@ -4,7 +4,7 @@ */ /* trunnel.c -- Helper functions to implement trunnel. * - * Copyright 2014-2015, The Tor Project, Inc. + * Copyright 2014-2017, The Tor Project, Inc. * See license at the end of this file for copying information. * * See trunnel-impl.h for documentation of these functions. @@ -31,7 +31,7 @@ # define IS_LITTLE_ENDIAN # endif #else -# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(OpenBSD) +# if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) # include <sys/endian.h> # else # include <endian.h> diff --git a/src/ext/trunnel/trunnel.h b/src/ext/trunnel/trunnel.h index 85bbcc5451..dd78553c77 100644 --- a/src/ext/trunnel/trunnel.h +++ b/src/ext/trunnel/trunnel.h @@ -5,7 +5,7 @@ /* trunnel.h -- Public declarations for trunnel, to be included * in trunnel header files. - * Copyright 2014-2015, The Tor Project, Inc. + * Copyright 2014-2017, The Tor Project, Inc. * See license at the end of this file for copying information. */ diff --git a/src/include.am b/src/include.am index d12684e187..f78853f50f 100644 --- a/src/include.am +++ b/src/include.am @@ -7,3 +7,4 @@ include src/tools/include.am include src/win32/include.am include src/config/include.am include src/test/fuzz/include.am +include src/trace/include.am diff --git a/src/or/addressmap.c b/src/or/addressmap.c index 85a6434f4a..c92af38254 100644 --- a/src/or/addressmap.c +++ b/src/or/addressmap.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/addressmap.h b/src/or/addressmap.h index 67648d0518..80f453b4c1 100644 --- a/src/or/addressmap.h +++ b/src/or/addressmap.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_ADDRESSMAP_H diff --git a/src/or/bridges.c b/src/or/bridges.c index 8b37f412ea..ef0638c0a7 100644 --- a/src/or/bridges.c +++ b/src/or/bridges.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -199,6 +199,33 @@ get_configured_bridge_by_addr_port_digest(const tor_addr_t *addr, return NULL; } +/** + * As get_configured_bridge_by_addr_port, but require that the + * address match <b>addr</b>:<b>port</b>, and that the ID digest match + * <b>digest</b>. (The other function will ignore the address if the + * digest matches.) + */ +bridge_info_t * +get_configured_bridge_by_exact_addr_port_digest(const tor_addr_t *addr, + uint16_t port, + const char *digest) +{ + if (!bridge_list) + return NULL; + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) { + if (!tor_addr_compare(&bridge->addr, addr, CMP_EXACT) && + bridge->port == port) { + + if (digest && tor_memeq(bridge->identity, digest, DIGEST_LEN)) + return bridge; + else if (!digest || tor_digest_is_zero(bridge->identity)) + return bridge; + } + + } SMARTLIST_FOREACH_END(bridge); + return NULL; +} + /** If we have a bridge configured whose digest matches <b>digest</b>, or a * bridge with no known digest whose address matches <b>addr</b>:<b>port</b>, * return 1. Else return 0. If <b>digest</b> is NULL, check for @@ -270,7 +297,7 @@ learned_router_identity(const tor_addr_t *addr, uint16_t port, (void)ed_id; int learned = 0; bridge_info_t *bridge = - get_configured_bridge_by_addr_port_digest(addr, port, digest); + get_configured_bridge_by_exact_addr_port_digest(addr, port, digest); if (bridge && tor_digest_is_zero(bridge->identity)) { memcpy(bridge->identity, digest, DIGEST_LEN); learned = 1; @@ -543,12 +570,18 @@ launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge) return; } - directory_initiate_command(&bridge->addr, bridge->port, - NULL, 0, /*no dirport*/ - bridge->identity, - DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_BRIDGE, - DIRIND_ONEHOP, "authority.z", NULL, 0, 0); + tor_addr_port_t bridge_addrport; + memcpy(&bridge_addrport.addr, &bridge->addr, sizeof(tor_addr_t)); + bridge_addrport.port = bridge->port; + + directory_request_t *req = + directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC); + directory_request_set_or_addr_port(req, &bridge_addrport); + directory_request_set_directory_id_digest(req, bridge->identity); + directory_request_set_router_purpose(req, ROUTER_PURPOSE_BRIDGE); + directory_request_set_resource(req, "authority.z"); + directory_initiate_request(req); + directory_request_free(req); } /** Fetching the bridge descriptor from the bridge authority returned a diff --git a/src/or/bridges.h b/src/or/bridges.h index de23fe6eeb..3bfc782f9a 100644 --- a/src/or/bridges.h +++ b/src/or/bridges.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -27,6 +27,10 @@ bridge_info_t *get_configured_bridge_by_addr_port_digest( const tor_addr_t *addr, uint16_t port, const char *digest); +bridge_info_t *get_configured_bridge_by_exact_addr_port_digest( + const tor_addr_t *addr, + uint16_t port, + const char *digest); int addr_is_a_configured_bridge(const tor_addr_t *addr, uint16_t port, const char *digest); diff --git a/src/or/buffers.c b/src/or/buffers.c index 6111820701..4f22935d26 100644 --- a/src/or/buffers.c +++ b/src/or/buffers.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -83,7 +83,11 @@ static int parse_socks_client(const uint8_t *data, size_t datalen, #define CHUNK_HEADER_LEN STRUCT_OFFSET(chunk_t, mem[0]) /* We leave this many NUL bytes at the end of the buffer. */ +#ifdef DISABLE_MEMORY_SENTINELS +#define SENTINEL_LEN 0 +#else #define SENTINEL_LEN 4 +#endif /* Header size plus NUL bytes at the end */ #define CHUNK_OVERHEAD (CHUNK_HEADER_LEN + SENTINEL_LEN) @@ -97,18 +101,22 @@ static int parse_socks_client(const uint8_t *data, size_t datalen, #define DEBUG_SENTINEL -#ifdef DEBUG_SENTINEL +#if defined(DEBUG_SENTINEL) && !defined(DISABLE_MEMORY_SENTINELS) #define DBG_S(s) s #else #define DBG_S(s) (void)0 #endif +#ifdef DISABLE_MEMORY_SENTINELS +#define CHUNK_SET_SENTINEL(chunk, alloclen) STMT_NIL +#else #define CHUNK_SET_SENTINEL(chunk, alloclen) do { \ uint8_t *a = (uint8_t*) &(chunk)->mem[(chunk)->memlen]; \ DBG_S(uint8_t *b = &((uint8_t*)(chunk))[(alloclen)-SENTINEL_LEN]); \ DBG_S(tor_assert(a == b)); \ memset(a,0,SENTINEL_LEN); \ } while (0) +#endif /** Return the next character in <b>chunk</b> onto which data can be appended. * If the chunk is full, this might be off the end of chunk->mem. */ @@ -610,6 +618,11 @@ read_to_buf(tor_socket_t s, size_t at_most, buf_t *buf, int *reached_eof, tor_assert(reached_eof); tor_assert(SOCKET_OK(s)); + if (BUG(buf->datalen >= INT_MAX)) + return -1; + if (BUG(buf->datalen >= INT_MAX - at_most)) + return -1; + while (at_most > total_read) { size_t readlen = at_most - total_read; chunk_t *chunk; @@ -667,6 +680,11 @@ read_to_buf_tls(tor_tls_t *tls, size_t at_most, buf_t *buf) check(); + if (BUG(buf->datalen >= INT_MAX)) + return -1; + if (BUG(buf->datalen >= INT_MAX - at_most)) + return -1; + while (at_most > total_read) { size_t readlen = at_most - total_read; chunk_t *chunk; @@ -861,6 +879,11 @@ write_to_buf(const char *string, size_t string_len, buf_t *buf) return (int)buf->datalen; check(); + if (BUG(buf->datalen >= INT_MAX)) + return -1; + if (BUG(buf->datalen >= INT_MAX - string_len)) + return -1; + while (string_len) { size_t copy; if (!buf->tail || !CHUNK_REMAINING_CAPACITY(buf->tail)) @@ -1010,6 +1033,12 @@ move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen) /* We can do way better here, but this doesn't turn up in any profiles. */ char b[4096]; size_t cp, len; + + if (BUG(buf_out->datalen >= INT_MAX)) + return -1; + if (BUG(buf_out->datalen >= INT_MAX - *buf_flushlen)) + return -1; + len = *buf_flushlen; if (len > buf_in->datalen) len = buf_in->datalen; @@ -2059,13 +2088,13 @@ fetch_from_buf_line(buf_t *buf, char *data_out, size_t *data_len) } /** Compress on uncompress the <b>data_len</b> bytes in <b>data</b> using the - * zlib state <b>state</b>, appending the result to <b>buf</b>. If + * compression state <b>state</b>, appending the result to <b>buf</b>. If * <b>done</b> is true, flush the data in the state and finish the * compression/uncompression. Return -1 on failure, 0 on success. */ int -write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, - const char *data, size_t data_len, - int done) +write_to_buf_compress(buf_t *buf, tor_compress_state_t *state, + const char *data, size_t data_len, + int done) { char *next; size_t old_avail, avail; @@ -2079,20 +2108,22 @@ write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, } next = CHUNK_WRITE_PTR(buf->tail); avail = old_avail = CHUNK_REMAINING_CAPACITY(buf->tail); - switch (tor_zlib_process(state, &next, &avail, &data, &data_len, done)) { - case TOR_ZLIB_DONE: + switch (tor_compress_process(state, &next, &avail, + &data, &data_len, done)) { + case TOR_COMPRESS_DONE: over = 1; break; - case TOR_ZLIB_ERR: + case TOR_COMPRESS_ERROR: return -1; - case TOR_ZLIB_OK: + case TOR_COMPRESS_OK: if (data_len == 0) over = 1; break; - case TOR_ZLIB_BUF_FULL: + case TOR_COMPRESS_BUFFER_FULL: if (avail) { - /* Zlib says we need more room (ZLIB_BUF_FULL). Start a new chunk - * automatically, whether were going to or not. */ + /* The compression module says we need more room + * (TOR_COMPRESS_BUFFER_FULL). Start a new chunk automatically, + * whether were going to or not. */ need_new_chunk = 1; } break; diff --git a/src/or/buffers.h b/src/or/buffers.h index bb53b3bbff..23b58a571a 100644 --- a/src/or/buffers.h +++ b/src/or/buffers.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -36,8 +36,8 @@ int flush_buf(tor_socket_t s, buf_t *buf, size_t sz, size_t *buf_flushlen); int flush_buf_tls(tor_tls_t *tls, buf_t *buf, size_t sz, size_t *buf_flushlen); int write_to_buf(const char *string, size_t string_len, buf_t *buf); -int write_to_buf_zlib(buf_t *buf, tor_zlib_state_t *state, - const char *data, size_t data_len, int done); +int write_to_buf_compress(buf_t *buf, tor_compress_state_t *state, + const char *data, size_t data_len, int done); int move_buf_to_buf(buf_t *buf_out, buf_t *buf_in, size_t *buf_flushlen); int fetch_from_buf(char *string, size_t string_len, buf_t *buf); int fetch_var_cell_from_buf(buf_t *buf, var_cell_t **out, int linkproto); diff --git a/src/or/channel.c b/src/or/channel.c index a806c4c93b..599b00aa6b 100644 --- a/src/or/channel.c +++ b/src/or/channel.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/channel.h b/src/or/channel.h index f03fabb7c2..bfcdafb276 100644 --- a/src/or/channel.h +++ b/src/or/channel.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -300,8 +300,8 @@ struct channel_s { unsigned int is_bad_for_new_circs:1; /** True iff we have decided that the other end of this connection - * is a client. Channels with this flag set should never be used - * to satisfy an EXTEND request. */ + * is a client or bridge relay. Connections with this flag set should never + * be used to satisfy an EXTEND request. */ unsigned int is_client:1; /** Set if the channel was initiated remotely (came from a listener) */ diff --git a/src/or/channeltls.c b/src/or/channeltls.c index 7f5667b918..4cdd554174 100644 --- a/src/or/channeltls.c +++ b/src/or/channeltls.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1720,6 +1720,10 @@ channel_tls_process_netinfo_cell(cell_t *cell, channel_tls_t *chan) tor_assert(tor_mem_is_zero( (const char*)(chan->conn->handshake_state-> authenticated_ed25519_peer_id.pubkey), 32)); + /* If the client never authenticated, it's a tor client or bridge + * relay, and we must not use it for EXTEND requests (nor could we, as + * there are no authenticated peer IDs) */ + channel_mark_client(TLS_CHAN_TO_BASE(chan)); channel_set_circid_type(TLS_CHAN_TO_BASE(chan), NULL, chan->conn->link_proto < MIN_LINK_PROTO_FOR_WIDE_CIRC_IDS); diff --git a/src/or/channeltls.h b/src/or/channeltls.h index 729e595615..1f9a39d8a4 100644 --- a/src/or/channeltls.h +++ b/src/or/channeltls.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circpathbias.c b/src/or/circpathbias.c index cdcb6deae4..4c0bd9e455 100644 --- a/src/or/circpathbias.c +++ b/src/or/circpathbias.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circpathbias.h b/src/or/circpathbias.h index ce76689d5f..2a4c316807 100644 --- a/src/or/circpathbias.h +++ b/src/or/circpathbias.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index 24b7c7f4d9..08827c053b 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -73,7 +73,6 @@ static int circuit_deliver_create_cell(circuit_t *circ, static int onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit); static crypt_path_t *onion_next_hop_in_cpath(crypt_path_t *cpath); static int onion_extend_cpath(origin_circuit_t *circ); -static int count_acceptable_nodes(smartlist_t *routers); static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice); /** This function tries to get a channel to the specified endpoint, @@ -819,7 +818,7 @@ should_use_create_fast_for_circuit(origin_circuit_t *circ) } if (options->FastFirstHopPK == -1) { /* option is "auto", so look at the consensus. */ - return networkstatus_get_param(NULL, "usecreatefast", 1, 0, 1); + return networkstatus_get_param(NULL, "usecreatefast", 0, 0, 1); } return options->FastFirstHopPK; @@ -892,6 +891,27 @@ circuit_pick_extend_handshake(uint8_t *cell_type_out, } } +/** + * Return true iff <b>purpose</b> is a purpose for a circuit which is + * allowed to have no guard configured, even if the circuit is multihop + * and guards are enabled. + */ +static int +circuit_purpose_may_omit_guard(int purpose) +{ + switch (purpose) { + case CIRCUIT_PURPOSE_TESTING: + case CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT: + /* Testing circuits may omit guards because they're measuring + * liveness or performance, and don't want guards to interfere. */ + return 1; + default: + /* All other multihop circuits should use guards if guards are + * enabled. */ + return 0; + } +} + /** This is the backbone function for building circuits. * * If circ's first hop is closed, then we need to build a create @@ -978,7 +998,7 @@ circuit_send_next_onion_skin(origin_circuit_t *circ) guard_usable_t r; if (! circ->guard_state) { if (circuit_get_cpath_len(circ) != 1 && - circ->base_.purpose != CIRCUIT_PURPOSE_TESTING && + ! circuit_purpose_may_omit_guard(circ->base_.purpose) && get_options()->UseEntryGuards) { log_warn(LD_BUG, "%d-hop circuit %p with purpose %d has no " "guard state", @@ -1534,13 +1554,98 @@ onionskin_answer(or_circuit_t *circ, return 0; } -/** Choose a length for a circuit of purpose <b>purpose</b>: three + the - * number of endpoints that would give something away about our destination. +/** Helper for new_route_len(). Choose a circuit length for purpose + * <b>purpose</b>: DEFAULT_ROUTE_LEN (+ 1 if someone else chose the + * exit). If someone else chose the exit, they could be colluding + * with the exit, so add a randomly selected node to preserve + * anonymity. + * + * Here, "exit node" sometimes means an OR acting as an internal + * endpoint, rather than as a relay to an external endpoint. This + * means there need to be at least DEFAULT_ROUTE_LEN routers between + * us and the internal endpoint to preserve the same anonymity + * properties that we would get when connecting to an external + * endpoint. These internal endpoints can include: + * + * - Connections to a directory of hidden services + * (CIRCUIT_PURPOSE_C_GENERAL) + * + * - A client connecting to an introduction point, which the hidden + * service picked (CIRCUIT_PURPOSE_C_INTRODUCING, via + * circuit_get_open_circ_or_launch() which rewrites it from + * CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT) + * + * - A hidden service connecting to a rendezvous point, which the + * client picked (CIRCUIT_PURPOSE_S_CONNECT_REND, via + * rend_service_receive_introduction() and + * rend_service_relaunch_rendezvous) + * + * There are currently two situations where we picked the exit node + * ourselves, making DEFAULT_ROUTE_LEN a safe circuit length: + * + * - We are a hidden service connecting to an introduction point + * (CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, via + * rend_service_launch_establish_intro()) + * + * - We are a router testing its own reachabiity + * (CIRCUIT_PURPOSE_TESTING, via consider_testing_reachability()) + * + * onion_pick_cpath_exit() bypasses us (by not calling + * new_route_len()) in the one-hop tunnel case, so we don't need to + * handle that. + */ +static int +route_len_for_purpose(uint8_t purpose, extend_info_t *exit_ei) +{ + int routelen = DEFAULT_ROUTE_LEN; + int known_purpose = 0; + + if (!exit_ei) + return routelen; + + switch (purpose) { + /* These two purposes connect to a router that we chose, so + * DEFAULT_ROUTE_LEN is safe. */ + case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO: + /* hidden service connecting to introduction point */ + case CIRCUIT_PURPOSE_TESTING: + /* router reachability testing */ + known_purpose = 1; + break; + + /* These three purposes connect to a router that someone else + * might have chosen, so add an extra hop to protect anonymity. */ + case CIRCUIT_PURPOSE_C_GENERAL: + /* connecting to hidden service directory */ + case CIRCUIT_PURPOSE_C_INTRODUCING: + /* client connecting to introduction point */ + case CIRCUIT_PURPOSE_S_CONNECT_REND: + /* hidden service connecting to rendezvous point */ + known_purpose = 1; + routelen++; + break; + + default: + /* Got a purpose not listed above along with a chosen exit. + * Increase the circuit length by one anyway for safety. */ + routelen++; + break; + } + + if (BUG(exit_ei && !known_purpose)) { + log_warn(LD_BUG, "Unhandled purpose %d with a chosen exit; " + "assuming routelen %d.", purpose, routelen); + } + return routelen; +} + +/** Choose a length for a circuit of purpose <b>purpose</b> and check + * if enough routers are available. * * If the routerlist <b>nodes</b> doesn't have enough routers * to handle the desired path length, return -1. */ -static int +STATIC int new_route_len(uint8_t purpose, extend_info_t *exit_ei, smartlist_t *nodes) { int num_acceptable_routers; @@ -1548,11 +1653,7 @@ new_route_len(uint8_t purpose, extend_info_t *exit_ei, smartlist_t *nodes) tor_assert(nodes); - routelen = DEFAULT_ROUTE_LEN; - if (exit_ei && - purpose != CIRCUIT_PURPOSE_TESTING && - purpose != CIRCUIT_PURPOSE_S_ESTABLISH_INTRO) - routelen++; + routelen = route_len_for_purpose(purpose, exit_ei); num_acceptable_routers = count_acceptable_nodes(nodes); @@ -2176,8 +2277,8 @@ circuit_extend_to_new_exit(origin_circuit_t *circ, extend_info_t *exit_ei) /** Return the number of routers in <b>routers</b> that are currently up * and available for building circuits through. */ -static int -count_acceptable_nodes(smartlist_t *nodes) +MOCK_IMPL(STATIC int, +count_acceptable_nodes, (smartlist_t *nodes)) { int num=0; diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h index ddb070b427..45d9b2fb75 100644 --- a/src/or/circuitbuild.h +++ b/src/or/circuitbuild.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -77,6 +77,9 @@ void circuit_upgrade_circuits_from_guard_wait(void); #ifdef CIRCUITBUILD_PRIVATE STATIC circid_t get_unique_circ_id_by_chan(channel_t *chan); +STATIC int new_route_len(uint8_t purpose, extend_info_t *exit_ei, + smartlist_t *nodes); +MOCK_DECL(STATIC int, count_acceptable_nodes, (smartlist_t *nodes)); #if defined(ENABLE_TOR2WEB_MODE) || defined(TOR_UNIT_TESTS) STATIC const node_t *pick_tor2web_rendezvous_node(router_crn_flags_t flags, const or_options_t *options); diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c index 1a3b7bb288..5761890924 100644 --- a/src/or/circuitlist.c +++ b/src/or/circuitlist.c @@ -1,7 +1,7 @@ /* Copyright 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -984,10 +984,6 @@ circuit_free(circuit_t *circ) crypto_cipher_free(ocirc->n_crypto); crypto_digest_free(ocirc->n_digest); - if (ocirc->hs_token) { - hs_circuitmap_remove_circuit(ocirc); - } - if (ocirc->rend_splice) { or_circuit_t *other = ocirc->rend_splice; tor_assert(other->base_.magic == OR_CIRCUIT_MAGIC); @@ -1019,6 +1015,11 @@ circuit_free(circuit_t *circ) /* Remove from map. */ circuit_set_n_circid_chan(circ, 0, NULL); + /* Clear HS circuitmap token from this circ (if any) */ + if (circ->hs_token) { + hs_circuitmap_remove_circuit(circ); + } + /* Clear cell queue _after_ removing it from the map. Otherwise our * "active" checks will be violated. */ cell_queue_clear(&circ->n_chan_cells); @@ -2030,10 +2031,10 @@ single_conn_free_bytes(connection_t *conn) } if (conn->type == CONN_TYPE_DIR) { dir_connection_t *dir_conn = TO_DIR_CONN(conn); - if (dir_conn->zlib_state) { - result += tor_zlib_state_size(dir_conn->zlib_state); - tor_zlib_free(dir_conn->zlib_state); - dir_conn->zlib_state = NULL; + if (dir_conn->compress_state) { + result += tor_compress_state_size(dir_conn->compress_state); + tor_compress_free(dir_conn->compress_state); + dir_conn->compress_state = NULL; } } return result; diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h index 6abee37dc4..d647062f46 100644 --- a/src/or/circuitlist.h +++ b/src/or/circuitlist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitmux.c b/src/or/circuitmux.c index 96a3647aab..ee0d5c718b 100644 --- a/src/or/circuitmux.c +++ b/src/or/circuitmux.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitmux.h b/src/or/circuitmux.h index 00745ac4a1..42a46aaa47 100644 --- a/src/or/circuitmux.h +++ b/src/or/circuitmux.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitmux_ewma.c b/src/or/circuitmux_ewma.c index 0219459cdb..c2440b13f0 100644 --- a/src/or/circuitmux_ewma.c +++ b/src/or/circuitmux_ewma.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitmux_ewma.h b/src/or/circuitmux_ewma.h index a7b8961ac6..1f04408789 100644 --- a/src/or/circuitmux_ewma.h +++ b/src/or/circuitmux_ewma.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c index 48cb89dc37..fe6f723bd5 100644 --- a/src/or/circuitstats.c +++ b/src/or/circuitstats.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuitstats.h b/src/or/circuitstats.h index 23910276ae..4977b26c0d 100644 --- a/src/or/circuitstats.h +++ b/src/or/circuitstats.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/circuituse.c b/src/or/circuituse.c index d0bc7d3586..03b28c6ebd 100644 --- a/src/or/circuituse.c +++ b/src/or/circuituse.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1240,8 +1240,8 @@ circuit_predict_and_launch_new(void) /** Build a new test circuit every 5 minutes */ #define TESTING_CIRCUIT_INTERVAL 300 -/** This function is called once a second, if router_have_min_dir_info() is - * true. Its job is to make sure all services we offer have enough circuits +/** This function is called once a second, if router_have_minimum_dir_info() + * is true. Its job is to make sure all services we offer have enough circuits * available. Some services just want enough circuits for current tasks, * whereas others want a minimum set of idle circuits hanging around. */ diff --git a/src/or/circuituse.h b/src/or/circuituse.h index e5f8700ea2..ad4c214a3b 100644 --- a/src/or/circuituse.h +++ b/src/or/circuituse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/command.c b/src/or/command.c index 5f3b667ad9..c667cbbe52 100644 --- a/src/or/command.c +++ b/src/or/command.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -353,6 +353,16 @@ command_process_create_cell(cell_t *cell, channel_t *chan) int len; created_cell_t created_cell; + /* If the client used CREATE_FAST, it's probably a tor client or bridge + * relay, and we must not use it for EXTEND requests (in most cases, we + * won't have an authenticated peer ID for the extend). + * Public relays on 0.2.9 and later will use CREATE_FAST if they have no + * ntor onion key for this relay, but that should be a rare occurrence. + * Clients on 0.3.1 and later avoid using CREATE_FAST as much as they can, + * even during bootstrap, so the CREATE_FAST check is most accurate for + * earlier tor client versions. */ + channel_mark_client(chan); + memset(&created_cell, 0, sizeof(created_cell)); len = onion_skin_server_handshake(ONION_HANDSHAKE_TYPE_FAST, create_cell->onionskin, diff --git a/src/or/command.h b/src/or/command.h index 12cda6a463..5079d42e75 100644 --- a/src/or/command.h +++ b/src/or/command.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/config.c b/src/or/config.c index dcf671798e..92808682e8 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -69,10 +69,12 @@ #include "circuitmux.h" #include "circuitmux_ewma.h" #include "circuitstats.h" +#include "compress.h" #include "config.h" #include "connection.h" #include "connection_edge.h" #include "connection_or.h" +#include "consdiffmgr.h" #include "control.h" #include "confparse.h" #include "cpuworker.h" @@ -99,7 +101,6 @@ #include "statefile.h" #include "transports.h" #include "ext_orport.h" -#include "torgzip.h" #ifdef _WIN32 #include <shlobj.h> #endif @@ -1819,6 +1820,15 @@ options_act(const or_options_t *old_options) return -1; } + if (server_mode(options)) { + static int cdm_initialized = 0; + if (cdm_initialized == 0) { + cdm_initialized = 1; + consdiffmgr_configure(NULL); + consdiffmgr_validate(); + } + } + if (init_control_cookie_authentication(options->CookieAuthentication) < 0) { log_warn(LD_CONFIG,"Error creating control cookie authentication file."); return -1; @@ -2351,7 +2361,7 @@ print_usage(void) printf( "Copyright (c) 2001-2004, Roger Dingledine\n" "Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson\n" -"Copyright (c) 2007-2016, The Tor Project, Inc.\n\n" +"Copyright (c) 2007-2017, The Tor Project, Inc.\n\n" "tor -f <torrc> [args]\n" "See man page for options, or https://www.torproject.org/ for " "documentation.\n"); @@ -2819,7 +2829,7 @@ compute_publishserverdescriptor(or_options_t *options) #define MAX_CIRCS_AVAILABLE_TIME (24*60*60) /** Highest allowable value for RendPostPeriod. */ -#define MAX_DIR_PERIOD (MIN_ONION_KEY_LIFETIME/2) +#define MAX_DIR_PERIOD ((7*24*60*60)/2) /** Lowest allowable value for MaxCircuitDirtiness; if this is too low, Tor * will generate too many circuits and potentially overload the network. */ @@ -3522,6 +3532,20 @@ options_validate(or_options_t *old_options, or_options_t *options, return -1; } + /* Inform the hidden service operator that pinning EntryNodes can possibly + * be harmful for the service anonymity. */ + if (options->EntryNodes && + routerset_is_list(options->EntryNodes) && + (options->RendConfigLines != NULL)) { + log_warn(LD_CONFIG, + "EntryNodes is set with multiple entries and at least one " + "hidden service is configured. Pinning entry nodes can possibly " + "be harmful to the service anonymity. Because of this, we " + "recommend you either don't do that or make sure you know what " + "you are doing. For more details, please look at " + "https://trac.torproject.org/projects/tor/ticket/21155."); + } + /* Single Onion Services: non-anonymous hidden services */ if (rend_service_non_anonymous_mode_enabled(options)) { log_warn(LD_CONFIG, @@ -4947,9 +4971,21 @@ options_init_from_torrc(int argc, char **argv) printf("OpenSSL \t\t%-15s\t\t%s\n", crypto_openssl_get_header_version_str(), crypto_openssl_get_version_str()); - printf("Zlib \t\t%-15s\t\t%s\n", - tor_zlib_get_header_version_str(), - tor_zlib_get_version_str()); + if (tor_compress_supports_method(ZLIB_METHOD)) { + printf("Zlib \t\t%-15s\t\t%s\n", + tor_compress_version_str(ZLIB_METHOD), + tor_compress_header_version_str(ZLIB_METHOD)); + } + if (tor_compress_supports_method(LZMA_METHOD)) { + printf("Liblzma \t\t%-15s\t\t%s\n", + tor_compress_version_str(LZMA_METHOD), + tor_compress_header_version_str(LZMA_METHOD)); + } + if (tor_compress_supports_method(ZSTD_METHOD)) { + printf("Libzstd \t\t%-15s\t\t%s\n", + tor_compress_version_str(ZSTD_METHOD), + tor_compress_header_version_str(ZSTD_METHOD)); + } //TODO: Hex versions? exit(0); } diff --git a/src/or/config.h b/src/or/config.h index 6645532514..bb7802c990 100644 --- a/src/or/config.h +++ b/src/or/config.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/confparse.c b/src/or/confparse.c index 9e352aca27..abae7e33dc 100644 --- a/src/or/confparse.c +++ b/src/or/confparse.c @@ -2,7 +2,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -31,8 +31,6 @@ static int config_parse_msec_interval(const char *s, int *ok); static int config_parse_interval(const char *s, int *ok); static void config_reset(const config_format_t *fmt, void *options, const config_var_t *var, int use_defaults); -static config_line_t *config_lines_dup_and_filter(const config_line_t *inp, - const char *key); /** Allocate an empty configuration object of a given format type. */ void * @@ -80,120 +78,6 @@ config_expand_abbrev(const config_format_t *fmt, const char *option, return option; } -/** Helper: allocate a new configuration option mapping 'key' to 'val', - * append it to *<b>lst</b>. */ -void -config_line_append(config_line_t **lst, - const char *key, - const char *val) -{ - config_line_t *newline; - - newline = tor_malloc_zero(sizeof(config_line_t)); - newline->key = tor_strdup(key); - newline->value = tor_strdup(val); - newline->next = NULL; - while (*lst) - lst = &((*lst)->next); - - (*lst) = newline; -} - -/** Return the line in <b>lines</b> whose key is exactly <b>key</b>, or NULL - * if no such key exists. For handling commandline-only options only; other - * options should be looked up in the appropriate data structure. */ -const config_line_t * -config_line_find(const config_line_t *lines, - const char *key) -{ - const config_line_t *cl; - for (cl = lines; cl; cl = cl->next) { - if (!strcmp(cl->key, key)) - return cl; - } - return NULL; -} - -/** Helper: parse the config string and strdup into key/value - * strings. Set *result to the list, or NULL if parsing the string - * failed. Return 0 on success, -1 on failure. Warn and ignore any - * misformatted lines. - * - * If <b>extended</b> is set, then treat keys beginning with / and with + as - * indicating "clear" and "append" respectively. */ -int -config_get_lines(const char *string, config_line_t **result, int extended) -{ - config_line_t *list = NULL, **next; - char *k, *v; - const char *parse_err; - - next = &list; - do { - k = v = NULL; - string = parse_config_line_from_str_verbose(string, &k, &v, &parse_err); - if (!string) { - log_warn(LD_CONFIG, "Error while parsing configuration: %s", - parse_err?parse_err:"<unknown>"); - config_free_lines(list); - tor_free(k); - tor_free(v); - return -1; - } - if (k && v) { - unsigned command = CONFIG_LINE_NORMAL; - if (extended) { - if (k[0] == '+') { - char *k_new = tor_strdup(k+1); - tor_free(k); - k = k_new; - command = CONFIG_LINE_APPEND; - } else if (k[0] == '/') { - char *k_new = tor_strdup(k+1); - tor_free(k); - k = k_new; - tor_free(v); - v = tor_strdup(""); - command = CONFIG_LINE_CLEAR; - } - } - /* This list can get long, so we keep a pointer to the end of it - * rather than using config_line_append over and over and getting - * n^2 performance. */ - *next = tor_malloc_zero(sizeof(config_line_t)); - (*next)->key = k; - (*next)->value = v; - (*next)->next = NULL; - (*next)->command = command; - next = &((*next)->next); - } else { - tor_free(k); - tor_free(v); - } - } while (*string); - - *result = list; - return 0; -} - -/** - * Free all the configuration lines on the linked list <b>front</b>. - */ -void -config_free_lines(config_line_t *front) -{ - config_line_t *tmp; - - while (front) { - tmp = front; - front = tmp->next; - - tor_free(tmp->key); - tor_free(tmp->value); - tor_free(tmp); - } -} - /** If <b>key</b> is a deprecated configuration option, return the message * explaining why it is deprecated (which may be an empty string). Return NULL * if it is not deprecated. The <b>key</b> field must be fully expanded. */ @@ -633,36 +517,6 @@ config_value_needs_escape(const char *value) return 0; } -/** Return a newly allocated deep copy of the lines in <b>inp</b>. */ -config_line_t * -config_lines_dup(const config_line_t *inp) -{ - return config_lines_dup_and_filter(inp, NULL); -} - -/** Return a newly allocated deep copy of the lines in <b>inp</b>, - * but only the ones that match <b>key</b>. */ -static config_line_t * -config_lines_dup_and_filter(const config_line_t *inp, - const char *key) -{ - config_line_t *result = NULL; - config_line_t **next_out = &result; - while (inp) { - if (key && strcasecmpstart(inp->key, key)) { - inp = inp->next; - continue; - } - *next_out = tor_malloc_zero(sizeof(config_line_t)); - (*next_out)->key = tor_strdup(inp->key); - (*next_out)->value = tor_strdup(inp->value); - inp = inp->next; - next_out = &((*next_out)->next); - } - (*next_out) = NULL; - return result; -} - /** Return newly allocated line or lines corresponding to <b>key</b> in the * configuration <b>options</b>. If <b>escape_val</b> is true and a * value needs to be quoted before it's put in a config file, quote and @@ -779,6 +633,7 @@ config_get_assigned_option(const config_format_t *fmt, const void *options, tor_free(result); return NULL; case CONFIG_TYPE_LINELIST_S: + tor_free(result->key); tor_free(result); result = config_lines_dup_and_filter(*(const config_line_t **)value, key); @@ -1027,36 +882,6 @@ config_free(const config_format_t *fmt, void *options) tor_free(options); } -/** Return true iff a and b contain identical keys and values in identical - * order. */ -int -config_lines_eq(config_line_t *a, config_line_t *b) -{ - while (a && b) { - if (strcasecmp(a->key, b->key) || strcmp(a->value, b->value)) - return 0; - a = a->next; - b = b->next; - } - if (a || b) - return 0; - return 1; -} - -/** Return the number of lines in <b>a</b> whose key is <b>key</b>. */ -int -config_count_key(const config_line_t *a, const char *key) -{ - int n = 0; - while (a) { - if (!strcasecmp(a->key, key)) { - ++n; - } - a = a->next; - } - return n; -} - /** Return true iff the option <b>name</b> has the same value in <b>o1</b> * and <b>o2</b>. Must not be called for LINELIST_S or OBSOLETE options. */ @@ -1365,8 +1190,6 @@ config_parse_msec_interval(const char *s, int *ok) { uint64_t r; r = config_parse_units(s, time_msec_units, ok); - if (!ok) - return -1; if (r > INT_MAX) { log_warn(LD_CONFIG, "Msec interval '%s' is too long", s); *ok = 0; @@ -1384,8 +1207,6 @@ config_parse_interval(const char *s, int *ok) { uint64_t r; r = config_parse_units(s, time_units, ok); - if (!ok) - return -1; if (r > INT_MAX) { log_warn(LD_CONFIG, "Interval '%s' is too long", s); *ok = 0; diff --git a/src/or/confparse.h b/src/or/confparse.h index 8d915d266b..6f5c681ba8 100644 --- a/src/or/confparse.h +++ b/src/or/confparse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_CONFPARSE_H @@ -103,14 +103,7 @@ typedef struct config_format_t { #define CAL_WARN_DEPRECATIONS (1u<<2) void *config_new(const config_format_t *fmt); -void config_line_append(config_line_t **lst, - const char *key, const char *val); -config_line_t *config_lines_dup(const config_line_t *inp); -const config_line_t *config_line_find(const config_line_t *lines, - const char *key); void config_free(const config_format_t *fmt, void *options); -int config_lines_eq(config_line_t *a, config_line_t *b); -int config_count_key(const config_line_t *a, const char *key); config_line_t *config_get_assigned_option(const config_format_t *fmt, const void *options, const char *key, int escape_val); @@ -132,8 +125,6 @@ const char *config_find_deprecation(const config_format_t *fmt, const config_var_t *config_find_option(const config_format_t *fmt, const char *key); -int config_get_lines(const char *string, config_line_t **result, int extended); -void config_free_lines(config_line_t *front); const char *config_expand_abbrev(const config_format_t *fmt, const char *option, int command_line, int warn_obsolete); diff --git a/src/or/connection.c b/src/or/connection.c index 188276026f..5fb2c53677 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -628,13 +628,13 @@ connection_free_(connection_t *conn) dir_connection_t *dir_conn = TO_DIR_CONN(conn); tor_free(dir_conn->requested_resource); - tor_zlib_free(dir_conn->zlib_state); - if (dir_conn->fingerprint_stack) { - SMARTLIST_FOREACH(dir_conn->fingerprint_stack, char *, cp, tor_free(cp)); - smartlist_free(dir_conn->fingerprint_stack); + tor_compress_free(dir_conn->compress_state); + if (dir_conn->spool) { + SMARTLIST_FOREACH(dir_conn->spool, spooled_resource_t *, spooled, + spooled_resource_free(spooled)); + smartlist_free(dir_conn->spool); } - cached_dir_decref(dir_conn->cached_dir); rend_data_free(dir_conn->rend_data); if (dir_conn->guard_state) { /* Cancel before freeing, if it's still there. */ @@ -4060,9 +4060,9 @@ connection_write_to_buf_impl_,(const char *string, size_t len, if (zlib) { dir_connection_t *dir_conn = TO_DIR_CONN(conn); int done = zlib < 0; - CONN_LOG_PROTECT(conn, r = write_to_buf_zlib(conn->outbuf, - dir_conn->zlib_state, - string, len, done)); + CONN_LOG_PROTECT(conn, r = write_to_buf_compress(conn->outbuf, + dir_conn->compress_state, + string, len, done)); } else { CONN_LOG_PROTECT(conn, r = write_to_buf(string, len, conn->outbuf)); } diff --git a/src/or/connection.h b/src/or/connection.h index d25e002fa4..36e45aef38 100644 --- a/src/or/connection.h +++ b/src/or/connection.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -141,17 +141,17 @@ MOCK_DECL(void, connection_write_to_buf_impl_, /* DOCDOC connection_write_to_buf */ static void connection_write_to_buf(const char *string, size_t len, connection_t *conn); -/* DOCDOC connection_write_to_buf_zlib */ -static void connection_write_to_buf_zlib(const char *string, size_t len, - dir_connection_t *conn, int done); +/* DOCDOC connection_write_to_buf_compress */ +static void connection_write_to_buf_compress(const char *string, size_t len, + dir_connection_t *conn, int done); static inline void connection_write_to_buf(const char *string, size_t len, connection_t *conn) { connection_write_to_buf_impl_(string, len, conn, 0); } static inline void -connection_write_to_buf_zlib(const char *string, size_t len, - dir_connection_t *conn, int done) +connection_write_to_buf_compress(const char *string, size_t len, + dir_connection_t *conn, int done) { connection_write_to_buf_impl_(string, len, TO_CONN(conn), done ? -1 : 1); } diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c index ef551048b8..d1728eca6d 100644 --- a/src/or/connection_edge.c +++ b/src/or/connection_edge.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -29,7 +29,7 @@ * <li>DNS lookup streams, created on the exit side in response to * a RELAY_RESOLVE cell from a client. * <li>Tunneled directory streams, created on the directory cache side - * in response to a RELAY_BEGINDIR cell. These streams attach directly + * in response to a RELAY_BEGIN_DIR cell. These streams attach directly * to a dir_connection_t object without ever using TCP. * </ul> * @@ -1762,7 +1762,7 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn, conn->entry_cfg.ipv6_traffic = 0; /* Still handling CONNECT. Now, check for exit enclaves. (Which we - * don't do on BEGINDIR, or when there is a chosen exit.) + * don't do on BEGIN_DIR, or when there is a chosen exit.) * * TODO: Should we remove this? Exit enclaves are nutty and don't * work very well @@ -2514,14 +2514,20 @@ connection_ap_handshake_send_begin(entry_connection_t *ap_conn) } else if (begin_type == RELAY_COMMAND_BEGIN_DIR) { /* This connection is a begindir directory connection. * Look at the linked directory connection to access the directory purpose. - * (This must be non-NULL, because we're doing begindir.) */ - tor_assert(base_conn->linked); + * If a BEGINDIR connection is ever not linked, that's a bug. */ + if (BUG(!base_conn->linked)) { + return -1; + } connection_t *linked_dir_conn_base = base_conn->linked_conn; - tor_assert(linked_dir_conn_base); + /* If the linked connection has been unlinked by other code, we can't send + * a begin cell on it. */ + if (!linked_dir_conn_base) { + return -1; + } /* Sensitive directory connections must have an anonymous path length. * Otherwise, directory connections are typically one-hop. * This matches the earlier check for directory connection path anonymity - * in directory_initiate_command_rend(). */ + * in directory_initiate_request(). */ if (purpose_needs_anonymity(linked_dir_conn_base->purpose, TO_DIR_CONN(linked_dir_conn_base)->router_purpose, TO_DIR_CONN(linked_dir_conn_base)->requested_resource)) { @@ -2995,7 +3001,7 @@ connection_ap_handshake_socks_reply(entry_connection_t *conn, char *reply, return; } -/** Read a RELAY_BEGIN or RELAY_BEGINDIR cell from <b>cell</b>, decode it, and +/** Read a RELAY_BEGIN or RELAY_BEGIN_DIR cell from <b>cell</b>, decode it, and * place the result in <b>bcell</b>. On success return 0; on failure return * <0 and set *<b>end_reason_out</b> to the end reason we should send back to * the client. diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h index 61b5752aed..e4780b3c7d 100644 --- a/src/or/connection_edge.h +++ b/src/or/connection_edge.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 0ee3fce618..280f8f70ad 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/connection_or.h b/src/or/connection_or.h index 5d089e6789..4261658932 100644 --- a/src/or/connection_or.h +++ b/src/or/connection_or.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/conscache.c b/src/or/conscache.c new file mode 100644 index 0000000000..5ffa129bbe --- /dev/null +++ b/src/or/conscache.c @@ -0,0 +1,541 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" + +#include "config.h" +#include "conscache.h" +#include "storagedir.h" + +#define CCE_MAGIC 0x17162253 + +/** + * A consensus_cache_entry_t is a reference-counted handle to an + * item in a consensus_cache_t. It can be mmapped into RAM, or not, + * depending whether it's currently in use. + */ +struct consensus_cache_entry_t { + uint32_t magic; /**< Must be set to CCE_MAGIC */ + HANDLE_ENTRY(consensus_cache_entry, consensus_cache_entry_t); + int32_t refcnt; /**< Reference count. */ + unsigned can_remove : 1; /**< If true, we want to delete this file. */ + /** If true, we intend to unmap this file as soon as we're done with it. */ + unsigned release_aggressively : 1; + + /** Filename for this object within the storage_dir_t */ + char *fname; + /** Labels associated with this object. Immutable once the object + * is created. */ + config_line_t *labels; + /** Pointer to the cache that includes this entry (if any). */ + consensus_cache_t *in_cache; + + /** Since what time has this object been mapped into RAM, but with the cache + * being the only having a reference to it? */ + time_t unused_since; + /** mmaped contents of the underlying file. May be NULL */ + tor_mmap_t *map; + /** Length of the body within <b>map</b>. */ + size_t bodylen; + /** Pointer to the body within <b>map</b>. */ + const uint8_t *body; +}; + +/** + * A consensus_cache_t holds a directory full of labeled items. + */ +struct consensus_cache_t { + /** Underling storage_dir_t to handle persistence */ + storage_dir_t *dir; + /** List of all the entries in the directory. */ + smartlist_t *entries; +}; + +static void consensus_cache_clear(consensus_cache_t *cache); +static void consensus_cache_rescan(consensus_cache_t *); +static void consensus_cache_entry_map(consensus_cache_t *, + consensus_cache_entry_t *); +static void consensus_cache_entry_unmap(consensus_cache_entry_t *ent); + +/** + * Helper: Open a consensus cache in subdirectory <b>subdir</b> of the + * data directory, to hold up to <b>max_entries</b> of data. + */ +consensus_cache_t * +consensus_cache_open(const char *subdir, int max_entries) +{ + consensus_cache_t *cache = tor_malloc_zero(sizeof(consensus_cache_t)); + char *directory = get_datadir_fname(subdir); + cache->dir = storage_dir_new(directory, max_entries); + tor_free(directory); + if (!cache->dir) { + tor_free(cache); + return NULL; + } + + consensus_cache_rescan(cache); + return cache; +} + +/** + * Tell the sandbox (if any) configured by <b>cfg</b> to allow the + * operations that <b>cache</b> will need. + */ +int +consensus_cache_register_with_sandbox(consensus_cache_t *cache, + struct sandbox_cfg_elem **cfg) +{ + return storage_dir_register_with_sandbox(cache->dir, cfg); +} + +/** + * Helper: clear all entries from <b>cache</b> (but do not delete + * any that aren't marked for removal + */ +static void +consensus_cache_clear(consensus_cache_t *cache) +{ + consensus_cache_delete_pending(cache, 0); + + SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { + ent->in_cache = NULL; + consensus_cache_entry_decref(ent); + } SMARTLIST_FOREACH_END(ent); + smartlist_free(cache->entries); + cache->entries = NULL; +} + +/** + * Drop all storage held by <b>cache</b>. + */ +void +consensus_cache_free(consensus_cache_t *cache) +{ + if (! cache) + return; + + if (cache->entries) { + consensus_cache_clear(cache); + } + storage_dir_free(cache->dir); + tor_free(cache); +} + +/** + * Write <b>datalen</b> bytes of data at <b>data</b> into the <b>cache</b>, + * labeling that data with <b>labels</b>. On failure, return NULL. On + * success, return a newly created consensus_cache_entry_t. + * + * The returned value will be owned by the cache, and you will have a + * reference to it. Call consensus_cache_entry_decref() when you are + * done with it. + * + * The provided <b>labels</b> MUST have distinct keys: if they don't, + * this API does not specify which values (if any) for the duplicate keys + * will be considered. + */ +consensus_cache_entry_t * +consensus_cache_add(consensus_cache_t *cache, + const config_line_t *labels, + const uint8_t *data, + size_t datalen) +{ + char *fname = NULL; + int r = storage_dir_save_labeled_to_file(cache->dir, + labels, data, datalen, &fname); + if (r < 0 || fname == NULL) { + return NULL; + } + consensus_cache_entry_t *ent = + tor_malloc_zero(sizeof(consensus_cache_entry_t)); + ent->magic = CCE_MAGIC; + ent->fname = fname; + ent->labels = config_lines_dup(labels); + ent->in_cache = cache; + ent->unused_since = TIME_MAX; + smartlist_add(cache->entries, ent); + /* Start the reference count at 2: the caller owns one copy, and the + * cache owns another. + */ + ent->refcnt = 2; + + return ent; +} + +/** + * Given a <b>cache</b>, return some entry for which <b>key</b>=<b>value</b>. + * Return NULL if no such entry exists. + * + * Does not adjust reference counts. + */ +consensus_cache_entry_t * +consensus_cache_find_first(consensus_cache_t *cache, + const char *key, + const char *value) +{ + smartlist_t *tmp = smartlist_new(); + consensus_cache_find_all(tmp, cache, key, value); + consensus_cache_entry_t *ent = NULL; + if (smartlist_len(tmp)) + ent = smartlist_get(tmp, 0); + smartlist_free(tmp); + return ent; +} + +/** + * Given a <b>cache</b>, add every entry to <b>out<b> for which + * <b>key</b>=<b>value</b>. If <b>key</b> is NULL, add every entry. + * + * Do not add any entry that has been marked for removal. + * + * Does not adjust reference counts. + */ +void +consensus_cache_find_all(smartlist_t *out, + consensus_cache_t *cache, + const char *key, + const char *value) +{ + SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { + if (ent->can_remove == 1) { + /* We want to delete this; pretend it isn't there. */ + continue; + } + if (! key) { + smartlist_add(out, ent); + continue; + } + const char *found_val = consensus_cache_entry_get_value(ent, key); + if (found_val && !strcmp(value, found_val)) { + smartlist_add(out, ent); + } + } SMARTLIST_FOREACH_END(ent); +} + +/** + * Given a list of consensus_cache_entry_t, remove all those entries + * that do not have <b>key</b>=<b>value</b> in their labels. + * + * Does not adjust reference counts. + */ +void +consensus_cache_filter_list(smartlist_t *lst, + const char *key, + const char *value) +{ + if (BUG(lst == NULL)) + return; // LCOV_EXCL_LINE + if (key == NULL) + return; + SMARTLIST_FOREACH_BEGIN(lst, consensus_cache_entry_t *, ent) { + const char *found_val = consensus_cache_entry_get_value(ent, key); + if (! found_val || strcmp(value, found_val)) { + SMARTLIST_DEL_CURRENT(lst, ent); + } + } SMARTLIST_FOREACH_END(ent); +} + +/** + * If <b>ent</b> has a label with the given <b>key</b>, return its + * value. Otherwise return NULL. + * + * The return value is only guaranteed to be valid for as long as you + * hold a reference to <b>ent</b>. + */ +const char * +consensus_cache_entry_get_value(const consensus_cache_entry_t *ent, + const char *key) +{ + const config_line_t *match = config_line_find(ent->labels, key); + if (match) + return match->value; + else + return NULL; +} + +/** + * Return a pointer to the labels in <b>ent</b>. + * + * This pointer is only guaranteed to be valid for as long as you + * hold a reference to <b>ent</b>. + */ +const config_line_t * +consensus_cache_entry_get_labels(const consensus_cache_entry_t *ent) +{ + return ent->labels; +} + +/** + * Increase the reference count of <b>ent</b>. + */ +void +consensus_cache_entry_incref(consensus_cache_entry_t *ent) +{ + if (BUG(ent->magic != CCE_MAGIC)) + return; // LCOV_EXCL_LINE + ++ent->refcnt; + ent->unused_since = TIME_MAX; +} + +/** + * Release a reference held to <b>ent</b>. + * + * If it was the last reference, ent will be freed. Therefore, you must not + * use <b>ent</b> after calling this function. + */ +void +consensus_cache_entry_decref(consensus_cache_entry_t *ent) +{ + if (! ent) + return; + if (BUG(ent->refcnt <= 0)) + return; // LCOV_EXCL_LINE + if (BUG(ent->magic != CCE_MAGIC)) + return; // LCOV_EXCL_LINE + + --ent->refcnt; + + if (ent->refcnt == 1 && ent->in_cache) { + /* Only the cache has a reference: we don't need to keep the file + * mapped */ + if (ent->map) { + if (ent->release_aggressively) { + consensus_cache_entry_unmap(ent); + } else { + ent->unused_since = approx_time(); + } + } + return; + } + + if (ent->refcnt > 0) + return; + + /* Refcount is zero; we can free it. */ + if (ent->map) { + consensus_cache_entry_unmap(ent); + } + tor_free(ent->fname); + config_free_lines(ent->labels); + consensus_cache_entry_handles_clear(ent); + memwipe(ent, 0, sizeof(consensus_cache_entry_t)); + tor_free(ent); +} + +/** + * Mark <b>ent</b> for deletion from the cache. Deletion will not occur + * until the cache is the only place that holds a reference to <b>ent</b>. + */ +void +consensus_cache_entry_mark_for_removal(consensus_cache_entry_t *ent) +{ + ent->can_remove = 1; +} + +/** + * Mark <b>ent</b> as the kind of entry that we don't need to keep mmap'd for + * any longer than we're actually using it. + */ +void +consensus_cache_entry_mark_for_aggressive_release(consensus_cache_entry_t *ent) +{ + ent->release_aggressively = 1; +} + +/** + * Try to read the body of <b>ent</b> into memory if it isn't already + * loaded. On success, set *<b>body_out</b> to the body, *<b>sz_out</b> + * to its size, and return 0. On failure return -1. + * + * The resulting body pointer will only be valid for as long as you + * hold a reference to <b>ent</b>. + */ +int +consensus_cache_entry_get_body(const consensus_cache_entry_t *ent, + const uint8_t **body_out, + size_t *sz_out) +{ + if (BUG(ent->magic != CCE_MAGIC)) + return -1; // LCOV_EXCL_LINE + + if (! ent->map) { + if (! ent->in_cache) + return -1; + + consensus_cache_entry_map((consensus_cache_t *)ent->in_cache, + (consensus_cache_entry_t *)ent); + if (! ent->map) { + return -1; + } + } + + *body_out = ent->body; + *sz_out = ent->bodylen; + return 0; +} + +/** + * Unmap every mmap'd element of <b>cache</b> that has been unused + * since <b>cutoff</b>. + */ +void +consensus_cache_unmap_lazy(consensus_cache_t *cache, time_t cutoff) +{ + SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { + tor_assert_nonfatal(ent->in_cache == cache); + if (ent->refcnt > 1 || BUG(ent->in_cache == NULL)) { + /* Somebody is using this entry right now */ + continue; + } + if (ent->unused_since > cutoff) { + /* Has been unused only for a little while */ + continue; + } + if (ent->map == NULL) { + /* Not actually mapped. */ + continue; + } + consensus_cache_entry_unmap(ent); + } SMARTLIST_FOREACH_END(ent); +} + +/** + * Return the number of currently unused filenames available in this cache. + */ +int +consensus_cache_get_n_filenames_available(consensus_cache_t *cache) +{ + tor_assert(cache); + int max = storage_dir_get_max_files(cache->dir); + int used = smartlist_len(storage_dir_list(cache->dir)); + tor_assert_nonfatal(max >= used); + return max - used; +} + +/** + * Delete every element of <b>cache</b> has been marked with + * consensus_cache_entry_mark_for_removal. If <b>force</b> is false, + * retain those entries which are not in use except by the cache. + */ +void +consensus_cache_delete_pending(consensus_cache_t *cache, int force) +{ + SMARTLIST_FOREACH_BEGIN(cache->entries, consensus_cache_entry_t *, ent) { + tor_assert_nonfatal(ent->in_cache == cache); + if (! force) { + if (ent->refcnt > 1 || BUG(ent->in_cache == NULL)) { + /* Somebody is using this entry right now */ + continue; + } + } + if (ent->can_remove == 0) { + /* Don't want to delete this. */ + continue; + } + if (BUG(ent->refcnt <= 0)) { + continue; // LCOV_EXCL_LINE + } + + SMARTLIST_DEL_CURRENT(cache->entries, ent); + ent->in_cache = NULL; + char *fname = tor_strdup(ent->fname); /* save a copy */ + consensus_cache_entry_decref(ent); + storage_dir_remove_file(cache->dir, fname); + tor_free(fname); + } SMARTLIST_FOREACH_END(ent); +} + +/** + * Internal helper: rescan <b>cache</b> and rebuild its list of entries. + */ +static void +consensus_cache_rescan(consensus_cache_t *cache) +{ + if (cache->entries) { + consensus_cache_clear(cache); + } + + cache->entries = smartlist_new(); + const smartlist_t *fnames = storage_dir_list(cache->dir); + SMARTLIST_FOREACH_BEGIN(fnames, const char *, fname) { + tor_mmap_t *map = NULL; + config_line_t *labels = NULL; + const uint8_t *body; + size_t bodylen; + map = storage_dir_map_labeled(cache->dir, fname, + &labels, &body, &bodylen); + if (! map) { + /* Can't load this; continue */ + log_warn(LD_FS, "Unable to map file %s from consensus cache: %s", + escaped(fname), strerror(errno)); + continue; + } + consensus_cache_entry_t *ent = + tor_malloc_zero(sizeof(consensus_cache_entry_t)); + ent->magic = CCE_MAGIC; + ent->fname = tor_strdup(fname); + ent->labels = labels; + ent->refcnt = 1; + ent->in_cache = cache; + ent->unused_since = TIME_MAX; + smartlist_add(cache->entries, ent); + tor_munmap_file(map); /* don't actually need to keep this around */ + } SMARTLIST_FOREACH_END(fname); +} + +/** + * Make sure that <b>ent</b> is mapped into RAM. + */ +static void +consensus_cache_entry_map(consensus_cache_t *cache, + consensus_cache_entry_t *ent) +{ + if (ent->map) + return; + + ent->map = storage_dir_map_labeled(cache->dir, ent->fname, + NULL, &ent->body, &ent->bodylen); + ent->unused_since = TIME_MAX; +} + +/** + * Unmap <b>ent</b> from RAM. + * + * Do not call this if something other than the cache is holding a reference + * to <b>ent</b> + */ +static void +consensus_cache_entry_unmap(consensus_cache_entry_t *ent) +{ + ent->unused_since = TIME_MAX; + if (!ent->map) + return; + + tor_munmap_file(ent->map); + ent->map = NULL; + ent->body = NULL; + ent->bodylen = 0; + ent->unused_since = TIME_MAX; +} + +HANDLE_IMPL(consensus_cache_entry, consensus_cache_entry_t, ) + +#ifdef TOR_UNIT_TESTS +/** + * Testing only: Return true iff <b>ent</b> is mapped into memory. + * + * (In normal operation, this information is not exposed.) + */ +int +consensus_cache_entry_is_mapped(consensus_cache_entry_t *ent) +{ + if (ent->map) { + tor_assert(ent->body); + return 1; + } else { + tor_assert(!ent->body); + return 0; + } +} +#endif + diff --git a/src/or/conscache.h b/src/or/conscache.h new file mode 100644 index 0000000000..aef54201f0 --- /dev/null +++ b/src/or/conscache.h @@ -0,0 +1,61 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_CONSCACHE_H +#define TOR_CONSCACHE_H + +#include "handles.h" + +typedef struct consensus_cache_entry_t consensus_cache_entry_t; +typedef struct consensus_cache_t consensus_cache_t; + +HANDLE_DECL(consensus_cache_entry, consensus_cache_entry_t, ) + +consensus_cache_t *consensus_cache_open(const char *subdir, int max_entries); +void consensus_cache_free(consensus_cache_t *cache); +struct sandbox_cfg_elem; +int consensus_cache_register_with_sandbox(consensus_cache_t *cache, + struct sandbox_cfg_elem **cfg); +void consensus_cache_unmap_lazy(consensus_cache_t *cache, time_t cutoff); +void consensus_cache_delete_pending(consensus_cache_t *cache, + int force); +int consensus_cache_get_n_filenames_available(consensus_cache_t *cache); +consensus_cache_entry_t *consensus_cache_add(consensus_cache_t *cache, + const config_line_t *labels, + const uint8_t *data, + size_t datalen); + +consensus_cache_entry_t *consensus_cache_find_first( + consensus_cache_t *cache, + const char *key, + const char *value); + +void consensus_cache_find_all(smartlist_t *out, + consensus_cache_t *cache, + const char *key, + const char *value); +void consensus_cache_filter_list(smartlist_t *lst, + const char *key, + const char *value); + +const char *consensus_cache_entry_get_value(const consensus_cache_entry_t *ent, + const char *key); +const config_line_t *consensus_cache_entry_get_labels( + const consensus_cache_entry_t *ent); + +void consensus_cache_entry_incref(consensus_cache_entry_t *ent); +void consensus_cache_entry_decref(consensus_cache_entry_t *ent); + +void consensus_cache_entry_mark_for_removal(consensus_cache_entry_t *ent); +void consensus_cache_entry_mark_for_aggressive_release( + consensus_cache_entry_t *ent); +int consensus_cache_entry_get_body(const consensus_cache_entry_t *ent, + const uint8_t **body_out, + size_t *sz_out); + +#ifdef TOR_UNIT_TESTS +int consensus_cache_entry_is_mapped(consensus_cache_entry_t *ent); +#endif + +#endif + diff --git a/src/or/consdiff.c b/src/or/consdiff.c new file mode 100644 index 0000000000..1baa11897c --- /dev/null +++ b/src/or/consdiff.c @@ -0,0 +1,1412 @@ +/* Copyright (c) 2014, Daniel Martà + * Copyright (c) 2014, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file consdiff.c + * \brief Consensus diff implementation, including both the generation and the + * application of diffs in a minimal ed format. + * + * The consensus diff application is done in consdiff_apply_diff, which relies + * on apply_ed_diff for the main ed diff part and on some digest helper + * functions to check the digest hashes found in the consensus diff header. + * + * The consensus diff generation is more complex. consdiff_gen_diff generates + * it, relying on gen_ed_diff to generate the ed diff and some digest helper + * functions to generate the digest hashes. + * + * gen_ed_diff is the tricky bit. In it simplest form, it will take quadratic + * time and linear space to generate an ed diff given two smartlists. As shown + * in its comment section, calling calc_changes on the entire two consensuses + * will calculate what is to be added and what is to be deleted in the diff. + * Its comment section briefly explains how it works. + * + * In our case specific to consensuses, we take advantage of the fact that + * consensuses list routers sorted by their identities. We use that + * information to avoid running calc_changes on the whole smartlists. + * gen_ed_diff will navigate through the two consensuses identity by identity + * and will send small couples of slices to calc_changes, keeping the running + * time near-linear. This is explained in more detail in the gen_ed_diff + * comments. + * + * The allocation strategy tries to save time and memory by avoiding needless + * copies. Instead of actually splitting the inputs into separate strings, we + * allocate cdline_t objects, each of which represents a line in the original + * object or in the output. We use memarea_t allocators to manage the + * temporary memory we use when generating or applying diffs. + **/ + +#define CONSDIFF_PRIVATE + +#include "or.h" +#include "consdiff.h" +#include "memarea.h" +#include "routerparse.h" + +static const char* ns_diff_version = "network-status-diff-version 1"; +static const char* hash_token = "hash"; + +static char *consensus_join_lines(const smartlist_t *inp); + +/** Return true iff a and b have the same contents. */ +STATIC int +lines_eq(const cdline_t *a, const cdline_t *b) +{ + return a->len == b->len && fast_memeq(a->s, b->s, a->len); +} + +/** Return true iff a has the same contents as the nul-terminated string b. */ +STATIC int +line_str_eq(const cdline_t *a, const char *b) +{ + const size_t len = strlen(b); + tor_assert(len <= UINT32_MAX); + cdline_t bline = { b, (uint32_t)len }; + return lines_eq(a, &bline); +} + +/** Return true iff a begins with the same contents as the nul-terminated + * string b. */ +static int +line_starts_with_str(const cdline_t *a, const char *b) +{ + const size_t len = strlen(b); + tor_assert(len <= UINT32_MAX); + return a->len >= len && fast_memeq(a->s, b, len); +} + +/** Return a new cdline_t holding as its contents the nul-terminated + * string s. Use the provided memory area for storage. */ +static cdline_t * +cdline_linecpy(memarea_t *area, const char *s) +{ + size_t len = strlen(s); + const char *ss = memarea_memdup(area, s, len); + cdline_t *line = memarea_alloc(area, sizeof(cdline_t)); + line->s = ss; + line->len = (uint32_t)len; + return line; +} + +/** Add a cdline_t to <b>lst</b> holding as its contents the nul-terminated + * string s. Use the provided memory area for storage. */ +STATIC void +smartlist_add_linecpy(smartlist_t *lst, memarea_t *area, const char *s) +{ + smartlist_add(lst, cdline_linecpy(area, s)); +} + +/** Compute the digest of <b>cons</b>, and store the result in + * <b>digest_out</b>. Return 0 on success, -1 on failure. */ +/* This is a separate, mockable function so that we can override it when + * fuzzing. */ +MOCK_IMPL(STATIC int, +consensus_compute_digest,(const char *cons, + consensus_digest_t *digest_out)) +{ + int r = crypto_digest256((char*)digest_out->sha3_256, + cons, strlen(cons), DIGEST_SHA3_256); + return r; +} + +/** Compute the digest-as-signed of <b>cons</b>, and store the result in + * <b>digest_out</b>. Return 0 on success, -1 on failure. */ +/* This is a separate, mockable function so that we can override it when + * fuzzing. */ +MOCK_IMPL(STATIC int, +consensus_compute_digest_as_signed,(const char *cons, + consensus_digest_t *digest_out)) +{ + return router_get_networkstatus_v3_sha3_as_signed(digest_out->sha3_256, + cons); +} + +/** Return true iff <b>d1</b> and <b>d2</b> contain the same digest */ +/* This is a separate, mockable function so that we can override it when + * fuzzing. */ +MOCK_IMPL(STATIC int, +consensus_digest_eq,(const uint8_t *d1, + const uint8_t *d2)) +{ + return fast_memeq(d1, d2, DIGEST256_LEN); +} + +/** Create (allocate) a new slice from a smartlist. Assumes that the start + * and the end indexes are within the bounds of the initial smartlist. The end + * element is not part of the resulting slice. If end is -1, the slice is to + * reach the end of the smartlist. + */ +STATIC smartlist_slice_t * +smartlist_slice(const smartlist_t *list, int start, int end) +{ + int list_len = smartlist_len(list); + tor_assert(start >= 0); + tor_assert(start <= list_len); + if (end == -1) { + end = list_len; + } + tor_assert(start <= end); + + smartlist_slice_t *slice = tor_malloc(sizeof(smartlist_slice_t)); + slice->list = list; + slice->offset = start; + slice->len = end - start; + return slice; +} + +/** Helper: Compute the longest common subsequence lengths for the two slices. + * Used as part of the diff generation to find the column at which to split + * slice2 while still having the optimal solution. + * If direction is -1, the navigation is reversed. Otherwise it must be 1. + * The length of the resulting integer array is that of the second slice plus + * one. + */ +STATIC int * +lcs_lengths(const smartlist_slice_t *slice1, const smartlist_slice_t *slice2, + int direction) +{ + size_t a_size = sizeof(int) * (slice2->len+1); + + /* Resulting lcs lengths. */ + int *result = tor_malloc_zero(a_size); + /* Copy of the lcs lengths from the last iteration. */ + int *prev = tor_malloc(a_size); + + tor_assert(direction == 1 || direction == -1); + + int si = slice1->offset; + if (direction == -1) { + si += (slice1->len-1); + } + + for (int i = 0; i < slice1->len; ++i, si+=direction) { + + const cdline_t *line1 = smartlist_get(slice1->list, si); + /* Store the last results. */ + memcpy(prev, result, a_size); + + int sj = slice2->offset; + if (direction == -1) { + sj += (slice2->len-1); + } + + for (int j = 0; j < slice2->len; ++j, sj+=direction) { + + const cdline_t *line2 = smartlist_get(slice2->list, sj); + if (lines_eq(line1, line2)) { + /* If the lines are equal, the lcs is one line longer. */ + result[j + 1] = prev[j] + 1; + } else { + /* If not, see what lcs parent path is longer. */ + result[j + 1] = MAX(result[j], prev[j + 1]); + } + } + } + tor_free(prev); + return result; +} + +/** Helper: Trim any number of lines that are equally at the start or the end + * of both slices. + */ +STATIC void +trim_slices(smartlist_slice_t *slice1, smartlist_slice_t *slice2) +{ + while (slice1->len>0 && slice2->len>0) { + const cdline_t *line1 = smartlist_get(slice1->list, slice1->offset); + const cdline_t *line2 = smartlist_get(slice2->list, slice2->offset); + if (!lines_eq(line1, line2)) { + break; + } + slice1->offset++; slice1->len--; + slice2->offset++; slice2->len--; + } + + int i1 = (slice1->offset+slice1->len)-1; + int i2 = (slice2->offset+slice2->len)-1; + + while (slice1->len>0 && slice2->len>0) { + const cdline_t *line1 = smartlist_get(slice1->list, i1); + const cdline_t *line2 = smartlist_get(slice2->list, i2); + if (!lines_eq(line1, line2)) { + break; + } + i1--; + slice1->len--; + i2--; + slice2->len--; + } +} + +/** Like smartlist_string_pos, but uses a cdline_t, and is restricted to the + * bounds of the slice. + */ +STATIC int +smartlist_slice_string_pos(const smartlist_slice_t *slice, + const cdline_t *string) +{ + int end = slice->offset + slice->len; + for (int i = slice->offset; i < end; ++i) { + const cdline_t *el = smartlist_get(slice->list, i); + if (lines_eq(el, string)) { + return i; + } + } + return -1; +} + +/** Helper: Set all the appropriate changed booleans to true. The first slice + * must be of length 0 or 1. All the lines of slice1 and slice2 which are not + * present in the other slice will be set to changed in their bool array. + * The two changed bool arrays are passed in the same order as the slices. + */ +STATIC void +set_changed(bitarray_t *changed1, bitarray_t *changed2, + const smartlist_slice_t *slice1, const smartlist_slice_t *slice2) +{ + int toskip = -1; + tor_assert(slice1->len == 0 || slice1->len == 1); + + if (slice1->len == 1) { + const cdline_t *line_common = smartlist_get(slice1->list, slice1->offset); + toskip = smartlist_slice_string_pos(slice2, line_common); + if (toskip == -1) { + bitarray_set(changed1, slice1->offset); + } + } + int end = slice2->offset + slice2->len; + for (int i = slice2->offset; i < end; ++i) { + if (i != toskip) { + bitarray_set(changed2, i); + } + } +} + +/* + * Helper: Given that slice1 has been split by half into top and bot, we want + * to fetch the column at which to split slice2 so that we are still on track + * to the optimal diff solution, i.e. the shortest one. We use lcs_lengths + * since the shortest diff is just another way to say the longest common + * subsequence. + */ +static int +optimal_column_to_split(const smartlist_slice_t *top, + const smartlist_slice_t *bot, + const smartlist_slice_t *slice2) +{ + int *lens_top = lcs_lengths(top, slice2, 1); + int *lens_bot = lcs_lengths(bot, slice2, -1); + int column=0, max_sum=-1; + + for (int i = 0; i < slice2->len+1; ++i) { + int sum = lens_top[i] + lens_bot[slice2->len-i]; + if (sum > max_sum) { + column = i; + max_sum = sum; + } + } + tor_free(lens_top); + tor_free(lens_bot); + + return column; +} + +/** + * Helper: Figure out what elements are new or gone on the second smartlist + * relative to the first smartlist, and store the booleans in the bitarrays. + * True on the first bitarray means the element is gone, true on the second + * bitarray means it's new. + * + * In its base case, either of the smartlists is of length <= 1 and we can + * quickly see what elements are new or are gone. In the other case, we will + * split one smartlist by half and we'll use optimal_column_to_split to find + * the optimal column at which to split the second smartlist so that we are + * finding the smallest diff possible. + */ +STATIC void +calc_changes(smartlist_slice_t *slice1, + smartlist_slice_t *slice2, + bitarray_t *changed1, bitarray_t *changed2) +{ + trim_slices(slice1, slice2); + + if (slice1->len <= 1) { + set_changed(changed1, changed2, slice1, slice2); + + } else if (slice2->len <= 1) { + set_changed(changed2, changed1, slice2, slice1); + + /* Keep on splitting the slices in two. */ + } else { + smartlist_slice_t *top, *bot, *left, *right; + + /* Split the first slice in half. */ + int mid = slice1->len/2; + top = smartlist_slice(slice1->list, slice1->offset, slice1->offset+mid); + bot = smartlist_slice(slice1->list, slice1->offset+mid, + slice1->offset+slice1->len); + + /* Split the second slice by the optimal column. */ + int mid2 = optimal_column_to_split(top, bot, slice2); + left = smartlist_slice(slice2->list, slice2->offset, slice2->offset+mid2); + right = smartlist_slice(slice2->list, slice2->offset+mid2, + slice2->offset+slice2->len); + + calc_changes(top, left, changed1, changed2); + calc_changes(bot, right, changed1, changed2); + tor_free(top); + tor_free(bot); + tor_free(left); + tor_free(right); + } +} + +/* This table is from crypto.c. The SP and PAD defines are different. */ +#define NOT_VALID_BASE64 255 +#define X NOT_VALID_BASE64 +#define SP NOT_VALID_BASE64 +#define PAD NOT_VALID_BASE64 +static const uint8_t base64_compare_table[256] = { + X, X, X, X, X, X, X, X, X, SP, SP, SP, X, SP, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + SP, X, X, X, X, X, X, X, X, X, X, 62, X, X, X, 63, + 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, X, X, X, PAD, X, X, + X, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X, X, X, X, X, + X, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, + X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, +}; + +/** Helper: Get the identity hash from a router line, assuming that the line + * at least appears to be a router line and thus starts with "r ". + * + * If an identity hash is found, store it (without decoding it) in + * <b>hash_out</b>, and return 0. On failure, return -1. + */ +STATIC int +get_id_hash(const cdline_t *line, cdline_t *hash_out) +{ + if (line->len < 2) + return -1; + + /* Skip the router name. */ + const char *hash = memchr(line->s + 2, ' ', line->len - 2); + if (!hash) { + return -1; + } + + hash++; + const char *hash_end = hash; + /* Stop when the first non-base64 character is found. Use unsigned chars to + * avoid negative indexes causing crashes. + */ + while (base64_compare_table[*((unsigned char*)hash_end)] + != NOT_VALID_BASE64 && + hash_end < line->s + line->len) { + hash_end++; + } + + /* Empty hash. */ + if (hash_end == hash) { + return -1; + } + + hash_out->s = hash; + /* Always true because lines are limited to this length */ + tor_assert(hash_end >= hash); + tor_assert((size_t)(hash_end - hash) <= UINT32_MAX); + hash_out->len = (uint32_t)(hash_end - hash); + + return 0; +} + +/** Helper: Check that a line is a valid router entry. We must at least be + * able to fetch a proper identity hash from it for it to be valid. + */ +STATIC int +is_valid_router_entry(const cdline_t *line) +{ + if (line->len < 2 || fast_memneq(line->s, "r ", 2)) + return 0; + cdline_t tmp; + return (get_id_hash(line, &tmp) == 0); +} + +/** Helper: Find the next router line starting at the current position. + * Assumes that cur is lower than the length of the smartlist, i.e. it is a + * line within the bounds of the consensus. The only exception is when we + * don't want to skip the first line, in which case cur will be -1. + */ +STATIC int +next_router(const smartlist_t *cons, int cur) +{ + int len = smartlist_len(cons); + tor_assert(cur >= -1 && cur < len); + + if (++cur >= len) { + return len; + } + + const cdline_t *line = smartlist_get(cons, cur); + while (!is_valid_router_entry(line)) { + if (++cur >= len) { + return len; + } + line = smartlist_get(cons, cur); + } + return cur; +} + +/** Helper: compare two base64-encoded identity hashes, which may be of + * different lengths. Comparison ends when the first non-base64 char is found. + */ +STATIC int +base64cmp(const cdline_t *hash1, const cdline_t *hash2) +{ + /* NULL is always lower, useful for last_hash which starts at NULL. */ + if (!hash1->s && !hash2->s) { + return 0; + } + if (!hash1->s) { + return -1; + } + if (!hash2->s) { + return 1; + } + + /* Don't index with a char; char may be signed. */ + const unsigned char *a = (unsigned char*)hash1->s; + const unsigned char *b = (unsigned char*)hash2->s; + const unsigned char *a_end = a + hash1->len; + const unsigned char *b_end = b + hash2->len; + while (1) { + uint8_t av = base64_compare_table[*a]; + uint8_t bv = base64_compare_table[*b]; + if (av == NOT_VALID_BASE64) { + if (bv == NOT_VALID_BASE64) { + /* Both ended with exactly the same characters. */ + return 0; + } else { + /* hash2 goes on longer than hash1 and thus hash1 is lower. */ + return -1; + } + } else if (bv == NOT_VALID_BASE64) { + /* hash1 goes on longer than hash2 and thus hash1 is greater. */ + return 1; + } else if (av < bv) { + /* The first difference shows that hash1 is lower. */ + return -1; + } else if (av > bv) { + /* The first difference shows that hash1 is greater. */ + return 1; + } else { + a++; + b++; + if (a == a_end) { + if (b == b_end) { + return 0; + } else { + return -1; + } + } else if (b == b_end) { + return 1; + } + } + } +} + +/** Structure used to remember the previous and current identity hash of + * the "r " lines in a consensus, to enforce well-ordering. */ +typedef struct router_id_iterator_t { + cdline_t last_hash; + cdline_t hash; +} router_id_iterator_t; + +/** + * Initializer for a router_id_iterator_t. + */ +#define ROUTER_ID_ITERATOR_INIT { { NULL, 0 }, { NULL, 0 } } + +/** Given an index *<b>idxp</b> into the consensus at <b>cons</b>, advance + * the index to the next router line ("r ...") in the consensus, or to + * an index one after the end of the list if there is no such line. + * + * Use <b>iter</b> to record the hash of the found router line, if any, + * and to enforce ordering on the hashes. If the hashes are mis-ordered, + * return -1. Else, return 0. + **/ +static int +find_next_router_line(const smartlist_t *cons, + const char *consname, + int *idxp, + router_id_iterator_t *iter) +{ + *idxp = next_router(cons, *idxp); + if (*idxp < smartlist_len(cons)) { + memcpy(&iter->last_hash, &iter->hash, sizeof(cdline_t)); + if (get_id_hash(smartlist_get(cons, *idxp), &iter->hash) < 0 || + base64cmp(&iter->hash, &iter->last_hash) <= 0) { + log_warn(LD_CONSDIFF, "Refusing to generate consensus diff because " + "the %s consensus doesn't have its router entries sorted " + "properly.", consname); + return -1; + } + } + return 0; +} + +/** Line-prefix indicating the beginning of the signatures section that we + * intend to delete. */ +#define START_OF_SIGNATURES_SECTION "directory-signature " + +/** Pre-process a consensus in <b>cons</b> (represented as a list of cdline_t) + * to remove the signatures from it. If the footer is removed, return a + * cdline_t containing a delete command to delete the footer, allocated in + * <b>area</>. If no footer is removed, return NULL. + * + * We remove the signatures here because they are not themselves signed, and + * as such there might be different encodings for them. + */ +static cdline_t * +preprocess_consensus(memarea_t *area, + smartlist_t *cons) +{ + int idx; + int dirsig_idx = -1; + for (idx = 0; idx < smartlist_len(cons); ++idx) { + cdline_t *line = smartlist_get(cons, idx); + if (line_starts_with_str(line, START_OF_SIGNATURES_SECTION)) { + dirsig_idx = idx; + break; + } + } + if (dirsig_idx >= 0) { + char buf[64]; + while (smartlist_len(cons) > dirsig_idx) + smartlist_del(cons, dirsig_idx); + tor_snprintf(buf, sizeof(buf), "%d,$d", dirsig_idx+1); + return cdline_linecpy(area, buf); + } else { + return NULL; + } +} + +/** Generate an ed diff as a smartlist from two consensuses, also given as + * smartlists. Will return NULL if the diff could not be generated, which can + * happen if any lines the script had to add matched "." or if the routers + * were not properly ordered. + * + * All cdline_t objects in the resulting object are either references to lines + * in one of the inputs, or are newly allocated lines in the provided memarea. + * + * This implementation is consensus-specific. To generate an ed diff for any + * given input in quadratic time, you can replace all the code until the + * navigation in reverse order with the following: + * + * int len1 = smartlist_len(cons1); + * int len2 = smartlist_len(cons2); + * bitarray_t *changed1 = bitarray_init_zero(len1); + * bitarray_t *changed2 = bitarray_init_zero(len2); + * cons1_sl = smartlist_slice(cons1, 0, -1); + * cons2_sl = smartlist_slice(cons2, 0, -1); + * calc_changes(cons1_sl, cons2_sl, changed1, changed2); + */ +STATIC smartlist_t * +gen_ed_diff(const smartlist_t *cons1_orig, const smartlist_t *cons2, + memarea_t *area) +{ + smartlist_t *cons1 = smartlist_new(); + smartlist_add_all(cons1, cons1_orig); + cdline_t *remove_trailer = preprocess_consensus(area, cons1); + + int len1 = smartlist_len(cons1); + int len2 = smartlist_len(cons2); + smartlist_t *result = smartlist_new(); + + if (remove_trailer) { + /* There's a delete-the-trailer line at the end, so add it here. */ + smartlist_add(result, remove_trailer); + } + + /* Initialize the changed bitarrays to zero, so that calc_changes only needs + * to set the ones that matter and leave the rest untouched. + */ + bitarray_t *changed1 = bitarray_init_zero(len1); + bitarray_t *changed2 = bitarray_init_zero(len2); + int i1=-1, i2=-1; + int start1=0, start2=0; + + /* To check that hashes are ordered properly */ + router_id_iterator_t iter1 = ROUTER_ID_ITERATOR_INIT; + router_id_iterator_t iter2 = ROUTER_ID_ITERATOR_INIT; + + /* i1 and i2 are initialized at the first line of each consensus. They never + * reach past len1 and len2 respectively, since next_router doesn't let that + * happen. i1 and i2 are advanced by at least one line at each iteration as + * long as they have not yet reached len1 and len2, so the loop is + * guaranteed to end, and each pair of (i1,i2) will be inspected at most + * once. + */ + while (i1 < len1 || i2 < len2) { + + /* Advance each of the two navigation positions by one router entry if not + * yet at the end. + */ + if (i1 < len1) { + if (find_next_router_line(cons1, "base", &i1, &iter1) < 0) { + goto error_cleanup; + } + } + + if (i2 < len2) { + if (find_next_router_line(cons2, "target", &i2, &iter2) < 0) { + goto error_cleanup; + } + } + + /* If we have reached the end of both consensuses, there is no need to + * compare hashes anymore, since this is the last iteration. + */ + if (i1 < len1 || i2 < len2) { + + /* Keep on advancing the lower (by identity hash sorting) position until + * we have two matching positions. The only other possible outcome is + * that a lower position reaches the end of the consensus before it can + * reach a hash that is no longer the lower one. Since there will always + * be a lower hash for as long as the loop runs, one of the two indexes + * will always be incremented, thus assuring that the loop must end + * after a finite number of iterations. If that cannot be because said + * consensus has already reached the end, both are extended to their + * respecting ends since we are done. + */ + int cmp = base64cmp(&iter1.hash, &iter2.hash); + while (cmp != 0) { + if (i1 < len1 && cmp < 0) { + if (find_next_router_line(cons1, "base", &i1, &iter1) < 0) { + goto error_cleanup; + } + if (i1 == len1) { + /* We finished the first consensus, so grab all the remaining + * lines of the second consensus and finish up. + */ + i2 = len2; + break; + } + } else if (i2 < len2 && cmp > 0) { + if (find_next_router_line(cons2, "target", &i2, &iter2) < 0) { + goto error_cleanup; + } + if (i2 == len2) { + /* We finished the second consensus, so grab all the remaining + * lines of the first consensus and finish up. + */ + i1 = len1; + break; + } + } else { + i1 = len1; + i2 = len2; + break; + } + cmp = base64cmp(&iter1.hash, &iter2.hash); + } + } + + /* Make slices out of these chunks (up to the common router entry) and + * calculate the changes for them. + * Error if any of the two slices are longer than 10K lines. That should + * never happen with any pair of real consensuses. Feeding more than 10K + * lines to calc_changes would be very slow anyway. + */ +#define MAX_LINE_COUNT (10000) + if (i1-start1 > MAX_LINE_COUNT || i2-start2 > MAX_LINE_COUNT) { + log_warn(LD_CONSDIFF, "Refusing to generate consensus diff because " + "we found too few common router ids."); + goto error_cleanup; + } + + smartlist_slice_t *cons1_sl = smartlist_slice(cons1, start1, i1); + smartlist_slice_t *cons2_sl = smartlist_slice(cons2, start2, i2); + calc_changes(cons1_sl, cons2_sl, changed1, changed2); + tor_free(cons1_sl); + tor_free(cons2_sl); + start1 = i1, start2 = i2; + } + + /* Navigate the changes in reverse order and generate one ed command for + * each chunk of changes. + */ + i1=len1-1, i2=len2-1; + char buf[128]; + while (i1 >= 0 || i2 >= 0) { + + int start1x, start2x, end1, end2, added, deleted; + + /* We are at a point were no changed bools are true, so just keep going. */ + if (!(i1 >= 0 && bitarray_is_set(changed1, i1)) && + !(i2 >= 0 && bitarray_is_set(changed2, i2))) { + if (i1 >= 0) { + i1--; + } + if (i2 >= 0) { + i2--; + } + continue; + } + + end1 = i1, end2 = i2; + + /* Grab all contiguous changed lines */ + while (i1 >= 0 && bitarray_is_set(changed1, i1)) { + i1--; + } + while (i2 >= 0 && bitarray_is_set(changed2, i2)) { + i2--; + } + + start1x = i1+1, start2x = i2+1; + added = end2-i2, deleted = end1-i1; + + if (added == 0) { + if (deleted == 1) { + tor_snprintf(buf, sizeof(buf), "%id", start1x+1); + smartlist_add_linecpy(result, area, buf); + } else { + tor_snprintf(buf, sizeof(buf), "%i,%id", start1x+1, start1x+deleted); + smartlist_add_linecpy(result, area, buf); + } + } else { + int i; + if (deleted == 0) { + tor_snprintf(buf, sizeof(buf), "%ia", start1x); + smartlist_add_linecpy(result, area, buf); + } else if (deleted == 1) { + tor_snprintf(buf, sizeof(buf), "%ic", start1x+1); + smartlist_add_linecpy(result, area, buf); + } else { + tor_snprintf(buf, sizeof(buf), "%i,%ic", start1x+1, start1x+deleted); + smartlist_add_linecpy(result, area, buf); + } + + for (i = start2x; i <= end2; ++i) { + cdline_t *line = smartlist_get(cons2, i); + if (line_str_eq(line, ".")) { + log_warn(LD_CONSDIFF, "Cannot generate consensus diff because " + "one of the lines to be added is \".\"."); + goto error_cleanup; + } + smartlist_add(result, line); + } + smartlist_add_linecpy(result, area, "."); + } + } + + smartlist_free(cons1); + bitarray_free(changed1); + bitarray_free(changed2); + + return result; + + error_cleanup: + + smartlist_free(cons1); + bitarray_free(changed1); + bitarray_free(changed2); + + smartlist_free(result); + + return NULL; +} + +/* Helper: Read a base-10 number between 0 and INT32_MAX from <b>s</b> and + * store it in <b>num_out</b>. Advance <b>s</b> to the characer immediately + * after the number. Return 0 on success, -1 on failure. */ +static int +get_linenum(const char **s, int *num_out) +{ + int ok; + char *next; + if (!TOR_ISDIGIT(**s)) { + return -1; + } + *num_out = (int) tor_parse_long(*s, 10, 0, INT32_MAX, &ok, &next); + if (ok && next) { + *s = next; + return 0; + } else { + return -1; + } +} + +/** Apply the ed diff, starting at <b>diff_starting_line</b>, to the consensus + * and return a new consensus, also as a line-based smartlist. Will return + * NULL if the ed diff is not properly formatted. + * + * All cdline_t objects in the resulting object are references to lines + * in one of the inputs; nothing is copied. + */ +STATIC smartlist_t * +apply_ed_diff(const smartlist_t *cons1, const smartlist_t *diff, + int diff_starting_line) +{ + int diff_len = smartlist_len(diff); + int j = smartlist_len(cons1); + smartlist_t *cons2 = smartlist_new(); + + for (int i=diff_starting_line; i<diff_len; ++i) { + const cdline_t *diff_cdline = smartlist_get(diff, i); + char diff_line[128]; + + if (diff_cdline->len > sizeof(diff_line) - 1) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an ed command was far too long"); + goto error_cleanup; + } + /* Copy the line to make it nul-terminated. */ + memcpy(diff_line, diff_cdline->s, diff_cdline->len); + diff_line[diff_cdline->len] = 0; + const char *ptr = diff_line; + int start = 0, end = 0; + int had_range = 0; + int end_was_eof = 0; + if (get_linenum(&ptr, &start) < 0) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an ed command was missing a line number."); + goto error_cleanup; + } + if (*ptr == ',') { + /* Two-item range */ + had_range = 1; + ++ptr; + if (*ptr == '$') { + end_was_eof = 1; + end = smartlist_len(cons1); + ++ptr; + } else if (get_linenum(&ptr, &end) < 0) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an ed command was missing a range end line number."); + goto error_cleanup; + } + /* Incoherent range. */ + if (end <= start) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an invalid range was found in an ed command."); + goto error_cleanup; + } + } else { + /* We'll take <n1> as <n1>,<n1> for simplicity. */ + end = start; + } + + if (end > j) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "its commands are not properly sorted in reverse order."); + goto error_cleanup; + } + + if (*ptr == '\0') { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "a line with no ed command was found"); + goto error_cleanup; + } + + if (*(ptr+1) != '\0') { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an ed command longer than one char was found."); + goto error_cleanup; + } + + char action = *ptr; + + switch (action) { + case 'a': + case 'c': + case 'd': + break; + default: + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "an unrecognised ed command was found."); + goto error_cleanup; + } + + /** $ is not allowed with non-d actions. */ + if (end_was_eof && action != 'd') { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "it wanted to use $ with a command other than delete"); + goto error_cleanup; + } + + /* 'a' commands are not allowed to have ranges. */ + if (had_range && action == 'a') { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "it wanted to add lines after a range."); + goto error_cleanup; + } + + /* Add unchanged lines. */ + for (; j && j > end; --j) { + cdline_t *cons_line = smartlist_get(cons1, j-1); + smartlist_add(cons2, cons_line); + } + + /* Ignore removed lines. */ + if (action == 'c' || action == 'd') { + while (--j >= start) { + /* Skip line */ + } + } + + /* Add new lines in reverse order, since it will all be reversed at the + * end. + */ + if (action == 'a' || action == 'c') { + int added_end = i; + + i++; /* Skip the line with the range and command. */ + while (i < diff_len) { + if (line_str_eq(smartlist_get(diff, i), ".")) { + break; + } + if (++i == diff_len) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "it has lines to be inserted that don't end with a \".\"."); + goto error_cleanup; + } + } + + int added_i = i-1; + + /* It would make no sense to add zero new lines. */ + if (added_i == added_end) { + log_warn(LD_CONSDIFF, "Could not apply consensus diff because " + "it has an ed command that tries to insert zero lines."); + goto error_cleanup; + } + + while (added_i > added_end) { + cdline_t *added_line = smartlist_get(diff, added_i--); + smartlist_add(cons2, added_line); + } + } + } + + /* Add remaining unchanged lines. */ + for (; j > 0; --j) { + cdline_t *cons_line = smartlist_get(cons1, j-1); + smartlist_add(cons2, cons_line); + } + + /* Reverse the whole thing since we did it from the end. */ + smartlist_reverse(cons2); + return cons2; + + error_cleanup: + + smartlist_free(cons2); + + return NULL; +} + +/** Generate a consensus diff as a smartlist from two given consensuses, also + * as smartlists. Will return NULL if the consensus diff could not be + * generated. Neither of the two consensuses are modified in any way, so it's + * up to the caller to free their resources. + */ +smartlist_t * +consdiff_gen_diff(const smartlist_t *cons1, + const smartlist_t *cons2, + const consensus_digest_t *digests1, + const consensus_digest_t *digests2, + memarea_t *area) +{ + smartlist_t *ed_diff = gen_ed_diff(cons1, cons2, area); + /* ed diff could not be generated - reason already logged by gen_ed_diff. */ + if (!ed_diff) { + goto error_cleanup; + } + + /* See that the script actually produces what we want. */ + smartlist_t *ed_cons2 = apply_ed_diff(cons1, ed_diff, 0); + if (!ed_cons2) { + /* LCOV_EXCL_START -- impossible if diff generation is correct */ + log_warn(LD_BUG|LD_CONSDIFF, "Refusing to generate consensus diff because " + "the generated ed diff could not be tested to successfully generate " + "the target consensus."); + goto error_cleanup; + /* LCOV_EXCL_STOP */ + } + + int cons2_eq = 1; + if (smartlist_len(cons2) == smartlist_len(ed_cons2)) { + SMARTLIST_FOREACH_BEGIN(cons2, const cdline_t *, line1) { + const cdline_t *line2 = smartlist_get(ed_cons2, line1_sl_idx); + if (! lines_eq(line1, line2) ) { + cons2_eq = 0; + break; + } + } SMARTLIST_FOREACH_END(line1); + } else { + cons2_eq = 0; + } + smartlist_free(ed_cons2); + if (!cons2_eq) { + /* LCOV_EXCL_START -- impossible if diff generation is correct. */ + log_warn(LD_BUG|LD_CONSDIFF, "Refusing to generate consensus diff because " + "the generated ed diff did not generate the target consensus " + "successfully when tested."); + goto error_cleanup; + /* LCOV_EXCL_STOP */ + } + + char cons1_hash_hex[HEX_DIGEST256_LEN+1]; + char cons2_hash_hex[HEX_DIGEST256_LEN+1]; + base16_encode(cons1_hash_hex, HEX_DIGEST256_LEN+1, + (const char*)digests1->sha3_256, DIGEST256_LEN); + base16_encode(cons2_hash_hex, HEX_DIGEST256_LEN+1, + (const char*)digests2->sha3_256, DIGEST256_LEN); + + /* Create the resulting consensus diff. */ + char buf[160]; + smartlist_t *result = smartlist_new(); + tor_snprintf(buf, sizeof(buf), "%s", ns_diff_version); + smartlist_add_linecpy(result, area, buf); + tor_snprintf(buf, sizeof(buf), "%s %s %s", hash_token, + cons1_hash_hex, cons2_hash_hex); + smartlist_add_linecpy(result, area, buf); + smartlist_add_all(result, ed_diff); + smartlist_free(ed_diff); + return result; + + error_cleanup: + + if (ed_diff) { + /* LCOV_EXCL_START -- ed_diff is NULL except in unreachable cases above */ + smartlist_free(ed_diff); + /* LCOV_EXCL_STOP */ + } + + return NULL; +} + +/** Fetch the digest of the base consensus in the consensus diff, encoded in + * base16 as found in the diff itself. digest1_out and digest2_out must be of + * length DIGEST256_LEN or larger if not NULL. + */ +int +consdiff_get_digests(const smartlist_t *diff, + char *digest1_out, + char *digest2_out) +{ + smartlist_t *hash_words = NULL; + const cdline_t *format; + char cons1_hash[DIGEST256_LEN], cons2_hash[DIGEST256_LEN]; + char *cons1_hash_hex, *cons2_hash_hex; + if (smartlist_len(diff) < 2) { + log_info(LD_CONSDIFF, "The provided consensus diff is too short."); + goto error_cleanup; + } + + /* Check that it's the format and version we know. */ + format = smartlist_get(diff, 0); + if (!line_str_eq(format, ns_diff_version)) { + log_warn(LD_CONSDIFF, "The provided consensus diff format is not known."); + goto error_cleanup; + } + + /* Grab the base16 digests. */ + hash_words = smartlist_new(); + { + const cdline_t *line2 = smartlist_get(diff, 1); + char *h = tor_memdup_nulterm(line2->s, line2->len); + smartlist_split_string(hash_words, h, " ", 0, 0); + tor_free(h); + } + + /* There have to be three words, the first of which must be hash_token. */ + if (smartlist_len(hash_words) != 3 || + strcmp(smartlist_get(hash_words, 0), hash_token)) { + log_info(LD_CONSDIFF, "The provided consensus diff does not include " + "the necessary digests."); + goto error_cleanup; + } + + /* Expected hashes as found in the consensus diff header. They must be of + * length HEX_DIGEST256_LEN, normally 64 hexadecimal characters. + * If any of the decodings fail, error to make sure that the hashes are + * proper base16-encoded digests. + */ + cons1_hash_hex = smartlist_get(hash_words, 1); + cons2_hash_hex = smartlist_get(hash_words, 2); + if (strlen(cons1_hash_hex) != HEX_DIGEST256_LEN || + strlen(cons2_hash_hex) != HEX_DIGEST256_LEN) { + log_info(LD_CONSDIFF, "The provided consensus diff includes " + "base16-encoded digests of incorrect size."); + goto error_cleanup; + } + + if (base16_decode(cons1_hash, DIGEST256_LEN, + cons1_hash_hex, HEX_DIGEST256_LEN) != DIGEST256_LEN || + base16_decode(cons2_hash, DIGEST256_LEN, + cons2_hash_hex, HEX_DIGEST256_LEN) != DIGEST256_LEN) { + log_info(LD_CONSDIFF, "The provided consensus diff includes " + "malformed digests."); + goto error_cleanup; + } + + if (digest1_out) { + memcpy(digest1_out, cons1_hash, DIGEST256_LEN); + } + if (digest2_out) { + memcpy(digest2_out, cons2_hash, DIGEST256_LEN); + } + + SMARTLIST_FOREACH(hash_words, char *, cp, tor_free(cp)); + smartlist_free(hash_words); + return 0; + + error_cleanup: + + if (hash_words) { + SMARTLIST_FOREACH(hash_words, char *, cp, tor_free(cp)); + smartlist_free(hash_words); + } + return 1; +} + +/** Apply the consensus diff to the given consensus and return a new + * consensus, also as a line-based smartlist. Will return NULL if the diff + * could not be applied. Neither the consensus nor the diff are modified in + * any way, so it's up to the caller to free their resources. + */ +char * +consdiff_apply_diff(const smartlist_t *cons1, + const smartlist_t *diff, + const consensus_digest_t *digests1) +{ + smartlist_t *cons2 = NULL; + char *cons2_str = NULL; + char e_cons1_hash[DIGEST256_LEN]; + char e_cons2_hash[DIGEST256_LEN]; + + if (consdiff_get_digests(diff, e_cons1_hash, e_cons2_hash) != 0) { + goto error_cleanup; + } + + /* See that the consensus that was given to us matches its hash. */ + if (!consensus_digest_eq(digests1->sha3_256, + (const uint8_t*)e_cons1_hash)) { + char hex_digest1[HEX_DIGEST256_LEN+1]; + char e_hex_digest1[HEX_DIGEST256_LEN+1]; + log_warn(LD_CONSDIFF, "Refusing to apply consensus diff because " + "the base consensus doesn't match the digest as found in " + "the consensus diff header."); + base16_encode(hex_digest1, HEX_DIGEST256_LEN+1, + (const char *)digests1->sha3_256, DIGEST256_LEN); + base16_encode(e_hex_digest1, HEX_DIGEST256_LEN+1, + e_cons1_hash, DIGEST256_LEN); + log_warn(LD_CONSDIFF, "Expected: %s; found: %s", + hex_digest1, e_hex_digest1); + goto error_cleanup; + } + + /* Grab the ed diff and calculate the resulting consensus. */ + /* Skip the first two lines. */ + cons2 = apply_ed_diff(cons1, diff, 2); + + /* ed diff could not be applied - reason already logged by apply_ed_diff. */ + if (!cons2) { + goto error_cleanup; + } + + cons2_str = consensus_join_lines(cons2); + + consensus_digest_t cons2_digests; + if (consensus_compute_digest(cons2_str, &cons2_digests) < 0) { + /* LCOV_EXCL_START -- digest can't fail */ + log_warn(LD_CONSDIFF, "Could not compute digests of the consensus " + "resulting from applying a consensus diff."); + goto error_cleanup; + /* LCOV_EXCL_STOP */ + } + + /* See that the resulting consensus matches its hash. */ + if (!consensus_digest_eq(cons2_digests.sha3_256, + (const uint8_t*)e_cons2_hash)) { + log_warn(LD_CONSDIFF, "Refusing to apply consensus diff because " + "the resulting consensus doesn't match the digest as found in " + "the consensus diff header."); + char hex_digest2[HEX_DIGEST256_LEN+1]; + char e_hex_digest2[HEX_DIGEST256_LEN+1]; + base16_encode(hex_digest2, HEX_DIGEST256_LEN+1, + (const char *)cons2_digests.sha3_256, DIGEST256_LEN); + base16_encode(e_hex_digest2, HEX_DIGEST256_LEN+1, + e_cons2_hash, DIGEST256_LEN); + log_warn(LD_CONSDIFF, "Expected: %s; found: %s", + hex_digest2, e_hex_digest2); + goto error_cleanup; + } + + goto done; + + error_cleanup: + tor_free(cons2_str); /* Sets it to NULL */ + + done: + if (cons2) { + smartlist_free(cons2); + } + + return cons2_str; +} + +/** Any consensus line longer than this means that the input is invalid. */ +#define CONSENSUS_LINE_MAX_LEN (1<<20) + +/** + * Helper: For every NL-terminated line in <b>s</b>, add a cdline referring to + * that line (without trailing newline) to <b>out</b>. Return -1 if there are + * any non-NL terminated lines; 0 otherwise. + * + * Unlike tor_split_lines, this function avoids ambiguity on its + * handling of a final line that isn't NL-terminated. + * + * All cdline_t objects are allocated in the provided memarea. Strings + * are not copied: if <b>s</b> changes or becomes invalid, then all + * generated cdlines will become invalid. + */ +STATIC int +consensus_split_lines(smartlist_t *out, const char *s, memarea_t *area) +{ + while (*s) { + const char *eol = strchr(s, '\n'); + if (!eol) { + /* File doesn't end with newline. */ + return -1; + } + if (eol - s > CONSENSUS_LINE_MAX_LEN) { + /* Line is far too long. */ + return -1; + } + cdline_t *line = memarea_alloc(area, sizeof(cdline_t)); + line->s = s; + line->len = (uint32_t)(eol - s); + smartlist_add(out, line); + s = eol+1; + } + return 0; +} + +/** Given a list of cdline_t, return a newly allocated string containing + * all of the lines, terminated with NL, concatenated. + * + * Unlike smartlist_join_strings(), avoids lossy operations on empty + * lists. */ +static char * +consensus_join_lines(const smartlist_t *inp) +{ + size_t n = 0; + SMARTLIST_FOREACH(inp, const cdline_t *, cdline, n += cdline->len + 1); + n += 1; + char *result = tor_malloc(n); + char *out = result; + SMARTLIST_FOREACH_BEGIN(inp, const cdline_t *, cdline) { + memcpy(out, cdline->s, cdline->len); + out += cdline->len; + *out++ = '\n'; + } SMARTLIST_FOREACH_END(cdline); + *out++ = '\0'; + tor_assert(out == result+n); + return result; +} + +/** Given two consensus documents, try to compute a diff between them. On + * success, retun a newly allocated string containing that diff. On failure, + * return NULL. */ +char * +consensus_diff_generate(const char *cons1, + const char *cons2) +{ + consensus_digest_t d1, d2; + smartlist_t *lines1 = NULL, *lines2 = NULL, *result_lines = NULL; + int r1, r2; + char *result = NULL; + + r1 = consensus_compute_digest_as_signed(cons1, &d1); + r2 = consensus_compute_digest(cons2, &d2); + if (BUG(r1 < 0 || r2 < 0)) + return NULL; // LCOV_EXCL_LINE + + memarea_t *area = memarea_new(); + lines1 = smartlist_new(); + lines2 = smartlist_new(); + if (consensus_split_lines(lines1, cons1, area) < 0) + goto done; + if (consensus_split_lines(lines2, cons2, area) < 0) + goto done; + + result_lines = consdiff_gen_diff(lines1, lines2, &d1, &d2, area); + + done: + if (result_lines) { + result = consensus_join_lines(result_lines); + smartlist_free(result_lines); + } + + memarea_drop_all(area); + smartlist_free(lines1); + smartlist_free(lines2); + + return result; +} + +/** Given a consensus document and a diff, try to apply the diff to the + * consensus. On success return a newly allocated string containing the new + * consensus. On failure, return NULL. */ +char * +consensus_diff_apply(const char *consensus, + const char *diff) +{ + consensus_digest_t d1; + smartlist_t *lines1 = NULL, *lines2 = NULL; + int r1; + char *result = NULL; + memarea_t *area = memarea_new(); + + r1 = consensus_compute_digest_as_signed(consensus, &d1); + if (BUG(r1 < 0)) + return NULL; // LCOV_EXCL_LINE + + lines1 = smartlist_new(); + lines2 = smartlist_new(); + if (consensus_split_lines(lines1, consensus, area) < 0) + goto done; + if (consensus_split_lines(lines2, diff, area) < 0) + goto done; + + result = consdiff_apply_diff(lines1, lines2, &d1); + + done: + smartlist_free(lines1); + smartlist_free(lines2); + memarea_drop_all(area); + + return result; +} + +/** Return true iff, based on its header, <b>document</b> is likely + * to be a consensus diff. */ +int +looks_like_a_consensus_diff(const char *document, size_t len) +{ + return (len >= strlen(ns_diff_version) && + fast_memeq(document, ns_diff_version, strlen(ns_diff_version))); +} + diff --git a/src/or/consdiff.h b/src/or/consdiff.h new file mode 100644 index 0000000000..d05df74b75 --- /dev/null +++ b/src/or/consdiff.h @@ -0,0 +1,98 @@ +/* Copyright (c) 2014, Daniel Martà + * Copyright (c) 2014, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_CONSDIFF_H +#define TOR_CONSDIFF_H + +#include "or.h" + +char *consensus_diff_generate(const char *cons1, + const char *cons2); +char *consensus_diff_apply(const char *consensus, + const char *diff); + +int looks_like_a_consensus_diff(const char *document, size_t len); + +#ifdef CONSDIFF_PRIVATE +struct memarea_t; + +/** Line type used for constructing consensus diffs. Each of these lines + * refers to a chunk of memory allocated elsewhere, and is not necessarily + * NUL-terminated: this helps us avoid copies and save memory. */ +typedef struct cdline_t { + const char *s; + uint32_t len; +} cdline_t; + +typedef struct consensus_digest_t { + uint8_t sha3_256[DIGEST256_LEN]; +} consensus_digest_t; + +STATIC smartlist_t *consdiff_gen_diff(const smartlist_t *cons1, + const smartlist_t *cons2, + const consensus_digest_t *digests1, + const consensus_digest_t *digests2, + struct memarea_t *area); +STATIC char *consdiff_apply_diff(const smartlist_t *cons1, + const smartlist_t *diff, + const consensus_digest_t *digests1); +STATIC int consdiff_get_digests(const smartlist_t *diff, + char *digest1_out, + char *digest2_out); + +/** Data structure to define a slice of a smarltist. */ +typedef struct smartlist_slice_t { + /** + * Smartlist that this slice is made from. + * References the whole original smartlist that the slice was made out of. + * */ + const smartlist_t *list; + /** Starting position of the slice in the smartlist. */ + int offset; + /** Length of the slice, i.e. the number of elements it holds. */ + int len; +} smartlist_slice_t; +STATIC smartlist_t *gen_ed_diff(const smartlist_t *cons1, + const smartlist_t *cons2, + struct memarea_t *area); +STATIC smartlist_t *apply_ed_diff(const smartlist_t *cons1, + const smartlist_t *diff, + int start_line); +STATIC void calc_changes(smartlist_slice_t *slice1, smartlist_slice_t *slice2, + bitarray_t *changed1, bitarray_t *changed2); +STATIC smartlist_slice_t *smartlist_slice(const smartlist_t *list, + int start, int end); +STATIC int next_router(const smartlist_t *cons, int cur); +STATIC int *lcs_lengths(const smartlist_slice_t *slice1, + const smartlist_slice_t *slice2, + int direction); +STATIC void trim_slices(smartlist_slice_t *slice1, smartlist_slice_t *slice2); +STATIC int base64cmp(const cdline_t *hash1, const cdline_t *hash2); +STATIC int get_id_hash(const cdline_t *line, cdline_t *hash_out); +STATIC int is_valid_router_entry(const cdline_t *line); +STATIC int smartlist_slice_string_pos(const smartlist_slice_t *slice, + const cdline_t *string); +STATIC void set_changed(bitarray_t *changed1, bitarray_t *changed2, + const smartlist_slice_t *slice1, + const smartlist_slice_t *slice2); +STATIC int consensus_split_lines(smartlist_t *out, const char *s, + struct memarea_t *area); +STATIC void smartlist_add_linecpy(smartlist_t *lst, struct memarea_t *area, + const char *s); +STATIC int lines_eq(const cdline_t *a, const cdline_t *b); +STATIC int line_str_eq(const cdline_t *a, const char *b); + +MOCK_DECL(STATIC int, + consensus_compute_digest,(const char *cons, + consensus_digest_t *digest_out)); +MOCK_DECL(STATIC int, + consensus_compute_digest_as_signed,(const char *cons, + consensus_digest_t *digest_out)); +MOCK_DECL(STATIC int, + consensus_digest_eq,(const uint8_t *d1, + const uint8_t *d2)); +#endif + +#endif + diff --git a/src/or/consdiffmgr.c b/src/or/consdiffmgr.c new file mode 100644 index 0000000000..d478101c6b --- /dev/null +++ b/src/or/consdiffmgr.c @@ -0,0 +1,1410 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file consdiffmsr.c + * + * \brief consensus diff manager functions + * + * This module is run by directory authorities and caches in order + * to remember a number of past consensus documents, and to generate + * and serve the diffs from those documents to the latest consensus. + */ + +#define CONSDIFFMGR_PRIVATE + +#include "or.h" +#include "conscache.h" +#include "consdiff.h" +#include "consdiffmgr.h" +#include "cpuworker.h" +#include "networkstatus.h" +#include "routerparse.h" +#include "workqueue.h" + +/** + * Labels to apply to items in the conscache object. + * + * @{ + */ +/* One of DOCTYPE_CONSENSUS or DOCTYPE_CONSENSUS_DIFF */ +#define LABEL_DOCTYPE "document-type" +/* The valid-after time for a consensus (or for the target consensus of a + * diff), encoded as ISO UTC. */ +#define LABEL_VALID_AFTER "consensus-valid-after" +/* A hex encoded SHA3 digest of the object, as compressed (if any) */ +#define LABEL_SHA3_DIGEST "sha3-digest" +/* A hex encoded SHA3 digest of the object before compression. */ +#define LABEL_SHA3_DIGEST_UNCOMPRESSED "sha3-digest-uncompressed" +/* A hex encoded SHA3 digest-as-signed of a consensus */ +#define LABEL_SHA3_DIGEST_AS_SIGNED "sha3-digest-as-signed" +/* The flavor of the consensus or consensuses diff */ +#define LABEL_FLAVOR "consensus-flavor" +/* Diff only: the SHA3 digest-as-signed of the source consensus. */ +#define LABEL_FROM_SHA3_DIGEST "from-sha3-digest" +/* Diff only: the SHA3 digest-in-full of the target consensus. */ +#define LABEL_TARGET_SHA3_DIGEST "target-sha3-digest" +/* Diff only: the valid-after date of the source consensus. */ +#define LABEL_FROM_VALID_AFTER "from-valid-after" +/* What kind of compression was used? */ +#define LABEL_COMPRESSION_TYPE "compression" +/** @} */ + +#define DOCTYPE_CONSENSUS "consensus" +#define DOCTYPE_CONSENSUS_DIFF "consensus-diff" + +/** + * Underlying directory that stores consensuses and consensus diffs. Don't + * use this directly: use cdm_cache_get() instead. + */ +static consensus_cache_t *cons_diff_cache = NULL; +/** + * If true, we have learned at least one new consensus since the + * consensus cache was last up-to-date. + */ +static int cdm_cache_dirty = 0; +/** + * If true, we have scanned the cache to update our hashtable of diffs. + */ +static int cdm_cache_loaded = 0; + +/** + * Possible status values for cdm_diff_t.cdm_diff_status + **/ +typedef enum cdm_diff_status_t { + CDM_DIFF_PRESENT=1, + CDM_DIFF_IN_PROGRESS=2, + CDM_DIFF_ERROR=3, +} cdm_diff_status_t; + +/** Which methods do we use for precompressing diffs? */ +static const compress_method_t compress_diffs_with[] = { + NO_METHOD, + GZIP_METHOD, +#ifdef HAVE_LZMA + LZMA_METHOD, +#endif +#ifdef HAVE_ZSTD + ZSTD_METHOD, +#endif +}; + +/** How many different methods will we try to use for diff compression? */ +STATIC unsigned +n_diff_compression_methods(void) +{ + return ARRAY_LENGTH(compress_diffs_with); +} + +/** Hashtable node used to remember the current status of the diff + * from a given sha3 digest to the current consensus. */ +typedef struct cdm_diff_t { + HT_ENTRY(cdm_diff_t) node; + + /** Consensus flavor for this diff (part of ht key) */ + consensus_flavor_t flavor; + /** SHA3-256 digest of the consensus that this diff is _from_. (part of the + * ht key) */ + uint8_t from_sha3[DIGEST256_LEN]; + /** Method by which the diff is compressed. (part of the ht key */ + compress_method_t compress_method; + + /** One of the CDM_DIFF_* values, depending on whether this diff + * is available, in progress, or impossible to compute. */ + cdm_diff_status_t cdm_diff_status; + /** SHA3-256 digest of the consensus that this diff is _to. */ + uint8_t target_sha3[DIGEST256_LEN]; + + /** Handle to the cache entry for this diff, if any. We use a handle here + * to avoid thinking too hard about cache entry lifetime issues. */ + consensus_cache_entry_handle_t *entry; +} cdm_diff_t; + +/** Hashtable mapping flavor and source consensus digest to status. */ +static HT_HEAD(cdm_diff_ht, cdm_diff_t) cdm_diff_ht = HT_INITIALIZER(); + +/** + * Configuration for this module + */ +static consdiff_cfg_t consdiff_cfg = { + /* .cache_max_age_hours = */ 24 * 90, + // XXXX I'd like to make this number bigger, but it interferes with the + // XXXX seccomp2 syscall filter, which tops out at BPF_MAXINS (4096) + // XXXX rules. + /* .cache_max_num = */ 128 +}; + +static int consdiffmgr_ensure_space_for_files(int n); +static int consensus_diff_queue_diff_work(consensus_cache_entry_t *diff_from, + consensus_cache_entry_t *diff_to); +static void consdiffmgr_set_cache_flags(void); + +/* Just gzip consensuses for now. */ +#define COMPRESS_CONSENSUS_WITH GZIP_METHOD + +/* ===== + * Hashtable setup + * ===== */ + +/** Helper: hash the key of a cdm_diff_t. */ +static unsigned +cdm_diff_hash(const cdm_diff_t *diff) +{ + uint8_t tmp[DIGEST256_LEN + 2]; + memcpy(tmp, diff->from_sha3, DIGEST256_LEN); + tmp[DIGEST256_LEN] = (uint8_t) diff->flavor; + tmp[DIGEST256_LEN+1] = (uint8_t) diff->compress_method; + return (unsigned) siphash24g(tmp, sizeof(tmp)); +} +/** Helper: compare two cdm_diff_t objects for key equality */ +static int +cdm_diff_eq(const cdm_diff_t *diff1, const cdm_diff_t *diff2) +{ + return fast_memeq(diff1->from_sha3, diff2->from_sha3, DIGEST256_LEN) && + diff1->flavor == diff2->flavor && + diff1->compress_method == diff2->compress_method; +} + +HT_PROTOTYPE(cdm_diff_ht, cdm_diff_t, node, cdm_diff_hash, cdm_diff_eq) +HT_GENERATE2(cdm_diff_ht, cdm_diff_t, node, cdm_diff_hash, cdm_diff_eq, + 0.6, tor_reallocarray, tor_free_) + +/** Release all storage held in <b>diff</b>. */ +static void +cdm_diff_free(cdm_diff_t *diff) +{ + if (!diff) + return; + consensus_cache_entry_handle_free(diff->entry); + tor_free(diff); +} + +/** Create and return a new cdm_diff_t with the given values. Does not + * add it to the hashtable. */ +static cdm_diff_t * +cdm_diff_new(consensus_flavor_t flav, + const uint8_t *from_sha3, + const uint8_t *target_sha3, + compress_method_t method) +{ + cdm_diff_t *ent; + ent = tor_malloc_zero(sizeof(cdm_diff_t)); + ent->flavor = flav; + memcpy(ent->from_sha3, from_sha3, DIGEST256_LEN); + memcpy(ent->target_sha3, target_sha3, DIGEST256_LEN); + ent->compress_method = method; + return ent; +} + +/** + * Examine the diff hashtable to see whether we know anything about computing + * a diff of type <b>flav</b> between consensuses with the two provided + * SHA3-256 digests. If a computation is in progress, or if the computation + * has already been tried and failed, return 1. Otherwise, note the + * computation as "in progress" so that we don't reattempt it later, and + * return 0. + */ +static int +cdm_diff_ht_check_and_note_pending(consensus_flavor_t flav, + const uint8_t *from_sha3, + const uint8_t *target_sha3) +{ + struct cdm_diff_t search, *ent; + unsigned u; + int result = 0; + for (u = 0; u < n_diff_compression_methods(); ++u) { + compress_method_t method = compress_diffs_with[u]; + memset(&search, 0, sizeof(cdm_diff_t)); + search.flavor = flav; + search.compress_method = method; + memcpy(search.from_sha3, from_sha3, DIGEST256_LEN); + ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search); + if (ent) { + tor_assert_nonfatal(ent->cdm_diff_status != CDM_DIFF_PRESENT); + result = 1; + continue; + } + ent = cdm_diff_new(flav, from_sha3, target_sha3, method); + ent->cdm_diff_status = CDM_DIFF_IN_PROGRESS; + HT_INSERT(cdm_diff_ht, &cdm_diff_ht, ent); + } + return result; +} + +/** + * Update the status of the diff of type <b>flav</b> between consensuses with + * the two provided SHA3-256 digests, so that its status becomes + * <b>status</b>, and its value becomes the <b>handle</b>. If <b>handle</b> + * is NULL, then the old handle (if any) is freed, and replaced with NULL. + */ +static void +cdm_diff_ht_set_status(consensus_flavor_t flav, + const uint8_t *from_sha3, + const uint8_t *to_sha3, + compress_method_t method, + int status, + consensus_cache_entry_handle_t *handle) +{ + struct cdm_diff_t search, *ent; + memset(&search, 0, sizeof(cdm_diff_t)); + search.flavor = flav; + search.compress_method = method, + memcpy(search.from_sha3, from_sha3, DIGEST256_LEN); + ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search); + if (!ent) { + ent = cdm_diff_new(flav, from_sha3, to_sha3, method); + ent->cdm_diff_status = CDM_DIFF_IN_PROGRESS; + HT_INSERT(cdm_diff_ht, &cdm_diff_ht, ent); + } else if (fast_memneq(ent->target_sha3, to_sha3, DIGEST256_LEN)) { + // This can happen under certain really pathological conditions + // if we decide we don't care about a diff before it is actually + // done computing. + return; + } + + tor_assert_nonfatal(ent->cdm_diff_status == CDM_DIFF_IN_PROGRESS); + + ent->cdm_diff_status = status; + consensus_cache_entry_handle_free(ent->entry); + ent->entry = handle; +} + +/** + * Helper: Remove from the hash table every present (actually computed) diff + * of type <b>flav</b> whose target digest does not match + * <b>unless_target_sha3_matches</b>. + * + * This function is used for the hash table to throw away references to diffs + * that do not lead to the most given consensus of a given flavor. + */ +static void +cdm_diff_ht_purge(consensus_flavor_t flav, + const uint8_t *unless_target_sha3_matches) +{ + cdm_diff_t **diff, **next; + for (diff = HT_START(cdm_diff_ht, &cdm_diff_ht); diff; diff = next) { + cdm_diff_t *this = *diff; + + if ((*diff)->cdm_diff_status == CDM_DIFF_PRESENT && + flav == (*diff)->flavor) { + + if (consensus_cache_entry_handle_get((*diff)->entry) == NULL) { + /* the underlying entry has gone away; drop this. */ + next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff); + cdm_diff_free(this); + continue; + } + + if (unless_target_sha3_matches && + fast_memneq(unless_target_sha3_matches, (*diff)->target_sha3, + DIGEST256_LEN)) { + /* target hash doesn't match; drop this. */ + next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff); + cdm_diff_free(this); + continue; + } + } + next = HT_NEXT(cdm_diff_ht, &cdm_diff_ht, diff); + } +} + +/** + * Helper: initialize <b>cons_diff_cache</b>. + */ +static void +cdm_cache_init(void) +{ + unsigned n_entries = consdiff_cfg.cache_max_num * 2; + + tor_assert(cons_diff_cache == NULL); + cons_diff_cache = consensus_cache_open("diff-cache", n_entries); + if (cons_diff_cache == NULL) { + // LCOV_EXCL_START + log_err(LD_FS, "Error: Couldn't open storage for consensus diffs."); + tor_assert_unreached(); + // LCOV_EXCL_STOP + } else { + consdiffmgr_set_cache_flags(); + } + cdm_cache_dirty = 1; + cdm_cache_loaded = 0; +} + +/** + * Helper: return the consensus_cache_t * that backs this manager, + * initializing it if needed. + */ +STATIC consensus_cache_t * +cdm_cache_get(void) +{ + if (PREDICT_UNLIKELY(cons_diff_cache == NULL)) { + cdm_cache_init(); + } + return cons_diff_cache; +} + +/** + * Helper: given a list of labels, prepend the hex-encoded SHA3 digest + * of the <b>bodylen</b>-byte object at <b>body</b> to those labels, + * with <b>label</b> as its label. + */ +static void +cdm_labels_prepend_sha3(config_line_t **labels, + const char *label, + const uint8_t *body, + size_t bodylen) +{ + uint8_t sha3_digest[DIGEST256_LEN]; + char hexdigest[HEX_DIGEST256_LEN+1]; + crypto_digest256((char *)sha3_digest, + (const char *)body, bodylen, DIGEST_SHA3_256); + base16_encode(hexdigest, sizeof(hexdigest), + (const char *)sha3_digest, sizeof(sha3_digest)); + + config_line_prepend(labels, label, hexdigest); +} + +/** Helper: if there is a sha3-256 hex-encoded digest in <b>ent</b> with the + * given label, set <b>digest_out</b> to that value (decoded), and return 0. + * + * Return -1 if there is no such label, and -2 if it is badly formatted. */ +STATIC int +cdm_entry_get_sha3_value(uint8_t *digest_out, + consensus_cache_entry_t *ent, + const char *label) +{ + if (ent == NULL) + return -1; + + const char *hex = consensus_cache_entry_get_value(ent, label); + if (hex == NULL) + return -1; + + int n = base16_decode((char*)digest_out, DIGEST256_LEN, hex, strlen(hex)); + if (n != DIGEST256_LEN) + return -2; + else + return 0; +} + +/** + * Helper: look for a consensus with the given <b>flavor</b> and + * <b>valid_after</b> time in the cache. Return that consensus if it's + * present, or NULL if it's missing. + */ +STATIC consensus_cache_entry_t * +cdm_cache_lookup_consensus(consensus_flavor_t flavor, time_t valid_after) +{ + char formatted_time[ISO_TIME_LEN+1]; + format_iso_time_nospace(formatted_time, valid_after); + const char *flavname = networkstatus_get_flavor_name(flavor); + + /* We'll filter by valid-after time first, since that should + * match the fewest documents. */ + /* We could add an extra hashtable here, but since we only do this scan + * when adding a new consensus, it probably doesn't matter much. */ + smartlist_t *matches = smartlist_new(); + consensus_cache_find_all(matches, cdm_cache_get(), + LABEL_VALID_AFTER, formatted_time); + consensus_cache_filter_list(matches, LABEL_FLAVOR, flavname); + consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); + + consensus_cache_entry_t *result = NULL; + if (smartlist_len(matches) > 1) { + log_warn(LD_BUG, "How odd; there appear to be two matching consensuses " + "with flavor %s published at %s.", + flavname, formatted_time); + } + if (smartlist_len(matches)) { + result = smartlist_get(matches, 0); + } + smartlist_free(matches); + + return result; +} + +/** + * Given a string containing a networkstatus consensus, and the results of + * having parsed that consensus, add that consensus to the cache if it is not + * already present and not too old. Create new consensus diffs from or to + * that consensus as appropriate. + * + * Return 0 on success and -1 on failure. + */ +int +consdiffmgr_add_consensus(const char *consensus, + const networkstatus_t *as_parsed) +{ + if (BUG(consensus == NULL) || BUG(as_parsed == NULL)) + return -1; // LCOV_EXCL_LINE + if (BUG(as_parsed->type != NS_TYPE_CONSENSUS)) + return -1; // LCOV_EXCL_LINE + + const consensus_flavor_t flavor = as_parsed->flavor; + const time_t valid_after = as_parsed->valid_after; + + if (valid_after < approx_time() - 3600 * consdiff_cfg.cache_max_age_hours) { + log_info(LD_DIRSERV, "We don't care about this consensus document; it's " + "too old."); + return -1; + } + + /* Do we already have this one? */ + consensus_cache_entry_t *entry = + cdm_cache_lookup_consensus(flavor, valid_after); + if (entry) { + log_info(LD_DIRSERV, "We already have a copy of that consensus"); + return -1; + } + + /* We don't have it. Add it to the cache. */ + consdiffmgr_ensure_space_for_files(1); + + { + size_t bodylen = strlen(consensus); + config_line_t *labels = NULL; + char formatted_time[ISO_TIME_LEN+1]; + format_iso_time_nospace(formatted_time, valid_after); + const char *flavname = networkstatus_get_flavor_name(flavor); + + cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST_UNCOMPRESSED, + (const uint8_t *)consensus, bodylen); + { + const char *start, *end; + if (router_get_networkstatus_v3_signed_boundaries(consensus, + &start, &end) < 0) { + start = consensus; + end = consensus+bodylen; + } + cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST_AS_SIGNED, + (const uint8_t *)start, + end - start); + } + + char *body_compressed = NULL; + size_t size_compressed = 0; + if (tor_compress(&body_compressed, &size_compressed, + consensus, bodylen, COMPRESS_CONSENSUS_WITH) < 0) { + config_free_lines(labels); + return -1; + } + cdm_labels_prepend_sha3(&labels, LABEL_SHA3_DIGEST, + (const uint8_t *)body_compressed, size_compressed); + config_line_prepend(&labels, LABEL_COMPRESSION_TYPE, + compression_method_get_name(COMPRESS_CONSENSUS_WITH)); + config_line_prepend(&labels, LABEL_FLAVOR, flavname); + config_line_prepend(&labels, LABEL_VALID_AFTER, formatted_time); + config_line_prepend(&labels, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); + + entry = consensus_cache_add(cdm_cache_get(), + labels, + (const uint8_t *)body_compressed, + size_compressed); + tor_free(body_compressed); + config_free_lines(labels); + } + + if (entry) { + consensus_cache_entry_mark_for_aggressive_release(entry); + consensus_cache_entry_decref(entry); + } + + cdm_cache_dirty = 1; + return entry ? 0 : -1; +} + +/** + * Helper: used to sort two smartlists of consensus_cache_entry_t by their + * LABEL_VALID_AFTER labels. + */ +static int +compare_by_valid_after_(const void **a, const void **b) +{ + const consensus_cache_entry_t *e1 = *a; + const consensus_cache_entry_t *e2 = *b; + /* We're in luck here: sorting UTC iso-encoded values lexically will work + * fine (until 9999). */ + return strcmp_opt(consensus_cache_entry_get_value(e1, LABEL_VALID_AFTER), + consensus_cache_entry_get_value(e2, LABEL_VALID_AFTER)); +} + +/** + * Helper: Sort <b>lst</b> by LABEL_VALID_AFTER and return the most recent + * entry. + */ +static consensus_cache_entry_t * +sort_and_find_most_recent(smartlist_t *lst) +{ + smartlist_sort(lst, compare_by_valid_after_); + if (smartlist_len(lst)) { + return smartlist_get(lst, smartlist_len(lst) - 1); + } else { + return NULL; + } +} + +/** + * Look up consensus_cache_entry_t for the consensus of type <b>flavor</b>, + * from the source consensus with the specified digest (which must be SHA3). + * + * If the diff is present, store it into *<b>entry_out</b> and return + * CONSDIFF_AVAILABLE. Otherwise return CONSDIFF_NOT_FOUND or + * CONSDIFF_IN_PROGRESS. + */ +consdiff_status_t +consdiffmgr_find_diff_from(consensus_cache_entry_t **entry_out, + consensus_flavor_t flavor, + int digest_type, + const uint8_t *digest, + size_t digestlen, + compress_method_t method) +{ + if (BUG(digest_type != DIGEST_SHA3_256) || + BUG(digestlen != DIGEST256_LEN)) { + return CONSDIFF_NOT_FOUND; // LCOV_EXCL_LINE + } + + // Try to look up the entry in the hashtable. + cdm_diff_t search, *ent; + memset(&search, 0, sizeof(search)); + search.flavor = flavor; + search.compress_method = method; + memcpy(search.from_sha3, digest, DIGEST256_LEN); + ent = HT_FIND(cdm_diff_ht, &cdm_diff_ht, &search); + + if (ent == NULL || + ent->cdm_diff_status == CDM_DIFF_ERROR) { + return CONSDIFF_NOT_FOUND; + } else if (ent->cdm_diff_status == CDM_DIFF_IN_PROGRESS) { + return CONSDIFF_IN_PROGRESS; + } else if (BUG(ent->cdm_diff_status != CDM_DIFF_PRESENT)) { + return CONSDIFF_IN_PROGRESS; + } + + *entry_out = consensus_cache_entry_handle_get(ent->entry); + return (*entry_out) ? CONSDIFF_AVAILABLE : CONSDIFF_NOT_FOUND; + +#if 0 + // XXXX Remove this. I'm keeping it around for now in case we need to + // XXXX debug issues in the hashtable. + char hex[HEX_DIGEST256_LEN+1]; + base16_encode(hex, sizeof(hex), (const char *)digest, digestlen); + const char *flavname = networkstatus_get_flavor_name(flavor); + + smartlist_t *matches = smartlist_new(); + consensus_cache_find_all(matches, cdm_cache_get(), + LABEL_FROM_SHA3_DIGEST, hex); + consensus_cache_filter_list(matches, LABEL_FLAVOR, flavname); + consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); + + *entry_out = sort_and_find_most_recent(matches); + consdiff_status_t result = + (*entry_out) ? CONSDIFF_AVAILABLE : CONSDIFF_NOT_FOUND; + smartlist_free(matches); + + return result; +#endif +} + +/** + * Perform periodic cleanup tasks on the consensus diff cache. Return + * the number of objects marked for deletion. + */ +int +consdiffmgr_cleanup(void) +{ + smartlist_t *objects = smartlist_new(); + smartlist_t *consensuses = smartlist_new(); + smartlist_t *diffs = smartlist_new(); + int n_to_delete = 0; + + log_debug(LD_DIRSERV, "Looking for consdiffmgr entries to remove"); + + // 1. Delete any consensus or diff or anything whose valid_after is too old. + const time_t valid_after_cutoff = + approx_time() - 3600 * consdiff_cfg.cache_max_age_hours; + + consensus_cache_find_all(objects, cdm_cache_get(), + NULL, NULL); + SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) { + const char *lv_valid_after = + consensus_cache_entry_get_value(ent, LABEL_VALID_AFTER); + if (! lv_valid_after) { + log_debug(LD_DIRSERV, "Ignoring entry because it had no %s label", + LABEL_VALID_AFTER); + continue; + } + time_t valid_after = 0; + if (parse_iso_time_nospace(lv_valid_after, &valid_after) < 0) { + log_debug(LD_DIRSERV, "Ignoring entry because its %s value (%s) was " + "unparseable", LABEL_VALID_AFTER, escaped(lv_valid_after)); + continue; + } + if (valid_after < valid_after_cutoff) { + log_debug(LD_DIRSERV, "Deleting entry because its %s value (%s) was " + "too old", LABEL_VALID_AFTER, lv_valid_after); + consensus_cache_entry_mark_for_removal(ent); + ++n_to_delete; + } + } SMARTLIST_FOREACH_END(ent); + + // 2. Delete all diffs that lead to a consensus whose valid-after is not the + // latest. + for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { + const char *flavname = networkstatus_get_flavor_name(flav); + /* Determine the most recent consensus of this flavor */ + consensus_cache_find_all(consensuses, cdm_cache_get(), + LABEL_DOCTYPE, DOCTYPE_CONSENSUS); + consensus_cache_filter_list(consensuses, LABEL_FLAVOR, flavname); + consensus_cache_entry_t *most_recent = + sort_and_find_most_recent(consensuses); + if (most_recent == NULL) + continue; + const char *most_recent_sha3 = + consensus_cache_entry_get_value(most_recent, + LABEL_SHA3_DIGEST_UNCOMPRESSED); + if (BUG(most_recent_sha3 == NULL)) + continue; // LCOV_EXCL_LINE + + /* consider all such-flavored diffs, and look to see if they match. */ + consensus_cache_find_all(diffs, cdm_cache_get(), + LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); + consensus_cache_filter_list(diffs, LABEL_FLAVOR, flavname); + SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) { + const char *this_diff_target_sha3 = + consensus_cache_entry_get_value(diff, LABEL_TARGET_SHA3_DIGEST); + if (!this_diff_target_sha3) + continue; + if (strcmp(this_diff_target_sha3, most_recent_sha3)) { + consensus_cache_entry_mark_for_removal(diff); + ++n_to_delete; + } + } SMARTLIST_FOREACH_END(diff); + smartlist_clear(consensuses); + smartlist_clear(diffs); + } + + smartlist_free(objects); + smartlist_free(consensuses); + smartlist_free(diffs); + + // Actually remove files, if they're not used. + consensus_cache_delete_pending(cdm_cache_get(), 0); + return n_to_delete; +} + +/** + * Initialize the consensus diff manager and its cache, and configure + * its parameters based on the latest torrc and networkstatus parameters. + */ +void +consdiffmgr_configure(const consdiff_cfg_t *cfg) +{ + if (cfg) + memcpy(&consdiff_cfg, cfg, sizeof(consdiff_cfg)); + + (void) cdm_cache_get(); +} + +/** + * Tell the sandbox (if any) configured by <b>cfg</b> to allow the + * operations that the consensus diff manager will need. + */ +int +consdiffmgr_register_with_sandbox(struct sandbox_cfg_elem **cfg) +{ + return consensus_cache_register_with_sandbox(cdm_cache_get(), cfg); +} + +/** + * Scan the consensus diff manager's cache for any grossly malformed entries, + * and mark them as deletable. Return 0 if no problems were found; 1 + * if problems were found and fixed. + */ +int +consdiffmgr_validate(void) +{ + /* Right now, we only check for entries that have bad sha3 values */ + int problems = 0; + + smartlist_t *objects = smartlist_new(); + consensus_cache_find_all(objects, cdm_cache_get(), + NULL, NULL); + SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, obj) { + uint8_t sha3_expected[DIGEST256_LEN]; + uint8_t sha3_received[DIGEST256_LEN]; + int r = cdm_entry_get_sha3_value(sha3_expected, obj, LABEL_SHA3_DIGEST); + if (r == -1) { + /* digest isn't there; that's allowed */ + continue; + } else if (r == -2) { + /* digest is malformed; that's not allowed */ + problems = 1; + consensus_cache_entry_mark_for_removal(obj); + continue; + } + const uint8_t *body; + size_t bodylen; + consensus_cache_entry_incref(obj); + r = consensus_cache_entry_get_body(obj, &body, &bodylen); + if (r == 0) { + crypto_digest256((char *)sha3_received, (const char *)body, bodylen, + DIGEST_SHA3_256); + } + consensus_cache_entry_decref(obj); + if (r < 0) + continue; + + // Deconfuse coverity about the possibility of sha3_received being + // uninitialized + tor_assert(r <= 0); + + if (fast_memneq(sha3_received, sha3_expected, DIGEST256_LEN)) { + problems = 1; + consensus_cache_entry_mark_for_removal(obj); + continue; + } + + } SMARTLIST_FOREACH_END(obj); + smartlist_free(objects); + return problems; +} + +/** + * Helper: build new diffs of <b>flavor</b> as needed + */ +static void +consdiffmgr_rescan_flavor_(consensus_flavor_t flavor) +{ + smartlist_t *matches = NULL; + smartlist_t *diffs = NULL; + smartlist_t *compute_diffs_from = NULL; + strmap_t *have_diff_from = NULL; + + // look for the most recent consensus, and for all previous in-range + // consensuses. Do they all have diffs to it? + const char *flavname = networkstatus_get_flavor_name(flavor); + + // 1. find the most recent consensus, and the ones that we might want + // to diff to it. + matches = smartlist_new(); + consensus_cache_find_all(matches, cdm_cache_get(), + LABEL_FLAVOR, flavname); + consensus_cache_filter_list(matches, LABEL_DOCTYPE, DOCTYPE_CONSENSUS); + consensus_cache_entry_t *most_recent = sort_and_find_most_recent(matches); + if (!most_recent) { + log_info(LD_DIRSERV, "No 'most recent' %s consensus found; " + "not making diffs", flavname); + goto done; + } + tor_assert(smartlist_len(matches)); + smartlist_del(matches, smartlist_len(matches) - 1); + + const char *most_recent_valid_after = + consensus_cache_entry_get_value(most_recent, LABEL_VALID_AFTER); + if (BUG(most_recent_valid_after == NULL)) + goto done; //LCOV_EXCL_LINE + uint8_t most_recent_sha3[DIGEST256_LEN]; + if (BUG(cdm_entry_get_sha3_value(most_recent_sha3, most_recent, + LABEL_SHA3_DIGEST_UNCOMPRESSED) < 0)) + goto done; //LCOV_EXCL_LINE + + // 2. Find all the relevant diffs _to_ this consensus. These are ones + // that we don't need to compute. + diffs = smartlist_new(); + consensus_cache_find_all(diffs, cdm_cache_get(), + LABEL_VALID_AFTER, most_recent_valid_after); + consensus_cache_filter_list(diffs, LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); + consensus_cache_filter_list(diffs, LABEL_FLAVOR, flavname); + have_diff_from = strmap_new(); + SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) { + const char *va = consensus_cache_entry_get_value(diff, + LABEL_FROM_VALID_AFTER); + if (BUG(va == NULL)) + continue; // LCOV_EXCL_LINE + strmap_set(have_diff_from, va, diff); + } SMARTLIST_FOREACH_END(diff); + + // 3. See which consensuses in 'matches' don't have diffs yet. + smartlist_reverse(matches); // from newest to oldest. + compute_diffs_from = smartlist_new(); + SMARTLIST_FOREACH_BEGIN(matches, consensus_cache_entry_t *, ent) { + const char *va = consensus_cache_entry_get_value(ent, LABEL_VALID_AFTER); + if (BUG(va == NULL)) + continue; // LCOV_EXCL_LINE + if (strmap_get(have_diff_from, va) != NULL) + continue; /* we already have this one. */ + smartlist_add(compute_diffs_from, ent); + } SMARTLIST_FOREACH_END(ent); + + log_info(LD_DIRSERV, + "The most recent %s consensus is valid-after %s. We have diffs to " + "this consensus for %d/%d older %s consensuses. Generating diffs " + "for the other %d.", + flavname, + most_recent_valid_after, + smartlist_len(matches) - smartlist_len(compute_diffs_from), + smartlist_len(matches), + flavname, + smartlist_len(compute_diffs_from)); + + // 4. Update the hashtable; remove entries in this flavor to other + // target consensuses. + cdm_diff_ht_purge(flavor, most_recent_sha3); + + // 5. Actually launch the requests. + SMARTLIST_FOREACH_BEGIN(compute_diffs_from, consensus_cache_entry_t *, c) { + if (BUG(c == most_recent)) + continue; // LCOV_EXCL_LINE + + uint8_t this_sha3[DIGEST256_LEN]; + if (cdm_entry_get_sha3_value(this_sha3, c, + LABEL_SHA3_DIGEST_AS_SIGNED)<0) { + // Not actually a bug, since we might be running with a directory + // with stale files from before the #22143 fixes. + continue; + } + if (cdm_diff_ht_check_and_note_pending(flavor, + this_sha3, most_recent_sha3)) { + // This is already pending, or we encountered an error. + continue; + } + consensus_diff_queue_diff_work(c, most_recent); + } SMARTLIST_FOREACH_END(c); + + done: + smartlist_free(matches); + smartlist_free(diffs); + smartlist_free(compute_diffs_from); + strmap_free(have_diff_from, NULL); +} + +/** + * Scan the cache for diffs, and add them to the hashtable. + */ +static void +consdiffmgr_diffs_load(void) +{ + smartlist_t *diffs = smartlist_new(); + consensus_cache_find_all(diffs, cdm_cache_get(), + LABEL_DOCTYPE, DOCTYPE_CONSENSUS_DIFF); + SMARTLIST_FOREACH_BEGIN(diffs, consensus_cache_entry_t *, diff) { + const char *lv_flavor = + consensus_cache_entry_get_value(diff, LABEL_FLAVOR); + if (!lv_flavor) + continue; + int flavor = networkstatus_parse_flavor_name(lv_flavor); + if (flavor < 0) + continue; + const char *lv_compression = + consensus_cache_entry_get_value(diff, LABEL_COMPRESSION_TYPE); + compress_method_t method = NO_METHOD; + if (lv_compression) { + method = compression_method_get_by_name(lv_compression); + if (method == UNKNOWN_METHOD) { + continue; + } + } + + uint8_t from_sha3[DIGEST256_LEN]; + uint8_t to_sha3[DIGEST256_LEN]; + if (cdm_entry_get_sha3_value(from_sha3, diff, LABEL_FROM_SHA3_DIGEST)<0) + continue; + if (cdm_entry_get_sha3_value(to_sha3, diff, LABEL_TARGET_SHA3_DIGEST)<0) + continue; + + cdm_diff_ht_set_status(flavor, from_sha3, to_sha3, + method, + CDM_DIFF_PRESENT, + consensus_cache_entry_handle_new(diff)); + } SMARTLIST_FOREACH_END(diff); + smartlist_free(diffs); +} + +/** + * Build new diffs as needed. + */ +void +consdiffmgr_rescan(void) +{ + if (cdm_cache_dirty == 0) + return; + + // Clean up here to make room for new diffs, and to ensure that older + // consensuses do not have any entries. + consdiffmgr_cleanup(); + + if (cdm_cache_loaded == 0) { + consdiffmgr_diffs_load(); + cdm_cache_loaded = 1; + } + + for (int flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { + consdiffmgr_rescan_flavor_((consensus_flavor_t) flav); + } + + cdm_cache_dirty = 0; +} + +/** + * Helper: compare two files by their from-valid-after and valid-after labels, + * trying to sort in ascending order by from-valid-after (when present) and + * valid-after (when not). Place everything that has neither label first in + * the list. + */ +static int +compare_by_staleness_(const void **a, const void **b) +{ + const consensus_cache_entry_t *e1 = *a; + const consensus_cache_entry_t *e2 = *b; + const char *va1, *fva1, *va2, *fva2; + va1 = consensus_cache_entry_get_value(e1, LABEL_VALID_AFTER); + va2 = consensus_cache_entry_get_value(e2, LABEL_VALID_AFTER); + fva1 = consensus_cache_entry_get_value(e1, LABEL_FROM_VALID_AFTER); + fva2 = consensus_cache_entry_get_value(e2, LABEL_FROM_VALID_AFTER); + + if (fva1) + va1 = fva1; + if (fva2) + va2 = fva2; + + /* See note about iso-encoded values in compare_by_valid_after_. Also note + * that missing dates will get placed first. */ + return strcmp_opt(va1, va2); +} + +/** If there are not enough unused filenames to store <b>n</b> files, then + * delete old consensuses until there are. (We have to keep track of the + * number of filenames because of the way that the seccomp2 cache works.) + * + * Return 0 on success, -1 on failure. + **/ +static int +consdiffmgr_ensure_space_for_files(int n) +{ + consensus_cache_t *cache = cdm_cache_get(); + if (consensus_cache_get_n_filenames_available(cache) >= n) { + // there are already enough unused filenames. + return 0; + } + // Try a cheap deletion of stuff that's waiting to get deleted. + consensus_cache_delete_pending(cache, 0); + if (consensus_cache_get_n_filenames_available(cache) >= n) { + // okay, _that_ made enough filenames available. + return 0; + } + // Let's get more assertive: clean out unused stuff, and force-remove + // the files. + consdiffmgr_cleanup(); + consensus_cache_delete_pending(cache, 1); + const int n_to_remove = n - consensus_cache_get_n_filenames_available(cache); + if (n_to_remove <= 0) { + // okay, finally! + return 0; + } + + // At this point, we're going to have to throw out objects that will be + // missed. Too bad! + smartlist_t *objects = smartlist_new(); + consensus_cache_find_all(objects, cache, NULL, NULL); + smartlist_sort(objects, compare_by_staleness_); + int n_marked = 0; + SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) { + consensus_cache_entry_mark_for_removal(ent); + if (++n_marked >= n_to_remove) + break; + } SMARTLIST_FOREACH_END(ent); + + consensus_cache_delete_pending(cache, 1); + if (BUG(n_marked < n_to_remove)) + return -1; + else + return 0; +} + +/** + * Set consensus cache flags on the objects in this consdiffmgr. + */ +static void +consdiffmgr_set_cache_flags(void) +{ + /* Right now, we just mark the consensus objects for aggressive release, + * so that they get mmapped for as little time as possible. */ + smartlist_t *objects = smartlist_new(); + consensus_cache_find_all(objects, cdm_cache_get(), LABEL_DOCTYPE, + DOCTYPE_CONSENSUS); + SMARTLIST_FOREACH_BEGIN(objects, consensus_cache_entry_t *, ent) { + consensus_cache_entry_mark_for_aggressive_release(ent); + } SMARTLIST_FOREACH_END(ent); + smartlist_free(objects); +} + +/** + * Called before shutdown: drop all storage held by the consdiffmgr.c module. + */ +void +consdiffmgr_free_all(void) +{ + cdm_diff_t **diff, **next; + for (diff = HT_START(cdm_diff_ht, &cdm_diff_ht); diff; diff = next) { + cdm_diff_t *this = *diff; + next = HT_NEXT_RMV(cdm_diff_ht, &cdm_diff_ht, diff); + cdm_diff_free(this); + } + consensus_cache_free(cons_diff_cache); + cons_diff_cache = NULL; +} + +/* ===== + Thread workers + =====*/ + +typedef struct compressed_result_t { + config_line_t *labels; + /** + * Output: Body of the diff, as compressed. + */ + uint8_t *body; + /** + * Output: length of body_out + */ + size_t bodylen; +} compressed_result_t; + +/** + * An object passed to a worker thread that will try to produce a consensus + * diff. + */ +typedef struct consensus_diff_worker_job_t { + /** + * Input: The consensus to compute the diff from. Holds a reference to the + * cache entry, which must not be released until the job is passed back to + * the main thread. The body must be mapped into memory in the main thread. + */ + consensus_cache_entry_t *diff_from; + /** + * Input: The consensus to compute the diff to. Holds a reference to the + * cache entry, which must not be released until the job is passed back to + * the main thread. The body must be mapped into memory in the main thread. + */ + consensus_cache_entry_t *diff_to; + + /** Output: labels and bodies */ + compressed_result_t out[ARRAY_LENGTH(compress_diffs_with)]; +} consensus_diff_worker_job_t; + +/** Given a consensus_cache_entry_t, check whether it has a label claiming + * that it was compressed. If so, uncompress its contents into <b>out</b> and + * set <b>outlen</b> to hold their size. If not, just copy the body into + * <b>out</b> and set <b>outlen</b> to its length. Return 0 on success, + * -1 on failure. + * + * In all cases, the output is nul-terminated. */ +STATIC int +uncompress_or_copy(char **out, size_t *outlen, + consensus_cache_entry_t *ent) +{ + const uint8_t *body; + size_t bodylen; + + if (consensus_cache_entry_get_body(ent, &body, &bodylen) < 0) + return -1; + + const char *lv_compression = + consensus_cache_entry_get_value(ent, LABEL_COMPRESSION_TYPE); + compress_method_t method = NO_METHOD; + + if (lv_compression) + method = compression_method_get_by_name(lv_compression); + + return tor_uncompress(out, outlen, (const char *)body, bodylen, + method, 1, LOG_WARN); +} + +/** + * Worker function. This function runs inside a worker thread and receives + * a consensus_diff_worker_job_t as its input. + */ +static workqueue_reply_t +consensus_diff_worker_threadfn(void *state_, void *work_) +{ + (void)state_; + consensus_diff_worker_job_t *job = work_; + const uint8_t *diff_from, *diff_to; + size_t len_from, len_to; + int r; + /* We need to have the body already mapped into RAM here. + */ + r = consensus_cache_entry_get_body(job->diff_from, &diff_from, &len_from); + if (BUG(r < 0)) + return WQ_RPL_REPLY; // LCOV_EXCL_LINE + r = consensus_cache_entry_get_body(job->diff_to, &diff_to, &len_to); + if (BUG(r < 0)) + return WQ_RPL_REPLY; // LCOV_EXCL_LINE + + const char *lv_to_valid_after = + consensus_cache_entry_get_value(job->diff_to, LABEL_VALID_AFTER); + const char *lv_from_valid_after = + consensus_cache_entry_get_value(job->diff_from, LABEL_VALID_AFTER); + const char *lv_from_digest = + consensus_cache_entry_get_value(job->diff_from, + LABEL_SHA3_DIGEST_AS_SIGNED); + const char *lv_from_flavor = + consensus_cache_entry_get_value(job->diff_from, LABEL_FLAVOR); + const char *lv_to_flavor = + consensus_cache_entry_get_value(job->diff_to, LABEL_FLAVOR); + const char *lv_to_digest = + consensus_cache_entry_get_value(job->diff_to, + LABEL_SHA3_DIGEST_UNCOMPRESSED); + + if (! lv_from_digest) { + /* This isn't a bug right now, since it can happen if you're migrating + * from an older version of master to a newer one. The older ones didn't + * annotate their stored consensus objects with sha3-digest-as-signed. + */ + return WQ_RPL_REPLY; // LCOV_EXCL_LINE + } + + /* All these values are mandatory on the input */ + if (BUG(!lv_to_valid_after) || + BUG(!lv_from_valid_after) || + BUG(!lv_from_flavor) || + BUG(!lv_to_flavor)) { + return WQ_RPL_REPLY; // LCOV_EXCL_LINE + } + /* The flavors need to match */ + if (BUG(strcmp(lv_from_flavor, lv_to_flavor))) { + return WQ_RPL_REPLY; // LCOV_EXCL_LINE + } + + char *consensus_diff; + { + char *diff_from_nt = NULL, *diff_to_nt = NULL; + size_t diff_from_nt_len, diff_to_nt_len; + + if (uncompress_or_copy(&diff_from_nt, &diff_from_nt_len, + job->diff_from) < 0) { + return WQ_RPL_REPLY; + } + if (uncompress_or_copy(&diff_to_nt, &diff_to_nt_len, + job->diff_to) < 0) { + tor_free(diff_from_nt); + return WQ_RPL_REPLY; + } + tor_assert(diff_from_nt); + tor_assert(diff_to_nt); + + // XXXX ugh; this is going to calculate the SHA3 of both its + // XXXX inputs again, even though we already have that. Maybe it's time + // XXXX to change the API here? + consensus_diff = consensus_diff_generate(diff_from_nt, diff_to_nt); + tor_free(diff_from_nt); + tor_free(diff_to_nt); + } + if (!consensus_diff) { + /* Couldn't generate consensus; we'll leave the reply blank. */ + return WQ_RPL_REPLY; + } + + /* Compress the results and send the reply */ + tor_assert(compress_diffs_with[0] == NO_METHOD); + size_t difflen = strlen(consensus_diff); + job->out[0].body = (uint8_t *) consensus_diff; + job->out[0].bodylen = difflen; + + config_line_t *common_labels = NULL; + cdm_labels_prepend_sha3(&common_labels, + LABEL_SHA3_DIGEST_UNCOMPRESSED, + job->out[0].body, + job->out[0].bodylen); + config_line_prepend(&common_labels, LABEL_FROM_VALID_AFTER, + lv_from_valid_after); + config_line_prepend(&common_labels, LABEL_VALID_AFTER, + lv_to_valid_after); + config_line_prepend(&common_labels, LABEL_FLAVOR, lv_from_flavor); + config_line_prepend(&common_labels, LABEL_FROM_SHA3_DIGEST, + lv_from_digest); + config_line_prepend(&common_labels, LABEL_TARGET_SHA3_DIGEST, + lv_to_digest); + config_line_prepend(&common_labels, LABEL_DOCTYPE, + DOCTYPE_CONSENSUS_DIFF); + + job->out[0].labels = config_lines_dup(common_labels); + cdm_labels_prepend_sha3(&job->out[0].labels, + LABEL_SHA3_DIGEST, + job->out[0].body, + job->out[0].bodylen); + + unsigned u; + for (u = 1; u < n_diff_compression_methods(); ++u) { + compress_method_t method = compress_diffs_with[u]; + const char *methodname = compression_method_get_name(method); + char *result; + size_t sz; + if (0 == tor_compress(&result, &sz, consensus_diff, difflen, method)) { + job->out[u].body = (uint8_t*)result; + job->out[u].bodylen = sz; + job->out[u].labels = config_lines_dup(common_labels); + cdm_labels_prepend_sha3(&job->out[u].labels, LABEL_SHA3_DIGEST, + job->out[u].body, + job->out[u].bodylen); + config_line_prepend(&job->out[u].labels, + LABEL_COMPRESSION_TYPE, + methodname); + } + } + + config_free_lines(common_labels); + return WQ_RPL_REPLY; +} + +/** + * Helper: release all storage held in <b>job</b>. + */ +static void +consensus_diff_worker_job_free(consensus_diff_worker_job_t *job) +{ + if (!job) + return; + unsigned u; + for (u = 0; u < n_diff_compression_methods(); ++u) { + config_free_lines(job->out[u].labels); + tor_free(job->out[u].body); + } + consensus_cache_entry_decref(job->diff_from); + consensus_cache_entry_decref(job->diff_to); + tor_free(job); +} + +/** + * Worker function: This function runs in the main thread, and receives + * a consensus_diff_worker_job_t that the worker thread has already + * processed. + */ +static void +consensus_diff_worker_replyfn(void *work_) +{ + tor_assert(in_main_thread()); + tor_assert(work_); + + consensus_diff_worker_job_t *job = work_; + + const char *lv_from_digest = + consensus_cache_entry_get_value(job->diff_from, + LABEL_SHA3_DIGEST_AS_SIGNED); + const char *lv_to_digest = + consensus_cache_entry_get_value(job->diff_to, + LABEL_SHA3_DIGEST_UNCOMPRESSED); + const char *lv_flavor = + consensus_cache_entry_get_value(job->diff_to, LABEL_FLAVOR); + if (BUG(lv_from_digest == NULL)) + lv_from_digest = "???"; // LCOV_EXCL_LINE + if (BUG(lv_to_digest == NULL)) + lv_to_digest = "???"; // LCOV_EXCL_LINE + + uint8_t from_sha3[DIGEST256_LEN]; + uint8_t to_sha3[DIGEST256_LEN]; + int flav = -1; + int cache = 1; + if (BUG(cdm_entry_get_sha3_value(from_sha3, job->diff_from, + LABEL_SHA3_DIGEST_AS_SIGNED) < 0)) + cache = 0; + if (BUG(cdm_entry_get_sha3_value(to_sha3, job->diff_to, + LABEL_SHA3_DIGEST_UNCOMPRESSED) < 0)) + cache = 0; + if (BUG(lv_flavor == NULL)) { + cache = 0; + } else if ((flav = networkstatus_parse_flavor_name(lv_flavor)) < 0) { + cache = 0; + } + + int status = CDM_DIFF_ERROR; + consensus_cache_entry_handle_t *handles[ARRAY_LENGTH(compress_diffs_with)]; + memset(handles, 0, sizeof(handles)); + + consdiffmgr_ensure_space_for_files(n_diff_compression_methods()); + + unsigned u; + for (u = 0; u < n_diff_compression_methods(); ++u) { + compress_method_t method = compress_diffs_with[u]; + uint8_t *body_out = job->out[u].body; + size_t bodylen_out = job->out[u].bodylen; + config_line_t *labels = job->out[u].labels; + const char *methodname = compression_method_get_name(method); + if (body_out && bodylen_out && labels) { + /* Success! Store the results */ + log_info(LD_DIRSERV, "Adding consensus diff from %s to %s, " + "compressed with %s", + lv_from_digest, lv_to_digest, methodname); + + consensus_cache_entry_t *ent = + consensus_cache_add(cdm_cache_get(), + labels, + body_out, + bodylen_out); + + status = CDM_DIFF_PRESENT; + handles[u] = consensus_cache_entry_handle_new(ent); + consensus_cache_entry_decref(ent); + } + } + if (status != CDM_DIFF_PRESENT) { + /* Failure! Nothing to do but complain */ + log_warn(LD_DIRSERV, + "Worker was unable to compute consensus diff " + "from %s to %s", lv_from_digest, lv_to_digest); + /* Cache this error so we don't try to compute this one again. */ + status = CDM_DIFF_ERROR; + } + + for (u = 0; u < ARRAY_LENGTH(handles); ++u) { + compress_method_t method = compress_diffs_with[u]; + if (cache) { + cdm_diff_ht_set_status(flav, from_sha3, to_sha3, method, status, + handles[u]); + } else { + consensus_cache_entry_handle_free(handles[u]); + } + } + + consensus_diff_worker_job_free(job); +} + +/** + * Queue the job of computing the diff from <b>diff_from</b> to <b>diff_to</b> + * in a worker thread. + */ +static int +consensus_diff_queue_diff_work(consensus_cache_entry_t *diff_from, + consensus_cache_entry_t *diff_to) +{ + tor_assert(in_main_thread()); + + consensus_cache_entry_incref(diff_from); + consensus_cache_entry_incref(diff_to); + + consensus_diff_worker_job_t *job = tor_malloc_zero(sizeof(*job)); + job->diff_from = diff_from; + job->diff_to = diff_to; + + /* Make sure body is mapped. */ + const uint8_t *body; + size_t bodylen; + int r1 = consensus_cache_entry_get_body(diff_from, &body, &bodylen); + int r2 = consensus_cache_entry_get_body(diff_to, &body, &bodylen); + if (r1 < 0 || r2 < 0) + goto err; + + workqueue_entry_t *work; + work = cpuworker_queue_work(consensus_diff_worker_threadfn, + consensus_diff_worker_replyfn, + job); + if (!work) + goto err; + + return 0; + err: + consensus_diff_worker_job_free(job); // includes decrefs. + return -1; +} + diff --git a/src/or/consdiffmgr.h b/src/or/consdiffmgr.h new file mode 100644 index 0000000000..048dae432c --- /dev/null +++ b/src/or/consdiffmgr.h @@ -0,0 +1,54 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_CONSDIFFMGR_H +#define TOR_CONSDIFFMGR_H + +/** + * Possible outcomes from trying to look up a given consensus diff. + */ +typedef enum consdiff_status_t { + CONSDIFF_AVAILABLE, + CONSDIFF_NOT_FOUND, + CONSDIFF_IN_PROGRESS, +} consdiff_status_t; + +typedef struct consdiff_cfg_t { + int32_t cache_max_age_hours; + int32_t cache_max_num; +} consdiff_cfg_t; + +struct consensus_cache_entry_t; // from conscache.h + +int consdiffmgr_add_consensus(const char *consensus, + const networkstatus_t *as_parsed); + +consdiff_status_t consdiffmgr_find_diff_from( + struct consensus_cache_entry_t **entry_out, + consensus_flavor_t flavor, + int digest_type, + const uint8_t *digest, + size_t digestlen, + compress_method_t method); +void consdiffmgr_rescan(void); +int consdiffmgr_cleanup(void); +void consdiffmgr_configure(const consdiff_cfg_t *cfg); +struct sandbox_cfg_elem; +int consdiffmgr_register_with_sandbox(struct sandbox_cfg_elem **cfg); +void consdiffmgr_free_all(void); +int consdiffmgr_validate(void); + +#ifdef CONSDIFFMGR_PRIVATE +STATIC unsigned n_diff_compression_methods(void); +STATIC consensus_cache_t *cdm_cache_get(void); +STATIC consensus_cache_entry_t *cdm_cache_lookup_consensus( + consensus_flavor_t flavor, time_t valid_after); +STATIC int cdm_entry_get_sha3_value(uint8_t *digest_out, + consensus_cache_entry_t *ent, + const char *label); +STATIC int uncompress_or_copy(char **out, size_t *outlen, + consensus_cache_entry_t *ent); +#endif + +#endif + diff --git a/src/or/control.c b/src/or/control.c index 8ab31f18f7..65d29259ea 100644 --- a/src/or/control.c +++ b/src/or/control.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -1873,7 +1873,7 @@ getinfo_helper_listeners(control_connection_t *control_conn, /** Implementation helper for GETINFO: knows the answers for questions about * directory information. */ -static int +STATIC int getinfo_helper_dir(control_connection_t *control_conn, const char *question, char **answer, const char **errmsg) @@ -2047,6 +2047,12 @@ getinfo_helper_dir(control_connection_t *control_conn, } } } else if (!strcmp(question, "network-status")) { /* v1 */ + static int network_status_warned = 0; + if (!network_status_warned) { + log_warn(LD_CONTROL, "GETINFO network-status is deprecated; it will " + "go away in a future version of Tor."); + network_status_warned = 1; + } routerlist_t *routerlist = router_get_routerlist(); if (!routerlist || !routerlist->routers || list_server_status_v1(routerlist->routers, answer, 1) < 0) { @@ -2058,7 +2064,7 @@ getinfo_helper_dir(control_connection_t *control_conn, char d[DIGEST_LEN]; signed_descriptor_t *sd = NULL; if (base16_decode(d, sizeof(d), question, strlen(question)) - != sizeof(d)) { + == sizeof(d)) { /* XXXX this test should move into extrainfo_get_by_descriptor_digest, * but I don't want to risk affecting other parts of the code, * especially since the rules for using our own extrainfo (including @@ -6918,6 +6924,11 @@ get_desc_id_from_query(const rend_data_t *rend_data, const char *hsdir_fp) goto end; } + /* Without a directory fingerprint at this stage, we can't do much. */ + if (hsdir_fp == NULL) { + goto end; + } + /* OK, we have an onion address so now let's find which descriptor ID * is the one associated with the HSDir fingerprint. */ for (replica = 0; replica < REND_NUMBER_OF_NON_CONSECUTIVE_REPLICAS; @@ -7007,10 +7018,9 @@ control_event_hs_descriptor_receive_end(const char *action, char desc_id_base32[REND_DESC_ID_V2_LEN_BASE32 + 1]; const char *desc_id = NULL; - if (!action || !id_digest || !rend_data || !onion_address) { - log_warn(LD_BUG, "Called with action==%p, id_digest==%p, " - "rend_data==%p, onion_address==%p", action, id_digest, - rend_data, onion_address); + if (!action || !rend_data || !onion_address) { + log_warn(LD_BUG, "Called with action==%p, rend_data==%p, " + "onion_address==%p", action, rend_data, onion_address); return; } @@ -7033,7 +7043,8 @@ control_event_hs_descriptor_receive_end(const char *action, rend_hsaddress_str_or_unknown(onion_address), rend_auth_type_to_string( TO_REND_DATA_V2(rend_data)->auth_type), - node_describe_longname_by_id(id_digest), + id_digest ? + node_describe_longname_by_id(id_digest) : "UNKNOWN", desc_id_field ? desc_id_field : "", reason_field ? reason_field : ""); @@ -7113,19 +7124,18 @@ control_event_hs_descriptor_uploaded(const char *id_digest, id_digest, NULL); } -/** Send HS_DESC event to inform controller that query <b>rend_query</b> - * failed to retrieve hidden service descriptor identified by - * <b>id_digest</b>. If <b>reason</b> is not NULL, add it to REASON= - * field. +/** Send HS_DESC event to inform controller that query <b>rend_data</b> + * failed to retrieve hidden service descriptor from directory identified by + * <b>id_digest</b>. If NULL, "UNKNOWN" is used. If <b>reason</b> is not NULL, + * add it to REASON= field. */ void control_event_hs_descriptor_failed(const rend_data_t *rend_data, const char *id_digest, const char *reason) { - if (!rend_data || !id_digest) { - log_warn(LD_BUG, "Called with rend_data==%p, id_digest==%p", - rend_data, id_digest); + if (!rend_data) { + log_warn(LD_BUG, "Called with rend_data==%p", rend_data); return; } control_event_hs_descriptor_receive_end("FAILED", @@ -7133,8 +7143,11 @@ control_event_hs_descriptor_failed(const rend_data_t *rend_data, rend_data, id_digest, reason); } -/** send HS_DESC_CONTENT event after completion of a successful fetch from - * hs directory. */ +/** Send HS_DESC_CONTENT event after completion of a successful fetch from hs + * directory. If <b>hsdir_id_digest</b> is NULL, it is replaced by "UNKNOWN". + * If <b>content</b> is NULL, it is replaced by an empty string. The + * <b>onion_address</b> or <b>desc_id</b> set to NULL will no trigger the + * control event. */ void control_event_hs_descriptor_content(const char *onion_address, const char *desc_id, @@ -7144,9 +7157,9 @@ control_event_hs_descriptor_content(const char *onion_address, static const char *event_name = "HS_DESC_CONTENT"; char *esc_content = NULL; - if (!onion_address || !desc_id || !hsdir_id_digest) { - log_warn(LD_BUG, "Called with onion_address==%p, desc_id==%p, " - "hsdir_id_digest==%p", onion_address, desc_id, hsdir_id_digest); + if (!onion_address || !desc_id) { + log_warn(LD_BUG, "Called with onion_address==%p, desc_id==%p, ", + onion_address, desc_id); return; } @@ -7161,7 +7174,9 @@ control_event_hs_descriptor_content(const char *onion_address, event_name, rend_hsaddress_str_or_unknown(onion_address), desc_id, - node_describe_longname_by_id(hsdir_id_digest), + hsdir_id_digest ? + node_describe_longname_by_id(hsdir_id_digest) : + "UNKNOWN", esc_content); tor_free(esc_content); } diff --git a/src/or/control.h b/src/or/control.h index 16ba1ed8f0..41a194bfcb 100644 --- a/src/or/control.h +++ b/src/or/control.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -290,6 +290,10 @@ STATIC int getinfo_helper_downloads( control_connection_t *control_conn, const char *question, char **answer, const char **errmsg); +STATIC int getinfo_helper_dir( + control_connection_t *control_conn, + const char *question, char **answer, + const char **errmsg); #endif diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c index fd6de6ea7c..af79fafaa6 100644 --- a/src/or/cpuworker.c +++ b/src/or/cpuworker.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -479,6 +479,20 @@ queue_pending_tasks(void) } } +/** DOCDOC */ +MOCK_IMPL(workqueue_entry_t *, +cpuworker_queue_work,(workqueue_reply_t (*fn)(void *, void *), + void (*reply_fn)(void *), + void *arg)) +{ + tor_assert(threadpool); + + return threadpool_queue_work(threadpool, + fn, + reply_fn, + arg); +} + /** Try to tell a cpuworker to perform the public key operations necessary to * respond to <b>onionskin</b> for the circuit <b>circ</b>. * diff --git a/src/or/cpuworker.h b/src/or/cpuworker.h index 62cf0eb164..aedf2fae32 100644 --- a/src/or/cpuworker.h +++ b/src/or/cpuworker.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -14,6 +14,12 @@ void cpu_init(void); void cpuworkers_rotate_keyinfo(void); +struct workqueue_entry_s; +enum workqueue_reply_t; +MOCK_DECL(struct workqueue_entry_s *, cpuworker_queue_work, ( + enum workqueue_reply_t (*fn)(void *, void *), + void (*reply_fn)(void *), + void *arg)); struct create_cell_t; int assign_onionskin_to_cpuworker(or_circuit_t *circ, diff --git a/src/or/dircollate.c b/src/or/dircollate.c index 033a7afe0f..172364c5f5 100644 --- a/src/or/dircollate.c +++ b/src/or/dircollate.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dircollate.h b/src/or/dircollate.h index 358c730cbb..52214282b9 100644 --- a/src/or/dircollate.h +++ b/src/or/dircollate.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/directory.c b/src/or/directory.c index 80d3c30c63..67c28e1f3e 100644 --- a/src/or/directory.c +++ b/src/or/directory.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRECTORY_PRIVATE @@ -13,7 +13,10 @@ #include "config.h" #include "connection.h" #include "connection_edge.h" +#include "consdiff.h" +#include "consdiffmgr.h" #include "control.h" +#include "compat.h" #define DIRECTORY_PRIVATE #include "directory.h" #include "dirserv.h" @@ -62,7 +65,7 @@ * multi-hop circuits for anonymity. * * Directory requests are launched by calling - * directory_initiate_command_rend() or one of its numerous variants. This + * directory_initiate_request(). This * launch the connection, will construct an HTTP request with * directory_send_command(), send the and wait for a response. The client * later handles the response with connection_dir_client_reached_eof(), @@ -97,9 +100,8 @@ * connection_finished_connecting() in connection.c */ static void directory_send_command(dir_connection_t *conn, - int purpose, int direct, const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since); + int direct, + const directory_request_t *request); static int body_is_plausible(const char *body, size_t body_len, int purpose); static char *http_get_header(const char *headers, const char *which); static void http_set_address_origin(const char *headers, connection_t *conn); @@ -117,22 +119,10 @@ static void dir_microdesc_download_failed(smartlist_t *failed, int status_code); static int client_likes_consensus(networkstatus_t *v, const char *want_url); -static void directory_initiate_command_rend( - const tor_addr_port_t *or_addr_port, - const tor_addr_port_t *dir_addr_port, - const char *digest, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query, - circuit_guard_state_t *guard_state); - static void connection_dir_close_consensus_fetches( dir_connection_t *except_this_one, const char *resource); +static void directory_request_set_guard_state(directory_request_t *req, + struct circuit_guard_state_t *state); /********* START VARIABLES **********/ @@ -141,6 +131,7 @@ static void connection_dir_close_consensus_fetches( #define ALLOW_DIRECTORY_TIME_SKEW (30*60) #define X_ADDRESS_HEADER "X-Your-Address-Is: " +#define X_OR_DIFF_FROM_CONSENSUS_HEADER "X-Or-Diff-From-Consensus: " /** HTTP cache control: how long do we tell proxies they can cache each * kind of document we serve? */ @@ -420,11 +411,14 @@ directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose, } else { indirection = DIRIND_DIRECT_CONN; } - directory_initiate_command_routerstatus(rs, dir_purpose, - router_purpose, - indirection, - NULL, payload, upload_len, 0, - NULL); + + directory_request_t *req = directory_request_new(dir_purpose); + directory_request_set_routerstatus(req, rs); + directory_request_set_router_purpose(req, router_purpose); + directory_request_set_indirection(req, indirection); + directory_request_set_payload(req, payload, upload_len); + directory_initiate_request(req); + directory_request_free(req); } SMARTLIST_FOREACH_END(ds); if (!found) { char *s = authdir_type_to_string(type); @@ -485,6 +479,70 @@ directory_pick_generic_dirserver(dirinfo_type_t type, int pds_flags, return rs; } +/** + * Set the extra fields in <b>req</b> that are used when requesting a + * consensus of type <b>resource</b>. + * + * Right now, these fields are if-modified-since and x-or-diff-from-consensus. + */ +static void +dir_consensus_request_set_additional_headers(directory_request_t *req, + const char *resource) +{ + time_t if_modified_since = 0; + uint8_t or_diff_from[DIGEST256_LEN]; + int or_diff_from_is_set = 0; + + /* DEFAULT_IF_MODIFIED_SINCE_DELAY is 1/20 of the default consensus + * period of 1 hour. + */ + const int DEFAULT_IF_MODIFIED_SINCE_DELAY = 180; + + int flav = FLAV_NS; + if (resource) + flav = networkstatus_parse_flavor_name(resource); + + if (flav != -1) { + /* IF we have a parsed consensus of this type, we can do an + * if-modified-time based on it. */ + networkstatus_t *v; + v = networkstatus_get_latest_consensus_by_flavor(flav); + if (v) { + /* In networks with particularly short V3AuthVotingIntervals, + * ask for the consensus if it's been modified since half the + * V3AuthVotingInterval of the most recent consensus. */ + time_t ims_delay = DEFAULT_IF_MODIFIED_SINCE_DELAY; + if (v->fresh_until > v->valid_after + && ims_delay > (v->fresh_until - v->valid_after)/2) { + ims_delay = (v->fresh_until - v->valid_after)/2; + } + if_modified_since = v->valid_after + ims_delay; + memcpy(or_diff_from, v->digest_sha3_as_signed, DIGEST256_LEN); + or_diff_from_is_set = 1; + } + } else { + /* Otherwise it might be a consensus we don't parse, but which we + * do cache. Look at the cached copy, perhaps. */ + cached_dir_t *cd = dirserv_get_consensus(resource); + /* We have no method of determining the voting interval from an + * unparsed consensus, so we use the default. */ + if (cd) { + if_modified_since = cd->published + DEFAULT_IF_MODIFIED_SINCE_DELAY; + memcpy(or_diff_from, cd->digest_sha3_as_signed, DIGEST256_LEN); + or_diff_from_is_set = 1; + } + } + + if (if_modified_since > 0) + directory_request_set_if_modified_since(req, if_modified_since); + if (or_diff_from_is_set) { + char hex[HEX_DIGEST256_LEN + 1]; + base16_encode(hex, sizeof(hex), + (const char*)or_diff_from, sizeof(or_diff_from)); + directory_request_add_header(req, X_OR_DIFF_FROM_CONSENSUS_HEADER, hex); + } +} + /** Start a connection to a random running directory server, using * connection purpose <b>dir_purpose</b>, intending to fetch descriptors * of purpose <b>router_purpose</b>, and requesting <b>resource</b>. @@ -506,47 +564,10 @@ MOCK_IMPL(void, directory_get_from_dirserver, ( int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose, resource); dirinfo_type_t type = dir_fetch_type(dir_purpose, router_purpose, resource); - time_t if_modified_since = 0; if (type == NO_DIRINFO) return; - if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) { - int flav = FLAV_NS; - networkstatus_t *v; - if (resource) - flav = networkstatus_parse_flavor_name(resource); - - /* DEFAULT_IF_MODIFIED_SINCE_DELAY is 1/20 of the default consensus - * period of 1 hour. - */ -#define DEFAULT_IF_MODIFIED_SINCE_DELAY (180) - if (flav != -1) { - /* IF we have a parsed consensus of this type, we can do an - * if-modified-time based on it. */ - v = networkstatus_get_latest_consensus_by_flavor(flav); - if (v) { - /* In networks with particularly short V3AuthVotingIntervals, - * ask for the consensus if it's been modified since half the - * V3AuthVotingInterval of the most recent consensus. */ - time_t ims_delay = DEFAULT_IF_MODIFIED_SINCE_DELAY; - if (v->fresh_until > v->valid_after - && ims_delay > (v->fresh_until - v->valid_after)/2) { - ims_delay = (v->fresh_until - v->valid_after)/2; - } - if_modified_since = v->valid_after + ims_delay; - } - } else { - /* Otherwise it might be a consensus we don't parse, but which we - * do cache. Look at the cached copy, perhaps. */ - cached_dir_t *cd = dirserv_get_consensus(resource); - /* We have no method of determining the voting interval from an - * unparsed consensus, so we use the default. */ - if (cd) - if_modified_since = cd->published + DEFAULT_IF_MODIFIED_SINCE_DELAY; - } - } - if (!options->FetchServerDescriptors) return; @@ -565,20 +586,20 @@ MOCK_IMPL(void, directory_get_from_dirserver, ( routerinfo_t *ri = node->ri; /* clients always make OR connections to bridges */ tor_addr_port_t or_ap; - tor_addr_port_t nil_dir_ap; + directory_request_t *req = directory_request_new(dir_purpose); /* we are willing to use a non-preferred address if we need to */ fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0, &or_ap); - tor_addr_make_null(&nil_dir_ap.addr, AF_INET); - nil_dir_ap.port = 0; - directory_initiate_command_rend(&or_ap, - &nil_dir_ap, - ri->cache_info.identity_digest, - dir_purpose, - router_purpose, - DIRIND_ONEHOP, - resource, NULL, 0, if_modified_since, - NULL, guard_state); + directory_request_set_or_addr_port(req, &or_ap); + directory_request_set_directory_id_digest(req, + ri->cache_info.identity_digest); + directory_request_set_router_purpose(req, router_purpose); + directory_request_set_resource(req, resource); + if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) + dir_consensus_request_set_additional_headers(req, resource); + directory_request_set_guard_state(req, guard_state); + directory_initiate_request(req); + directory_request_free(req); } else { if (guard_state) { entry_guard_cancel(&guard_state); @@ -638,12 +659,17 @@ MOCK_IMPL(void, directory_get_from_dirserver, ( if (rs) { const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS : DIRIND_ONEHOP; - directory_initiate_command_routerstatus(rs, dir_purpose, - router_purpose, - indirection, - resource, NULL, 0, - if_modified_since, - guard_state); + directory_request_t *req = directory_request_new(dir_purpose); + directory_request_set_routerstatus(req, rs); + directory_request_set_router_purpose(req, router_purpose); + directory_request_set_indirection(req, indirection); + directory_request_set_resource(req, resource); + if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) + dir_consensus_request_set_additional_headers(req, resource); + if (guard_state) + directory_request_set_guard_state(req, guard_state); + directory_initiate_request(req); + directory_request_free(req); } else { log_notice(LD_DIR, "While fetching directory info, " @@ -669,15 +695,17 @@ directory_get_from_all_authorities(uint8_t dir_purpose, SMARTLIST_FOREACH_BEGIN(router_get_trusted_dir_servers(), dir_server_t *, ds) { - routerstatus_t *rs; if (router_digest_is_me(ds->digest)) continue; if (!(ds->type & V3_DIRINFO)) continue; - rs = &ds->fake_status; - directory_initiate_command_routerstatus(rs, dir_purpose, router_purpose, - DIRIND_ONEHOP, resource, NULL, - 0, 0, NULL); + const routerstatus_t *rs = &ds->fake_status; + directory_request_t *req = directory_request_new(dir_purpose); + directory_request_set_routerstatus(req, rs); + directory_request_set_router_purpose(req, router_purpose); + directory_request_set_resource(req, resource); + directory_initiate_request(req); + directory_request_free(req); } SMARTLIST_FOREACH_END(ds); } @@ -777,110 +805,6 @@ directory_choose_address_routerstatus(const routerstatus_t *status, return 0; } -/** Same as directory_initiate_command_routerstatus(), but accepts - * rendezvous data to fetch a hidden service descriptor. */ -void -directory_initiate_command_routerstatus_rend(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query, - circuit_guard_state_t *guard_state) -{ - const or_options_t *options = get_options(); - const node_t *node; - tor_addr_port_t use_or_ap, use_dir_ap; - const int anonymized_connection = dirind_is_anon(indirection); - - tor_assert(status != NULL); - - node = node_get_by_id(status->identity_digest); - - /* XXX The below check is wrong: !node means it's not in the consensus, - * but we haven't checked if we have a descriptor for it -- and also, - * we only care about the descriptor if it's a begindir-style anonymized - * connection. */ - if (!node && anonymized_connection) { - log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " - "don't have its router descriptor.", - routerstatus_describe(status)); - return; - } - - if (options->ExcludeNodes && options->StrictNodes && - routerset_contains_routerstatus(options->ExcludeNodes, status, -1)) { - log_warn(LD_DIR, "Wanted to contact directory mirror %s for %s, but " - "it's in our ExcludedNodes list and StrictNodes is set. " - "Skipping. This choice might make your Tor not work.", - routerstatus_describe(status), - dir_conn_purpose_to_string(dir_purpose)); - return; - } - - /* At this point, if we are a client making a direct connection to a - * directory server, we have selected a server that has at least one address - * allowed by ClientUseIPv4/6 and Reachable{"",OR,Dir}Addresses. This - * selection uses the preference in ClientPreferIPv6{OR,Dir}Port, if - * possible. (If UseBridges is set, clients always use IPv6, and prefer it - * by default.) - * - * Now choose an address that we can use to connect to the directory server. - */ - if (directory_choose_address_routerstatus(status, indirection, &use_or_ap, - &use_dir_ap) < 0) { - return; - } - - /* We don't retry the alternate OR/Dir address for the same directory if - * the address we choose fails (#6772). - * Instead, we'll retry another directory on failure. */ - - directory_initiate_command_rend(&use_or_ap, &use_dir_ap, - status->identity_digest, - dir_purpose, router_purpose, - indirection, resource, - payload, payload_len, if_modified_since, - rend_query, - guard_state); -} - -/** Launch a new connection to the directory server <b>status</b> to - * upload or download a server or rendezvous - * descriptor. <b>dir_purpose</b> determines what - * kind of directory connection we're launching, and must be one of - * DIR_PURPOSE_{FETCH|UPLOAD}_{DIR|RENDDESC_V2}. <b>router_purpose</b> - * specifies the descriptor purposes we have in mind (currently only - * used for FETCH_DIR). - * - * When uploading, <b>payload</b> and <b>payload_len</b> determine the content - * of the HTTP post. Otherwise, <b>payload</b> should be NULL. - * - * When fetching a rendezvous descriptor, <b>resource</b> is the service ID we - * want to fetch. - */ -MOCK_IMPL(void, directory_initiate_command_routerstatus, - (const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - circuit_guard_state_t *guard_state)) -{ - directory_initiate_command_routerstatus_rend(status, dir_purpose, - router_purpose, - indirection, resource, - payload, payload_len, - if_modified_since, NULL, - guard_state); -} - /** Return true iff <b>conn</b> is the client side of a directory connection * we launched to ourself in order to determine the reachability of our * dir_port. */ @@ -1064,8 +988,50 @@ directory_must_use_begindir(const or_options_t *options) return !public_server_mode(options); } +struct directory_request_t { + /** + * These fields specify which directory we're contacting. Routerstatus, + * if present, overrides the other fields. + * + * @{ */ + tor_addr_port_t or_addr_port; + tor_addr_port_t dir_addr_port; + char digest[DIGEST_LEN]; + + const routerstatus_t *routerstatus; + /** @} */ + /** One of DIR_PURPOSE_* other than DIR_PURPOSE_SERVER. Describes what + * kind of operation we'll be doing (upload/download), and of what kind + * of document. */ + uint8_t dir_purpose; + /** One of ROUTER_PURPOSE_*; used for uploads and downloads of routerinfo + * and extrainfo docs. */ + uint8_t router_purpose; + /** Enum: determines whether to anonymize, and whether to use dirport or + * orport. */ + dir_indirection_t indirection; + /** Alias to the variable part of the URL for this request */ + const char *resource; + /** Alias to the payload to upload (if any) */ + const char *payload; + /** Number of bytes to upload from payload</b> */ + size_t payload_len; + /** Value to send in an if-modified-since header, or 0 for none. */ + time_t if_modified_since; + /** Hidden-service-specific information */ + const rend_data_t *rend_query; + /** Extra headers to append to the request */ + config_line_t *additional_headers; + /** */ + /** Used internally to directory.c: gets informed when the attempt to + * connect to the directory succeeds or fails, if that attempt bears on the + * directory's usability as a directory guard. */ + circuit_guard_state_t *guard_state; +}; + /** Evaluate the situation and decide if we should use an encrypted * "begindir-style" connection for this directory request. + * 0) If there is no DirPort, yes. * 1) If or_port is 0, or it's a direct conn and or_port is firewalled * or we're a dir mirror, no. * 2) If we prefer to avoid begindir conns, and we're not fetching or @@ -1076,15 +1042,24 @@ directory_must_use_begindir(const or_options_t *options) */ static int directory_command_should_use_begindir(const or_options_t *options, - const tor_addr_t *addr, - int or_port, uint8_t router_purpose, - dir_indirection_t indirection, + const directory_request_t *req, const char **reason) { - (void) router_purpose; + const tor_addr_t *or_addr = &req->or_addr_port.addr; + //const tor_addr_t *dir_addr = &req->dir_addr_port.addr; + const int or_port = req->or_addr_port.port; + const int dir_port = req->dir_addr_port.port; + + const dir_indirection_t indirection = req->indirection; + tor_assert(reason); *reason = NULL; + /* Reasons why we must use begindir */ + if (!dir_port) { + *reason = "(using begindir - directory with no DirPort)"; + return 1; /* We don't know a DirPort -- must begindir. */ + } /* Reasons why we can't possibly use begindir */ if (!or_port) { *reason = "directory with unknown ORPort"; @@ -1097,7 +1072,7 @@ directory_command_should_use_begindir(const or_options_t *options, } if (indirection == DIRIND_ONEHOP) { /* We're firewalled and want a direct OR connection */ - if (!fascist_firewall_allows_address_addr(addr, or_port, + if (!fascist_firewall_allows_address_addr(or_addr, or_port, FIREWALL_OR_CONNECTION, 0, 0)) { *reason = "ORPort not reachable"; return 0; @@ -1116,68 +1091,290 @@ directory_command_should_use_begindir(const or_options_t *options, return 1; } -/** Helper for directory_initiate_command_rend: send the - * command to a server whose OR address/port is <b>or_addr</b>/<b>or_port</b>, - * whose directory address/port is <b>dir_addr</b>/<b>dir_port</b>, whose - * identity key digest is <b>digest</b>, with purposes <b>dir_purpose</b> and - * <b>router_purpose</b>, making an (in)direct connection as specified in - * <b>indirection</b>, with command <b>resource</b>, <b>payload</b> of - * <b>payload_len</b>, and asking for a result only <b>if_modified_since</b>. +/** + * Create and return a new directory_request_t with purpose + * <b>dir_purpose</b>. + */ +directory_request_t * +directory_request_new(uint8_t dir_purpose) +{ + tor_assert(dir_purpose >= DIR_PURPOSE_MIN_); + tor_assert(dir_purpose <= DIR_PURPOSE_MAX_); + tor_assert(dir_purpose != DIR_PURPOSE_SERVER); + tor_assert(dir_purpose != DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2); + + directory_request_t *result = tor_malloc_zero(sizeof(*result)); + tor_addr_make_null(&result->or_addr_port.addr, AF_INET); + result->or_addr_port.port = 0; + tor_addr_make_null(&result->dir_addr_port.addr, AF_INET); + result->dir_addr_port.port = 0; + result->dir_purpose = dir_purpose; + result->router_purpose = ROUTER_PURPOSE_GENERAL; + result->indirection = DIRIND_ONEHOP; + return result; +} +/** + * Release all resources held by <b>req</b>. + */ +void +directory_request_free(directory_request_t *req) +{ + if (req == NULL) + return; + config_free_lines(req->additional_headers); + tor_free(req); +} +/** + * Set the address and OR port to use for this directory request. If there is + * no OR port, we'll have to connect over the dirport. (If there are both, + * the indirection setting determins which to use.) + */ +void +directory_request_set_or_addr_port(directory_request_t *req, + const tor_addr_port_t *p) +{ + memcpy(&req->or_addr_port, p, sizeof(*p)); +} +/** + * Set the address and dirport to use for this directory request. If there + * is no dirport, we'll have to connect over the OR port. (If there are both, + * the indirection setting determins which to use.) + */ +void +directory_request_set_dir_addr_port(directory_request_t *req, + const tor_addr_port_t *p) +{ + memcpy(&req->dir_addr_port, p, sizeof(*p)); +} +/** + * Set the RSA identity digest of the directory to use for this directory + * request. */ void -directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port, - const tor_addr_t *dir_addr, uint16_t dir_port, - const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - dir_indirection_t indirection, const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since) +directory_request_set_directory_id_digest(directory_request_t *req, + const char *digest) { - tor_addr_port_t or_ap, dir_ap; + memcpy(req->digest, digest, DIGEST_LEN); +} +/** + * Set the router purpose associated with uploaded and downloaded router + * descriptors and extrainfo documents in this directory request. The purpose + * must be one of ROUTER_PURPOSE_GENERAL (the default) or + * ROUTER_PURPOSE_BRIDGE. + */ +void +directory_request_set_router_purpose(directory_request_t *req, + uint8_t router_purpose) +{ + tor_assert(router_purpose == ROUTER_PURPOSE_GENERAL || + router_purpose == ROUTER_PURPOSE_BRIDGE); + // assert that it actually makes sense to set this purpose, given + // the dir_purpose. + req->router_purpose = router_purpose; +} +/** + * Set the indirection to be used for the directory request. The indirection + * parameter configures whether to connect to a DirPort or ORPort, and whether + * to anonymize the connection. DIRIND_ONEHOP (use ORPort, don't anonymize) + * is the default. See dir_indirection_t for more information. + */ +void +directory_request_set_indirection(directory_request_t *req, + dir_indirection_t indirection) +{ + req->indirection = indirection; +} - /* Use the null tor_addr and 0 port if the address or port isn't valid. */ - if (tor_addr_port_is_valid(or_addr, or_port, 0)) { - tor_addr_copy(&or_ap.addr, or_addr); - or_ap.port = or_port; - } else { - /* the family doesn't matter here, so make it IPv4 */ - tor_addr_make_null(&or_ap.addr, AF_INET); - or_ap.port = or_port = 0; +/** + * Set a pointer to the resource to request from a directory. Different + * request types use resources to indicate different components of their URL. + * Note that only an alias to <b>resource</b> is stored, so the + * <b>resource</b> must outlive the request. + */ +void +directory_request_set_resource(directory_request_t *req, + const char *resource) +{ + req->resource = resource; +} +/** + * Set a pointer to the payload to include with this directory request, along + * with its length. Note that only an alias to <b>payload</b> is stored, so + * the <b>payload</b> must outlive the request. + */ +void +directory_request_set_payload(directory_request_t *req, + const char *payload, + size_t payload_len) +{ + tor_assert(DIR_PURPOSE_IS_UPLOAD(req->dir_purpose)); + + req->payload = payload; + req->payload_len = payload_len; +} +/** + * Set an if-modified-since date to send along with the request. The + * default is 0 (meaning, send no if-modified-since header). + */ +void +directory_request_set_if_modified_since(directory_request_t *req, + time_t if_modified_since) +{ + req->if_modified_since = if_modified_since; +} + +/** Include a header of name <b>key</b> with content <b>val</b> in the + * request. Neither may include newlines or other odd characters. Their + * ordering is not currently guaranteed. + * + * Note that, as elsewhere in this module, header keys include a trailing + * colon and space. + */ +void +directory_request_add_header(directory_request_t *req, + const char *key, + const char *val) +{ + config_line_prepend(&req->additional_headers, key, val); +} +/** + * Set an object containing HS data to be associated with this request. Note + * that only an alias to <b>query</b> is stored, so the <b>query</b> object + * must outlive the request. + */ +void +directory_request_set_rend_query(directory_request_t *req, + const rend_data_t *query) +{ + if (query) { + tor_assert(req->dir_purpose == DIR_PURPOSE_FETCH_RENDDESC_V2 || + req->dir_purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2); } + req->rend_query = query; +} +/** Set a static circuit_guard_state_t object to affliate with the request in + * <b>req</b>. This object will receive notification when the attempt to + * connect to the guard either succeeds or fails. */ +static void +directory_request_set_guard_state(directory_request_t *req, + circuit_guard_state_t *state) +{ + req->guard_state = state; +} - if (tor_addr_port_is_valid(dir_addr, dir_port, 0)) { - tor_addr_copy(&dir_ap.addr, dir_addr); - dir_ap.port = dir_port; - } else { - /* the family doesn't matter here, so make it IPv4 */ - tor_addr_make_null(&dir_ap.addr, AF_INET); - dir_ap.port = dir_port = 0; +/** + * Internal: Return true if any information for contacting the directory in + * <b>req</b> has been set, other than by the routerstatus. */ +static int +directory_request_dir_contact_info_specified(const directory_request_t *req) +{ + /* We only check for ports here, since we don't use an addr unless the port + * is set */ + return (req->or_addr_port.port || + req->dir_addr_port.port || + ! tor_digest_is_zero(req->digest)); +} + +/** + * Set the routerstatus to use for the directory associated with this + * request. If this option is set, then no other function to set the + * directory's address or identity should be called. + */ +void +directory_request_set_routerstatus(directory_request_t *req, + const routerstatus_t *status) +{ + req->routerstatus = status; +} +/** + * Helper: update the addresses, ports, and identities in <b>req</b> + * from the routerstatus object in <b>req</b>. Return 0 on success. + * On failure, warn and return -1. + */ +static int +directory_request_set_dir_from_routerstatus(directory_request_t *req) + +{ + const routerstatus_t *status = req->routerstatus; + if (BUG(status == NULL)) + return -1; + const or_options_t *options = get_options(); + const node_t *node; + tor_addr_port_t use_or_ap, use_dir_ap; + const int anonymized_connection = dirind_is_anon(req->indirection); + + tor_assert(status != NULL); + + node = node_get_by_id(status->identity_digest); + + /* XXX The below check is wrong: !node means it's not in the consensus, + * but we haven't checked if we have a descriptor for it -- and also, + * we only care about the descriptor if it's a begindir-style anonymized + * connection. */ + if (!node && anonymized_connection) { + log_info(LD_DIR, "Not sending anonymized request to directory '%s'; we " + "don't have its router descriptor.", + routerstatus_describe(status)); + return -1; } - directory_initiate_command_rend(&or_ap, &dir_ap, - digest, dir_purpose, - router_purpose, indirection, - resource, payload, payload_len, - if_modified_since, NULL, NULL); + if (options->ExcludeNodes && options->StrictNodes && + routerset_contains_routerstatus(options->ExcludeNodes, status, -1)) { + log_warn(LD_DIR, "Wanted to contact directory mirror %s for %s, but " + "it's in our ExcludedNodes list and StrictNodes is set. " + "Skipping. This choice might make your Tor not work.", + routerstatus_describe(status), + dir_conn_purpose_to_string(req->dir_purpose)); + return -1; + } + + /* At this point, if we are a client making a direct connection to a + * directory server, we have selected a server that has at least one address + * allowed by ClientUseIPv4/6 and Reachable{"",OR,Dir}Addresses. This + * selection uses the preference in ClientPreferIPv6{OR,Dir}Port, if + * possible. (If UseBridges is set, clients always use IPv6, and prefer it + * by default.) + * + * Now choose an address that we can use to connect to the directory server. + */ + if (directory_choose_address_routerstatus(status, + req->indirection, &use_or_ap, + &use_dir_ap) < 0) { + return -1; + } + + directory_request_set_or_addr_port(req, &use_or_ap); + directory_request_set_dir_addr_port(req, &use_dir_ap); + directory_request_set_directory_id_digest(req, status->identity_digest); + return 0; } -/** Same as directory_initiate_command(), but accepts rendezvous data to - * fetch a hidden service descriptor, and takes its address & port arguments - * as tor_addr_port_t. */ -static void -directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, - const tor_addr_port_t *dir_addr_port, - const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query, - circuit_guard_state_t *guard_state) +/** + * Launch the provided directory request, configured in <b>request</b>. + * After this function is called, you can free <b>request</b>. + */ +MOCK_IMPL(void, +directory_initiate_request,(directory_request_t *request)) { - tor_assert(or_addr_port); - tor_assert(dir_addr_port); + tor_assert(request); + if (request->routerstatus) { + tor_assert_nonfatal( + ! directory_request_dir_contact_info_specified(request)); + if (directory_request_set_dir_from_routerstatus(request) < 0) { + return; + } + } + + const tor_addr_port_t *or_addr_port = &request->or_addr_port; + const tor_addr_port_t *dir_addr_port = &request->dir_addr_port; + const char *digest = request->digest; + const uint8_t dir_purpose = request->dir_purpose; + const uint8_t router_purpose = request->router_purpose; + const dir_indirection_t indirection = request->indirection; + const char *resource = request->resource; + const rend_data_t *rend_query = request->rend_query; + circuit_guard_state_t *guard_state = request->guard_state; + tor_assert(or_addr_port->port || dir_addr_port->port); tor_assert(digest); @@ -1187,10 +1384,9 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, const char *begindir_reason = NULL; /* Should the connection be to a relay's OR port (and inside that we will * send our directory request)? */ - const int use_begindir = directory_command_should_use_begindir(options, - &or_addr_port->addr, or_addr_port->port, - router_purpose, indirection, - &begindir_reason); + const int use_begindir = + directory_command_should_use_begindir(options, request, &begindir_reason); + /* Will the connection go via a three-hop Tor circuit? Note that this * is separate from whether it will use_begindir. */ const int anonymized_connection = dirind_is_anon(indirection); @@ -1235,9 +1431,9 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, if (!port || tor_addr_is_null(&addr)) { static int logged_backtrace = 0; log_warn(LD_DIR, - "Cannot make an outgoing %sconnection without %sPort.", + "Cannot make an outgoing %sconnection without a remote %sPort.", use_begindir ? "begindir " : "", - use_begindir ? "an OR" : "a Dir"); + use_begindir ? "OR" : "Dir"); if (!logged_backtrace) { log_backtrace(LOG_INFO, LD_BUG, "Address came from"); logged_backtrace = 1; @@ -1291,9 +1487,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, /* fall through */ case 0: /* queue the command on the outbuf */ - directory_send_command(conn, dir_purpose, 1, resource, - payload, payload_len, - if_modified_since); + directory_send_command(conn, 1, request); connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT); /* writable indicates finish, readable indicates broken link, error indicates broken link in windowsland. */ @@ -1347,9 +1541,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, } conn->base_.state = DIR_CONN_STATE_CLIENT_SENDING; /* queue the command on the outbuf */ - directory_send_command(conn, dir_purpose, 0, resource, - payload, payload_len, - if_modified_since); + directory_send_command(conn, 0, request); connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT); connection_start_reading(ENTRY_TO_CONN(linked_conn)); @@ -1359,7 +1551,7 @@ directory_initiate_command_rend(const tor_addr_port_t *or_addr_port, /** Return true iff anything we say on <b>conn</b> is being encrypted before * we send it to the client/server. */ int -connection_dir_is_encrypted(dir_connection_t *conn) +connection_dir_is_encrypted(const dir_connection_t *conn) { /* Right now it's sufficient to see if conn is or has been linked, since * the only thing it could be linked to is an edge connection on a @@ -1452,15 +1644,22 @@ copy_ipv6_address(char* destination, const char* source, size_t len, } } -/** Queue an appropriate HTTP command on conn-\>outbuf. The other args - * are as in directory_initiate_command(). +/** Queue an appropriate HTTP command for <b>request</b> on + * <b>conn</b>-\>outbuf. If <b>direct</b> is true, we're making a + * non-anonymized connection to the dirport. */ static void directory_send_command(dir_connection_t *conn, - int purpose, int direct, const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since) + const int direct, + const directory_request_t *req) { + tor_assert(req); + const int purpose = req->dir_purpose; + const char *resource = req->resource; + const char *payload = req->payload; + const size_t payload_len = req->payload_len; + const time_t if_modified_since = req->if_modified_since; + char proxystring[256]; char hoststring[128]; /* NEEDS to be the same size hoststring. @@ -1468,7 +1667,9 @@ directory_send_command(dir_connection_t *conn, char decorated_address[128]; smartlist_t *headers = smartlist_new(); char *url; + size_t url_len; char request[8192]; + size_t request_len, total_request_len = 0; const char *httpcommand = NULL; tor_assert(conn); @@ -1522,6 +1723,14 @@ directory_send_command(dir_connection_t *conn, proxystring[0] = 0; } + /* Add additional headers, if any */ + { + config_line_t *h; + for (h = req->additional_headers; h; h = h->next) { + smartlist_add_asprintf(headers, "%s%s\r\n", h->key, h->value); + } + } + switch (purpose) { case DIR_PURPOSE_FETCH_CONSENSUS: /* resource is optional. If present, it's a flavor name */ @@ -1614,8 +1823,14 @@ directory_send_command(dir_connection_t *conn, } tor_snprintf(request, sizeof(request), "%s %s", httpcommand, proxystring); - connection_write_to_buf(request, strlen(request), TO_CONN(conn)); - connection_write_to_buf(url, strlen(url), TO_CONN(conn)); + + request_len = strlen(request); + total_request_len += request_len; + connection_write_to_buf(request, request_len, TO_CONN(conn)); + + url_len = strlen(url); + total_request_len += url_len; + connection_write_to_buf(url, url_len, TO_CONN(conn)); tor_free(url); if (!strcmp(httpcommand, "POST") || payload) { @@ -1630,15 +1845,27 @@ directory_send_command(dir_connection_t *conn, tor_free(header); } - connection_write_to_buf(request, strlen(request), TO_CONN(conn)); + request_len = strlen(request); + total_request_len += request_len; + connection_write_to_buf(request, request_len, TO_CONN(conn)); if (payload) { /* then send the payload afterwards too */ connection_write_to_buf(payload, payload_len, TO_CONN(conn)); + total_request_len += payload_len; } SMARTLIST_FOREACH(headers, char *, h, tor_free(h)); smartlist_free(headers); + + log_debug(LD_DIR, + "Sent request to directory server '%s:%d': " + "(purpose: %d, request size: " U64_FORMAT ", " + "payload size: " U64_FORMAT ")", + conn->base_.address, conn->base_.port, + conn->base_.purpose, + U64_PRINTF_ARG(total_request_len), + U64_PRINTF_ARG(payload ? payload_len : 0)); } /** Parse an HTTP request string <b>headers</b> of the form @@ -1905,6 +2132,39 @@ load_downloaded_routers(const char *body, smartlist_t *which, return added; } +/** A structure to hold arguments passed into each directory response + * handler */ +typedef struct response_handler_args_t { + int status_code; + const char *reason; + const char *body; + size_t body_len; + const char *headers; +} response_handler_args_t; + +static int handle_response_fetch_consensus(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_fetch_certificate(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_fetch_status_vote(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_fetch_detached_signatures(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_fetch_desc(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_fetch_microdesc(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_upload_dir(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_upload_vote(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_upload_signatures(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_fetch_renddesc_v2(dir_connection_t *, + const response_handler_args_t *); +static int handle_response_upload_renddesc_v2(dir_connection_t *, + const response_handler_args_t *); + /** We are a client, and we've finished reading the server's * response. Parse it and act appropriately. * @@ -1930,8 +2190,9 @@ connection_dir_client_reached_eof(dir_connection_t *conn) int allow_partial = (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO || conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); - time_t now = time(NULL); - int src_code; + size_t received_bytes; + + received_bytes = connection_get_inbuf_len(TO_CONN(conn)); switch (connection_fetch_from_buf_http(TO_CONN(conn), &headers, MAX_HEADERS_SIZE, @@ -1958,12 +2219,20 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } if (!reason) reason = tor_strdup("[no reason given]"); - log_debug(LD_DIR, + tor_log(LOG_DEBUG, LD_DIR, "Received response from directory server '%s:%d': %d %s " - "(purpose: %d)", + "(purpose: %d, response size: " U64_FORMAT +#ifdef MEASUREMENTS_21206 + ", data cells received: %d, data cells sent: %d" +#endif + ", compression: %d)", conn->base_.address, conn->base_.port, status_code, - escaped(reason), - conn->base_.purpose); + escaped(reason), conn->base_.purpose, + U64_PRINTF_ARG(received_bytes), +#ifdef MEASUREMENTS_21206 + conn->data_cells_received, conn->data_cells_sent, +#endif + compression); if (conn->guard_state) { /* we count the connection as successful once we can read from it. We do @@ -2014,6 +2283,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn) "'%s:%d'. I'll try again soon.", status_code, escaped(reason), conn->base_.address, conn->base_.port); + time_t now = approx_time(); if ((rs = router_get_mutable_consensus_status_by_id(id_digest))) rs->last_dir_503_at = now; if ((ds = router_get_fallback_dirserver_by_digest(id_digest))) @@ -2056,15 +2326,15 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } /* Try declared compression first if we can. */ if (compression == GZIP_METHOD || compression == ZLIB_METHOD) - tor_gzip_uncompress(&new_body, &new_len, body, body_len, compression, - !allow_partial, LOG_PROTOCOL_WARN); + tor_uncompress(&new_body, &new_len, body, body_len, compression, + !allow_partial, LOG_PROTOCOL_WARN); /* Okay, if that didn't work, and we think that it was compressed * differently, try that. */ if (!new_body && (guessed == GZIP_METHOD || guessed == ZLIB_METHOD) && compression != guessed) - tor_gzip_uncompress(&new_body, &new_len, body, body_len, guessed, - !allow_partial, LOG_PROTOCOL_WARN); + tor_uncompress(&new_body, &new_len, body, body_len, guessed, + !allow_partial, LOG_PROTOCOL_WARN); /* If we're pretty sure that we have a compressed directory, and * we didn't manage to uncompress it, then warn and bail. */ if (!plausible && !new_body) { @@ -2081,473 +2351,735 @@ connection_dir_client_reached_eof(dir_connection_t *conn) } } - if (conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS) { - int r; - const char *flavname = conn->requested_resource; - if (status_code != 200) { - int severity = (status_code == 304) ? LOG_INFO : LOG_WARN; - tor_log(severity, LD_DIR, - "Received http status code %d (%s) from server " - "'%s:%d' while fetching consensus directory.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - tor_free(body); tor_free(headers); tor_free(reason); - networkstatus_consensus_download_failed(status_code, flavname); - return -1; + int rv; + response_handler_args_t args; + memset(&args, 0, sizeof(args)); + args.status_code = status_code; + args.reason = reason; + args.body = body; + args.body_len = body_len; + args.headers = headers; + + switch (conn->base_.purpose) { + case DIR_PURPOSE_FETCH_CONSENSUS: + rv = handle_response_fetch_consensus(conn, &args); + break; + case DIR_PURPOSE_FETCH_CERTIFICATE: + rv = handle_response_fetch_certificate(conn, &args); + break; + case DIR_PURPOSE_FETCH_STATUS_VOTE: + rv = handle_response_fetch_status_vote(conn, &args); + break; + case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES: + rv = handle_response_fetch_detached_signatures(conn, &args); + break; + case DIR_PURPOSE_FETCH_SERVERDESC: + case DIR_PURPOSE_FETCH_EXTRAINFO: + rv = handle_response_fetch_desc(conn, &args); + break; + case DIR_PURPOSE_FETCH_MICRODESC: + rv = handle_response_fetch_microdesc(conn, &args); + break; + case DIR_PURPOSE_FETCH_RENDDESC_V2: + rv = handle_response_fetch_renddesc_v2(conn, &args); + break; + case DIR_PURPOSE_UPLOAD_DIR: + rv = handle_response_upload_dir(conn, &args); + break; + case DIR_PURPOSE_UPLOAD_SIGNATURES: + rv = handle_response_upload_signatures(conn, &args); + break; + case DIR_PURPOSE_UPLOAD_VOTE: + rv = handle_response_upload_vote(conn, &args); + break; + case DIR_PURPOSE_UPLOAD_RENDDESC_V2: + rv = handle_response_upload_renddesc_v2(conn, &args); + break; + default: + tor_assert_nonfatal_unreached(); + rv = -1; + break; + } + tor_free(body); + tor_free(headers); + tor_free(reason); + return rv; +} + +/** + * Handler function: processes a response to a request for a networkstatus + * consensus document by checking the consensus, storing it, and marking + * router requests as reachable. + **/ +static int +handle_response_fetch_consensus(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_CONSENSUS); + const int status_code = args->status_code; + const char *body = args->body; + const size_t body_len = args->body_len; + const char *reason = args->reason; + const time_t now = approx_time(); + + const char *consensus; + char *new_consensus = NULL; + const char *sourcename; + + int r; + const char *flavname = conn->requested_resource; + if (status_code != 200) { + int severity = (status_code == 304) ? LOG_INFO : LOG_WARN; + tor_log(severity, LD_DIR, + "Received http status code %d (%s) from server " + "'%s:%d' while fetching consensus directory.", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + networkstatus_consensus_download_failed(status_code, flavname); + return -1; + } + + if (looks_like_a_consensus_diff(body, body_len)) { + /* First find our previous consensus. Maybe it's in ram, maybe not. */ + cached_dir_t *cd = dirserv_get_consensus(flavname); + const char *consensus_body; + char *owned_consensus = NULL; + if (cd) { + consensus_body = cd->dir; + } else { + owned_consensus = networkstatus_read_cached_consensus(flavname); + consensus_body = owned_consensus; } - log_info(LD_DIR,"Received consensus directory (size %d) from server " - "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port); - if ((r=networkstatus_set_current_consensus(body, flavname, 0, - conn->identity_digest))<0) { - log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR, - "Unable to load %s consensus directory downloaded from " - "server '%s:%d'. I'll try again soon.", - flavname, conn->base_.address, conn->base_.port); - tor_free(body); tor_free(headers); tor_free(reason); + if (!consensus_body) { + log_warn(LD_DIR, "Received a consensus diff, but we can't find " + "any %s-flavored consensus in our current cache.",flavname); networkstatus_consensus_download_failed(0, flavname); + // XXXX if this happens too much, see below return -1; } - /* If we launched other fetches for this consensus, cancel them. */ - connection_dir_close_consensus_fetches(conn, flavname); - - /* launches router downloads as needed */ - routers_update_all_from_networkstatus(now, 3); - update_microdescs_from_networkstatus(now); - update_microdesc_downloads(now); - directory_info_has_arrived(now, 0, 0); - if (authdir_mode_v3(get_options())) { - sr_act_post_consensus( - networkstatus_get_latest_consensus_by_flavor(FLAV_NS)); - } - log_info(LD_DIR, "Successfully loaded consensus."); - } - - if (conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE) { - if (status_code != 200) { - log_warn(LD_DIR, - "Received http status code %d (%s) from server " - "'%s:%d' while fetching \"/tor/keys/%s\".", - status_code, escaped(reason), conn->base_.address, - conn->base_.port, conn->requested_resource); - connection_dir_download_cert_failed(conn, status_code); - tor_free(body); tor_free(headers); tor_free(reason); + new_consensus = consensus_diff_apply(consensus_body, body); + tor_free(owned_consensus); + if (new_consensus == NULL) { + log_warn(LD_DIR, "Could not apply consensus diff received from server " + "'%s:%d'", conn->base_.address, conn->base_.port); + // XXXX If this happens too many times, we should maybe not use + // XXXX this directory for diffs any more? + networkstatus_consensus_download_failed(0, flavname); return -1; } - log_info(LD_DIR,"Received authority certificates (size %d) from server " + log_info(LD_DIR, "Applied consensus diff (size %d) from server " + "'%s:%d', resulting in a new consensus document (size %d).", + (int)body_len, conn->base_.address, conn->base_.port, + (int)strlen(new_consensus)); + consensus = new_consensus; + sourcename = "generated based on a diff"; + } else { + log_info(LD_DIR,"Received consensus directory (body size %d) from server " "'%s:%d'", (int)body_len, conn->base_.address, conn->base_.port); + consensus = body; + sourcename = "downloaded"; + } + + if ((r=networkstatus_set_current_consensus(consensus, flavname, 0, + conn->identity_digest))<0) { + log_fn(r<-1?LOG_WARN:LOG_INFO, LD_DIR, + "Unable to load %s consensus directory %s from " + "server '%s:%d'. I'll try again soon.", + flavname, sourcename, conn->base_.address, conn->base_.port); + networkstatus_consensus_download_failed(0, flavname); + tor_free(new_consensus); + return -1; + } - /* - * Tell trusted_dirs_load_certs_from_string() whether it was by fp - * or fp-sk pair. - */ - src_code = -1; - if (!strcmpstart(conn->requested_resource, "fp/")) { - src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST; - } else if (!strcmpstart(conn->requested_resource, "fp-sk/")) { - src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_SK_DIGEST; - } + /* If we launched other fetches for this consensus, cancel them. */ + connection_dir_close_consensus_fetches(conn, flavname); - if (src_code != -1) { - if (trusted_dirs_load_certs_from_string(body, src_code, 1, - conn->identity_digest)<0) { - log_warn(LD_DIR, "Unable to parse fetched certificates"); - /* if we fetched more than one and only some failed, the successful - * ones got flushed to disk so it's safe to call this on them */ - connection_dir_download_cert_failed(conn, status_code); - } else { - directory_info_has_arrived(now, 0, 0); - log_info(LD_DIR, "Successfully loaded certificates from fetch."); - } - } else { - log_warn(LD_DIR, - "Couldn't figure out what to do with fetched certificates for " - "unknown resource %s", - conn->requested_resource); + /* launches router downloads as needed */ + routers_update_all_from_networkstatus(now, 3); + update_microdescs_from_networkstatus(now); + update_microdesc_downloads(now); + directory_info_has_arrived(now, 0, 0); + if (authdir_mode_v3(get_options())) { + sr_act_post_consensus( + networkstatus_get_latest_consensus_by_flavor(FLAV_NS)); + } + log_info(LD_DIR, "Successfully loaded consensus."); + + tor_free(new_consensus); + return 0; +} + +/** + * Handler function: processes a response to a request for one or more + * authority certificates + **/ +static int +handle_response_fetch_certificate(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_CERTIFICATE); + const int status_code = args->status_code; + const char *reason = args->reason; + const char *body = args->body; + const size_t body_len = args->body_len; + + if (status_code != 200) { + log_warn(LD_DIR, + "Received http status code %d (%s) from server " + "'%s:%d' while fetching \"/tor/keys/%s\".", + status_code, escaped(reason), conn->base_.address, + conn->base_.port, conn->requested_resource); + connection_dir_download_cert_failed(conn, status_code); + return -1; + } + log_info(LD_DIR,"Received authority certificates (body size %d) from " + "server '%s:%d'", + (int)body_len, conn->base_.address, conn->base_.port); + + /* + * Tell trusted_dirs_load_certs_from_string() whether it was by fp + * or fp-sk pair. + */ + int src_code = -1; + if (!strcmpstart(conn->requested_resource, "fp/")) { + src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_DIGEST; + } else if (!strcmpstart(conn->requested_resource, "fp-sk/")) { + src_code = TRUSTED_DIRS_CERTS_SRC_DL_BY_ID_SK_DIGEST; + } + + if (src_code != -1) { + if (trusted_dirs_load_certs_from_string(body, src_code, 1, + conn->identity_digest)<0) { + log_warn(LD_DIR, "Unable to parse fetched certificates"); + /* if we fetched more than one and only some failed, the successful + * ones got flushed to disk so it's safe to call this on them */ connection_dir_download_cert_failed(conn, status_code); + } else { + time_t now = approx_time(); + directory_info_has_arrived(now, 0, 0); + log_info(LD_DIR, "Successfully loaded certificates from fetch."); } + } else { + log_warn(LD_DIR, + "Couldn't figure out what to do with fetched certificates for " + "unknown resource %s", + conn->requested_resource); + connection_dir_download_cert_failed(conn, status_code); } - if (conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) { - const char *msg; - int st; - log_info(LD_DIR,"Got votes (size %d) from server %s:%d", - (int)body_len, conn->base_.address, conn->base_.port); - if (status_code != 200) { - log_warn(LD_DIR, + return 0; +} + +/** + * Handler function: processes a response to a request for an authority's + * current networkstatus vote. + **/ +static int +handle_response_fetch_status_vote(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_STATUS_VOTE); + const int status_code = args->status_code; + const char *reason = args->reason; + const char *body = args->body; + const size_t body_len = args->body_len; + + const char *msg; + int st; + log_info(LD_DIR,"Got votes (body size %d) from server %s:%d", + (int)body_len, conn->base_.address, conn->base_.port); + if (status_code != 200) { + log_warn(LD_DIR, "Received http status code %d (%s) from server " "'%s:%d' while fetching \"/tor/status-vote/next/%s.z\".", status_code, escaped(reason), conn->base_.address, conn->base_.port, conn->requested_resource); - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - dirvote_add_vote(body, &msg, &st); - if (st > 299) { - log_warn(LD_DIR, "Error adding retrieved vote: %s", msg); - } else { - log_info(LD_DIR, "Added vote(s) successfully [msg: %s]", msg); - } + return -1; } - if (conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES) { - const char *msg = NULL; - log_info(LD_DIR,"Got detached signatures (size %d) from server %s:%d", - (int)body_len, conn->base_.address, conn->base_.port); - if (status_code != 200) { - log_warn(LD_DIR, + dirvote_add_vote(body, &msg, &st); + if (st > 299) { + log_warn(LD_DIR, "Error adding retrieved vote: %s", msg); + } else { + log_info(LD_DIR, "Added vote(s) successfully [msg: %s]", msg); + } + + return 0; +} + +/** + * Handler function: processes a response to a request for the signatures + * that an authority knows about on a given consensus. + **/ +static int +handle_response_fetch_detached_signatures(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_DETACHED_SIGNATURES); + const int status_code = args->status_code; + const char *reason = args->reason; + const char *body = args->body; + const size_t body_len = args->body_len; + + const char *msg = NULL; + log_info(LD_DIR,"Got detached signatures (body size %d) from server %s:%d", + (int)body_len, conn->base_.address, conn->base_.port); + if (status_code != 200) { + log_warn(LD_DIR, "Received http status code %d (%s) from server '%s:%d' while fetching " "\"/tor/status-vote/next/consensus-signatures.z\".", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - tor_free(body); tor_free(headers); tor_free(reason); - return -1; - } - if (dirvote_add_signatures(body, conn->base_.address, &msg)<0) { - log_warn(LD_DIR, "Problem adding detached signatures from %s:%d: %s", - conn->base_.address, conn->base_.port, msg?msg:"???"); - } + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + return -1; + } + if (dirvote_add_signatures(body, conn->base_.address, &msg)<0) { + log_warn(LD_DIR, "Problem adding detached signatures from %s:%d: %s", + conn->base_.address, conn->base_.port, msg?msg:"???"); } - if (conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || - conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO) { - int was_ei = conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO; - smartlist_t *which = NULL; - int n_asked_for = 0; - int descriptor_digests = conn->requested_resource && - !strcmpstart(conn->requested_resource,"d/"); - log_info(LD_DIR,"Received %s (size %d) from server '%s:%d'", - was_ei ? "extra server info" : "server info", - (int)body_len, conn->base_.address, conn->base_.port); - if (conn->requested_resource && - (!strcmpstart(conn->requested_resource,"d/") || - !strcmpstart(conn->requested_resource,"fp/"))) { - which = smartlist_new(); - dir_split_resource_into_fingerprints(conn->requested_resource + - (descriptor_digests ? 2 : 3), - which, NULL, 0); - n_asked_for = smartlist_len(which); - } - if (status_code != 200) { - int dir_okay = status_code == 404 || - (status_code == 400 && !strcmp(reason, "Servers unavailable.")); - /* 404 means that it didn't have them; no big deal. - * Older (pre-0.1.1.8) servers said 400 Servers unavailable instead. */ - log_fn(dir_okay ? LOG_INFO : LOG_WARN, LD_DIR, - "Received http status code %d (%s) from server '%s:%d' " - "while fetching \"/tor/server/%s\". I'll try again soon.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port, conn->requested_resource); - if (!which) { - connection_dir_download_routerdesc_failed(conn); - } else { - dir_routerdesc_download_failed(which, status_code, - conn->router_purpose, - was_ei, descriptor_digests); - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - } - tor_free(body); tor_free(headers); tor_free(reason); - return dir_okay ? 0 : -1; - } - /* Learn the routers, assuming we requested by fingerprint or "all" - * or "authority". - * - * We use "authority" to fetch our own descriptor for - * testing, and to fetch bridge descriptors for bootstrapping. Ignore - * the output of "authority" requests unless we are using bridges, - * since otherwise they'll be the response from reachability tests, - * and we don't really want to add that to our routerlist. */ - if (which || (conn->requested_resource && - (!strcmpstart(conn->requested_resource, "all") || - (!strcmpstart(conn->requested_resource, "authority") && - get_options()->UseBridges)))) { - /* as we learn from them, we remove them from 'which' */ - if (was_ei) { - router_load_extrainfo_from_string(body, NULL, SAVED_NOWHERE, which, - descriptor_digests); - } else { - //router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, - // descriptor_digests, conn->router_purpose); - if (load_downloaded_routers(body, which, descriptor_digests, - conn->router_purpose, - conn->base_.address)) - directory_info_has_arrived(now, 0, 0); - } - } - if (which) { /* mark remaining ones as failed */ - log_info(LD_DIR, "Received %d/%d %s requested from %s:%d", - n_asked_for-smartlist_len(which), n_asked_for, - was_ei ? "extra-info documents" : "router descriptors", - conn->base_.address, (int)conn->base_.port); - if (smartlist_len(which)) { - dir_routerdesc_download_failed(which, status_code, - conn->router_purpose, - was_ei, descriptor_digests); - } - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - } - if (directory_conn_is_self_reachability_test(conn)) - router_dirport_found_reachable(); - } - if (conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC) { - smartlist_t *which = NULL; - log_info(LD_DIR,"Received answer to microdescriptor request (status %d, " - "size %d) from server '%s:%d'", - status_code, (int)body_len, conn->base_.address, - conn->base_.port); - tor_assert(conn->requested_resource && - !strcmpstart(conn->requested_resource, "d/")); + return 0; +} + +/** + * Handler function: processes a response to a request for a group of server + * descriptors or an extrainfo documents. + **/ +static int +handle_response_fetch_desc(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_SERVERDESC || + conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO); + const int status_code = args->status_code; + const char *reason = args->reason; + const char *body = args->body; + const size_t body_len = args->body_len; + + int was_ei = conn->base_.purpose == DIR_PURPOSE_FETCH_EXTRAINFO; + smartlist_t *which = NULL; + int n_asked_for = 0; + int descriptor_digests = conn->requested_resource && + !strcmpstart(conn->requested_resource,"d/"); + log_info(LD_DIR,"Received %s (body size %d) from server '%s:%d'", + was_ei ? "extra server info" : "server info", + (int)body_len, conn->base_.address, conn->base_.port); + if (conn->requested_resource && + (!strcmpstart(conn->requested_resource,"d/") || + !strcmpstart(conn->requested_resource,"fp/"))) { which = smartlist_new(); - dir_split_resource_into_fingerprints(conn->requested_resource+2, - which, NULL, - DSR_DIGEST256|DSR_BASE64); - if (status_code != 200) { - log_info(LD_DIR, "Received status code %d (%s) from server " - "'%s:%d' while fetching \"/tor/micro/%s\". I'll try again " - "soon.", - status_code, escaped(reason), conn->base_.address, - (int)conn->base_.port, conn->requested_resource); - dir_microdesc_download_failed(which, status_code); + dir_split_resource_into_fingerprints(conn->requested_resource + + (descriptor_digests ? 2 : 3), + which, NULL, 0); + n_asked_for = smartlist_len(which); + } + if (status_code != 200) { + int dir_okay = status_code == 404 || + (status_code == 400 && !strcmp(reason, "Servers unavailable.")); + /* 404 means that it didn't have them; no big deal. + * Older (pre-0.1.1.8) servers said 400 Servers unavailable instead. */ + log_fn(dir_okay ? LOG_INFO : LOG_WARN, LD_DIR, + "Received http status code %d (%s) from server '%s:%d' " + "while fetching \"/tor/server/%s\". I'll try again soon.", + status_code, escaped(reason), conn->base_.address, + conn->base_.port, conn->requested_resource); + if (!which) { + connection_dir_download_routerdesc_failed(conn); + } else { + dir_routerdesc_download_failed(which, status_code, + conn->router_purpose, + was_ei, descriptor_digests); SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); smartlist_free(which); - tor_free(body); tor_free(headers); tor_free(reason); - return 0; + } + return dir_okay ? 0 : -1; + } + /* Learn the routers, assuming we requested by fingerprint or "all" + * or "authority". + * + * We use "authority" to fetch our own descriptor for + * testing, and to fetch bridge descriptors for bootstrapping. Ignore + * the output of "authority" requests unless we are using bridges, + * since otherwise they'll be the response from reachability tests, + * and we don't really want to add that to our routerlist. */ + if (which || (conn->requested_resource && + (!strcmpstart(conn->requested_resource, "all") || + (!strcmpstart(conn->requested_resource, "authority") && + get_options()->UseBridges)))) { + /* as we learn from them, we remove them from 'which' */ + if (was_ei) { + router_load_extrainfo_from_string(body, NULL, SAVED_NOWHERE, which, + descriptor_digests); } else { - smartlist_t *mds; - mds = microdescs_add_to_cache(get_microdesc_cache(), - body, body+body_len, SAVED_NOWHERE, 0, - now, which); - if (smartlist_len(which)) { - /* Mark remaining ones as failed. */ - dir_microdesc_download_failed(which, status_code); - } - if (mds && smartlist_len(mds)) { - control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, - count_loading_descriptors_progress()); - directory_info_has_arrived(now, 0, 1); + //router_load_routers_from_string(body, NULL, SAVED_NOWHERE, which, + // descriptor_digests, conn->router_purpose); + if (load_downloaded_routers(body, which, descriptor_digests, + conn->router_purpose, + conn->base_.address)) { + time_t now = approx_time(); + directory_info_has_arrived(now, 0, 0); } - SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); - smartlist_free(which); - smartlist_free(mds); } } + if (which) { /* mark remaining ones as failed */ + log_info(LD_DIR, "Received %d/%d %s requested from %s:%d", + n_asked_for-smartlist_len(which), n_asked_for, + was_ei ? "extra-info documents" : "router descriptors", + conn->base_.address, (int)conn->base_.port); + if (smartlist_len(which)) { + dir_routerdesc_download_failed(which, status_code, + conn->router_purpose, + was_ei, descriptor_digests); + } + SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); + smartlist_free(which); + } + if (directory_conn_is_self_reachability_test(conn)) + router_dirport_found_reachable(); - if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_DIR) { - switch (status_code) { - case 200: { - dir_server_t *ds = - router_get_trusteddirserver_by_digest(conn->identity_digest); - char *rejected_hdr = http_get_header(headers, - "X-Descriptor-Not-New: "); - if (rejected_hdr) { - if (!strcmp(rejected_hdr, "Yes")) { - log_info(LD_GENERAL, - "Authority '%s' declined our descriptor (not new)", - ds->nickname); - /* XXXX use this information; be sure to upload next one - * sooner. -NM */ - /* XXXX++ On further thought, the task above implies that we're - * basing our regenerate-descriptor time on when we uploaded the - * last descriptor, not on the published time of the last - * descriptor. If those are different, that's a bad thing to - * do. -NM */ - } - tor_free(rejected_hdr); - } - log_info(LD_GENERAL,"eof (status 200) after uploading server " - "descriptor: finished."); - control_event_server_status( - LOG_NOTICE, "ACCEPTED_SERVER_DESCRIPTOR DIRAUTH=%s:%d", - conn->base_.address, conn->base_.port); - - ds->has_accepted_serverdesc = 1; - if (directories_have_accepted_server_descriptor()) - control_event_server_status(LOG_NOTICE, "GOOD_SERVER_DESCRIPTOR"); - } - break; - case 400: - log_warn(LD_GENERAL,"http status 400 (%s) response from " - "dirserver '%s:%d'. Please correct.", - escaped(reason), conn->base_.address, conn->base_.port); - control_event_server_status(LOG_WARN, - "BAD_SERVER_DESCRIPTOR DIRAUTH=%s:%d REASON=\"%s\"", - conn->base_.address, conn->base_.port, escaped(reason)); - break; - default: - log_warn(LD_GENERAL, + return 0; +} + +/** + * Handler function: processes a response to a request for a group of + * microdescriptors + **/ +static int +handle_response_fetch_microdesc(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_MICRODESC); + const int status_code = args->status_code; + const char *reason = args->reason; + const char *body = args->body; + const size_t body_len = args->body_len; + + smartlist_t *which = NULL; + log_info(LD_DIR,"Received answer to microdescriptor request (status %d, " + "body size %d) from server '%s:%d'", + status_code, (int)body_len, conn->base_.address, + conn->base_.port); + tor_assert(conn->requested_resource && + !strcmpstart(conn->requested_resource, "d/")); + which = smartlist_new(); + dir_split_resource_into_fingerprints(conn->requested_resource+2, + which, NULL, + DSR_DIGEST256|DSR_BASE64); + if (status_code != 200) { + log_info(LD_DIR, "Received status code %d (%s) from server " + "'%s:%d' while fetching \"/tor/micro/%s\". I'll try again " + "soon.", + status_code, escaped(reason), conn->base_.address, + (int)conn->base_.port, conn->requested_resource); + dir_microdesc_download_failed(which, status_code); + SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); + smartlist_free(which); + return 0; + } else { + smartlist_t *mds; + time_t now = approx_time(); + mds = microdescs_add_to_cache(get_microdesc_cache(), + body, body+body_len, SAVED_NOWHERE, 0, + now, which); + if (smartlist_len(which)) { + /* Mark remaining ones as failed. */ + dir_microdesc_download_failed(which, status_code); + } + if (mds && smartlist_len(mds)) { + control_event_bootstrap(BOOTSTRAP_STATUS_LOADING_DESCRIPTORS, + count_loading_descriptors_progress()); + directory_info_has_arrived(now, 0, 1); + } + SMARTLIST_FOREACH(which, char *, cp, tor_free(cp)); + smartlist_free(which); + smartlist_free(mds); + } + + return 0; +} + +/** + * Handler function: processes a response to a POST request to upload our + * router descriptor. + **/ +static int +handle_response_upload_dir(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_DIR); + const int status_code = args->status_code; + const char *reason = args->reason; + const char *headers = args->headers; + + switch (status_code) { + case 200: { + dir_server_t *ds = + router_get_trusteddirserver_by_digest(conn->identity_digest); + char *rejected_hdr = http_get_header(headers, + "X-Descriptor-Not-New: "); + if (rejected_hdr) { + if (!strcmp(rejected_hdr, "Yes")) { + log_info(LD_GENERAL, + "Authority '%s' declined our descriptor (not new)", + ds->nickname); + /* XXXX use this information; be sure to upload next one + * sooner. -NM */ + /* XXXX++ On further thought, the task above implies that we're + * basing our regenerate-descriptor time on when we uploaded the + * last descriptor, not on the published time of the last + * descriptor. If those are different, that's a bad thing to + * do. -NM */ + } + tor_free(rejected_hdr); + } + log_info(LD_GENERAL,"eof (status 200) after uploading server " + "descriptor: finished."); + control_event_server_status( + LOG_NOTICE, "ACCEPTED_SERVER_DESCRIPTOR DIRAUTH=%s:%d", + conn->base_.address, conn->base_.port); + + ds->has_accepted_serverdesc = 1; + if (directories_have_accepted_server_descriptor()) + control_event_server_status(LOG_NOTICE, "GOOD_SERVER_DESCRIPTOR"); + } + break; + case 400: + log_warn(LD_GENERAL,"http status 400 (%s) response from " + "dirserver '%s:%d'. Please correct.", + escaped(reason), conn->base_.address, conn->base_.port); + control_event_server_status(LOG_WARN, + "BAD_SERVER_DESCRIPTOR DIRAUTH=%s:%d REASON=\"%s\"", + conn->base_.address, conn->base_.port, escaped(reason)); + break; + default: + log_warn(LD_GENERAL, "http status %d (%s) reason unexpected while uploading " "descriptor to server '%s:%d').", status_code, escaped(reason), conn->base_.address, conn->base_.port); - break; - } - /* return 0 in all cases, since we don't want to mark any - * dirservers down just because they don't like us. */ + break; } + /* return 0 in all cases, since we don't want to mark any + * dirservers down just because they don't like us. */ - if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_VOTE) { - switch (status_code) { - case 200: { - log_notice(LD_DIR,"Uploaded a vote to dirserver %s:%d", - conn->base_.address, conn->base_.port); - } - break; - case 400: - log_warn(LD_DIR,"http status 400 (%s) response after uploading " - "vote to dirserver '%s:%d'. Please correct.", - escaped(reason), conn->base_.address, conn->base_.port); - break; - default: - log_warn(LD_GENERAL, + return 0; +} + +/** + * Handler function: processes a response to POST request to upload our + * own networkstatus vote. + **/ +static int +handle_response_upload_vote(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_VOTE); + const int status_code = args->status_code; + const char *reason = args->reason; + + switch (status_code) { + case 200: { + log_notice(LD_DIR,"Uploaded a vote to dirserver %s:%d", + conn->base_.address, conn->base_.port); + } + break; + case 400: + log_warn(LD_DIR,"http status 400 (%s) response after uploading " + "vote to dirserver '%s:%d'. Please correct.", + escaped(reason), conn->base_.address, conn->base_.port); + break; + default: + log_warn(LD_GENERAL, "http status %d (%s) reason unexpected while uploading " "vote to server '%s:%d').", status_code, escaped(reason), conn->base_.address, conn->base_.port); - break; - } - /* return 0 in all cases, since we don't want to mark any - * dirservers down just because they don't like us. */ + break; } + /* return 0 in all cases, since we don't want to mark any + * dirservers down just because they don't like us. */ + return 0; +} - if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_SIGNATURES) { - switch (status_code) { - case 200: { - log_notice(LD_DIR,"Uploaded signature(s) to dirserver %s:%d", - conn->base_.address, conn->base_.port); - } - break; - case 400: - log_warn(LD_DIR,"http status 400 (%s) response after uploading " - "signatures to dirserver '%s:%d'. Please correct.", - escaped(reason), conn->base_.address, conn->base_.port); - break; - default: - log_warn(LD_GENERAL, +/** + * Handler function: processes a response to POST request to upload our + * view of the signatures on the current consensus. + **/ +static int +handle_response_upload_signatures(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_SIGNATURES); + const int status_code = args->status_code; + const char *reason = args->reason; + + switch (status_code) { + case 200: { + log_notice(LD_DIR,"Uploaded signature(s) to dirserver %s:%d", + conn->base_.address, conn->base_.port); + } + break; + case 400: + log_warn(LD_DIR,"http status 400 (%s) response after uploading " + "signatures to dirserver '%s:%d'. Please correct.", + escaped(reason), conn->base_.address, conn->base_.port); + break; + default: + log_warn(LD_GENERAL, "http status %d (%s) reason unexpected while uploading " "signatures to server '%s:%d').", status_code, escaped(reason), conn->base_.address, conn->base_.port); - break; - } - /* return 0 in all cases, since we don't want to mark any - * dirservers down just because they don't like us. */ - } - - if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) { - #define SEND_HS_DESC_FAILED_EVENT(reason) ( \ - control_event_hs_descriptor_failed(conn->rend_data, \ - conn->identity_digest, \ - reason) ) - #define SEND_HS_DESC_FAILED_CONTENT() ( \ - control_event_hs_descriptor_content(rend_data_get_address(conn->rend_data), \ - conn->requested_resource, \ + break; + } + /* return 0 in all cases, since we don't want to mark any + * dirservers down just because they don't like us. */ + + return 0; +} + +/** + * Handler function: processes a response to a request for a v2 hidden service + * descriptor. + **/ +static int +handle_response_fetch_renddesc_v2(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2); + const int status_code = args->status_code; + const char *reason = args->reason; + const char *body = args->body; + const size_t body_len = args->body_len; + +#define SEND_HS_DESC_FAILED_EVENT(reason) \ + (control_event_hs_descriptor_failed(conn->rend_data, \ conn->identity_digest, \ - NULL) ) - tor_assert(conn->rend_data); - log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d " - "(%s))", - (int)body_len, status_code, escaped(reason)); - switch (status_code) { - case 200: - { - rend_cache_entry_t *entry = NULL; - - if (rend_cache_store_v2_desc_as_client(body, - conn->requested_resource, conn->rend_data, &entry) < 0) { - log_warn(LD_REND,"Fetching v2 rendezvous descriptor failed. " - "Retrying at another directory."); - /* We'll retry when connection_about_to_close_connection() - * cleans this dir conn up. */ - SEND_HS_DESC_FAILED_EVENT("BAD_DESC"); - SEND_HS_DESC_FAILED_CONTENT(); - } else { - char service_id[REND_SERVICE_ID_LEN_BASE32 + 1]; - /* Should never be NULL here if we found the descriptor. */ - tor_assert(entry); - rend_get_service_id(entry->parsed->pk, service_id); - - /* success. notify pending connections about this. */ - log_info(LD_REND, "Successfully fetched v2 rendezvous " - "descriptor."); - control_event_hs_descriptor_received(service_id, - conn->rend_data, - conn->identity_digest); - control_event_hs_descriptor_content(service_id, - conn->requested_resource, - conn->identity_digest, - body); - conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2; - rend_client_desc_trynow(service_id); - memwipe(service_id, 0, sizeof(service_id)); - } - break; - } - case 404: - /* Not there. We'll retry when - * connection_about_to_close_connection() cleans this conn up. */ - log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: " - "Retrying at another directory."); - SEND_HS_DESC_FAILED_EVENT("NOT_FOUND"); - SEND_HS_DESC_FAILED_CONTENT(); - break; - case 400: - log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " - "http status 400 (%s). Dirserver didn't like our " - "v2 rendezvous query? Retrying at another directory.", - escaped(reason)); - SEND_HS_DESC_FAILED_EVENT("QUERY_REJECTED"); - SEND_HS_DESC_FAILED_CONTENT(); - break; - default: - log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " - "http status %d (%s) response unexpected while " - "fetching v2 hidden service descriptor (server '%s:%d'). " - "Retrying at another directory.", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - SEND_HS_DESC_FAILED_EVENT("UNEXPECTED"); + reason)) +#define SEND_HS_DESC_FAILED_CONTENT() \ + (control_event_hs_descriptor_content( \ + rend_data_get_address(conn->rend_data), \ + conn->requested_resource, \ + conn->identity_digest, \ + NULL)) + + tor_assert(conn->rend_data); + log_info(LD_REND,"Received rendezvous descriptor (body size %d, status %d " + "(%s))", + (int)body_len, status_code, escaped(reason)); + switch (status_code) { + case 200: + { + rend_cache_entry_t *entry = NULL; + + if (rend_cache_store_v2_desc_as_client(body, + conn->requested_resource, + conn->rend_data, &entry) < 0) { + log_warn(LD_REND,"Fetching v2 rendezvous descriptor failed. " + "Retrying at another directory."); + /* We'll retry when connection_about_to_close_connection() + * cleans this dir conn up. */ + SEND_HS_DESC_FAILED_EVENT("BAD_DESC"); SEND_HS_DESC_FAILED_CONTENT(); - break; + } else { + char service_id[REND_SERVICE_ID_LEN_BASE32 + 1]; + /* Should never be NULL here if we found the descriptor. */ + tor_assert(entry); + rend_get_service_id(entry->parsed->pk, service_id); + + /* success. notify pending connections about this. */ + log_info(LD_REND, "Successfully fetched v2 rendezvous " + "descriptor."); + control_event_hs_descriptor_received(service_id, + conn->rend_data, + conn->identity_digest); + control_event_hs_descriptor_content(service_id, + conn->requested_resource, + conn->identity_digest, + body); + conn->base_.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC_V2; + rend_client_desc_trynow(service_id); + memwipe(service_id, 0, sizeof(service_id)); + } + break; } + case 404: + /* Not there. We'll retry when + * connection_about_to_close_connection() cleans this conn up. */ + log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: " + "Retrying at another directory."); + SEND_HS_DESC_FAILED_EVENT("NOT_FOUND"); + SEND_HS_DESC_FAILED_CONTENT(); + break; + case 400: + log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " + "http status 400 (%s). Dirserver didn't like our " + "v2 rendezvous query? Retrying at another directory.", + escaped(reason)); + SEND_HS_DESC_FAILED_EVENT("QUERY_REJECTED"); + SEND_HS_DESC_FAILED_CONTENT(); + break; + default: + log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: " + "http status %d (%s) response unexpected while " + "fetching v2 hidden service descriptor (server '%s:%d'). " + "Retrying at another directory.", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + SEND_HS_DESC_FAILED_EVENT("UNEXPECTED"); + SEND_HS_DESC_FAILED_CONTENT(); + break; } - if (conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2) { - #define SEND_HS_DESC_UPLOAD_FAILED_EVENT(reason) ( \ - control_event_hs_descriptor_upload_failed( \ - conn->identity_digest, \ - rend_data_get_address(conn->rend_data), \ - reason) ) - log_info(LD_REND,"Uploaded rendezvous descriptor (status %d " - "(%s))", - status_code, escaped(reason)); - /* Without the rend data, we'll have a problem identifying what has been - * uploaded for which service. */ - tor_assert(conn->rend_data); - switch (status_code) { - case 200: - log_info(LD_REND, - "Uploading rendezvous descriptor: finished with status " - "200 (%s)", escaped(reason)); - control_event_hs_descriptor_uploaded(conn->identity_digest, - rend_data_get_address(conn->rend_data)); - rend_service_desc_has_uploaded(conn->rend_data); - break; - case 400: - log_warn(LD_REND,"http status 400 (%s) response from dirserver " - "'%s:%d'. Malformed rendezvous descriptor?", - escaped(reason), conn->base_.address, conn->base_.port); - SEND_HS_DESC_UPLOAD_FAILED_EVENT("UPLOAD_REJECTED"); - break; - default: - log_warn(LD_REND,"http status %d (%s) response unexpected (server " - "'%s:%d').", - status_code, escaped(reason), conn->base_.address, - conn->base_.port); - SEND_HS_DESC_UPLOAD_FAILED_EVENT("UNEXPECTED"); - break; - } + return 0; +} + +/** + * Handler function: processes a response to a POST request to upload a v2 + * hidden service descriptor. + **/ +static int +handle_response_upload_renddesc_v2(dir_connection_t *conn, + const response_handler_args_t *args) +{ + tor_assert(conn->base_.purpose == DIR_PURPOSE_UPLOAD_RENDDESC_V2); + const int status_code = args->status_code; + const char *reason = args->reason; + +#define SEND_HS_DESC_UPLOAD_FAILED_EVENT(reason) \ + (control_event_hs_descriptor_upload_failed( \ + conn->identity_digest, \ + rend_data_get_address(conn->rend_data), \ + reason)) + + log_info(LD_REND,"Uploaded rendezvous descriptor (status %d " + "(%s))", + status_code, escaped(reason)); + /* Without the rend data, we'll have a problem identifying what has been + * uploaded for which service. */ + tor_assert(conn->rend_data); + switch (status_code) { + case 200: + log_info(LD_REND, + "Uploading rendezvous descriptor: finished with status " + "200 (%s)", escaped(reason)); + control_event_hs_descriptor_uploaded(conn->identity_digest, + rend_data_get_address(conn->rend_data)); + rend_service_desc_has_uploaded(conn->rend_data); + break; + case 400: + log_warn(LD_REND,"http status 400 (%s) response from dirserver " + "'%s:%d'. Malformed rendezvous descriptor?", + escaped(reason), conn->base_.address, conn->base_.port); + SEND_HS_DESC_UPLOAD_FAILED_EVENT("UPLOAD_REJECTED"); + break; + default: + log_warn(LD_REND,"http status %d (%s) response unexpected (server " + "'%s:%d').", + status_code, escaped(reason), conn->base_.address, + conn->base_.port); + SEND_HS_DESC_UPLOAD_FAILED_EVENT("UNEXPECTED"); + break; } - tor_free(body); tor_free(headers); tor_free(reason); + return 0; } @@ -2739,13 +3271,54 @@ write_http_response_header_impl(dir_connection_t *conn, ssize_t length, * based on whether the response will be <b>compressed</b> or not. */ static void write_http_response_header(dir_connection_t *conn, ssize_t length, - int compressed, long cache_lifetime) + compress_method_t method, long cache_lifetime) { + const char *methodname = compression_method_get_name(method); + const char *doctype; + if (method == NO_METHOD) + doctype = "text/plain"; + else + doctype = "application/octet-stream"; write_http_response_header_impl(conn, length, - compressed?"application/octet-stream":"text/plain", - compressed?"deflate":"identity", - NULL, - cache_lifetime); + doctype, + methodname, + NULL, + cache_lifetime); +} + +/** Array of compression methods to use (if supported) for serving + * precompressed data, ordered from best to worst. */ +static compress_method_t srv_meth_pref_precompressed[] = { + LZMA_METHOD, + ZSTD_METHOD, + ZLIB_METHOD, + GZIP_METHOD, + NO_METHOD +}; + +/** Parse the compression methods listed in an Accept-Encoding header <b>h</b>, + * and convert them to a bitfield where compression method x is supported if + * and only if 1 << x is set in the bitfield. */ +STATIC unsigned +parse_accept_encoding_header(const char *h) +{ + unsigned result = (1u << NO_METHOD); + smartlist_t *methods = smartlist_new(); + smartlist_split_string(methods, h, ",", + SPLIT_SKIP_SPACE|SPLIT_STRIP_SPACE|SPLIT_IGNORE_BLANK, 0); + + SMARTLIST_FOREACH_BEGIN(methods, const char *, m) { + compress_method_t method = compression_method_get_by_name(m); + if (method != UNKNOWN_METHOD) { + tor_assert(((unsigned)method) < 8*sizeof(unsigned)); + result |= (1u << method); + } + } SMARTLIST_FOREACH_END(m); + SMARTLIST_FOREACH_BEGIN(methods, char *, m) { + tor_free(m); + } SMARTLIST_FOREACH_END(m); + smartlist_free(methods); + return result; } /** Decide whether a client would accept the consensus we have. @@ -2804,7 +3377,7 @@ client_likes_consensus(networkstatus_t *v, const char *want_url) /** Return the compression level we should use for sending a compressed * response of size <b>n_bytes</b>. */ -STATIC zlib_compression_level_t +STATIC compression_level_t choose_compression_level(ssize_t n_bytes) { if (! have_been_under_memory_pressure()) { @@ -2822,8 +3395,9 @@ choose_compression_level(ssize_t n_bytes) /** Information passed to handle a GET request. */ typedef struct get_handler_args_t { - /** True if the client asked for compressed data. */ - int compressed; + /** Bitmask of compression methods that the client said (or implied) it + * supported. */ + unsigned compression_supported; /** If nonzero, the time included an if-modified-since header with this * value. */ time_t if_modified_since; @@ -2897,8 +3471,9 @@ directory_handle_command_get,(dir_connection_t *conn, const char *headers, { char *url, *url_mem, *header; time_t if_modified_since = 0; - int compressed; + int zlib_compressed_in_url; size_t url_len; + unsigned compression_methods_supported; /* We ignore the body of a GET request. */ (void)req_body; @@ -2929,17 +3504,30 @@ directory_handle_command_get,(dir_connection_t *conn, const char *headers, url_mem = url; url_len = strlen(url); - compressed = url_len > 2 && !strcmp(url+url_len-2, ".z"); - if (compressed) { + + zlib_compressed_in_url = url_len > 2 && !strcmp(url+url_len-2, ".z"); + if (zlib_compressed_in_url) { url[url_len-2] = '\0'; url_len -= 2; } + if ((header = http_get_header(headers, "Accept-Encoding: "))) { + compression_methods_supported = parse_accept_encoding_header(header); + tor_free(header); + } else { + compression_methods_supported = (1u << NO_METHOD); + if (zlib_compressed_in_url) + compression_methods_supported |= (1u << ZLIB_METHOD); + } + + /* Remove all methods that we don't both support. */ + compression_methods_supported &= tor_compress_get_supported_method_bitmask(); + get_handler_args_t args; args.url = url; args.headers = headers; args.if_modified_since = if_modified_since; - args.compressed = compressed; + args.compression_supported = compression_methods_supported; int i, result = -1; for (i = 0; url_table[i].string; ++i) { @@ -3011,6 +3599,70 @@ warn_consensus_is_too_old(networkstatus_t *v, const char *flavor, time_t now) } } +/** If there is an X-Or-Diff-From-Consensus header included in <b>headers</b>, + * set <b>digest_out<b> to a new smartlist containing every 256-bit + * hex-encoded digest listed in that header and return 0. Otherwise return + * -1. */ +static int +parse_or_diff_from_header(smartlist_t **digests_out, const char *headers) +{ + char *hdr = http_get_header(headers, X_OR_DIFF_FROM_CONSENSUS_HEADER); + if (hdr == NULL) { + return -1; + } + smartlist_t *hex_digests = smartlist_new(); + *digests_out = smartlist_new(); + smartlist_split_string(hex_digests, hdr, " ", + SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, -1); + SMARTLIST_FOREACH_BEGIN(hex_digests, const char *, hex) { + uint8_t digest[DIGEST256_LEN]; + if (base16_decode((char*)digest, sizeof(digest), hex, strlen(hex)) == + DIGEST256_LEN) { + smartlist_add(*digests_out, tor_memdup(digest, sizeof(digest))); + } else { + log_fn(LOG_PROTOCOL_WARN, LD_DIR, + "X-Or-Diff-From-Consensus header contained bogus digest %s; " + "ignoring.", escaped(hex)); + } + } SMARTLIST_FOREACH_END(hex); + SMARTLIST_FOREACH(hex_digests, char *, cp, tor_free(cp)); + smartlist_free(hex_digests); + tor_free(hdr); + return 0; +} + +/** + * Try to find the best consensus diff possible in order to serve a client + * request for a diff from one of the consensuses in <b>digests</b> to the + * current consensus of flavor <b>flav</b>. The client supports the + * compression methods listed in the <b>compression_methods</b> bitfield: + * place the method chosen (if any) into <b>compression_used_out</b>. + */ +static struct consensus_cache_entry_t * +find_best_diff(const smartlist_t *digests, int flav, + unsigned compression_methods, + compress_method_t *compression_used_out) +{ + struct consensus_cache_entry_t *result = NULL; + + SMARTLIST_FOREACH_BEGIN(digests, const uint8_t *, diff_from) { + unsigned u; + for (u = 0; u < ARRAY_LENGTH(srv_meth_pref_precompressed); ++u) { + compress_method_t method = srv_meth_pref_precompressed[u]; + if (0 == (compression_methods & (1u<<method))) + continue; // client doesn't like this one, or we don't have it. + if (consdiffmgr_find_diff_from(&result, flav, DIGEST_SHA3_256, + diff_from, DIGEST256_LEN, + method) == CONSDIFF_AVAILABLE) { + tor_assert_nonfatal(result); + *compression_used_out = method; + return result; + } + } + } SMARTLIST_FOREACH_END(diff_from); + return NULL; +} + /** Helper function for GET /tor/status-vote/current/consensus */ static int @@ -3018,132 +3670,154 @@ handle_get_current_consensus(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); const time_t if_modified_since = args->if_modified_since; + int clear_spool = 0; - { - /* v3 network status fetch. */ - smartlist_t *dir_fps = smartlist_new(); - long lifetime = NETWORKSTATUS_CACHE_LIFETIME; + /* v3 network status fetch. */ + long lifetime = NETWORKSTATUS_CACHE_LIFETIME; - networkstatus_t *v; - time_t now = time(NULL); - const char *want_fps = NULL; - char *flavor = NULL; - int flav = FLAV_NS; + networkstatus_t *v; + time_t now = time(NULL); + const char *want_fps = NULL; + char *flavor = NULL; + int flav = FLAV_NS; #define CONSENSUS_URL_PREFIX "/tor/status-vote/current/consensus/" #define CONSENSUS_FLAVORED_PREFIX "/tor/status-vote/current/consensus-" - /* figure out the flavor if any, and who we wanted to sign the thing */ - if (!strcmpstart(url, CONSENSUS_FLAVORED_PREFIX)) { - const char *f, *cp; - f = url + strlen(CONSENSUS_FLAVORED_PREFIX); - cp = strchr(f, '/'); - if (cp) { - want_fps = cp+1; - flavor = tor_strndup(f, cp-f); - } else { - flavor = tor_strdup(f); - } - flav = networkstatus_parse_flavor_name(flavor); - if (flav < 0) - flav = FLAV_NS; + /* figure out the flavor if any, and who we wanted to sign the thing */ + if (!strcmpstart(url, CONSENSUS_FLAVORED_PREFIX)) { + const char *f, *cp; + f = url + strlen(CONSENSUS_FLAVORED_PREFIX); + cp = strchr(f, '/'); + if (cp) { + want_fps = cp+1; + flavor = tor_strndup(f, cp-f); } else { - if (!strcmpstart(url, CONSENSUS_URL_PREFIX)) - want_fps = url+strlen(CONSENSUS_URL_PREFIX); + flavor = tor_strdup(f); } + flav = networkstatus_parse_flavor_name(flavor); + if (flav < 0) + flav = FLAV_NS; + } else { + if (!strcmpstart(url, CONSENSUS_URL_PREFIX)) + want_fps = url+strlen(CONSENSUS_URL_PREFIX); + } - v = networkstatus_get_latest_consensus_by_flavor(flav); - - if (v && !networkstatus_consensus_reasonably_live(v, now)) { - write_http_status_line(conn, 404, "Consensus is too old"); - warn_consensus_is_too_old(v, flavor, now); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); - tor_free(flavor); - goto done; - } + v = networkstatus_get_latest_consensus_by_flavor(flav); - if (v && want_fps && - !client_likes_consensus(v, want_fps)) { - write_http_status_line(conn, 404, "Consensus not signed by sufficient " - "number of requested authorities"); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS); - tor_free(flavor); - goto done; - } + if (v && !networkstatus_consensus_reasonably_live(v, now)) { + write_http_status_line(conn, 404, "Consensus is too old"); + warn_consensus_is_too_old(v, flavor, now); + geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); + tor_free(flavor); + goto done; + } - { - char *fp = tor_malloc_zero(DIGEST_LEN); - if (flavor) - strlcpy(fp, flavor, DIGEST_LEN); - tor_free(flavor); - smartlist_add(dir_fps, fp); - } - lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0; + if (v && want_fps && + !client_likes_consensus(v, want_fps)) { + write_http_status_line(conn, 404, "Consensus not signed by sufficient " + "number of requested authorities"); + geoip_note_ns_response(GEOIP_REJECT_NOT_ENOUGH_SIGS); + tor_free(flavor); + goto done; + } - if (!smartlist_len(dir_fps)) { /* we failed to create/cache cp */ - write_http_status_line(conn, 503, "Network status object unavailable"); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_UNAVAILABLE); - goto done; - } + struct consensus_cache_entry_t *cached_diff = NULL; + smartlist_t *diff_from_digests = NULL; + compress_method_t compression_used = NO_METHOD; + if (!parse_or_diff_from_header(&diff_from_digests, args->headers)) { + tor_assert(diff_from_digests); + cached_diff = find_best_diff(diff_from_digests, flav, + args->compression_supported, + &compression_used); + SMARTLIST_FOREACH(diff_from_digests, uint8_t *, d, tor_free(d)); + smartlist_free(diff_from_digests); + } - if (!dirserv_remove_old_statuses(dir_fps, if_modified_since)) { - write_http_status_line(conn, 404, "Not found"); - SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp)); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); - goto done; - } else if (!smartlist_len(dir_fps)) { - write_http_status_line(conn, 304, "Not modified"); - SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp)); - smartlist_free(dir_fps); - geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED); - goto done; + conn->spool = smartlist_new(); + clear_spool = 1; + { + spooled_resource_t *spooled; + if (cached_diff) { + spooled = spooled_resource_new_from_cache_entry(cached_diff); + } else if (flavor) { + spooled = spooled_resource_new(DIR_SPOOL_NETWORKSTATUS, + (uint8_t*)flavor, strlen(flavor)); + compression_used = compressed ? ZLIB_METHOD : NO_METHOD; + } else { + spooled = spooled_resource_new(DIR_SPOOL_NETWORKSTATUS, + NULL, 0); + compression_used = compressed ? ZLIB_METHOD : NO_METHOD; } + tor_free(flavor); + smartlist_add(conn->spool, spooled); + } + lifetime = (v && v->fresh_until > now) ? v->fresh_until - now : 0; - size_t dlen = dirserv_estimate_data_size(dir_fps, 0, compressed); - if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { - log_debug(LD_DIRSERV, - "Client asked for network status lists, but we've been " - "writing too many bytes lately. Sending 503 Dir busy."); - write_http_status_line(conn, 503, "Directory busy, try again later"); - SMARTLIST_FOREACH(dir_fps, char *, fp, tor_free(fp)); - smartlist_free(dir_fps); - - geoip_note_ns_response(GEOIP_REJECT_BUSY); - goto done; - } + if (!smartlist_len(conn->spool)) { /* we failed to create/cache cp */ + write_http_status_line(conn, 503, "Network status object unavailable"); + geoip_note_ns_response(GEOIP_REJECT_UNAVAILABLE); + goto done; + } - tor_addr_t addr; - if (tor_addr_parse(&addr, (TO_CONN(conn))->address) >= 0) { - geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, - &addr, NULL, - time(NULL)); - geoip_note_ns_response(GEOIP_SUCCESS); - /* Note that a request for a network status has started, so that we - * can measure the download time later on. */ - if (conn->dirreq_id) - geoip_start_dirreq(conn->dirreq_id, dlen, DIRREQ_TUNNELED); - else - geoip_start_dirreq(TO_CONN(conn)->global_identifier, dlen, - DIRREQ_DIRECT); - } + size_t size_guess = 0; + int n_expired = 0; + dirserv_spool_remove_missing_and_guess_size(conn, if_modified_since, + compressed, + &size_guess, + &n_expired); - write_http_response_header(conn, -1, compressed, - smartlist_len(dir_fps) == 1 ? lifetime : 0); - conn->fingerprint_stack = dir_fps; - if (! compressed) - conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION); + if (!smartlist_len(conn->spool) && !n_expired) { + write_http_status_line(conn, 404, "Not found"); + geoip_note_ns_response(GEOIP_REJECT_NOT_FOUND); + goto done; + } else if (!smartlist_len(conn->spool)) { + write_http_status_line(conn, 304, "Not modified"); + geoip_note_ns_response(GEOIP_REJECT_NOT_MODIFIED); + goto done; + } - /* Prime the connection with some data. */ - conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS; - connection_dirserv_flushed_some(conn); + if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) { + log_debug(LD_DIRSERV, + "Client asked for network status lists, but we've been " + "writing too many bytes lately. Sending 503 Dir busy."); + write_http_status_line(conn, 503, "Directory busy, try again later"); + geoip_note_ns_response(GEOIP_REJECT_BUSY); goto done; } + tor_addr_t addr; + if (tor_addr_parse(&addr, (TO_CONN(conn))->address) >= 0) { + geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, + &addr, NULL, + time(NULL)); + geoip_note_ns_response(GEOIP_SUCCESS); + /* Note that a request for a network status has started, so that we + * can measure the download time later on. */ + if (conn->dirreq_id) + geoip_start_dirreq(conn->dirreq_id, size_guess, DIRREQ_TUNNELED); + else + geoip_start_dirreq(TO_CONN(conn)->global_identifier, size_guess, + DIRREQ_DIRECT); + } + + clear_spool = 0; + write_http_response_header(conn, -1, + compression_used, + smartlist_len(conn->spool) == 1 ? lifetime : 0); + if (! compressed) + conn->compress_state = tor_compress_new(0, ZLIB_METHOD, + HIGH_COMPRESSION); + + /* Prime the connection with some data. */ + const int initial_flush_result = connection_dirserv_flushed_some(conn); + tor_assert_nonfatal(initial_flush_result == 0); + goto done; + done: + if (clear_spool) { + dir_conn_clear_spool(conn); + } return 0; } @@ -3153,7 +3827,7 @@ static int handle_get_status_vote(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); { int current; ssize_t body_len = 0; @@ -3225,16 +3899,17 @@ handle_get_status_vote(dir_connection_t *conn, const get_handler_args_t *args) write_http_status_line(conn, 503, "Directory busy, try again later"); goto vote_done; } - write_http_response_header(conn, body_len ? body_len : -1, compressed, + write_http_response_header(conn, body_len ? body_len : -1, + compressed ? ZLIB_METHOD : NO_METHOD, lifetime); if (smartlist_len(items)) { if (compressed) { - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, - choose_compression_level(estimated_len)); + conn->compress_state = tor_compress_new(1, ZLIB_METHOD, + choose_compression_level(estimated_len)); SMARTLIST_FOREACH(items, const char *, c, - connection_write_to_buf_zlib(c, strlen(c), conn, 0)); - connection_write_to_buf_zlib("", 0, conn, 1); + connection_write_to_buf_compress(c, strlen(c), conn, 0)); + connection_write_to_buf_compress("", 0, conn, 1); } else { SMARTLIST_FOREACH(items, const char *, c, connection_write_to_buf(c, strlen(c), TO_CONN(conn))); @@ -3260,44 +3935,49 @@ static int handle_get_microdesc(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); + int clear_spool = 1; { - smartlist_t *fps = smartlist_new(); + conn->spool = smartlist_new(); - dir_split_resource_into_fingerprints(url+strlen("/tor/micro/d/"), - fps, NULL, + dir_split_resource_into_spoolable(url+strlen("/tor/micro/d/"), + DIR_SPOOL_MICRODESC, + conn->spool, NULL, DSR_DIGEST256|DSR_BASE64|DSR_SORT_UNIQ); - if (!dirserv_have_any_microdesc(fps)) { + size_t size_guess = 0; + dirserv_spool_remove_missing_and_guess_size(conn, 0, compressed, + &size_guess, NULL); + if (smartlist_len(conn->spool) == 0) { write_http_status_line(conn, 404, "Not found"); - SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp)); - smartlist_free(fps); goto done; } - size_t dlen = dirserv_estimate_microdesc_size(fps, compressed); - if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { + if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) { log_info(LD_DIRSERV, "Client asked for server descriptors, but we've been " "writing too many bytes lately. Sending 503 Dir busy."); write_http_status_line(conn, 503, "Directory busy, try again later"); - SMARTLIST_FOREACH(fps, char *, fp, tor_free(fp)); - smartlist_free(fps); goto done; } - write_http_response_header(conn, -1, compressed, MICRODESC_CACHE_LIFETIME); - conn->dir_spool_src = DIR_SPOOL_MICRODESC; - conn->fingerprint_stack = fps; + clear_spool = 0; + write_http_response_header(conn, -1, + compressed ? ZLIB_METHOD : NO_METHOD, + MICRODESC_CACHE_LIFETIME); if (compressed) - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, - choose_compression_level(dlen)); + conn->compress_state = tor_compress_new(1, ZLIB_METHOD, + choose_compression_level(size_guess)); - connection_dirserv_flushed_some(conn); + const int initial_flush_result = connection_dirserv_flushed_some(conn); + tor_assert_nonfatal(initial_flush_result == 0); goto done; } done: + if (clear_spool) { + dir_conn_clear_spool(conn); + } return 0; } @@ -3307,71 +3987,93 @@ static int handle_get_descriptor(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); const or_options_t *options = get_options(); + int clear_spool = 1; if (!strcmpstart(url,"/tor/server/") || (!options->BridgeAuthoritativeDir && !options->BridgeRelay && !strcmpstart(url,"/tor/extra/"))) { - size_t dlen; int res; - const char *msg; + const char *msg = NULL; int cache_lifetime = 0; int is_extra = !strcmpstart(url,"/tor/extra/"); url += is_extra ? strlen("/tor/extra/") : strlen("/tor/server/"); - conn->fingerprint_stack = smartlist_new(); - res = dirserv_get_routerdesc_fingerprints(conn->fingerprint_stack, url, - &msg, - !connection_dir_is_encrypted(conn), - is_extra); - - if (!strcmpstart(url, "fp/")) { - if (smartlist_len(conn->fingerprint_stack) == 1) - cache_lifetime = ROUTERDESC_CACHE_LIFETIME; - } else if (!strcmpstart(url, "authority")) { - cache_lifetime = ROUTERDESC_CACHE_LIFETIME; - } else if (!strcmpstart(url, "all")) { - cache_lifetime = FULL_DIR_CACHE_LIFETIME; - } else if (!strcmpstart(url, "d/")) { - if (smartlist_len(conn->fingerprint_stack) == 1) - cache_lifetime = ROUTERDESC_BY_DIGEST_CACHE_LIFETIME; - } - if (!strcmpstart(url, "d/")) - conn->dir_spool_src = + dir_spool_source_t source; + time_t publish_cutoff = 0; + if (!strcmpstart(url, "d/")) { + source = is_extra ? DIR_SPOOL_EXTRA_BY_DIGEST : DIR_SPOOL_SERVER_BY_DIGEST; - else - conn->dir_spool_src = + } else { + source = is_extra ? DIR_SPOOL_EXTRA_BY_FP : DIR_SPOOL_SERVER_BY_FP; + /* We only want to apply a publish cutoff when we're requesting + * resources by fingerprint. */ + publish_cutoff = time(NULL) - ROUTER_MAX_AGE_TO_PUBLISH; + } + + conn->spool = smartlist_new(); + res = dirserv_get_routerdesc_spool(conn->spool, url, + source, + connection_dir_is_encrypted(conn), + &msg); - if (!dirserv_have_any_serverdesc(conn->fingerprint_stack, - conn->dir_spool_src)) { - res = -1; - msg = "Not found"; + if (!strcmpstart(url, "all")) { + cache_lifetime = FULL_DIR_CACHE_LIFETIME; + } else if (smartlist_len(conn->spool) == 1) { + cache_lifetime = ROUTERDESC_BY_DIGEST_CACHE_LIFETIME; + } + + size_t size_guess = 0; + int n_expired = 0; + dirserv_spool_remove_missing_and_guess_size(conn, publish_cutoff, + compressed, &size_guess, + &n_expired); + + /* If we are the bridge authority and the descriptor is a bridge + * descriptor, remember that we served this descriptor for desc stats. */ + /* XXXX it's a bit of a kludge to have this here. */ + if (get_options()->BridgeAuthoritativeDir && + source == DIR_SPOOL_SERVER_BY_FP) { + SMARTLIST_FOREACH_BEGIN(conn->spool, spooled_resource_t *, spooled) { + const routerinfo_t *router = + router_get_by_id_digest((const char *)spooled->digest); + /* router can be NULL here when the bridge auth is asked for its own + * descriptor. */ + if (router && router->purpose == ROUTER_PURPOSE_BRIDGE) + rep_hist_note_desc_served(router->cache_info.identity_digest); + } SMARTLIST_FOREACH_END(spooled); } - if (res < 0) + if (res < 0 || size_guess == 0 || smartlist_len(conn->spool) == 0) { + if (msg == NULL) + msg = "Not found"; write_http_status_line(conn, 404, msg); - else { - dlen = dirserv_estimate_data_size(conn->fingerprint_stack, - 1, compressed); - if (global_write_bucket_low(TO_CONN(conn), dlen, 2)) { + } else { + if (global_write_bucket_low(TO_CONN(conn), size_guess, 2)) { log_info(LD_DIRSERV, "Client asked for server descriptors, but we've been " "writing too many bytes lately. Sending 503 Dir busy."); write_http_status_line(conn, 503, "Directory busy, try again later"); - conn->dir_spool_src = DIR_SPOOL_NONE; + dir_conn_clear_spool(conn); goto done; } - write_http_response_header(conn, -1, compressed, cache_lifetime); + write_http_response_header(conn, -1, + compressed ? ZLIB_METHOD : NO_METHOD, + cache_lifetime); if (compressed) - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, - choose_compression_level(dlen)); + conn->compress_state = tor_compress_new(1, ZLIB_METHOD, + choose_compression_level(size_guess)); + clear_spool = 0; /* Prime the connection with some data. */ - connection_dirserv_flushed_some(conn); + int initial_flush_result = connection_dirserv_flushed_some(conn); + tor_assert_nonfatal(initial_flush_result == 0); } goto done; } done: - return 0; + if (clear_spool) + dir_conn_clear_spool(conn); + return 0; } /** Helper function for GET /tor/keys/... @@ -3380,7 +4082,7 @@ static int handle_get_keys(dir_connection_t *conn, const get_handler_args_t *args) { const char *url = args->url; - const int compressed = args->compressed; + const int compressed = args->compression_supported & (1u << ZLIB_METHOD); const time_t if_modified_since = args->if_modified_since; { smartlist_t *certs = smartlist_new(); @@ -3448,15 +4150,18 @@ handle_get_keys(dir_connection_t *conn, const get_handler_args_t *args) goto keys_done; } - write_http_response_header(conn, compressed?-1:len, compressed, 60*60); + write_http_response_header(conn, compressed?-1:len, + compressed ? ZLIB_METHOD : NO_METHOD, + 60*60); if (compressed) { - conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD, - choose_compression_level(len)); + conn->compress_state = tor_compress_new(1, ZLIB_METHOD, + choose_compression_level(len)); SMARTLIST_FOREACH(certs, authority_cert_t *, c, - connection_write_to_buf_zlib(c->cache_info.signed_descriptor_body, - c->cache_info.signed_descriptor_len, - conn, 0)); - connection_write_to_buf_zlib("", 0, conn, 1); + connection_write_to_buf_compress( + c->cache_info.signed_descriptor_body, + c->cache_info.signed_descriptor_len, + conn, 0)); + connection_write_to_buf_compress("", 0, conn, 1); } else { SMARTLIST_FOREACH(certs, authority_cert_t *, c, connection_write_to_buf(c->cache_info.signed_descriptor_body, @@ -3487,7 +4192,7 @@ handle_get_hs_descriptor_v2(dir_connection_t *conn, safe_str(escaped(query))); switch (rend_cache_lookup_v2_desc_as_dir(query, &descp)) { case 1: /* valid */ - write_http_response_header(conn, strlen(descp), 0, 0); + write_http_response_header(conn, strlen(descp), NO_METHOD, 0); connection_write_to_buf(descp, strlen(descp), TO_CONN(conn)); break; case 0: /* well-formed but not present */ @@ -3539,7 +4244,7 @@ handle_get_hs_descriptor_v3(dir_connection_t *conn, } /* Found requested descriptor! Pass it to this nice client. */ - write_http_response_header(conn, strlen(desc_str), 0, 0); + write_http_response_header(conn, strlen(desc_str), NO_METHOD, 0); connection_write_to_buf(desc_str, strlen(desc_str), TO_CONN(conn)); done: @@ -3578,7 +4283,7 @@ handle_get_networkstatus_bridges(dir_connection_t *conn, /* all happy now. send an answer. */ status = networkstatus_getinfo_by_purpose("bridge", time(NULL)); size_t dlen = strlen(status); - write_http_response_header(conn, dlen, 0, 0); + write_http_response_header(conn, dlen, NO_METHOD, 0); connection_write_to_buf(status, dlen, TO_CONN(conn)); tor_free(status); goto done; @@ -3595,7 +4300,7 @@ handle_get_robots(dir_connection_t *conn, const get_handler_args_t *args) { const char robots[] = "User-agent: *\r\nDisallow: /\r\n"; size_t len = strlen(robots); - write_http_response_header(conn, len, 0, ROBOTS_CACHE_LIFETIME); + write_http_response_header(conn, len, NO_METHOD, ROBOTS_CACHE_LIFETIME); connection_write_to_buf(robots, len, TO_CONN(conn)); } return 0; @@ -3718,7 +4423,7 @@ directory_handle_command_post,(dir_connection_t *conn, const char *headers, if (connection_dir_is_encrypted(conn) && !strcmpstart(url,"/tor/rendezvous2/publish")) { if (rend_cache_store_v2_desc_as_dir(body) < 0) { - log_warn(LD_REND, "Rejected v2 rend descriptor (length %d) from %s.", + log_warn(LD_REND, "Rejected v2 rend descriptor (body size %d) from %s.", (int)body_len, conn->base_.address); write_http_status_line(conn, 400, "Invalid v2 service descriptor rejected"); @@ -3895,7 +4600,7 @@ connection_dir_finished_flushing(dir_connection_t *conn) conn->base_.state = DIR_CONN_STATE_CLIENT_READING; return 0; case DIR_CONN_STATE_SERVER_WRITING: - if (conn->dir_spool_src != DIR_SPOOL_NONE) { + if (conn->spool) { log_warn(LD_BUG, "Emptied a dirserv buffer, but it's still spooling!"); connection_mark_for_close(TO_CONN(conn)); } else { @@ -4578,3 +5283,34 @@ dir_split_resource_into_fingerprints(const char *resource, return 0; } +/** As dir_split_resource_into_fingerprints, but instead fills + * <b>spool_out</b> with a list of spoolable_resource_t for the resource + * identified through <b>source</b>. */ +int +dir_split_resource_into_spoolable(const char *resource, + dir_spool_source_t source, + smartlist_t *spool_out, + int *compressed_out, + int flags) +{ + smartlist_t *fingerprints = smartlist_new(); + + tor_assert(flags & (DSR_HEX|DSR_BASE64)); + const size_t digest_len = + (flags & DSR_DIGEST256) ? DIGEST256_LEN : DIGEST_LEN; + + int r = dir_split_resource_into_fingerprints(resource, fingerprints, + compressed_out, flags); + /* This is not a very efficient implementation XXXX */ + SMARTLIST_FOREACH_BEGIN(fingerprints, uint8_t *, digest) { + spooled_resource_t *spooled = + spooled_resource_new(source, digest, digest_len); + if (spooled) + smartlist_add(spool_out, spooled); + tor_free(digest); + } SMARTLIST_FOREACH_END(digest); + + smartlist_free(fingerprints); + return r; +} + diff --git a/src/or/directory.h b/src/or/directory.h index 8be1f8e76e..125333da37 100644 --- a/src/or/directory.h +++ b/src/or/directory.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -41,45 +41,51 @@ typedef enum { int directory_must_use_begindir(const or_options_t *options); -MOCK_DECL(void, directory_initiate_command_routerstatus, - (const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - struct circuit_guard_state_t *guard_state)); - -void directory_initiate_command_routerstatus_rend(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - const rend_data_t *rend_query, - struct circuit_guard_state_t *guard_state); +/** + * A directory_request_t describes the information about a directory request + * at the client side. It describes what we're going to ask for, which + * directory we're going to ask for it, how we're going to contact that + * directory, and (in some cases) what to do with it when we're done. + */ +typedef struct directory_request_t directory_request_t; +directory_request_t *directory_request_new(uint8_t dir_purpose); +void directory_request_free(directory_request_t *req); +void directory_request_set_or_addr_port(directory_request_t *req, + const tor_addr_port_t *p); +void directory_request_set_dir_addr_port(directory_request_t *req, + const tor_addr_port_t *p); +void directory_request_set_directory_id_digest(directory_request_t *req, + const char *digest); +void directory_request_set_router_purpose(directory_request_t *req, + uint8_t router_purpose); +void directory_request_set_indirection(directory_request_t *req, + dir_indirection_t indirection); +void directory_request_set_resource(directory_request_t *req, + const char *resource); +void directory_request_set_payload(directory_request_t *req, + const char *payload, + size_t payload_len); +void directory_request_set_if_modified_since(directory_request_t *req, + time_t if_modified_since); +void directory_request_set_rend_query(directory_request_t *req, + const rend_data_t *query); + +void directory_request_set_routerstatus(directory_request_t *req, + const routerstatus_t *rs); +void directory_request_add_header(directory_request_t *req, + const char *key, + const char *val); +MOCK_DECL(void, directory_initiate_request, (directory_request_t *request)); int parse_http_response(const char *headers, int *code, time_t *date, compress_method_t *compression, char **response); -int connection_dir_is_encrypted(dir_connection_t *conn); +int connection_dir_is_encrypted(const dir_connection_t *conn); int connection_dir_reached_eof(dir_connection_t *conn); int connection_dir_process_inbuf(dir_connection_t *conn); int connection_dir_finished_flushing(dir_connection_t *conn); int connection_dir_finished_connecting(dir_connection_t *conn); void connection_dir_about_to_close(dir_connection_t *dir_conn); -void directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port, - const tor_addr_t *dir_addr, uint16_t dir_port, - const char *digest, - uint8_t dir_purpose, uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, size_t payload_len, - time_t if_modified_since); #define DSR_HEX (1<<0) #define DSR_BASE64 (1<<1) @@ -88,7 +94,12 @@ void directory_initiate_command(const tor_addr_t *or_addr, uint16_t or_port, int dir_split_resource_into_fingerprints(const char *resource, smartlist_t *fp_out, int *compressed_out, int flags); - +enum dir_spool_source_t; +int dir_split_resource_into_spoolable(const char *resource, + enum dir_spool_source_t source, + smartlist_t *spool_out, + int *compressed_out, + int flags); int dir_split_resource_into_fingerprint_pairs(const char *res, smartlist_t *pairs_out); char *directory_dump_request_log(void); @@ -176,7 +187,7 @@ STATIC int handle_post_hs_descriptor(const char *url, const char *body); STATIC char* authdir_type_to_string(dirinfo_type_t auth); STATIC const char * dir_conn_purpose_to_string(int purpose); STATIC int should_use_directory_guards(const or_options_t *options); -STATIC zlib_compression_level_t choose_compression_level(ssize_t n_bytes); +STATIC compression_level_t choose_compression_level(ssize_t n_bytes); STATIC const smartlist_t *find_dl_schedule(download_status_t *dls, const or_options_t *options); STATIC void find_dl_min_and_max_delay(download_status_t *dls, @@ -187,6 +198,7 @@ STATIC int next_random_exponential_delay(int delay, int max_delay); STATIC int parse_hs_version_from_post(const char *url, const char *prefix, const char **end_pos); +STATIC unsigned parse_accept_encoding_header(const char *h); #endif #endif diff --git a/src/or/dirserv.c b/src/or/dirserv.c index af01f8c283..7de72df9eb 100644 --- a/src/or/dirserv.c +++ b/src/or/dirserv.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRSERV_PRIVATE @@ -13,6 +13,7 @@ #include "command.h" #include "connection.h" #include "connection_or.h" +#include "conscache.h" #include "control.h" #include "directory.h" #include "dirserv.h" @@ -81,14 +82,23 @@ dirserv_get_status_impl(const char *fp, const char *nickname, int severity); static void clear_cached_dir(cached_dir_t *d); static const signed_descriptor_t *get_signed_descriptor_by_fp( - const char *fp, - int extrainfo, - time_t publish_cutoff); + const uint8_t *fp, + int extrainfo); static was_router_added_t dirserv_add_extrainfo(extrainfo_t *ei, const char **msg); static uint32_t dirserv_get_bandwidth_for_router_kb(const routerinfo_t *ri); static uint32_t dirserv_get_credible_bandwidth_kb(const routerinfo_t *ri); +static int spooled_resource_lookup_body(const spooled_resource_t *spooled, + int conn_is_encrypted, + const uint8_t **body_out, + size_t *size_out, + time_t *published_out); +static cached_dir_t *spooled_resource_lookup_cached_dir( + const spooled_resource_t *spooled, + time_t *published_out); +static cached_dir_t *lookup_cached_dir_by_fp(const uint8_t *fp); + /************** Fingerprint handling code ************/ /* 1 Historically used to indicate Named */ @@ -814,6 +824,9 @@ directory_remove_invalid(void) * Allocate and return a description of the status of the server <b>desc</b>, * for use in a v1-style router-status line. The server is listed * as running iff <b>is_live</b> is true. + * + * This is deprecated: it's only used for controllers that want outputs in + * the old format. */ static char * list_single_server_status(const routerinfo_t *desc, int is_live) @@ -926,6 +939,9 @@ dirserv_set_router_is_running(routerinfo_t *router, time_t now) * *<b>router_status_out</b>. Return 0 on success, -1 on failure. * * If for_controller is true, include the routers with very old descriptors. + * + * This is deprecated: it's only used for controllers that want outputs in + * the old format. */ int list_server_status_v1(smartlist_t *routers, char **router_status_out, @@ -1161,8 +1177,8 @@ new_cached_dir(char *s, time_t published) d->dir = s; d->dir_len = strlen(s); d->published = published; - if (tor_gzip_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len, - ZLIB_METHOD)) { + if (tor_compress(&(d->dir_z), &(d->dir_z_len), d->dir, d->dir_len, + ZLIB_METHOD)) { log_warn(LD_BUG, "Error compressing directory"); } return d; @@ -1196,6 +1212,7 @@ void dirserv_set_cached_consensus_networkstatus(const char *networkstatus, const char *flavor_name, const common_digests_t *digests, + const uint8_t *sha3_as_signed, time_t published) { cached_dir_t *new_networkstatus; @@ -1205,6 +1222,8 @@ dirserv_set_cached_consensus_networkstatus(const char *networkstatus, new_networkstatus = new_cached_dir(tor_strdup(networkstatus), published); memcpy(&new_networkstatus->digests, digests, sizeof(common_digests_t)); + memcpy(&new_networkstatus->digest_sha3_as_signed, sha3_as_signed, + DIGEST256_LEN); old_networkstatus = strmap_set(cached_consensuses, flavor_name, new_networkstatus); if (old_networkstatus) @@ -3037,58 +3056,61 @@ dirserv_generate_networkstatus_vote_obj(crypto_pk_t *private_key, * requests, adds identity digests. */ int -dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, - const char **msg, int for_unencrypted_conn, - int is_extrainfo) +dirserv_get_routerdesc_spool(smartlist_t *spool_out, + const char *key, + dir_spool_source_t source, + int conn_is_encrypted, + const char **msg_out) { - int by_id = 1; - *msg = NULL; + *msg_out = NULL; if (!strcmp(key, "all")) { - routerlist_t *rl = router_get_routerlist(); - SMARTLIST_FOREACH(rl->routers, routerinfo_t *, r, - smartlist_add(fps_out, - tor_memdup(r->cache_info.identity_digest, DIGEST_LEN))); - /* Treat "all" requests as if they were unencrypted */ - for_unencrypted_conn = 1; + const routerlist_t *rl = router_get_routerlist(); + SMARTLIST_FOREACH_BEGIN(rl->routers, const routerinfo_t *, r) { + spooled_resource_t *spooled; + spooled = spooled_resource_new(source, + (const uint8_t *)r->cache_info.identity_digest, + DIGEST_LEN); + /* Treat "all" requests as if they were unencrypted */ + conn_is_encrypted = 0; + smartlist_add(spool_out, spooled); + } SMARTLIST_FOREACH_END(r); } else if (!strcmp(key, "authority")) { const routerinfo_t *ri = router_get_my_routerinfo(); if (ri) - smartlist_add(fps_out, - tor_memdup(ri->cache_info.identity_digest, DIGEST_LEN)); + smartlist_add(spool_out, + spooled_resource_new(source, + (const uint8_t *)ri->cache_info.identity_digest, + DIGEST_LEN)); } else if (!strcmpstart(key, "d/")) { - by_id = 0; key += strlen("d/"); - dir_split_resource_into_fingerprints(key, fps_out, NULL, - DSR_HEX|DSR_SORT_UNIQ); + dir_split_resource_into_spoolable(key, source, spool_out, NULL, + DSR_HEX|DSR_SORT_UNIQ); } else if (!strcmpstart(key, "fp/")) { key += strlen("fp/"); - dir_split_resource_into_fingerprints(key, fps_out, NULL, - DSR_HEX|DSR_SORT_UNIQ); + dir_split_resource_into_spoolable(key, source, spool_out, NULL, + DSR_HEX|DSR_SORT_UNIQ); } else { - *msg = "Key not recognized"; + *msg_out = "Not found"; return -1; } - if (for_unencrypted_conn) { + if (! conn_is_encrypted) { /* Remove anything that insists it not be sent unencrypted. */ - SMARTLIST_FOREACH_BEGIN(fps_out, char *, cp) { - const signed_descriptor_t *sd; - if (by_id) - sd = get_signed_descriptor_by_fp(cp,is_extrainfo,0); - else if (is_extrainfo) - sd = extrainfo_get_by_descriptor_digest(cp); - else - sd = router_get_by_descriptor_digest(cp); - if (sd && !sd->send_unencrypted) { - tor_free(cp); - SMARTLIST_DEL_CURRENT(fps_out, cp); - } - } SMARTLIST_FOREACH_END(cp); + SMARTLIST_FOREACH_BEGIN(spool_out, spooled_resource_t *, spooled) { + const uint8_t *body = NULL; + size_t bodylen = 0; + int r = spooled_resource_lookup_body(spooled, conn_is_encrypted, + &body, &bodylen, NULL); + if (r < 0 || body == NULL || bodylen == 0) { + SMARTLIST_DEL_CURRENT(spool_out, spooled); + spooled_resource_free(spooled); + } + } SMARTLIST_FOREACH_END(spooled); } - if (!smartlist_len(fps_out)) { - *msg = "Servers unavailable"; + if (!smartlist_len(spool_out)) { + *msg_out = "Servers unavailable"; return -1; } return 0; @@ -3352,410 +3374,497 @@ dirserv_test_reachability(time_t now) ctr = (ctr + 1) % REACHABILITY_MODULO_PER_TEST; /* increment ctr */ } -/** Given a fingerprint <b>fp</b> which is either set if we're looking for a - * v2 status, or zeroes if we're looking for a v3 status, or a NUL-padded - * flavor name if we want a flavored v3 status, return a pointer to the - * appropriate cached dir object, or NULL if there isn't one available. */ -static cached_dir_t * -lookup_cached_dir_by_fp(const char *fp) +/* ========== + * Spooling code. + * ========== */ + +spooled_resource_t * +spooled_resource_new(dir_spool_source_t source, + const uint8_t *digest, size_t digestlen) { - cached_dir_t *d = NULL; - if (tor_digest_is_zero(fp) && cached_consensuses) { - d = strmap_get(cached_consensuses, "ns"); - } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses && - (d = strmap_get(cached_consensuses, fp))) { - /* this here interface is a nasty hack XXXX */; + spooled_resource_t *spooled = tor_malloc_zero(sizeof(spooled_resource_t)); + spooled->spool_source = source; + switch (source) { + case DIR_SPOOL_NETWORKSTATUS: + spooled->spool_eagerly = 0; + break; + case DIR_SPOOL_SERVER_BY_DIGEST: + case DIR_SPOOL_SERVER_BY_FP: + case DIR_SPOOL_EXTRA_BY_DIGEST: + case DIR_SPOOL_EXTRA_BY_FP: + case DIR_SPOOL_MICRODESC: + default: + spooled->spool_eagerly = 1; + break; + case DIR_SPOOL_CONSENSUS_CACHE_ENTRY: + tor_assert_unreached(); + break; } - return d; + tor_assert(digestlen <= sizeof(spooled->digest)); + if (digest) + memcpy(spooled->digest, digest, digestlen); + return spooled; } -/** Remove from <b>fps</b> every networkstatus key where both - * a) we have a networkstatus document and - * b) it is not newer than <b>cutoff</b>. +/** + * Create a new spooled_resource_t to spool the contents of <b>entry</b> to + * the user. Return the spooled object on success, or NULL on failure (which + * is probably caused by a failure to map the body of the item from disk). * - * Return 1 if any items were present at all; else return 0. + * Adds a reference to entry's reference counter. */ -int -dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff) -{ - int found_any = 0; - SMARTLIST_FOREACH_BEGIN(fps, char *, digest) { - cached_dir_t *d = lookup_cached_dir_by_fp(digest); - if (!d) - continue; - found_any = 1; - if (d->published <= cutoff) { - tor_free(digest); - SMARTLIST_DEL_CURRENT(fps, digest); - } - } SMARTLIST_FOREACH_END(digest); - - return found_any; +spooled_resource_t * +spooled_resource_new_from_cache_entry(consensus_cache_entry_t *entry) +{ + spooled_resource_t *spooled = tor_malloc_zero(sizeof(spooled_resource_t)); + spooled->spool_source = DIR_SPOOL_CONSENSUS_CACHE_ENTRY; + spooled->spool_eagerly = 0; + consensus_cache_entry_incref(entry); + spooled->consensus_cache_entry = entry; + + int r = consensus_cache_entry_get_body(entry, + &spooled->cce_body, + &spooled->cce_len); + if (r == 0) { + return spooled; + } else { + spooled_resource_free(spooled); + return NULL; + } } -/** Return the cache-info for identity fingerprint <b>fp</b>, or - * its extra-info document if <b>extrainfo</b> is true. Return - * NULL if not found or if the descriptor is older than - * <b>publish_cutoff</b>. */ -static const signed_descriptor_t * -get_signed_descriptor_by_fp(const char *fp, int extrainfo, - time_t publish_cutoff) +/** Release all storage held by <b>spooled</b>. */ +void +spooled_resource_free(spooled_resource_t *spooled) { - if (router_digest_is_me(fp)) { - if (extrainfo) - return &(router_get_my_extrainfo()->cache_info); - else - return &(router_get_my_routerinfo()->cache_info); - } else { - const routerinfo_t *ri = router_get_by_id_digest(fp); - if (ri && - ri->cache_info.published_on > publish_cutoff) { - if (extrainfo) - return extrainfo_get_by_descriptor_digest( - ri->cache_info.extra_info_digest); - else - return &ri->cache_info; - } + if (spooled == NULL) + return; + + if (spooled->cached_dir_ref) { + cached_dir_decref(spooled->cached_dir_ref); } - return NULL; -} -/** Return true iff we have any of the documents (extrainfo or routerdesc) - * specified by the fingerprints in <b>fps</b> and <b>spool_src</b>. Used to - * decide whether to send a 404. */ -int -dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src) -{ - time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH; - SMARTLIST_FOREACH_BEGIN(fps, const char *, fp) { - switch (spool_src) - { - case DIR_SPOOL_EXTRA_BY_DIGEST: - if (extrainfo_get_by_descriptor_digest(fp)) return 1; - break; - case DIR_SPOOL_SERVER_BY_DIGEST: - if (router_get_by_descriptor_digest(fp)) return 1; - break; - case DIR_SPOOL_EXTRA_BY_FP: - case DIR_SPOOL_SERVER_BY_FP: - if (get_signed_descriptor_by_fp(fp, - spool_src == DIR_SPOOL_EXTRA_BY_FP, publish_cutoff)) - return 1; - break; - } - } SMARTLIST_FOREACH_END(fp); - return 0; + if (spooled->consensus_cache_entry) { + consensus_cache_entry_decref(spooled->consensus_cache_entry); + } + + tor_free(spooled); } -/** Return true iff any of the 256-bit elements in <b>fps</b> is the digest of - * a microdescriptor we have. */ -int -dirserv_have_any_microdesc(const smartlist_t *fps) +/** When spooling data from a cached_dir_t object, we always add + * at least this much. */ +#define DIRSERV_CACHED_DIR_CHUNK_SIZE 8192 + +/** Return an compression ratio for compressing objects from <b>source</b>. + */ +static double +estimate_compression_ratio(dir_spool_source_t source) { - microdesc_cache_t *cache = get_microdesc_cache(); - SMARTLIST_FOREACH(fps, const char *, fp, - if (microdesc_cache_lookup_by_digest256(cache, fp)) - return 1); - return 0; + /* We should put in better estimates here, depending on the number of + objects and their type */ + (void) source; + return 0.5; } -/** Return an approximate estimate of the number of bytes that will - * be needed to transmit the server descriptors (if is_serverdescs -- - * they can be either d/ or fp/ queries) or networkstatus objects (if - * !is_serverdescs) listed in <b>fps</b>. If <b>compressed</b> is set, - * we guess how large the data will be after compression. +/** Return an estimated number of bytes needed for transmitting the + * resource in <b>spooled</b> on <b>conn</b> * - * The return value is an estimate; it might be larger or smaller. - **/ -size_t -dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, - int compressed) -{ - size_t result; - tor_assert(fps); - if (is_serverdescs) { - int n = smartlist_len(fps); - const routerinfo_t *me = router_get_my_routerinfo(); - result = (me?me->cache_info.signed_descriptor_len:2048) * n; - if (compressed) - result /= 2; /* observed compressibility is between 35 and 55%. */ + * As a convenient side-effect, set *<b>published_out</b> to the resource's + * publication time. + */ +static size_t +spooled_resource_estimate_size(const spooled_resource_t *spooled, + dir_connection_t *conn, + int compressed, + time_t *published_out) +{ + if (spooled->spool_eagerly) { + const uint8_t *body = NULL; + size_t bodylen = 0; + int r = spooled_resource_lookup_body(spooled, + connection_dir_is_encrypted(conn), + &body, &bodylen, + published_out); + if (r == -1 || body == NULL || bodylen == 0) + return 0; + if (compressed) { + double ratio = estimate_compression_ratio(spooled->spool_source); + bodylen = (size_t)(bodylen * ratio); + } + return bodylen; } else { - result = 0; - SMARTLIST_FOREACH(fps, const char *, digest, { - cached_dir_t *dir = lookup_cached_dir_by_fp(digest); - if (dir) - result += compressed ? dir->dir_z_len : dir->dir_len; - }); + cached_dir_t *cached; + if (spooled->consensus_cache_entry) { + return spooled->cce_len; + } + if (spooled->cached_dir_ref) { + cached = spooled->cached_dir_ref; + } else { + cached = spooled_resource_lookup_cached_dir(spooled, + published_out); + } + if (cached == NULL) { + return 0; + } + size_t result = compressed ? cached->dir_z_len : cached->dir_len; + return result; } - return result; } -/** Given a list of microdescriptor hashes, guess how many bytes will be - * needed to transmit them, and return the guess. */ -size_t -dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed) -{ - size_t result = smartlist_len(fps) * microdesc_average_size(NULL); - if (compressed) - result /= 2; - return result; -} +/** Return code for spooled_resource_flush_some */ +typedef enum { + SRFS_ERR = -1, + SRFS_MORE = 0, + SRFS_DONE +} spooled_resource_flush_status_t; -/** When we're spooling data onto our outbuf, add more whenever we dip - * below this threshold. */ -#define DIRSERV_BUFFER_MIN 16384 +/** Flush some or all of the bytes from <b>spooled</b> onto <b>conn</b>. + * Return SRFS_ERR on error, SRFS_MORE if there are more bytes to flush from + * this spooled resource, or SRFS_DONE if we are done flushing this spooled + * resource. + */ +static spooled_resource_flush_status_t +spooled_resource_flush_some(spooled_resource_t *spooled, + dir_connection_t *conn) +{ + if (spooled->spool_eagerly) { + /* Spool_eagerly resources are sent all-at-once. */ + const uint8_t *body = NULL; + size_t bodylen = 0; + int r = spooled_resource_lookup_body(spooled, + connection_dir_is_encrypted(conn), + &body, &bodylen, NULL); + if (r == -1 || body == NULL || bodylen == 0) { + /* Absent objects count as "done". */ + return SRFS_DONE; + } + if (conn->compress_state) { + connection_write_to_buf_compress((const char*)body, bodylen, conn, 0); + } else { + connection_write_to_buf((const char*)body, bodylen, TO_CONN(conn)); + } + return SRFS_DONE; + } else { + cached_dir_t *cached = spooled->cached_dir_ref; + consensus_cache_entry_t *cce = spooled->consensus_cache_entry; + if (cached == NULL && cce == NULL) { + /* The cached_dir_t hasn't been materialized yet. So let's look it up. */ + cached = spooled->cached_dir_ref = + spooled_resource_lookup_cached_dir(spooled, NULL); + if (!cached) { + /* Absent objects count as done. */ + return SRFS_DONE; + } + ++cached->refcnt; + tor_assert_nonfatal(spooled->cached_dir_offset == 0); + } -/** Spooling helper: called when we have no more data to spool to <b>conn</b>. - * Flushes any remaining data to be (un)compressed, and changes the spool - * source to NONE. Returns 0 on success, negative on failure. */ -static int -connection_dirserv_finish_spooling(dir_connection_t *conn) -{ - if (conn->zlib_state) { - connection_write_to_buf_zlib("", 0, conn, 1); - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; + if (BUG(!cached && !cce)) + return SRFS_DONE; + + int64_t total_len; + const char *ptr; + if (cached) { + total_len = cached->dir_z_len; + ptr = cached->dir_z; + } else { + total_len = spooled->cce_len; + ptr = (const char *)spooled->cce_body; + } + /* How many bytes left to flush? */ + int64_t remaining; + remaining = total_len - spooled->cached_dir_offset; + if (BUG(remaining < 0)) + return SRFS_ERR; + ssize_t bytes = (ssize_t) MIN(DIRSERV_CACHED_DIR_CHUNK_SIZE, remaining); + if (conn->compress_state) { + connection_write_to_buf_compress( + ptr + spooled->cached_dir_offset, + bytes, conn, 0); + } else { + connection_write_to_buf(ptr + spooled->cached_dir_offset, + bytes, TO_CONN(conn)); + } + spooled->cached_dir_offset += bytes; + if (spooled->cached_dir_offset >= (off_t)total_len) { + return SRFS_DONE; + } else { + return SRFS_MORE; + } } - conn->dir_spool_src = DIR_SPOOL_NONE; - return 0; } -/** Spooling helper: called when we're sending a bunch of server descriptors, - * and the outbuf has become too empty. Pulls some entries from - * fingerprint_stack, and writes the corresponding servers onto outbuf. If we - * run out of entries, flushes the zlib state and sets the spool source to - * NONE. Returns 0 on success, negative on failure. +/** Helper: find the cached_dir_t for a spooled_resource_t, for + * sending it to <b>conn</b>. Set *<b>published_out</b>, if provided, + * to the published time of the cached_dir_t. + * + * DOES NOT increase the reference count on the result. Callers must do that + * themselves if they mean to hang on to it. */ +static cached_dir_t * +spooled_resource_lookup_cached_dir(const spooled_resource_t *spooled, + time_t *published_out) +{ + tor_assert(spooled->spool_eagerly == 0); + cached_dir_t *d = lookup_cached_dir_by_fp(spooled->digest); + if (d != NULL) { + if (published_out) + *published_out = d->published; + } + return d; +} + +/** Helper: Look up the body for an eagerly-served spooled_resource. If + * <b>conn_is_encrypted</b> is false, don't look up any resource that + * shouldn't be sent over an unencrypted connection. On success, set + * <b>body_out</b>, <b>size_out</b>, and <b>published_out</b> to refer + * to the resource's body, size, and publication date, and return 0. + * On failure return -1. */ static int -connection_dirserv_add_servers_to_outbuf(dir_connection_t *conn) +spooled_resource_lookup_body(const spooled_resource_t *spooled, + int conn_is_encrypted, + const uint8_t **body_out, + size_t *size_out, + time_t *published_out) { - int by_fp = (conn->dir_spool_src == DIR_SPOOL_SERVER_BY_FP || - conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP); - int extra = (conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_FP || - conn->dir_spool_src == DIR_SPOOL_EXTRA_BY_DIGEST); - time_t publish_cutoff = time(NULL)-ROUTER_MAX_AGE_TO_PUBLISH; + tor_assert(spooled->spool_eagerly == 1); - const or_options_t *options = get_options(); + const signed_descriptor_t *sd = NULL; - while (smartlist_len(conn->fingerprint_stack) && - connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { - const char *body; - char *fp = smartlist_pop_last(conn->fingerprint_stack); - const signed_descriptor_t *sd = NULL; - if (by_fp) { - sd = get_signed_descriptor_by_fp(fp, extra, publish_cutoff); - } else { - sd = extra ? extrainfo_get_by_descriptor_digest(fp) - : router_get_by_descriptor_digest(fp); + switch (spooled->spool_source) { + case DIR_SPOOL_EXTRA_BY_FP: { + sd = get_signed_descriptor_by_fp(spooled->digest, 1); + break; } - tor_free(fp); - if (!sd) - continue; - if (!connection_dir_is_encrypted(conn) && !sd->send_unencrypted) { - /* we did this check once before (so we could have an accurate size - * estimate and maybe send a 404 if somebody asked for only bridges on a - * connection), but we need to do it again in case a previously - * unknown bridge descriptor has shown up between then and now. */ - continue; + case DIR_SPOOL_SERVER_BY_FP: { + sd = get_signed_descriptor_by_fp(spooled->digest, 0); + break; } - - /** If we are the bridge authority and the descriptor is a bridge - * descriptor, remember that we served this descriptor for desc stats. */ - if (options->BridgeAuthoritativeDir && by_fp) { - const routerinfo_t *router = - router_get_by_id_digest(sd->identity_digest); - /* router can be NULL here when the bridge auth is asked for its own - * descriptor. */ - if (router && router->purpose == ROUTER_PURPOSE_BRIDGE) - rep_hist_note_desc_served(sd->identity_digest); + case DIR_SPOOL_SERVER_BY_DIGEST: { + sd = router_get_by_descriptor_digest((const char *)spooled->digest); + break; + } + case DIR_SPOOL_EXTRA_BY_DIGEST: { + sd = extrainfo_get_by_descriptor_digest((const char *)spooled->digest); + break; } - body = signed_descriptor_get_body(sd); - if (conn->zlib_state) { - int last = ! smartlist_len(conn->fingerprint_stack); - connection_write_to_buf_zlib(body, sd->signed_descriptor_len, conn, - last); - if (last) { - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; + case DIR_SPOOL_MICRODESC: { + microdesc_t *md = microdesc_cache_lookup_by_digest256( + get_microdesc_cache(), + (const char *)spooled->digest); + if (! md || ! md->body) { + return -1; } - } else { - connection_write_to_buf(body, - sd->signed_descriptor_len, - TO_CONN(conn)); + *body_out = (const uint8_t *)md->body; + *size_out = md->bodylen; + if (published_out) + *published_out = TIME_MAX; + return 0; } + case DIR_SPOOL_NETWORKSTATUS: + case DIR_SPOOL_CONSENSUS_CACHE_ENTRY: + default: + /* LCOV_EXCL_START */ + tor_assert_nonfatal_unreached(); + return -1; + /* LCOV_EXCL_STOP */ } - if (!smartlist_len(conn->fingerprint_stack)) { - /* We just wrote the last one; finish up. */ - if (conn->zlib_state) { - connection_write_to_buf_zlib("", 0, conn, 1); - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; - } - conn->dir_spool_src = DIR_SPOOL_NONE; - smartlist_free(conn->fingerprint_stack); - conn->fingerprint_stack = NULL; + /* If we get here, then we tried to set "sd" to a signed_descriptor_t. */ + + if (sd == NULL) { + return -1; + } + if (sd->send_unencrypted == 0 && ! conn_is_encrypted) { + /* we did this check once before (so we could have an accurate size + * estimate and maybe send a 404 if somebody asked for only bridges on + * a connection), but we need to do it again in case a previously + * unknown bridge descriptor has shown up between then and now. */ + return -1; } + *body_out = (const uint8_t *) signed_descriptor_get_body(sd); + *size_out = sd->signed_descriptor_len; + if (published_out) + *published_out = sd->published_on; return 0; } -/** Spooling helper: called when we're sending a bunch of microdescriptors, - * and the outbuf has become too empty. Pulls some entries from - * fingerprint_stack, and writes the corresponding microdescs onto outbuf. If - * we run out of entries, flushes the zlib state and sets the spool source to - * NONE. Returns 0 on success, negative on failure. - */ -static int -connection_dirserv_add_microdescs_to_outbuf(dir_connection_t *conn) -{ - microdesc_cache_t *cache = get_microdesc_cache(); - while (smartlist_len(conn->fingerprint_stack) && - connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { - char *fp256 = smartlist_pop_last(conn->fingerprint_stack); - microdesc_t *md = microdesc_cache_lookup_by_digest256(cache, fp256); - tor_free(fp256); - if (!md || !md->body) - continue; - if (conn->zlib_state) { - int last = !smartlist_len(conn->fingerprint_stack); - connection_write_to_buf_zlib(md->body, md->bodylen, conn, last); - if (last) { - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; - } - } else { - connection_write_to_buf(md->body, md->bodylen, TO_CONN(conn)); - } - } - if (!smartlist_len(conn->fingerprint_stack)) { - if (conn->zlib_state) { - connection_write_to_buf_zlib("", 0, conn, 1); - tor_zlib_free(conn->zlib_state); - conn->zlib_state = NULL; - } - conn->dir_spool_src = DIR_SPOOL_NONE; - smartlist_free(conn->fingerprint_stack); - conn->fingerprint_stack = NULL; +/** Given a fingerprint <b>fp</b> which is either set if we're looking for a + * v2 status, or zeroes if we're looking for a v3 status, or a NUL-padded + * flavor name if we want a flavored v3 status, return a pointer to the + * appropriate cached dir object, or NULL if there isn't one available. */ +static cached_dir_t * +lookup_cached_dir_by_fp(const uint8_t *fp) +{ + cached_dir_t *d = NULL; + if (tor_digest_is_zero((const char *)fp) && cached_consensuses) { + d = strmap_get(cached_consensuses, "ns"); + } else if (memchr(fp, '\0', DIGEST_LEN) && cached_consensuses) { + /* this here interface is a nasty hack: we're shoving a flavor into + * a digest field. */ + d = strmap_get(cached_consensuses, (const char *)fp); } - return 0; + return d; } -/** Spooling helper: Called when we're sending a directory or networkstatus, - * and the outbuf has become too empty. Pulls some bytes from - * <b>conn</b>-\>cached_dir-\>dir_z, uncompresses them if appropriate, and - * puts them on the outbuf. If we run out of entries, flushes the zlib state - * and sets the spool source to NONE. Returns 0 on success, negative on - * failure. */ -static int -connection_dirserv_add_dir_bytes_to_outbuf(dir_connection_t *conn) -{ - ssize_t bytes; - int64_t remaining; - - bytes = DIRSERV_BUFFER_MIN - connection_get_outbuf_len(TO_CONN(conn)); - tor_assert(bytes > 0); - tor_assert(conn->cached_dir); - if (bytes < 8192) - bytes = 8192; - remaining = conn->cached_dir->dir_z_len - conn->cached_dir_offset; - if (bytes > remaining) - bytes = (ssize_t) remaining; - - if (conn->zlib_state) { - connection_write_to_buf_zlib( - conn->cached_dir->dir_z + conn->cached_dir_offset, - bytes, conn, bytes == remaining); - } else { - connection_write_to_buf(conn->cached_dir->dir_z + conn->cached_dir_offset, - bytes, TO_CONN(conn)); +/** Try to guess the number of bytes that will be needed to send the + * spooled objects for <b>conn</b>'s outgoing spool. In the process, + * remove every element of the spool that refers to an absent object, or + * which was published earlier than <b>cutoff</b>. Set *<b>size_out</b> + * to the number of bytes, and *<b>n_expired_out</b> to the number of + * objects removed for being too old. */ +void +dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn, + time_t cutoff, + int compression, + size_t *size_out, + int *n_expired_out) +{ + if (BUG(!conn)) + return; + + smartlist_t *spool = conn->spool; + if (!spool) { + if (size_out) + *size_out = 0; + if (n_expired_out) + *n_expired_out = 0; + return; } - conn->cached_dir_offset += bytes; - if (conn->cached_dir_offset == (int)conn->cached_dir->dir_z_len) { - /* We just wrote the last one; finish up. */ - connection_dirserv_finish_spooling(conn); - cached_dir_decref(conn->cached_dir); - conn->cached_dir = NULL; + int n_expired = 0; + uint64_t total = 0; + SMARTLIST_FOREACH_BEGIN(spool, spooled_resource_t *, spooled) { + time_t published = TIME_MAX; + size_t sz = spooled_resource_estimate_size(spooled, conn, + compression, &published); + if (published < cutoff) { + ++n_expired; + SMARTLIST_DEL_CURRENT(spool, spooled); + spooled_resource_free(spooled); + } else if (sz == 0) { + SMARTLIST_DEL_CURRENT(spool, spooled); + spooled_resource_free(spooled); + } else { + total += sz; + } + } SMARTLIST_FOREACH_END(spooled); + + if (size_out) { + *size_out = (total > SIZE_MAX) ? SIZE_MAX : (size_t)total; } - return 0; + if (n_expired_out) + *n_expired_out = n_expired; } -/** Spooling helper: Called when we're spooling networkstatus objects on - * <b>conn</b>, and the outbuf has become too empty. If the current - * networkstatus object (in <b>conn</b>-\>cached_dir) has more data, pull data - * from there. Otherwise, pop the next fingerprint from fingerprint_stack, - * and start spooling the next networkstatus. (A digest of all 0 bytes is - * treated as a request for the current consensus.) If we run out of entries, - * flushes the zlib state and sets the spool source to NONE. Returns 0 on - * success, negative on failure. */ +/** Helper: used to sort a connection's spool. */ static int -connection_dirserv_add_networkstatus_bytes_to_outbuf(dir_connection_t *conn) -{ - - while (connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN) { - if (conn->cached_dir) { - int uncompressing = (conn->zlib_state != NULL); - int r = connection_dirserv_add_dir_bytes_to_outbuf(conn); - if (conn->dir_spool_src == DIR_SPOOL_NONE) { - /* add_dir_bytes thinks we're done with the cached_dir. But we - * may have more cached_dirs! */ - conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS; - /* This bit is tricky. If we were uncompressing the last - * networkstatus, we may need to make a new zlib object to - * uncompress the next one. */ - if (uncompressing && ! conn->zlib_state && - conn->fingerprint_stack && - smartlist_len(conn->fingerprint_stack)) { - conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION); - } - } - if (r) return r; - } else if (conn->fingerprint_stack && - smartlist_len(conn->fingerprint_stack)) { - /* Add another networkstatus; start serving it. */ - char *fp = smartlist_pop_last(conn->fingerprint_stack); - cached_dir_t *d = lookup_cached_dir_by_fp(fp); - tor_free(fp); - if (d) { - ++d->refcnt; - conn->cached_dir = d; - conn->cached_dir_offset = 0; - } - } else { - connection_dirserv_finish_spooling(conn); - smartlist_free(conn->fingerprint_stack); - conn->fingerprint_stack = NULL; - return 0; +dirserv_spool_sort_comparison_(const void **a_, const void **b_) +{ + const spooled_resource_t *a = *a_; + const spooled_resource_t *b = *b_; + return fast_memcmp(a->digest, b->digest, sizeof(a->digest)); +} + +/** Sort all the entries in <b>conn</b> by digest. */ +void +dirserv_spool_sort(dir_connection_t *conn) +{ + if (conn->spool == NULL) + return; + smartlist_sort(conn->spool, dirserv_spool_sort_comparison_); +} + +/** Return the cache-info for identity fingerprint <b>fp</b>, or + * its extra-info document if <b>extrainfo</b> is true. Return + * NULL if not found or if the descriptor is older than + * <b>publish_cutoff</b>. */ +static const signed_descriptor_t * +get_signed_descriptor_by_fp(const uint8_t *fp, int extrainfo) +{ + if (router_digest_is_me((const char *)fp)) { + if (extrainfo) + return &(router_get_my_extrainfo()->cache_info); + else + return &(router_get_my_routerinfo()->cache_info); + } else { + const routerinfo_t *ri = router_get_by_id_digest((const char *)fp); + if (ri) { + if (extrainfo) + return extrainfo_get_by_descriptor_digest( + ri->cache_info.extra_info_digest); + else + return &ri->cache_info; } } - return 0; + return NULL; } -/** Called whenever we have flushed some directory data in state - * SERVER_WRITING. */ +/** When we're spooling data onto our outbuf, add more whenever we dip + * below this threshold. */ +#define DIRSERV_BUFFER_MIN 16384 + +/** + * Called whenever we have flushed some directory data in state + * SERVER_WRITING, or whenever we want to fill the buffer with initial + * directory data (so that subsequent writes will occur, and trigger this + * function again.) + * + * Return 0 on success, and -1 on failure. + */ int connection_dirserv_flushed_some(dir_connection_t *conn) { tor_assert(conn->base_.state == DIR_CONN_STATE_SERVER_WRITING); - - if (connection_get_outbuf_len(TO_CONN(conn)) >= DIRSERV_BUFFER_MIN) + if (conn->spool == NULL) return 0; - switch (conn->dir_spool_src) { - case DIR_SPOOL_EXTRA_BY_DIGEST: - case DIR_SPOOL_EXTRA_BY_FP: - case DIR_SPOOL_SERVER_BY_DIGEST: - case DIR_SPOOL_SERVER_BY_FP: - return connection_dirserv_add_servers_to_outbuf(conn); - case DIR_SPOOL_MICRODESC: - return connection_dirserv_add_microdescs_to_outbuf(conn); - case DIR_SPOOL_CACHED_DIR: - return connection_dirserv_add_dir_bytes_to_outbuf(conn); - case DIR_SPOOL_NETWORKSTATUS: - return connection_dirserv_add_networkstatus_bytes_to_outbuf(conn); - case DIR_SPOOL_NONE: - default: + while (connection_get_outbuf_len(TO_CONN(conn)) < DIRSERV_BUFFER_MIN && + smartlist_len(conn->spool)) { + spooled_resource_t *spooled = + smartlist_get(conn->spool, smartlist_len(conn->spool)-1); + spooled_resource_flush_status_t status; + status = spooled_resource_flush_some(spooled, conn); + if (status == SRFS_ERR) { + return -1; + } else if (status == SRFS_MORE) { return 0; + } + tor_assert(status == SRFS_DONE); + + /* If we're here, we're done flushing this resource. */ + tor_assert(smartlist_pop_last(conn->spool) == spooled); + spooled_resource_free(spooled); + } + + if (smartlist_len(conn->spool) > 0) { + /* We're still spooling something. */ + return 0; + } + + /* If we get here, we're done. */ + smartlist_free(conn->spool); + conn->spool = NULL; + if (conn->compress_state) { + /* Flush the compression state: there could be more bytes pending in there, + * and we don't want to omit bytes. */ + connection_write_to_buf_compress("", 0, conn, 1); + tor_compress_free(conn->compress_state); + conn->compress_state = NULL; } + return 0; +} + +/** Remove every element from <b>conn</b>'s outgoing spool, and delete + * the spool. */ +void +dir_conn_clear_spool(dir_connection_t *conn) +{ + if (!conn || ! conn->spool) + return; + SMARTLIST_FOREACH(conn->spool, spooled_resource_t *, s, + spooled_resource_free(s)); + smartlist_free(conn->spool); + conn->spool = NULL; } /** Return true iff <b>line</b> is a valid RecommendedPackages line. diff --git a/src/or/dirserv.h b/src/or/dirserv.h index e83da5e5ac..480174d5bb 100644 --- a/src/or/dirserv.h +++ b/src/or/dirserv.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -32,6 +32,61 @@ /** Maximum allowable length of a version line in a networkstatus. */ #define MAX_V_LINE_LEN 128 +/** Ways to convert a spoolable_resource_t to a bunch of bytes. */ +typedef enum dir_spool_source_t { + DIR_SPOOL_SERVER_BY_DIGEST=1, DIR_SPOOL_SERVER_BY_FP, + DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP, + DIR_SPOOL_MICRODESC, + DIR_SPOOL_NETWORKSTATUS, + DIR_SPOOL_CONSENSUS_CACHE_ENTRY, +} dir_spool_source_t; +#define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t) + +/** Object to remember the identity of an object that we are spooling, + * or about to spool, in response to a directory request. + * + * (Why do we spool? Because some directory responses are very large, + * and we don't want to just shove the complete answer into the output + * buffer: that would take a ridiculous amount of RAM.) + * + * If the spooled resource is relatively small (like microdescriptors, + * descriptors, etc), we look them up by ID as needed, and add the whole + * thing onto the output buffer at once. If the spooled reseource is + * big (like networkstatus documents), we reference-count it, and add it + * a few K at a time. + */ +typedef struct spooled_resource_t { + /** + * If true, we add the entire object to the outbuf. If false, + * we spool the object a few K at a time. + */ + unsigned spool_eagerly : 1; + /** + * Tells us what kind of object to get, and how to look it up. + */ + dir_spool_source_bitfield_t spool_source : 7; + /** + * Tells us the specific object to spool. + */ + uint8_t digest[DIGEST256_LEN]; + /** + * A large object that we're spooling. Holds a reference count. Only + * used when spool_eagerly is false. + */ + struct cached_dir_t *cached_dir_ref; + /** + * A different kind of large object that we might be spooling. Also + * reference-counted. Also only used when spool_eagerly is false. + */ + struct consensus_cache_entry_t *consensus_cache_entry; + const uint8_t *cce_body; + size_t cce_len; + /** + * The current offset into cached_dir or cce_body. Only used when + * spool_eagerly is false */ + off_t cached_dir_offset; +} spooled_resource_t; + int connection_dirserv_flushed_some(dir_connection_t *conn); int dirserv_add_own_fingerprint(crypto_pk_t *pk); @@ -63,12 +118,13 @@ cached_dir_t *dirserv_get_consensus(const char *flavor_name); void dirserv_set_cached_consensus_networkstatus(const char *consensus, const char *flavor_name, const common_digests_t *digests, + const uint8_t *sha3_as_signed, time_t published); void dirserv_clear_old_networkstatuses(time_t cutoff); -int dirserv_get_routerdesc_fingerprints(smartlist_t *fps_out, const char *key, - const char **msg, - int for_unencrypted_conn, - int is_extrainfo); +int dirserv_get_routerdesc_spool(smartlist_t *spools_out, const char *key, + dir_spool_source_t source, + int conn_is_encrytped, + const char **msg_out); int dirserv_get_routerdescs(smartlist_t *descs_out, const char *key, const char **msg); void dirserv_orconn_tls_done(const tor_addr_t *addr, @@ -89,13 +145,6 @@ void dirserv_set_node_flags_from_authoritative_status(node_t *node, uint32_t authstatus); int dirserv_would_reject_router(const routerstatus_t *rs); -int dirserv_remove_old_statuses(smartlist_t *fps, time_t cutoff); -int dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src); -int dirserv_have_any_microdesc(const smartlist_t *fps); -size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs, - int compressed); -size_t dirserv_estimate_microdesc_size(const smartlist_t *fps, int compressed); - char *routerstatus_format_entry( const routerstatus_t *rs, const char *version, @@ -141,5 +190,19 @@ int dirserv_read_measured_bandwidths(const char *from_file, int dirserv_read_guardfraction_file(const char *fname, smartlist_t *vote_routerstatuses); +spooled_resource_t *spooled_resource_new(dir_spool_source_t source, + const uint8_t *digest, + size_t digestlen); +spooled_resource_t *spooled_resource_new_from_cache_entry( + struct consensus_cache_entry_t *entry); +void spooled_resource_free(spooled_resource_t *spooled); +void dirserv_spool_remove_missing_and_guess_size(dir_connection_t *conn, + time_t cutoff, + int compression, + size_t *size_out, + int *n_expired_out); +void dirserv_spool_sort(dir_connection_t *conn); +void dir_conn_clear_spool(dir_connection_t *conn); + #endif diff --git a/src/or/dirvote.c b/src/or/dirvote.c index e92d3b49dc..f5e29eb786 100644 --- a/src/or/dirvote.c +++ b/src/or/dirvote.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRVOTE_PRIVATE diff --git a/src/or/dirvote.h b/src/or/dirvote.h index ac7db69db2..e342dc78ea 100644 --- a/src/or/dirvote.h +++ b/src/or/dirvote.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dns.c b/src/or/dns.c index 7651501ec3..cd84a64758 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dns.h b/src/or/dns.h index 951a2a3467..a81cbd20da 100644 --- a/src/or/dns.h +++ b/src/or/dns.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dns_structs.h b/src/or/dns_structs.h index bc6067213d..dc00e9f7b9 100644 --- a/src/or/dns_structs.h +++ b/src/or/dns_structs.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dnsserv.c b/src/or/dnsserv.c index 8768b2a1d1..54a22a5150 100644 --- a/src/or/dnsserv.c +++ b/src/or/dnsserv.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/dnsserv.h b/src/or/dnsserv.h index ad0e248c83..6c0643b8dc 100644 --- a/src/or/dnsserv.h +++ b/src/or/dnsserv.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c index 3bb5169355..7a27cd0f44 100644 --- a/src/or/entrynodes.c +++ b/src/or/entrynodes.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -768,11 +768,6 @@ get_sampled_guard_for_bridge(guard_selection_t *gs, const uint8_t *id = bridge_get_rsa_id_digest(bridge); const tor_addr_port_t *addrport = bridge_get_addr_port(bridge); entry_guard_t *guard; - if (id) { - guard = get_sampled_guard_with_id(gs, id); - if (guard) - return guard; - } if (BUG(!addrport)) return NULL; // LCOV_EXCL_LINE guard = get_sampled_guard_by_bridge_addr(gs, addrport); @@ -787,16 +782,17 @@ get_sampled_guard_for_bridge(guard_selection_t *gs, static bridge_info_t * get_bridge_info_for_guard(const entry_guard_t *guard) { + const uint8_t *identity = NULL; if (! tor_digest_is_zero(guard->identity)) { - bridge_info_t *bridge = find_bridge_by_digest(guard->identity); - if (bridge) - return bridge; + identity = (const uint8_t *)guard->identity; } if (BUG(guard->bridge_addr == NULL)) return NULL; - return get_configured_bridge_by_addr_port_digest(&guard->bridge_addr->addr, - guard->bridge_addr->port, - NULL); + + return get_configured_bridge_by_exact_addr_port_digest( + &guard->bridge_addr->addr, + guard->bridge_addr->port, + (const char*)identity); } /** @@ -820,6 +816,10 @@ entry_guard_add_to_sample(guard_selection_t *gs, log_info(LD_GUARD, "Adding %s as to the entry guard sample set.", node_describe(node)); + /* make sure that the guard is not already sampled. */ + if (BUG(have_sampled_guard_with_id(gs, (const uint8_t*)node->identity))) + return NULL; // LCOV_EXCL_LINE + return entry_guard_add_to_sample_impl(gs, (const uint8_t*)node->identity, node_get_nickname(node), @@ -843,9 +843,6 @@ entry_guard_add_to_sample_impl(guard_selection_t *gs, // XXXX #20827 take ed25519 identity here too. - /* make sure that the guard is not already sampled. */ - if (rsa_id_digest && BUG(have_sampled_guard_with_id(gs, rsa_id_digest))) - return NULL; // LCOV_EXCL_LINE /* Make sure we can actually identify the guard. */ if (BUG(!rsa_id_digest && !bridge_addrport)) return NULL; // LCOV_EXCL_LINE @@ -890,6 +887,10 @@ entry_guard_add_bridge_to_sample(guard_selection_t *gs, tor_assert(addrport); + /* make sure that the guard is not already sampled. */ + if (BUG(get_sampled_guard_for_bridge(gs, bridge))) + return NULL; // LCOV_EXCL_LINE + return entry_guard_add_to_sample_impl(gs, id_digest, NULL, addrport); } @@ -988,9 +989,11 @@ get_max_sample_size(guard_selection_t *gs, const int using_bridges = (gs->type == GS_TYPE_BRIDGE); const int min_sample = get_min_filtered_sample_size(); - /* With bridges, max_sample is "all of them" */ + /* If we are in bridge mode, expand our sample set as needed without worrying + * about max size. We should respect the user's wishes to use many bridges if + * that's what they have specified in their configuration file. */ if (using_bridges) - return n_guards; + return INT_MAX; const int max_sample_by_pct = (int)(n_guards * get_max_sample_threshold()); const int max_sample_absolute = get_max_sample_size_absolute(); @@ -1842,7 +1845,7 @@ select_entry_guard_for_circuit(guard_selection_t *gs, if (! entry_guard_obeys_restriction(guard, rst)) continue; if (guard->is_reachable != GUARD_REACHABLE_NO) { - if (need_descriptor && BUG(!guard_has_descriptor(guard))) { + if (need_descriptor && !guard_has_descriptor(guard)) { continue; } *state_out = GUARD_CIRC_STATE_USABLE_ON_COMPLETION; @@ -2901,13 +2904,7 @@ entry_guard_t * entry_guard_get_by_id_digest_for_guard_selection(guard_selection_t *gs, const char *digest) { - tor_assert(gs != NULL); - - SMARTLIST_FOREACH(gs->sampled_entry_guards, entry_guard_t *, entry, - if (tor_memeq(digest, entry->identity, DIGEST_LEN)) - return entry; - ); - return NULL; + return get_sampled_guard_with_id(gs, (const uint8_t*)digest); } /** Return the node_t associated with a single entry_guard_t. May @@ -3362,9 +3359,15 @@ guard_selection_have_enough_dir_info_to_build_circuits(guard_selection_t *gs) if (!gs->primary_guards_up_to_date) entry_guards_update_primary(gs); - const int num_primary = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC); int n_missing_descriptors = 0; int n_considered = 0; + int num_primary_to_check; + + /* We want to check for the descriptor of at least the first two primary + * guards in our list, since these are the guards that we typically use for + * circuits. */ + num_primary_to_check = get_n_primary_guards_to_use(GUARD_USAGE_TRAFFIC); + num_primary_to_check++; SMARTLIST_FOREACH_BEGIN(gs->primary_entry_guards, entry_guard_t *, guard) { entry_guard_consider_retry(guard); @@ -3373,7 +3376,7 @@ guard_selection_have_enough_dir_info_to_build_circuits(guard_selection_t *gs) n_considered++; if (!guard_has_descriptor(guard)) n_missing_descriptors++; - if (n_considered >= num_primary) + if (n_considered >= num_primary_to_check) break; } SMARTLIST_FOREACH_END(guard); diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h index f02901f5d7..400a84269d 100644 --- a/src/or/entrynodes.h +++ b/src/or/entrynodes.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c index 676adfd8bf..b60d2e55c8 100644 --- a/src/or/ext_orport.c +++ b/src/or/ext_orport.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/ext_orport.h b/src/or/ext_orport.h index 33d954e8d0..b2cd05db8f 100644 --- a/src/or/ext_orport.h +++ b/src/or/ext_orport.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef EXT_ORPORT_H diff --git a/src/or/fp_pair.c b/src/or/fp_pair.c index eeeb0f1de3..f730106d06 100644 --- a/src/or/fp_pair.c +++ b/src/or/fp_pair.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/fp_pair.h b/src/or/fp_pair.h index b1466581d2..4cea3eda6d 100644 --- a/src/or/fp_pair.h +++ b/src/or/fp_pair.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/geoip.c b/src/or/geoip.c index 74811ea643..c76071a152 100644 --- a/src/or/geoip.c +++ b/src/or/geoip.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/geoip.h b/src/or/geoip.h index 070296dd07..55ca8ca28c 100644 --- a/src/or/geoip.h +++ b/src/or/geoip.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hibernate.c b/src/or/hibernate.c index c2b3bbb839..f2a4c71764 100644 --- a/src/or/hibernate.c +++ b/src/or/hibernate.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hibernate.h b/src/or/hibernate.h index fa9da6de39..8bdb65a927 100644 --- a/src/or/hibernate.h +++ b/src/or/hibernate.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hs_cache.c b/src/or/hs_cache.c index 43cd8c3258..29681b42b5 100644 --- a/src/or/hs_cache.c +++ b/src/or/hs_cache.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hs_cache.h b/src/or/hs_cache.h index ba95e73338..ed00424234 100644 --- a/src/or/hs_cache.h +++ b/src/or/hs_cache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/hs_circuitmap.c b/src/or/hs_circuitmap.c index 5003b4b593..ea66fb5194 100644 --- a/src/or/hs_circuitmap.c +++ b/src/or/hs_circuitmap.c @@ -1,11 +1,12 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file hs_circuitmap.c * - * \brief Manage the hidden service circuitmap: A hash table that maps binary - * tokens to introduction and rendezvous circuits. + * \brief Hidden service circuitmap: A hash table that maps binary tokens to + * introduction and rendezvous circuits; it's used both by relays acting as + * intro points and rendezvous points, and also by hidden services themselves. **/ #define HS_CIRCUITMAP_PRIVATE @@ -25,8 +26,8 @@ static struct hs_circuitmap_ht *the_hs_circuitmap = NULL; /* This is a helper function used by the hash table code (HT_). It returns 1 if * two circuits have the same HS token. */ static int -hs_circuits_have_same_token(const or_circuit_t *first_circuit, - const or_circuit_t *second_circuit) +hs_circuits_have_same_token(const circuit_t *first_circuit, + const circuit_t *second_circuit) { const hs_token_t *first_token; const hs_token_t *second_token; @@ -57,7 +58,7 @@ hs_circuits_have_same_token(const or_circuit_t *first_circuit, /* This is a helper function for the hash table code (HT_). It hashes a circuit * HS token into an unsigned int for use as a key by the hash table routines.*/ static inline unsigned int -hs_circuit_hash_token(const or_circuit_t *circuit) +hs_circuit_hash_token(const circuit_t *circuit) { tor_assert(circuit->hs_token); @@ -67,11 +68,11 @@ hs_circuit_hash_token(const or_circuit_t *circuit) /* Register the circuitmap hash table */ HT_PROTOTYPE(hs_circuitmap_ht, // The name of the hashtable struct - or_circuit_t, // The name of the element struct, + circuit_t, // The name of the element struct, hs_circuitmap_node, // The name of HT_ENTRY member hs_circuit_hash_token, hs_circuits_have_same_token) -HT_GENERATE2(hs_circuitmap_ht, or_circuit_t, hs_circuitmap_node, +HT_GENERATE2(hs_circuitmap_ht, circuit_t, hs_circuitmap_node, hs_circuit_hash_token, hs_circuits_have_same_token, 0.6, tor_reallocarray, tor_free_) @@ -116,13 +117,13 @@ hs_token_free(hs_token_t *hs_token) } /** Return the circuit from the circuitmap with token <b>search_token</b>. */ -static or_circuit_t * +static circuit_t * get_circuit_with_token(hs_token_t *search_token) { tor_assert(the_hs_circuitmap); /* We use a dummy circuit object for the hash table search routine. */ - or_circuit_t search_circ; + circuit_t search_circ; search_circ.hs_token = search_token; return HT_FIND(hs_circuitmap_ht, the_hs_circuitmap, &search_circ); } @@ -130,7 +131,7 @@ get_circuit_with_token(hs_token_t *search_token) /* Helper function that registers <b>circ</b> with <b>token</b> on the HS circuitmap. This function steals reference of <b>token</b>. */ static void -hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token) +hs_circuitmap_register_impl(circuit_t *circ, hs_token_t *token) { tor_assert(circ); tor_assert(token); @@ -145,13 +146,12 @@ hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token) take precedence over old ones, so that HSes and clients and reestablish killed circuits without changing the HS token. */ { - or_circuit_t *found_circ; + circuit_t *found_circ; found_circ = get_circuit_with_token(token); if (found_circ) { hs_circuitmap_remove_circuit(found_circ); - if (!found_circ->base_.marked_for_close) { - circuit_mark_for_close(TO_CIRCUIT(found_circ), - END_CIRC_REASON_FINISHED); + if (!found_circ->marked_for_close) { + circuit_mark_for_close(found_circ, END_CIRC_REASON_FINISHED); } } } @@ -165,7 +165,7 @@ hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token) * circuitmap. Use the HS <b>token</b> as the key to the hash table. If * <b>token</b> is not set, clear the circuit of any HS tokens. */ static void -hs_circuitmap_register_circuit(or_circuit_t *circ, +hs_circuitmap_register_circuit(circuit_t *circ, hs_token_type_t type, size_t token_len, const uint8_t *token) { @@ -178,17 +178,19 @@ hs_circuitmap_register_circuit(or_circuit_t *circ, hs_circuitmap_register_impl(circ, hs_token); } -/* Query circuitmap for circuit with <b>token</b> of size <b>token_len</b>. - * Only returns a circuit with purpose equal to the <b>wanted_circ_purpose</b> - * parameter and if it is NOT marked for close. Return NULL if no such circuit - * is found. */ -static or_circuit_t * -hs_circuitmap_get_circuit(hs_token_type_t type, - size_t token_len, - const uint8_t *token, - uint8_t wanted_circ_purpose) +/* Helper function for hs_circuitmap_get_origin_circuit() and + * hs_circuitmap_get_or_circuit(). Because only circuit_t are indexed in the + * circuitmap, this function returns object type so the specialized functions + * using this helper can upcast it to the right type. + * + * Return NULL if not such circuit is found. */ +static circuit_t * +hs_circuitmap_get_circuit_impl(hs_token_type_t type, + size_t token_len, + const uint8_t *token, + uint8_t wanted_circ_purpose) { - or_circuit_t *found_circ = NULL; + circuit_t *found_circ = NULL; tor_assert(the_hs_circuitmap); @@ -202,87 +204,247 @@ hs_circuitmap_get_circuit(hs_token_type_t type, /* Check that the circuit is useful to us */ if (!found_circ || - found_circ->base_.purpose != wanted_circ_purpose || - found_circ->base_.marked_for_close) { + found_circ->purpose != wanted_circ_purpose || + found_circ->marked_for_close) { return NULL; } return found_circ; } -/************** Public circuitmap API ****************************************/ +/* Helper function: Query circuitmap for origin circuit with <b>token</b> of + * size <b>token_len</b> and <b>type</b>. Only returns a circuit with purpose + * equal to the <b>wanted_circ_purpose</b> parameter and if it is NOT marked + * for close. Return NULL if no such circuit is found. */ +static origin_circuit_t * +hs_circuitmap_get_origin_circuit(hs_token_type_t type, + size_t token_len, + const uint8_t *token, + uint8_t wanted_circ_purpose) +{ + circuit_t *circ; + tor_assert(token); + tor_assert(CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose)); -/* Public function: Return v3 introduction circuit with <b>auth_key</b>. Return - * NULL if no such circuit is found in the circuitmap. */ -or_circuit_t * -hs_circuitmap_get_intro_circ_v3(const ed25519_public_key_t *auth_key) + circ = hs_circuitmap_get_circuit_impl(type, token_len, token, + wanted_circ_purpose); + if (!circ) { + return NULL; + } + + tor_assert(CIRCUIT_IS_ORIGIN(circ)); + return TO_ORIGIN_CIRCUIT(circ); +} + +/* Helper function: Query circuitmap for OR circuit with <b>token</b> of size + * <b>token_len</b> and <b>type</b>. Only returns a circuit with purpose equal + * to the <b>wanted_circ_purpose</b> parameter and if it is NOT marked for + * close. Return NULL if no such circuit is found. */ +static or_circuit_t * +hs_circuitmap_get_or_circuit(hs_token_type_t type, + size_t token_len, + const uint8_t *token, + uint8_t wanted_circ_purpose) { - tor_assert(auth_key); + circuit_t *circ; + tor_assert(token); + tor_assert(!CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose)); + + circ = hs_circuitmap_get_circuit_impl(type, token_len, token, + wanted_circ_purpose); + if (!circ) { + return NULL; + } - return hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V3, - ED25519_PUBKEY_LEN, auth_key->pubkey, - CIRCUIT_PURPOSE_INTRO_POINT); + tor_assert(CIRCUIT_IS_ORCIRC(circ)); + return TO_OR_CIRCUIT(circ); } -/* Public function: Return v2 introduction circuit with <b>digest</b>. Return - * NULL if no such circuit is found in the circuitmap. */ +/************** Public circuitmap API ****************************************/ + +/**** Public relay-side getters: */ + +/* Public function: Return a v3 introduction circuit to this relay with + * <b>auth_key</b>. Return NULL if no such circuit is found in the + * circuitmap. */ or_circuit_t * -hs_circuitmap_get_intro_circ_v2(const uint8_t *digest) +hs_circuitmap_get_intro_circ_v3_relay_side( + const ed25519_public_key_t *auth_key) { - tor_assert(digest); + return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V3_RELAY_SIDE, + ED25519_PUBKEY_LEN, auth_key->pubkey, + CIRCUIT_PURPOSE_INTRO_POINT); +} - return hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V2, - REND_TOKEN_LEN, digest, - CIRCUIT_PURPOSE_INTRO_POINT); +/* Public function: Return v2 introduction circuit to this relay with + * <b>digest</b>. Return NULL if no such circuit is found in the circuitmap. */ +or_circuit_t * +hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest) +{ + return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V2_RELAY_SIDE, + REND_TOKEN_LEN, digest, + CIRCUIT_PURPOSE_INTRO_POINT); } -/* Public function: Return rendezvous circuit with rendezvous +/* Public function: Return rendezvous circuit to this relay with rendezvous * <b>cookie</b>. Return NULL if no such circuit is found in the circuitmap. */ or_circuit_t * -hs_circuitmap_get_rend_circ(const uint8_t *cookie) +hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie) { - tor_assert(cookie); - - return hs_circuitmap_get_circuit(HS_TOKEN_REND, - REND_TOKEN_LEN, cookie, - CIRCUIT_PURPOSE_REND_POINT_WAITING); + return hs_circuitmap_get_or_circuit(HS_TOKEN_REND_RELAY_SIDE, + REND_TOKEN_LEN, cookie, + CIRCUIT_PURPOSE_REND_POINT_WAITING); } +/** Public relay-side setters: */ + /* Public function: Register rendezvous circuit with key <b>cookie</b> to the * circuitmap. */ void -hs_circuitmap_register_rend_circ(or_circuit_t *circ, const uint8_t *cookie) +hs_circuitmap_register_rend_circ_relay_side(or_circuit_t *circ, + const uint8_t *cookie) { - hs_circuitmap_register_circuit(circ, - HS_TOKEN_REND, + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_REND_RELAY_SIDE, REND_TOKEN_LEN, cookie); } +/* Public function: Register v2 intro circuit with key <b>digest</b> to the + * circuitmap. */ +void +hs_circuitmap_register_intro_circ_v2_relay_side(or_circuit_t *circ, + const uint8_t *digest) +{ + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_INTRO_V2_RELAY_SIDE, + REND_TOKEN_LEN, digest); +} + +/* Public function: Register v3 intro circuit with key <b>auth_key</b> to the + * circuitmap. */ +void +hs_circuitmap_register_intro_circ_v3_relay_side(or_circuit_t *circ, + const ed25519_public_key_t *auth_key) +{ + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_INTRO_V3_RELAY_SIDE, + ED25519_PUBKEY_LEN, auth_key->pubkey); +} + +/**** Public servide-side getters: */ + +/* Public function: Return v3 introduction circuit with <b>auth_key</b> + * originating from this hidden service. Return NULL if no such circuit is + * found in the circuitmap. */ +origin_circuit_t * +hs_circuitmap_get_intro_circ_v3_service_side(const + ed25519_public_key_t *auth_key) +{ + origin_circuit_t *circ = NULL; + + /* Check first for established intro circuits */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE, + ED25519_PUBKEY_LEN, auth_key->pubkey, + CIRCUIT_PURPOSE_S_INTRO); + if (circ) { + return circ; + } + + /* ...if nothing found, check for pending intro circs */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE, + ED25519_PUBKEY_LEN, auth_key->pubkey, + CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); + + return circ; +} + +/* Public function: Return v2 introduction circuit originating from this hidden + * service with <b>digest</b>. Return NULL if no such circuit is found in the + * circuitmap. */ +origin_circuit_t * +hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest) +{ + origin_circuit_t *circ = NULL; + + /* Check first for established intro circuits */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE, + REND_TOKEN_LEN, digest, + CIRCUIT_PURPOSE_S_INTRO); + if (circ) { + return circ; + } + + /* ...if nothing found, check for pending intro circs */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE, + REND_TOKEN_LEN, digest, + CIRCUIT_PURPOSE_S_ESTABLISH_INTRO); + + return circ; +} + +/* Public function: Return rendezvous circuit originating from this hidden + * service with rendezvous <b>cookie</b>. Return NULL if no such circuit is + * found in the circuitmap. */ +origin_circuit_t * +hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie) +{ + origin_circuit_t *circ = NULL; + + /* Try to check if we have a connecting circuit. */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE, + REND_TOKEN_LEN, cookie, + CIRCUIT_PURPOSE_S_CONNECT_REND); + if (circ) { + return circ; + } + + /* Then try for connected circuit. */ + circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE, + REND_TOKEN_LEN, cookie, + CIRCUIT_PURPOSE_S_REND_JOINED); + return circ; +} + +/**** Public servide-side setters: */ /* Public function: Register v2 intro circuit with key <b>digest</b> to the * circuitmap. */ void -hs_circuitmap_register_intro_circ_v2(or_circuit_t *circ, const uint8_t *digest) +hs_circuitmap_register_intro_circ_v2_service_side(origin_circuit_t *circ, + const uint8_t *digest) { - hs_circuitmap_register_circuit(circ, - HS_TOKEN_INTRO_V2, + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_INTRO_V2_SERVICE_SIDE, REND_TOKEN_LEN, digest); } /* Public function: Register v3 intro circuit with key <b>auth_key</b> to the * circuitmap. */ void -hs_circuitmap_register_intro_circ_v3(or_circuit_t *circ, - const ed25519_public_key_t *auth_key) +hs_circuitmap_register_intro_circ_v3_service_side(origin_circuit_t *circ, + const ed25519_public_key_t *auth_key) { - hs_circuitmap_register_circuit(circ, - HS_TOKEN_INTRO_V3, + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_INTRO_V3_SERVICE_SIDE, ED25519_PUBKEY_LEN, auth_key->pubkey); } -/** Remove this circuit from the HS circuitmap. Clear its HS token, and remove - * it from the hashtable. */ +/* Public function: Register rendezvous circuit with key <b>cookie</b> to the + * circuitmap. */ +void +hs_circuitmap_register_rend_circ_service_side(origin_circuit_t *circ, + const uint8_t *cookie) +{ + hs_circuitmap_register_circuit(TO_CIRCUIT(circ), + HS_TOKEN_REND_SERVICE_SIDE, + REND_TOKEN_LEN, cookie); +} + +/**** Misc public functions: */ + +/** Public function: Remove this circuit from the HS circuitmap. Clear its HS + * token, and remove it from the hashtable. */ void -hs_circuitmap_remove_circuit(or_circuit_t *circ) +hs_circuitmap_remove_circuit(circuit_t *circ) { tor_assert(the_hs_circuitmap); @@ -291,14 +453,14 @@ hs_circuitmap_remove_circuit(or_circuit_t *circ) } /* Remove circ from circuitmap */ - or_circuit_t *tmp; + circuit_t *tmp; tmp = HT_REMOVE(hs_circuitmap_ht, the_hs_circuitmap, circ); /* ... and ensure the removal was successful. */ if (tmp) { tor_assert(tmp == circ); } else { log_warn(LD_BUG, "Could not find circuit (%u) in circuitmap.", - circ->p_circ_id); + circ->n_circ_id); } /* Clear token from circ */ @@ -306,7 +468,7 @@ hs_circuitmap_remove_circuit(or_circuit_t *circ) circ->hs_token = NULL; } -/* Initialize the global HS circuitmap. */ +/* Public function: Initialize the global HS circuitmap. */ void hs_circuitmap_init(void) { @@ -316,7 +478,7 @@ hs_circuitmap_init(void) HT_INIT(hs_circuitmap_ht, the_hs_circuitmap); } -/* Free all memory allocated by the global HS circuitmap. */ +/* Public function: Free all memory allocated by the global HS circuitmap. */ void hs_circuitmap_free_all(void) { diff --git a/src/or/hs_circuitmap.h b/src/or/hs_circuitmap.h index b587039310..33d5b64117 100644 --- a/src/or/hs_circuitmap.h +++ b/src/or/hs_circuitmap.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -9,26 +9,52 @@ #ifndef TOR_HS_CIRCUITMAP_H #define TOR_HS_CIRCUITMAP_H -typedef HT_HEAD(hs_circuitmap_ht, or_circuit_t) hs_circuitmap_ht; +typedef HT_HEAD(hs_circuitmap_ht, circuit_t) hs_circuitmap_ht; typedef struct hs_token_s hs_token_t; struct or_circuit_t; +struct origin_circuit_t; /** Public HS circuitmap API: */ -struct or_circuit_t *hs_circuitmap_get_rend_circ(const uint8_t *cookie); -struct or_circuit_t *hs_circuitmap_get_intro_circ_v3( - const ed25519_public_key_t *auth_key); -struct or_circuit_t *hs_circuitmap_get_intro_circ_v2(const uint8_t *digest); - -void hs_circuitmap_register_rend_circ(struct or_circuit_t *circ, - const uint8_t *cookie); -void hs_circuitmap_register_intro_circ_v2(struct or_circuit_t *circ, - const uint8_t *digest); -void hs_circuitmap_register_intro_circ_v3(struct or_circuit_t *circ, +/** Public relay-side API: */ + +struct or_circuit_t * +hs_circuitmap_get_intro_circ_v3_relay_side(const + ed25519_public_key_t *auth_key); +struct or_circuit_t * +hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest); +struct or_circuit_t * +hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie); + +void hs_circuitmap_register_rend_circ_relay_side(struct or_circuit_t *circ, + const uint8_t *cookie); +void hs_circuitmap_register_intro_circ_v2_relay_side(struct or_circuit_t *circ, + const uint8_t *digest); +void hs_circuitmap_register_intro_circ_v3_relay_side(struct or_circuit_t *circ, const ed25519_public_key_t *auth_key); -void hs_circuitmap_remove_circuit(struct or_circuit_t *circ); +/** Public service-side API: */ + +struct origin_circuit_t * +hs_circuitmap_get_intro_circ_v3_service_side(const + ed25519_public_key_t *auth_key); +struct origin_circuit_t * +hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest); +struct origin_circuit_t * +hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie); + +void hs_circuitmap_register_intro_circ_v2_service_side( + struct origin_circuit_t *circ, + const uint8_t *digest); +void hs_circuitmap_register_intro_circ_v3_service_side( + struct origin_circuit_t *circ, + const ed25519_public_key_t *auth_key); +void hs_circuitmap_register_rend_circ_service_side( + struct origin_circuit_t *circ, + const uint8_t *cookie); + +void hs_circuitmap_remove_circuit(struct circuit_t *circ); void hs_circuitmap_init(void); void hs_circuitmap_free_all(void); @@ -37,12 +63,19 @@ void hs_circuitmap_free_all(void); /** Represents the type of HS token. */ typedef enum { - /** A rendezvous cookie (128bit)*/ - HS_TOKEN_REND, - /** A v2 introduction point pubkey (160bit) */ - HS_TOKEN_INTRO_V2, - /** A v3 introduction point pubkey (256bit) */ - HS_TOKEN_INTRO_V3, + /** A rendezvous cookie on a relay (128bit)*/ + HS_TOKEN_REND_RELAY_SIDE, + /** A v2 introduction point pubkey on a relay (160bit) */ + HS_TOKEN_INTRO_V2_RELAY_SIDE, + /** A v3 introduction point pubkey on a relay (256bit) */ + HS_TOKEN_INTRO_V3_RELAY_SIDE, + + /** A rendezvous cookie on a hidden service (128bit)*/ + HS_TOKEN_REND_SERVICE_SIDE, + /** A v2 introduction point pubkey on a hidden service (160bit) */ + HS_TOKEN_INTRO_V2_SERVICE_SIDE, + /** A v3 introduction point pubkey on a hidden service (256bit) */ + HS_TOKEN_INTRO_V3_SERVICE_SIDE, } hs_token_type_t; /** Represents a token used in the HS protocol. Each such token maps to a diff --git a/src/or/hs_common.c b/src/or/hs_common.c index de96946ab5..42508126f8 100644 --- a/src/or/hs_common.c +++ b/src/or/hs_common.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -9,6 +9,8 @@ * protocol. **/ +#define HS_COMMON_PRIVATE + #include "or.h" #include "config.h" @@ -16,6 +18,80 @@ #include "hs_common.h" #include "rendcommon.h" +/* Make sure that the directory for <b>service</b> is private, using the config + * <b>username</b>. + * If <b>create</b> is true: + * - if the directory exists, change permissions if needed, + * - if the directory does not exist, create it with the correct permissions. + * If <b>create</b> is false: + * - if the directory exists, check permissions, + * - if the directory does not exist, check if we think we can create it. + * Return 0 on success, -1 on failure. */ +int +hs_check_service_private_dir(const char *username, const char *path, + unsigned int dir_group_readable, + unsigned int create) +{ + cpd_check_t check_opts = CPD_NONE; + + tor_assert(path); + + if (create) { + check_opts |= CPD_CREATE; + } else { + check_opts |= CPD_CHECK_MODE_ONLY; + check_opts |= CPD_CHECK; + } + if (dir_group_readable) { + check_opts |= CPD_GROUP_READ; + } + /* Check/create directory */ + if (check_private_dir(path, check_opts, username) < 0) { + return -1; + } + return 0; +} + +/** Get the default HS time period length in minutes from the consensus. */ +STATIC uint64_t +get_time_period_length(void) +{ + int32_t time_period_length = networkstatus_get_param(NULL, "hsdir-interval", + HS_TIME_PERIOD_LENGTH_DEFAULT, + HS_TIME_PERIOD_LENGTH_MIN, + HS_TIME_PERIOD_LENGTH_MAX); + /* Make sure it's a positive value. */ + tor_assert(time_period_length >= 0); + /* uint64_t will always be able to contain a int32_t */ + return (uint64_t) time_period_length; +} + +/** Get the HS time period number at time <b>now</b> */ +STATIC uint64_t +get_time_period_num(time_t now) +{ + uint64_t time_period_num; + uint64_t time_period_length = get_time_period_length(); + uint64_t minutes_since_epoch = now / 60; + + /* Now subtract half a day to fit the prop224 time period schedule (see + * section [TIME-PERIODS]). */ + tor_assert(minutes_since_epoch > HS_TIME_PERIOD_ROTATION_OFFSET); + minutes_since_epoch -= HS_TIME_PERIOD_ROTATION_OFFSET; + + /* Calculate the time period */ + time_period_num = minutes_since_epoch / time_period_length; + return time_period_num; +} + +/** Get the number of the _upcoming_ HS time period, given that the current + * time is <b>now</b>. */ +uint64_t +hs_get_next_time_period_num(time_t now) +{ + return get_time_period_num(now) + 1; +} + /* Create a new rend_data_t for a specific given <b>version</b>. * Return a pointer to the newly allocated data structure. */ static rend_data_t * diff --git a/src/or/hs_common.h b/src/or/hs_common.h index e0ab510ea4..a8fded652a 100644 --- a/src/or/hs_common.h +++ b/src/or/hs_common.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -17,12 +17,42 @@ /* Version 3 of the protocol (prop224). */ #define HS_VERSION_THREE 3 -/* Denotes ed25519 authentication key on ESTABLISH_INTRO cell. */ -#define AUTH_KEY_ED25519 0x02 +/** Try to maintain this many intro points per service by default. */ +#define NUM_INTRO_POINTS_DEFAULT 3 +/** Maximum number of intro points per service. */ +#define NUM_INTRO_POINTS_MAX 10 +/** Number of extra intro points we launch if our set of intro nodes is empty. + * See proposal 155, section 4. */ +#define NUM_INTRO_POINTS_EXTRA 2 + +/** If we can't build our intro circuits, don't retry for this long. */ +#define INTRO_CIRC_RETRY_PERIOD (60*5) +/** Don't try to build more than this many circuits before giving up for a + * while.*/ +#define MAX_INTRO_CIRCS_PER_PERIOD 10 +/** How many times will a hidden service operator attempt to connect to a + * requested rendezvous point before giving up? */ +#define MAX_REND_FAILURES 1 +/** How many seconds should we spend trying to connect to a requested + * rendezvous point before giving up? */ +#define MAX_REND_TIMEOUT 30 /* String prefix for the signature of ESTABLISH_INTRO */ #define ESTABLISH_INTRO_SIG_PREFIX "Tor establish-intro cell v1" +/* The default HS time period length */ +#define HS_TIME_PERIOD_LENGTH_DEFAULT 1440 /* 1440 minutes == one day */ +/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */ +#define HS_TIME_PERIOD_LENGTH_MIN 30 /* minutes */ +/* The minimum time period length as seen in prop224 section [TIME-PERIODS] */ +#define HS_TIME_PERIOD_LENGTH_MAX (60 * 24 * 10) /* 10 days or 14400 minutes */ +/* The time period rotation offset as seen in prop224 section [TIME-PERIODS] */ +#define HS_TIME_PERIOD_ROTATION_OFFSET (12 * 60) /* minutes */ + +int hs_check_service_private_dir(const char *username, const char *path, + unsigned int dir_group_readable, + unsigned int create); + void rend_data_free(rend_data_t *data); rend_data_t *rend_data_dup(const rend_data_t *data); rend_data_t *rend_data_client_create(const char *onion_address, @@ -39,5 +69,18 @@ const char *rend_data_get_desc_id(const rend_data_t *rend_data, const uint8_t *rend_data_get_pk_digest(const rend_data_t *rend_data, size_t *len_out); +uint64_t hs_get_next_time_period_num(time_t now); + +#ifdef HS_COMMON_PRIVATE + +#ifdef TOR_UNIT_TESTS + +STATIC uint64_t get_time_period_length(void); +STATIC uint64_t get_time_period_num(time_t now); + +#endif /* TOR_UNIT_TESTS */ + +#endif /* HS_COMMON_PRIVATE */ + #endif /* TOR_HS_COMMON_H */ diff --git a/src/or/hs_descriptor.c b/src/or/hs_descriptor.c index f16a2fdc14..0480f63308 100644 --- a/src/or/hs_descriptor.c +++ b/src/or/hs_descriptor.c @@ -1,9 +1,55 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** * \file hs_descriptor.c * \brief Handle hidden service descriptor encoding/decoding. + * + * \details + * Here is a graphical depiction of an HS descriptor and its layers: + * + * +------------------------------------------------------+ + * |DESCRIPTOR HEADER: | + * | hs-descriptor 3 | + * | descriptor-lifetime 180 | + * | ... | + * | superencrypted | + * |+---------------------------------------------------+ | + * ||SUPERENCRYPTED LAYER (aka OUTER ENCRYPTED LAYER): | | + * || desc-auth-type x25519 | | + * || desc-auth-ephemeral-key | | + * || auth-client | | + * || auth-client | | + * || ... | | + * || encrypted | | + * ||+-------------------------------------------------+| | + * |||ENCRYPTED LAYER (aka INNER ENCRYPTED LAYER): || | + * ||| create2-formats || | + * ||| intro-auth-required || | + * ||| introduction-point || | + * ||| introduction-point || | + * ||| ... || | + * ||+-------------------------------------------------+| | + * |+---------------------------------------------------+ | + * +------------------------------------------------------+ + * + * The DESCRIPTOR HEADER section is completely unencrypted and contains generic + * descriptor metadata. + * + * The SUPERENCRYPTED LAYER section is the first layer of encryption, and it's + * encrypted using the blinded public key of the hidden service to protect + * against entities who don't know its onion address. The clients of the hidden + * service know its onion address and blinded public key, whereas third-parties + * (like HSDirs) don't know it (except if it's a public hidden service). + * + * The ENCRYPTED LAYER section is the second layer of encryption, and it's + * encrypted using the client authorization key material (if those exist). When + * client authorization is enabled, this second layer of encryption protects + * the descriptor content from unauthorized entities. If client authorization + * is disabled, this second layer of encryption does not provide any extra + * security but is still present. The plaintext of this layer contains all the + * information required to connect to the hidden service like its list of + * introduction points. **/ /* For unit tests.*/ @@ -23,11 +69,12 @@ #define str_desc_cert "descriptor-signing-key-cert" #define str_rev_counter "revision-counter" #define str_superencrypted "superencrypted" +#define str_encrypted "encrypted" #define str_signature "signature" #define str_lifetime "descriptor-lifetime" /* Constant string value for the encrypted part of the descriptor. */ #define str_create2_formats "create2-formats" -#define str_auth_required "authentication-required" +#define str_intro_auth_required "intro-auth-required" #define str_single_onion "single-onion-service" #define str_intro_point "introduction-point" #define str_ip_auth_key "auth-key" @@ -36,16 +83,20 @@ #define str_intro_point_start "\n" str_intro_point " " /* Constant string value for the construction to encrypt the encrypted data * section. */ -#define str_enc_hsdir_data "hsdir-superencrypted-data" +#define str_enc_const_superencryption "hsdir-superencrypted-data" +#define str_enc_const_encryption "hsdir-encrypted-data" /* Prefix required to compute/verify HS desc signatures */ #define str_desc_sig_prefix "Tor onion service descriptor sig v3" +#define str_desc_auth_type "desc-auth-type" +#define str_desc_auth_key "desc-auth-ephemeral-key" +#define str_desc_auth_client "auth-client" +#define str_encrypted "encrypted" /* Authentication supported types. */ static const struct { hs_desc_auth_type_t type; const char *identifier; -} auth_types[] = { - { HS_DESC_AUTH_PASSWORD, "password" }, +} intro_auth_types[] = { { HS_DESC_AUTH_ED25519, "ed25519" }, /* Indicate end of array. */ { 0, NULL } @@ -62,10 +113,19 @@ static token_rule_t hs_desc_v3_token_table[] = { END_OF_TABLE }; +/* Descriptor ruleset for the superencrypted section. */ +static token_rule_t hs_desc_superencrypted_v3_token_table[] = { + T1_START(str_desc_auth_type, R3_DESC_AUTH_TYPE, GE(1), NO_OBJ), + T1(str_desc_auth_key, R3_DESC_AUTH_KEY, GE(1), NO_OBJ), + T1N(str_desc_auth_client, R3_DESC_AUTH_CLIENT, GE(3), NO_OBJ), + T1(str_encrypted, R3_ENCRYPTED, NO_ARGS, NEED_OBJ), + END_OF_TABLE +}; + /* Descriptor ruleset for the encrypted section. */ static token_rule_t hs_desc_encrypted_v3_token_table[] = { T1_START(str_create2_formats, R3_CREATE2_FORMATS, CONCAT_ARGS, NO_OBJ), - T01(str_auth_required, R3_AUTHENTICATION_REQUIRED, ARGS, NO_OBJ), + T01(str_intro_auth_required, R3_INTRO_AUTH_REQUIRED, ARGS, NO_OBJ), T01(str_single_onion, R3_SINGLE_ONION_SERVICE, ARGS, NO_OBJ), END_OF_TABLE }; @@ -107,8 +167,8 @@ desc_plaintext_data_free_contents(hs_desc_plaintext_data_t *desc) return; } - if (desc->encrypted_blob) { - tor_free(desc->encrypted_blob); + if (desc->superencrypted_blob) { + tor_free(desc->superencrypted_blob); } tor_cert_free(desc->signing_key_cert); @@ -123,9 +183,9 @@ desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc) return; } - if (desc->auth_types) { - SMARTLIST_FOREACH(desc->auth_types, char *, a, tor_free(a)); - smartlist_free(desc->auth_types); + if (desc->intro_auth_types) { + SMARTLIST_FOREACH(desc->intro_auth_types, char *, a, tor_free(a)); + smartlist_free(desc->intro_auth_types); } if (desc->intro_points) { SMARTLIST_FOREACH(desc->intro_points, hs_desc_intro_point_t *, ip, @@ -135,6 +195,135 @@ desc_encrypted_data_free_contents(hs_desc_encrypted_data_t *desc) memwipe(desc, 0, sizeof(*desc)); } +/* Using a key, salt and encrypted payload, build a MAC and put it in mac_out. + * We use SHA3-256 for the MAC computation. + * This function can't fail. */ +static void +build_mac(const uint8_t *mac_key, size_t mac_key_len, + const uint8_t *salt, size_t salt_len, + const uint8_t *encrypted, size_t encrypted_len, + uint8_t *mac_out, size_t mac_len) +{ + crypto_digest_t *digest; + + const uint64_t mac_len_netorder = tor_htonll(mac_key_len); + const uint64_t salt_len_netorder = tor_htonll(salt_len); + + tor_assert(mac_key); + tor_assert(salt); + tor_assert(encrypted); + tor_assert(mac_out); + + digest = crypto_digest256_new(DIGEST_SHA3_256); + /* As specified in section 2.5 of proposal 224, first add the mac key + * then add the salt first and then the encrypted section. */ + + crypto_digest_add_bytes(digest, (const char *) &mac_len_netorder, 8); + crypto_digest_add_bytes(digest, (const char *) mac_key, mac_key_len); + crypto_digest_add_bytes(digest, (const char *) &salt_len_netorder, 8); + crypto_digest_add_bytes(digest, (const char *) salt, salt_len); + crypto_digest_add_bytes(digest, (const char *) encrypted, encrypted_len); + crypto_digest_get_digest(digest, (char *) mac_out, mac_len); + crypto_digest_free(digest); +} + +/* Using a given decriptor object, build the secret input needed for the + * KDF and put it in the dst pointer which is an already allocated buffer + * of size dstlen. */ +static void +build_secret_input(const hs_descriptor_t *desc, uint8_t *dst, size_t dstlen) +{ + size_t offset = 0; + + tor_assert(desc); + tor_assert(dst); + tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN <= dstlen); + + /* XXX use the destination length as the memcpy length */ + /* Copy blinded public key. */ + memcpy(dst, desc->plaintext_data.blinded_pubkey.pubkey, + sizeof(desc->plaintext_data.blinded_pubkey.pubkey)); + offset += sizeof(desc->plaintext_data.blinded_pubkey.pubkey); + /* Copy subcredential. */ + memcpy(dst + offset, desc->subcredential, sizeof(desc->subcredential)); + offset += sizeof(desc->subcredential); + /* Copy revision counter value. */ + set_uint64(dst + offset, tor_ntohll(desc->plaintext_data.revision_counter)); + offset += sizeof(uint64_t); + tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN == offset); +} + +/* Do the KDF construction and put the resulting data in key_out which is of + * key_out_len length. It uses SHAKE-256 as specified in the spec. */ +static void +build_kdf_key(const hs_descriptor_t *desc, + const uint8_t *salt, size_t salt_len, + uint8_t *key_out, size_t key_out_len, + int is_superencrypted_layer) +{ + uint8_t secret_input[HS_DESC_ENCRYPTED_SECRET_INPUT_LEN]; + crypto_xof_t *xof; + + tor_assert(desc); + tor_assert(salt); + tor_assert(key_out); + + /* Build the secret input for the KDF computation. */ + build_secret_input(desc, secret_input, sizeof(secret_input)); + + xof = crypto_xof_new(); + /* Feed our KDF. [SHAKE it like a polaroid picture --Yawning]. */ + crypto_xof_add_bytes(xof, secret_input, sizeof(secret_input)); + crypto_xof_add_bytes(xof, salt, salt_len); + + /* Feed in the right string constant based on the desc layer */ + if (is_superencrypted_layer) { + crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_const_superencryption, + strlen(str_enc_const_superencryption)); + } else { + crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_const_encryption, + strlen(str_enc_const_encryption)); + } + + /* Eat from our KDF. */ + crypto_xof_squeeze_bytes(xof, key_out, key_out_len); + crypto_xof_free(xof); + memwipe(secret_input, 0, sizeof(secret_input)); +} + +/* Using the given descriptor and salt, run it through our KDF function and + * then extract a secret key in key_out, the IV in iv_out and MAC in mac_out. + * This function can't fail. */ +static void +build_secret_key_iv_mac(const hs_descriptor_t *desc, + const uint8_t *salt, size_t salt_len, + uint8_t *key_out, size_t key_len, + uint8_t *iv_out, size_t iv_len, + uint8_t *mac_out, size_t mac_len, + int is_superencrypted_layer) +{ + size_t offset = 0; + uint8_t kdf_key[HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN]; + + tor_assert(desc); + tor_assert(salt); + tor_assert(key_out); + tor_assert(iv_out); + tor_assert(mac_out); + + build_kdf_key(desc, salt, salt_len, kdf_key, sizeof(kdf_key), + is_superencrypted_layer); + /* Copy the bytes we need for both the secret key and IV. */ + memcpy(key_out, kdf_key, key_len); + offset += key_len; + memcpy(iv_out, kdf_key + offset, iv_len); + offset += iv_len; + memcpy(mac_out, kdf_key + offset, mac_len); + /* Extra precaution to make sure we are not out of bound. */ + tor_assert((offset + mac_len) == sizeof(kdf_key)); + memwipe(kdf_key, 0, sizeof(kdf_key)); +} + /* === ENCODING === */ /* Encode the given link specifier objects into a newly allocated string. @@ -363,142 +552,23 @@ encode_intro_point(const ed25519_public_key_t *sig_key, return encoded_ip; } -/* Using a given decriptor object, build the secret input needed for the - * KDF and put it in the dst pointer which is an already allocated buffer - * of size dstlen. */ -static void -build_secret_input(const hs_descriptor_t *desc, uint8_t *dst, size_t dstlen) -{ - size_t offset = 0; - - tor_assert(desc); - tor_assert(dst); - tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN <= dstlen); - - /* XXX use the destination length as the memcpy length */ - /* Copy blinded public key. */ - memcpy(dst, desc->plaintext_data.blinded_pubkey.pubkey, - sizeof(desc->plaintext_data.blinded_pubkey.pubkey)); - offset += sizeof(desc->plaintext_data.blinded_pubkey.pubkey); - /* Copy subcredential. */ - memcpy(dst + offset, desc->subcredential, sizeof(desc->subcredential)); - offset += sizeof(desc->subcredential); - /* Copy revision counter value. */ - set_uint64(dst + offset, tor_ntohll(desc->plaintext_data.revision_counter)); - offset += sizeof(uint64_t); - tor_assert(HS_DESC_ENCRYPTED_SECRET_INPUT_LEN == offset); -} - -/* Do the KDF construction and put the resulting data in key_out which is of - * key_out_len length. It uses SHAKE-256 as specified in the spec. */ -static void -build_kdf_key(const hs_descriptor_t *desc, - const uint8_t *salt, size_t salt_len, - uint8_t *key_out, size_t key_out_len) -{ - uint8_t secret_input[HS_DESC_ENCRYPTED_SECRET_INPUT_LEN]; - crypto_xof_t *xof; - - tor_assert(desc); - tor_assert(salt); - tor_assert(key_out); - - /* Build the secret input for the KDF computation. */ - build_secret_input(desc, secret_input, sizeof(secret_input)); - - xof = crypto_xof_new(); - /* Feed our KDF. [SHAKE it like a polaroid picture --Yawning]. */ - crypto_xof_add_bytes(xof, secret_input, sizeof(secret_input)); - crypto_xof_add_bytes(xof, salt, salt_len); - crypto_xof_add_bytes(xof, (const uint8_t *) str_enc_hsdir_data, - strlen(str_enc_hsdir_data)); - /* Eat from our KDF. */ - crypto_xof_squeeze_bytes(xof, key_out, key_out_len); - crypto_xof_free(xof); - memwipe(secret_input, 0, sizeof(secret_input)); -} - -/* Using the given descriptor and salt, run it through our KDF function and - * then extract a secret key in key_out, the IV in iv_out and MAC in mac_out. - * This function can't fail. */ -static void -build_secret_key_iv_mac(const hs_descriptor_t *desc, - const uint8_t *salt, size_t salt_len, - uint8_t *key_out, size_t key_len, - uint8_t *iv_out, size_t iv_len, - uint8_t *mac_out, size_t mac_len) -{ - size_t offset = 0; - uint8_t kdf_key[HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN]; - - tor_assert(desc); - tor_assert(salt); - tor_assert(key_out); - tor_assert(iv_out); - tor_assert(mac_out); - - build_kdf_key(desc, salt, salt_len, kdf_key, sizeof(kdf_key)); - /* Copy the bytes we need for both the secret key and IV. */ - memcpy(key_out, kdf_key, key_len); - offset += key_len; - memcpy(iv_out, kdf_key + offset, iv_len); - offset += iv_len; - memcpy(mac_out, kdf_key + offset, mac_len); - /* Extra precaution to make sure we are not out of bound. */ - tor_assert((offset + mac_len) == sizeof(kdf_key)); - memwipe(kdf_key, 0, sizeof(kdf_key)); -} - -/* Using a key, salt and encrypted payload, build a MAC and put it in mac_out. - * We use SHA3-256 for the MAC computation. - * This function can't fail. */ -static void -build_mac(const uint8_t *mac_key, size_t mac_key_len, - const uint8_t *salt, size_t salt_len, - const uint8_t *encrypted, size_t encrypted_len, - uint8_t *mac_out, size_t mac_len) -{ - crypto_digest_t *digest; - - const uint64_t mac_len_netorder = tor_htonll(mac_key_len); - const uint64_t salt_len_netorder = tor_htonll(salt_len); - - tor_assert(mac_key); - tor_assert(salt); - tor_assert(encrypted); - tor_assert(mac_out); - - digest = crypto_digest256_new(DIGEST_SHA3_256); - /* As specified in section 2.5 of proposal 224, first add the mac key - * then add the salt first and then the encrypted section. */ - - crypto_digest_add_bytes(digest, (const char *) &mac_len_netorder, 8); - crypto_digest_add_bytes(digest, (const char *) mac_key, mac_key_len); - crypto_digest_add_bytes(digest, (const char *) &salt_len_netorder, 8); - crypto_digest_add_bytes(digest, (const char *) salt, salt_len); - crypto_digest_add_bytes(digest, (const char *) encrypted, encrypted_len); - crypto_digest_get_digest(digest, (char *) mac_out, mac_len); - crypto_digest_free(digest); -} - /* Given a source length, return the new size including padding for the * plaintext encryption. */ static size_t compute_padded_plaintext_length(size_t plaintext_len) { size_t plaintext_padded_len; + const int padding_block_length = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE; /* Make sure we won't overflow. */ - tor_assert(plaintext_len <= - (SIZE_T_CEILING - HS_DESC_PLAINTEXT_PADDING_MULTIPLE)); - - /* Get the extra length we need to add. For example, if srclen is 234 bytes, - * this will expand to (2 * 128) == 256 thus an extra 22 bytes. */ - plaintext_padded_len = CEIL_DIV(plaintext_len, - HS_DESC_PLAINTEXT_PADDING_MULTIPLE) * - HS_DESC_PLAINTEXT_PADDING_MULTIPLE; + tor_assert(plaintext_len <= (SIZE_T_CEILING - padding_block_length)); + + /* Get the extra length we need to add. For example, if srclen is 10200 + * bytes, this will expand to (2 * 10k) == 20k thus an extra 9800 bytes. */ + plaintext_padded_len = CEIL_DIV(plaintext_len, padding_block_length) * + padding_block_length; /* Can never be extra careful. Make sure we are _really_ padded. */ - tor_assert(!(plaintext_padded_len % HS_DESC_PLAINTEXT_PADDING_MULTIPLE)); + tor_assert(!(plaintext_padded_len % padding_block_length)); return plaintext_padded_len; } @@ -530,7 +600,8 @@ build_plaintext_padding(const char *plaintext, size_t plaintext_len, * data. Return size of the encrypted data buffer. */ static size_t build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext, - size_t plaintext_len, uint8_t **encrypted_out) + size_t plaintext_len, uint8_t **encrypted_out, + int is_superencrypted_layer) { size_t encrypted_len; uint8_t *padded_plaintext, *encrypted; @@ -541,15 +612,21 @@ build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext, tor_assert(plaintext); tor_assert(encrypted_out); + /* If we are encrypting the middle layer of the descriptor, we need to first + pad the plaintext */ + if (is_superencrypted_layer) { + encrypted_len = build_plaintext_padding(plaintext, plaintext_len, + &padded_plaintext); + /* Extra precautions that we have a valid padding length. */ + tor_assert(!(encrypted_len % HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE)); + } else { /* No padding required for inner layers */ + padded_plaintext = tor_memdup(plaintext, plaintext_len); + encrypted_len = plaintext_len; + } + /* This creates a cipher for AES. It can't fail. */ cipher = crypto_cipher_new_with_iv_and_bits(key, iv, HS_DESC_ENCRYPTED_BIT_SIZE); - /* This can't fail. */ - encrypted_len = build_plaintext_padding(plaintext, plaintext_len, - &padded_plaintext); - /* Extra precautions that we have a valie padding length. */ - tor_assert(encrypted_len <= HS_DESC_PADDED_PLAINTEXT_MAX_LEN); - tor_assert(!(encrypted_len % HS_DESC_PLAINTEXT_PADDING_MULTIPLE)); /* We use a stream cipher so the encrypted length will be the same as the * plaintext padded length. */ encrypted = tor_malloc_zero(encrypted_len); @@ -563,12 +640,13 @@ build_encrypted(const uint8_t *key, const uint8_t *iv, const char *plaintext, return encrypted_len; } -/* Encrypt the given plaintext buffer and using the descriptor to get the +/* Encrypt the given <b>plaintext</b> buffer using <b>desc</b> to get the * keys. Set encrypted_out with the encrypted data and return the length of - * it. */ + * it. <b>is_superencrypted_layer</b> is set if this is the outer encrypted + * layer of the descriptor. */ static size_t encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext, - char **encrypted_out) + char **encrypted_out, int is_superencrypted_layer) { char *final_blob; size_t encrypted_len, final_blob_len, offset = 0; @@ -589,11 +667,13 @@ encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext, build_secret_key_iv_mac(desc, salt, sizeof(salt), secret_key, sizeof(secret_key), secret_iv, sizeof(secret_iv), - mac_key, sizeof(mac_key)); + mac_key, sizeof(mac_key), + is_superencrypted_layer); /* Build the encrypted part that is do the actual encryption. */ encrypted_len = build_encrypted(secret_key, secret_iv, plaintext, - strlen(plaintext), &encrypted); + strlen(plaintext), &encrypted, + is_superencrypted_layer); memwipe(secret_key, 0, sizeof(secret_key)); memwipe(secret_iv, 0, sizeof(secret_iv)); /* This construction is specified in section 2.5 of proposal 224. */ @@ -625,20 +705,89 @@ encrypt_descriptor_data(const hs_descriptor_t *desc, const char *plaintext, return final_blob_len; } -/* Take care of encoding the encrypted data section and then encrypting it - * with the descriptor's key. A newly allocated NUL terminated string pointer - * containing the encrypted encoded blob is put in encrypted_blob_out. Return - * 0 on success else a negative value. */ -static int -encode_encrypted_data(const hs_descriptor_t *desc, - char **encrypted_blob_out) +/* Create and return a string containing a fake client-auth entry. It's the + * responsibility of the caller to free the returned string. This function will + * never fail. */ +static char * +get_fake_auth_client_str(void) { - int ret = -1; - char *encoded_str, *encrypted_blob; - smartlist_t *lines = smartlist_new(); + char *auth_client_str = NULL; + /* We are gonna fill these arrays with fake base64 data. They are all double + * the size of their binary representation to fit the base64 overhead. */ + char client_id_b64[8*2]; + char iv_b64[16*2]; + char encrypted_cookie_b64[16*2]; + int retval; + + /* This is a macro to fill a field with random data and then base64 it. */ +#define FILL_WITH_FAKE_DATA_AND_BASE64(field) STMT_BEGIN \ + crypto_rand((char *)field, sizeof(field)); \ + retval = base64_encode_nopad(field##_b64, sizeof(field##_b64), \ + field, sizeof(field)); \ + tor_assert(retval > 0); \ + STMT_END + + { /* Get those fakes! */ + uint8_t client_id[8]; /* fake client-id */ + uint8_t iv[16]; /* fake IV (initialization vector) */ + uint8_t encrypted_cookie[16]; /* fake encrypted cookie */ + + FILL_WITH_FAKE_DATA_AND_BASE64(client_id); + FILL_WITH_FAKE_DATA_AND_BASE64(iv); + FILL_WITH_FAKE_DATA_AND_BASE64(encrypted_cookie); + } + + /* Build the final string */ + tor_asprintf(&auth_client_str, "%s %s %s %s", str_desc_auth_client, + client_id_b64, iv_b64, encrypted_cookie_b64); + +#undef FILL_WITH_FAKE_DATA_AND_BASE64 + + return auth_client_str; +} - tor_assert(desc); - tor_assert(encrypted_blob_out); +/** How many lines of "client-auth" we want in our descriptors; fake or not. */ +#define CLIENT_AUTH_ENTRIES_BLOCK_SIZE 16 + +/** Create the "client-auth" part of the descriptor and return a + * newly-allocated string with it. It's the responsibility of the caller to + * free the returned string. */ +static char * +get_fake_auth_client_lines(void) +{ + /* XXX: Client authorization is still not implemented, so all this function + does is make fake clients */ + int i = 0; + smartlist_t *auth_client_lines = smartlist_new(); + char *auth_client_lines_str = NULL; + + /* Make a line for each fake client */ + const int num_fake_clients = CLIENT_AUTH_ENTRIES_BLOCK_SIZE; + for (i = 0; i < num_fake_clients; i++) { + char *auth_client_str = get_fake_auth_client_str(); + tor_assert(auth_client_str); + smartlist_add(auth_client_lines, auth_client_str); + } + + /* Join all lines together to form final string */ + auth_client_lines_str = smartlist_join_strings(auth_client_lines, + "\n", 1, NULL); + /* Cleanup the mess */ + SMARTLIST_FOREACH(auth_client_lines, char *, a, tor_free(a)); + smartlist_free(auth_client_lines); + + return auth_client_lines_str; +} + +/* Create the inner layer of the descriptor (which includes the intro points, + * etc.). Return a newly-allocated string with the layer plaintext, or NULL if + * an error occured. It's the responsibility of the caller to free the returned + * string. */ +static char * +get_inner_encrypted_layer_plaintext(const hs_descriptor_t *desc) +{ + char *encoded_str = NULL; + smartlist_t *lines = smartlist_new(); /* Build the start of the section prior to the introduction points. */ { @@ -649,12 +798,12 @@ encode_encrypted_data(const hs_descriptor_t *desc, smartlist_add_asprintf(lines, "%s %d\n", str_create2_formats, ONION_HANDSHAKE_TYPE_NTOR); - if (desc->encrypted_data.auth_types && - smartlist_len(desc->encrypted_data.auth_types)) { + if (desc->encrypted_data.intro_auth_types && + smartlist_len(desc->encrypted_data.intro_auth_types)) { /* Put the authentication-required line. */ - char *buf = smartlist_join_strings(desc->encrypted_data.auth_types, " ", - 0, NULL); - smartlist_add_asprintf(lines, "%s %s\n", str_auth_required, buf); + char *buf = smartlist_join_strings(desc->encrypted_data.intro_auth_types, + " ", 0, NULL); + smartlist_add_asprintf(lines, "%s %s\n", str_intro_auth_required, buf); tor_free(buf); } @@ -679,31 +828,159 @@ encode_encrypted_data(const hs_descriptor_t *desc, * then encrypt it. */ encoded_str = smartlist_join_strings(lines, "", 0, NULL); - /* Encrypt the section into an encrypted blob that we'll base64 encode - * before returning it. */ + err: + SMARTLIST_FOREACH(lines, char *, l, tor_free(l)); + smartlist_free(lines); + + return encoded_str; +} + +/* Create the middle layer of the descriptor, which includes the client auth + * data and the encrypted inner layer (provided as a base64 string at + * <b>layer2_b64_ciphertext</b>). Return a newly-allocated string with the + * layer plaintext, or NULL if an error occured. It's the responsibility of the + * caller to free the returned string. */ +static char * +get_outer_encrypted_layer_plaintext(const hs_descriptor_t *desc, + const char *layer2_b64_ciphertext) +{ + char *layer1_str = NULL; + smartlist_t *lines = smartlist_new(); + + /* XXX: Disclaimer: This function generates only _fake_ client auth + * data. Real client auth is not yet implemented, but client auth data MUST + * always be present in descriptors. In the future this function will be + * refactored to use real client auth data if they exist (#20700). */ + (void) *desc; + + /* Specify auth type */ + smartlist_add_asprintf(lines, "%s %s\n", str_desc_auth_type, "x25519"); + + { /* Create fake ephemeral x25519 key */ + char fake_key_base64[CURVE25519_BASE64_PADDED_LEN + 1]; + curve25519_keypair_t fake_x25519_keypair; + if (curve25519_keypair_generate(&fake_x25519_keypair, 0) < 0) { + goto done; + } + if (curve25519_public_to_base64(fake_key_base64, + &fake_x25519_keypair.pubkey) < 0) { + goto done; + } + smartlist_add_asprintf(lines, "%s %s\n", + str_desc_auth_key, fake_key_base64); + /* No need to memwipe any of these fake keys. They will go unused. */ + } + + { /* Create fake auth-client lines. */ + char *auth_client_lines = get_fake_auth_client_lines(); + tor_assert(auth_client_lines); + smartlist_add(lines, auth_client_lines); + } + + /* create encrypted section */ { - char *enc_b64; - ssize_t enc_b64_len, ret_len, enc_len; + smartlist_add_asprintf(lines, + "%s\n" + "-----BEGIN MESSAGE-----\n" + "%s" + "-----END MESSAGE-----", + str_encrypted, layer2_b64_ciphertext); + } - enc_len = encrypt_descriptor_data(desc, encoded_str, &encrypted_blob); - tor_free(encoded_str); - /* Get the encoded size plus a NUL terminating byte. */ - enc_b64_len = base64_encode_size(enc_len, BASE64_ENCODE_MULTILINE) + 1; - enc_b64 = tor_malloc_zero(enc_b64_len); - /* Base64 the encrypted blob before returning it. */ - ret_len = base64_encode(enc_b64, enc_b64_len, encrypted_blob, enc_len, - BASE64_ENCODE_MULTILINE); - /* Return length doesn't count the NUL byte. */ - tor_assert(ret_len == (enc_b64_len - 1)); - tor_free(encrypted_blob); - *encrypted_blob_out = enc_b64; + layer1_str = smartlist_join_strings(lines, "", 0, NULL); + + done: + SMARTLIST_FOREACH(lines, char *, a, tor_free(a)); + smartlist_free(lines); + + return layer1_str; +} + +/* Encrypt <b>encoded_str</b> into an encrypted blob and then base64 it before + * returning it. <b>desc</b> is provided to derive the encryption + * keys. <b>is_superencrypted_layer</b> is set if <b>encoded_str</b> is the + * middle (superencrypted) layer of the descriptor. It's the responsibility of + * the caller to free the returned string. */ +static char * +encrypt_desc_data_and_base64(const hs_descriptor_t *desc, + const char *encoded_str, + int is_superencrypted_layer) +{ + char *enc_b64; + ssize_t enc_b64_len, ret_len, enc_len; + char *encrypted_blob = NULL; + + enc_len = encrypt_descriptor_data(desc, encoded_str, &encrypted_blob, + is_superencrypted_layer); + /* Get the encoded size plus a NUL terminating byte. */ + enc_b64_len = base64_encode_size(enc_len, BASE64_ENCODE_MULTILINE) + 1; + enc_b64 = tor_malloc_zero(enc_b64_len); + /* Base64 the encrypted blob before returning it. */ + ret_len = base64_encode(enc_b64, enc_b64_len, encrypted_blob, enc_len, + BASE64_ENCODE_MULTILINE); + /* Return length doesn't count the NUL byte. */ + tor_assert(ret_len == (enc_b64_len - 1)); + tor_free(encrypted_blob); + + return enc_b64; +} + +/* Generate and encode the superencrypted portion of <b>desc</b>. This also + * involves generating the encrypted portion of the descriptor, and performing + * the superencryption. A newly allocated NUL-terminated string pointer + * containing the encrypted encoded blob is put in encrypted_blob_out. Return 0 + * on success else a negative value. */ +static int +encode_superencrypted_data(const hs_descriptor_t *desc, + char **encrypted_blob_out) +{ + int ret = -1; + char *layer2_str = NULL; + char *layer2_b64_ciphertext = NULL; + char *layer1_str = NULL; + char *layer1_b64_ciphertext = NULL; + + tor_assert(desc); + tor_assert(encrypted_blob_out); + + /* Func logic: We first create the inner layer of the descriptor (layer2). + * We then encrypt it and use it to create the middle layer of the descriptor + * (layer1). Finally we superencrypt the middle layer and return it to our + * caller. */ + + /* Create inner descriptor layer */ + layer2_str = get_inner_encrypted_layer_plaintext(desc); + if (!layer2_str) { + goto err; + } + + /* Encrypt and b64 the inner layer */ + layer2_b64_ciphertext = encrypt_desc_data_and_base64(desc, layer2_str, 0); + if (!layer2_b64_ciphertext) { + goto err; + } + + /* Now create middle descriptor layer given the inner layer */ + layer1_str = get_outer_encrypted_layer_plaintext(desc,layer2_b64_ciphertext); + if (!layer1_str) { + goto err; } + + /* Encrypt and base64 the middle layer */ + layer1_b64_ciphertext = encrypt_desc_data_and_base64(desc, layer1_str, 1); + if (!layer1_b64_ciphertext) { + goto err; + } + /* Success! */ ret = 0; err: - SMARTLIST_FOREACH(lines, char *, l, tor_free(l)); - smartlist_free(lines); + tor_free(layer1_str); + tor_free(layer2_str); + tor_free(layer2_b64_ciphertext); + + *encrypted_blob_out = layer1_b64_ciphertext; return ret; } @@ -756,7 +1033,7 @@ desc_encode_v3(const hs_descriptor_t *desc, /* Build the superencrypted data section. */ { char *enc_b64_blob=NULL; - if (encode_encrypted_data(desc, &enc_b64_blob) < 0) { + if (encode_superencrypted_data(desc, &enc_b64_blob) < 0) { goto err; } smartlist_add_asprintf(lines, @@ -796,6 +1073,13 @@ desc_encode_v3(const hs_descriptor_t *desc, encoded_str = smartlist_join_strings(lines, "\n", 1, NULL); *encoded_out = encoded_str; + if (strlen(encoded_str) >= hs_cache_get_max_descriptor_size()) { + log_warn(LD_GENERAL, "We just made an HS descriptor that's too big (%d)." + "Failing.", (int)strlen(encoded_str)); + tor_free(encoded_str); + goto err; + } + /* XXX: Trigger a control port event. */ /* Success! */ @@ -894,14 +1178,14 @@ decode_auth_type(hs_desc_encrypted_data_t *desc, const char *list) tor_assert(desc); tor_assert(list); - desc->auth_types = smartlist_new(); - smartlist_split_string(desc->auth_types, list, " ", 0, 0); + desc->intro_auth_types = smartlist_new(); + smartlist_split_string(desc->intro_auth_types, list, " ", 0, 0); /* Validate the types that we at least know about one. */ - SMARTLIST_FOREACH_BEGIN(desc->auth_types, const char *, auth) { - for (int idx = 0; auth_types[idx].identifier; idx++) { - if (!strncmp(auth, auth_types[idx].identifier, - strlen(auth_types[idx].identifier))) { + SMARTLIST_FOREACH_BEGIN(desc->intro_auth_types, const char *, auth) { + for (int idx = 0; intro_auth_types[idx].identifier; idx++) { + if (!strncmp(auth, intro_auth_types[idx].identifier, + strlen(intro_auth_types[idx].identifier))) { match = 1; break; } @@ -1023,41 +1307,31 @@ cert_parse_and_validate(tor_cert_t **cert_out, const char *data, STATIC int encrypted_data_length_is_valid(size_t len) { - /* Check for the minimum length possible. */ - if (len < HS_DESC_ENCRYPTED_MIN_LEN) { + /* Make sure there is enough data for the salt and the mac. The equality is + there to ensure that there is at least one byte of encrypted data. */ + if (len <= HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN) { log_warn(LD_REND, "Length of descriptor's encrypted data is too small. " "Got %lu but minimum value is %d", - (unsigned long)len, HS_DESC_ENCRYPTED_MIN_LEN); + (unsigned long)len, HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN); goto err; } - /* Encrypted data has the salt and MAC concatenated to it so remove those - * from the validation calculation. */ - len -= HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN; - - /* Check that it's aligned on the block size of the crypto algorithm. */ - if (len % HS_DESC_PLAINTEXT_PADDING_MULTIPLE) { - log_warn(LD_REND, "Length of descriptor's encrypted data is invalid. " - "Got %lu which is not a multiple of %d.", - (unsigned long) len, HS_DESC_PLAINTEXT_PADDING_MULTIPLE); - goto err; - } - - /* XXX: Check maximum size. Will strongly depends on the maximum intro point - * allowed we decide on and probably if they will all have to use the legacy - * key which is bigger than the ed25519 key. */ - return 1; err: return 0; } -/* Decrypt the encrypted section of the descriptor using the given descriptor - * object desc. A newly allocated NUL terminated string is put in - * decrypted_out. Return the length of decrypted_out on success else 0 is - * returned and decrypted_out is set to NULL. */ +/** Decrypt an encrypted descriptor layer at <b>encrypted_blob</b> of size + * <b>encrypted_blob_size</b>. Use the descriptor object <b>desc</b> to + * generate the right decryption keys; set <b>decrypted_out</b> to the + * plaintext. If <b>is_superencrypted_layer</b> is set, this is the outter + * encrypted layer of the descriptor. */ static size_t -desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) +decrypt_desc_layer(const hs_descriptor_t *desc, + const uint8_t *encrypted_blob, + size_t encrypted_blob_size, + int is_superencrypted_layer, + char **decrypted_out) { uint8_t *decrypted = NULL; uint8_t secret_key[HS_DESC_ENCRYPTED_KEY_LEN], secret_iv[CIPHER_IV_LEN]; @@ -1067,41 +1341,33 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) tor_assert(decrypted_out); tor_assert(desc); - tor_assert(desc->plaintext_data.encrypted_blob); + tor_assert(encrypted_blob); - /* Construction is as follow: SALT | ENCRYPTED_DATA | MAC */ - if (!encrypted_data_length_is_valid( - desc->plaintext_data.encrypted_blob_size)) { + /* Construction is as follow: SALT | ENCRYPTED_DATA | MAC . + * Make sure we have enough space for all these things. */ + if (!encrypted_data_length_is_valid(encrypted_blob_size)) { goto err; } /* Start of the blob thus the salt. */ - salt = desc->plaintext_data.encrypted_blob; + salt = encrypted_blob; + /* Next is the encrypted data. */ - encrypted = desc->plaintext_data.encrypted_blob + - HS_DESC_ENCRYPTED_SALT_LEN; - encrypted_len = desc->plaintext_data.encrypted_blob_size - + encrypted = encrypted_blob + HS_DESC_ENCRYPTED_SALT_LEN; + encrypted_len = encrypted_blob_size - (HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN); + tor_assert(encrypted_len > 0); /* guaranteed by the check above */ - /* At the very end is the MAC. Make sure it's of the right size. */ - { - desc_mac = encrypted + encrypted_len; - size_t desc_mac_size = desc->plaintext_data.encrypted_blob_size - - (desc_mac - desc->plaintext_data.encrypted_blob); - if (desc_mac_size != DIGEST256_LEN) { - log_warn(LD_REND, "Service descriptor MAC length of encrypted data " - "is invalid (%lu, expected %u)", - (unsigned long) desc_mac_size, DIGEST256_LEN); - goto err; - } - } + /* And last comes the MAC. */ + desc_mac = encrypted_blob + encrypted_blob_size - DIGEST256_LEN; /* KDF construction resulting in a key from which the secret key, IV and MAC * key are extracted which is what we need for the decryption. */ build_secret_key_iv_mac(desc, salt, HS_DESC_ENCRYPTED_SALT_LEN, secret_key, sizeof(secret_key), secret_iv, sizeof(secret_iv), - mac_key, sizeof(mac_key)); + mac_key, sizeof(mac_key), + is_superencrypted_layer); /* Build MAC. */ build_mac(mac_key, sizeof(mac_key), salt, HS_DESC_ENCRYPTED_SALT_LEN, @@ -1131,7 +1397,7 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) } { - /* Adjust length to remove NULL padding bytes */ + /* Adjust length to remove NUL padding bytes */ uint8_t *end = memchr(decrypted, 0, encrypted_len); result_len = encrypted_len; if (end) { @@ -1157,6 +1423,164 @@ desc_decrypt_data_v3(const hs_descriptor_t *desc, char **decrypted_out) return result_len; } +/* Basic validation that the superencrypted client auth portion of the + * descriptor is well-formed and recognized. Return True if so, otherwise + * return False. */ +static int +superencrypted_auth_data_is_valid(smartlist_t *tokens) +{ + /* XXX: This is just basic validation for now. When we implement client auth, + we can refactor this function so that it actually parses and saves the + data. */ + + { /* verify desc auth type */ + const directory_token_t *tok; + tok = find_by_keyword(tokens, R3_DESC_AUTH_TYPE); + tor_assert(tok->n_args >= 1); + if (strcmp(tok->args[0], "x25519")) { + log_warn(LD_DIR, "Unrecognized desc auth type"); + return 0; + } + } + + { /* verify desc auth key */ + const directory_token_t *tok; + curve25519_public_key_t k; + tok = find_by_keyword(tokens, R3_DESC_AUTH_KEY); + tor_assert(tok->n_args >= 1); + if (curve25519_public_from_base64(&k, tok->args[0]) < 0) { + log_warn(LD_DIR, "Bogus desc auth key in HS desc"); + return 0; + } + } + + /* verify desc auth client items */ + SMARTLIST_FOREACH_BEGIN(tokens, const directory_token_t *, tok) { + if (tok->tp == R3_DESC_AUTH_CLIENT) { + tor_assert(tok->n_args >= 3); + } + } SMARTLIST_FOREACH_END(tok); + + return 1; +} + +/* Parse <b>message</b>, the plaintext of the superencrypted portion of an HS + * descriptor. Set <b>encrypted_out</b> to the encrypted blob, and return its + * size */ +STATIC size_t +decode_superencrypted(const char *message, size_t message_len, + uint8_t **encrypted_out) +{ + int retval = 0; + memarea_t *area = NULL; + smartlist_t *tokens = NULL; + + area = memarea_new(); + tokens = smartlist_new(); + if (tokenize_string(area, message, message + message_len, tokens, + hs_desc_superencrypted_v3_token_table, 0) < 0) { + log_warn(LD_REND, "Superencrypted portion is not parseable"); + goto err; + } + + /* Do some rudimentary validation of the authentication data */ + if (!superencrypted_auth_data_is_valid(tokens)) { + log_warn(LD_REND, "Invalid auth data"); + goto err; + } + + /* Extract the encrypted data section. */ + { + const directory_token_t *tok; + tok = find_by_keyword(tokens, R3_ENCRYPTED); + tor_assert(tok->object_body); + if (strcmp(tok->object_type, "MESSAGE") != 0) { + log_warn(LD_REND, "Desc superencrypted data section is invalid"); + goto err; + } + /* Make sure the length of the encrypted blob is valid. */ + if (!encrypted_data_length_is_valid(tok->object_size)) { + goto err; + } + + /* Copy the encrypted blob to the descriptor object so we can handle it + * latter if needed. */ + tor_assert(tok->object_size <= INT_MAX); + *encrypted_out = tor_memdup(tok->object_body, tok->object_size); + retval = (int) tok->object_size; + } + + err: + SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); + smartlist_free(tokens); + if (area) { + memarea_drop_all(area); + } + + return retval; +} + +/* Decrypt both the superencrypted and the encrypted section of the descriptor + * using the given descriptor object <b>desc</b>. A newly allocated NUL + * terminated string is put in decrypted_out which contains the inner encrypted + * layer of the descriptor. Return the length of decrypted_out on success else + * 0 is returned and decrypted_out is set to NULL. */ +static size_t +desc_decrypt_all(const hs_descriptor_t *desc, char **decrypted_out) +{ + size_t decrypted_len = 0; + size_t encrypted_len = 0; + size_t superencrypted_len = 0; + char *superencrypted_plaintext = NULL; + uint8_t *encrypted_blob = NULL; + + /** Function logic: This function takes us from the descriptor header to the + * inner encrypted layer, by decrypting and decoding the middle descriptor + * layer. In the end we return the contents of the inner encrypted layer to + * our caller. */ + + /* 1. Decrypt middle layer of descriptor */ + superencrypted_len = decrypt_desc_layer(desc, + desc->plaintext_data.superencrypted_blob, + desc->plaintext_data.superencrypted_blob_size, + 1, + &superencrypted_plaintext); + if (!superencrypted_len) { + log_warn(LD_REND, "Decrypting superencrypted desc failed."); + goto err; + } + tor_assert(superencrypted_plaintext); + + /* 2. Parse "superencrypted" */ + encrypted_len = decode_superencrypted(superencrypted_plaintext, + superencrypted_len, + &encrypted_blob); + if (!encrypted_len) { + log_warn(LD_REND, "Decrypting encrypted desc failed."); + goto err; + } + tor_assert(encrypted_blob); + + /* 3. Decrypt "encrypted" and set decrypted_out */ + char *decrypted_desc; + decrypted_len = decrypt_desc_layer(desc, + encrypted_blob, encrypted_len, + 0, &decrypted_desc); + if (!decrypted_len) { + log_warn(LD_REND, "Decrypting encrypted desc failed."); + goto err; + } + tor_assert(decrypted_desc); + + *decrypted_out = decrypted_desc; + + err: + tor_free(superencrypted_plaintext); + tor_free(encrypted_blob); + + return decrypted_len; +} + /* Given the start of a section and the end of it, decode a single * introduction point from that section. Return a newly allocated introduction * point object containing the decoded data. Return NULL if the section can't @@ -1289,7 +1713,9 @@ decode_introduction_point(const hs_descriptor_t *desc, const char *start) tor_cert_free(cross_cert); SMARTLIST_FOREACH(tokens, directory_token_t *, t, token_clear(t)); smartlist_free(tokens); - memarea_drop_all(area); + if (area) { + memarea_drop_all(area); + } return ip; } @@ -1508,8 +1934,8 @@ desc_decode_plaintext_v3(smartlist_t *tokens, /* Copy the encrypted blob to the descriptor object so we can handle it * latter if needed. */ - desc->encrypted_blob = tor_memdup(tok->object_body, tok->object_size); - desc->encrypted_blob_size = tok->object_size; + desc->superencrypted_blob = tor_memdup(tok->object_body, tok->object_size); + desc->superencrypted_blob_size = tok->object_size; /* Extract signature and verify it. */ tok = find_by_keyword(tokens, R3_SIGNATURE); @@ -1543,10 +1969,9 @@ desc_decode_encrypted_v3(const hs_descriptor_t *desc, tor_assert(desc); tor_assert(desc_encrypted_out); - /* Decrypt the encrypted data that is located in the plaintext section in - * the descriptor as a blob of bytes. The following functions will use the - * keys found in the same section. */ - message_len = desc_decrypt_data_v3(desc, &message); + /* Decrypt the superencrypted data that is located in the plaintext section + * in the descriptor as a blob of bytes. */ + message_len = desc_decrypt_all(desc, &message); if (!message_len) { log_warn(LD_REND, "Service descriptor decryption failed."); goto err; @@ -1572,7 +1997,7 @@ desc_decode_encrypted_v3(const hs_descriptor_t *desc, } /* Authentication type. It's optional but only once. */ - tok = find_opt_by_keyword(tokens, R3_AUTHENTICATION_REQUIRED); + tok = find_opt_by_keyword(tokens, R3_INTRO_AUTH_REQUIRED); if (tok) { if (!decode_auth_type(desc_encrypted_out, tok->args[0])) { log_warn(LD_REND, "Service descriptor authentication type has " @@ -1654,7 +2079,7 @@ hs_desc_decode_encrypted(const hs_descriptor_t *desc, /* Calling this function without an encrypted blob to parse is a code flow * error. The plaintext parsing should never succeed in the first place * without an encrypted section. */ - tor_assert(desc->plaintext_data.encrypted_blob); + tor_assert(desc->plaintext_data.superencrypted_blob); /* Let's make sure we have a supported version as well. By correctly parsing * the plaintext, this should not fail. */ if (BUG(!hs_desc_is_supported_version(version))) { @@ -1906,6 +2331,6 @@ hs_desc_plaintext_obj_size(const hs_desc_plaintext_data_t *data) { tor_assert(data); return (sizeof(*data) + sizeof(*data->signing_key_cert) + - data->encrypted_blob_size); + data->superencrypted_blob_size); } diff --git a/src/or/hs_descriptor.h b/src/or/hs_descriptor.h index b520d24471..b7d512c06b 100644 --- a/src/or/hs_descriptor.h +++ b/src/or/hs_descriptor.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -41,24 +41,11 @@ * the secret IV and MAC key length which is the length of H() output. */ #define HS_DESC_ENCRYPTED_KDF_OUTPUT_LEN \ CIPHER256_KEY_LEN + CIPHER_IV_LEN + DIGEST256_LEN -/* We need to pad the plaintext version of the encrypted data section before - * encryption and it has to be a multiple of this value. */ -#define HS_DESC_PLAINTEXT_PADDING_MULTIPLE 128 -/* XXX: Let's make sure this makes sense as an upper limit for the padded - * plaintext section. Then we should enforce it as now only an assert will be - * triggered if we are above it. */ -/* Once padded, this is the maximum length in bytes for the plaintext. */ -#define HS_DESC_PADDED_PLAINTEXT_MAX_LEN 8192 -/* Minimum length in bytes of the encrypted portion of the descriptor. */ -#define HS_DESC_ENCRYPTED_MIN_LEN \ - HS_DESC_ENCRYPTED_SALT_LEN + \ - HS_DESC_PLAINTEXT_PADDING_MULTIPLE + DIGEST256_LEN +/* Pad plaintext of superencrypted data section before encryption so that its + * length is a multiple of this value. */ +#define HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE 10000 /* Maximum length in bytes of a full hidden service descriptor. */ #define HS_DESC_MAX_LEN 50000 /* 50kb max size */ -/* The minimum amount of fields a descriptor should contain. The parsing of - * the fields are version specific so the only required field, as a generic - * view of a descriptor, is 1 that is the version field. */ -#define HS_DESC_PLAINTEXT_MIN_FIELDS 1 /* Key length for the descriptor symmetric encryption. As specified in the * protocol, we use AES-256 for the encrypted section of the descriptor. The @@ -68,8 +55,7 @@ /* Type of authentication in the descriptor. */ typedef enum { - HS_DESC_AUTH_PASSWORD = 1, - HS_DESC_AUTH_ED25519 = 2, + HS_DESC_AUTH_ED25519 = 1 } hs_desc_auth_type_t; /* Type of encryption key in the descriptor. */ @@ -132,7 +118,7 @@ typedef struct hs_desc_encrypted_data_t { /* A list of authentication types that a client must at least support one * in order to contact the service. Contains NULL terminated strings. */ - smartlist_t *auth_types; + smartlist_t *intro_auth_types; /* Is this descriptor a single onion service? */ unsigned int single_onion_service : 1; @@ -167,11 +153,11 @@ typedef struct hs_desc_plaintext_data_t { * has changed. Spec specifies this as a 8 bytes positive integer. */ uint64_t revision_counter; - /* Decoding only: The base64-decoded encrypted blob from the descriptor */ - uint8_t *encrypted_blob; + /* Decoding only: The b64-decoded superencrypted blob from the descriptor */ + uint8_t *superencrypted_blob; - /* Decoding only: Size of the encrypted_blob */ - size_t encrypted_blob_size; + /* Decoding only: Size of the superencrypted_blob */ + size_t superencrypted_blob_size; } hs_desc_plaintext_data_t; /* Service descriptor in its decoded form. */ @@ -242,6 +228,8 @@ STATIC int desc_sig_is_valid(const char *b64_sig, const ed25519_public_key_t *signing_pubkey, const char *encoded_desc, size_t encoded_len); STATIC void desc_intro_point_free(hs_desc_intro_point_t *ip); +STATIC size_t decode_superencrypted(const char *message, size_t message_len, + uint8_t **encrypted_out); #endif /* HS_DESCRIPTOR_PRIVATE */ #endif /* TOR_HS_DESCRIPTOR_H */ diff --git a/src/or/hs_intropoint.c b/src/or/hs_intropoint.c index db4ba7982a..2abbfcd6c3 100644 --- a/src/or/hs_intropoint.c +++ b/src/or/hs_intropoint.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -43,16 +43,16 @@ get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, switch (cell_type) { case RELAY_COMMAND_ESTABLISH_INTRO: { - const hs_cell_establish_intro_t *c_cell = cell; - key_array = hs_cell_establish_intro_getconstarray_auth_key(c_cell); - auth_key_len = hs_cell_establish_intro_getlen_auth_key(c_cell); + const trn_cell_establish_intro_t *c_cell = cell; + key_array = trn_cell_establish_intro_getconstarray_auth_key(c_cell); + auth_key_len = trn_cell_establish_intro_getlen_auth_key(c_cell); break; } case RELAY_COMMAND_INTRODUCE1: { - const hs_cell_introduce1_t *c_cell = cell; - key_array = hs_cell_introduce1_getconstarray_auth_key(cell); - auth_key_len = hs_cell_introduce1_getlen_auth_key(c_cell); + const trn_cell_introduce1_t *c_cell = cell; + key_array = trn_cell_introduce1_getconstarray_auth_key(cell); + auth_key_len = trn_cell_introduce1_getlen_auth_key(c_cell); break; } default: @@ -68,22 +68,22 @@ get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, /** We received an ESTABLISH_INTRO <b>cell</b>. Verify its signature and MAC, * given <b>circuit_key_material</b>. Return 0 on success else -1 on error. */ STATIC int -verify_establish_intro_cell(const hs_cell_establish_intro_t *cell, +verify_establish_intro_cell(const trn_cell_establish_intro_t *cell, const uint8_t *circuit_key_material, size_t circuit_key_material_len) { /* We only reach this function if the first byte of the cell is 0x02 which - * means that auth_key_type is AUTH_KEY_ED25519, hence this check should + * means that auth_key_type is of ed25519 type, hence this check should * always pass. See hs_intro_received_establish_intro(). */ - if (BUG(cell->auth_key_type != AUTH_KEY_ED25519)) { + if (BUG(cell->auth_key_type != HS_INTRO_AUTH_KEY_TYPE_ED25519)) { return -1; } /* Make sure the auth key length is of the right size for this type. For * EXTRA safety, we check both the size of the array and the length which * must be the same. Safety first!*/ - if (hs_cell_establish_intro_getlen_auth_key(cell) != ED25519_PUBKEY_LEN || - hs_cell_establish_intro_get_auth_key_len(cell) != ED25519_PUBKEY_LEN) { + if (trn_cell_establish_intro_getlen_auth_key(cell) != ED25519_PUBKEY_LEN || + trn_cell_establish_intro_get_auth_key_len(cell) != ED25519_PUBKEY_LEN) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "ESTABLISH_INTRO auth key length is invalid"); return -1; @@ -94,13 +94,14 @@ verify_establish_intro_cell(const hs_cell_establish_intro_t *cell, /* Verify the sig */ { ed25519_signature_t sig_struct; - const uint8_t *sig_array = hs_cell_establish_intro_getconstarray_sig(cell); + const uint8_t *sig_array = + trn_cell_establish_intro_getconstarray_sig(cell); /* Make sure the signature length is of the right size. For EXTRA safety, * we check both the size of the array and the length which must be the * same. Safety first!*/ - if (hs_cell_establish_intro_getlen_sig(cell) != sizeof(sig_struct.sig) || - hs_cell_establish_intro_get_sig_len(cell) != sizeof(sig_struct.sig)) { + if (trn_cell_establish_intro_getlen_sig(cell) != sizeof(sig_struct.sig) || + trn_cell_establish_intro_get_sig_len(cell) != sizeof(sig_struct.sig)) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "ESTABLISH_INTRO sig len is invalid"); return -1; @@ -147,21 +148,21 @@ hs_intro_send_intro_established_cell,(or_circuit_t *circ)) int ret; uint8_t *encoded_cell = NULL; ssize_t encoded_len, result_len; - hs_cell_intro_established_t *cell; - cell_extension_t *ext; + trn_cell_intro_established_t *cell; + trn_cell_extension_t *ext; tor_assert(circ); /* Build the cell payload. */ - cell = hs_cell_intro_established_new(); - ext = cell_extension_new(); - cell_extension_set_num(ext, 0); - hs_cell_intro_established_set_extensions(cell, ext); + cell = trn_cell_intro_established_new(); + ext = trn_cell_extension_new(); + trn_cell_extension_set_num(ext, 0); + trn_cell_intro_established_set_extensions(cell, ext); /* Encode the cell to binary format. */ - encoded_len = hs_cell_intro_established_encoded_len(cell); + encoded_len = trn_cell_intro_established_encoded_len(cell); tor_assert(encoded_len > 0); encoded_cell = tor_malloc_zero(encoded_len); - result_len = hs_cell_intro_established_encode(encoded_cell, encoded_len, + result_len = trn_cell_intro_established_encode(encoded_cell, encoded_len, cell); tor_assert(encoded_len == result_len); @@ -170,7 +171,7 @@ hs_intro_send_intro_established_cell,(or_circuit_t *circ)) (char *) encoded_cell, encoded_len, NULL); /* On failure, the above function will close the circuit. */ - hs_cell_intro_established_free(cell); + trn_cell_intro_established_free(cell); tor_free(encoded_cell); return ret; } @@ -180,7 +181,7 @@ hs_intro_send_intro_established_cell,(or_circuit_t *circ)) * establish an intro point. */ static int handle_verified_establish_intro_cell(or_circuit_t *circ, - const hs_cell_establish_intro_t *parsed_cell) + const trn_cell_establish_intro_t *parsed_cell) { /* Get the auth key of this intro point */ ed25519_public_key_t auth_key; @@ -195,7 +196,7 @@ handle_verified_establish_intro_cell(or_circuit_t *circ, } /* Associate intro point auth key with this circuit. */ - hs_circuitmap_register_intro_circ_v3(circ, &auth_key); + hs_circuitmap_register_intro_circ_v3_relay_side(circ, &auth_key); /* Repurpose this circuit into an intro circuit. */ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT); @@ -210,7 +211,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request, size_t request_len) { int cell_ok, retval = -1; - hs_cell_establish_intro_t *parsed_cell = NULL; + trn_cell_establish_intro_t *parsed_cell = NULL; tor_assert(circ); tor_assert(request); @@ -224,7 +225,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request, } /* Parse the cell */ - ssize_t parsing_result = hs_cell_establish_intro_parse(&parsed_cell, + ssize_t parsing_result = trn_cell_establish_intro_parse(&parsed_cell, request, request_len); if (parsing_result < 0) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, @@ -259,7 +260,7 @@ handle_establish_intro(or_circuit_t *circ, const uint8_t *request, circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL); done: - hs_cell_establish_intro_free(parsed_cell); + trn_cell_establish_intro_free(parsed_cell); return retval; } @@ -339,28 +340,28 @@ send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status) int ret = -1; uint8_t *encoded_cell = NULL; ssize_t encoded_len, result_len; - hs_cell_introduce_ack_t *cell; - cell_extension_t *ext; + trn_cell_introduce_ack_t *cell; + trn_cell_extension_t *ext; tor_assert(circ); /* Setup the INTRODUCE_ACK cell. We have no extensions so the N_EXTENSIONS * field is set to 0 by default with a new object. */ - cell = hs_cell_introduce_ack_new(); - ret = hs_cell_introduce_ack_set_status(cell, status); + cell = trn_cell_introduce_ack_new(); + ret = trn_cell_introduce_ack_set_status(cell, status); /* We have no cell extensions in an INTRODUCE_ACK cell. */ - ext = cell_extension_new(); - cell_extension_set_num(ext, 0); - hs_cell_introduce_ack_set_extensions(cell, ext); + ext = trn_cell_extension_new(); + trn_cell_extension_set_num(ext, 0); + trn_cell_introduce_ack_set_extensions(cell, ext); /* A wrong status is a very bad code flow error as this value is controlled * by the code in this file and not an external input. This means we use a * code that is not known by the trunnel ABI. */ tor_assert(ret == 0); /* Encode the payload. We should never fail to get the encoded length. */ - encoded_len = hs_cell_introduce_ack_encoded_len(cell); + encoded_len = trn_cell_introduce_ack_encoded_len(cell); tor_assert(encoded_len > 0); encoded_cell = tor_malloc_zero(encoded_len); - result_len = hs_cell_introduce_ack_encode(encoded_cell, encoded_len, cell); + result_len = trn_cell_introduce_ack_encode(encoded_cell, encoded_len, cell); tor_assert(encoded_len == result_len); ret = relay_send_command_from_edge(CONTROL_CELL_ID, TO_CIRCUIT(circ), @@ -368,7 +369,7 @@ send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status) (char *) encoded_cell, encoded_len, NULL); /* On failure, the above function will close the circuit. */ - hs_cell_introduce_ack_free(cell); + trn_cell_introduce_ack_free(cell); tor_free(encoded_cell); return ret; } @@ -376,7 +377,7 @@ send_introduce_ack_cell(or_circuit_t *circ, hs_intro_ack_status_t status) /* Validate a parsed INTRODUCE1 <b>cell</b>. Return 0 if valid or else a * negative value for an invalid cell that should be NACKed. */ STATIC int -validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell) +validate_introduce1_parsed_cell(const trn_cell_introduce1_t *cell) { size_t legacy_key_id_len; const uint8_t *legacy_key_id; @@ -385,29 +386,29 @@ validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell) /* This code path SHOULD NEVER be reached if the cell is a legacy type so * safety net here. The legacy ID must be zeroes in this case. */ - legacy_key_id_len = hs_cell_introduce1_getlen_legacy_key_id(cell); - legacy_key_id = hs_cell_introduce1_getconstarray_legacy_key_id(cell); + legacy_key_id_len = trn_cell_introduce1_getlen_legacy_key_id(cell); + legacy_key_id = trn_cell_introduce1_getconstarray_legacy_key_id(cell); if (BUG(!tor_mem_is_zero((char *) legacy_key_id, legacy_key_id_len))) { goto invalid; } /* The auth key of an INTRODUCE1 should be of type ed25519 thus leading to a * known fixed length as well. */ - if (hs_cell_introduce1_get_auth_key_type(cell) != + if (trn_cell_introduce1_get_auth_key_type(cell) != HS_INTRO_AUTH_KEY_TYPE_ED25519) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting invalid INTRODUCE1 cell auth key type. " "Responding with NACK."); goto invalid; } - if (hs_cell_introduce1_get_auth_key_len(cell) != ED25519_PUBKEY_LEN || - hs_cell_introduce1_getlen_auth_key(cell) != ED25519_PUBKEY_LEN) { + if (trn_cell_introduce1_get_auth_key_len(cell) != ED25519_PUBKEY_LEN || + trn_cell_introduce1_getlen_auth_key(cell) != ED25519_PUBKEY_LEN) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting invalid INTRODUCE1 cell auth key length. " "Responding with NACK."); goto invalid; } - if (hs_cell_introduce1_getlen_encrypted(cell) == 0) { + if (trn_cell_introduce1_getlen_encrypted(cell) == 0) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting invalid INTRODUCE1 cell encrypted length. " "Responding with NACK."); @@ -430,7 +431,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, { int ret = -1; or_circuit_t *service_circ; - hs_cell_introduce1_t *parsed_cell; + trn_cell_introduce1_t *parsed_cell; hs_intro_ack_status_t status = HS_INTRO_ACK_STATUS_SUCCESS; tor_assert(client_circ); @@ -439,7 +440,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, /* Parse cell. Note that we can only parse the non encrypted section for * which we'll use the authentication key to find the service introduction * circuit and relay the cell on it. */ - ssize_t cell_size = hs_cell_introduce1_parse(&parsed_cell, request, + ssize_t cell_size = trn_cell_introduce1_parse(&parsed_cell, request, request_len); if (cell_size < 0) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, @@ -461,7 +462,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, { ed25519_public_key_t auth_key; get_auth_key_from_cell(&auth_key, RELAY_COMMAND_INTRODUCE1, parsed_cell); - service_circ = hs_circuitmap_get_intro_circ_v3(&auth_key); + service_circ = hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); if (service_circ == NULL) { char b64_key[ED25519_BASE64_LEN + 1]; ed25519_public_to_base64(b64_key, &auth_key); @@ -505,7 +506,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, circuit_mark_for_close(TO_CIRCUIT(client_circ), END_CIRC_REASON_INTERNAL); } done: - hs_cell_introduce1_free(parsed_cell); + trn_cell_introduce1_free(parsed_cell); return ret; } diff --git a/src/or/hs_intropoint.h b/src/or/hs_intropoint.h index e6024a858f..163ed810e7 100644 --- a/src/or/hs_intropoint.h +++ b/src/or/hs_intropoint.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -41,7 +41,7 @@ int hs_intro_circuit_is_suitable_for_establish_intro(const or_circuit_t *circ); #include "hs/cell_introduce1.h" STATIC int -verify_establish_intro_cell(const hs_cell_establish_intro_t *out, +verify_establish_intro_cell(const trn_cell_establish_intro_t *out, const uint8_t *circuit_key_material, size_t circuit_key_material_len); @@ -52,7 +52,7 @@ get_auth_key_from_cell(ed25519_public_key_t *auth_key_out, STATIC int introduce1_cell_is_legacy(const uint8_t *request); STATIC int handle_introduce1(or_circuit_t *client_circ, const uint8_t *request, size_t request_len); -STATIC int validate_introduce1_parsed_cell(const hs_cell_introduce1_t *cell); +STATIC int validate_introduce1_parsed_cell(const trn_cell_introduce1_t *cell); STATIC int circuit_is_suitable_for_introduce1(const or_circuit_t *circ); #endif /* HS_INTROPOINT_PRIVATE */ diff --git a/src/or/hs_ntor.c b/src/or/hs_ntor.c new file mode 100644 index 0000000000..119899817e --- /dev/null +++ b/src/or/hs_ntor.c @@ -0,0 +1,626 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** \file hs_ntor.c + * \brief Implements the ntor variant used in Tor hidden services. + * + * \details + * This module handles the variant of the ntor handshake that is documented in + * section [NTOR-WITH-EXTRA-DATA] of rend-spec-ng.txt . + * + * The functions in this file provide an API that should be used when sending + * or receiving INTRODUCE1/RENDEZVOUS1 cells to generate the various key + * material required to create and handle those cells. + * + * In the case of INTRODUCE1 it provides encryption and MAC keys to + * encode/decode the encrypted blob (see hs_ntor_intro_cell_keys_t). The + * relevant pub functions are hs_ntor_{client,service}_get_introduce1_keys(). + * + * In the case of RENDEZVOUS1 it calculates the MAC required to authenticate + * the cell, and also provides the key seed that is used to derive the crypto + * material for rendezvous encryption (see hs_ntor_rend_cell_keys_t). The + * relevant pub functions are hs_ntor_{client,service}_get_rendezvous1_keys(). + * It also provides a function (hs_ntor_circuit_key_expansion()) that does the + * rendezvous key expansion to setup end-to-end rend circuit keys. + */ + +#include "or.h" +#include "hs_ntor.h" + +/* String constants used by the ntor HS protocol */ +#define PROTOID "tor-hs-ntor-curve25519-sha3-256-1" +#define PROTOID_LEN (sizeof(PROTOID) - 1) +#define SERVER_STR "Server" +#define SERVER_STR_LEN (sizeof(SERVER_STR) - 1) + +/* Protocol-specific tweaks to our crypto inputs */ +#define T_HSENC PROTOID ":hs_key_extract" +#define T_HSENC_LEN (sizeof(T_HSENC) - 1) +#define T_HSVERIFY PROTOID ":hs_verify" +#define T_HSMAC PROTOID ":hs_mac" +#define M_HSEXPAND PROTOID ":hs_key_expand" +#define M_HSEXPAND_LEN (sizeof(M_HSEXPAND) - 1) + +/************************* Helper functions: *******************************/ + +/** Helper macro: copy <b>len</b> bytes from <b>inp</b> to <b>ptr</b> and + *advance <b>ptr</b> by the number of bytes copied. Stolen from onion_ntor.c */ +#define APPEND(ptr, inp, len) \ + STMT_BEGIN { \ + memcpy(ptr, (inp), (len)); \ + ptr += len; \ + } STMT_END + +/* Length of EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID */ +#define REND_SECRET_HS_INPUT_LEN (CURVE25519_OUTPUT_LEN * 2 + \ + ED25519_PUBKEY_LEN + CURVE25519_PUBKEY_LEN * 3 + PROTOID_LEN) +/* Length of auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" */ +#define REND_AUTH_INPUT_LEN (DIGEST256_LEN + ED25519_PUBKEY_LEN + \ + CURVE25519_PUBKEY_LEN * 3 + PROTOID_LEN + SERVER_STR_LEN) + +/** Helper function: Compute the last part of the HS ntor handshake which + * derives key material necessary to create and handle RENDEZVOUS1 + * cells. Function used by both client and service. The actual calculations is + * as follows: + * + * NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) + * verify = MAC(rend_secret_hs_input, t_hsverify) + * auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + * auth_input_mac = MAC(auth_input, t_hsmac) + * + * where in the above, AUTH_KEY is <b>intro_auth_pubkey</b>, B is + * <b>intro_enc_pubkey</b>, Y is <b>service_ephemeral_rend_pubkey</b>, and X + * is <b>client_ephemeral_enc_pubkey</b>. The provided + * <b>rend_secret_hs_input</b> is of size REND_SECRET_HS_INPUT_LEN. + * + * The final results of NTOR_KEY_SEED and auth_input_mac are placed in + * <b>hs_ntor_rend_cell_keys_out</b>. Return 0 if everything went fine. */ +static int +get_rendezvous1_key_material(const uint8_t *rend_secret_hs_input, + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_public_key_t *service_ephemeral_rend_pubkey, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out) +{ + int bad = 0; + uint8_t ntor_key_seed[DIGEST256_LEN]; + uint8_t ntor_verify[DIGEST256_LEN]; + uint8_t rend_auth_input[REND_AUTH_INPUT_LEN]; + uint8_t rend_cell_auth[DIGEST256_LEN]; + uint8_t *ptr; + + /* Let's build NTOR_KEY_SEED */ + crypto_mac_sha3_256(ntor_key_seed, sizeof(ntor_key_seed), + rend_secret_hs_input, REND_SECRET_HS_INPUT_LEN, + (const uint8_t *)T_HSENC, strlen(T_HSENC)); + bad |= safe_mem_is_zero(ntor_key_seed, DIGEST256_LEN); + + /* Let's build ntor_verify */ + crypto_mac_sha3_256(ntor_verify, sizeof(ntor_verify), + rend_secret_hs_input, REND_SECRET_HS_INPUT_LEN, + (const uint8_t *)T_HSVERIFY, strlen(T_HSVERIFY)); + bad |= safe_mem_is_zero(ntor_verify, DIGEST256_LEN); + + /* Let's build auth_input: */ + ptr = rend_auth_input; + /* Append ntor_verify */ + APPEND(ptr, ntor_verify, sizeof(ntor_verify)); + /* Append AUTH_KEY */ + APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN); + /* Append B */ + APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append Y */ + APPEND(ptr, + service_ephemeral_rend_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append X */ + APPEND(ptr, + client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append PROTOID */ + APPEND(ptr, PROTOID, strlen(PROTOID)); + /* Append "Server" */ + APPEND(ptr, SERVER_STR, strlen(SERVER_STR)); + tor_assert(ptr == rend_auth_input + sizeof(rend_auth_input)); + + /* Let's build auth_input_mac that goes in RENDEZVOUS1 cell */ + crypto_mac_sha3_256(rend_cell_auth, sizeof(rend_cell_auth), + rend_auth_input, sizeof(rend_auth_input), + (const uint8_t *)T_HSMAC, strlen(T_HSMAC)); + bad |= safe_mem_is_zero(ntor_verify, DIGEST256_LEN); + + { /* Get the computed RENDEZVOUS1 material! */ + memcpy(&hs_ntor_rend_cell_keys_out->rend_cell_auth_mac, + rend_cell_auth, DIGEST256_LEN); + memcpy(&hs_ntor_rend_cell_keys_out->ntor_key_seed, + ntor_key_seed, DIGEST256_LEN); + } + + memwipe(rend_cell_auth, 0, sizeof(rend_cell_auth)); + memwipe(rend_auth_input, 0, sizeof(rend_auth_input)); + memwipe(ntor_key_seed, 0, sizeof(ntor_key_seed)); + + return bad; +} + +/** Length of secret_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID */ +#define INTRO_SECRET_HS_INPUT_LEN (CURVE25519_OUTPUT_LEN +ED25519_PUBKEY_LEN +\ + CURVE25519_PUBKEY_LEN + CURVE25519_PUBKEY_LEN + PROTOID_LEN) +/* Length of info = m_hsexpand | subcredential */ +#define INFO_BLOB_LEN (M_HSEXPAND_LEN + DIGEST256_LEN) +/* Length of KDF input = intro_secret_hs_input | t_hsenc | info */ +#define KDF_INPUT_LEN (INTRO_SECRET_HS_INPUT_LEN + T_HSENC_LEN + INFO_BLOB_LEN) + +/** Helper function: Compute the part of the HS ntor handshake that generates + * key material for creating and handling INTRODUCE1 cells. Function used + * by both client and service. Specifically, calculate the following: + * + * info = m_hsexpand | subcredential + * hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + * ENC_KEY = hs_keys[0:S_KEY_LEN] + * MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] + * + * where intro_secret_hs_input is <b>secret_input</b> (of size + * INTRO_SECRET_HS_INPUT_LEN), and <b>subcredential</b> is of size + * DIGEST256_LEN. + * + * If everything went well, fill <b>hs_ntor_intro_cell_keys_out</b> with the + * necessary key material, and return 0. */ +static void +get_introduce1_key_material(const uint8_t *secret_input, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out) +{ + uint8_t keystream[CIPHER256_KEY_LEN + DIGEST256_LEN]; + uint8_t info_blob[INFO_BLOB_LEN]; + uint8_t kdf_input[KDF_INPUT_LEN]; + crypto_xof_t *xof; + uint8_t *ptr; + + /* Let's build info */ + ptr = info_blob; + APPEND(ptr, M_HSEXPAND, strlen(M_HSEXPAND)); + APPEND(ptr, subcredential, DIGEST256_LEN); + tor_assert(ptr == info_blob + sizeof(info_blob)); + + /* Let's build the input to the KDF */ + ptr = kdf_input; + APPEND(ptr, secret_input, INTRO_SECRET_HS_INPUT_LEN); + APPEND(ptr, T_HSENC, strlen(T_HSENC)); + APPEND(ptr, info_blob, sizeof(info_blob)); + tor_assert(ptr == kdf_input + sizeof(kdf_input)); + + /* Now we need to run kdf_input over SHAKE-256 */ + xof = crypto_xof_new(); + crypto_xof_add_bytes(xof, kdf_input, sizeof(kdf_input)); + crypto_xof_squeeze_bytes(xof, keystream, sizeof(keystream)) ; + crypto_xof_free(xof); + + { /* Get the keys */ + memcpy(&hs_ntor_intro_cell_keys_out->enc_key, keystream,CIPHER256_KEY_LEN); + memcpy(&hs_ntor_intro_cell_keys_out->mac_key, + keystream+CIPHER256_KEY_LEN, DIGEST256_LEN); + } + + memwipe(keystream, 0, sizeof(keystream)); + memwipe(kdf_input, 0, sizeof(kdf_input)); +} + +/** Helper function: Calculate the 'intro_secret_hs_input' element used by the + * HS ntor handshake and place it in <b>secret_input_out</b>. This function is + * used by both client and service code. + * + * For the client-side it looks like this: + * + * intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID + * + * whereas for the service-side it looks like this: + * + * intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID + * + * In this function, <b>dh_result</b> carries the EXP() result (and has size + * CURVE25519_OUTPUT_LEN) <b>intro_auth_pubkey</b> is AUTH_KEY, + * <b>client_ephemeral_enc_pubkey</b> is X, and <b>intro_enc_pubkey</b> is B. + */ +static void +get_intro_secret_hs_input(const uint8_t *dh_result, + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + uint8_t *secret_input_out) +{ + uint8_t *ptr; + + /* Append EXP() */ + ptr = secret_input_out; + APPEND(ptr, dh_result, CURVE25519_OUTPUT_LEN); + /* Append AUTH_KEY */ + APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN); + /* Append X */ + APPEND(ptr, client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append B */ + APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append PROTOID */ + APPEND(ptr, PROTOID, strlen(PROTOID)); + tor_assert(ptr == secret_input_out + INTRO_SECRET_HS_INPUT_LEN); +} + +/** Calculate the 'rend_secret_hs_input' element used by the HS ntor handshake + * and place it in <b>rend_secret_hs_input_out</b>. This function is used by + * both client and service code. + * + * The computation on the client side is: + * rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID + * whereas on the service side it is: + * rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID + * + * where: + * <b>dh_result1</b> and <b>dh_result2</b> carry the two EXP() results (of size + * CURVE25519_OUTPUT_LEN) + * <b>intro_auth_pubkey</b> is AUTH_KEY, + * <b>intro_enc_pubkey</b> is B, + * <b>client_ephemeral_enc_pubkey</b> is X, and + * <b>service_ephemeral_rend_pubkey</b> is Y. + */ +static void +get_rend_secret_hs_input(const uint8_t *dh_result1, const uint8_t *dh_result2, + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + const curve25519_public_key_t *service_ephemeral_rend_pubkey, + uint8_t *rend_secret_hs_input_out) +{ + uint8_t *ptr; + + ptr = rend_secret_hs_input_out; + /* Append the first EXP() */ + APPEND(ptr, dh_result1, CURVE25519_OUTPUT_LEN); + /* Append the other EXP() */ + APPEND(ptr, dh_result2, CURVE25519_OUTPUT_LEN); + /* Append AUTH_KEY */ + APPEND(ptr, intro_auth_pubkey->pubkey, ED25519_PUBKEY_LEN); + /* Append B */ + APPEND(ptr, intro_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append X */ + APPEND(ptr, + client_ephemeral_enc_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append Y */ + APPEND(ptr, + service_ephemeral_rend_pubkey->public_key, CURVE25519_PUBKEY_LEN); + /* Append PROTOID */ + APPEND(ptr, PROTOID, strlen(PROTOID)); + tor_assert(ptr == rend_secret_hs_input_out + REND_SECRET_HS_INPUT_LEN); +} + +/************************* Public functions: *******************************/ + +/* Public function: Do the appropriate ntor calculations and derive the keys + * needed to encrypt and authenticate INTRODUCE1 cells. Return 0 and place the + * final key material in <b>hs_ntor_intro_cell_keys_out</b> if everything went + * well, otherwise return -1; + * + * The relevant calculations are as follows: + * + * intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID + * info = m_hsexpand | subcredential + * hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + * ENC_KEY = hs_keys[0:S_KEY_LEN] + * MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] + * + * where: + * <b>intro_auth_pubkey</b> is AUTH_KEY (found in HS descriptor), + * <b>intro_enc_pubkey</b> is B (also found in HS descriptor), + * <b>client_ephemeral_enc_keypair</b> is freshly generated keypair (x,X) + * <b>subcredential</b> is the hidden service subcredential (of size + * DIGEST256_LEN). */ +int +hs_ntor_client_get_introduce1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_keypair_t *client_ephemeral_enc_keypair, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out) +{ + int bad = 0; + uint8_t secret_input[INTRO_SECRET_HS_INPUT_LEN]; + uint8_t dh_result[CURVE25519_OUTPUT_LEN]; + + tor_assert(intro_auth_pubkey); + tor_assert(intro_enc_pubkey); + tor_assert(client_ephemeral_enc_keypair); + tor_assert(subcredential); + tor_assert(hs_ntor_intro_cell_keys_out); + + /* Calculate EXP(B,x) */ + curve25519_handshake(dh_result, + &client_ephemeral_enc_keypair->seckey, + intro_enc_pubkey); + bad |= safe_mem_is_zero(dh_result, CURVE25519_OUTPUT_LEN); + + /* Get intro_secret_hs_input */ + get_intro_secret_hs_input(dh_result, intro_auth_pubkey, + &client_ephemeral_enc_keypair->pubkey, + intro_enc_pubkey, secret_input); + bad |= safe_mem_is_zero(secret_input, CURVE25519_OUTPUT_LEN); + + /* Get ENC_KEY and MAC_KEY! */ + get_introduce1_key_material(secret_input, subcredential, + hs_ntor_intro_cell_keys_out); + + /* Cleanup */ + memwipe(secret_input, 0, sizeof(secret_input)); + if (bad) { + memwipe(hs_ntor_intro_cell_keys_out, 0, sizeof(hs_ntor_intro_cell_keys_t)); + } + + return bad ? -1 : 0; +} + +/* Public function: Do the appropriate ntor calculations and derive the keys + * needed to verify RENDEZVOUS1 cells and encrypt further rendezvous + * traffic. Return 0 and place the final key material in + * <b>hs_ntor_rend_cell_keys_out</b> if everything went well, else return -1. + * + * The relevant calculations are as follows: + * + * rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID + * NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) + * verify = MAC(rend_secret_hs_input, t_hsverify) + * auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + * auth_input_mac = MAC(auth_input, t_hsmac) + * + * where: + * <b>intro_auth_pubkey</b> is AUTH_KEY (found in HS descriptor), + * <b>client_ephemeral_enc_keypair</b> is freshly generated keypair (x,X) + * <b>intro_enc_pubkey</b> is B (also found in HS descriptor), + * <b>service_ephemeral_rend_pubkey</b> is Y (SERVER_PK in RENDEZVOUS1 cell) */ +int +hs_ntor_client_get_rendezvous1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *client_ephemeral_enc_keypair, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_public_key_t *service_ephemeral_rend_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out) +{ + int bad = 0; + uint8_t rend_secret_hs_input[REND_SECRET_HS_INPUT_LEN]; + uint8_t dh_result1[CURVE25519_OUTPUT_LEN]; + uint8_t dh_result2[CURVE25519_OUTPUT_LEN]; + + tor_assert(intro_auth_pubkey); + tor_assert(client_ephemeral_enc_keypair); + tor_assert(intro_enc_pubkey); + tor_assert(service_ephemeral_rend_pubkey); + tor_assert(hs_ntor_rend_cell_keys_out); + + /* Compute EXP(Y, x) */ + curve25519_handshake(dh_result1, + &client_ephemeral_enc_keypair->seckey, + service_ephemeral_rend_pubkey); + bad |= safe_mem_is_zero(dh_result1, CURVE25519_OUTPUT_LEN); + + /* Compute EXP(B, x) */ + curve25519_handshake(dh_result2, + &client_ephemeral_enc_keypair->seckey, + intro_enc_pubkey); + bad |= safe_mem_is_zero(dh_result2, CURVE25519_OUTPUT_LEN); + + /* Get rend_secret_hs_input */ + get_rend_secret_hs_input(dh_result1, dh_result2, + intro_auth_pubkey, intro_enc_pubkey, + &client_ephemeral_enc_keypair->pubkey, + service_ephemeral_rend_pubkey, + rend_secret_hs_input); + + /* Get NTOR_KEY_SEED and the auth_input MAC */ + bad |= get_rendezvous1_key_material(rend_secret_hs_input, + intro_auth_pubkey, + intro_enc_pubkey, + service_ephemeral_rend_pubkey, + &client_ephemeral_enc_keypair->pubkey, + hs_ntor_rend_cell_keys_out); + + memwipe(rend_secret_hs_input, 0, sizeof(rend_secret_hs_input)); + if (bad) { + memwipe(hs_ntor_rend_cell_keys_out, 0, sizeof(hs_ntor_rend_cell_keys_t)); + } + + return bad ? -1 : 0; +} + +/* Public function: Do the appropriate ntor calculations and derive the keys + * needed to decrypt and verify INTRODUCE1 cells. Return 0 and place the final + * key material in <b>hs_ntor_intro_cell_keys_out</b> if everything went well, + * otherwise return -1; + * + * The relevant calculations are as follows: + * + * intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID + * info = m_hsexpand | subcredential + * hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + * HS_DEC_KEY = hs_keys[0:S_KEY_LEN] + * HS_MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] + * + * where: + * <b>intro_auth_pubkey</b> is AUTH_KEY (introduction point auth key), + * <b>intro_enc_keypair</b> is (b,B) (introduction point encryption keypair), + * <b>client_ephemeral_enc_pubkey</b> is X (CLIENT_PK in INTRODUCE2 cell), + * <b>subcredential</b> is the HS subcredential (of size DIGEST256_LEN) */ +int +hs_ntor_service_get_introduce1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *intro_enc_keypair, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out) +{ + int bad = 0; + uint8_t secret_input[INTRO_SECRET_HS_INPUT_LEN]; + uint8_t dh_result[CURVE25519_OUTPUT_LEN]; + + tor_assert(intro_auth_pubkey); + tor_assert(intro_enc_keypair); + tor_assert(client_ephemeral_enc_pubkey); + tor_assert(subcredential); + tor_assert(hs_ntor_intro_cell_keys_out); + + /* Compute EXP(X, b) */ + curve25519_handshake(dh_result, + &intro_enc_keypair->seckey, + client_ephemeral_enc_pubkey); + bad |= safe_mem_is_zero(dh_result, CURVE25519_OUTPUT_LEN); + + /* Get intro_secret_hs_input */ + get_intro_secret_hs_input(dh_result, intro_auth_pubkey, + client_ephemeral_enc_pubkey, + &intro_enc_keypair->pubkey, + secret_input); + bad |= safe_mem_is_zero(secret_input, CURVE25519_OUTPUT_LEN); + + /* Get ENC_KEY and MAC_KEY! */ + get_introduce1_key_material(secret_input, subcredential, + hs_ntor_intro_cell_keys_out); + + memwipe(secret_input, 0, sizeof(secret_input)); + if (bad) { + memwipe(hs_ntor_intro_cell_keys_out, 0, sizeof(hs_ntor_intro_cell_keys_t)); + } + + return bad ? -1 : 0; +} + +/* Public function: Do the appropriate ntor calculations and derive the keys + * needed to create and authenticate RENDEZVOUS1 cells. Return 0 and place the + * final key material in <b>hs_ntor_rend_cell_keys_out</b> if all went fine, + * return -1 if error happened. + * + * The relevant calculations are as follows: + * + * rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID + * NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) + * verify = MAC(rend_secret_hs_input, t_hsverify) + * auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + * auth_input_mac = MAC(auth_input, t_hsmac) + * + * where: + * <b>intro_auth_pubkey</b> is AUTH_KEY (intro point auth key), + * <b>intro_enc_keypair</b> is (b,B) (intro point enc keypair) + * <b>service_ephemeral_rend_keypair</b> is a fresh (y,Y) keypair + * <b>client_ephemeral_enc_pubkey</b> is X (CLIENT_PK in INTRODUCE2 cell) */ +int +hs_ntor_service_get_rendezvous1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *intro_enc_keypair, + const curve25519_keypair_t *service_ephemeral_rend_keypair, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out) +{ + int bad = 0; + uint8_t rend_secret_hs_input[REND_SECRET_HS_INPUT_LEN]; + uint8_t dh_result1[CURVE25519_OUTPUT_LEN]; + uint8_t dh_result2[CURVE25519_OUTPUT_LEN]; + + tor_assert(intro_auth_pubkey); + tor_assert(intro_enc_keypair); + tor_assert(service_ephemeral_rend_keypair); + tor_assert(client_ephemeral_enc_pubkey); + tor_assert(hs_ntor_rend_cell_keys_out); + + /* Compute EXP(X, y) */ + curve25519_handshake(dh_result1, + &service_ephemeral_rend_keypair->seckey, + client_ephemeral_enc_pubkey); + bad |= safe_mem_is_zero(dh_result1, CURVE25519_OUTPUT_LEN); + + /* Compute EXP(X, b) */ + curve25519_handshake(dh_result2, + &intro_enc_keypair->seckey, + client_ephemeral_enc_pubkey); + bad |= safe_mem_is_zero(dh_result2, CURVE25519_OUTPUT_LEN); + + /* Get rend_secret_hs_input */ + get_rend_secret_hs_input(dh_result1, dh_result2, + intro_auth_pubkey, + &intro_enc_keypair->pubkey, + client_ephemeral_enc_pubkey, + &service_ephemeral_rend_keypair->pubkey, + rend_secret_hs_input); + + /* Get NTOR_KEY_SEED and AUTH_INPUT_MAC! */ + bad |= get_rendezvous1_key_material(rend_secret_hs_input, + intro_auth_pubkey, + &intro_enc_keypair->pubkey, + &service_ephemeral_rend_keypair->pubkey, + client_ephemeral_enc_pubkey, + hs_ntor_rend_cell_keys_out); + + memwipe(rend_secret_hs_input, 0, sizeof(rend_secret_hs_input)); + if (bad) { + memwipe(hs_ntor_rend_cell_keys_out, 0, sizeof(hs_ntor_rend_cell_keys_t)); + } + + return bad ? -1 : 0; +} + +/** Given a received RENDEZVOUS2 MAC in <b>mac</b> (of length DIGEST256_LEN), + * and the RENDEZVOUS1 key material in <b>hs_ntor_rend_cell_keys</b>, return 1 + * if the MAC is good, otherwise return 0. */ +int +hs_ntor_client_rendezvous2_mac_is_good( + const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys, + const uint8_t *rcvd_mac) +{ + tor_assert(rcvd_mac); + tor_assert(hs_ntor_rend_cell_keys); + + return tor_memeq(hs_ntor_rend_cell_keys->rend_cell_auth_mac, + rcvd_mac, DIGEST256_LEN); +} + +/* Input length to KDF for key expansion */ +#define NTOR_KEY_EXPANSION_KDF_INPUT_LEN (DIGEST256_LEN + M_HSEXPAND_LEN) +/* Output length of KDF for key expansion */ +#define NTOR_KEY_EXPANSION_KDF_OUTPUT_LEN (DIGEST256_LEN*3+CIPHER256_KEY_LEN*2) + +/** Given the rendezvous key material in <b>hs_ntor_rend_cell_keys</b>, do the + * circuit key expansion as specified by section '4.2.1. Key expansion' and + * return a hs_ntor_rend_circuit_keys_t structure with the computed keys. */ +hs_ntor_rend_circuit_keys_t * +hs_ntor_circuit_key_expansion( + const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys) +{ + uint8_t *ptr; + uint8_t kdf_input[NTOR_KEY_EXPANSION_KDF_INPUT_LEN]; + uint8_t keys[NTOR_KEY_EXPANSION_KDF_OUTPUT_LEN]; + crypto_xof_t *xof; + hs_ntor_rend_circuit_keys_t *rend_circuit_keys = NULL; + + /* Let's build the input to the KDF */ + ptr = kdf_input; + APPEND(ptr, hs_ntor_rend_cell_keys->ntor_key_seed, DIGEST256_LEN); + APPEND(ptr, M_HSEXPAND, strlen(M_HSEXPAND)); + tor_assert(ptr == kdf_input + sizeof(kdf_input)); + + /* Generate the keys */ + xof = crypto_xof_new(); + crypto_xof_add_bytes(xof, kdf_input, sizeof(kdf_input)); + crypto_xof_squeeze_bytes(xof, keys, sizeof(keys)); + crypto_xof_free(xof); + + /* Generate keys structure and assign keys to it */ + rend_circuit_keys = tor_malloc_zero(sizeof(hs_ntor_rend_circuit_keys_t)); + ptr = keys; + memcpy(rend_circuit_keys->KH, ptr, DIGEST256_LEN); + ptr += DIGEST256_LEN;; + memcpy(rend_circuit_keys->Df, ptr, DIGEST256_LEN); + ptr += DIGEST256_LEN; + memcpy(rend_circuit_keys->Db, ptr, DIGEST256_LEN); + ptr += DIGEST256_LEN; + memcpy(rend_circuit_keys->Kf, ptr, CIPHER256_KEY_LEN); + ptr += CIPHER256_KEY_LEN; + memcpy(rend_circuit_keys->Kb, ptr, CIPHER256_KEY_LEN); + ptr += CIPHER256_KEY_LEN; + tor_assert(ptr == keys + sizeof(keys)); + + return rend_circuit_keys; +} + diff --git a/src/or/hs_ntor.h b/src/or/hs_ntor.h new file mode 100644 index 0000000000..cd75f46a4c --- /dev/null +++ b/src/or/hs_ntor.h @@ -0,0 +1,77 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_HS_NTOR_H +#define TOR_HS_NTOR_H + +#include "or.h" + +/* Key material needed to encode/decode INTRODUCE1 cells */ +typedef struct { + /* Key used for encryption of encrypted INTRODUCE1 blob */ + uint8_t enc_key[CIPHER256_KEY_LEN]; + /* MAC key used to protect encrypted INTRODUCE1 blob */ + uint8_t mac_key[DIGEST256_LEN]; +} hs_ntor_intro_cell_keys_t; + +/* Key material needed to encode/decode RENDEZVOUS1 cells */ +typedef struct { + /* This is the MAC of the HANDSHAKE_INFO field */ + uint8_t rend_cell_auth_mac[DIGEST256_LEN]; + /* This is the key seed used to derive further rendezvous crypto keys as + * detailed in section 4.2.1 of rend-spec-ng.txt. */ + uint8_t ntor_key_seed[DIGEST256_LEN]; +} hs_ntor_rend_cell_keys_t; + +/* Key material resulting from key expansion as detailed in section "4.2.1. Key + * expansion" of rend-spec-ng.txt. */ +typedef struct { + /* Per-circuit key material used in ESTABLISH_INTRO cell */ + uint8_t KH[DIGEST256_LEN]; + /* Authentication key for outgoing RELAY cells */ + uint8_t Df[DIGEST256_LEN]; + /* Authentication key for incoming RELAY cells */ + uint8_t Db[DIGEST256_LEN]; + /* Encryption key for outgoing RELAY cells */ + uint8_t Kf[CIPHER256_KEY_LEN]; + /* Decryption key for incoming RELAY cells */ + uint8_t Kb[CIPHER256_KEY_LEN]; +} hs_ntor_rend_circuit_keys_t; + +int hs_ntor_client_get_introduce1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_keypair_t *client_ephemeral_enc_keypair, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out); + +int hs_ntor_client_get_rendezvous1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *client_ephemeral_enc_keypair, + const curve25519_public_key_t *intro_enc_pubkey, + const curve25519_public_key_t *service_ephemeral_rend_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out); + +int hs_ntor_service_get_introduce1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *intro_enc_keypair, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + const uint8_t *subcredential, + hs_ntor_intro_cell_keys_t *hs_ntor_intro_cell_keys_out); + +int hs_ntor_service_get_rendezvous1_keys( + const ed25519_public_key_t *intro_auth_pubkey, + const curve25519_keypair_t *intro_enc_keypair, + const curve25519_keypair_t *service_ephemeral_rend_keypair, + const curve25519_public_key_t *client_ephemeral_enc_pubkey, + hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys_out); + +hs_ntor_rend_circuit_keys_t *hs_ntor_circuit_key_expansion( + const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys); + +int hs_ntor_client_rendezvous2_mac_is_good( + const hs_ntor_rend_cell_keys_t *hs_ntor_rend_cell_keys, + const uint8_t *rcvd_mac); + +#endif + diff --git a/src/or/hs_service.c b/src/or/hs_service.c index 7b12b63065..205ef11c92 100644 --- a/src/or/hs_service.c +++ b/src/or/hs_service.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -6,14 +6,13 @@ * \brief Implement next generation hidden service functionality **/ -#define HS_SERVICE_PRIVATE - #include "or.h" #include "relay.h" #include "rendservice.h" #include "circuitlist.h" #include "circpathbias.h" +#include "hs_intropoint.h" #include "hs_service.h" #include "hs_common.h" @@ -22,16 +21,14 @@ /* XXX We don't currently use these functions, apart from generating unittest data. When we start implementing the service-side support for prop224 we - should revisit these functions and use them. For now we mark them as - unittest-only code: */ -#ifdef TOR_UNIT_TESTS + should revisit these functions and use them. */ /** Given an ESTABLISH_INTRO <b>cell</b>, encode it and place its payload in * <b>buf_out</b> which has size <b>buf_out_len</b>. Return the number of * bytes written, or a negative integer if there was an error. */ -STATIC ssize_t +ssize_t get_establish_intro_payload(uint8_t *buf_out, size_t buf_out_len, - const hs_cell_establish_intro_t *cell) + const trn_cell_establish_intro_t *cell) { ssize_t bytes_used = 0; @@ -39,31 +36,31 @@ get_establish_intro_payload(uint8_t *buf_out, size_t buf_out_len, return -1; } - bytes_used = hs_cell_establish_intro_encode(buf_out, buf_out_len, + bytes_used = trn_cell_establish_intro_encode(buf_out, buf_out_len, cell); return bytes_used; } /* Set the cell extensions of <b>cell</b>. */ static void -set_cell_extensions(hs_cell_establish_intro_t *cell) +set_trn_cell_extensions(trn_cell_establish_intro_t *cell) { - cell_extension_t *cell_extensions = cell_extension_new(); + trn_cell_extension_t *trn_cell_extensions = trn_cell_extension_new(); /* For now, we don't use extensions at all. */ - cell_extensions->num = 0; /* It's already zeroed, but be explicit. */ - hs_cell_establish_intro_set_extensions(cell, cell_extensions); + trn_cell_extensions->num = 0; /* It's already zeroed, but be explicit. */ + trn_cell_establish_intro_set_extensions(cell, trn_cell_extensions); } /** Given the circuit handshake info in <b>circuit_key_material</b>, create and * return an ESTABLISH_INTRO cell. Return NULL if something went wrong. The * returned cell is allocated on the heap and it's the responsibility of the * caller to free it. */ -STATIC hs_cell_establish_intro_t * +trn_cell_establish_intro_t * generate_establish_intro_cell(const uint8_t *circuit_key_material, size_t circuit_key_material_len) { - hs_cell_establish_intro_t *cell = NULL; + trn_cell_establish_intro_t *cell = NULL; ssize_t encoded_len; log_warn(LD_GENERAL, @@ -76,31 +73,32 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, goto err; } - cell = hs_cell_establish_intro_new(); + cell = trn_cell_establish_intro_new(); /* Set AUTH_KEY_TYPE: 2 means ed25519 */ - hs_cell_establish_intro_set_auth_key_type(cell, AUTH_KEY_ED25519); + trn_cell_establish_intro_set_auth_key_type(cell, + HS_INTRO_AUTH_KEY_TYPE_ED25519); /* Set AUTH_KEY_LEN field */ /* Must also set byte-length of AUTH_KEY to match */ int auth_key_len = ED25519_PUBKEY_LEN; - hs_cell_establish_intro_set_auth_key_len(cell, auth_key_len); - hs_cell_establish_intro_setlen_auth_key(cell, auth_key_len); + trn_cell_establish_intro_set_auth_key_len(cell, auth_key_len); + trn_cell_establish_intro_setlen_auth_key(cell, auth_key_len); /* Set AUTH_KEY field */ - uint8_t *auth_key_ptr = hs_cell_establish_intro_getarray_auth_key(cell); + uint8_t *auth_key_ptr = trn_cell_establish_intro_getarray_auth_key(cell); memcpy(auth_key_ptr, key_struct.pubkey.pubkey, auth_key_len); /* No cell extensions needed */ - set_cell_extensions(cell); + set_trn_cell_extensions(cell); /* Set signature size. We need to do this up here, because _encode() needs it and we need to call _encode() to calculate the MAC and signature. */ int sig_len = ED25519_SIG_LEN; - hs_cell_establish_intro_set_sig_len(cell, sig_len); - hs_cell_establish_intro_setlen_sig(cell, sig_len); + trn_cell_establish_intro_set_sig_len(cell, sig_len); + trn_cell_establish_intro_setlen_sig(cell, sig_len); /* XXX How to make this process easier and nicer? */ @@ -111,7 +109,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, uint8_t cell_bytes_tmp[RELAY_PAYLOAD_SIZE] = {0}; uint8_t mac[TRUNNEL_SHA3_256_LEN]; - encoded_len = hs_cell_establish_intro_encode(cell_bytes_tmp, + encoded_len = trn_cell_establish_intro_encode(cell_bytes_tmp, sizeof(cell_bytes_tmp), cell); if (encoded_len < 0) { @@ -130,7 +128,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, (ED25519_SIG_LEN + 2 + TRUNNEL_SHA3_256_LEN)); /* Write the MAC to the cell */ uint8_t *handshake_ptr = - hs_cell_establish_intro_getarray_handshake_mac(cell); + trn_cell_establish_intro_getarray_handshake_mac(cell); memcpy(handshake_ptr, mac, sizeof(mac)); } @@ -141,7 +139,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, uint8_t cell_bytes_tmp[RELAY_PAYLOAD_SIZE] = {0}; ed25519_signature_t sig; - encoded_len = hs_cell_establish_intro_encode(cell_bytes_tmp, + encoded_len = trn_cell_establish_intro_encode(cell_bytes_tmp, sizeof(cell_bytes_tmp), cell); if (encoded_len < 0) { @@ -162,7 +160,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, } /* And write the signature to the cell */ - uint8_t *sig_ptr = hs_cell_establish_intro_getarray_sig(cell); + uint8_t *sig_ptr = trn_cell_establish_intro_getarray_sig(cell); memcpy(sig_ptr, sig.sig, sig_len); } @@ -170,9 +168,7 @@ generate_establish_intro_cell(const uint8_t *circuit_key_material, return cell; err: - hs_cell_establish_intro_free(cell); + trn_cell_establish_intro_free(cell); return NULL; } -#endif /* TOR_UNIT_TESTS */ - diff --git a/src/or/hs_service.h b/src/or/hs_service.h index 994521fc50..3302592762 100644 --- a/src/or/hs_service.h +++ b/src/or/hs_service.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -12,21 +12,16 @@ #include "or.h" #include "hs/cell_establish_intro.h" -#ifdef HS_SERVICE_PRIVATE +/* These functions are only used by unit tests and we need to expose them else + * hs_service.o ends up with no symbols in libor.a which makes clang throw a + * warning at compile time. See #21825. */ -#ifdef TOR_UNIT_TESTS - -STATIC hs_cell_establish_intro_t * +trn_cell_establish_intro_t * generate_establish_intro_cell(const uint8_t *circuit_key_material, size_t circuit_key_material_len); - -STATIC ssize_t +ssize_t get_establish_intro_payload(uint8_t *buf, size_t buf_len, - const hs_cell_establish_intro_t *cell); - -#endif /* TOR_UNIT_TESTS */ - -#endif /* HS_SERVICE_PRIVATE */ + const trn_cell_establish_intro_t *cell); #endif /* TOR_HS_SERVICE_H */ diff --git a/src/or/include.am b/src/or/include.am index c52fdf1fb0..7b031f737b 100644 --- a/src/or/include.am +++ b/src/or/include.am @@ -37,6 +37,9 @@ LIBTOR_A_SOURCES = \ src/or/connection.c \ src/or/connection_edge.c \ src/or/connection_or.c \ + src/or/conscache.c \ + src/or/consdiff.c \ + src/or/consdiffmgr.c \ src/or/control.c \ src/or/cpuworker.c \ src/or/dircollate.c \ @@ -49,6 +52,7 @@ LIBTOR_A_SOURCES = \ src/or/geoip.c \ src/or/hs_intropoint.c \ src/or/hs_circuitmap.c \ + src/or/hs_ntor.c \ src/or/hs_service.c \ src/or/entrynodes.c \ src/or/ext_orport.c \ @@ -117,8 +121,10 @@ src_or_tor_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libev src_or_tor_LDADD = src/or/libtor.a src/common/libor.a src/common/libor-ctime.a \ src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ src/common/libor-event.a src/trunnel/libor-trunnel.a \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ if COVERAGE_ENABLED src_or_tor_cov_SOURCES = src/or/tor_main.c @@ -130,7 +136,8 @@ src_or_tor_cov_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \ src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ src/common/libor-event-testing.a src/trunnel/libor-trunnel-testing.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ + @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ endif ORHEADERS = \ @@ -153,6 +160,9 @@ ORHEADERS = \ src/or/connection.h \ src/or/connection_edge.h \ src/or/connection_or.h \ + src/or/conscache.h \ + src/or/consdiff.h \ + src/or/consdiffmgr.h \ src/or/control.h \ src/or/cpuworker.h \ src/or/dircollate.h \ @@ -173,6 +183,7 @@ ORHEADERS = \ src/or/hs_descriptor.h \ src/or/hs_intropoint.h \ src/or/hs_circuitmap.h \ + src/or/hs_ntor.h \ src/or/hs_service.h \ src/or/keypin.h \ src/or/main.h \ diff --git a/src/or/keypin.c b/src/or/keypin.c index 2d4c4e92d2..1698dc184f 100644 --- a/src/or/keypin.c +++ b/src/or/keypin.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/keypin.h b/src/or/keypin.h index 673f24d9e3..2564f5befb 100644 --- a/src/or/keypin.h +++ b/src/or/keypin.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_KEYPIN_H diff --git a/src/or/main.c b/src/or/main.c index b729e0b378..fe63ddb091 100644 --- a/src/or/main.c +++ b/src/or/main.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -59,11 +59,13 @@ #include "circuitlist.h" #include "circuituse.h" #include "command.h" +#include "compress.h" #include "config.h" #include "confparse.h" #include "connection.h" #include "connection_edge.h" #include "connection_or.h" +#include "consdiffmgr.h" #include "control.h" #include "cpuworker.h" #include "crypto_s2k.h" @@ -105,7 +107,6 @@ #include "ext_orport.h" #ifdef USE_DMALLOC #include <dmalloc.h> -#include <openssl/crypto.h> #endif #include "memarea.h" #include "sandbox.h" @@ -1165,6 +1166,7 @@ static int periodic_events_initialized = 0; #define CALLBACK(name) \ static int name ## _callback(time_t, const or_options_t *) CALLBACK(rotate_onion_key); +CALLBACK(check_onion_keys_expiry_time); CALLBACK(check_ed_keys); CALLBACK(launch_descriptor_fetches); CALLBACK(rotate_x509_certificate); @@ -1188,6 +1190,7 @@ CALLBACK(check_dns_honesty); CALLBACK(write_bridge_ns); CALLBACK(check_fw_helper_app); CALLBACK(heartbeat); +CALLBACK(clean_consdiffmgr); CALLBACK(reset_padding_counts); CALLBACK(check_canonical_channels); @@ -1198,6 +1201,7 @@ CALLBACK(check_canonical_channels); static periodic_event_item_t periodic_events[] = { CALLBACK(rotate_onion_key), + CALLBACK(check_onion_keys_expiry_time), CALLBACK(check_ed_keys), CALLBACK(launch_descriptor_fetches), CALLBACK(rotate_x509_certificate), @@ -1221,6 +1225,7 @@ static periodic_event_item_t periodic_events[] = { CALLBACK(write_bridge_ns), CALLBACK(check_fw_helper_app), CALLBACK(heartbeat), + CALLBACK(clean_consdiffmgr), CALLBACK(reset_padding_counts), CALLBACK(check_canonical_channels), END_OF_PERIODIC_EVENTS @@ -1478,19 +1483,26 @@ run_scheduled_events(time_t now) /* 11b. check pending unconfigured managed proxies */ if (!net_is_disabled() && pt_proxies_configuration_pending()) pt_configure_remaining_proxies(); + + /* 12. launch diff computations. (This is free if there are none to + * launch.) */ + if (server_mode(options)) { + consdiffmgr_rescan(); + } } -/* Periodic callback: Every MIN_ONION_KEY_LIFETIME seconds, rotate the onion - * keys, shut down and restart all cpuworkers, and update our descriptor if - * necessary. +/* Periodic callback: rotate the onion keys after the period defined by the + * "onion-key-rotation-days" consensus parameter, shut down and restart all + * cpuworkers, and update our descriptor if necessary. */ static int rotate_onion_key_callback(time_t now, const or_options_t *options) { if (server_mode(options)) { - time_t rotation_time = get_onion_key_set_at()+MIN_ONION_KEY_LIFETIME; + int onion_key_lifetime = get_onion_key_lifetime(); + time_t rotation_time = get_onion_key_set_at()+onion_key_lifetime; if (rotation_time > now) { - return safe_timer_diff(now, rotation_time); + return ONION_KEY_CONSENSUS_CHECK_INTERVAL; } log_info(LD_GENERAL,"Rotating onion key."); @@ -1501,8 +1513,32 @@ rotate_onion_key_callback(time_t now, const or_options_t *options) } if (advertised_server_mode() && !options->DisableNetwork) router_upload_dir_desc_to_dirservers(0); - return MIN_ONION_KEY_LIFETIME; + return ONION_KEY_CONSENSUS_CHECK_INTERVAL; + } + return PERIODIC_EVENT_NO_UPDATE; +} + +/* Period callback: Check if our old onion keys are still valid after the + * period of time defined by the consensus parameter + * "onion-key-grace-period-days", otherwise expire them by setting them to + * NULL. + */ +static int +check_onion_keys_expiry_time_callback(time_t now, const or_options_t *options) +{ + if (server_mode(options)) { + int onion_key_grace_period = get_onion_key_grace_period(); + time_t expiry_time = get_onion_key_set_at()+onion_key_grace_period; + if (expiry_time > now) { + return ONION_KEY_CONSENSUS_CHECK_INTERVAL; + } + + log_info(LD_GENERAL, "Expiring old onion keys."); + expire_old_onion_keys(); + cpuworkers_rotate_keyinfo(); + return ONION_KEY_CONSENSUS_CHECK_INTERVAL; } + return PERIODIC_EVENT_NO_UPDATE; } @@ -2038,6 +2074,17 @@ heartbeat_callback(time_t now, const or_options_t *options) return options->HeartbeatPeriod; } +#define CDM_CLEAN_CALLBACK_INTERVAL 600 +static int +clean_consdiffmgr_callback(time_t now, const or_options_t *options) +{ + (void)now; + if (server_mode(options)) { + consdiffmgr_cleanup(); + } + return CDM_CLEAN_CALLBACK_INTERVAL; +} + /** Timer: used to invoke second_elapsed_callback() once per second. */ static periodic_timer_t *second_timer = NULL; /** Number of libevent errors in the last second: we die if we get too many. */ @@ -2437,7 +2484,7 @@ do_main_loop(void) } /* Setup shared random protocol subsystem. */ - if (authdir_mode_publishes_statuses(get_options())) { + if (authdir_mode_v3(get_options())) { if (sr_init(1) < 0) { return -1; } @@ -3004,11 +3051,16 @@ tor_init(int argc, char *argv[]) const char *version = get_version(); log_notice(LD_GENERAL, "Tor %s running on %s with Libevent %s, " - "OpenSSL %s and Zlib %s.", version, + "OpenSSL %s, Zlib %s, Liblzma %s, and Libzstd %s.", version, get_uname(), tor_libevent_get_version_str(), crypto_openssl_get_version_str(), - tor_zlib_get_version_str()); + tor_compress_supports_method(ZLIB_METHOD) ? + tor_compress_version_str(ZLIB_METHOD) : "N/A", + tor_compress_supports_method(LZMA_METHOD) ? + tor_compress_version_str(LZMA_METHOD) : "N/A", + tor_compress_supports_method(ZSTD_METHOD) ? + tor_compress_version_str(ZSTD_METHOD) : "N/A"); log_notice(LD_GENERAL, "Tor can't help you if you use it wrong! " "Learn how to be safe at " @@ -3169,6 +3221,7 @@ tor_free_all(int postfork) sandbox_free_getaddrinfo_cache(); protover_free_all(); bridges_free_all(); + consdiffmgr_free_all(); if (!postfork) { config_free_all(); or_state_free_all(); @@ -3198,6 +3251,7 @@ tor_free_all(int postfork) if (!postfork) { escaped(NULL); esc_router_info(NULL); + clean_up_backtrace_handler(); logs_free_all(); /* free log strings. do this last so logs keep working. */ } } @@ -3593,6 +3647,8 @@ sandbox_init_filter(void) OPEN_DATADIR("stats"); STAT_DATADIR("stats"); STAT_DATADIR2("stats", "dirreq-stats"); + + consdiffmgr_register_with_sandbox(&cfg); } init_addrinfo(); @@ -3625,14 +3681,15 @@ tor_main(int argc, char *argv[]) update_approx_time(time(NULL)); tor_threads_init(); + tor_compress_init(); init_logging(0); monotime_init(); #ifdef USE_DMALLOC { /* Instruct OpenSSL to use our internal wrappers for malloc, realloc and free. */ - int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); - tor_assert(r); + int r = crypto_use_tor_alloc_functions(); + tor_assert(r == 0); } #endif #ifdef NT_SERVICE diff --git a/src/or/main.h b/src/or/main.h index 07b22598b1..915d82b7ba 100644 --- a/src/or/main.h +++ b/src/or/main.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/microdesc.c b/src/or/microdesc.c index 140117f683..a4e6b409c4 100644 --- a/src/or/microdesc.c +++ b/src/or/microdesc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009-2016, The Tor Project, Inc. */ +/* Copyright (c) 2009-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -804,18 +804,6 @@ microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d) return md; } -/** Return the mean size of decriptors added to <b>cache</b> since it was last - * cleared. Used to estimate the size of large downloads. */ -size_t -microdesc_average_size(microdesc_cache_t *cache) -{ - if (!cache) - cache = get_microdesc_cache(); - if (!cache->n_seen) - return 512; - return (size_t)(cache->total_len_seen / cache->n_seen); -} - /** Return a smartlist of all the sha256 digest of the microdescriptors that * are listed in <b>ns</b> but not present in <b>cache</b>. Returns pointers * to internals of <b>ns</b>; you should not free the members of the resulting diff --git a/src/or/microdesc.h b/src/or/microdesc.h index 40c83139e9..943873066e 100644 --- a/src/or/microdesc.h +++ b/src/or/microdesc.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -32,8 +32,6 @@ void microdesc_cache_clear(microdesc_cache_t *cache); microdesc_t *microdesc_cache_lookup_by_digest256(microdesc_cache_t *cache, const char *d); -size_t microdesc_average_size(microdesc_cache_t *cache); - smartlist_t *microdesc_list_missing_digest256(networkstatus_t *ns, microdesc_cache_t *cache, int downloadable_only, diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c index 4107542f56..ac5c5c526c 100644 --- a/src/or/networkstatus.c +++ b/src/or/networkstatus.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -46,6 +46,7 @@ #include "config.h" #include "connection.h" #include "connection_or.h" +#include "consdiffmgr.h" #include "control.h" #include "directory.h" #include "dirserv.h" @@ -179,53 +180,74 @@ networkstatus_reset_download_failures(void) download_status_reset(&consensus_bootstrap_dl_status[i]); } +/** + * Read and and return the cached consensus of type <b>flavorname</b>. If + * <b>unverified</b> is false, get the one we haven't verified. Return NULL if + * the file isn't there. */ +static char * +networkstatus_read_cached_consensus_impl(int flav, + const char *flavorname, + int unverified_consensus) +{ + char buf[128]; + const char *prefix; + if (unverified_consensus) { + prefix = "unverified"; + } else { + prefix = "cached"; + } + if (flav == FLAV_NS) { + tor_snprintf(buf, sizeof(buf), "%s-consensus", prefix); + } else { + tor_snprintf(buf, sizeof(buf), "%s-%s-consensus", prefix, flavorname); + } + + char *filename = get_datadir_fname(buf); + char *result = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); + tor_free(filename); + return result; +} + +/** Return a new string containing the current cached consensus of flavor + * <b>flavorname</b>. */ +char * +networkstatus_read_cached_consensus(const char *flavorname) + { + int flav = networkstatus_parse_flavor_name(flavorname); + if (flav < 0) + return NULL; + return networkstatus_read_cached_consensus_impl(flav, flavorname, 0); +} + /** Read every cached v3 consensus networkstatus from the disk. */ int router_reload_consensus_networkstatus(void) { - char *filename; - char *s; const unsigned int flags = NSSET_FROM_CACHE | NSSET_DONT_DOWNLOAD_CERTS; int flav; /* FFFF Suppress warnings if cached consensus is bad? */ for (flav = 0; flav < N_CONSENSUS_FLAVORS; ++flav) { - char buf[128]; const char *flavor = networkstatus_get_flavor_name(flav); - if (flav == FLAV_NS) { - filename = get_datadir_fname("cached-consensus"); - } else { - tor_snprintf(buf, sizeof(buf), "cached-%s-consensus", flavor); - filename = get_datadir_fname(buf); - } - s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); + char *s = networkstatus_read_cached_consensus_impl(flav, flavor, 0); if (s) { if (networkstatus_set_current_consensus(s, flavor, flags, NULL) < -1) { - log_warn(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"", - flavor, filename); + log_warn(LD_FS, "Couldn't load consensus %s networkstatus from cache", + flavor); } tor_free(s); } - tor_free(filename); - if (flav == FLAV_NS) { - filename = get_datadir_fname("unverified-consensus"); - } else { - tor_snprintf(buf, sizeof(buf), "unverified-%s-consensus", flavor); - filename = get_datadir_fname(buf); - } - - s = read_file_to_str(filename, RFTS_IGNORE_MISSING, NULL); + s = networkstatus_read_cached_consensus_impl(flav, flavor, 1); if (s) { if (networkstatus_set_current_consensus(s, flavor, flags|NSSET_WAS_WAITING_FOR_CERTS, NULL)) { - log_info(LD_FS, "Couldn't load consensus %s networkstatus from \"%s\"", - flavor, filename); - } + log_info(LD_FS, "Couldn't load unverified consensus %s networkstatus " + "from cache", flavor); + } tor_free(s); } - tor_free(filename); } if (!networkstatus_get_latest_consensus()) { @@ -1982,7 +2004,11 @@ networkstatus_set_current_consensus(const char *consensus, dirserv_set_cached_consensus_networkstatus(consensus, flavor, &c->digests, + c->digest_sha3_as_signed, c->valid_after); + if (server_mode(get_options())) { + consdiffmgr_add_consensus(consensus, c); + } } if (!from_cache) { diff --git a/src/or/networkstatus.h b/src/or/networkstatus.h index 66cd84c88e..6a90d706c5 100644 --- a/src/or/networkstatus.h +++ b/src/or/networkstatus.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -16,6 +16,7 @@ void networkstatus_reset_warnings(void); void networkstatus_reset_download_failures(void); +char *networkstatus_read_cached_consensus(const char *flavorname); int router_reload_consensus_networkstatus(void); void routerstatus_free(routerstatus_t *rs); void networkstatus_vote_free(networkstatus_t *ns); diff --git a/src/or/nodelist.c b/src/or/nodelist.c index 96e95baf5a..dc4d9a63e3 100644 --- a/src/or/nodelist.c +++ b/src/or/nodelist.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/nodelist.h b/src/or/nodelist.h index 8456d21c6c..b94a066913 100644 --- a/src/or/nodelist.h +++ b/src/or/nodelist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/ntmain.c b/src/or/ntmain.c index 4c65805b32..e087bd6937 100644 --- a/src/or/ntmain.c +++ b/src/or/ntmain.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/ntmain.h b/src/or/ntmain.h index 31bf38c62c..4b771b1828 100644 --- a/src/or/ntmain.h +++ b/src/or/ntmain.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion.c b/src/or/onion.c index 42b9ca4b18..a98b97cb1d 100644 --- a/src/or/onion.c +++ b/src/or/onion.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -238,7 +238,9 @@ onion_pending_add(or_circuit_t *circ, create_cell_t *onionskin) onion_queue_entry_remove(head); log_info(LD_CIRC, "Circuit create request is too old; canceling due to overload."); - circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); + if (! TO_CIRCUIT(circ)->marked_for_close) { + circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT); + } } return 0; } diff --git a/src/or/onion.h b/src/or/onion.h index 19e4a7c381..37a7b08cb6 100644 --- a/src/or/onion.h +++ b/src/or/onion.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_fast.c b/src/or/onion_fast.c index 8dcbfe22d8..146943a273 100644 --- a/src/or/onion_fast.c +++ b/src/or/onion_fast.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_fast.h b/src/or/onion_fast.h index b9626002c3..b31f8e9492 100644 --- a/src/or/onion_fast.h +++ b/src/or/onion_fast.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_ntor.c b/src/or/onion_ntor.c index ded97ee73d..902260b54b 100644 --- a/src/or/onion_ntor.c +++ b/src/or/onion_ntor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/onion_ntor.h b/src/or/onion_ntor.h index f637b437fd..158c499de4 100644 --- a/src/or/onion_ntor.h +++ b/src/or/onion_ntor.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_ONION_NTOR_H diff --git a/src/or/onion_tap.c b/src/or/onion_tap.c index 2769300945..294fc0df6d 100644 --- a/src/or/onion_tap.c +++ b/src/or/onion_tap.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -159,7 +159,7 @@ onion_skin_TAP_server_handshake( * big. That should be impossible. */ log_info(LD_GENERAL, "crypto_dh_get_public failed."); goto err; - /* LCOV_EXCP_STOP */ + /* LCOV_EXCL_STOP */ } key_material_len = DIGEST_LEN+key_out_len; diff --git a/src/or/onion_tap.h b/src/or/onion_tap.h index a2880f6e98..bd625231f4 100644 --- a/src/or/onion_tap.h +++ b/src/or/onion_tap.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/or.h b/src/or/or.h index cd00fbb815..4d6ac93548 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -71,10 +71,11 @@ #include "tortls.h" #include "torlog.h" #include "container.h" -#include "torgzip.h" +#include "compress.h" #include "address.h" #include "compat_libevent.h" #include "ht.h" +#include "confline.h" #include "replaycache.h" #include "crypto_curve25519.h" #include "crypto_ed25519.h" @@ -147,8 +148,27 @@ /** Maximum size of a single extrainfo document, as above. */ #define MAX_EXTRAINFO_UPLOAD_SIZE 50000 -/** How often do we rotate onion keys? */ -#define MIN_ONION_KEY_LIFETIME (7*24*60*60) +/** Minimum lifetime for an onion key in days. */ +#define MIN_ONION_KEY_LIFETIME_DAYS (1) + +/** Maximum lifetime for an onion key in days. */ +#define MAX_ONION_KEY_LIFETIME_DAYS (90) + +/** Default lifetime for an onion key in days. */ +#define DEFAULT_ONION_KEY_LIFETIME_DAYS (28) + +/** Minimum grace period for acceptance of an onion key in days. + * The maximum value is defined in proposal #274 as being the current network + * consensus parameter for "onion-key-rotation-days". */ +#define MIN_ONION_KEY_GRACE_PERIOD_DAYS (1) + +/** Default grace period for acceptance of an onion key in days. */ +#define DEFAULT_ONION_KEY_GRACE_PERIOD_DAYS (7) + +/** How often we should check the network consensus if it is time to rotate or + * expire onion keys. */ +#define ONION_KEY_CONSENSUS_CHECK_INTERVAL (60*60) + /** How often do we rotate TLS contexts? */ #define MAX_SSL_KEY_LIFETIME_INTERNAL (2*60*60) @@ -403,12 +423,13 @@ typedef enum { #define DIR_PURPOSE_FETCH_MICRODESC 19 #define DIR_PURPOSE_MAX_ 19 -/** True iff <b>p</b> is a purpose corresponding to uploading data to a - * directory server. */ +/** True iff <b>p</b> is a purpose corresponding to uploading + * data to a directory server. */ #define DIR_PURPOSE_IS_UPLOAD(p) \ ((p)==DIR_PURPOSE_UPLOAD_DIR || \ (p)==DIR_PURPOSE_UPLOAD_VOTE || \ - (p)==DIR_PURPOSE_UPLOAD_SIGNATURES) + (p)==DIR_PURPOSE_UPLOAD_SIGNATURES || \ + (p)==DIR_PURPOSE_UPLOAD_RENDDESC_V2) #define EXIT_PURPOSE_MIN_ 1 /** This exit stream wants to do an ordinary connect. */ @@ -1544,10 +1565,6 @@ typedef struct or_connection_t { * NETINFO cell listed the address we're connected to as recognized. */ unsigned int is_canonical:1; - /** True iff we have decided that the other end of this connection - * is a client. Connections with this flag set should never be used - * to satisfy an EXTEND request. */ - unsigned int is_connection_with_client:1; /** True iff this is an outgoing connection. */ unsigned int is_outgoing:1; unsigned int proxy_type:2; /**< One of PROXY_NONE...PROXY_SOCKS5 */ @@ -1733,14 +1750,6 @@ typedef struct entry_connection_t { unsigned int is_socks_socket:1; } entry_connection_t; -typedef enum { - DIR_SPOOL_NONE=0, DIR_SPOOL_SERVER_BY_DIGEST, DIR_SPOOL_SERVER_BY_FP, - DIR_SPOOL_EXTRA_BY_DIGEST, DIR_SPOOL_EXTRA_BY_FP, - DIR_SPOOL_CACHED_DIR, DIR_SPOOL_NETWORKSTATUS, - DIR_SPOOL_MICRODESC, /* NOTE: if we add another entry, add another bit. */ -} dir_spool_source_t; -#define dir_spool_source_bitfield_t ENUM_BF(dir_spool_source_t) - /** Subtype of connection_t for an "directory connection" -- that is, an HTTP * connection to retrieve or serve directory material. */ typedef struct dir_connection_t { @@ -1755,23 +1764,15 @@ typedef struct dir_connection_t { char *requested_resource; unsigned int dirconn_direct:1; /**< Is this dirconn direct, or via Tor? */ - /* Used only for server sides of some dir connections, to implement - * "spooling" of directory material to the outbuf. Otherwise, we'd have - * to append everything to the outbuf in one enormous chunk. */ - /** What exactly are we spooling right now? */ - dir_spool_source_bitfield_t dir_spool_src : 3; - /** If we're fetching descriptors, what router purpose shall we assign * to them? */ uint8_t router_purpose; - /** List of fingerprints for networkstatuses or descriptors to be spooled. */ - smartlist_t *fingerprint_stack; - /** A cached_dir_t object that we're currently spooling out */ - struct cached_dir_t *cached_dir; - /** The current offset into cached_dir. */ - off_t cached_dir_offset; - /** The zlib object doing on-the-fly compression for spooled data. */ - tor_zlib_state_t *zlib_state; + + /** List of spooled_resource_t for objects that we're spooling. We use + * it from back to front. */ + smartlist_t *spool; + /** The compression object doing on-the-fly compression for spooled data. */ + tor_compress_state_t *compress_state; /** What rendezvous service are we querying for? */ rend_data_t *rend_data; @@ -1787,6 +1788,14 @@ typedef struct dir_connection_t { * that's going away and being used on channels instead. The dirserver still * needs this for the incoming side, so it's moved here. */ uint64_t dirreq_id; + +#ifdef MEASUREMENTS_21206 + /** Number of RELAY_DATA cells received. */ + uint32_t data_cells_received; + + /** Number of RELAY_DATA cells sent. */ + uint32_t data_cells_sent; +#endif } dir_connection_t; /** Subtype of connection_t for an connection to a controller. */ @@ -1930,6 +1939,8 @@ typedef struct cached_dir_t { size_t dir_z_len; /**< Length of <b>dir_z</b>. */ time_t published; /**< When was this object published. */ common_digests_t digests; /**< Digests of this object (networkstatus only) */ + /** Sha3 digest (also ns only) */ + uint8_t digest_sha3_as_signed[DIGEST256_LEN]; int refcnt; /**< Reference count for this cached_dir_t. */ } cached_dir_t; @@ -2267,6 +2278,16 @@ typedef struct routerstatus_t { * ed25519 identity keys on a link handshake. */ unsigned int supports_ed25519_link_handshake:1; + /** True iff this router has a protocol list that allows it to be an + * introduction point supporting ed25519 authentication key which is part of + * the v3 protocol detailed in proposal 224. This requires HSIntro=4. */ + unsigned int supports_ed25519_hs_intro : 1; + + /** True iff this router has a protocol list that allows it to be an hidden + * service directory supporting version 3 as seen in proposal 224. This + * requires HSDir=2. */ + unsigned int supports_v3_hsdir : 1; + unsigned int has_bandwidth:1; /**< The vote/consensus had bw info */ unsigned int has_exitsummary:1; /**< The vote/consensus had exit summaries */ unsigned int bw_is_unmeasured:1; /**< This is a consensus entry, with @@ -2620,6 +2641,9 @@ typedef struct networkstatus_t { /** Digests of this document, as signed. */ common_digests_t digests; + /** A SHA3-256 digest of the document, not including signatures: used for + * consensus diffs */ + uint8_t digest_sha3_as_signed[DIGEST256_LEN]; /** List of router statuses, sorted by identity digest. For a vote, * the elements are vote_routerstatus_t; for a consensus, the elements @@ -3053,6 +3077,13 @@ typedef struct circuit_t { * circuit's queues; used only if CELL_STATS events are enabled and * cleared after being sent to control port. */ smartlist_t *testing_cell_stats; + + /** If set, points to an HS token that this circuit might be carrying. + * Used by the HS circuitmap. */ + hs_token_t *hs_token; + /** Hashtable node: used to look up the circuit by its HS token using the HS + circuitmap. */ + HT_ENTRY(circuit_t) hs_circuitmap_node; } circuit_t; /** Largest number of relay_early cells that we can send on a given @@ -3369,13 +3400,6 @@ typedef struct or_circuit_t { * is not marked for close. */ struct or_circuit_t *rend_splice; - /** If set, points to an HS token that this circuit might be carrying. - * Used by the HS circuitmap. */ - hs_token_t *hs_token; - /** Hashtable node: used to look up the circuit by its HS token using the HS - circuitmap. */ - HT_ENTRY(or_circuit_t) hs_circuitmap_node; - /** Stores KH for the handshake. */ char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */ @@ -3526,27 +3550,6 @@ typedef struct port_cfg_t { char unix_addr[FLEXIBLE_ARRAY_MEMBER]; } port_cfg_t; -/** Ordinary configuration line. */ -#define CONFIG_LINE_NORMAL 0 -/** Appends to previous configuration for the same option, even if we - * would ordinary replace it. */ -#define CONFIG_LINE_APPEND 1 -/* Removes all previous configuration for an option. */ -#define CONFIG_LINE_CLEAR 2 - -/** A linked list of lines in a config file. */ -typedef struct config_line_t { - char *key; - char *value; - struct config_line_t *next; - /** What special treatment (if any) does this line require? */ - unsigned int command:2; - /** If true, subsequent assignments to this linelist should replace - * it, not extend it. Set only on the first item in a linelist in an - * or_options_t. */ - unsigned int fragile:1; -} config_line_t; - typedef struct routerset_t routerset_t; /** A magic value for the (Socks|OR|...)Port options below, telling Tor @@ -5324,7 +5327,8 @@ typedef struct dir_server_t { * address information from published? */ routerstatus_t fake_status; /**< Used when we need to pass this trusted - * dir_server_t to directory_initiate_command_* + * dir_server_t to + * directory_request_set_routerstatus. * as a routerstatus_t. Not updated by the * router-status management code! **/ diff --git a/src/or/parsecommon.c b/src/or/parsecommon.c index ec2cec69f7..7959867875 100644 --- a/src/or/parsecommon.c +++ b/src/or/parsecommon.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/parsecommon.h b/src/or/parsecommon.h index 15e9f7ae85..f4974a9683 100644 --- a/src/or/parsecommon.h +++ b/src/or/parsecommon.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -157,12 +157,16 @@ typedef enum { R3_SUPERENCRYPTED, R3_SIGNATURE, R3_CREATE2_FORMATS, - R3_AUTHENTICATION_REQUIRED, + R3_INTRO_AUTH_REQUIRED, R3_SINGLE_ONION_SERVICE, R3_INTRODUCTION_POINT, R3_INTRO_AUTH_KEY, R3_INTRO_ENC_KEY, R3_INTRO_ENC_KEY_CERTIFICATION, + R3_DESC_AUTH_TYPE, + R3_DESC_AUTH_KEY, + R3_DESC_AUTH_CLIENT, + R3_ENCRYPTED, R_IPO_IDENTIFIER, R_IPO_IP_ADDRESS, diff --git a/src/or/periodic.c b/src/or/periodic.c index d02d4a7bbb..6896b41c86 100644 --- a/src/or/periodic.c +++ b/src/or/periodic.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/periodic.h b/src/or/periodic.h index 021bb4ef5c..88d00cc7e9 100644 --- a/src/or/periodic.h +++ b/src/or/periodic.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_PERIODIC_H diff --git a/src/or/policies.c b/src/or/policies.c index 2aa6373f3e..3d49a6110c 100644 --- a/src/or/policies.c +++ b/src/or/policies.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/policies.h b/src/or/policies.h index f73f850c21..ce08d497e9 100644 --- a/src/or/policies.h +++ b/src/or/policies.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/protover.c b/src/or/protover.c index 88d549ab35..ee58927fc5 100644 --- a/src/or/protover.c +++ b/src/or/protover.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/protover.h b/src/or/protover.h index 5c658931ea..22667bed79 100644 --- a/src/or/protover.h +++ b/src/or/protover.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/reasons.c b/src/or/reasons.c index a1566e2299..e6c325f1b3 100644 --- a/src/or/reasons.c +++ b/src/or/reasons.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/reasons.h b/src/or/reasons.h index 2e12c93728..1cadf4e89e 100644 --- a/src/or/reasons.h +++ b/src/or/reasons.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/relay.c b/src/or/relay.c index 886ddad071..7082002f84 100644 --- a/src/or/relay.c +++ b/src/or/relay.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -54,6 +54,7 @@ #include "circuitbuild.h" #include "circuitlist.h" #include "circuituse.h" +#include "compress.h" #include "config.h" #include "connection.h" #include "connection_edge.h" @@ -302,7 +303,8 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, return 0; if (relay_crypt(circ, cell, cell_direction, &layer_hint, &recognized) < 0) { - log_warn(LD_BUG,"relay crypt failed. Dropping connection."); + log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, + "relay crypt failed. Dropping connection."); return -END_CIRC_REASON_INTERNAL; } @@ -336,8 +338,13 @@ circuit_receive_relay_cell(cell_t *cell, circuit_t *circ, log_debug(LD_OR,"Sending to origin."); if ((reason = connection_edge_process_relay_cell(cell, circ, conn, layer_hint)) < 0) { - log_warn(LD_OR, - "connection_edge_process_relay_cell (at origin) failed."); + /* If a client is trying to connect to unknown hidden service port, + * END_CIRC_AT_ORIGIN is sent back so we can then close the circuit. + * Do not log warn as this is an expected behavior for a service. */ + if (reason != END_CIRC_AT_ORIGIN) { + log_warn(LD_OR, + "connection_edge_process_relay_cell (at origin) failed."); + } return reason; } } @@ -814,6 +821,16 @@ connection_edge_send_command(edge_connection_t *fromconn, return -1; } +#ifdef MEASUREMENTS_21206 + /* Keep track of the number of RELAY_DATA cells sent for directory + * connections. */ + connection_t *linked_conn = TO_CONN(fromconn)->linked_conn; + + if (linked_conn && linked_conn->type == CONN_TYPE_DIR) { + ++(TO_DIR_CONN(linked_conn)->data_cells_sent); + } +#endif + return relay_send_command_from_edge(fromconn->stream_id, circ, relay_command, payload, payload_len, cpath_layer); @@ -1668,6 +1685,16 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection_write_to_buf((char*)(cell->payload + RELAY_HEADER_SIZE), rh.length, TO_CONN(conn)); +#ifdef MEASUREMENTS_21206 + /* Count number of RELAY_DATA cells received on a linked directory + * connection. */ + connection_t *linked_conn = TO_CONN(conn)->linked_conn; + + if (linked_conn && linked_conn->type == CONN_TYPE_DIR) { + ++(TO_DIR_CONN(linked_conn)->data_cells_received); + } +#endif + if (!optimistic_data) { /* Only send a SENDME if we're not getting optimistic data; otherwise * a SENDME could arrive before the CONNECTED. @@ -2511,7 +2538,7 @@ cell_queues_check_size(void) { size_t alloc = cell_queues_get_total_allocation(); alloc += buf_get_total_allocation(); - alloc += tor_zlib_get_total_allocation(); + alloc += tor_compress_get_total_allocation(); const size_t rend_cache_total = rend_cache_get_total_allocation(); alloc += rend_cache_total; if (alloc >= get_options()->MaxMemInQueues_low_threshold) { diff --git a/src/or/relay.h b/src/or/relay.h index 3acf3ee0e3..a160cd5551 100644 --- a/src/or/relay.h +++ b/src/or/relay.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendcache.c b/src/or/rendcache.c index 12c23ea87c..11b60b36a1 100644 --- a/src/or/rendcache.c +++ b/src/or/rendcache.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendcache.h b/src/or/rendcache.h index 746f142fcc..1bd3be2243 100644 --- a/src/or/rendcache.h +++ b/src/or/rendcache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendclient.c b/src/or/rendclient.c index 06744ad795..9bc2d6289d 100644 --- a/src/or/rendclient.c +++ b/src/or/rendclient.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -724,6 +724,9 @@ directory_get_from_hs_dir(const char *desc_id, hs_dir = pick_hsdir(desc_id, desc_id_base32); if (!hs_dir) { /* No suitable hs dir can be found, stop right now. */ + control_event_hs_descriptor_failed(rend_query, NULL, "QUERY_NO_HSDIR"); + control_event_hs_descriptor_content(rend_data_get_address(rend_query), + desc_id_base32, NULL, NULL); return 0; } } @@ -744,6 +747,9 @@ directory_get_from_hs_dir(const char *desc_id, REND_DESC_COOKIE_LEN, 0)<0) { log_warn(LD_BUG, "Could not base64-encode descriptor cookie."); + control_event_hs_descriptor_failed(rend_query, hsdir_fp, "BAD_DESC"); + control_event_hs_descriptor_content(rend_data_get_address(rend_query), + desc_id_base32, hsdir_fp, NULL); return 0; } /* Remove == signs. */ @@ -756,13 +762,15 @@ directory_get_from_hs_dir(const char *desc_id, /* Send fetch request. (Pass query and possibly descriptor cookie so that * they can be written to the directory connection and be referred to when * the response arrives. */ - directory_initiate_command_routerstatus_rend(hs_dir, - DIR_PURPOSE_FETCH_RENDDESC_V2, - ROUTER_PURPOSE_GENERAL, - how_to_fetch, - desc_id_base32, - NULL, 0, 0, - rend_query, NULL); + directory_request_t *req = + directory_request_new(DIR_PURPOSE_FETCH_RENDDESC_V2); + directory_request_set_routerstatus(req, hs_dir); + directory_request_set_indirection(req, how_to_fetch); + directory_request_set_resource(req, desc_id_base32); + directory_request_set_rend_query(req, rend_query); + directory_initiate_request(req); + directory_request_free(req); + log_info(LD_REND, "Sending fetch request for v2 descriptor for " "service '%s' with descriptor ID '%s', auth type %d, " "and descriptor cookie '%s' to hidden service " diff --git a/src/or/rendclient.h b/src/or/rendclient.h index 164305a773..ff0f4084fd 100644 --- a/src/or/rendclient.h +++ b/src/or/rendclient.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c index bc53762fb6..e1236bdd0f 100644 --- a/src/or/rendcommon.c +++ b/src/or/rendcommon.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendcommon.h b/src/or/rendcommon.h index 942ace5761..94c2480d86 100644 --- a/src/or/rendcommon.h +++ b/src/or/rendcommon.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendmid.c b/src/or/rendmid.c index 57c8cfac92..23c3deddaa 100644 --- a/src/or/rendmid.c +++ b/src/or/rendmid.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -96,7 +96,8 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, /* Close any other intro circuits with the same pk. */ c = NULL; - while ((c = hs_circuitmap_get_intro_circ_v2((const uint8_t *)pk_digest))) { + while ((c = hs_circuitmap_get_intro_circ_v2_relay_side( + (const uint8_t *)pk_digest))) { log_info(LD_REND, "Replacing old circuit for service %s", safe_str(serviceid)); circuit_mark_for_close(TO_CIRCUIT(c), END_CIRC_REASON_FINISHED); @@ -111,7 +112,7 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request, /* Now, set up this circuit. */ circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT); - hs_circuitmap_register_intro_circ_v2(circ, (uint8_t *)pk_digest); + hs_circuitmap_register_intro_circ_v2_relay_side(circ, (uint8_t *)pk_digest); log_info(LD_REND, "Established introduction point on circuit %u for service %s", @@ -165,7 +166,8 @@ rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request, /* The first 20 bytes are all we look at: they have a hash of the service's * PK. */ - intro_circ = hs_circuitmap_get_intro_circ_v2((const uint8_t*)request); + intro_circ = hs_circuitmap_get_intro_circ_v2_relay_side( + (const uint8_t*)request); if (!intro_circ) { log_info(LD_REND, "No intro circ found for INTRODUCE1 cell (%s) from circuit %u; " @@ -242,7 +244,7 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request, goto err; } - if (hs_circuitmap_get_rend_circ(request)) { + if (hs_circuitmap_get_rend_circ_relay_side(request)) { log_warn(LD_PROTOCOL, "Duplicate rendezvous cookie in ESTABLISH_RENDEZVOUS."); goto err; @@ -258,7 +260,7 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request, } circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_POINT_WAITING); - hs_circuitmap_register_rend_circ(circ, request); + hs_circuitmap_register_rend_circ_relay_side(circ, request); base16_encode(hexid,9,(char*)request,4); @@ -307,7 +309,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, "Got request for rendezvous from circuit %u to cookie %s.", (unsigned)circ->p_circ_id, hexid); - rend_circ = hs_circuitmap_get_rend_circ(request); + rend_circ = hs_circuitmap_get_rend_circ_relay_side(request); if (!rend_circ) { log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL, "Rejecting RENDEZVOUS1 cell with unrecognized rendezvous cookie %s.", @@ -342,7 +344,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request, circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_ESTABLISHED); circuit_change_purpose(TO_CIRCUIT(rend_circ), CIRCUIT_PURPOSE_REND_ESTABLISHED); - hs_circuitmap_remove_circuit(circ); + hs_circuitmap_remove_circuit(TO_CIRCUIT(circ)); rend_circ->rend_splice = circ; circ->rend_splice = rend_circ; diff --git a/src/or/rendmid.h b/src/or/rendmid.h index 347d745853..daf9e2885e 100644 --- a/src/or/rendmid.h +++ b/src/or/rendmid.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rendservice.c b/src/or/rendservice.c index 1d6fc0f96d..4024ea17de 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -76,13 +76,11 @@ static ssize_t rend_service_parse_intro_for_v3( static int rend_service_check_private_dir(const or_options_t *options, const rend_service_t *s, int create); -static int rend_service_check_private_dir_impl(const or_options_t *options, - const rend_service_t *s, - int create); static const smartlist_t* rend_get_service_list( const smartlist_t* substitute_service_list); static smartlist_t* rend_get_service_list_mutable( smartlist_t* substitute_service_list); +static int rend_max_intro_circs_per_period(unsigned int n_intro_points_wanted); /** Represents the mapping from a virtual port of a rendezvous service to * a real port on some IP. @@ -100,26 +98,6 @@ struct rend_service_port_config_s { char unix_addr[FLEXIBLE_ARRAY_MEMBER]; }; -/** Try to maintain this many intro points per service by default. */ -#define NUM_INTRO_POINTS_DEFAULT 3 -/** Maximum number of intro points per service. */ -#define NUM_INTRO_POINTS_MAX 10 -/** Number of extra intro points we launch if our set of intro nodes is - * empty. See proposal 155, section 4. */ -#define NUM_INTRO_POINTS_EXTRA 2 - -/** If we can't build our intro circuits, don't retry for this long. */ -#define INTRO_CIRC_RETRY_PERIOD (60*5) -/** Don't try to build more than this many circuits before giving up - * for a while.*/ -#define MAX_INTRO_CIRCS_PER_PERIOD 10 -/** How many times will a hidden service operator attempt to connect to - * a requested rendezvous point before giving up? */ -#define MAX_REND_FAILURES 1 -/** How many seconds should we spend trying to connect to a requested - * rendezvous point before giving up? */ -#define MAX_REND_TIMEOUT 30 - /* Hidden service directory file names: * new file names should be added to rend_service_add_filenames_to_list() * for sandboxing purposes. */ @@ -128,9 +106,12 @@ static const char *hostname_fname = "hostname"; static const char *client_keys_fname = "client_keys"; static const char *sos_poison_fname = "onion_service_non_anonymous"; -/** A list of rend_service_t's for services run on this OP. - */ +/** A list of rend_service_t's for services run on this OP. */ static smartlist_t *rend_service_list = NULL; +/** A list of rend_service_t's for services run on this OP which is used as a + * staging area before they are put in the main list in order to prune dying + * service on config reload. */ +static smartlist_t *rend_service_staging_list = NULL; /* Like rend_get_service_list_mutable, but returns a read-only list. */ static const smartlist_t* @@ -264,35 +245,23 @@ rend_service_free_all(void) rend_service_list = NULL; } -/** Validate <b>service</b> and add it to <b>service_list</b>, or to - * the global rend_service_list if <b>service_list</b> is NULL. - * Return 0 on success. On failure, free <b>service</b> and return -1. - * Takes ownership of <b>service</b>. - */ +/* Validate a <b>service</b>. Use the <b>service_list</b> to make sure there + * is no duplicate entry for the given service object. Return 0 if valid else + * -1 if not.*/ static int -rend_add_service(smartlist_t *service_list, rend_service_t *service) +rend_validate_service(const smartlist_t *service_list, + const rend_service_t *service) { - int i; - rend_service_port_config_t *p; + int dupe = 0; + tor_assert(service_list); tor_assert(service); - smartlist_t *s_list = rend_get_service_list_mutable(service_list); - /* We must have a service list, even if it's a temporary one, so we can - * check for duplicate services */ - if (BUG(!s_list)) { - return -1; - } - - service->intro_nodes = smartlist_new(); - service->expiring_nodes = smartlist_new(); - if (service->max_streams_per_circuit < 0) { log_warn(LD_CONFIG, "Hidden service (%s) configured with negative max " "streams per circuit.", rend_service_escaped_dir(service)); - rend_service_free(service); - return -1; + goto invalid; } if (service->max_streams_close_circuit < 0 || @@ -300,87 +269,107 @@ rend_add_service(smartlist_t *service_list, rend_service_t *service) log_warn(LD_CONFIG, "Hidden service (%s) configured with invalid " "max streams handling.", rend_service_escaped_dir(service)); - rend_service_free(service); - return -1; + goto invalid; } if (service->auth_type != REND_NO_AUTH && - (!service->clients || - smartlist_len(service->clients) == 0)) { - log_warn(LD_CONFIG, "Hidden service (%s) with client authorization but no " - "clients.", + (!service->clients || smartlist_len(service->clients) == 0)) { + log_warn(LD_CONFIG, "Hidden service (%s) with client authorization but " + "no clients.", rend_service_escaped_dir(service)); - rend_service_free(service); - return -1; + goto invalid; } if (!service->ports || !smartlist_len(service->ports)) { log_warn(LD_CONFIG, "Hidden service (%s) with no ports configured.", rend_service_escaped_dir(service)); - rend_service_free(service); - return -1; - } else { - int dupe = 0; - /* XXX This duplicate check has two problems: - * - * a) It's O(n^2), but the same comment from the bottom of - * rend_config_services() should apply. - * - * b) We only compare directory paths as strings, so we can't - * detect two distinct paths that specify the same directory - * (which can arise from symlinks, case-insensitivity, bind - * mounts, etc.). - * - * It also can't detect that two separate Tor instances are trying - * to use the same HiddenServiceDir; for that, we would need a - * lock file. But this is enough to detect a simple mistake that - * at least one person has actually made. - */ - tor_assert(s_list); - if (!rend_service_is_ephemeral(service)) { - /* Skip dupe for ephemeral services. */ - SMARTLIST_FOREACH(s_list, rend_service_t*, ptr, - dupe = dupe || - !strcmp(ptr->directory, service->directory)); - if (dupe) { - log_warn(LD_REND, "Another hidden service is already configured for " - "directory %s.", - rend_service_escaped_dir(service)); - rend_service_free(service); - return -1; - } + goto invalid; + } + + /* XXX This duplicate check has two problems: + * + * a) It's O(n^2), but the same comment from the bottom of + * rend_config_services() should apply. + * + * b) We only compare directory paths as strings, so we can't + * detect two distinct paths that specify the same directory + * (which can arise from symlinks, case-insensitivity, bind + * mounts, etc.). + * + * It also can't detect that two separate Tor instances are trying + * to use the same HiddenServiceDir; for that, we would need a + * lock file. But this is enough to detect a simple mistake that + * at least one person has actually made. + */ + if (!rend_service_is_ephemeral(service)) { + /* Skip dupe for ephemeral services. */ + SMARTLIST_FOREACH(service_list, rend_service_t *, ptr, + dupe = dupe || + !strcmp(ptr->directory, service->directory)); + if (dupe) { + log_warn(LD_REND, "Another hidden service is already configured for " + "directory %s.", + rend_service_escaped_dir(service)); + goto invalid; } - log_debug(LD_REND,"Configuring service with directory %s", - rend_service_escaped_dir(service)); - for (i = 0; i < smartlist_len(service->ports); ++i) { - p = smartlist_get(service->ports, i); - if (!(p->is_unix_addr)) { - log_debug(LD_REND, - "Service maps port %d to %s", - p->virtual_port, - fmt_addrport(&p->real_addr, p->real_port)); - } else { + } + + /* Valid. */ + return 0; + invalid: + return -1; +} + +/** Add it to <b>service_list</b>, or to the global rend_service_list if + * <b>service_list</b> is NULL. Return 0 on success. On failure, free + * <b>service</b> and return -1. Takes ownership of <b>service</b>. */ +static int +rend_add_service(smartlist_t *service_list, rend_service_t *service) +{ + int i; + rend_service_port_config_t *p; + + tor_assert(service); + + smartlist_t *s_list = rend_get_service_list_mutable(service_list); + /* We must have a service list, even if it's a temporary one, so we can + * check for duplicate services */ + if (BUG(!s_list)) { + return -1; + } + + service->intro_nodes = smartlist_new(); + service->expiring_nodes = smartlist_new(); + + log_debug(LD_REND,"Configuring service with directory %s", + rend_service_escaped_dir(service)); + for (i = 0; i < smartlist_len(service->ports); ++i) { + p = smartlist_get(service->ports, i); + if (!(p->is_unix_addr)) { + log_debug(LD_REND, + "Service maps port %d to %s", + p->virtual_port, + fmt_addrport(&p->real_addr, p->real_port)); + } else { #ifdef HAVE_SYS_UN_H - log_debug(LD_REND, - "Service maps port %d to socket at \"%s\"", - p->virtual_port, p->unix_addr); + log_debug(LD_REND, + "Service maps port %d to socket at \"%s\"", + p->virtual_port, p->unix_addr); #else - log_warn(LD_BUG, - "Service maps port %d to an AF_UNIX socket, but we " - "have no AF_UNIX support on this platform. This is " - "probably a bug.", - p->virtual_port); - rend_service_free(service); - return -1; + log_warn(LD_BUG, + "Service maps port %d to an AF_UNIX socket, but we " + "have no AF_UNIX support on this platform. This is " + "probably a bug.", + p->virtual_port); + rend_service_free(service); + return -1; #endif /* defined(HAVE_SYS_UN_H) */ - } } - /* The service passed all the checks */ - tor_assert(s_list); - smartlist_add(s_list, service); - return 0; } - /* NOTREACHED */ + /* The service passed all the checks */ + tor_assert(s_list); + smartlist_add(s_list, service); + return 0; } /** Return a new rend_service_port_config_t with its path set to @@ -542,18 +531,34 @@ rend_service_check_dir_and_add(smartlist_t *service_list, return rend_add_service(s_list, service); } -/* If this is a reload and there were hidden services configured before, - * keep the introduction points that are still needed and close the - * other ones. */ +/* Helper: Actual implementation of the pruning on reload which we've + * decoupled in order to make the unit test workeable without ugly hacks. + * Furthermore, this function does NOT free any memory but will nullify the + * temporary list pointer whatever happens. */ STATIC void -prune_services_on_reload(smartlist_t *old_service_list, - smartlist_t *new_service_list) +rend_service_prune_list_impl_(void) { origin_circuit_t *ocirc = NULL; - smartlist_t *surviving_services = NULL; + smartlist_t *surviving_services, *old_service_list, *new_service_list; + + /* When pruning our current service list, we must have a staging list that + * contains what we want to check else it's a code flow error. */ + tor_assert(rend_service_staging_list); - tor_assert(old_service_list); - tor_assert(new_service_list); + /* We are about to prune the current list of its dead service so set the + * semantic for that list to be the "old" one. */ + old_service_list = rend_service_list; + /* The staging list is now the "new" list so set this semantic. */ + new_service_list = rend_service_staging_list; + /* After this, whatever happens, we'll use our new list. */ + rend_service_list = new_service_list; + /* Finally, nullify the staging list pointer as we don't need it anymore + * and it needs to be NULL before the next reload. */ + rend_service_staging_list = NULL; + /* Nothing to prune if we have no service list so stop right away. */ + if (!old_service_list) { + return; + } /* This contains all _existing_ services that survives the relaod that is * that haven't been removed from the configuration. The difference between @@ -631,6 +636,27 @@ prune_services_on_reload(smartlist_t *old_service_list, smartlist_free(surviving_services); } +/* Try to prune our main service list using the temporary one that we just + * loaded and parsed successfully. The pruning process decides which onion + * services to keep and which to discard after a reload. */ +void +rend_service_prune_list(void) +{ + smartlist_t *old_service_list = rend_service_list; + /* Don't try to prune anything if we have no staging list. */ + if (!rend_service_staging_list) { + return; + } + rend_service_prune_list_impl_(); + if (old_service_list) { + /* Every remaining service in the old list have been removed from the + * configuration so clean them up safely. */ + SMARTLIST_FOREACH(old_service_list, rend_service_t *, s, + rend_service_free(s)); + smartlist_free(old_service_list); + } +} + /** Set up rend_service_list, based on the values of HiddenServiceDir and * HiddenServicePort in <b>options</b>. Return 0 on success and -1 on * failure. (If <b>validate_only</b> is set, parse, warn and return as @@ -642,24 +668,30 @@ rend_config_services(const or_options_t *options, int validate_only) config_line_t *line; rend_service_t *service = NULL; rend_service_port_config_t *portcfg; - smartlist_t *old_service_list = NULL; - smartlist_t *temp_service_list = NULL; int ok = 0; int rv = -1; - /* Use a temporary service list, so that we can check the new services' - * consistency with each other */ - temp_service_list = smartlist_new(); + /* Use the staging service list so that we can check then do the pruning + * process using the main list at the end. */ + if (rend_service_staging_list == NULL) { + rend_service_staging_list = smartlist_new(); + } for (line = options->RendConfigLines; line; line = line->next) { if (!strcasecmp(line->key, "HiddenServiceDir")) { - /* register the service we just finished parsing - * this code registers every service except the last one parsed, - * which is registered below the loop */ - if (rend_service_check_dir_and_add(temp_service_list, options, service, - validate_only) < 0) { - service = NULL; - goto free_and_return; + if (service) { + /* Validate and register the service we just finished parsing this + * code registers every service except the last one parsed, which is + * validated and registered below the loop. */ + if (rend_validate_service(rend_service_staging_list, service) < 0) { + goto free_and_return; + } + if (rend_service_check_dir_and_add(rend_service_staging_list, options, + service, validate_only) < 0) { + /* The above frees the service on error so nullify the pointer. */ + service = NULL; + goto free_and_return; + } } service = tor_malloc_zero(sizeof(rend_service_t)); service->directory = tor_strdup(line->value); @@ -854,14 +886,23 @@ rend_config_services(const or_options_t *options, int validate_only) } } } + /* Validate the last service that we just parsed. */ + if (service && + rend_validate_service(rend_service_staging_list, service) < 0) { + goto free_and_return; + } /* register the final service after we have finished parsing all services * this code only registers the last service, other services are registered * within the loop. It is ok for this service to be NULL, it is ignored. */ - if (rend_service_check_dir_and_add(temp_service_list, options, service, - validate_only) < 0) { + if (rend_service_check_dir_and_add(rend_service_staging_list, options, + service, validate_only) < 0) { + /* Service object is freed on error so nullify pointer. */ service = NULL; goto free_and_return; } + /* The service is in the staging list so nullify pointer to avoid double + * free of this object in case of error because we lost ownership of it at + * this point. */ service = NULL; /* Free the newly added services if validating */ @@ -870,31 +911,19 @@ rend_config_services(const or_options_t *options, int validate_only) goto free_and_return; } - /* Otherwise, use the newly added services as the new service list - * Since we have now replaced the global service list, from this point on we - * must succeed, or die trying. */ - old_service_list = rend_service_list; - rend_service_list = temp_service_list; - temp_service_list = NULL; - - /* If this is a reload and there were hidden services configured before, - * keep the introduction points that are still needed and close the - * other ones. */ - if (old_service_list && !validate_only) { - prune_services_on_reload(old_service_list, rend_service_list); - /* Every remaining service in the old list have been removed from the - * configuration so clean them up safely. */ - SMARTLIST_FOREACH(old_service_list, rend_service_t *, s, - rend_service_free(s)); - smartlist_free(old_service_list); - } + /* This could be a reload of configuration so try to prune the main list + * using the staging one. And we know we are not in validate mode here. + * After this, the main and staging list will point to the right place and + * be in a quiescent usable state. */ + rend_service_prune_list(); return 0; free_and_return: rend_service_free(service); - SMARTLIST_FOREACH(temp_service_list, rend_service_t *, ptr, + SMARTLIST_FOREACH(rend_service_staging_list, rend_service_t *, ptr, rend_service_free(ptr)); - smartlist_free(temp_service_list); + smartlist_free(rend_service_staging_list); + rend_service_staging_list = NULL; return rv; } @@ -1028,6 +1057,38 @@ rend_service_del_ephemeral(const char *service_id) return 0; } +/* There can be 1 second's delay due to second_elapsed_callback, and perhaps + * another few seconds due to blocking calls. */ +#define INTRO_CIRC_RETRY_PERIOD_SLOP 10 + +/** Log information about the intro point creation rate and current intro + * points for service, upgrading the log level from min_severity to warn if + * we have stopped launching new intro point circuits. */ +static void +rend_log_intro_limit(const rend_service_t *service, int min_severity) +{ + int exceeded_limit = (service->n_intro_circuits_launched >= + rend_max_intro_circs_per_period( + service->n_intro_points_wanted)); + int severity = min_severity; + /* We stopped creating circuits */ + if (exceeded_limit) { + severity = LOG_WARN; + } + time_t intro_period_elapsed = time(NULL) - service->intro_period_started; + tor_assert_nonfatal(intro_period_elapsed >= 0); + log_fn(severity, LD_REND, "Hidden service %s %s %d intro points in the last " + "%d seconds. Intro circuit launches are limited to %d per %d " + "seconds.", + service->service_id, + exceeded_limit ? "exceeded launch limit with" : "launched", + service->n_intro_circuits_launched, + (int)intro_period_elapsed, + rend_max_intro_circs_per_period(service->n_intro_points_wanted), + INTRO_CIRC_RETRY_PERIOD); + rend_service_dump_stats(severity); +} + /** Replace the old value of <b>service</b>-\>desc with one that reflects * the other fields in service. */ @@ -1035,7 +1096,6 @@ static void rend_service_update_descriptor(rend_service_t *service) { rend_service_descriptor_t *d; - origin_circuit_t *circ; int i; rend_service_descriptor_free(service->desc); @@ -1056,9 +1116,10 @@ rend_service_update_descriptor(rend_service_t *service) /* This intro point won't be listed in the descriptor... */ intro_svc->listed_in_last_desc = 0; - circ = find_intro_circuit(intro_svc, service->pk_digest); - if (!circ || circ->base_.purpose != CIRCUIT_PURPOSE_S_INTRO) { - /* This intro point's circuit isn't finished yet. Don't list it. */ + /* circuit_established is set in rend_service_intro_established(), and + * checked every second in rend_consider_services_intro_points(), so it's + * safe to use it here */ + if (!intro_svc->circuit_established) { continue; } @@ -1080,6 +1141,26 @@ rend_service_update_descriptor(rend_service_t *service) intro_svc->time_published = time(NULL); } } + + /* Check that we have the right number of intro points */ + unsigned int have_intro = (unsigned int)smartlist_len(d->intro_nodes); + if (have_intro != service->n_intro_points_wanted) { + int severity; + /* Getting less than we wanted or more than we're allowed is serious */ + if (have_intro < service->n_intro_points_wanted || + have_intro > NUM_INTRO_POINTS_MAX) { + severity = LOG_WARN; + } else { + /* Getting more than we wanted is weird, but less of a problem */ + severity = LOG_NOTICE; + } + log_fn(severity, LD_REND, "Hidden service %s wanted %d intro points, but " + "descriptor was updated with %d instead.", + service->service_id, + service->n_intro_points_wanted, have_intro); + /* Now log an informative message about how we might have got here. */ + rend_log_intro_limit(service, severity); + } } /* Allocate and return a string containing the path to file_name in @@ -1237,7 +1318,8 @@ poison_new_single_onion_hidden_service_dir_impl(const rend_service_t *service, } /* Make sure the directory was created before calling this function. */ - if (BUG(rend_service_check_private_dir_impl(options, service, 0) < 0)) + if (BUG(hs_check_service_private_dir(options->User, service->directory, + service->dir_group_readable, 0) < 0)) return -1; poison_fname = rend_service_sos_poison_path(service); @@ -1387,32 +1469,6 @@ rend_service_derive_key_digests(struct rend_service_t *s) return 0; } -/* Implements the directory check from rend_service_check_private_dir, - * without doing the single onion poison checks. */ -static int -rend_service_check_private_dir_impl(const or_options_t *options, - const rend_service_t *s, - int create) -{ - cpd_check_t check_opts = CPD_NONE; - if (create) { - check_opts |= CPD_CREATE; - } else { - check_opts |= CPD_CHECK_MODE_ONLY; - check_opts |= CPD_CHECK; - } - if (s->dir_group_readable) { - check_opts |= CPD_GROUP_READ; - } - /* Check/create directory */ - if (check_private_dir(s->directory, check_opts, options->User) < 0) { - log_warn(LD_REND, "Checking service directory %s failed.", s->directory); - return -1; - } - - return 0; -} - /** Make sure that the directory for <b>s</b> is private, using the config in * <b>options</b>. * If <b>create</b> is true: @@ -1433,7 +1489,8 @@ rend_service_check_private_dir(const or_options_t *options, } /* Check/create directory */ - if (rend_service_check_private_dir_impl(options, s, create) < 0) { + if (hs_check_service_private_dir(options->User, s->directory, + s->dir_group_readable, create) < 0) { return -1; } @@ -3174,8 +3231,9 @@ count_intro_point_circuits(const rend_service_t *service) of bytes written. On fail, return -1. */ STATIC ssize_t -encode_establish_intro_cell_legacy(char *cell_body_out, crypto_pk_t *intro_key, - char *rend_circ_nonce) +encode_establish_intro_cell_legacy(char *cell_body_out, + size_t cell_body_out_len, + crypto_pk_t *intro_key, char *rend_circ_nonce) { int retval = -1; int r; @@ -3202,7 +3260,7 @@ encode_establish_intro_cell_legacy(char *cell_body_out, crypto_pk_t *intro_key, len += 20; note_crypto_pk_op(REND_SERVER); r = crypto_pk_private_sign_digest(intro_key, cell_body_out+len, - sizeof(cell_body_out)-len, + cell_body_out_len - len, cell_body_out, len); if (r<0) { log_warn(LD_BUG, "Internal error: couldn't sign introduction request."); @@ -3313,8 +3371,9 @@ rend_service_intro_has_opened(origin_circuit_t *circuit) /* Send the ESTABLISH_INTRO cell */ { ssize_t len; - len = encode_establish_intro_cell_legacy(buf, circuit->intro_key, - circuit->cpath->prev->rend_circ_nonce); + len = encode_establish_intro_cell_legacy(buf, sizeof(buf), + circuit->intro_key, + circuit->cpath->prev->rend_circ_nonce); if (len < 0) { reason = END_CIRC_REASON_INTERNAL; goto err; @@ -3669,13 +3728,16 @@ directory_post_to_hs_dir(rend_service_descriptor_t *renddesc, * request. Lookup is made in rend_service_desc_has_uploaded(). */ rend_data = rend_data_client_create(service_id, desc->desc_id, NULL, REND_NO_AUTH); - directory_initiate_command_routerstatus_rend(hs_dir, - DIR_PURPOSE_UPLOAD_RENDDESC_V2, - ROUTER_PURPOSE_GENERAL, - DIRIND_ANONYMOUS, NULL, - desc->desc_str, - strlen(desc->desc_str), - 0, rend_data, NULL); + directory_request_t *req = + directory_request_new(DIR_PURPOSE_UPLOAD_RENDDESC_V2); + directory_request_set_routerstatus(req, hs_dir); + directory_request_set_indirection(req, DIRIND_ANONYMOUS); + directory_request_set_payload(req, + desc->desc_str, strlen(desc->desc_str)); + directory_request_set_rend_query(req, rend_data); + directory_initiate_request(req); + directory_request_free(req); + rend_data_free(rend_data); base32_encode(desc_id_base32, sizeof(desc_id_base32), desc->desc_id, DIGEST_LEN); @@ -4015,6 +4077,18 @@ rend_service_desc_has_uploaded(const rend_data_t *rend_data) } SMARTLIST_FOREACH_END(intro); } +/** Don't try to build more than this many circuits before giving up + * for a while. Dynamically calculated based on the configured number of + * introduction points for the service, n_intro_points_wanted. */ +static int +rend_max_intro_circs_per_period(unsigned int n_intro_points_wanted) +{ + /* Allow all but one of the initial connections to fail and be + * retried. (If all fail, we *want* to wait, because something is broken.) */ + tor_assert(n_intro_points_wanted <= NUM_INTRO_POINTS_MAX); + return (int)(2*n_intro_points_wanted + NUM_INTRO_POINTS_EXTRA); +} + /** For every service, check how many intro points it currently has, and: * - Invalidate introdution points based on specific criteria, see * remove_invalid_intro_points comments. @@ -4059,23 +4133,29 @@ rend_consider_services_intro_points(void) smartlist_clear(exclude_nodes); smartlist_clear(retry_nodes); + /* Cleanup the invalid intro points and save the node objects, if any, + * in the exclude_nodes and retry_nodes lists. */ + remove_invalid_intro_points(service, exclude_nodes, retry_nodes, now); + /* This retry period is important here so we don't stress circuit * creation. */ + if (now > service->intro_period_started + INTRO_CIRC_RETRY_PERIOD) { - /* One period has elapsed; we can try building circuits again. */ + /* One period has elapsed: + * - if we stopped, we can try building circuits again, + * - if we haven't, we reset the circuit creation counts. */ + rend_log_intro_limit(service, LOG_INFO); service->intro_period_started = now; service->n_intro_circuits_launched = 0; } else if (service->n_intro_circuits_launched >= - MAX_INTRO_CIRCS_PER_PERIOD) { + rend_max_intro_circs_per_period( + service->n_intro_points_wanted)) { /* We have failed too many times in this period; wait for the next - * one before we try again. */ + * one before we try to initiate any more connections. */ + rend_log_intro_limit(service, LOG_WARN); continue; } - /* Cleanup the invalid intro points and save the node objects, if apply, - * in the exclude_nodes and retry_nodes list. */ - remove_invalid_intro_points(service, exclude_nodes, retry_nodes, now); - /* Let's try to rebuild circuit on the nodes we want to retry on. */ SMARTLIST_FOREACH_BEGIN(retry_nodes, rend_intro_point_t *, intro) { r = rend_service_launch_establish_intro(service, intro); @@ -4518,3 +4598,19 @@ rend_service_non_anonymous_mode_enabled(const or_options_t *options) return options->HiddenServiceNonAnonymousMode ? 1 : 0; } +#ifdef TOR_UNIT_TESTS + +STATIC void +set_rend_service_list(smartlist_t *new_list) +{ + rend_service_list = new_list; +} + +STATIC void +set_rend_rend_service_staging_list(smartlist_t *new_list) +{ + rend_service_staging_list = new_list; +} + +#endif /* TOR_UNIT_TESTS */ + diff --git a/src/or/rendservice.h b/src/or/rendservice.h index 3bfac0bece..1583a6010b 100644 --- a/src/or/rendservice.h +++ b/src/or/rendservice.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -130,15 +130,22 @@ STATIC int rend_service_poison_new_single_onion_dir( const rend_service_t *s, const or_options_t* options); STATIC ssize_t encode_establish_intro_cell_legacy(char *cell_body_out, + size_t cell_body_out_len, crypto_pk_t *intro_key, char *rend_circ_nonce); -STATIC void prune_services_on_reload(smartlist_t *old_service_list, - smartlist_t *new_service_list); +#ifdef TOR_UNIT_TESTS -#endif +STATIC void set_rend_service_list(smartlist_t *new_list); +STATIC void set_rend_rend_service_staging_list(smartlist_t *new_list); +STATIC void rend_service_prune_list_impl_(void); + +#endif /* TOR_UNIT_TESTS */ + +#endif /* RENDSERVICE_PRIVATE */ int num_rend_services(void); int rend_config_services(const or_options_t *options, int validate_only); +void rend_service_prune_list(void); int rend_service_load_all_keys(const smartlist_t *service_list); void rend_services_add_filenames_to_lists(smartlist_t *open_lst, smartlist_t *stat_lst); diff --git a/src/or/rephist.c b/src/or/rephist.c index aade1a0f9e..96087f92e7 100644 --- a/src/or/rephist.c +++ b/src/or/rephist.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/rephist.h b/src/or/rephist.h index 5a1ad82663..2b1c2e7ec7 100644 --- a/src/or/rephist.h +++ b/src/or/rephist.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/replaycache.c b/src/or/replaycache.c index 8290fa6964..3d42deb90a 100644 --- a/src/or/replaycache.c +++ b/src/or/replaycache.c @@ -1,4 +1,4 @@ - /* Copyright (c) 2012-2016, The Tor Project, Inc. */ + /* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/replaycache.h b/src/or/replaycache.h index 64a6caf5f5..0d637939a4 100644 --- a/src/or/replaycache.h +++ b/src/or/replaycache.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/router.c b/src/or/router.c index 82f963a3f7..6318f78549 100644 --- a/src/or/router.c +++ b/src/or/router.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTER_PRIVATE @@ -148,6 +148,51 @@ dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last) tor_mutex_release(key_lock); } +/** Expire our old set of onion keys. This is done by setting + * last_curve25519_onion_key and lastonionkey to all zero's and NULL + * respectively. + * + * This function does not perform any grace period checks for the old onion + * keys. + */ +void +expire_old_onion_keys(void) +{ + char *fname = NULL; + + tor_mutex_acquire(key_lock); + + /* Free lastonionkey and set it to NULL. */ + if (lastonionkey) { + crypto_pk_free(lastonionkey); + lastonionkey = NULL; + } + + /* We zero out the keypair. See the tor_mem_is_zero() check made in + * construct_ntor_key_map() below. */ + memset(&last_curve25519_onion_key, 0, sizeof(last_curve25519_onion_key)); + + tor_mutex_release(key_lock); + + fname = get_datadir_fname2("keys", "secret_onion_key.old"); + if (file_status(fname) == FN_FILE) { + if (tor_unlink(fname) != 0) { + log_warn(LD_FS, "Couldn't unlink old onion key file %s: %s", + fname, strerror(errno)); + } + } + tor_free(fname); + + fname = get_datadir_fname2("keys", "secret_onion_key_ntor.old"); + if (file_status(fname) == FN_FILE) { + if (tor_unlink(fname) != 0) { + log_warn(LD_FS, "Couldn't unlink old ntor onion key file %s: %s", + fname, strerror(errno)); + } + } + tor_free(fname); +} + /** Return the current secret onion key for the ntor handshake. Must only * be called from the main thread. */ static const curve25519_keypair_t * @@ -683,6 +728,47 @@ v3_authority_check_key_expiry(void) last_warned = now; } +/** Get the lifetime of an onion key in days. This value is defined by the + * network consesus parameter "onion-key-rotation-days". Always returns a value + * between <b>MIN_ONION_KEY_LIFETIME_DAYS</b> and + * <b>MAX_ONION_KEY_LIFETIME_DAYS</b>. + */ +static int +get_onion_key_rotation_days_(void) +{ + return networkstatus_get_param(NULL, + "onion-key-rotation-days", + DEFAULT_ONION_KEY_LIFETIME_DAYS, + MIN_ONION_KEY_LIFETIME_DAYS, + MAX_ONION_KEY_LIFETIME_DAYS); +} + +/** Get the current lifetime of an onion key in seconds. This value is defined + * by the network consesus parameter "onion-key-rotation-days", but the value + * is converted to seconds. + */ +int +get_onion_key_lifetime(void) +{ + return get_onion_key_rotation_days_()*24*60*60; +} + +/** Get the grace period of an onion key in seconds. This value is defined by + * the network consesus parameter "onion-key-grace-period-days", but the value + * is converted to seconds. + */ +int +get_onion_key_grace_period(void) +{ + int grace_period; + grace_period = networkstatus_get_param(NULL, + "onion-key-grace-period-days", + DEFAULT_ONION_KEY_GRACE_PERIOD_DAYS, + MIN_ONION_KEY_GRACE_PERIOD_DAYS, + get_onion_key_rotation_days_()); + return grace_period*24*60*60; +} + /** Set up Tor's TLS contexts, based on our configuration and keys. Return 0 * on success, and -1 on failure. */ int @@ -928,7 +1014,7 @@ init_keys(void) /* We have no LastRotatedOnionKey set; either we just created the key * or it's a holdover from 0.1.2.4-alpha-dev or earlier. In either case, * start the clock ticking now so that we will eventually rotate it even - * if we don't stay up for a full MIN_ONION_KEY_LIFETIME. */ + * if we don't stay up for the full lifetime of an onion key. */ state->LastRotatedOnionKey = onionkey_set_at = now; or_state_mark_dirty(state, options->AvoidDiskWrites ? time(NULL)+3600 : 0); @@ -1384,13 +1470,23 @@ consider_testing_reachability(int test_or, int test_dir) !connection_get_by_type_addr_port_purpose( CONN_TYPE_DIR, &addr, me->dir_port, DIR_PURPOSE_FETCH_SERVERDESC)) { + tor_addr_port_t my_orport, my_dirport; + memcpy(&my_orport.addr, &addr, sizeof(addr)); + memcpy(&my_dirport.addr, &addr, sizeof(addr)); + my_orport.port = me->or_port; + my_dirport.port = me->dir_port; /* ask myself, via tor, for my server descriptor. */ - directory_initiate_command(&addr, me->or_port, - &addr, me->dir_port, - me->cache_info.identity_digest, - DIR_PURPOSE_FETCH_SERVERDESC, - ROUTER_PURPOSE_GENERAL, - DIRIND_ANON_DIRPORT, "authority.z", NULL, 0, 0); + directory_request_t *req = + directory_request_new(DIR_PURPOSE_FETCH_SERVERDESC); + directory_request_set_or_addr_port(req, &my_orport); + directory_request_set_dir_addr_port(req, &my_dirport); + directory_request_set_directory_id_digest(req, + me->cache_info.identity_digest); + // ask via an anon circuit, connecting to our dirport. + directory_request_set_indirection(req, DIRIND_ANON_DIRPORT); + directory_request_set_resource(req, "authority.z"); + directory_initiate_request(req); + directory_request_free(req); } } @@ -2760,7 +2856,7 @@ router_dump_router_to_string(routerinfo_t *router, make_ntor_onion_key_crosscert(ntor_keypair, &router->cache_info.signing_key_cert->signing_key, router->cache_info.published_on, - MIN_ONION_KEY_LIFETIME, &sign); + get_onion_key_lifetime(), &sign); if (!cert) { log_warn(LD_BUG,"make_ntor_onion_key_crosscert failed!"); goto err; diff --git a/src/or/router.h b/src/or/router.h index c30a0301b7..9c5def5218 100644 --- a/src/or/router.h +++ b/src/or/router.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -27,10 +27,13 @@ crypto_pk_t *get_my_v3_authority_signing_key(void); authority_cert_t *get_my_v3_legacy_cert(void); crypto_pk_t *get_my_v3_legacy_signing_key(void); void dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last); +void expire_old_onion_keys(void); void rotate_onion_key(void); crypto_pk_t *init_key_from_file(const char *fname, int generate, int severity, int log_greeting); void v3_authority_check_key_expiry(void); +int get_onion_key_lifetime(void); +int get_onion_key_grace_period(void); di_digest256_map_t *construct_ntor_key_map(void); void ntor_key_map_free(di_digest256_map_t *map); diff --git a/src/or/routerkeys.c b/src/or/routerkeys.c index 6259e3f5a0..01f5e98bd1 100644 --- a/src/or/routerkeys.c +++ b/src/or/routerkeys.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/routerkeys.h b/src/or/routerkeys.h index d2027f4bbe..6453c785b5 100644 --- a/src/or/routerkeys.h +++ b/src/or/routerkeys.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_ROUTERKEYS_H diff --git a/src/or/routerlist.c b/src/or/routerlist.c index 45b3838792..8927786fe8 100644 --- a/src/or/routerlist.c +++ b/src/or/routerlist.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -947,6 +947,7 @@ authority_certs_fetch_resource_impl(const char *resource, const dir_indirection_t indirection = get_via_tor ? DIRIND_ANONYMOUS : DIRIND_ONEHOP; + directory_request_t *req = NULL; /* If we've just downloaded a consensus from a bridge, re-use that * bridge */ if (options->UseBridges && node && node->ri && !get_via_tor) { @@ -955,23 +956,25 @@ authority_certs_fetch_resource_impl(const char *resource, /* we are willing to use a non-preferred address if we need to */ fascist_firewall_choose_address_node(node, FIREWALL_OR_CONNECTION, 0, &or_ap); - directory_initiate_command(&or_ap.addr, or_ap.port, - NULL, 0, /*no dirport*/ - dir_hint, - DIR_PURPOSE_FETCH_CERTIFICATE, - 0, - indirection, - resource, NULL, 0, 0); - return; - } - if (rs) { - /* If we've just downloaded a consensus from a directory, re-use that + req = directory_request_new(DIR_PURPOSE_FETCH_CERTIFICATE); + directory_request_set_or_addr_port(req, &or_ap); + if (dir_hint) + directory_request_set_directory_id_digest(req, dir_hint); + } else if (rs) { + /* And if we've just downloaded a consensus from a directory, re-use that * directory */ - directory_initiate_command_routerstatus(rs, - DIR_PURPOSE_FETCH_CERTIFICATE, - 0, indirection, resource, NULL, - 0, 0, NULL); + req = directory_request_new(DIR_PURPOSE_FETCH_CERTIFICATE); + directory_request_set_routerstatus(req, rs); + } + + if (req) { + /* We've set up a request object -- fill in the other request fields, and + * send the request. */ + directory_request_set_indirection(req, indirection); + directory_request_set_resource(req, resource); + directory_initiate_request(req); + directory_request_free(req); return; } @@ -3045,8 +3048,8 @@ router_get_by_extrainfo_digest,(const char *digest)) /** Return the signed descriptor for the extrainfo_t in our routerlist whose * extra-info-digest is <b>digest</b>. Return NULL if no such extra-info * document is known. */ -signed_descriptor_t * -extrainfo_get_by_descriptor_digest(const char *digest) +MOCK_IMPL(signed_descriptor_t *, +extrainfo_get_by_descriptor_digest,(const char *digest)) { extrainfo_t *ei; tor_assert(digest); @@ -4932,10 +4935,11 @@ MOCK_IMPL(STATIC void, initiate_descriptor_downloads, if (source) { /* We know which authority or directory mirror we want. */ - directory_initiate_command_routerstatus(source, purpose, - ROUTER_PURPOSE_GENERAL, - DIRIND_ONEHOP, - resource, NULL, 0, 0, NULL); + directory_request_t *req = directory_request_new(purpose); + directory_request_set_routerstatus(req, source); + directory_request_set_resource(req, resource); + directory_initiate_request(req); + directory_request_free(req); } else { directory_get_from_dirserver(purpose, ROUTER_PURPOSE_GENERAL, resource, pds_flags, DL_WANT_ANY_DIRSERVER); diff --git a/src/or/routerlist.h b/src/or/routerlist.h index 8b68d69f28..5c1f76c8e7 100644 --- a/src/or/routerlist.h +++ b/src/or/routerlist.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -92,7 +92,8 @@ routerinfo_t *router_get_mutable_by_digest(const char *digest); signed_descriptor_t *router_get_by_descriptor_digest(const char *digest); MOCK_DECL(signed_descriptor_t *,router_get_by_extrainfo_digest, (const char *digest)); -signed_descriptor_t *extrainfo_get_by_descriptor_digest(const char *digest); +MOCK_DECL(signed_descriptor_t *,extrainfo_get_by_descriptor_digest, + (const char *digest)); const char *signed_descriptor_get_body(const signed_descriptor_t *desc); const char *signed_descriptor_get_annotations(const signed_descriptor_t *desc); routerlist_t *router_get_routerlist(void); diff --git a/src/or/routerparse.c b/src/or/routerparse.c index 98167d44f8..fa79cf7132 100644 --- a/src/or/routerparse.c +++ b/src/or/routerparse.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -359,6 +359,7 @@ static addr_policy_t *router_parse_addr_policy_private(directory_token_t *tok); static int router_get_hash_impl_helper(const char *s, size_t s_len, const char *start_str, const char *end_str, char end_c, + int log_severity, const char **start_out, const char **end_out); static int router_get_hash_impl(const char *s, size_t s_len, char *digest, const char *start_str, const char *end_str, @@ -988,6 +989,41 @@ router_get_router_hash(const char *s, size_t s_len, char *digest) DIGEST_SHA1); } +/** Try to find the start and end of the signed portion of a networkstatus + * document in <b>s</b>. On success, set <b>start_out</b> to the first + * character of the document, and <b>end_out</b> to a position one after the + * final character of the signed document, and return 0. On failure, return + * -1. */ +int +router_get_networkstatus_v3_signed_boundaries(const char *s, + const char **start_out, + const char **end_out) +{ + return router_get_hash_impl_helper(s, strlen(s), + "network-status-version", + "\ndirectory-signature", + ' ', LOG_INFO, + start_out, end_out); +} + +/** Set <b>digest_out</b> to the SHA3-256 digest of the signed portion of the + * networkstatus vote in <b>s</b> -- or of the entirety of <b>s</b> if no + * signed portion can be identified. Return 0 on success, -1 on failure. */ +int +router_get_networkstatus_v3_sha3_as_signed(uint8_t *digest_out, + const char *s) +{ + const char *start, *end; + if (router_get_networkstatus_v3_signed_boundaries(s, &start, &end) < 0) { + start = s; + end = s + strlen(s); + } + tor_assert(start); + tor_assert(end); + return crypto_digest256((char*)digest_out, start, end-start, + DIGEST_SHA3_256); +} + /** Set <b>digests</b> to all the digests of the consensus document in * <b>s</b> */ int @@ -1787,7 +1823,8 @@ router_parse_entry_from_string(const char *s, const char *end, if (router_get_hash_impl_helper(s, end-s, "router ", "\nrouter-sig-ed25519", - ' ', &signed_start, &signed_end) < 0) { + ' ', LOG_WARN, + &signed_start, &signed_end) < 0) { log_warn(LD_DIR, "Can't find ed25519-signed portion of descriptor"); goto err; } @@ -2030,6 +2067,9 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, * parse that's covered by the hash. */ int can_dl_again = 0; + if (BUG(s == NULL)) + return NULL; + if (!end) { end = s + strlen(s); } @@ -2137,7 +2177,8 @@ extrainfo_parse_entry_from_string(const char *s, const char *end, if (router_get_hash_impl_helper(s, end-s, "extra-info ", "\nrouter-sig-ed25519", - ' ', &signed_start, &signed_end) < 0) { + ' ', LOG_WARN, + &signed_start, &signed_end) < 0) { log_warn(LD_DIR, "Can't find ed25519-signed portion of extrainfo"); goto err; } @@ -2664,6 +2705,10 @@ routerstatus_parse_entry_from_string(memarea_t *area, protocol_list_supports_protocol(tok->args[0], PRT_RELAY, 2); rs->supports_ed25519_link_handshake = protocol_list_supports_protocol(tok->args[0], PRT_LINKAUTH, 3); + rs->supports_ed25519_hs_intro = + protocol_list_supports_protocol(tok->args[0], PRT_HSINTRO, 4); + rs->supports_v3_hsdir = + protocol_list_supports_protocol(tok->args[0], PRT_HSDIR, 2); } if ((tok = find_opt_by_keyword(tokens, K_V))) { tor_assert(tok->n_args == 1); @@ -3339,6 +3384,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, networkstatus_voter_info_t *voter = NULL; networkstatus_t *ns = NULL; common_digests_t ns_digests; + uint8_t sha3_as_signed[DIGEST256_LEN]; const char *cert, *end_of_header, *end_of_footer, *s_dup = s; directory_token_t *tok; struct in_addr in; @@ -3352,7 +3398,8 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, if (eos_out) *eos_out = NULL; - if (router_get_networkstatus_v3_hashes(s, &ns_digests)) { + if (router_get_networkstatus_v3_hashes(s, &ns_digests) || + router_get_networkstatus_v3_sha3_as_signed(sha3_as_signed, s)<0) { log_warn(LD_DIR, "Unable to compute digest of network-status"); goto err; } @@ -3369,6 +3416,7 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out, ns = tor_malloc_zero(sizeof(networkstatus_t)); memcpy(&ns->digests, &ns_digests, sizeof(ns_digests)); + memcpy(&ns->digest_sha3_as_signed, sha3_as_signed, sizeof(sha3_as_signed)); tok = find_by_keyword(tokens, K_NETWORK_STATUS_VERSION); tor_assert(tok); @@ -4464,16 +4512,18 @@ static int router_get_hash_impl_helper(const char *s, size_t s_len, const char *start_str, const char *end_str, char end_c, + int log_severity, const char **start_out, const char **end_out) { const char *start, *end; start = tor_memstr(s, s_len, start_str); if (!start) { - log_warn(LD_DIR,"couldn't find start of hashed material \"%s\"",start_str); + log_fn(log_severity,LD_DIR, + "couldn't find start of hashed material \"%s\"",start_str); return -1; } if (start != s && *(start-1) != '\n') { - log_warn(LD_DIR, + log_fn(log_severity,LD_DIR, "first occurrence of \"%s\" is not at the start of a line", start_str); return -1; @@ -4481,12 +4531,14 @@ router_get_hash_impl_helper(const char *s, size_t s_len, end = tor_memstr(start+strlen(start_str), s_len - (start-s) - strlen(start_str), end_str); if (!end) { - log_warn(LD_DIR,"couldn't find end of hashed material \"%s\"",end_str); + log_fn(log_severity,LD_DIR, + "couldn't find end of hashed material \"%s\"",end_str); return -1; } end = memchr(end+strlen(end_str), end_c, s_len - (end-s) - strlen(end_str)); if (!end) { - log_warn(LD_DIR,"couldn't find EOL"); + log_fn(log_severity,LD_DIR, + "couldn't find EOL"); return -1; } ++end; @@ -4510,7 +4562,7 @@ router_get_hash_impl(const char *s, size_t s_len, char *digest, digest_algorithm_t alg) { const char *start=NULL, *end=NULL; - if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c, + if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c,LOG_WARN, &start,&end)<0) return -1; @@ -4547,7 +4599,7 @@ router_get_hashes_impl(const char *s, size_t s_len, common_digests_t *digests, const char *end_str, char end_c) { const char *start=NULL, *end=NULL; - if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c, + if (router_get_hash_impl_helper(s,s_len,start_str,end_str,end_c,LOG_WARN, &start,&end)<0) return -1; @@ -4894,6 +4946,8 @@ tor_version_parse(const char *s, tor_version_t *out) #define NUMBER(m) \ do { \ + if (!cp || *cp < '0' || *cp > '9') \ + return -1; \ out->m = (int)tor_parse_uint64(cp, 10, 0, INT32_MAX, &ok, &eos); \ if (!ok) \ return -1; \ diff --git a/src/or/routerparse.h b/src/or/routerparse.h index 648f29b0d3..088f773c5e 100644 --- a/src/or/routerparse.h +++ b/src/or/routerparse.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -16,6 +16,11 @@ int router_get_router_hash(const char *s, size_t s_len, char *digest); int router_get_dir_hash(const char *s, char *digest); int router_get_networkstatus_v3_hashes(const char *s, common_digests_t *digests); +int router_get_networkstatus_v3_signed_boundaries(const char *s, + const char **start_out, + const char **end_out); +int router_get_networkstatus_v3_sha3_as_signed(uint8_t *digest_out, + const char *s); int router_get_extrainfo_hash(const char *s, size_t s_len, char *digest); #define DIROBJ_MAX_SIG_LEN 256 char *router_get_dirobj_signature(const char *digest, diff --git a/src/or/routerset.c b/src/or/routerset.c index d0df0a74e6..4906c6a51d 100644 --- a/src/or/routerset.c +++ b/src/or/routerset.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/routerset.h b/src/or/routerset.h index 2e3b4b0fe0..a63677b471 100644 --- a/src/or/routerset.h +++ b/src/or/routerset.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/scheduler.c b/src/or/scheduler.c index 033e6d119c..fac545fba7 100644 --- a/src/or/scheduler.c +++ b/src/or/scheduler.c @@ -1,4 +1,4 @@ -/* * Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/or/scheduler.h b/src/or/scheduler.h index 3dcfd2faca..e29c13de7e 100644 --- a/src/or/scheduler.h +++ b/src/or/scheduler.h @@ -1,4 +1,4 @@ -/* * Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* * Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/shared_random.c b/src/or/shared_random.c index f798a51a9f..25ca0611cd 100644 --- a/src/or/shared_random.c +++ b/src/or/shared_random.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -230,9 +230,7 @@ commit_decode(const char *encoded, sr_commit_t *commit) { int decoded_len = 0; size_t offset = 0; - /* XXX: Needs two extra bytes for the base64 decode calculation matches - * the binary length once decoded. #17868. */ - char b64_decoded[SR_COMMIT_LEN + 2]; + char b64_decoded[SR_COMMIT_LEN]; tor_assert(encoded); tor_assert(commit); @@ -284,9 +282,7 @@ STATIC int reveal_decode(const char *encoded, sr_commit_t *commit) { int decoded_len = 0; - /* XXX: Needs two extra bytes for the base64 decode calculation matches - * the binary length once decoded. #17868. */ - char b64_decoded[SR_REVEAL_LEN + 2]; + char b64_decoded[SR_REVEAL_LEN]; tor_assert(encoded); tor_assert(commit); diff --git a/src/or/shared_random.h b/src/or/shared_random.h index dbb8effeaa..1f027c70e0 100644 --- a/src/or/shared_random.h +++ b/src/or/shared_random.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_SHARED_RANDOM_H @@ -36,17 +36,14 @@ /* Length of base64 encoded commit NOT including the NUL terminated byte. * Formula is taken from base64_encode_size. This adds up to 56 bytes. */ -#define SR_COMMIT_BASE64_LEN \ - (((SR_COMMIT_LEN - 1) / 3) * 4 + 4) +#define SR_COMMIT_BASE64_LEN (BASE64_LEN(SR_COMMIT_LEN)) /* Length of base64 encoded reveal NOT including the NUL terminated byte. * Formula is taken from base64_encode_size. This adds up to 56 bytes. */ -#define SR_REVEAL_BASE64_LEN \ - (((SR_REVEAL_LEN - 1) / 3) * 4 + 4) +#define SR_REVEAL_BASE64_LEN (BASE64_LEN(SR_REVEAL_LEN)) /* Length of base64 encoded shared random value. It's 32 bytes long so 44 * bytes from the base64_encode_size formula. That includes the '=' * character at the end. */ -#define SR_SRV_VALUE_BASE64_LEN \ - (((DIGEST256_LEN - 1) / 3) * 4 + 4) +#define SR_SRV_VALUE_BASE64_LEN (BASE64_LEN(DIGEST256_LEN)) /* Assert if commit valid flag is not set. */ #define ASSERT_COMMIT_VALID(c) tor_assert((c)->valid) diff --git a/src/or/shared_random_state.c b/src/or/shared_random_state.c index 87db9031ee..89d2e8d7f6 100644 --- a/src/or/shared_random_state.c +++ b/src/or/shared_random_state.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/shared_random_state.h b/src/or/shared_random_state.h index 43a7f1d284..3526ad47d3 100644 --- a/src/or/shared_random_state.h +++ b/src/or/shared_random_state.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_SHARED_RANDOM_STATE_H diff --git a/src/or/statefile.c b/src/or/statefile.c index a95ba8533c..d0606b3012 100644 --- a/src/or/statefile.c +++ b/src/or/statefile.c @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/statefile.h b/src/or/statefile.h index b13743481d..10c09324bc 100644 --- a/src/or/statefile.h +++ b/src/or/statefile.h @@ -1,7 +1,7 @@ /* Copyright (c) 2001 Matej Pfajfar. * Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_STATEFILE_H diff --git a/src/or/status.c b/src/or/status.c index fce6a10157..f7be41e412 100644 --- a/src/or/status.c +++ b/src/or/status.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/status.h b/src/or/status.h index b97e835037..c1a0033ce0 100644 --- a/src/or/status.h +++ b/src/or/status.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_STATUS_H diff --git a/src/or/tor_main.c b/src/or/tor_main.c index d67eda2ac9..a3a8838602 100644 --- a/src/or/tor_main.c +++ b/src/or/tor_main.c @@ -1,6 +1,6 @@ /* Copyright 2001-2004 Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ extern const char tor_git_revision[]; diff --git a/src/or/torcert.c b/src/or/torcert.c index c58f3da2d3..ef9e78bfe7 100644 --- a/src/or/torcert.c +++ b/src/or/torcert.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/torcert.h b/src/or/torcert.h index 090f6b5811..51f7665f1e 100644 --- a/src/or/torcert.h +++ b/src/or/torcert.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TORCERT_H_INCLUDED diff --git a/src/or/transports.c b/src/or/transports.c index 535393b1a1..31849a8d15 100644 --- a/src/or/transports.c +++ b/src/or/transports.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/or/transports.h b/src/or/transports.h index 7de90dcbec..44a9626e50 100644 --- a/src/or/transports.h +++ b/src/or/transports.h @@ -1,6 +1,6 @@ /* Copyright (c) 2003-2004, Roger Dingledine * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/test/Makefile.nmake b/src/test/Makefile.nmake index 69a06eec4d..605f1a92c3 100644 --- a/src/test/Makefile.nmake +++ b/src/test/Makefile.nmake @@ -12,7 +12,7 @@ LIBS = ..\..\..\build-alpha\lib\libevent.lib \ crypt32.lib gdi32.lib user32.lib TEST_OBJECTS = test.obj test_addr.obj test_channel.obj test_channeltls.obj \ - test_containers.obj \ + test_consdiff.obj test_containers.obj \ test_controller_events.obj test_crypto.obj test_data.obj test_dir.obj \ test_checkdir.obj test_microdesc.obj test_pt.obj test_util.obj \ test_config.obj test_connection.obj \ diff --git a/src/test/bench.c b/src/test/bench.c index 99bc686f30..a44dc94a61 100644 --- a/src/test/bench.c +++ b/src/test/bench.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ extern const char tor_git_revision[]; @@ -28,6 +28,7 @@ const char tor_git_revision[] = ""; #include "crypto_curve25519.h" #include "onion_ntor.h" #include "crypto_ed25519.h" +#include "consdiff.h" #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) static uint64_t nanostart; @@ -673,6 +674,28 @@ main(int argc, const char **argv) or_options_t *options; tor_threads_init(); + tor_compress_init(); + + if (argc == 4 && !strcmp(argv[1], "diff")) { + init_logging(1); + const int N = 200; + char *f1 = read_file_to_str(argv[2], RFTS_BIN, NULL); + char *f2 = read_file_to_str(argv[3], RFTS_BIN, NULL); + if (! f1 || ! f2) { + perror("X"); + return 1; + } + for (i = 0; i < N; ++i) { + char *diff = consensus_diff_generate(f1, f2); + tor_free(diff); + } + char *diff = consensus_diff_generate(f1, f2); + printf("%s", diff); + tor_free(f1); + tor_free(f2); + tor_free(diff); + return 0; + } for (i = 1; i < argc; ++i) { if (!strcmp(argv[i], "--list")) { diff --git a/src/test/bt_test.py b/src/test/bt_test.py index 30591453b9..4cb3326042 100755 --- a/src/test/bt_test.py +++ b/src/test/bt_test.py @@ -1,4 +1,4 @@ -# Copyright 2013-2015, The Tor Project, Inc +# Copyright 2013-2017, The Tor Project, Inc # See LICENSE for licensing information """ diff --git a/src/test/ed25519_exts_ref.py b/src/test/ed25519_exts_ref.py index d5a3a79910..af5010415e 100644 --- a/src/test/ed25519_exts_ref.py +++ b/src/test/ed25519_exts_ref.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2014-2015, The Tor Project, Inc +# Copyright 2014-2017, The Tor Project, Inc # See LICENSE for licensing information """ diff --git a/src/test/fakechans.h b/src/test/fakechans.h index fa0e37dbe6..c0de430e3d 100644 --- a/src/test/fakechans.h +++ b/src/test/fakechans.h @@ -1,4 +1,4 @@ - /* Copyright (c) 2014-2016, The Tor Project, Inc. */ + /* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_FAKECHANS_H diff --git a/src/test/fuzz/dict/http b/src/test/fuzz/dict/http index 1a7b61e8d4..3b0531579d 100644 --- a/src/test/fuzz/dict/http +++ b/src/test/fuzz/dict/http @@ -4,7 +4,7 @@ # # Extracted from directory_handle_command() in the tor source code # -# Copyright (c) 2016, The Tor Project, Inc. +# Copyright (c) 2016-2017, The Tor Project, Inc. # See LICENSE for licensing information # # Usage: diff --git a/src/test/fuzz/fuzz_consensus.c b/src/test/fuzz/fuzz_consensus.c index f5d22f69ae..6610ade7ad 100644 --- a/src/test/fuzz/fuzz_consensus.c +++ b/src/test/fuzz/fuzz_consensus.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_descriptor.c b/src/test/fuzz/fuzz_descriptor.c index d19386d77f..1a50beae17 100644 --- a/src/test/fuzz/fuzz_descriptor.c +++ b/src/test/fuzz/fuzz_descriptor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_diff.c b/src/test/fuzz/fuzz_diff.c new file mode 100644 index 0000000000..642380b512 --- /dev/null +++ b/src/test/fuzz/fuzz_diff.c @@ -0,0 +1,69 @@ +/* Copyright (c) 2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFF_PRIVATE + +#include "orconfig.h" +#include "or.h" +#include "consdiff.h" + +#include "fuzzing.h" + +static int +mock_consensus_compute_digest_(const char *c, consensus_digest_t *d) +{ + (void)c; + memset(d->sha3_256, 3, sizeof(d->sha3_256)); + return 0; +} + +int +fuzz_init(void) +{ + MOCK(consensus_compute_digest, mock_consensus_compute_digest_); + MOCK(consensus_compute_digest_as_signed, mock_consensus_compute_digest_); + return 0; +} + +int +fuzz_cleanup(void) +{ + UNMOCK(consensus_compute_digest); + UNMOCK(consensus_compute_digest_as_signed); + return 0; +} + +int +fuzz_main(const uint8_t *stdin_buf, size_t data_size) +{ +#define SEP "=====\n" +#define SEPLEN strlen(SEP) + const uint8_t *separator = tor_memmem(stdin_buf, data_size, SEP, SEPLEN); + if (! separator) + return 0; + size_t c1_len = separator - stdin_buf; + char *c1 = tor_memdup_nulterm(stdin_buf, c1_len); + size_t c2_len = data_size - c1_len - SEPLEN; + char *c2 = tor_memdup_nulterm(separator + SEPLEN, c2_len); + + char *c3 = consensus_diff_generate(c1, c2); + + if (c3) { + char *c4 = consensus_diff_apply(c1, c3); + tor_assert(c4); + if (strcmp(c2, c4)) { + printf("%s\n", escaped(c1)); + printf("%s\n", escaped(c2)); + printf("%s\n", escaped(c3)); + printf("%s\n", escaped(c4)); + } + tor_assert(! strcmp(c2, c4)); + tor_free(c3); + tor_free(c4); + } + tor_free(c1); + tor_free(c2); + + return 0; +} + diff --git a/src/test/fuzz/fuzz_diff_apply.c b/src/test/fuzz/fuzz_diff_apply.c new file mode 100644 index 0000000000..8d7bf751bf --- /dev/null +++ b/src/test/fuzz/fuzz_diff_apply.c @@ -0,0 +1,65 @@ +/* Copyright (c) 2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFF_PRIVATE + +#include "orconfig.h" +#include "or.h" +#include "consdiff.h" + +#include "fuzzing.h" + +static int +mock_consensus_compute_digest_(const char *c, consensus_digest_t *d) +{ + (void)c; + memset(d->sha3_256, 3, sizeof(d->sha3_256)); + return 0; +} + +static int +mock_consensus_digest_eq_(const uint8_t *a, const uint8_t *b) +{ + (void)a; + (void)b; + return 1; +} + +int +fuzz_init(void) +{ + MOCK(consensus_compute_digest, mock_consensus_compute_digest_); + MOCK(consensus_digest_eq, mock_consensus_digest_eq_); + return 0; +} + +int +fuzz_cleanup(void) +{ + UNMOCK(consensus_compute_digest); + UNMOCK(consensus_digest_eq); + return 0; +} + +int +fuzz_main(const uint8_t *stdin_buf, size_t data_size) +{ +#define SEP "=====\n" +#define SEPLEN strlen(SEP) + const uint8_t *separator = tor_memmem(stdin_buf, data_size, SEP, SEPLEN); + if (! separator) + return 0; + size_t c1_len = separator - stdin_buf; + char *c1 = tor_memdup_nulterm(stdin_buf, c1_len); + size_t c2_len = data_size - c1_len - SEPLEN; + char *c2 = tor_memdup_nulterm(separator + SEPLEN, c2_len); + + char *c3 = consensus_diff_apply(c1, c2); + + tor_free(c1); + tor_free(c2); + tor_free(c3); + + return 0; +} + diff --git a/src/test/fuzz/fuzz_extrainfo.c b/src/test/fuzz/fuzz_extrainfo.c index 6251e606d0..2a3de7ecf7 100644 --- a/src/test/fuzz/fuzz_extrainfo.c +++ b/src/test/fuzz/fuzz_extrainfo.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_hsdescv2.c b/src/test/fuzz/fuzz_hsdescv2.c index 53b7cbe2f7..19db265716 100644 --- a/src/test/fuzz/fuzz_hsdescv2.c +++ b/src/test/fuzz/fuzz_hsdescv2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_http.c b/src/test/fuzz/fuzz_http.c index 01c3815f18..2ffeb60244 100644 --- a/src/test/fuzz/fuzz_http.c +++ b/src/test/fuzz/fuzz_http.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -18,10 +18,10 @@ static void mock_connection_write_to_buf_impl_(const char *string, size_t len, - connection_t *conn, int zlib) + connection_t *conn, int compressed) { log_debug(LD_GENERAL, "%sResponse:\n%u\nConnection: %p\n%s\n", - zlib ? "Compressed " : "", (unsigned)len, conn, string); + compressed ? "Compressed " : "", (unsigned)len, conn, string); } static int diff --git a/src/test/fuzz/fuzz_iptsv2.c b/src/test/fuzz/fuzz_iptsv2.c index 341d4880bd..4abde0c16d 100644 --- a/src/test/fuzz/fuzz_iptsv2.c +++ b/src/test/fuzz/fuzz_iptsv2.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_microdesc.c b/src/test/fuzz/fuzz_microdesc.c index bb89546191..396115026e 100644 --- a/src/test/fuzz/fuzz_microdesc.c +++ b/src/test/fuzz/fuzz_microdesc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #include "or.h" diff --git a/src/test/fuzz/fuzz_vrs.c b/src/test/fuzz/fuzz_vrs.c index 9301a9bcc8..baf0610a0b 100644 --- a/src/test/fuzz/fuzz_vrs.c +++ b/src/test/fuzz/fuzz_vrs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ROUTERPARSE_PRIVATE #define NETWORKSTATUS_PRIVATE diff --git a/src/test/fuzz/fuzzing.h b/src/test/fuzz/fuzzing.h index 4295743458..aecdbb4e52 100644 --- a/src/test/fuzz/fuzzing.h +++ b/src/test/fuzz/fuzzing.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef FUZZING_H #define FUZZING_H diff --git a/src/test/fuzz/fuzzing_common.c b/src/test/fuzz/fuzzing_common.c index e4920d3ee7..7aee92df63 100644 --- a/src/test/fuzz/fuzzing_common.c +++ b/src/test/fuzz/fuzzing_common.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CRYPTO_ED25519_PRIVATE #include "orconfig.h" @@ -96,6 +96,7 @@ static void global_init(void) { tor_threads_init(); + tor_compress_init(); { struct sipkey sipkey = { 1337, 7331 }; siphash_set_global_key(&sipkey); diff --git a/src/test/fuzz/include.am b/src/test/fuzz/include.am index 806710879b..500377f6d7 100644 --- a/src/test/fuzz/include.am +++ b/src/test/fuzz/include.am @@ -1,4 +1,5 @@ - +# This file was generated by fuzzing_include_am.py; do not hand-edit unless +# you enjoy having your changes erased. FUZZING_CPPFLAGS = \ $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) FUZZING_CFLAGS = \ @@ -17,7 +18,9 @@ FUZZING_LIBS = \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ @TOR_LIBEVENT_LIBS@ \ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ + @TOR_SYSTEMD_LIBS@ \ + @TOR_LZMA_LIBS@ \ + @TOR_ZSTD_LIBS@ oss-fuzz-prereqs: \ src/or/libtor-testing.a \ @@ -32,6 +35,16 @@ oss-fuzz-prereqs: \ noinst_HEADERS += \ src/test/fuzz/fuzzing.h +LIBFUZZER = /home/nickm/build/libfuzz/libFuzzer.a +LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) +LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) +LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++ + +LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ +LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) + +# ===== AFL fuzzers src_test_fuzz_fuzz_consensus_SOURCES = \ src/test/fuzz/fuzzing_common.c \ src/test/fuzz/fuzz_consensus.c @@ -48,13 +61,29 @@ src_test_fuzz_fuzz_descriptor_CFLAGS = $(FUZZING_CFLAGS) src_test_fuzz_fuzz_descriptor_LDFLAGS = $(FUZZING_LDFLAG) src_test_fuzz_fuzz_descriptor_LDADD = $(FUZZING_LIBS) -src_test_fuzz_fuzz_http_SOURCES = \ +src_test_fuzz_fuzz_diff_SOURCES = \ src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_http.c -src_test_fuzz_fuzz_http_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_http_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_http_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_http_LDADD = $(FUZZING_LIBS) + src/test/fuzz/fuzz_diff.c +src_test_fuzz_fuzz_diff_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_diff_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_diff_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_diff_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_diff_apply_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_diff_apply.c +src_test_fuzz_fuzz_diff_apply_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_diff_apply_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_diff_apply_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_diff_apply_LDADD = $(FUZZING_LIBS) + +src_test_fuzz_fuzz_extrainfo_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_extrainfo.c +src_test_fuzz_fuzz_extrainfo_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_extrainfo_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_extrainfo_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_extrainfo_LDADD = $(FUZZING_LIBS) src_test_fuzz_fuzz_hsdescv2_SOURCES = \ src/test/fuzz/fuzzing_common.c \ @@ -64,6 +93,14 @@ src_test_fuzz_fuzz_hsdescv2_CFLAGS = $(FUZZING_CFLAGS) src_test_fuzz_fuzz_hsdescv2_LDFLAGS = $(FUZZING_LDFLAG) src_test_fuzz_fuzz_hsdescv2_LDADD = $(FUZZING_LIBS) +src_test_fuzz_fuzz_http_SOURCES = \ + src/test/fuzz/fuzzing_common.c \ + src/test/fuzz/fuzz_http.c +src_test_fuzz_fuzz_http_CPPFLAGS = $(FUZZING_CPPFLAGS) +src_test_fuzz_fuzz_http_CFLAGS = $(FUZZING_CFLAGS) +src_test_fuzz_fuzz_http_LDFLAGS = $(FUZZING_LDFLAG) +src_test_fuzz_fuzz_http_LDADD = $(FUZZING_LIBS) + src_test_fuzz_fuzz_iptsv2_SOURCES = \ src/test/fuzz/fuzzing_common.c \ src/test/fuzz/fuzz_iptsv2.c @@ -72,14 +109,6 @@ src_test_fuzz_fuzz_iptsv2_CFLAGS = $(FUZZING_CFLAGS) src_test_fuzz_fuzz_iptsv2_LDFLAGS = $(FUZZING_LDFLAG) src_test_fuzz_fuzz_iptsv2_LDADD = $(FUZZING_LIBS) -src_test_fuzz_fuzz_extrainfo_SOURCES = \ - src/test/fuzz/fuzzing_common.c \ - src/test/fuzz/fuzz_extrainfo.c -src_test_fuzz_fuzz_extrainfo_CPPFLAGS = $(FUZZING_CPPFLAGS) -src_test_fuzz_fuzz_extrainfo_CFLAGS = $(FUZZING_CFLAGS) -src_test_fuzz_fuzz_extrainfo_LDFLAGS = $(FUZZING_LDFLAG) -src_test_fuzz_fuzz_extrainfo_LDADD = $(FUZZING_LIBS) - src_test_fuzz_fuzz_microdesc_SOURCES = \ src/test/fuzz/fuzzing_common.c \ src/test/fuzz/fuzz_microdesc.c @@ -99,19 +128,16 @@ src_test_fuzz_fuzz_vrs_LDADD = $(FUZZING_LIBS) FUZZERS = \ src/test/fuzz/fuzz-consensus \ src/test/fuzz/fuzz-descriptor \ + src/test/fuzz/fuzz-diff \ + src/test/fuzz/fuzz-diff-apply \ src/test/fuzz/fuzz-extrainfo \ - src/test/fuzz/fuzz-http \ src/test/fuzz/fuzz-hsdescv2 \ + src/test/fuzz/fuzz-http \ src/test/fuzz/fuzz-iptsv2 \ src/test/fuzz/fuzz-microdesc \ src/test/fuzz/fuzz-vrs - -LIBFUZZER = /home/nickm/build/libfuzz/libFuzzer.a -LIBFUZZER_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ -LIBFUZZER_CFLAGS = $(FUZZING_CFLAGS) -LIBFUZZER_LDFLAG = $(FUZZING_LDFLAG) -LIBFUZZER_LIBS = $(FUZZING_LIBS) $(LIBFUZZER) -lstdc++ +# ===== libfuzzer if LIBFUZZER_ENABLED src_test_fuzz_lf_fuzz_consensus_SOURCES = \ @@ -128,6 +154,20 @@ src_test_fuzz_lf_fuzz_descriptor_CFLAGS = $(LIBFUZZER_CFLAGS) src_test_fuzz_lf_fuzz_descriptor_LDFLAGS = $(LIBFUZZER_LDFLAG) src_test_fuzz_lf_fuzz_descriptor_LDADD = $(LIBFUZZER_LIBS) +src_test_fuzz_lf_fuzz_diff_SOURCES = \ + $(src_test_fuzz_fuzz_diff_SOURCES) +src_test_fuzz_lf_fuzz_diff_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_diff_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_diff_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_diff_LDADD = $(LIBFUZZER_LIBS) + +src_test_fuzz_lf_fuzz_diff_apply_SOURCES = \ + $(src_test_fuzz_fuzz_diff_apply_SOURCES) +src_test_fuzz_lf_fuzz_diff_apply_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_diff_apply_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_diff_apply_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_diff_apply_LDADD = $(LIBFUZZER_LIBS) + src_test_fuzz_lf_fuzz_extrainfo_SOURCES = \ $(src_test_fuzz_fuzz_extrainfo_SOURCES) src_test_fuzz_lf_fuzz_extrainfo_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) @@ -135,13 +175,6 @@ src_test_fuzz_lf_fuzz_extrainfo_CFLAGS = $(LIBFUZZER_CFLAGS) src_test_fuzz_lf_fuzz_extrainfo_LDFLAGS = $(LIBFUZZER_LDFLAG) src_test_fuzz_lf_fuzz_extrainfo_LDADD = $(LIBFUZZER_LIBS) -src_test_fuzz_lf_fuzz_http_SOURCES = \ - $(src_test_fuzz_fuzz_http_SOURCES) -src_test_fuzz_lf_fuzz_http_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) -src_test_fuzz_lf_fuzz_http_CFLAGS = $(LIBFUZZER_CFLAGS) -src_test_fuzz_lf_fuzz_http_LDFLAGS = $(LIBFUZZER_LDFLAG) -src_test_fuzz_lf_fuzz_http_LDADD = $(LIBFUZZER_LIBS) - src_test_fuzz_lf_fuzz_hsdescv2_SOURCES = \ $(src_test_fuzz_fuzz_hsdescv2_SOURCES) src_test_fuzz_lf_fuzz_hsdescv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) @@ -149,6 +182,13 @@ src_test_fuzz_lf_fuzz_hsdescv2_CFLAGS = $(LIBFUZZER_CFLAGS) src_test_fuzz_lf_fuzz_hsdescv2_LDFLAGS = $(LIBFUZZER_LDFLAG) src_test_fuzz_lf_fuzz_hsdescv2_LDADD = $(LIBFUZZER_LIBS) +src_test_fuzz_lf_fuzz_http_SOURCES = \ + $(src_test_fuzz_fuzz_http_SOURCES) +src_test_fuzz_lf_fuzz_http_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) +src_test_fuzz_lf_fuzz_http_CFLAGS = $(LIBFUZZER_CFLAGS) +src_test_fuzz_lf_fuzz_http_LDFLAGS = $(LIBFUZZER_LDFLAG) +src_test_fuzz_lf_fuzz_http_LDADD = $(LIBFUZZER_LIBS) + src_test_fuzz_lf_fuzz_iptsv2_SOURCES = \ $(src_test_fuzz_fuzz_iptsv2_SOURCES) src_test_fuzz_lf_fuzz_iptsv2_CPPFLAGS = $(LIBFUZZER_CPPFLAGS) @@ -173,9 +213,11 @@ src_test_fuzz_lf_fuzz_vrs_LDADD = $(LIBFUZZER_LIBS) LIBFUZZER_FUZZERS = \ src/test/fuzz/lf-fuzz-consensus \ src/test/fuzz/lf-fuzz-descriptor \ + src/test/fuzz/lf-fuzz-diff \ + src/test/fuzz/lf-fuzz-diff-apply \ src/test/fuzz/lf-fuzz-extrainfo \ - src/test/fuzz/lf-fuzz-http \ src/test/fuzz/lf-fuzz-hsdescv2 \ + src/test/fuzz/lf-fuzz-http \ src/test/fuzz/lf-fuzz-iptsv2 \ src/test/fuzz/lf-fuzz-microdesc \ src/test/fuzz/lf-fuzz-vrs @@ -184,10 +226,9 @@ else LIBFUZZER_FUZZERS = endif -if OSS_FUZZ_ENABLED -LIBOSS_FUZZ_CPPFLAGS = $(FUZZING_CPPFLAGS) -DLLVM_FUZZ -LIBOSS_FUZZ_CFLAGS = $(FUZZING_CFLAGS) +# ===== oss-fuzz +if OSS_FUZZ_ENABLED src_test_fuzz_liboss_fuzz_consensus_a_SOURCES = \ $(src_test_fuzz_fuzz_consensus_SOURCES) src_test_fuzz_liboss_fuzz_consensus_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) @@ -198,21 +239,31 @@ src_test_fuzz_liboss_fuzz_descriptor_a_SOURCES = \ src_test_fuzz_liboss_fuzz_descriptor_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) src_test_fuzz_liboss_fuzz_descriptor_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) +src_test_fuzz_liboss_fuzz_diff_a_SOURCES = \ + $(src_test_fuzz_fuzz_diff_SOURCES) +src_test_fuzz_liboss_fuzz_diff_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_diff_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + +src_test_fuzz_liboss_fuzz_diff_apply_a_SOURCES = \ + $(src_test_fuzz_fuzz_diff_apply_SOURCES) +src_test_fuzz_liboss_fuzz_diff_apply_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_diff_apply_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + src_test_fuzz_liboss_fuzz_extrainfo_a_SOURCES = \ $(src_test_fuzz_fuzz_extrainfo_SOURCES) src_test_fuzz_liboss_fuzz_extrainfo_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) src_test_fuzz_liboss_fuzz_extrainfo_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) -src_test_fuzz_liboss_fuzz_http_a_SOURCES = \ - $(src_test_fuzz_fuzz_http_SOURCES) -src_test_fuzz_liboss_fuzz_http_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) -src_test_fuzz_liboss_fuzz_http_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) - src_test_fuzz_liboss_fuzz_hsdescv2_a_SOURCES = \ $(src_test_fuzz_fuzz_hsdescv2_SOURCES) src_test_fuzz_liboss_fuzz_hsdescv2_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) src_test_fuzz_liboss_fuzz_hsdescv2_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) +src_test_fuzz_liboss_fuzz_http_a_SOURCES = \ + $(src_test_fuzz_fuzz_http_SOURCES) +src_test_fuzz_liboss_fuzz_http_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) +src_test_fuzz_liboss_fuzz_http_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) + src_test_fuzz_liboss_fuzz_iptsv2_a_SOURCES = \ $(src_test_fuzz_fuzz_iptsv2_SOURCES) src_test_fuzz_liboss_fuzz_iptsv2_a_CPPFLAGS = $(LIBOSS_FUZZ_CPPFLAGS) @@ -231,12 +282,15 @@ src_test_fuzz_liboss_fuzz_vrs_a_CFLAGS = $(LIBOSS_FUZZ_CFLAGS) OSS_FUZZ_FUZZERS = \ src/test/fuzz/liboss-fuzz-consensus.a \ src/test/fuzz/liboss-fuzz-descriptor.a \ + src/test/fuzz/liboss-fuzz-diff.a \ + src/test/fuzz/liboss-fuzz-diff-apply.a \ src/test/fuzz/liboss-fuzz-extrainfo.a \ - src/test/fuzz/liboss-fuzz-http.a \ src/test/fuzz/liboss-fuzz-hsdescv2.a \ + src/test/fuzz/liboss-fuzz-http.a \ src/test/fuzz/liboss-fuzz-iptsv2.a \ src/test/fuzz/liboss-fuzz-microdesc.a \ src/test/fuzz/liboss-fuzz-vrs.a + else OSS_FUZZ_FUZZERS = endif diff --git a/src/test/fuzz_static_testcases.sh b/src/test/fuzz_static_testcases.sh index bfe1677573..3cb45ad5e6 100755 --- a/src/test/fuzz_static_testcases.sh +++ b/src/test/fuzz_static_testcases.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright (c) 2016, The Tor Project, Inc. +# Copyright (c) 2016-2017, The Tor Project, Inc. # See LICENSE for licensing information set -e diff --git a/src/test/hs_ntor_ref.py b/src/test/hs_ntor_ref.py new file mode 100644 index 0000000000..813e797828 --- /dev/null +++ b/src/test/hs_ntor_ref.py @@ -0,0 +1,408 @@ +#!/usr/bin/python +# Copyright 2017, The Tor Project, Inc +# See LICENSE for licensing information + +""" +hs_ntor_ref.py + +This module is a reference implementation of the modified ntor protocol +proposed for Tor hidden services in proposal 224 (Next Generation Hidden +Services) in section [NTOR-WITH-EXTRA-DATA]. + +The modified ntor protocol is a single-round protocol, with three steps in total: + + 1: Client generates keys and sends them to service via INTRODUCE cell + + 2: Service computes key material based on client's keys, and sends its own + keys to client via RENDEZVOUS cell + + 3: Client computes key material as well. + +It's meant to be used to validate Tor's HS ntor implementation by conducting +various integration tests. Specifically it conducts the following three tests: + +- Tests our Python implementation by running the whole protocol in Python and + making sure that results are consistent. + +- Tests little-t-tor ntor implementation. We use this Python code to instrument + little-t-tor and carry out the handshake by using little-t-tor code. The + small C wrapper at src/test/test-hs-ntor-cl is used for this Python module to + interface with little-t-tor. + +- Cross-tests Python and little-t-tor implementation by running half of the + protocol in Python code and the other in little-t-tor. This is actually two + tests so that all parts of the protocol are run both by little-t-tor and + Python. + +It requires the curve25519 python module from the curve25519-donna package. + +The whole logic and concept for this test suite was taken from ntor_ref.py. + + *** DO NOT USE THIS IN PRODUCTION. *** +""" + +import struct +import os, sys +import binascii +import subprocess + +try: + import curve25519 + curve25519mod = curve25519.keys +except ImportError: + curve25519 = None + import slownacl_curve25519 + curve25519mod = slownacl_curve25519 + +try: + import sha3 +except ImportError: + # error code 77 tells automake to skip this test + sys.exit(77) + +# Import Nick's ntor reference implementation in Python +# We are gonna use a few of its utilities. +from ntor_ref import hash_nil +from ntor_ref import PrivateKey + +# String constants used in this protocol +PROTOID = "tor-hs-ntor-curve25519-sha3-256-1" +T_HSENC = PROTOID + ":hs_key_extract" +T_HSVERIFY = PROTOID + ":hs_verify" +T_HSMAC = PROTOID + ":hs_mac" +M_HSEXPAND = PROTOID + ":hs_key_expand" + +INTRO_SECRET_LEN = 161 +REND_SECRET_LEN = 225 +AUTH_INPUT_LEN = 199 + +# Implements MAC(k,m) = H(htonll(len(k)) | k | m) +def mac(k,m): + def htonll(num): + return struct.pack('!q', num) + + s = sha3.SHA3256() + s.update(htonll(len(k))) + s.update(k) + s.update(m) + return s.digest() + +###################################################################### + +# Functions that implement the modified HS ntor protocol + +"""As client compute key material for INTRODUCE cell as follows: + + intro_secret_hs_input = EXP(B,x) | AUTH_KEY | X | B | PROTOID + info = m_hsexpand | subcredential + hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + ENC_KEY = hs_keys[0:S_KEY_LEN] + MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] +""" +def intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential): + + dh_result = client_ephemeral_enc_privkey.get_shared_key(intro_enc_pubkey, hash_nil) + secret = dh_result + intro_auth_pubkey_str + client_ephemeral_enc_pubkey.serialize() + intro_enc_pubkey.serialize() + PROTOID + assert(len(secret) == INTRO_SECRET_LEN) + info = M_HSEXPAND + subcredential + + kdf = sha3.SHAKE256() + kdf.update(secret + T_HSENC + info) + key_material = kdf.squeeze(64*8) + + enc_key = key_material[0:32] + mac_key = key_material[32:64] + + return enc_key, mac_key + +"""Wrapper over intro2_ntor_client()""" +def client_part1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential): + enc_key, mac_key = intro2_ntor_client(intro_auth_pubkey_str, intro_enc_pubkey, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential) + assert(enc_key) + assert(mac_key) + + return enc_key, mac_key + +"""As service compute key material for INTRODUCE cell as follows: + + intro_secret_hs_input = EXP(X,b) | AUTH_KEY | X | B | PROTOID + info = m_hsexpand | subcredential + hs_keys = KDF(intro_secret_hs_input | t_hsenc | info, S_KEY_LEN+MAC_LEN) + HS_DEC_KEY = hs_keys[0:S_KEY_LEN] + HS_MAC_KEY = hs_keys[S_KEY_LEN:S_KEY_LEN+MAC_KEY_LEN] +""" +def intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, service_enc_privkey, service_enc_pubkey, subcredential): + dh_result = service_enc_privkey.get_shared_key(client_enc_pubkey, hash_nil) + secret = dh_result + intro_auth_pubkey_str + client_enc_pubkey.serialize() + service_enc_pubkey.serialize() + PROTOID + assert(len(secret) == INTRO_SECRET_LEN) + info = M_HSEXPAND + subcredential + + kdf = sha3.SHAKE256() + kdf.update(secret + T_HSENC + info) + key_material = kdf.squeeze(64*8) + + enc_key = key_material[0:32] + mac_key = key_material[32:64] + + return enc_key, mac_key + +"""As service compute key material for INTRODUCE and REDNEZVOUS cells. + + Use intro2_ntor_service() to calculate the INTRODUCE key material, and use + the following computations to do the RENDEZVOUS ones: + + rend_secret_hs_input = EXP(X,y) | EXP(X,b) | AUTH_KEY | B | X | Y | PROTOID + NTOR_KEY_SEED = MAC(rend_secret_hs_input, t_hsenc) + verify = MAC(rend_secret_hs_input, t_hsverify) + auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + AUTH_INPUT_MAC = MAC(auth_input, t_hsmac) +""" +def service_part1(intro_auth_pubkey_str, client_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential): + intro_enc_key, intro_mac_key = intro2_ntor_service(intro_auth_pubkey_str, client_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) + assert(intro_enc_key) + assert(intro_mac_key) + + service_ephemeral_privkey = PrivateKey() + service_ephemeral_pubkey = service_ephemeral_privkey.get_public() + + dh_result1 = service_ephemeral_privkey.get_shared_key(client_enc_pubkey, hash_nil) + dh_result2 = intro_enc_privkey.get_shared_key(client_enc_pubkey, hash_nil) + rend_secret_hs_input = dh_result1 + dh_result2 + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + client_enc_pubkey.serialize() + service_ephemeral_pubkey.serialize() + PROTOID + assert(len(rend_secret_hs_input) == REND_SECRET_LEN) + + ntor_key_seed = mac(rend_secret_hs_input, T_HSENC) + verify = mac(rend_secret_hs_input, T_HSVERIFY) + auth_input = verify + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + service_ephemeral_pubkey.serialize() + client_enc_pubkey.serialize() + PROTOID + "Server" + assert(len(auth_input) == AUTH_INPUT_LEN) + auth_input_mac = mac(auth_input, T_HSMAC) + + assert(ntor_key_seed) + assert(auth_input_mac) + assert(service_ephemeral_pubkey) + + return intro_enc_key, intro_mac_key, ntor_key_seed, auth_input_mac, service_ephemeral_pubkey + +"""As client compute key material for rendezvous cells as follows: + + rend_secret_hs_input = EXP(Y,x) | EXP(B,x) | AUTH_KEY | B | X | Y | PROTOID + NTOR_KEY_SEED = MAC(ntor_secret_input, t_hsenc) + verify = MAC(ntor_secret_input, t_hsverify) + auth_input = verify | AUTH_KEY | B | Y | X | PROTOID | "Server" + AUTH_INPUT_MAC = MAC(auth_input, t_hsmac) +""" +def client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_rend_pubkey): + dh_result1 = client_ephemeral_enc_privkey.get_shared_key(service_ephemeral_rend_pubkey, hash_nil) + dh_result2 = client_ephemeral_enc_privkey.get_shared_key(intro_enc_pubkey, hash_nil) + rend_secret_hs_input = dh_result1 + dh_result2 + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + client_ephemeral_enc_pubkey.serialize() + service_ephemeral_rend_pubkey.serialize() + PROTOID + assert(len(rend_secret_hs_input) == REND_SECRET_LEN) + + ntor_key_seed = mac(rend_secret_hs_input, T_HSENC) + verify = mac(rend_secret_hs_input, T_HSVERIFY) + auth_input = verify + intro_auth_pubkey_str + intro_enc_pubkey.serialize() + service_ephemeral_rend_pubkey.serialize() + client_ephemeral_enc_pubkey.serialize() + PROTOID + "Server" + assert(len(auth_input) == AUTH_INPUT_LEN) + auth_input_mac = mac(auth_input, T_HSMAC) + + assert(ntor_key_seed) + assert(auth_input_mac) + + return ntor_key_seed, auth_input_mac + +################################################################################# + +""" +Utilities for communicating with the little-t-tor ntor wrapper to conduct the +integration tests +""" + +PROG = b"./src/test/test-hs-ntor-cl" +enhex=lambda s: binascii.b2a_hex(s) +dehex=lambda s: binascii.a2b_hex(s.strip()) + +def tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_privkey, subcredential): + p = subprocess.Popen([PROG, "client1", + enhex(intro_auth_pubkey_str), + enhex(intro_enc_pubkey.serialize()), + enhex(client_ephemeral_enc_privkey.serialize()), + enhex(subcredential)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + +def tor_server1(intro_auth_pubkey_str, intro_enc_privkey, + client_ephemeral_enc_pubkey, subcredential): + p = subprocess.Popen([PROG, "server1", + enhex(intro_auth_pubkey_str), + enhex(intro_enc_privkey.serialize()), + enhex(client_ephemeral_enc_pubkey.serialize()), + enhex(subcredential)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + +def tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_rend_pubkey, subcredential): + p = subprocess.Popen([PROG, "client2", + enhex(intro_auth_pubkey_str), + enhex(client_ephemeral_enc_privkey.serialize()), + enhex(intro_enc_pubkey.serialize()), + enhex(service_ephemeral_rend_pubkey.serialize()), + enhex(subcredential)], + stdout=subprocess.PIPE) + return map(dehex, p.stdout.readlines()) + +################################################################################## + +# Perform a pure python ntor test +def do_pure_python_ntor_test(): + # Initialize all needed key material + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() + intro_auth_pubkey_str = os.urandom(32) + subcredential = os.urandom(32) + + client_enc_key, client_mac_key = client_part1(intro_auth_pubkey_str, intro_enc_pubkey, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, subcredential) + + service_enc_key, service_mac_key, service_ntor_key_seed, service_auth_input_mac, service_ephemeral_pubkey = service_part1(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) + + assert(client_enc_key == service_enc_key) + assert(client_mac_key == service_mac_key) + + client_ntor_key_seed, client_auth_input_mac = client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_pubkey) + + assert(client_ntor_key_seed == service_ntor_key_seed) + assert(client_auth_input_mac == service_auth_input_mac) + + print "DONE: python dance [%s]" % repr(client_auth_input_mac) + +# Perform a pure little-t-tor integration test. +def do_little_t_tor_ntor_test(): + # Initialize all needed key material + subcredential = os.urandom(32) + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key + intro_auth_pubkey_str = os.urandom(32) + + client_enc_key, client_mac_key = tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_privkey, subcredential) + assert(client_enc_key) + assert(client_mac_key) + + service_enc_key, service_mac_key, service_ntor_auth_mac, service_ntor_key_seed, service_eph_pubkey = tor_server1(intro_auth_pubkey_str, + intro_enc_privkey, + client_ephemeral_enc_pubkey, + subcredential) + assert(service_enc_key) + assert(service_mac_key) + assert(service_ntor_auth_mac) + assert(service_ntor_key_seed) + + assert(client_enc_key == service_enc_key) + assert(client_mac_key == service_mac_key) + + # Turn from bytes to key + service_eph_pubkey = curve25519mod.Public(service_eph_pubkey) + + client_ntor_auth_mac, client_ntor_key_seed = tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_eph_pubkey, subcredential) + assert(client_ntor_auth_mac) + assert(client_ntor_key_seed) + + assert(client_ntor_key_seed == service_ntor_key_seed) + assert(client_ntor_auth_mac == service_ntor_auth_mac) + + print "DONE: tor dance [%s]" % repr(client_ntor_auth_mac) + +""" +Do mixed test as follows: + 1. C -> S (python mode) + 2. C <- S (tor mode) + 3. Client computes keys (python mode) +""" +def do_first_mixed_test(): + subcredential = os.urandom(32) + + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key + + intro_auth_pubkey_str = os.urandom(32) + + # Let's do mixed + client_enc_key, client_mac_key = client_part1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + subcredential) + + service_enc_key, service_mac_key, service_ntor_auth_mac, service_ntor_key_seed, service_eph_pubkey = tor_server1(intro_auth_pubkey_str, + intro_enc_privkey, + client_ephemeral_enc_pubkey, + subcredential) + assert(service_enc_key) + assert(service_mac_key) + assert(service_ntor_auth_mac) + assert(service_ntor_key_seed) + assert(service_eph_pubkey) + + assert(client_enc_key == service_enc_key) + assert(client_mac_key == service_mac_key) + + # Turn from bytes to key + service_eph_pubkey = curve25519mod.Public(service_eph_pubkey) + + client_ntor_key_seed, client_auth_input_mac = client_part2(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_eph_pubkey) + + assert(client_auth_input_mac == service_ntor_auth_mac) + assert(client_ntor_key_seed == service_ntor_key_seed) + + print "DONE: 1st mixed dance [%s]" % repr(client_auth_input_mac) + +""" +Do mixed test as follows: + 1. C -> S (tor mode) + 2. C <- S (python mode) + 3. Client computes keys (tor mode) +""" +def do_second_mixed_test(): + subcredential = os.urandom(32) + + client_ephemeral_enc_privkey = PrivateKey() + client_ephemeral_enc_pubkey = client_ephemeral_enc_privkey.get_public() + intro_enc_privkey = PrivateKey() + intro_enc_pubkey = intro_enc_privkey.get_public() # service-side enc key + + intro_auth_pubkey_str = os.urandom(32) + + # Let's do mixed + client_enc_key, client_mac_key = tor_client1(intro_auth_pubkey_str, intro_enc_pubkey, + client_ephemeral_enc_privkey, subcredential) + assert(client_enc_key) + assert(client_mac_key) + + service_enc_key, service_mac_key, service_ntor_key_seed, service_ntor_auth_mac, service_ephemeral_pubkey = service_part1(intro_auth_pubkey_str, client_ephemeral_enc_pubkey, intro_enc_privkey, intro_enc_pubkey, subcredential) + + client_ntor_auth_mac, client_ntor_key_seed = tor_client2(intro_auth_pubkey_str, client_ephemeral_enc_privkey, + intro_enc_pubkey, service_ephemeral_pubkey, subcredential) + assert(client_ntor_auth_mac) + assert(client_ntor_key_seed) + + assert(client_ntor_key_seed == service_ntor_key_seed) + assert(client_ntor_auth_mac == service_ntor_auth_mac) + + print "DONE: 2nd mixed dance [%s]" % repr(client_ntor_auth_mac) + +def do_mixed_tests(): + do_first_mixed_test() + do_second_mixed_test() + +if __name__ == '__main__': + do_pure_python_ntor_test() + do_little_t_tor_ntor_test() + do_mixed_tests() diff --git a/src/test/include.am b/src/test/include.am index bcc2b56c18..ee14d0651b 100644 --- a/src/test/include.am +++ b/src/test/include.am @@ -20,7 +20,7 @@ TESTSCRIPTS = \ src/test/test_switch_id.sh if USEPYTHON -TESTSCRIPTS += src/test/test_ntor.sh src/test/test_bt.sh +TESTSCRIPTS += src/test/test_ntor.sh src/test/test_hs_ntor.sh src/test/test_bt.sh endif TESTS += src/test/test src/test/test-slow src/test/test-memwipe \ @@ -83,14 +83,19 @@ src_test_test_SOURCES = \ src/test/test_checkdir.c \ src/test/test_circuitlist.c \ src/test/test_circuitmux.c \ + src/test/test_circuitbuild.c \ src/test/test_circuituse.c \ src/test/test_compat_libevent.c \ src/test/test_config.c \ src/test/test_connection.c \ + src/test/test_conscache.c \ + src/test/test_consdiff.c \ + src/test/test_consdiffmgr.c \ src/test/test_containers.c \ src/test/test_controller.c \ src/test/test_controller_events.c \ src/test/test_crypto.c \ + src/test/test_crypto_openssl.c \ src/test/test_data.c \ src/test/test_dir.c \ src/test/test_dir_common.c \ @@ -130,6 +135,7 @@ src_test_test_SOURCES = \ src/test/test_shared_random.c \ src/test/test_socks.c \ src/test/test_status.c \ + src/test/test_storagedir.c \ src/test/test_threads.c \ src/test/test_tortls.c \ src/test/test_util.c \ @@ -175,7 +181,8 @@ src_test_test_switch_id_LDFLAGS = @TOR_LDFLAGS_zlib@ src_test_test_switch_id_LDADD = \ src/common/libor-testing.a \ src/common/libor-ctime-testing.a \ - @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ @TOR_LDFLAGS_libevent@ @@ -187,9 +194,10 @@ src_test_test_LDADD = src/or/libtor-testing.a \ src/common/libor-ctime-testing.a \ src/common/libor-event-testing.a \ src/trunnel/libor-trunnel-testing.a \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ + @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ src_test_test_slow_CPPFLAGS = $(src_test_test_CPPFLAGS) src_test_test_slow_CFLAGS = $(src_test_test_CFLAGS) @@ -210,9 +218,10 @@ src_test_bench_LDADD = src/or/libtor.a src/common/libor.a \ src/common/libor-ctime.a \ src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ src/common/libor-event.a src/trunnel/libor-trunnel.a \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ - @TOR_SYSTEMD_LIBS@ + @TOR_SYSTEMD_LIBS@ @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ src_test_test_workqueue_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \ @TOR_LDFLAGS_libevent@ @@ -221,8 +230,10 @@ src_test_test_workqueue_LDADD = src/or/libtor-testing.a \ src/common/libor-ctime-testing.a \ src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ src/common/libor-event-testing.a \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ + @TOR_LZMA_LIBS@ @TOR_ZSTD_LIBS@ src_test_test_timers_CPPFLAGS = $(src_test_test_CPPFLAGS) src_test_test_timers_CFLAGS = $(src_test_test_CFLAGS) @@ -232,7 +243,8 @@ src_test_test_timers_LDADD = \ src/common/libor-event-testing.a \ src/common/libor-crypto-testing.a $(LIBKECCAK_TINY) $(LIBDONNA) \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ + @TOR_LZMA_LIBS@ src_test_test_timers_LDFLAGS = $(src_test_test_LDFLAGS) noinst_HEADERS+= \ @@ -250,20 +262,35 @@ noinst_HEADERS+= \ src/test/vote_descriptors.inc noinst_PROGRAMS+= src/test/test-ntor-cl +noinst_PROGRAMS+= src/test/test-hs-ntor-cl src_test_test_ntor_cl_SOURCES = src/test/test_ntor_cl.c src_test_test_ntor_cl_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ src_test_test_ntor_cl_LDADD = src/or/libtor.a src/common/libor.a \ src/common/libor-ctime.a \ src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ + src/trace/libor-trace.a \ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ - @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \ + @TOR_LZMA_LIBS@ src_test_test_ntor_cl_AM_CPPFLAGS = \ -I"$(top_srcdir)/src/or" +src_test_test_hs_ntor_cl_SOURCES = src/test/test_hs_ntor_cl.c +src_test_test_hs_ntor_cl_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ +src_test_test_hs_ntor_cl_LDADD = src/or/libtor.a src/common/libor.a \ + src/common/libor-ctime.a \ + src/common/libor-crypto.a $(LIBKECCAK_TINY) $(LIBDONNA) \ + @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ \ + @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ +src_test_test_hs_ntor_cl_AM_CPPFLAGS = \ + -I"$(top_srcdir)/src/or" + + noinst_PROGRAMS += src/test/test-bt-cl src_test_test_bt_cl_SOURCES = src/test/test_bt_cl.c src_test_test_bt_cl_LDADD = src/common/libor-testing.a \ src/common/libor-ctime-testing.a \ + src/trace/libor-trace.a \ @TOR_LIB_MATH@ \ @TOR_LIB_WS32@ @TOR_LIB_GDI@ src_test_test_bt_cl_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS) @@ -272,12 +299,13 @@ src_test_test_bt_cl_CPPFLAGS= $(src_test_AM_CPPFLAGS) $(TEST_CPPFLAGS) EXTRA_DIST += \ src/test/bt_test.py \ src/test/ntor_ref.py \ + src/test/hs_ntor_ref.py \ src/test/fuzz_static_testcases.sh \ src/test/slownacl_curve25519.py \ src/test/zero_length_keys.sh \ src/test/test_keygen.sh \ src/test/test_zero_length_keys.sh \ - src/test/test_ntor.sh src/test/test_bt.sh \ + src/test/test_ntor.sh src/test/test_hs_ntor.sh src/test/test_bt.sh \ src/test/test-network.sh \ src/test/test_switch_id.sh \ src/test/test_workqueue_cancel.sh \ diff --git a/src/test/log_test_helpers.c b/src/test/log_test_helpers.c index c788a33c17..d5a39cfeee 100644 --- a/src/test/log_test_helpers.c +++ b/src/test/log_test_helpers.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define LOG_PRIVATE #include "torlog.h" diff --git a/src/test/log_test_helpers.h b/src/test/log_test_helpers.h index 922c68b42f..f7798c0249 100644 --- a/src/test/log_test_helpers.h +++ b/src/test/log_test_helpers.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" @@ -71,14 +71,14 @@ void mock_dump_saved_logs(void); \ assert_log_predicate(mock_saved_log_has_message_containing(str) && \ mock_saved_log_n_entries() == 1, \ - "expected log to contain exactly 1 message: " # str); \ + "expected log to contain exactly 1 message " # str); \ } while (0); #define expect_single_log_msg_containing(str) \ do { \ assert_log_predicate(mock_saved_log_has_message_containing(str)&& \ mock_saved_log_n_entries() == 1 , \ - "expected log to contain 1 message, containing" # str); \ + "expected log to contain 1 message, containing " # str); \ } while (0); #define expect_no_log_msg(str) \ diff --git a/src/test/ntor_ref.py b/src/test/ntor_ref.py index df065853f3..c753588f97 100755 --- a/src/test/ntor_ref.py +++ b/src/test/ntor_ref.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2012-2015, The Tor Project, Inc +# Copyright 2012-2017, The Tor Project, Inc # See LICENSE for licensing information """ diff --git a/src/test/rend_test_helpers.c b/src/test/rend_test_helpers.c index 377337bcb9..f7880046fb 100644 --- a/src/test/rend_test_helpers.c +++ b/src/test/rend_test_helpers.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/rend_test_helpers.h b/src/test/rend_test_helpers.h index 180a4e8fde..486adba436 100644 --- a/src/test/rend_test_helpers.h +++ b/src/test/rend_test_helpers.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test-child.c b/src/test/test-child.c index fdf3ccec0a..f0bdb3ea26 100644 --- a/src/test/test-child.c +++ b/src/test/test-child.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2011-2016, The Tor Project, Inc. */ +/* Copyright (c) 2011-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test-network.sh b/src/test/test-network.sh index 4d9776822b..6e0f286573 100755 --- a/src/test/test-network.sh +++ b/src/test/test-network.sh @@ -1,103 +1,45 @@ -#! /bin/sh +#!/bin/sh -# Please do not modify this script, it has been moved to chutney/tools +# This script calls the equivalent script in chutney/tools -ECHO_N="/bin/echo -n" +# If we already know CHUTNEY_PATH, don't bother with argument parsing +TEST_NETWORK="$CHUTNEY_PATH/tools/test-network.sh" +# Call the chutney version of this script, if it exists, and we can find it +if [ -d "$CHUTNEY_PATH" -a -x "$TEST_NETWORK" ]; then + # we can't produce any output, because we might be --quiet + # this preserves arguments with spaces correctly + exec "$TEST_NETWORK" "$@" +fi + +# We need to go looking for CHUTNEY_PATH +# Do we output anything at all? +ECHO="${ECHO:-echo}" # Output is prefixed with the name of the script myname=$(basename $0) -# We need to find CHUTNEY_PATH, so that we can call the version of this script -# in chutney/tools. And we want to pass any arguments to that script as well. -# So we source this script, which processes its arguments to find CHUTNEY_PATH. - -# Avoid recursively sourcing this script, and don't call the chutney version -# while recursing, either -if [ "$TEST_NETWORK_RECURSING" != true ]; then - # Process the arguments into environmental variables with this script - # to make sure $CHUTNEY_PATH is set - # When we switch to using test-network.sh in chutney/tools, --dry-run - # can be removed, because this script will find chutney, then pass all - # arguments to chutney's test-network.sh - echo "$myname: Parsing command-line arguments to find \$CHUTNEY_PATH" - export TEST_NETWORK_RECURSING=true - . "$0" --dry-run "$@" - - # Call the chutney version of this script, if it exists, and we can find it - if [ -d "$CHUTNEY_PATH" -a -x "$CHUTNEY_PATH/tools/test-network.sh" ]; then - unset NETWORK_DRY_RUN - echo "$myname: Calling newer chutney script \ -$CHUTNEY_PATH/tools/test-network.sh" - "$CHUTNEY_PATH/tools/test-network.sh" "$@" - exit $? - else - echo "$myname: This script has moved to chutney/tools." - echo "$myname: Please update your chutney using 'git pull'." - # When we switch to using test-network.sh in chutney/tools, we should - # exit with a very loud failure here - echo "$myname: Falling back to the old tor version of the script." - fi -fi +# Save the arguments before we destroy them +# This might not preserve arguments with spaces in them +ORIGINAL_ARGS="$@" +# We need to find CHUTNEY_PATH, so that we can call the version of this script +# in chutney/tools with the same arguments. We also need to respect --quiet. until [ -z "$1" ] do case "$1" in --chutney-path) - export CHUTNEY_PATH="$2" + CHUTNEY_PATH="$2" shift ;; --tor-path) - export TOR_DIR="$2" - shift - ;; - # When we switch to using test-network.sh in chutney/tools, only the - # --chutney-path and --tor-path arguments need to be processed by this - # script, everything else can be handled by chutney's test-network.sh - --flavor|--flavour|--network-flavor|--network-flavour) - export NETWORK_FLAVOUR="$2" - shift - ;; - --delay|--sleep|--bootstrap-time|--time) - export BOOTSTRAP_TIME="$2" - shift - ;; - # Environmental variables used by chutney verify performance tests - # Send this many bytes per client connection (10 KBytes) - --data|--data-bytes|--data-byte|--bytes|--byte) - export CHUTNEY_DATA_BYTES="$2" + TOR_DIR="$2" shift ;; - # Make this many connections per client (1) - # Note: If you create 7 or more connections to a hidden service from - # a single Tor 0.2.7 client, you'll likely get a verification failure due - # to #15937. This is fixed in 0.2.8. - --connections|--connection|--connection-count|--count) - export CHUTNEY_CONNECTIONS="$2" - shift + --quiet) + ECHO=true ;; - # Make each client connect to each HS (0) - # 0 means a single client connects to each HS - # 1 means every client connects to every HS - --hs-multi-client|--hs-multi-clients|--hs-client|--hs-clients) - export CHUTNEY_HS_MULTI_CLIENT="$2" - shift - ;; - --coverage) - export USE_COVERAGE_BINARY=true - ;; - --dry-run) - # process arguments, but don't call any other scripts - export NETWORK_DRY_RUN=true - ;; *) - echo "$myname: Sorry, I don't know what to do with '$1'." - echo "$myname: Maybe chutney's test-network.sh understands '$1'." - echo "$myname: Please update your chutney using 'git pull', and set \ -\$CHUTNEY_PATH" - # continue processing arguments during a dry run - if [ "$NETWORK_DRY_RUN" != true ]; then - exit 2 - fi + # maybe chutney's test-network.sh can handle it ;; esac shift @@ -106,22 +48,22 @@ done # optional: $TOR_DIR is the tor build directory # it's used to find the location of tor binaries # if it's not set: -# - set it ro $BUILDDIR, or +# - set it to $BUILDDIR, or # - if $PWD looks like a tor build directory, set it to $PWD, or # - unset $TOR_DIR, and let chutney fall back to finding tor binaries in $PATH if [ ! -d "$TOR_DIR" ]; then if [ -d "$BUILDDIR/src/or" -a -d "$BUILDDIR/src/tools" ]; then # Choose the build directory # But only if it looks like one - echo "$myname: \$TOR_DIR not set, trying \$BUILDDIR" - export TOR_DIR="$BUILDDIR" + $ECHO "$myname: \$TOR_DIR not set, trying \$BUILDDIR" + TOR_DIR="$BUILDDIR" elif [ -d "$PWD/src/or" -a -d "$PWD/src/tools" ]; then # Guess the tor directory is the current directory # But only if it looks like one - echo "$myname: \$TOR_DIR not set, trying \$PWD" - export TOR_DIR="$PWD" + $ECHO "$myname: \$TOR_DIR not set, trying \$PWD" + TOR_DIR="$PWD" else - echo "$myname: no \$TOR_DIR, chutney will use \$PATH for tor binaries" + $ECHO "$myname: no \$TOR_DIR, chutney will use \$PATH for tor binaries" unset TOR_DIR fi fi @@ -133,63 +75,34 @@ fi # - fail and tell the user how to clone the chutney repository if [ ! -d "$CHUTNEY_PATH" -o ! -x "$CHUTNEY_PATH/chutney" ]; then if [ -x "$PWD/chutney" ]; then - echo "$myname: \$CHUTNEY_PATH not valid, trying \$PWD" - export CHUTNEY_PATH="$PWD" + $ECHO "$myname: \$CHUTNEY_PATH not valid, trying \$PWD" + CHUTNEY_PATH="$PWD" elif [ -d "$TOR_DIR" -a -d "$TOR_DIR/../chutney" -a \ -x "$TOR_DIR/../chutney/chutney" ]; then - echo "$myname: \$CHUTNEY_PATH not valid, trying \$TOR_DIR/../chutney" - export CHUTNEY_PATH="$TOR_DIR/../chutney" + $ECHO "$myname: \$CHUTNEY_PATH not valid, trying \$TOR_DIR/../chutney" + CHUTNEY_PATH="$TOR_DIR/../chutney" else - # TODO: work out how to package and install chutney, - # so users can find it in $PATH - echo "$myname: missing 'chutney' in \$CHUTNEY_PATH ($CHUTNEY_PATH)" - echo "$myname: Get chutney: git clone https://git.torproject.org/\ + $ECHO "$myname: missing 'chutney' in \$CHUTNEY_PATH ($CHUTNEY_PATH)" + $ECHO "$myname: Get chutney: git clone https://git.torproject.org/\ chutney.git" - echo "$myname: Set \$CHUTNEY_PATH to a non-standard location: export \ + $ECHO "$myname: Set \$CHUTNEY_PATH to a non-standard location: export \ CHUTNEY_PATH=\`pwd\`/chutney" unset CHUTNEY_PATH exit 1 fi fi -# When we switch to using test-network.sh in chutney/tools, this comment and -# everything below it can be removed - -# For picking up the right tor binaries. -# If these varibles aren't set, chutney looks for tor binaries in $PATH -if [ -d "$TOR_DIR" ]; then - tor_name=tor - tor_gencert_name=tor-gencert - if [ "$USE_COVERAGE_BINARY" = true ]; then - tor_name=tor-cov - fi - export CHUTNEY_TOR="${TOR_DIR}/src/or/${tor_name}" - export CHUTNEY_TOR_GENCERT="${TOR_DIR}/src/tools/${tor_gencert_name}" -fi - -# Set the variables for the chutney network flavour -export NETWORK_FLAVOUR=${NETWORK_FLAVOUR:-"bridges+hs"} -export CHUTNEY_NETWORK=networks/$NETWORK_FLAVOUR - -# And finish up if we're doing a dry run -if [ "$NETWORK_DRY_RUN" = true ]; then - # we can't exit here, it breaks argument processing - return +TEST_NETWORK="$CHUTNEY_PATH/tools/test-network.sh" +# Call the chutney version of this script, if it exists, and we can find it +if [ -d "$CHUTNEY_PATH" -a -x "$TEST_NETWORK" ]; then + $ECHO "$myname: Calling newer chutney script $TEST_NETWORK" + # this may fail if some arguments have spaces in them + # if so, set CHUTNEY_PATH before calling test-network.sh, and spaces + # will be handled correctly + exec "$TEST_NETWORK" $ORIGINAL_ARGS +else + $ECHO "$myname: Could not find tools/test-network.sh in CHUTNEY_PATH." + $ECHO "$myname: Please update your chutney using 'git pull'." + # We have failed to do what the user asked + exit 1 fi - -cd "$CHUTNEY_PATH" -./tools/bootstrap-network.sh $NETWORK_FLAVOUR || exit 2 - -# Sleep some, waiting for the network to bootstrap. -# TODO: Add chutney command 'bootstrap-status' and use that instead. -BOOTSTRAP_TIME=${BOOTSTRAP_TIME:-35} -$ECHO_N "$myname: sleeping for $BOOTSTRAP_TIME seconds" -n=$BOOTSTRAP_TIME; while [ $n -gt 0 ]; do - sleep 1; n=$(expr $n - 1); $ECHO_N . -done; echo "" -./chutney verify $CHUTNEY_NETWORK -VERIFY_EXIT_STATUS=$? -# work around a bug/feature in make -j2 (or more) -# where make hangs if any child processes are still alive -./chutney stop $CHUTNEY_NETWORK -exit $VERIFY_EXIT_STATUS diff --git a/src/test/test-timers.c b/src/test/test-timers.c index b5fcade7f8..99715f4333 100644 --- a/src/test/test-timers.c +++ b/src/test/test-timers.c @@ -1,4 +1,4 @@ -/* Copyright 2016, The Tor Project, Inc. */ +/* Copyright 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test.c b/src/test/test.c index 9a78859ef2..30944d805d 100644 --- a/src/test/test.c +++ b/src/test/test.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -44,13 +44,13 @@ double fabs(double x); #include "buffers.h" #include "circuitlist.h" #include "circuitstats.h" +#include "compress.h" #include "config.h" #include "connection_edge.h" #include "geoip.h" #include "rendcommon.h" #include "rendcache.h" #include "test.h" -#include "torgzip.h" #include "main.h" #include "memarea.h" #include "onion.h" @@ -1189,16 +1189,21 @@ struct testgroup_t testgroups[] = { { "channelpadding/", channelpadding_tests }, { "channeltls/", channeltls_tests }, { "checkdir/", checkdir_tests }, + { "circuitbuild/", circuitbuild_tests }, { "circuitlist/", circuitlist_tests }, { "circuitmux/", circuitmux_tests }, { "circuituse/", circuituse_tests }, { "compat/libevent/", compat_libevent_tests }, { "config/", config_tests }, { "connection/", connection_tests }, + { "conscache/", conscache_tests }, + { "consdiff/", consdiff_tests }, + { "consdiffmgr/", consdiffmgr_tests }, { "container/", container_tests }, { "control/", controller_tests }, { "control/event/", controller_event_tests }, { "crypto/", crypto_tests }, + { "crypto/openssl/", crypto_openssl_tests }, { "dir/", dir_tests }, { "dir_handle_get/", dir_handle_get_tests }, { "dir/md/", microdesc_tests }, @@ -1233,6 +1238,7 @@ struct testgroup_t testgroups[] = { { "socks/", socks_tests }, { "shared-random/", sr_tests }, { "status/" , status_tests }, + { "storagedir/", storagedir_tests }, { "tortls/", tortls_tests }, { "util/", util_tests }, { "util/format/", util_format_tests }, diff --git a/src/test/test.h b/src/test/test.h index 1f12a9d6c2..0ba91fb3f6 100644 --- a/src/test/test.h +++ b/src/test/test.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2003, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TEST_H @@ -184,16 +184,21 @@ extern struct testcase_t channel_tests[]; extern struct testcase_t channelpadding_tests[]; extern struct testcase_t channeltls_tests[]; extern struct testcase_t checkdir_tests[]; +extern struct testcase_t circuitbuild_tests[]; extern struct testcase_t circuitlist_tests[]; extern struct testcase_t circuitmux_tests[]; extern struct testcase_t circuituse_tests[]; extern struct testcase_t compat_libevent_tests[]; extern struct testcase_t config_tests[]; extern struct testcase_t connection_tests[]; +extern struct testcase_t conscache_tests[]; +extern struct testcase_t consdiff_tests[]; +extern struct testcase_t consdiffmgr_tests[]; extern struct testcase_t container_tests[]; extern struct testcase_t controller_tests[]; extern struct testcase_t controller_event_tests[]; extern struct testcase_t crypto_tests[]; +extern struct testcase_t crypto_openssl_tests[]; extern struct testcase_t dir_tests[]; extern struct testcase_t dir_handle_get_tests[]; extern struct testcase_t entryconn_tests[]; @@ -228,6 +233,7 @@ extern struct testcase_t routerkeys_tests[]; extern struct testcase_t routerlist_tests[]; extern struct testcase_t routerset_tests[]; extern struct testcase_t scheduler_tests[]; +extern struct testcase_t storagedir_tests[]; extern struct testcase_t socks_tests[]; extern struct testcase_t status_tests[]; extern struct testcase_t thread_tests[]; diff --git a/src/test/test_addr.c b/src/test/test_addr.c index 49e248014f..b6d2445bad 100644 --- a/src/test/test_addr.c +++ b/src/test/test_addr.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ADDRESSMAP_PRIVATE diff --git a/src/test/test_address.c b/src/test/test_address.c index 0d142ad483..50a0574522 100644 --- a/src/test/test_address.c +++ b/src/test/test_address.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define ADDRESS_PRIVATE diff --git a/src/test/test_bt_cl.c b/src/test/test_bt_cl.c index 709d599f52..ed588ecc5b 100644 --- a/src/test/test_bt_cl.c +++ b/src/test/test_bt_cl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c index 9e7bdb8911..07114a8571 100644 --- a/src/test/test_buffers.c +++ b/src/test/test_buffers.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define BUFFERS_PRIVATE @@ -578,120 +578,150 @@ test_buffer_time_tracking(void *arg) } static void -test_buffers_zlib_impl(int finalize_with_nil) +test_buffers_compress_fin_at_chunk_end_impl(compress_method_t method, + compression_level_t level) { char *msg = NULL; char *contents = NULL; char *expanded = NULL; buf_t *buf = NULL; - tor_zlib_state_t *zlib_state = NULL; + tor_compress_state_t *compress_state = NULL; size_t out_len, in_len; - int done; + size_t sz, headerjunk; buf = buf_new_with_capacity(128); /* will round up */ - zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION); + sz = buf_get_default_chunk_size(buf); + msg = tor_malloc_zero(sz); - msg = tor_malloc(512); - crypto_rand(msg, 512); - tt_int_op(write_to_buf_zlib(buf, zlib_state, msg, 128, 0), OP_EQ, 0); - tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+128, 128, 0), OP_EQ, 0); - tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+256, 256, 0), OP_EQ, 0); - done = !finalize_with_nil; - tt_int_op(write_to_buf_zlib(buf, zlib_state, "all done", 9, done), OP_EQ, 0); - if (finalize_with_nil) { - tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0); - } + write_to_buf(msg, 1, buf); + tt_assert(buf->head); + + /* Fill up the chunk so the compression stuff won't fit in one chunk. */ + tt_uint_op(buf->head->memlen, OP_LT, sz); + headerjunk = buf->head->memlen - 7; + write_to_buf(msg, headerjunk-1, buf); + tt_uint_op(buf->head->datalen, OP_EQ, headerjunk); + tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk); + /* Write an empty string, with finalization on. */ + compress_state = tor_compress_new(1, method, level); + tt_int_op(write_to_buf_compress(buf, compress_state, "", 0, 1), OP_EQ, 0); in_len = buf_datalen(buf); contents = tor_malloc(in_len); tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0); - tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len, - contents, in_len, - ZLIB_METHOD, 1, - LOG_WARN)); + if (method == NO_METHOD) { + tt_uint_op(in_len, OP_EQ, headerjunk); + } else { + tt_uint_op(in_len, OP_GT, headerjunk); + } - tt_int_op(out_len, OP_GE, 128); - tt_mem_op(msg, OP_EQ, expanded, 128); - tt_int_op(out_len, OP_GE, 512); - tt_mem_op(msg, OP_EQ, expanded, 512); - tt_int_op(out_len, OP_EQ, 512+9); - tt_mem_op("all done", OP_EQ, expanded+512, 9); + tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len, + contents + headerjunk, + in_len - headerjunk, + method, 1, + LOG_WARN)); + + tt_int_op(out_len, OP_EQ, 0); + tt_assert(expanded); done: buf_free(buf); - tor_zlib_free(zlib_state); + tor_compress_free(compress_state); tor_free(contents); tor_free(expanded); tor_free(msg); } static void -test_buffers_zlib(void *arg) -{ - (void) arg; - test_buffers_zlib_impl(0); -} -static void -test_buffers_zlib_fin_with_nil(void *arg) -{ - (void) arg; - test_buffers_zlib_impl(1); -} - -static void -test_buffers_zlib_fin_at_chunk_end(void *arg) +test_buffers_compress_impl(compress_method_t method, + compression_level_t level, + int finalize_with_nil) { char *msg = NULL; char *contents = NULL; char *expanded = NULL; buf_t *buf = NULL; - tor_zlib_state_t *zlib_state = NULL; + tor_compress_state_t *compress_state = NULL; size_t out_len, in_len; - size_t sz, headerjunk; - (void) arg; + int done; buf = buf_new_with_capacity(128); /* will round up */ - sz = buf_get_default_chunk_size(buf); - msg = tor_malloc_zero(sz); - - write_to_buf(msg, 1, buf); - tt_assert(buf->head); + compress_state = tor_compress_new(1, method, level); - /* Fill up the chunk so the zlib stuff won't fit in one chunk. */ - tt_uint_op(buf->head->memlen, OP_LT, sz); - headerjunk = buf->head->memlen - 7; - write_to_buf(msg, headerjunk-1, buf); - tt_uint_op(buf->head->datalen, OP_EQ, headerjunk); - tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk); - /* Write an empty string, with finalization on. */ - zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION); - tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0); + msg = tor_malloc(512); + crypto_rand(msg, 512); + tt_int_op(write_to_buf_compress(buf, compress_state, + msg, 128, 0), OP_EQ, 0); + tt_int_op(write_to_buf_compress(buf, compress_state, + msg+128, 128, 0), OP_EQ, 0); + tt_int_op(write_to_buf_compress(buf, compress_state, + msg+256, 256, 0), OP_EQ, 0); + done = !finalize_with_nil; + tt_int_op(write_to_buf_compress(buf, compress_state, + "all done", 9, done), OP_EQ, 0); + if (finalize_with_nil) { + tt_int_op(write_to_buf_compress(buf, compress_state, "", 0, 1), OP_EQ, 0); + } in_len = buf_datalen(buf); contents = tor_malloc(in_len); tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0); - tt_uint_op(in_len, OP_GT, headerjunk); - - tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len, - contents + headerjunk, in_len - headerjunk, - ZLIB_METHOD, 1, - LOG_WARN)); + tt_int_op(0, OP_EQ, tor_uncompress(&expanded, &out_len, + contents, in_len, + method, 1, + LOG_WARN)); - tt_int_op(out_len, OP_EQ, 0); - tt_assert(expanded); + tt_int_op(out_len, OP_GE, 128); + tt_mem_op(msg, OP_EQ, expanded, 128); + tt_int_op(out_len, OP_GE, 512); + tt_mem_op(msg, OP_EQ, expanded, 512); + tt_int_op(out_len, OP_EQ, 512+9); + tt_mem_op("all done", OP_EQ, expanded+512, 9); done: buf_free(buf); - tor_zlib_free(zlib_state); + tor_compress_free(compress_state); tor_free(contents); tor_free(expanded); tor_free(msg); } +static void +test_buffers_compress(void *arg) +{ + const char *methodname = arg; + tt_assert(methodname); + + compress_method_t method = compression_method_get_by_name(methodname); + tt_int_op(method, OP_NE, UNKNOWN_METHOD); + + if (! tor_compress_supports_method(method)) { + tt_skip(); + } + + compression_level_t levels[] = { + BEST_COMPRESSION, + HIGH_COMPRESSION, + MEDIUM_COMPRESSION, + LOW_COMPRESSION + }; + + for (unsigned l = 0; l < ARRAY_LENGTH(levels); ++l) { + compression_level_t level = levels[l]; + + test_buffers_compress_impl(method, level, 0); + test_buffers_compress_impl(method, level, 1); + test_buffers_compress_fin_at_chunk_end_impl(method, level); + } + + done: + ; +} + static const uint8_t *tls_read_ptr; static int n_remaining; static int next_reply_val[16]; @@ -816,14 +846,22 @@ struct testcase_t buffer_tests[] = { { "allocation_tracking", test_buffer_allocation_tracking, TT_FORK, NULL, NULL }, { "time_tracking", test_buffer_time_tracking, TT_FORK, NULL, NULL }, - { "zlib", test_buffers_zlib, TT_FORK, NULL, NULL }, - { "zlib_fin_with_nil", test_buffers_zlib_fin_with_nil, TT_FORK, NULL, NULL }, - { "zlib_fin_at_chunk_end", test_buffers_zlib_fin_at_chunk_end, TT_FORK, - NULL, NULL}, { "tls_read_mocked", test_buffers_tls_read_mocked, 0, NULL, NULL }, { "chunk_size", test_buffers_chunk_size, 0, NULL, NULL }, { "find_contentlen", test_buffers_find_contentlen, 0, NULL, NULL }, + + { "compress/zlib", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"deflate" }, + { "compress/gzip", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"gzip" }, + { "compress/zstd", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"x-zstd" }, + { "compress/lzma", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"x-tor-lzma" }, + { "compress/none", test_buffers_compress, TT_FORK, + &passthrough_setup, (char*)"identity" }, + END_OF_TESTCASES }; diff --git a/src/test/test_cell_formats.c b/src/test/test_cell_formats.c index 22c34b6d6c..007f7e3d3e 100644 --- a/src/test/test_cell_formats.c +++ b/src/test/test_cell_formats.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_cell_queue.c b/src/test/test_cell_queue.c index 93ac9854d8..69e89b69b0 100644 --- a/src/test/test_cell_queue.c +++ b/src/test/test_cell_queue.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CIRCUITLIST_PRIVATE diff --git a/src/test/test_channel.c b/src/test/test_channel.c index 862bd6dfa6..f5999b8e67 100644 --- a/src/test/test_channel.c +++ b/src/test/test_channel.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TOR_CHANNEL_INTERNAL_ diff --git a/src/test/test_channeltls.c b/src/test/test_channeltls.c index fd98ee40fb..96c5eba9a5 100644 --- a/src/test/test_channeltls.c +++ b/src/test/test_channeltls.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_checkdir.c b/src/test/test_checkdir.c index fbb33f87f6..38f3360b61 100644 --- a/src/test/test_checkdir.c +++ b/src/test/test_checkdir.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_circuitbuild.c b/src/test/test_circuitbuild.c new file mode 100644 index 0000000000..a5282df69d --- /dev/null +++ b/src/test/test_circuitbuild.c @@ -0,0 +1,133 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CIRCUITBUILD_PRIVATE + +#include "or.h" +#include "test.h" +#include "test_helpers.h" +#include "log_test_helpers.h" +#include "config.h" +#include "circuitbuild.h" + +/* Dummy nodes smartlist for testing */ +static smartlist_t dummy_nodes; +/* Dummy exit extend_info for testing */ +static extend_info_t dummy_ei; + +static int +mock_count_acceptable_nodes(smartlist_t *nodes) +{ + (void)nodes; + + return DEFAULT_ROUTE_LEN + 1; +} + +/* Test route lengths when the caller of new_route_len() doesn't + * specify exit_ei. */ +static void +test_new_route_len_noexit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, NULL, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT, NULL, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, NULL, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + done: + UNMOCK(count_acceptable_nodes); +} + +/* Test route lengths where someone else chose the "exit" node, which + * require an extra hop for safety. */ +static void +test_new_route_len_unsafe_exit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + /* connecting to hidden service directory */ + r = new_route_len(CIRCUIT_PURPOSE_C_GENERAL, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + + /* client connecting to introduction point */ + r = new_route_len(CIRCUIT_PURPOSE_C_INTRODUCING, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + + /* hidden service connecting to rendezvous point */ + r = new_route_len(CIRCUIT_PURPOSE_S_CONNECT_REND, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + + done: + UNMOCK(count_acceptable_nodes); +} + +/* Test route lengths where we chose the "exit" node, which don't + * require an extra hop for safety. */ +static void +test_new_route_len_safe_exit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + /* hidden service connecting to introduction point */ + r = new_route_len(CIRCUIT_PURPOSE_S_ESTABLISH_INTRO, &dummy_ei, + &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + /* router testing its own reachability */ + r = new_route_len(CIRCUIT_PURPOSE_TESTING, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN, OP_EQ, r); + + done: + UNMOCK(count_acceptable_nodes); +} + +/* Make sure a non-fatal assertion fails when new_route_len() gets an + * unexpected circuit purpose. */ +static void +test_new_route_len_unhandled_exit(void *arg) +{ + int r; + + (void)arg; + MOCK(count_acceptable_nodes, mock_count_acceptable_nodes); + + tor_capture_bugs_(1); + setup_full_capture_of_logs(LOG_WARN); + r = new_route_len(CIRCUIT_PURPOSE_CONTROLLER, &dummy_ei, &dummy_nodes); + tt_int_op(DEFAULT_ROUTE_LEN + 1, OP_EQ, r); + tt_int_op(smartlist_len(tor_get_captured_bug_log_()), OP_EQ, 1); + tt_str_op(smartlist_get(tor_get_captured_bug_log_(), 0), OP_EQ, + "!(exit_ei && !known_purpose)"); + expect_single_log_msg_containing("Unhandled purpose"); + expect_single_log_msg_containing("with a chosen exit; assuming routelen"); + teardown_capture_of_logs(); + tor_end_capture_bugs_(); + + done: + UNMOCK(count_acceptable_nodes); +} + +struct testcase_t circuitbuild_tests[] = { + { "noexit", test_new_route_len_noexit, 0, NULL, NULL }, + { "safe_exit", test_new_route_len_safe_exit, 0, NULL, NULL }, + { "unsafe_exit", test_new_route_len_unsafe_exit, 0, NULL, NULL }, + { "unhandled_exit", test_new_route_len_unhandled_exit, 0, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c index 7eed5fe225..344ab27921 100644 --- a/src/test/test_circuitlist.c +++ b/src/test/test_circuitlist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TOR_CHANNEL_INTERNAL_ @@ -201,68 +201,68 @@ test_rend_token_maps(void *arg) tt_int_op(tok3[REND_TOKEN_LEN-1], OP_EQ, '.'); /* No maps; nothing there. */ - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok1)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1)); - hs_circuitmap_register_rend_circ(c1, tok1); - hs_circuitmap_register_intro_circ_v2(c2, tok2); + hs_circuitmap_register_rend_circ_relay_side(c1, tok1); + hs_circuitmap_register_intro_circ_v2_relay_side(c2, tok2); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok3)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok2)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok3)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1)); /* Without purpose set, we don't get the circuits */ - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok1)); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); c1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; c2->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; /* Okay, make sure they show up now. */ - tt_ptr_op(c1, OP_EQ, hs_circuitmap_get_rend_circ(tok1)); - tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2)); + tt_ptr_op(c1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); /* Two items at the same place with the same token. */ c3->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; - hs_circuitmap_register_rend_circ(c3, tok2); - tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2)); - tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ(tok2)); + hs_circuitmap_register_rend_circ_relay_side(c3, tok2); + tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); + tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); /* Marking a circuit makes it not get returned any more */ circuit_mark_for_close(TO_CIRCUIT(c1), END_CIRC_REASON_FINISHED); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); circuit_free(TO_CIRCUIT(c1)); c1 = NULL; /* Freeing a circuit makes it not get returned any more. */ circuit_free(TO_CIRCUIT(c2)); c2 = NULL; - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); /* c3 -- are you still there? */ - tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ(tok2)); + tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); /* Change its cookie. This never happens in Tor per se, but hey. */ c3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; - hs_circuitmap_register_intro_circ_v2(c3, tok3); + hs_circuitmap_register_intro_circ_v2_relay_side(c3, tok3); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok2)); - tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); /* Now replace c3 with c4. */ c4->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; - hs_circuitmap_register_intro_circ_v2(c4, tok3); + hs_circuitmap_register_intro_circ_v2_relay_side(c4, tok3); - tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3)); + tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); - tt_ptr_op(c3->hs_token, OP_EQ, NULL); - tt_ptr_op(c4->hs_token, OP_NE, NULL); - tt_mem_op(c4->hs_token->token, OP_EQ, tok3, REND_TOKEN_LEN); + tt_ptr_op(TO_CIRCUIT(c3)->hs_token, OP_EQ, NULL); + tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_NE, NULL); + tt_mem_op(TO_CIRCUIT(c4)->hs_token->token, OP_EQ, tok3, REND_TOKEN_LEN); /* Now clear c4's cookie. */ - hs_circuitmap_remove_circuit(c4); - tt_ptr_op(c4->hs_token, OP_EQ, NULL); - tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3)); + hs_circuitmap_remove_circuit(TO_CIRCUIT(c4)); + tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_EQ, NULL); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3)); done: if (c1) @@ -370,10 +370,89 @@ test_pick_circid(void *arg) UNMOCK(channel_dump_statistics); } +/** Test that the circuit pools of our HS circuitmap are isolated based on + * their token type. */ +static void +test_hs_circuitmap_isolation(void *arg) +{ + or_circuit_t *circ1 = NULL; + origin_circuit_t *circ2 = NULL; + or_circuit_t *circ3 = NULL; + origin_circuit_t *circ4 = NULL; + + (void)arg; + + hs_circuitmap_init(); + + { + const uint8_t tok1[REND_TOKEN_LEN] = "bet i got some of th"; + + circ1 = or_circuit_new(0, NULL); + tt_assert(circ1); + circ1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING; + + /* check that circuitmap is empty right? */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + + /* Register circ1 with tok1 as relay-side rend circ */ + hs_circuitmap_register_rend_circ_relay_side(circ1, tok1); + + /* check that service-side getters don't work */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_service_side(tok1)); + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_service_side(tok1)); + + /* Check that the right getter works. */ + tt_ptr_op(circ1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1)); + } + + { + const uint8_t tok2[REND_TOKEN_LEN] = "you dont know anythi"; + + circ2 = origin_circuit_new(); + tt_assert(circ2); + circ2->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; + circ3 = or_circuit_new(0, NULL); + tt_assert(circ3); + circ3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT; + circ4 = origin_circuit_new(); + tt_assert(circ4); + circ4->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO; + + /* Register circ2 with tok2 as service-side intro v2 circ */ + hs_circuitmap_register_intro_circ_v2_service_side(circ2, tok2); + /* Register circ3 with tok2 again but for different purpose */ + hs_circuitmap_register_intro_circ_v2_relay_side(circ3, tok2); + + /* Check that the getters work */ + tt_ptr_op(circ2, OP_EQ, + hs_circuitmap_get_intro_circ_v2_service_side(tok2)); + tt_ptr_op(circ3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2)); + + /* Register circ4 with tok2: it should override circ2 */ + hs_circuitmap_register_intro_circ_v2_service_side(circ4, tok2); + + /* check that relay-side getters don't work */ + tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2)); + + /* Check that the getter returns circ4; the last circuit registered with + * that token. */ + tt_ptr_op(circ4, OP_EQ, + hs_circuitmap_get_intro_circ_v2_service_side(tok2)); + } + + done: + circuit_free(TO_CIRCUIT(circ1)); + circuit_free(TO_CIRCUIT(circ2)); + circuit_free(TO_CIRCUIT(circ3)); + circuit_free(TO_CIRCUIT(circ4)); +} + struct testcase_t circuitlist_tests[] = { { "maps", test_clist_maps, TT_FORK, NULL, NULL }, { "rend_token_maps", test_rend_token_maps, TT_FORK, NULL, NULL }, { "pick_circid", test_pick_circid, TT_FORK, NULL, NULL }, + { "hs_circuitmap_isolation", test_hs_circuitmap_isolation, + TT_FORK, NULL, NULL }, END_OF_TESTCASES }; diff --git a/src/test/test_circuitmux.c b/src/test/test_circuitmux.c index 9e8fb54964..779783299d 100644 --- a/src/test/test_circuitmux.c +++ b/src/test/test_circuitmux.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TOR_CHANNEL_INTERNAL_ diff --git a/src/test/test_circuituse.c b/src/test/test_circuituse.c index 27a87660ff..5cc9fe571e 100644 --- a/src/test/test_circuituse.c +++ b/src/test/test_circuituse.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CIRCUITLIST_PRIVATE diff --git a/src/test/test_compat_libevent.c b/src/test/test_compat_libevent.c index 0443cc0b1c..7dd8e65194 100644 --- a/src/test/test_compat_libevent.c +++ b/src/test/test_compat_libevent.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define COMPAT_LIBEVENT_PRIVATE diff --git a/src/test/test_config.c b/src/test/test_config.c index 3b19cad036..f0874e0e0b 100644 --- a/src/test/test_config.c +++ b/src/test/test_config.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_connection.c b/src/test/test_connection.c index 5cda4f3175..7e5193b203 100644 --- a/src/test/test_connection.c +++ b/src/test/test_connection.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -265,7 +265,7 @@ test_conn_get_rend_setup(const struct testcase_t *tc) rend_cache_init(); - /* TODO: use directory_initiate_command_rend() to do this - maybe? */ + /* TODO: use directory_initiate_request() to do this - maybe? */ tor_assert(strlen(TEST_CONN_REND_ADDR) == REND_SERVICE_ID_LEN_BASE32); conn->rend_data = rend_data_client_create(TEST_CONN_REND_ADDR, NULL, NULL, REND_NO_AUTH); diff --git a/src/test/test_conscache.c b/src/test/test_conscache.c new file mode 100644 index 0000000000..aee1ba8a06 --- /dev/null +++ b/src/test/test_conscache.c @@ -0,0 +1,340 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "config.h" +#include "conscache.h" +#include "test.h" + +#ifdef HAVE_UTIME_H +#include <utime.h> +#endif + +static void +test_conscache_open_failure(void *arg) +{ + (void) arg; + /* Try opening a directory that doesn't exist and which we shouldn't be + * able to create. */ + consensus_cache_t *cache = consensus_cache_open("a/b/c/d/e/f/g", 128); + tt_ptr_op(cache, OP_EQ, NULL); + + done: + ; +} + +static void +test_conscache_simple_usage(void *arg) +{ + (void)arg; + consensus_cache_entry_t *ent = NULL, *ent2 = NULL; + + /* Make a temporary datadir for these tests */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = tor_strdup(ddir_fname); + check_private_dir(ddir_fname, CPD_CREATE, NULL); + consensus_cache_t *cache = consensus_cache_open("cons", 128); + + tt_assert(cache); + + /* Create object; make sure it exists. */ + config_line_t *labels = NULL; + config_line_append(&labels, "Hello", "world"); + config_line_append(&labels, "Adios", "planetas"); + ent = consensus_cache_add(cache, + labels, (const uint8_t *)"A\0B\0C", 5); + config_free_lines(labels); + labels = NULL; + tt_assert(ent); + + /* Make a second object */ + config_line_append(&labels, "Hello", "mundo"); + config_line_append(&labels, "Adios", "planets"); + ent2 = consensus_cache_add(cache, + labels, (const uint8_t *)"xyzzy", 5); + config_free_lines(labels); + labels = NULL; + tt_assert(ent2); + tt_assert(! consensus_cache_entry_is_mapped(ent2)); + consensus_cache_entry_decref(ent2); + ent2 = NULL; + + /* Check get_value */ + tt_ptr_op(NULL, OP_EQ, consensus_cache_entry_get_value(ent, "hebbo")); + tt_str_op("world", OP_EQ, consensus_cache_entry_get_value(ent, "Hello")); + + /* Check find_first */ + ent2 = consensus_cache_find_first(cache, "Hello", "world!"); + tt_ptr_op(ent2, OP_EQ, NULL); + ent2 = consensus_cache_find_first(cache, "Hello", "world"); + tt_ptr_op(ent2, OP_EQ, ent); + ent2 = consensus_cache_find_first(cache, "Hello", "mundo"); + tt_ptr_op(ent2, OP_NE, ent); + + tt_assert(! consensus_cache_entry_is_mapped(ent)); + + /* Check get_body */ + const uint8_t *bp = NULL; + size_t sz = 0; + int r = consensus_cache_entry_get_body(ent, &bp, &sz); + tt_int_op(r, OP_EQ, 0); + tt_u64_op(sz, OP_EQ, 5); + tt_mem_op(bp, OP_EQ, "A\0B\0C", 5); + tt_assert(consensus_cache_entry_is_mapped(ent)); + + /* Free and re-create the cache, to rescan the directory. */ + consensus_cache_free(cache); + consensus_cache_entry_decref(ent); + cache = consensus_cache_open("cons", 128); + + /* Make sure the entry is still there */ + ent = consensus_cache_find_first(cache, "Hello", "mundo"); + tt_assert(ent); + ent2 = consensus_cache_find_first(cache, "Adios", "planets"); + tt_ptr_op(ent, OP_EQ, ent2); + consensus_cache_entry_incref(ent); + tt_assert(! consensus_cache_entry_is_mapped(ent)); + r = consensus_cache_entry_get_body(ent, &bp, &sz); + tt_int_op(r, OP_EQ, 0); + tt_u64_op(sz, OP_EQ, 5); + tt_mem_op(bp, OP_EQ, "xyzzy", 5); + tt_assert(consensus_cache_entry_is_mapped(ent)); + + /* There should be two entries total. */ + smartlist_t *entries = smartlist_new(); + consensus_cache_find_all(entries, cache, NULL, NULL); + int n = smartlist_len(entries); + smartlist_free(entries); + tt_int_op(n, OP_EQ, 2); + + done: + consensus_cache_entry_decref(ent); + tor_free(ddir_fname); + consensus_cache_free(cache); +} + +static void +test_conscache_cleanup(void *arg) +{ + (void)arg; + const int N = 20; + consensus_cache_entry_t **ents = + tor_calloc(N, sizeof(consensus_cache_entry_t*)); + + /* Make a temporary datadir for these tests */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = tor_strdup(ddir_fname); + check_private_dir(ddir_fname, CPD_CREATE, NULL); + consensus_cache_t *cache = consensus_cache_open("cons", 128); + + tt_assert(cache); + + /* Create a bunch of entries. */ + int i; + for (i = 0; i < N; ++i) { + config_line_t *labels = NULL; + char num[8]; + tor_snprintf(num, sizeof(num), "%d", i); + config_line_append(&labels, "test-id", "cleanup"); + config_line_append(&labels, "index", num); + size_t bodylen = i * 3; + uint8_t *body = tor_malloc(bodylen); + memset(body, i, bodylen); + ents[i] = consensus_cache_add(cache, labels, body, bodylen); + tor_free(body); + config_free_lines(labels); + tt_assert(ents[i]); + /* We're still holding a reference to each entry at this point. */ + } + + /* Page all of the entries into RAM */ + for (i = 0; i < N; ++i) { + const uint8_t *bp; + size_t sz; + tt_assert(! consensus_cache_entry_is_mapped(ents[i])); + consensus_cache_entry_get_body(ents[i], &bp, &sz); + tt_assert(consensus_cache_entry_is_mapped(ents[i])); + } + + /* Mark some of the entries as deletable. */ + for (i = 7; i < N; i += 7) { + consensus_cache_entry_mark_for_removal(ents[i]); + tt_assert(consensus_cache_entry_is_mapped(ents[i])); + } + + /* Mark some of the entries as aggressively unpaged. */ + for (i = 3; i < N; i += 3) { + consensus_cache_entry_mark_for_aggressive_release(ents[i]); + tt_assert(consensus_cache_entry_is_mapped(ents[i])); + } + + /* Incref some of the entries again */ + for (i = 0; i < N; i += 2) { + consensus_cache_entry_incref(ents[i]); + } + + /* Now we're going to decref everything. We do so at a specific time. I'm + * picking the moment when I was writing this test, at 2017-04-05 12:16:48 + * UTC. */ + const time_t example_time = 1491394608; + update_approx_time(example_time); + for (i = 0; i < N; ++i) { + consensus_cache_entry_decref(ents[i]); + if (i % 2) { + ents[i] = NULL; /* We're no longer holding any reference here. */ + } + } + + /* At this point, the aggressively-released items with refcount 1 should + * be unmapped. Nothing should be deleted. */ + consensus_cache_entry_t *e_tmp; + e_tmp = consensus_cache_find_first(cache, "index", "3"); + tt_assert(e_tmp); + tt_assert(! consensus_cache_entry_is_mapped(e_tmp)); + e_tmp = consensus_cache_find_first(cache, "index", "5"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + e_tmp = consensus_cache_find_first(cache, "index", "6"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + e_tmp = consensus_cache_find_first(cache, "index", "7"); + tt_assert(e_tmp == NULL); // not found because pending deletion. + + /* Delete the pending-deletion items. */ + consensus_cache_delete_pending(cache, 0); + { + smartlist_t *entries = smartlist_new(); + consensus_cache_find_all(entries, cache, NULL, NULL); + int n = smartlist_len(entries); + smartlist_free(entries); + tt_int_op(n, OP_EQ, 20 - 2); /* 1 entry was deleted; 1 is not-found. */ + } + e_tmp = consensus_cache_find_first(cache, "index", "7"); // refcnt == 1... + tt_assert(e_tmp == NULL); // so deleted. + e_tmp = consensus_cache_find_first(cache, "index", "14"); // refcnt == 2 + tt_assert(e_tmp == NULL); // not deleted; but not found. + + /* Now do lazy unmapping. */ + // should do nothing. + consensus_cache_unmap_lazy(cache, example_time - 10); + e_tmp = consensus_cache_find_first(cache, "index", "11"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + // should actually unmap + consensus_cache_unmap_lazy(cache, example_time + 10); + e_tmp = consensus_cache_find_first(cache, "index", "11"); + tt_assert(e_tmp); + tt_assert(! consensus_cache_entry_is_mapped(e_tmp)); + // This one will still be mapped, since it has a reference. + e_tmp = consensus_cache_find_first(cache, "index", "16"); + tt_assert(e_tmp); + tt_assert(consensus_cache_entry_is_mapped(e_tmp)); + + for (i = 0; i < N; ++i) { + consensus_cache_entry_decref(ents[i]); + ents[i] = NULL; + } + + /* Free and re-create the cache, to rescan the directory. Make sure the + * deleted thing is still deleted, along with the other deleted thing. */ + consensus_cache_free(cache); + cache = consensus_cache_open("cons", 128); + { + smartlist_t *entries = smartlist_new(); + consensus_cache_find_all(entries, cache, NULL, NULL); + int n = smartlist_len(entries); + smartlist_free(entries); + tt_int_op(n, OP_EQ, 18); + } + + done: + for (i = 0; i < N; ++i) { + consensus_cache_entry_decref(ents[i]); + } + tor_free(ents); + tor_free(ddir_fname); + consensus_cache_free(cache); +} + +static void +test_conscache_filter(void *arg) +{ + (void)arg; + const int N = 30; + smartlist_t *lst = NULL; + + /* Make a temporary datadir for these tests */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cache")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = tor_strdup(ddir_fname); + check_private_dir(ddir_fname, CPD_CREATE, NULL); + consensus_cache_t *cache = consensus_cache_open("cons", 128); + + tt_assert(cache); + + /* Create a bunch of entries with different labels */ + int i; + for (i = 0; i < N; ++i) { + config_line_t *labels = NULL; + char num[8]; + tor_snprintf(num, sizeof(num), "%d", i); + config_line_append(&labels, "test-id", "filter"); + config_line_append(&labels, "index", num); + tor_snprintf(num, sizeof(num), "%d", i % 3); + config_line_append(&labels, "mod3", num); + tor_snprintf(num, sizeof(num), "%d", i % 5); + config_line_append(&labels, "mod5", num); + + size_t bodylen = i * 3; + uint8_t *body = tor_malloc(bodylen); + memset(body, i, bodylen); + consensus_cache_entry_t *ent = + consensus_cache_add(cache, labels, body, bodylen); + tor_free(body); + config_free_lines(labels); + tt_assert(ent); + consensus_cache_entry_decref(ent); + } + + lst = smartlist_new(); + /* Find nothing. */ + consensus_cache_find_all(lst, cache, "mod5", "5"); + tt_int_op(smartlist_len(lst), OP_EQ, 0); + /* Find everything. */ + consensus_cache_find_all(lst, cache, "test-id", "filter"); + tt_int_op(smartlist_len(lst), OP_EQ, N); + + /* Now filter to find the entries that have i%3 == 1 */ + consensus_cache_filter_list(lst, "mod3", "1"); + tt_int_op(smartlist_len(lst), OP_EQ, 10); + /* Now filter to find the entries that also have i%5 == 3 */ + consensus_cache_filter_list(lst, "mod5", "3"); + tt_int_op(smartlist_len(lst), OP_EQ, 2); + /* So now we have those entries for which i%15 == 13. */ + + consensus_cache_entry_t *ent1 = smartlist_get(lst, 0); + consensus_cache_entry_t *ent2 = smartlist_get(lst, 1); + const char *idx1 = consensus_cache_entry_get_value(ent1, "index"); + const char *idx2 = consensus_cache_entry_get_value(ent2, "index"); + tt_assert( (!strcmp(idx1, "28") && !strcmp(idx2, "13")) || + (!strcmp(idx1, "13") && !strcmp(idx2, "28")) ); + + done: + tor_free(ddir_fname); + consensus_cache_free(cache); + smartlist_free(lst); +} + +#define ENT(name) \ + { #name, test_conscache_ ## name, TT_FORK, NULL, NULL } + +struct testcase_t conscache_tests[] = { + ENT(open_failure), + ENT(simple_usage), + ENT(cleanup), + ENT(filter), + END_OF_TESTCASES +}; + diff --git a/src/test/test_consdiff.c b/src/test/test_consdiff.c new file mode 100644 index 0000000000..23948d6860 --- /dev/null +++ b/src/test/test_consdiff.c @@ -0,0 +1,1184 @@ +/* Copyright (c) 2014, Daniel Martà + * Copyright (c) 2014, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFF_PRIVATE + +#include "or.h" +#include "test.h" + +#include "consdiff.h" +#include "memarea.h" +#include "log_test_helpers.h" + +#define tt_str_eq_line(a,b) \ + tt_assert(line_str_eq((b),(a))) + +static void +test_consdiff_smartlist_slice(void *arg) +{ + smartlist_t *sl = smartlist_new(); + smartlist_slice_t *sls; + + /* Create a regular smartlist. */ + (void)arg; + smartlist_add(sl, (void*)1); + smartlist_add(sl, (void*)2); + smartlist_add(sl, (void*)3); + smartlist_add(sl, (void*)4); + smartlist_add(sl, (void*)5); + + /* See if the slice was done correctly. */ + sls = smartlist_slice(sl, 2, 5); + tt_ptr_op(sl, OP_EQ, sls->list); + tt_ptr_op((void*)3, OP_EQ, smartlist_get(sls->list, sls->offset)); + tt_ptr_op((void*)5, OP_EQ, + smartlist_get(sls->list, sls->offset + (sls->len-1))); + tor_free(sls); + + /* See that using -1 as the end does get to the last element. */ + sls = smartlist_slice(sl, 2, -1); + tt_ptr_op(sl, OP_EQ, sls->list); + tt_ptr_op((void*)3, OP_EQ, smartlist_get(sls->list, sls->offset)); + tt_ptr_op((void*)5, OP_EQ, + smartlist_get(sls->list, sls->offset + (sls->len-1))); + + done: + tor_free(sls); + smartlist_free(sl); +} + +static void +test_consdiff_smartlist_slice_string_pos(void *arg) +{ + smartlist_t *sl = smartlist_new(); + smartlist_slice_t *sls; + memarea_t *area = memarea_new(); + + /* Create a regular smartlist. */ + (void)arg; + consensus_split_lines(sl, "a\nd\nc\na\nb\n", area); + + /* See that smartlist_slice_string_pos respects the bounds of the slice. */ + sls = smartlist_slice(sl, 2, 5); + cdline_t a_line = { "a", 1 }; + tt_int_op(3, OP_EQ, smartlist_slice_string_pos(sls, &a_line)); + cdline_t d_line = { "d", 1 }; + tt_int_op(-1, OP_EQ, smartlist_slice_string_pos(sls, &d_line)); + + done: + tor_free(sls); + smartlist_free(sl); + memarea_drop_all(area); +} + +static void +test_consdiff_lcs_lengths(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + smartlist_slice_t *sls1, *sls2; + int *lengths1, *lengths2; + memarea_t *area = memarea_new(); + + /* Expected lcs lengths in regular and reverse order. */ + int e_lengths1[] = { 0, 1, 2, 3, 3, 4 }; + int e_lengths2[] = { 0, 1, 1, 2, 3, 4 }; + + (void)arg; + consensus_split_lines(sl1, "a\nb\nc\nd\ne\n", area); + consensus_split_lines(sl2, "a\nc\nd\ni\ne\n", area); + + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + + lengths1 = lcs_lengths(sls1, sls2, 1); + lengths2 = lcs_lengths(sls1, sls2, -1); + tt_mem_op(e_lengths1, OP_EQ, lengths1, sizeof(int) * 6); + tt_mem_op(e_lengths2, OP_EQ, lengths2, sizeof(int) * 6); + + done: + tor_free(lengths1); + tor_free(lengths2); + tor_free(sls1); + tor_free(sls2); + smartlist_free(sl1); + smartlist_free(sl2); + memarea_drop_all(area); +} + +static void +test_consdiff_trim_slices(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + smartlist_t *sl3 = smartlist_new(); + smartlist_t *sl4 = smartlist_new(); + smartlist_slice_t *sls1, *sls2, *sls3, *sls4; + memarea_t *area = memarea_new(); + + (void)arg; + consensus_split_lines(sl1, "a\nb\nb\nb\nd\n", area); + consensus_split_lines(sl2, "a\nc\nc\nc\nd\n", area); + consensus_split_lines(sl3, "a\nb\nb\nb\na\n", area); + consensus_split_lines(sl4, "c\nb\nb\nb\nc\n", area); + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + sls3 = smartlist_slice(sl3, 0, -1); + sls4 = smartlist_slice(sl4, 0, -1); + + /* They should be trimmed by one line at each end. */ + tt_int_op(5, OP_EQ, sls1->len); + tt_int_op(5, OP_EQ, sls2->len); + trim_slices(sls1, sls2); + tt_int_op(3, OP_EQ, sls1->len); + tt_int_op(3, OP_EQ, sls2->len); + + /* They should not be trimmed at all. */ + tt_int_op(5, OP_EQ, sls3->len); + tt_int_op(5, OP_EQ, sls4->len); + trim_slices(sls3, sls4); + tt_int_op(5, OP_EQ, sls3->len); + tt_int_op(5, OP_EQ, sls4->len); + + done: + tor_free(sls1); + tor_free(sls2); + tor_free(sls3); + tor_free(sls4); + smartlist_free(sl1); + smartlist_free(sl2); + smartlist_free(sl3); + smartlist_free(sl4); + memarea_drop_all(area); +} + +static void +test_consdiff_set_changed(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + bitarray_t *changed1 = bitarray_init_zero(4); + bitarray_t *changed2 = bitarray_init_zero(4); + smartlist_slice_t *sls1, *sls2; + memarea_t *area = memarea_new(); + + (void)arg; + consensus_split_lines(sl1, "a\nb\na\na\n", area); + consensus_split_lines(sl2, "a\na\na\na\n", area); + + /* Length of sls1 is 0. */ + sls1 = smartlist_slice(sl1, 0, 0); + sls2 = smartlist_slice(sl2, 1, 3); + set_changed(changed1, changed2, sls1, sls2); + + /* The former is not changed, the latter changes all of its elements. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(!bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + bitarray_clear(changed2, 1); + bitarray_clear(changed2, 2); + + /* Length of sls1 is 1 and its element is in sls2. */ + tor_free(sls1); + sls1 = smartlist_slice(sl1, 0, 1); + set_changed(changed1, changed2, sls1, sls2); + + /* The latter changes all elements but the (first) common one. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(!bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(!bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + bitarray_clear(changed2, 2); + + /* Length of sls1 is 1 and its element is not in sls2. */ + tor_free(sls1); + sls1 = smartlist_slice(sl1, 1, 2); + set_changed(changed1, changed2, sls1, sls2); + + /* The former changes its element, the latter changes all elements. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + + done: + bitarray_free(changed1); + bitarray_free(changed2); + smartlist_free(sl1); + smartlist_free(sl2); + tor_free(sls1); + tor_free(sls2); + memarea_drop_all(area); +} + +static void +test_consdiff_calc_changes(void *arg) +{ + smartlist_t *sl1 = smartlist_new(); + smartlist_t *sl2 = smartlist_new(); + smartlist_slice_t *sls1, *sls2; + bitarray_t *changed1 = bitarray_init_zero(4); + bitarray_t *changed2 = bitarray_init_zero(4); + memarea_t *area = memarea_new(); + + (void)arg; + consensus_split_lines(sl1, "a\na\na\na\n", area); + consensus_split_lines(sl2, "a\na\na\na\n", area); + + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + calc_changes(sls1, sls2, changed1, changed2); + + /* Nothing should be set to changed. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(!bitarray_is_set(changed1, 1)); + tt_assert(!bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(!bitarray_is_set(changed2, 1)); + tt_assert(!bitarray_is_set(changed2, 2)); + tt_assert(!bitarray_is_set(changed2, 3)); + + smartlist_clear(sl2); + consensus_split_lines(sl2, "a\nb\na\nb\n", area); + tor_free(sls1); + tor_free(sls2); + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + calc_changes(sls1, sls2, changed1, changed2); + + /* Two elements are changed. */ + tt_assert(!bitarray_is_set(changed1, 0)); + tt_assert(bitarray_is_set(changed1, 1)); + tt_assert(bitarray_is_set(changed1, 2)); + tt_assert(!bitarray_is_set(changed1, 3)); + bitarray_clear(changed1, 1); + bitarray_clear(changed1, 2); + + tt_assert(!bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(!bitarray_is_set(changed2, 2)); + tt_assert(bitarray_is_set(changed2, 3)); + bitarray_clear(changed1, 1); + bitarray_clear(changed1, 3); + + smartlist_clear(sl2); + consensus_split_lines(sl2, "b\nb\nb\nb\n", area); + tor_free(sls1); + tor_free(sls2); + sls1 = smartlist_slice(sl1, 0, -1); + sls2 = smartlist_slice(sl2, 0, -1); + calc_changes(sls1, sls2, changed1, changed2); + + /* All elements are changed. */ + tt_assert(bitarray_is_set(changed1, 0)); + tt_assert(bitarray_is_set(changed1, 1)); + tt_assert(bitarray_is_set(changed1, 2)); + tt_assert(bitarray_is_set(changed1, 3)); + + tt_assert(bitarray_is_set(changed2, 0)); + tt_assert(bitarray_is_set(changed2, 1)); + tt_assert(bitarray_is_set(changed2, 2)); + tt_assert(bitarray_is_set(changed2, 3)); + + done: + bitarray_free(changed1); + bitarray_free(changed2); + smartlist_free(sl1); + smartlist_free(sl2); + tor_free(sls1); + tor_free(sls2); + memarea_drop_all(area); +} + +static void +test_consdiff_get_id_hash(void *arg) +{ + (void)arg; + + cdline_t line1 = { "r name", 6 }; + cdline_t line2 = { "r name _hash_isnt_base64 etc", 28 }; + cdline_t line3 = { "r name hash+valid+base64 etc", 28 }; + cdline_t tmp; + + /* No hash. */ + tt_int_op(-1, OP_EQ, get_id_hash(&line1, &tmp)); + /* The hash contains characters that are not base64. */ + tt_int_op(-1, OP_EQ, get_id_hash(&line2, &tmp)); + + /* valid hash. */ + tt_int_op(0, OP_EQ, get_id_hash(&line3, &tmp)); + tt_ptr_op(tmp.s, OP_EQ, line3.s + 7); + tt_uint_op(tmp.len, OP_EQ, line3.len - 11); + + done: + ; +} + +static void +test_consdiff_is_valid_router_entry(void *arg) +{ + /* Doesn't start with "r ". */ + (void)arg; + cdline_t line0 = { "foo", 3 }; + tt_int_op(0, OP_EQ, is_valid_router_entry(&line0)); + + /* These are already tested with get_id_hash, but make sure it's run + * properly. */ + + cdline_t line1 = { "r name", 6 }; + cdline_t line2 = { "r name _hash_isnt_base64 etc", 28 }; + cdline_t line3 = { "r name hash+valid+base64 etc", 28 }; + tt_int_op(0, OP_EQ, is_valid_router_entry(&line1)); + tt_int_op(0, OP_EQ, is_valid_router_entry(&line2)); + tt_int_op(1, OP_EQ, is_valid_router_entry(&line3)); + + done: + ; +} + +static void +test_consdiff_next_router(void *arg) +{ + smartlist_t *sl = smartlist_new(); + memarea_t *area = memarea_new(); + (void)arg; + smartlist_add_linecpy(sl, area, "foo"); + smartlist_add_linecpy(sl, area, + "r name hash+longer+than+27+chars+and+valid+base64 etc"); + smartlist_add_linecpy(sl, area, "foo"); + smartlist_add_linecpy(sl, area, "foo"); + smartlist_add_linecpy(sl, area, + "r name hash+longer+than+27+chars+and+valid+base64 etc"); + smartlist_add_linecpy(sl, area, "foo"); + + /* Not currently on a router entry line, finding the next one. */ + tt_int_op(1, OP_EQ, next_router(sl, 0)); + tt_int_op(4, OP_EQ, next_router(sl, 2)); + + /* Already at the beginning of a router entry line, ignore it. */ + tt_int_op(4, OP_EQ, next_router(sl, 1)); + + /* There are no more router entries, so return the line after the last. */ + tt_int_op(6, OP_EQ, next_router(sl, 4)); + tt_int_op(6, OP_EQ, next_router(sl, 5)); + + done: + smartlist_free(sl); + memarea_drop_all(area); +} + +static int +base64cmp_wrapper(const char *a, const char *b) +{ + cdline_t aa = { a, a ? (uint32_t) strlen(a) : 0 }; + cdline_t bb = { b, b ? (uint32_t) strlen(b) : 0 }; + return base64cmp(&aa, &bb); +} + +static void +test_consdiff_base64cmp(void *arg) +{ + /* NULL arguments. */ + (void)arg; + tt_int_op(0, OP_EQ, base64cmp_wrapper(NULL, NULL)); + tt_int_op(-1, OP_EQ, base64cmp_wrapper(NULL, "foo")); + tt_int_op(1, OP_EQ, base64cmp_wrapper("bar", NULL)); + + /* Nil base64 values. */ + tt_int_op(0, OP_EQ, base64cmp_wrapper("", "")); + tt_int_op(0, OP_EQ, base64cmp_wrapper("_", "&")); + + /* Exact same valid strings. */ + tt_int_op(0, OP_EQ, base64cmp_wrapper("abcABC/+", "abcABC/+")); + /* Both end with an invalid base64 char other than '\0'. */ + tt_int_op(0, OP_EQ, base64cmp_wrapper("abcABC/+ ", "abcABC/+ ")); + /* Only one ends with an invalid base64 char other than '\0'. */ + tt_int_op(-1, OP_EQ, base64cmp_wrapper("abcABC/+ ", "abcABC/+a")); + + /* Comparisons that would return differently with strcmp(). */ + tt_int_op(-1, OP_EQ, strcmp("/foo", "Afoo")); + tt_int_op(1, OP_EQ, base64cmp_wrapper("/foo", "Afoo")); + tt_int_op(1, OP_EQ, strcmp("Afoo", "0foo")); + tt_int_op(-1, OP_EQ, base64cmp_wrapper("Afoo", "0foo")); + + /* Comparisons that would return the same as with strcmp(). */ + tt_int_op(1, OP_EQ, strcmp("afoo", "Afoo")); + tt_int_op(1, OP_EQ, base64cmp_wrapper("afoo", "Afoo")); + + /* Different lengths */ + tt_int_op(-1, OP_EQ, base64cmp_wrapper("afoo", "afooo")); + tt_int_op(1, OP_EQ, base64cmp_wrapper("afooo", "afoo")); + + done: + ; +} + +static void +test_consdiff_gen_ed_diff(void *arg) +{ + smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; + int i; + memarea_t *area = memarea_new(); + setup_capture_of_logs(LOG_WARN); + + (void)arg; + cons1 = smartlist_new(); + cons2 = smartlist_new(); + + /* Identity hashes are not sorted properly, return NULL. */ + smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); + smartlist_add_linecpy(cons1, area, "foo"); + smartlist_add_linecpy(cons1, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); + smartlist_add_linecpy(cons1, area, "bar"); + + smartlist_add_linecpy(cons2, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); + smartlist_add_linecpy(cons2, area, "foo"); + smartlist_add_linecpy(cons2, area, "r name ccccccccccccccccccccccccccc etc"); + smartlist_add_linecpy(cons2, area, "bar"); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the base consensus doesn't have its router entries sorted " + "properly."); + + /* Same, but now with the second consensus. */ + mock_clean_saved_logs(); + diff = gen_ed_diff(cons2, cons1, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the target consensus doesn't have its router entries sorted " + "properly."); + + /* Same as the two above, but with the reversed thing immediately after a + match. (The code handles this differently) */ + smartlist_del(cons1, 0); + smartlist_add_linecpy(cons1, area, "r name aaaaaaaaaaaaaaaaaaaaaaaaaaa etc"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the base consensus doesn't have its router entries sorted " + "properly."); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons2, cons1, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the target consensus doesn't have its router entries sorted " + "properly."); + + /* Identity hashes are repeated, return NULL. */ + smartlist_clear(cons1); + + smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); + smartlist_add_linecpy(cons1, area, "foo"); + smartlist_add_linecpy(cons1, area, "r name bbbbbbbbbbbbbbbbbbbbbbbbbbb etc"); + smartlist_add_linecpy(cons1, area, "bar"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because the base consensus doesn't have its router entries sorted " + "properly."); + + /* We have to add a line that is just a dot, return NULL. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + smartlist_add_linecpy(cons1, area, "foo1"); + smartlist_add_linecpy(cons1, area, "foo2"); + + smartlist_add_linecpy(cons2, area, "foo1"); + smartlist_add_linecpy(cons2, area, "."); + smartlist_add_linecpy(cons2, area, "foo2"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Cannot generate consensus diff " + "because one of the lines to be added is \".\"."); + +#define MAX_LINE_COUNT (10000) + /* Too many lines to be fed to the quadratic-time function. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + for (i=0; i < MAX_LINE_COUNT; ++i) smartlist_add_linecpy(cons1, area, "a"); + for (i=0; i < MAX_LINE_COUNT; ++i) smartlist_add_linecpy(cons1, area, "b"); + + mock_clean_saved_logs(); + diff = gen_ed_diff(cons1, cons2, area); + + tt_ptr_op(NULL, OP_EQ, diff); + expect_single_log_msg_containing("Refusing to generate consensus diff " + "because we found too few common router ids."); + + /* We have dot lines, but they don't interfere with the script format. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + smartlist_add_linecpy(cons1, area, "foo1"); + smartlist_add_linecpy(cons1, area, "."); + smartlist_add_linecpy(cons1, area, "."); + smartlist_add_linecpy(cons1, area, "foo2"); + + smartlist_add_linecpy(cons2, area, "foo1"); + smartlist_add_linecpy(cons2, area, "."); + smartlist_add_linecpy(cons2, area, "foo2"); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + smartlist_free(diff); + + /* Empty diff tests. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(0, OP_EQ, smartlist_len(diff)); + smartlist_free(diff); + + smartlist_add_linecpy(cons1, area, "foo"); + smartlist_add_linecpy(cons1, area, "bar"); + + smartlist_add_linecpy(cons2, area, "foo"); + smartlist_add_linecpy(cons2, area, "bar"); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(0, OP_EQ, smartlist_len(diff)); + smartlist_free(diff); + + /* Everything is deleted. */ + smartlist_clear(cons2); + + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(1, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("1,2d", smartlist_get(diff, 0)); + + smartlist_free(diff); + + /* Everything is added. */ + diff = gen_ed_diff(cons2, cons1, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(4, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("0a", smartlist_get(diff, 0)); + tt_str_eq_line("foo", smartlist_get(diff, 1)); + tt_str_eq_line("bar", smartlist_get(diff, 2)); + tt_str_eq_line(".", smartlist_get(diff, 3)); + + smartlist_free(diff); + + /* Everything is changed. */ + smartlist_add_linecpy(cons2, area, "foo2"); + smartlist_add_linecpy(cons2, area, "bar2"); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(4, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("1,2c", smartlist_get(diff, 0)); + tt_str_eq_line("foo2", smartlist_get(diff, 1)); + tt_str_eq_line("bar2", smartlist_get(diff, 2)); + tt_str_eq_line(".", smartlist_get(diff, 3)); + + smartlist_free(diff); + + /* Test 'a', 'c' and 'd' together. See that it is done in reverse order. */ + smartlist_clear(cons1); + smartlist_clear(cons2); + consensus_split_lines(cons1, "A\nB\nC\nD\nE\n", area); + consensus_split_lines(cons2, "A\nC\nO\nE\nU\n", area); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(7, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("5a", smartlist_get(diff, 0)); + tt_str_eq_line("U", smartlist_get(diff, 1)); + tt_str_eq_line(".", smartlist_get(diff, 2)); + tt_str_eq_line("4c", smartlist_get(diff, 3)); + tt_str_eq_line("O", smartlist_get(diff, 4)); + tt_str_eq_line(".", smartlist_get(diff, 5)); + tt_str_eq_line("2d", smartlist_get(diff, 6)); + + smartlist_free(diff); + + smartlist_clear(cons1); + smartlist_clear(cons2); + consensus_split_lines(cons1, "B\n", area); + consensus_split_lines(cons2, "A\nB\n", area); + diff = gen_ed_diff(cons1, cons2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(3, OP_EQ, smartlist_len(diff)); + tt_str_eq_line("0a", smartlist_get(diff, 0)); + tt_str_eq_line("A", smartlist_get(diff, 1)); + tt_str_eq_line(".", smartlist_get(diff, 2)); + + /* TODO: small real use-cases, i.e. consensuses. */ + + done: + teardown_capture_of_logs(); + smartlist_free(cons1); + smartlist_free(cons2); + smartlist_free(diff); + memarea_drop_all(area); +} + +static void +test_consdiff_apply_ed_diff(void *arg) +{ + smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; + memarea_t *area = memarea_new(); + (void)arg; + cons1 = smartlist_new(); + diff = smartlist_new(); + setup_capture_of_logs(LOG_WARN); + + consensus_split_lines(cons1, "A\nB\nC\nD\nE\n", area); + + /* Command without range. */ + smartlist_add_linecpy(diff, area, "a"); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + smartlist_clear(diff); + expect_single_log_msg_containing("an ed command was missing a line number"); + + /* Range without command. */ + smartlist_add_linecpy(diff, area, "1"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("a line with no ed command was found"); + + smartlist_clear(diff); + + /* Range without end. */ + smartlist_add_linecpy(diff, area, "1,"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command was missing a range " + "end line number."); + + smartlist_clear(diff); + + /* Incoherent ranges. */ + smartlist_add_linecpy(diff, area, "1,1"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an invalid range was found"); + + smartlist_clear(diff); + + smartlist_add_linecpy(diff, area, "3,2"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an invalid range was found"); + + smartlist_clear(diff); + + /* Unexpected range for add command. */ + smartlist_add_linecpy(diff, area, "1,2a"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("add lines after a range"); + + smartlist_clear(diff); + + /* $ for a non-delete command. */ + smartlist_add_linecpy(diff, area, "1,$c"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("it wanted to use $ with a command " + "other than delete"); + + smartlist_clear(diff); + + /* Script is not in reverse order. */ + smartlist_add_linecpy(diff, area, "1d"); + smartlist_add_linecpy(diff, area, "3d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("its commands are not properly sorted"); + + smartlist_clear(diff); + + /* Script contains unrecognised commands longer than one char. */ + smartlist_add_linecpy(diff, area, "1foo"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* Script contains unrecognised commands. */ + smartlist_add_linecpy(diff, area, "1e"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an unrecognised ed command was found"); + + smartlist_clear(diff); + + /* Command that should be followed by at least one line and a ".", but + * isn't. */ + smartlist_add_linecpy(diff, area, "0a"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("it has an ed command that tries to " + "insert zero lines."); + + /* Now it is followed by a ".", but it inserts zero lines. */ + smartlist_add_linecpy(diff, area, "."); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("it has an ed command that tries to " + "insert zero lines."); + + smartlist_clear(diff); + + /* Now it it inserts something, but has no terminator. */ + smartlist_add_linecpy(diff, area, "0a"); + smartlist_add_linecpy(diff, area, "hello"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("lines to be inserted that don't end with " + "a \".\"."); + + smartlist_clear(diff); + + /* Ranges must be numeric only and cannot contain spaces. */ + smartlist_add_linecpy(diff, area, "0, 4d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command was missing a range " + "end line number."); + + smartlist_clear(diff); + + /* '+' is not a number. */ + smartlist_add_linecpy(diff, area, "+0,4d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command was missing a line number"); + + smartlist_clear(diff); + + /* range duplication */ + smartlist_add_linecpy(diff, area, "0,4d,5d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* space before command */ + smartlist_add_linecpy(diff, area, "0,4 d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* space inside number */ + smartlist_add_linecpy(diff, area, "0,4 5d"); + mock_clean_saved_logs(); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("an ed command longer than one char was " + "found"); + + smartlist_clear(diff); + + /* Test appending text, 'a'. */ + consensus_split_lines(diff, "3a\nU\nO\n.\n0a\nV\n.\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(8, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("V", smartlist_get(cons2, 0)); + tt_str_eq_line("A", smartlist_get(cons2, 1)); + tt_str_eq_line("B", smartlist_get(cons2, 2)); + tt_str_eq_line("C", smartlist_get(cons2, 3)); + tt_str_eq_line("U", smartlist_get(cons2, 4)); + tt_str_eq_line("O", smartlist_get(cons2, 5)); + tt_str_eq_line("D", smartlist_get(cons2, 6)); + tt_str_eq_line("E", smartlist_get(cons2, 7)); + + smartlist_clear(diff); + smartlist_free(cons2); + + /* Test deleting text, 'd'. */ + consensus_split_lines(diff, "4d\n1,2d\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(2, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("C", smartlist_get(cons2, 0)); + tt_str_eq_line("E", smartlist_get(cons2, 1)); + + smartlist_clear(diff); + smartlist_free(cons2); + + /* Test changing text, 'c'. */ + consensus_split_lines(diff, "4c\nT\nX\n.\n1,2c\nM\n.\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(5, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("M", smartlist_get(cons2, 0)); + tt_str_eq_line("C", smartlist_get(cons2, 1)); + tt_str_eq_line("T", smartlist_get(cons2, 2)); + tt_str_eq_line("X", smartlist_get(cons2, 3)); + tt_str_eq_line("E", smartlist_get(cons2, 4)); + + smartlist_clear(diff); + smartlist_free(cons2); + + /* Test 'a', 'd' and 'c' together. */ + consensus_split_lines(diff, "4c\nT\nX\n.\n2d\n0a\nM\n.\n", area); + cons2 = apply_ed_diff(cons1, diff, 0); + tt_ptr_op(NULL, OP_NE, cons2); + tt_int_op(6, OP_EQ, smartlist_len(cons2)); + tt_str_eq_line("M", smartlist_get(cons2, 0)); + tt_str_eq_line("A", smartlist_get(cons2, 1)); + tt_str_eq_line("C", smartlist_get(cons2, 2)); + tt_str_eq_line("T", smartlist_get(cons2, 3)); + tt_str_eq_line("X", smartlist_get(cons2, 4)); + tt_str_eq_line("E", smartlist_get(cons2, 5)); + + done: + teardown_capture_of_logs(); + smartlist_free(cons1); + smartlist_free(cons2); + smartlist_free(diff); + memarea_drop_all(area); +} + +static void +test_consdiff_gen_diff(void *arg) +{ + char *cons1_str=NULL, *cons2_str=NULL; + smartlist_t *cons1=NULL, *cons2=NULL, *diff=NULL; + consensus_digest_t digests1, digests2; + memarea_t *area = memarea_new(); + (void)arg; + cons1 = smartlist_new(); + cons2 = smartlist_new(); + + /* Identity hashes are not sorted properly, return NULL. + * Already tested in gen_ed_diff, but see that a NULL ed diff also makes + * gen_diff return NULL. */ + cons1_str = tor_strdup( + "network-status-version foo\n" + "r name bbbbbbbbbbbbbbbbb etc\nfoo\n" + "r name aaaaaaaaaaaaaaaaa etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + cons2_str = tor_strdup( + "network-status-version foo\n" + "r name aaaaaaaaaaaaaaaaa etc\nfoo\n" + "r name ccccccccccccccccc etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + + tt_int_op(0, OP_EQ, + consensus_compute_digest_as_signed(cons1_str, &digests1)); + tt_int_op(0, OP_EQ, + consensus_compute_digest(cons2_str, &digests2)); + + consensus_split_lines(cons1, cons1_str, area); + consensus_split_lines(cons2, cons2_str, area); + + diff = consdiff_gen_diff(cons1, cons2, &digests1, &digests2, area); + tt_ptr_op(NULL, OP_EQ, diff); + + /* Check that the headers are done properly. */ + tor_free(cons1_str); + cons1_str = tor_strdup( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nfoo\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + tt_int_op(0, OP_EQ, + consensus_compute_digest_as_signed(cons1_str, &digests1)); + smartlist_clear(cons1); + consensus_split_lines(cons1, cons1_str, area); + diff = consdiff_gen_diff(cons1, cons2, &digests1, &digests2, area); + tt_ptr_op(NULL, OP_NE, diff); + tt_int_op(11, OP_EQ, smartlist_len(diff)); + tt_assert(line_str_eq(smartlist_get(diff, 0), + "network-status-diff-version 1")); + tt_assert(line_str_eq(smartlist_get(diff, 1), "hash " + "95D70F5A3CC65F920AA8B44C4563D7781A082674329661884E19E94B79D539C2 " + "7AFECEFA4599BA33D603653E3D2368F648DF4AC4723929B0F7CF39281596B0C1")); + tt_assert(line_str_eq(smartlist_get(diff, 2), "6,$d")); + tt_assert(line_str_eq(smartlist_get(diff, 3), "3,4c")); + tt_assert(line_str_eq(smartlist_get(diff, 4), "bar")); + tt_assert(line_str_eq(smartlist_get(diff, 5), + "directory-signature foo bar")); + tt_assert(line_str_eq(smartlist_get(diff, 6), + ".")); + tt_assert(line_str_eq(smartlist_get(diff, 7), "1a")); + tt_assert(line_str_eq(smartlist_get(diff, 8), + "r name aaaaaaaaaaaaaaaaa etc")); + tt_assert(line_str_eq(smartlist_get(diff, 9), "foo")); + tt_assert(line_str_eq(smartlist_get(diff, 10), ".")); + + /* TODO: small real use-cases, i.e. consensuses. */ + + done: + tor_free(cons1_str); + tor_free(cons2_str); + smartlist_free(cons1); + smartlist_free(cons2); + smartlist_free(diff); + memarea_drop_all(area); +} + +static void +test_consdiff_apply_diff(void *arg) +{ + smartlist_t *cons1=NULL, *diff=NULL; + char *cons1_str=NULL, *cons2 = NULL; + consensus_digest_t digests1; + (void)arg; + memarea_t *area = memarea_new(); + cons1 = smartlist_new(); + diff = smartlist_new(); + setup_capture_of_logs(LOG_INFO); + + cons1_str = tor_strdup( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nfoo\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n" + ); + tt_int_op(0, OP_EQ, + consensus_compute_digest(cons1_str, &digests1)); + consensus_split_lines(cons1, cons1_str, area); + + /* diff doesn't have enough lines. */ + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("too short") + + /* first line doesn't match format-version string. */ + smartlist_add_linecpy(diff, area, "foo-bar"); + smartlist_add_linecpy(diff, area, "header-line"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("format is not known") + + /* The first word of the second header line is not "hash". */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "word a b"); + smartlist_add_linecpy(diff, area, "x"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("does not include the necessary digests") + + /* Wrong number of words after "hash". */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash a b c"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("does not include the necessary digests") + + /* base16 digests do not have the expected length. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash aaa bbb"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("includes base16-encoded digests of " + "incorrect size") + + /* base16 digests contain non-base16 characters. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + " ????????????????????????????????????????????????????????????????" + " ----------------------------------------------------------------"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("includes malformed digests") + + /* Invalid ed diff. + * As tested in apply_ed_diff, but check that apply_diff does return NULL if + * the ed diff can't be applied. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* sha256 of cons2. */ + " 635D34593020C08E5ECD865F9986E29D50028EFA62843766A8197AD228A7F6AA"); + smartlist_add_linecpy(diff, area, "foobar"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_single_log_msg_containing("because an ed command was missing a line " + "number") + + /* Base consensus doesn't match its digest as found in the diff. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* bogus sha256. */ + " 3333333333333333333333333333333333333333333333333333333333333333" + /* sha256 of cons2. */ + " 635D34593020C08E5ECD865F9986E29D50028EFA62843766A8197AD228A7F6AA"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_log_msg_containing("base consensus doesn't match the digest " + "as found"); + + /* Resulting consensus doesn't match its digest as found in the diff. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* bogus sha3. */ + " 3333333333333333333333333333333333333333333333333333333333333333"); + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_log_msg_containing("resulting consensus doesn't match the " + "digest as found"); + +#if 0 + /* XXXX No longer possible, since we aren't using the other algorithm. */ + /* Resulting consensus digest cannot be computed */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* bogus sha3. */ + " 3333333333333333333333333333333333333333333333333333333333333333"); + smartlist_add_linecpy(diff, area, "1,2d"); // remove starting line + mock_clean_saved_logs(); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_EQ, cons2); + expect_log_msg_containing("Could not compute digests of the consensus " + "resulting from applying a consensus diff."); +#endif + + /* Very simple test, only to see that nothing errors. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646D6CF563A41869D3B02E73254372AE3140046C5E7D83C9F71E54976AF9B4" + /* sha3 of cons2. */ + " 90A418881B2FCAB3D9E60EE02E4D666D56CFA38F8A3B7AA3E0ADBA530DDA9353"); + smartlist_add_linecpy(diff, area, "3c"); + smartlist_add_linecpy(diff, area, "sample"); + smartlist_add_linecpy(diff, area, "."); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_NE, cons2); + tt_str_op( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nsample\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n", OP_EQ, + cons2); + tor_free(cons2); + + /* Check that lowercase letters in base16-encoded digests work too. */ + smartlist_clear(diff); + smartlist_add_linecpy(diff, area, "network-status-diff-version 1"); + smartlist_add_linecpy(diff, area, "hash" + /* sha3 of cons1. */ + " 06646d6cf563a41869d3b02e73254372ae3140046c5e7d83c9f71e54976af9b4" + /* sha3 of cons2. */ + " 90a418881b2fcab3d9e60ee02e4d666d56cfa38f8a3b7aa3e0adba530dda9353"); + smartlist_add_linecpy(diff, area, "3c"); + smartlist_add_linecpy(diff, area, "sample"); + smartlist_add_linecpy(diff, area, "."); + cons2 = consdiff_apply_diff(cons1, diff, &digests1); + tt_ptr_op(NULL, OP_NE, cons2); + tt_str_op( + "network-status-version foo\n" + "r name ccccccccccccccccc etc\nsample\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "directory-signature foo bar\nbar\n", OP_EQ, + cons2); + tor_free(cons2); + + smartlist_clear(diff); + + done: + teardown_capture_of_logs(); + tor_free(cons1_str); + smartlist_free(cons1); + smartlist_free(diff); + memarea_drop_all(area); +} + +#define CONSDIFF_LEGACY(name) \ + { #name, test_consdiff_ ## name , 0, NULL, NULL } + +struct testcase_t consdiff_tests[] = { + CONSDIFF_LEGACY(smartlist_slice), + CONSDIFF_LEGACY(smartlist_slice_string_pos), + CONSDIFF_LEGACY(lcs_lengths), + CONSDIFF_LEGACY(trim_slices), + CONSDIFF_LEGACY(set_changed), + CONSDIFF_LEGACY(calc_changes), + CONSDIFF_LEGACY(get_id_hash), + CONSDIFF_LEGACY(is_valid_router_entry), + CONSDIFF_LEGACY(next_router), + CONSDIFF_LEGACY(base64cmp), + CONSDIFF_LEGACY(gen_ed_diff), + CONSDIFF_LEGACY(apply_ed_diff), + CONSDIFF_LEGACY(gen_diff), + CONSDIFF_LEGACY(apply_diff), + END_OF_TESTCASES +}; + diff --git a/src/test/test_consdiffmgr.c b/src/test/test_consdiffmgr.c new file mode 100644 index 0000000000..9d0c5b5b71 --- /dev/null +++ b/src/test/test_consdiffmgr.c @@ -0,0 +1,891 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#define CONSDIFFMGR_PRIVATE + +#include "or.h" +#include "config.h" +#include "conscache.h" +#include "consdiff.h" +#include "consdiffmgr.h" +#include "cpuworker.h" +#include "networkstatus.h" +#include "routerparse.h" +#include "workqueue.h" + +#include "test.h" +#include "log_test_helpers.h" + +// ============================== Setup/teardown the consdiffmgr +// These functions get run before/after each test in this module + +static void * +consdiffmgr_test_setup(const struct testcase_t *arg) +{ + (void)arg; + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cdm")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = ddir_fname; // now owns the pointer. + check_private_dir(ddir_fname, CPD_CREATE, NULL); + + consdiff_cfg_t consdiff_cfg = { 7200, 300 }; + consdiffmgr_configure(&consdiff_cfg); + return (void *)1; // must return something non-null. +} +static int +consdiffmgr_test_teardown(const struct testcase_t *arg, void *ignore) +{ + (void)arg; + (void)ignore; + consdiffmgr_free_all(); + return 1; +} +static struct testcase_setup_t setup_diffmgr = { + consdiffmgr_test_setup, + consdiffmgr_test_teardown +}; + +// ============================== NS faking functions +// These functions are for making quick fake consensus objects and +// strings that are just good enough for consdiff and consdiffmgr. + +static networkstatus_t * +fake_ns_new(consensus_flavor_t flav, time_t valid_after) +{ + networkstatus_t *ns = tor_malloc_zero(sizeof(networkstatus_t)); + ns->type = NS_TYPE_CONSENSUS; + ns->flavor = flav; + ns->valid_after = valid_after; + return ns; +} + +static char * +fake_ns_body_new(consensus_flavor_t flav, time_t valid_after) +{ + const char *flavor_string = flav == FLAV_NS ? "" : " microdesc"; + char valid_after_string[ISO_TIME_LEN+1]; + + format_iso_time(valid_after_string, valid_after); + char *random_stuff = crypto_random_hostname(3, 25, "junk ", ""); + char *random_stuff2 = crypto_random_hostname(3, 10, "", ""); + + char *consensus; + tor_asprintf(&consensus, + "network-status-version 3%s\n" + "vote-status consensus\n" + "valid-after %s\n" + "r name ccccccccccccccccc etc\nsample\n" + "r name eeeeeeeeeeeeeeeee etc\nbar\n" + "%s\n" + "directory-signature hello-there\n" + "directory-signature %s\n", + flavor_string, + valid_after_string, + random_stuff, + random_stuff2); + tor_free(random_stuff); + tor_free(random_stuff2); + return consensus; +} + +// ============================== Cpuworker mocking code +// These mocking functions and types capture the cpuworker calls +// so we can inspect them and run them in the main thread. +static smartlist_t *fake_cpuworker_queue = NULL; +typedef struct fake_work_queue_ent_t { + enum workqueue_reply_t (*fn)(void *, void *); + void (*reply_fn)(void *); + void *arg; +} fake_work_queue_ent_t; +static struct workqueue_entry_s * +mock_cpuworker_queue_work(enum workqueue_reply_t (*fn)(void *, void *), + void (*reply_fn)(void *), + void *arg) +{ + if (! fake_cpuworker_queue) + fake_cpuworker_queue = smartlist_new(); + + fake_work_queue_ent_t *ent = tor_malloc_zero(sizeof(*ent)); + ent->fn = fn; + ent->reply_fn = reply_fn; + ent->arg = arg; + smartlist_add(fake_cpuworker_queue, ent); + return (struct workqueue_entry_s *)ent; +} +static int +mock_cpuworker_run_work(void) +{ + if (! fake_cpuworker_queue) + return 0; + SMARTLIST_FOREACH(fake_cpuworker_queue, fake_work_queue_ent_t *, ent, { + enum workqueue_reply_t r = ent->fn(NULL, ent->arg); + if (r != WQ_RPL_REPLY) + return -1; + }); + return 0; +} +static void +mock_cpuworker_handle_replies(void) +{ + if (! fake_cpuworker_queue) + return; + SMARTLIST_FOREACH(fake_cpuworker_queue, fake_work_queue_ent_t *, ent, { + ent->reply_fn(ent->arg); + tor_free(ent); + }); + smartlist_free(fake_cpuworker_queue); + fake_cpuworker_queue = NULL; +} + +// ============================== Other helpers + +static consdiff_status_t +lookup_diff_from(consensus_cache_entry_t **out, + consensus_flavor_t flav, + const char *str1) +{ + uint8_t digest[DIGEST256_LEN]; + if (router_get_networkstatus_v3_sha3_as_signed(digest, str1)<0) { + TT_FAIL(("Unable to compute sha3-as-signed")); + return CONSDIFF_NOT_FOUND; + } + return consdiffmgr_find_diff_from(out, flav, + DIGEST_SHA3_256, digest, sizeof(digest), + NO_METHOD); +} + +static int +lookup_apply_and_verify_diff(consensus_flavor_t flav, + const char *str1, + const char *str2) +{ + consensus_cache_entry_t *ent = NULL; + consdiff_status_t status = lookup_diff_from(&ent, flav, str1); + if (ent == NULL || status != CONSDIFF_AVAILABLE) { + return -1; + } + + consensus_cache_entry_incref(ent); + size_t size; + char *diff_string = NULL; + int r = uncompress_or_copy(&diff_string, &size, ent); + consensus_cache_entry_decref(ent); + if (diff_string == NULL || r < 0) + return -1; + + char *applied = consensus_diff_apply(str1, diff_string); + tor_free(diff_string); + if (applied == NULL) + return -1; + + int match = !strcmp(applied, str2); + tor_free(applied); + return match ? 0 : -1; +} + +static void +cdm_reload(void) +{ + consdiffmgr_free_all(); + cdm_cache_get(); + consdiffmgr_rescan(); +} + +// ============================== Beginning of tests + +#if 0 +static int got_failure = 0; +static void +got_assertion_failure(void) +{ + ++got_failure; +} + +/* XXXX This test won't work, because there is currently no way to actually + * XXXX capture a real assertion failure. */ +static void +test_consdiffmgr_init_failure(void *arg) +{ + (void)arg; + // Capture assertions and bugs. + + /* As in ...test_setup, but do not create the datadir. The missing directory + * will cause a failure. */ + char *ddir_fname = tor_strdup(get_fname_rnd("datadir_cdm")); + tor_free(get_options_mutable()->DataDirectory); + get_options_mutable()->DataDirectory = ddir_fname; // now owns the pointer. + + consdiff_cfg_t consdiff_cfg = { 7200, 300 }; + + tor_set_failed_assertion_callback(got_assertion_failure); + tor_capture_bugs_(1); + consdiffmgr_configure(&consdiff_cfg); // This should fail. + tt_int_op(got_failure, OP_EQ, 1); + const smartlist_t *bugs = tor_get_captured_bug_log_(); + tt_int_op(smartlist_len(bugs), OP_EQ, 1); + + done: + tor_end_capture_bugs_(); +} +#endif + +static void +test_consdiffmgr_sha3_helper(void *arg) +{ + (void) arg; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + config_line_t *lines = NULL; + char *mem_op_hex_tmp = NULL; + config_line_prepend(&lines, "good-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00D"); + config_line_prepend(&lines, "short-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF0"); + config_line_prepend(&lines, "long-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00DF00D"); + config_line_prepend(&lines, "not-sha", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DXXXX"); + consensus_cache_entry_t *ent = + consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + + uint8_t buf[DIGEST256_LEN]; + tt_int_op(-1, OP_EQ, cdm_entry_get_sha3_value(buf, NULL, "good-sha")); + tt_int_op(0, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "good-sha")); + test_memeq_hex(buf, "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00D"); + + tt_int_op(-1, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "missing-sha")); + tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "short-sha")); + tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "long-sha")); + tt_int_op(-2, OP_EQ, cdm_entry_get_sha3_value(buf, ent, "not-sha")); + + done: + consensus_cache_entry_decref(ent); + config_free_lines(lines); + tor_free(mem_op_hex_tmp); +} + +static void +test_consdiffmgr_add(void *arg) +{ + (void) arg; + time_t now = approx_time(); + + char *body = NULL; + + consensus_cache_entry_t *ent = NULL; + networkstatus_t *ns_tmp = fake_ns_new(FLAV_NS, now); + const char *dummy = "foo"; + int r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, 0); + + /* If we add it again, it won't work */ + setup_capture_of_logs(LOG_INFO); + dummy = "bar"; + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, -1); + expect_single_log_msg_containing("We already have a copy of that " + "consensus"); + mock_clean_saved_logs(); + + /* But it will work fine if the flavor is different */ + dummy = "baz"; + ns_tmp->flavor = FLAV_MICRODESC; + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, 0); + + /* And it will work fine if the time is different */ + dummy = "quux"; + ns_tmp->flavor = FLAV_NS; + ns_tmp->valid_after = now - 60; + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, 0); + + /* If we add one a long long time ago, it will fail. */ + dummy = "xyzzy"; + ns_tmp->valid_after = 86400 * 100; /* A few months into 1970 */ + r = consdiffmgr_add_consensus(dummy, ns_tmp); + tt_int_op(r, OP_EQ, -1); + expect_log_msg_containing("it's too old."); + + /* Try looking up a consensuses. */ + ent = cdm_cache_lookup_consensus(FLAV_NS, now-60); + tt_assert(ent); + consensus_cache_entry_incref(ent); + size_t s; + r = uncompress_or_copy(&body, &s, ent); + tt_int_op(r, OP_EQ, 0); + tt_int_op(s, OP_EQ, 4); + tt_mem_op(body, OP_EQ, "quux", 4); + + /* Try looking up another entry, but fail */ + tt_assert(NULL == cdm_cache_lookup_consensus(FLAV_MICRODESC, now-60)); + tt_assert(NULL == cdm_cache_lookup_consensus(FLAV_NS, now-61)); + + done: + networkstatus_vote_free(ns_tmp); + teardown_capture_of_logs(); + consensus_cache_entry_decref(ent); + tor_free(body); +} + +static void +test_consdiffmgr_make_diffs(void *arg) +{ + (void)arg; + networkstatus_t *ns = NULL; + char *ns_body = NULL, *md_ns_body = NULL, *md_ns_body_2 = NULL; + char *applied = NULL, *diff_text = NULL; + time_t now = approx_time(); + int r; + consensus_cache_entry_t *diff = NULL; + uint8_t md_ns_sha3[DIGEST256_LEN]; + consdiff_status_t diff_status; + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + // Try rescan with no consensuses: shouldn't crash or queue work. + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + // Make two consensuses, 1 hour sec ago. + ns = fake_ns_new(FLAV_NS, now-3600); + ns_body = fake_ns_body_new(FLAV_NS, now-3600); + r = consdiffmgr_add_consensus(ns_body, ns); + networkstatus_vote_free(ns); + tor_free(ns_body); + tt_int_op(r, OP_EQ, 0); + + ns = fake_ns_new(FLAV_MICRODESC, now-3600); + md_ns_body = fake_ns_body_new(FLAV_MICRODESC, now-3600); + r = consdiffmgr_add_consensus(md_ns_body, ns); + router_get_networkstatus_v3_sha3_as_signed(md_ns_sha3, md_ns_body); + networkstatus_vote_free(ns); + tt_int_op(r, OP_EQ, 0); + + // No diffs will be generated. + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + // Add a MD consensus from 45 minutes ago. This should cause one diff + // worth of work to get queued. + ns = fake_ns_new(FLAV_MICRODESC, now-45*60); + md_ns_body_2 = fake_ns_body_new(FLAV_MICRODESC, now-45*60); + r = consdiffmgr_add_consensus(md_ns_body_2, ns); + networkstatus_vote_free(ns); + tt_int_op(r, OP_EQ, 0); + + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + diff_status = consdiffmgr_find_diff_from(&diff, FLAV_MICRODESC, + DIGEST_SHA3_256, + md_ns_sha3, DIGEST256_LEN, + NO_METHOD); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, diff_status); + + // Now run that process and get the diff. + r = mock_cpuworker_run_work(); + tt_int_op(r, OP_EQ, 0); + mock_cpuworker_handle_replies(); + + // At this point we should be able to get that diff. + diff_status = consdiffmgr_find_diff_from(&diff, FLAV_MICRODESC, + DIGEST_SHA3_256, + md_ns_sha3, DIGEST256_LEN, + NO_METHOD); + tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, diff_status); + tt_assert(diff); + + /* Make sure applying the diff actually works */ + const uint8_t *diff_body; + size_t diff_size; + r = consensus_cache_entry_get_body(diff, &diff_body, &diff_size); + tt_int_op(r, OP_EQ, 0); + diff_text = tor_memdup_nulterm(diff_body, diff_size); + applied = consensus_diff_apply(md_ns_body, diff_text); + tt_assert(applied); + tt_str_op(applied, OP_EQ, md_ns_body_2); + + /* Rescan again: no more work to do. */ + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + done: + tor_free(md_ns_body); + tor_free(md_ns_body_2); + tor_free(diff_text); + tor_free(applied); +} + +static void +test_consdiffmgr_diff_rules(void *arg) +{ + (void)arg; +#define N 6 + char *md_body[N], *ns_body[N]; + networkstatus_t *md_ns[N], *ns_ns[N]; + int i; + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + /* Create a bunch of consensus things at 15-second intervals. */ + time_t start = approx_time() - 120; + for (i = 0; i < N; ++i) { + time_t when = start + i * 15; + md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); + ns_body[i] = fake_ns_body_new(FLAV_NS, when); + md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); + ns_ns[i] = fake_ns_new(FLAV_NS, when); + } + + /* For the MD consensuses: add 4 of them, and make sure that + * diffs are created to one consensus (the most recent) only. */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[4], md_ns[4])); + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(3, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + /* For the NS consensuses: add 3, generate, and add one older one and + * make sure that older one is the only one whose diff is generated */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[0], ns_ns[0])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[1], ns_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[5], ns_ns[5])); + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + + /* At this point, we should actually have working diffs! */ + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[0], ns_body[5])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[1], ns_body[5])); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[2], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[3], md_body[4])); + + /* Self-to-self diff won't be present */ + consensus_cache_entry_t *ent; + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_NS, ns_body[5])); + /* No diff from 2 has been added yet */ + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_NS, ns_body[2])); + /* No diff arriving at old things. */ + tt_int_op(-1, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); + /* No backwards diff */ + tt_int_op(-1, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[4], md_body[3])); + + /* Now, an update: add number 2 and make sure it's the only one whose diff + * is regenerated. */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(ns_body[2], ns_ns[2])); + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[2], ns_body[5])); + + /* Finally: reload, and make sure that the information is still indexed */ + cdm_reload(); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[0], ns_body[5])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[2], ns_body[5])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_NS, ns_body[1], ns_body[5])); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[2], md_body[4])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[3], md_body[4])); + + done: + for (i = 0; i < N; ++i) { + tor_free(md_body[i]); + tor_free(ns_body[i]); + networkstatus_vote_free(md_ns[i]); + networkstatus_vote_free(ns_ns[i]); + } + UNMOCK(cpuworker_queue_work); +#undef N +} + +static void +test_consdiffmgr_diff_failure(void *arg) +{ + (void)arg; + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + /* We're going to make sure that if we have a bogus request where + * we can't actually compute a diff, the world must not end. */ + networkstatus_t *ns1 = NULL; + networkstatus_t *ns2 = NULL; + int r; + + ns1 = fake_ns_new(FLAV_NS, approx_time()-100); + ns2 = fake_ns_new(FLAV_NS, approx_time()-50); + r = consdiffmgr_add_consensus("foo bar baz\n", ns1); + tt_int_op(r, OP_EQ, 0); + // We refuse to compute a diff to or from a line holding only a single dot. + // We can add it here, though. + r = consdiffmgr_add_consensus("foo bar baz\n.\n.\n", ns2); + tt_int_op(r, OP_EQ, 0); + + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + setup_capture_of_logs(LOG_WARN); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + expect_single_log_msg_containing("one of the lines to be added is \".\"."); + mock_clean_saved_logs(); + mock_cpuworker_handle_replies(); + expect_single_log_msg_containing("Worker was unable to compute consensus " + "diff from "); + + /* Make sure the diff is not present */ + consensus_cache_entry_t *ent; + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_NS, "foo bar baz\n")); + + done: + teardown_capture_of_logs(); + UNMOCK(cpuworker_queue_work); + networkstatus_vote_free(ns1); + networkstatus_vote_free(ns2); +} + +static void +test_consdiffmgr_diff_pending(void *arg) +{ +#define N 3 + (void)arg; + char *md_body[N]; + networkstatus_t *md_ns[N]; + time_t start = approx_time() - 120; + int i; + for (i = 0; i < N; ++i) { + time_t when = start + i * 30; + md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); + md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); + } + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); + /* Make a diff */ + consdiffmgr_rescan(); + tt_int_op(1, OP_EQ, smartlist_len(fake_cpuworker_queue)); + + /* Look it up. Is it pending? */ + consensus_cache_entry_t *ent = NULL; + consdiff_status_t diff_status; + diff_status = lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1]); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, diff_status); + tt_ptr_op(ent, OP_EQ, NULL); + + /* Add another old consensus. only one new diff should launch! */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[0], md_ns[0])); + consdiffmgr_rescan(); + tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); + + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[0], md_body[2])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); + + done: + UNMOCK(cpuworker_queue_work); + for (i = 0; i < N; ++i) { + tor_free(md_body[i]); + networkstatus_vote_free(md_ns[i]); + } +#undef N +} + +static void +test_consdiffmgr_cleanup_old(void *arg) +{ + (void)arg; + config_line_t *labels = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + + /* This item will be will be cleanable because it has a valid-after + * time far in the past. */ + config_line_prepend(&labels, "document-type", "confribble-blarg"); + config_line_prepend(&labels, "consensus-valid-after", + "1980-10-10T10:10:10"); + ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); + tt_assert(ent); + consensus_cache_entry_decref(ent); + + setup_capture_of_logs(LOG_DEBUG); + tt_int_op(1, OP_EQ, consdiffmgr_cleanup()); + expect_log_msg_containing("Deleting entry because its consensus-valid-" + "after value (1980-10-10T10:10:10) was too old"); + + done: + teardown_capture_of_logs(); + config_free_lines(labels); +} + +static void +test_consdiffmgr_cleanup_bad_valid_after(void *arg) +{ + /* This will seem cleanable, but isn't, because its valid-after time is + * misformed. */ + + (void)arg; + config_line_t *labels = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + + config_line_prepend(&labels, "document-type", "consensus"); + config_line_prepend(&labels, "consensus-valid-after", + "whan that aprille with his shoures soote"); // (~1385?) + ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); + tt_assert(ent); + consensus_cache_entry_decref(ent); + + setup_capture_of_logs(LOG_DEBUG); + tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); + expect_log_msg_containing("Ignoring entry because its consensus-valid-" + "after value (\"whan that aprille with his " + "shoures soote\") was unparseable"); + + done: + teardown_capture_of_logs(); + config_free_lines(labels); +} + +static void +test_consdiffmgr_cleanup_no_valid_after(void *arg) +{ + (void)arg; + config_line_t *labels = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + + /* This item will be will be uncleanable because it has no recognized + * valid-after. */ + config_line_prepend(&labels, "document-type", "consensus"); + config_line_prepend(&labels, "confrooble-voolid-oofter", + "2010-10-10T09:08:07"); + ent = consensus_cache_add(cache, labels, (const uint8_t*)"Foo", 3); + tt_assert(ent); + consensus_cache_entry_decref(ent); + + setup_capture_of_logs(LOG_DEBUG); + tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); + expect_log_msg_containing("Ignoring entry because it had no consensus-" + "valid-after label"); + + done: + teardown_capture_of_logs(); + config_free_lines(labels); +} + +static void +test_consdiffmgr_cleanup_old_diffs(void *arg) +{ + (void)arg; +#define N 4 + char *md_body[N]; + networkstatus_t *md_ns[N]; + int i; + consensus_cache_entry_t *hold_ent = NULL, *ent; + + /* Make sure that the cleanup function removes diffs to the not-most-recent + * consensus. */ + + MOCK(cpuworker_queue_work, mock_cpuworker_queue_work); + + /* Create a bunch of consensus things at 15-second intervals. */ + time_t start = approx_time() - 120; + for (i = 0; i < N; ++i) { + time_t when = start + i * 15; + md_body[i] = fake_ns_body_new(FLAV_MICRODESC, when); + md_ns[i] = fake_ns_new(FLAV_MICRODESC, when); + } + + /* add the first 3. */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[0], md_ns[0])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[1], md_ns[1])); + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[2], md_ns[2])); + /* Make diffs. */ + consdiffmgr_rescan(); + tt_ptr_op(NULL, OP_NE, fake_cpuworker_queue); + tt_int_op(2, OP_EQ, smartlist_len(fake_cpuworker_queue)); + tt_int_op(0, OP_EQ, mock_cpuworker_run_work()); + mock_cpuworker_handle_replies(); + tt_ptr_op(NULL, OP_EQ, fake_cpuworker_queue); + + /* Nothing is deletable now */ + tt_int_op(0, OP_EQ, consdiffmgr_cleanup()); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[0], md_body[2])); + tt_int_op(0, OP_EQ, + lookup_apply_and_verify_diff(FLAV_MICRODESC, md_body[1], md_body[2])); + + tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, + lookup_diff_from(&hold_ent, FLAV_MICRODESC, md_body[1])); + consensus_cache_entry_incref(hold_ent); // incref, so it is preserved. + + /* Now add an even-more-recent consensus; this should make all previous + * diffs deletable */ + tt_int_op(0, OP_EQ, consdiffmgr_add_consensus(md_body[3], md_ns[3])); + tt_int_op(2 * n_diff_compression_methods(), OP_EQ, consdiffmgr_cleanup()); + + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[0])); + /* This one is marked deletable but still in the hashtable */ + tt_int_op(CONSDIFF_AVAILABLE, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1])); + tt_int_op(CONSDIFF_NOT_FOUND, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[2])); + + /* Everything should be valid at this point */ + tt_int_op(0, OP_EQ, consdiffmgr_validate()); + + /* And if we recan NOW, we'll purge the hashtable of the entries, + * and launch attempts to generate new ones */ + consdiffmgr_rescan(); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[0])); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[1])); + tt_int_op(CONSDIFF_IN_PROGRESS, OP_EQ, + lookup_diff_from(&ent, FLAV_MICRODESC, md_body[2])); + + /* We're still holding on to this, though, so we can still map it! */ + const uint8_t *t1 = NULL; + size_t s; + int r = consensus_cache_entry_get_body(hold_ent, &t1, &s); + tt_int_op(r, OP_EQ, 0); + tt_assert(t1); + + done: + for (i = 0; i < N; ++i) { + tor_free(md_body[i]); + networkstatus_vote_free(md_ns[i]); + } + consensus_cache_entry_decref(hold_ent); + UNMOCK(cpuworker_queue_work); +#undef N +} + +static void +test_consdiffmgr_validate(void *arg) +{ + (void)arg; + config_line_t *lines = NULL; + consensus_cache_entry_t *ent = NULL; + consensus_cache_t *cache = cdm_cache_get(); // violate abstraction barrier + smartlist_t *vals = smartlist_new(); + + /* Put these: objects in the cache: one with a good sha3, one with bad sha3, + * one with a wrong sha3, and one with no sha3. */ + config_line_prepend(&lines, "id", "wrong sha3"); + config_line_prepend(&lines, "sha3-digest", + "F00DF00DF00DF00DF00DF00DF00DF00D" + "F00DF00DF00DF00DF00DF00DF00DF00D"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + config_line_prepend(&lines, "id", "bad sha3"); + config_line_prepend(&lines, "sha3-digest", + "now is the winter of our dicotheque"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + config_line_prepend(&lines, "id", "no sha3"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + config_line_prepend(&lines, "id", "good sha3"); + config_line_prepend(&lines, "sha3-digest", + "8d8b1998616cd6b4c4055da8d38728dc" + "93c758d4131a53c7d81aa6337dee1c05"); + ent = consensus_cache_add(cache, lines, (const uint8_t *)"Hi there", 8); + consensus_cache_entry_decref(ent); + config_free_lines(lines); + lines = NULL; + + cdm_reload(); + cache = cdm_cache_get(); + tt_int_op(1, OP_EQ, consdiffmgr_validate()); + + consensus_cache_find_all(vals, cache, "id", "good sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 1); + smartlist_clear(vals); + + consensus_cache_find_all(vals, cache, "id", "no sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 1); + smartlist_clear(vals); + + consensus_cache_find_all(vals, cache, "id", "wrong sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 0); + consensus_cache_find_all(vals, cache, "id", "bad sha3"); + tt_int_op(smartlist_len(vals), OP_EQ, 0); + + done: + smartlist_free(vals); +} + +#define TEST(name) \ + { #name, test_consdiffmgr_ ## name , TT_FORK, &setup_diffmgr, NULL } + +struct testcase_t consdiffmgr_tests[] = { +#if 0 + { "init_failure", test_consdiffmgr_init_failure, TT_FORK, NULL, NULL }, +#endif + TEST(sha3_helper), + TEST(add), + TEST(make_diffs), + TEST(diff_rules), + TEST(diff_failure), + TEST(diff_pending), + TEST(cleanup_old), + TEST(cleanup_bad_valid_after), + TEST(cleanup_no_valid_after), + TEST(cleanup_old_diffs), + TEST(validate), + + // XXXX Test: non-cacheing cases of replyfn(). + + END_OF_TESTCASES +}; + diff --git a/src/test/test_containers.c b/src/test/test_containers.c index 41f3f873de..54484a2a91 100644 --- a/src/test/test_containers.c +++ b/src/test/test_containers.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_controller.c b/src/test/test_controller.c index 206315e289..592f91a988 100644 --- a/src/test/test_controller.c +++ b/src/test/test_controller.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONTROL_PRIVATE diff --git a/src/test/test_controller_events.c b/src/test/test_controller_events.c index 11e1e3dc8f..901ad7ab3d 100644 --- a/src/test/test_controller_events.c +++ b/src/test/test_controller_events.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONNECTION_PRIVATE diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c index d66ddccd4f..ec9d4e2709 100644 --- a/src/test/test_crypto.c +++ b/src/test/test_crypto.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -15,9 +15,6 @@ #include "crypto_ed25519.h" #include "ed25519_vectors.inc" -#include <openssl/evp.h> -#include <openssl/rand.h> - /** Run unit tests for Diffie-Hellman functionality. */ static void test_crypto_dh(void *arg) @@ -331,38 +328,6 @@ test_crypto_rng_strongest(void *arg) #undef N } -/* Test for rectifying openssl RAND engine. */ -static void -test_crypto_rng_engine(void *arg) -{ - (void)arg; - RAND_METHOD dummy_method; - memset(&dummy_method, 0, sizeof(dummy_method)); - - /* We should be a no-op if we're already on RAND_OpenSSL */ - tt_int_op(0, ==, crypto_force_rand_ssleay()); - tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); - - /* We should correct the method if it's a dummy. */ - RAND_set_rand_method(&dummy_method); -#ifdef LIBRESSL_VERSION_NUMBER - /* On libressl, you can't override the RNG. */ - tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); - tt_int_op(0, ==, crypto_force_rand_ssleay()); -#else - tt_assert(RAND_get_rand_method() == &dummy_method); - tt_int_op(1, ==, crypto_force_rand_ssleay()); -#endif - tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); - - /* Make sure we aren't calling dummy_method */ - crypto_rand((void *) &dummy_method, sizeof(dummy_method)); - crypto_rand((void *) &dummy_method, sizeof(dummy_method)); - - done: - ; -} - /** Run unit tests for our AES128 functionality */ static void test_crypto_aes128(void *arg) @@ -1477,28 +1442,6 @@ test_crypto_digest_names(void *arg) ; } -#ifndef OPENSSL_1_1_API -#define EVP_ENCODE_CTX_new() tor_malloc_zero(sizeof(EVP_ENCODE_CTX)) -#define EVP_ENCODE_CTX_free(ctx) tor_free(ctx) -#endif - -/** Encode src into dest with OpenSSL's EVP Encode interface, returning the - * length of the encoded data in bytes. - */ -static int -base64_encode_evp(char *dest, char *src, size_t srclen) -{ - const unsigned char *s = (unsigned char*)src; - EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new(); - int len, ret; - - EVP_EncodeInit(ctx); - EVP_EncodeUpdate(ctx, (unsigned char *)dest, &len, s, (int)srclen); - EVP_EncodeFinal(ctx, (unsigned char *)(dest + len), &ret); - EVP_ENCODE_CTX_free(ctx); - return ret+ len; -} - /** Run unit tests for misc crypto formatting functionality (base64, base32, * fingerprints, etc) */ static void @@ -1527,7 +1470,7 @@ test_crypto_formats(void *arg) tt_int_op(i, OP_GE, 0); tt_int_op(i, OP_EQ, strlen(data2)); tt_assert(! strchr(data2, '=')); - j = base64_decode_nopad((uint8_t*)data3, 1024, data2, i); + j = base64_decode(data3, 1024, data2, i); tt_int_op(j, OP_EQ, idx); tt_mem_op(data3,OP_EQ, data1, idx); } @@ -1554,20 +1497,6 @@ test_crypto_formats(void *arg) tt_assert(digest_from_base64(data3, "###") < 0); - for (i = 0; i < 256; i++) { - /* Test the multiline format Base64 encoder with 0 .. 256 bytes of - * output against OpenSSL. - */ - const size_t enclen = base64_encode_size(i, BASE64_ENCODE_MULTILINE); - data1[i] = i; - j = base64_encode(data2, 1024, data1, i, BASE64_ENCODE_MULTILINE); - tt_int_op(j, OP_EQ, enclen); - j = base64_encode_evp(data3, data1, i); - tt_int_op(j, OP_EQ, enclen); - tt_mem_op(data2, OP_EQ, data3, enclen); - tt_int_op(j, OP_EQ, strlen(data2)); - } - /* Encoding SHA256 */ crypto_rand(data2, DIGEST256_LEN); memset(data2, 100, 1024); @@ -2941,7 +2870,6 @@ struct testcase_t crypto_tests[] = { CRYPTO_LEGACY(formats), CRYPTO_LEGACY(rng), { "rng_range", test_crypto_rng_range, 0, NULL, NULL }, - { "rng_engine", test_crypto_rng_engine, TT_FORK, NULL, NULL }, { "rng_strongest", test_crypto_rng_strongest, TT_FORK, NULL, NULL }, { "rng_strongest_nosyscall", test_crypto_rng_strongest, TT_FORK, &passthrough_setup, (void*)"nosyscall" }, diff --git a/src/test/test_crypto_openssl.c b/src/test/test_crypto_openssl.c new file mode 100644 index 0000000000..3d7d2b4639 --- /dev/null +++ b/src/test/test_crypto_openssl.c @@ -0,0 +1,107 @@ +/* Copyright (c) 2001-2004, Roger Dingledine. + * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "orconfig.h" + +#define CRYPTO_PRIVATE + +#include "crypto.h" +#include "util.h" +#include "util_format.h" +#include "compat.h" +#include "test.h" + +#include <openssl/evp.h> +#include <openssl/rand.h> +#include "compat_openssl.h" + +/* Test for rectifying openssl RAND engine. */ +static void +test_crypto_rng_engine(void *arg) +{ + (void)arg; + RAND_METHOD dummy_method; + memset(&dummy_method, 0, sizeof(dummy_method)); + + /* We should be a no-op if we're already on RAND_OpenSSL */ + tt_int_op(0, ==, crypto_force_rand_ssleay()); + tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); + + /* We should correct the method if it's a dummy. */ + RAND_set_rand_method(&dummy_method); +#ifdef LIBRESSL_VERSION_NUMBER + /* On libressl, you can't override the RNG. */ + tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); + tt_int_op(0, ==, crypto_force_rand_ssleay()); +#else + tt_assert(RAND_get_rand_method() == &dummy_method); + tt_int_op(1, ==, crypto_force_rand_ssleay()); +#endif + tt_assert(RAND_get_rand_method() == RAND_OpenSSL()); + + /* Make sure we aren't calling dummy_method */ + crypto_rand((void *) &dummy_method, sizeof(dummy_method)); + crypto_rand((void *) &dummy_method, sizeof(dummy_method)); + + done: + ; +} + +#ifndef OPENSSL_1_1_API +#define EVP_ENCODE_CTX_new() tor_malloc_zero(sizeof(EVP_ENCODE_CTX)) +#define EVP_ENCODE_CTX_free(ctx) tor_free(ctx) +#endif + +/** Encode src into dest with OpenSSL's EVP Encode interface, returning the + * length of the encoded data in bytes. + */ +static int +base64_encode_evp(char *dest, char *src, size_t srclen) +{ + const unsigned char *s = (unsigned char*)src; + EVP_ENCODE_CTX *ctx = EVP_ENCODE_CTX_new(); + int len, ret; + + EVP_EncodeInit(ctx); + EVP_EncodeUpdate(ctx, (unsigned char *)dest, &len, s, (int)srclen); + EVP_EncodeFinal(ctx, (unsigned char *)(dest + len), &ret); + EVP_ENCODE_CTX_free(ctx); + return ret+ len; +} + +static void +test_crypto_base64_encode_matches(void *arg) +{ + (void)arg; + int i, j; + char data1[1024]; + char data2[1024]; + char data3[1024]; + + for (i = 0; i < 256; i++) { + /* Test the multiline format Base64 encoder with 0 .. 256 bytes of + * output against OpenSSL. + */ + const size_t enclen = base64_encode_size(i, BASE64_ENCODE_MULTILINE); + data1[i] = i; + j = base64_encode(data2, 1024, data1, i, BASE64_ENCODE_MULTILINE); + tt_int_op(j, OP_EQ, enclen); + j = base64_encode_evp(data3, data1, i); + tt_int_op(j, OP_EQ, enclen); + tt_mem_op(data2, OP_EQ, data3, enclen); + tt_int_op(j, OP_EQ, strlen(data2)); + } + + done: + ; +} + +struct testcase_t crypto_openssl_tests[] = { + { "rng_engine", test_crypto_rng_engine, TT_FORK, NULL, NULL }, + { "base64_encode_match", test_crypto_base64_encode_matches, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES +}; + diff --git a/src/test/test_crypto_slow.c b/src/test/test_crypto_slow.c index 0d7d65ac73..d6b0a43dd5 100644 --- a/src/test/test_crypto_slow.c +++ b/src/test/test_crypto_slow.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -12,11 +12,8 @@ #if defined(HAVE_LIBSCRYPT_H) && defined(HAVE_LIBSCRYPT_SCRYPT) #define HAVE_LIBSCRYPT -#include <libscrypt.h> #endif -#include <openssl/evp.h> - /** Run unit tests for our secret-to-key passphrase hashing functionality. */ static void test_crypto_s2k_rfc2440(void *arg) diff --git a/src/test/test_data.c b/src/test/test_data.c index 788489a097..ce6c3394f6 100644 --- a/src/test/test_data.c +++ b/src/test/test_data.c @@ -1,6 +1,6 @@ /* Copyright 2001-2004 Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "test.h" diff --git a/src/test/test_dir.c b/src/test/test_dir.c index 4e5876fa3c..a9d9cba7df 100644 --- a/src/test/test_dir.c +++ b/src/test/test_dir.c @@ -1,12 +1,13 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" #include <math.h> #define CONFIG_PRIVATE +#define CONTROL_PRIVATE #define DIRSERV_PRIVATE #define DIRVOTE_PRIVATE #define ROUTER_PRIVATE @@ -19,6 +20,7 @@ #include "or.h" #include "confparse.h" #include "config.h" +#include "control.h" #include "crypto_ed25519.h" #include "directory.h" #include "dirserv.h" @@ -329,7 +331,7 @@ test_dir_formats(void *arg) ntor_cc = make_ntor_onion_key_crosscert(&r2_onion_keypair, &kp1.pubkey, r2->cache_info.published_on, - MIN_ONION_KEY_LIFETIME, + get_onion_key_lifetime(), &ntor_cc_sign); tt_assert(ntor_cc); base64_encode(cert_buf, sizeof(cert_buf), @@ -910,6 +912,23 @@ mock_get_by_ei_desc_digest(const char *d) } } +static signed_descriptor_t * +mock_ei_get_by_ei_digest(const char *d) +{ + char hex[HEX_DIGEST_LEN+1]; + base16_encode(hex, sizeof(hex), d, DIGEST_LEN); + signed_descriptor_t *sd = &sd_ei_minimal; + + if (!strcmp(hex, "11E0EDF526950739F7769810FCACAB8C882FAEEE")) { + sd->signed_descriptor_body = (char *)EX_EI_MINIMAL; + sd->signed_descriptor_len = sizeof(EX_EI_MINIMAL); + sd->annotations_len = 0; + sd->saved_location = SAVED_NOWHERE; + return sd; + } + return NULL; +} + static smartlist_t *mock_ei_insert_list = NULL; static was_router_added_t mock_ei_insert(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible) @@ -999,6 +1018,37 @@ test_dir_load_extrainfo(void *arg) } static void +test_dir_getinfo_extra(void *arg) +{ + int r; + char *answer = NULL; + const char *errmsg = NULL; + + (void)arg; + MOCK(extrainfo_get_by_descriptor_digest, mock_ei_get_by_ei_digest); + r = getinfo_helper_dir(NULL, "extra-info/digest/" + "11E0EDF526950739F7769810FCACAB8C882FAEEE", &answer, + &errmsg); + tt_int_op(0, OP_EQ, r); + tt_ptr_op(NULL, OP_EQ, errmsg); + tt_str_op(answer, OP_EQ, EX_EI_MINIMAL); + tor_free(answer); + + answer = NULL; + r = getinfo_helper_dir(NULL, "extra-info/digest/" + "NOTAVALIDHEXSTRINGNOTAVALIDHEXSTRINGNOTA", &answer, + &errmsg); + tt_int_op(0, OP_EQ, r); + /* getinfo_helper_dir() should maybe return an error here but doesn't */ + tt_ptr_op(NULL, OP_EQ, errmsg); + /* In any case, there should be no answer for an invalid hex string. */ + tt_ptr_op(NULL, OP_EQ, answer); + + done: + UNMOCK(extrainfo_get_by_descriptor_digest); +} + +static void test_dir_versions(void *arg) { tor_version_t ver1; @@ -1065,6 +1115,7 @@ test_dir_versions(void *arg) tt_int_op(0, OP_EQ, ver1.patchlevel); tt_int_op(VER_RELEASE, OP_EQ, ver1.status); tt_str_op("alpha", OP_EQ, ver1.status_tag); + /* Go through the full set of status tags */ tt_int_op(0, OP_EQ, tor_version_parse("2.1.700-alpha", &ver1)); tt_int_op(2, OP_EQ, ver1.major); tt_int_op(1, OP_EQ, ver1.minor); @@ -1079,6 +1130,60 @@ test_dir_versions(void *arg) tt_int_op(0, OP_EQ, ver1.patchlevel); tt_int_op(VER_RELEASE, OP_EQ, ver1.status); tt_str_op("alpha-dev", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.5-rc", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(5, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("rc", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.6-rc-dev", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(6, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("rc-dev", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.8", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(8, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(0, OP_EQ, tor_version_parse("0.2.9.9-dev", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2, OP_EQ, ver1.minor); + tt_int_op(9, OP_EQ, ver1.micro); + tt_int_op(9, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("dev", OP_EQ, ver1.status_tag); + /* In #21450, we fixed an inconsistency in parsing versions > INT32_MAX + * between i386 and x86_64, as we used tor_parse_long, and then cast to int + */ + tt_int_op(0, OP_EQ, tor_version_parse("0.2147483647.0", &ver1)); + tt_int_op(0, OP_EQ, ver1.major); + tt_int_op(2147483647, OP_EQ, ver1.minor); + tt_int_op(0, OP_EQ, ver1.micro); + tt_int_op(0, OP_EQ, ver1.patchlevel); + tt_int_op(VER_RELEASE, OP_EQ, ver1.status); + tt_str_op("", OP_EQ, ver1.status_tag); + tt_int_op(-1, OP_EQ, tor_version_parse("0.2147483648.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.4294967295.0", &ver1)); + /* In #21278, we reject negative version components */ + tt_int_op(-1, OP_EQ, tor_version_parse("0.-1.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.-2147483648.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.-4294967295.0", &ver1)); + /* In #21507, we reject version components with non-numeric prefixes */ + tt_int_op(-1, OP_EQ, tor_version_parse("0.-0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("+1.0.0", &ver1)); + /* use the list in isspace() */ + tt_int_op(-1, OP_EQ, tor_version_parse("0.\t0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\n0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\v0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\f0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0.\r0.0", &ver1)); + tt_int_op(-1, OP_EQ, tor_version_parse("0. 0.0", &ver1)); #define tt_versionstatus_op(vs1, op, vs2) \ tt_assert_test_type(vs1,vs2,#vs1" "#op" "#vs2,version_status_t, \ @@ -1098,6 +1203,7 @@ test_dir_versions(void *arg) test_v_i_o(VS_RECOMMENDED, "0.0.7rc2", "0.0.7,Tor 0.0.7rc2,Tor 0.0.8"); test_v_i_o(VS_OLD, "0.0.5.0", "0.0.5.1-cvs"); test_v_i_o(VS_NEW_IN_SERIES, "0.0.5.1-cvs", "0.0.5, 0.0.6"); + test_v_i_o(VS_NEW, "0.2.9.9-dev", "0.2.9.9"); /* Not on list, but newer than any in same series. */ test_v_i_o(VS_NEW_IN_SERIES, "0.1.0.3", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0"); @@ -1136,6 +1242,70 @@ test_dir_versions(void *arg) "Tor 0.2.1.0-dev (r99)")); tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.1", "Tor 0.2.1.0-dev (r99)")); + /* And git revisions */ + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-56788a2489127072)", + "Tor 0.2.9.9 (git-56788a2489127072)")); + /* a git revision is newer than no git revision */ + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-56788a2489127072)", + "Tor 0.2.9.9")); + /* a longer git revision is newer than a shorter git revision + * this should be true if they prefix-match, but if they don't, they are + * incomparable, because hashes aren't ordered (but we compare their bytes + * anyway) */ + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-56788a2489127072d513cf4baf35a8ff475f3c7b)", + "Tor 0.2.9.9 (git-56788a2489127072)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-0102)", + "Tor 0.2.9.9 (git-03)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-0102)", + "Tor 0.2.9.9 (git-00)")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-01)", + "Tor 0.2.9.9 (git-00)")); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.2.9.9 (git-00)", + "Tor 0.2.9.9 (git-01)")); + /* In #21278, we comapre without integer overflows. + * But since #21450 limits version components to [0, INT32_MAX], it is no + * longer possible to cause an integer overflow in tor_version_compare() */ + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.0.0.0", + "Tor 2147483647.0.0.0")); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 2147483647.0.0.0", + "Tor 0.0.0.0")); + /* These versions used to cause an overflow, now they don't parse + * (and authorities reject their descriptors), and log a BUG message */ + setup_full_capture_of_logs(LOG_WARN); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.0.0.0", + "Tor 0.-2147483648.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.2147483647.0.0", + "Tor 0.-1.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.2147483647.0.0", + "Tor 0.-2147483648.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + tt_int_op(1,OP_EQ, tor_version_as_new_as( + "Tor 4294967295.0.0.0", + "Tor 0.0.0.0")); + expect_no_log_entry(); + tt_int_op(0,OP_EQ, tor_version_as_new_as( + "Tor 0.4294967295.0.0", + "Tor 0.-4294967295.0.0")); + expect_single_log_msg_containing("unparseable"); + mock_clean_saved_logs(); + teardown_capture_of_logs(); /* Now try git revisions */ tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1)); @@ -1145,11 +1315,24 @@ test_dir_versions(void *arg) tt_int_op(7,OP_EQ, ver1.patchlevel); tt_int_op(3,OP_EQ, ver1.git_tag_len); tt_mem_op(ver1.git_tag,OP_EQ, "\xff\x00\xff", 3); + /* reject bad hex digits */ tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1)); + /* reject odd hex digit count */ tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1)); + /* ignore "git " */ tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1)); + /* standard length is 16 hex digits */ + tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-0010203040506070)", + &ver1)); + /* length limit is 40 hex digits */ + tt_int_op(0,OP_EQ, tor_version_parse( + "0.5.6.7 (git-000102030405060708090a0b0c0d0e0f10111213)", + &ver1)); + tt_int_op(-1,OP_EQ, tor_version_parse( + "0.5.6.7 (git-000102030405060708090a0b0c0d0e0f1011121314)", + &ver1)); done: - ; + teardown_capture_of_logs(); } /** Run unit tests for directory fp_pair functions. */ @@ -4399,15 +4582,7 @@ test_dir_should_use_directory_guards(void *data) } NS_DECL(void, -directory_initiate_command_routerstatus, (const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - circuit_guard_state_t *guardstate)); +directory_initiate_request, (directory_request_t *req)); static void test_dir_should_not_init_request_to_ourselves(void *data) @@ -4417,7 +4592,7 @@ test_dir_should_not_init_request_to_ourselves(void *data) crypto_pk_t *key = pk_generate(2); (void) data; - NS_MOCK(directory_initiate_command_routerstatus); + NS_MOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); @@ -4432,15 +4607,15 @@ test_dir_should_not_init_request_to_ourselves(void *data) dir_server_add(ourself); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); done: - NS_UNMOCK(directory_initiate_command_routerstatus); + NS_UNMOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); crypto_pk_free(key); @@ -4454,7 +4629,7 @@ test_dir_should_not_init_request_to_dir_auths_without_v3_info(void *data) | MICRODESC_DIRINFO; (void) data; - NS_MOCK(directory_initiate_command_routerstatus); + NS_MOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); @@ -4465,14 +4640,14 @@ test_dir_should_not_init_request_to_dir_auths_without_v3_info(void *data) dir_server_add(ds); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 0); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 0); done: - NS_UNMOCK(directory_initiate_command_routerstatus); + NS_UNMOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); } @@ -4483,7 +4658,7 @@ test_dir_should_init_request_to_dir_auths(void *data) dir_server_t *ds = NULL; (void) data; - NS_MOCK(directory_initiate_command_routerstatus); + NS_MOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); @@ -4494,39 +4669,23 @@ test_dir_should_init_request_to_dir_auths(void *data) dir_server_add(ds); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_STATUS_VOTE, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 1); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 1); directory_get_from_all_authorities(DIR_PURPOSE_FETCH_DETACHED_SIGNATURES, 0, NULL); - tt_int_op(CALLED(directory_initiate_command_routerstatus), OP_EQ, 2); + tt_int_op(CALLED(directory_initiate_request), OP_EQ, 2); done: - NS_UNMOCK(directory_initiate_command_routerstatus); + NS_UNMOCK(directory_initiate_request); clear_dir_servers(); routerlist_free_all(); } void -NS(directory_initiate_command_routerstatus)(const routerstatus_t *status, - uint8_t dir_purpose, - uint8_t router_purpose, - dir_indirection_t indirection, - const char *resource, - const char *payload, - size_t payload_len, - time_t if_modified_since, - circuit_guard_state_t *guardstate) +NS(directory_initiate_request)(directory_request_t *req) { - (void)status; - (void)dir_purpose; - (void)router_purpose; - (void)indirection; - (void)resource; - (void)payload; - (void)payload_len; - (void)if_modified_since; - (void)guardstate; - CALLED(directory_initiate_command_routerstatus)++; + (void)req; + CALLED(directory_initiate_request)++; } static void @@ -5837,6 +5996,7 @@ struct testcase_t dir_tests[] = { DIR(parse_router_list, TT_FORK), DIR(load_routers, TT_FORK), DIR(load_extrainfo, TT_FORK), + DIR(getinfo_extra, 0), DIR_LEGACY(versions), DIR_LEGACY(fp_pairs), DIR(split_fps, 0), diff --git a/src/test/test_dir_common.c b/src/test/test_dir_common.c index ca43dd4c04..fca70249bd 100644 --- a/src/test/test_dir_common.c +++ b/src/test/test_dir_common.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_dir_common.h b/src/test/test_dir_common.h index 9682b0db49..65b9cf6436 100644 --- a/src/test/test_dir_common.h +++ b/src/test/test_dir_common.h @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_dir_handle_get.c b/src/test/test_dir_handle_get.c index a0868f9253..c98938b2db 100644 --- a/src/test/test_dir_handle_get.c +++ b/src/test/test_dir_handle_get.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define RENDCOMMON_PRIVATE @@ -14,6 +14,7 @@ #include "connection.h" #include "directory.h" #include "test.h" +#include "compress.h" #include "connection.h" #include "rendcommon.h" #include "rendcache.h" @@ -28,7 +29,6 @@ #include "networkstatus.h" #include "geoip.h" #include "dirserv.h" -#include "torgzip.h" #include "dirvote.h" #include "log_test_helpers.h" @@ -743,7 +743,7 @@ test_dir_handle_get_server_descriptors_not_found(void* data) NULL, NULL, 1, 0); tt_str_op(NOT_FOUND, OP_EQ, header); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_SERVER_BY_FP); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: UNMOCK(connection_write_to_buf_impl_); @@ -773,6 +773,7 @@ test_dir_handle_get_server_descriptors_all(void* data) tt_int_op(smartlist_len(our_routerlist->routers), OP_GE, 1); mock_routerinfo = smartlist_get(our_routerlist->routers, 0); set_server_identity_key(mock_routerinfo->identity_pkey); + mock_routerinfo->cache_info.published_on = time(NULL); /* Treat "all" requests as if they were unencrypted */ mock_routerinfo->cache_info.send_unencrypted = 1; @@ -787,7 +788,7 @@ test_dir_handle_get_server_descriptors_all(void* data) //which is smaller than that by annotation_len bytes fetch_from_buf_http(TO_CONN(conn)->outbuf, &header, MAX_HEADERS_SIZE, &body, &body_used, - mock_routerinfo->cache_info.signed_descriptor_len+1, 0); + 1024*1024, 0); tt_assert(header); tt_assert(body); @@ -803,7 +804,7 @@ test_dir_handle_get_server_descriptors_all(void* data) tt_str_op(body, OP_EQ, mock_routerinfo->cache_info.signed_descriptor_body + mock_routerinfo->cache_info.annotations_len); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: NS_UNMOCK(router_get_my_routerinfo); @@ -882,6 +883,7 @@ test_dir_handle_get_server_descriptors_authority(void* data) mock_routerinfo->cache_info.signed_descriptor_len = strlen(TEST_DESCRIPTOR) - annotation_len;; mock_routerinfo->cache_info.annotations_len = annotation_len; + mock_routerinfo->cache_info.published_on = time(NULL); conn = new_dir_conn(); @@ -904,7 +906,7 @@ test_dir_handle_get_server_descriptors_authority(void* data) tt_int_op(body_used, OP_EQ, strlen(body)); tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: NS_UNMOCK(router_get_my_routerinfo); @@ -946,6 +948,7 @@ test_dir_handle_get_server_descriptors_fp(void* data) mock_routerinfo->cache_info.signed_descriptor_len = strlen(TEST_DESCRIPTOR) - annotation_len; mock_routerinfo->cache_info.annotations_len = annotation_len; + mock_routerinfo->cache_info.published_on = time(NULL); conn = new_dir_conn(); @@ -975,7 +978,7 @@ test_dir_handle_get_server_descriptors_fp(void* data) tt_int_op(body_used, OP_EQ, strlen(body)); tt_str_op(body, OP_EQ, TEST_DESCRIPTOR + annotation_len); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: NS_UNMOCK(router_get_my_routerinfo); @@ -1041,7 +1044,7 @@ test_dir_handle_get_server_descriptors_d(void* data) tt_str_op(body, OP_EQ, router->cache_info.signed_descriptor_body + router->cache_info.annotations_len); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: UNMOCK(connection_write_to_buf_impl_); @@ -1096,7 +1099,7 @@ test_dir_handle_get_server_descriptors_busy(void* data) tt_assert(header); tt_str_op(SERVER_BUSY, OP_EQ, header); - tt_int_op(conn->dir_spool_src, OP_EQ, DIR_SPOOL_NONE); + tt_ptr_op(conn->spool, OP_EQ, NULL); done: UNMOCK(get_options); @@ -1770,10 +1773,14 @@ status_vote_current_consensus_ns_test(char **header, char **body, size_t *body_len) { common_digests_t digests; + uint8_t sha3[DIGEST256_LEN]; dir_connection_t *conn = NULL; #define NETWORK_STATUS "some network status string" + memset(&digests, 0x60, sizeof(digests)); + memset(sha3, 0x06, sizeof(sha3)); dirserv_set_cached_consensus_networkstatus(NETWORK_STATUS, "ns", &digests, + sha3, time(NULL)); MOCK(connection_write_to_buf_impl_, connection_write_to_buf_mock); @@ -1829,8 +1836,8 @@ test_dir_handle_get_status_vote_current_consensus_ns(void* data) comp_body_used); tt_int_op(ZLIB_METHOD, OP_EQ, compression); - tor_gzip_uncompress(&body, &body_used, comp_body, comp_body_used, - compression, 0, LOG_PROTOCOL_WARN); + tor_uncompress(&body, &body_used, comp_body, comp_body_used, + compression, 0, LOG_PROTOCOL_WARN); tt_str_op(NETWORK_STATUS, OP_EQ, body); tt_int_op(strlen(NETWORK_STATUS), OP_EQ, body_used); @@ -2494,6 +2501,53 @@ test_dir_handle_get_status_vote_current_authority(void* data) dirvote_free_all(); } +static void +test_dir_handle_get_parse_accept_encoding(void *arg) +{ + (void)arg; + const unsigned B_NONE = 1u << NO_METHOD; + const unsigned B_ZLIB = 1u << ZLIB_METHOD; + const unsigned B_GZIP = 1u << GZIP_METHOD; + const unsigned B_LZMA = 1u << LZMA_METHOD; + const unsigned B_ZSTD = 1u << ZSTD_METHOD; + + unsigned encodings; + + encodings = parse_accept_encoding_header(""); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header(" "); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("dewey, cheatham, and howe "); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("dewey, cheatham, and gzip"); + tt_uint_op(B_NONE, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("dewey, cheatham, and, gzip"); + tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header(" gzip"); + tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("gzip"); + tt_uint_op(B_NONE|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("x-zstd, deflate, x-tor-lzma"); + tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA, OP_EQ, encodings); + + encodings = parse_accept_encoding_header( + "x-zstd, deflate, x-tor-lzma, gzip"); + tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA|B_GZIP, OP_EQ, encodings); + + encodings = parse_accept_encoding_header("x-zstd,deflate,x-tor-lzma,gzip"); + tt_uint_op(B_NONE|B_ZLIB|B_ZSTD|B_LZMA|B_GZIP, OP_EQ, encodings); + + done: + ; +} + #define DIR_HANDLE_CMD(name,flags) \ { #name, test_dir_handle_get_##name, (flags), NULL, NULL } @@ -2552,6 +2606,7 @@ struct testcase_t dir_handle_get_tests[] = { DIR_HANDLE_CMD(status_vote_next_consensus_signatures_not_found, 0), DIR_HANDLE_CMD(status_vote_next_consensus_signatures_busy, 0), DIR_HANDLE_CMD(status_vote_next_consensus_signatures, 0), + DIR_HANDLE_CMD(parse_accept_encoding, 0), END_OF_TESTCASES }; diff --git a/src/test/test_entryconn.c b/src/test/test_entryconn.c index 50848cfec2..12a631630b 100644 --- a/src/test/test_entryconn.c +++ b/src/test/test_entryconn.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c index 249fd1f973..3db7e63ee3 100644 --- a/src/test/test_entrynodes.c +++ b/src/test/test_entrynodes.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -584,6 +584,9 @@ test_entry_guard_parse_from_state_full(void *arg) smartlist_t *text = smartlist_new(); char *joined = NULL; + // So nodes aren't expired. This is Tue, 13 Dec 2016 09:37:14 GMT + update_approx_time(1481621834); + MOCK(entry_guard_is_listed, mock_entry_guard_is_listed); dummy_state = state; diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c index 1f92780177..fc9f27a5ac 100644 --- a/src/test/test_extorport.c +++ b/src/test/test_extorport.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONNECTION_PRIVATE @@ -72,9 +72,9 @@ test_ext_or_id_map(void *arg) * writes to outbuf. */ static void connection_write_to_buf_impl_replacement(const char *string, size_t len, - connection_t *conn, int zlib) + connection_t *conn, int compressed) { - (void) zlib; + (void) compressed; tor_assert(string); tor_assert(conn); diff --git a/src/test/test_guardfraction.c b/src/test/test_guardfraction.c index 8173e44d47..56006f3cc3 100644 --- a/src/test/test_guardfraction.c +++ b/src/test/test_guardfraction.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define DIRSERV_PRIVATE diff --git a/src/test/test_handles.c b/src/test/test_handles.c index 536a478689..7ddee6e376 100644 --- a/src/test/test_handles.c +++ b/src/test/test_handles.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_helpers.c b/src/test/test_helpers.c index 5b84366e6d..9fada5a675 100644 --- a/src/test/test_helpers.c +++ b/src/test/test_helpers.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -98,9 +98,9 @@ helper_setup_fake_routerlist(void) void connection_write_to_buf_mock(const char *string, size_t len, - connection_t *conn, int zlib) + connection_t *conn, int compressed) { - (void) zlib; + (void) compressed; tor_assert(string); tor_assert(conn); diff --git a/src/test/test_helpers.h b/src/test/test_helpers.h index c6d4d9c41f..4621631cc1 100644 --- a/src/test/test_helpers.h +++ b/src/test/test_helpers.h @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #ifndef TOR_TEST_HELPERS_H @@ -15,7 +15,7 @@ void helper_setup_fake_routerlist(void); #define GET(path) "GET " path " HTTP/1.0\r\n\r\n" void connection_write_to_buf_mock(const char *string, size_t len, - connection_t *conn, int zlib); + connection_t *conn, int compressed); int mock_tor_addr_lookup__fail_on_bad_addrs(const char *name, uint16_t family, tor_addr_t *out); diff --git a/src/test/test_hs.c b/src/test/test_hs.c index fbaabe91d8..b4817a21ea 100644 --- a/src/test/test_hs.c +++ b/src/test/test_hs.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -210,9 +210,30 @@ test_hs_desc_event(void *arg) tt_str_op(received_msg,OP_EQ, expected_msg); tor_free(received_msg); - /* test valid content. */ + /* test no HSDir fingerprint type */ + rend_query.auth_type = REND_NO_AUTH; + control_event_hs_descriptor_failed(&rend_query.base_, NULL, + "QUERY_NO_HSDIR"); + expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" NO_AUTH " \ + "UNKNOWN REASON=QUERY_NO_HSDIR\r\n"; + tt_assert(received_msg); + tt_str_op(received_msg,OP_EQ, expected_msg); + tor_free(received_msg); + + /* Test invalid content with no HSDir fingerprint. */ char *exp_msg; control_event_hs_descriptor_content(rend_query.onion_address, + STR_HS_CONTENT_DESC_ID, NULL, NULL); + tor_asprintf(&exp_msg, "650+HS_DESC_CONTENT " STR_HS_ADDR " "\ + STR_HS_CONTENT_DESC_ID " UNKNOWN" \ + "\r\n\r\n.\r\n650 OK\r\n"); + tt_assert(received_msg); + tt_str_op(received_msg, OP_EQ, exp_msg); + tor_free(received_msg); + tor_free(exp_msg); + + /* test valid content. */ + control_event_hs_descriptor_content(rend_query.onion_address, STR_HS_CONTENT_DESC_ID, HSDIR_EXIST_ID, hs_desc_content); tor_asprintf(&exp_msg, "650+HS_DESC_CONTENT " STR_HS_ADDR " "\ @@ -821,7 +842,9 @@ test_prune_services_on_reload(void *arg) smartlist_add(old, e1); /* Only put the non ephemeral in the new list. */ smartlist_add(new, s1); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); /* We expect that the ephemeral one is in the new list but removed from * the old one. */ tt_int_op(smartlist_len(old), OP_EQ, 1); @@ -840,7 +863,9 @@ test_prune_services_on_reload(void *arg) * one. */ smartlist_add(old, s1); smartlist_add(old, e1); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); tt_int_op(smartlist_len(old), OP_EQ, 1); tt_assert(smartlist_get(old, 0) == s1); tt_int_op(smartlist_len(new), OP_EQ, 1); @@ -855,7 +880,9 @@ test_prune_services_on_reload(void *arg) * list being completely different. */ smartlist_add(new, s1); smartlist_add(new, e1); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); tt_int_op(smartlist_len(old), OP_EQ, 0); tt_int_op(smartlist_len(new), OP_EQ, 2); tt_assert(smartlist_get(new, 0) == s1); @@ -871,7 +898,9 @@ test_prune_services_on_reload(void *arg) /* Setup our list. */ smartlist_add(old, s1); smartlist_add(new, s2); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); tt_int_op(smartlist_len(old), OP_EQ, 1); /* Intro nodes have been moved to the s2 in theory so it must be empty. */ tt_int_op(smartlist_len(s1->intro_nodes), OP_EQ, 0); @@ -892,7 +921,9 @@ test_prune_services_on_reload(void *arg) /* Test two ephemeral services. */ smartlist_add(old, e1); smartlist_add(old, e2); - prune_services_on_reload(old, new); + set_rend_service_list(old); + set_rend_rend_service_staging_list(new); + rend_service_prune_list_impl_(); /* Check if they've all been transfered. */ tt_int_op(smartlist_len(old), OP_EQ, 0); tt_int_op(smartlist_len(new), OP_EQ, 2); diff --git a/src/test/test_hs_cache.c b/src/test/test_hs_cache.c index 1943d0ffac..bc4bfabde9 100644 --- a/src/test/test_hs_cache.c +++ b/src/test/test_hs_cache.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -93,8 +93,8 @@ helper_build_hs_desc(uint64_t revision_counter, uint32_t lifetime, /* Setup encrypted data section. */ desc->encrypted_data.create2_ntor = 1; - desc->encrypted_data.auth_types = smartlist_new(); - smartlist_add(desc->encrypted_data.auth_types, tor_strdup("ed25519")); + desc->encrypted_data.intro_auth_types = smartlist_new(); + smartlist_add(desc->encrypted_data.intro_auth_types, tor_strdup("ed25519")); desc->encrypted_data.intro_points = smartlist_new(); /* Add an intro point. */ smartlist_add(desc->encrypted_data.intro_points, @@ -333,7 +333,7 @@ helper_fetch_desc_from_hsdir(const ed25519_public_key_t *blinded_key) size_t body_used = 0; fetch_from_buf_http(TO_CONN(conn)->outbuf, &headers, MAX_HEADERS_SIZE, - &received_desc, &body_used, 10000, 0); + &received_desc, &body_used, HS_DESC_MAX_LEN, 0); tor_free(headers); } diff --git a/src/test/test_hs_descriptor.c b/src/test/test_hs_descriptor.c index 02a71aa473..a1a1f14fb8 100644 --- a/src/test/test_hs_descriptor.c +++ b/src/test/test_hs_descriptor.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -15,6 +15,9 @@ #include "test.h" #include "torcert.h" +#include "test_helpers.h" +#include "log_test_helpers.h" + static hs_desc_intro_point_t * helper_build_intro_point(const ed25519_keypair_t *blinded_kp, time_t now, const char *addr, int legacy) @@ -105,9 +108,9 @@ helper_build_hs_desc(unsigned int no_ip, ed25519_public_key_t *signing_pubkey) /* Setup encrypted data section. */ desc->encrypted_data.create2_ntor = 1; - desc->encrypted_data.auth_types = smartlist_new(); + desc->encrypted_data.intro_auth_types = smartlist_new(); desc->encrypted_data.single_onion_service = 1; - smartlist_add(desc->encrypted_data.auth_types, tor_strdup("ed25519")); + smartlist_add(desc->encrypted_data.intro_auth_types, tor_strdup("ed25519")); desc->encrypted_data.intro_points = smartlist_new(); if (!no_ip) { /* Add four intro points. */ @@ -157,14 +160,17 @@ helper_compare_hs_desc(const hs_descriptor_t *desc1, desc2->encrypted_data.create2_ntor); /* Authentication type. */ - tt_int_op(!!desc1->encrypted_data.auth_types, ==, - !!desc2->encrypted_data.auth_types); - if (desc1->encrypted_data.auth_types && desc2->encrypted_data.auth_types) { - tt_int_op(smartlist_len(desc1->encrypted_data.auth_types), ==, - smartlist_len(desc2->encrypted_data.auth_types)); - for (int i = 0; i < smartlist_len(desc1->encrypted_data.auth_types); i++) { - tt_str_op(smartlist_get(desc1->encrypted_data.auth_types, i), OP_EQ, - smartlist_get(desc2->encrypted_data.auth_types, i)); + tt_int_op(!!desc1->encrypted_data.intro_auth_types, ==, + !!desc2->encrypted_data.intro_auth_types); + if (desc1->encrypted_data.intro_auth_types && + desc2->encrypted_data.intro_auth_types) { + tt_int_op(smartlist_len(desc1->encrypted_data.intro_auth_types), ==, + smartlist_len(desc2->encrypted_data.intro_auth_types)); + for (int i = 0; + i < smartlist_len(desc1->encrypted_data.intro_auth_types); + i++) { + tt_str_op(smartlist_get(desc1->encrypted_data.intro_auth_types, i),OP_EQ, + smartlist_get(desc2->encrypted_data.intro_auth_types, i)); } } @@ -311,13 +317,13 @@ test_descriptor_padding(void *arg) /* Example: if l = 129, the ceiled division gives 2 and then multiplied by 128 * to give 256. With l = 127, ceiled division gives 1 then times 128. */ #define PADDING_EXPECTED_LEN(l) \ - CEIL_DIV(l, HS_DESC_PLAINTEXT_PADDING_MULTIPLE) * \ - HS_DESC_PLAINTEXT_PADDING_MULTIPLE + CEIL_DIV(l, HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE) * \ + HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE (void) arg; { /* test #1: no padding */ - plaintext_len = HS_DESC_PLAINTEXT_PADDING_MULTIPLE; + plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE; plaintext = tor_malloc(plaintext_len); padded_len = build_plaintext_padding(plaintext, plaintext_len, &padded_plaintext); @@ -333,7 +339,7 @@ test_descriptor_padding(void *arg) } { /* test #2: one byte padding? */ - plaintext_len = HS_DESC_PLAINTEXT_PADDING_MULTIPLE - 1; + plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE - 1; plaintext = tor_malloc(plaintext_len); padded_plaintext = NULL; padded_len = build_plaintext_padding(plaintext, plaintext_len, @@ -350,7 +356,7 @@ test_descriptor_padding(void *arg) } { /* test #3: Lots more bytes of padding? */ - plaintext_len = HS_DESC_PLAINTEXT_PADDING_MULTIPLE + 1; + plaintext_len = HS_DESC_SUPERENC_PLAINTEXT_PAD_MULTIPLE + 1; plaintext = tor_malloc(plaintext_len); padded_plaintext = NULL; padded_len = build_plaintext_padding(plaintext, plaintext_len, @@ -587,19 +593,11 @@ test_encrypted_data_len(void *arg) /* No length, error. */ ret = encrypted_data_length_is_valid(0); tt_int_op(ret, OP_EQ, 0); - /* Not a multiple of our encryption algorithm (thus no padding). It's - * suppose to be aligned on HS_DESC_PLAINTEXT_PADDING_MULTIPLE. */ - value = HS_DESC_PLAINTEXT_PADDING_MULTIPLE * 10 - 1; - ret = encrypted_data_length_is_valid(value); - tt_int_op(ret, OP_EQ, 0); /* Valid value. */ - value = HS_DESC_PADDED_PLAINTEXT_MAX_LEN + HS_DESC_ENCRYPTED_SALT_LEN + - DIGEST256_LEN; + value = HS_DESC_ENCRYPTED_SALT_LEN + DIGEST256_LEN + 1; ret = encrypted_data_length_is_valid(value); tt_int_op(ret, OP_EQ, 1); - /* XXX: Test maximum possible size. */ - done: ; } @@ -1006,6 +1004,103 @@ test_desc_signature(void *arg) tor_free(data); } +/* bad desc auth type */ +static const char bad_superencrypted_text1[] = "desc-auth-type scoobysnack\n" + "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" + "BiYWQgYXQgYWxs\n" + "-----END MESSAGE-----\n"; + +/* bad ephemeral key */ +static const char bad_superencrypted_text2[] = "desc-auth-type x25519\n" + "desc-auth-ephemeral-key differentalphabet\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" + "BiYWQgYXQgYWxs\n" + "-----END MESSAGE-----\n"; + +/* bad encrypted msg */ +static const char bad_superencrypted_text3[] = "desc-auth-type x25519\n" + "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "SO SMALL NOT GOOD\n" + "-----END MESSAGE-----\n"; + +static const char correct_superencrypted_text[] = "desc-auth-type x25519\n" + "desc-auth-ephemeral-key A/O8DVtnUheb3r1JqoB8uJB7wxXL1XJX3eny4yB+eFA=\n" + "auth-client oiNrQB8WwKo S5D02W7vKgiWIMygrBl8RQ FB//SfOBmLEx1kViEWWL1g\n" + "auth-client Od09Qu636Qo /PKLzqewAdS/+0+vZC+MvQ dpw4NFo13zDnuPz45rxrOg\n" + "auth-client JRr840iGYN0 8s8cxYqF7Lx23+NducC4Qg zAafl4wPLURkuEjJreZq1g\n" + "encrypted\n" + "-----BEGIN MESSAGE-----\n" + "YmVpbmcgb24gbW91bnRhaW5zLCB0aGlua2luZyBhYm91dCBjb21wdXRlcnMsIGlzIG5vdC" + "BiYWQgYXQgYWxs\n" + "-----END MESSAGE-----\n"; + +static const char correct_encrypted_plaintext[] = "being on mountains, " + "thinking about computers, is not bad at all"; + +static void +test_parse_hs_desc_superencrypted(void *arg) +{ + (void) arg; + size_t retval; + uint8_t *encrypted_out = NULL; + + { + setup_full_capture_of_logs(LOG_WARN); + retval = decode_superencrypted(bad_superencrypted_text1, + strlen(bad_superencrypted_text1), + &encrypted_out); + tt_u64_op(retval, ==, 0); + tt_assert(!encrypted_out); + expect_log_msg_containing("Unrecognized desc auth type"); + teardown_capture_of_logs(); + } + + { + setup_full_capture_of_logs(LOG_WARN); + retval = decode_superencrypted(bad_superencrypted_text2, + strlen(bad_superencrypted_text2), + &encrypted_out); + tt_u64_op(retval, ==, 0); + tt_assert(!encrypted_out); + expect_log_msg_containing("Bogus desc auth key in HS desc"); + teardown_capture_of_logs(); + } + + { + setup_full_capture_of_logs(LOG_WARN); + retval = decode_superencrypted(bad_superencrypted_text3, + strlen(bad_superencrypted_text3), + &encrypted_out); + tt_u64_op(retval, ==, 0); + tt_assert(!encrypted_out); + expect_log_msg_containing("Length of descriptor\'s encrypted data " + "is too small."); + teardown_capture_of_logs(); + } + + /* Now finally the good one */ + retval = decode_superencrypted(correct_superencrypted_text, + strlen(correct_superencrypted_text), + &encrypted_out); + + tt_u64_op(retval, ==, strlen(correct_encrypted_plaintext)); + tt_mem_op(encrypted_out, OP_EQ, correct_encrypted_plaintext, + strlen(correct_encrypted_plaintext)); + + done: + tor_free(encrypted_out); +} + struct testcase_t hs_descriptor[] = { /* Encoding tests. */ { "cert_encoding", test_cert_encoding, TT_FORK, @@ -1035,6 +1130,9 @@ struct testcase_t hs_descriptor[] = { { "desc_signature", test_desc_signature, TT_FORK, NULL, NULL }, + { "parse_hs_desc_superencrypted", test_parse_hs_desc_superencrypted, + TT_FORK, NULL, NULL }, + END_OF_TESTCASES }; diff --git a/src/test/test_hs_intropoint.c b/src/test/test_hs_intropoint.c index ea12aeb2da..ef5cb46567 100644 --- a/src/test/test_hs_intropoint.c +++ b/src/test/test_hs_intropoint.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -69,10 +69,10 @@ helper_create_intro_circuit(void) return circ; } -static hs_cell_introduce1_t * +static trn_cell_introduce1_t * helper_create_introduce1_cell(void) { - hs_cell_introduce1_t *cell = NULL; + trn_cell_introduce1_t *cell = NULL; ed25519_keypair_t auth_key_kp; /* Generate the auth_key of the cell. */ @@ -80,39 +80,39 @@ helper_create_introduce1_cell(void) goto err; } - cell = hs_cell_introduce1_new(); + cell = trn_cell_introduce1_new(); tt_assert(cell); /* Set the auth key. */ { size_t auth_key_len = sizeof(auth_key_kp.pubkey); - hs_cell_introduce1_set_auth_key_type(cell, + trn_cell_introduce1_set_auth_key_type(cell, HS_INTRO_AUTH_KEY_TYPE_ED25519); - hs_cell_introduce1_set_auth_key_len(cell, auth_key_len); - hs_cell_introduce1_setlen_auth_key(cell, auth_key_len); - uint8_t *auth_key_ptr = hs_cell_introduce1_getarray_auth_key(cell); + trn_cell_introduce1_set_auth_key_len(cell, auth_key_len); + trn_cell_introduce1_setlen_auth_key(cell, auth_key_len); + uint8_t *auth_key_ptr = trn_cell_introduce1_getarray_auth_key(cell); memcpy(auth_key_ptr, auth_key_kp.pubkey.pubkey, auth_key_len); } /* Set the cell extentions to none. */ { - cell_extension_t *ext = cell_extension_new(); - cell_extension_set_num(ext, 0); - hs_cell_introduce1_set_extensions(cell, ext); + trn_cell_extension_t *ext = trn_cell_extension_new(); + trn_cell_extension_set_num(ext, 0); + trn_cell_introduce1_set_extensions(cell, ext); } /* Set the encrypted section to some data. */ { size_t enc_len = 128; - hs_cell_introduce1_setlen_encrypted(cell, enc_len); - uint8_t *enc_ptr = hs_cell_introduce1_getarray_encrypted(cell); + trn_cell_introduce1_setlen_encrypted(cell, enc_len); + uint8_t *enc_ptr = trn_cell_introduce1_getarray_encrypted(cell); memset(enc_ptr, 'a', enc_len); } return cell; err: done: - hs_cell_introduce1_free(cell); + trn_cell_introduce1_free(cell); return NULL; } @@ -122,7 +122,7 @@ static void test_establish_intro_wrong_purpose(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -154,7 +154,7 @@ test_establish_intro_wrong_purpose(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -198,7 +198,7 @@ static void test_establish_intro_wrong_keytype2(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -230,7 +230,7 @@ test_establish_intro_wrong_keytype2(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -239,7 +239,7 @@ static void test_establish_intro_wrong_mac(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -258,7 +258,7 @@ test_establish_intro_wrong_mac(void *arg) tt_assert(establish_intro_cell); /* Mangle one byte of the MAC. */ uint8_t *handshake_ptr = - hs_cell_establish_intro_getarray_handshake_mac(establish_intro_cell); + trn_cell_establish_intro_getarray_handshake_mac(establish_intro_cell); handshake_ptr[TRUNNEL_SHA3_256_LEN - 1]++; /* We need to resign the payload with that change. */ { @@ -269,7 +269,7 @@ test_establish_intro_wrong_mac(void *arg) retval = ed25519_keypair_generate(&key_struct, 0); tt_int_op(retval, OP_EQ, 0); uint8_t *auth_key_ptr = - hs_cell_establish_intro_getarray_auth_key(establish_intro_cell); + trn_cell_establish_intro_getarray_auth_key(establish_intro_cell); memcpy(auth_key_ptr, key_struct.pubkey.pubkey, ED25519_PUBKEY_LEN); /* Encode payload so we can sign it. */ cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), @@ -284,7 +284,7 @@ test_establish_intro_wrong_mac(void *arg) tt_int_op(retval, OP_EQ, 0); /* And write the signature to the cell */ uint8_t *sig_ptr = - hs_cell_establish_intro_getarray_sig(establish_intro_cell); + trn_cell_establish_intro_getarray_sig(establish_intro_cell); memcpy(sig_ptr, sig.sig, establish_intro_cell->sig_len); /* Re-encode with the new signature. */ cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), @@ -299,7 +299,7 @@ test_establish_intro_wrong_mac(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -309,7 +309,7 @@ static void test_establish_intro_wrong_auth_key_len(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -328,9 +328,9 @@ test_establish_intro_wrong_auth_key_len(void *arg) sizeof(circuit_key_material)); tt_assert(establish_intro_cell); /* Mangle the auth key length. */ - hs_cell_establish_intro_set_auth_key_len(establish_intro_cell, + trn_cell_establish_intro_set_auth_key_len(establish_intro_cell, bad_auth_key_len); - hs_cell_establish_intro_setlen_auth_key(establish_intro_cell, + trn_cell_establish_intro_setlen_auth_key(establish_intro_cell, bad_auth_key_len); cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), establish_intro_cell); @@ -344,7 +344,7 @@ test_establish_intro_wrong_auth_key_len(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -354,7 +354,7 @@ static void test_establish_intro_wrong_sig_len(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -373,8 +373,8 @@ test_establish_intro_wrong_sig_len(void *arg) sizeof(circuit_key_material)); tt_assert(establish_intro_cell); /* Mangle the signature length. */ - hs_cell_establish_intro_set_sig_len(establish_intro_cell, bad_sig_len); - hs_cell_establish_intro_setlen_sig(establish_intro_cell, bad_sig_len); + trn_cell_establish_intro_set_sig_len(establish_intro_cell, bad_sig_len); + trn_cell_establish_intro_setlen_sig(establish_intro_cell, bad_sig_len); cell_len = get_establish_intro_payload(cell_body, sizeof(cell_body), establish_intro_cell); tt_int_op(cell_len, >, 0); @@ -387,7 +387,7 @@ test_establish_intro_wrong_sig_len(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } @@ -397,7 +397,7 @@ static void test_establish_intro_wrong_sig(void *arg) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; or_circuit_t *intro_circ = or_circuit_new(0,NULL);; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; @@ -429,17 +429,17 @@ test_establish_intro_wrong_sig(void *arg) tt_int_op(retval, ==, -1); done: - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); circuit_free(TO_CIRCUIT(intro_circ)); } /* Helper function: Send a well-formed v3 ESTABLISH_INTRO cell to * <b>intro_circ</b>. Return the cell. */ -static hs_cell_establish_intro_t * +static trn_cell_establish_intro_t * helper_establish_intro_v3(or_circuit_t *intro_circ) { int retval; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; uint8_t cell_body[RELAY_PAYLOAD_SIZE]; ssize_t cell_len = 0; uint8_t circuit_key_material[DIGEST_LEN] = {0}; @@ -489,6 +489,7 @@ helper_establish_intro_v2(or_circuit_t *intro_circ) /* Use old circuit_key_material why not */ cell_len = encode_establish_intro_cell_legacy((char*)cell_body, + sizeof(cell_body), key1, (char *) circuit_key_material); tt_int_op(cell_len, >, 0); @@ -511,7 +512,7 @@ test_intro_point_registration(void *arg) hs_circuitmap_ht *the_hs_circuitmap = NULL; or_circuit_t *intro_circ = NULL; - hs_cell_establish_intro_t *establish_intro_cell = NULL; + trn_cell_establish_intro_t *establish_intro_cell = NULL; ed25519_public_key_t auth_key; crypto_pk_t *legacy_auth_key = NULL; @@ -531,7 +532,7 @@ test_intro_point_registration(void *arg) tt_assert(the_hs_circuitmap); tt_int_op(0, ==, HT_SIZE(the_hs_circuitmap)); /* Do a circuitmap query in any case */ - returned_intro_circ = hs_circuitmap_get_intro_circ_v3(&auth_key); + returned_intro_circ =hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); tt_ptr_op(returned_intro_circ, ==, NULL); } @@ -547,7 +548,8 @@ test_intro_point_registration(void *arg) tt_int_op(1, ==, HT_SIZE(the_hs_circuitmap)); get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO, establish_intro_cell); - returned_intro_circ = hs_circuitmap_get_intro_circ_v3(&auth_key); + returned_intro_circ = + hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key); tt_ptr_op(intro_circ, ==, returned_intro_circ); } @@ -568,7 +570,8 @@ test_intro_point_registration(void *arg) /* Check that the new element is our legacy intro circuit. */ retval = crypto_pk_get_digest(legacy_auth_key, key_digest); tt_int_op(retval, ==, 0); - returned_intro_circ= hs_circuitmap_get_intro_circ_v2((uint8_t*)key_digest); + returned_intro_circ = + hs_circuitmap_get_intro_circ_v2_relay_side((uint8_t*)key_digest); tt_ptr_op(legacy_intro_circ, ==, returned_intro_circ); } @@ -579,7 +582,7 @@ test_intro_point_registration(void *arg) crypto_pk_free(legacy_auth_key); circuit_free(TO_CIRCUIT(intro_circ)); circuit_free(TO_CIRCUIT(legacy_intro_circ)); - hs_cell_establish_intro_free(establish_intro_cell); + trn_cell_establish_intro_free(establish_intro_cell); { /* Test circuitmap free_all function. */ the_hs_circuitmap = get_hs_circuitmap(); @@ -673,7 +676,7 @@ static void test_introduce1_validation(void *arg) { int ret; - hs_cell_introduce1_t *cell = NULL; + trn_cell_introduce1_t *cell = NULL; (void) arg; @@ -713,25 +716,25 @@ test_introduce1_validation(void *arg) ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, 0); /* Set an invalid size of the auth key buffer. */ - hs_cell_introduce1_setlen_auth_key(cell, 3); + trn_cell_introduce1_setlen_auth_key(cell, 3); ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, -1); /* Reset auth key buffer and make sure it works. */ - hs_cell_introduce1_setlen_auth_key(cell, sizeof(ed25519_public_key_t)); + trn_cell_introduce1_setlen_auth_key(cell, sizeof(ed25519_public_key_t)); ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, 0); /* Empty encrypted section. */ - hs_cell_introduce1_setlen_encrypted(cell, 0); + trn_cell_introduce1_setlen_encrypted(cell, 0); ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, -1); /* Reset it to some non zero bytes and validate. */ - hs_cell_introduce1_setlen_encrypted(cell, 1); + trn_cell_introduce1_setlen_encrypted(cell, 1); ret = validate_introduce1_parsed_cell(cell); tt_int_op(ret, OP_EQ, 0); done: - hs_cell_introduce1_free(cell); + trn_cell_introduce1_free(cell); } static void @@ -739,7 +742,7 @@ test_received_introduce1_handling(void *arg) { int ret; uint8_t *request = NULL, buf[128]; - hs_cell_introduce1_t *cell = NULL; + trn_cell_introduce1_t *cell = NULL; or_circuit_t *circ = NULL; (void) arg; @@ -773,12 +776,12 @@ test_received_introduce1_handling(void *arg) /* Valid case. */ { cell = helper_create_introduce1_cell(); - ssize_t request_len = hs_cell_introduce1_encoded_len(cell); - tt_size_op(request_len, OP_GT, 0); + ssize_t request_len = trn_cell_introduce1_encoded_len(cell); + tt_int_op((int)request_len, OP_GT, 0); request = tor_malloc_zero(request_len); ssize_t encoded_len = - hs_cell_introduce1_encode(request, request_len, cell); - tt_size_op(encoded_len, OP_GT, 0); + trn_cell_introduce1_encode(request, request_len, cell); + tt_int_op((int)encoded_len, OP_GT, 0); circ = helper_create_intro_circuit(); or_circuit_t *service_circ = helper_create_intro_circuit(); @@ -787,9 +790,9 @@ test_received_introduce1_handling(void *arg) /* Register the circuit in the map for the auth key of the cell. */ ed25519_public_key_t auth_key; const uint8_t *cell_auth_key = - hs_cell_introduce1_getconstarray_auth_key(cell); + trn_cell_introduce1_getconstarray_auth_key(cell); memcpy(auth_key.pubkey, cell_auth_key, ED25519_PUBKEY_LEN); - hs_circuitmap_register_intro_circ_v3(service_circ, &auth_key); + hs_circuitmap_register_intro_circ_v3_relay_side(service_circ, &auth_key); ret = hs_intro_received_introduce1(circ, request, request_len); circuit_free(TO_CIRCUIT(circ)); circuit_free(TO_CIRCUIT(service_circ)); @@ -799,17 +802,17 @@ test_received_introduce1_handling(void *arg) /* Valid legacy cell. */ { tor_free(request); - hs_cell_introduce1_free(cell); + trn_cell_introduce1_free(cell); cell = helper_create_introduce1_cell(); - uint8_t *legacy_key_id = hs_cell_introduce1_getarray_legacy_key_id(cell); + uint8_t *legacy_key_id = trn_cell_introduce1_getarray_legacy_key_id(cell); memset(legacy_key_id, 'a', DIGEST_LEN); /* Add an arbitrary amount of data for the payload of a v2 cell. */ - size_t request_len = hs_cell_introduce1_encoded_len(cell) + 256; + size_t request_len = trn_cell_introduce1_encoded_len(cell) + 256; tt_size_op(request_len, OP_GT, 0); request = tor_malloc_zero(request_len + 256); ssize_t encoded_len = - hs_cell_introduce1_encode(request, request_len, cell); - tt_size_op(encoded_len, OP_GT, 0); + trn_cell_introduce1_encode(request, request_len, cell); + tt_int_op((int)encoded_len, OP_GT, 0); circ = helper_create_intro_circuit(); or_circuit_t *service_circ = helper_create_intro_circuit(); @@ -818,7 +821,7 @@ test_received_introduce1_handling(void *arg) /* Register the circuit in the map for the auth key of the cell. */ uint8_t token[REND_TOKEN_LEN]; memcpy(token, legacy_key_id, sizeof(token)); - hs_circuitmap_register_intro_circ_v2(service_circ, token); + hs_circuitmap_register_intro_circ_v2_relay_side(service_circ, token); ret = hs_intro_received_introduce1(circ, request, request_len); circuit_free(TO_CIRCUIT(circ)); circuit_free(TO_CIRCUIT(service_circ)); @@ -826,7 +829,7 @@ test_received_introduce1_handling(void *arg) } done: - hs_cell_introduce1_free(cell); + trn_cell_introduce1_free(cell); tor_free(request); hs_circuitmap_free_all(); UNMOCK(relay_send_command_from_edge_); diff --git a/src/test/test_hs_ntor.sh b/src/test/test_hs_ntor.sh new file mode 100755 index 0000000000..8a0003d44a --- /dev/null +++ b/src/test/test_hs_ntor.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# Validate Tor's ntor implementation. + +exitcode=0 + +# Run the python integration test sand return the exitcode of the python +# script. The python script might ask the testsuite to skip it if not all +# python dependencies are covered. +"${PYTHON:-python}" "${abs_top_srcdir:-.}/src/test/hs_ntor_ref.py" || exitcode=$? + +exit ${exitcode} diff --git a/src/test/test_hs_ntor_cl.c b/src/test/test_hs_ntor_cl.c new file mode 100644 index 0000000000..ed1eda58ea --- /dev/null +++ b/src/test/test_hs_ntor_cl.c @@ -0,0 +1,255 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** This is a wrapper over the little-t-tor HS ntor functions. The wrapper is + * used by src/test/hs_ntor_ref.py to conduct the HS ntor integration + * tests. + * + * The logic of this wrapper is basically copied from src/test/test_ntor_cl.c + */ + +#include "orconfig.h" +#include <stdio.h> +#include <stdlib.h> + +#define ONION_NTOR_PRIVATE +#include "or.h" +#include "util.h" +#include "compat.h" +#include "crypto.h" +#include "crypto_curve25519.h" +#include "hs_ntor.h" +#include "onion_ntor.h" + +#define N_ARGS(n) STMT_BEGIN { \ + if (argc < (n)) { \ + fprintf(stderr, "%s needs %d arguments.\n",argv[1],n); \ + return 1; \ + } \ + } STMT_END +#define BASE16(idx, var, n) STMT_BEGIN { \ + const char *s = argv[(idx)]; \ + if (base16_decode((char*)var, n, s, strlen(s)) < (int)n ) { \ + fprintf(stderr, "couldn't decode argument %d (%s)\n",idx,s); \ + return 1; \ + } \ + } STMT_END +#define INT(idx, var) STMT_BEGIN { \ + var = atoi(argv[(idx)]); \ + if (var <= 0) { \ + fprintf(stderr, "bad integer argument %d (%s)\n",idx,argv[(idx)]); \ + } \ + } STMT_END + +/** The first part of the HS ntor protocol. The client-side computes all + necessary key material and sends the appropriate message to the service. */ +static int +client1(int argc, char **argv) +{ + int retval; + + /* Inputs */ + curve25519_public_key_t intro_enc_pubkey; + ed25519_public_key_t intro_auth_pubkey; + curve25519_keypair_t client_ephemeral_enc_keypair; + uint8_t subcredential[DIGEST256_LEN]; + + /* Output */ + hs_ntor_intro_cell_keys_t hs_ntor_intro_cell_keys; + + char buf[256]; + + N_ARGS(6); + BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); + BASE16(3, intro_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(4, client_ephemeral_enc_keypair.seckey.secret_key, + CURVE25519_SECKEY_LEN); + BASE16(5, subcredential, DIGEST256_LEN); + + /* Generate keypair */ + curve25519_public_key_generate(&client_ephemeral_enc_keypair.pubkey, + &client_ephemeral_enc_keypair.seckey); + + retval = hs_ntor_client_get_introduce1_keys(&intro_auth_pubkey, + &intro_enc_pubkey, + &client_ephemeral_enc_keypair, + subcredential, + &hs_ntor_intro_cell_keys); + if (retval < 0) { + goto done; + } + + /* Send ENC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.enc_key, + sizeof(hs_ntor_intro_cell_keys.enc_key)); + printf("%s\n", buf); + /* Send MAC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.mac_key, + sizeof(hs_ntor_intro_cell_keys.mac_key)); + printf("%s\n", buf); + + done: + return retval; +} + +/** The second part of the HS ntor protocol. The service-side computes all + necessary key material and sends the appropriate message to the client */ +static int +server1(int argc, char **argv) +{ + int retval; + + /* Inputs */ + curve25519_keypair_t intro_enc_keypair; + ed25519_public_key_t intro_auth_pubkey; + curve25519_public_key_t client_ephemeral_enc_pubkey; + uint8_t subcredential[DIGEST256_LEN]; + + /* Output */ + hs_ntor_intro_cell_keys_t hs_ntor_intro_cell_keys; + hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; + curve25519_keypair_t service_ephemeral_rend_keypair; + + char buf[256]; + + N_ARGS(6); + BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); + BASE16(3, intro_enc_keypair.seckey.secret_key, CURVE25519_SECKEY_LEN); + BASE16(4, client_ephemeral_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(5, subcredential, DIGEST256_LEN); + + /* Generate keypair */ + curve25519_public_key_generate(&intro_enc_keypair.pubkey, + &intro_enc_keypair.seckey); + curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); + + /* Get INTRODUCE1 keys */ + retval = hs_ntor_service_get_introduce1_keys(&intro_auth_pubkey, + &intro_enc_keypair, + &client_ephemeral_enc_pubkey, + subcredential, + &hs_ntor_intro_cell_keys); + if (retval < 0) { + goto done; + } + + /* Get RENDEZVOUS1 keys */ + retval = hs_ntor_service_get_rendezvous1_keys(&intro_auth_pubkey, + &intro_enc_keypair, + &service_ephemeral_rend_keypair, + &client_ephemeral_enc_pubkey, + &hs_ntor_rend_cell_keys); + if (retval < 0) { + goto done; + } + + /* Send ENC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.enc_key, + sizeof(hs_ntor_intro_cell_keys.enc_key)); + printf("%s\n", buf); + /* Send MAC_KEY */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_intro_cell_keys.mac_key, + sizeof(hs_ntor_intro_cell_keys.mac_key)); + printf("%s\n", buf); + /* Send AUTH_MAC */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.rend_cell_auth_mac, + sizeof(hs_ntor_rend_cell_keys.rend_cell_auth_mac)); + printf("%s\n", buf); + /* Send NTOR_KEY_SEED */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.ntor_key_seed, + sizeof(hs_ntor_rend_cell_keys.ntor_key_seed)); + printf("%s\n", buf); + /* Send service ephemeral pubkey (Y) */ + base16_encode(buf, sizeof(buf), + (const char*)service_ephemeral_rend_keypair.pubkey.public_key, + sizeof(service_ephemeral_rend_keypair.pubkey.public_key)); + printf("%s\n", buf); + + done: + return retval; +} + +/** The final step of the ntor protocol, the client computes and returns the + * rendezvous key material. */ +static int +client2(int argc, char **argv) +{ + int retval; + + /* Inputs */ + curve25519_public_key_t intro_enc_pubkey; + ed25519_public_key_t intro_auth_pubkey; + curve25519_keypair_t client_ephemeral_enc_keypair; + curve25519_public_key_t service_ephemeral_rend_pubkey; + uint8_t subcredential[DIGEST256_LEN]; + + /* Output */ + hs_ntor_rend_cell_keys_t hs_ntor_rend_cell_keys; + + char buf[256]; + + N_ARGS(7); + BASE16(2, intro_auth_pubkey.pubkey, ED25519_PUBKEY_LEN); + BASE16(3, client_ephemeral_enc_keypair.seckey.secret_key, + CURVE25519_SECKEY_LEN); + BASE16(4, intro_enc_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(5, service_ephemeral_rend_pubkey.public_key, CURVE25519_PUBKEY_LEN); + BASE16(6, subcredential, DIGEST256_LEN); + + /* Generate keypair */ + curve25519_public_key_generate(&client_ephemeral_enc_keypair.pubkey, + &client_ephemeral_enc_keypair.seckey); + + /* Get RENDEZVOUS1 keys */ + retval = hs_ntor_client_get_rendezvous1_keys(&intro_auth_pubkey, + &client_ephemeral_enc_keypair, + &intro_enc_pubkey, + &service_ephemeral_rend_pubkey, + &hs_ntor_rend_cell_keys); + if (retval < 0) { + goto done; + } + + /* Send AUTH_MAC */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.rend_cell_auth_mac, + sizeof(hs_ntor_rend_cell_keys.rend_cell_auth_mac)); + printf("%s\n", buf); + /* Send NTOR_KEY_SEED */ + base16_encode(buf, sizeof(buf), + (const char*)hs_ntor_rend_cell_keys.ntor_key_seed, + sizeof(hs_ntor_rend_cell_keys.ntor_key_seed)); + printf("%s\n", buf); + + done: + return 1; +} + +/** Perform a different part of the protocol depdning on the argv used. */ +int +main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "I need arguments. Read source for more info.\n"); + return 1; + } + + curve25519_init(); + if (!strcmp(argv[1], "client1")) { + return client1(argc, argv); + } else if (!strcmp(argv[1], "server1")) { + return server1(argc, argv); + } else if (!strcmp(argv[1], "client2")) { + return client2(argc, argv); + } else { + fprintf(stderr, "What's a %s?\n", argv[1]); + return 1; + } +} + diff --git a/src/test/test_hs_service.c b/src/test/test_hs_service.c index 039d727cea..fcfb3b992d 100644 --- a/src/test/test_hs_service.c +++ b/src/test/test_hs_service.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** @@ -6,6 +6,7 @@ * \brief Test hidden service functionality. */ +#define HS_COMMON_PRIVATE #define HS_SERVICE_PRIVATE #define HS_INTROPOINT_PRIVATE @@ -14,9 +15,12 @@ #include "crypto.h" #include "hs/cell_establish_intro.h" +#include "hs_common.h" #include "hs_service.h" #include "hs_intropoint.h" +#include "hs_ntor.h" + /** We simulate the creation of an outgoing ESTABLISH_INTRO cell, and then we * parse it from the receiver side. */ static void @@ -26,8 +30,8 @@ test_gen_establish_intro_cell(void *arg) ssize_t retval; uint8_t circuit_key_material[DIGEST_LEN] = {0}; uint8_t buf[RELAY_PAYLOAD_SIZE]; - hs_cell_establish_intro_t *cell_out = NULL; - hs_cell_establish_intro_t *cell_in = NULL; + trn_cell_establish_intro_t *cell_out = NULL; + trn_cell_establish_intro_t *cell_in = NULL; crypto_rand((char *) circuit_key_material, sizeof(circuit_key_material)); @@ -44,7 +48,7 @@ test_gen_establish_intro_cell(void *arg) /* Parse it as the receiver */ { - ssize_t parse_result = hs_cell_establish_intro_parse(&cell_in, + ssize_t parse_result = trn_cell_establish_intro_parse(&cell_in, buf, sizeof(buf)); tt_int_op(parse_result, >=, 0); @@ -55,8 +59,8 @@ test_gen_establish_intro_cell(void *arg) } done: - hs_cell_establish_intro_free(cell_out); - hs_cell_establish_intro_free(cell_in); + trn_cell_establish_intro_free(cell_out); + trn_cell_establish_intro_free(cell_in); } /* Mocked ed25519_sign_prefixed() function that always fails :) */ @@ -78,7 +82,7 @@ static void test_gen_establish_intro_cell_bad(void *arg) { (void) arg; - hs_cell_establish_intro_t *cell = NULL; + trn_cell_establish_intro_t *cell = NULL; uint8_t circuit_key_material[DIGEST_LEN] = {0}; MOCK(ed25519_sign_prefixed, mock_ed25519_sign_prefixed); @@ -96,15 +100,150 @@ test_gen_establish_intro_cell_bad(void *arg) tt_assert(!cell); done: - hs_cell_establish_intro_free(cell); + trn_cell_establish_intro_free(cell); UNMOCK(ed25519_sign_prefixed); } +/** Test the HS ntor handshake. Simulate the sending of an encrypted INTRODUCE1 + * cell, and verify the proper derivation of decryption keys on the other end. + * Then simulate the sending of an authenticated RENDEZVOUS1 cell and verify + * the proper verification on the other end. */ +static void +test_hs_ntor(void *arg) +{ + int retval; + + uint8_t subcredential[DIGEST256_LEN]; + + ed25519_keypair_t service_intro_auth_keypair; + curve25519_keypair_t service_intro_enc_keypair; + curve25519_keypair_t service_ephemeral_rend_keypair; + + curve25519_keypair_t client_ephemeral_enc_keypair; + + hs_ntor_intro_cell_keys_t client_hs_ntor_intro_cell_keys; + hs_ntor_intro_cell_keys_t service_hs_ntor_intro_cell_keys; + + hs_ntor_rend_cell_keys_t service_hs_ntor_rend_cell_keys; + hs_ntor_rend_cell_keys_t client_hs_ntor_rend_cell_keys; + + (void) arg; + + /* Generate fake data for this unittest */ + { + /* Generate fake subcredential */ + memset(subcredential, 'Z', DIGEST256_LEN); + + /* service */ + curve25519_keypair_generate(&service_intro_enc_keypair, 0); + ed25519_keypair_generate(&service_intro_auth_keypair, 0); + curve25519_keypair_generate(&service_ephemeral_rend_keypair, 0); + /* client */ + curve25519_keypair_generate(&client_ephemeral_enc_keypair, 0); + } + + /* Client: Simulate the sending of an encrypted INTRODUCE1 cell */ + retval = + hs_ntor_client_get_introduce1_keys(&service_intro_auth_keypair.pubkey, + &service_intro_enc_keypair.pubkey, + &client_ephemeral_enc_keypair, + subcredential, + &client_hs_ntor_intro_cell_keys); + tt_int_op(retval, ==, 0); + + /* Service: Simulate the decryption of the received INTRODUCE1 */ + retval = + hs_ntor_service_get_introduce1_keys(&service_intro_auth_keypair.pubkey, + &service_intro_enc_keypair, + &client_ephemeral_enc_keypair.pubkey, + subcredential, + &service_hs_ntor_intro_cell_keys); + tt_int_op(retval, ==, 0); + + /* Test that the INTRODUCE1 encryption/mac keys match! */ + tt_mem_op(client_hs_ntor_intro_cell_keys.enc_key, OP_EQ, + service_hs_ntor_intro_cell_keys.enc_key, + CIPHER256_KEY_LEN); + tt_mem_op(client_hs_ntor_intro_cell_keys.mac_key, OP_EQ, + service_hs_ntor_intro_cell_keys.mac_key, + DIGEST256_LEN); + + /* Service: Simulate creation of RENDEZVOUS1 key material. */ + retval = + hs_ntor_service_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, + &service_intro_enc_keypair, + &service_ephemeral_rend_keypair, + &client_ephemeral_enc_keypair.pubkey, + &service_hs_ntor_rend_cell_keys); + tt_int_op(retval, ==, 0); + + /* Client: Simulate the verification of a received RENDEZVOUS1 cell */ + retval = + hs_ntor_client_get_rendezvous1_keys(&service_intro_auth_keypair.pubkey, + &client_ephemeral_enc_keypair, + &service_intro_enc_keypair.pubkey, + &service_ephemeral_rend_keypair.pubkey, + &client_hs_ntor_rend_cell_keys); + tt_int_op(retval, ==, 0); + + /* Test that the RENDEZVOUS1 key material match! */ + tt_mem_op(client_hs_ntor_rend_cell_keys.rend_cell_auth_mac, OP_EQ, + service_hs_ntor_rend_cell_keys.rend_cell_auth_mac, + DIGEST256_LEN); + tt_mem_op(client_hs_ntor_rend_cell_keys.ntor_key_seed, OP_EQ, + service_hs_ntor_rend_cell_keys.ntor_key_seed, + DIGEST256_LEN); + + done: + ; +} + +/** Test that our HS time period calculation functions work properly */ +static void +test_time_period(void *arg) +{ + (void) arg; + uint64_t tn; + int retval; + time_t fake_time; + + /* Let's do the example in prop224 section [TIME-PERIODS] */ + retval = parse_rfc1123_time("Wed, 13 Apr 2016 11:00:00 UTC", + &fake_time); + tt_int_op(retval, ==, 0); + + /* Check that the time period number is right */ + tn = get_time_period_num(fake_time); + tt_u64_op(tn, ==, 16903); + + /* Increase current time to 11:59:59 UTC and check that the time period + number is still the same */ + fake_time += 3599; + tn = get_time_period_num(fake_time); + tt_u64_op(tn, ==, 16903); + + /* Now take time to 12:00:00 UTC and check that the time period rotated */ + fake_time += 1; + tn = get_time_period_num(fake_time); + tt_u64_op(tn, ==, 16904); + + /* Now also check our hs_get_next_time_period_num() function */ + tn = hs_get_next_time_period_num(fake_time); + tt_u64_op(tn, ==, 16905); + + done: + ; +} + struct testcase_t hs_service_tests[] = { { "gen_establish_intro_cell", test_gen_establish_intro_cell, TT_FORK, NULL, NULL }, { "gen_establish_intro_cell_bad", test_gen_establish_intro_cell_bad, TT_FORK, NULL, NULL }, + { "hs_ntor", test_hs_ntor, TT_FORK, + NULL, NULL }, + { "time_period", test_time_period, TT_FORK, + NULL, NULL }, END_OF_TESTCASES }; diff --git a/src/test/test_introduce.c b/src/test/test_introduce.c index 810b03c93d..cfb8d83b1d 100644 --- a/src/test/test_introduce.c +++ b/src/test/test_introduce.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_keypin.c b/src/test/test_keypin.c index 95657349c6..d2ec8e9ca7 100644 --- a/src/test/test_keypin.c +++ b/src/test/test_keypin.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_link_handshake.c b/src/test/test_link_handshake.c index 421f3aaedf..217088ee37 100644 --- a/src/test/test_link_handshake.c +++ b/src/test/test_link_handshake.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -10,13 +10,6 @@ #include "compat.h" -/* Some versions of OpenSSL declare SSL_get_selected_srtp_profile twice in - * srtp.h. Suppress the GCC warning so we can build with -Wredundant-decl. */ -DISABLE_GCC_WARNING(redundant-decls) -#include <openssl/x509.h> -#include <openssl/ssl.h> -ENABLE_GCC_WARNING(redundant-decls) - #include "or.h" #include "config.h" #include "connection.h" @@ -785,19 +778,14 @@ CERTS_FAIL(expired_rsa_id, /* both */ certs_cell_cert_t *cert = certs_cell_get_certs(d->ccell, 1); const tor_x509_cert_t *idc; tor_tls_get_my_certs(1, NULL, &idc); - X509 *newc = X509_dup(idc->cert); + tor_x509_cert_t *newc; time_t new_end = time(NULL) - 86400 * 10; - X509_time_adj(X509_get_notAfter(newc), 0, &new_end); - EVP_PKEY *pk = crypto_pk_get_evp_pkey_(d->key2, 1); - tt_assert(X509_sign(newc, pk, EVP_sha1())); - int len = i2d_X509(newc, NULL); - certs_cell_cert_setlen_body(cert, len); - uint8_t *body = certs_cell_cert_getarray_body(cert); - int len2 = i2d_X509(newc, &body); - tt_int_op(len, ==, len2); + newc = tor_x509_cert_replace_expiration(idc, new_end, d->key2); + certs_cell_cert_setlen_body(cert, newc->encoded_len); + memcpy(certs_cell_cert_getarray_body(cert), + newc->encoded, newc->encoded_len); REENCODE(); - X509_free(newc); - EVP_PKEY_free(pk); + tor_x509_cert_free(newc); }) CERTS_FAIL(expired_ed_id, /* ed25519 */ { diff --git a/src/test/test_logging.c b/src/test/test_logging.c index 15471e46d0..94b3e4ea68 100644 --- a/src/test/test_logging.c +++ b/src/test/test_logging.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_microdesc.c b/src/test/test_microdesc.c index 2ae605b8db..c78fda3b69 100644 --- a/src/test/test_microdesc.c +++ b/src/test/test_microdesc.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -14,12 +14,6 @@ #include "test.h" -DISABLE_GCC_WARNING(redundant-decls) -#include <openssl/rsa.h> -#include <openssl/bn.h> -#include <openssl/pem.h> -ENABLE_GCC_WARNING(redundant-decls) - #ifdef _WIN32 /* For mkdir() */ #include <direct.h> diff --git a/src/test/test_nodelist.c b/src/test/test_nodelist.c index d58f8a7fca..256354415c 100644 --- a/src/test/test_nodelist.c +++ b/src/test/test_nodelist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2016, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/test/test_ntor_cl.c b/src/test/test_ntor_cl.c index a560e5fc5e..d0eea85d6f 100644 --- a/src/test/test_ntor_cl.c +++ b/src/test/test_ntor_cl.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_oom.c b/src/test/test_oom.c index 0f97972032..f03a504d1d 100644 --- a/src/test/test_oom.c +++ b/src/test/test_oom.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Unit tests for OOM handling logic */ diff --git a/src/test/test_oos.c b/src/test/test_oos.c index db06625116..9fd6bce5ae 100644 --- a/src/test/test_oos.c +++ b/src/test/test_oos.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Unit tests for OOS handler */ diff --git a/src/test/test_options.c b/src/test/test_options.c index ecf311d217..e2fc034cc3 100644 --- a/src/test/test_options.c +++ b/src/test/test_options.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define CONFIG_PRIVATE @@ -105,11 +105,71 @@ clear_log_messages(void) "EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212:80 7EA6 EAD6 FD83" \ " 083C 538F 4403 8BBF A077 587D D755\n" +static int +test_options_checklog(const char *configuration, int expect_log_severity, + const char *expect_log) +{ + int found = 0, ret = -1; + char *actual_log = NULL; + + if (messages) { + SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, m) { + if (m->severity == expect_log_severity && + strstr(m->msg, expect_log)) { + found = 1; + break; + } + } SMARTLIST_FOREACH_END(m); + } + if (!found) { + actual_log = dump_logs(); + TT_DIE(("Expected log message [%s] %s from <%s>, but got <%s>.", + log_level_to_string(expect_log_severity), expect_log, + configuration, actual_log)); + } + ret = 0; + + done: + tor_free(actual_log); + return ret; +} + +static int +test_options_checkmsgs(const char *configuration, + const char *expect_errmsg, + int expect_log_severity, + const char *expect_log, + char *msg) +{ + if (expect_errmsg && !msg) { + TT_DIE(("Expected error message <%s> from <%s>, but got none.", + expect_errmsg, configuration)); + } else if (expect_errmsg && !strstr(msg, expect_errmsg)) { + TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", + expect_errmsg, configuration, msg)); + } else if (!expect_errmsg && msg) { + TT_DIE(("Expected no error message from <%s> but got <%s>.", + configuration, msg)); + } + if (expect_log) { + return test_options_checklog(configuration, expect_log_severity, + expect_log); + } + return 0; + + done: + return -1; +} + +/* Which phases of config parsing/validation to check for messages/logs */ +enum { PH_GETLINES, PH_ASSIGN, PH_VALIDATE }; + static void test_options_validate_impl(const char *configuration, const char *expect_errmsg, int expect_log_severity, - const char *expect_log) + const char *expect_log, + int phase) { or_options_t *opt=NULL; or_options_t *dflt; @@ -120,43 +180,33 @@ test_options_validate_impl(const char *configuration, setup_options(opt, dflt); r = config_get_lines(configuration, &cl, 1); - tt_int_op(r, OP_EQ, 0); + if (phase == PH_GETLINES) { + if (test_options_checkmsgs(configuration, expect_errmsg, + expect_log_severity, + expect_log, msg)) + goto done; + } + tt_int_op((r == 0), OP_EQ, (msg == NULL)); r = config_assign(&options_format, opt, cl, 0, &msg); - tt_int_op(r, OP_EQ, 0); - - r = options_validate(NULL, opt, dflt, 0, &msg); - if (expect_errmsg && !msg) { - TT_DIE(("Expected error message <%s> from <%s>, but got none.", - expect_errmsg, configuration)); - } else if (expect_errmsg && !strstr(msg, expect_errmsg)) { - TT_DIE(("Expected error message <%s> from <%s>, but got <%s>.", - expect_errmsg, configuration, msg)); - } else if (!expect_errmsg && msg) { - TT_DIE(("Expected no error message from <%s> but got <%s>.", - configuration, msg)); + if (phase == PH_ASSIGN) { + if (test_options_checkmsgs(configuration, expect_errmsg, + expect_log_severity, + expect_log, msg)) + goto done; } tt_int_op((r == 0), OP_EQ, (msg == NULL)); + if (r) + goto done; - if (expect_log) { - int found = 0; - if (messages) { - SMARTLIST_FOREACH_BEGIN(messages, logmsg_t *, m) { - if (m->severity == expect_log_severity && - strstr(m->msg, expect_log)) { - found = 1; - break; - } - } SMARTLIST_FOREACH_END(m); - } - if (!found) { - tor_free(msg); - msg = dump_logs(); - TT_DIE(("Expected log message [%s] %s from <%s>, but got <%s>.", - log_level_to_string(expect_log_severity), expect_log, - configuration, msg)); - } + r = options_validate(NULL, opt, dflt, 0, &msg); + if (phase == PH_VALIDATE) { + if (test_options_checkmsgs(configuration, expect_errmsg, + expect_log_severity, + expect_log, msg)) + goto done; } + tt_int_op((r == 0), OP_EQ, (msg == NULL)); done: escaped(NULL); @@ -168,14 +218,14 @@ test_options_validate_impl(const char *configuration, clear_log_messages(); } -#define WANT_ERR(config, msg) \ - test_options_validate_impl((config), (msg), 0, NULL) -#define WANT_LOG(config, severity, msg) \ - test_options_validate_impl((config), NULL, (severity), (msg)) -#define WANT_ERR_LOG(config, msg, severity, logmsg) \ - test_options_validate_impl((config), (msg), (severity), (logmsg)) -#define OK(config) \ - test_options_validate_impl((config), NULL, 0, NULL) +#define WANT_ERR(config, msg, ph) \ + test_options_validate_impl((config), (msg), 0, NULL, (ph)) +#define WANT_LOG(config, severity, msg, ph) \ + test_options_validate_impl((config), NULL, (severity), (msg), (ph)) +#define WANT_ERR_LOG(config, msg, severity, logmsg, ph) \ + test_options_validate_impl((config), (msg), (severity), (logmsg), (ph)) +#define OK(config, ph) \ + test_options_validate_impl((config), NULL, 0, NULL, (ph)) static void test_options_validate(void *arg) @@ -184,21 +234,32 @@ test_options_validate(void *arg) setup_log_callback(); sandbox_disable_getaddrinfo_cache(); - WANT_ERR("ExtORPort 500000", "Invalid ExtORPort"); + WANT_ERR("ExtORPort 500000", "Invalid ExtORPort", PH_VALIDATE); WANT_ERR_LOG("ServerTransportOptions trebuchet", "ServerTransportOptions did not parse", - LOG_WARN, "Too few arguments"); - OK("ServerTransportOptions trebuchet sling=snappy"); - OK("ServerTransportOptions trebuchet sling="); + LOG_WARN, "Too few arguments", PH_VALIDATE); + OK("ServerTransportOptions trebuchet sling=snappy", PH_VALIDATE); + OK("ServerTransportOptions trebuchet sling=", PH_VALIDATE); WANT_ERR_LOG("ServerTransportOptions trebuchet slingsnappy", "ServerTransportOptions did not parse", - LOG_WARN, "\"slingsnappy\" is not a k=v"); + LOG_WARN, "\"slingsnappy\" is not a k=v", PH_VALIDATE); WANT_ERR("DirPort 8080\nDirCache 0", - "DirPort configured but DirCache disabled."); + "DirPort configured but DirCache disabled.", PH_VALIDATE); WANT_ERR("BridgeRelay 1\nDirCache 0", - "We're a bridge but DirCache is disabled."); + "We're a bridge but DirCache is disabled.", PH_VALIDATE); + + WANT_ERR_LOG("HeartbeatPeriod 21 snarks", + "Interval 'HeartbeatPeriod 21 snarks' is malformed or" + " out of bounds.", LOG_WARN, "Unknown unit 'snarks'.", + PH_ASSIGN); + WANT_ERR_LOG("LogTimeGranularity 21 snarks", + "Msec interval 'LogTimeGranularity 21 snarks' is malformed or" + " out of bounds.", LOG_WARN, "Unknown unit 'snarks'.", + PH_ASSIGN); + OK("HeartbeatPeriod 1 hour", PH_VALIDATE); + OK("LogTimeGranularity 100 milliseconds", PH_VALIDATE); close_temp_logs(); clear_log_messages(); diff --git a/src/test/test_policy.c b/src/test/test_policy.c index e86d0f0274..1b2fac4325 100644 --- a/src/test/test_policy.c +++ b/src/test/test_policy.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2013-2016, The Tor Project, Inc. */ +/* Copyright (c) 2013-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_procmon.c b/src/test/test_procmon.c index 9e63fc006d..5c52af8693 100644 --- a/src/test/test_procmon.c +++ b/src/test/test_procmon.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define PROCMON_PRIVATE diff --git a/src/test/test_protover.c b/src/test/test_protover.c index f00955d1b4..5626816024 100644 --- a/src/test/test_protover.c +++ b/src/test/test_protover.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define PROTOVER_PRIVATE diff --git a/src/test/test_pt.c b/src/test/test_pt.c index f93019f1c4..79b03171bc 100644 --- a/src/test/test_pt.c +++ b/src/test/test_pt.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -284,13 +284,13 @@ test_pt_get_extrainfo_string(void *arg) } #ifdef _WIN32 -#define STDIN_HANDLE HANDLE +#define STDIN_HANDLE HANDLE* #else -#define STDIN_HANDLE FILE +#define STDIN_HANDLE int #endif static smartlist_t * -tor_get_lines_from_handle_replacement(STDIN_HANDLE *handle, +tor_get_lines_from_handle_replacement(STDIN_HANDLE handle, enum stream_status *stream_status_out) { static int times_called = 0; diff --git a/src/test/test_pubsub.c b/src/test/test_pubsub.c index 547d6c6b32..2f047d9f2c 100644 --- a/src/test/test_pubsub.c +++ b/src/test/test_pubsub.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2016, The Tor Project, Inc. */ +/* Copyright (c) 2016-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/test/test_relay.c b/src/test/test_relay.c index 4713c79ea5..238d4c5baf 100644 --- a/src/test/test_relay.c +++ b/src/test/test_relay.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_relaycell.c b/src/test/test_relaycell.c index fb6748965a..eea1f5dc80 100644 --- a/src/test/test_relaycell.c +++ b/src/test/test_relaycell.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /* Unit tests for handling different kinds of relay cell */ diff --git a/src/test/test_rendcache.c b/src/test/test_rendcache.c index 0d53c78817..feba8f664e 100644 --- a/src/test/test_rendcache.c +++ b/src/test/test_rendcache.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -11,7 +11,6 @@ #include "routerlist.h" #include "config.h" #include "hs_common.h" -#include <openssl/rsa.h> #include "rend_test_helpers.h" #include "log_test_helpers.h" diff --git a/src/test/test_replay.c b/src/test/test_replay.c index e882bc6164..80e7203716 100644 --- a/src/test/test_replay.c +++ b/src/test/test_replay.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2012-2016, The Tor Project, Inc. */ +/* Copyright (c) 2012-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define REPLAYCACHE_PRIVATE diff --git a/src/test/test_routerkeys.c b/src/test/test_routerkeys.c index 64692d28a0..263923f50f 100644 --- a/src/test/test_routerkeys.c +++ b/src/test/test_routerkeys.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_routerlist.c b/src/test/test_routerlist.c index 78f1cf16b7..0b4b6c5c44 100644 --- a/src/test/test_routerlist.c +++ b/src/test/test_routerlist.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_scheduler.c b/src/test/test_scheduler.c index 05ea8e86e8..4c536b0905 100644 --- a/src/test/test_scheduler.c +++ b/src/test/test_scheduler.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2014-2016, The Tor Project, Inc. */ +/* Copyright (c) 2014-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_slow.c b/src/test/test_slow.c index 7c9f0b1cc2..e640702499 100644 --- a/src/test/test_slow.c +++ b/src/test/test_slow.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ /** diff --git a/src/test/test_socks.c b/src/test/test_socks.c index 62ff12fe15..bb1be11f2b 100644 --- a/src/test/test_socks.c +++ b/src/test/test_socks.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_storagedir.c b/src/test/test_storagedir.c new file mode 100644 index 0000000000..19e5de4ea3 --- /dev/null +++ b/src/test/test_storagedir.c @@ -0,0 +1,375 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "or.h" +#include "storagedir.h" +#include "test.h" + +#ifdef HAVE_UTIME_H +#include <utime.h> +#endif + +static void +test_storagedir_empty(void *arg) +{ + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + (void)arg; + + tt_int_op(FN_NOENT, OP_EQ, file_status(dirname)); + + d = storage_dir_new(dirname, 10); + tt_assert(d); + + tt_int_op(FN_DIR, OP_EQ, file_status(dirname)); + + tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + storage_dir_free(d); + d = storage_dir_new(dirname, 10); + tt_assert(d); + + tt_int_op(FN_DIR, OP_EQ, file_status(dirname)); + + tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + done: + storage_dir_free(d); + tor_free(dirname); +} + +static void +test_storagedir_basic(void *arg) +{ + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + uint8_t *junk = NULL, *bytes = NULL; + const size_t junklen = 1024; + char *fname1 = NULL, *fname2 = NULL; + const char hello_str[] = "then what are we but cold, alone ... ?"; + tor_mmap_t *mapping = NULL; + (void)arg; + + junk = tor_malloc(junklen); + crypto_rand((void*)junk, junklen); + + d = storage_dir_new(dirname, 10); + tt_assert(d); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + int r; + r = storage_dir_save_string_to_file(d, hello_str, 1, &fname1); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(fname1, OP_NE, NULL); + tt_u64_op(strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); + + r = storage_dir_save_bytes_to_file(d, junk, junklen, 1, &fname2); + tt_int_op(r, OP_EQ, 0); + tt_ptr_op(fname2, OP_NE, NULL); + + tt_str_op(fname1, OP_NE, fname2); + + tt_int_op(2, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(junklen + strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname1)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname2)); + + storage_dir_free(d); + d = storage_dir_new(dirname, 10); + tt_assert(d); + tt_int_op(2, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(junklen + strlen(hello_str), OP_EQ, storage_dir_get_usage(d)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname1)); + tt_assert(smartlist_contains_string(storage_dir_list(d), fname2)); + + size_t n; + bytes = storage_dir_read(d, fname2, 1, &n); + tt_assert(bytes); + tt_u64_op(n, OP_EQ, junklen); + tt_mem_op(bytes, OP_EQ, junk, junklen); + + mapping = storage_dir_map(d, fname1); + tt_assert(mapping); + tt_u64_op(mapping->size, OP_EQ, strlen(hello_str)); + tt_mem_op(mapping->data, OP_EQ, hello_str, strlen(hello_str)); + + done: + tor_free(dirname); + tor_free(junk); + tor_free(bytes); + tor_munmap_file(mapping); + storage_dir_free(d); + tor_free(fname1); + tor_free(fname2); +} + +static void +test_storagedir_deletion(void *arg) +{ + (void)arg; + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + char *fn1 = NULL, *fn2 = NULL; + char *bytes = NULL; + int r; + const char str1[] = "There are nine and sixty ways to disguise communiques"; + const char str2[] = "And rather more than one of them is right"; + + // Make sure the directory is there. */ + d = storage_dir_new(dirname, 10); + storage_dir_free(d); + d = NULL; + + tor_asprintf(&fn1, "%s/1007", dirname); + r = write_str_to_file(fn1, str1, 0); + tt_int_op(r, OP_EQ, 0); + + tor_asprintf(&fn2, "%s/1003.tmp", dirname); + r = write_str_to_file(fn2, str2, 0); + tt_int_op(r, OP_EQ, 0); + + // The tempfile should be deleted the next time we list the directory. + d = storage_dir_new(dirname, 10); + tt_int_op(1, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(strlen(str1), OP_EQ, storage_dir_get_usage(d)); + tt_int_op(FN_FILE, OP_EQ, file_status(fn1)); + tt_int_op(FN_NOENT, OP_EQ, file_status(fn2)); + + bytes = (char*) storage_dir_read(d, "1007", 1, NULL); + tt_str_op(bytes, OP_EQ, str1); + + // Should have no effect; file already gone. + storage_dir_remove_file(d, "1003.tmp"); + tt_int_op(1, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(strlen(str1), OP_EQ, storage_dir_get_usage(d)); + + // Actually remove a file. + storage_dir_remove_file(d, "1007"); + tt_int_op(FN_NOENT, OP_EQ, file_status(fn1)); + tt_int_op(0, OP_EQ, smartlist_len(storage_dir_list(d))); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + done: + tor_free(dirname); + tor_free(fn1); + tor_free(fn2); + storage_dir_free(d); + tor_free(bytes); +} + +static void +test_storagedir_full(void *arg) +{ + (void)arg; + + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + const char str[] = "enemies of the peephole"; + int r; + + d = storage_dir_new(dirname, 3); + tt_assert(d); + + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, 0); + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, 0); + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, 0); + + // These should fail! + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, -1); + r = storage_dir_save_string_to_file(d, str, 1, NULL); + tt_int_op(r, OP_EQ, -1); + + tt_u64_op(strlen(str) * 3, OP_EQ, storage_dir_get_usage(d)); + + done: + tor_free(dirname); + storage_dir_free(d); +} + +static void +test_storagedir_cleaning(void *arg) +{ + (void)arg; + + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + const char str[] = + "On a mountain halfway between Reno and Rome / " + "We have a machine in a plexiglass dome / " + "Which listens and looks into everyone's home." + " -- Dr. Seuss"; + char *fns[8]; + int r, i; + + memset(fns, 0, sizeof(fns)); + d = storage_dir_new(dirname, 10); + tt_assert(d); + + for (i = 0; i < 8; ++i) { + r = storage_dir_save_string_to_file(d, str+i*2, 1, &fns[i]); + tt_int_op(r, OP_EQ, 0); + } + + /* Now we're going to make sure all the files have distinct mtimes. */ + time_t now = time(NULL); + struct utimbuf ub; + ub.actime = now; + ub.modtime = now - 1000; + for (i = 0; i < 8; ++i) { + char *f = NULL; + tor_asprintf(&f, "%s/%s", dirname, fns[i]); + r = utime(f, &ub); + tor_free(f); + tt_int_op(r, OP_EQ, 0); + ub.modtime += 5; + } + + const uint64_t usage_orig = storage_dir_get_usage(d); + /* No changes needed if we are already under target. */ + storage_dir_shrink(d, 1024*1024, 0); + tt_u64_op(usage_orig, OP_EQ, storage_dir_get_usage(d)); + + /* Get rid of at least one byte. This will delete fns[0]. */ + storage_dir_shrink(d, usage_orig - 1, 0); + tt_u64_op(usage_orig, OP_GT, storage_dir_get_usage(d)); + tt_u64_op(usage_orig - strlen(str), OP_EQ, storage_dir_get_usage(d)); + + /* Get rid of at least two files. This will delete fns[1] and fns[2]. */ + storage_dir_shrink(d, 1024*1024, 2); + tt_u64_op(usage_orig - strlen(str)*3 + 6, OP_EQ, storage_dir_get_usage(d)); + + /* Get rid of everything. */ + storage_dir_remove_all(d); + tt_u64_op(0, OP_EQ, storage_dir_get_usage(d)); + + done: + tor_free(dirname); + storage_dir_free(d); + for (i = 0; i < 8; ++i) { + tor_free(fns[i]); + } +} + +static void +test_storagedir_save_labeled(void *arg) +{ + (void)arg; + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + uint8_t *inp = tor_malloc_zero(8192); + config_line_t *labels = NULL; + char *fname = NULL; + uint8_t *saved = NULL; + + d = storage_dir_new(dirname, 10); + tt_assert(d); + + crypto_rand((char *)inp, 8192); + + config_line_append(&labels, "Foo", "bar baz"); + config_line_append(&labels, "quux", "quuzXxz"); + const char expected[] = + "Foo bar baz\n" + "quux quuzXxz\n"; + + int r = storage_dir_save_labeled_to_file(d, labels, inp, 8192, &fname); + tt_int_op(r, OP_EQ, 0); + + size_t n; + saved = storage_dir_read(d, fname, 1, &n); + tt_assert(memchr(saved, '\0', n)); + tt_str_op((char*)saved, OP_EQ, expected); /* NUL guarantees strcmp works */ + tt_mem_op(saved+strlen(expected)+1, OP_EQ, inp, 8192); + + done: + storage_dir_free(d); + tor_free(dirname); + tor_free(inp); + tor_free(fname); + config_free_lines(labels); + tor_free(saved); +} + +static void +test_storagedir_read_labeled(void *arg) +{ + (void)arg; + char *dirname = tor_strdup(get_fname_rnd("store_dir")); + storage_dir_t *d = NULL; + uint8_t *inp = tor_malloc_zero(8192); + config_line_t *labels = NULL, *labels2 = NULL; + char *fname = NULL; + tor_mmap_t *map = NULL; + uint8_t *as_read = NULL; + + d = storage_dir_new(dirname, 10); + tt_assert(d); + + tor_snprintf((char*)inp, 8192, + "Hello world\n" + "This is a test\n" + "Yadda yadda.\n"); + size_t bodylen = 8192 - strlen((char*)inp) - 1; + crypto_rand((char *)inp+strlen((char*)inp)+1, bodylen); + + int r = storage_dir_save_bytes_to_file(d, inp, 8192, 1, &fname); + tt_int_op(r, OP_EQ, 0); + + /* Try mapping */ + const uint8_t *datap = NULL; + size_t sz = 0; + map = storage_dir_map_labeled(d, fname, &labels, &datap, &sz); + tt_assert(map); + tt_assert(datap); + tt_u64_op(sz, OP_EQ, bodylen); + tt_mem_op(datap, OP_EQ, inp+strlen((char*)inp)+1, bodylen); + tt_assert(labels); + tt_str_op(labels->key, OP_EQ, "Hello"); + tt_str_op(labels->value, OP_EQ, "world"); + tt_assert(labels->next); + tt_str_op(labels->next->key, OP_EQ, "This"); + tt_str_op(labels->next->value, OP_EQ, "is a test"); + tt_assert(labels->next->next); + tt_str_op(labels->next->next->key, OP_EQ, "Yadda"); + tt_str_op(labels->next->next->value, OP_EQ, "yadda."); + tt_assert(labels->next->next->next == NULL); + + /* Try reading this time. */ + sz = 0; + as_read = storage_dir_read_labeled(d, fname, &labels2, &sz); + tt_assert(as_read); + tt_u64_op(sz, OP_EQ, bodylen); + tt_mem_op(as_read, OP_EQ, inp+strlen((char*)inp)+1, bodylen); + tt_assert(config_lines_eq(labels, labels2)); + + done: + storage_dir_free(d); + tor_free(dirname); + tor_free(inp); + tor_free(fname); + config_free_lines(labels); + config_free_lines(labels2); + tor_munmap_file(map); + tor_free(as_read); +} + +#define ENT(name) \ + { #name, test_storagedir_ ## name, TT_FORK, NULL, NULL } + +struct testcase_t storagedir_tests[] = { + ENT(empty), + ENT(basic), + ENT(deletion), + ENT(full), + ENT(cleaning), + ENT(save_labeled), + ENT(read_labeled), + END_OF_TESTCASES +}; + diff --git a/src/test/test_switch_id.c b/src/test/test_switch_id.c index 322f5bdc7a..44e02e87b3 100644 --- a/src/test/test_switch_id.c +++ b/src/test/test_switch_id.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2015-2016, The Tor Project, Inc. */ +/* Copyright (c) 2015-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/test_threads.c b/src/test/test_threads.c index ebbc95c7ca..18a9407ff7 100644 --- a/src/test/test_threads.c +++ b/src/test/test_threads.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/test/test_tortls.c b/src/test/test_tortls.c index 4bfcea211d..7aa3051464 100644 --- a/src/test/test_tortls.c +++ b/src/test/test_tortls.c @@ -1,7 +1,8 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define TORTLS_PRIVATE +#define TORTLS_OPENSSL_PRIVATE #define LOG_PRIVATE #include "orconfig.h" diff --git a/src/test/test_util.c b/src/test/test_util.c index e80201737a..b3f8ecdf51 100644 --- a/src/test/test_util.c +++ b/src/test/test_util.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -2242,114 +2242,160 @@ test_util_pow2(void *arg) ; } -/** Run unit tests for compression functions */ static void -test_util_gzip(void *arg) +test_util_compress_impl(compress_method_t method) { - char *buf1=NULL, *buf2=NULL, *buf3=NULL, *cp1, *cp2; - const char *ccp2; + char *buf1=NULL, *buf2=NULL, *buf3=NULL; size_t len1, len2; - tor_zlib_state_t *state = NULL; - (void)arg; + tt_assert(tor_compress_supports_method(method)); + buf1 = tor_strdup("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ"); tt_assert(detect_compression_method(buf1, strlen(buf1)) == UNKNOWN_METHOD); - tt_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, - GZIP_METHOD)); - tt_assert(buf2); - tt_assert(len1 < strlen(buf1)); - tt_assert(detect_compression_method(buf2, len1) == GZIP_METHOD); - - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, - GZIP_METHOD, 1, LOG_INFO)); - tt_assert(buf3); - tt_int_op(strlen(buf1) + 1,OP_EQ, len2); - tt_str_op(buf1,OP_EQ, buf3); - - tor_free(buf2); - tor_free(buf3); - - tt_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, - ZLIB_METHOD)); - tt_assert(buf2); - tt_assert(detect_compression_method(buf2, len1) == ZLIB_METHOD); + tt_assert(!tor_compress(&buf2, &len1, buf1, strlen(buf1)+1, method)); + tt_assert(buf2 != NULL); + if (method == NO_METHOD) { + // The identity transform doesn't actually compress, and it isn't + // detectable as "the identity transform." + tt_int_op(len1, OP_EQ, strlen(buf1)+1); + tt_int_op(detect_compression_method(buf2, len1), OP_EQ, UNKNOWN_METHOD); + } else { + tt_int_op(len1, OP_LT, strlen(buf1)); + tt_int_op(detect_compression_method(buf2, len1), OP_EQ, method); + } - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1, - ZLIB_METHOD, 1, LOG_INFO)); - tt_assert(buf3); - tt_int_op(strlen(buf1) + 1,OP_EQ, len2); - tt_str_op(buf1,OP_EQ, buf3); + tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1, method, 1, LOG_INFO)); + tt_assert(buf3 != NULL); + tt_int_op(strlen(buf1) + 1, OP_EQ, len2); + tt_str_op(buf1, OP_EQ, buf3); + tt_int_op(buf3[len2], OP_EQ, 0); /* Check whether we can uncompress concatenated, compressed strings. */ tor_free(buf3); buf2 = tor_reallocarray(buf2, len1, 2); memcpy(buf2+len1, buf2, len1); - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1*2, - ZLIB_METHOD, 1, LOG_INFO)); - tt_int_op((strlen(buf1)+1)*2,OP_EQ, len2); - tt_mem_op(buf3,OP_EQ, + tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1*2, method, 1, LOG_INFO)); + tt_int_op((strlen(buf1)+1)*2, OP_EQ, len2); + tt_mem_op(buf3, OP_EQ, "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0" "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0", (strlen(buf1)+1)*2); + tt_int_op(buf3[len2], OP_EQ, 0); + + /* Check whether we can uncompress partial strings */ tor_free(buf1); tor_free(buf2); tor_free(buf3); - /* Check whether we can uncompress partial strings. */ - buf1 = - tor_strdup("String with low redundancy that won't be compressed much."); - tt_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1, - ZLIB_METHOD)); - tt_assert(len1>16); - /* when we allow an incomplete string, we should succeed.*/ - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1-16, - ZLIB_METHOD, 0, LOG_INFO)); - tt_assert(len2 > 5); - buf3[len2]='\0'; - tt_assert(!strcmpstart(buf1, buf3)); - - /* when we demand a complete string, this must fail. */ + size_t b1len = 1<<10; + if (method == ZSTD_METHOD) { + // zstd needs a big input before it starts generating output that it + // can partially decompress. + b1len = 1<<18; + } + buf1 = tor_malloc(b1len); + crypto_rand(buf1, b1len); + tt_assert(!tor_compress(&buf2, &len1, buf1, b1len, method)); + tt_int_op(len1, OP_GT, 16); + /* when we allow an incomplete output we should succeed.*/ + tt_assert(!tor_uncompress(&buf3, &len2, buf2, len1-16, + method, 0, LOG_INFO)); + tt_int_op(len2, OP_GT, 5); + tt_int_op(len2, OP_LE, len1); + tt_assert(fast_memeq(buf1, buf3, len2)); + tt_int_op(buf3[len2], OP_EQ, 0); + + /* when we demand a complete output from a real compression method, this + * must fail. */ tor_free(buf3); - tt_assert(tor_gzip_uncompress(&buf3, &len2, buf2, len1-16, - ZLIB_METHOD, 1, LOG_INFO)); - tt_assert(!buf3); + if (method != NO_METHOD) { + tt_assert(tor_uncompress(&buf3, &len2, buf2, len1-16, + method, 1, LOG_INFO)); + tt_assert(buf3 == NULL); + } - /* Now, try streaming compression. */ + done: tor_free(buf1); tor_free(buf2); tor_free(buf3); - state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION); +} + +static void +test_util_compress_stream_impl(compress_method_t method, + compression_level_t level) +{ + char *buf1=NULL, *buf2=NULL, *buf3=NULL, *cp1, *cp2; + const char *ccp2; + size_t len1, len2; + + tor_compress_state_t *state = NULL; + state = tor_compress_new(1, method, level); tt_assert(state); cp1 = buf1 = tor_malloc(1024); len1 = 1024; ccp2 = "ABCDEFGHIJABCDEFGHIJ"; len2 = 21; - tt_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 0) - == TOR_ZLIB_OK); - tt_int_op(0,OP_EQ, len2); /* Make sure we compressed it all. */ + tt_int_op(tor_compress_process(state, &cp1, &len1, &ccp2, &len2, 0), + OP_EQ, TOR_COMPRESS_OK); + tt_int_op(0, OP_EQ, len2); /* Make sure we compressed it all. */ tt_assert(cp1 > buf1); len2 = 0; cp2 = cp1; - tt_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 1) - == TOR_ZLIB_DONE); - tt_int_op(0,OP_EQ, len2); - tt_assert(cp1 > cp2); /* Make sure we really added something. */ + tt_int_op(tor_compress_process(state, &cp1, &len1, &ccp2, &len2, 1), + OP_EQ, TOR_COMPRESS_DONE); + tt_int_op(0, OP_EQ, len2); + if (method == NO_METHOD) { + tt_ptr_op(cp1, OP_EQ, cp2); + } else { + tt_assert(cp1 > cp2); /* Make sure we really added something. */ + } - tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf1, 1024-len1, - ZLIB_METHOD, 1, LOG_WARN)); + tt_assert(!tor_uncompress(&buf3, &len2, buf1, 1024-len1, + method, 1, LOG_WARN)); /* Make sure it compressed right. */ tt_str_op(buf3, OP_EQ, "ABCDEFGHIJABCDEFGHIJ"); - tt_int_op(21,OP_EQ, len2); + tt_int_op(21, OP_EQ, len2); done: if (state) - tor_zlib_free(state); + tor_compress_free(state); + tor_free(buf1); tor_free(buf2); tor_free(buf3); - tor_free(buf1); +} + +/** Run unit tests for compression functions */ +static void +test_util_compress(void *arg) +{ + const char *methodname = arg; + tt_assert(methodname); + + compress_method_t method = compression_method_get_by_name(methodname); + tt_int_op(method, OP_NE, UNKNOWN_METHOD); + + if (! tor_compress_supports_method(method)) { + tt_skip(); + } + + compression_level_t levels[] = { + BEST_COMPRESSION, + HIGH_COMPRESSION, + MEDIUM_COMPRESSION, + LOW_COMPRESSION + }; + + test_util_compress_impl(method); + + for (unsigned l = 0; l < ARRAY_LENGTH(levels); ++l) { + compression_level_t level = levels[l]; + test_util_compress_stream_impl(method, level); + } + done: + ; } static void @@ -2364,44 +2410,44 @@ test_util_gzip_compression_bomb(void *arg) char *one_mb = tor_malloc_zero(one_million); char *result = NULL; size_t result_len = 0; - tor_zlib_state_t *state = NULL; + tor_compress_state_t *state = NULL; /* Make sure we can't produce a compression bomb */ setup_full_capture_of_logs(LOG_WARN); - tt_int_op(-1, OP_EQ, tor_gzip_compress(&result, &result_len, - one_mb, one_million, - ZLIB_METHOD)); + tt_int_op(-1, OP_EQ, tor_compress(&result, &result_len, + one_mb, one_million, + ZLIB_METHOD)); expect_single_log_msg_containing( "We compressed something and got an insanely high " "compression factor; other Tors would think this " - "was a zlib bomb."); + "was a compression bomb."); teardown_capture_of_logs(); /* Here's a compression bomb that we made manually. */ const char compression_bomb[1039] = { 0x78, 0xDA, 0xED, 0xC1, 0x31, 0x01, 0x00, 0x00, 0x00, 0xC2, 0xA0, 0xF5, 0x4F, 0x6D, 0x08, 0x5F, 0xA0 /* .... */ }; - tt_int_op(-1, OP_EQ, tor_gzip_uncompress(&result, &result_len, - compression_bomb, 1039, - ZLIB_METHOD, 0, LOG_WARN)); + tt_int_op(-1, OP_EQ, tor_uncompress(&result, &result_len, + compression_bomb, 1039, + ZLIB_METHOD, 0, LOG_WARN)); /* Now try streaming that. */ - state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION); - tor_zlib_output_t r; + state = tor_compress_new(0, ZLIB_METHOD, HIGH_COMPRESSION); + tor_compress_output_t r; const char *inp = compression_bomb; size_t inlen = 1039; do { char *outp = one_mb; size_t outleft = 4096; /* small on purpose */ - r = tor_zlib_process(state, &outp, &outleft, &inp, &inlen, 0); + r = tor_compress_process(state, &outp, &outleft, &inp, &inlen, 0); tt_int_op(inlen, OP_NE, 0); - } while (r == TOR_ZLIB_BUF_FULL); + } while (r == TOR_COMPRESS_BUFFER_FULL); - tt_int_op(r, OP_EQ, TOR_ZLIB_ERR); + tt_int_op(r, OP_EQ, TOR_COMPRESS_ERROR); done: tor_free(one_mb); - tor_zlib_free(state); + tor_compress_free(state); } /** Run unit tests for mmap() wrapper functionality. */ @@ -3340,6 +3386,13 @@ test_util_memarea(void *arg) void *malloced_ptr = NULL; int i; +#ifdef DISABLE_MEMORY_SENTINELS + /* If memory sentinels are disabled, this whole module is just an alias for + malloc(), which is free to lay out memory most any way it wants. */ + if (1) + tt_skip(); +#endif + (void)arg; tt_assert(area); @@ -3933,17 +3986,13 @@ test_util_exit_status(void *ptr) #endif #ifndef _WIN32 -/* Check that fgets with a non-blocking pipe returns partial lines and sets - * EAGAIN, returns full lines and sets no error, and returns NULL on EOF and - * sets no error */ static void -test_util_fgets_eagain(void *ptr) +test_util_string_from_pipe(void *ptr) { int test_pipe[2] = {-1, -1}; - int retval; + int retval = 0; + enum stream_status status = IO_STREAM_TERM; ssize_t retlen; - char *retptr; - FILE *test_stream = NULL; char buf[4] = { 0 }; (void)ptr; @@ -3954,91 +4003,115 @@ test_util_fgets_eagain(void *ptr) retval = pipe(test_pipe); tt_int_op(retval, OP_EQ, 0); - /* Set up the read-end to be non-blocking */ - retval = fcntl(test_pipe[0], F_SETFL, O_NONBLOCK); - tt_int_op(retval, OP_EQ, 0); + /* Send in a string. */ + retlen = write(test_pipe[1], "ABC", 3); + tt_int_op(retlen, OP_EQ, 3); - /* Open it as a stdio stream */ - test_stream = fdopen(test_pipe[0], "r"); - tt_ptr_op(test_stream, OP_NE, NULL); + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "ABC"); + errno = 0; - /* Send in a partial line */ - retlen = write(test_pipe[1], "A", 1); + /* Send in a string that contains a nul. */ + retlen = write(test_pipe[1], "AB\0", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AB"); + errno = 0; + + /* Send in a string that contains a nul only. */ + retlen = write(test_pipe[1], "\0", 1); tt_int_op(retlen, OP_EQ, 1); - retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, OP_EQ, EAGAIN); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "A"); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, ""); errno = 0; - /* Send in the rest */ - retlen = write(test_pipe[1], "B\n", 2); - tt_int_op(retlen, OP_EQ, 2); - retptr = fgets(buf, sizeof(buf), test_stream); + /* Send in a string that contains a trailing newline. */ + retlen = write(test_pipe[1], "AB\n", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AB"); + errno = 0; + + /* Send in a string that contains a newline only. */ + retlen = write(test_pipe[1], "\n", 1); + tt_int_op(retlen, OP_EQ, 1); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "B\n"); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, ""); errno = 0; - /* Send in a full line */ - retlen = write(test_pipe[1], "CD\n", 3); + /* Send in a string and check that we nul terminate return values. */ + retlen = write(test_pipe[1], "AAA", 3); tt_int_op(retlen, OP_EQ, 3); - retptr = fgets(buf, sizeof(buf), test_stream); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "CD\n"); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AAA"); + tt_mem_op(buf, OP_EQ, "AAA\0", sizeof(buf)); errno = 0; - /* Send in a partial line */ - retlen = write(test_pipe[1], "E", 1); + retlen = write(test_pipe[1], "B", 1); tt_int_op(retlen, OP_EQ, 1); - retptr = fgets(buf, sizeof(buf), test_stream); - tt_int_op(errno, OP_EQ, EAGAIN); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "E"); + + memset(buf, '\xff', sizeof(buf)); + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); + tt_int_op(errno, OP_EQ, 0); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "B"); + tt_mem_op(buf, OP_EQ, "B\0\xff\xff", sizeof(buf)); errno = 0; - /* Send in the rest */ - retlen = write(test_pipe[1], "F\n", 2); - tt_int_op(retlen, OP_EQ, 2); - retptr = fgets(buf, sizeof(buf), test_stream); + /* Send in multiple lines. */ + retlen = write(test_pipe[1], "A\nB", 3); + tt_int_op(retlen, OP_EQ, 3); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "F\n"); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "A\nB"); errno = 0; - /* Send in a full line and close */ - retlen = write(test_pipe[1], "GH", 2); + /* Send in a line and close */ + retlen = write(test_pipe[1], "AB", 2); tt_int_op(retlen, OP_EQ, 2); retval = close(test_pipe[1]); tt_int_op(retval, OP_EQ, 0); test_pipe[1] = -1; - retptr = fgets(buf, sizeof(buf), test_stream); + + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, buf); - tt_str_op(buf, OP_EQ, "GH"); + tt_int_op(status, OP_EQ, IO_STREAM_OKAY); + tt_str_op(buf, OP_EQ, "AB"); errno = 0; /* Check for EOF */ - retptr = fgets(buf, sizeof(buf), test_stream); + status = get_string_from_pipe(test_pipe[0], buf, sizeof(buf)-1); tt_int_op(errno, OP_EQ, 0); - tt_ptr_op(retptr, OP_EQ, NULL); - retval = feof(test_stream); - tt_int_op(retval, OP_NE, 0); + tt_int_op(status, OP_EQ, IO_STREAM_CLOSED); errno = 0; - /* Check that buf is unchanged according to C99 and C11 */ - tt_str_op(buf, OP_EQ, "GH"); - done: - if (test_stream != NULL) - fclose(test_stream); if (test_pipe[0] != -1) close(test_pipe[0]); if (test_pipe[1] != -1) close(test_pipe[1]); } -#endif + +#endif // _WIN32 /** * Test for format_hex_number_sigsafe() @@ -5664,6 +5737,10 @@ test_util_htonll(void *arg) #define UTIL_TEST(name, flags) \ { #name, test_util_ ## name, flags, NULL, NULL } +#define COMPRESS(name, identifier) \ + { "compress/" #name, test_util_compress, 0, &passthrough_setup, \ + (char*)(identifier) } + #ifdef _WIN32 #define UTIL_TEST_NO_WIN(n, f) { #n, NULL, TT_SKIP, NULL, NULL } #define UTIL_TEST_WIN_ONLY(n, f) UTIL_TEST(n, (f)) @@ -5688,7 +5765,11 @@ struct testcase_t util_tests[] = { UTIL_LEGACY(strmisc), UTIL_TEST(parse_integer, 0), UTIL_LEGACY(pow2), - UTIL_LEGACY(gzip), + COMPRESS(zlib, "deflate"), + COMPRESS(gzip, "gzip"), + COMPRESS(lzma, "x-tor-lzma"), + COMPRESS(zstd, "x-zstd"), + COMPRESS(none, "identity"), UTIL_TEST(gzip_compression_bomb, TT_FORK), UTIL_LEGACY(datadir), UTIL_LEGACY(memarea), @@ -5712,7 +5793,7 @@ struct testcase_t util_tests[] = { UTIL_TEST(num_cpus, 0), UTIL_TEST_WIN_ONLY(load_win_lib, 0), UTIL_TEST_NO_WIN(exit_status, 0), - UTIL_TEST_NO_WIN(fgets_eagain, 0), + UTIL_TEST_NO_WIN(string_from_pipe, 0), UTIL_TEST(format_hex_number, 0), UTIL_TEST(format_dec_number, 0), UTIL_TEST(join_win_cmdline, 0), diff --git a/src/test/test_util_format.c b/src/test/test_util_format.c index 21a6923c6d..ea0a86499f 100644 --- a/src/test/test_util_format.c +++ b/src/test/test_util_format.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -133,48 +133,54 @@ test_util_format_base64_encode(void *ignored) } static void -test_util_format_base64_decode_nopad(void *ignored) +test_util_format_base64_decode_oddsize(void *ignored) { (void)ignored; int res; int i; char *src; - uint8_t *dst, *real_dst; - uint8_t expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; + char *dst, real_dst[7]; + char expected[] = {0x65, 0x78, 0x61, 0x6D, 0x70, 0x6C, 0x65}; char real_src[] = "ZXhhbXBsZQ"; + char expected40[] = "testing40characteroddsizebase64encoding!"; + char src40[] = "dGVzdGluZzQwY2hhcmFjdGVyb2Rkc2l6ZWJhc2U2NGVuY29kaW5nIQ"; + char pad40[] = "dGVzdGluZzQwY2hhcmFjdGVyb2Rkc2l6ZWJhc2U2NGVuY29kaW5nIQ=="; src = tor_malloc_zero(256); dst = tor_malloc_zero(1000); - real_dst = tor_malloc_zero(10); for (i=0;i<256;i++) { src[i] = (char)i; } - res = base64_decode_nopad(dst, 1, src, SIZE_T_CEILING); - tt_int_op(res, OP_EQ, -1); - - res = base64_decode_nopad(dst, 1, src, 5); + res = base64_decode(dst, 1, src, 5); tt_int_op(res, OP_EQ, -1); const char *s = "SGVsbG8gd29ybGQ"; - res = base64_decode_nopad(dst, 1000, s, strlen(s)); + res = base64_decode(dst, 1000, s, strlen(s)); tt_int_op(res, OP_EQ, 11); tt_mem_op(dst, OP_EQ, "Hello world", 11); s = "T3BhIG11bmRv"; - res = base64_decode_nopad(dst, 9, s, strlen(s)); + res = base64_decode(dst, 9, s, strlen(s)); tt_int_op(res, OP_EQ, 9); tt_mem_op(dst, OP_EQ, "Opa mundo", 9); - res = base64_decode_nopad(real_dst, 10, real_src, 10); + res = base64_decode(real_dst, sizeof(real_dst), real_src, 10); tt_int_op(res, OP_EQ, 7); tt_mem_op(real_dst, OP_EQ, expected, 7); + res = base64_decode(dst, 40, src40, strlen(src40)); + tt_int_op(res, OP_EQ, 40); + tt_mem_op(dst, OP_EQ, expected40, 40); + + res = base64_decode(dst, 40, pad40, strlen(pad40)); + tt_int_op(res, OP_EQ, 40); + tt_mem_op(dst, OP_EQ, expected40, 40); + done: tor_free(src); tor_free(dst); - tor_free(real_dst); } static void @@ -196,13 +202,10 @@ test_util_format_base64_decode(void *ignored) src[i] = (char)i; } - res = base64_decode(dst, 1, src, SIZE_T_CEILING); + res = base64_decode(dst, 1, src, 100); tt_int_op(res, OP_EQ, -1); - res = base64_decode(dst, SIZE_T_CEILING+1, src, 10); - tt_int_op(res, OP_EQ, -1); - - res = base64_decode(dst, 1, real_src, SIZE_MAX/3+1); + res = base64_decode(dst, 1, real_src, 10); tt_int_op(res, OP_EQ, -1); const char *s = "T3BhIG11bmRv"; @@ -370,11 +373,39 @@ test_util_format_base32_decode(void *arg) tor_free(dst); } +static void +test_util_format_encoded_size(void *arg) +{ + (void)arg; + uint8_t inbuf[256]; + char outbuf[1024]; + unsigned i; + + crypto_rand((char *)inbuf, sizeof(inbuf)); + for (i = 0; i <= sizeof(inbuf); ++i) { + /* XXXX (Once the return values are consistent, check them too.) */ + + base32_encode(outbuf, sizeof(outbuf), (char *)inbuf, i); + /* The "+ 1" below is an API inconsistency. */ + tt_int_op(strlen(outbuf) + 1, OP_EQ, base32_encoded_size(i)); + + base64_encode(outbuf, sizeof(outbuf), (char *)inbuf, i, 0); + tt_int_op(strlen(outbuf), OP_EQ, base64_encode_size(i, 0)); + base64_encode(outbuf, sizeof(outbuf), (char *)inbuf, i, + BASE64_ENCODE_MULTILINE); + tt_int_op(strlen(outbuf), OP_EQ, + base64_encode_size(i, BASE64_ENCODE_MULTILINE)); + } + + done: + ; +} + struct testcase_t util_format_tests[] = { { "unaligned_accessors", test_util_format_unaligned_accessors, 0, NULL, NULL }, { "base64_encode", test_util_format_base64_encode, 0, NULL, NULL }, - { "base64_decode_nopad", test_util_format_base64_decode_nopad, 0, + { "base64_decode_oddsize", test_util_format_base64_decode_oddsize, 0, NULL, NULL }, { "base64_decode", test_util_format_base64_decode, 0, NULL, NULL }, { "base16_decode", test_util_format_base16_decode, 0, NULL, NULL }, @@ -382,6 +413,7 @@ struct testcase_t util_format_tests[] = { NULL, NULL }, { "base32_decode", test_util_format_base32_decode, 0, NULL, NULL }, + { "encoded_size", test_util_format_encoded_size, 0, NULL, NULL }, END_OF_TESTCASES }; diff --git a/src/test/test_util_process.c b/src/test/test_util_process.c index 4e75b97f3d..70292f2287 100644 --- a/src/test/test_util_process.c +++ b/src/test/test_util_process.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2010-2016, The Tor Project, Inc. */ +/* Copyright (c) 2010-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #define UTIL_PROCESS_PRIVATE diff --git a/src/test/test_util_slow.c b/src/test/test_util_slow.c index 1e7160598c..3e5d78948d 100644 --- a/src/test/test_util_slow.c +++ b/src/test/test_util_slow.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" @@ -242,7 +242,7 @@ test_util_spawn_background_partial_read_impl(int exit_early) #else /* Check that we didn't read the end of file last time */ tt_assert(!eof); - pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf, + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, sizeof(stdout_buf) - 1, NULL, &eof); #endif log_info(LD_GENERAL, "tor_read_all_handle() returned %d", (int)pos); @@ -273,7 +273,7 @@ test_util_spawn_background_partial_read_impl(int exit_early) #else if (!eof) { /* We should have got all the data, but maybe not the EOF flag */ - pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf, + pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf, sizeof(stdout_buf) - 1, process_handle, &eof); tt_int_op(0,OP_EQ, pos); diff --git a/src/test/test_workqueue.c b/src/test/test_workqueue.c index ccb8d0c8ca..10714457f7 100644 --- a/src/test/test_workqueue.c +++ b/src/test/test_workqueue.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "or.h" diff --git a/src/test/testing_common.c b/src/test/testing_common.c index 07fd9e0afd..d7e36edbc0 100644 --- a/src/test/testing_common.c +++ b/src/test/testing_common.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ extern const char tor_git_revision[]; @@ -39,7 +39,6 @@ const char tor_git_revision[] = ""; #ifdef USE_DMALLOC #include <dmalloc.h> -#include <openssl/crypto.h> #include "main.h" #endif @@ -239,14 +238,15 @@ main(int c, const char **v) #ifdef USE_DMALLOC { - int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_); - tor_assert(r); + int r = crypto_use_tor_alloc_functions(); + tor_assert(r == 0); } #endif update_approx_time(time(NULL)); options = options_new(); tor_threads_init(); + tor_compress_init(); network_init(); diff --git a/src/test/testing_rsakeys.c b/src/test/testing_rsakeys.c index 134770bb0d..5dff233a69 100644 --- a/src/test/testing_rsakeys.c +++ b/src/test/testing_rsakeys.c @@ -1,6 +1,6 @@ /* Copyright (c) 2001-2004, Roger Dingledine. * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson. - * Copyright (c) 2007-2016, The Tor Project, Inc. */ + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/tools/include.am b/src/tools/include.am index d0185b5887..5eadb03a05 100644 --- a/src/tools/include.am +++ b/src/tools/include.am @@ -1,5 +1,4 @@ bin_PROGRAMS+= src/tools/tor-resolve src/tools/tor-gencert -noinst_PROGRAMS+= src/tools/tor-checkkey if COVERAGE_ENABLED noinst_PROGRAMS+= src/tools/tor-cov-resolve src/tools/tor-cov-gencert @@ -43,14 +42,4 @@ src_tools_tor_cov_gencert_LDADD = src/common/libor-testing.a \ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ endif -src_tools_tor_checkkey_SOURCES = src/tools/tor-checkkey.c -src_tools_tor_checkkey_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ -src_tools_tor_checkkey_LDADD = src/common/libor.a \ - src/common/libor-ctime.a \ - src/common/libor-crypto.a \ - $(LIBKECCAK_TINY) \ - $(LIBDONNA) \ - @TOR_LIB_MATH@ @TOR_ZLIB_LIBS@ @TOR_OPENSSL_LIBS@ \ - @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ - EXTRA_DIST += src/tools/tor-fw-helper/README diff --git a/src/tools/tor-checkkey.c b/src/tools/tor-checkkey.c deleted file mode 100644 index 3e16fd0336..0000000000 --- a/src/tools/tor-checkkey.c +++ /dev/null @@ -1,89 +0,0 @@ -/* Copyright (c) 2008-2015, The Tor Project, Inc. */ -/* See LICENSE for licensing information */ - -#include "orconfig.h" - -#include <stdio.h> -#include <stdlib.h> -#include "crypto.h" -#include "torlog.h" -#include "util.h" -#include "compat.h" -#include "compat_openssl.h" -#include <openssl/bn.h> -#include <openssl/rsa.h> - -int -main(int c, char **v) -{ - crypto_pk_t *env; - char *str; - RSA *rsa; - int wantdigest=0; - int fname_idx; - char *fname=NULL; - init_logging(1); - - if (c < 2) { - fprintf(stderr, "Hi. I'm tor-checkkey. Tell me a filename that " - "has a PEM-encoded RSA public key (like in a cert) and I'll " - "dump the modulus. Use the --digest option too and I'll " - "dump the digest.\n"); - return 1; - } - - if (crypto_global_init(0, NULL, NULL)) { - fprintf(stderr, "Couldn't initialize crypto library.\n"); - return 1; - } - - if (!strcmp(v[1], "--digest")) { - wantdigest = 1; - fname_idx = 2; - if (c<3) { - fprintf(stderr, "too few arguments"); - return 1; - } - } else { - wantdigest = 0; - fname_idx = 1; - } - - fname = expand_filename(v[fname_idx]); - str = read_file_to_str(fname, 0, NULL); - tor_free(fname); - if (!str) { - fprintf(stderr, "Couldn't read %s\n", v[fname_idx]); - return 1; - } - - env = crypto_pk_new(); - if (crypto_pk_read_public_key_from_string(env, str, strlen(str))<0) { - fprintf(stderr, "Couldn't parse key.\n"); - return 1; - } - tor_free(str); - - if (wantdigest) { - char digest[HEX_DIGEST_LEN+1]; - if (crypto_pk_get_fingerprint(env, digest, 0)<0) - return 1; - printf("%s\n",digest); - } else { - rsa = crypto_pk_get_rsa_(env); - - const BIGNUM *rsa_n; -#ifdef OPENSSL_1_1_API - const BIGNUM *rsa_e, *rsa_d; - RSA_get0_key(rsa, &rsa_n, &rsa_e, &rsa_d); -#else - rsa_n = rsa->n; -#endif - str = BN_bn2hex(rsa_n); - - printf("%s\n", str); - } - - return 0; -} - diff --git a/src/tools/tor-gencert.c b/src/tools/tor-gencert.c index db308485e6..395535697f 100644 --- a/src/tools/tor-gencert.c +++ b/src/tools/tor-gencert.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2007-2015, The Tor Project, Inc. */ +/* Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ #include "orconfig.h" diff --git a/src/tools/tor-resolve.c b/src/tools/tor-resolve.c index 6ac866d3c0..1e2409a131 100644 --- a/src/tools/tor-resolve.c +++ b/src/tools/tor-resolve.c @@ -1,5 +1,5 @@ /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson - * Copyright (c) 2007-2015, The Tor Project, Inc. + * Copyright (c) 2007-2017, The Tor Project, Inc. */ /* See LICENSE for licensing information */ diff --git a/src/trace/debug.h b/src/trace/debug.h new file mode 100644 index 0000000000..3a1652543a --- /dev/null +++ b/src/trace/debug.h @@ -0,0 +1,25 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_TRACE_LOG_DEBUG_H +#define TOR_TRACE_LOG_DEBUG_H + +#include "torlog.h" + +/* Stringify pre-processor trick. */ +#define XSTR(d) STR(d) +#define STR(s) #s + +/* Send every event to a debug log level. This is useful to debug new trace + * events without implementing them for a specific event tracing framework. + * Note that the arguments are ignored since at this step we do not know the + * types and amount there is. */ + +/* Example on how to map a tracepoint to log_debug(). */ +#undef tor_trace +#define tor_trace(subsystem, name, args...) \ + log_debug(LD_GENERAL, "Trace event \"" XSTR(name) "\" from " \ + "\"" XSTR(subsystem) "\" hit. " \ + "(line "XSTR(__LINE__) ")") + +#endif /* TOR_TRACE_LOG_DEBUG_H */ diff --git a/src/trace/events.h b/src/trace/events.h new file mode 100644 index 0000000000..1be1fd596e --- /dev/null +++ b/src/trace/events.h @@ -0,0 +1,45 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +/** + * \file events.h + * \brief Header file for Tor event tracing. + **/ + +#ifndef TOR_TRACE_EVENTS_H +#define TOR_TRACE_EVENTS_H + +/* + * The following defines a generic event tracing function name that has to be + * used to trace events in the code base. + * + * That generic function is then defined by a event tracing framework. For + * instance, the "log debug" framework sends all trace events to log_debug() + * which is defined in src/trace/debug.h which can only be enabled at compile + * time (--enable-event-tracing-debug). + * + * By default, every trace events in the code base are replaced by a NOP. See + * doc/HACKING/Tracing.md for more information on how to use event tracing or + * add events. + */ + +#ifdef TOR_EVENT_TRACING_ENABLED +/* Map every trace event to a per subsystem macro. */ +#define tor_trace(subsystem, name, ...) \ + tor_trace_##subsystem(name, __VA_ARGS__) + +/* Enable event tracing for the debug framework where all trace events are + * mapped to a log_debug(). */ +#ifdef USE_EVENT_TRACING_DEBUG +#include "trace/debug.h" +#endif + +#else /* TOR_EVENT_TRACING_ENABLED */ + +/* Reaching this point, we NOP every event declaration because event tracing + * is not been enabled at compile time. */ +#define tor_trace(subsystem, name, args...) + +#endif /* TOR_EVENT_TRACING_ENABLED */ + +#endif /* TOR_TRACE_EVENTS_H */ diff --git a/src/trace/include.am b/src/trace/include.am new file mode 100644 index 0000000000..3285b04de6 --- /dev/null +++ b/src/trace/include.am @@ -0,0 +1,22 @@ +# Include the src/ so we can use the trace/events.h statement when including +# any file in that directory. +AM_CPPFLAGS += -I$(srcdir)/src + +noinst_LIBRARIES += \ + src/trace/libor-trace.a +LIBOR_TRACE_A_SOURCES = \ + src/trace/trace.c + +TRACEHEADERS = \ + src/trace/trace.h \ + src/trace/events.h + +if USE_EVENT_TRACING_DEBUG +TRACEHEADERS += \ + src/trace/debug.h +endif + +# Library source files. +src_trace_libor_trace_a_SOURCES = $(LIBOR_TRACE_A_SOURCES) + +noinst_HEADERS+= $(TRACEHEADERS) diff --git a/src/trace/trace.c b/src/trace/trace.c new file mode 100644 index 0000000000..fcdb80091f --- /dev/null +++ b/src/trace/trace.c @@ -0,0 +1,11 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#include "trace.h" + +/** Initialize the tracing library. */ +void +tor_trace_init(void) +{ +} + diff --git a/src/trace/trace.h b/src/trace/trace.h new file mode 100644 index 0000000000..28fcd8eea8 --- /dev/null +++ b/src/trace/trace.h @@ -0,0 +1,10 @@ +/* Copyright (c) 2017, The Tor Project, Inc. */ +/* See LICENSE for licensing information */ + +#ifndef TOR_TRACE_TRACE_H +#define TOR_TRACE_TRACE_H + +void tor_trace_init(void); + +#endif // TOR_TRACE_TRACE_H + diff --git a/src/trunnel/hs/cell_common.c b/src/trunnel/hs/cell_common.c index 830f2260ee..b7f19ffc60 100644 --- a/src/trunnel/hs/cell_common.c +++ b/src/trunnel/hs/cell_common.c @@ -28,10 +28,10 @@ int cellcommon_deadcode_dummy__ = 0; } \ } while (0) -cell_extension_fields_t * -cell_extension_fields_new(void) +trn_cell_extension_fields_t * +trn_cell_extension_fields_new(void) { - cell_extension_fields_t *val = trunnel_calloc(1, sizeof(cell_extension_fields_t)); + trn_cell_extension_fields_t *val = trunnel_calloc(1, sizeof(trn_cell_extension_fields_t)); if (NULL == val) return NULL; return val; @@ -40,7 +40,7 @@ cell_extension_fields_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -cell_extension_fields_clear(cell_extension_fields_t *obj) +trn_cell_extension_fields_clear(trn_cell_extension_fields_t *obj) { (void) obj; TRUNNEL_DYNARRAY_WIPE(&obj->field); @@ -48,62 +48,62 @@ cell_extension_fields_clear(cell_extension_fields_t *obj) } void -cell_extension_fields_free(cell_extension_fields_t *obj) +trn_cell_extension_fields_free(trn_cell_extension_fields_t *obj) { if (obj == NULL) return; - cell_extension_fields_clear(obj); - trunnel_memwipe(obj, sizeof(cell_extension_fields_t)); + trn_cell_extension_fields_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_extension_fields_t)); trunnel_free_(obj); } uint8_t -cell_extension_fields_get_field_type(const cell_extension_fields_t *inp) +trn_cell_extension_fields_get_field_type(const trn_cell_extension_fields_t *inp) { return inp->field_type; } int -cell_extension_fields_set_field_type(cell_extension_fields_t *inp, uint8_t val) +trn_cell_extension_fields_set_field_type(trn_cell_extension_fields_t *inp, uint8_t val) { inp->field_type = val; return 0; } uint8_t -cell_extension_fields_get_field_len(const cell_extension_fields_t *inp) +trn_cell_extension_fields_get_field_len(const trn_cell_extension_fields_t *inp) { return inp->field_len; } int -cell_extension_fields_set_field_len(cell_extension_fields_t *inp, uint8_t val) +trn_cell_extension_fields_set_field_len(trn_cell_extension_fields_t *inp, uint8_t val) { inp->field_len = val; return 0; } size_t -cell_extension_fields_getlen_field(const cell_extension_fields_t *inp) +trn_cell_extension_fields_getlen_field(const trn_cell_extension_fields_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->field); } uint8_t -cell_extension_fields_get_field(cell_extension_fields_t *inp, size_t idx) +trn_cell_extension_fields_get_field(trn_cell_extension_fields_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->field, idx); } uint8_t -cell_extension_fields_getconst_field(const cell_extension_fields_t *inp, size_t idx) +trn_cell_extension_fields_getconst_field(const trn_cell_extension_fields_t *inp, size_t idx) { - return cell_extension_fields_get_field((cell_extension_fields_t*)inp, idx); + return trn_cell_extension_fields_get_field((trn_cell_extension_fields_t*)inp, idx); } int -cell_extension_fields_set_field(cell_extension_fields_t *inp, size_t idx, uint8_t elt) +trn_cell_extension_fields_set_field(trn_cell_extension_fields_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->field, idx, elt); return 0; } int -cell_extension_fields_add_field(cell_extension_fields_t *inp, uint8_t elt) +trn_cell_extension_fields_add_field(trn_cell_extension_fields_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT8_MAX if (inp->field.n_ == UINT8_MAX) @@ -117,17 +117,17 @@ cell_extension_fields_add_field(cell_extension_fields_t *inp, uint8_t elt) } uint8_t * -cell_extension_fields_getarray_field(cell_extension_fields_t *inp) +trn_cell_extension_fields_getarray_field(trn_cell_extension_fields_t *inp) { return inp->field.elts_; } const uint8_t * -cell_extension_fields_getconstarray_field(const cell_extension_fields_t *inp) +trn_cell_extension_fields_getconstarray_field(const trn_cell_extension_fields_t *inp) { - return (const uint8_t *)cell_extension_fields_getarray_field((cell_extension_fields_t*)inp); + return (const uint8_t *)trn_cell_extension_fields_getarray_field((trn_cell_extension_fields_t*)inp); } int -cell_extension_fields_setlen_field(cell_extension_fields_t *inp, size_t newlen) +trn_cell_extension_fields_setlen_field(trn_cell_extension_fields_t *inp, size_t newlen) { uint8_t *newptr; #if UINT8_MAX < SIZE_MAX @@ -147,7 +147,7 @@ cell_extension_fields_setlen_field(cell_extension_fields_t *inp, size_t newlen) return -1; } const char * -cell_extension_fields_check(const cell_extension_fields_t *obj) +trn_cell_extension_fields_check(const trn_cell_extension_fields_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -159,11 +159,11 @@ cell_extension_fields_check(const cell_extension_fields_t *obj) } ssize_t -cell_extension_fields_encoded_len(const cell_extension_fields_t *obj) +trn_cell_extension_fields_encoded_len(const trn_cell_extension_fields_t *obj) { ssize_t result = 0; - if (NULL != cell_extension_fields_check(obj)) + if (NULL != trn_cell_extension_fields_check(obj)) return -1; @@ -178,24 +178,24 @@ cell_extension_fields_encoded_len(const cell_extension_fields_t *obj) return result; } int -cell_extension_fields_clear_errors(cell_extension_fields_t *obj) +trn_cell_extension_fields_clear_errors(trn_cell_extension_fields_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -cell_extension_fields_encode(uint8_t *output, const size_t avail, const cell_extension_fields_t *obj) +trn_cell_extension_fields_encode(uint8_t *output, const size_t avail, const trn_cell_extension_fields_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = cell_extension_fields_encoded_len(obj); + const ssize_t encoded_len = trn_cell_extension_fields_encoded_len(obj); #endif - if (NULL != (msg = cell_extension_fields_check(obj))) + if (NULL != (msg = trn_cell_extension_fields_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -252,11 +252,11 @@ cell_extension_fields_encode(uint8_t *output, const size_t avail, const cell_ext return result; } -/** As cell_extension_fields_parse(), but do not allocate the output - * object. +/** As trn_cell_extension_fields_parse(), but do not allocate the + * output object. */ static ssize_t -cell_extension_fields_parse_into(cell_extension_fields_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_extension_fields_parse_into(trn_cell_extension_fields_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -290,23 +290,23 @@ cell_extension_fields_parse_into(cell_extension_fields_t *obj, const uint8_t *in } ssize_t -cell_extension_fields_parse(cell_extension_fields_t **output, const uint8_t *input, const size_t len_in) +trn_cell_extension_fields_parse(trn_cell_extension_fields_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = cell_extension_fields_new(); + *output = trn_cell_extension_fields_new(); if (NULL == *output) return -1; - result = cell_extension_fields_parse_into(*output, input, len_in); + result = trn_cell_extension_fields_parse_into(*output, input, len_in); if (result < 0) { - cell_extension_fields_free(*output); + trn_cell_extension_fields_free(*output); *output = NULL; } return result; } -cell_extension_t * -cell_extension_new(void) +trn_cell_extension_t * +trn_cell_extension_new(void) { - cell_extension_t *val = trunnel_calloc(1, sizeof(cell_extension_t)); + trn_cell_extension_t *val = trunnel_calloc(1, sizeof(trn_cell_extension_t)); if (NULL == val) return NULL; return val; @@ -315,14 +315,14 @@ cell_extension_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -cell_extension_clear(cell_extension_t *obj) +trn_cell_extension_clear(trn_cell_extension_t *obj) { (void) obj; { unsigned idx; for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - cell_extension_fields_free(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); + trn_cell_extension_fields_free(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); } } TRUNNEL_DYNARRAY_WIPE(&obj->fields); @@ -330,92 +330,92 @@ cell_extension_clear(cell_extension_t *obj) } void -cell_extension_free(cell_extension_t *obj) +trn_cell_extension_free(trn_cell_extension_t *obj) { if (obj == NULL) return; - cell_extension_clear(obj); - trunnel_memwipe(obj, sizeof(cell_extension_t)); + trn_cell_extension_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_extension_t)); trunnel_free_(obj); } uint8_t -cell_extension_get_num(const cell_extension_t *inp) +trn_cell_extension_get_num(const trn_cell_extension_t *inp) { return inp->num; } int -cell_extension_set_num(cell_extension_t *inp, uint8_t val) +trn_cell_extension_set_num(trn_cell_extension_t *inp, uint8_t val) { inp->num = val; return 0; } size_t -cell_extension_getlen_fields(const cell_extension_t *inp) +trn_cell_extension_getlen_fields(const trn_cell_extension_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->fields); } -struct cell_extension_fields_st * -cell_extension_get_fields(cell_extension_t *inp, size_t idx) +struct trn_cell_extension_fields_st * +trn_cell_extension_get_fields(trn_cell_extension_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->fields, idx); } - const struct cell_extension_fields_st * -cell_extension_getconst_fields(const cell_extension_t *inp, size_t idx) + const struct trn_cell_extension_fields_st * +trn_cell_extension_getconst_fields(const trn_cell_extension_t *inp, size_t idx) { - return cell_extension_get_fields((cell_extension_t*)inp, idx); + return trn_cell_extension_get_fields((trn_cell_extension_t*)inp, idx); } int -cell_extension_set_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt) +trn_cell_extension_set_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt) { - cell_extension_fields_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->fields, idx); + trn_cell_extension_fields_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->fields, idx); if (oldval && oldval != elt) - cell_extension_fields_free(oldval); - return cell_extension_set0_fields(inp, idx, elt); + trn_cell_extension_fields_free(oldval); + return trn_cell_extension_set0_fields(inp, idx, elt); } int -cell_extension_set0_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt) +trn_cell_extension_set0_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt) { TRUNNEL_DYNARRAY_SET(&inp->fields, idx, elt); return 0; } int -cell_extension_add_fields(cell_extension_t *inp, struct cell_extension_fields_st * elt) +trn_cell_extension_add_fields(trn_cell_extension_t *inp, struct trn_cell_extension_fields_st * elt) { #if SIZE_MAX >= UINT8_MAX if (inp->fields.n_ == UINT8_MAX) goto trunnel_alloc_failed; #endif - TRUNNEL_DYNARRAY_ADD(struct cell_extension_fields_st *, &inp->fields, elt, {}); + TRUNNEL_DYNARRAY_ADD(struct trn_cell_extension_fields_st *, &inp->fields, elt, {}); return 0; trunnel_alloc_failed: TRUNNEL_SET_ERROR_CODE(inp); return -1; } -struct cell_extension_fields_st * * -cell_extension_getarray_fields(cell_extension_t *inp) +struct trn_cell_extension_fields_st * * +trn_cell_extension_getarray_fields(trn_cell_extension_t *inp) { return inp->fields.elts_; } -const struct cell_extension_fields_st * const * -cell_extension_getconstarray_fields(const cell_extension_t *inp) +const struct trn_cell_extension_fields_st * const * +trn_cell_extension_getconstarray_fields(const trn_cell_extension_t *inp) { - return (const struct cell_extension_fields_st * const *)cell_extension_getarray_fields((cell_extension_t*)inp); + return (const struct trn_cell_extension_fields_st * const *)trn_cell_extension_getarray_fields((trn_cell_extension_t*)inp); } int -cell_extension_setlen_fields(cell_extension_t *inp, size_t newlen) +trn_cell_extension_setlen_fields(trn_cell_extension_t *inp, size_t newlen) { - struct cell_extension_fields_st * *newptr; + struct trn_cell_extension_fields_st * *newptr; #if UINT8_MAX < SIZE_MAX if (newlen > UINT8_MAX) goto trunnel_alloc_failed; #endif newptr = trunnel_dynarray_setlen(&inp->fields.allocated_, &inp->fields.n_, inp->fields.elts_, newlen, - sizeof(inp->fields.elts_[0]), (trunnel_free_fn_t) cell_extension_fields_free, + sizeof(inp->fields.elts_[0]), (trunnel_free_fn_t) trn_cell_extension_fields_free, &inp->trunnel_error_code_); if (newlen != 0 && newptr == NULL) goto trunnel_alloc_failed; @@ -426,7 +426,7 @@ cell_extension_setlen_fields(cell_extension_t *inp, size_t newlen) return -1; } const char * -cell_extension_check(const cell_extension_t *obj) +trn_cell_extension_check(const trn_cell_extension_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -437,7 +437,7 @@ cell_extension_check(const cell_extension_t *obj) unsigned idx; for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - if (NULL != (msg = cell_extension_fields_check(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)))) + if (NULL != (msg = trn_cell_extension_fields_check(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)))) return msg; } } @@ -447,46 +447,46 @@ cell_extension_check(const cell_extension_t *obj) } ssize_t -cell_extension_encoded_len(const cell_extension_t *obj) +trn_cell_extension_encoded_len(const trn_cell_extension_t *obj) { ssize_t result = 0; - if (NULL != cell_extension_check(obj)) + if (NULL != trn_cell_extension_check(obj)) return -1; /* Length of u8 num */ result += 1; - /* Length of struct cell_extension_fields fields[num] */ + /* Length of struct trn_cell_extension_fields fields[num] */ { unsigned idx; for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { - result += cell_extension_fields_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); + result += trn_cell_extension_fields_encoded_len(TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); } } return result; } int -cell_extension_clear_errors(cell_extension_t *obj) +trn_cell_extension_clear_errors(trn_cell_extension_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -cell_extension_encode(uint8_t *output, const size_t avail, const cell_extension_t *obj) +trn_cell_extension_encode(uint8_t *output, const size_t avail, const trn_cell_extension_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = cell_extension_encoded_len(obj); + const ssize_t encoded_len = trn_cell_extension_encoded_len(obj); #endif - if (NULL != (msg = cell_extension_check(obj))) + if (NULL != (msg = trn_cell_extension_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -500,13 +500,13 @@ cell_extension_encode(uint8_t *output, const size_t avail, const cell_extension_ trunnel_set_uint8(ptr, (obj->num)); written += 1; ptr += 1; - /* Encode struct cell_extension_fields fields[num] */ + /* Encode struct trn_cell_extension_fields fields[num] */ { unsigned idx; for (idx = 0; idx < TRUNNEL_DYNARRAY_LEN(&obj->fields); ++idx) { trunnel_assert(written <= avail); - result = cell_extension_fields_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); + result = trn_cell_extension_fields_encode(ptr, avail - written, TRUNNEL_DYNARRAY_GET(&obj->fields, idx)); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -537,10 +537,11 @@ cell_extension_encode(uint8_t *output, const size_t avail, const cell_extension_ return result; } -/** As cell_extension_parse(), but do not allocate the output object. +/** As trn_cell_extension_parse(), but do not allocate the output + * object. */ static ssize_t -cell_extension_parse_into(cell_extension_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_extension_parse_into(trn_cell_extension_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -552,18 +553,18 @@ cell_extension_parse_into(cell_extension_t *obj, const uint8_t *input, const siz obj->num = (trunnel_get_uint8(ptr)); remaining -= 1; ptr += 1; - /* Parse struct cell_extension_fields fields[num] */ - TRUNNEL_DYNARRAY_EXPAND(cell_extension_fields_t *, &obj->fields, obj->num, {}); + /* Parse struct trn_cell_extension_fields fields[num] */ + TRUNNEL_DYNARRAY_EXPAND(trn_cell_extension_fields_t *, &obj->fields, obj->num, {}); { - cell_extension_fields_t * elt; + trn_cell_extension_fields_t * elt; unsigned idx; for (idx = 0; idx < obj->num; ++idx) { - result = cell_extension_fields_parse(&elt, ptr, remaining); + result = trn_cell_extension_fields_parse(&elt, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); remaining -= result; ptr += result; - TRUNNEL_DYNARRAY_ADD(cell_extension_fields_t *, &obj->fields, elt, {cell_extension_fields_free(elt);}); + TRUNNEL_DYNARRAY_ADD(trn_cell_extension_fields_t *, &obj->fields, elt, {trn_cell_extension_fields_free(elt);}); } } trunnel_assert(ptr + remaining == input + len_in); @@ -579,15 +580,15 @@ cell_extension_parse_into(cell_extension_t *obj, const uint8_t *input, const siz } ssize_t -cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in) +trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = cell_extension_new(); + *output = trn_cell_extension_new(); if (NULL == *output) return -1; - result = cell_extension_parse_into(*output, input, len_in); + result = trn_cell_extension_parse_into(*output, input, len_in); if (result < 0) { - cell_extension_free(*output); + trn_cell_extension_free(*output); *output = NULL; } return result; diff --git a/src/trunnel/hs/cell_common.h b/src/trunnel/hs/cell_common.h index 8999f7da40..4d98a54cf4 100644 --- a/src/trunnel/hs/cell_common.h +++ b/src/trunnel/hs/cell_common.h @@ -8,191 +8,196 @@ #include <stdint.h> #include "trunnel.h" -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CELL_EXTENSION_FIELDS) -struct cell_extension_fields_st { +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_EXTENSION_FIELDS) +struct trn_cell_extension_fields_st { uint8_t field_type; uint8_t field_len; TRUNNEL_DYNARRAY_HEAD(, uint8_t) field; uint8_t trunnel_error_code_; }; #endif -typedef struct cell_extension_fields_st cell_extension_fields_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_CELL_EXTENSION) -struct cell_extension_st { +typedef struct trn_cell_extension_fields_st trn_cell_extension_fields_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_EXTENSION) +struct trn_cell_extension_st { uint8_t num; - TRUNNEL_DYNARRAY_HEAD(, struct cell_extension_fields_st *) fields; + TRUNNEL_DYNARRAY_HEAD(, struct trn_cell_extension_fields_st *) fields; uint8_t trunnel_error_code_; }; #endif -typedef struct cell_extension_st cell_extension_t; -/** Return a newly allocated cell_extension_fields with all elements - * set to zero. - */ -cell_extension_fields_t *cell_extension_fields_new(void); -/** Release all storage held by the cell_extension_fields in 'victim'. - * (Do nothing if 'victim' is NULL.) - */ -void cell_extension_fields_free(cell_extension_fields_t *victim); -/** Try to parse a cell_extension_fields from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated cell_extension_fields_t. On failure, return -2 if the - * input appears truncated, and -1 if the input is otherwise invalid. - */ -ssize_t cell_extension_fields_parse(cell_extension_fields_t **output, const uint8_t *input, const size_t len_in); +typedef struct trn_cell_extension_st trn_cell_extension_t; +/** Return a newly allocated trn_cell_extension_fields with all + * elements set to zero. + */ +trn_cell_extension_fields_t *trn_cell_extension_fields_new(void); +/** Release all storage held by the trn_cell_extension_fields in + * 'victim'. (Do nothing if 'victim' is NULL.) + */ +void trn_cell_extension_fields_free(trn_cell_extension_fields_t *victim); +/** Try to parse a trn_cell_extension_fields from the buffer in + * 'input', using up to 'len_in' bytes from the input buffer. On + * success, return the number of bytes consumed and set *output to the + * newly allocated trn_cell_extension_fields_t. On failure, return -2 + * if the input appears truncated, and -1 if the input is otherwise + * invalid. + */ +ssize_t trn_cell_extension_fields_parse(trn_cell_extension_fields_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * cell_extension_fields in 'obj'. On failure, return a negative + * trn_cell_extension_fields in 'obj'. On failure, return a negative * value. Note that this value may be an overestimate, and can even be * an underestimate for certain unencodeable objects. */ -ssize_t cell_extension_fields_encoded_len(const cell_extension_fields_t *obj); -/** Try to encode the cell_extension_fields from 'input' into the +ssize_t trn_cell_extension_fields_encoded_len(const trn_cell_extension_fields_t *obj); +/** Try to encode the trn_cell_extension_fields from 'input' into the * buffer at 'output', using up to 'avail' bytes of the output buffer. * On success, return the number of bytes used. On failure, return -2 * if the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t cell_extension_fields_encode(uint8_t *output, size_t avail, const cell_extension_fields_t *input); -/** Check whether the internal state of the cell_extension_fields in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. +ssize_t trn_cell_extension_fields_encode(uint8_t *output, size_t avail, const trn_cell_extension_fields_t *input); +/** Check whether the internal state of the trn_cell_extension_fields + * in 'obj' is consistent. Return NULL if it is, and a short message + * if it is not. */ -const char *cell_extension_fields_check(const cell_extension_fields_t *obj); +const char *trn_cell_extension_fields_check(const trn_cell_extension_fields_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int cell_extension_fields_clear_errors(cell_extension_fields_t *obj); +int trn_cell_extension_fields_clear_errors(trn_cell_extension_fields_t *obj); /** Return the value of the field_type field of the - * cell_extension_fields_t in 'inp' + * trn_cell_extension_fields_t in 'inp' */ -uint8_t cell_extension_fields_get_field_type(const cell_extension_fields_t *inp); +uint8_t trn_cell_extension_fields_get_field_type(const trn_cell_extension_fields_t *inp); /** Set the value of the field_type field of the - * cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int cell_extension_fields_set_field_type(cell_extension_fields_t *inp, uint8_t val); +int trn_cell_extension_fields_set_field_type(trn_cell_extension_fields_t *inp, uint8_t val); /** Return the value of the field_len field of the - * cell_extension_fields_t in 'inp' + * trn_cell_extension_fields_t in 'inp' */ -uint8_t cell_extension_fields_get_field_len(const cell_extension_fields_t *inp); +uint8_t trn_cell_extension_fields_get_field_len(const trn_cell_extension_fields_t *inp); /** Set the value of the field_len field of the - * cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_extension_fields_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int cell_extension_fields_set_field_len(cell_extension_fields_t *inp, uint8_t val); +int trn_cell_extension_fields_set_field_len(trn_cell_extension_fields_t *inp, uint8_t val); /** Return the length of the dynamic array holding the field field of - * the cell_extension_fields_t in 'inp'. + * the trn_cell_extension_fields_t in 'inp'. */ -size_t cell_extension_fields_getlen_field(const cell_extension_fields_t *inp); +size_t trn_cell_extension_fields_getlen_field(const trn_cell_extension_fields_t *inp); /** Return the element at position 'idx' of the dynamic array field - * field of the cell_extension_fields_t in 'inp'. + * field of the trn_cell_extension_fields_t in 'inp'. */ -uint8_t cell_extension_fields_get_field(cell_extension_fields_t *inp, size_t idx); -/** As cell_extension_fields_get_field, but take and return a const - * pointer +uint8_t trn_cell_extension_fields_get_field(trn_cell_extension_fields_t *inp, size_t idx); +/** As trn_cell_extension_fields_get_field, but take and return a + * const pointer */ -uint8_t cell_extension_fields_getconst_field(const cell_extension_fields_t *inp, size_t idx); +uint8_t trn_cell_extension_fields_getconst_field(const trn_cell_extension_fields_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * field of the cell_extension_fields_t in 'inp', so that it will hold - * the value 'elt'. + * field of the trn_cell_extension_fields_t in 'inp', so that it will + * hold the value 'elt'. */ -int cell_extension_fields_set_field(cell_extension_fields_t *inp, size_t idx, uint8_t elt); +int trn_cell_extension_fields_set_field(trn_cell_extension_fields_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field field of the - * cell_extension_fields_t in 'inp'. + * trn_cell_extension_fields_t in 'inp'. */ -int cell_extension_fields_add_field(cell_extension_fields_t *inp, uint8_t elt); +int trn_cell_extension_fields_add_field(trn_cell_extension_fields_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field field of * 'inp'. */ -uint8_t * cell_extension_fields_getarray_field(cell_extension_fields_t *inp); -/** As cell_extension_fields_get_field, but take and return a const - * pointer +uint8_t * trn_cell_extension_fields_getarray_field(trn_cell_extension_fields_t *inp); +/** As trn_cell_extension_fields_get_field, but take and return a + * const pointer */ -const uint8_t * cell_extension_fields_getconstarray_field(const cell_extension_fields_t *inp); +const uint8_t * trn_cell_extension_fields_getconstarray_field(const trn_cell_extension_fields_t *inp); /** Change the length of the variable-length array field field of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int cell_extension_fields_setlen_field(cell_extension_fields_t *inp, size_t newlen); -/** Return a newly allocated cell_extension with all elements set to - * zero. +int trn_cell_extension_fields_setlen_field(trn_cell_extension_fields_t *inp, size_t newlen); +/** Return a newly allocated trn_cell_extension with all elements set + * to zero. */ -cell_extension_t *cell_extension_new(void); -/** Release all storage held by the cell_extension in 'victim'. (Do - * nothing if 'victim' is NULL.) +trn_cell_extension_t *trn_cell_extension_new(void); +/** Release all storage held by the trn_cell_extension in 'victim'. + * (Do nothing if 'victim' is NULL.) */ -void cell_extension_free(cell_extension_t *victim); -/** Try to parse a cell_extension from the buffer in 'input', using up - * to 'len_in' bytes from the input buffer. On success, return the - * number of bytes consumed and set *output to the newly allocated - * cell_extension_t. On failure, return -2 if the input appears - * truncated, and -1 if the input is otherwise invalid. +void trn_cell_extension_free(trn_cell_extension_t *victim); +/** Try to parse a trn_cell_extension from the buffer in 'input', + * using up to 'len_in' bytes from the input buffer. On success, + * return the number of bytes consumed and set *output to the newly + * allocated trn_cell_extension_t. On failure, return -2 if the input + * appears truncated, and -1 if the input is otherwise invalid. */ -ssize_t cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * cell_extension in 'obj'. On failure, return a negative value. Note - * that this value may be an overestimate, and can even be an + * trn_cell_extension in 'obj'. On failure, return a negative value. + * Note that this value may be an overestimate, and can even be an * underestimate for certain unencodeable objects. */ -ssize_t cell_extension_encoded_len(const cell_extension_t *obj); -/** Try to encode the cell_extension from 'input' into the buffer at - * 'output', using up to 'avail' bytes of the output buffer. On +ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj); +/** Try to encode the trn_cell_extension from 'input' into the buffer + * at 'output', using up to 'avail' bytes of the output buffer. On * success, return the number of bytes used. On failure, return -2 if * the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t cell_extension_encode(uint8_t *output, size_t avail, const cell_extension_t *input); -/** Check whether the internal state of the cell_extension in 'obj' is - * consistent. Return NULL if it is, and a short message if it is not. +ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input); +/** Check whether the internal state of the trn_cell_extension in + * 'obj' is consistent. Return NULL if it is, and a short message if + * it is not. */ -const char *cell_extension_check(const cell_extension_t *obj); +const char *trn_cell_extension_check(const trn_cell_extension_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int cell_extension_clear_errors(cell_extension_t *obj); -/** Return the value of the num field of the cell_extension_t in 'inp' +int trn_cell_extension_clear_errors(trn_cell_extension_t *obj); +/** Return the value of the num field of the trn_cell_extension_t in + * 'inp' */ -uint8_t cell_extension_get_num(const cell_extension_t *inp); -/** Set the value of the num field of the cell_extension_t in 'inp' to - * 'val'. Return 0 on success; return -1 and set the error code on - * 'inp' on failure. +uint8_t trn_cell_extension_get_num(const trn_cell_extension_t *inp); +/** Set the value of the num field of the trn_cell_extension_t in + * 'inp' to 'val'. Return 0 on success; return -1 and set the error + * code on 'inp' on failure. */ -int cell_extension_set_num(cell_extension_t *inp, uint8_t val); +int trn_cell_extension_set_num(trn_cell_extension_t *inp, uint8_t val); /** Return the length of the dynamic array holding the fields field of - * the cell_extension_t in 'inp'. + * the trn_cell_extension_t in 'inp'. */ -size_t cell_extension_getlen_fields(const cell_extension_t *inp); +size_t trn_cell_extension_getlen_fields(const trn_cell_extension_t *inp); /** Return the element at position 'idx' of the dynamic array field - * fields of the cell_extension_t in 'inp'. + * fields of the trn_cell_extension_t in 'inp'. */ -struct cell_extension_fields_st * cell_extension_get_fields(cell_extension_t *inp, size_t idx); -/** As cell_extension_get_fields, but take and return a const pointer +struct trn_cell_extension_fields_st * trn_cell_extension_get_fields(trn_cell_extension_t *inp, size_t idx); +/** As trn_cell_extension_get_fields, but take and return a const + * pointer */ - const struct cell_extension_fields_st * cell_extension_getconst_fields(const cell_extension_t *inp, size_t idx); + const struct trn_cell_extension_fields_st * trn_cell_extension_getconst_fields(const trn_cell_extension_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * fields of the cell_extension_t in 'inp', so that it will hold the - * value 'elt'. Free the previous value, if any. + * fields of the trn_cell_extension_t in 'inp', so that it will hold + * the value 'elt'. Free the previous value, if any. */ -int cell_extension_set_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt); -/** As cell_extension_set_fields, but does not free the previous +int trn_cell_extension_set_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt); +/** As trn_cell_extension_set_fields, but does not free the previous * value. */ -int cell_extension_set0_fields(cell_extension_t *inp, size_t idx, struct cell_extension_fields_st * elt); +int trn_cell_extension_set0_fields(trn_cell_extension_t *inp, size_t idx, struct trn_cell_extension_fields_st * elt); /** Append a new element 'elt' to the dynamic array field fields of - * the cell_extension_t in 'inp'. + * the trn_cell_extension_t in 'inp'. */ -int cell_extension_add_fields(cell_extension_t *inp, struct cell_extension_fields_st * elt); +int trn_cell_extension_add_fields(trn_cell_extension_t *inp, struct trn_cell_extension_fields_st * elt); /** Return a pointer to the variable-length array field fields of * 'inp'. */ -struct cell_extension_fields_st * * cell_extension_getarray_fields(cell_extension_t *inp); -/** As cell_extension_get_fields, but take and return a const pointer +struct trn_cell_extension_fields_st * * trn_cell_extension_getarray_fields(trn_cell_extension_t *inp); +/** As trn_cell_extension_get_fields, but take and return a const + * pointer */ -const struct cell_extension_fields_st * const * cell_extension_getconstarray_fields(const cell_extension_t *inp); +const struct trn_cell_extension_fields_st * const * trn_cell_extension_getconstarray_fields(const trn_cell_extension_t *inp); /** Change the length of the variable-length array field fields of * 'inp' to 'newlen'.Fill extra elements with NULL; free removed * elements. Return 0 on success; return -1 and set the error code on * 'inp' on failure. */ -int cell_extension_setlen_fields(cell_extension_t *inp, size_t newlen); +int trn_cell_extension_setlen_fields(trn_cell_extension_t *inp, size_t newlen); #endif diff --git a/src/trunnel/hs/cell_common.trunnel b/src/trunnel/hs/cell_common.trunnel index 1bbec5a1fe..1aa6999de7 100644 --- a/src/trunnel/hs/cell_common.trunnel +++ b/src/trunnel/hs/cell_common.trunnel @@ -1,12 +1,12 @@ /* This file contains common data structure that cells use. */ -struct cell_extension_fields { +struct trn_cell_extension_fields { u8 field_type; u8 field_len; u8 field[field_len]; }; -struct cell_extension { +struct trn_cell_extension { u8 num; - struct cell_extension_fields fields[num]; + struct trn_cell_extension_fields fields[num]; }; diff --git a/src/trunnel/hs/cell_establish_intro.c b/src/trunnel/hs/cell_establish_intro.c index 633bd7c214..22e198c369 100644 --- a/src/trunnel/hs/cell_establish_intro.c +++ b/src/trunnel/hs/cell_establish_intro.c @@ -28,18 +28,18 @@ int cellestablishintro_deadcode_dummy__ = 0; } \ } while (0) -typedef struct cell_extension_st cell_extension_t; -cell_extension_t *cell_extension_new(void); -void cell_extension_free(cell_extension_t *victim); -ssize_t cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in); -ssize_t cell_extension_encoded_len(const cell_extension_t *obj); -ssize_t cell_extension_encode(uint8_t *output, size_t avail, const cell_extension_t *input); -const char *cell_extension_check(const cell_extension_t *obj); -int cell_extension_clear_errors(cell_extension_t *obj); -hs_cell_establish_intro_t * -hs_cell_establish_intro_new(void) -{ - hs_cell_establish_intro_t *val = trunnel_calloc(1, sizeof(hs_cell_establish_intro_t)); +typedef struct trn_cell_extension_st trn_cell_extension_t; +trn_cell_extension_t *trn_cell_extension_new(void); +void trn_cell_extension_free(trn_cell_extension_t *victim); +ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj); +ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input); +const char *trn_cell_extension_check(const trn_cell_extension_t *obj); +int trn_cell_extension_clear_errors(trn_cell_extension_t *obj); +trn_cell_establish_intro_t * +trn_cell_establish_intro_new(void) +{ + trn_cell_establish_intro_t *val = trunnel_calloc(1, sizeof(trn_cell_establish_intro_t)); if (NULL == val) return NULL; return val; @@ -48,39 +48,39 @@ hs_cell_establish_intro_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_establish_intro_clear(hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_clear(trn_cell_establish_intro_t *obj) { (void) obj; TRUNNEL_DYNARRAY_WIPE(&obj->auth_key); TRUNNEL_DYNARRAY_CLEAR(&obj->auth_key); - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; TRUNNEL_DYNARRAY_WIPE(&obj->sig); TRUNNEL_DYNARRAY_CLEAR(&obj->sig); } void -hs_cell_establish_intro_free(hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_free(trn_cell_establish_intro_t *obj) { if (obj == NULL) return; - hs_cell_establish_intro_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_establish_intro_t)); + trn_cell_establish_intro_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_establish_intro_t)); trunnel_free_(obj); } const uint8_t * -hs_cell_establish_intro_get_start_cell(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_start_cell(const trn_cell_establish_intro_t *inp) { return inp->start_cell; } uint8_t -hs_cell_establish_intro_get_auth_key_type(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_auth_key_type(const trn_cell_establish_intro_t *inp) { return inp->auth_key_type; } int -hs_cell_establish_intro_set_auth_key_type(hs_cell_establish_intro_t *inp, uint8_t val) +trn_cell_establish_intro_set_auth_key_type(trn_cell_establish_intro_t *inp, uint8_t val) { if (! ((val == 0 || val == 1 || val == 2))) { TRUNNEL_SET_ERROR_CODE(inp); @@ -90,41 +90,41 @@ hs_cell_establish_intro_set_auth_key_type(hs_cell_establish_intro_t *inp, uint8_ return 0; } uint16_t -hs_cell_establish_intro_get_auth_key_len(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_auth_key_len(const trn_cell_establish_intro_t *inp) { return inp->auth_key_len; } int -hs_cell_establish_intro_set_auth_key_len(hs_cell_establish_intro_t *inp, uint16_t val) +trn_cell_establish_intro_set_auth_key_len(trn_cell_establish_intro_t *inp, uint16_t val) { inp->auth_key_len = val; return 0; } size_t -hs_cell_establish_intro_getlen_auth_key(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getlen_auth_key(const trn_cell_establish_intro_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->auth_key); } uint8_t -hs_cell_establish_intro_get_auth_key(hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_get_auth_key(trn_cell_establish_intro_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->auth_key, idx); } uint8_t -hs_cell_establish_intro_getconst_auth_key(const hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_getconst_auth_key(const trn_cell_establish_intro_t *inp, size_t idx) { - return hs_cell_establish_intro_get_auth_key((hs_cell_establish_intro_t*)inp, idx); + return trn_cell_establish_intro_get_auth_key((trn_cell_establish_intro_t*)inp, idx); } int -hs_cell_establish_intro_set_auth_key(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt) +trn_cell_establish_intro_set_auth_key(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->auth_key, idx, elt); return 0; } int -hs_cell_establish_intro_add_auth_key(hs_cell_establish_intro_t *inp, uint8_t elt) +trn_cell_establish_intro_add_auth_key(trn_cell_establish_intro_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT16_MAX if (inp->auth_key.n_ == UINT16_MAX) @@ -138,17 +138,17 @@ hs_cell_establish_intro_add_auth_key(hs_cell_establish_intro_t *inp, uint8_t elt } uint8_t * -hs_cell_establish_intro_getarray_auth_key(hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getarray_auth_key(trn_cell_establish_intro_t *inp) { return inp->auth_key.elts_; } const uint8_t * -hs_cell_establish_intro_getconstarray_auth_key(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getconstarray_auth_key(const trn_cell_establish_intro_t *inp) { - return (const uint8_t *)hs_cell_establish_intro_getarray_auth_key((hs_cell_establish_intro_t*)inp); + return (const uint8_t *)trn_cell_establish_intro_getarray_auth_key((trn_cell_establish_intro_t*)inp); } int -hs_cell_establish_intro_setlen_auth_key(hs_cell_establish_intro_t *inp, size_t newlen) +trn_cell_establish_intro_setlen_auth_key(trn_cell_establish_intro_t *inp, size_t newlen) { uint8_t *newptr; #if UINT16_MAX < SIZE_MAX @@ -167,54 +167,54 @@ hs_cell_establish_intro_setlen_auth_key(hs_cell_establish_intro_t *inp, size_t n TRUNNEL_SET_ERROR_CODE(inp); return -1; } -struct cell_extension_st * -hs_cell_establish_intro_get_extensions(hs_cell_establish_intro_t *inp) +struct trn_cell_extension_st * +trn_cell_establish_intro_get_extensions(trn_cell_establish_intro_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_establish_intro_getconst_extensions(const hs_cell_establish_intro_t *inp) +const struct trn_cell_extension_st * +trn_cell_establish_intro_getconst_extensions(const trn_cell_establish_intro_t *inp) { - return hs_cell_establish_intro_get_extensions((hs_cell_establish_intro_t*) inp); + return trn_cell_establish_intro_get_extensions((trn_cell_establish_intro_t*) inp); } int -hs_cell_establish_intro_set_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val) +trn_cell_establish_intro_set_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_establish_intro_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_establish_intro_set0_extensions(inp, val); } int -hs_cell_establish_intro_set0_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val) +trn_cell_establish_intro_set0_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } const uint8_t * -hs_cell_establish_intro_get_end_mac_fields(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_end_mac_fields(const trn_cell_establish_intro_t *inp) { return inp->end_mac_fields; } size_t -hs_cell_establish_intro_getlen_handshake_mac(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getlen_handshake_mac(const trn_cell_establish_intro_t *inp) { (void)inp; return TRUNNEL_SHA3_256_LEN; } uint8_t -hs_cell_establish_intro_get_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_get_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx) { trunnel_assert(idx < TRUNNEL_SHA3_256_LEN); return inp->handshake_mac[idx]; } uint8_t -hs_cell_establish_intro_getconst_handshake_mac(const hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_getconst_handshake_mac(const trn_cell_establish_intro_t *inp, size_t idx) { - return hs_cell_establish_intro_get_handshake_mac((hs_cell_establish_intro_t*)inp, idx); + return trn_cell_establish_intro_get_handshake_mac((trn_cell_establish_intro_t*)inp, idx); } int -hs_cell_establish_intro_set_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt) +trn_cell_establish_intro_set_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt) { trunnel_assert(idx < TRUNNEL_SHA3_256_LEN); inp->handshake_mac[idx] = elt; @@ -222,56 +222,56 @@ hs_cell_establish_intro_set_handshake_mac(hs_cell_establish_intro_t *inp, size_t } uint8_t * -hs_cell_establish_intro_getarray_handshake_mac(hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getarray_handshake_mac(trn_cell_establish_intro_t *inp) { return inp->handshake_mac; } const uint8_t * -hs_cell_establish_intro_getconstarray_handshake_mac(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getconstarray_handshake_mac(const trn_cell_establish_intro_t *inp) { - return (const uint8_t *)hs_cell_establish_intro_getarray_handshake_mac((hs_cell_establish_intro_t*)inp); + return (const uint8_t *)trn_cell_establish_intro_getarray_handshake_mac((trn_cell_establish_intro_t*)inp); } const uint8_t * -hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_end_sig_fields(const trn_cell_establish_intro_t *inp) { return inp->end_sig_fields; } uint16_t -hs_cell_establish_intro_get_sig_len(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_get_sig_len(const trn_cell_establish_intro_t *inp) { return inp->sig_len; } int -hs_cell_establish_intro_set_sig_len(hs_cell_establish_intro_t *inp, uint16_t val) +trn_cell_establish_intro_set_sig_len(trn_cell_establish_intro_t *inp, uint16_t val) { inp->sig_len = val; return 0; } size_t -hs_cell_establish_intro_getlen_sig(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getlen_sig(const trn_cell_establish_intro_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->sig); } uint8_t -hs_cell_establish_intro_get_sig(hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_get_sig(trn_cell_establish_intro_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->sig, idx); } uint8_t -hs_cell_establish_intro_getconst_sig(const hs_cell_establish_intro_t *inp, size_t idx) +trn_cell_establish_intro_getconst_sig(const trn_cell_establish_intro_t *inp, size_t idx) { - return hs_cell_establish_intro_get_sig((hs_cell_establish_intro_t*)inp, idx); + return trn_cell_establish_intro_get_sig((trn_cell_establish_intro_t*)inp, idx); } int -hs_cell_establish_intro_set_sig(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt) +trn_cell_establish_intro_set_sig(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->sig, idx, elt); return 0; } int -hs_cell_establish_intro_add_sig(hs_cell_establish_intro_t *inp, uint8_t elt) +trn_cell_establish_intro_add_sig(trn_cell_establish_intro_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT16_MAX if (inp->sig.n_ == UINT16_MAX) @@ -285,17 +285,17 @@ hs_cell_establish_intro_add_sig(hs_cell_establish_intro_t *inp, uint8_t elt) } uint8_t * -hs_cell_establish_intro_getarray_sig(hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getarray_sig(trn_cell_establish_intro_t *inp) { return inp->sig.elts_; } const uint8_t * -hs_cell_establish_intro_getconstarray_sig(const hs_cell_establish_intro_t *inp) +trn_cell_establish_intro_getconstarray_sig(const trn_cell_establish_intro_t *inp) { - return (const uint8_t *)hs_cell_establish_intro_getarray_sig((hs_cell_establish_intro_t*)inp); + return (const uint8_t *)trn_cell_establish_intro_getarray_sig((trn_cell_establish_intro_t*)inp); } int -hs_cell_establish_intro_setlen_sig(hs_cell_establish_intro_t *inp, size_t newlen) +trn_cell_establish_intro_setlen_sig(trn_cell_establish_intro_t *inp, size_t newlen) { uint8_t *newptr; #if UINT16_MAX < SIZE_MAX @@ -315,7 +315,7 @@ hs_cell_establish_intro_setlen_sig(hs_cell_establish_intro_t *inp, size_t newlen return -1; } const char * -hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_check(const trn_cell_establish_intro_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -327,7 +327,7 @@ hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj) return "Length mismatch for auth_key"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } if (TRUNNEL_DYNARRAY_LEN(&obj->sig) != obj->sig_len) @@ -336,11 +336,11 @@ hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj) } ssize_t -hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_encoded_len(const trn_cell_establish_intro_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_establish_intro_check(obj)) + if (NULL != trn_cell_establish_intro_check(obj)) return -1; @@ -353,8 +353,8 @@ hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj) /* Length of u8 auth_key[auth_key_len] */ result += TRUNNEL_DYNARRAY_LEN(&obj->auth_key); - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); /* Length of u8 handshake_mac[TRUNNEL_SHA3_256_LEN] */ result += TRUNNEL_SHA3_256_LEN; @@ -367,24 +367,24 @@ hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj) return result; } int -hs_cell_establish_intro_clear_errors(hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_clear_errors(trn_cell_establish_intro_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_establish_intro_encode(uint8_t *output, const size_t avail, const hs_cell_establish_intro_t *obj) +trn_cell_establish_intro_encode(uint8_t *output, const size_t avail, const trn_cell_establish_intro_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_establish_intro_encoded_len(obj); + const ssize_t encoded_len = trn_cell_establish_intro_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_establish_intro_check(obj))) + if (NULL != (msg = trn_cell_establish_intro_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -417,9 +417,9 @@ hs_cell_establish_intro_encode(uint8_t *output, const size_t avail, const hs_cel written += elt_len; ptr += elt_len; } - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -474,11 +474,11 @@ hs_cell_establish_intro_encode(uint8_t *output, const size_t avail, const hs_cel return result; } -/** As hs_cell_establish_intro_parse(), but do not allocate the output - * object. +/** As trn_cell_establish_intro_parse(), but do not allocate the + * output object. */ static ssize_t -hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_establish_intro_parse_into(trn_cell_establish_intro_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -506,8 +506,8 @@ hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t memcpy(obj->auth_key.elts_, ptr, obj->auth_key_len); ptr += obj->auth_key_len; remaining -= obj->auth_key_len; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -548,23 +548,23 @@ hs_cell_establish_intro_parse_into(hs_cell_establish_intro_t *obj, const uint8_t } ssize_t -hs_cell_establish_intro_parse(hs_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in) +trn_cell_establish_intro_parse(trn_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_establish_intro_new(); + *output = trn_cell_establish_intro_new(); if (NULL == *output) return -1; - result = hs_cell_establish_intro_parse_into(*output, input, len_in); + result = trn_cell_establish_intro_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_establish_intro_free(*output); + trn_cell_establish_intro_free(*output); *output = NULL; } return result; } -hs_cell_intro_established_t * -hs_cell_intro_established_new(void) +trn_cell_intro_established_t * +trn_cell_intro_established_new(void) { - hs_cell_intro_established_t *val = trunnel_calloc(1, sizeof(hs_cell_intro_established_t)); + trn_cell_intro_established_t *val = trunnel_calloc(1, sizeof(trn_cell_intro_established_t)); if (NULL == val) return NULL; return val; @@ -573,48 +573,48 @@ hs_cell_intro_established_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_intro_established_clear(hs_cell_intro_established_t *obj) +trn_cell_intro_established_clear(trn_cell_intro_established_t *obj) { (void) obj; - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; } void -hs_cell_intro_established_free(hs_cell_intro_established_t *obj) +trn_cell_intro_established_free(trn_cell_intro_established_t *obj) { if (obj == NULL) return; - hs_cell_intro_established_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_intro_established_t)); + trn_cell_intro_established_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_intro_established_t)); trunnel_free_(obj); } -struct cell_extension_st * -hs_cell_intro_established_get_extensions(hs_cell_intro_established_t *inp) +struct trn_cell_extension_st * +trn_cell_intro_established_get_extensions(trn_cell_intro_established_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_intro_established_getconst_extensions(const hs_cell_intro_established_t *inp) +const struct trn_cell_extension_st * +trn_cell_intro_established_getconst_extensions(const trn_cell_intro_established_t *inp) { - return hs_cell_intro_established_get_extensions((hs_cell_intro_established_t*) inp); + return trn_cell_intro_established_get_extensions((trn_cell_intro_established_t*) inp); } int -hs_cell_intro_established_set_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val) +trn_cell_intro_established_set_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_intro_established_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_intro_established_set0_extensions(inp, val); } int -hs_cell_intro_established_set0_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val) +trn_cell_intro_established_set0_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } const char * -hs_cell_intro_established_check(const hs_cell_intro_established_t *obj) +trn_cell_intro_established_check(const trn_cell_intro_established_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -622,53 +622,53 @@ hs_cell_intro_established_check(const hs_cell_intro_established_t *obj) return "A set function failed on this object"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } return NULL; } ssize_t -hs_cell_intro_established_encoded_len(const hs_cell_intro_established_t *obj) +trn_cell_intro_established_encoded_len(const trn_cell_intro_established_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_intro_established_check(obj)) + if (NULL != trn_cell_intro_established_check(obj)) return -1; - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); return result; } int -hs_cell_intro_established_clear_errors(hs_cell_intro_established_t *obj) +trn_cell_intro_established_clear_errors(trn_cell_intro_established_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_intro_established_encode(uint8_t *output, const size_t avail, const hs_cell_intro_established_t *obj) +trn_cell_intro_established_encode(uint8_t *output, const size_t avail, const trn_cell_intro_established_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_intro_established_encoded_len(obj); + const ssize_t encoded_len = trn_cell_intro_established_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_intro_established_check(obj))) + if (NULL != (msg = trn_cell_intro_established_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN trunnel_assert(encoded_len >= 0); #endif - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -694,19 +694,19 @@ hs_cell_intro_established_encode(uint8_t *output, const size_t avail, const hs_c return result; } -/** As hs_cell_intro_established_parse(), but do not allocate the +/** As trn_cell_intro_established_parse(), but do not allocate the * output object. */ static ssize_t -hs_cell_intro_established_parse_into(hs_cell_intro_established_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_intro_established_parse_into(trn_cell_intro_established_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; ssize_t result = 0; (void)result; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -720,15 +720,15 @@ hs_cell_intro_established_parse_into(hs_cell_intro_established_t *obj, const uin } ssize_t -hs_cell_intro_established_parse(hs_cell_intro_established_t **output, const uint8_t *input, const size_t len_in) +trn_cell_intro_established_parse(trn_cell_intro_established_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_intro_established_new(); + *output = trn_cell_intro_established_new(); if (NULL == *output) return -1; - result = hs_cell_intro_established_parse_into(*output, input, len_in); + result = trn_cell_intro_established_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_intro_established_free(*output); + trn_cell_intro_established_free(*output); *output = NULL; } return result; diff --git a/src/trunnel/hs/cell_establish_intro.h b/src/trunnel/hs/cell_establish_intro.h index 725d47cd85..2f0d893659 100644 --- a/src/trunnel/hs/cell_establish_intro.h +++ b/src/trunnel/hs/cell_establish_intro.h @@ -8,15 +8,15 @@ #include <stdint.h> #include "trunnel.h" -struct cell_extension_st; +struct trn_cell_extension_st; #define TRUNNEL_SHA3_256_LEN 32 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_ESTABLISH_INTRO) -struct hs_cell_establish_intro_st { +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_ESTABLISH_INTRO) +struct trn_cell_establish_intro_st { const uint8_t *start_cell; uint8_t auth_key_type; uint16_t auth_key_len; TRUNNEL_DYNARRAY_HEAD(, uint8_t) auth_key; - struct cell_extension_st *extensions; + struct trn_cell_extension_st *extensions; const uint8_t *end_mac_fields; uint8_t handshake_mac[TRUNNEL_SHA3_256_LEN]; const uint8_t *end_sig_fields; @@ -25,251 +25,252 @@ struct hs_cell_establish_intro_st { uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_establish_intro_st hs_cell_establish_intro_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRO_ESTABLISHED) -struct hs_cell_intro_established_st { - struct cell_extension_st *extensions; +typedef struct trn_cell_establish_intro_st trn_cell_establish_intro_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRO_ESTABLISHED) +struct trn_cell_intro_established_st { + struct trn_cell_extension_st *extensions; uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_intro_established_st hs_cell_intro_established_t; -/** Return a newly allocated hs_cell_establish_intro with all elements - * set to zero. +typedef struct trn_cell_intro_established_st trn_cell_intro_established_t; +/** Return a newly allocated trn_cell_establish_intro with all + * elements set to zero. */ -hs_cell_establish_intro_t *hs_cell_establish_intro_new(void); -/** Release all storage held by the hs_cell_establish_intro in +trn_cell_establish_intro_t *trn_cell_establish_intro_new(void); +/** Release all storage held by the trn_cell_establish_intro in * 'victim'. (Do nothing if 'victim' is NULL.) */ -void hs_cell_establish_intro_free(hs_cell_establish_intro_t *victim); -/** Try to parse a hs_cell_establish_intro from the buffer in 'input', - * using up to 'len_in' bytes from the input buffer. On success, - * return the number of bytes consumed and set *output to the newly - * allocated hs_cell_establish_intro_t. On failure, return -2 if the - * input appears truncated, and -1 if the input is otherwise invalid. +void trn_cell_establish_intro_free(trn_cell_establish_intro_t *victim); +/** Try to parse a trn_cell_establish_intro from the buffer in + * 'input', using up to 'len_in' bytes from the input buffer. On + * success, return the number of bytes consumed and set *output to the + * newly allocated trn_cell_establish_intro_t. On failure, return -2 + * if the input appears truncated, and -1 if the input is otherwise + * invalid. */ -ssize_t hs_cell_establish_intro_parse(hs_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_establish_intro_parse(trn_cell_establish_intro_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_establish_intro in 'obj'. On failure, return a negative + * trn_cell_establish_intro in 'obj'. On failure, return a negative * value. Note that this value may be an overestimate, and can even be * an underestimate for certain unencodeable objects. */ -ssize_t hs_cell_establish_intro_encoded_len(const hs_cell_establish_intro_t *obj); -/** Try to encode the hs_cell_establish_intro from 'input' into the +ssize_t trn_cell_establish_intro_encoded_len(const trn_cell_establish_intro_t *obj); +/** Try to encode the trn_cell_establish_intro from 'input' into the * buffer at 'output', using up to 'avail' bytes of the output buffer. * On success, return the number of bytes used. On failure, return -2 * if the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t hs_cell_establish_intro_encode(uint8_t *output, size_t avail, const hs_cell_establish_intro_t *input); -/** Check whether the internal state of the hs_cell_establish_intro in - * 'obj' is consistent. Return NULL if it is, and a short message if - * it is not. +ssize_t trn_cell_establish_intro_encode(uint8_t *output, size_t avail, const trn_cell_establish_intro_t *input); +/** Check whether the internal state of the trn_cell_establish_intro + * in 'obj' is consistent. Return NULL if it is, and a short message + * if it is not. */ -const char *hs_cell_establish_intro_check(const hs_cell_establish_intro_t *obj); +const char *trn_cell_establish_intro_check(const trn_cell_establish_intro_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_establish_intro_clear_errors(hs_cell_establish_intro_t *obj); +int trn_cell_establish_intro_clear_errors(trn_cell_establish_intro_t *obj); /** Return the position for start_cell when we parsed this object */ -const uint8_t * hs_cell_establish_intro_get_start_cell(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_get_start_cell(const trn_cell_establish_intro_t *inp); /** Return the value of the auth_key_type field of the - * hs_cell_establish_intro_t in 'inp' + * trn_cell_establish_intro_t in 'inp' */ -uint8_t hs_cell_establish_intro_get_auth_key_type(const hs_cell_establish_intro_t *inp); +uint8_t trn_cell_establish_intro_get_auth_key_type(const trn_cell_establish_intro_t *inp); /** Set the value of the auth_key_type field of the - * hs_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_set_auth_key_type(hs_cell_establish_intro_t *inp, uint8_t val); +int trn_cell_establish_intro_set_auth_key_type(trn_cell_establish_intro_t *inp, uint8_t val); /** Return the value of the auth_key_len field of the - * hs_cell_establish_intro_t in 'inp' + * trn_cell_establish_intro_t in 'inp' */ -uint16_t hs_cell_establish_intro_get_auth_key_len(const hs_cell_establish_intro_t *inp); +uint16_t trn_cell_establish_intro_get_auth_key_len(const trn_cell_establish_intro_t *inp); /** Set the value of the auth_key_len field of the - * hs_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_set_auth_key_len(hs_cell_establish_intro_t *inp, uint16_t val); +int trn_cell_establish_intro_set_auth_key_len(trn_cell_establish_intro_t *inp, uint16_t val); /** Return the length of the dynamic array holding the auth_key field - * of the hs_cell_establish_intro_t in 'inp'. + * of the trn_cell_establish_intro_t in 'inp'. */ -size_t hs_cell_establish_intro_getlen_auth_key(const hs_cell_establish_intro_t *inp); +size_t trn_cell_establish_intro_getlen_auth_key(const trn_cell_establish_intro_t *inp); /** Return the element at position 'idx' of the dynamic array field - * auth_key of the hs_cell_establish_intro_t in 'inp'. + * auth_key of the trn_cell_establish_intro_t in 'inp'. */ -uint8_t hs_cell_establish_intro_get_auth_key(hs_cell_establish_intro_t *inp, size_t idx); -/** As hs_cell_establish_intro_get_auth_key, but take and return a +uint8_t trn_cell_establish_intro_get_auth_key(trn_cell_establish_intro_t *inp, size_t idx); +/** As trn_cell_establish_intro_get_auth_key, but take and return a * const pointer */ -uint8_t hs_cell_establish_intro_getconst_auth_key(const hs_cell_establish_intro_t *inp, size_t idx); +uint8_t trn_cell_establish_intro_getconst_auth_key(const trn_cell_establish_intro_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * auth_key of the hs_cell_establish_intro_t in 'inp', so that it will - * hold the value 'elt'. + * auth_key of the trn_cell_establish_intro_t in 'inp', so that it + * will hold the value 'elt'. */ -int hs_cell_establish_intro_set_auth_key(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt); +int trn_cell_establish_intro_set_auth_key(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field auth_key of - * the hs_cell_establish_intro_t in 'inp'. + * the trn_cell_establish_intro_t in 'inp'. */ -int hs_cell_establish_intro_add_auth_key(hs_cell_establish_intro_t *inp, uint8_t elt); +int trn_cell_establish_intro_add_auth_key(trn_cell_establish_intro_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field auth_key of * 'inp'. */ -uint8_t * hs_cell_establish_intro_getarray_auth_key(hs_cell_establish_intro_t *inp); -/** As hs_cell_establish_intro_get_auth_key, but take and return a +uint8_t * trn_cell_establish_intro_getarray_auth_key(trn_cell_establish_intro_t *inp); +/** As trn_cell_establish_intro_get_auth_key, but take and return a * const pointer */ -const uint8_t * hs_cell_establish_intro_getconstarray_auth_key(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_getconstarray_auth_key(const trn_cell_establish_intro_t *inp); /** Change the length of the variable-length array field auth_key of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_setlen_auth_key(hs_cell_establish_intro_t *inp, size_t newlen); +int trn_cell_establish_intro_setlen_auth_key(trn_cell_establish_intro_t *inp, size_t newlen); /** Return the value of the extensions field of the - * hs_cell_establish_intro_t in 'inp' + * trn_cell_establish_intro_t in 'inp' */ -struct cell_extension_st * hs_cell_establish_intro_get_extensions(hs_cell_establish_intro_t *inp); -/** As hs_cell_establish_intro_get_extensions, but take and return a +struct trn_cell_extension_st * trn_cell_establish_intro_get_extensions(trn_cell_establish_intro_t *inp); +/** As trn_cell_establish_intro_get_extensions, but take and return a * const pointer */ -const struct cell_extension_st * hs_cell_establish_intro_getconst_extensions(const hs_cell_establish_intro_t *inp); +const struct trn_cell_extension_st * trn_cell_establish_intro_getconst_extensions(const trn_cell_establish_intro_t *inp); /** Set the value of the extensions field of the - * hs_cell_establish_intro_t in 'inp' to 'val'. Free the old value if + * trn_cell_establish_intro_t in 'inp' to 'val'. Free the old value if * any. Steals the referenceto 'val'.Return 0 on success; return -1 * and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_set_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val); -/** As hs_cell_establish_intro_set_extensions, but does not free the +int trn_cell_establish_intro_set_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_establish_intro_set_extensions, but does not free the * previous value. */ -int hs_cell_establish_intro_set0_extensions(hs_cell_establish_intro_t *inp, struct cell_extension_st *val); +int trn_cell_establish_intro_set0_extensions(trn_cell_establish_intro_t *inp, struct trn_cell_extension_st *val); /** Return the position for end_mac_fields when we parsed this object */ -const uint8_t * hs_cell_establish_intro_get_end_mac_fields(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_get_end_mac_fields(const trn_cell_establish_intro_t *inp); /** Return the (constant) length of the array holding the - * handshake_mac field of the hs_cell_establish_intro_t in 'inp'. + * handshake_mac field of the trn_cell_establish_intro_t in 'inp'. */ -size_t hs_cell_establish_intro_getlen_handshake_mac(const hs_cell_establish_intro_t *inp); +size_t trn_cell_establish_intro_getlen_handshake_mac(const trn_cell_establish_intro_t *inp); /** Return the element at position 'idx' of the fixed array field - * handshake_mac of the hs_cell_establish_intro_t in 'inp'. + * handshake_mac of the trn_cell_establish_intro_t in 'inp'. */ -uint8_t hs_cell_establish_intro_get_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx); -/** As hs_cell_establish_intro_get_handshake_mac, but take and return +uint8_t trn_cell_establish_intro_get_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx); +/** As trn_cell_establish_intro_get_handshake_mac, but take and return * a const pointer */ -uint8_t hs_cell_establish_intro_getconst_handshake_mac(const hs_cell_establish_intro_t *inp, size_t idx); +uint8_t trn_cell_establish_intro_getconst_handshake_mac(const trn_cell_establish_intro_t *inp, size_t idx); /** Change the element at position 'idx' of the fixed array field - * handshake_mac of the hs_cell_establish_intro_t in 'inp', so that it - * will hold the value 'elt'. + * handshake_mac of the trn_cell_establish_intro_t in 'inp', so that + * it will hold the value 'elt'. */ -int hs_cell_establish_intro_set_handshake_mac(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt); +int trn_cell_establish_intro_set_handshake_mac(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt); /** Return a pointer to the TRUNNEL_SHA3_256_LEN-element array field * handshake_mac of 'inp'. */ -uint8_t * hs_cell_establish_intro_getarray_handshake_mac(hs_cell_establish_intro_t *inp); -/** As hs_cell_establish_intro_get_handshake_mac, but take and return +uint8_t * trn_cell_establish_intro_getarray_handshake_mac(trn_cell_establish_intro_t *inp); +/** As trn_cell_establish_intro_get_handshake_mac, but take and return * a const pointer */ -const uint8_t * hs_cell_establish_intro_getconstarray_handshake_mac(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_getconstarray_handshake_mac(const trn_cell_establish_intro_t *inp); /** Return the position for end_sig_fields when we parsed this object */ -const uint8_t * hs_cell_establish_intro_get_end_sig_fields(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_get_end_sig_fields(const trn_cell_establish_intro_t *inp); /** Return the value of the sig_len field of the - * hs_cell_establish_intro_t in 'inp' + * trn_cell_establish_intro_t in 'inp' */ -uint16_t hs_cell_establish_intro_get_sig_len(const hs_cell_establish_intro_t *inp); +uint16_t trn_cell_establish_intro_get_sig_len(const trn_cell_establish_intro_t *inp); /** Set the value of the sig_len field of the - * hs_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; + * trn_cell_establish_intro_t in 'inp' to 'val'. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_set_sig_len(hs_cell_establish_intro_t *inp, uint16_t val); +int trn_cell_establish_intro_set_sig_len(trn_cell_establish_intro_t *inp, uint16_t val); /** Return the length of the dynamic array holding the sig field of - * the hs_cell_establish_intro_t in 'inp'. + * the trn_cell_establish_intro_t in 'inp'. */ -size_t hs_cell_establish_intro_getlen_sig(const hs_cell_establish_intro_t *inp); +size_t trn_cell_establish_intro_getlen_sig(const trn_cell_establish_intro_t *inp); /** Return the element at position 'idx' of the dynamic array field - * sig of the hs_cell_establish_intro_t in 'inp'. + * sig of the trn_cell_establish_intro_t in 'inp'. */ -uint8_t hs_cell_establish_intro_get_sig(hs_cell_establish_intro_t *inp, size_t idx); -/** As hs_cell_establish_intro_get_sig, but take and return a const +uint8_t trn_cell_establish_intro_get_sig(trn_cell_establish_intro_t *inp, size_t idx); +/** As trn_cell_establish_intro_get_sig, but take and return a const * pointer */ -uint8_t hs_cell_establish_intro_getconst_sig(const hs_cell_establish_intro_t *inp, size_t idx); +uint8_t trn_cell_establish_intro_getconst_sig(const trn_cell_establish_intro_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * sig of the hs_cell_establish_intro_t in 'inp', so that it will hold - * the value 'elt'. + * sig of the trn_cell_establish_intro_t in 'inp', so that it will + * hold the value 'elt'. */ -int hs_cell_establish_intro_set_sig(hs_cell_establish_intro_t *inp, size_t idx, uint8_t elt); +int trn_cell_establish_intro_set_sig(trn_cell_establish_intro_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field sig of the - * hs_cell_establish_intro_t in 'inp'. + * trn_cell_establish_intro_t in 'inp'. */ -int hs_cell_establish_intro_add_sig(hs_cell_establish_intro_t *inp, uint8_t elt); +int trn_cell_establish_intro_add_sig(trn_cell_establish_intro_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field sig of 'inp'. */ -uint8_t * hs_cell_establish_intro_getarray_sig(hs_cell_establish_intro_t *inp); -/** As hs_cell_establish_intro_get_sig, but take and return a const +uint8_t * trn_cell_establish_intro_getarray_sig(trn_cell_establish_intro_t *inp); +/** As trn_cell_establish_intro_get_sig, but take and return a const * pointer */ -const uint8_t * hs_cell_establish_intro_getconstarray_sig(const hs_cell_establish_intro_t *inp); +const uint8_t * trn_cell_establish_intro_getconstarray_sig(const trn_cell_establish_intro_t *inp); /** Change the length of the variable-length array field sig of 'inp' * to 'newlen'.Fill extra elements with 0. Return 0 on success; return * -1 and set the error code on 'inp' on failure. */ -int hs_cell_establish_intro_setlen_sig(hs_cell_establish_intro_t *inp, size_t newlen); -/** Return a newly allocated hs_cell_intro_established with all +int trn_cell_establish_intro_setlen_sig(trn_cell_establish_intro_t *inp, size_t newlen); +/** Return a newly allocated trn_cell_intro_established with all * elements set to zero. */ -hs_cell_intro_established_t *hs_cell_intro_established_new(void); -/** Release all storage held by the hs_cell_intro_established in +trn_cell_intro_established_t *trn_cell_intro_established_new(void); +/** Release all storage held by the trn_cell_intro_established in * 'victim'. (Do nothing if 'victim' is NULL.) */ -void hs_cell_intro_established_free(hs_cell_intro_established_t *victim); -/** Try to parse a hs_cell_intro_established from the buffer in +void trn_cell_intro_established_free(trn_cell_intro_established_t *victim); +/** Try to parse a trn_cell_intro_established from the buffer in * 'input', using up to 'len_in' bytes from the input buffer. On * success, return the number of bytes consumed and set *output to the - * newly allocated hs_cell_intro_established_t. On failure, return -2 + * newly allocated trn_cell_intro_established_t. On failure, return -2 * if the input appears truncated, and -1 if the input is otherwise * invalid. */ -ssize_t hs_cell_intro_established_parse(hs_cell_intro_established_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_intro_established_parse(trn_cell_intro_established_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_intro_established in 'obj'. On failure, return a negative + * trn_cell_intro_established in 'obj'. On failure, return a negative * value. Note that this value may be an overestimate, and can even be * an underestimate for certain unencodeable objects. */ -ssize_t hs_cell_intro_established_encoded_len(const hs_cell_intro_established_t *obj); -/** Try to encode the hs_cell_intro_established from 'input' into the +ssize_t trn_cell_intro_established_encoded_len(const trn_cell_intro_established_t *obj); +/** Try to encode the trn_cell_intro_established from 'input' into the * buffer at 'output', using up to 'avail' bytes of the output buffer. * On success, return the number of bytes used. On failure, return -2 * if the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t hs_cell_intro_established_encode(uint8_t *output, size_t avail, const hs_cell_intro_established_t *input); -/** Check whether the internal state of the hs_cell_intro_established +ssize_t trn_cell_intro_established_encode(uint8_t *output, size_t avail, const trn_cell_intro_established_t *input); +/** Check whether the internal state of the trn_cell_intro_established * in 'obj' is consistent. Return NULL if it is, and a short message * if it is not. */ -const char *hs_cell_intro_established_check(const hs_cell_intro_established_t *obj); +const char *trn_cell_intro_established_check(const trn_cell_intro_established_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_intro_established_clear_errors(hs_cell_intro_established_t *obj); +int trn_cell_intro_established_clear_errors(trn_cell_intro_established_t *obj); /** Return the value of the extensions field of the - * hs_cell_intro_established_t in 'inp' + * trn_cell_intro_established_t in 'inp' */ -struct cell_extension_st * hs_cell_intro_established_get_extensions(hs_cell_intro_established_t *inp); -/** As hs_cell_intro_established_get_extensions, but take and return a - * const pointer +struct trn_cell_extension_st * trn_cell_intro_established_get_extensions(trn_cell_intro_established_t *inp); +/** As trn_cell_intro_established_get_extensions, but take and return + * a const pointer */ -const struct cell_extension_st * hs_cell_intro_established_getconst_extensions(const hs_cell_intro_established_t *inp); +const struct trn_cell_extension_st * trn_cell_intro_established_getconst_extensions(const trn_cell_intro_established_t *inp); /** Set the value of the extensions field of the - * hs_cell_intro_established_t in 'inp' to 'val'. Free the old value + * trn_cell_intro_established_t in 'inp' to 'val'. Free the old value * if any. Steals the referenceto 'val'.Return 0 on success; return -1 * and set the error code on 'inp' on failure. */ -int hs_cell_intro_established_set_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val); -/** As hs_cell_intro_established_set_extensions, but does not free the - * previous value. +int trn_cell_intro_established_set_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_intro_established_set_extensions, but does not free + * the previous value. */ -int hs_cell_intro_established_set0_extensions(hs_cell_intro_established_t *inp, struct cell_extension_st *val); +int trn_cell_intro_established_set0_extensions(trn_cell_intro_established_t *inp, struct trn_cell_extension_st *val); #endif diff --git a/src/trunnel/hs/cell_establish_intro.trunnel b/src/trunnel/hs/cell_establish_intro.trunnel index 33a133bf67..011ee62a15 100644 --- a/src/trunnel/hs/cell_establish_intro.trunnel +++ b/src/trunnel/hs/cell_establish_intro.trunnel @@ -4,12 +4,12 @@ * specified in proposal 224 section 3.1. */ -extern struct cell_extension; +extern struct trn_cell_extension; const TRUNNEL_SHA3_256_LEN = 32; /* ESTABLISH_INTRO payload. See details in section 3.1.1 */ -struct hs_cell_establish_intro { +struct trn_cell_establish_intro { /* Indicate the start of the handshake authentication data. */ @ptr start_cell; @@ -19,7 +19,7 @@ struct hs_cell_establish_intro { u8 auth_key[auth_key_len]; /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; @ptr end_mac_fields; /* Handshake MAC. */ @@ -35,7 +35,7 @@ struct hs_cell_establish_intro { /* INTRO_ESTABLISHED payload which is an acknowledge of the ESTABLISH_INTRO * cell. For legacy node, this payload is empty so the following only applies * to version >= 3. */ -struct hs_cell_intro_established { +struct trn_cell_intro_established { /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; }; diff --git a/src/trunnel/hs/cell_introduce1.c b/src/trunnel/hs/cell_introduce1.c index 5922a086dc..7501f6f196 100644 --- a/src/trunnel/hs/cell_introduce1.c +++ b/src/trunnel/hs/cell_introduce1.c @@ -28,14 +28,14 @@ int cellintroduce_deadcode_dummy__ = 0; } \ } while (0) -typedef struct cell_extension_st cell_extension_t; -cell_extension_t *cell_extension_new(void); -void cell_extension_free(cell_extension_t *victim); -ssize_t cell_extension_parse(cell_extension_t **output, const uint8_t *input, const size_t len_in); -ssize_t cell_extension_encoded_len(const cell_extension_t *obj); -ssize_t cell_extension_encode(uint8_t *output, size_t avail, const cell_extension_t *input); -const char *cell_extension_check(const cell_extension_t *obj); -int cell_extension_clear_errors(cell_extension_t *obj); +typedef struct trn_cell_extension_st trn_cell_extension_t; +trn_cell_extension_t *trn_cell_extension_new(void); +void trn_cell_extension_free(trn_cell_extension_t *victim); +ssize_t trn_cell_extension_parse(trn_cell_extension_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_extension_encoded_len(const trn_cell_extension_t *obj); +ssize_t trn_cell_extension_encode(uint8_t *output, size_t avail, const trn_cell_extension_t *input); +const char *trn_cell_extension_check(const trn_cell_extension_t *obj); +int trn_cell_extension_clear_errors(trn_cell_extension_t *obj); typedef struct link_specifier_st link_specifier_t; link_specifier_t *link_specifier_new(void); void link_specifier_free(link_specifier_t *victim); @@ -44,10 +44,10 @@ ssize_t link_specifier_encoded_len(const link_specifier_t *obj); ssize_t link_specifier_encode(uint8_t *output, size_t avail, const link_specifier_t *input); const char *link_specifier_check(const link_specifier_t *obj); int link_specifier_clear_errors(link_specifier_t *obj); -hs_cell_introduce1_t * -hs_cell_introduce1_new(void) +trn_cell_introduce1_t * +trn_cell_introduce1_new(void) { - hs_cell_introduce1_t *val = trunnel_calloc(1, sizeof(hs_cell_introduce1_t)); + trn_cell_introduce1_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce1_t)); if (NULL == val) return NULL; return val; @@ -56,47 +56,47 @@ hs_cell_introduce1_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_introduce1_clear(hs_cell_introduce1_t *obj) +trn_cell_introduce1_clear(trn_cell_introduce1_t *obj) { (void) obj; TRUNNEL_DYNARRAY_WIPE(&obj->auth_key); TRUNNEL_DYNARRAY_CLEAR(&obj->auth_key); - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; TRUNNEL_DYNARRAY_WIPE(&obj->encrypted); TRUNNEL_DYNARRAY_CLEAR(&obj->encrypted); } void -hs_cell_introduce1_free(hs_cell_introduce1_t *obj) +trn_cell_introduce1_free(trn_cell_introduce1_t *obj) { if (obj == NULL) return; - hs_cell_introduce1_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_introduce1_t)); + trn_cell_introduce1_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_introduce1_t)); trunnel_free_(obj); } size_t -hs_cell_introduce1_getlen_legacy_key_id(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getlen_legacy_key_id(const trn_cell_introduce1_t *inp) { (void)inp; return TRUNNEL_SHA1_LEN; } uint8_t -hs_cell_introduce1_get_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_get_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx) { trunnel_assert(idx < TRUNNEL_SHA1_LEN); return inp->legacy_key_id[idx]; } uint8_t -hs_cell_introduce1_getconst_legacy_key_id(const hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_getconst_legacy_key_id(const trn_cell_introduce1_t *inp, size_t idx) { - return hs_cell_introduce1_get_legacy_key_id((hs_cell_introduce1_t*)inp, idx); + return trn_cell_introduce1_get_legacy_key_id((trn_cell_introduce1_t*)inp, idx); } int -hs_cell_introduce1_set_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce1_set_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt) { trunnel_assert(idx < TRUNNEL_SHA1_LEN); inp->legacy_key_id[idx] = elt; @@ -104,22 +104,22 @@ hs_cell_introduce1_set_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx, uint } uint8_t * -hs_cell_introduce1_getarray_legacy_key_id(hs_cell_introduce1_t *inp) +trn_cell_introduce1_getarray_legacy_key_id(trn_cell_introduce1_t *inp) { return inp->legacy_key_id; } const uint8_t * -hs_cell_introduce1_getconstarray_legacy_key_id(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getconstarray_legacy_key_id(const trn_cell_introduce1_t *inp) { - return (const uint8_t *)hs_cell_introduce1_getarray_legacy_key_id((hs_cell_introduce1_t*)inp); + return (const uint8_t *)trn_cell_introduce1_getarray_legacy_key_id((trn_cell_introduce1_t*)inp); } uint8_t -hs_cell_introduce1_get_auth_key_type(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_get_auth_key_type(const trn_cell_introduce1_t *inp) { return inp->auth_key_type; } int -hs_cell_introduce1_set_auth_key_type(hs_cell_introduce1_t *inp, uint8_t val) +trn_cell_introduce1_set_auth_key_type(trn_cell_introduce1_t *inp, uint8_t val) { if (! ((val == 0 || val == 1 || val == 2))) { TRUNNEL_SET_ERROR_CODE(inp); @@ -129,41 +129,41 @@ hs_cell_introduce1_set_auth_key_type(hs_cell_introduce1_t *inp, uint8_t val) return 0; } uint16_t -hs_cell_introduce1_get_auth_key_len(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_get_auth_key_len(const trn_cell_introduce1_t *inp) { return inp->auth_key_len; } int -hs_cell_introduce1_set_auth_key_len(hs_cell_introduce1_t *inp, uint16_t val) +trn_cell_introduce1_set_auth_key_len(trn_cell_introduce1_t *inp, uint16_t val) { inp->auth_key_len = val; return 0; } size_t -hs_cell_introduce1_getlen_auth_key(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getlen_auth_key(const trn_cell_introduce1_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->auth_key); } uint8_t -hs_cell_introduce1_get_auth_key(hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_get_auth_key(trn_cell_introduce1_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->auth_key, idx); } uint8_t -hs_cell_introduce1_getconst_auth_key(const hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_getconst_auth_key(const trn_cell_introduce1_t *inp, size_t idx) { - return hs_cell_introduce1_get_auth_key((hs_cell_introduce1_t*)inp, idx); + return trn_cell_introduce1_get_auth_key((trn_cell_introduce1_t*)inp, idx); } int -hs_cell_introduce1_set_auth_key(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce1_set_auth_key(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->auth_key, idx, elt); return 0; } int -hs_cell_introduce1_add_auth_key(hs_cell_introduce1_t *inp, uint8_t elt) +trn_cell_introduce1_add_auth_key(trn_cell_introduce1_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT16_MAX if (inp->auth_key.n_ == UINT16_MAX) @@ -177,17 +177,17 @@ hs_cell_introduce1_add_auth_key(hs_cell_introduce1_t *inp, uint8_t elt) } uint8_t * -hs_cell_introduce1_getarray_auth_key(hs_cell_introduce1_t *inp) +trn_cell_introduce1_getarray_auth_key(trn_cell_introduce1_t *inp) { return inp->auth_key.elts_; } const uint8_t * -hs_cell_introduce1_getconstarray_auth_key(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getconstarray_auth_key(const trn_cell_introduce1_t *inp) { - return (const uint8_t *)hs_cell_introduce1_getarray_auth_key((hs_cell_introduce1_t*)inp); + return (const uint8_t *)trn_cell_introduce1_getarray_auth_key((trn_cell_introduce1_t*)inp); } int -hs_cell_introduce1_setlen_auth_key(hs_cell_introduce1_t *inp, size_t newlen) +trn_cell_introduce1_setlen_auth_key(trn_cell_introduce1_t *inp, size_t newlen) { uint8_t *newptr; #if UINT16_MAX < SIZE_MAX @@ -206,54 +206,54 @@ hs_cell_introduce1_setlen_auth_key(hs_cell_introduce1_t *inp, size_t newlen) TRUNNEL_SET_ERROR_CODE(inp); return -1; } -struct cell_extension_st * -hs_cell_introduce1_get_extensions(hs_cell_introduce1_t *inp) +struct trn_cell_extension_st * +trn_cell_introduce1_get_extensions(trn_cell_introduce1_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_introduce1_getconst_extensions(const hs_cell_introduce1_t *inp) +const struct trn_cell_extension_st * +trn_cell_introduce1_getconst_extensions(const trn_cell_introduce1_t *inp) { - return hs_cell_introduce1_get_extensions((hs_cell_introduce1_t*) inp); + return trn_cell_introduce1_get_extensions((trn_cell_introduce1_t*) inp); } int -hs_cell_introduce1_set_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val) +trn_cell_introduce1_set_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_introduce1_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_introduce1_set0_extensions(inp, val); } int -hs_cell_introduce1_set0_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val) +trn_cell_introduce1_set0_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } size_t -hs_cell_introduce1_getlen_encrypted(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getlen_encrypted(const trn_cell_introduce1_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->encrypted); } uint8_t -hs_cell_introduce1_get_encrypted(hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_get_encrypted(trn_cell_introduce1_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->encrypted, idx); } uint8_t -hs_cell_introduce1_getconst_encrypted(const hs_cell_introduce1_t *inp, size_t idx) +trn_cell_introduce1_getconst_encrypted(const trn_cell_introduce1_t *inp, size_t idx) { - return hs_cell_introduce1_get_encrypted((hs_cell_introduce1_t*)inp, idx); + return trn_cell_introduce1_get_encrypted((trn_cell_introduce1_t*)inp, idx); } int -hs_cell_introduce1_set_encrypted(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce1_set_encrypted(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->encrypted, idx, elt); return 0; } int -hs_cell_introduce1_add_encrypted(hs_cell_introduce1_t *inp, uint8_t elt) +trn_cell_introduce1_add_encrypted(trn_cell_introduce1_t *inp, uint8_t elt) { TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->encrypted, elt, {}); return 0; @@ -263,17 +263,17 @@ hs_cell_introduce1_add_encrypted(hs_cell_introduce1_t *inp, uint8_t elt) } uint8_t * -hs_cell_introduce1_getarray_encrypted(hs_cell_introduce1_t *inp) +trn_cell_introduce1_getarray_encrypted(trn_cell_introduce1_t *inp) { return inp->encrypted.elts_; } const uint8_t * -hs_cell_introduce1_getconstarray_encrypted(const hs_cell_introduce1_t *inp) +trn_cell_introduce1_getconstarray_encrypted(const trn_cell_introduce1_t *inp) { - return (const uint8_t *)hs_cell_introduce1_getarray_encrypted((hs_cell_introduce1_t*)inp); + return (const uint8_t *)trn_cell_introduce1_getarray_encrypted((trn_cell_introduce1_t*)inp); } int -hs_cell_introduce1_setlen_encrypted(hs_cell_introduce1_t *inp, size_t newlen) +trn_cell_introduce1_setlen_encrypted(trn_cell_introduce1_t *inp, size_t newlen) { uint8_t *newptr; newptr = trunnel_dynarray_setlen(&inp->encrypted.allocated_, @@ -289,7 +289,7 @@ hs_cell_introduce1_setlen_encrypted(hs_cell_introduce1_t *inp, size_t newlen) return -1; } const char * -hs_cell_introduce1_check(const hs_cell_introduce1_t *obj) +trn_cell_introduce1_check(const trn_cell_introduce1_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -301,18 +301,18 @@ hs_cell_introduce1_check(const hs_cell_introduce1_t *obj) return "Length mismatch for auth_key"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } return NULL; } ssize_t -hs_cell_introduce1_encoded_len(const hs_cell_introduce1_t *obj) +trn_cell_introduce1_encoded_len(const trn_cell_introduce1_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_introduce1_check(obj)) + if (NULL != trn_cell_introduce1_check(obj)) return -1; @@ -328,32 +328,32 @@ hs_cell_introduce1_encoded_len(const hs_cell_introduce1_t *obj) /* Length of u8 auth_key[auth_key_len] */ result += TRUNNEL_DYNARRAY_LEN(&obj->auth_key); - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); /* Length of u8 encrypted[] */ result += TRUNNEL_DYNARRAY_LEN(&obj->encrypted); return result; } int -hs_cell_introduce1_clear_errors(hs_cell_introduce1_t *obj) +trn_cell_introduce1_clear_errors(trn_cell_introduce1_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_introduce1_encode(uint8_t *output, const size_t avail, const hs_cell_introduce1_t *obj) +trn_cell_introduce1_encode(uint8_t *output, const size_t avail, const trn_cell_introduce1_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_introduce1_encoded_len(obj); + const ssize_t encoded_len = trn_cell_introduce1_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_introduce1_check(obj))) + if (NULL != (msg = trn_cell_introduce1_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -393,9 +393,9 @@ hs_cell_introduce1_encode(uint8_t *output, const size_t avail, const hs_cell_int written += elt_len; ptr += elt_len; } - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -435,11 +435,11 @@ hs_cell_introduce1_encode(uint8_t *output, const size_t avail, const hs_cell_int return result; } -/** As hs_cell_introduce1_parse(), but do not allocate the output +/** As trn_cell_introduce1_parse(), but do not allocate the output * object. */ static ssize_t -hs_cell_introduce1_parse_into(hs_cell_introduce1_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_introduce1_parse_into(trn_cell_introduce1_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -471,8 +471,8 @@ hs_cell_introduce1_parse_into(hs_cell_introduce1_t *obj, const uint8_t *input, c memcpy(obj->auth_key.elts_, ptr, obj->auth_key_len); ptr += obj->auth_key_len; remaining -= obj->auth_key_len; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -500,23 +500,23 @@ hs_cell_introduce1_parse_into(hs_cell_introduce1_t *obj, const uint8_t *input, c } ssize_t -hs_cell_introduce1_parse(hs_cell_introduce1_t **output, const uint8_t *input, const size_t len_in) +trn_cell_introduce1_parse(trn_cell_introduce1_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_introduce1_new(); + *output = trn_cell_introduce1_new(); if (NULL == *output) return -1; - result = hs_cell_introduce1_parse_into(*output, input, len_in); + result = trn_cell_introduce1_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_introduce1_free(*output); + trn_cell_introduce1_free(*output); *output = NULL; } return result; } -hs_cell_introduce_ack_t * -hs_cell_introduce_ack_new(void) +trn_cell_introduce_ack_t * +trn_cell_introduce_ack_new(void) { - hs_cell_introduce_ack_t *val = trunnel_calloc(1, sizeof(hs_cell_introduce_ack_t)); + trn_cell_introduce_ack_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce_ack_t)); if (NULL == val) return NULL; return val; @@ -525,30 +525,30 @@ hs_cell_introduce_ack_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_introduce_ack_clear(hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_clear(trn_cell_introduce_ack_t *obj) { (void) obj; - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; } void -hs_cell_introduce_ack_free(hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_free(trn_cell_introduce_ack_t *obj) { if (obj == NULL) return; - hs_cell_introduce_ack_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_introduce_ack_t)); + trn_cell_introduce_ack_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_introduce_ack_t)); trunnel_free_(obj); } uint16_t -hs_cell_introduce_ack_get_status(const hs_cell_introduce_ack_t *inp) +trn_cell_introduce_ack_get_status(const trn_cell_introduce_ack_t *inp) { return inp->status; } int -hs_cell_introduce_ack_set_status(hs_cell_introduce_ack_t *inp, uint16_t val) +trn_cell_introduce_ack_set_status(trn_cell_introduce_ack_t *inp, uint16_t val) { if (! ((val == 0 || val == 1 || val == 2))) { TRUNNEL_SET_ERROR_CODE(inp); @@ -557,31 +557,31 @@ hs_cell_introduce_ack_set_status(hs_cell_introduce_ack_t *inp, uint16_t val) inp->status = val; return 0; } -struct cell_extension_st * -hs_cell_introduce_ack_get_extensions(hs_cell_introduce_ack_t *inp) +struct trn_cell_extension_st * +trn_cell_introduce_ack_get_extensions(trn_cell_introduce_ack_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_introduce_ack_getconst_extensions(const hs_cell_introduce_ack_t *inp) +const struct trn_cell_extension_st * +trn_cell_introduce_ack_getconst_extensions(const trn_cell_introduce_ack_t *inp) { - return hs_cell_introduce_ack_get_extensions((hs_cell_introduce_ack_t*) inp); + return trn_cell_introduce_ack_get_extensions((trn_cell_introduce_ack_t*) inp); } int -hs_cell_introduce_ack_set_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val) +trn_cell_introduce_ack_set_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_introduce_ack_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_introduce_ack_set0_extensions(inp, val); } int -hs_cell_introduce_ack_set0_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val) +trn_cell_introduce_ack_set0_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } const char * -hs_cell_introduce_ack_check(const hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_check(const trn_cell_introduce_ack_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -591,47 +591,47 @@ hs_cell_introduce_ack_check(const hs_cell_introduce_ack_t *obj) return "Integer out of bounds"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } return NULL; } ssize_t -hs_cell_introduce_ack_encoded_len(const hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_encoded_len(const trn_cell_introduce_ack_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_introduce_ack_check(obj)) + if (NULL != trn_cell_introduce_ack_check(obj)) return -1; /* Length of u16 status IN [0, 1, 2] */ result += 2; - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); return result; } int -hs_cell_introduce_ack_clear_errors(hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_clear_errors(trn_cell_introduce_ack_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const hs_cell_introduce_ack_t *obj) +trn_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const trn_cell_introduce_ack_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_introduce_ack_encoded_len(obj); + const ssize_t encoded_len = trn_cell_introduce_ack_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_introduce_ack_check(obj))) + if (NULL != (msg = trn_cell_introduce_ack_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -645,9 +645,9 @@ hs_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const hs_cell_ trunnel_set_uint16(ptr, trunnel_htons(obj->status)); written += 2; ptr += 2; - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -676,11 +676,11 @@ hs_cell_introduce_ack_encode(uint8_t *output, const size_t avail, const hs_cell_ return result; } -/** As hs_cell_introduce_ack_parse(), but do not allocate the output +/** As trn_cell_introduce_ack_parse(), but do not allocate the output * object. */ static ssize_t -hs_cell_introduce_ack_parse_into(hs_cell_introduce_ack_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_introduce_ack_parse_into(trn_cell_introduce_ack_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -694,8 +694,8 @@ hs_cell_introduce_ack_parse_into(hs_cell_introduce_ack_t *obj, const uint8_t *in if (! (obj->status == 0 || obj->status == 1 || obj->status == 2)) goto fail; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -714,23 +714,23 @@ hs_cell_introduce_ack_parse_into(hs_cell_introduce_ack_t *obj, const uint8_t *in } ssize_t -hs_cell_introduce_ack_parse(hs_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in) +trn_cell_introduce_ack_parse(trn_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_introduce_ack_new(); + *output = trn_cell_introduce_ack_new(); if (NULL == *output) return -1; - result = hs_cell_introduce_ack_parse_into(*output, input, len_in); + result = trn_cell_introduce_ack_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_introduce_ack_free(*output); + trn_cell_introduce_ack_free(*output); *output = NULL; } return result; } -hs_cell_introduce_encrypted_t * -hs_cell_introduce_encrypted_new(void) +trn_cell_introduce_encrypted_t * +trn_cell_introduce_encrypted_new(void) { - hs_cell_introduce_encrypted_t *val = trunnel_calloc(1, sizeof(hs_cell_introduce_encrypted_t)); + trn_cell_introduce_encrypted_t *val = trunnel_calloc(1, sizeof(trn_cell_introduce_encrypted_t)); if (NULL == val) return NULL; val->onion_key_type = 1; @@ -740,10 +740,10 @@ hs_cell_introduce_encrypted_new(void) /** Release all storage held inside 'obj', but do not free 'obj'. */ static void -hs_cell_introduce_encrypted_clear(hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_clear(trn_cell_introduce_encrypted_t *obj) { (void) obj; - cell_extension_free(obj->extensions); + trn_cell_extension_free(obj->extensions); obj->extensions = NULL; TRUNNEL_DYNARRAY_WIPE(&obj->onion_key); TRUNNEL_DYNARRAY_CLEAR(&obj->onion_key); @@ -761,35 +761,35 @@ hs_cell_introduce_encrypted_clear(hs_cell_introduce_encrypted_t *obj) } void -hs_cell_introduce_encrypted_free(hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_free(trn_cell_introduce_encrypted_t *obj) { if (obj == NULL) return; - hs_cell_introduce_encrypted_clear(obj); - trunnel_memwipe(obj, sizeof(hs_cell_introduce_encrypted_t)); + trn_cell_introduce_encrypted_clear(obj); + trunnel_memwipe(obj, sizeof(trn_cell_introduce_encrypted_t)); trunnel_free_(obj); } size_t -hs_cell_introduce_encrypted_getlen_rend_cookie(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getlen_rend_cookie(const trn_cell_introduce_encrypted_t *inp) { (void)inp; return TRUNNEL_REND_COOKIE_LEN; } uint8_t -hs_cell_introduce_encrypted_get_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_get_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx) { trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN); return inp->rend_cookie[idx]; } uint8_t -hs_cell_introduce_encrypted_getconst_rend_cookie(const hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_getconst_rend_cookie(const trn_cell_introduce_encrypted_t *inp, size_t idx) { - return hs_cell_introduce_encrypted_get_rend_cookie((hs_cell_introduce_encrypted_t*)inp, idx); + return trn_cell_introduce_encrypted_get_rend_cookie((trn_cell_introduce_encrypted_t*)inp, idx); } int -hs_cell_introduce_encrypted_set_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce_encrypted_set_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) { trunnel_assert(idx < TRUNNEL_REND_COOKIE_LEN); inp->rend_cookie[idx] = elt; @@ -797,45 +797,45 @@ hs_cell_introduce_encrypted_set_rend_cookie(hs_cell_introduce_encrypted_t *inp, } uint8_t * -hs_cell_introduce_encrypted_getarray_rend_cookie(hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getarray_rend_cookie(trn_cell_introduce_encrypted_t *inp) { return inp->rend_cookie; } const uint8_t * -hs_cell_introduce_encrypted_getconstarray_rend_cookie(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getconstarray_rend_cookie(const trn_cell_introduce_encrypted_t *inp) { - return (const uint8_t *)hs_cell_introduce_encrypted_getarray_rend_cookie((hs_cell_introduce_encrypted_t*)inp); + return (const uint8_t *)trn_cell_introduce_encrypted_getarray_rend_cookie((trn_cell_introduce_encrypted_t*)inp); } -struct cell_extension_st * -hs_cell_introduce_encrypted_get_extensions(hs_cell_introduce_encrypted_t *inp) +struct trn_cell_extension_st * +trn_cell_introduce_encrypted_get_extensions(trn_cell_introduce_encrypted_t *inp) { return inp->extensions; } -const struct cell_extension_st * -hs_cell_introduce_encrypted_getconst_extensions(const hs_cell_introduce_encrypted_t *inp) +const struct trn_cell_extension_st * +trn_cell_introduce_encrypted_getconst_extensions(const trn_cell_introduce_encrypted_t *inp) { - return hs_cell_introduce_encrypted_get_extensions((hs_cell_introduce_encrypted_t*) inp); + return trn_cell_introduce_encrypted_get_extensions((trn_cell_introduce_encrypted_t*) inp); } int -hs_cell_introduce_encrypted_set_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val) +trn_cell_introduce_encrypted_set_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val) { if (inp->extensions && inp->extensions != val) - cell_extension_free(inp->extensions); - return hs_cell_introduce_encrypted_set0_extensions(inp, val); + trn_cell_extension_free(inp->extensions); + return trn_cell_introduce_encrypted_set0_extensions(inp, val); } int -hs_cell_introduce_encrypted_set0_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val) +trn_cell_introduce_encrypted_set0_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val) { inp->extensions = val; return 0; } uint8_t -hs_cell_introduce_encrypted_get_onion_key_type(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_get_onion_key_type(const trn_cell_introduce_encrypted_t *inp) { return inp->onion_key_type; } int -hs_cell_introduce_encrypted_set_onion_key_type(hs_cell_introduce_encrypted_t *inp, uint8_t val) +trn_cell_introduce_encrypted_set_onion_key_type(trn_cell_introduce_encrypted_t *inp, uint8_t val) { if (! ((val == 1))) { TRUNNEL_SET_ERROR_CODE(inp); @@ -845,41 +845,41 @@ hs_cell_introduce_encrypted_set_onion_key_type(hs_cell_introduce_encrypted_t *in return 0; } uint16_t -hs_cell_introduce_encrypted_get_onion_key_len(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_get_onion_key_len(const trn_cell_introduce_encrypted_t *inp) { return inp->onion_key_len; } int -hs_cell_introduce_encrypted_set_onion_key_len(hs_cell_introduce_encrypted_t *inp, uint16_t val) +trn_cell_introduce_encrypted_set_onion_key_len(trn_cell_introduce_encrypted_t *inp, uint16_t val) { inp->onion_key_len = val; return 0; } size_t -hs_cell_introduce_encrypted_getlen_onion_key(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getlen_onion_key(const trn_cell_introduce_encrypted_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->onion_key); } uint8_t -hs_cell_introduce_encrypted_get_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_get_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->onion_key, idx); } uint8_t -hs_cell_introduce_encrypted_getconst_onion_key(const hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_getconst_onion_key(const trn_cell_introduce_encrypted_t *inp, size_t idx) { - return hs_cell_introduce_encrypted_get_onion_key((hs_cell_introduce_encrypted_t*)inp, idx); + return trn_cell_introduce_encrypted_get_onion_key((trn_cell_introduce_encrypted_t*)inp, idx); } int -hs_cell_introduce_encrypted_set_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce_encrypted_set_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->onion_key, idx, elt); return 0; } int -hs_cell_introduce_encrypted_add_onion_key(hs_cell_introduce_encrypted_t *inp, uint8_t elt) +trn_cell_introduce_encrypted_add_onion_key(trn_cell_introduce_encrypted_t *inp, uint8_t elt) { #if SIZE_MAX >= UINT16_MAX if (inp->onion_key.n_ == UINT16_MAX) @@ -893,17 +893,17 @@ hs_cell_introduce_encrypted_add_onion_key(hs_cell_introduce_encrypted_t *inp, ui } uint8_t * -hs_cell_introduce_encrypted_getarray_onion_key(hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getarray_onion_key(trn_cell_introduce_encrypted_t *inp) { return inp->onion_key.elts_; } const uint8_t * -hs_cell_introduce_encrypted_getconstarray_onion_key(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getconstarray_onion_key(const trn_cell_introduce_encrypted_t *inp) { - return (const uint8_t *)hs_cell_introduce_encrypted_getarray_onion_key((hs_cell_introduce_encrypted_t*)inp); + return (const uint8_t *)trn_cell_introduce_encrypted_getarray_onion_key((trn_cell_introduce_encrypted_t*)inp); } int -hs_cell_introduce_encrypted_setlen_onion_key(hs_cell_introduce_encrypted_t *inp, size_t newlen) +trn_cell_introduce_encrypted_setlen_onion_key(trn_cell_introduce_encrypted_t *inp, size_t newlen) { uint8_t *newptr; #if UINT16_MAX < SIZE_MAX @@ -923,49 +923,49 @@ hs_cell_introduce_encrypted_setlen_onion_key(hs_cell_introduce_encrypted_t *inp, return -1; } uint8_t -hs_cell_introduce_encrypted_get_nspec(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_get_nspec(const trn_cell_introduce_encrypted_t *inp) { return inp->nspec; } int -hs_cell_introduce_encrypted_set_nspec(hs_cell_introduce_encrypted_t *inp, uint8_t val) +trn_cell_introduce_encrypted_set_nspec(trn_cell_introduce_encrypted_t *inp, uint8_t val) { inp->nspec = val; return 0; } size_t -hs_cell_introduce_encrypted_getlen_nspecs(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getlen_nspecs(const trn_cell_introduce_encrypted_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->nspecs); } struct link_specifier_st * -hs_cell_introduce_encrypted_get_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_get_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->nspecs, idx); } const struct link_specifier_st * -hs_cell_introduce_encrypted_getconst_nspecs(const hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_getconst_nspecs(const trn_cell_introduce_encrypted_t *inp, size_t idx) { - return hs_cell_introduce_encrypted_get_nspecs((hs_cell_introduce_encrypted_t*)inp, idx); + return trn_cell_introduce_encrypted_get_nspecs((trn_cell_introduce_encrypted_t*)inp, idx); } int -hs_cell_introduce_encrypted_set_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) +trn_cell_introduce_encrypted_set_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) { link_specifier_t *oldval = TRUNNEL_DYNARRAY_GET(&inp->nspecs, idx); if (oldval && oldval != elt) link_specifier_free(oldval); - return hs_cell_introduce_encrypted_set0_nspecs(inp, idx, elt); + return trn_cell_introduce_encrypted_set0_nspecs(inp, idx, elt); } int -hs_cell_introduce_encrypted_set0_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) +trn_cell_introduce_encrypted_set0_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt) { TRUNNEL_DYNARRAY_SET(&inp->nspecs, idx, elt); return 0; } int -hs_cell_introduce_encrypted_add_nspecs(hs_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt) +trn_cell_introduce_encrypted_add_nspecs(trn_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt) { #if SIZE_MAX >= UINT8_MAX if (inp->nspecs.n_ == UINT8_MAX) @@ -979,17 +979,17 @@ hs_cell_introduce_encrypted_add_nspecs(hs_cell_introduce_encrypted_t *inp, struc } struct link_specifier_st * * -hs_cell_introduce_encrypted_getarray_nspecs(hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getarray_nspecs(trn_cell_introduce_encrypted_t *inp) { return inp->nspecs.elts_; } const struct link_specifier_st * const * -hs_cell_introduce_encrypted_getconstarray_nspecs(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getconstarray_nspecs(const trn_cell_introduce_encrypted_t *inp) { - return (const struct link_specifier_st * const *)hs_cell_introduce_encrypted_getarray_nspecs((hs_cell_introduce_encrypted_t*)inp); + return (const struct link_specifier_st * const *)trn_cell_introduce_encrypted_getarray_nspecs((trn_cell_introduce_encrypted_t*)inp); } int -hs_cell_introduce_encrypted_setlen_nspecs(hs_cell_introduce_encrypted_t *inp, size_t newlen) +trn_cell_introduce_encrypted_setlen_nspecs(trn_cell_introduce_encrypted_t *inp, size_t newlen) { struct link_specifier_st * *newptr; #if UINT8_MAX < SIZE_MAX @@ -1009,30 +1009,30 @@ hs_cell_introduce_encrypted_setlen_nspecs(hs_cell_introduce_encrypted_t *inp, si return -1; } size_t -hs_cell_introduce_encrypted_getlen_pad(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getlen_pad(const trn_cell_introduce_encrypted_t *inp) { return TRUNNEL_DYNARRAY_LEN(&inp->pad); } uint8_t -hs_cell_introduce_encrypted_get_pad(hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_get_pad(trn_cell_introduce_encrypted_t *inp, size_t idx) { return TRUNNEL_DYNARRAY_GET(&inp->pad, idx); } uint8_t -hs_cell_introduce_encrypted_getconst_pad(const hs_cell_introduce_encrypted_t *inp, size_t idx) +trn_cell_introduce_encrypted_getconst_pad(const trn_cell_introduce_encrypted_t *inp, size_t idx) { - return hs_cell_introduce_encrypted_get_pad((hs_cell_introduce_encrypted_t*)inp, idx); + return trn_cell_introduce_encrypted_get_pad((trn_cell_introduce_encrypted_t*)inp, idx); } int -hs_cell_introduce_encrypted_set_pad(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) +trn_cell_introduce_encrypted_set_pad(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt) { TRUNNEL_DYNARRAY_SET(&inp->pad, idx, elt); return 0; } int -hs_cell_introduce_encrypted_add_pad(hs_cell_introduce_encrypted_t *inp, uint8_t elt) +trn_cell_introduce_encrypted_add_pad(trn_cell_introduce_encrypted_t *inp, uint8_t elt) { TRUNNEL_DYNARRAY_ADD(uint8_t, &inp->pad, elt, {}); return 0; @@ -1042,17 +1042,17 @@ hs_cell_introduce_encrypted_add_pad(hs_cell_introduce_encrypted_t *inp, uint8_t } uint8_t * -hs_cell_introduce_encrypted_getarray_pad(hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getarray_pad(trn_cell_introduce_encrypted_t *inp) { return inp->pad.elts_; } const uint8_t * -hs_cell_introduce_encrypted_getconstarray_pad(const hs_cell_introduce_encrypted_t *inp) +trn_cell_introduce_encrypted_getconstarray_pad(const trn_cell_introduce_encrypted_t *inp) { - return (const uint8_t *)hs_cell_introduce_encrypted_getarray_pad((hs_cell_introduce_encrypted_t*)inp); + return (const uint8_t *)trn_cell_introduce_encrypted_getarray_pad((trn_cell_introduce_encrypted_t*)inp); } int -hs_cell_introduce_encrypted_setlen_pad(hs_cell_introduce_encrypted_t *inp, size_t newlen) +trn_cell_introduce_encrypted_setlen_pad(trn_cell_introduce_encrypted_t *inp, size_t newlen) { uint8_t *newptr; newptr = trunnel_dynarray_setlen(&inp->pad.allocated_, @@ -1068,7 +1068,7 @@ hs_cell_introduce_encrypted_setlen_pad(hs_cell_introduce_encrypted_t *inp, size_ return -1; } const char * -hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_check(const trn_cell_introduce_encrypted_t *obj) { if (obj == NULL) return "Object was NULL"; @@ -1076,7 +1076,7 @@ hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj) return "A set function failed on this object"; { const char *msg; - if (NULL != (msg = cell_extension_check(obj->extensions))) + if (NULL != (msg = trn_cell_extension_check(obj->extensions))) return msg; } if (! (obj->onion_key_type == 1)) @@ -1098,19 +1098,19 @@ hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj) } ssize_t -hs_cell_introduce_encrypted_encoded_len(const hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_encoded_len(const trn_cell_introduce_encrypted_t *obj) { ssize_t result = 0; - if (NULL != hs_cell_introduce_encrypted_check(obj)) + if (NULL != trn_cell_introduce_encrypted_check(obj)) return -1; /* Length of u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN] */ result += TRUNNEL_REND_COOKIE_LEN; - /* Length of struct cell_extension extensions */ - result += cell_extension_encoded_len(obj->extensions); + /* Length of struct trn_cell_extension extensions */ + result += trn_cell_extension_encoded_len(obj->extensions); /* Length of u8 onion_key_type IN [1] */ result += 1; @@ -1138,24 +1138,24 @@ hs_cell_introduce_encrypted_encoded_len(const hs_cell_introduce_encrypted_t *obj return result; } int -hs_cell_introduce_encrypted_clear_errors(hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_clear_errors(trn_cell_introduce_encrypted_t *obj) { int r = obj->trunnel_error_code_; obj->trunnel_error_code_ = 0; return r; } ssize_t -hs_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const hs_cell_introduce_encrypted_t *obj) +trn_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const trn_cell_introduce_encrypted_t *obj) { ssize_t result = 0; size_t written = 0; uint8_t *ptr = output; const char *msg; #ifdef TRUNNEL_CHECK_ENCODED_LEN - const ssize_t encoded_len = hs_cell_introduce_encrypted_encoded_len(obj); + const ssize_t encoded_len = trn_cell_introduce_encrypted_encoded_len(obj); #endif - if (NULL != (msg = hs_cell_introduce_encrypted_check(obj))) + if (NULL != (msg = trn_cell_introduce_encrypted_check(obj))) goto check_failed; #ifdef TRUNNEL_CHECK_ENCODED_LEN @@ -1169,9 +1169,9 @@ hs_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const hs memcpy(ptr, obj->rend_cookie, TRUNNEL_REND_COOKIE_LEN); written += TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN; - /* Encode struct cell_extension extensions */ + /* Encode struct trn_cell_extension extensions */ trunnel_assert(written <= avail); - result = cell_extension_encode(ptr, avail - written, obj->extensions); + result = trn_cell_extension_encode(ptr, avail - written, obj->extensions); if (result < 0) goto fail; /* XXXXXXX !*/ written += result; ptr += result; @@ -1257,11 +1257,11 @@ hs_cell_introduce_encrypted_encode(uint8_t *output, const size_t avail, const hs return result; } -/** As hs_cell_introduce_encrypted_parse(), but do not allocate the +/** As trn_cell_introduce_encrypted_parse(), but do not allocate the * output object. */ static ssize_t -hs_cell_introduce_encrypted_parse_into(hs_cell_introduce_encrypted_t *obj, const uint8_t *input, const size_t len_in) +trn_cell_introduce_encrypted_parse_into(trn_cell_introduce_encrypted_t *obj, const uint8_t *input, const size_t len_in) { const uint8_t *ptr = input; size_t remaining = len_in; @@ -1273,8 +1273,8 @@ hs_cell_introduce_encrypted_parse_into(hs_cell_introduce_encrypted_t *obj, const memcpy(obj->rend_cookie, ptr, TRUNNEL_REND_COOKIE_LEN); remaining -= TRUNNEL_REND_COOKIE_LEN; ptr += TRUNNEL_REND_COOKIE_LEN; - /* Parse struct cell_extension extensions */ - result = cell_extension_parse(&obj->extensions, ptr, remaining); + /* Parse struct trn_cell_extension extensions */ + result = trn_cell_extension_parse(&obj->extensions, ptr, remaining); if (result < 0) goto relay_fail; trunnel_assert((size_t)result <= remaining); @@ -1342,15 +1342,15 @@ hs_cell_introduce_encrypted_parse_into(hs_cell_introduce_encrypted_t *obj, const } ssize_t -hs_cell_introduce_encrypted_parse(hs_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in) +trn_cell_introduce_encrypted_parse(trn_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in) { ssize_t result; - *output = hs_cell_introduce_encrypted_new(); + *output = trn_cell_introduce_encrypted_new(); if (NULL == *output) return -1; - result = hs_cell_introduce_encrypted_parse_into(*output, input, len_in); + result = trn_cell_introduce_encrypted_parse_into(*output, input, len_in); if (result < 0) { - hs_cell_introduce_encrypted_free(*output); + trn_cell_introduce_encrypted_free(*output); *output = NULL; } return result; diff --git a/src/trunnel/hs/cell_introduce1.h b/src/trunnel/hs/cell_introduce1.h index ccd2cda904..cca825a431 100644 --- a/src/trunnel/hs/cell_introduce1.h +++ b/src/trunnel/hs/cell_introduce1.h @@ -8,34 +8,34 @@ #include <stdint.h> #include "trunnel.h" -struct cell_extension_st; +struct trn_cell_extension_st; struct link_specifier_st; #define TRUNNEL_SHA1_LEN 20 #define TRUNNEL_REND_COOKIE_LEN 20 -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRODUCE1) -struct hs_cell_introduce1_st { +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE1) +struct trn_cell_introduce1_st { uint8_t legacy_key_id[TRUNNEL_SHA1_LEN]; uint8_t auth_key_type; uint16_t auth_key_len; TRUNNEL_DYNARRAY_HEAD(, uint8_t) auth_key; - struct cell_extension_st *extensions; + struct trn_cell_extension_st *extensions; TRUNNEL_DYNARRAY_HEAD(, uint8_t) encrypted; uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_introduce1_st hs_cell_introduce1_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRODUCE_ACK) -struct hs_cell_introduce_ack_st { +typedef struct trn_cell_introduce1_st trn_cell_introduce1_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE_ACK) +struct trn_cell_introduce_ack_st { uint16_t status; - struct cell_extension_st *extensions; + struct trn_cell_extension_st *extensions; uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_introduce_ack_st hs_cell_introduce_ack_t; -#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_HS_CELL_INTRODUCE_ENCRYPTED) -struct hs_cell_introduce_encrypted_st { +typedef struct trn_cell_introduce_ack_st trn_cell_introduce_ack_t; +#if !defined(TRUNNEL_OPAQUE) && !defined(TRUNNEL_OPAQUE_TRN_CELL_INTRODUCE_ENCRYPTED) +struct trn_cell_introduce_encrypted_st { uint8_t rend_cookie[TRUNNEL_REND_COOKIE_LEN]; - struct cell_extension_st *extensions; + struct trn_cell_extension_st *extensions; uint8_t onion_key_type; uint16_t onion_key_len; TRUNNEL_DYNARRAY_HEAD(, uint8_t) onion_key; @@ -45,449 +45,449 @@ struct hs_cell_introduce_encrypted_st { uint8_t trunnel_error_code_; }; #endif -typedef struct hs_cell_introduce_encrypted_st hs_cell_introduce_encrypted_t; -/** Return a newly allocated hs_cell_introduce1 with all elements set +typedef struct trn_cell_introduce_encrypted_st trn_cell_introduce_encrypted_t; +/** Return a newly allocated trn_cell_introduce1 with all elements set * to zero. */ -hs_cell_introduce1_t *hs_cell_introduce1_new(void); -/** Release all storage held by the hs_cell_introduce1 in 'victim'. +trn_cell_introduce1_t *trn_cell_introduce1_new(void); +/** Release all storage held by the trn_cell_introduce1 in 'victim'. * (Do nothing if 'victim' is NULL.) */ -void hs_cell_introduce1_free(hs_cell_introduce1_t *victim); -/** Try to parse a hs_cell_introduce1 from the buffer in 'input', +void trn_cell_introduce1_free(trn_cell_introduce1_t *victim); +/** Try to parse a trn_cell_introduce1 from the buffer in 'input', * using up to 'len_in' bytes from the input buffer. On success, * return the number of bytes consumed and set *output to the newly - * allocated hs_cell_introduce1_t. On failure, return -2 if the input + * allocated trn_cell_introduce1_t. On failure, return -2 if the input * appears truncated, and -1 if the input is otherwise invalid. */ -ssize_t hs_cell_introduce1_parse(hs_cell_introduce1_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_introduce1_parse(trn_cell_introduce1_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_introduce1 in 'obj'. On failure, return a negative value. + * trn_cell_introduce1 in 'obj'. On failure, return a negative value. * Note that this value may be an overestimate, and can even be an * underestimate for certain unencodeable objects. */ -ssize_t hs_cell_introduce1_encoded_len(const hs_cell_introduce1_t *obj); -/** Try to encode the hs_cell_introduce1 from 'input' into the buffer +ssize_t trn_cell_introduce1_encoded_len(const trn_cell_introduce1_t *obj); +/** Try to encode the trn_cell_introduce1 from 'input' into the buffer * at 'output', using up to 'avail' bytes of the output buffer. On * success, return the number of bytes used. On failure, return -2 if * the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t hs_cell_introduce1_encode(uint8_t *output, size_t avail, const hs_cell_introduce1_t *input); -/** Check whether the internal state of the hs_cell_introduce1 in +ssize_t trn_cell_introduce1_encode(uint8_t *output, size_t avail, const trn_cell_introduce1_t *input); +/** Check whether the internal state of the trn_cell_introduce1 in * 'obj' is consistent. Return NULL if it is, and a short message if * it is not. */ -const char *hs_cell_introduce1_check(const hs_cell_introduce1_t *obj); +const char *trn_cell_introduce1_check(const trn_cell_introduce1_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_introduce1_clear_errors(hs_cell_introduce1_t *obj); +int trn_cell_introduce1_clear_errors(trn_cell_introduce1_t *obj); /** Return the (constant) length of the array holding the - * legacy_key_id field of the hs_cell_introduce1_t in 'inp'. + * legacy_key_id field of the trn_cell_introduce1_t in 'inp'. */ -size_t hs_cell_introduce1_getlen_legacy_key_id(const hs_cell_introduce1_t *inp); +size_t trn_cell_introduce1_getlen_legacy_key_id(const trn_cell_introduce1_t *inp); /** Return the element at position 'idx' of the fixed array field - * legacy_key_id of the hs_cell_introduce1_t in 'inp'. + * legacy_key_id of the trn_cell_introduce1_t in 'inp'. */ -uint8_t hs_cell_introduce1_get_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx); -/** As hs_cell_introduce1_get_legacy_key_id, but take and return a +uint8_t trn_cell_introduce1_get_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx); +/** As trn_cell_introduce1_get_legacy_key_id, but take and return a * const pointer */ -uint8_t hs_cell_introduce1_getconst_legacy_key_id(const hs_cell_introduce1_t *inp, size_t idx); +uint8_t trn_cell_introduce1_getconst_legacy_key_id(const trn_cell_introduce1_t *inp, size_t idx); /** Change the element at position 'idx' of the fixed array field - * legacy_key_id of the hs_cell_introduce1_t in 'inp', so that it will - * hold the value 'elt'. + * legacy_key_id of the trn_cell_introduce1_t in 'inp', so that it + * will hold the value 'elt'. */ -int hs_cell_introduce1_set_legacy_key_id(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce1_set_legacy_key_id(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt); /** Return a pointer to the TRUNNEL_SHA1_LEN-element array field * legacy_key_id of 'inp'. */ -uint8_t * hs_cell_introduce1_getarray_legacy_key_id(hs_cell_introduce1_t *inp); -/** As hs_cell_introduce1_get_legacy_key_id, but take and return a +uint8_t * trn_cell_introduce1_getarray_legacy_key_id(trn_cell_introduce1_t *inp); +/** As trn_cell_introduce1_get_legacy_key_id, but take and return a * const pointer */ -const uint8_t * hs_cell_introduce1_getconstarray_legacy_key_id(const hs_cell_introduce1_t *inp); +const uint8_t * trn_cell_introduce1_getconstarray_legacy_key_id(const trn_cell_introduce1_t *inp); /** Return the value of the auth_key_type field of the - * hs_cell_introduce1_t in 'inp' + * trn_cell_introduce1_t in 'inp' */ -uint8_t hs_cell_introduce1_get_auth_key_type(const hs_cell_introduce1_t *inp); +uint8_t trn_cell_introduce1_get_auth_key_type(const trn_cell_introduce1_t *inp); /** Set the value of the auth_key_type field of the - * hs_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. + * trn_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; + * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce1_set_auth_key_type(hs_cell_introduce1_t *inp, uint8_t val); +int trn_cell_introduce1_set_auth_key_type(trn_cell_introduce1_t *inp, uint8_t val); /** Return the value of the auth_key_len field of the - * hs_cell_introduce1_t in 'inp' + * trn_cell_introduce1_t in 'inp' */ -uint16_t hs_cell_introduce1_get_auth_key_len(const hs_cell_introduce1_t *inp); +uint16_t trn_cell_introduce1_get_auth_key_len(const trn_cell_introduce1_t *inp); /** Set the value of the auth_key_len field of the - * hs_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; return - * -1 and set the error code on 'inp' on failure. + * trn_cell_introduce1_t in 'inp' to 'val'. Return 0 on success; + * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce1_set_auth_key_len(hs_cell_introduce1_t *inp, uint16_t val); +int trn_cell_introduce1_set_auth_key_len(trn_cell_introduce1_t *inp, uint16_t val); /** Return the length of the dynamic array holding the auth_key field - * of the hs_cell_introduce1_t in 'inp'. + * of the trn_cell_introduce1_t in 'inp'. */ -size_t hs_cell_introduce1_getlen_auth_key(const hs_cell_introduce1_t *inp); +size_t trn_cell_introduce1_getlen_auth_key(const trn_cell_introduce1_t *inp); /** Return the element at position 'idx' of the dynamic array field - * auth_key of the hs_cell_introduce1_t in 'inp'. + * auth_key of the trn_cell_introduce1_t in 'inp'. */ -uint8_t hs_cell_introduce1_get_auth_key(hs_cell_introduce1_t *inp, size_t idx); -/** As hs_cell_introduce1_get_auth_key, but take and return a const +uint8_t trn_cell_introduce1_get_auth_key(trn_cell_introduce1_t *inp, size_t idx); +/** As trn_cell_introduce1_get_auth_key, but take and return a const * pointer */ -uint8_t hs_cell_introduce1_getconst_auth_key(const hs_cell_introduce1_t *inp, size_t idx); +uint8_t trn_cell_introduce1_getconst_auth_key(const trn_cell_introduce1_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * auth_key of the hs_cell_introduce1_t in 'inp', so that it will hold - * the value 'elt'. + * auth_key of the trn_cell_introduce1_t in 'inp', so that it will + * hold the value 'elt'. */ -int hs_cell_introduce1_set_auth_key(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce1_set_auth_key(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field auth_key of - * the hs_cell_introduce1_t in 'inp'. + * the trn_cell_introduce1_t in 'inp'. */ -int hs_cell_introduce1_add_auth_key(hs_cell_introduce1_t *inp, uint8_t elt); +int trn_cell_introduce1_add_auth_key(trn_cell_introduce1_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field auth_key of * 'inp'. */ -uint8_t * hs_cell_introduce1_getarray_auth_key(hs_cell_introduce1_t *inp); -/** As hs_cell_introduce1_get_auth_key, but take and return a const +uint8_t * trn_cell_introduce1_getarray_auth_key(trn_cell_introduce1_t *inp); +/** As trn_cell_introduce1_get_auth_key, but take and return a const * pointer */ -const uint8_t * hs_cell_introduce1_getconstarray_auth_key(const hs_cell_introduce1_t *inp); +const uint8_t * trn_cell_introduce1_getconstarray_auth_key(const trn_cell_introduce1_t *inp); /** Change the length of the variable-length array field auth_key of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce1_setlen_auth_key(hs_cell_introduce1_t *inp, size_t newlen); +int trn_cell_introduce1_setlen_auth_key(trn_cell_introduce1_t *inp, size_t newlen); /** Return the value of the extensions field of the - * hs_cell_introduce1_t in 'inp' + * trn_cell_introduce1_t in 'inp' */ -struct cell_extension_st * hs_cell_introduce1_get_extensions(hs_cell_introduce1_t *inp); -/** As hs_cell_introduce1_get_extensions, but take and return a const +struct trn_cell_extension_st * trn_cell_introduce1_get_extensions(trn_cell_introduce1_t *inp); +/** As trn_cell_introduce1_get_extensions, but take and return a const * pointer */ -const struct cell_extension_st * hs_cell_introduce1_getconst_extensions(const hs_cell_introduce1_t *inp); -/** Set the value of the extensions field of the hs_cell_introduce1_t +const struct trn_cell_extension_st * trn_cell_introduce1_getconst_extensions(const trn_cell_introduce1_t *inp); +/** Set the value of the extensions field of the trn_cell_introduce1_t * in 'inp' to 'val'. Free the old value if any. Steals the * referenceto 'val'.Return 0 on success; return -1 and set the error * code on 'inp' on failure. */ -int hs_cell_introduce1_set_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val); -/** As hs_cell_introduce1_set_extensions, but does not free the +int trn_cell_introduce1_set_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_introduce1_set_extensions, but does not free the * previous value. */ -int hs_cell_introduce1_set0_extensions(hs_cell_introduce1_t *inp, struct cell_extension_st *val); +int trn_cell_introduce1_set0_extensions(trn_cell_introduce1_t *inp, struct trn_cell_extension_st *val); /** Return the length of the dynamic array holding the encrypted field - * of the hs_cell_introduce1_t in 'inp'. + * of the trn_cell_introduce1_t in 'inp'. */ -size_t hs_cell_introduce1_getlen_encrypted(const hs_cell_introduce1_t *inp); +size_t trn_cell_introduce1_getlen_encrypted(const trn_cell_introduce1_t *inp); /** Return the element at position 'idx' of the dynamic array field - * encrypted of the hs_cell_introduce1_t in 'inp'. + * encrypted of the trn_cell_introduce1_t in 'inp'. */ -uint8_t hs_cell_introduce1_get_encrypted(hs_cell_introduce1_t *inp, size_t idx); -/** As hs_cell_introduce1_get_encrypted, but take and return a const +uint8_t trn_cell_introduce1_get_encrypted(trn_cell_introduce1_t *inp, size_t idx); +/** As trn_cell_introduce1_get_encrypted, but take and return a const * pointer */ -uint8_t hs_cell_introduce1_getconst_encrypted(const hs_cell_introduce1_t *inp, size_t idx); +uint8_t trn_cell_introduce1_getconst_encrypted(const trn_cell_introduce1_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * encrypted of the hs_cell_introduce1_t in 'inp', so that it will + * encrypted of the trn_cell_introduce1_t in 'inp', so that it will * hold the value 'elt'. */ -int hs_cell_introduce1_set_encrypted(hs_cell_introduce1_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce1_set_encrypted(trn_cell_introduce1_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field encrypted of - * the hs_cell_introduce1_t in 'inp'. + * the trn_cell_introduce1_t in 'inp'. */ -int hs_cell_introduce1_add_encrypted(hs_cell_introduce1_t *inp, uint8_t elt); +int trn_cell_introduce1_add_encrypted(trn_cell_introduce1_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field encrypted of * 'inp'. */ -uint8_t * hs_cell_introduce1_getarray_encrypted(hs_cell_introduce1_t *inp); -/** As hs_cell_introduce1_get_encrypted, but take and return a const +uint8_t * trn_cell_introduce1_getarray_encrypted(trn_cell_introduce1_t *inp); +/** As trn_cell_introduce1_get_encrypted, but take and return a const * pointer */ -const uint8_t * hs_cell_introduce1_getconstarray_encrypted(const hs_cell_introduce1_t *inp); +const uint8_t * trn_cell_introduce1_getconstarray_encrypted(const trn_cell_introduce1_t *inp); /** Change the length of the variable-length array field encrypted of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce1_setlen_encrypted(hs_cell_introduce1_t *inp, size_t newlen); -/** Return a newly allocated hs_cell_introduce_ack with all elements +int trn_cell_introduce1_setlen_encrypted(trn_cell_introduce1_t *inp, size_t newlen); +/** Return a newly allocated trn_cell_introduce_ack with all elements * set to zero. */ -hs_cell_introduce_ack_t *hs_cell_introduce_ack_new(void); -/** Release all storage held by the hs_cell_introduce_ack in 'victim'. - * (Do nothing if 'victim' is NULL.) +trn_cell_introduce_ack_t *trn_cell_introduce_ack_new(void); +/** Release all storage held by the trn_cell_introduce_ack in + * 'victim'. (Do nothing if 'victim' is NULL.) */ -void hs_cell_introduce_ack_free(hs_cell_introduce_ack_t *victim); -/** Try to parse a hs_cell_introduce_ack from the buffer in 'input', +void trn_cell_introduce_ack_free(trn_cell_introduce_ack_t *victim); +/** Try to parse a trn_cell_introduce_ack from the buffer in 'input', * using up to 'len_in' bytes from the input buffer. On success, * return the number of bytes consumed and set *output to the newly - * allocated hs_cell_introduce_ack_t. On failure, return -2 if the + * allocated trn_cell_introduce_ack_t. On failure, return -2 if the * input appears truncated, and -1 if the input is otherwise invalid. */ -ssize_t hs_cell_introduce_ack_parse(hs_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_introduce_ack_parse(trn_cell_introduce_ack_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_introduce_ack in 'obj'. On failure, return a negative + * trn_cell_introduce_ack in 'obj'. On failure, return a negative * value. Note that this value may be an overestimate, and can even be * an underestimate for certain unencodeable objects. */ -ssize_t hs_cell_introduce_ack_encoded_len(const hs_cell_introduce_ack_t *obj); -/** Try to encode the hs_cell_introduce_ack from 'input' into the +ssize_t trn_cell_introduce_ack_encoded_len(const trn_cell_introduce_ack_t *obj); +/** Try to encode the trn_cell_introduce_ack from 'input' into the * buffer at 'output', using up to 'avail' bytes of the output buffer. * On success, return the number of bytes used. On failure, return -2 * if the buffer was not long enough, and -1 if the input was invalid. */ -ssize_t hs_cell_introduce_ack_encode(uint8_t *output, size_t avail, const hs_cell_introduce_ack_t *input); -/** Check whether the internal state of the hs_cell_introduce_ack in +ssize_t trn_cell_introduce_ack_encode(uint8_t *output, size_t avail, const trn_cell_introduce_ack_t *input); +/** Check whether the internal state of the trn_cell_introduce_ack in * 'obj' is consistent. Return NULL if it is, and a short message if * it is not. */ -const char *hs_cell_introduce_ack_check(const hs_cell_introduce_ack_t *obj); +const char *trn_cell_introduce_ack_check(const trn_cell_introduce_ack_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_introduce_ack_clear_errors(hs_cell_introduce_ack_t *obj); +int trn_cell_introduce_ack_clear_errors(trn_cell_introduce_ack_t *obj); /** Return the value of the status field of the - * hs_cell_introduce_ack_t in 'inp' + * trn_cell_introduce_ack_t in 'inp' */ -uint16_t hs_cell_introduce_ack_get_status(const hs_cell_introduce_ack_t *inp); -/** Set the value of the status field of the hs_cell_introduce_ack_t +uint16_t trn_cell_introduce_ack_get_status(const trn_cell_introduce_ack_t *inp); +/** Set the value of the status field of the trn_cell_introduce_ack_t * in 'inp' to 'val'. Return 0 on success; return -1 and set the error * code on 'inp' on failure. */ -int hs_cell_introduce_ack_set_status(hs_cell_introduce_ack_t *inp, uint16_t val); +int trn_cell_introduce_ack_set_status(trn_cell_introduce_ack_t *inp, uint16_t val); /** Return the value of the extensions field of the - * hs_cell_introduce_ack_t in 'inp' + * trn_cell_introduce_ack_t in 'inp' */ -struct cell_extension_st * hs_cell_introduce_ack_get_extensions(hs_cell_introduce_ack_t *inp); -/** As hs_cell_introduce_ack_get_extensions, but take and return a +struct trn_cell_extension_st * trn_cell_introduce_ack_get_extensions(trn_cell_introduce_ack_t *inp); +/** As trn_cell_introduce_ack_get_extensions, but take and return a * const pointer */ -const struct cell_extension_st * hs_cell_introduce_ack_getconst_extensions(const hs_cell_introduce_ack_t *inp); +const struct trn_cell_extension_st * trn_cell_introduce_ack_getconst_extensions(const trn_cell_introduce_ack_t *inp); /** Set the value of the extensions field of the - * hs_cell_introduce_ack_t in 'inp' to 'val'. Free the old value if + * trn_cell_introduce_ack_t in 'inp' to 'val'. Free the old value if * any. Steals the referenceto 'val'.Return 0 on success; return -1 * and set the error code on 'inp' on failure. */ -int hs_cell_introduce_ack_set_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val); -/** As hs_cell_introduce_ack_set_extensions, but does not free the +int trn_cell_introduce_ack_set_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_introduce_ack_set_extensions, but does not free the * previous value. */ -int hs_cell_introduce_ack_set0_extensions(hs_cell_introduce_ack_t *inp, struct cell_extension_st *val); -/** Return a newly allocated hs_cell_introduce_encrypted with all +int trn_cell_introduce_ack_set0_extensions(trn_cell_introduce_ack_t *inp, struct trn_cell_extension_st *val); +/** Return a newly allocated trn_cell_introduce_encrypted with all * elements set to zero. */ -hs_cell_introduce_encrypted_t *hs_cell_introduce_encrypted_new(void); -/** Release all storage held by the hs_cell_introduce_encrypted in +trn_cell_introduce_encrypted_t *trn_cell_introduce_encrypted_new(void); +/** Release all storage held by the trn_cell_introduce_encrypted in * 'victim'. (Do nothing if 'victim' is NULL.) */ -void hs_cell_introduce_encrypted_free(hs_cell_introduce_encrypted_t *victim); -/** Try to parse a hs_cell_introduce_encrypted from the buffer in +void trn_cell_introduce_encrypted_free(trn_cell_introduce_encrypted_t *victim); +/** Try to parse a trn_cell_introduce_encrypted from the buffer in * 'input', using up to 'len_in' bytes from the input buffer. On * success, return the number of bytes consumed and set *output to the - * newly allocated hs_cell_introduce_encrypted_t. On failure, return + * newly allocated trn_cell_introduce_encrypted_t. On failure, return * -2 if the input appears truncated, and -1 if the input is otherwise * invalid. */ -ssize_t hs_cell_introduce_encrypted_parse(hs_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in); +ssize_t trn_cell_introduce_encrypted_parse(trn_cell_introduce_encrypted_t **output, const uint8_t *input, const size_t len_in); /** Return the number of bytes we expect to need to encode the - * hs_cell_introduce_encrypted in 'obj'. On failure, return a negative - * value. Note that this value may be an overestimate, and can even be - * an underestimate for certain unencodeable objects. + * trn_cell_introduce_encrypted in 'obj'. On failure, return a + * negative value. Note that this value may be an overestimate, and + * can even be an underestimate for certain unencodeable objects. */ -ssize_t hs_cell_introduce_encrypted_encoded_len(const hs_cell_introduce_encrypted_t *obj); -/** Try to encode the hs_cell_introduce_encrypted from 'input' into +ssize_t trn_cell_introduce_encrypted_encoded_len(const trn_cell_introduce_encrypted_t *obj); +/** Try to encode the trn_cell_introduce_encrypted from 'input' into * the buffer at 'output', using up to 'avail' bytes of the output * buffer. On success, return the number of bytes used. On failure, * return -2 if the buffer was not long enough, and -1 if the input * was invalid. */ -ssize_t hs_cell_introduce_encrypted_encode(uint8_t *output, size_t avail, const hs_cell_introduce_encrypted_t *input); +ssize_t trn_cell_introduce_encrypted_encode(uint8_t *output, size_t avail, const trn_cell_introduce_encrypted_t *input); /** Check whether the internal state of the - * hs_cell_introduce_encrypted in 'obj' is consistent. Return NULL if + * trn_cell_introduce_encrypted in 'obj' is consistent. Return NULL if * it is, and a short message if it is not. */ -const char *hs_cell_introduce_encrypted_check(const hs_cell_introduce_encrypted_t *obj); +const char *trn_cell_introduce_encrypted_check(const trn_cell_introduce_encrypted_t *obj); /** Clear any errors that were set on the object 'obj' by its setter * functions. Return true iff errors were cleared. */ -int hs_cell_introduce_encrypted_clear_errors(hs_cell_introduce_encrypted_t *obj); +int trn_cell_introduce_encrypted_clear_errors(trn_cell_introduce_encrypted_t *obj); /** Return the (constant) length of the array holding the rend_cookie - * field of the hs_cell_introduce_encrypted_t in 'inp'. + * field of the trn_cell_introduce_encrypted_t in 'inp'. */ -size_t hs_cell_introduce_encrypted_getlen_rend_cookie(const hs_cell_introduce_encrypted_t *inp); +size_t trn_cell_introduce_encrypted_getlen_rend_cookie(const trn_cell_introduce_encrypted_t *inp); /** Return the element at position 'idx' of the fixed array field - * rend_cookie of the hs_cell_introduce_encrypted_t in 'inp'. + * rend_cookie of the trn_cell_introduce_encrypted_t in 'inp'. */ -uint8_t hs_cell_introduce_encrypted_get_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx); -/** As hs_cell_introduce_encrypted_get_rend_cookie, but take and +uint8_t trn_cell_introduce_encrypted_get_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx); +/** As trn_cell_introduce_encrypted_get_rend_cookie, but take and * return a const pointer */ -uint8_t hs_cell_introduce_encrypted_getconst_rend_cookie(const hs_cell_introduce_encrypted_t *inp, size_t idx); +uint8_t trn_cell_introduce_encrypted_getconst_rend_cookie(const trn_cell_introduce_encrypted_t *inp, size_t idx); /** Change the element at position 'idx' of the fixed array field - * rend_cookie of the hs_cell_introduce_encrypted_t in 'inp', so that + * rend_cookie of the trn_cell_introduce_encrypted_t in 'inp', so that * it will hold the value 'elt'. */ -int hs_cell_introduce_encrypted_set_rend_cookie(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce_encrypted_set_rend_cookie(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); /** Return a pointer to the TRUNNEL_REND_COOKIE_LEN-element array * field rend_cookie of 'inp'. */ -uint8_t * hs_cell_introduce_encrypted_getarray_rend_cookie(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_rend_cookie, but take and +uint8_t * trn_cell_introduce_encrypted_getarray_rend_cookie(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_rend_cookie, but take and * return a const pointer */ -const uint8_t * hs_cell_introduce_encrypted_getconstarray_rend_cookie(const hs_cell_introduce_encrypted_t *inp); +const uint8_t * trn_cell_introduce_encrypted_getconstarray_rend_cookie(const trn_cell_introduce_encrypted_t *inp); /** Return the value of the extensions field of the - * hs_cell_introduce_encrypted_t in 'inp' + * trn_cell_introduce_encrypted_t in 'inp' */ -struct cell_extension_st * hs_cell_introduce_encrypted_get_extensions(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_extensions, but take and return - * a const pointer +struct trn_cell_extension_st * trn_cell_introduce_encrypted_get_extensions(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_extensions, but take and + * return a const pointer */ -const struct cell_extension_st * hs_cell_introduce_encrypted_getconst_extensions(const hs_cell_introduce_encrypted_t *inp); +const struct trn_cell_extension_st * trn_cell_introduce_encrypted_getconst_extensions(const trn_cell_introduce_encrypted_t *inp); /** Set the value of the extensions field of the - * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Free the old value - * if any. Steals the referenceto 'val'.Return 0 on success; return -1 - * and set the error code on 'inp' on failure. + * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Free the old + * value if any. Steals the referenceto 'val'.Return 0 on success; + * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_set_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val); -/** As hs_cell_introduce_encrypted_set_extensions, but does not free +int trn_cell_introduce_encrypted_set_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val); +/** As trn_cell_introduce_encrypted_set_extensions, but does not free * the previous value. */ -int hs_cell_introduce_encrypted_set0_extensions(hs_cell_introduce_encrypted_t *inp, struct cell_extension_st *val); +int trn_cell_introduce_encrypted_set0_extensions(trn_cell_introduce_encrypted_t *inp, struct trn_cell_extension_st *val); /** Return the value of the onion_key_type field of the - * hs_cell_introduce_encrypted_t in 'inp' + * trn_cell_introduce_encrypted_t in 'inp' */ -uint8_t hs_cell_introduce_encrypted_get_onion_key_type(const hs_cell_introduce_encrypted_t *inp); +uint8_t trn_cell_introduce_encrypted_get_onion_key_type(const trn_cell_introduce_encrypted_t *inp); /** Set the value of the onion_key_type field of the - * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on + * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on * success; return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_set_onion_key_type(hs_cell_introduce_encrypted_t *inp, uint8_t val); +int trn_cell_introduce_encrypted_set_onion_key_type(trn_cell_introduce_encrypted_t *inp, uint8_t val); /** Return the value of the onion_key_len field of the - * hs_cell_introduce_encrypted_t in 'inp' + * trn_cell_introduce_encrypted_t in 'inp' */ -uint16_t hs_cell_introduce_encrypted_get_onion_key_len(const hs_cell_introduce_encrypted_t *inp); +uint16_t trn_cell_introduce_encrypted_get_onion_key_len(const trn_cell_introduce_encrypted_t *inp); /** Set the value of the onion_key_len field of the - * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on + * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on * success; return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_set_onion_key_len(hs_cell_introduce_encrypted_t *inp, uint16_t val); +int trn_cell_introduce_encrypted_set_onion_key_len(trn_cell_introduce_encrypted_t *inp, uint16_t val); /** Return the length of the dynamic array holding the onion_key field - * of the hs_cell_introduce_encrypted_t in 'inp'. + * of the trn_cell_introduce_encrypted_t in 'inp'. */ -size_t hs_cell_introduce_encrypted_getlen_onion_key(const hs_cell_introduce_encrypted_t *inp); +size_t trn_cell_introduce_encrypted_getlen_onion_key(const trn_cell_introduce_encrypted_t *inp); /** Return the element at position 'idx' of the dynamic array field - * onion_key of the hs_cell_introduce_encrypted_t in 'inp'. + * onion_key of the trn_cell_introduce_encrypted_t in 'inp'. */ -uint8_t hs_cell_introduce_encrypted_get_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx); -/** As hs_cell_introduce_encrypted_get_onion_key, but take and return +uint8_t trn_cell_introduce_encrypted_get_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx); +/** As trn_cell_introduce_encrypted_get_onion_key, but take and return * a const pointer */ -uint8_t hs_cell_introduce_encrypted_getconst_onion_key(const hs_cell_introduce_encrypted_t *inp, size_t idx); +uint8_t trn_cell_introduce_encrypted_getconst_onion_key(const trn_cell_introduce_encrypted_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * onion_key of the hs_cell_introduce_encrypted_t in 'inp', so that it - * will hold the value 'elt'. + * onion_key of the trn_cell_introduce_encrypted_t in 'inp', so that + * it will hold the value 'elt'. */ -int hs_cell_introduce_encrypted_set_onion_key(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce_encrypted_set_onion_key(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field onion_key of - * the hs_cell_introduce_encrypted_t in 'inp'. + * the trn_cell_introduce_encrypted_t in 'inp'. */ -int hs_cell_introduce_encrypted_add_onion_key(hs_cell_introduce_encrypted_t *inp, uint8_t elt); +int trn_cell_introduce_encrypted_add_onion_key(trn_cell_introduce_encrypted_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field onion_key of * 'inp'. */ -uint8_t * hs_cell_introduce_encrypted_getarray_onion_key(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_onion_key, but take and return +uint8_t * trn_cell_introduce_encrypted_getarray_onion_key(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_onion_key, but take and return * a const pointer */ -const uint8_t * hs_cell_introduce_encrypted_getconstarray_onion_key(const hs_cell_introduce_encrypted_t *inp); +const uint8_t * trn_cell_introduce_encrypted_getconstarray_onion_key(const trn_cell_introduce_encrypted_t *inp); /** Change the length of the variable-length array field onion_key of * 'inp' to 'newlen'.Fill extra elements with 0. Return 0 on success; * return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_setlen_onion_key(hs_cell_introduce_encrypted_t *inp, size_t newlen); +int trn_cell_introduce_encrypted_setlen_onion_key(trn_cell_introduce_encrypted_t *inp, size_t newlen); /** Return the value of the nspec field of the - * hs_cell_introduce_encrypted_t in 'inp' + * trn_cell_introduce_encrypted_t in 'inp' */ -uint8_t hs_cell_introduce_encrypted_get_nspec(const hs_cell_introduce_encrypted_t *inp); +uint8_t trn_cell_introduce_encrypted_get_nspec(const trn_cell_introduce_encrypted_t *inp); /** Set the value of the nspec field of the - * hs_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on + * trn_cell_introduce_encrypted_t in 'inp' to 'val'. Return 0 on * success; return -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_set_nspec(hs_cell_introduce_encrypted_t *inp, uint8_t val); +int trn_cell_introduce_encrypted_set_nspec(trn_cell_introduce_encrypted_t *inp, uint8_t val); /** Return the length of the dynamic array holding the nspecs field of - * the hs_cell_introduce_encrypted_t in 'inp'. + * the trn_cell_introduce_encrypted_t in 'inp'. */ -size_t hs_cell_introduce_encrypted_getlen_nspecs(const hs_cell_introduce_encrypted_t *inp); +size_t trn_cell_introduce_encrypted_getlen_nspecs(const trn_cell_introduce_encrypted_t *inp); /** Return the element at position 'idx' of the dynamic array field - * nspecs of the hs_cell_introduce_encrypted_t in 'inp'. + * nspecs of the trn_cell_introduce_encrypted_t in 'inp'. */ -struct link_specifier_st * hs_cell_introduce_encrypted_get_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx); -/** As hs_cell_introduce_encrypted_get_nspecs, but take and return a +struct link_specifier_st * trn_cell_introduce_encrypted_get_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx); +/** As trn_cell_introduce_encrypted_get_nspecs, but take and return a * const pointer */ - const struct link_specifier_st * hs_cell_introduce_encrypted_getconst_nspecs(const hs_cell_introduce_encrypted_t *inp, size_t idx); + const struct link_specifier_st * trn_cell_introduce_encrypted_getconst_nspecs(const trn_cell_introduce_encrypted_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * nspecs of the hs_cell_introduce_encrypted_t in 'inp', so that it + * nspecs of the trn_cell_introduce_encrypted_t in 'inp', so that it * will hold the value 'elt'. Free the previous value, if any. */ -int hs_cell_introduce_encrypted_set_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); -/** As hs_cell_introduce_encrypted_set_nspecs, but does not free the +int trn_cell_introduce_encrypted_set_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); +/** As trn_cell_introduce_encrypted_set_nspecs, but does not free the * previous value. */ -int hs_cell_introduce_encrypted_set0_nspecs(hs_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); +int trn_cell_introduce_encrypted_set0_nspecs(trn_cell_introduce_encrypted_t *inp, size_t idx, struct link_specifier_st * elt); /** Append a new element 'elt' to the dynamic array field nspecs of - * the hs_cell_introduce_encrypted_t in 'inp'. + * the trn_cell_introduce_encrypted_t in 'inp'. */ -int hs_cell_introduce_encrypted_add_nspecs(hs_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt); +int trn_cell_introduce_encrypted_add_nspecs(trn_cell_introduce_encrypted_t *inp, struct link_specifier_st * elt); /** Return a pointer to the variable-length array field nspecs of * 'inp'. */ -struct link_specifier_st * * hs_cell_introduce_encrypted_getarray_nspecs(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_nspecs, but take and return a +struct link_specifier_st * * trn_cell_introduce_encrypted_getarray_nspecs(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_nspecs, but take and return a * const pointer */ -const struct link_specifier_st * const * hs_cell_introduce_encrypted_getconstarray_nspecs(const hs_cell_introduce_encrypted_t *inp); +const struct link_specifier_st * const * trn_cell_introduce_encrypted_getconstarray_nspecs(const trn_cell_introduce_encrypted_t *inp); /** Change the length of the variable-length array field nspecs of * 'inp' to 'newlen'.Fill extra elements with NULL; free removed * elements. Return 0 on success; return -1 and set the error code on * 'inp' on failure. */ -int hs_cell_introduce_encrypted_setlen_nspecs(hs_cell_introduce_encrypted_t *inp, size_t newlen); +int trn_cell_introduce_encrypted_setlen_nspecs(trn_cell_introduce_encrypted_t *inp, size_t newlen); /** Return the length of the dynamic array holding the pad field of - * the hs_cell_introduce_encrypted_t in 'inp'. + * the trn_cell_introduce_encrypted_t in 'inp'. */ -size_t hs_cell_introduce_encrypted_getlen_pad(const hs_cell_introduce_encrypted_t *inp); +size_t trn_cell_introduce_encrypted_getlen_pad(const trn_cell_introduce_encrypted_t *inp); /** Return the element at position 'idx' of the dynamic array field - * pad of the hs_cell_introduce_encrypted_t in 'inp'. + * pad of the trn_cell_introduce_encrypted_t in 'inp'. */ -uint8_t hs_cell_introduce_encrypted_get_pad(hs_cell_introduce_encrypted_t *inp, size_t idx); -/** As hs_cell_introduce_encrypted_get_pad, but take and return a +uint8_t trn_cell_introduce_encrypted_get_pad(trn_cell_introduce_encrypted_t *inp, size_t idx); +/** As trn_cell_introduce_encrypted_get_pad, but take and return a * const pointer */ -uint8_t hs_cell_introduce_encrypted_getconst_pad(const hs_cell_introduce_encrypted_t *inp, size_t idx); +uint8_t trn_cell_introduce_encrypted_getconst_pad(const trn_cell_introduce_encrypted_t *inp, size_t idx); /** Change the element at position 'idx' of the dynamic array field - * pad of the hs_cell_introduce_encrypted_t in 'inp', so that it will + * pad of the trn_cell_introduce_encrypted_t in 'inp', so that it will * hold the value 'elt'. */ -int hs_cell_introduce_encrypted_set_pad(hs_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); +int trn_cell_introduce_encrypted_set_pad(trn_cell_introduce_encrypted_t *inp, size_t idx, uint8_t elt); /** Append a new element 'elt' to the dynamic array field pad of the - * hs_cell_introduce_encrypted_t in 'inp'. + * trn_cell_introduce_encrypted_t in 'inp'. */ -int hs_cell_introduce_encrypted_add_pad(hs_cell_introduce_encrypted_t *inp, uint8_t elt); +int trn_cell_introduce_encrypted_add_pad(trn_cell_introduce_encrypted_t *inp, uint8_t elt); /** Return a pointer to the variable-length array field pad of 'inp'. */ -uint8_t * hs_cell_introduce_encrypted_getarray_pad(hs_cell_introduce_encrypted_t *inp); -/** As hs_cell_introduce_encrypted_get_pad, but take and return a +uint8_t * trn_cell_introduce_encrypted_getarray_pad(trn_cell_introduce_encrypted_t *inp); +/** As trn_cell_introduce_encrypted_get_pad, but take and return a * const pointer */ -const uint8_t * hs_cell_introduce_encrypted_getconstarray_pad(const hs_cell_introduce_encrypted_t *inp); +const uint8_t * trn_cell_introduce_encrypted_getconstarray_pad(const trn_cell_introduce_encrypted_t *inp); /** Change the length of the variable-length array field pad of 'inp' * to 'newlen'.Fill extra elements with 0. Return 0 on success; return * -1 and set the error code on 'inp' on failure. */ -int hs_cell_introduce_encrypted_setlen_pad(hs_cell_introduce_encrypted_t *inp, size_t newlen); +int trn_cell_introduce_encrypted_setlen_pad(trn_cell_introduce_encrypted_t *inp, size_t newlen); #endif diff --git a/src/trunnel/hs/cell_introduce1.trunnel b/src/trunnel/hs/cell_introduce1.trunnel index f7776879cd..7577c1526f 100644 --- a/src/trunnel/hs/cell_introduce1.trunnel +++ b/src/trunnel/hs/cell_introduce1.trunnel @@ -5,7 +5,7 @@ */ /* From cell_common.trunnel. */ -extern struct cell_extension; +extern struct trn_cell_extension; /* From ed25519_cert.trunnel. */ extern struct link_specifier; @@ -13,7 +13,7 @@ const TRUNNEL_SHA1_LEN = 20; const TRUNNEL_REND_COOKIE_LEN = 20; /* INTRODUCE1 payload. See details in section 3.2.1. */ -struct hs_cell_introduce1 { +struct trn_cell_introduce1 { /* Always zeroed. MUST be checked explicitely by the caller. */ u8 legacy_key_id[TRUNNEL_SHA1_LEN]; @@ -23,28 +23,28 @@ struct hs_cell_introduce1 { u8 auth_key[auth_key_len]; /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; /* Variable length, up to the end of cell. */ u8 encrypted[]; }; /* INTRODUCE_ACK payload. See details in section 3.2.2. */ -struct hs_cell_introduce_ack { +struct trn_cell_introduce_ack { /* Status of introduction. */ u16 status IN [0x0000, 0x0001, 0x0002]; /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; }; /* Encrypted section of the INTRODUCE1/INTRODUCE2 cell. */ -struct hs_cell_introduce_encrypted { +struct trn_cell_introduce_encrypted { /* Rendezvous cookie. */ u8 rend_cookie[TRUNNEL_REND_COOKIE_LEN]; /* Extension(s). Reserved fields. */ - struct cell_extension extensions; + struct trn_cell_extension extensions; /* Onion key material. */ u8 onion_key_type IN [0x01]; |