summaryrefslogtreecommitdiffstats
path: root/netaddr/ip
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--netaddr/ip/__init__.py2206
-rw-r--r--netaddr/ip/glob.py312
-rwxr-xr-xnetaddr/ip/iana.py448
-rw-r--r--netaddr/ip/ipv4-address-space.xml2647
-rw-r--r--netaddr/ip/ipv6-address-space.xml198
-rw-r--r--netaddr/ip/ipv6-unicast-address-assignments.xml435
-rw-r--r--netaddr/ip/multicast-addresses.xml4914
-rw-r--r--netaddr/ip/nmap.py117
-rw-r--r--netaddr/ip/rfc1924.py61
-rw-r--r--netaddr/ip/sets.py748
10 files changed, 12086 insertions, 0 deletions
diff --git a/netaddr/ip/__init__.py b/netaddr/ip/__init__.py
new file mode 100644
index 0000000..0669224
--- /dev/null
+++ b/netaddr/ip/__init__.py
@@ -0,0 +1,2206 @@
+#-----------------------------------------------------------------------------
+# Copyright (c) 2008 by David P. D. Moss. All rights reserved.
+#
+# Released under the BSD license. See the LICENSE file for details.
+#-----------------------------------------------------------------------------
+"""Routines for IPv4 and IPv6 addresses, subnets and ranges."""
+
+import sys as _sys
+
+from netaddr.core import AddrFormatError, AddrConversionError, num_bits, \
+ DictDotLookup, NOHOST, N, INET_ATON, INET_PTON, P, ZEROFILL, Z
+
+from netaddr.strategy import ipv4 as _ipv4, ipv6 as _ipv6
+
+from netaddr.compat import _sys_maxint, _iter_next, _iter_range, _is_str, _int_type, \
+ _str_type
+
+
+class BaseIP(object):
+ """
+ An abstract base class for common operations shared between various IP
+ related subclasses.
+
+ """
+ __slots__ = ('_value', '_module', '__weakref__')
+
+ def __init__(self):
+ """Constructor."""
+ self._value = None
+ self._module = None
+
+ def _set_value(self, value):
+ if not isinstance(value, _int_type):
+ raise TypeError('int argument expected, not %s' % type(value))
+ if not 0 <= value <= self._module.max_int:
+ raise AddrFormatError('value out of bounds for an %s address!' \
+ % self._module.family_name)
+ self._value = value
+
+ value = property(lambda self: self._value, _set_value,
+ doc='a positive integer representing the value of IP address/subnet.')
+
+ def key(self):
+ """
+ :return: a key tuple that uniquely identifies this IP address.
+ """
+ return NotImplemented
+
+ def sort_key(self):
+ """
+ :return: A key tuple used to compare and sort this `IPAddress`
+ correctly.
+ """
+ return NotImplemented
+
+ def __hash__(self):
+ """
+ :return: A hash value uniquely identifying this IP object.
+ """
+ return hash(self.key())
+
+ def __eq__(self, other):
+ """
+ :param other: an `IPAddress` or `IPNetwork` object.
+
+ :return: ``True`` if this `IPAddress` or `IPNetwork` object is
+ equivalent to ``other``, ``False`` otherwise.
+ """
+ try:
+ return self.key() == other.key()
+ except (AttributeError, TypeError):
+ return NotImplemented
+
+ def __ne__(self, other):
+ """
+ :param other: an `IPAddress` or `IPNetwork` object.
+
+ :return: ``True`` if this `IPAddress` or `IPNetwork` object is
+ not equivalent to ``other``, ``False`` otherwise.
+ """
+ try:
+ return self.key() != other.key()
+ except (AttributeError, TypeError):
+ return NotImplemented
+
+ def __lt__(self, other):
+ """
+ :param other: an `IPAddress` or `IPNetwork` object.
+
+ :return: ``True`` if this `IPAddress` or `IPNetwork` object is
+ less than ``other``, ``False`` otherwise.
+ """
+ try:
+ return self.sort_key() < other.sort_key()
+ except (AttributeError, TypeError):
+ return NotImplemented
+
+ def __le__(self, other):
+ """
+ :param other: an `IPAddress` or `IPNetwork` object.
+
+ :return: ``True`` if this `IPAddress` or `IPNetwork` object is
+ less than or equal to ``other``, ``False`` otherwise.
+ """
+ try:
+ return self.sort_key() <= other.sort_key()
+ except (AttributeError, TypeError):
+ return NotImplemented
+
+ def __gt__(self, other):
+ """
+ :param other: an `IPAddress` or `IPNetwork` object.
+
+ :return: ``True`` if this `IPAddress` or `IPNetwork` object is
+ greater than ``other``, ``False`` otherwise.
+ """
+ try:
+ return self.sort_key() > other.sort_key()
+ except (AttributeError, TypeError):
+ return NotImplemented
+
+ def __ge__(self, other):
+ """
+ :param other: an `IPAddress` or `IPNetwork` object.
+
+ :return: ``True`` if this `IPAddress` or `IPNetwork` object is
+ greater than or equal to ``other``, ``False`` otherwise.
+ """
+ try:
+ return self.sort_key() >= other.sort_key()
+ except (AttributeError, TypeError):
+ return NotImplemented
+
+ def is_unicast(self):
+ """:return: ``True`` if this IP is unicast, ``False`` otherwise"""
+ return not self.is_multicast()
+
+ def is_multicast(self):
+ """:return: ``True`` if this IP is multicast, ``False`` otherwise"""
+ if self._module == _ipv4:
+ return self in IPV4_MULTICAST
+ elif self._module == _ipv6:
+ return self in IPV6_MULTICAST
+
+ def is_loopback(self):
+ """
+ :return: ``True`` if this IP is loopback address (not for network
+ transmission), ``False`` otherwise.
+ References: RFC 3330 and 4291.
+
+ .. note:: |ipv4_in_ipv6_handling|
+ """
+ if self._module.version == 4:
+ return self in IPV4_LOOPBACK
+ elif self._module.version == 6:
+ return self in IPV6_LOOPBACK
+
+ def is_private(self):
+ """
+ :return: ``True`` if this IP is for internal/private use only
+ (i.e. non-public), ``False`` otherwise. Reference: RFCs 1918,
+ 3330, 4193, 3879 and 2365.
+
+ .. note:: |ipv4_in_ipv6_handling|
+
+ .. deprecated:: 0.10.0
+ The ``is_private`` method has been mixing several different address types together
+ which could lead to unexpected results. There are more precise
+ replacements for subset of the addresses handled by ``is_private`` today:
+
+ * :meth:`is_link_local`
+ * :meth:`is_ipv4_private_use`
+ * :meth:`is_ipv6_unique_local`
+
+ There is also the :meth:`is_global` method that lets you handle all globally
+ reachable (or not) addresses.
+
+ The following address blocks currently handled by ``is_private`` have no
+ convenience methods and you'll have to handle them manually or request a method
+ addition:
+
+ * ``100.64.0.0/10`` – Shared Address Space
+ * ``192.0.0.0/24`` – IETF Protocol Assignments
+ * ``198.18.0.0/15`` – Benchmarking
+ * ``239.0.0.0``-``239.255.255.255``
+ """
+ if self._module.version == 4:
+ for cidr in IPV4_PRIVATEISH:
+ if self in cidr:
+ return True
+ elif self._module.version == 6:
+ for cidr in IPV6_PRIVATEISH:
+ if self in cidr:
+ return True
+
+ if self.is_link_local():
+ return True
+
+ return False
+
+ def is_link_local(self):
+ """
+ :return: ``True`` if this IP is link-local address ``False`` otherwise.
+ Reference: RFCs 3927 and 4291.
+
+ .. note:: |ipv4_in_ipv6_handling|
+ """
+ if self._module.version == 4:
+ return self in IPV4_LINK_LOCAL
+ elif self._module.version == 6:
+ return self in IPV6_LINK_LOCAL
+
+ def is_reserved(self):
+ """
+ :return: ``True`` if this IP is in IANA reserved range, ``False``
+ otherwise. Reference: RFCs 3330 and 3171.
+
+ .. note:: |ipv4_in_ipv6_handling|
+ """
+ if self._module.version == 4:
+ for cidr in IPV4_RESERVED:
+ if self in cidr:
+ return True
+ elif self._module.version == 6:
+ for cidr in IPV6_RESERVED:
+ if self in cidr:
+ return True
+ return False
+
+ def is_ipv4_mapped(self):
+ """
+ :return: ``True`` if this IP is IPv4-compatible IPv6 address, ``False``
+ otherwise.
+ """
+ return self._module.version == 6 and (self._value >> 32) == 0xffff
+
+ def is_ipv4_compat(self):
+ """
+ :return: ``True`` if this IP is IPv4-mapped IPv6 address, ``False``
+ otherwise.
+ """
+ return self._module.version == 6 and (self._value >> 32) == 0
+
+ @property
+ def info(self):
+ """
+ A record dict containing IANA registration details for this IP address
+ if available, None otherwise.
+ """
+ # Lazy loading of IANA data structures.
+ from netaddr.ip.iana import query
+ return DictDotLookup(query(self))
+
+ @property
+ def version(self):
+ """the IP protocol version represented by this IP object."""
+ return self._module.version
+
+
+class IPAddress(BaseIP):
+ """
+ An individual IPv4 or IPv6 address without a net mask or subnet prefix.
+
+ To support these and other network based operations, see `IPNetwork`.
+
+ """
+ __slots__ = ()
+
+ def __init__(self, addr, version=None, flags=0):
+ """
+ Constructor.
+
+ :param addr: an IPv4 or IPv6 address which may be represented in an
+ accepted string format, as an unsigned integer or as another
+ IPAddress object (copy construction).
+
+ :param version: (optional) optimizes version detection if specified
+ and distinguishes between IPv4 and IPv6 for addresses with an
+ equivalent integer value.
+
+ :param flags: (optional) decides which rules are applied to the
+ interpretation of the addr value if passed as a string.
+
+ Matters only in IPv4 context.
+
+ Allowed flag values:
+
+ * The default (``0``) or :data:`INET_ATON`. Follows `inet_aton semantics
+ <https://www.netmeister.org/blog/inet_aton.html>`_ and allows all kinds of
+ weird-looking addresses to be parsed. For example:
+
+ >>> IPAddress('1')
+ IPAddress('0.0.0.1')
+ >>> IPAddress('1.0xf')
+ IPAddress('1.0.0.15')
+ >>> IPAddress('010.020.030.040')
+ IPAddress('8.16.24.32')
+
+ * ``INET_ATON | ZEROFILL`` or :data:`ZEROFILL` – like the default, except leading zeros are discarded:
+
+ >>> IPAddress('010', flags=INET_ATON | ZEROFILL)
+ IPAddress('0.0.0.10')
+
+ * :data:`INET_PTON` – requires four decimal octets:
+
+ >>> IPAddress('10.0.0.1', flags=INET_PTON)
+ IPAddress('10.0.0.1')
+
+ Leading zeros may be ignored or rejected, depending on the platform.
+
+ * ``INET_PTON | ZEROFILL`` – like :data:`INET_PTON`, except leading zeros are
+ discarded:
+
+ >>> IPAddress('010.020.030.040', flags=INET_PTON | ZEROFILL)
+ IPAddress('10.20.30.40')
+
+ .. versionchanged:: 0.10.0
+ The default IPv4 parsing mode is scheduled to become :data:`INET_PTON` in the next
+ major release.
+ """
+ super(IPAddress, self).__init__()
+
+ if flags & ~(INET_PTON | ZEROFILL | INET_ATON):
+ raise ValueError('Unrecognized IPAddress flags value: %s' % (flags,))
+
+ if flags & INET_ATON and flags & INET_PTON:
+ raise ValueError('INET_ATON and INET_PTON are mutually exclusive')
+
+ if isinstance(addr, BaseIP):
+ # Copy constructor.
+ if version is not None and version != addr._module.version:
+ raise ValueError('cannot switch IP versions using '
+ 'copy constructor!')
+ self._value = addr._value
+ self._module = addr._module
+ else:
+ # Explicit IP address version.
+ if version is not None:
+ if version == 4:
+ self._module = _ipv4
+ elif version == 6:
+ self._module = _ipv6
+ else:
+ raise ValueError('%r is an invalid IP version!' % version)
+
+ if _is_str(addr) and '/' in addr:
+ raise ValueError('%s() does not support netmasks or subnet' \
+ ' prefixes! See documentation for details.'
+ % self.__class__.__name__)
+
+ if self._module is None:
+ # IP version is implicit, detect it from addr.
+ if isinstance(addr, _int_type):
+ try:
+ if 0 <= int(addr) <= _ipv4.max_int:
+ self._value = int(addr)
+ self._module = _ipv4
+ elif _ipv4.max_int < int(addr) <= _ipv6.max_int:
+ self._value = int(addr)
+ self._module = _ipv6
+ except ValueError:
+ pass
+ else:
+ for module in _ipv4, _ipv6:
+ try:
+ self._value = module.str_to_int(addr, flags)
+ except:
+ continue
+ else:
+ self._module = module
+ break
+
+ if self._module is None:
+ raise AddrFormatError('failed to detect a valid IP ' \
+ 'address from %r' % addr)
+ else:
+ # IP version is explicit.
+ if _is_str(addr):
+ try:
+ self._value = self._module.str_to_int(addr, flags)
+ except AddrFormatError:
+ raise AddrFormatError('base address %r is not IPv%d'
+ % (addr, self._module.version))
+ else:
+ if 0 <= int(addr) <= self._module.max_int:
+ self._value = int(addr)
+ else:
+ raise AddrFormatError('bad address format: %r' % (addr,))
+
+ def __getstate__(self):
+ """:returns: Pickled state of an `IPAddress` object."""
+ return self._value, self._module.version
+
+ def __setstate__(self, state):
+ """
+ :param state: data used to unpickle a pickled `IPAddress` object.
+
+ """
+ value, version = state
+
+ self._value = value
+
+ if version == 4:
+ self._module = _ipv4
+ elif version == 6:
+ self._module = _ipv6
+ else:
+ raise ValueError('unpickling failed for object state: %s' \
+ % str(state))
+
+ def netmask_bits(self):
+ """
+ @return: If this IP is a valid netmask, the number of non-zero
+ bits are returned, otherwise it returns the width in bits for
+ the IP address version.
+ """
+ if not self.is_netmask():
+ return self._module.width
+
+ # the '0' address (e.g. 0.0.0.0 or 0000::) is a valid netmask with
+ # no bits set.
+ if self._value == 0:
+ return 0
+
+ i_val = self._value
+ numbits = 0
+
+ while i_val > 0:
+ if i_val & 1 == 1:
+ break
+ numbits += 1
+ i_val >>= 1
+
+ mask_length = self._module.width - numbits
+
+ if not 0 <= mask_length <= self._module.width:
+ raise ValueError('Unexpected mask length %d for address type!' \
+ % mask_length)
+
+ return mask_length
+
+ def is_hostmask(self):
+ """
+ :return: ``True`` if this IP address host mask, ``False`` otherwise.
+ """
+ int_val = self._value + 1
+ return (int_val & (int_val - 1) == 0)
+
+ def is_netmask(self):
+ """
+ :return: ``True`` if this IP address network mask, ``False`` otherwise.
+ """
+ int_val = (self._value ^ self._module.max_int) + 1
+ return (int_val & (int_val - 1) == 0)
+
+ def __iadd__(self, num):
+ """
+ Increases the numerical value of this IPAddress by num.
+
+ An IndexError is raised if result exceeds maximum IP address value or
+ is less than zero.
+
+ :param num: size of IP address increment.
+ """
+ new_value = int(self._value + num)
+ if 0 <= new_value <= self._module.max_int:
+ self._value = new_value
+ return self
+ raise IndexError('result outside valid IP address boundary!')
+
+ def __isub__(self, num):
+ """
+ Decreases the numerical value of this IPAddress by num.
+
+ An IndexError is raised if result is less than zero or exceeds maximum
+ IP address value.
+
+ :param num: size of IP address decrement.
+ """
+ new_value = int(self._value - num)
+ if 0 <= new_value <= self._module.max_int:
+ self._value = new_value
+ return self
+ raise IndexError('result outside valid IP address boundary!')
+
+ def __add__(self, num):
+ """
+ Add the numerical value of this IP address to num and provide the
+ result as a new IPAddress object.
+
+ :param num: size of IP address increase.
+
+ :return: a new IPAddress object with its numerical value increased by num.
+ """
+ new_value = int(self._value + num)
+ if 0 <= new_value <= self._module.max_int:
+ return self.__class__(new_value, self._module.version)
+ raise IndexError('result outside valid IP address boundary!')
+
+ __radd__ = __add__
+
+ def __sub__(self, num):
+ """
+ Subtract the numerical value of this IP address from num providing
+ the result as a new IPAddress object.
+
+ :param num: size of IP address decrease.
+
+ :return: a new IPAddress object with its numerical value decreased by num.
+ """
+ new_value = int(self._value - num)
+ if 0 <= new_value <= self._module.max_int:
+ return self.__class__(new_value, self._module.version)
+ raise IndexError('result outside valid IP address boundary!')
+
+ def __rsub__(self, num):
+ """
+ Subtract num (lvalue) from the numerical value of this IP address
+ (rvalue) providing the result as a new IPAddress object.
+
+ :param num: size of IP address decrease.
+
+ :return: a new IPAddress object with its numerical value decreased by num.
+ """
+ new_value = int(num - self._value)
+ if 0 <= new_value <= self._module.max_int:
+ return self.__class__(new_value, self._module.version)
+ raise IndexError('result outside valid IP address boundary!')
+
+ def key(self):
+ """
+ :return: a key tuple that uniquely identifies this IP address.
+ """
+ # NB - we return the value here twice because this IP Address may
+ # be sorted with a list of networks and it should still end up
+ # in the expected order.
+ return self._module.version, self._value
+
+ def sort_key(self):
+ """:return: A key tuple used to compare and sort this `IPAddress` correctly."""
+ return self._module.version, self._value, self._module.width
+
+ def __int__(self):
+ """:return: the value of this IP address as an unsigned integer"""
+ return self._value
+
+ def __long__(self):
+ """:return: the value of this IP address as an unsigned integer"""
+ return self._value
+
+ def __oct__(self):
+ """:return: an octal string representation of this IP address."""
+ # Python 2.x
+ if self._value == 0:
+ return '0'
+ return '0%o' % self._value
+
+ def __hex__(self):
+ """:return: a hexadecimal string representation of this IP address."""
+ # Python 2.x
+ return '0x%x' % self._value
+
+ def __index__(self):
+ """
+ :return: return the integer value of this IP address when called by \
+ hex(), oct() or bin().
+ """
+ # Python 3.x
+ return self._value
+
+ def __bytes__(self):
+ """
+ :return: a bytes object equivalent to this IP address. In network
+ byte order, big-endian.
+ """
+ # Python 3.x
+ return self._value.to_bytes(self._module.width//8, 'big')
+
+ def bits(self, word_sep=None):
+ """
+ :param word_sep: (optional) the separator to insert between words.
+ Default: None - use default separator for address type.
+
+ :return: the value of this IP address as a binary digit string."""
+ return self._module.int_to_bits(self._value, word_sep)
+
+ @property
+ def packed(self):
+ """The value of this IP address as a packed binary string."""
+ return self._module.int_to_packed(self._value)
+
+ @property
+ def words(self):
+ """
+ A list of unsigned integer words (octets for IPv4, hextets for IPv6)
+ found in this IP address.
+ """
+ return self._module.int_to_words(self._value)
+
+ @property
+ def bin(self):
+ """
+ The value of this IP address in standard Python binary
+ representational form (0bxxx). A back port of the format provided by
+ the builtin bin() function found in Python 2.6.x and higher.
+ """
+ return self._module.int_to_bin(self._value)
+
+ @property
+ def reverse_dns(self):
+ """The reverse DNS lookup record for this IP address"""
+ return self._module.int_to_arpa(self._value)
+
+ def ipv4(self):
+ """
+ Raises an `AddrConversionError` if IPv6 address cannot be converted
+ to IPv4.
+
+ :return: A numerically equivalent version 4 `IPAddress` object.
+ """
+ ip = None
+ klass = self.__class__
+
+ if self._module.version == 4:
+ ip = klass(self._value, 4)
+ elif self._module.version == 6:
+ if 0 <= self._value <= _ipv4.max_int:
+ ip = klass(self._value, 4)
+ elif _ipv4.max_int <= self._value <= 0xffffffffffff:
+ ip = klass(self._value - 0xffff00000000, 4)
+ else:
+ raise AddrConversionError('IPv6 address %s unsuitable for ' \
+ 'conversion to IPv4!' % self)
+ return ip
+
+ def ipv6(self, ipv4_compatible=False):
+ """
+ .. note:: The IPv4-mapped IPv6 address format is now considered \
+ deprecated. See RFC 4291 or later for details.
+
+ :param ipv4_compatible: If ``True`` returns an IPv4-mapped address
+ (::ffff:x.x.x.x), an IPv4-compatible (::x.x.x.x) address
+ otherwise. Default: False (IPv4-mapped).
+
+ :return: A numerically equivalent version 6 `IPAddress` object.
+ """
+ ip = None
+ klass = self.__class__
+
+ if self._module.version == 6:
+ if ipv4_compatible and \
+ (0xffff00000000 <= self._value <= 0xffffffffffff):
+ ip = klass(self._value - 0xffff00000000, 6)
+ else:
+ ip = klass(self._value, 6)
+ elif self._module.version == 4:
+ # IPv4-Compatible IPv6 address
+ ip = klass(self._value, 6)
+ if not ipv4_compatible:
+ # IPv4-Mapped IPv6 address
+ ip = klass(0xffff00000000 + self._value, 6)
+
+ return ip
+
+ def format(self, dialect=None):
+ """
+ Only relevant for IPv6 addresses. Has no effect for IPv4.
+
+ :param dialect: One of the :ref:`ipv6_formatting_dialects`.
+
+ :return: an alternate string representation for this IP address.
+ """
+ if dialect is not None:
+ if not hasattr(dialect, 'word_fmt'):
+ raise TypeError(
+ 'custom dialects should subclass ipv6_verbose!')
+ return self._module.int_to_str(self._value, dialect=dialect)
+
+ def __or__(self, other):
+ """
+ :param other: An `IPAddress` object (or other int-like object).
+
+ :return: bitwise OR (x | y) between the integer value of this IP
+ address and ``other``.
+ """
+ return self.__class__(self._value | int(other), self._module.version)
+
+ def __and__(self, other):
+ """
+ :param other: An `IPAddress` object (or other int-like object).
+
+ :return: bitwise AND (x & y) between the integer value of this IP
+ address and ``other``.
+ """
+ return self.__class__(self._value & int(other), self._module.version)
+
+ def __xor__(self, other):
+ """
+ :param other: An `IPAddress` object (or other int-like object).
+
+ :return: bitwise exclusive OR (x ^ y) between the integer value of
+ this IP address and ``other``.
+ """
+ return self.__class__(self._value ^ int(other), self._module.version)
+
+ def __lshift__(self, numbits):
+ """
+ :param numbits: size of bitwise shift.
+
+ :return: an `IPAddress` object based on this one with its integer
+ value left shifted by ``numbits``.
+ """
+ return self.__class__(self._value << numbits, self._module.version)
+
+ def __rshift__(self, numbits):
+ """
+ :param numbits: size of bitwise shift.
+
+ :return: an `IPAddress` object based on this one with its integer
+ value right shifted by ``numbits``.
+ """
+ return self.__class__(self._value >> numbits, self._module.version)
+
+ def __nonzero__(self):
+ """:return: ``True`` if the numerical value of this IP address is not \
+ zero, ``False`` otherwise."""
+ # Python 2.x.
+ return bool(self._value)
+
+ __bool__ = __nonzero__ # Python 3.x.
+
+ def __str__(self):
+ """:return: IP address in presentational format"""
+ return self._module.int_to_str(self._value)
+
+ def __repr__(self):
+ """:return: Python statement to create an equivalent object"""
+ return "%s('%s')" % (self.__class__.__name__, self)
+
+ def to_canonical(self):
+ """
+ Converts the address to IPv4 if it is an IPv4-mapped IPv6 address (`RFC 4291
+ Section 2.5.5.2 <https://datatracker.ietf.org/doc/html/rfc4291.html#section-2.5.5.2>`_),
+ otherwise returns the address as-is.
+
+ >>> # IPv4-mapped IPv6
+ >>> IPAddress('::ffff:10.0.0.1').to_canonical()
+ IPAddress('10.0.0.1')
+ >>>
+ >>> # Everything else
+ >>> IPAddress('::1').to_canonical()
+ IPAddress('::1')
+ >>> IPAddress('10.0.0.1').to_canonical()
+ IPAddress('10.0.0.1')
+
+ .. versionadded:: 0.10.0
+ """
+ if not self.is_ipv4_mapped():
+ return self
+ return self.ipv4()
+
+ def is_global(self):
+ """
+ Returns ``True`` if this address is considered globally reachable, ``False`` otherwise.
+
+ An address is considered globally reachable if it's not a special-purpose address
+ or it's a special-purpose address listed as globally reachable in the relevant
+ registries:
+
+ * |iana_special_ipv4|
+ * |iana_special_ipv6|
+
+ Addresses for which the ``Globally Reachable`` value is ``N/A`` are not considered
+ globally reachable.
+
+ Address blocks with set termination date are not taken into consideration.
+
+ Whether or not an address can actually be reached in any local or global context will
+ depend on the network configuration and may differ from what this method returns.
+
+ Currently there can be addresses that are neither ``is_global()`` nor :meth:`is_private`.
+ There are also addresses that are both. All things being equal ``is_global()`` should
+ be considered more trustworthy.
+
+ Examples:
+
+ >>> IPAddress('1.1.1.1').is_global()
+ True
+ >>> IPAddress('::1').is_global()
+ False
+
+ .. note:: |ipv4_in_ipv6_handling|
+ """
+ if self._module.version == 4:
+ not_reachable = IPV4_NOT_GLOBALLY_REACHABLE
+ exceptions = IPV4_NOT_GLOBALLY_REACHABLE_EXCEPTIONS
+ else:
+ not_reachable = IPV6_NOT_GLOBALLY_REACHABLE
+ exceptions = IPV6_NOT_GLOBALLY_REACHABLE_EXCEPTIONS
+
+ return (
+ not any(self in net for net in not_reachable)
+ or any(self in net for net in exceptions)
+ )
+
+ def is_ipv4_private_use(self):
+ """
+ Returns ``True`` if this address is an IPv4 private-use address as defined in
+ :rfc:`1918`.
+
+ The private-use address blocks:
+
+ * ``10.0.0.0/8``
+ * ``172.16.0.0/12``
+ * ``192.168.0.0/16``
+
+ .. note:: |ipv4_in_ipv6_handling|
+
+ .. versionadded:: 0.10.0
+ """
+ return self._module.version == 4 and any(self in cidr for cidr in IPV4_PRIVATE_USE)
+
+ def is_ipv6_unique_local(self):
+ """
+ Returns ``True`` if this address is an IPv6 unique local address as defined in
+ :rfc:`4193` and listed in |iana_special_ipv6|.
+
+ The IPv6 unique local address block: ``fc00::/7``.
+
+ .. versionadded:: 0.10.0
+ """
+ return self._module.version == 6 and self in IPV6_UNIQUE_LOCAL
+
+
+class IPListMixin(object):
+ """
+ A mixin class providing shared list-like functionality to classes
+ representing groups of IP addresses.
+
+ """
+ __slots__ = ()
+ def __iter__(self):
+ """
+ :return: An iterator providing access to all `IPAddress` objects
+ within range represented by this ranged IP object.
+ """
+ start_ip = IPAddress(self.first, self._module.version)
+ end_ip = IPAddress(self.last, self._module.version)
+ return iter_iprange(start_ip, end_ip)
+
+ @property
+ def size(self):
+ """
+ The total number of IP addresses within this ranged IP object.
+ """
+ return int(self.last - self.first + 1)
+
+ def __len__(self):
+ """
+ :return: the number of IP addresses in this ranged IP object. Raises
+ an `IndexError` if size > system max int (a Python 2.x
+ limitation). Use the .size property for subnets of any size.
+ """
+ size = self.size
+ if size > _sys_maxint:
+ raise IndexError(("range contains more than %d (sys.maxint) "
+ "IP addresses! Use the .size property instead." % _sys_maxint))
+ return size
+
+ def __getitem__(self, index):
+ """
+ :return: The IP address(es) in this `IPNetwork` object referenced by
+ index or slice. As slicing can produce large sequences of objects
+ an iterator is returned instead of the more usual `list`.
+ """
+ item = None
+
+ if hasattr(index, 'indices'):
+ if self._module.version == 6:
+ raise TypeError('IPv6 slices are not supported!')
+
+ (start, stop, step) = index.indices(self.size)
+
+ if (start + step < 0) or (step > stop):
+ # step value exceeds start and stop boundaries.
+ item = iter([IPAddress(self.first, self._module.version)])
+ else:
+ start_ip = IPAddress(self.first + start, self._module.version)
+ end_ip = IPAddress(self.first + stop - step, self._module.version)
+ item = iter_iprange(start_ip, end_ip, step)
+ else:
+ try:
+ index = int(index)
+ if (- self.size) <= index < 0:
+ # negative index.
+ item = IPAddress(self.last + index + 1, self._module.version)
+ elif 0 <= index <= (self.size - 1):
+ # Positive index or zero index.
+ item = IPAddress(self.first + index, self._module.version)
+ else:
+ raise IndexError('index out range for address range size!')
+ except ValueError:
+ raise TypeError('unsupported index type %r!' % index)
+
+ return item
+
+ def __contains__(self, other):
+ """
+ :param other: an `IPAddress` or ranged IP object.
+
+ :return: ``True`` if other falls within the boundary of this one,
+ ``False`` otherwise.
+ """
+ if isinstance(other, BaseIP):
+ if self._module.version != other._module.version:
+ return False
+ if isinstance(other, IPAddress):
+ return other._value >= self.first and other._value <= self.last
+ # Assume that we (and the other) provide .first and .last.
+ return other.first >= self.first and other.last <= self.last
+
+ # Whatever it is, try to interpret it as IPAddress.
+ return IPAddress(other) in self
+
+ def __nonzero__(self):
+ """
+ Ranged IP objects always represent a sequence of at least one IP
+ address and are therefore always True in the boolean context.
+ """
+ # Python 2.x.
+ return True
+
+ __bool__ = __nonzero__ # Python 3.x.
+
+
+def parse_ip_network(module, addr, implicit_prefix=False, flags=0):
+ if isinstance(addr, tuple):
+ # CIDR integer tuple
+ if len(addr) != 2:
+ raise AddrFormatError('invalid %s tuple!' % module.family_name)
+ value, prefixlen = addr
+
+ if not(0 <= value <= module.max_int):
+ raise AddrFormatError('invalid address value for %s tuple!'
+ % module.family_name)
+ if not(0 <= prefixlen <= module.width):
+ raise AddrFormatError('invalid prefix for %s tuple!' \
+ % module.family_name)
+ elif isinstance(addr, _str_type):
+ # CIDR-like string subnet
+ if implicit_prefix:
+ #TODO: deprecate this option in netaddr 0.8.x
+ addr = cidr_abbrev_to_verbose(addr)
+
+ if '/' in addr:
+ val1, val2 = addr.split('/', 1)
+ else:
+ val1 = addr
+ val2 = None
+
+ try:
+ ip = IPAddress(val1, module.version, flags=INET_PTON)
+ except AddrFormatError:
+ if module.version == 4:
+ # Try a partial IPv4 network address...
+ expanded_addr = _ipv4.expand_partial_address(val1)
+ ip = IPAddress(expanded_addr, module.version, flags=INET_PTON)
+ else:
+ raise AddrFormatError('invalid IPNetwork address %s!' % addr)
+ value = ip._value
+
+ try:
+ # Integer CIDR prefix.
+ prefixlen = int(val2)
+ except TypeError:
+ if val2 is None:
+ # No prefix was specified.
+ prefixlen = module.width
+ except ValueError:
+ # Not an integer prefix, try a netmask/hostmask prefix.
+ mask = IPAddress(val2, module.version, flags=INET_PTON)
+ if mask.is_netmask():
+ prefixlen = module.netmask_to_prefix[mask._value]
+ elif mask.is_hostmask():
+ prefixlen = module.hostmask_to_prefix[mask._value]
+ else:
+ raise AddrFormatError('addr %r is not a valid IPNetwork!' \
+ % addr)
+
+ if not 0 <= prefixlen <= module.width:
+ raise AddrFormatError('invalid prefix for %s address!' \
+ % module.family_name)
+ else:
+ raise TypeError('unexpected type %s for addr arg' % type(addr))
+
+ if flags & NOHOST:
+ # Remove host bits.
+ netmask = module.prefix_to_netmask[prefixlen]
+ value = value & netmask
+
+ return value, prefixlen
+
+
+class IPNetwork(BaseIP, IPListMixin):
+ """
+ An IPv4 or IPv6 network or subnet.
+
+ A combination of an IP address and a network mask.
+
+ Accepts CIDR and several related variants :
+
+ a) Standard CIDR::
+
+ x.x.x.x/y -> 192.0.2.0/24
+ x::/y -> fe80::/10
+
+ b) Hybrid CIDR format (netmask address instead of prefix), where 'y' \
+ address represent a valid netmask::
+
+ x.x.x.x/y.y.y.y -> 192.0.2.0/255.255.255.0
+ x::/y:: -> fe80::/ffc0::
+
+ c) ACL hybrid CIDR format (hostmask address instead of prefix like \
+ Cisco's ACL bitmasks), where 'y' address represent a valid netmask::
+
+ x.x.x.x/y.y.y.y -> 192.0.2.0/0.0.0.255
+ x::/y:: -> fe80::/3f:ffff:ffff:ffff:ffff:ffff:ffff:ffff
+
+ d) Abbreviated CIDR format (as of netaddr 0.7.x this requires the \
+ optional constructor argument ``implicit_prefix=True``)::
+
+ x -> 192
+ x/y -> 10/8
+ x.x/y -> 192.168/16
+ x.x.x/y -> 192.168.0/24
+
+ which are equivalent to::
+
+ x.0.0.0/y -> 192.0.0.0/24
+ x.0.0.0/y -> 10.0.0.0/8
+ x.x.0.0/y -> 192.168.0.0/16
+ x.x.x.0/y -> 192.168.0.0/24
+
+ .. deprecated:: 0.10.0
+
+ .. warning::
+
+ The next release (0.9.0) will contain a backwards incompatible change
+ connected to handling of RFC 6164 IPv6 addresses (/127 and /128 subnets).
+ When iterating ``IPNetwork`` and ``IPNetwork.iter_hosts()`` the first
+ addresses in the networks will no longer be excluded and ``broadcast``
+ will be ``None``.
+ """
+ __slots__ = ('_prefixlen',)
+
+ def __init__(self, addr, implicit_prefix=False, version=None, flags=0):
+ """
+ Constructor.
+
+ :param addr: an IPv4 or IPv6 address with optional CIDR prefix,
+ netmask or hostmask. May be an IP address in presentation
+ (string) format, an tuple containing and integer address and a
+ network prefix, or another IPAddress/IPNetwork object (copy
+ construction).
+
+ :param implicit_prefix: (optional) if True, the constructor uses
+ classful IPv4 rules to select a default prefix when one is not
+ provided. If False it uses the length of the IP address version.
+ (default: False)
+
+ .. deprecated:: 0.10.0
+
+ :param version: (optional) optimizes version detection if specified
+ and distinguishes between IPv4 and IPv6 for addresses with an
+ equivalent integer value.
+
+ :param flags: (optional) decides which rules are applied to the
+ interpretation of the addr value. Currently only supports the
+ :data:`NOHOST` option.
+
+ >>> IPNetwork('1.2.3.4/24')
+ IPNetwork('1.2.3.4/24')
+ >>> IPNetwork('1.2.3.4/24', flags=NOHOST)
+ IPNetwork('1.2.3.0/24')
+ """
+ super(IPNetwork, self).__init__()
+
+ if flags & ~NOHOST:
+ raise ValueError('Unrecognized IPAddress flags value: %s' % (flags,))
+
+ value, prefixlen, module = None, None, None
+
+ if hasattr(addr, '_prefixlen'):
+ # IPNetwork object copy constructor
+ value = addr._value
+ module = addr._module
+ prefixlen = addr._prefixlen
+ elif hasattr(addr, '_value'):
+ # IPAddress object copy constructor
+ value = addr._value
+ module = addr._module
+ prefixlen = module.width
+ elif version == 4:
+ value, prefixlen = parse_ip_network(_ipv4, addr,
+ implicit_prefix=implicit_prefix, flags=flags)
+ module = _ipv4
+ elif version == 6:
+ value, prefixlen = parse_ip_network(_ipv6, addr,
+ implicit_prefix=implicit_prefix, flags=flags)
+ module = _ipv6
+ else:
+ if version is not None:
+ raise ValueError('%r is an invalid IP version!' % version)
+ try:
+ module = _ipv4
+ value, prefixlen = parse_ip_network(module, addr,
+ implicit_prefix, flags)
+ except AddrFormatError:
+ try:
+ module = _ipv6
+ value, prefixlen = parse_ip_network(module, addr,
+ implicit_prefix, flags)
+ except AddrFormatError:
+ pass
+
+ if value is None:
+ raise AddrFormatError('invalid IPNetwork %s' % (addr,))
+
+ self._value = value
+ self._prefixlen = prefixlen
+ self._module = module
+
+ def __getstate__(self):
+ """:return: Pickled state of an `IPNetwork` object."""
+ return self._value, self._prefixlen, self._module.version
+
+ def __setstate__(self, state):
+ """
+ :param state: data used to unpickle a pickled `IPNetwork` object.
+
+ """
+ value, prefixlen, version = state
+
+ self._value = value
+
+ if version == 4:
+ self._module = _ipv4
+ elif version == 6:
+ self._module = _ipv6
+ else:
+ raise ValueError('unpickling failed for object state %s' \
+ % (state,))
+
+ if 0 <= prefixlen <= self._module.width:
+ self._prefixlen = prefixlen
+ else:
+ raise ValueError('unpickling failed for object state %s' \
+ % (state,))
+
+ def _set_prefixlen(self, value):
+ if not isinstance(value, _int_type):
+ raise TypeError('int argument expected, not %s' % type(value))
+ if not 0 <= value <= self._module.width:
+ raise AddrFormatError('invalid prefix for an %s address!' \
+ % self._module.family_name)
+ self._prefixlen = value
+
+ prefixlen = property(lambda self: self._prefixlen, _set_prefixlen,
+ doc='size of the bitmask used to separate the network from the host bits')
+
+ @property
+ def ip(self):
+ """
+ The IP address of this `IPNetwork` object. This is may or may not be
+ the same as the network IP address which varies according to the value
+ of the CIDR subnet prefix.
+ """
+ return IPAddress(self._value, self._module.version)
+
+ @property
+ def network(self):
+ """The network address of this `IPNetwork` object."""
+ return IPAddress(self._value & self._netmask_int, self._module.version)
+
+ @property
+ def broadcast(self):
+ """The broadcast address of this `IPNetwork` object.
+
+ .. warning::
+
+ The next release (0.9.0) will contain a backwards incompatible change
+ connected to handling of RFC 6164 IPv6 addresses (/127 and /128 subnets).
+ ``broadcast`` will be ``None`` when dealing with those networks.
+ """
+ if (self._module.width - self._prefixlen) <= 1:
+ return None
+ else:
+ return IPAddress(self._value | self._hostmask_int, self._module.version)
+
+ @property
+ def first(self):
+ """
+ The integer value of first IP address found within this `IPNetwork`
+ object.
+ """
+ return self._value & (self._module.max_int ^ self._hostmask_int)
+
+ @property
+ def last(self):
+ """
+ The integer value of last IP address found within this `IPNetwork`
+ object.
+ """
+ hostmask = (1 << (self._module.width - self._prefixlen)) - 1
+ return self._value | hostmask
+
+ @property
+ def netmask(self):
+ """The subnet mask of this `IPNetwork` object."""
+ netmask = self._module.max_int ^ self._hostmask_int
+ return IPAddress(netmask, self._module.version)
+
+ @netmask.setter
+ def netmask(self, value):
+ """Set the prefixlen using a subnet mask"""
+ ip = IPAddress(value)
+
+ if ip.version != self.version:
+ raise ValueError("IP version mismatch: %s and %s" % (ip, self))
+
+ if not ip.is_netmask():
+ raise ValueError("Invalid subnet mask specified: %s" % str(value))
+
+ self.prefixlen = ip.netmask_bits()
+
+ @property
+ def _netmask_int(self):
+ """Same as self.netmask, but in integer format"""
+ return self._module.max_int ^ self._hostmask_int
+
+ @property
+ def hostmask(self):
+ """The host mask of this `IPNetwork` object."""
+ hostmask = (1 << (self._module.width - self._prefixlen)) - 1
+ return IPAddress(hostmask, self._module.version)
+
+ @property
+ def _hostmask_int(self):
+ """Same as self.hostmask, but in integer format"""
+ return (1 << (self._module.width - self._prefixlen)) - 1
+
+ @property
+ def cidr(self):
+ """
+ The true CIDR address for this `IPNetwork` object which omits any
+ host bits to the right of the CIDR subnet prefix.
+ """
+ return IPNetwork(
+ (self._value & self._netmask_int, self._prefixlen),
+ version=self._module.version)
+
+ def __iadd__(self, num):
+ """
+ Increases the value of this `IPNetwork` object by the current size
+ multiplied by ``num``.
+
+ An `IndexError` is raised if result exceeds maximum IP address value
+ or is less than zero.
+
+ :param num: (optional) number of `IPNetwork` blocks to increment \
+ this IPNetwork's value by.
+ """
+ new_value = int(self.network) + (self.size * num)
+
+ if (new_value + (self.size - 1)) > self._module.max_int:
+ raise IndexError('increment exceeds address boundary!')
+ if new_value < 0:
+ raise IndexError('increment is less than zero!')
+
+ self._value = new_value
+ return self
+
+ def __isub__(self, num):
+ """
+ Decreases the value of this `IPNetwork` object by the current size
+ multiplied by ``num``.
+
+ An `IndexError` is raised if result is less than zero or exceeds
+ maximum IP address value.
+
+ :param num: (optional) number of `IPNetwork` blocks to decrement \
+ this IPNetwork's value by.
+ """
+ new_value = int(self.network) - (self.size * num)
+
+ if new_value < 0:
+ raise IndexError('decrement is less than zero!')
+ if (new_value + (self.size - 1)) > self._module.max_int:
+ raise IndexError('decrement exceeds address boundary!')
+
+ self._value = new_value
+ return self
+
+ def __contains__(self, other):
+ """
+ :param other: an `IPAddress` or ranged IP object.
+
+ :return: ``True`` if other falls within the boundary of this one,
+ ``False`` otherwise.
+ """
+ if isinstance(other, BaseIP):
+ if self._module.version != other._module.version:
+ return False
+
+ # self_net will contain only the network bits.
+ shiftwidth = self._module.width - self._prefixlen
+ self_net = self._value >> shiftwidth
+ if isinstance(other, IPRange):
+ # IPRange has no _value.
+ # (self_net+1)<<shiftwidth is not our last address, but the one
+ # after the last one.
+ return ((self_net << shiftwidth) <= other._start._value and
+ (((self_net + 1) << shiftwidth) > other._end._value))
+
+ other_net = other._value >> shiftwidth
+ if isinstance(other, IPAddress):
+ return other_net == self_net
+ if isinstance(other, IPNetwork):
+ return self_net == other_net and self._prefixlen <= other._prefixlen
+
+ # Whatever it is, try to interpret it as IPNetwork
+ return IPNetwork(other) in self
+
+ def key(self):
+ """
+ :return: A key tuple used to uniquely identify this `IPNetwork`.
+ """
+ return self._module.version, self.first, self.last
+
+ def sort_key(self):
+ """
+ :return: A key tuple used to compare and sort this `IPNetwork` correctly.
+ """
+ net_size_bits = self._prefixlen - 1
+ first = self._value & (self._module.max_int ^ self._hostmask_int)
+ host_bits = self._value - first
+ return self._module.version, first, net_size_bits, host_bits
+
+ def ipv4(self):
+ """
+ :return: A numerically equivalent version 4 `IPNetwork` object. \
+ Raises an `AddrConversionError` if IPv6 address cannot be \
+ converted to IPv4.
+ """
+ ip = None
+ klass = self.__class__
+
+ if self._module.version == 4:
+ ip = klass('%s/%d' % (self.ip, self.prefixlen))
+ elif self._module.version == 6:
+ if 0 <= self._value <= _ipv4.max_int:
+ addr = _ipv4.int_to_str(self._value)
+ ip = klass('%s/%d' % (addr, self.prefixlen - 96))
+ elif _ipv4.max_int <= self._value <= 0xffffffffffff:
+ addr = _ipv4.int_to_str(self._value - 0xffff00000000)
+ ip = klass('%s/%d' % (addr, self.prefixlen - 96))
+ else:
+ raise AddrConversionError('IPv6 address %s unsuitable for ' \
+ 'conversion to IPv4!' % self)
+ return ip
+
+ def ipv6(self, ipv4_compatible=False):
+ """
+ .. note:: the IPv4-mapped IPv6 address format is now considered \
+ deprecated. See RFC 4291 or later for details.
+
+ :param ipv4_compatible: If ``True`` returns an IPv4-mapped address
+ (::ffff:x.x.x.x), an IPv4-compatible (::x.x.x.x) address
+ otherwise. Default: False (IPv4-mapped).
+
+ :return: A numerically equivalent version 6 `IPNetwork` object.
+ """
+ ip = None
+ klass = self.__class__
+
+ if self._module.version == 6:
+ if ipv4_compatible and \
+ (0xffff00000000 <= self._value <= 0xffffffffffff):
+ ip = klass((self._value - 0xffff00000000, self._prefixlen),
+ version=6)
+ else:
+ ip = klass((self._value, self._prefixlen), version=6)
+ elif self._module.version == 4:
+ if ipv4_compatible:
+ # IPv4-Compatible IPv6 address
+ ip = klass((self._value, self._prefixlen + 96), version=6)
+ else:
+ # IPv4-Mapped IPv6 address
+ ip = klass((0xffff00000000 + self._value,
+ self._prefixlen + 96), version=6)
+
+ return ip
+
+ def previous(self, step=1):
+ """
+ :param step: the number of IP subnets between this `IPNetwork` object
+ and the expected subnet. Default: 1 (the previous IP subnet).
+
+ :return: The adjacent subnet preceding this `IPNetwork` object.
+ """
+ ip_copy = self.__class__('%s/%d' % (self.network, self.prefixlen),
+ self._module.version)
+ ip_copy -= step
+ return ip_copy
+
+ def next(self, step=1):
+ """
+ :param step: the number of IP subnets between this `IPNetwork` object
+ and the expected subnet. Default: 1 (the next IP subnet).
+
+ :return: The adjacent subnet succeeding this `IPNetwork` object.
+ """
+ ip_copy = self.__class__('%s/%d' % (self.network, self.prefixlen),
+ self._module.version)
+ ip_copy += step
+ return ip_copy
+
+ def supernet(self, prefixlen=0):
+ """
+ Provides a list of supernets for this `IPNetwork` object between the
+ size of the current prefix and (if specified) an endpoint prefix.
+
+ :param prefixlen: (optional) a CIDR prefix for the maximum supernet.
+ Default: 0 - returns all possible supernets.
+
+ :return: a tuple of supernet `IPNetwork` objects.
+ """
+ if not 0 <= prefixlen <= self._module.width:
+ raise ValueError('CIDR prefix /%d invalid for IPv%d!' \
+ % (prefixlen, self._module.version))
+
+ supernets = []
+ # Use a copy of self as we'll be editing it.
+ supernet = self.cidr
+ supernet._prefixlen = prefixlen
+ while supernet._prefixlen != self._prefixlen:
+ supernets.append(supernet.cidr)
+ supernet._prefixlen += 1
+ return supernets
+
+ def subnet(self, prefixlen, count=None, fmt=None):
+ """
+ A generator that divides up this IPNetwork's subnet into smaller
+ subnets based on a specified CIDR prefix.
+
+ :param prefixlen: a CIDR prefix indicating size of subnets to be
+ returned.
+
+ :param count: (optional) number of consecutive IP subnets to be
+ returned.
+
+ :return: an iterator containing IPNetwork subnet objects.
+ """
+ if not 0 <= self.prefixlen <= self._module.width:
+ raise ValueError('CIDR prefix /%d invalid for IPv%d!' \
+ % (prefixlen, self._module.version))
+
+ if not self.prefixlen <= prefixlen:
+ # Don't return anything.
+ return
+
+ # Calculate number of subnets to be returned.
+ width = self._module.width
+ max_subnets = 2 ** (width - self.prefixlen) // 2 ** (width - prefixlen)
+
+ if count is None:
+ count = max_subnets
+
+ if not 1 <= count <= max_subnets:
+ raise ValueError('count outside of current IP subnet boundary!')
+
+ base_subnet = self._module.int_to_str(self.first)
+ i = 0
+ while(i < count):
+ subnet = self.__class__('%s/%d' % (base_subnet, prefixlen),
+ self._module.version)
+ subnet.value += (subnet.size * i)
+ subnet.prefixlen = prefixlen
+ i += 1
+ yield subnet
+
+ def iter_hosts(self):
+ """
+ A generator that provides all the IP addresses that can be assigned
+ to hosts within the range of this IP object's subnet.
+
+ - for IPv4, the network and broadcast addresses are excluded, excepted \
+ when using /31 or /32 subnets as per RFC 3021.
+
+ - for IPv6, only Subnet-Router anycast address (first address in the \
+ network) is excluded as per RFC 4291 section 2.6.1, excepted when using \
+ /127 or /128 subnets as per RFC 6164.
+
+ .. warning::
+
+ The next release (0.9.0) will contain a backwards incompatible change
+ connected to handling of RFC 6164 IPv6 addresses (/127 and /128 subnets).
+ When iterating ``IPNetwork`` and ``IPNetwork.iter_hosts()`` the first
+ addresses in the networks will no longer be excluded.
+
+ :return: an IPAddress iterator
+ """
+ it_hosts = iter([])
+
+ # Common logic, first IP is always reserved.
+ first_usable_address = self.first + 1
+ if self._module.version == 4:
+ # IPv4 logic, last address is reserved for broadcast.
+ last_usable_address = self.last - 1
+ else:
+ # IPv6 logic, no broadcast address reserved.
+ last_usable_address = self.last
+
+ # If subnet has a size of less than 4, then it is a /31, /32, /127 or /128.
+ # Handle them as per RFC 3021 (IPv4) or RFC 6164 (IPv6), and don't reserve
+ # first or last IP address.
+ if self.size >= 4:
+ it_hosts = iter_iprange(
+ IPAddress(first_usable_address, self._module.version),
+ IPAddress(last_usable_address, self._module.version))
+ else:
+ it_hosts = iter_iprange(
+ IPAddress(self.first, self._module.version),
+ IPAddress(self.last, self._module.version))
+
+ return it_hosts
+
+ def __str__(self):
+ """:return: this IPNetwork in CIDR format"""
+ addr = self._module.int_to_str(self._value)
+ return "%s/%s" % (addr, self.prefixlen)
+
+ def __repr__(self):
+ """:return: Python statement to create an equivalent object"""
+ return "%s('%s')" % (self.__class__.__name__, self)
+
+
+class IPRange(BaseIP, IPListMixin):
+ """
+ An arbitrary IPv4 or IPv6 address range.
+
+ Formed from a lower and upper bound IP address. The upper bound IP cannot
+ be numerically smaller than the lower bound and the IP version of both
+ must match.
+
+ """
+ __slots__ = ('_start', '_end')
+
+ def __init__(self, start, end, flags=0):
+ """
+ Constructor.
+
+ :param start: an IPv4 or IPv6 address that forms the lower
+ boundary of this IP range.
+
+ :param end: an IPv4 or IPv6 address that forms the upper
+ boundary of this IP range.
+
+ :param flags: (optional) decides which rules are applied to the
+ interpretation of the start and end values. Refer to the :meth:`IPAddress.__init__`
+ documentation for details.
+
+ """
+ self._start = IPAddress(start, flags=flags)
+ self._module = self._start._module
+ self._end = IPAddress(end, self._module.version, flags=flags)
+ if int(self._start) > int(self._end):
+ raise AddrFormatError('lower bound IP greater than upper bound!')
+
+ def __getstate__(self):
+ """:return: Pickled state of an `IPRange` object."""
+ return self._start.value, self._end.value, self._module.version
+
+ def __setstate__(self, state):
+ """
+ :param state: data used to unpickle a pickled `IPRange` object.
+ """
+ start, end, version = state
+
+ self._start = IPAddress(start, version)
+ self._module = self._start._module
+ self._end = IPAddress(end, version)
+
+ def __contains__(self, other):
+ if isinstance(other, BaseIP):
+ if self._module.version != other._module.version:
+ return False
+ if isinstance(other, IPAddress):
+ return (self._start._value <= other._value and
+ self._end._value >= other._value)
+ if isinstance(other, IPRange):
+ return (self._start._value <= other._start._value and
+ self._end._value >= other._end._value)
+ if isinstance(other, IPNetwork):
+ shiftwidth = other._module.width - other._prefixlen
+ other_start = (other._value >> shiftwidth) << shiftwidth
+ # Start of the next network after other
+ other_next_start = other_start + (1 << shiftwidth)
+
+ return (self._start._value <= other_start and
+ self._end._value > other_next_start)
+
+ # Whatever it is, try to interpret it as IPAddress.
+ return IPAddress(other) in self
+
+ @property
+ def first(self):
+ """The integer value of first IP address in this `IPRange` object."""
+ return int(self._start)
+
+ @property
+ def last(self):
+ """The integer value of last IP address in this `IPRange` object."""
+ return int(self._end)
+
+ def key(self):
+ """
+ :return: A key tuple used to uniquely identify this `IPRange`.
+ """
+ return self._module.version, self.first, self.last
+
+ def sort_key(self):
+ """
+ :return: A key tuple used to compare and sort this `IPRange` correctly.
+ """
+ skey = self._module.width - num_bits(self.size)
+ return self._module.version, self._start._value, skey
+
+ def cidrs(self):
+ """
+ The list of CIDR addresses found within the lower and upper bound
+ addresses of this `IPRange`.
+ """
+ return iprange_to_cidrs(self._start, self._end)
+
+ def __str__(self):
+ """:return: this `IPRange` in a common representational format."""
+ return "%s-%s" % (self._start, self._end)
+
+ def __repr__(self):
+ """:return: Python statement to create an equivalent object"""
+ return "%s('%s', '%s')" % (self.__class__.__name__,
+ self._start, self._end)
+
+
+def iter_unique_ips(*args):
+ """
+ :param args: A list of IP addresses and subnets passed in as arguments.
+
+ :return: A generator that flattens out IP subnets, yielding unique
+ individual IP addresses (no duplicates).
+ """
+ for cidr in cidr_merge(args):
+ for ip in cidr:
+ yield ip
+
+
+def cidr_abbrev_to_verbose(abbrev_cidr):
+ """
+ A function that converts abbreviated IPv4 CIDRs to their more verbose
+ equivalent.
+
+ :param abbrev_cidr: an abbreviated CIDR.
+
+ Uses the old-style classful IP address rules to decide on a default
+ subnet prefix if one is not explicitly provided.
+
+ Only supports IPv4 addresses.
+
+ Examples ::
+
+ 10 - 10.0.0.0/8
+ 10/16 - 10.0.0.0/16
+ 128 - 128.0.0.0/16
+ 128/8 - 128.0.0.0/8
+ 192.168 - 192.168.0.0/16
+
+ :return: A verbose CIDR from an abbreviated CIDR or old-style classful \
+ network address. The original value if it was not recognised as a \
+ supported abbreviation.
+ """
+ # Internal function that returns a prefix value based on the old IPv4
+ # classful network scheme that has been superseded (almost) by CIDR.
+ def classful_prefix(octet):
+ octet = int(octet)
+ if not 0 <= octet <= 255:
+ raise IndexError('Invalid octet: %r!' % octet)
+ if 0 <= octet <= 127: # Legacy class 'A' classification.
+ return 8
+ elif 128 <= octet <= 191: # Legacy class 'B' classification.
+ return 16
+ elif 192 <= octet <= 223: # Legacy class 'C' classification.
+ return 24
+ elif 224 <= octet <= 239: # Multicast address range.
+ return 4
+ return 32 # Default.
+
+ if _is_str(abbrev_cidr):
+ if ':' in abbrev_cidr or abbrev_cidr == '':
+ return abbrev_cidr
+
+ try:
+ # Single octet partial integer or string address.
+ i = int(abbrev_cidr)
+ return "%s.0.0.0/%s" % (i, classful_prefix(i))
+ except ValueError:
+ # Multi octet partial string address with optional prefix.
+ if '/' in abbrev_cidr:
+ part_addr, prefix = abbrev_cidr.split('/', 1)
+
+ # Check prefix for validity.
+ try:
+ if not 0 <= int(prefix) <= 32:
+ raise ValueError('prefixlen in address %r out of range' \
+ ' for IPv4!' % (abbrev_cidr,))
+ except ValueError:
+ return abbrev_cidr
+ else:
+ part_addr = abbrev_cidr
+ prefix = None
+
+ tokens = part_addr.split('.')
+ if len(tokens) > 4:
+ # Not a recognisable format.
+ return abbrev_cidr
+ for i in range(4 - len(tokens)):
+ tokens.append('0')
+
+ if prefix is None:
+ try:
+ prefix = classful_prefix(tokens[0])
+ except ValueError:
+ return abbrev_cidr
+
+ return "%s/%s" % ('.'.join(tokens), prefix)
+ except (TypeError, IndexError):
+ # Not a recognisable format.
+ return abbrev_cidr
+
+
+
+def cidr_merge(ip_addrs):
+ """
+ A function that accepts an iterable sequence of IP addresses and subnets
+ merging them into the smallest possible list of CIDRs. It merges adjacent
+ subnets where possible, those contained within others and also removes
+ any duplicates.
+
+ :param ip_addrs: an iterable sequence of IP addresses, subnets or ranges.
+
+ :return: a summarized list of `IPNetwork` objects.
+ """
+ # The algorithm is quite simple: For each CIDR we create an IP range.
+ # Sort them and merge when possible. Afterwars split them again
+ # optimally.
+ if not hasattr(ip_addrs, '__iter__'):
+ raise ValueError('A sequence or iterator is expected!')
+
+ ranges = []
+
+ for ip in ip_addrs:
+ if isinstance(ip, (IPNetwork, IPRange)):
+ net = ip
+ else:
+ net = IPNetwork(ip)
+ # Since non-overlapping ranges are the common case, remember the original
+ ranges.append( (net.version, net.last, net.first, net) )
+
+ ranges.sort()
+ i = len(ranges) - 1
+ while i > 0:
+ if ranges[i][0] == ranges[i - 1][0] and ranges[i][2] - 1 <= ranges[i - 1][1]:
+ ranges[i - 1] = (ranges[i][0], ranges[i][1], min(ranges[i - 1][2], ranges[i][2]))
+ del ranges[i]
+ i -= 1
+ merged = []
+ for range_tuple in ranges:
+ # If this range wasn't merged we can simply use the old cidr.
+ if len(range_tuple) == 4:
+ original = range_tuple[3]
+ if isinstance(original, IPRange):
+ merged.extend(original.cidrs())
+ else:
+ merged.append(original)
+ else:
+ version = range_tuple[0]
+ range_start = IPAddress(range_tuple[2], version=version)
+ range_stop = IPAddress(range_tuple[1], version=version)
+ merged.extend(iprange_to_cidrs(range_start, range_stop))
+ return merged
+
+
+def cidr_exclude(target, exclude):
+ """
+ Removes an exclude IP address or subnet from target IP subnet.
+
+ :param target: the target IP address or subnet to be divided up.
+
+ :param exclude: the IP address or subnet to be removed from target.
+
+ :return: list of `IPNetwork` objects remaining after exclusion.
+ """
+ left, _, right = cidr_partition(target, exclude)
+
+ return left + right
+
+def cidr_partition(target, exclude):
+ """
+ Partitions a target IP subnet on an exclude IP address.
+
+ :param target: the target IP address or subnet to be divided up.
+
+ :param exclude: the IP address or subnet to partition on
+
+ :return: list of `IPNetwork` objects before, the partition and after, sorted.
+
+ Adding the three lists returns the equivalent of the original subnet.
+ """
+
+ target = IPNetwork(target)
+ exclude = IPNetwork(exclude)
+
+ if exclude.last < target.first:
+ # Exclude subnet's upper bound address less than target
+ # subnet's lower bound.
+ return [], [], [target.cidr]
+ elif target.last < exclude.first:
+ # Exclude subnet's lower bound address greater than target
+ # subnet's upper bound.
+ return [target.cidr], [], []
+
+ if target.prefixlen >= exclude.prefixlen:
+ # Exclude contains the target
+ return [], [target], []
+
+ left = []
+ right = []
+
+ new_prefixlen = target.prefixlen + 1
+ # Some @properties that are expensive to get and don't change below.
+ target_module_width = target._module.width
+
+ target_first = target.first
+ version = exclude.version
+ i_lower = target_first
+ i_upper = target_first + (2 ** (target_module_width - new_prefixlen))
+
+ while exclude.prefixlen >= new_prefixlen:
+ if exclude.first >= i_upper:
+ left.append(IPNetwork((i_lower, new_prefixlen), version=version))
+ matched = i_upper
+ else:
+ right.append(IPNetwork((i_upper, new_prefixlen), version=version))
+ matched = i_lower
+
+ new_prefixlen += 1
+
+ if new_prefixlen > target_module_width:
+ break
+
+ i_lower = matched
+ i_upper = matched + (2 ** (target_module_width - new_prefixlen))
+
+ return left, [exclude], right[::-1]
+
+
+def spanning_cidr(ip_addrs):
+ """
+ Function that accepts a sequence of IP addresses and subnets returning
+ a single `IPNetwork` subnet that is large enough to span the lower and
+ upper bound IP addresses with a possible overlap on either end.
+
+ :param ip_addrs: sequence of IP addresses and subnets.
+
+ :return: a single spanning `IPNetwork` subnet.
+ """
+ ip_addrs_iter = iter(ip_addrs)
+ try:
+ network_a = IPNetwork(_iter_next(ip_addrs_iter))
+ network_b = IPNetwork(_iter_next(ip_addrs_iter))
+ except StopIteration:
+ raise ValueError('IP sequence must contain at least 2 elements!')
+
+ if network_a < network_b:
+ min_network = network_a
+ max_network = network_b
+ else:
+ min_network = network_b
+ max_network = network_a
+
+ for ip in ip_addrs_iter:
+ network = IPNetwork(ip)
+ if network < min_network:
+ min_network = network
+ if network > max_network:
+ max_network = network
+
+ if min_network.version != max_network.version:
+ raise TypeError('IP sequence cannot contain both IPv4 and IPv6!')
+
+ ipnum = max_network.last
+ prefixlen = max_network.prefixlen
+ lowest_ipnum = min_network.first
+ width = max_network._module.width
+
+ while prefixlen > 0 and ipnum > lowest_ipnum:
+ prefixlen -= 1
+ ipnum &= -(1<<(width-prefixlen))
+
+ return IPNetwork( (ipnum, prefixlen), version=min_network.version )
+
+
+def iter_iprange(start, end, step=1):
+ """
+ A generator that produces IPAddress objects between an arbitrary start
+ and stop IP address with intervals of step between them. Sequences
+ produce are inclusive of boundary IPs.
+
+ :param start: start IP address.
+
+ :param end: end IP address.
+
+ :param step: (optional) size of step between IP addresses. Default: 1
+
+ :return: an iterator of one or more `IPAddress` objects.
+ """
+ start = IPAddress(start)
+ end = IPAddress(end)
+
+ if start.version != end.version:
+ raise TypeError('start and stop IP versions do not match!')
+ version = start.version
+
+ step = int(step)
+ if step == 0:
+ raise ValueError('step argument cannot be zero')
+
+ # We don't need objects from here, just integers.
+ start = int(start)
+ stop = int(end)
+
+ negative_step = False
+
+ if step < 0:
+ negative_step = True
+
+ index = start - step
+ while True:
+ index += step
+ if negative_step:
+ if not index >= stop:
+ break
+ else:
+ if not index <= stop:
+ break
+ yield IPAddress(index, version)
+
+
+
+def iprange_to_cidrs(start, end):
+ """
+ A function that accepts an arbitrary start and end IP address or subnet
+ and returns a list of CIDR subnets that fit exactly between the boundaries
+ of the two with no overlap.
+
+ :param start: the start IP address or subnet.
+
+ :param end: the end IP address or subnet.
+
+ :return: a list of one or more IP addresses and subnets.
+ """
+ cidr_list = []
+
+ start = IPNetwork(start)
+ end = IPNetwork(end)
+
+ iprange = [start.first, end.last]
+
+ # Get spanning CIDR covering both addresses.
+ cidr_span = spanning_cidr([start, end])
+ width = start._module.width
+
+ if cidr_span.first < iprange[0]:
+ exclude = IPNetwork((iprange[0]-1, width), version=start.version)
+ cidr_list = cidr_partition(cidr_span, exclude)[2]
+ cidr_span = cidr_list.pop()
+ if cidr_span.last > iprange[1]:
+ exclude = IPNetwork((iprange[1]+1, width), version=start.version)
+ cidr_list += cidr_partition(cidr_span, exclude)[0]
+ else:
+ cidr_list.append(cidr_span)
+
+ return cidr_list
+
+
+def smallest_matching_cidr(ip, cidrs):
+ """
+ Matches an IP address or subnet against a given sequence of IP addresses
+ and subnets.
+
+ :param ip: a single IP address or subnet.
+
+ :param cidrs: a sequence of IP addresses and/or subnets.
+
+ :return: the smallest (most specific) matching IPAddress or IPNetwork
+ object from the provided sequence, None if there was no match.
+ """
+ match = None
+
+ if not hasattr(cidrs, '__iter__'):
+ raise TypeError('IP address/subnet sequence expected, not %r!'
+ % (cidrs,))
+
+ ip = IPAddress(ip)
+ for cidr in sorted([IPNetwork(cidr) for cidr in cidrs]):
+ if ip in cidr:
+ match = cidr
+ else:
+ if match is not None and cidr.network not in match:
+ break
+
+ return match
+
+
+def largest_matching_cidr(ip, cidrs):
+ """
+ Matches an IP address or subnet against a given sequence of IP addresses
+ and subnets.
+
+ :param ip: a single IP address or subnet.
+
+ :param cidrs: a sequence of IP addresses and/or subnets.
+
+ :return: the largest (least specific) matching IPAddress or IPNetwork
+ object from the provided sequence, None if there was no match.
+ """
+ match = None
+
+ if not hasattr(cidrs, '__iter__'):
+ raise TypeError('IP address/subnet sequence expected, not %r!'
+ % (cidrs,))
+
+ ip = IPAddress(ip)
+ for cidr in sorted([IPNetwork(cidr) for cidr in cidrs]):
+ if ip in cidr:
+ match = cidr
+ break
+
+ return match
+
+
+def all_matching_cidrs(ip, cidrs):
+ """
+ Matches an IP address or subnet against a given sequence of IP addresses
+ and subnets.
+
+ :param ip: a single IP address.
+
+ :param cidrs: a sequence of IP addresses and/or subnets.
+
+ :return: all matching IPAddress and/or IPNetwork objects from the provided
+ sequence, an empty list if there was no match.
+ """
+ matches = []
+
+ if not hasattr(cidrs, '__iter__'):
+ raise TypeError('IP address/subnet sequence expected, not %r!'
+ % (cidrs,))
+
+ ip = IPAddress(ip)
+ for cidr in sorted([IPNetwork(cidr) for cidr in cidrs]):
+ if ip in cidr:
+ matches.append(cidr)
+ else:
+ if matches and cidr.network not in matches[-1]:
+ break
+
+ return matches
+
+#-----------------------------------------------------------------------------
+# Cached IPv4 address range lookups.
+#-----------------------------------------------------------------------------
+IPV4_LOOPBACK = IPNetwork('127.0.0.0/8') # Loopback addresses (RFC 990)
+
+IPV4_PRIVATE_USE = [
+ IPNetwork('10.0.0.0/8'), # Class A private network local communication (RFC 1918)
+ IPNetwork('172.16.0.0/12'), # Private network - local communication (RFC 1918)
+ IPNetwork('192.168.0.0/16'), # Class B private network local communication (RFC 1918)
+]
+
+IPV4_PRIVATEISH = tuple(IPV4_PRIVATE_USE) + (
+ IPNetwork('100.64.0.0/10'), # Carrier grade NAT (RFC 6598)
+ IPNetwork('192.0.0.0/24'), # IANA IPv4 Special Purpose Address Registry (RFC 5736)
+ # protocol assignments
+
+ # benchmarking
+ IPNetwork('198.18.0.0/15'), # Testing of inter-network communications between subnets (RFC 2544)
+ IPRange('239.0.0.0', '239.255.255.255'), # Administrative Multicast
+)
+
+IPV4_LINK_LOCAL = IPNetwork('169.254.0.0/16')
+
+IPV4_MULTICAST = IPNetwork('224.0.0.0/4')
+
+IPV4_6TO4 = IPNetwork('192.88.99.0/24') # 6to4 anycast relays (RFC 3068)
+
+IPV4_RESERVED = (
+ IPNetwork('0.0.0.0/8'), # Broadcast message (RFC 1700)
+ IPNetwork('192.0.2.0/24'), # TEST-NET examples and documentation (RFC 5737)
+ IPNetwork('240.0.0.0/4'), # Reserved for multicast assignments (RFC 5771)
+ IPNetwork('198.51.100.0/24'), # TEST-NET-2 examples and documentation (RFC 5737)
+ IPNetwork('203.0.113.0/24'), # TEST-NET-3 examples and documentation (RFC 5737)
+
+ # Reserved multicast
+ IPNetwork('233.252.0.0/24'), # Multicast test network
+ IPRange('234.0.0.0', '238.255.255.255'),
+ IPRange('225.0.0.0', '231.255.255.255'),
+) + (IPV4_LOOPBACK, IPV4_6TO4)
+
+IPV4_NOT_GLOBALLY_REACHABLE = [
+ IPNetwork(net) for net in [
+ '0.0.0.0/8',
+ '10.0.0.0/8',
+ '100.64.0.0/10',
+ '127.0.0.0/8',
+ '169.254.0.0/16',
+ '172.16.0.0/12',
+ '192.0.0.0/24',
+ '192.0.0.170/31',
+ '192.0.2.0/24',
+ '192.168.0.0/16',
+ '198.18.0.0/15',
+ '198.51.100.0/24',
+ '203.0.113.0/24',
+ '240.0.0.0/4',
+ '255.255.255.255/32',
+ ]
+]
+
+IPV4_NOT_GLOBALLY_REACHABLE_EXCEPTIONS = [
+ IPNetwork(net) for net in ['192.0.0.9/32', '192.0.0.10/32']
+]
+
+#-----------------------------------------------------------------------------
+# Cached IPv6 address range lookups.
+#-----------------------------------------------------------------------------
+IPV6_LOOPBACK = IPNetwork('::1/128')
+
+IPV6_UNIQUE_LOCAL = IPNetwork('fc00::/7')
+
+IPV6_PRIVATEISH = (
+ IPV6_UNIQUE_LOCAL,
+ IPNetwork('fec0::/10'), # Site Local Addresses (deprecated - RFC 3879)
+)
+
+IPV6_LINK_LOCAL = IPNetwork('fe80::/10')
+
+IPV6_MULTICAST = IPNetwork('ff00::/8')
+
+IPV6_RESERVED = (
+ IPNetwork('ff00::/12'), IPNetwork('::/8'),
+ IPNetwork('0100::/8'), IPNetwork('0200::/7'),
+ IPNetwork('0400::/6'), IPNetwork('0800::/5'),
+ IPNetwork('1000::/4'), IPNetwork('4000::/3'),
+ IPNetwork('6000::/3'), IPNetwork('8000::/3'),
+ IPNetwork('A000::/3'), IPNetwork('C000::/3'),
+ IPNetwork('E000::/4'), IPNetwork('F000::/5'),
+ IPNetwork('F800::/6'), IPNetwork('FE00::/9'),
+)
+
+IPV6_NOT_GLOBALLY_REACHABLE = [
+ IPNetwork(net)
+ for net in [
+ '::1/128',
+ '::/128',
+ '::ffff:0:0/96',
+ '64:ff9b:1::/48',
+ '100::/64',
+ '2001::/23',
+ '2001:db8::/32',
+ '2002::/16',
+ 'fc00::/7',
+ 'fe80::/10',
+ ]
+]
+
+IPV6_NOT_GLOBALLY_REACHABLE_EXCEPTIONS = [
+ IPNetwork(net)
+ for net in [
+ '2001:1::1/128',
+ '2001:1::2/128',
+ '2001:3::/32',
+ '2001:4:112::/48',
+ '2001:20::/28',
+ '2001:30::/28',
+] ]
diff --git a/netaddr/ip/glob.py b/netaddr/ip/glob.py
new file mode 100644
index 0000000..ed43b1b
--- /dev/null
+++ b/netaddr/ip/glob.py
@@ -0,0 +1,312 @@
+#-----------------------------------------------------------------------------
+# Copyright (c) 2008 by David P. D. Moss. All rights reserved.
+#
+# Released under the BSD license. See the LICENSE file for details.
+#-----------------------------------------------------------------------------
+"""
+Routines and classes for supporting and expressing IP address ranges using a
+glob style syntax.
+
+"""
+from netaddr.core import AddrFormatError, AddrConversionError
+from netaddr.ip import IPRange, IPAddress, IPNetwork, iprange_to_cidrs
+from netaddr.compat import _is_str
+
+
+def valid_glob(ipglob):
+ """
+ :param ipglob: An IP address range in a glob-style format.
+
+ :return: ``True`` if IP range glob is valid, ``False`` otherwise.
+ """
+ #TODO: Add support for abbreviated ipglobs.
+ #TODO: e.g. 192.0.*.* == 192.0.*
+ #TODO: *.*.*.* == *
+ #TODO: Add strict flag to enable verbose ipglob checking.
+ if not _is_str(ipglob):
+ return False
+
+ seen_hyphen = False
+ seen_asterisk = False
+
+ octets = ipglob.split('.')
+
+ if len(octets) != 4:
+ return False
+
+ for octet in octets:
+ if '-' in octet:
+ if seen_hyphen:
+ return False
+ seen_hyphen = True
+ if seen_asterisk:
+ # Asterisks cannot precede hyphenated octets.
+ return False
+ try:
+ (octet1, octet2) = [int(i) for i in octet.split('-')]
+ except ValueError:
+ return False
+ if octet1 >= octet2:
+ return False
+ if not 0 <= octet1 <= 254:
+ return False
+ if not 1 <= octet2 <= 255:
+ return False
+ elif octet == '*':
+ seen_asterisk = True
+ else:
+ if seen_hyphen is True:
+ return False
+ if seen_asterisk is True:
+ return False
+ try:
+ if not 0 <= int(octet) <= 255:
+ return False
+ except ValueError:
+ return False
+ return True
+
+
+def glob_to_iptuple(ipglob):
+ """
+ A function that accepts a glob-style IP range and returns the component
+ lower and upper bound IP address.
+
+ :param ipglob: an IP address range in a glob-style format.
+
+ :return: a tuple contain lower and upper bound IP objects.
+ """
+ if not valid_glob(ipglob):
+ raise AddrFormatError('not a recognised IP glob range: %r!' % (ipglob,))
+
+ start_tokens = []
+ end_tokens = []
+
+ for octet in ipglob.split('.'):
+ if '-' in octet:
+ tokens = octet.split('-')
+ start_tokens.append(tokens[0])
+ end_tokens.append(tokens[1])
+ elif octet == '*':
+ start_tokens.append('0')
+ end_tokens.append('255')
+ else:
+ start_tokens.append(octet)
+ end_tokens.append(octet)
+
+ return IPAddress('.'.join(start_tokens)), IPAddress('.'.join(end_tokens))
+
+
+def glob_to_iprange(ipglob):
+ """
+ A function that accepts a glob-style IP range and returns the equivalent
+ IP range.
+
+ :param ipglob: an IP address range in a glob-style format.
+
+ :return: an IPRange object.
+ """
+ if not valid_glob(ipglob):
+ raise AddrFormatError('not a recognised IP glob range: %r!' % (ipglob,))
+
+ start_tokens = []
+ end_tokens = []
+
+ for octet in ipglob.split('.'):
+ if '-' in octet:
+ tokens = octet.split('-')
+ start_tokens.append(tokens[0])
+ end_tokens.append(tokens[1])
+ elif octet == '*':
+ start_tokens.append('0')
+ end_tokens.append('255')
+ else:
+ start_tokens.append(octet)
+ end_tokens.append(octet)
+
+ return IPRange('.'.join(start_tokens), '.'.join(end_tokens))
+
+
+def iprange_to_globs(start, end):
+ """
+ A function that accepts an arbitrary start and end IP address or subnet
+ and returns one or more glob-style IP ranges.
+
+ :param start: the start IP address or subnet.
+
+ :param end: the end IP address or subnet.
+
+ :return: a list containing one or more IP globs.
+ """
+ start = IPAddress(start)
+ end = IPAddress(end)
+
+ if start.version != 4 and end.version != 4:
+ raise AddrConversionError('IP glob ranges only support IPv4!')
+
+ def _iprange_to_glob(lb, ub):
+ # Internal function to process individual IP globs.
+ t1 = [int(_) for _ in str(lb).split('.')]
+ t2 = [int(_) for _ in str(ub).split('.')]
+
+ tokens = []
+
+ seen_hyphen = False
+ seen_asterisk = False
+
+ for i in range(4):
+ if t1[i] == t2[i]:
+ # A normal octet.
+ tokens.append(str(t1[i]))
+ elif (t1[i] == 0) and (t2[i] == 255):
+ # An asterisk octet.
+ tokens.append('*')
+ seen_asterisk = True
+ else:
+ # Create a hyphenated octet - only one allowed per IP glob.
+ if not seen_asterisk:
+ if not seen_hyphen:
+ tokens.append('%s-%s' % (t1[i], t2[i]))
+ seen_hyphen = True
+ else:
+ raise AddrConversionError(
+ 'only 1 hyphenated octet per IP glob allowed!')
+ else:
+ raise AddrConversionError(
+ "asterisks are not allowed before hyphenated octets!")
+
+ return '.'.join(tokens)
+
+ globs = []
+
+ try:
+ # IP range can be represented by a single glob.
+ ipglob = _iprange_to_glob(start, end)
+ if not valid_glob(ipglob):
+ #TODO: this is a workaround, it is produces non-optimal but valid
+ #TODO: glob conversions. Fix inner function so that is always
+ #TODO: produces a valid glob.
+ raise AddrConversionError('invalid ip glob created')
+ globs.append(ipglob)
+ except AddrConversionError:
+ # Break IP range up into CIDRs before conversion to globs.
+ #
+ #TODO: this is still not completely optimised but is good enough
+ #TODO: for the moment.
+ #
+ for cidr in iprange_to_cidrs(start, end):
+ ipglob = _iprange_to_glob(cidr[0], cidr[-1])
+ globs.append(ipglob)
+
+ return globs
+
+
+def glob_to_cidrs(ipglob):
+ """
+ A function that accepts a glob-style IP range and returns a list of one
+ or more IP CIDRs that exactly matches it.
+
+ :param ipglob: an IP address range in a glob-style format.
+
+ :return: a list of one or more IP objects.
+ """
+ return iprange_to_cidrs(*glob_to_iptuple(ipglob))
+
+
+def cidr_to_glob(cidr):
+ """
+ A function that accepts an IP subnet in a glob-style format and returns
+ a list of CIDR subnets that exactly matches the specified glob.
+
+ :param cidr: an IP object CIDR subnet.
+
+ :return: a list of one or more IP addresses and subnets.
+ """
+ ip = IPNetwork(cidr)
+ globs = iprange_to_globs(ip[0], ip[-1])
+ if len(globs) != 1:
+ # There should only ever be a one to one mapping between a CIDR and
+ # an IP glob range.
+ raise AddrConversionError('bad CIDR to IP glob conversion!')
+ return globs[0]
+
+
+class IPGlob(IPRange):
+ """
+ Represents an IP address range using a glob-style syntax ``x.x.x-y.*``
+
+ Individual octets can be represented using the following shortcuts :
+
+ 1. ``*`` - the asterisk octet (represents values ``0`` through ``255``)
+ 2. ``x-y`` - the hyphenated octet (represents values ``x`` through ``y``)
+
+ A few basic rules also apply :
+
+ 1. ``x`` must always be less than ``y``, therefore :
+
+ - ``x`` can only be ``0`` through ``254``
+ - ``y`` can only be ``1`` through ``255``
+
+ 2. only one hyphenated octet per IP glob is allowed
+ 3. only asterisks are permitted after a hyphenated octet
+
+ Examples:
+
+ +------------------+------------------------------+
+ | IP glob | Description |
+ +==================+==============================+
+ | ``192.0.2.1`` | a single address |
+ +------------------+------------------------------+
+ | ``192.0.2.0-31`` | 32 addresses |
+ +------------------+------------------------------+
+ | ``192.0.2.*`` | 256 addresses |
+ +------------------+------------------------------+
+ | ``192.0.2-3.*`` | 512 addresses |
+ +------------------+------------------------------+
+ | ``192.0-1.*.*`` | 131,072 addresses |
+ +------------------+------------------------------+
+ | ``*.*.*.*`` | the whole IPv4 address space |
+ +------------------+------------------------------+
+
+ .. note :: \
+ IP glob ranges are not directly equivalent to CIDR blocks. \
+ They can represent address ranges that do not fall on strict bit mask \
+ boundaries. They are suitable for use in configuration files, being \
+ more obvious and readable than their CIDR counterparts, especially for \
+ admins and end users with little or no networking knowledge or \
+ experience. All CIDR addresses can always be represented as IP globs \
+ but the reverse is not always true.
+ """
+ __slots__ = ('_glob',)
+
+ def __init__(self, ipglob):
+ (start, end) = glob_to_iptuple(ipglob)
+ super(IPGlob, self).__init__(start, end)
+ self.glob = iprange_to_globs(self._start, self._end)[0]
+
+ def __getstate__(self):
+ """:return: Pickled state of an `IPGlob` object."""
+ return super(IPGlob, self).__getstate__()
+
+ def __setstate__(self, state):
+ """:param state: data used to unpickle a pickled `IPGlob` object."""
+ super(IPGlob, self).__setstate__(state)
+ self.glob = iprange_to_globs(self._start, self._end)[0]
+
+ def _get_glob(self):
+ return self._glob
+
+ def _set_glob(self, ipglob):
+ (self._start, self._end) = glob_to_iptuple(ipglob)
+ self._glob = iprange_to_globs(self._start, self._end)[0]
+
+ glob = property(_get_glob, _set_glob, None,
+ 'an arbitrary IP address range in glob format.')
+
+ def __str__(self):
+ """:return: IP glob in common representational format."""
+ return "%s" % self.glob
+
+ def __repr__(self):
+ """:return: Python statement to create an equivalent object"""
+ return "%s('%s')" % (self.__class__.__name__, self.glob)
diff --git a/netaddr/ip/iana.py b/netaddr/ip/iana.py
new file mode 100755
index 0000000..c2c0185
--- /dev/null
+++ b/netaddr/ip/iana.py
@@ -0,0 +1,448 @@
+#!/usr/bin/env python
+#-----------------------------------------------------------------------------
+# Copyright (c) 2008 by David P. D. Moss. All rights reserved.
+#
+# Released under the BSD license. See the LICENSE file for details.
+#-----------------------------------------------------------------------------
+#
+# DISCLAIMER
+#
+# netaddr is not sponsored nor endorsed by IANA.
+#
+# Use of data from IANA (Internet Assigned Numbers Authority) is subject to
+# copyright and is provided with prior written permission.
+#
+# IANA data files included with netaddr are not modified in any way but are
+# parsed and made available to end users through an API.
+#
+# See README file and source code for URLs to latest copies of the relevant
+# files.
+#
+#-----------------------------------------------------------------------------
+"""
+Routines for accessing data published by IANA (Internet Assigned Numbers
+Authority).
+
+More details can be found at the following URLs :-
+
+ - IANA Home Page - http://www.iana.org/
+ - IEEE Protocols Information Home Page - http://www.iana.org/protocols/
+"""
+
+import sys as _sys
+from xml.sax import make_parser, handler
+
+from netaddr.core import Publisher, Subscriber
+from netaddr.ip import IPAddress, IPNetwork, IPRange, cidr_abbrev_to_verbose
+from netaddr.compat import _dict_items, _callable, _open_binary
+
+
+
+#: Topic based lookup dictionary for IANA information.
+IANA_INFO = {
+ 'IPv4': {},
+ 'IPv6': {},
+ 'IPv6_unicast': {},
+ 'multicast': {},
+}
+
+
+class SaxRecordParser(handler.ContentHandler):
+ def __init__(self, callback=None):
+ self._level = 0
+ self._is_active = False
+ self._record = None
+ self._tag_level = None
+ self._tag_payload = None
+ self._tag_feeding = None
+ self._callback = callback
+
+ def startElement(self, name, attrs):
+ self._level += 1
+
+ if self._is_active is False:
+ if name == 'record':
+ self._is_active = True
+ self._tag_level = self._level
+ self._record = {}
+ if 'date' in attrs:
+ self._record['date'] = attrs['date']
+ elif self._level == self._tag_level + 1:
+ if name == 'xref':
+ if 'type' in attrs and 'data' in attrs:
+ l = self._record.setdefault(attrs['type'], [])
+ l.append(attrs['data'])
+ else:
+ self._tag_payload = []
+ self._tag_feeding = True
+ else:
+ self._tag_feeding = False
+
+ def endElement(self, name):
+ if self._is_active is True:
+ if name == 'record' and self._tag_level == self._level:
+ self._is_active = False
+ self._tag_level = None
+ if _callable(self._callback):
+ self._callback(self._record)
+ self._record = None
+ elif self._level == self._tag_level + 1:
+ if name != 'xref':
+ self._record[name] = ''.join(self._tag_payload)
+ self._tag_payload = None
+ self._tag_feeding = False
+
+ self._level -= 1
+
+ def characters(self, content):
+ if self._tag_feeding is True:
+ self._tag_payload.append(content)
+
+
+class XMLRecordParser(Publisher):
+ """
+ A configurable Parser that understands how to parse XML based records.
+ """
+
+ def __init__(self, fh, **kwargs):
+ """
+ Constructor.
+
+ fh - a valid, open file handle to XML based record data.
+ """
+ super(XMLRecordParser, self).__init__()
+
+ self.xmlparser = make_parser()
+ self.xmlparser.setContentHandler(SaxRecordParser(self.consume_record))
+
+ self.fh = fh
+
+ self.__dict__.update(kwargs)
+
+ def process_record(self, rec):
+ """
+ This is the callback method invoked for every record. It is usually
+ over-ridden by base classes to provide specific record-based logic.
+
+ Any record can be vetoed (not passed to registered Subscriber objects)
+ by simply returning None.
+ """
+ return rec
+
+ def consume_record(self, rec):
+ record = self.process_record(rec)
+ if record is not None:
+ self.notify(record)
+
+ def parse(self):
+ """
+ Parse and normalises records, notifying registered subscribers with
+ record data as it is encountered.
+ """
+ self.xmlparser.parse(self.fh)
+
+
+class IPv4Parser(XMLRecordParser):
+ """
+ A XMLRecordParser that understands how to parse and retrieve data records
+ from the IANA IPv4 address space file.
+
+ It can be found online here :-
+
+ - http://www.iana.org/assignments/ipv4-address-space/ipv4-address-space.xml
+ """
+
+ def __init__(self, fh, **kwargs):
+ """
+ Constructor.
+
+ fh - a valid, open file handle to an IANA IPv4 address space file.
+
+ kwargs - additional parser options.
+ """
+ super(IPv4Parser, self).__init__(fh)
+
+ def process_record(self, rec):
+ """
+ Callback method invoked for every record.
+
+ See base class method for more details.
+ """
+
+ record = {}
+ for key in ('prefix', 'designation', 'date', 'whois', 'status'):
+ record[key] = str(rec.get(key, '')).strip()
+
+ # Strip leading zeros from octet.
+ if '/' in record['prefix']:
+ (octet, prefix) = record['prefix'].split('/')
+ record['prefix'] = '%d/%d' % (int(octet), int(prefix))
+
+ record['status'] = record['status'].capitalize()
+
+ return record
+
+
+class IPv6Parser(XMLRecordParser):
+ """
+ A XMLRecordParser that understands how to parse and retrieve data records
+ from the IANA IPv6 address space file.
+
+ It can be found online here :-
+
+ - http://www.iana.org/assignments/ipv6-address-space/ipv6-address-space.xml
+ """
+
+ def __init__(self, fh, **kwargs):
+ """
+ Constructor.
+
+ fh - a valid, open file handle to an IANA IPv6 address space file.
+
+ kwargs - additional parser options.
+ """
+ super(IPv6Parser, self).__init__(fh)
+
+ def process_record(self, rec):
+ """
+ Callback method invoked for every record.
+
+ See base class method for more details.
+ """
+
+ record = {
+ 'prefix': str(rec.get('prefix', '')).strip(),
+ 'allocation': str(rec.get('description', '')).strip(),
+ # HACK: -1 instead of 0 is a hacky hack to get 4291 instead of 3513 from
+ #
+ # <xref type="rfc" data="rfc3513"/> was later obsoleted by <xref type="rfc" data="rfc4291"/>
+ #
+ # I imagine there's no way to solve this in a general way, maybe we should start returning a list
+ # of RFC-s here?
+ 'reference': str(rec.get('rfc', [''])[-1]).strip(),
+ }
+
+ return record
+
+
+class IPv6UnicastParser(XMLRecordParser):
+ """
+ A XMLRecordParser that understands how to parse and retrieve data records
+ from the IANA IPv6 unicast address assignments file.
+
+ It can be found online here :-
+
+ - http://www.iana.org/assignments/ipv6-unicast-address-assignments/ipv6-unicast-address-assignments.xml
+ """
+ def __init__(self, fh, **kwargs):
+ """
+ Constructor.
+
+ fh - a valid, open file handle to an IANA IPv6 address space file.
+
+ kwargs - additional parser options.
+ """
+ super(IPv6UnicastParser, self).__init__(fh)
+
+ def process_record(self, rec):
+ """
+ Callback method invoked for every record.
+
+ See base class method for more details.
+ """
+ record = {
+ 'status': str(rec.get('status', '')).strip(),
+ 'description': str(rec.get('description', '')).strip(),
+ 'prefix': str(rec.get('prefix', '')).strip(),
+ 'date': str(rec.get('date', '')).strip(),
+ 'whois': str(rec.get('whois', '')).strip(),
+ }
+
+ return record
+
+
+class MulticastParser(XMLRecordParser):
+ """
+ A XMLRecordParser that knows how to process the IANA IPv4 multicast address
+ allocation file.
+
+ It can be found online here :-
+
+ - http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xml
+ """
+
+ def __init__(self, fh, **kwargs):
+ """
+ Constructor.
+
+ fh - a valid, open file handle to an IANA IPv4 multicast address
+ allocation file.
+
+ kwargs - additional parser options.
+ """
+ super(MulticastParser, self).__init__(fh)
+
+ def normalise_addr(self, addr):
+ """
+ Removes variations from address entries found in this particular file.
+ """
+ if '-' in addr:
+ (a1, a2) = addr.split('-')
+ o1 = a1.strip().split('.')
+ o2 = a2.strip().split('.')
+ return '%s-%s' % ('.'.join([str(int(i)) for i in o1]),
+ '.'.join([str(int(i)) for i in o2]))
+ else:
+ o1 = addr.strip().split('.')
+ return '.'.join([str(int(i)) for i in o1])
+
+ def process_record(self, rec):
+ """
+ Callback method invoked for every record.
+
+ See base class method for more details.
+ """
+
+ if 'addr' in rec:
+ record = {
+ 'address': self.normalise_addr(str(rec['addr'])),
+ 'descr': str(rec.get('description', '')),
+ }
+ return record
+
+
+class DictUpdater(Subscriber):
+ """
+ Concrete Subscriber that inserts records received from a Publisher into a
+ dictionary.
+ """
+
+ def __init__(self, dct, topic, unique_key):
+ """
+ Constructor.
+
+ dct - lookup dict or dict like object to insert records into.
+
+ topic - high-level category name of data to be processed.
+
+ unique_key - key name in data dict that uniquely identifies it.
+ """
+ self.dct = dct
+ self.topic = topic
+ self.unique_key = unique_key
+
+ def update(self, data):
+ """
+ Callback function used by Publisher to notify this Subscriber about
+ an update. Stores topic based information into dictionary passed to
+ constructor.
+ """
+ data_id = data[self.unique_key]
+
+ if self.topic == 'IPv4':
+ cidr = IPNetwork(cidr_abbrev_to_verbose(data_id))
+ self.dct[cidr] = data
+ elif self.topic == 'IPv6':
+ cidr = IPNetwork(cidr_abbrev_to_verbose(data_id))
+ self.dct[cidr] = data
+ elif self.topic == 'IPv6_unicast':
+ cidr = IPNetwork(data_id)
+ self.dct[cidr] = data
+ elif self.topic == 'multicast':
+ iprange = None
+ if '-' in data_id:
+ # See if we can manage a single CIDR.
+ (first, last) = data_id.split('-')
+ iprange = IPRange(first, last)
+ cidrs = iprange.cidrs()
+ if len(cidrs) == 1:
+ iprange = cidrs[0]
+ else:
+ iprange = IPAddress(data_id)
+ self.dct[iprange] = data
+
+
+def load_info():
+ """
+ Parse and load internal IANA data lookups with the latest information from
+ data files.
+ """
+ ipv4 = IPv4Parser(_open_binary(__package__, 'ipv4-address-space.xml'))
+ ipv4.attach(DictUpdater(IANA_INFO['IPv4'], 'IPv4', 'prefix'))
+ ipv4.parse()
+
+ ipv6 = IPv6Parser(_open_binary(__package__, 'ipv6-address-space.xml'))
+ ipv6.attach(DictUpdater(IANA_INFO['IPv6'], 'IPv6', 'prefix'))
+ ipv6.parse()
+
+ ipv6ua = IPv6UnicastParser(
+ _open_binary(__package__, 'ipv6-unicast-address-assignments.xml'),
+ )
+ ipv6ua.attach(DictUpdater(IANA_INFO['IPv6_unicast'], 'IPv6_unicast', 'prefix'))
+ ipv6ua.parse()
+
+ mcast = MulticastParser(_open_binary(__package__, 'multicast-addresses.xml'))
+ mcast.attach(DictUpdater(IANA_INFO['multicast'], 'multicast', 'address'))
+ mcast.parse()
+
+
+def pprint_info(fh=None):
+ """
+ Pretty prints IANA information to filehandle.
+ """
+ if fh is None:
+ fh = _sys.stdout
+
+ for category in sorted(IANA_INFO):
+ fh.write('-' * len(category) + "\n")
+ fh.write(category + "\n")
+ fh.write('-' * len(category) + "\n")
+ ipranges = IANA_INFO[category]
+ for iprange in sorted(ipranges):
+ details = ipranges[iprange]
+ fh.write('%-45r' % (iprange) + details + "\n")
+
+
+def _within_bounds(ip, ip_range):
+ # Boundary checking for multiple IP classes.
+ if hasattr(ip_range, 'first'):
+ # IP network or IP range.
+ return ip in ip_range
+ elif hasattr(ip_range, 'value'):
+ # IP address.
+ return ip == ip_range
+
+ raise Exception('Unsupported IP range or address: %r!' % (ip_range,))
+
+
+def query(ip_addr):
+ """Returns informational data specific to this IP address."""
+ info = {}
+
+ if ip_addr.version == 4:
+ for cidr, record in _dict_items(IANA_INFO['IPv4']):
+ if _within_bounds(ip_addr, cidr):
+ info.setdefault('IPv4', [])
+ info['IPv4'].append(record)
+
+ if ip_addr.is_multicast():
+ for iprange, record in _dict_items(IANA_INFO['multicast']):
+ if _within_bounds(ip_addr, iprange):
+ info.setdefault('Multicast', [])
+ info['Multicast'].append(record)
+
+ elif ip_addr.version == 6:
+ for cidr, record in _dict_items(IANA_INFO['IPv6']):
+ if _within_bounds(ip_addr, cidr):
+ info.setdefault('IPv6', [])
+ info['IPv6'].append(record)
+
+ for cidr, record in _dict_items(IANA_INFO['IPv6_unicast']):
+ if _within_bounds(ip_addr, cidr):
+ info.setdefault('IPv6_unicast', [])
+ info['IPv6_unicast'].append(record)
+
+ return info
+
+# On module import, read IANA data files and populate lookups dict.
+load_info()
diff --git a/netaddr/ip/ipv4-address-space.xml b/netaddr/ip/ipv4-address-space.xml
new file mode 100644
index 0000000..6918abe
--- /dev/null
+++ b/netaddr/ip/ipv4-address-space.xml
@@ -0,0 +1,2647 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?xml-stylesheet type="text/xsl" href="ipv4-address-space.xsl"?>
+<?xml-model href="ipv4-address-space.rng" schematypens="http://relaxng.org/ns/structure/1.0" ?>
+<registry xmlns="http://www.iana.org/assignments" id="ipv4-address-space">
+ <title>IANA IPv4 Address Space Registry</title>
+ <category>Internet Protocol version 4 (IPv4) Address Space</category>
+ <updated>2023-12-18</updated>
+ <xref type="rfc" data="rfc7249"/>
+ <registration_rule>Allocations to RIRs are made in line with the Global Policy published at <xref type="uri" data="http://www.icann.org/en/resources/policy/global-addressing"/>.
+All other assignments require IETF Review.</registration_rule>
+ <description>The allocation of Internet Protocol version 4 (IPv4) address space to various registries is listed
+here. Originally, all the IPv4 address spaces was managed directly by the IANA. Later parts of the
+address space were allocated to various other registries to manage for particular purposes or
+regional areas of the world. RFC 1466 <xref type="rfc" data="rfc1466"/> documents most of these allocations.</description>
+ <record>
+ <prefix>000/8</prefix>
+ <designation>IANA - Local Identification</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="2"/>
+ <xref type="note" data="3"/>
+ </record>
+ <record>
+ <prefix>001/8</prefix>
+ <designation>APNIC</designation>
+ <date>2010-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>002/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2009-09</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>003/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1994-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>004/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1992-12</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>005/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2010-11</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>006/8</prefix>
+ <designation>Army Information Systems Center</designation>
+ <date>1994-02</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>007/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1995-04</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>008/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1992-12</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>009/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1992-08</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>010/8</prefix>
+ <designation>IANA - Private Use</designation>
+ <date>1995-06</date>
+ <status>RESERVED</status>
+ <xref type="note" data="4"/>
+ </record>
+ <record>
+ <prefix>011/8</prefix>
+ <designation>DoD Intel Information Systems</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>012/8</prefix>
+ <designation>AT&amp;T Bell Laboratories</designation>
+ <date>1995-06</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>013/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1991-09</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>014/8</prefix>
+ <designation>APNIC</designation>
+ <date>2010-04</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ <xref type="note" data="5"/>
+ </record>
+ <record>
+ <prefix>015/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1994-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>016/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1994-11</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>017/8</prefix>
+ <designation>Apple Computer Inc.</designation>
+ <date>1992-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>018/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1994-01</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>019/8</prefix>
+ <designation>Ford Motor Company</designation>
+ <date>1995-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>020/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1994-10</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>021/8</prefix>
+ <designation>DDN-RVN</designation>
+ <date>1991-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>022/8</prefix>
+ <designation>Defense Information Systems Agency</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>023/8</prefix>
+ <designation>ARIN</designation>
+ <date>2010-11</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>024/8</prefix>
+ <designation>ARIN</designation>
+ <date>2001-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record updated="2018-09-18">
+ <prefix>025/8</prefix>
+ <designation>Administered by RIPE NCC</designation>
+ <date>1995-01</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>026/8</prefix>
+ <designation>Defense Information Systems Agency</designation>
+ <date>1995-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>027/8</prefix>
+ <designation>APNIC</designation>
+ <date>2010-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>028/8</prefix>
+ <designation>DSI-North</designation>
+ <date>1992-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>029/8</prefix>
+ <designation>Defense Information Systems Agency</designation>
+ <date>1991-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>030/8</prefix>
+ <designation>Defense Information Systems Agency</designation>
+ <date>1991-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>031/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2010-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record updated="2015-05-01">
+ <prefix>032/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1994-06</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>033/8</prefix>
+ <designation>DLA Systems Automation Center</designation>
+ <date>1991-01</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>034/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-03</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>035/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1994-04</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>036/8</prefix>
+ <designation>APNIC</designation>
+ <date>2010-10</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>037/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2010-11</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>038/8</prefix>
+ <designation>PSINet, Inc.</designation>
+ <date>1994-09</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>039/8</prefix>
+ <designation>APNIC</designation>
+ <date>2011-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>040/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1994-06</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>041/8</prefix>
+ <designation>AFRINIC</designation>
+ <date>2005-04</date>
+ <whois>whois.afrinic.net</whois>
+ <rdap>
+ <server>https://rdap.afrinic.net/rdap/</server>
+ <server>http://rdap.afrinic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>042/8</prefix>
+ <designation>APNIC</designation>
+ <date>2010-10</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>043/8</prefix>
+ <designation>Administered by APNIC</designation>
+ <date>1991-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>044/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1992-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>045/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1995-01</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>046/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2009-09</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>047/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1991-01</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record updated="2023-12-18">
+ <prefix>048/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1995-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>049/8</prefix>
+ <designation>APNIC</designation>
+ <date>2010-08</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>050/8</prefix>
+ <designation>ARIN</designation>
+ <date>2010-02</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record updated="2015-05-11">
+ <prefix>051/8</prefix>
+ <designation>Administered by RIPE NCC</designation>
+ <date>1994-08</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record updated="2015-05-01">
+ <prefix>052/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1991-12</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record updated="2014-10-14">
+ <prefix>053/8</prefix>
+ <designation>Daimler AG</designation>
+ <date>1993-10</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>054/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1992-03</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>055/8</prefix>
+ <designation>DoD Network Information Center</designation>
+ <date>1995-04</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>056/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1994-06</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record updated="2019-12-27">
+ <prefix>057/8</prefix>
+ <designation>Administered by RIPE NCC</designation>
+ <date>1995-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>058/8</prefix>
+ <designation>APNIC</designation>
+ <date>2004-04</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>059/8</prefix>
+ <designation>APNIC</designation>
+ <date>2004-04</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>060/8</prefix>
+ <designation>APNIC</designation>
+ <date>2003-04</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>061/8</prefix>
+ <designation>APNIC</designation>
+ <date>1997-04</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>062/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>1997-04</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>063/8</prefix>
+ <designation>ARIN</designation>
+ <date>1997-04</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>064/8</prefix>
+ <designation>ARIN</designation>
+ <date>1999-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>065/8</prefix>
+ <designation>ARIN</designation>
+ <date>2000-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>066/8</prefix>
+ <designation>ARIN</designation>
+ <date>2000-07</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>067/8</prefix>
+ <designation>ARIN</designation>
+ <date>2001-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>068/8</prefix>
+ <designation>ARIN</designation>
+ <date>2001-06</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>069/8</prefix>
+ <designation>ARIN</designation>
+ <date>2002-08</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>070/8</prefix>
+ <designation>ARIN</designation>
+ <date>2004-01</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>071/8</prefix>
+ <designation>ARIN</designation>
+ <date>2004-08</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>072/8</prefix>
+ <designation>ARIN</designation>
+ <date>2004-08</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>073/8</prefix>
+ <designation>ARIN</designation>
+ <date>2005-03</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>074/8</prefix>
+ <designation>ARIN</designation>
+ <date>2005-06</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>075/8</prefix>
+ <designation>ARIN</designation>
+ <date>2005-06</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>076/8</prefix>
+ <designation>ARIN</designation>
+ <date>2005-06</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>077/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2006-08</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>078/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2006-08</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>079/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2006-08</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>080/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2001-04</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>081/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2001-04</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>082/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2002-11</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>083/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2003-11</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>084/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2003-11</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>085/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2004-04</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>086/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2004-04</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>087/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2004-04</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>088/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2004-04</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>089/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2005-06</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>090/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2005-06</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>091/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2005-06</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>092/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2007-03</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>093/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2007-03</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>094/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2007-07</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>095/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2007-07</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>096/8</prefix>
+ <designation>ARIN</designation>
+ <date>2006-10</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>097/8</prefix>
+ <designation>ARIN</designation>
+ <date>2006-10</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>098/8</prefix>
+ <designation>ARIN</designation>
+ <date>2006-10</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>099/8</prefix>
+ <designation>ARIN</designation>
+ <date>2006-10</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>100/8</prefix>
+ <designation>ARIN</designation>
+ <date>2010-11</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ <xref type="note" data="6"/>
+ </record>
+ <record>
+ <prefix>101/8</prefix>
+ <designation>APNIC</designation>
+ <date>2010-08</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>102/8</prefix>
+ <designation>AFRINIC</designation>
+ <date>2011-02</date>
+ <whois>whois.afrinic.net</whois>
+ <rdap>
+ <server>https://rdap.afrinic.net/rdap/</server>
+ <server>http://rdap.afrinic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>103/8</prefix>
+ <designation>APNIC</designation>
+ <date>2011-02</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>104/8</prefix>
+ <designation>ARIN</designation>
+ <date>2011-02</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>105/8</prefix>
+ <designation>AFRINIC</designation>
+ <date>2010-11</date>
+ <whois>whois.afrinic.net</whois>
+ <rdap>
+ <server>https://rdap.afrinic.net/rdap/</server>
+ <server>http://rdap.afrinic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>106/8</prefix>
+ <designation>APNIC</designation>
+ <date>2011-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>107/8</prefix>
+ <designation>ARIN</designation>
+ <date>2010-02</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>108/8</prefix>
+ <designation>ARIN</designation>
+ <date>2008-12</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>109/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2009-01</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>110/8</prefix>
+ <designation>APNIC</designation>
+ <date>2008-11</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>111/8</prefix>
+ <designation>APNIC</designation>
+ <date>2008-11</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>112/8</prefix>
+ <designation>APNIC</designation>
+ <date>2008-05</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>113/8</prefix>
+ <designation>APNIC</designation>
+ <date>2008-05</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>114/8</prefix>
+ <designation>APNIC</designation>
+ <date>2007-10</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>115/8</prefix>
+ <designation>APNIC</designation>
+ <date>2007-10</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>116/8</prefix>
+ <designation>APNIC</designation>
+ <date>2007-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>117/8</prefix>
+ <designation>APNIC</designation>
+ <date>2007-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>118/8</prefix>
+ <designation>APNIC</designation>
+ <date>2007-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>119/8</prefix>
+ <designation>APNIC</designation>
+ <date>2007-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>120/8</prefix>
+ <designation>APNIC</designation>
+ <date>2007-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>121/8</prefix>
+ <designation>APNIC</designation>
+ <date>2006-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>122/8</prefix>
+ <designation>APNIC</designation>
+ <date>2006-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>123/8</prefix>
+ <designation>APNIC</designation>
+ <date>2006-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>124/8</prefix>
+ <designation>APNIC</designation>
+ <date>2005-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>125/8</prefix>
+ <designation>APNIC</designation>
+ <date>2005-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>126/8</prefix>
+ <designation>APNIC</designation>
+ <date>2005-01</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>127/8</prefix>
+ <designation>IANA - Loopback</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="7"/>
+ </record>
+ <record>
+ <prefix>128/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>129/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>130/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>131/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>132/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>133/8</prefix>
+ <designation>Administered by APNIC</designation>
+ <date>1997-03</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>134/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>135/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>136/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>137/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>138/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>139/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>140/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>141/8</prefix>
+ <designation>Administered by RIPE NCC</designation>
+ <date>1993-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>142/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>143/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>144/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>145/8</prefix>
+ <designation>Administered by RIPE NCC</designation>
+ <date>1993-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>146/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>147/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>148/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>149/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>150/8</prefix>
+ <designation>Administered by APNIC</designation>
+ <date>1993-05</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>151/8</prefix>
+ <designation>Administered by RIPE NCC</designation>
+ <date>1993-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>152/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>153/8</prefix>
+ <designation>Administered by APNIC</designation>
+ <date>1993-05</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>154/8</prefix>
+ <designation>Administered by AFRINIC</designation>
+ <date>1993-05</date>
+ <whois>whois.afrinic.net</whois>
+ <rdap>
+ <server>https://rdap.afrinic.net/rdap/</server>
+ <server>http://rdap.afrinic.net/rdap/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>155/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>156/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>157/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>158/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>159/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>160/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>161/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>162/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>163/8</prefix>
+ <designation>Administered by APNIC</designation>
+ <date>1993-05</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>164/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>165/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>166/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>167/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>168/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>169/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ <xref type="note" data="8"/>
+ </record>
+ <record>
+ <prefix>170/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>171/8</prefix>
+ <designation>Administered by APNIC</designation>
+ <date>1993-05</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>172/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ <xref type="note" data="9"/>
+ </record>
+ <record>
+ <prefix>173/8</prefix>
+ <designation>ARIN</designation>
+ <date>2008-02</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>174/8</prefix>
+ <designation>ARIN</designation>
+ <date>2008-02</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>175/8</prefix>
+ <designation>APNIC</designation>
+ <date>2009-08</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>176/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2010-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>177/8</prefix>
+ <designation>LACNIC</designation>
+ <date>2010-06</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>178/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2009-01</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>179/8</prefix>
+ <designation>LACNIC</designation>
+ <date>2011-02</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>180/8</prefix>
+ <designation>APNIC</designation>
+ <date>2009-04</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>181/8</prefix>
+ <designation>LACNIC</designation>
+ <date>2010-06</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>182/8</prefix>
+ <designation>APNIC</designation>
+ <date>2009-08</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>183/8</prefix>
+ <designation>APNIC</designation>
+ <date>2009-04</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>184/8</prefix>
+ <designation>ARIN</designation>
+ <date>2008-12</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>185/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2011-02</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>186/8</prefix>
+ <designation>LACNIC</designation>
+ <date>2007-09</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>187/8</prefix>
+ <designation>LACNIC</designation>
+ <date>2007-09</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>188/8</prefix>
+ <designation>Administered by RIPE NCC</designation>
+ <date>1993-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>189/8</prefix>
+ <designation>LACNIC</designation>
+ <date>1995-06</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>190/8</prefix>
+ <designation>LACNIC</designation>
+ <date>1995-06</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>191/8</prefix>
+ <designation>Administered by LACNIC</designation>
+ <date>1993-05</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>192/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ <xref type="note" data="10"/>
+ <xref type="note" data="11"/>
+ </record>
+ <record>
+ <prefix>193/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>1993-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>194/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>1993-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>195/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>1993-05</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>196/8</prefix>
+ <designation>Administered by AFRINIC</designation>
+ <date>1993-05</date>
+ <whois>whois.afrinic.net</whois>
+ <rdap>
+ <server>https://rdap.afrinic.net/rdap/</server>
+ <server>http://rdap.afrinic.net/rdap/</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>197/8</prefix>
+ <designation>AFRINIC</designation>
+ <date>2008-10</date>
+ <whois>whois.afrinic.net</whois>
+ <rdap>
+ <server>https://rdap.afrinic.net/rdap/</server>
+ <server>http://rdap.afrinic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>198/8</prefix>
+ <designation>Administered by ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ <xref type="note" data="12"/>
+ </record>
+ <record>
+ <prefix>199/8</prefix>
+ <designation>ARIN</designation>
+ <date>1993-05</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>200/8</prefix>
+ <designation>LACNIC</designation>
+ <date>2002-11</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>201/8</prefix>
+ <designation>LACNIC</designation>
+ <date>2003-04</date>
+ <whois>whois.lacnic.net</whois>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>202/8</prefix>
+ <designation>APNIC</designation>
+ <date>1993-05</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>203/8</prefix>
+ <designation>APNIC</designation>
+ <date>1993-05</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ <xref type="note" data="13"/>
+ </record>
+ <record>
+ <prefix>204/8</prefix>
+ <designation>ARIN</designation>
+ <date>1994-03</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>205/8</prefix>
+ <designation>ARIN</designation>
+ <date>1994-03</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>206/8</prefix>
+ <designation>ARIN</designation>
+ <date>1995-04</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>207/8</prefix>
+ <designation>ARIN</designation>
+ <date>1995-11</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>208/8</prefix>
+ <designation>ARIN</designation>
+ <date>1996-04</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>209/8</prefix>
+ <designation>ARIN</designation>
+ <date>1996-06</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>210/8</prefix>
+ <designation>APNIC</designation>
+ <date>1996-06</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>211/8</prefix>
+ <designation>APNIC</designation>
+ <date>1996-06</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>212/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>1997-10</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>213/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>1993-10</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>214/8</prefix>
+ <designation>US-DOD</designation>
+ <date>1998-03</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>215/8</prefix>
+ <designation>US-DOD</designation>
+ <date>1998-03</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>LEGACY</status>
+ </record>
+ <record>
+ <prefix>216/8</prefix>
+ <designation>ARIN</designation>
+ <date>1998-04</date>
+ <whois>whois.arin.net</whois>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>217/8</prefix>
+ <designation>RIPE NCC</designation>
+ <date>2000-06</date>
+ <whois>whois.ripe.net</whois>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>218/8</prefix>
+ <designation>APNIC</designation>
+ <date>2000-12</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>219/8</prefix>
+ <designation>APNIC</designation>
+ <date>2001-09</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>220/8</prefix>
+ <designation>APNIC</designation>
+ <date>2001-12</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>221/8</prefix>
+ <designation>APNIC</designation>
+ <date>2002-07</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>222/8</prefix>
+ <designation>APNIC</designation>
+ <date>2003-02</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>223/8</prefix>
+ <designation>APNIC</designation>
+ <date>2010-04</date>
+ <whois>whois.apnic.net</whois>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <status>ALLOCATED</status>
+ </record>
+ <record>
+ <prefix>224/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>225/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>226/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>227/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>228/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>229/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>230/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>231/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>232/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>233/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>234/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ <xref type="note" data="15"/>
+ </record>
+ <record>
+ <prefix>235/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>236/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>237/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>238/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ </record>
+ <record>
+ <prefix>239/8</prefix>
+ <designation>Multicast</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="14"/>
+ <xref type="note" data="16"/>
+ </record>
+ <record>
+ <prefix>240/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>241/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>242/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>243/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>244/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>245/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>246/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>247/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>248/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>249/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>250/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>251/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>252/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>253/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>254/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ </record>
+ <record>
+ <prefix>255/8</prefix>
+ <designation>Future use</designation>
+ <date>1981-09</date>
+ <status>RESERVED</status>
+ <xref type="note" data="17"/>
+ <xref type="note" data="18"/>
+ </record>
+ <footnote anchor="1">Indicates the status of address blocks as follows:
+RESERVED: designated by the IETF for specific non-global-unicast purposes as noted.
+LEGACY: allocated by the central Internet Registry (IR) prior to the Regional Internet Registries
+(RIRs). This address space is now administered by individual RIRs as noted, including maintenance
+of WHOIS Directory and reverse DNS records. Assignments from these blocks are distributed globally
+on a regional basis.
+ALLOCATED: delegated entirely to specific RIR as indicated.
+UNALLOCATED: not yet allocated or reserved.</footnote>
+ <footnote anchor="2">0.0.0.0/8 reserved for self-identification <xref type="rfc" data="rfc791"/>, section 3.2.
+Reserved by protocol. For authoritative registration, see <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="3">0.0.0.0/32 reserved for self-identification <xref type="rfc" data="rfc1122"/>, section 3.2.1.3.
+Reserved by protocol. For authoritative registration, see <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="4">Reserved for Private-Use Networks <xref type="rfc" data="rfc1918"/>.
+Complete registration details for 10.0.0.0/8 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="5">This was reserved for Public Data Networks <xref type="rfc" data="rfc1356"/>. See <xref type="registry" data="public-data-network-numbers"/>.
+It was recovered in February 2008 and was subsequently allocated to APNIC in April 2010.</footnote>
+ <footnote anchor="6">100.64.0.0/10 reserved for Shared Address Space <xref type="rfc" data="rfc6598"/>.
+Complete registration details for 100.64.0.0/10 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="7">127.0.0.0/8 reserved for Loopback <xref type="rfc" data="rfc1122"/>, section 3.2.1.3.
+Reserved by protocol. For authoritative registration, see <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="8">169.254.0.0/16 reserved for Link Local <xref type="rfc" data="rfc3927"/>.
+Reserved by protocol. For authoritative registration, see <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="9">172.16.0.0/12 reserved for Private-Use Networks <xref type="rfc" data="rfc1918"/>.
+Complete registration details are found in <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="10">192.0.2.0/24 reserved for TEST-NET-1 <xref type="rfc" data="rfc5737"/>.
+Complete registration details for 192.0.2.0/24 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.
+192.88.99.0/24 reserved for 6to4 Relay Anycast <xref type="rfc" data="rfc7526"/>
+Complete registration details for 192.88.99.0/24 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.
+192.88.99.2/32 reserved for 6a44 Relay Anycast <xref type="rfc" data="rfc6751"/> (possibly collocated with 6to4 Relay
+at 192.88.99.1/32 - see <xref type="rfc" data="rfc7526"/>)
+192.168.0.0/16 reserved for Private-Use Networks <xref type="rfc" data="rfc1918"/>.
+Complete registration details for 192.168.0.0/16 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="11">192.0.0.0/24 reserved for IANA IPv4 Special Purpose Address Registry <xref type="rfc" data="rfc5736"/>.
+Complete registration details for 192.0.0.0/24 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="12">198.18.0.0/15 reserved for Network Interconnect Device Benchmark Testing <xref type="rfc" data="rfc2544"/>.
+Complete registration details for 198.18.0.0/15 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.
+198.51.100.0/24 reserved for TEST-NET-2 <xref type="rfc" data="rfc5737"/>.
+Complete registration details for 198.51.100.0/24 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="13">203.0.113.0/24 reserved for TEST-NET-3 <xref type="rfc" data="rfc5737"/>.
+Complete registration details for 203.0.113.0/24 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="14">Multicast (formerly "Class D") <xref type="rfc" data="rfc5771"/> registered in <xref type="registry" data="multicast-addresses"/></footnote>
+ <footnote anchor="15">Unicast-Prefix-Based IPv4 Multicast Addresses <xref type="rfc" data="rfc6034"/></footnote>
+ <footnote anchor="16">Administratively Scoped IP Multicast <xref type="rfc" data="rfc2365"/></footnote>
+ <footnote anchor="17">Reserved for future use (formerly "Class E") <xref type="rfc" data="rfc1112"/>.
+Reserved by protocol. For authoritative registration, see <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <footnote anchor="18">255.255.255.255 is reserved for "limited broadcast" destination address <xref type="rfc" data="rfc919"/> and <xref type="rfc" data="rfc922"/>.
+Complete registration details for 255.255.255.255/32 are found in <xref type="registry" data="iana-ipv4-special-registry"/>.</footnote>
+ <people/>
+</registry>
diff --git a/netaddr/ip/ipv6-address-space.xml b/netaddr/ip/ipv6-address-space.xml
new file mode 100644
index 0000000..3a0fb42
--- /dev/null
+++ b/netaddr/ip/ipv6-address-space.xml
@@ -0,0 +1,198 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?xml-stylesheet type="text/xsl" href="ipv6-address-space.xsl"?>
+<?xml-model href="ipv6-address-space.rng" schematypens="http://relaxng.org/ns/structure/1.0" ?>
+<registry xmlns="http://www.iana.org/assignments" id="ipv6-address-space">
+ <title>Internet Protocol Version 6 Address Space</title>
+ <updated>2019-09-13</updated>
+ <note>The IPv6 address management function was formally delegated to IANA
+in December 1995 <xref type="rfc" data="rfc1881"/>. The registration procedure was confirmed
+with the IETF Chair in March 2010.
+
+As stated in <xref type="rfc" data="rfc3513"/>, IANA should limit its allocation of
+IPv6-unicast address space to the range of addresses that start with
+binary value 001. The rest of the global unicast address space
+(approximately 85% of the IPv6 address space) is reserved for future
+definition and use, and is not to be assigned by IANA at this time.
+
+While <xref type="rfc" data="rfc3513"/> was obsoleted by <xref type="rfc" data="rfc4291"/>, the guidance provided to
+IANA did not change regarding the allocation of IPv6 unicast
+addresses.
+
+ </note>
+<registry id="ipv6-address-space-1">
+ <registration_rule>IESG Approval</registration_rule>
+ <record>
+ <prefix>0000::/8</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes>
+ <xref type="note" data="1"/>
+ <xref type="note" data="2"/>
+ <xref type="note" data="3"/>
+ <xref type="note" data="4"/>
+ <xref type="note" data="5"/>
+ <xref type="note" data="6"/>
+ </notes>
+ </record>
+ <record>
+ <prefix>0100::/8</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes>0100::/64 reserved for Discard-Only Address Block <xref type="rfc" data="rfc6666"/>.
+Complete registration details are found in <xref type="registry" data="iana-ipv6-special-registry"/>.</notes>
+ </record>
+ <record>
+ <prefix>0200::/7</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc4048"/>
+ <notes>Deprecated as of December 2004 <xref type="rfc" data="rfc4048"/>.
+Formerly an OSI NSAP-mapped prefix set <xref type="rfc" data="rfc4548"/>.</notes>
+ </record>
+ <record>
+ <prefix>0400::/6</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>0800::/5</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>1000::/4</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>2000::/3</prefix>
+ <description>Global Unicast</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes>The IPv6 Unicast space encompasses the entire IPv6 address range
+with the exception of ff00::/8, per <xref type="rfc" data="rfc4291"/>. IANA unicast address
+assignments are currently limited to the IPv6 unicast address
+range of 2000::/3. IANA assignments from this block are registered
+in <xref type="registry" data="ipv6-unicast-address-assignments"/>.
+ <xref type="note" data="7"/>
+ <xref type="note" data="8"/>
+ <xref type="note" data="9"/>
+ <xref type="note" data="10"/>
+ <xref type="note" data="11"/>
+ <xref type="note" data="12"/>
+ <xref type="note" data="13"/>
+ <xref type="note" data="14"/>
+ <xref type="note" data="15"/>
+ </notes>
+ </record>
+ <record>
+ <prefix>4000::/3</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>6000::/3</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>8000::/3</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>a000::/3</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>c000::/3</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>e000::/4</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>f000::/5</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>f800::/6</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>fc00::/7</prefix>
+ <description>Unique Local Unicast</description>
+ <xref type="rfc" data="rfc4193"/>
+ <notes>For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</notes>
+ </record>
+ <record>
+ <prefix>fe00::/9</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes/>
+ </record>
+ <record>
+ <prefix>fe80::/10</prefix>
+ <description>Link-Scoped Unicast</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes>Reserved by protocol. For authoritative registration, see <xref type="registry" data="iana-ipv6-special-registry"/>.</notes>
+ </record>
+ <record>
+ <prefix>fec0::/10</prefix>
+ <description>Reserved by IETF</description>
+ <xref type="rfc" data="rfc3879"/>
+ <notes>Deprecated by <xref type="rfc" data="rfc3879"/> in September 2004. Formerly a Site-Local scoped address prefix.</notes>
+ </record>
+ <record>
+ <prefix>ff00::/8</prefix>
+ <description>Multicast</description>
+ <xref type="rfc" data="rfc3513"/><xref type="rfc" data="rfc4291"/>
+ <notes>IANA assignments from this block are registered in <xref type="registry" data="ipv6-multicast-addresses"/>.</notes>
+ </record>
+ <footnote anchor="1">::1/128 reserved for Loopback Address <xref type="rfc" data="rfc4291"/>.
+Reserved by protocol. For authoritative registration, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="2">::/128 reserved for Unspecified Address <xref type="rfc" data="rfc4291"/>.
+Reserved by protocol. For authoritative registration, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="3">::ffff:0:0/96 reserved for IPv4-mapped Address <xref type="rfc" data="rfc4291"/>.
+Reserved by protocol. For authoritative registration, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="4">0::/96 deprecated by <xref type="rfc" data="rfc4291"/>. Formerly defined as the "IPv4-compatible IPv6 address" prefix.</footnote>
+ <footnote anchor="5">The "Well Known Prefix" 64:ff9b::/96 is used in an algorithmic mapping between IPv4 to IPv6 addresses <xref type="rfc" data="rfc6052"/>.</footnote>
+ <footnote anchor="6">64:ff9b:1::/48 reserved for Local-Use IPv4/IPv6 Translation <xref type="rfc" data="rfc8215"/>.</footnote>
+ <footnote anchor="7">2001:0::/23 reserved for IETF Protocol Assignments <xref type="rfc" data="rfc2928"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="8">2001:0::/32 reserved for TEREDO <xref type="rfc" data="rfc4380"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="9">2001:2::/48 reserved for Benchmarking <xref type="rfc" data="rfc5180"/><xref type="rfc-errata" data="1752"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="10">2001:3::/32 reserved for AMT <xref type="rfc" data="rfc7450"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="11">2001:4:112::/48 reserved for AS112-v6 <xref type="rfc" data="rfc7535"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="12">2001:10::/28 deprecated (formerly ORCHID) <xref type="rfc" data="rfc4843"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="13">2001:20::/28 reserved for ORCHIDv2 <xref type="rfc" data="rfc7343"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="14">2001:db8::/32 reserved for Documentation <xref type="rfc" data="rfc3849"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+ <footnote anchor="15">2002::/16 reserved for 6to4 <xref type="rfc" data="rfc3056"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</footnote>
+
+
+ <people/>
+</registry>
+ </registry>
diff --git a/netaddr/ip/ipv6-unicast-address-assignments.xml b/netaddr/ip/ipv6-unicast-address-assignments.xml
new file mode 100644
index 0000000..ee5a69f
--- /dev/null
+++ b/netaddr/ip/ipv6-unicast-address-assignments.xml
@@ -0,0 +1,435 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?xml-stylesheet type="text/xsl" href="ipv6-unicast-address-assignments.xsl"?>
+<?xml-model href="ipv6-unicast-address-assignments.rng" schematypens="http://relaxng.org/ns/structure/1.0" ?>
+<registry xmlns="http://www.iana.org/assignments" id="ipv6-unicast-address-assignments">
+ <title>IPv6 Global Unicast Address Assignments</title>
+ <category>Internet Protocol version 6 (IPv6) Global Unicast Allocations</category>
+ <updated>2019-11-06</updated>
+ <xref type="rfc" data="rfc7249"/>
+ <registration_rule>Allocations to RIRs are made in line with the Global Policy published at
+<xref type="uri" data="http://www.icann.org/en/resources/policy/global-addressing"/>.
+All other assignments require IETF Review.</registration_rule>
+ <description>The allocation of Internet Protocol version 6 (IPv6) unicast address space is listed
+here. References to the various other registries detailing the use of the IPv6 address
+space can be found in the <xref type="registry" data="ipv6-address-space">IPv6 Address Space registry</xref>.</description>
+ <note>The assignable Global Unicast Address space is defined in <xref type="rfc" data="rfc3513"/> as the address block
+defined by the prefix 2000::/3. <xref type="rfc" data="rfc3513"/> was later obsoleted by <xref type="rfc" data="rfc4291"/>. All address
+space in this block not listed in the table below is reserved by IANA for future
+allocation.
+ </note>
+ <record date="1999-07-01">
+ <prefix>2001:0000::/23</prefix>
+ <description>IANA</description>
+ <whois>whois.iana.org</whois>
+ <status>ALLOCATED</status>
+ <notes>2001:0000::/23 is reserved for IETF Protocol Assignments <xref type="rfc" data="rfc2928"/>.
+2001:0000::/32 is reserved for TEREDO <xref type="rfc" data="rfc4380"/>.
+2001:1::1/128 is reserved for Port Control Protocol Anycast <xref type="rfc" data="rfc7723"/>.
+2001:2::/48 is reserved for Benchmarking <xref type="rfc" data="rfc5180"/><xref type="rfc-errata" data="1752"/>.
+2001:3::/32 is reserved for AMT <xref type="rfc" data="rfc7450"/>.
+2001:4:112::/48 is reserved for AS112-v6 <xref type="rfc" data="rfc7535"/>.
+2001:10::/28 is deprecated (previously ORCHID) <xref type="rfc" data="rfc4843"/>.
+2001:20::/28 is reserved for ORCHIDv2 <xref type="rfc" data="rfc7343"/>.
+2001:db8::/32 is reserved for Documentation <xref type="rfc" data="rfc3849"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</notes>
+ </record>
+ <record date="1999-07-01">
+ <prefix>2001:0200::/23</prefix>
+ <description>APNIC</description>
+ <whois>whois.apnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="1999-07-01">
+ <prefix>2001:0400::/23</prefix>
+ <description>ARIN</description>
+ <whois>whois.arin.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="1999-07-01">
+ <prefix>2001:0600::/23</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+
+ <record date="2002-11-02">
+ <prefix>2001:0800::/22</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes>2001:0800::/23 was allocated on 2002-05-02. The more recent
+ allocation (2002-11-02) incorporates the previous allocation.</notes>
+ </record>
+ <record date="2002-05-02">
+ <prefix>2001:0c00::/23</prefix>
+ <description>APNIC</description>
+ <whois>whois.apnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <notes>2001:db8::/32 reserved for Documentation <xref type="rfc" data="rfc3849"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</notes>
+ </record>
+ <record date="2003-01-01">
+ <prefix>2001:0e00::/23</prefix>
+ <description>APNIC</description>
+ <whois>whois.apnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2002-11-01">
+ <prefix>2001:1200::/23</prefix>
+ <description>LACNIC</description>
+ <whois>whois.lacnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <notes/>
+ </record>
+
+ <record date="2003-07-01">
+ <prefix>2001:1400::/22</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes>2001:1400::/23 was allocated on 2003-02-01. The more recent
+ allocation (2003-07-01) incorporates the previous allocation.</notes>
+ </record>
+ <record date="2003-04-01">
+ <prefix>2001:1800::/23</prefix>
+ <description>ARIN</description>
+ <whois>whois.arin.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-01-01">
+ <prefix>2001:1a00::/23</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-05-04">
+ <prefix>2001:1c00::/22</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+
+ <record date="2019-03-12">
+ <prefix>2001:2000::/19</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes>2001:2000::/20, 2001:3000::/21, and 2001:3800::/22
+ were allocated on 2004-05-04. The more recent allocation
+ (2019-03-12) incorporates all these previous allocations.</notes>
+ </record>
+ <record date="2004-06-11">
+ <prefix>2001:4000::/23</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-06-01">
+ <prefix>2001:4200::/23</prefix>
+ <description>AFRINIC</description>
+ <whois>whois.afrinic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.afrinic.net/rdap/</server>
+ <server>http://rdap.afrinic.net/rdap/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-06-11">
+ <prefix>2001:4400::/23</prefix>
+ <description>APNIC</description>
+ <whois>whois.apnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-08-17">
+ <prefix>2001:4600::/23</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-08-24">
+ <prefix>2001:4800::/23</prefix>
+ <description>ARIN</description>
+ <whois>whois.arin.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-10-15">
+ <prefix>2001:4a00::/23</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-12-17">
+ <prefix>2001:4c00::/23</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-09-10">
+ <prefix>2001:5000::/20</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-11-30">
+ <prefix>2001:8000::/19</prefix>
+ <description>APNIC</description>
+ <whois>whois.apnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2004-11-30">
+ <prefix>2001:a000::/20</prefix>
+ <description>APNIC</description>
+ <whois>whois.apnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2006-03-08">
+ <prefix>2001:b000::/20</prefix>
+ <description>APNIC</description>
+ <whois>whois.apnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2001-02-01">
+ <prefix>2002:0000::/16</prefix>
+ <description>6to4</description>
+ <whois/>
+ <status>ALLOCATED</status>
+ <notes>2002::/16 is reserved for 6to4 <xref type="rfc" data="rfc3056"/>.
+For complete registration details, see <xref type="registry" data="iana-ipv6-special-registry"/>.</notes>
+ </record>
+ <record date="2005-01-12">
+ <prefix>2003:0000::/18</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2006-10-03">
+ <prefix>2400:0000::/12</prefix>
+ <description>APNIC</description>
+ <whois>whois.apnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.apnic.net/</server>
+ </rdap>
+ <notes>2400:0000::/19 was allocated on 2005-05-20. 2400:2000::/19 was allocated on 2005-07-08. 2400:4000::/21 was
+allocated on 2005-08-08. 2404:0000::/23 was allocated on 2006-01-19. The more recent allocation (2006-10-03)
+incorporates all these previous allocations.</notes>
+ </record>
+ <record date="2006-10-03">
+ <prefix>2600:0000::/12</prefix>
+ <description>ARIN</description>
+ <whois>whois.arin.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <notes>2600:0000::/22, 2604:0000::/22, 2608:0000::/22 and 260c:0000::/22 were allocated on 2005-04-19. The more
+recent allocation (2006-10-03) incorporates all these previous allocations.</notes>
+ </record>
+ <record date="2005-11-17">
+ <prefix>2610:0000::/23</prefix>
+ <description>ARIN</description>
+ <whois>whois.arin.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2006-09-12">
+ <prefix>2620:0000::/23</prefix>
+ <description>ARIN</description>
+ <whois>whois.arin.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2019-11-06">
+ <prefix>2630:0000::/12</prefix>
+ <description>ARIN</description>
+ <whois>whois.arin.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.arin.net/registry</server>
+ <server>http://rdap.arin.net/registry</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2006-10-03">
+ <prefix>2800:0000::/12</prefix>
+ <description>LACNIC</description>
+ <whois>whois.lacnic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.lacnic.net/rdap/</server>
+ </rdap>
+ <notes>2800:0000::/23 was allocated on 2005-11-17. The more recent allocation (2006-10-03) incorporates the
+previous allocation.</notes>
+ </record>
+ <record date="2006-10-03">
+ <prefix>2a00:0000::/12</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes>2a00:0000::/21 was originally allocated on 2005-04-19. 2a01:0000::/23 was allocated on 2005-07-14.
+2a01:0000::/16 (incorporating the 2a01:0000::/23) was allocated on 2005-12-15. The more recent allocation
+(2006-10-03) incorporates these previous allocations.</notes>
+ </record>
+ <record date="2019-06-05">
+ <prefix>2a10:0000::/12</prefix>
+ <description>RIPE NCC</description>
+ <whois>whois.ripe.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.db.ripe.net/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="2006-10-03">
+ <prefix>2c00:0000::/12</prefix>
+ <description>AFRINIC</description>
+ <whois>whois.afrinic.net</whois>
+ <status>ALLOCATED</status>
+ <rdap>
+ <server>https://rdap.afrinic.net/rdap/</server>
+ <server>http://rdap.afrinic.net/rdap/</server>
+ </rdap>
+ <notes/>
+ </record>
+ <record date="1999-07-01">
+ <prefix>2d00:0000::/8</prefix>
+ <description>IANA</description>
+ <whois/>
+ <status>RESERVED</status>
+ <notes/>
+ </record>
+ <record date="1999-07-01">
+ <prefix>2e00:0000::/7</prefix>
+ <description>IANA</description>
+ <whois/>
+ <status>RESERVED</status>
+ <notes/>
+ </record>
+ <record date="1999-07-01">
+ <prefix>3000:0000::/4</prefix>
+ <description>IANA</description>
+ <whois/>
+ <status>RESERVED</status>
+ <notes/>
+ </record>
+ <record date="2008-04">
+ <prefix>3ffe::/16</prefix>
+ <description>IANA</description>
+ <whois/>
+ <status>RESERVED</status>
+ <notes>3ffe:831f::/32 was used for Teredo in some old but widely distributed networking stacks. This usage is
+deprecated in favor of 2001::/32, which was allocated for the purpose in <xref type="rfc" data="rfc4380"/>.
+3ffe::/16 and 5f00::/8 were used for the 6bone but were returned. <xref type="rfc" data="rfc5156"/></notes>
+ </record>
+ <record date="2008-04">
+ <prefix>5f00::/8</prefix>
+ <description>IANA</description>
+ <whois/>
+ <status>RESERVED</status>
+ <notes>3ffe::/16 and 5f00::/8 were used for the 6bone but were returned. <xref type="rfc" data="rfc5156"/></notes>
+ </record>
+ <people/>
+</registry>
diff --git a/netaddr/ip/multicast-addresses.xml b/netaddr/ip/multicast-addresses.xml
new file mode 100644
index 0000000..0a09b62
--- /dev/null
+++ b/netaddr/ip/multicast-addresses.xml
@@ -0,0 +1,4914 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<?xml-stylesheet type="text/xsl" href="multicast-addresses.xsl"?>
+<?xml-model href="multicast-addresses.rng" schematypens="http://relaxng.org/ns/structure/1.0" ?>
+<registry xmlns="http://www.iana.org/assignments" id="multicast-addresses">
+ <title>IPv4 Multicast Address Space Registry</title>
+ <updated>2023-10-16</updated>
+ <expert>Stig Venaas</expert>
+ <note>Host Extensions for IP Multicasting <xref type="rfc" data="rfc1112"/> specifies the extensions
+required of a host implementation of the Internet Protocol (IP) to
+support multicasting. The multicast addresses are in the range
+224.0.0.0 through 239.255.255.255. Address assignments are listed below.
+
+The range of addresses between 224.0.0.0 and 224.0.0.255, inclusive,
+is reserved for the use of routing protocols and other low-level
+topology discovery or maintenance protocols, such as gateway discovery
+and group membership reporting. Multicast routers should not forward
+any multicast datagram with destination addresses in this range,
+regardless of its TTL.
+ </note>
+
+
+ <registry id="multicast-addresses-1">
+ <title>Local Network Control Block (224.0.0.0 - 224.0.0.255 (224.0.0/24))</title>
+ <xref type="rfc" data="rfc5771"/>
+ <registration_rule>Expert Review, IESG Approval, or Standards Action</registration_rule>
+ <note>(*) It is only appropriate to use these values in explicitly-
+configured experiments; they MUST NOT be shipped as defaults in
+implementations. See <xref type="rfc" data="rfc3692"/> for details.
+ </note>
+ <note title="Request an Assignment">
+<xref type="uri" data="https://www.iana.org/protocols/apply"/>
+
+ </note>
+ <record>
+ <addr>224.0.0.0</addr>
+ <description>Base Address (Reserved)</description>
+ <xref type="rfc" data="rfc1112"/>
+ <xref type="person" data="Jon_Postel"/>
+ </record>
+ <record>
+ <addr>224.0.0.1</addr>
+ <description>All Systems on this Subnet</description>
+ <xref type="rfc" data="rfc1112"/>
+ <xref type="person" data="Jon_Postel"/>
+ </record>
+ <record>
+ <addr>224.0.0.2</addr>
+ <description>All Routers on this Subnet</description>
+ <xref type="person" data="Jon_Postel"/>
+ </record>
+ <record>
+ <addr>224.0.0.3</addr>
+ <description>Unassigned</description>
+ </record>
+ <record>
+ <addr>224.0.0.4</addr>
+ <description>DVMRP Routers</description>
+ <xref type="rfc" data="rfc1075"/>
+ <xref type="person" data="Jon_Postel"/>
+ </record>
+ <record>
+ <addr>224.0.0.5</addr>
+ <description>OSPFIGP OSPFIGP All Routers</description>
+ <xref type="rfc" data="rfc2328"/>
+ <xref type="person" data="OSPF_WG_Chairs"/>
+ </record>
+ <record>
+ <addr>224.0.0.6</addr>
+ <description>OSPFIGP OSPFIGP Designated Routers</description>
+ <xref type="rfc" data="rfc2328"/>
+ <xref type="person" data="OSPF_WG_Chairs"/>
+ </record>
+ <record>
+ <addr>224.0.0.7</addr>
+ <description>ST Routers</description>
+ <xref type="rfc" data="rfc1190"/>
+ <xref type="person" data="Karen_Seo"/>
+ </record>
+ <record>
+ <addr>224.0.0.8</addr>
+ <description>ST Hosts</description>
+ <xref type="rfc" data="rfc1190"/>
+ <xref type="person" data="Karen_Seo"/>
+ </record>
+ <record>
+ <addr>224.0.0.9</addr>
+ <description>RIP2 Routers</description>
+ <xref type="rfc" data="rfc1723"/>
+ <xref type="person" data="Gary_S_Malkin"/>
+ </record>
+ <record date="1996-03-01" updated="2016-03-21">
+ <addr>224.0.0.10</addr>
+ <description>EIGRP Routers</description>
+ <xref type="rfc" data="rfc7868"/>
+ </record>
+ <record>
+ <addr>224.0.0.11</addr>
+ <description>Mobile-Agents</description>
+ <xref type="text">[Bill Simpson]</xref>
+ </record>
+ <record>
+ <addr>224.0.0.12</addr>
+ <description>DHCP Server / Relay Agent</description>
+ <xref type="text">[Unknown]</xref>
+ </record>
+ <record date="1996-03-01">
+ <addr>224.0.0.13</addr>
+ <description>All PIM Routers</description>
+ <xref type="person" data="Dino_Farinacci"/>
+ </record>
+ <record date="1996-04-01">
+ <addr>224.0.0.14</addr>
+ <description>RSVP-ENCAPSULATION</description>
+ <xref type="person" data="Bob_Braden"/>
+ </record>
+ <record date="1997-02-01">
+ <addr>224.0.0.15</addr>
+ <description>all-cbt-routers</description>
+ <xref type="person" data="Tony_Ballardie"/>
+ <xref type="rfc" data="rfc2189"/>
+ </record>
+ <record date="1997-06-01">
+ <addr>224.0.0.16</addr>
+ <description>designated-sbm</description>
+ <xref type="person" data="Fred_Baker"/>
+ </record>
+ <record date="1997-06-01">
+ <addr>224.0.0.17</addr>
+ <description>all-sbms</description>
+ <xref type="person" data="Fred_Baker"/>
+ </record>
+ <record>
+ <addr>224.0.0.18</addr>
+ <description>VRRP</description>
+ <xref type="rfc" data="rfc3768"/>
+ <xref type="rfc" data="rfc5798"/>
+ </record>
+ <record date="1999-10-01">
+ <addr>224.0.0.19</addr>
+ <description>IPAllL1ISs</description>
+ <xref type="person" data="Tony_Przygienda"/>
+ </record>
+ <record date="1999-10-01">
+ <addr>224.0.0.20</addr>
+ <description>IPAllL2ISs</description>
+ <xref type="person" data="Tony_Przygienda"/>
+ </record>
+ <record date="1999-10-01">
+ <addr>224.0.0.21</addr>
+ <description>IPAllIntermediate Systems</description>
+ <xref type="person" data="Tony_Przygienda"/>
+ </record>
+ <record date="1999-10-01">
+ <addr>224.0.0.22</addr>
+ <description>IGMP</description>
+ <xref type="person" data="Steve_Deering"/>
+ </record>
+ <record date="2000-03-01">
+ <addr>224.0.0.23</addr>
+ <description>GLOBECAST-ID</description>
+ <xref type="person" data="Piers_Scannell"/>
+ </record>
+ <record>
+ <addr>224.0.0.24</addr>
+ <description>OSPFIGP-TE</description>
+ <xref type="rfc" data="rfc4973"/>
+ </record>
+ <record date="2000-03-01">
+ <addr>224.0.0.25</addr>
+ <description>router-to-switch</description>
+ <xref type="person" data="Ishan_Wu"/>
+ </record>
+ <record>
+ <addr>224.0.0.26</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2000-03-01">
+ <addr>224.0.0.27</addr>
+ <description>Al MPP Hello</description>
+ <xref type="person" data="Brian_Martinicky"/>
+ </record>
+ <record date="2000-03-01">
+ <addr>224.0.0.28</addr>
+ <description>ETC Control</description>
+ <xref type="person" data="Steve_Polishinski"/>
+ </record>
+ <record date="2000-05-01">
+ <addr>224.0.0.29</addr>
+ <description>GE-FANUC</description>
+ <xref type="person" data="Ian_Wacey"/>
+ </record>
+ <record date="2000-05-01">
+ <addr>224.0.0.30</addr>
+ <description>indigo-vhdp</description>
+ <xref type="person" data="Colin_Caughie"/>
+ </record>
+ <record date="2000-05-01">
+ <addr>224.0.0.31</addr>
+ <description>shinbroadband</description>
+ <xref type="person" data="Sakon_Kittivatcharapong"/>
+ </record>
+ <record date="2000-05-01">
+ <addr>224.0.0.32</addr>
+ <description>digistar</description>
+ <xref type="person" data="Brian_Kerkan"/>
+ </record>
+ <record date="2003-03-01">
+ <addr>224.0.0.33</addr>
+ <description>ff-system-management</description>
+ <xref type="person" data="Dave_Glanzer"/>
+ </record>
+ <record date="2000-06-01">
+ <addr>224.0.0.34</addr>
+ <description>pt2-discover</description>
+ <xref type="person" data="Ralph_Kammerlander"/>
+ </record>
+ <record date="2000-07-01">
+ <addr>224.0.0.35</addr>
+ <description>DXCLUSTER</description>
+ <xref type="person" data="Dirk_Koopman"/>
+ </record>
+ <record date="2001-01-01">
+ <addr>224.0.0.36</addr>
+ <description>DTCP Announcement</description>
+ <xref type="person" data="Patrick_Cipiere"/>
+ </record>
+ <record date="2001-12-01">
+ <addr>224.0.0.37-224.0.0.68</addr>
+ <description>zeroconfaddr (renew 12/02)</description>
+ <xref type="person" data="Erik_Guttman"/>
+ </record>
+ <record>
+ <addr>224.0.0.69-224.0.0.100</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2001-12-01">
+ <addr>224.0.0.101</addr>
+ <description>cisco-nhap</description>
+ <xref type="person" data="Mark_Bakke"/>
+ </record>
+ <record date="2001-12-01">
+ <addr>224.0.0.102</addr>
+ <description>HSRP</description>
+ <xref type="person" data="Ian_Wilson"/>
+ </record>
+ <record date="2002-02-01">
+ <addr>224.0.0.103</addr>
+ <description>MDAP</description>
+ <xref type="person" data="Johan_Deleu"/>
+ </record>
+ <record date="2002-10-01">
+ <addr>224.0.0.104</addr>
+ <description>Nokia MC CH</description>
+ <xref type="person" data="Morteza_Kalhour"/>
+ </record>
+ <record date="2003-03-01">
+ <addr>224.0.0.105</addr>
+ <description>ff-lr-address</description>
+ <xref type="person" data="Dave_Glanzer"/>
+ </record>
+ <record>
+ <addr>224.0.0.106</addr>
+ <description>All-Snoopers</description>
+ <xref type="rfc" data="rfc4286"/>
+ </record>
+ <record date="2007-02-02" updated="2023-08-17">
+ <addr>224.0.0.107</addr>
+ <description>PTP-pdelay</description>
+ <xref type="uri" data="https://www.nist.gov/el/intelligent-systems-division-73500/ordering-ieee-1588-standard-precision-clock-synchronization">NIST: IEEE Std 1588</xref>
+ <xref type="person" data="Kang_Lee"/>
+ </record>
+ <record date="2007-08-30">
+ <addr>224.0.0.108</addr>
+ <description>Saratoga</description>
+ <xref type="person" data="Lloyd_Wood"/>
+ <reviewed>2011-03-17</reviewed>
+ </record>
+ <record>
+ <addr>224.0.0.109</addr>
+ <description>LL-MANET-Routers</description>
+ <xref type="rfc" data="rfc5498"/>
+ <reviewed>2011-02-23</reviewed>
+ </record>
+ <record date="2009-01-20">
+ <addr>224.0.0.110</addr>
+ <description>IGRS</description>
+ <xref type="person" data="Xiaoyu_Zhou"/>
+ </record>
+ <record>
+ <addr>224.0.0.111</addr>
+ <description>Babel</description>
+ <xref type="rfc" data="rfc8966"/>
+ </record>
+ <record date="2011-11-02">
+
+ <addr>224.0.0.112</addr>
+ <description>MMA Device Discovery</description>
+ <xref type="person" data="Tom_White"/>
+ </record>
+ <record date="2011-11-18">
+ <addr>224.0.0.113</addr>
+ <description>AllJoyn</description>
+ <xref type="person" data="Craig_Dowell"/>
+ </record>
+ <record date="2012-06-12">
+ <addr>224.0.0.114</addr>
+ <description>Inter RFID Reader Protocol</description>
+ <xref type="person" data="Wayne_Wenyu_Liu"/>
+ </record>
+ <record date="2014-07-01">
+ <addr>224.0.0.115</addr>
+ <description>JSDP</description>
+ <xref type="person" data="J._Ryan_Stinnett"/>
+ </record>
+ <record date="2016-10-20">
+ <addr>224.0.0.116</addr>
+ <description>Device discovery/config</description>
+ <xref type="person" data="COMTECH_Kft."/>
+ </record>
+ <record date="2017-04-03">
+ <addr>224.0.0.117</addr>
+ <description>DLEP Discovery</description>
+ <xref type="rfc" data="rfc8175"/>
+ </record>
+ <record date="2017-05-19">
+ <addr>224.0.0.118</addr>
+ <description>MAAS</description>
+ <xref type="person" data="Mike_Pontillo"/>
+ </record>
+ <record date="2017-07-20">
+ <addr>224.0.0.119</addr>
+ <description>ALL_GRASP_NEIGHBORS</description>
+ <xref type="rfc" data="rfc8990"/>
+ </record>
+ <record date="2022-11-02">
+ <addr>224.0.0.120</addr>
+ <description>3GPP MBMS SACH</description>
+ <xref type="person" data="Charles_Lo"/>
+ <controller><xref type="person" data="_3GPP"/></controller>
+ </record>
+ <record date="2023-02-17">
+ <addr>224.0.0.121</addr>
+ <description>ALL_V4_RIFT_ROUTERS (TEMPORARY - registered 2023-02-17, expires 2024-02-17)</description>
+ <xref type="draft" data="draft-ietf-rift-rift-16"/>
+ </record>
+ <record>
+ <addr>224.0.0.122-224.0.0.149</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2019-03-13">
+ <addr>224.0.0.150</addr>
+ <description>Ramp AltitudeCDN MulticastPlus</description>
+ <xref type="person" data="Giovanni_Marzot"/>
+ <controller><xref type="person" data="Ramp_Holdings"/></controller>
+ </record>
+ <record>
+ <addr>224.0.0.151</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2023-08-09">
+ <addr>224.0.0.152</addr>
+ <description>WiseHome</description>
+ <xref type="person" data="Erick_MacDonald_Filzek"/>
+ <controller>
+ <xref type="person" data="IOT_COMPANY_SOLUCOES_TECNOLOGICAS_LTDA"/>
+ </controller>
+ </record>
+ <record>
+ <addr>224.0.0.153-224.0.0.250</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2000-04-01">
+ <addr>224.0.0.251</addr>
+ <description>mDNS</description>
+ <xref type="rfc" data="rfc6762"/>
+ </record>
+ <record>
+ <addr>224.0.0.252</addr>
+ <description>Link-local Multicast Name Resolution</description>
+ <xref type="rfc" data="rfc4795"/>
+ <reviewed>2011-03-17</reviewed>
+ </record>
+ <record>
+ <addr>224.0.0.253</addr>
+ <description>Teredo</description>
+ <xref type="rfc" data="rfc4380"/>
+ <reviewed>2010-02-14</reviewed>
+ </record>
+ <record>
+ <addr>224.0.0.254</addr>
+ <description>RFC3692-style Experiment (*)</description>
+ <xref type="rfc" data="rfc4727"/>
+ </record>
+ <record>
+ <addr>224.0.0.255</addr>
+ <description>Unassigned</description>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-2">
+ <title>Internetwork Control Block (224.0.1.0 - 224.0.1.255 (224.0.1/24))</title>
+ <xref type="rfc" data="rfc5771"/>
+ <registration_rule>Expert Review, IESG Approval, or Standards Action</registration_rule>
+ <note title="Request an Assignment">
+<xref type="uri" data="https://www.iana.org/protocols/apply"/>
+
+ </note>
+ <record>
+ <addr>224.0.1.0</addr>
+ <description>VMTP Managers Group</description>
+ <xref type="rfc" data="rfc1045"/>
+ <xref type="person" data="Dave_Cheriton"/>
+ </record>
+ <record>
+ <addr>224.0.1.1</addr>
+ <description>NTP Network Time Protocol</description>
+ <xref type="rfc" data="rfc1119"/>
+ <xref type="rfc" data="rfc5905"/>
+ <xref type="person" data="David_Mills"/>
+ </record>
+ <record>
+ <addr>224.0.1.2</addr>
+ <description>SGI-Dogfight</description>
+ <xref type="person" data="Andrew_Cherenson"/>
+ </record>
+ <record>
+ <addr>224.0.1.3</addr>
+ <description>Rwhod</description>
+ <xref type="person" data="Steve_Deering_2"/>
+ </record>
+ <record>
+ <addr>224.0.1.4</addr>
+ <description>VNP</description>
+ <xref type="person" data="Dave_Cheriton"/>
+ </record>
+ <record>
+ <addr>224.0.1.5</addr>
+ <description>Artificial Horizons - Aviator</description>
+ <xref type="person" data="Bruce_Factor"/>
+ </record>
+ <record>
+ <addr>224.0.1.6</addr>
+ <description>NSS - Name Service Server</description>
+ <xref type="person" data="Bill_Schilit"/>
+ </record>
+ <record>
+ <addr>224.0.1.7</addr>
+ <description>AUDIONEWS - Audio News Multicast</description>
+ <xref type="person" data="Martin_Forssen"/>
+ </record>
+ <record>
+ <addr>224.0.1.8</addr>
+ <description>SUN NIS+ Information Service</description>
+ <xref type="person" data="Chuck_McManis"/>
+ </record>
+ <record>
+ <addr>224.0.1.9</addr>
+ <description>MTP Multicast Transport Protocol</description>
+ <xref type="person" data="Susie_Armstrong"/>
+ </record>
+ <record>
+ <addr>224.0.1.10</addr>
+ <description>IETF-1-LOW-AUDIO</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ <record>
+ <addr>224.0.1.11</addr>
+ <description>IETF-1-AUDIO</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ <record>
+ <addr>224.0.1.12</addr>
+ <description>IETF-1-VIDEO</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ <record>
+ <addr>224.0.1.13</addr>
+ <description>IETF-2-LOW-AUDIO</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ <record>
+ <addr>224.0.1.14</addr>
+ <description>IETF-2-AUDIO</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ <record>
+ <addr>224.0.1.15</addr>
+ <description>IETF-2-VIDEO</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ <record>
+ <addr>224.0.1.16</addr>
+ <description>MUSIC-SERVICE</description>
+ </record>
+ <record>
+ <addr>224.0.1.17</addr>
+ <description>SEANET-TELEMETRY</description>
+ </record>
+ <record>
+ <addr>224.0.1.18</addr>
+ <description>SEANET-IMAGE</description>
+ </record>
+ <record date="1996-04-01">
+ <addr>224.0.1.19</addr>
+ <description>MLOADD</description>
+ <xref type="person" data="Bob_Braden"/>
+ </record>
+ <record>
+ <addr>224.0.1.20</addr>
+ <description>any private experiment</description>
+ <xref type="person" data="Jon_Postel"/>
+ </record>
+ <record>
+ <addr>224.0.1.21</addr>
+ <description>DVMRP on MOSPF</description>
+ <xref type="text">[John Moy]</xref>
+ </record>
+ <record date="1995-05-01">
+ <addr>224.0.1.22</addr>
+ <description>SVRLOC</description>
+ <xref type="person" data="John_Veizades"/>
+ </record>
+ <record>
+ <addr>224.0.1.23</addr>
+ <description>XINGTV</description>
+ <xref type="person" data="Howard_Gordon"/>
+ </record>
+ <record>
+ <addr>224.0.1.24</addr>
+ <description>microsoft-ds</description>
+ <xref type="text">&lt;arnoldm&amp;microsoft.com&gt;</xref>
+ </record>
+ <record>
+ <addr>224.0.1.25</addr>
+ <description>nbc-pro</description>
+ <xref type="text">&lt;bloomer&amp;birch.crd.ge.com&gt;</xref>
+ </record>
+ <record>
+ <addr>224.0.1.26</addr>
+ <description>nbc-pfn</description>
+ <xref type="text">&lt;bloomer&amp;birch.crd.ge.com&gt;</xref>
+ </record>
+ <record date="1994-11-01">
+ <addr>224.0.1.27</addr>
+ <description>lmsc-calren-1</description>
+ <xref type="person" data="Yea_Uang"/>
+ </record>
+ <record date="1994-11-01">
+ <addr>224.0.1.28</addr>
+ <description>lmsc-calren-2</description>
+ <xref type="person" data="Yea_Uang"/>
+ </record>
+ <record date="1994-11-01">
+ <addr>224.0.1.29</addr>
+ <description>lmsc-calren-3</description>
+ <xref type="person" data="Yea_Uang"/>
+ </record>
+ <record date="1994-11-01">
+ <addr>224.0.1.30</addr>
+ <description>lmsc-calren-4</description>
+ <xref type="person" data="Yea_Uang"/>
+ </record>
+ <record date="1995-01-01">
+ <addr>224.0.1.31</addr>
+ <description>ampr-info</description>
+ <xref type="person" data="Rob_Janssen"/>
+ </record>
+ <record date="1995-01-01">
+ <addr>224.0.1.32</addr>
+ <description>mtrace</description>
+ <xref type="person" data="Steve_Casner_2"/>
+ </record>
+ <record date="1996-04-01">
+ <addr>224.0.1.33</addr>
+ <description>RSVP-encap-1</description>
+ <xref type="person" data="Bob_Braden"/>
+ </record>
+ <record date="1996-04-01">
+ <addr>224.0.1.34</addr>
+ <description>RSVP-encap-2</description>
+ <xref type="person" data="Bob_Braden"/>
+ </record>
+ <record date="1995-05-01">
+ <addr>224.0.1.35</addr>
+ <description>SVRLOC-DA</description>
+ <xref type="person" data="John_Veizades"/>
+ </record>
+ <record date="1995-08-01">
+ <addr>224.0.1.36</addr>
+ <description>rln-server</description>
+ <xref type="person" data="Brian_Kean"/>
+ </record>
+ <record date="1995-10-01">
+ <addr>224.0.1.37</addr>
+ <description>proshare-mc</description>
+ <xref type="person" data="Mark_Lewis"/>
+ </record>
+ <record>
+ <addr>224.0.1.38</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="1996-03-01">
+ <addr>224.0.1.39</addr>
+ <description>cisco-rp-announce</description>
+ <xref type="person" data="Dino_Farinacci"/>
+ </record>
+ <record date="1996-03-01">
+ <addr>224.0.1.40</addr>
+ <description>cisco-rp-discovery</description>
+ <xref type="person" data="Dino_Farinacci"/>
+ </record>
+ <record date="1996-05-01">
+ <addr>224.0.1.41</addr>
+ <description>gatekeeper</description>
+ <xref type="person" data="Jim_Toga"/>
+ </record>
+ <record date="1996-07-01">
+ <addr>224.0.1.42</addr>
+ <description>iberiagames</description>
+ <xref type="person" data="Jose_Luis_Marocho"/>
+ </record>
+ <record date="1996-11-01">
+ <addr>224.0.1.43</addr>
+ <description>nwn-discovery</description>
+ <xref type="person" data="Arnoud_Zwemmer"/>
+ </record>
+ <record date="1996-11-01">
+ <addr>224.0.1.44</addr>
+ <description>nwn-adaptor</description>
+ <xref type="person" data="Arnoud_Zwemmer"/>
+ </record>
+ <record date="1997-01-01">
+ <addr>224.0.1.45</addr>
+ <description>isma-1</description>
+ <xref type="person" data="Stephen_Dunne"/>
+ </record>
+ <record date="1997-01-01">
+ <addr>224.0.1.46</addr>
+ <description>isma-2</description>
+ <xref type="person" data="Stephen_Dunne"/>
+ </record>
+ <record date="1997-01-01">
+ <addr>224.0.1.47</addr>
+ <description>telerate</description>
+ <xref type="person" data="Wenjie_Peng"/>
+ </record>
+ <record date="1997-01-01">
+ <addr>224.0.1.48</addr>
+ <description>ciena</description>
+ <xref type="person" data="Mike_Rodbell"/>
+ </record>
+ <record>
+ <addr>224.0.1.49</addr>
+ <description>dcap-servers</description>
+ <xref type="rfc" data="rfc2114"/>
+ </record>
+ <record>
+ <addr>224.0.1.50</addr>
+ <description>dcap-clients</description>
+ <xref type="rfc" data="rfc2114"/>
+ </record>
+ <record date="1997-01-01">
+ <addr>224.0.1.51</addr>
+ <description>mcntp-directory</description>
+ <xref type="person" data="Heiko_Rupp"/>
+ </record>
+ <record date="1997-01-01">
+ <addr>224.0.1.52</addr>
+ <description>mbone-vcr-directory</description>
+ <xref type="person" data="Wieland_Holdfelder"/>
+ </record>
+ <record date="1997-03-01">
+ <addr>224.0.1.53</addr>
+ <description>heartbeat</description>
+ <xref type="person" data="Louis_Mamakos"/>
+ </record>
+ <record date="1997-04-01">
+ <addr>224.0.1.54</addr>
+ <description>sun-mc-grp</description>
+ <xref type="person" data="Michael_DeMoney"/>
+ </record>
+ <record date="1997-04-01">
+ <addr>224.0.1.55</addr>
+ <description>extended-sys</description>
+ <xref type="person" data="David_Poole"/>
+ </record>
+ <record date="1997-06-01">
+ <addr>224.0.1.56</addr>
+ <description>pdrncs</description>
+ <xref type="person" data="Paul_Wissenbach"/>
+ </record>
+ <record date="1997-06-01">
+ <addr>224.0.1.57</addr>
+ <description>tns-adv-multi</description>
+ <xref type="person" data="Jerome_Albin"/>
+ </record>
+ <record date="1997-08-01">
+ <addr>224.0.1.58</addr>
+ <description>vcals-dmu</description>
+ <xref type="person" data="Masato_Shindoh"/>
+ </record>
+ <record date="1997-09-01">
+ <addr>224.0.1.59</addr>
+ <description>zuba</description>
+ <xref type="person" data="Dan_Jackson"/>
+ </record>
+ <record date="1997-07-01">
+ <addr>224.0.1.60</addr>
+ <description>hp-device-disc</description>
+ <xref type="person" data="Shivaun_Albright"/>
+ </record>
+ <record date="1997-07-01">
+ <addr>224.0.1.61</addr>
+ <description>tms-production</description>
+ <xref type="person" data="Asad_Gilani"/>
+ </record>
+ <record date="1997-08-01">
+ <addr>224.0.1.62</addr>
+ <description>sunscalar</description>
+ <xref type="person" data="Terry_Gibson"/>
+ </record>
+ <record date="1997-09-01">
+ <addr>224.0.1.63</addr>
+ <description>mmtp-poll</description>
+ <xref type="person" data="Bryan_Costales"/>
+ </record>
+ <record date="1997-10-01">
+ <addr>224.0.1.64</addr>
+ <description>compaq-peer</description>
+ <xref type="person" data="Victor_Volpe"/>
+ </record>
+ <record date="1997-12-01">
+ <addr>224.0.1.65</addr>
+ <description>iapp</description>
+ <xref type="person" data="Bob_Meier"/>
+ </record>
+ <record date="1997-12-01">
+ <addr>224.0.1.66</addr>
+ <description>multihasc-com</description>
+ <xref type="person" data="Darcy_Brockbank"/>
+ </record>
+ <record date="1997-12-01">
+ <addr>224.0.1.67</addr>
+ <description>serv-discovery</description>
+ <xref type="person" data="Chas_Honton"/>
+ </record>
+ <record>
+ <addr>224.0.1.68</addr>
+ <description>mdhcpdisover</description>
+ <xref type="rfc" data="rfc2730"/>
+ </record>
+ <record date="1998-02-01">
+ <addr>224.0.1.69</addr>
+ <description>MMP-bundle-discovery1</description>
+ <xref type="person" data="Gary_Scott_Malkin"/>
+ </record>
+ <record date="1998-02-01">
+ <addr>224.0.1.70</addr>
+ <description>MMP-bundle-discovery2</description>
+ <xref type="person" data="Gary_Scott_Malkin"/>
+ </record>
+ <record date="1998-02-01" updated="2014-11-07">
+ <addr>224.0.1.71</addr>
+ <description>XYPOINT DGPS Data Feed</description>
+ <xref type="person" data="NE-TEAM_at_telecomsys.com"/>
+ </record>
+ <record date="1998-02-01">
+ <addr>224.0.1.72</addr>
+ <description>GilatSkySurfer</description>
+ <xref type="person" data="Yossi_Gal"/>
+ </record>
+ <record date="1997-03-01">
+ <addr>224.0.1.73</addr>
+ <description>SharesLive</description>
+ <xref type="person" data="Shane_Rowatt"/>
+ </record>
+ <record>
+ <addr>224.0.1.74</addr>
+ <description>NorthernData</description>
+ <xref type="text">[Sheers]</xref>
+ </record>
+ <record>
+ <addr>224.0.1.75</addr>
+ <description>SIP</description>
+ <xref type="text">[Schulzrinne]</xref>
+ </record>
+ <record date="1998-03">
+ <addr>224.0.1.76</addr>
+ <description>IAPP</description>
+ <xref type="person" data="Henri_Moelard"/>
+ </record>
+ <record date="1998-03-01">
+ <addr>224.0.1.77</addr>
+ <description>AGENTVIEW</description>
+ <xref type="person" data="Ram_Iyer"/>
+ </record>
+ <record date="1998-04-01">
+ <addr>224.0.1.78</addr>
+ <description>Tibco Multicast1</description>
+ <xref type="person" data="Raymond_Shum"/>
+ </record>
+ <record date="1998-04-01">
+ <addr>224.0.1.79</addr>
+ <description>Tibco Multicast2</description>
+ <xref type="person" data="Raymond_Shum"/>
+ </record>
+ <record date="1998-06-01">
+ <addr>224.0.1.80</addr>
+ <description>MSP</description>
+ <xref type="person" data="Evan_Caves"/>
+ </record>
+ <record date="1998-06-01">
+ <addr>224.0.1.81</addr>
+ <description>OTT (One-way Trip Time)</description>
+ <xref type="person" data="Beverly_Schwartz"/>
+ </record>
+ <record date="1998-08-01">
+ <addr>224.0.1.82</addr>
+ <description>TRACKTICKER</description>
+ <xref type="person" data="Alan_Novick"/>
+ </record>
+ <record date="1998-08-01">
+ <addr>224.0.1.83</addr>
+ <description>dtn-mc</description>
+ <xref type="person" data="Bob_Gaddie"/>
+ </record>
+ <record date="1998-08-01">
+ <addr>224.0.1.84</addr>
+ <description>jini-announcement</description>
+ <xref type="person" data="Bob_Scheifler"/>
+ </record>
+ <record date="1998-08-01">
+ <addr>224.0.1.85</addr>
+ <description>jini-request</description>
+ <xref type="person" data="Bob_Scheifler"/>
+ </record>
+ <record date="1998-08-01">
+ <addr>224.0.1.86</addr>
+ <description>sde-discovery</description>
+ <xref type="person" data="Peter_Aronson"/>
+ </record>
+ <record date="1998-08-01">
+ <addr>224.0.1.87</addr>
+ <description>DirecPC-SI</description>
+ <xref type="person" data="Doug_Dillon"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.88</addr>
+ <description>B1RMonitor</description>
+ <xref type="person" data="Ed_Purkiss"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.89</addr>
+ <description>3Com-AMP3 dRMON</description>
+ <xref type="person" data="Prakash_Banthia"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.90</addr>
+ <description>imFtmSvc</description>
+ <xref type="person" data="Zia_Bhatti"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.91</addr>
+ <description>NQDS4</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.92</addr>
+ <description>NQDS5</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.93</addr>
+ <description>NQDS6</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.94</addr>
+ <description>NLVL12</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.95</addr>
+ <description>NTDS1</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.96</addr>
+ <description>NTDS2</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.97</addr>
+ <description>NODSA</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.98</addr>
+ <description>NODSB</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.99</addr>
+ <description>NODSC</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.100</addr>
+ <description>NODSD</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.101</addr>
+ <description>NQDS4R</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.102</addr>
+ <description>NQDS5R</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.103</addr>
+ <description>NQDS6R</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.104</addr>
+ <description>NLVL12R</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.105</addr>
+ <description>NTDS1R</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.106</addr>
+ <description>NTDS2R</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.107</addr>
+ <description>NODSAR</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.108</addr>
+ <description>NODSBR</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.109</addr>
+ <description>NODSCR</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-09-01">
+ <addr>224.0.1.110</addr>
+ <description>NODSDR</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1998-10-01">
+ <addr>224.0.1.111</addr>
+ <description>MRM</description>
+ <xref type="person" data="Liming_Wei"/>
+ </record>
+ <record date="1998-11-01">
+ <addr>224.0.1.112</addr>
+ <description>TVE-FILE</description>
+ <xref type="person" data="Dean_Blackketter"/>
+ </record>
+ <record date="1998-11-01">
+ <addr>224.0.1.113</addr>
+ <description>TVE-ANNOUNCE</description>
+ <xref type="person" data="Dean_Blackketter"/>
+ </record>
+ <record date="1998-11-01">
+ <addr>224.0.1.114</addr>
+ <description>Mac Srv Loc</description>
+ <xref type="person" data="Bill_Woodcock"/>
+ </record>
+ <record date="1998-11-01">
+ <addr>224.0.1.115</addr>
+ <description>Simple Multicast</description>
+ <xref type="person" data="Jon_Crowcroft"/>
+ </record>
+ <record date="1998-11-01">
+ <addr>224.0.1.116</addr>
+ <description>SpectraLinkGW</description>
+ <xref type="person" data="Mark_Hamilton"/>
+ </record>
+ <record date="1998-11-01">
+ <addr>224.0.1.117</addr>
+ <description>dieboldmcast</description>
+ <xref type="person" data="Gene_Marsh"/>
+ </record>
+ <record date="1998-12-01">
+ <addr>224.0.1.118</addr>
+ <description>Tivoli Systems</description>
+ <xref type="person" data="Jon_Gabriel"/>
+ </record>
+ <record date="1998-12-01">
+ <addr>224.0.1.119</addr>
+ <description>pq-lic-mcast</description>
+ <xref type="person" data="Bob_Sledge"/>
+ </record>
+ <record date="2007-03-01" updated="2020-07-22">
+ <addr>224.0.1.120</addr>
+ <description>Pico</description>
+ <xref type="person" data="Pico_Sales"/>
+ <controller>
+ <xref type="person" data="Pico"/>
+ </controller>
+ </record>
+ <record date="1998-12-01">
+ <addr>224.0.1.121</addr>
+ <description>Pipesplatform</description>
+ <xref type="person" data="Daniel_Dissett"/>
+ </record>
+ <record date="1999-01-01">
+ <addr>224.0.1.122</addr>
+ <description>LiebDevMgmg-DM</description>
+ <xref type="person" data="Mike_Velten"/>
+ </record>
+ <record date="1999-01-01">
+ <addr>224.0.1.123</addr>
+ <description>TRIBALVOICE</description>
+ <xref type="person" data="Nigel_Thompson"/>
+ </record>
+ <record>
+ <addr>224.0.1.124</addr>
+ <description>Unassigned (Retracted 1/29/01)</description>
+ </record>
+ <record>
+ <addr>224.0.1.125</addr>
+ <description>PolyCom Relay1</description>
+ <xref type="text">[Coutiere]</xref>
+ </record>
+ <record date="1999-03-01">
+ <addr>224.0.1.126</addr>
+ <description>Infront Multi1</description>
+ <xref type="person" data="Morten_Lindeman"/>
+ </record>
+ <record date="1999-03-01">
+ <addr>224.0.1.127</addr>
+ <description>XRX DEVICE DISC</description>
+ <xref type="person" data="Michael_Wang"/>
+ </record>
+ <record date="1999-04-01">
+ <addr>224.0.1.128</addr>
+ <description>CNN</description>
+ <xref type="person" data="Joel_Lynch"/>
+ </record>
+ <record date="2007-02-02" updated="2023-08-17">
+ <addr>224.0.1.129</addr>
+ <description>PTP-primary</description>
+ <xref type="uri" data="https://www.nist.gov/el/intelligent-systems-division-73500/ordering-ieee-1588-standard-precision-clock-synchronization">NIST: IEEE Std 1588</xref>
+ <xref type="person" data="Kang_Lee"/>
+ </record>
+ <record date="2007-02-02" updated="2023-08-17">
+ <addr>224.0.1.130</addr>
+ <description>PTP-alternate1</description>
+ <xref type="uri" data="https://www.nist.gov/el/intelligent-systems-division-73500/ordering-ieee-1588-standard-precision-clock-synchronization">NIST: IEEE Std 1588</xref>
+ <xref type="person" data="Kang_Lee"/>
+ </record>
+ <record date="2007-02-02" updated="2023-08-17">
+ <addr>224.0.1.131</addr>
+ <description>PTP-alternate2</description>
+ <xref type="uri" data="https://www.nist.gov/el/intelligent-systems-division-73500/ordering-ieee-1588-standard-precision-clock-synchronization">NIST: IEEE Std 1588</xref>
+ <xref type="person" data="Kang_Lee"/>
+ </record>
+ <record date="2007-02-02" updated="2023-08-17">
+ <addr>224.0.1.132</addr>
+ <description>PTP-alternate3</description>
+ <xref type="uri" data="https://www.nist.gov/el/intelligent-systems-division-73500/ordering-ieee-1588-standard-precision-clock-synchronization">NIST: IEEE Std 1588</xref>
+ <xref type="person" data="Kang_Lee"/>
+ </record>
+ <record date="1999-04-01">
+ <addr>224.0.1.133</addr>
+ <description>ProCast</description>
+ <xref type="person" data="Shai_Revzen"/>
+ </record>
+ <record date="1999-04-01">
+ <addr>224.0.1.134</addr>
+ <description>3Com Discp</description>
+ <xref type="person" data="Peter_White"/>
+ </record>
+ <record date="1999-05-01">
+ <addr>224.0.1.135</addr>
+ <description>CS-Multicasting</description>
+ <xref type="person" data="Nedelcho_Stanev"/>
+ </record>
+ <record date="1999-06-01">
+ <addr>224.0.1.136</addr>
+ <description>TS-MC-1</description>
+ <xref type="person" data="Darrell_Sveistrup"/>
+ </record>
+ <record date="1999-06-01">
+ <addr>224.0.1.137</addr>
+ <description>Make Source</description>
+ <xref type="person" data="Anthony_Daga"/>
+ </record>
+ <record date="1999-06-01">
+ <addr>224.0.1.138</addr>
+ <description>Teleborsa</description>
+ <xref type="person" data="Paolo_Strazzera"/>
+ </record>
+ <record date="1999-07-01">
+ <addr>224.0.1.139</addr>
+ <description>SUMAConfig</description>
+ <xref type="person" data="Walter_Wallach"/>
+ </record>
+ <record>
+ <addr>224.0.1.140</addr>
+ <description>capwap-ac</description>
+ <xref type="rfc" data="rfc5415"/>
+ </record>
+ <record date="1999-10-01">
+ <addr>224.0.1.141</addr>
+ <description>DHCP-SERVERS</description>
+ <xref type="person" data="Eric_Hall"/>
+ </record>
+ <record date="1999-08-01">
+ <addr>224.0.1.142</addr>
+ <description>CN Router-LL</description>
+ <xref type="person" data="Ian_Armitage"/>
+ </record>
+ <record date="2008-02-04">
+ <addr>224.0.1.143</addr>
+ <description>EMWIN</description>
+ <xref type="person" data="Antonio_Querubin"/>
+ </record>
+ <record date="1999-08-01">
+ <addr>224.0.1.144</addr>
+ <description>Alchemy Cluster</description>
+ <xref type="person" data="Stacey_O_Rourke"/>
+ <xref type="person" data="Stacey_O_Rourke_2"/>
+ </record>
+ <record date="1999-08-01">
+ <addr>224.0.1.145</addr>
+ <description>Satcast One</description>
+ <xref type="person" data="Julian_Nevell"/>
+ </record>
+ <record date="1999-08-01">
+ <addr>224.0.1.146</addr>
+ <description>Satcast Two</description>
+ <xref type="person" data="Julian_Nevell"/>
+ </record>
+ <record date="1999-08-01">
+ <addr>224.0.1.147</addr>
+ <description>Satcast Three</description>
+ <xref type="person" data="Julian_Nevell"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.148</addr>
+ <description>Intline</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="1999-09-01">
+ <addr>224.0.1.149</addr>
+ <description>8x8 Multicast</description>
+ <xref type="person" data="Mike_Roper"/>
+ </record>
+ <record date="2019-03-13">
+ <addr>224.0.1.150</addr>
+ <description>Ramp AltitudeCDN MulticastPlus</description>
+ <xref type="person" data="Giovanni_Marzot"/>
+ <controller><xref type="person" data="Ramp_Holdings"/></controller>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.151</addr>
+ <description>Intline-1</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.152</addr>
+ <description>Intline-2</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.153</addr>
+ <description>Intline-3</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.154</addr>
+ <description>Intline-4</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.155</addr>
+ <description>Intline-5</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.156</addr>
+ <description>Intline-6</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.157</addr>
+ <description>Intline-7</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.158</addr>
+ <description>Intline-8</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.159</addr>
+ <description>Intline-9</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.160</addr>
+ <description>Intline-10</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.161</addr>
+ <description>Intline-11</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.162</addr>
+ <description>Intline-12</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.163</addr>
+ <description>Intline-13</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.164</addr>
+ <description>Intline-14</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.165</addr>
+ <description>Intline-15</description>
+ <xref type="person" data="Robert_Sliwinski"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.166</addr>
+ <description>marratech-cc</description>
+ <xref type="person" data="Peter_Parnes"/>
+ </record>
+ <record date="2000-02-01">
+ <addr>224.0.1.167</addr>
+ <description>EMS-InterDev</description>
+ <xref type="person" data="Stephen_T_Lyda"/>
+ </record>
+ <record date="2000-03-01">
+ <addr>224.0.1.168</addr>
+ <description>itb301</description>
+ <xref type="person" data="Bodo_Rueskamp"/>
+ </record>
+ <record date="2000-07-01">
+ <addr>224.0.1.169</addr>
+ <description>rtv-audio</description>
+ <xref type="person" data="Chris_Adams"/>
+ </record>
+ <record date="2000-07-01">
+ <addr>224.0.1.170</addr>
+ <description>rtv-video</description>
+ <xref type="person" data="Chris_Adams"/>
+ </record>
+ <record date="2000-07-01">
+ <addr>224.0.1.171</addr>
+ <description>HAVI-Sim</description>
+ <xref type="person" data="Stephan_Wasserroth"/>
+ </record>
+ <record date="1999-08-01">
+ <addr>224.0.1.172</addr>
+ <description>Nokia Cluster</description>
+ <xref type="person" data="Stacey_O_Rourke"/>
+ <xref type="person" data="Stacey_O_Rourke_2"/>
+ </record>
+ <record date="2001-06-01">
+ <addr>224.0.1.173</addr>
+ <description>host-request</description>
+ <xref type="person" data="Keith_Thompson"/>
+ </record>
+ <record date="2001-06-01">
+ <addr>224.0.1.174</addr>
+ <description>host-announce</description>
+ <xref type="person" data="Keith_Thompson"/>
+ </record>
+ <record date="2001-12-01">
+ <addr>224.0.1.175</addr>
+ <description>ptk-cluster</description>
+ <xref type="person" data="Robert_Hodgson"/>
+ </record>
+ <record date="2002-02-01">
+ <addr>224.0.1.176</addr>
+ <description>Proxim Protocol</description>
+ <xref type="person" data="Gajendra_Shukla"/>
+ </record>
+ <record date="2002-10-01">
+ <addr>224.0.1.177</addr>
+ <description>Gemtek Systems</description>
+ <xref type="person" data="Alex_Lee"/>
+ </record>
+ <record date="2003-01-01">
+ <addr>224.0.1.178</addr>
+ <description>IEEE IAPP</description>
+ <xref type="person" data="Stuart_Kerry"/>
+ </record>
+ <record date="2006-04-11">
+ <addr>224.0.1.179</addr>
+ <description>1451_Dot5_802_Discovery</description>
+ <xref type="person" data="Ryon_Coleman"/>
+ </record>
+ <record date="2006-04-11">
+ <addr>224.0.1.180</addr>
+ <description>1451_Dot5_802_Group_1</description>
+ <xref type="person" data="Ryon_Coleman"/>
+ </record>
+ <record date="2006-04-11">
+ <addr>224.0.1.181</addr>
+ <description>1451_Dot5_802_Group_2</description>
+ <xref type="person" data="Ryon_Coleman"/>
+ </record>
+ <record date="2006-04-11">
+ <addr>224.0.1.182</addr>
+ <description>1451_Dot5_802_Group_3</description>
+ <xref type="person" data="Ryon_Coleman"/>
+ </record>
+ <record date="2006-04-11">
+ <addr>224.0.1.183</addr>
+ <description>1451_Dot5_802_Group_4</description>
+ <xref type="person" data="Ryon_Coleman"/>
+ </record>
+ <record date="2007-03-06">
+ <addr>224.0.1.184</addr>
+ <description>VFSDP</description>
+ <xref type="person" data="Adam_Yellen"/>
+ </record>
+ <record>
+ <addr>224.0.1.185</addr>
+ <description>ASAP</description>
+ <xref type="rfc" data="rfc5352"/>
+ </record>
+ <record>
+ <addr>224.0.1.186</addr>
+ <description>SL-MANET-ROUTERS</description>
+ <xref type="rfc" data="rfc6621"/>
+ </record>
+ <record date="2013-07-25">
+ <addr>224.0.1.187</addr>
+ <description>All CoAP Nodes</description>
+ <xref type="rfc" data="rfc7252"/>
+ </record>
+ <record date="2019-02-20">
+ <addr>224.0.1.188</addr>
+ <description>BRSDP</description>
+ <xref type="person" data="Vanya_Levy"/>
+ <controller><xref type="person" data="Semtech_Corporation"/></controller>
+ </record>
+ <record date="2021-02-08">
+ <addr>224.0.1.189</addr>
+ <description>Amateur radio DMR</description>
+ <xref type="uri" data="https://www.etsi.org/deliver/etsi_TS/102300_102399/10236103/01.03.01_60/ts_10236103v010301p.pdf">ETSI TS 102 361-3</xref>
+ <xref type="person" data="Jean-Marc_MAGNIER"/>
+ <controller><xref type="person" data="Jean-Marc_MAGNIER"/></controller>
+ </record>
+ <record date="2021-03-16">
+ <addr>224.0.1.190</addr>
+ <description>All CoRE Resource Directories</description>
+ <xref type="rfc" data="rfc9176"/>
+ </record>
+ <record>
+ <addr>224.0.1.191-224.0.1.255</addr>
+ <description>Unassigned</description>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-3">
+ <title>AD-HOC Block I (224.0.2.0 - 224.0.255.255)</title>
+ <xref type="rfc" data="rfc5771"/>
+ <registration_rule>Expert Review, IESG Approval, or Standards Action</registration_rule>
+ <note title="Request an Assignment">
+<xref type="uri" data="https://www.iana.org/protocols/apply"/>
+
+ </note>
+ <record>
+ <addr>224.0.2.0</addr>
+
+ <description>Unassigned</description>
+ </record>
+ <record>
+ <addr>224.0.2.1</addr>
+ <description>"rwho" Group (BSD) (unofficial)</description>
+ <xref type="person" data="Jon_Postel"/>
+ </record>
+ <record>
+ <addr>224.0.2.2</addr>
+ <description>SUN RPC PMAPPROC_CALLIT</description>
+ <xref type="person" data="Brendan_Eic"/>
+ </record>
+ <record date="2005-01-01">
+ <addr>224.0.2.3</addr>
+ <description>EPSON-disc-set</description>
+ <xref type="person" data="SEIKO_EPSON_Corp"/>
+ </record>
+ <record date="2009-08-28">
+ <addr>224.0.2.4</addr>
+ <description>All C1222 Nodes</description>
+ <xref type="rfc" data="rfc6142"/>
+ </record>
+ <record date="2012-04-17">
+ <addr>224.0.2.5</addr>
+ <description>Monitoring Discovery Protocol</description>
+ <xref type="person" data="Alan_Robertson"/>
+ </record>
+ <record date="2012-04-25">
+ <addr>224.0.2.6</addr>
+ <description>BitSend MediaStreams</description>
+ <xref type="person" data="Carl-Johan_Sjöberg"/>
+ </record>
+ <record date="2012-11-19">
+ <addr>224.0.2.7-224.0.2.8</addr>
+ <description>rxWARN</description>
+ <xref type="person" data="Caleb_Bell"/>
+ </record>
+ <record date="2016-10-04">
+ <addr>224.0.2.9</addr>
+ <description>DATV streams</description>
+ <xref type="person" data="Grant_Taylor"/>
+ </record>
+ <record date="2017-05-19">
+ <addr>224.0.2.10</addr>
+ <description>swapapp_multicast</description>
+ <xref type="person" data="Applykane"/>
+ </record>
+ <record date="2018-10-17">
+ <addr>224.0.2.11</addr>
+ <description>LDA Discovery Service</description>
+ <xref type="person" data="Juan_Ayas"/>
+ <controller><xref type="person" data="LDA_Audio_Tech"/></controller>
+ </record>
+ <record date="2018-11-15">
+ <addr>224.0.2.12</addr>
+ <description>CNP-HD-PLC</description>
+ <xref type="person" data="Ernst_EDER"/>
+ <controller><xref type="person" data="LonMark_International"/></controller>
+ </record>
+ <record date="2019-01-17">
+ <addr>224.0.2.13</addr>
+ <description>BSE</description>
+ <xref type="person" data="Rami_Chalhoub"/>
+ <controller><xref type="person" data="BSE"/></controller>
+ </record>
+ <record date="2019-08-19">
+ <addr>224.0.2.14</addr>
+ <description>OPC Discovery</description>
+ <xref type="person" data="OPC_Foundation"/>
+ <controller><xref type="person" data="OPC_Foundation"/></controller>
+ </record>
+ <record date="2023-06-09">
+ <addr>224.0.2.15</addr>
+ <description>MRFLabbing (expires 2024-06-09)</description>
+ <xref type="person" data="Mohammed_Raoof_Fadda"/>
+ <controller><xref type="person" data="Mohammed_Raoof_Fadda"/></controller>
+ </record>
+ <record date="2023-01-18">
+ <addr>224.0.2.16-224.0.2.17</addr>
+ <description>unidns</description>
+ <xref type="person" data="Xie_Shao"/>
+ <controller><xref type="person" data="Xie_Shao"/></controller>
+ </record>
+ <record date="2023-10-13" updated="2023-10-16">
+ <addr>224.0.2.18</addr>
+ <description>vivoh-directory-1</description>
+ <xref type="person" data="Giovanni_Marzot_2"/>
+ <controller>
+ <xref type="person" data="Vivoh"/>
+ </controller>
+ </record>
+ <record date="2023-10-13" updated="2023-10-16">
+ <addr>224.0.2.19</addr>
+ <description>vivoh-directory-2</description>
+ <xref type="person" data="Giovanni_Marzot_2"/>
+ <controller>
+ <xref type="person" data="Vivoh"/>
+ </controller>
+ </record>
+ <record>
+ <addr>224.0.2.20-224.0.2.63</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="1996-04" updated="2018-04-20">
+ <addr>224.0.2.64-224.0.2.95</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ <reviewed>2007-07</reviewed>
+ </record>
+ <record date="1997-07-01">
+ <addr>224.0.2.96-224.0.2.127</addr>
+ <description>BallisterNet</description>
+ <xref type="person" data="Tom_Ballister"/>
+ <controller>
+ <xref type="person" data="Tom_Ballister"/>
+ </controller>
+ <reviewed>2021-06-11</reviewed>
+ </record>
+ <record date="1997-02-01">
+ <addr>224.0.2.128-224.0.2.191</addr>
+ <description>WOZ-Garage</description>
+ <xref type="person" data="Douglas_Marquardt"/>
+ </record>
+ <record date="1997-02-01" updated="2018-04-20">
+ <addr>224.0.2.192-224.0.2.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record>
+ <addr>224.0.3.0-224.0.3.255</addr>
+ <description>RFE Generic Service</description>
+ <xref type="person" data="Daniel_Steinber"/>
+ </record>
+ <record>
+ <addr>224.0.4.0-224.0.4.255</addr>
+ <description>RFE Individual Conferences</description>
+ <xref type="person" data="Daniel_Steinber"/>
+ </record>
+ <record>
+ <addr>224.0.5.0-224.0.5.127</addr>
+ <description>CDPD Groups</description>
+ <xref type="text">[Bob Brenner]</xref>
+ </record>
+ <record date="1998-10-01" updated="2018-04-20">
+ <addr>224.0.5.128-224.0.5.191</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2001-08-01" updated="2018-04-20">
+ <addr>224.0.5.192-224.0.5.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record>
+ <addr>224.0.6.0-224.0.6.127</addr>
+ <description>Cornell ISIS Project</description>
+ <xref type="text">[Tim Clark]</xref>
+ </record>
+ <record date="2009-09-24">
+ <addr>224.0.6.128-224.0.6.143</addr>
+ <description>MoeSingh</description>
+ <xref type="person" data="Moe_Singh"/>
+ </record>
+ <record date="2018-01-03" updated="2018-01-31">
+ <addr>224.0.6.144</addr>
+ <description>QDNE</description>
+ <xref type="person" data="Architecture_Team"/>
+ </record>
+ <record>
+ <addr>224.0.6.145-224.0.6.150</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2014-08-01">
+ <addr>224.0.6.151</addr>
+ <description>Canon-Device-control</description>
+ <xref type="person" data="Hiroshi_Okubo"/>
+ </record>
+ <record>
+ <addr>224.0.6.152-224.0.6.191</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2014-09-19">
+ <addr>224.0.6.192-224.0.6.255</addr>
+ <description>OneChicago multicast</description>
+ <xref type="person" data="Brian_Trudeau"/>
+ </record>
+ <record date="1994-11-01">
+ <addr>224.0.7.0-224.0.7.255</addr>
+ <description>Where-Are-You</description>
+ <xref type="person" data="Bill_Simpson"/>
+ </record>
+ <record date="2017-10-13" updated="2020-10-07">
+ <addr>224.0.8.0</addr>
+ <description>Cell Broadcast Encapsulation</description>
+ <xref type="person" data="Meridian_Labs_LTD"/>
+ <xref type="person" data="LIRNEasia"/>
+ <controller>
+ <xref type="person" data="Meridian_Labs_LTD"/>
+ <xref type="person" data="LIRNEasia"/>
+ </controller>
+ </record>
+ <record date="2020-10-07">
+ <addr>224.0.8.1-224.0.8.255</addr>
+ <description>Civic Telemetry</description>
+ <xref type="person" data="Meridian_Labs_LTD"/>
+ <xref type="person" data="LIRNEasia"/>
+ <controller>
+ <xref type="person" data="Meridian_Labs_LTD"/>
+ <xref type="person" data="LIRNEasia"/>
+ </controller>
+ </record>
+ <record date="1998-04-01">
+ <addr>224.0.9.0-224.0.9.255</addr>
+ <description>The Thing System</description>
+ <xref type="person" data="Carl_Malamud"/>
+ </record>
+ <record date="1996-04-01">
+ <addr>224.0.10.0-224.0.10.255</addr>
+ <description>DLSw Groups</description>
+ <xref type="person" data="Choon_Lee"/>
+ </record>
+ <record date="1996-08-01">
+ <addr>224.0.11.0-224.0.11.255</addr>
+ <description>NCC.NET Audio</description>
+ <xref type="person" data="David_Rubin"/>
+ </record>
+ <record date="1996-11-01">
+ <addr>224.0.12.0-224.0.12.63</addr>
+ <description>Microsoft and MSNBC</description>
+ <xref type="person" data="Tom_Blank"/>
+ </record>
+ <record date="2023-03-03" updated="2023-03-06">
+ <addr>224.0.12.64-224.0.12.135</addr>
+ <description>AsiaNext</description>
+ <xref type="person" data="Lau_Wei_Lun"/>
+ <controller>
+ <xref type="person" data="Asia_Digital_Exchange"/>
+ </controller>
+ </record>
+ <record>
+ <addr>224.0.12.136-224.0.12.255</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="1997-01-01">
+ <addr>224.0.13.0-224.0.13.255</addr>
+ <description>WorldCom Broadcast Services</description>
+ <xref type="person" data="Tony_Barber"/>
+ </record>
+ <record date="1997-02-01">
+ <addr>224.0.14.0-224.0.14.255</addr>
+ <description>NLANR</description>
+ <xref type="person" data="Duane_Wessels"/>
+ </record>
+ <record date="1997-02-01" updated="2015-10-12">
+ <addr>224.0.15.0-224.0.15.255</addr>
+ <description>Agilent Technologies</description>
+ <xref type="person" data="IP_Admin"/>
+ </record>
+ <record date="1997-04-01">
+ <addr>224.0.16.0-224.0.16.255</addr>
+ <description>XingNet</description>
+ <xref type="person" data="Mika_Uusitalo"/>
+ </record>
+ <record date="1997-07-01">
+ <addr>224.0.17.0-224.0.17.31</addr>
+ <description>Mercantile &amp; Commodity Exchange</description>
+ <xref type="person" data="Asad_Gilani"/>
+ </record>
+ <record date="1999-03-01">
+ <addr>224.0.17.32-224.0.17.63</addr>
+ <description>NDQMD1</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="1999-03-01">
+ <addr>224.0.17.64-224.0.17.127</addr>
+ <description>ODN-DTV</description>
+ <xref type="person" data="Richard_Hodges"/>
+ </record>
+ <record>
+ <addr>224.0.17.128-224.0.17.255</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="1997-01-01">
+ <addr>224.0.18.0-224.0.18.255</addr>
+ <description>Dow Jones</description>
+ <xref type="person" data="Wenjie_Peng"/>
+ </record>
+ <record date="1997-08-01">
+ <addr>224.0.19.0-224.0.19.63</addr>
+ <description>Walt Disney Company</description>
+ <xref type="person" data="Scott_Watson"/>
+ </record>
+ <record date="1997-10-01">
+ <addr>224.0.19.64-224.0.19.95</addr>
+ <description>Cal Multicast</description>
+ <xref type="person" data="Ed_Moran"/>
+ </record>
+ <record date="1997-10" updated="2018-04-20">
+ <addr>224.0.19.96-224.0.19.127</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ <reviewed>2007-07</reviewed>
+ </record>
+ <record date="1997-12-01">
+ <addr>224.0.19.128-224.0.19.191</addr>
+ <description>IIG Multicast</description>
+ <xref type="person" data="Wayne_Carr"/>
+ </record>
+ <record date="1998-05-01">
+ <addr>224.0.19.192-224.0.19.207</addr>
+ <description>Metropol</description>
+ <xref type="person" data="James_Crawford"/>
+ </record>
+ <record date="1998-07-01">
+ <addr>224.0.19.208-224.0.19.239</addr>
+ <description>Xenoscience, Inc.</description>
+ <xref type="person" data="Mary_Timm"/>
+ </record>
+ <record date="2007-03-01">
+ <addr>224.0.19.240-224.0.19.255</addr>
+ <description>MJDPM</description>
+ <xref type="person" data="Matthew_Straight"/>
+ </record>
+ <record date="1998-07-01">
+ <addr>224.0.20.0-224.0.20.63</addr>
+ <description>MS-IP/TV</description>
+ <xref type="person" data="Tony_Wong"/>
+ </record>
+ <record date="1998-08-01">
+ <addr>224.0.20.64-224.0.20.127</addr>
+ <description>Reliable Network Solutions</description>
+ <xref type="person" data="Werner_Vogels"/>
+ </record>
+ <record date="1998-08-01">
+ <addr>224.0.20.128-224.0.20.143</addr>
+ <description>TRACKTICKER Group</description>
+ <xref type="person" data="Alan_Novick"/>
+ </record>
+ <record date="1999-08-01">
+ <addr>224.0.20.144-224.0.20.207</addr>
+ <description>CNR Rebroadcast MCA</description>
+ <xref type="person" data="Robert_Sautter"/>
+ </record>
+ <record>
+ <addr>224.0.20.208-224.0.20.255</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="1999-01-01">
+ <addr>224.0.21.0-224.0.21.127</addr>
+ <description>Talarian MCAST</description>
+ <xref type="person" data="Geoff_Mendal"/>
+ </record>
+ <record>
+ <addr>224.0.21.128-224.0.21.255</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="1999-06-01">
+ <addr>224.0.22.0-224.0.22.239</addr>
+ <description>WORLD MCAST</description>
+ <xref type="person" data="Ian_Stewart"/>
+ </record>
+ <record date="2007-10-31">
+ <addr>224.0.22.240-224.0.22.255</addr>
+ <description>Jones International</description>
+ <xref type="person" data="Jim_Ginsburg"/>
+ </record>
+ <record date="2003-02-01">
+ <addr>224.0.23.0</addr>
+ <description>ECHONET</description>
+ <xref type="person" data="Takeshi_Saito"/>
+ </record>
+ <record date="2003-02-01">
+ <addr>224.0.23.1</addr>
+ <description>Ricoh-device-ctrl</description>
+ <xref type="person" data="Akihiro_Nishida"/>
+ </record>
+ <record date="2003-02-01">
+ <addr>224.0.23.2</addr>
+ <description>Ricoh-device-ctrl</description>
+ <xref type="person" data="Akihiro_Nishida"/>
+ </record>
+ <record date="2003-04-01">
+ <addr>224.0.23.3-224.0.23.10</addr>
+ <description>Telefeed</description>
+ <xref type="person" data="Wally_Beddoe"/>
+ </record>
+ <record date="2003-05-01">
+ <addr>224.0.23.11</addr>
+ <description>SpectraTalk</description>
+ <xref type="person" data="Madhav_Karhade"/>
+ </record>
+ <record date="2003-07-01" updated="2023-08-23">
+ <addr>224.0.23.12</addr>
+ <description>KNXnet/IP</description>
+ <xref type="person" data="Joost_Demarest"/>
+ <controller>
+ <xref type="person" data="KNX_Association"/>
+ </controller>
+ <reviewed>2023-08-23</reviewed>
+ </record>
+ <record date="2003-10-01">
+ <addr>224.0.23.13</addr>
+ <description>TVE-ANNOUNCE2</description>
+ <xref type="person" data="Michael_Dolan"/>
+ </record>
+ <record date="2004-01-01">
+ <addr>224.0.23.14</addr>
+ <description>DvbServDisc</description>
+ <xref type="person" data="Bert_van_Willigen"/>
+ </record>
+ <record date="2007-03-01">
+ <addr>224.0.23.15-224.0.23.31</addr>
+ <description>MJDPM</description>
+ <xref type="person" data="Matthew_Straight"/>
+ </record>
+ <record date="2004-02-01">
+ <addr>224.0.23.32</addr>
+ <description>Norman MCMP</description>
+ <xref type="person" data="Kristian_A_Bognaes"/>
+ </record>
+ <record date="2004-06-01">
+ <addr>224.0.23.33</addr>
+ <description>RRDP</description>
+ <xref type="person" data="Tetsuo_Hoshi"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.34</addr>
+ <description>AF_NA</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.35</addr>
+ <description>AF_OPRA_NBBO</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.36</addr>
+ <description>AF_OPRA_FULL</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.37</addr>
+ <description>AF_NEWS</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.38</addr>
+ <description>AF_NA_CHI</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.39</addr>
+ <description>AF_OPRA_NBBO_CHI</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.40</addr>
+ <description>AF_OPRA_FULL_CHI</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.41</addr>
+ <description>AF_NEWS_CHI</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-02-01">
+ <addr>224.0.23.42</addr>
+ <description>Control for IP Video</description>
+ <xref type="person" data="Nadine_Guillaume"/>
+ </record>
+ <record date="2005-02-01">
+ <addr>224.0.23.43</addr>
+ <description>acp-discovery</description>
+ <xref type="person" data="Andy_Belk"/>
+ </record>
+ <record date="2005-02-01">
+ <addr>224.0.23.44</addr>
+ <description>acp-management</description>
+ <xref type="person" data="Andy_Belk"/>
+ </record>
+ <record date="2005-02-01">
+ <addr>224.0.23.45</addr>
+ <description>acp-data</description>
+ <xref type="person" data="Andy_Belk"/>
+ </record>
+ <record date="2006-06-16" updated="2015-04-23">
+ <addr>224.0.23.46</addr>
+ <description>dof-multicast</description>
+ <xref type="person" data="Bryant_Eastham"/>
+ <reviewed>2015-04-23</reviewed>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.47</addr>
+ <description>AF_DOB_CHI</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.48</addr>
+ <description>AF_OPRA_FULL2_CHI</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.49</addr>
+ <description>AF_DOB</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2005-10-28">
+ <addr>224.0.23.50</addr>
+ <description>AF_OPRA_FULL2</description>
+ <xref type="person" data="Bob_Brzezinski"/>
+ </record>
+ <record date="2006-08-07">
+ <addr>224.0.23.51</addr>
+ <description>Fairview</description>
+ <xref type="person" data="Jim_Lyle"/>
+ </record>
+ <record date="2006-08-11" updated="2018-04-20">
+ <addr>224.0.23.52</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2006-11-30">
+ <addr>224.0.23.53</addr>
+ <description>MCP</description>
+ <xref type="person" data="Tim_DeBaillie"/>
+ </record>
+ <record date="2007-01-17">
+ <addr>224.0.23.54</addr>
+ <description>ServDiscovery</description>
+ <xref type="person" data="Paul_Langille"/>
+ </record>
+ <record date="2008-02-04">
+ <addr>224.0.23.55</addr>
+ <description>noaaport1</description>
+ <xref type="person" data="Antonio_Querubin"/>
+ </record>
+ <record date="2008-02-04">
+ <addr>224.0.23.56</addr>
+ <description>noaaport2</description>
+ <xref type="person" data="Antonio_Querubin"/>
+ </record>
+ <record date="2008-02-04">
+ <addr>224.0.23.57</addr>
+ <description>noaaport3</description>
+ <xref type="person" data="Antonio_Querubin"/>
+ </record>
+ <record date="2008-02-04">
+ <addr>224.0.23.58</addr>
+ <description>noaaport4</description>
+ <xref type="person" data="Antonio_Querubin"/>
+ </record>
+ <record date="2008-02-22">
+ <addr>224.0.23.59</addr>
+ <description>DigacIP7</description>
+ <xref type="person" data="Jonathan_Niedfeldt"/>
+ </record>
+ <record date="2008-12-19">
+ <addr>224.0.23.60</addr>
+ <description>AtscSvcSig</description>
+ <xref type="person" data="Jerry_Whitaker"/>
+ </record>
+ <record date="2009-03-13">
+ <addr>224.0.23.61</addr>
+ <description>SafetyNET p (potentially IGMPv1)</description>
+ <xref type="person" data="Pilz"/>
+ </record>
+ <record date="2009-05-12">
+ <addr>224.0.23.62</addr>
+ <description>BluemoonGamesMC</description>
+ <xref type="person" data="Christopher_Mettin"/>
+ </record>
+ <record date="2009-05-12">
+ <addr>224.0.23.63</addr>
+ <description>iADT Discovery</description>
+ <xref type="person" data="Paul_Suhler"/>
+ </record>
+ <record date="2004-01-01">
+ <addr>224.0.23.64-224.0.23.80</addr>
+ <description>Moneyline</description>
+ <xref type="person" data="Guido_Petronio"/>
+ </record>
+ <record>
+ <addr>224.0.23.81-224.0.23.127</addr>
+ <description>Reserved (Moneyline)</description>
+ </record>
+ <record date="2004-01-01">
+ <addr>224.0.23.128-224.0.23.157</addr>
+ <description>PHLX</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record date="2005-09-01">
+ <addr>224.0.23.158</addr>
+ <description>VSCP</description>
+ <xref type="person" data="Charles_Tewiah"/>
+ </record>
+ <record date="2005-11-04">
+ <addr>224.0.23.159</addr>
+ <description>LXI-EVENT</description>
+ <xref type="person" data="Nick_Barendt"/>
+ </record>
+ <record date="2006-02-09">
+ <addr>224.0.23.160</addr>
+ <description>solera_lmca</description>
+ <xref type="person" data="Mark_Armstrong"/>
+ </record>
+ <record date="2006-03-17">
+ <addr>224.0.23.161</addr>
+ <description>VBooster</description>
+ <xref type="person" data="Alexander_Pevzner"/>
+ </record>
+ <record date="2006-03-17">
+ <addr>224.0.23.162</addr>
+ <description>cajo discovery</description>
+ <xref type="person" data="John_Catherino"/>
+ </record>
+ <record date="2006-03-31">
+ <addr>224.0.23.163</addr>
+ <description>INTELLIDEN</description>
+ <xref type="person" data="Jeff_Schenk"/>
+ </record>
+ <record date="2006-07-11">
+ <addr>224.0.23.164</addr>
+ <description>IceEDCP</description>
+ <xref type="person" data="Oliver_Lewis"/>
+ </record>
+ <record date="2006-07-11">
+ <addr>224.0.23.165</addr>
+ <description>omasg</description>
+ <xref type="person" data="Mark_Lipford"/>
+ </record>
+ <record date="2006-08-15">
+ <addr>224.0.23.166</addr>
+ <description>MEDIASTREAM</description>
+ <xref type="person" data="Maurice_Robberson"/>
+ </record>
+ <record date="2006-08-21">
+ <addr>224.0.23.167</addr>
+ <description>Systech Mcast</description>
+ <xref type="person" data="Dan_Jakubiec"/>
+ </record>
+ <record date="2007-07-06">
+ <addr>224.0.23.168</addr>
+ <description>tricon-system-management</description>
+ <xref type="person" data="John_Gabler"/>
+ </record>
+ <record date="2008-01-14">
+ <addr>224.0.23.169</addr>
+ <description>MNET discovery</description>
+ <xref type="person" data="Andy_Crick"/>
+ </record>
+ <record date="2009-09-24">
+ <addr>224.0.23.170</addr>
+ <description>CCNx (not for global routing)</description>
+ <xref type="person" data="Simon_Barber"/>
+ </record>
+ <record date="2009-11-11">
+ <addr>224.0.23.171</addr>
+ <description>LLAFP</description>
+ <xref type="person" data="Michael_Lyle"/>
+ </record>
+ <record date="2010-02-04" updated="2019-07-01">
+ <addr>224.0.23.172</addr>
+ <description>UFMP</description>
+ <xref type="person" data="Shachar_Dor"/>
+ <controller>
+ <xref type="person" data="Mellanox"/>
+ </controller>
+ </record>
+ <record date="2010-02-26" updated="2019-02-07">
+ <addr>224.0.23.173</addr>
+ <description>PHILIPS-HEALTH</description>
+ <xref type="person" data="Mike_King"/>
+ <controller><xref type="person" data="Philips_Healthcare"/></controller>
+ </record>
+ <record date="2010-02-26" updated="2019-02-07">
+ <addr>224.0.23.174</addr>
+ <description>PHILIPS-HEALTH</description>
+ <xref type="person" data="Mike_King"/>
+ <controller><xref type="person" data="Philips_Healthcare"/></controller>
+ </record>
+ <record date="2010-03-12">
+ <addr>224.0.23.175</addr>
+ <description>QDP</description>
+ <xref type="person" data="Kevin_Gross"/>
+ </record>
+ <record date="2011-06-06">
+ <addr>224.0.23.176</addr>
+ <description>CalAmp WCP</description>
+ <xref type="person" data="Pierre_Oliver"/>
+ </record>
+ <record date="2012-08-28">
+ <addr>224.0.23.177</addr>
+ <description>AES discovery</description>
+ <xref type="person" data="Kevin_Gross_2"/>
+ </record>
+ <record date="2013-02-08">
+ <addr>224.0.23.178</addr>
+ <description>JDP Java Discovery Protocol</description>
+ <xref type="person" data="Florian_Weimer"/>
+ </record>
+ <record date="2014-06-04">
+ <addr>224.0.23.179</addr>
+ <description>PixelPusher</description>
+ <xref type="person" data="Jasmine_Strong"/>
+ </record>
+ <record date="2014-12-17">
+ <addr>224.0.23.180</addr>
+ <description>network metronome</description>
+ <xref type="person" data="George_Neville-Neil"/>
+ </record>
+ <record date="2016-04-19">
+ <addr>224.0.23.181</addr>
+ <description>polaris-video-transport</description>
+ <xref type="person" data="Geoff_Golder"/>
+ </record>
+ <record>
+ <addr>224.0.23.182-224.0.23.191</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2008-08-12">
+ <addr>224.0.23.192-224.0.23.255</addr>
+ <description>PINKOTC</description>
+ <xref type="person" data="Sergey_Shulgin"/>
+ </record>
+ <record date="2006-06-09">
+ <addr>224.0.24.0-224.0.24.127</addr>
+ <description>AGSC UK VVs</description>
+ <xref type="person" data="Andrew_Rowley"/>
+ </record>
+ <record date="2006-08-07">
+ <addr>224.0.24.128-224.0.24.255</addr>
+ <description>EM-MULTI</description>
+ <xref type="person" data="Soren_Martin_Sorensen"/>
+ </record>
+ <record date="2007-03-22">
+ <addr>224.0.25.0-224.0.28.255</addr>
+ <description>CME Market Data</description>
+ <xref type="person" data="Sarunas_Brakauskas"/>
+ </record>
+ <record date="2007-03-22">
+ <addr>224.0.29.0-224.0.30.255</addr>
+ <description>Deutsche Boerse</description>
+ <xref type="person" data="Jan_Drwal"/>
+ </record>
+ <record date="2007-07-17">
+ <addr>224.0.31.0-224.0.34.255</addr>
+ <description>CME Market Data</description>
+ <xref type="person" data="Sarunas_Brakauskas"/>
+ </record>
+ <record date="2007-08-31">
+ <addr>224.0.35.0-224.0.35.255</addr>
+ <description>M2S</description>
+ <xref type="person" data="Itamar_Gilad"/>
+ </record>
+ <record date="2016-09-29">
+ <addr>224.0.36.0-224.0.36.255</addr>
+ <description>DigiPlay</description>
+ <xref type="person" data="Robert_Taylor"/>
+ </record>
+ <record date="2017-03-24" updated="2023-04-27">
+ <addr>224.0.37.0-224.0.38.255</addr>
+ <description>London Metal Exchange</description>
+ <xref type="person" data="LME_Networks"/>
+ <controller>
+ <xref type="person" data="London_Metal_Exchange"/>
+ </controller>
+ </record>
+ <record date="2007-09-12">
+ <addr>224.0.39.0-224.0.40.255</addr>
+ <description>CDAS</description>
+ <xref type="person" data="Oyvind_H_Olsen"/>
+ </record>
+ <record date="2007-11-28" updated="2018-04-20">
+ <addr>224.0.41.0-224.0.41.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ <reviewed>2011-02-15</reviewed>
+ </record>
+ <record date="2008-01-15" updated="2021-10-22">
+ <addr>224.0.42.0-224.0.45.255</addr>
+ <description>Media Systems</description>
+ <xref type="person" data="Media_Systems_OOO"/>
+ <controller><xref type="person" data="Media_Systems_OOO"/></controller>
+ </record>
+ <record date="2008-01-25">
+ <addr>224.0.46.0-224.0.50.255</addr>
+ <description>Deutsche Boerse</description>
+ <xref type="person" data="Jan_Drwal"/>
+ </record>
+ <record date="2008-04-09" updated="2018-02-20">
+ <addr>224.0.51.0-224.0.51.255</addr>
+ <description>ALCOM-IPTV</description>
+ <xref type="person" data="TV_System_Administrators"/>
+ <controller><xref type="person" data="Ålands_Telekommunikation_Ab"/></controller>
+ <reviewed>2018-02-20</reviewed>
+ </record>
+ <record date="2008-07-23" updated="2021-04-14">
+ <addr>224.0.52.0-224.0.53.255</addr>
+ <description>Euronext</description>
+ <xref type="person" data="Euronext_Admin"/>
+ <controller><xref type="person" data="Euronext_Admin"/></controller>
+ <reviewed>2014-11-24</reviewed>
+ </record>
+ <record date="2008-08-20" updated="2019-08-29">
+ <addr>224.0.54.0-224.0.57.255</addr>
+ <description>Telia Norway mcast</description>
+ <xref type="person" data="Henrik_Lans"/>
+ <controller>
+ <xref type="person" data="Telia-Norway-Get-NOC"/>
+ </controller>
+ </record>
+ <record date="2008-08-27" updated="2018-04-20">
+ <addr>224.0.58.0-224.0.61.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2008-12-24">
+ <addr>224.0.62.0-224.0.62.255</addr>
+ <description>BATS</description>
+ <xref type="person" data="Andrew_Brown"/>
+ </record>
+ <record date="2009-03-13">
+ <addr>224.0.63.0-224.0.63.255</addr>
+ <description>BATS Trading</description>
+ <xref type="person" data="Tim_Gorsline"/>
+ </record>
+ <record date="2009-03-13" updated="2021-04-14">
+ <addr>224.0.64.0-224.0.67.255</addr>
+ <description>Euronext</description>
+ <xref type="person" data="Euronext_Admin"/>
+ <controller><xref type="person" data="Euronext_Admin"/></controller>
+ <reviewed>2014-11-24</reviewed>
+ </record>
+ <record date="2009-05-12" updated="2016-05-06">
+ <addr>224.0.68.0-224.0.69.255</addr>
+ <description>ISE</description>
+ <xref type="person" data="ISE-Networks"/>
+ </record>
+ <record date="2009-06-16" updated="2018-04-20">
+ <addr>224.0.70.0-224.0.71.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ <reviewed>2011-03-01</reviewed>
+ </record>
+ <record date="2009-08-28" updated="2023-04-14">
+ <addr>224.0.72.0-224.0.72.255</addr>
+ <description>TMX</description>
+ <xref type="person" data="TMX_Network_Engineering"/>
+ <controller>
+ <xref type="person" data="TMX"/>
+ </controller>
+ </record>
+ <record date="2009-08-28">
+ <addr>224.0.73.0-224.0.74.255</addr>
+ <description>Direct Edge</description>
+ <xref type="person" data="Javier_Landin"/>
+ </record>
+ <record date="2010-01-22" updated="2016-05-06">
+ <addr>224.0.75.0-224.0.75.255</addr>
+ <description>ISE</description>
+ <xref type="person" data="ISE-Networks"/>
+ </record>
+ <record date="2010-02-26" updated="2018-04-20">
+ <addr>224.0.76.0-224.0.76.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ <reviewed>2011-03-01</reviewed>
+ </record>
+ <record date="2010-02-26" updated="2018-04-20">
+ <addr>224.0.77.0-224.0.77.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2010-03-12" updated="2018-02-20">
+ <addr>224.0.78.0-224.0.78.255</addr>
+ <description>ALCOM-IPTV</description>
+ <xref type="person" data="TV_System_Administrators"/>
+ <controller><xref type="person" data="Ålands_Telekommunikation_Ab"/></controller>
+ <reviewed>2018-02-20</reviewed>
+ </record>
+ <record date="2010-08-24" updated="2016-05-06">
+ <addr>224.0.79.0-224.0.81.255</addr>
+ <description>ISE</description>
+ <xref type="person" data="ISE-Networks"/>
+ </record>
+ <record date="2011-01-31" updated="2017-06-23">
+ <addr>224.0.82.0-224.0.85.255</addr>
+ <description>BATS Trading</description>
+ <xref type="person" data="BATS_Europe_NOC"/>
+ </record>
+ <record date="2011-02-10" updated="2018-04-20">
+ <addr>224.0.86.0-224.0.101.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2011-04-13" updated="2018-04-20">
+ <addr>224.0.102.0-224.0.102.127</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2014-06-12">
+ <addr>224.0.102.128-224.0.102.255</addr>
+ <description>MVS-IPTV-2</description>
+ <xref type="person" data="Midwest_Video_Solutions"/>
+ <controller>
+ <xref type="person" data="Midwest_Video_Solutions"/>
+ </controller>
+ </record>
+ <record date="2011-04-20">
+ <addr>224.0.103.0-224.0.104.255</addr>
+ <description>MVS-IPTV</description>
+ <xref type="person" data="Midwest_Video_Solutions"/>
+ <xref type="person" data="Adam_DeMinter"/>
+ <controller>
+ <xref type="person" data="Midwest_Video_Solutions"/>
+ </controller>
+ </record>
+ <record date="2011-06-06" updated="2018-08-01">
+ <addr>224.0.105.0-224.0.105.127</addr>
+ <description>MIAX Multicast</description>
+ <xref type="person" data="Gamini_Karunaratne"/>
+ <controller><xref type="person" data="MIAX"/></controller>
+ </record>
+ <record date="2017-12-04">
+ <addr>224.0.105.128-224.0.105.255</addr>
+ <description>MVS-IPTV3</description>
+ <xref type="person" data="Justin_Beaman"/>
+ <controller>
+ <xref type="person" data="Midwest_Video_Solutions"/>
+ </controller>
+ </record>
+ <record date="2011-06-16" updated="2023-04-14">
+ <addr>224.0.106.0-224.0.106.255</addr>
+ <description>TMX</description>
+ <xref type="person" data="TMX_Network_Engineering"/>
+ <controller>
+ <xref type="person" data="TMX"/>
+ </controller>
+ </record>
+ <record date="2011-07-13" updated="2023-04-13">
+ <addr>224.0.107.0-224.0.108.255</addr>
+ <description>TSX Inc.</description>
+ <xref type="person" data="TMX_Network_Engineering"/>
+ <controller>
+ <xref type="person" data="TMX"/>
+ </controller>
+ </record>
+ <record date="2011-10-25" updated="2023-04-13">
+ <addr>224.0.109.0-224.0.110.255</addr>
+ <description>TSX Inc.</description>
+ <xref type="person" data="TMX_Network_Engineering"/>
+ <controller>
+ <xref type="person" data="TMX"/>
+ </controller>
+ </record>
+ <record date="2011-10-25" updated="2019-10-01">
+ <addr>224.0.111.0-224.0.111.255</addr>
+ <description>VoleraDataFeed</description>
+ <xref type="person" data="Gerald_Hanweck"/>
+ <controller>
+ <xref type="person" data="Hanweck_Associates"/>
+ </controller>
+ </record>
+ <record date="2011-12-07">
+ <addr>224.0.112.0-224.0.112.255</addr>
+ <description>JHB-STOCK-EXCH</description>
+ <xref type="person" data="Clem_Verwey"/>
+ </record>
+ <record date="2011-12-19">
+ <addr>224.0.113.0-224.0.114.255</addr>
+ <description>Deutsche Boerse</description>
+ <xref type="person" data="Jan_Drwal"/>
+ </record>
+ <record date="2012-06-12" updated="2023-04-14">
+ <addr>224.0.115.0-224.0.115.255</addr>
+ <description>TMX</description>
+ <xref type="person" data="TMX_Network_Engineering"/>
+ <controller>
+ <xref type="person" data="TMX"/>
+ </controller>
+ </record>
+ <record date="2012-06-19" updated="2018-04-20">
+ <addr>224.0.116.0-224.0.116.255</addr>
+ <description>Intercontinental Exchange, Inc</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2012-07-12" updated="2016-05-06">
+ <addr>224.0.117.0-224.0.119.255</addr>
+ <description>ISE</description>
+ <xref type="person" data="ISE-Networks"/>
+ </record>
+ <record date="2013-01-15">
+ <addr>224.0.120.0-224.0.120.255</addr>
+ <description>czechbone iptv</description>
+ <xref type="person" data="Jan_Vitek"/>
+ </record>
+ <record date="2013-05-13" updated="2019-08-28">
+ <addr>224.0.121.0-224.0.121.255</addr>
+ <description>AQUIS-EXCHANGE</description>
+ <xref type="person" data="Paul_Roberts"/>
+ <controller>
+ <xref type="person" data="Aquis_Exchange_PLC"/>
+ </controller>
+ </record>
+ <record date="2013-05-25">
+ <addr>224.0.122.0-224.0.123.255</addr>
+ <description>DNS:NET TV</description>
+ <xref type="person" data="Marlon_Berlin"/>
+ </record>
+ <record date="2013-05-30">
+ <addr>224.0.124.0-224.0.124.255</addr>
+ <description>Boston Options Exchange</description>
+ <xref type="person" data="David_Wilson"/>
+ <xref type="person" data="Michael_Caravetta"/>
+ </record>
+ <record date="2013-09-05" updated="2019-10-01">
+ <addr>224.0.125.0-224.0.125.255</addr>
+ <description>Hanweck Associates</description>
+ <xref type="person" data="Gerald_Hanweck"/>
+ <controller>
+ <xref type="person" data="Hanweck_Associates"/>
+ </controller>
+ </record>
+ <record date="2013-10-31" updated="2018-04-20">
+ <addr>224.0.126.0-224.0.129.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2014-03-05">
+ <addr>224.0.130.0-224.0.131.255</addr>
+ <description>BATS Trading</description>
+ <xref type="person" data="Andrew_Brown"/>
+ </record>
+ <record date="2014-04-12">
+ <addr>224.0.132.0-224.0.135.255</addr>
+ <description>Net By Net Holding IPTV</description>
+ <xref type="person" data="Lev_V._Cherednikov"/>
+ </record>
+ <record date="2014-05-16">
+ <addr>224.0.136.0-224.0.139.255</addr>
+ <description>Aequitas Innovations Inc.</description>
+ <xref type="person" data="Zaklina_Petkovic"/>
+ </record>
+ <record date="2014-09-04" updated="2019-08-29">
+ <addr>224.0.140.0-224.0.140.255</addr>
+ <description>Instinet</description>
+ <xref type="person" data="Instinet"/>
+ <controller>
+ <xref type="person" data="Instinet"/>
+ </controller>
+ </record>
+ <record date="2015-06-30" updated="2018-08-01">
+ <addr>224.0.141.0-224.0.141.255</addr>
+ <description>MIAX-2</description>
+ <xref type="person" data="Gamini_Karunaratne"/>
+ <controller><xref type="person" data="MIAX"/></controller>
+ </record>
+ <record date="2017-05-19" updated="2018-08-01">
+ <addr>224.0.142.0-224.0.142.255</addr>
+ <description>MIAX M3</description>
+ <xref type="person" data="Gamini_Karunaratne"/>
+ <controller><xref type="person" data="MIAX"/></controller>
+ </record>
+ <record date="2017-06-02">
+ <addr>224.0.143.0-224.0.143.255</addr>
+ <description>A2X-EXCHANGE</description>
+ <xref type="person" data="Neal_Lawrence"/>
+ </record>
+ <record date="2015-03-23">
+ <addr>224.0.144.0-224.0.151.255</addr>
+ <description>VZ-Multicast-Public</description>
+ <xref type="person" data="Stephen_Ray_Middleton"/>
+ </record>
+ <record date="2016-04-19">
+ <addr>224.0.152.0-224.0.152.255</addr>
+ <description>cse-md</description>
+ <xref type="person" data="David_Brett"/>
+ </record>
+ <record date="2016-05-24" updated="2019-08-29">
+ <addr>224.0.153.0-224.0.156.255</addr>
+ <description>Telia Norway mcast</description>
+ <xref type="person" data="Henrik_Lans"/>
+ <controller>
+ <xref type="person" data="Telia-Norway-Get-NOC"/>
+ </controller>
+ </record>
+ <record date="2017-01-23" updated="2023-04-27">
+ <addr>224.0.157.0-224.0.157.255</addr>
+ <description>London Metal Exchange</description>
+ <xref type="person" data="LME_Networks"/>
+ <controller>
+ <xref type="person" data="London_Metal_Exchange"/>
+ </controller>
+ </record>
+ <record date="2017-01-23">
+ <addr>224.0.158.0-224.0.159.255</addr>
+ <description>TriAct Canada Marketplace LP</description>
+ <xref type="person" data="Hatice_Unal"/>
+ </record>
+ <record date="2016-07-07">
+ <addr>224.0.160.0-224.0.165.255</addr>
+ <description>Deutsche Boerse</description>
+ <xref type="person" data="Bernd_Uphoff"/>
+ </record>
+ <record date="2017-02-17">
+ <addr>224.0.166.0-224.0.167.255</addr>
+ <description>Virgin Connect IPTV</description>
+ <xref type="person" data="Vladimir_Shishkov"/>
+ </record>
+ <record date="2017-12-05">
+ <addr>224.0.168.0-224.0.169.255</addr>
+ <description>Deutsche Boerse</description>
+ <xref type="person" data="Bernd_Uphoff"/>
+ </record>
+ <record date="2018-06-07">
+ <addr>224.0.170.0-224.0.170.255</addr>
+ <description>MVS-IPTV4</description>
+ <xref type="person" data="Justin_Beaman"/>
+ <controller>
+ <xref type="person" data="Midwest_Video_Solutions"/>
+ </controller>
+ </record>
+ <record date="2019-01-25">
+ <addr>224.0.171.0-224.0.171.255</addr>
+ <description>COINBASE-MARKETS</description>
+ <xref type="person" data="Gavin_McKee"/>
+ <controller><xref type="person" data="Coinbase"/></controller>
+ </record>
+ <record date="2018-06-19">
+ <addr>224.0.172.0-224.0.175.255</addr>
+ <description>Deutsche Boerse</description>
+ <xref type="person" data="Bernd_Uphoff"/>
+ </record>
+ <record date="2018-07-31">
+ <addr>224.0.176.0-224.0.179.255</addr>
+ <description>MIAX-EX-3-4-5</description>
+ <xref type="person" data="Gamini_Karunaratne"/>
+ <controller><xref type="person" data="MIAX"/></controller>
+ </record>
+ <record date="2019-02-13">
+ <addr>224.0.180.0-224.0.181.255</addr>
+ <description>CBOE Europe</description>
+ <xref type="person" data="Jason_Ives"/>
+ <controller><xref type="person" data="CBOE_Europe"/></controller>
+ </record>
+ <record date="2019-02-28">
+ <addr>224.0.182.0-224.0.183.255</addr>
+ <description>ALCOM-TV</description>
+ <xref type="person" data="TV_System_Administrators"/>
+ <controller><xref type="person" data="Ålands_Telekommunikation_Ab"/></controller>
+ </record>
+ <record date="2019-08-28">
+ <addr>224.0.184.0-224.0.184.255</addr>
+ <description>AQUIS-EXCHANGE</description>
+ <xref type="person" data="Paul_Roberts"/>
+ <controller>
+ <xref type="person" data="Aquis_Exchange_PLC"/>
+ </controller>
+ </record>
+ <record date="2019-09-12" updated="2019-10-01">
+ <addr>224.0.185.0-224.0.185.255</addr>
+ <description>Hanweck Associates</description>
+ <xref type="person" data="Svetlana_Kachintseva"/>
+ <controller>
+ <xref type="person" data="Hanweck_Associates"/>
+ </controller>
+ </record>
+ <record date="2019-10-02">
+ <addr>224.0.186.0-224.0.186.255</addr>
+ <description>BOX Options Market</description>
+ <xref type="person" data="Alexandre_Gomes"/>
+ <controller>
+ <xref type="person" data="BOX_TECHNOLOGY_CANADA_INC."/>
+ </controller>
+ </record>
+ <record date="2019-11-13">
+ <addr>224.0.187.0-224.0.188.255</addr>
+ <description>MVS-IPTV5</description>
+ <xref type="person" data="Justin_Beaman"/>
+ <controller>
+ <xref type="person" data="Midwest_Video_Solutions"/>
+ </controller>
+ </record>
+ <record date="2021-03-23">
+ <addr>224.0.189.0-224.0.189.255</addr>
+ <description>Ido Rosen</description>
+ <xref type="person" data="Ido_Rosen"/>
+ <controller>
+ <xref type="person" data="Ido_Rosen"/>
+ </controller>
+ </record>
+ <record date="2020-10-01" updated="2020-10-15">
+ <addr>224.0.190.0-224.0.191.255</addr>
+ <description>RTP Media</description>
+ <xref type="person" data="Vadim_B._Kantor"/>
+ <controller>
+ <xref type="person" data="RTP_Media"/>
+ </controller>
+ </record>
+ <record date="2021-04-01">
+ <addr>224.0.192.0-224.0.207.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2021-04-13" updated="2021-06-11">
+ <addr>224.0.208.0-224.0.213.255</addr>
+ <description>Euronext</description>
+ <xref type="person" data="Euronext_Admin"/>
+ <controller><xref type="person" data="Euronext_Admin"/></controller>
+ </record>
+ <record date="2021-06-11">
+ <addr>224.0.214.0-224.0.214.255</addr>
+ <description>OSK B2B mVPN distribution</description>
+ <xref type="person" data="Attila_Miklóš"/>
+ <controller>
+ <xref type="person" data="IPadmin_-_Orange_Slovensko_a.s."/>
+ </controller>
+ </record>
+ <record date="2022-01-06">
+ <addr>224.0.215.0-224.0.215.255</addr>
+ <description>Tradeweb CLOB</description>
+ <xref type="person" data="Ruben_Hernandez"/>
+ <controller>
+ <xref type="person" data="Tradeweb_Markets_Inc"/>
+ </controller>
+ </record>
+ <record date="2021-07-30">
+ <addr>224.0.216.0-224.0.219.255</addr>
+ <description>RTP Media</description>
+ <xref type="person" data="Vadim_B._Kantor"/>
+ <controller>
+ <xref type="person" data="RTP_Media"/>
+ </controller>
+ </record>
+ <record date="2021-09-07">
+ <addr>224.0.220.0-224.0.223.255</addr>
+ <description>Japan Exchange Group</description>
+ <xref type="person" data="Japan_Exchange_Group"/>
+ <controller>
+ <xref type="person" data="Japan_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2021-12-21">
+ <addr>224.0.224.0-224.0.224.255</addr>
+ <description>AQUIS-EXCHANGE</description>
+ <xref type="person" data="Paul_Roberts"/>
+ <controller>
+ <xref type="person" data="Aquis_Exchange_PLC"/>
+ </controller>
+ </record>
+ <record date="2022-08-26" updated="2022-08-31">
+ <addr>224.0.225.0-224.0.225.255</addr>
+ <description>Kalejdo TV</description>
+ <xref type="person" data="Kalejdo_TV"/>
+ <controller>
+ <xref type="person" data="Thomas_Sörlin"/>
+ </controller>
+ </record>
+ <record date="2022-06-09">
+ <addr>224.0.226.0-224.0.227.255</addr>
+ <description>MVS-IPTV6</description>
+ <xref type="person" data="Justin_Beaman"/>
+ <controller>
+ <xref type="person" data="Midwest_Video_Solutions"/>
+ </controller>
+ </record>
+ <record date="2022-02-01" updated="2023-04-27">
+ <addr>224.0.228.0-224.0.231.255</addr>
+ <description>London Metal Exchange</description>
+ <xref type="person" data="LME_Networks"/>
+ <controller>
+ <xref type="person" data="London_Metal_Exchange"/>
+ </controller>
+ </record>
+ <record date="2022-02-17">
+ <addr>224.0.232.0-224.0.239.255</addr>
+ <description>Lucera Financial Infra</description>
+ <xref type="person" data="Kevin_McNicholas"/>
+ <controller>
+ <xref type="person" data="Lucera_Financial_Infrastructures"/>
+ </controller>
+ </record>
+ <record date="2022-05-26" updated="2023-04-27">
+ <addr>224.0.240.0-224.0.243.255</addr>
+ <description>London Metal Exchange</description>
+ <xref type="person" data="LME_Networks"/>
+ <controller>
+ <xref type="person" data="London_Metal_Exchange"/>
+ </controller>
+ </record>
+ <record date="2023-05-19">
+ <addr>224.0.244.0-224.0.244.255</addr>
+ <description>Clearpool AMS</description>
+ <xref type="person" data="Charles_Gomes"/>
+ <controller>
+ <xref type="person" data="Clearpool"/>
+ </controller>
+ </record>
+ <record date="2023-08-29">
+ <addr>224.0.245.0-224.0.245.255</addr>
+ <description>OneChronos</description>
+ <xref type="person" data="Kelly_Littlepage"/>
+ <controller>
+ <xref type="person" data="OCX_Group_Inc"/>
+ </controller>
+ </record>
+ <record>
+ <addr>224.0.246.0-224.0.249.255</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2009-09-01">
+ <addr>224.0.250.0-224.0.251.255</addr>
+ <description>KPN Broadcast Services</description>
+ <xref type="person" data="Ad_C_Spelt"/>
+ <xref type="person" data="KPN_IP_Office"/>
+ </record>
+ <record date="2005-08-01">
+ <addr>224.0.252.0-224.0.252.255</addr>
+ <description>KPN Broadcast Services</description>
+ <xref type="person" data="Ad_C_Spelt"/>
+ <xref type="person" data="KPN_IP_Office"/>
+ </record>
+ <record date="2005-08-01">
+ <addr>224.0.253.0-224.0.253.255</addr>
+ <description>KPN Broadcast Services</description>
+ <xref type="person" data="Ad_C_Spelt"/>
+ <xref type="person" data="KPN_IP_Office"/>
+ </record>
+ <record date="2006-03-31">
+ <addr>224.0.254.0-224.0.254.255</addr>
+ <description>Intelsat IPTV</description>
+ <xref type="person" data="Karl_Elad"/>
+ <reviewed>2011-02-22</reviewed>
+ </record>
+ <record date="2006-03-31">
+ <addr>224.0.255.0-224.0.255.255</addr>
+ <description>Intelsat IPTV</description>
+ <xref type="person" data="Karl_Elad"/>
+ <reviewed>2011-02-22</reviewed>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-4">
+ <title>RESERVED (224.1.0.0-224.1.255.255 (224.1/16))</title>
+ <xref type="rfc" data="rfc5771"/>
+ <note>No new assignments are being made in this range for the time being.</note>
+ <record>
+ <addr>224.1.0.0-224.1.0.37</addr>
+ <description>Reserved</description>
+ <xref type="rfc" data="rfc5771"/>
+ </record>
+ <record date="2004-05-01">
+ <addr>224.1.0.38</addr>
+ <description>dantz</description>
+ <xref type="person" data="Richard_Zulch"/>
+ </record>
+ <record>
+ <addr>224.1.0.39-224.1.1.255</addr>
+ <description>Reserved</description>
+ <xref type="rfc" data="rfc5771"/>
+ </record>
+ <record date="2006-02-17" updated="2018-04-20">
+ <addr>224.1.2.0-224.1.2.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record date="2006-05-22">
+ <addr>224.1.3.0-224.1.4.255</addr>
+ <description>NOB Cross media facilities</description>
+ <xref type="person" data="Technicolor_NL_NOC"/>
+ </record>
+ <record>
+ <addr>224.1.5.0-224.1.255.255</addr>
+ <description>Reserved</description>
+ <xref type="rfc" data="rfc5771"/>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-5">
+ <title>SDP/SAP Block (224.2.0.0-224.2.255.255 (224.2/16))</title>
+ <xref type="rfc" data="rfc5771"/>
+ <record>
+ <addr>224.2.0.0-224.2.127.253</addr>
+ <description>Multimedia Conference Calls</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ <record>
+ <addr>224.2.127.254</addr>
+ <description>SAPv1 Announcements</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ <record>
+ <addr>224.2.127.255</addr>
+ <description>SAPv0 Announcements (deprecated)</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ <record>
+ <addr>224.2.128.0-224.2.255.255</addr>
+ <description>SAP Dynamic Assignments</description>
+ <xref type="person" data="Steve_Casner"/>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-6">
+ <title>AD-HOC Block II (224.3.0.0-224.4.255.255 (224.3/16, 224.4/16))</title>
+ <xref type="rfc" data="rfc5771"/>
+ <registration_rule>Expert Review, IESG Approval, or Standards Action</registration_rule>
+ <note title="Request an Assignment">
+<xref type="uri" data="https://www.iana.org/protocols/apply"/>
+
+ </note>
+ <record date="1999-03-01">
+ <addr>224.3.0.0-224.3.0.63</addr>
+ <description>Nasdaqmdfeeds (re-new/March 2003)</description>
+ <xref type="person" data="Michael_Rosenberg"/>
+ </record>
+ <record>
+ <addr>224.3.0.64-224.3.255.255</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2006-03-31" updated="2021-10-28">
+ <addr>224.4.0.0-224.4.0.255</addr>
+ <description>London Stock Exchange Group</description>
+ <xref type="person" data="Johnathan_Ryder"/>
+ <controller>
+ <xref type="person" data="London_Stock_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2008-02-25" updated="2021-10-28">
+ <addr>224.4.1.0-224.4.1.255</addr>
+ <description>London Stock Exchange Group</description>
+ <xref type="person" data="Johnathan_Ryder"/>
+ <controller>
+ <xref type="person" data="London_Stock_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2008-02-29" updated="2021-10-28">
+ <addr>224.4.2.0-224.4.2.255</addr>
+ <description>London Stock Exchange Group</description>
+ <xref type="person" data="Johnathan_Ryder"/>
+ <controller>
+ <xref type="person" data="London_Stock_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2008-12-24" updated="2021-10-28">
+ <addr>224.4.3.0-224.4.4.255</addr>
+ <description>London Stock Exchange Group</description>
+ <xref type="person" data="Johnathan_Ryder"/>
+ <controller>
+ <xref type="person" data="London_Stock_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2009-05-12" updated="2021-10-28">
+ <addr>224.4.5.0-224.4.6.255</addr>
+ <description>London Stock Exchange Group</description>
+ <xref type="person" data="Johnathan_Ryder"/>
+ <controller>
+ <xref type="person" data="London_Stock_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2012-04-10">
+ <addr>224.4.7.0-224.4.7.255</addr>
+ <description>CBOE Holdings</description>
+ <xref type="person" data="John_Rittner"/>
+ </record>
+ <record date="2012-04-11" updated="2016-05-06">
+ <addr>224.4.8.0-224.4.9.255</addr>
+ <description>ISE</description>
+ <xref type="person" data="ISE-Networks"/>
+ </record>
+ <record date="2012-04-11" updated="2021-10-28">
+ <addr>224.4.10.0-224.4.13.255</addr>
+ <description>London Stock Exchange Group</description>
+ <xref type="person" data="Johnathan_Ryder"/>
+ <controller>
+ <xref type="person" data="London_Stock_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2018-01-04" updated="2021-10-28">
+ <addr>224.4.14.0-224.4.17.255</addr>
+ <description>London Stock Exchange Group</description>
+ <xref type="person" data="Johnathan_Ryder"/>
+ <controller>
+ <xref type="person" data="London_Stock_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2021-02-04">
+ <addr>224.4.18.0-224.4.21.255</addr>
+ <description>London Stock Exchange Group</description>
+ <xref type="person" data="Johnathan_Ryder"/>
+ <controller>
+ <xref type="person" data="London_Stock_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2021-09-21">
+ <addr>224.4.22.0-224.4.23.255</addr>
+ <description>London Stock Exchange Group</description>
+ <xref type="person" data="Johnathan_Ryder"/>
+ <controller>
+ <xref type="person" data="London_Stock_Exchange_Group"/>
+ </controller>
+ </record>
+ <record date="2023-01-18">
+ <addr>224.4.24.0-224.4.31.255</addr>
+ <description>Fenics Market Data</description>
+ <xref type="person" data="Steve_Loizou"/>
+ <controller>
+ <xref type="person" data="Cantor_Fitzgerald"/>
+ </controller>
+ </record>
+ <record date="2023-03-15">
+ <addr>224.4.32.0-224.4.33.255</addr>
+ <description>Global Futures &amp; Options Ltd</description>
+ <xref type="person" data="David_Beattie"/>
+ <controller>
+ <xref type="person" data="Global_Futures_and_Options_Limited"/>
+ </controller>
+ </record>
+ <record date="2023-05-24">
+ <addr>224.4.34.0-224.4.39.255</addr>
+ <description>MIAX-3</description>
+ <xref type="person" data="Gamini_Karunaratne"/>
+ <controller><xref type="person" data="MIAX"/></controller>
+ </record>
+ <record>
+ <addr>224.4.40.0-224.4.47.255</addr>
+ <description>Unassigned</description>
+ </record>
+ <record date="2023-04-10">
+ <addr>224.4.48.0-224.4.63.255</addr>
+ <description>Intercontinental Exchange, Inc.</description>
+ <xref type="person" data="RIR_Admin"/>
+ <controller>
+ <xref type="person" data="Intercontinental_Exchange_Inc."/>
+ </controller>
+ </record>
+ <record>
+ <addr>224.4.64.0-224.4.255.255</addr>
+ <description>Unassigned</description>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-7">
+ <title>RESERVED (224.5.0.0-224.251.255.255 (251 /16s))</title>
+ <xref type="rfc" data="rfc5771"/>
+ <record>
+ <addr>224.5.0.0-224.251.255.255</addr>
+ <description>Reserved</description>
+ <xref type="rfc" data="rfc5771"/>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-8">
+ <title>DIS Transient Groups 224.252.0.0-224.255.255.255 (224.252/14))</title>
+ <xref type="rfc" data="rfc2365"/>
+ <record>
+ <addr>224.252.0.0-224.255.255.255</addr>
+ <description>DIS Transient Groups</description>
+ <xref type="person" data="IANA"/>
+ <xref type="rfc" data="rfc2365"/>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-9">
+ <title>RESERVED (225.0.0.0-231.255.255.255 (7 /8s))</title>
+ <xref type="rfc" data="rfc5771"/>
+ <record>
+ <addr>225.0.0.0-231.255.255.255</addr>
+ <description>Reserved</description>
+ <xref type="rfc" data="rfc5771"/>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-10">
+ <title>Source-Specific Multicast Block (232.0.0.0-232.255.255.255 (232/8))</title>
+ <xref type="rfc" data="rfc5771"/>
+ <note>Addresses within the 232.0.1.0-232.255.255.255 are dynamically
+allocated by hosts when needed <xref type="rfc" data="rfc4607"/></note>
+ <record>
+ <addr>232.0.0.0</addr>
+ <description>Reserved</description>
+ <xref type="rfc" data="rfc4607"/>
+ </record>
+ <record>
+ <addr>232.0.0.1-232.0.0.255</addr>
+ <description>Reserved for IANA allocation</description>
+ <xref type="rfc" data="rfc4607"/>
+ </record>
+ <record>
+ <addr>232.0.1.0-232.255.255.255</addr>
+ <description>Reserved for local host allocation</description>
+ <xref type="rfc" data="rfc4607"/>
+ </record>
+ </registry>
+
+
+ <registry id="glop">
+ <title>GLOP Block</title>
+ <xref type="rfc" data="rfc3180"/>
+ <record>
+ <addr>233.0.0.0-233.251.255.255</addr>
+ <description>GLOP Block</description>
+ <xref type="rfc" data="rfc3180"/>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-11">
+ <title>AD-HOC Block III (233.252.0.0-233.255.255.255 (233.252/14))</title>
+ <xref type="rfc" data="rfc5771"/>
+ <registration_rule>Expert Review, IESG Approval, or Standards Action</registration_rule>
+ <note title="Request an Assignment">
+<xref type="uri" data="https://www.iana.org/protocols/apply"/>
+
+ </note>
+ <record date="2010-01-20">
+ <addr>233.252.0.0-233.252.0.255</addr>
+ <description>MCAST-TEST-NET</description>
+ <xref type="person" data="IANA"/>
+ <xref type="rfc" data="rfc5771"/>
+ <xref type="rfc" data="rfc6676"/>
+ <reviewed>2010-01-20</reviewed>
+ </record>
+ <record date="2010-08-12" updated="2021-12-17">
+ <addr>233.252.1.0-233.252.1.255</addr>
+ <description>Pico</description>
+ <xref type="person" data="Pico_Sales"/>
+ <controller>
+ <xref type="person" data="Pico"/>
+ </controller>
+ </record>
+ <record date="2010-08-12">
+ <addr>233.252.2.0-233.252.7.255</addr>
+ <description>Tradition</description>
+ <xref type="person" data="Tradition_Network_Operations_and_Command_Center"/>
+ </record>
+ <record date="2010-08-12">
+ <addr>233.252.8.0-233.252.11.255</addr>
+ <description>BVMF_MKT_DATA</description>
+ <xref type="person" data="Roberto_Costa_Simoes"/>
+ </record>
+ <record date="2010-09-14">
+ <addr>233.252.12.0-233.252.13.255</addr>
+ <description>blizznet-tv-services</description>
+ <xref type="person" data="Paul_Wallner"/>
+ </record>
+ <record date="2016-09-27">
+ <addr>233.252.14.0-233.252.17.255</addr>
+ <description>BVMF_MKT_DATA_2</description>
+ <xref type="person" data="Guilherme_Longanezi"/>
+ </record>
+ <record date="2021-12-17">
+ <addr>233.252.18.0-233.252.18.255</addr>
+ <description>Pico</description>
+ <xref type="person" data="Pico_Sales"/>
+ <controller>
+ <xref type="person" data="Pico"/>
+ </controller>
+ </record>
+ <record>
+ <addr>233.252.19.0-233.255.255.255</addr>
+ <description>Unassigned</description>
+ </record>
+ </registry>
+
+ <registry id="unicast-prefix-based">
+ <title>Unicast-Prefix-based IPv4 Multicast Addresses</title>
+ <xref type="rfc" data="rfc6034"/>
+ <record date="2010-08-11">
+ <addr>234.0.0.0-234.255.255.255</addr>
+ <description>Unicast-Prefix-based IPv4 Multicast Addresses</description>
+ <xref type="rfc" data="rfc6034"/>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-12">
+ <title>Scoped Multicast Ranges</title>
+ <xref type="rfc" data="rfc5771"/>
+ <record>
+ <addr>235.0.0.0-238.255.255.255</addr>
+ <description>Reserved</description>
+ <xref type="rfc" data="rfc5771"/>
+ </record>
+ <record date="1997-01-01">
+ <addr>239.0.0.0-239.255.255.255</addr>
+ <description>Organization-Local Scope</description>
+ <xref type="person" data="David_Meyer"/>
+ <xref type="rfc" data="rfc2365"/>
+ </record>
+ </registry>
+
+
+ <registry id="multicast-addresses-13">
+ <title>Relative Addresses used with Scoped Multicast Addresses</title>
+ <xref type="rfc" data="rfc5771"/>
+ <note>(*) It is only appropriate to use these values in explicitly-
+configured experiments; they MUST NOT be shipped as defaults in
+implementations. See <xref type="rfc" data="rfc3692"/> for details.
+
+These addresses are listed in the Domain Name Service under MCAST.NET
+and 224.IN-ADDR.ARPA.
+
+Note that when used on an Ethernet or IEEE 802 network, the 23
+low-order bits of the IP Multicast address are placed in the low-order
+23 bits of the Ethernet or IEEE 802 net multicast address
+1.0.94.0.0.0. See the section on "IANA ETHERNET ADDRESS BLOCK".</note>
+ <record date="1998-12-01">
+ <relative>0</relative>
+ <description>SAP Session Announcement Protocol</description>
+ <xref type="person" data="Mark_Handley"/>
+ </record>
+ <record>
+ <relative>1</relative>
+ <description>MADCAP Protocol</description>
+ <xref type="rfc" data="rfc2730"/>
+ </record>
+ <record date="2001-12-01">
+ <relative>2</relative>
+ <description>SLPv2 Discovery</description>
+ <xref type="person" data="Erik_Guttman"/>
+ </record>
+ <record date="2000-06-01">
+ <relative>3</relative>
+ <description>MZAP</description>
+ <xref type="person" data="Dave_Thaler"/>
+ </record>
+ <record date="1999-08-01">
+ <relative>4</relative>
+ <description>Multicast Discovery of DNS Services</description>
+ <xref type="person" data="Bill_Manning"/>
+ </record>
+ <record date="2006-06-27">
+ <relative>5</relative>
+ <description>SSDP</description>
+ <xref type="person" data="UPnP_Forum"/>
+ </record>
+ <record date="1999-10-01">
+ <relative>6</relative>
+ <description>DHCP v4</description>
+ <xref type="person" data="Eric_Hall"/>
+ </record>
+ <record date="2000-07-01">
+ <relative>7</relative>
+ <description>AAP</description>
+ <xref type="person" data="Stephen_Hanna"/>
+ </record>
+ <record>
+ <relative>8</relative>
+ <description>MBUS</description>
+ <xref type="rfc" data="rfc3259"/>
+ </record>
+ <record date="2006-06-27">
+ <relative>9</relative>
+ <description>UPnP</description>
+ <xref type="person" data="UPnP_Forum"/>
+ </record>
+ <record>
+ <relative>10</relative>
+ <description>MCAST-TEST-NET-2</description>
+ <xref type="rfc" data="rfc6676"/>
+ </record>
+ <record>
+ <relative>11-252</relative>
+ <description>Unassigned</description>
+ </record>
+ <record>
+ <relative>253</relative>
+ <description>Reserved</description>
+ </record>
+ <record>
+ <relative>254</relative>
+ <description>RFC3692-style Experiment (*)</description>
+ <xref type="rfc" data="rfc4727"/>
+ </record>
+ <record>
+ <relative>255</relative>
+ <description>Unassigned</description>
+ </record>
+ </registry>
+
+ <people>
+ <person id="_3GPP">
+ <org>3GPP</org>
+ <uri>https://www.3gpp.org</uri>
+ </person>
+ <person id="Ad_C_Spelt">
+ <name>Ad C. Spelt</name>
+ <uri>mailto:a.c.spelt&amp;kpn.com</uri>
+ <updated>2009-09-01</updated>
+ </person>
+ <person id="Adam_DeMinter">
+ <name>Adam DeMinter</name>
+ <uri>mailto:adam.deminter&amp;mwt.net</uri>
+ <updated>2011-04-20</updated>
+ </person>
+ <person id="Adam_Yellen">
+ <name>Adam Yellen</name>
+ <uri>mailto:adam&amp;videofurnace.com</uri>
+ <updated>2009-08-12</updated>
+ </person>
+ <person id="Akihiro_Nishida">
+ <name>Akihiro Nishida</name>
+ <uri>mailto:nishida&amp;src.ricoh.co.jp</uri>
+ <updated>2003-02-01</updated>
+ </person>
+ <person id="Alan_Novick">
+ <name>Alan Novick</name>
+ <uri>mailto:anovick&amp;tdc.com</uri>
+ <updated>1998-08-01</updated>
+ </person>
+ <person id="Alan_Robertson">
+ <name>Alan Robertson</name>
+ <uri>mailto:alanr&amp;unix.sh</uri>
+ <updated>2012-04-17</updated>
+ </person>
+ <person id="Ålands_Telekommunikation_Ab">
+ <org>Ålands Telekommunikation Ab</org>
+ <uri>mailto:tv-noc&amp;alcom.ax</uri>
+ <updated>2019-02-28</updated>
+ </person>
+ <person id="Alex_Lee">
+ <name>Alex Lee</name>
+ <uri>mailto:alex_mrlee&amp;gemtek.com.tw</uri>
+ <updated>2002-10-01</updated>
+ </person>
+ <person id="Alexander_Pevzner">
+ <name>Alexander Pevzner</name>
+ <uri>mailto:pzz&amp;pzz.msk.ru</uri>
+ <updated>2006-03-17</updated>
+ </person>
+ <person id="Alexandre_Gomes">
+ <name>Alexandre Gomes</name>
+ <uri>mailto:agomes&amp;boxtechnology.com</uri>
+ <updated>2019-10-02</updated>
+ </person>
+ <person id="Andrew_Brown">
+ <name>Andrew Brown</name>
+ <uri>mailto:abrown&amp;batstrading.com</uri>
+ <updated>2014-03-05</updated>
+ </person>
+ <person id="Andrew_Cherenson">
+ <name>Andrew Cherenson</name>
+ <uri>mailto:arc&amp;sgi.com</uri>
+ </person>
+ <person id="Andrew_Rowley">
+ <name>Andrew Rowley</name>
+ <uri>mailto:Andrew.Rowley&amp;manchester.ac.uk</uri>
+ <updated>2006-06-09</updated>
+ </person>
+ <person id="Andy_Belk">
+ <name>Andy Belk</name>
+ <uri>mailto:register1&amp;azulsystems.com</uri>
+ <updated>2005-02-01</updated>
+ </person>
+ <person id="Andy_Crick">
+ <name>Andy Crick</name>
+ <uri>mailto:acrick&amp;haascnc.com</uri>
+ <updated>2008-01-14</updated>
+ </person>
+ <person id="Anthony_Daga">
+ <name>Anthony Daga</name>
+ <uri>mailto:anthony&amp;mksrc.com</uri>
+ <updated>1999-06-01</updated>
+ </person>
+ <person id="Antonio_Querubin">
+ <name>Antonio Querubin</name>
+ <uri>mailto:tony&amp;lava.net</uri>
+ <updated>2008-02-04</updated>
+ </person>
+ <person id="Applykane">
+ <org>Applykane Technologies Private Limited</org>
+ <uri>mailto:applykane&amp;gmail.com</uri>
+ <updated>2017-05-19</updated>
+ </person>
+ <person id="Aquis_Exchange_PLC">
+ <org>Aquis Exchange PLC</org>
+ <uri>mailto:networks&amp;aquis.eu</uri>
+ <updated>2021-12-21</updated>
+ </person>
+ <person id="Architecture_Team">
+ <name>Architecture Team</name>
+ <uri>mailto:tech.arch&amp;quantifytechnology.com</uri>
+ <updated>2018-01-31</updated>
+ </person>
+ <person id="Arnoud_Zwemmer">
+ <name>Arnoud Zwemmer</name>
+ <uri>mailto:arnoud&amp;nwn.nl</uri>
+ <updated>1996-11-01</updated>
+ </person>
+ <person id="Asad_Gilani">
+ <name>Asad Gilani</name>
+ <uri>mailto:agilani&amp;nymex.com</uri>
+ <updated>1997-07-01</updated>
+ </person>
+ <person id="Asia_Digital_Exchange">
+ <name>Asia Digital Exchange</name>
+ <uri>mailto:it_infra&amp;asianext.com</uri>
+ <updated>2023-03-06</updated>
+ </person>
+ <person id="Attila_Miklóš">
+ <name>Attila Miklóš</name>
+ <uri>mailto:attila.miklos&amp;orange.com</uri>
+ <updated>2021-06-11</updated>
+ </person>
+ <person id="BATS_Europe_NOC">
+ <name>BATS Europe NOC</name>
+ <uri>mailto:noceurope&amp;bats.com</uri>
+ <updated>2017-06-23</updated>
+ </person>
+ <person id="Bernd_Uphoff">
+ <name>Bernd Uphoff</name>
+ <uri>mailto:bernd.uphoff&amp;deutsche-boerse.com</uri>
+ <updated>2018-06-19</updated>
+ </person>
+ <person id="Bert_van_Willigen">
+ <name>Bert van Willigen</name>
+ <uri>mailto:bert.vanwilligen&amp;philips.com</uri>
+ <updated>2004-01-01</updated>
+ </person>
+ <person id="Beverly_Schwartz">
+ <name>Beverly Schwartz</name>
+ <uri>mailto:bschwart&amp;bbn.com</uri>
+ <updated>1998-06-01</updated>
+ </person>
+ <person id="Bill_Manning">
+ <name>Bill Manning</name>
+ <uri>mailto:bmanning&amp;isi.edu</uri>
+ <updated>1999-08-01</updated>
+ </person>
+ <person id="Bill_Schilit">
+ <name>Bill Schilit</name>
+ <uri>mailto:schilit&amp;parc.xerox.com</uri>
+ </person>
+ <person id="Bill_Simpson">
+ <name>Bill Simpson</name>
+ <uri>mailto:bill.simpson&amp;um.cc.umich.edu</uri>
+ <updated>1994-11-01</updated>
+ </person>
+ <person id="Bill_Woodcock">
+ <name>Bill Woodcock</name>
+ <uri>mailto:woody&amp;zocalo.net</uri>
+ <updated>1998-11-01</updated>
+ </person>
+ <person id="Bob_Braden">
+ <name>Bob Braden</name>
+ <uri>mailto:braden&amp;isi.edu</uri>
+ <updated>1996-04-01</updated>
+ </person>
+ <person id="Bob_Brzezinski">
+ <name>Bob Brzezinski</name>
+ <uri>mailto:bob.brzezinski&amp;activfinancial.com</uri>
+ <updated>2005-10-28</updated>
+ </person>
+ <person id="Bob_Gaddie">
+ <name>Bob Gaddie</name>
+ <uri>mailto:bobg&amp;dtn.com</uri>
+ <updated>1998-08-01</updated>
+ </person>
+ <person id="Bob_Meier">
+ <name>Bob Meier</name>
+ <uri>mailto:meierb&amp;norand.com</uri>
+ <updated>1997-12-01</updated>
+ </person>
+ <person id="Bob_Scheifler">
+ <name>Bob Scheifler</name>
+ <uri>mailto:Bob.Scheifler&amp;sun.com</uri>
+ <updated>1998-08-01</updated>
+ </person>
+ <person id="Bob_Sledge">
+ <name>Bob Sledge</name>
+ <uri>mailto:bob&amp;pqsystems.com</uri>
+ <updated>1998-12-01</updated>
+ </person>
+ <person id="Bodo_Rueskamp">
+ <name>Bodo Rueskamp</name>
+ <uri>mailto:br&amp;itchigo.com</uri>
+ <updated>2000-03-01</updated>
+ </person>
+ <person id="BOX_TECHNOLOGY_CANADA_INC.">
+ <org>BOX TECHNOLOGY CANADA INC.</org>
+ <updated>2019-10-04</updated>
+ </person>
+ <person id="Brendan_Eic">
+ <name>Brendan Eic</name>
+ <uri>mailto:brendan&amp;illyria.wpd.sgi.com</uri>
+ </person>
+ <person id="Brian_Kean">
+ <name>Brian Kean</name>
+ <uri>mailto:bkean&amp;dca.com</uri>
+ <updated>1995-08-01</updated>
+ </person>
+ <person id="Brian_Kerkan">
+ <name>Brian Kerkan</name>
+ <uri>mailto:brian&amp;satcomsystems.com</uri>
+ <updated>2000-05-01</updated>
+ </person>
+ <person id="Brian_Martinicky">
+ <name>Brian Martinicky</name>
+ <uri>mailto:Brian_Martinicky&amp;automationintelligence.com</uri>
+ <updated>2000-03-01</updated>
+ </person>
+ <person id="Brian_Trudeau">
+ <name>Brian Trudeau</name>
+ <uri>mailto:btrudeau&amp;onechicago.com</uri>
+ <updated>2014-09-19</updated>
+ </person>
+ <person id="Bruce_Factor">
+ <name>Bruce Factor</name>
+ <uri>mailto:ahi!bigapple!bruce&amp;uunet.uu.net</uri>
+ </person>
+ <person id="Bryan_Costales">
+ <name>Bryan Costales</name>
+ <uri>mailto:bcx&amp;infobeat.com</uri>
+ <updated>1997-09-01</updated>
+ </person>
+ <person id="Bryant_Eastham">
+ <name>Bryant Eastham</name>
+ <uri>mailto:protocol&amp;opendof.org</uri>
+ <updated>2015-04-23</updated>
+ </person>
+ <person id="BSE">
+ <org>Beirut Stock Exchange</org>
+ <uri>mailto:itd&amp;bse.com.lb</uri>
+ <updated>2019-01-17</updated>
+ </person>
+ <person id="Caleb_Bell">
+ <name>Caleb Bell</name>
+ <uri>mailto:cbell&amp;rxnetworks.com</uri>
+ <updated>2012-11-19</updated>
+ </person>
+ <person id="Carl-Johan_Sjöberg">
+ <name>Carl-Johan Sjöberg</name>
+ <uri>mailto:cjs&amp;bitsend.se</uri>
+ <updated>2012-04-25</updated>
+ </person>
+ <person id="Carl_Malamud">
+ <name>Carl Malamud</name>
+ <uri>mailto:carl&amp;media.org</uri>
+ <updated>2014-01-03</updated>
+ </person>
+ <person id="Cantor_Fitzgerald">
+ <org>Cantor Fitzgerald</org>
+ <uri>mailto:networkengineering&amp;cantor.com</uri>
+ <updated>2023-01-18</updated>
+ </person>
+ <person id="CBOE_Europe">
+ <org>CBOE Europe</org>
+ <uri>mailto:noceurope&amp;cboe.com</uri>
+ <updated>2019-02-13</updated>
+ </person>
+ <person id="Charles_Gomes">
+ <name>Charles Gomes</name>
+ <uri>mailto:noc&amp;clearpoolgroup.com</uri>
+ <updated>2023-06-05</updated>
+ </person>
+ <person id="Charles_Lo">
+ <name>Charles Lo</name>
+ <uri>mailto:clo&amp;qti.qualcomm.com</uri>
+ <updated>2022-11-02</updated>
+ </person>
+ <person id="Charles_Tewiah">
+ <name>Charles Tewiah</name>
+ <uri>mailto:charles.tewiah&amp;westlb-systems.co.uk</uri>
+ <updated>2005-09-01</updated>
+ </person>
+ <person id="Chas_Honton">
+ <name>Chas Honton</name>
+ <uri>mailto:chas&amp;secant.com</uri>
+ <updated>1997-12-01</updated>
+ </person>
+ <person id="Choon_Lee">
+ <name>Choon Lee</name>
+ <uri>mailto:cwl&amp;nsd.3com.com</uri>
+ <updated>1996-04-01</updated>
+ </person>
+ <person id="Chris_Adams">
+ <name>Chris Adams</name>
+ <uri>mailto:jc.adams&amp;reuters.com</uri>
+ <updated>2000-07-01</updated>
+ </person>
+ <person id="Christopher_Mettin">
+ <name>Christopher Mettin</name>
+ <uri>mailto:cmettin&amp;gqbc-online.com</uri>
+ <updated>2009-05-12</updated>
+ </person>
+ <person id="Chuck_McManis">
+ <name>Chuck McManis</name>
+ <uri>mailto:cmcmanis&amp;sun.com</uri>
+ </person>
+ <person id="Clearpool">
+ <org>Clearpool</org>
+ <uri>mailto:noc&amp;clearpoolgroup.com</uri>
+ <updated>2023-06-05</updated>
+ </person>
+ <person id="Clem_Verwey">
+ <name>Clem Verwey</name>
+ <uri>mailto:clemv&amp;jse.co.za</uri>
+ <updated>2011-12-07</updated>
+ </person>
+ <person id="Colin_Caughie">
+ <name>Colin Caughie</name>
+ <uri>mailto:cfc&amp;indigo-avs.com</uri>
+ <updated>2000-05-01</updated>
+ </person>
+ <person id="Coinbase">
+ <org>Coinbase</org>
+ <uri>mailto:markets-infra&amp;coinbase.com</uri>
+ <updated>2019-01-28</updated>
+ </person>
+ <person id="COMTECH_Kft.">
+ <org>COMTECH Kft.</org>
+ <uri>mailto:dev&amp;comtech.co.hu</uri>
+ <updated>2016-10-20</updated>
+ </person>
+ <person id="Craig_Dowell">
+ <name>Craig Dowell</name>
+ <uri>mailto:cdowell&amp;quicinc.com</uri>
+ <updated>2011-11-18</updated>
+ </person>
+ <person id="Dan_Jackson">
+ <name>Dan Jackson</name>
+ <uri>mailto:jdan&amp;us.ibm.com</uri>
+ <updated>1997-09-01</updated>
+ </person>
+ <person id="Dan_Jakubiec">
+ <name>Dan Jakubiec</name>
+ <uri>mailto:dan.jakubiec&amp;systech.com</uri>
+ <updated>2006-09-21</updated>
+ </person>
+ <person id="Daniel_Dissett">
+ <name>Daniel Dissett</name>
+ <uri>mailto:ddissett&amp;peerlogic.com</uri>
+ <updated>1998-12-01</updated>
+ </person>
+ <person id="Daniel_Steinber">
+ <name>Daniel Steinber</name>
+ <uri>mailto:Daniel.Steinberg&amp;eng.sun.com</uri>
+ </person>
+ <person id="Darcy_Brockbank">
+ <name>Darcy Brockbank</name>
+ <uri>mailto:darcy&amp;hasc.com</uri>
+ <updated>1997-12-01</updated>
+ </person>
+ <person id="Darrell_Sveistrup">
+ <name>Darrell Sveistrup</name>
+ <uri>mailto:darrells&amp;truesolutions.net</uri>
+ <updated>1999-06-01</updated>
+ </person>
+ <person id="Dave_Cheriton">
+ <name>Dave Cheriton</name>
+ <uri>mailto:cheriton&amp;dsg.stanford.edu</uri>
+ </person>
+ <person id="Dave_Glanzer">
+ <name>Dave Glanzer</name>
+ <uri>mailto:dave.glanzer&amp;fieldbus.org</uri>
+ <updated>2003-03-01</updated>
+ </person>
+ <person id="Dave_Thaler">
+ <name>Dave Thaler</name>
+ <uri>mailto:dthaler&amp;microsoft.com</uri>
+ <updated>2000-06-01</updated>
+ </person>
+ <person id="David_Beattie">
+ <name>David Beattie</name>
+ <org>Global Futures and Options Limited</org>
+ <uri>mailto:david.beattie&amp;gfo-x.com</uri>
+ <updated>2023-03-15</updated>
+ </person>
+ <person id="David_Brett">
+ <name>David Brett</name>
+ <uri>mailto:david.brett&amp;thecse.com</uri>
+ <updated>2016-04-19</updated>
+ </person>
+ <person id="David_Meyer">
+ <name>David Meyer</name>
+ <uri>mailto:meyer&amp;ns.uoregon.edu</uri>
+ <updated>1997-01-01</updated>
+ </person>
+ <person id="David_Mills">
+ <name>David Mills</name>
+ <uri>mailto:mills&amp;udel.edu</uri>
+ </person>
+ <person id="David_Poole">
+ <name>David Poole</name>
+ <uri>mailto:davep&amp;extendsys.com</uri>
+ <updated>1997-04-01</updated>
+ </person>
+ <person id="David_Rubin">
+ <name>David Rubin</name>
+ <uri>mailto:drubin&amp;ncc.net</uri>
+ <updated>1996-08-01</updated>
+ </person>
+ <person id="David_Wilson">
+ <name>David Wilson</name>
+ <uri>mailto:dwilson&amp;m-x.ca</uri>
+ <updated>2013-05-30</updated>
+ </person>
+ <person id="Dean_Blackketter">
+ <name>Dean Blackketter</name>
+ <uri>mailto:dean&amp;corp.webtv.net</uri>
+ <updated>1998-11-01</updated>
+ </person>
+ <person id="Dino_Farinacci">
+ <name>Dino Farinacci</name>
+ <uri>mailto:dino&amp;procket.com</uri>
+ <updated>1996-03-01</updated>
+ </person>
+ <person id="Dirk_Koopman">
+ <name>Dirk Koopman</name>
+ <uri>mailto:djk&amp;tobit.co.uk</uri>
+ <updated>2000-07-01</updated>
+ </person>
+ <person id="Doug_Dillon">
+ <name>Doug Dillon</name>
+ <uri>mailto:dillon&amp;hns.com</uri>
+ <updated>1998-08-01</updated>
+ </person>
+ <person id="Douglas_Marquardt">
+ <name>Douglas Marquardt</name>
+ <uri>mailto:dmarquar&amp;woz.org</uri>
+ <updated>1997-02-01</updated>
+ </person>
+ <person id="Duane_Wessels">
+ <name>Duane Wessels</name>
+ <uri>mailto:wessels&amp;nlanr.net</uri>
+ <updated>1997-02-01</updated>
+ </person>
+ <person id="Ed_Moran">
+ <name>Ed Moran</name>
+ <uri>mailto:admin&amp;cruzjazz.com</uri>
+ <updated>1997-10-01</updated>
+ </person>
+ <person id="Ed_Purkiss">
+ <name>Ed Purkiss</name>
+ <uri>mailto:epurkiss&amp;wdmacodi.com</uri>
+ <updated>1998-09-01</updated>
+ </person>
+ <person id="Eric_Hall">
+ <name>Eric Hall</name>
+ <uri>mailto:ehall&amp;ntrg.com</uri>
+ <updated>1999-10-01</updated>
+ </person>
+ <person id="Erick_MacDonald_Filzek">
+ <name>Erick MacDonald Filzek</name>
+ <uri>mailto:filzek&amp;wisehome.io</uri>
+ <updated>2023-08-09</updated>
+ </person>
+ <person id="Erik_Guttman">
+ <name>Erik Guttman</name>
+ <uri>mailto:Erik.Guttman&amp;sun.com</uri>
+ <updated>2001-12-01</updated>
+ </person>
+ <person id="Ernst_EDER">
+ <name>Ernst EDER</name>
+ <uri>mailto:tech&amp;lonmark.org</uri>
+ <updated>2018-11-19</updated>
+ </person>
+ <person id="Euronext_Admin">
+ <name>Euronext Admin</name>
+ <uri>mailto:iana-admin&amp;euronext.com</uri>
+ <updated>2014-11-24</updated>
+ </person>
+ <person id="Evan_Caves">
+ <name>Evan Caves</name>
+ <uri>mailto:evan&amp;acc.com</uri>
+ <updated>1998-06-01</updated>
+ </person>
+ <person id="Florian_Weimer">
+ <name>Florian Weimer</name>
+ <uri>mailto:fweimer&amp;redhat.com</uri>
+ <updated>2013-02-08</updated>
+ </person>
+ <person id="Fred_Baker">
+ <name>Fred Baker</name>
+ <uri>mailto:fred&amp;cisco.com</uri>
+ <updated>1997-06-01</updated>
+ </person>
+ <person id="Gajendra_Shukla">
+ <name>Gajendra Shukla</name>
+ <uri>mailto:gshukla&amp;proxim.com</uri>
+ <updated>2002-02-01</updated>
+ </person>
+ <person id="Gamini_Karunaratne">
+ <name>Gamini Karunaratne</name>
+ <uri>mailto:gkarunaratne&amp;miami-holdings.com</uri>
+ <updated>2023-05-24</updated>
+ </person>
+ <person id="Gary_S_Malkin">
+ <name>Gary S. Malkin</name>
+ <uri>mailto:GMALKIN&amp;xylogics.com</uri>
+ </person>
+ <person id="Gary_Scott_Malkin">
+ <name>Gary Scott Malkin</name>
+ <uri>mailto:gmalkin&amp;baynetworks.com</uri>
+ <updated>1998-02-01</updated>
+ </person>
+ <person id="Gavin_McKee">
+ <name>Gavin McKee</name>
+ <uri>mailto:gav.mckee&amp;coinbase.com</uri>
+ <updated>2019-01-25</updated>
+ </person>
+ <person id="Gene_Marsh">
+ <name>Gene Marsh</name>
+ <uri>mailto:MarshM&amp;diebold.com</uri>
+ <updated>1998-11-01</updated>
+ </person>
+ <person id="Geoff_Golder">
+ <name>Geoff Golder</name>
+ <uri>mailto:geoffgolder&amp;gmail.com</uri>
+ <updated>2016-04-19</updated>
+ </person>
+ <person id="Geoff_Mendal">
+ <name>Geoff Mendal</name>
+ <uri>mailto:mendal&amp;talarian.com</uri>
+ <updated>1999-01-01</updated>
+ </person>
+ <person id="George_Neville-Neil">
+ <name>George Neville-Neil</name>
+ <uri>mailto:gnn&amp;neville-neil.com</uri>
+ <updated>2014-12-17</updated>
+ </person>
+ <person id="Gerald_Hanweck">
+ <name>Gerald Hanweck</name>
+ <uri>mailto:jhanweck&amp;hanweckassoc.com</uri>
+ <updated>2014-09-05</updated>
+ </person>
+ <person id="Giovanni_Marzot">
+ <name>Giovanni Marzot</name>
+ <uri>mailto:gmarzot&amp;ramp.com</uri>
+ <updated>2019-03-13</updated>
+ </person>
+ <person id="Giovanni_Marzot_2">
+ <name>Giovanni Marzot</name>
+ <uri>mailto:gmarzot&amp;vivoh.com</uri>
+ <updated>2023-10-13</updated>
+ </person>
+ <person id="Global_Futures_and_Options_Limited">
+ <org>Global Futures and Options Limited</org>
+ <uri>mailto:david.beattie&amp;gfo-x.com</uri>
+ <updated>2023-03-15</updated>
+ </person>
+ <person id="Grant_Taylor">
+ <name>Grant Taylor</name>
+ <uri>mailto:grantwtt&amp;gmail.com</uri>
+ <updated>2016-10-04</updated>
+ </person>
+ <person id="Guido_Petronio">
+ <name>Guido Petronio</name>
+ <uri>mailto:guido.petronio&amp;moneyline.com</uri>
+ <updated>2004-01-01</updated>
+ </person>
+ <person id="Guilherme_Longanezi">
+ <name>Guilherme Longanezi</name>
+ <uri>mailto:glonganezi&amp;bvmf.com.br</uri>
+ <updated>2016-09-27</updated>
+ </person>
+ <person id="Hanweck_Associates">
+ <org>Hanweck Associates</org>
+ <uri>mailto:iana-change-controller&amp;hanweckassoc.com</uri>
+ <updated>2019-10-01</updated>
+ </person>
+ <person id="Hatice_Unal">
+ <name>Hatice Unal</name>
+ <uri>mailto:CAN-Tech-Network&amp;itg.com</uri>
+ <updated>2019-01-25</updated>
+ </person>
+ <person id="Heiko_Rupp">
+ <name>Heiko Rupp</name>
+ <uri>mailto:hwr&amp;xlink.net</uri>
+ <updated>1997-01-01</updated>
+ </person>
+ <person id="Henri_Moelard">
+ <name>Henri Moelard</name>
+ <uri>mailto:HMOELARD&amp;wcnd.nl.lucent.com</uri>
+ <updated>1998-03</updated>
+ </person>
+ <person id="Henrik_Lans">
+ <name>Henrik Lans</name>
+ <uri>mailto:henrik.lans&amp;telia.no</uri>
+ <updated>2019-09-27</updated>
+ </person>
+ <person id="Hiroshi_Okubo">
+ <name>Hiroshi Okubo</name>
+ <uri>mailto:okubo.hiroshi&amp;canon.co.jp</uri>
+ <updated>2014-08-01</updated>
+ </person>
+ <person id="Howard_Gordon">
+ <name>Howard Gordon</name>
+ <uri>mailto:hgordon&amp;xingtech.com</uri>
+ </person>
+ <person id="IANA">
+ <org>IANA</org>
+ <uri>mailto:iana&amp;iana.org</uri>
+ </person>
+ <person id="Ian_Armitage">
+ <name>Ian Armitage</name>
+ <uri>mailto:ian&amp;coactive.com</uri>
+ <updated>1999-08-01</updated>
+ </person>
+ <person id="Ian_Stewart">
+ <name>Ian Stewart</name>
+ <uri>mailto:iandbige&amp;yahoo.com</uri>
+ <updated>1999-06-01</updated>
+ </person>
+ <person id="Ian_Wacey">
+ <name>Ian Wacey</name>
+ <uri>mailto:iain.wacey&amp;gefalbany.ge.com</uri>
+ <updated>2000-05-01</updated>
+ </person>
+ <person id="Ian_Wilson">
+ <name>Ian Wilson</name>
+ <uri>mailto:iwilson&amp;cisco.com</uri>
+ <updated>2001-12-01</updated>
+ </person>
+ <person id="Ido_Rosen">
+ <name>Ido Rosen</name>
+ <uri>mailto:ido&amp;kernel.org</uri>
+ <updated>2021-03-23</updated>
+ </person>
+ <person id="Instinet">
+ <org>Instinet</org>
+ <uri>mailto:uk.networks&amp;instinet.co.uk</uri>
+ <updated>2019-08-29</updated>
+ </person>
+ <person id="Intercontinental_Exchange_Inc.">
+ <org>Intercontinental Exchange, Inc.</org>
+ <uri>mailto:riradmin&amp;theice.com</uri>
+ <updated>2023-04-10</updated>
+ </person>
+ <person id="IOT_COMPANY_SOLUCOES_TECNOLOGICAS_LTDA">
+ <org>IOT COMPANY SOLUCOES TECNOLOGICAS LTDA</org>
+ <uri>mailto:contato&amp;wisehome.io</uri>
+ <updated>2023-08-09</updated>
+ </person>
+ <person id="IP_Admin">
+ <name>IP Admin</name>
+ <uri>mailto:ipaddr&amp;agilent.com</uri>
+ <updated>2015-10-12</updated>
+ </person>
+ <person id="IPadmin_-_Orange_Slovensko_a.s.">
+ <name>IPadmin - Orange Slovensko a.s.</name>
+ <uri>mailto:supervision&amp;orange.sk</uri>
+ <updated>2021-06-11</updated>
+ </person>
+ <person id="ISE-Networks">
+ <org>ISE-Networks</org>
+ <uri>mailto:isenetworks&amp;ise.com</uri>
+ <updated>2016-05-06</updated>
+ </person>
+ <person id="Ishan_Wu">
+ <name>Ishan Wu</name>
+ <uri>mailto:iwu&amp;cisco.com</uri>
+ <updated>2000-03-01</updated>
+ </person>
+ <person id="Itamar_Gilad">
+ <name>Itamar Gilad</name>
+ <uri>mailto:itamar&amp;arootz.com</uri>
+ <updated>2007-08-31</updated>
+ </person>
+ <person id="J._Ryan_Stinnett">
+ <name>J. Ryan Stinnett</name>
+ <uri>mailto:jryans&amp;mozilla.com</uri>
+ <updated>2014-07-01</updated>
+ </person>
+ <person id="James_Crawford">
+ <name>James Crawford</name>
+ <uri>mailto:jcrawford&amp;metropol.net</uri>
+ <updated>1998-05-01</updated>
+ </person>
+ <person id="Jan_Drwal">
+ <name>Jan Drwal</name>
+ <uri>mailto:Jan.Drwal&amp;deutsche-boerse.com</uri>
+ <updated>2011-12-19</updated>
+ </person>
+ <person id="Jan_Vitek">
+ <name>Jan Vitek</name>
+ <uri>mailto:vitek&amp;selfservis.cz</uri>
+ <updated>2013-01-15</updated>
+ </person>
+ <person id="Japan_Exchange_Group">
+ <org>Japan Exchange Group</org>
+ <uri>mailto:ITD-tradingsystem&amp;jpx.co.jp</uri>
+ <updated>2021-09-07</updated>
+ </person>
+ <person id="Jasmine_Strong">
+ <name>Jasmine Strong</name>
+ <uri>mailto:jasmine&amp;heroicrobotics.com</uri>
+ <updated>2014-06-04</updated>
+ </person>
+ <person id="Jason_Ives">
+ <name>Jason Ives</name>
+ <uri>mailto:noceurope&amp;cboe.com</uri>
+ <updated>2019-02-13</updated>
+ </person>
+ <person id="Javier_Landin">
+ <name>Javier Landin</name>
+ <uri>mailto:jlandin&amp;directedge.com</uri>
+ <updated>2009-08-28</updated>
+ </person>
+ <person id="Jean-Marc_MAGNIER">
+ <name>Jean-Marc MAGNIER</name>
+ <uri>mailto:f1sca&amp;sfr.fr</uri>
+ <updated>2021-02-03</updated>
+ </person>
+ <person id="Jeff_Schenk">
+ <name>Jeff Schenk</name>
+ <uri>mailto:Jeff.Schenk&amp;intelliden.com</uri>
+ <updated>2006-03-31</updated>
+ </person>
+ <person id="Jerome_Albin">
+ <name>Jerome Albin</name>
+ <uri>mailto:albin&amp;taec.enet.dec.com</uri>
+ <updated>1997-06-01</updated>
+ </person>
+ <person id="Jerry_Whitaker">
+ <name>Jerry Whitaker</name>
+ <uri>mailto:jwhitaker&amp;atsc.org</uri>
+ <updated>2008-12-19</updated>
+ </person>
+ <person id="Jim_Ginsburg">
+ <name>Jim Ginsburg</name>
+ <uri>mailto:JGinsburg&amp;jonescorp.com</uri>
+ <updated>2007-10-31</updated>
+ </person>
+ <person id="Jim_Lyle">
+ <name>Jim Lyle</name>
+ <uri>mailto:jim.lyle&amp;siliconimage.com</uri>
+ <updated>2006-08-07</updated>
+ </person>
+ <person id="Jim_Toga">
+ <name>Jim Toga</name>
+ <uri>mailto:jtoga&amp;ibeam.jf.intel.com</uri>
+ <updated>1996-05-01</updated>
+ </person>
+ <person id="Joel_Lynch">
+ <name>Joel Lynch</name>
+ <uri>mailto:joel.lynch&amp;cnn.com</uri>
+ <updated>1999-04-01</updated>
+ </person>
+ <person id="Johan_Deleu">
+ <name>Johan Deleu</name>
+ <uri>mailto:johan.deleu&amp;alcatel.be</uri>
+ <updated>2002-02-01</updated>
+ </person>
+ <person id="John_Catherino">
+ <name>John Catherino</name>
+ <uri>mailto:cajo&amp;dev.java.net</uri>
+ <updated>2006-03-31</updated>
+ </person>
+ <person id="John_Gabler">
+ <name>John Gabler</name>
+ <uri>mailto:john.gabler&amp;ips.invensys.com</uri>
+ <updated>2007-07-06</updated>
+ </person>
+ <person id="John_Rittner">
+ <name>John Rittner</name>
+ <uri>mailto:rittnerj&amp;cboe.com</uri>
+ <updated>2012-04-10</updated>
+ </person>
+ <person id="John_Veizades">
+ <name>John Veizades</name>
+ <uri>mailto:veizades&amp;tgv.com</uri>
+ <updated>1995-05-01</updated>
+ </person>
+ <person id="Johnathan_Ryder">
+ <name>Johnathan Ryder</name>
+ <org>London Stock Exchange Group</org>
+ <uri>mailto:jryder&amp;lseg.com</uri>
+ <updated>2021-09-21</updated>
+ </person>
+ <person id="Jon_Crowcroft">
+ <name>Jon Crowcroft</name>
+ <uri>mailto:jon&amp;hocus.cs.ucl.ac.uk</uri>
+ <updated>1998-11-01</updated>
+ </person>
+ <person id="Jon_Gabriel">
+ <name>Jon Gabriel</name>
+ <uri>mailto:grabriel&amp;tivoli.com</uri>
+ <updated>1998-12-01</updated>
+ </person>
+ <person id="Jon_Postel">
+ <name>Jon Postel</name>
+ <uri>mailto:postel&amp;isi.edu</uri>
+ </person>
+ <person id="Jonathan_Niedfeldt">
+ <name>Jonathan Niedfeldt</name>
+ <uri>mailto:jon&amp;digitalacoustics.com</uri>
+ <updated>2008-02-22</updated>
+ </person>
+ <person id="Joost_Demarest">
+ <name>Joost Demarest</name>
+ <org>KNX Association</org>
+ <uri>mailto:joost.demarest&amp;knx.org</uri>
+ <updated>2023-08-23</updated>
+ </person>
+ <person id="Jose_Luis_Marocho">
+ <name>Jose Luis Marocho</name>
+ <uri>mailto:73374.313&amp;compuserve.com</uri>
+ <updated>1996-07-01</updated>
+ </person>
+ <person id="Juan_Ayas">
+ <name>Juan Ayas</name>
+ <uri>mailto:jayas&amp;lda-audiotech.com</uri>
+ <updated>2018-10-17</updated>
+ </person>
+ <person id="Julian_Nevell">
+ <name>Julian Nevell</name>
+ <uri>mailto:JNEVELL&amp;vbs.bt.co.uk</uri>
+ <updated>1999-08-01</updated>
+ </person>
+ <person id="Justin_Beaman">
+ <name>Justin Beaman</name>
+ <uri>mailto:justin.beaman&amp;midwestvideosolutions.com</uri>
+ <updated>2022-06-09</updated>
+ </person>
+ <person id="Kalejdo_TV">
+ <org>Kalejdo TV</org>
+ <uri>mailto:mikael.nyberg&amp;kalejdo.tv</uri>
+ <updated>2022-08-31</updated>
+ </person>
+ <person id="Kang_Lee">
+ <name>Kang Lee</name>
+ <uri>mailto:kang.lee&amp;nist.gov</uri>
+ <updated>2007-02-02</updated>
+ </person>
+ <person id="Karen_Seo">
+ <name>Karen Seo</name>
+ <uri>mailto:kseo&amp;bbn.com</uri>
+ </person>
+ <person id="Karl_Elad">
+ <name>Karl Elad</name>
+ <uri>mailto:karl.elad&amp;intelsat.com</uri>
+ <updated>2006-03-31</updated>
+ </person>
+ <person id="Keith_Thompson">
+ <name>Keith Thompson</name>
+ <uri>mailto:thompson&amp;ridgeback.east.sun.com</uri>
+ <updated>2001-06-01</updated>
+ </person>
+ <person id="Kelly_Littlepage">
+ <name>Kelly Littlepage</name>
+ <uri>mailto:kelly&amp;onechronos.com</uri>
+ <updated>2023-08-29</updated>
+ </person>
+ <person id="Kevin_Gross">
+ <name>Kevin Gross</name>
+ <uri>mailto:kvng&amp;ieee.org</uri>
+ <updated>2010-03-12</updated>
+ </person>
+ <person id="Kevin_Gross_2">
+ <name>Kevin Gross</name>
+ <uri>mailto:kevin.gross&amp;avanw.com</uri>
+ <updated>2012-08-28</updated>
+ </person>
+ <person id="Kevin_McNicholas">
+ <name>Kevin McNicholas</name>
+ <uri>mailto:kevin.mcnicholas&amp;lucera.com</uri>
+ <updated>2022-02-17</updated>
+ </person>
+ <person id="KNX_Association">
+ <org>KNX Association</org>
+ <uri>mailto:joost.demarest&amp;knx.org</uri>
+ <updated>2023-08-23</updated>
+ </person>
+ <person id="KPN_IP_Office">
+ <name>KPN IP Office</name>
+ <uri>mailto:kpn-ip-office&amp;kpn.com</uri>
+ <updated>2011-04-18</updated>
+ </person>
+ <person id="Kristian_A_Bognaes">
+ <name>Kristian A. Bognaes</name>
+ <uri>mailto:kristian.bognaes&amp;norman.com</uri>
+ <updated>2014-01-08</updated>
+ </person>
+ <person id="Lau_Wei_Lun">
+ <name>Lau Wei Lun</name>
+ <uri>mailto:weilun.lau&amp;asianext.com</uri>
+ <updated>2023-03-03</updated>
+ </person>
+ <person id="LDA_Audio_Tech">
+ <name>LDA Audio Tech</name>
+ <uri>mailto:info&amp;lda-audiotech.com</uri>
+ <updated>2018-10-19</updated>
+ </person>
+ <person id="Lev_V._Cherednikov">
+ <name>Lev V. Cherednikov</name>
+ <uri>mailto:lev.cherednikov&amp;nbn-holding.ru</uri>
+ <updated>2014-04-12</updated>
+ </person>
+ <person id="Liming_Wei">
+ <name>Liming Wei</name>
+ <uri>mailto:lwei&amp;cisco.com</uri>
+ <updated>1998-10-01</updated>
+ </person>
+ <person id="LIRNEasia">
+ <org>LIRNEasia</org>
+ <uri>mailto:nuwan&amp;lirneasia.net</uri>
+ <updated>2020-10-07</updated>
+ </person>
+ <person id="Lloyd_Wood">
+ <name>Lloyd Wood</name>
+ <uri>mailto:L.Wood&amp;surrey.ac.uk</uri>
+ <updated>2011-03-17</updated>
+ </person>
+ <person id="LME_Networks">
+ <name>LME Networks</name>
+ <org>London Metal Exchange</org>
+ <uri>mailto:LME.Network&amp;lme.com</uri>
+ <updated>2023-04-27</updated>
+ </person>
+ <person id="London_Metal_Exchange">
+ <org>London Metal Exchange</org>
+ <uri>mailto:LME.Network&amp;lme.com</uri>
+ <updated>2023-04-27</updated>
+ </person>
+ <person id="London_Stock_Exchange_Group">
+ <org>London Stock Exchange Group</org>
+ <uri>https://www.lseg.com</uri>
+ <updated>2021-09-21</updated>
+ </person>
+ <person id="LonMark_International">
+ <org>LonMark International</org>
+ <uri>mailto:tech&amp;lonmark.org</uri>
+ <updated>2018-11-19</updated>
+ </person>
+ <person id="Louis_Mamakos">
+ <name>Louis Mamakos</name>
+ <uri>mailto:louie&amp;uu.net</uri>
+ <updated>1997-03-01</updated>
+ </person>
+ <person id="Lucera_Financial_Infrastructures">
+ <org>Lucera Financial Infrastructures</org>
+ <uri>mailto:support&amp;lucera.com</uri>
+ <updated>2022-02-17</updated>
+ </person>
+ <person id="Madhav_Karhade">
+ <name>Madhav Karhade</name>
+ <uri>mailto:Madhav.Karhade&amp;wibhu.com</uri>
+ <updated>2003-05-01</updated>
+ </person>
+ <person id="Mark_Armstrong">
+ <name>Mark Armstrong</name>
+ <uri>mailto:Mark.Armstrong&amp;soleratec.com</uri>
+ <updated>2006-02-09</updated>
+ </person>
+ <person id="Mark_Bakke">
+ <name>Mark Bakke</name>
+ <uri>mailto:mbakke&amp;cisco.com</uri>
+ <updated>2001-12-01</updated>
+ </person>
+ <person id="Mark_Hamilton">
+ <name>Mark Hamilton</name>
+ <uri>mailto:mah&amp;spectralink.com</uri>
+ <updated>1998-11-01</updated>
+ </person>
+ <person id="Mark_Handley">
+ <name>Mark Handley</name>
+ <uri>mailto:mjh&amp;isi.edu</uri>
+ <updated>1998-12-01</updated>
+ </person>
+ <person id="Mark_Lewis">
+ <name>Mark Lewis</name>
+ <uri>mailto:Mark_Lewis&amp;ccm.jf.intel.com</uri>
+ <updated>1995-10-01</updated>
+ </person>
+ <person id="Mark_Lipford">
+ <name>Mark Lipford</name>
+ <uri>mailto:mark.a.lipford&amp;sprint.com</uri>
+ <updated>2006-07-11</updated>
+ </person>
+ <person id="Marlon_Berlin">
+ <name>Marlon Berlin</name>
+ <uri>mailto:marlon.berlin&amp;dns-net.de</uri>
+ <updated>2013-05-25</updated>
+ </person>
+ <person id="Martin_Forssen">
+ <name>Martin Forssen</name>
+ <uri>mailto:maf&amp;dtek.chalmers.se</uri>
+ </person>
+ <person id="Mary_Timm">
+ <name>Mary Timm</name>
+ <uri>mailto:mary&amp;xenoscience.com</uri>
+ <updated>1998-07-01</updated>
+ </person>
+ <person id="Masato_Shindoh">
+ <name>Masato Shindoh</name>
+ <uri>mailto:jl11456&amp;yamato.ibm.co.jp</uri>
+ <updated>1997-08-01</updated>
+ </person>
+ <person id="Matthew_Straight">
+ <name>Matthew Straight</name>
+ <uri>mailto:matt_straight&amp;yahoo.com</uri>
+ <updated>2007-03-01</updated>
+ </person>
+ <person id="Maurice_Robberson">
+ <name>Maurice Robberson</name>
+ <uri>mailto:ceo&amp;mediastreamusa.com</uri>
+ <updated>2006-09-15</updated>
+ </person>
+ <person id="Media_Systems_OOO">
+ <org>Media Systems OOO</org>
+ <uri>mailto:noc&amp;n3.ru</uri>
+ <updated>2021-10-22</updated>
+ </person>
+ <person id="Mellanox">
+ <org>Mellanox Technologies, Inc.</org>
+ <uri>mailto:info&amp;mellanox.com</uri>
+ <updated>2019-07-01</updated>
+ </person>
+ <person id="Meridian_Labs_LTD">
+ <org>Meridian Labs LTD.</org>
+ <uri>mailto:mark.wood&amp;meridianlabs.org</uri>
+ <updated>2020-10-07</updated>
+ </person>
+ <person id="MIAX">
+ <org>Miami International Security Exchange</org>
+ <uri>mailto:networking&amp;miami-holdings.com</uri>
+ <updated>2023-05-24</updated>
+ </person>
+ <person id="Michael_Caravetta">
+ <name>Michael Caravetta</name>
+ <uri>mailto:Network_Reps&amp;tsx.com</uri>
+ <updated>2013-06-03</updated>
+ </person>
+ <person id="Michael_DeMoney">
+ <name>Michael DeMoney</name>
+ <uri>mailto:demoney&amp;eng.sun.com</uri>
+ <updated>1997-04-01</updated>
+ </person>
+ <person id="Michael_Dolan">
+ <name>Michael Dolan</name>
+ <uri>mailto:miked&amp;tbt.com</uri>
+ <updated>2003-10-01</updated>
+ </person>
+ <person id="Michael_Lyle">
+ <name>Michael Lyle</name>
+ <uri>mailto:protocols&amp;translattice.com</uri>
+ <updated>2009-11-11</updated>
+ </person>
+ <person id="Michael_Rosenberg">
+ <name>Michael Rosenberg</name>
+ <uri>mailto:michael.rosenberg&amp;nasdaqomx.com</uri>
+ <updated>2012-03-15</updated>
+ </person>
+ <person id="Michael_Wang">
+ <name>Michael Wang</name>
+ <uri>mailto:Michael.Wang&amp;usa.xerox.com</uri>
+ <updated>1999-03-01</updated>
+ </person>
+ <person id="Midwest_Video_Solutions">
+ <org>Midwest Video Solutions</org>
+ <uri>mailto:support&amp;midwestvideosolutions.com</uri>
+ <updated>2019-11-13</updated>
+ </person>
+ <person id="Mika_Uusitalo">
+ <name>Mika Uusitalo</name>
+ <uri>mailto:msu&amp;xingtech.com</uri>
+ <updated>1997-04-01</updated>
+ </person>
+ <person id="Mike_King">
+ <name>Mike King</name>
+ <uri>mailto:mike.king&amp;philips.com</uri>
+ <updated>2019-02-07</updated>
+ </person>
+ <person id="Mike_Pontillo">
+ <name>Mike Pontillo</name>
+ <uri>mailto:mike.pontillo&amp;canonical.com</uri>
+ <updated>2017-05-19</updated>
+ </person>
+ <person id="Mike_Rodbell">
+ <name>Mike Rodbell</name>
+ <uri>mailto:mrodbell&amp;ciena.com</uri>
+ <updated>1997-01-01</updated>
+ </person>
+ <person id="Mike_Roper">
+ <name>Mike Roper</name>
+ <uri>mailto:mroper&amp;8x8.com</uri>
+ <updated>1999-09-01</updated>
+ </person>
+ <person id="Mike_Velten">
+ <name>Mike Velten</name>
+ <uri>mailto:mike_velten&amp;liebert.com</uri>
+ <updated>1999-01-01</updated>
+ </person>
+ <person id="Moe_Singh">
+ <name>Moe Singh</name>
+ <uri>mailto:moesingh&amp;hotmail.com</uri>
+ <updated>2009-09-24</updated>
+ </person>
+ <person id="Mohammed_Raoof_Fadda">
+ <name>Mohammed Raoof Fadda</name>
+ <uri>mailto:raoof_fadda&amp;hotmail.com</uri>
+ <updated>2023-06-09</updated>
+ </person>
+ <person id="Morten_Lindeman">
+ <name>Morten Lindeman</name>
+ <uri>mailto:Morten.Lindeman&amp;os.telia.no</uri>
+ <updated>1999-03-01</updated>
+ </person>
+ <person id="Morteza_Kalhour">
+ <name>Morteza Kalhour</name>
+ <uri>mailto:morteza.kalhour&amp;nokia.com</uri>
+ <updated>2002-10-01</updated>
+ </person>
+ <person id="Nadine_Guillaume">
+ <name>Nadine Guillaume</name>
+ <uri>mailto:nadine.guillaume&amp;sciatl.com</uri>
+ <updated>2005-02-01</updated>
+ </person>
+ <person id="Neal_Lawrence">
+ <name>Neal Lawrence</name>
+ <uri>mailto:neal.lawrence&amp;a2x.co.za</uri>
+ <updated>2017-06-02</updated>
+ </person>
+ <person id="Nedelcho_Stanev">
+ <name>Nedelcho Stanev</name>
+ <uri>mailto:nstanev&amp;csoft.bg</uri>
+ <updated>1999-05-01</updated>
+ </person>
+ <person id="NE-TEAM_at_telecomsys.com">
+ <name>NE-TEAM_at_telecomsys.com</name>
+ <uri>mailto:NE-TEAM&amp;telecomsys.com</uri>
+ <updated>2014-11-07</updated>
+ </person>
+ <person id="Nick_Barendt">
+ <name>Nick Barendt</name>
+ <uri>mailto:nbarendt&amp;vxitech.com</uri>
+ <updated>2005-11-01</updated>
+ </person>
+ <person id="Nigel_Thompson">
+ <name>Nigel Thompson</name>
+ <uri>mailto:nigelt&amp;tribal.com</uri>
+ <updated>1999-01-01</updated>
+ </person>
+ <person id="OCX_Group_Inc">
+ <org>OCX Group Inc</org>
+ <uri>mailto:noc&amp;onechronos.com</uri>
+ <updated>2023-08-29</updated>
+ </person>
+ <person id="Oliver_Lewis">
+ <name>Oliver Lewis</name>
+ <uri>mailto:o.lewis&amp;icerobotics.co.uk</uri>
+ <updated>2006-07-11</updated>
+ </person>
+ <person id="OPC_Foundation">
+ <org>OPC Foundation</org>
+ <uri>mailto:sysadmin&amp;opcfoundation.org</uri>
+ <updated>2019-08-19</updated>
+ </person>
+ <person id="OSPF_WG_Chairs">
+ <name>OSPF WG Chairs</name>
+ <uri>mailto:ospf-chairs&amp;ietf.org</uri>
+ </person>
+ <person id="Oyvind_H_Olsen">
+ <name>Oyvind H. Olsen</name>
+ <uri>mailto:oyvind-hollup.olsen&amp;canaldigital.com</uri>
+ <updated>2007-09-12</updated>
+ </person>
+ <person id="Paolo_Strazzera">
+ <name>Paolo Strazzera</name>
+ <uri>mailto:p.strazzera&amp;telematica.it</uri>
+ <updated>1999-06-01</updated>
+ </person>
+ <person id="Patrick_Cipiere">
+ <name>Patrick Cipiere</name>
+ <uri>mailto:Patrick.Cipiere&amp;udcast.com</uri>
+ <updated>2001-01-01</updated>
+ </person>
+ <person id="Paul_Langille">
+ <name>Paul Langille</name>
+ <uri>mailto:plangille&amp;dnpg.com</uri>
+ <updated>2007-01-17</updated>
+ </person>
+ <person id="Paul_Roberts">
+ <name>Paul Roberts</name>
+ <uri>mailto:networks&amp;aquis.eu</uri>
+ <updated>2021-12-21</updated>
+ </person>
+ <person id="Paul_Suhler">
+ <name>Paul Suhler</name>
+ <uri>mailto:paul.suhler&amp;quantum.com</uri>
+ <updated>2009-05-12</updated>
+ </person>
+ <person id="Paul_Wallner">
+ <name>Paul Wallner</name>
+ <uri>mailto:paul.wallner&amp;wienstrom.at</uri>
+ <updated>2010-09-14</updated>
+ </person>
+ <person id="Paul_Wissenbach">
+ <name>Paul Wissenbach</name>
+ <uri>mailto:paulwi&amp;vnd.tek.com</uri>
+ <updated>1997-06-01</updated>
+ </person>
+ <person id="Peter_Aronson">
+ <name>Peter Aronson</name>
+ <uri>mailto:paronson&amp;esri.com</uri>
+ <updated>1998-08-01</updated>
+ </person>
+ <person id="Peter_Parnes">
+ <name>Peter Parnes</name>
+ <uri>mailto:peppar&amp;marratech.com</uri>
+ <updated>2000-02-01</updated>
+ </person>
+ <person id="Peter_White">
+ <name>Peter White</name>
+ <uri>mailto:peter_white&amp;3com.com</uri>
+ <updated>1999-04-01</updated>
+ </person>
+ <person id="Philips_Healthcare">
+ <org>Philips Healthcare</org>
+ <uri>mailto:bill.holden&amp;philips.com</uri>
+ <updated>2019-02-07</updated>
+ </person>
+ <person id="Pico">
+ <org>Pico</org>
+ <uri>mailto:sales&amp;pico.net</uri>
+ <updated>2020-07-22</updated>
+ </person>
+ <person id="Pico_Sales">
+ <name>Pico Sales</name>
+ <uri>mailto:sales&amp;pico.net</uri>
+ <updated>2020-07-22</updated>
+ </person>
+ <person id="Pierre_Oliver">
+ <name>Pierre Oliver</name>
+ <uri>mailto:polivier&amp;calamp.com</uri>
+ <updated>2011-06-06</updated>
+ </person>
+ <person id="Piers_Scannell">
+ <name>Piers Scannell</name>
+ <uri>mailto:piers&amp;globecastne.com</uri>
+ <updated>2000-03-01</updated>
+ </person>
+ <person id="Pilz">
+ <org>Pilz GmbH and Co. KG</org>
+ <uri>mailto:pilz.gmbh&amp;pilz.de</uri>
+ <updated>2009-03-17</updated>
+ </person>
+ <person id="Prakash_Banthia">
+ <name>Prakash Banthia</name>
+ <uri>mailto:prakash_banthia&amp;3com.com</uri>
+ <updated>1998-09-01</updated>
+ </person>
+ <person id="Ralph_Kammerlander">
+ <name>Ralph Kammerlander</name>
+ <uri>mailto:ralph.kammerlander&amp;khe.siemens.de</uri>
+ <updated>2000-06-01</updated>
+ </person>
+ <person id="Ram_Iyer">
+ <name>Ram Iyer</name>
+ <uri>mailto:ram&amp;aaccorp.com</uri>
+ <updated>1998-03-01</updated>
+ </person>
+ <person id="Rami_Chalhoub">
+ <name>Rami Chalhoub</name>
+ <uri>mailto:itd&amp;bse.com.lb</uri>
+ <updated>2019-01-17</updated>
+ </person>
+ <person id="Ramp_Holdings">
+ <org>Ramp Holdings</org>
+ <uri>mailto:ops&amp;ramp.com</uri>
+ <updated>2019-03-28</updated>
+ </person>
+ <person id="Raymond_Shum">
+ <name>Raymond Shum</name>
+ <uri>mailto:rshum&amp;ms.com</uri>
+ <updated>1998-04-01</updated>
+ </person>
+ <person id="Richard_Hodges">
+ <name>Richard Hodges</name>
+ <uri>mailto:rh&amp;source.net</uri>
+ <updated>1999-03-01</updated>
+ </person>
+ <person id="Richard_Zulch">
+ <name>Richard Zulch</name>
+ <uri>mailto:richard_zulch&amp;dantz.com</uri>
+ <updated>2004-05-01</updated>
+ </person>
+ <person id="RIR_Admin">
+ <name>RIR Admin</name>
+ <uri>mailto:riradmin&amp;theice.com</uri>
+ <updated>2023-04-10</updated>
+ </person>
+ <person id="Rob_Janssen">
+ <name>Rob Janssen</name>
+ <uri>mailto:rob&amp;pe1chl.ampr.org</uri>
+ <updated>1995-01-01</updated>
+ </person>
+ <person id="Robert_Hodgson">
+ <name>Robert Hodgson</name>
+ <uri>mailto:robert&amp;paratek.co.uk</uri>
+ <updated>2001-12-01</updated>
+ </person>
+ <person id="Robert_Sautter">
+ <name>Robert Sautter</name>
+ <uri>mailto:rsautter&amp;acdnj.itt.com</uri>
+ <updated>1999-08-01</updated>
+ </person>
+ <person id="Robert_Sliwinski">
+ <name>Robert Sliwinski</name>
+ <uri>mailto:sliwinre&amp;mail1st.com</uri>
+ <updated>2000-02-01</updated>
+ </person>
+ <person id="Robert_Taylor">
+ <name>Robert Taylor</name>
+ <uri>mailto:rtaylor&amp;digicelgroup.com</uri>
+ <updated>2016-09-29</updated>
+ </person>
+ <person id="Roberto_Costa_Simoes">
+ <name>Roberto Costa Simoes</name>
+ <uri>mailto:rcosta&amp;bvmf.com.br</uri>
+ <updated>2010-08-18</updated>
+ </person>
+ <person id="RTP_Media">
+ <org>RTP Media</org>
+ <uri>mailto:cgs&amp;rtp.media</uri>
+ <updated>2021-07-30</updated>
+ </person>
+ <person id="Ruben_Hernandez">
+ <name>Ruben Hernandez</name>
+ <uri>mailto:ruben.hernandez&amp;tradeweb.com</uri>
+ <updated>2022-01-06</updated>
+ </person>
+ <person id="Ryon_Coleman">
+ <name>Ryon Coleman</name>
+ <uri>mailto:rcoleman&amp;3eti.com</uri>
+ <updated>2006-04-11</updated>
+ </person>
+ <person id="SEIKO_EPSON_Corp">
+ <org>SEIKO EPSON Corp</org>
+ <uri>mailto:ogata.hideaki&amp;exc.epson.co.jp</uri>
+ <updated>2005-01-01</updated>
+ </person>
+ <person id="Sakon_Kittivatcharapong">
+ <name>Sakon Kittivatcharapong</name>
+ <uri>mailto:sakonk&amp;cscoms.net</uri>
+ <updated>2000-05-01</updated>
+ </person>
+ <person id="Sarunas_Brakauskas">
+ <name>Sarunas Brakauskas</name>
+ <uri>mailto:sbrakaus&amp;cme.com</uri>
+ <updated>2007-07-17</updated>
+ </person>
+ <person id="Scott_Watson">
+ <name>Scott Watson</name>
+ <uri>mailto:scott&amp;disney.com</uri>
+ <updated>1997-08-01</updated>
+ </person>
+ <person id="Semtech_Corporation">
+ <org>Semtech Corporation</org>
+ <uri>mailto:aptovision_support&amp;semtech.com</uri>
+ <updated>2019-02-22</updated>
+ </person>
+ <person id="Sergey_Shulgin">
+ <name>Sergey Shulgin</name>
+ <uri>mailto:sshulgin&amp;pinkotc.com</uri>
+ <updated>2008-08-12</updated>
+ </person>
+ <person id="Shachar_Dor">
+ <name>Shachar Dor</name>
+ <uri>mailto:shachard&amp;mellanox.com</uri>
+ <updated>2019-07-01</updated>
+ </person>
+ <person id="Shai_Revzen">
+ <name>Shai Revzen</name>
+ <uri>mailto:shai.revzen&amp;harmonicinc.com</uri>
+ <updated>1999-04-01</updated>
+ </person>
+ <person id="Shane_Rowatt">
+ <name>Shane Rowatt</name>
+ <uri>mailto:shane.rowatt&amp;star.com.au</uri>
+ <updated>1997-03-01</updated>
+ </person>
+ <person id="Shivaun_Albright">
+ <name>Shivaun Albright</name>
+ <uri>mailto:shivaun_albright&amp;hp.com</uri>
+ <updated>1997-07-01</updated>
+ </person>
+ <person id="Simon_Barber">
+ <name>Simon Barber</name>
+ <uri>mailto:simon.barber&amp;parc.com</uri>
+ <updated>2009-09-24</updated>
+ </person>
+ <person id="Soren_Martin_Sorensen">
+ <name>Soren Martin Sorensen</name>
+ <uri>mailto:sms&amp;energimidt.dk</uri>
+ <updated>2006-08-07</updated>
+ </person>
+ <person id="Stacey_O_Rourke">
+ <name>Stacey O'Rourke</name>
+ <uri>mailto:stacey&amp;network-alchemy.com</uri>
+ <updated>1999-08-01</updated>
+ </person>
+ <person id="Stacey_O_Rourke_2">
+ <name>Stacey O'Rourke</name>
+ <uri>mailto:stacey&amp;cips.nokia.com</uri>
+ <updated>2001-01-01</updated>
+ </person>
+ <person id="Stephan_Wasserroth">
+ <name>Stephan Wasserroth</name>
+ <uri>mailto:wasserroth&amp;fokus.gmd.de</uri>
+ <updated>2000-07-01</updated>
+ </person>
+ <person id="Stephen_Dunne">
+ <name>Stephen Dunne</name>
+ <uri>mailto:sdun&amp;isma.co.uk</uri>
+ <updated>1997-01-01</updated>
+ </person>
+ <person id="Stephen_Hanna">
+ <name>Stephen Hanna</name>
+ <uri>mailto:steve.hanna&amp;sun.com</uri>
+ <updated>2000-07-01</updated>
+ </person>
+ <person id="Stephen_Ray_Middleton">
+ <name>Stephen Ray Middleton</name>
+ <uri>mailto:stephen.r.middleton&amp;verizon.com</uri>
+ <updated>2015-03-23</updated>
+ </person>
+ <person id="Stephen_T_Lyda">
+ <name>Stephen T. Lyda</name>
+ <uri>mailto:slyda&amp;emsg.com</uri>
+ <updated>2000-02-01</updated>
+ </person>
+ <person id="Steve_Casner">
+ <name>Steve Casner</name>
+ <uri>mailto:casner&amp;precept.com</uri>
+ </person>
+ <person id="Steve_Casner_2">
+ <name>Steve Casner</name>
+ <uri>mailto:casner&amp;isi.edu</uri>
+ <updated>1995-01-01</updated>
+ </person>
+ <person id="Steve_Deering">
+ <name>Steve Deering</name>
+ <uri>mailto:deering&amp;cisco.com</uri>
+ <updated>1999-10-01</updated>
+ </person>
+ <person id="Steve_Deering_2">
+ <name>Steve Deering</name>
+ <uri>mailto:deering&amp;parc.xerox.com</uri>
+ </person>
+ <person id="Steve_Loizou">
+ <name>Steve Loizou</name>
+ <uri>mailto:steve.loizou&amp;bgcpartners.com</uri>
+ <updated>2023-01-18</updated>
+ </person>
+ <person id="Steve_Polishinski">
+ <name>Steve Polishinski</name>
+ <uri>mailto:spolishinski&amp;etcconnect.com</uri>
+ <updated>2000-03-01</updated>
+ </person>
+ <person id="Stuart_Kerry">
+ <name>Stuart Kerry</name>
+ <uri>mailto:stuart.kerry&amp;philips.com</uri>
+ <updated>2003-01-01</updated>
+ </person>
+ <person id="Svetlana_Kachintseva">
+ <name>Svetlana Kachintseva</name>
+ <uri>mailto:skachintseva&amp;hanweck.com</uri>
+ <updated>2019-09-12</updated>
+ </person>
+ <person id="Susie_Armstrong">
+ <name>Susie Armstrong</name>
+ <uri>mailto:Armstrong.wbst128&amp;xerox.com</uri>
+ </person>
+ <person id="Takeshi_Saito">
+ <name>Takeshi Saito</name>
+ <uri>mailto:takeshi.saito&amp;toshiba.co.jp</uri>
+ <updated>2003-02-01</updated>
+ </person>
+ <person id="Technicolor_NL_NOC">
+ <name>Technicolor NL NOC</name>
+ <uri>mailto:noc&amp;technicolor.com</uri>
+ <updated>2009-12-23</updated>
+ </person>
+ <person id="Telia-Norway-Get-NOC">
+ <name>Telia-Norway-Get-NOC</name>
+ <uri>mailto:noc&amp;get.no</uri>
+ <updated>2019-08-28</updated>
+ </person>
+ <person id="Terry_Gibson">
+ <name>Terry Gibson</name>
+ <uri>mailto:terry.gibson&amp;sun.com</uri>
+ <updated>1997-08-01</updated>
+ </person>
+ <person id="Tetsuo_Hoshi">
+ <name>Tetsuo Hoshi</name>
+ <uri>mailto:tetsuo.hoshi&amp;jp.yokogawa.com</uri>
+ <updated>2004-06-01</updated>
+ </person>
+ <person id="Thomas_Sörlin">
+ <name>Thomas Sörlin</name>
+ <uri>mailto:ts&amp;pergas.se</uri>
+ <updated>2022-08-31</updated>
+ </person>
+ <person id="Tim_DeBaillie">
+ <name>Tim DeBaillie</name>
+ <uri>mailto:debaillie&amp;ciholas.com</uri>
+ <updated>2006-11-30</updated>
+ </person>
+ <person id="Tim_Gorsline">
+ <name>Tim Gorsline</name>
+ <uri>mailto:tgorsline&amp;bats.com</uri>
+ <updated>2017-06-23</updated>
+ </person>
+ <person id="TMX">
+ <name>TMX</name>
+ <uri>mailto:shelley.lindsay&amp;tmx.com</uri>
+ <updated>2023-04-14</updated>
+ </person>
+ <person id="TMX_Network_Engineering">
+ <name>TMX Network Engineering</name>
+ <uri>mailto:network.engineering&amp;tmx.com</uri>
+ <updated>2023-04-14</updated>
+ </person>
+ <person id="Tom_Ballister">
+ <name>Tom Ballister</name>
+ <uri>mailto:tom&amp;ballister.com</uri>
+ <updated>2021-06-11</updated>
+ </person>
+ <person id="Tom_Blank">
+ <name>Tom Blank</name>
+ <uri>mailto:tomblank&amp;microsoft.com</uri>
+ <updated>1996-11-01</updated>
+ </person>
+ <person id="Tom_White">
+ <name>Tom White</name>
+ <uri>mailto:info&amp;midi.org</uri>
+ <updated>2011-11-02</updated>
+ </person>
+ <person id="Tony_Ballardie">
+ <name>Tony Ballardie</name>
+ <uri>mailto:A.Ballardie&amp;cs.ucl.ac.uk</uri>
+ <updated>1997-02-01</updated>
+ </person>
+ <person id="Tony_Barber">
+ <name>Tony Barber</name>
+ <uri>mailto:tony.barber&amp;wcom.com</uri>
+ <updated>1997-01-01</updated>
+ </person>
+ <person id="Tony_Przygienda">
+ <name>Tony Przygienda</name>
+ <uri>mailto:prz&amp;siara.com</uri>
+ <updated>1999-10-01</updated>
+ </person>
+ <person id="Tony_Wong">
+ <name>Tony Wong</name>
+ <uri>mailto:wongt&amp;ms.com</uri>
+ <updated>1998-07-01</updated>
+ </person>
+ <person id="Tradeweb_Markets_Inc">
+ <name>Tradeweb Markets Inc</name>
+ <uri>mailto:usnetworkoperations&amp;tradeweb.com</uri>
+ <updated>2022-01-19</updated>
+ </person>
+ <person id="Tradition_Network_Operations_and_Command_Center">
+ <name>Tradition Network Operations and Command Center</name>
+ <uri>mailto:SH-Networking&amp;tradition.com</uri>
+ <updated>2010-09-22</updated>
+ </person>
+ <person id="TV_System_Administrators">
+ <name>TV System Administrators</name>
+ <org>Ålands Telekommunikation Ab</org>
+ <uri>mailto:tv-noc&amp;alcom.ax</uri>
+ <updated>2019-02-28</updated>
+ </person>
+ <person id="UPnP_Forum">
+ <org>UPnP Forum</org>
+ <uri>mailto:upnpadmin&amp;forum.upnp.org</uri>
+ <updated>2006-06-27</updated>
+ </person>
+ <person id="Vadim_B._Kantor">
+ <name>Vadim B. Kantor</name>
+ <uri>mailto:v.kantor&amp;gksks.ru</uri>
+ <updated>2021-07-30</updated>
+ </person>
+ <person id="Vanya_Levy">
+ <name>Vanya Levy</name>
+ <uri>mailto:vlevy&amp;semtech.com</uri>
+ <updated>2019-02-20</updated>
+ </person>
+ <person id="Victor_Volpe">
+ <name>Victor Volpe</name>
+ <uri>mailto:vvolpe&amp;smtp.microcom.com</uri>
+ <updated>1997-10-01</updated>
+ </person>
+ <person id="Vivoh">
+ <org>Vivoh</org>
+ <uri>mailto:gmarzot&amp;vivoh.com</uri>
+ <updated>2023-10-16</updated>
+ </person>
+ <person id="Vladimir_Shishkov">
+ <name>Vladimir Shishkov</name>
+ <uri>mailto:v.shishkov&amp;vconnect.ru</uri>
+ <updated>2017-02-17</updated>
+ </person>
+ <person id="Wally_Beddoe">
+ <name>Wally Beddoe</name>
+ <uri>mailto:WBeddoe&amp;tkusa.com</uri>
+ <updated>2003-04-01</updated>
+ </person>
+ <person id="Walter_Wallach">
+ <name>Walter Wallach</name>
+ <uri>mailto:walt&amp;sumatech.com</uri>
+ <updated>1999-07-01</updated>
+ </person>
+ <person id="Wayne_Carr">
+ <name>Wayne Carr</name>
+ <uri>mailto:Wayne_Carr&amp;ccm.intel.com</uri>
+ <updated>1997-12-01</updated>
+ </person>
+ <person id="Wayne_Wenyu_Liu">
+ <name>Wayne Wenyu Liu</name>
+ <uri>mailto:wayne.wenyu.liu&amp;gmail.com</uri>
+ <updated>2012-06-12</updated>
+ </person>
+ <person id="Wenjie_Peng">
+ <name>Wenjie Peng</name>
+ <uri>mailto:wpeng&amp;tts.telerate.com</uri>
+ <updated>1997-01-01</updated>
+ </person>
+ <person id="Werner_Vogels">
+ <name>Werner Vogels</name>
+ <uri>mailto:vogels&amp;rnets.com</uri>
+ <updated>1998-08-01</updated>
+ </person>
+ <person id="Wieland_Holdfelder">
+ <name>Wieland Holdfelder</name>
+ <uri>mailto:whd&amp;pi4.informatik.uni-mannheim.de</uri>
+ <updated>1997-01-01</updated>
+ </person>
+ <person id="Xiaoyu_Zhou">
+ <name>Xiaoyu Zhou</name>
+ <uri>mailto:zhouxyi&amp;lenovo.com</uri>
+ <updated>2009-01-20</updated>
+ </person>
+ <person id="Xie_Shao">
+ <name>Xie Shao</name>
+ <uri>mailto:xieshao&amp;tnn.cc</uri>
+ <updated>2023-01-18</updated>
+ </person>
+ <person id="Yea_Uang">
+ <name>Yea Uang</name>
+ <uri>mailto:uang&amp;force.decnet.lockheed.com</uri>
+ <updated>1994-11-01</updated>
+ </person>
+ <person id="Yossi_Gal">
+ <name>Yossi Gal</name>
+ <uri>mailto:yossi&amp;gilat.com</uri>
+ <updated>1998-02-01</updated>
+ </person>
+ <person id="Zaklina_Petkovic">
+ <name>Zaklina Petkovic</name>
+ <uri>mailto:zaklina.petkovic&amp;aequin.com</uri>
+ <updated>2014-05-16</updated>
+ </person>
+ <person id="Zia_Bhatti">
+ <name>Zia Bhatti</name>
+ <uri>mailto:zia&amp;netright.com</uri>
+ <updated>1998-09-01</updated>
+ </person>
+ </people>
+</registry>
diff --git a/netaddr/ip/nmap.py b/netaddr/ip/nmap.py
new file mode 100644
index 0000000..8e9e0c1
--- /dev/null
+++ b/netaddr/ip/nmap.py
@@ -0,0 +1,117 @@
+#-----------------------------------------------------------------------------
+# Copyright (c) 2008 by David P. D. Moss. All rights reserved.
+#
+# Released under the BSD license. See the LICENSE file for details.
+#-----------------------------------------------------------------------------
+"""
+Routines for dealing with nmap-style IPv4 address ranges.
+
+Based on nmap's Target Specification :-
+
+ http://nmap.org/book/man-target-specification.html
+"""
+
+from netaddr.core import AddrFormatError
+from netaddr.ip import IPAddress, IPNetwork
+from netaddr.compat import _iter_range, _is_str, _iter_next
+
+
+def _nmap_octet_target_values(spec):
+ # Generates sequence of values for an individual octet as defined in the
+ # nmap Target Specification.
+ values = set()
+
+ for element in spec.split(','):
+ if '-' in element:
+ left, right = element.split('-', 1)
+ if not left:
+ left = 0
+ if not right:
+ right = 255
+ low = int(left)
+ high = int(right)
+ if not ((0 <= low <= 255) and (0 <= high <= 255)):
+ raise ValueError('octet value overflow for spec %s!' % (spec,))
+ if low > high:
+ raise ValueError('left side of hyphen must be <= right %r' % (element,))
+ for octet in _iter_range(low, high + 1):
+ values.add(octet)
+ else:
+ octet = int(element)
+ if not (0 <= octet <= 255):
+ raise ValueError('octet value overflow for spec %s!' % (spec,))
+ values.add(octet)
+
+ return sorted(values)
+
+
+def _generate_nmap_octet_ranges(nmap_target_spec):
+ # Generate 4 lists containing all octets defined by a given nmap Target
+ # specification.
+ if not _is_str(nmap_target_spec):
+ raise TypeError('string expected, not %s' % type(nmap_target_spec))
+
+ if not nmap_target_spec:
+ raise ValueError('nmap target specification cannot be blank!')
+
+ tokens = nmap_target_spec.split('.')
+
+ if len(tokens) != 4:
+ raise AddrFormatError('invalid nmap range: %s' % (nmap_target_spec,))
+
+ return (_nmap_octet_target_values(tokens[0]),
+ _nmap_octet_target_values(tokens[1]),
+ _nmap_octet_target_values(tokens[2]),
+ _nmap_octet_target_values(tokens[3]))
+
+
+def _parse_nmap_target_spec(target_spec):
+ if '/' in target_spec:
+ _, prefix = target_spec.split('/', 1)
+ if not (0 < int(prefix) < 33):
+ raise AddrFormatError('CIDR prefix expected, not %s' % (prefix,))
+ net = IPNetwork(target_spec)
+ if net.version != 4:
+ raise AddrFormatError('CIDR only support for IPv4!')
+ for ip in net:
+ yield ip
+ elif ':' in target_spec:
+ # nmap only currently supports IPv6 addresses without prefixes.
+ yield IPAddress(target_spec)
+ else:
+ octet_ranges = _generate_nmap_octet_ranges(target_spec)
+ for w in octet_ranges[0]:
+ for x in octet_ranges[1]:
+ for y in octet_ranges[2]:
+ for z in octet_ranges[3]:
+ yield IPAddress("%d.%d.%d.%d" % (w, x, y, z), 4)
+
+
+def valid_nmap_range(target_spec):
+ """
+ :param target_spec: an nmap-style IP range target specification.
+
+ :return: ``True`` if IP range target spec is valid, ``False`` otherwise.
+ """
+ try:
+ _iter_next(_parse_nmap_target_spec(target_spec))
+ return True
+ except (TypeError, ValueError, AddrFormatError):
+ pass
+ return False
+
+
+def iter_nmap_range(*nmap_target_spec):
+ """
+ An generator that yields IPAddress objects from defined by nmap target
+ specifications.
+
+ See https://nmap.org/book/man-target-specification.html for details.
+
+ :param \\*nmap_target_spec: one or more nmap IP range target specification.
+
+ :return: an iterator producing IPAddress objects for each IP in the target spec(s).
+ """
+ for target_spec in nmap_target_spec:
+ for addr in _parse_nmap_target_spec(target_spec):
+ yield addr
diff --git a/netaddr/ip/rfc1924.py b/netaddr/ip/rfc1924.py
new file mode 100644
index 0000000..54fb96c
--- /dev/null
+++ b/netaddr/ip/rfc1924.py
@@ -0,0 +1,61 @@
+#-----------------------------------------------------------------------------
+# Copyright (c) 2008 by David P. D. Moss. All rights reserved.
+#
+# Released under the BSD license. See the LICENSE file for details.
+#-----------------------------------------------------------------------------
+"""A basic implementation of RFC 1924 ;-)"""
+
+from netaddr.core import AddrFormatError
+from netaddr.ip import IPAddress
+
+from netaddr.compat import _zip
+
+
+def chr_range(low, high):
+ """Returns all characters between low and high chars."""
+ return [chr(i) for i in range(ord(low), ord(high) + 1)]
+
+#: Base 85 integer index to character lookup table.
+BASE_85 = (
+ chr_range('0', '9') + chr_range('A', 'Z') +
+ chr_range('a', 'z') +
+ ['!', '#', '$', '%', '&', '(', ')', '*', '+', '-', ';', '<', '=', '>',
+ '?', '@', '^', '_', '`', '{', '|', '}', '~']
+)
+
+#: Base 85 digit to integer lookup table.
+BASE_85_DICT = dict(_zip(BASE_85, range(0, 86)))
+
+
+def ipv6_to_base85(addr):
+ """Convert a regular IPv6 address to base 85."""
+ ip = IPAddress(addr)
+ int_val = int(ip)
+
+ remainder = []
+ while int_val > 0:
+ remainder.append(int_val % 85)
+ int_val //= 85
+
+ encoded = ''.join([BASE_85[w] for w in reversed(remainder)])
+ leading_zeroes = (20 - len(encoded)) * "0"
+ return leading_zeroes + encoded
+
+
+def base85_to_ipv6(addr):
+ """
+ Convert a base 85 IPv6 address to its hexadecimal format.
+ """
+ tokens = list(addr)
+
+ if len(tokens) != 20:
+ raise AddrFormatError('Invalid base 85 IPv6 address: %r' % (addr,))
+
+ result = 0
+ for i, num in enumerate(reversed(tokens)):
+ num = BASE_85_DICT[num]
+ result += (num * 85 ** i)
+
+ ip = IPAddress(result, 6)
+
+ return str(ip)
diff --git a/netaddr/ip/sets.py b/netaddr/ip/sets.py
new file mode 100644
index 0000000..6db896d
--- /dev/null
+++ b/netaddr/ip/sets.py
@@ -0,0 +1,748 @@
+#-----------------------------------------------------------------------------
+# Copyright (c) 2008 by David P. D. Moss. All rights reserved.
+#
+# Released under the BSD license. See the LICENSE file for details.
+#-----------------------------------------------------------------------------
+"""Set based operations for IP addresses and subnets."""
+
+import itertools as _itertools
+
+from netaddr.ip import (IPNetwork, IPAddress, IPRange, cidr_merge,
+ cidr_exclude, iprange_to_cidrs)
+
+from netaddr.compat import _sys_maxint, _dict_keys, _int_type
+
+
+def _subtract(supernet, subnets, subnet_idx, ranges):
+ """Calculate IPSet([supernet]) - IPSet(subnets).
+
+ Assumptions: subnets is sorted, subnet_idx points to the first
+ element in subnets that is a subnet of supernet.
+
+ Results are appended to the ranges parameter as tuples of in format
+ (version, first, last). Return value is the first subnet_idx that
+ does not point to a subnet of supernet (or len(subnets) if all
+ subsequents items are a subnet of supernet).
+ """
+ version = supernet._module.version
+ subnet = subnets[subnet_idx]
+ if subnet.first > supernet.first:
+ ranges.append((version, supernet.first, subnet.first - 1))
+
+ subnet_idx += 1
+ prev_subnet = subnet
+ while subnet_idx < len(subnets):
+ cur_subnet = subnets[subnet_idx]
+
+ if cur_subnet not in supernet:
+ break
+ if prev_subnet.last + 1 == cur_subnet.first:
+ # two adjacent, non-mergable IPNetworks
+ pass
+ else:
+ ranges.append((version, prev_subnet.last + 1, cur_subnet.first - 1))
+
+ subnet_idx += 1
+ prev_subnet = cur_subnet
+
+ first = prev_subnet.last + 1
+ last = supernet.last
+ if first <= last:
+ ranges.append((version, first, last))
+
+ return subnet_idx
+
+
+def _iter_merged_ranges(sorted_ranges):
+ """Iterate over sorted_ranges, merging where possible
+
+ Sorted ranges must be a sorted iterable of (version, first, last) tuples.
+ Merging occurs for pairs like [(4, 10, 42), (4, 43, 100)] which is merged
+ into (4, 10, 100), and leads to return value
+ ( IPAddress(10, 4), IPAddress(100, 4) ), which is suitable input for the
+ iprange_to_cidrs function.
+ """
+ if not sorted_ranges:
+ return
+
+ current_version, current_start, current_stop = sorted_ranges[0]
+
+ for next_version, next_start, next_stop in sorted_ranges[1:]:
+ if next_start == current_stop + 1 and next_version == current_version:
+ # Can be merged.
+ current_stop = next_stop
+ continue
+ # Cannot be merged.
+ yield (IPAddress(current_start, current_version),
+ IPAddress(current_stop, current_version))
+ current_start = next_start
+ current_stop = next_stop
+ current_version = next_version
+ yield (IPAddress(current_start, current_version),
+ IPAddress(current_stop, current_version))
+
+
+class IPSet(object):
+ """
+ Represents an unordered collection (set) of unique IP addresses and
+ subnets.
+
+ """
+ __slots__ = ('_cidrs', '__weakref__')
+
+ def __init__(self, iterable=None, flags=0):
+ """
+ Constructor.
+
+ :param iterable: (optional) an iterable containing IP addresses,
+ subnets or ranges.
+
+ :param flags: decides which rules are applied to the interpretation
+ of the addr value. See the :class:`IPAddress` documentation
+ for supported constant values.
+
+ """
+ if isinstance(iterable, IPNetwork):
+ self._cidrs = {iterable.cidr: True}
+ elif isinstance(iterable, IPRange):
+ self._cidrs = dict.fromkeys(
+ iprange_to_cidrs(iterable[0], iterable[-1]), True)
+ elif isinstance(iterable, IPSet):
+ self._cidrs = dict.fromkeys(iterable.iter_cidrs(), True)
+ else:
+ self._cidrs = {}
+ if iterable is not None:
+ mergeable = []
+ for addr in iterable:
+ if isinstance(addr, _int_type):
+ addr = IPAddress(addr, flags=flags)
+ mergeable.append(addr)
+
+ for cidr in cidr_merge(mergeable):
+ self._cidrs[cidr] = True
+
+ def __getstate__(self):
+ """:return: Pickled state of an ``IPSet`` object."""
+ return tuple([cidr.__getstate__() for cidr in self._cidrs])
+
+ def __setstate__(self, state):
+ """
+ :param state: data used to unpickle a pickled ``IPSet`` object.
+
+ """
+ self._cidrs = dict.fromkeys(
+ (IPNetwork((value, prefixlen), version=version)
+ for value, prefixlen, version in state),
+ True)
+
+ def _compact_single_network(self, added_network):
+ """
+ Same as compact(), but assume that added_network is the only change and
+ that this IPSet was properly compacted before added_network was added.
+ This allows to perform compaction much faster. added_network must
+ already be present in self._cidrs.
+ """
+ added_first = added_network.first
+ added_last = added_network.last
+ added_version = added_network.version
+
+ # Check for supernets and subnets of added_network.
+ if added_network._prefixlen == added_network._module.width:
+ # This is a single IP address, i.e. /32 for IPv4 or /128 for IPv6.
+ # It does not have any subnets, so we only need to check for its
+ # potential supernets.
+ for potential_supernet in added_network.supernet():
+ if potential_supernet in self._cidrs:
+ del self._cidrs[added_network]
+ return
+ else:
+ # IPNetworks from self._cidrs that are subnets of added_network.
+ to_remove = []
+ for cidr in self._cidrs:
+ if (cidr._module.version != added_version or cidr == added_network):
+ # We found added_network or some network of a different version.
+ continue
+ first = cidr.first
+ last = cidr.last
+ if first >= added_first and last <= added_last:
+ # cidr is a subnet of added_network. Remember to remove it.
+ to_remove.append(cidr)
+ elif first <= added_first and last >= added_last:
+ # cidr is a supernet of added_network. Remove added_network.
+ del self._cidrs[added_network]
+ # This IPSet was properly compacted before. Since added_network
+ # is removed now, it must again be properly compacted -> done.
+ assert (not to_remove)
+ return
+ for item in to_remove:
+ del self._cidrs[item]
+
+ # Check if added_network can be merged with another network.
+
+ # Note that merging can only happen between networks of the same
+ # prefixlen. This just leaves 2 candidates: The IPNetworks just before
+ # and just after the added_network.
+ # This can be reduced to 1 candidate: 10.0.0.0/24 and 10.0.1.0/24 can
+ # be merged into into 10.0.0.0/23. But 10.0.1.0/24 and 10.0.2.0/24
+ # cannot be merged. With only 1 candidate, we might as well make a
+ # dictionary lookup.
+ shift_width = added_network._module.width - added_network.prefixlen
+ while added_network.prefixlen != 0:
+ # figure out if the least significant bit of the network part is 0 or 1.
+ the_bit = (added_network._value >> shift_width) & 1
+ if the_bit:
+ candidate = added_network.previous()
+ else:
+ candidate = added_network.next()
+
+ if candidate not in self._cidrs:
+ # The only possible merge does not work -> merge done
+ return
+ # Remove added_network&candidate, add merged network.
+ del self._cidrs[candidate]
+ del self._cidrs[added_network]
+ added_network.prefixlen -= 1
+ # Be sure that we set the host bits to 0 when we move the prefixlen.
+ # Otherwise, adding 255.255.255.255/32 will result in a merged
+ # 255.255.255.255/24 network, but we want 255.255.255.0/24.
+ shift_width += 1
+ added_network._value = (added_network._value >> shift_width) << shift_width
+ self._cidrs[added_network] = True
+
+ def compact(self):
+ """
+ Compact internal list of `IPNetwork` objects using a CIDR merge.
+ """
+ cidrs = cidr_merge(self._cidrs)
+ self._cidrs = dict.fromkeys(cidrs, True)
+
+ def __hash__(self):
+ """
+ Raises ``TypeError`` if this method is called.
+
+ .. note:: IPSet objects are not hashable and cannot be used as \
+ dictionary keys or as members of other sets. \
+ """
+ raise TypeError('IP sets are unhashable!')
+
+ def __contains__(self, ip):
+ """
+ :param ip: An IP address or subnet.
+
+ :return: ``True`` if IP address or subnet is a member of this IP set.
+ """
+ # Iterating over self._cidrs is an O(n) operation: 1000 items in
+ # self._cidrs would mean 1000 loops. Iterating over all possible
+ # supernets loops at most 32 times for IPv4 or 128 times for IPv6,
+ # no matter how many CIDRs this object contains.
+ supernet = IPNetwork(ip)
+ if supernet in self._cidrs:
+ return True
+ while supernet._prefixlen:
+ supernet._prefixlen -= 1
+ if supernet in self._cidrs:
+ return True
+ return False
+
+ def __nonzero__(self):
+ """Return True if IPSet contains at least one IP, else False"""
+ return bool(self._cidrs)
+
+ __bool__ = __nonzero__ # Python 3.x.
+
+ def __iter__(self):
+ """
+ :return: an iterator over the IP addresses within this IP set.
+ """
+ return _itertools.chain(*sorted(self._cidrs))
+
+ def iter_cidrs(self):
+ """
+ :return: an iterator over individual IP subnets within this IP set.
+ """
+ return sorted(self._cidrs)
+
+ def add(self, addr, flags=0):
+ """
+ Adds an IP address or subnet or IPRange to this IP set. Has no effect if
+ it is already present.
+
+ Note that where possible the IP address or subnet is merged with other
+ members of the set to form more concise CIDR blocks.
+
+ :param addr: An IP address or subnet in either string or object form, or
+ an IPRange object.
+
+ :param flags: decides which rules are applied to the interpretation
+ of the addr value. See the :class:`IPAddress` documentation
+ for supported constant values.
+
+ """
+ if isinstance(addr, IPRange):
+ new_cidrs = dict.fromkeys(
+ iprange_to_cidrs(addr[0], addr[-1]), True)
+ self._cidrs.update(new_cidrs)
+ self.compact()
+ return
+ if isinstance(addr, IPNetwork):
+ # Networks like 10.1.2.3/8 need to be normalized to 10.0.0.0/8
+ addr = addr.cidr
+ elif isinstance(addr, _int_type):
+ addr = IPNetwork(IPAddress(addr, flags=flags))
+ else:
+ addr = IPNetwork(addr)
+
+ self._cidrs[addr] = True
+ self._compact_single_network(addr)
+
+ def remove(self, addr, flags=0):
+ """
+ Removes an IP address or subnet or IPRange from this IP set. Does
+ nothing if it is not already a member.
+
+ Note that this method behaves more like discard() found in regular
+ Python sets because it doesn't raise KeyError exceptions if the
+ IP address or subnet is question does not exist. It doesn't make sense
+ to fully emulate that behaviour here as IP sets contain groups of
+ individual IP addresses as individual set members using IPNetwork
+ objects.
+
+ :param addr: An IP address or subnet, or an IPRange.
+
+ :param flags: decides which rules are applied to the interpretation
+ of the addr value. See the :class:`IPAddress` documentation
+ for supported constant values.
+
+ """
+ if isinstance(addr, IPRange):
+ cidrs = iprange_to_cidrs(addr[0], addr[-1])
+ for cidr in cidrs:
+ self.remove(cidr)
+ return
+
+ if isinstance(addr, _int_type):
+ addr = IPAddress(addr, flags=flags)
+ else:
+ addr = IPNetwork(addr)
+
+ # This add() is required for address blocks provided that are larger
+ # than blocks found within the set but have overlaps. e.g. :-
+ #
+ # >>> IPSet(['192.0.2.0/24']).remove('192.0.2.0/23')
+ # IPSet([])
+ #
+ self.add(addr)
+
+ remainder = None
+ matching_cidr = None
+
+ # Search for a matching CIDR and exclude IP from it.
+ for cidr in self._cidrs:
+ if addr in cidr:
+ remainder = cidr_exclude(cidr, addr)
+ matching_cidr = cidr
+ break
+
+ # Replace matching CIDR with remaining CIDR elements.
+ if remainder is not None:
+ del self._cidrs[matching_cidr]
+ for cidr in remainder:
+ self._cidrs[cidr] = True
+ # No call to self.compact() is needed. Removing an IPNetwork cannot
+ # create mergeable networks.
+
+ def pop(self):
+ """
+ Removes and returns an arbitrary IP address or subnet from this IP
+ set.
+
+ :return: An IP address or subnet.
+ """
+ return self._cidrs.popitem()[0]
+
+ def isdisjoint(self, other):
+ """
+ :param other: an IP set.
+
+ :return: ``True`` if this IP set has no elements (IP addresses
+ or subnets) in common with other. Intersection *must* be an
+ empty set.
+ """
+ result = self.intersection(other)
+ return not result
+
+ def copy(self):
+ """:return: a shallow copy of this IP set."""
+ obj_copy = self.__class__()
+ obj_copy._cidrs.update(self._cidrs)
+ return obj_copy
+
+ def update(self, iterable, flags=0):
+ """
+ Update the contents of this IP set with the union of itself and
+ other IP set.
+
+ :param iterable: an iterable containing IP addresses, subnets or ranges.
+
+ :param flags: decides which rules are applied to the interpretation
+ of the addr value. See the :class:`IPAddress` documentation
+ for supported constant values.
+
+ """
+ if isinstance(iterable, IPSet):
+ self._cidrs = dict.fromkeys(
+ (ip for ip in cidr_merge(_dict_keys(self._cidrs)
+ + _dict_keys(iterable._cidrs))), True)
+ return
+ elif isinstance(iterable, (IPNetwork, IPRange)):
+ self.add(iterable)
+ return
+
+ if not hasattr(iterable, '__iter__'):
+ raise TypeError('an iterable was expected!')
+ # An iterable containing IP addresses or subnets.
+ mergeable = []
+ for addr in iterable:
+ if isinstance(addr, _int_type):
+ addr = IPAddress(addr, flags=flags)
+ mergeable.append(addr)
+
+ for cidr in cidr_merge(_dict_keys(self._cidrs) + mergeable):
+ self._cidrs[cidr] = True
+
+ self.compact()
+
+ def clear(self):
+ """Remove all IP addresses and subnets from this IP set."""
+ self._cidrs = {}
+
+ def __eq__(self, other):
+ """
+ :param other: an IP set
+
+ :return: ``True`` if this IP set is equivalent to the ``other`` IP set,
+ ``False`` otherwise.
+ """
+ try:
+ return self._cidrs == other._cidrs
+ except AttributeError:
+ return NotImplemented
+
+ def __ne__(self, other):
+ """
+ :param other: an IP set
+
+ :return: ``False`` if this IP set is equivalent to the ``other`` IP set,
+ ``True`` otherwise.
+ """
+ try:
+ return self._cidrs != other._cidrs
+ except AttributeError:
+ return NotImplemented
+
+ def __lt__(self, other):
+ """
+ :param other: an IP set
+
+ :return: ``True`` if this IP set is less than the ``other`` IP set,
+ ``False`` otherwise.
+ """
+ if not hasattr(other, '_cidrs'):
+ return NotImplemented
+
+ return self.size < other.size and self.issubset(other)
+
+ def issubset(self, other):
+ """
+ :param other: an IP set.
+
+ :return: ``True`` if every IP address and subnet in this IP set
+ is found within ``other``.
+ """
+ for cidr in self._cidrs:
+ if cidr not in other:
+ return False
+ return True
+
+ __le__ = issubset
+
+ def __gt__(self, other):
+ """
+ :param other: an IP set.
+
+ :return: ``True`` if this IP set is greater than the ``other`` IP set,
+ ``False`` otherwise.
+ """
+ if not hasattr(other, '_cidrs'):
+ return NotImplemented
+
+ return self.size > other.size and self.issuperset(other)
+
+ def issuperset(self, other):
+ """
+ :param other: an IP set.
+
+ :return: ``True`` if every IP address and subnet in other IP set
+ is found within this one.
+ """
+ if not hasattr(other, '_cidrs'):
+ return NotImplemented
+
+ for cidr in other._cidrs:
+ if cidr not in self:
+ return False
+ return True
+
+ __ge__ = issuperset
+
+ def union(self, other):
+ """
+ :param other: an IP set.
+
+ :return: the union of this IP set and another as a new IP set
+ (combines IP addresses and subnets from both sets).
+ """
+ ip_set = self.copy()
+ ip_set.update(other)
+ return ip_set
+
+ __or__ = union
+
+ def intersection(self, other):
+ """
+ :param other: an IP set.
+
+ :return: the intersection of this IP set and another as a new IP set.
+ (IP addresses and subnets common to both sets).
+ """
+ result_cidrs = {}
+
+ own_nets = sorted(self._cidrs)
+ other_nets = sorted(other._cidrs)
+ own_idx = 0
+ other_idx = 0
+ own_len = len(own_nets)
+ other_len = len(other_nets)
+ while own_idx < own_len and other_idx < other_len:
+ own_cur = own_nets[own_idx]
+ other_cur = other_nets[other_idx]
+
+ if own_cur == other_cur:
+ result_cidrs[own_cur] = True
+ own_idx += 1
+ other_idx += 1
+ elif own_cur in other_cur:
+ result_cidrs[own_cur] = True
+ own_idx += 1
+ elif other_cur in own_cur:
+ result_cidrs[other_cur] = True
+ other_idx += 1
+ else:
+ # own_cur and other_cur have nothing in common
+ if own_cur < other_cur:
+ own_idx += 1
+ else:
+ other_idx += 1
+
+ # We ran out of networks in own_nets or other_nets. Either way, there
+ # can be no further result_cidrs.
+ result = IPSet()
+ result._cidrs = result_cidrs
+ return result
+
+ __and__ = intersection
+
+ def symmetric_difference(self, other):
+ """
+ :param other: an IP set.
+
+ :return: the symmetric difference of this IP set and another as a new
+ IP set (all IP addresses and subnets that are in exactly one
+ of the sets).
+ """
+ # In contrast to intersection() and difference(), we cannot construct
+ # the result_cidrs easily. Some cidrs may have to be merged, e.g. for
+ # IPSet(["10.0.0.0/32"]).symmetric_difference(IPSet(["10.0.0.1/32"])).
+ result_ranges = []
+
+ own_nets = sorted(self._cidrs)
+ other_nets = sorted(other._cidrs)
+ own_idx = 0
+ other_idx = 0
+ own_len = len(own_nets)
+ other_len = len(other_nets)
+ while own_idx < own_len and other_idx < other_len:
+ own_cur = own_nets[own_idx]
+ other_cur = other_nets[other_idx]
+
+ if own_cur == other_cur:
+ own_idx += 1
+ other_idx += 1
+ elif own_cur in other_cur:
+ own_idx = _subtract(other_cur, own_nets, own_idx, result_ranges)
+ other_idx += 1
+ elif other_cur in own_cur:
+ other_idx = _subtract(own_cur, other_nets, other_idx, result_ranges)
+ own_idx += 1
+ else:
+ # own_cur and other_cur have nothing in common
+ if own_cur < other_cur:
+ result_ranges.append((own_cur._module.version,
+ own_cur.first, own_cur.last))
+ own_idx += 1
+ else:
+ result_ranges.append((other_cur._module.version,
+ other_cur.first, other_cur.last))
+ other_idx += 1
+
+ # If the above loop terminated because it processed all cidrs of
+ # "other", then any remaining cidrs in self must be part of the result.
+ while own_idx < own_len:
+ own_cur = own_nets[own_idx]
+ result_ranges.append((own_cur._module.version,
+ own_cur.first, own_cur.last))
+ own_idx += 1
+
+ # If the above loop terminated because it processed all cidrs of
+ # self, then any remaining cidrs in "other" must be part of the result.
+ while other_idx < other_len:
+ other_cur = other_nets[other_idx]
+ result_ranges.append((other_cur._module.version,
+ other_cur.first, other_cur.last))
+ other_idx += 1
+
+ result = IPSet()
+ for start, stop in _iter_merged_ranges(result_ranges):
+ cidrs = iprange_to_cidrs(start, stop)
+ for cidr in cidrs:
+ result._cidrs[cidr] = True
+ return result
+
+ __xor__ = symmetric_difference
+
+ def difference(self, other):
+ """
+ :param other: an IP set.
+
+ :return: the difference between this IP set and another as a new IP
+ set (all IP addresses and subnets that are in this IP set but
+ not found in the other.)
+ """
+ result_ranges = []
+ result_cidrs = {}
+
+ own_nets = sorted(self._cidrs)
+ other_nets = sorted(other._cidrs)
+ own_idx = 0
+ other_idx = 0
+ own_len = len(own_nets)
+ other_len = len(other_nets)
+ while own_idx < own_len and other_idx < other_len:
+ own_cur = own_nets[own_idx]
+ other_cur = other_nets[other_idx]
+
+ if own_cur == other_cur:
+ own_idx += 1
+ other_idx += 1
+ elif own_cur in other_cur:
+ own_idx += 1
+ elif other_cur in own_cur:
+ other_idx = _subtract(own_cur, other_nets, other_idx,
+ result_ranges)
+ own_idx += 1
+ else:
+ # own_cur and other_cur have nothing in common
+ if own_cur < other_cur:
+ result_cidrs[own_cur] = True
+ own_idx += 1
+ else:
+ other_idx += 1
+
+ # If the above loop terminated because it processed all cidrs of
+ # "other", then any remaining cidrs in self must be part of the result.
+ while own_idx < own_len:
+ result_cidrs[own_nets[own_idx]] = True
+ own_idx += 1
+
+ for start, stop in _iter_merged_ranges(result_ranges):
+ for cidr in iprange_to_cidrs(start, stop):
+ result_cidrs[cidr] = True
+
+ result = IPSet()
+ result._cidrs = result_cidrs
+ return result
+
+ __sub__ = difference
+
+ def __len__(self):
+ """
+ :return: the cardinality of this IP set (i.e. sum of individual IP \
+ addresses). Raises ``IndexError`` if size > maxint (a Python \
+ limitation). Use the .size property for subnets of any size.
+ """
+ size = self.size
+ if size > _sys_maxint:
+ raise IndexError(
+ "range contains more than %d (sys.maxint) IP addresses!"
+ "Use the .size property instead." % _sys_maxint)
+ return size
+
+ @property
+ def size(self):
+ """
+ The cardinality of this IP set (based on the number of individual IP
+ addresses including those implicitly defined in subnets).
+ """
+ return sum([cidr.size for cidr in self._cidrs])
+
+ def __repr__(self):
+ """:return: Python statement to create an equivalent object"""
+ return 'IPSet(%r)' % [str(c) for c in sorted(self._cidrs)]
+
+ __str__ = __repr__
+
+ def iscontiguous(self):
+ """
+ Returns True if the members of the set form a contiguous IP
+ address range (with no gaps), False otherwise.
+
+ :return: ``True`` if the ``IPSet`` object is contiguous.
+ """
+ cidrs = self.iter_cidrs()
+ if len(cidrs) > 1:
+ previous = cidrs[0][0]
+ for cidr in cidrs:
+ if cidr[0] != previous:
+ return False
+ previous = cidr[-1] + 1
+ return True
+
+ def iprange(self):
+ """
+ Generates an IPRange for this IPSet, if all its members
+ form a single contiguous sequence.
+
+ Raises ``ValueError`` if the set is not contiguous.
+
+ :return: An ``IPRange`` for all IPs in the IPSet.
+ """
+ if self.iscontiguous():
+ cidrs = self.iter_cidrs()
+ if not cidrs:
+ return None
+ return IPRange(cidrs[0][0], cidrs[-1][-1])
+ else:
+ raise ValueError("IPSet is not contiguous")
+
+ def iter_ipranges(self):
+ """Generate the merged IPRanges for this IPSet.
+
+ In contrast to self.iprange(), this will work even when the IPSet is
+ not contiguous. Adjacent IPRanges will be merged together, so you
+ get the minimal number of IPRanges.
+ """
+ sorted_ranges = [(cidr._module.version, cidr.first, cidr.last) for
+ cidr in self.iter_cidrs()]
+
+ for start, stop in _iter_merged_ranges(sorted_ranges):
+ yield IPRange(start, stop)