diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 07d400f..aea6701 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -11,7 +11,7 @@ jobs:
runs-on: ${{ matrix.os }}
strategy:
matrix:
- os: [ubuntu-latest, macos-latest]
+ os: [ubuntu-latest]
python: ["3.10", "3.x"]
steps:
- uses: actions/checkout@v2
@@ -22,7 +22,7 @@ jobs:
- name: Install package
run: poetry install
- name: Run tests
- run: sudo $(poetry env info -p)/bin/pytest --cov=fast_mda_traceroute --cov-report=xml
+ run: sudo $(poetry env info -p)/bin/pytest -n 4 --cov=fast_mda_traceroute --cov-report=xml
- uses: codecov/codecov-action@v2
docker:
diff --git a/.gitignore b/.gitignore
index d6db8ec..918a493 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,9 @@ __pycache__/
*.py[cod]
*$py.class
+# MacOS
+.DS_Store
+
# C extensions
*.so
@@ -20,6 +23,7 @@ parts/
sdist/
var/
wheels/
+prof/
pip-wheel-metadata/
share/python-wheels/
*.egg-info/
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 4133578..782e01b 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,29 +1,29 @@
repos:
- repo: https://github.com/PyCQA/autoflake
- rev: v1.4
+ rev: v2.3.1
hooks:
- id: autoflake
args: ["--in-place", "--remove-all-unused-imports"]
-- repo: https://github.com/timothycrosley/isort
- rev: 5.10.1
+- repo: https://github.com/PyCQA/isort
+ rev: 5.13.2
hooks:
- id: isort
args: [--profile=black]
- repo: https://github.com/psf/black
- rev: 22.3.0
+ rev: 24.2.0
hooks:
- id: black
-- repo: https://gitlab.com/pycqa/flake8
- rev: 3.9.2
+- repo: https://github.com/PyCQA/flake8
+ rev: 7.0.0
hooks:
- id: flake8
args: [--ignore=E501]
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.1.0
+ rev: v4.5.0
hooks:
- id: trailing-whitespace
exclude_types:
diff --git a/fast_mda_traceroute/algorithms/diamond_miner.py b/fast_mda_traceroute/algorithms/diamond_miner.py
index 76e4107..70b4c7c 100644
--- a/fast_mda_traceroute/algorithms/diamond_miner.py
+++ b/fast_mda_traceroute/algorithms/diamond_miner.py
@@ -1,15 +1,24 @@
from collections import defaultdict
-from random import shuffle
+from math import ceil
from typing import Dict, List, Set
+from collections import Counter
+
from diamond_miner.generators import probe_generator
from diamond_miner.mappers import SequentialFlowMapper
-from diamond_miner.mda import stopping_point
from diamond_miner.typing import Probe
from more_itertools import flatten
from pycaracal import Reply
-from fast_mda_traceroute.links import get_links_by_ttl
+from fast_mda_traceroute.logger import logger
+from fast_mda_traceroute.algorithms.utils.stopping_point import (
+ estimate_total_interfaces,
+ reach_prob,
+ stopping_point,
+)
+from fast_mda_traceroute.links import (
+ get_links_by_ttl,
+)
from fast_mda_traceroute.typing import Link
from fast_mda_traceroute.utils import is_ipv4
@@ -25,18 +34,20 @@ def __init__(
src_port: int,
dst_port: int,
protocol: str,
- confidence: int,
+ confidence: float,
max_round: int,
):
if protocol == "icmp" and not is_ipv4(dst_addr):
protocol = "icmp6"
- self.failure_probability = 1 - (confidence / 100)
+ self.failure_probability = 1.0 - (confidence / 100.0)
self.dst_addr = dst_addr
self.min_ttl = min_ttl
self.max_ttl = max_ttl
self.src_port = src_port
self.dst_port = dst_port
self.protocol = protocol
+ # We only use a prefix_size of 1 for direct
+ # point-to-point paths
self.mapper_v4 = SequentialFlowMapper(prefix_size=1)
self.mapper_v6 = SequentialFlowMapper(prefix_size=1)
self.max_round = max_round
@@ -44,10 +55,11 @@ def __init__(
self.current_round = 0
self.probes_sent: Dict[int, int] = defaultdict(int)
self.replies_by_round: Dict[int, List[Reply]] = {}
+ self.n_unresolved = [0 for _ in range(self.max_ttl + 1)]
@property
def links_by_ttl(self) -> Dict[int, Set[Link]]:
- return get_links_by_ttl(self.time_exceeded_replies)
+ return get_links_by_ttl(tuple(self.time_exceeded_replies))
@property
def links(self) -> Set[Link]:
@@ -55,34 +67,254 @@ def links(self) -> Set[Link]:
@property
def replies(self) -> List[Reply]:
- return list(flatten(self.replies_by_round.values()))
+ return tuple(flatten(self.replies_by_round.values()))
@property
def time_exceeded_replies(self) -> List[Reply]:
- return [x for x in self.replies if x.time_exceeded]
+ return (x for x in self.replies if x.time_exceeded)
+
+ @property
+ def destination_unreachable_replies(self) -> List[Reply]:
+ return [x for x in self.replies if x.destination_unreachable]
+
+ @property
+ def echo_replies(self) -> List[Reply]:
+ return [x for x in self.replies if x.echo_reply]
+
+ @property
+ def response_replies(self) -> List[Reply]:
+ return [x for x in self.replies if x.echo_reply or x.time_exceeded]
+
+ def nodes_ttl(self, ttl) -> Set[Reply]:
+ return set(
+ [r.reply_src_addr for r in self.time_exceeded_replies if r.probe_ttl == ttl]
+ )
+
+ def nodes_distribution_at_ttl(self, nodes: List[str], ttl: int) -> Dict[str, float]:
+ # a routine to fetch the number of replies from a given node at a given TTL
+ # NOTE: a node may appear at multiple TTLs
+ def node_replies(node, ttl):
+ return len(
+ [
+ r
+ for r in self.replies
+ if r.reply_src_addr == node and r.probe_ttl == ttl
+ ]
+ )
+
+ # total number of observations of links reaching nodes at the current ttl.
+ # since links are stored with the 'near_ttl',
+ # we need to fetch them at ttl-1
+
+ link_dist = {node: node_replies(node, ttl) for node in nodes}
+ total = sum(link_dist.values())
+ if total:
+ link_dist = {k: v / total for k, v in link_dist.items()}
+
+ logger.debug("link_dist at ttl %d: %s", ttl, link_dist)
+ else:
+ # if we did not observe links at the previous ttl
+ # we won't apply weights to the n_k afterwards
+ logger.debug("No links at ttl %d", ttl)
+ link_dist = {node: 1.0 / len(nodes) for node in nodes}
+
+ return link_dist
+
+ def unresolved_nodes_at_ttl(
+ self, ttl: int, optimal_jump: bool = False
+ ) -> tuple[list[str], int]:
+ # returns the list of unresolved nodes at a given TTL
+ # a node is said to be unresolved if not enough probes
+ # have observed the outgoing links of this node.
+ # This threshold is given by the stopping_point routine.
+ # Resolved vertices correspond to nodes where all
+ # outgoing load balanced links have been discovered
+ # with high probability toward the destination.
+ unresolved = []
+ weighted_thresholds = []
+
+ # fetch the nodes at this TTL
+ nodes_at_ttl = set(
+ filter(
+ bool,
+ (r.reply_src_addr for r in self.replies if r.probe_ttl == ttl),
+ )
+ )
+
+ if nodes_at_ttl:
+ logger.debug("Nodes at TTL %d: %s", ttl, nodes_at_ttl)
+ else:
+ logger.debug("No nodes at TTL %d", ttl)
+
+ # fetch the distribution of the nodes at this TTL.
+ # this is important to determine what percentage of probes
+ # sent to this TTL will eventually reach each specific node.
+ link_dist = self.nodes_distribution_at_ttl(nodes_at_ttl, ttl)
+
+ for node in nodes_at_ttl:
+ if node == self.dst_addr:
+ continue
+ # number of unique nodes at the next TTL that share a link with the node
+ successors = set(
+ [
+ x[2]
+ for x in self.links_by_ttl[ttl]
+ if x[1] == node and x[2] is not None
+ ]
+ )
+
+ n_successors = len(successors)
+
+ if n_successors == 0 and node != self.dst_addr:
+ # set to 1 if we did not receive any reply from the node
+ logger.debug(
+ "|> Node %s has no successors and is not destination", node
+ )
+ n_successors = 1
+ else:
+ logger.debug("Detected %d successors for node %s", n_successors, node)
+
+ # the minimum number of probes to send to confirm we got all successors
+ # We try to dismiss the hypothesis that there are more successors
+ # than we observed
+
+ # n_k = stopping_point(max(n_successors, 1), self.failure_probability)
+ n_k = stopping_point(n_successors, self.failure_probability)
+ reach_p = reach_prob(n_successors + 1, n_k)
- def next_round(self, replies: List[Reply]) -> List[Probe]:
+ logger.debug("Stopping point for node %s: %d", node, n_k)
+ logger.debug("Reach probability for node %s: %f", node, reach_p)
+
+ # number of outgoing probes that went through the node
+ n_probes = len(
+ [x for x in self.links_by_ttl[ttl] if x[1] == node and x[2] is not None]
+ )
+
+ logger.debug(
+ "Detected %d outgoing links (probes) for node %s at ttl %d",
+ n_probes,
+ node,
+ ttl,
+ )
+
+ logger.debug(
+ "Expected %d probes for node %s at ttl %d and already sent %d through",
+ n_k,
+ node,
+ ttl,
+ n_probes,
+ )
+ if n_successors == 0:
+ logger.debug("|> Node %s has no successors", node)
+ logger.debug("|> n_k = %d", n_k)
+ logger.debug("|> n_probes = %d", n_probes)
+ continue
+
+ if n_probes >= n_k:
+ logger.debug("|> Node %s is resolved", node)
+ continue
+
+ # if we have not sent enough probes for this node
+ if n_probes < n_k and n_successors > 0:
+ logger.debug("|> Node %s is therefore unresolved", node)
+ # mark the node as unresolved
+ unresolved.append(node)
+
+ # we store the total number of probes to send to get confirmation:
+ # it is the threshold n_k weighted by how difficult it is to reach
+ # this node, i.e. the distribution of probes that reach this node
+ if optimal_jump and n_probes > 0:
+ opti_N = estimate_total_interfaces(n_probes, n_successors)
+ opti_n_k = stopping_point(opti_N, self.failure_probability)
+ weighted_thresholds.append(max(n_k, opti_n_k) / link_dist[node])
+ else:
+ weighted_thresholds.append(n_k / link_dist[node])
+
+ logger.debug(
+ "|> At ttl %d, the distribution of nodes is %s", ttl, link_dist
+ )
+ logger.debug("|> Its distribution is %f", link_dist[node])
+ logger.debug(
+ "|> Node %s is unresolved, with a weighted threshold of %d",
+ node,
+ n_k / link_dist[node],
+ )
+
+ # we store the number of unresolved nodes at each TTL for logging purposes
+ self.n_unresolved[ttl] = len(unresolved)
+ if unresolved:
+ logger.debug("Unresolved nodes at TTL %d: %s", ttl, unresolved)
+ logger.debug(
+ "|> Weighted thresholds at TTL %d: %s",
+ ttl,
+ ceil(max(weighted_thresholds, default=0)),
+ )
+
+ return unresolved, ceil(max(weighted_thresholds, default=0))
+
+ def next_round(
+ self, replies: List[Reply], optimal_jump: bool = False
+ ) -> List[Probe]:
self.current_round += 1
+
self.replies_by_round[self.current_round] = replies
+ logger.debug("######### Round %d: %d replies", self.current_round, len(replies))
+ replies_by_ttl = defaultdict(list)
+ for reply in replies:
+ replies_by_ttl[reply.probe_ttl].append(reply)
+ for ttl, ttl_replies in sorted(replies_by_ttl.items(), key=lambda x: x[0]):
+ # log replies at each TTL
+ # log content of replies at each TTL
+ logger.debug(
+ "Replies @ TTL %d from: %s",
+ ttl,
+ Counter(x.reply_src_addr for x in ttl_replies),
+ )
if self.current_round > self.max_round:
return []
+ max_flows_by_ttl = defaultdict(int)
+
if self.current_round == 1:
- # TODO: Iteratively find the destination TTL (with a single flow?).
- # max_flow = stopping_point(2, self.failure_probability)
- max_flow = 1
- flows_by_ttl = {
- ttl: range(max_flow) for ttl in range(self.min_ttl, self.max_ttl + 1)
+ # NOTE: we cannot reliably infer the destination TTL
+ # because it may not be unique.
+ # we could send only one probe per TTL, but that would not
+ # resolve any node.
+
+ max_flow = stopping_point(1, self.failure_probability)
+ max_flows_by_ttl = {
+ ttl: max_flow for ttl in range(self.min_ttl, self.max_ttl + 1)
}
else:
- # TODO: Detect loop+amplification
- flows_by_ttl = {}
- for ttl, links in self.links_by_ttl.items():
- # TODO: Full/Lite MDA; see Multilevel MDA-Lite paper.
- max_flow = stopping_point(len(links) + 1, self.failure_probability)
- flows_by_ttl[ttl] = range(self.probes_sent[ttl], max_flow)
- # TODO: Maximum over TTL (h-1, h); cf. Diamond-Miner paper `Proposition 1`.
+ max_flows_by_ttl = {
+ ttl: self.unresolved_nodes_at_ttl(ttl, optimal_jump)[1]
+ for ttl in range(self.min_ttl, self.max_ttl + 1)
+ }
+
+ # See Proposition 1 in the original Diamond Miner paper.
+ # The max flow for a TTL is the one computed for unresolved nodes at this TTL
+ # or the one computed at the previous TTL to traverse the previous TTL:
+ # we take the max of both values.
+
+ def combined_max_flow(ttl):
+ if ttl < self.min_ttl or ttl > self.max_ttl:
+ return 1
+ return min(
+ max(
+ max_flows_by_ttl[ttl],
+ max_flows_by_ttl.get(ttl - 1, 1),
+ ),
+ 2**16,
+ )
+
+ flows_by_ttl = {
+ ttl: range(
+ self.probes_sent[ttl],
+ combined_max_flow(ttl),
+ )
+ for ttl in range(self.min_ttl, self.max_ttl + 1)
+ }
probes = []
for ttl, flows in flows_by_ttl.items():
@@ -99,8 +331,13 @@ def next_round(self, replies: List[Reply]) -> List[Probe]:
mapper_v6=self.mapper_v6,
)
)
+ logger.debug(
+ "Round %d: Sending %d probes to TTL %d",
+ self.current_round,
+ len(probes_for_ttl),
+ ttl,
+ )
self.probes_sent[ttl] += len(probes_for_ttl)
probes.extend(probes_for_ttl)
- shuffle(probes)
return probes
diff --git a/fast_mda_traceroute/algorithms/utils/__init__.py b/fast_mda_traceroute/algorithms/utils/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/fast_mda_traceroute/algorithms/utils/stopping_point.py b/fast_mda_traceroute/algorithms/utils/stopping_point.py
new file mode 100644
index 0000000..24da9e8
--- /dev/null
+++ b/fast_mda_traceroute/algorithms/utils/stopping_point.py
@@ -0,0 +1,93 @@
+from functools import cache
+import math
+
+from scipy.special import comb, stirling2
+
+MAX_INTERFACES = 1024
+
+
+def event_prob(n_probes, observed_interfaces, total_interfaces):
+ # Computes the probability of observing exactly observed_interfaces interfaces
+ # after sending n_probes probes to total_interfaces interfaces
+ if (
+ observed_interfaces > total_interfaces
+ or n_probes <= 0
+ or observed_interfaces <= 0
+ or observed_interfaces > n_probes
+ ):
+ return 0.0
+
+ # We choose k interfaces among K
+ # We then have to pick a distribution of the n probes in k non-empty sets
+ # We have k! to match the k interfaces with the k sets
+ # There is a total K^n ways to distribute the n probes among the K interfaces
+
+ stirling = stirling2(n_probes, observed_interfaces, exact=False)
+
+ binom = comb(total_interfaces, observed_interfaces, exact=False)
+ if binom == float("inf") or stirling == float("inf"):
+ return 1.0
+
+ return (
+ int(stirling * binom)
+ * math.factorial(observed_interfaces)
+ / total_interfaces**n_probes
+ )
+
+
+def estimate_total_interfaces(n_probes, observed_interfaces, likelihood_threshold=0.95):
+ # Gives the optimal estimation for the number of interfaces
+ # given the number of probes and the number of observed interfaces
+ if n_probes < observed_interfaces:
+ raise ValueError(
+ f"{n_probes=} must be greater or equal to {observed_interfaces=}"
+ )
+
+ if n_probes == observed_interfaces:
+ for total_interfaces in range(observed_interfaces, MAX_INTERFACES):
+ prob = event_prob(n_probes, observed_interfaces, total_interfaces)
+ if prob > likelihood_threshold:
+ return total_interfaces
+ else:
+ return observed_interfaces
+
+ prev_prob = 0
+ for total_interfaces in range(observed_interfaces - 1, MAX_INTERFACES):
+ prob = event_prob(n_probes, observed_interfaces, total_interfaces)
+ if prob > likelihood_threshold:
+ return total_interfaces
+ if prob < prev_prob:
+ return total_interfaces - 1
+ prev_prob = prob
+ else:
+ return observed_interfaces
+
+
+@cache
+def reach_prob(total_interfaces: int, n_probes: int) -> float:
+ # Hypothesis: there are total_interfaces interfaces in total, and sent n_probes.
+ # what is the probability to reach all interfaces?
+ return event_prob(n_probes, total_interfaces, total_interfaces)
+
+
+@cache
+def stopping_point(n_interfaces: int, failure_probability: float) -> int:
+ # computes the minimal number of probes required to have reach_prob > a threshold
+ n_probes = 0
+ growth_factor = 3
+ upper_bound = 6
+ lower_bound = 1
+
+ while reach_prob(n_interfaces + 1, upper_bound) < (1 - failure_probability):
+ lower_bound = upper_bound
+ upper_bound = int(upper_bound * growth_factor)
+
+ # dichotomy search for the lowest n_probes that satisfies the condition
+
+ while upper_bound - lower_bound > 1:
+ n_probes = (upper_bound + lower_bound) // 2
+ if reach_prob(n_interfaces + 1, n_probes) > (1 - failure_probability):
+ upper_bound = n_probes
+ else:
+ lower_bound = n_probes
+ return upper_bound
diff --git a/fast_mda_traceroute/cli.py b/fast_mda_traceroute/cli.py
index 993b281..940a05a 100644
--- a/fast_mda_traceroute/cli.py
+++ b/fast_mda_traceroute/cli.py
@@ -1,10 +1,12 @@
import json
import logging
+import os
import socket
import sys
from datetime import datetime
from random import randint
from typing import List, Optional
+from collections import Counter
import pycaracal
import typer
@@ -44,6 +46,19 @@ def version_callback(value: bool):
raise typer.Exit()
+def fancy_log(max_ttl, alg, probes):
+ unresolved = [alg.n_unresolved[ttl] for ttl in range(max_ttl + 1)]
+ logger.debug("unresolved=%s", unresolved)
+ c = Counter(p.ttl for p in probes)
+ sending = [c[ttl] for ttl in range(max_ttl + 1)]
+ logger.debug("sending...=%s", sending)
+ shape = []
+ for ttl in range(max_ttl + 1):
+ size = len(set(alg.links_by_ttl[ttl]))
+ shape.append(size)
+ logger.debug("shape....=%s", shape)
+
+
@app.command()
def main(
af: AddressFamily = typer.Option(
@@ -71,10 +86,10 @@ def main(
OutputFormat.Table.value,
help="Output format.",
),
- confidence: int = typer.Option(
- 95,
- min=0,
- max=99,
+ confidence: float = typer.Option(
+ 95.0,
+ min=0.0,
+ max=99.99,
metavar="CONFIDENCE",
help="Probability of discovering all the nodes at a given in TTL, in percent.",
),
@@ -132,6 +147,10 @@ def main(
metavar="BYTES",
help="Receiver buffer size in bytes.",
),
+ optimal_jump: bool = typer.Option(
+ False,
+ help="Whether to use the jump-ahead optimization to minimize the number of rounds.",
+ ),
integrity_check: bool = typer.Option(
True,
help="Whether to verify that replies match valid probes or not.",
@@ -217,19 +236,30 @@ def main(
start_time = datetime.now()
last_replies: List[Reply] = []
while True:
- probes = [Probe(*x) for x in alg.next_round(last_replies)]
+ prep_start = datetime.now()
+ probes = [Probe(*x) for x in alg.next_round(last_replies, optimal_jump)]
+ prep_end = datetime.now()
+ logger.info("prep_time=%s", (prep_end - prep_start))
+ total_ips = set(r.reply_src_addr for r in alg.replies)
logger.info(
- "round=%d links_found=%d probes=%d expected_time=%.1fs",
+ "round=%d links_found=%d total_ip=%d probes=%d expected_time=%.1fs",
alg.current_round,
len(alg.links),
+ len(total_ips),
len(probes),
len(probes) / probing_rate,
)
+ if logger.level == logging.DEBUG:
+ fancy_log(max_ttl, alg, probes)
if not probes:
break
last_replies = prober.probe(probes, wait)
stop_time = datetime.now()
+ relevant_replies = list(alg.time_exceeded_replies) + [
+ r for r in alg.echo_replies if r.reply_src_addr == destination
+ ]
+
if format == OutputFormat.ScamperJSON:
objs = format_scamper_json(
confidence,
@@ -245,11 +275,13 @@ def main(
start_time,
stop_time,
alg.probes_sent,
- alg.time_exceeded_replies,
+ relevant_replies,
)
for obj in objs:
print(json.dumps(obj))
elif format == OutputFormat.Table:
- print(format_table(alg.time_exceeded_replies))
- else:
- print(format_traceroute(alg.time_exceeded_replies))
+ # TODO: set relevant replies here
+ print(format_table(relevant_replies))
+ elif format == OutputFormat.Traceroute:
+ # TODO: set relevant replies here
+ print(format_traceroute(relevant_replies))
diff --git a/fast_mda_traceroute/formats/traceroute.py b/fast_mda_traceroute/formats/traceroute.py
index 14b6905..1e1d64a 100644
--- a/fast_mda_traceroute/formats/traceroute.py
+++ b/fast_mda_traceroute/formats/traceroute.py
@@ -18,7 +18,10 @@ def format_traceroute(replies: List[Reply]) -> str:
replies, lambda x: x.probe_ttl, lambda x: x.reply_src_addr, set
)
output = ""
- for ttl in range(min(nodes_by_ttl), min(max(nodes_by_ttl), destination_ttl) + 1):
+ for ttl in range(
+ min(nodes_by_ttl, default=0),
+ min(max(nodes_by_ttl, default=255), destination_ttl) + 1,
+ ):
output += f"{ttl} "
output += " ".join(nodes_by_ttl.get(ttl, []))
output += "\n"
diff --git a/fast_mda_traceroute/links.py b/fast_mda_traceroute/links.py
index 876b7d8..8427725 100644
--- a/fast_mda_traceroute/links.py
+++ b/fast_mda_traceroute/links.py
@@ -1,4 +1,5 @@
from collections import defaultdict
+from functools import cache
from typing import Dict, List, Optional, Set
from more_itertools import map_reduce
@@ -7,6 +8,7 @@
from fast_mda_traceroute.typing import Flow, Link, Pair
+@cache
def get_replies_by_flow(replies: List[Reply]) -> Dict[Flow, List[Reply]]:
return map_reduce(
replies,
@@ -19,16 +21,41 @@ def get_replies_by_flow(replies: List[Reply]) -> Dict[Flow, List[Reply]]:
)
+@cache
def get_replies_by_ttl(replies: List[Reply]) -> Dict[int, List[Reply]]:
return map_reduce(replies, lambda x: x.probe_ttl) # type: ignore
+def get_successors(replies: List[Reply], src: str) -> Set[str]:
+ successors = set()
+ # fetch the addresses that are one hop away from the source and that have been reached
+ # with a flow id that also reached the source
+ ttls = [x.probe_ttl for x in replies if x.reply_src_addr == src]
+ for flow, replies in get_replies_by_flow(replies).items():
+ if any(x.reply_src_addr == src for x in replies):
+ for reply in replies:
+ if reply.probe_ttl - 1 in ttls:
+ successors.add(reply.reply_src_addr)
+
+ return successors
+
+
+def get_flow_ids(replies: List[Reply], src: str) -> Set[Flow]:
+ flow_ids = set()
+ for flow, replies in get_replies_by_flow(replies).items():
+ if any(x.reply_src_addr == src for x in replies):
+ flow_ids.add(flow)
+ return flow_ids
+
+
+@cache
def get_pairs_by_flow(replies: List[Reply]) -> Dict[Flow, List[Pair]]:
pairs_by_flow = defaultdict(list)
replies_by_flow = get_replies_by_flow(replies)
+
for flow, replies in replies_by_flow.items():
- replies_by_ttl = get_replies_by_ttl(replies)
- for near_ttl in range(min(replies_by_ttl), max(replies_by_ttl)):
+ replies_by_ttl = get_replies_by_ttl(tuple(replies))
+ for near_ttl in range(min(replies_by_ttl) - 1, max(replies_by_ttl)):
near_replies = replies_by_ttl.get(near_ttl, [None])
far_replies = replies_by_ttl.get(near_ttl + 1, [None])
for near_reply in near_replies:
@@ -37,12 +64,34 @@ def get_pairs_by_flow(replies: List[Reply]) -> Dict[Flow, List[Pair]]:
return pairs_by_flow
-def get_links_by_ttl(replies: List[Reply]) -> Dict[int, Set[Link]]:
- links_by_ttl = defaultdict(set)
+def get_links_by_flow_by_ttl(replies: List[Reply]) -> Dict[int, Dict[Flow, Set[Link]]]:
+ links_by_ttl = defaultdict(dict)
pairs_by_flow = get_pairs_by_flow(replies)
for flow, pairs in pairs_by_flow.items():
for near_ttl, near_reply, far_reply in pairs:
- links_by_ttl[near_ttl].add(
+ if near_reply:
+ links_ttl = links_by_ttl[near_ttl]
+ if near_reply.reply_src_addr not in links_ttl:
+ links_ttl[near_reply.reply_src_addr] = set()
+ links_by_ttl[near_ttl][near_reply.reply_src_addr].add(
+ (
+ near_ttl,
+ near_reply.reply_src_addr if near_reply else None,
+ far_reply.reply_src_addr if far_reply else None,
+ )
+ )
+ return links_by_ttl
+
+
+@cache
+def get_links_by_ttl(replies: List[Reply]) -> Dict[int, Set[Link]]:
+ # links_by_ttl = defaultdict(set)
+ links_by_ttl = defaultdict(list)
+ pairs_by_flow = get_pairs_by_flow(tuple(replies))
+
+ for flow, pairs in pairs_by_flow.items():
+ for near_ttl, near_reply, far_reply in pairs:
+ links_by_ttl[near_ttl].append(
(
near_ttl,
near_reply.reply_src_addr if near_reply else None,
@@ -59,9 +108,9 @@ def get_scamper_links(
links: Dict[str, Dict[int, Dict[Optional[str], List[Reply]]]] = defaultdict(
lambda: defaultdict(lambda: defaultdict(list))
)
- replies_by_flow = get_replies_by_flow(replies)
+ replies_by_flow = get_replies_by_flow(tuple(replies))
for flow, flow_replies in replies_by_flow.items():
- replies_by_ttl = get_replies_by_ttl(flow_replies)
+ replies_by_ttl = get_replies_by_ttl(tuple(flow_replies))
for near_ttl in range(min(replies_by_ttl), max(replies_by_ttl)):
# TODO: Handle per-packet load-balancing.
far_ttl = near_ttl + 1
diff --git a/fast_mda_traceroute/logger.py b/fast_mda_traceroute/logger.py
index 7a0a16d..897e017 100644
--- a/fast_mda_traceroute/logger.py
+++ b/fast_mda_traceroute/logger.py
@@ -1,3 +1,11 @@
+import sys
import logging
+logging.basicConfig(
+ format="[%(asctime)s] %(message)s",
+ level=logging.INFO,
+ stream=sys.stderr,
+)
+
logger = logging.getLogger("fast_mda_traceroute")
+logger.setLevel(logging.INFO)
diff --git a/fast_mda_traceroute/typing.py b/fast_mda_traceroute/typing.py
index 31af81d..da761cf 100644
--- a/fast_mda_traceroute/typing.py
+++ b/fast_mda_traceroute/typing.py
@@ -41,6 +41,7 @@ class OutputFormat(Enum):
ScamperJSON = "scamper-json"
Table = "table"
Traceroute = "traceroute"
+ Quiet = "quiet"
class Protocol(Enum):
diff --git a/poetry.lock b/poetry.lock
index b06ed87..8f8500e 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,88 +1,166 @@
+# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand.
+
[[package]]
name = "anyio"
-version = "3.6.2"
+version = "4.3.0"
description = "High level compatibility layer for multiple asynchronous event loop implementations"
-category = "main"
optional = false
-python-versions = ">=3.6.2"
+python-versions = ">=3.8"
+files = [
+ {file = "anyio-4.3.0-py3-none-any.whl", hash = "sha256:048e05d0f6caeed70d731f3db756d35dcc1f35747c8c403364a8332c630441b8"},
+ {file = "anyio-4.3.0.tar.gz", hash = "sha256:f75253795a87df48568485fd18cdd2a3fa5c4f7c5be8e5e36637733fce06fed6"},
+]
[package.dependencies]
+exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""}
idna = ">=2.8"
sniffio = ">=1.1"
+typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""}
[package.extras]
-doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
-test = ["contextlib2", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (<0.15)", "uvloop (>=0.15)"]
-trio = ["trio (>=0.16,<0.22)"]
+doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"]
+test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"]
+trio = ["trio (>=0.23)"]
[[package]]
-name = "attrs"
-version = "22.2.0"
-description = "Classes Without Boilerplate"
-category = "dev"
+name = "asttokens"
+version = "2.4.1"
+description = "Annotate AST trees with source code positions"
optional = false
-python-versions = ">=3.6"
+python-versions = "*"
+files = [
+ {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"},
+ {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"},
+]
+
+[package.dependencies]
+six = ">=1.12.0"
[package.extras]
-cov = ["attrs[tests]", "coverage-enable-subprocess", "coverage[toml] (>=5.3)"]
-dev = ["attrs[docs,tests]"]
-docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope.interface"]
-tests = ["attrs[tests-no-zope]", "zope.interface"]
-tests-no-zope = ["cloudpickle", "cloudpickle", "hypothesis", "hypothesis", "mypy (>=0.971,<0.990)", "mypy (>=0.971,<0.990)", "pympler", "pympler", "pytest (>=4.3.0)", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-mypy-plugins", "pytest-xdist[psutil]", "pytest-xdist[psutil]"]
+astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"]
+test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"]
[[package]]
name = "bump2version"
version = "1.0.1"
description = "Version-bump your software with a single command!"
-category = "dev"
optional = false
python-versions = ">=3.5"
+files = [
+ {file = "bump2version-1.0.1-py2.py3-none-any.whl", hash = "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410"},
+ {file = "bump2version-1.0.1.tar.gz", hash = "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6"},
+]
[[package]]
name = "bumpversion"
version = "0.6.0"
description = "Version-bump your software with a single command!"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "bumpversion-0.6.0-py2.py3-none-any.whl", hash = "sha256:4eb3267a38194d09f048a2179980bb4803701969bff2c85fa8f6d1ce050be15e"},
+ {file = "bumpversion-0.6.0.tar.gz", hash = "sha256:4ba55e4080d373f80177b4dabef146c07ce73c7d1377aabf9d3c3ae1f94584a6"},
+]
[package.dependencies]
bump2version = "*"
[[package]]
name = "certifi"
-version = "2022.12.7"
+version = "2024.2.2"
description = "Python package for providing Mozilla's CA Bundle."
-category = "main"
optional = false
python-versions = ">=3.6"
+files = [
+ {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"},
+ {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"},
+]
[[package]]
name = "cffi"
-version = "1.15.1"
+version = "1.16.0"
description = "Foreign Function Interface for Python calling C code."
-category = "main"
optional = false
-python-versions = "*"
+python-versions = ">=3.8"
+files = [
+ {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"},
+ {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"},
+ {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"},
+ {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"},
+ {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"},
+ {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"},
+ {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"},
+ {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"},
+ {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"},
+ {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"},
+ {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"},
+ {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"},
+ {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"},
+ {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"},
+ {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"},
+ {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"},
+ {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"},
+ {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"},
+ {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"},
+ {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"},
+ {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"},
+ {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"},
+ {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"},
+ {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"},
+ {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"},
+ {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"},
+ {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"},
+ {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"},
+ {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"},
+ {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"},
+ {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"},
+ {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"},
+]
[package.dependencies]
pycparser = "*"
[[package]]
name = "cfgv"
-version = "3.3.1"
+version = "3.4.0"
description = "Validate configuration and produce human readable error messages."
-category = "dev"
optional = false
-python-versions = ">=3.6.1"
+python-versions = ">=3.8"
+files = [
+ {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"},
+ {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"},
+]
[[package]]
name = "click"
-version = "8.1.3"
+version = "8.1.7"
description = "Composable command line interface toolkit"
-category = "main"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
+ {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
+]
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
@@ -91,17 +169,136 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
name = "colorama"
version = "0.4.6"
description = "Cross-platform colored terminal text."
-category = "main"
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+files = [
+ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
+ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
+]
+
+[[package]]
+name = "contourpy"
+version = "1.2.0"
+description = "Python library for calculating contours of 2D quadrilateral grids"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "contourpy-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0274c1cb63625972c0c007ab14dd9ba9e199c36ae1a231ce45d725cbcbfd10a8"},
+ {file = "contourpy-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab459a1cbbf18e8698399c595a01f6dcc5c138220ca3ea9e7e6126232d102bb4"},
+ {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fdd887f17c2f4572ce548461e4f96396681212d858cae7bd52ba3310bc6f00f"},
+ {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d16edfc3fc09968e09ddffada434b3bf989bf4911535e04eada58469873e28e"},
+ {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c203f617abc0dde5792beb586f827021069fb6d403d7f4d5c2b543d87edceb9"},
+ {file = "contourpy-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b69303ceb2e4d4f146bf82fda78891ef7bcd80c41bf16bfca3d0d7eb545448aa"},
+ {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:884c3f9d42d7218304bc74a8a7693d172685c84bd7ab2bab1ee567b769696df9"},
+ {file = "contourpy-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a1b1208102be6e851f20066bf0e7a96b7d48a07c9b0cfe6d0d4545c2f6cadab"},
+ {file = "contourpy-1.2.0-cp310-cp310-win32.whl", hash = "sha256:34b9071c040d6fe45d9826cbbe3727d20d83f1b6110d219b83eb0e2a01d79488"},
+ {file = "contourpy-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:bd2f1ae63998da104f16a8b788f685e55d65760cd1929518fd94cd682bf03e41"},
+ {file = "contourpy-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dd10c26b4eadae44783c45ad6655220426f971c61d9b239e6f7b16d5cdaaa727"},
+ {file = "contourpy-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5c6b28956b7b232ae801406e529ad7b350d3f09a4fde958dfdf3c0520cdde0dd"},
+ {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebeac59e9e1eb4b84940d076d9f9a6cec0064e241818bcb6e32124cc5c3e377a"},
+ {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:139d8d2e1c1dd52d78682f505e980f592ba53c9f73bd6be102233e358b401063"},
+ {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e9dc350fb4c58adc64df3e0703ab076f60aac06e67d48b3848c23647ae4310e"},
+ {file = "contourpy-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18fc2b4ed8e4a8fe849d18dce4bd3c7ea637758c6343a1f2bae1e9bd4c9f4686"},
+ {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:16a7380e943a6d52472096cb7ad5264ecee36ed60888e2a3d3814991a0107286"},
+ {file = "contourpy-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8d8faf05be5ec8e02a4d86f616fc2a0322ff4a4ce26c0f09d9f7fb5330a35c95"},
+ {file = "contourpy-1.2.0-cp311-cp311-win32.whl", hash = "sha256:67b7f17679fa62ec82b7e3e611c43a016b887bd64fb933b3ae8638583006c6d6"},
+ {file = "contourpy-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:99ad97258985328b4f207a5e777c1b44a83bfe7cf1f87b99f9c11d4ee477c4de"},
+ {file = "contourpy-1.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:575bcaf957a25d1194903a10bc9f316c136c19f24e0985a2b9b5608bdf5dbfe0"},
+ {file = "contourpy-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9e6c93b5b2dbcedad20a2f18ec22cae47da0d705d454308063421a3b290d9ea4"},
+ {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:464b423bc2a009088f19bdf1f232299e8b6917963e2b7e1d277da5041f33a779"},
+ {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:68ce4788b7d93e47f84edd3f1f95acdcd142ae60bc0e5493bfd120683d2d4316"},
+ {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3d7d1f8871998cdff5d2ff6a087e5e1780139abe2838e85b0b46b7ae6cc25399"},
+ {file = "contourpy-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e739530c662a8d6d42c37c2ed52a6f0932c2d4a3e8c1f90692ad0ce1274abe0"},
+ {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:247b9d16535acaa766d03037d8e8fb20866d054d3c7fbf6fd1f993f11fc60ca0"},
+ {file = "contourpy-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:461e3ae84cd90b30f8d533f07d87c00379644205b1d33a5ea03381edc4b69431"},
+ {file = "contourpy-1.2.0-cp312-cp312-win32.whl", hash = "sha256:1c2559d6cffc94890b0529ea7eeecc20d6fadc1539273aa27faf503eb4656d8f"},
+ {file = "contourpy-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:491b1917afdd8638a05b611a56d46587d5a632cabead889a5440f7c638bc6ed9"},
+ {file = "contourpy-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5fd1810973a375ca0e097dee059c407913ba35723b111df75671a1976efa04bc"},
+ {file = "contourpy-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:999c71939aad2780f003979b25ac5b8f2df651dac7b38fb8ce6c46ba5abe6ae9"},
+ {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7caf9b241464c404613512d5594a6e2ff0cc9cb5615c9475cc1d9b514218ae8"},
+ {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:266270c6f6608340f6c9836a0fb9b367be61dde0c9a9a18d5ece97774105ff3e"},
+ {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbd50d0a0539ae2e96e537553aff6d02c10ed165ef40c65b0e27e744a0f10af8"},
+ {file = "contourpy-1.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11f8d2554e52f459918f7b8e6aa20ec2a3bce35ce95c1f0ef4ba36fbda306df5"},
+ {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ce96dd400486e80ac7d195b2d800b03e3e6a787e2a522bfb83755938465a819e"},
+ {file = "contourpy-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6d3364b999c62f539cd403f8123ae426da946e142312a514162adb2addd8d808"},
+ {file = "contourpy-1.2.0-cp39-cp39-win32.whl", hash = "sha256:1c88dfb9e0c77612febebb6ac69d44a8d81e3dc60f993215425b62c1161353f4"},
+ {file = "contourpy-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:78e6ad33cf2e2e80c5dfaaa0beec3d61face0fb650557100ee36db808bfa6843"},
+ {file = "contourpy-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:be16975d94c320432657ad2402f6760990cb640c161ae6da1363051805fa8108"},
+ {file = "contourpy-1.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b95a225d4948b26a28c08307a60ac00fb8671b14f2047fc5476613252a129776"},
+ {file = "contourpy-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:0d7e03c0f9a4f90dc18d4e77e9ef4ec7b7bbb437f7f675be8e530d65ae6ef956"},
+ {file = "contourpy-1.2.0.tar.gz", hash = "sha256:171f311cb758de7da13fc53af221ae47a5877be5a0843a9fe150818c51ed276a"},
+]
+
+[package.dependencies]
+numpy = ">=1.20,<2.0"
+
+[package.extras]
+bokeh = ["bokeh", "selenium"]
+docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"]
+mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.6.1)", "types-Pillow"]
+test = ["Pillow", "contourpy[test-no-images]", "matplotlib"]
+test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"]
[[package]]
name = "coverage"
-version = "7.2.1"
+version = "7.4.3"
description = "Code coverage measurement for Python"
-category = "dev"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
+files = [
+ {file = "coverage-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8580b827d4746d47294c0e0b92854c85a92c2227927433998f0d3320ae8a71b6"},
+ {file = "coverage-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:718187eeb9849fc6cc23e0d9b092bc2348821c5e1a901c9f8975df0bc785bfd4"},
+ {file = "coverage-7.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:767b35c3a246bcb55b8044fd3a43b8cd553dd1f9f2c1eeb87a302b1f8daa0524"},
+ {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae7f19afe0cce50039e2c782bff379c7e347cba335429678450b8fe81c4ef96d"},
+ {file = "coverage-7.4.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba3a8aaed13770e970b3df46980cb068d1c24af1a1968b7818b69af8c4347efb"},
+ {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee866acc0861caebb4f2ab79f0b94dbfbdbfadc19f82e6e9c93930f74e11d7a0"},
+ {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:506edb1dd49e13a2d4cac6a5173317b82a23c9d6e8df63efb4f0380de0fbccbc"},
+ {file = "coverage-7.4.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd6545d97c98a192c5ac995d21c894b581f1fd14cf389be90724d21808b657e2"},
+ {file = "coverage-7.4.3-cp310-cp310-win32.whl", hash = "sha256:f6a09b360d67e589236a44f0c39218a8efba2593b6abdccc300a8862cffc2f94"},
+ {file = "coverage-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:18d90523ce7553dd0b7e23cbb28865db23cddfd683a38fb224115f7826de78d0"},
+ {file = "coverage-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbbe5e739d45a52f3200a771c6d2c7acf89eb2524890a4a3aa1a7fa0695d2a47"},
+ {file = "coverage-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:489763b2d037b164846ebac0cbd368b8a4ca56385c4090807ff9fad817de4113"},
+ {file = "coverage-7.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451f433ad901b3bb00184d83fd83d135fb682d780b38af7944c9faeecb1e0bfe"},
+ {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fcc66e222cf4c719fe7722a403888b1f5e1682d1679bd780e2b26c18bb648cdc"},
+ {file = "coverage-7.4.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ec74cfef2d985e145baae90d9b1b32f85e1741b04cd967aaf9cfa84c1334f3"},
+ {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:abbbd8093c5229c72d4c2926afaee0e6e3140de69d5dcd918b2921f2f0c8baba"},
+ {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:35eb581efdacf7b7422af677b92170da4ef34500467381e805944a3201df2079"},
+ {file = "coverage-7.4.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8249b1c7334be8f8c3abcaaa996e1e4927b0e5a23b65f5bf6cfe3180d8ca7840"},
+ {file = "coverage-7.4.3-cp311-cp311-win32.whl", hash = "sha256:cf30900aa1ba595312ae41978b95e256e419d8a823af79ce670835409fc02ad3"},
+ {file = "coverage-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:18c7320695c949de11a351742ee001849912fd57e62a706d83dfc1581897fa2e"},
+ {file = "coverage-7.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b51bfc348925e92a9bd9b2e48dad13431b57011fd1038f08316e6bf1df107d10"},
+ {file = "coverage-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d6cdecaedea1ea9e033d8adf6a0ab11107b49571bbb9737175444cea6eb72328"},
+ {file = "coverage-7.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2eccb883368f9e972e216c7b4c7c06cabda925b5f06dde0650281cb7666a30"},
+ {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c00cdc8fa4e50e1cc1f941a7f2e3e0f26cb2a1233c9696f26963ff58445bac7"},
+ {file = "coverage-7.4.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9a4a8dd3dcf4cbd3165737358e4d7dfbd9d59902ad11e3b15eebb6393b0446e"},
+ {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:062b0a75d9261e2f9c6d071753f7eef0fc9caf3a2c82d36d76667ba7b6470003"},
+ {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ebe7c9e67a2d15fa97b77ea6571ce5e1e1f6b0db71d1d5e96f8d2bf134303c1d"},
+ {file = "coverage-7.4.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c0a120238dd71c68484f02562f6d446d736adcc6ca0993712289b102705a9a3a"},
+ {file = "coverage-7.4.3-cp312-cp312-win32.whl", hash = "sha256:37389611ba54fd6d278fde86eb2c013c8e50232e38f5c68235d09d0a3f8aa352"},
+ {file = "coverage-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:d25b937a5d9ffa857d41be042b4238dd61db888533b53bc76dc082cb5a15e914"},
+ {file = "coverage-7.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:28ca2098939eabab044ad68850aac8f8db6bf0b29bc7f2887d05889b17346454"},
+ {file = "coverage-7.4.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:280459f0a03cecbe8800786cdc23067a8fc64c0bd51dc614008d9c36e1659d7e"},
+ {file = "coverage-7.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c0cdedd3500e0511eac1517bf560149764b7d8e65cb800d8bf1c63ebf39edd2"},
+ {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9a9babb9466fe1da12417a4aed923e90124a534736de6201794a3aea9d98484e"},
+ {file = "coverage-7.4.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dec9de46a33cf2dd87a5254af095a409ea3bf952d85ad339751e7de6d962cde6"},
+ {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:16bae383a9cc5abab9bb05c10a3e5a52e0a788325dc9ba8499e821885928968c"},
+ {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2c854ce44e1ee31bda4e318af1dbcfc929026d12c5ed030095ad98197eeeaed0"},
+ {file = "coverage-7.4.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ce8c50520f57ec57aa21a63ea4f325c7b657386b3f02ccaedeccf9ebe27686e1"},
+ {file = "coverage-7.4.3-cp38-cp38-win32.whl", hash = "sha256:708a3369dcf055c00ddeeaa2b20f0dd1ce664eeabde6623e516c5228b753654f"},
+ {file = "coverage-7.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:1bf25fbca0c8d121a3e92a2a0555c7e5bc981aee5c3fdaf4bb7809f410f696b9"},
+ {file = "coverage-7.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b253094dbe1b431d3a4ac2f053b6d7ede2664ac559705a704f621742e034f1f"},
+ {file = "coverage-7.4.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:77fbfc5720cceac9c200054b9fab50cb2a7d79660609200ab83f5db96162d20c"},
+ {file = "coverage-7.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6679060424faa9c11808598504c3ab472de4531c571ab2befa32f4971835788e"},
+ {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4af154d617c875b52651dd8dd17a31270c495082f3d55f6128e7629658d63765"},
+ {file = "coverage-7.4.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8640f1fde5e1b8e3439fe482cdc2b0bb6c329f4bb161927c28d2e8879c6029ee"},
+ {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:69b9f6f66c0af29642e73a520b6fed25ff9fd69a25975ebe6acb297234eda501"},
+ {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0842571634f39016a6c03e9d4aba502be652a6e4455fadb73cd3a3a49173e38f"},
+ {file = "coverage-7.4.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a78ed23b08e8ab524551f52953a8a05d61c3a760781762aac49f8de6eede8c45"},
+ {file = "coverage-7.4.3-cp39-cp39-win32.whl", hash = "sha256:c0524de3ff096e15fcbfe8f056fdb4ea0bf497d584454f344d59fce069d3e6e9"},
+ {file = "coverage-7.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:0209a6369ccce576b43bb227dc8322d8ef9e323d089c6f3f26a597b09cb4d2aa"},
+ {file = "coverage-7.4.3-pp38.pp39.pp310-none-any.whl", hash = "sha256:7cbde573904625509a3f37b6fecea974e363460b556a627c60dc2f47e2fffa51"},
+ {file = "coverage-7.4.3.tar.gz", hash = "sha256:276f6077a5c61447a48d133ed13e759c09e62aff0dc84274a68dc18660104d52"},
+]
[package.dependencies]
tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""}
@@ -109,138 +306,495 @@ tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.1
[package.extras]
toml = ["tomli"]
+[[package]]
+name = "cycler"
+version = "0.12.1"
+description = "Composable style cycles"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"},
+ {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"},
+]
+
+[package.extras]
+docs = ["ipython", "matplotlib", "numpydoc", "sphinx"]
+tests = ["pytest", "pytest-cov", "pytest-xdist"]
+
[[package]]
name = "diamond-miner"
-version = "1.0.3"
+version = "1.1.0"
description = "High-speed, Internet-scale, load-balanced paths discovery."
-category = "main"
optional = false
python-versions = ">=3.10,<4.0"
+files = [
+ {file = "diamond_miner-1.1.0-py3-none-any.whl", hash = "sha256:29df62950fde5161318fc3d9dc9fc2be8499dd9e7f88730972218d1c0844f4c6"},
+ {file = "diamond_miner-1.1.0.tar.gz", hash = "sha256:5888659bac85dae5bc9508b02c2fae842956662262a3a48dffeaea7a17528fdd"},
+]
[package.dependencies]
-pych-client = ">=0.3.1,<0.4.0"
+pych-client = ">=0.4.0,<0.5.0"
pygfc = ">=1.0.5,<2.0.0"
-zstandard = ">=0.15.2,<0.19.0"
+tqdm = ">=4.66.1,<5.0.0"
+zstandard = ">=0.21.0,<0.22.0"
[[package]]
name = "distlib"
-version = "0.3.6"
+version = "0.3.8"
description = "Distribution utilities"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"},
+ {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"},
+]
[[package]]
name = "exceptiongroup"
-version = "1.1.0"
+version = "1.2.0"
description = "Backport of PEP 654 (exception groups)"
-category = "dev"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"},
+ {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"},
+]
[package.extras]
test = ["pytest (>=6)"]
+[[package]]
+name = "execnet"
+version = "2.0.2"
+description = "execnet: rapid multi-Python deployment"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"},
+ {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"},
+]
+
+[package.extras]
+testing = ["hatch", "pre-commit", "pytest", "tox"]
+
+[[package]]
+name = "executing"
+version = "2.0.1"
+description = "Get the currently executing AST node of a frame, and other information"
+optional = false
+python-versions = ">=3.5"
+files = [
+ {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"},
+ {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"},
+]
+
+[package.extras]
+tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"]
+
[[package]]
name = "filelock"
-version = "3.9.0"
+version = "3.13.1"
description = "A platform independent file lock."
-category = "dev"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
+files = [
+ {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"},
+ {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"},
+]
+
+[package.extras]
+docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"]
+testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"]
+typing = ["typing-extensions (>=4.8)"]
+
+[[package]]
+name = "fonttools"
+version = "4.50.0"
+description = "Tools to manipulate font files"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effd303fb422f8ce06543a36ca69148471144c534cc25f30e5be752bc4f46736"},
+ {file = "fonttools-4.50.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7913992ab836f621d06aabac118fc258b9947a775a607e1a737eb3a91c360335"},
+ {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e0a1c5bd2f63da4043b63888534b52c5a1fd7ae187c8ffc64cbb7ae475b9dab"},
+ {file = "fonttools-4.50.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d40fc98540fa5360e7ecf2c56ddf3c6e7dd04929543618fd7b5cc76e66390562"},
+ {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9fff65fbb7afe137bac3113827855e0204482727bddd00a806034ab0d3951d0d"},
+ {file = "fonttools-4.50.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1aeae3dd2ee719074a9372c89ad94f7c581903306d76befdaca2a559f802472"},
+ {file = "fonttools-4.50.0-cp310-cp310-win32.whl", hash = "sha256:e9623afa319405da33b43c85cceb0585a6f5d3a1d7c604daf4f7e1dd55c03d1f"},
+ {file = "fonttools-4.50.0-cp310-cp310-win_amd64.whl", hash = "sha256:778c5f43e7e654ef7fe0605e80894930bc3a7772e2f496238e57218610140f54"},
+ {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3dfb102e7f63b78c832e4539969167ffcc0375b013080e6472350965a5fe8048"},
+ {file = "fonttools-4.50.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e58fe34cb379ba3d01d5d319d67dd3ce7ca9a47ad044ea2b22635cd2d1247fc"},
+ {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c673ab40d15a442a4e6eb09bf007c1dda47c84ac1e2eecbdf359adacb799c24"},
+ {file = "fonttools-4.50.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b3ac35cdcd1a4c90c23a5200212c1bb74fa05833cc7c14291d7043a52ca2aaa"},
+ {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8844e7a2c5f7ecf977e82eb6b3014f025c8b454e046d941ece05b768be5847ae"},
+ {file = "fonttools-4.50.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f849bd3c5c2249b49c98eca5aaebb920d2bfd92b3c69e84ca9bddf133e9f83f0"},
+ {file = "fonttools-4.50.0-cp311-cp311-win32.whl", hash = "sha256:39293ff231b36b035575e81c14626dfc14407a20de5262f9596c2cbb199c3625"},
+ {file = "fonttools-4.50.0-cp311-cp311-win_amd64.whl", hash = "sha256:c33d5023523b44d3481624f840c8646656a1def7630ca562f222eb3ead16c438"},
+ {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b4a886a6dbe60100ba1cd24de962f8cd18139bd32808da80de1fa9f9f27bf1dc"},
+ {file = "fonttools-4.50.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b2ca1837bfbe5eafa11313dbc7edada79052709a1fffa10cea691210af4aa1fa"},
+ {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0493dd97ac8977e48ffc1476b932b37c847cbb87fd68673dee5182004906828"},
+ {file = "fonttools-4.50.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77844e2f1b0889120b6c222fc49b2b75c3d88b930615e98893b899b9352a27ea"},
+ {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3566bfb8c55ed9100afe1ba6f0f12265cd63a1387b9661eb6031a1578a28bad1"},
+ {file = "fonttools-4.50.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:35e10ddbc129cf61775d58a14f2d44121178d89874d32cae1eac722e687d9019"},
+ {file = "fonttools-4.50.0-cp312-cp312-win32.whl", hash = "sha256:cc8140baf9fa8f9b903f2b393a6c413a220fa990264b215bf48484f3d0bf8710"},
+ {file = "fonttools-4.50.0-cp312-cp312-win_amd64.whl", hash = "sha256:0ccc85fd96373ab73c59833b824d7a73846670a0cb1f3afbaee2b2c426a8f931"},
+ {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e270a406219af37581d96c810172001ec536e29e5593aa40d4c01cca3e145aa6"},
+ {file = "fonttools-4.50.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac2463de667233372e9e1c7e9de3d914b708437ef52a3199fdbf5a60184f190c"},
+ {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47abd6669195abe87c22750dbcd366dc3a0648f1b7c93c2baa97429c4dc1506e"},
+ {file = "fonttools-4.50.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:074841375e2e3d559aecc86e1224caf78e8b8417bb391e7d2506412538f21adc"},
+ {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0743fd2191ad7ab43d78cd747215b12033ddee24fa1e088605a3efe80d6984de"},
+ {file = "fonttools-4.50.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3d7080cce7be5ed65bee3496f09f79a82865a514863197ff4d4d177389e981b0"},
+ {file = "fonttools-4.50.0-cp38-cp38-win32.whl", hash = "sha256:a467ba4e2eadc1d5cc1a11d355abb945f680473fbe30d15617e104c81f483045"},
+ {file = "fonttools-4.50.0-cp38-cp38-win_amd64.whl", hash = "sha256:f77e048f805e00870659d6318fd89ef28ca4ee16a22b4c5e1905b735495fc422"},
+ {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b6245eafd553c4e9a0708e93be51392bd2288c773523892fbd616d33fd2fda59"},
+ {file = "fonttools-4.50.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a4062cc7e8de26f1603323ef3ae2171c9d29c8a9f5e067d555a2813cd5c7a7e0"},
+ {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34692850dfd64ba06af61e5791a441f664cb7d21e7b544e8f385718430e8f8e4"},
+ {file = "fonttools-4.50.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:678dd95f26a67e02c50dcb5bf250f95231d455642afbc65a3b0bcdacd4e4dd38"},
+ {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f2ce7b0b295fe64ac0a85aef46a0f2614995774bd7bc643b85679c0283287f9"},
+ {file = "fonttools-4.50.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d346f4dc2221bfb7ab652d1e37d327578434ce559baf7113b0f55768437fe6a0"},
+ {file = "fonttools-4.50.0-cp39-cp39-win32.whl", hash = "sha256:a51eeaf52ba3afd70bf489be20e52fdfafe6c03d652b02477c6ce23c995222f4"},
+ {file = "fonttools-4.50.0-cp39-cp39-win_amd64.whl", hash = "sha256:8639be40d583e5d9da67795aa3eeeda0488fb577a1d42ae11a5036f18fb16d93"},
+ {file = "fonttools-4.50.0-py3-none-any.whl", hash = "sha256:48fa36da06247aa8282766cfd63efff1bb24e55f020f29a335939ed3844d20d3"},
+ {file = "fonttools-4.50.0.tar.gz", hash = "sha256:fa5cf61058c7dbb104c2ac4e782bf1b2016a8cf2f69de6e4dd6a865d2c969bb5"},
+]
[package.extras]
-docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"]
-testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"]
+all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"]
+graphite = ["lz4 (>=1.7.4.2)"]
+interpolatable = ["munkres", "pycairo", "scipy"]
+lxml = ["lxml (>=4.0)"]
+pathops = ["skia-pathops (>=0.5.0)"]
+plot = ["matplotlib"]
+repacker = ["uharfbuzz (>=0.23.0)"]
+symfont = ["sympy"]
+type1 = ["xattr"]
+ufo = ["fs (>=2.2.0,<3)"]
+unicode = ["unicodedata2 (>=15.1.0)"]
+woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"]
+
+[[package]]
+name = "gprof2dot"
+version = "2022.7.29"
+description = "Generate a dot graph from the output of several profilers."
+optional = false
+python-versions = ">=2.7"
+files = [
+ {file = "gprof2dot-2022.7.29-py2.py3-none-any.whl", hash = "sha256:f165b3851d3c52ee4915eb1bd6cca571e5759823c2cd0f71a79bda93c2dc85d6"},
+ {file = "gprof2dot-2022.7.29.tar.gz", hash = "sha256:45b4d298bd36608fccf9511c3fd88a773f7a1abc04d6cd39445b11ba43133ec5"},
+]
[[package]]
name = "h11"
version = "0.14.0"
description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1"
-category = "main"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
+ {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
+]
[[package]]
name = "httpcore"
-version = "0.16.3"
+version = "1.0.4"
description = "A minimal low-level HTTP client."
-category = "main"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
+files = [
+ {file = "httpcore-1.0.4-py3-none-any.whl", hash = "sha256:ac418c1db41bade2ad53ae2f3834a3a0f5ae76b56cf5aa497d2d033384fc7d73"},
+ {file = "httpcore-1.0.4.tar.gz", hash = "sha256:cb2839ccfcba0d2d3c1131d3c3e26dfc327326fbe7a5dc0dbfe9f6c9151bb022"},
+]
[package.dependencies]
-anyio = ">=3.0,<5.0"
certifi = "*"
h11 = ">=0.13,<0.15"
-sniffio = ">=1.0.0,<2.0.0"
[package.extras]
+asyncio = ["anyio (>=4.0,<5.0)"]
http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (>=1.0.0,<2.0.0)"]
+socks = ["socksio (==1.*)"]
+trio = ["trio (>=0.22.0,<0.25.0)"]
[[package]]
name = "httpx"
-version = "0.23.3"
+version = "0.25.2"
description = "The next generation HTTP client."
-category = "main"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
+files = [
+ {file = "httpx-0.25.2-py3-none-any.whl", hash = "sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118"},
+ {file = "httpx-0.25.2.tar.gz", hash = "sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8"},
+]
[package.dependencies]
+anyio = "*"
certifi = "*"
-httpcore = ">=0.15.0,<0.17.0"
-rfc3986 = {version = ">=1.3,<2", extras = ["idna2008"]}
+httpcore = "==1.*"
+idna = "*"
sniffio = "*"
[package.extras]
brotli = ["brotli", "brotlicffi"]
-cli = ["click (>=8.0.0,<9.0.0)", "pygments (>=2.0.0,<3.0.0)", "rich (>=10,<13)"]
+cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"]
http2 = ["h2 (>=3,<5)"]
-socks = ["socksio (>=1.0.0,<2.0.0)"]
+socks = ["socksio (==1.*)"]
+
+[[package]]
+name = "icecream"
+version = "2.1.3"
+description = "Never use print() to debug again; inspect variables, expressions, and program execution with a single, simple function call."
+optional = false
+python-versions = "*"
+files = [
+ {file = "icecream-2.1.3-py2.py3-none-any.whl", hash = "sha256:757aec31ad4488b949bc4f499d18e6e5973c40cc4d4fc607229e78cfaec94c34"},
+ {file = "icecream-2.1.3.tar.gz", hash = "sha256:0aa4a7c3374ec36153a1d08f81e3080e83d8ac1eefd97d2f4fe9544e8f9b49de"},
+]
+
+[package.dependencies]
+asttokens = ">=2.0.1"
+colorama = ">=0.3.9"
+executing = ">=0.3.1"
+pygments = ">=2.2.0"
[[package]]
name = "identify"
-version = "2.5.18"
+version = "2.5.35"
description = "File identification library for Python"
-category = "dev"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
+files = [
+ {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"},
+ {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"},
+]
[package.extras]
license = ["ukkonen"]
[[package]]
name = "idna"
-version = "3.4"
+version = "3.6"
description = "Internationalized Domain Names in Applications (IDNA)"
-category = "main"
optional = false
python-versions = ">=3.5"
+files = [
+ {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"},
+ {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"},
+]
[[package]]
name = "iniconfig"
version = "2.0.0"
description = "brain-dead simple config-ini parsing"
-category = "dev"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
+ {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
+]
+
+[[package]]
+name = "kiwisolver"
+version = "1.4.5"
+description = "A fast implementation of the Cassowary constraint solver"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"},
+ {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"},
+ {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"},
+ {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"},
+ {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"},
+ {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"},
+ {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"},
+ {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"},
+ {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"},
+ {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"},
+ {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"},
+]
+
+[[package]]
+name = "matplotlib"
+version = "3.8.3"
+description = "Python plotting package"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "matplotlib-3.8.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:cf60138ccc8004f117ab2a2bad513cc4d122e55864b4fe7adf4db20ca68a078f"},
+ {file = "matplotlib-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f557156f7116be3340cdeef7f128fa99b0d5d287d5f41a16e169819dcf22357"},
+ {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f386cf162b059809ecfac3bcc491a9ea17da69fa35c8ded8ad154cd4b933d5ec"},
+ {file = "matplotlib-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3c5f96f57b0369c288bf6f9b5274ba45787f7e0589a34d24bdbaf6d3344632f"},
+ {file = "matplotlib-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:83e0f72e2c116ca7e571c57aa29b0fe697d4c6425c4e87c6e994159e0c008635"},
+ {file = "matplotlib-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:1c5c8290074ba31a41db1dc332dc2b62def469ff33766cbe325d32a3ee291aea"},
+ {file = "matplotlib-3.8.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:5184e07c7e1d6d1481862ee361905b7059f7fe065fc837f7c3dc11eeb3f2f900"},
+ {file = "matplotlib-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7e7e0993d0758933b1a241a432b42c2db22dfa37d4108342ab4afb9557cbe3e"},
+ {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:04b36ad07eac9740fc76c2aa16edf94e50b297d6eb4c081e3add863de4bb19a7"},
+ {file = "matplotlib-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c42dae72a62f14982f1474f7e5c9959fc4bc70c9de11cc5244c6e766200ba65"},
+ {file = "matplotlib-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf5932eee0d428192c40b7eac1399d608f5d995f975cdb9d1e6b48539a5ad8d0"},
+ {file = "matplotlib-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:40321634e3a05ed02abf7c7b47a50be50b53ef3eaa3a573847431a545585b407"},
+ {file = "matplotlib-3.8.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:09074f8057917d17ab52c242fdf4916f30e99959c1908958b1fc6032e2d0f6d4"},
+ {file = "matplotlib-3.8.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5745f6d0fb5acfabbb2790318db03809a253096e98c91b9a31969df28ee604aa"},
+ {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97653d869a71721b639714b42d87cda4cfee0ee74b47c569e4874c7590c55c5"},
+ {file = "matplotlib-3.8.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:242489efdb75b690c9c2e70bb5c6550727058c8a614e4c7716f363c27e10bba1"},
+ {file = "matplotlib-3.8.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:83c0653c64b73926730bd9ea14aa0f50f202ba187c307a881673bad4985967b7"},
+ {file = "matplotlib-3.8.3-cp312-cp312-win_amd64.whl", hash = "sha256:ef6c1025a570354297d6c15f7d0f296d95f88bd3850066b7f1e7b4f2f4c13a39"},
+ {file = "matplotlib-3.8.3-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:c4af3f7317f8a1009bbb2d0bf23dfaba859eb7dd4ccbd604eba146dccaaaf0a4"},
+ {file = "matplotlib-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c6e00a65d017d26009bac6808f637b75ceade3e1ff91a138576f6b3065eeeba"},
+ {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7b49ab49a3bea17802df6872f8d44f664ba8f9be0632a60c99b20b6db2165b7"},
+ {file = "matplotlib-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6728dde0a3997396b053602dbd907a9bd64ec7d5cf99e728b404083698d3ca01"},
+ {file = "matplotlib-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:813925d08fb86aba139f2d31864928d67511f64e5945ca909ad5bc09a96189bb"},
+ {file = "matplotlib-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:cd3a0c2be76f4e7be03d34a14d49ded6acf22ef61f88da600a18a5cd8b3c5f3c"},
+ {file = "matplotlib-3.8.3-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fa93695d5c08544f4a0dfd0965f378e7afc410d8672816aff1e81be1f45dbf2e"},
+ {file = "matplotlib-3.8.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e9764df0e8778f06414b9d281a75235c1e85071f64bb5d71564b97c1306a2afc"},
+ {file = "matplotlib-3.8.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:5e431a09e6fab4012b01fc155db0ce6dccacdbabe8198197f523a4ef4805eb26"},
+ {file = "matplotlib-3.8.3.tar.gz", hash = "sha256:7b416239e9ae38be54b028abbf9048aff5054a9aba5416bef0bd17f9162ce161"},
+]
+
+[package.dependencies]
+contourpy = ">=1.0.1"
+cycler = ">=0.10"
+fonttools = ">=4.22.0"
+kiwisolver = ">=1.3.1"
+numpy = ">=1.21,<2"
+packaging = ">=20.0"
+pillow = ">=8"
+pyparsing = ">=2.3.1"
+python-dateutil = ">=2.7"
[[package]]
name = "more-itertools"
version = "8.14.0"
description = "More routines for operating on iterables, beyond itertools"
-category = "main"
optional = false
python-versions = ">=3.5"
+files = [
+ {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"},
+ {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"},
+]
[[package]]
name = "mypy"
version = "0.942"
description = "Optional static typing for Python"
-category = "dev"
optional = false
python-versions = ">=3.6"
+files = [
+ {file = "mypy-0.942-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5bf44840fb43ac4074636fd47ee476d73f0039f4f54e86d7265077dc199be24d"},
+ {file = "mypy-0.942-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dcd955f36e0180258a96f880348fbca54ce092b40fbb4b37372ae3b25a0b0a46"},
+ {file = "mypy-0.942-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6776e5fa22381cc761df53e7496a805801c1a751b27b99a9ff2f0ca848c7eca0"},
+ {file = "mypy-0.942-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:edf7237137a1a9330046dbb14796963d734dd740a98d5e144a3eb1d267f5f9ee"},
+ {file = "mypy-0.942-cp310-cp310-win_amd64.whl", hash = "sha256:64235137edc16bee6f095aba73be5334677d6f6bdb7fa03cfab90164fa294a17"},
+ {file = "mypy-0.942-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b840cfe89c4ab6386c40300689cd8645fc8d2d5f20101c7f8bd23d15fca14904"},
+ {file = "mypy-0.942-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b184db8c618c43c3a31b32ff00cd28195d39e9c24e7c3b401f3db7f6e5767f5"},
+ {file = "mypy-0.942-cp36-cp36m-win_amd64.whl", hash = "sha256:1a0459c333f00e6a11cbf6b468b870c2b99a906cb72d6eadf3d1d95d38c9352c"},
+ {file = "mypy-0.942-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c3e497588afccfa4334a9986b56f703e75793133c4be3a02d06a3df16b67a58"},
+ {file = "mypy-0.942-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f6ad963172152e112b87cc7ec103ba0f2db2f1cd8997237827c052a3903eaa6"},
+ {file = "mypy-0.942-cp37-cp37m-win_amd64.whl", hash = "sha256:0e2dd88410937423fba18e57147dd07cd8381291b93d5b1984626f173a26543e"},
+ {file = "mypy-0.942-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:246e1aa127d5b78488a4a0594bd95f6d6fb9d63cf08a66dafbff8595d8891f67"},
+ {file = "mypy-0.942-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d8d3ba77e56b84cd47a8ee45b62c84b6d80d32383928fe2548c9a124ea0a725c"},
+ {file = "mypy-0.942-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2bc249409a7168d37c658e062e1ab5173300984a2dada2589638568ddc1db02b"},
+ {file = "mypy-0.942-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9521c1265ccaaa1791d2c13582f06facf815f426cd8b07c3a485f486a8ffc1f3"},
+ {file = "mypy-0.942-cp38-cp38-win_amd64.whl", hash = "sha256:e865fec858d75b78b4d63266c9aff770ecb6a39dfb6d6b56c47f7f8aba6baba8"},
+ {file = "mypy-0.942-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6ce34a118d1a898f47def970a2042b8af6bdcc01546454726c7dd2171aa6dfca"},
+ {file = "mypy-0.942-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:10daab80bc40f84e3f087d896cdb53dc811a9f04eae4b3f95779c26edee89d16"},
+ {file = "mypy-0.942-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3841b5433ff936bff2f4dc8d54cf2cdbfea5d8e88cedfac45c161368e5770ba6"},
+ {file = "mypy-0.942-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f7106cbf9cc2f403693bf50ed7c9fa5bb3dfa9007b240db3c910929abe2a322"},
+ {file = "mypy-0.942-cp39-cp39-win_amd64.whl", hash = "sha256:7742d2c4e46bb5017b51c810283a6a389296cda03df805a4f7869a6f41246534"},
+ {file = "mypy-0.942-py3-none-any.whl", hash = "sha256:a1b383fe99678d7402754fe90448d4037f9512ce70c21f8aee3b8bf48ffc51db"},
+ {file = "mypy-0.942.tar.gz", hash = "sha256:17e44649fec92e9f82102b48a3bf7b4a5510ad0cd22fa21a104826b5db4903e2"},
+]
[package.dependencies]
mypy-extensions = ">=0.4.3"
@@ -256,48 +810,211 @@ reports = ["lxml"]
name = "mypy-extensions"
version = "1.0.0"
description = "Type system extensions for programs checked with the mypy type checker."
-category = "dev"
optional = false
python-versions = ">=3.5"
+files = [
+ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
+ {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
+]
+
+[[package]]
+name = "networkx"
+version = "3.2.1"
+description = "Python package for creating and manipulating graphs and networks"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2"},
+ {file = "networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6"},
+]
+
+[package.extras]
+default = ["matplotlib (>=3.5)", "numpy (>=1.22)", "pandas (>=1.4)", "scipy (>=1.9,!=1.11.0,!=1.11.1)"]
+developer = ["changelist (==0.4)", "mypy (>=1.1)", "pre-commit (>=3.2)", "rtoml"]
+doc = ["nb2plots (>=0.7)", "nbconvert (<7.9)", "numpydoc (>=1.6)", "pillow (>=9.4)", "pydata-sphinx-theme (>=0.14)", "sphinx (>=7)", "sphinx-gallery (>=0.14)", "texext (>=0.6.7)"]
+extra = ["lxml (>=4.6)", "pydot (>=1.4.2)", "pygraphviz (>=1.11)", "sympy (>=1.10)"]
+test = ["pytest (>=7.2)", "pytest-cov (>=4.0)"]
[[package]]
name = "nodeenv"
-version = "1.7.0"
+version = "1.8.0"
description = "Node.js virtual environment builder"
-category = "dev"
optional = false
python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*"
+files = [
+ {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"},
+ {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"},
+]
[package.dependencies]
setuptools = "*"
+[[package]]
+name = "numpy"
+version = "1.26.4"
+description = "Fundamental package for array computing in Python"
+optional = false
+python-versions = ">=3.9"
+files = [
+ {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"},
+ {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"},
+ {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"},
+ {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"},
+ {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"},
+ {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"},
+ {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"},
+ {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"},
+ {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"},
+ {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"},
+ {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"},
+ {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"},
+ {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"},
+ {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"},
+ {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"},
+ {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"},
+ {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"},
+ {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"},
+ {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"},
+ {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"},
+ {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"},
+ {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"},
+ {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"},
+ {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"},
+ {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"},
+ {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"},
+ {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"},
+ {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"},
+ {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"},
+ {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"},
+ {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"},
+ {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"},
+ {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"},
+ {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"},
+ {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"},
+ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"},
+]
+
[[package]]
name = "packaging"
-version = "23.0"
+version = "24.0"
description = "Core utilities for Python packages"
-category = "dev"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"},
+ {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
+]
+
+[[package]]
+name = "pillow"
+version = "10.2.0"
+description = "Python Imaging Library (Fork)"
+optional = false
+python-versions = ">=3.8"
+files = [
+ {file = "pillow-10.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:7823bdd049099efa16e4246bdf15e5a13dbb18a51b68fa06d6c1d4d8b99a796e"},
+ {file = "pillow-10.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:83b2021f2ade7d1ed556bc50a399127d7fb245e725aa0113ebd05cfe88aaf588"},
+ {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fad5ff2f13d69b7e74ce5b4ecd12cc0ec530fcee76356cac6742785ff71c452"},
+ {file = "pillow-10.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da2b52b37dad6d9ec64e653637a096905b258d2fc2b984c41ae7d08b938a67e4"},
+ {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:47c0995fc4e7f79b5cfcab1fc437ff2890b770440f7696a3ba065ee0fd496563"},
+ {file = "pillow-10.2.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:322bdf3c9b556e9ffb18f93462e5f749d3444ce081290352c6070d014c93feb2"},
+ {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:51f1a1bffc50e2e9492e87d8e09a17c5eea8409cda8d3f277eb6edc82813c17c"},
+ {file = "pillow-10.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:69ffdd6120a4737710a9eee73e1d2e37db89b620f702754b8f6e62594471dee0"},
+ {file = "pillow-10.2.0-cp310-cp310-win32.whl", hash = "sha256:c6dafac9e0f2b3c78df97e79af707cdc5ef8e88208d686a4847bab8266870023"},
+ {file = "pillow-10.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:aebb6044806f2e16ecc07b2a2637ee1ef67a11840a66752751714a0d924adf72"},
+ {file = "pillow-10.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:7049e301399273a0136ff39b84c3678e314f2158f50f517bc50285fb5ec847ad"},
+ {file = "pillow-10.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:35bb52c37f256f662abdfa49d2dfa6ce5d93281d323a9af377a120e89a9eafb5"},
+ {file = "pillow-10.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c23f307202661071d94b5e384e1e1dc7dfb972a28a2310e4ee16103e66ddb67"},
+ {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773efe0603db30c281521a7c0214cad7836c03b8ccff897beae9b47c0b657d61"},
+ {file = "pillow-10.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11fa2e5984b949b0dd6d7a94d967743d87c577ff0b83392f17cb3990d0d2fd6e"},
+ {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:716d30ed977be8b37d3ef185fecb9e5a1d62d110dfbdcd1e2a122ab46fddb03f"},
+ {file = "pillow-10.2.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a086c2af425c5f62a65e12fbf385f7c9fcb8f107d0849dba5839461a129cf311"},
+ {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c8de2789052ed501dd829e9cae8d3dcce7acb4777ea4a479c14521c942d395b1"},
+ {file = "pillow-10.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:609448742444d9290fd687940ac0b57fb35e6fd92bdb65386e08e99af60bf757"},
+ {file = "pillow-10.2.0-cp311-cp311-win32.whl", hash = "sha256:823ef7a27cf86df6597fa0671066c1b596f69eba53efa3d1e1cb8b30f3533068"},
+ {file = "pillow-10.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:1da3b2703afd040cf65ec97efea81cfba59cdbed9c11d8efc5ab09df9509fc56"},
+ {file = "pillow-10.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:edca80cbfb2b68d7b56930b84a0e45ae1694aeba0541f798e908a49d66b837f1"},
+ {file = "pillow-10.2.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:1b5e1b74d1bd1b78bc3477528919414874748dd363e6272efd5abf7654e68bef"},
+ {file = "pillow-10.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0eae2073305f451d8ecacb5474997c08569fb4eb4ac231ffa4ad7d342fdc25ac"},
+ {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7c2286c23cd350b80d2fc9d424fc797575fb16f854b831d16fd47ceec078f2c"},
+ {file = "pillow-10.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e23412b5c41e58cec602f1135c57dfcf15482013ce6e5f093a86db69646a5aa"},
+ {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:52a50aa3fb3acb9cf7213573ef55d31d6eca37f5709c69e6858fe3bc04a5c2a2"},
+ {file = "pillow-10.2.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:127cee571038f252a552760076407f9cff79761c3d436a12af6000cd182a9d04"},
+ {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8d12251f02d69d8310b046e82572ed486685c38f02176bd08baf216746eb947f"},
+ {file = "pillow-10.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:54f1852cd531aa981bc0965b7d609f5f6cc8ce8c41b1139f6ed6b3c54ab82bfb"},
+ {file = "pillow-10.2.0-cp312-cp312-win32.whl", hash = "sha256:257d8788df5ca62c980314053197f4d46eefedf4e6175bc9412f14412ec4ea2f"},
+ {file = "pillow-10.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:154e939c5f0053a383de4fd3d3da48d9427a7e985f58af8e94d0b3c9fcfcf4f9"},
+ {file = "pillow-10.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:f379abd2f1e3dddb2b61bc67977a6b5a0a3f7485538bcc6f39ec76163891ee48"},
+ {file = "pillow-10.2.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8373c6c251f7ef8bda6675dd6d2b3a0fcc31edf1201266b5cf608b62a37407f9"},
+ {file = "pillow-10.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:870ea1ada0899fd0b79643990809323b389d4d1d46c192f97342eeb6ee0b8483"},
+ {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4b6b1e20608493548b1f32bce8cca185bf0480983890403d3b8753e44077129"},
+ {file = "pillow-10.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3031709084b6e7852d00479fd1d310b07d0ba82765f973b543c8af5061cf990e"},
+ {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:3ff074fc97dd4e80543a3e91f69d58889baf2002b6be64347ea8cf5533188213"},
+ {file = "pillow-10.2.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:cb4c38abeef13c61d6916f264d4845fab99d7b711be96c326b84df9e3e0ff62d"},
+ {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b1b3020d90c2d8e1dae29cf3ce54f8094f7938460fb5ce8bc5c01450b01fbaf6"},
+ {file = "pillow-10.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:170aeb00224ab3dc54230c797f8404507240dd868cf52066f66a41b33169bdbe"},
+ {file = "pillow-10.2.0-cp38-cp38-win32.whl", hash = "sha256:c4225f5220f46b2fde568c74fca27ae9771536c2e29d7c04f4fb62c83275ac4e"},
+ {file = "pillow-10.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0689b5a8c5288bc0504d9fcee48f61a6a586b9b98514d7d29b840143d6734f39"},
+ {file = "pillow-10.2.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:b792a349405fbc0163190fde0dc7b3fef3c9268292586cf5645598b48e63dc67"},
+ {file = "pillow-10.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c570f24be1e468e3f0ce7ef56a89a60f0e05b30a3669a459e419c6eac2c35364"},
+ {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8ecd059fdaf60c1963c58ceb8997b32e9dc1b911f5da5307aab614f1ce5c2fb"},
+ {file = "pillow-10.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c365fd1703040de1ec284b176d6af5abe21b427cb3a5ff68e0759e1e313a5e7e"},
+ {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:70c61d4c475835a19b3a5aa42492409878bbca7438554a1f89d20d58a7c75c01"},
+ {file = "pillow-10.2.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6f491cdf80ae540738859d9766783e3b3c8e5bd37f5dfa0b76abdecc5081f13"},
+ {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d189550615b4948f45252d7f005e53c2040cea1af5b60d6f79491a6e147eef7"},
+ {file = "pillow-10.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49d9ba1ed0ef3e061088cd1e7538a0759aab559e2e0a80a36f9fd9d8c0c21591"},
+ {file = "pillow-10.2.0-cp39-cp39-win32.whl", hash = "sha256:babf5acfede515f176833ed6028754cbcd0d206f7f614ea3447d67c33be12516"},
+ {file = "pillow-10.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:0304004f8067386b477d20a518b50f3fa658a28d44e4116970abfcd94fac34a8"},
+ {file = "pillow-10.2.0-cp39-cp39-win_arm64.whl", hash = "sha256:0fb3e7fc88a14eacd303e90481ad983fd5b69c761e9e6ef94c983f91025da869"},
+ {file = "pillow-10.2.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:322209c642aabdd6207517e9739c704dc9f9db943015535783239022002f054a"},
+ {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3eedd52442c0a5ff4f887fab0c1c0bb164d8635b32c894bc1faf4c618dd89df2"},
+ {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb28c753fd5eb3dd859b4ee95de66cc62af91bcff5db5f2571d32a520baf1f04"},
+ {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:33870dc4653c5017bf4c8873e5488d8f8d5f8935e2f1fb9a2208c47cdd66efd2"},
+ {file = "pillow-10.2.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3c31822339516fb3c82d03f30e22b1d038da87ef27b6a78c9549888f8ceda39a"},
+ {file = "pillow-10.2.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:a2b56ba36e05f973d450582fb015594aaa78834fefe8dfb8fcd79b93e64ba4c6"},
+ {file = "pillow-10.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d8e6aeb9201e655354b3ad049cb77d19813ad4ece0df1249d3c793de3774f8c7"},
+ {file = "pillow-10.2.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:2247178effb34a77c11c0e8ac355c7a741ceca0a732b27bf11e747bbc950722f"},
+ {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15587643b9e5eb26c48e49a7b33659790d28f190fc514a322d55da2fb5c2950e"},
+ {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753cd8f2086b2b80180d9b3010dd4ed147efc167c90d3bf593fe2af21265e5a5"},
+ {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7c8f97e8e7a9009bcacbe3766a36175056c12f9a44e6e6f2d5caad06dcfbf03b"},
+ {file = "pillow-10.2.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d1b35bcd6c5543b9cb547dee3150c93008f8dd0f1fef78fc0cd2b141c5baf58a"},
+ {file = "pillow-10.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fe4c15f6c9285dc54ce6553a3ce908ed37c8f3825b5a51a15c91442bb955b868"},
+ {file = "pillow-10.2.0.tar.gz", hash = "sha256:e87f0b2c78157e12d7686b27d63c070fd65d994e8ddae6f328e0dcf4a0cd007e"},
+]
+
+[package.extras]
+docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"]
+fpx = ["olefile"]
+mic = ["olefile"]
+tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"]
+typing = ["typing-extensions"]
+xmp = ["defusedxml"]
[[package]]
name = "platformdirs"
-version = "3.1.0"
+version = "4.2.0"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
-category = "dev"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
+files = [
+ {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"},
+ {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"},
+]
[package.extras]
-docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-autodoc-typehints (>=1.22,!=1.23.4)"]
-test = ["appdirs (==1.4.4)", "covdefaults (>=2.2.2)", "pytest (>=7.2.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"]
+docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
+test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
[[package]]
name = "pluggy"
-version = "1.0.0"
+version = "1.4.0"
description = "plugin and hook calling mechanisms for python"
-category = "dev"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
+files = [
+ {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"},
+ {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"},
+]
[package.extras]
dev = ["pre-commit", "tox"]
@@ -307,9 +1024,12 @@ testing = ["pytest", "pytest-benchmark"]
name = "pre-commit"
version = "2.21.0"
description = "A framework for managing and maintaining multi-language pre-commit hooks."
-category = "dev"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"},
+ {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"},
+]
[package.dependencies]
cfgv = ">=2.0.0"
@@ -322,50 +1042,141 @@ virtualenv = ">=20.10.0"
name = "pycaracal"
version = "0.14.5"
description = ""
-category = "main"
optional = false
python-versions = ">=3.8"
+files = [
+ {file = "pycaracal-0.14.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:d7bfc919f0f7b05f0631159a1a3294b4d3af07e9d1af16e772c25e8d2d13f609"},
+ {file = "pycaracal-0.14.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:982750be1853274d977e4163dbe256950064f1c9c44c97ae2370b246abadc205"},
+ {file = "pycaracal-0.14.5-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ef22c1aeeed7ef54de8f1b73f05a4221b8d605745e9ca4ac03f0abcf7174dbf"},
+ {file = "pycaracal-0.14.5-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed894eebd2d44c139a760021eb1b3b2af70a92de45ceace8791eb204e840979"},
+ {file = "pycaracal-0.14.5-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:fa5cb4256b7e335be8c7043affeab63332323f8a7388558a43fd29050539bb6b"},
+ {file = "pycaracal-0.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0168094057e00e00f335e5adc2cf10444cdce141c4b01ff79324bbc336a67ee3"},
+ {file = "pycaracal-0.14.5-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:754c1ea631c394215a3620aa0e82cbbbd77b2ebfc85d64674c9dd8238ffc54d6"},
+ {file = "pycaracal-0.14.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:730b0dd5d734076fe684a006af2afaed55d40d4ed7a243b1af6943a2d4ad6ea1"},
+ {file = "pycaracal-0.14.5-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7758902c5f923c758c54c171f97f9022d7084407d41a7688f0ec36d53b93457a"},
+ {file = "pycaracal-0.14.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3921cbe321f34f650b02f53a5c5d675c3ae43ed4ec4bfdcd3dd073007b771476"},
+ {file = "pycaracal-0.14.5-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db0eae35c2f76735bdb2427116029fb97bb651d3b3b9e350d676d393a6875521"},
+ {file = "pycaracal-0.14.5-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41422868968a6e805c8933c4043bb664b96996864b4bbfe131129356f3847962"},
+ {file = "pycaracal-0.14.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1fb5a407d3ce5793ed1d7659954230d2d341df5a7782bf08da20e5fbedb57907"},
+ {file = "pycaracal-0.14.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:159b93629f0e62b774ae06e6030df6999919e61378b5289bcc17c5d676c74cf1"},
+ {file = "pycaracal-0.14.5-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49fb72070e0a75380e642876bb89522271a8fd0cbfe0145a8c815e7808d720f0"},
+ {file = "pycaracal-0.14.5-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:af8129cab7c9784ba7587652f703d110343a33dbd219831a9e47e11ff72cecaa"},
+ {file = "pycaracal-0.14.5.tar.gz", hash = "sha256:5b94de329627326022b4bc161d81e9050564d1034ac2338357d4760805f5d403"},
+]
[[package]]
name = "pych-client"
-version = "0.3.1"
+version = "0.4.0"
description = "A ClickHouse client for Python, with a command-line interface."
-category = "main"
optional = false
python-versions = ">=3.8,<4.0"
+files = [
+ {file = "pych_client-0.4.0-py3-none-any.whl", hash = "sha256:95a8b7d5d9256cda39ce31ca8aae8dacd655eb1209faa811c7e4ed823cd684f5"},
+ {file = "pych_client-0.4.0.tar.gz", hash = "sha256:72ae66e6cb44811194699ed3f832490b3573d09ba6abaefc57cdd85b57c59129"},
+]
[package.dependencies]
-httpx = ">=0.23.0,<0.24.0"
+httpx = ">=0.25.0,<0.26.0"
[package.extras]
-orjson = ["orjson (>=3.6.7,<4.0.0)"]
+orjson = ["orjson (>=3.9.10,<4.0.0)"]
[[package]]
name = "pycparser"
version = "2.21"
description = "C parser in Python"
-category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
+files = [
+ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
+ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
+]
[[package]]
name = "pygfc"
version = "1.0.5"
description = "Implementation of a Generalized-Feistel Cipher for generating random permutations."
-category = "main"
optional = false
python-versions = ">=3.6"
+files = [
+ {file = "pygfc-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd51b29d43ce80419d89a4094abb8ae18bdf3dd305974e91830035596dfe3f92"},
+ {file = "pygfc-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce951014fc3c1b7b402d1a349df425a8d06e76c166848f9c0d3e5688f60f22ba"},
+ {file = "pygfc-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d04e8c0626570999ff9fb4a731b25eae0cf7ce91f5abc83f426cfa2e7e6c275"},
+ {file = "pygfc-1.0.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:676d4036eb525de94b7c38f23698392364e50750bef55030b0c792cc723bd2b0"},
+ {file = "pygfc-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:60efdaabdc8a8e0c02d87f56eecbdbcf53df5a851a700c21b6629c55270f4cad"},
+ {file = "pygfc-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:819bb4da04c8b740befa85f1727788164229be094e0fda1a69c02bcc6f2e820d"},
+ {file = "pygfc-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:258d2b175401003e68fa8dd3f6eb3f972b06be0942090212709ed23cf98239d1"},
+ {file = "pygfc-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc4635c6feabdf74f6845a60b336234ce50b25bb38d4674cd7814b064dbfa6f7"},
+ {file = "pygfc-1.0.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c11cb233402171f59706cbfb452754bb5fb3fdcd2c562185a239dec5db620f7"},
+ {file = "pygfc-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1eaf8ca7542e79b8cc5dce51a26c72ecce01fa1162408f8c1eaf7af84e28f378"},
+ {file = "pygfc-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6a728d6f0a28713510e40d4a7e365995d72af4f222df4761117a6b3b7330aa2a"},
+ {file = "pygfc-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c1d032cd6e6f8b259d85d9c1093912aa6bcbe6b93e5f342c9cfffd7324dd6034"},
+ {file = "pygfc-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dc9f4d8da11cb0eb79104a43523ad994a1aa22b870712c2b7a77d47b13440ba"},
+ {file = "pygfc-1.0.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5561bde1b4fdc447c5d05924bbb42c8fb8785e1e37ca4f939c81c296038bd03f"},
+ {file = "pygfc-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fff5aba9369814f2c41b2beab4fa0a423eaabe7329894ded0c1338c329a2b357"},
+ {file = "pygfc-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:44a089b78a0bb9b7262897215a11e9ce8203f44466b7d6af3528ce76bd361fd1"},
+ {file = "pygfc-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2bee293c5dbc6bf2c4059438af0cb78b46d5ca85360e9b4f53ade3f81851f004"},
+ {file = "pygfc-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7023d98aa927cf0795850e4dcbc130f37244a8167fd8ff1cf64dbb8b82551dd"},
+ {file = "pygfc-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a1ff585e073c9e0a310406073b19b5b836e57bc948cb016658e9f9bcde54520"},
+ {file = "pygfc-1.0.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:991770d4ea13a481cc29491b317cdb3aaf52b7010c0c6296cca6efcd821e0617"},
+ {file = "pygfc-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a709a8fb73e7473de24a2ad7e09cda2d5800530b1e5625c31bae1e478db76a8b"},
+ {file = "pygfc-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:843797854cb203744536c49d2b3a27eecc7a66216bee5e18852b71a087a8de21"},
+ {file = "pygfc-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b6c2e62b31711cf7f9befff6f2b4ca1b67cb3aaad3b2fe3239a91deea6255b9f"},
+ {file = "pygfc-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da80f143aead77fb0b741029e179ae24a6569e57e38c7134bebb49745e42d020"},
+ {file = "pygfc-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a382419308c5316629d795f6fe0712f515485aabfddb9c80e5a24981a8046054"},
+ {file = "pygfc-1.0.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7464055da80027cd0ec08cfe80352170948075bbf14302bccaedbb769d519df3"},
+ {file = "pygfc-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a3526a9160b963b5d529b207819595e5438768d038f15b68c116e83dc93ea28f"},
+ {file = "pygfc-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:378cee6578989c7567c648092fa67745a430139319f85b2d95558137260ab4c6"},
+ {file = "pygfc-1.0.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3dc51ab6345dfc5bc2c7bd6cc7cbd711345d129fa1162a49440790d6b95fda0e"},
+ {file = "pygfc-1.0.5-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0e0f07637f9fddd61664e21a20998ecd59c588c9e55a66ec76ca25b68a671d1"},
+ {file = "pygfc-1.0.5-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b160e81056770c39ef63c188e332891243210da040dac9ed9e1996bb26e91ba6"},
+ {file = "pygfc-1.0.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a3a2a92f6513e3b23ccda0fc9f55de523b0038699225aa2dd4b5ba22e6517b3"},
+ {file = "pygfc-1.0.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c93a40950a01884e71009897892f90e3e7f493cd7ed59e93b03095c5a1b81c84"},
+ {file = "pygfc-1.0.5-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:494f39c4c8b4629eed35e6792c16f2893d54baa82ae89b88e9b9a25b1cda82b0"},
+ {file = "pygfc-1.0.5.tar.gz", hash = "sha256:94e524aac53eb8893ddaad54c0d97e4323e64a223ee0393de5ee8549949b55af"},
+]
+
+[[package]]
+name = "pygments"
+version = "2.17.2"
+description = "Pygments is a syntax highlighting package written in Python."
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"},
+ {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"},
+]
+
+[package.extras]
+plugins = ["importlib-metadata"]
+windows-terminal = ["colorama (>=0.4.6)"]
+
+[[package]]
+name = "pyparsing"
+version = "3.1.2"
+description = "pyparsing module - Classes and methods to define and execute parsing grammars"
+optional = false
+python-versions = ">=3.6.8"
+files = [
+ {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"},
+ {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"},
+]
+
+[package.extras]
+diagrams = ["jinja2", "railroad-diagrams"]
[[package]]
name = "pytest"
-version = "7.2.2"
+version = "7.4.4"
description = "pytest: simple powerful testing with Python"
-category = "dev"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"},
+ {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"},
+]
[package.dependencies]
-attrs = ">=19.2.0"
colorama = {version = "*", markers = "sys_platform == \"win32\""}
exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""}
iniconfig = "*"
@@ -374,15 +1185,18 @@ pluggy = ">=0.12,<2.0"
tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""}
[package.extras]
-testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "xmlschema"]
+testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"]
[[package]]
name = "pytest-cov"
version = "3.0.0"
description = "Pytest plugin for measuring coverage."
-category = "dev"
optional = false
python-versions = ">=3.6"
+files = [
+ {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
+ {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"},
+]
[package.dependencies]
coverage = {version = ">=5.2.1", extras = ["toml"]}
@@ -391,56 +1205,208 @@ pytest = ">=4.6"
[package.extras]
testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"]
+[[package]]
+name = "pytest-profiling"
+version = "1.7.0"
+description = "Profiling plugin for py.test"
+optional = false
+python-versions = "*"
+files = [
+ {file = "pytest-profiling-1.7.0.tar.gz", hash = "sha256:93938f147662225d2b8bd5af89587b979652426a8a6ffd7e73ec4a23e24b7f29"},
+ {file = "pytest_profiling-1.7.0-py2.py3-none-any.whl", hash = "sha256:999cc9ac94f2e528e3f5d43465da277429984a1c237ae9818f8cfd0b06acb019"},
+]
+
+[package.dependencies]
+gprof2dot = "*"
+pytest = "*"
+six = "*"
+
+[package.extras]
+tests = ["pytest-virtualenv"]
+
+[[package]]
+name = "pytest-xdist"
+version = "3.5.0"
+description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"},
+ {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"},
+]
+
+[package.dependencies]
+execnet = ">=1.1"
+pytest = ">=6.2.0"
+
+[package.extras]
+psutil = ["psutil (>=3.0)"]
+setproctitle = ["setproctitle"]
+testing = ["filelock"]
+
+[[package]]
+name = "python-dateutil"
+version = "2.9.0.post0"
+description = "Extensions to the standard Python datetime module"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7"
+files = [
+ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"},
+ {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"},
+]
+
+[package.dependencies]
+six = ">=1.5"
+
[[package]]
name = "pyyaml"
-version = "6.0"
+version = "6.0.1"
description = "YAML parser and emitter for Python"
-category = "dev"
optional = false
python-versions = ">=3.6"
+files = [
+ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"},
+ {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"},
+ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"},
+ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"},
+ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"},
+ {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"},
+ {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"},
+ {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"},
+ {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"},
+ {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"},
+ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"},
+ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"},
+ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"},
+ {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"},
+ {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"},
+ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"},
+ {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"},
+ {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"},
+ {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"},
+ {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"},
+ {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"},
+ {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"},
+ {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"},
+ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"},
+ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"},
+ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"},
+ {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"},
+ {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"},
+ {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"},
+ {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"},
+ {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"},
+ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"},
+ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"},
+ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"},
+ {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"},
+ {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"},
+ {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"},
+ {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"},
+]
[[package]]
-name = "rfc3986"
-version = "1.5.0"
-description = "Validating URI References per RFC 3986"
-category = "main"
+name = "scipy"
+version = "1.13.0"
+description = "Fundamental algorithms for scientific computing in Python"
optional = false
-python-versions = "*"
+python-versions = ">=3.9"
+files = [
+ {file = "scipy-1.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba419578ab343a4e0a77c0ef82f088238a93eef141b2b8017e46149776dfad4d"},
+ {file = "scipy-1.13.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:22789b56a999265431c417d462e5b7f2b487e831ca7bef5edeb56efe4c93f86e"},
+ {file = "scipy-1.13.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f1432ba070e90d42d7fd836462c50bf98bd08bed0aa616c359eed8a04e3922"},
+ {file = "scipy-1.13.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8434f6f3fa49f631fae84afee424e2483289dfc30a47755b4b4e6b07b2633a4"},
+ {file = "scipy-1.13.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dcbb9ea49b0167de4167c40eeee6e167caeef11effb0670b554d10b1e693a8b9"},
+ {file = "scipy-1.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:1d2f7bb14c178f8b13ebae93f67e42b0a6b0fc50eba1cd8021c9b6e08e8fb1cd"},
+ {file = "scipy-1.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0fbcf8abaf5aa2dc8d6400566c1a727aed338b5fe880cde64907596a89d576fa"},
+ {file = "scipy-1.13.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5e4a756355522eb60fcd61f8372ac2549073c8788f6114449b37e9e8104f15a5"},
+ {file = "scipy-1.13.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5acd8e1dbd8dbe38d0004b1497019b2dbbc3d70691e65d69615f8a7292865d7"},
+ {file = "scipy-1.13.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ff7dad5d24a8045d836671e082a490848e8639cabb3dbdacb29f943a678683d"},
+ {file = "scipy-1.13.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4dca18c3ffee287ddd3bc8f1dabaf45f5305c5afc9f8ab9cbfab855e70b2df5c"},
+ {file = "scipy-1.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:a2f471de4d01200718b2b8927f7d76b5d9bde18047ea0fa8bd15c5ba3f26a1d6"},
+ {file = "scipy-1.13.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d0de696f589681c2802f9090fff730c218f7c51ff49bf252b6a97ec4a5d19e8b"},
+ {file = "scipy-1.13.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:b2a3ff461ec4756b7e8e42e1c681077349a038f0686132d623fa404c0bee2551"},
+ {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf9fe63e7a4bf01d3645b13ff2aa6dea023d38993f42aaac81a18b1bda7a82a"},
+ {file = "scipy-1.13.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e7626dfd91cdea5714f343ce1176b6c4745155d234f1033584154f60ef1ff42"},
+ {file = "scipy-1.13.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:109d391d720fcebf2fbe008621952b08e52907cf4c8c7efc7376822151820820"},
+ {file = "scipy-1.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:8930ae3ea371d6b91c203b1032b9600d69c568e537b7988a3073dfe4d4774f21"},
+ {file = "scipy-1.13.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5407708195cb38d70fd2d6bb04b1b9dd5c92297d86e9f9daae1576bd9e06f602"},
+ {file = "scipy-1.13.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ac38c4c92951ac0f729c4c48c9e13eb3675d9986cc0c83943784d7390d540c78"},
+ {file = "scipy-1.13.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09c74543c4fbeb67af6ce457f6a6a28e5d3739a87f62412e4a16e46f164f0ae5"},
+ {file = "scipy-1.13.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28e286bf9ac422d6beb559bc61312c348ca9b0f0dae0d7c5afde7f722d6ea13d"},
+ {file = "scipy-1.13.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:33fde20efc380bd23a78a4d26d59fc8704e9b5fd9b08841693eb46716ba13d86"},
+ {file = "scipy-1.13.0-cp39-cp39-win_amd64.whl", hash = "sha256:45c08bec71d3546d606989ba6e7daa6f0992918171e2a6f7fbedfa7361c2de1e"},
+ {file = "scipy-1.13.0.tar.gz", hash = "sha256:58569af537ea29d3f78e5abd18398459f195546bb3be23d16677fb26616cc11e"},
+]
[package.dependencies]
-idna = {version = "*", optional = true, markers = "extra == \"idna2008\""}
+numpy = ">=1.22.4,<2.3"
[package.extras]
-idna2008 = ["idna"]
+dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy", "pycodestyle", "pydevtool", "rich-click", "ruff", "types-psutil", "typing_extensions"]
+doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.12.0)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"]
+test = ["array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "mpmath", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"]
[[package]]
name = "setuptools"
-version = "67.5.1"
+version = "69.1.1"
description = "Easily download, build, install, upgrade, and uninstall Python packages"
-category = "dev"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
+files = [
+ {file = "setuptools-69.1.1-py3-none-any.whl", hash = "sha256:02fa291a0471b3a18b2b2481ed902af520c69e8ae0919c13da936542754b4c56"},
+ {file = "setuptools-69.1.1.tar.gz", hash = "sha256:5c0806c7d9af348e6dd3777b4f4dbb42c7ad85b190104837488eab9a7c945cf8"},
+]
[package.extras]
-docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
-testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
-testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
+docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
+testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
+testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
+
+[[package]]
+name = "six"
+version = "1.16.0"
+description = "Python 2 and 3 compatibility utilities"
+optional = false
+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*"
+files = [
+ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"},
+ {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"},
+]
[[package]]
name = "sniffio"
-version = "1.3.0"
+version = "1.3.1"
description = "Sniff out which async library your code is running under"
-category = "main"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"},
+ {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"},
+]
[[package]]
name = "tabulate"
version = "0.8.10"
description = "Pretty-print tabular data"
-category = "main"
optional = false
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
+files = [
+ {file = "tabulate-0.8.10-py3-none-any.whl", hash = "sha256:0ba055423dbaa164b9e456abe7920c5e8ed33fcc16f6d1b2f2d152c8e1e8b4fc"},
+ {file = "tabulate-0.8.10.tar.gz", hash = "sha256:6c57f3f3dd7ac2782770155f3adb2db0b1a269637e42f27599925e64b114f519"},
+]
[package.extras]
widechars = ["wcwidth"]
@@ -449,17 +1415,43 @@ widechars = ["wcwidth"]
name = "tomli"
version = "2.0.1"
description = "A lil' TOML parser"
-category = "dev"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
+ {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
+]
+
+[[package]]
+name = "tqdm"
+version = "4.66.2"
+description = "Fast, Extensible Progress Meter"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"},
+ {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[package.extras]
+dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"]
+notebook = ["ipywidgets (>=6)"]
+slack = ["slack-sdk"]
+telegram = ["requests"]
[[package]]
name = "typer"
version = "0.4.2"
description = "Typer, build great CLIs. Easy to code. Based on Python type hints."
-category = "main"
optional = false
python-versions = ">=3.6"
+files = [
+ {file = "typer-0.4.2-py3-none-any.whl", hash = "sha256:023bae00d1baf358a6cc7cea45851639360bb716de687b42b0a4641cd99173f1"},
+ {file = "typer-0.4.2.tar.gz", hash = "sha256:b8261c6c0152dd73478b5ba96ba677e5d6948c715c310f7c91079f311f62ec03"},
+]
[package.dependencies]
click = ">=7.1.1,<9.0.0"
@@ -474,42 +1466,212 @@ test = ["black (>=22.3.0,<23.0.0)", "coverage (>=5.2,<6.0)", "isort (>=5.0.6,<6.
name = "types-tabulate"
version = "0.8.11"
description = "Typing stubs for tabulate"
-category = "dev"
optional = false
python-versions = "*"
+files = [
+ {file = "types-tabulate-0.8.11.tar.gz", hash = "sha256:17a5fa3b5ca453815778fc9865e8ecd0118b07b2b9faff3e2b06fe448174dd5e"},
+ {file = "types_tabulate-0.8.11-py3-none-any.whl", hash = "sha256:af811268241e8fb87b63c052c87d1e329898a93191309d5d42111372232b2e0e"},
+]
[[package]]
name = "typing-extensions"
-version = "4.5.0"
-description = "Backported and Experimental Type Hints for Python 3.7+"
-category = "dev"
+version = "4.10.0"
+description = "Backported and Experimental Type Hints for Python 3.8+"
optional = false
-python-versions = ">=3.7"
+python-versions = ">=3.8"
+files = [
+ {file = "typing_extensions-4.10.0-py3-none-any.whl", hash = "sha256:69b1a937c3a517342112fb4c6df7e72fc39a38e7891a5730ed4985b5214b5475"},
+ {file = "typing_extensions-4.10.0.tar.gz", hash = "sha256:b0abd7c89e8fb96f98db18d86106ff1d90ab692004eb746cf6eda2682f91b3cb"},
+]
[[package]]
name = "virtualenv"
-version = "20.20.0"
+version = "20.25.1"
description = "Virtual Python Environment builder"
-category = "dev"
optional = false
python-versions = ">=3.7"
+files = [
+ {file = "virtualenv-20.25.1-py3-none-any.whl", hash = "sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a"},
+ {file = "virtualenv-20.25.1.tar.gz", hash = "sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197"},
+]
[package.dependencies]
-distlib = ">=0.3.6,<1"
-filelock = ">=3.4.1,<4"
-platformdirs = ">=2.4,<4"
+distlib = ">=0.3.7,<1"
+filelock = ">=3.12.2,<4"
+platformdirs = ">=3.9.1,<5"
[package.extras]
-docs = ["furo (>=2022.12.7)", "proselint (>=0.13)", "sphinx (>=6.1.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=22.12)"]
-test = ["covdefaults (>=2.2.2)", "coverage (>=7.1)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23)", "pytest (>=7.2.1)", "pytest-env (>=0.8.1)", "pytest-freezegun (>=0.4.2)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)"]
+docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
+test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"]
+
+[[package]]
+name = "xxhash"
+version = "3.4.1"
+description = "Python binding for xxHash"
+optional = false
+python-versions = ">=3.7"
+files = [
+ {file = "xxhash-3.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91dbfa55346ad3e18e738742236554531a621042e419b70ad8f3c1d9c7a16e7f"},
+ {file = "xxhash-3.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:665a65c2a48a72068fcc4d21721510df5f51f1142541c890491afc80451636d2"},
+ {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb11628470a6004dc71a09fe90c2f459ff03d611376c1debeec2d648f44cb693"},
+ {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5bef2a7dc7b4f4beb45a1edbba9b9194c60a43a89598a87f1a0226d183764189"},
+ {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c0f7b2d547d72c7eda7aa817acf8791f0146b12b9eba1d4432c531fb0352228"},
+ {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00f2fdef6b41c9db3d2fc0e7f94cb3db86693e5c45d6de09625caad9a469635b"},
+ {file = "xxhash-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:23cfd9ca09acaf07a43e5a695143d9a21bf00f5b49b15c07d5388cadf1f9ce11"},
+ {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a9ff50a3cf88355ca4731682c168049af1ca222d1d2925ef7119c1a78e95b3b"},
+ {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1d7c69a1e9ca5faa75546fdd267f214f63f52f12692f9b3a2f6467c9e67d5e7"},
+ {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:672b273040d5d5a6864a36287f3514efcd1d4b1b6a7480f294c4b1d1ee1b8de0"},
+ {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4178f78d70e88f1c4a89ff1ffe9f43147185930bb962ee3979dba15f2b1cc799"},
+ {file = "xxhash-3.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:9804b9eb254d4b8cc83ab5a2002128f7d631dd427aa873c8727dba7f1f0d1c2b"},
+ {file = "xxhash-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c09c49473212d9c87261d22c74370457cfff5db2ddfc7fd1e35c80c31a8c14ce"},
+ {file = "xxhash-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:ebbb1616435b4a194ce3466d7247df23499475c7ed4eb2681a1fa42ff766aff6"},
+ {file = "xxhash-3.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:25dc66be3db54f8a2d136f695b00cfe88018e59ccff0f3b8f545869f376a8a46"},
+ {file = "xxhash-3.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:58c49083801885273e262c0f5bbeac23e520564b8357fbb18fb94ff09d3d3ea5"},
+ {file = "xxhash-3.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b526015a973bfbe81e804a586b703f163861da36d186627e27524f5427b0d520"},
+ {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:36ad4457644c91a966f6fe137d7467636bdc51a6ce10a1d04f365c70d6a16d7e"},
+ {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:248d3e83d119770f96003271fe41e049dd4ae52da2feb8f832b7a20e791d2920"},
+ {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2070b6d5bbef5ee031666cf21d4953c16e92c2f8a24a94b5c240f8995ba3b1d0"},
+ {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2746035f518f0410915e247877f7df43ef3372bf36cfa52cc4bc33e85242641"},
+ {file = "xxhash-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ba6181514681c2591840d5632fcf7356ab287d4aff1c8dea20f3c78097088"},
+ {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0aac5010869240e95f740de43cd6a05eae180c59edd182ad93bf12ee289484fa"},
+ {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4cb11d8debab1626181633d184b2372aaa09825bde709bf927704ed72765bed1"},
+ {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b29728cff2c12f3d9f1d940528ee83918d803c0567866e062683f300d1d2eff3"},
+ {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:a15cbf3a9c40672523bdb6ea97ff74b443406ba0ab9bca10ceccd9546414bd84"},
+ {file = "xxhash-3.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:6e66df260fed01ed8ea790c2913271641c58481e807790d9fca8bfd5a3c13844"},
+ {file = "xxhash-3.4.1-cp311-cp311-win32.whl", hash = "sha256:e867f68a8f381ea12858e6d67378c05359d3a53a888913b5f7d35fbf68939d5f"},
+ {file = "xxhash-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:200a5a3ad9c7c0c02ed1484a1d838b63edcf92ff538770ea07456a3732c577f4"},
+ {file = "xxhash-3.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:1d03f1c0d16d24ea032e99f61c552cb2b77d502e545187338bea461fde253583"},
+ {file = "xxhash-3.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c4bbba9b182697a52bc0c9f8ec0ba1acb914b4937cd4a877ad78a3b3eeabefb3"},
+ {file = "xxhash-3.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9fd28a9da300e64e434cfc96567a8387d9a96e824a9be1452a1e7248b7763b78"},
+ {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6066d88c9329ab230e18998daec53d819daeee99d003955c8db6fc4971b45ca3"},
+ {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93805bc3233ad89abf51772f2ed3355097a5dc74e6080de19706fc447da99cd3"},
+ {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64da57d5ed586ebb2ecdde1e997fa37c27fe32fe61a656b77fabbc58e6fbff6e"},
+ {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a97322e9a7440bf3c9805cbaac090358b43f650516486746f7fa482672593df"},
+ {file = "xxhash-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbe750d512982ee7d831838a5dee9e9848f3fb440e4734cca3f298228cc957a6"},
+ {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fd79d4087727daf4d5b8afe594b37d611ab95dc8e29fe1a7517320794837eb7d"},
+ {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:743612da4071ff9aa4d055f3f111ae5247342931dedb955268954ef7201a71ff"},
+ {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b41edaf05734092f24f48c0958b3c6cbaaa5b7e024880692078c6b1f8247e2fc"},
+ {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a90356ead70d715fe64c30cd0969072de1860e56b78adf7c69d954b43e29d9fa"},
+ {file = "xxhash-3.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ac56eebb364e44c85e1d9e9cc5f6031d78a34f0092fea7fc80478139369a8b4a"},
+ {file = "xxhash-3.4.1-cp312-cp312-win32.whl", hash = "sha256:911035345932a153c427107397c1518f8ce456f93c618dd1c5b54ebb22e73747"},
+ {file = "xxhash-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:f31ce76489f8601cc7b8713201ce94b4bd7b7ce90ba3353dccce7e9e1fee71fa"},
+ {file = "xxhash-3.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:b5beb1c6a72fdc7584102f42c4d9df232ee018ddf806e8c90906547dfb43b2da"},
+ {file = "xxhash-3.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6d42b24d1496deb05dee5a24ed510b16de1d6c866c626c2beb11aebf3be278b9"},
+ {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b685fab18876b14a8f94813fa2ca80cfb5ab6a85d31d5539b7cd749ce9e3624"},
+ {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:419ffe34c17ae2df019a4685e8d3934d46b2e0bbe46221ab40b7e04ed9f11137"},
+ {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0e041ce5714f95251a88670c114b748bca3bf80cc72400e9f23e6d0d59cf2681"},
+ {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc860d887c5cb2f524899fb8338e1bb3d5789f75fac179101920d9afddef284b"},
+ {file = "xxhash-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:312eba88ffe0a05e332e3a6f9788b73883752be63f8588a6dc1261a3eaaaf2b2"},
+ {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e01226b6b6a1ffe4e6bd6d08cfcb3ca708b16f02eb06dd44f3c6e53285f03e4f"},
+ {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9f3025a0d5d8cf406a9313cd0d5789c77433ba2004b1c75439b67678e5136537"},
+ {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:6d3472fd4afef2a567d5f14411d94060099901cd8ce9788b22b8c6f13c606a93"},
+ {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:43984c0a92f06cac434ad181f329a1445017c33807b7ae4f033878d860a4b0f2"},
+ {file = "xxhash-3.4.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a55e0506fdb09640a82ec4f44171273eeabf6f371a4ec605633adb2837b5d9d5"},
+ {file = "xxhash-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:faec30437919555b039a8bdbaba49c013043e8f76c999670aef146d33e05b3a0"},
+ {file = "xxhash-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c9e1b646af61f1fc7083bb7b40536be944f1ac67ef5e360bca2d73430186971a"},
+ {file = "xxhash-3.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:961d948b7b1c1b6c08484bbce3d489cdf153e4122c3dfb07c2039621243d8795"},
+ {file = "xxhash-3.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:719a378930504ab159f7b8e20fa2aa1896cde050011af838af7e7e3518dd82de"},
+ {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74fb5cb9406ccd7c4dd917f16630d2e5e8cbbb02fc2fca4e559b2a47a64f4940"},
+ {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5dab508ac39e0ab988039bc7f962c6ad021acd81fd29145962b068df4148c476"},
+ {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c59f3e46e7daf4c589e8e853d700ef6607afa037bfad32c390175da28127e8c"},
+ {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8cc07256eff0795e0f642df74ad096f8c5d23fe66bc138b83970b50fc7f7f6c5"},
+ {file = "xxhash-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9f749999ed80f3955a4af0eb18bb43993f04939350b07b8dd2f44edc98ffee9"},
+ {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:7688d7c02149a90a3d46d55b341ab7ad1b4a3f767be2357e211b4e893efbaaf6"},
+ {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a8b4977963926f60b0d4f830941c864bed16aa151206c01ad5c531636da5708e"},
+ {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8106d88da330f6535a58a8195aa463ef5281a9aa23b04af1848ff715c4398fb4"},
+ {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4c76a77dbd169450b61c06fd2d5d436189fc8ab7c1571d39265d4822da16df22"},
+ {file = "xxhash-3.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11f11357c86d83e53719c592021fd524efa9cf024dc7cb1dfb57bbbd0d8713f2"},
+ {file = "xxhash-3.4.1-cp38-cp38-win32.whl", hash = "sha256:0c786a6cd74e8765c6809892a0d45886e7c3dc54de4985b4a5eb8b630f3b8e3b"},
+ {file = "xxhash-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:aabf37fb8fa27430d50507deeab2ee7b1bcce89910dd10657c38e71fee835594"},
+ {file = "xxhash-3.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6127813abc1477f3a83529b6bbcfeddc23162cece76fa69aee8f6a8a97720562"},
+ {file = "xxhash-3.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef2e194262f5db16075caea7b3f7f49392242c688412f386d3c7b07c7733a70a"},
+ {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71be94265b6c6590f0018bbf73759d21a41c6bda20409782d8117e76cd0dfa8b"},
+ {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:10e0a619cdd1c0980e25eb04e30fe96cf8f4324758fa497080af9c21a6de573f"},
+ {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fa122124d2e3bd36581dd78c0efa5f429f5220313479fb1072858188bc2d5ff1"},
+ {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17032f5a4fea0a074717fe33477cb5ee723a5f428de7563e75af64bfc1b1e10"},
+ {file = "xxhash-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca7783b20e3e4f3f52f093538895863f21d18598f9a48211ad757680c3bd006f"},
+ {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d77d09a1113899fad5f354a1eb4f0a9afcf58cefff51082c8ad643ff890e30cf"},
+ {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:21287bcdd299fdc3328cc0fbbdeaa46838a1c05391264e51ddb38a3f5b09611f"},
+ {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dfd7a6cc483e20b4ad90224aeb589e64ec0f31e5610ab9957ff4314270b2bf31"},
+ {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:543c7fcbc02bbb4840ea9915134e14dc3dc15cbd5a30873a7a5bf66039db97ec"},
+ {file = "xxhash-3.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fe0a98d990e433013f41827b62be9ab43e3cf18e08b1483fcc343bda0d691182"},
+ {file = "xxhash-3.4.1-cp39-cp39-win32.whl", hash = "sha256:b9097af00ebf429cc7c0e7d2fdf28384e4e2e91008130ccda8d5ae653db71e54"},
+ {file = "xxhash-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:d699b921af0dcde50ab18be76c0d832f803034d80470703700cb7df0fbec2832"},
+ {file = "xxhash-3.4.1-cp39-cp39-win_arm64.whl", hash = "sha256:2be491723405e15cc099ade1280133ccfbf6322d2ef568494fb7d07d280e7eee"},
+ {file = "xxhash-3.4.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:431625fad7ab5649368c4849d2b49a83dc711b1f20e1f7f04955aab86cd307bc"},
+ {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc6dbd5fc3c9886a9e041848508b7fb65fd82f94cc793253990f81617b61fe49"},
+ {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3ff8dbd0ec97aec842476cb8ccc3e17dd288cd6ce3c8ef38bff83d6eb927817"},
+ {file = "xxhash-3.4.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef73a53fe90558a4096e3256752268a8bdc0322f4692ed928b6cd7ce06ad4fe3"},
+ {file = "xxhash-3.4.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:450401f42bbd274b519d3d8dcf3c57166913381a3d2664d6609004685039f9d3"},
+ {file = "xxhash-3.4.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a162840cf4de8a7cd8720ff3b4417fbc10001eefdd2d21541a8226bb5556e3bb"},
+ {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b736a2a2728ba45017cb67785e03125a79d246462dfa892d023b827007412c52"},
+ {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d0ae4c2e7698adef58710d6e7a32ff518b66b98854b1c68e70eee504ad061d8"},
+ {file = "xxhash-3.4.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6322c4291c3ff174dcd104fae41500e75dad12be6f3085d119c2c8a80956c51"},
+ {file = "xxhash-3.4.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:dd59ed668801c3fae282f8f4edadf6dc7784db6d18139b584b6d9677ddde1b6b"},
+ {file = "xxhash-3.4.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:92693c487e39523a80474b0394645b393f0ae781d8db3474ccdcead0559ccf45"},
+ {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4603a0f642a1e8d7f3ba5c4c25509aca6a9c1cc16f85091004a7028607ead663"},
+ {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6fa45e8cbfbadb40a920fe9ca40c34b393e0b067082d94006f7f64e70c7490a6"},
+ {file = "xxhash-3.4.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:595b252943b3552de491ff51e5bb79660f84f033977f88f6ca1605846637b7c6"},
+ {file = "xxhash-3.4.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:562d8b8f783c6af969806aaacf95b6c7b776929ae26c0cd941d54644ea7ef51e"},
+ {file = "xxhash-3.4.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:41ddeae47cf2828335d8d991f2d2b03b0bdc89289dc64349d712ff8ce59d0647"},
+ {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c44d584afdf3c4dbb3277e32321d1a7b01d6071c1992524b6543025fb8f4206f"},
+ {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7bddb3a5b86213cc3f2c61500c16945a1b80ecd572f3078ddbbe68f9dabdfb"},
+ {file = "xxhash-3.4.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ecb6c987b62437c2f99c01e97caf8d25660bf541fe79a481d05732e5236719c"},
+ {file = "xxhash-3.4.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:696b4e18b7023527d5c50ed0626ac0520edac45a50ec7cf3fc265cd08b1f4c03"},
+ {file = "xxhash-3.4.1.tar.gz", hash = "sha256:0379d6cf1ff987cd421609a264ce025e74f346e3e145dd106c0cc2e3ec3f99a9"},
+]
[[package]]
name = "zstandard"
-version = "0.18.0"
+version = "0.21.0"
description = "Zstandard bindings for Python"
-category = "main"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.7"
+files = [
+ {file = "zstandard-0.21.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:649a67643257e3b2cff1c0a73130609679a5673bf389564bc6d4b164d822a7ce"},
+ {file = "zstandard-0.21.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:144a4fe4be2e747bf9c646deab212666e39048faa4372abb6a250dab0f347a29"},
+ {file = "zstandard-0.21.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b72060402524ab91e075881f6b6b3f37ab715663313030d0ce983da44960a86f"},
+ {file = "zstandard-0.21.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8257752b97134477fb4e413529edaa04fc0457361d304c1319573de00ba796b1"},
+ {file = "zstandard-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c053b7c4cbf71cc26808ed67ae955836232f7638444d709bfc302d3e499364fa"},
+ {file = "zstandard-0.21.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2769730c13638e08b7a983b32cb67775650024632cd0476bf1ba0e6360f5ac7d"},
+ {file = "zstandard-0.21.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7d3bc4de588b987f3934ca79140e226785d7b5e47e31756761e48644a45a6766"},
+ {file = "zstandard-0.21.0-cp310-cp310-win32.whl", hash = "sha256:67829fdb82e7393ca68e543894cd0581a79243cc4ec74a836c305c70a5943f07"},
+ {file = "zstandard-0.21.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6048a287f8d2d6e8bc67f6b42a766c61923641dd4022b7fd3f7439e17ba5a4d"},
+ {file = "zstandard-0.21.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7f2afab2c727b6a3d466faee6974a7dad0d9991241c498e7317e5ccf53dbc766"},
+ {file = "zstandard-0.21.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff0852da2abe86326b20abae912d0367878dd0854b8931897d44cfeb18985472"},
+ {file = "zstandard-0.21.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d12fa383e315b62630bd407477d750ec96a0f438447d0e6e496ab67b8b451d39"},
+ {file = "zstandard-0.21.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1b9703fe2e6b6811886c44052647df7c37478af1b4a1a9078585806f42e5b15"},
+ {file = "zstandard-0.21.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df28aa5c241f59a7ab524f8ad8bb75d9a23f7ed9d501b0fed6d40ec3064784e8"},
+ {file = "zstandard-0.21.0-cp311-cp311-win32.whl", hash = "sha256:0aad6090ac164a9d237d096c8af241b8dcd015524ac6dbec1330092dba151657"},
+ {file = "zstandard-0.21.0-cp311-cp311-win_amd64.whl", hash = "sha256:48b6233b5c4cacb7afb0ee6b4f91820afbb6c0e3ae0fa10abbc20000acdf4f11"},
+ {file = "zstandard-0.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e7d560ce14fd209db6adacce8908244503a009c6c39eee0c10f138996cd66d3e"},
+ {file = "zstandard-0.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e6e131a4df2eb6f64961cea6f979cdff22d6e0d5516feb0d09492c8fd36f3bc"},
+ {file = "zstandard-0.21.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1e0c62a67ff425927898cf43da2cf6b852289ebcc2054514ea9bf121bec10a5"},
+ {file = "zstandard-0.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1545fb9cb93e043351d0cb2ee73fa0ab32e61298968667bb924aac166278c3fc"},
+ {file = "zstandard-0.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe6c821eb6870f81d73bf10e5deed80edcac1e63fbc40610e61f340723fd5f7c"},
+ {file = "zstandard-0.21.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ddb086ea3b915e50f6604be93f4f64f168d3fc3cef3585bb9a375d5834392d4f"},
+ {file = "zstandard-0.21.0-cp37-cp37m-win32.whl", hash = "sha256:57ac078ad7333c9db7a74804684099c4c77f98971c151cee18d17a12649bc25c"},
+ {file = "zstandard-0.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1243b01fb7926a5a0417120c57d4c28b25a0200284af0525fddba812d575f605"},
+ {file = "zstandard-0.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ea68b1ba4f9678ac3d3e370d96442a6332d431e5050223626bdce748692226ea"},
+ {file = "zstandard-0.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8070c1cdb4587a8aa038638acda3bd97c43c59e1e31705f2766d5576b329e97c"},
+ {file = "zstandard-0.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4af612c96599b17e4930fe58bffd6514e6c25509d120f4eae6031b7595912f85"},
+ {file = "zstandard-0.21.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff891e37b167bc477f35562cda1248acc115dbafbea4f3af54ec70821090965"},
+ {file = "zstandard-0.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a9fec02ce2b38e8b2e86079ff0b912445495e8ab0b137f9c0505f88ad0d61296"},
+ {file = "zstandard-0.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdbe350691dec3078b187b8304e6a9c4d9db3eb2d50ab5b1d748533e746d099"},
+ {file = "zstandard-0.21.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b69cccd06a4a0a1d9fb3ec9a97600055cf03030ed7048d4bcb88c574f7895773"},
+ {file = "zstandard-0.21.0-cp38-cp38-win32.whl", hash = "sha256:9980489f066a391c5572bc7dc471e903fb134e0b0001ea9b1d3eff85af0a6f1b"},
+ {file = "zstandard-0.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:0e1e94a9d9e35dc04bf90055e914077c80b1e0c15454cc5419e82529d3e70728"},
+ {file = "zstandard-0.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2d61675b2a73edcef5e327e38eb62bdfc89009960f0e3991eae5cc3d54718de"},
+ {file = "zstandard-0.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:25fbfef672ad798afab12e8fd204d122fca3bc8e2dcb0a2ba73bf0a0ac0f5f07"},
+ {file = "zstandard-0.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62957069a7c2626ae80023998757e27bd28d933b165c487ab6f83ad3337f773d"},
+ {file = "zstandard-0.21.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e10ed461e4807471075d4b7a2af51f5234c8f1e2a0c1d37d5ca49aaaad49e8"},
+ {file = "zstandard-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cff89a036c639a6a9299bf19e16bfb9ac7def9a7634c52c257166db09d950e7"},
+ {file = "zstandard-0.21.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52b2b5e3e7670bd25835e0e0730a236f2b0df87672d99d3bf4bf87248aa659fb"},
+ {file = "zstandard-0.21.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b1367da0dde8ae5040ef0413fb57b5baeac39d8931c70536d5f013b11d3fc3a5"},
+ {file = "zstandard-0.21.0-cp39-cp39-win32.whl", hash = "sha256:db62cbe7a965e68ad2217a056107cc43d41764c66c895be05cf9c8b19578ce9c"},
+ {file = "zstandard-0.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:a8d200617d5c876221304b0e3fe43307adde291b4a897e7b0617a61611dfff6a"},
+ {file = "zstandard-0.21.0.tar.gz", hash = "sha256:f08e3a10d01a247877e4cb61a82a319ea746c356a3786558bed2481e6c405546"},
+]
[package.dependencies]
cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\""}
@@ -518,452 +1680,6 @@ cffi = {version = ">=1.11", markers = "platform_python_implementation == \"PyPy\
cffi = ["cffi (>=1.11)"]
[metadata]
-lock-version = "1.1"
+lock-version = "2.0"
python-versions = "^3.10"
-content-hash = "87463a91bcf2071a395a1cd220ad687a7b17ec33d9ec9b6efebfc27733451815"
-
-[metadata.files]
-anyio = [
- {file = "anyio-3.6.2-py3-none-any.whl", hash = "sha256:fbbe32bd270d2a2ef3ed1c5d45041250284e31fc0a4df4a5a6071842051a51e3"},
- {file = "anyio-3.6.2.tar.gz", hash = "sha256:25ea0d673ae30af41a0c442f81cf3b38c7e79fdc7b60335a4c14e05eb0947421"},
-]
-attrs = [
- {file = "attrs-22.2.0-py3-none-any.whl", hash = "sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836"},
- {file = "attrs-22.2.0.tar.gz", hash = "sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99"},
-]
-bump2version = [
- {file = "bump2version-1.0.1-py2.py3-none-any.whl", hash = "sha256:37f927ea17cde7ae2d7baf832f8e80ce3777624554a653006c9144f8017fe410"},
- {file = "bump2version-1.0.1.tar.gz", hash = "sha256:762cb2bfad61f4ec8e2bdf452c7c267416f8c70dd9ecb1653fd0bbb01fa936e6"},
-]
-bumpversion = [
- {file = "bumpversion-0.6.0-py2.py3-none-any.whl", hash = "sha256:4eb3267a38194d09f048a2179980bb4803701969bff2c85fa8f6d1ce050be15e"},
- {file = "bumpversion-0.6.0.tar.gz", hash = "sha256:4ba55e4080d373f80177b4dabef146c07ce73c7d1377aabf9d3c3ae1f94584a6"},
-]
-certifi = [
- {file = "certifi-2022.12.7-py3-none-any.whl", hash = "sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18"},
- {file = "certifi-2022.12.7.tar.gz", hash = "sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3"},
-]
-cffi = [
- {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"},
- {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"},
- {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"},
- {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"},
- {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"},
- {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"},
- {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"},
- {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"},
- {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"},
- {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"},
- {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"},
- {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"},
- {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"},
- {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"},
- {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"},
- {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"},
- {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"},
- {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"},
- {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"},
- {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"},
- {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"},
- {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"},
- {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"},
- {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"},
- {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"},
- {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"},
- {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"},
- {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"},
- {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"},
- {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"},
- {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"},
- {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"},
- {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"},
- {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"},
- {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"},
- {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"},
- {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"},
- {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"},
- {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"},
- {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"},
- {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"},
- {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"},
- {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"},
- {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"},
- {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"},
- {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"},
- {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"},
- {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"},
- {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"},
- {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"},
- {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"},
- {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"},
- {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"},
- {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"},
- {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"},
- {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"},
- {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"},
- {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"},
- {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"},
- {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"},
- {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"},
- {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"},
- {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"},
- {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"},
-]
-cfgv = [
- {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"},
- {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"},
-]
-click = [
- {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"},
- {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"},
-]
-colorama = [
- {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
- {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
-]
-coverage = [
- {file = "coverage-7.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49567ec91fc5e0b15356da07a2feabb421d62f52a9fff4b1ec40e9e19772f5f8"},
- {file = "coverage-7.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2ef6cae70168815ed91388948b5f4fcc69681480a0061114db737f957719f03"},
- {file = "coverage-7.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3004765bca3acd9e015794e5c2f0c9a05587f5e698127ff95e9cfba0d3f29339"},
- {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cca7c0b7f5881dfe0291ef09ba7bb1582cb92ab0aeffd8afb00c700bf692415a"},
- {file = "coverage-7.2.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2167d116309f564af56f9aa5e75ef710ef871c5f9b313a83050035097b56820"},
- {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:cb5f152fb14857cbe7f3e8c9a5d98979c4c66319a33cad6e617f0067c9accdc4"},
- {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:87dc37f16fb5e3a28429e094145bf7c1753e32bb50f662722e378c5851f7fdc6"},
- {file = "coverage-7.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e191a63a05851f8bce77bc875e75457f9b01d42843f8bd7feed2fc26bbe60833"},
- {file = "coverage-7.2.1-cp310-cp310-win32.whl", hash = "sha256:e3ea04b23b114572b98a88c85379e9e9ae031272ba1fb9b532aa934c621626d4"},
- {file = "coverage-7.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:0cf557827be7eca1c38a2480484d706693e7bb1929e129785fe59ec155a59de6"},
- {file = "coverage-7.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:570c21a29493b350f591a4b04c158ce1601e8d18bdcd21db136fbb135d75efa6"},
- {file = "coverage-7.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e872b082b32065ac2834149dc0adc2a2e6d8203080501e1e3c3c77851b466f9"},
- {file = "coverage-7.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fac6343bae03b176e9b58104a9810df3cdccd5cfed19f99adfa807ffbf43cf9b"},
- {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abacd0a738e71b20e224861bc87e819ef46fedba2fb01bc1af83dfd122e9c319"},
- {file = "coverage-7.2.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d9256d4c60c4bbfec92721b51579c50f9e5062c21c12bec56b55292464873508"},
- {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:80559eaf6c15ce3da10edb7977a1548b393db36cbc6cf417633eca05d84dd1ed"},
- {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:0bd7e628f6c3ec4e7d2d24ec0e50aae4e5ae95ea644e849d92ae4805650b4c4e"},
- {file = "coverage-7.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09643fb0df8e29f7417adc3f40aaf379d071ee8f0350ab290517c7004f05360b"},
- {file = "coverage-7.2.1-cp311-cp311-win32.whl", hash = "sha256:1b7fb13850ecb29b62a447ac3516c777b0e7a09ecb0f4bb6718a8654c87dfc80"},
- {file = "coverage-7.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:617a94ada56bbfe547aa8d1b1a2b8299e2ec1ba14aac1d4b26a9f7d6158e1273"},
- {file = "coverage-7.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8649371570551d2fd7dee22cfbf0b61f1747cdfb2b7587bb551e4beaaa44cb97"},
- {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d2b9b5e70a21474c105a133ba227c61bc95f2ac3b66861143ce39a5ea4b3f84"},
- {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae82c988954722fa07ec5045c57b6d55bc1a0890defb57cf4a712ced65b26ddd"},
- {file = "coverage-7.2.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:861cc85dfbf55a7a768443d90a07e0ac5207704a9f97a8eb753292a7fcbdfcfc"},
- {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0339dc3237c0d31c3b574f19c57985fcbe494280153bbcad33f2cdf469f4ac3e"},
- {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5928b85416a388dd557ddc006425b0c37e8468bd1c3dc118c1a3de42f59e2a54"},
- {file = "coverage-7.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d3843ca645f62c426c3d272902b9de90558e9886f15ddf5efe757b12dd376f5"},
- {file = "coverage-7.2.1-cp37-cp37m-win32.whl", hash = "sha256:6a034480e9ebd4e83d1aa0453fd78986414b5d237aea89a8fdc35d330aa13bae"},
- {file = "coverage-7.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6fce673f79a0e017a4dc35e18dc7bb90bf6d307c67a11ad5e61ca8d42b87cbff"},
- {file = "coverage-7.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f099da6958ddfa2ed84bddea7515cb248583292e16bb9231d151cd528eab657"},
- {file = "coverage-7.2.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:97a3189e019d27e914ecf5c5247ea9f13261d22c3bb0cfcfd2a9b179bb36f8b1"},
- {file = "coverage-7.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a81dbcf6c6c877986083d00b834ac1e84b375220207a059ad45d12f6e518a4e3"},
- {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d2c3dde4c0b9be4b02067185136b7ee4681978228ad5ec1278fa74f5ca3e99"},
- {file = "coverage-7.2.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a209d512d157379cc9ab697cbdbb4cfd18daa3e7eebaa84c3d20b6af0037384"},
- {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f3d07edb912a978915576a776756069dede66d012baa503022d3a0adba1b6afa"},
- {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8dca3c1706670297851bca1acff9618455122246bdae623be31eca744ade05ec"},
- {file = "coverage-7.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b1991a6d64231a3e5bbe3099fb0dd7c9aeaa4275ad0e0aeff4cb9ef885c62ba2"},
- {file = "coverage-7.2.1-cp38-cp38-win32.whl", hash = "sha256:22c308bc508372576ffa3d2dbc4824bb70d28eeb4fcd79d4d1aed663a06630d0"},
- {file = "coverage-7.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:b0c0d46de5dd97f6c2d1b560bf0fcf0215658097b604f1840365296302a9d1fb"},
- {file = "coverage-7.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4dd34a935de268a133e4741827ae951283a28c0125ddcdbcbba41c4b98f2dfef"},
- {file = "coverage-7.2.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0f8318ed0f3c376cfad8d3520f496946977abde080439d6689d7799791457454"},
- {file = "coverage-7.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:834c2172edff5a08d78e2f53cf5e7164aacabeb66b369f76e7bb367ca4e2d993"},
- {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4d70c853f0546855f027890b77854508bdb4d6a81242a9d804482e667fff6e6"},
- {file = "coverage-7.2.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a6450da4c7afc4534305b2b7d8650131e130610cea448ff240b6ab73d7eab63"},
- {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:99f4dd81b2bb8fc67c3da68b1f5ee1650aca06faa585cbc6818dbf67893c6d58"},
- {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bdd3f2f285ddcf2e75174248b2406189261a79e7fedee2ceeadc76219b6faa0e"},
- {file = "coverage-7.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f29351393eb05e6326f044a7b45ed8e38cb4dcc38570d12791f271399dc41431"},
- {file = "coverage-7.2.1-cp39-cp39-win32.whl", hash = "sha256:e2b50ebc2b6121edf352336d503357321b9d8738bb7a72d06fc56153fd3f4cd8"},
- {file = "coverage-7.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd5a12239c0006252244f94863f1c518ac256160cd316ea5c47fb1a11b25889a"},
- {file = "coverage-7.2.1-pp37.pp38.pp39-none-any.whl", hash = "sha256:436313d129db7cf5b4ac355dd2bd3f7c7e5294af077b090b85de75f8458b8616"},
- {file = "coverage-7.2.1.tar.gz", hash = "sha256:c77f2a9093ccf329dd523a9b2b3c854c20d2a3d968b6def3b820272ca6732242"},
-]
-diamond-miner = [
- {file = "diamond_miner-1.0.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7228bbe337b3b827e30a28d95b5eb0f21455dbd4626f49e1a291d4966e358481"},
- {file = "diamond_miner-1.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3f0fe7124a1b9fe95942cb9474dd853e71b4dad84e007418199d972e733d0843"},
- {file = "diamond_miner-1.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea9ea4d74bb1bf62ca5a139ff67e0c7b95a325955d0e78bde760dc1982b5ee99"},
- {file = "diamond_miner-1.0.3-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:0e04a6ed386107dc79799354985e29df8e451db43ae1746a10522adffe518bbd"},
- {file = "diamond_miner-1.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9d08eb01691ffbec9b90e70af16ac42f783a63082da8f94673f710e7dde8bd9"},
- {file = "diamond_miner-1.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a9b1aa86146c8678049dc4a4616b9c896b4e6212286d19911a8a17f931cb142"},
- {file = "diamond_miner-1.0.3.tar.gz", hash = "sha256:0dfd28646862dad09f78fb07c02d97afd32f489987dda32765ae1070a5453476"},
-]
-distlib = [
- {file = "distlib-0.3.6-py2.py3-none-any.whl", hash = "sha256:f35c4b692542ca110de7ef0bea44d73981caeb34ca0b9b6b2e6d7790dda8f80e"},
- {file = "distlib-0.3.6.tar.gz", hash = "sha256:14bad2d9b04d3a36127ac97f30b12a19268f211063d8f8ee4f47108896e11b46"},
-]
-exceptiongroup = [
- {file = "exceptiongroup-1.1.0-py3-none-any.whl", hash = "sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e"},
- {file = "exceptiongroup-1.1.0.tar.gz", hash = "sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23"},
-]
-filelock = [
- {file = "filelock-3.9.0-py3-none-any.whl", hash = "sha256:f58d535af89bb9ad5cd4df046f741f8553a418c01a7856bf0d173bbc9f6bd16d"},
- {file = "filelock-3.9.0.tar.gz", hash = "sha256:7b319f24340b51f55a2bf7a12ac0755a9b03e718311dac567a0f4f7fabd2f5de"},
-]
-h11 = [
- {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"},
- {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"},
-]
-httpcore = [
- {file = "httpcore-0.16.3-py3-none-any.whl", hash = "sha256:da1fb708784a938aa084bde4feb8317056c55037247c787bd7e19eb2c2949dc0"},
- {file = "httpcore-0.16.3.tar.gz", hash = "sha256:c5d6f04e2fc530f39e0c077e6a30caa53f1451096120f1f38b954afd0b17c0cb"},
-]
-httpx = [
- {file = "httpx-0.23.3-py3-none-any.whl", hash = "sha256:a211fcce9b1254ea24f0cd6af9869b3d29aba40154e947d2a07bb499b3e310d6"},
- {file = "httpx-0.23.3.tar.gz", hash = "sha256:9818458eb565bb54898ccb9b8b251a28785dd4a55afbc23d0eb410754fe7d0f9"},
-]
-identify = [
- {file = "identify-2.5.18-py2.py3-none-any.whl", hash = "sha256:93aac7ecf2f6abf879b8f29a8002d3c6de7086b8c28d88e1ad15045a15ab63f9"},
- {file = "identify-2.5.18.tar.gz", hash = "sha256:89e144fa560cc4cffb6ef2ab5e9fb18ed9f9b3cb054384bab4b95c12f6c309fe"},
-]
-idna = [
- {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"},
- {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"},
-]
-iniconfig = [
- {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"},
- {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"},
-]
-more-itertools = [
- {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"},
- {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"},
-]
-mypy = [
- {file = "mypy-0.942-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5bf44840fb43ac4074636fd47ee476d73f0039f4f54e86d7265077dc199be24d"},
- {file = "mypy-0.942-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dcd955f36e0180258a96f880348fbca54ce092b40fbb4b37372ae3b25a0b0a46"},
- {file = "mypy-0.942-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6776e5fa22381cc761df53e7496a805801c1a751b27b99a9ff2f0ca848c7eca0"},
- {file = "mypy-0.942-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:edf7237137a1a9330046dbb14796963d734dd740a98d5e144a3eb1d267f5f9ee"},
- {file = "mypy-0.942-cp310-cp310-win_amd64.whl", hash = "sha256:64235137edc16bee6f095aba73be5334677d6f6bdb7fa03cfab90164fa294a17"},
- {file = "mypy-0.942-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b840cfe89c4ab6386c40300689cd8645fc8d2d5f20101c7f8bd23d15fca14904"},
- {file = "mypy-0.942-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b184db8c618c43c3a31b32ff00cd28195d39e9c24e7c3b401f3db7f6e5767f5"},
- {file = "mypy-0.942-cp36-cp36m-win_amd64.whl", hash = "sha256:1a0459c333f00e6a11cbf6b468b870c2b99a906cb72d6eadf3d1d95d38c9352c"},
- {file = "mypy-0.942-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4c3e497588afccfa4334a9986b56f703e75793133c4be3a02d06a3df16b67a58"},
- {file = "mypy-0.942-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f6ad963172152e112b87cc7ec103ba0f2db2f1cd8997237827c052a3903eaa6"},
- {file = "mypy-0.942-cp37-cp37m-win_amd64.whl", hash = "sha256:0e2dd88410937423fba18e57147dd07cd8381291b93d5b1984626f173a26543e"},
- {file = "mypy-0.942-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:246e1aa127d5b78488a4a0594bd95f6d6fb9d63cf08a66dafbff8595d8891f67"},
- {file = "mypy-0.942-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d8d3ba77e56b84cd47a8ee45b62c84b6d80d32383928fe2548c9a124ea0a725c"},
- {file = "mypy-0.942-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2bc249409a7168d37c658e062e1ab5173300984a2dada2589638568ddc1db02b"},
- {file = "mypy-0.942-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9521c1265ccaaa1791d2c13582f06facf815f426cd8b07c3a485f486a8ffc1f3"},
- {file = "mypy-0.942-cp38-cp38-win_amd64.whl", hash = "sha256:e865fec858d75b78b4d63266c9aff770ecb6a39dfb6d6b56c47f7f8aba6baba8"},
- {file = "mypy-0.942-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6ce34a118d1a898f47def970a2042b8af6bdcc01546454726c7dd2171aa6dfca"},
- {file = "mypy-0.942-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:10daab80bc40f84e3f087d896cdb53dc811a9f04eae4b3f95779c26edee89d16"},
- {file = "mypy-0.942-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3841b5433ff936bff2f4dc8d54cf2cdbfea5d8e88cedfac45c161368e5770ba6"},
- {file = "mypy-0.942-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f7106cbf9cc2f403693bf50ed7c9fa5bb3dfa9007b240db3c910929abe2a322"},
- {file = "mypy-0.942-cp39-cp39-win_amd64.whl", hash = "sha256:7742d2c4e46bb5017b51c810283a6a389296cda03df805a4f7869a6f41246534"},
- {file = "mypy-0.942-py3-none-any.whl", hash = "sha256:a1b383fe99678d7402754fe90448d4037f9512ce70c21f8aee3b8bf48ffc51db"},
- {file = "mypy-0.942.tar.gz", hash = "sha256:17e44649fec92e9f82102b48a3bf7b4a5510ad0cd22fa21a104826b5db4903e2"},
-]
-mypy-extensions = [
- {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
- {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
-]
-nodeenv = [
- {file = "nodeenv-1.7.0-py2.py3-none-any.whl", hash = "sha256:27083a7b96a25f2f5e1d8cb4b6317ee8aeda3bdd121394e5ac54e498028a042e"},
- {file = "nodeenv-1.7.0.tar.gz", hash = "sha256:e0e7f7dfb85fc5394c6fe1e8fa98131a2473e04311a45afb6508f7cf1836fa2b"},
-]
-packaging = [
- {file = "packaging-23.0-py3-none-any.whl", hash = "sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2"},
- {file = "packaging-23.0.tar.gz", hash = "sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97"},
-]
-platformdirs = [
- {file = "platformdirs-3.1.0-py3-none-any.whl", hash = "sha256:13b08a53ed71021350c9e300d4ea8668438fb0046ab3937ac9a29913a1a1350a"},
- {file = "platformdirs-3.1.0.tar.gz", hash = "sha256:accc3665857288317f32c7bebb5a8e482ba717b474f3fc1d18ca7f9214be0cef"},
-]
-pluggy = [
- {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"},
- {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"},
-]
-pre-commit = [
- {file = "pre_commit-2.21.0-py2.py3-none-any.whl", hash = "sha256:e2f91727039fc39a92f58a588a25b87f936de6567eed4f0e673e0507edc75bad"},
- {file = "pre_commit-2.21.0.tar.gz", hash = "sha256:31ef31af7e474a8d8995027fefdfcf509b5c913ff31f2015b4ec4beb26a6f658"},
-]
-pycaracal = [
- {file = "pycaracal-0.14.5-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:d7bfc919f0f7b05f0631159a1a3294b4d3af07e9d1af16e772c25e8d2d13f609"},
- {file = "pycaracal-0.14.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:982750be1853274d977e4163dbe256950064f1c9c44c97ae2370b246abadc205"},
- {file = "pycaracal-0.14.5-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ef22c1aeeed7ef54de8f1b73f05a4221b8d605745e9ca4ac03f0abcf7174dbf"},
- {file = "pycaracal-0.14.5-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed894eebd2d44c139a760021eb1b3b2af70a92de45ceace8791eb204e840979"},
- {file = "pycaracal-0.14.5-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:fa5cb4256b7e335be8c7043affeab63332323f8a7388558a43fd29050539bb6b"},
- {file = "pycaracal-0.14.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0168094057e00e00f335e5adc2cf10444cdce141c4b01ff79324bbc336a67ee3"},
- {file = "pycaracal-0.14.5-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:730b0dd5d734076fe684a006af2afaed55d40d4ed7a243b1af6943a2d4ad6ea1"},
- {file = "pycaracal-0.14.5-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7758902c5f923c758c54c171f97f9022d7084407d41a7688f0ec36d53b93457a"},
- {file = "pycaracal-0.14.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3921cbe321f34f650b02f53a5c5d675c3ae43ed4ec4bfdcd3dd073007b771476"},
- {file = "pycaracal-0.14.5-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db0eae35c2f76735bdb2427116029fb97bb651d3b3b9e350d676d393a6875521"},
- {file = "pycaracal-0.14.5-cp38-cp38-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41422868968a6e805c8933c4043bb664b96996864b4bbfe131129356f3847962"},
- {file = "pycaracal-0.14.5-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:1fb5a407d3ce5793ed1d7659954230d2d341df5a7782bf08da20e5fbedb57907"},
- {file = "pycaracal-0.14.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:159b93629f0e62b774ae06e6030df6999919e61378b5289bcc17c5d676c74cf1"},
- {file = "pycaracal-0.14.5-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49fb72070e0a75380e642876bb89522271a8fd0cbfe0145a8c815e7808d720f0"},
- {file = "pycaracal-0.14.5-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:af8129cab7c9784ba7587652f703d110343a33dbd219831a9e47e11ff72cecaa"},
- {file = "pycaracal-0.14.5.tar.gz", hash = "sha256:5b94de329627326022b4bc161d81e9050564d1034ac2338357d4760805f5d403"},
-]
-pych-client = [
- {file = "pych-client-0.3.1.tar.gz", hash = "sha256:9770ab9370ecf95c2d51ebcd7c0af81b0a0871fda1e7bc651e0e5d6bcf9af2d7"},
- {file = "pych_client-0.3.1-py3-none-any.whl", hash = "sha256:d922335f0e5299222feca06ac8eb93074fc77393d0b84dc0e94a418a05cedeab"},
-]
-pycparser = [
- {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"},
- {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"},
-]
-pygfc = [
- {file = "pygfc-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd51b29d43ce80419d89a4094abb8ae18bdf3dd305974e91830035596dfe3f92"},
- {file = "pygfc-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce951014fc3c1b7b402d1a349df425a8d06e76c166848f9c0d3e5688f60f22ba"},
- {file = "pygfc-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d04e8c0626570999ff9fb4a731b25eae0cf7ce91f5abc83f426cfa2e7e6c275"},
- {file = "pygfc-1.0.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:676d4036eb525de94b7c38f23698392364e50750bef55030b0c792cc723bd2b0"},
- {file = "pygfc-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:60efdaabdc8a8e0c02d87f56eecbdbcf53df5a851a700c21b6629c55270f4cad"},
- {file = "pygfc-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:819bb4da04c8b740befa85f1727788164229be094e0fda1a69c02bcc6f2e820d"},
- {file = "pygfc-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:258d2b175401003e68fa8dd3f6eb3f972b06be0942090212709ed23cf98239d1"},
- {file = "pygfc-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bc4635c6feabdf74f6845a60b336234ce50b25bb38d4674cd7814b064dbfa6f7"},
- {file = "pygfc-1.0.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c11cb233402171f59706cbfb452754bb5fb3fdcd2c562185a239dec5db620f7"},
- {file = "pygfc-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1eaf8ca7542e79b8cc5dce51a26c72ecce01fa1162408f8c1eaf7af84e28f378"},
- {file = "pygfc-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6a728d6f0a28713510e40d4a7e365995d72af4f222df4761117a6b3b7330aa2a"},
- {file = "pygfc-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c1d032cd6e6f8b259d85d9c1093912aa6bcbe6b93e5f342c9cfffd7324dd6034"},
- {file = "pygfc-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6dc9f4d8da11cb0eb79104a43523ad994a1aa22b870712c2b7a77d47b13440ba"},
- {file = "pygfc-1.0.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5561bde1b4fdc447c5d05924bbb42c8fb8785e1e37ca4f939c81c296038bd03f"},
- {file = "pygfc-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:fff5aba9369814f2c41b2beab4fa0a423eaabe7329894ded0c1338c329a2b357"},
- {file = "pygfc-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:44a089b78a0bb9b7262897215a11e9ce8203f44466b7d6af3528ce76bd361fd1"},
- {file = "pygfc-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2bee293c5dbc6bf2c4059438af0cb78b46d5ca85360e9b4f53ade3f81851f004"},
- {file = "pygfc-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d7023d98aa927cf0795850e4dcbc130f37244a8167fd8ff1cf64dbb8b82551dd"},
- {file = "pygfc-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a1ff585e073c9e0a310406073b19b5b836e57bc948cb016658e9f9bcde54520"},
- {file = "pygfc-1.0.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:991770d4ea13a481cc29491b317cdb3aaf52b7010c0c6296cca6efcd821e0617"},
- {file = "pygfc-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a709a8fb73e7473de24a2ad7e09cda2d5800530b1e5625c31bae1e478db76a8b"},
- {file = "pygfc-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:843797854cb203744536c49d2b3a27eecc7a66216bee5e18852b71a087a8de21"},
- {file = "pygfc-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b6c2e62b31711cf7f9befff6f2b4ca1b67cb3aaad3b2fe3239a91deea6255b9f"},
- {file = "pygfc-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da80f143aead77fb0b741029e179ae24a6569e57e38c7134bebb49745e42d020"},
- {file = "pygfc-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a382419308c5316629d795f6fe0712f515485aabfddb9c80e5a24981a8046054"},
- {file = "pygfc-1.0.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7464055da80027cd0ec08cfe80352170948075bbf14302bccaedbb769d519df3"},
- {file = "pygfc-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a3526a9160b963b5d529b207819595e5438768d038f15b68c116e83dc93ea28f"},
- {file = "pygfc-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:378cee6578989c7567c648092fa67745a430139319f85b2d95558137260ab4c6"},
- {file = "pygfc-1.0.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3dc51ab6345dfc5bc2c7bd6cc7cbd711345d129fa1162a49440790d6b95fda0e"},
- {file = "pygfc-1.0.5-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b0e0f07637f9fddd61664e21a20998ecd59c588c9e55a66ec76ca25b68a671d1"},
- {file = "pygfc-1.0.5-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b160e81056770c39ef63c188e332891243210da040dac9ed9e1996bb26e91ba6"},
- {file = "pygfc-1.0.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3a3a2a92f6513e3b23ccda0fc9f55de523b0038699225aa2dd4b5ba22e6517b3"},
- {file = "pygfc-1.0.5-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c93a40950a01884e71009897892f90e3e7f493cd7ed59e93b03095c5a1b81c84"},
- {file = "pygfc-1.0.5-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:494f39c4c8b4629eed35e6792c16f2893d54baa82ae89b88e9b9a25b1cda82b0"},
- {file = "pygfc-1.0.5.tar.gz", hash = "sha256:94e524aac53eb8893ddaad54c0d97e4323e64a223ee0393de5ee8549949b55af"},
-]
-pytest = [
- {file = "pytest-7.2.2-py3-none-any.whl", hash = "sha256:130328f552dcfac0b1cec75c12e3f005619dc5f874f0a06e8ff7263f0ee6225e"},
- {file = "pytest-7.2.2.tar.gz", hash = "sha256:c99ab0c73aceb050f68929bc93af19ab6db0558791c6a0715723abe9d0ade9d4"},
-]
-pytest-cov = [
- {file = "pytest-cov-3.0.0.tar.gz", hash = "sha256:e7f0f5b1617d2210a2cabc266dfe2f4c75a8d32fb89eafb7ad9d06f6d076d470"},
- {file = "pytest_cov-3.0.0-py3-none-any.whl", hash = "sha256:578d5d15ac4a25e5f961c938b85a05b09fdaae9deef3bb6de9a6e766622ca7a6"},
-]
-pyyaml = [
- {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
- {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
- {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
- {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
- {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
- {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
- {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
- {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"},
- {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"},
- {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"},
- {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"},
- {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"},
- {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"},
- {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"},
- {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
- {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
- {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
- {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
- {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
- {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
- {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
- {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
- {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
- {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
- {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
- {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
- {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
- {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
- {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
- {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
- {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
- {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
- {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
- {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
- {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
- {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
- {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
- {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
- {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
- {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
-]
-rfc3986 = [
- {file = "rfc3986-1.5.0-py2.py3-none-any.whl", hash = "sha256:a86d6e1f5b1dc238b218b012df0aa79409667bb209e58da56d0b94704e712a97"},
- {file = "rfc3986-1.5.0.tar.gz", hash = "sha256:270aaf10d87d0d4e095063c65bf3ddbc6ee3d0b226328ce21e036f946e421835"},
-]
-setuptools = [
- {file = "setuptools-67.5.1-py3-none-any.whl", hash = "sha256:1c39d42bda4cb89f7fdcad52b6762e3c309ec8f8715b27c684176b7d71283242"},
- {file = "setuptools-67.5.1.tar.gz", hash = "sha256:15136a251127da2d2e77ac7a1bc231eb504654f7e3346d93613a13f2e2787535"},
-]
-sniffio = [
- {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"},
- {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"},
-]
-tabulate = [
- {file = "tabulate-0.8.10-py3-none-any.whl", hash = "sha256:0ba055423dbaa164b9e456abe7920c5e8ed33fcc16f6d1b2f2d152c8e1e8b4fc"},
- {file = "tabulate-0.8.10.tar.gz", hash = "sha256:6c57f3f3dd7ac2782770155f3adb2db0b1a269637e42f27599925e64b114f519"},
-]
-tomli = [
- {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
- {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
-]
-typer = [
- {file = "typer-0.4.2-py3-none-any.whl", hash = "sha256:023bae00d1baf358a6cc7cea45851639360bb716de687b42b0a4641cd99173f1"},
- {file = "typer-0.4.2.tar.gz", hash = "sha256:b8261c6c0152dd73478b5ba96ba677e5d6948c715c310f7c91079f311f62ec03"},
-]
-types-tabulate = [
- {file = "types-tabulate-0.8.11.tar.gz", hash = "sha256:17a5fa3b5ca453815778fc9865e8ecd0118b07b2b9faff3e2b06fe448174dd5e"},
- {file = "types_tabulate-0.8.11-py3-none-any.whl", hash = "sha256:af811268241e8fb87b63c052c87d1e329898a93191309d5d42111372232b2e0e"},
-]
-typing-extensions = [
- {file = "typing_extensions-4.5.0-py3-none-any.whl", hash = "sha256:fb33085c39dd998ac16d1431ebc293a8b3eedd00fd4a32de0ff79002c19511b4"},
- {file = "typing_extensions-4.5.0.tar.gz", hash = "sha256:5cb5f4a79139d699607b3ef622a1dedafa84e115ab0024e0d9c044a9479ca7cb"},
-]
-virtualenv = [
- {file = "virtualenv-20.20.0-py3-none-any.whl", hash = "sha256:3c22fa5a7c7aa106ced59934d2c20a2ecb7f49b4130b8bf444178a16b880fa45"},
- {file = "virtualenv-20.20.0.tar.gz", hash = "sha256:a8a4b8ca1e28f864b7514a253f98c1d62b64e31e77325ba279248c65fb4fcef4"},
-]
-zstandard = [
- {file = "zstandard-0.18.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef7e8a200e4c8ac9102ed3c90ed2aa379f6b880f63032200909c1be21951f556"},
- {file = "zstandard-0.18.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2dc466207016564805e56d28375f4f533b525ff50d6776946980dff5465566ac"},
- {file = "zstandard-0.18.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a2ee1d4f98447f3e5183ecfce5626f983504a4a0c005fbe92e60fa8e5d547ec"},
- {file = "zstandard-0.18.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d956e2f03c7200d7e61345e0880c292783ec26618d0d921dcad470cb195bbce2"},
- {file = "zstandard-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ce6f59cba9854fd14da5bfe34217a1501143057313966637b7291d1b0267bd1e"},
- {file = "zstandard-0.18.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7fa67cba473623848b6e88acf8d799b1906178fd883fb3a1da24561c779593b"},
- {file = "zstandard-0.18.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cdb44d7284c8c5dd1b66dfb86dda7f4560fa94bfbbc1d2da749ba44831335e32"},
- {file = "zstandard-0.18.0-cp310-cp310-win32.whl", hash = "sha256:63694a376cde0aa8b1971d06ca28e8f8b5f492779cb6ee1cc46bbc3f019a42a5"},
- {file = "zstandard-0.18.0-cp310-cp310-win_amd64.whl", hash = "sha256:702a8324cd90c74d9c8780d02bf55e79da3193c870c9665ad3a11647e3ad1435"},
- {file = "zstandard-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46f679bc5dfd938db4fb058218d9dc4db1336ffaf1ea774ff152ecadabd40805"},
- {file = "zstandard-0.18.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc2a4de9f363b3247d472362a65041fe4c0f59e01a2846b15d13046be866a885"},
- {file = "zstandard-0.18.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd3220d7627fd4d26397211cb3b560ec7cc4a94b75cfce89e847e8ce7fabe32d"},
- {file = "zstandard-0.18.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:39e98cf4773234bd9cebf9f9db730e451dfcfe435e220f8921242afda8321887"},
- {file = "zstandard-0.18.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5228e596eb1554598c872a337bbe4e5afe41cd1f8b1b15f2e35b50d061e35244"},
- {file = "zstandard-0.18.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d4a8fd45746a6c31e729f35196e80b8f1e9987c59f5ccb8859d7c6a6fbeb9c63"},
- {file = "zstandard-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:4cbb85f29a990c2fdbf7bc63246567061a362ddca886d7fae6f780267c0a9e67"},
- {file = "zstandard-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:bfa6c8549fa18e6497a738b7033c49f94a8e2e30c5fbe2d14d0b5aa8bbc1695d"},
- {file = "zstandard-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e02043297c1832f2666cd2204f381bef43b10d56929e13c42c10c732c6e3b4ed"},
- {file = "zstandard-0.18.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7231543d38d2b7e02ef7cc78ef7ffd86419437e1114ff08709fe25a160e24bd6"},
- {file = "zstandard-0.18.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c86befac87445927488f5c8f205d11566f64c11519db223e9d282b945fa60dab"},
- {file = "zstandard-0.18.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:999a4e1768f219826ba3fa2064fab1c86dd72fdd47a42536235478c3bb3ca3e2"},
- {file = "zstandard-0.18.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9df59cd1cf3c62075ee2a4da767089d19d874ac3ad42b04a71a167e91b384722"},
- {file = "zstandard-0.18.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1be31e9e3f7607ee0cdd60915410a5968b205d3e7aa83b7fcf3dd76dbbdb39e0"},
- {file = "zstandard-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:490d11b705b8ae9dc845431bacc8dd1cef2408aede176620a5cd0cd411027936"},
- {file = "zstandard-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:266aba27fa9cc5e9091d3d325ebab1fa260f64e83e42516d5e73947c70216a5b"},
- {file = "zstandard-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b2260c4e07dd0723eadb586de7718b61acca4083a490dda69c5719d79bc715c"},
- {file = "zstandard-0.18.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3af8c2383d02feb6650e9255491ec7d0824f6e6dd2bbe3e521c469c985f31fb1"},
- {file = "zstandard-0.18.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28723a1d2e4df778573b76b321ebe9f3469ac98988104c2af116dd344802c3f8"},
- {file = "zstandard-0.18.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19cac7108ff2c342317fad6dc97604b47a41f403c8f19d0bfc396dfadc3638b8"},
- {file = "zstandard-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:76725d1ee83a8915100a310bbad5d9c1fc6397410259c94033b8318d548d9990"},
- {file = "zstandard-0.18.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d716a7694ce1fa60b20bc10f35c4a22be446ef7f514c8dbc8f858b61976de2fb"},
- {file = "zstandard-0.18.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:49685bf9a55d1ab34bd8423ea22db836ba43a181ac6b045ac4272093d5cb874e"},
- {file = "zstandard-0.18.0-cp38-cp38-win32.whl", hash = "sha256:1af1268a7dc870eb27515fb8db1f3e6c5a555d2b7bcc476fc3bab8886c7265ab"},
- {file = "zstandard-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:1dc2d3809e763055a1a6c1a73f2b677320cc9a5aa1a7c6cfb35aee59bddc42d9"},
- {file = "zstandard-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eea18c1e7442f2aa9aff1bb84550dbb6a1f711faf6e48e7319de8f2b2e923c2a"},
- {file = "zstandard-0.18.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8677ffc6a6096cccbd892e558471c901fd821aba12b7fbc63833c7346f549224"},
- {file = "zstandard-0.18.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:083dc08abf03807af9beeb2b6a91c23ad78add2499f828176a3c7b742c44df02"},
- {file = "zstandard-0.18.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c990063664c08169c84474acecc9251ee035871589025cac47c060ff4ec4bc1a"},
- {file = "zstandard-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:533db8a6fac6248b2cb2c935e7b92f994efbdeb72e1ffa0b354432e087bb5a3e"},
- {file = "zstandard-0.18.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbb3cb8a082d62b8a73af42291569d266b05605e017a3d8a06a0e5c30b5f10f0"},
- {file = "zstandard-0.18.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d6c85ca5162049ede475b7ec98e87f9390501d44a3d6776ddd504e872464ec25"},
- {file = "zstandard-0.18.0-cp39-cp39-win32.whl", hash = "sha256:75479e7c2b3eebf402c59fbe57d21bc400cefa145ca356ee053b0a08908c5784"},
- {file = "zstandard-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:d85bfabad444812133a92fc6fbe463e1d07581dba72f041f07a360e63808b23c"},
- {file = "zstandard-0.18.0.tar.gz", hash = "sha256:0ac0357a0d985b4ff31a854744040d7b5754385d1f98f7145c30e02c6865cb6f"},
-]
+content-hash = "0aee0ad8a3d87da4d710a9ea1857772c9a8e33e3cfc361646cae97a0b41fa1f4"
diff --git a/pyproject.toml b/pyproject.toml
index 5ff5a15..da404a3 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -13,7 +13,14 @@ diamond-miner = "^1.0.3"
more-itertools = "^8.12.0"
tabulate = "^0.8.9"
typer = "^0.4.0"
-pycaracal = "^0.14.5"
+pycaracal = "0.14.5"
+icecream = "^2.1.3"
+tqdm = "^4.66.2"
+matplotlib = "^3.8.3"
+xxhash = "^3.4.1"
+pytest-xdist = "^3.5.0"
+networkx = "^3.2.1"
+scipy = "^1.13.0"
[tool.poetry.dev-dependencies]
bumpversion = "^0.6.0"
@@ -26,6 +33,9 @@ types-tabulate = "^0.8.5"
[tool.poetry.scripts]
fast-mda-traceroute = 'fast_mda_traceroute.cli:app'
+[tool.poetry.group.dev.dependencies]
+pytest-profiling = "^1.7.0"
+
[tool.mypy]
ignore_missing_imports = true
implicit_reexport = false
@@ -42,7 +52,7 @@ exclude_lines = [
"if __name__ == \"__main__\":$",
"pass$",
"\\s\\.\\.\\.$",
- "raise NotImplementedError$"
+ "raise NotImplementedError$",
]
[build-system]
diff --git a/tests/fakenet/__init__.py b/tests/fakenet/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/tests/fakenet/apriori.py b/tests/fakenet/apriori.py
new file mode 100644
index 0000000..d94220d
--- /dev/null
+++ b/tests/fakenet/apriori.py
@@ -0,0 +1,199 @@
+import logging
+from scipy.special import stirling2
+from collections import defaultdict
+import concurrent.futures
+from functools import cache
+import math
+import random
+
+from tqdm import tqdm
+from fast_mda_traceroute.logger import logger
+from fast_mda_traceroute.algorithms.utils.stopping_point import (
+ estimate_total_interfaces,
+ reach_prob,
+ stopping_point,
+)
+from tests.fakenet.config import DEFAULT_CONFIDENCE, N_TRIES
+from tests.fakenet.utils import eval_diamond_miner
+
+
+@cache
+def apriori_single_node(degree, confidence=DEFAULT_CONFIDENCE / 100):
+ tries = 100_000
+ ok = 0
+ for _ in range(tries):
+ estimation = 1
+ total_probes = 0
+ discovered_interfaces = set()
+
+ while True:
+ stop = stopping_point(estimation, failure_probability=1 - confidence)
+ send_probes = stop - total_probes
+ if send_probes <= 0:
+ break
+ total_probes = stop
+
+ round_interfaces = set(random.choices(range(degree), k=send_probes))
+ discovered_interfaces.update(round_interfaces)
+ estimation = len(discovered_interfaces)
+ if len(discovered_interfaces) == degree:
+ ok += 1
+ return ok / tries
+
+
+@cache
+def step(degree: int, new_probes: int, found: int) -> dict[int, float]:
+ # We have found `found` interfaces.
+ # During this round, we are sending `new_probes` additional probes.
+ # We output the probability vector for the number of new interfaces found.
+
+ res = defaultdict(float)
+ for new_interfaces in range(0, min(new_probes, degree - found) + 1):
+ for n_relapse in range(new_probes - new_interfaces + 1):
+ ways_to_pick_relapsing_probes = math.comb(new_probes, n_relapse)
+ ways_to_distribute_relapsing_probes = found**n_relapse
+
+ remaining_probes = new_probes - n_relapse
+ ways_to_distribute_remaining_probes = stirling2(
+ remaining_probes, new_interfaces
+ )
+
+ ways_to_pick_new_interfaces = math.comb(degree - found, new_interfaces)
+ ways_to_distribute_subsets = math.factorial(new_interfaces)
+ x = (
+ ways_to_pick_relapsing_probes
+ * ways_to_distribute_relapsing_probes
+ * ways_to_distribute_remaining_probes
+ * ways_to_pick_new_interfaces
+ * ways_to_distribute_subsets
+ / degree**new_probes
+ )
+ res[found + new_interfaces] += x
+
+ return res
+
+
+def rec_step(degree, estimation, found, sent, confidence=DEFAULT_CONFIDENCE / 100):
+ stop = stopping_point(estimation, failure_probability=1 - confidence)
+ if sent >= stop:
+ reach = reach_prob(found, stop)
+ return {found: reach}
+
+ s = step(degree, stop - sent, found)
+ res = defaultdict(float)
+ for new_found, prob in s.items():
+ # we have found `new_found` new interfaces with probability `prob`
+ # we update the estimation
+ new_estimation = new_found + 1
+ for k, v in rec_step(
+ degree, new_estimation, new_found, stop, confidence
+ ).items():
+ # given that we have found `new_found` new interfaces,
+ # we have a probability `v` to find `k` interfaces at the next step
+ res[k] += prob * v
+ return res
+
+
+@cache
+def apriori_direct_single_node_rec(degree, confidence=DEFAULT_CONFIDENCE / 100):
+ run = rec_step(degree, 1, 0, 0, confidence=confidence)
+ return run[degree]
+
+
+def apriori_direct(net, confidence=DEFAULT_CONFIDENCE / 100):
+ expected = 1.0
+
+ for node in net.nodes:
+ degree = net.out_degree(node)
+ if degree < 1:
+ continue
+ direct = apriori_direct_single_node_rec(degree, confidence=confidence)
+ expected *= direct
+ return expected
+
+
+@cache
+def apriori_single_node_opti(degree, confidence=DEFAULT_CONFIDENCE / 100):
+ tries = 100_000
+ ok = 0
+ for _ in range(tries):
+ estimation = 1
+ total_probes = 0
+ discovered_interfaces = set()
+
+ while True:
+ stop = stopping_point(estimation, failure_probability=1 - confidence)
+ send_probes = stop - total_probes
+ if send_probes <= 0:
+ break
+ total_probes = stop
+
+ round_interfaces = set(random.choices(range(degree), k=send_probes))
+ discovered_interfaces.update(round_interfaces)
+ estimation = estimate_total_interfaces(
+ k=total_probes, n=len(discovered_interfaces)
+ )
+ if len(discovered_interfaces) == degree:
+ ok += 1
+ return ok / tries
+
+
+def apriori_prob(net, confidence=DEFAULT_CONFIDENCE / 100):
+ expected = 1.0
+
+ for node in net.nodes:
+ # fetch degree of node
+ degree = net.out_degree(node)
+ if degree < 1:
+ continue
+ expected *= apriori_single_node(degree, confidence=confidence)
+ return expected
+
+
+def apriori_oracle(net, confidence=DEFAULT_CONFIDENCE / 100):
+ expected = 1.0
+
+ for node in net.nodes:
+ # fetch degree of node
+ degree = net.out_degree(node)
+ if degree < 1:
+ continue
+ stop = stopping_point(degree, failure_probability=1 - confidence)
+ p = reach_prob(degree, stop)
+ expected *= p
+ return expected
+
+
+def worker(seed, net, confidence, optimal_jump):
+ logger.setLevel(logging.ERROR)
+ return eval_diamond_miner(
+ net=net, confidence=confidence * 100, seed=seed, optimal_jump=optimal_jump
+ )
+
+
+def simple_trial(
+ net,
+ optimal_jump,
+ n_tries=N_TRIES,
+ confidence=DEFAULT_CONFIDENCE / 100,
+ magic: int = 0,
+ n_workers=4,
+):
+ seeds = range(magic, magic + n_tries)
+
+ with concurrent.futures.ProcessPoolExecutor(max_workers=n_workers) as executor:
+ results = list(
+ tqdm(
+ executor.map(
+ worker,
+ seeds,
+ [net] * n_tries,
+ [confidence] * n_tries,
+ [optimal_jump] * n_tries,
+ ),
+ total=n_tries,
+ )
+ )
+
+ OK = sum(results)
+ return OK / n_tries
diff --git a/tests/fakenet/config.py b/tests/fakenet/config.py
new file mode 100644
index 0000000..f40ddd9
--- /dev/null
+++ b/tests/fakenet/config.py
@@ -0,0 +1,10 @@
+import glob
+import os
+
+DELTA_THRESHOLD = 0.95
+DEFAULT_CONFIDENCE = 95.0
+N_TRIES = 100
+SAMPLE_NET_DATA = "tests/fakenet/data"
+SAMPLE_FILES = [
+ f for f in glob.glob(os.path.join(SAMPLE_NET_DATA, "*")) if os.path.isfile(f)
+]
diff --git a/tests/fakenet/data/2-pathsLoadBalancer b/tests/fakenet/data/2-pathsLoadBalancer
new file mode 100644
index 0000000..55b9598
--- /dev/null
+++ b/tests/fakenet/data/2-pathsLoadBalancer
@@ -0,0 +1,7 @@
+127.0.0.1 10.0.0.1
+
+10.0.0.1 10.1.2.3
+10.0.0.1 2.3.3.3
+
+10.1.2.3 127.1.1.6
+2.3.3.3 127.1.1.6
diff --git a/tests/fakenet/data/2-pathsUnequalLengthLoadBalancer b/tests/fakenet/data/2-pathsUnequalLengthLoadBalancer
new file mode 100644
index 0000000..862ae8f
--- /dev/null
+++ b/tests/fakenet/data/2-pathsUnequalLengthLoadBalancer
@@ -0,0 +1,14 @@
+127.0.0.1 10.0.0.1
+
+10.0.0.1 1.1.1.2
+10.0.0.1 2.2.2.2
+
+1.1.1.2 1.1.1.3
+2.2.2.2 2.2.2.3
+
+1.1.1.3 127.1.1.6
+
+2.2.2.3 2.2.2.4
+2.2.2.4 2.2.2.5
+
+2.2.2.5 127.1.1.6
\ No newline at end of file
diff --git a/tests/fakenet/data/3-diamonds-topology b/tests/fakenet/data/3-diamonds-topology
new file mode 100644
index 0000000..ebfc7a4
--- /dev/null
+++ b/tests/fakenet/data/3-diamonds-topology
@@ -0,0 +1,24 @@
+127.0.0.1 10.0.0.1
+
+10.0.0.1 1.1.1.2
+10.0.0.1 2.2.2.2
+
+1.1.1.2 1.1.1.3
+2.2.2.2 2.2.2.3
+
+1.1.1.3 1.1.1.4
+2.2.2.3 1.1.1.4
+
+1.1.1.4 1.1.1.5
+1.1.1.4 2.2.2.5
+
+1.1.1.5 1.1.1.6
+2.2.2.5 1.1.1.6
+
+1.1.1.6 1.1.1.7
+1.1.1.6 2.2.2.7
+
+1.1.1.7 1.1.1.8
+2.2.2.7 1.1.1.8
+
+1.1.1.8 127.1.1.8
\ No newline at end of file
diff --git a/tests/fakenet/data/6-pathsLB b/tests/fakenet/data/6-pathsLB
new file mode 100644
index 0000000..fa854a2
--- /dev/null
+++ b/tests/fakenet/data/6-pathsLB
@@ -0,0 +1,15 @@
+127.0.0.1 10.0.0.1
+
+10.0.0.1 1.1.1.1
+10.0.0.1 1.1.1.2
+10.0.0.1 1.1.1.3
+10.0.0.1 1.1.1.4
+10.0.0.1 1.1.1.5
+10.0.0.1 1.1.1.6
+
+1.1.1.1 127.1.1.6
+1.1.1.2 127.1.1.6
+1.1.1.3 127.1.1.6
+1.1.1.4 127.1.1.6
+1.1.1.5 127.1.1.6
+1.1.1.6 127.1.1.6
diff --git a/tests/fakenet/data/asymmetric_topology b/tests/fakenet/data/asymmetric_topology
new file mode 100644
index 0000000..19879cd
--- /dev/null
+++ b/tests/fakenet/data/asymmetric_topology
@@ -0,0 +1,31 @@
+127.0.0.1 10.0.0.1
+
+10.0.0.1 1.1.1.1
+10.0.0.1 1.1.1.2
+10.0.0.1 1.1.1.3
+
+1.1.1.1 2.2.1.1
+1.1.1.1 2.2.1.2
+1.1.1.1 2.2.1.3
+1.1.1.1 2.2.1.4
+
+2.2.1.1 127.1.1.6
+2.2.1.2 127.1.1.6
+2.2.1.3 127.1.1.6
+2.2.1.4 127.1.1.6
+
+
+1.1.1.2 2.2.2.1
+1.1.1.2 2.2.2.2
+1.1.1.2 2.2.2.3
+
+2.2.2.1 127.1.1.6
+2.2.2.2 127.1.1.6
+2.2.2.3 127.1.1.6
+
+1.1.1.3 2.2.3.1
+1.1.1.3 2.2.3.2
+
+2.2.3.1 127.1.1.6
+2.2.3.2 127.1.1.6
+
diff --git a/tests/fakenet/data/dummyTopology b/tests/fakenet/data/dummyTopology
new file mode 100644
index 0000000..cd11603
--- /dev/null
+++ b/tests/fakenet/data/dummyTopology
@@ -0,0 +1,20 @@
+127.0.0.1 10.0.0.1
+10.0.0.1 10.1.2.3
+
+10.1.2.3 4.5.6.7
+10.1.2.3 5.6.7.8
+10.1.2.3 6.7.8.9
+
+4.5.6.7 2.3.3.3
+2.3.3.3 4.4.4.4
+4.4.4.4 127.1.1.6
+
+5.6.7.8 3.3.3.3
+3.3.3.3 4.4.4.5
+3.3.3.3 4.4.4.6
+4.4.4.5 127.1.1.6
+4.4.4.6 127.1.1.6
+
+6.7.8.9 5.5.5.5
+5.5.5.5 6.6.6.6
+6.6.6.6 127.1.1.6
diff --git a/tests/fakenet/data/graphs/ple2.planet-lab.eu_125.155.82.17.xml b/tests/fakenet/data/graphs/ple2.planet-lab.eu_125.155.82.17.xml
new file mode 100644
index 0000000..49e8b3c
--- /dev/null
+++ b/tests/fakenet/data/graphs/ple2.planet-lab.eu_125.155.82.17.xml
@@ -0,0 +1,3149 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0x1p-1, 0x0p+0, 0x0p+0, 0x1.ccccccccccccdp-1
+ ple2.planet-lab.eu
+ 1
+ 12
+ 132.227.123.12
+ 40
+ 1
+
+
+ 0x1p-1, 0x1p-1, 0x1p-1, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 1/16:132.227.123.12
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 132.227.123.1
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 134.157.167.125
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 134.157.254.124
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 195.221.127.181
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 193.51.181.102
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 193.51.177.117
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 83.97.89.9
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 62.40.98.76
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 62.40.98.78
+ 4
+ -1
+
+
+ 0x1p-1, 0x1p-1, 0x1p-1, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ * * *
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 72.52.92.166
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 184.105.80.10
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 184.105.64.102
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 184.105.222.98
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 184.105.64.113
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 184.105.64.109
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 72.52.108.226
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 112.174.87.121
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.88.173
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.80.137
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.87.81
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.87.73
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.88.249
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.87.125
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.87.65
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 112.174.84.73
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.201
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.105
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.153
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.141
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.1
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.73
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.33
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.21
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.161
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.149
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.165
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.45
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.1
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.13
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.25
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.37
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.145
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.89
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.113
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.141
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.145
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.101
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.5
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.97
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.97
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.101
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.17
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.153
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.41
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.77
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.205
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.5
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.93
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.105
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.93
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.109
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.165
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.117
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.201
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.109
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.205
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.149
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.113
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.161
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.89
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.83.77
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.84.117
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.33
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.193
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.73
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.157
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.193
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.233
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.117
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.37
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.237
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.237
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.157
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.77
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.153
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.197
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 112.174.48.77
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.73
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.233
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.197
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.113
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.113
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.117
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.37
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.8.33
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.48.153
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.26.146
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.26.150
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 112.174.66.146
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 112.174.66.198
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 125.144.30.194
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 125.144.17.142
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 14.59.47.10
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 14.59.47.14
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 14.59.46.14
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 14.59.46.10
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 125.155.82.17
+ 3
+ 12
+ 125.155.82.17
+ 40
+ 0
+
+
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ 19e56f69-a439-4113-ba3a-7af30cbb4ac8
+ 0x1.999999999999ap-3
+
+
+
+
diff --git a/tests/fakenet/data/graphs/ple2.planet-lab.eu_74.61.176.1.xml b/tests/fakenet/data/graphs/ple2.planet-lab.eu_74.61.176.1.xml
new file mode 100644
index 0000000..e2d1f4a
--- /dev/null
+++ b/tests/fakenet/data/graphs/ple2.planet-lab.eu_74.61.176.1.xml
@@ -0,0 +1,487 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 0x1p-1, 0x0p+0, 0x0p+0, 0x1.ccccccccccccdp-1
+ ple2.planet-lab.eu
+ 1
+ 12
+ 132.227.123.12
+ 40
+ 1
+
+
+ 0x1p-1, 0x1p-1, 0x1p-1, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 1/16:132.227.123.12
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 132.227.123.1
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 134.157.167.125
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 134.157.254.124
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 195.221.127.181
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 193.51.181.102
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 193.51.177.114
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 77.67.123.209
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 89.149.134.45
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 89.149.133.233
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 173.205.44.190
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 144.232.25.231
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 144.232.14.7
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 144.232.13.195
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 144.232.15.19
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 144.232.13.14
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 144.232.5.210
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 144.232.22.142
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 144.232.1.167
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 144.232.13.83
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 144.232.22.229
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 144.232.11.227
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 144.232.22.155
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 144.232.22.70
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 144.232.2.86
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 2
+ 8
+ 144.232.17.59
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 208.35.161.106
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 66.233.169.254
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 4
+ 8
+ 66.233.169.162
+ 4
+ -1
+
+
+ 0x1.999999999999ap-1, 0x1.999999999999ap-1, 0x0p+0, 0x1.ccccccccccccdp-1
+ 74.61.176.1
+ 3
+ 12
+ 74.61.176.1
+ 40
+ 0
+
+
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+ 0x1.6e978d4fdf3b6p-3, 0x1.9fbe76c8b4396p-3, 0x1.ae147ae147ae1p-3, 0x1.999999999999ap-1
+ aaba8029-10b1-4904-bdb5-626d3eaf6803
+ 0x1.999999999999ap-3
+
+
+
+
diff --git a/tests/fakenet/data/large_networks/kulcha.mimuw.edu.pl_61.6.250.1_2018-02-22 15_57_19.090924+01_00 b/tests/fakenet/data/large_networks/kulcha.mimuw.edu.pl_61.6.250.1_2018-02-22 15_57_19.090924+01_00
new file mode 100644
index 0000000..0ca3b3a
--- /dev/null
+++ b/tests/fakenet/data/large_networks/kulcha.mimuw.edu.pl_61.6.250.1_2018-02-22 15_57_19.090924+01_00
@@ -0,0 +1,93 @@
+127.0.0.1 192.168.1.1
+192.168.1.1 193.0.109.1
+193.0.109.1 193.0.103.1
+193.0.103.1 193.0.103.19
+193.0.103.19 212.191.224.33
+212.191.224.33 212.162.10.81
+212.162.10.81 1.1.1.1
+1.1.1.1 213.248.68.62
+1.1.1.1 129.250.9.5
+213.248.68.62 62.115.137.166
+213.248.68.62 62.115.121.0
+213.248.68.62 62.115.141.238
+213.248.68.62 62.115.121.6
+213.248.68.62 62.115.141.240
+213.248.68.62 62.115.121.8
+213.248.68.62 62.115.121.10
+213.248.68.62 62.115.116.161
+213.248.68.62 62.115.137.128
+213.248.68.62 62.115.116.159
+213.248.68.62 62.115.116.165
+213.248.68.62 62.115.141.236
+213.248.68.62 62.115.121.2
+213.248.68.62 62.115.137.168
+213.248.68.62 62.115.121.4
+213.248.68.62 62.115.116.163
+213.248.68.62 62.115.141.234
+213.248.68.62 62.115.137.164
+129.250.9.5 129.250.5.52
+62.115.137.166 62.115.112.231
+62.115.137.166 62.115.133.181
+62.115.121.0 62.115.112.239
+62.115.121.0 62.115.133.179
+62.115.141.238 62.115.112.239
+62.115.141.238 62.115.133.179
+62.115.121.6 62.115.112.231
+62.115.121.6 62.115.133.181
+62.115.141.240 62.115.112.239
+62.115.141.240 62.115.133.179
+129.250.5.52 129.250.7.63
+62.115.121.8 62.115.112.231
+62.115.121.8 62.115.133.181
+62.115.121.10 62.115.112.231
+62.115.121.10 62.115.133.181
+62.115.116.161 62.115.112.231
+62.115.116.161 62.115.133.181
+62.115.137.128 62.115.112.239
+62.115.137.128 62.115.133.179
+62.115.116.159 62.115.112.231
+62.115.116.159 62.115.133.181
+62.115.116.165 62.115.112.231
+62.115.116.165 62.115.133.181
+62.115.141.236 62.115.112.239
+62.115.141.236 62.115.133.179
+62.115.121.2 62.115.112.239
+62.115.121.2 62.115.133.179
+62.115.137.168 62.115.112.231
+62.115.137.168 62.115.133.181
+62.115.121.4 62.115.112.239
+62.115.121.4 62.115.133.179
+62.115.116.163 62.115.112.231
+62.115.116.163 62.115.133.181
+62.115.141.234 62.115.112.239
+62.115.141.234 62.115.133.179
+62.115.137.164 62.115.112.239
+62.115.137.164 62.115.133.179
+129.250.7.63 129.250.3.198
+62.115.112.231 62.115.122.245
+62.115.112.231 62.115.124.214
+62.115.112.231 62.115.133.183
+62.115.112.239 62.115.122.245
+62.115.112.239 62.115.124.214
+62.115.112.239 62.115.133.183
+62.115.133.181 62.115.114.37
+62.115.133.179 62.115.114.37
+129.250.3.198 129.250.6.98
+129.250.3.198 129.250.6.92
+62.115.114.37 62.115.144.191
+62.115.122.245 62.115.144.191
+62.115.124.214 80.91.251.100
+62.115.133.183 62.115.114.37
+129.250.6.98 129.250.5.253
+129.250.6.92 129.250.6.125
+62.115.144.191 61.6.255.154
+80.91.251.100 62.115.119.229
+61.6.255.154 61.6.255.9
+62.115.119.229 62.115.114.41
+129.250.5.253 203.131.254.166
+129.250.6.125 203.131.254.166
+61.6.255.9 127.1.1.6
+62.115.114.41 62.115.144.191
+203.131.254.166 61.6.255.150
+61.6.255.150 61.6.255.126
+61.6.255.126 127.1.1.6
diff --git a/tests/fakenet/data/large_networks/planetlab2.upm.ro_1.217.31.43_2018-05-17 10_58_23.290539+01_00 b/tests/fakenet/data/large_networks/planetlab2.upm.ro_1.217.31.43_2018-05-17 10_58_23.290539+01_00
new file mode 100755
index 0000000..671a1ea
--- /dev/null
+++ b/tests/fakenet/data/large_networks/planetlab2.upm.ro_1.217.31.43_2018-05-17 10_58_23.290539+01_00
@@ -0,0 +1,423 @@
+127.0.0.1 193.226.19.1
+193.226.19.1 217.73.170.253
+217.73.170.253 37.128.235.21
+37.128.235.21 37.128.239.121
+37.128.239.121 37.128.239.142
+37.128.239.142 212.162.45.193
+212.162.45.193 4.69.209.157
+4.69.209.157 4.68.111.134
+4.68.111.134 203.255.234.133
+4.68.111.134 203.255.234.141
+4.68.111.134 1.208.104.209
+4.68.111.134 1.208.107.29
+203.255.234.133 1.208.107.89
+203.255.234.133 1.213.147.189
+203.255.234.133 1.208.145.105
+203.255.234.133 1.208.145.5
+203.255.234.133 1.208.107.73
+203.255.234.133 1.208.148.133
+203.255.234.133 1.208.145.205
+203.255.234.133 1.208.144.173
+203.255.234.133 1.208.144.109
+203.255.234.133 1.208.145.165
+203.255.234.133 1.208.151.217
+203.255.234.133 210.120.244.1
+203.255.234.133 203.233.52.165
+203.255.234.133 1.213.149.1
+203.255.234.133 61.42.234.1
+203.255.234.133 1.208.106.157
+203.255.234.141 1.208.107.89
+203.255.234.141 1.208.144.173
+203.255.234.141 1.208.145.205
+203.255.234.141 1.208.145.105
+203.255.234.141 61.42.234.1
+203.255.234.141 1.208.144.109
+203.255.234.141 1.208.106.157
+203.255.234.141 1.208.151.217
+203.255.234.141 1.213.149.1
+203.255.234.141 1.208.148.133
+203.255.234.141 1.208.145.5
+203.255.234.141 1.213.147.189
+203.255.234.141 210.120.244.1
+203.255.234.141 1.208.107.73
+203.255.234.141 203.233.52.165
+203.255.234.141 1.208.145.165
+1.208.104.209 210.180.226.41
+1.208.104.209 1.208.104.37
+1.208.104.209 203.233.52.33
+1.208.104.209 203.255.234.105
+1.208.104.209 1.208.144.25
+1.208.104.209 203.248.207.229
+1.208.104.209 203.233.37.73
+1.208.104.209 1.208.104.93
+1.208.104.209 203.255.234.153
+1.208.104.209 203.255.234.181
+1.208.104.209 1.208.107.117
+1.208.104.209 211.53.88.93
+1.208.104.209 1.208.146.21
+1.208.107.29 1.208.107.117
+1.208.107.29 1.208.144.25
+1.208.107.29 1.208.146.21
+1.208.107.29 203.233.37.73
+1.208.107.29 203.255.234.181
+1.208.107.29 203.255.234.105
+1.208.107.29 1.208.104.37
+1.208.107.29 203.248.207.229
+1.208.107.29 203.233.52.33
+1.208.107.29 1.208.104.93
+1.208.107.29 211.53.88.93
+1.208.107.29 203.255.234.153
+1.208.107.29 210.180.226.41
+1.208.107.117 1.213.148.26
+1.208.107.117 203.248.208.230
+1.208.107.117 1.213.106.10
+1.208.107.117 203.233.117.114
+1.208.107.117 211.53.88.170
+1.208.107.117 1.213.148.34
+1.208.107.117 203.233.52.226
+1.208.107.117 1.213.106.122
+1.208.107.117 203.233.60.190
+1.208.107.117 211.53.88.190
+1.208.107.89 210.120.103.226
+1.208.107.89 1.208.150.166
+1.208.107.89 1.208.144.218
+1.208.107.89 1.208.104.50
+1.208.107.89 1.208.145.190
+1.208.107.89 211.63.38.14
+1.208.107.89 1.208.105.254
+1.208.107.89 211.40.6.10
+1.208.107.89 210.120.105.118
+1.208.107.89 1.208.104.58
+1.213.147.189 1.208.145.190
+1.213.147.189 1.208.104.58
+1.213.147.189 1.208.144.218
+1.213.147.189 211.40.6.10
+1.213.147.189 210.120.105.118
+1.213.147.189 1.208.104.50
+1.213.147.189 211.63.38.14
+1.213.147.189 1.208.150.166
+1.213.147.189 210.120.103.226
+1.213.147.189 1.208.105.254
+1.208.144.173 1.208.144.218
+1.208.144.173 1.208.145.190
+1.208.144.173 210.120.103.226
+1.208.144.173 1.208.150.166
+1.208.144.173 1.208.105.254
+1.208.144.173 210.120.105.118
+1.208.144.173 1.208.104.58
+1.208.144.173 1.208.104.50
+1.208.144.173 211.63.38.14
+1.208.144.173 211.40.6.10
+210.180.226.41 1.213.148.26
+210.180.226.41 203.233.60.190
+210.180.226.41 203.233.52.226
+210.180.226.41 211.53.88.190
+210.180.226.41 1.213.106.10
+210.180.226.41 1.213.148.34
+210.180.226.41 203.248.208.230
+210.180.226.41 211.53.88.170
+210.180.226.41 203.233.117.114
+210.180.226.41 1.213.106.122
+1.208.145.205 1.208.145.190
+1.208.145.205 1.208.104.50
+1.208.145.205 211.40.6.10
+1.208.145.205 1.208.150.166
+1.208.145.205 210.120.103.226
+1.208.145.205 1.208.144.218
+1.208.145.205 1.208.104.58
+1.208.145.205 210.120.105.118
+1.208.145.205 211.63.38.14
+1.208.145.205 1.208.105.254
+1.213.148.26 1.208.148.142
+1.213.148.26 1.213.151.250
+1.208.145.190 1.213.148.106
+1.208.145.190 1.208.144.178
+210.120.103.226 1.208.145.178
+210.120.103.226 1.208.146.14
+203.233.60.190 1.208.105.58
+203.233.60.190 1.208.145.238
+1.208.150.166 1.213.148.106
+1.208.150.166 1.208.144.178
+1.208.144.218 1.208.145.178
+1.208.144.218 1.208.146.14
+1.208.145.178 1.213.151.182
+1.208.148.142 1.213.150.234
+1.213.148.106 1.213.151.182
+1.208.105.58 1.213.150.234
+1.208.144.178 1.213.151.182
+1.213.150.234 1.210.78.14
+1.213.150.234 210.120.105.114
+1.213.151.182 210.120.105.114
+1.213.151.182 1.210.78.14
+210.120.105.114 210.120.196.250
+210.120.105.114 61.40.251.134
+1.210.78.14 210.120.196.138
+1.210.78.14 1.214.78.18
+210.120.196.138 1.214.79.26
+210.120.196.250 1.209.79.26
+61.40.251.134 1.214.79.26
+1.214.78.18 1.209.79.26
+1.209.79.26 8.8.8.1
+1.214.79.26 8.8.8.1
+8.8.8.1 127.1.1.6
+1.208.104.37 211.53.88.170
+1.208.104.37 203.233.117.114
+1.208.104.37 203.248.208.230
+1.208.104.37 1.213.106.122
+1.208.104.37 1.213.148.34
+1.208.104.37 1.213.148.26
+1.208.104.37 1.213.106.10
+1.208.104.37 211.53.88.190
+1.208.104.37 203.233.52.226
+1.208.104.37 203.233.60.190
+1.208.144.25 211.53.88.170
+1.208.144.25 203.233.60.190
+1.208.144.25 203.233.52.226
+1.208.144.25 203.248.208.230
+1.208.144.25 211.53.88.190
+1.208.144.25 1.213.148.34
+1.208.144.25 1.213.148.26
+1.208.144.25 1.213.106.122
+1.208.144.25 1.213.106.10
+1.208.144.25 203.233.117.114
+1.208.145.105 211.40.6.10
+1.208.145.105 1.208.104.58
+1.208.145.105 211.63.38.14
+1.208.145.105 1.208.144.218
+1.208.145.105 1.208.150.166
+1.208.145.105 210.120.103.226
+1.208.145.105 210.120.105.118
+1.208.145.105 1.208.105.254
+1.208.145.105 1.208.104.50
+1.208.145.105 1.208.145.190
+1.208.146.21 211.53.88.170
+1.208.146.21 1.213.148.26
+1.208.146.21 203.233.60.190
+1.208.146.21 1.213.148.34
+1.208.146.21 203.233.117.114
+1.208.146.21 203.248.208.230
+1.208.146.21 211.53.88.190
+1.208.146.21 203.233.52.226
+1.208.146.21 1.213.106.10
+1.208.146.21 1.213.106.122
+1.208.145.5 210.120.105.118
+1.208.145.5 1.208.145.190
+1.208.145.5 211.40.6.10
+1.208.145.5 1.208.105.254
+1.208.145.5 1.208.104.50
+1.208.145.5 1.208.144.218
+1.208.145.5 1.208.104.58
+1.208.145.5 1.208.150.166
+1.208.145.5 210.120.103.226
+1.208.145.5 211.63.38.14
+1.208.107.73 211.63.38.14
+1.208.107.73 1.208.150.166
+1.208.107.73 210.120.103.226
+1.208.107.73 210.120.105.118
+1.208.107.73 1.208.104.58
+1.208.107.73 1.208.144.218
+1.208.107.73 211.40.6.10
+1.208.107.73 1.208.145.190
+1.208.107.73 1.208.104.50
+1.208.107.73 1.208.105.254
+203.248.207.229 1.213.148.34
+203.248.207.229 1.213.106.122
+203.248.207.229 203.233.52.226
+203.248.207.229 1.213.106.10
+203.248.207.229 211.53.88.190
+203.248.207.229 203.233.60.190
+203.248.207.229 203.248.208.230
+203.248.207.229 1.213.148.26
+203.248.207.229 203.233.117.114
+203.248.207.229 211.53.88.170
+1.208.148.133 1.208.104.58
+1.208.148.133 1.208.145.190
+1.208.148.133 1.208.144.218
+1.208.148.133 211.40.6.10
+1.208.148.133 210.120.105.118
+1.208.148.133 210.120.103.226
+1.208.148.133 1.208.105.254
+1.208.148.133 211.63.38.14
+1.208.148.133 1.208.104.50
+1.208.148.133 1.208.150.166
+203.233.52.33 211.53.88.170
+203.233.52.33 1.213.106.122
+203.233.52.33 211.53.88.190
+203.233.52.33 203.233.60.190
+203.233.52.33 1.213.106.10
+203.233.52.33 203.233.52.226
+203.233.52.33 1.213.148.34
+203.233.52.33 1.213.148.26
+203.233.52.33 203.248.208.230
+203.233.52.33 203.233.117.114
+61.42.234.1 1.208.145.190
+61.42.234.1 1.208.105.254
+61.42.234.1 1.208.144.218
+61.42.234.1 1.208.104.50
+61.42.234.1 210.120.103.226
+61.42.234.1 211.63.38.14
+61.42.234.1 210.120.105.118
+61.42.234.1 211.40.6.10
+61.42.234.1 1.208.104.58
+61.42.234.1 1.208.150.166
+203.233.37.73 1.213.148.26
+203.233.37.73 203.233.60.190
+203.233.37.73 1.213.106.10
+203.233.37.73 203.233.52.226
+203.233.37.73 203.248.208.230
+203.233.37.73 211.53.88.170
+203.233.37.73 203.233.117.114
+203.233.37.73 1.213.148.34
+203.233.37.73 1.213.106.122
+203.233.37.73 211.53.88.190
+1.208.144.109 1.208.144.218
+1.208.144.109 211.63.38.14
+1.208.144.109 1.208.104.58
+1.208.144.109 1.208.145.190
+1.208.144.109 1.208.150.166
+1.208.144.109 211.40.6.10
+1.208.144.109 210.120.103.226
+1.208.144.109 1.208.105.254
+1.208.144.109 1.208.104.50
+1.208.144.109 210.120.105.118
+1.208.145.165 1.208.105.254
+1.208.145.165 211.63.38.14
+1.208.145.165 1.208.104.58
+1.208.145.165 210.120.105.118
+1.208.145.165 1.208.145.190
+1.208.145.165 1.208.144.218
+1.208.145.165 210.120.103.226
+1.208.145.165 211.40.6.10
+1.208.145.165 1.208.150.166
+1.208.145.165 1.208.104.50
+203.255.234.181 1.213.148.34
+203.255.234.181 203.248.208.230
+203.255.234.181 1.213.148.26
+203.255.234.181 211.53.88.170
+203.255.234.181 203.233.60.190
+203.255.234.181 1.213.106.10
+203.255.234.181 1.213.106.122
+203.255.234.181 203.233.52.226
+203.255.234.181 203.233.117.114
+203.255.234.181 211.53.88.190
+203.255.234.105 203.233.117.114
+203.255.234.105 203.233.52.226
+203.255.234.105 203.248.208.230
+203.255.234.105 203.233.60.190
+203.255.234.105 1.213.106.122
+203.255.234.105 1.213.148.34
+203.255.234.105 1.213.106.10
+203.255.234.105 1.213.148.26
+203.255.234.105 211.53.88.170
+203.255.234.105 211.53.88.190
+1.208.106.157 1.208.104.50
+1.208.106.157 1.208.150.166
+1.208.106.157 1.208.104.58
+1.208.106.157 210.120.105.118
+1.208.106.157 211.63.38.14
+1.208.106.157 1.208.144.218
+1.208.106.157 1.208.105.254
+1.208.106.157 210.120.103.226
+1.208.106.157 211.40.6.10
+1.208.106.157 1.208.145.190
+1.208.151.217 1.208.104.58
+1.208.151.217 1.208.104.50
+1.208.151.217 1.208.144.218
+1.208.151.217 210.120.103.226
+1.208.151.217 1.208.105.254
+1.208.151.217 1.208.145.190
+1.208.151.217 1.208.150.166
+1.208.151.217 211.63.38.14
+1.208.151.217 210.120.105.118
+1.208.151.217 211.40.6.10
+1.213.149.1 1.208.145.190
+1.213.149.1 1.208.104.58
+1.213.149.1 1.208.104.50
+1.213.149.1 1.208.144.218
+1.213.149.1 210.120.105.118
+1.213.149.1 211.63.38.14
+1.213.149.1 1.208.150.166
+1.213.149.1 210.120.103.226
+1.213.149.1 1.208.105.254
+1.213.149.1 211.40.6.10
+210.120.244.1 210.120.105.118
+210.120.244.1 1.208.105.254
+210.120.244.1 1.208.104.58
+210.120.244.1 1.208.150.166
+210.120.244.1 1.208.104.50
+210.120.244.1 211.40.6.10
+210.120.244.1 211.63.38.14
+210.120.244.1 1.208.144.218
+210.120.244.1 210.120.103.226
+210.120.244.1 1.208.145.190
+1.208.104.93 203.233.60.190
+1.208.104.93 203.233.52.226
+1.208.104.93 1.213.106.122
+1.208.104.93 203.248.208.230
+1.208.104.93 211.53.88.190
+1.208.104.93 211.53.88.170
+1.208.104.93 1.213.148.26
+1.208.104.93 1.213.148.34
+1.208.104.93 1.213.106.10
+1.208.104.93 203.233.117.114
+211.53.88.93 1.213.106.10
+211.53.88.93 1.213.148.26
+211.53.88.93 1.213.106.122
+211.53.88.93 203.248.208.230
+211.53.88.93 203.233.52.226
+211.53.88.93 211.53.88.170
+211.53.88.93 211.53.88.190
+211.53.88.93 203.233.60.190
+211.53.88.93 203.233.117.114
+211.53.88.93 1.213.148.34
+203.255.234.153 1.213.148.34
+203.255.234.153 203.248.208.230
+203.255.234.153 1.213.148.26
+203.255.234.153 203.233.52.226
+203.255.234.153 211.53.88.170
+203.255.234.153 203.233.117.114
+203.255.234.153 203.233.60.190
+203.255.234.153 1.213.106.122
+203.255.234.153 211.53.88.190
+203.255.234.153 1.213.106.10
+203.233.52.165 1.208.105.254
+203.233.52.165 210.120.105.118
+203.233.52.165 211.40.6.10
+203.233.52.165 211.63.38.14
+203.233.52.165 210.120.103.226
+203.233.52.165 1.208.104.58
+203.233.52.165 1.208.150.166
+203.233.52.165 1.208.145.190
+203.233.52.165 1.208.144.218
+203.233.52.165 1.208.104.50
+1.208.104.58 1.213.148.106
+1.208.104.58 1.208.144.178
+203.233.117.114 1.208.145.238
+203.233.117.114 1.208.105.58
+1.208.105.254 1.208.146.14
+1.208.105.254 1.208.145.178
+1.213.148.34 1.208.105.58
+1.213.148.34 1.208.145.238
+211.53.88.170 1.208.148.142
+211.53.88.170 1.213.151.250
+211.40.6.10 1.208.146.14
+211.40.6.10 1.208.145.178
+211.63.38.14 1.213.148.106
+211.63.38.14 1.208.144.178
+210.120.105.118 1.208.145.178
+210.120.105.118 1.208.146.14
+203.233.52.226 1.213.151.250
+203.233.52.226 1.208.148.142
+1.208.104.50 1.213.148.106
+1.208.104.50 1.208.144.178
+203.248.208.230 1.213.151.250
+203.248.208.230 1.208.148.142
+211.53.88.190 1.208.105.58
+211.53.88.190 1.208.145.238
+1.213.106.10 1.208.105.58
+1.213.106.10 1.208.145.238
+1.213.106.122 1.213.151.250
+1.213.106.122 1.208.148.142
+1.208.145.238 1.213.150.234
+1.208.146.14 1.213.151.182
+1.213.151.250 1.213.150.234
diff --git a/tests/fakenet/data/large_networks/ple2.cesnet.cz_59.20.252.129_2018-03-01 12_22_19.596431+01_00 b/tests/fakenet/data/large_networks/ple2.cesnet.cz_59.20.252.129_2018-03-01 12_22_19.596431+01_00
new file mode 100644
index 0000000..962a08c
--- /dev/null
+++ b/tests/fakenet/data/large_networks/ple2.cesnet.cz_59.20.252.129_2018-03-01 12_22_19.596431+01_00
@@ -0,0 +1,234 @@
+127.0.0.1 192.168.1.1
+192.168.1.1 195.113.161.1
+195.113.161.1 195.113.235.89
+195.113.235.89 83.97.88.41
+83.97.88.41 91.210.16.201
+91.210.16.201 184.105.213.233
+184.105.213.233 72.52.92.13
+72.52.92.13 184.105.81.77
+184.105.81.77 184.105.80.10
+184.105.80.10 184.105.64.102
+184.105.64.102 184.105.222.98
+184.105.222.98 184.105.64.113
+184.105.64.113 184.105.64.109
+184.105.64.109 72.52.108.226
+72.52.108.226 112.174.87.121
+72.52.108.226 112.174.87.81
+72.52.108.226 112.174.87.65
+72.52.108.226 112.174.87.73
+72.52.108.226 112.174.88.249
+72.52.108.226 112.174.88.173
+72.52.108.226 112.174.87.125
+72.52.108.226 112.174.80.137
+112.174.87.121 112.174.84.93
+112.174.87.121 112.174.83.1
+112.174.87.121 112.174.84.89
+112.174.87.121 112.174.84.141
+112.174.87.121 112.174.84.73
+112.174.87.121 112.174.84.201
+112.174.87.121 112.174.83.93
+112.174.87.121 112.174.84.1
+112.174.87.121 112.174.83.13
+112.174.87.121 112.174.83.89
+112.174.87.121 112.174.83.141
+112.174.87.121 112.174.83.149
+112.174.87.81 112.174.84.33
+112.174.87.81 112.174.84.161
+112.174.87.81 112.174.84.109
+112.174.87.81 112.174.83.109
+112.174.87.81 112.174.84.105
+112.174.87.81 112.174.83.105
+112.174.87.81 112.174.83.161
+112.174.87.81 112.174.83.201
+112.174.87.81 112.174.84.149
+112.174.87.81 112.174.83.21
+112.174.87.81 112.174.84.41
+112.174.87.81 112.174.83.73
+112.174.87.65 112.174.84.141
+112.174.87.65 112.174.83.93
+112.174.87.65 112.174.84.1
+112.174.87.65 112.174.84.89
+112.174.87.65 112.174.84.201
+112.174.87.65 112.174.83.13
+112.174.87.65 112.174.84.73
+112.174.87.65 112.174.83.1
+112.174.87.65 112.174.83.149
+112.174.87.65 112.174.83.141
+112.174.87.65 112.174.83.89
+112.174.87.65 112.174.84.93
+112.174.87.73 112.174.84.205
+112.174.87.73 112.174.83.153
+112.174.87.73 112.174.84.5
+112.174.87.73 112.174.84.97
+112.174.87.73 112.174.83.101
+112.174.87.73 112.174.83.145
+112.174.87.73 112.174.84.101
+112.174.87.73 112.174.84.145
+112.174.87.73 112.174.83.5
+112.174.87.73 112.174.83.17
+112.174.87.73 112.174.83.97
+112.174.87.73 112.174.84.77
+112.174.88.249 112.174.83.5
+112.174.88.249 112.174.84.97
+112.174.88.249 112.174.84.101
+112.174.88.249 112.174.84.5
+112.174.88.249 112.174.83.145
+112.174.88.249 112.174.84.205
+112.174.88.249 112.174.83.101
+112.174.88.249 112.174.84.145
+112.174.88.249 112.174.83.17
+112.174.88.249 112.174.84.77
+112.174.88.249 112.174.83.97
+112.174.88.249 112.174.83.153
+112.174.88.173 112.174.83.77
+112.174.88.173 112.174.84.153
+112.174.88.173 112.174.84.117
+112.174.88.173 112.174.84.37
+112.174.88.173 112.174.84.113
+112.174.88.173 112.174.83.113
+112.174.88.173 112.174.83.117
+112.174.88.173 112.174.84.165
+112.174.88.173 112.174.83.205
+112.174.88.173 112.174.84.45
+112.174.88.173 112.174.83.165
+112.174.88.173 112.174.83.25
+112.174.87.125 112.174.84.105
+112.174.87.125 112.174.83.105
+112.174.87.125 112.174.83.109
+112.174.87.125 112.174.83.201
+112.174.87.125 112.174.84.149
+112.174.87.125 112.174.84.41
+112.174.87.125 112.174.84.33
+112.174.87.125 112.174.83.21
+112.174.87.125 112.174.83.161
+112.174.87.125 112.174.84.161
+112.174.87.125 112.174.83.73
+112.174.87.125 112.174.84.109
+112.174.80.137 112.174.84.145
+112.174.80.137 112.174.84.205
+112.174.80.137 112.174.83.153
+112.174.80.137 112.174.84.101
+112.174.80.137 112.174.84.5
+112.174.80.137 112.174.83.97
+112.174.80.137 112.174.83.101
+112.174.80.137 112.174.83.5
+112.174.80.137 112.174.84.97
+112.174.80.137 112.174.83.145
+112.174.80.137 112.174.83.17
+112.174.80.137 112.174.84.77
+112.174.84.93 8.8.8.1
+112.174.83.1 8.8.8.1
+112.174.84.89 8.8.8.1
+112.174.84.141 8.8.8.1
+112.174.83.77 8.8.8.1
+112.174.84.105 8.8.8.1
+112.174.83.105 8.8.8.1
+112.174.83.109 8.8.8.1
+112.174.84.33 8.8.8.1
+112.174.83.201 8.8.8.1
+112.174.84.73 8.8.8.1
+112.174.84.149 8.8.8.1
+112.174.84.161 8.8.8.1
+112.174.84.109 8.8.8.1
+112.174.84.153 8.8.8.1
+112.174.84.145 8.8.8.1
+112.174.84.117 8.8.8.1
+112.174.83.93 8.8.8.1
+112.174.84.201 8.8.8.1
+112.174.84.205 8.8.8.1
+112.174.84.1 8.8.8.1
+112.174.83.153 8.8.8.1
+112.174.84.5 8.8.8.1
+112.174.84.101 8.8.8.1
+112.174.84.97 8.8.8.1
+112.174.83.97 8.8.8.1
+112.174.83.101 8.8.8.1
+112.174.83.5 8.8.8.1
+112.174.83.145 8.8.8.1
+112.174.84.37 8.8.8.1
+112.174.84.41 8.8.8.1
+112.174.83.13 8.8.8.1
+112.174.84.113 8.8.8.1
+112.174.83.21 8.8.8.1
+112.174.83.161 8.8.8.1
+112.174.83.113 8.8.8.1
+112.174.83.89 8.8.8.1
+112.174.83.117 8.8.8.1
+112.174.83.141 8.8.8.1
+112.174.84.165 8.8.8.1
+112.174.83.205 8.8.8.1
+112.174.84.45 8.8.8.1
+112.174.83.149 8.8.8.1
+112.174.83.165 8.8.8.1
+112.174.83.73 8.8.8.1
+112.174.83.17 8.8.8.1
+112.174.84.77 8.8.8.1
+112.174.83.25 8.8.8.1
+8.8.8.1 8.8.8.2
+8.8.8.2 112.174.234.26
+8.8.8.2 112.174.236.150
+8.8.8.2 112.174.236.154
+8.8.8.2 112.174.234.146
+8.8.8.2 112.174.237.154
+8.8.8.2 112.174.234.142
+8.8.8.2 112.174.235.126
+8.8.8.2 112.174.235.146
+8.8.8.2 112.174.236.2
+8.8.8.2 112.174.237.150
+8.8.8.2 112.174.236.142
+8.8.8.2 112.174.237.2
+8.8.8.2 112.174.235.26
+8.8.8.2 112.174.236.146
+8.8.8.2 112.174.236.218
+8.8.8.2 112.174.237.146
+8.8.8.2 112.174.234.154
+8.8.8.2 112.174.236.26
+8.8.8.2 112.174.235.2
+8.8.8.2 112.174.235.218
+8.8.8.2 112.174.237.126
+8.8.8.2 112.174.235.154
+8.8.8.2 112.174.236.126
+8.8.8.2 112.174.234.218
+8.8.8.2 112.174.234.2
+8.8.8.2 112.174.237.26
+8.8.8.2 112.174.237.142
+8.8.8.2 112.174.237.218
+8.8.8.2 112.174.234.150
+8.8.8.2 112.174.234.126
+8.8.8.2 112.174.235.142
+8.8.8.2 112.174.235.150
+112.174.234.26 8.8.8.3
+112.174.236.150 8.8.8.3
+112.174.236.154 8.8.8.3
+112.174.234.146 8.8.8.3
+112.174.237.154 8.8.8.3
+112.174.234.142 8.8.8.3
+112.174.235.126 8.8.8.3
+112.174.235.146 8.8.8.3
+112.174.236.2 8.8.8.3
+112.174.237.150 8.8.8.3
+112.174.236.142 8.8.8.3
+112.174.237.2 8.8.8.3
+112.174.235.26 8.8.8.3
+112.174.236.146 8.8.8.3
+112.174.236.218 8.8.8.3
+112.174.237.146 8.8.8.3
+112.174.234.154 8.8.8.3
+112.174.236.26 8.8.8.3
+112.174.235.2 8.8.8.3
+112.174.235.218 8.8.8.3
+112.174.237.126 8.8.8.3
+112.174.235.154 8.8.8.3
+112.174.236.126 8.8.8.3
+112.174.234.218 8.8.8.3
+112.174.234.2 8.8.8.3
+112.174.237.26 8.8.8.3
+112.174.237.142 8.8.8.3
+112.174.237.218 8.8.8.3
+112.174.234.150 8.8.8.3
+112.174.234.126 8.8.8.3
+112.174.235.142 8.8.8.3
+112.174.235.150 8.8.8.3
+8.8.8.3 112.174.238.74
+112.174.238.74 121.144.23.42
+121.144.23.42 127.1.1.6
diff --git a/tests/fakenet/data/large_networks/ple2.planet-lab.eu_125.155.82.17_2018-02-09 10_22_59.068401+01_00 b/tests/fakenet/data/large_networks/ple2.planet-lab.eu_125.155.82.17_2018-02-09 10_22_59.068401+01_00
new file mode 100644
index 0000000..249ac72
--- /dev/null
+++ b/tests/fakenet/data/large_networks/ple2.planet-lab.eu_125.155.82.17_2018-02-09 10_22_59.068401+01_00
@@ -0,0 +1,448 @@
+127.0.0.1 192.168.1.1
+192.168.1.1 132.227.123.1
+132.227.123.1 134.157.167.125
+134.157.167.125 134.157.254.124
+134.157.254.124 195.221.127.181
+195.221.127.181 193.51.181.102
+193.51.181.102 193.51.177.117
+193.51.177.117 83.97.89.9
+83.97.89.9 62.40.98.76
+62.40.98.76 62.40.98.78
+62.40.98.78 72.51.51.51
+72.51.51.51 72.52.92.166
+72.52.92.166 184.105.80.10
+184.105.80.10 184.105.64.102
+184.105.64.102 184.105.222.98
+184.105.222.98 184.105.64.113
+184.105.64.113 184.105.64.109
+184.105.64.109 72.52.108.226
+72.52.108.226 112.174.87.121
+72.52.108.226 112.174.88.173
+72.52.108.226 112.174.80.137
+72.52.108.226 112.174.87.81
+72.52.108.226 112.174.87.73
+72.52.108.226 112.174.88.249
+72.52.108.226 112.174.87.125
+72.52.108.226 112.174.87.65
+112.174.87.121 112.174.84.73
+112.174.87.121 112.174.84.201
+112.174.87.121 112.174.83.141
+112.174.87.121 112.174.84.1
+112.174.87.121 112.174.83.1
+112.174.87.121 112.174.83.13
+112.174.87.121 112.174.84.89
+112.174.87.121 112.174.83.93
+112.174.87.121 112.174.84.93
+112.174.87.121 112.174.83.149
+112.174.87.121 112.174.83.89
+112.174.87.121 112.174.84.141
+112.174.88.173 112.174.84.153
+112.174.88.173 112.174.83.165
+112.174.88.173 112.174.84.45
+112.174.88.173 112.174.83.25
+112.174.88.173 112.174.84.37
+112.174.88.173 112.174.84.113
+112.174.88.173 112.174.84.165
+112.174.88.173 112.174.83.117
+112.174.88.173 112.174.83.205
+112.174.88.173 112.174.83.113
+112.174.88.173 112.174.83.77
+112.174.88.173 112.174.84.117
+112.174.80.137 112.174.84.145
+112.174.80.137 112.174.83.101
+112.174.80.137 112.174.83.5
+112.174.80.137 112.174.84.97
+112.174.80.137 112.174.83.153
+112.174.80.137 112.174.84.5
+112.174.80.137 112.174.83.17
+112.174.80.137 112.174.83.97
+112.174.80.137 112.174.84.101
+112.174.80.137 112.174.83.145
+112.174.80.137 112.174.84.205
+112.174.80.137 112.174.84.77
+112.174.87.81 112.174.84.33
+112.174.87.81 112.174.83.73
+112.174.87.81 112.174.84.161
+112.174.87.81 112.174.83.105
+112.174.87.81 112.174.84.41
+112.174.87.81 112.174.83.201
+112.174.87.81 112.174.84.149
+112.174.87.81 112.174.84.105
+112.174.87.81 112.174.83.109
+112.174.87.81 112.174.84.109
+112.174.87.81 112.174.83.161
+112.174.87.81 112.174.83.21
+112.174.87.73 112.174.83.145
+112.174.87.73 112.174.83.97
+112.174.87.73 112.174.84.101
+112.174.87.73 112.174.83.17
+112.174.87.73 112.174.83.153
+112.174.87.73 112.174.83.101
+112.174.87.73 112.174.84.205
+112.174.87.73 112.174.84.145
+112.174.87.73 112.174.84.97
+112.174.87.73 112.174.84.77
+112.174.87.73 112.174.84.5
+112.174.87.73 112.174.83.5
+112.174.88.249 112.174.84.77
+112.174.88.249 112.174.84.205
+112.174.88.249 112.174.84.5
+112.174.88.249 112.174.83.5
+112.174.88.249 112.174.84.145
+112.174.88.249 112.174.83.145
+112.174.88.249 112.174.83.17
+112.174.88.249 112.174.83.153
+112.174.88.249 112.174.83.97
+112.174.88.249 112.174.84.97
+112.174.88.249 112.174.83.101
+112.174.88.249 112.174.84.101
+112.174.87.125 112.174.83.105
+112.174.87.125 112.174.83.73
+112.174.87.125 112.174.84.33
+112.174.87.125 112.174.83.21
+112.174.87.125 112.174.84.161
+112.174.87.125 112.174.84.149
+112.174.87.125 112.174.84.105
+112.174.87.125 112.174.84.109
+112.174.87.125 112.174.84.41
+112.174.87.125 112.174.83.201
+112.174.87.125 112.174.83.109
+112.174.87.125 112.174.83.161
+112.174.87.65 112.174.84.89
+112.174.87.65 112.174.84.201
+112.174.87.65 112.174.84.141
+112.174.87.65 112.174.84.1
+112.174.87.65 112.174.84.73
+112.174.87.65 112.174.83.149
+112.174.87.65 112.174.84.93
+112.174.87.65 112.174.83.13
+112.174.87.65 112.174.83.89
+112.174.87.65 112.174.83.93
+112.174.87.65 112.174.83.1
+112.174.87.65 112.174.83.141
+112.174.84.73 112.174.48.193
+112.174.84.73 112.174.48.233
+112.174.84.73 112.174.48.77
+112.174.84.73 112.174.48.37
+112.174.84.73 112.174.48.33
+112.174.84.73 112.174.48.73
+112.174.84.201 112.174.48.117
+112.174.84.201 112.174.48.237
+112.174.84.201 112.174.48.197
+112.174.84.201 112.174.48.113
+112.174.84.201 112.174.48.153
+112.174.84.201 112.174.48.157
+112.174.83.105 112.174.8.233
+112.174.83.105 112.174.8.193
+112.174.83.105 112.174.8.33
+112.174.83.105 112.174.8.73
+112.174.83.105 112.174.8.77
+112.174.83.105 112.174.8.37
+112.174.84.153 112.174.48.157
+112.174.84.153 112.174.48.197
+112.174.84.153 112.174.48.113
+112.174.84.153 112.174.48.117
+112.174.84.153 112.174.48.237
+112.174.84.153 112.174.48.153
+112.174.83.141 112.174.8.153
+112.174.83.141 112.174.8.117
+112.174.83.141 112.174.8.237
+112.174.83.141 112.174.8.197
+112.174.83.141 112.174.8.157
+112.174.83.141 112.174.8.113
+112.174.84.1 112.174.48.193
+112.174.84.1 112.174.48.37
+112.174.84.1 112.174.48.73
+112.174.84.1 112.174.48.77
+112.174.84.1 112.174.48.33
+112.174.84.1 112.174.48.233
+112.174.83.73 112.174.8.77
+112.174.83.73 112.174.8.37
+112.174.83.73 112.174.8.193
+112.174.83.73 112.174.8.233
+112.174.83.73 112.174.8.33
+112.174.83.73 112.174.8.73
+112.174.84.33 112.174.48.193
+112.174.84.33 112.174.48.233
+112.174.84.33 112.174.48.33
+112.174.84.33 112.174.48.37
+112.174.84.33 112.174.48.77
+112.174.84.33 112.174.48.73
+112.174.83.21 112.174.8.193
+112.174.83.21 112.174.8.73
+112.174.83.21 112.174.8.33
+112.174.83.21 112.174.8.37
+112.174.83.21 112.174.8.233
+112.174.83.21 112.174.8.77
+112.174.84.161 112.174.48.157
+112.174.84.161 112.174.48.237
+112.174.84.161 112.174.48.113
+112.174.84.161 112.174.48.153
+112.174.84.161 112.174.48.117
+112.174.84.161 112.174.48.197
+112.174.84.149 112.174.48.117
+112.174.84.149 112.174.48.237
+112.174.84.149 112.174.48.153
+112.174.84.149 112.174.48.197
+112.174.84.149 112.174.48.157
+112.174.84.149 112.174.48.113
+112.174.83.165 112.174.8.237
+112.174.83.165 112.174.8.157
+112.174.83.165 112.174.8.153
+112.174.83.165 112.174.8.197
+112.174.83.165 112.174.8.113
+112.174.83.165 112.174.8.117
+112.174.84.45 112.174.48.193
+112.174.84.45 112.174.48.33
+112.174.84.45 112.174.48.77
+112.174.84.45 112.174.48.37
+112.174.84.45 112.174.48.73
+112.174.84.45 112.174.48.233
+112.174.83.1 112.174.8.73
+112.174.83.1 112.174.8.193
+112.174.83.1 112.174.8.77
+112.174.83.1 112.174.8.33
+112.174.83.1 112.174.8.37
+112.174.83.1 112.174.8.233
+112.174.83.13 112.174.8.233
+112.174.83.13 112.174.8.193
+112.174.83.13 112.174.8.73
+112.174.83.13 112.174.8.77
+112.174.83.13 112.174.8.33
+112.174.83.13 112.174.8.37
+112.174.83.25 112.174.8.73
+112.174.83.25 112.174.8.233
+112.174.83.25 112.174.8.193
+112.174.83.25 112.174.8.77
+112.174.83.25 112.174.8.37
+112.174.83.25 112.174.8.33
+112.174.84.37 112.174.48.33
+112.174.84.37 112.174.48.193
+112.174.84.37 112.174.48.37
+112.174.84.37 112.174.48.233
+112.174.84.37 112.174.48.77
+112.174.84.37 112.174.48.73
+112.174.84.145 112.174.48.237
+112.174.84.145 112.174.48.117
+112.174.84.145 112.174.48.113
+112.174.84.145 112.174.48.197
+112.174.84.145 112.174.48.153
+112.174.84.145 112.174.48.157
+112.174.84.89 112.174.48.33
+112.174.84.89 112.174.48.37
+112.174.84.89 112.174.48.233
+112.174.84.89 112.174.48.193
+112.174.84.89 112.174.48.77
+112.174.84.89 112.174.48.73
+112.174.84.113 112.174.48.193
+112.174.84.113 112.174.48.33
+112.174.84.113 112.174.48.73
+112.174.84.113 112.174.48.233
+112.174.84.113 112.174.48.77
+112.174.84.113 112.174.48.37
+112.174.84.141 112.174.48.237
+112.174.84.141 112.174.48.197
+112.174.84.141 112.174.48.113
+112.174.84.141 112.174.48.153
+112.174.84.141 112.174.48.117
+112.174.84.141 112.174.48.157
+112.174.83.145 112.174.8.153
+112.174.83.145 112.174.8.117
+112.174.83.145 112.174.8.237
+112.174.83.145 112.174.8.157
+112.174.83.145 112.174.8.113
+112.174.83.101 112.174.8.157
+112.174.83.101 112.174.8.153
+112.174.83.101 112.174.8.197
+112.174.83.101 112.174.8.117
+112.174.83.101 112.174.8.237
+112.174.83.101 112.174.8.113
+112.174.83.5 112.174.8.73
+112.174.83.5 112.174.8.233
+112.174.83.5 112.174.8.33
+112.174.83.5 112.174.8.193
+112.174.83.5 112.174.8.37
+112.174.83.5 112.174.8.77
+112.174.83.97 112.174.8.193
+112.174.83.97 112.174.8.73
+112.174.83.97 112.174.8.233
+112.174.83.97 112.174.8.77
+112.174.83.97 112.174.8.37
+112.174.83.97 112.174.8.33
+112.174.84.97 112.174.48.193
+112.174.84.97 112.174.48.33
+112.174.84.97 112.174.48.77
+112.174.84.97 112.174.48.233
+112.174.84.97 112.174.48.73
+112.174.84.97 112.174.48.37
+112.174.84.101 112.174.48.157
+112.174.84.101 112.174.48.237
+112.174.84.101 112.174.48.153
+112.174.84.101 112.174.48.197
+112.174.84.101 112.174.48.113
+112.174.84.101 112.174.48.117
+112.174.83.17 112.174.8.73
+112.174.83.17 112.174.8.233
+112.174.83.17 112.174.8.77
+112.174.83.17 112.174.8.37
+112.174.83.17 112.174.8.193
+112.174.83.17 112.174.8.33
+112.174.83.153 112.174.8.157
+112.174.83.153 112.174.8.237
+112.174.83.153 112.174.8.153
+112.174.83.153 112.174.8.197
+112.174.83.153 112.174.8.117
+112.174.83.153 112.174.8.113
+112.174.84.41 112.174.48.193
+112.174.84.41 112.174.48.73
+112.174.84.41 112.174.48.233
+112.174.84.41 112.174.48.33
+112.174.84.41 112.174.48.37
+112.174.84.41 112.174.48.77
+112.174.84.77 112.174.48.33
+112.174.84.77 112.174.48.77
+112.174.84.77 112.174.48.37
+112.174.84.77 112.174.48.233
+112.174.84.77 112.174.48.73
+112.174.84.77 112.174.48.193
+112.174.84.205 112.174.48.197
+112.174.84.205 112.174.48.237
+112.174.84.205 112.174.48.157
+112.174.84.205 112.174.48.117
+112.174.84.205 112.174.48.153
+112.174.84.5 112.174.48.193
+112.174.84.5 112.174.48.33
+112.174.84.5 112.174.48.77
+112.174.84.5 112.174.48.233
+112.174.84.5 112.174.48.37
+112.174.84.5 112.174.48.73
+112.174.83.93 112.174.8.153
+112.174.83.93 112.174.8.113
+112.174.83.93 112.174.8.157
+112.174.83.93 112.174.8.117
+112.174.83.93 112.174.8.237
+112.174.83.93 112.174.8.197
+112.174.84.105 112.174.48.193
+112.174.84.105 112.174.48.33
+112.174.84.105 112.174.48.37
+112.174.84.105 112.174.48.233
+112.174.84.105 112.174.48.77
+112.174.84.105 112.174.48.73
+112.174.84.93 112.174.48.157
+112.174.84.93 112.174.48.117
+112.174.84.93 112.174.48.237
+112.174.84.93 112.174.48.113
+112.174.84.93 112.174.48.153
+112.174.84.93 112.174.48.197
+112.174.84.109 112.174.48.237
+112.174.84.109 112.174.48.153
+112.174.84.109 112.174.48.197
+112.174.84.109 112.174.48.157
+112.174.84.109 112.174.48.113
+112.174.84.109 112.174.48.117
+112.174.84.165 112.174.48.117
+112.174.84.165 112.174.48.237
+112.174.84.165 112.174.48.197
+112.174.84.165 112.174.48.113
+112.174.84.165 112.174.48.153
+112.174.84.165 112.174.48.157
+112.174.83.117 112.174.8.237
+112.174.83.117 112.174.8.113
+112.174.83.117 112.174.8.197
+112.174.83.117 112.174.8.117
+112.174.83.117 112.174.8.157
+112.174.83.117 112.174.8.153
+112.174.83.201 112.174.8.157
+112.174.83.201 112.174.8.153
+112.174.83.201 112.174.8.113
+112.174.83.201 112.174.8.117
+112.174.83.201 112.174.8.237
+112.174.83.201 112.174.8.197
+112.174.83.109 112.174.8.157
+112.174.83.109 112.174.8.117
+112.174.83.109 112.174.8.237
+112.174.83.109 112.174.8.153
+112.174.83.109 112.174.8.197
+112.174.83.109 112.174.8.113
+112.174.83.205 112.174.8.237
+112.174.83.205 112.174.8.157
+112.174.83.205 112.174.8.153
+112.174.83.205 112.174.8.197
+112.174.83.205 112.174.8.113
+112.174.83.205 112.174.8.117
+112.174.83.149 112.174.8.157
+112.174.83.149 112.174.8.113
+112.174.83.149 112.174.8.153
+112.174.83.149 112.174.8.237
+112.174.83.149 112.174.8.197
+112.174.83.149 112.174.8.117
+112.174.83.113 112.174.8.193
+112.174.83.113 112.174.8.73
+112.174.83.113 112.174.8.233
+112.174.83.113 112.174.8.37
+112.174.83.113 112.174.8.77
+112.174.83.113 112.174.8.33
+112.174.83.161 112.174.8.153
+112.174.83.161 112.174.8.237
+112.174.83.161 112.174.8.157
+112.174.83.161 112.174.8.117
+112.174.83.161 112.174.8.197
+112.174.83.161 112.174.8.113
+112.174.83.89 112.174.8.233
+112.174.83.89 112.174.8.77
+112.174.83.89 112.174.8.33
+112.174.83.89 112.174.8.37
+112.174.83.89 112.174.8.193
+112.174.83.89 112.174.8.73
+112.174.83.77 112.174.8.73
+112.174.83.77 112.174.8.233
+112.174.83.77 112.174.8.33
+112.174.83.77 112.174.8.37
+112.174.83.77 112.174.8.77
+112.174.83.77 112.174.8.193
+112.174.84.117 112.174.48.237
+112.174.84.117 112.174.48.197
+112.174.84.117 112.174.48.113
+112.174.84.117 112.174.48.117
+112.174.84.117 112.174.48.157
+112.174.84.117 112.174.48.153
+112.174.48.33 112.174.66.146
+112.174.8.193 112.174.26.146
+112.174.8.73 112.174.26.150
+112.174.48.157 112.174.66.198
+112.174.48.193 112.174.66.146
+112.174.8.233 112.174.26.150
+112.174.48.117 112.174.66.146
+112.174.48.37 112.174.66.146
+112.174.8.237 112.174.26.150
+112.174.48.237 112.174.66.198
+112.174.8.157 112.174.26.150
+112.174.8.77 112.174.26.150
+112.174.8.153 112.174.26.150
+112.174.8.197 112.174.26.146
+112.174.48.77 112.174.66.198
+112.174.48.73 112.174.66.198
+112.174.48.233 112.174.66.198
+112.174.48.197 112.174.66.146
+112.174.8.113 112.174.26.146
+112.174.48.113 112.174.66.146
+112.174.8.117 112.174.26.146
+112.174.8.37 112.174.26.146
+112.174.8.33 112.174.26.146
+112.174.48.153 112.174.66.198
+112.174.26.146 125.144.30.194
+112.174.26.146 125.144.17.142
+112.174.26.150 125.144.30.194
+112.174.26.150 125.144.17.142
+112.174.66.146 125.144.17.142
+112.174.66.146 125.144.30.194
+112.174.66.198 125.144.17.142
+112.174.66.198 125.144.30.194
+125.144.30.194 14.59.46.14
+125.144.30.194 14.59.46.10
+125.144.17.142 14.59.47.10
+125.144.17.142 14.59.47.14
+14.59.47.10 127.1.1.6
+14.59.47.14 127.1.1.6
+14.59.46.14 127.1.1.6
+14.59.46.10 127.1.1.6
diff --git a/tests/fakenet/data/large_networks/ple42.planet-lab.eu_2.17.140.1_2018-01-25 13_32_03.308419+01_00 b/tests/fakenet/data/large_networks/ple42.planet-lab.eu_2.17.140.1_2018-01-25 13_32_03.308419+01_00
new file mode 100644
index 0000000..93fdfca
--- /dev/null
+++ b/tests/fakenet/data/large_networks/ple42.planet-lab.eu_2.17.140.1_2018-01-25 13_32_03.308419+01_00
@@ -0,0 +1,132 @@
+127.0.0.1 192.168.1.1
+192.168.1.1 132.227.123.1
+132.227.123.1 134.157.167.125
+134.157.167.125 134.157.254.124
+134.157.254.124 195.221.127.181
+195.221.127.181 193.51.181.102
+193.51.181.102 193.51.177.114
+193.51.177.114 77.67.123.209
+77.67.123.209 89.149.181.145
+77.67.123.209 141.136.108.109
+77.67.123.209 141.136.111.117
+77.67.123.209 89.149.181.141
+77.67.123.209 213.200.82.181
+77.67.123.209 141.136.108.113
+77.67.123.209 141.136.108.105
+77.67.123.209 213.200.82.217
+89.149.181.145 213.248.81.29
+141.136.108.109 213.248.81.29
+141.136.111.117 213.248.81.29
+89.149.181.141 213.248.81.29
+213.200.82.181 213.248.81.29
+141.136.108.113 213.248.81.29
+141.136.108.105 213.248.81.29
+213.200.82.217 213.248.81.29
+213.248.81.29 62.115.122.10
+213.248.81.29 62.115.122.4
+62.115.122.10 62.115.122.139
+62.115.122.4 62.115.123.12
+62.115.122.139 62.115.112.95
+62.115.122.139 62.115.139.113
+62.115.122.139 213.155.135.51
+62.115.122.139 213.155.132.233
+62.115.122.139 62.115.112.91
+62.115.122.139 62.115.143.135
+62.115.122.139 213.155.135.47
+62.115.122.139 62.115.139.111
+62.115.122.139 213.155.131.51
+62.115.122.139 62.115.143.129
+62.115.122.139 80.91.251.144
+62.115.122.139 80.91.248.54
+62.115.122.139 62.115.112.89
+62.115.122.139 62.115.143.133
+62.115.122.139 213.155.132.229
+62.115.122.139 213.155.132.148
+62.115.122.139 62.115.139.109
+62.115.122.139 213.155.130.49
+62.115.122.139 213.155.132.146
+62.115.122.139 62.115.112.93
+62.115.122.139 62.115.139.115
+62.115.122.139 62.115.143.131
+62.115.122.139 213.155.132.231
+62.115.122.139 80.239.147.173
+62.115.122.139 213.155.133.113
+62.115.122.139 80.91.246.211
+62.115.123.12 62.115.112.101
+62.115.123.12 62.115.112.103
+62.115.123.12 62.115.139.101
+62.115.123.12 62.115.112.99
+62.115.123.12 62.115.143.110
+62.115.123.12 213.155.132.152
+62.115.123.12 62.115.139.105
+62.115.123.12 213.155.135.31
+62.115.123.12 80.91.246.213
+62.115.123.12 80.91.251.159
+62.115.123.12 62.115.143.108
+62.115.123.12 80.91.251.153
+62.115.123.12 62.115.112.97
+62.115.123.12 213.155.131.49
+62.115.123.12 62.115.139.103
+62.115.123.12 62.115.139.99
+62.115.123.12 80.91.251.155
+62.115.123.12 80.239.147.177
+62.115.123.12 213.155.132.150
+62.115.123.12 62.115.143.104
+62.115.123.12 213.155.133.117
+62.115.123.12 213.155.134.113
+62.115.123.12 62.115.143.106
+62.115.123.12 80.91.248.58
+62.115.123.12 80.91.251.146
+62.115.123.12 80.91.251.157
+62.115.112.101 127.1.1.6
+62.115.112.103 127.1.1.6
+62.115.139.101 127.1.1.6
+62.115.112.99 127.1.1.6
+62.115.143.110 127.1.1.6
+213.155.132.152 127.1.1.6
+62.115.139.105 127.1.1.6
+213.155.135.31 127.1.1.6
+62.115.112.95 127.1.1.6
+62.115.139.113 127.1.1.6
+213.155.135.51 127.1.1.6
+213.155.132.233 127.1.1.6
+62.115.112.91 127.1.1.6
+62.115.143.135 127.1.1.6
+213.155.135.47 127.1.1.6
+62.115.139.111 127.1.1.6
+80.91.246.213 127.1.1.6
+213.155.131.51 127.1.1.6
+62.115.143.129 127.1.1.6
+80.91.251.144 127.1.1.6
+80.91.251.159 127.1.1.6
+80.91.248.54 127.1.1.6
+62.115.143.108 127.1.1.6
+80.91.251.153 127.1.1.6
+62.115.112.97 127.1.1.6
+62.115.112.89 127.1.1.6
+62.115.143.133 127.1.1.6
+213.155.131.49 127.1.1.6
+62.115.139.103 127.1.1.6
+213.155.132.229 127.1.1.6
+213.155.132.148 127.1.1.6
+62.115.139.99 127.1.1.6
+80.91.251.155 127.1.1.6
+80.239.147.177 127.1.1.6
+62.115.139.109 127.1.1.6
+213.155.130.49 127.1.1.6
+213.155.132.146 127.1.1.6
+213.155.132.150 127.1.1.6
+62.115.112.93 127.1.1.6
+62.115.139.115 127.1.1.6
+62.115.143.131 127.1.1.6
+62.115.143.104 127.1.1.6
+213.155.133.117 127.1.1.6
+213.155.132.231 127.1.1.6
+213.155.134.113 127.1.1.6
+62.115.143.106 127.1.1.6
+80.239.147.173 127.1.1.6
+80.91.248.58 127.1.1.6
+80.91.251.146 127.1.1.6
+213.155.133.113 127.1.1.6
+80.91.246.211 127.1.1.6
+80.91.251.157 127.1.1.6
diff --git a/tests/fakenet/data/large_networks/ple42.planet-lab.eu_31.13.64.6_2018-02-22 15_47_18.906690+01_00 b/tests/fakenet/data/large_networks/ple42.planet-lab.eu_31.13.64.6_2018-02-22 15_47_18.906690+01_00
new file mode 100644
index 0000000..bb08c67
--- /dev/null
+++ b/tests/fakenet/data/large_networks/ple42.planet-lab.eu_31.13.64.6_2018-02-22 15_47_18.906690+01_00
@@ -0,0 +1,766 @@
+127.0.0.1 192.168.1.1
+192.168.1.1 132.227.123.1
+132.227.123.1 134.157.167.125
+134.157.167.125 134.157.254.124
+134.157.254.124 195.221.127.181
+195.221.127.181 193.51.181.102
+193.51.181.102 193.51.177.117
+193.51.177.117 83.97.89.9
+83.97.89.9 62.40.98.76
+62.40.98.76 62.40.98.78
+62.40.98.78 62.40.98.81
+62.40.98.81 1.1.1.1
+1.1.1.1 31.13.31.38
+1.1.1.1 157.240.35.54
+1.1.1.1 31.13.31.36
+1.1.1.1 157.240.35.60
+31.13.31.38 157.240.35.159
+31.13.31.38 157.240.35.155
+31.13.31.38 157.240.35.151
+31.13.31.38 157.240.35.161
+31.13.31.38 157.240.35.149
+31.13.31.38 157.240.35.157
+31.13.31.38 157.240.35.153
+31.13.31.38 157.240.35.147
+157.240.35.54 157.240.35.169
+157.240.35.54 157.240.35.177
+157.240.35.54 157.240.35.167
+157.240.35.54 157.240.35.175
+157.240.35.54 157.240.35.165
+157.240.35.54 157.240.35.163
+157.240.35.54 157.240.35.173
+157.240.35.54 157.240.35.171
+31.13.31.36 157.240.32.15
+31.13.31.36 74.119.78.13
+31.13.31.36 31.13.29.131
+31.13.31.36 157.240.32.17
+31.13.31.36 157.240.32.13
+31.13.31.36 157.240.32.19
+31.13.31.36 74.119.78.7
+31.13.31.36 31.13.29.247
+157.240.35.60 157.240.35.179
+157.240.35.60 157.240.35.181
+157.240.35.60 157.240.35.189
+157.240.35.60 157.240.35.193
+157.240.35.60 157.240.35.183
+157.240.35.60 157.240.35.187
+157.240.35.60 157.240.35.185
+157.240.35.60 157.240.35.191
+157.240.35.159 173.252.67.129
+157.240.35.159 173.252.67.139
+157.240.35.159 173.252.67.123
+157.240.35.159 173.252.67.105
+157.240.35.159 173.252.67.115
+157.240.35.159 173.252.67.107
+157.240.35.159 173.252.67.119
+157.240.35.159 173.252.67.131
+157.240.35.159 173.252.67.111
+157.240.35.159 173.252.67.109
+157.240.35.159 173.252.67.121
+157.240.35.159 173.252.67.137
+157.240.35.159 173.252.67.117
+157.240.35.159 173.252.67.135
+157.240.35.159 173.252.67.125
+157.240.35.159 173.252.67.133
+157.240.35.159 173.252.67.127
+157.240.35.159 173.252.67.113
+157.240.35.155 173.252.67.33
+157.240.35.155 173.252.67.15
+157.240.35.155 173.252.67.1
+157.240.35.155 173.252.67.35
+157.240.35.155 173.252.67.31
+157.240.35.155 173.252.67.29
+157.240.35.155 173.252.67.19
+157.240.35.155 173.252.67.21
+157.240.35.155 173.252.67.25
+157.240.35.155 173.252.67.11
+157.240.35.155 173.252.67.23
+157.240.35.155 173.252.67.9
+157.240.35.155 173.252.67.7
+157.240.35.155 173.252.67.27
+157.240.35.155 173.252.67.5
+157.240.35.155 173.252.67.3
+157.240.35.155 173.252.67.17
+157.240.35.151 173.252.67.109
+157.240.35.151 173.252.67.137
+157.240.35.151 173.252.67.117
+157.240.35.151 173.252.67.115
+157.240.35.151 173.252.67.113
+157.240.35.151 173.252.67.127
+157.240.35.151 173.252.67.135
+157.240.35.151 173.252.67.121
+157.240.35.151 173.252.67.133
+157.240.35.151 173.252.67.119
+157.240.35.151 173.252.67.125
+157.240.35.151 173.252.67.123
+157.240.35.151 173.252.67.139
+157.240.35.151 173.252.67.107
+157.240.35.151 173.252.67.129
+157.240.35.151 173.252.67.105
+157.240.35.151 173.252.67.131
+157.240.35.151 173.252.67.111
+157.240.35.161 173.252.67.177
+157.240.35.161 173.252.67.175
+157.240.35.161 173.252.67.183
+157.240.35.161 173.252.67.157
+157.240.35.161 173.252.67.191
+157.240.35.161 173.252.67.165
+157.240.35.161 173.252.67.187
+157.240.35.161 173.252.67.161
+157.240.35.161 173.252.67.159
+157.240.35.161 173.252.67.189
+157.240.35.161 173.252.67.185
+157.240.35.161 173.252.67.163
+157.240.35.161 173.252.67.181
+157.240.35.161 173.252.67.167
+157.240.35.161 173.252.67.169
+157.240.35.161 173.252.67.171
+157.240.35.161 173.252.67.179
+157.240.35.161 173.252.67.173
+157.240.35.149 173.252.67.61
+157.240.35.149 173.252.67.81
+157.240.35.149 173.252.67.59
+157.240.35.149 173.252.67.57
+157.240.35.149 173.252.67.79
+157.240.35.149 173.252.67.69
+157.240.35.149 173.252.67.73
+157.240.35.149 173.252.67.85
+157.240.35.149 173.252.67.83
+157.240.35.149 173.252.67.71
+157.240.35.149 173.252.67.77
+157.240.35.149 173.252.67.65
+157.240.35.149 173.252.67.55
+157.240.35.149 173.252.67.63
+157.240.35.149 173.252.67.53
+157.240.35.149 173.252.67.67
+157.240.35.149 173.252.67.75
+157.240.35.149 173.252.67.87
+157.240.35.169 173.252.67.175
+157.240.35.169 173.252.67.161
+157.240.35.169 173.252.67.157
+157.240.35.169 173.252.67.169
+157.240.35.169 173.252.67.185
+157.240.35.169 173.252.67.165
+157.240.35.169 173.252.67.173
+157.240.35.169 173.252.67.181
+157.240.35.169 173.252.67.159
+157.240.35.169 173.252.67.191
+157.240.35.169 173.252.67.163
+157.240.35.169 173.252.67.167
+157.240.35.169 173.252.67.179
+157.240.35.169 173.252.67.183
+157.240.35.169 173.252.67.171
+157.240.35.169 173.252.67.187
+157.240.35.169 173.252.67.189
+157.240.35.169 173.252.67.177
+157.240.35.177 173.252.67.159
+157.240.35.177 173.252.67.175
+157.240.35.177 173.252.67.191
+157.240.35.177 173.252.67.163
+157.240.35.177 173.252.67.157
+157.240.35.177 173.252.67.165
+157.240.35.177 173.252.67.187
+157.240.35.177 173.252.67.183
+157.240.35.177 173.252.67.173
+157.240.35.177 173.252.67.177
+157.240.35.177 173.252.67.171
+157.240.35.177 173.252.67.185
+157.240.35.177 173.252.67.167
+157.240.35.177 173.252.67.169
+157.240.35.177 173.252.67.179
+157.240.35.177 173.252.67.161
+157.240.35.177 173.252.67.181
+157.240.35.167 173.252.67.117
+157.240.35.167 173.252.67.125
+157.240.35.167 173.252.67.123
+157.240.35.167 173.252.67.121
+157.240.35.167 173.252.67.105
+157.240.35.167 173.252.67.109
+157.240.35.167 173.252.67.131
+157.240.35.167 173.252.67.113
+157.240.35.167 173.252.67.107
+157.240.35.167 173.252.67.111
+157.240.35.167 173.252.67.133
+157.240.35.167 173.252.67.119
+157.240.35.167 173.252.67.115
+157.240.35.167 173.252.67.137
+157.240.35.167 173.252.67.135
+157.240.35.167 173.252.67.139
+157.240.35.167 173.252.67.127
+157.240.35.167 173.252.67.129
+157.240.35.175 173.252.67.109
+157.240.35.175 173.252.67.111
+157.240.35.175 173.252.67.115
+157.240.35.175 173.252.67.129
+157.240.35.175 173.252.67.133
+157.240.35.175 173.252.67.139
+157.240.35.175 173.252.67.121
+157.240.35.175 173.252.67.123
+157.240.35.175 173.252.67.127
+157.240.35.175 173.252.67.105
+157.240.35.175 173.252.67.125
+157.240.35.175 173.252.67.117
+157.240.35.175 173.252.67.107
+157.240.35.175 173.252.67.113
+157.240.35.175 173.252.67.119
+157.240.35.175 173.252.67.131
+157.240.35.175 173.252.67.137
+157.240.35.175 173.252.67.135
+157.240.32.15 173.252.67.135
+157.240.32.15 173.252.67.119
+157.240.32.15 173.252.67.9
+157.240.32.15 173.252.67.115
+157.240.32.15 173.252.67.133
+157.240.32.15 173.252.67.17
+157.240.32.15 173.252.67.125
+157.240.32.15 173.252.67.85
+157.240.32.15 173.252.67.55
+157.240.32.15 173.252.67.65
+157.240.32.15 173.252.67.59
+157.240.32.15 173.252.67.77
+157.240.32.15 173.252.67.113
+157.240.32.15 173.252.67.21
+157.240.32.15 173.252.67.109
+157.240.32.15 173.252.67.87
+157.240.32.15 173.252.67.131
+157.240.32.15 173.252.67.29
+157.240.32.15 173.252.67.73
+157.240.32.15 173.252.67.81
+157.240.32.15 173.252.67.83
+157.240.32.15 173.252.67.105
+157.240.32.15 173.252.67.7
+157.240.32.15 173.252.67.107
+157.240.32.15 173.252.67.69
+157.240.32.15 173.252.67.71
+157.240.32.15 173.252.67.53
+157.240.32.15 173.252.67.3
+157.240.32.15 173.252.67.127
+157.240.32.15 173.252.67.19
+157.240.32.15 173.252.67.25
+157.240.32.15 173.252.67.27
+157.240.32.15 173.252.67.123
+157.240.32.15 173.252.67.129
+157.240.32.15 173.252.67.15
+157.240.32.15 173.252.67.1
+157.240.32.15 173.252.67.23
+157.240.32.15 173.252.67.117
+157.240.32.15 173.252.67.5
+157.240.32.15 173.252.67.61
+157.240.32.15 173.252.67.111
+157.240.32.15 173.252.67.63
+157.240.32.15 173.252.67.139
+157.240.32.15 173.252.67.11
+157.240.32.15 173.252.67.137
+157.240.32.15 173.252.67.121
+157.240.32.15 173.252.67.31
+157.240.32.15 173.252.67.79
+157.240.32.15 173.252.67.57
+157.240.32.15 173.252.67.75
+157.240.32.15 173.252.67.67
+157.240.32.15 173.252.67.35
+157.240.32.15 173.252.67.33
+157.240.35.165 173.252.67.61
+157.240.35.165 173.252.67.59
+157.240.35.165 173.252.67.55
+157.240.35.165 173.252.67.75
+157.240.35.165 173.252.67.53
+157.240.35.165 173.252.67.79
+157.240.35.165 173.252.67.69
+157.240.35.165 173.252.67.71
+157.240.35.165 173.252.67.87
+157.240.35.165 173.252.67.77
+157.240.35.165 173.252.67.83
+157.240.35.165 173.252.67.57
+157.240.35.165 173.252.67.85
+74.119.78.13 173.252.67.71
+74.119.78.13 173.252.67.175
+74.119.78.13 173.252.67.169
+74.119.78.13 173.252.67.57
+74.119.78.13 173.252.67.183
+74.119.78.13 173.252.67.181
+74.119.78.13 173.252.67.179
+74.119.78.13 173.252.67.161
+74.119.78.13 173.252.67.177
+74.119.78.13 173.252.67.157
+74.119.78.13 173.252.67.185
+74.119.78.13 173.252.67.63
+74.119.78.13 173.252.67.167
+74.119.78.13 173.252.67.171
+74.119.78.13 173.252.67.173
+74.119.78.13 173.252.67.189
+31.13.29.131 173.252.67.157
+31.13.29.131 173.252.67.83
+31.13.29.131 173.252.67.187
+31.13.29.131 173.252.67.87
+31.13.29.131 173.252.67.33
+31.13.29.131 173.252.67.67
+31.13.29.131 173.252.67.163
+31.13.29.131 173.252.67.69
+31.13.29.131 173.252.67.23
+31.13.29.131 173.252.67.65
+31.13.29.131 173.252.67.25
+31.13.29.131 173.252.67.35
+31.13.29.131 173.252.67.7
+157.240.32.17 173.252.67.79
+157.240.32.17 173.252.67.75
+157.240.32.17 173.252.67.55
+157.240.32.17 173.252.67.107
+157.240.32.17 173.252.67.125
+157.240.32.17 173.252.67.111
+157.240.32.17 173.252.67.73
+157.240.32.17 173.252.67.119
+157.240.32.17 173.252.67.133
+157.240.32.17 173.252.67.61
+157.240.32.17 173.252.67.129
+157.240.32.17 173.252.67.105
+157.240.32.17 173.252.67.127
+157.240.32.17 173.252.67.113
+157.240.32.17 173.252.67.117
+157.240.32.17 173.252.67.115
+157.240.32.17 173.252.67.121
+157.240.32.17 173.252.67.139
+157.240.32.17 173.252.67.137
+157.240.32.17 173.252.67.131
+157.240.32.17 173.252.67.123
+157.240.32.17 173.252.67.109
+157.240.32.17 173.252.67.135
+157.240.32.13 173.252.67.67
+157.240.32.13 173.252.67.105
+157.240.32.13 173.252.67.139
+157.240.32.13 173.252.67.83
+157.240.32.13 173.252.67.111
+157.240.32.13 173.252.67.109
+157.240.32.13 173.252.67.31
+157.240.32.13 173.252.67.69
+157.240.32.13 173.252.67.127
+157.240.32.13 173.252.67.11
+157.240.32.13 173.252.67.119
+157.240.32.13 173.252.67.7
+157.240.32.13 173.252.67.133
+157.240.32.13 173.252.67.21
+157.240.32.13 173.252.67.113
+157.240.32.13 173.252.67.121
+157.240.32.13 173.252.67.117
+157.240.32.13 173.252.67.137
+157.240.32.13 173.252.67.125
+157.240.32.13 173.252.67.135
+157.240.32.13 173.252.67.123
+157.240.32.13 173.252.67.23
+157.240.32.13 173.252.67.115
+157.240.32.13 173.252.67.107
+157.240.32.13 173.252.67.131
+157.240.32.13 173.252.67.129
+157.240.32.13 173.252.67.33
+157.240.35.179 173.252.67.31
+157.240.35.179 173.252.67.11
+157.240.35.179 173.252.67.27
+157.240.35.179 173.252.67.17
+157.240.35.179 173.252.67.9
+157.240.35.179 173.252.67.15
+157.240.35.179 173.252.67.35
+157.240.35.179 173.252.67.3
+157.240.35.179 173.252.67.21
+157.240.35.179 173.252.67.25
+157.240.35.179 173.252.67.19
+157.240.35.179 173.252.67.29
+157.240.35.179 173.252.67.1
+157.240.35.179 173.252.67.33
+157.240.35.179 173.252.67.5
+157.240.35.179 173.252.67.7
+157.240.35.179 173.252.67.23
+157.240.35.181 173.252.67.67
+157.240.35.181 173.252.67.65
+157.240.35.181 173.252.67.63
+157.240.35.181 173.252.67.85
+157.240.35.181 173.252.67.57
+157.240.35.181 173.252.67.73
+157.240.35.181 173.252.67.77
+157.240.35.181 173.252.67.69
+157.240.35.181 173.252.67.75
+157.240.35.181 173.252.67.81
+157.240.35.181 173.252.67.79
+157.240.35.181 173.252.67.87
+157.240.35.189 173.252.67.77
+157.240.35.189 173.252.67.65
+157.240.35.189 173.252.67.83
+157.240.35.189 173.252.67.73
+157.240.35.189 173.252.67.61
+157.240.35.189 173.252.67.55
+157.240.35.189 173.252.67.79
+157.240.35.189 173.252.67.53
+157.240.35.189 173.252.67.67
+157.240.35.189 173.252.67.87
+157.240.35.189 173.252.67.75
+157.240.35.189 173.252.67.81
+157.240.35.189 173.252.67.71
+157.240.35.189 173.252.67.59
+157.240.35.189 173.252.67.63
+157.240.35.189 173.252.67.69
+157.240.35.189 173.252.67.85
+157.240.35.189 173.252.67.57
+157.240.35.193 173.252.67.189
+157.240.35.193 173.252.67.157
+157.240.35.193 173.252.67.175
+157.240.35.193 173.252.67.187
+157.240.35.193 173.252.67.159
+157.240.35.193 173.252.67.191
+157.240.35.193 173.252.67.165
+157.240.35.193 173.252.67.161
+157.240.35.193 173.252.67.185
+157.240.35.193 173.252.67.177
+157.240.35.193 173.252.67.167
+157.240.35.193 173.252.67.169
+157.240.35.193 173.252.67.181
+157.240.35.193 173.252.67.171
+157.240.35.193 173.252.67.179
+157.240.32.19 173.252.67.21
+157.240.32.19 173.252.67.165
+157.240.32.19 173.252.67.17
+157.240.32.19 173.252.67.171
+157.240.32.19 173.252.67.163
+157.240.32.19 173.252.67.35
+157.240.32.19 173.252.67.181
+157.240.32.19 173.252.67.3
+157.240.32.19 173.252.67.187
+157.240.32.19 173.252.67.7
+157.240.32.19 173.252.67.1
+157.240.32.19 173.252.67.31
+157.240.32.19 173.252.67.175
+157.240.32.19 173.252.67.11
+157.240.32.19 173.252.67.19
+157.240.32.19 173.252.67.15
+157.240.32.19 173.252.67.191
+157.240.32.19 173.252.67.157
+157.240.32.19 173.252.67.173
+157.240.32.19 173.252.67.5
+157.240.32.19 173.252.67.27
+157.240.32.19 173.252.67.183
+157.240.32.19 173.252.67.9
+157.240.32.19 173.252.67.23
+157.240.32.19 173.252.67.29
+157.240.32.19 173.252.67.159
+157.240.32.19 173.252.67.189
+157.240.32.19 173.252.67.33
+157.240.32.19 173.252.67.161
+157.240.32.19 173.252.67.25
+157.240.35.157 173.252.67.65
+157.240.35.157 173.252.67.81
+157.240.35.157 173.252.67.71
+157.240.35.157 173.252.67.63
+157.240.35.157 173.252.67.73
+157.240.35.157 173.252.67.67
+157.240.35.157 173.252.67.85
+157.240.35.157 173.252.67.83
+157.240.35.157 173.252.67.79
+157.240.35.157 173.252.67.75
+157.240.35.157 173.252.67.55
+157.240.35.157 173.252.67.87
+157.240.35.157 173.252.67.69
+157.240.35.157 173.252.67.61
+157.240.35.157 173.252.67.59
+157.240.35.157 173.252.67.77
+157.240.35.157 173.252.67.53
+157.240.35.157 173.252.67.57
+74.119.78.7 173.252.67.109
+74.119.78.7 173.252.67.3
+74.119.78.7 173.252.67.25
+74.119.78.7 173.252.67.19
+74.119.78.7 173.252.67.123
+74.119.78.7 173.252.67.105
+74.119.78.7 173.252.67.111
+74.119.78.7 173.252.67.127
+74.119.78.7 173.252.67.117
+74.119.78.7 173.252.67.133
+74.119.78.7 173.252.67.11
+74.119.78.7 173.252.67.125
+74.119.78.7 173.252.67.27
+74.119.78.7 173.252.67.131
+74.119.78.7 173.252.67.137
+74.119.78.7 173.252.67.135
+74.119.78.7 173.252.67.5
+74.119.78.7 173.252.67.115
+74.119.78.7 173.252.67.35
+74.119.78.7 173.252.67.33
+74.119.78.7 173.252.67.129
+74.119.78.7 173.252.67.7
+74.119.78.7 173.252.67.121
+74.119.78.7 173.252.67.139
+74.119.78.7 173.252.67.9
+74.119.78.7 173.252.67.21
+74.119.78.7 173.252.67.31
+74.119.78.7 173.252.67.113
+74.119.78.7 173.252.67.1
+74.119.78.7 173.252.67.119
+74.119.78.7 173.252.67.107
+74.119.78.7 173.252.67.23
+74.119.78.7 173.252.67.29
+74.119.78.7 173.252.67.15
+157.240.35.153 173.252.67.165
+157.240.35.153 173.252.67.163
+157.240.35.153 173.252.67.191
+157.240.35.153 173.252.67.179
+157.240.35.153 173.252.67.187
+157.240.35.153 173.252.67.157
+157.240.35.153 173.252.67.159
+157.240.35.153 173.252.67.189
+157.240.35.153 173.252.67.173
+157.240.35.153 173.252.67.185
+157.240.35.153 173.252.67.177
+157.240.35.153 173.252.67.167
+157.240.35.153 173.252.67.171
+157.240.35.153 173.252.67.169
+157.240.35.153 173.252.67.181
+157.240.35.153 173.252.67.183
+157.240.35.153 173.252.67.175
+157.240.35.153 173.252.67.161
+157.240.35.163 173.252.67.31
+157.240.35.163 173.252.67.23
+157.240.35.163 173.252.67.21
+157.240.35.163 173.252.67.5
+157.240.35.163 173.252.67.27
+157.240.35.163 173.252.67.11
+157.240.35.163 173.252.67.15
+157.240.35.163 173.252.67.9
+157.240.35.163 173.252.67.19
+157.240.35.163 173.252.67.17
+157.240.35.163 173.252.67.1
+157.240.35.163 173.252.67.25
+157.240.35.163 173.252.67.7
+157.240.35.163 173.252.67.3
+157.240.35.163 173.252.67.29
+157.240.35.163 173.252.67.35
+157.240.35.163 173.252.67.33
+31.13.29.247 173.252.67.67
+31.13.29.247 173.252.67.173
+31.13.29.247 173.252.67.75
+31.13.29.247 173.252.67.11
+31.13.29.247 173.252.67.33
+31.13.29.247 173.252.67.57
+31.13.29.247 173.252.67.35
+31.13.29.247 173.252.67.23
+31.13.29.247 173.252.67.185
+31.13.29.247 173.252.67.25
+31.13.29.247 173.252.67.19
+31.13.29.247 173.252.67.21
+31.13.29.247 173.252.67.71
+31.13.29.247 173.252.67.59
+31.13.29.247 173.252.67.79
+31.13.29.247 173.252.67.157
+31.13.29.247 173.252.67.3
+31.13.29.247 173.252.67.63
+31.13.29.247 173.252.67.69
+31.13.29.247 173.252.67.61
+31.13.29.247 173.252.67.1
+31.13.29.247 173.252.67.17
+31.13.29.247 173.252.67.85
+31.13.29.247 173.252.67.81
+31.13.29.247 173.252.67.15
+31.13.29.247 173.252.67.5
+31.13.29.247 173.252.67.27
+31.13.29.247 173.252.67.87
+31.13.29.247 173.252.67.7
+31.13.29.247 173.252.67.29
+31.13.29.247 173.252.67.31
+31.13.29.247 173.252.67.83
+31.13.29.247 173.252.67.65
+31.13.29.247 173.252.67.53
+31.13.29.247 173.252.67.77
+31.13.29.247 173.252.67.73
+31.13.29.247 173.252.67.175
+31.13.29.247 173.252.67.183
+31.13.29.247 173.252.67.161
+31.13.29.247 173.252.67.9
+157.240.35.173 173.252.67.79
+157.240.35.173 173.252.67.69
+157.240.35.173 173.252.67.73
+157.240.35.173 173.252.67.59
+157.240.35.173 173.252.67.75
+157.240.35.173 173.252.67.81
+157.240.35.173 173.252.67.55
+157.240.35.173 173.252.67.57
+157.240.35.173 173.252.67.77
+157.240.35.173 173.252.67.61
+157.240.35.173 173.252.67.65
+157.240.35.173 173.252.67.83
+157.240.35.173 173.252.67.87
+157.240.35.173 173.252.67.53
+157.240.35.173 173.252.67.63
+157.240.35.173 173.252.67.85
+157.240.35.173 173.252.67.71
+157.240.35.173 173.252.67.67
+157.240.35.171 173.252.67.33
+157.240.35.171 173.252.67.35
+157.240.35.171 173.252.67.29
+157.240.35.171 173.252.67.7
+157.240.35.171 173.252.67.25
+157.240.35.171 173.252.67.11
+157.240.35.171 173.252.67.23
+157.240.35.171 173.252.67.31
+157.240.35.171 173.252.67.17
+157.240.35.171 173.252.67.3
+157.240.35.171 173.252.67.1
+157.240.35.171 173.252.67.9
+157.240.35.171 173.252.67.27
+157.240.35.171 173.252.67.5
+157.240.35.171 173.252.67.21
+157.240.35.171 173.252.67.15
+157.240.35.171 173.252.67.19
+157.240.35.183 173.252.67.109
+157.240.35.183 173.252.67.119
+157.240.35.183 173.252.67.135
+157.240.35.183 173.252.67.121
+157.240.35.183 173.252.67.111
+157.240.35.183 173.252.67.127
+157.240.35.183 173.252.67.139
+157.240.35.183 173.252.67.105
+157.240.35.183 173.252.67.129
+157.240.35.183 173.252.67.125
+157.240.35.183 173.252.67.137
+157.240.35.183 173.252.67.123
+157.240.35.183 173.252.67.115
+157.240.35.183 173.252.67.117
+157.240.35.183 173.252.67.113
+157.240.35.183 173.252.67.107
+157.240.35.183 173.252.67.133
+157.240.35.183 173.252.67.131
+157.240.35.147 173.252.67.29
+157.240.35.147 173.252.67.17
+157.240.35.147 173.252.67.3
+157.240.35.147 173.252.67.11
+157.240.35.147 173.252.67.27
+157.240.35.147 173.252.67.7
+157.240.35.147 173.252.67.25
+157.240.35.147 173.252.67.35
+157.240.35.147 173.252.67.9
+157.240.35.147 173.252.67.23
+157.240.35.147 173.252.67.1
+157.240.35.147 173.252.67.33
+157.240.35.147 173.252.67.21
+157.240.35.147 173.252.67.5
+157.240.35.147 173.252.67.19
+157.240.35.147 173.252.67.15
+157.240.35.147 173.252.67.31
+157.240.35.187 173.252.67.17
+157.240.35.187 173.252.67.1
+157.240.35.187 173.252.67.21
+157.240.35.187 173.252.67.33
+157.240.35.187 173.252.67.23
+157.240.35.187 173.252.67.25
+157.240.35.187 173.252.67.29
+157.240.35.187 173.252.67.5
+157.240.35.187 173.252.67.9
+157.240.35.187 173.252.67.19
+157.240.35.187 173.252.67.31
+157.240.35.187 173.252.67.15
+157.240.35.187 173.252.67.11
+157.240.35.187 173.252.67.3
+157.240.35.187 173.252.67.35
+157.240.35.187 173.252.67.27
+157.240.35.187 173.252.67.7
+157.240.35.185 173.252.67.185
+157.240.35.185 173.252.67.179
+157.240.35.185 173.252.67.191
+157.240.35.185 173.252.67.175
+157.240.35.185 173.252.67.161
+157.240.35.185 173.252.67.157
+157.240.35.185 173.252.67.165
+157.240.35.185 173.252.67.181
+157.240.35.185 173.252.67.167
+157.240.35.185 173.252.67.159
+157.240.35.185 173.252.67.173
+157.240.35.185 173.252.67.183
+157.240.35.185 173.252.67.187
+157.240.35.185 173.252.67.169
+157.240.35.185 173.252.67.177
+157.240.35.185 173.252.67.163
+157.240.35.185 173.252.67.171
+157.240.35.185 173.252.67.189
+157.240.35.191 173.252.67.121
+157.240.35.191 173.252.67.115
+157.240.35.191 173.252.67.117
+157.240.35.191 173.252.67.133
+157.240.35.191 173.252.67.113
+157.240.35.191 173.252.67.109
+157.240.35.191 173.252.67.125
+157.240.35.191 173.252.67.105
+157.240.35.191 173.252.67.107
+157.240.35.191 173.252.67.129
+157.240.35.191 173.252.67.123
+157.240.35.191 173.252.67.137
+157.240.35.191 173.252.67.139
+157.240.35.191 173.252.67.111
+157.240.35.191 173.252.67.127
+157.240.35.191 173.252.67.131
+157.240.35.191 173.252.67.119
+157.240.35.191 173.252.67.135
+173.252.67.135 127.1.1.6
+173.252.67.119 127.1.1.6
+173.252.67.9 127.1.1.6
+173.252.67.115 127.1.1.6
+173.252.67.133 127.1.1.6
+173.252.67.17 127.1.1.6
+173.252.67.71 127.1.1.6
+173.252.67.175 127.1.1.6
+173.252.67.169 127.1.1.6
+173.252.67.157 127.1.1.6
+173.252.67.83 127.1.1.6
+173.252.67.187 127.1.1.6
+173.252.67.87 127.1.1.6
+173.252.67.79 127.1.1.6
+173.252.67.75 127.1.1.6
+173.252.67.55 127.1.1.6
+173.252.67.107 127.1.1.6
+173.252.67.125 127.1.1.6
+173.252.67.111 127.1.1.6
+173.252.67.67 127.1.1.6
+173.252.67.105 127.1.1.6
+173.252.67.139 127.1.1.6
+173.252.67.109 127.1.1.6
+173.252.67.31 127.1.1.6
+173.252.67.21 127.1.1.6
+173.252.67.165 127.1.1.6
+173.252.67.171 127.1.1.6
+173.252.67.163 127.1.1.6
+173.252.67.35 127.1.1.6
+173.252.67.3 127.1.1.6
+173.252.67.25 127.1.1.6
+173.252.67.19 127.1.1.6
+173.252.67.123 127.1.1.6
+173.252.67.173 127.1.1.6
+173.252.67.129 127.1.1.6
+173.252.67.33 127.1.1.6
+173.252.67.15 127.1.1.6
+173.252.67.1 127.1.1.6
+173.252.67.137 127.1.1.6
+173.252.67.117 127.1.1.6
+173.252.67.177 127.1.1.6
+173.252.67.183 127.1.1.6
+173.252.67.191 127.1.1.6
+173.252.67.61 127.1.1.6
+173.252.67.81 127.1.1.6
+173.252.67.59 127.1.1.6
+173.252.67.57 127.1.1.6
+173.252.67.69 127.1.1.6
+173.252.67.73 127.1.1.6
+173.252.67.85 127.1.1.6
+173.252.67.65 127.1.1.6
+173.252.67.179 127.1.1.6
+173.252.67.159 127.1.1.6
+173.252.67.29 127.1.1.6
+173.252.67.63 127.1.1.6
+173.252.67.127 127.1.1.6
+173.252.67.181 127.1.1.6
+173.252.67.161 127.1.1.6
+173.252.67.185 127.1.1.6
+173.252.67.121 127.1.1.6
+173.252.67.53 127.1.1.6
+173.252.67.23 127.1.1.6
+173.252.67.5 127.1.1.6
+173.252.67.27 127.1.1.6
+173.252.67.11 127.1.1.6
+173.252.67.7 127.1.1.6
+173.252.67.189 127.1.1.6
+173.252.67.113 127.1.1.6
+173.252.67.77 127.1.1.6
+173.252.67.167 127.1.1.6
+173.252.67.131 127.1.1.6
diff --git a/tests/fakenet/data/pl2.prakinf.tu-ilmenau.de_83.167.65.184_2018-03-01 12_36_21.748576+01_00 b/tests/fakenet/data/pl2.prakinf.tu-ilmenau.de_83.167.65.184_2018-03-01 12_36_21.748576+01_00
new file mode 100644
index 0000000..aa58fa2
--- /dev/null
+++ b/tests/fakenet/data/pl2.prakinf.tu-ilmenau.de_83.167.65.184_2018-03-01 12_36_21.748576+01_00
@@ -0,0 +1,69 @@
+127.0.0.1 192.168.1.1
+192.168.1.1 141.24.249.141
+141.24.249.141 141.24.254.22
+141.24.254.22 141.24.254.21
+141.24.254.21 188.1.238.1
+188.1.238.1 188.1.144.222
+188.1.144.222 213.248.97.40
+213.248.97.40 62.115.141.226
+213.248.97.40 62.115.142.34
+213.248.97.40 62.115.140.6
+213.248.97.40 62.115.142.12
+213.248.97.40 62.115.142.18
+213.248.97.40 62.115.142.32
+213.248.97.40 62.115.140.16
+213.248.97.40 62.115.140.18
+213.248.97.40 62.115.142.20
+213.248.97.40 62.115.142.22
+213.248.97.40 62.115.142.2
+213.248.97.40 62.115.142.16
+213.248.97.40 62.115.142.14
+213.248.97.40 62.115.142.6
+213.248.97.40 62.115.142.4
+213.248.97.40 62.115.142.24
+213.248.97.40 62.115.142.0
+213.248.97.40 62.115.142.30
+213.248.97.40 62.115.141.224
+213.248.97.40 62.115.142.10
+213.248.97.40 62.115.141.230
+213.248.97.40 62.115.142.28
+213.248.97.40 62.115.142.26
+213.248.97.40 62.115.141.228
+213.248.97.40 62.115.140.20
+213.248.97.40 62.115.140.14
+213.248.97.40 62.115.142.8
+213.248.97.40 62.115.141.232
+62.115.141.226 62.115.119.185
+62.115.142.34 62.115.119.185
+62.115.140.6 62.115.119.185
+62.115.142.12 62.115.119.185
+62.115.142.18 62.115.119.185
+62.115.142.32 62.115.119.185
+62.115.140.16 62.115.119.185
+62.115.140.18 62.115.119.185
+62.115.142.20 62.115.119.185
+62.115.142.22 62.115.119.185
+62.115.142.2 62.115.119.185
+62.115.142.16 62.115.119.185
+62.115.142.14 62.115.119.185
+62.115.142.6 62.115.119.185
+62.115.142.4 62.115.119.185
+62.115.142.24 62.115.119.185
+62.115.142.0 62.115.119.185
+62.115.142.30 62.115.119.185
+62.115.141.224 62.115.119.185
+62.115.142.10 62.115.119.185
+62.115.141.230 62.115.119.185
+62.115.142.28 62.115.119.185
+62.115.142.26 62.115.119.185
+62.115.141.228 62.115.119.185
+62.115.140.20 62.115.119.185
+62.115.140.14 62.115.119.185
+62.115.142.8 62.115.119.185
+62.115.141.232 62.115.119.185
+62.115.119.185 31.28.19.50
+31.28.19.50 91.135.147.214
+91.135.147.214 83.167.66.69
+83.167.66.69 83.167.65.161
+83.167.65.161 83.167.65.162
+83.167.65.162 127.1.1.6
diff --git a/tests/fakenet/data/planetlab-2.cs.ucy.ac.cy_113.32.238.1_2018-05-17 11_26_19.047265+01_00 b/tests/fakenet/data/planetlab-2.cs.ucy.ac.cy_113.32.238.1_2018-05-17 11_26_19.047265+01_00
new file mode 100755
index 0000000..d93b0ec
--- /dev/null
+++ b/tests/fakenet/data/planetlab-2.cs.ucy.ac.cy_113.32.238.1_2018-05-17 11_26_19.047265+01_00
@@ -0,0 +1,59 @@
+127.0.0.1 194.42.17.190
+194.42.17.190 194.42.17.78
+194.42.17.78 194.42.0.113
+194.42.0.113 194.42.0.42
+194.42.0.42 194.42.13.150
+194.42.13.150 82.116.192.190
+82.116.192.190 83.97.88.45
+83.97.88.45 149.6.42.73
+149.6.42.73 130.117.0.1
+149.6.42.73 130.117.1.118
+130.117.0.1 130.117.0.121
+130.117.1.118 130.117.0.141
+130.117.0.121 154.54.77.246
+130.117.0.141 154.54.58.69
+154.54.77.246 154.54.44.162
+154.54.58.69 154.54.44.166
+154.54.44.162 154.54.41.205
+154.54.44.166 154.54.42.89
+154.54.41.205 154.54.31.225
+154.54.42.89 154.54.31.233
+154.54.31.225 154.54.6.221
+154.54.31.233 154.54.7.129
+154.54.6.221 154.54.42.165
+154.54.7.129 154.54.44.169
+154.54.42.165 154.54.5.89
+154.54.44.169 154.54.31.89
+154.54.5.89 154.54.41.145
+154.54.31.89 154.54.42.97
+154.54.41.145 154.54.2.197
+154.54.42.97 154.54.2.197
+154.54.2.197 154.54.84.30
+154.54.2.197 154.54.84.153
+154.54.84.30 154.24.5.246
+154.54.84.153 154.24.15.138
+154.24.5.246 154.18.0.106
+154.24.15.138 154.18.0.106
+154.18.0.106 61.122.116.1
+154.18.0.106 61.122.116.17
+61.122.116.1 221.240.51.34
+61.122.116.1 221.240.51.42
+61.122.116.1 58.159.223.34
+61.122.116.17 221.240.51.38
+61.122.116.17 221.240.51.46
+221.240.51.34 221.112.16.150
+221.240.51.34 221.112.16.178
+221.240.51.38 221.112.16.154
+221.240.51.38 221.112.16.182
+221.240.51.42 221.112.16.182
+221.240.51.42 221.112.16.154
+221.240.51.46 221.112.16.178
+221.240.51.46 221.112.16.150
+221.112.16.150 221.112.1.54
+221.112.16.154 221.112.1.50
+221.112.16.178 221.112.1.50
+221.112.16.182 221.112.1.54
+221.112.1.54 127.1.1.6
+221.112.1.50 127.1.1.6
+58.159.223.34 221.112.16.154
+58.159.223.34 221.112.16.182
diff --git a/tests/fakenet/data/ple1.cesnet.cz_203.195.189.3 b/tests/fakenet/data/ple1.cesnet.cz_203.195.189.3
new file mode 100644
index 0000000..a57ba2c
--- /dev/null
+++ b/tests/fakenet/data/ple1.cesnet.cz_203.195.189.3
@@ -0,0 +1,40 @@
+127.0.0.1 192.168.0.1
+192.168.0.1 195.113.161.1
+195.113.161.1 195.22.215.228
+195.22.215.228 195.22.206.148
+195.22.215.228 195.22.206.200
+195.22.206.148 195.22.206.170
+195.22.206.200 195.22.206.170
+195.22.206.170 202.97.51.157
+202.97.51.157 202.97.94.89
+202.97.94.89 202.97.94.133
+202.97.94.89 202.97.94.125
+202.97.94.89 202.97.94.121
+202.97.94.89 202.97.94.129
+202.97.94.133 113.108.208.2
+202.97.94.125 113.108.208.222
+202.97.94.121 113.108.208.222
+202.97.94.129 113.108.208.2
+113.108.208.2 113.108.209.54
+113.108.208.222 183.60.112.10
+183.60.112.10 113.108.236.222
+183.60.112.10 121.14.60.130
+183.60.112.10 121.14.60.122
+183.60.112.10 14.119.117.138
+183.60.112.10 14.119.117.142
+113.108.209.54 121.14.60.126
+113.108.209.54 14.119.117.134
+113.108.209.54 14.119.117.130
+113.108.209.54 121.14.60.118
+113.108.209.54 113.108.236.218
+113.108.236.222 8.8.8.8
+121.14.60.130 8.8.8.8
+121.14.60.122 8.8.8.8
+121.14.60.126 8.8.8.8
+14.119.117.138 8.8.8.8
+14.119.117.134 8.8.8.8
+14.119.117.130 8.8.8.8
+121.14.60.118 8.8.8.8
+14.119.117.142 8.8.8.8
+113.108.236.218 8.8.8.8
+8.8.8.8 127.1.1.6
diff --git a/tests/fakenet/data/puri.mimuw.edu.pl_103.37.81.246_2018-02-08 12_38_30.754221+01_00 b/tests/fakenet/data/puri.mimuw.edu.pl_103.37.81.246_2018-02-08 12_38_30.754221+01_00
new file mode 100644
index 0000000..2d0174f
--- /dev/null
+++ b/tests/fakenet/data/puri.mimuw.edu.pl_103.37.81.246_2018-02-08 12_38_30.754221+01_00
@@ -0,0 +1,80 @@
+127.0.0.1 192.168.1.1
+192.168.1.1 193.0.109.1
+193.0.109.1 193.0.103.1
+193.0.103.1 193.0.103.19
+193.0.103.19 212.191.224.33
+212.191.224.33 109.105.98.124
+109.105.98.124 109.105.97.64
+109.105.98.124 109.105.97.139
+109.105.97.64 198.32.160.223
+109.105.97.139 198.32.160.223
+198.32.160.223 182.79.176.60
+198.32.160.223 182.79.205.144
+198.32.160.223 182.79.181.77
+198.32.160.223 182.79.176.62
+198.32.160.223 182.79.181.85
+198.32.160.223 182.79.181.221
+198.32.160.223 182.79.181.225
+198.32.160.223 182.79.181.229
+198.32.160.223 182.79.176.142
+198.32.160.223 182.79.176.58
+198.32.160.223 182.79.177.127
+198.32.160.223 182.79.181.231
+198.32.160.223 182.79.191.90
+198.32.160.223 182.79.181.219
+198.32.160.223 182.79.176.140
+198.32.160.223 182.79.176.46
+198.32.160.223 182.79.181.71
+198.32.160.223 182.79.181.223
+198.32.160.223 182.79.208.138
+198.32.160.223 182.79.181.253
+198.32.160.223 182.79.181.73
+198.32.160.223 182.79.181.75
+198.32.160.223 182.79.181.227
+198.32.160.223 182.79.181.81
+198.32.160.223 182.79.208.136
+198.32.160.223 182.79.181.83
+198.32.160.223 182.79.205.146
+198.32.160.223 182.79.181.79
+198.32.160.223 182.79.176.56
+198.32.160.223 182.79.177.129
+198.32.160.223 182.79.181.255
+198.32.160.223 182.79.191.82
+198.32.160.223 182.79.181.233
+198.32.160.223 182.79.176.44
+182.79.176.60 182.76.113.18
+182.79.205.144 182.76.113.18
+182.79.181.77 182.76.113.18
+182.79.176.62 182.76.113.18
+182.79.181.85 182.76.113.18
+182.79.181.221 182.76.113.18
+182.79.181.225 182.76.113.18
+182.79.181.229 182.76.113.18
+182.79.176.142 182.76.113.18
+182.79.176.58 182.76.113.18
+182.79.177.127 182.76.113.18
+182.79.181.231 182.76.113.18
+182.79.191.90 182.76.113.18
+182.79.181.219 182.76.113.18
+182.79.176.140 182.76.113.18
+182.79.176.46 182.76.113.18
+182.79.181.71 182.76.113.18
+182.79.181.223 182.76.113.18
+182.79.208.138 182.76.113.18
+182.79.181.253 182.76.113.18
+182.79.181.73 182.76.113.18
+182.79.181.75 182.76.113.18
+182.79.181.227 182.76.113.18
+182.79.181.81 182.76.113.18
+182.79.208.136 182.76.113.18
+182.79.181.83 182.76.113.18
+182.79.205.146 182.76.113.18
+182.79.181.79 182.76.113.18
+182.79.176.56 182.76.113.18
+182.79.177.129 182.76.113.18
+182.79.181.255 182.76.113.18
+182.79.191.82 182.76.113.18
+182.79.181.233 182.76.113.18
+182.79.176.44 182.76.113.18
+182.76.113.18 103.37.83.226
+103.37.83.226 127.1.1.6
diff --git a/tests/fakenet/data/sample_net.txt b/tests/fakenet/data/sample_net.txt
new file mode 100644
index 0000000..1cb97f9
--- /dev/null
+++ b/tests/fakenet/data/sample_net.txt
@@ -0,0 +1,22 @@
+#-----------------------------------------
+# a sample network architecture
+#-----------------------------------------
+# 1.2---1.3---1.4
+# / / \
+# / / \
+# 0.1---0.2---0.3---0.4--0.5
+#-----------------------------------------
+
+10.0.0.1 10.0.0.2
+10.0.0.2 10.0.0.3
+10.0.0.3 10.0.0.4
+10.0.0.4 10.0.0.5
+
+
+10.0.0.1 10.0.1.2
+10.0.1.2 10.0.1.3
+
+# 10.0.0.2 10.0.1.3
+
+10.0.1.3 10.0.1.4
+10.0.1.4 10.0.0.5
diff --git a/tests/fakenet/fakenet.py b/tests/fakenet/fakenet.py
new file mode 100644
index 0000000..cddc5ef
--- /dev/null
+++ b/tests/fakenet/fakenet.py
@@ -0,0 +1,348 @@
+from __future__ import annotations
+from dataclasses import dataclass
+import xxhash
+import random
+
+import networkx as nx
+from ipaddress import ip_address
+from pycaracal import Probe, Reply
+
+
+# A graph that represents a network topology
+# where nodes are routers and edges existing links.
+# Nodes can have multiple outgoing edges, representing multiple interfaces.
+# Edges are not weighted.
+# The topology is loaded from a text file with two IPs per line, separated by a space.
+
+
+class FakeNet(nx.DiGraph):
+ """
+ A fake network topology that emulates a network graph.
+ The graph is a directed graph with a start and end node.
+ The class includes various methods to generate fake network topologies.
+ One can generate:
+ - a meshed topology with a given topology list
+ - a random graph with a given edge probability and depth
+ - a network with multiple single paths
+ - a network from a file
+ """
+
+ DEFAULT_START = "4.4.4.4"
+ DEFAULT_END = "44.44.44.44"
+
+ def __init__(self):
+ super().__init__()
+ self.start = None
+ self.end = None
+
+ @classmethod
+ def meshed(cls, topology: list[int]) -> FakeNet:
+ # each value in the topology list represents the number of nodes at that ttl
+ # the first value is the number of nodes at ttl 1
+ # the second value is the number of nodes at ttl 2, etc.
+ net = FakeNet()
+ routers = [
+ [f"192.{ttl+1}.{i}.0" for i in range(n)] for ttl, n in enumerate(topology)
+ ]
+ net.start = FakeNet.DEFAULT_START
+ net.end = FakeNet.DEFAULT_END
+ for ttl in range(len(topology) - 1):
+ for i in range(topology[ttl]):
+ for j in range(topology[ttl + 1]):
+ net.add_edge(f"192.{ttl+1}.{i}.0", f"192.{ttl+2}.{j}.0")
+
+ for dest in routers[0]:
+ net.add_edge(net.start, dest)
+ for dest in routers[-1]:
+ net.add_edge(dest, net.end)
+
+ return net
+
+ @classmethod
+ def multi_single_paths(cls, n_paths: int, path_length: int) -> FakeNet:
+ # create a network with n_paths paths of length path_length
+ net = FakeNet()
+ net.start = FakeNet.DEFAULT_START
+ net.end = FakeNet.DEFAULT_END
+ for i in range(n_paths):
+ net.add_edge(net.start, f"192.{i}.0.0")
+ for j in range(0, path_length):
+ start = f"192.{i}.{j}.0"
+ dest = f"192.{i}.{j+1}.0"
+ net.add_edge(start, dest)
+ net.add_edge(dest, net.end)
+ return net
+
+ @classmethod
+ def from_file(cls, filepath: str) -> FakeNet:
+ """
+ Create a network topology from a file.
+ The file should contain two IP addresses per line, separated by a space.
+ Comments are allowed and start with a #.
+ The graph is a directed graph with a start and end node.
+ The start node is the first node in a topological sort; the end node is the last node.
+ """
+ net = FakeNet()
+ # open the file and add edges
+ with open(filepath) as f:
+ for i, line in enumerate(f.readlines()):
+ line = line.strip()
+ # we skip empty lines and comments
+ if line and not line.startswith("#"):
+ try:
+ (start, end) = line.split(" ", maxsplit=1)
+ # We still try to validate the IP addresses
+ _, _ = ip_address(start), ip_address(end)
+ net.add_edge(start, end)
+ except ValueError as e:
+ raise ValueError(f"Error on line {i+1} in file {filepath}: {e}")
+ # set start to the single node in the graph with no incoming edges
+ # i.e. the first node in a topological sort
+ net.start = next(iter(nx.topological_sort(net)))
+ # set end to the single node in the graph with no outgoing edges
+ # i.e. the last node in a topological sort
+ net.end = list(nx.topological_sort(net))[-1]
+ return net
+
+ @classmethod
+ def random_graph(cls, p_edge: float, depth: int, seed: int = 0) -> FakeNet:
+ """
+ Generate a random graph with a given edge probability and depth (number of ttl levels)
+ The graph is a directed graph with a start and end node
+ The start node is connected to all nodes at ttl 1
+ The end node is connected to all nodes at last ttl
+ :param p_edge: probability of an edge existing between two nodes
+ :param depth: number of ttl levels
+ :return: a FakeNet instance
+ """
+ # we seed the random number generator to get reproducible results
+ random.seed(seed)
+
+ # TODO: parametrize the topology generation
+ # generate a random topology with a random number of nodes at each ttl
+ # the first value is the number of nodes at ttl 1, the second value at ttl 2, etc.
+ # the topology is generated by picking a random number of nodes between 1 and 5,
+ # with a bias toward 1 (2/3 of values will be 1)
+
+ topology = [max(random.randint(-3, 6), 1) for _ in range(depth)]
+
+ # generate a list of routers IPs for each ttl
+ # routers = [ [list of routers at ttl 1], [list of routers at ttl 2], ...]
+ routers = [
+ [f"192.{ttl+1}.{i}.0" for i in range(n)] for ttl, n in enumerate(topology)
+ ]
+
+ random_graph = nx.DiGraph()
+
+ for ttl in range(len(topology) - 1):
+ for i, src in enumerate(routers[ttl]):
+ for j, dst in enumerate(routers[ttl + 1]):
+ # we always add an edge between the first nodes at each ttl
+ # this is to ensure that the end node is reachable from the start node
+ if i == 0 and j == 0:
+ random_graph.add_edge(src, dst)
+ elif random.random() < p_edge:
+ random_graph.add_edge(src, dst)
+ start = FakeNet.DEFAULT_START
+ end = FakeNet.DEFAULT_END
+ for dst in routers[0]:
+ random_graph.add_edge(start, dst)
+ for src in routers[-1]:
+ random_graph.add_edge(src, end)
+
+ # filter edges such that all nodes are reachable from the start node
+ # and the end node is reachable from all nodes
+ random_graph = nx.DiGraph(
+ [
+ (u, v)
+ for (u, v) in random_graph.edges()
+ if nx.has_path(random_graph, start, u)
+ and nx.has_path(random_graph, v, end)
+ ]
+ )
+ # TODO: add logging
+
+ net = FakeNet()
+ net.start = start
+ net.end = end
+ net.add_edges_from(random_graph.edges())
+
+ return net
+
+
+class FakeProber:
+ """
+ A fake prober that generates fake replies for a given list of probes.
+ It aims to emulate the prober part (caracal) of the fast_mda_traceroute tool.
+ It is initialized with a network topology and a seed.
+ The `probe` method simulates the network traversal of the probes and returns a list of replies.
+ The seed parameter is used to generate random paths for the probes, based on the probe's attributes.
+ """
+
+ def __init__(self, net: FakeNet, seed: int = 0):
+ """
+ Initialize the prober with a network topology and a seed.
+ :param net: a FakeNet instance
+ :param seed: an integer seed
+ """
+ self.net = net
+ self.seed = seed
+
+ @classmethod
+ def flow_id(cls, probe: Probe, local_seed: int) -> int:
+ """
+ Generate a unique identifier for a flow based on the probe attributes and a local seed.
+ It uses the following attributes of the probe:
+ - dst_addr
+ - src_port
+ - protocol
+ - dst_port
+ The xxhash algorithm is used to generate the hash.
+
+ :param probe: a Probe instance
+ :param local_seed: an integer seed
+ """
+ # select the probe attributes that uniquely identify a flow
+ attributes = (
+ probe.dst_addr,
+ probe.src_port,
+ probe.protocol,
+ probe.dst_port,
+ )
+ # use a fast hash
+ return xxhash.xxh32(str(attributes).encode(), seed=local_seed).intdigest()
+
+ def node_seed(self, node_id: str) -> int:
+ """
+ Generate a unique seed for a node based on its id.
+ Nodes are routers in the network topology.
+ The hash is computed using the xxhash algorithm.
+ The prober's seed is used as a seed for the hash.
+ :param node_id: a string representing the node
+ """
+ # use a fast hash
+ return xxhash.xxh32(node_id.encode(), seed=self.seed).intdigest()
+
+ def probe(self, probes: list[Probe]) -> list[Reply]:
+ """
+ Simulate the network traversal of the probes and generate fake replies.
+ Replies can be ICMP time exceeded or ICMP echo replies.
+ :param probes: a list of Probe instances
+
+ :return: a list of Reply instances
+ """
+ replies = []
+ for probe in probes:
+ # walks the graph from the start node to the probe's destination
+ # monitors the ttl and returns a reply when the destination is reached or the ttl is exceeded
+ # a random path is chosen using the id of the flow modulo the number of successors of the current node
+ dst = probe.dst_addr
+ ttl = probe.ttl
+ current = self.net.start
+ while ttl > 0 and current != dst:
+ succ = list(self.net.successors(current))
+
+ # fetch a unique identifier for the current node
+ local_seed = self.node_seed(current)
+ # from the probe attributes and the current node's hash, get a unique identifier for the flow
+ flow_id = FakeProber.flow_id(probe, local_seed=local_seed)
+
+ # select the successor based on the flow id
+ current = succ[flow_id % len(succ)]
+ ttl -= 1
+ if ttl == 0:
+ replies.append(FakeReply.icmp_time_exceeded_reply(current, probe))
+ else:
+ replies.append(FakeReply.icmp_echo_reply(current, probe))
+
+ return replies
+
+
+@dataclass(frozen=True)
+class FakeReply:
+ """
+ A fake reply that emulates the replies generated by the prober.
+ The class provides two class methods to generate ICMP time exceeded and ICMP echo replies.
+ """
+
+ # a fake reply that has the following:
+ probe_protocol: str
+ probe_dst_addr: str
+ probe_src_port: int
+ probe_dst_port: int
+ probe_ttl: int
+ reply_ttl: int
+ reply_src_addr: str
+ reply_icmp_type: int
+ reply_icmp_code: int
+ reply_id: int
+ quoted_ttl: int
+ capture_timestamp: int
+ rtt: int
+
+ @property
+ def time_exceeded(self):
+ # This method is used by the DiamondMiner class to filter time exceeded replies
+ return self.reply_icmp_type == 11
+
+ @property
+ def echo_reply(self):
+ # This method is used by the DiamondMiner class to filter echo replies
+ return self.reply_icmp_type == 0
+
+ @classmethod
+ def icmp_time_exceeded_reply(cls, src: int, probe: Probe) -> FakeReply:
+ """
+ Generate a fake ICMP time exceeded reply for a given probe.
+ The probe's TTL is normally embedded in the IP ID field.
+ Here, we directly use the probe's TTL.
+ :param src: the source address of the reply
+ :param probe: a Probe instance
+
+ :return: a FakeReply instance
+ """
+
+ # return a fake ICMP time exceeded reply using information from the probe
+ return FakeReply(
+ probe_protocol=probe.protocol,
+ probe_dst_addr=probe.dst_addr,
+ probe_src_port=probe.src_port,
+ probe_dst_port=probe.dst_port,
+ probe_ttl=probe.ttl,
+ reply_ttl=255 - probe.ttl,
+ reply_src_addr=src,
+ reply_icmp_type=11,
+ reply_icmp_code=0,
+ reply_id=FakeProber.flow_id(probe, 0) % 2**16,
+ quoted_ttl=1,
+ capture_timestamp=0,
+ rtt=0,
+ )
+
+ @classmethod
+ def icmp_echo_reply(cls, src: int, probe: Probe) -> FakeReply:
+ """
+ Generate a fake ICMP echo reply for a given probe.
+ Same as the ICMP time exceeded reply, but with a different ICMP type.
+ :param src: the source address of the reply
+ :param probe: a Probe instance
+
+ :return: a FakeReply instance
+ """
+ # return a fake ICMP time ECHO reply using information from the probe
+ # does not reuse because FakeReply is immutable (frozen)
+ return FakeReply(
+ probe_protocol=probe.protocol,
+ probe_dst_addr=probe.dst_addr,
+ probe_src_port=probe.src_port,
+ probe_dst_port=probe.dst_port,
+ probe_ttl=probe.ttl,
+ reply_ttl=255 - probe.ttl,
+ reply_src_addr=src,
+ reply_icmp_type=0,
+ reply_icmp_code=0,
+ reply_id=FakeProber.flow_id(probe, 0) % 2**16,
+ quoted_ttl=1,
+ capture_timestamp=0,
+ rtt=0,
+ )
diff --git a/tests/fakenet/test_apriori.py b/tests/fakenet/test_apriori.py
new file mode 100644
index 0000000..1fc76a5
--- /dev/null
+++ b/tests/fakenet/test_apriori.py
@@ -0,0 +1,56 @@
+import pytest
+from tests.fakenet.apriori import apriori_prob
+from fakenet.fakenet import FakeNet
+
+
+def assert_sorted_probs(probs):
+ assert all([0 <= prob <= 1 for prob in probs])
+ assert sorted(probs) == probs
+
+
+@pytest.mark.parametrize("n_paths", range(3, 6))
+def test_apriori_multi_path(n_paths: int):
+ """
+ Checks the apriori probability for a network with a single load-balancer.
+ """
+ confidences = [0.80, 0.90, 0.95, 0.99]
+ net = FakeNet.multi_single_paths(n_paths=n_paths, path_length=3)
+ expected_probs = [apriori_prob(net, confidence=conf) for conf in confidences]
+ assert_sorted_probs(expected_probs)
+ assert len(set(expected_probs)) == len(expected_probs)
+ for prob, confidence in zip(expected_probs, confidences):
+ a, b = confidence * 0.95, confidence * 1.05
+ # for confidence=0.95, we expect the probability to be between 0.9025 and 0.9975
+ assert a <= prob <= b
+
+
+@pytest.mark.parametrize("height", range(3, 6))
+@pytest.mark.parametrize("length", range(3, 6))
+def test_apriori_meshed(height: int, length: int):
+ """
+ Checks the apriori probability for a meshed network.
+ """
+ confidences = [0.80, 0.90, 0.95, 0.99]
+ net = FakeNet.meshed([height for _ in range(length)])
+ expected_probs = [apriori_prob(net, confidence=conf) for conf in confidences]
+ assert_sorted_probs(expected_probs)
+ assert len(set(expected_probs)) == len(expected_probs)
+ n_nodes = height * (length - 1) + 1
+ for prob, confidence in zip(expected_probs, confidences):
+ a, b = confidence * 0.95, confidence * 1.05
+ # for confidence=0.95, we expect the probability to be between 0.9025 and 0.9975
+ # each bound is raised to the power of the number of nodes
+ assert a**n_nodes <= prob <= b**n_nodes
+
+
+@pytest.mark.parametrize("seed", range(10))
+def test_apriori_random(seed: int):
+ """
+ Checks the apriori probability for a random network.
+ """
+ confidences = [0.80, 0.90, 0.95, 0.99]
+ net = FakeNet.random_graph(p_edge=0.7, depth=8, seed=seed)
+ expected_probs = [apriori_prob(net, confidence=conf) for conf in confidences]
+
+ assert all([0 <= prob <= 1 for prob in expected_probs])
+ assert sorted(expected_probs) == expected_probs
diff --git a/tests/fakenet/test_artificial_networks.py b/tests/fakenet/test_artificial_networks.py
new file mode 100644
index 0000000..7301d46
--- /dev/null
+++ b/tests/fakenet/test_artificial_networks.py
@@ -0,0 +1,165 @@
+import pytest
+from fakenet.fakenet import FakeNet
+from tests.fakenet.apriori import (
+ apriori_prob,
+)
+from tests.fakenet.config import (
+ DEFAULT_CONFIDENCE,
+ N_TRIES,
+ DELTA_THRESHOLD,
+)
+from tests.fakenet.utils import eval_diamond_miner
+
+
+@pytest.mark.parametrize("height", range(2, 5))
+@pytest.mark.parametrize("length", range(3, 6))
+@pytest.mark.parametrize("optimal_jump", [False, True])
+def test_meshed_networks(height, length, optimal_jump):
+ """
+ Checks that the algorithm succeeds on meshed networks
+ with a probability higher than the expected apriori threshold.
+ """
+ net = FakeNet.meshed([height for _ in range(length)])
+ expected = DELTA_THRESHOLD * apriori_prob(net, confidence=DEFAULT_CONFIDENCE / 100)
+ OK = sum(
+ (
+ 1
+ if eval_diamond_miner(
+ net=net,
+ confidence=DEFAULT_CONFIDENCE,
+ seed=seed,
+ optimal_jump=optimal_jump,
+ )
+ else 0
+ )
+ for seed in range(N_TRIES)
+ )
+
+ assert OK / N_TRIES > expected
+
+
+@pytest.mark.parametrize("n_paths", range(3, 6))
+@pytest.mark.parametrize("length", range(3, 6))
+@pytest.mark.parametrize("optimal_jump", [False, True])
+def test_multi_single_paths_networks(n_paths, length, optimal_jump):
+ """
+ Checks that the algorithm succeeds on a simple network with a single load-balancer.
+ """
+ net = FakeNet.multi_single_paths(n_paths=n_paths, path_length=length)
+ expected = DELTA_THRESHOLD * apriori_prob(net, confidence=DEFAULT_CONFIDENCE / 100)
+
+ OK = sum(
+ (
+ 1
+ if eval_diamond_miner(
+ net=net,
+ confidence=DEFAULT_CONFIDENCE,
+ seed=seed,
+ optimal_jump=optimal_jump,
+ )
+ else 0
+ )
+ for seed in range(N_TRIES)
+ )
+ assert OK / N_TRIES > expected
+
+
+@pytest.mark.parametrize("length", range(1, 20))
+@pytest.mark.parametrize("optimal_jump", [False, True])
+def test_single_path_network(length, optimal_jump):
+ """
+ Checks that the algorithm succeeds on a simple network with no load-balancer.
+ """
+ net = FakeNet.multi_single_paths(n_paths=1, path_length=length)
+ expected = DELTA_THRESHOLD * apriori_prob(net, confidence=DEFAULT_CONFIDENCE / 100)
+
+ OK = sum(
+ (
+ 1
+ if eval_diamond_miner(
+ net=net,
+ confidence=DEFAULT_CONFIDENCE,
+ seed=seed,
+ optimal_jump=optimal_jump,
+ )
+ else 0
+ )
+ for seed in range(N_TRIES)
+ )
+ assert OK / N_TRIES > expected
+
+
+@pytest.mark.parametrize("confidence", [60.0, 70.0, 80.0, 90.0])
+def test_varying_confidence(confidence):
+ """
+ Checks that the algorithm succeeds on a simple network
+ more often than the expected apriori probability.
+ """
+ net = FakeNet.multi_single_paths(n_paths=4, path_length=5)
+ expected = DELTA_THRESHOLD * apriori_prob(net, confidence=confidence / 100)
+
+ OK = sum(
+ (
+ 1
+ if eval_diamond_miner(
+ net=net,
+ confidence=confidence,
+ seed=seed,
+ )
+ else 0
+ )
+ for seed in range(N_TRIES)
+ )
+ assert OK / N_TRIES > expected
+
+
+@pytest.mark.parametrize("confidence", [10.0, 30.0, 50.0])
+def test_low_confidence_fails(confidence):
+ """
+ Checks that the algorithm fails when the confidence is too low,
+ more often than the expected threshold.
+ """
+ net = FakeNet.meshed([4 for _ in range(4)])
+ expected = DELTA_THRESHOLD * apriori_prob(net, confidence=0.95)
+
+ OK = sum(
+ (
+ 1
+ if eval_diamond_miner(
+ net=net,
+ confidence=confidence,
+ seed=seed,
+ )
+ else 0
+ )
+ for seed in range(N_TRIES)
+ )
+ assert OK / N_TRIES < expected
+
+
+@pytest.mark.parametrize("density", [0.5, 0.7, 0.9])
+@pytest.mark.parametrize("depth", range(2, 6))
+@pytest.mark.parametrize("graph_seed", range(5))
+@pytest.mark.parametrize("optimal_jump", [False, True])
+def test_random_network(density, depth, graph_seed, optimal_jump):
+ """
+ Checks that the algorithm succeeds on random networks
+ with a probability higher than the expected apriori threshold.
+ """
+ net = FakeNet.random_graph(p_edge=density, depth=depth, seed=graph_seed)
+ expected = DELTA_THRESHOLD * apriori_prob(net, confidence=DEFAULT_CONFIDENCE / 100)
+
+ OK = sum(
+ (
+ 1
+ if eval_diamond_miner(
+ net=net,
+ confidence=DEFAULT_CONFIDENCE,
+ seed=seed,
+ optimal_jump=optimal_jump,
+ )
+ else 0
+ )
+ for seed in range(N_TRIES)
+ )
+ assert OK / N_TRIES > expected
diff --git a/tests/fakenet/test_real_networks.py b/tests/fakenet/test_real_networks.py
new file mode 100644
index 0000000..a4b49ed
--- /dev/null
+++ b/tests/fakenet/test_real_networks.py
@@ -0,0 +1,33 @@
+import pytest
+from fakenet.fakenet import FakeNet
+from tests.fakenet.apriori import apriori_prob
+from tests.fakenet.config import (
+ DEFAULT_CONFIDENCE,
+ DELTA_THRESHOLD,
+ N_TRIES,
+ SAMPLE_FILES,
+)
+from tests.fakenet.utils import eval_diamond_miner
+
+
+@pytest.mark.parametrize("filepath", SAMPLE_FILES)
+@pytest.mark.parametrize("optimal_jump", [False, True])
+def test_real_networks(filepath, optimal_jump):
+ net = FakeNet.from_file(filepath)
+ expected = DELTA_THRESHOLD * apriori_prob(net, confidence=DEFAULT_CONFIDENCE / 100)
+ if len(net.nodes()) > 80 or len(net.edges()) > 100:
+ assert False, f"Skipping {filepath}, got {len(net.nodes())} nodes and {len(net.edges())} edges"
+ OK = sum(
+ (
+ 1
+ if eval_diamond_miner(
+ net=net,
+ confidence=DEFAULT_CONFIDENCE,
+ seed=seed,
+ optimal_jump=optimal_jump,
+ )
+ else 0
+ )
+ for seed in range(N_TRIES)
+ )
+ assert OK / N_TRIES > expected
diff --git a/tests/fakenet/utils.py b/tests/fakenet/utils.py
new file mode 100644
index 0000000..090b818
--- /dev/null
+++ b/tests/fakenet/utils.py
@@ -0,0 +1,88 @@
+import networkx as nx
+from pycaracal import Probe, Reply
+from fast_mda_traceroute.algorithms.diamond_miner import DiamondMiner
+from fast_mda_traceroute.typing import Protocol
+from fakenet.fakenet import FakeNet, FakeProber
+
+
+def eval_diamond_miner(
+ net: FakeNet, confidence: float = 95.0, seed: int = 0, optimal_jump=False
+) -> bool:
+ prober = FakeProber(net, seed=seed)
+
+ protocol = Protocol.ICMP
+ src_port = 12345
+ dst_port = 33434
+ max_round = 100
+ min_ttl = 1
+ # fetch the distance between the start and end nodes
+ # NOTE: we cannot use the shortest path because the network may be unbalanced
+ max_ttl = nx.dag_longest_path_length(net) + 1
+
+ src_addr = net.start
+ dst_addr = net.end
+
+ alg = DiamondMiner(
+ dst_addr=dst_addr,
+ min_ttl=min_ttl,
+ max_ttl=max_ttl,
+ src_port=src_port,
+ dst_port=dst_port,
+ protocol=protocol.value,
+ confidence=confidence,
+ max_round=max_round,
+ )
+
+ last_replies: list[Reply] = []
+ rnd = 0
+ while True:
+ rnd += 1
+ probes = [
+ Probe(*x) for x in alg.next_round(last_replies, optimal_jump=optimal_jump)
+ ]
+ if not probes:
+ break
+ last_replies = prober.probe(probes)
+ # transform links_by_ttl to a dict of lists
+ links = {
+ ttl: list((x, y) for _, x, y in alg.links_by_ttl[ttl] if x and y)
+ for ttl in range(1, max_ttl)
+ }
+ # filter links to only show the ttl that have links
+ links = {k: v for k, v in links.items() if v}
+
+ # create a graph from the links
+ nx_graph = graph_from_links(src_addr, links)
+
+ # check if nx_graph is equal to net
+ res = nx.is_isomorphic(nx_graph, net)
+ return res
+
+
+def graph_from_links(
+ src_addr: str, links: dict[int, list[tuple[str, str]]]
+) -> nx.DiGraph:
+ """
+ Create a networkx graph from a dictionary of links.
+ The dictionary has the following structure:
+ {
+ ttl: [(src, dst), ...],
+ ...
+ }
+ Since the links dictionnary starts at TTL 1,
+ we need to connect the source address to all nodes at TTL 1.
+ :param src_addr: the source address of the network
+ :param links: a dictionary of links by TTL
+
+ :return: a networkx DiGraph instance
+ """
+ nx_graph = nx.DiGraph()
+ # link source address to all nodes at ttl 1
+ for link in links[1]:
+ nx_graph.add_edge(src_addr, link[0])
+
+ # add all edges to the graph
+ for _, links in links.items():
+ nx_graph.add_edges_from(list(set(links)))
+
+ return nx_graph
diff --git a/tests/test_links.py b/tests/test_links.py
index 4f7afc7..931b605 100644
--- a/tests/test_links.py
+++ b/tests/test_links.py
@@ -17,7 +17,7 @@ def test_get_replies_by_flow(make_reply):
make_reply(1, "::9", 24001, 33434, 1, "::1"),
make_reply(1, "::9", 24001, 33434, 3, "::3"),
]
- assert get_replies_by_flow([*replies_flow_1, *replies_flow_2]) == {
+ assert get_replies_by_flow((*replies_flow_1, *replies_flow_2)) == {
(1, "::9", 24000, 33434): replies_flow_1,
(1, "::9", 24001, 33434): replies_flow_2,
}
@@ -35,7 +35,7 @@ def test_get_replies_by_ttl(make_reply):
make_reply(1, "::9", 24000, 33434, 3, "::3"),
make_reply(1, "::9", 24001, 33434, 3, "::3"),
]
- assert get_replies_by_ttl([*replies_ttl_1, *replies_ttl_2, *replies_ttl_3]) == {
+ assert get_replies_by_ttl((*replies_ttl_1, *replies_ttl_2, *replies_ttl_3)) == {
1: replies_ttl_1,
2: replies_ttl_2,
3: replies_ttl_3,
@@ -52,15 +52,23 @@ def test_get_pairs_by_flow(make_reply):
make_reply(1, "::9", 24001, 33434, 1, "::1"),
make_reply(1, "::9", 24001, 33434, 3, "::3"),
]
- assert get_pairs_by_flow([*replies_flow_1, *replies_flow_2]) == {
- (1, "::9", 24000, 33434): [
+
+ pairs = get_pairs_by_flow((*replies_flow_1, *replies_flow_2))
+ pairs = {
+ k: set(x for x in v if x[0] > 0 and (x[1] or x[2]))
+ for k, v in pairs.items()
+ if k[0] > 0
+ }
+ pairs = {k: v for k, v in pairs.items() if v}
+ assert pairs == {
+ (1, "::9", 24000, 33434): {
(1, replies_flow_1[0], replies_flow_1[1]),
(2, replies_flow_1[1], replies_flow_1[2]),
- ],
- (1, "::9", 24001, 33434): [
+ },
+ (1, "::9", 24001, 33434): {
(1, replies_flow_2[0], None),
(2, None, replies_flow_2[1]),
- ],
+ },
}
@@ -74,7 +82,12 @@ def test_get_links_by_ttl(make_reply):
make_reply(1, "::9", 24001, 33434, 1, "::1"),
make_reply(1, "::9", 24001, 33434, 3, "::3"),
]
- assert get_links_by_ttl([*replies_flow_1, *replies_flow_2]) == {
+ links_by_ttl = get_links_by_ttl((*replies_flow_1, *replies_flow_2))
+ links_by_ttl = {
+ k: set(x for x in v if x[1] or x[2]) for k, v in links_by_ttl.items() if k > 0
+ }
+ links_by_ttl = {k: v for k, v in links_by_ttl.items() if v}
+ assert links_by_ttl == {
1: {(1, "::1", "::2"), (1, "::1", None)},
2: {(2, "::2", "::3"), (2, None, "::3")},
}
@@ -90,7 +103,7 @@ def test_get_scamper_links(make_reply):
make_reply(1, "::9", 24001, 33434, 1, "::1"),
make_reply(1, "::9", 24001, 33434, 3, "::3"),
]
- assert get_scamper_links([*replies_flow_1, *replies_flow_2]) == {
+ assert get_scamper_links((*replies_flow_1, *replies_flow_2)) == {
"::1": {
2: {"::2": [replies_flow_1[1]], None: [None]},
3: {"::3": [replies_flow_2[1]]},