diff --git a/pr/427/docs/help.html b/pr/427/docs/help.html index 2565ad385..cda0c7f93 100644 --- a/pr/427/docs/help.html +++ b/pr/427/docs/help.html @@ -1 +1 @@ -
pub enum ConnectionError {
+ConnectionError in iroh_quinn - Rust ConnectionError
pub enum ConnectionError {
VersionMismatch,
TransportError(Error),
ConnectionClosed(ConnectionClose),
@@ -20,8 +20,8 @@ and §LocallyClosed
The local application closed the connection
§CidsExhausted
The connection could not be created because not enough of the CID space is available
Try using longer connection IDs.
-Trait Implementations§
Source§impl Clone for ConnectionError
Source§fn clone(&self) -> ConnectionError
Returns a duplicate of the value. Read more1.0.0 · Source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreSource§impl Debug for ConnectionError
Source§impl Display for ConnectionError
Source§impl Error for ConnectionError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl From<Close> for ConnectionError
Source§fn from(x: Close) -> ConnectionError
Converts to this type from the input type.Source§impl From<CloseReason> for ConnectionError
Source§fn from(value: CloseReason) -> ConnectionError
Converts to this type from the input type.Source§impl From<ConnectionError> for ReadError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<ConnectionError> for ResetError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<ConnectionError> for SendDatagramError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<ConnectionError> for StoppedError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<ConnectionError> for WriteError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<Error> for ConnectionError
Source§fn from(source: Error) -> ConnectionError
Converts to this type from the input type.Source§impl PartialEq for ConnectionError
Source§impl Eq for ConnectionError
Source§impl StructuralPartialEq for ConnectionError
Auto Trait Implementations§
§impl !Freeze for ConnectionError
§impl !RefUnwindSafe for ConnectionError
§impl Send for ConnectionError
§impl Sync for ConnectionError
§impl Unpin for ConnectionError
§impl !UnwindSafe for ConnectionError
Blanket Implementations§
Trait Implementations§
Source§impl Clone for ConnectionError
Source§fn clone(&self) -> ConnectionError
Returns a duplicate of the value. Read more1.0.0 · Source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreSource§impl Debug for ConnectionError
Source§impl Display for ConnectionError
Source§impl Error for ConnectionError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl From<Close> for ConnectionError
Source§fn from(x: Close) -> ConnectionError
Converts to this type from the input type.Source§impl From<CloseReason> for ConnectionError
Source§fn from(value: CloseReason) -> ConnectionError
Converts to this type from the input type.Source§impl From<ConnectionError> for ReadError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<ConnectionError> for ResetError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<ConnectionError> for SendDatagramError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<ConnectionError> for StoppedError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<ConnectionError> for WriteError
Source§fn from(source: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<Error> for ConnectionError
Source§fn from(source: Error) -> ConnectionError
Converts to this type from the input type.Source§impl PartialEq for ConnectionError
Source§impl Eq for ConnectionError
Source§impl StructuralPartialEq for ConnectionError
Auto Trait Implementations§
§impl !Freeze for ConnectionError
§impl !RefUnwindSafe for ConnectionError
§impl Send for ConnectionError
§impl Sync for ConnectionError
§impl Unpin for ConnectionError
§impl !UnwindSafe for ConnectionError
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read moreSource§impl<T> CloneToUninit for Twhere
diff --git a/pr/427/docs/iroh_quinn/trait.NetworkChangeHint.html b/pr/427/docs/iroh_quinn/trait.NetworkChangeHint.html
index 3372cd4c5..9dafecf92 100644
--- a/pr/427/docs/iroh_quinn/trait.NetworkChangeHint.html
+++ b/pr/427/docs/iroh_quinn/trait.NetworkChangeHint.html
@@ -1,4 +1,4 @@
-NetworkChangeHint in iroh_quinn - Rust NetworkChangeHint
pub trait NetworkChangeHint: Debug + 'static {
+NetworkChangeHint in iroh_quinn - Rust NetworkChangeHint
pub trait NetworkChangeHint: Debug + 'static {
// Required method
fn is_path_recoverable(
&self,
@@ -6,7 +6,7 @@
network_path: FourTuple,
) -> bool;
}
Expand description
Hints when the caller identifies a network change.
-Required Methods§
Sourcefn is_path_recoverable(&self, path_id: PathId, network_path: FourTuple) -> bool
Inform the connection if a path may recover after a network change.
+Required Methods§
Sourcefn is_path_recoverable(&self, path_id: PathId, network_path: FourTuple) -> bool
Inform the connection if a path may recover after a network change.
After network changes, paths may not be recoverable. In this case, waiting for the path to
become idle may take longer than what is desirable. If Self::is_path_recoverable
returns false, a multipath-enabled, client-side connection will establish a new path to
diff --git a/pr/427/docs/iroh_quinn_proto/enum.ClosePathError.html b/pr/427/docs/iroh_quinn_proto/enum.ClosePathError.html
index e1ab753e6..0df748f45 100644
--- a/pr/427/docs/iroh_quinn_proto/enum.ClosePathError.html
+++ b/pr/427/docs/iroh_quinn_proto/enum.ClosePathError.html
@@ -1,4 +1,4 @@
-
ClosePathError in iroh_quinn_proto - Rust ClosePathError
pub enum ClosePathError {
+ClosePathError in iroh_quinn_proto - Rust ClosePathError
pub enum ClosePathError {
MultipathNotNegotiated,
ClosedPath,
LastOpenPath,
@@ -6,8 +6,8 @@
Variants§
§MultipathNotNegotiated
Multipath is not negotiated
§ClosedPath
The path is already closed or was never opened
§LastOpenPath
This is the last path, which can not be abandoned
-Trait Implementations§
Source§impl Clone for ClosePathError
Source§fn clone(&self) -> ClosePathError
Returns a duplicate of the value. Read more1.0.0 · Source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreSource§impl Debug for ClosePathError
Source§impl Display for ClosePathError
Source§impl Error for ClosePathError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl PartialEq for ClosePathError
Source§impl Eq for ClosePathError
Source§impl StructuralPartialEq for ClosePathError
Auto Trait Implementations§
§impl Freeze for ClosePathError
§impl RefUnwindSafe for ClosePathError
§impl Send for ClosePathError
§impl Sync for ClosePathError
§impl Unpin for ClosePathError
§impl UnwindSafe for ClosePathError
Blanket Implementations§
Trait Implementations§
Source§impl Clone for ClosePathError
Source§fn clone(&self) -> ClosePathError
Returns a duplicate of the value. Read more1.0.0 · Source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreSource§impl Debug for ClosePathError
Source§impl Display for ClosePathError
Source§impl Error for ClosePathError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl PartialEq for ClosePathError
Source§impl Eq for ClosePathError
Source§impl StructuralPartialEq for ClosePathError
Auto Trait Implementations§
§impl Freeze for ClosePathError
§impl RefUnwindSafe for ClosePathError
§impl Send for ClosePathError
§impl Sync for ClosePathError
§impl Unpin for ClosePathError
§impl UnwindSafe for ClosePathError
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read moreSource§impl<T> CloneToUninit for Twhere
diff --git a/pr/427/docs/iroh_quinn_proto/enum.ConnectionError.html b/pr/427/docs/iroh_quinn_proto/enum.ConnectionError.html
index 41cf7a8ec..eb7766d50 100644
--- a/pr/427/docs/iroh_quinn_proto/enum.ConnectionError.html
+++ b/pr/427/docs/iroh_quinn_proto/enum.ConnectionError.html
@@ -1,4 +1,4 @@
-ConnectionError in iroh_quinn_proto - Rust ConnectionError
pub enum ConnectionError {
+ConnectionError in iroh_quinn_proto - Rust ConnectionError
pub enum ConnectionError {
VersionMismatch,
TransportError(TransportError),
ConnectionClosed(ConnectionClose),
@@ -20,8 +20,8 @@ and §LocallyClosed
The local application closed the connection
§CidsExhausted
The connection could not be created because not enough of the CID space is available
Try using longer connection IDs.
-Trait Implementations§
Source§impl Clone for ConnectionError
Source§fn clone(&self) -> ConnectionError
Returns a duplicate of the value. Read more1.0.0 · Source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreSource§impl Debug for ConnectionError
Source§impl Display for ConnectionError
Source§impl Error for ConnectionError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl From<ConnectionError> for Error
Source§fn from(x: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<Error> for ConnectionError
Source§fn from(source: TransportError) -> Self
Converts to this type from the input type.Source§impl PartialEq for ConnectionError
Source§impl Eq for ConnectionError
Source§impl StructuralPartialEq for ConnectionError
Auto Trait Implementations§
§impl !Freeze for ConnectionError
§impl !RefUnwindSafe for ConnectionError
§impl Send for ConnectionError
§impl Sync for ConnectionError
§impl Unpin for ConnectionError
§impl !UnwindSafe for ConnectionError
Blanket Implementations§
Trait Implementations§
Source§impl Clone for ConnectionError
Source§fn clone(&self) -> ConnectionError
Returns a duplicate of the value. Read more1.0.0 · Source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreSource§impl Debug for ConnectionError
Source§impl Display for ConnectionError
Source§impl Error for ConnectionError
Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl From<ConnectionError> for Error
Source§fn from(x: ConnectionError) -> Self
Converts to this type from the input type.Source§impl From<Error> for ConnectionError
Source§fn from(source: TransportError) -> Self
Converts to this type from the input type.Source§impl PartialEq for ConnectionError
Source§impl Eq for ConnectionError
Source§impl StructuralPartialEq for ConnectionError
Auto Trait Implementations§
§impl !Freeze for ConnectionError
§impl !RefUnwindSafe for ConnectionError
§impl Send for ConnectionError
§impl Sync for ConnectionError
§impl Unpin for ConnectionError
§impl !UnwindSafe for ConnectionError
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read moreSource§impl<T> CloneToUninit for Twhere
diff --git a/pr/427/docs/iroh_quinn_proto/enum.Event.html b/pr/427/docs/iroh_quinn_proto/enum.Event.html
index 859f37528..cc1bd3de1 100644
--- a/pr/427/docs/iroh_quinn_proto/enum.Event.html
+++ b/pr/427/docs/iroh_quinn_proto/enum.Event.html
@@ -1,4 +1,4 @@
-Event in iroh_quinn_proto - Rust Event
pub enum Event {
+Event in iroh_quinn_proto - Rust Event
pub enum Event {
HandshakeDataReady,
Connected,
HandshakeConfirmed,
@@ -22,7 +22,7 @@
§DatagramsUnblocked
One or more application datagrams have been sent after blocking
§Path(PathEvent)
(Multi)Path events
§NatTraversal(Event)
Iroh’s nat traversal events
-
Trait Implementations§
Auto Trait Implementations§
§impl !Freeze for Event
§impl !RefUnwindSafe for Event
§impl Send for Event
§impl Sync for Event
§impl Unpin for Event
§impl !UnwindSafe for Event
Blanket Implementations§
Trait Implementations§
Auto Trait Implementations§
§impl !Freeze for Event
§impl !RefUnwindSafe for Event
§impl Send for Event
§impl Sync for Event
§impl Unpin for Event
§impl !UnwindSafe for Event
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read moreSource§impl<T> From<T> for T
Source§fn from(t: T) -> T
Returns the argument unchanged.
diff --git a/pr/427/docs/iroh_quinn_proto/enum.PathError.html b/pr/427/docs/iroh_quinn_proto/enum.PathError.html
index f22ab66f1..0f2484db7 100644
--- a/pr/427/docs/iroh_quinn_proto/enum.PathError.html
+++ b/pr/427/docs/iroh_quinn_proto/enum.PathError.html
@@ -1,4 +1,4 @@
-PathError in iroh_quinn_proto - Rust PathError
pub enum PathError {
+PathError in iroh_quinn_proto - Rust PathError
pub enum PathError {
MultipathNotNegotiated,
ServerSideNotAllowed,
MaxPathIdReached,
@@ -12,8 +12,8 @@
§RemoteCidsExhausted
No remote CIDs available to open a new path
§ValidationFailed
Path could not be validated and will be abandoned
§InvalidRemoteAddress(SocketAddr)
The remote address for the path is not supported by the endpoint
-
Trait Implementations§
Source§impl Error for PathError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl Copy for PathError
Source§impl Eq for PathError
Source§impl StructuralPartialEq for PathError
Auto Trait Implementations§
§impl Freeze for PathError
§impl RefUnwindSafe for PathError
§impl Send for PathError
§impl Sync for PathError
§impl Unpin for PathError
§impl UnwindSafe for PathError
Blanket Implementations§
Trait Implementations§
Source§impl Error for PathError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl Copy for PathError
Source§impl Eq for PathError
Source§impl StructuralPartialEq for PathError
Auto Trait Implementations§
§impl Freeze for PathError
§impl RefUnwindSafe for PathError
§impl Send for PathError
§impl Sync for PathError
§impl Unpin for PathError
§impl UnwindSafe for PathError
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read moreSource§impl<T> CloneToUninit for Twhere
diff --git a/pr/427/docs/iroh_quinn_proto/enum.PathEvent.html b/pr/427/docs/iroh_quinn_proto/enum.PathEvent.html
index 1d084beb8..4f5633ac4 100644
--- a/pr/427/docs/iroh_quinn_proto/enum.PathEvent.html
+++ b/pr/427/docs/iroh_quinn_proto/enum.PathEvent.html
@@ -39,7 +39,7 @@ changes the status.
Fields
§id: PathIdPath over which the observed address was reported, PathId::ZERO when multipath is
not negotiated
§addr: SocketAddrThe address observed by the remote over this path
-
Trait Implementations§
Trait Implementations§
Source§impl Eq for PathEvent
Source§impl StructuralPartialEq for PathEvent
Auto Trait Implementations§
§impl Freeze for PathEvent
§impl RefUnwindSafe for PathEvent
§impl Send for PathEvent
§impl Sync for PathEvent
§impl Unpin for PathEvent
§impl UnwindSafe for PathEvent
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
diff --git a/pr/427/docs/iroh_quinn_proto/struct.Connection.html b/pr/427/docs/iroh_quinn_proto/struct.Connection.html
index 5433daa7e..8c303cd02 100644
--- a/pr/427/docs/iroh_quinn_proto/struct.Connection.html
+++ b/pr/427/docs/iroh_quinn_proto/struct.Connection.html
@@ -33,7 +33,7 @@ increasing time. Specifically, calling Instant may be interleaved in any order with a
call to handle_event at that same instant; however
events or timeouts with different instants must not be interleaved.
-
Implementations§
Source§impl Connection
Sourcepub fn poll_timeout(&mut self) -> Option<Instant>
Returns the next time at which handle_timeout should be called
+Implementations§
Source§impl Connection
Sourcepub fn poll_timeout(&mut self) -> Option<Instant>
Returns the next time at which handle_timeout should be called
The value returned may change after:
- the application performed some I/O on the connection
@@ -78,36 +78,36 @@ When the path is opened it will be reported as an Instant,
path_id: PathId,
error_code: VarInt,
-) -> Result<(), ClosePathError>Closes a path by sending a PATH_ABANDON frame
+) -> Result<(), ClosePathError>Closes a path and sends a PATH_ABANDON frame with the passed error code.
This will not allow closing the last path. It does allow closing paths which have
not yet been opened, as e.g. is the case when receiving a PATH_ABANDON from the peer
for a path that was never opened locally.
-Sourcepub fn paths(&self) -> Vec<PathId>
Returns all known paths.
There is no guarantee any of these paths are open or usable.
-Sourcepub fn path_status(&self, path_id: PathId) -> Result<PathStatus, ClosedPath>
Gets the local PathStatus for a known PathId
-Sourcepub fn network_path(&self, path_id: PathId) -> Result<FourTuple, ClosedPath>
Returns the path’s network path represented as a 4-tuple.
-Sourcepub fn set_path_status(
+
Sourcepub fn path_status(&self, path_id: PathId) -> Result<PathStatus, ClosedPath>
Gets the local PathStatus for a known PathId
+Sourcepub fn network_path(&self, path_id: PathId) -> Result<FourTuple, ClosedPath>
Returns the path’s network path represented as a 4-tuple.
+Sourcepub fn set_path_status(
&mut self,
path_id: PathId,
status: PathStatus,
) -> Result<PathStatus, SetPathStatusError>
Sets the PathStatus for a known PathId
Returns the previous path status on success.
-Sourcepub fn remote_path_status(&self, path_id: PathId) -> Option<PathStatus>
Returns the remote path status
-Sourcepub fn set_path_max_idle_timeout(
+
Sourcepub fn remote_path_status(&self, path_id: PathId) -> Option<PathStatus>
Returns the remote path status
+Sourcepub fn set_path_max_idle_timeout(
&mut self,
path_id: PathId,
timeout: Option<Duration>,
) -> Result<Option<Duration>, ClosedPath>
Sets the max_idle_timeout for a specific path
See TransportConfig::default_path_max_idle_timeout for details.
Returns the previous value of the setting.
-Sourcepub fn set_path_keep_alive_interval(
+
Sourcepub fn set_path_keep_alive_interval(
&mut self,
path_id: PathId,
interval: Option<Duration>,
) -> Result<Option<Duration>, ClosedPath>
Sets the keep_alive_interval for a specific path
See TransportConfig::default_path_keep_alive_interval for details.
Returns the previous value of the setting.
-Sourcepub fn poll_transmit(
+
Sourcepub fn poll_transmit(
&mut self,
now: Instant,
max_datagrams: NonZeroUsize,
@@ -121,60 +121,60 @@ for a path that was never opened locally.
max_datagrams specifies how many datagrams can be returned inside a
single Transmit using GSO. This must be at least 1.
-
Sourcepub fn handle_event(&mut self, event: ConnectionEvent)
Process ConnectionEvents generated by the associated Endpoint
+Sourcepub fn handle_event(&mut self, event: ConnectionEvent)
Process ConnectionEvents generated by the associated Endpoint
Will execute protocol logic upon receipt of a connection event, in turn preparing signals
(including application Events, EndpointEvents and outgoing datagrams) that should be
extracted through the relevant methods.
-Sourcepub fn handle_timeout(&mut self, now: Instant)
Process timer expirations
+Sourcepub fn handle_timeout(&mut self, now: Instant)
Process timer expirations
Executes protocol logic, potentially preparing signals (including application Events,
EndpointEvents and outgoing datagrams) that should be extracted through the relevant
methods.
It is most efficient to call this immediately after the system clock reaches the latest
Instant that was output by poll_timeout; however spurious extra calls will simply
no-op and therefore are safe.
-Sourcepub fn close(&mut self, now: Instant, error_code: VarInt, reason: Bytes)
Close a connection immediately
+Sourcepub fn close(&mut self, now: Instant, error_code: VarInt, reason: Bytes)
Close a connection immediately
This does not ensure delivery of outstanding data. It is the application’s responsibility to
call this only when all important communications have been completed, e.g. by calling
SendStream::finish on outstanding streams and waiting for the corresponding
StreamEvent::Finished event.
If Streams::send_streams returns 0, all outstanding stream data has been
delivered. There may still be data from the peer that has not been received.
-Sourcepub fn stats(&mut self) -> ConnectionStats
Returns connection statistics
-Sourcepub fn path_stats(&mut self, path_id: PathId) -> Option<PathStats>
Returns path statistics
-Sourcepub fn stats(&mut self) -> ConnectionStats
Returns connection statistics
+Sourcepub fn path_stats(&mut self, path_id: PathId) -> Option<PathStats>
Returns path statistics
+Sourcepub fn ping(&mut self)
Ping the remote endpoint
Causes an ACK-eliciting packet to be transmitted on the connection.
-Sourcepub fn ping_path(&mut self, path: PathId) -> Result<(), ClosedPath>
Ping the remote endpoint over a specific path
+Sourcepub fn ping_path(&mut self, path: PathId) -> Result<(), ClosedPath>
Ping the remote endpoint over a specific path
Causes an ACK-eliciting packet to be transmitted on the path.
-Sourcepub fn force_key_update(&mut self)
Update traffic keys spontaneously
+Sourcepub fn force_key_update(&mut self)
Update traffic keys spontaneously
This can be useful for testing key updates, as they otherwise only happen infrequently.
-Sourcepub fn crypto_session(&self) -> &dyn Session
Get a session reference
-Sourcepub fn is_handshaking(&self) -> bool
Whether the connection is in the process of being established
+Sourcepub fn crypto_session(&self) -> &dyn Session
Get a session reference
+Sourcepub fn is_handshaking(&self) -> bool
Whether the connection is in the process of being established
If this returns false, the connection may be either established or closed, signaled by the
emission of a Connected or ConnectionLost message respectively.
-Sourcepub fn is_closed(&self) -> bool
Whether the connection is closed
Closed connections cannot transport any further data. A connection becomes closed when
either peer application intentionally closes it, or when either transport layer detects an
error such as a time-out or certificate validation failure.
A ConnectionLost event is emitted with details when the connection becomes closed.
-Sourcepub fn is_drained(&self) -> bool
Whether there is no longer any need to keep the connection around
+Sourcepub fn is_drained(&self) -> bool
Whether there is no longer any need to keep the connection around
Closed connections become drained after a brief timeout to absorb any remaining in-flight
packets from the peer. All drained connections have been closed.
-Sourcepub fn accepted_0rtt(&self) -> bool
For clients, if the peer accepted the 0-RTT data packets
+Sourcepub fn accepted_0rtt(&self) -> bool
For clients, if the peer accepted the 0-RTT data packets
The value is meaningless until after the handshake completes.
-Sourcepub fn has_pending_retransmits(&self) -> bool
Whether there are any pending retransmits
-Sourcepub fn path_observed_address(
+
Sourcepub fn has_pending_retransmits(&self) -> bool
Whether there are any pending retransmits
+Sourcepub fn path_observed_address(
&self,
path_id: PathId,
) -> Result<Option<SocketAddr>, ClosedPath>
Get the address observed by the remote over the given path
-Sourcepub fn rtt(&self, path_id: PathId) -> Option<Duration>
Current best estimate of this connection’s latency (round-trip-time)
-Sourcepub fn congestion_state(&self, path_id: PathId) -> Option<&dyn Controller>
Current state of this connection’s congestion controller, for debugging purposes
-Sourcepub fn set_max_concurrent_streams(&mut self, dir: Dir, count: VarInt)
Modify the number of remotely initiated streams that may be concurrently open
+Sourcepub fn rtt(&self, path_id: PathId) -> Option<Duration>
Current best estimate of this connection’s latency (round-trip-time)
+Sourcepub fn congestion_state(&self, path_id: PathId) -> Option<&dyn Controller>
Current state of this connection’s congestion controller, for debugging purposes
+Sourcepub fn set_max_concurrent_streams(&mut self, dir: Dir, count: VarInt)
Modify the number of remotely initiated streams that may be concurrently open
No streams may be opened by the peer unless fewer than count are already open. Large
counts increase both minimum and worst-case memory consumption.
-Sourcepub fn set_max_concurrent_paths(
+
Sourcepub fn set_max_concurrent_paths(
&mut self,
now: Instant,
count: NonZeroU32,
@@ -185,16 +185,16 @@ actively reduce paths they must be closed using TransportConfig) this can not enable
multipath and will fail.
-
Sourcepub fn max_concurrent_streams(&self, dir: Dir) -> u64
Current number of remotely initiated streams that may be concurrently open
+Sourcepub fn max_concurrent_streams(&self, dir: Dir) -> u64
Current number of remotely initiated streams that may be concurrently open
If the target for this limit is reduced using set_max_concurrent_streams,
it will not change immediately, even if fewer streams are open. Instead, it will
decrement by one for each time a remotely initiated stream of matching directionality is closed.
-Sourcepub fn set_send_window(&mut self, send_window: u64)
Sourcepub fn set_receive_window(&mut self, receive_window: VarInt)
Sourcepub fn is_multipath_negotiated(&self) -> bool
Whether the Multipath for QUIC extension is enabled.
+Sourcepub fn set_send_window(&mut self, send_window: u64)
Sourcepub fn set_receive_window(&mut self, receive_window: VarInt)
Sourcepub fn is_multipath_negotiated(&self) -> bool
Whether the Multipath for QUIC extension is enabled.
Multipath is only enabled after the handshake is completed and if it was enabled by both
peers.
-Sourcepub fn handle_network_change(
+
Sourcepub fn handle_network_change(
&mut self,
hint: Option<&dyn NetworkChangeHint>,
now: Instant,
@@ -209,26 +209,26 @@ paths as non recoverable when necessary accelerates connectivity re-establishmen
allow it altogether.
The optional hint allows callers to indicate when paths are non-recoverable and should be
migrated to new a PathId.
-
Sourcepub fn current_mtu(&self) -> u16
Storage size required for the largest packet that can be transmitted on all currently
+
Sourcepub fn current_mtu(&self) -> u16
Storage size required for the largest packet that can be transmitted on all currently
available paths
Buffers passed to Connection::poll_transmit should be at least this large.
When multipath is enabled, this value is the minimum MTU across all available paths.
-Sourcepub fn add_nat_traversal_address(
+
Sourcepub fn add_nat_traversal_address(
&mut self,
address: SocketAddr,
) -> Result<(), Error>
Add addresses the local endpoint considers are reachable for nat traversal.
-Sourcepub fn remove_nat_traversal_address(
+
Sourcepub fn remove_nat_traversal_address(
&mut self,
address: SocketAddr,
) -> Result<(), Error>
Removes an address the endpoing no longer considers reachable for nat traversal
Addresses not present in the set will be silently ignored.
-Sourcepub fn get_local_nat_traversal_addresses(
+
Sourcepub fn get_local_nat_traversal_addresses(
&self,
) -> Result<Vec<SocketAddr>, Error>
Get the current local nat traversal addresses
-Sourcepub fn get_remote_nat_traversal_addresses(
+
Sourcepub fn get_remote_nat_traversal_addresses(
&self,
) -> Result<Vec<SocketAddr>, Error>
Get the currently advertised nat traversal addresses by the server
-Sourcepub fn initiate_nat_traversal_round(
+
Sourcepub fn initiate_nat_traversal_round(
&mut self,
now: Instant,
) -> Result<Vec<SocketAddr>, Error>
Initiates a new nat traversal round
@@ -238,7 +238,7 @@ initiated, the previous one is cancelled, and paths that have not been opened ar
Returns the server addresses that are now being probed.
If addresses fail due to spurious errors, these might succeed later and not be returned in
this set.
-Trait Implementations§
Auto Trait Implementations§
§impl !Freeze for Connection
§impl !RefUnwindSafe for Connection
§impl Send for Connection
§impl Sync for Connection
§impl Unpin for Connection
§impl !UnwindSafe for Connection
Blanket Implementations§
Trait Implementations§
Auto Trait Implementations§
§impl !Freeze for Connection
§impl !RefUnwindSafe for Connection
§impl Send for Connection
§impl Sync for Connection
§impl Unpin for Connection
§impl !UnwindSafe for Connection
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read moreSource§impl<T> From<T> for T
Source§fn from(t: T) -> T
Returns the argument unchanged.
diff --git a/pr/427/docs/iroh_quinn_proto/struct.MultipathNotNegotiated.html b/pr/427/docs/iroh_quinn_proto/struct.MultipathNotNegotiated.html
index 04ce103e8..e186e5d89 100644
--- a/pr/427/docs/iroh_quinn_proto/struct.MultipathNotNegotiated.html
+++ b/pr/427/docs/iroh_quinn_proto/struct.MultipathNotNegotiated.html
@@ -1,5 +1,5 @@
-MultipathNotNegotiated in iroh_quinn_proto - Rust MultipathNotNegotiated
pub struct MultipathNotNegotiated { /* private fields */ }
Expand description
Error when the multipath extension was not negotiated, but attempted to be used.
-Trait Implementations§
Source§impl Clone for MultipathNotNegotiated
Source§fn clone(&self) -> MultipathNotNegotiated
Returns a duplicate of the value. Read more1.0.0 · Source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreSource§impl Debug for MultipathNotNegotiated
Source§impl Display for MultipathNotNegotiated
Source§impl Error for MultipathNotNegotiated
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl Copy for MultipathNotNegotiated
Auto Trait Implementations§
§impl Freeze for MultipathNotNegotiated
§impl RefUnwindSafe for MultipathNotNegotiated
§impl Send for MultipathNotNegotiated
§impl Sync for MultipathNotNegotiated
§impl Unpin for MultipathNotNegotiated
§impl UnwindSafe for MultipathNotNegotiated
Blanket Implementations§
Source§impl<T> Any for Twhere
+MultipathNotNegotiated in iroh_quinn_proto - Rust MultipathNotNegotiated
pub struct MultipathNotNegotiated { /* private fields */ }
Expand description
Error when the multipath extension was not negotiated, but attempted to be used.
+Trait Implementations§
Source§impl Clone for MultipathNotNegotiated
Source§fn clone(&self) -> MultipathNotNegotiated
Returns a duplicate of the value. Read more1.0.0 · Source§fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read moreSource§impl Debug for MultipathNotNegotiated
Source§impl Display for MultipathNotNegotiated
Source§impl Error for MultipathNotNegotiated
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl Copy for MultipathNotNegotiated
Auto Trait Implementations§
§impl Freeze for MultipathNotNegotiated
§impl RefUnwindSafe for MultipathNotNegotiated
§impl Send for MultipathNotNegotiated
§impl Sync for MultipathNotNegotiated
§impl Unpin for MultipathNotNegotiated
§impl UnwindSafe for MultipathNotNegotiated
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read moreSource§impl<T> CloneToUninit for Twhere
diff --git a/pr/427/docs/iroh_quinn_proto/struct.TransportError.html b/pr/427/docs/iroh_quinn_proto/struct.TransportError.html
index 8fef5245a..b366ec62a 100644
--- a/pr/427/docs/iroh_quinn_proto/struct.TransportError.html
+++ b/pr/427/docs/iroh_quinn_proto/struct.TransportError.html
@@ -11,7 +11,7 @@
§reason: StringHuman-readable explanation of the reason
§crypto: Option<Arc<dyn Error + Send + Sync>>An underlying crypto (e.g. TLS) layer error
Implementations§
Trait Implementations§
Source§impl Error for Error
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl From<Error> for ConnectionClose
Source§fn from(x: TransportError) -> Self
Converts to this type from the input type.Source§impl From<Error> for ConnectionError
Source§fn from(source: TransportError) -> Self
Converts to this type from the input type.Source§impl From<Error> for TransportError
Trait Implementations§
Source§impl Error for Error
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
Returns the lower-level source of this error, if any. Read more1.0.0 · Source§fn description(&self) -> &str
👎Deprecated since 1.42.0: use the Display impl or to_string()Source§impl From<Error> for ConnectionClose
Source§fn from(x: TransportError) -> Self
Converts to this type from the input type.Source§impl From<Error> for ConnectionError
Source§fn from(source: TransportError) -> Self
Converts to this type from the input type.Source§impl From<Error> for TransportError
Source§impl Eq for Error
Auto Trait Implementations§
§impl Freeze for Error
§impl !RefUnwindSafe for Error
§impl Send for Error
§impl Sync for Error
§impl Unpin for Error
§impl !UnwindSafe for Error
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
diff --git a/pr/427/docs/iroh_quinn_proto/trait.NetworkChangeHint.html b/pr/427/docs/iroh_quinn_proto/trait.NetworkChangeHint.html
index 389fe31b9..aa57f948d 100644
--- a/pr/427/docs/iroh_quinn_proto/trait.NetworkChangeHint.html
+++ b/pr/427/docs/iroh_quinn_proto/trait.NetworkChangeHint.html
@@ -1,4 +1,4 @@
-NetworkChangeHint in iroh_quinn_proto - Rust NetworkChangeHint
pub trait NetworkChangeHint: Debug + 'static {
+NetworkChangeHint in iroh_quinn_proto - Rust NetworkChangeHint
pub trait NetworkChangeHint: Debug + 'static {
// Required method
fn is_path_recoverable(
&self,
@@ -6,7 +6,7 @@
network_path: FourTuple,
) -> bool;
}
Expand description
Hints when the caller identifies a network change.
-Required Methods§
Sourcefn is_path_recoverable(&self, path_id: PathId, network_path: FourTuple) -> bool
Inform the connection if a path may recover after a network change.
+Required Methods§
Sourcefn is_path_recoverable(&self, path_id: PathId, network_path: FourTuple) -> bool
Inform the connection if a path may recover after a network change.
After network changes, paths may not be recoverable. In this case, waiting for the path to
become idle may take longer than what is desirable. If Self::is_path_recoverable
returns false, a multipath-enabled, client-side connection will establish a new path to
diff --git a/pr/427/docs/search.index/desc/7c5a705df2ad.js b/pr/427/docs/search.index/desc/7c5a705df2ad.js
new file mode 100644
index 000000000..27f313f3e
--- /dev/null
+++ b/pr/427/docs/search.index/desc/7c5a705df2ad.js
@@ -0,0 +1 @@
+rd_("AmData flows in both directions0CdThe CE codepoint, signalling that congestion was \xe2\x80\xa600AjContains the success valueBeThe PathId of this path.BmReturns the PathId of this path.AoGet the identity of this stream00AfWhich path is now openAhWith path was abandoned.B`Which path had its state droppedAmPath which has changed statusCfPath over which the observed address was reported, \xe2\x80\xa6AlWhich stream is now readableAlWhich stream is now writableAnWhich stream has been finishedAmWhich stream has been stoppedAnType of the Long header packetBcExperimental! Use at your own risk.0ClWhether a stream communicates data in both directions or \xe2\x80\xa60AhContains the error valueAoThe largest representable valueAlThe maximum path ID allowed.10ClConnects to a QUIC perf server and maintains a specified \xe2\x80\xa6BmData flows only from the stream\xe2\x80\x99s initiator0AnWhich directions data flows in0CaDirectionality for which streams have been openedCdDirectionality for which streams are newly availableCjExplicit congestion notification bits to set on the packet0CeThe Explicit Congestion Notification bits for the \xe2\x80\xa61B`The current best RTT estimation.BeThe amount of I/O operations executed0BcLength of QUIC packet being decodedAlLength of the packet payload0BmThe number of bytes the associated buffer hasBbSet a custom TokenLog0CaMinimum RTT registered so far for this estimator.ClConstruct with an approximate maximum memory usage and a \xe2\x80\xa6CjConstruct an endpoint with arbitrary configuration and \xe2\x80\xa6DiCreates a new QlogConfig that writes a qlog trace to the \xe2\x80\xa6CiCreates a new qlog factory that writes files into the \xe2\x80\xa6D`Create a default config with a particular reset_keyCmCreate a default config with a particular handshake token \xe2\x80\xa6CkCreate a default config with a particular cryptographic \xe2\x80\xa6AmConstruct cid from byte arrayoConstruct emptyAeCreate a new StreamIdDjConstruct a state using the given config and current time \xe2\x80\xa600:8AeCreate a new endpointDcCreate a new instance of FixedLengthConnectionIdParserBdCreate a generator with a random key:987DgBegin decoding a QUIC packet from bytes, returning any \xe2\x80\xa67BkConstruct an error with a code and a reasonCgInitialize Random CID generator with a fixed CID length87666CkGet SystemTime::now() or the mocked equivalentAhLook up the current time01ChCurrent best estimate of this connection\xe2\x80\x99s latency \xe2\x80\xa6000ChThe ECT(0) codepoint, indicating that an endpoint is \xe2\x80\xa600ChThe ECT(1) codepoint, indicating that an endpoint is \xe2\x80\xa600CaA complete set of keys for a certain packet space0CbA Long packet header, as used during the handshakeChNot attributed to any particular FrameType.CkAn open network transmission within a multipath-enabled \xe2\x80\xa6Ab(Multi)Path eventsB`An error occurred during readingCeWhether an endpoint was the initiator of a connection0nThe 0 path id.0CaThe address observed by the remote over this pathCjThe source address of the datagram(s) contained in the \xe2\x80\xa6mType of errorBkCurrent congestion window of the connection0gPayloadAoReturns the argument unchanged.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BaCalls U::from(self).0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dNextCeMethod for opening a sealed message dataB`Open a single stream if possible1CgReturns the Path structure of an open pathBhPing the remote endpoint over this path.AhPing the remote endpointCkCheck whether the timer has expired, and register to be \xe2\x80\xa6BaReturns application-facing eventsBgRead data contiguously from the stream.AoRead from the given recv streamCcDecode TransportParameters from bufferBiReceive an unreliable, unordered datagramBlMethod for sealing message data0CiQueue an unreliable, unordered datagram for immediate \xe2\x80\xa6CbSends a Transmit on the given socket.CmNumber of address validation tokens sent to a client when \xe2\x80\xa60BmThe side of the connection (client or server)ChLook up whether we\xe2\x80\x99re the client or server of this \xe2\x80\xa6AlMethod for signing a message0CdAmount of data written to the caller-supplied buffer0hSpin bitAcStop accepting data0BoStop accepting data on the given receive streamCiTry to find and take a token that was stored with the \xe2\x80\xa60BgA chunk of data from the receive stream0CiThe RFC8312 congestion controller, as widely used for TCP0Borustls reports protocol errors using this type.0DbErrors encountered while decoding TransportParametersCdErrors that the nat traversal state might encounter.BeEvents of interest to the applicationCiEvent emitted when the client receives ADD_ADDRESS or \xe2\x80\xa6CjAttributed to a specific FrameType, never \xe2\x80\xa6A`Any other error.0CcThe peer abandoned transmitting data on this streamCnThe peer is unable to continue processing this connection, \xe2\x80\xa6CdThe peer abandoned transmitting data on this stream.1AeA Retry packet headerCdA short packet header, as used during the data phaseBiConstruct a fresh Controller0AiThe contents of the chunkCiThe total amount of bytes which have been transferred \xe2\x80\xa6BjThe amount of bytes which had been written210BnUnderlying error describing reason for failureBaClose the connection immediately.CnClose all of this endpoint\xe2\x80\x99s connections immediately and \xe2\x80\xa6AaCloses this path.AnClose a connection immediatelyBcFrame type that triggered the errorCcDistinguishes streams of the same initiator and \xe2\x80\xa60CjReturns whether the codepoint is a CE, signalling that \xe2\x80\xa60AgKey for encrypting data0BgParse a connection id from given bufferAhReturns all known paths.BlUpdate the timer to expire at iBbClose the send stream immediately.BeAbandon transmitting data on a streamCnRespond with a retry packet, requiring the client to retry \xe2\x80\xa60CiDrive future to completion in the backgroundCeShow connection stats the at the end of the benchmarkAmReturns connection statisticsBiReturns relevant stats from this EndpointCaReturns the PathStats for this path.2BcTitle to record in the qlog capture0CmWrite a buffer into this stream, returning how many bytes \xe2\x80\xa6AmSend data on the given streamCcEncode TransportParameters into bufferC`Future produced by Endpoint::acceptClPaths marked as backup will only be used if there are no \xe2\x80\xa6CeChunks returned from RecvStream::read().AmThe initiator of a connection0AdRun as a perf clientCgAttempted to initiate NAT traversal on a closed, or \xe2\x80\xa6CcFuture produced by Connection::open_biAjA new path has been openedChOne or more new streams has been opened and might be \xe2\x80\xa6ChId representing different paths when using multipath \xe2\x80\xa60AbCoding result typeAlThe acceptor of a connection0AdRun as a perf servermStream eventsAiAn integer less than 2^620CfGet the next incoming connection attempt from a clientClAttempt to accept this incoming connection (an error may \xe2\x80\xa6CcAccept a remotely initiated stream of a certain \xe2\x80\xa61C`The amount of full chunks which had been written0BlAllows to configure the desired cipher suiteCiHelper to construct an endpoint for use with outgoing \xe2\x80\xa6CcWait for the connection to be closed for any reasonAfCoding related traits.BnAccess the configuration used by this endpointChTraits and implementations for the QUIC cryptography \xe2\x80\xa6BjCreate QUIC error code from TLS alert codeBoTLS configuration used for incoming connections210BkAn underlying crypto (e.g. TLS) layer errorCgDecode a plain header from given buffer, with given \xe2\x80\xa6DiDecode a Self from the provided buffer, if the buffer is \xe2\x80\xa6ChThe destination IP address which was encoded in this \xe2\x80\xa6D`Append the encoding of self to the provided buffer.CmNotify the peer that no more data will ever be written to \xe2\x80\xa6CnFinish a send stream, signalling that no more data will be \xe2\x80\xa6B`Process an incoming UDP datagramAfHeader protection keys0ClIgnore this incoming connection attempt, not sending any \xe2\x80\xa60C`Potentially store a token for later one-time use0CfPerform NSS-compatible TLS key logging to the file \xe2\x80\xa6AhThe offset in the stream0B`Packet deliveries were confirmed0AfPacket protection keys0lRandom valueBcHuman-readable reason for the close000BhHuman-readable explanation of the reasonBeReason that the connection was closedBcReason why this path was abandoned.AjSwitch to a new UDP socketBgReject this incoming connection attempt0AgKey for decrypting dataAmThe remote side of this tuple1AmTLS interface based on rustls0CnHelper to construct an endpoint for use with both incoming \xe2\x80\xa6BkOptional source IP address for the datagram00CgThe current local PathStatus of this path.B`The new status set by the remoteCfThe size of a single datagram in the associated bufferCjStatistics about datagrams and bytes received on this pathCgStatistics about UDP datagrams received on a connection10CfStatistics about datagrams and bytes sent on this pathCjStatistics about UDP datagrams transmitted on a connection10AnMethod for verifying a message0CcNumber of ack-eliciting bytes that may be in flight0CaA key for sealing data with AEAD-based algorithms0A`Send would blockCcNo more data is currently available on this stream.CjThe peer is not able to accept additional data, or the \xe2\x80\xa6BfA catch-all error for unlikely errors.0BlA key for signing with HMAC-based algorithms0AhAn Initial packet headerBnA pair of keys for bidirectional communication0BhA simple, standard congestion controller0CdFuture produced by Connection::open_uniCkAbstracts I/O and timer operations for runtime independenceBfA cryptographic session (commonly TLS)0CcThe peer is no longer accepting data on this streamCfFuture returned from SendStream::stopped.ClThe peer is no longer accepting data on this stream, and \xe2\x80\xa6CkThe peer is no longer accepting data on this stream. No \xe2\x80\xa6CgThe peer asked us to stop sending on an outgoing streamAaAccess to streamsCaThe stream is larger than the user-supplied limitCnAttributed to some frame type this implementation does not \xe2\x80\xa6ClIndicates how many bytes and chunks had been transferred \xe2\x80\xa60l0-RTT packetCjReturns the length of a CID for connections created by \xe2\x80\xa60CdProvide the length of dst_cid in short header packetCcThe total number of clients which should be createdAlConnect to a remote endpointAeInitiate a connectionCgDecrypt the packet payload with the given packet numberBcDecrypt the given packet\xe2\x80\x99s header10ClConstructs a value with arbitrary fields, intended to be \xe2\x80\xa6DjConstruct an event that indicating that a Connection will \xe2\x80\xa6BkThe destination connection ID of the packetBkThe destination Connection ID of the packetAiDestination Connection ID00000CgEncrypt the packet payload with the given packet numberBcEncrypt the given packet\xe2\x80\x99s header10Abiroh NAT TraversalCbCheck if this stream has been opened during 0-RTT.0CmRetrieve implementation-specific metrics used to populate \xe2\x80\xa60CnThe maximum UDP payload size guaranteed to be supported by \xe2\x80\xa60BbOne or more packets were just sent0BmInitiate a new outgoing bidirectional stream.CaReturns the path ID of the new path being opened.AdSource Connection ID0000CiCompletes when the peer stops the stream or reads the \xe2\x80\xa6CjCheck if this stream was stopped, get the reason if it wasCcThe total number of streams which should be createdAlProvide control over streamsCeThe length of the AEAD tag appended to packets on \xe2\x80\xa60CdUpgrade the handle to a full ConnectionB`Upgrades to a Path.AkSet the QUIC version to use0lQUIC versionB`The version that was unsupported11CeFuture produced by Connection::accept_biAfAn unreliable datagramBdDatagram support is disabled locally0A`A QUIC endpoint.BcThe main entry point to the libraryChA finished stream has been fully acknowledged or stoppedCkAn incoming connection for which the server has not yet \xe2\x80\xa60BoLong packet types with uniform header structureB`The largest encoded value length0Cmthe connection is being closed abruptly in the absence of \xe2\x80\xa60CeFuture returned by Connection::on_closedClFuture produced by crate::Connection::open_pathCmA currently open stream likely has data or errors waiting \xe2\x80\xa6CkMetadata for a single buffer filled with bytes received \xe2\x80\xa6BkResponse generated directly by the endpointCfIdentifier for a stream within a particular connection0CnCommunication with the peer has lapsed for longer than the \xe2\x80\xa6CkWe didn\xe2\x80\x99t receive any data from the remote within the \xe2\x80\xa61ChResponsible for limiting clients\xe2\x80\x99 ability to reuse \xe2\x80\xa60ClThe datagram is larger than the connection can currently \xe2\x80\xa60AbAn outgoing packet00CmStatistics about UDP datagrams transmitted or received on \xe2\x80\xa60CnA formerly write-blocked stream might be ready for a write \xe2\x80\xa6AkCongestion algorithm to useAhContents of the datagramBoMark the read data as consumed from the stream.C`Statistics about frames received on a connection0CcStatistics about frames transmitted on a connection0DhConstructs cid by reading len bytes from a Buf0DkCreates a new qlog factory that writes files into QLOGDIR, \xe2\x80\xa60BfCreate a generator with a specific keyBjConstruct a VarInt infallibly0BeSucceeds iff x < 2^620AeWhat type we receivedAoWhat handshake type we received10CbWhether 0-RTT is/was possible during the handshakeCmSpecifies the time to wait after completing MTU discovery \xe2\x80\xa60CcReturns Self for use in down-casting to extract \xe2\x80\xa60EhReturns true if the Connection associated with this handle \xe2\x80\xa6CmDuration after an address validation token was issued for \xe2\x80\xa60CeThe local IP address which was used when the peer \xe2\x80\xa6000AmThe local side of this tuple.ClCompute the maximum size of datagrams that may be passed \xe2\x80\xa6BnInitiate a new outgoing unidirectional stream.BcGet the priority of the send streamAlGet the priority of a streamCfThe negotiated application protocol, if ALPN is in use0Aeqlog output directoryBbOptional response to transmit backCiOptional seed to be used internally for random number \xe2\x80\xa60AlSlow start threshold (bytes)0BeSucceeds iff x < 2^6200000DaSends a Transmit on the given socket without any \xe2\x80\xa6DkQuickly determine whether cid could have been generated by \xe2\x80\xa600BmA path was abandoned and is no longer usable.CfFuture produced by Connection::accept_uniCdPaths marked with as available will be used when \xe2\x80\xa6CnAt least one new stream of a certain directionality may be \xe2\x80\xa6ClConfiguration for the Bbr congestion controller0BkThe connection was successfully establishedAoAPI to control datagram trafficAlDecoding of QUIC primitives.CkA path was discarded and all remaining state for it has \xe2\x80\xa6BgInfallible encoding of QUIC primitives.CnIdentifies a network path by the combination of remote and \xe2\x80\xa6A`Handshake packetBcKeys used to protect packet headers0CiCatch-all error for problems while decoding transport \xe2\x80\xa6CeNat traversal attempt failed due to a multipath errorBdKeys used to protect packet payloads0BmErrors that might trigger a path being closedAnApplication events about pathsBiStatistics related to a transmission path0AeA read error occurredBmErrors that arise from reading from a stream.C`Errors triggered when reading from a recv streamCiAn object for asynchronously writing to an associated \xe2\x80\xa6BmAccept the next incoming bidirectional streamBbDuplicate the controller\xe2\x80\x99s state0BdThe amount of UDP datagrams observedAaControl datagrams1BeCreate new object from the given bits00BoWhich side of a connection initiated the stream0CmConvert into a 0-RTT or 0.5-RTT connection at the cost of \xe2\x80\xa6BoShorthand for self == Side::Client0B`Whether the connection is closedBoShorthand for self == Side::Server0CbWhether it is legal to respond with a retry packet0CdWhether to allow clients to migrate to new addresses0CdConstruct a timer that will expire at iCjWait for the connection to be closed without keeping a \xe2\x80\xa6CjOpens an additional path if the multipath extension is \xe2\x80\xa6A`Opens a new pathBmPing the remote endpoint over a specific pathCiAttempts to read from the stream into the provided bufferCeReceive UDP datagrams, or register to be woken if \xe2\x80\xa6CkSend a UDP datagram, or register to be woken if sending \xe2\x80\xa6ClPrivate key used to send authenticated connection resets \xe2\x80\xa60BmGenerate the integrity tag for a retry packet0BgA stable identifier for this connectionCePrivate key used to authenticate data included in \xe2\x80\xa60BlThe position of a token in the packet bufferCgTransport configuration to use for incoming connections0CjWait for all connections on the endpoint to be cleanly \xe2\x80\xa6BoWrite a buffer into this stream in its entiretyCiAbstract implementation of an async timer for runtime \xe2\x80\xa6BoNumber of UDP packets to send/receive at a timeCkError indicating that a path has not been opened or has \xe2\x80\xa6BnThe path is already closed or was never opened1BeIn-progress connection attempt futureAbA QUIC connection.CeProtocol state and logic for a single QUIC connectionCeCommon interface for different congestion controllers0CkNumber of frames transmitted or received of each frame type0BoThe connection ID was not recognized by the \xe2\x80\xa60DdThe type used to refer to FrameTypes in closing and \xe2\x80\xa6AnThe QUIC-MULTIPATH path statusBeConfiguration for qlog trace logging.0BnA stream that can only be used to receive dataAaAccess to streamsChErrors that arise while waiting for a stream to be resetDhError for attempting to retry an Incoming which already \xe2\x80\xa60BkA stream that can only be used to send data3BmObject to get current SystemTime0AdA rustls TLS session0CkResponsible for storing validation tokens received from \xe2\x80\xa60AeA borrowed UDP socketBjErrors that arise from writing to a streamBoErrors triggered while writing to a send streamBoAccept the next incoming uni-directional streamCkWhether the implementation is permitted to set the spin \xe2\x80\xa60CiCloses a path and sends a PATH_ABANDON frame with the \xe2\x80\xa6CdLogic for controlling the rate at which data is sent0BfWhether to print connection statisticsBnClass of error as encoded in the specificationB`Application-specific reason code10CaThe error code to be sent with the abandon frame.BoThe error that was sent with the abandon frame.AoError code supplied by the peerBcType of frame that caused the close0AiExtract the integer value0BfQUIC transport protocol implementationCnWhether there is no longer any need to keep the connection \xe2\x80\xa6DkDetermine whether this is the last event a Connection will \xe2\x80\xa6CiLook up the local IP address and port used by this socketDgGet the local SocketAddr the underlying socket is bound toBeThe amount of bytes lost on this path0CjPad UDP datagrams carrying application data to current \xe2\x80\xa60AgReturns path statistics0CjThe final path stats, they are no longer available via \xe2\x80\xa6C`Attempt to write bytes from buf into the stream.AmRead the next segment of dataAoReads the next segment of data.CkRead an exact number of bytes contiguously from the stream.BnSets the PathStatus of this path.BoEpoch qlog event times are recorded relative to0ClError type for attempting to accept an IncomingBjErrors in the configuration of an endpoint0AeGeneric crypto errors0CnConfiguration for the Cubic congestion controller0CdReasons why attempting to finish a stream might failCnMaximum duration of inactivity to accept before timing out \xe2\x80\xa60AnValue exceeds supported bounds0D`Constructs a QlogConfig for individual connections.0AhA Quinn runtime for smolB`Application events about streamsCbAccept this incoming connection using a custom \xe2\x80\xa6CdLargest UDP payload size the path currently supportsClStorage size required for the largest packet that can be \xe2\x80\xa61BiDescription to record in the qlog capture0BjThe socket this datagram should be sent to00BkStarting guess for maximum UDP payload sizeCkThe initial value to be used as the maximum UDP payload \xe2\x80\xa60ChUDP payload size that the network must be capable of \xe2\x80\xa6BjThe RTT used before an RTT sample is taken0BfThe initial round-trip-time (in msecs)CeThe amount of concurrent streams which should be usedDdPackets are acked in batches, all with the same now \xe2\x80\xa60AdPacing rate (bits/s)0DiA broadcast receiver of PathEvents for all paths in this \xe2\x80\xa6DfGets the local PathStatus for a known PathIdAnRead the next segments of dataCkConvenience method to read all remaining data into a bufferAlProvide control over streamsBoThe sample size used for this key\xe2\x80\x99s algorithm01CiMaximum number of bytes to transmit to a peer without \xe2\x80\xa600BoThe server name specified by the client, if any0BmObject to get current SystemTime0BdSet a custom TokenStore0CaNumber of bytes to transmit from client to serverCnSpecifies the upper bound to the max UDP payload size that \xe2\x80\xa60ChReturns a weak reference to the inner connection struct.CdReturns a WeakPathHandle for this path.DgCreate a server config with the given crypto::ServerConfig0CeSets a prefix to the filename of the generated files.0DbWrite a single Bytes into this stream in its entiretyBbAn ADD_ADDRESS frame was received.BfConfiguration for outgoing connectionsCaClient-side configuration for the crypto protocol10CgThe stream has already been stopped, finished, or resetBmThe stream has already been finished or resetCmError indicating that a stream has not been opened or has \xe2\x80\xa6CjThe stream has not been opened or was already stopped, \xe2\x80\xa6CfThe stream has not been opened or has already been \xe2\x80\xa6CmThe stream has not been opened or was already finished or \xe2\x80\xa63CgErrors in the parameters being used to create a new \xe2\x80\xa60BkProtocol-level identifier for a connection.0CkWe couldn\xe2\x80\x99t decrypt a message. This is invariably fatal.0BjExplicit congestion notification codepoint00CnWe couldn\xe2\x80\x99t encrypt a message because it was larger than \xe2\x80\xa60BhParameters that are semantically invalidCaThis is the last path, which can not be abandonedAmIroh\xe2\x80\x99s nat traversal eventsDhNull implementation of TokenLog, which never accepts tokens0ClReceived an observation of our external address from the \xe2\x80\xa6CiFuture produced by Connection::read_datagramBiThe remote changed the status of the pathBlRTT estimation for a particular network pathCnFuture produced by Connection::send_datagram_waitBiParameters governing incoming connectionsCaServer-side configuration for the crypto protocol10CmErrors that arise while monitoring for a send stream stop \xe2\x80\xa6AiA Quinn runtime for TokioC`Returns the lifetime of generated Connection IDs0BlIf the connection is closed, the reason why.CjConnect to a remote endpoint using a custom configuration.AlConservative estimate of RTTBnGet the 0-RTT keys if available (clients only)0AgWhich types we expectedB`Which handshake type we expected10AcGenerates a new CID0ClThe number of segments to read when GRO is enabled. Used \xe2\x80\xa6DeProcess ConnectionEvents generated by the associated \xe2\x80\xa6EaProcess EndpointEvents emitted from related ConnectionsCgCreate the initial set of keys given the client\xe2\x80\x99s \xe2\x80\xa6000BgThe amount of packets lost on this path0DcMaximum number of Incoming to allow to exist at a time0CjWhether datagrams might get fragmented into multiple parts0CmWhether transmitted datagrams might get fragmented by the \xe2\x80\xa6CkReturns the path\xe2\x80\x99s network path represented as a 4-tuple.CkThe original destination CID when initiating the connectionCiThe original destination connection ID sent by the clientDhReturns the next time at which handle_timeout should be \xe2\x80\xa6D`Configures qlog capturing by setting a QlogFactory.0CkThe segment size if this transmission contains multiple \xe2\x80\xa600ChThe number of streams that may have unacknowledged data.CbSet the lifetime of CIDs created by this generator0BcSet the priority of the send streamAlSet the priority of a streamCnInitialize a QUIC-compatible TLS client configuration with \xe2\x80\xa6000DgWrite a slice of Bytes into this stream, returning how \xe2\x80\xa6AmSend data on the given streamCkWe received a fatal alert. This means the peer is unhappy.0BhBloom filter-based TokenLog0CmThe connection could not be created because not enough of \xe2\x80\xa6000CaEvent resulting from processing a single datagramBlEvents sent from a Connection to an EndpointAoStatistics on Endpoint activityBnThe stream finished before all bytes were readBlAuthentication data for (rustls) TLS session0Ccreceived an invalid Retry Token in a client Initial0AlThe packet header is invalidBkThe local application closed the connection0DaThe datagram may result in starting a new ConnectionD`Configuration for the NewReno congestion controller0BjDecodes a QUIC packet\xe2\x80\x99s invariant headerCgErrors triggered when opening a recv stream for readingCaDefault implementation of TimeSource0CgError indicating that the provided buffer was too smallChFor clients, if the peer accepted the 0-RTT data packetsAbAck Frequency modeAfExports for benchmarksBoSupply a custom connection ID generator factory0DgCreate a UdpSender that can register a single task for \xe2\x80\xa6CaNumber of bytes to transmit from server to clientAmGet the Incoming0CnThe max_ack_delay we will request the peer to use0CgDisable packet encryption/decryption (for debugging \xe2\x80\xa6CkThe known MTU for the current network path has been updated0BbCryptographic identity of the peerBgGet the peer\xe2\x80\x99s identity, if availableDhFor the rustls TlsSession, the Any type is \xe2\x80\xa610CnAttempts to read from the stream into the provided buffer, \xe2\x80\xa6AkReturns packets to transmitDjConfigures qlog capturing through the QLOGDIR environment \xe2\x80\xa60AoReceive an application datagramDfTransmit data as an unreliable, unordered application \xe2\x80\xa6CmWhether to implement fair queuing for send streams having \xe2\x80\xa60BfLength of sign\xe2\x80\x99s output0BnStart a client session with this configurationBnStart a server session with this configuration10BdA REMOVE_ADDRESS frame was received.CgAbstract implementation of a UDP socket for runtime \xe2\x80\xa6BgErrors triggered when abandoning a pathAgThe connection was lost00000ChGlobal configuration for the endpoint, affecting all \xe2\x80\xa60Cithe endpoint encountered an internal error and cannot \xe2\x80\xa60FbBasic adapter to let Incoming be await-ed like a ConnectingBhEncounter a frame ID that was not valid.CeThe peer sent us a TLS message with invalid contents.0Amno viable network path exists0DhNull implementation of TokenStore, which does not store \xe2\x80\xa60CiThe peer deviated from the standard TLS protocol. The \xe2\x80\xa60BmErrors that arise from reading from a stream.C`Errors from RecvStream::read_to_endCaIndicates whether a frame needs to be transmittedCmThe peer violated the QUIC specification as understood by \xe2\x80\xa60CiTransport-level errors occur when a peer violates the \xe2\x80\xa6C`Tokio-compatible UDP socket with some useful \xe2\x80\xa6DiWeak handle for a Path that does not keep the connection \xe2\x80\xa6AfDerive AEAD using hkdf0BnCreate a client endpoint and client connectionAgGet a session referenceDiReturns a QlogConfig for a connection, if logging should \xe2\x80\xa60AiProcess timer expirationsBjParameters negotiated during the handshake0CfGet data negotiated during the handshake, if available0AiInitial congestion windowCiDefault limit on the amount of outstanding data in bytes.001000BnConverts this stream into an unordered stream.CjUniform interface to send and receive UDP packets with \xe2\x80\xa6DdReturns true until the connection is fully established.CeWhether the connection is in the process of being \xe2\x80\xa61BfVerify the integrity of a retry packet0CnSpecifies the minimum MTU change to stop the MTU discovery \xe2\x80\xa60BdCompute keys for the next key update0BkConfigures qlog capturing into a directory.0AlRead bytes of handshake data0BeWhether to use the unordered read APIClMaximum number of bytes the peer may transmit across all \xe2\x80\xa600CkCompletes when the stream has been reset by the peer or \xe2\x80\xa60CiCheck whether this stream has been reset by the peer, \xe2\x80\xa6AjThe peer\xe2\x80\x99s UDP addressesAhThe peer\xe2\x80\x99s UDP address0BgThe peer\xe2\x80\x99s UDP address for this path.1CeSaturating integer addition. Computes self + rhs, \xe2\x80\xa6000ChSaturating integer subtraction. Computes self - rhs, \xe2\x80\xa60CkMaximum reordering in time space before time based loss \xe2\x80\xa60ChReason given by the transport for closing the connection0BfReasons why a connection might be lost0CiThe datagram is redirected to its ConnectionBlEvents sent from an Endpoint to a ConnectionAeConnection statistics0BiStatistics for the currently open streamsAcPlain packet headerBkEnables writing qlog traces to a directory.0AkThe remote closed the path.CfError for when a validation token may have been reused0C`Parameters governing the core QUIC state machine0CbThe peer doesn\xe2\x80\x99t implement any supported version0CdFuture that completes when a connection is fully \xe2\x80\xa6CbThis was a 0-RTT stream and the server rejected it000CjAutomatically select an appropriate runtime from those \xe2\x80\xa6CkWhether to accept QUIC packets containing any value for \xe2\x80\xa60CdMaximum number of incoming packets that may fail \xe2\x80\xa60CnThe interface index of the interface on which the datagram \xe2\x80\xa6AjSwitch to a new UDP socketCiCreates a server endpoint which runs on the given runtimeD`Sets the PathStatus for a known PathIdCfSee proto::TransportConfig::send_window()BoSee TransportConfig::send_window()BmReturns whether a frame should be transmittedD`Convert t into the socket type used by this runtimeCdWrites handshake bytes into the given buffer and \xe2\x80\xa60ClStream produced by Path::observed_external_addrCiReason given by an application for closing the connection0CbThe peer\xe2\x80\x99s QUIC stack aborted the connection \xe2\x80\xa60DjInternal identifier for a Connection currently associated \xe2\x80\xa6CdOne or more application datagrams have been receivedCaThe endpoint can no longer create new connections0Cnreceived a STREAM frame or a RESET_STREAM frame containing \xe2\x80\xa60ClSpecific failure cases from keys_match or a \xe2\x80\xa60A`key update error0CaCurrent limits do not allow us to open more pathsClThe peer doesn\xe2\x80\x99t support a protocol version/feature we \xe2\x80\xa60BjA QUIC-compatible TLS client configuration0BjA QUIC-compatible TLS server configuration0EfTokenStore implementation that stores up to N tokens per \xe2\x80\xa60CgAn endpoint (local or remote) tried to add too many \xe2\x80\xa6CmWe didn\xe2\x80\x99t receive a path response in time after opening \xe2\x80\xa6CaPath could not be validated and will be abandonedBcA Version Negotiation packet headerCiRecord that the token was used and, ideally, return a \xe2\x80\xa60CjCurrent state of the congestion control algorithm, for \xe2\x80\xa6CcCurrent state of this connection\xe2\x80\x99s congestion \xe2\x80\xa6BaUpdate traffic keys spontaneously0BoLow-level protocol logic for the QUIC protoocolCnThe maximum amount of segments which can be transmitted if \xe2\x80\xa6CnMaximum duration of inactivity to accept before timing out \xe2\x80\xa60CeGet the number of connections that are currently openBmNumber of connections that are currently openCiOpens a new path if no path exists yet for the remote \xe2\x80\xa6CmOpens a new path only if no path on the same network path \xe2\x80\xa6CiMaximum reordering in packet number space before FACK \xe2\x80\xa60CfGet the size of the socket receive bufferAlReceive buffer size in bytesCcGet the size of the socket send bufferAiSend buffer size in bytesBiSet a custom TransportConfig000ChConfiguration for sending and handling validation tokens0CnCreate a server config with the given certificate chain to \xe2\x80\xa60DdWrite a slice of Bytes into this stream in its entiretyCfthe application or application protocol caused the \xe2\x80\xa60AnThe peer closed the connectionBoThe path was closed locally by the application.1B`Constructs controllers on demand0BdCommon congestion controller metrics0AlA pseudo random key for HKDF0BcThe given server name was malformed0CbHints when the caller identifies a network change.0AcPacket decode errorBdReason for why a path was abandoned.BmErrors that can arise when sending a datagram0CcThe peer does not support receiving datagram frames0BcCongestion events on the connection0AiCongestion window (bytes)0ClCompute the maximum size of datagrams that may be passed \xe2\x80\xa6BoBytes available in the outgoing datagram bufferClReplace the server configuration, affecting new incoming \xe2\x80\xa60Cmthe endpoint has reached the confidentiality or integrity \xe2\x80\xa60CkParameters for controlling the peer\xe2\x80\x99s acknowledgement \xe2\x80\xa60DjThe max_fragment_size value supplied in configuration was \xe2\x80\xa60Bmthe server refused to accept a new connection0BjParse connection id in short header packetCjOne or more application datagrams have been sent after \xe2\x80\xa6Ckreceived more data than permitted in advertised data limits0AoThe TLS handshake was confirmedBjThe connection\xe2\x80\x99s handshake data is readyCeAttempted an ordered read following an unordered readAnWe saw an invalid certificate.0BcParameters governing MTU discovery.0BnNot enough addresses to complete the operationCkdetected an error with protocol compliance that was not \xe2\x80\xa60Cjreceived a frame for a stream identifier that exceeded \xe2\x80\xa60Cnreceived a frame for a stream that was not in a state that \xe2\x80\xa60AnError from setting path statusAjTransport-level error code0ChThe local endpoint does not support the QUIC version \xe2\x80\xa6CkError indicating that the specified QUIC version is not \xe2\x80\xa61C`Packet uses a QUIC version that is not supported1CiMaximum quantity of out-of-order crypto layer data to \xe2\x80\xa60C`Create a VarInt without ensuring it\xe2\x80\x99s in range0ChCumulative number of Quic handshakes ignored on this \xe2\x80\xa6EgReturns true if the two WeakConnectionHandle point at the \xe2\x80\xa6CiMinimum interval between outgoing stateless reset packets0CjConstruct with an approximate maximum memory usage and \xe2\x80\xa60ChCumulative number of Quic handshakes refused on this \xe2\x80\xa6AnReturns the remote path statusDfTransmit data as an unreliable, unordered application \xe2\x80\xa6CiSee proto::TransportConfig::receive_window()CbSee TransportConfig::receive_window()B`Override supported QUIC versions0CiOverride the instant relative to which all events are \xe2\x80\xa60BkNo remote CIDs available to open a new pathCkTransport parameters used to negotiate connection-level \xe2\x80\xa6CgA stream that can be used to receive data out-of-order.CmThe certificate verifier doesn\xe2\x80\x99t support the given type \xe2\x80\xa60CfThe operation is not allowed for this endpoint\xe2\x80\x99s \xe2\x80\xa6CiCumulative number of Quic handshakes accepted by this \xe2\x80\xa6CjSpecifies the amount of time that MTU discovery should \xe2\x80\xa60CiIf the 0-RTT-encrypted data has been accepted by the peer0BgWait for the handshake to be confirmed.CgInform the connection if a path may recover after a \xe2\x80\xa60CgPeriod of inactivity before sending a keep-alive packet0CiThe amount of PLPMTUD probe packets lost on this path \xe2\x80\xa60BlPackets were deemed lost or marked congested0CgCumulative number of Quic handshakes sent from this \xe2\x80\xa6CnThe number of remotely initiated open streams of a certain \xe2\x80\xa6AhBench fns for SendBufferCiThe amount of PLPMTUD probe packets sent on this path \xe2\x80\xa60Bireceived a frame that was badly formatted0CkThis function doesn\xe2\x80\x99t work until the TLS handshake is \xe2\x80\xa60CkWe received a TLS message that isn\xe2\x80\x99t valid right now. \xe2\x80\xa60CiThe remote SocketAddr supplied was malformedCkThe remote address for the path is not supported by the \xe2\x80\xa61ChThe initial cipher suite (AES-128-GCM-SHA256) is not \xe2\x80\xa60BdPaths can only be opened client-sideDmError returned when constructing a VarInt from a value >= \xe2\x80\xa60CeA handle to some connection internals, use with care.DkSpecifies the ACK frequency config (see AckFrequencyConfig \xe2\x80\xa60CiThe number of times a black hole was detected in the path0CgMaximum number of received bytes to buffer for each \xe2\x80\xa60AeIs multipath enabled?ClMaximum number of datagrams that might be described by a \xe2\x80\xa60CkMaximum UDP payload size accepted from peers (excluding \xe2\x80\xa60AmMax UDP payload size in bytesDkSpecifies the MTU discovery config (see MtuDiscoveryConfig \xe2\x80\xa60AmReturn endpoint-facing eventsCkThe preferred IPv4 address that will be communicated to \xe2\x80\xa60CkThe preferred IPv6 address that will be communicated to \xe2\x80\xa60ChThe reordering threshold we will request the peer to use0ClDuration after a retry token was issued for which it\xe2\x80\x99s \xe2\x80\xa60C`Sets the keep_alive_interval for a specific pathDfResize the receive buffer of socket to bytesDcResize the send buffer of socket to bytesBfThe peer\xe2\x80\x99s QUIC transport parametersBdQUIC connection transport parameters1CaGenerates connection IDs for incoming connections0CdAn incoming connection did not support any known \xe2\x80\xa60BjNo default client configuration was set up0BiPath abandoned due to unstable interfaces0ClConfiguration for sending and handling validation tokens \xe2\x80\xa60CmMaximum number of packets that may be sent using a single \xe2\x80\xa60CiNotify connections that the local network address has \xe2\x80\xa6ChHandle a change in the local address, i.e. an active \xe2\x80\xa6CiCounter for the number of bytes currently used in the \xe2\x80\xa6CgReturns whether we think the other address probably \xe2\x80\xa6CkReduction in congestion window when a new loss event is \xe2\x80\xa60DdMaximum number of datagrams that a Transmit may encode.0DjA broadcast receiver of iroh_hp::Events for updates about \xe2\x80\xa6CjGet the address observed by the remote over the given pathCiMaximum number of bytes the peer may transmit without \xe2\x80\xa600Chreceived more data in CRYPTO frames than can be buffered0B`The extension was not negotiatedCbWe failed to figure out what time it currently is.0CbWe failed to acquire random bytes from the system.0CnError indicating that this operation requires multipath to \xe2\x80\xa6BnThe extension was not negotiated with the peerAkMultipath is not negotiatedCnError when the multipath extension was not negotiated, but \xe2\x80\xa6BnHeader of an Initial packet, before decryptionCgDerive keying material from this connection\xe2\x80\x99s TLS \xe2\x80\xa6EdFill output with output.len() bytes of keying material \xe2\x80\xa60BnPathological case: many segments, get from endCfGet segments in the old way, using a loop of get callsClCurrent number of remotely initiated streams that may be \xe2\x80\xa6ClTrack changed on our external address as reported by the \xe2\x80\xa6ClTrack changes on our external address as reported by the \xe2\x80\xa6CmCreate a client configuration that trusts specified trust \xe2\x80\xa60BkThe peer didn\xe2\x80\x99t give us any certificates.0BkThe peer sent an oversized record/fragment.0CkThe ack-eliciting threshold we will request the peer to use0BiWhether there are any pending retransmitsCdWhether the Multipath for QUIC extension is enabled.C`Sets the keep_alive_interval for a specific pathBoSet a custom ValidationTokenConfig0BmPath abandoned at the application\xe2\x80\x99s request0CjThe path was opened in a NAT traversal round which was \xe2\x80\xa6CjGet the current value of max_udp_payload_size0ChConfigure how to populate the destination CID of the \xe2\x80\xa60CjConstruct an endpoint with arbitrary configuration and \xe2\x80\xa6CfWhether the socket address that is initiating this \xe2\x80\xa60CmModify the number of open paths allowed when multipath is \xe2\x80\xa6Cmthe number of connection IDs provided by the peer exceeds \xe2\x80\xa60CbError returned by Session::export_keying_material.0CiA provided certificate revocation list (CRL) was invalid.0CmPath abandoned due to no available connection IDs for the \xe2\x80\xa60Clreceived transport parameters that were badly formatted, \xe2\x80\xa60CiRegisters one address at which this endpoint might be \xe2\x80\xa6ClAdd addresses the local endpoint considers are reachable \xe2\x80\xa6ClMaximum number of outgoing application datagram bytes to \xe2\x80\xa60CiSet the client configuration used by connectBmSets the max_idle_timeout for a specific pathBfThe QUIC protocol version implemented.CfThe path became unusable after a local network change.BoBytes available in the outgoing datagram bufferDhMaximum number of received bytes to buffer for all Incoming0DaVariant of max_concurrent_bidi_streams affecting \xe2\x80\xa60ClModify the number of remotely initiated streams that may \xe2\x80\xa6CnCreate a client configuration that trusts the platform\xe2\x80\x99s \xe2\x80\xa60CkGenerates 8-byte connection IDs that can be efficiently \xe2\x80\xa6CkAn error occurred while handling Encrypted Client Hello \xe2\x80\xa60CkPath abandoned due to resource limitations in the transport0CiGenerates purely random connection IDs of a specified \xe2\x80\xa6ChWhether to use \xe2\x80\x9cGeneric Segmentation Offload\xe2\x80\x9d to \xe2\x80\xa60CmMaximum number of incoming bidirectional streams that may \xe2\x80\xa60BhUpdates this tuple\xe2\x80\x99s local address iffClMaximum number of incoming application datagram bytes to \xe2\x80\xa60BcInitiates a new nat traversal round0BdPackets were incorrectly deemed lost0CnRemoves one or more addresses from the set of addresses at \xe2\x80\xa6CgRemoves an address the endpoing no longer considers \xe2\x80\xa6C`Sets the keep_alive_interval for a specific pathDeA ConnectionIdParser implementation that assumes the \xe2\x80\xa6CjWe received a TLS handshake message that isn\xe2\x80\x99t valid \xe2\x80\xa60CiHow to construct new congestion::Controllers0BlSets a default per-path maximum idle timeout0BoThe key exchange group negotiated with the peer0CbWhether to send observed address reports to peers.0CiModify the number of remotely initiated bidirectional \xe2\x80\xa6BiEnables the Multipath Extension for QUIC.0CjModify the number of remotely initiated unidirectional \xe2\x80\xa6CeNumber of consecutive PTOs after which network is \xe2\x80\xa60BkSets a default per-path keep alive interval0CjWhether to receive observed address reports from other \xe2\x80\xa60BmGet the current local nat traversal addresses0CkGet the currently advertised nat traversal addresses by \xe2\x80\xa60AcNat traversal draftCkSets the maximum number of nat traversal addresses this \xe2\x80\xa60CjWhen multipath is required and has not been explicitly \xe2\x80\xa6")
\ No newline at end of file
diff --git a/pr/427/docs/search.index/desc/a3c3362ea926.js b/pr/427/docs/search.index/desc/a3c3362ea926.js
deleted file mode 100644
index 2f5095e44..000000000
--- a/pr/427/docs/search.index/desc/a3c3362ea926.js
+++ /dev/null
@@ -1 +0,0 @@
-rd_("AmData flows in both directions0CdThe CE codepoint, signalling that congestion was \xe2\x80\xa600AjContains the success valueBeThe PathId of this path.BmReturns the PathId of this path.AoGet the identity of this stream00AfWhich path is now openAhWith path was abandoned.B`Which path had its state droppedAmPath which has changed statusCfPath over which the observed address was reported, \xe2\x80\xa6AlWhich stream is now readableAlWhich stream is now writableAnWhich stream has been finishedAmWhich stream has been stoppedAnType of the Long header packetBcExperimental! Use at your own risk.0ClWhether a stream communicates data in both directions or \xe2\x80\xa60AhContains the error valueAoThe largest representable valueAlThe maximum path ID allowed.10ClConnects to a QUIC perf server and maintains a specified \xe2\x80\xa6BmData flows only from the stream\xe2\x80\x99s initiator0AnWhich directions data flows in0CaDirectionality for which streams have been openedCdDirectionality for which streams are newly availableCjExplicit congestion notification bits to set on the packet0CeThe Explicit Congestion Notification bits for the \xe2\x80\xa61B`The current best RTT estimation.BeThe amount of I/O operations executed0BcLength of QUIC packet being decodedAlLength of the packet payload0BmThe number of bytes the associated buffer hasBbSet a custom TokenLog0CaMinimum RTT registered so far for this estimator.ClConstruct with an approximate maximum memory usage and a \xe2\x80\xa6CjConstruct an endpoint with arbitrary configuration and \xe2\x80\xa6DiCreates a new QlogConfig that writes a qlog trace to the \xe2\x80\xa6CiCreates a new qlog factory that writes files into the \xe2\x80\xa6D`Create a default config with a particular reset_keyCmCreate a default config with a particular handshake token \xe2\x80\xa6CkCreate a default config with a particular cryptographic \xe2\x80\xa6AmConstruct cid from byte arrayoConstruct emptyAeCreate a new StreamIdDjConstruct a state using the given config and current time \xe2\x80\xa600:8AeCreate a new endpointDcCreate a new instance of FixedLengthConnectionIdParserBdCreate a generator with a random key:987DgBegin decoding a QUIC packet from bytes, returning any \xe2\x80\xa67BkConstruct an error with a code and a reasonCgInitialize Random CID generator with a fixed CID length87666CkGet SystemTime::now() or the mocked equivalentAhLook up the current time01ChCurrent best estimate of this connection\xe2\x80\x99s latency \xe2\x80\xa6000ChThe ECT(0) codepoint, indicating that an endpoint is \xe2\x80\xa600ChThe ECT(1) codepoint, indicating that an endpoint is \xe2\x80\xa600CaA complete set of keys for a certain packet space0CbA Long packet header, as used during the handshakeChNot attributed to any particular FrameType.CkAn open network transmission within a multipath-enabled \xe2\x80\xa6Ab(Multi)Path eventsB`An error occurred during readingCeWhether an endpoint was the initiator of a connection0nThe 0 path id.0CaThe address observed by the remote over this pathCjThe source address of the datagram(s) contained in the \xe2\x80\xa6mType of errorBkCurrent congestion window of the connection0gPayloadAoReturns the argument unchanged.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000BaCalls U::from(self).0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dNextCeMethod for opening a sealed message dataB`Open a single stream if possible1CgReturns the Path structure of an open pathBhPing the remote endpoint over this path.AhPing the remote endpointCkCheck whether the timer has expired, and register to be \xe2\x80\xa6BaReturns application-facing eventsBgRead data contiguously from the stream.AoRead from the given recv streamCcDecode TransportParameters from bufferBiReceive an unreliable, unordered datagramBlMethod for sealing message data0CiQueue an unreliable, unordered datagram for immediate \xe2\x80\xa6CbSends a Transmit on the given socket.CmNumber of address validation tokens sent to a client when \xe2\x80\xa60BmThe side of the connection (client or server)ChLook up whether we\xe2\x80\x99re the client or server of this \xe2\x80\xa6AlMethod for signing a message0CdAmount of data written to the caller-supplied buffer0hSpin bitAcStop accepting data0BoStop accepting data on the given receive streamCiTry to find and take a token that was stored with the \xe2\x80\xa60BgA chunk of data from the receive stream0CiThe RFC8312 congestion controller, as widely used for TCP0Borustls reports protocol errors using this type.0DbErrors encountered while decoding TransportParametersCdErrors that the nat traversal state might encounter.BeEvents of interest to the applicationCiEvent emitted when the client receives ADD_ADDRESS or \xe2\x80\xa6CjAttributed to a specific FrameType, never \xe2\x80\xa6A`Any other error.0CcThe peer abandoned transmitting data on this streamCnThe peer is unable to continue processing this connection, \xe2\x80\xa6CdThe peer abandoned transmitting data on this stream.1AeA Retry packet headerCdA short packet header, as used during the data phaseBiConstruct a fresh Controller0AiThe contents of the chunkCiThe total amount of bytes which have been transferred \xe2\x80\xa6BjThe amount of bytes which had been written210BnUnderlying error describing reason for failureBaClose the connection immediately.CnClose all of this endpoint\xe2\x80\x99s connections immediately and \xe2\x80\xa6AaCloses this path.AnClose a connection immediatelyBcFrame type that triggered the errorCcDistinguishes streams of the same initiator and \xe2\x80\xa60CjReturns whether the codepoint is a CE, signalling that \xe2\x80\xa60AgKey for encrypting data0BgParse a connection id from given bufferAhReturns all known paths.BlUpdate the timer to expire at iBbClose the send stream immediately.BeAbandon transmitting data on a streamCnRespond with a retry packet, requiring the client to retry \xe2\x80\xa60CiDrive future to completion in the backgroundCeShow connection stats the at the end of the benchmarkAmReturns connection statisticsBiReturns relevant stats from this EndpointCaReturns the PathStats for this path.2BcTitle to record in the qlog capture0CmWrite a buffer into this stream, returning how many bytes \xe2\x80\xa6AmSend data on the given streamCcEncode TransportParameters into bufferC`Future produced by Endpoint::acceptClPaths marked as backup will only be used if there are no \xe2\x80\xa6CeChunks returned from RecvStream::read().AmThe initiator of a connection0AdRun as a perf clientCgAttempted to initiate NAT traversal on a closed, or \xe2\x80\xa6CcFuture produced by Connection::open_biAjA new path has been openedChOne or more new streams has been opened and might be \xe2\x80\xa6ChId representing different paths when using multipath \xe2\x80\xa60AbCoding result typeAlThe acceptor of a connection0AdRun as a perf servermStream eventsAiAn integer less than 2^620CfGet the next incoming connection attempt from a clientClAttempt to accept this incoming connection (an error may \xe2\x80\xa6CcAccept a remotely initiated stream of a certain \xe2\x80\xa61C`The amount of full chunks which had been written0BlAllows to configure the desired cipher suiteCiHelper to construct an endpoint for use with outgoing \xe2\x80\xa6CcWait for the connection to be closed for any reasonAfCoding related traits.BnAccess the configuration used by this endpointChTraits and implementations for the QUIC cryptography \xe2\x80\xa6BjCreate QUIC error code from TLS alert codeBoTLS configuration used for incoming connections210BkAn underlying crypto (e.g. TLS) layer errorCgDecode a plain header from given buffer, with given \xe2\x80\xa6DiDecode a Self from the provided buffer, if the buffer is \xe2\x80\xa6ChThe destination IP address which was encoded in this \xe2\x80\xa6D`Append the encoding of self to the provided buffer.CmNotify the peer that no more data will ever be written to \xe2\x80\xa6CnFinish a send stream, signalling that no more data will be \xe2\x80\xa6B`Process an incoming UDP datagramAfHeader protection keys0ClIgnore this incoming connection attempt, not sending any \xe2\x80\xa60C`Potentially store a token for later one-time use0CfPerform NSS-compatible TLS key logging to the file \xe2\x80\xa6AhThe offset in the stream0B`Packet deliveries were confirmed0AfPacket protection keys0lRandom valueBcHuman-readable reason for the close000BhHuman-readable explanation of the reasonBeReason that the connection was closedBcReason why this path was abandoned.AjSwitch to a new UDP socketBgReject this incoming connection attempt0AgKey for decrypting dataAmThe remote side of this tuple1AmTLS interface based on rustls0CnHelper to construct an endpoint for use with both incoming \xe2\x80\xa6BkOptional source IP address for the datagram00CgThe current local PathStatus of this path.B`The new status set by the remoteCfThe size of a single datagram in the associated bufferCjStatistics about datagrams and bytes received on this pathCgStatistics about UDP datagrams received on a connection10CfStatistics about datagrams and bytes sent on this pathCjStatistics about UDP datagrams transmitted on a connection10AnMethod for verifying a message0CcNumber of ack-eliciting bytes that may be in flight0CaA key for sealing data with AEAD-based algorithms0A`Send would blockCcNo more data is currently available on this stream.CjThe peer is not able to accept additional data, or the \xe2\x80\xa6BfA catch-all error for unlikely errors.0BlA key for signing with HMAC-based algorithms0AhAn Initial packet headerBnA pair of keys for bidirectional communication0BhA simple, standard congestion controller0CdFuture produced by Connection::open_uniCkAbstracts I/O and timer operations for runtime independenceBfA cryptographic session (commonly TLS)0CcThe peer is no longer accepting data on this streamCfFuture returned from SendStream::stopped.ClThe peer is no longer accepting data on this stream, and \xe2\x80\xa6CkThe peer is no longer accepting data on this stream. No \xe2\x80\xa6CgThe peer asked us to stop sending on an outgoing streamAaAccess to streamsCaThe stream is larger than the user-supplied limitCnAttributed to some frame type this implementation does not \xe2\x80\xa6ClIndicates how many bytes and chunks had been transferred \xe2\x80\xa60l0-RTT packetCjReturns the length of a CID for connections created by \xe2\x80\xa60CdProvide the length of dst_cid in short header packetCcThe total number of clients which should be createdAlConnect to a remote endpointAeInitiate a connectionCgDecrypt the packet payload with the given packet numberBcDecrypt the given packet\xe2\x80\x99s header10ClConstructs a value with arbitrary fields, intended to be \xe2\x80\xa6DjConstruct an event that indicating that a Connection will \xe2\x80\xa6BkThe destination connection ID of the packetBkThe destination Connection ID of the packetAiDestination Connection ID00000CgEncrypt the packet payload with the given packet numberBcEncrypt the given packet\xe2\x80\x99s header10Abiroh NAT TraversalCbCheck if this stream has been opened during 0-RTT.0CmRetrieve implementation-specific metrics used to populate \xe2\x80\xa60CnThe maximum UDP payload size guaranteed to be supported by \xe2\x80\xa60BbOne or more packets were just sent0BmInitiate a new outgoing bidirectional stream.CaReturns the path ID of the new path being opened.AdSource Connection ID0000CiCompletes when the peer stops the stream or reads the \xe2\x80\xa6CjCheck if this stream was stopped, get the reason if it wasCcThe total number of streams which should be createdAlProvide control over streamsCeThe length of the AEAD tag appended to packets on \xe2\x80\xa60CdUpgrade the handle to a full ConnectionB`Upgrades to a Path.AkSet the QUIC version to use0lQUIC versionB`The version that was unsupported11CeFuture produced by Connection::accept_biAfAn unreliable datagramBdDatagram support is disabled locally0A`A QUIC endpoint.BcThe main entry point to the libraryChA finished stream has been fully acknowledged or stoppedCkAn incoming connection for which the server has not yet \xe2\x80\xa60BoLong packet types with uniform header structureB`The largest encoded value length0Cmthe connection is being closed abruptly in the absence of \xe2\x80\xa60CeFuture returned by Connection::on_closedClFuture produced by crate::Connection::open_pathCmA currently open stream likely has data or errors waiting \xe2\x80\xa6CkMetadata for a single buffer filled with bytes received \xe2\x80\xa6BkResponse generated directly by the endpointCfIdentifier for a stream within a particular connection0CnCommunication with the peer has lapsed for longer than the \xe2\x80\xa6CkWe didn\xe2\x80\x99t receive any data from the remote within the \xe2\x80\xa61ChResponsible for limiting clients\xe2\x80\x99 ability to reuse \xe2\x80\xa60ClThe datagram is larger than the connection can currently \xe2\x80\xa60AbAn outgoing packet00CmStatistics about UDP datagrams transmitted or received on \xe2\x80\xa60CnA formerly write-blocked stream might be ready for a write \xe2\x80\xa6AkCongestion algorithm to useAhContents of the datagramBoMark the read data as consumed from the stream.C`Statistics about frames received on a connection0CcStatistics about frames transmitted on a connection0DhConstructs cid by reading len bytes from a Buf0DkCreates a new qlog factory that writes files into QLOGDIR, \xe2\x80\xa60BfCreate a generator with a specific keyBjConstruct a VarInt infallibly0BeSucceeds iff x < 2^620AeWhat type we receivedAoWhat handshake type we received10CbWhether 0-RTT is/was possible during the handshakeCmSpecifies the time to wait after completing MTU discovery \xe2\x80\xa60CcReturns Self for use in down-casting to extract \xe2\x80\xa60EhReturns true if the Connection associated with this handle \xe2\x80\xa6CmDuration after an address validation token was issued for \xe2\x80\xa60CeThe local IP address which was used when the peer \xe2\x80\xa6000AmThe local side of this tuple.ClCompute the maximum size of datagrams that may be passed \xe2\x80\xa6BnInitiate a new outgoing unidirectional stream.BcGet the priority of the send streamAlGet the priority of a streamCfThe negotiated application protocol, if ALPN is in use0Aeqlog output directoryBbOptional response to transmit backCiOptional seed to be used internally for random number \xe2\x80\xa60AlSlow start threshold (bytes)0BeSucceeds iff x < 2^6200000DaSends a Transmit on the given socket without any \xe2\x80\xa6DkQuickly determine whether cid could have been generated by \xe2\x80\xa600BmA path was abandoned and is no longer usable.CfFuture produced by Connection::accept_uniCdPaths marked with as available will be used when \xe2\x80\xa6CnAt least one new stream of a certain directionality may be \xe2\x80\xa6ClConfiguration for the Bbr congestion controller0BkThe connection was successfully establishedAoAPI to control datagram trafficAlDecoding of QUIC primitives.CkA path was discarded and all remaining state for it has \xe2\x80\xa6BgInfallible encoding of QUIC primitives.CnIdentifies a network path by the combination of remote and \xe2\x80\xa6A`Handshake packetBcKeys used to protect packet headers0CiCatch-all error for problems while decoding transport \xe2\x80\xa6CeNat traversal attempt failed due to a multipath errorBdKeys used to protect packet payloads0BmErrors that might trigger a path being closedAnApplication events about pathsBiStatistics related to a transmission path0AeA read error occurredBmErrors that arise from reading from a stream.C`Errors triggered when reading from a recv streamCiAn object for asynchronously writing to an associated \xe2\x80\xa6BmAccept the next incoming bidirectional streamBbDuplicate the controller\xe2\x80\x99s state0BdThe amount of UDP datagrams observedAaControl datagrams1BeCreate new object from the given bits00BoWhich side of a connection initiated the stream0CmConvert into a 0-RTT or 0.5-RTT connection at the cost of \xe2\x80\xa6BoShorthand for self == Side::Client0B`Whether the connection is closedBoShorthand for self == Side::Server0CbWhether it is legal to respond with a retry packet0CdWhether to allow clients to migrate to new addresses0CdConstruct a timer that will expire at iCjWait for the connection to be closed without keeping a \xe2\x80\xa6CjOpens an additional path if the multipath extension is \xe2\x80\xa6A`Opens a new pathBmPing the remote endpoint over a specific pathCiAttempts to read from the stream into the provided bufferCeReceive UDP datagrams, or register to be woken if \xe2\x80\xa6CkSend a UDP datagram, or register to be woken if sending \xe2\x80\xa6ClPrivate key used to send authenticated connection resets \xe2\x80\xa60BmGenerate the integrity tag for a retry packet0BgA stable identifier for this connectionCePrivate key used to authenticate data included in \xe2\x80\xa60BlThe position of a token in the packet bufferCgTransport configuration to use for incoming connections0CjWait for all connections on the endpoint to be cleanly \xe2\x80\xa6BoWrite a buffer into this stream in its entiretyCiAbstract implementation of an async timer for runtime \xe2\x80\xa6BoNumber of UDP packets to send/receive at a timeCkError indicating that a path has not been opened or has \xe2\x80\xa6BnThe path is already closed or was never opened1BeIn-progress connection attempt futureAbA QUIC connection.CeProtocol state and logic for a single QUIC connectionCeCommon interface for different congestion controllers0CkNumber of frames transmitted or received of each frame type0BoThe connection ID was not recognized by the \xe2\x80\xa60DdThe type used to refer to FrameTypes in closing and \xe2\x80\xa6AnThe QUIC-MULTIPATH path statusBeConfiguration for qlog trace logging.0BnA stream that can only be used to receive dataAaAccess to streamsChErrors that arise while waiting for a stream to be resetDhError for attempting to retry an Incoming which already \xe2\x80\xa60BkA stream that can only be used to send data3BmObject to get current SystemTime0AdA rustls TLS session0CkResponsible for storing validation tokens received from \xe2\x80\xa60AeA borrowed UDP socketBjErrors that arise from writing to a streamBoErrors triggered while writing to a send streamBoAccept the next incoming uni-directional streamCkWhether the implementation is permitted to set the spin \xe2\x80\xa60BmCloses a path by sending a PATH_ABANDON frameCdLogic for controlling the rate at which data is sent0BfWhether to print connection statisticsBnClass of error as encoded in the specificationB`Application-specific reason code10CaThe error code to be sent with the abandon frame.BoThe error that was sent with the abandon frame.AoError code supplied by the peerBcType of frame that caused the close0AiExtract the integer value0BfQUIC transport protocol implementationCnWhether there is no longer any need to keep the connection \xe2\x80\xa6DkDetermine whether this is the last event a Connection will \xe2\x80\xa6CiLook up the local IP address and port used by this socketDgGet the local SocketAddr the underlying socket is bound toBeThe amount of bytes lost on this path0CjPad UDP datagrams carrying application data to current \xe2\x80\xa60AgReturns path statistics0CjThe final path stats, they are no longer available via \xe2\x80\xa6C`Attempt to write bytes from buf into the stream.AmRead the next segment of dataAoReads the next segment of data.CkRead an exact number of bytes contiguously from the stream.BnSets the PathStatus of this path.BoEpoch qlog event times are recorded relative to0ClError type for attempting to accept an IncomingBjErrors in the configuration of an endpoint0AeGeneric crypto errors0CnConfiguration for the Cubic congestion controller0CdReasons why attempting to finish a stream might failCnMaximum duration of inactivity to accept before timing out \xe2\x80\xa60AnValue exceeds supported bounds0D`Constructs a QlogConfig for individual connections.0AhA Quinn runtime for smolB`Application events about streamsCbAccept this incoming connection using a custom \xe2\x80\xa6CdLargest UDP payload size the path currently supportsClStorage size required for the largest packet that can be \xe2\x80\xa61BiDescription to record in the qlog capture0BjThe socket this datagram should be sent to00BkStarting guess for maximum UDP payload sizeCkThe initial value to be used as the maximum UDP payload \xe2\x80\xa60ChUDP payload size that the network must be capable of \xe2\x80\xa6BjThe RTT used before an RTT sample is taken0BfThe initial round-trip-time (in msecs)CeThe amount of concurrent streams which should be usedDdPackets are acked in batches, all with the same now \xe2\x80\xa60AdPacing rate (bits/s)0DiA broadcast receiver of PathEvents for all paths in this \xe2\x80\xa6DfGets the local PathStatus for a known PathIdAnRead the next segments of dataCkConvenience method to read all remaining data into a bufferAlProvide control over streamsBoThe sample size used for this key\xe2\x80\x99s algorithm01CiMaximum number of bytes to transmit to a peer without \xe2\x80\xa600BoThe server name specified by the client, if any0BmObject to get current SystemTime0BdSet a custom TokenStore0CaNumber of bytes to transmit from client to serverCnSpecifies the upper bound to the max UDP payload size that \xe2\x80\xa60ChReturns a weak reference to the inner connection struct.CdReturns a WeakPathHandle for this path.DgCreate a server config with the given crypto::ServerConfig0CeSets a prefix to the filename of the generated files.0DbWrite a single Bytes into this stream in its entiretyBbAn ADD_ADDRESS frame was received.BfConfiguration for outgoing connectionsCaClient-side configuration for the crypto protocol10CgThe stream has already been stopped, finished, or resetBmThe stream has already been finished or resetCmError indicating that a stream has not been opened or has \xe2\x80\xa6CjThe stream has not been opened or was already stopped, \xe2\x80\xa6CfThe stream has not been opened or has already been \xe2\x80\xa6CmThe stream has not been opened or was already finished or \xe2\x80\xa63CgErrors in the parameters being used to create a new \xe2\x80\xa60BkProtocol-level identifier for a connection.0CkWe couldn\xe2\x80\x99t decrypt a message. This is invariably fatal.0BjExplicit congestion notification codepoint00CnWe couldn\xe2\x80\x99t encrypt a message because it was larger than \xe2\x80\xa60BhParameters that are semantically invalidCaThis is the last path, which can not be abandonedAmIroh\xe2\x80\x99s nat traversal eventsDhNull implementation of TokenLog, which never accepts tokens0ClReceived an observation of our external address from the \xe2\x80\xa6CiFuture produced by Connection::read_datagramBiThe remote changed the status of the pathBlRTT estimation for a particular network pathCnFuture produced by Connection::send_datagram_waitBiParameters governing incoming connectionsCaServer-side configuration for the crypto protocol10CmErrors that arise while monitoring for a send stream stop \xe2\x80\xa6AiA Quinn runtime for TokioC`Returns the lifetime of generated Connection IDs0BlIf the connection is closed, the reason why.CjConnect to a remote endpoint using a custom configuration.AlConservative estimate of RTTBnGet the 0-RTT keys if available (clients only)0AgWhich types we expectedB`Which handshake type we expected10AcGenerates a new CID0ClThe number of segments to read when GRO is enabled. Used \xe2\x80\xa6DeProcess ConnectionEvents generated by the associated \xe2\x80\xa6EaProcess EndpointEvents emitted from related ConnectionsCgCreate the initial set of keys given the client\xe2\x80\x99s \xe2\x80\xa6000BgThe amount of packets lost on this path0DcMaximum number of Incoming to allow to exist at a time0CjWhether datagrams might get fragmented into multiple parts0CmWhether transmitted datagrams might get fragmented by the \xe2\x80\xa6CkReturns the path\xe2\x80\x99s network path represented as a 4-tuple.CkThe original destination CID when initiating the connectionCiThe original destination connection ID sent by the clientDhReturns the next time at which handle_timeout should be \xe2\x80\xa6D`Configures qlog capturing by setting a QlogFactory.0CkThe segment size if this transmission contains multiple \xe2\x80\xa600ChThe number of streams that may have unacknowledged data.CbSet the lifetime of CIDs created by this generator0BcSet the priority of the send streamAlSet the priority of a streamCnInitialize a QUIC-compatible TLS client configuration with \xe2\x80\xa6000DgWrite a slice of Bytes into this stream, returning how \xe2\x80\xa6AmSend data on the given streamCkWe received a fatal alert. This means the peer is unhappy.0BhBloom filter-based TokenLog0CmThe connection could not be created because not enough of \xe2\x80\xa6000CaEvent resulting from processing a single datagramBlEvents sent from a Connection to an EndpointAoStatistics on Endpoint activityBnThe stream finished before all bytes were readBlAuthentication data for (rustls) TLS session0Ccreceived an invalid Retry Token in a client Initial0AlThe packet header is invalidBkThe local application closed the connection0DaThe datagram may result in starting a new ConnectionD`Configuration for the NewReno congestion controller0BjDecodes a QUIC packet\xe2\x80\x99s invariant headerCgErrors triggered when opening a recv stream for readingCaDefault implementation of TimeSource0CgError indicating that the provided buffer was too smallChFor clients, if the peer accepted the 0-RTT data packetsAbAck Frequency modeAfExports for benchmarksBoSupply a custom connection ID generator factory0DgCreate a UdpSender that can register a single task for \xe2\x80\xa6CaNumber of bytes to transmit from server to clientAmGet the Incoming0CnThe max_ack_delay we will request the peer to use0CgDisable packet encryption/decryption (for debugging \xe2\x80\xa6CkThe known MTU for the current network path has been updated0BbCryptographic identity of the peerBgGet the peer\xe2\x80\x99s identity, if availableDhFor the rustls TlsSession, the Any type is \xe2\x80\xa610CnAttempts to read from the stream into the provided buffer, \xe2\x80\xa6AkReturns packets to transmitDjConfigures qlog capturing through the QLOGDIR environment \xe2\x80\xa60AoReceive an application datagramDfTransmit data as an unreliable, unordered application \xe2\x80\xa6CmWhether to implement fair queuing for send streams having \xe2\x80\xa60BfLength of sign\xe2\x80\x99s output0BnStart a client session with this configurationBnStart a server session with this configuration10BdA REMOVE_ADDRESS frame was received.CgAbstract implementation of a UDP socket for runtime \xe2\x80\xa6BgErrors triggered when abandoning a pathAgThe connection was lost00000ChGlobal configuration for the endpoint, affecting all \xe2\x80\xa60Cithe endpoint encountered an internal error and cannot \xe2\x80\xa60FbBasic adapter to let Incoming be await-ed like a ConnectingBhEncounter a frame ID that was not valid.CeThe peer sent us a TLS message with invalid contents.0Amno viable network path exists0DhNull implementation of TokenStore, which does not store \xe2\x80\xa60CiThe peer deviated from the standard TLS protocol. The \xe2\x80\xa60BmErrors that arise from reading from a stream.C`Errors from RecvStream::read_to_endCaIndicates whether a frame needs to be transmittedCmThe peer violated the QUIC specification as understood by \xe2\x80\xa60CiTransport-level errors occur when a peer violates the \xe2\x80\xa6C`Tokio-compatible UDP socket with some useful \xe2\x80\xa6DiWeak handle for a Path that does not keep the connection \xe2\x80\xa6AfDerive AEAD using hkdf0BnCreate a client endpoint and client connectionAgGet a session referenceDiReturns a QlogConfig for a connection, if logging should \xe2\x80\xa60AiProcess timer expirationsBjParameters negotiated during the handshake0CfGet data negotiated during the handshake, if available0AiInitial congestion windowCiDefault limit on the amount of outstanding data in bytes.001000BnConverts this stream into an unordered stream.CjUniform interface to send and receive UDP packets with \xe2\x80\xa6DdReturns true until the connection is fully established.CeWhether the connection is in the process of being \xe2\x80\xa61BfVerify the integrity of a retry packet0CnSpecifies the minimum MTU change to stop the MTU discovery \xe2\x80\xa60BdCompute keys for the next key update0BkConfigures qlog capturing into a directory.0AlRead bytes of handshake data0BeWhether to use the unordered read APIClMaximum number of bytes the peer may transmit across all \xe2\x80\xa600CkCompletes when the stream has been reset by the peer or \xe2\x80\xa60CiCheck whether this stream has been reset by the peer, \xe2\x80\xa6AjThe peer\xe2\x80\x99s UDP addressesAhThe peer\xe2\x80\x99s UDP address0BgThe peer\xe2\x80\x99s UDP address for this path.1CeSaturating integer addition. Computes self + rhs, \xe2\x80\xa6000ChSaturating integer subtraction. Computes self - rhs, \xe2\x80\xa60CkMaximum reordering in time space before time based loss \xe2\x80\xa60ChReason given by the transport for closing the connection0BfReasons why a connection might be lost0CiThe datagram is redirected to its ConnectionBlEvents sent from an Endpoint to a ConnectionAeConnection statistics0BiStatistics for the currently open streamsAcPlain packet headerBkEnables writing qlog traces to a directory.0AkThe remote closed the path.CfError for when a validation token may have been reused0C`Parameters governing the core QUIC state machine0CbThe peer doesn\xe2\x80\x99t implement any supported version0CdFuture that completes when a connection is fully \xe2\x80\xa6CbThis was a 0-RTT stream and the server rejected it000CjAutomatically select an appropriate runtime from those \xe2\x80\xa6CkWhether to accept QUIC packets containing any value for \xe2\x80\xa60CdMaximum number of incoming packets that may fail \xe2\x80\xa60CnThe interface index of the interface on which the datagram \xe2\x80\xa6AjSwitch to a new UDP socketCiCreates a server endpoint which runs on the given runtimeD`Sets the PathStatus for a known PathIdCfSee proto::TransportConfig::send_window()BoSee TransportConfig::send_window()BmReturns whether a frame should be transmittedD`Convert t into the socket type used by this runtimeCdWrites handshake bytes into the given buffer and \xe2\x80\xa60ClStream produced by Path::observed_external_addrCiReason given by an application for closing the connection0CbThe peer\xe2\x80\x99s QUIC stack aborted the connection \xe2\x80\xa60DjInternal identifier for a Connection currently associated \xe2\x80\xa6CdOne or more application datagrams have been receivedCaThe endpoint can no longer create new connections0Cnreceived a STREAM frame or a RESET_STREAM frame containing \xe2\x80\xa60ClSpecific failure cases from keys_match or a \xe2\x80\xa60A`key update error0CaCurrent limits do not allow us to open more pathsClThe peer doesn\xe2\x80\x99t support a protocol version/feature we \xe2\x80\xa60BjA QUIC-compatible TLS client configuration0BjA QUIC-compatible TLS server configuration0EfTokenStore implementation that stores up to N tokens per \xe2\x80\xa60CgAn endpoint (local or remote) tried to add too many \xe2\x80\xa6CmWe didn\xe2\x80\x99t receive a path response in time after opening \xe2\x80\xa6CaPath could not be validated and will be abandonedBcA Version Negotiation packet headerCiRecord that the token was used and, ideally, return a \xe2\x80\xa60CjCurrent state of the congestion control algorithm, for \xe2\x80\xa6CcCurrent state of this connection\xe2\x80\x99s congestion \xe2\x80\xa6BaUpdate traffic keys spontaneously0BoLow-level protocol logic for the QUIC protoocolCnThe maximum amount of segments which can be transmitted if \xe2\x80\xa6CnMaximum duration of inactivity to accept before timing out \xe2\x80\xa60CeGet the number of connections that are currently openBmNumber of connections that are currently openCiOpens a new path if no path exists yet for the remote \xe2\x80\xa6CmOpens a new path only if no path on the same network path \xe2\x80\xa6CiMaximum reordering in packet number space before FACK \xe2\x80\xa60CfGet the size of the socket receive bufferAlReceive buffer size in bytesCcGet the size of the socket send bufferAiSend buffer size in bytesBiSet a custom TransportConfig000ChConfiguration for sending and handling validation tokens0CnCreate a server config with the given certificate chain to \xe2\x80\xa60DdWrite a slice of Bytes into this stream in its entiretyCfthe application or application protocol caused the \xe2\x80\xa60AnThe peer closed the connectionBoThe path was closed locally by the application.1B`Constructs controllers on demand0BdCommon congestion controller metrics0AlA pseudo random key for HKDF0BcThe given server name was malformed0CbHints when the caller identifies a network change.0AcPacket decode errorBdReason for why a path was abandoned.BmErrors that can arise when sending a datagram0CcThe peer does not support receiving datagram frames0BcCongestion events on the connection0AiCongestion window (bytes)0ClCompute the maximum size of datagrams that may be passed \xe2\x80\xa6BoBytes available in the outgoing datagram bufferClReplace the server configuration, affecting new incoming \xe2\x80\xa60Cmthe endpoint has reached the confidentiality or integrity \xe2\x80\xa60CkParameters for controlling the peer\xe2\x80\x99s acknowledgement \xe2\x80\xa60DjThe max_fragment_size value supplied in configuration was \xe2\x80\xa60Bmthe server refused to accept a new connection0BjParse connection id in short header packetCjOne or more application datagrams have been sent after \xe2\x80\xa6Ckreceived more data than permitted in advertised data limits0AoThe TLS handshake was confirmedBjThe connection\xe2\x80\x99s handshake data is readyCeAttempted an ordered read following an unordered readAnWe saw an invalid certificate.0BcParameters governing MTU discovery.0BnNot enough addresses to complete the operationCkdetected an error with protocol compliance that was not \xe2\x80\xa60Cjreceived a frame for a stream identifier that exceeded \xe2\x80\xa60Cnreceived a frame for a stream that was not in a state that \xe2\x80\xa60AnError from setting path statusAjTransport-level error code0ChThe local endpoint does not support the QUIC version \xe2\x80\xa6CkError indicating that the specified QUIC version is not \xe2\x80\xa61C`Packet uses a QUIC version that is not supported1CiMaximum quantity of out-of-order crypto layer data to \xe2\x80\xa60C`Create a VarInt without ensuring it\xe2\x80\x99s in range0ChCumulative number of Quic handshakes ignored on this \xe2\x80\xa6EgReturns true if the two WeakConnectionHandle point at the \xe2\x80\xa6CiMinimum interval between outgoing stateless reset packets0CjConstruct with an approximate maximum memory usage and \xe2\x80\xa60ChCumulative number of Quic handshakes refused on this \xe2\x80\xa6AnReturns the remote path statusDfTransmit data as an unreliable, unordered application \xe2\x80\xa6CiSee proto::TransportConfig::receive_window()CbSee TransportConfig::receive_window()B`Override supported QUIC versions0CiOverride the instant relative to which all events are \xe2\x80\xa60BkNo remote CIDs available to open a new pathCkTransport parameters used to negotiate connection-level \xe2\x80\xa6CgA stream that can be used to receive data out-of-order.CmThe certificate verifier doesn\xe2\x80\x99t support the given type \xe2\x80\xa60CfThe operation is not allowed for this endpoint\xe2\x80\x99s \xe2\x80\xa6CiCumulative number of Quic handshakes accepted by this \xe2\x80\xa6CjSpecifies the amount of time that MTU discovery should \xe2\x80\xa60CiIf the 0-RTT-encrypted data has been accepted by the peer0BgWait for the handshake to be confirmed.CgInform the connection if a path may recover after a \xe2\x80\xa60CgPeriod of inactivity before sending a keep-alive packet0CiThe amount of PLPMTUD probe packets lost on this path \xe2\x80\xa60BlPackets were deemed lost or marked congested0CgCumulative number of Quic handshakes sent from this \xe2\x80\xa6CnThe number of remotely initiated open streams of a certain \xe2\x80\xa6AhBench fns for SendBufferCiThe amount of PLPMTUD probe packets sent on this path \xe2\x80\xa60Bireceived a frame that was badly formatted0CkThis function doesn\xe2\x80\x99t work until the TLS handshake is \xe2\x80\xa60CkWe received a TLS message that isn\xe2\x80\x99t valid right now. \xe2\x80\xa60CiThe remote SocketAddr supplied was malformedCkThe remote address for the path is not supported by the \xe2\x80\xa61ChThe initial cipher suite (AES-128-GCM-SHA256) is not \xe2\x80\xa60BdPaths can only be opened client-sideDmError returned when constructing a VarInt from a value >= \xe2\x80\xa60CeA handle to some connection internals, use with care.DkSpecifies the ACK frequency config (see AckFrequencyConfig \xe2\x80\xa60CiThe number of times a black hole was detected in the path0CgMaximum number of received bytes to buffer for each \xe2\x80\xa60AeIs multipath enabled?ClMaximum number of datagrams that might be described by a \xe2\x80\xa60CkMaximum UDP payload size accepted from peers (excluding \xe2\x80\xa60AmMax UDP payload size in bytesDkSpecifies the MTU discovery config (see MtuDiscoveryConfig \xe2\x80\xa60AmReturn endpoint-facing eventsCkThe preferred IPv4 address that will be communicated to \xe2\x80\xa60CkThe preferred IPv6 address that will be communicated to \xe2\x80\xa60ChThe reordering threshold we will request the peer to use0ClDuration after a retry token was issued for which it\xe2\x80\x99s \xe2\x80\xa60C`Sets the keep_alive_interval for a specific pathDfResize the receive buffer of socket to bytesDcResize the send buffer of socket to bytesBfThe peer\xe2\x80\x99s QUIC transport parametersBdQUIC connection transport parameters1CaGenerates connection IDs for incoming connections0CdAn incoming connection did not support any known \xe2\x80\xa60BjNo default client configuration was set up0BiPath abandoned due to unstable interfaces0ClConfiguration for sending and handling validation tokens \xe2\x80\xa60CmMaximum number of packets that may be sent using a single \xe2\x80\xa60CiNotify connections that the local network address has \xe2\x80\xa6ChHandle a change in the local address, i.e. an active \xe2\x80\xa6CiCounter for the number of bytes currently used in the \xe2\x80\xa6CgReturns whether we think the other address probably \xe2\x80\xa6CkReduction in congestion window when a new loss event is \xe2\x80\xa60DdMaximum number of datagrams that a Transmit may encode.0DjA broadcast receiver of iroh_hp::Events for updates about \xe2\x80\xa6CjGet the address observed by the remote over the given pathCiMaximum number of bytes the peer may transmit without \xe2\x80\xa600Chreceived more data in CRYPTO frames than can be buffered0B`The extension was not negotiatedCbWe failed to figure out what time it currently is.0CbWe failed to acquire random bytes from the system.0CnError indicating that this operation requires multipath to \xe2\x80\xa6BnThe extension was not negotiated with the peerAkMultipath is not negotiatedCnError when the multipath extension was not negotiated, but \xe2\x80\xa6BnHeader of an Initial packet, before decryptionCgDerive keying material from this connection\xe2\x80\x99s TLS \xe2\x80\xa6EdFill output with output.len() bytes of keying material \xe2\x80\xa60BnPathological case: many segments, get from endCfGet segments in the old way, using a loop of get callsClCurrent number of remotely initiated streams that may be \xe2\x80\xa6ClTrack changed on our external address as reported by the \xe2\x80\xa6ClTrack changes on our external address as reported by the \xe2\x80\xa6CmCreate a client configuration that trusts specified trust \xe2\x80\xa60BkThe peer didn\xe2\x80\x99t give us any certificates.0BkThe peer sent an oversized record/fragment.0CkThe ack-eliciting threshold we will request the peer to use0BiWhether there are any pending retransmitsCdWhether the Multipath for QUIC extension is enabled.C`Sets the keep_alive_interval for a specific pathBoSet a custom ValidationTokenConfig0BmPath abandoned at the application\xe2\x80\x99s request0CjThe path was opened in a NAT traversal round which was \xe2\x80\xa6CjGet the current value of max_udp_payload_size0ChConfigure how to populate the destination CID of the \xe2\x80\xa60CjConstruct an endpoint with arbitrary configuration and \xe2\x80\xa6CfWhether the socket address that is initiating this \xe2\x80\xa60CmModify the number of open paths allowed when multipath is \xe2\x80\xa6Cmthe number of connection IDs provided by the peer exceeds \xe2\x80\xa60CbError returned by Session::export_keying_material.0CiA provided certificate revocation list (CRL) was invalid.0CmPath abandoned due to no available connection IDs for the \xe2\x80\xa60Clreceived transport parameters that were badly formatted, \xe2\x80\xa60CiRegisters one address at which this endpoint might be \xe2\x80\xa6ClAdd addresses the local endpoint considers are reachable \xe2\x80\xa6ClMaximum number of outgoing application datagram bytes to \xe2\x80\xa60CiSet the client configuration used by connectBmSets the max_idle_timeout for a specific pathBfThe QUIC protocol version implemented.CfThe path became unusable after a local network change.BoBytes available in the outgoing datagram bufferDhMaximum number of received bytes to buffer for all Incoming0DaVariant of max_concurrent_bidi_streams affecting \xe2\x80\xa60ClModify the number of remotely initiated streams that may \xe2\x80\xa6CnCreate a client configuration that trusts the platform\xe2\x80\x99s \xe2\x80\xa60CkGenerates 8-byte connection IDs that can be efficiently \xe2\x80\xa6CkAn error occurred while handling Encrypted Client Hello \xe2\x80\xa60CkPath abandoned due to resource limitations in the transport0CiGenerates purely random connection IDs of a specified \xe2\x80\xa6ChWhether to use \xe2\x80\x9cGeneric Segmentation Offload\xe2\x80\x9d to \xe2\x80\xa60CmMaximum number of incoming bidirectional streams that may \xe2\x80\xa60BhUpdates this tuple\xe2\x80\x99s local address iffClMaximum number of incoming application datagram bytes to \xe2\x80\xa60BcInitiates a new nat traversal round0BdPackets were incorrectly deemed lost0CnRemoves one or more addresses from the set of addresses at \xe2\x80\xa6CgRemoves an address the endpoing no longer considers \xe2\x80\xa6C`Sets the keep_alive_interval for a specific pathDeA ConnectionIdParser implementation that assumes the \xe2\x80\xa6CjWe received a TLS handshake message that isn\xe2\x80\x99t valid \xe2\x80\xa60CiHow to construct new congestion::Controllers0BlSets a default per-path maximum idle timeout0BoThe key exchange group negotiated with the peer0CbWhether to send observed address reports to peers.0CiModify the number of remotely initiated bidirectional \xe2\x80\xa6BiEnables the Multipath Extension for QUIC.0CjModify the number of remotely initiated unidirectional \xe2\x80\xa6CeNumber of consecutive PTOs after which network is \xe2\x80\xa60BkSets a default per-path keep alive interval0CjWhether to receive observed address reports from other \xe2\x80\xa60BmGet the current local nat traversal addresses0CkGet the currently advertised nat traversal addresses by \xe2\x80\xa60AcNat traversal draftCkSets the maximum number of nat traversal addresses this \xe2\x80\xa60CjWhen multipath is required and has not been explicitly \xe2\x80\xa6")
\ No newline at end of file
diff --git a/pr/427/docs/search.index/entry/8a55f596ad77.js b/pr/427/docs/search.index/entry/df7418d6c5d0.js
similarity index 94%
rename from pr/427/docs/search.index/entry/8a55f596ad77.js
rename to pr/427/docs/search.index/entry/df7418d6c5d0.js
index e6e156fe9..c5551813b 100644
--- a/pr/427/docs/search.index/entry/8a55f596ad77.js
+++ b/pr/427/docs/search.index/entry/df7418d6c5d0.js
@@ -1 +1 @@
-rd_("Ah[3995,15,3996,0,122,0,0]Ak[4784,15,4785,4785,123,0,0]Ai[3995,15,3996,0,4182,0,0]Al[4784,15,4785,1952,4183,0,0]Al[4484,15,4485,4485,4184,0,0]Al[4784,15,1857,1857,1608,0,0]Ao[1379,13,1380,1380,4027,3171,0]Ao[3995,13,3996,3746,4832,3171,0]An[3995,13,3996,1061,484,3171,0]Ao[3995,13,3996,1061,4450,3171,0]Ao[3995,13,3996,4131,4443,3171,0]Ao[3995,13,3996,4131,3179,3171,0]Ao[3995,13,3996,4131,3366,3171,0]Ao[3995,13,3996,4131,4442,3171,0]Ao[3995,13,3996,4136,3384,3171,0]Ao[3995,13,3996,4136,4216,3171,0]Al[3995,13,3996,0,1618,3171,0]Al[3995,13,3996,0,4991,3171,0]Al[3995,13,3996,0,1338,3171,0]Al[3995,13,3996,0,1601,3171,0]Al[3995,13,3996,0,2457,3171,0]Al[3995,13,3996,0,3176,3171,0]Al[3995,13,3996,0,2037,3171,0]Al[3995,13,3996,0,4168,3171,0]Al[3995,13,3996,0,4538,3171,0]Al[3995,13,3996,0,4040,3171,0]Al[3995,13,3996,0,4030,3171,0]Al[3995,13,3996,0,3159,3171,0]Al[3995,13,3996,0,4535,3171,0]Al[3995,13,3996,0,4728,3171,0]Al[3995,13,3996,0,4174,3171,0]Al[3995,13,3996,0,4177,3171,0]Al[3995,13,3996,0,4182,3171,0]Al[3995,13,3996,0,4890,3171,0]Ak[3995,13,3996,0,491,3171,0]Ak[3995,13,3996,0,122,3171,0]Al[3995,13,3996,0,2444,3171,0]Al[3995,13,1861,0,5140,3171,0]Al[3995,13,1941,0,1355,3171,0]Ao[4784,13,4785,1978,1619,3171,0]Ao[4784,13,4785,1978,4992,3171,0]Ao[4784,13,4785,3195,1339,3171,0]Ao[4784,13,4785,3204,4833,3171,0]Ao[4784,13,4785,1542,1602,3171,0]Ao[4784,13,4785,1542,3360,3171,0]Ao[4784,13,4785,1542,3175,3171,0]Ao[4784,13,4785,1542,4831,3171,0]Ao[4784,13,4785,1542,4887,3171,0]Ao[4784,13,4785,1542,3335,3171,0]Ao[4784,13,4785,1558,2458,3171,0]Ao[4784,13,4785,1558,3177,3171,0]Ao[4784,13,4785,1087,3180,3171,0]Ao[4784,13,4785,1087,4334,3171,0]Ao[4784,13,4785,1092,2038,3171,0]Ao[4784,13,4785,1092,3385,3171,0]Ao[4784,13,4785,1092,4039,3171,0]Ao[4784,13,4785,2171,4057,3171,0]Ao[4784,13,4785,2171,4444,3171,0]Ao[4784,13,4785,2171,4172,3171,0]Ao[4784,13,4785,3747,4539,3171,0]Ao[4784,13,4785,3747,3172,3171,0]Ao[4784,13,4785,3747,4410,3171,0]Ao[4784,13,4785,3322,4041,3171,0]Ao[4784,13,4785,1859,4031,3171,0]Ao[4784,13,4785,1532,3160,3171,0]Ao[4784,13,4785,1532,4425,3171,0]Ao[4784,13,4785,1532,3352,3171,0]Ao[4784,13,4785,1532,3374,3171,0]Ao[4784,13,4785,1532,4179,3171,0]Ao[4784,13,4785,1532,4537,3171,0]Ao[4784,13,4785,1532,4730,3171,0]Ao[4784,13,4785,2468,4734,3171,0]Ao[4784,13,4785,2468,4175,3171,0]Ao[4784,13,4785,1924,2428,3171,0]Ao[4784,13,4785,1924,4829,3171,0]Ao[4784,13,4785,1952,4178,3171,0]Ao[4784,13,4785,1952,4183,3171,0]Al[4784,13,4785,0,4448,3171,0]Al[4784,13,4785,0,4891,3171,0]An[4784,13,4785,4785,492,3171,0]An[4784,13,4785,4785,123,3171,0]Ao[4784,13,4785,4785,2445,3171,0]Ao[4784,13,4785,4785,3158,3171,0]Ao[4784,13,1857,1857,4340,3171,0]Ao[4784,13,5033,5033,4932,3171,0]Ao[4784,13,5033,5033,1357,3171,0]Ao[4784,13,1862,1862,5141,3171,0]Al[4784,13,1942,0,1356,3171,0]Ao[4484,13,4485,4485,4184,3171,0]Ak[3995,13,3996,1061,484,0,0]Al[3995,13,3996,1061,4450,0,0]Al[3995,13,3996,4131,3364,0,0]Al[3995,13,3996,4131,4933,0,0]Al[3995,13,3996,4136,3370,0,0]Ai[4784,14,3173,0,1595,0,0]Ai[4784,14,3173,0,3137,0,0]Ai[4784,14,3173,0,3154,0,0]Ai[4784,14,3173,0,4203,0,0]Ai[4784,14,3173,0,4196,0,0]Ai[4784,14,4056,0,2438,0,0]Ai[4784,14,4056,0,2460,0,0]Ai[4784,14,4056,0,2423,0,0]Ai[4784,14,4056,0,2025,0,0]Ae[1379,7,1380,0,0,0,0]Ah[4784,14,4550,0,480,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ag[3995,5,3741,138,0,0,0]Ag[4784,5,3742,138,0,0,0]Al[1062,15,1063,1063,4926,0,0]Ae[4015,5,4016,0,0,0,0]Ah[3995,6,3996,4785,0,0,0]Ae[4784,6,4785,0,0,0,0]Al[4784,15,1857,1857,1608,0,0]Ai[3995,19,3996,0,1618,0,0]Ai[3995,19,3996,0,1601,0,0]Al[4784,19,4785,1978,1619,0,0]Al[4784,19,4785,1542,1602,0,0]Ae[1379,5,1380,0,0,0,0]Ae[1062,5,1851,0,0,0,0]Ae[1062,5,1947,0,0,0,0]Ah[3995,15,3996,0,122,0,0]Ak[4784,15,4785,4785,123,0,0]Ak[3995,13,3996,0,1618,133,0]Ak[3995,13,3996,0,1601,133,0]Ak[3995,13,3996,0,4040,133,0]Ak[3995,13,3996,0,4177,133,0]Aj[3995,13,3996,0,491,133,0]Aj[3995,13,3996,0,122,133,0]Ak[3995,13,3996,0,2444,133,0]An[4784,13,4785,1978,1619,133,0]An[4784,13,4785,3204,4833,133,0]An[4784,13,4785,1542,1602,133,0]An[4784,13,4785,1087,3180,133,0]An[4784,13,4785,1087,4334,133,0]An[4784,13,4785,1092,3385,133,0]An[4784,13,4785,3322,4041,133,0]An[4784,13,4785,2468,4734,133,0]An[4784,13,4785,1924,4829,133,0]An[4784,13,4785,1952,4178,133,0]Am[4784,13,4785,4785,492,133,0]Am[4784,13,4785,4785,123,133,0]An[4784,13,4785,4785,2445,133,0]Ai[3995,13,3996,0,2444,0,0]Al[4784,13,4785,4785,2445,0,0]Ai[4784,14,4056,0,1596,0,0]Ai[4784,14,4056,0,3143,0,0]Ai[3995,14,3996,0,2454,0,0]Al[4784,14,4785,4785,2455,0,0]Al[4484,14,4485,4485,2442,0,0]Al[4484,14,4485,4485,2456,0,0]An[1379,13,1380,1380,130,1345,0]Ao[1379,13,1380,1380,4027,1345,0]Ao[1379,13,1556,1556,4445,1345,0]Ao[4064,13,4065,4065,5081,1345,0]Ao[3995,13,3996,3746,3337,1345,0]Ao[3995,13,3996,3746,3339,1345,0]Ao[3995,13,3996,3746,4994,1345,0]Db[3995,13,3996,3746,4832,1345,0,\"impl-Debug-for-SendDatagramError\"]Dd[3995,13,3996,3746,4832,1997,0,\"impl-Display-for-SendDatagramError\"]Ao[3995,13,3996,2467,2421,1345,0]Ao[3995,13,3996,2467,4309,1345,0]Ao[3995,13,3996,2494,2425,1345,0]Ck[3995,13,3996,2494,3367,1345,0,\"impl-Debug-for-RetryError\"]Cm[3995,13,3996,2494,3367,1997,0,\"impl-Display-for-RetryError\"]Ao[3995,13,3996,2494,4424,1345,0]An[3995,13,3996,1061,484,1345,0]Ao[3995,13,3996,1061,4450,1345,0]Ao[3995,13,3996,4131,3364,1345,0]Ao[3995,13,3996,4131,4933,1345,0]Da[3995,13,3996,4131,4443,1997,0,\"impl-Display-for-ReadToEndError\"]Co[3995,13,3996,4131,4443,1345,0,\"impl-Debug-for-ReadToEndError\"]Cl[3995,13,3996,4131,3179,1997,0,\"impl-Display-for-ReadError\"]Cj[3995,13,3996,4131,3179,1345,0,\"impl-Debug-for-ReadError\"]Cm[3995,13,3996,4131,3366,1997,0,\"impl-Display-for-ResetError\"]Ck[3995,13,3996,4131,3366,1345,0,\"impl-Debug-for-ResetError\"]Co[3995,13,3996,4131,4442,1345,0,\"impl-Debug-for-ReadExactError\"]Da[3995,13,3996,4131,4442,1997,0,\"impl-Display-for-ReadExactError\"]Ao[3995,13,3996,1569,4217,1345,0]Ao[3995,13,3996,1104,4053,1345,0]Ao[3995,13,3996,4136,3370,1345,0]Cm[3995,13,3996,4136,3384,1997,0,\"impl-Display-for-WriteError\"]Ck[3995,13,3996,4136,3384,1345,0,\"impl-Debug-for-WriteError\"]Co[3995,13,3996,4136,4216,1997,0,\"impl-Display-for-StoppedError\"]Cm[3995,13,3996,4136,4216,1345,0,\"impl-Debug-for-StoppedError\"]Ao[3995,13,3996,4136,2027,1345,0]Cd[3995,13,3996,0,1618,1345,0,\"impl-Debug-for-VarInt\"]Cf[3995,13,3996,0,1618,1997,0,\"impl-Display-for-VarInt\"]Dd[3995,13,3996,0,4991,1997,0,\"impl-Display-for-VarIntBoundsExceeded\"]Db[3995,13,3996,0,4991,1345,0,\"impl-Debug-for-VarIntBoundsExceeded\"]Al[3995,13,3996,0,1338,1345,0]Cf[3995,13,3996,0,1601,1997,0,\"impl-Display-for-PathId\"]Cd[3995,13,3996,0,1601,1345,0,\"impl-Debug-for-PathId\"]Al[3995,13,3996,0,2457,1345,0]Al[3995,13,3996,0,3345,1345,0]Al[3995,13,3996,0,3176,1345,0]Al[3995,13,3996,0,4542,1345,0]Al[3995,13,3996,0,2037,1345,0]Cl[3995,13,3996,0,4168,1997,0,\"impl-Display-for-ClosedStream\"]Cj[3995,13,3996,0,4168,1345,0,\"impl-Debug-for-ClosedStream\"]Co[3995,13,3996,0,4538,1997,0,\"impl-Display-for-ConnectionError\"]Cm[3995,13,3996,0,4538,1345,0,\"impl-Debug-for-ConnectionError\"]Al[3995,13,3996,0,4552,1345,0]Al[3995,13,3996,0,4561,1345,0]Al[3995,13,3996,0,4856,1345,0]Al[3995,13,3996,0,4871,1345,0]Al[3995,13,3996,0,4040,1345,0]Al[3995,13,3996,0,4419,1345,0]Al[3995,13,3996,0,4210,1345,0]Al[3995,13,3996,0,5048,1345,0]Al[3995,13,3996,0,4162,1345,0]Ck[3995,13,3996,0,4030,1997,0,\"impl-Display-for-ConfigError\"]Ci[3995,13,3996,0,4030,1345,0,\"impl-Debug-for-ConfigError\"]Ci[3995,13,3996,0,3159,1997,0,\"impl-Display-for-FrameType\"]Cg[3995,13,3996,0,3159,1345,0,\"impl-Debug-for-FrameType\"]Cm[3995,13,3996,0,4535,1345,0,\"impl-Debug-for-ConnectionClose\"]Co[3995,13,3996,0,4535,1997,0,\"impl-Display-for-ConnectionClose\"]Cn[3995,13,3996,0,4728,1345,0,\"impl-Debug-for-ApplicationClose\"]D`[3995,13,3996,0,4728,1997,0,\"impl-Display-for-ApplicationClose\"]Cl[3995,13,3996,0,4174,1997,0,\"impl-Display-for-ConnectError\"]Cj[3995,13,3996,0,4174,1345,0,\"impl-Debug-for-ConnectError\"]Cj[3995,13,3996,0,4177,1345,0,\"impl-Debug-for-ConnectionId\"]Cl[3995,13,3996,0,4177,1997,0,\"impl-Display-for-ConnectionId\"]Al[3995,13,3996,0,4182,1345,0]Db[3995,13,3996,0,4890,1997,0,\"impl-Display-for-TransportErrorCode\"]D`[3995,13,3996,0,4890,1345,0,\"impl-Debug-for-TransportErrorCode\"]Al[3995,13,3996,0,3348,1345,0]Al[3995,13,3996,0,4759,1345,0]Ak[3995,13,3996,0,491,1345,0]C`[3995,13,3996,0,122,1345,0,\"impl-Debug-for-Dir\"]Cb[3995,13,3996,0,122,1997,0,\"impl-Display-for-Dir\"]Ch[3995,13,3996,0,2444,1997,0,\"impl-Display-for-StreamId\"]Cf[3995,13,3996,0,2444,1345,0,\"impl-Debug-for-StreamId\"]Al[3995,13,3996,0,2454,1345,0]Ak[3995,13,3741,0,116,1345,0]Al[3995,13,3741,0,3146,1345,0]Al[3995,13,3741,0,1342,1345,0]Al[3995,13,3741,0,4035,1345,0]Al[3995,13,3741,0,2010,1345,0]Al[3995,13,3741,0,4326,1345,0]Al[3995,13,3741,0,4820,1345,0]Al[3995,13,1861,0,5140,1345,0]Al[3995,13,1861,0,4033,1345,0]Al[3995,13,1861,0,4894,1345,0]Db[3995,13,1941,0,4987,1345,0,\"impl-Debug-for-NoInitialCipherSuite\"]Dd[3995,13,1941,0,4987,1997,0,\"impl-Display-for-NoInitialCipherSuite\"]Cc[3995,13,1941,0,1355,1345,0,\"impl-Debug-for-Error\"]Ce[3995,13,1941,0,1355,1997,0,\"impl-Display-for-Error\"]Ao[4784,13,4785,3747,3340,1345,0]Ao[4784,13,4785,2468,2422,1345,0]Cg[4784,13,4785,1978,1619,1345,0,\"impl-Debug-for-VarInt\"]Ci[4784,13,4785,1978,1619,1997,0,\"impl-Display-for-VarInt\"]De[4784,13,4785,1978,4992,1345,0,\"impl-Debug-for-VarIntBoundsExceeded\"]Dg[4784,13,4785,1978,4992,1997,0,\"impl-Display-for-VarIntBoundsExceeded\"]Ao[4784,13,4785,3195,1339,1345,0]Db[4784,13,4785,3204,4833,1345,0,\"impl-Debug-for-SendDatagramError\"]Dd[4784,13,4785,3204,4833,1997,0,\"impl-Display-for-SendDatagramError\"]Ci[4784,13,4785,1542,1602,1997,0,\"impl-Display-for-PathId\"]Cg[4784,13,4785,1542,1602,1345,0,\"impl-Debug-for-PathId\"]Ao[4784,13,4785,1542,4206,1345,0]Ao[4784,13,4785,1542,3360,1345,0]Ao[4784,13,4785,1542,3175,1345,0]Ao[4784,13,4785,1542,4831,1345,0]Dc[4784,13,4785,1542,4887,1345,0,\"impl-Debug-for-SetPathStatusError\"]De[4784,13,4785,1542,4887,1997,0,\"impl-Display-for-SetPathStatusError\"]Cm[4784,13,4785,1542,3335,1997,0,\"impl-Display-for-ClosedPath\"]Ck[4784,13,4785,1542,3335,1345,0,\"impl-Debug-for-ClosedPath\"]Ao[4784,13,4785,1558,2458,1345,0]Ao[4784,13,4785,1558,3346,1345,0]Ao[4784,13,4785,1558,3177,1345,0]Ao[4784,13,4785,1558,4543,1345,0]Cl[4784,13,4785,1087,3180,1997,0,\"impl-Display-for-ReadError\"]Cj[4784,13,4785,1087,3180,1345,0,\"impl-Debug-for-ReadError\"]D`[4784,13,4785,1087,4334,1997,0,\"impl-Display-for-ReadableError\"]Cn[4784,13,4785,1087,4334,1345,0,\"impl-Debug-for-ReadableError\"]Ao[4784,13,4785,1092,2038,1345,0]Ck[4784,13,4785,1092,3385,1345,0,\"impl-Debug-for-WriteError\"]Cm[4784,13,4785,1092,3385,1997,0,\"impl-Display-for-WriteError\"]Cn[4784,13,4785,1092,4039,1997,0,\"impl-Display-for-FinishError\"]Cl[4784,13,4785,1092,4039,1345,0,\"impl-Debug-for-FinishError\"]Ao[4784,13,4785,2171,4057,1345,0]Ao[4784,13,4785,2171,4444,1345,0]Co[4784,13,4785,2171,4172,1997,0,\"impl-Display-for-ClosedStream\"]Cm[4784,13,4785,2171,4172,1345,0,\"impl-Debug-for-ClosedStream\"]Db[4784,13,4785,3747,4539,1997,0,\"impl-Display-for-ConnectionError\"]D`[4784,13,4785,3747,4539,1345,0,\"impl-Debug-for-ConnectionError\"]Cl[4784,13,4785,3747,3172,1997,0,\"impl-Display-for-PathError\"]Cj[4784,13,4785,3747,3172,1345,0,\"impl-Debug-for-PathError\"]Co[4784,13,4785,3747,4410,1345,0,\"impl-Debug-for-ClosePathError\"]Da[4784,13,4785,3747,4410,1997,0,\"impl-Display-for-ClosePathError\"]Di[4784,13,4785,3747,5077,1997,0,\"impl-Display-for-MultipathNotNegotiated\"]Dg[4784,13,4785,3747,5077,1345,0,\"impl-Debug-for-MultipathNotNegotiated\"]Ao[4784,13,4785,3747,1360,1345,0]Ao[4784,13,4785,1083,4553,1345,0]Ao[4784,13,4785,3322,4562,1345,0]Ao[4784,13,4785,3322,4857,1345,0]Ao[4784,13,4785,3322,4872,1345,0]Ao[4784,13,4785,3322,4041,1345,0]Ao[4784,13,4785,1859,4420,1345,0]Ao[4784,13,4785,1859,4212,1345,0]Ao[4784,13,4785,1859,5049,1345,0]Ao[4784,13,4785,1859,4164,1345,0]Cn[4784,13,4785,1859,4031,1997,0,\"impl-Display-for-ConfigError\"]Cl[4784,13,4785,1859,4031,1345,0,\"impl-Debug-for-ConfigError\"]Cj[4784,13,4785,1532,3160,1345,0,\"impl-Debug-for-FrameType\"]Cl[4784,13,4785,1532,3160,1997,0,\"impl-Display-for-FrameType\"]Co[4784,13,4785,1532,4425,1345,0,\"impl-Debug-for-InvalidFrameId\"]Da[4784,13,4785,1532,4425,1997,0,\"impl-Display-for-InvalidFrameId\"]Cm[4784,13,4785,1532,3352,1997,0,\"impl-Display-for-MaybeFrame\"]Ck[4784,13,4785,1532,3352,1345,0,\"impl-Debug-for-MaybeFrame\"]Ck[4784,13,4785,1532,3374,1345,0,\"impl-Debug-for-StreamInfo\"]Cm[4784,13,4785,1532,3374,1997,0,\"impl-Display-for-StreamInfo\"]Co[4784,13,4785,1532,4179,1997,0,\"impl-Display-for-DatagramInfo\"]Cm[4784,13,4785,1532,4179,1345,0,\"impl-Debug-for-DatagramInfo\"]Db[4784,13,4785,1532,4537,1997,0,\"impl-Display-for-ConnectionClose\"]D`[4784,13,4785,1532,4537,1345,0,\"impl-Debug-for-ConnectionClose\"]Dc[4784,13,4785,1532,4730,1997,0,\"impl-Display-for-ApplicationClose\"]Da[4784,13,4785,1532,4730,1345,0,\"impl-Debug-for-ApplicationClose\"]Ci[4784,13,4785,1532,2415,1345,0,\"impl-Debug-for-Datagram\"]Ck[4784,13,4785,1532,2415,1997,0,\"impl-Display-for-Datagram\"]Ao[4784,13,4785,2468,4734,1345,0]Ao[4784,13,4785,2468,2426,1345,0]Co[4784,13,4785,2468,4175,1997,0,\"impl-Display-for-ConnectError\"]Cm[4784,13,4785,2468,4175,1345,0,\"impl-Debug-for-ConnectError\"]Ao[4784,13,4785,2468,4025,1345,0]Cm[4784,13,4785,2468,3368,1997,0,\"impl-Display-for-RetryError\"]Ck[4784,13,4785,2468,3368,1345,0,\"impl-Debug-for-RetryError\"]Ao[4784,13,4785,1924,4329,1345,0]Ao[4784,13,4785,1924,4551,1345,0]Ao[4784,13,4785,1924,5080,1345,0]Ao[4784,13,4785,1924,2428,1345,0]Dd[4784,13,4785,1924,4829,1997,0,\"impl-Display-for-PacketDecodeError\"]Db[4784,13,4785,1924,4829,1345,0,\"impl-Debug-for-PacketDecodeError\"]Ao[4784,13,4785,1952,4541,1345,0]Ao[4784,13,4785,1952,4308,1345,0]Cm[4784,13,4785,1952,4178,1345,0,\"impl-Debug-for-ConnectionId\"]Co[4784,13,4785,1952,4178,1997,0,\"impl-Display-for-ConnectionId\"]Ao[4784,13,4785,1952,4183,1345,0]Cc[4784,13,4785,0,4448,1345,0,\"impl-Debug-for-Error\"]Ce[4784,13,4785,0,4448,1997,0,\"impl-Display-for-Error\"]Cb[4784,13,4785,0,4891,1345,0,\"impl-Debug-for-Code\"]Cd[4784,13,4785,0,4891,1997,0,\"impl-Display-for-Code\"]Ao[4784,13,4785,4347,3349,1345,0]Ao[4784,13,4785,4347,5175,1345,0]Ao[4784,13,4785,4922,4760,1345,0]An[4784,13,4785,4785,492,1345,0]Ce[4784,13,4785,4785,123,1997,0,\"impl-Display-for-Dir\"]Cc[4784,13,4785,4785,123,1345,0,\"impl-Debug-for-Dir\"]Ci[4784,13,4785,4785,2445,1345,0,\"impl-Debug-for-StreamId\"]Ck[4784,13,4785,4785,2445,1997,0,\"impl-Display-for-StreamId\"]Ao[4784,13,4785,4785,2455,1345,0]Cj[4784,13,4785,4785,3158,1345,0,\"impl-Debug-for-FourTuple\"]Cl[4784,13,4785,4785,3158,1997,0,\"impl-Display-for-FourTuple\"]D`[4784,13,1857,1857,4340,1997,0,\"impl-Display-for-UnexpectedEnd\"]Cn[4784,13,1857,1857,4340,1345,0,\"impl-Debug-for-UnexpectedEnd\"]Ao[4784,13,5033,5033,4932,1345,0]Ch[4784,13,5033,5033,1357,1997,0,\"impl-Display-for-Error\"]Cf[4784,13,5033,5033,1357,1345,0,\"impl-Debug-for-Error\"]Ao[4784,13,1862,1862,5141,1345,0]Ao[4784,13,1862,1862,4034,1345,0]Ao[4784,13,1862,1862,4897,1345,0]De[4784,13,1942,1942,4988,1345,0,\"impl-Debug-for-NoInitialCipherSuite\"]Dg[4784,13,1942,1942,4988,1997,0,\"impl-Display-for-NoInitialCipherSuite\"]Ce[4784,13,1942,0,1356,1997,0,\"impl-Display-for-Error\"]Cc[4784,13,1942,0,1356,1345,0,\"impl-Debug-for-Error\"]Am[4784,13,3742,138,117,1345,0]An[4784,13,3742,138,3147,1345,0]Ao[4784,13,3742,1528,1343,1345,0]Ao[4784,13,3742,1528,4036,1345,0]Ao[4784,13,3742,2516,2011,1345,0]Ao[4784,13,3742,2516,4327,1345,0]Ao[4784,13,3742,3742,4821,1345,0]Ch[4784,13,2142,2142,1358,1997,0,\"impl-Display-for-Error\"]Cf[4784,13,2142,2142,1358,1345,0,\"impl-Debug-for-Error\"]Ao[4784,13,2142,2142,1361,1345,0]An[4484,13,4485,399,4449,1345,0]Ao[4484,13,4485,4485,2442,1345,0]Ao[4484,13,4485,4485,2456,1345,0]Ao[4484,13,4485,4485,4184,1345,0]Al[4784,13,4785,1542,4206,0,0]Ai[3995,14,3996,0,2457,0,0]Al[4784,14,4785,1558,2458,0,0]Al[4784,13,4785,1924,4329,0,0]Al[4784,14,4785,1924,5080,0,0]Ah[4784,14,4550,0,480,0,0]Al[4484,14,4485,4485,2442,0,0]Ai[3995,13,3996,0,5048,0,0]Al[4784,13,4785,1859,5049,0,0]8Al[1379,13,1556,1556,4445,0,0]Al[4064,13,4065,4065,5081,0,0]Ai[3995,13,3996,0,4300,0,0]Al[3995,13,3996,2467,2421,0,0]Ai[3995,13,3996,0,3361,0,0]Ai[3995,13,3996,0,4552,0,0]Ai[3995,13,3996,0,4419,0,0]Ai[3995,13,3996,0,4210,0,0]Ai[3995,13,3996,0,4162,0,0]Ai[3995,13,3996,0,4177,0,0]Ai[3995,13,3996,0,4759,0,0]Ai[3995,13,3996,0,2444,0,0]Ah[3995,13,3741,0,116,0,0]Ai[3995,13,3741,0,1342,0,0]Ai[3995,13,3741,0,2010,0,0]Al[4784,13,4785,4571,4301,0,0]Al[4784,13,4785,1083,3362,0,0]Al[4784,13,4785,2468,2422,0,0]Al[4784,13,4785,1924,5200,0,0]Al[4784,13,4785,4347,5170,0,0]Al[4784,13,4785,1083,4553,0,0]Al[4784,13,4785,1859,4420,0,0]Al[4784,13,4785,1859,4212,0,0]Al[4784,13,4785,1859,4164,0,0]Al[4784,13,4785,1924,4329,0,0]Al[4784,13,4785,1952,4178,0,0]Ai[4784,13,4785,0,4448,0,0]Al[4784,13,4785,4347,5175,0,0]Al[4784,13,4785,4922,4760,0,0]Al[4784,13,4785,4785,2445,0,0]Aj[4784,13,3742,138,117,0,0]Al[4784,13,3742,1528,1343,0,0]Al[4784,13,3742,2516,2011,0,0]Ak[4484,13,4485,399,4449,0,0]Al[1062,13,4269,4269,5126,0,0]Al[1062,13,4269,4269,5127,0,0]Aj[3995,13,3996,0,491,129,0]Am[4784,13,4785,4785,492,129,0]Ai[3995,12,3996,0,3377,0,0]Al[3995,13,3996,2163,2022,0,0]0Ao[3995,13,3996,1569,4217,2022,0]Al[3995,13,3996,0,4338,3377,0]Al[4784,12,4785,1859,3378,0,0]Ao[4784,13,4785,1859,4339,3378,0]Al[3995,13,3996,3746,3339,0,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,13,4785,3747,3340,0,0]Al[4784,14,4785,1558,3177,0,0]Ae[1062,7,1851,0,0,0,0]Ae[1062,7,1947,0,0,0,0]Ae[3995,4,3996,0,0,0,0]Ai[3995,15,3996,0,4182,0,0]Al[4784,15,4785,1952,4183,0,0]Al[4484,15,4485,4485,4184,0,0]210Ah[3995,5,1861,1862,0,0,0]Ae[4784,5,1862,0,0,0,0]Al[4784,15,4785,1924,4551,0,0]Al[4784,15,4785,1532,3352,0,0]Ah[3995,5,3996,1061,0,0,0]Al[4784,15,4785,3747,1360,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Al[3995,15,3996,4131,4443,0,0]Ah[3995,6,3996,4785,0,0,0]Ae[4784,6,4785,0,0,0,0]Ai[3995,19,3996,0,1601,0,0]Al[4784,19,4785,1542,1602,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]Ai[4784,14,3173,0,4196,0,0]Al[4484,14,4485,4485,2442,0,0]Aa[501,3,0,0,0,0,0]Ai[4784,14,4785,0,4448,0,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,14,4785,1558,3177,0,0]Al[4784,14,4785,1532,2415,0,0]An[3995,13,3996,3746,2435,468,0]An[3995,13,3996,2494,2425,468,0]Am[3995,13,3996,1061,484,468,0]An[3995,13,3996,1061,4450,468,0]An[3995,13,3996,4131,3364,468,0]An[3995,13,3996,4136,3370,468,0]An[4784,13,4785,1087,1583,468,0]Am[1379,13,1380,1380,130,475,0]An[1379,13,1380,1380,4027,475,0]An[1379,13,1556,1556,4058,475,0]An[1379,13,1556,1556,1375,475,0]An[1379,13,1556,1556,4445,475,0]Ak[501,13,502,502,4028,475,0]An[4064,13,4065,4065,5081,475,0]An[3995,13,3996,3746,4566,475,0]An[3995,13,3996,3746,2435,475,0]Ak[3995,13,3996,0,4300,475,0]An[3995,13,3996,1061,2436,475,0]An[3995,13,3996,1061,4726,475,0]An[3995,13,3996,3746,3337,475,0]An[3995,13,3996,3746,3339,475,0]An[3995,13,3996,3746,2013,475,0]An[3995,13,3996,3746,1594,475,0]An[3995,13,3996,3746,3139,475,0]An[3995,13,3996,3746,2409,475,0]An[3995,13,3996,3746,4202,475,0]An[3995,13,3996,3746,4207,475,0]An[3995,13,3996,3746,4994,475,0]An[3995,13,3996,3746,4832,475,0]0An[3995,13,3996,2467,2421,475,0]An[3995,13,3996,2467,4309,475,0]An[3995,13,3996,2467,1575,475,0]An[3995,13,3996,2494,2425,475,0]An[3995,13,3996,2494,3367,475,0]An[3995,13,3996,2494,4424,475,0]Am[3995,13,3996,1061,484,475,0]An[3995,13,3996,1061,4450,475,0]An[3995,13,3996,4131,3364,475,0]An[3995,13,3996,4131,4933,475,0]An[3995,13,3996,4131,4443,475,0]0An[3995,13,3996,4131,3179,475,0]Dh[3995,13,3996,4131,3179,475,0,\"impl-From%3CResetError%3E-for-ReadError\"]Dm[3995,13,3996,4131,3179,475,0,\"impl-From%3CConnectionError%3E-for-ReadError\"]An[3995,13,3996,4131,3366,475,0]0An[3995,13,3996,4131,4442,475,0]0An[3995,13,3996,1569,4217,475,0]An[3995,13,3996,1104,4053,475,0]An[3995,13,3996,4136,3370,475,0]Dk[3995,13,3996,4136,3384,475,0,\"impl-From%3CStoppedError%3E-for-WriteError\"]Dn[3995,13,3996,4136,3384,475,0,\"impl-From%3CConnectionError%3E-for-WriteError\"]Dk[3995,13,3996,4136,3384,475,0,\"impl-From%3CClosedStream%3E-for-WriteError\"]An[3995,13,3996,4136,3384,475,0]An[3995,13,3996,4136,4216,475,0]0An[3995,13,3996,4136,2027,475,0]Ak[3995,13,3996,0,3361,475,0]Ak[3995,13,3996,0,4338,475,0]Ak[3995,13,3996,0,4558,475,0]Ak[3995,13,3996,0,4194,475,0]Ak[3995,13,3996,0,4433,475,0]Cj[3995,13,3996,0,1618,475,0,\"impl-From%3Cu8%3E-for-VarInt\"]D`[3995,13,3996,0,1618,475,0,\"impl-From%3CStreamId%3E-for-VarInt\"]Dj[3995,13,3996,0,1618,475,0,\"impl-From%3CTransportErrorCode%3E-for-VarInt\"]Ak[3995,13,3996,0,1618,475,0]Ck[3995,13,3996,0,1618,475,0,\"impl-From%3Cu16%3E-for-VarInt\"]Ck[3995,13,3996,0,1618,475,0,\"impl-From%3Cu32%3E-for-VarInt\"]Ak[3995,13,3996,0,4991,475,0]Ak[3995,13,3996,0,1338,475,0]Ak[3995,13,3996,0,1601,475,0]0Ak[3995,13,3996,0,2457,475,0]Ak[3995,13,3996,0,3345,475,0]Ak[3995,13,3996,0,3176,475,0]Ak[3995,13,3996,0,4542,475,0]Ak[3995,13,3996,0,2037,475,0]Ak[3995,13,3996,0,4168,475,0]Ak[3995,13,3996,0,4538,475,0]Df[3995,13,3996,0,4538,475,0,\"impl-From%3CClose%3E-for-ConnectionError\"]Dl[3995,13,3996,0,4538,475,0,\"impl-From%3CCloseReason%3E-for-ConnectionError\"]Do[3995,13,3996,0,4538,475,0,\"impl-From%3CTransportError%3E-for-ConnectionError\"]Ak[3995,13,3996,0,4552,475,0]Ak[3995,13,3996,0,4561,475,0]Ak[3995,13,3996,0,4856,475,0]Ak[3995,13,3996,0,4871,475,0]Ak[3995,13,3996,0,4040,475,0]0Ak[3995,13,3996,0,4419,475,0]Ak[3995,13,3996,0,4210,475,0]Ak[3995,13,3996,0,5048,475,0]Ak[3995,13,3996,0,4162,475,0]Ea[3995,13,3996,0,4030,475,0,\"impl-From%3CVarIntBoundsExceeded%3E-for-ConfigError\"]Ak[3995,13,3996,0,4030,475,0]Dl[3995,13,3996,0,4030,475,0,\"impl-From%3CTryFromIntError%3E-for-ConfigError\"]Ak[3995,13,3996,0,3159,475,0]Ak[3995,13,3996,0,4535,475,0]0Ak[3995,13,3996,0,4728,475,0]Ak[3995,13,3996,0,4174,475,0]0Ak[3995,13,3996,0,4177,475,0]Ak[3995,13,3996,0,4182,475,0]Ak[3995,13,3996,0,4890,475,0]0Ak[3995,13,3996,0,3348,475,0]Ak[3995,13,3996,0,4759,475,0]Aj[3995,13,3996,0,491,475,0]Aj[3995,13,3996,0,122,475,0]Ak[3995,13,3996,0,2444,475,0]0Ak[3995,13,3996,0,2454,475,0]Aj[3995,13,3741,0,116,475,0]Ak[3995,13,3741,0,3146,475,0]Ak[3995,13,3741,0,1342,475,0]Ak[3995,13,3741,0,4035,475,0]Ak[3995,13,3741,0,2010,475,0]Ak[3995,13,3741,0,4326,475,0]Ak[3995,13,3741,0,4820,475,0]Ak[3995,13,1861,0,2005,475,0]Aj[3995,13,1861,0,478,475,0]Ak[3995,13,1861,0,5140,475,0]Ak[3995,13,1861,0,4033,475,0]0Ak[3995,13,1861,0,4894,475,0]Ak[3995,13,1941,0,3379,475,0]Ak[3995,13,1941,0,4311,475,0]Ak[3995,13,1941,0,4755,475,0]Ak[3995,13,1941,0,4757,475,0]Ak[3995,13,1941,0,4987,475,0]Df[3995,13,1941,0,1355,475,0,\"impl-From%3CSystemTimeError%3E-for-Error\"]E`[3995,13,1941,0,1355,475,0,\"impl-From%3CEncryptedClientHelloError%3E-for-Error\"]E`[3995,13,1941,0,1355,475,0,\"impl-From%3CUnsupportedOperationError%3E-for-Error\"]Da[3995,13,1941,0,1355,475,0,\"impl-From%3COtherError%3E-for-Error\"]De[3995,13,1941,0,1355,475,0,\"impl-From%3CPeerMisbehaved%3E-for-Error\"]Dg[3995,13,1941,0,1355,475,0,\"impl-From%3CPeerIncompatible%3E-for-Error\"]De[3995,13,1941,0,1355,475,0,\"impl-From%3CInvalidMessage%3E-for-Error\"]Dg[3995,13,1941,0,1355,475,0,\"impl-From%3CCertificateError%3E-for-Error\"]Dg[3995,13,1941,0,1355,475,0,\"impl-From%3CInconsistentKeys%3E-for-Error\"]Df[3995,13,1941,0,1355,475,0,\"impl-From%3CGetRandomFailed%3E-for-Error\"]Ak[3995,13,1941,0,1355,475,0]Dn[3995,13,1941,0,1355,475,0,\"impl-From%3CCertRevocationListError%3E-for-Error\"]An[4784,13,4785,4571,4301,475,0]An[4784,13,4785,3204,3152,475,0]An[4784,13,4785,1087,1583,475,0]An[4784,13,4785,2171,2031,475,0]An[4784,13,4785,2171,3365,475,0]An[4784,13,4785,2171,3371,475,0]An[4784,13,4785,3747,3340,475,0]An[4784,13,4785,1083,3362,475,0]An[4784,13,4785,1859,4339,475,0]An[4784,13,4785,2468,2422,475,0]An[4784,13,4785,2468,4307,475,0]An[4784,13,4785,1924,5200,475,0]An[4784,13,4785,4347,5170,475,0]An[4784,13,4785,1568,4559,475,0]An[4784,13,4785,1568,4195,475,0]An[4784,13,4785,1568,4434,475,0]Co[4784,13,4785,1978,1619,475,0,\"impl-From%3CCode%3E-for-VarInt\"]Cm[4784,13,4785,1978,1619,475,0,\"impl-From%3Cu8%3E-for-VarInt\"]An[4784,13,4785,1978,1619,475,0]Cn[4784,13,4785,1978,1619,475,0,\"impl-From%3Cu32%3E-for-VarInt\"]Cn[4784,13,4785,1978,1619,475,0,\"impl-From%3Cu16%3E-for-VarInt\"]Dc[4784,13,4785,1978,1619,475,0,\"impl-From%3CStreamId%3E-for-VarInt\"]An[4784,13,4785,1978,4992,475,0]An[4784,13,4785,3195,1339,475,0]An[4784,13,4785,3204,4833,475,0]An[4784,13,4785,1542,1602,475,0]0An[4784,13,4785,1542,4206,475,0]An[4784,13,4785,1542,3360,475,0]An[4784,13,4785,1542,3175,475,0]An[4784,13,4785,1542,4831,475,0]An[4784,13,4785,1542,4887,475,0]An[4784,13,4785,1542,3335,475,0]An[4784,13,4785,1558,2458,475,0]An[4784,13,4785,1558,3346,475,0]An[4784,13,4785,1558,3177,475,0]An[4784,13,4785,1558,4543,475,0]An[4784,13,4785,1087,3180,475,0]An[4784,13,4785,1087,4334,475,0]An[4784,13,4785,1092,2038,475,0]An[4784,13,4785,1092,3385,475,0]An[4784,13,4785,1092,4039,475,0]An[4784,13,4785,2171,4057,475,0]An[4784,13,4785,2171,4444,475,0]An[4784,13,4785,2171,4172,475,0]An[4784,13,4785,3747,4539,475,0]0An[4784,13,4785,3747,3172,475,0]An[4784,13,4785,3747,4410,475,0]An[4784,13,4785,3747,5077,475,0]An[4784,13,4785,3747,1360,475,0]0An[4784,13,4785,1083,4553,475,0]An[4784,13,4785,3322,4562,475,0]An[4784,13,4785,3322,4857,475,0]An[4784,13,4785,3322,4872,475,0]An[4784,13,4785,3322,4041,475,0]0An[4784,13,4785,1859,4420,475,0]An[4784,13,4785,1859,4212,475,0]An[4784,13,4785,1859,5049,475,0]An[4784,13,4785,1859,4164,475,0]Ed[4784,13,4785,1859,4031,475,0,\"impl-From%3CVarIntBoundsExceeded%3E-for-ConfigError\"]An[4784,13,4785,1859,4031,475,0]Do[4784,13,4785,1859,4031,475,0,\"impl-From%3CTryFromIntError%3E-for-ConfigError\"]An[4784,13,4785,1532,3160,475,0]An[4784,13,4785,1532,4425,475,0]An[4784,13,4785,1532,3352,475,0]An[4784,13,4785,1532,3374,475,0]An[4784,13,4785,1532,4179,475,0]An[4784,13,4785,1532,4537,475,0]0An[4784,13,4785,1532,4730,475,0]An[4784,13,4785,1532,2415,475,0]An[4784,13,4785,2468,4734,475,0]An[4784,13,4785,2468,2426,475,0]An[4784,13,4785,2468,4175,475,0]0An[4784,13,4785,2468,4025,475,0]An[4784,13,4785,2468,3368,475,0]An[4784,13,4785,1924,4329,475,0]An[4784,13,4785,1924,4551,475,0]An[4784,13,4785,1924,5080,475,0]An[4784,13,4785,1924,2428,475,0]An[4784,13,4785,1924,4829,475,0]0An[4784,13,4785,1952,4541,475,0]An[4784,13,4785,1952,4308,475,0]An[4784,13,4785,1952,4178,475,0]An[4784,13,4785,1952,4183,475,0]Ak[4784,13,4785,0,4448,475,0]0Ak[4784,13,4785,0,4891,475,0]0An[4784,13,4785,4347,3349,475,0]An[4784,13,4785,4347,5175,475,0]An[4784,13,4785,4922,4760,475,0]Am[4784,13,4785,4785,492,475,0]Am[4784,13,4785,4785,123,475,0]An[4784,13,4785,4785,2445,475,0]0An[4784,13,4785,4785,2455,475,0]An[4784,13,4785,4785,3158,475,0]An[4784,13,1857,1857,4340,475,0]An[4784,13,5033,5033,4932,475,0]An[4784,13,5033,5033,1357,475,0]0An[4784,13,1862,1862,2006,475,0]Am[4784,13,1862,1862,479,475,0]An[4784,13,1862,1862,5141,475,0]An[4784,13,1862,1862,4034,475,0]0An[4784,13,1862,1862,4897,475,0]An[4784,13,1942,1942,3380,475,0]An[4784,13,1942,1942,4312,475,0]An[4784,13,1942,1942,4756,475,0]An[4784,13,1942,1942,4758,475,0]An[4784,13,1942,1942,4988,475,0]Dg[4784,13,1942,0,1356,475,0,\"impl-From%3CInconsistentKeys%3E-for-Error\"]Df[4784,13,1942,0,1356,475,0,\"impl-From%3CGetRandomFailed%3E-for-Error\"]Dn[4784,13,1942,0,1356,475,0,\"impl-From%3CCertRevocationListError%3E-for-Error\"]E`[4784,13,1942,0,1356,475,0,\"impl-From%3CUnsupportedOperationError%3E-for-Error\"]Dg[4784,13,1942,0,1356,475,0,\"impl-From%3CCertificateError%3E-for-Error\"]Df[4784,13,1942,0,1356,475,0,\"impl-From%3CSystemTimeError%3E-for-Error\"]Ak[4784,13,1942,0,1356,475,0]Dg[4784,13,1942,0,1356,475,0,\"impl-From%3CPeerIncompatible%3E-for-Error\"]De[4784,13,1942,0,1356,475,0,\"impl-From%3CPeerMisbehaved%3E-for-Error\"]De[4784,13,1942,0,1356,475,0,\"impl-From%3CInvalidMessage%3E-for-Error\"]Da[4784,13,1942,0,1356,475,0,\"impl-From%3COtherError%3E-for-Error\"]E`[4784,13,1942,0,1356,475,0,\"impl-From%3CEncryptedClientHelloError%3E-for-Error\"]Al[4784,13,3742,138,117,475,0]Am[4784,13,3742,138,3147,475,0]An[4784,13,3742,1528,1343,475,0]An[4784,13,3742,1528,4036,475,0]An[4784,13,3742,2516,2011,475,0]An[4784,13,3742,2516,4327,475,0]An[4784,13,3742,3742,4821,475,0]An[4784,13,2142,2142,1358,475,0]An[4784,13,2142,2142,1361,475,0]An[4484,13,4485,4485,3383,475,0]0Am[4484,13,4485,399,4449,475,0]An[4484,13,4485,4485,2442,475,0]An[4484,13,4485,4485,2456,475,0]An[4484,13,4485,4485,4184,475,0]An[1062,13,1063,1063,3149,475,0]An[1062,13,1063,1063,4926,475,0]Am[1062,13,1851,1851,131,475,0]An[1062,13,1557,1557,1376,475,0]An[1062,13,1557,1557,4059,475,0]An[1062,13,1557,1557,4547,475,0]An[1062,13,4269,4269,5126,475,0]An[1062,13,4269,4269,5127,475,0]Am[1062,13,1947,1947,132,475,0]Am[4015,13,4016,4016,121,475,0]An[4015,13,4016,4016,2412,475,0]Ak[3995,13,3996,0,1618,476,0]Ak[3995,13,3996,0,1601,476,0]Ak[3995,13,3996,0,4040,476,0]Ak[3995,13,3996,0,4177,476,0]Aj[3995,13,3996,0,491,476,0]Aj[3995,13,3996,0,122,476,0]Ak[3995,13,3996,0,2444,476,0]An[4784,13,4785,1978,1619,476,0]An[4784,13,4785,3204,4833,476,0]An[4784,13,4785,1542,1602,476,0]An[4784,13,4785,1087,3180,476,0]An[4784,13,4785,1087,4334,476,0]An[4784,13,4785,1092,3385,476,0]An[4784,13,4785,3322,4041,476,0]An[4784,13,4785,2468,4734,476,0]An[4784,13,4785,1924,4829,476,0]An[4784,13,4785,1952,4178,476,0]Am[4784,13,4785,4785,492,476,0]Am[4784,13,4785,4785,123,476,0]An[4784,13,4785,4785,2445,476,0]An[4784,13,4785,4785,3158,476,0]Am[1379,13,1380,1380,130,477,0]An[1379,13,1380,1380,4027,477,0]An[1379,13,1556,1556,4058,477,0]An[1379,13,1556,1556,1375,477,0]An[1379,13,1556,1556,4445,477,0]Ak[501,13,502,502,4028,477,0]An[4064,13,4065,4065,5081,477,0]An[3995,13,3996,3746,4566,477,0]An[3995,13,3996,3746,2435,477,0]Ak[3995,13,3996,0,4300,477,0]An[3995,13,3996,1061,2436,477,0]An[3995,13,3996,1061,4726,477,0]An[3995,13,3996,3746,3337,477,0]An[3995,13,3996,3746,3339,477,0]An[3995,13,3996,3746,2013,477,0]An[3995,13,3996,3746,1594,477,0]An[3995,13,3996,3746,3139,477,0]An[3995,13,3996,3746,2409,477,0]An[3995,13,3996,3746,4202,477,0]An[3995,13,3996,3746,4207,477,0]An[3995,13,3996,3746,4994,477,0]An[3995,13,3996,3746,4832,477,0]An[3995,13,3996,2467,2421,477,0]An[3995,13,3996,2467,4309,477,0]An[3995,13,3996,2467,1575,477,0]An[3995,13,3996,2494,2425,477,0]An[3995,13,3996,2494,3367,477,0]An[3995,13,3996,2494,4424,477,0]Am[3995,13,3996,1061,484,477,0]An[3995,13,3996,1061,4450,477,0]An[3995,13,3996,4131,3364,477,0]An[3995,13,3996,4131,4933,477,0]An[3995,13,3996,4131,4443,477,0]An[3995,13,3996,4131,3179,477,0]An[3995,13,3996,4131,3366,477,0]An[3995,13,3996,4131,4442,477,0]An[3995,13,3996,1569,4217,477,0]An[3995,13,3996,1104,4053,477,0]An[3995,13,3996,4136,3370,477,0]An[3995,13,3996,4136,3384,477,0]An[3995,13,3996,4136,4216,477,0]An[3995,13,3996,4136,2027,477,0]Ak[3995,13,3996,0,3361,477,0]Ak[3995,13,3996,0,4338,477,0]Ak[3995,13,3996,0,4558,477,0]Ak[3995,13,3996,0,4194,477,0]Ak[3995,13,3996,0,4433,477,0]Ak[3995,13,3996,0,1618,477,0]Ak[3995,13,3996,0,4991,477,0]Ak[3995,13,3996,0,1338,477,0]Ak[3995,13,3996,0,1601,477,0]Ak[3995,13,3996,0,2457,477,0]Ak[3995,13,3996,0,3345,477,0]Ak[3995,13,3996,0,3176,477,0]Ak[3995,13,3996,0,4542,477,0]Ak[3995,13,3996,0,2037,477,0]Ak[3995,13,3996,0,4168,477,0]Ak[3995,13,3996,0,4538,477,0]Ak[3995,13,3996,0,4552,477,0]Ak[3995,13,3996,0,4561,477,0]Ak[3995,13,3996,0,4856,477,0]Ak[3995,13,3996,0,4871,477,0]Ak[3995,13,3996,0,4040,477,0]Ak[3995,13,3996,0,4419,477,0]Ak[3995,13,3996,0,4210,477,0]Ak[3995,13,3996,0,5048,477,0]Ak[3995,13,3996,0,4162,477,0]Ak[3995,13,3996,0,4030,477,0]Ak[3995,13,3996,0,3159,477,0]Ak[3995,13,3996,0,4535,477,0]Ak[3995,13,3996,0,4728,477,0]Ak[3995,13,3996,0,4174,477,0]Ak[3995,13,3996,0,4177,477,0]Ak[3995,13,3996,0,4182,477,0]Ak[3995,13,3996,0,4890,477,0]Ak[3995,13,3996,0,3348,477,0]Ak[3995,13,3996,0,4759,477,0]Aj[3995,13,3996,0,491,477,0]Aj[3995,13,3996,0,122,477,0]Ak[3995,13,3996,0,2444,477,0]Ak[3995,13,3996,0,2454,477,0]Aj[3995,13,3741,0,116,477,0]Ak[3995,13,3741,0,3146,477,0]Ak[3995,13,3741,0,1342,477,0]Ak[3995,13,3741,0,4035,477,0]Ak[3995,13,3741,0,2010,477,0]Ak[3995,13,3741,0,4326,477,0]Ak[3995,13,3741,0,4820,477,0]Ak[3995,13,1861,0,2005,477,0]Aj[3995,13,1861,0,478,477,0]Ak[3995,13,1861,0,5140,477,0]Ak[3995,13,1861,0,4033,477,0]Ak[3995,13,1861,0,4894,477,0]Ak[3995,13,1941,0,3379,477,0]Ak[3995,13,1941,0,4311,477,0]Ak[3995,13,1941,0,4755,477,0]Ak[3995,13,1941,0,4757,477,0]Ak[3995,13,1941,0,4987,477,0]Ak[3995,13,1941,0,1355,477,0]An[4784,13,4785,4571,4301,477,0]An[4784,13,4785,3204,3152,477,0]An[4784,13,4785,1087,1583,477,0]An[4784,13,4785,2171,2031,477,0]An[4784,13,4785,2171,3365,477,0]An[4784,13,4785,2171,3371,477,0]An[4784,13,4785,3747,3340,477,0]An[4784,13,4785,1083,3362,477,0]An[4784,13,4785,1859,4339,477,0]An[4784,13,4785,2468,2422,477,0]An[4784,13,4785,2468,4307,477,0]An[4784,13,4785,1924,5200,477,0]An[4784,13,4785,4347,5170,477,0]An[4784,13,4785,1568,4559,477,0]An[4784,13,4785,1568,4195,477,0]An[4784,13,4785,1568,4434,477,0]An[4784,13,4785,1978,1619,477,0]An[4784,13,4785,1978,4992,477,0]An[4784,13,4785,3195,1339,477,0]An[4784,13,4785,3204,4833,477,0]An[4784,13,4785,1542,1602,477,0]An[4784,13,4785,1542,4206,477,0]An[4784,13,4785,1542,3360,477,0]An[4784,13,4785,1542,3175,477,0]An[4784,13,4785,1542,4831,477,0]An[4784,13,4785,1542,4887,477,0]An[4784,13,4785,1542,3335,477,0]An[4784,13,4785,1558,2458,477,0]An[4784,13,4785,1558,3346,477,0]An[4784,13,4785,1558,3177,477,0]An[4784,13,4785,1558,4543,477,0]An[4784,13,4785,1087,3180,477,0]An[4784,13,4785,1087,4334,477,0]An[4784,13,4785,1092,2038,477,0]An[4784,13,4785,1092,3385,477,0]An[4784,13,4785,1092,4039,477,0]An[4784,13,4785,2171,4057,477,0]An[4784,13,4785,2171,4444,477,0]An[4784,13,4785,2171,4172,477,0]An[4784,13,4785,3747,4539,477,0]An[4784,13,4785,3747,3172,477,0]An[4784,13,4785,3747,4410,477,0]An[4784,13,4785,3747,5077,477,0]An[4784,13,4785,3747,1360,477,0]An[4784,13,4785,1083,4553,477,0]An[4784,13,4785,3322,4562,477,0]An[4784,13,4785,3322,4857,477,0]An[4784,13,4785,3322,4872,477,0]An[4784,13,4785,3322,4041,477,0]An[4784,13,4785,1859,4420,477,0]An[4784,13,4785,1859,4212,477,0]An[4784,13,4785,1859,5049,477,0]An[4784,13,4785,1859,4164,477,0]An[4784,13,4785,1859,4031,477,0]An[4784,13,4785,1532,3160,477,0]An[4784,13,4785,1532,4425,477,0]An[4784,13,4785,1532,3352,477,0]An[4784,13,4785,1532,3374,477,0]An[4784,13,4785,1532,4179,477,0]An[4784,13,4785,1532,4537,477,0]An[4784,13,4785,1532,4730,477,0]An[4784,13,4785,1532,2415,477,0]An[4784,13,4785,2468,4734,477,0]An[4784,13,4785,2468,2426,477,0]An[4784,13,4785,2468,4175,477,0]An[4784,13,4785,2468,4025,477,0]An[4784,13,4785,2468,3368,477,0]An[4784,13,4785,1924,4329,477,0]An[4784,13,4785,1924,4551,477,0]An[4784,13,4785,1924,5080,477,0]An[4784,13,4785,1924,2428,477,0]An[4784,13,4785,1924,4829,477,0]An[4784,13,4785,1952,4541,477,0]An[4784,13,4785,1952,4308,477,0]An[4784,13,4785,1952,4178,477,0]An[4784,13,4785,1952,4183,477,0]Ak[4784,13,4785,0,4448,477,0]Ak[4784,13,4785,0,4891,477,0]An[4784,13,4785,4347,3349,477,0]An[4784,13,4785,4347,5175,477,0]An[4784,13,4785,4922,4760,477,0]Am[4784,13,4785,4785,492,477,0]Am[4784,13,4785,4785,123,477,0]An[4784,13,4785,4785,2445,477,0]An[4784,13,4785,4785,2455,477,0]An[4784,13,4785,4785,3158,477,0]An[4784,13,1857,1857,4340,477,0]An[4784,13,5033,5033,4932,477,0]An[4784,13,5033,5033,1357,477,0]An[4784,13,1862,1862,2006,477,0]Am[4784,13,1862,1862,479,477,0]An[4784,13,1862,1862,5141,477,0]An[4784,13,1862,1862,4034,477,0]An[4784,13,1862,1862,4897,477,0]An[4784,13,1942,1942,3380,477,0]An[4784,13,1942,1942,4312,477,0]An[4784,13,1942,1942,4756,477,0]An[4784,13,1942,1942,4758,477,0]An[4784,13,1942,1942,4988,477,0]Ak[4784,13,1942,0,1356,477,0]Al[4784,13,3742,138,117,477,0]Am[4784,13,3742,138,3147,477,0]An[4784,13,3742,1528,1343,477,0]An[4784,13,3742,1528,4036,477,0]An[4784,13,3742,2516,2011,477,0]An[4784,13,3742,2516,4327,477,0]An[4784,13,3742,3742,4821,477,0]An[4784,13,2142,2142,1358,477,0]An[4784,13,2142,2142,1361,477,0]An[4484,13,4485,4485,3383,477,0]Am[4484,13,4485,399,4449,477,0]An[4484,13,4485,4485,2442,477,0]An[4484,13,4485,4485,2456,477,0]An[4484,13,4485,4485,4184,477,0]An[1062,13,1063,1063,3149,477,0]An[1062,13,1063,1063,4926,477,0]Am[1062,13,1851,1851,131,477,0]An[1062,13,1557,1557,1376,477,0]An[1062,13,1557,1557,4059,477,0]An[1062,13,1557,1557,4547,477,0]An[1062,13,4269,4269,5126,477,0]An[1062,13,4269,4269,5127,477,0]Am[1062,13,1947,1947,132,477,0]Am[4015,13,4016,4016,121,477,0]An[4015,13,4016,4016,2412,477,0]Ac[501,7,502,0,0,0,0]Ae[4064,7,4065,0,0,0,0]Ae[4350,7,4351,0,0,0,0]Ae[4015,7,4016,0,0,0,0]Ae[4851,7,4852,0,0,0,0]Al[4784,13,4785,1087,1583,0,0]Ai[3995,12,1861,0,1989,0,0]Al[4784,13,4785,2171,2031,0,0]Al[4784,12,1862,1862,1990,0,0]Al[3995,13,3996,3746,3339,0,0]Ab[1062,3,0,0,0,0,0]Ak[3995,13,3996,1061,484,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,13,4785,3747,3340,0,0]Al[4784,14,4785,1558,3346,0,0]Al[3995,12,3996,2163,3328,0,0]Ao[3995,13,3996,3746,4566,1591,0]Ao[3995,13,3996,3746,2435,1591,0]Ao[3995,13,3996,1061,2436,1591,0]Ao[3995,13,3996,3746,3337,1591,0]Ao[3995,13,3996,3746,2013,1591,0]Ao[3995,13,3996,3746,1594,1591,0]Ao[3995,13,3996,3746,3139,1591,0]Ao[3995,13,3996,3746,2409,1591,0]Ao[3995,13,3996,3746,4202,1591,0]Ao[3995,13,3996,3746,4207,1591,0]Ao[3995,13,3996,2467,1575,1591,0]Ao[3995,13,3996,2494,4424,1591,0]Ao[3995,13,3996,4136,2027,1591,0]?Al[3995,13,3996,4131,3364,0,0]Al[4784,13,4785,2171,3365,0,0]Al[4784,13,5033,5033,4932,0,0]Al[4784,13,4785,3204,3152,0,0]Ak[4484,13,4485,399,4449,0,0]Ai[3995,12,1861,0,1989,0,0]Al[4784,12,1862,1862,1990,0,0]32Ai[3995,13,3996,0,5048,0,0]Al[4784,13,4785,1859,5049,0,0]Al[3995,13,3996,3746,3339,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,12,1861,0,2001,0,0]Al[4784,12,1862,1862,2002,0,0]Al[1379,14,1556,1556,4445,0,0]Ai[3995,14,3996,0,2454,0,0]Al[4784,14,4785,4785,2455,0,0]Ai[4784,14,4550,0,1372,0,0]Al[3995,13,3996,4131,3364,0,0]Al[3995,13,3996,4131,4933,0,0]Al[4784,13,4785,2171,3365,0,0]Ai[3995,12,3996,0,3381,0,0]Al[3995,13,3996,0,4433,3381,0]Al[3995,13,3996,0,4759,3381,0]Al[4784,12,4785,1568,3382,0,0]Ao[4784,13,4785,1568,4434,3382,0]Ao[4784,13,4785,4922,4760,3382,0]Am[1379,13,1380,1380,130,494,0]An[1379,13,1380,1380,4027,494,0]An[1379,13,1556,1556,4058,494,0]An[1379,13,1556,1556,1375,494,0]An[1379,13,1556,1556,4445,494,0]Ak[501,13,502,502,4028,494,0]An[4064,13,4065,4065,5081,494,0]An[3995,13,3996,3746,4566,494,0]An[3995,13,3996,3746,2435,494,0]Ak[3995,13,3996,0,4300,494,0]An[3995,13,3996,1061,2436,494,0]An[3995,13,3996,1061,4726,494,0]An[3995,13,3996,3746,3337,494,0]An[3995,13,3996,3746,3339,494,0]An[3995,13,3996,3746,2013,494,0]An[3995,13,3996,3746,1594,494,0]An[3995,13,3996,3746,3139,494,0]An[3995,13,3996,3746,2409,494,0]An[3995,13,3996,3746,4202,494,0]An[3995,13,3996,3746,4207,494,0]An[3995,13,3996,3746,4994,494,0]An[3995,13,3996,3746,4832,494,0]An[3995,13,3996,2467,2421,494,0]An[3995,13,3996,2467,4309,494,0]An[3995,13,3996,2467,1575,494,0]An[3995,13,3996,2494,2425,494,0]An[3995,13,3996,2494,3367,494,0]An[3995,13,3996,2494,4424,494,0]Am[3995,13,3996,1061,484,494,0]An[3995,13,3996,1061,4450,494,0]An[3995,13,3996,4131,3364,494,0]An[3995,13,3996,4131,4933,494,0]An[3995,13,3996,4131,4443,494,0]An[3995,13,3996,4131,3179,494,0]An[3995,13,3996,4131,3366,494,0]An[3995,13,3996,4131,4442,494,0]An[3995,13,3996,1569,4217,494,0]An[3995,13,3996,1104,4053,494,0]An[3995,13,3996,4136,3370,494,0]An[3995,13,3996,4136,3384,494,0]An[3995,13,3996,4136,4216,494,0]An[3995,13,3996,4136,2027,494,0]Ak[3995,13,3996,0,3361,494,0]Ak[3995,13,3996,0,4338,494,0]Ak[3995,13,3996,0,4558,494,0]Ak[3995,13,3996,0,4194,494,0]Ak[3995,13,3996,0,4433,494,0]Ak[3995,13,3996,0,1618,494,0]Ak[3995,13,3996,0,4991,494,0]Ak[3995,13,3996,0,1338,494,0]Ak[3995,13,3996,0,1601,494,0]Ak[3995,13,3996,0,2457,494,0]Ak[3995,13,3996,0,3345,494,0]Ak[3995,13,3996,0,3176,494,0]Ak[3995,13,3996,0,4542,494,0]Ak[3995,13,3996,0,2037,494,0]Ak[3995,13,3996,0,4168,494,0]Ak[3995,13,3996,0,4538,494,0]Ak[3995,13,3996,0,4552,494,0]Ak[3995,13,3996,0,4561,494,0]Ak[3995,13,3996,0,4856,494,0]Ak[3995,13,3996,0,4871,494,0]Ak[3995,13,3996,0,4040,494,0]Ak[3995,13,3996,0,4419,494,0]Ak[3995,13,3996,0,4210,494,0]Ak[3995,13,3996,0,5048,494,0]Ak[3995,13,3996,0,4162,494,0]Ak[3995,13,3996,0,4030,494,0]Ak[3995,13,3996,0,3159,494,0]Ak[3995,13,3996,0,4535,494,0]Ak[3995,13,3996,0,4728,494,0]Ak[3995,13,3996,0,4174,494,0]Ak[3995,13,3996,0,4177,494,0]Ak[3995,13,3996,0,4182,494,0]Ak[3995,13,3996,0,4890,494,0]Ak[3995,13,3996,0,3348,494,0]Ak[3995,13,3996,0,4759,494,0]Aj[3995,13,3996,0,491,494,0]Aj[3995,13,3996,0,122,494,0]Ak[3995,13,3996,0,2444,494,0]Ak[3995,13,3996,0,2454,494,0]Aj[3995,13,3741,0,116,494,0]Ak[3995,13,3741,0,3146,494,0]Ak[3995,13,3741,0,1342,494,0]Ak[3995,13,3741,0,4035,494,0]Ak[3995,13,3741,0,2010,494,0]Ak[3995,13,3741,0,4326,494,0]Ak[3995,13,3741,0,4820,494,0]Ak[3995,13,1861,0,2005,494,0]Aj[3995,13,1861,0,478,494,0]Ak[3995,13,1861,0,5140,494,0]Ak[3995,13,1861,0,4033,494,0]Ak[3995,13,1861,0,4894,494,0]Ak[3995,13,1941,0,3379,494,0]Ak[3995,13,1941,0,4311,494,0]Ak[3995,13,1941,0,4755,494,0]Ak[3995,13,1941,0,4757,494,0]Ak[3995,13,1941,0,4987,494,0]Ak[3995,13,1941,0,1355,494,0]An[4784,13,4785,4571,4301,494,0]An[4784,13,4785,3204,3152,494,0]An[4784,13,4785,1087,1583,494,0]An[4784,13,4785,2171,2031,494,0]An[4784,13,4785,2171,3365,494,0]An[4784,13,4785,2171,3371,494,0]An[4784,13,4785,3747,3340,494,0]An[4784,13,4785,1083,3362,494,0]An[4784,13,4785,1859,4339,494,0]An[4784,13,4785,2468,2422,494,0]An[4784,13,4785,2468,4307,494,0]An[4784,13,4785,1924,5200,494,0]An[4784,13,4785,4347,5170,494,0]An[4784,13,4785,1568,4559,494,0]An[4784,13,4785,1568,4195,494,0]An[4784,13,4785,1568,4434,494,0]An[4784,13,4785,1978,1619,494,0]An[4784,13,4785,1978,4992,494,0]An[4784,13,4785,3195,1339,494,0]An[4784,13,4785,3204,4833,494,0]An[4784,13,4785,1542,1602,494,0]An[4784,13,4785,1542,4206,494,0]An[4784,13,4785,1542,3360,494,0]An[4784,13,4785,1542,3175,494,0]An[4784,13,4785,1542,4831,494,0]An[4784,13,4785,1542,4887,494,0]An[4784,13,4785,1542,3335,494,0]An[4784,13,4785,1558,2458,494,0]An[4784,13,4785,1558,3346,494,0]An[4784,13,4785,1558,3177,494,0]An[4784,13,4785,1558,4543,494,0]An[4784,13,4785,1087,3180,494,0]An[4784,13,4785,1087,4334,494,0]An[4784,13,4785,1092,2038,494,0]An[4784,13,4785,1092,3385,494,0]An[4784,13,4785,1092,4039,494,0]An[4784,13,4785,2171,4057,494,0]An[4784,13,4785,2171,4444,494,0]An[4784,13,4785,2171,4172,494,0]An[4784,13,4785,3747,4539,494,0]An[4784,13,4785,3747,3172,494,0]An[4784,13,4785,3747,4410,494,0]An[4784,13,4785,3747,5077,494,0]An[4784,13,4785,3747,1360,494,0]An[4784,13,4785,1083,4553,494,0]An[4784,13,4785,3322,4562,494,0]An[4784,13,4785,3322,4857,494,0]An[4784,13,4785,3322,4872,494,0]An[4784,13,4785,3322,4041,494,0]An[4784,13,4785,1859,4420,494,0]An[4784,13,4785,1859,4212,494,0]An[4784,13,4785,1859,5049,494,0]An[4784,13,4785,1859,4164,494,0]An[4784,13,4785,1859,4031,494,0]An[4784,13,4785,1532,3160,494,0]An[4784,13,4785,1532,4425,494,0]An[4784,13,4785,1532,3352,494,0]An[4784,13,4785,1532,3374,494,0]An[4784,13,4785,1532,4179,494,0]An[4784,13,4785,1532,4537,494,0]An[4784,13,4785,1532,4730,494,0]An[4784,13,4785,1532,2415,494,0]An[4784,13,4785,2468,4734,494,0]An[4784,13,4785,2468,2426,494,0]An[4784,13,4785,2468,4175,494,0]An[4784,13,4785,2468,4025,494,0]An[4784,13,4785,2468,3368,494,0]An[4784,13,4785,1924,4329,494,0]An[4784,13,4785,1924,4551,494,0]An[4784,13,4785,1924,5080,494,0]An[4784,13,4785,1924,2428,494,0]An[4784,13,4785,1924,4829,494,0]An[4784,13,4785,1952,4541,494,0]An[4784,13,4785,1952,4308,494,0]An[4784,13,4785,1952,4178,494,0]An[4784,13,4785,1952,4183,494,0]Ak[4784,13,4785,0,4448,494,0]Ak[4784,13,4785,0,4891,494,0]An[4784,13,4785,4347,3349,494,0]An[4784,13,4785,4347,5175,494,0]An[4784,13,4785,4922,4760,494,0]Am[4784,13,4785,4785,492,494,0]Am[4784,13,4785,4785,123,494,0]An[4784,13,4785,4785,2445,494,0]An[4784,13,4785,4785,2455,494,0]An[4784,13,4785,4785,3158,494,0]An[4784,13,1857,1857,4340,494,0]An[4784,13,5033,5033,4932,494,0]An[4784,13,5033,5033,1357,494,0]An[4784,13,1862,1862,2006,494,0]Am[4784,13,1862,1862,479,494,0]An[4784,13,1862,1862,5141,494,0]An[4784,13,1862,1862,4034,494,0]An[4784,13,1862,1862,4897,494,0]An[4784,13,1942,1942,3380,494,0]An[4784,13,1942,1942,4312,494,0]An[4784,13,1942,1942,4756,494,0]An[4784,13,1942,1942,4758,494,0]An[4784,13,1942,1942,4988,494,0]Ak[4784,13,1942,0,1356,494,0]Al[4784,13,3742,138,117,494,0]Am[4784,13,3742,138,3147,494,0]An[4784,13,3742,1528,1343,494,0]An[4784,13,3742,1528,4036,494,0]An[4784,13,3742,2516,2011,494,0]An[4784,13,3742,2516,4327,494,0]An[4784,13,3742,3742,4821,494,0]An[4784,13,2142,2142,1358,494,0]An[4784,13,2142,2142,1361,494,0]An[1062,13,1063,1063,3149,494,0]An[1062,13,1063,1063,4926,494,0]Am[1062,13,1851,1851,131,494,0]An[1062,13,1557,1557,1376,494,0]An[1062,13,1557,1557,4059,494,0]An[1062,13,1557,1557,4547,494,0]An[1062,13,4269,4269,5126,494,0]An[1062,13,4269,4269,5127,494,0]Am[1062,13,1947,1947,132,494,0]Am[4015,13,4016,4016,121,494,0]An[4015,13,4016,4016,2412,494,0]Ah[3995,5,3996,3195,0,0,0]Ah[4784,5,4785,3195,0,0,0]Ah[3995,5,3741,1528,0,0,0]Ah[4784,5,3742,1528,0,0,0]Al[1062,15,1063,1063,4926,0,0]Ah[3995,6,1941,1531,0,0,0]Ah[4784,6,1942,1531,0,0,0]Ae[4784,6,5033,0,0,0,0]Ae[4784,6,2142,0,0,0,0]Ah[4784,6,4785,3747,0,0,0]1Al[4784,15,4785,1532,3352,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Al[3995,15,3996,4131,3179,0,0]Ai[3995,15,3996,0,4538,0,0]Al[4784,15,4785,1087,3180,0,0]Al[4784,15,4785,3747,4539,0,0]Al[4784,15,4785,1924,4551,0,0]0Ae[1379,5,1556,0,0,0,0]Ae[1062,5,1557,0,0,0,0]Ab[1379,3,0,0,0,0,0]Ai[3995,12,3741,0,4818,0,0]Al[3995,13,3741,0,3146,4818,0]Al[3995,13,3741,0,4035,4818,0]Al[3995,13,3741,0,4326,4818,0]Al[4784,12,3742,3742,4819,0,0]An[4784,13,3742,138,3147,4819,0]Ao[4784,13,3742,1528,4036,4819,0]Ao[4784,13,3742,2516,4327,4819,0]Al[1062,13,1063,1063,4926,0,0]Ai[3995,14,3996,0,1338,0,0]Ai[3995,14,3996,0,2457,0,0]Ai[3995,14,3996,0,2037,0,0]Al[4784,14,4785,3195,1339,0,0]Al[4784,14,4785,1558,2458,0,0]Al[4784,14,4785,1092,2038,0,0]Al[4784,14,4785,2468,4025,0,0]An[1379,13,1380,1380,130,1340,0]Ao[1379,13,1380,1380,4027,1340,0]Ao[3995,13,3996,3746,3339,1340,0]Ao[3995,13,3996,3746,4994,1340,0]Ao[3995,13,3996,3746,4832,1340,0]Ao[3995,13,3996,2467,2421,1340,0]Ao[3995,13,3996,2467,4309,1340,0]An[3995,13,3996,1061,484,1340,0]Ao[3995,13,3996,1061,4450,1340,0]Ao[3995,13,3996,4131,4443,1340,0]Ao[3995,13,3996,4131,3179,1340,0]Ao[3995,13,3996,4131,3366,1340,0]Ao[3995,13,3996,4131,4442,1340,0]Ao[3995,13,3996,4136,3384,1340,0]Ao[3995,13,3996,4136,4216,1340,0]Al[3995,13,3996,0,1618,1340,0]Al[3995,13,3996,0,4991,1340,0]Al[3995,13,3996,0,1601,1340,0]Al[3995,13,3996,0,2457,1340,0]Al[3995,13,3996,0,3345,1340,0]Al[3995,13,3996,0,3176,1340,0]Al[3995,13,3996,0,4542,1340,0]Al[3995,13,3996,0,2037,1340,0]Al[3995,13,3996,0,4168,1340,0]Al[3995,13,3996,0,4538,1340,0]Al[3995,13,3996,0,4561,1340,0]Al[3995,13,3996,0,4856,1340,0]Al[3995,13,3996,0,4871,1340,0]Al[3995,13,3996,0,4040,1340,0]Al[3995,13,3996,0,4419,1340,0]Al[3995,13,3996,0,4210,1340,0]Al[3995,13,3996,0,5048,1340,0]Al[3995,13,3996,0,4162,1340,0]Al[3995,13,3996,0,4030,1340,0]Al[3995,13,3996,0,3159,1340,0]Al[3995,13,3996,0,4535,1340,0]Al[3995,13,3996,0,4728,1340,0]Al[3995,13,3996,0,4174,1340,0]Al[3995,13,3996,0,4177,1340,0]Al[3995,13,3996,0,4182,1340,0]Al[3995,13,3996,0,4890,1340,0]Al[3995,13,3996,0,3348,1340,0]Ak[3995,13,3996,0,491,1340,0]Ak[3995,13,3996,0,122,1340,0]Al[3995,13,3996,0,2444,1340,0]Ak[3995,13,3741,0,116,1340,0]Al[3995,13,3741,0,3146,1340,0]Al[3995,13,3741,0,1342,1340,0]Al[3995,13,3741,0,4035,1340,0]Al[3995,13,3741,0,2010,1340,0]Al[3995,13,3741,0,4326,1340,0]Al[3995,13,1941,0,4987,1340,0]Al[3995,13,1941,0,1355,1340,0]Ao[4784,13,4785,1978,1619,1340,0]Ao[4784,13,4785,1978,4992,1340,0]Ao[4784,13,4785,3204,4833,1340,0]Ao[4784,13,4785,1542,1602,1340,0]Ao[4784,13,4785,1542,4206,1340,0]Ao[4784,13,4785,1542,3360,1340,0]Ao[4784,13,4785,1542,3175,1340,0]Ao[4784,13,4785,1542,4831,1340,0]Ao[4784,13,4785,1542,4887,1340,0]Ao[4784,13,4785,1542,3335,1340,0]Ao[4784,13,4785,1558,2458,1340,0]Ao[4784,13,4785,1558,3346,1340,0]Ao[4784,13,4785,1558,3177,1340,0]Ao[4784,13,4785,1558,4543,1340,0]Ao[4784,13,4785,1087,3180,1340,0]Ao[4784,13,4785,1087,4334,1340,0]Ao[4784,13,4785,1092,2038,1340,0]Ao[4784,13,4785,1092,3385,1340,0]Ao[4784,13,4785,1092,4039,1340,0]Ao[4784,13,4785,2171,4444,1340,0]Ao[4784,13,4785,2171,4172,1340,0]Ao[4784,13,4785,3747,4539,1340,0]Ao[4784,13,4785,3747,3172,1340,0]Ao[4784,13,4785,3747,4410,1340,0]Ao[4784,13,4785,3747,5077,1340,0]Ao[4784,13,4785,3322,4562,1340,0]Ao[4784,13,4785,3322,4857,1340,0]Ao[4784,13,4785,3322,4872,1340,0]Ao[4784,13,4785,3322,4041,1340,0]Ao[4784,13,4785,1859,4420,1340,0]Ao[4784,13,4785,1859,4212,1340,0]Ao[4784,13,4785,1859,5049,1340,0]Ao[4784,13,4785,1859,4164,1340,0]Ao[4784,13,4785,1859,4031,1340,0]Ao[4784,13,4785,1532,3160,1340,0]Ao[4784,13,4785,1532,3352,1340,0]Ao[4784,13,4785,1532,3374,1340,0]Ao[4784,13,4785,1532,4179,1340,0]Ao[4784,13,4785,1532,4537,1340,0]Ao[4784,13,4785,1532,4730,1340,0]Ao[4784,13,4785,1532,2415,1340,0]Ao[4784,13,4785,2468,4734,1340,0]Ao[4784,13,4785,2468,4175,1340,0]Ao[4784,13,4785,1924,4551,1340,0]Ao[4784,13,4785,1924,5080,1340,0]Ao[4784,13,4785,1924,2428,1340,0]Ao[4784,13,4785,1924,4829,1340,0]Ao[4784,13,4785,1952,4178,1340,0]Ao[4784,13,4785,1952,4183,1340,0]Al[4784,13,4785,0,4448,1340,0]Al[4784,13,4785,0,4891,1340,0]Ao[4784,13,4785,4347,3349,1340,0]Ao[4784,13,4785,4347,5175,1340,0]An[4784,13,4785,4785,492,1340,0]An[4784,13,4785,4785,123,1340,0]Ao[4784,13,4785,4785,2445,1340,0]Ao[4784,13,4785,4785,3158,1340,0]Ao[4784,13,1857,1857,4340,1340,0]Ao[4784,13,5033,5033,4932,1340,0]Ao[4784,13,5033,5033,1357,1340,0]Ao[4784,13,1942,1942,4988,1340,0]Al[4784,13,1942,0,1356,1340,0]Am[4784,13,3742,138,117,1340,0]An[4784,13,3742,138,3147,1340,0]Ao[4784,13,3742,1528,1343,1340,0]Ao[4784,13,3742,1528,4036,1340,0]Ao[4784,13,3742,2516,2011,1340,0]Ao[4784,13,3742,2516,4327,1340,0]Ao[4784,13,2142,2142,1361,1340,0]Ao[4484,13,4485,4485,2442,1340,0]Ao[4484,13,4485,4485,2456,1340,0]Ao[4484,13,4485,4485,4184,1340,0]Ao[1062,13,1063,1063,4926,1340,0]Ao[1062,13,1557,1557,4547,1340,0]Al[3995,13,3996,3746,3339,0,0]Al[3995,13,3996,2467,2421,0,0]Ak[3995,13,3996,1061,484,0,0]Al[4784,13,4785,3747,3340,0,0]Al[3995,13,3996,0,4177,1346,0]Ao[4784,13,4785,1952,4178,1346,0]Ai[4784,14,4785,0,4448,0,0]Ai[3995,13,3996,0,2444,0,0]Al[4784,13,4785,4785,2445,0,0]Ai[3995,13,3996,0,4182,0,0]Al[4784,13,4785,1952,4183,0,0]Ai[3995,14,1861,0,2005,0,0]Al[4784,14,1862,1862,2006,0,0]Al[4784,12,4785,1924,4862,0,0]Ao[4784,13,4785,1924,5200,4862,0];Al[1379,13,1556,1556,1375,0,0]Ai[501,13,502,502,4028,0,0]Al[1062,13,1557,1557,1376,0,0]Al[3995,12,3996,2163,3328,0,0]Al[3995,13,3996,4136,3370,0,0]Al[4784,13,4785,2171,3371,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2468,2422,0,0]Al[3995,12,3996,2163,2022,0,0]Ao[3995,13,3996,1569,4217,2022,0]Ao[3995,13,3996,1104,4053,2022,0]Ae[1379,2,1380,0,0,0,0]Ak[1379,14,1380,1380,130,0,0]Al[3995,13,3996,3746,3339,0,0]Al[3995,13,3996,2467,2421,0,0]Ak[3995,13,3996,1061,484,0,0]Al[4784,13,4785,3747,3340,0,0]Ae[1062,2,1063,0,0,0,0]Ai[3995,13,3996,0,3361,0,0]Al[4784,13,4785,1083,3362,0,0]?>Al[4784,13,5033,5033,4932,0,0]Ah[3995,5,3996,2467,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Al[1379,15,1380,1380,4027,0,0]0Al[4784,15,4785,1542,3360,0,0]Ah[4784,5,4785,1087,0,0,0]Ah[3995,15,3996,0,491,0,0]Ak[4784,15,4785,4785,492,0,0]Al[4015,15,4016,4016,2412,0,0]Al[4784,15,2142,2142,1358,0,0]87Ah[3995,5,3996,3746,0,0,0]Al[4784,15,4785,1542,3175,0,0]Al[4784,15,4785,2171,4057,0,0]Ah[3995,5,3996,1542,0,0,0]Ah[4784,5,4785,1542,0,0,0]Ae[4784,8,1857,0,0,0,0]987>Al[4784,15,4785,3747,1360,0,0]>Ah[3995,5,3996,1978,0,0,0]Ah[4784,5,4785,1978,0,0,0]Al[3995,13,3996,2467,2421,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2171,2031,0,0]Al[4784,13,4785,2468,2422,0,0]An[1379,13,1380,1380,130,1581,0]Ao[1379,13,1380,1380,4027,1581,0]Ao[1379,13,1556,1556,4058,1581,0]Ao[1379,13,1556,1556,1375,1581,0]Ao[1379,13,1556,1556,4445,1581,0]Al[501,13,502,502,4028,1581,0]Ao[4064,13,4065,4065,5081,1581,0]Ao[3995,13,3996,3746,4566,1581,0]Ao[3995,13,3996,3746,2435,1581,0]Al[3995,13,3996,0,4300,1581,0]Ao[3995,13,3996,1061,2436,1581,0]Ao[3995,13,3996,1061,4726,1581,0]Ao[3995,13,3996,3746,3337,1581,0]Ao[3995,13,3996,3746,3339,1581,0]Ao[3995,13,3996,3746,2013,1581,0]Ao[3995,13,3996,3746,1594,1581,0]Ao[3995,13,3996,3746,3139,1581,0]Ao[3995,13,3996,3746,2409,1581,0]Ao[3995,13,3996,3746,4202,1581,0]Ao[3995,13,3996,3746,4207,1581,0]Ao[3995,13,3996,3746,4994,1581,0]Ao[3995,13,3996,3746,4832,1581,0]Ao[3995,13,3996,2467,2421,1581,0]Ao[3995,13,3996,2467,4309,1581,0]Ao[3995,13,3996,2467,1575,1581,0]Ao[3995,13,3996,2494,2425,1581,0]Ao[3995,13,3996,2494,3367,1581,0]Ao[3995,13,3996,2494,4424,1581,0]An[3995,13,3996,1061,484,1581,0]Ao[3995,13,3996,1061,4450,1581,0]Ao[3995,13,3996,4131,3364,1581,0]Ao[3995,13,3996,4131,4933,1581,0]Ao[3995,13,3996,4131,4443,1581,0]Ao[3995,13,3996,4131,3179,1581,0]Ao[3995,13,3996,4131,3366,1581,0]Ao[3995,13,3996,4131,4442,1581,0]Ao[3995,13,3996,1569,4217,1581,0]Ao[3995,13,3996,1104,4053,1581,0]Ao[3995,13,3996,4136,3370,1581,0]Ao[3995,13,3996,4136,3384,1581,0]Ao[3995,13,3996,4136,4216,1581,0]Ao[3995,13,3996,4136,2027,1581,0]Al[3995,13,3996,0,3361,1581,0]Al[3995,13,3996,0,4338,1581,0]Al[3995,13,3996,0,4558,1581,0]Al[3995,13,3996,0,4194,1581,0]Al[3995,13,3996,0,4433,1581,0]Al[3995,13,3996,0,1618,1581,0]Al[3995,13,3996,0,4991,1581,0]Al[3995,13,3996,0,1338,1581,0]Al[3995,13,3996,0,1601,1581,0]Al[3995,13,3996,0,2457,1581,0]Al[3995,13,3996,0,3345,1581,0]Al[3995,13,3996,0,3176,1581,0]Al[3995,13,3996,0,4542,1581,0]Al[3995,13,3996,0,2037,1581,0]Al[3995,13,3996,0,4168,1581,0]Al[3995,13,3996,0,4538,1581,0]Al[3995,13,3996,0,4552,1581,0]Al[3995,13,3996,0,4561,1581,0]Al[3995,13,3996,0,4856,1581,0]Al[3995,13,3996,0,4871,1581,0]Al[3995,13,3996,0,4040,1581,0]Al[3995,13,3996,0,4419,1581,0]Al[3995,13,3996,0,4210,1581,0]Al[3995,13,3996,0,5048,1581,0]Al[3995,13,3996,0,4162,1581,0]Al[3995,13,3996,0,4030,1581,0]Al[3995,13,3996,0,3159,1581,0]Al[3995,13,3996,0,4535,1581,0]Al[3995,13,3996,0,4728,1581,0]Al[3995,13,3996,0,4174,1581,0]Al[3995,13,3996,0,4177,1581,0]Al[3995,13,3996,0,4182,1581,0]Al[3995,13,3996,0,4890,1581,0]Al[3995,13,3996,0,3348,1581,0]Al[3995,13,3996,0,4759,1581,0]Ak[3995,13,3996,0,491,1581,0]Ak[3995,13,3996,0,122,1581,0]Al[3995,13,3996,0,2444,1581,0]Al[3995,13,3996,0,2454,1581,0]Ak[3995,13,3741,0,116,1581,0]Al[3995,13,3741,0,3146,1581,0]Al[3995,13,3741,0,1342,1581,0]Al[3995,13,3741,0,4035,1581,0]Al[3995,13,3741,0,2010,1581,0]Al[3995,13,3741,0,4326,1581,0]Al[3995,13,3741,0,4820,1581,0]Al[3995,13,1861,0,2005,1581,0]Ak[3995,13,1861,0,478,1581,0]Al[3995,13,1861,0,5140,1581,0]Al[3995,13,1861,0,4033,1581,0]Al[3995,13,1861,0,4894,1581,0]Al[3995,13,1941,0,3379,1581,0]Al[3995,13,1941,0,4311,1581,0]Al[3995,13,1941,0,4755,1581,0]Al[3995,13,1941,0,4757,1581,0]Al[3995,13,1941,0,4987,1581,0]Al[3995,13,1941,0,1355,1581,0]Ao[4784,13,4785,4571,4301,1581,0]Ao[4784,13,4785,3204,3152,1581,0]Ao[4784,13,4785,1087,1583,1581,0]Ao[4784,13,4785,2171,2031,1581,0]Ao[4784,13,4785,2171,3365,1581,0]Ao[4784,13,4785,2171,3371,1581,0]Ao[4784,13,4785,3747,3340,1581,0]Ao[4784,13,4785,1083,3362,1581,0]Ao[4784,13,4785,1859,4339,1581,0]Ao[4784,13,4785,2468,2422,1581,0]Ao[4784,13,4785,2468,4307,1581,0]Ao[4784,13,4785,1924,5200,1581,0]Ao[4784,13,4785,4347,5170,1581,0]Ao[4784,13,4785,1568,4559,1581,0]Ao[4784,13,4785,1568,4195,1581,0]Ao[4784,13,4785,1568,4434,1581,0]Ao[4784,13,4785,1978,1619,1581,0]Ao[4784,13,4785,1978,4992,1581,0]Ao[4784,13,4785,3195,1339,1581,0]Ao[4784,13,4785,3204,4833,1581,0]Ao[4784,13,4785,1542,1602,1581,0]Ao[4784,13,4785,1542,4206,1581,0]Ao[4784,13,4785,1542,3360,1581,0]Ao[4784,13,4785,1542,3175,1581,0]Ao[4784,13,4785,1542,4831,1581,0]Ao[4784,13,4785,1542,4887,1581,0]Ao[4784,13,4785,1542,3335,1581,0]Ao[4784,13,4785,1558,2458,1581,0]Ao[4784,13,4785,1558,3346,1581,0]Ao[4784,13,4785,1558,3177,1581,0]Ao[4784,13,4785,1558,4543,1581,0]Ao[4784,13,4785,1087,3180,1581,0]Ao[4784,13,4785,1087,4334,1581,0]Ao[4784,13,4785,1092,2038,1581,0]Ao[4784,13,4785,1092,3385,1581,0]Ao[4784,13,4785,1092,4039,1581,0]Ao[4784,13,4785,2171,4057,1581,0]Ao[4784,13,4785,2171,4444,1581,0]Ao[4784,13,4785,2171,4172,1581,0]Ao[4784,13,4785,3747,4539,1581,0]Ao[4784,13,4785,3747,3172,1581,0]Ao[4784,13,4785,3747,4410,1581,0]Ao[4784,13,4785,3747,5077,1581,0]Ao[4784,13,4785,3747,1360,1581,0]Ao[4784,13,4785,1083,4553,1581,0]Ao[4784,13,4785,3322,4562,1581,0]Ao[4784,13,4785,3322,4857,1581,0]Ao[4784,13,4785,3322,4872,1581,0]Ao[4784,13,4785,3322,4041,1581,0]Ao[4784,13,4785,1859,4420,1581,0]Ao[4784,13,4785,1859,4212,1581,0]Ao[4784,13,4785,1859,5049,1581,0]Ao[4784,13,4785,1859,4164,1581,0]Ao[4784,13,4785,1859,4031,1581,0]Ao[4784,13,4785,1532,3160,1581,0]Ao[4784,13,4785,1532,4425,1581,0]Ao[4784,13,4785,1532,3352,1581,0]Ao[4784,13,4785,1532,3374,1581,0]Ao[4784,13,4785,1532,4179,1581,0]Ao[4784,13,4785,1532,4537,1581,0]Ao[4784,13,4785,1532,4730,1581,0]Ao[4784,13,4785,1532,2415,1581,0]Ao[4784,13,4785,2468,4734,1581,0]Ao[4784,13,4785,2468,2426,1581,0]Ao[4784,13,4785,2468,4175,1581,0]Ao[4784,13,4785,2468,4025,1581,0]Ao[4784,13,4785,2468,3368,1581,0]Ao[4784,13,4785,1924,4329,1581,0]Ao[4784,13,4785,1924,4551,1581,0]Ao[4784,13,4785,1924,5080,1581,0]Ao[4784,13,4785,1924,2428,1581,0]Ao[4784,13,4785,1924,4829,1581,0]Ao[4784,13,4785,1952,4541,1581,0]Ao[4784,13,4785,1952,4308,1581,0]Ao[4784,13,4785,1952,4178,1581,0]Ao[4784,13,4785,1952,4183,1581,0]Al[4784,13,4785,0,4448,1581,0]Al[4784,13,4785,0,4891,1581,0]Ao[4784,13,4785,4347,3349,1581,0]Ao[4784,13,4785,4347,5175,1581,0]Ao[4784,13,4785,4922,4760,1581,0]An[4784,13,4785,4785,492,1581,0]An[4784,13,4785,4785,123,1581,0]Ao[4784,13,4785,4785,2445,1581,0]Ao[4784,13,4785,4785,2455,1581,0]Ao[4784,13,4785,4785,3158,1581,0]Ao[4784,13,1857,1857,4340,1581,0]Ao[4784,13,5033,5033,4932,1581,0]Ao[4784,13,5033,5033,1357,1581,0]Ao[4784,13,1862,1862,2006,1581,0]An[4784,13,1862,1862,479,1581,0]Ao[4784,13,1862,1862,5141,1581,0]Ao[4784,13,1862,1862,4034,1581,0]Ao[4784,13,1862,1862,4897,1581,0]Ao[4784,13,1942,1942,3380,1581,0]Ao[4784,13,1942,1942,4312,1581,0]Ao[4784,13,1942,1942,4756,1581,0]Ao[4784,13,1942,1942,4758,1581,0]Ao[4784,13,1942,1942,4988,1581,0]Al[4784,13,1942,0,1356,1581,0]Am[4784,13,3742,138,117,1581,0]An[4784,13,3742,138,3147,1581,0]Ao[4784,13,3742,1528,1343,1581,0]Ao[4784,13,3742,1528,4036,1581,0]Ao[4784,13,3742,2516,2011,1581,0]Ao[4784,13,3742,2516,4327,1581,0]Ao[4784,13,3742,3742,4821,1581,0]Ao[4784,13,2142,2142,1358,1581,0]Ao[4784,13,2142,2142,1361,1581,0]Ao[4484,13,4485,4485,3383,1581,0]An[4484,13,4485,399,4449,1581,0]Ao[4484,13,4485,4485,2442,1581,0]Ao[4484,13,4485,4485,2456,1581,0]Ao[4484,13,4485,4485,4184,1581,0]Ao[1062,13,1063,1063,3149,1581,0]Ao[1062,13,1063,1063,4926,1581,0]An[1062,13,1851,1851,131,1581,0]Ao[1062,13,1557,1557,1376,1581,0]Ao[1062,13,1557,1557,4059,1581,0]Ao[1062,13,1557,1557,4547,1581,0]Ao[1062,13,4269,4269,5126,1581,0]Ao[1062,13,4269,4269,5127,1581,0]An[1062,13,1947,1947,132,1581,0]An[4015,13,4016,4016,121,1581,0]Ao[4015,13,4016,4016,2412,1581,0]Ai[3995,14,3996,0,2037,0,0]Al[4784,14,4785,1092,2038,0,0]Ak[1379,14,1380,1380,130,0,0]Ac[501,7,502,0,0,0,0]Al[3995,13,3996,2467,2421,0,0]Ae[1062,2,1063,0,0,0,0]Ae[4851,7,4852,0,0,0,0]Al[3995,13,3996,3746,3339,0,0]Ae[4784,2,4785,0,0,0,0]Al[4784,13,4785,2468,2422,0,0]Ah[3995,2,3996,4785,0,0,0]Ai[3995,13,3996,0,4890,0,0]Ai[3995,14,3996,0,3345,0,0]Ai[3995,14,3996,0,4210,0,0]5Ai[4784,13,4785,0,4891,0,0]Al[4784,14,4785,1558,3346,0,0]Al[4784,14,4785,1859,4212,0,0]Ai[4784,14,4785,0,4448,0,0]Al[3995,13,3996,0,1618,3153,0]Al[3995,13,3996,0,1601,3153,0]Al[3995,13,3996,0,3159,3153,0]Al[3995,13,3996,0,4890,3153,0]Al[3995,13,3996,0,2444,3153,0]Ao[4784,13,4785,1978,1619,3153,0]Ao[4784,13,4785,1542,1602,3153,0]Ao[4784,13,4785,1532,3160,3153,0]Ao[4784,13,4785,1532,3352,3153,0]Al[4784,13,4785,1924,4551,0,0]Al[4784,13,4785,0,4891,3153,0]Ao[4784,13,4785,4785,2445,3153,0]Al[4784,12,1857,1857,3153,0,0]Al[4484,14,4485,4485,2442,0,0]Al[3995,13,3996,0,1618,3156,0]Al[3995,13,3996,0,1601,3156,0]Al[3995,13,3996,0,3159,3156,0]Al[3995,13,3996,0,4890,3156,0]Al[3995,13,3996,0,2444,3156,0]Ao[4784,13,4785,1978,1619,3156,0]Ao[4784,13,4785,1542,1602,3156,0]Ao[4784,13,4785,1532,3160,3156,0]Ao[4784,13,4785,1532,3352,3156,0]Ao[4784,13,4785,1532,2415,3156,0]Al[4784,13,4785,0,4891,3156,0]Ao[4784,13,4785,4785,2445,3156,0]Al[4784,12,1857,1857,3156,0,0]Al[3995,13,3996,4136,3370,0,0]Al[4784,13,4785,2171,3371,0,0]Al[1062,13,1557,1557,4059,0,0]Al[4784,13,4785,2468,2422,0,0]Ah[3995,14,1861,0,478,0,0]Ak[4784,14,1862,1862,479,0,0]Al[3995,13,3996,2494,2425,0,0]3Ai[3995,12,3996,0,3381,0,0]Al[3995,13,3996,0,4433,3381,0]Al[3995,13,3996,0,4759,3381,0]Al[4784,12,4785,1568,3382,0,0]Ao[4784,13,4785,1568,4434,3382,0]Ao[4784,13,4785,4922,4760,3382,0]Al[1062,14,1063,1063,3149,0,0]Ai[3995,14,3996,0,1338,0,0]Al[4784,14,4785,3195,1339,0,0]Ai[3995,13,3741,0,3341,0,0]Ak[3995,13,3741,0,116,3341,0]Al[3995,13,3741,0,1342,3341,0]Al[3995,13,3741,0,2010,3341,0]Al[4784,13,3742,3742,3342,0,0]Am[4784,13,3742,138,117,3342,0]Ao[4784,13,3742,1528,1343,3342,0]Ao[4784,13,3742,2516,2011,3342,0]Ah[3995,14,1861,0,478,0,0]Ak[4784,14,1862,1862,479,0,0]Ai[4784,14,4550,0,4764,0,0]Ai[3995,14,3996,0,4535,0,0]Ai[3995,14,3996,0,4728,0,0]Al[4784,14,4785,1532,4537,0,0]Al[4784,14,4785,1532,4730,0,0]Ai[4784,14,4785,0,4448,0,0]Ai[4784,14,1359,0,4412,0,0]Ai[4784,14,3173,0,3137,0,0]Al[3995,13,3996,2467,2421,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2468,2422,0,0]Ai[3995,14,1861,0,2005,0,0]Al[4784,14,4785,4785,3158,0,0]Al[4784,14,1862,1862,2006,0,0]Ae[3995,4,3996,0,0,0,0]Ah[3995,2,1861,1862,0,0,0]Ae[4784,4,4785,0,0,0,0]Ae[4784,2,1862,0,0,0,0]Ac[501,7,502,0,0,0,0]:Ae[1062,2,1063,0,0,0,0]Ae[4851,7,4852,0,0,0,0]Ao[3995,13,3996,3746,4832,1348,0]Ao[3995,13,3996,4131,4443,1348,0]Ao[3995,13,3996,4131,3179,1348,0]Ao[3995,13,3996,4131,3366,1348,0]Ao[3995,13,3996,4131,4442,1348,0]Ao[3995,13,3996,4136,3384,1348,0]Ao[3995,13,3996,4136,4216,1348,0]Al[3995,13,3996,0,4538,1348,0]Ao[4784,13,4785,3747,4539,1348,0]Ai[3995,14,3996,0,2454,0,0]Al[4784,14,4785,4785,2455,0,0]Al[4484,14,4485,4485,2456,0,0]Ak[3995,13,3996,1061,484,0,0]Ai[4784,14,3173,0,4203,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]Al[4484,14,4485,4485,2442,0,0]Ai[3995,14,3996,0,3176,0,0]Ai[3995,14,3996,0,4542,0,0]Al[4784,14,4785,1558,3177,0,0]Al[4784,14,4785,1558,4543,0,0]3210Ai[3995,12,1861,0,2001,0,0]Al[4784,12,1862,1862,2002,0,0]Ai[3995,12,3741,0,3341,0,0]Ak[3995,13,3741,0,116,3341,0]Al[3995,13,3741,0,1342,3341,0]Al[3995,13,3741,0,2010,3341,0]Al[4784,12,3742,3742,3342,0,0]Am[4784,13,3742,138,117,3342,0]Ao[4784,13,3742,1528,1343,3342,0]Ao[4784,13,3742,2516,2011,3342,0]Ai[3995,10,1861,1862,0,0,0]Af[4784,10,1862,0,0,0,0]Al[4784,15,4785,3204,4833,0,0]Al[4784,15,4785,1087,3180,0,0]Al[4784,15,4785,1092,3385,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]65Al[4784,15,4785,1924,4551,0,0]Ah[3995,5,1861,1862,0,0,0]Ae[4784,5,1862,0,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[3995,5,3741,2516,0,0,0]Ah[4784,5,3742,2516,0,0,0]Al[1062,15,1063,1063,4926,0,0]Ah[3995,5,3996,3746,0,0,0]5454Ai[3995,10,3996,2163,0,0,0]Ai[3995,10,1861,1862,0,0,0]Af[4784,10,1862,0,0,0,0]Al[3995,15,3996,4136,3384,0,0]Ah[3995,5,3996,4136,0,0,0]Al[4784,15,4785,1092,3385,0,0]Al[4784,15,4785,1092,4039,0,0]Al[4784,15,4785,2171,4057,0,0]Ah[4784,5,4785,2171,0,0,0]Al[3995,15,3996,4131,4443,0,0]Al[4784,15,4785,1532,3352,0,0]Ah[3995,5,3996,1092,0,0,0]Ah[4784,5,4785,1092,0,0,0]Al[4784,15,4785,1924,2428,0,0]Ai[3995,12,3996,0,5039,0,0]Al[4784,12,4785,4347,5040,0,0]Ao[4784,13,4785,4347,5170,5040,0]Ao[4784,13,4785,4347,5175,5040,0]Ak[1379,14,1380,1380,130,0,0]An[1379,13,1380,1380,130,4411,0]Ao[1062,13,1063,1063,3149,4411,0]An[1062,13,1851,1851,131,4411,0]An[1062,13,1947,1947,132,4411,0]An[4015,13,4016,4016,121,4411,0]Ak[4015,14,4016,4016,121,0,0]Al[3995,13,3996,0,1618,3336,0]Al[3995,13,3996,0,1601,3336,0]Al[3995,13,3996,0,4040,3336,0]Al[3995,13,3996,0,4177,3336,0]Ak[3995,13,3996,0,491,3336,0]Ak[3995,13,3996,0,122,3336,0]Al[3995,13,3996,0,2444,3336,0]Ao[4784,13,4785,1978,1619,3336,0]Ao[4784,13,4785,3204,4833,3336,0]Ao[4784,13,4785,1542,1602,3336,0]Ao[4784,13,4785,1087,3180,3336,0]Ao[4784,13,4785,1087,4334,3336,0]Ao[4784,13,4785,1092,3385,3336,0]Ao[4784,13,4785,3322,4041,3336,0]Ao[4784,13,4785,2468,4734,3336,0]Ao[4784,13,4785,1924,4829,3336,0]Ao[4784,13,4785,1952,4178,3336,0]An[4784,13,4785,4785,492,3336,0]An[4784,13,4785,4785,123,3336,0]Ao[4784,13,4785,4785,2445,3336,0]Al[3995,13,3996,2467,2421,0,0]Al[4784,13,4785,2468,2422,0,0]Ai[3995,12,1861,0,3169,0,0]Ai[3995,12,1861,0,3162,0,0]Al[4784,12,1862,1862,3170,0,0]Al[4784,12,1862,1862,3163,0,0]Ao[1379,13,1556,1556,4058,1996,0]Ao[1379,13,1556,1556,1375,1996,0]Al[501,13,502,502,4028,1996,0]Al[3995,13,3996,0,4300,1996,0]Ao[3995,13,3996,2467,4309,1996,0]Al[3995,13,3996,0,1618,1996,0]Al[3995,13,3996,0,1601,1996,0]Al[3995,13,3996,0,2457,1996,0]Al[3995,13,3996,0,3345,1996,0]Al[3995,13,3996,0,3176,1996,0]Al[3995,13,3996,0,4542,1996,0]Al[3995,13,3996,0,2037,1996,0]Al[3995,13,3996,0,4168,1996,0]Al[3995,13,3996,0,4561,1996,0]Al[3995,13,3996,0,4856,1996,0]Al[3995,13,3996,0,4871,1996,0]Al[3995,13,3996,0,4040,1996,0]Al[3995,13,3996,0,4419,1996,0]Al[3995,13,3996,0,5048,1996,0]Al[3995,13,3996,0,4759,1996,0]Al[3995,13,3741,0,3146,1996,0]Al[3995,13,3741,0,4035,1996,0]Al[3995,13,3741,0,4326,1996,0]Al[3995,13,3741,0,4820,1996,0]Ao[4784,13,4785,4571,4301,1996,0]Ao[4784,13,4785,4347,5170,1996,0]Ao[4784,13,4785,1978,1619,1996,0]Ao[4784,13,4785,1542,1602,1996,0]Ao[4784,13,4785,1542,3360,1996,0]Ao[4784,13,4785,1542,3335,1996,0]Ao[4784,13,4785,1558,2458,1996,0]Ao[4784,13,4785,1558,3346,1996,0]Ao[4784,13,4785,1558,3177,1996,0]Ao[4784,13,4785,1558,4543,1996,0]Ao[4784,13,4785,1092,2038,1996,0]Ao[4784,13,4785,2171,4444,1996,0]Ao[4784,13,4785,2171,4172,1996,0]Ao[4784,13,4785,3322,4562,1996,0]Ao[4784,13,4785,3322,4857,1996,0]Ao[4784,13,4785,3322,4872,1996,0]Ao[4784,13,4785,3322,4041,1996,0]Ao[4784,13,4785,1859,4420,1996,0]Ao[4784,13,4785,1859,5049,1996,0]Ao[4784,13,4785,4347,5175,1996,0]Ao[4784,13,4785,4922,4760,1996,0]An[4784,13,3742,138,3147,1996,0]Ao[4784,13,3742,1528,4036,1996,0]Ao[4784,13,3742,2516,4327,1996,0]Ao[4784,13,3742,3742,4821,1996,0]Ao[4484,13,4485,4485,2442,1996,0]Ao[1062,13,1557,1557,1376,1996,0]Ao[1062,13,1557,1557,4547,1996,0]Al[4784,13,4785,1952,4308,0,0]Al[4784,13,4785,1924,4329,0,0]Al[4784,13,4785,1924,4551,0,0]Al[4784,14,4785,1924,5080,0,0]Ai[4784,14,4828,0,4892,0,0]Ah[4784,14,4550,0,480,0,0]Ai[4784,14,4550,0,1370,0,0]Ai[4784,14,4550,0,1372,0,0]Ai[4784,14,4550,0,4764,0,0]Ai[3995,12,1861,0,3169,0,0]Ai[3995,12,1861,0,3162,0,0]Al[4784,12,1862,1862,3170,0,0]Al[4784,12,1862,1862,3163,0,0]Ae[4784,2,4785,0,0,0,0]Al[3995,13,3996,4131,3364,0,0]Al[3995,13,3996,4131,4933,0,0]Ai[3995,13,3741,0,3341,0,0]Ak[3995,13,3741,0,116,3341,0]Al[3995,13,3741,0,1342,3341,0]Al[3995,13,3741,0,2010,3341,0]Al[4784,13,3742,3742,3342,0,0]Am[4784,13,3742,138,117,3342,0]Ao[4784,13,3742,1528,1343,3342,0]Ao[4784,13,3742,2516,2011,3342,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]9854Al[3995,13,3996,3746,3339,0,0]Al[3995,13,3996,1061,2436,0,0]Al[4784,14,4785,1924,5080,0,0]Ai[4784,14,4828,0,4892,0,0]Ah[4784,14,4550,0,480,0,0]Ai[4784,14,4550,0,1370,0,0]Ai[4784,14,4550,0,4764,0,0]Al[3995,13,3996,4136,3370,0,0]Al[4784,13,4785,2171,3371,0,0]Ak[1379,14,1380,1380,130,0,0]Al[1379,14,1556,1556,1375,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,12,1861,0,3169,0,0]Al[4784,12,1862,1862,3170,0,0]Am[1379,13,1380,1380,130,114,0]An[1379,13,1380,1380,4027,114,0]An[1379,13,1556,1556,4058,114,0]An[1379,13,1556,1556,1375,114,0]An[1379,13,1556,1556,4445,114,0]Ak[501,13,502,502,4028,114,0]An[4064,13,4065,4065,5081,114,0]An[3995,13,3996,3746,4566,114,0]An[3995,13,3996,3746,2435,114,0]Ak[3995,13,3996,0,4300,114,0]An[3995,13,3996,1061,2436,114,0]An[3995,13,3996,1061,4726,114,0]An[3995,13,3996,3746,3337,114,0]An[3995,13,3996,3746,3339,114,0]An[3995,13,3996,3746,2013,114,0]An[3995,13,3996,3746,1594,114,0]An[3995,13,3996,3746,3139,114,0]An[3995,13,3996,3746,2409,114,0]An[3995,13,3996,3746,4202,114,0]An[3995,13,3996,3746,4207,114,0]An[3995,13,3996,3746,4994,114,0]An[3995,13,3996,3746,4832,114,0]An[3995,13,3996,2467,2421,114,0]An[3995,13,3996,2467,4309,114,0]An[3995,13,3996,2467,1575,114,0]An[3995,13,3996,2494,2425,114,0]An[3995,13,3996,2494,3367,114,0]An[3995,13,3996,2494,4424,114,0]Am[3995,13,3996,1061,484,114,0]An[3995,13,3996,1061,4450,114,0]An[3995,13,3996,4131,3364,114,0]An[3995,13,3996,4131,4933,114,0]An[3995,13,3996,4131,4443,114,0]An[3995,13,3996,4131,3179,114,0]An[3995,13,3996,4131,3366,114,0]An[3995,13,3996,4131,4442,114,0]An[3995,13,3996,1569,4217,114,0]An[3995,13,3996,1104,4053,114,0]An[3995,13,3996,4136,3370,114,0]An[3995,13,3996,4136,3384,114,0]An[3995,13,3996,4136,4216,114,0]An[3995,13,3996,4136,2027,114,0]Ak[3995,13,3996,0,3361,114,0]Ak[3995,13,3996,0,4338,114,0]Ak[3995,13,3996,0,4558,114,0]Ak[3995,13,3996,0,4194,114,0]Ak[3995,13,3996,0,4433,114,0]Ak[3995,13,3996,0,1618,114,0]Ak[3995,13,3996,0,4991,114,0]Ak[3995,13,3996,0,1338,114,0]Ak[3995,13,3996,0,1601,114,0]Ak[3995,13,3996,0,2457,114,0]Ak[3995,13,3996,0,3345,114,0]Ak[3995,13,3996,0,3176,114,0]Ak[3995,13,3996,0,4542,114,0]Ak[3995,13,3996,0,2037,114,0]Ak[3995,13,3996,0,4168,114,0]Ak[3995,13,3996,0,4538,114,0]Ak[3995,13,3996,0,4552,114,0]Ak[3995,13,3996,0,4561,114,0]Ak[3995,13,3996,0,4856,114,0]Ak[3995,13,3996,0,4871,114,0]Ak[3995,13,3996,0,4040,114,0]Ak[3995,13,3996,0,4419,114,0]Ak[3995,13,3996,0,4210,114,0]Ak[3995,13,3996,0,5048,114,0]Ak[3995,13,3996,0,4162,114,0]Ak[3995,13,3996,0,4030,114,0]Ak[3995,13,3996,0,3159,114,0]Ak[3995,13,3996,0,4535,114,0]Ak[3995,13,3996,0,4728,114,0]Ak[3995,13,3996,0,4174,114,0]Ak[3995,13,3996,0,4177,114,0]Ak[3995,13,3996,0,4182,114,0]Ak[3995,13,3996,0,4890,114,0]Ak[3995,13,3996,0,3348,114,0]Ak[3995,13,3996,0,4759,114,0]Aj[3995,13,3996,0,491,114,0]Aj[3995,13,3996,0,122,114,0]Ak[3995,13,3996,0,2444,114,0]Ak[3995,13,3996,0,2454,114,0]Aj[3995,13,3741,0,116,114,0]Ak[3995,13,3741,0,3146,114,0]Ak[3995,13,3741,0,1342,114,0]Ak[3995,13,3741,0,4035,114,0]Ak[3995,13,3741,0,2010,114,0]Ak[3995,13,3741,0,4326,114,0]Ak[3995,13,3741,0,4820,114,0]Ak[3995,13,1861,0,2005,114,0]Aj[3995,13,1861,0,478,114,0]Ak[3995,13,1861,0,5140,114,0]Ak[3995,13,1861,0,4033,114,0]Ak[3995,13,1861,0,4894,114,0]Ak[3995,13,1941,0,3379,114,0]Ak[3995,13,1941,0,4311,114,0]Ak[3995,13,1941,0,4755,114,0]Ak[3995,13,1941,0,4757,114,0]Ak[3995,13,1941,0,4987,114,0]Ak[3995,13,1941,0,1355,114,0]An[4784,13,4785,4571,4301,114,0]An[4784,13,4785,3204,3152,114,0]An[4784,13,4785,1087,1583,114,0]An[4784,13,4785,2171,2031,114,0]An[4784,13,4785,2171,3365,114,0]An[4784,13,4785,2171,3371,114,0]An[4784,13,4785,3747,3340,114,0]An[4784,13,4785,1083,3362,114,0]An[4784,13,4785,1859,4339,114,0]An[4784,13,4785,2468,2422,114,0]An[4784,13,4785,2468,4307,114,0]An[4784,13,4785,1924,5200,114,0]An[4784,13,4785,4347,5170,114,0]An[4784,13,4785,1568,4559,114,0]An[4784,13,4785,1568,4195,114,0]An[4784,13,4785,1568,4434,114,0]An[4784,13,4785,1978,1619,114,0]An[4784,13,4785,1978,4992,114,0]An[4784,13,4785,3195,1339,114,0]An[4784,13,4785,3204,4833,114,0]An[4784,13,4785,1542,1602,114,0]An[4784,13,4785,1542,4206,114,0]An[4784,13,4785,1542,3360,114,0]An[4784,13,4785,1542,3175,114,0]An[4784,13,4785,1542,4831,114,0]An[4784,13,4785,1542,4887,114,0]An[4784,13,4785,1542,3335,114,0]An[4784,13,4785,1558,2458,114,0]An[4784,13,4785,1558,3346,114,0]An[4784,13,4785,1558,3177,114,0]An[4784,13,4785,1558,4543,114,0]An[4784,13,4785,1087,3180,114,0]An[4784,13,4785,1087,4334,114,0]An[4784,13,4785,1092,2038,114,0]An[4784,13,4785,1092,3385,114,0]An[4784,13,4785,1092,4039,114,0]An[4784,13,4785,2171,4057,114,0]An[4784,13,4785,2171,4444,114,0]An[4784,13,4785,2171,4172,114,0]An[4784,13,4785,3747,4539,114,0]An[4784,13,4785,3747,3172,114,0]An[4784,13,4785,3747,4410,114,0]An[4784,13,4785,3747,5077,114,0]An[4784,13,4785,3747,1360,114,0]An[4784,13,4785,1083,4553,114,0]An[4784,13,4785,3322,4562,114,0]An[4784,13,4785,3322,4857,114,0]An[4784,13,4785,3322,4872,114,0]An[4784,13,4785,3322,4041,114,0]An[4784,13,4785,1859,4420,114,0]An[4784,13,4785,1859,4212,114,0]An[4784,13,4785,1859,5049,114,0]An[4784,13,4785,1859,4164,114,0]An[4784,13,4785,1859,4031,114,0]An[4784,13,4785,1532,3160,114,0]An[4784,13,4785,1532,4425,114,0]An[4784,13,4785,1532,3352,114,0]An[4784,13,4785,1532,3374,114,0]An[4784,13,4785,1532,4179,114,0]An[4784,13,4785,1532,4537,114,0]An[4784,13,4785,1532,4730,114,0]An[4784,13,4785,1532,2415,114,0]An[4784,13,4785,2468,4734,114,0]An[4784,13,4785,2468,2426,114,0]An[4784,13,4785,2468,4175,114,0]An[4784,13,4785,2468,4025,114,0]An[4784,13,4785,2468,3368,114,0]An[4784,13,4785,1924,4329,114,0]An[4784,13,4785,1924,4551,114,0]An[4784,13,4785,1924,5080,114,0]An[4784,13,4785,1924,2428,114,0]An[4784,13,4785,1924,4829,114,0]An[4784,13,4785,1952,4541,114,0]An[4784,13,4785,1952,4308,114,0]An[4784,13,4785,1952,4178,114,0]An[4784,13,4785,1952,4183,114,0]Ak[4784,13,4785,0,4448,114,0]Ak[4784,13,4785,0,4891,114,0]An[4784,13,4785,4347,3349,114,0]An[4784,13,4785,4347,5175,114,0]An[4784,13,4785,4922,4760,114,0]Am[4784,13,4785,4785,492,114,0]Am[4784,13,4785,4785,123,114,0]An[4784,13,4785,4785,2445,114,0]An[4784,13,4785,4785,2455,114,0]An[4784,13,4785,4785,3158,114,0]An[4784,13,1857,1857,4340,114,0]An[4784,13,5033,5033,4932,114,0]An[4784,13,5033,5033,1357,114,0]An[4784,13,1862,1862,2006,114,0]Am[4784,13,1862,1862,479,114,0]An[4784,13,1862,1862,5141,114,0]An[4784,13,1862,1862,4034,114,0]An[4784,13,1862,1862,4897,114,0]An[4784,13,1942,1942,3380,114,0]An[4784,13,1942,1942,4312,114,0]An[4784,13,1942,1942,4756,114,0]An[4784,13,1942,1942,4758,114,0]An[4784,13,1942,1942,4988,114,0]Ak[4784,13,1942,0,1356,114,0]Al[4784,13,3742,138,117,114,0]Am[4784,13,3742,138,3147,114,0]An[4784,13,3742,1528,1343,114,0]An[4784,13,3742,1528,4036,114,0]An[4784,13,3742,2516,2011,114,0]An[4784,13,3742,2516,4327,114,0]An[4784,13,3742,3742,4821,114,0]An[4784,13,2142,2142,1358,114,0]An[4784,13,2142,2142,1361,114,0]An[4484,13,4485,4485,3383,114,0]Am[4484,13,4485,399,4449,114,0]An[4484,13,4485,4485,2442,114,0]An[4484,13,4485,4485,2456,114,0]An[4484,13,4485,4485,4184,114,0]An[1062,13,1063,1063,3149,114,0]An[1062,13,1063,1063,4926,114,0]Am[1062,13,1851,1851,131,114,0]An[1062,13,1557,1557,1376,114,0]An[1062,13,1557,1557,4059,114,0]An[1062,13,1557,1557,4547,114,0]An[1062,13,4269,4269,5126,114,0]An[1062,13,4269,4269,5127,114,0]Am[1062,13,1947,1947,132,114,0]Am[4015,13,4016,4016,121,114,0]An[4015,13,4016,4016,2412,114,0]Al[3995,13,3996,3746,4994,0,0]Al[3995,13,3996,1061,4450,0,0]Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4164,0,0]Al[4784,14,4785,1924,5080,0,0]Ai[4784,14,4828,0,4892,0,0]Ah[4784,14,4550,0,480,0,0]Ai[4784,14,4550,0,1370,0,0]Ah[3995,5,3996,3746,0,0,0]Al[1379,15,1380,1380,4027,0,0]Ae[4015,6,4016,0,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[4784,5,4785,1532,0,0,0]Al[3995,15,3996,3746,4832,0,0]Al[4784,15,4785,3204,4833,0,0]Ah[3995,5,3996,2467,0,0,0]Ah[4784,5,4785,2468,0,0,0]Al[4784,15,4785,2171,4057,0,0]Ah[3995,5,3996,2494,0,0,0]2Ah[4784,6,4785,1924,0,0,0]Ai[3995,19,3996,0,1618,0,0]Al[4784,19,4785,1978,1619,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]=Ai[3995,12,1861,0,4211,0,0]>Al[3995,13,1941,0,4757,4211,0]>Al[4784,12,1862,1862,4213,0,0]>Ao[4784,13,1942,1942,4758,4213,0]Ao[1062,13,4269,4269,5127,4213,0]An[4015,13,4016,4016,121,4042,0]Ao[4015,13,4016,4016,2412,4042,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,14,4785,1558,3177,0,0]Ai[3995,13,3996,0,4210,0,0]Al[4784,13,4785,1859,4212,0,0]Al[3995,13,3996,2163,4407,0,0]0>=Al[1062,13,1557,1557,4547,0,0]Ae[1062,2,1063,0,0,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2468,2426,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]43Ai[3995,14,3996,0,2454,0,0]Al[4784,14,4785,4785,2455,0,0]Al[4484,14,4485,4485,2456,0,0]Al[4784,13,4785,2171,2031,0,0]Al[4784,13,4785,4347,5170,0,0]Al[4784,13,4785,4347,5175,0,0]Al[3995,13,3996,4136,3370,0,0]Al[4784,13,4785,2171,3371,0,0]<;Al[1379,14,1556,1556,1375,0,0]Ai[501,14,502,502,4028,0,0]Ai[3995,13,1941,0,4755,0,0]Ai[3995,13,1941,0,4757,0,0]Al[4784,13,1942,1942,4756,0,0]Al[4784,13,1942,1942,4758,0,0]76Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ah[3995,5,3996,4571,0,0,0]Ah[4784,5,4785,4571,0,0,0]Ai[3995,15,3996,0,4538,0,0]Ai[3995,15,3996,0,4174,0,0]Al[4784,15,4785,3747,4539,0,0]Al[4784,15,4785,2468,4175,0,0]Ah[4784,6,4785,2468,0,0,0]Ah[4784,5,4785,1952,0,0,0]Ah[3995,5,3996,2467,0,0,0]Al[3995,15,3996,4131,4442,0,0]Ah[3995,5,1941,1942,0,0,0]Ae[4784,5,1942,0,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Al[4784,15,4785,1924,4829,0,0]><4343Al[4784,15,4785,2468,4307,0,0]Ah[3995,5,3741,2516,0,0,0]Ah[4784,5,3742,2516,0,0,0]Ah[4784,5,4785,1924,0,0,0]87Ah[4784,6,4785,1087,0,0,0]98Ah[3995,5,3996,1859,0,0,0]Ah[4784,5,4785,1859,0,0,0]Ae[4784,5,1857,0,0,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]Al[1062,14,1063,1063,3149,0,0]Ae[4784,2,4785,0,0,0,0]Ai[3995,13,3996,0,4419,0,0]Al[4784,13,4785,1859,4420,0,0]Al[3995,12,3996,2163,4407,0,0]Ab[4350,3,0,0,0,0,0]Ak[1379,14,1380,1380,130,0,0]Al[1379,14,1556,1556,4058,0,0]98Al[3995,13,3996,2494,3367,0,0]Al[4784,13,4785,2468,3368,0,0]Ai[3995,13,3996,0,4856,0,0]Al[4784,13,4785,3322,4857,0,0];=Al[3995,13,3996,4131,4933,0,0]Al[4784,13,4785,2171,3365,0,0]Al[3995,13,3996,3746,3337,0,0]Al[3995,13,3996,3746,3339,0,0]Al[3995,13,3996,2494,2425,0,0]Ak[3995,13,3996,1061,484,0,0]Al[4784,13,4785,2468,2426,0,0]<;Ai[3995,13,3996,0,1618,0,0]Ai[3995,13,3996,0,1601,0,0]Al[4784,13,4785,1978,1619,0,0]Al[4784,13,4785,1542,1602,0,0]20Ae[1379,7,1556,0,0,0,0]?>Al[1379,14,1556,1556,1375,0,0]Ao[1062,13,1063,1063,4926,3184,0]Ai[3995,15,3996,0,3159,0,0]Ah[3995,5,3996,1532,0,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[4784,5,4785,1532,0,0,0]Ah[3995,6,3996,3747,0,0,0]Ah[4784,6,4785,3747,0,0,0]Al[4784,15,4785,2468,4307,0,0]Ah[4784,5,4785,1952,0,0,0]Ah[3995,5,3996,1558,0,0,0]Ah[4784,5,4785,1558,0,0,0]97Ae[1062,5,1557,0,0,0,0]:8Ah[4784,6,4785,1924,0,0,0]Ah[3995,5,3996,1083,0,0,0]Ah[4784,5,4785,1083,0,0,0]Al[4784,15,4785,1542,4831,0,0]Ah[3995,5,3996,1568,0,0,0]Ah[4784,5,4785,1568,0,0,0]Ah[3995,5,3996,3322,0,0,0]Ah[4784,5,4785,3322,0,0,0]Ai[3995,15,3996,0,4538,0,0]Al[4784,15,4785,3747,4539,0,0]Ah[3995,5,3996,3746,0,0,0]Al[3995,15,3996,4131,3179,0,0]Al[3995,15,3996,4131,3366,0,0]Al[3995,15,3996,4136,3384,0,0]Al[3995,15,3996,4136,4216,0,0]An[1379,13,1380,1380,130,4306,0]Ao[1379,13,1380,1380,4027,4306,0]Ao[3995,13,3996,3746,3339,4306,0]Ao[3995,13,3996,3746,4994,4306,0]Ao[3995,13,3996,3746,4832,4306,0]Ao[3995,13,3996,2467,2421,4306,0]Ao[3995,13,3996,2467,4309,4306,0]An[3995,13,3996,1061,484,4306,0]Ao[3995,13,3996,1061,4450,4306,0]Ao[3995,13,3996,4131,4443,4306,0]Ao[3995,13,3996,4131,3179,4306,0]Ao[3995,13,3996,4131,3366,4306,0]Ao[3995,13,3996,4131,4442,4306,0]Ao[3995,13,3996,4136,3384,4306,0]Ao[3995,13,3996,4136,4216,4306,0]Al[3995,13,3996,0,1618,4306,0]Al[3995,13,3996,0,4991,4306,0]Al[3995,13,3996,0,1601,4306,0]Al[3995,13,3996,0,2457,4306,0]Al[3995,13,3996,0,3345,4306,0]Al[3995,13,3996,0,3176,4306,0]Al[3995,13,3996,0,4542,4306,0]Al[3995,13,3996,0,2037,4306,0]Al[3995,13,3996,0,4168,4306,0]Al[3995,13,3996,0,4538,4306,0]Al[3995,13,3996,0,4561,4306,0]Al[3995,13,3996,0,4856,4306,0]Al[3995,13,3996,0,4871,4306,0]Al[3995,13,3996,0,4040,4306,0]Al[3995,13,3996,0,4419,4306,0]Al[3995,13,3996,0,4210,4306,0]Al[3995,13,3996,0,5048,4306,0]Al[3995,13,3996,0,4162,4306,0]Al[3995,13,3996,0,4030,4306,0]Al[3995,13,3996,0,3159,4306,0]Al[3995,13,3996,0,4535,4306,0]Al[3995,13,3996,0,4728,4306,0]Al[3995,13,3996,0,4174,4306,0]Al[3995,13,3996,0,4177,4306,0]Al[3995,13,3996,0,4182,4306,0]Al[3995,13,3996,0,4890,4306,0]Al[3995,13,3996,0,3348,4306,0]Ak[3995,13,3996,0,491,4306,0]Ak[3995,13,3996,0,122,4306,0]Al[3995,13,3996,0,2444,4306,0]Ak[3995,13,3741,0,116,4306,0]Al[3995,13,3741,0,3146,4306,0]Al[3995,13,3741,0,1342,4306,0]Al[3995,13,3741,0,4035,4306,0]Al[3995,13,3741,0,2010,4306,0]Al[3995,13,3741,0,4326,4306,0]Al[3995,13,1941,0,4987,4306,0]Al[3995,13,1941,0,1355,4306,0]Ao[4784,13,4785,1978,1619,4306,0]Ao[4784,13,4785,1978,4992,4306,0]Ao[4784,13,4785,3204,4833,4306,0]Ao[4784,13,4785,1542,1602,4306,0]Ao[4784,13,4785,1542,4206,4306,0]Ao[4784,13,4785,1542,3360,4306,0]Ao[4784,13,4785,1542,3175,4306,0]Ao[4784,13,4785,1542,4831,4306,0]Ao[4784,13,4785,1542,4887,4306,0]Ao[4784,13,4785,1542,3335,4306,0]Ao[4784,13,4785,1558,2458,4306,0]Ao[4784,13,4785,1558,3346,4306,0]Ao[4784,13,4785,1558,3177,4306,0]Ao[4784,13,4785,1558,4543,4306,0]Ao[4784,13,4785,1087,3180,4306,0]Ao[4784,13,4785,1087,4334,4306,0]Ao[4784,13,4785,1092,2038,4306,0]Ao[4784,13,4785,1092,3385,4306,0]Ao[4784,13,4785,1092,4039,4306,0]Ao[4784,13,4785,2171,4444,4306,0]Ao[4784,13,4785,2171,4172,4306,0]Ao[4784,13,4785,3747,4539,4306,0]Ao[4784,13,4785,3747,3172,4306,0]Ao[4784,13,4785,3747,4410,4306,0]Ao[4784,13,4785,3747,5077,4306,0]Ao[4784,13,4785,3322,4562,4306,0]Ao[4784,13,4785,3322,4857,4306,0]Ao[4784,13,4785,3322,4872,4306,0]Ao[4784,13,4785,3322,4041,4306,0]Ao[4784,13,4785,1859,4420,4306,0]Ao[4784,13,4785,1859,4212,4306,0]Ao[4784,13,4785,1859,5049,4306,0]Ao[4784,13,4785,1859,4164,4306,0]Ao[4784,13,4785,1859,4031,4306,0]Ao[4784,13,4785,1532,3160,4306,0]Ao[4784,13,4785,1532,3352,4306,0]Ao[4784,13,4785,1532,3374,4306,0]Ao[4784,13,4785,1532,4179,4306,0]Ao[4784,13,4785,1532,4537,4306,0]Ao[4784,13,4785,1532,4730,4306,0]Ao[4784,13,4785,1532,2415,4306,0]Ao[4784,13,4785,2468,4734,4306,0]Ao[4784,13,4785,2468,4175,4306,0]Ao[4784,13,4785,1924,4551,4306,0]Ao[4784,13,4785,1924,5080,4306,0]Ao[4784,13,4785,1924,2428,4306,0]Ao[4784,13,4785,1924,4829,4306,0]Ao[4784,13,4785,1952,4178,4306,0]Ao[4784,13,4785,1952,4183,4306,0]Al[4784,13,4785,0,4448,4306,0]Al[4784,13,4785,0,4891,4306,0]Ao[4784,13,4785,4347,3349,4306,0]Ao[4784,13,4785,4347,5175,4306,0]An[4784,13,4785,4785,492,4306,0]An[4784,13,4785,4785,123,4306,0]Ao[4784,13,4785,4785,2445,4306,0]Ao[4784,13,4785,4785,3158,4306,0]Ao[4784,13,1857,1857,4340,4306,0]Ao[4784,13,5033,5033,4932,4306,0]Ao[4784,13,5033,5033,1357,4306,0]Ao[4784,13,1942,1942,4988,4306,0]Al[4784,13,1942,0,1356,4306,0]Am[4784,13,3742,138,117,4306,0]An[4784,13,3742,138,3147,4306,0]Ao[4784,13,3742,1528,1343,4306,0]Ao[4784,13,3742,1528,4036,4306,0]Ao[4784,13,3742,2516,2011,4306,0]Ao[4784,13,3742,2516,4327,4306,0]Ao[4784,13,2142,2142,1361,4306,0]Ao[4484,13,4485,4485,2442,4306,0]Ao[4484,13,4485,4485,2456,4306,0]Ao[4484,13,4485,4485,4184,4306,0]Ao[1062,13,1063,1063,4926,4306,0]Ao[1062,13,1557,1557,4547,4306,0]Ah[3995,7,3996,2163,0,0,0]Ai[3995,13,3996,0,4419,0,0]Al[4784,13,4785,1859,4420,0,0]Ai[3995,12,1861,0,3169,0,0]Al[4784,12,1862,1862,3170,0,0]Al[4484,14,4485,4485,2442,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]10Ae[1062,7,1063,0,0,0,0]Al[3995,13,3996,2467,2421,0,0]Ae[4350,7,4351,0,0,0,0]Ae[1379,7,1380,0,0,0,0]Al[4784,13,4785,3747,3340,0,0]Al[3995,13,3996,3746,3339,0,0]1Al[4784,13,4785,2171,4444,0,0]Al[1379,13,1556,1556,1375,0,0]Al[1379,14,1556,1556,4058,0,0]Al[3995,12,3996,2163,2022,0,0]Ao[3995,13,3996,1569,4217,2022,0]Ao[3995,13,3996,1104,4053,2022,0]Ai[3995,12,1861,0,2023,0,0]Al[3995,13,1941,0,3379,2023,0]Al[4784,12,1862,1862,2024,0,0]Ao[4784,13,1942,1942,3380,2024,0]Ah[3995,5,3996,1061,0,0,0]Ai[3995,15,3996,0,3159,0,0]Ah[3995,5,3996,1532,0,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[4784,5,4785,1532,0,0,0]Ai[3995,15,3996,0,4538,0,0]Al[4784,15,4785,3747,4539,0,0]Ah[4784,5,4785,2468,0,0,0]Al[4784,15,4785,3747,1360,0,0]Ai[3995,15,3996,0,4174,0,0]Al[4784,15,4785,2468,4175,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]32Al[4784,15,4785,3747,3172,0,0]><><><21Ah[3995,5,1941,1942,0,0,0]Ae[4784,5,1942,0,0,0,0]10Ah[3995,5,3996,4922,0,0,0]Ah[4784,5,4785,4922,0,0,0]Al[4784,15,2142,2142,1358,0,0]Al[4784,15,4785,1542,4831,0,0]6Al[4784,15,4785,1924,4551,0,0]Ai[3995,12,3996,0,2450,0,0]Al[3995,13,3996,0,4300,2450,0]Al[3995,13,3996,0,4194,2450,0]Al[4784,12,4785,1568,2451,0,0]Ao[4784,13,4785,4571,4301,2451,0]Ao[4784,13,4785,1568,4195,2451,0]Ae[4064,7,4065,0,0,0,0]Al[3995,13,3996,3746,3339,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]32An[1379,13,1380,1380,130,4421,0]Ao[1062,13,1063,1063,3149,4421,0]An[1062,13,1851,1851,131,4421,0]An[1062,13,1947,1947,132,4421,0]An[4015,13,4016,4016,121,4421,0]Ao[4015,13,4016,4016,2412,4421,0]Ab[4784,3,0,0,0,0,0]Ak[4484,13,4485,399,4449,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0];:Al[3995,13,3996,2467,2421,0,0]Al[4784,13,4785,2468,2422,0,0]?>32Ae[4350,7,4351,0,0,0,0]5Al[1062,14,1063,1063,3149,0,0]60Ae[1379,7,1380,0,0,0,0]Ai[3995,13,3996,0,4210,0,0]Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4212,0,0]Al[4784,13,4785,1859,4164,0,0]Ai[3995,14,3996,0,4210,0,0]Al[4784,14,4785,1859,4212,0,0]53Al[3995,13,3996,4136,3370,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Ai[3995,15,3996,0,4538,0,0]Al[4784,15,4785,1542,4831,0,0]Al[4784,15,4785,3747,4539,0,0]Ai[3995,10,3741,3742,0,0,0]Af[4784,10,3742,0,0,0,0]Ah[3995,5,3741,3742,0,0,0]Ae[4784,5,3742,0,0,0,0]Ai[3995,10,1861,1862,0,0,0]Af[4784,10,1862,0,0,0,0]Ai[3995,15,3996,0,4174,0,0]Al[4784,15,4785,2468,4175,0,0]Ai[3995,10,3996,3747,0,0,0]Ai[4784,10,4785,3747,0,0,0]Ah[4784,6,4785,1924,0,0,0]Ah[4784,6,4785,1542,0,0,0]Ah[3995,6,3996,3746,0,0,0]Ah[4784,6,4785,3204,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]10Al[3995,15,3996,3746,4832,0,0]Al[4784,15,4785,3204,4833,0,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,14,4785,1558,3177,0,0]Ai[3995,14,3741,0,4820,0,0]Al[4784,14,3742,3742,4821,0,0]Al[3995,13,3996,3746,3339,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]10Al[4784,13,4785,3204,3152,0,0]Al[3995,13,3996,2467,2421,0,0]Al[4784,13,4785,2468,2422,0,0]Ab[4851,3,0,0,0,0,0]Ao[1062,13,1063,1063,4926,3184,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Ah[3995,5,3996,3322,0,0,0]Ah[4784,5,4785,3322,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]54Ai[4784,10,4785,1924,0,0,0]Al[4784,15,4785,3747,1360,0,0]7600Al[4784,15,4785,1087,4334,0,0]4365Al[4784,15,2142,2142,1358,0,0]Ae[1062,9,1063,0,0,0,0]:9Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]<;<;Ah[4784,6,4785,1542,0,0,0]21Ae[3995,5,3996,0,0,0,0]Ae[4784,5,4785,0,0,0,0]Ai[3995,15,3996,0,4174,0,0]Ah[3995,5,1861,1862,0,0,0]Al[4784,15,4785,2468,4175,0,0]Al[4784,15,4785,1924,4829,0,0]Ae[4784,5,1862,0,0,0,0]An[1379,13,1380,1380,130,4411,0]Ao[1062,13,1063,1063,3149,4411,0]An[1062,13,1851,1851,131,4411,0]An[1062,13,1947,1947,132,4411,0]An[4015,13,4016,4016,121,4411,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]Ai[3995,13,3996,0,1618,0,0]Al[4784,13,4785,1978,1619,0,0]Al[3995,14,3996,2467,4309,0,0]Al[3995,13,3996,3746,4994,0,0]Ai[3995,13,3996,0,4419,0,0]Al[4784,13,4785,1859,4420,0,0]Ai[3995,13,3996,0,4300,0,0]Al[4784,13,4785,4571,4301,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]7Al[4784,13,4785,3747,3340,0,0]Al[3995,13,3996,3746,3339,0,0]0176Ao[4064,13,4065,4065,5081,4885,0]Ai[3995,13,3996,0,4552,0,0]Al[4784,13,4785,1083,4553,0,0]Ae[1062,6,1063,0,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]10Al[4784,15,4785,3747,3172,0,0]Ae[4784,5,5033,0,0,0,0]Ah[3995,5,3996,4131,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Al[4784,15,2142,2142,1358,0,0]Al[3995,14,3996,2467,4309,0,0]Ak[3995,13,3996,0,491,3140,0]Ak[3995,13,3996,0,122,3140,0]An[4784,13,4785,4785,492,3140,0]An[4784,13,4785,4785,123,3140,0]Ao[4015,13,4016,4016,2412,3375,0]Ai[3995,13,3996,0,4871,0,0]Al[4784,13,4785,3322,4872,0,0]Ai[3995,12,1861,0,2023,0,0]Al[3995,13,1941,0,3379,2023,0]Al[4784,12,1862,1862,2024,0,0]Ao[4784,13,1942,1942,3380,2024,0]Al[3995,13,3996,3746,3339,0,0]Ai[3995,12,3996,0,4826,0,0]Al[4784,12,4785,3747,4827,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,14,4785,1558,3177,0,0]Ai[3995,12,3741,0,3341,0,0]Ak[3995,13,3741,0,116,3341,0]Al[3995,13,3741,0,1342,3341,0]Al[3995,13,3741,0,2010,3341,0]Al[4784,12,3742,3742,3342,0,0]Am[4784,13,3742,138,117,3342,0]Ao[4784,13,3742,1528,1343,3342,0]Ao[4784,13,3742,2516,2011,3342,0]Al[3995,14,3996,2467,4309,0,0]Al[4784,13,4785,2171,2031,0,0]Ah[4784,2,4345,4135,0,0,0]Ae[1379,7,1380,0,0,0,0]==Ak[3995,13,3996,1061,484,0,0]Ak[4484,13,4485,399,4449,0,0]032Ai[3995,12,1861,0,2023,0,0]Al[3995,13,1941,0,3379,2023,0]Ae[4784,2,4785,0,0,0,0]Al[4784,12,1862,1862,2024,0,0]Ao[4784,13,1942,1942,3380,2024,0]Ai[3995,10,3996,4347,0,0,0]Ai[4784,10,4785,4347,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ai[3995,15,3996,0,4174,0,0]Al[4784,15,4785,2468,4175,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Ah[3995,5,3996,1859,0,0,0]Ah[4784,5,4785,1859,0,0,0]Ai[3995,12,1861,0,3169,0,0]Al[4784,12,1862,1862,3170,0,0]Al[3995,13,3996,2467,2421,0,0]Al[4784,13,4785,3747,3340,0,0]Al[4784,13,4785,2468,2422,0,0]Al[4784,13,4785,4785,3158,0,0]Ai[3995,13,3741,0,4326,0,0]Al[4784,13,3742,2516,4327,0,0]Al[3995,13,3996,2163,3182,0,0]0Al[3995,13,3996,3746,3339,0,0]6Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]Al[1062,14,1063,1063,3149,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Al[4784,15,2142,2142,1358,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]10Al[4784,15,4785,1542,4887,0,0]Al[4784,15,4785,3747,3172,0,0]Al[4784,15,4785,3747,4410,0,0]Ah[4784,5,4785,3747,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[4784,5,4785,1924,0,0,0]Ae[4064,5,4065,0,0,0,0]Al[1062,13,1063,1063,3149,0,0]Al[3995,13,3996,3746,3339,0,0]Ai[3995,12,1861,0,2023,0,0]Al[3995,13,1941,0,3379,2023,0]Al[4784,12,1862,1862,2024,0,0]Ao[4784,13,1942,1942,3380,2024,0]Ah[4784,7,4967,4966,0,0,0]0Al[4784,13,4785,3747,3340,0,0]6Ak[3995,13,3996,1061,484,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]Ao[4064,13,4065,4065,5081,4885,0]0Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4164,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]10Ai[3995,13,3996,0,4856,0,0]Al[4784,13,4785,3322,4857,0,0]Am[1379,13,1380,1380,130,466,0]An[1062,13,1063,1063,3149,466,0]Am[1062,13,1851,1851,131,466,0]Am[1062,13,1947,1947,132,466,0]Am[4015,13,4016,4016,121,466,0]??>An[1379,13,1380,1380,130,4421,0]Ao[1062,13,1063,1063,3149,4421,0]An[1062,13,1851,1851,131,4421,0]An[1062,13,1947,1947,132,4421,0]An[4015,13,4016,4016,121,4421,0]Ao[4015,13,4016,4016,2412,4421,0]Ai[3995,13,3996,0,4210,0,0]Al[4784,13,4785,1859,4212,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Al[4784,15,4785,1542,4831,0,0]Ae[1062,5,4269,0,0,0,0]0Ai[3995,13,3996,0,4419,0,0]Al[4784,13,4785,1859,4420,0,0]Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4164,0,0]Al[3995,13,3996,2467,2421,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2468,2426,0,0]Al[4784,13,4785,3747,3340,0,0]Ao[4064,13,4065,4065,5081,4885,0]<;Ah[3995,5,1861,1862,0,0,0]Ae[4784,5,1862,0,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]10Al[3995,13,3996,3746,3339,0,0]8Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]Ae[4064,7,4065,0,0,0,0]Ae[4350,7,4351,0,0,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1558,3346,0,0]Al[3995,13,3996,2467,2421,0,0]?Af[4784,18,4785,0,0,0,0]Al[4784,15,4785,1542,4831,0,0]9Ai[3995,13,3996,0,4210,0,0]Al[4784,13,4785,1859,4212,0,0]:97Al[4784,13,4785,3747,3340,0,0]Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4164,0,0]Ah[4784,5,4785,4347,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]4Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]10An[1379,13,1380,1380,130,4421,0]Ao[1062,13,1063,1063,3149,4421,0]An[1062,13,1851,1851,131,4421,0]An[1062,13,1947,1947,132,4421,0]An[4015,13,4016,4016,121,4421,0]Ao[4015,13,4016,4016,2412,4421,0]Al[4784,13,4785,4785,3158,0,0]Ae[1379,7,1380,0,0,0,0]98Al[3995,13,3996,3746,3339,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,13,3741,0,3341,0,0]Al[3995,13,3741,0,1342,3341,0]Al[4784,13,3742,3742,3342,0,0]Ao[4784,13,3742,1528,1343,3342,0]Ae[4350,7,4351,0,0,0,0]655Ah[4784,5,4785,1924,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]10Ai[3995,14,1941,0,4311,0,0]Al[4784,14,1942,1942,4312,0,0]732=Ao[4015,13,4016,4016,2412,3375,0]43>434343>=>=Al[4784,14,5033,5033,4932,0,0]54Ai[4784,18,4785,3322,0,0,0]")
\ No newline at end of file
+rd_("Ah[3995,15,3996,0,122,0,0]Ak[4784,15,4785,4785,123,0,0]Ai[3995,15,3996,0,4182,0,0]Al[4784,15,4785,1952,4183,0,0]Al[4484,15,4485,4485,4184,0,0]Al[4784,15,1857,1857,1608,0,0]Ao[1379,13,1380,1380,4027,3171,0]Ao[3995,13,3996,3746,4832,3171,0]An[3995,13,3996,1061,484,3171,0]Ao[3995,13,3996,1061,4450,3171,0]Ao[3995,13,3996,4131,4443,3171,0]Ao[3995,13,3996,4131,3179,3171,0]Ao[3995,13,3996,4131,3366,3171,0]Ao[3995,13,3996,4131,4442,3171,0]Ao[3995,13,3996,4136,3384,3171,0]Ao[3995,13,3996,4136,4216,3171,0]Al[3995,13,3996,0,1618,3171,0]Al[3995,13,3996,0,4991,3171,0]Al[3995,13,3996,0,1338,3171,0]Al[3995,13,3996,0,1601,3171,0]Al[3995,13,3996,0,2457,3171,0]Al[3995,13,3996,0,3176,3171,0]Al[3995,13,3996,0,2037,3171,0]Al[3995,13,3996,0,4168,3171,0]Al[3995,13,3996,0,4538,3171,0]Al[3995,13,3996,0,4040,3171,0]Al[3995,13,3996,0,4030,3171,0]Al[3995,13,3996,0,3159,3171,0]Al[3995,13,3996,0,4535,3171,0]Al[3995,13,3996,0,4728,3171,0]Al[3995,13,3996,0,4174,3171,0]Al[3995,13,3996,0,4177,3171,0]Al[3995,13,3996,0,4182,3171,0]Al[3995,13,3996,0,4890,3171,0]Ak[3995,13,3996,0,491,3171,0]Ak[3995,13,3996,0,122,3171,0]Al[3995,13,3996,0,2444,3171,0]Al[3995,13,1861,0,5140,3171,0]Al[3995,13,1941,0,1355,3171,0]Ao[4784,13,4785,1978,1619,3171,0]Ao[4784,13,4785,1978,4992,3171,0]Ao[4784,13,4785,3195,1339,3171,0]Ao[4784,13,4785,3204,4833,3171,0]Ao[4784,13,4785,1542,1602,3171,0]Ao[4784,13,4785,1542,3360,3171,0]Ao[4784,13,4785,1542,3175,3171,0]Ao[4784,13,4785,1542,4831,3171,0]Ao[4784,13,4785,1542,4887,3171,0]Ao[4784,13,4785,1542,3335,3171,0]Ao[4784,13,4785,1557,2458,3171,0]Ao[4784,13,4785,1557,3177,3171,0]Ao[4784,13,4785,1087,3180,3171,0]Ao[4784,13,4785,1087,4334,3171,0]Ao[4784,13,4785,1092,2038,3171,0]Ao[4784,13,4785,1092,3385,3171,0]Ao[4784,13,4785,1092,4039,3171,0]Ao[4784,13,4785,2171,4057,3171,0]Ao[4784,13,4785,2171,4444,3171,0]Ao[4784,13,4785,2171,4172,3171,0]Ao[4784,13,4785,3747,4539,3171,0]Ao[4784,13,4785,3747,3172,3171,0]Ao[4784,13,4785,3747,4410,3171,0]Ao[4784,13,4785,3322,4041,3171,0]Ao[4784,13,4785,1859,4031,3171,0]Ao[4784,13,4785,1532,3160,3171,0]Ao[4784,13,4785,1532,4425,3171,0]Ao[4784,13,4785,1532,3352,3171,0]Ao[4784,13,4785,1532,3374,3171,0]Ao[4784,13,4785,1532,4179,3171,0]Ao[4784,13,4785,1532,4537,3171,0]Ao[4784,13,4785,1532,4730,3171,0]Ao[4784,13,4785,2468,4734,3171,0]Ao[4784,13,4785,2468,4175,3171,0]Ao[4784,13,4785,1924,2428,3171,0]Ao[4784,13,4785,1924,4829,3171,0]Ao[4784,13,4785,1952,4178,3171,0]Ao[4784,13,4785,1952,4183,3171,0]Al[4784,13,4785,0,4448,3171,0]Al[4784,13,4785,0,4891,3171,0]An[4784,13,4785,4785,492,3171,0]An[4784,13,4785,4785,123,3171,0]Ao[4784,13,4785,4785,2445,3171,0]Ao[4784,13,4785,4785,3158,3171,0]Ao[4784,13,1857,1857,4340,3171,0]Ao[4784,13,5033,5033,4932,3171,0]Ao[4784,13,5033,5033,1357,3171,0]Ao[4784,13,1862,1862,5141,3171,0]Al[4784,13,1942,0,1356,3171,0]Ao[4484,13,4485,4485,4184,3171,0]Ak[3995,13,3996,1061,484,0,0]Al[3995,13,3996,1061,4450,0,0]Al[3995,13,3996,4131,3364,0,0]Al[3995,13,3996,4131,4933,0,0]Al[3995,13,3996,4136,3370,0,0]Ai[4784,14,3173,0,1595,0,0]Ai[4784,14,3173,0,3137,0,0]Ai[4784,14,3173,0,3154,0,0]Ai[4784,14,3173,0,4203,0,0]Ai[4784,14,3173,0,4196,0,0]Ai[4784,14,4056,0,2438,0,0]Ai[4784,14,4056,0,2460,0,0]Ai[4784,14,4056,0,2423,0,0]Ai[4784,14,4056,0,2025,0,0]Ae[1379,7,1380,0,0,0,0]Ah[4784,14,4550,0,480,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ag[3995,5,3741,138,0,0,0]Ag[4784,5,3742,138,0,0,0]Al[1062,15,1063,1063,4926,0,0]Ae[4015,5,4016,0,0,0,0]Ah[3995,6,3996,4785,0,0,0]Ae[4784,6,4785,0,0,0,0]Al[4784,15,1857,1857,1608,0,0]Ai[3995,19,3996,0,1618,0,0]Ai[3995,19,3996,0,1601,0,0]Al[4784,19,4785,1978,1619,0,0]Al[4784,19,4785,1542,1602,0,0]Ae[1379,5,1380,0,0,0,0]Ae[1062,5,1851,0,0,0,0]Ae[1062,5,1947,0,0,0,0]Ah[3995,15,3996,0,122,0,0]Ak[4784,15,4785,4785,123,0,0]Ak[3995,13,3996,0,1618,133,0]Ak[3995,13,3996,0,1601,133,0]Ak[3995,13,3996,0,4040,133,0]Ak[3995,13,3996,0,4177,133,0]Aj[3995,13,3996,0,491,133,0]Aj[3995,13,3996,0,122,133,0]Ak[3995,13,3996,0,2444,133,0]An[4784,13,4785,1978,1619,133,0]An[4784,13,4785,3204,4833,133,0]An[4784,13,4785,1542,1602,133,0]An[4784,13,4785,1087,3180,133,0]An[4784,13,4785,1087,4334,133,0]An[4784,13,4785,1092,3385,133,0]An[4784,13,4785,3322,4041,133,0]An[4784,13,4785,2468,4734,133,0]An[4784,13,4785,1924,4829,133,0]An[4784,13,4785,1952,4178,133,0]Am[4784,13,4785,4785,492,133,0]Am[4784,13,4785,4785,123,133,0]An[4784,13,4785,4785,2445,133,0]Ai[3995,13,3996,0,2444,0,0]Al[4784,13,4785,4785,2445,0,0]Ai[4784,14,4056,0,1596,0,0]Ai[4784,14,4056,0,3143,0,0]Ai[3995,14,3996,0,2454,0,0]Al[4784,14,4785,4785,2455,0,0]Al[4484,14,4485,4485,2442,0,0]Al[4484,14,4485,4485,2456,0,0]An[1379,13,1380,1380,130,1345,0]Ao[1379,13,1380,1380,4027,1345,0]Ao[1379,13,1556,1556,4445,1345,0]Ao[4064,13,4065,4065,5081,1345,0]Ao[3995,13,3996,3746,3337,1345,0]Ao[3995,13,3996,3746,3339,1345,0]Ao[3995,13,3996,3746,4994,1345,0]Db[3995,13,3996,3746,4832,1345,0,\"impl-Debug-for-SendDatagramError\"]Dd[3995,13,3996,3746,4832,1997,0,\"impl-Display-for-SendDatagramError\"]Ao[3995,13,3996,2467,2421,1345,0]Ao[3995,13,3996,2467,4309,1345,0]Ao[3995,13,3996,2494,2425,1345,0]Ck[3995,13,3996,2494,3367,1345,0,\"impl-Debug-for-RetryError\"]Cm[3995,13,3996,2494,3367,1997,0,\"impl-Display-for-RetryError\"]Ao[3995,13,3996,2494,4424,1345,0]An[3995,13,3996,1061,484,1345,0]Ao[3995,13,3996,1061,4450,1345,0]Ao[3995,13,3996,4131,3364,1345,0]Ao[3995,13,3996,4131,4933,1345,0]Da[3995,13,3996,4131,4443,1997,0,\"impl-Display-for-ReadToEndError\"]Co[3995,13,3996,4131,4443,1345,0,\"impl-Debug-for-ReadToEndError\"]Cl[3995,13,3996,4131,3179,1997,0,\"impl-Display-for-ReadError\"]Cj[3995,13,3996,4131,3179,1345,0,\"impl-Debug-for-ReadError\"]Cm[3995,13,3996,4131,3366,1997,0,\"impl-Display-for-ResetError\"]Ck[3995,13,3996,4131,3366,1345,0,\"impl-Debug-for-ResetError\"]Co[3995,13,3996,4131,4442,1345,0,\"impl-Debug-for-ReadExactError\"]Da[3995,13,3996,4131,4442,1997,0,\"impl-Display-for-ReadExactError\"]Ao[3995,13,3996,1569,4217,1345,0]Ao[3995,13,3996,1104,4053,1345,0]Ao[3995,13,3996,4136,3370,1345,0]Cm[3995,13,3996,4136,3384,1997,0,\"impl-Display-for-WriteError\"]Ck[3995,13,3996,4136,3384,1345,0,\"impl-Debug-for-WriteError\"]Co[3995,13,3996,4136,4216,1997,0,\"impl-Display-for-StoppedError\"]Cm[3995,13,3996,4136,4216,1345,0,\"impl-Debug-for-StoppedError\"]Ao[3995,13,3996,4136,2027,1345,0]Cd[3995,13,3996,0,1618,1345,0,\"impl-Debug-for-VarInt\"]Cf[3995,13,3996,0,1618,1997,0,\"impl-Display-for-VarInt\"]Dd[3995,13,3996,0,4991,1997,0,\"impl-Display-for-VarIntBoundsExceeded\"]Db[3995,13,3996,0,4991,1345,0,\"impl-Debug-for-VarIntBoundsExceeded\"]Al[3995,13,3996,0,1338,1345,0]Cf[3995,13,3996,0,1601,1997,0,\"impl-Display-for-PathId\"]Cd[3995,13,3996,0,1601,1345,0,\"impl-Debug-for-PathId\"]Al[3995,13,3996,0,2457,1345,0]Al[3995,13,3996,0,3345,1345,0]Al[3995,13,3996,0,3176,1345,0]Al[3995,13,3996,0,4542,1345,0]Al[3995,13,3996,0,2037,1345,0]Cl[3995,13,3996,0,4168,1997,0,\"impl-Display-for-ClosedStream\"]Cj[3995,13,3996,0,4168,1345,0,\"impl-Debug-for-ClosedStream\"]Co[3995,13,3996,0,4538,1997,0,\"impl-Display-for-ConnectionError\"]Cm[3995,13,3996,0,4538,1345,0,\"impl-Debug-for-ConnectionError\"]Al[3995,13,3996,0,4552,1345,0]Al[3995,13,3996,0,4561,1345,0]Al[3995,13,3996,0,4856,1345,0]Al[3995,13,3996,0,4871,1345,0]Al[3995,13,3996,0,4040,1345,0]Al[3995,13,3996,0,4419,1345,0]Al[3995,13,3996,0,4210,1345,0]Al[3995,13,3996,0,5048,1345,0]Al[3995,13,3996,0,4162,1345,0]Ck[3995,13,3996,0,4030,1997,0,\"impl-Display-for-ConfigError\"]Ci[3995,13,3996,0,4030,1345,0,\"impl-Debug-for-ConfigError\"]Ci[3995,13,3996,0,3159,1997,0,\"impl-Display-for-FrameType\"]Cg[3995,13,3996,0,3159,1345,0,\"impl-Debug-for-FrameType\"]Cm[3995,13,3996,0,4535,1345,0,\"impl-Debug-for-ConnectionClose\"]Co[3995,13,3996,0,4535,1997,0,\"impl-Display-for-ConnectionClose\"]Cn[3995,13,3996,0,4728,1345,0,\"impl-Debug-for-ApplicationClose\"]D`[3995,13,3996,0,4728,1997,0,\"impl-Display-for-ApplicationClose\"]Cl[3995,13,3996,0,4174,1997,0,\"impl-Display-for-ConnectError\"]Cj[3995,13,3996,0,4174,1345,0,\"impl-Debug-for-ConnectError\"]Cj[3995,13,3996,0,4177,1345,0,\"impl-Debug-for-ConnectionId\"]Cl[3995,13,3996,0,4177,1997,0,\"impl-Display-for-ConnectionId\"]Al[3995,13,3996,0,4182,1345,0]Db[3995,13,3996,0,4890,1997,0,\"impl-Display-for-TransportErrorCode\"]D`[3995,13,3996,0,4890,1345,0,\"impl-Debug-for-TransportErrorCode\"]Al[3995,13,3996,0,3348,1345,0]Al[3995,13,3996,0,4759,1345,0]Ak[3995,13,3996,0,491,1345,0]C`[3995,13,3996,0,122,1345,0,\"impl-Debug-for-Dir\"]Cb[3995,13,3996,0,122,1997,0,\"impl-Display-for-Dir\"]Ch[3995,13,3996,0,2444,1997,0,\"impl-Display-for-StreamId\"]Cf[3995,13,3996,0,2444,1345,0,\"impl-Debug-for-StreamId\"]Al[3995,13,3996,0,2454,1345,0]Ak[3995,13,3741,0,116,1345,0]Al[3995,13,3741,0,3146,1345,0]Al[3995,13,3741,0,1342,1345,0]Al[3995,13,3741,0,4035,1345,0]Al[3995,13,3741,0,2010,1345,0]Al[3995,13,3741,0,4326,1345,0]Al[3995,13,3741,0,4820,1345,0]Al[3995,13,1861,0,5140,1345,0]Al[3995,13,1861,0,4033,1345,0]Al[3995,13,1861,0,4894,1345,0]Db[3995,13,1941,0,4987,1345,0,\"impl-Debug-for-NoInitialCipherSuite\"]Dd[3995,13,1941,0,4987,1997,0,\"impl-Display-for-NoInitialCipherSuite\"]Cc[3995,13,1941,0,1355,1345,0,\"impl-Debug-for-Error\"]Ce[3995,13,1941,0,1355,1997,0,\"impl-Display-for-Error\"]Ao[4784,13,4785,3747,3340,1345,0]Ao[4784,13,4785,2468,2422,1345,0]Cg[4784,13,4785,1978,1619,1345,0,\"impl-Debug-for-VarInt\"]Ci[4784,13,4785,1978,1619,1997,0,\"impl-Display-for-VarInt\"]De[4784,13,4785,1978,4992,1345,0,\"impl-Debug-for-VarIntBoundsExceeded\"]Dg[4784,13,4785,1978,4992,1997,0,\"impl-Display-for-VarIntBoundsExceeded\"]Ao[4784,13,4785,3195,1339,1345,0]Db[4784,13,4785,3204,4833,1345,0,\"impl-Debug-for-SendDatagramError\"]Dd[4784,13,4785,3204,4833,1997,0,\"impl-Display-for-SendDatagramError\"]Ci[4784,13,4785,1542,1602,1997,0,\"impl-Display-for-PathId\"]Cg[4784,13,4785,1542,1602,1345,0,\"impl-Debug-for-PathId\"]Ao[4784,13,4785,1542,4206,1345,0]Ao[4784,13,4785,1542,3360,1345,0]Ao[4784,13,4785,1542,3175,1345,0]Ao[4784,13,4785,1542,4831,1345,0]Dc[4784,13,4785,1542,4887,1345,0,\"impl-Debug-for-SetPathStatusError\"]De[4784,13,4785,1542,4887,1997,0,\"impl-Display-for-SetPathStatusError\"]Cm[4784,13,4785,1542,3335,1997,0,\"impl-Display-for-ClosedPath\"]Ck[4784,13,4785,1542,3335,1345,0,\"impl-Debug-for-ClosedPath\"]Ao[4784,13,4785,1557,2458,1345,0]Ao[4784,13,4785,1557,3346,1345,0]Ao[4784,13,4785,1557,3177,1345,0]Ao[4784,13,4785,1557,4543,1345,0]Cl[4784,13,4785,1087,3180,1997,0,\"impl-Display-for-ReadError\"]Cj[4784,13,4785,1087,3180,1345,0,\"impl-Debug-for-ReadError\"]D`[4784,13,4785,1087,4334,1997,0,\"impl-Display-for-ReadableError\"]Cn[4784,13,4785,1087,4334,1345,0,\"impl-Debug-for-ReadableError\"]Ao[4784,13,4785,1092,2038,1345,0]Ck[4784,13,4785,1092,3385,1345,0,\"impl-Debug-for-WriteError\"]Cm[4784,13,4785,1092,3385,1997,0,\"impl-Display-for-WriteError\"]Cn[4784,13,4785,1092,4039,1997,0,\"impl-Display-for-FinishError\"]Cl[4784,13,4785,1092,4039,1345,0,\"impl-Debug-for-FinishError\"]Ao[4784,13,4785,2171,4057,1345,0]Ao[4784,13,4785,2171,4444,1345,0]Co[4784,13,4785,2171,4172,1997,0,\"impl-Display-for-ClosedStream\"]Cm[4784,13,4785,2171,4172,1345,0,\"impl-Debug-for-ClosedStream\"]Db[4784,13,4785,3747,4539,1997,0,\"impl-Display-for-ConnectionError\"]D`[4784,13,4785,3747,4539,1345,0,\"impl-Debug-for-ConnectionError\"]Cl[4784,13,4785,3747,3172,1997,0,\"impl-Display-for-PathError\"]Cj[4784,13,4785,3747,3172,1345,0,\"impl-Debug-for-PathError\"]Co[4784,13,4785,3747,4410,1345,0,\"impl-Debug-for-ClosePathError\"]Da[4784,13,4785,3747,4410,1997,0,\"impl-Display-for-ClosePathError\"]Di[4784,13,4785,3747,5077,1997,0,\"impl-Display-for-MultipathNotNegotiated\"]Dg[4784,13,4785,3747,5077,1345,0,\"impl-Debug-for-MultipathNotNegotiated\"]Ao[4784,13,4785,3747,1360,1345,0]Ao[4784,13,4785,1083,4553,1345,0]Ao[4784,13,4785,3322,4562,1345,0]Ao[4784,13,4785,3322,4857,1345,0]Ao[4784,13,4785,3322,4872,1345,0]Ao[4784,13,4785,3322,4041,1345,0]Ao[4784,13,4785,1859,4420,1345,0]Ao[4784,13,4785,1859,4212,1345,0]Ao[4784,13,4785,1859,5049,1345,0]Ao[4784,13,4785,1859,4164,1345,0]Cn[4784,13,4785,1859,4031,1997,0,\"impl-Display-for-ConfigError\"]Cl[4784,13,4785,1859,4031,1345,0,\"impl-Debug-for-ConfigError\"]Cj[4784,13,4785,1532,3160,1345,0,\"impl-Debug-for-FrameType\"]Cl[4784,13,4785,1532,3160,1997,0,\"impl-Display-for-FrameType\"]Co[4784,13,4785,1532,4425,1345,0,\"impl-Debug-for-InvalidFrameId\"]Da[4784,13,4785,1532,4425,1997,0,\"impl-Display-for-InvalidFrameId\"]Cm[4784,13,4785,1532,3352,1997,0,\"impl-Display-for-MaybeFrame\"]Ck[4784,13,4785,1532,3352,1345,0,\"impl-Debug-for-MaybeFrame\"]Ck[4784,13,4785,1532,3374,1345,0,\"impl-Debug-for-StreamInfo\"]Cm[4784,13,4785,1532,3374,1997,0,\"impl-Display-for-StreamInfo\"]Co[4784,13,4785,1532,4179,1997,0,\"impl-Display-for-DatagramInfo\"]Cm[4784,13,4785,1532,4179,1345,0,\"impl-Debug-for-DatagramInfo\"]Db[4784,13,4785,1532,4537,1997,0,\"impl-Display-for-ConnectionClose\"]D`[4784,13,4785,1532,4537,1345,0,\"impl-Debug-for-ConnectionClose\"]Dc[4784,13,4785,1532,4730,1997,0,\"impl-Display-for-ApplicationClose\"]Da[4784,13,4785,1532,4730,1345,0,\"impl-Debug-for-ApplicationClose\"]Ci[4784,13,4785,1532,2415,1345,0,\"impl-Debug-for-Datagram\"]Ck[4784,13,4785,1532,2415,1997,0,\"impl-Display-for-Datagram\"]Ao[4784,13,4785,2468,4734,1345,0]Ao[4784,13,4785,2468,2426,1345,0]Co[4784,13,4785,2468,4175,1997,0,\"impl-Display-for-ConnectError\"]Cm[4784,13,4785,2468,4175,1345,0,\"impl-Debug-for-ConnectError\"]Ao[4784,13,4785,2468,4025,1345,0]Cm[4784,13,4785,2468,3368,1997,0,\"impl-Display-for-RetryError\"]Ck[4784,13,4785,2468,3368,1345,0,\"impl-Debug-for-RetryError\"]Ao[4784,13,4785,1924,4329,1345,0]Ao[4784,13,4785,1924,4551,1345,0]Ao[4784,13,4785,1924,5080,1345,0]Ao[4784,13,4785,1924,2428,1345,0]Dd[4784,13,4785,1924,4829,1997,0,\"impl-Display-for-PacketDecodeError\"]Db[4784,13,4785,1924,4829,1345,0,\"impl-Debug-for-PacketDecodeError\"]Ao[4784,13,4785,1952,4541,1345,0]Ao[4784,13,4785,1952,4308,1345,0]Cm[4784,13,4785,1952,4178,1345,0,\"impl-Debug-for-ConnectionId\"]Co[4784,13,4785,1952,4178,1997,0,\"impl-Display-for-ConnectionId\"]Ao[4784,13,4785,1952,4183,1345,0]Cc[4784,13,4785,0,4448,1345,0,\"impl-Debug-for-Error\"]Ce[4784,13,4785,0,4448,1997,0,\"impl-Display-for-Error\"]Cb[4784,13,4785,0,4891,1345,0,\"impl-Debug-for-Code\"]Cd[4784,13,4785,0,4891,1997,0,\"impl-Display-for-Code\"]Ao[4784,13,4785,4347,3349,1345,0]Ao[4784,13,4785,4347,5175,1345,0]Ao[4784,13,4785,4922,4760,1345,0]An[4784,13,4785,4785,492,1345,0]Ce[4784,13,4785,4785,123,1997,0,\"impl-Display-for-Dir\"]Cc[4784,13,4785,4785,123,1345,0,\"impl-Debug-for-Dir\"]Ci[4784,13,4785,4785,2445,1345,0,\"impl-Debug-for-StreamId\"]Ck[4784,13,4785,4785,2445,1997,0,\"impl-Display-for-StreamId\"]Ao[4784,13,4785,4785,2455,1345,0]Cj[4784,13,4785,4785,3158,1345,0,\"impl-Debug-for-FourTuple\"]Cl[4784,13,4785,4785,3158,1997,0,\"impl-Display-for-FourTuple\"]D`[4784,13,1857,1857,4340,1997,0,\"impl-Display-for-UnexpectedEnd\"]Cn[4784,13,1857,1857,4340,1345,0,\"impl-Debug-for-UnexpectedEnd\"]Ao[4784,13,5033,5033,4932,1345,0]Ch[4784,13,5033,5033,1357,1997,0,\"impl-Display-for-Error\"]Cf[4784,13,5033,5033,1357,1345,0,\"impl-Debug-for-Error\"]Ao[4784,13,1862,1862,5141,1345,0]Ao[4784,13,1862,1862,4034,1345,0]Ao[4784,13,1862,1862,4897,1345,0]De[4784,13,1942,1942,4988,1345,0,\"impl-Debug-for-NoInitialCipherSuite\"]Dg[4784,13,1942,1942,4988,1997,0,\"impl-Display-for-NoInitialCipherSuite\"]Ce[4784,13,1942,0,1356,1997,0,\"impl-Display-for-Error\"]Cc[4784,13,1942,0,1356,1345,0,\"impl-Debug-for-Error\"]Am[4784,13,3742,138,117,1345,0]An[4784,13,3742,138,3147,1345,0]Ao[4784,13,3742,1528,1343,1345,0]Ao[4784,13,3742,1528,4036,1345,0]Ao[4784,13,3742,2516,2011,1345,0]Ao[4784,13,3742,2516,4327,1345,0]Ao[4784,13,3742,3742,4821,1345,0]Ch[4784,13,2142,2142,1358,1997,0,\"impl-Display-for-Error\"]Cf[4784,13,2142,2142,1358,1345,0,\"impl-Debug-for-Error\"]Ao[4784,13,2142,2142,1361,1345,0]An[4484,13,4485,399,4449,1345,0]Ao[4484,13,4485,4485,2442,1345,0]Ao[4484,13,4485,4485,2456,1345,0]Ao[4484,13,4485,4485,4184,1345,0]Al[4784,13,4785,1542,4206,0,0]Ai[3995,14,3996,0,2457,0,0]Al[4784,14,4785,1557,2458,0,0]Al[4784,13,4785,1924,4329,0,0]Al[4784,14,4785,1924,5080,0,0]Ah[4784,14,4550,0,480,0,0]Al[4484,14,4485,4485,2442,0,0]Ai[3995,13,3996,0,5048,0,0]Al[4784,13,4785,1859,5049,0,0]8Al[1379,13,1556,1556,4445,0,0]Al[4064,13,4065,4065,5081,0,0]Ai[3995,13,3996,0,4300,0,0]Al[3995,13,3996,2467,2421,0,0]Ai[3995,13,3996,0,3361,0,0]Ai[3995,13,3996,0,4552,0,0]Ai[3995,13,3996,0,4419,0,0]Ai[3995,13,3996,0,4210,0,0]Ai[3995,13,3996,0,4162,0,0]Ai[3995,13,3996,0,4177,0,0]Ai[3995,13,3996,0,4759,0,0]Ai[3995,13,3996,0,2444,0,0]Ah[3995,13,3741,0,116,0,0]Ai[3995,13,3741,0,1342,0,0]Ai[3995,13,3741,0,2010,0,0]Al[4784,13,4785,4571,4301,0,0]Al[4784,13,4785,1083,3362,0,0]Al[4784,13,4785,2468,2422,0,0]Al[4784,13,4785,1924,5200,0,0]Al[4784,13,4785,4347,5170,0,0]Al[4784,13,4785,1083,4553,0,0]Al[4784,13,4785,1859,4420,0,0]Al[4784,13,4785,1859,4212,0,0]Al[4784,13,4785,1859,4164,0,0]Al[4784,13,4785,1924,4329,0,0]Al[4784,13,4785,1952,4178,0,0]Ai[4784,13,4785,0,4448,0,0]Al[4784,13,4785,4347,5175,0,0]Al[4784,13,4785,4922,4760,0,0]Al[4784,13,4785,4785,2445,0,0]Aj[4784,13,3742,138,117,0,0]Al[4784,13,3742,1528,1343,0,0]Al[4784,13,3742,2516,2011,0,0]Ak[4484,13,4485,399,4449,0,0]Al[1062,13,4269,4269,5126,0,0]Al[1062,13,4269,4269,5127,0,0]Aj[3995,13,3996,0,491,129,0]Am[4784,13,4785,4785,492,129,0]Ai[3995,12,3996,0,3377,0,0]Al[3995,13,3996,2163,2022,0,0]0Ao[3995,13,3996,1569,4217,2022,0]Al[3995,13,3996,0,4338,3377,0]Al[4784,12,4785,1859,3378,0,0]Ao[4784,13,4785,1859,4339,3378,0]Al[3995,13,3996,3746,3339,0,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,13,4785,3747,3340,0,0]Al[4784,14,4785,1557,3177,0,0]Ae[1062,7,1851,0,0,0,0]Ae[1062,7,1947,0,0,0,0]Ae[3995,4,3996,0,0,0,0]Ai[3995,15,3996,0,4182,0,0]Al[4784,15,4785,1952,4183,0,0]Al[4484,15,4485,4485,4184,0,0]210Ah[3995,5,1861,1862,0,0,0]Ae[4784,5,1862,0,0,0,0]Al[4784,15,4785,1924,4551,0,0]Al[4784,15,4785,1532,3352,0,0]Ah[3995,5,3996,1061,0,0,0]Al[4784,15,4785,3747,1360,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Al[3995,15,3996,4131,4443,0,0]Ah[3995,6,3996,4785,0,0,0]Ae[4784,6,4785,0,0,0,0]Ai[3995,19,3996,0,1601,0,0]Al[4784,19,4785,1542,1602,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]Ai[4784,14,3173,0,4196,0,0]Al[4484,14,4485,4485,2442,0,0]Aa[501,3,0,0,0,0,0]Ai[4784,14,4785,0,4448,0,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,14,4785,1557,3177,0,0]Al[4784,14,4785,1532,2415,0,0]An[3995,13,3996,3746,2435,468,0]An[3995,13,3996,2494,2425,468,0]Am[3995,13,3996,1061,484,468,0]An[3995,13,3996,1061,4450,468,0]An[3995,13,3996,4131,3364,468,0]An[3995,13,3996,4136,3370,468,0]An[4784,13,4785,1087,1583,468,0]Am[1379,13,1380,1380,130,475,0]An[1379,13,1380,1380,4027,475,0]An[1379,13,1556,1556,4058,475,0]An[1379,13,1556,1556,1375,475,0]An[1379,13,1556,1556,4445,475,0]Ak[501,13,502,502,4028,475,0]An[4064,13,4065,4065,5081,475,0]An[3995,13,3996,3746,4566,475,0]An[3995,13,3996,3746,2435,475,0]Ak[3995,13,3996,0,4300,475,0]An[3995,13,3996,1061,2436,475,0]An[3995,13,3996,1061,4726,475,0]An[3995,13,3996,3746,3337,475,0]An[3995,13,3996,3746,3339,475,0]An[3995,13,3996,3746,2013,475,0]An[3995,13,3996,3746,1594,475,0]An[3995,13,3996,3746,3139,475,0]An[3995,13,3996,3746,2409,475,0]An[3995,13,3996,3746,4202,475,0]An[3995,13,3996,3746,4207,475,0]An[3995,13,3996,3746,4994,475,0]An[3995,13,3996,3746,4832,475,0]0An[3995,13,3996,2467,2421,475,0]An[3995,13,3996,2467,4309,475,0]An[3995,13,3996,2467,1575,475,0]An[3995,13,3996,2494,2425,475,0]An[3995,13,3996,2494,3367,475,0]An[3995,13,3996,2494,4424,475,0]Am[3995,13,3996,1061,484,475,0]An[3995,13,3996,1061,4450,475,0]An[3995,13,3996,4131,3364,475,0]An[3995,13,3996,4131,4933,475,0]An[3995,13,3996,4131,4443,475,0]0An[3995,13,3996,4131,3179,475,0]Dh[3995,13,3996,4131,3179,475,0,\"impl-From%3CResetError%3E-for-ReadError\"]Dm[3995,13,3996,4131,3179,475,0,\"impl-From%3CConnectionError%3E-for-ReadError\"]An[3995,13,3996,4131,3366,475,0]0An[3995,13,3996,4131,4442,475,0]0An[3995,13,3996,1569,4217,475,0]An[3995,13,3996,1104,4053,475,0]An[3995,13,3996,4136,3370,475,0]Dk[3995,13,3996,4136,3384,475,0,\"impl-From%3CStoppedError%3E-for-WriteError\"]Dn[3995,13,3996,4136,3384,475,0,\"impl-From%3CConnectionError%3E-for-WriteError\"]Dk[3995,13,3996,4136,3384,475,0,\"impl-From%3CClosedStream%3E-for-WriteError\"]An[3995,13,3996,4136,3384,475,0]An[3995,13,3996,4136,4216,475,0]0An[3995,13,3996,4136,2027,475,0]Ak[3995,13,3996,0,3361,475,0]Ak[3995,13,3996,0,4338,475,0]Ak[3995,13,3996,0,4558,475,0]Ak[3995,13,3996,0,4194,475,0]Ak[3995,13,3996,0,4433,475,0]Cj[3995,13,3996,0,1618,475,0,\"impl-From%3Cu8%3E-for-VarInt\"]D`[3995,13,3996,0,1618,475,0,\"impl-From%3CStreamId%3E-for-VarInt\"]Dj[3995,13,3996,0,1618,475,0,\"impl-From%3CTransportErrorCode%3E-for-VarInt\"]Ak[3995,13,3996,0,1618,475,0]Ck[3995,13,3996,0,1618,475,0,\"impl-From%3Cu16%3E-for-VarInt\"]Ck[3995,13,3996,0,1618,475,0,\"impl-From%3Cu32%3E-for-VarInt\"]Ak[3995,13,3996,0,4991,475,0]Ak[3995,13,3996,0,1338,475,0]Ak[3995,13,3996,0,1601,475,0]0Ak[3995,13,3996,0,2457,475,0]Ak[3995,13,3996,0,3345,475,0]Ak[3995,13,3996,0,3176,475,0]Ak[3995,13,3996,0,4542,475,0]Ak[3995,13,3996,0,2037,475,0]Ak[3995,13,3996,0,4168,475,0]Ak[3995,13,3996,0,4538,475,0]Df[3995,13,3996,0,4538,475,0,\"impl-From%3CClose%3E-for-ConnectionError\"]Dl[3995,13,3996,0,4538,475,0,\"impl-From%3CCloseReason%3E-for-ConnectionError\"]Do[3995,13,3996,0,4538,475,0,\"impl-From%3CTransportError%3E-for-ConnectionError\"]Ak[3995,13,3996,0,4552,475,0]Ak[3995,13,3996,0,4561,475,0]Ak[3995,13,3996,0,4856,475,0]Ak[3995,13,3996,0,4871,475,0]Ak[3995,13,3996,0,4040,475,0]0Ak[3995,13,3996,0,4419,475,0]Ak[3995,13,3996,0,4210,475,0]Ak[3995,13,3996,0,5048,475,0]Ak[3995,13,3996,0,4162,475,0]Ea[3995,13,3996,0,4030,475,0,\"impl-From%3CVarIntBoundsExceeded%3E-for-ConfigError\"]Ak[3995,13,3996,0,4030,475,0]Dl[3995,13,3996,0,4030,475,0,\"impl-From%3CTryFromIntError%3E-for-ConfigError\"]Ak[3995,13,3996,0,3159,475,0]Ak[3995,13,3996,0,4535,475,0]0Ak[3995,13,3996,0,4728,475,0]Ak[3995,13,3996,0,4174,475,0]0Ak[3995,13,3996,0,4177,475,0]Ak[3995,13,3996,0,4182,475,0]Ak[3995,13,3996,0,4890,475,0]0Ak[3995,13,3996,0,3348,475,0]Ak[3995,13,3996,0,4759,475,0]Aj[3995,13,3996,0,491,475,0]Aj[3995,13,3996,0,122,475,0]Ak[3995,13,3996,0,2444,475,0]0Ak[3995,13,3996,0,2454,475,0]Aj[3995,13,3741,0,116,475,0]Ak[3995,13,3741,0,3146,475,0]Ak[3995,13,3741,0,1342,475,0]Ak[3995,13,3741,0,4035,475,0]Ak[3995,13,3741,0,2010,475,0]Ak[3995,13,3741,0,4326,475,0]Ak[3995,13,3741,0,4820,475,0]Ak[3995,13,1861,0,2005,475,0]Aj[3995,13,1861,0,478,475,0]Ak[3995,13,1861,0,5140,475,0]Ak[3995,13,1861,0,4033,475,0]0Ak[3995,13,1861,0,4894,475,0]Ak[3995,13,1941,0,3379,475,0]Ak[3995,13,1941,0,4311,475,0]Ak[3995,13,1941,0,4755,475,0]Ak[3995,13,1941,0,4757,475,0]Ak[3995,13,1941,0,4987,475,0]Df[3995,13,1941,0,1355,475,0,\"impl-From%3CSystemTimeError%3E-for-Error\"]E`[3995,13,1941,0,1355,475,0,\"impl-From%3CEncryptedClientHelloError%3E-for-Error\"]E`[3995,13,1941,0,1355,475,0,\"impl-From%3CUnsupportedOperationError%3E-for-Error\"]Da[3995,13,1941,0,1355,475,0,\"impl-From%3COtherError%3E-for-Error\"]De[3995,13,1941,0,1355,475,0,\"impl-From%3CPeerMisbehaved%3E-for-Error\"]Dg[3995,13,1941,0,1355,475,0,\"impl-From%3CPeerIncompatible%3E-for-Error\"]De[3995,13,1941,0,1355,475,0,\"impl-From%3CInvalidMessage%3E-for-Error\"]Dg[3995,13,1941,0,1355,475,0,\"impl-From%3CCertificateError%3E-for-Error\"]Dg[3995,13,1941,0,1355,475,0,\"impl-From%3CInconsistentKeys%3E-for-Error\"]Df[3995,13,1941,0,1355,475,0,\"impl-From%3CGetRandomFailed%3E-for-Error\"]Ak[3995,13,1941,0,1355,475,0]Dn[3995,13,1941,0,1355,475,0,\"impl-From%3CCertRevocationListError%3E-for-Error\"]An[4784,13,4785,4571,4301,475,0]An[4784,13,4785,3204,3152,475,0]An[4784,13,4785,1087,1583,475,0]An[4784,13,4785,2171,2031,475,0]An[4784,13,4785,2171,3365,475,0]An[4784,13,4785,2171,3371,475,0]An[4784,13,4785,3747,3340,475,0]An[4784,13,4785,1083,3362,475,0]An[4784,13,4785,1859,4339,475,0]An[4784,13,4785,2468,2422,475,0]An[4784,13,4785,2468,4307,475,0]An[4784,13,4785,1924,5200,475,0]An[4784,13,4785,4347,5170,475,0]An[4784,13,4785,1568,4559,475,0]An[4784,13,4785,1568,4195,475,0]An[4784,13,4785,1568,4434,475,0]Co[4784,13,4785,1978,1619,475,0,\"impl-From%3CCode%3E-for-VarInt\"]Cm[4784,13,4785,1978,1619,475,0,\"impl-From%3Cu8%3E-for-VarInt\"]An[4784,13,4785,1978,1619,475,0]Cn[4784,13,4785,1978,1619,475,0,\"impl-From%3Cu32%3E-for-VarInt\"]Cn[4784,13,4785,1978,1619,475,0,\"impl-From%3Cu16%3E-for-VarInt\"]Dc[4784,13,4785,1978,1619,475,0,\"impl-From%3CStreamId%3E-for-VarInt\"]An[4784,13,4785,1978,4992,475,0]An[4784,13,4785,3195,1339,475,0]An[4784,13,4785,3204,4833,475,0]An[4784,13,4785,1542,1602,475,0]0An[4784,13,4785,1542,4206,475,0]An[4784,13,4785,1542,3360,475,0]An[4784,13,4785,1542,3175,475,0]An[4784,13,4785,1542,4831,475,0]An[4784,13,4785,1542,4887,475,0]An[4784,13,4785,1542,3335,475,0]An[4784,13,4785,1557,2458,475,0]An[4784,13,4785,1557,3346,475,0]An[4784,13,4785,1557,3177,475,0]An[4784,13,4785,1557,4543,475,0]An[4784,13,4785,1087,3180,475,0]An[4784,13,4785,1087,4334,475,0]An[4784,13,4785,1092,2038,475,0]An[4784,13,4785,1092,3385,475,0]An[4784,13,4785,1092,4039,475,0]An[4784,13,4785,2171,4057,475,0]An[4784,13,4785,2171,4444,475,0]An[4784,13,4785,2171,4172,475,0]An[4784,13,4785,3747,4539,475,0]0An[4784,13,4785,3747,3172,475,0]An[4784,13,4785,3747,4410,475,0]An[4784,13,4785,3747,5077,475,0]An[4784,13,4785,3747,1360,475,0]0An[4784,13,4785,1083,4553,475,0]An[4784,13,4785,3322,4562,475,0]An[4784,13,4785,3322,4857,475,0]An[4784,13,4785,3322,4872,475,0]An[4784,13,4785,3322,4041,475,0]0An[4784,13,4785,1859,4420,475,0]An[4784,13,4785,1859,4212,475,0]An[4784,13,4785,1859,5049,475,0]An[4784,13,4785,1859,4164,475,0]Ed[4784,13,4785,1859,4031,475,0,\"impl-From%3CVarIntBoundsExceeded%3E-for-ConfigError\"]An[4784,13,4785,1859,4031,475,0]Do[4784,13,4785,1859,4031,475,0,\"impl-From%3CTryFromIntError%3E-for-ConfigError\"]An[4784,13,4785,1532,3160,475,0]An[4784,13,4785,1532,4425,475,0]An[4784,13,4785,1532,3352,475,0]An[4784,13,4785,1532,3374,475,0]An[4784,13,4785,1532,4179,475,0]An[4784,13,4785,1532,4537,475,0]0An[4784,13,4785,1532,4730,475,0]An[4784,13,4785,1532,2415,475,0]An[4784,13,4785,2468,4734,475,0]An[4784,13,4785,2468,2426,475,0]An[4784,13,4785,2468,4175,475,0]0An[4784,13,4785,2468,4025,475,0]An[4784,13,4785,2468,3368,475,0]An[4784,13,4785,1924,4329,475,0]An[4784,13,4785,1924,4551,475,0]An[4784,13,4785,1924,5080,475,0]An[4784,13,4785,1924,2428,475,0]An[4784,13,4785,1924,4829,475,0]0An[4784,13,4785,1952,4541,475,0]An[4784,13,4785,1952,4308,475,0]An[4784,13,4785,1952,4178,475,0]An[4784,13,4785,1952,4183,475,0]Ak[4784,13,4785,0,4448,475,0]0Ak[4784,13,4785,0,4891,475,0]0An[4784,13,4785,4347,3349,475,0]An[4784,13,4785,4347,5175,475,0]An[4784,13,4785,4922,4760,475,0]Am[4784,13,4785,4785,492,475,0]Am[4784,13,4785,4785,123,475,0]An[4784,13,4785,4785,2445,475,0]0An[4784,13,4785,4785,2455,475,0]An[4784,13,4785,4785,3158,475,0]An[4784,13,1857,1857,4340,475,0]An[4784,13,5033,5033,4932,475,0]An[4784,13,5033,5033,1357,475,0]0An[4784,13,1862,1862,2006,475,0]Am[4784,13,1862,1862,479,475,0]An[4784,13,1862,1862,5141,475,0]An[4784,13,1862,1862,4034,475,0]0An[4784,13,1862,1862,4897,475,0]An[4784,13,1942,1942,3380,475,0]An[4784,13,1942,1942,4312,475,0]An[4784,13,1942,1942,4756,475,0]An[4784,13,1942,1942,4758,475,0]An[4784,13,1942,1942,4988,475,0]Dg[4784,13,1942,0,1356,475,0,\"impl-From%3CInconsistentKeys%3E-for-Error\"]Df[4784,13,1942,0,1356,475,0,\"impl-From%3CGetRandomFailed%3E-for-Error\"]Dn[4784,13,1942,0,1356,475,0,\"impl-From%3CCertRevocationListError%3E-for-Error\"]E`[4784,13,1942,0,1356,475,0,\"impl-From%3CUnsupportedOperationError%3E-for-Error\"]Dg[4784,13,1942,0,1356,475,0,\"impl-From%3CCertificateError%3E-for-Error\"]Df[4784,13,1942,0,1356,475,0,\"impl-From%3CSystemTimeError%3E-for-Error\"]Ak[4784,13,1942,0,1356,475,0]Dg[4784,13,1942,0,1356,475,0,\"impl-From%3CPeerIncompatible%3E-for-Error\"]De[4784,13,1942,0,1356,475,0,\"impl-From%3CPeerMisbehaved%3E-for-Error\"]De[4784,13,1942,0,1356,475,0,\"impl-From%3CInvalidMessage%3E-for-Error\"]Da[4784,13,1942,0,1356,475,0,\"impl-From%3COtherError%3E-for-Error\"]E`[4784,13,1942,0,1356,475,0,\"impl-From%3CEncryptedClientHelloError%3E-for-Error\"]Al[4784,13,3742,138,117,475,0]Am[4784,13,3742,138,3147,475,0]An[4784,13,3742,1528,1343,475,0]An[4784,13,3742,1528,4036,475,0]An[4784,13,3742,2516,2011,475,0]An[4784,13,3742,2516,4327,475,0]An[4784,13,3742,3742,4821,475,0]An[4784,13,2142,2142,1358,475,0]An[4784,13,2142,2142,1361,475,0]An[4484,13,4485,4485,3383,475,0]0Am[4484,13,4485,399,4449,475,0]An[4484,13,4485,4485,2442,475,0]An[4484,13,4485,4485,2456,475,0]An[4484,13,4485,4485,4184,475,0]An[1062,13,1063,1063,3149,475,0]An[1062,13,1063,1063,4926,475,0]Am[1062,13,1851,1851,131,475,0]An[1062,13,1558,1558,1376,475,0]An[1062,13,1558,1558,4059,475,0]An[1062,13,1558,1558,4547,475,0]An[1062,13,4269,4269,5126,475,0]An[1062,13,4269,4269,5127,475,0]Am[1062,13,1947,1947,132,475,0]Am[4015,13,4016,4016,121,475,0]An[4015,13,4016,4016,2412,475,0]Ak[3995,13,3996,0,1618,476,0]Ak[3995,13,3996,0,1601,476,0]Ak[3995,13,3996,0,4040,476,0]Ak[3995,13,3996,0,4177,476,0]Aj[3995,13,3996,0,491,476,0]Aj[3995,13,3996,0,122,476,0]Ak[3995,13,3996,0,2444,476,0]An[4784,13,4785,1978,1619,476,0]An[4784,13,4785,3204,4833,476,0]An[4784,13,4785,1542,1602,476,0]An[4784,13,4785,1087,3180,476,0]An[4784,13,4785,1087,4334,476,0]An[4784,13,4785,1092,3385,476,0]An[4784,13,4785,3322,4041,476,0]An[4784,13,4785,2468,4734,476,0]An[4784,13,4785,1924,4829,476,0]An[4784,13,4785,1952,4178,476,0]Am[4784,13,4785,4785,492,476,0]Am[4784,13,4785,4785,123,476,0]An[4784,13,4785,4785,2445,476,0]An[4784,13,4785,4785,3158,476,0]Am[1379,13,1380,1380,130,477,0]An[1379,13,1380,1380,4027,477,0]An[1379,13,1556,1556,4058,477,0]An[1379,13,1556,1556,1375,477,0]An[1379,13,1556,1556,4445,477,0]Ak[501,13,502,502,4028,477,0]An[4064,13,4065,4065,5081,477,0]An[3995,13,3996,3746,4566,477,0]An[3995,13,3996,3746,2435,477,0]Ak[3995,13,3996,0,4300,477,0]An[3995,13,3996,1061,2436,477,0]An[3995,13,3996,1061,4726,477,0]An[3995,13,3996,3746,3337,477,0]An[3995,13,3996,3746,3339,477,0]An[3995,13,3996,3746,2013,477,0]An[3995,13,3996,3746,1594,477,0]An[3995,13,3996,3746,3139,477,0]An[3995,13,3996,3746,2409,477,0]An[3995,13,3996,3746,4202,477,0]An[3995,13,3996,3746,4207,477,0]An[3995,13,3996,3746,4994,477,0]An[3995,13,3996,3746,4832,477,0]An[3995,13,3996,2467,2421,477,0]An[3995,13,3996,2467,4309,477,0]An[3995,13,3996,2467,1575,477,0]An[3995,13,3996,2494,2425,477,0]An[3995,13,3996,2494,3367,477,0]An[3995,13,3996,2494,4424,477,0]Am[3995,13,3996,1061,484,477,0]An[3995,13,3996,1061,4450,477,0]An[3995,13,3996,4131,3364,477,0]An[3995,13,3996,4131,4933,477,0]An[3995,13,3996,4131,4443,477,0]An[3995,13,3996,4131,3179,477,0]An[3995,13,3996,4131,3366,477,0]An[3995,13,3996,4131,4442,477,0]An[3995,13,3996,1569,4217,477,0]An[3995,13,3996,1104,4053,477,0]An[3995,13,3996,4136,3370,477,0]An[3995,13,3996,4136,3384,477,0]An[3995,13,3996,4136,4216,477,0]An[3995,13,3996,4136,2027,477,0]Ak[3995,13,3996,0,3361,477,0]Ak[3995,13,3996,0,4338,477,0]Ak[3995,13,3996,0,4558,477,0]Ak[3995,13,3996,0,4194,477,0]Ak[3995,13,3996,0,4433,477,0]Ak[3995,13,3996,0,1618,477,0]Ak[3995,13,3996,0,4991,477,0]Ak[3995,13,3996,0,1338,477,0]Ak[3995,13,3996,0,1601,477,0]Ak[3995,13,3996,0,2457,477,0]Ak[3995,13,3996,0,3345,477,0]Ak[3995,13,3996,0,3176,477,0]Ak[3995,13,3996,0,4542,477,0]Ak[3995,13,3996,0,2037,477,0]Ak[3995,13,3996,0,4168,477,0]Ak[3995,13,3996,0,4538,477,0]Ak[3995,13,3996,0,4552,477,0]Ak[3995,13,3996,0,4561,477,0]Ak[3995,13,3996,0,4856,477,0]Ak[3995,13,3996,0,4871,477,0]Ak[3995,13,3996,0,4040,477,0]Ak[3995,13,3996,0,4419,477,0]Ak[3995,13,3996,0,4210,477,0]Ak[3995,13,3996,0,5048,477,0]Ak[3995,13,3996,0,4162,477,0]Ak[3995,13,3996,0,4030,477,0]Ak[3995,13,3996,0,3159,477,0]Ak[3995,13,3996,0,4535,477,0]Ak[3995,13,3996,0,4728,477,0]Ak[3995,13,3996,0,4174,477,0]Ak[3995,13,3996,0,4177,477,0]Ak[3995,13,3996,0,4182,477,0]Ak[3995,13,3996,0,4890,477,0]Ak[3995,13,3996,0,3348,477,0]Ak[3995,13,3996,0,4759,477,0]Aj[3995,13,3996,0,491,477,0]Aj[3995,13,3996,0,122,477,0]Ak[3995,13,3996,0,2444,477,0]Ak[3995,13,3996,0,2454,477,0]Aj[3995,13,3741,0,116,477,0]Ak[3995,13,3741,0,3146,477,0]Ak[3995,13,3741,0,1342,477,0]Ak[3995,13,3741,0,4035,477,0]Ak[3995,13,3741,0,2010,477,0]Ak[3995,13,3741,0,4326,477,0]Ak[3995,13,3741,0,4820,477,0]Ak[3995,13,1861,0,2005,477,0]Aj[3995,13,1861,0,478,477,0]Ak[3995,13,1861,0,5140,477,0]Ak[3995,13,1861,0,4033,477,0]Ak[3995,13,1861,0,4894,477,0]Ak[3995,13,1941,0,3379,477,0]Ak[3995,13,1941,0,4311,477,0]Ak[3995,13,1941,0,4755,477,0]Ak[3995,13,1941,0,4757,477,0]Ak[3995,13,1941,0,4987,477,0]Ak[3995,13,1941,0,1355,477,0]An[4784,13,4785,4571,4301,477,0]An[4784,13,4785,3204,3152,477,0]An[4784,13,4785,1087,1583,477,0]An[4784,13,4785,2171,2031,477,0]An[4784,13,4785,2171,3365,477,0]An[4784,13,4785,2171,3371,477,0]An[4784,13,4785,3747,3340,477,0]An[4784,13,4785,1083,3362,477,0]An[4784,13,4785,1859,4339,477,0]An[4784,13,4785,2468,2422,477,0]An[4784,13,4785,2468,4307,477,0]An[4784,13,4785,1924,5200,477,0]An[4784,13,4785,4347,5170,477,0]An[4784,13,4785,1568,4559,477,0]An[4784,13,4785,1568,4195,477,0]An[4784,13,4785,1568,4434,477,0]An[4784,13,4785,1978,1619,477,0]An[4784,13,4785,1978,4992,477,0]An[4784,13,4785,3195,1339,477,0]An[4784,13,4785,3204,4833,477,0]An[4784,13,4785,1542,1602,477,0]An[4784,13,4785,1542,4206,477,0]An[4784,13,4785,1542,3360,477,0]An[4784,13,4785,1542,3175,477,0]An[4784,13,4785,1542,4831,477,0]An[4784,13,4785,1542,4887,477,0]An[4784,13,4785,1542,3335,477,0]An[4784,13,4785,1557,2458,477,0]An[4784,13,4785,1557,3346,477,0]An[4784,13,4785,1557,3177,477,0]An[4784,13,4785,1557,4543,477,0]An[4784,13,4785,1087,3180,477,0]An[4784,13,4785,1087,4334,477,0]An[4784,13,4785,1092,2038,477,0]An[4784,13,4785,1092,3385,477,0]An[4784,13,4785,1092,4039,477,0]An[4784,13,4785,2171,4057,477,0]An[4784,13,4785,2171,4444,477,0]An[4784,13,4785,2171,4172,477,0]An[4784,13,4785,3747,4539,477,0]An[4784,13,4785,3747,3172,477,0]An[4784,13,4785,3747,4410,477,0]An[4784,13,4785,3747,5077,477,0]An[4784,13,4785,3747,1360,477,0]An[4784,13,4785,1083,4553,477,0]An[4784,13,4785,3322,4562,477,0]An[4784,13,4785,3322,4857,477,0]An[4784,13,4785,3322,4872,477,0]An[4784,13,4785,3322,4041,477,0]An[4784,13,4785,1859,4420,477,0]An[4784,13,4785,1859,4212,477,0]An[4784,13,4785,1859,5049,477,0]An[4784,13,4785,1859,4164,477,0]An[4784,13,4785,1859,4031,477,0]An[4784,13,4785,1532,3160,477,0]An[4784,13,4785,1532,4425,477,0]An[4784,13,4785,1532,3352,477,0]An[4784,13,4785,1532,3374,477,0]An[4784,13,4785,1532,4179,477,0]An[4784,13,4785,1532,4537,477,0]An[4784,13,4785,1532,4730,477,0]An[4784,13,4785,1532,2415,477,0]An[4784,13,4785,2468,4734,477,0]An[4784,13,4785,2468,2426,477,0]An[4784,13,4785,2468,4175,477,0]An[4784,13,4785,2468,4025,477,0]An[4784,13,4785,2468,3368,477,0]An[4784,13,4785,1924,4329,477,0]An[4784,13,4785,1924,4551,477,0]An[4784,13,4785,1924,5080,477,0]An[4784,13,4785,1924,2428,477,0]An[4784,13,4785,1924,4829,477,0]An[4784,13,4785,1952,4541,477,0]An[4784,13,4785,1952,4308,477,0]An[4784,13,4785,1952,4178,477,0]An[4784,13,4785,1952,4183,477,0]Ak[4784,13,4785,0,4448,477,0]Ak[4784,13,4785,0,4891,477,0]An[4784,13,4785,4347,3349,477,0]An[4784,13,4785,4347,5175,477,0]An[4784,13,4785,4922,4760,477,0]Am[4784,13,4785,4785,492,477,0]Am[4784,13,4785,4785,123,477,0]An[4784,13,4785,4785,2445,477,0]An[4784,13,4785,4785,2455,477,0]An[4784,13,4785,4785,3158,477,0]An[4784,13,1857,1857,4340,477,0]An[4784,13,5033,5033,4932,477,0]An[4784,13,5033,5033,1357,477,0]An[4784,13,1862,1862,2006,477,0]Am[4784,13,1862,1862,479,477,0]An[4784,13,1862,1862,5141,477,0]An[4784,13,1862,1862,4034,477,0]An[4784,13,1862,1862,4897,477,0]An[4784,13,1942,1942,3380,477,0]An[4784,13,1942,1942,4312,477,0]An[4784,13,1942,1942,4756,477,0]An[4784,13,1942,1942,4758,477,0]An[4784,13,1942,1942,4988,477,0]Ak[4784,13,1942,0,1356,477,0]Al[4784,13,3742,138,117,477,0]Am[4784,13,3742,138,3147,477,0]An[4784,13,3742,1528,1343,477,0]An[4784,13,3742,1528,4036,477,0]An[4784,13,3742,2516,2011,477,0]An[4784,13,3742,2516,4327,477,0]An[4784,13,3742,3742,4821,477,0]An[4784,13,2142,2142,1358,477,0]An[4784,13,2142,2142,1361,477,0]An[4484,13,4485,4485,3383,477,0]Am[4484,13,4485,399,4449,477,0]An[4484,13,4485,4485,2442,477,0]An[4484,13,4485,4485,2456,477,0]An[4484,13,4485,4485,4184,477,0]An[1062,13,1063,1063,3149,477,0]An[1062,13,1063,1063,4926,477,0]Am[1062,13,1851,1851,131,477,0]An[1062,13,1558,1558,1376,477,0]An[1062,13,1558,1558,4059,477,0]An[1062,13,1558,1558,4547,477,0]An[1062,13,4269,4269,5126,477,0]An[1062,13,4269,4269,5127,477,0]Am[1062,13,1947,1947,132,477,0]Am[4015,13,4016,4016,121,477,0]An[4015,13,4016,4016,2412,477,0]Ac[501,7,502,0,0,0,0]Ae[4064,7,4065,0,0,0,0]Ae[4350,7,4351,0,0,0,0]Ae[4015,7,4016,0,0,0,0]Ae[4851,7,4852,0,0,0,0]Al[4784,13,4785,1087,1583,0,0]Ai[3995,12,1861,0,1989,0,0]Al[4784,13,4785,2171,2031,0,0]Al[4784,12,1862,1862,1990,0,0]Al[3995,13,3996,3746,3339,0,0]Ab[1062,3,0,0,0,0,0]Ak[3995,13,3996,1061,484,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,13,4785,3747,3340,0,0]Al[4784,14,4785,1557,3346,0,0]Al[3995,12,3996,2163,3328,0,0]Ao[3995,13,3996,3746,4566,1591,0]Ao[3995,13,3996,3746,2435,1591,0]Ao[3995,13,3996,1061,2436,1591,0]Ao[3995,13,3996,3746,3337,1591,0]Ao[3995,13,3996,3746,2013,1591,0]Ao[3995,13,3996,3746,1594,1591,0]Ao[3995,13,3996,3746,3139,1591,0]Ao[3995,13,3996,3746,2409,1591,0]Ao[3995,13,3996,3746,4202,1591,0]Ao[3995,13,3996,3746,4207,1591,0]Ao[3995,13,3996,2467,1575,1591,0]Ao[3995,13,3996,2494,4424,1591,0]Ao[3995,13,3996,4136,2027,1591,0]?Al[3995,13,3996,4131,3364,0,0]Al[4784,13,4785,2171,3365,0,0]Al[4784,13,5033,5033,4932,0,0]Al[4784,13,4785,3204,3152,0,0]Ak[4484,13,4485,399,4449,0,0]Ai[3995,12,1861,0,1989,0,0]Al[4784,12,1862,1862,1990,0,0]32Ai[3995,13,3996,0,5048,0,0]Al[4784,13,4785,1859,5049,0,0]Al[3995,13,3996,3746,3339,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,12,1861,0,2001,0,0]Al[4784,12,1862,1862,2002,0,0]Al[1379,14,1556,1556,4445,0,0]Ai[3995,14,3996,0,2454,0,0]Al[4784,14,4785,4785,2455,0,0]Ai[4784,14,4550,0,1372,0,0]Al[3995,13,3996,4131,3364,0,0]Al[3995,13,3996,4131,4933,0,0]Al[4784,13,4785,2171,3365,0,0]Ai[3995,12,3996,0,3381,0,0]Al[3995,13,3996,0,4433,3381,0]Al[3995,13,3996,0,4759,3381,0]Al[4784,12,4785,1568,3382,0,0]Ao[4784,13,4785,1568,4434,3382,0]Ao[4784,13,4785,4922,4760,3382,0]Am[1379,13,1380,1380,130,494,0]An[1379,13,1380,1380,4027,494,0]An[1379,13,1556,1556,4058,494,0]An[1379,13,1556,1556,1375,494,0]An[1379,13,1556,1556,4445,494,0]Ak[501,13,502,502,4028,494,0]An[4064,13,4065,4065,5081,494,0]An[3995,13,3996,3746,4566,494,0]An[3995,13,3996,3746,2435,494,0]Ak[3995,13,3996,0,4300,494,0]An[3995,13,3996,1061,2436,494,0]An[3995,13,3996,1061,4726,494,0]An[3995,13,3996,3746,3337,494,0]An[3995,13,3996,3746,3339,494,0]An[3995,13,3996,3746,2013,494,0]An[3995,13,3996,3746,1594,494,0]An[3995,13,3996,3746,3139,494,0]An[3995,13,3996,3746,2409,494,0]An[3995,13,3996,3746,4202,494,0]An[3995,13,3996,3746,4207,494,0]An[3995,13,3996,3746,4994,494,0]An[3995,13,3996,3746,4832,494,0]An[3995,13,3996,2467,2421,494,0]An[3995,13,3996,2467,4309,494,0]An[3995,13,3996,2467,1575,494,0]An[3995,13,3996,2494,2425,494,0]An[3995,13,3996,2494,3367,494,0]An[3995,13,3996,2494,4424,494,0]Am[3995,13,3996,1061,484,494,0]An[3995,13,3996,1061,4450,494,0]An[3995,13,3996,4131,3364,494,0]An[3995,13,3996,4131,4933,494,0]An[3995,13,3996,4131,4443,494,0]An[3995,13,3996,4131,3179,494,0]An[3995,13,3996,4131,3366,494,0]An[3995,13,3996,4131,4442,494,0]An[3995,13,3996,1569,4217,494,0]An[3995,13,3996,1104,4053,494,0]An[3995,13,3996,4136,3370,494,0]An[3995,13,3996,4136,3384,494,0]An[3995,13,3996,4136,4216,494,0]An[3995,13,3996,4136,2027,494,0]Ak[3995,13,3996,0,3361,494,0]Ak[3995,13,3996,0,4338,494,0]Ak[3995,13,3996,0,4558,494,0]Ak[3995,13,3996,0,4194,494,0]Ak[3995,13,3996,0,4433,494,0]Ak[3995,13,3996,0,1618,494,0]Ak[3995,13,3996,0,4991,494,0]Ak[3995,13,3996,0,1338,494,0]Ak[3995,13,3996,0,1601,494,0]Ak[3995,13,3996,0,2457,494,0]Ak[3995,13,3996,0,3345,494,0]Ak[3995,13,3996,0,3176,494,0]Ak[3995,13,3996,0,4542,494,0]Ak[3995,13,3996,0,2037,494,0]Ak[3995,13,3996,0,4168,494,0]Ak[3995,13,3996,0,4538,494,0]Ak[3995,13,3996,0,4552,494,0]Ak[3995,13,3996,0,4561,494,0]Ak[3995,13,3996,0,4856,494,0]Ak[3995,13,3996,0,4871,494,0]Ak[3995,13,3996,0,4040,494,0]Ak[3995,13,3996,0,4419,494,0]Ak[3995,13,3996,0,4210,494,0]Ak[3995,13,3996,0,5048,494,0]Ak[3995,13,3996,0,4162,494,0]Ak[3995,13,3996,0,4030,494,0]Ak[3995,13,3996,0,3159,494,0]Ak[3995,13,3996,0,4535,494,0]Ak[3995,13,3996,0,4728,494,0]Ak[3995,13,3996,0,4174,494,0]Ak[3995,13,3996,0,4177,494,0]Ak[3995,13,3996,0,4182,494,0]Ak[3995,13,3996,0,4890,494,0]Ak[3995,13,3996,0,3348,494,0]Ak[3995,13,3996,0,4759,494,0]Aj[3995,13,3996,0,491,494,0]Aj[3995,13,3996,0,122,494,0]Ak[3995,13,3996,0,2444,494,0]Ak[3995,13,3996,0,2454,494,0]Aj[3995,13,3741,0,116,494,0]Ak[3995,13,3741,0,3146,494,0]Ak[3995,13,3741,0,1342,494,0]Ak[3995,13,3741,0,4035,494,0]Ak[3995,13,3741,0,2010,494,0]Ak[3995,13,3741,0,4326,494,0]Ak[3995,13,3741,0,4820,494,0]Ak[3995,13,1861,0,2005,494,0]Aj[3995,13,1861,0,478,494,0]Ak[3995,13,1861,0,5140,494,0]Ak[3995,13,1861,0,4033,494,0]Ak[3995,13,1861,0,4894,494,0]Ak[3995,13,1941,0,3379,494,0]Ak[3995,13,1941,0,4311,494,0]Ak[3995,13,1941,0,4755,494,0]Ak[3995,13,1941,0,4757,494,0]Ak[3995,13,1941,0,4987,494,0]Ak[3995,13,1941,0,1355,494,0]An[4784,13,4785,4571,4301,494,0]An[4784,13,4785,3204,3152,494,0]An[4784,13,4785,1087,1583,494,0]An[4784,13,4785,2171,2031,494,0]An[4784,13,4785,2171,3365,494,0]An[4784,13,4785,2171,3371,494,0]An[4784,13,4785,3747,3340,494,0]An[4784,13,4785,1083,3362,494,0]An[4784,13,4785,1859,4339,494,0]An[4784,13,4785,2468,2422,494,0]An[4784,13,4785,2468,4307,494,0]An[4784,13,4785,1924,5200,494,0]An[4784,13,4785,4347,5170,494,0]An[4784,13,4785,1568,4559,494,0]An[4784,13,4785,1568,4195,494,0]An[4784,13,4785,1568,4434,494,0]An[4784,13,4785,1978,1619,494,0]An[4784,13,4785,1978,4992,494,0]An[4784,13,4785,3195,1339,494,0]An[4784,13,4785,3204,4833,494,0]An[4784,13,4785,1542,1602,494,0]An[4784,13,4785,1542,4206,494,0]An[4784,13,4785,1542,3360,494,0]An[4784,13,4785,1542,3175,494,0]An[4784,13,4785,1542,4831,494,0]An[4784,13,4785,1542,4887,494,0]An[4784,13,4785,1542,3335,494,0]An[4784,13,4785,1557,2458,494,0]An[4784,13,4785,1557,3346,494,0]An[4784,13,4785,1557,3177,494,0]An[4784,13,4785,1557,4543,494,0]An[4784,13,4785,1087,3180,494,0]An[4784,13,4785,1087,4334,494,0]An[4784,13,4785,1092,2038,494,0]An[4784,13,4785,1092,3385,494,0]An[4784,13,4785,1092,4039,494,0]An[4784,13,4785,2171,4057,494,0]An[4784,13,4785,2171,4444,494,0]An[4784,13,4785,2171,4172,494,0]An[4784,13,4785,3747,4539,494,0]An[4784,13,4785,3747,3172,494,0]An[4784,13,4785,3747,4410,494,0]An[4784,13,4785,3747,5077,494,0]An[4784,13,4785,3747,1360,494,0]An[4784,13,4785,1083,4553,494,0]An[4784,13,4785,3322,4562,494,0]An[4784,13,4785,3322,4857,494,0]An[4784,13,4785,3322,4872,494,0]An[4784,13,4785,3322,4041,494,0]An[4784,13,4785,1859,4420,494,0]An[4784,13,4785,1859,4212,494,0]An[4784,13,4785,1859,5049,494,0]An[4784,13,4785,1859,4164,494,0]An[4784,13,4785,1859,4031,494,0]An[4784,13,4785,1532,3160,494,0]An[4784,13,4785,1532,4425,494,0]An[4784,13,4785,1532,3352,494,0]An[4784,13,4785,1532,3374,494,0]An[4784,13,4785,1532,4179,494,0]An[4784,13,4785,1532,4537,494,0]An[4784,13,4785,1532,4730,494,0]An[4784,13,4785,1532,2415,494,0]An[4784,13,4785,2468,4734,494,0]An[4784,13,4785,2468,2426,494,0]An[4784,13,4785,2468,4175,494,0]An[4784,13,4785,2468,4025,494,0]An[4784,13,4785,2468,3368,494,0]An[4784,13,4785,1924,4329,494,0]An[4784,13,4785,1924,4551,494,0]An[4784,13,4785,1924,5080,494,0]An[4784,13,4785,1924,2428,494,0]An[4784,13,4785,1924,4829,494,0]An[4784,13,4785,1952,4541,494,0]An[4784,13,4785,1952,4308,494,0]An[4784,13,4785,1952,4178,494,0]An[4784,13,4785,1952,4183,494,0]Ak[4784,13,4785,0,4448,494,0]Ak[4784,13,4785,0,4891,494,0]An[4784,13,4785,4347,3349,494,0]An[4784,13,4785,4347,5175,494,0]An[4784,13,4785,4922,4760,494,0]Am[4784,13,4785,4785,492,494,0]Am[4784,13,4785,4785,123,494,0]An[4784,13,4785,4785,2445,494,0]An[4784,13,4785,4785,2455,494,0]An[4784,13,4785,4785,3158,494,0]An[4784,13,1857,1857,4340,494,0]An[4784,13,5033,5033,4932,494,0]An[4784,13,5033,5033,1357,494,0]An[4784,13,1862,1862,2006,494,0]Am[4784,13,1862,1862,479,494,0]An[4784,13,1862,1862,5141,494,0]An[4784,13,1862,1862,4034,494,0]An[4784,13,1862,1862,4897,494,0]An[4784,13,1942,1942,3380,494,0]An[4784,13,1942,1942,4312,494,0]An[4784,13,1942,1942,4756,494,0]An[4784,13,1942,1942,4758,494,0]An[4784,13,1942,1942,4988,494,0]Ak[4784,13,1942,0,1356,494,0]Al[4784,13,3742,138,117,494,0]Am[4784,13,3742,138,3147,494,0]An[4784,13,3742,1528,1343,494,0]An[4784,13,3742,1528,4036,494,0]An[4784,13,3742,2516,2011,494,0]An[4784,13,3742,2516,4327,494,0]An[4784,13,3742,3742,4821,494,0]An[4784,13,2142,2142,1358,494,0]An[4784,13,2142,2142,1361,494,0]An[1062,13,1063,1063,3149,494,0]An[1062,13,1063,1063,4926,494,0]Am[1062,13,1851,1851,131,494,0]An[1062,13,1558,1558,1376,494,0]An[1062,13,1558,1558,4059,494,0]An[1062,13,1558,1558,4547,494,0]An[1062,13,4269,4269,5126,494,0]An[1062,13,4269,4269,5127,494,0]Am[1062,13,1947,1947,132,494,0]Am[4015,13,4016,4016,121,494,0]An[4015,13,4016,4016,2412,494,0]Ah[3995,5,3996,3195,0,0,0]Ah[4784,5,4785,3195,0,0,0]Ah[3995,5,3741,1528,0,0,0]Ah[4784,5,3742,1528,0,0,0]Al[1062,15,1063,1063,4926,0,0]Ah[3995,6,1941,1531,0,0,0]Ah[4784,6,1942,1531,0,0,0]Ae[4784,6,5033,0,0,0,0]Ae[4784,6,2142,0,0,0,0]Ah[4784,6,4785,3747,0,0,0]1Al[4784,15,4785,1532,3352,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Al[3995,15,3996,4131,3179,0,0]Ai[3995,15,3996,0,4538,0,0]Al[4784,15,4785,1087,3180,0,0]Al[4784,15,4785,3747,4539,0,0]Al[4784,15,4785,1924,4551,0,0]0Ae[1379,5,1556,0,0,0,0]Ae[1062,5,1558,0,0,0,0]Ab[1379,3,0,0,0,0,0]Ai[3995,12,3741,0,4818,0,0]Al[3995,13,3741,0,3146,4818,0]Al[3995,13,3741,0,4035,4818,0]Al[3995,13,3741,0,4326,4818,0]Al[4784,12,3742,3742,4819,0,0]An[4784,13,3742,138,3147,4819,0]Ao[4784,13,3742,1528,4036,4819,0]Ao[4784,13,3742,2516,4327,4819,0]Al[1062,13,1063,1063,4926,0,0]Ai[3995,14,3996,0,1338,0,0]Ai[3995,14,3996,0,2457,0,0]Ai[3995,14,3996,0,2037,0,0]Al[4784,14,4785,3195,1339,0,0]Al[4784,14,4785,1557,2458,0,0]Al[4784,14,4785,1092,2038,0,0]Al[4784,14,4785,2468,4025,0,0]An[1379,13,1380,1380,130,1340,0]Ao[1379,13,1380,1380,4027,1340,0]Ao[3995,13,3996,3746,3339,1340,0]Ao[3995,13,3996,3746,4994,1340,0]Ao[3995,13,3996,3746,4832,1340,0]Ao[3995,13,3996,2467,2421,1340,0]Ao[3995,13,3996,2467,4309,1340,0]An[3995,13,3996,1061,484,1340,0]Ao[3995,13,3996,1061,4450,1340,0]Ao[3995,13,3996,4131,4443,1340,0]Ao[3995,13,3996,4131,3179,1340,0]Ao[3995,13,3996,4131,3366,1340,0]Ao[3995,13,3996,4131,4442,1340,0]Ao[3995,13,3996,4136,3384,1340,0]Ao[3995,13,3996,4136,4216,1340,0]Al[3995,13,3996,0,1618,1340,0]Al[3995,13,3996,0,4991,1340,0]Al[3995,13,3996,0,1601,1340,0]Al[3995,13,3996,0,2457,1340,0]Al[3995,13,3996,0,3345,1340,0]Al[3995,13,3996,0,3176,1340,0]Al[3995,13,3996,0,4542,1340,0]Al[3995,13,3996,0,2037,1340,0]Al[3995,13,3996,0,4168,1340,0]Al[3995,13,3996,0,4538,1340,0]Al[3995,13,3996,0,4561,1340,0]Al[3995,13,3996,0,4856,1340,0]Al[3995,13,3996,0,4871,1340,0]Al[3995,13,3996,0,4040,1340,0]Al[3995,13,3996,0,4419,1340,0]Al[3995,13,3996,0,4210,1340,0]Al[3995,13,3996,0,5048,1340,0]Al[3995,13,3996,0,4162,1340,0]Al[3995,13,3996,0,4030,1340,0]Al[3995,13,3996,0,3159,1340,0]Al[3995,13,3996,0,4535,1340,0]Al[3995,13,3996,0,4728,1340,0]Al[3995,13,3996,0,4174,1340,0]Al[3995,13,3996,0,4177,1340,0]Al[3995,13,3996,0,4182,1340,0]Al[3995,13,3996,0,4890,1340,0]Al[3995,13,3996,0,3348,1340,0]Ak[3995,13,3996,0,491,1340,0]Ak[3995,13,3996,0,122,1340,0]Al[3995,13,3996,0,2444,1340,0]Ak[3995,13,3741,0,116,1340,0]Al[3995,13,3741,0,3146,1340,0]Al[3995,13,3741,0,1342,1340,0]Al[3995,13,3741,0,4035,1340,0]Al[3995,13,3741,0,2010,1340,0]Al[3995,13,3741,0,4326,1340,0]Al[3995,13,1941,0,4987,1340,0]Al[3995,13,1941,0,1355,1340,0]Ao[4784,13,4785,1978,1619,1340,0]Ao[4784,13,4785,1978,4992,1340,0]Ao[4784,13,4785,3204,4833,1340,0]Ao[4784,13,4785,1542,1602,1340,0]Ao[4784,13,4785,1542,4206,1340,0]Ao[4784,13,4785,1542,3360,1340,0]Ao[4784,13,4785,1542,3175,1340,0]Ao[4784,13,4785,1542,4831,1340,0]Ao[4784,13,4785,1542,4887,1340,0]Ao[4784,13,4785,1542,3335,1340,0]Ao[4784,13,4785,1557,2458,1340,0]Ao[4784,13,4785,1557,3346,1340,0]Ao[4784,13,4785,1557,3177,1340,0]Ao[4784,13,4785,1557,4543,1340,0]Ao[4784,13,4785,1087,3180,1340,0]Ao[4784,13,4785,1087,4334,1340,0]Ao[4784,13,4785,1092,2038,1340,0]Ao[4784,13,4785,1092,3385,1340,0]Ao[4784,13,4785,1092,4039,1340,0]Ao[4784,13,4785,2171,4444,1340,0]Ao[4784,13,4785,2171,4172,1340,0]Ao[4784,13,4785,3747,4539,1340,0]Ao[4784,13,4785,3747,3172,1340,0]Ao[4784,13,4785,3747,4410,1340,0]Ao[4784,13,4785,3747,5077,1340,0]Ao[4784,13,4785,3322,4562,1340,0]Ao[4784,13,4785,3322,4857,1340,0]Ao[4784,13,4785,3322,4872,1340,0]Ao[4784,13,4785,3322,4041,1340,0]Ao[4784,13,4785,1859,4420,1340,0]Ao[4784,13,4785,1859,4212,1340,0]Ao[4784,13,4785,1859,5049,1340,0]Ao[4784,13,4785,1859,4164,1340,0]Ao[4784,13,4785,1859,4031,1340,0]Ao[4784,13,4785,1532,3160,1340,0]Ao[4784,13,4785,1532,3352,1340,0]Ao[4784,13,4785,1532,3374,1340,0]Ao[4784,13,4785,1532,4179,1340,0]Ao[4784,13,4785,1532,4537,1340,0]Ao[4784,13,4785,1532,4730,1340,0]Ao[4784,13,4785,1532,2415,1340,0]Ao[4784,13,4785,2468,4734,1340,0]Ao[4784,13,4785,2468,4175,1340,0]Ao[4784,13,4785,1924,4551,1340,0]Ao[4784,13,4785,1924,5080,1340,0]Ao[4784,13,4785,1924,2428,1340,0]Ao[4784,13,4785,1924,4829,1340,0]Ao[4784,13,4785,1952,4178,1340,0]Ao[4784,13,4785,1952,4183,1340,0]Al[4784,13,4785,0,4448,1340,0]Al[4784,13,4785,0,4891,1340,0]Ao[4784,13,4785,4347,3349,1340,0]Ao[4784,13,4785,4347,5175,1340,0]An[4784,13,4785,4785,492,1340,0]An[4784,13,4785,4785,123,1340,0]Ao[4784,13,4785,4785,2445,1340,0]Ao[4784,13,4785,4785,3158,1340,0]Ao[4784,13,1857,1857,4340,1340,0]Ao[4784,13,5033,5033,4932,1340,0]Ao[4784,13,5033,5033,1357,1340,0]Ao[4784,13,1942,1942,4988,1340,0]Al[4784,13,1942,0,1356,1340,0]Am[4784,13,3742,138,117,1340,0]An[4784,13,3742,138,3147,1340,0]Ao[4784,13,3742,1528,1343,1340,0]Ao[4784,13,3742,1528,4036,1340,0]Ao[4784,13,3742,2516,2011,1340,0]Ao[4784,13,3742,2516,4327,1340,0]Ao[4784,13,2142,2142,1361,1340,0]Ao[4484,13,4485,4485,2442,1340,0]Ao[4484,13,4485,4485,2456,1340,0]Ao[4484,13,4485,4485,4184,1340,0]Ao[1062,13,1063,1063,4926,1340,0]Ao[1062,13,1558,1558,4547,1340,0]Al[3995,13,3996,3746,3339,0,0]Al[3995,13,3996,2467,2421,0,0]Ak[3995,13,3996,1061,484,0,0]Al[4784,13,4785,3747,3340,0,0]Al[3995,13,3996,0,4177,1346,0]Ao[4784,13,4785,1952,4178,1346,0]Ai[4784,14,4785,0,4448,0,0]Ai[3995,13,3996,0,2444,0,0]Al[4784,13,4785,4785,2445,0,0]Ai[3995,13,3996,0,4182,0,0]Al[4784,13,4785,1952,4183,0,0]Ai[3995,14,1861,0,2005,0,0]Al[4784,14,1862,1862,2006,0,0]Al[4784,12,4785,1924,4862,0,0]Ao[4784,13,4785,1924,5200,4862,0];Al[1379,13,1556,1556,1375,0,0]Ai[501,13,502,502,4028,0,0]Al[1062,13,1558,1558,1376,0,0]Al[3995,12,3996,2163,3328,0,0]Al[3995,13,3996,4136,3370,0,0]Al[4784,13,4785,2171,3371,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2468,2422,0,0]Al[3995,12,3996,2163,2022,0,0]Ao[3995,13,3996,1569,4217,2022,0]Ao[3995,13,3996,1104,4053,2022,0]Ae[1379,2,1380,0,0,0,0]Ak[1379,14,1380,1380,130,0,0]Al[3995,13,3996,3746,3339,0,0]Al[3995,13,3996,2467,2421,0,0]Ak[3995,13,3996,1061,484,0,0]Al[4784,13,4785,3747,3340,0,0]Ae[1062,2,1063,0,0,0,0]Ai[3995,13,3996,0,3361,0,0]Al[4784,13,4785,1083,3362,0,0]?>Al[4784,13,5033,5033,4932,0,0]Ah[3995,5,3996,2467,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Al[1379,15,1380,1380,4027,0,0]0Al[4784,15,4785,1542,3360,0,0]Ah[4784,5,4785,1087,0,0,0]Ah[3995,15,3996,0,491,0,0]Ak[4784,15,4785,4785,492,0,0]Al[4015,15,4016,4016,2412,0,0]Al[4784,15,2142,2142,1358,0,0]87Ah[3995,5,3996,3746,0,0,0]Al[4784,15,4785,1542,3175,0,0]Al[4784,15,4785,2171,4057,0,0]Ah[3995,5,3996,1542,0,0,0]Ah[4784,5,4785,1542,0,0,0]Ae[4784,8,1857,0,0,0,0]987>Al[4784,15,4785,3747,1360,0,0]>Ah[3995,5,3996,1978,0,0,0]Ah[4784,5,4785,1978,0,0,0]Al[3995,13,3996,2467,2421,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2171,2031,0,0]Al[4784,13,4785,2468,2422,0,0]An[1379,13,1380,1380,130,1581,0]Ao[1379,13,1380,1380,4027,1581,0]Ao[1379,13,1556,1556,4058,1581,0]Ao[1379,13,1556,1556,1375,1581,0]Ao[1379,13,1556,1556,4445,1581,0]Al[501,13,502,502,4028,1581,0]Ao[4064,13,4065,4065,5081,1581,0]Ao[3995,13,3996,3746,4566,1581,0]Ao[3995,13,3996,3746,2435,1581,0]Al[3995,13,3996,0,4300,1581,0]Ao[3995,13,3996,1061,2436,1581,0]Ao[3995,13,3996,1061,4726,1581,0]Ao[3995,13,3996,3746,3337,1581,0]Ao[3995,13,3996,3746,3339,1581,0]Ao[3995,13,3996,3746,2013,1581,0]Ao[3995,13,3996,3746,1594,1581,0]Ao[3995,13,3996,3746,3139,1581,0]Ao[3995,13,3996,3746,2409,1581,0]Ao[3995,13,3996,3746,4202,1581,0]Ao[3995,13,3996,3746,4207,1581,0]Ao[3995,13,3996,3746,4994,1581,0]Ao[3995,13,3996,3746,4832,1581,0]Ao[3995,13,3996,2467,2421,1581,0]Ao[3995,13,3996,2467,4309,1581,0]Ao[3995,13,3996,2467,1575,1581,0]Ao[3995,13,3996,2494,2425,1581,0]Ao[3995,13,3996,2494,3367,1581,0]Ao[3995,13,3996,2494,4424,1581,0]An[3995,13,3996,1061,484,1581,0]Ao[3995,13,3996,1061,4450,1581,0]Ao[3995,13,3996,4131,3364,1581,0]Ao[3995,13,3996,4131,4933,1581,0]Ao[3995,13,3996,4131,4443,1581,0]Ao[3995,13,3996,4131,3179,1581,0]Ao[3995,13,3996,4131,3366,1581,0]Ao[3995,13,3996,4131,4442,1581,0]Ao[3995,13,3996,1569,4217,1581,0]Ao[3995,13,3996,1104,4053,1581,0]Ao[3995,13,3996,4136,3370,1581,0]Ao[3995,13,3996,4136,3384,1581,0]Ao[3995,13,3996,4136,4216,1581,0]Ao[3995,13,3996,4136,2027,1581,0]Al[3995,13,3996,0,3361,1581,0]Al[3995,13,3996,0,4338,1581,0]Al[3995,13,3996,0,4558,1581,0]Al[3995,13,3996,0,4194,1581,0]Al[3995,13,3996,0,4433,1581,0]Al[3995,13,3996,0,1618,1581,0]Al[3995,13,3996,0,4991,1581,0]Al[3995,13,3996,0,1338,1581,0]Al[3995,13,3996,0,1601,1581,0]Al[3995,13,3996,0,2457,1581,0]Al[3995,13,3996,0,3345,1581,0]Al[3995,13,3996,0,3176,1581,0]Al[3995,13,3996,0,4542,1581,0]Al[3995,13,3996,0,2037,1581,0]Al[3995,13,3996,0,4168,1581,0]Al[3995,13,3996,0,4538,1581,0]Al[3995,13,3996,0,4552,1581,0]Al[3995,13,3996,0,4561,1581,0]Al[3995,13,3996,0,4856,1581,0]Al[3995,13,3996,0,4871,1581,0]Al[3995,13,3996,0,4040,1581,0]Al[3995,13,3996,0,4419,1581,0]Al[3995,13,3996,0,4210,1581,0]Al[3995,13,3996,0,5048,1581,0]Al[3995,13,3996,0,4162,1581,0]Al[3995,13,3996,0,4030,1581,0]Al[3995,13,3996,0,3159,1581,0]Al[3995,13,3996,0,4535,1581,0]Al[3995,13,3996,0,4728,1581,0]Al[3995,13,3996,0,4174,1581,0]Al[3995,13,3996,0,4177,1581,0]Al[3995,13,3996,0,4182,1581,0]Al[3995,13,3996,0,4890,1581,0]Al[3995,13,3996,0,3348,1581,0]Al[3995,13,3996,0,4759,1581,0]Ak[3995,13,3996,0,491,1581,0]Ak[3995,13,3996,0,122,1581,0]Al[3995,13,3996,0,2444,1581,0]Al[3995,13,3996,0,2454,1581,0]Ak[3995,13,3741,0,116,1581,0]Al[3995,13,3741,0,3146,1581,0]Al[3995,13,3741,0,1342,1581,0]Al[3995,13,3741,0,4035,1581,0]Al[3995,13,3741,0,2010,1581,0]Al[3995,13,3741,0,4326,1581,0]Al[3995,13,3741,0,4820,1581,0]Al[3995,13,1861,0,2005,1581,0]Ak[3995,13,1861,0,478,1581,0]Al[3995,13,1861,0,5140,1581,0]Al[3995,13,1861,0,4033,1581,0]Al[3995,13,1861,0,4894,1581,0]Al[3995,13,1941,0,3379,1581,0]Al[3995,13,1941,0,4311,1581,0]Al[3995,13,1941,0,4755,1581,0]Al[3995,13,1941,0,4757,1581,0]Al[3995,13,1941,0,4987,1581,0]Al[3995,13,1941,0,1355,1581,0]Ao[4784,13,4785,4571,4301,1581,0]Ao[4784,13,4785,3204,3152,1581,0]Ao[4784,13,4785,1087,1583,1581,0]Ao[4784,13,4785,2171,2031,1581,0]Ao[4784,13,4785,2171,3365,1581,0]Ao[4784,13,4785,2171,3371,1581,0]Ao[4784,13,4785,3747,3340,1581,0]Ao[4784,13,4785,1083,3362,1581,0]Ao[4784,13,4785,1859,4339,1581,0]Ao[4784,13,4785,2468,2422,1581,0]Ao[4784,13,4785,2468,4307,1581,0]Ao[4784,13,4785,1924,5200,1581,0]Ao[4784,13,4785,4347,5170,1581,0]Ao[4784,13,4785,1568,4559,1581,0]Ao[4784,13,4785,1568,4195,1581,0]Ao[4784,13,4785,1568,4434,1581,0]Ao[4784,13,4785,1978,1619,1581,0]Ao[4784,13,4785,1978,4992,1581,0]Ao[4784,13,4785,3195,1339,1581,0]Ao[4784,13,4785,3204,4833,1581,0]Ao[4784,13,4785,1542,1602,1581,0]Ao[4784,13,4785,1542,4206,1581,0]Ao[4784,13,4785,1542,3360,1581,0]Ao[4784,13,4785,1542,3175,1581,0]Ao[4784,13,4785,1542,4831,1581,0]Ao[4784,13,4785,1542,4887,1581,0]Ao[4784,13,4785,1542,3335,1581,0]Ao[4784,13,4785,1557,2458,1581,0]Ao[4784,13,4785,1557,3346,1581,0]Ao[4784,13,4785,1557,3177,1581,0]Ao[4784,13,4785,1557,4543,1581,0]Ao[4784,13,4785,1087,3180,1581,0]Ao[4784,13,4785,1087,4334,1581,0]Ao[4784,13,4785,1092,2038,1581,0]Ao[4784,13,4785,1092,3385,1581,0]Ao[4784,13,4785,1092,4039,1581,0]Ao[4784,13,4785,2171,4057,1581,0]Ao[4784,13,4785,2171,4444,1581,0]Ao[4784,13,4785,2171,4172,1581,0]Ao[4784,13,4785,3747,4539,1581,0]Ao[4784,13,4785,3747,3172,1581,0]Ao[4784,13,4785,3747,4410,1581,0]Ao[4784,13,4785,3747,5077,1581,0]Ao[4784,13,4785,3747,1360,1581,0]Ao[4784,13,4785,1083,4553,1581,0]Ao[4784,13,4785,3322,4562,1581,0]Ao[4784,13,4785,3322,4857,1581,0]Ao[4784,13,4785,3322,4872,1581,0]Ao[4784,13,4785,3322,4041,1581,0]Ao[4784,13,4785,1859,4420,1581,0]Ao[4784,13,4785,1859,4212,1581,0]Ao[4784,13,4785,1859,5049,1581,0]Ao[4784,13,4785,1859,4164,1581,0]Ao[4784,13,4785,1859,4031,1581,0]Ao[4784,13,4785,1532,3160,1581,0]Ao[4784,13,4785,1532,4425,1581,0]Ao[4784,13,4785,1532,3352,1581,0]Ao[4784,13,4785,1532,3374,1581,0]Ao[4784,13,4785,1532,4179,1581,0]Ao[4784,13,4785,1532,4537,1581,0]Ao[4784,13,4785,1532,4730,1581,0]Ao[4784,13,4785,1532,2415,1581,0]Ao[4784,13,4785,2468,4734,1581,0]Ao[4784,13,4785,2468,2426,1581,0]Ao[4784,13,4785,2468,4175,1581,0]Ao[4784,13,4785,2468,4025,1581,0]Ao[4784,13,4785,2468,3368,1581,0]Ao[4784,13,4785,1924,4329,1581,0]Ao[4784,13,4785,1924,4551,1581,0]Ao[4784,13,4785,1924,5080,1581,0]Ao[4784,13,4785,1924,2428,1581,0]Ao[4784,13,4785,1924,4829,1581,0]Ao[4784,13,4785,1952,4541,1581,0]Ao[4784,13,4785,1952,4308,1581,0]Ao[4784,13,4785,1952,4178,1581,0]Ao[4784,13,4785,1952,4183,1581,0]Al[4784,13,4785,0,4448,1581,0]Al[4784,13,4785,0,4891,1581,0]Ao[4784,13,4785,4347,3349,1581,0]Ao[4784,13,4785,4347,5175,1581,0]Ao[4784,13,4785,4922,4760,1581,0]An[4784,13,4785,4785,492,1581,0]An[4784,13,4785,4785,123,1581,0]Ao[4784,13,4785,4785,2445,1581,0]Ao[4784,13,4785,4785,2455,1581,0]Ao[4784,13,4785,4785,3158,1581,0]Ao[4784,13,1857,1857,4340,1581,0]Ao[4784,13,5033,5033,4932,1581,0]Ao[4784,13,5033,5033,1357,1581,0]Ao[4784,13,1862,1862,2006,1581,0]An[4784,13,1862,1862,479,1581,0]Ao[4784,13,1862,1862,5141,1581,0]Ao[4784,13,1862,1862,4034,1581,0]Ao[4784,13,1862,1862,4897,1581,0]Ao[4784,13,1942,1942,3380,1581,0]Ao[4784,13,1942,1942,4312,1581,0]Ao[4784,13,1942,1942,4756,1581,0]Ao[4784,13,1942,1942,4758,1581,0]Ao[4784,13,1942,1942,4988,1581,0]Al[4784,13,1942,0,1356,1581,0]Am[4784,13,3742,138,117,1581,0]An[4784,13,3742,138,3147,1581,0]Ao[4784,13,3742,1528,1343,1581,0]Ao[4784,13,3742,1528,4036,1581,0]Ao[4784,13,3742,2516,2011,1581,0]Ao[4784,13,3742,2516,4327,1581,0]Ao[4784,13,3742,3742,4821,1581,0]Ao[4784,13,2142,2142,1358,1581,0]Ao[4784,13,2142,2142,1361,1581,0]Ao[4484,13,4485,4485,3383,1581,0]An[4484,13,4485,399,4449,1581,0]Ao[4484,13,4485,4485,2442,1581,0]Ao[4484,13,4485,4485,2456,1581,0]Ao[4484,13,4485,4485,4184,1581,0]Ao[1062,13,1063,1063,3149,1581,0]Ao[1062,13,1063,1063,4926,1581,0]An[1062,13,1851,1851,131,1581,0]Ao[1062,13,1558,1558,1376,1581,0]Ao[1062,13,1558,1558,4059,1581,0]Ao[1062,13,1558,1558,4547,1581,0]Ao[1062,13,4269,4269,5126,1581,0]Ao[1062,13,4269,4269,5127,1581,0]An[1062,13,1947,1947,132,1581,0]An[4015,13,4016,4016,121,1581,0]Ao[4015,13,4016,4016,2412,1581,0]Ai[3995,14,3996,0,2037,0,0]Al[4784,14,4785,1092,2038,0,0]Ak[1379,14,1380,1380,130,0,0]Ac[501,7,502,0,0,0,0]Al[3995,13,3996,2467,2421,0,0]Ae[1062,2,1063,0,0,0,0]Ae[4851,7,4852,0,0,0,0]Al[3995,13,3996,3746,3339,0,0]Ae[4784,2,4785,0,0,0,0]Al[4784,13,4785,2468,2422,0,0]Ah[3995,2,3996,4785,0,0,0]Ai[3995,13,3996,0,4890,0,0]Ai[3995,14,3996,0,3345,0,0]Ai[3995,14,3996,0,4210,0,0]5Ai[4784,13,4785,0,4891,0,0]Al[4784,14,4785,1557,3346,0,0]Al[4784,14,4785,1859,4212,0,0]Ai[4784,14,4785,0,4448,0,0]Al[3995,13,3996,0,1618,3153,0]Al[3995,13,3996,0,1601,3153,0]Al[3995,13,3996,0,3159,3153,0]Al[3995,13,3996,0,4890,3153,0]Al[3995,13,3996,0,2444,3153,0]Ao[4784,13,4785,1978,1619,3153,0]Ao[4784,13,4785,1542,1602,3153,0]Ao[4784,13,4785,1532,3160,3153,0]Ao[4784,13,4785,1532,3352,3153,0]Al[4784,13,4785,1924,4551,0,0]Al[4784,13,4785,0,4891,3153,0]Ao[4784,13,4785,4785,2445,3153,0]Al[4784,12,1857,1857,3153,0,0]Al[4484,14,4485,4485,2442,0,0]Al[3995,13,3996,0,1618,3156,0]Al[3995,13,3996,0,1601,3156,0]Al[3995,13,3996,0,3159,3156,0]Al[3995,13,3996,0,4890,3156,0]Al[3995,13,3996,0,2444,3156,0]Ao[4784,13,4785,1978,1619,3156,0]Ao[4784,13,4785,1542,1602,3156,0]Ao[4784,13,4785,1532,3160,3156,0]Ao[4784,13,4785,1532,3352,3156,0]Ao[4784,13,4785,1532,2415,3156,0]Al[4784,13,4785,0,4891,3156,0]Ao[4784,13,4785,4785,2445,3156,0]Al[4784,12,1857,1857,3156,0,0]Al[3995,13,3996,4136,3370,0,0]Al[4784,13,4785,2171,3371,0,0]Al[1062,13,1558,1558,4059,0,0]Al[4784,13,4785,2468,2422,0,0]Ah[3995,14,1861,0,478,0,0]Ak[4784,14,1862,1862,479,0,0]Al[3995,13,3996,2494,2425,0,0]3Ai[3995,12,3996,0,3381,0,0]Al[3995,13,3996,0,4433,3381,0]Al[3995,13,3996,0,4759,3381,0]Al[4784,12,4785,1568,3382,0,0]Ao[4784,13,4785,1568,4434,3382,0]Ao[4784,13,4785,4922,4760,3382,0]Al[1062,14,1063,1063,3149,0,0]Ai[3995,14,3996,0,1338,0,0]Al[4784,14,4785,3195,1339,0,0]Ai[3995,13,3741,0,3341,0,0]Ak[3995,13,3741,0,116,3341,0]Al[3995,13,3741,0,1342,3341,0]Al[3995,13,3741,0,2010,3341,0]Al[4784,13,3742,3742,3342,0,0]Am[4784,13,3742,138,117,3342,0]Ao[4784,13,3742,1528,1343,3342,0]Ao[4784,13,3742,2516,2011,3342,0]Ah[3995,14,1861,0,478,0,0]Ak[4784,14,1862,1862,479,0,0]Ai[4784,14,4550,0,4764,0,0]Ai[3995,14,3996,0,4535,0,0]Ai[3995,14,3996,0,4728,0,0]Al[4784,14,4785,1532,4537,0,0]Al[4784,14,4785,1532,4730,0,0]Ai[4784,14,4785,0,4448,0,0]Ai[4784,14,1359,0,4412,0,0]Ai[4784,14,3173,0,3137,0,0]Al[3995,13,3996,2467,2421,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2468,2422,0,0]Ai[3995,14,1861,0,2005,0,0]Al[4784,14,4785,4785,3158,0,0]Al[4784,14,1862,1862,2006,0,0]Ae[3995,4,3996,0,0,0,0]Ah[3995,2,1861,1862,0,0,0]Ae[4784,4,4785,0,0,0,0]Ae[4784,2,1862,0,0,0,0]Ac[501,7,502,0,0,0,0]:Ae[1062,2,1063,0,0,0,0]Ae[4851,7,4852,0,0,0,0]Ao[3995,13,3996,3746,4832,1348,0]Ao[3995,13,3996,4131,4443,1348,0]Ao[3995,13,3996,4131,3179,1348,0]Ao[3995,13,3996,4131,3366,1348,0]Ao[3995,13,3996,4131,4442,1348,0]Ao[3995,13,3996,4136,3384,1348,0]Ao[3995,13,3996,4136,4216,1348,0]Al[3995,13,3996,0,4538,1348,0]Ao[4784,13,4785,3747,4539,1348,0]Ai[3995,14,3996,0,2454,0,0]Al[4784,14,4785,4785,2455,0,0]Al[4484,14,4485,4485,2456,0,0]Ak[3995,13,3996,1061,484,0,0]Ai[4784,14,3173,0,4203,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]Al[4484,14,4485,4485,2442,0,0]Ai[3995,14,3996,0,3176,0,0]Ai[3995,14,3996,0,4542,0,0]Al[4784,14,4785,1557,3177,0,0]Al[4784,14,4785,1557,4543,0,0]3210Ai[3995,12,1861,0,2001,0,0]Al[4784,12,1862,1862,2002,0,0]Ai[3995,12,3741,0,3341,0,0]Ak[3995,13,3741,0,116,3341,0]Al[3995,13,3741,0,1342,3341,0]Al[3995,13,3741,0,2010,3341,0]Al[4784,12,3742,3742,3342,0,0]Am[4784,13,3742,138,117,3342,0]Ao[4784,13,3742,1528,1343,3342,0]Ao[4784,13,3742,2516,2011,3342,0]Ai[3995,10,1861,1862,0,0,0]Af[4784,10,1862,0,0,0,0]Al[4784,15,4785,3204,4833,0,0]Al[4784,15,4785,1087,3180,0,0]Al[4784,15,4785,1092,3385,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]65Al[4784,15,4785,1924,4551,0,0]Ah[3995,5,1861,1862,0,0,0]Ae[4784,5,1862,0,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[3995,5,3741,2516,0,0,0]Ah[4784,5,3742,2516,0,0,0]Al[1062,15,1063,1063,4926,0,0]Ah[3995,5,3996,3746,0,0,0]5454Ai[3995,10,3996,2163,0,0,0]Ai[3995,10,1861,1862,0,0,0]Af[4784,10,1862,0,0,0,0]Al[3995,15,3996,4136,3384,0,0]Ah[3995,5,3996,4136,0,0,0]Al[4784,15,4785,1092,3385,0,0]Al[4784,15,4785,1092,4039,0,0]Al[4784,15,4785,2171,4057,0,0]Ah[4784,5,4785,2171,0,0,0]Al[3995,15,3996,4131,4443,0,0]Al[4784,15,4785,1532,3352,0,0]Ah[3995,5,3996,1092,0,0,0]Ah[4784,5,4785,1092,0,0,0]Al[4784,15,4785,1924,2428,0,0]Ai[3995,12,3996,0,5039,0,0]Al[4784,12,4785,4347,5040,0,0]Ao[4784,13,4785,4347,5170,5040,0]Ao[4784,13,4785,4347,5175,5040,0]Ak[1379,14,1380,1380,130,0,0]An[1379,13,1380,1380,130,4411,0]Ao[1062,13,1063,1063,3149,4411,0]An[1062,13,1851,1851,131,4411,0]An[1062,13,1947,1947,132,4411,0]An[4015,13,4016,4016,121,4411,0]Ak[4015,14,4016,4016,121,0,0]Al[3995,13,3996,0,1618,3336,0]Al[3995,13,3996,0,1601,3336,0]Al[3995,13,3996,0,4040,3336,0]Al[3995,13,3996,0,4177,3336,0]Ak[3995,13,3996,0,491,3336,0]Ak[3995,13,3996,0,122,3336,0]Al[3995,13,3996,0,2444,3336,0]Ao[4784,13,4785,1978,1619,3336,0]Ao[4784,13,4785,3204,4833,3336,0]Ao[4784,13,4785,1542,1602,3336,0]Ao[4784,13,4785,1087,3180,3336,0]Ao[4784,13,4785,1087,4334,3336,0]Ao[4784,13,4785,1092,3385,3336,0]Ao[4784,13,4785,3322,4041,3336,0]Ao[4784,13,4785,2468,4734,3336,0]Ao[4784,13,4785,1924,4829,3336,0]Ao[4784,13,4785,1952,4178,3336,0]An[4784,13,4785,4785,492,3336,0]An[4784,13,4785,4785,123,3336,0]Ao[4784,13,4785,4785,2445,3336,0]Al[3995,13,3996,2467,2421,0,0]Al[4784,13,4785,2468,2422,0,0]Ai[3995,12,1861,0,3169,0,0]Ai[3995,12,1861,0,3162,0,0]Al[4784,12,1862,1862,3170,0,0]Al[4784,12,1862,1862,3163,0,0]Ao[1379,13,1556,1556,4058,1996,0]Ao[1379,13,1556,1556,1375,1996,0]Al[501,13,502,502,4028,1996,0]Al[3995,13,3996,0,4300,1996,0]Ao[3995,13,3996,2467,4309,1996,0]Al[3995,13,3996,0,1618,1996,0]Al[3995,13,3996,0,1601,1996,0]Al[3995,13,3996,0,2457,1996,0]Al[3995,13,3996,0,3345,1996,0]Al[3995,13,3996,0,3176,1996,0]Al[3995,13,3996,0,4542,1996,0]Al[3995,13,3996,0,2037,1996,0]Al[3995,13,3996,0,4168,1996,0]Al[3995,13,3996,0,4561,1996,0]Al[3995,13,3996,0,4856,1996,0]Al[3995,13,3996,0,4871,1996,0]Al[3995,13,3996,0,4040,1996,0]Al[3995,13,3996,0,4419,1996,0]Al[3995,13,3996,0,5048,1996,0]Al[3995,13,3996,0,4759,1996,0]Al[3995,13,3741,0,3146,1996,0]Al[3995,13,3741,0,4035,1996,0]Al[3995,13,3741,0,4326,1996,0]Al[3995,13,3741,0,4820,1996,0]Ao[4784,13,4785,4571,4301,1996,0]Ao[4784,13,4785,4347,5170,1996,0]Ao[4784,13,4785,1978,1619,1996,0]Ao[4784,13,4785,1542,1602,1996,0]Ao[4784,13,4785,1542,3360,1996,0]Ao[4784,13,4785,1542,3335,1996,0]Ao[4784,13,4785,1557,2458,1996,0]Ao[4784,13,4785,1557,3346,1996,0]Ao[4784,13,4785,1557,3177,1996,0]Ao[4784,13,4785,1557,4543,1996,0]Ao[4784,13,4785,1092,2038,1996,0]Ao[4784,13,4785,2171,4444,1996,0]Ao[4784,13,4785,2171,4172,1996,0]Ao[4784,13,4785,3322,4562,1996,0]Ao[4784,13,4785,3322,4857,1996,0]Ao[4784,13,4785,3322,4872,1996,0]Ao[4784,13,4785,3322,4041,1996,0]Ao[4784,13,4785,1859,4420,1996,0]Ao[4784,13,4785,1859,5049,1996,0]Ao[4784,13,4785,4347,5175,1996,0]Ao[4784,13,4785,4922,4760,1996,0]An[4784,13,3742,138,3147,1996,0]Ao[4784,13,3742,1528,4036,1996,0]Ao[4784,13,3742,2516,4327,1996,0]Ao[4784,13,3742,3742,4821,1996,0]Ao[4484,13,4485,4485,2442,1996,0]Ao[1062,13,1558,1558,1376,1996,0]Ao[1062,13,1558,1558,4547,1996,0]Al[4784,13,4785,1952,4308,0,0]Al[4784,13,4785,1924,4329,0,0]Al[4784,13,4785,1924,4551,0,0]Al[4784,14,4785,1924,5080,0,0]Ai[4784,14,4828,0,4892,0,0]Ah[4784,14,4550,0,480,0,0]Ai[4784,14,4550,0,1370,0,0]Ai[4784,14,4550,0,1372,0,0]Ai[4784,14,4550,0,4764,0,0]Ai[3995,12,1861,0,3169,0,0]Ai[3995,12,1861,0,3162,0,0]Al[4784,12,1862,1862,3170,0,0]Al[4784,12,1862,1862,3163,0,0]Ae[4784,2,4785,0,0,0,0]Al[3995,13,3996,4131,3364,0,0]Al[3995,13,3996,4131,4933,0,0]Ai[3995,13,3741,0,3341,0,0]Ak[3995,13,3741,0,116,3341,0]Al[3995,13,3741,0,1342,3341,0]Al[3995,13,3741,0,2010,3341,0]Al[4784,13,3742,3742,3342,0,0]Am[4784,13,3742,138,117,3342,0]Ao[4784,13,3742,1528,1343,3342,0]Ao[4784,13,3742,2516,2011,3342,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]9854Al[3995,13,3996,3746,3339,0,0]Al[3995,13,3996,1061,2436,0,0]Al[4784,14,4785,1924,5080,0,0]Ai[4784,14,4828,0,4892,0,0]Ah[4784,14,4550,0,480,0,0]Ai[4784,14,4550,0,1370,0,0]Ai[4784,14,4550,0,4764,0,0]Al[3995,13,3996,4136,3370,0,0]Al[4784,13,4785,2171,3371,0,0]Ak[1379,14,1380,1380,130,0,0]Al[1379,14,1556,1556,1375,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,12,1861,0,3169,0,0]Al[4784,12,1862,1862,3170,0,0]Am[1379,13,1380,1380,130,114,0]An[1379,13,1380,1380,4027,114,0]An[1379,13,1556,1556,4058,114,0]An[1379,13,1556,1556,1375,114,0]An[1379,13,1556,1556,4445,114,0]Ak[501,13,502,502,4028,114,0]An[4064,13,4065,4065,5081,114,0]An[3995,13,3996,3746,4566,114,0]An[3995,13,3996,3746,2435,114,0]Ak[3995,13,3996,0,4300,114,0]An[3995,13,3996,1061,2436,114,0]An[3995,13,3996,1061,4726,114,0]An[3995,13,3996,3746,3337,114,0]An[3995,13,3996,3746,3339,114,0]An[3995,13,3996,3746,2013,114,0]An[3995,13,3996,3746,1594,114,0]An[3995,13,3996,3746,3139,114,0]An[3995,13,3996,3746,2409,114,0]An[3995,13,3996,3746,4202,114,0]An[3995,13,3996,3746,4207,114,0]An[3995,13,3996,3746,4994,114,0]An[3995,13,3996,3746,4832,114,0]An[3995,13,3996,2467,2421,114,0]An[3995,13,3996,2467,4309,114,0]An[3995,13,3996,2467,1575,114,0]An[3995,13,3996,2494,2425,114,0]An[3995,13,3996,2494,3367,114,0]An[3995,13,3996,2494,4424,114,0]Am[3995,13,3996,1061,484,114,0]An[3995,13,3996,1061,4450,114,0]An[3995,13,3996,4131,3364,114,0]An[3995,13,3996,4131,4933,114,0]An[3995,13,3996,4131,4443,114,0]An[3995,13,3996,4131,3179,114,0]An[3995,13,3996,4131,3366,114,0]An[3995,13,3996,4131,4442,114,0]An[3995,13,3996,1569,4217,114,0]An[3995,13,3996,1104,4053,114,0]An[3995,13,3996,4136,3370,114,0]An[3995,13,3996,4136,3384,114,0]An[3995,13,3996,4136,4216,114,0]An[3995,13,3996,4136,2027,114,0]Ak[3995,13,3996,0,3361,114,0]Ak[3995,13,3996,0,4338,114,0]Ak[3995,13,3996,0,4558,114,0]Ak[3995,13,3996,0,4194,114,0]Ak[3995,13,3996,0,4433,114,0]Ak[3995,13,3996,0,1618,114,0]Ak[3995,13,3996,0,4991,114,0]Ak[3995,13,3996,0,1338,114,0]Ak[3995,13,3996,0,1601,114,0]Ak[3995,13,3996,0,2457,114,0]Ak[3995,13,3996,0,3345,114,0]Ak[3995,13,3996,0,3176,114,0]Ak[3995,13,3996,0,4542,114,0]Ak[3995,13,3996,0,2037,114,0]Ak[3995,13,3996,0,4168,114,0]Ak[3995,13,3996,0,4538,114,0]Ak[3995,13,3996,0,4552,114,0]Ak[3995,13,3996,0,4561,114,0]Ak[3995,13,3996,0,4856,114,0]Ak[3995,13,3996,0,4871,114,0]Ak[3995,13,3996,0,4040,114,0]Ak[3995,13,3996,0,4419,114,0]Ak[3995,13,3996,0,4210,114,0]Ak[3995,13,3996,0,5048,114,0]Ak[3995,13,3996,0,4162,114,0]Ak[3995,13,3996,0,4030,114,0]Ak[3995,13,3996,0,3159,114,0]Ak[3995,13,3996,0,4535,114,0]Ak[3995,13,3996,0,4728,114,0]Ak[3995,13,3996,0,4174,114,0]Ak[3995,13,3996,0,4177,114,0]Ak[3995,13,3996,0,4182,114,0]Ak[3995,13,3996,0,4890,114,0]Ak[3995,13,3996,0,3348,114,0]Ak[3995,13,3996,0,4759,114,0]Aj[3995,13,3996,0,491,114,0]Aj[3995,13,3996,0,122,114,0]Ak[3995,13,3996,0,2444,114,0]Ak[3995,13,3996,0,2454,114,0]Aj[3995,13,3741,0,116,114,0]Ak[3995,13,3741,0,3146,114,0]Ak[3995,13,3741,0,1342,114,0]Ak[3995,13,3741,0,4035,114,0]Ak[3995,13,3741,0,2010,114,0]Ak[3995,13,3741,0,4326,114,0]Ak[3995,13,3741,0,4820,114,0]Ak[3995,13,1861,0,2005,114,0]Aj[3995,13,1861,0,478,114,0]Ak[3995,13,1861,0,5140,114,0]Ak[3995,13,1861,0,4033,114,0]Ak[3995,13,1861,0,4894,114,0]Ak[3995,13,1941,0,3379,114,0]Ak[3995,13,1941,0,4311,114,0]Ak[3995,13,1941,0,4755,114,0]Ak[3995,13,1941,0,4757,114,0]Ak[3995,13,1941,0,4987,114,0]Ak[3995,13,1941,0,1355,114,0]An[4784,13,4785,4571,4301,114,0]An[4784,13,4785,3204,3152,114,0]An[4784,13,4785,1087,1583,114,0]An[4784,13,4785,2171,2031,114,0]An[4784,13,4785,2171,3365,114,0]An[4784,13,4785,2171,3371,114,0]An[4784,13,4785,3747,3340,114,0]An[4784,13,4785,1083,3362,114,0]An[4784,13,4785,1859,4339,114,0]An[4784,13,4785,2468,2422,114,0]An[4784,13,4785,2468,4307,114,0]An[4784,13,4785,1924,5200,114,0]An[4784,13,4785,4347,5170,114,0]An[4784,13,4785,1568,4559,114,0]An[4784,13,4785,1568,4195,114,0]An[4784,13,4785,1568,4434,114,0]An[4784,13,4785,1978,1619,114,0]An[4784,13,4785,1978,4992,114,0]An[4784,13,4785,3195,1339,114,0]An[4784,13,4785,3204,4833,114,0]An[4784,13,4785,1542,1602,114,0]An[4784,13,4785,1542,4206,114,0]An[4784,13,4785,1542,3360,114,0]An[4784,13,4785,1542,3175,114,0]An[4784,13,4785,1542,4831,114,0]An[4784,13,4785,1542,4887,114,0]An[4784,13,4785,1542,3335,114,0]An[4784,13,4785,1557,2458,114,0]An[4784,13,4785,1557,3346,114,0]An[4784,13,4785,1557,3177,114,0]An[4784,13,4785,1557,4543,114,0]An[4784,13,4785,1087,3180,114,0]An[4784,13,4785,1087,4334,114,0]An[4784,13,4785,1092,2038,114,0]An[4784,13,4785,1092,3385,114,0]An[4784,13,4785,1092,4039,114,0]An[4784,13,4785,2171,4057,114,0]An[4784,13,4785,2171,4444,114,0]An[4784,13,4785,2171,4172,114,0]An[4784,13,4785,3747,4539,114,0]An[4784,13,4785,3747,3172,114,0]An[4784,13,4785,3747,4410,114,0]An[4784,13,4785,3747,5077,114,0]An[4784,13,4785,3747,1360,114,0]An[4784,13,4785,1083,4553,114,0]An[4784,13,4785,3322,4562,114,0]An[4784,13,4785,3322,4857,114,0]An[4784,13,4785,3322,4872,114,0]An[4784,13,4785,3322,4041,114,0]An[4784,13,4785,1859,4420,114,0]An[4784,13,4785,1859,4212,114,0]An[4784,13,4785,1859,5049,114,0]An[4784,13,4785,1859,4164,114,0]An[4784,13,4785,1859,4031,114,0]An[4784,13,4785,1532,3160,114,0]An[4784,13,4785,1532,4425,114,0]An[4784,13,4785,1532,3352,114,0]An[4784,13,4785,1532,3374,114,0]An[4784,13,4785,1532,4179,114,0]An[4784,13,4785,1532,4537,114,0]An[4784,13,4785,1532,4730,114,0]An[4784,13,4785,1532,2415,114,0]An[4784,13,4785,2468,4734,114,0]An[4784,13,4785,2468,2426,114,0]An[4784,13,4785,2468,4175,114,0]An[4784,13,4785,2468,4025,114,0]An[4784,13,4785,2468,3368,114,0]An[4784,13,4785,1924,4329,114,0]An[4784,13,4785,1924,4551,114,0]An[4784,13,4785,1924,5080,114,0]An[4784,13,4785,1924,2428,114,0]An[4784,13,4785,1924,4829,114,0]An[4784,13,4785,1952,4541,114,0]An[4784,13,4785,1952,4308,114,0]An[4784,13,4785,1952,4178,114,0]An[4784,13,4785,1952,4183,114,0]Ak[4784,13,4785,0,4448,114,0]Ak[4784,13,4785,0,4891,114,0]An[4784,13,4785,4347,3349,114,0]An[4784,13,4785,4347,5175,114,0]An[4784,13,4785,4922,4760,114,0]Am[4784,13,4785,4785,492,114,0]Am[4784,13,4785,4785,123,114,0]An[4784,13,4785,4785,2445,114,0]An[4784,13,4785,4785,2455,114,0]An[4784,13,4785,4785,3158,114,0]An[4784,13,1857,1857,4340,114,0]An[4784,13,5033,5033,4932,114,0]An[4784,13,5033,5033,1357,114,0]An[4784,13,1862,1862,2006,114,0]Am[4784,13,1862,1862,479,114,0]An[4784,13,1862,1862,5141,114,0]An[4784,13,1862,1862,4034,114,0]An[4784,13,1862,1862,4897,114,0]An[4784,13,1942,1942,3380,114,0]An[4784,13,1942,1942,4312,114,0]An[4784,13,1942,1942,4756,114,0]An[4784,13,1942,1942,4758,114,0]An[4784,13,1942,1942,4988,114,0]Ak[4784,13,1942,0,1356,114,0]Al[4784,13,3742,138,117,114,0]Am[4784,13,3742,138,3147,114,0]An[4784,13,3742,1528,1343,114,0]An[4784,13,3742,1528,4036,114,0]An[4784,13,3742,2516,2011,114,0]An[4784,13,3742,2516,4327,114,0]An[4784,13,3742,3742,4821,114,0]An[4784,13,2142,2142,1358,114,0]An[4784,13,2142,2142,1361,114,0]An[4484,13,4485,4485,3383,114,0]Am[4484,13,4485,399,4449,114,0]An[4484,13,4485,4485,2442,114,0]An[4484,13,4485,4485,2456,114,0]An[4484,13,4485,4485,4184,114,0]An[1062,13,1063,1063,3149,114,0]An[1062,13,1063,1063,4926,114,0]Am[1062,13,1851,1851,131,114,0]An[1062,13,1558,1558,1376,114,0]An[1062,13,1558,1558,4059,114,0]An[1062,13,1558,1558,4547,114,0]An[1062,13,4269,4269,5126,114,0]An[1062,13,4269,4269,5127,114,0]Am[1062,13,1947,1947,132,114,0]Am[4015,13,4016,4016,121,114,0]An[4015,13,4016,4016,2412,114,0]Al[3995,13,3996,3746,4994,0,0]Al[3995,13,3996,1061,4450,0,0]Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4164,0,0]Al[4784,14,4785,1924,5080,0,0]Ai[4784,14,4828,0,4892,0,0]Ah[4784,14,4550,0,480,0,0]Ai[4784,14,4550,0,1370,0,0]Ah[3995,5,3996,3746,0,0,0]Al[1379,15,1380,1380,4027,0,0]Ae[4015,6,4016,0,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[4784,5,4785,1532,0,0,0]Al[3995,15,3996,3746,4832,0,0]Al[4784,15,4785,3204,4833,0,0]Ah[3995,5,3996,2467,0,0,0]Ah[4784,5,4785,2468,0,0,0]Al[4784,15,4785,2171,4057,0,0]Ah[3995,5,3996,2494,0,0,0]2Ah[4784,6,4785,1924,0,0,0]Ai[3995,19,3996,0,1618,0,0]Al[4784,19,4785,1978,1619,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]=Ai[3995,12,1861,0,4211,0,0]>Al[3995,13,1941,0,4757,4211,0]>Al[4784,12,1862,1862,4213,0,0]>Ao[4784,13,1942,1942,4758,4213,0]Ao[1062,13,4269,4269,5127,4213,0]An[4015,13,4016,4016,121,4042,0]Ao[4015,13,4016,4016,2412,4042,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,14,4785,1557,3177,0,0]Ai[3995,13,3996,0,4210,0,0]Al[4784,13,4785,1859,4212,0,0]Al[3995,13,3996,2163,4407,0,0]0>=Al[1062,13,1558,1558,4547,0,0]Ae[1062,2,1063,0,0,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2468,2426,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]43Ai[3995,14,3996,0,2454,0,0]Al[4784,14,4785,4785,2455,0,0]Al[4484,14,4485,4485,2456,0,0]Al[4784,13,4785,2171,2031,0,0]Al[4784,13,4785,4347,5170,0,0]Al[4784,13,4785,4347,5175,0,0]Al[3995,13,3996,4136,3370,0,0]Al[4784,13,4785,2171,3371,0,0]<;Al[1379,14,1556,1556,1375,0,0]Ai[501,14,502,502,4028,0,0]Ai[3995,13,1941,0,4755,0,0]Ai[3995,13,1941,0,4757,0,0]Al[4784,13,1942,1942,4756,0,0]Al[4784,13,1942,1942,4758,0,0]76Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ah[3995,5,3996,4571,0,0,0]Ah[4784,5,4785,4571,0,0,0]Ai[3995,15,3996,0,4538,0,0]Ai[3995,15,3996,0,4174,0,0]Al[4784,15,4785,3747,4539,0,0]Al[4784,15,4785,2468,4175,0,0]Ah[4784,6,4785,2468,0,0,0]Ah[4784,5,4785,1952,0,0,0]Ah[3995,5,3996,2467,0,0,0]Al[3995,15,3996,4131,4442,0,0]Ah[3995,5,1941,1942,0,0,0]Ae[4784,5,1942,0,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Al[4784,15,4785,1924,4829,0,0]><4343Al[4784,15,4785,2468,4307,0,0]Ah[3995,5,3741,2516,0,0,0]Ah[4784,5,3742,2516,0,0,0]Ah[4784,5,4785,1924,0,0,0]87Ah[4784,6,4785,1087,0,0,0]98Ah[3995,5,3996,1859,0,0,0]Ah[4784,5,4785,1859,0,0,0]Ae[4784,5,1857,0,0,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]Al[1062,14,1063,1063,3149,0,0]Ae[4784,2,4785,0,0,0,0]Ai[3995,13,3996,0,4419,0,0]Al[4784,13,4785,1859,4420,0,0]Al[3995,12,3996,2163,4407,0,0]Ab[4350,3,0,0,0,0,0]Ak[1379,14,1380,1380,130,0,0]Al[1379,14,1556,1556,4058,0,0]98Al[3995,13,3996,2494,3367,0,0]Al[4784,13,4785,2468,3368,0,0]Ai[3995,13,3996,0,4856,0,0]Al[4784,13,4785,3322,4857,0,0];=Al[3995,13,3996,4131,4933,0,0]Al[4784,13,4785,2171,3365,0,0]Al[3995,13,3996,3746,3337,0,0]Al[3995,13,3996,3746,3339,0,0]Al[3995,13,3996,2494,2425,0,0]Ak[3995,13,3996,1061,484,0,0]Al[4784,13,4785,2468,2426,0,0]<;Ai[3995,13,3996,0,1618,0,0]Ai[3995,13,3996,0,1601,0,0]Al[4784,13,4785,1978,1619,0,0]Al[4784,13,4785,1542,1602,0,0]20Ae[1379,7,1556,0,0,0,0]?>Al[1379,14,1556,1556,1375,0,0]Ao[1062,13,1063,1063,4926,3184,0]Ai[3995,15,3996,0,3159,0,0]Ah[3995,5,3996,1532,0,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[4784,5,4785,1532,0,0,0]Ah[3995,6,3996,3747,0,0,0]Ah[4784,6,4785,3747,0,0,0]Al[4784,15,4785,2468,4307,0,0]Ah[4784,5,4785,1952,0,0,0]Ah[3995,5,3996,1557,0,0,0]Ah[4784,5,4785,1557,0,0,0]97Ae[1062,5,1558,0,0,0,0]:8Ah[4784,6,4785,1924,0,0,0]Ah[3995,5,3996,1083,0,0,0]Ah[4784,5,4785,1083,0,0,0]Al[4784,15,4785,1542,4831,0,0]Ah[3995,5,3996,1568,0,0,0]Ah[4784,5,4785,1568,0,0,0]Ah[3995,5,3996,3322,0,0,0]Ah[4784,5,4785,3322,0,0,0]Ai[3995,15,3996,0,4538,0,0]Al[4784,15,4785,3747,4539,0,0]Ah[3995,5,3996,3746,0,0,0]Al[3995,15,3996,4131,3179,0,0]Al[3995,15,3996,4131,3366,0,0]Al[3995,15,3996,4136,3384,0,0]Al[3995,15,3996,4136,4216,0,0]An[1379,13,1380,1380,130,4306,0]Ao[1379,13,1380,1380,4027,4306,0]Ao[3995,13,3996,3746,3339,4306,0]Ao[3995,13,3996,3746,4994,4306,0]Ao[3995,13,3996,3746,4832,4306,0]Ao[3995,13,3996,2467,2421,4306,0]Ao[3995,13,3996,2467,4309,4306,0]An[3995,13,3996,1061,484,4306,0]Ao[3995,13,3996,1061,4450,4306,0]Ao[3995,13,3996,4131,4443,4306,0]Ao[3995,13,3996,4131,3179,4306,0]Ao[3995,13,3996,4131,3366,4306,0]Ao[3995,13,3996,4131,4442,4306,0]Ao[3995,13,3996,4136,3384,4306,0]Ao[3995,13,3996,4136,4216,4306,0]Al[3995,13,3996,0,1618,4306,0]Al[3995,13,3996,0,4991,4306,0]Al[3995,13,3996,0,1601,4306,0]Al[3995,13,3996,0,2457,4306,0]Al[3995,13,3996,0,3345,4306,0]Al[3995,13,3996,0,3176,4306,0]Al[3995,13,3996,0,4542,4306,0]Al[3995,13,3996,0,2037,4306,0]Al[3995,13,3996,0,4168,4306,0]Al[3995,13,3996,0,4538,4306,0]Al[3995,13,3996,0,4561,4306,0]Al[3995,13,3996,0,4856,4306,0]Al[3995,13,3996,0,4871,4306,0]Al[3995,13,3996,0,4040,4306,0]Al[3995,13,3996,0,4419,4306,0]Al[3995,13,3996,0,4210,4306,0]Al[3995,13,3996,0,5048,4306,0]Al[3995,13,3996,0,4162,4306,0]Al[3995,13,3996,0,4030,4306,0]Al[3995,13,3996,0,3159,4306,0]Al[3995,13,3996,0,4535,4306,0]Al[3995,13,3996,0,4728,4306,0]Al[3995,13,3996,0,4174,4306,0]Al[3995,13,3996,0,4177,4306,0]Al[3995,13,3996,0,4182,4306,0]Al[3995,13,3996,0,4890,4306,0]Al[3995,13,3996,0,3348,4306,0]Ak[3995,13,3996,0,491,4306,0]Ak[3995,13,3996,0,122,4306,0]Al[3995,13,3996,0,2444,4306,0]Ak[3995,13,3741,0,116,4306,0]Al[3995,13,3741,0,3146,4306,0]Al[3995,13,3741,0,1342,4306,0]Al[3995,13,3741,0,4035,4306,0]Al[3995,13,3741,0,2010,4306,0]Al[3995,13,3741,0,4326,4306,0]Al[3995,13,1941,0,4987,4306,0]Al[3995,13,1941,0,1355,4306,0]Ao[4784,13,4785,1978,1619,4306,0]Ao[4784,13,4785,1978,4992,4306,0]Ao[4784,13,4785,3204,4833,4306,0]Ao[4784,13,4785,1542,1602,4306,0]Ao[4784,13,4785,1542,4206,4306,0]Ao[4784,13,4785,1542,3360,4306,0]Ao[4784,13,4785,1542,3175,4306,0]Ao[4784,13,4785,1542,4831,4306,0]Ao[4784,13,4785,1542,4887,4306,0]Ao[4784,13,4785,1542,3335,4306,0]Ao[4784,13,4785,1557,2458,4306,0]Ao[4784,13,4785,1557,3346,4306,0]Ao[4784,13,4785,1557,3177,4306,0]Ao[4784,13,4785,1557,4543,4306,0]Ao[4784,13,4785,1087,3180,4306,0]Ao[4784,13,4785,1087,4334,4306,0]Ao[4784,13,4785,1092,2038,4306,0]Ao[4784,13,4785,1092,3385,4306,0]Ao[4784,13,4785,1092,4039,4306,0]Ao[4784,13,4785,2171,4444,4306,0]Ao[4784,13,4785,2171,4172,4306,0]Ao[4784,13,4785,3747,4539,4306,0]Ao[4784,13,4785,3747,3172,4306,0]Ao[4784,13,4785,3747,4410,4306,0]Ao[4784,13,4785,3747,5077,4306,0]Ao[4784,13,4785,3322,4562,4306,0]Ao[4784,13,4785,3322,4857,4306,0]Ao[4784,13,4785,3322,4872,4306,0]Ao[4784,13,4785,3322,4041,4306,0]Ao[4784,13,4785,1859,4420,4306,0]Ao[4784,13,4785,1859,4212,4306,0]Ao[4784,13,4785,1859,5049,4306,0]Ao[4784,13,4785,1859,4164,4306,0]Ao[4784,13,4785,1859,4031,4306,0]Ao[4784,13,4785,1532,3160,4306,0]Ao[4784,13,4785,1532,3352,4306,0]Ao[4784,13,4785,1532,3374,4306,0]Ao[4784,13,4785,1532,4179,4306,0]Ao[4784,13,4785,1532,4537,4306,0]Ao[4784,13,4785,1532,4730,4306,0]Ao[4784,13,4785,1532,2415,4306,0]Ao[4784,13,4785,2468,4734,4306,0]Ao[4784,13,4785,2468,4175,4306,0]Ao[4784,13,4785,1924,4551,4306,0]Ao[4784,13,4785,1924,5080,4306,0]Ao[4784,13,4785,1924,2428,4306,0]Ao[4784,13,4785,1924,4829,4306,0]Ao[4784,13,4785,1952,4178,4306,0]Ao[4784,13,4785,1952,4183,4306,0]Al[4784,13,4785,0,4448,4306,0]Al[4784,13,4785,0,4891,4306,0]Ao[4784,13,4785,4347,3349,4306,0]Ao[4784,13,4785,4347,5175,4306,0]An[4784,13,4785,4785,492,4306,0]An[4784,13,4785,4785,123,4306,0]Ao[4784,13,4785,4785,2445,4306,0]Ao[4784,13,4785,4785,3158,4306,0]Ao[4784,13,1857,1857,4340,4306,0]Ao[4784,13,5033,5033,4932,4306,0]Ao[4784,13,5033,5033,1357,4306,0]Ao[4784,13,1942,1942,4988,4306,0]Al[4784,13,1942,0,1356,4306,0]Am[4784,13,3742,138,117,4306,0]An[4784,13,3742,138,3147,4306,0]Ao[4784,13,3742,1528,1343,4306,0]Ao[4784,13,3742,1528,4036,4306,0]Ao[4784,13,3742,2516,2011,4306,0]Ao[4784,13,3742,2516,4327,4306,0]Ao[4784,13,2142,2142,1361,4306,0]Ao[4484,13,4485,4485,2442,4306,0]Ao[4484,13,4485,4485,2456,4306,0]Ao[4484,13,4485,4485,4184,4306,0]Ao[1062,13,1063,1063,4926,4306,0]Ao[1062,13,1558,1558,4547,4306,0]Ah[3995,7,3996,2163,0,0,0]Ai[3995,13,3996,0,4419,0,0]Al[4784,13,4785,1859,4420,0,0]Ai[3995,12,1861,0,3169,0,0]Al[4784,12,1862,1862,3170,0,0]Al[4484,14,4485,4485,2442,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]10Ae[1062,7,1063,0,0,0,0]Al[3995,13,3996,2467,2421,0,0]Ae[4350,7,4351,0,0,0,0]Ae[1379,7,1380,0,0,0,0]Al[4784,13,4785,3747,3340,0,0]Al[3995,13,3996,3746,3339,0,0]1Al[4784,13,4785,2171,4444,0,0]Al[1379,13,1556,1556,1375,0,0]Al[1379,14,1556,1556,4058,0,0]Al[3995,12,3996,2163,2022,0,0]Ao[3995,13,3996,1569,4217,2022,0]Ao[3995,13,3996,1104,4053,2022,0]Ai[3995,12,1861,0,2023,0,0]Al[3995,13,1941,0,3379,2023,0]Al[4784,12,1862,1862,2024,0,0]Ao[4784,13,1942,1942,3380,2024,0]Ah[3995,5,3996,1061,0,0,0]Ai[3995,15,3996,0,3159,0,0]Ah[3995,5,3996,1532,0,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[4784,5,4785,1532,0,0,0]Ai[3995,15,3996,0,4538,0,0]Al[4784,15,4785,3747,4539,0,0]Ah[4784,5,4785,2468,0,0,0]Al[4784,15,4785,3747,1360,0,0]Ai[3995,15,3996,0,4174,0,0]Al[4784,15,4785,2468,4175,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]32Al[4784,15,4785,3747,3172,0,0]><><><21Ah[3995,5,1941,1942,0,0,0]Ae[4784,5,1942,0,0,0,0]10Ah[3995,5,3996,4922,0,0,0]Ah[4784,5,4785,4922,0,0,0]Al[4784,15,2142,2142,1358,0,0]Al[4784,15,4785,1542,4831,0,0]6Al[4784,15,4785,1924,4551,0,0]Ai[3995,12,3996,0,2450,0,0]Al[3995,13,3996,0,4300,2450,0]Al[3995,13,3996,0,4194,2450,0]Al[4784,12,4785,1568,2451,0,0]Ao[4784,13,4785,4571,4301,2451,0]Ao[4784,13,4785,1568,4195,2451,0]Ae[4064,7,4065,0,0,0,0]Al[3995,13,3996,3746,3339,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]32An[1379,13,1380,1380,130,4421,0]Ao[1062,13,1063,1063,3149,4421,0]An[1062,13,1851,1851,131,4421,0]An[1062,13,1947,1947,132,4421,0]An[4015,13,4016,4016,121,4421,0]Ao[4015,13,4016,4016,2412,4421,0]Ab[4784,3,0,0,0,0,0]Ak[4484,13,4485,399,4449,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0];:Al[3995,13,3996,2467,2421,0,0]Al[4784,13,4785,2468,2422,0,0]?>32Ae[4350,7,4351,0,0,0,0]5Al[1062,14,1063,1063,3149,0,0]60Ae[1379,7,1380,0,0,0,0]Ai[3995,13,3996,0,4210,0,0]Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4212,0,0]Al[4784,13,4785,1859,4164,0,0]Ai[3995,14,3996,0,4210,0,0]Al[4784,14,4785,1859,4212,0,0]53Al[3995,13,3996,4136,3370,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Ai[3995,15,3996,0,4538,0,0]Al[4784,15,4785,1542,4831,0,0]Al[4784,15,4785,3747,4539,0,0]Ai[3995,10,3741,3742,0,0,0]Af[4784,10,3742,0,0,0,0]Ah[3995,5,3741,3742,0,0,0]Ae[4784,5,3742,0,0,0,0]Ai[3995,10,1861,1862,0,0,0]Af[4784,10,1862,0,0,0,0]Ai[3995,15,3996,0,4174,0,0]Al[4784,15,4785,2468,4175,0,0]Ai[3995,10,3996,3747,0,0,0]Ai[4784,10,4785,3747,0,0,0]Ah[4784,6,4785,1924,0,0,0]Ah[4784,6,4785,1542,0,0,0]Ah[3995,6,3996,3746,0,0,0]Ah[4784,6,4785,3204,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]10Al[3995,15,3996,3746,4832,0,0]Al[4784,15,4785,3204,4833,0,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,14,4785,1557,3177,0,0]Ai[3995,14,3741,0,4820,0,0]Al[4784,14,3742,3742,4821,0,0]Al[3995,13,3996,3746,3339,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]10Al[4784,13,4785,3204,3152,0,0]Al[3995,13,3996,2467,2421,0,0]Al[4784,13,4785,2468,2422,0,0]Ab[4851,3,0,0,0,0,0]Ao[1062,13,1063,1063,4926,3184,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Ah[3995,5,3996,3322,0,0,0]Ah[4784,5,4785,3322,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]54Ai[4784,10,4785,1924,0,0,0]Al[4784,15,4785,3747,1360,0,0]7600Al[4784,15,4785,1087,4334,0,0]4365Al[4784,15,2142,2142,1358,0,0]Ae[1062,9,1063,0,0,0,0]:9Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]<;<;Ah[4784,6,4785,1542,0,0,0]21Ae[3995,5,3996,0,0,0,0]Ae[4784,5,4785,0,0,0,0]Ai[3995,15,3996,0,4174,0,0]Ah[3995,5,1861,1862,0,0,0]Al[4784,15,4785,2468,4175,0,0]Al[4784,15,4785,1924,4829,0,0]Ae[4784,5,1862,0,0,0,0]An[1379,13,1380,1380,130,4411,0]Ao[1062,13,1063,1063,3149,4411,0]An[1062,13,1851,1851,131,4411,0]An[1062,13,1947,1947,132,4411,0]An[4015,13,4016,4016,121,4411,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]Ai[3995,13,3996,0,1618,0,0]Al[4784,13,4785,1978,1619,0,0]Al[3995,14,3996,2467,4309,0,0]Al[3995,13,3996,3746,4994,0,0]Ai[3995,13,3996,0,4419,0,0]Al[4784,13,4785,1859,4420,0,0]Ai[3995,13,3996,0,4300,0,0]Al[4784,13,4785,4571,4301,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]7Al[4784,13,4785,3747,3340,0,0]Al[3995,13,3996,3746,3339,0,0]0176Ao[4064,13,4065,4065,5081,4885,0]Ai[3995,13,3996,0,4552,0,0]Al[4784,13,4785,1083,4553,0,0]Ae[1062,6,1063,0,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]10Al[4784,15,4785,3747,3172,0,0]Ae[4784,5,5033,0,0,0,0]Ah[3995,5,3996,4131,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Al[4784,15,2142,2142,1358,0,0]Al[3995,14,3996,2467,4309,0,0]Ak[3995,13,3996,0,491,3140,0]Ak[3995,13,3996,0,122,3140,0]An[4784,13,4785,4785,492,3140,0]An[4784,13,4785,4785,123,3140,0]Ao[4015,13,4016,4016,2412,3375,0]Ai[3995,13,3996,0,4871,0,0]Al[4784,13,4785,3322,4872,0,0]Ai[3995,12,1861,0,2023,0,0]Al[3995,13,1941,0,3379,2023,0]Al[4784,12,1862,1862,2024,0,0]Ao[4784,13,1942,1942,3380,2024,0]Al[3995,13,3996,3746,3339,0,0]Ai[3995,12,3996,0,4826,0,0]Al[4784,12,4785,3747,4827,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]Ai[3995,14,3996,0,3176,0,0]Al[4784,14,4785,1557,3177,0,0]Ai[3995,12,3741,0,3341,0,0]Ak[3995,13,3741,0,116,3341,0]Al[3995,13,3741,0,1342,3341,0]Al[3995,13,3741,0,2010,3341,0]Al[4784,12,3742,3742,3342,0,0]Am[4784,13,3742,138,117,3342,0]Ao[4784,13,3742,1528,1343,3342,0]Ao[4784,13,3742,2516,2011,3342,0]Al[3995,14,3996,2467,4309,0,0]Al[4784,13,4785,2171,2031,0,0]Ah[4784,2,4345,4135,0,0,0]Ae[1379,7,1380,0,0,0,0]==Ak[3995,13,3996,1061,484,0,0]Ak[4484,13,4485,399,4449,0,0]032Ai[3995,12,1861,0,2023,0,0]Al[3995,13,1941,0,3379,2023,0]Ae[4784,2,4785,0,0,0,0]Al[4784,12,1862,1862,2024,0,0]Ao[4784,13,1942,1942,3380,2024,0]Ai[3995,10,3996,4347,0,0,0]Ai[4784,10,4785,4347,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ai[3995,15,3996,0,4174,0,0]Al[4784,15,4785,2468,4175,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Ah[3995,5,3996,1859,0,0,0]Ah[4784,5,4785,1859,0,0,0]Ai[3995,12,1861,0,3169,0,0]Al[4784,12,1862,1862,3170,0,0]Al[3995,13,3996,2467,2421,0,0]Al[4784,13,4785,3747,3340,0,0]Al[4784,13,4785,2468,2422,0,0]Al[4784,13,4785,4785,3158,0,0]Ai[3995,13,3741,0,4326,0,0]Al[4784,13,3742,2516,4327,0,0]Al[3995,13,3996,2163,3182,0,0]0Al[3995,13,3996,3746,3339,0,0]6Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]Al[1062,14,1063,1063,3149,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Al[4784,15,2142,2142,1358,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]10Al[4784,15,4785,1542,4887,0,0]Al[4784,15,4785,3747,3172,0,0]Al[4784,15,4785,3747,4410,0,0]Ah[4784,5,4785,3747,0,0,0]Ai[3995,15,3996,0,3159,0,0]Al[4784,15,4785,1532,3160,0,0]Ah[4784,5,4785,1924,0,0,0]Ae[4064,5,4065,0,0,0,0]Al[1062,13,1063,1063,3149,0,0]Al[3995,13,3996,3746,3339,0,0]Ai[3995,12,1861,0,2023,0,0]Al[3995,13,1941,0,3379,2023,0]Al[4784,12,1862,1862,2024,0,0]Ao[4784,13,1942,1942,3380,2024,0]Ah[4784,7,4967,4966,0,0,0]0Al[4784,13,4785,3747,3340,0,0]6Ak[3995,13,3996,1061,484,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]Ao[4064,13,4065,4065,5081,4885,0]0Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4164,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]10Ai[3995,13,3996,0,4856,0,0]Al[4784,13,4785,3322,4857,0,0]Am[1379,13,1380,1380,130,466,0]An[1062,13,1063,1063,3149,466,0]Am[1062,13,1851,1851,131,466,0]Am[1062,13,1947,1947,132,466,0]Am[4015,13,4016,4016,121,466,0]??>An[1379,13,1380,1380,130,4421,0]Ao[1062,13,1063,1063,3149,4421,0]An[1062,13,1851,1851,131,4421,0]An[1062,13,1947,1947,132,4421,0]An[4015,13,4016,4016,121,4421,0]Ao[4015,13,4016,4016,2412,4421,0]Ai[3995,13,3996,0,4210,0,0]Al[4784,13,4785,1859,4212,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]Al[4784,15,4785,1542,4831,0,0]Ae[1062,5,4269,0,0,0,0]0Ai[3995,13,3996,0,4419,0,0]Al[4784,13,4785,1859,4420,0,0]Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4164,0,0]Al[3995,13,3996,2467,2421,0,0]Al[3995,13,3996,2494,2425,0,0]Al[4784,13,4785,2468,2426,0,0]Al[4784,13,4785,3747,3340,0,0]Ao[4064,13,4065,4065,5081,4885,0]<;Ah[3995,5,1861,1862,0,0,0]Ae[4784,5,1862,0,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]10Al[3995,13,3996,3746,3339,0,0]8Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]Ae[4064,7,4065,0,0,0,0]Ae[4350,7,4351,0,0,0,0]Ai[3995,14,3996,0,3345,0,0]Al[4784,14,4785,1557,3346,0,0]Al[3995,13,3996,2467,2421,0,0]?Af[4784,18,4785,0,0,0,0]Al[4784,15,4785,1542,4831,0,0]9Ai[3995,13,3996,0,4210,0,0]Al[4784,13,4785,1859,4212,0,0]:97Al[4784,13,4785,3747,3340,0,0]Ai[3995,13,3996,0,4162,0,0]Al[4784,13,4785,1859,4164,0,0]Ah[4784,5,4785,4347,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ai[3995,19,3996,0,4890,0,0]Ai[4784,19,4785,0,4891,0,0]4Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]10An[1379,13,1380,1380,130,4421,0]Ao[1062,13,1063,1063,3149,4421,0]An[1062,13,1851,1851,131,4421,0]An[1062,13,1947,1947,132,4421,0]An[4015,13,4016,4016,121,4421,0]Ao[4015,13,4016,4016,2412,4421,0]Al[4784,13,4785,4785,3158,0,0]Ae[1379,7,1380,0,0,0,0]98Al[3995,13,3996,3746,3339,0,0]Al[4784,13,4785,3747,3340,0,0]Ai[3995,13,3741,0,3341,0,0]Al[3995,13,3741,0,1342,3341,0]Al[4784,13,3742,3742,3342,0,0]Ao[4784,13,3742,1528,1343,3342,0]Ae[4350,7,4351,0,0,0,0]655Ah[4784,5,4785,1924,0,0,0]Ai[3995,15,1941,0,1355,0,0]Ai[4784,15,1942,0,1356,0,0]Ai[3995,13,3996,0,4561,0,0]Al[4784,13,4785,3322,4562,0,0]10Ai[3995,14,1941,0,4311,0,0]Al[4784,14,1942,1942,4312,0,0]732=Ao[4015,13,4016,4016,2412,3375,0]43>434343>=>=Al[4784,14,5033,5033,4932,0,0]54Ai[4784,18,4785,3322,0,0,0]")
\ No newline at end of file
diff --git a/pr/427/docs/search.index/function/3b76c2b6c848.js b/pr/427/docs/search.index/function/57da575069cd.js
similarity index 97%
rename from pr/427/docs/search.index/function/3b76c2b6c848.js
rename to pr/427/docs/search.index/function/57da575069cd.js
index 1b484b890..23174054a 100644
--- a/pr/427/docs/search.index/function/3b76c2b6c848.js
+++ b/pr/427/docs/search.index/function/57da575069cd.js
@@ -1 +1 @@
-rd_("Bf[\"{{{AIEh{AOGf}}{AIEh{AOGf}}}CNj}\",[]]Bf[\"{{{AIEh{BEL`}}{AIEh{BEL`}}}CNj}\",[]]Bd[\"{{{AIEh{CLh}}{AIEh{CLh}}}CNj}\",[]]Bf[\"{{{AIEh{BBLd}}{AIEh{BBLd}}}CNj}\",[]]Bf[\"{{{AIEh{BBKf}}{AIEh{BBKf}}}CNj}\",[]]Bf[\"{{{AIEh{AHMf}}{AIEh{AHMf}}}CNj}\",[]]Bf[\"{{{AIEh{AJDl}}{AIEh{AJDl}}}CNj}\",[]]Bf[\"{{{AIEh{BBKd}}{AIEh{BBKd}}}CNj}\",[]]Bf[\"{{{AIEh{AJG`}}{AIEh{AJG`}}}CNj}\",[]]Bf[\"{{{AIEh{B@O`}}{AIEh{B@O`}}}CNj}\",[]]Bd[\"{{{AIEh{LJd}}{AIEh{LJd}}}CNj}\",[]]Bf[\"{{{AIEh{BFOn}}{AIEh{BFOn}}}CNj}\",[]]Bd[\"{{{AIEh{JGd}}{AIEh{JGd}}}CNj}\",[]]Bd[\"{{{AIEh{LHb}}{AIEh{LHb}}}CNj}\",[]]Bf[\"{{{AIEh{ACCb}}{AIEh{ACCb}}}CNj}\",[]]Bf[\"{{{AIEh{AHM`}}{AIEh{AHM`}}}CNj}\",[]]Bd[\"{{{AIEh{ONj}}{AIEh{ONj}}}CNj}\",[]]Bf[\"{{{AIEh{B@I`}}{AIEh{B@I`}}}CNj}\",[]]Bf[\"{{{AIEh{BCGd}}{AIEh{BCGd}}}CNj}\",[]]Bf[\"{{{AIEh{AOI`}}{AIEh{AOI`}}}CNj}\",[]]Bf[\"{{{AIEh{AOGl}}{AIEh{AOGl}}}CNj}\",[]]Bf[\"{{{AIEh{AHJn}}{AIEh{AHJn}}}CNj}\",[]]Bf[\"{{{AIEh{BCFn}}{AIEh{BCFn}}}CNj}\",[]]Bf[\"{{{AIEh{BDO`}}{AIEh{BDO`}}}CNj}\",[]]Bf[\"{{{AIEh{B@Il}}{AIEh{B@Il}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jb}}{AIEh{B@Jb}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jl}}{AIEh{B@Jl}}}CNj}\",[]]Bf[\"{{{AIEh{BFCd}}{AIEh{BFCd}}}CNj}\",[]]Bd[\"{{{AIEh{CMf}}{AIEh{CMf}}}CNj}\",[]]Bb[\"{{{AIEh{Od}}{AIEh{Od}}}CNj}\",[]]Bf[\"{{{AIEh{ACAh}}{AIEh{ACAh}}}CNj}\",[]]Bf[\"{{{AIEh{BHBh}}{AIEh{BHBh}}}CNj}\",[]]Bd[\"{{{AIEh{JIf}}{AIEh{JIf}}}CNj}\",[]]Bd[\"{{{AIEh{LJf}}{AIEh{LJf}}}CNj}\",[]]Bf[\"{{{AIEh{BG@`}}{AIEh{BG@`}}}CNj}\",[]]Bd[\"{{{AIEh{JGf}}{AIEh{JGf}}}CNj}\",[]]Bf[\"{{{AIEh{BELb}}{AIEh{BELb}}}CNj}\",[]]Bd[\"{{{AIEh{LHd}}{AIEh{LHd}}}CNj}\",[]]Bf[\"{{{AIEh{AJD`}}{AIEh{AJD`}}}CNj}\",[]]Bf[\"{{{AIEh{AHLn}}{AIEh{AHLn}}}CNj}\",[]]Bf[\"{{{AIEh{BEKn}}{AIEh{BEKn}}}CNj}\",[]]Bf[\"{{{AIEh{BFBn}}{AIEh{BFBn}}}CNj}\",[]]Bf[\"{{{AIEh{AJ@n}}{AIEh{AJ@n}}}CNj}\",[]]Bf[\"{{{AIEh{ACCd}}{AIEh{ACCd}}}CNj}\",[]]Bf[\"{{{AIEh{AHMb}}{AIEh{AHMb}}}CNj}\",[]]Bf[\"{{{AIEh{AHMh}}{AIEh{AHMh}}}CNj}\",[]]Bf[\"{{{AIEh{BAMl}}{AIEh{BAMl}}}CNj}\",[]]Bd[\"{{{AIEh{ONl}}{AIEh{ONl}}}CNj}\",[]]Bf[\"{{{AIEh{AJGb}}{AIEh{AJGb}}}CNj}\",[]]Bf[\"{{{AIEh{AOHn}}{AIEh{AOHn}}}CNj}\",[]]Bf[\"{{{AIEh{AOKb}}{AIEh{AOKb}}}CNj}\",[]]Bf[\"{{{AIEh{BBKh}}{AIEh{BBKh}}}CNj}\",[]]Bf[\"{{{AIEh{B@Ih}}{AIEh{B@Ih}}}CNj}\",[]]Bf[\"{{{AIEh{BCGf}}{AIEh{BCGf}}}CNj}\",[]]Bf[\"{{{AIEh{AHLh}}{AIEh{AHLh}}}CNj}\",[]]Bf[\"{{{AIEh{BBGd}}{AIEh{BBGd}}}CNj}\",[]]Bf[\"{{{AIEh{AOIb}}{AIEh{AOIb}}}CNj}\",[]]Bf[\"{{{AIEh{AOGn}}{AIEh{AOGn}}}CNj}\",[]]Bf[\"{{{AIEh{AHK`}}{AIEh{AHK`}}}CNj}\",[]]Bf[\"{{{AIEh{BBIb}}{AIEh{BBIb}}}CNj}\",[]]Bf[\"{{{AIEh{AJC`}}{AIEh{AJC`}}}CNj}\",[]]Bf[\"{{{AIEh{AJEl}}{AIEh{AJEl}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jf}}{AIEh{B@Jf}}}CNj}\",[]]Bf[\"{{{AIEh{BCGb}}{AIEh{BCGb}}}CNj}\",[]]Bf[\"{{{AIEh{BDOd}}{AIEh{BDOd}}}CNj}\",[]]Bf[\"{{{AIEh{BDOl}}{AIEh{BDOl}}}CNj}\",[]]Bf[\"{{{AIEh{B@In}}{AIEh{B@In}}}CNj}\",[]]Bf[\"{{{AIEh{ABOh}}{AIEh{ABOh}}}CNj}\",[]]Bf[\"{{{AIEh{BEKj}}{AIEh{BEKj}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jd}}{AIEh{B@Jd}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jn}}{AIEh{B@Jn}}}CNj}\",[]]Bf[\"{{{AIEh{BBL`}}{AIEh{BBL`}}}CNj}\",[]]Bf[\"{{{AIEh{BFCf}}{AIEh{BFCf}}}CNj}\",[]]Bd[\"{{{AIEh{CMh}}{AIEh{CMh}}}CNj}\",[]]Bb[\"{{{AIEh{Of}}{AIEh{Of}}}CNj}\",[]]Bf[\"{{{AIEh{ACAj}}{AIEh{ACAj}}}CNj}\",[]]Bf[\"{{{AIEh{AHJl}}{AIEh{AHJl}}}CNj}\",[]]Bf[\"{{{AIEh{BANh}}{AIEh{BANh}}}CNj}\",[]]Bf[\"{{{AIEh{BFHh}}{AIEh{BFHh}}}CNj}\",[]]Bd[\"{{{AIEh{JIj}}{AIEh{JIj}}}CNj}\",[]]Bf[\"{{{AIEh{BHBj}}{AIEh{BHBj}}}CNj}\",[]]Bd[\"{{{AIEh{JIh}}{AIEh{JIh}}}CNj}\",[]]Bf[\"{{{AIEh{B@K`}}{AIEh{B@K`}}}CNj}\",[]]Ai[\"{{{AIEh{CLh}}}LHb}\",[]]Aj[\"{{{AIEh{BBLd}}}LHb}\",[]]Ak[\"{{{AIEh{AJDh}}}ACAh}\",[]]Ak[\"{{{AIEh{BFHj}}}ACAh}\",[]]Ak[\"{{{AIEh{AJEd}}}ACAh}\",[]]o[\"{LGfLHd}\",[]]A`[\"{AHHbLHd}\",[]]A`[\"{AHJdLHd}\",[]]A`[\"{B@MfLHd}\",[]]A`[\"{B@LhLHd}\",[]]Aa[\"{AC@lACAj}\",[]]Aa[\"{ACChACAj}\",[]]Aa[\"{ABNnACAj}\",[]]A`[\"{OMbACAj}\",[]]n[\"{{}OLj}\",[]]A`[\"{CL`ABOh}\",[]]Be[\"{{{AIEh{LJd}}{AIEh{LJd}}}AC@j}\",[]]Be[\"{{{AIEh{LHb}}{AIEh{LHb}}}AC@j}\",[]]Bg[\"{{{AIEh{AOI`}}{AIEh{AOI`}}}AC@j}\",[]]Bg[\"{{{AIEh{B@Jb}}{AIEh{B@Jb}}}AC@j}\",[]]Be[\"{{{AIEh{CMf}}{AIEh{CMf}}}AC@j}\",[]]Bc[\"{{{AIEh{Od}}{AIEh{Od}}}AC@j}\",[]]Bg[\"{{{AIEh{ACAh}}{AIEh{ACAh}}}AC@j}\",[]]Be[\"{{{AIEh{LJf}}{AIEh{LJf}}}AC@j}\",[]]Bg[\"{{{AIEh{BELb}}{AIEh{BELb}}}AC@j}\",[]]Be[\"{{{AIEh{LHd}}{AIEh{LHd}}}AC@j}\",[]]Bg[\"{{{AIEh{AHMh}}{AIEh{AHMh}}}AC@j}\",[]]Bg[\"{{{AIEh{BAMl}}{AIEh{BAMl}}}AC@j}\",[]]Bg[\"{{{AIEh{AJGb}}{AIEh{AJGb}}}AC@j}\",[]]Bg[\"{{{AIEh{AOIb}}{AIEh{AOIb}}}AC@j}\",[]]Bg[\"{{{AIEh{BDOl}}{AIEh{BDOl}}}AC@j}\",[]]Bg[\"{{{AIEh{BEKj}}{AIEh{BEKj}}}AC@j}\",[]]Bg[\"{{{AIEh{B@Jd}}{AIEh{B@Jd}}}AC@j}\",[]]Be[\"{{{AIEh{CMh}}{AIEh{CMh}}}AC@j}\",[]]Bc[\"{{{AIEh{Of}}{AIEh{Of}}}AC@j}\",[]]Bg[\"{{{AIEh{ACAj}}{AIEh{ACAj}}}AC@j}\",[]]o[\"{ACAhOd}\",[]]o[\"{ACAjOf}\",[]]n[\"{LGhOf}\",[]]o[\"{AHHnOf}\",[]]A`[\"{ACBlLGn}\",[]]A`[\"{ACBnLGn}\",[]]A`[\"{ACAdLGn}\",[]]A`[\"{ACC`LGn}\",[]]Bh[\"{{{AIEh{A@d}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOGf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBKj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BGKb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJAb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJAf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BG@d}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEL`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ABNj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BAJj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ABOb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJDn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BBI`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{CLh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBLd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJDh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFHj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBKf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AHMf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJDl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BBKd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@Ob}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOJj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJEd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJG`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@O`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{OMf}}{AIEh{CCbAHJj}}}LHf}\",[]]Cd[\"{{{AIEh{LJd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BFOn}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Cd[\"{{{AIEh{JGd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{LHb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{ACCb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AJBb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AHM`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BCGl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{ONj}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{B@I`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BCGd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BCI`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BCJb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BEO`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BF@n}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AOI`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BBHf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{B@Nd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BGG`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{B@Hd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AOGl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{AHJn}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BCFn}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BDO`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{B@Il}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{B@Jb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{B@Jl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BFCd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{AJBh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BEBn}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{CMf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cc[\"{{{AIEh{Od}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{ACAh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{ACBl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cc[\"{{{AIEh{Nh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AHId}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{JGl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AOHf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{OKd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BALl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BEJh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BHBh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AOHb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BFCl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BFOf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Cd[\"{{{AIEh{JIf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Bi[\"{{{AIEh{AJAh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ABNl}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{LJf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BG@`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{JGf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BELb}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{LHd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@Ml}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJD`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHLn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEKn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFBn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJ@n}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ACCd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJBd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHMb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BCGn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHMh}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BAMl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{ONl}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJGb}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AOHn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AOKb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBKh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@Ih}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BCGf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AHLh}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BBGd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BGJj}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{JJ`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BCIb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BCJd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEOb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFA`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOIb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBHh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@Nh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BGGb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@Hh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOGn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AHK`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BBIb}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJC`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJEl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@Jf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BCGb}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BDOd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ABMn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BDOl}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ABOd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@In}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AOGb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJE`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BAMb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BCHn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BGK`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ABOh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEKj}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BCGj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BAJh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@Jd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@Jn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBL`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BFCf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJBj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BHFn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEC`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{CMh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bg[\"{{{AIEh{Of}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ACAj}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ACBn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHJl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BANh}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BFHh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{JIj}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BHBj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOHd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFDb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFOh}}{AIEh{CCbAHJj}}}LHf}\",[]]0Cd[\"{{{AIEh{JIh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Bg[\"{{{AIEh{Nj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHIf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{JGn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOHh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{OKf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BALn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEJj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{JIl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{JJb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBLb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ACAd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ACC`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@K`}}{AIEh{CCbAHJj}}}LHf}\",[]]Ak[\"{{{AIEh{B@Ml}}}ABNf}\",[]]A`[\"{ACCbCJ`}\",[]]A`[\"{ACCdCJ`}\",[]]Aj[\"{{{AIEh{BAMb}}}LDf}\",[]]A`[\"{BGK`CJ`}\",[]]o[\"{CL`CJ`}\",[]]A`[\"{ACAdLDf}\",[]]Ce[\"{{{AIEh{CCbBGG`}}{Nf{ACBd}}}{{AIEh{CCbBGG`}}}}\",[]]Ce[\"{{{AIEh{CCbBGGb}}{Nf{ACBf}}}{{AIEh{CCbBGGb}}}}\",[]]8Af[\"{{ABNfCJ`}BBKj}\",[]]Ag[\"{{}{{Nf{BGKb}}}}\",[]]Ae[\"{{LDfCIn}BAIh}\",[]]Cd[\"{{BBHf{LGn{B@Nd}}AHMn{Nf{OLl}}}{{LHj{ABNj}}}}\",[]]Ah[\"{{{Nn{JLd}}}AJDb}\",[]]A`[\"{OLdBCI`}\",[]]Ah[\"{{{Nf{OJb}}}BBHf}\",[]]Bc[\"{{{Nf{B@Nf}}{Nf{BEJl}}}B@Nd}\",[]]Ai[\"{{{Nf{B@Hf}}}B@Hd}\",[]]B`[\"{{{AIEh{{LB`{Mn}}}}}B@Jb}\",[]]Ae[\"{{CInLDf}BEBn}\",[]]Ag[\"{{CMfOdCJ`}ACAh}\",[]]Aj[\"{{{Nf{AHId}}CIl}Nh}\",[]]An[\"{{{Nf{AOHf}}OJhCIl}JGl}\",[]]An[\"{{{Nf{BALl}}OJhCIl}OKd}\",[]]Ae[\"{{LDfCIn}BAIj}\",[]]Ah[\"{{{Nn{JLd}}}AJDd}\",[]]Bm[\"{{{Nf{BBHh}}{LGn{{Nf{B@Nh}}}}CNj}ABNl}\",[]]A`[\"{LDfBHJ`}\",[]]o[\"{{}BHFd}\",[]]A`[\"{OLdBCIb}\",[]]Ah[\"{{{Nf{OJd}}}BBHh}\",[]]Bc[\"{{{Nf{B@Nj}}{Nf{BEJn}}}B@Nh}\",[]]Ai[\"{{{Nf{B@Hj}}}B@Hh}\",[]]Ek[\"{{ABMd{AIEh{c}}{AIEh{{LB`{CIn}}}}CNj}{{LHh{{LDd{BAMb{LGn{ABMd}}}}BEKj}}}{BEOlJKl}}\",[\"\"]]B`[\"{{{AIEh{{LB`{Mn}}}}}B@Jd}\",[]]Af[\"{{BFCfLJ`}BBL`}\",[]]A`[\"{LDfBHFn}\",[]]Ae[\"{{CInLDf}BEC`}\",[]]Ag[\"{{CMhOfCJ`}ACAj}\",[]]Aj[\"{{{Nf{AHIf}}CIl}Nj}\",[]]An[\"{{{Nf{AOHh}}OJhCIl}JGn}\",[]]An[\"{{{Nf{BALn}}OJhCIl}OKf}\",[]]Aj[\"{AJFn{{LHj{BBLb}}}}\",[]]Ai[\"{{{Nf{BEBh}}}BH@l}\",[]]Ai[\"{{{Nf{BEBl}}}BH@n}\",[]]o[\"{CMfCMf}\",[]]o[\"{CMhCMh}\",[]]Ak[\"{{{AIEh{AJFb}}}AJF`}\",[]]Ai[\"{{{AIEh{OLl}}}OJh}\",[]]0Aj[\"{{{AIEh{B@Ob}}}OJh}\",[]]Ak[\"{{{AIEh{BANd}}}AJF`}\",[]]Ak[\"{{{AIEh{AJFd}}}AJF`}\",[]]Ak[\"{{{AIEh{BANf}}}AJF`}\",[]]Bg[\"{{{AIEh{AJAf}}LHb}{{LGn{ABNf}}}}\",[]]Aa[\"{AHM`ABNf}\",[]]Bg[\"{{{AIEh{AJAh}}LHd}{{LGn{ABNf}}}}\",[]]Aa[\"{AHMbABNf}\",[]]Ah[\"{A@f{{LHl{HKh}}}}\",[]]Ah[\"{A@h{{LHl{HKh}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Aa[\"{B@LhAJEj}\",[]]Aa[\"{ACAdAJEj}\",[]]Aa[\"{BBL`BFCf}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]A`[\"{ABMnJGb}\",[]]Am[\"{{{AIEh{CCbAC@f}}}HKh}\",[]]Am[\"{{{AIEh{CCbABOb}}}HKh}\",[]]Al[\"{{{AIEh{CCbCLh}}}HKh}\",[]]Am[\"{{{AIEh{CCbBBLd}}}HKh}\",[]]Am[\"{{{AIEh{CCbAJDh}}}HKh}\",[]]Am[\"{{{AIEh{CCbAJEd}}}HKh}\",[]]Al[\"{{{AIEh{CCbLEn}}}HKh}\",[]]A`[\"{cc{}}\",[\"T\"]]000000000000000000000Aa[\"{BCGdBEL`}\",[]]1111111111Aa[\"{AHMfBBKf}\",[]]22Aa[\"{AJDlAHMf}\",[]]Aa[\"{BCGdAHMf}\",[]]Aa[\"{BCGdAJDl}\",[]]55Aa[\"{AHMfBBKd}\",[]]666Aa[\"{B@O`AJG`}\",[]]Aa[\"{BCGdAJG`}\",[]]Aa[\"{B@I`AJG`}\",[]]9Aa[\"{BCGdB@O`}\",[]]:::::::n[\"{MnLJd}\",[]]A`[\"{ACAhLJd}\",[]]A`[\"{BFCdLJd}\",[]]=o[\"{CIlLJd}\",[]]o[\"{CInLJd}\",[]]??Al[\"{cLHb{{CKj{CIn}}}}\",[\"T\"]]A`[\"{cc{}}\",[\"T\"]]0000000A`[\"{JGjBCGd}\",[]]Aa[\"{AOGjBCGd}\",[]]A`[\"{JIbBCGd}\",[]]3333A`[\"{LJdAOI`}\",[]]44444Aa[\"{BFOnAOGl}\",[]]5Aa[\"{BCJfAOGl}\",[]]66A`[\"{JIbBCFn}\",[]]7Aa[\"{BFClB@Il}\",[]]888A`[\"{LJdBFCd}\",[]]99999A`[\"{LJdACAh}\",[]]::::::::::::Aa[\"{AOKhAOHb}\",[]];;;;;;;A`[\"{BCIjJIf}\",[]]A`[\"{BHBfJIf}\",[]]A`[\"{BHChJIf}\",[]]A`[\"{AJCfJIf}\",[]]A`[\"{BBJfJIf}\",[]]A`[\"{BEB`JIf}\",[]]A`[\"{BBIdJIf}\",[]]A`[\"{BDOfJIf}\",[]]A`[\"{BE@hJIf}\",[]]A`[\"{BCH`JIf}\",[]]A`[\"{cc{}}\",[\"T\"]]A`[\"{BGMfJIf}\",[]]1111111111111111A`[\"{BFCfLJf}\",[]]n[\"{MnLJf}\",[]]3o[\"{CInLJf}\",[]]o[\"{CIlLJf}\",[]]A`[\"{ACAjLJf}\",[]]666Al[\"{cLHd{{CKj{CIn}}}}\",[\"T\"]]77777777777777777777Aa[\"{BBL`BCGf}\",[]]8888A`[\"{AHLnJJ`}\",[]]99999A`[\"{LJfAOIb}\",[]]::::Aa[\"{BG@`AOGn}\",[]];Aa[\"{BCJfAOGn}\",[]]<<<<>>>>>Aa[\"{BANhBEKj}\",[]]??????A`[\"{JIjBBL`}\",[]]A`[\"{LJfBFCf}\",[]]A`[\"{cc{}}\",[\"T\"]]00000A`[\"{LJfACAj}\",[]]111111A`[\"{BANhJIj}\",[]]222Aa[\"{AOKhAOHd}\",[]]3333333A`[\"{BE@hJIh}\",[]]A`[\"{BCH`JIh}\",[]]A`[\"{BGMfJIh}\",[]]A`[\"{BHChJIh}\",[]]A`[\"{BDOfJIh}\",[]]A`[\"{BCIjJIh}\",[]]9A`[\"{BEB`JIh}\",[]]A`[\"{BBJfJIh}\",[]]A`[\"{BBIdJIh}\",[]]A`[\"{AJCfJIh}\",[]]A`[\"{BHBfJIh}\",[]]>>>>>>>>>An[\"{{{AIEh{c}}}AJFnCJf}\",[\"S\"]]????????????????Bm[\"{{{AIEh{LJd}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bk[\"{{{AIEh{LHb}}{AIEh{CCbc}}}HKhLG`}\",[\"H\"]]Bn[\"{{{AIEh{AOI`}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{B@Jb}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bm[\"{{{AIEh{CMf}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bl[\"{{{AIEh{Od}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{ACAh}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bm[\"{{{AIEh{LJf}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{BELb}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bk[\"{{{AIEh{LHd}}{AIEh{CCbc}}}HKhLG`}\",[\"H\"]]Bn[\"{{{AIEh{AHMh}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{BAMl}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{AJGb}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{AOIb}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{BDOl}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{BEKj}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{B@Jd}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bm[\"{{{AIEh{CMh}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bl[\"{{{AIEh{Of}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{ACAj}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{AHJl}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Aa[\"{{}c{}}\",[\"U\"]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000n[\"{{}HKh}\",[]]0000Cc[\"{{{AIEh{CCbLEn}}LDf}{{LHh{{LGn{JGf}}AHMh}}}}\",[]]El[\"{{{AIEh{OHj}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{{AIEh{CCb{LB`{Mn}}}}AOHb}}}}\",[]]Bh[\"{{{AIEh{CCbOMn}}Of}{{LGn{ACAj}}}}\",[]]El[\"{{{AIEh{OHl}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{{AIEh{CCb{LB`{Mn}}}}AOHd}}}}\",[]]Bf[\"{{{AIEh{AJAf}}LHb}{{LGn{CLh}}}}\",[]]Bf[\"{{{AIEh{CLh}}}{{LHh{HKhAJ@h}}}}\",[]]A`[\"{AJBbCJ`}\",[]]Am[\"{{{AIEh{CCbAJAh}}}HKh}\",[]]A`[\"{AJBdCJ`}\",[]]Ck[\"{{{A@l{{AIEh{CCbAJ@`}}}}{AIEh{CCbOIf}}}{{CM`{HKh}}}}\",[]]Dk[\"{{{A@l{{AIEh{CCbBCJl}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbAC@f}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbAC@h}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbAJAb}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dj[\"{{{A@l{{AIEh{CCbOKj}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dj[\"{{{A@l{{AIEh{CCbLGd}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbAHHf}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbABMb}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbB@Md}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbB@Mn}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dj[\"{{{A@l{{AIEh{CCbLDn}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbBBI`}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dj[\"{{{A@l{{AIEh{CCbOMf}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Bf[\"{{{AIEh{CCbAJAh}}}{{LGn{JJ`}}}}\",[]]De[\"{{{AIEh{CCbAJDh}}{AIEh{CCb{LB`{Mn}}}}}{{LHh{{LGn{LDf}}AHMf}}}}\",[]]Bm[\"{{{AIEh{CCbAJDj}}CNj}{{LHh{LEnBAMl}}}}\",[]]Bo[\"{{CMh{AIEh{CCbc}}}{{LHh{BFHhJIj}}}O`}\",[\"R\"]]Bf[\"{{{AIEh{CCbAHJ`}}}{{LGn{JGb}}}}\",[]]Ec[\"{{{AIEh{BBLb}}AJFn{AIEh{CCb{LB`{AJBl}}}}{AIEh{CCb{LB`{ACAd}}}}}{{LHj{LDf}}}}\",[]]Dk[\"{{{AIEh{OHj}}{AIEh{CCb{AAb{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAOHb}}}}\",[]]Dk[\"{{{AIEh{OHl}}{AIEh{CCb{AAb{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAOHd}}}}\",[]]C`[\"{{{AIEh{CCbAHJ`}}JGbCNj}{{LHh{HKhBELb}}}}\",[]]Cc[\"{{{AIEh{BBLb}}AJFn{AIEh{ACC`}}}{{LHj{HKh}}}}\",[]]Bn[\"{{{AIEh{CCbBGG`}}CIn}{{AIEh{CCbBGG`}}}}\",[]]Bn[\"{{{AIEh{CCbBGGb}}CIn}{{AIEh{CCbBGGb}}}}\",[]]Aj[\"{{{AIEh{AJAf}}}CMf}\",[]]Aj[\"{{{AIEh{AJAh}}}CMh}\",[]]Cn[\"{{{AIEh{OJb}}{AIEh{{LB`{Mn}}}}{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]Cn[\"{{{AIEh{OJd}}{AIEh{{LB`{Mn}}}}{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]A`[\"{BBKjCJ`}\",[]]A`[\"{ACBlLDf}\",[]]A`[\"{ACBnLDf}\",[]]o[\"{JKhCNj}\",[]]Bm[\"{{{AIEh{CCbAJDh}}LJd}{{LHh{HKhB@I`}}}}\",[]]Bm[\"{{{AIEh{CCbBFHj}}LJd}{{LHh{HKhB@I`}}}}\",[]]Bm[\"{{{AIEh{CCbAJDj}}LJf}{{LHh{HKhB@Ih}}}}\",[]]Bn[\"{{{AIEh{AJFj}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{BBJb}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{BEBn}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{AJFl}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{BBJd}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{BEC`}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Aa[\"{{}c{}}\",[\"V\"]]00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bg[\"{{{Nf{BEJd}}OJhCIl}{{Nn{AJAj}}}}\",[]]Bg[\"{{{Nf{AHId}}OJhCIl}{{Nn{AJAj}}}}\",[]]Bg[\"{{{Nf{AOHf}}OJhCIl}{{Nn{AJAj}}}}\",[]]Bg[\"{{{Nf{BALl}}OJhCIl}{{Nn{AJAj}}}}\",[]]Bg[\"{{{Nf{BEJf}}OJhCIl}{{Nn{AJAl}}}}\",[]]Bg[\"{{{Nf{AHIf}}OJhCIl}{{Nn{AJAl}}}}\",[]]Bg[\"{{{Nf{AOHh}}OJhCIl}{{Nn{AJAl}}}}\",[]]Bg[\"{{{Nf{BALn}}OJhCIl}{{Nn{AJAl}}}}\",[]]Ai[\"{BFGl{{Nf{BEJf}}}}\",[]]o[\"{JGdJGb}\",[]]A`[\"{ACCbCJ`}\",[]]o[\"{ONjLDf}\",[]]o[\"{JGfJGb}\",[]]A`[\"{ACCdCJ`}\",[]]o[\"{ONlLDf}\",[]]Aa[\"{AOGbBCGf}\",[]]Ai[\"{{{AIEh{A@d}}}A@d}\",[]]Ak[\"{{{AIEh{AOGf}}}AOGf}\",[]]Ak[\"{{{AIEh{AJAf}}}AJAf}\",[]]Ak[\"{{{AIEh{BG@d}}}BG@d}\",[]]Ak[\"{{{AIEh{BEL`}}}BEL`}\",[]]Ak[\"{{{AIEh{ABNj}}}ABNj}\",[]]Ak[\"{{{AIEh{BAJj}}}BAJj}\",[]]Ai[\"{{{AIEh{CLh}}}CLh}\",[]]Ak[\"{{{AIEh{BBLd}}}BBLd}\",[]]Ak[\"{{{AIEh{BBKf}}}BBKf}\",[]]Ak[\"{{{AIEh{AHMf}}}AHMf}\",[]]Ak[\"{{{AIEh{AJDl}}}AJDl}\",[]]Ak[\"{{{AIEh{BBKd}}}BBKd}\",[]]Ak[\"{{{AIEh{AJG`}}}AJG`}\",[]]Ak[\"{{{AIEh{B@O`}}}B@O`}\",[]]Ai[\"{{{AIEh{LJd}}}LJd}\",[]]Ak[\"{{{AIEh{BFOn}}}BFOn}\",[]]Ai[\"{{{AIEh{LHb}}}LHb}\",[]]Ak[\"{{{AIEh{ACCb}}}ACCb}\",[]]Ak[\"{{{AIEh{AJBb}}}AJBb}\",[]]Ak[\"{{{AIEh{AHM`}}}AHM`}\",[]]Ak[\"{{{AIEh{BCGl}}}BCGl}\",[]]Ai[\"{{{AIEh{ONj}}}ONj}\",[]]Ak[\"{{{AIEh{B@I`}}}B@I`}\",[]]Ak[\"{{{AIEh{BCGd}}}BCGd}\",[]]Ak[\"{{{AIEh{BCJb}}}BCJb}\",[]]Ak[\"{{{AIEh{BEO`}}}BEO`}\",[]]Ak[\"{{{AIEh{BF@n}}}BF@n}\",[]]Ak[\"{{{AIEh{AOI`}}}AOI`}\",[]]Ak[\"{{{AIEh{BBHf}}}BBHf}\",[]]Ak[\"{{{AIEh{B@Nd}}}B@Nd}\",[]]Ak[\"{{{AIEh{BGG`}}}BGG`}\",[]]Ak[\"{{{AIEh{B@Hd}}}B@Hd}\",[]]Ak[\"{{{AIEh{AOGl}}}AOGl}\",[]]Ak[\"{{{AIEh{AHJn}}}AHJn}\",[]]Ak[\"{{{AIEh{BCFn}}}BCFn}\",[]]Ak[\"{{{AIEh{BDO`}}}BDO`}\",[]]Ak[\"{{{AIEh{B@Il}}}B@Il}\",[]]Ak[\"{{{AIEh{B@Jb}}}B@Jb}\",[]]Ak[\"{{{AIEh{B@Jl}}}B@Jl}\",[]]Ak[\"{{{AIEh{BFCd}}}BFCd}\",[]]Ak[\"{{{AIEh{AJBh}}}AJBh}\",[]]Ai[\"{{{AIEh{CMf}}}CMf}\",[]]Ag[\"{{{AIEh{Od}}}Od}\",[]]Ak[\"{{{AIEh{ACAh}}}ACAh}\",[]]Ag[\"{{{AIEh{Nh}}}Nh}\",[]]Ak[\"{{{AIEh{AHId}}}AHId}\",[]]Ai[\"{{{AIEh{JGl}}}JGl}\",[]]Ak[\"{{{AIEh{AOHf}}}AOHf}\",[]]Ai[\"{{{AIEh{OKd}}}OKd}\",[]]Ak[\"{{{AIEh{BALl}}}BALl}\",[]]Ak[\"{{{AIEh{BFOf}}}BFOf}\",[]]Ai[\"{{{AIEh{JIf}}}JIf}\",[]]Ai[\"{{{AIEh{LJf}}}LJf}\",[]]Ak[\"{{{AIEh{BG@`}}}BG@`}\",[]]Ak[\"{{{AIEh{BELb}}}BELb}\",[]]Ai[\"{{{AIEh{LHd}}}LHd}\",[]]Ak[\"{{{AIEh{B@Ml}}}B@Ml}\",[]]Ak[\"{{{AIEh{AJD`}}}AJD`}\",[]]Ak[\"{{{AIEh{AHLn}}}AHLn}\",[]]Ak[\"{{{AIEh{BEKn}}}BEKn}\",[]]Ak[\"{{{AIEh{BFBn}}}BFBn}\",[]]Ak[\"{{{AIEh{AJ@n}}}AJ@n}\",[]]Ak[\"{{{AIEh{ACCd}}}ACCd}\",[]]Ak[\"{{{AIEh{AJBd}}}AJBd}\",[]]Ak[\"{{{AIEh{AHMb}}}AHMb}\",[]]Ak[\"{{{AIEh{BCGn}}}BCGn}\",[]]Ak[\"{{{AIEh{AHMh}}}AHMh}\",[]]Ak[\"{{{AIEh{BAMl}}}BAMl}\",[]]Ai[\"{{{AIEh{ONl}}}ONl}\",[]]Ak[\"{{{AIEh{AJGb}}}AJGb}\",[]]Ak[\"{{{AIEh{AOHn}}}AOHn}\",[]]Ak[\"{{{AIEh{BBKh}}}BBKh}\",[]]Ak[\"{{{AIEh{B@Ih}}}B@Ih}\",[]]Ak[\"{{{AIEh{BCGf}}}BCGf}\",[]]Ak[\"{{{AIEh{AHLh}}}AHLh}\",[]]Ak[\"{{{AIEh{BBGd}}}BBGd}\",[]]Ak[\"{{{AIEh{BGJj}}}BGJj}\",[]]Ak[\"{{{AIEh{BCJd}}}BCJd}\",[]]Ak[\"{{{AIEh{BEOb}}}BEOb}\",[]]Ak[\"{{{AIEh{BFA`}}}BFA`}\",[]]Ak[\"{{{AIEh{AOIb}}}AOIb}\",[]]Ak[\"{{{AIEh{BBHh}}}BBHh}\",[]]Ak[\"{{{AIEh{B@Nh}}}B@Nh}\",[]]Ak[\"{{{AIEh{BGGb}}}BGGb}\",[]]Ak[\"{{{AIEh{B@Hh}}}B@Hh}\",[]]Ak[\"{{{AIEh{AOGn}}}AOGn}\",[]]Ak[\"{{{AIEh{AHK`}}}AHK`}\",[]]Ak[\"{{{AIEh{AJC`}}}AJC`}\",[]]Ak[\"{{{AIEh{AJEl}}}AJEl}\",[]]Ak[\"{{{AIEh{B@Jf}}}B@Jf}\",[]]Ak[\"{{{AIEh{BCGb}}}BCGb}\",[]]Ak[\"{{{AIEh{BDOd}}}BDOd}\",[]]Ak[\"{{{AIEh{ABMn}}}ABMn}\",[]]Ak[\"{{{AIEh{BDOl}}}BDOl}\",[]]Ak[\"{{{AIEh{B@In}}}B@In}\",[]]Ak[\"{{{AIEh{BCHn}}}BCHn}\",[]]Ak[\"{{{AIEh{BGK`}}}BGK`}\",[]]Ak[\"{{{AIEh{ABOh}}}ABOh}\",[]]Ak[\"{{{AIEh{BEKj}}}BEKj}\",[]]Ak[\"{{{AIEh{B@Jd}}}B@Jd}\",[]]Ak[\"{{{AIEh{B@Jn}}}B@Jn}\",[]]Ak[\"{{{AIEh{BBL`}}}BBL`}\",[]]Ak[\"{{{AIEh{BFCf}}}BFCf}\",[]]Ak[\"{{{AIEh{AJBj}}}AJBj}\",[]]Ak[\"{{{AIEh{BHFn}}}BHFn}\",[]]Ai[\"{{{AIEh{CMh}}}CMh}\",[]]Ag[\"{{{AIEh{Of}}}Of}\",[]]Ak[\"{{{AIEh{ACAj}}}ACAj}\",[]]Ak[\"{{{AIEh{AHJl}}}AHJl}\",[]]Ak[\"{{{AIEh{BANh}}}BANh}\",[]]Ak[\"{{{AIEh{BFHh}}}BFHh}\",[]]Ai[\"{{{AIEh{JIj}}}JIj}\",[]]Ak[\"{{{AIEh{BFOh}}}BFOh}\",[]]Ai[\"{{{AIEh{JIh}}}JIh}\",[]]Ag[\"{{{AIEh{Nj}}}Nj}\",[]]Ak[\"{{{AIEh{AHIf}}}AHIf}\",[]]Ai[\"{{{AIEh{JGn}}}JGn}\",[]]Ak[\"{{{AIEh{AOHh}}}AOHh}\",[]]Ai[\"{{{AIEh{OKf}}}OKf}\",[]]Ak[\"{{{AIEh{BALn}}}BALn}\",[]]Ai[\"{{{AIEh{JJb}}}JJb}\",[]]Ak[\"{{{AIEh{ACAd}}}ACAd}\",[]]Ak[\"{{{AIEh{ACC`}}}ACC`}\",[]]Ak[\"{{{AIEh{B@K`}}}B@K`}\",[]]Ak[\"{{{AIEh{BFGl}}}BFGl}\",[]]Ak[\"{{{AIEh{BCHf}}}BCHf}\",[]]Bn[\"{{{AIEh{AJAf}}LJd{AIEh{{LB`{Mn}}}}}HKh}\",[]]Bn[\"{{{AIEh{ABNj}}LJd{AIEh{{LB`{Mn}}}}}HKh}\",[]]Bf[\"{{{AIEh{CLh}}}{{LHh{HKhBBGb}}}}\",[]]Bf[\"{{{AIEh{CCbAJAh}}OJhLJfJGb}HKh}\",[]]Bj[\"{{{AIEh{B@Jb}}}{{AIEh{{LB`{Mn}}}}}}\",[]]Bj[\"{{{AIEh{B@Jd}}}{{AIEh{{LB`{Mn}}}}}}\",[]]Aa[\"{BBL`AJC`}\",[]]A`[\"{ACAhCJ`}\",[]]A`[\"{ACAjCJ`}\",[]]A`[\"{B@JlCNj}\",[]]A`[\"{B@JnCNj}\",[]]l[\"{OJj}\",[]]l[\"{OJl}\",[]]Ce[\"{{{AIEh{BEOl}}{AIEh{CCbO`}}}{{LHh{B@JdBEKj}}}}\",[]]Ce[\"{{{AIEh{BHJ`}}{AIEh{CCbO`}}}{{LHh{B@JdBEKj}}}}\",[]]Bc[\"{{{AIEh{AJAh}}}{{AAb{LHd}}}}\",[]]Bd[\"{{{AIEh{JKn}}{AIEh{CIj}}}HKh}\",[]]Am[\"{{{AIEh{AOGh}}LDf}HKh}\",[]]Ai[\"{{{AIEh{JL`}}}HKh}\",[]]Bg[\"{{{A@l{{AIEh{CCbAJ@`}}}}OJh}HKh}\",[]]Bm[\"{{{AIEh{CCbAJEd}}LJd}{{LHh{HKhB@I`}}}}\",[]]Bm[\"{{{AIEh{CCbAJEf}}LJf}{{LHh{HKhB@Ih}}}}\",[]]Am[\"{ABOb{{LHh{HKhAJDn}}}}\",[]]Dc[\"{{{AIEh{CCbABNl}}ABOd{AIEh{CCb{AAb{Mn}}}}}{{LHh{ACBnAJE`}}}}\",[]]Bi[\"{{{AIEh{OLl}}{A@l{{Nn{LFn}}}}}HKh}\",[]]Bj[\"{{{AIEh{B@Ob}}{A@l{{Nn{LFn}}}}}HKh}\",[]]Bj[\"{{{AIEh{AOJj}}{A@l{{Nn{LFn}}}}}HKh}\",[]]o[\"{A@dCNj}\",[]]Ak[\"{{{AIEh{AJAf}}}BCGl}\",[]]Ak[\"{{{AIEh{ABNj}}}BAJj}\",[]]Aj[\"{{{AIEh{CLh}}}AHM`}\",[]]An[\"{{{AIEh{CCbAJAh}}}BCGn}\",[]]Ce[\"{{{AIEh{CCbAJDb}}{LGn{LJ`}}}{{AIEh{CCbAJDb}}}}\",[]]Ce[\"{{{AIEh{CCbAJDd}}{LGn{LJ`}}}{{AIEh{CCbAJDd}}}}\",[]]Ck[\"{{{AIEh{CCbAJEd}}{AIEh{{LB`{Mn}}}}}{{LHh{LDfAJG`}}}}\",[]]Ck[\"{{{AIEh{CCbAJEf}}{AIEh{{LB`{Mn}}}}}{{LHh{LDfAJGb}}}}\",[]]Bl[\"{{{AIEh{BFHh}}{AIEh{CCbc}}}HKhLEl}\",[\"W\"]]Aj[\"{{{AIEh{ABNj}}}LDn}\",[]]An[\"{ABOb{{LHh{AJAbBCGd}}}}\",[]]Bh[\"{{{AIEh{CCbOMn}}Of}{{LGn{ACAj}}}}\",[]]Fh[\"{{{AIEh{CCbABNl}}ABOdOJh{AIEh{CCb{AAb{Mn}}}}{LGn{{Nf{B@Nh}}}}}{{LHh{{LDd{BDOlAJAh}}{Nn{AOGb}}}}}}\",[]]Am[\"{AIEh{{AIEh{c}}}{}}\",[\"T\"]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000o[\"{ONjLDf}\",[]]o[\"{ONlLDf}\",[]]A`[\"{A@dAOGf}\",[]]Bc[\"{{AJEjBBG`A@d}{{LHl{AOGh}}}}\",[]]Aj[\"{AJEj{{LHj{ABNj}}}}\",[]]B`[\"{{}{{LHh{HKh{Nn{JHh}}}}}}\",[]]Ak[\"{{{AIEh{AJAf}}}BCGd}\",[]]Be[\"{{{AIEh{ABNl}}}{{AIEh{BBHh}}}}\",[]]o[\"{MnBFCd}\",[]]A`[\"{AJBbCJ`}\",[]]o[\"{B@NdNf}\",[]]o[\"{MnBFCf}\",[]]A`[\"{AJBdCJ`}\",[]]o[\"{B@NhNf}\",[]]A`[\"{BBL`LGn}\",[]]Bl[\"{{{AIEh{CCbc}}}{{LHh{LJdBANh}}}O`}\",[\"B\"]]Bl[\"{{{AIEh{CCbc}}}{{LHh{LHbBANh}}}O`}\",[\"B\"]]Bm[\"{{{AIEh{CCbc}}}{{LHh{AHJnBANh}}}O`}\",[\"B\"]]Bm[\"{{{AIEh{CCbc}}}{{LHh{BFCdBANh}}}O`}\",[\"B\"]]Bm[\"{{{AIEh{CCbc}}}{{LHh{ACAhBANh}}}O`}\",[\"B\"]]Bh[\"{{{AIEh{CCbc}}}{{LI`{LJf}}}O`}\",[\"B\"]]Bh[\"{{{AIEh{CCbc}}}{{LI`{LHd}}}O`}\",[\"B\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{AHK`}}}O`}\",[\"B\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{AJC`}}}O`}\",[\"B\"]]Ek[\"{{{AIEh{CCb{LFl{ABMd}}}}{AIEh{c}}{AIEh{{LB`{CIn}}}}CNj}{{LHh{BCHnBEKj}}}{BEOlJKl}}\",[\"\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{BFCf}}}O`}\",[\"B\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{ACAj}}}O`}\",[\"B\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{AHJb}}}O`}\",[\"B\"]]A`[\"{ACAdLGn}\",[]]Bk[\"{{{AIEh{LJd}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bk[\"{{{AIEh{LHb}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{AHJn}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{BFCd}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{ACAh}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bk[\"{{{AIEh{LJf}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bk[\"{{{AIEh{LHd}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{AHK`}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{AJC`}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{ABMn}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{BFCf}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{ACAj}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{AHJh}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bj[\"{{{AIEh{CCbAJEd}}}{{LHh{HKhB@I`}}}}\",[]]Bj[\"{{{AIEh{CCbAJEf}}}{{LHh{HKhAOHn}}}}\",[]]An[\"{{{AIEh{AOKf}}ABNf}HKh}\",[]]Ea[\"{{{AIEh{CCbABNl}}OJhAHJl{LGn{B@Jn}}ABMd{AIEh{CCb{AAb{Mn}}}}}{{LGn{BAJf}}}}\",[]]o[\"{CKlOJj}\",[]]o[\"{CKnOJl}\",[]]A`[\"{ABObHKh}\",[]]Ba[\"{{{AIEh{CCbABNl}}ABOd}HKh}\",[]]Bh[\"{{{AIEh{AJFj}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{BBJb}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{BEBn}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{AJFl}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{BBJd}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{BEC`}}{AIEh{CIj}}JGb}HKh}\",[]]A`[\"{AHIjCNj}\",[]]o[\"{JGdCJ`}\",[]]o[\"{JGfCJ`}\",[]]Ce[\"{{{AIEh{CCbAJAj}}OJhOJhCJ`CNj{AIEh{B@Mj}}}HKh}\",[]]Cc[\"{{{AIEh{CCbNh}}OJhOJhCJ`CNj{AIEh{B@Mj}}}HKh}\",[]]Cd[\"{{{AIEh{CCbJGl}}OJhOJhCJ`CNj{AIEh{B@Mj}}}HKh}\",[]]Cd[\"{{{AIEh{CCbOKd}}OJhOJhCJ`CNj{AIEh{B@Mj}}}HKh}\",[]]Ce[\"{{{AIEh{CCbAJAl}}OJhOJhCJ`CNj{AIEh{B@Ml}}}HKh}\",[]]Cc[\"{{{AIEh{CCbNj}}OJhOJhCJ`CNj{AIEh{B@Ml}}}HKh}\",[]]Cd[\"{{{AIEh{CCbJGn}}OJhOJhCJ`CNj{AIEh{B@Ml}}}HKh}\",[]]Cd[\"{{{AIEh{CCbOKf}}OJhOJhCJ`CNj{AIEh{B@Ml}}}HKh}\",[]]o[\"{CKlOJj}\",[]]o[\"{CKnOJl}\",[]]o[\"{BEChMn}\",[]]A`[\"{BCFnJGb}\",[]]A`[\"{BDO`JGb}\",[]]A`[\"{BCGbJGb}\",[]]A`[\"{BDOdJGb}\",[]]A`[\"{BBL`LJ`}\",[]]Aa[\"{BBGhBCGf}\",[]]Aa[\"{AHHbBEKn}\",[]]Bg[\"{{{AIEh{ABNj}}AHMn}{{LHj{HKh}}}}\",[]]A`[\"{ABObHKh}\",[]]Cf[\"{{{AIEh{CCbABNl}}ABOd{AIEh{CCb{AAb{Mn}}}}}ACBn}\",[]]l[\"{OJj}\",[]]Aa[\"{AHJlAJEj}\",[]]l[\"{OJl}\",[]]An[\"{{ABNhA@d}{{LHl{HKh}}}}\",[]]B`[\"{{B@NdAJEj}{{LHj{ABNj}}}}\",[]]Bb[\"{B@Nb{{LHh{HKh{Nn{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BEL`}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BBKf}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{AHMf}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{AJDl}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BBKd}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{AJG`}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{B@O`}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BCGd}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BCGf}}}{{LGn{{AIEh{JHh}}}}}}\",[]]A`[\"{ACBlLGn}\",[]]A`[\"{ACBnLGn}\",[]]A`[\"{ACC`LGn}\",[]]Bg[\"{{{AIEh{CLh}}}{{LHh{AJCnAJ@h}}}}\",[]]Aa[\"{B@MfAJD`}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]A`[\"{ACAdLDf}\",[]]Aa[\"{AHM`ACCb}\",[]]Aa[\"{BCGlACCb}\",[]]Aa[\"{AHMbACCd}\",[]]Aa[\"{BCGnACCd}\",[]]3210Dh[\"{{{AIEh{OJb}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAOHb}}}}\",[]]Dh[\"{{{AIEh{OJd}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAOHd}}}}\",[]]Aj[\"{{{AIEh{AJAj}}}CJ`}\",[]]Ah[\"{{{AIEh{Nh}}}CJ`}\",[]]Ai[\"{{{AIEh{JGl}}}CJ`}\",[]]Ai[\"{{{AIEh{OKd}}}CJ`}\",[]]Aj[\"{{{AIEh{AJAl}}}CJ`}\",[]]Ah[\"{{{AIEh{Nj}}}CJ`}\",[]]Ai[\"{{{AIEh{JGn}}}CJ`}\",[]]Ai[\"{{{AIEh{OKf}}}CJ`}\",[]]Aj[\"{{{AIEh{BGEn}}}LDf}\",[]]Aj[\"{{{AIEh{BGF`}}}LDf}\",[]]Aj[\"{{{AIEh{BHFd}}}LDf}\",[]]Aj[\"{{{AIEh{BHFn}}}LDf}\",[]]o[\"{A@dLDf}\",[]]n[\"{{}OId}\",[]]0000o[\"{ObABMh}\",[]]Ba[\"{{AIEh{AIEh{c}}}AC@j{}}\",[\"K\"]]0000000000000000000Cg[\"{{{AIEh{ABNj}}AJEj{AIEh{CIj}}}{{LHh{AJAbB@Il}}}}\",[]]Dl[\"{{{AIEh{CCbABNl}}OJhB@HhAJEj{AIEh{CIj}}}{{LHh{{LDd{BDOlAJAh}}B@In}}}}\",[]]Dm[\"{{{AIEh{AHLb}}LHbCJ`{AIEh{{LB`{Mn}}}}{AIEh{CCbABMd}}}{{LHh{HKhAOHb}}}}\",[]]Ca[\"{{{AIEh{AHKd}}LDf{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]Dm[\"{{{AIEh{AHLd}}LHdCJ`{AIEh{{LB`{Mn}}}}{AIEh{CCbABMd}}}{{LHh{HKhAOHd}}}}\",[]]Ca[\"{{{AIEh{AHKf}}LDf{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]o[\"{{}AOKd}\",[]]n[\"{{}JKn}\",[]]o[\"{{}AOGh}\",[]]o[\"{{}BAIh}\",[]]o[\"{{}BAJj}\",[]]n[\"{{}LJd}\",[]]n[\"{{}LHb}\",[]]o[\"{{}ACCb}\",[]]o[\"{{}AJBb}\",[]]o[\"{{}AHM`}\",[]]o[\"{{}BCGl}\",[]]n[\"{{}ONj}\",[]]o[\"{{}B@I`}\",[]]o[\"{{}BCJb}\",[]]o[\"{{}BEO`}\",[]]o[\"{{}BF@n}\",[]]o[\"{{}AOI`}\",[]]o[\"{{}BBHf}\",[]]o[\"{{}BGG`}\",[]]o[\"{{}BEBn}\",[]]o[\"{{}AHId}\",[]]o[\"{{}AOHf}\",[]]o[\"{{}BALl}\",[]]o[\"{{}BEJh}\",[]]o[\"{{}BAIj}\",[]]o[\"{{}BHFd}\",[]]n[\"{{}LJf}\",[]]n[\"{{}LHd}\",[]]o[\"{{}AJD`}\",[]]o[\"{{}AJ@n}\",[]]o[\"{{}ACCd}\",[]]o[\"{{}AJBd}\",[]]o[\"{{}AHMb}\",[]]o[\"{{}BCGn}\",[]]n[\"{{}ONl}\",[]]o[\"{{}BBKh}\",[]]o[\"{{}B@Ih}\",[]]o[\"{{}BCJd}\",[]]o[\"{{}BEOb}\",[]]o[\"{{}BFA`}\",[]]o[\"{{}AOIb}\",[]]o[\"{{}BBHh}\",[]]o[\"{{}BGGb}\",[]]o[\"{{}BHFn}\",[]]o[\"{{}BEC`}\",[]]o[\"{{}AHIf}\",[]]o[\"{{}AOHh}\",[]]o[\"{{}BALn}\",[]]o[\"{{}BEJj}\",[]]o[\"{{}ACAd}\",[]]n[\"{{}JL`}\",[]]o[\"{{}BCHf}\",[]]o[\"{{}BAJh}\",[]]Ak[\"{{{AIEh{BAMb}}}B@Jd}\",[]]Ak[\"{{{AIEh{BCHn}}}B@Jd}\",[]]Aa[\"{BGK`B@Jd}\",[]]Aa[\"{BFChB@Jd}\",[]]A`[\"{CL`B@Jd}\",[]]A`[\"{JKdB@Jd}\",[]]A`[\"{JKhB@Jd}\",[]]Aa[\"{BEChB@Jd}\",[]]Cg[\"{{{AIEh{AHLb}}LHbCJ`{AIEh{CCb{LB`{Mn}}}}LDf}HKh}\",[]]Ca[\"{{{AIEh{AHKd}}LDf{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]Cg[\"{{{AIEh{AHLd}}LHdCJ`{AIEh{CCb{LB`{Mn}}}}LDf}HKh}\",[]]Ca[\"{{{AIEh{AHKf}}LDf{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]Aj[\"{{{AIEh{AJDh}}}CNj}\",[]]Aj[\"{{{AIEh{BFHj}}}CNj}\",[]]Ak[\"{{{AIEh{AJAj}}}BEJh}\",[]]Ai[\"{{{AIEh{Nh}}}BEJh}\",[]]Aj[\"{{{AIEh{JGl}}}BEJh}\",[]]Aj[\"{{{AIEh{OKd}}}BEJh}\",[]]Ak[\"{{{AIEh{AJAl}}}BEJj}\",[]]Ai[\"{{{AIEh{Nj}}}BEJj}\",[]]Aj[\"{{{AIEh{JGn}}}BEJj}\",[]]Aj[\"{{{AIEh{OKf}}}BEJj}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CIl}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CIl}{{AIEh{CCbBCJd}}}}\",[]]Bf[\"{{{AIEh{CCbAJAj}}OJhCJ`CJ`}HKh}\",[]]Bd[\"{{{AIEh{CCbNh}}OJhCJ`CJ`}HKh}\",[]]Bf[\"{{{AIEh{CCbAJAl}}OJhCJ`CJ`}HKh}\",[]]Bd[\"{{{AIEh{CCbNj}}OJhCJ`CJ`}HKh}\",[]]Aj[\"{{{AIEh{AJAf}}}LGd}\",[]]Bc[\"{{{AIEh{AC@h}}}{{LGn{LHb}}}}\",[]]Aa[\"{BGK`B@Jd}\",[]]Aa[\"{BFChB@Jd}\",[]]A`[\"{CL`B@Jd}\",[]]A`[\"{JKdB@Jd}\",[]]Aa[\"{BEChB@Jd}\",[]]Aj[\"{{{AIEh{AJEd}}}OMf}\",[]]Bn[\"{{{AIEh{AJEf}}}{{LHh{{LGn{LJf}}B@Ih}}}}\",[]]o[\"{A@dLDf}\",[]]o[\"{JKnLDf}\",[]]Am[\"{{{AIEh{CCbAJAh}}}OMn}\",[]]Aj[\"{{{AIEh{AHLb}}}LDf}\",[]]Aj[\"{{{AIEh{AHLd}}}LDf}\",[]]A`[\"{AIEhLJb}\",[]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bd[\"{{{AIEh{BG@d}}}{{LGn{AJAf}}}}\",[]]Bc[\"{{{AIEh{BBLd}}}{{LGn{CLh}}}}\",[]]Bn[\"{{{AIEh{CCbB@Hd}}CIn}{{AIEh{CCbB@Hd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Hh}}CIn}{{AIEh{CCbB@Hh}}}}\",[]]A`[\"{BGK`CIn}\",[]]A`[\"{BFChCIn}\",[]]o[\"{CL`CIn}\",[]]o[\"{JKdCIn}\",[]]A`[\"{AHIjLGn}\",[]]Aa[\"{ACC`AIEh}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Aa[\"{BBKjABNf}\",[]]A`[\"{LEnBBKh}\",[]]Aa[\"{BCGlAJBb}\",[]]Aa[\"{BCGnAJBd}\",[]]10Bg[\"{{{AIEh{CCbc}}LDf}B@Jb{O`JKl}}\",[\"\"]]Bg[\"{{{AIEh{CCbc}}LDf}B@Jd{O`JKl}}\",[\"\"]]o[\"{{}BCI`}\",[]]o[\"{{}BCIb}\",[]]A`[\"{CJ`BHFd}\",[]]Cd[\"{{{AIEh{CIj}}}{{LHl{AOGfc}}}{}}\",[\"FromStr::Err\"]]o[\"{CInLJd}\",[]]o[\"{CInLJf}\",[]]Al[\"{CJ`{{LHh{LJdBFOn}}}}\",[]]Al[\"{CJ`{{LHh{LJfBG@`}}}}\",[]]Aa[\"{BFNhAOH`}\",[]]Aa[\"{BHJbBAKf}\",[]]Aa[\"{BFNjAOH`}\",[]]Aa[\"{BHJdBAKf}\",[]]Af[\"{{}{{LGn{Ab}}}}\",[]]0000Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]Bo[\"{{{AIEh{CCbBF@n}}ABNf}{{AIEh{CCbBF@n}}}}\",[]]Bo[\"{{{AIEh{CCbBFA`}}ABNf}{{AIEh{CCbBFA`}}}}\",[]]Ao[\"{{{Nn{AJAj}}}{{Nn{Nd}}}}\",[]]Am[\"{{{Nn{Nh}}}{{Nn{Nd}}}}\",[]]An[\"{{{Nn{JGl}}}{{Nn{Nd}}}}\",[]]An[\"{{{Nn{OKd}}}{{Nn{Nd}}}}\",[]]Ao[\"{{{Nn{AJAl}}}{{Nn{Nd}}}}\",[]]Am[\"{{{Nn{Nj}}}{{Nn{Nd}}}}\",[]]An[\"{{{Nn{JGn}}}{{Nn{Nd}}}}\",[]]An[\"{{{Nn{OKf}}}{{Nn{Nd}}}}\",[]]Aj[\"{{{AIEh{BG@d}}}CNj}\",[]]Bo[\"{{{AIEh{CCbBGG`}}ABNf}{{AIEh{CCbBGG`}}}}\",[]]Bo[\"{{{AIEh{CCbBGGb}}ABNf}{{AIEh{CCbBGGb}}}}\",[]]Bc[\"{{{AIEh{AJAb}}}{{LGn{LGb}}}}\",[]]Bc[\"{{{AIEh{AJAf}}}{{LGn{LGb}}}}\",[]]Bc[\"{{{AIEh{ABOb}}}{{LGn{LGb}}}}\",[]]Bc[\"{{{AIEh{ABOd}}}{{LGn{LGb}}}}\",[]]A`[\"{AHJlLGn}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bc[\"{{{AIEh{AHJ`}}}{{LGn{LDf}}}}\",[]]Am[\"{{{AIEh{AOKf}}LDf}HKh}\",[]]Aj[\"{{{AIEh{AJAf}}}OKj}\",[]]Bg[\"{{{AIEh{AJEd}}}{{LHh{CAlB@I`}}}}\",[]]Bg[\"{{{AIEh{AJEf}}}{{LHh{CAlB@Ih}}}}\",[]]A`[\"{BAJnLGn}\",[]]A`[\"{BAK`LGn}\",[]]A`[\"{AHIjLGn}\",[]]A`[\"{AOGbLGn}\",[]]Ck[\"{{{AIEh{CCbBBHf}}{LGn{{JLf{Mn}}}}}{{AIEh{CCbBBHf}}}}\",[]]Ck[\"{{{AIEh{CCbBBHh}}{LGn{{JLf{Mn}}}}}{{AIEh{CCbBBHh}}}}\",[]]A`[\"{BEJhLGn}\",[]]A`[\"{BEJjLGn}\",[]]Ac[\"{AIEhc{}}\",[\"T\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Ao[\"{c{{LHh{e}}}{}{}}\",[\"U\",\"T\"]]0000000000000000000000000000000000000000000000Al[\"{CJ`{{LHh{LJdBFOn}}}}\",[]]Al[\"{HKf{{LHh{LJdBFOn}}}}\",[]]Al[\"{LDf{{LHh{LJdBFOn}}}}\",[]]333333333333333Aj[\"{ABNf{{LHh{AOI`}}}}\",[]]4444444Ai[\"{CJ`{{LHh{AHJn}}}}\",[]]555555555555555555555555555Bb[\"{{{Nf{B@H`}}}{{LHh{BEBf}}}}\",[]]Aj[\"{B@H`{{LHh{BEBf}}}}\",[]]7Bb[\"{{{Nf{B@N`}}}{{LHh{BEBj}}}}\",[]]Aj[\"{B@N`{{LHh{BEBj}}}}\",[]]999999999999999999Al[\"{CJ`{{LHh{LJfBG@`}}}}\",[]]Al[\"{LDf{{LHh{LJfBG@`}}}}\",[]]Al[\"{HKf{{LHh{LJfBG@`}}}}\",[]]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Bm[\"{B@H`{{LHh{BEBhc}}}{}}\",[\"TryFrom::Error\"]]Ce[\"{{{Nf{B@H`}}}{{LHh{BEBhc}}}{}}\",[\"TryFrom::Error\"]]Ce[\"{{{Nf{B@N`}}}{{LHh{BEBlc}}}{}}\",[\"TryFrom::Error\"]]Bm[\"{B@N`{{LHh{BEBlc}}}{}}\",[\"TryFrom::Error\"]]Ao[\"{c{{LHh{e}}}{}{}}\",[\"U\",\"T\"]]000000000000000000000000000Aj[\"{{}{{LHh{c}}}{}}\",[\"U\"]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Cd[\"{{{A@l{{AIEh{CCbc}}}}{AIEh{CCbOIf}}}CM`{}}\",[\"F\"]]000000000Cc[\"{{{AIEh{BBLb}}AJFn{AIEh{ACC`}}}{{LHj{HKh}}}}\",[]]Bk[\"{{{AIEh{BGEn}}B@Jb}{{LHh{HKhAJBh}}}}\",[]]Bk[\"{{{AIEh{BGF`}}B@Jd}{{LHh{HKhAJBj}}}}\",[]]0Bk[\"{{{AIEh{BHFd}}B@Jd}{{LHh{HKhAJBj}}}}\",[]]Ak[\"{{{AIEh{AJAf}}}ABMb}\",[]]Bi[\"{{{AIEh{CCbB@Od}}}{{LHh{LJdJId}}}}\",[]]Bi[\"{{{AIEh{CCbB@Od}}}{{LHh{CMfJId}}}}\",[]]Bh[\"{{{AIEh{CCbB@Od}}}{{LHh{OdJId}}}}\",[]]Bj[\"{{{AIEh{CCbB@Od}}}{{LHh{ACAhJId}}}}\",[]]Bf[\"{{{AIEh{CCbB@Od}}}{{LHn{LJf}}}}\",[]]Bf[\"{{{AIEh{CCbB@Od}}}{{LHn{CMh}}}}\",[]]Be[\"{{{AIEh{CCbB@Od}}}{{LHn{Of}}}}\",[]]Bg[\"{{{AIEh{CCbB@Od}}}{{LHn{ACAj}}}}\",[]]Aa[\"{AOGfBFOl}\",[]]Bc[\"{{{AIEh{AJAj}}}{{Nn{AJAj}}}}\",[]]Ba[\"{{{AIEh{Nh}}}{{Nn{AJAj}}}}\",[]]Bb[\"{{{AIEh{JGl}}}{{Nn{AJAj}}}}\",[]]Bb[\"{{{AIEh{OKd}}}{{Nn{AJAj}}}}\",[]]Bc[\"{{{AIEh{AJAl}}}{{Nn{AJAl}}}}\",[]]Ba[\"{{{AIEh{Nj}}}{{Nn{AJAl}}}}\",[]]Bb[\"{{{AIEh{JGn}}}{{Nn{AJAl}}}}\",[]]Bb[\"{{{AIEh{OKf}}}{{Nn{AJAl}}}}\",[]]A`[\"{ACCbCJ`}\",[]]An[\"{{{AIEh{CCbAJAh}}}AHJ`}\",[]]A`[\"{ACCdCJ`}\",[]]C`[\"{{{AIEh{CCbB@Jb}}}{{AIEh{CCb{LB`{Mn}}}}}}\",[]]C`[\"{{{AIEh{CCbB@Jd}}}{{AIEh{CCb{LB`{Mn}}}}}}\",[]]Ah[\"{Mn{{LGn{B@Jl}}}}\",[]]Ah[\"{Mn{{LGn{B@Jn}}}}\",[]]Ah[\"{Mn{{LGn{B@K`}}}}\",[]]A`[\"{ACAhCMf}\",[]]A`[\"{ACAjCMh}\",[]]Bi[\"{AJAb{{LHh{{LDd{AJAfBCJl}}AJAb}}}}\",[]]o[\"{CMfCNj}\",[]]o[\"{CMhCNj}\",[]]Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]21Aj[\"{{{AIEh{ABOb}}}CNj}\",[]]Aj[\"{{{AIEh{ABOd}}}CNj}\",[]]Bn[\"{{{AIEh{CCbB@Nd}}CNj}{{AIEh{CCbB@Nd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nh}}CNj}{{AIEh{CCbB@Nh}}}}\",[]]Bl[\"{{{AIEh{OLl}}OJh}{{A@l{{Nn{AJ@`}}}}}}\",[]]Bm[\"{{{AIEh{B@Ob}}OJh}{{A@l{{Nn{AJ@`}}}}}}\",[]]Bm[\"{{{AIEh{AOJj}}OJh}{{A@l{{Nn{AJ@`}}}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Ak[\"{{{AIEh{AJAf}}}AC@f}\",[]]Bc[\"{{{AIEh{AJAf}}AJEjAJCn}AC@h}\",[]]Ce[\"{{{AIEh{CCbAJAh}}AHJlAJD`OJh}{{LHh{LHdAHLh}}}}\",[]]43Bm[\"{{{AIEh{CCbAJAh}}LHd}{{LHh{HKhAJ@n}}}}\",[]]E`[\"{{{A@l{{AIEh{CCbBDNl}}}}{AIEh{CCbOIf}}}{{CM`{{LGn{c}}}}}{}}\",[\"Stream::Item\"]]E`[\"{{{A@l{{AIEh{CCbAJDh}}}}{AIEh{CCbOIf}}{AIEh{CCbOLf}}}{{CM`{{LHj{HKh}}}}}}\",[]]Ef[\"{{{A@l{{AIEh{CCbAJDh}}}}{AIEh{CCbOIf}}{AIEh{CCb{LB`{Mn}}}}}{{CM`{{LHj{LDf}}}}}}\",[]]Ec[\"{{{AIEh{CCbAJDh}}{AIEh{CCbOIf}}{AIEh{CCb{LB`{Mn}}}}}{{CM`{{LHh{LDfAHMf}}}}}}\",[]]Fg[\"{{{AIEh{CCbBBFn}}{AIEh{CCbOIf}}{AIEh{CCb{LB`{AJBl}}}}{AIEh{CCb{LB`{ACAd}}}}}{{CM`{{LHj{LDf}}}}}}\",[]]Dn[\"{{{A@l{{AIEh{CCbAHMl}}}}{AIEh{ACC`}}{AIEh{CCbOIf}}}{{CM`{{LHj{HKh}}}}}}\",[]];:Cd[\"{{{AIEh{CCbBBHf}}{Nf{OJb}}}{{AIEh{CCbBBHf}}}}\",[]]Cd[\"{{{AIEh{CCbBBHh}}{Nf{OJd}}}{{AIEh{CCbBBHh}}}}\",[]]Cj[\"{{{AIEh{B@Nf}}CInB@Jb{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Cj[\"{{{AIEh{BEBj}}CInB@Jb{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Cj[\"{{{AIEh{B@Nj}}CInB@Jd{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Cj[\"{{{AIEh{BEBl}}CInB@Jd{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Cj[\"{{{AIEh{BH@n}}CInB@J`{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Bb[\"{LDf{{LDd{LDf{LGn{LDf}}}}}}\",[]]000Aj[\"{{{AIEh{AJAf}}}LDf}\",[]]A`[\"{AIEhLJ`}\",[]]0000000000000000000000000000000000000000000000000000000000000Ce[\"{{{AIEh{CCbB@Nd}}{Nf{BEJl}}}{{AIEh{CCbB@Nd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Nh}}{Nf{BEJn}}}{{AIEh{CCbB@Nh}}}}\",[]]A`[\"{BGK`JJj}\",[]]o[\"{B@NdNf}\",[]]o[\"{B@NhNf}\",[]]Aj[\"{{{AIEh{ABNj}}}HKh}\",[]]Ck[\"{{{AIEh{CCbAJEd}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAJG`}}}}\",[]]n[\"{{}LDf}\",[]]Ak[\"{{{AIEh{AJAf}}}AHHf}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]Bi[\"{{{AIEh{CCb}}}{{AIEh{CCbc}}}{}}\",[\"T\"]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bc[\"{{AIEh{AIEh{CCbc}}}HKh{}}\",[\"T\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Cc[\"{{{AIEh{CCbAJAh}}OJhLHdLJf}{{LHh{HKhBBGd}}}}\",[]]A`[\"{AHIjCNj}\",[]]B`[\"{{AIEh{AIEh{c}}}CNj{}}\",[\"K\"]]00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Aa[\"{BCFnBFCd}\",[]]A`[\"{BDO`LJd}\",[]]Aa[\"{BCGbBFCf}\",[]]A`[\"{BDOdLJf}\",[]]A`[\"{BEIlLJf}\",[]]A`[\"{BCIdLJf}\",[]]o[\"{OMbLJf}\",[]]Aa[\"{BCFnAJBn}\",[]]Aa[\"{BCGbAJC`}\",[]]o[\"{LJdCJ`}\",[]]o[\"{LJfCJ`}\",[]]Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]Aj[\"{{{AIEh{BAJh}}}CNj}\",[]]Bd[\"{{{AIEh{BBFn}}}{{LHj{AJEj}}}}\",[]]Bd[\"{{{AIEh{ABNj}}}{{LHj{AJEj}}}}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]Cb[\"{{{AIEh{BCHf}}{AIEh{AJEb}}CJ`}{{Nf{AOKf}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]Bg[\"{{{AIEh{AJAf}}LHb}{{LGn{AHM`}}}}\",[]]Bj[\"{{{AIEh{CCbAJAh}}LHd}{{LGn{AHMb}}}}\",[]]Aa[\"{AHJdAHMb}\",[]]Db[\"{{{A@l{{AIEh{CCbAJEd}}}}{AIEh{CCbOIf}}}{{CM`{{LHj{HKh}}}}}}\",[]]00Ec[\"{{{A@l{{AIEh{CCbAJEd}}}}{AIEh{CCbOIf}}{AIEh{{LB`{Mn}}}}}{{CM`{{LHj{LDf}}}}}}\",[]]Eg[\"{{{A@l{{AIEh{CCbAJEd}}}}{AIEh{CCbOIf}}{AIEh{{LB`{Mn}}}}}{{CM`{{LHh{LDfAJG`}}}}}}\",[]]1Bm[\"{{{AIEh{JL`}}{AIEh{CLf}}}{{LHj{HKh}}}}\",[]]Cd[\"{{{AIEh{CCbAJDh}}LDf}{{LHh{{LGn{JGd}}AHMf}}}}\",[]]Cd[\"{{{AIEh{CCbBFHj}}LDf}{{LHh{{LGn{JGd}}AHMf}}}}\",[]]Cn[\"{{{AIEh{CCbAJDh}}{AIEh{CCb{LB`{Mn}}}}}{{LHh{HKhBBKd}}}}\",[]]Bj[\"{{{AIEh{CLh}}AJCn}{{LHh{HKhBFBl}}}}\",[]]Bn[\"{{{AIEh{CCbAJDb}}OJh}{{AIEh{CCbAJDb}}}}\",[]]Bn[\"{{{AIEh{CCbAJDd}}OJh}{{AIEh{CCbAJDd}}}}\",[]]A`[\"{BBKjAE`}\",[]]o[\"{JKnCJ`}\",[]]o[\"{{}AJEj}\",[]]0o[\"{{}AIEh}\",[]]Bj[\"{{ABOb{Nf{B@Nd}}}{{LHh{AJAbBCGd}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bh[\"{{{AIEh{AHIj}}AJEj}{{LHl{AHMn}}}}\",[]]A`[\"{AHM`CIl}\",[]]Aj[\"{{{AIEh{AJAh}}}CIl}\",[]]A`[\"{AHMbCIl}\",[]]Ce[\"{{{AIEh{CCbAJDb}}{LGn{LJ`}}}{{AIEh{CCbAJDb}}}}\",[]]Ce[\"{{{AIEh{CCbAJDd}}{LGn{LJ`}}}{{AIEh{CCbAJDd}}}}\",[]]Aa[\"{ACBlAJEj}\",[]]Aa[\"{ACBnAJEj}\",[]]Aa[\"{ACC`AJEj}\",[]]o[\"{A@dCIl}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CIl}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CIl}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjCIl}\",[]]Bo[\"{{{AIEh{CCbBCJb}}ABNf}{{AIEh{CCbBCJb}}}}\",[]]Bo[\"{{{AIEh{CCbBCJd}}ABNf}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjLGn}\",[]]k[\"{{}}\",[]]0000000000Bh[\"{ABObc{}}\",[\"IntoFuture::IntoFuture\"]]11A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]o[\"{A@dLDf}\",[]]Ao[\"{{AIEhc}{{OJn{c}}}{}}\",[\"S\"]]0C`[\"{{{AIEh{CCbAJAj}}OJhCJ`CNj{LGn{CJ`}}}HKh}\",[]]Bn[\"{{{AIEh{CCbNh}}OJhCJ`CNj{LGn{CJ`}}}HKh}\",[]]C`[\"{{{AIEh{CCbAJAl}}OJhCJ`CNj{LGn{CJ`}}}HKh}\",[]]Bn[\"{{{AIEh{CCbNj}}OJhCJ`CNj{LGn{CJ`}}}HKh}\",[]]Bk[\"{{{AIEh{CCbJL`}}OJh{AIEh{BCHf}}}HKh}\",[]]A`[\"{BEJhLGn}\",[]]A`[\"{BEJjLGn}\",[]]Bn[\"{{{AIEh{LJd}}{AIEh{LJd}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{LHb}}{AIEh{LHb}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{AOI`}}{AIEh{AOI`}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{B@Jb}}{AIEh{B@Jb}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{CMf}}{AIEh{CMf}}}{{LGn{AC@j}}}}\",[]]Bl[\"{{{AIEh{Od}}{AIEh{Od}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{ACAh}}{AIEh{ACAh}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{LJf}}{AIEh{LJf}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{BELb}}{AIEh{BELb}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{LHd}}{AIEh{LHd}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{AHMh}}{AIEh{AHMh}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{BAMl}}{AIEh{BAMl}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{AJGb}}{AIEh{AJGb}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{AOIb}}{AIEh{AOIb}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{BDOl}}{AIEh{BDOl}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{BEKj}}{AIEh{BEKj}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{B@Jd}}{AIEh{B@Jd}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{CMh}}{AIEh{CMh}}}{{LGn{AC@j}}}}\",[]]Bl[\"{{{AIEh{Of}}{AIEh{Of}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{ACAj}}{AIEh{ACAj}}}{{LGn{AC@j}}}}\",[]]Be[\"{{{AIEh{AJAf}}}{{ACA`{AHLl}}}}\",[]]Bk[\"{{{AIEh{AJAh}}LHd}{{LHh{AJD`AJ@n}}}}\",[]]Df[\"{{{AIEh{CCbAJDh}}{AIEh{CCb{LB`{JGb}}}}}{{LHh{{LGn{LDf}}AHMf}}}}\",[]]Cc[\"{{{AIEh{CCbAJDh}}LDf}{{LHh{{AAb{Mn}}BBKf}}}}\",[]]Bb[\"{{{AIEh{CCbAJAh}}ACAj}AJDj}\",[]]Aj[\"{{{AIEh{AHKd}}}LDf}\",[]]Aj[\"{{{AIEh{AHKf}}}LDf}\",[]]Bb[\"{{{AIEh{CCbAJAh}}ACAj}AJEf}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CJ`}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CJ`}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjLGn}\",[]]A`[\"{BAJnLGn}\",[]]A`[\"{BAK`LGn}\",[]]Ce[\"{{{AIEh{CCbB@Nd}}{Nf{AJFb}}}{{AIEh{CCbB@Nd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Nh}}{Nf{AJFd}}}{{AIEh{CCbB@Nh}}}}\",[]]Ce[\"{{{AIEh{CCbB@Hd}}{Nf{AJFj}}}{{AIEh{CCbB@Hd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Hh}}{Nf{AJFl}}}{{AIEh{CCbB@Hh}}}}\",[]]o[\"{A@dCJ`}\",[]]Bn[\"{{{AIEh{CCbBF@n}}CIl}{{AIEh{CCbBF@n}}}}\",[]]Bn[\"{{{AIEh{CCbBFA`}}CIl}{{AIEh{CCbBFA`}}}}\",[]]Ak[\"{{{AIEh{AJAf}}}BG@d}\",[]]Aj[\"{{{AIEh{CLh}}}BBLd}\",[]]Ai[\"{{{Nf{B@Nf}}}B@Nd}\",[]]Ai[\"{{{Nf{B@Nj}}}B@Nh}\",[]]Aj[\"{{BCI`c}BCI`ACBb}\",[\"\"]]Aj[\"{{BCIbc}BCIbACBb}\",[\"\"]]Bm[\"{{{AIEh{CCbAJEd}}JGb}{{LHh{HKhAJG`}}}}\",[]]n[\"{{}LGb}\",[]]o[\"{OIdOId}\",[]]0000Bd[\"{{{AIEh{BGEn}}}{{LGn{ABNf}}}}\",[]]Bd[\"{{{AIEh{BGF`}}}{{LGn{ABNf}}}}\",[]]Bd[\"{{{AIEh{BHFd}}}{{LGn{ABNf}}}}\",[]]Bd[\"{{{AIEh{BHFn}}}{{LGn{ABNf}}}}\",[]]Bd[\"{{{AIEh{AJAf}}}{{LGn{BCGd}}}}\",[]]Ck[\"{{{AIEh{ABNj}}B@HdAJEj{AIEh{CIj}}}{{LHh{AJAbB@Il}}}}\",[]]Ak[\"{{{AIEh{B@Ml}}}ABNf}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]An[\"{{AJDfCNj}{{LHl{LDf}}}}\",[]]Cj[\"{{{AIEh{OLn}}}{{LGn{{LDd{{Nn{AHKd}}{Nn{AHLb}}}}}}}}\",[]]Ck[\"{{{AIEh{AJFf}}}{{LGn{{LDd{{Nn{AHKd}}{Nn{AHLb}}}}}}}}\",[]]Cj[\"{{{AIEh{OM`}}}{{LGn{{LDd{{Nn{AHKf}}{Nn{AHLd}}}}}}}}\",[]]Ck[\"{{{AIEh{AJFh}}}{{LGn{{LDd{{Nn{AHKf}}{Nn{AHLd}}}}}}}}\",[]]A`[\"{BFNhAAb}\",[]]A`[\"{BHJbAAb}\",[]]A`[\"{BFNjAAb}\",[]]A`[\"{BHJdAAb}\",[]]An[\"{{{AIEh{CCbBGEn}}}B@Jb}\",[]]An[\"{{{AIEh{CCbBGF`}}}B@Jd}\",[]]An[\"{{{AIEh{CCbBHFd}}}B@Jd}\",[]]An[\"{{{AIEh{CCbBHFn}}}B@Jd}\",[]]Ak[\"{{{AIEh{BBLb}}}B@Lb}\",[]]Ba[\"{{{AIEh{CCbAJAh}}BCGj}HKh}\",[]]Bo[\"{{{AIEh{CCbABNl}}BDOlBAJh}{{LGn{BCGj}}}}\",[]]B`[\"{{{AIEh{OLn}}B@JbCMf}CKl}\",[]]Bn[\"{{{AIEh{B@Nf}}CInB@Jb}{{LHh{CKlBFCl}}}}\",[]]Ba[\"{{{AIEh{AJFf}}B@JbCMf}CKl}\",[]]Bn[\"{{{AIEh{BEBj}}CInB@Jb}{{LHh{CKlBFCl}}}}\",[]]B`[\"{{{AIEh{OM`}}B@JdCMh}CKn}\",[]]Bn[\"{{{AIEh{B@Nj}}CInB@Jd}{{LHh{CKnBFDb}}}}\",[]]Ba[\"{{{AIEh{AJFh}}B@JdCMh}CKn}\",[]]Bn[\"{{{AIEh{BEBl}}CInB@Jd}{{LHh{CKnBFDb}}}}\",[]]Bn[\"{{{AIEh{BH@n}}CInB@J`}{{LHh{CKnBFDb}}}}\",[]]Aj[\"{{}{{OLh{c}}}{}}\",[\"T\"]]0A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]Bn[\"{{{AIEh{CCbB@Nd}}LDf}{{AIEh{CCbB@Nd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nh}}LDf}{{AIEh{CCbB@Nh}}}}\",[]]Aj[\"{{{AIEh{BBFn}}}CNj}\",[]]0Aj[\"{{{AIEh{BBLb}}}CNj}\",[]]Bk[\"{{{AIEh{AJAh}}LHd}{{LHh{AHJlAJ@n}}}}\",[]]Cb[\"{{{AIEh{BCHf}}{AIEh{AJDf}}CJ`}{{Nf{AOKf}}}}\",[]]Ak[\"{{{AIEh{ABOb}}}B@Jb}\",[]]Ak[\"{{{AIEh{ABOd}}}B@Jd}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bf[\"{{{AIEh{CCbAJAh}}}{{LGn{OJh}}}}\",[]]Ce[\"{{{AIEh{CCbBCJb}}{Nf{AOIn}}}{{AIEh{CCbBCJb}}}}\",[]]Ce[\"{{{AIEh{CCbBCJd}}{Nf{AOJ`}}}{{AIEh{CCbBCJd}}}}\",[]]43A`[\"{ACBlLGn}\",[]]A`[\"{ACBnLGn}\",[]]A`[\"{ACC`LGn}\",[]]Ai[\"{{{AIEh{OMn}}}LDf}\",[]]Bo[\"{{{AIEh{CCbBHFd}}ABNf}{{AIEh{CCbBHFd}}}}\",[]]Bo[\"{{{AIEh{CCbBHFn}}ABNf}{{AIEh{CCbBHFn}}}}\",[]]Bj[\"{{{AIEh{AJEd}}CAl}{{LHh{HKhB@I`}}}}\",[]]Bm[\"{{{AIEh{CCbAJEf}}CAl}{{LHh{HKhB@Ih}}}}\",[]]<;A`[\"{JKnAOKd}\",[]]A`[\"{AOGhJKn}\",[]]Bi[\"{{{Nf{B@H`}}JLb}{{LHh{BEBfBFOf}}}}\",[]]Bi[\"{{{Nf{B@N`}}JLb}{{LHh{BEBjBFOf}}}}\",[]]Bi[\"{{{Nf{B@H`}}JLb}{{LHh{BEBhBFOh}}}}\",[]]Bi[\"{{{Nf{B@N`}}JLb}{{LHh{BEBlBFOh}}}}\",[]]Co[\"{{{AIEh{CCbAJEd}}{AIEh{CCb{LB`{JGb}}}}}{{LHh{ONjAJG`}}}}\",[]]Co[\"{{{AIEh{CCbAJEf}}{AIEh{CCb{LB`{JGb}}}}}{{LHh{ONlAJGb}}}}\",[]]Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]A`[\"{AHIjCNj}\",[]]E`[\"{{{AIEh{CCbBBHf}}c}{{AIEh{CCbBBHf}}}{{A`{}{{LH`{{Nn{BGEn}}}}}}CMdCMj}}\",[\"F\"]]E`[\"{{{AIEh{CCbBBHh}}c}{{AIEh{CCbBBHh}}}{{A`{}{{LH`{{Nn{BGF`}}}}}}CMdCMj}}\",[\"F\"]]Bj[\"{{{AIEh{BBFn}}}{{A@l{{Nn{AHMl}}}}}}\",[]]o[\"{A@dCJ`}\",[]]Aa[\"{AOKdAHKh}\",[]]76Aa[\"{AJDnABOb}\",[]]Aa[\"{AJE`ABOd}\",[]]Cf[\"{{{AIEh{CCbBEO`}}{LGn{ABNf}}}{{AIEh{CCbBEO`}}}}\",[]]Cf[\"{{{AIEh{CCbBEOb}}{LGn{ABNf}}}{{AIEh{CCbBEOb}}}}\",[]]9;:An[\"{{{AIEh{AOKf}}ABNf}HKh}\",[]]B`[\"{{{AIEh{CCbAJAj}}CIl}HKh}\",[]]An[\"{{{AIEh{CCbNh}}CIl}HKh}\",[]]Ao[\"{{{AIEh{CCbJGl}}CIl}HKh}\",[]]Ao[\"{{{AIEh{CCbOKd}}CIl}HKh}\",[]]B`[\"{{{AIEh{CCbAJAl}}CIl}HKh}\",[]]An[\"{{{AIEh{CCbNj}}CIl}HKh}\",[]]Ao[\"{{{AIEh{CCbJGn}}CIl}HKh}\",[]]Ao[\"{{{AIEh{CCbOKf}}CIl}HKh}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]10Bh[\"{{{AIEh{AJAf}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bg[\"{{{AIEh{OLn}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bh[\"{{{AIEh{AJFf}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bg[\"{{{AIEh{OM`}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bh[\"{{{AIEh{AJFh}}}{{LGn{{Nn{Nd}}}}}}\",[]]Dm[\"{{{AIEh{CCbAJDh}}{AIEh{CCbOIf}}{AIEh{CCbOLf}}}{{CM`{{LHh{HKhAHMf}}}}}}\",[]]Db[\"{{{A@l{{AIEh{CCbAJEd}}}}{AIEh{CCbOIf}}}{{CM`{{LHj{HKh}}}}}}\",[]]Db[\"{{{AIEh{CCbAJAh}}OJhB@Lb{AIEh{CCb{AAb{Mn}}}}}{{LGn{ACBn}}}}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{AIEh{CIj}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{AIEh{CIj}}}{{AIEh{CCbBCJd}}}}\",[]]Ak[\"{{{AIEh{AJAf}}}B@Md}\",[]]Bj[\"{{{AIEh{AJAf}}JGb}{{LHh{HKhBEL`}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]Ai[\"{{{AIEh{OJb}}}LDf}\",[]]Ai[\"{{{AIEh{OJd}}}LDf}\",[]]De[\"{{{Nf{B@Hf}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OLn}}B@Il}}}}\",[]]Bo[\"{{{Nf{B@Nf}}CIn{AIEh{BFHh}}}{{Nn{OLn}}}}\",[]]De[\"{{{Nf{BEBf}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OLn}}B@Il}}}}\",[]]Bo[\"{{{Nf{BEBj}}CIn{AIEh{BFHh}}}{{Nn{OLn}}}}\",[]]De[\"{{{Nf{B@Hj}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OM`}}B@In}}}}\",[]]Bo[\"{{{Nf{B@Nj}}CIn{AIEh{BFHh}}}{{Nn{OM`}}}}\",[]]De[\"{{{Nf{BEBh}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OM`}}B@In}}}}\",[]]Bo[\"{{{Nf{BEBl}}CIn{AIEh{BFHh}}}{{Nn{OM`}}}}\",[]]De[\"{{{Nf{BH@l}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OM`}}B@Ij}}}}\",[]]Bo[\"{{{Nf{BH@n}}CIn{AIEh{BFHh}}}{{Nn{OM`}}}}\",[]]Cc[\"{{{AIEh{BEJl}}{AIEh{{LB`{Mn}}}}}{{Nn{OHj}}}}\",[]]Cc[\"{{{AIEh{BEJn}}{AIEh{{LB`{Mn}}}}}{{Nn{OHl}}}}\",[]]Bn[\"{{AJEjBBG`A@d}{{LHl{{LDd{ABNhAJAd}}}}}}\",[]]Bd[\"{{{AIEh{AJAh}}}{{AIEh{OM`}}}}\",[]]A`[\"{AOGhJKn}\",[]]Cb[\"{{{AIEh{AOIn}}CMfAJEjB@JbOJh}{{LGn{AJDb}}}}\",[]]Cb[\"{{{AIEh{BCI`}}CMfAJEjB@JbOJh}{{LGn{AJDb}}}}\",[]]Cb[\"{{{AIEh{AOJ`}}CMhAJEjB@JdOJh}{{LGn{AJDd}}}}\",[]]Cb[\"{{{AIEh{BCIb}}CMhAJEjB@JdOJh}{{LGn{AJDd}}}}\",[]]B`[\"{{{AIEh{CCbAJAh}}OJh}HKh}\",[]]Bo[\"{{{AIEh{CCbAJAb}}}{{LHh{{Nn{Nd}}BCGd}}}}\",[]]Bh[\"{{{AIEh{AJAf}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bg[\"{{{AIEh{OLn}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bh[\"{{{AIEh{AJFf}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bg[\"{{{AIEh{OM`}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bh[\"{{{AIEh{AJFh}}}{{LGn{{Nn{Nd}}}}}}\",[]]o[\"{AJBbMn}\",[]]o[\"{AJBdMn}\",[]]Ai[\"{{{AIEh{CIj}}}CNj}\",[]]Aj[\"{{{AIEh{AJAj}}}CJ`}\",[]]Ah[\"{{{AIEh{Nh}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbAHId}}CJ`}{{AIEh{CCbAHId}}}}\",[]]Ai[\"{{{AIEh{JGl}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbAOHf}}CJ`}{{AIEh{CCbAOHf}}}}\",[]]Ai[\"{{{AIEh{OKd}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbBALl}}CJ`}{{AIEh{CCbBALl}}}}\",[]]Aj[\"{{{AIEh{AJAl}}}CJ`}\",[]]Ah[\"{{{AIEh{Nj}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbAHIf}}CJ`}{{AIEh{CCbAHIf}}}}\",[]]Ai[\"{{{AIEh{JGn}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbAOHh}}CJ`}{{AIEh{CCbAOHh}}}}\",[]]Ai[\"{{{AIEh{OKf}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbBALn}}CJ`}{{AIEh{CCbBALn}}}}\",[]]Aa[\"{AJDhBFHj}\",[]]Ai[\"{{{AIEh{OLn}}}CNj}\",[]]Aj[\"{{{AIEh{AJFf}}}CNj}\",[]]Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]Ai[\"{{{AIEh{OM`}}}CNj}\",[]]Aj[\"{{{AIEh{AJFh}}}CNj}\",[]]Co[\"{{{AIEh{OLn}}B@Jb{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}CNj}\",[]]D`[\"{{{AIEh{AJFf}}B@Jb{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}CNj}\",[]]Co[\"{{{AIEh{OM`}}B@Jd{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}CNj}\",[]]D`[\"{{{AIEh{AJFh}}B@Jd{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}CNj}\",[]]Bn[\"{{{AIEh{CCbBF@n}}CIl}{{AIEh{CCbBF@n}}}}\",[]]Bn[\"{{{AIEh{CCbBFA`}}CIl}{{AIEh{CCbBFA`}}}}\",[]]Cc[\"{{{AIEh{CCbOLn}}}{{LGn{{OJj{{Nn{AHLb}}}}}}}}\",[]]Cd[\"{{{AIEh{CCbAJFf}}}{{LGn{{OJj{{Nn{AHLb}}}}}}}}\",[]]Cc[\"{{{AIEh{CCbOM`}}}{{LGn{{OJl{{Nn{AHLd}}}}}}}}\",[]]Cd[\"{{{AIEh{CCbAJFh}}}{{LGn{{OJl{{Nn{AHLd}}}}}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]De[\"{{{AIEh{CCbBCJb}}c{AIEh{CIj}}}{{AIEh{CCbBCJb}}}{{JG`{CLf}}}}\",[\"\"]]De[\"{{{AIEh{CCbBCJd}}c{AIEh{CIj}}}{{AIEh{CCbBCJd}}}{{JG`{CLf}}}}\",[\"\"]]Ci[\"{{{AIEh{CCbOLn}}{AIEh{{LB`{Mn}}}}}{{LHh{CNjJIb}}}}\",[]]Cj[\"{{{AIEh{CCbAJFf}}{AIEh{{LB`{Mn}}}}}{{LHh{CNjJIb}}}}\",[]]Cj[\"{{{AIEh{CCbOM`}}{AIEh{{LB`{Mn}}}}}{{LHh{CNjBBL`}}}}\",[]]Ck[\"{{{AIEh{CCbAJFh}}{AIEh{{LB`{Mn}}}}}{{LHh{CNjBBL`}}}}\",[]]o[\"{A@dCNj}\",[]]Bn[\"{{{AIEh{CCbBCJb}}LJd}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LJf}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjLGn}\",[]]Ca[\"{{{AIEh{CCbAJDh}}}{{LHh{{LGn{LJd}}AJDl}}}}\",[]]Ca[\"{{{AIEh{CCbBFHj}}}{{LHh{{LGn{LJd}}AJDl}}}}\",[]]Ca[\"{{{AIEh{CCbAJDj}}}{{LHh{{LGn{LJf}}B@Ih}}}}\",[]]Ak[\"{{{AIEh{AJAb}}}AJEj}\",[]]Ak[\"{{{AIEh{AJAf}}}AJEj}\",[]]Ak[\"{{{AIEh{ABOb}}}AJEj}\",[]]Bg[\"{{{AIEh{CLh}}}{{LHh{AJEjAJ@h}}}}\",[]]Ak[\"{{{AIEh{ABOd}}}AJEj}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]B`[\"{{LJdc}LJd{{CKj{LJd}}}}\",[\"\"]]B`[\"{{LHbc}LHb{{CKj{LHb}}}}\",[\"\"]]B`[\"{{LJfc}LJf{{CKj{LJf}}}}\",[\"\"]]B`[\"{{LHdc}LHd{{CKj{LHd}}}}\",[\"\"]]20Ae[\"{{ABNfCJ`}AE`}\",[]]Bn[\"{{{AIEh{CCbBCJb}}ADn}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}ADn}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{JKnABNf}\",[]]B`[\"{{}{{AIEh{{LB`{BFGl}}}}}}\",[]]Ao[\"{{AIEh{A@Nd{CCbMn}}}HKh}\",[]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Am[\"{{}{{LGn{{Nf{OLl}}}}}}\",[]]Bn[\"{{{AIEh{CCbBBHf}}CNj}{{AIEh{CCbBBHf}}}}\",[]]Bn[\"{{{AIEh{CCbBBHh}}CNj}{{AIEh{CCbBBHh}}}}\",[]]Aj[\"{{{AIEh{AHLb}}}CJ`}\",[]]Aj[\"{{{AIEh{AHLd}}}CJ`}\",[]]A`[\"{ACAdLGn}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]10Bf[\"{{{AIEh{CIj}}}{{LHl{CJ`BAM`}}}}\",[]]Bm[\"{{{AIEh{ABNj}}{Nn{BBFn}}}{{LHj{HKh}}}}\",[]]Ai[\"{AJAd{{LHl{HKh}}}}\",[]]Cj[\"{{{AIEh{OLj}}BBG`BAMj{AIEh{A@d}}}{{LDd{AJEjABNh}}}}\",[]]Cb[\"{{{AIEh{CCbAJAh}}LHdAJD`}{{LHh{AJD`BFBn}}}}\",[]]Am[\"{{{AIEh{AJAf}}CJ`}HKh}\",[]]B`[\"{{{AIEh{CCbAJAh}}CJ`}HKh}\",[]]A`[\"{BBKhCNj}\",[]]B`[\"{{{AIEh{CCbJKn}}BBKj}HKh}\",[]]Aa[\"{AOKdAHKh}\",[]]Bm[\"{{{AIEh{OLl}}AHMn}{{LHj{{Nn{BBFn}}}}}}\",[]]Bn[\"{{{AIEh{B@Ob}}AHMn}{{LHj{{Nn{BBFn}}}}}}\",[]]Bn[\"{{{AIEh{AOJj}}AHMn}{{LHj{{Nn{BBFn}}}}}}\",[]]Ci[\"{{{AIEh{CCbOLn}}{AIEh{CCb{AAb{Mn}}}}}{{LGn{CKl}}}}\",[]]Cj[\"{{{AIEh{CCbAJFf}}{AIEh{CCb{AAb{Mn}}}}}{{LGn{CKl}}}}\",[]]Ci[\"{{{AIEh{CCbOM`}}{AIEh{CCb{AAb{Mn}}}}}{{LGn{CKn}}}}\",[]]Cj[\"{{{AIEh{CCbAJFh}}{AIEh{CCb{AAb{Mn}}}}}{{LGn{CKn}}}}\",[]]Cb[\"{{{AIEh{ACBd}}HKfAJF`ABNf}{{LHh{HKhBCIl}}}}\",[]]Cb[\"{{{AIEh{BAIh}}HKfAJF`ABNf}{{LHh{HKhBCIl}}}}\",[]]Cb[\"{{{AIEh{B@Ld}}HKfAJF`ABNf}{{LHh{HKhBCIl}}}}\",[]]Cb[\"{{{AIEh{ACBf}}HKfAJF`ABNf}{{LHh{HKhBCIn}}}}\",[]]Cb[\"{{{AIEh{BAIj}}HKfAJF`ABNf}{{LHh{HKhBCIn}}}}\",[]]Cb[\"{{{AIEh{B@Lf}}HKfAJF`ABNf}{{LHh{HKhBCIn}}}}\",[]]Al[\"{{}{{LHh{B@HbBFOh}}}}\",[]]Bm[\"{{{AIEh{AJAf}}LHb}{{LGn{{Nn{AJAj}}}}}}\",[]]Bo[\"{{{AIEh{AJAh}}LHd}{{LGn{{AIEh{AJAl}}}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Aj[\"{{{AIEh{AJAf}}}HKh}\",[]]Am[\"{{{AIEh{CCbAJAh}}}HKh}\",[]]Bf[\"{{{AIEh{AIOn}}}{{LHh{A@dJHl}}}}\",[]]Bg[\"{{{AIEh{AIOn}}}{{LHh{AHIjJHl}}}}\",[]]Bf[\"{{{AIEh{AIOn}}}{{LHh{A@fJHl}}}}\",[]]Bf[\"{{{AIEh{AIOn}}}{{LHh{A@hJHl}}}}\",[]]Be[\"{{{AIEh{AIOn}}}{{LHh{ObJHl}}}}\",[]]Bg[\"{{{AIEh{AIOn}}}{{LHh{ABMhJHl}}}}\",[]]Ak[\"{{{AIEh{BBLb}}}B@Lb}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{LGn{AOI`}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{AOIb}}}{{AIEh{CCbBCJd}}}}\",[]]<;Aj[\"{{{AIEh{ABNj}}}LDf}\",[]]Aj[\"{{{AIEh{ABNl}}}LDf}\",[]]Bc[\"{{{AIEh{AJAf}}AJEjAJCn}AC@h}\",[]]Co[\"{{{AIEh{CCbAJAh}}AHJlAJD`OJh}{{LHh{{LDd{LHdCNj}}AHLh}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CIn}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CIn}{{AIEh{CCbBCJd}}}}\",[]]Ai[\"{AJAd{{LHl{HKh}}}}\",[]]Bg[\"{{{AIEh{BBLb}}AJFn}{{LHj{LDf}}}}\",[]]A`[\"{AHIjCJ`}\",[]]10Aj[\"{{{AIEh{A@d}}}BCJ`}\",[]]Ce[\"{{{AIEh{CCbB@Nd}}{Nf{BCJb}}}{{AIEh{CCbB@Nd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Hd}}{Nf{BCJb}}}{{AIEh{CCbB@Hd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Nh}}{Nf{BCJd}}}{{AIEh{CCbB@Nh}}}}\",[]]Ce[\"{{{AIEh{CCbB@Hh}}{Nf{BCJd}}}{{AIEh{CCbB@Hh}}}}\",[]]Aa[\"{B@NdBGG`}\",[]]Aa[\"{B@NhBGGb}\",[]]Bj[\"{{{AAb{BBG`}}BAMj}{{LHh{B@NdJIf}}}}\",[]]Bj[\"{{{AAb{BBG`}}BAMj}{{LHh{B@NhJIh}}}}\",[]]Co[\"{{{AIEh{CCbAJEd}}{AIEh{CCb{LB`{JGb}}}}}{{LHh{HKhAJG`}}}}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]A`[\"{BEJhCJ`}\",[]]A`[\"{BEJjCJ`}\",[]]Bc[\"{{{AIEh{AJAf}}}{{LGn{LDf}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]10Aj[\"{{{AIEh{AHJ`}}}LDf}\",[]]Be[\"{{{AIEh{ABNj}}{LGn{B@Nd}}}HKh}\",[]]Bn[\"{{{AIEh{CCbABNl}}{LGn{{Nf{B@Nh}}}}}HKh}\",[]]Bd[\"{{{AIEh{BFGl}}}{{LGn{BAMh}}}}\",[]]o[\"{{}AIEh}\",[]]n[\"{{}OId}\",[]]0000Bn[\"{{{AIEh{CCbBCJb}}LDf}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LDf}{{AIEh{CCbBCJd}}}}\",[]]o[\"{CJ`LJd}\",[]]o[\"{CJ`LJf}\",[]]A`[\"{BAJjCJ`}\",[]]Bf[\"{{{AIEh{BG@d}}{AIEh{BG@d}}}CNj}\",[]]Bo[\"{{{AIEh{CCbBBHf}}ABNf}{{AIEh{CCbBBHf}}}}\",[]]Bo[\"{{{AIEh{CCbBBHh}}ABNf}{{AIEh{CCbBBHh}}}}\",[]]Ae[\"{{LDfCJ`}BAIh}\",[]]Ae[\"{{LDfCJ`}BAIj}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]7Bg[\"{{{AIEh{AJAh}}LHd}{{LGn{AJD`}}}}\",[]]An[\"{{{AIEh{AJAf}}JGb}B@Mn}\",[]]Am[\"{{{AIEh{AJAf}}LJd}HKh}\",[]]B`[\"{{{AIEh{CCbAJAh}}LJf}HKh}\",[]]Ce[\"{{{AIEh{CCbBBHf}}{AAb{CIn}}}{{AIEh{CCbBBHf}}}}\",[]]Ce[\"{{{AIEh{CCbBBHh}}{AAb{CIn}}}{{AIEh{CCbBBHh}}}}\",[]]Fg[\"{{{AIEh{BGKb}}{AIEh{BBG`}}{AIEh{{LB`{BBG`}}}}{AIEh{AJEh}}{AIEh{{LB`{Mn}}}}ACCf}{{LHh{BFBhJHj}}}}\",[]]Af[\"{{BCI`OJh}BCI`}\",[]]Af[\"{{BCIbOJh}BCIb}\",[]]A`[\"{BAJjCJ`}\",[]]Al[\"{B@Od{{LHh{CMfJId}}}}\",[]]Ak[\"{B@Od{{LHh{OdJId}}}}\",[]]Ai[\"{B@Od{{LHn{CMh}}}}\",[]]Ah[\"{B@Od{{LHn{Of}}}}\",[]]o[\"{OIdOId}\",[]]Bo[\"{{{AIEh{CCbBF@n}}ABNf}{{AIEh{CCbBF@n}}}}\",[]]Bo[\"{{{AIEh{CCbBFA`}}ABNf}{{AIEh{CCbBFA`}}}}\",[]]Bb[\"{{{AIEh{OLn}}}{{LGn{CNj}}}}\",[]]Bc[\"{{{AIEh{AJFf}}}{{LGn{CNj}}}}\",[]]Bb[\"{{{AIEh{OM`}}}{{LGn{CNj}}}}\",[]]Bc[\"{{{AIEh{AJFh}}}{{LGn{CNj}}}}\",[]]Bg[\"{{{AIEh{AJAf}}}{{LHh{HKhBCGd}}}}\",[]]Ba[\"{{{AIEh{BEKd}}LHbAHJl}CNj}\",[]]Ba[\"{{{AIEh{BEKf}}LHdAHJl}CNj}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{LGn{ABNf}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{ABNf}}}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]Bl[\"{{{AIEh{CCbAJAj}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bj[\"{{{AIEh{CCbNh}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bk[\"{{{AIEh{CCbJGl}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bk[\"{{{AIEh{CCbOKd}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bl[\"{{{AIEh{CCbAJAl}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bj[\"{{{AIEh{CCbNj}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bk[\"{{{AIEh{CCbJGn}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bk[\"{{{AIEh{CCbOKf}}OJhOJhCNjCNjCJ`}HKh}\",[]]A`[\"{BAJjCJ`}\",[]]Ak[\"{{{AIEh{OMn}}Of}CJ`}\",[]]Bi[\"{{{AIEh{CCbAJEb}}CJ`}{{LHl{HKh}}}}\",[]]<;A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]10Cf[\"{{{AIEh{CCbBCJb}}{LGn{BEO`}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{BEOb}}}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]Bi[\"{{{AIEh{CCbAIOn}}}{{LHh{A@dJHl}}}}\",[]]Bj[\"{{{AIEh{CCbAIOn}}}{{LHh{AHIjJHl}}}}\",[]]Bi[\"{{{AIEh{CCbAIOn}}}{{LHh{A@fJHl}}}}\",[]]Bi[\"{{{AIEh{CCbAIOn}}}{{LHh{A@hJHl}}}}\",[]]Bh[\"{{{AIEh{CCbAIOn}}}{{LHh{ObJHl}}}}\",[]]Bj[\"{{{AIEh{CCbAIOn}}}{{LHh{ABMhJHl}}}}\",[]]Cc[\"{{{Nf{AJAd}}CJ`CNj}{{LHl{{LDd{BBKjBBKj}}}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nd}}CJ`}{{AIEh{CCbB@Nd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nh}}CJ`}{{AIEh{CCbB@Nh}}}}\",[]]Aj[\"{{{AIEh{AJAf}}}CNj}\",[]]Ak[\"{{{AIEh{BBFn}}}B@Lb}\",[]]0Ci[\"{{{AIEh{CCbBBHf}}CIl}{{LHh{{AIEh{CCbBBHf}}AOGl}}}}\",[]]Ci[\"{{{AIEh{CCbBBHh}}CIl}{{LHh{{AIEh{CCbBBHh}}AOGn}}}}\",[]]A`[\"{AHIjCIl}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{LGn{BF@n}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{BFA`}}}{{AIEh{CCbBCJd}}}}\",[]]Bg[\"{{{AIEh{CCbAJAh}}}{{LGn{BAJh}}}}\",[]]Cf[\"{{{AIEh{CCbB@Nd}}{LGn{B@Nl}}}{{AIEh{CCbB@Nd}}}}\",[]]Cf[\"{{{AIEh{CCbB@Nh}}{LGn{B@Nl}}}{{AIEh{CCbB@Nh}}}}\",[]]Cf[\"{{{AIEh{CCbB@Nd}}{LGn{B@Nn}}}{{AIEh{CCbB@Nd}}}}\",[]]Cf[\"{{{AIEh{CCbB@Nh}}{LGn{B@Nn}}}{{AIEh{CCbB@Nh}}}}\",[]]Cc[\"{{}{{LHh{{LDd{{AAb{BBG`}}BAMj}}{Nn{JHh}}}}}}\",[]]Bn[\"{{{AIEh{CCbBEO`}}LJd}{{AIEh{CCbBEO`}}}}\",[]]Bn[\"{{{AIEh{CCbBEOb}}LJf}{{AIEh{CCbBEOb}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bo[\"{{{AIEh{CCbB@Nd}}ABNf}{{AIEh{CCbB@Nd}}}}\",[]]Bo[\"{{{AIEh{CCbB@Nh}}ABNf}{{AIEh{CCbB@Nh}}}}\",[]]Ci[\"{{{AIEh{CLh}}{LGn{ABNf}}}{{LHh{{LGn{ABNf}}AJ@h}}}}\",[]]Bj[\"{{{AIEh{BBLb}}AJFnLDf}{{LHj{HKh}}}}\",[]]054Bm[\"{{{AIEh{OLn}}}{{LHh{{LGn{BFHh}}JIb}}}}\",[]]Bn[\"{{{AIEh{AJFf}}}{{LHh{{LGn{BFHh}}JIb}}}}\",[]]Bn[\"{{{AIEh{OM`}}}{{LHh{{LGn{BFHh}}BBL`}}}}\",[]]Bo[\"{{{AIEh{AJFh}}}{{LHh{{LGn{BFHh}}BBL`}}}}\",[]]Aj[\"{{{AIEh{AHLb}}}CJ`}\",[]]Aj[\"{{{AIEh{AHLd}}}CJ`}\",[]]Bk[\"{{{AIEh{ABNj}}{LGn{{Nf{BEKd}}}}}HKh}\",[]]Cc[\"{{{AIEh{CCbAJAh}}{LGn{{AIEh{BEKf}}}}OJh}HKh}\",[]]Aj[\"{{{AIEh{ABNl}}}CJ`}\",[]]Bf[\"{{{AIEh{AHJl}}{AIEh{AHJl}}}CNj}\",[]]Bn[\"{{{AIEh{CCbBALl}}ADn}{{AIEh{CCbBALl}}}}\",[]]Bn[\"{{{AIEh{CCbBALn}}ADn}{{AIEh{CCbBALn}}}}\",[]]Ak[\"{{{AIEh{AHMl}}}B@Lb}\",[]]0Bd[\"{{{AIEh{AJAf}}}{{ACA`{JJb}}}}\",[]]Cb[\"{{{AIEh{AJAh}}LHd}{{LHh{{LGn{AJEj}}AJ@n}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bn[\"{{{AIEh{CCbBCJb}}LJd}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LJf}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjLGn}\",[]]Bo[\"{{{AIEh{AHIj}}{AIEh{CIj}}}{{LHj{BCJ`}}}}\",[]]Em[\"{{{AIEh{AJAf}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBh}}}}\",[]]El[\"{{{AIEh{OLn}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBh}}}}\",[]]Em[\"{{{AIEh{AJFf}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBh}}}}\",[]]El[\"{{{AIEh{OM`}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBj}}}}\",[]]Em[\"{{{AIEh{AJFh}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBj}}}}\",[]]Am[\"{{{AIEh{CCbAHIn}}}HKh}\",[]]0Al[\"{{{AIEh{AJAh}}Of}CJ`}\",[]]Bl[\"{{{AIEh{AJAf}}}{{ACAb{{LGn{AJEj}}}}}}\",[]]Bg[\"{{{AIEh{CLh}}}{{LHh{BDNlAJ@h}}}}\",[]]>=E`[\"{{{AIEh{BGKb}}{AIEh{{LB`{Mn}}}}{AIEh{BBG`}}{AIEh{BGFb}}}{{LHh{BGMhJHj}}}}\",[]]0Bf[\"{{{Nf{BANb}}}{{LHh{B@HdBG@b}}}}\",[]]Bf[\"{{{Nf{BANb}}}{{LHh{B@HhBG@b}}}}\",[]]Bn[\"{{{AIEh{CCbBEO`}}LJd}{{AIEh{CCbBEO`}}}}\",[]]Bn[\"{{{AIEh{CCbBEOb}}LJf}{{AIEh{CCbBEOb}}}}\",[]]o[\"{OIdOId}\",[]]0000Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]0Ci[\"{{{AIEh{CLh}}{LGn{ABNf}}}{{LHh{{LGn{ABNf}}AJ@h}}}}\",[]]Cd[\"{{{AIEh{CCbA@d}}{AIEh{AIOn}}}{{LHh{HKhJHl}}}}\",[]]Ce[\"{{{AIEh{CCbAHIj}}{AIEh{AIOn}}}{{LHh{HKhJHl}}}}\",[]]Cd[\"{{{AIEh{CCbA@f}}{AIEh{AIOn}}}{{LHh{HKhJHl}}}}\",[]]Cd[\"{{{AIEh{CCbA@h}}{AIEh{AIOn}}}{{LHh{HKhJHl}}}}\",[]]Cc[\"{{{AIEh{CCbOb}}{AIEh{AIOn}}}{{LHh{HKhJHl}}}}\",[]]Ce[\"{{{AIEh{CCbABMh}}{AIEh{AIOn}}}{{LHh{HKhJHl}}}}\",[]]Bo[\"{{{AIEh{CCbB@Nd}}BGG`}{{AIEh{CCbB@Nd}}}}\",[]]Bo[\"{{{AIEh{CCbB@Nh}}BGGb}{{AIEh{CCbB@Nh}}}}\",[]]Aj[\"{{{AIEh{BBHf}}}CJ`}\",[]]Aj[\"{{{AIEh{BBHh}}}CJ`}\",[]]Cc[\"{{{AIEh{CCbB@Hd}}{Nf{A`}}}{{AIEh{CCbB@Hd}}}}\",[]]Cc[\"{{{AIEh{CCbB@Hh}}{Nf{A`}}}{{AIEh{CCbB@Hh}}}}\",[]]Cj[\"{{BBHf{LGn{B@Nd}}{Nn{BBFn}}{Nf{OLl}}}{{LHj{ABNj}}}}\",[]]Aj[\"{{{AIEh{ABOb}}}CNj}\",[]]Aj[\"{{{AIEh{ABOd}}}CNj}\",[]]Ca[\"{{{AIEh{CCbAJAh}}OJhAJCd}{{LHh{HKhBGJj}}}}\",[]]Bd[\"{{{AIEh{BGKb}}}{{AAb{BCIh}}}}\",[]]Bj[\"{{{AIEh{AJAf}}AJEj}{{LHh{HKhJIl}}}}\",[]]Bm[\"{{{AIEh{CCbAJAh}}AJEj}{{LHh{HKhJIl}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}LDf}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LDf}{{AIEh{CCbBCJd}}}}\",[]]Bl[\"{{}{{LHh{{LDd{BBG`BFAj}}{Nn{JHh}}}}}}\",[]]Ai[\"{AJAd{{LHl{HKh}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]An[\"{{{AIEh{ABNj}}B@Hd}HKh}\",[]]D`[\"{{{AIEh{CCbAJAh}}LHd{LGn{ABNf}}}{{LHh{{LGn{ABNf}}AJ@n}}}}\",[]]o[\"{{}AIEh}\",[]]Aj[\"{{{AIEh{AJAf}}}LDf}\",[]]Bn[\"{{{AIEh{CCbB@Nd}}CJ`}{{AIEh{CCbB@Nd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nh}}CJ`}{{AIEh{CCbB@Nh}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}LJd}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LJf}{{AIEh{CCbBCJd}}}}\",[]]:Bb[\"{{{AIEh{CCbAJAh}}OfLJf}HKh}\",[]]Ak[\"{{}{{LHh{B@HdJIf}}}}\",[]]Ak[\"{{}{{LHh{B@HhJIh}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]65Cg[\"{{{AIEh{CCbA@d}}{AIEh{CCbAIOn}}}{{LHh{HKhJHl}}}}\",[]]Ch[\"{{{AIEh{CCbAHIj}}{AIEh{CCbAIOn}}}{{LHh{HKhJHl}}}}\",[]]Cg[\"{{{AIEh{CCbA@f}}{AIEh{CCbAIOn}}}{{LHh{HKhJHl}}}}\",[]]Cg[\"{{{AIEh{CCbA@h}}{AIEh{CCbAIOn}}}{{LHh{HKhJHl}}}}\",[]]Cf[\"{{{AIEh{CCbOb}}{AIEh{CCbAIOn}}}{{LHh{HKhJHl}}}}\",[]]Ch[\"{{{AIEh{CCbABMh}}{AIEh{CCbAIOn}}}{{LHh{HKhJHl}}}}\",[]]Bi[\"{{{AIEh{CCbAHJl}}{AIEh{AHJl}}}CNj}\",[]]n[\"{{}HKh}\",[]]Ce[\"{{{AIEh{CCbBCJb}}{LGn{LDf}}}{{AIEh{CCbBCJb}}}}\",[]]Ce[\"{{{AIEh{CCbBCJd}}{LGn{LDf}}}{{AIEh{CCbBCJd}}}}\",[]]Bn[\"{{{AIEh{AJAf}}}{{LHh{{AAb{AJEj}}JIl}}}}\",[]]Cd[\"{{{AIEh{CCbAJAh}}OJh}{{LHh{{AAb{AJEj}}JIl}}}}\",[]]Am[\"{{{AIEh{CCbAJAj}}}HKh}\",[]]Al[\"{{{AIEh{CCbJGl}}}HKh}\",[]]Am[\"{{{AIEh{CCbAJAl}}}HKh}\",[]]Al[\"{{{AIEh{CCbJGn}}}HKh}\",[]]Ai[\"{AJAd{{LHl{HKh}}}}\",[]]Bj[\"{{{AIEh{AJAf}}AJEj}{{LHh{HKhJIl}}}}\",[]]Bm[\"{{{AIEh{CCbAJAh}}AJEj}{{LHh{HKhJIl}}}}\",[]]D`[\"{{{AIEh{CCbAJAh}}LHd{LGn{ABNf}}}{{LHh{{LGn{ABNf}}AJ@n}}}}\",[]]Ce[\"{{{AIEh{CCbBCJb}}{Nf{BEJd}}}{{AIEh{CCbBCJb}}}}\",[]]Ce[\"{{{AIEh{CCbBCJd}}{Nf{BEJf}}}{{AIEh{CCbBCJd}}}}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{LGn{ABNf}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{ABNf}}}{{AIEh{CCbBCJd}}}}\",[]]Aa[\"{BAJnAJCb}\",[]]Aa[\"{BAK`AJCb}\",[]]9Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]Am[\"{{{AIEh{AJAf}}LJd}HKh}\",[]]o[\"{OIdOId}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CIn}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CIn}{{AIEh{CCbBCJd}}}}\",[]]3109854Bn[\"{{{AIEh{AJAf}}}{{LHh{{AAb{AJEj}}JIl}}}}\",[]]Bn[\"{{{AIEh{AJAh}}}{{LHh{{AAb{AJEj}}JIl}}}}\",[]]10A`[\"{BFHhLGn}\",[]]Bm[\"{{{AIEh{CCbBCJb}}Mn}{{AIEh{CCbBCJb}}}}\",[]]Bm[\"{{{AIEh{CCbBCJd}}Mn}{{AIEh{CCbBCJd}}}}\",[]]o[\"{{}AJCd}\",[]]")
\ No newline at end of file
+rd_("Bf[\"{{{AIEh{AOGf}}{AIEh{AOGf}}}CNj}\",[]]Bf[\"{{{AIEh{BEL`}}{AIEh{BEL`}}}CNj}\",[]]Bd[\"{{{AIEh{CLh}}{AIEh{CLh}}}CNj}\",[]]Bf[\"{{{AIEh{BBLd}}{AIEh{BBLd}}}CNj}\",[]]Bf[\"{{{AIEh{BBKf}}{AIEh{BBKf}}}CNj}\",[]]Bf[\"{{{AIEh{AHMf}}{AIEh{AHMf}}}CNj}\",[]]Bf[\"{{{AIEh{AJDl}}{AIEh{AJDl}}}CNj}\",[]]Bf[\"{{{AIEh{BBKd}}{AIEh{BBKd}}}CNj}\",[]]Bf[\"{{{AIEh{AJG`}}{AIEh{AJG`}}}CNj}\",[]]Bf[\"{{{AIEh{B@O`}}{AIEh{B@O`}}}CNj}\",[]]Bd[\"{{{AIEh{LJd}}{AIEh{LJd}}}CNj}\",[]]Bf[\"{{{AIEh{BFOn}}{AIEh{BFOn}}}CNj}\",[]]Bd[\"{{{AIEh{JGd}}{AIEh{JGd}}}CNj}\",[]]Bd[\"{{{AIEh{LHb}}{AIEh{LHb}}}CNj}\",[]]Bf[\"{{{AIEh{ACCb}}{AIEh{ACCb}}}CNj}\",[]]Bf[\"{{{AIEh{AHM`}}{AIEh{AHM`}}}CNj}\",[]]Bd[\"{{{AIEh{ONj}}{AIEh{ONj}}}CNj}\",[]]Bf[\"{{{AIEh{B@I`}}{AIEh{B@I`}}}CNj}\",[]]Bf[\"{{{AIEh{BCGd}}{AIEh{BCGd}}}CNj}\",[]]Bf[\"{{{AIEh{AOI`}}{AIEh{AOI`}}}CNj}\",[]]Bf[\"{{{AIEh{AOGl}}{AIEh{AOGl}}}CNj}\",[]]Bf[\"{{{AIEh{AHJn}}{AIEh{AHJn}}}CNj}\",[]]Bf[\"{{{AIEh{BCFn}}{AIEh{BCFn}}}CNj}\",[]]Bf[\"{{{AIEh{BDO`}}{AIEh{BDO`}}}CNj}\",[]]Bf[\"{{{AIEh{B@Il}}{AIEh{B@Il}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jb}}{AIEh{B@Jb}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jl}}{AIEh{B@Jl}}}CNj}\",[]]Bf[\"{{{AIEh{BFCd}}{AIEh{BFCd}}}CNj}\",[]]Bd[\"{{{AIEh{CMf}}{AIEh{CMf}}}CNj}\",[]]Bb[\"{{{AIEh{Od}}{AIEh{Od}}}CNj}\",[]]Bf[\"{{{AIEh{ACAh}}{AIEh{ACAh}}}CNj}\",[]]Bf[\"{{{AIEh{BHBh}}{AIEh{BHBh}}}CNj}\",[]]Bd[\"{{{AIEh{JIf}}{AIEh{JIf}}}CNj}\",[]]Bd[\"{{{AIEh{LJf}}{AIEh{LJf}}}CNj}\",[]]Bf[\"{{{AIEh{BG@`}}{AIEh{BG@`}}}CNj}\",[]]Bd[\"{{{AIEh{JGf}}{AIEh{JGf}}}CNj}\",[]]Bf[\"{{{AIEh{BELb}}{AIEh{BELb}}}CNj}\",[]]Bd[\"{{{AIEh{LHd}}{AIEh{LHd}}}CNj}\",[]]Bf[\"{{{AIEh{AJD`}}{AIEh{AJD`}}}CNj}\",[]]Bf[\"{{{AIEh{AHLn}}{AIEh{AHLn}}}CNj}\",[]]Bf[\"{{{AIEh{BEKn}}{AIEh{BEKn}}}CNj}\",[]]Bf[\"{{{AIEh{BFBn}}{AIEh{BFBn}}}CNj}\",[]]Bf[\"{{{AIEh{AJ@n}}{AIEh{AJ@n}}}CNj}\",[]]Bf[\"{{{AIEh{ACCd}}{AIEh{ACCd}}}CNj}\",[]]Bf[\"{{{AIEh{AHMb}}{AIEh{AHMb}}}CNj}\",[]]Bf[\"{{{AIEh{AHMh}}{AIEh{AHMh}}}CNj}\",[]]Bf[\"{{{AIEh{BAMl}}{AIEh{BAMl}}}CNj}\",[]]Bd[\"{{{AIEh{ONl}}{AIEh{ONl}}}CNj}\",[]]Bf[\"{{{AIEh{AJGb}}{AIEh{AJGb}}}CNj}\",[]]Bf[\"{{{AIEh{AOHn}}{AIEh{AOHn}}}CNj}\",[]]Bf[\"{{{AIEh{AOKb}}{AIEh{AOKb}}}CNj}\",[]]Bf[\"{{{AIEh{BBKh}}{AIEh{BBKh}}}CNj}\",[]]Bf[\"{{{AIEh{B@Ih}}{AIEh{B@Ih}}}CNj}\",[]]Bf[\"{{{AIEh{BCGf}}{AIEh{BCGf}}}CNj}\",[]]Bf[\"{{{AIEh{AHLh}}{AIEh{AHLh}}}CNj}\",[]]Bf[\"{{{AIEh{BBGd}}{AIEh{BBGd}}}CNj}\",[]]Bf[\"{{{AIEh{AOIb}}{AIEh{AOIb}}}CNj}\",[]]Bf[\"{{{AIEh{AOGn}}{AIEh{AOGn}}}CNj}\",[]]Bf[\"{{{AIEh{AHK`}}{AIEh{AHK`}}}CNj}\",[]]Bf[\"{{{AIEh{BBIb}}{AIEh{BBIb}}}CNj}\",[]]Bf[\"{{{AIEh{AJC`}}{AIEh{AJC`}}}CNj}\",[]]Bf[\"{{{AIEh{AJEl}}{AIEh{AJEl}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jf}}{AIEh{B@Jf}}}CNj}\",[]]Bf[\"{{{AIEh{BCGb}}{AIEh{BCGb}}}CNj}\",[]]Bf[\"{{{AIEh{BDOd}}{AIEh{BDOd}}}CNj}\",[]]Bf[\"{{{AIEh{BDOl}}{AIEh{BDOl}}}CNj}\",[]]Bf[\"{{{AIEh{B@In}}{AIEh{B@In}}}CNj}\",[]]Bf[\"{{{AIEh{ABOh}}{AIEh{ABOh}}}CNj}\",[]]Bf[\"{{{AIEh{BEKj}}{AIEh{BEKj}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jd}}{AIEh{B@Jd}}}CNj}\",[]]Bf[\"{{{AIEh{B@Jn}}{AIEh{B@Jn}}}CNj}\",[]]Bf[\"{{{AIEh{BBL`}}{AIEh{BBL`}}}CNj}\",[]]Bf[\"{{{AIEh{BFCf}}{AIEh{BFCf}}}CNj}\",[]]Bd[\"{{{AIEh{CMh}}{AIEh{CMh}}}CNj}\",[]]Bb[\"{{{AIEh{Of}}{AIEh{Of}}}CNj}\",[]]Bf[\"{{{AIEh{ACAj}}{AIEh{ACAj}}}CNj}\",[]]Bf[\"{{{AIEh{AHJl}}{AIEh{AHJl}}}CNj}\",[]]Bf[\"{{{AIEh{BANh}}{AIEh{BANh}}}CNj}\",[]]Bf[\"{{{AIEh{BFHh}}{AIEh{BFHh}}}CNj}\",[]]Bd[\"{{{AIEh{JIj}}{AIEh{JIj}}}CNj}\",[]]Bf[\"{{{AIEh{BHBj}}{AIEh{BHBj}}}CNj}\",[]]Bd[\"{{{AIEh{JIh}}{AIEh{JIh}}}CNj}\",[]]Bf[\"{{{AIEh{B@K`}}{AIEh{B@K`}}}CNj}\",[]]Ai[\"{{{AIEh{CLh}}}LHb}\",[]]Aj[\"{{{AIEh{BBLd}}}LHb}\",[]]Ak[\"{{{AIEh{AJDh}}}ACAh}\",[]]Ak[\"{{{AIEh{BFHj}}}ACAh}\",[]]Ak[\"{{{AIEh{AJEd}}}ACAh}\",[]]o[\"{LGfLHd}\",[]]A`[\"{AHHbLHd}\",[]]A`[\"{AHJdLHd}\",[]]A`[\"{B@MfLHd}\",[]]A`[\"{B@LhLHd}\",[]]Aa[\"{AC@lACAj}\",[]]Aa[\"{ACChACAj}\",[]]Aa[\"{ABNnACAj}\",[]]A`[\"{OMbACAj}\",[]]n[\"{{}OLj}\",[]]A`[\"{CL`ABOh}\",[]]Be[\"{{{AIEh{LJd}}{AIEh{LJd}}}AC@j}\",[]]Be[\"{{{AIEh{LHb}}{AIEh{LHb}}}AC@j}\",[]]Bg[\"{{{AIEh{AOI`}}{AIEh{AOI`}}}AC@j}\",[]]Bg[\"{{{AIEh{B@Jb}}{AIEh{B@Jb}}}AC@j}\",[]]Be[\"{{{AIEh{CMf}}{AIEh{CMf}}}AC@j}\",[]]Bc[\"{{{AIEh{Od}}{AIEh{Od}}}AC@j}\",[]]Bg[\"{{{AIEh{ACAh}}{AIEh{ACAh}}}AC@j}\",[]]Be[\"{{{AIEh{LJf}}{AIEh{LJf}}}AC@j}\",[]]Bg[\"{{{AIEh{BELb}}{AIEh{BELb}}}AC@j}\",[]]Be[\"{{{AIEh{LHd}}{AIEh{LHd}}}AC@j}\",[]]Bg[\"{{{AIEh{AHMh}}{AIEh{AHMh}}}AC@j}\",[]]Bg[\"{{{AIEh{BAMl}}{AIEh{BAMl}}}AC@j}\",[]]Bg[\"{{{AIEh{AJGb}}{AIEh{AJGb}}}AC@j}\",[]]Bg[\"{{{AIEh{AOIb}}{AIEh{AOIb}}}AC@j}\",[]]Bg[\"{{{AIEh{BDOl}}{AIEh{BDOl}}}AC@j}\",[]]Bg[\"{{{AIEh{BEKj}}{AIEh{BEKj}}}AC@j}\",[]]Bg[\"{{{AIEh{B@Jd}}{AIEh{B@Jd}}}AC@j}\",[]]Be[\"{{{AIEh{CMh}}{AIEh{CMh}}}AC@j}\",[]]Bc[\"{{{AIEh{Of}}{AIEh{Of}}}AC@j}\",[]]Bg[\"{{{AIEh{ACAj}}{AIEh{ACAj}}}AC@j}\",[]]o[\"{ACAhOd}\",[]]o[\"{ACAjOf}\",[]]n[\"{LGhOf}\",[]]o[\"{AHHnOf}\",[]]A`[\"{ACBlLGn}\",[]]A`[\"{ACBnLGn}\",[]]A`[\"{ACAdLGn}\",[]]A`[\"{ACC`LGn}\",[]]Bh[\"{{{AIEh{A@d}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOGf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBKj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BGKb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJAb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJAf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BG@d}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEL`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ABNj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BAJj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ABOb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJDn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BBI`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{CLh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBLd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJDh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFHj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBKf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AHMf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJDl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BBKd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@Ob}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOJj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJEd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJG`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@O`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{OMf}}{AIEh{CCbAHJj}}}LHf}\",[]]Cd[\"{{{AIEh{LJd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BFOn}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Cd[\"{{{AIEh{JGd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{LHb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{ACCb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AJBb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AHM`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BCGl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{ONj}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{B@I`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BCGd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BCI`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BCJb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BEO`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BF@n}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AOI`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BBHf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{B@Nd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BGG`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{B@Hd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AOGl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{AHJn}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BCFn}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{BDO`}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{B@Il}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{B@Jb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{B@Jl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BFCd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{AJBh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BEBn}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{CMf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cc[\"{{{AIEh{Od}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{ACAh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Ce[\"{{{AIEh{ACBl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cc[\"{{{AIEh{Nh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AHId}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{JGl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AOHf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Cd[\"{{{AIEh{OKd}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BALl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BEJh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BHBh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{AOHb}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BFCl}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]Ce[\"{{{AIEh{BFOf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Cd[\"{{{AIEh{JIf}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Bi[\"{{{AIEh{AJAh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ABNl}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{LJf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BG@`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{JGf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BELb}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{LHd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@Ml}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJD`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHLn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEKn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFBn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJ@n}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ACCd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJBd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHMb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BCGn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHMh}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BAMl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{ONl}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJGb}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AOHn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AOKb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBKh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@Ih}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BCGf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AHLh}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BBGd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BGJj}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{JJ`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BCIb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BCJd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEOb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFA`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOIb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBHh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@Nh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BGGb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@Hh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOGn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AHK`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BBIb}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJC`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJEl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@Jf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BCGb}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BDOd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ABMn}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BDOl}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ABOd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@In}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AOGb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AJE`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BAMb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BCHn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BGK`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ABOh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEKj}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BCGj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BAJh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@Jd}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{B@Jn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBL`}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BFCf}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{AJBj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BHFn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEC`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{CMh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bg[\"{{{AIEh{Of}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ACAj}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{ACBn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHJl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BANh}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BFHh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{JIj}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bi[\"{{{AIEh{BHBj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOHd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFDb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BFOh}}{AIEh{CCbAHJj}}}LHf}\",[]]0Cd[\"{{{AIEh{JIh}}{AIEh{CCbAHJj}}}{{LHh{HKhJHf}}}}\",[]]0Bg[\"{{{AIEh{Nj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AHIf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{JGn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{AOHh}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{OKf}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BALn}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BEJj}}{AIEh{CCbAHJj}}}LHf}\",[]]Bh[\"{{{AIEh{JIl}}{AIEh{CCbAHJj}}}LHf}\",[]]0Bh[\"{{{AIEh{JJb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{BBLb}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ACAd}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{ACC`}}{AIEh{CCbAHJj}}}LHf}\",[]]Bi[\"{{{AIEh{B@K`}}{AIEh{CCbAHJj}}}LHf}\",[]]Ak[\"{{{AIEh{B@Ml}}}ABNf}\",[]]A`[\"{ACCbCJ`}\",[]]A`[\"{ACCdCJ`}\",[]]Aj[\"{{{AIEh{BAMb}}}LDf}\",[]]A`[\"{BGK`CJ`}\",[]]o[\"{CL`CJ`}\",[]]A`[\"{ACAdLDf}\",[]]Ce[\"{{{AIEh{CCbBGG`}}{Nf{ACBd}}}{{AIEh{CCbBGG`}}}}\",[]]Ce[\"{{{AIEh{CCbBGGb}}{Nf{ACBf}}}{{AIEh{CCbBGGb}}}}\",[]]8Af[\"{{ABNfCJ`}BBKj}\",[]]Ag[\"{{}{{Nf{BGKb}}}}\",[]]Ae[\"{{LDfCIn}BAIh}\",[]]Cd[\"{{BBHf{LGn{B@Nd}}AHMn{Nf{OLl}}}{{LHj{ABNj}}}}\",[]]Ah[\"{{{Nn{JLd}}}AJDb}\",[]]A`[\"{OLdBCI`}\",[]]Ah[\"{{{Nf{OJb}}}BBHf}\",[]]Bc[\"{{{Nf{B@Nf}}{Nf{BEJl}}}B@Nd}\",[]]Ai[\"{{{Nf{B@Hf}}}B@Hd}\",[]]B`[\"{{{AIEh{{LB`{Mn}}}}}B@Jb}\",[]]Ae[\"{{CInLDf}BEBn}\",[]]Ag[\"{{CMfOdCJ`}ACAh}\",[]]Aj[\"{{{Nf{AHId}}CIl}Nh}\",[]]An[\"{{{Nf{AOHf}}OJhCIl}JGl}\",[]]An[\"{{{Nf{BALl}}OJhCIl}OKd}\",[]]Ae[\"{{LDfCIn}BAIj}\",[]]Ah[\"{{{Nn{JLd}}}AJDd}\",[]]Bm[\"{{{Nf{BBHh}}{LGn{{Nf{B@Nh}}}}CNj}ABNl}\",[]]A`[\"{LDfBHJ`}\",[]]o[\"{{}BHFd}\",[]]A`[\"{OLdBCIb}\",[]]Ah[\"{{{Nf{OJd}}}BBHh}\",[]]Bc[\"{{{Nf{B@Nj}}{Nf{BEJn}}}B@Nh}\",[]]Ai[\"{{{Nf{B@Hj}}}B@Hh}\",[]]Ek[\"{{ABMd{AIEh{c}}{AIEh{{LB`{CIn}}}}CNj}{{LHh{{LDd{BAMb{LGn{ABMd}}}}BEKj}}}{BEOlJKl}}\",[\"\"]]B`[\"{{{AIEh{{LB`{Mn}}}}}B@Jd}\",[]]Af[\"{{BFCfLJ`}BBL`}\",[]]A`[\"{LDfBHFn}\",[]]Ae[\"{{CInLDf}BEC`}\",[]]Ag[\"{{CMhOfCJ`}ACAj}\",[]]Aj[\"{{{Nf{AHIf}}CIl}Nj}\",[]]An[\"{{{Nf{AOHh}}OJhCIl}JGn}\",[]]An[\"{{{Nf{BALn}}OJhCIl}OKf}\",[]]Aj[\"{AJFn{{LHj{BBLb}}}}\",[]]Ai[\"{{{Nf{BEBh}}}BH@l}\",[]]Ai[\"{{{Nf{BEBl}}}BH@n}\",[]]o[\"{CMfCMf}\",[]]o[\"{CMhCMh}\",[]]Ak[\"{{{AIEh{AJFb}}}AJF`}\",[]]Ai[\"{{{AIEh{OLl}}}OJh}\",[]]0Aj[\"{{{AIEh{B@Ob}}}OJh}\",[]]Ak[\"{{{AIEh{BANd}}}AJF`}\",[]]Ak[\"{{{AIEh{AJFd}}}AJF`}\",[]]Ak[\"{{{AIEh{BANf}}}AJF`}\",[]]Bg[\"{{{AIEh{AJAf}}LHb}{{LGn{ABNf}}}}\",[]]Aa[\"{AHM`ABNf}\",[]]Bg[\"{{{AIEh{AJAh}}LHd}{{LGn{ABNf}}}}\",[]]Aa[\"{AHMbABNf}\",[]]Ah[\"{A@f{{LHl{HKh}}}}\",[]]Ah[\"{A@h{{LHl{HKh}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Aa[\"{B@LhAJEj}\",[]]Aa[\"{ACAdAJEj}\",[]]Aa[\"{BBL`BFCf}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]A`[\"{ABMnJGb}\",[]]Am[\"{{{AIEh{CCbAC@f}}}HKh}\",[]]Am[\"{{{AIEh{CCbABOb}}}HKh}\",[]]Al[\"{{{AIEh{CCbCLh}}}HKh}\",[]]Am[\"{{{AIEh{CCbBBLd}}}HKh}\",[]]Am[\"{{{AIEh{CCbAJDh}}}HKh}\",[]]Am[\"{{{AIEh{CCbAJEd}}}HKh}\",[]]Al[\"{{{AIEh{CCbLEn}}}HKh}\",[]]A`[\"{cc{}}\",[\"T\"]]000000000000000000000Aa[\"{BCGdBEL`}\",[]]1111111111Aa[\"{AHMfBBKf}\",[]]22Aa[\"{AJDlAHMf}\",[]]Aa[\"{BCGdAHMf}\",[]]Aa[\"{BCGdAJDl}\",[]]55Aa[\"{AHMfBBKd}\",[]]666Aa[\"{B@O`AJG`}\",[]]Aa[\"{BCGdAJG`}\",[]]Aa[\"{B@I`AJG`}\",[]]9Aa[\"{BCGdB@O`}\",[]]:::::::n[\"{MnLJd}\",[]]A`[\"{ACAhLJd}\",[]]A`[\"{BFCdLJd}\",[]]=o[\"{CIlLJd}\",[]]o[\"{CInLJd}\",[]]??Al[\"{cLHb{{CKj{CIn}}}}\",[\"T\"]]A`[\"{cc{}}\",[\"T\"]]0000000A`[\"{JGjBCGd}\",[]]Aa[\"{AOGjBCGd}\",[]]A`[\"{JI`BCGd}\",[]]3333A`[\"{LJdAOI`}\",[]]44444Aa[\"{BFOnAOGl}\",[]]5Aa[\"{BCJfAOGl}\",[]]66A`[\"{JI`BCFn}\",[]]7Aa[\"{BFClB@Il}\",[]]888A`[\"{LJdBFCd}\",[]]99999A`[\"{LJdACAh}\",[]]::::::::::::Aa[\"{AOKhAOHb}\",[]];;;;;;;A`[\"{BCIjJIf}\",[]]A`[\"{BHBfJIf}\",[]]A`[\"{BHChJIf}\",[]]A`[\"{AJCfJIf}\",[]]A`[\"{BBJfJIf}\",[]]A`[\"{BEB`JIf}\",[]]A`[\"{BBIdJIf}\",[]]A`[\"{BDOfJIf}\",[]]A`[\"{BE@hJIf}\",[]]A`[\"{BCH`JIf}\",[]]A`[\"{cc{}}\",[\"T\"]]A`[\"{BGMfJIf}\",[]]1111111111111111A`[\"{BFCfLJf}\",[]]n[\"{MnLJf}\",[]]3o[\"{CInLJf}\",[]]o[\"{CIlLJf}\",[]]A`[\"{ACAjLJf}\",[]]666Al[\"{cLHd{{CKj{CIn}}}}\",[\"T\"]]77777777777777777777Aa[\"{BBL`BCGf}\",[]]8888A`[\"{AHLnJJ`}\",[]]99999A`[\"{LJfAOIb}\",[]]::::Aa[\"{BG@`AOGn}\",[]];Aa[\"{BCJfAOGn}\",[]]<<<<>>>>>Aa[\"{BANhBEKj}\",[]]??????A`[\"{JIjBBL`}\",[]]A`[\"{LJfBFCf}\",[]]A`[\"{cc{}}\",[\"T\"]]00000A`[\"{LJfACAj}\",[]]111111A`[\"{BANhJIj}\",[]]222Aa[\"{AOKhAOHd}\",[]]3333333A`[\"{BE@hJIh}\",[]]A`[\"{BCH`JIh}\",[]]A`[\"{BGMfJIh}\",[]]A`[\"{BHChJIh}\",[]]A`[\"{BDOfJIh}\",[]]A`[\"{BCIjJIh}\",[]]9A`[\"{BEB`JIh}\",[]]A`[\"{BBJfJIh}\",[]]A`[\"{BBIdJIh}\",[]]A`[\"{AJCfJIh}\",[]]A`[\"{BHBfJIh}\",[]]>>>>>>>>>An[\"{{{AIEh{c}}}AJFnCJf}\",[\"S\"]]????????????????Bm[\"{{{AIEh{LJd}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bk[\"{{{AIEh{LHb}}{AIEh{CCbc}}}HKhLG`}\",[\"H\"]]Bn[\"{{{AIEh{AOI`}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{B@Jb}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bm[\"{{{AIEh{CMf}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bl[\"{{{AIEh{Od}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{ACAh}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bm[\"{{{AIEh{LJf}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{BELb}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bk[\"{{{AIEh{LHd}}{AIEh{CCbc}}}HKhLG`}\",[\"H\"]]Bn[\"{{{AIEh{AHMh}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{BAMl}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{AJGb}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{AOIb}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{BDOl}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{BEKj}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{B@Jd}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bm[\"{{{AIEh{CMh}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bl[\"{{{AIEh{Of}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{ACAj}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Bn[\"{{{AIEh{AHJl}}{AIEh{CCbc}}}HKhLG`}\",[\"__H\"]]Aa[\"{{}c{}}\",[\"U\"]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000n[\"{{}HKh}\",[]]0000Cc[\"{{{AIEh{CCbLEn}}LDf}{{LHh{{LGn{JGf}}AHMh}}}}\",[]]El[\"{{{AIEh{OHj}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{{AIEh{CCb{LB`{Mn}}}}AOHb}}}}\",[]]Bh[\"{{{AIEh{CCbOMn}}Of}{{LGn{ACAj}}}}\",[]]El[\"{{{AIEh{OHl}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{{AIEh{CCb{LB`{Mn}}}}AOHd}}}}\",[]]Bf[\"{{{AIEh{AJAf}}LHb}{{LGn{CLh}}}}\",[]]Bf[\"{{{AIEh{CLh}}}{{LHh{HKhAJ@h}}}}\",[]]A`[\"{AJBbCJ`}\",[]]Am[\"{{{AIEh{CCbAJAh}}}HKh}\",[]]A`[\"{AJBdCJ`}\",[]]Ck[\"{{{A@l{{AIEh{CCbAJ@`}}}}{AIEh{CCbOIf}}}{{CM`{HKh}}}}\",[]]Dk[\"{{{A@l{{AIEh{CCbBCJl}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbAC@f}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbAC@h}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbAJAb}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dj[\"{{{A@l{{AIEh{CCbOKj}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dj[\"{{{A@l{{AIEh{CCbLGd}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbAHHf}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbABMb}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbB@Md}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbB@Mn}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dj[\"{{{A@l{{AIEh{CCbLDn}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dk[\"{{{A@l{{AIEh{CCbBBI`}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Dj[\"{{{A@l{{AIEh{CCbOMf}}}}{AIEh{CCbOIf}}}{{CM`{c}}}{}}\",[\"Future::Output\"]]Bf[\"{{{AIEh{CCbAJAh}}}{{LGn{JJ`}}}}\",[]]De[\"{{{AIEh{CCbAJDh}}{AIEh{CCb{LB`{Mn}}}}}{{LHh{{LGn{LDf}}AHMf}}}}\",[]]Bm[\"{{{AIEh{CCbAJDj}}CNj}{{LHh{LEnBAMl}}}}\",[]]Bo[\"{{CMh{AIEh{CCbc}}}{{LHh{BFHhJIj}}}O`}\",[\"R\"]]Bf[\"{{{AIEh{CCbAHJ`}}}{{LGn{JGb}}}}\",[]]Ec[\"{{{AIEh{BBLb}}AJFn{AIEh{CCb{LB`{AJBl}}}}{AIEh{CCb{LB`{ACAd}}}}}{{LHj{LDf}}}}\",[]]Dk[\"{{{AIEh{OHj}}{AIEh{CCb{AAb{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAOHb}}}}\",[]]Dk[\"{{{AIEh{OHl}}{AIEh{CCb{AAb{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAOHd}}}}\",[]]C`[\"{{{AIEh{CCbAHJ`}}JGbCNj}{{LHh{HKhBELb}}}}\",[]]Cc[\"{{{AIEh{BBLb}}AJFn{AIEh{ACC`}}}{{LHj{HKh}}}}\",[]]Bn[\"{{{AIEh{CCbBGG`}}CIn}{{AIEh{CCbBGG`}}}}\",[]]Bn[\"{{{AIEh{CCbBGGb}}CIn}{{AIEh{CCbBGGb}}}}\",[]]Aj[\"{{{AIEh{AJAf}}}CMf}\",[]]Aj[\"{{{AIEh{AJAh}}}CMh}\",[]]Cn[\"{{{AIEh{OJb}}{AIEh{{LB`{Mn}}}}{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]Cn[\"{{{AIEh{OJd}}{AIEh{{LB`{Mn}}}}{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]A`[\"{BBKjCJ`}\",[]]A`[\"{ACBlLDf}\",[]]A`[\"{ACBnLDf}\",[]]o[\"{JKhCNj}\",[]]Bm[\"{{{AIEh{CCbAJDh}}LJd}{{LHh{HKhB@I`}}}}\",[]]Bm[\"{{{AIEh{CCbBFHj}}LJd}{{LHh{HKhB@I`}}}}\",[]]Bm[\"{{{AIEh{CCbAJDj}}LJf}{{LHh{HKhB@Ih}}}}\",[]]Bn[\"{{{AIEh{AJFj}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{BBJb}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{BEBn}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{AJFl}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{BBJd}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Bn[\"{{{AIEh{BEC`}}{AIEh{CIj}}}{{LGn{JGb}}}}\",[]]Aa[\"{{}c{}}\",[\"V\"]]00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bg[\"{{{Nf{BEJd}}OJhCIl}{{Nn{AJAj}}}}\",[]]Bg[\"{{{Nf{AHId}}OJhCIl}{{Nn{AJAj}}}}\",[]]Bg[\"{{{Nf{AOHf}}OJhCIl}{{Nn{AJAj}}}}\",[]]Bg[\"{{{Nf{BALl}}OJhCIl}{{Nn{AJAj}}}}\",[]]Bg[\"{{{Nf{BEJf}}OJhCIl}{{Nn{AJAl}}}}\",[]]Bg[\"{{{Nf{AHIf}}OJhCIl}{{Nn{AJAl}}}}\",[]]Bg[\"{{{Nf{AOHh}}OJhCIl}{{Nn{AJAl}}}}\",[]]Bg[\"{{{Nf{BALn}}OJhCIl}{{Nn{AJAl}}}}\",[]]Ai[\"{BFGl{{Nf{BEJf}}}}\",[]]o[\"{JGdJGb}\",[]]A`[\"{ACCbCJ`}\",[]]o[\"{ONjLDf}\",[]]o[\"{JGfJGb}\",[]]A`[\"{ACCdCJ`}\",[]]o[\"{ONlLDf}\",[]]Aa[\"{AOGbBCGf}\",[]]Ai[\"{{{AIEh{A@d}}}A@d}\",[]]Ak[\"{{{AIEh{AOGf}}}AOGf}\",[]]Ak[\"{{{AIEh{AJAf}}}AJAf}\",[]]Ak[\"{{{AIEh{BG@d}}}BG@d}\",[]]Ak[\"{{{AIEh{BEL`}}}BEL`}\",[]]Ak[\"{{{AIEh{ABNj}}}ABNj}\",[]]Ak[\"{{{AIEh{BAJj}}}BAJj}\",[]]Ai[\"{{{AIEh{CLh}}}CLh}\",[]]Ak[\"{{{AIEh{BBLd}}}BBLd}\",[]]Ak[\"{{{AIEh{BBKf}}}BBKf}\",[]]Ak[\"{{{AIEh{AHMf}}}AHMf}\",[]]Ak[\"{{{AIEh{AJDl}}}AJDl}\",[]]Ak[\"{{{AIEh{BBKd}}}BBKd}\",[]]Ak[\"{{{AIEh{AJG`}}}AJG`}\",[]]Ak[\"{{{AIEh{B@O`}}}B@O`}\",[]]Ai[\"{{{AIEh{LJd}}}LJd}\",[]]Ak[\"{{{AIEh{BFOn}}}BFOn}\",[]]Ai[\"{{{AIEh{LHb}}}LHb}\",[]]Ak[\"{{{AIEh{ACCb}}}ACCb}\",[]]Ak[\"{{{AIEh{AJBb}}}AJBb}\",[]]Ak[\"{{{AIEh{AHM`}}}AHM`}\",[]]Ak[\"{{{AIEh{BCGl}}}BCGl}\",[]]Ai[\"{{{AIEh{ONj}}}ONj}\",[]]Ak[\"{{{AIEh{B@I`}}}B@I`}\",[]]Ak[\"{{{AIEh{BCGd}}}BCGd}\",[]]Ak[\"{{{AIEh{BCJb}}}BCJb}\",[]]Ak[\"{{{AIEh{BEO`}}}BEO`}\",[]]Ak[\"{{{AIEh{BF@n}}}BF@n}\",[]]Ak[\"{{{AIEh{AOI`}}}AOI`}\",[]]Ak[\"{{{AIEh{BBHf}}}BBHf}\",[]]Ak[\"{{{AIEh{B@Nd}}}B@Nd}\",[]]Ak[\"{{{AIEh{BGG`}}}BGG`}\",[]]Ak[\"{{{AIEh{B@Hd}}}B@Hd}\",[]]Ak[\"{{{AIEh{AOGl}}}AOGl}\",[]]Ak[\"{{{AIEh{AHJn}}}AHJn}\",[]]Ak[\"{{{AIEh{BCFn}}}BCFn}\",[]]Ak[\"{{{AIEh{BDO`}}}BDO`}\",[]]Ak[\"{{{AIEh{B@Il}}}B@Il}\",[]]Ak[\"{{{AIEh{B@Jb}}}B@Jb}\",[]]Ak[\"{{{AIEh{B@Jl}}}B@Jl}\",[]]Ak[\"{{{AIEh{BFCd}}}BFCd}\",[]]Ak[\"{{{AIEh{AJBh}}}AJBh}\",[]]Ai[\"{{{AIEh{CMf}}}CMf}\",[]]Ag[\"{{{AIEh{Od}}}Od}\",[]]Ak[\"{{{AIEh{ACAh}}}ACAh}\",[]]Ag[\"{{{AIEh{Nh}}}Nh}\",[]]Ak[\"{{{AIEh{AHId}}}AHId}\",[]]Ai[\"{{{AIEh{JGl}}}JGl}\",[]]Ak[\"{{{AIEh{AOHf}}}AOHf}\",[]]Ai[\"{{{AIEh{OKd}}}OKd}\",[]]Ak[\"{{{AIEh{BALl}}}BALl}\",[]]Ak[\"{{{AIEh{BFOf}}}BFOf}\",[]]Ai[\"{{{AIEh{JIf}}}JIf}\",[]]Ai[\"{{{AIEh{LJf}}}LJf}\",[]]Ak[\"{{{AIEh{BG@`}}}BG@`}\",[]]Ak[\"{{{AIEh{BELb}}}BELb}\",[]]Ai[\"{{{AIEh{LHd}}}LHd}\",[]]Ak[\"{{{AIEh{B@Ml}}}B@Ml}\",[]]Ak[\"{{{AIEh{AJD`}}}AJD`}\",[]]Ak[\"{{{AIEh{AHLn}}}AHLn}\",[]]Ak[\"{{{AIEh{BEKn}}}BEKn}\",[]]Ak[\"{{{AIEh{BFBn}}}BFBn}\",[]]Ak[\"{{{AIEh{AJ@n}}}AJ@n}\",[]]Ak[\"{{{AIEh{ACCd}}}ACCd}\",[]]Ak[\"{{{AIEh{AJBd}}}AJBd}\",[]]Ak[\"{{{AIEh{AHMb}}}AHMb}\",[]]Ak[\"{{{AIEh{BCGn}}}BCGn}\",[]]Ak[\"{{{AIEh{AHMh}}}AHMh}\",[]]Ak[\"{{{AIEh{BAMl}}}BAMl}\",[]]Ai[\"{{{AIEh{ONl}}}ONl}\",[]]Ak[\"{{{AIEh{AJGb}}}AJGb}\",[]]Ak[\"{{{AIEh{AOHn}}}AOHn}\",[]]Ak[\"{{{AIEh{BBKh}}}BBKh}\",[]]Ak[\"{{{AIEh{B@Ih}}}B@Ih}\",[]]Ak[\"{{{AIEh{BCGf}}}BCGf}\",[]]Ak[\"{{{AIEh{AHLh}}}AHLh}\",[]]Ak[\"{{{AIEh{BBGd}}}BBGd}\",[]]Ak[\"{{{AIEh{BGJj}}}BGJj}\",[]]Ak[\"{{{AIEh{BCJd}}}BCJd}\",[]]Ak[\"{{{AIEh{BEOb}}}BEOb}\",[]]Ak[\"{{{AIEh{BFA`}}}BFA`}\",[]]Ak[\"{{{AIEh{AOIb}}}AOIb}\",[]]Ak[\"{{{AIEh{BBHh}}}BBHh}\",[]]Ak[\"{{{AIEh{B@Nh}}}B@Nh}\",[]]Ak[\"{{{AIEh{BGGb}}}BGGb}\",[]]Ak[\"{{{AIEh{B@Hh}}}B@Hh}\",[]]Ak[\"{{{AIEh{AOGn}}}AOGn}\",[]]Ak[\"{{{AIEh{AHK`}}}AHK`}\",[]]Ak[\"{{{AIEh{AJC`}}}AJC`}\",[]]Ak[\"{{{AIEh{AJEl}}}AJEl}\",[]]Ak[\"{{{AIEh{B@Jf}}}B@Jf}\",[]]Ak[\"{{{AIEh{BCGb}}}BCGb}\",[]]Ak[\"{{{AIEh{BDOd}}}BDOd}\",[]]Ak[\"{{{AIEh{ABMn}}}ABMn}\",[]]Ak[\"{{{AIEh{BDOl}}}BDOl}\",[]]Ak[\"{{{AIEh{B@In}}}B@In}\",[]]Ak[\"{{{AIEh{BCHn}}}BCHn}\",[]]Ak[\"{{{AIEh{BGK`}}}BGK`}\",[]]Ak[\"{{{AIEh{ABOh}}}ABOh}\",[]]Ak[\"{{{AIEh{BEKj}}}BEKj}\",[]]Ak[\"{{{AIEh{B@Jd}}}B@Jd}\",[]]Ak[\"{{{AIEh{B@Jn}}}B@Jn}\",[]]Ak[\"{{{AIEh{BBL`}}}BBL`}\",[]]Ak[\"{{{AIEh{BFCf}}}BFCf}\",[]]Ak[\"{{{AIEh{AJBj}}}AJBj}\",[]]Ak[\"{{{AIEh{BHFn}}}BHFn}\",[]]Ai[\"{{{AIEh{CMh}}}CMh}\",[]]Ag[\"{{{AIEh{Of}}}Of}\",[]]Ak[\"{{{AIEh{ACAj}}}ACAj}\",[]]Ak[\"{{{AIEh{AHJl}}}AHJl}\",[]]Ak[\"{{{AIEh{BANh}}}BANh}\",[]]Ak[\"{{{AIEh{BFHh}}}BFHh}\",[]]Ai[\"{{{AIEh{JIj}}}JIj}\",[]]Ak[\"{{{AIEh{BFOh}}}BFOh}\",[]]Ai[\"{{{AIEh{JIh}}}JIh}\",[]]Ag[\"{{{AIEh{Nj}}}Nj}\",[]]Ak[\"{{{AIEh{AHIf}}}AHIf}\",[]]Ai[\"{{{AIEh{JGn}}}JGn}\",[]]Ak[\"{{{AIEh{AOHh}}}AOHh}\",[]]Ai[\"{{{AIEh{OKf}}}OKf}\",[]]Ak[\"{{{AIEh{BALn}}}BALn}\",[]]Ai[\"{{{AIEh{JJb}}}JJb}\",[]]Ak[\"{{{AIEh{ACAd}}}ACAd}\",[]]Ak[\"{{{AIEh{ACC`}}}ACC`}\",[]]Ak[\"{{{AIEh{B@K`}}}B@K`}\",[]]Ak[\"{{{AIEh{BFGl}}}BFGl}\",[]]Ak[\"{{{AIEh{BCHf}}}BCHf}\",[]]Bn[\"{{{AIEh{AJAf}}LJd{AIEh{{LB`{Mn}}}}}HKh}\",[]]Bn[\"{{{AIEh{ABNj}}LJd{AIEh{{LB`{Mn}}}}}HKh}\",[]]Bf[\"{{{AIEh{CLh}}}{{LHh{HKhBBGb}}}}\",[]]Bf[\"{{{AIEh{CCbAJAh}}OJhLJfJGb}HKh}\",[]]Bj[\"{{{AIEh{B@Jb}}}{{AIEh{{LB`{Mn}}}}}}\",[]]Bj[\"{{{AIEh{B@Jd}}}{{AIEh{{LB`{Mn}}}}}}\",[]]Aa[\"{BBL`AJC`}\",[]]A`[\"{ACAhCJ`}\",[]]A`[\"{ACAjCJ`}\",[]]A`[\"{B@JlCNj}\",[]]A`[\"{B@JnCNj}\",[]]l[\"{OJj}\",[]]l[\"{OJl}\",[]]Ce[\"{{{AIEh{BEOl}}{AIEh{CCbO`}}}{{LHh{B@JdBEKj}}}}\",[]]Ce[\"{{{AIEh{BHJ`}}{AIEh{CCbO`}}}{{LHh{B@JdBEKj}}}}\",[]]Bc[\"{{{AIEh{AJAh}}}{{AAb{LHd}}}}\",[]]Bd[\"{{{AIEh{JKn}}{AIEh{CIj}}}HKh}\",[]]Am[\"{{{AIEh{AOGh}}LDf}HKh}\",[]]Ai[\"{{{AIEh{JL`}}}HKh}\",[]]Bg[\"{{{A@l{{AIEh{CCbAJ@`}}}}OJh}HKh}\",[]]Bm[\"{{{AIEh{CCbAJEd}}LJd}{{LHh{HKhB@I`}}}}\",[]]Bm[\"{{{AIEh{CCbAJEf}}LJf}{{LHh{HKhB@Ih}}}}\",[]]Am[\"{ABOb{{LHh{HKhAJDn}}}}\",[]]Dc[\"{{{AIEh{CCbABNl}}ABOd{AIEh{CCb{AAb{Mn}}}}}{{LHh{ACBnAJE`}}}}\",[]]Bi[\"{{{AIEh{OLl}}{A@l{{Nn{LFn}}}}}HKh}\",[]]Bj[\"{{{AIEh{B@Ob}}{A@l{{Nn{LFn}}}}}HKh}\",[]]Bj[\"{{{AIEh{AOJj}}{A@l{{Nn{LFn}}}}}HKh}\",[]]o[\"{A@dCNj}\",[]]Ak[\"{{{AIEh{AJAf}}}BCGl}\",[]]Ak[\"{{{AIEh{ABNj}}}BAJj}\",[]]Aj[\"{{{AIEh{CLh}}}AHM`}\",[]]An[\"{{{AIEh{CCbAJAh}}}BCGn}\",[]]Ce[\"{{{AIEh{CCbAJDb}}{LGn{LJ`}}}{{AIEh{CCbAJDb}}}}\",[]]Ce[\"{{{AIEh{CCbAJDd}}{LGn{LJ`}}}{{AIEh{CCbAJDd}}}}\",[]]Ck[\"{{{AIEh{CCbAJEd}}{AIEh{{LB`{Mn}}}}}{{LHh{LDfAJG`}}}}\",[]]Ck[\"{{{AIEh{CCbAJEf}}{AIEh{{LB`{Mn}}}}}{{LHh{LDfAJGb}}}}\",[]]Bl[\"{{{AIEh{BFHh}}{AIEh{CCbc}}}HKhLEl}\",[\"W\"]]Aj[\"{{{AIEh{ABNj}}}LDn}\",[]]An[\"{ABOb{{LHh{AJAbBCGd}}}}\",[]]Bh[\"{{{AIEh{CCbOMn}}Of}{{LGn{ACAj}}}}\",[]]Fh[\"{{{AIEh{CCbABNl}}ABOdOJh{AIEh{CCb{AAb{Mn}}}}{LGn{{Nf{B@Nh}}}}}{{LHh{{LDd{BDOlAJAh}}{Nn{AOGb}}}}}}\",[]]Am[\"{AIEh{{AIEh{c}}}{}}\",[\"T\"]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000o[\"{ONjLDf}\",[]]o[\"{ONlLDf}\",[]]A`[\"{A@dAOGf}\",[]]Bc[\"{{AJEjBBG`A@d}{{LHl{AOGh}}}}\",[]]Aj[\"{AJEj{{LHj{ABNj}}}}\",[]]B`[\"{{}{{LHh{HKh{Nn{JHh}}}}}}\",[]]Ak[\"{{{AIEh{AJAf}}}BCGd}\",[]]Be[\"{{{AIEh{ABNl}}}{{AIEh{BBHh}}}}\",[]]o[\"{MnBFCd}\",[]]A`[\"{AJBbCJ`}\",[]]o[\"{B@NdNf}\",[]]o[\"{MnBFCf}\",[]]A`[\"{AJBdCJ`}\",[]]o[\"{B@NhNf}\",[]]A`[\"{BBL`LGn}\",[]]Bl[\"{{{AIEh{CCbc}}}{{LHh{LJdBANh}}}O`}\",[\"B\"]]Bl[\"{{{AIEh{CCbc}}}{{LHh{LHbBANh}}}O`}\",[\"B\"]]Bm[\"{{{AIEh{CCbc}}}{{LHh{AHJnBANh}}}O`}\",[\"B\"]]Bm[\"{{{AIEh{CCbc}}}{{LHh{BFCdBANh}}}O`}\",[\"B\"]]Bm[\"{{{AIEh{CCbc}}}{{LHh{ACAhBANh}}}O`}\",[\"B\"]]Bh[\"{{{AIEh{CCbc}}}{{LI`{LJf}}}O`}\",[\"B\"]]Bh[\"{{{AIEh{CCbc}}}{{LI`{LHd}}}O`}\",[\"B\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{AHK`}}}O`}\",[\"B\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{AJC`}}}O`}\",[\"B\"]]Ek[\"{{{AIEh{CCb{LFl{ABMd}}}}{AIEh{c}}{AIEh{{LB`{CIn}}}}CNj}{{LHh{BCHnBEKj}}}{BEOlJKl}}\",[\"\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{BFCf}}}O`}\",[\"B\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{ACAj}}}O`}\",[\"B\"]]Bi[\"{{{AIEh{CCbc}}}{{LI`{AHJb}}}O`}\",[\"B\"]]A`[\"{ACAdLGn}\",[]]Bk[\"{{{AIEh{LJd}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bk[\"{{{AIEh{LHb}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{AHJn}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{BFCd}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{ACAh}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bk[\"{{{AIEh{LJf}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bk[\"{{{AIEh{LHd}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{AHK`}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{AJC`}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{ABMn}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{BFCf}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{ACAj}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bl[\"{{{AIEh{AHJh}}{AIEh{CCbc}}}HKhLEl}\",[\"B\"]]Bj[\"{{{AIEh{CCbAJEd}}}{{LHh{HKhB@I`}}}}\",[]]Bj[\"{{{AIEh{CCbAJEf}}}{{LHh{HKhAOHn}}}}\",[]]An[\"{{{AIEh{AOKf}}ABNf}HKh}\",[]]Ea[\"{{{AIEh{CCbABNl}}OJhAHJl{LGn{B@Jn}}ABMd{AIEh{CCb{AAb{Mn}}}}}{{LGn{BAJf}}}}\",[]]o[\"{CKlOJj}\",[]]o[\"{CKnOJl}\",[]]A`[\"{ABObHKh}\",[]]Ba[\"{{{AIEh{CCbABNl}}ABOd}HKh}\",[]]Bh[\"{{{AIEh{AJFj}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{BBJb}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{BEBn}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{AJFl}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{BBJd}}{AIEh{CIj}}JGb}HKh}\",[]]Bh[\"{{{AIEh{BEC`}}{AIEh{CIj}}JGb}HKh}\",[]]A`[\"{AHIjCNj}\",[]]o[\"{JGdCJ`}\",[]]o[\"{JGfCJ`}\",[]]Ce[\"{{{AIEh{CCbAJAj}}OJhOJhCJ`CNj{AIEh{B@Mj}}}HKh}\",[]]Cc[\"{{{AIEh{CCbNh}}OJhOJhCJ`CNj{AIEh{B@Mj}}}HKh}\",[]]Cd[\"{{{AIEh{CCbJGl}}OJhOJhCJ`CNj{AIEh{B@Mj}}}HKh}\",[]]Cd[\"{{{AIEh{CCbOKd}}OJhOJhCJ`CNj{AIEh{B@Mj}}}HKh}\",[]]Ce[\"{{{AIEh{CCbAJAl}}OJhOJhCJ`CNj{AIEh{B@Ml}}}HKh}\",[]]Cc[\"{{{AIEh{CCbNj}}OJhOJhCJ`CNj{AIEh{B@Ml}}}HKh}\",[]]Cd[\"{{{AIEh{CCbJGn}}OJhOJhCJ`CNj{AIEh{B@Ml}}}HKh}\",[]]Cd[\"{{{AIEh{CCbOKf}}OJhOJhCJ`CNj{AIEh{B@Ml}}}HKh}\",[]]o[\"{CKlOJj}\",[]]o[\"{CKnOJl}\",[]]o[\"{BEChMn}\",[]]A`[\"{BCFnJGb}\",[]]A`[\"{BDO`JGb}\",[]]A`[\"{BCGbJGb}\",[]]A`[\"{BDOdJGb}\",[]]A`[\"{BBL`LJ`}\",[]]Aa[\"{BBGhBCGf}\",[]]Aa[\"{AHHbBEKn}\",[]]Bg[\"{{{AIEh{ABNj}}AHMn}{{LHj{HKh}}}}\",[]]A`[\"{ABObHKh}\",[]]Cf[\"{{{AIEh{CCbABNl}}ABOd{AIEh{CCb{AAb{Mn}}}}}ACBn}\",[]]l[\"{OJj}\",[]]Aa[\"{AHJlAJEj}\",[]]l[\"{OJl}\",[]]An[\"{{ABNhA@d}{{LHl{HKh}}}}\",[]]B`[\"{{B@NdAJEj}{{LHj{ABNj}}}}\",[]]Bb[\"{B@Nb{{LHh{HKh{Nn{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BEL`}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BBKf}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{AHMf}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{AJDl}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BBKd}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{AJG`}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{B@O`}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BCGd}}}{{LGn{{AIEh{JHh}}}}}}\",[]]Bk[\"{{{AIEh{BCGf}}}{{LGn{{AIEh{JHh}}}}}}\",[]]A`[\"{ACBlLGn}\",[]]A`[\"{ACBnLGn}\",[]]A`[\"{ACC`LGn}\",[]]Bg[\"{{{AIEh{CLh}}}{{LHh{AJCnAJ@h}}}}\",[]]Aa[\"{B@MfAJD`}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]A`[\"{ACAdLDf}\",[]]Aa[\"{AHM`ACCb}\",[]]Aa[\"{BCGlACCb}\",[]]Aa[\"{AHMbACCd}\",[]]Aa[\"{BCGnACCd}\",[]]3210Dh[\"{{{AIEh{OJb}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAOHb}}}}\",[]]Dh[\"{{{AIEh{OJd}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAOHd}}}}\",[]]Aj[\"{{{AIEh{AJAj}}}CJ`}\",[]]Ah[\"{{{AIEh{Nh}}}CJ`}\",[]]Ai[\"{{{AIEh{JGl}}}CJ`}\",[]]Ai[\"{{{AIEh{OKd}}}CJ`}\",[]]Aj[\"{{{AIEh{AJAl}}}CJ`}\",[]]Ah[\"{{{AIEh{Nj}}}CJ`}\",[]]Ai[\"{{{AIEh{JGn}}}CJ`}\",[]]Ai[\"{{{AIEh{OKf}}}CJ`}\",[]]Aj[\"{{{AIEh{BGEn}}}LDf}\",[]]Aj[\"{{{AIEh{BGF`}}}LDf}\",[]]Aj[\"{{{AIEh{BHFd}}}LDf}\",[]]Aj[\"{{{AIEh{BHFn}}}LDf}\",[]]o[\"{A@dLDf}\",[]]n[\"{{}OId}\",[]]0000o[\"{ObABMh}\",[]]Ba[\"{{AIEh{AIEh{c}}}AC@j{}}\",[\"K\"]]0000000000000000000Cg[\"{{{AIEh{ABNj}}AJEj{AIEh{CIj}}}{{LHh{AJAbB@Il}}}}\",[]]Dl[\"{{{AIEh{CCbABNl}}OJhB@HhAJEj{AIEh{CIj}}}{{LHh{{LDd{BDOlAJAh}}B@In}}}}\",[]]Dm[\"{{{AIEh{AHLb}}LHbCJ`{AIEh{{LB`{Mn}}}}{AIEh{CCbABMd}}}{{LHh{HKhAOHb}}}}\",[]]Ca[\"{{{AIEh{AHKd}}LDf{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]Dm[\"{{{AIEh{AHLd}}LHdCJ`{AIEh{{LB`{Mn}}}}{AIEh{CCbABMd}}}{{LHh{HKhAOHd}}}}\",[]]Ca[\"{{{AIEh{AHKf}}LDf{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]o[\"{{}AOKd}\",[]]n[\"{{}JKn}\",[]]o[\"{{}AOGh}\",[]]o[\"{{}BAIh}\",[]]o[\"{{}BAJj}\",[]]n[\"{{}LJd}\",[]]n[\"{{}LHb}\",[]]o[\"{{}ACCb}\",[]]o[\"{{}AJBb}\",[]]o[\"{{}AHM`}\",[]]o[\"{{}BCGl}\",[]]n[\"{{}ONj}\",[]]o[\"{{}B@I`}\",[]]o[\"{{}BCJb}\",[]]o[\"{{}BEO`}\",[]]o[\"{{}BF@n}\",[]]o[\"{{}AOI`}\",[]]o[\"{{}BBHf}\",[]]o[\"{{}BGG`}\",[]]o[\"{{}BEBn}\",[]]o[\"{{}AHId}\",[]]o[\"{{}AOHf}\",[]]o[\"{{}BALl}\",[]]o[\"{{}BEJh}\",[]]o[\"{{}BAIj}\",[]]o[\"{{}BHFd}\",[]]n[\"{{}LJf}\",[]]n[\"{{}LHd}\",[]]o[\"{{}AJD`}\",[]]o[\"{{}AJ@n}\",[]]o[\"{{}ACCd}\",[]]o[\"{{}AJBd}\",[]]o[\"{{}AHMb}\",[]]o[\"{{}BCGn}\",[]]n[\"{{}ONl}\",[]]o[\"{{}BBKh}\",[]]o[\"{{}B@Ih}\",[]]o[\"{{}BCJd}\",[]]o[\"{{}BEOb}\",[]]o[\"{{}BFA`}\",[]]o[\"{{}AOIb}\",[]]o[\"{{}BBHh}\",[]]o[\"{{}BGGb}\",[]]o[\"{{}BHFn}\",[]]o[\"{{}BEC`}\",[]]o[\"{{}AHIf}\",[]]o[\"{{}AOHh}\",[]]o[\"{{}BALn}\",[]]o[\"{{}BEJj}\",[]]o[\"{{}ACAd}\",[]]n[\"{{}JL`}\",[]]o[\"{{}BCHf}\",[]]o[\"{{}BAJh}\",[]]Ak[\"{{{AIEh{BAMb}}}B@Jd}\",[]]Ak[\"{{{AIEh{BCHn}}}B@Jd}\",[]]Aa[\"{BGK`B@Jd}\",[]]Aa[\"{BFChB@Jd}\",[]]A`[\"{CL`B@Jd}\",[]]A`[\"{JKdB@Jd}\",[]]A`[\"{JKhB@Jd}\",[]]Aa[\"{BEChB@Jd}\",[]]Cg[\"{{{AIEh{AHLb}}LHbCJ`{AIEh{CCb{LB`{Mn}}}}LDf}HKh}\",[]]Ca[\"{{{AIEh{AHKd}}LDf{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]Cg[\"{{{AIEh{AHLd}}LHdCJ`{AIEh{CCb{LB`{Mn}}}}LDf}HKh}\",[]]Ca[\"{{{AIEh{AHKf}}LDf{AIEh{CCb{LB`{Mn}}}}}HKh}\",[]]Aj[\"{{{AIEh{AJDh}}}CNj}\",[]]Aj[\"{{{AIEh{BFHj}}}CNj}\",[]]Ak[\"{{{AIEh{AJAj}}}BEJh}\",[]]Ai[\"{{{AIEh{Nh}}}BEJh}\",[]]Aj[\"{{{AIEh{JGl}}}BEJh}\",[]]Aj[\"{{{AIEh{OKd}}}BEJh}\",[]]Ak[\"{{{AIEh{AJAl}}}BEJj}\",[]]Ai[\"{{{AIEh{Nj}}}BEJj}\",[]]Aj[\"{{{AIEh{JGn}}}BEJj}\",[]]Aj[\"{{{AIEh{OKf}}}BEJj}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CIl}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CIl}{{AIEh{CCbBCJd}}}}\",[]]Bf[\"{{{AIEh{CCbAJAj}}OJhCJ`CJ`}HKh}\",[]]Bd[\"{{{AIEh{CCbNh}}OJhCJ`CJ`}HKh}\",[]]Bf[\"{{{AIEh{CCbAJAl}}OJhCJ`CJ`}HKh}\",[]]Bd[\"{{{AIEh{CCbNj}}OJhCJ`CJ`}HKh}\",[]]Aj[\"{{{AIEh{AJAf}}}LGd}\",[]]Bc[\"{{{AIEh{AC@h}}}{{LGn{LHb}}}}\",[]]Aa[\"{BGK`B@Jd}\",[]]Aa[\"{BFChB@Jd}\",[]]A`[\"{CL`B@Jd}\",[]]A`[\"{JKdB@Jd}\",[]]Aa[\"{BEChB@Jd}\",[]]Aj[\"{{{AIEh{AJEd}}}OMf}\",[]]Bn[\"{{{AIEh{AJEf}}}{{LHh{{LGn{LJf}}B@Ih}}}}\",[]]o[\"{A@dLDf}\",[]]o[\"{JKnLDf}\",[]]Am[\"{{{AIEh{CCbAJAh}}}OMn}\",[]]Aj[\"{{{AIEh{AHLb}}}LDf}\",[]]Aj[\"{{{AIEh{AHLd}}}LDf}\",[]]A`[\"{AIEhLJb}\",[]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bd[\"{{{AIEh{BG@d}}}{{LGn{AJAf}}}}\",[]]Bc[\"{{{AIEh{BBLd}}}{{LGn{CLh}}}}\",[]]Bn[\"{{{AIEh{CCbB@Hd}}CIn}{{AIEh{CCbB@Hd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Hh}}CIn}{{AIEh{CCbB@Hh}}}}\",[]]A`[\"{BGK`CIn}\",[]]A`[\"{BFChCIn}\",[]]o[\"{CL`CIn}\",[]]o[\"{JKdCIn}\",[]]A`[\"{AHIjLGn}\",[]]Aa[\"{ACC`AIEh}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Aa[\"{BBKjABNf}\",[]]A`[\"{LEnBBKh}\",[]]Aa[\"{BCGlAJBb}\",[]]Aa[\"{BCGnAJBd}\",[]]10Bg[\"{{{AIEh{CCbc}}LDf}B@Jb{O`JKl}}\",[\"\"]]Bg[\"{{{AIEh{CCbc}}LDf}B@Jd{O`JKl}}\",[\"\"]]o[\"{{}BCI`}\",[]]o[\"{{}BCIb}\",[]]A`[\"{CJ`BHFd}\",[]]Cd[\"{{{AIEh{CIj}}}{{LHl{AOGfc}}}{}}\",[\"FromStr::Err\"]]o[\"{CInLJd}\",[]]o[\"{CInLJf}\",[]]Al[\"{CJ`{{LHh{LJdBFOn}}}}\",[]]Al[\"{CJ`{{LHh{LJfBG@`}}}}\",[]]Aa[\"{BFNhAOH`}\",[]]Aa[\"{BHJbBAKf}\",[]]Aa[\"{BFNjAOH`}\",[]]Aa[\"{BHJdBAKf}\",[]]Af[\"{{}{{LGn{Ab}}}}\",[]]0000Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]Bo[\"{{{AIEh{CCbBF@n}}ABNf}{{AIEh{CCbBF@n}}}}\",[]]Bo[\"{{{AIEh{CCbBFA`}}ABNf}{{AIEh{CCbBFA`}}}}\",[]]Ao[\"{{{Nn{AJAj}}}{{Nn{Nd}}}}\",[]]Am[\"{{{Nn{Nh}}}{{Nn{Nd}}}}\",[]]An[\"{{{Nn{JGl}}}{{Nn{Nd}}}}\",[]]An[\"{{{Nn{OKd}}}{{Nn{Nd}}}}\",[]]Ao[\"{{{Nn{AJAl}}}{{Nn{Nd}}}}\",[]]Am[\"{{{Nn{Nj}}}{{Nn{Nd}}}}\",[]]An[\"{{{Nn{JGn}}}{{Nn{Nd}}}}\",[]]An[\"{{{Nn{OKf}}}{{Nn{Nd}}}}\",[]]Aj[\"{{{AIEh{BG@d}}}CNj}\",[]]Bo[\"{{{AIEh{CCbBGG`}}ABNf}{{AIEh{CCbBGG`}}}}\",[]]Bo[\"{{{AIEh{CCbBGGb}}ABNf}{{AIEh{CCbBGGb}}}}\",[]]Bc[\"{{{AIEh{AJAb}}}{{LGn{LGb}}}}\",[]]Bc[\"{{{AIEh{AJAf}}}{{LGn{LGb}}}}\",[]]Bc[\"{{{AIEh{ABOb}}}{{LGn{LGb}}}}\",[]]Bc[\"{{{AIEh{ABOd}}}{{LGn{LGb}}}}\",[]]A`[\"{AHJlLGn}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bc[\"{{{AIEh{AHJ`}}}{{LGn{LDf}}}}\",[]]Am[\"{{{AIEh{AOKf}}LDf}HKh}\",[]]Aj[\"{{{AIEh{AJAf}}}OKj}\",[]]Bg[\"{{{AIEh{AJEd}}}{{LHh{CAlB@I`}}}}\",[]]Bg[\"{{{AIEh{AJEf}}}{{LHh{CAlB@Ih}}}}\",[]]A`[\"{BAJnLGn}\",[]]A`[\"{BAK`LGn}\",[]]A`[\"{AHIjLGn}\",[]]A`[\"{AOGbLGn}\",[]]Ck[\"{{{AIEh{CCbBBHf}}{LGn{{JLf{Mn}}}}}{{AIEh{CCbBBHf}}}}\",[]]Ck[\"{{{AIEh{CCbBBHh}}{LGn{{JLf{Mn}}}}}{{AIEh{CCbBBHh}}}}\",[]]A`[\"{BEJhLGn}\",[]]A`[\"{BEJjLGn}\",[]]Ac[\"{AIEhc{}}\",[\"T\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Ao[\"{c{{LHh{e}}}{}{}}\",[\"U\",\"T\"]]0000000000000000000000000000000000000000000000Al[\"{CJ`{{LHh{LJdBFOn}}}}\",[]]Al[\"{HKf{{LHh{LJdBFOn}}}}\",[]]Al[\"{LDf{{LHh{LJdBFOn}}}}\",[]]333333333333333Aj[\"{ABNf{{LHh{AOI`}}}}\",[]]4444444Ai[\"{CJ`{{LHh{AHJn}}}}\",[]]555555555555555555555555555Bb[\"{{{Nf{B@H`}}}{{LHh{BEBf}}}}\",[]]Aj[\"{B@H`{{LHh{BEBf}}}}\",[]]7Bb[\"{{{Nf{B@N`}}}{{LHh{BEBj}}}}\",[]]Aj[\"{B@N`{{LHh{BEBj}}}}\",[]]999999999999999999Al[\"{CJ`{{LHh{LJfBG@`}}}}\",[]]Al[\"{LDf{{LHh{LJfBG@`}}}}\",[]]Al[\"{HKf{{LHh{LJfBG@`}}}}\",[]]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Bm[\"{B@H`{{LHh{BEBhc}}}{}}\",[\"TryFrom::Error\"]]Ce[\"{{{Nf{B@H`}}}{{LHh{BEBhc}}}{}}\",[\"TryFrom::Error\"]]Ce[\"{{{Nf{B@N`}}}{{LHh{BEBlc}}}{}}\",[\"TryFrom::Error\"]]Bm[\"{B@N`{{LHh{BEBlc}}}{}}\",[\"TryFrom::Error\"]]Ao[\"{c{{LHh{e}}}{}{}}\",[\"U\",\"T\"]]000000000000000000000000000Aj[\"{{}{{LHh{c}}}{}}\",[\"U\"]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Cd[\"{{{A@l{{AIEh{CCbc}}}}{AIEh{CCbOIf}}}CM`{}}\",[\"F\"]]000000000Cc[\"{{{AIEh{BBLb}}AJFn{AIEh{ACC`}}}{{LHj{HKh}}}}\",[]]Bk[\"{{{AIEh{BGEn}}B@Jb}{{LHh{HKhAJBh}}}}\",[]]Bk[\"{{{AIEh{BGF`}}B@Jd}{{LHh{HKhAJBj}}}}\",[]]0Bk[\"{{{AIEh{BHFd}}B@Jd}{{LHh{HKhAJBj}}}}\",[]]Ak[\"{{{AIEh{AJAf}}}ABMb}\",[]]Bi[\"{{{AIEh{CCbB@Od}}}{{LHh{LJdJId}}}}\",[]]Bi[\"{{{AIEh{CCbB@Od}}}{{LHh{CMfJId}}}}\",[]]Bh[\"{{{AIEh{CCbB@Od}}}{{LHh{OdJId}}}}\",[]]Bj[\"{{{AIEh{CCbB@Od}}}{{LHh{ACAhJId}}}}\",[]]Bf[\"{{{AIEh{CCbB@Od}}}{{LHn{LJf}}}}\",[]]Bf[\"{{{AIEh{CCbB@Od}}}{{LHn{CMh}}}}\",[]]Be[\"{{{AIEh{CCbB@Od}}}{{LHn{Of}}}}\",[]]Bg[\"{{{AIEh{CCbB@Od}}}{{LHn{ACAj}}}}\",[]]Aa[\"{AOGfBFOl}\",[]]Bc[\"{{{AIEh{AJAj}}}{{Nn{AJAj}}}}\",[]]Ba[\"{{{AIEh{Nh}}}{{Nn{AJAj}}}}\",[]]Bb[\"{{{AIEh{JGl}}}{{Nn{AJAj}}}}\",[]]Bb[\"{{{AIEh{OKd}}}{{Nn{AJAj}}}}\",[]]Bc[\"{{{AIEh{AJAl}}}{{Nn{AJAl}}}}\",[]]Ba[\"{{{AIEh{Nj}}}{{Nn{AJAl}}}}\",[]]Bb[\"{{{AIEh{JGn}}}{{Nn{AJAl}}}}\",[]]Bb[\"{{{AIEh{OKf}}}{{Nn{AJAl}}}}\",[]]A`[\"{ACCbCJ`}\",[]]An[\"{{{AIEh{CCbAJAh}}}AHJ`}\",[]]A`[\"{ACCdCJ`}\",[]]C`[\"{{{AIEh{CCbB@Jb}}}{{AIEh{CCb{LB`{Mn}}}}}}\",[]]C`[\"{{{AIEh{CCbB@Jd}}}{{AIEh{CCb{LB`{Mn}}}}}}\",[]]Ah[\"{Mn{{LGn{B@Jl}}}}\",[]]Ah[\"{Mn{{LGn{B@Jn}}}}\",[]]Ah[\"{Mn{{LGn{B@K`}}}}\",[]]A`[\"{ACAhCMf}\",[]]A`[\"{ACAjCMh}\",[]]Bi[\"{AJAb{{LHh{{LDd{AJAfBCJl}}AJAb}}}}\",[]]o[\"{CMfCNj}\",[]]o[\"{CMhCNj}\",[]]Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]21Aj[\"{{{AIEh{ABOb}}}CNj}\",[]]Aj[\"{{{AIEh{ABOd}}}CNj}\",[]]Bn[\"{{{AIEh{CCbB@Nd}}CNj}{{AIEh{CCbB@Nd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nh}}CNj}{{AIEh{CCbB@Nh}}}}\",[]]Bl[\"{{{AIEh{OLl}}OJh}{{A@l{{Nn{AJ@`}}}}}}\",[]]Bm[\"{{{AIEh{B@Ob}}OJh}{{A@l{{Nn{AJ@`}}}}}}\",[]]Bm[\"{{{AIEh{AOJj}}OJh}{{A@l{{Nn{AJ@`}}}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Ak[\"{{{AIEh{AJAf}}}AC@f}\",[]]Bc[\"{{{AIEh{AJAf}}AJEjAJCn}AC@h}\",[]]Ce[\"{{{AIEh{CCbAJAh}}AHJlAJD`OJh}{{LHh{LHdAHLh}}}}\",[]]43Bm[\"{{{AIEh{CCbAJAh}}LHd}{{LHh{HKhAJ@n}}}}\",[]]E`[\"{{{A@l{{AIEh{CCbBDNl}}}}{AIEh{CCbOIf}}}{{CM`{{LGn{c}}}}}{}}\",[\"Stream::Item\"]]E`[\"{{{A@l{{AIEh{CCbAJDh}}}}{AIEh{CCbOIf}}{AIEh{CCbOLf}}}{{CM`{{LHj{HKh}}}}}}\",[]]Ef[\"{{{A@l{{AIEh{CCbAJDh}}}}{AIEh{CCbOIf}}{AIEh{CCb{LB`{Mn}}}}}{{CM`{{LHj{LDf}}}}}}\",[]]Ec[\"{{{AIEh{CCbAJDh}}{AIEh{CCbOIf}}{AIEh{CCb{LB`{Mn}}}}}{{CM`{{LHh{LDfAHMf}}}}}}\",[]]Fg[\"{{{AIEh{CCbBBFn}}{AIEh{CCbOIf}}{AIEh{CCb{LB`{AJBl}}}}{AIEh{CCb{LB`{ACAd}}}}}{{CM`{{LHj{LDf}}}}}}\",[]]Dn[\"{{{A@l{{AIEh{CCbAHMl}}}}{AIEh{ACC`}}{AIEh{CCbOIf}}}{{CM`{{LHj{HKh}}}}}}\",[]];:Cd[\"{{{AIEh{CCbBBHf}}{Nf{OJb}}}{{AIEh{CCbBBHf}}}}\",[]]Cd[\"{{{AIEh{CCbBBHh}}{Nf{OJd}}}{{AIEh{CCbBBHh}}}}\",[]]Cj[\"{{{AIEh{B@Nf}}CInB@Jb{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Cj[\"{{{AIEh{BEBj}}CInB@Jb{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Cj[\"{{{AIEh{B@Nj}}CInB@Jd{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Cj[\"{{{AIEh{BEBl}}CInB@Jd{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Cj[\"{{{AIEh{BH@n}}CInB@J`{AIEh{{LB`{Mn}}}}}{{JLf{Mn}}}}\",[]]Bb[\"{LDf{{LDd{LDf{LGn{LDf}}}}}}\",[]]000Aj[\"{{{AIEh{AJAf}}}LDf}\",[]]A`[\"{AIEhLJ`}\",[]]0000000000000000000000000000000000000000000000000000000000000Ce[\"{{{AIEh{CCbB@Nd}}{Nf{BEJl}}}{{AIEh{CCbB@Nd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Nh}}{Nf{BEJn}}}{{AIEh{CCbB@Nh}}}}\",[]]A`[\"{BGK`JJj}\",[]]o[\"{B@NdNf}\",[]]o[\"{B@NhNf}\",[]]Aj[\"{{{AIEh{ABNj}}}HKh}\",[]]Ck[\"{{{AIEh{CCbAJEd}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhAJG`}}}}\",[]]n[\"{{}LDf}\",[]]Ak[\"{{{AIEh{AJAf}}}AHHf}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]Bi[\"{{{AIEh{CCb}}}{{AIEh{CCbc}}}{}}\",[\"T\"]]0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Bc[\"{{AIEh{AIEh{CCbc}}}HKh{}}\",[\"T\"]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Cc[\"{{{AIEh{CCbAJAh}}OJhLHdLJf}{{LHh{HKhBBGd}}}}\",[]]A`[\"{AHIjCNj}\",[]]B`[\"{{AIEh{AIEh{c}}}CNj{}}\",[\"K\"]]00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Aa[\"{BCFnBFCd}\",[]]A`[\"{BDO`LJd}\",[]]Aa[\"{BCGbBFCf}\",[]]A`[\"{BDOdLJf}\",[]]A`[\"{BEIlLJf}\",[]]A`[\"{BCIdLJf}\",[]]o[\"{OMbLJf}\",[]]Aa[\"{BCFnAJBn}\",[]]Aa[\"{BCGbAJC`}\",[]]o[\"{LJdCJ`}\",[]]o[\"{LJfCJ`}\",[]]Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]Aj[\"{{{AIEh{BAJh}}}CNj}\",[]]Bd[\"{{{AIEh{BBFn}}}{{LHj{AJEj}}}}\",[]]Bd[\"{{{AIEh{ABNj}}}{{LHj{AJEj}}}}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]Cb[\"{{{AIEh{BCHf}}{AIEh{AJEb}}CJ`}{{Nf{AOKf}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]Bg[\"{{{AIEh{AJAf}}LHb}{{LGn{AHM`}}}}\",[]]Bj[\"{{{AIEh{CCbAJAh}}LHd}{{LGn{AHMb}}}}\",[]]Aa[\"{AHJdAHMb}\",[]]Db[\"{{{A@l{{AIEh{CCbAJEd}}}}{AIEh{CCbOIf}}}{{CM`{{LHj{HKh}}}}}}\",[]]00Ec[\"{{{A@l{{AIEh{CCbAJEd}}}}{AIEh{CCbOIf}}{AIEh{{LB`{Mn}}}}}{{CM`{{LHj{LDf}}}}}}\",[]]Eg[\"{{{A@l{{AIEh{CCbAJEd}}}}{AIEh{CCbOIf}}{AIEh{{LB`{Mn}}}}}{{CM`{{LHh{LDfAJG`}}}}}}\",[]]1Bm[\"{{{AIEh{JL`}}{AIEh{CLf}}}{{LHj{HKh}}}}\",[]]Cd[\"{{{AIEh{CCbAJDh}}LDf}{{LHh{{LGn{JGd}}AHMf}}}}\",[]]Cd[\"{{{AIEh{CCbBFHj}}LDf}{{LHh{{LGn{JGd}}AHMf}}}}\",[]]Cn[\"{{{AIEh{CCbAJDh}}{AIEh{CCb{LB`{Mn}}}}}{{LHh{HKhBBKd}}}}\",[]]Bj[\"{{{AIEh{CLh}}AJCn}{{LHh{HKhBFBl}}}}\",[]]Bn[\"{{{AIEh{CCbAJDb}}OJh}{{AIEh{CCbAJDb}}}}\",[]]Bn[\"{{{AIEh{CCbAJDd}}OJh}{{AIEh{CCbAJDd}}}}\",[]]A`[\"{BBKjAE`}\",[]]o[\"{JKnCJ`}\",[]]o[\"{{}AJEj}\",[]]0o[\"{{}AIEh}\",[]]Bj[\"{{ABOb{Nf{B@Nd}}}{{LHh{AJAbBCGd}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bh[\"{{{AIEh{AHIj}}AJEj}{{LHl{AHMn}}}}\",[]]A`[\"{AHM`CIl}\",[]]Aj[\"{{{AIEh{AJAh}}}CIl}\",[]]A`[\"{AHMbCIl}\",[]]Ce[\"{{{AIEh{CCbAJDb}}{LGn{LJ`}}}{{AIEh{CCbAJDb}}}}\",[]]Ce[\"{{{AIEh{CCbAJDd}}{LGn{LJ`}}}{{AIEh{CCbAJDd}}}}\",[]]Aa[\"{ACBlAJEj}\",[]]Aa[\"{ACBnAJEj}\",[]]Aa[\"{ACC`AJEj}\",[]]o[\"{A@dCIl}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CIl}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CIl}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjCIl}\",[]]Bo[\"{{{AIEh{CCbBCJb}}ABNf}{{AIEh{CCbBCJb}}}}\",[]]Bo[\"{{{AIEh{CCbBCJd}}ABNf}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjLGn}\",[]]k[\"{{}}\",[]]0000000000Bh[\"{ABObc{}}\",[\"IntoFuture::IntoFuture\"]]11A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]o[\"{A@dLDf}\",[]]Ao[\"{{AIEhc}{{OJn{c}}}{}}\",[\"S\"]]0C`[\"{{{AIEh{CCbAJAj}}OJhCJ`CNj{LGn{CJ`}}}HKh}\",[]]Bn[\"{{{AIEh{CCbNh}}OJhCJ`CNj{LGn{CJ`}}}HKh}\",[]]C`[\"{{{AIEh{CCbAJAl}}OJhCJ`CNj{LGn{CJ`}}}HKh}\",[]]Bn[\"{{{AIEh{CCbNj}}OJhCJ`CNj{LGn{CJ`}}}HKh}\",[]]Bk[\"{{{AIEh{CCbJL`}}OJh{AIEh{BCHf}}}HKh}\",[]]A`[\"{BEJhLGn}\",[]]A`[\"{BEJjLGn}\",[]]Bn[\"{{{AIEh{LJd}}{AIEh{LJd}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{LHb}}{AIEh{LHb}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{AOI`}}{AIEh{AOI`}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{B@Jb}}{AIEh{B@Jb}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{CMf}}{AIEh{CMf}}}{{LGn{AC@j}}}}\",[]]Bl[\"{{{AIEh{Od}}{AIEh{Od}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{ACAh}}{AIEh{ACAh}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{LJf}}{AIEh{LJf}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{BELb}}{AIEh{BELb}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{LHd}}{AIEh{LHd}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{AHMh}}{AIEh{AHMh}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{BAMl}}{AIEh{BAMl}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{AJGb}}{AIEh{AJGb}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{AOIb}}{AIEh{AOIb}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{BDOl}}{AIEh{BDOl}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{BEKj}}{AIEh{BEKj}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{B@Jd}}{AIEh{B@Jd}}}{{LGn{AC@j}}}}\",[]]Bn[\"{{{AIEh{CMh}}{AIEh{CMh}}}{{LGn{AC@j}}}}\",[]]Bl[\"{{{AIEh{Of}}{AIEh{Of}}}{{LGn{AC@j}}}}\",[]]C`[\"{{{AIEh{ACAj}}{AIEh{ACAj}}}{{LGn{AC@j}}}}\",[]]Be[\"{{{AIEh{AJAf}}}{{ACA`{AHLl}}}}\",[]]Bk[\"{{{AIEh{AJAh}}LHd}{{LHh{AJD`AJ@n}}}}\",[]]Df[\"{{{AIEh{CCbAJDh}}{AIEh{CCb{LB`{JGb}}}}}{{LHh{{LGn{LDf}}AHMf}}}}\",[]]Cc[\"{{{AIEh{CCbAJDh}}LDf}{{LHh{{AAb{Mn}}BBKf}}}}\",[]]Bb[\"{{{AIEh{CCbAJAh}}ACAj}AJDj}\",[]]Aj[\"{{{AIEh{AHKd}}}LDf}\",[]]Aj[\"{{{AIEh{AHKf}}}LDf}\",[]]Bb[\"{{{AIEh{CCbAJAh}}ACAj}AJEf}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CJ`}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CJ`}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjLGn}\",[]]A`[\"{BAJnLGn}\",[]]A`[\"{BAK`LGn}\",[]]Ce[\"{{{AIEh{CCbB@Nd}}{Nf{AJFb}}}{{AIEh{CCbB@Nd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Nh}}{Nf{AJFd}}}{{AIEh{CCbB@Nh}}}}\",[]]Ce[\"{{{AIEh{CCbB@Hd}}{Nf{AJFj}}}{{AIEh{CCbB@Hd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Hh}}{Nf{AJFl}}}{{AIEh{CCbB@Hh}}}}\",[]]o[\"{A@dCJ`}\",[]]Bn[\"{{{AIEh{CCbBF@n}}CIl}{{AIEh{CCbBF@n}}}}\",[]]Bn[\"{{{AIEh{CCbBFA`}}CIl}{{AIEh{CCbBFA`}}}}\",[]]Ak[\"{{{AIEh{AJAf}}}BG@d}\",[]]Aj[\"{{{AIEh{CLh}}}BBLd}\",[]]Ai[\"{{{Nf{B@Nf}}}B@Nd}\",[]]Ai[\"{{{Nf{B@Nj}}}B@Nh}\",[]]Aj[\"{{BCI`c}BCI`ACBb}\",[\"\"]]Aj[\"{{BCIbc}BCIbACBb}\",[\"\"]]Bm[\"{{{AIEh{CCbAJEd}}JGb}{{LHh{HKhAJG`}}}}\",[]]n[\"{{}LGb}\",[]]o[\"{OIdOId}\",[]]0000Bd[\"{{{AIEh{BGEn}}}{{LGn{ABNf}}}}\",[]]Bd[\"{{{AIEh{BGF`}}}{{LGn{ABNf}}}}\",[]]Bd[\"{{{AIEh{BHFd}}}{{LGn{ABNf}}}}\",[]]Bd[\"{{{AIEh{BHFn}}}{{LGn{ABNf}}}}\",[]]Bd[\"{{{AIEh{AJAf}}}{{LGn{BCGd}}}}\",[]]Ck[\"{{{AIEh{ABNj}}B@HdAJEj{AIEh{CIj}}}{{LHh{AJAbB@Il}}}}\",[]]Ak[\"{{{AIEh{B@Ml}}}ABNf}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]An[\"{{AJDfCNj}{{LHl{LDf}}}}\",[]]Cj[\"{{{AIEh{OLn}}}{{LGn{{LDd{{Nn{AHKd}}{Nn{AHLb}}}}}}}}\",[]]Ck[\"{{{AIEh{AJFf}}}{{LGn{{LDd{{Nn{AHKd}}{Nn{AHLb}}}}}}}}\",[]]Cj[\"{{{AIEh{OM`}}}{{LGn{{LDd{{Nn{AHKf}}{Nn{AHLd}}}}}}}}\",[]]Ck[\"{{{AIEh{AJFh}}}{{LGn{{LDd{{Nn{AHKf}}{Nn{AHLd}}}}}}}}\",[]]A`[\"{BFNhAAb}\",[]]A`[\"{BHJbAAb}\",[]]A`[\"{BFNjAAb}\",[]]A`[\"{BHJdAAb}\",[]]An[\"{{{AIEh{CCbBGEn}}}B@Jb}\",[]]An[\"{{{AIEh{CCbBGF`}}}B@Jd}\",[]]An[\"{{{AIEh{CCbBHFd}}}B@Jd}\",[]]An[\"{{{AIEh{CCbBHFn}}}B@Jd}\",[]]Ak[\"{{{AIEh{BBLb}}}B@Lb}\",[]]Ba[\"{{{AIEh{CCbAJAh}}BCGj}HKh}\",[]]Bo[\"{{{AIEh{CCbABNl}}BDOlBAJh}{{LGn{BCGj}}}}\",[]]B`[\"{{{AIEh{OLn}}B@JbCMf}CKl}\",[]]Bn[\"{{{AIEh{B@Nf}}CInB@Jb}{{LHh{CKlBFCl}}}}\",[]]Ba[\"{{{AIEh{AJFf}}B@JbCMf}CKl}\",[]]Bn[\"{{{AIEh{BEBj}}CInB@Jb}{{LHh{CKlBFCl}}}}\",[]]B`[\"{{{AIEh{OM`}}B@JdCMh}CKn}\",[]]Bn[\"{{{AIEh{B@Nj}}CInB@Jd}{{LHh{CKnBFDb}}}}\",[]]Ba[\"{{{AIEh{AJFh}}B@JdCMh}CKn}\",[]]Bn[\"{{{AIEh{BEBl}}CInB@Jd}{{LHh{CKnBFDb}}}}\",[]]Bn[\"{{{AIEh{BH@n}}CInB@J`}{{LHh{CKnBFDb}}}}\",[]]Aj[\"{{}{{OLh{c}}}{}}\",[\"T\"]]0A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]Bn[\"{{{AIEh{CCbB@Nd}}LDf}{{AIEh{CCbB@Nd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nh}}LDf}{{AIEh{CCbB@Nh}}}}\",[]]Aj[\"{{{AIEh{BBFn}}}CNj}\",[]]0Aj[\"{{{AIEh{BBLb}}}CNj}\",[]]Bk[\"{{{AIEh{AJAh}}LHd}{{LHh{AHJlAJ@n}}}}\",[]]Cb[\"{{{AIEh{BCHf}}{AIEh{AJDf}}CJ`}{{Nf{AOKf}}}}\",[]]Ak[\"{{{AIEh{ABOb}}}B@Jb}\",[]]Ak[\"{{{AIEh{ABOd}}}B@Jd}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bf[\"{{{AIEh{CCbAJAh}}}{{LGn{OJh}}}}\",[]]Ce[\"{{{AIEh{CCbBCJb}}{Nf{AOIn}}}{{AIEh{CCbBCJb}}}}\",[]]Ce[\"{{{AIEh{CCbBCJd}}{Nf{AOJ`}}}{{AIEh{CCbBCJd}}}}\",[]]43A`[\"{ACBlLGn}\",[]]A`[\"{ACBnLGn}\",[]]A`[\"{ACC`LGn}\",[]]Ai[\"{{{AIEh{OMn}}}LDf}\",[]]Bo[\"{{{AIEh{CCbBHFd}}ABNf}{{AIEh{CCbBHFd}}}}\",[]]Bo[\"{{{AIEh{CCbBHFn}}ABNf}{{AIEh{CCbBHFn}}}}\",[]]Bj[\"{{{AIEh{AJEd}}CAl}{{LHh{HKhB@I`}}}}\",[]]Bm[\"{{{AIEh{CCbAJEf}}CAl}{{LHh{HKhB@Ih}}}}\",[]]<;A`[\"{JKnAOKd}\",[]]A`[\"{AOGhJKn}\",[]]Bi[\"{{{Nf{B@H`}}JLb}{{LHh{BEBfBFOf}}}}\",[]]Bi[\"{{{Nf{B@N`}}JLb}{{LHh{BEBjBFOf}}}}\",[]]Bi[\"{{{Nf{B@H`}}JLb}{{LHh{BEBhBFOh}}}}\",[]]Bi[\"{{{Nf{B@N`}}JLb}{{LHh{BEBlBFOh}}}}\",[]]Co[\"{{{AIEh{CCbAJEd}}{AIEh{CCb{LB`{JGb}}}}}{{LHh{ONjAJG`}}}}\",[]]Co[\"{{{AIEh{CCbAJEf}}{AIEh{CCb{LB`{JGb}}}}}{{LHh{ONlAJGb}}}}\",[]]Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]A`[\"{AHIjCNj}\",[]]E`[\"{{{AIEh{CCbBBHf}}c}{{AIEh{CCbBBHf}}}{{A`{}{{LH`{{Nn{BGEn}}}}}}CMdCMj}}\",[\"F\"]]E`[\"{{{AIEh{CCbBBHh}}c}{{AIEh{CCbBBHh}}}{{A`{}{{LH`{{Nn{BGF`}}}}}}CMdCMj}}\",[\"F\"]]Bj[\"{{{AIEh{BBFn}}}{{A@l{{Nn{AHMl}}}}}}\",[]]o[\"{A@dCJ`}\",[]]Aa[\"{AOKdAHKh}\",[]]76Aa[\"{AJDnABOb}\",[]]Aa[\"{AJE`ABOd}\",[]]Cf[\"{{{AIEh{CCbBEO`}}{LGn{ABNf}}}{{AIEh{CCbBEO`}}}}\",[]]Cf[\"{{{AIEh{CCbBEOb}}{LGn{ABNf}}}{{AIEh{CCbBEOb}}}}\",[]]9;:An[\"{{{AIEh{AOKf}}ABNf}HKh}\",[]]B`[\"{{{AIEh{CCbAJAj}}CIl}HKh}\",[]]An[\"{{{AIEh{CCbNh}}CIl}HKh}\",[]]Ao[\"{{{AIEh{CCbJGl}}CIl}HKh}\",[]]Ao[\"{{{AIEh{CCbOKd}}CIl}HKh}\",[]]B`[\"{{{AIEh{CCbAJAl}}CIl}HKh}\",[]]An[\"{{{AIEh{CCbNj}}CIl}HKh}\",[]]Ao[\"{{{AIEh{CCbJGn}}CIl}HKh}\",[]]Ao[\"{{{AIEh{CCbOKf}}CIl}HKh}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]10Bh[\"{{{AIEh{AJAf}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bg[\"{{{AIEh{OLn}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bh[\"{{{AIEh{AJFf}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bg[\"{{{AIEh{OM`}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bh[\"{{{AIEh{AJFh}}}{{LGn{{Nn{Nd}}}}}}\",[]]Dm[\"{{{AIEh{CCbAJDh}}{AIEh{CCbOIf}}{AIEh{CCbOLf}}}{{CM`{{LHh{HKhAHMf}}}}}}\",[]]Db[\"{{{A@l{{AIEh{CCbAJEd}}}}{AIEh{CCbOIf}}}{{CM`{{LHj{HKh}}}}}}\",[]]Db[\"{{{AIEh{CCbAJAh}}OJhB@Lb{AIEh{CCb{AAb{Mn}}}}}{{LGn{ACBn}}}}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{AIEh{CIj}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{AIEh{CIj}}}{{AIEh{CCbBCJd}}}}\",[]]Ak[\"{{{AIEh{AJAf}}}B@Md}\",[]]Bj[\"{{{AIEh{AJAf}}JGb}{{LHh{HKhBEL`}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]Ai[\"{{{AIEh{OJb}}}LDf}\",[]]Ai[\"{{{AIEh{OJd}}}LDf}\",[]]De[\"{{{Nf{B@Hf}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OLn}}B@Il}}}}\",[]]Bo[\"{{{Nf{B@Nf}}CIn{AIEh{BFHh}}}{{Nn{OLn}}}}\",[]]De[\"{{{Nf{BEBf}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OLn}}B@Il}}}}\",[]]Bo[\"{{{Nf{BEBj}}CIn{AIEh{BFHh}}}{{Nn{OLn}}}}\",[]]De[\"{{{Nf{B@Hj}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OM`}}B@In}}}}\",[]]Bo[\"{{{Nf{B@Nj}}CIn{AIEh{BFHh}}}{{Nn{OM`}}}}\",[]]De[\"{{{Nf{BEBh}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OM`}}B@In}}}}\",[]]Bo[\"{{{Nf{BEBl}}CIn{AIEh{BFHh}}}{{Nn{OM`}}}}\",[]]De[\"{{{Nf{BH@l}}CIn{AIEh{CIj}}{AIEh{BFHh}}}{{LHh{{Nn{OM`}}B@Ij}}}}\",[]]Bo[\"{{{Nf{BH@n}}CIn{AIEh{BFHh}}}{{Nn{OM`}}}}\",[]]Cc[\"{{{AIEh{BEJl}}{AIEh{{LB`{Mn}}}}}{{Nn{OHj}}}}\",[]]Cc[\"{{{AIEh{BEJn}}{AIEh{{LB`{Mn}}}}}{{Nn{OHl}}}}\",[]]Bn[\"{{AJEjBBG`A@d}{{LHl{{LDd{ABNhAJAd}}}}}}\",[]]Bd[\"{{{AIEh{AJAh}}}{{AIEh{OM`}}}}\",[]]A`[\"{AOGhJKn}\",[]]Cb[\"{{{AIEh{AOIn}}CMfAJEjB@JbOJh}{{LGn{AJDb}}}}\",[]]Cb[\"{{{AIEh{BCI`}}CMfAJEjB@JbOJh}{{LGn{AJDb}}}}\",[]]Cb[\"{{{AIEh{AOJ`}}CMhAJEjB@JdOJh}{{LGn{AJDd}}}}\",[]]Cb[\"{{{AIEh{BCIb}}CMhAJEjB@JdOJh}{{LGn{AJDd}}}}\",[]]B`[\"{{{AIEh{CCbAJAh}}OJh}HKh}\",[]]Bo[\"{{{AIEh{CCbAJAb}}}{{LHh{{Nn{Nd}}BCGd}}}}\",[]]Bh[\"{{{AIEh{AJAf}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bg[\"{{{AIEh{OLn}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bh[\"{{{AIEh{AJFf}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bg[\"{{{AIEh{OM`}}}{{LGn{{Nn{Nd}}}}}}\",[]]Bh[\"{{{AIEh{AJFh}}}{{LGn{{Nn{Nd}}}}}}\",[]]o[\"{AJBbMn}\",[]]o[\"{AJBdMn}\",[]]Ai[\"{{{AIEh{CIj}}}CNj}\",[]]Aj[\"{{{AIEh{AJAj}}}CJ`}\",[]]Ah[\"{{{AIEh{Nh}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbAHId}}CJ`}{{AIEh{CCbAHId}}}}\",[]]Ai[\"{{{AIEh{JGl}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbAOHf}}CJ`}{{AIEh{CCbAOHf}}}}\",[]]Ai[\"{{{AIEh{OKd}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbBALl}}CJ`}{{AIEh{CCbBALl}}}}\",[]]Aj[\"{{{AIEh{AJAl}}}CJ`}\",[]]Ah[\"{{{AIEh{Nj}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbAHIf}}CJ`}{{AIEh{CCbAHIf}}}}\",[]]Ai[\"{{{AIEh{JGn}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbAOHh}}CJ`}{{AIEh{CCbAOHh}}}}\",[]]Ai[\"{{{AIEh{OKf}}}CJ`}\",[]]Bn[\"{{{AIEh{CCbBALn}}CJ`}{{AIEh{CCbBALn}}}}\",[]]Aa[\"{AJDhBFHj}\",[]]Ai[\"{{{AIEh{OLn}}}CNj}\",[]]Aj[\"{{{AIEh{AJFf}}}CNj}\",[]]Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]Ai[\"{{{AIEh{OM`}}}CNj}\",[]]Aj[\"{{{AIEh{AJFh}}}CNj}\",[]]Co[\"{{{AIEh{OLn}}B@Jb{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}CNj}\",[]]D`[\"{{{AIEh{AJFf}}B@Jb{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}CNj}\",[]]Co[\"{{{AIEh{OM`}}B@Jd{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}CNj}\",[]]D`[\"{{{AIEh{AJFh}}B@Jd{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}CNj}\",[]]Bn[\"{{{AIEh{CCbBF@n}}CIl}{{AIEh{CCbBF@n}}}}\",[]]Bn[\"{{{AIEh{CCbBFA`}}CIl}{{AIEh{CCbBFA`}}}}\",[]]Cc[\"{{{AIEh{CCbOLn}}}{{LGn{{OJj{{Nn{AHLb}}}}}}}}\",[]]Cd[\"{{{AIEh{CCbAJFf}}}{{LGn{{OJj{{Nn{AHLb}}}}}}}}\",[]]Cc[\"{{{AIEh{CCbOM`}}}{{LGn{{OJl{{Nn{AHLd}}}}}}}}\",[]]Cd[\"{{{AIEh{CCbAJFh}}}{{LGn{{OJl{{Nn{AHLd}}}}}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]De[\"{{{AIEh{CCbBCJb}}c{AIEh{CIj}}}{{AIEh{CCbBCJb}}}{{JG`{CLf}}}}\",[\"\"]]De[\"{{{AIEh{CCbBCJd}}c{AIEh{CIj}}}{{AIEh{CCbBCJd}}}{{JG`{CLf}}}}\",[\"\"]]Ci[\"{{{AIEh{CCbOLn}}{AIEh{{LB`{Mn}}}}}{{LHh{CNjJI`}}}}\",[]]Cj[\"{{{AIEh{CCbAJFf}}{AIEh{{LB`{Mn}}}}}{{LHh{CNjJI`}}}}\",[]]Cj[\"{{{AIEh{CCbOM`}}{AIEh{{LB`{Mn}}}}}{{LHh{CNjBBL`}}}}\",[]]Ck[\"{{{AIEh{CCbAJFh}}{AIEh{{LB`{Mn}}}}}{{LHh{CNjBBL`}}}}\",[]]o[\"{A@dCNj}\",[]]Bn[\"{{{AIEh{CCbBCJb}}LJd}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LJf}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjLGn}\",[]]Ca[\"{{{AIEh{CCbAJDh}}}{{LHh{{LGn{LJd}}AJDl}}}}\",[]]Ca[\"{{{AIEh{CCbBFHj}}}{{LHh{{LGn{LJd}}AJDl}}}}\",[]]Ca[\"{{{AIEh{CCbAJDj}}}{{LHh{{LGn{LJf}}B@Ih}}}}\",[]]Ak[\"{{{AIEh{AJAb}}}AJEj}\",[]]Ak[\"{{{AIEh{AJAf}}}AJEj}\",[]]Ak[\"{{{AIEh{ABOb}}}AJEj}\",[]]Bg[\"{{{AIEh{CLh}}}{{LHh{AJEjAJ@h}}}}\",[]]Ak[\"{{{AIEh{ABOd}}}AJEj}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]B`[\"{{LJdc}LJd{{CKj{LJd}}}}\",[\"\"]]B`[\"{{LHbc}LHb{{CKj{LHb}}}}\",[\"\"]]B`[\"{{LJfc}LJf{{CKj{LJf}}}}\",[\"\"]]B`[\"{{LHdc}LHd{{CKj{LHd}}}}\",[\"\"]]20Ae[\"{{ABNfCJ`}AE`}\",[]]Bn[\"{{{AIEh{CCbBCJb}}ADn}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}ADn}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{JKnABNf}\",[]]B`[\"{{}{{AIEh{{LB`{BFGl}}}}}}\",[]]Ao[\"{{AIEh{A@Nd{CCbMn}}}HKh}\",[]]000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000Am[\"{{}{{LGn{{Nf{OLl}}}}}}\",[]]Bn[\"{{{AIEh{CCbBBHf}}CNj}{{AIEh{CCbBBHf}}}}\",[]]Bn[\"{{{AIEh{CCbBBHh}}CNj}{{AIEh{CCbBBHh}}}}\",[]]Aj[\"{{{AIEh{AHLb}}}CJ`}\",[]]Aj[\"{{{AIEh{AHLd}}}CJ`}\",[]]A`[\"{ACAdLGn}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]10Bf[\"{{{AIEh{CIj}}}{{LHl{CJ`BAM`}}}}\",[]]Bm[\"{{{AIEh{ABNj}}{Nn{BBFn}}}{{LHj{HKh}}}}\",[]]Ai[\"{AJAd{{LHl{HKh}}}}\",[]]Cj[\"{{{AIEh{OLj}}BBG`BAMj{AIEh{A@d}}}{{LDd{AJEjABNh}}}}\",[]]Cb[\"{{{AIEh{CCbAJAh}}LHdAJD`}{{LHh{AJD`BFBn}}}}\",[]]Am[\"{{{AIEh{AJAf}}CJ`}HKh}\",[]]B`[\"{{{AIEh{CCbAJAh}}CJ`}HKh}\",[]]A`[\"{BBKhCNj}\",[]]B`[\"{{{AIEh{CCbJKn}}BBKj}HKh}\",[]]Aa[\"{AOKdAHKh}\",[]]Bm[\"{{{AIEh{OLl}}AHMn}{{LHj{{Nn{BBFn}}}}}}\",[]]Bn[\"{{{AIEh{B@Ob}}AHMn}{{LHj{{Nn{BBFn}}}}}}\",[]]Bn[\"{{{AIEh{AOJj}}AHMn}{{LHj{{Nn{BBFn}}}}}}\",[]]Ci[\"{{{AIEh{CCbOLn}}{AIEh{CCb{AAb{Mn}}}}}{{LGn{CKl}}}}\",[]]Cj[\"{{{AIEh{CCbAJFf}}{AIEh{CCb{AAb{Mn}}}}}{{LGn{CKl}}}}\",[]]Ci[\"{{{AIEh{CCbOM`}}{AIEh{CCb{AAb{Mn}}}}}{{LGn{CKn}}}}\",[]]Cj[\"{{{AIEh{CCbAJFh}}{AIEh{CCb{AAb{Mn}}}}}{{LGn{CKn}}}}\",[]]Cb[\"{{{AIEh{ACBd}}HKfAJF`ABNf}{{LHh{HKhBCIl}}}}\",[]]Cb[\"{{{AIEh{BAIh}}HKfAJF`ABNf}{{LHh{HKhBCIl}}}}\",[]]Cb[\"{{{AIEh{B@Ld}}HKfAJF`ABNf}{{LHh{HKhBCIl}}}}\",[]]Cb[\"{{{AIEh{ACBf}}HKfAJF`ABNf}{{LHh{HKhBCIn}}}}\",[]]Cb[\"{{{AIEh{BAIj}}HKfAJF`ABNf}{{LHh{HKhBCIn}}}}\",[]]Cb[\"{{{AIEh{B@Lf}}HKfAJF`ABNf}{{LHh{HKhBCIn}}}}\",[]]Al[\"{{}{{LHh{B@HbBFOh}}}}\",[]]Bm[\"{{{AIEh{AJAf}}LHb}{{LGn{{Nn{AJAj}}}}}}\",[]]Bo[\"{{{AIEh{AJAh}}LHd}{{LGn{{AIEh{AJAl}}}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Aj[\"{{{AIEh{AJAf}}}HKh}\",[]]Am[\"{{{AIEh{CCbAJAh}}}HKh}\",[]]Bf[\"{{{AIEh{AIOn}}}{{LHh{A@dJIb}}}}\",[]]Bg[\"{{{AIEh{AIOn}}}{{LHh{AHIjJIb}}}}\",[]]Bf[\"{{{AIEh{AIOn}}}{{LHh{A@fJIb}}}}\",[]]Bf[\"{{{AIEh{AIOn}}}{{LHh{A@hJIb}}}}\",[]]Be[\"{{{AIEh{AIOn}}}{{LHh{ObJIb}}}}\",[]]Bg[\"{{{AIEh{AIOn}}}{{LHh{ABMhJIb}}}}\",[]]Ak[\"{{{AIEh{BBLb}}}B@Lb}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{LGn{AOI`}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{AOIb}}}{{AIEh{CCbBCJd}}}}\",[]]<;Aj[\"{{{AIEh{ABNj}}}LDf}\",[]]Aj[\"{{{AIEh{ABNl}}}LDf}\",[]]Bc[\"{{{AIEh{AJAf}}AJEjAJCn}AC@h}\",[]]Co[\"{{{AIEh{CCbAJAh}}AHJlAJD`OJh}{{LHh{{LDd{LHdCNj}}AHLh}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CIn}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CIn}{{AIEh{CCbBCJd}}}}\",[]]Ai[\"{AJAd{{LHl{HKh}}}}\",[]]Bg[\"{{{AIEh{BBLb}}AJFn}{{LHj{LDf}}}}\",[]]A`[\"{AHIjCJ`}\",[]]10Aj[\"{{{AIEh{A@d}}}BCJ`}\",[]]Ce[\"{{{AIEh{CCbB@Nd}}{Nf{BCJb}}}{{AIEh{CCbB@Nd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Hd}}{Nf{BCJb}}}{{AIEh{CCbB@Hd}}}}\",[]]Ce[\"{{{AIEh{CCbB@Nh}}{Nf{BCJd}}}{{AIEh{CCbB@Nh}}}}\",[]]Ce[\"{{{AIEh{CCbB@Hh}}{Nf{BCJd}}}{{AIEh{CCbB@Hh}}}}\",[]]Aa[\"{B@NdBGG`}\",[]]Aa[\"{B@NhBGGb}\",[]]Bj[\"{{{AAb{BBG`}}BAMj}{{LHh{B@NdJIf}}}}\",[]]Bj[\"{{{AAb{BBG`}}BAMj}{{LHh{B@NhJIh}}}}\",[]]Co[\"{{{AIEh{CCbAJEd}}{AIEh{CCb{LB`{JGb}}}}}{{LHh{HKhAJG`}}}}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]A`[\"{BEJhCJ`}\",[]]A`[\"{BEJjCJ`}\",[]]Bc[\"{{{AIEh{AJAf}}}{{LGn{LDf}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]10Aj[\"{{{AIEh{AHJ`}}}LDf}\",[]]Be[\"{{{AIEh{ABNj}}{LGn{B@Nd}}}HKh}\",[]]Bn[\"{{{AIEh{CCbABNl}}{LGn{{Nf{B@Nh}}}}}HKh}\",[]]Bd[\"{{{AIEh{BFGl}}}{{LGn{BAMh}}}}\",[]]o[\"{{}AIEh}\",[]]n[\"{{}OId}\",[]]0000Bn[\"{{{AIEh{CCbBCJb}}LDf}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LDf}{{AIEh{CCbBCJd}}}}\",[]]o[\"{CJ`LJd}\",[]]o[\"{CJ`LJf}\",[]]A`[\"{BAJjCJ`}\",[]]Bf[\"{{{AIEh{BG@d}}{AIEh{BG@d}}}CNj}\",[]]Bo[\"{{{AIEh{CCbBBHf}}ABNf}{{AIEh{CCbBBHf}}}}\",[]]Bo[\"{{{AIEh{CCbBBHh}}ABNf}{{AIEh{CCbBBHh}}}}\",[]]Ae[\"{{LDfCJ`}BAIh}\",[]]Ae[\"{{LDfCJ`}BAIj}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]7Bg[\"{{{AIEh{AJAh}}LHd}{{LGn{AJD`}}}}\",[]]An[\"{{{AIEh{AJAf}}JGb}B@Mn}\",[]]Am[\"{{{AIEh{AJAf}}LJd}HKh}\",[]]B`[\"{{{AIEh{CCbAJAh}}LJf}HKh}\",[]]Ce[\"{{{AIEh{CCbBBHf}}{AAb{CIn}}}{{AIEh{CCbBBHf}}}}\",[]]Ce[\"{{{AIEh{CCbBBHh}}{AAb{CIn}}}{{AIEh{CCbBBHh}}}}\",[]]Fg[\"{{{AIEh{BGKb}}{AIEh{BBG`}}{AIEh{{LB`{BBG`}}}}{AIEh{AJEh}}{AIEh{{LB`{Mn}}}}ACCf}{{LHh{BFBhJHj}}}}\",[]]Af[\"{{BCI`OJh}BCI`}\",[]]Af[\"{{BCIbOJh}BCIb}\",[]]A`[\"{BAJjCJ`}\",[]]Al[\"{B@Od{{LHh{CMfJId}}}}\",[]]Ak[\"{B@Od{{LHh{OdJId}}}}\",[]]Ai[\"{B@Od{{LHn{CMh}}}}\",[]]Ah[\"{B@Od{{LHn{Of}}}}\",[]]o[\"{OIdOId}\",[]]Bo[\"{{{AIEh{CCbBF@n}}ABNf}{{AIEh{CCbBF@n}}}}\",[]]Bo[\"{{{AIEh{CCbBFA`}}ABNf}{{AIEh{CCbBFA`}}}}\",[]]Bb[\"{{{AIEh{OLn}}}{{LGn{CNj}}}}\",[]]Bc[\"{{{AIEh{AJFf}}}{{LGn{CNj}}}}\",[]]Bb[\"{{{AIEh{OM`}}}{{LGn{CNj}}}}\",[]]Bc[\"{{{AIEh{AJFh}}}{{LGn{CNj}}}}\",[]]Bg[\"{{{AIEh{AJAf}}}{{LHh{HKhBCGd}}}}\",[]]Ba[\"{{{AIEh{BEKd}}LHbAHJl}CNj}\",[]]Ba[\"{{{AIEh{BEKf}}LHdAHJl}CNj}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{LGn{ABNf}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{ABNf}}}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]Bl[\"{{{AIEh{CCbAJAj}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bj[\"{{{AIEh{CCbNh}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bk[\"{{{AIEh{CCbJGl}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bk[\"{{{AIEh{CCbOKd}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bl[\"{{{AIEh{CCbAJAl}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bj[\"{{{AIEh{CCbNj}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bk[\"{{{AIEh{CCbJGn}}OJhOJhCNjCNjCJ`}HKh}\",[]]Bk[\"{{{AIEh{CCbOKf}}OJhOJhCNjCNjCJ`}HKh}\",[]]A`[\"{BAJjCJ`}\",[]]Ak[\"{{{AIEh{OMn}}Of}CJ`}\",[]]Bi[\"{{{AIEh{CCbAJEb}}CJ`}{{LHl{HKh}}}}\",[]]<;A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]10Cf[\"{{{AIEh{CCbBCJb}}{LGn{BEO`}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{BEOb}}}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHM`CJ`}\",[]]A`[\"{AHMbCJ`}\",[]]Bi[\"{{{AIEh{CCbAIOn}}}{{LHh{A@dJIb}}}}\",[]]Bj[\"{{{AIEh{CCbAIOn}}}{{LHh{AHIjJIb}}}}\",[]]Bi[\"{{{AIEh{CCbAIOn}}}{{LHh{A@fJIb}}}}\",[]]Bi[\"{{{AIEh{CCbAIOn}}}{{LHh{A@hJIb}}}}\",[]]Bh[\"{{{AIEh{CCbAIOn}}}{{LHh{ObJIb}}}}\",[]]Bj[\"{{{AIEh{CCbAIOn}}}{{LHh{ABMhJIb}}}}\",[]]Cc[\"{{{Nf{AJAd}}CJ`CNj}{{LHl{{LDd{BBKjBBKj}}}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nd}}CJ`}{{AIEh{CCbB@Nd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nh}}CJ`}{{AIEh{CCbB@Nh}}}}\",[]]Aj[\"{{{AIEh{AJAf}}}CNj}\",[]]Ak[\"{{{AIEh{BBFn}}}B@Lb}\",[]]0Ci[\"{{{AIEh{CCbBBHf}}CIl}{{LHh{{AIEh{CCbBBHf}}AOGl}}}}\",[]]Ci[\"{{{AIEh{CCbBBHh}}CIl}{{LHh{{AIEh{CCbBBHh}}AOGn}}}}\",[]]A`[\"{AHIjCIl}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{LGn{BF@n}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{BFA`}}}{{AIEh{CCbBCJd}}}}\",[]]Bg[\"{{{AIEh{CCbAJAh}}}{{LGn{BAJh}}}}\",[]]Cf[\"{{{AIEh{CCbB@Nd}}{LGn{B@Nl}}}{{AIEh{CCbB@Nd}}}}\",[]]Cf[\"{{{AIEh{CCbB@Nh}}{LGn{B@Nl}}}{{AIEh{CCbB@Nh}}}}\",[]]Cf[\"{{{AIEh{CCbB@Nd}}{LGn{B@Nn}}}{{AIEh{CCbB@Nd}}}}\",[]]Cf[\"{{{AIEh{CCbB@Nh}}{LGn{B@Nn}}}{{AIEh{CCbB@Nh}}}}\",[]]Cc[\"{{}{{LHh{{LDd{{AAb{BBG`}}BAMj}}{Nn{JHh}}}}}}\",[]]Bn[\"{{{AIEh{CCbBEO`}}LJd}{{AIEh{CCbBEO`}}}}\",[]]Bn[\"{{{AIEh{CCbBEOb}}LJf}{{AIEh{CCbBEOb}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bo[\"{{{AIEh{CCbB@Nd}}ABNf}{{AIEh{CCbB@Nd}}}}\",[]]Bo[\"{{{AIEh{CCbB@Nh}}ABNf}{{AIEh{CCbB@Nh}}}}\",[]]Ci[\"{{{AIEh{CLh}}{LGn{ABNf}}}{{LHh{{LGn{ABNf}}AJ@h}}}}\",[]]Bj[\"{{{AIEh{BBLb}}AJFnLDf}{{LHj{HKh}}}}\",[]]054Bm[\"{{{AIEh{OLn}}}{{LHh{{LGn{BFHh}}JI`}}}}\",[]]Bn[\"{{{AIEh{AJFf}}}{{LHh{{LGn{BFHh}}JI`}}}}\",[]]Bn[\"{{{AIEh{OM`}}}{{LHh{{LGn{BFHh}}BBL`}}}}\",[]]Bo[\"{{{AIEh{AJFh}}}{{LHh{{LGn{BFHh}}BBL`}}}}\",[]]Aj[\"{{{AIEh{AHLb}}}CJ`}\",[]]Aj[\"{{{AIEh{AHLd}}}CJ`}\",[]]Bk[\"{{{AIEh{ABNj}}{LGn{{Nf{BEKd}}}}}HKh}\",[]]Cc[\"{{{AIEh{CCbAJAh}}{LGn{{AIEh{BEKf}}}}OJh}HKh}\",[]]Aj[\"{{{AIEh{ABNl}}}CJ`}\",[]]Bf[\"{{{AIEh{AHJl}}{AIEh{AHJl}}}CNj}\",[]]Bn[\"{{{AIEh{CCbBALl}}ADn}{{AIEh{CCbBALl}}}}\",[]]Bn[\"{{{AIEh{CCbBALn}}ADn}{{AIEh{CCbBALn}}}}\",[]]Ak[\"{{{AIEh{AHMl}}}B@Lb}\",[]]0Bd[\"{{{AIEh{AJAf}}}{{ACA`{JJb}}}}\",[]]Cb[\"{{{AIEh{AJAh}}LHd}{{LHh{{LGn{AJEj}}AJ@n}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]Bn[\"{{{AIEh{CCbBCJb}}LJd}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LJf}{{AIEh{CCbBCJd}}}}\",[]]A`[\"{AHIjLGn}\",[]]Bo[\"{{{AIEh{AHIj}}{AIEh{CIj}}}{{LHj{BCJ`}}}}\",[]]Em[\"{{{AIEh{AJAf}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBh}}}}\",[]]El[\"{{{AIEh{OLn}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBh}}}}\",[]]Em[\"{{{AIEh{AJFf}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBh}}}}\",[]]El[\"{{{AIEh{OM`}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBj}}}}\",[]]Em[\"{{{AIEh{AJFh}}{AIEh{CCb{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}{AIEh{{LB`{Mn}}}}}{{LHh{HKhBHBj}}}}\",[]]Am[\"{{{AIEh{CCbAHIn}}}HKh}\",[]]0Al[\"{{{AIEh{AJAh}}Of}CJ`}\",[]]Bl[\"{{{AIEh{AJAf}}}{{ACAb{{LGn{AJEj}}}}}}\",[]]Bg[\"{{{AIEh{CLh}}}{{LHh{BDNlAJ@h}}}}\",[]]>=E`[\"{{{AIEh{BGKb}}{AIEh{{LB`{Mn}}}}{AIEh{BBG`}}{AIEh{BGFb}}}{{LHh{BGMhJHj}}}}\",[]]0Bf[\"{{{Nf{BANb}}}{{LHh{B@HdBG@b}}}}\",[]]Bf[\"{{{Nf{BANb}}}{{LHh{B@HhBG@b}}}}\",[]]Bn[\"{{{AIEh{CCbBEO`}}LJd}{{AIEh{CCbBEO`}}}}\",[]]Bn[\"{{{AIEh{CCbBEOb}}LJf}{{AIEh{CCbBEOb}}}}\",[]]o[\"{OIdOId}\",[]]0000Aj[\"{{{AIEh{AJAh}}}CNj}\",[]]0Ci[\"{{{AIEh{CLh}}{LGn{ABNf}}}{{LHh{{LGn{ABNf}}AJ@h}}}}\",[]]Cd[\"{{{AIEh{CCbA@d}}{AIEh{AIOn}}}{{LHh{HKhJIb}}}}\",[]]Ce[\"{{{AIEh{CCbAHIj}}{AIEh{AIOn}}}{{LHh{HKhJIb}}}}\",[]]Cd[\"{{{AIEh{CCbA@f}}{AIEh{AIOn}}}{{LHh{HKhJIb}}}}\",[]]Cd[\"{{{AIEh{CCbA@h}}{AIEh{AIOn}}}{{LHh{HKhJIb}}}}\",[]]Cc[\"{{{AIEh{CCbOb}}{AIEh{AIOn}}}{{LHh{HKhJIb}}}}\",[]]Ce[\"{{{AIEh{CCbABMh}}{AIEh{AIOn}}}{{LHh{HKhJIb}}}}\",[]]Bo[\"{{{AIEh{CCbB@Nd}}BGG`}{{AIEh{CCbB@Nd}}}}\",[]]Bo[\"{{{AIEh{CCbB@Nh}}BGGb}{{AIEh{CCbB@Nh}}}}\",[]]Aj[\"{{{AIEh{BBHf}}}CJ`}\",[]]Aj[\"{{{AIEh{BBHh}}}CJ`}\",[]]Cc[\"{{{AIEh{CCbB@Hd}}{Nf{A`}}}{{AIEh{CCbB@Hd}}}}\",[]]Cc[\"{{{AIEh{CCbB@Hh}}{Nf{A`}}}{{AIEh{CCbB@Hh}}}}\",[]]Cj[\"{{BBHf{LGn{B@Nd}}{Nn{BBFn}}{Nf{OLl}}}{{LHj{ABNj}}}}\",[]]Aj[\"{{{AIEh{ABOb}}}CNj}\",[]]Aj[\"{{{AIEh{ABOd}}}CNj}\",[]]Ca[\"{{{AIEh{CCbAJAh}}OJhAJCd}{{LHh{HKhBGJj}}}}\",[]]Bd[\"{{{AIEh{BGKb}}}{{AAb{BCIh}}}}\",[]]Bj[\"{{{AIEh{AJAf}}AJEj}{{LHh{HKhJIl}}}}\",[]]Bm[\"{{{AIEh{CCbAJAh}}AJEj}{{LHh{HKhJIl}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}LDf}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LDf}{{AIEh{CCbBCJd}}}}\",[]]Bl[\"{{}{{LHh{{LDd{BBG`BFAj}}{Nn{JHh}}}}}}\",[]]Ai[\"{AJAd{{LHl{HKh}}}}\",[]]A`[\"{AJBbCJ`}\",[]]A`[\"{AJBdCJ`}\",[]]An[\"{{{AIEh{ABNj}}B@Hd}HKh}\",[]]D`[\"{{{AIEh{CCbAJAh}}LHd{LGn{ABNf}}}{{LHh{{LGn{ABNf}}AJ@n}}}}\",[]]o[\"{{}AIEh}\",[]]Aj[\"{{{AIEh{AJAf}}}LDf}\",[]]Bn[\"{{{AIEh{CCbB@Nd}}CJ`}{{AIEh{CCbB@Nd}}}}\",[]]Bn[\"{{{AIEh{CCbB@Nh}}CJ`}{{AIEh{CCbB@Nh}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}LJd}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}LJf}{{AIEh{CCbBCJd}}}}\",[]]:Bb[\"{{{AIEh{CCbAJAh}}OfLJf}HKh}\",[]]Ak[\"{{}{{LHh{B@HdJIf}}}}\",[]]Ak[\"{{}{{LHh{B@HhJIh}}}}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]65Cg[\"{{{AIEh{CCbA@d}}{AIEh{CCbAIOn}}}{{LHh{HKhJIb}}}}\",[]]Ch[\"{{{AIEh{CCbAHIj}}{AIEh{CCbAIOn}}}{{LHh{HKhJIb}}}}\",[]]Cg[\"{{{AIEh{CCbA@f}}{AIEh{CCbAIOn}}}{{LHh{HKhJIb}}}}\",[]]Cg[\"{{{AIEh{CCbA@h}}{AIEh{CCbAIOn}}}{{LHh{HKhJIb}}}}\",[]]Cf[\"{{{AIEh{CCbOb}}{AIEh{CCbAIOn}}}{{LHh{HKhJIb}}}}\",[]]Ch[\"{{{AIEh{CCbABMh}}{AIEh{CCbAIOn}}}{{LHh{HKhJIb}}}}\",[]]Bi[\"{{{AIEh{CCbAHJl}}{AIEh{AHJl}}}CNj}\",[]]n[\"{{}HKh}\",[]]Ce[\"{{{AIEh{CCbBCJb}}{LGn{LDf}}}{{AIEh{CCbBCJb}}}}\",[]]Ce[\"{{{AIEh{CCbBCJd}}{LGn{LDf}}}{{AIEh{CCbBCJd}}}}\",[]]Bn[\"{{{AIEh{AJAf}}}{{LHh{{AAb{AJEj}}JIl}}}}\",[]]Cd[\"{{{AIEh{CCbAJAh}}OJh}{{LHh{{AAb{AJEj}}JIl}}}}\",[]]Am[\"{{{AIEh{CCbAJAj}}}HKh}\",[]]Al[\"{{{AIEh{CCbJGl}}}HKh}\",[]]Am[\"{{{AIEh{CCbAJAl}}}HKh}\",[]]Al[\"{{{AIEh{CCbJGn}}}HKh}\",[]]Ai[\"{AJAd{{LHl{HKh}}}}\",[]]Bj[\"{{{AIEh{AJAf}}AJEj}{{LHh{HKhJIl}}}}\",[]]Bm[\"{{{AIEh{CCbAJAh}}AJEj}{{LHh{HKhJIl}}}}\",[]]D`[\"{{{AIEh{CCbAJAh}}LHd{LGn{ABNf}}}{{LHh{{LGn{ABNf}}AJ@n}}}}\",[]]Ce[\"{{{AIEh{CCbBCJb}}{Nf{BEJd}}}{{AIEh{CCbBCJb}}}}\",[]]Ce[\"{{{AIEh{CCbBCJd}}{Nf{BEJf}}}{{AIEh{CCbBCJd}}}}\",[]]Cf[\"{{{AIEh{CCbBCJb}}{LGn{ABNf}}}{{AIEh{CCbBCJb}}}}\",[]]Cf[\"{{{AIEh{CCbBCJd}}{LGn{ABNf}}}{{AIEh{CCbBCJd}}}}\",[]]Aa[\"{BAJnAJCb}\",[]]Aa[\"{BAK`AJCb}\",[]]9Bn[\"{{{AIEh{CCbBCJb}}CNj}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CNj}{{AIEh{CCbBCJd}}}}\",[]]Am[\"{{{AIEh{AJAf}}LJd}HKh}\",[]]o[\"{OIdOId}\",[]]Bn[\"{{{AIEh{CCbBCJb}}CIn}{{AIEh{CCbBCJb}}}}\",[]]Bn[\"{{{AIEh{CCbBCJd}}CIn}{{AIEh{CCbBCJd}}}}\",[]]3109854Bn[\"{{{AIEh{AJAf}}}{{LHh{{AAb{AJEj}}JIl}}}}\",[]]Bn[\"{{{AIEh{AJAh}}}{{LHh{{AAb{AJEj}}JIl}}}}\",[]]10A`[\"{BFHhLGn}\",[]]Bm[\"{{{AIEh{CCbBCJb}}Mn}{{AIEh{CCbBCJb}}}}\",[]]Bm[\"{{{AIEh{CCbBCJd}}Mn}{{AIEh{CCbBCJd}}}}\",[]]o[\"{{}AJCd}\",[]]")
\ No newline at end of file
diff --git a/pr/427/docs/search.index/path/0720f3aca4df.js b/pr/427/docs/search.index/path/fa692132725f.js
similarity index 98%
rename from pr/427/docs/search.index/path/0720f3aca4df.js
rename to pr/427/docs/search.index/path/fa692132725f.js
index 8ab902225..f873f8706 100644
--- a/pr/427/docs/search.index/path/0720f3aca4df.js
+++ b/pr/427/docs/search.index/path/fa692132725f.js
@@ -1 +1 @@
-rd_("f[1,\"\"]0Al[10,\"core::ops\",\"core::ops\"]Ce[5,\"clap_builder::util::id\",\"clap_builder::util::id\"]22A`[10,\"core::any\"]Ao[5,\"alloc::sync\",\"alloc::sync\"]Al[5,\"iroh_quinn::congestion\"]Df[5,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion::bbr\"]Ba[5,\"alloc::boxed\",\"alloc::boxed\"]Cb[10,\"bytes::buf::buf_impl\",\"bytes::buf::buf_impl\"]Am[5,\"quinn_perf\",\"quinn_perf\"]A`[6,\"iroh_quinn\"]Bi[6,\"iroh_quinn_proto\",\"iroh_quinn_proto\"]Ae[10,\"core::ops::bit\"]Ac[5,\"bench\",\"bench\"]Ba[5,\"perf::client\",\"perf::client\"]Ba[5,\"perf::server\",\"perf::server\"]A`[10,\"core::cmp\"]Ak[5,\"core::pin\",\"core::pin\"]Am[5,\"alloc::vec\",\"alloc::vec\"]Bb[2,\"iroh_quinn_proto::congestion\"]f[1,\"\"]00Ad[2,\"iroh_quinn_udp\"]f[0,\"\"]2222Ak[10,\"clap_builder::derive\"]Bn[10,\"std::os::fd::owned\",\"std::os::fd::owned\"]Af[10,\"core::ops::drop\"]Ad[10,\"core::convert\"]Aa[10,\"core::hash\"]1Ah[5,\"iroh_quinn::crypto\"]Ci[5,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]Bh[15,\"iroh_quinn_proto::ProtectedHeader\"]Ak[5,\"std::path\",\"std::path\"]Bc[5,\"iroh_quinn\",\"iroh_quinn::path\"]Bi[6,\"core::task::poll\",\"core::task::poll\"]Bb[10,\"core::marker\",\"core::marker\"]A`[6,\"iroh_quinn\"]Bi[6,\"iroh_quinn_proto\",\"iroh_quinn_proto\"]2Ah[10,\"ppv_lite86::types\"]f[1,\"\"]f[3,\"\"]A`[2,\"iroh_quinn\"]1An[2,\"iroh_quinn_proto::config\"]Bk[2,\"iroh_quinn_proto::connection::streams\"]0Ai[2,\"iroh_quinn::runtime\"]55Bd[10,\"core::convert\",\"core::convert\"]Ba[5,\"bytes::bytes\",\"bytes::bytes\"]A`[5,\"iroh_quinn\"]D`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::assembler\"]Ab[10,\"core::clone\"]Cg[6,\"iroh_quinn_proto::frame\",\"iroh_quinn_proto::frame\"]Al[5,\"iroh_quinn::congestion\"]Dh[5,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion::cubic\"]A`[10,\"core::fmt\"]Ag[10,\"core::ops::deref\"]Ak[5,\"core::fmt\",\"core::fmt\"]Ab[10,\"core::error\"]Bc[6,\"rustls::error\",\"rustls::error\"]Ba[8,\"clap_builder\",\"clap_builder\"]B`[2,\"iroh_quinn::crypto::rustls\"]Bf[2,\"iroh_quinn_proto::crypto::rustls\"]Dk[5,\"iroh_quinn_proto::transport_error\",\"iroh_quinn_proto::transport_error\"]Bi[6,\"arbitrary::error\",\"arbitrary::error\"]B`[6,\"iroh_quinn::crypto::rustls\"]Bf[6,\"iroh_quinn_proto::crypto::rustls\"]Ee[6,\"iroh_quinn_proto::transport_parameters\",\"iroh_quinn_proto::transport_parameters\"]Ck[6,\"iroh_quinn_proto::iroh_hp\",\"iroh_quinn_proto::iroh_hp\"]Af[2,\"iroh_quinn_proto\"]Ce[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection\"]2Bi[5,\"core::ops::range\",\"core::ops::range\"]Bh[15,\"iroh_quinn_proto::ProtectedHeader\"]0Bb[10,\"core::marker\",\"core::marker\"]Ba[5,\"bench::stats\",\"bench::stats\"]Ao[5,\"perf::stats\",\"perf::stats\"]Ba[5,\"rustls::quic\",\"rustls::quic\"]Ah[10,\"std::io\",\"std::io\"]f[1,\"\"]f[3,\"\"]Bb[2,\"iroh_quinn_proto::congestion\"]l[2,\"rustls\"]A`[5,\"iroh_quinn\"]Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::transport\"]Ae[10,\"tonic::request\"]Aa[10,\"iroh_quinn\"]Ch[10,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::qlog\"]Bl[5,\"iroh_quinn\",\"iroh_quinn::runtime::smol\"]Af[2,\"iroh_quinn_proto\"]Cn[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::streams\"]Ba[5,\"bench::stats\",\"bench::stats\"]Ao[5,\"perf::stats\",\"perf::stats\"]Ci[5,\"ring::error::unspecified\",\"ring::error::unspecified\"]f[3,\"\"]A`[2,\"iroh_quinn\"]Bb[2,\"iroh_quinn_proto::connection\"]1Co[5,\"rustls::client::client_conn\",\"rustls::client::client_conn\"]Ci[5,\"iroh_quinn_proto::config\",\"iroh_quinn_proto::config\"]?Ai[10,\"iroh_quinn::crypto\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config\"]Cj[10,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]A`[5,\"iroh_quinn\"]Cn[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::streams\"]Cm[6,\"iroh_quinn_proto::endpoint\",\"iroh_quinn_proto::endpoint\"]A`[6,\"iroh_quinn\"]Cc[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::endpoint\"]Ci[5,\"iroh_quinn_proto::shared\",\"iroh_quinn_proto::shared\"]5Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::shared\"]C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::frame\"]4Ca[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::shared\"]Be[6,\"iroh_quinn_udp\",\"iroh_quinn_udp\"]Bm[8,\"core::num::nonzero\",\"core::num::nonzero\"]:C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::token\"]Bb[15,\"iroh_quinn_proto::PathEvent\"]Bi[5,\"iroh_quinn\",\"iroh_quinn::connection\"]1Do[5,\"iroh_quinn_proto::connection::paths\",\"iroh_quinn_proto::connection::paths\"]Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::paths\"]2Co[5,\"rustls::server::server_conn\",\"rustls::server::server_conn\"]Ci[5,\"iroh_quinn_proto::config\",\"iroh_quinn_proto::config\"]A`[5,\"iroh_quinn\"]Ai[10,\"iroh_quinn::crypto\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config\"]Cj[10,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]Ce[5,\"core::net::socket_addr\",\"core::net::socket_addr\"]0Bj[6,\"iroh_quinn\",\"iroh_quinn::send_stream\"]Bm[5,\"iroh_quinn\",\"iroh_quinn::runtime::tokio\"]Cg[5,\"arbitrary::unstructured\",\"arbitrary::unstructured\"]j[2,\"perf\"]8Cj[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::bloom_token_log\"]Ab[10,\"core::clone\"]Cc[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::endpoint\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::shared\"]Bg[5,\"iroh_quinn\",\"iroh_quinn::endpoint\"]B`[5,\"iroh_quinn::crypto::rustls\"]Di[5,\"iroh_quinn_proto::crypto::rustls\",\"iroh_quinn_proto::crypto::rustls\"]Bc[6,\"rustls::enums\",\"rustls::enums\"]Al[5,\"iroh_quinn::congestion\"]Dk[5,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion::new_reno\"]Bi[5,\"core::num::error\",\"core::num::error\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]Ec[5,\"clap_builder::builder::possible_value\",\"clap_builder::builder::possible_value\"]Bi[6,\"rustls_pki_types\",\"rustls_pki_types\"]Dd[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::streams::recv\"]Cg[5,\"rustls::webpki::anchors\",\"rustls::webpki::anchors\"]A`[5,\"iroh_quinn\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config\"]Ci[5,\"iroh_quinn_proto::coding\",\"iroh_quinn_proto::coding\"]Af[2,\"iroh_quinn_proto\"]0f[3,\"\"]Bg[10,\"iroh_quinn\",\"iroh_quinn::runtime\"]Bi[5,\"rustls_pki_types\",\"rustls_pki_types\"]Da[6,\"iroh_quinn_proto::connection\",\"iroh_quinn_proto::connection\"]Ce[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection\"]Ak[10,\"clap_builder::derive\"]An[15,\"iroh_quinn_proto::Event\"]:91Bg[5,\"iroh_quinn\",\"iroh_quinn::incoming\"]C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::frame\"]Bc[6,\"rustls::error\",\"rustls::error\"]=C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::token\"]1Bj[6,\"iroh_quinn\",\"iroh_quinn::recv_stream\"]0Cn[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::streams\"]Ba[5,\"bench::stats\",\"bench::stats\"]Af[5,\"iroh_quinn_proto\"]Bj[5,\"iroh_quinn_udp\",\"iroh_quinn_udp::imp\"]Bc[5,\"iroh_quinn\",\"iroh_quinn::path\"]f[3,\"\"]A`[5,\"iroh_quinn\"]:A`[6,\"iroh_quinn\"]?Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::shared\"]2Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::stats\"]Ba[5,\"rustls::rand\",\"rustls::rand\"]Ao[5,\"perf::stats\",\"perf::stats\"]Af[2,\"iroh_quinn_proto\"]Ca[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]7Cg[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::qlog\"]Bj[15,\"iroh_quinn_proto::PathAbandonReason\"]Bc[6,\"rustls::enums\",\"rustls::enums\"]Ak[5,\"std::time\",\"std::time\"];C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::token\"]Do[5,\"iroh_quinn_proto::config::transport\",\"iroh_quinn_proto::config::transport\"]=Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::transport\"]Bi[5,\"core::num::error\",\"core::num::error\"]Bi[5,\"iroh_quinn\",\"iroh_quinn::connection\"]:Bc[5,\"iroh_quinn\",\"iroh_quinn::path\"]A`[5,\"iroh_quinn\"]C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::frame\"]Bc[6,\"rustls::error\",\"rustls::error\"]Cc[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::endpoint\"]11B`[5,\"iroh_quinn::crypto::rustls\"]Di[5,\"iroh_quinn_proto::crypto::rustls\",\"iroh_quinn_proto::crypto::rustls\"]105Cm[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::token_memory_cache\"]Bh[15,\"iroh_quinn_proto::ProtectedHeader\"]f[3,\"\"]Bj[15,\"iroh_quinn_proto::PathAbandonReason\"]Am[10,\"iroh_quinn::congestion\"]Db[10,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion\"]Al[5,\"iroh_quinn::congestion\"]Da[5,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion\"]Ai[10,\"iroh_quinn::crypto\"]Cj[10,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]Aa[10,\"iroh_quinn\"]Cf[10,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection\"]Af[2,\"iroh_quinn_proto\"]Ca[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]1Cl[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::paths\"]Bi[6,\"iroh_quinn\",\"iroh_quinn::connection\"]D`[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::datagrams\"]>A`[5,\"iroh_quinn\"]Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::transport\"]Cb[10,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]21Bi[5,\"rustls_pki_types\",\"rustls_pki_types\"]Be[5,\"rustls::verify\",\"rustls::verify\"]Ae[10,\"rustls::verify\"]Do[6,\"iroh_quinn_proto::connection::paths\",\"iroh_quinn_proto::connection::paths\"]96Af[5,\"iroh_quinn_proto\"]Bj[15,\"iroh_quinn_proto::PacketDecodeError\"]Ah[5,\"iroh_quinn::crypto\"]Ci[5,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]?Aa[6,\"perf\",\"perf\"]Ee[5,\"iroh_quinn_proto::transport_parameters\",\"iroh_quinn_proto::transport_parameters\"]Bj[5,\"iroh_quinn\",\"iroh_quinn::recv_stream\"]Bo[2,\"iroh_quinn_proto::connection::send_buffer\"]Be[2,\"iroh_quinn_proto::bench_exports\"]Bh[15,\"iroh_quinn::crypto::rustls::Error\"]Bn[15,\"iroh_quinn_proto::crypto::rustls::Error\"]B`[5,\"iroh_quinn::crypto::rustls\"]Di[5,\"iroh_quinn_proto::crypto::rustls\",\"iroh_quinn_proto::crypto::rustls\"]Be[6,\"rustls::suites\",\"rustls::suites\"]A`[5,\"iroh_quinn\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::varint\"]Be[6,\"rustls::webpki\",\"rustls::webpki\"]Bi[5,\"iroh_quinn\",\"iroh_quinn::connection\"]Af[2,\"iroh_quinn_proto\"]Aa[10,\"iroh_quinn\"]Ci[10,\"iroh_quinn_proto\",\"iroh_quinn_proto::cid_generator\"]Be[5,\"rustls::verify\",\"rustls::verify\"]7Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config\"]Ce[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]Ao[5,\"certificate\",\"certificate\"]Bc[6,\"rustls::error\",\"rustls::error\"]5Bm[5,\"perf::noprotection\",\"perf::noprotection\"]01Ah[5,\"iroh_quinn::crypto\"]Ci[5,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]Ce[5,\"rustls::crypto::cipher\",\"rustls::crypto::cipher\"]Ch[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::cid_generator\"]07Bh[15,\"iroh_quinn::crypto::rustls::Error\"]Bn[15,\"iroh_quinn_proto::crypto::rustls::Error\"]")
\ No newline at end of file
+rd_("f[1,\"\"]0Al[10,\"core::ops\",\"core::ops\"]Ce[5,\"clap_builder::util::id\",\"clap_builder::util::id\"]22A`[10,\"core::any\"]Ao[5,\"alloc::sync\",\"alloc::sync\"]Al[5,\"iroh_quinn::congestion\"]Df[5,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion::bbr\"]Ba[5,\"alloc::boxed\",\"alloc::boxed\"]Cb[10,\"bytes::buf::buf_impl\",\"bytes::buf::buf_impl\"]Am[5,\"quinn_perf\",\"quinn_perf\"]A`[6,\"iroh_quinn\"]Bi[6,\"iroh_quinn_proto\",\"iroh_quinn_proto\"]Ae[10,\"core::ops::bit\"]Ac[5,\"bench\",\"bench\"]Ba[5,\"perf::client\",\"perf::client\"]Ba[5,\"perf::server\",\"perf::server\"]A`[10,\"core::cmp\"]Ak[5,\"core::pin\",\"core::pin\"]Am[5,\"alloc::vec\",\"alloc::vec\"]Bb[2,\"iroh_quinn_proto::congestion\"]f[1,\"\"]00Ad[2,\"iroh_quinn_udp\"]f[0,\"\"]2222Ak[10,\"clap_builder::derive\"]Bn[10,\"std::os::fd::owned\",\"std::os::fd::owned\"]Af[10,\"core::ops::drop\"]Ad[10,\"core::convert\"]Aa[10,\"core::hash\"]1Ah[5,\"iroh_quinn::crypto\"]Ci[5,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]Bh[15,\"iroh_quinn_proto::ProtectedHeader\"]Ak[5,\"std::path\",\"std::path\"]Bc[5,\"iroh_quinn\",\"iroh_quinn::path\"]Bi[6,\"core::task::poll\",\"core::task::poll\"]Bb[10,\"core::marker\",\"core::marker\"]A`[6,\"iroh_quinn\"]Bi[6,\"iroh_quinn_proto\",\"iroh_quinn_proto\"]2Ah[10,\"ppv_lite86::types\"]f[1,\"\"]f[3,\"\"]A`[2,\"iroh_quinn\"]1An[2,\"iroh_quinn_proto::config\"]Bk[2,\"iroh_quinn_proto::connection::streams\"]0Ai[2,\"iroh_quinn::runtime\"]55Bd[10,\"core::convert\",\"core::convert\"]Ba[5,\"bytes::bytes\",\"bytes::bytes\"]A`[5,\"iroh_quinn\"]D`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::assembler\"]Ab[10,\"core::clone\"]Cg[6,\"iroh_quinn_proto::frame\",\"iroh_quinn_proto::frame\"]Al[5,\"iroh_quinn::congestion\"]Dh[5,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion::cubic\"]A`[10,\"core::fmt\"]Ag[10,\"core::ops::deref\"]Ak[5,\"core::fmt\",\"core::fmt\"]Ab[10,\"core::error\"]Bc[6,\"rustls::error\",\"rustls::error\"]B`[2,\"iroh_quinn::crypto::rustls\"]Bf[2,\"iroh_quinn_proto::crypto::rustls\"]Dk[5,\"iroh_quinn_proto::transport_error\",\"iroh_quinn_proto::transport_error\"]Ba[8,\"clap_builder\",\"clap_builder\"]Bi[6,\"arbitrary::error\",\"arbitrary::error\"]B`[6,\"iroh_quinn::crypto::rustls\"]Bf[6,\"iroh_quinn_proto::crypto::rustls\"]Ee[6,\"iroh_quinn_proto::transport_parameters\",\"iroh_quinn_proto::transport_parameters\"]Ck[6,\"iroh_quinn_proto::iroh_hp\",\"iroh_quinn_proto::iroh_hp\"]Af[2,\"iroh_quinn_proto\"]Ce[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection\"]2Bi[5,\"core::ops::range\",\"core::ops::range\"]Bh[15,\"iroh_quinn_proto::ProtectedHeader\"]0Bb[10,\"core::marker\",\"core::marker\"]Ba[5,\"bench::stats\",\"bench::stats\"]Ao[5,\"perf::stats\",\"perf::stats\"]Ba[5,\"rustls::quic\",\"rustls::quic\"]Ah[10,\"std::io\",\"std::io\"]f[1,\"\"]f[3,\"\"]Bb[2,\"iroh_quinn_proto::congestion\"]l[2,\"rustls\"]A`[5,\"iroh_quinn\"]Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::transport\"]Ae[10,\"tonic::request\"]Aa[10,\"iroh_quinn\"]Ch[10,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::qlog\"]Bl[5,\"iroh_quinn\",\"iroh_quinn::runtime::smol\"]Af[2,\"iroh_quinn_proto\"]Cn[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::streams\"]Ba[5,\"bench::stats\",\"bench::stats\"]Ao[5,\"perf::stats\",\"perf::stats\"]Ci[5,\"ring::error::unspecified\",\"ring::error::unspecified\"]f[3,\"\"]A`[2,\"iroh_quinn\"]Bb[2,\"iroh_quinn_proto::connection\"]1Co[5,\"rustls::client::client_conn\",\"rustls::client::client_conn\"]Ci[5,\"iroh_quinn_proto::config\",\"iroh_quinn_proto::config\"]?Ai[10,\"iroh_quinn::crypto\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config\"]Cj[10,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]A`[5,\"iroh_quinn\"]Cn[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::streams\"]Cm[6,\"iroh_quinn_proto::endpoint\",\"iroh_quinn_proto::endpoint\"]A`[6,\"iroh_quinn\"]Cc[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::endpoint\"]Ci[5,\"iroh_quinn_proto::shared\",\"iroh_quinn_proto::shared\"]5Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::shared\"]C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::frame\"]4Ca[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::shared\"]Be[6,\"iroh_quinn_udp\",\"iroh_quinn_udp\"]Bm[8,\"core::num::nonzero\",\"core::num::nonzero\"]:C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::token\"]Bb[15,\"iroh_quinn_proto::PathEvent\"]Bi[5,\"iroh_quinn\",\"iroh_quinn::connection\"]1Do[5,\"iroh_quinn_proto::connection::paths\",\"iroh_quinn_proto::connection::paths\"]Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::paths\"]2Co[5,\"rustls::server::server_conn\",\"rustls::server::server_conn\"]Ci[5,\"iroh_quinn_proto::config\",\"iroh_quinn_proto::config\"]A`[5,\"iroh_quinn\"]Ai[10,\"iroh_quinn::crypto\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config\"]Cj[10,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]Ce[5,\"core::net::socket_addr\",\"core::net::socket_addr\"]0Bj[6,\"iroh_quinn\",\"iroh_quinn::send_stream\"]Bm[5,\"iroh_quinn\",\"iroh_quinn::runtime::tokio\"]Cg[5,\"arbitrary::unstructured\",\"arbitrary::unstructured\"]j[2,\"perf\"]8Cj[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::bloom_token_log\"]Ab[10,\"core::clone\"]Cc[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::endpoint\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::shared\"]Bg[5,\"iroh_quinn\",\"iroh_quinn::endpoint\"]B`[5,\"iroh_quinn::crypto::rustls\"]Di[5,\"iroh_quinn_proto::crypto::rustls\",\"iroh_quinn_proto::crypto::rustls\"]Bc[6,\"rustls::enums\",\"rustls::enums\"]Al[5,\"iroh_quinn::congestion\"]Dk[5,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion::new_reno\"]Bi[5,\"core::num::error\",\"core::num::error\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]Ec[5,\"clap_builder::builder::possible_value\",\"clap_builder::builder::possible_value\"]Bi[6,\"rustls_pki_types\",\"rustls_pki_types\"]Dd[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::streams::recv\"]Cg[5,\"rustls::webpki::anchors\",\"rustls::webpki::anchors\"]A`[5,\"iroh_quinn\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config\"]Ci[5,\"iroh_quinn_proto::coding\",\"iroh_quinn_proto::coding\"]Af[2,\"iroh_quinn_proto\"]0f[3,\"\"]Bg[10,\"iroh_quinn\",\"iroh_quinn::runtime\"]Bi[5,\"rustls_pki_types\",\"rustls_pki_types\"]Da[6,\"iroh_quinn_proto::connection\",\"iroh_quinn_proto::connection\"]Ce[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection\"]Ak[10,\"clap_builder::derive\"]An[15,\"iroh_quinn_proto::Event\"]:91Bg[5,\"iroh_quinn\",\"iroh_quinn::incoming\"]C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::frame\"]Bc[6,\"rustls::error\",\"rustls::error\"]=C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::token\"]1Bj[6,\"iroh_quinn\",\"iroh_quinn::recv_stream\"]0Cn[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::streams\"]Ba[5,\"bench::stats\",\"bench::stats\"]Af[5,\"iroh_quinn_proto\"]Bj[5,\"iroh_quinn_udp\",\"iroh_quinn_udp::imp\"]Bc[5,\"iroh_quinn\",\"iroh_quinn::path\"]f[3,\"\"]A`[5,\"iroh_quinn\"]:A`[6,\"iroh_quinn\"]?Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::shared\"]2Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::stats\"]Ba[5,\"rustls::rand\",\"rustls::rand\"]Ao[5,\"perf::stats\",\"perf::stats\"]Af[2,\"iroh_quinn_proto\"]Ca[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]7Cg[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::qlog\"]Bj[15,\"iroh_quinn_proto::PathAbandonReason\"]Bc[6,\"rustls::enums\",\"rustls::enums\"]Ak[5,\"std::time\",\"std::time\"];C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::token\"]Do[5,\"iroh_quinn_proto::config::transport\",\"iroh_quinn_proto::config::transport\"]=Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::transport\"]Bi[5,\"core::num::error\",\"core::num::error\"]Bi[5,\"iroh_quinn\",\"iroh_quinn::connection\"]:Bc[5,\"iroh_quinn\",\"iroh_quinn::path\"]A`[5,\"iroh_quinn\"]C`[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::frame\"]Bc[6,\"rustls::error\",\"rustls::error\"]Cc[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::endpoint\"]11B`[5,\"iroh_quinn::crypto::rustls\"]Di[5,\"iroh_quinn_proto::crypto::rustls\",\"iroh_quinn_proto::crypto::rustls\"]105Cm[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::token_memory_cache\"]Bh[15,\"iroh_quinn_proto::ProtectedHeader\"]f[3,\"\"]Bj[15,\"iroh_quinn_proto::PathAbandonReason\"]Am[10,\"iroh_quinn::congestion\"]Db[10,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion\"]Al[5,\"iroh_quinn::congestion\"]Da[5,\"iroh_quinn_proto::congestion\",\"iroh_quinn_proto::congestion\"]Ai[10,\"iroh_quinn::crypto\"]Cj[10,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]Aa[10,\"iroh_quinn\"]Cf[10,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection\"]Af[2,\"iroh_quinn_proto\"]Ca[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]1Cl[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::paths\"]Bi[6,\"iroh_quinn\",\"iroh_quinn::connection\"]D`[6,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection::datagrams\"]>A`[5,\"iroh_quinn\"]Cl[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config::transport\"]Cb[10,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]21Bi[5,\"rustls_pki_types\",\"rustls_pki_types\"]Be[5,\"rustls::verify\",\"rustls::verify\"]Ae[10,\"rustls::verify\"]Do[6,\"iroh_quinn_proto::connection::paths\",\"iroh_quinn_proto::connection::paths\"]96Af[5,\"iroh_quinn_proto\"]Bj[15,\"iroh_quinn_proto::PacketDecodeError\"]Ah[5,\"iroh_quinn::crypto\"]Ci[5,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]?Aa[6,\"perf\",\"perf\"]Ee[5,\"iroh_quinn_proto::transport_parameters\",\"iroh_quinn_proto::transport_parameters\"]Bj[5,\"iroh_quinn\",\"iroh_quinn::recv_stream\"]Bo[2,\"iroh_quinn_proto::connection::send_buffer\"]Be[2,\"iroh_quinn_proto::bench_exports\"]Bh[15,\"iroh_quinn::crypto::rustls::Error\"]Bn[15,\"iroh_quinn_proto::crypto::rustls::Error\"]B`[5,\"iroh_quinn::crypto::rustls\"]Di[5,\"iroh_quinn_proto::crypto::rustls\",\"iroh_quinn_proto::crypto::rustls\"]Be[6,\"rustls::suites\",\"rustls::suites\"]A`[5,\"iroh_quinn\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::varint\"]Be[6,\"rustls::webpki\",\"rustls::webpki\"]Bi[5,\"iroh_quinn\",\"iroh_quinn::connection\"]Af[2,\"iroh_quinn_proto\"]Aa[10,\"iroh_quinn\"]Ci[10,\"iroh_quinn_proto\",\"iroh_quinn_proto::cid_generator\"]Be[5,\"rustls::verify\",\"rustls::verify\"]7Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::config\"]Ce[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::connection\"]Ca[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::packet\"]Ao[5,\"certificate\",\"certificate\"]Bc[6,\"rustls::error\",\"rustls::error\"]5Bm[5,\"perf::noprotection\",\"perf::noprotection\"]01Ah[5,\"iroh_quinn::crypto\"]Ci[5,\"iroh_quinn_proto::crypto\",\"iroh_quinn_proto::crypto\"]Ce[5,\"rustls::crypto::cipher\",\"rustls::crypto::cipher\"]Ch[5,\"iroh_quinn_proto\",\"iroh_quinn_proto::cid_generator\"]07Bh[15,\"iroh_quinn::crypto::rustls::Error\"]Bn[15,\"iroh_quinn_proto::crypto::rustls::Error\"]")
\ No newline at end of file
diff --git a/pr/427/docs/search.index/root.js b/pr/427/docs/search.index/root.js
index 02ae29172..2092ec9fa 100644
--- a/pr/427/docs/search.index/root.js
+++ b/pr/427/docs/search.index/root.js
@@ -1 +1 @@
-rr_('{"normalizedName":{"I":"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","N":"ADG`","E":"OjAAAAAAAAA=","H":"UmqNRaDV"},"crateNames":{"N":"j","E":"OjAAAAAAAAA=","H":"ijgfzyvU"},"name":{"N":"ADG`","E":"OjAAAAAAAAA=","H":"VuweqJOU"},"path":{"N":"BAg","E":"OzAAAAEAAFgStQACAAQACQAAAAsAYgBvAAEAdQAAAHsABACGAAEAigAbAKgA5ACPAQgAmQEyANABAADUAQUA4AEBAOQBAgDoAQAA7gEFAPYBLQIlBAAAJwQSADsEAgA/BAMARAQKAFAECQBcBNoAPwUAAFEFAgBVBQMAWgUAAFwFAABkBZIA+AUBAPwFCAAGBggAEAYCABYGCAAjBgIAJwYEAC8GBQA8BgEASAYCAEwGAgBTBuYAOwcEAEEHAABDBwAARgc8AIQHDwCWBwMAmwcDAKAHGAC6BwkAxgcCAM4HAQDSBwAA1wcBANsHAADdBwMA6QcAAOsHAgDwBwAA8wcAAPYHZgBeCBIAcwgGAHsI7ABqCQAAbAkBAHAJAQB3CQAAfAkFAIYJAACKCQAAjQkCAJMJAQCcCQUApAkYAL4JFADUCWsCQQwAAEcMAQBNDAAAUgwAAFgMAABcDAMAaQwAAHAMCQB7DAcAhAwmAKwMTAD6DAMAAg0AAAQNAQAcDQEAOQ1iAZ4OAgCjDvcAnA8SALAPBwC5DwAAxA8BAMoPAwDQDwMA1Q8BANwPAwDhD0AAIxACACgQFgBFEAEASBACAFMQAQBYEAcAZBAEAGsQAAB6EDEArRAdAM0QAwDVEAAA2BABANsQCQDpEAEA7hABAPQQAwD5EAAA+xACAP8QNgA8EQUARREBAEoRBQBTEQUAXREBAGIRIQCFETAAtxEAALsRAADAEQEAwxEBAMoRAADTEQEA1hEDANsRmQB2EgAAeBIAAHsSAQB+EgQAhBIKAJASAQCYEgIAnBITALESGwDOEgIA1xIBAOESEQD0EgIA+RIDAP4SBwAIEwMADRMFABcTAQAcEwAAHhMBACETFwA6EwIAPhMEAEUTHwBnEwsAdRMEAHwTAACCEyUAqRMEALETBQC5ExoA1RMBANkTEADsExgABxQKABUUBQAcFBQAMhQDADcUFwBSFB0A","H":"ByDzrKTf"},"entry":{"N":"ACFk","E":"OjAAAAEAAAAAAAQBEAAAAAAAAQAHAAgACgBuAHEAcgB2AHcAgACEAIUAiACJAKYApwCNAY4BmAHMAc0BzgHPAdEB0gHTAdoB2wHcAd8B4gHnAekB7AHtAfQBJAQ6BD4EQwRPBFoEWwQ3BTgFOwU8BUAFQQVCBUMFRAVFBUYFRwVIBUkFTgVUBVkFWwVdBWAFYQViBfcF+gX7BQUGDwYTBhQGFQYfBiAGIQYiBiwGLQY1BjYGNwY4BjoGOwY+Bj8GQgZDBkQGRQZGBksGTwZQBjoHQAdCB0QHRQeDB5QHlQeaB58HuQfJB8oHywfMB80H0wfWB+EH4gfjB+QH6AfvB/EH8gddCHEIcgh6CGkJbwlyCXMJdgl6CYQJhQmHCYgJkAmaCZsJogmjCb0J0wlADEMMRAxFDEYMSwxODFEMVAxbDGIMZAxlDGwMbgxvDHoMgwyrDPkM/gwADQENAw0HDQkNDg0PDRINFQ0WDRgNGQ0aDRsNHg0iDSgNKw0sDS4NLw2cDp0OoQ6iDrwPvw/JD9cP2w8iECYQJxA/EEAQTBBPEGAQYxBqEGwQbxBwEHUQdhB5EKwQ0RDaEOcQ6xDsEPAQ+BD6EDcROBE6ETsRRBFJEVIRvxHFEckRyxHMEc8R0hHaEXoSgxKPEpsSzRLbEt0SDBMTExQTFRMbEzkTZRNmE3MTdBN9E4ATqBOwE+oT6xMSFBsUUBRRFA==","H":"ilX1lq13"},"desc":{"N":"FLj","E":"OzAAAAEAAKUNfwEAAAEABwABAAoAUwBsAAAAbgAEAHUAAwCAAAEAgwACAIgAFQCmAOUAjQEBAJgBAgC6AQQAwgEBAMUBAADKAQkA2gECAN8BAADiAQAA5QECAOkBAADsAQEA8AEBAPQBAQD6AQYAFwIAACICAAAlAgIAKgIAAC4CAgAyAgAAOgICAD4CAQBCAgAASwICAFICAABYAgAAWgIAAF0CAABfAgAAYwIAAGkCAAB2AgAAfgIJAIkCAACaAgEAnQICAKMCAAC4AgAAvQIAAMMCAADIAgAAygIAANACAADXAgAA3gIAAOUCAQDtAgAA9AIAAPgCAAAAAwUABwMEABUDAAAmAxQAGwQEACQEAAAmBAAAKAQAACoEAAAsBAwAOgQAAD4EAABABAAAQwQAAEwEAABPBAAAVQQBAFgE4AA7BQEAPwUKAE4FAABUBQAAWQUAAFsFAABdBQYAZQUCAGkFAwB0BX4A9wUEAAQGAQAHBgIADwYAABEGBQAcBgAAHwYDACcGAwAsBgEAMwYFADoGAQA+BgEAQgYEAEsGAQBOBgIAVwbfADoHAQA9BwEAQAcAAEIHAABEBwEASAcAAEwHAABPBwgAWQcBAF0HCwBsBwAAcwcBAHYHAQB8BwIAgAcDAJQHAgCYBwAAmgcBAJ0HCwCuBwEAuQcAAL0HAgDBBwIAyQcEANMHAADWBwIA2wcAAN0HBwDoBwAA7wcAAPEHAQD5BwAA/AcZABwIMABOCAEAXQgAAGIIAgBmCAIAbAgAAG4IAABxCAEAeggAAHwIAACACN8AaQkEAG8JAAByCQEAdgkAAHoJAACACQEAhAkBAIcJAQCQCQAAmgkBAJ8JBACuCQAAtwkEAL0JAADBCQIAxQkCANAJAQDTCQEA4AmtAJEKSQDeClwBPwwBAEMMAwBLDAEATgwAAFEMAABUDAAAVgwBAFsMAABdDAEAYgwAAGQMAQBsDAAAbgwBAHEMCQB8DAIAgAwDAIcMAQCZDAMAoAwBAKMMAgCpDAIArwwAALEMBQC4DD0A+QwAAP4MAAAADQEAAw0AAAcNAAAJDQAADg0BABINAAAVDQEAGA0GACINAAAoDQAAKw0EADwNXgGcDgEAoQ7uAKIPAACoDwMArQ8CALYPAQC5DwMAvw8AAMQPAQDJDwAAzA8BANAPAwDVDwIA2Q8CAN0PAwDwDw8AARABAAQQAAAGEAEAChATACIQAAAmEAEAPBABAD8QAQBMEAAATxAAAFIQAABbEAIAYBAAAGMQAABlEAMAahAAAGwQAABvEAEAdRABAHkQBQCBEAEAhhACAIoQAACMEAAAkxABAJoQAQCeEAQAqxACALAQAQC1EAEAvxADANEQAADYEAIA4BADAOcQAADpEAMA7hACAPUQAQD4EAAA+hAAAP4QAAAAEQIACBECAAwRAgAQEQYAHREAACkRAQAtEQcANxEBADoRAQBEEQAASREAAEwRAQBSEQAAVREDAFwRAABmEQAAaBEAAGoRAABvEQAAcREDAHYRAAB4EQAAehEAAH0RAAB/EQAAgREAAIYRAACJEQAAixEAAI0RAACREQAAkxECAJkRAACbEQAAqBEBALARAACzEQIAtxEAAL8RAgDDEQIAyREAAMsRAQDPEQAA0hEAANoRfwBgEgQAZhIAAGwSAQBvEgEAchIAAHQSAAB2EgAAeBIAAHoSAACDEgAAiRIGAJsSAACeEgEAoRICAKYSAQCqEgUAtBIBALwSAADBEgAAzRIAANsSAADdEgAA4RIDAOwSAwDzEgEACRMAAAwTAgATEwIAFxMBABsTAAAhEwQAMBMBADkTAQA9EwQASRMEAFETAABTEwAAXBMCAGATAgBlEwEAaBMAAGsTAwBzEwEAfRMAAIATAACGEwYAnBMAAJ8TAQCmEwIAqhMAAK0TAACwEwAAxRMBANUTAQDYEwEA3BMAAN4TAADkEwMA6hMBAPITBAD6EwUABRQBAA8UAAASFAAAGxQAACAUAwAtFAAAOxQFAEIUAABIFAAAShQBAFAUAQBaFAAAXhQAAA==","H":"o8M2Lqkm"},"function":{"N":"A@Of","E":"OzAAAAEAAHkDVwAAAAoAbgAbAKYAAQCNAQEAmAEAAMwBIwD0AQEAJAQAACYEAAA6BAAAPgQAAEMEAABPBAAAWgQBADcFLAD3BQAA+gUBAAUGAAAPBgAAEwYDABwGAAAfBgMAJgYsADoHAAA9BwAAQAcCAEQHAgBKBwAAgwcAAJQHBgCdBwAAnwcAALkHAADEBzIAXQgBAHEIAQB6CAAAaAk0AKIJAQC9CQAA0wkAAEAMLwB6DAAAgwwAAKsMAAD5DAAA/gwDAAMNNQCcDgMAoQ4BAJsPAACvDwAAuA8AALoPFwDUDwcA4A8AACIQAAAmEAEAPBAgAF4QGwCsEAEAyRAqAPgQAgD+EAAAMREwAIQRAAC1ESUAdRInALASAADLEhsA8xIAAPUSEwAKExYAORMAAD0TCgBlEwIAbxMSAKgTAACrEwAArhMKAMoTDgDqEwUAAhQEABAUCwAnFAAAMRQFAE8UBAA=","H":"O3bCtshI"},"type":{"N":"AJi","E":"OzAAAAEAAMYSmAACAAQACQAAAAsAYgBvAAEAdQAAAHsABQCEAAAAhgABAIkAHACoAOQAjgEJAJkBMgDQAQEA0wEIAOABAQDkAQIA6AEAAO0BBgD1AWQCXATaADsFAAA/BQIARgUBAE4FAABRBQIAVQUDAFoFAABcBQAAYwWrABAGEAAjBgIAJwYFAC8GBQA8BgEASAYGAFMGcAHGBwIAywcEANIHAADXBwEA2wcAAN0HAwDpBwAA6wcCAO8HBAD2B3oAcgj1AGoJAABsCQEAbwkCAHcJAAB6CQAAfAkFAIYJAACKCQAAjQkCAJMJAQCcCaMCQQwAAEMMAgBHDAEASwwAAE0MAABSDAAAWAwAAFwMAwBiDAAAZAwAAGkMAABsDAAAbww7AKwMUQAADQIABA0BAAcNAAAODQEAEg0AABsNAgAuDQAAOQ1+ArkPAADEDwEAyQ8EANAPAwDVDwIA3A9iAEUQAQBIEAIAUxABAFgQBwBkEAQAaxAAAHoQUADNEAQA1RAAANgQAQDbEAkA6RABAO4QAQD0EEEAOhEAADwRBQBEEQIAShEFAFMRBQBdEQEAYhFTALcRAAC7EQAAwBEBAMMRAgDKEQAA0xEBANYRngB2EgAAeBIAAHsSAQB+EgQAhBIKAJASAQCYEgIAnBIwAM4SAgDXEgEA2xIAAN0SAADhEhUA+RIDAP4SBwAIEwMADRMFABQTAAAXEwEAHBMAAB4TAQAhExsAPhMEAEUTLQB1EwQAfBMAAIITKwCxEwUAuRMaANUTAQDZExAA7BMYAAcUCgAVFAUAHBQUADIUAwA3FBcAUhQdAA==","H":"D8ZyRLoQ"},"alias":{"N":"`","E":"OzAAAAEAAG8UAQAAAG8U","H":"p2IVDFMs"},"generic_inverted_index":{"N":"b","E":"OjAAAAAAAAA=","H":"B7jqqukc"}}')
\ No newline at end of file
+rr_('{"normalizedName":{"I":"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","N":"ADG`","E":"OjAAAAAAAAA=","H":"UmqNRaDV"},"crateNames":{"N":"j","E":"OjAAAAAAAAA=","H":"ijgfzyvU"},"name":{"N":"ADG`","E":"OjAAAAAAAAA=","H":"VuweqJOU"},"path":{"N":"BAg","E":"OzAAAAEAAFgStQACAAQACQAAAAsAYgBvAAEAdQAAAHsABACGAAEAigAbAKgA5ACPAQgAmQEyANABAADUAQUA4AEBAOQBAgDoAQAA7gEFAPYBLQIlBAAAJwQSADsEAgA/BAMARAQKAFAECQBcBNoAPwUAAFEFAgBVBQMAWgUAAFwFAABkBZIA+AUBAPwFCAAGBggAEAYCABYGCAAjBgIAJwYEAC8GBQA8BgEASAYCAEwGAgBTBuYAOwcEAEEHAABDBwAARgc8AIQHDwCWBwMAmwcDAKAHGAC6BwkAxgcCAM4HAQDSBwAA1wcBANsHAADdBwMA6QcAAOsHAgDwBwAA8wcAAPYHZgBeCBIAcwgGAHsI7ABqCQAAbAkBAHAJAQB3CQAAfAkFAIYJAACKCQAAjQkCAJMJAQCcCQUApAkYAL4JFADUCWsCQQwAAEcMAQBNDAAAUgwAAFgMAABcDAMAaQwAAHAMCQB7DAcAhAwmAKwMTAD6DAMAAg0AAAQNAQAcDQEAOQ1iAZ4OAgCjDvcAnA8SALAPBwC5DwAAxA8BAMoPAwDQDwMA1Q8BANwPAwDhD0AAIxACACgQFgBFEAEASBACAFMQAQBYEAcAZBAEAGsQAAB6EDEArRAdAM0QAwDVEAAA2BABANsQCQDpEAEA7hABAPQQAwD5EAAA+xACAP8QNgA8EQUARREBAEoRBQBTEQUAXREBAGIRIQCFETAAtxEAALsRAADAEQEAwxEBAMoRAADTEQEA1hEDANsRmQB2EgAAeBIAAHsSAQB+EgQAhBIKAJASAQCYEgIAnBITALESGwDOEgIA1xIBAOESEQD0EgIA+RIDAP4SBwAIEwMADRMFABcTAQAcEwAAHhMBACETFwA6EwIAPhMEAEUTHwBnEwsAdRMEAHwTAACCEyUAqRMEALETBQC5ExoA1RMBANkTEADsExgABxQKABUUBQAcFBQAMhQDADcUFwBSFB0A","H":"+mkhMnJf"},"entry":{"N":"ACFk","E":"OjAAAAEAAAAAAAQBEAAAAAAAAQAHAAgACgBuAHEAcgB2AHcAgACEAIUAiACJAKYApwCNAY4BmAHMAc0BzgHPAdEB0gHTAdoB2wHcAd8B4gHnAekB7AHtAfQBJAQ6BD4EQwRPBFoEWwQ3BTgFOwU8BUAFQQVCBUMFRAVFBUYFRwVIBUkFTgVUBVkFWwVdBWAFYQViBfcF+gX7BQUGDwYTBhQGFQYfBiAGIQYiBiwGLQY1BjYGNwY4BjoGOwY+Bj8GQgZDBkQGRQZGBksGTwZQBjoHQAdCB0QHRQeDB5QHlQeaB58HuQfJB8oHywfMB80H0wfWB+EH4gfjB+QH6AfvB/EH8gddCHEIcgh6CGkJbwlyCXMJdgl6CYQJhQmHCYgJkAmaCZsJogmjCb0J0wlADEMMRAxFDEYMSwxODFEMVAxbDGIMZAxlDGwMbgxvDHoMgwyrDPkM/gwADQENAw0HDQkNDg0PDRINFQ0WDRgNGQ0aDRsNHg0iDSgNKw0sDS4NLw2cDp0OoQ6iDrwPvw/JD9cP2w8iECYQJxA/EEAQTBBPEGAQYxBqEGwQbxBwEHUQdhB5EKwQ0RDaEOcQ6xDsEPAQ+BD6EDcROBE6ETsRRBFJEVIRvxHFEckRyxHMEc8R0hHaEXoSgxKPEpsSzRLbEt0SDBMTExQTFRMbEzkTZRNmE3MTdBN9E4ATqBOwE+oT6xMSFBsUUBRRFA==","H":"33QY1sXQ"},"desc":{"N":"FLj","E":"OzAAAAEAAKUNfwEAAAEABwABAAoAUwBsAAAAbgAEAHUAAwCAAAEAgwACAIgAFQCmAOUAjQEBAJgBAgC6AQQAwgEBAMUBAADKAQkA2gECAN8BAADiAQAA5QECAOkBAADsAQEA8AEBAPQBAQD6AQYAFwIAACICAAAlAgIAKgIAAC4CAgAyAgAAOgICAD4CAQBCAgAASwICAFICAABYAgAAWgIAAF0CAABfAgAAYwIAAGkCAAB2AgAAfgIJAIkCAACaAgEAnQICAKMCAAC4AgAAvQIAAMMCAADIAgAAygIAANACAADXAgAA3gIAAOUCAQDtAgAA9AIAAPgCAAAAAwUABwMEABUDAAAmAxQAGwQEACQEAAAmBAAAKAQAACoEAAAsBAwAOgQAAD4EAABABAAAQwQAAEwEAABPBAAAVQQBAFgE4AA7BQEAPwUKAE4FAABUBQAAWQUAAFsFAABdBQYAZQUCAGkFAwB0BX4A9wUEAAQGAQAHBgIADwYAABEGBQAcBgAAHwYDACcGAwAsBgEAMwYFADoGAQA+BgEAQgYEAEsGAQBOBgIAVwbfADoHAQA9BwEAQAcAAEIHAABEBwEASAcAAEwHAABPBwgAWQcBAF0HCwBsBwAAcwcBAHYHAQB8BwIAgAcDAJQHAgCYBwAAmgcBAJ0HCwCuBwEAuQcAAL0HAgDBBwIAyQcEANMHAADWBwIA2wcAAN0HBwDoBwAA7wcAAPEHAQD5BwAA/AcZABwIMABOCAEAXQgAAGIIAgBmCAIAbAgAAG4IAABxCAEAeggAAHwIAACACN8AaQkEAG8JAAByCQEAdgkAAHoJAACACQEAhAkBAIcJAQCQCQAAmgkBAJ8JBACuCQAAtwkEAL0JAADBCQIAxQkCANAJAQDTCQEA4AmtAJEKSQDeClwBPwwBAEMMAwBLDAEATgwAAFEMAABUDAAAVgwBAFsMAABdDAEAYgwAAGQMAQBsDAAAbgwBAHEMCQB8DAIAgAwDAIcMAQCZDAMAoAwBAKMMAgCpDAIArwwAALEMBQC4DD0A+QwAAP4MAAAADQEAAw0AAAcNAAAJDQAADg0BABINAAAVDQEAGA0GACINAAAoDQAAKw0EADwNXgGcDgEAoQ7uAKIPAACoDwMArQ8CALYPAQC5DwMAvw8AAMQPAQDJDwAAzA8BANAPAwDVDwIA2Q8CAN0PAwDwDw8AARABAAQQAAAGEAEAChATACIQAAAmEAEAPBABAD8QAQBMEAAATxAAAFIQAABbEAIAYBAAAGMQAABlEAMAahAAAGwQAABvEAEAdRABAHkQBQCBEAEAhhACAIoQAACMEAAAkxABAJoQAQCeEAQAqxACALAQAQC1EAEAvxADANEQAADYEAIA4BADAOcQAADpEAMA7hACAPUQAQD4EAAA+hAAAP4QAAAAEQIACBECAAwRAgAQEQYAHREAACkRAQAtEQcANxEBADoRAQBEEQAASREAAEwRAQBSEQAAVREDAFwRAABmEQAAaBEAAGoRAABvEQAAcREDAHYRAAB4EQAAehEAAH0RAAB/EQAAgREAAIYRAACJEQAAixEAAI0RAACREQAAkxECAJkRAACbEQAAqBEBALARAACzEQIAtxEAAL8RAgDDEQIAyREAAMsRAQDPEQAA0hEAANoRfwBgEgQAZhIAAGwSAQBvEgEAchIAAHQSAAB2EgAAeBIAAHoSAACDEgAAiRIGAJsSAACeEgEAoRICAKYSAQCqEgUAtBIBALwSAADBEgAAzRIAANsSAADdEgAA4RIDAOwSAwDzEgEACRMAAAwTAgATEwIAFxMBABsTAAAhEwQAMBMBADkTAQA9EwQASRMEAFETAABTEwAAXBMCAGATAgBlEwEAaBMAAGsTAwBzEwEAfRMAAIATAACGEwYAnBMAAJ8TAQCmEwIAqhMAAK0TAACwEwAAxRMBANUTAQDYEwEA3BMAAN4TAADkEwMA6hMBAPITBAD6EwUABRQBAA8UAAASFAAAGxQAACAUAwAtFAAAOxQFAEIUAABIFAAAShQBAFAUAQBaFAAAXhQAAA==","H":"fFpwXfKt"},"function":{"N":"A@Of","E":"OzAAAAEAAHkDVwAAAAoAbgAbAKYAAQCNAQEAmAEAAMwBIwD0AQEAJAQAACYEAAA6BAAAPgQAAEMEAABPBAAAWgQBADcFLAD3BQAA+gUBAAUGAAAPBgAAEwYDABwGAAAfBgMAJgYsADoHAAA9BwAAQAcCAEQHAgBKBwAAgwcAAJQHBgCdBwAAnwcAALkHAADEBzIAXQgBAHEIAQB6CAAAaAk0AKIJAQC9CQAA0wkAAEAMLwB6DAAAgwwAAKsMAAD5DAAA/gwDAAMNNQCcDgMAoQ4BAJsPAACvDwAAuA8AALoPFwDUDwcA4A8AACIQAAAmEAEAPBAgAF4QGwCsEAEAyRAqAPgQAgD+EAAAMREwAIQRAAC1ESUAdRInALASAADLEhsA8xIAAPUSEwAKExYAORMAAD0TCgBlEwIAbxMSAKgTAACrEwAArhMKAMoTDgDqEwUAAhQEABAUCwAnFAAAMRQFAE8UBAA=","H":"V9pXUGnN"},"type":{"N":"AJi","E":"OzAAAAEAAMYSmAACAAQACQAAAAsAYgBvAAEAdQAAAHsABQCEAAAAhgABAIkAHACoAOQAjgEJAJkBMgDQAQEA0wEIAOABAQDkAQIA6AEAAO0BBgD1AWQCXATaADsFAAA/BQIARQUBAE4FAABRBQIAVQUDAFoFAABcBQAAYwWrABAGEAAjBgIAJwYFAC8GBQA8BgEASAYGAFMGcAHGBwIAywcEANIHAADXBwEA2wcAAN0HAwDpBwAA6wcCAO8HBAD2B3oAcgj1AGoJAABsCQEAbwkCAHcJAAB6CQAAfAkFAIYJAACKCQAAjQkCAJMJAQCcCaMCQQwAAEMMAgBHDAEASwwAAE0MAABSDAAAWAwAAFwMAwBiDAAAZAwAAGkMAABsDAAAbww7AKwMUQAADQIABA0BAAcNAAAODQEAEg0AABsNAgAuDQAAOQ1+ArkPAADEDwEAyQ8EANAPAwDVDwIA3A9iAEUQAQBIEAIAUxABAFgQBwBkEAQAaxAAAHoQUADNEAQA1RAAANgQAQDbEAkA6RABAO4QAQD0EEEAOhEAADwRBQBEEQIAShEFAFMRBQBdEQEAYhFTALcRAAC7EQAAwBEBAMMRAgDKEQAA0xEBANYRngB2EgAAeBIAAHsSAQB+EgQAhBIKAJASAQCYEgIAnBIwAM4SAgDXEgEA2xIAAN0SAADhEhUA+RIDAP4SBwAIEwMADRMFABQTAAAXEwEAHBMAAB4TAQAhExsAPhMEAEUTLQB1EwQAfBMAAIITKwCxEwUAuRMaANUTAQDZExAA7BMYAAcUCgAVFAUAHBQUADIUAwA3FBcAUhQdAA==","H":"NBMQtlCL"},"alias":{"N":"`","E":"OzAAAAEAAG8UAQAAAG8U","H":"p2IVDFMs"},"generic_inverted_index":{"N":"b","E":"OjAAAAAAAAA=","H":"B7jqqukc"}}')
\ No newline at end of file
diff --git a/pr/427/docs/search.index/type/0fc67244ba10.js b/pr/427/docs/search.index/type/341310b6508b.js
similarity index 99%
rename from pr/427/docs/search.index/type/0fc67244ba10.js
rename to pr/427/docs/search.index/type/341310b6508b.js
index a78f7b018..2a39d4ded 100644
--- a/pr/427/docs/search.index/type/0fc67244ba10.js
+++ b/pr/427/docs/search.index/type/341310b6508b.js
@@ -1 +1 @@
-rd_("CBg[\"\",\"ADswAAABAAAFAAIAGwQEAEIUAAACcAcAAI8HAAA6MAAAAQAAAAAACgAQAAAAygHLAQkG/AxmEqgSvBIhFC0USxRaFDowAAABAAAAAAAaABAAAAD6AfsB/AH9Af4B/wEAAikECAYNBj4HbAebB9QJChFpEqkSNRPfE+ATJBRHFEgUSRRKFF0UYRQ7MAAAAQAAFgERACcEAAD1BQAABwYAAHEHAACOBwAAngcAALMMAwAcDn4AlhAAAAsRBwBrEQAA2xF+AGoSAABsEgAA8RIAADYTAABUEwAAOjAAAAEAAAAAAB0AEAAAAAoGEAYRBhIGagdrB3IHcwd0B3UHdgd3BzwMPQw+DD8MjgyuD7MPvRAiEWUSaBOkE6UTuxMcFCAULhRMFDswAAABAAA5ABMAJgMUAEUEAABRBAIA8wUBAPYFAAALBgEAJQYAAF0HDABrCAMAOwwAAKIMAAAHEAAAOxAAAL4QAABkEQAA8hIAAJwTAAAdFAAATRQAADswAAABAABXAA0AywA9AHwBAQBEBAAAGQgAABsIAABaCAAAXAgAAIkQAwCdEgUAjBMAALwTAAD6EwUADhQAADswAAABAAAVAAcAKwQAAP0MAACbDgAAAxADAGcSAABbEwcAOxQFADswAAABAAARAAgASgQBAHsHBwBZCAAAWwgAAKgPAgCyDwAAHREAAMoSAAADugcAALsHAAC5EgAAA0EEAABCBAAAqAwAAAUXCAAAGAgAABoIAACkDAAAHBEAAAA7MAAAAQAABQACALEBAADaEwQAAAABVgYAAA==\"]Bo[\"AAAAAAAAAAACCRQAAAoUAAAAAAAAAvsQAAD8EAAA\",\"\"]0Bg[\"\",\"AAAFtwkAALgJAAC5CQAAugkAALsJAAA=\"]AIg[\"AAAAAAKiAQAAsgEAAAAABPMFAAD0BQAAYhEAAGMRAAAEGQgAABsIAABaCAAAXAgAADswAAABAAANAAUAIwYBANwJAQCuDAQA/QwAAJgRAwA6MAAAAQAAAAAACwAQAAAASgRLBFkIWwiyD8cQyBCKEYsRjBGNEcoSBDsEAAC6BwAAuwcAACAQAAAEQQQAAEIEAADmEwAA5xMAAAVABAAAGAgAABoIAACrDwAArQ8AAAOlDAAApgwAAKwPAAA6MAAAAQAAAAAACAAQAAAAsQEhBCMEWAfaE9sT3BPdE94TAToTAAABpwwAAA==\",\"AAAAAbQRAAAAAvgFAAD5BQAAAAKHDAAAiAwAAAAFrgwAAK8MAACwDAAAsQwAALIMAAAAAAAAAAIhBAAAIwQAAA==\"]ANg[\"AAAEOgIAAJsCAABHBwAASwcAAAOJDAAAigwAAIsMAAACogEAALIBAAA7MAAAAQAAfgABANsRfgAABvMFAAD0BQAAYhEAAGMRAABtFAAAbhQAAAQZCAAAGwgAAFoIAABcCAAAOzAAAAEAABIABwAjBgEAkAcAANwJAQCuDAQA/QwAAJgRAwBxEgMAOjAAAAEAAAAAAAgAEAAAAEoESwRZCFsIsg+KEYsRjBGNEQU7BAAADgYAALoHAAC7BwAAHhEAAARBBAAAQgQAAOYTAADnEwAABBgIAAAaCAAAqw8AAK0PAAAEbQcAAKUMAACmDAAArA8AADswAAABAAAGAAMAIQQAACMEAADaEwQAAToTAAAAAVYGAAA=\",\"AAAAAAAC+AUAAPkFAAAAAocMAACIDAAAASEQAAAFrgwAAK8MAACwDAAAsQwAALIMAAAAAAAAAAIhBAAAIwQAAAAAA4YHAAByEQAAcxEAAA==\"]Dc[\"\",\"AAAAADswAAABAAAHAAEAwAkHADswAAABAAAJAAIAFxEEAG0RBAAAAWwRAAA=\"]AHm[\"AAAAOjAAAAEAAAAAAAcAEAAAAJ8BoQGuAbABuwG8ATcQOBAEpQEAALcBAADECgAAxwoAADowAAABAAAAAAAJABAAAACgAaYBpwGvAbgBuQEyCzML6BPpEzswAAABAAANAAQAZAUHANwPAADDEAMAuxMAAAeqAQAAKBEAACoRAAAsEQAALhEAADARAADyEgAAOzAAAAEAABUACgCVAQEAnAEAAKwMAQD2DAEALhADALMQAQDCEgMAjBMAAAkUAQBUFAEAAQsUAAAABScRAAApEQAAKxEAAC0RAAAvEQAAAAAAAAAAAVYGAAA=\",\"AAABmgEAAAJsBQAAWhIAAAAAAAKiDwAAqxAAAAAAAAAAAAAAAAAESQcAAE0HAAD6DAAA+wwAAA==\",1]Fk[\"AAAABKEFAAC9BwAAYggAAHYRAAACwQkAAHwMAAABDBEAAAABbAgAAAH7AAAAAgQQAABcEwAAAXwHAAA=\",\"AAAAAaEFAAABpQEAAA==\"]Fk[\"AAAABOcFAADBBwAAZggAAH0RAAACxQkAAIAMAAABEBEAAAF+AQAAAW4IAAAAAgYQAABgEwAAAYAHAAA=\",\"AAAAAecFAAABtwEAAA==\"]AEa[\"AAAAAp0BAACpAQAAOzAAAAEAAAcAAQDACQcAAAQQBgAAEQYAABIGAABlEgAAAAABCxQAAAAAAAL7EAAA/BAAAA==\",\"AAAAADswAAABAAAQAAMAPgcAAMAJBwB7DAcAOzAAAAEAAAsABACeBwAA/RAAABcRBABtEQQAOzAAAAEAAA8ABQBkBQcAmAwCAG4SAgCkEgAAIBQAADowAAABAAAAAAAMABAAAAAoESoRLBEuETARYhFjEWwRkBGREZIRkxGcEwSJEAAAihAAAIsQAACMEAAAAAAFJxEAACkRAAArEQAALREAAC8RAAAAAAAAAAABVgYAAA==\",1]Ec[\"AAAAAAAAOzAAAAEAAAYAAgBUBwMAWQcCADswAAABAAAGAAIATwcEAKkJAQADPQQAAAMGAAAEBgAA\",\"\"]Dg[\"AAAAAAAAAAAB/hMAAAE/FAAAAAAAAAAAAAABAQgAAA==\",\"AAAAAAABrhIAAAGKEwAA\"]Eo[\"AAAAAZ8FAAABpAEAAAIoAAAAjwAAAAEPEAAAASsDAAAC9gAAAPcAAAA=\",\"AAABngAAAAGfBQAAAUoTAAAAAXMMAAA=\"]Ic[\"AAAAAd8FAAADtgEAAGQTAADhEwAAAlUAAACcAAAABmsBAABsAQAAIgQAAFUGAAAcEAAALhQAAAE4AwAA\",\"AAABnwAAAALfBQAATBMAAAABdwwAAAAAAAAAAAAAAAAAAAKgAAAAoQAAAA==\"]Ik[\"AAAAAnQFAADBEgAAAZsHAAABOwcAAAGoAAAAAWQRAAAB+hMAAAJnEgAAOxQAAAAAAAAAAAAAOjAAAAEAAAAAAAgAEAAAABcGOQf7B3sI6Q8AEDIQ/xCcEQ==\",\"AAAAAXQFAAAAAaoSAAABhhMAAA==\"]Ck[\"AAAAAcoBAAAAAAAAAfwTAAABPRQAAA==\",\"AAAAAAABrBIAAAGIEwAA\"]Ck[\"AAAAAcsBAAAAAAAAAf0TAAABPhQAAA==\",\"AAAAAAABrRIAAAGJEwAA\"]Kc[\"AAAAAAAABAoGAAAQBgAAEQYAABIGAAAAOzAAAAEAAAkAAQAxDAkAOzAAAAEAAA0AAQArBA0ABaMMAACoDwAAqQ8AAKoPAAAdEQAAAAGoDAAAA6QMAACrDwAArQ8AAAKlDAAArA8AAA==\",\"AAAAAAAB/RAAAAOYDAAAmQwAAJoMAAA=\"]Mg[\"AAAAAAAAAsgSAADJEgAAAAI3EwAAOBMAAAWQBwAAcRIAAHISAABzEgAAdBIAAAACDgYAAB4RAAACQQQAAEIEAAAAAW0HAAAAAAABVgYAAA==\",\"AAAAAAIGBgAADxQAAAAFRRQAAGgUAABpFAAAahQAAGsUAAABnBMAAAIhEAAARhQAAAAAAAAAAAAAAASNEAAAjhAAAI8QAACQEAAA\"]Bg[\"AAAAAAAAAASxEQAAshEAAL8TAADAEwAA\",\"\"]Bk[\"\",\"AAAAAbARAAAAAAAAAAAAAAAAAAAAAAG2DwAA\"]Cc[\"AAAAAAAAAb0QAAABvhAAAA==\",\"AAAAAAAC1gkAANcJAAA=\"]FHg[\"AAAAADswAAABAAAVAAkA+gEGACkEAAAbBgAAfQgAAIUMAACREAMAqRIAAN8TAQBHFAMAOzAAAAEAAPUBEAA5BAAAPwQAAHEHAAB1DAMAPA1eASMQAAAoEAAAlhAAALIQAAALEQcAaxEAANsRfgBqEgAAbBIAADYTAACXEwAAOzAAAAEAAL0ADwCoACIACQFyAH4BDQAiBAAACgYAAFUGAABUBwMAWQcCAGoHAQBxDAMApg8AAGgTAACGEwUALhQAAEEUAAA7MAAAAQAAngBAACYDFAA8BAAARgQBAFEEAgD2BQAACwYBACUGAABPBwQAXQcMAGkIBQBiCQEAqQkBAL4JAQDJCQEAhwwBAJYMAQCiDAAAOg0BAKMPAQC0DwEA6g8BAO0PAQAHEAAAKRABADMQAQA7EAAAlxAAAKUQAQC7EAEAvhAAACMRAQBsEQAAdxEAAHkRAAB7EQAAfhEAAIARAACCEQAAjhEFAJ0RAQCgEQIAsREBAFsSAQC6EgEA8hIAACYTAQAsEwEAThMBAI0TAQCdEwEAoRMBAL8TAQDHEwEA8BMBAAAUAQAdFAIAKRQDADcUAwBNFAAAWxQBAF8UAQBiFAEAZhQBAG0UAQA7MAAAAQAAjwAmAMsAPQB8AQEAlQEBACAEAAA9BAAARAQAAAMGAQAdBgEAGQgAABsIAABaCAAAXAgAADEMCQCsDAEA9gwBALAPAQDkDwEAIRAAAC4QAwCzEAEABREBAB8RAQBoEgAAshIBAMISAwA3EwEAVxMBAIITAQCVEwEAmBMDALwTAAD6EwUACRQBAA4UAABDFAEARhQAAFQUAwBkFAEAOzAAAAEAADEADQArBA0AIwYBAJAHAADcCQEAnwwAAP0MAACbDgAAAxADAJgRAwBxEgMAWxMHAJITAQA7FAUAOjAAAAEAAAAAABYAEAAAAEoESwR7B3wHfQd+B38HgAeBB4IHWQhbCKMMqA+pD6oPsg/HEMgQHRHKEiUUThQHOwQAAA4GAAAgEAAAHhEAAJYRAACXEQAAuRIAAANBBAAAQgQAAKgMAAA6MAAAAQAAAAAACQAQAAAAQAQXCBgIGgikDKsPrQ/7EPwQHBEEbQcAAKUMAACmDAAArA8AADowAAABAAAAAAAHABAAAAAhBCMEWAfaE9sT3BPdE94TAAGnDAAAAVYGAAA=\",\"AAAAAAA7MAAAAQAA3wABADwN3wAAOjAAAAEAAAAAAFkAEAAAAEYERwRpCGoIYgljCb4JvwnJCcoJhwyIDJYMlww6DTsNow+kD7QPtQ/qD+sP7Q/uDykQKhAzEDQQpRCmELsQvBAjESQRdxF5EXsRfhGAEYIRjhGPEZ0RnhGxEbIRWxJcEroSuxImEycTLBMtE04TTxONE44TnROeE6ETohO/E8ATxxPIE/AT8RMAFAEUHhQfFCkUKhQrFCwUNxQ4FDkUOhRbFFwUXxRgFGIUYxRmFGcUbRRuFDswAAABAAAvABQAlQEBAB0GAQCsDAEA9gwBAOQPAQAuEAMAsxABAAURAQAfEQEAshIBAMISAwA3EwEAVxMBAIITAQCVEwEAmBMDAAkUAQBDFAEAVBQDAGQUAQAE3AkAAN0JAACSEwAAkxMAAAAClhEAAJcRAAAAAvsQAAD8EAAAAAIhBAAAIwQAAA==\"]Ho[\"AAAAAXQRAAAAAwcGAACuCQAAZBIAADswAAABAAAMAAMAVAQFAHIHBQDZEwAAAAMWCAAAHxEAACARAAABhBAAAAAHJxEAACkRAAArEQAALREAAC8RAACWEQAAlxEAAAABFwgAAA==\",\"\"]Lk[\"AAACPgIAAJ4CAAAAAqUBAAC3AQAAOzAAAAEAAAsAAwCmAQEAuAEBAAsRBwA7MAAAAQAABwABAGQFBwA6MAAAAQAAAAAABwAQAAAAaQhqCOoP6w8zEDQQjhGPEQACkhMAAJMTAAA=\",\"AAAAAeIPAAAAAAAAAAAAAAAAAAAAAAXhDwAA4w8AAOkPAADsDwAAlBMAAA==\"]AAg[\"AAAEPwIAAJ0CAACvCQAAsAkAAASbAQAAowEAAKgBAAC1AQAAAkICAACjAgAAAAA6MAAAAQAAAAAAEwAQAAAARgRHBGIJYwmZEJsQnRCfEKAQKBEqESwRLhEwEboSuxJfFGAUYhRjFAI3EwAAOBMAAAWuDAAArwwAALAMAACxDAAAsgwAAAAFJxEAACkRAAArEQAALREAAC8RAAAAAAACsQEAAFgHAAA=\",\"AAAAAAAAAAAAAAAAAAAAAAAABGQJAABlCQAAZgkAAGcJAAA=\"]BKo[\"AAADrQkAACgTAAApEwAABZkBAACoCgAAsBEAAC4TAAAvEwAAOjAAAAEAAAAAAAcAEAAAAKQBtgGxCbIJjgrbCgULaRIBahIAAAFoEwAAOjAAAAEAAAAAABEAEAAAAGsIbAhtCG4Iog8pECoQqxB3EXkRexF+EYARghGNE44TKRQqFAGMEwAAOzAAAAEAAAsAAgADEAMAWxMHADswAAABAAAJAAMAewcHAFkIAABbCAAAAAACGAgAABoIAAA=\",\"AAAE/QUAAP4FAACZDwAAmg8AADswAAABAAAWAAsAvAcHAHURAQB4EQAAehEAAHwRAQB/EQAAgREAAF0SAQC5EwEAvRMAAAcUAQACZBMAAOETAAABZBIAAAAAAAAAAAAAAAAAADowAAABAAAAAABrABAAAACPAZABkgGTAfAB8QH3AfgBKAQqBEwEbgVxBUgHTAd5B3oHrgevB58JoAnQCdEJhAyGDJsMnAygDKEMqQyqDKAPoQ+3D90P3g/+D/8PMhCGEIcQoxCkELAQsRC1ELYQvxDAEPUQ9hD/EAERAhEIEQkRExEUERURFhGUEZURqBGpEWASYRJiEmMSphKnErQStRK+EsAS5xLoEukS6hLsEu0S7hLvEioTMBMxEzITSBNZE1oTYxNpE2oTaxNsE20TbhOEE4UTnxOgE6YTpxPFE8YT5BPlEyIUIxQ=\"]Ac[\"AAAAAAEVAwAA\",\"\"]Ca[\"AAAAAAJCAgAAowIAADswAAABAAAFAAEAqhEFAA==\",\"\",1]Ek[\"AAAAAAAAAAAAAAAAAAAAAAAAAm4HAACEBwAA\",\"AAAAAAACmBAAAJoQAAAAApkQAACbEAAAAAJxEgAAchIAAA==\"]Eo[\"AAAAAAAAAAAAAAAAAAAAAAAAAm8HAACFBwAA\",\"AAAAAAACnBAAAJ4QAAAAA50QAACfEAAAoBAAAAACcxIAAHQSAAA=\"]Ck[\"AAAAAAAAAAAAAAAAAAAAAAAABW0AAACTAQAAVQgAAHUIAABmCQAA\",\"\"]Bg[\"AAAAAAAAAa4PAAAAAAAAApYRAACXEQAA\",\"\"]Gk[\"AAAABF4AAAB7BQAAGgYAADYQAAAB/AEAAAYNAAAAJwQAAPUFAACsBwAAphEAAOMTAAACtwAAALMPAAAAAqMTAAD5EwAA\",\"AAAAAXsFAAABYQkAAAElBAAA\"]Ho[\"\",\"AAAAAAAAAAA7MAAAAQAACQABADEMCQA7MAAAAQAADQABACsEDQAFowwAAKgPAACpDwAAqg8AAB0RAAAAAagMAAAEpAwAAKsPAACtDwAAHBEAAAOlDAAApgwAAKwPAAAAAAGnDAAA\"]Bg[\"AAAAAAAAAAAAAAAAAAL7EAAA/BAAAA==\",\"\"]Hk[\"AAADvQEAAI8MAACSDAAAAZ4FAAABpAEAAAQnAAAAjgAAAJgQAACaEAAAAQ4QAAABKgMAAAP1AAAAZxEAAGgRAAA=\",\"AAACvQEAAIwMAAACSAQAAJ4FAAABSRMAAAABcgwAAA==\"]Hk[\"AAADvgEAAJAMAACTDAAAAd4FAAABtgEAAARUAAAAmwAAAJwQAACeEAAAAmoBAAAbEAAAATcDAAADPQQAAGkRAABqEQAA\",\"AAACvgEAAI0MAAADSQQAAN4FAABLEwAAAAF2DAAA\"]2ALo[\"AAAAAAGIEAAAAAA6MAAAAQAAAAAAEQAQAAAAqgE8BJYMlww6DTsNow+kDyMRJBFbElwSNxQ4FFsUXBRmFGcUAkQEAACMEwAAOzAAAAEAAAsAAgADEAMAWxMHADswAAABAAAHAAEAewcHAAAAAAACsQEAAFgHAAA=\",\"AAAH/wUAAAAGAACPDAAAkAwAAJIMAACTDAAAaxIAADowAAABAAAAAAAXABAAAABfCGAIvAnICZEMlAyVDJwPnQ+nEKgQqRD0EHQRhRGGEYcRiBGJEY8T9xP4EwwUDRQ7MAAAAQAA8AACAKMO7ABQEwMAOzAAAAEAAFYABAALAFIAKxMAAFUTAQC+EwAAAUEUAAAAAASYEQAAmREAAJoRAACbEQAABIoRAACLEQAAjBEAAI0RAAABuRIAAAAAAAAAAAdQBAAAFwYAAHgHAACgDgAA9xAAAAcRAACcEQAA\"]Cc[\"AAAAAAKPCgAA3QoAAAAAADswAAABAAAFAAEAnRIFAA==\",\"\"]BNo[\"\",\"ADswAAABAAAFAAIAGwQEAEIUAAACcAcAAI8HAAA6MAAAAQAAAAAACgAQAAAAygHLAQkG/AxmEqgSvBIhFC0USxRaFDowAAABAAAAAAAaABAAAAD6AfsB/AH9Af4B/wEAAikECAYNBj4HbAebB9QJChFpEqkSNRPfE+ATJBRHFEgUSRRKFF0UYRQ7MAAAAQAAEgEQACcEAAD1BQAABwYAAHEHAACOBwAAngcAABwOfgCWEAAACxEHAGsRAADbEX4AahIAAGwSAADxEgAANhMAAFQTAAA6MAAAAQAAAAAAGwAQAAAACgYQBhEGEgZqB2sHcgdzB3QHdQd2B3cHPAw9DD4MPwyuD7MPvRAiEWUSaBOkE6UTuxMcFC4UTBQ7MAAAAQAANwARACYDFABFBAAAUQQCAPMFAQD2BQAACwYBACUGAABdBwwAawgDADsMAACiDAAABxAAADsQAAC+EAAA8hIAAB0UAABNFAAAOzAAAAEAAFIACwDLAD0AfAEBAEQEAAAZCAAAGwgAAFoIAABcCAAAnRIFALwTAAD6EwUADhQAADswAAABAAAUAAYAKwQAAP0MAACbDgAAAxADAFsTBwA7FAUAOzAAAAEAABEACABKBAEAewcHAFkIAABbCAAAqA8CALIPAAAdEQAAyhIAAAK6BwAAuwcAAANBBAAAQgQAAKgMAAAEGAgAABoIAACkDAAAHBEAAAAF2hMAANsTAADcEwAA3RMAAN4TAAA=\"]Bc[\"AAAAAAAAAAAAAAAClhEAAJcRAAA=\",\"\"]Kc[\"AAAAAAE0EwAAADswAAABAAAGAAIAcgcFACIRAAAC9gUAADsQAAABRAQAAAADxxAAAMgQAADKEgAAASAQAAA=\",\"AAAAAAABPwQAADswAAABAAAFAAEAVAQFAAAAAAAAAAAAAAAAB/kBAABtBQAAcAUAAIcHAACIBwAAiQcAAIoHAAA=\"]Do[\"AAAAAAABFwAAAAAAAc8AAAAAAAAAAAAAAAACbQUAAHkHAAA=\",\"AAAAAAAAAAACsA8AALEPAAA=\"]Dk[\"AAAAAAABLgAAAAEPAQAAAAAAAAAAAAAAAAACcAUAAHoHAAA=\",\"AAAAAAAAAAABIAQAAA==\"]Ac[\"AAABSwIAAA==\",\"\"]Fg[\"AAAABKMFAAC+BwAAYwgAAHgRAAADwgkAAH0MAABIFAAAAQ0RAAAAAAH9AAAAAV0TAAABfQcAAA==\",\"AAAAAaMFAAAAAaYBAAA=\"]Fg[\"AAAABOkFAADCBwAAZwgAAH8RAAADxgkAAIEMAABKFAAAARERAAABgAEAAAAAAWETAAABgQcAAA==\",\"AAAAAekFAAAAAbgBAAA=\"]Bk[\"\",\"AAAAAAAAAAA7MAAAAQAAPwACAMsAPQB8AQEA\"]Ck[\"\",\"AAAAAAE+BwAAOzAAAAEAAAkAAgCeBwAAoAcIAAEgFAAAAZwTAAA=\"]Bo[\"\",\"AAAAAAAAAAAAAAAAAuYTAADnEwAAAAAAAToTAAA=\"]Eo[\"\",\"AAAAAAA7MAAAAQAABQABAKoSBQA7MAAAAQAABQABAIYTBQAAOzAAAAEAAAUAAQD6EwUAOzAAAAEAAAUAAQA7FAUA\"]Ck[\"AAACTQIAAF0CAAA=\",\"AAAAAAAAAqkTAACqEwAAAAACmBEAAJkRAAA=\"]Cc[\"\",\"AAAAAAJJEwAAShMAAAAEcQwAAHIMAABzDAAAdAwAAA==\"]Eo[\"AAAAAagFAAAAASsAAAAAAAIHAQAACAEAAA==\",\"AAA7MAAAAQAACgACAH4CCQCJAgAAAqgFAAAvFAAAAAAByBIAAA==\"]Eo[\"AAAAAeYFAAAAAVwAAAAAAAJ8AQAAfQEAAA==\",\"AAA7MAAAAQAACgACAAADBQAHAwQAAuYFAAAwFAAAAAAByRIAAA==\"]Dg[\"AAAB5QIAAAHkBQAAAAFaAAAAAnUBAAB2AQAA\",\"AAAB9AIAAAHkBQAAAAAAAAE9BAAA\"]Eo[\"AAAAAAAAAoUBAACGAQAA\",\"AAAAAAAABxwUAABFFAAATBQAAGgUAABpFAAAahQAAGsUAAACHRQAAE0UAAABRhQAAA==\"]Bk[\"AAAAAAAAATUBAAA=\",\"AAABvQIAAAAAATkEAAA=\"]Bo[\"AAAAAe0FAAAAAAGHAQAA\",\"AAAAAe0FAAABwxMAAA==\"]Bg[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAAfgMAAA=\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA1YIAAB2CAAAZwkAAA==\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAlAEAABXCAAA\",\"\"]Cc[\"AAAAAAAAAAKpCQAAqgkAAAAAAAAAAAACsQEAAFgHAAA=\",\"\"]Fo[\"AAAAAAACBwYAAGwSAAAAAAAAAAAAAAAAAAAEfAgAALcPAADBEAAAsxEAAA==\",\"AAEdCAAAAAAAAAAAAAAAAAAAAAAAAALCEAAAZhEAAA==\"]Bk[\"AAAAAQkGAAAAAAGuDwAAAQcQAAA=\",\"AAFOCAAA\"]Bg[\"AAAAAAAABMMQAADEEAAAxRAAAMYQAAA=\",\"\"]Ag[\"AAAAAp0BAACpAQAA\",\"\"]Dg[\"AAAAAAAAAAAAAtwJAADdCQAA\",\"AAAAAAAAAAAABa4MAACvDAAAsAwAALEMAACyDAAA\"]AGc[\"AAAAAAKiAQAAsgEAAAAABPMFAAD0BQAAYhEAAGMRAAAEGQgAABsIAABaCAAAXAgAADswAAABAAALAAQAIwYBAK4MBAD9DAAAmBEDADowAAABAAAAAAALABAAAABKBEsEWQhbCLIPxxDIEIoRixGMEY0RyhIEOwQAALoHAAC7BwAAIBAAAARBBAAAQgQAAOYTAADnEwAABUAEAAAYCAAAGggAAKsPAACtDwAAA6UMAACmDAAArA8AADowAAABAAAAAAAIABAAAACxASEEIwRYB9oT2xPcE90T3hMBOhMAAAGnDAAA\",\"AAAAAbQRAAAAAvgFAAD5BQAAAAKHDAAAiAwAAAAAAAAAAAACIQQAACMEAAA=\"]He[\"\",\"AAAAAAAEswwAALQMAAC1DAAAtgwAAAKODAAAIBQAAAJkEQAAnBMAAAWJEAAAihAAAIsQAACMEAAAjBMAAAFnEgAAAAG5EgAAAAEXCAAAAAGxAQAAAAABVgYAAA==\",1]AMk[\"AAACqwEAALQBAAAGmwEAAKMBAACoAQAAtQEAAC4TAAAvEwAABAgGAADUCQAAkAoAANwKAAAEswwAALQMAAC1DAAAtgwAAAKkEwAApRMAADowAAABAAAAAAAHABAAAACpCaoJpRCmECYTJxMeFB8UOjAAAAEAAAAAAAkAEAAAACAEGQgbCFoIXAiwD7EPIRBDFEQUAAJZCAAAWwgAAA==\",\"AAAAOjAAAAEAAAAAABAAEAAAAJEB9wf4B/kH+gd+CH8ItwwkECUQuhAlESYRthK3EvASKBQD0gkAAIgQAADrEgAABrMMAAC0DAAAtQwAALYMAAC9EgAAvxIAAAAAAAIjBgAAJAYAAAACOwQAACAQAAAAA0AEAACrDwAArQ8AAAOlDAAApgwAAKwPAAAAAAKnDAAAAg0AADowAAABAAAAAAALABAAAACUAU0ETgRvBXIFNwc4B7AH+wd7CHwIABA=\"]Bg[\"AAAAAAAAAAAAATYEAAA=\",\"AAAAAVMGAAA=\"]Bk[\"AAAAAAAAADswAAABAAANAAIAJQYAAF0HDAA=\",\"\"]Cc[\"AAABpAkAAAABAAIAAAAAAAEgBAAA\",\"AAAAAAAAAAE8BAAA\"]Bc[\"AAAAAAAAAAAAAAAAAAAAAVgHAAA=\",\"\"]Be[\"AAAAAAAAAxAGAAARBgAAEgYAAA==\",\"\",1]Bg[\"AAAAAAAAADswAAABAAAUAAEAJgMUAA==\",\"\"]Ck[\"\",\"AAAAAATLCQAAzAkAAM0JAADOCQAAAAAAAAAAAAAAAAAAAV0QAAA=\"]Bg[\"AAAAAAAAAAAAATEEAAA=\",\"AAAAAW8IAAA=\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAWMAAAA=\",\"\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAaAAAAA=\",\"\"]BMe[\"AAAAAAAB8RIAAAG7EwAAAqoBAADyEgAAOjAAAAEAAAAAABsAEAAAAJwBHQYeBuQP5Q8FEQYRshKzElcTWBOCE4MTlROWE5gTmROaE5sToxO8E/kTQxREFFYUVxRkFGUUOzAAAAEAAAYAAwDcCQEAAxADAAsUAAACJRQAAE4UAAAAAAABbQcAAAAAAAFWBgAA\",\"AAAFtwkAALgJAAC5CQAAugkAALsJAAAEiQwAAIoMAACLDAAAWhIAADswAAABAAASAAgAcAgAAGAJAQDLCQMA0gkAAH8QBADrEgAA9BIAAFATAwA7MAAAAQAAIAAOAMYBAADIAQAAJQQAADkEAAA/BAAAoAcIALMMAwClDwAAshAAABcRBABtEQQAMxMAAJcTAADiEwAAOzAAAAEAACMACQAiBAAAVAQFAFUGAAB5CAAApg8AAAoQEwCkEgEAqRMBAKwTAQA7MAAAAQAACAAEAJcQAACQEQMAoBECAMQTAAA7MAAAAQAADAAGACAEAACwDwEAiRADAGcRAwCjEwAA+RMAAARxEgAAchIAAHMSAAB0EgAAA6MMAAAlFAAAThQAAAM7BAAAIBAAAB4RAAAAAAFtBwAAAbEBAAAAADowAAABAAAAAAAdABAAAACiAKMApAClAE4HXAepB6oHqwedCc8J2AnZCdoJ2wneCd8J7w8IEAkQKxAsEC0QtxC4ELkQnxFfEskTbBQ=\",1]Bg[\"AAAAAAAAAAAAAAAAAAL7EAAA/BAAAA==\",\"\"]Jo[\"AAAAAYUFAAAAOjAAAAEAAAAAAAcAEAAAABgAiwDGASUEpQ+rEa4RVRMCCxAAAKQSAAACJwMAAF4HAAAC0AAAANEAAAAAAVkIAAAAAAEYCAAA\",\"AAEiCAAAAANeAAAAXwAAAIUFAAACQgIAAHAIAAACqxEAAK4RAAAAAVAHAAA=\"]A@c[\"AAAAAawFAAAABzAAAACTAAAAyAEAAK0RAACvEQAAMxMAAFYTAAAHEgEAABMBAACmDwAAExAAAB8QAACqEAAApRIAAAQvAwAAYwcAAKIMAADEEwAAAWgSAAABmw4AAANbCAAAJRQAAE4UAAAAAAEaCAAA\",\"AAE3CAAAAAGsBQAAAqMCAAAGBgAAAq0RAACvEQAAAVUHAAAAAAGfDAAAAAG5EgAAAAAAAAAABWMAAABkAAAAZQAAAGYAAABnAAAA\"]Bo[\"\",\"AAAAAAAAOzAAAAEAAKMAAwCoACIACQFyAH4BDQA=\"]CCi[\"\",\"AAA7MAAAAQAA3wABAFEL3wA7MAAAAQAA5gAKAF8KLgCRCjIAxQoBAMgKEgDeCh8A/woFAAYLKgA1CxsAoxIAAC8UAQA6MAAAAQAAAAAAEgAQAAAADQZUBj4HsQmyCY4KjwqQCsQKxwrbCtwK3Qr+CgULMQs0C0kTShM6MAAAAQAAAAAAEgAQAAAAJwT1BZ4HrAfWCdcJMgszC6YRqhKrEqwSrRKuEq8SVBPjE+gT6RM6MAAAAQAAAAAAKQAQAAAAagdrB3kIPAw9DD4MPwxxDHIMcwx0DI4Msw/cDx8QqhC9EMMQxBDFEMYQIhHIEskShhOHE4gTiROKE4sTqROqE6wTrRMcFCAURRRMFGgUaRRqFGsUOjAAAAEAAAAAABoAEAAAADwEUQRSBFMECwYMBk8HUAdRB1IHUweiDDsQmRCbEJ0QnxCgEL4QbBGgEaERohGcE8QTHRRNFDswAAABAABZAA8AywA9AHwBAQAgBAAAPQQAAEQEAAADBgEAFggAALAPAQAhEAAAaBIAAJ0SBQCjEwAA+RMGAA4UAABGFAAAOzAAAAEAABEACAAjBgEAnwwAAP0MAACbDgAAhBAAAJgRAwCSEwEAOxQFAAayDwAAxxAAAMgQAADKEgAAJRQAAE4UAAA6MAAAAQAAAAAACgAQAAAAOwQOBroHuwcgECcRKRErES0RLxG5EgRBBAAAQgQAAOYTAADnEwAABBcIAAAYCAAAGggAABwRAAACpgwAAKwPAAA6MAAAAQAAAAAACAAQAAAAsQEhBCMEWAfaE9sT3BPdE94TAToTAAAAAVYGAAA=\",1]Le[\"\",\"AAAAAroBAAA8BwAAA5wHAACeDwAAnw8AAAOOBwAAvRIAAL8SAAA6MAAAAQAAAAAABwAQAAAArg9lEm4SbxJwEqQTpRPZEwJFBAAAOwwAAAGcAQAAAQsUAAAEqA8AAKkPAACqDwAAHREAAAABqAwAAARABAAApAwAAKsPAACtDwAAAaUMAAAAAAGnDAAA\",1]Fo[\"\",\"AAAAOjAAAAEAAAAAAAcAEAAAAMoBywFmErwSIRQtFEsUWhQCmwcAAIgQAAAEOwcAAK4JAADfDwAAZBIAAAFoEwAAAWQRAAABjBMAAA==\"]Bo[\"\",\"AAAAAksTAABMEwAAAAR1DAAAdgwAAHcMAAB4DAAA\"]Bk[\"\",\"AAAAAAAAOzAAAAEAAAYAAgBUBwMAWQcCAA==\"]Fc[\"AAAAAbMBAAAAAAAABB0GAAAeBgAA5A8AAOUPAAA=\",\"AAA7MAAAAQAAPQABALgMPQAAAAAAAAAAAAAAAAAAAAABiwcAAA==\"]Ao[\"\",\"AAA7MAAAAQAA3wABAIAI3wA=\"]AAg[\"AAAEUgIAAGMCAABpAgAAmQ8AAAGDBQAAAzUTAABdFAAAYRQAAAMVAAAAigAAAKoRAAABChAAADowAAABAAAAAAAMABAAAAAmA1EEUgTzBfQFCwZdB50RnRPHE/ATKxQ5FALLAAAAzAAAAA==\",\"AAEhCAAABzoCAAA7AgAAPAIAAD4CAAA/AgAArwkAACgTAAABgwUAAASxCQAAjgoAAI8KAACQCgAAAaoRAAABcQwAAANPBwAAoBEAAKERAAAAAAAAAAAAAAAAAZEPAAA=\"]ABc[\"AAAEwwIAAOYCAADtAgAAmg8AAAGpBQAAAAQsAAAAkQAAAKwRAAA2EwAABAsBAAAMAQAAERAAAC4UAAA6MAAAAQAAAAAACgAQAAAALQNTBPYFDAZiB54RnhPIE/ETLBQ6FAABmw4AAA==\",\"AAE2CAAAB5oCAACbAgAAnQIAAJ4CAACfAgAAsAkAACkTAAABqQUAAASyCQAA2woAANwKAADdCgAAAnUMAACsEQAAAlQHAAB5CAAAAaIRAAAAAAAAAAAAAAAABJMPAACUDwAAlQ8AAJYPAAA=\"]Cg[\"AAAAAAAAAAAAAAAAAUEEAAAAAAEhBAAA\",\"AAAAAAAAAAFiEQAA\"]Cg[\"AAAAAAAAAAAAAAAAAUIEAAAAAAEjBAAA\",\"AAAAAAAAAAFjEQAA\"]Fo[\"AAA7MAAAAQAACwAEAHoQBABNEwAA8hMEAF4UAAA=\",\"ADswAAABAAAJAAIA/AcEACETBAA7MAAAAQAACwAEAHoQBABNEwAA8hMEAF4UAAA=\"]Ho[\"AAAAAAAAAAA7MAAAAQAACQABADEMCQA7MAAAAQAADQABACsEDQAFowwAAKgPAACpDwAAqg8AAB0RAAAAAagMAAAEpAwAAKsPAACtDwAAHBEAAAOlDAAApgwAAKwPAAAAAAGnDAAA\",\"\"]Cc[\"AAAAAp8BAAAlEQAAAAAAAAGsDAAAAAFKBAAAAboHAAA=\",\"\"]Cc[\"AAAAAq4BAAAmEQAAAAAAAAGtDAAAAAFLBAAAAbsHAAA=\",\"\"]ABc[\"AAAAAjsTAAA8EwAAAAWmAQAApwEAALgBAAC5AQAAaxEAADswAAABAAALAAMAZAUHAAoGAACYDAIAOjAAAAEAAAAAAAcAEAAAAPYFawhsCG0Ibgi0D7UPBxAHZxEAAGgRAABpEQAAahEAALwTAAAOFAAARhQAADswAAABAAANAAQAnwwAAJsOAAADEAMAWxMHADswAAABAAAHAAEAewcHAAIeEQAAuRIAAAABFwgAAAFtBwAAAAAAAVYGAAA=\",\"AAAAA8ABAADBAQAAwgEAAAABshAAAA==\"]Ek[\"AAAAAAAAAAAAAAAAAAAAAAACAQYAAJEHAAA=\",\"AAAAAAAAAAKQEQAAkREAAAAAAAAAAAAAAAACbgcAAIQHAAA=\"]Ek[\"AAAAAAAAAAAAAAAAAAAAAAACAgYAAJMHAAA=\",\"AAAAAAAAAAKSEQAAkxEAAAAAAAAAAAAAAAACbwcAAIUHAAA=\"]Ak[\"\",\"AAAAAAIBEAAAAhAAAA==\"]Eo[\"AAAABKUFAAC/BwAAZAgAAHoRAAACwwkAAH4MAAABDhEAAAAAAf8AAAABXhMAAAF+BwAA\",\"AAAAAaUFAAAAAacBAAA=\"]Eo[\"AAAABOsFAADDBwAAaAgAAIERAAACxwkAAIIMAAABEhEAAAGCAQAAAAABYhMAAAGCBwAA\",\"AAAAAesFAAAAAbkBAAA=\"]Bg[\"AAAAAAAAAAAAATAEAAA=\",\"AAAAAdUJAAA=\"]Ag[\"AAACngEAAK0BAAA=\",\"\"]Bg[\"AAAAAAAAAAAAAAAAAAKkDAAAHBEAAA==\",\"\"]Ag[\"\",\"AAACoRAAAKIQAAA=\"]Bc[\"AAAAAAAAAAAAAWcSAAA=\",\"AAFsAAAA\"]Dg[\"AAAAAsABAADBAQAAAAADEAYAAJgMAABuEgAAAAGcAQAAAQsUAAA=\",\"AAAAAVoSAAA=\"]Hg[\"AAAAAYURAAABUBMAAAOYEAAAGBEAAG4RAAABqRMAAAGQEQAAAYkQAAACmBEAAHESAAABihEAAAAAAAAB2xMAAA==\",\"AAAAAAAAAAIoEQAAKhEAAAAAAAInEQAAKREAAA==\"]Ig[\"AAAAAYgRAAABUhMAAAOcEAAAGhEAAHARAAABrBMAAAGSEQAAAYsQAAACmhEAAHMSAAABjBEAAAAAAAAB3RMAAA==\",\"AAAAAAFlEQAAAAADLBEAAC4RAAAwEQAAAAAAAysRAAAtEQAALxEAAA==\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmsAAACWDwAA\",\"\"]Bk[\"AAAAAAAAAcoAAAAAAAE4BAAA\",\"AAAAAXgIAAA=\"]Cc[\"AAAAAboQAAABZBMAAAACIgQAAFUGAAA=\",\"AAAAAAF9CAAA\"]Ek[\"AAAAAYoFAAAAARsAAAAAAAHWAAAAAAAAAAAAAAAAAm8FAAA3BwAA\",\"AAEnCAAAAAGKBQAAAAAAAAAAAccQAAA=\"]Ek[\"AAAAAbkFAAAAAToAAAABJAEAAAAAAAAAAAAAAAAAAnIFAAA4BwAA\",\"AAE+CAAAAAG5BQAAAAAAAAAAAcgQAAA=\"]Be[\"AAAAAAA7MAAAAQAAfgABANsRfgA=\",\"\",1]Bg[\"AAAAAAAAAAAAATMEAAA=\",\"AAAAAXAMAAA=\"]Ec[\"AAAAAAAAAAAAAAAAAAIYCAAAGggAAAFtBwAAArEBAABYBwAA\",\"AAAAAAAAAAAAAAAAAAAAAbEBAAA=\"]Dk[\"AAAAAAAAAAAB/xMAAAFAFAAA\",\"AAAAAAABrxIAAAGLEwAAAAAAAAAAAAAAAAABAQgAAA==\"]Dg[\"AAAAAdEFAAAAAAJPAQAAUAEAAAFmBwAAAAAAAAAAAAAAAAH5AQAA\",\"AAAAAdEFAAA=\"]ABc[\"AAAAA5kBAACgCgAAsBEAAANsBwAA/goAAAoRAAAAADowAAABAAAAAAANABAAAAC+Cb8JyQnKCe0P7g+7ELwQLBMtE04TTxOhE6ITOzAAAAEAAA8ABwAFEQEAnRIFAFcTAQCjEwAA+RMAAFYUAQBkFAEAAAIlFAAAThQAAA==\",\"AAAAA4wBAACXAQAAhRAAAAR/EAAAgBAAAIEQAACCEAAAAsYBAADIAQAAAAACoxMAAPkTAAAAAiUUAABOFAAAAAAAAAAAAATHAQAAyQEAAKEJAACzEQAA\"]Bk[\"AAAAAAGbBwAA\",\"AAAAAAAAAAFkEQAAAAFnEgAA\"]Ho[\"AAAABXkFAAAZBgAAUwYAAPwMAAC2EgAAAp8PAAAkFAAAAo4HAADxEgAAA7EAAABlEgAAuxMAAAH0BQAAARYIAAABhBAAAA==\",\"AAAAAnkFAAA8BwAAAZwHAAAAAAABnAEAAAELFAAA\"]Gc[\"AAAAArcSAAC9EwAAAUMHAAABcQcAAAEKAQAAApcQAADyEgAAAAGQBwAAAAEOBgAAAAEXCAAAAW0HAAAAAAABVgYAAA==\",\"AAAAAAAAAAGqAQAA\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAWoAAAA=\",\"\"]Fc[\"AAADcAcAAI8HAAD7DwAABJQMAACuEAAApREAAAwUAAAE+wEAAA0GAABUBgAAzQkAAAACswAAANwPAAA=\",\"AAABAxEAAA==\"]Fc[\"AAAABJUMAACvEAAApxEAAA0UAAABzgkAAAFxBwAAAVIBAAAAAAGQBwAAAAEOBgAAAAAAAAAAAVYGAAA=\",\"AAABBBEAAA==\"]Dg[\"AAAAAdYFAAAAAU4AAAABWwEAAA==\",\"AAAAAdYFAAAAAAAAAAAAAAAAAAAAAAFtAAAA\"]Bk[\"AAAAAAH6AQAAAAAAAAEtBAAA\",\"AAAAAZ0MAAA=\"]Cc[\"AAAAAAFwCAAAAAAAAAEuBAAA\",\"AAAAAAACngwAALgSAAA=\"]Dk[\"\",\"AAAAADswAAABAAATAAEAAggTADswAAABAAATAAEAigATADswAAABAAATAAEAChATAA==\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAWgAAAA=\",\"\"]Ak[\"\",\"AAAAAAIeEAAAwxMAAA==\"]Ag[\"\",\"AAAAAAAB4hMAAA==\"]Fg[\"AAAAAe4FAAAAAAGJAQAAAAAAAAAAAUAEAAAAAAABpwwAAAakAAAAlAEAAPMBAABcBwAAsAcAAF8SAAA=\",\"AAFNCAAAAAHuBQAA\"]Hk[\"AAAEngAAADsCAAD9BQAAjAwAAAGgBQAAAAIpAAAAkAAAAAEQEAAAAiwDAABhBwAAAvgAAAD5AAAA\",\"AAABaQIAAARgAAAAYQAAAGIAAACgBQAAAaQBAAAAAXQMAAABUwcAAA==\"]Kc[\"AAAEnwAAAJ8CAAD+BQAAjQwAAAHgBQAAAARWAAAAnQAAACMQAAAoEAAAA20BAABuAQAAHRAAAAI5AwAAaAcAAA==\",\"AAAB7QIAAAHgBQAAAbYBAAABeAwAAAMiBAAAVQYAAFoHAAAAAAAAAAAAAAAAAARoAAAAaQAAAGoAAABrAAAA\"]Ak[\"AAAAAAI5EAAAOhAAAA==\",\"\"]Ao[\"AAAAAAAAAAAClQEAAJ0SAAA=\",\"\"]Ao[\"AAAAAAAAAAAClgEAAKASAAA=\",\"\"]Dc[\"AAAAAAAAAAAB+gAAAAAAAAAAAAAAAAWiAAAATQQAAKkHAADmDwAAtxAAAA==\",\"\"]Fc[\"AAAAAAAAAW8BAAAAAAAAAAAAAAAAAAWjAAAATgQAAKoHAADnDwAAuBAAAA==\",\"AAAAAAAAAAAAAZAHAAAAAg4GAAAeEQAA\"]Fc[\"AAAAAe8FAAAAAAGKAQAAAkUEAAA7DAAAAAAAAAGoDAAAAAAAAAAFpQAAAKsHAACeCQAA6A8AALkQAAA=\",\"AAAAAe8FAAA=\"]Go[\"AAAAAYYFAAAAARkAAAAAAAHSAAAAAAAAAAAAAAAAA48BAABuBQAAhAwAAA==\",\"AAEjCAAAAAGGBQAAAAAAAAAAAAAAAAAAAAAEsQcAALIHAAC1BwAAtgcAAA==\"]Go[\"AAAAAbMFAAAAATYAAAABHAEAAAAAAAAAAAAAAAAAA5ABAABxBQAAhgwAAA==\",\"AAE6CAAAAAGzBQAAAAAAAAAAAAAAAAAAAAAEswcAALQHAAC3BwAAuAcAAA==\"]Bc[\"AAAAAAAAAAAAAAAAAAAAAAE6EwAA\",\"\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAWkAAAA=\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmQAAACNBwAA\",\"\"]Bg[\"AAAAAAAAAAAAATIEAAA=\",\"AAAAATkNAAA=\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAaEAAAA=\",\"\"]Dk[\"AAAAAaIFAAABpQEAAAABZQUAAAF3EQAAAfwAAAA=\",\"AAEwCAAAAAGiBQAAAAAAAXcRAAA=\"]Dk[\"AAAAAegFAAABtwEAAAACfwEAAGkFAAABfhEAAA==\",\"AAFJCAAAAAHoBQAAAAAAAX4RAAA=\"]Hc[\"AAAAAAAB3w8AAAHZEwAAAAH7EwAAATwUAAAAAAAAAAAAADowAAABAAAAAAANABAAAAB4B50J2gmgDuwP7w8rEPcQBxGfEb4SwBKUE8kT\",\"AAAAAAABqxIAAAGHEwAA\"]Ak[\"AAAAAALfEwAA4BMAAA==\",\"\"]Cg[\"AAAAAfASAAAB0gkAAAE/BAAAAAABRAQAAA==\",\"AAAAAAGFDAAA\"]Ag[\"\",\"AAAAAAAAAVsHAAA=\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmUAAACnDwAA\",\"\"]Ag[\"AAAAAAAAAAFpBwAA\",\"\"]Dk[\"AAAAAAAAOzAAAAEAAKMAAwCoACIACQFyAH4BDQAAOzAAAAEAAD8AAgDLAD0AfAEBAA==\",\"\"]Go[\"AAAAAeEFAAAABFcAAABVEwAAVhMAAL4TAAADcAEAAHEBAABBFAAAAToDAAAAAZ8MAAAAAbkSAAAAAAFtBwAAAAAAApIHAADPCQAA\",\"AAAAAeEFAAAAAAGqEAAA\"]Dk[\"AAAAAZYFAAAAASAAAAAAAV8HAAAC5gAAAOcAAAA=\",\"AAAAApYFAACoCgAAAAAAAVEHAAA=\"]Dk[\"AAAAAcsFAAAAAUUAAAACQQEAAEIBAAABZAcAAA==\",\"AAAAAcsFAAABBQsAAAABVgcAAA==\"]Ck[\"AAAAASQQAAAAAAAAAhkIAABaCAAA\",\"AAAAAAAAAAACiRAAAIoQAAA=\"]Ck[\"AAAAASUQAAAAAAAAAhsIAABcCAAA\",\"AAAAAAAAAAACixAAAIwQAAA=\"]Bk[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAAgARAABtEgAA\"]Ek[\"AAAAA34IAABdEgAAuRMAAAAAAAAAAAFZCAAAAAABGAgAAA==\",\"AAAAAAAAAAKQEQAAkREAAAKJEAAAihAAAA==\"]Ek[\"AAAAA38IAABeEgAAuhMAAAAAAAAAAAFbCAAAAAABGggAAA==\",\"AAAAAAAAAAKSEQAAkxEAAAKLEAAAjBAAAA==\"]Dg[\"AAAAAb8FAAAAAUEAAAACLwEAADABAAA=\",\"AAAAAb8FAAAAAAAAAAGfDAAAAAG5EgAA\"]Ac[\"\",\"AAAAAAEeEAAA\"]Cc[\"AAABvQIAAAGvBQAAAAEyAAAAARYBAAA=\",\"AAAAAa8FAAA=\"]Hc[\"AAAAAYgFAAAAARoAAAAAAAHUAAAAAAAAAAAAAAAAOjAAAAEAAAAAAAoAEAAAAMcB9wGxB7UHoA/hD6MQ5xJZE2kThBM=\",\"AAElCAAAAAKIBQAAGgYAAAABpQ8AAA==\"]Ic[\"AAAAAbUFAAAAATcAAAABHgEAAAAAAAAAAAAAAAAAOjAAAAEAAAAAAAoAEAAAAMkB+AGzB7cHoQ/jD6QQ6BJaE2oThRM=\",\"AAE8CAAAAAG1BQAAAAABpg8AAAAAAAAAAAAAAAAAAacPAAA=\"]Gk[\"AAACIgIAACoCAAABfgUAAAACEAAAAKIHAAACvQAAAL4AAAA=\",\"AAACJQIAACYCAAABfgUAAAAAAAACsA8AALEPAAAAAAI7BAAAIBAAAAABHBEAAAGmDAAA\"]Do[\"AAAAAbcFAAAAAjgAAACUAAAAAyABAAAhAQAAFBAAAAEwAwAA\",\"AAAAAbcFAAAAAAAAASAEAAA=\"]Ck[\"AAAAAsETAADCEwAAAAAAAAAAAAABqAwAAA==\",\"AAAAAAAB/RAAAA==\"]Co[\"AAAAAAABjgcAAANuEgAAbxIAAHASAAAAAZwBAAA=\",\"AAAAAAAB3w8AAA==\"]JNa[\"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\",1]Eo[\"AAAAAAA7MAAAAQAABQABAKoSBQA7MAAAAQAABQABAIYTBQAAOzAAAAEAAAUAAQD6EwUAOzAAAAEAAAUAAQA7FAUA\",\"\"]Ck[\"AAAAAAAAAQoGAAAAAAErBAAA\",\"AAAAAAAAA5gMAACZDAAAmgwAAA==\"]Cc[\"\",\"AAAAAAAEJwQAAKwHAACmEQAA4xMAAAAAAqMTAAD5EwAA\"]Fc[\"AAAAAbIFAAAAATUAAAACGgEAABsBAAA=\",\"AAE5CAAAAAGyBQAAAAACHxAAAKoQAAACogwAAMQTAAAAAAIlFAAAThQAAA==\"]Eo[\"AAAAAaMRAAABywkAAAACrAAAAI4MAAABbBEAAAABLwQAAA==\",\"AAAAAAFUBgAAAAKODAAA3A8AAAABFggAAAGEEAAA\"]Dk[\"AAAABmYSAAC8EgAAIRQAAC0UAABLFAAAWhQAAAAAAAABjBMAAA==\",\"AAAAAAAAAAFkEQAA\"]A@g[\"AAAAOjAAAAEAAAAAAA8AEAAAAEgEdgUYBj8HbwjVCXAMnQy3DDkNNRAhEaQRqBKPEygUOjAAAAEAAAAAAAkAEAAAAMwJHhCDEGkS6xI0EzUTwxNdFGEUOjAAAAEAAAAAAAgAEAAAAMYBJQSeDKUPFxFtEbgSVBPiEzowAAABAAAAAAAHABAAAACtACIRpBIcFEUUTBRoFGoUAfMFAAAAAAAAAAAAAdoTAAA=\",\"AAAAAXYFAAABYAkAAAABjgwAAA==\"]ACk[\"AAAAOjAAAAEAAAAAAAgAEAAAAEkEvAmRDJwP4g/0EIcR9xP4EzowAAABAAAAAAAHABAAAAApBAYGGwZ9CIUMZRGpEuETOjAAAAEAAAAAAAoAEAAAAMgBOQQjECgQlhCyEGsRahIzEzYTlxM6MAAAAQAAAAAABwAQAAAACQGmDx8QqhClEi4UaRRrFAX2BQAAogwAAMQTAAAdFAAATRQAAARoEgAAvBMAAA4UAABGFAAAAp8MAACbDgAAAiUUAABOFAAAAh4RAAC5EgAA\",\"AAAAAAAAAAAAAAAAAAEXCAAAAAAAAAFWBgAA\"]Ho[\"AAAAA7wHAABhCAAAdREAAAPACQAAewwAAEcUAAABCxEAAAABawgAAAACAxAAAFsTAAABewcAAA==\",\"AAAAAAR7DAAAfAwAAH0MAAB+DAAAAAVkBQAAZQUAAGYFAABnBQAApBIAAA==\"]Ho[\"AAAAA8AHAABlCAAAfBEAAAPECQAAfwwAAEkUAAABDxEAAAABbQgAAAACBRAAAF8TAAABfwcAAA==\",\"AAAAAAR/DAAAgAwAAIEMAACCDAAAAAVoBQAAaQUAAGoFAABrBQAApRIAAA==\"]Mc[\"AAAAAYcFAAAAAAAAAdMAAAAAAAAAAAAAAAA6MAAAAQAAAAAAJAAQAAAA8AEoBEgHrgefCdAJmwygDKkM3Q/+D4YQsBC1EL8Q9RABEQgRExEVEXIRlBGoEWASYhKmErQS7BLuEjATaxNtE58TphPFE+QTIhQ=\",\"AAEkCAAAAAGHBQAAAAAAAAAAAAAAAAAAAAACpQkAAKcJAAA=\"]Mc[\"AAAAAbQFAAAAAAEdAQAAAAAAAAAAAAAAAAA6MAAAAQAAAAAAJAAQAAAA8QEqBEwHrwegCdEJnAyhDKoM3g//D4cQsRC2EMAQ9hACEQkRFBEWEXMRlRGpEWESYxKnErUS7RLvEjETbBNuE6ATpxPGE+UTIxQ=\",\"AAE7CAAAAAG0BQAAAAAAAAAAAAAAAAAAAAACpgkAAKgJAAA=\"]Cc[\"AAAAAZ0FAAAAAAAAAfMAAAA=\",\"AAAAAZ0FAAAAAAE8DAAA\"]Ck[\"AAAAAdwFAAAAAAFnAQAA\",\"AAAAAdwFAAAAAAM9DAAAPgwAAD8MAAA=\"]Bk[\"AAAAAAAAAAAAAAAAAAFABAAAAAAAAacMAAA=\",\"\"]Bg[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAAZcPAAA=\"]Eo[\"AAAAAcwFAAAAAUcAAAACRQEAAEYBAAABZQcAAA==\",\"AAAAAcwFAAAAAAFXBwAAAAAAAAAAAAAAAAAC/AUAAJgPAAA=\"]Bk[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAAlgUAABZFAAA\"]Ck[\"AAAAAAAAAAABDhQAAA==\",\"AAAAAAAAAAAAAAAAAAAAAAABbxQAAA==\"]Ag[\"AAACgQIAAAoDAAA=\",\"\"]Cc[\"AAAAAAACngwAALgSAAABsw8AAA==\",\"AAAAAAABrAcAAA==\"]Gc[\"AAAAAa4FAAAAATEAAAABFQEAAAABaBIAAAGfDAAAAAG5EgAA\",\"AAE4CAAAAAGuBQAAAAEzEwAAAR8QAAAAAWgSAAAAAAAAAAAAAAABrQcAAA==\"]Do[\"AAAAAAAAAAG0DwAAAh0GAADkDwAA\",\"AAAAAZ0BAAAAAAABtA8AAAQdBgAA5A8AAGcRAABoEQAA\"]Do[\"AAAAAAAAAAG1DwAAAh4GAADlDwAA\",\"AAAAAakBAAAAAAABtQ8AAAQeBgAA5Q8AAGkRAABqEQAA\"]Ao[\"AAAAAAGIEAAAAAABqxAAAA==\",\"\"]Gc[\"AAABgxEAAAJgAAAAXwgAAAH+AQAAAAG5AAAAAlEEAACgEQAAArAPAAAhEAAAAAGyDwAAAjsEAAAgEAAAAAKkDAAAHBEAAAKlDAAApgwAAA==\",\"\"]Cc[\"AAAAAAAAAAM8BAAAUwQAAKIRAAA=\",\"AAAAAAABIxAAAA==\"]Ec[\"AAABJQIAAAF/BQAAAAIRAAAAowcAAAK/AAAAwAAAAA==\",\"AAABJwIAAAF/BQAAAAAAAqARAAChEQAA\"]Bo[\"AAABAxEAAAAAAAK0AAAAtQAAAA==\",\"AAAAAAENBgAA\"]Ck[\"AAABBBEAAAAAAAJWAQAAVwEAAA==\",\"AAAAAAAAAAAAAAABDgYAAA==\"]Ao[\"AAAAAAAAAWgTAAABog8AAA==\",\"\"]Hg[\"AAAAAmIAAAB4CAAAAf8BAAAB1gkAAAPFAAAAagcAAL0QAAACCwYAADsQAAAAAiMGAAD9DAAABqgPAACpDwAAqg8AAMcQAAAdEQAAyhIAAAAAAqsPAACtDwAAAawPAAA=\",\"\"]Dk[\"AAAAAAAB1wkAAAJrBwAAeQgAAAIMBgAAvhAAAAABJAYAAAHIEAAA\",\"AAAAAAABKBAAAA==\"]Bc[\"AAAAAAAAAAAAAAAAAAAAAAE6EwAA\",\"\"]AAg[\"AAAAATwHAAABnAcAAAQ7BwAAngwAAN8PAAC4EgAAAhwUAABMFAAAA2QRAAAdFAAATRQAAAUWCAAAZxEAAGgRAABpEQAAahEAAAGEEAAAAAAAARcIAAA=\",\"AAAABKMRAACkEQAApREAAKcRAAACng8AAJ8PAAACphEAAOITAAAFRRQAAGgUAABpFAAAahQAAGsUAAABxBMAAAFGFAAAAWcSAAAAAAAAAAAAArkPAADSDwAABvIBAADzAQAAkgcAAOYPAADnDwAA6A8AAA==\"]Cc[\"AAAAAc0FAAAAAUgAAAACRwEAAEgBAAA=\",\"AAAAAc0FAAA=\"]Dc[\"AAAAAAAAAAA7MAAAAQAABQABAJ0SBQA=\",\"AAAABL8BAADDAQAAxAEAAMUBAAA=\"]Ao[\"AAAAAb8BAAAAAAAAAS4QAAA=\",\"\"]Ao[\"AAAAAcQBAAAAAAAAAS8QAAA=\",\"\"]Eo[\"AAAAAYYRAAABURMAAAOaEAAAGREAAG8RAAABqhMAAAGREQAAAYoQAAACmREAAHISAAABixEAAAAAAAAB3BMAAA==\",\"\"]Eo[\"AAAAAYkRAAABUxMAAAOeEAAAGxEAAHERAAABrRMAAAGTEQAAAYwQAAACmxEAAHQSAAABjREAAAAAAAAB3hMAAA==\",\"\"]Bc[\"AAAAAAAAAlQEAAByBwAAAAEwEAAA\",\"\"]Bc[\"AAAAAAAAAlcEAAB1BwAAAAExEAAA\",\"\"]Ec[\"AAAAAboBAAAAAr0SAAC/EgAAAqQTAAClEwAAAkUEAAA7DAAAAAAAAAABQAQAAA==\",\"AAAAAAEVAwAA\"]Gg[\"AAAAAYEFAAAAAhMAAAClBwAAAsYAAADHAAAA\",\"AAADLgIAAC8CAAAwAgAAAYEFAAAAAAABOxAAAAACIwYAAP0MAAACxxAAAMoSAAAAAAABrA8AAA==\"]Eg[\"AAAAAboFAAAAAjsAAACWAAAAAyUBAAAmAQAAFhAAAAEyAwAA\",\"AAAAAboFAAAAAAAAAAEkBgAAAcgQAAA=\"]Ec[\"AAAAAAAAAVUBAAAAAAAAAAAAAAAAAAJzBQAA2wkAAA==\",\"AAAAAAAAAAAAAAAAAAAAAAAAAVYGAAA=\"]Ec[\"AAABeQwAAAF1BQAAAAELAAAAAakAAAA=\",\"AAAAAXUFAAAAAa4JAAAAAAAAAAAAAAAAAAABOQcAAA==\"]Dg[\"AAAAAAEIBgAAAAAAAAAAAAAAAAAAAALCEAAAZhEAAA==\",\"AAEeCAAAAAAAATsHAAA=\"]Ac[\"AAABTAIAAA==\",\"\"]Do[\"AAAAAZUFAAAAAR8AAAAAAALkAAAA5QAAAA==\",\"AAACWAIAAFoCAAABlQUAAAAAAAAAAZITAAA=\"]Dk[\"AAAAAcoFAAAAAUQAAAACPwEAAEABAAA=\",\"AAACyAIAAMoCAAABygUAAAAAAAAAAZMTAAA=\"]Bk[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAArMJAAC1CQAA\"]Dk[\"AAAAAAAAAAABAwEAAA==\",\"AAABdgIAAAAAAAAAAAAAAboHAAABQQQAAAEYCAAAAAEhBAAA\"]Dg[\"AAAAAAAAAXgBAAA=\",\"AAAB+AIAAAAAAAAAAAAAAbsHAAABQgQAAAEaCAAAAAEjBAAA\"]Dk[\"AAAAAaQFAAAAAaYBAAABZgUAAAF5EQAAAf4AAAA=\",\"AAExCAAAAAGkBQAAAAAAAXkRAAA=\"]Dk[\"AAAAAeoFAAAAAbgBAAACgQEAAGoFAAABgBEAAA==\",\"AAFKCAAAAAHqBQAAAAAAAYARAAA=\"]Ck[\"AAAAAbsFAAAAATwAAAACJwEAACgBAAA=\",\"AAAAAbsFAAAAAAFrBwAA\"]Eg[\"AAAAAZAFAAAAAh4AAACMAAAAAQwQAAABKAMAAALfAAAAshIAAA==\",\"AAEsCAAAAVICAAACkAUAAKAKAAA=\"]Eg[\"AAAAAcUFAAAAAkMAAACXAAAAAjoBAAAXEAAAATMDAAABsxIAAA==\",\"AAFECAAAAcMCAAABxQUAAAH+CgAA\"]Ao[\"AAAAAAAAAAACsxAAAGcRAAA=\",\"\"]Ao[\"AAAAAAAAAAACtBAAAGkRAAA=\",\"\"]Bg[\"AAAAAAAABMQAAAASBgAAmgwAAHASAAA=\",\"\"]Ak[\"AAAAAAABPQAAAAEpAQAA\",\"\"]Do[\"AAAAAAAAAAAAAAAAAAAAAAAAAgARAABtEgAA\",\"AAEcCAAAAAAAAAAAAAAAAAAAAAAAAAHBEAAA\"]Cg[\"AAAAAANsBwAA1AkAAAoRAAA=\",\"AAAAAAAAAAKiDwAAqxAAAA==\"]Ag[\"AAACdgIAAPgCAAA=\",\"\"]Cc[\"AAAAAcUKAAACxAoAADELAAABMgsAAALDEAAAxRAAAA==\",\"\"]Ac[\"\",\"AAAAAaMSAAA=\"]Gg[\"AAAAAZQFAAABJBQAAAAAAWIJAAAE4wAAADAQAADDEgAACRQAAAGEEAAA\",\"AAAAA6EBAACUBQAALxQAAAAB6BMAAAABYgkAAAMwEAAAwxIAAAkUAAA=\"]Bc[\"AAAAAaEBAAAAAAAAAAAAAScRAAA=\",\"\"]Gg[\"AAAAAckFAAAAAAE+AQAAAWMJAAADMRAAAMUSAAAKFAAAAAAAAAEXCAAA\",\"AAAAA7ABAADJBQAAMBQAAAAB6RMAAAABYwkAAAMxEAAAxRIAAAoUAAA=\"]Bc[\"AAAAAbABAAAAAAAAAAAAASsRAAA=\",\"\"]Fg[\"AAABMAIAAAGLBQAAAAEcAAAAAAAC1wAAANgAAAA=\",\"AAEoCAAAAAGLBQAAAAHWCQAAAmoHAAC9EAAAA1EEAABSBAAACwYAAA==\"]Eo[\"AAAAAb0FAAAAAT8AAAACKwEAACwBAAA=\",\"AAFACAAAAAG9BQAAAAHXCQAAAXkIAAAEUwQAAAwGAAC+EAAAohEAAA==\"]Ao[\"\",\"AAAAAAAAAAAAAAABLxEAAA==\"]Ek[\"AAAAAZkFAAAAASMAAAAAAALsAAAA7QAAAA==\",\"AAABXwIAAAGZBQAAAAAAAAEWCAAAAYQQAAAAAicRAAApEQAA\"]Eg[\"AAAAAdMFAAAAAU0AAAACUwEAAFQBAAA=\",\"AAAB1wIAAAHTBQAAAAAAAAAAAAIrEQAALREAAAABFwgAAA==\"]Ao[\"AAAAAAAAAAGgEAAAAAGyDAAA\",\"\"]Jk[\"AAAAAZoFAAAABSQAAACNAAAA+AUAAJgQAACaEAAAAjwMAAANEAAABCkDAACHDAAAmRAAAJsQAAAE7gAAAO8AAABnEQAAaBEAAAKuDAAArwwAAAKKEQAAixEAAA==\",\"AAAAApoFAACuEAAAAqIBAACREAAAAAABqQkAAA==\"]Og[\"AAAAAdgFAAAABVAAAACaAAAA+QUAAJwQAACeEAAABmABAABhAQAAPQwAAD4MAAA/DAAAGhAAAAQ2AwAAiAwAAJ0QAACfEAAAAmkRAABqEQAAArAMAACxDAAAAowRAACNEQAA\",\"AAAABNgFAABRCAAAUggAAK8QAAAEsgEAAJIQAACTEAAAlBAAAAAAAaoJAAACAwYAAAQGAAAAAAAAAAAAAAA7MAAAAQAACgACAFMIBQBzCAQA\"]Cc[\"AAAAAc4FAAAAAUkAAAACSQEAAEoBAAA=\",\"AAAAAc4FAAA=\"]Ck[\"AAAB/wUAAAGbBQAAAAElAAAAAAAB8AAAAA==\",\"AAAAApsFAACJDAAA\"]Dg[\"AAABAAYAAAHZBQAAAAFRAAAAAWIBAAAAAAAAAAAAAW0HAAA=\",\"AAAAAtkFAACKDAAA\"]Cc[\"AAAAAfAFAAAAAV0AAAABiwEAAA==\",\"AAAAAvAFAACLDAAA\"]Dg[\"AAAAAAAAAAAAAAABHhEAAA==\",\"AAAABpUQAACxEgAAkBMAAJETAADBEwAAwhMAAA==\"]Ak[\"AAAAAAAAAAABnxIAAA==\",\"\"]Ak[\"AAAAAAAAAAABohIAAA==\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmcAAADyAQAA\",\"\"]Bg[\"AAAAAAAAAAAAATQEAAA=\",\"AAAAASERAAA=\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmYAAACtBwAA\",\"\"]Bk[\"AAAAAAAAAAAAAAR7BwAAfAcAAH0HAAB+BwAA\",\"\"]Ec[\"AAAABIwBAACXAQAArQUAAIUQAAAAAAEUAQAAAAAABH8HAACABwAAgQcAAIIHAAA=\",\"AAAAAa0FAAA=\"]Bg[\"AAAAAAAAAAAAATUEAAA=\",\"AAAAAAE0EwAA\"]Cc[\"AAAAAcgKAAACxwoAADQLAAABMwsAAALEEAAAxhAAAA==\",\"\"]Ag[\"AAAAAAABngcAAA==\",\"\"]No[\"AAAAAZIFAAABnAcAAAHxEgAAAdwPAAAGlgwAAKUQAACNEwAAoRMAAAAUAAApFAAAB+EAAACcAQAA9gwAAC4QAADCEgAAmBMAAJoTAAABCxQAAAAAAAAAAAAAA0kHAAD6DAAAxhIAAA==\",\"AAAAApIFAAA3EAAAAAGgAQAAAcgSAAAGlgwAAKUQAACNEwAAoRMAAAAUAAApFAAABfYMAAAuEAAAwhIAAJgTAACaEwAA\"]Bo[\"AAAAATcQAAAAAaABAAAAApkQAAAoEQAAAAGuDAAA\",\"\"]Nc[\"AAAAAccFAAAAAAE8AQAAOjAAAAEAAAAAAAcAEAAAAKoBlwymEPISjhOiEwEUKhQF9wwAAC8QAADEEgAAmRMAAJsTAAAAAAAAAAAAAAAEVgYAAE0HAAD7DAAAxxIAAA==\",\"AAAAAscFAAA4EAAAAAGvAQAAAckSAAAGlwwAAKYQAACOEwAAohMAAAEUAAAqFAAABfcMAAAvEAAAxBIAAJkTAACbEwAA\"]Bo[\"AAAAATgQAAAAAa8BAAAAAp0QAAAsEQAAAAGwDAAA\",\"\"]Ao[\"AAAAAAAAAAACmBMAAJkTAAA=\",\"\"]Ao[\"AAAAAAAAAAACmhMAAJsTAAA=\",\"\"]Dc[\"AAABLgIAAAGCBQAAAAIUAAAApgcAAALIAAAAyQAAAA==\",\"AAABMgIAAAGCBQAA\"]Bk[\"AAAAAcIBAAAAAATDAAAAEQYAAJkMAABvEgAA\",\"\"]Ec[\"AAAAAksTAABMEwAAAkkTAABKEwAABHUMAAB2DAAAdwwAAHgMAAAEcQwAAHIMAABzDAAAdAwAAA==\",\"\"]Cc[\"AAAAAAAAAAABnhIAAA==\",\"AAEfCAAAAAKbAQAALhMAAA==\"]Cc[\"AAAAAAAAAAABoRIAAA==\",\"AAE0CAAAAAKoAQAALxMAAA==\"]Bc[\"\",\"AAAAAAAAAAAAAAAAAAABbQcAAA==\"]Cg[\"AAAAAZ0PAAAAAAFfAQAAAZcQAAA=\",\"AAFQCAAAAAAAAZcTAAA=\"]Ek[\"AAAAAXoFAAAAAAGyAAAAAAAAAAAAAAAAAAAEKhMAADITAABIEwAAYxMAAA==\",\"AAEgCAAAAAJ6BQAAGQYAAA==\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA9gJAAAsEAAAWBQAAA==\",\"\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA9kJAAAtEAAAWRQAAA==\",\"\"]Bk[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAArQJAAC2CQAA\"]Ec[\"AAAAAaYFAAAAAacBAAABZwUAAAJ7EQAAvxMAAAEAAQAA\",\"AAEyCAAAAAGmBQAAAAAAAnsRAAC/EwAA\"]Ec[\"AAAAAewFAAAAAbkBAAACgwEAAGsFAAACghEAAMATAAA=\",\"AAFLCAAAAAHsBQAAAAAAAoIRAADAEwAA\"]Ag[\"\",\"AAAAAAABZBIAAA==\"]Co[\"AAAAApEBAABRCAAAAAABWAEAAA==\",\"AAAAAAAAAAAAAAAAAAAAAbEBAAA=\"]Ac[\"\",\"AAAAAAH0EgAA\"]Cg[\"AAAAAAAAAsgSAADJEgAAAAABZxIAAA==\",\"AAAAAAAAAAGcEwAA\"]Do[\"AAAAAbgFAAAAAjkAAACVAAAAAyIBAAAjAQAAFRAAAAExAwAA\",\"AAAAAbgFAAAAAAABPAQAAA==\"]Ak[\"AAAAAAAC6BMAAOkTAAA=\",\"\"]Ac[\"AAAAAcMBAAA=\",\"\"]Ac[\"AAAAAcUBAAA=\",\"\"]Eo[\"AAAC3gIAAPQCAAAB4gUAAAABWAAAAAJyAQAAcwEAAA==\",\"AAAAAeIFAAAAAAAFTwcAAFAHAABRBwAAUgcAAFMHAAA=\"]Fk[\"AAAABKcQAACoEAAAkBMAAJETAAABng8AAAH9EAAAAWUSAAAAAAELFAAAAAAAAAAAAAGnDAAA\",\"AAAAAAAAA24SAABvEgAAcBIAAA==\"]Fc[\"AAAAAAABOwcAAALIEgAAyRIAAAFkEQAAAAFnEgAAAAAC5hMAAOcTAAAAAAABOhMAAA==\",\"AAAAAAAAASAUAAABnBMAAA==\"]Ag[\"\",\"AAAAAAAB9QUAAA==\"]Co[\"AAAAAcAFAAAAAUIAAAACMQEAADIBAAA=\",\"AAAAAcAFAAAAAAAAAAGbDgAA\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAYwHAAA=\",\"\"]Jc[\"AAAAApEFAAAHFAAAAAAAAlsSAAAsEwAABOAAAACcAQAArAwAADcTAAAD3AkAAJITAAALFAAAAAAAAfsQAAA=\",\"AAEtCAAAAAKfAQAAkQUAAAAAAAJbEgAALBMAAAKsDAAANxMAAALcCQAAkhMAAAAAAAH7EAAA\"]Jg[\"AAAAAsYFAAAIFAAAAAABOwEAAAOqAQAAXBIAAC0TAAACrQwAADgTAAAC3QkAAJMTAAAAAAAB/BAAAA==\",\"AAFFCAAAAAKuAQAAxgUAAAFDBwAAAAACXBIAAC0TAAACrQwAADgTAAAC3QkAAJMTAAAAAAAB/BAAAA==\"]Ao[\"AAAAAAAAAbYAAAAAAAE3BAAA\",\"\"]Bc[\"AAAAAAABRgAAAAJDAQAARAEAAA==\",\"\"]Ag[\"AAAChAIAAAkDAAA=\",\"\"]Ak[\"AAAAAAAAAlUEAABzBwAA\",\"\"]Ak[\"AAAAAAAAAlgEAAB2BwAA\",\"\"]Ag[\"AAACggIAAAgDAAA=\",\"\"]Dk[\"AAAAAYAFAAAAAhIAAACkBwAAAsEAAADCAAAA\",\"AAABKgIAAAGABQAAAAAAAAAAAbIPAAA=\"]Dg[\"AAAAAX0FAAAAAg8AAAChBwAAArsAAAC8AAAA\",\"AAABIgIAAAF9BQAAAAAAAAEhEAAA\"]Co[\"AAABaxIAAAG8BQAAAAE+AAAAASoBAAA=\",\"AAE/CAAAAaQJAAABvAUAAA==\"]Ec[\"AAAAAAABbBIAAAGqAAAAAAAAAAAAAAAAAAADTAQAAKEJAAC2DwAA\",\"AAAAAZkBAAAAAAAAAYwTAAA=\"]Hk[\"AAACuAIAANACAAAB2gUAAAABUgAAAAJjAQAAZAEAAAAAAAAAAAAAAAAABPYBAAD8BQAATgcAAIsHAAA=\",\"AAAB5QIAAAKzAQAA2gUAAAAAAqwTAACtEwAAAAACmhEAAJsRAAA=\"]Fc[\"AAAAA5UQAACpEAAAsRIAAAACvRIAAL8SAAADiAEAAKQTAAClEwAAAkUEAAA7DAAAAAAAAAABQAQAAA==\",\"AAAAAboBAAA=\"]Dc[\"AAAAAl8AAAB8BQAAAv0BAABhCQAAAQ4AAAABuAAAAA==\",\"AAAAAnwFAAA2EAAA\"]Eg[\"AAAAAZcFAAAAASEAAAAAAALoAAAA6QAAAAAAAAAAAAAAAAOHBwAAkA8AAJcPAAA=\",\"AAABXQIAAAGXBQAA\"]Eg[\"AAAAAc8FAAAAAUoAAAACSwEAAEwBAAAAAAAAAAAAAAAAAAOJBwAAkg8AAJgPAAA=\",\"AAAB0AIAAAHPBQAA\"]Hk[\"AAAFFwIAACYCAAAnAgAALwIAADICAAABjAUAAAACHQAAAKcHAAAAAALZAAAA2gAAAA==\",\"AAADSwIAAEwCAABNAgAAAowFAAA/BwAAAlQGAACDEAAAAVQTAAAB3A8AAAFsEQAA\"]Ek[\"AAAAAb4FAAAAAkAAAACoBwAAAi0BAAAuAQAA\",\"AAABuAIAAAG+BQAAAAAAAAAAAAAAAAAAAAACcwUAAIwHAAA=\"]Bk[\"AAAAAAABlhAAAAFeAQAA\",\"AAAAAAAAAAGXEAAA\"]Ek[\"AAAAAYkFAAAAAAAAAdUAAAAAAAAAAAAAAAAEsgcAALYHAAClCQAApwkAAA==\",\"AAEmCAAAAAKJBQAAGAYAAA==\"]Ek[\"AAAAAbYFAAAAAAEfAQAAAAAAAAAAAAAAAAAEtAcAALgHAACmCQAAqAkAAA==\",\"AAE9CAAAAAG2BQAAARsGAAA=\"]Ag[\"AAAChwIAAAEDAAA=\",\"\"]Cg[\"AAAAAfIFAAAAAAADog8AAAcQAACrEAAA\",\"AAFPCAAAAAHyBQAA\"]Dc[\"AAAAAtQFAABSCAAAAAABWQEAAA==\",\"AAAAAdQFAAAAAAAAAAAAAAAAAAFYBwAA\"]Dg[\"AAAAATsTAAABORAAAAAAAALbAAAAaBEAAA==\",\"AAGrCQAAAZ4BAAABOxMAAAE5EAAA\"]Dg[\"AAAAATwTAAABOhAAAAABNgEAAAABahEAAA==\",\"AAGsCQAAAa0BAAABPBMAAAE6EAAA\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAZUPAAA=\",\"\"]Ac[\"\",\"AAAAAAEPFAAA\"]Ag[\"AAACfgIAAAUDAAA=\",\"\"]Bc[\"\",\"AAAAAAAAAAADnRIAAJ4SAACfEgAA\"]Bc[\"\",\"AAAAAAAAAAADoBIAAKESAACiEgAA\"]Ak[\"\",\"AAAAAcESAAAAAAHZEwAA\"]ADc[\"AAAAAY0FAAAAAAA6MAAAAQAAAAAAFAAQAAAAaQg6DaMP6g/tDykQIxGdEbERuhImE8cTHhQrFDcUORRbFF8UYhRmFG0UOjAAAAEAAAAAAAwAEAAAANwAsxAfEbISwhLDElcTghOVE0MUVBRWFGQUAAABlhEAAA==\",\"AAEpCAAAAAGNBQAAAAAAOjAAAAEAAAAAABQAEAAAAGkIOg2jD+oP7Q8pECMRnRGxEboSJhPHEx4UKxQ3FDkUWxRfFGIUZhRtFDowAAABAAAAAAAJABAAAACzEB8RshJXE4ITlRNDFFQUVhRkFAAAAZYRAAA=\"]ADc[\"AAAAAcIFAAAAAAE3AQAAOjAAAAEAAAAAABQAEAAAAGoIOw2kD+sP7g8qECQRnhGyEbsSJxPIEx8ULBQ4FDoUXBRgFGMUZxRuFDowAAABAAAAAAALABAAAAC0ECARsxLEEsUSWBODE5YTRBRVFFcUZRQAAAGXEQAA\",\"AAFBCAAAAAHCBQAAAAAAOjAAAAEAAAAAABQAEAAAAGoIOw2kD+sP7g8qECQRnhGyEbsSJxPIEx8ULBQ4FDoUXBRgFGMUZxRuFDowAAABAAAAAAAJABAAAAC0ECARsxJYE4MTlhNEFFUUVxRlFAAAAZcRAAA=\"]Ag[\"AAACWgIAAMoCAAA=\",\"\"]Bk[\"AAAAAAAAAAAAASwEAAA=\",\"AAAAAAAAAY4MAAA=\"]Bk[\"AAAAAAAAAAAAAAGjDAAA\",\"AAAAAAAB4xMAAA==\"]Do[\"AAAAAZgFAAAAASIAAAAAAALqAAAA6wAAAAAAAAAAAAAAAAKIBwAAkQ8AAA==\",\"AAAAAZgFAAA=\"]Do[\"AAAAAdAFAAAAAUsAAAACTQEAAE4BAAAAAAAAAAAAAAAAAAKKBwAAkw8AAA==\",\"AAAAAdAFAAA=\"]Ag[\"AAAChQIAAAQDAAA=\",\"\"]Fc[\"AAAAAdIFAAAAAkwAAACYAAAAAlEBAAAYEAAAAjQDAACXEAAA\",\"AAAAAdIFAAAAAAAAAAAAAAABFwgAAAAAAAABVgYAAA==\"]Ag[\"AAAChgIAAAADAAA=\",\"\"]Ag[\"AAACgwIAAAcDAAA=\",\"\"]Ck[\"AAAAAAAAAAAAAAABKREAAA==\",\"AAAAAcUKAAABxAoAAAABwxAAAA==\"]Co[\"AAAAAbsBAAAAAAAAAAAAAS0RAAA=\",\"AAAAAAExCwAAATILAAABxRAAAA==\"]Dc[\"AAAAAAAAAAKbEAAAKhEAAAABrwwAAA==\",\"AAAAAcgKAAABxwoAAAABxBAAAA==\"]Dg[\"AAAAAbwBAAAAAAACnxAAAC4RAAAAAbEMAAA=\",\"AAAAAAE0CwAAATMLAAABxhAAAA==\"]Cc[\"AAAAAAAAAlYEAAB0BwAAAAH0AAAA\",\"AAEvCAAAAAGjAQAA\"]Cc[\"AAAAAAAAA2kBAABZBAAAdwcAAA==\",\"AAFICAAAAAG1AQAA\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA4YHAABYCAAAdwgAAA==\",\"\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAZQPAAA=\",\"\"]Ao[\"AAAAAAAAAWQFAAAAAVQUAAA=\",\"\"]Bk[\"AAAAAAAAAWgFAAAAAVUUAAA=\",\"AAAAAWwFAAA=\"]Eg[\"AAAAAAAAAAABAQEAAAAAAAAAAAAAAAPeCQAACBAAAOkSAAA=\",\"AAEzCAAAAARhCAAAYggAAGMIAABkCAAA\"]Eg[\"AAAAAAAAAYQBAAAAAAAAAAAAAAAAAAPfCQAACRAAAOoSAAA=\",\"AAFMCAAAAARlCAAAZggAAGcIAABoCAAA\"]Bc[\"AAAAAAABoAEAAAABYhEAAAH2DAAA\",\"\"]Bc[\"AAAAAAABrwEAAAABYxEAAAH3DAAA\",\"\"]Ak[\"AAAAAAABVRMAAAG7EwAA\",\"\"]Ao[\"AAAAAAABVhMAAAAAAbwTAAA=\",\"\"]Fo[\"AAAAAdcFAAAAAk8AAACZAAAAA1wBAABdAQAAGRAAAAE1AwAA\",\"AAAB3gIAAAHXBQAAAAAAAAIDBgAABAYAAAAAAAAAAAKxAQAAWAcAAA==\"]Dg[\"AAAAAbAFAAAAATMAAAABFwEAAA==\",\"AAAAAbAFAAAAAAAAAAAAAAAAAAAAAAGNBwAA\"]Dg[\"AAAAAXgFAAAAAgwAAACgBwAAAq8AAACwAAAA\",\"AAABFwIAAAF4BQAAAAABIhEAAA==\"]Do[\"AAAAAasFAAAAAi8AAACSAAAAAxABAAARAQAAEhAAAAEuAwAA\",\"AAAAAasFAAAAAAAAAUQEAAA=\"]Ek[\"AAAAAY4FAAAAAAACnRMAAPATAAAD3QAAAAURAACCEwAA\",\"AAEqCAAAAAGOBQAAAAAAAp0TAADwEwAAAQURAAA=\"]Ek[\"AAAAAcMFAAAAAAE4AQAAAp4TAADxEwAAAgYRAACDEwAA\",\"AAFCCAAAAAHDBQAAAAAAAp4TAADxEwAAAQYRAAA=\"]Bo[\"AAAAAAAAAAABAwYAAAAAAAAAAAKxAQAAWAcAAA==\",\"\"]Fg[\"AAAAAY8FAAAAAAAEvgkAADMQAACOEQAAThMAAALeAAAAlRMAAA==\",\"AAErCAAAAAGPBQAAAAAABL4JAAAzEAAAjhEAAE4TAAA=\"]Fg[\"AAAAAcQFAAAAAAE5AQAABL8JAAA0EAAAjxEAAE8TAAABlhMAAA==\",\"AAFDCAAAAAHEBQAAAAAABL8JAAA0EAAAjxEAAE8TAAA=\"]Ag[\"\",\"AAAAAAAAASAUAAA=\"]Bc[\"\",\"AAAAAAAAAAAAAAAAAAAAAAE6EwAA\"]Ag[\"\",\"AAAAAAAAAbMPAAA=\"]Co[\"AAAAAbEFAAAAATQAAAACGAEAABkBAAA=\",\"AAAAAbEFAAAAAAAAAWgSAAA=\"]Fg[\"AAABPAIAAAGcBQAAAAEmAAAAAAFgBwAAAvEAAADyAAAA\",\"AAACYwIAAEcHAAABnAUAAAAAAAFSBwAAAAAAAAAAAAAAAAGQDwAA\"]Gc[\"AAABmgIAAAKzAQAA2wUAAAABUwAAAAJlAQAAZgEAAAFnBwAA\",\"AAAC5gIAAEsHAAAB2wUAAAAAAVkHAAAAAAAAAAAAAAAAAAL2AQAAkg8AAA==\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA1QIAAB0CAAAZQkAAA==\",\"\"]Cg[\"AAABXwIAAAAAAAAAAQQBAAA=\",\"AAAAAAAAAAKZEAAAmxAAAA==\"]Cg[\"AAAB1wIAAAAAAAF5AQAA\",\"AAAAAAAAAAOdEAAAnxAAAKAQAAA=\"]Bo[\"AAAAAmwFAADxBQAAAfQSAAA=\",\"AAAAAvEFAAC0EQAA\"]Io[\"AAAAAeMFAAAAAVkAAAABdAEAAAYlBgAAKBEAACoRAAAsEQAALhEAADARAAAAAAAFJxEAACkRAAArEQAALREAAC8RAAAAAAAAAAABbBQAAA==\",\"AAAAAeMFAAAAAASpEwAAqhMAAKwTAACtEwAAAAE9BAAA\"]Co[\"AAAAAmEAAABgCAAAAAABugAAAAJSBAAAoREAAAGxDwAA\",\"AAABgxEAAA==\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAArMJAACNEAAA\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAArUJAACPEAAA\",\"\"]Co[\"AAAAAacFAAAAAAAAAgUBAAAGAQAA\",\"AAAAAacFAAAAAALDEAAAxBAAAA==\"]Dc[\"AAAAAeUFAAAAAAJ6AQAAewEAAA==\",\"AAAAAuUFAACjEgAAAAACxRAAAMYQAAA=\"]Ac[\"\",\"AAABeQwAAA==\"]Ec[\"AAABWAIAAAGEBQAAAAEWAAAAAAACzQAAAM4AAAA=\",\"AAAAAYQFAAAEsQkAAI4KAACPCgAAkAoAAA==\"]Do[\"AAAByAIAAAGqBQAAAAEtAAAAAg0BAAAOAQAA\",\"AAAAAaoFAAAEsgkAANsKAADcCgAA3QoAAA==\"]Ak[\"\",\"AAAAAAAC6BMAAOkTAAA=\"]Ck[\"AAAAAncFAADICQAAAWAJAAABKxMAAAGuAAAA\",\"AAAAAncFAAA1EAAA\"]Cg[\"AAAAAfcHAAACfxAAAJEQAAAAATwMAAAAAAAAAAAB+xAAAA==\",\"\"]Ck[\"AAAAAfgHAAACgBAAAJIQAAAAAj0MAAA+DAAAAAAAAAAAAfwQAAA=\",\"\"]Bc[\"AAAAAAAAAAAAAAAAAuYTAADnEwAA\",\"\"]Fo[\"AAAAAZMFAAAAAAADRgQAAMkJAAAAFAAAAuIAAACVAQAA\",\"AAEuCAAAAAGTBQAAAAAAAkYEAADJCQAAAZUBAAAAAAAAAAAAAAABxhIAAA==\"]Fo[\"AAAAAcgFAAAAAAE9AQAAA0cEAADKCQAAARQAAAGWAQAA\",\"AAFGCAAAAAHIBQAAAAAAAkcEAADKCQAAAZYBAAAAAAAAAAAAAAABxxIAAA==\"]Ck[\"AAAAAcEFAAAAAAIzAQAANAEAAA==\",\"AAAAAcEFAAAAAAAAAQ4UAAA=\"]Ec[\"AAAAAdUFAAAAAAFaAQAAAAAAAAAAAAAAAAAFkgEAAFMIAABzCAAAZAkAAPgMAAA=\",\"AAAAAdUFAAA=\"]Dg[\"AAAAAAEPFAAAAAGrAAAAAAAAAAAC5hMAAOcTAAAAAAABOhMAAA==\",\"AAABmgEAAA==\"]Ag[\"AAACiQIAAAIDAAA=\",\"\"]Bc[\"\",\"AAAAAAAAAAAAAAAAAuYTAADnEwAA\"]Bk[\"AAAAAAAAAAAAAAABLxEAAA==\",\"AAAAAbsBAAA=\"]Cc[\"AAAAAAAAAAKgEAAAMBEAAAABsgwAAA==\",\"AAAAAbwBAAA=\"]Ag[\"AAACfwIAAAsDAAA=\",\"\"]Dg[\"AAAAAAABKgAAAAAAAQIBAAA=\",\"AAAAAAAAAAAAAAAAAAAAA9oTAADbEwAA3BMAAA==\"]Ck[\"AAAAAAABWwAAAAF3AQAA\",\"AAAAAAAAAAAAAAAAAAAAAt0TAADeEwAA\"]Ag[\"AAACgAIAAAMDAAA=\",\"\"]Do[\"AAAAAfkHAAACgRAAAJMQAAAAAT8MAAABuxAAAA==\",\"AAKsAQAANQgAAAGtCQAAAAAAAAG7EAAA\"]Ec[\"AAAAAt0FAAD6BwAAAoIQAACUEAAAAAFoAQAAAbwQAAA=\",\"AAFHCAAAAbQBAAAB3QUAAAAAAAG8EAAA\"]Bg[\"AAAAAAAAAAABBAYAAA==\",\"AAABqwEAAA==\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAArQJAACOEAAA\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAArYJAACQEAAA\",\"\"]")
\ No newline at end of file
+rd_("CBg[\"\",\"ADswAAABAAAFAAIAGwQEAEIUAAACcAcAAI8HAAA6MAAAAQAAAAAACgAQAAAAygHLAQkG/AxmEqgSvBIhFC0USxRaFDowAAABAAAAAAAaABAAAAD6AfsB/AH9Af4B/wEAAikECAYNBj4HbAebB9QJChFpEqkSNRPfE+ATJBRHFEgUSRRKFF0UYRQ7MAAAAQAAFgERACcEAAD1BQAABwYAAHEHAACOBwAAngcAALMMAwAcDn4AlhAAAAsRBwBrEQAA2xF+AGoSAABsEgAA8RIAADYTAABUEwAAOjAAAAEAAAAAAB0AEAAAAAoGEAYRBhIGagdrB3IHcwd0B3UHdgd3BzwMPQw+DD8MjgyuD7MPvRAiEWUSaBOkE6UTuxMcFCAULhRMFDswAAABAAA5ABMAJgMUAEUEAABRBAIA8wUBAPYFAAALBgEAJQYAAF0HDABrCAMAOwwAAKIMAAAHEAAAOxAAAL4QAABkEQAA8hIAAJwTAAAdFAAATRQAADswAAABAABXAA0AywA9AHwBAQBEBAAAGQgAABsIAABaCAAAXAgAAIkQAwCdEgUAjBMAALwTAAD6EwUADhQAADswAAABAAAVAAcAKwQAAP0MAACbDgAAAxADAGcSAABbEwcAOxQFADswAAABAAARAAgASgQBAHsHBwBZCAAAWwgAAKgPAgCyDwAAHREAAMoSAAADugcAALsHAAC5EgAAA0EEAABCBAAAqAwAAAUXCAAAGAgAABoIAACkDAAAHBEAAAA7MAAAAQAABQACALEBAADaEwQAAAABVgYAAA==\"]Bo[\"AAAAAAAAAAACCRQAAAoUAAAAAAAAAvsQAAD8EAAA\",\"\"]0Bg[\"\",\"AAAFtwkAALgJAAC5CQAAugkAALsJAAA=\"]AIg[\"AAAAAAKiAQAAsgEAAAAABPMFAAD0BQAAYhEAAGMRAAAEGQgAABsIAABaCAAAXAgAADswAAABAAANAAUAIwYBANwJAQCuDAQA/QwAAJgRAwA6MAAAAQAAAAAACwAQAAAASgRLBFkIWwiyD8cQyBCKEYsRjBGNEcoSBDsEAAC6BwAAuwcAACAQAAAEQQQAAEIEAADmEwAA5xMAAAVABAAAGAgAABoIAACrDwAArQ8AAAOlDAAApgwAAKwPAAA6MAAAAQAAAAAACAAQAAAAsQEhBCMEWAfaE9sT3BPdE94TAToTAAABpwwAAA==\",\"AAAAAbQRAAAAAvgFAAD5BQAAAAKHDAAAiAwAAAAFrgwAAK8MAACwDAAAsQwAALIMAAAAAAAAAAIhBAAAIwQAAA==\"]ANg[\"AAAEOgIAAJsCAABHBwAASwcAAAOJDAAAigwAAIsMAAACogEAALIBAAA7MAAAAQAAfgABANsRfgAABvMFAAD0BQAAYhEAAGMRAABtFAAAbhQAAAQZCAAAGwgAAFoIAABcCAAAOzAAAAEAABIABwAjBgEAkAcAANwJAQCuDAQA/QwAAJgRAwBxEgMAOjAAAAEAAAAAAAgAEAAAAEoESwRZCFsIsg+KEYsRjBGNEQU7BAAADgYAALoHAAC7BwAAHhEAAARBBAAAQgQAAOYTAADnEwAABBgIAAAaCAAAqw8AAK0PAAAEbQcAAKUMAACmDAAArA8AADswAAABAAAGAAMAIQQAACMEAADaEwQAAToTAAAAAVYGAAA=\",\"AAAAAAAC+AUAAPkFAAAAAocMAACIDAAAASEQAAAFrgwAAK8MAACwDAAAsQwAALIMAAAAAAAAAAIhBAAAIwQAAAAAA4YHAAByEQAAcxEAAA==\"]Dc[\"\",\"AAAAADswAAABAAAHAAEAwAkHADswAAABAAAJAAIAFxEEAG0RBAAAAWwRAAA=\"]AHm[\"AAAAOjAAAAEAAAAAAAcAEAAAAJ8BoQGuAbABuwG8ATcQOBAEpQEAALcBAADECgAAxwoAADowAAABAAAAAAAJABAAAACgAaYBpwGvAbgBuQEyCzML6BPpEzswAAABAAANAAQAZAUHANwPAADDEAMAuxMAAAeqAQAAKBEAACoRAAAsEQAALhEAADARAADyEgAAOzAAAAEAABUACgCVAQEAnAEAAKwMAQD2DAEALhADALMQAQDCEgMAjBMAAAkUAQBUFAEAAQsUAAAABScRAAApEQAAKxEAAC0RAAAvEQAAAAAAAAAAAVYGAAA=\",\"AAABmgEAAAJsBQAAWhIAAAAAAAKiDwAAqxAAAAAAAAAAAAAAAAAESQcAAE0HAAD6DAAA+wwAAA==\",1]Fk[\"AAAABKEFAAC9BwAAYggAAHYRAAACwQkAAHwMAAABDBEAAAABbAgAAAH7AAAAAgQQAABcEwAAAXwHAAA=\",\"AAAAAaEFAAABpQEAAA==\"]Fk[\"AAAABOcFAADBBwAAZggAAH0RAAACxQkAAIAMAAABEBEAAAF+AQAAAW4IAAAAAgYQAABgEwAAAYAHAAA=\",\"AAAAAecFAAABtwEAAA==\"]AEa[\"AAAAAp0BAACpAQAAOzAAAAEAAAcAAQDACQcAAAQQBgAAEQYAABIGAABlEgAAAAABCxQAAAAAAAL7EAAA/BAAAA==\",\"AAAAADswAAABAAAQAAMAPgcAAMAJBwB7DAcAOzAAAAEAAAsABACeBwAA/RAAABcRBABtEQQAOzAAAAEAAA8ABQBkBQcAmAwCAG4SAgCkEgAAIBQAADowAAABAAAAAAAMABAAAAAoESoRLBEuETARYhFjEWwRkBGREZIRkxGcEwSJEAAAihAAAIsQAACMEAAAAAAFJxEAACkRAAArEQAALREAAC8RAAAAAAAAAAABVgYAAA==\",1]Ec[\"AAAAAAAAOzAAAAEAAAYAAgBUBwMAWQcCADswAAABAAAGAAIATwcEAKkJAQADPQQAAAMGAAAEBgAA\",\"\"]Dg[\"AAAAAAAAAAAB/hMAAAE/FAAAAAAAAAAAAAABAQgAAA==\",\"AAAAAAABrhIAAAGKEwAA\"]Eo[\"AAAAAZ8FAAABpAEAAAIoAAAAjwAAAAEPEAAAASsDAAAC9gAAAPcAAAA=\",\"AAABngAAAAGfBQAAAUoTAAAAAXMMAAA=\"]Ic[\"AAAAAd8FAAADtgEAAGQTAADhEwAAAlUAAACcAAAABmsBAABsAQAAIgQAAFUGAAAcEAAALhQAAAE4AwAA\",\"AAABnwAAAALfBQAATBMAAAABdwwAAAAAAAAAAAAAAAAAAAKgAAAAoQAAAA==\"]Ik[\"AAAAAnQFAADBEgAAAZsHAAABOwcAAAGoAAAAAWQRAAAB+hMAAAJnEgAAOxQAAAAAAAAAAAAAOjAAAAEAAAAAAAgAEAAAABcGOQf7B3sI6Q8AEDIQ/xCcEQ==\",\"AAAAAXQFAAAAAaoSAAABhhMAAA==\"]Ck[\"AAAAAcoBAAAAAAAAAfwTAAABPRQAAA==\",\"AAAAAAABrBIAAAGIEwAA\"]Ck[\"AAAAAcsBAAAAAAAAAf0TAAABPhQAAA==\",\"AAAAAAABrRIAAAGJEwAA\"]Kc[\"AAAAAAAABAoGAAAQBgAAEQYAABIGAAAAOzAAAAEAAAkAAQAxDAkAOzAAAAEAAA0AAQArBA0ABaMMAACoDwAAqQ8AAKoPAAAdEQAAAAGoDAAAA6QMAACrDwAArQ8AAAKlDAAArA8AAA==\",\"AAAAAAAB/RAAAAOYDAAAmQwAAJoMAAA=\"]Mg[\"AAAAAAAAAsgSAADJEgAAAAI3EwAAOBMAAAWQBwAAcRIAAHISAABzEgAAdBIAAAACDgYAAB4RAAACQQQAAEIEAAAAAW0HAAAAAAABVgYAAA==\",\"AAAAAAIGBgAADxQAAAAFRRQAAGgUAABpFAAAahQAAGsUAAABnBMAAAIhEAAARhQAAAAAAAAAAAAAAASNEAAAjhAAAI8QAACQEAAA\"]Bg[\"AAAAAAAAAASxEQAAshEAAL8TAADAEwAA\",\"\"]Bk[\"\",\"AAAAAbARAAAAAAAAAAAAAAAAAAAAAAG2DwAA\"]Cc[\"AAAAAAAAAb0QAAABvhAAAA==\",\"AAAAAAAC1gkAANcJAAA=\"]FHg[\"AAAAADswAAABAAAVAAkA+gEGACkEAAAbBgAAfQgAAIUMAACREAMAqRIAAN8TAQBHFAMAOzAAAAEAAPUBEAA5BAAAPwQAAHEHAAB1DAMAPA1eASMQAAAoEAAAlhAAALIQAAALEQcAaxEAANsRfgBqEgAAbBIAADYTAACXEwAAOzAAAAEAAL0ADwCoACIACQFyAH4BDQAiBAAACgYAAFUGAABUBwMAWQcCAGoHAQBxDAMApg8AAGgTAACGEwUALhQAAEEUAAA7MAAAAQAAngBAACYDFAA8BAAARgQBAFEEAgD2BQAACwYBACUGAABPBwQAXQcMAGkIBQBiCQEAqQkBAL4JAQDJCQEAhwwBAJYMAQCiDAAAOg0BAKMPAQC0DwEA6g8BAO0PAQAHEAAAKRABADMQAQA7EAAAlxAAAKUQAQC7EAEAvhAAACMRAQBsEQAAdxEAAHkRAAB7EQAAfhEAAIARAACCEQAAjhEFAJ0RAQCgEQIAsREBAFsSAQC6EgEA8hIAACYTAQAsEwEAThMBAI0TAQCdEwEAoRMBAL8TAQDHEwEA8BMBAAAUAQAdFAIAKRQDADcUAwBNFAAAWxQBAF8UAQBiFAEAZhQBAG0UAQA7MAAAAQAAjwAmAMsAPQB8AQEAlQEBACAEAAA9BAAARAQAAAMGAQAdBgEAGQgAABsIAABaCAAAXAgAADEMCQCsDAEA9gwBALAPAQDkDwEAIRAAAC4QAwCzEAEABREBAB8RAQBoEgAAshIBAMISAwA3EwEAVxMBAIITAQCVEwEAmBMDALwTAAD6EwUACRQBAA4UAABDFAEARhQAAFQUAwBkFAEAOzAAAAEAADEADQArBA0AIwYBAJAHAADcCQEAnwwAAP0MAACbDgAAAxADAJgRAwBxEgMAWxMHAJITAQA7FAUAOjAAAAEAAAAAABYAEAAAAEoESwR7B3wHfQd+B38HgAeBB4IHWQhbCKMMqA+pD6oPsg/HEMgQHRHKEiUUThQHOwQAAA4GAAAgEAAAHhEAAJYRAACXEQAAuRIAAANBBAAAQgQAAKgMAAA6MAAAAQAAAAAACQAQAAAAQAQXCBgIGgikDKsPrQ/7EPwQHBEEbQcAAKUMAACmDAAArA8AADowAAABAAAAAAAHABAAAAAhBCMEWAfaE9sT3BPdE94TAAGnDAAAAVYGAAA=\",\"AAAAAAA7MAAAAQAA3wABADwN3wAAOjAAAAEAAAAAAFkAEAAAAEYERwRpCGoIYgljCb4JvwnJCcoJhwyIDJYMlww6DTsNow+kD7QPtQ/qD+sP7Q/uDykQKhAzEDQQpRCmELsQvBAjESQRdxF5EXsRfhGAEYIRjhGPEZ0RnhGxEbIRWxJcEroSuxImEycTLBMtE04TTxONE44TnROeE6ETohO/E8ATxxPIE/AT8RMAFAEUHhQfFCkUKhQrFCwUNxQ4FDkUOhRbFFwUXxRgFGIUYxRmFGcUbRRuFDswAAABAAAvABQAlQEBAB0GAQCsDAEA9gwBAOQPAQAuEAMAsxABAAURAQAfEQEAshIBAMISAwA3EwEAVxMBAIITAQCVEwEAmBMDAAkUAQBDFAEAVBQDAGQUAQAE3AkAAN0JAACSEwAAkxMAAAAClhEAAJcRAAAAAvsQAAD8EAAAAAIhBAAAIwQAAA==\"]Ho[\"AAAAAXQRAAAAAwcGAACuCQAAZBIAADswAAABAAAMAAMAVAQFAHIHBQDZEwAAAAMWCAAAHxEAACARAAABhBAAAAAHJxEAACkRAAArEQAALREAAC8RAACWEQAAlxEAAAABFwgAAA==\",\"\"]Lk[\"AAACPgIAAJ4CAAAAAqUBAAC3AQAAOzAAAAEAAAsAAwCmAQEAuAEBAAsRBwA7MAAAAQAABwABAGQFBwA6MAAAAQAAAAAABwAQAAAAaQhqCOoP6w8zEDQQjhGPEQACkhMAAJMTAAA=\",\"AAAAAeIPAAAAAAAAAAAAAAAAAAAAAAXhDwAA4w8AAOkPAADsDwAAlBMAAA==\"]AAg[\"AAAEPwIAAJ0CAACvCQAAsAkAAASbAQAAowEAAKgBAAC1AQAAAkICAACjAgAAAAA6MAAAAQAAAAAAEwAQAAAARgRHBGIJYwmZEJsQnRCfEKAQKBEqESwRLhEwEboSuxJfFGAUYhRjFAI3EwAAOBMAAAWuDAAArwwAALAMAACxDAAAsgwAAAAFJxEAACkRAAArEQAALREAAC8RAAAAAAACsQEAAFgHAAA=\",\"AAAAAAAAAAAAAAAAAAAAAAAABGQJAABlCQAAZgkAAGcJAAA=\"]BKo[\"AAADrQkAACgTAAApEwAABZkBAACoCgAAsBEAAC4TAAAvEwAAOjAAAAEAAAAAAAcAEAAAAKQBtgGxCbIJjgrbCgULaRIBahIAAAFoEwAAOjAAAAEAAAAAABEAEAAAAGsIbAhtCG4Iog8pECoQqxB3EXkRexF+EYARghGNE44TKRQqFAGMEwAAOzAAAAEAAAsAAgADEAMAWxMHADswAAABAAAJAAMAewcHAFkIAABbCAAAAAACGAgAABoIAAA=\",\"AAAE/QUAAP4FAACZDwAAmg8AADswAAABAAAWAAsAvAcHAHURAQB4EQAAehEAAHwRAQB/EQAAgREAAF0SAQC5EwEAvRMAAAcUAQACZBMAAOETAAABZBIAAAAAAAAAAAAAAAAAADowAAABAAAAAABrABAAAACPAZABkgGTAfAB8QH3AfgBKAQqBEwEbgVxBUgHTAd5B3oHrgevB58JoAnQCdEJhAyGDJsMnAygDKEMqQyqDKAPoQ+3D90P3g/+D/8PMhCGEIcQoxCkELAQsRC1ELYQvxDAEPUQ9hD/EAERAhEIEQkRExEUERURFhGUEZURqBGpEWASYRJiEmMSphKnErQStRK+EsAS5xLoEukS6hLsEu0S7hLvEioTMBMxEzITSBNZE1oTYxNpE2oTaxNsE20TbhOEE4UTnxOgE6YTpxPFE8YT5BPlEyIUIxQ=\"]Ac[\"AAAAAAEVAwAA\",\"\"]Ca[\"AAAAAAJCAgAAowIAADswAAABAAAFAAEAqhEFAA==\",\"\",1]Ek[\"AAAAAAAAAAAAAAAAAAAAAAAAAm4HAACEBwAA\",\"AAAAAAACmBAAAJoQAAAAApkQAACbEAAAAAJxEgAAchIAAA==\"]Eo[\"AAAAAAAAAAAAAAAAAAAAAAAAAm8HAACFBwAA\",\"AAAAAAACnBAAAJ4QAAAAA50QAACfEAAAoBAAAAACcxIAAHQSAAA=\"]Ck[\"AAAAAAAAAAAAAAAAAAAAAAAABW0AAACTAQAAVQgAAHUIAABmCQAA\",\"\"]Bg[\"AAAAAAAAAa4PAAAAAAAAApYRAACXEQAA\",\"\"]Gk[\"AAAABF4AAAB7BQAAGgYAADYQAAAB/AEAAAYNAAAAJwQAAPUFAACsBwAAphEAAOMTAAACtwAAALMPAAAAAqMTAAD5EwAA\",\"AAAAAXsFAAABYQkAAAElBAAA\"]Ho[\"\",\"AAAAAAAAAAA7MAAAAQAACQABADEMCQA7MAAAAQAADQABACsEDQAFowwAAKgPAACpDwAAqg8AAB0RAAAAAagMAAAEpAwAAKsPAACtDwAAHBEAAAOlDAAApgwAAKwPAAAAAAGnDAAA\"]Bg[\"AAAAAAAAAAAAAAAAAAL7EAAA/BAAAA==\",\"\"]Hk[\"AAADvQEAAI8MAACSDAAAAZ4FAAABpAEAAAQnAAAAjgAAAJgQAACaEAAAAQ4QAAABKgMAAAP1AAAAZxEAAGgRAAA=\",\"AAACvQEAAIwMAAACSAQAAJ4FAAABSRMAAAABcgwAAA==\"]Hk[\"AAADvgEAAJAMAACTDAAAAd4FAAABtgEAAARUAAAAmwAAAJwQAACeEAAAAmoBAAAbEAAAATcDAAADPQQAAGkRAABqEQAA\",\"AAACvgEAAI0MAAADSQQAAN4FAABLEwAAAAF2DAAA\"]2ALo[\"AAAAAAGIEAAAAAA6MAAAAQAAAAAAEQAQAAAAqgE8BJYMlww6DTsNow+kDyMRJBFbElwSNxQ4FFsUXBRmFGcUAkQEAACMEwAAOzAAAAEAAAsAAgADEAMAWxMHADswAAABAAAHAAEAewcHAAAAAAACsQEAAFgHAAA=\",\"AAAH/wUAAAAGAACPDAAAkAwAAJIMAACTDAAAaxIAADowAAABAAAAAAAXABAAAABfCGAIvAnICZEMlAyVDJwPnQ+nEKgQqRD0EHQRhRGGEYcRiBGJEY8T9xP4EwwUDRQ7MAAAAQAA8AACAKMO7ABQEwMAOzAAAAEAAFYABAALAFIAKxMAAFUTAQC+EwAAAUEUAAAAAASYEQAAmREAAJoRAACbEQAABIoRAACLEQAAjBEAAI0RAAABuRIAAAAAAAAAAAdQBAAAFwYAAHgHAACgDgAA9xAAAAcRAACcEQAA\"]Cc[\"AAAAAAKPCgAA3QoAAAAAADswAAABAAAFAAEAnRIFAA==\",\"\"]BNo[\"\",\"ADswAAABAAAFAAIAGwQEAEIUAAACcAcAAI8HAAA6MAAAAQAAAAAACgAQAAAAygHLAQkG/AxmEqgSvBIhFC0USxRaFDowAAABAAAAAAAaABAAAAD6AfsB/AH9Af4B/wEAAikECAYNBj4HbAebB9QJChFpEqkSNRPfE+ATJBRHFEgUSRRKFF0UYRQ7MAAAAQAAEgEQACcEAAD1BQAABwYAAHEHAACOBwAAngcAABwOfgCWEAAACxEHAGsRAADbEX4AahIAAGwSAADxEgAANhMAAFQTAAA6MAAAAQAAAAAAGwAQAAAACgYQBhEGEgZqB2sHcgdzB3QHdQd2B3cHPAw9DD4MPwyuD7MPvRAiEWUSaBOkE6UTuxMcFC4UTBQ7MAAAAQAANwARACYDFABFBAAAUQQCAPMFAQD2BQAACwYBACUGAABdBwwAawgDADsMAACiDAAABxAAADsQAAC+EAAA8hIAAB0UAABNFAAAOzAAAAEAAFIACwDLAD0AfAEBAEQEAAAZCAAAGwgAAFoIAABcCAAAnRIFALwTAAD6EwUADhQAADswAAABAAAUAAYAKwQAAP0MAACbDgAAAxADAFsTBwA7FAUAOzAAAAEAABEACABKBAEAewcHAFkIAABbCAAAqA8CALIPAAAdEQAAyhIAAAK6BwAAuwcAAANBBAAAQgQAAKgMAAAEGAgAABoIAACkDAAAHBEAAAAF2hMAANsTAADcEwAA3RMAAN4TAAA=\"]Bc[\"AAAAAAAAAAAAAAAClhEAAJcRAAA=\",\"\"]Kc[\"AAAAAAE0EwAAADswAAABAAAGAAIAcgcFACIRAAAC9gUAADsQAAABRAQAAAADxxAAAMgQAADKEgAAASAQAAA=\",\"AAAAAAABPwQAADswAAABAAAFAAEAVAQFAAAAAAAAAAAAAAAAB/kBAABtBQAAcAUAAIcHAACIBwAAiQcAAIoHAAA=\"]Do[\"AAAAAAABFwAAAAAAAc8AAAAAAAAAAAAAAAACbQUAAHkHAAA=\",\"AAAAAAAAAAACsA8AALEPAAA=\"]Dk[\"AAAAAAABLgAAAAEPAQAAAAAAAAAAAAAAAAACcAUAAHoHAAA=\",\"AAAAAAAAAAABIAQAAA==\"]Ac[\"AAABSwIAAA==\",\"\"]Fg[\"AAAABKMFAAC+BwAAYwgAAHgRAAADwgkAAH0MAABIFAAAAQ0RAAAAAAH9AAAAAV0TAAABfQcAAA==\",\"AAAAAaMFAAAAAaYBAAA=\"]Fg[\"AAAABOkFAADCBwAAZwgAAH8RAAADxgkAAIEMAABKFAAAARERAAABgAEAAAAAAWETAAABgQcAAA==\",\"AAAAAekFAAAAAbgBAAA=\"]Bk[\"\",\"AAAAAAAAAAA7MAAAAQAAPwACAMsAPQB8AQEA\"]Ck[\"\",\"AAAAAAE+BwAAOzAAAAEAAAkAAgCeBwAAoAcIAAEgFAAAAZwTAAA=\"]Bo[\"\",\"AAAAAAAAAAAAAAAAAuYTAADnEwAAAAAAAToTAAA=\"]Ck[\"AAACTQIAAF0CAAA=\",\"AAAAAAAAAqkTAACqEwAAAAACmBEAAJkRAAA=\"]Eo[\"\",\"AAAAAAA7MAAAAQAABQABAKoSBQA7MAAAAQAABQABAIYTBQAAOzAAAAEAAAUAAQD6EwUAOzAAAAEAAAUAAQA7FAUA\"]Cc[\"\",\"AAAAAAJJEwAAShMAAAAEcQwAAHIMAABzDAAAdAwAAA==\"]Eo[\"AAAAAagFAAAAASsAAAAAAAIHAQAACAEAAA==\",\"AAA7MAAAAQAACgACAH4CCQCJAgAAAqgFAAAvFAAAAAAByBIAAA==\"]Eo[\"AAAAAeYFAAAAAVwAAAAAAAJ8AQAAfQEAAA==\",\"AAA7MAAAAQAACgACAAADBQAHAwQAAuYFAAAwFAAAAAAByRIAAA==\"]Dg[\"AAAB5QIAAAHkBQAAAAFaAAAAAnUBAAB2AQAA\",\"AAAB9AIAAAHkBQAAAAAAAAE9BAAA\"]Eo[\"AAAAAAAAAoUBAACGAQAA\",\"AAAAAAAABxwUAABFFAAATBQAAGgUAABpFAAAahQAAGsUAAACHRQAAE0UAAABRhQAAA==\"]Bk[\"AAAAAAAAATUBAAA=\",\"AAABvQIAAAAAATkEAAA=\"]Bo[\"AAAAAe0FAAAAAAGHAQAA\",\"AAAAAe0FAAABwxMAAA==\"]Bg[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAAfgMAAA=\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA1YIAAB2CAAAZwkAAA==\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAlAEAABXCAAA\",\"\"]Cc[\"AAAAAAAAAAKpCQAAqgkAAAAAAAAAAAACsQEAAFgHAAA=\",\"\"]Fo[\"AAAAAAACBwYAAGwSAAAAAAAAAAAAAAAAAAAEfAgAALcPAADBEAAAsxEAAA==\",\"AAEdCAAAAAAAAAAAAAAAAAAAAAAAAALCEAAAZhEAAA==\"]Bk[\"AAAAAQkGAAAAAAGuDwAAAQcQAAA=\",\"AAFOCAAA\"]Bg[\"AAAAAAAABMMQAADEEAAAxRAAAMYQAAA=\",\"\"]Ag[\"AAAAAp0BAACpAQAA\",\"\"]Dg[\"AAAAAAAAAAAAAtwJAADdCQAA\",\"AAAAAAAAAAAABa4MAACvDAAAsAwAALEMAACyDAAA\"]AGc[\"AAAAAAKiAQAAsgEAAAAABPMFAAD0BQAAYhEAAGMRAAAEGQgAABsIAABaCAAAXAgAADswAAABAAALAAQAIwYBAK4MBAD9DAAAmBEDADowAAABAAAAAAALABAAAABKBEsEWQhbCLIPxxDIEIoRixGMEY0RyhIEOwQAALoHAAC7BwAAIBAAAARBBAAAQgQAAOYTAADnEwAABUAEAAAYCAAAGggAAKsPAACtDwAAA6UMAACmDAAArA8AADowAAABAAAAAAAIABAAAACxASEEIwRYB9oT2xPcE90T3hMBOhMAAAGnDAAA\",\"AAAAAbQRAAAAAvgFAAD5BQAAAAKHDAAAiAwAAAAAAAAAAAACIQQAACMEAAA=\"]He[\"\",\"AAAAAAAEswwAALQMAAC1DAAAtgwAAAKODAAAIBQAAAJkEQAAnBMAAAWJEAAAihAAAIsQAACMEAAAjBMAAAFnEgAAAAG5EgAAAAEXCAAAAAGxAQAAAAABVgYAAA==\",1]AMk[\"AAACqwEAALQBAAAGmwEAAKMBAACoAQAAtQEAAC4TAAAvEwAABAgGAADUCQAAkAoAANwKAAAEswwAALQMAAC1DAAAtgwAAAKkEwAApRMAADowAAABAAAAAAAHABAAAACpCaoJpRCmECYTJxMeFB8UOjAAAAEAAAAAAAkAEAAAACAEGQgbCFoIXAiwD7EPIRBDFEQUAAJZCAAAWwgAAA==\",\"AAAAOjAAAAEAAAAAABAAEAAAAJEB9wf4B/kH+gd+CH8ItwwkECUQuhAlESYRthK3EvASKBQD0gkAAIgQAADrEgAABrMMAAC0DAAAtQwAALYMAAC9EgAAvxIAAAAAAAIjBgAAJAYAAAACOwQAACAQAAAAA0AEAACrDwAArQ8AAAOlDAAApgwAAKwPAAAAAAKnDAAAAg0AADowAAABAAAAAAALABAAAACUAU0ETgRvBXIFNwc4B7AH+wd7CHwIABA=\"]Bg[\"AAAAAAAAAAAAATYEAAA=\",\"AAAAAVMGAAA=\"]Bk[\"AAAAAAAAADswAAABAAANAAIAJQYAAF0HDAA=\",\"\"]Cc[\"AAABpAkAAAABAAIAAAAAAAEgBAAA\",\"AAAAAAAAAAE8BAAA\"]Bc[\"AAAAAAAAAAAAAAAAAAAAAVgHAAA=\",\"\"]Be[\"AAAAAAAAAxAGAAARBgAAEgYAAA==\",\"\",1]Bg[\"AAAAAAAAADswAAABAAAUAAEAJgMUAA==\",\"\"]Ck[\"\",\"AAAAAATLCQAAzAkAAM0JAADOCQAAAAAAAAAAAAAAAAAAAV0QAAA=\"]Bg[\"AAAAAAAAAAAAATEEAAA=\",\"AAAAAW8IAAA=\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAWMAAAA=\",\"\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAaAAAAA=\",\"\"]BMe[\"AAAAAAAB8RIAAAG7EwAAAqoBAADyEgAAOjAAAAEAAAAAABsAEAAAAJwBHQYeBuQP5Q8FEQYRshKzElcTWBOCE4MTlROWE5gTmROaE5sToxO8E/kTQxREFFYUVxRkFGUUOzAAAAEAAAYAAwDcCQEAAxADAAsUAAACJRQAAE4UAAAAAAABbQcAAAAAAAFWBgAA\",\"AAAFtwkAALgJAAC5CQAAugkAALsJAAAEiQwAAIoMAACLDAAAWhIAADswAAABAAASAAgAcAgAAGAJAQDLCQMA0gkAAH8QBADrEgAA9BIAAFATAwA7MAAAAQAAIAAOAMYBAADIAQAAJQQAADkEAAA/BAAAoAcIALMMAwClDwAAshAAABcRBABtEQQAMxMAAJcTAADiEwAAOzAAAAEAACMACQAiBAAAVAQFAFUGAAB5CAAApg8AAAoQEwCkEgEAqRMBAKwTAQA7MAAAAQAACAAEAJcQAACQEQMAoBECAMQTAAA7MAAAAQAADAAGACAEAACwDwEAiRADAGcRAwCjEwAA+RMAAARxEgAAchIAAHMSAAB0EgAAA6MMAAAlFAAAThQAAAM7BAAAIBAAAB4RAAAAAAFtBwAAAbEBAAAAADowAAABAAAAAAAdABAAAACiAKMApAClAE4HXAepB6oHqwedCc8J2AnZCdoJ2wneCd8J7w8IEAkQKxAsEC0QtxC4ELkQnxFfEskTbBQ=\",1]Bg[\"AAAAAAAAAAAAAAAAAAL7EAAA/BAAAA==\",\"\"]Jo[\"AAAAAYUFAAAAOjAAAAEAAAAAAAcAEAAAABgAiwDGASUEpQ+rEa4RVRMCCxAAAKQSAAACJwMAAF4HAAAC0AAAANEAAAAAAVkIAAAAAAEYCAAA\",\"AAEiCAAAAANeAAAAXwAAAIUFAAACQgIAAHAIAAACqxEAAK4RAAAAAVAHAAA=\"]A@c[\"AAAAAawFAAAABzAAAACTAAAAyAEAAK0RAACvEQAAMxMAAFYTAAAHEgEAABMBAACmDwAAExAAAB8QAACqEAAApRIAAAQvAwAAYwcAAKIMAADEEwAAAWgSAAABmw4AAANbCAAAJRQAAE4UAAAAAAEaCAAA\",\"AAE3CAAAAAGsBQAAAqMCAAAGBgAAAq0RAACvEQAAAVUHAAAAAAGfDAAAAAG5EgAAAAAAAAAABWMAAABkAAAAZQAAAGYAAABnAAAA\"]Bo[\"\",\"AAAAAAAAOzAAAAEAAKMAAwCoACIACQFyAH4BDQA=\"]CCi[\"\",\"AAA7MAAAAQAA3wABAFEL3wA7MAAAAQAA5gAKAF8KLgCRCjIAxQoBAMgKEgDeCh8A/woFAAYLKgA1CxsAoxIAAC8UAQA6MAAAAQAAAAAAEgAQAAAADQZUBj4HsQmyCY4KjwqQCsQKxwrbCtwK3Qr+CgULMQs0C0kTShM6MAAAAQAAAAAAEgAQAAAAJwT1BZ4HrAfWCdcJMgszC6YRqhKrEqwSrRKuEq8SVBPjE+gT6RM6MAAAAQAAAAAAKQAQAAAAagdrB3kIPAw9DD4MPwxxDHIMcwx0DI4Msw/cDx8QqhC9EMMQxBDFEMYQIhHIEskShhOHE4gTiROKE4sTqROqE6wTrRMcFCAURRRMFGgUaRRqFGsUOjAAAAEAAAAAABoAEAAAADwEUQRSBFMECwYMBk8HUAdRB1IHUweiDDsQmRCbEJ0QnxCgEL4QbBGgEaERohGcE8QTHRRNFDswAAABAABZAA8AywA9AHwBAQAgBAAAPQQAAEQEAAADBgEAFggAALAPAQAhEAAAaBIAAJ0SBQCjEwAA+RMGAA4UAABGFAAAOzAAAAEAABEACAAjBgEAnwwAAP0MAACbDgAAhBAAAJgRAwCSEwEAOxQFAAayDwAAxxAAAMgQAADKEgAAJRQAAE4UAAA6MAAAAQAAAAAACgAQAAAAOwQOBroHuwcgECcRKRErES0RLxG5EgRBBAAAQgQAAOYTAADnEwAABBcIAAAYCAAAGggAABwRAAACpgwAAKwPAAA6MAAAAQAAAAAACAAQAAAAsQEhBCMEWAfaE9sT3BPdE94TAToTAAAAAVYGAAA=\",1]Le[\"\",\"AAAAAroBAAA8BwAAA5wHAACeDwAAnw8AAAOOBwAAvRIAAL8SAAA6MAAAAQAAAAAABwAQAAAArg9lEm4SbxJwEqQTpRPZEwJFBAAAOwwAAAGcAQAAAQsUAAAEqA8AAKkPAACqDwAAHREAAAABqAwAAARABAAApAwAAKsPAACtDwAAAaUMAAAAAAGnDAAA\",1]Fo[\"\",\"AAAAOjAAAAEAAAAAAAcAEAAAAMoBywFmErwSIRQtFEsUWhQCmwcAAIgQAAAEOwcAAK4JAADfDwAAZBIAAAFoEwAAAWQRAAABjBMAAA==\"]Bo[\"\",\"AAAAAksTAABMEwAAAAR1DAAAdgwAAHcMAAB4DAAA\"]Bk[\"\",\"AAAAAAAAOzAAAAEAAAYAAgBUBwMAWQcCAA==\"]Fc[\"AAAAAbMBAAAAAAAABB0GAAAeBgAA5A8AAOUPAAA=\",\"AAA7MAAAAQAAPQABALgMPQAAAAAAAAAAAAAAAAAAAAABiwcAAA==\"]Ao[\"\",\"AAA7MAAAAQAA3wABAIAI3wA=\"]AAg[\"AAAEUgIAAGMCAABpAgAAmQ8AAAGDBQAAAzUTAABdFAAAYRQAAAMVAAAAigAAAKoRAAABChAAADowAAABAAAAAAAMABAAAAAmA1EEUgTzBfQFCwZdB50RnRPHE/ATKxQ5FALLAAAAzAAAAA==\",\"AAEhCAAABzoCAAA7AgAAPAIAAD4CAAA/AgAArwkAACgTAAABgwUAAASxCQAAjgoAAI8KAACQCgAAAaoRAAABcQwAAANPBwAAoBEAAKERAAAAAAAAAAAAAAAAAZEPAAA=\"]ABc[\"AAAEwwIAAOYCAADtAgAAmg8AAAGpBQAAAAQsAAAAkQAAAKwRAAA2EwAABAsBAAAMAQAAERAAAC4UAAA6MAAAAQAAAAAACgAQAAAALQNTBPYFDAZiB54RnhPIE/ETLBQ6FAABmw4AAA==\",\"AAE2CAAAB5oCAACbAgAAnQIAAJ4CAACfAgAAsAkAACkTAAABqQUAAASyCQAA2woAANwKAADdCgAAAnUMAACsEQAAAlQHAAB5CAAAAaIRAAAAAAAAAAAAAAAABJMPAACUDwAAlQ8AAJYPAAA=\"]Cg[\"AAAAAAAAAAAAAAAAAUEEAAAAAAEhBAAA\",\"AAAAAAAAAAFiEQAA\"]Cg[\"AAAAAAAAAAAAAAAAAUIEAAAAAAEjBAAA\",\"AAAAAAAAAAFjEQAA\"]Fo[\"AAA7MAAAAQAACwAEAHoQBABNEwAA8hMEAF4UAAA=\",\"ADswAAABAAAJAAIA/AcEACETBAA7MAAAAQAACwAEAHoQBABNEwAA8hMEAF4UAAA=\"]Ho[\"AAAAAAAAAAA7MAAAAQAACQABADEMCQA7MAAAAQAADQABACsEDQAFowwAAKgPAACpDwAAqg8AAB0RAAAAAagMAAAEpAwAAKsPAACtDwAAHBEAAAOlDAAApgwAAKwPAAAAAAGnDAAA\",\"\"]Cc[\"AAAAAp8BAAAlEQAAAAAAAAGsDAAAAAFKBAAAAboHAAA=\",\"\"]Cc[\"AAAAAq4BAAAmEQAAAAAAAAGtDAAAAAFLBAAAAbsHAAA=\",\"\"]ABc[\"AAAAAjsTAAA8EwAAAAWmAQAApwEAALgBAAC5AQAAaxEAADswAAABAAALAAMAZAUHAAoGAACYDAIAOjAAAAEAAAAAAAcAEAAAAPYFawhsCG0Ibgi0D7UPBxAHZxEAAGgRAABpEQAAahEAALwTAAAOFAAARhQAADswAAABAAANAAQAnwwAAJsOAAADEAMAWxMHADswAAABAAAHAAEAewcHAAIeEQAAuRIAAAABFwgAAAFtBwAAAAAAAVYGAAA=\",\"AAAAA8ABAADBAQAAwgEAAAABshAAAA==\"]Ek[\"AAAAAAAAAAAAAAAAAAAAAAACAQYAAJEHAAA=\",\"AAAAAAAAAAKQEQAAkREAAAAAAAAAAAAAAAACbgcAAIQHAAA=\"]Ek[\"AAAAAAAAAAAAAAAAAAAAAAACAgYAAJMHAAA=\",\"AAAAAAAAAAKSEQAAkxEAAAAAAAAAAAAAAAACbwcAAIUHAAA=\"]Ak[\"\",\"AAAAAAIBEAAAAhAAAA==\"]Eo[\"AAAABKUFAAC/BwAAZAgAAHoRAAACwwkAAH4MAAABDhEAAAAAAf8AAAABXhMAAAF+BwAA\",\"AAAAAaUFAAAAAacBAAA=\"]Eo[\"AAAABOsFAADDBwAAaAgAAIERAAACxwkAAIIMAAABEhEAAAGCAQAAAAABYhMAAAGCBwAA\",\"AAAAAesFAAAAAbkBAAA=\"]Bg[\"AAAAAAAAAAAAATAEAAA=\",\"AAAAAdUJAAA=\"]Ag[\"AAACngEAAK0BAAA=\",\"\"]Bg[\"AAAAAAAAAAAAAAAAAAKkDAAAHBEAAA==\",\"\"]Ag[\"\",\"AAACoRAAAKIQAAA=\"]Bc[\"AAAAAAAAAAAAAWcSAAA=\",\"AAFsAAAA\"]Dg[\"AAAAAsABAADBAQAAAAADEAYAAJgMAABuEgAAAAGcAQAAAQsUAAA=\",\"AAAAAVoSAAA=\"]Hg[\"AAAAAYURAAABUBMAAAOYEAAAGBEAAG4RAAABqRMAAAGQEQAAAYkQAAACmBEAAHESAAABihEAAAAAAAAB2xMAAA==\",\"AAAAAAAAAAIoEQAAKhEAAAAAAAInEQAAKREAAA==\"]Ig[\"AAAAAYgRAAABUhMAAAOcEAAAGhEAAHARAAABrBMAAAGSEQAAAYsQAAACmhEAAHMSAAABjBEAAAAAAAAB3RMAAA==\",\"AAAAAAFlEQAAAAADLBEAAC4RAAAwEQAAAAAAAysRAAAtEQAALxEAAA==\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmsAAACWDwAA\",\"\"]Bk[\"AAAAAAAAAcoAAAAAAAE4BAAA\",\"AAAAAXgIAAA=\"]Cc[\"AAAAAboQAAABZBMAAAACIgQAAFUGAAA=\",\"AAAAAAF9CAAA\"]Ek[\"AAAAAYoFAAAAARsAAAAAAAHWAAAAAAAAAAAAAAAAAm8FAAA3BwAA\",\"AAEnCAAAAAGKBQAAAAAAAAAAAccQAAA=\"]Ek[\"AAAAAbkFAAAAAToAAAABJAEAAAAAAAAAAAAAAAAAAnIFAAA4BwAA\",\"AAE+CAAAAAG5BQAAAAAAAAAAAcgQAAA=\"]Be[\"AAAAAAA7MAAAAQAAfgABANsRfgA=\",\"\",1]Bg[\"AAAAAAAAAAAAATMEAAA=\",\"AAAAAXAMAAA=\"]Ec[\"AAAAAAAAAAAAAAAAAAIYCAAAGggAAAFtBwAAArEBAABYBwAA\",\"AAAAAAAAAAAAAAAAAAAAAbEBAAA=\"]Dk[\"AAAAAAAAAAAB/xMAAAFAFAAA\",\"AAAAAAABrxIAAAGLEwAAAAAAAAAAAAAAAAABAQgAAA==\"]Dg[\"AAAAAdEFAAAAAAJPAQAAUAEAAAFmBwAAAAAAAAAAAAAAAAH5AQAA\",\"AAAAAdEFAAA=\"]ABc[\"AAAAA5kBAACgCgAAsBEAAANsBwAA/goAAAoRAAAAADowAAABAAAAAAANABAAAAC+Cb8JyQnKCe0P7g+7ELwQLBMtE04TTxOhE6ITOzAAAAEAAA8ABwAFEQEAnRIFAFcTAQCjEwAA+RMAAFYUAQBkFAEAAAIlFAAAThQAAA==\",\"AAAAA4wBAACXAQAAhRAAAAR/EAAAgBAAAIEQAACCEAAAAsYBAADIAQAAAAACoxMAAPkTAAAAAiUUAABOFAAAAAAAAAAAAATHAQAAyQEAAKEJAACzEQAA\"]Bk[\"AAAAAAGbBwAA\",\"AAAAAAAAAAFkEQAAAAFnEgAA\"]Ho[\"AAAABXkFAAAZBgAAUwYAAPwMAAC2EgAAAp8PAAAkFAAAAo4HAADxEgAAA7EAAABlEgAAuxMAAAH0BQAAARYIAAABhBAAAA==\",\"AAAAAnkFAAA8BwAAAZwHAAAAAAABnAEAAAELFAAA\"]Gc[\"AAAAArcSAAC9EwAAAUMHAAABcQcAAAEKAQAAApcQAADyEgAAAAGQBwAAAAEOBgAAAAEXCAAAAW0HAAAAAAABVgYAAA==\",\"AAAAAAAAAAGqAQAA\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAWoAAAA=\",\"\"]Fc[\"AAADcAcAAI8HAAD7DwAABJQMAACuEAAApREAAAwUAAAE+wEAAA0GAABUBgAAzQkAAAACswAAANwPAAA=\",\"AAABAxEAAA==\"]Fc[\"AAAABJUMAACvEAAApxEAAA0UAAABzgkAAAFxBwAAAVIBAAAAAAGQBwAAAAEOBgAAAAAAAAAAAVYGAAA=\",\"AAABBBEAAA==\"]Dg[\"AAAAAdYFAAAAAU4AAAABWwEAAA==\",\"AAAAAdYFAAAAAAAAAAAAAAAAAAAAAAFtAAAA\"]Bk[\"AAAAAAH6AQAAAAAAAAEtBAAA\",\"AAAAAZ0MAAA=\"]Cc[\"AAAAAAFwCAAAAAAAAAEuBAAA\",\"AAAAAAACngwAALgSAAA=\"]Dk[\"\",\"AAAAADswAAABAAATAAEAAggTADswAAABAAATAAEAigATADswAAABAAATAAEAChATAA==\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAWgAAAA=\",\"\"]Ak[\"\",\"AAAAAAIeEAAAwxMAAA==\"]Ag[\"\",\"AAAAAAAB4hMAAA==\"]Fg[\"AAAAAe4FAAAAAAGJAQAAAAAAAAAAAUAEAAAAAAABpwwAAAakAAAAlAEAAPMBAABcBwAAsAcAAF8SAAA=\",\"AAFNCAAAAAHuBQAA\"]Hk[\"AAAEngAAADsCAAD9BQAAjAwAAAGgBQAAAAIpAAAAkAAAAAEQEAAAAiwDAABhBwAAAvgAAAD5AAAA\",\"AAABaQIAAARgAAAAYQAAAGIAAACgBQAAAaQBAAAAAXQMAAABUwcAAA==\"]Kc[\"AAAEnwAAAJ8CAAD+BQAAjQwAAAHgBQAAAARWAAAAnQAAACMQAAAoEAAAA20BAABuAQAAHRAAAAI5AwAAaAcAAA==\",\"AAAB7QIAAAHgBQAAAbYBAAABeAwAAAMiBAAAVQYAAFoHAAAAAAAAAAAAAAAAAARoAAAAaQAAAGoAAABrAAAA\"]Ak[\"AAAAAAI5EAAAOhAAAA==\",\"\"]Ao[\"AAAAAAAAAAAClQEAAJ0SAAA=\",\"\"]Ao[\"AAAAAAAAAAAClgEAAKASAAA=\",\"\"]Dc[\"AAAAAAAAAAAB+gAAAAAAAAAAAAAAAAWiAAAATQQAAKkHAADmDwAAtxAAAA==\",\"\"]Fc[\"AAAAAAAAAW8BAAAAAAAAAAAAAAAAAAWjAAAATgQAAKoHAADnDwAAuBAAAA==\",\"AAAAAAAAAAAAAZAHAAAAAg4GAAAeEQAA\"]Fc[\"AAAAAe8FAAAAAAGKAQAAAkUEAAA7DAAAAAAAAAGoDAAAAAAAAAAFpQAAAKsHAACeCQAA6A8AALkQAAA=\",\"AAAAAe8FAAA=\"]Go[\"AAAAAYYFAAAAARkAAAAAAAHSAAAAAAAAAAAAAAAAA48BAABuBQAAhAwAAA==\",\"AAEjCAAAAAGGBQAAAAAAAAAAAAAAAAAAAAAEsQcAALIHAAC1BwAAtgcAAA==\"]Go[\"AAAAAbMFAAAAATYAAAABHAEAAAAAAAAAAAAAAAAAA5ABAABxBQAAhgwAAA==\",\"AAE6CAAAAAGzBQAAAAAAAAAAAAAAAAAAAAAEswcAALQHAAC3BwAAuAcAAA==\"]Bc[\"AAAAAAAAAAAAAAAAAAAAAAE6EwAA\",\"\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAWkAAAA=\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmQAAACNBwAA\",\"\"]Bg[\"AAAAAAAAAAAAATIEAAA=\",\"AAAAATkNAAA=\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAaEAAAA=\",\"\"]Dk[\"AAAAAaIFAAABpQEAAAABZQUAAAF3EQAAAfwAAAA=\",\"AAEwCAAAAAGiBQAAAAAAAXcRAAA=\"]Dk[\"AAAAAegFAAABtwEAAAACfwEAAGkFAAABfhEAAA==\",\"AAFJCAAAAAHoBQAAAAAAAX4RAAA=\"]Hc[\"AAAAAAAB3w8AAAHZEwAAAAH7EwAAATwUAAAAAAAAAAAAADowAAABAAAAAAANABAAAAB4B50J2gmgDuwP7w8rEPcQBxGfEb4SwBKUE8kT\",\"AAAAAAABqxIAAAGHEwAA\"]Ak[\"AAAAAALfEwAA4BMAAA==\",\"\"]Cg[\"AAAAAfASAAAB0gkAAAE/BAAAAAABRAQAAA==\",\"AAAAAAGFDAAA\"]Ag[\"\",\"AAAAAAAAAVsHAAA=\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmUAAACnDwAA\",\"\"]Ag[\"AAAAAAAAAAFpBwAA\",\"\"]Dk[\"AAAAAAAAOzAAAAEAAKMAAwCoACIACQFyAH4BDQAAOzAAAAEAAD8AAgDLAD0AfAEBAA==\",\"\"]Go[\"AAAAAeEFAAAABFcAAABVEwAAVhMAAL4TAAADcAEAAHEBAABBFAAAAToDAAAAAZ8MAAAAAbkSAAAAAAFtBwAAAAAAApIHAADPCQAA\",\"AAAAAeEFAAAAAAGqEAAA\"]Dk[\"AAAAAZYFAAAAASAAAAAAAV8HAAAC5gAAAOcAAAA=\",\"AAAAApYFAACoCgAAAAAAAVEHAAA=\"]Dk[\"AAAAAcsFAAAAAUUAAAACQQEAAEIBAAABZAcAAA==\",\"AAAAAcsFAAABBQsAAAABVgcAAA==\"]Ck[\"AAAAASQQAAAAAAAAAhkIAABaCAAA\",\"AAAAAAAAAAACiRAAAIoQAAA=\"]Ck[\"AAAAASUQAAAAAAAAAhsIAABcCAAA\",\"AAAAAAAAAAACixAAAIwQAAA=\"]Bk[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAAgARAABtEgAA\"]Ek[\"AAAAA34IAABdEgAAuRMAAAAAAAAAAAFZCAAAAAABGAgAAA==\",\"AAAAAAAAAAKQEQAAkREAAAKJEAAAihAAAA==\"]Ek[\"AAAAA38IAABeEgAAuhMAAAAAAAAAAAFbCAAAAAABGggAAA==\",\"AAAAAAAAAAKSEQAAkxEAAAKLEAAAjBAAAA==\"]Dg[\"AAAAAb8FAAAAAUEAAAACLwEAADABAAA=\",\"AAAAAb8FAAAAAAAAAAGfDAAAAAG5EgAA\"]Ac[\"\",\"AAAAAAEeEAAA\"]Cc[\"AAABvQIAAAGvBQAAAAEyAAAAARYBAAA=\",\"AAAAAa8FAAA=\"]Hc[\"AAAAAYgFAAAAARoAAAAAAAHUAAAAAAAAAAAAAAAAOjAAAAEAAAAAAAoAEAAAAMcB9wGxB7UHoA/hD6MQ5xJZE2kThBM=\",\"AAElCAAAAAKIBQAAGgYAAAABpQ8AAA==\"]Ic[\"AAAAAbUFAAAAATcAAAABHgEAAAAAAAAAAAAAAAAAOjAAAAEAAAAAAAoAEAAAAMkB+AGzB7cHoQ/jD6QQ6BJaE2oThRM=\",\"AAE8CAAAAAG1BQAAAAABpg8AAAAAAAAAAAAAAAAAAacPAAA=\"]Gk[\"AAACIgIAACoCAAABfgUAAAACEAAAAKIHAAACvQAAAL4AAAA=\",\"AAACJQIAACYCAAABfgUAAAAAAAACsA8AALEPAAAAAAI7BAAAIBAAAAABHBEAAAGmDAAA\"]Do[\"AAAAAbcFAAAAAjgAAACUAAAAAyABAAAhAQAAFBAAAAEwAwAA\",\"AAAAAbcFAAAAAAAAASAEAAA=\"]Ck[\"AAAAAsETAADCEwAAAAAAAAAAAAABqAwAAA==\",\"AAAAAAAB/RAAAA==\"]Co[\"AAAAAAABjgcAAANuEgAAbxIAAHASAAAAAZwBAAA=\",\"AAAAAAAB3w8AAA==\"]JNa[\"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\",1]Eo[\"AAAAAAA7MAAAAQAABQABAKoSBQA7MAAAAQAABQABAIYTBQAAOzAAAAEAAAUAAQD6EwUAOzAAAAEAAAUAAQA7FAUA\",\"\"]Ck[\"AAAAAAAAAQoGAAAAAAErBAAA\",\"AAAAAAAAA5gMAACZDAAAmgwAAA==\"]Cc[\"\",\"AAAAAAAEJwQAAKwHAACmEQAA4xMAAAAAAqMTAAD5EwAA\"]Fc[\"AAAAAbIFAAAAATUAAAACGgEAABsBAAA=\",\"AAE5CAAAAAGyBQAAAAACHxAAAKoQAAACogwAAMQTAAAAAAIlFAAAThQAAA==\"]Eo[\"AAAAAaMRAAABywkAAAACrAAAAI4MAAABbBEAAAABLwQAAA==\",\"AAAAAAFUBgAAAAKODAAA3A8AAAABFggAAAGEEAAA\"]Dk[\"AAAABmYSAAC8EgAAIRQAAC0UAABLFAAAWhQAAAAAAAABjBMAAA==\",\"AAAAAAAAAAFkEQAA\"]A@g[\"AAAAOjAAAAEAAAAAAA8AEAAAAEgEdgUYBj8HbwjVCXAMnQy3DDkNNRAhEaQRqBKPEygUOjAAAAEAAAAAAAkAEAAAAMwJHhCDEGkS6xI0EzUTwxNdFGEUOjAAAAEAAAAAAAgAEAAAAMYBJQSeDKUPFxFtEbgSVBPiEzowAAABAAAAAAAHABAAAACtACIRpBIcFEUUTBRoFGoUAfMFAAAAAAAAAAAAAdoTAAA=\",\"AAAAAXYFAAABYAkAAAABjgwAAA==\"]ACk[\"AAAAOjAAAAEAAAAAAAgAEAAAAEkEvAmRDJwP4g/0EIcR9xP4EzowAAABAAAAAAAHABAAAAApBAYGGwZ9CIUMZRGpEuETOjAAAAEAAAAAAAoAEAAAAMgBOQQjECgQlhCyEGsRahIzEzYTlxM6MAAAAQAAAAAABwAQAAAACQGmDx8QqhClEi4UaRRrFAX2BQAAogwAAMQTAAAdFAAATRQAAARoEgAAvBMAAA4UAABGFAAAAp8MAACbDgAAAiUUAABOFAAAAh4RAAC5EgAA\",\"AAAAAAAAAAAAAAAAAAEXCAAAAAAAAAFWBgAA\"]Ho[\"AAAAA7wHAABhCAAAdREAAAPACQAAewwAAEcUAAABCxEAAAABawgAAAACAxAAAFsTAAABewcAAA==\",\"AAAAAAR7DAAAfAwAAH0MAAB+DAAAAAVkBQAAZQUAAGYFAABnBQAApBIAAA==\"]Ho[\"AAAAA8AHAABlCAAAfBEAAAPECQAAfwwAAEkUAAABDxEAAAABbQgAAAACBRAAAF8TAAABfwcAAA==\",\"AAAAAAR/DAAAgAwAAIEMAACCDAAAAAVoBQAAaQUAAGoFAABrBQAApRIAAA==\"]Mc[\"AAAAAYcFAAAAAAAAAdMAAAAAAAAAAAAAAAA6MAAAAQAAAAAAJAAQAAAA8AEoBEgHrgefCdAJmwygDKkM3Q/+D4YQsBC1EL8Q9RABEQgRExEVEXIRlBGoEWASYhKmErQS7BLuEjATaxNtE58TphPFE+QTIhQ=\",\"AAEkCAAAAAGHBQAAAAAAAAAAAAAAAAAAAAACpQkAAKcJAAA=\"]Mc[\"AAAAAbQFAAAAAAEdAQAAAAAAAAAAAAAAAAA6MAAAAQAAAAAAJAAQAAAA8QEqBEwHrwegCdEJnAyhDKoM3g//D4cQsRC2EMAQ9hACEQkRFBEWEXMRlRGpEWESYxKnErUS7RLvEjETbBNuE6ATpxPGE+UTIxQ=\",\"AAE7CAAAAAG0BQAAAAAAAAAAAAAAAAAAAAACpgkAAKgJAAA=\"]Cc[\"AAAAAZ0FAAAAAAAAAfMAAAA=\",\"AAAAAZ0FAAAAAAE8DAAA\"]Ck[\"AAAAAdwFAAAAAAFnAQAA\",\"AAAAAdwFAAAAAAM9DAAAPgwAAD8MAAA=\"]Bk[\"AAAAAAAAAAAAAAAAAAFABAAAAAAAAacMAAA=\",\"\"]Bg[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAAZcPAAA=\"]Eo[\"AAAAAcwFAAAAAUcAAAACRQEAAEYBAAABZQcAAA==\",\"AAAAAcwFAAAAAAFXBwAAAAAAAAAAAAAAAAAC/AUAAJgPAAA=\"]Bk[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAAlgUAABZFAAA\"]Ck[\"AAAAAAAAAAABDhQAAA==\",\"AAAAAAAAAAAAAAAAAAAAAAABbxQAAA==\"]Ag[\"AAACgQIAAAoDAAA=\",\"\"]Cc[\"AAAAAAACngwAALgSAAABsw8AAA==\",\"AAAAAAABrAcAAA==\"]Gc[\"AAAAAa4FAAAAATEAAAABFQEAAAABaBIAAAGfDAAAAAG5EgAA\",\"AAE4CAAAAAGuBQAAAAEzEwAAAR8QAAAAAWgSAAAAAAAAAAAAAAABrQcAAA==\"]Do[\"AAAAAAAAAAG0DwAAAh0GAADkDwAA\",\"AAAAAZ0BAAAAAAABtA8AAAQdBgAA5A8AAGcRAABoEQAA\"]Do[\"AAAAAAAAAAG1DwAAAh4GAADlDwAA\",\"AAAAAakBAAAAAAABtQ8AAAQeBgAA5Q8AAGkRAABqEQAA\"]Ao[\"AAAAAAGIEAAAAAABqxAAAA==\",\"\"]Gc[\"AAABgxEAAAJgAAAAXwgAAAH+AQAAAAG5AAAAAlEEAACgEQAAArAPAAAhEAAAAAGyDwAAAjsEAAAgEAAAAAKkDAAAHBEAAAKlDAAApgwAAA==\",\"\"]Cc[\"AAAAAAAAAAM8BAAAUwQAAKIRAAA=\",\"AAAAAAABIxAAAA==\"]Ec[\"AAABJQIAAAF/BQAAAAIRAAAAowcAAAK/AAAAwAAAAA==\",\"AAABJwIAAAF/BQAAAAAAAqARAAChEQAA\"]Bo[\"AAABAxEAAAAAAAK0AAAAtQAAAA==\",\"AAAAAAENBgAA\"]Ck[\"AAABBBEAAAAAAAJWAQAAVwEAAA==\",\"AAAAAAAAAAAAAAABDgYAAA==\"]Ao[\"AAAAAAAAAWgTAAABog8AAA==\",\"\"]Hg[\"AAAAAmIAAAB4CAAAAf8BAAAB1gkAAAPFAAAAagcAAL0QAAACCwYAADsQAAAAAiMGAAD9DAAABqgPAACpDwAAqg8AAMcQAAAdEQAAyhIAAAAAAqsPAACtDwAAAawPAAA=\",\"\"]Dk[\"AAAAAAAB1wkAAAJrBwAAeQgAAAIMBgAAvhAAAAABJAYAAAHIEAAA\",\"AAAAAAABKBAAAA==\"]Bc[\"AAAAAAAAAAAAAAAAAAAAAAE6EwAA\",\"\"]AAg[\"AAAAATwHAAABnAcAAAQ7BwAAngwAAN8PAAC4EgAAAhwUAABMFAAAA2QRAAAdFAAATRQAAAUWCAAAZxEAAGgRAABpEQAAahEAAAGEEAAAAAAAARcIAAA=\",\"AAAABKMRAACkEQAApREAAKcRAAACng8AAJ8PAAACphEAAOITAAAFRRQAAGgUAABpFAAAahQAAGsUAAABxBMAAAFGFAAAAWcSAAAAAAAAAAAAArkPAADSDwAABvIBAADzAQAAkgcAAOYPAADnDwAA6A8AAA==\"]Cc[\"AAAAAc0FAAAAAUgAAAACRwEAAEgBAAA=\",\"AAAAAc0FAAA=\"]Dc[\"AAAAAAAAAAA7MAAAAQAABQABAJ0SBQA=\",\"AAAABL8BAADDAQAAxAEAAMUBAAA=\"]Ao[\"AAAAAb8BAAAAAAAAAS4QAAA=\",\"\"]Ao[\"AAAAAcQBAAAAAAAAAS8QAAA=\",\"\"]Eo[\"AAAAAYYRAAABURMAAAOaEAAAGREAAG8RAAABqhMAAAGREQAAAYoQAAACmREAAHISAAABixEAAAAAAAAB3BMAAA==\",\"\"]Eo[\"AAAAAYkRAAABUxMAAAOeEAAAGxEAAHERAAABrRMAAAGTEQAAAYwQAAACmxEAAHQSAAABjREAAAAAAAAB3hMAAA==\",\"\"]Bc[\"AAAAAAAAAlQEAAByBwAAAAEwEAAA\",\"\"]Bc[\"AAAAAAAAAlcEAAB1BwAAAAExEAAA\",\"\"]Ec[\"AAAAAboBAAAAAr0SAAC/EgAAAqQTAAClEwAAAkUEAAA7DAAAAAAAAAABQAQAAA==\",\"AAAAAAEVAwAA\"]Gg[\"AAAAAYEFAAAAAhMAAAClBwAAAsYAAADHAAAA\",\"AAADLgIAAC8CAAAwAgAAAYEFAAAAAAABOxAAAAACIwYAAP0MAAACxxAAAMoSAAAAAAABrA8AAA==\"]Eg[\"AAAAAboFAAAAAjsAAACWAAAAAyUBAAAmAQAAFhAAAAEyAwAA\",\"AAAAAboFAAAAAAAAAAEkBgAAAcgQAAA=\"]Ec[\"AAAAAAAAAVUBAAAAAAAAAAAAAAAAAAJzBQAA2wkAAA==\",\"AAAAAAAAAAAAAAAAAAAAAAAAAVYGAAA=\"]Ec[\"AAABeQwAAAF1BQAAAAELAAAAAakAAAA=\",\"AAAAAXUFAAAAAa4JAAAAAAAAAAAAAAAAAAABOQcAAA==\"]Dg[\"AAAAAAEIBgAAAAAAAAAAAAAAAAAAAALCEAAAZhEAAA==\",\"AAEeCAAAAAAAATsHAAA=\"]Ac[\"AAABTAIAAA==\",\"\"]Do[\"AAAAAZUFAAAAAR8AAAAAAALkAAAA5QAAAA==\",\"AAACWAIAAFoCAAABlQUAAAAAAAAAAZITAAA=\"]Dk[\"AAAAAcoFAAAAAUQAAAACPwEAAEABAAA=\",\"AAACyAIAAMoCAAABygUAAAAAAAAAAZMTAAA=\"]Bk[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAArMJAAC1CQAA\"]Dk[\"AAAAAAAAAAABAwEAAA==\",\"AAABdgIAAAAAAAAAAAAAAboHAAABQQQAAAEYCAAAAAEhBAAA\"]Dg[\"AAAAAAAAAXgBAAA=\",\"AAAB+AIAAAAAAAAAAAAAAbsHAAABQgQAAAEaCAAAAAEjBAAA\"]Dk[\"AAAAAaQFAAAAAaYBAAABZgUAAAF5EQAAAf4AAAA=\",\"AAExCAAAAAGkBQAAAAAAAXkRAAA=\"]Dk[\"AAAAAeoFAAAAAbgBAAACgQEAAGoFAAABgBEAAA==\",\"AAFKCAAAAAHqBQAAAAAAAYARAAA=\"]Ck[\"AAAAAbsFAAAAATwAAAACJwEAACgBAAA=\",\"AAAAAbsFAAAAAAFrBwAA\"]Eg[\"AAAAAZAFAAAAAh4AAACMAAAAAQwQAAABKAMAAALfAAAAshIAAA==\",\"AAEsCAAAAVICAAACkAUAAKAKAAA=\"]Eg[\"AAAAAcUFAAAAAkMAAACXAAAAAjoBAAAXEAAAATMDAAABsxIAAA==\",\"AAFECAAAAcMCAAABxQUAAAH+CgAA\"]Ao[\"AAAAAAAAAAACsxAAAGcRAAA=\",\"\"]Ao[\"AAAAAAAAAAACtBAAAGkRAAA=\",\"\"]Bg[\"AAAAAAAABMQAAAASBgAAmgwAAHASAAA=\",\"\"]Ak[\"AAAAAAABPQAAAAEpAQAA\",\"\"]Do[\"AAAAAAAAAAAAAAAAAAAAAAAAAgARAABtEgAA\",\"AAEcCAAAAAAAAAAAAAAAAAAAAAAAAAHBEAAA\"]Cg[\"AAAAAANsBwAA1AkAAAoRAAA=\",\"AAAAAAAAAAKiDwAAqxAAAA==\"]Ag[\"AAACdgIAAPgCAAA=\",\"\"]Cc[\"AAAAAcUKAAACxAoAADELAAABMgsAAALDEAAAxRAAAA==\",\"\"]Ac[\"\",\"AAAAAaMSAAA=\"]Gg[\"AAAAAZQFAAABJBQAAAAAAWIJAAAE4wAAADAQAADDEgAACRQAAAGEEAAA\",\"AAAAA6EBAACUBQAALxQAAAAB6BMAAAABYgkAAAMwEAAAwxIAAAkUAAA=\"]Bc[\"AAAAAaEBAAAAAAAAAAAAAScRAAA=\",\"\"]Gg[\"AAAAAckFAAAAAAE+AQAAAWMJAAADMRAAAMUSAAAKFAAAAAAAAAEXCAAA\",\"AAAAA7ABAADJBQAAMBQAAAAB6RMAAAABYwkAAAMxEAAAxRIAAAoUAAA=\"]Bc[\"AAAAAbABAAAAAAAAAAAAASsRAAA=\",\"\"]Fg[\"AAABMAIAAAGLBQAAAAEcAAAAAAAC1wAAANgAAAA=\",\"AAEoCAAAAAGLBQAAAAHWCQAAAmoHAAC9EAAAA1EEAABSBAAACwYAAA==\"]Eo[\"AAAAAb0FAAAAAT8AAAACKwEAACwBAAA=\",\"AAFACAAAAAG9BQAAAAHXCQAAAXkIAAAEUwQAAAwGAAC+EAAAohEAAA==\"]Ao[\"\",\"AAAAAAAAAAAAAAABLxEAAA==\"]Ek[\"AAAAAZkFAAAAASMAAAAAAALsAAAA7QAAAA==\",\"AAABXwIAAAGZBQAAAAAAAAEWCAAAAYQQAAAAAicRAAApEQAA\"]Eg[\"AAAAAdMFAAAAAU0AAAACUwEAAFQBAAA=\",\"AAAB1wIAAAHTBQAAAAAAAAAAAAIrEQAALREAAAABFwgAAA==\"]Ao[\"AAAAAAAAAAGgEAAAAAGyDAAA\",\"\"]Jk[\"AAAAAZoFAAAABSQAAACNAAAA+AUAAJgQAACaEAAAAjwMAAANEAAABCkDAACHDAAAmRAAAJsQAAAE7gAAAO8AAABnEQAAaBEAAAKuDAAArwwAAAKKEQAAixEAAA==\",\"AAAAApoFAACuEAAAAqIBAACREAAAAAABqQkAAA==\"]Og[\"AAAAAdgFAAAABVAAAACaAAAA+QUAAJwQAACeEAAABmABAABhAQAAPQwAAD4MAAA/DAAAGhAAAAQ2AwAAiAwAAJ0QAACfEAAAAmkRAABqEQAAArAMAACxDAAAAowRAACNEQAA\",\"AAAABNgFAABRCAAAUggAAK8QAAAEsgEAAJIQAACTEAAAlBAAAAAAAaoJAAACAwYAAAQGAAAAAAAAAAAAAAA7MAAAAQAACgACAFMIBQBzCAQA\"]Cc[\"AAAAAc4FAAAAAUkAAAACSQEAAEoBAAA=\",\"AAAAAc4FAAA=\"]Ck[\"AAAB/wUAAAGbBQAAAAElAAAAAAAB8AAAAA==\",\"AAAAApsFAACJDAAA\"]Dg[\"AAABAAYAAAHZBQAAAAFRAAAAAWIBAAAAAAAAAAAAAW0HAAA=\",\"AAAAAtkFAACKDAAA\"]Cc[\"AAAAAfAFAAAAAV0AAAABiwEAAA==\",\"AAAAAvAFAACLDAAA\"]Dg[\"AAAAAAAAAAAAAAABHhEAAA==\",\"AAAABpUQAACxEgAAkBMAAJETAADBEwAAwhMAAA==\"]Ak[\"AAAAAAAAAAABnxIAAA==\",\"\"]Ak[\"AAAAAAAAAAABohIAAA==\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmcAAADyAQAA\",\"\"]Bg[\"AAAAAAAAAAAAATQEAAA=\",\"AAAAASERAAA=\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAAmYAAACtBwAA\",\"\"]Bk[\"AAAAAAAAAAAAAAR7BwAAfAcAAH0HAAB+BwAA\",\"\"]Ec[\"AAAABIwBAACXAQAArQUAAIUQAAAAAAEUAQAAAAAABH8HAACABwAAgQcAAIIHAAA=\",\"AAAAAa0FAAA=\"]Bg[\"AAAAAAAAAAAAATUEAAA=\",\"AAAAAAE0EwAA\"]Cc[\"AAAAAcgKAAACxwoAADQLAAABMwsAAALEEAAAxhAAAA==\",\"\"]Ag[\"AAAAAAABngcAAA==\",\"\"]No[\"AAAAAZIFAAABnAcAAAHxEgAAAdwPAAAGlgwAAKUQAACNEwAAoRMAAAAUAAApFAAAB+EAAACcAQAA9gwAAC4QAADCEgAAmBMAAJoTAAABCxQAAAAAAAAAAAAAA0kHAAD6DAAAxhIAAA==\",\"AAAAApIFAAA3EAAAAAGgAQAAAcgSAAAGlgwAAKUQAACNEwAAoRMAAAAUAAApFAAABfYMAAAuEAAAwhIAAJgTAACaEwAA\"]Bo[\"AAAAATcQAAAAAaABAAAAApkQAAAoEQAAAAGuDAAA\",\"\"]Nc[\"AAAAAccFAAAAAAE8AQAAOjAAAAEAAAAAAAcAEAAAAKoBlwymEPISjhOiEwEUKhQF9wwAAC8QAADEEgAAmRMAAJsTAAAAAAAAAAAAAAAEVgYAAE0HAAD7DAAAxxIAAA==\",\"AAAAAscFAAA4EAAAAAGvAQAAAckSAAAGlwwAAKYQAACOEwAAohMAAAEUAAAqFAAABfcMAAAvEAAAxBIAAJkTAACbEwAA\"]Bo[\"AAAAATgQAAAAAa8BAAAAAp0QAAAsEQAAAAGwDAAA\",\"\"]Ao[\"AAAAAAAAAAACmBMAAJkTAAA=\",\"\"]Ao[\"AAAAAAAAAAACmhMAAJsTAAA=\",\"\"]Dc[\"AAABLgIAAAGCBQAAAAIUAAAApgcAAALIAAAAyQAAAA==\",\"AAABMgIAAAGCBQAA\"]Bk[\"AAAAAcIBAAAAAATDAAAAEQYAAJkMAABvEgAA\",\"\"]Ec[\"AAAAAksTAABMEwAAAkkTAABKEwAABHUMAAB2DAAAdwwAAHgMAAAEcQwAAHIMAABzDAAAdAwAAA==\",\"\"]Cc[\"AAAAAAAAAAABnhIAAA==\",\"AAEfCAAAAAKbAQAALhMAAA==\"]Cc[\"AAAAAAAAAAABoRIAAA==\",\"AAE0CAAAAAKoAQAALxMAAA==\"]Bc[\"\",\"AAAAAAAAAAAAAAAAAAABbQcAAA==\"]Cg[\"AAAAAZ0PAAAAAAFfAQAAAZcQAAA=\",\"AAFQCAAAAAAAAZcTAAA=\"]Ek[\"AAAAAXoFAAAAAAGyAAAAAAAAAAAAAAAAAAAEKhMAADITAABIEwAAYxMAAA==\",\"AAEgCAAAAAJ6BQAAGQYAAA==\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA9gJAAAsEAAAWBQAAA==\",\"\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA9kJAAAtEAAAWRQAAA==\",\"\"]Bk[\"\",\"AAAAAAAAAAAAAAAAAAAAAAAAArQJAAC2CQAA\"]Ec[\"AAAAAaYFAAAAAacBAAABZwUAAAJ7EQAAvxMAAAEAAQAA\",\"AAEyCAAAAAGmBQAAAAAAAnsRAAC/EwAA\"]Ec[\"AAAAAewFAAAAAbkBAAACgwEAAGsFAAACghEAAMATAAA=\",\"AAFLCAAAAAHsBQAAAAAAAoIRAADAEwAA\"]Ag[\"\",\"AAAAAAABZBIAAA==\"]Co[\"AAAAApEBAABRCAAAAAABWAEAAA==\",\"AAAAAAAAAAAAAAAAAAAAAbEBAAA=\"]Ac[\"\",\"AAAAAAH0EgAA\"]Cg[\"AAAAAAAAAsgSAADJEgAAAAABZxIAAA==\",\"AAAAAAAAAAGcEwAA\"]Do[\"AAAAAbgFAAAAAjkAAACVAAAAAyIBAAAjAQAAFRAAAAExAwAA\",\"AAAAAbgFAAAAAAABPAQAAA==\"]Ak[\"AAAAAAAC6BMAAOkTAAA=\",\"\"]Ac[\"AAAAAcMBAAA=\",\"\"]Ac[\"AAAAAcUBAAA=\",\"\"]Eo[\"AAAC3gIAAPQCAAAB4gUAAAABWAAAAAJyAQAAcwEAAA==\",\"AAAAAeIFAAAAAAAFTwcAAFAHAABRBwAAUgcAAFMHAAA=\"]Fk[\"AAAABKcQAACoEAAAkBMAAJETAAABng8AAAH9EAAAAWUSAAAAAAELFAAAAAAAAAAAAAGnDAAA\",\"AAAAAAAAA24SAABvEgAAcBIAAA==\"]Fc[\"AAAAAAABOwcAAALIEgAAyRIAAAFkEQAAAAFnEgAAAAAC5hMAAOcTAAAAAAABOhMAAA==\",\"AAAAAAAAASAUAAABnBMAAA==\"]Ag[\"\",\"AAAAAAAB9QUAAA==\"]Co[\"AAAAAcAFAAAAAUIAAAACMQEAADIBAAA=\",\"AAAAAcAFAAAAAAAAAAGbDgAA\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAYwHAAA=\",\"\"]Jc[\"AAAAApEFAAAHFAAAAAAAAlsSAAAsEwAABOAAAACcAQAArAwAADcTAAAD3AkAAJITAAALFAAAAAAAAfsQAAA=\",\"AAEtCAAAAAKfAQAAkQUAAAAAAAJbEgAALBMAAAKsDAAANxMAAALcCQAAkhMAAAAAAAH7EAAA\"]Jg[\"AAAAAsYFAAAIFAAAAAABOwEAAAOqAQAAXBIAAC0TAAACrQwAADgTAAAC3QkAAJMTAAAAAAAB/BAAAA==\",\"AAFFCAAAAAKuAQAAxgUAAAFDBwAAAAACXBIAAC0TAAACrQwAADgTAAAC3QkAAJMTAAAAAAAB/BAAAA==\"]Ao[\"AAAAAAAAAbYAAAAAAAE3BAAA\",\"\"]Bc[\"AAAAAAABRgAAAAJDAQAARAEAAA==\",\"\"]Ag[\"AAAChAIAAAkDAAA=\",\"\"]Ak[\"AAAAAAAAAlUEAABzBwAA\",\"\"]Ak[\"AAAAAAAAAlgEAAB2BwAA\",\"\"]Ag[\"AAACggIAAAgDAAA=\",\"\"]Dk[\"AAAAAYAFAAAAAhIAAACkBwAAAsEAAADCAAAA\",\"AAABKgIAAAGABQAAAAAAAAAAAbIPAAA=\"]Dg[\"AAAAAX0FAAAAAg8AAAChBwAAArsAAAC8AAAA\",\"AAABIgIAAAF9BQAAAAAAAAEhEAAA\"]Co[\"AAABaxIAAAG8BQAAAAE+AAAAASoBAAA=\",\"AAE/CAAAAaQJAAABvAUAAA==\"]Ec[\"AAAAAAABbBIAAAGqAAAAAAAAAAAAAAAAAAADTAQAAKEJAAC2DwAA\",\"AAAAAZkBAAAAAAAAAYwTAAA=\"]Hk[\"AAACuAIAANACAAAB2gUAAAABUgAAAAJjAQAAZAEAAAAAAAAAAAAAAAAABPYBAAD8BQAATgcAAIsHAAA=\",\"AAAB5QIAAAKzAQAA2gUAAAAAAqwTAACtEwAAAAACmhEAAJsRAAA=\"]Fc[\"AAAAA5UQAACpEAAAsRIAAAACvRIAAL8SAAADiAEAAKQTAAClEwAAAkUEAAA7DAAAAAAAAAABQAQAAA==\",\"AAAAAboBAAA=\"]Dc[\"AAAAAl8AAAB8BQAAAv0BAABhCQAAAQ4AAAABuAAAAA==\",\"AAAAAnwFAAA2EAAA\"]Eg[\"AAAAAZcFAAAAASEAAAAAAALoAAAA6QAAAAAAAAAAAAAAAAOHBwAAkA8AAJcPAAA=\",\"AAABXQIAAAGXBQAA\"]Eg[\"AAAAAc8FAAAAAUoAAAACSwEAAEwBAAAAAAAAAAAAAAAAAAOJBwAAkg8AAJgPAAA=\",\"AAAB0AIAAAHPBQAA\"]Hk[\"AAAFFwIAACYCAAAnAgAALwIAADICAAABjAUAAAACHQAAAKcHAAAAAALZAAAA2gAAAA==\",\"AAADSwIAAEwCAABNAgAAAowFAAA/BwAAAlQGAACDEAAAAVQTAAAB3A8AAAFsEQAA\"]Ek[\"AAAAAb4FAAAAAkAAAACoBwAAAi0BAAAuAQAA\",\"AAABuAIAAAG+BQAAAAAAAAAAAAAAAAAAAAACcwUAAIwHAAA=\"]Bk[\"AAAAAAABlhAAAAFeAQAA\",\"AAAAAAAAAAGXEAAA\"]Ek[\"AAAAAYkFAAAAAAAAAdUAAAAAAAAAAAAAAAAEsgcAALYHAAClCQAApwkAAA==\",\"AAEmCAAAAAKJBQAAGAYAAA==\"]Ek[\"AAAAAbYFAAAAAAEfAQAAAAAAAAAAAAAAAAAEtAcAALgHAACmCQAAqAkAAA==\",\"AAE9CAAAAAG2BQAAARsGAAA=\"]Ag[\"AAAChwIAAAEDAAA=\",\"\"]Cg[\"AAAAAfIFAAAAAAADog8AAAcQAACrEAAA\",\"AAFPCAAAAAHyBQAA\"]Dc[\"AAAAAtQFAABSCAAAAAABWQEAAA==\",\"AAAAAdQFAAAAAAAAAAAAAAAAAAFYBwAA\"]Dg[\"AAAAATsTAAABORAAAAAAAALbAAAAaBEAAA==\",\"AAGrCQAAAZ4BAAABOxMAAAE5EAAA\"]Dg[\"AAAAATwTAAABOhAAAAABNgEAAAABahEAAA==\",\"AAGsCQAAAa0BAAABPBMAAAE6EAAA\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAZUPAAA=\",\"\"]Ac[\"\",\"AAAAAAEPFAAA\"]Ag[\"AAACfgIAAAUDAAA=\",\"\"]Bc[\"\",\"AAAAAAAAAAADnRIAAJ4SAACfEgAA\"]Bc[\"\",\"AAAAAAAAAAADoBIAAKESAACiEgAA\"]Ak[\"\",\"AAAAAcESAAAAAAHZEwAA\"]ADc[\"AAAAAY0FAAAAAAA6MAAAAQAAAAAAFAAQAAAAaQg6DaMP6g/tDykQIxGdEbERuhImE8cTHhQrFDcUORRbFF8UYhRmFG0UOjAAAAEAAAAAAAwAEAAAANwAsxAfEbISwhLDElcTghOVE0MUVBRWFGQUAAABlhEAAA==\",\"AAEpCAAAAAGNBQAAAAAAOjAAAAEAAAAAABQAEAAAAGkIOg2jD+oP7Q8pECMRnRGxEboSJhPHEx4UKxQ3FDkUWxRfFGIUZhRtFDowAAABAAAAAAAJABAAAACzEB8RshJXE4ITlRNDFFQUVhRkFAAAAZYRAAA=\"]ADc[\"AAAAAcIFAAAAAAE3AQAAOjAAAAEAAAAAABQAEAAAAGoIOw2kD+sP7g8qECQRnhGyEbsSJxPIEx8ULBQ4FDoUXBRgFGMUZxRuFDowAAABAAAAAAALABAAAAC0ECARsxLEEsUSWBODE5YTRBRVFFcUZRQAAAGXEQAA\",\"AAFBCAAAAAHCBQAAAAAAOjAAAAEAAAAAABQAEAAAAGoIOw2kD+sP7g8qECQRnhGyEbsSJxPIEx8ULBQ4FDoUXBRgFGMUZxRuFDowAAABAAAAAAAJABAAAAC0ECARsxJYE4MTlhNEFFUUVxRlFAAAAZcRAAA=\"]Ag[\"AAACWgIAAMoCAAA=\",\"\"]Bk[\"AAAAAAAAAAAAASwEAAA=\",\"AAAAAAAAAY4MAAA=\"]Bk[\"AAAAAAAAAAAAAAGjDAAA\",\"AAAAAAAB4xMAAA==\"]Do[\"AAAAAZgFAAAAASIAAAAAAALqAAAA6wAAAAAAAAAAAAAAAAKIBwAAkQ8AAA==\",\"AAAAAZgFAAA=\"]Do[\"AAAAAdAFAAAAAUsAAAACTQEAAE4BAAAAAAAAAAAAAAAAAAKKBwAAkw8AAA==\",\"AAAAAdAFAAA=\"]Ag[\"AAAChQIAAAQDAAA=\",\"\"]Fc[\"AAAAAdIFAAAAAkwAAACYAAAAAlEBAAAYEAAAAjQDAACXEAAA\",\"AAAAAdIFAAAAAAAAAAAAAAABFwgAAAAAAAABVgYAAA==\"]Ag[\"AAAChgIAAAADAAA=\",\"\"]Ag[\"AAACgwIAAAcDAAA=\",\"\"]Ck[\"AAAAAAAAAAAAAAABKREAAA==\",\"AAAAAcUKAAABxAoAAAABwxAAAA==\"]Co[\"AAAAAbsBAAAAAAAAAAAAAS0RAAA=\",\"AAAAAAExCwAAATILAAABxRAAAA==\"]Dc[\"AAAAAAAAAAKbEAAAKhEAAAABrwwAAA==\",\"AAAAAcgKAAABxwoAAAABxBAAAA==\"]Dg[\"AAAAAbwBAAAAAAACnxAAAC4RAAAAAbEMAAA=\",\"AAAAAAE0CwAAATMLAAABxhAAAA==\"]Cc[\"AAAAAAAAAlYEAAB0BwAAAAH0AAAA\",\"AAEvCAAAAAGjAQAA\"]Cc[\"AAAAAAAAA2kBAABZBAAAdwcAAA==\",\"AAFICAAAAAG1AQAA\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA4YHAABYCAAAdwgAAA==\",\"\"]Bg[\"AAAAAAAAAAAAAAAAAAAAAAAAAZQPAAA=\",\"\"]Ao[\"AAAAAAAAAWQFAAAAAVQUAAA=\",\"\"]Bk[\"AAAAAAAAAWgFAAAAAVUUAAA=\",\"AAAAAWwFAAA=\"]Eg[\"AAAAAAAAAAABAQEAAAAAAAAAAAAAAAPeCQAACBAAAOkSAAA=\",\"AAEzCAAAAARhCAAAYggAAGMIAABkCAAA\"]Eg[\"AAAAAAAAAYQBAAAAAAAAAAAAAAAAAAPfCQAACRAAAOoSAAA=\",\"AAFMCAAAAARlCAAAZggAAGcIAABoCAAA\"]Bc[\"AAAAAAABoAEAAAABYhEAAAH2DAAA\",\"\"]Bc[\"AAAAAAABrwEAAAABYxEAAAH3DAAA\",\"\"]Ak[\"AAAAAAABVRMAAAG7EwAA\",\"\"]Ao[\"AAAAAAABVhMAAAAAAbwTAAA=\",\"\"]Fo[\"AAAAAdcFAAAAAk8AAACZAAAAA1wBAABdAQAAGRAAAAE1AwAA\",\"AAAB3gIAAAHXBQAAAAAAAAIDBgAABAYAAAAAAAAAAAKxAQAAWAcAAA==\"]Dg[\"AAAAAbAFAAAAATMAAAABFwEAAA==\",\"AAAAAbAFAAAAAAAAAAAAAAAAAAAAAAGNBwAA\"]Dg[\"AAAAAXgFAAAAAgwAAACgBwAAAq8AAACwAAAA\",\"AAABFwIAAAF4BQAAAAABIhEAAA==\"]Do[\"AAAAAasFAAAAAi8AAACSAAAAAxABAAARAQAAEhAAAAEuAwAA\",\"AAAAAasFAAAAAAAAAUQEAAA=\"]Ek[\"AAAAAY4FAAAAAAACnRMAAPATAAAD3QAAAAURAACCEwAA\",\"AAEqCAAAAAGOBQAAAAAAAp0TAADwEwAAAQURAAA=\"]Ek[\"AAAAAcMFAAAAAAE4AQAAAp4TAADxEwAAAgYRAACDEwAA\",\"AAFCCAAAAAHDBQAAAAAAAp4TAADxEwAAAQYRAAA=\"]Bo[\"AAAAAAAAAAABAwYAAAAAAAAAAAKxAQAAWAcAAA==\",\"\"]Fg[\"AAAAAY8FAAAAAAAEvgkAADMQAACOEQAAThMAAALeAAAAlRMAAA==\",\"AAErCAAAAAGPBQAAAAAABL4JAAAzEAAAjhEAAE4TAAA=\"]Fg[\"AAAAAcQFAAAAAAE5AQAABL8JAAA0EAAAjxEAAE8TAAABlhMAAA==\",\"AAFDCAAAAAHEBQAAAAAABL8JAAA0EAAAjxEAAE8TAAA=\"]Ag[\"\",\"AAAAAAAAASAUAAA=\"]Bc[\"\",\"AAAAAAAAAAAAAAAAAAAAAAE6EwAA\"]Ag[\"\",\"AAAAAAAAAbMPAAA=\"]Co[\"AAAAAbEFAAAAATQAAAACGAEAABkBAAA=\",\"AAAAAbEFAAAAAAAAAWgSAAA=\"]Fg[\"AAABPAIAAAGcBQAAAAEmAAAAAAFgBwAAAvEAAADyAAAA\",\"AAACYwIAAEcHAAABnAUAAAAAAAFSBwAAAAAAAAAAAAAAAAGQDwAA\"]Gc[\"AAABmgIAAAKzAQAA2wUAAAABUwAAAAJlAQAAZgEAAAFnBwAA\",\"AAAC5gIAAEsHAAAB2wUAAAAAAVkHAAAAAAAAAAAAAAAAAAL2AQAAkg8AAA==\"]Cc[\"AAAAAAAAAAAAAAAAAAAAAAAAA1QIAAB0CAAAZQkAAA==\",\"\"]Cg[\"AAABXwIAAAAAAAAAAQQBAAA=\",\"AAAAAAAAAAKZEAAAmxAAAA==\"]Cg[\"AAAB1wIAAAAAAAF5AQAA\",\"AAAAAAAAAAOdEAAAnxAAAKAQAAA=\"]Bo[\"AAAAAmwFAADxBQAAAfQSAAA=\",\"AAAAAvEFAAC0EQAA\"]Io[\"AAAAAeMFAAAAAVkAAAABdAEAAAYlBgAAKBEAACoRAAAsEQAALhEAADARAAAAAAAFJxEAACkRAAArEQAALREAAC8RAAAAAAAAAAABbBQAAA==\",\"AAAAAeMFAAAAAASpEwAAqhMAAKwTAACtEwAAAAE9BAAA\"]Co[\"AAAAAmEAAABgCAAAAAABugAAAAJSBAAAoREAAAGxDwAA\",\"AAABgxEAAA==\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAArMJAACNEAAA\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAArUJAACPEAAA\",\"\"]Co[\"AAAAAacFAAAAAAAAAgUBAAAGAQAA\",\"AAAAAacFAAAAAALDEAAAxBAAAA==\"]Dc[\"AAAAAeUFAAAAAAJ6AQAAewEAAA==\",\"AAAAAuUFAACjEgAAAAACxRAAAMYQAAA=\"]Ac[\"\",\"AAABeQwAAA==\"]Ec[\"AAABWAIAAAGEBQAAAAEWAAAAAAACzQAAAM4AAAA=\",\"AAAAAYQFAAAEsQkAAI4KAACPCgAAkAoAAA==\"]Do[\"AAAByAIAAAGqBQAAAAEtAAAAAg0BAAAOAQAA\",\"AAAAAaoFAAAEsgkAANsKAADcCgAA3QoAAA==\"]Ak[\"\",\"AAAAAAAC6BMAAOkTAAA=\"]Ck[\"AAAAAncFAADICQAAAWAJAAABKxMAAAGuAAAA\",\"AAAAAncFAAA1EAAA\"]Cg[\"AAAAAfcHAAACfxAAAJEQAAAAATwMAAAAAAAAAAAB+xAAAA==\",\"\"]Ck[\"AAAAAfgHAAACgBAAAJIQAAAAAj0MAAA+DAAAAAAAAAAAAfwQAAA=\",\"\"]Bc[\"AAAAAAAAAAAAAAAAAuYTAADnEwAA\",\"\"]Fo[\"AAAAAZMFAAAAAAADRgQAAMkJAAAAFAAAAuIAAACVAQAA\",\"AAEuCAAAAAGTBQAAAAAAAkYEAADJCQAAAZUBAAAAAAAAAAAAAAABxhIAAA==\"]Fo[\"AAAAAcgFAAAAAAE9AQAAA0cEAADKCQAAARQAAAGWAQAA\",\"AAFGCAAAAAHIBQAAAAAAAkcEAADKCQAAAZYBAAAAAAAAAAAAAAABxxIAAA==\"]Ck[\"AAAAAcEFAAAAAAIzAQAANAEAAA==\",\"AAAAAcEFAAAAAAAAAQ4UAAA=\"]Ec[\"AAAAAdUFAAAAAAFaAQAAAAAAAAAAAAAAAAAFkgEAAFMIAABzCAAAZAkAAPgMAAA=\",\"AAAAAdUFAAA=\"]Dg[\"AAAAAAEPFAAAAAGrAAAAAAAAAAAC5hMAAOcTAAAAAAABOhMAAA==\",\"AAABmgEAAA==\"]Ag[\"AAACiQIAAAIDAAA=\",\"\"]Bc[\"\",\"AAAAAAAAAAAAAAAAAuYTAADnEwAA\"]Bk[\"AAAAAAAAAAAAAAABLxEAAA==\",\"AAAAAbsBAAA=\"]Cc[\"AAAAAAAAAAKgEAAAMBEAAAABsgwAAA==\",\"AAAAAbwBAAA=\"]Ag[\"AAACfwIAAAsDAAA=\",\"\"]Dg[\"AAAAAAABKgAAAAAAAQIBAAA=\",\"AAAAAAAAAAAAAAAAAAAAA9oTAADbEwAA3BMAAA==\"]Ck[\"AAAAAAABWwAAAAF3AQAA\",\"AAAAAAAAAAAAAAAAAAAAAt0TAADeEwAA\"]Ag[\"AAACgAIAAAMDAAA=\",\"\"]Do[\"AAAAAfkHAAACgRAAAJMQAAAAAT8MAAABuxAAAA==\",\"AAKsAQAANQgAAAGtCQAAAAAAAAG7EAAA\"]Ec[\"AAAAAt0FAAD6BwAAAoIQAACUEAAAAAFoAQAAAbwQAAA=\",\"AAFHCAAAAbQBAAAB3QUAAAAAAAG8EAAA\"]Bg[\"AAAAAAAAAAABBAYAAA==\",\"AAABqwEAAA==\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAArQJAACOEAAA\",\"\"]Bk[\"AAAAAAAAAAAAAAAAAAAAAAAAArYJAACQEAAA\",\"\"]")
\ No newline at end of file
diff --git a/pr/427/docs/settings.html b/pr/427/docs/settings.html
index 0e08333cc..1adf3f67d 100644
--- a/pr/427/docs/settings.html
+++ b/pr/427/docs/settings.html
@@ -1 +1 @@
-Settings All
Rustdoc settings
Back
\ No newline at end of file
+Settings All
Rustdoc settings
Back
\ No newline at end of file
diff --git a/pr/427/docs/src/iroh_quinn_proto/connection/mod.rs.html b/pr/427/docs/src/iroh_quinn_proto/connection/mod.rs.html
index 380200b3c..17ab772cc 100644
--- a/pr/427/docs/src/iroh_quinn_proto/connection/mod.rs.html
+++ b/pr/427/docs/src/iroh_quinn_proto/connection/mod.rs.html
@@ -654,7 +654,7 @@
654 Ok(path_id)
655 }
656
-657 /// Closes a path by sending a PATH_ABANDON frame
+657 /// Closes a path and sends a PATH_ABANDON frame with the passed error code.
658 ///
659 /// This will not allow closing the last path. It does allow closing paths which have
660 /// not yet been opened, as e.g. is the case when receiving a PATH_ABANDON from the peer
@@ -672,6589 +672,6593 @@
672 )
673 }
674
-675 fn close_path_inner(
-676 &mut self,
-677 now: Instant,
-678 path_id: PathId,
-679 reason: PathAbandonReason,
-680 ) -> Result<(), ClosePathError> {
-681 if !self.is_multipath_negotiated() {
-682 return Err(ClosePathError::MultipathNotNegotiated);
-683 }
-684 if self.abandoned_paths.contains(&path_id)
-685 || Some(path_id) > self.max_path_id()
-686 || !self.paths.contains_key(&path_id)
-687 {
-688 return Err(ClosePathError::ClosedPath);
-689 }
-690
-691 if reason.is_locally_initiated() {
-692 let has_remaining_validated_paths = self.paths.iter().any(|(id, path)| {
-693 *id != path_id && !self.abandoned_paths.contains(id) && path.data.validated
-694 });
-695 if !has_remaining_validated_paths {
-696 return Err(ClosePathError::LastOpenPath);
-697 }
-698 } else {
-699 // The remote abandoned this path. We should always "accept" this. Doing so right now,
-700 // however, breaks assumptions throughout the code. We error instead, for the
-701 // connection to be killed. See <https://github.com/n0-computer/quinn/issues/397>
-702 let has_remaining_paths = self
-703 .paths
-704 .keys()
-705 .any(|id| *id != path_id && !self.abandoned_paths.contains(id));
-706 if !has_remaining_paths {
-707 return Err(ClosePathError::LastOpenPath);
-708 }
-709 }
-710
-711 // Send PATH_ABANDON
-712 self.spaces[SpaceId::Data]
-713 .pending
-714 .path_abandon
-715 .insert(path_id, reason.error_code());
-716
-717 // Remove pending NEW CIDs for this path
-718 let pending_space = &mut self.spaces[SpaceId::Data].pending;
-719 pending_space.new_cids.retain(|cid| cid.path_id != path_id);
-720 pending_space.path_cids_blocked.retain(|&id| id != path_id);
-721 pending_space.path_status.retain(|&id| id != path_id);
-722
-723 // Cleanup retransmits across ALL paths (CIDs for path_id may have been transmitted on other paths)
-724 for space in self.spaces[SpaceId::Data].iter_paths_mut() {
-725 for sent_packet in space.sent_packets.values_mut() {
-726 if let Some(retransmits) = sent_packet.retransmits.get_mut() {
-727 retransmits.new_cids.retain(|cid| cid.path_id != path_id);
-728 retransmits.path_cids_blocked.retain(|&id| id != path_id);
-729 retransmits.path_status.retain(|&id| id != path_id);
-730 }
-731 }
-732 }
-733
-734 // Consider remotely issued CIDs as retired.
-735 // Technically we don't have to do this just yet. We only need to do this *after*
-736 // the ABANDON_PATH frame is sent, allowing us to still send it on the
-737 // to-be-abandoned path. However it is recommended to send it on another path, and
-738 // we do not allow abandoning the last path anyway.
-739 self.remote_cids.remove(&path_id);
-740 self.endpoint_events
-741 .push_back(EndpointEventInner::RetireResetToken(path_id));
-742
-743 trace!(%path_id, "abandoning path");
-744 self.abandoned_paths.insert(path_id);
-745
-746 self.set_max_path_id(now, self.local_max_path_id.saturating_add(1u8));
-747
-748 // Clear all timers.
-749 // We still need some timers after we close a path, e.g. the `DiscardPath` timer,
-750 // but that timer is going to be set once we the `PATH_ABANDON` frame is sent.
-751 self.timers.stop_per_path(path_id, self.qlog.with_time(now));
-752
-753 // Emit event to the application.
-754 self.events.push_back(Event::Path(PathEvent::Abandoned {
-755 id: path_id,
-756 reason,
-757 }));
-758
-759 Ok(())
-760 }
-761
-762 /// Gets the [`PathData`] for a known [`PathId`].
-763 ///
-764 /// Will panic if the path_id does not reference any known path.
-765 #[track_caller]
-766 fn path_data(&self, path_id: PathId) -> &PathData {
-767 if let Some(data) = self.paths.get(&path_id) {
-768 &data.data
-769 } else {
-770 panic!(
-771 "unknown path: {path_id}, currently known paths: {:?}",
-772 self.paths.keys().collect::<Vec<_>>()
-773 );
-774 }
-775 }
-776
-777 /// Gets a reference to the [`PathData`] for a [`PathId`]
-778 fn path(&self, path_id: PathId) -> Option<&PathData> {
-779 self.paths.get(&path_id).map(|path_state| &path_state.data)
-780 }
-781
-782 /// Gets a mutable reference to the [`PathData`] for a [`PathId`]
-783 fn path_mut(&mut self, path_id: PathId) -> Option<&mut PathData> {
-784 self.paths
-785 .get_mut(&path_id)
-786 .map(|path_state| &mut path_state.data)
-787 }
-788
-789 /// Returns all known paths.
-790 ///
-791 /// There is no guarantee any of these paths are open or usable.
-792 pub fn paths(&self) -> Vec<PathId> {
-793 self.paths.keys().copied().collect()
-794 }
-795
-796 /// Gets the local [`PathStatus`] for a known [`PathId`]
-797 pub fn path_status(&self, path_id: PathId) -> Result<PathStatus, ClosedPath> {
-798 self.path(path_id)
-799 .map(PathData::local_status)
-800 .ok_or(ClosedPath { _private: () })
-801 }
-802
-803 /// Returns the path's network path represented as a 4-tuple.
-804 pub fn network_path(&self, path_id: PathId) -> Result<FourTuple, ClosedPath> {
-805 self.path(path_id)
-806 .map(|path| path.network_path)
-807 .ok_or(ClosedPath { _private: () })
-808 }
-809
-810 /// Sets the [`PathStatus`] for a known [`PathId`]
-811 ///
-812 /// Returns the previous path status on success.
-813 pub fn set_path_status(
-814 &mut self,
-815 path_id: PathId,
-816 status: PathStatus,
-817 ) -> Result<PathStatus, SetPathStatusError> {
-818 if !self.is_multipath_negotiated() {
-819 return Err(SetPathStatusError::MultipathNotNegotiated);
-820 }
-821 let path = self
-822 .path_mut(path_id)
-823 .ok_or(SetPathStatusError::ClosedPath)?;
-824 let prev = match path.status.local_update(status) {
-825 Some(prev) => {
-826 self.spaces[SpaceId::Data]
-827 .pending
-828 .path_status
-829 .insert(path_id);
-830 prev
-831 }
-832 None => path.local_status(),
-833 };
-834 Ok(prev)
-835 }
-836
-837 /// Returns the remote path status
-838 // TODO(flub): Probably should also be some kind of path event? Not even sure if I like
-839 // this as an API, but for now it allows me to write a test easily.
-840 // TODO(flub): Technically this should be a Result<Option<PathSTatus>>?
-841 pub fn remote_path_status(&self, path_id: PathId) -> Option<PathStatus> {
-842 self.path(path_id).and_then(|path| path.remote_status())
-843 }
-844
-845 /// Sets the max_idle_timeout for a specific path
-846 ///
-847 /// See [`TransportConfig::default_path_max_idle_timeout`] for details.
-848 ///
-849 /// Returns the previous value of the setting.
-850 pub fn set_path_max_idle_timeout(
-851 &mut self,
-852 path_id: PathId,
-853 timeout: Option<Duration>,
-854 ) -> Result<Option<Duration>, ClosedPath> {
-855 let path = self
-856 .paths
-857 .get_mut(&path_id)
-858 .ok_or(ClosedPath { _private: () })?;
-859 Ok(std::mem::replace(&mut path.data.idle_timeout, timeout))
-860 }
-861
-862 /// Sets the keep_alive_interval for a specific path
-863 ///
-864 /// See [`TransportConfig::default_path_keep_alive_interval`] for details.
-865 ///
-866 /// Returns the previous value of the setting.
-867 pub fn set_path_keep_alive_interval(
-868 &mut self,
-869 path_id: PathId,
-870 interval: Option<Duration>,
-871 ) -> Result<Option<Duration>, ClosedPath> {
-872 let path = self
-873 .paths
-874 .get_mut(&path_id)
-875 .ok_or(ClosedPath { _private: () })?;
-876 Ok(std::mem::replace(&mut path.data.keep_alive, interval))
-877 }
-878
-879 /// Gets the [`PathData`] for a known [`PathId`].
-880 ///
-881 /// Will panic if the path_id does not reference any known path.
-882 #[track_caller]
-883 fn path_data_mut(&mut self, path_id: PathId) -> &mut PathData {
-884 &mut self.paths.get_mut(&path_id).expect("known path").data
-885 }
-886
-887 /// Find an open, validated path that's on the same network path as the given network path.
-888 ///
-889 /// Returns the first path matching, even if there's multiple.
-890 fn find_validated_path_on_network_path(
-891 &self,
-892 network_path: FourTuple,
-893 ) -> Option<(&PathId, &PathState)> {
-894 self.paths.iter().find(|(path_id, path_state)| {
-895 path_state.data.validated
-896 // Would this use the same network path, if network_path were used to send right now?
-897 && network_path.is_probably_same_path(&path_state.data.network_path)
-898 && !self.abandoned_paths.contains(path_id)
-899 })
-900 // TODO(@divma): we might want to ensure the path has been recently active to consider the
-901 // address validated
-902 // matheus23: Perhaps looking at !self.abandoned_paths.contains(path_id) is enough, given keep-alives?
-903 }
-904
-905 /// Creates the [`PathData`] for a new [`PathId`].
-906 ///
-907 /// Called for incoming packets as well as when opening a new path locally.
-908 fn ensure_path(
-909 &mut self,
-910 path_id: PathId,
-911 network_path: FourTuple,
-912 now: Instant,
-913 pn: Option<u64>,
-914 ) -> &mut PathData {
-915 let valid_path = self.find_validated_path_on_network_path(network_path);
-916 let validated = valid_path.is_some();
-917 let initial_rtt = valid_path.map(|(_, path)| path.data.rtt.conservative());
-918 let vacant_entry = match self.paths.entry(path_id) {
-919 btree_map::Entry::Vacant(vacant_entry) => vacant_entry,
-920 btree_map::Entry::Occupied(occupied_entry) => {
-921 return &mut occupied_entry.into_mut().data;
-922 }
-923 };
-924
-925 debug!(%validated, %path_id, %network_path, "path added");
-926 let peer_max_udp_payload_size =
-927 u16::try_from(self.peer_params.max_udp_payload_size.into_inner()).unwrap_or(u16::MAX);
-928 self.path_generation_counter = self.path_generation_counter.wrapping_add(1);
-929 let mut data = PathData::new(
-930 network_path,
-931 self.allow_mtud,
-932 Some(peer_max_udp_payload_size),
-933 self.path_generation_counter,
-934 now,
-935 &self.config,
-936 );
-937
-938 data.validated = validated;
-939 if let Some(initial_rtt) = initial_rtt {
-940 data.rtt.reset_initial_rtt(initial_rtt);
-941 }
-942
-943 let pto = self.ack_frequency.max_ack_delay_for_pto() + data.rtt.pto_base();
-944 self.timers.set(
-945 Timer::PerPath(path_id, PathTimer::PathOpen),
-946 now + 3 * pto,
-947 self.qlog.with_time(now),
-948 );
-949
-950 // To open a path locally we need to send a packet on the path. Sending a challenge
-951 // guarantees this.
-952 data.send_new_challenge = true;
+675 /// Closes a path and sends a PATH_ABANDON frame.
+676 ///
+677 /// Other than [`Self::close_path`] this allows to specify the reason for the path being closed.
+678 /// Internally, this should be used over [`Self::close_path`].
+679 fn close_path_inner(
+680 &mut self,
+681 now: Instant,
+682 path_id: PathId,
+683 reason: PathAbandonReason,
+684 ) -> Result<(), ClosePathError> {
+685 if !self.is_multipath_negotiated() {
+686 return Err(ClosePathError::MultipathNotNegotiated);
+687 }
+688 if self.abandoned_paths.contains(&path_id)
+689 || Some(path_id) > self.max_path_id()
+690 || !self.paths.contains_key(&path_id)
+691 {
+692 return Err(ClosePathError::ClosedPath);
+693 }
+694
+695 if reason.is_locally_initiated() {
+696 let has_remaining_validated_paths = self.paths.iter().any(|(id, path)| {
+697 *id != path_id && !self.abandoned_paths.contains(id) && path.data.validated
+698 });
+699 if !has_remaining_validated_paths {
+700 return Err(ClosePathError::LastOpenPath);
+701 }
+702 } else {
+703 // The remote abandoned this path. We should always "accept" this. Doing so right now,
+704 // however, breaks assumptions throughout the code. We error instead, for the
+705 // connection to be killed. See <https://github.com/n0-computer/quinn/issues/397>
+706 let has_remaining_paths = self
+707 .paths
+708 .keys()
+709 .any(|id| *id != path_id && !self.abandoned_paths.contains(id));
+710 if !has_remaining_paths {
+711 return Err(ClosePathError::LastOpenPath);
+712 }
+713 }
+714
+715 // Send PATH_ABANDON
+716 self.spaces[SpaceId::Data]
+717 .pending
+718 .path_abandon
+719 .insert(path_id, reason.error_code());
+720
+721 // Remove pending NEW CIDs for this path
+722 let pending_space = &mut self.spaces[SpaceId::Data].pending;
+723 pending_space.new_cids.retain(|cid| cid.path_id != path_id);
+724 pending_space.path_cids_blocked.retain(|&id| id != path_id);
+725 pending_space.path_status.retain(|&id| id != path_id);
+726
+727 // Cleanup retransmits across ALL paths (CIDs for path_id may have been transmitted on other paths)
+728 for space in self.spaces[SpaceId::Data].iter_paths_mut() {
+729 for sent_packet in space.sent_packets.values_mut() {
+730 if let Some(retransmits) = sent_packet.retransmits.get_mut() {
+731 retransmits.new_cids.retain(|cid| cid.path_id != path_id);
+732 retransmits.path_cids_blocked.retain(|&id| id != path_id);
+733 retransmits.path_status.retain(|&id| id != path_id);
+734 }
+735 }
+736 }
+737
+738 // Consider remotely issued CIDs as retired.
+739 // Technically we don't have to do this just yet. We only need to do this *after*
+740 // the ABANDON_PATH frame is sent, allowing us to still send it on the
+741 // to-be-abandoned path. However it is recommended to send it on another path, and
+742 // we do not allow abandoning the last path anyway.
+743 self.remote_cids.remove(&path_id);
+744 self.endpoint_events
+745 .push_back(EndpointEventInner::RetireResetToken(path_id));
+746
+747 trace!(%path_id, "abandoning path");
+748 self.abandoned_paths.insert(path_id);
+749
+750 self.set_max_path_id(now, self.local_max_path_id.saturating_add(1u8));
+751
+752 // Clear all timers.
+753 // We still need some timers after we close a path, e.g. the `DiscardPath` timer,
+754 // but that timer is going to be set once we the `PATH_ABANDON` frame is sent.
+755 self.timers.stop_per_path(path_id, self.qlog.with_time(now));
+756
+757 // Emit event to the application.
+758 self.events.push_back(Event::Path(PathEvent::Abandoned {
+759 id: path_id,
+760 reason,
+761 }));
+762
+763 Ok(())
+764 }
+765
+766 /// Gets the [`PathData`] for a known [`PathId`].
+767 ///
+768 /// Will panic if the path_id does not reference any known path.
+769 #[track_caller]
+770 fn path_data(&self, path_id: PathId) -> &PathData {
+771 if let Some(data) = self.paths.get(&path_id) {
+772 &data.data
+773 } else {
+774 panic!(
+775 "unknown path: {path_id}, currently known paths: {:?}",
+776 self.paths.keys().collect::<Vec<_>>()
+777 );
+778 }
+779 }
+780
+781 /// Gets a reference to the [`PathData`] for a [`PathId`]
+782 fn path(&self, path_id: PathId) -> Option<&PathData> {
+783 self.paths.get(&path_id).map(|path_state| &path_state.data)
+784 }
+785
+786 /// Gets a mutable reference to the [`PathData`] for a [`PathId`]
+787 fn path_mut(&mut self, path_id: PathId) -> Option<&mut PathData> {
+788 self.paths
+789 .get_mut(&path_id)
+790 .map(|path_state| &mut path_state.data)
+791 }
+792
+793 /// Returns all known paths.
+794 ///
+795 /// There is no guarantee any of these paths are open or usable.
+796 pub fn paths(&self) -> Vec<PathId> {
+797 self.paths.keys().copied().collect()
+798 }
+799
+800 /// Gets the local [`PathStatus`] for a known [`PathId`]
+801 pub fn path_status(&self, path_id: PathId) -> Result<PathStatus, ClosedPath> {
+802 self.path(path_id)
+803 .map(PathData::local_status)
+804 .ok_or(ClosedPath { _private: () })
+805 }
+806
+807 /// Returns the path's network path represented as a 4-tuple.
+808 pub fn network_path(&self, path_id: PathId) -> Result<FourTuple, ClosedPath> {
+809 self.path(path_id)
+810 .map(|path| path.network_path)
+811 .ok_or(ClosedPath { _private: () })
+812 }
+813
+814 /// Sets the [`PathStatus`] for a known [`PathId`]
+815 ///
+816 /// Returns the previous path status on success.
+817 pub fn set_path_status(
+818 &mut self,
+819 path_id: PathId,
+820 status: PathStatus,
+821 ) -> Result<PathStatus, SetPathStatusError> {
+822 if !self.is_multipath_negotiated() {
+823 return Err(SetPathStatusError::MultipathNotNegotiated);
+824 }
+825 let path = self
+826 .path_mut(path_id)
+827 .ok_or(SetPathStatusError::ClosedPath)?;
+828 let prev = match path.status.local_update(status) {
+829 Some(prev) => {
+830 self.spaces[SpaceId::Data]
+831 .pending
+832 .path_status
+833 .insert(path_id);
+834 prev
+835 }
+836 None => path.local_status(),
+837 };
+838 Ok(prev)
+839 }
+840
+841 /// Returns the remote path status
+842 // TODO(flub): Probably should also be some kind of path event? Not even sure if I like
+843 // this as an API, but for now it allows me to write a test easily.
+844 // TODO(flub): Technically this should be a Result<Option<PathSTatus>>?
+845 pub fn remote_path_status(&self, path_id: PathId) -> Option<PathStatus> {
+846 self.path(path_id).and_then(|path| path.remote_status())
+847 }
+848
+849 /// Sets the max_idle_timeout for a specific path
+850 ///
+851 /// See [`TransportConfig::default_path_max_idle_timeout`] for details.
+852 ///
+853 /// Returns the previous value of the setting.
+854 pub fn set_path_max_idle_timeout(
+855 &mut self,
+856 path_id: PathId,
+857 timeout: Option<Duration>,
+858 ) -> Result<Option<Duration>, ClosedPath> {
+859 let path = self
+860 .paths
+861 .get_mut(&path_id)
+862 .ok_or(ClosedPath { _private: () })?;
+863 Ok(std::mem::replace(&mut path.data.idle_timeout, timeout))
+864 }
+865
+866 /// Sets the keep_alive_interval for a specific path
+867 ///
+868 /// See [`TransportConfig::default_path_keep_alive_interval`] for details.
+869 ///
+870 /// Returns the previous value of the setting.
+871 pub fn set_path_keep_alive_interval(
+872 &mut self,
+873 path_id: PathId,
+874 interval: Option<Duration>,
+875 ) -> Result<Option<Duration>, ClosedPath> {
+876 let path = self
+877 .paths
+878 .get_mut(&path_id)
+879 .ok_or(ClosedPath { _private: () })?;
+880 Ok(std::mem::replace(&mut path.data.keep_alive, interval))
+881 }
+882
+883 /// Gets the [`PathData`] for a known [`PathId`].
+884 ///
+885 /// Will panic if the path_id does not reference any known path.
+886 #[track_caller]
+887 fn path_data_mut(&mut self, path_id: PathId) -> &mut PathData {
+888 &mut self.paths.get_mut(&path_id).expect("known path").data
+889 }
+890
+891 /// Find an open, validated path that's on the same network path as the given network path.
+892 ///
+893 /// Returns the first path matching, even if there's multiple.
+894 fn find_validated_path_on_network_path(
+895 &self,
+896 network_path: FourTuple,
+897 ) -> Option<(&PathId, &PathState)> {
+898 self.paths.iter().find(|(path_id, path_state)| {
+899 path_state.data.validated
+900 // Would this use the same network path, if network_path were used to send right now?
+901 && network_path.is_probably_same_path(&path_state.data.network_path)
+902 && !self.abandoned_paths.contains(path_id)
+903 })
+904 // TODO(@divma): we might want to ensure the path has been recently active to consider the
+905 // address validated
+906 // matheus23: Perhaps looking at !self.abandoned_paths.contains(path_id) is enough, given keep-alives?
+907 }
+908
+909 /// Creates the [`PathData`] for a new [`PathId`].
+910 ///
+911 /// Called for incoming packets as well as when opening a new path locally.
+912 fn ensure_path(
+913 &mut self,
+914 path_id: PathId,
+915 network_path: FourTuple,
+916 now: Instant,
+917 pn: Option<u64>,
+918 ) -> &mut PathData {
+919 let valid_path = self.find_validated_path_on_network_path(network_path);
+920 let validated = valid_path.is_some();
+921 let initial_rtt = valid_path.map(|(_, path)| path.data.rtt.conservative());
+922 let vacant_entry = match self.paths.entry(path_id) {
+923 btree_map::Entry::Vacant(vacant_entry) => vacant_entry,
+924 btree_map::Entry::Occupied(occupied_entry) => {
+925 return &mut occupied_entry.into_mut().data;
+926 }
+927 };
+928
+929 debug!(%validated, %path_id, %network_path, "path added");
+930 let peer_max_udp_payload_size =
+931 u16::try_from(self.peer_params.max_udp_payload_size.into_inner()).unwrap_or(u16::MAX);
+932 self.path_generation_counter = self.path_generation_counter.wrapping_add(1);
+933 let mut data = PathData::new(
+934 network_path,
+935 self.allow_mtud,
+936 Some(peer_max_udp_payload_size),
+937 self.path_generation_counter,
+938 now,
+939 &self.config,
+940 );
+941
+942 data.validated = validated;
+943 if let Some(initial_rtt) = initial_rtt {
+944 data.rtt.reset_initial_rtt(initial_rtt);
+945 }
+946
+947 let pto = self.ack_frequency.max_ack_delay_for_pto() + data.rtt.pto_base();
+948 self.timers.set(
+949 Timer::PerPath(path_id, PathTimer::PathOpen),
+950 now + 3 * pto,
+951 self.qlog.with_time(now),
+952 );
953
-954 let path = vacant_entry.insert(PathState { data, prev: None });
-955
-956 let mut pn_space = spaces::PacketNumberSpace::new(now, SpaceId::Data, &mut self.rng);
-957 if let Some(pn) = pn {
-958 pn_space.dedup.insert(pn);
-959 }
-960 self.spaces[SpaceId::Data]
-961 .number_spaces
-962 .insert(path_id, pn_space);
-963 self.qlog.emit_tuple_assigned(path_id, network_path, now);
-964
-965 // If the remote opened this path we may not have CIDs for it. For locally opened
-966 // paths the caller should have already made sure we have CIDs and refused to open
-967 // it if there were none.
-968 if !self.remote_cids.contains_key(&path_id) {
-969 debug!(%path_id, "Remote opened path without issuing CIDs");
-970 self.spaces[SpaceId::Data]
-971 .pending
-972 .path_cids_blocked
-973 .insert(path_id);
-974 // Do not abandon this path right away. CIDs might be in-flight still and arrive
-975 // soon. It is up to the remote to handle this situation.
-976 }
-977
-978 &mut path.data
-979 }
-980
-981 /// Returns packets to transmit
-982 ///
-983 /// Connections should be polled for transmit after:
-984 /// - the application performed some I/O on the connection
-985 /// - a call was made to `handle_event`
-986 /// - a call was made to `handle_timeout`
-987 ///
-988 /// `max_datagrams` specifies how many datagrams can be returned inside a
-989 /// single Transmit using GSO. This must be at least 1.
-990 #[must_use]
-991 pub fn poll_transmit(
-992 &mut self,
-993 now: Instant,
-994 max_datagrams: NonZeroUsize,
-995 buf: &mut Vec<u8>,
-996 ) -> Option<Transmit> {
-997 let max_datagrams = match self.config.enable_segmentation_offload {
-998 false => NonZeroUsize::MIN,
-999 true => max_datagrams,
-1000 };
-1001
-1002 // Each call to poll_transmit can only send datagrams to one destination, because
-1003 // all datagrams in a GSO batch are for the same destination. Therefore only
-1004 // datagrams for one destination address are produced for each poll_transmit call.
+954 // To open a path locally we need to send a packet on the path. Sending a challenge
+955 // guarantees this.
+956 data.send_new_challenge = true;
+957
+958 let path = vacant_entry.insert(PathState { data, prev: None });
+959
+960 let mut pn_space = spaces::PacketNumberSpace::new(now, SpaceId::Data, &mut self.rng);
+961 if let Some(pn) = pn {
+962 pn_space.dedup.insert(pn);
+963 }
+964 self.spaces[SpaceId::Data]
+965 .number_spaces
+966 .insert(path_id, pn_space);
+967 self.qlog.emit_tuple_assigned(path_id, network_path, now);
+968
+969 // If the remote opened this path we may not have CIDs for it. For locally opened
+970 // paths the caller should have already made sure we have CIDs and refused to open
+971 // it if there were none.
+972 if !self.remote_cids.contains_key(&path_id) {
+973 debug!(%path_id, "Remote opened path without issuing CIDs");
+974 self.spaces[SpaceId::Data]
+975 .pending
+976 .path_cids_blocked
+977 .insert(path_id);
+978 // Do not abandon this path right away. CIDs might be in-flight still and arrive
+979 // soon. It is up to the remote to handle this situation.
+980 }
+981
+982 &mut path.data
+983 }
+984
+985 /// Returns packets to transmit
+986 ///
+987 /// Connections should be polled for transmit after:
+988 /// - the application performed some I/O on the connection
+989 /// - a call was made to `handle_event`
+990 /// - a call was made to `handle_timeout`
+991 ///
+992 /// `max_datagrams` specifies how many datagrams can be returned inside a
+993 /// single Transmit using GSO. This must be at least 1.
+994 #[must_use]
+995 pub fn poll_transmit(
+996 &mut self,
+997 now: Instant,
+998 max_datagrams: NonZeroUsize,
+999 buf: &mut Vec<u8>,
+1000 ) -> Option<Transmit> {
+1001 let max_datagrams = match self.config.enable_segmentation_offload {
+1002 false => NonZeroUsize::MIN,
+1003 true => max_datagrams,
+1004 };
1005
-1006 // Check whether we need to send a close message
-1007 let connection_close_pending = match self.state.as_type() {
-1008 StateType::Drained => {
-1009 self.app_limited = true;
-1010 return None;
-1011 }
-1012 StateType::Draining | StateType::Closed => {
-1013 // self.close is only reset once the associated packet had been
-1014 // encoded successfully
-1015 if !self.connection_close_pending {
-1016 self.app_limited = true;
-1017 return None;
-1018 }
-1019 true
-1020 }
-1021 _ => false,
-1022 };
-1023
-1024 // Schedule an ACK_FREQUENCY frame if a new one needs to be sent.
-1025 if let Some(config) = &self.config.ack_frequency_config {
-1026 let rtt = self
-1027 .paths
-1028 .values()
-1029 .map(|p| p.data.rtt.get())
-1030 .min()
-1031 .expect("one path exists");
-1032 self.spaces[SpaceId::Data].pending.ack_frequency = self
-1033 .ack_frequency
-1034 .should_send_ack_frequency(rtt, config, &self.peer_params)
-1035 && self.highest_space == SpaceId::Data
-1036 && self.peer_supports_ack_frequency();
-1037 }
-1038
-1039 // TODO(flub): path scheduling logic might be buggy if there are only un-validated
-1040 // paths and PATH_STATUS_BACKUP paths.
-1041
-1042 // Path scheduling logic is currently as such:
-1043 //
-1044 // - For any un-validated paths we only send frames that *must* be sent on that
-1045 // path. E.g. PATH_CHALLENGE, PATH_RESPONSE.
-1046 //
-1047 // - If there are any validated paths with CIDs and PathStatus::Available:
-1048 // - Frames that can be sent on any path, e.g. STREAM, DATAGRAM, are only sent on
-1049 // these available paths.
-1050 // - All other paths only send frames that *must* be sent on those paths,
-1051 // e.g. PATH_CHALLENGE, PATH_RESPONSE, tail-loss probes, keep alive PING.
-1052 //
-1053 // - If there are no validated paths with CIDs and PathStatus::Available all frames
-1054 // are sent on the earlierst possible path.
-1055 //
-1056 // For all this we use the *path_exclusive_only* boolean: If set to true, only
-1057 // frames that must be sent on the path will be built into the packet.
-1058
-1059 // Is there any open, validated and status available path with dst CIDs? If so we'll
-1060 // want to set path_exclusive_only for any other paths.
-1061 let have_available_path = self.paths.iter().any(|(id, path)| {
-1062 path.data.validated
-1063 && path.data.local_status() == PathStatus::Available
-1064 && self.remote_cids.contains_key(id)
-1065 });
-1066
-1067 // TODO: how to avoid the allocation? Cannot use a for loop because of
-1068 // borrowing. Maybe SmallVec or similar.
-1069 let path_ids: Vec<_> = self.paths.keys().copied().collect();
+1006 // Each call to poll_transmit can only send datagrams to one destination, because
+1007 // all datagrams in a GSO batch are for the same destination. Therefore only
+1008 // datagrams for one destination address are produced for each poll_transmit call.
+1009
+1010 // Check whether we need to send a close message
+1011 let connection_close_pending = match self.state.as_type() {
+1012 StateType::Drained => {
+1013 self.app_limited = true;
+1014 return None;
+1015 }
+1016 StateType::Draining | StateType::Closed => {
+1017 // self.close is only reset once the associated packet had been
+1018 // encoded successfully
+1019 if !self.connection_close_pending {
+1020 self.app_limited = true;
+1021 return None;
+1022 }
+1023 true
+1024 }
+1025 _ => false,
+1026 };
+1027
+1028 // Schedule an ACK_FREQUENCY frame if a new one needs to be sent.
+1029 if let Some(config) = &self.config.ack_frequency_config {
+1030 let rtt = self
+1031 .paths
+1032 .values()
+1033 .map(|p| p.data.rtt.get())
+1034 .min()
+1035 .expect("one path exists");
+1036 self.spaces[SpaceId::Data].pending.ack_frequency = self
+1037 .ack_frequency
+1038 .should_send_ack_frequency(rtt, config, &self.peer_params)
+1039 && self.highest_space == SpaceId::Data
+1040 && self.peer_supports_ack_frequency();
+1041 }
+1042
+1043 // TODO(flub): path scheduling logic might be buggy if there are only un-validated
+1044 // paths and PATH_STATUS_BACKUP paths.
+1045
+1046 // Path scheduling logic is currently as such:
+1047 //
+1048 // - For any un-validated paths we only send frames that *must* be sent on that
+1049 // path. E.g. PATH_CHALLENGE, PATH_RESPONSE.
+1050 //
+1051 // - If there are any validated paths with CIDs and PathStatus::Available:
+1052 // - Frames that can be sent on any path, e.g. STREAM, DATAGRAM, are only sent on
+1053 // these available paths.
+1054 // - All other paths only send frames that *must* be sent on those paths,
+1055 // e.g. PATH_CHALLENGE, PATH_RESPONSE, tail-loss probes, keep alive PING.
+1056 //
+1057 // - If there are no validated paths with CIDs and PathStatus::Available all frames
+1058 // are sent on the earlierst possible path.
+1059 //
+1060 // For all this we use the *path_exclusive_only* boolean: If set to true, only
+1061 // frames that must be sent on the path will be built into the packet.
+1062
+1063 // Is there any open, validated and status available path with dst CIDs? If so we'll
+1064 // want to set path_exclusive_only for any other paths.
+1065 let have_available_path = self.paths.iter().any(|(id, path)| {
+1066 path.data.validated
+1067 && path.data.local_status() == PathStatus::Available
+1068 && self.remote_cids.contains_key(id)
+1069 });
1070
-1071 // If we end up not sending anything, we need to know if that was because there was
-1072 // nothing to send or because we were congestion blocked.
-1073 let mut congestion_blocked = false;
+1071 // TODO: how to avoid the allocation? Cannot use a for loop because of
+1072 // borrowing. Maybe SmallVec or similar.
+1073 let path_ids: Vec<_> = self.paths.keys().copied().collect();
1074
-1075 for &path_id in &path_ids {
-1076 if !connection_close_pending
-1077 && let Some(transmit) = self.poll_transmit_off_path(now, buf, path_id)
-1078 {
-1079 return Some(transmit);
-1080 }
-1081
-1082 // Poll for on-path transmits.
-1083 match self.poll_transmit_on_path(
-1084 now,
-1085 buf,
-1086 path_id,
-1087 max_datagrams,
-1088 have_available_path,
-1089 connection_close_pending,
-1090 ) {
-1091 PollPathStatus::Send(transmit) => {
-1092 return Some(transmit);
-1093 }
-1094 PollPathStatus::NothingToSend {
-1095 congestion_blocked: cb,
-1096 } => {
-1097 congestion_blocked |= cb;
-1098 // Continue checking other paths, tail-loss probes may need to be sent
-1099 // in all spaces.
-1100 debug_assert!(
-1101 buf.is_empty(),
-1102 "nothing to send on path but buffer not empty"
-1103 );
-1104 }
-1105 }
-1106 }
-1107
-1108 // We didn't produce any application data packet
-1109 debug_assert!(
-1110 buf.is_empty(),
-1111 "there was data in the buffer, but it was not sent"
-1112 );
-1113
-1114 self.app_limited = !congestion_blocked;
-1115
-1116 if self.state.is_established() {
-1117 // Try MTU probing now
-1118 for path_id in path_ids {
-1119 if let Some(transmit) = self.poll_transmit_mtu_probe(now, buf, path_id) {
-1120 return Some(transmit);
-1121 }
-1122 }
-1123 }
-1124
-1125 None
-1126 }
-1127
-1128 fn build_transmit(&mut self, path_id: PathId, transmit: TransmitBuf<'_>) -> Transmit {
-1129 debug_assert!(
-1130 !transmit.is_empty(),
-1131 "must not be called with an empty transmit buffer"
-1132 );
-1133
-1134 let network_path = self.path_data(path_id).network_path;
-1135 trace!(
-1136 segment_size = transmit.segment_size(),
-1137 last_datagram_len = transmit.len() % transmit.segment_size(),
-1138 %network_path,
-1139 "sending {} bytes in {} datagrams",
-1140 transmit.len(),
-1141 transmit.num_datagrams()
-1142 );
-1143 self.path_data_mut(path_id)
-1144 .inc_total_sent(transmit.len() as u64);
-1145
-1146 self.stats
-1147 .udp_tx
-1148 .on_sent(transmit.num_datagrams() as u64, transmit.len());
-1149 self.path_stats
-1150 .entry(path_id)
-1151 .or_default()
-1152 .udp_tx
-1153 .on_sent(transmit.num_datagrams() as u64, transmit.len());
-1154
-1155 Transmit {
-1156 destination: network_path.remote,
-1157 size: transmit.len(),
-1158 ecn: if self.path_data(path_id).sending_ecn {
-1159 Some(EcnCodepoint::Ect0)
-1160 } else {
-1161 None
-1162 },
-1163 segment_size: match transmit.num_datagrams() {
-1164 1 => None,
-1165 _ => Some(transmit.segment_size()),
-1166 },
-1167 src_ip: network_path.local_ip,
-1168 }
-1169 }
-1170
-1171 /// poll_transmit logic for off-path data.
-1172 fn poll_transmit_off_path(
-1173 &mut self,
-1174 now: Instant,
-1175 buf: &mut Vec<u8>,
-1176 path_id: PathId,
-1177 ) -> Option<Transmit> {
-1178 if let Some(challenge) = self.send_prev_path_challenge(now, buf, path_id) {
-1179 return Some(challenge);
-1180 }
-1181 if let Some(response) = self.send_off_path_path_response(now, buf, path_id) {
-1182 return Some(response);
-1183 }
-1184 if let Some(challenge) = self.send_nat_traversal_path_challenge(now, buf, path_id) {
-1185 return Some(challenge);
-1186 }
-1187 None
-1188 }
-1189
-1190 /// poll_transmit logic for on-path data.
-1191 ///
-1192 /// This is not quite the same as for a multipath packet space, since [`PathId::ZERO`]
-1193 /// has 3 packet spaces, which this handles.
-1194 ///
-1195 /// See [`Self::poll_transmit_off_path`] for off-path data.
-1196 #[must_use]
-1197 fn poll_transmit_on_path(
-1198 &mut self,
-1199 now: Instant,
-1200 buf: &mut Vec<u8>,
-1201 path_id: PathId,
-1202 max_datagrams: NonZeroUsize,
-1203 have_available_path: bool,
-1204 connection_close_pending: bool,
-1205 ) -> PollPathStatus {
-1206 // Check if there is at least one active CID to use for sending
-1207 let Some(remote_cid) = self.remote_cids.get(&path_id).map(CidQueue::active) else {
-1208 if !self.abandoned_paths.contains(&path_id) {
-1209 debug!(%path_id, "no remote CIDs for path");
-1210 }
-1211 return PollPathStatus::NothingToSend {
-1212 congestion_blocked: false,
-1213 };
-1214 };
-1215
-1216 // Whether the last packet in the datagram must be padded so the datagram takes up
-1217 // an exact size. An earlier space can decide to not fill an entire datagram and
-1218 // require the next space to fill it further. But may need a specific size of the
-1219 // datagram containing the packet. The final packet built in the datagram must pad
-1220 // to this size.
-1221 let mut pad_datagram = PadDatagram::No;
-1222
-1223 // The packet number of the last built packet. This is kept kept across spaces.
-1224 // QUIC is supposed to have a single congestion controller for the Initial,
-1225 // Handshake and Data(PathId::ZERO) spaces.
-1226 let mut last_packet_number = None;
-1227
-1228 // If we end up not sending anything, we need to know if that was because there was
-1229 // nothing to send or because we were congestion blocked.
-1230 let mut congestion_blocked = false;
+1075 // If we end up not sending anything, we need to know if that was because there was
+1076 // nothing to send or because we were congestion blocked.
+1077 let mut congestion_blocked = false;
+1078
+1079 for &path_id in &path_ids {
+1080 if !connection_close_pending
+1081 && let Some(transmit) = self.poll_transmit_off_path(now, buf, path_id)
+1082 {
+1083 return Some(transmit);
+1084 }
+1085
+1086 // Poll for on-path transmits.
+1087 match self.poll_transmit_on_path(
+1088 now,
+1089 buf,
+1090 path_id,
+1091 max_datagrams,
+1092 have_available_path,
+1093 connection_close_pending,
+1094 ) {
+1095 PollPathStatus::Send(transmit) => {
+1096 return Some(transmit);
+1097 }
+1098 PollPathStatus::NothingToSend {
+1099 congestion_blocked: cb,
+1100 } => {
+1101 congestion_blocked |= cb;
+1102 // Continue checking other paths, tail-loss probes may need to be sent
+1103 // in all spaces.
+1104 debug_assert!(
+1105 buf.is_empty(),
+1106 "nothing to send on path but buffer not empty"
+1107 );
+1108 }
+1109 }
+1110 }
+1111
+1112 // We didn't produce any application data packet
+1113 debug_assert!(
+1114 buf.is_empty(),
+1115 "there was data in the buffer, but it was not sent"
+1116 );
+1117
+1118 self.app_limited = !congestion_blocked;
+1119
+1120 if self.state.is_established() {
+1121 // Try MTU probing now
+1122 for path_id in path_ids {
+1123 if let Some(transmit) = self.poll_transmit_mtu_probe(now, buf, path_id) {
+1124 return Some(transmit);
+1125 }
+1126 }
+1127 }
+1128
+1129 None
+1130 }
+1131
+1132 fn build_transmit(&mut self, path_id: PathId, transmit: TransmitBuf<'_>) -> Transmit {
+1133 debug_assert!(
+1134 !transmit.is_empty(),
+1135 "must not be called with an empty transmit buffer"
+1136 );
+1137
+1138 let network_path = self.path_data(path_id).network_path;
+1139 trace!(
+1140 segment_size = transmit.segment_size(),
+1141 last_datagram_len = transmit.len() % transmit.segment_size(),
+1142 %network_path,
+1143 "sending {} bytes in {} datagrams",
+1144 transmit.len(),
+1145 transmit.num_datagrams()
+1146 );
+1147 self.path_data_mut(path_id)
+1148 .inc_total_sent(transmit.len() as u64);
+1149
+1150 self.stats
+1151 .udp_tx
+1152 .on_sent(transmit.num_datagrams() as u64, transmit.len());
+1153 self.path_stats
+1154 .entry(path_id)
+1155 .or_default()
+1156 .udp_tx
+1157 .on_sent(transmit.num_datagrams() as u64, transmit.len());
+1158
+1159 Transmit {
+1160 destination: network_path.remote,
+1161 size: transmit.len(),
+1162 ecn: if self.path_data(path_id).sending_ecn {
+1163 Some(EcnCodepoint::Ect0)
+1164 } else {
+1165 None
+1166 },
+1167 segment_size: match transmit.num_datagrams() {
+1168 1 => None,
+1169 _ => Some(transmit.segment_size()),
+1170 },
+1171 src_ip: network_path.local_ip,
+1172 }
+1173 }
+1174
+1175 /// poll_transmit logic for off-path data.
+1176 fn poll_transmit_off_path(
+1177 &mut self,
+1178 now: Instant,
+1179 buf: &mut Vec<u8>,
+1180 path_id: PathId,
+1181 ) -> Option<Transmit> {
+1182 if let Some(challenge) = self.send_prev_path_challenge(now, buf, path_id) {
+1183 return Some(challenge);
+1184 }
+1185 if let Some(response) = self.send_off_path_path_response(now, buf, path_id) {
+1186 return Some(response);
+1187 }
+1188 if let Some(challenge) = self.send_nat_traversal_path_challenge(now, buf, path_id) {
+1189 return Some(challenge);
+1190 }
+1191 None
+1192 }
+1193
+1194 /// poll_transmit logic for on-path data.
+1195 ///
+1196 /// This is not quite the same as for a multipath packet space, since [`PathId::ZERO`]
+1197 /// has 3 packet spaces, which this handles.
+1198 ///
+1199 /// See [`Self::poll_transmit_off_path`] for off-path data.
+1200 #[must_use]
+1201 fn poll_transmit_on_path(
+1202 &mut self,
+1203 now: Instant,
+1204 buf: &mut Vec<u8>,
+1205 path_id: PathId,
+1206 max_datagrams: NonZeroUsize,
+1207 have_available_path: bool,
+1208 connection_close_pending: bool,
+1209 ) -> PollPathStatus {
+1210 // Check if there is at least one active CID to use for sending
+1211 let Some(remote_cid) = self.remote_cids.get(&path_id).map(CidQueue::active) else {
+1212 if !self.abandoned_paths.contains(&path_id) {
+1213 debug!(%path_id, "no remote CIDs for path");
+1214 }
+1215 return PollPathStatus::NothingToSend {
+1216 congestion_blocked: false,
+1217 };
+1218 };
+1219
+1220 // Whether the last packet in the datagram must be padded so the datagram takes up
+1221 // an exact size. An earlier space can decide to not fill an entire datagram and
+1222 // require the next space to fill it further. But may need a specific size of the
+1223 // datagram containing the packet. The final packet built in the datagram must pad
+1224 // to this size.
+1225 let mut pad_datagram = PadDatagram::No;
+1226
+1227 // The packet number of the last built packet. This is kept kept across spaces.
+1228 // QUIC is supposed to have a single congestion controller for the Initial,
+1229 // Handshake and Data(PathId::ZERO) spaces.
+1230 let mut last_packet_number = None;
1231
-1232 // Set the segment size to this path's MTU for on-path data.
-1233 let pmtu = self.path_data(path_id).current_mtu().into();
-1234 let mut transmit = TransmitBuf::new(buf, max_datagrams, pmtu);
+1232 // If we end up not sending anything, we need to know if that was because there was
+1233 // nothing to send or because we were congestion blocked.
+1234 let mut congestion_blocked = false;
1235
-1236 // Iterate over the available spaces.
-1237 for space_id in SpaceId::iter() {
-1238 // Only PathId::ZERO uses non Data space ids.
-1239 if path_id != PathId::ZERO && space_id != SpaceId::Data {
-1240 continue;
-1241 }
-1242 match self.poll_transmit_path_space(
-1243 now,
-1244 &mut transmit,
-1245 path_id,
-1246 space_id,
-1247 remote_cid,
-1248 have_available_path,
-1249 connection_close_pending,
-1250 pad_datagram,
-1251 ) {
-1252 PollPathSpaceStatus::NothingToSend {
-1253 congestion_blocked: cb,
-1254 } => {
-1255 congestion_blocked |= cb;
-1256 // Continue checking other spaces, tail-loss probes may need to be sent
-1257 // in all spaces.
-1258 }
-1259 PollPathSpaceStatus::WrotePacket {
-1260 last_packet_number: pn,
-1261 pad_datagram: pad,
-1262 } => {
-1263 debug_assert!(!transmit.is_empty(), "transmit must contain packets");
-1264 last_packet_number = Some(pn);
-1265 pad_datagram = pad;
-1266 // Always check higher spaces. If the transmit is full or they have
-1267 // nothing to send they will not write packets. But if they can, they
-1268 // must always be allowed to add to this transmit because coalescing may
-1269 // be required.
-1270 continue;
-1271 }
-1272 PollPathSpaceStatus::Send {
-1273 last_packet_number: pn,
-1274 } => {
-1275 debug_assert!(!transmit.is_empty(), "transmit must contain packets");
-1276 last_packet_number = Some(pn);
-1277 break;
-1278 }
-1279 }
-1280 }
-1281
-1282 if last_packet_number.is_some() || congestion_blocked {
-1283 self.qlog.emit_recovery_metrics(
-1284 path_id,
-1285 &mut self.paths.get_mut(&path_id).unwrap().data,
-1286 now,
-1287 );
-1288 }
-1289
-1290 match last_packet_number {
-1291 Some(last_packet_number) => {
-1292 // Note that when sending in multiple spaces the last packet number will be
-1293 // the one from the highest space.
-1294 self.path_data_mut(path_id).congestion.on_sent(
-1295 now,
-1296 transmit.len() as u64,
-1297 last_packet_number,
-1298 );
-1299 PollPathStatus::Send(self.build_transmit(path_id, transmit))
-1300 }
-1301 None => PollPathStatus::NothingToSend { congestion_blocked },
-1302 }
-1303 }
-1304
-1305 /// poll_transmit logic for a QUIC-MULTIPATH packet number space (PathID + SpaceId).
-1306 #[must_use]
-1307 fn poll_transmit_path_space(
-1308 &mut self,
-1309 now: Instant,
-1310 transmit: &mut TransmitBuf<'_>,
-1311 path_id: PathId,
-1312 space_id: SpaceId,
-1313 remote_cid: ConnectionId,
-1314 // If any other packet space has a usable path with PathStatus::Available.
-1315 have_available_path: bool,
-1316 // If we need to send a CONNECTION_CLOSE frame.
-1317 connection_close_pending: bool,
-1318 // Whether the current datagram needs to be padded to a certain size.
-1319 mut pad_datagram: PadDatagram,
-1320 ) -> PollPathSpaceStatus {
-1321 // Keep track of the last packet number we wrote. If None we did not write any
-1322 // packets.
-1323 let mut last_packet_number = None;
-1324
-1325 // Each loop of this may build one packet. It works logically as follows:
-1326 //
-1327 // - Check if something *needs* to be sent in this space and *can* be sent.
-1328 // - If not, return to the caller who will call us again for the next space.
-1329 // - Start a new datagram.
-1330 // - Unless coalescing the packet into an existing datagram.
-1331 // - Write the packet header and payload.
-1332 // - Check if coalescing a next packet into the datagram is possible.
-1333 // - If coalescing, finish packet without padding to leave space in the datagram.
-1334 // - If not coalescing, complete the datagram:
-1335 // - Finish packet with padding.
-1336 // - Set the transmit segment size if this is the first datagram.
-1337 // - Loop: next iteration will exit the loop if nothing more to send in this
-1338 // space. The TransmitBuf will contain a started datagram with space if
-1339 // coalescing, or completely filled datagram if not coalescing.
-1340 loop {
-1341 // Determine if anything can be sent in this packet number space (SpaceId + PathId).
-1342 let max_packet_size = if transmit.datagram_remaining_mut() > 0 {
-1343 // A datagram is started already, we are coalescing another packet into it.
-1344 transmit.datagram_remaining_mut()
-1345 } else {
-1346 // A new datagram needs to be started.
-1347 transmit.segment_size()
-1348 };
-1349 let can_send =
-1350 self.space_can_send(space_id, path_id, max_packet_size, connection_close_pending);
-1351
-1352 // Whether we would like to send any frames on this packet space. See the packet
-1353 // scheduling described in poll_transmit.
-1354 let space_should_send = {
-1355 let path_exclusive_only = space_id == SpaceId::Data
-1356 && have_available_path
-1357 && self.path_data(path_id).local_status() == PathStatus::Backup;
-1358 let path_should_send = if path_exclusive_only {
-1359 can_send.path_exclusive
-1360 } else {
-1361 !can_send.is_empty()
-1362 };
-1363 let needs_loss_probe = self.spaces[space_id].for_path(path_id).loss_probes > 0;
-1364 path_should_send || needs_loss_probe
-1365 };
-1366
-1367 if !space_should_send {
-1368 // Nothing more to send. Previous iterations of this loop may have built
-1369 // packets already.
-1370 return match last_packet_number {
-1371 Some(pn) => PollPathSpaceStatus::WrotePacket {
-1372 last_packet_number: pn,
-1373 pad_datagram,
-1374 },
-1375 None => {
-1376 // Only log for spaces which have crypto.
-1377 if self.crypto_state.has_keys(space_id.encryption_level())
-1378 || (space_id == SpaceId::Data
-1379 && self.crypto_state.has_keys(EncryptionLevel::ZeroRtt))
-1380 {
-1381 trace!(?space_id, %path_id, "nothing to send in space");
-1382 }
-1383 PollPathSpaceStatus::NothingToSend {
-1384 congestion_blocked: false,
-1385 }
-1386 }
-1387 };
-1388 }
-1389
-1390 // We want to send on this space, check congestion control if we can. But only
-1391 // if we will need to start a new datagram. If we are coalescing into an already
-1392 // started datagram we do not need to check congestion control again.
-1393 if transmit.datagram_remaining_mut() == 0 {
-1394 let congestion_blocked =
-1395 self.path_congestion_check(space_id, path_id, transmit, &can_send, now);
-1396 if congestion_blocked != PathBlocked::No {
-1397 // Previous iterations of this loop may have built packets already.
-1398 return match last_packet_number {
-1399 Some(pn) => PollPathSpaceStatus::WrotePacket {
-1400 last_packet_number: pn,
-1401 pad_datagram,
-1402 },
-1403 None => {
-1404 return PollPathSpaceStatus::NothingToSend {
-1405 congestion_blocked: true,
-1406 };
-1407 }
-1408 };
-1409 }
-1410 }
-1411
-1412 // If the datagram is full (or there never was one started), we need to start a
-1413 // new one.
-1414 if transmit.datagram_remaining_mut() == 0 {
-1415 if transmit.num_datagrams() >= transmit.max_datagrams().get() {
-1416 // No more datagrams allowed.
-1417 // Previous iterations of this loop may have built packets already.
-1418 return match last_packet_number {
-1419 Some(pn) => PollPathSpaceStatus::WrotePacket {
-1420 last_packet_number: pn,
-1421 pad_datagram,
-1422 },
-1423 None => {
-1424 return PollPathSpaceStatus::NothingToSend {
-1425 congestion_blocked: false,
-1426 };
-1427 }
-1428 };
-1429 }
-1430
-1431 match self.spaces[space_id].for_path(path_id).loss_probes {
-1432 0 => transmit.start_new_datagram(),
-1433 _ => {
-1434 // We need something to send for a tail-loss probe.
-1435 let request_immediate_ack =
-1436 space_id == SpaceId::Data && self.peer_supports_ack_frequency();
-1437 self.spaces[space_id].maybe_queue_probe(
-1438 path_id,
-1439 request_immediate_ack,
-1440 &self.streams,
-1441 );
-1442
-1443 self.spaces[space_id].for_path(path_id).loss_probes -= 1;
-1444
-1445 // Clamp the datagram to at most the minimum MTU to ensure that loss
-1446 // probes can get through and enable recovery even if the path MTU
-1447 // has shrank unexpectedly.
-1448 transmit.start_new_datagram_with_size(std::cmp::min(
-1449 usize::from(INITIAL_MTU),
-1450 transmit.segment_size(),
-1451 ));
-1452 }
-1453 }
-1454 trace!(count = transmit.num_datagrams(), "new datagram started");
-1455
-1456 // We started a new datagram, we decide later if it needs padding.
-1457 pad_datagram = PadDatagram::No;
-1458 }
+1236 // Set the segment size to this path's MTU for on-path data.
+1237 let pmtu = self.path_data(path_id).current_mtu().into();
+1238 let mut transmit = TransmitBuf::new(buf, max_datagrams, pmtu);
+1239
+1240 // Iterate over the available spaces.
+1241 for space_id in SpaceId::iter() {
+1242 // Only PathId::ZERO uses non Data space ids.
+1243 if path_id != PathId::ZERO && space_id != SpaceId::Data {
+1244 continue;
+1245 }
+1246 match self.poll_transmit_path_space(
+1247 now,
+1248 &mut transmit,
+1249 path_id,
+1250 space_id,
+1251 remote_cid,
+1252 have_available_path,
+1253 connection_close_pending,
+1254 pad_datagram,
+1255 ) {
+1256 PollPathSpaceStatus::NothingToSend {
+1257 congestion_blocked: cb,
+1258 } => {
+1259 congestion_blocked |= cb;
+1260 // Continue checking other spaces, tail-loss probes may need to be sent
+1261 // in all spaces.
+1262 }
+1263 PollPathSpaceStatus::WrotePacket {
+1264 last_packet_number: pn,
+1265 pad_datagram: pad,
+1266 } => {
+1267 debug_assert!(!transmit.is_empty(), "transmit must contain packets");
+1268 last_packet_number = Some(pn);
+1269 pad_datagram = pad;
+1270 // Always check higher spaces. If the transmit is full or they have
+1271 // nothing to send they will not write packets. But if they can, they
+1272 // must always be allowed to add to this transmit because coalescing may
+1273 // be required.
+1274 continue;
+1275 }
+1276 PollPathSpaceStatus::Send {
+1277 last_packet_number: pn,
+1278 } => {
+1279 debug_assert!(!transmit.is_empty(), "transmit must contain packets");
+1280 last_packet_number = Some(pn);
+1281 break;
+1282 }
+1283 }
+1284 }
+1285
+1286 if last_packet_number.is_some() || congestion_blocked {
+1287 self.qlog.emit_recovery_metrics(
+1288 path_id,
+1289 &mut self.paths.get_mut(&path_id).unwrap().data,
+1290 now,
+1291 );
+1292 }
+1293
+1294 match last_packet_number {
+1295 Some(last_packet_number) => {
+1296 // Note that when sending in multiple spaces the last packet number will be
+1297 // the one from the highest space.
+1298 self.path_data_mut(path_id).congestion.on_sent(
+1299 now,
+1300 transmit.len() as u64,
+1301 last_packet_number,
+1302 );
+1303 PollPathStatus::Send(self.build_transmit(path_id, transmit))
+1304 }
+1305 None => PollPathStatus::NothingToSend { congestion_blocked },
+1306 }
+1307 }
+1308
+1309 /// poll_transmit logic for a QUIC-MULTIPATH packet number space (PathID + SpaceId).
+1310 #[must_use]
+1311 fn poll_transmit_path_space(
+1312 &mut self,
+1313 now: Instant,
+1314 transmit: &mut TransmitBuf<'_>,
+1315 path_id: PathId,
+1316 space_id: SpaceId,
+1317 remote_cid: ConnectionId,
+1318 // If any other packet space has a usable path with PathStatus::Available.
+1319 have_available_path: bool,
+1320 // If we need to send a CONNECTION_CLOSE frame.
+1321 connection_close_pending: bool,
+1322 // Whether the current datagram needs to be padded to a certain size.
+1323 mut pad_datagram: PadDatagram,
+1324 ) -> PollPathSpaceStatus {
+1325 // Keep track of the last packet number we wrote. If None we did not write any
+1326 // packets.
+1327 let mut last_packet_number = None;
+1328
+1329 // Each loop of this may build one packet. It works logically as follows:
+1330 //
+1331 // - Check if something *needs* to be sent in this space and *can* be sent.
+1332 // - If not, return to the caller who will call us again for the next space.
+1333 // - Start a new datagram.
+1334 // - Unless coalescing the packet into an existing datagram.
+1335 // - Write the packet header and payload.
+1336 // - Check if coalescing a next packet into the datagram is possible.
+1337 // - If coalescing, finish packet without padding to leave space in the datagram.
+1338 // - If not coalescing, complete the datagram:
+1339 // - Finish packet with padding.
+1340 // - Set the transmit segment size if this is the first datagram.
+1341 // - Loop: next iteration will exit the loop if nothing more to send in this
+1342 // space. The TransmitBuf will contain a started datagram with space if
+1343 // coalescing, or completely filled datagram if not coalescing.
+1344 loop {
+1345 // Determine if anything can be sent in this packet number space (SpaceId + PathId).
+1346 let max_packet_size = if transmit.datagram_remaining_mut() > 0 {
+1347 // A datagram is started already, we are coalescing another packet into it.
+1348 transmit.datagram_remaining_mut()
+1349 } else {
+1350 // A new datagram needs to be started.
+1351 transmit.segment_size()
+1352 };
+1353 let can_send =
+1354 self.space_can_send(space_id, path_id, max_packet_size, connection_close_pending);
+1355
+1356 // Whether we would like to send any frames on this packet space. See the packet
+1357 // scheduling described in poll_transmit.
+1358 let space_should_send = {
+1359 let path_exclusive_only = space_id == SpaceId::Data
+1360 && have_available_path
+1361 && self.path_data(path_id).local_status() == PathStatus::Backup;
+1362 let path_should_send = if path_exclusive_only {
+1363 can_send.path_exclusive
+1364 } else {
+1365 !can_send.is_empty()
+1366 };
+1367 let needs_loss_probe = self.spaces[space_id].for_path(path_id).loss_probes > 0;
+1368 path_should_send || needs_loss_probe
+1369 };
+1370
+1371 if !space_should_send {
+1372 // Nothing more to send. Previous iterations of this loop may have built
+1373 // packets already.
+1374 return match last_packet_number {
+1375 Some(pn) => PollPathSpaceStatus::WrotePacket {
+1376 last_packet_number: pn,
+1377 pad_datagram,
+1378 },
+1379 None => {
+1380 // Only log for spaces which have crypto.
+1381 if self.crypto_state.has_keys(space_id.encryption_level())
+1382 || (space_id == SpaceId::Data
+1383 && self.crypto_state.has_keys(EncryptionLevel::ZeroRtt))
+1384 {
+1385 trace!(?space_id, %path_id, "nothing to send in space");
+1386 }
+1387 PollPathSpaceStatus::NothingToSend {
+1388 congestion_blocked: false,
+1389 }
+1390 }
+1391 };
+1392 }
+1393
+1394 // We want to send on this space, check congestion control if we can. But only
+1395 // if we will need to start a new datagram. If we are coalescing into an already
+1396 // started datagram we do not need to check congestion control again.
+1397 if transmit.datagram_remaining_mut() == 0 {
+1398 let congestion_blocked =
+1399 self.path_congestion_check(space_id, path_id, transmit, &can_send, now);
+1400 if congestion_blocked != PathBlocked::No {
+1401 // Previous iterations of this loop may have built packets already.
+1402 return match last_packet_number {
+1403 Some(pn) => PollPathSpaceStatus::WrotePacket {
+1404 last_packet_number: pn,
+1405 pad_datagram,
+1406 },
+1407 None => {
+1408 return PollPathSpaceStatus::NothingToSend {
+1409 congestion_blocked: true,
+1410 };
+1411 }
+1412 };
+1413 }
+1414 }
+1415
+1416 // If the datagram is full (or there never was one started), we need to start a
+1417 // new one.
+1418 if transmit.datagram_remaining_mut() == 0 {
+1419 if transmit.num_datagrams() >= transmit.max_datagrams().get() {
+1420 // No more datagrams allowed.
+1421 // Previous iterations of this loop may have built packets already.
+1422 return match last_packet_number {
+1423 Some(pn) => PollPathSpaceStatus::WrotePacket {
+1424 last_packet_number: pn,
+1425 pad_datagram,
+1426 },
+1427 None => {
+1428 return PollPathSpaceStatus::NothingToSend {
+1429 congestion_blocked: false,
+1430 };
+1431 }
+1432 };
+1433 }
+1434
+1435 match self.spaces[space_id].for_path(path_id).loss_probes {
+1436 0 => transmit.start_new_datagram(),
+1437 _ => {
+1438 // We need something to send for a tail-loss probe.
+1439 let request_immediate_ack =
+1440 space_id == SpaceId::Data && self.peer_supports_ack_frequency();
+1441 self.spaces[space_id].maybe_queue_probe(
+1442 path_id,
+1443 request_immediate_ack,
+1444 &self.streams,
+1445 );
+1446
+1447 self.spaces[space_id].for_path(path_id).loss_probes -= 1;
+1448
+1449 // Clamp the datagram to at most the minimum MTU to ensure that loss
+1450 // probes can get through and enable recovery even if the path MTU
+1451 // has shrank unexpectedly.
+1452 transmit.start_new_datagram_with_size(std::cmp::min(
+1453 usize::from(INITIAL_MTU),
+1454 transmit.segment_size(),
+1455 ));
+1456 }
+1457 }
+1458 trace!(count = transmit.num_datagrams(), "new datagram started");
1459
-1460 // If coalescing another packet into the existing datagram, there should
-1461 // still be enough space for a whole packet.
-1462 if transmit.datagram_start_offset() < transmit.len() {
-1463 debug_assert!(transmit.datagram_remaining_mut() >= MIN_PACKET_SPACE);
-1464 }
-1465
-1466 //
-1467 // From here on, we've determined that a packet will definitely be sent.
-1468 //
+1460 // We started a new datagram, we decide later if it needs padding.
+1461 pad_datagram = PadDatagram::No;
+1462 }
+1463
+1464 // If coalescing another packet into the existing datagram, there should
+1465 // still be enough space for a whole packet.
+1466 if transmit.datagram_start_offset() < transmit.len() {
+1467 debug_assert!(transmit.datagram_remaining_mut() >= MIN_PACKET_SPACE);
+1468 }
1469
-1470 if self.crypto_state.has_keys(EncryptionLevel::Initial)
-1471 && space_id == SpaceId::Handshake
-1472 && self.side.is_client()
-1473 {
-1474 // A client stops both sending and processing Initial packets when it
-1475 // sends its first Handshake packet.
-1476 self.discard_space(now, SpaceId::Initial);
-1477 }
-1478 if let Some(ref mut prev) = self.crypto_state.prev_crypto {
-1479 prev.update_unacked = false;
-1480 }
-1481
-1482 let Some(mut builder) = PacketBuilder::new(
-1483 now,
-1484 space_id,
-1485 path_id,
-1486 remote_cid,
-1487 transmit,
-1488 can_send.other,
-1489 self,
-1490 ) else {
-1491 // Confidentiality limit is exceeded and the connection has been killed. We
-1492 // should not send any other packets. This works in a roundabout way: We
-1493 // have started a datagram but not written anything into it. So even if we
-1494 // get called again for another space we will see an already started
-1495 // datagram and try and start another packet here. Then be stopped by the
-1496 // same confidentiality limit.
-1497 return PollPathSpaceStatus::NothingToSend {
-1498 congestion_blocked: false,
-1499 };
-1500 };
-1501 last_packet_number = Some(builder.packet_number);
-1502
-1503 if space_id == SpaceId::Initial && (self.side.is_client() || can_send.other) {
-1504 // https://www.rfc-editor.org/rfc/rfc9000.html#section-14.1
-1505 pad_datagram |= PadDatagram::ToMinMtu;
-1506 }
-1507 if space_id == SpaceId::Data && self.config.pad_to_mtu {
-1508 pad_datagram |= PadDatagram::ToSegmentSize;
-1509 }
-1510
-1511 if can_send.close {
-1512 trace!("sending CONNECTION_CLOSE");
-1513 // Encode ACKs before the ConnectionClose message, to give the receiver
-1514 // a better approximate on what data has been processed. This is
-1515 // especially important with ack delay, since the peer might not
-1516 // have gotten any other ACK for the data earlier on.
-1517 let is_multipath_negotiated = self.is_multipath_negotiated();
-1518 for path_id in self.spaces[space_id]
-1519 .number_spaces
-1520 .iter()
-1521 .filter(|(_, pns)| !pns.pending_acks.ranges().is_empty())
-1522 .map(|(&path_id, _)| path_id)
-1523 .collect::<Vec<_>>()
-1524 {
-1525 Self::populate_acks(
-1526 now,
-1527 self.receiving_ecn,
-1528 path_id,
-1529 space_id,
-1530 &mut self.spaces[space_id],
-1531 is_multipath_negotiated,
-1532 &mut builder,
-1533 &mut self.stats.frame_tx,
-1534 self.crypto_state.has_keys(space_id.encryption_level()),
-1535 );
-1536 }
-1537
-1538 // Since there only 64 ACK frames there will always be enough space
-1539 // to encode the ConnectionClose frame too. However we still have the
-1540 // check here to prevent crashes if something changes.
+1470 //
+1471 // From here on, we've determined that a packet will definitely be sent.
+1472 //
+1473
+1474 if self.crypto_state.has_keys(EncryptionLevel::Initial)
+1475 && space_id == SpaceId::Handshake
+1476 && self.side.is_client()
+1477 {
+1478 // A client stops both sending and processing Initial packets when it
+1479 // sends its first Handshake packet.
+1480 self.discard_space(now, SpaceId::Initial);
+1481 }
+1482 if let Some(ref mut prev) = self.crypto_state.prev_crypto {
+1483 prev.update_unacked = false;
+1484 }
+1485
+1486 let Some(mut builder) = PacketBuilder::new(
+1487 now,
+1488 space_id,
+1489 path_id,
+1490 remote_cid,
+1491 transmit,
+1492 can_send.other,
+1493 self,
+1494 ) else {
+1495 // Confidentiality limit is exceeded and the connection has been killed. We
+1496 // should not send any other packets. This works in a roundabout way: We
+1497 // have started a datagram but not written anything into it. So even if we
+1498 // get called again for another space we will see an already started
+1499 // datagram and try and start another packet here. Then be stopped by the
+1500 // same confidentiality limit.
+1501 return PollPathSpaceStatus::NothingToSend {
+1502 congestion_blocked: false,
+1503 };
+1504 };
+1505 last_packet_number = Some(builder.packet_number);
+1506
+1507 if space_id == SpaceId::Initial && (self.side.is_client() || can_send.other) {
+1508 // https://www.rfc-editor.org/rfc/rfc9000.html#section-14.1
+1509 pad_datagram |= PadDatagram::ToMinMtu;
+1510 }
+1511 if space_id == SpaceId::Data && self.config.pad_to_mtu {
+1512 pad_datagram |= PadDatagram::ToSegmentSize;
+1513 }
+1514
+1515 if can_send.close {
+1516 trace!("sending CONNECTION_CLOSE");
+1517 // Encode ACKs before the ConnectionClose message, to give the receiver
+1518 // a better approximate on what data has been processed. This is
+1519 // especially important with ack delay, since the peer might not
+1520 // have gotten any other ACK for the data earlier on.
+1521 let is_multipath_negotiated = self.is_multipath_negotiated();
+1522 for path_id in self.spaces[space_id]
+1523 .number_spaces
+1524 .iter()
+1525 .filter(|(_, pns)| !pns.pending_acks.ranges().is_empty())
+1526 .map(|(&path_id, _)| path_id)
+1527 .collect::<Vec<_>>()
+1528 {
+1529 Self::populate_acks(
+1530 now,
+1531 self.receiving_ecn,
+1532 path_id,
+1533 space_id,
+1534 &mut self.spaces[space_id],
+1535 is_multipath_negotiated,
+1536 &mut builder,
+1537 &mut self.stats.frame_tx,
+1538 self.crypto_state.has_keys(space_id.encryption_level()),
+1539 );
+1540 }
1541
-1542 // TODO(flub): This needs fixing for multipath, to ensure we can always
-1543 // write the CONNECTION_CLOSE even if we have many PATH_ACKs to send:
-1544 // https://github.com/n0-computer/quinn/issues/367.
-1545 debug_assert!(
-1546 builder.frame_space_remaining() > frame::ConnectionClose::SIZE_BOUND,
-1547 "ACKs should leave space for ConnectionClose"
-1548 );
-1549 let stats = &mut self.stats.frame_tx;
-1550 if frame::ConnectionClose::SIZE_BOUND < builder.frame_space_remaining() {
-1551 let max_frame_size = builder.frame_space_remaining();
-1552 let close: Close = match self.state.as_type() {
-1553 StateType::Closed => {
-1554 let reason: Close =
-1555 self.state.as_closed().expect("checked").clone().into();
-1556 if space_id == SpaceId::Data || reason.is_transport_layer() {
-1557 reason
-1558 } else {
-1559 TransportError::APPLICATION_ERROR("").into()
-1560 }
-1561 }
-1562 StateType::Draining => TransportError::NO_ERROR("").into(),
-1563 _ => unreachable!(
-1564 "tried to make a close packet when the connection wasn't closed"
-1565 ),
-1566 };
-1567 builder.write_frame(close.encoder(max_frame_size), stats);
-1568 }
-1569 let last_pn = builder.packet_number;
-1570 builder.finish_and_track(now, self, path_id, pad_datagram);
-1571 if space_id == self.highest_space {
-1572 // Don't send another close packet. Even with multipath we only send
-1573 // CONNECTION_CLOSE on a single path since we expect our paths to work.
-1574 self.connection_close_pending = false;
-1575 }
-1576 // Send a close frame in every possible space for robustness, per
-1577 // RFC9000 "Immediate Close during the Handshake". Don't bother trying
-1578 // to send anything else.
-1579 // TODO(flub): This breaks during the handshake if we can not coalesce
-1580 // packets due to space reasons: the next space would either fail a
-1581 // debug_assert checking for enough packet space or produce an invalid
-1582 // packet. We need to keep track of per-space pending CONNECTION_CLOSE to
-1583 // be able to send these across multiple calls to poll_transmit. Then
-1584 // check for coalescing space here because initial packets need to be in
-1585 // padded datagrams. And also add space checks for CONNECTION_CLOSE in
-1586 // space_can_send so it would stop a GSO batch if the datagram is too
-1587 // small for another CONNECTION_CLOSE packet.
-1588 return PollPathSpaceStatus::WrotePacket {
-1589 last_packet_number: last_pn,
-1590 pad_datagram,
-1591 };
-1592 }
-1593
-1594 // If this boolean is true we only want to send frames which can not be sent on
-1595 // any other path. See the path scheduling notes in Self::poll_transmit.
-1596 let path_exclusive_only =
-1597 have_available_path && self.path_data(path_id).local_status() == PathStatus::Backup;
-1598
-1599 self.populate_packet(now, space_id, path_id, path_exclusive_only, &mut builder);
-1600
-1601 // ACK-only packets should only be sent when explicitly allowed. If we write them due to
-1602 // any other reason, there is a bug which leads to one component announcing write
-1603 // readiness while not writing any data. This degrades performance. The condition is
-1604 // only checked if the full MTU is available and when potentially large fixed-size
-1605 // frames aren't queued, so that lack of space in the datagram isn't the reason for just
-1606 // writing ACKs.
-1607 debug_assert!(
-1608 !(builder.sent_frames().is_ack_only(&self.streams)
-1609 && !can_send.acks
-1610 && can_send.other
-1611 && builder.buf.segment_size()
-1612 == self.path_data(path_id).current_mtu() as usize
-1613 && self.datagrams.outgoing.is_empty()),
-1614 "SendableFrames was {can_send:?}, but only ACKs have been written"
-1615 );
-1616 if builder.sent_frames().requires_padding {
-1617 pad_datagram |= PadDatagram::ToMinMtu;
-1618 }
-1619
-1620 for (path_id, _pn) in builder.sent_frames().largest_acked.iter() {
-1621 self.spaces[space_id]
-1622 .for_path(*path_id)
-1623 .pending_acks
-1624 .acks_sent();
-1625 self.timers.stop(
-1626 Timer::PerPath(*path_id, PathTimer::MaxAckDelay),
-1627 self.qlog.with_time(now),
-1628 );
-1629 }
-1630
-1631 // Now we need to finish the packet. Before we do so we need to know if we will
-1632 // be coalescing the next packet into this one, or will be ending the datagram
-1633 // as well. Because if this is the last packet in the datagram more padding
-1634 // might be needed because of the packet type, or to fill the GSO segment size.
-1635
-1636 // Are we allowed to coalesce AND is there enough space for another *packet* in
-1637 // this datagram AND will we definitely send another packet?
-1638 if builder.can_coalesce && path_id == PathId::ZERO && {
-1639 let max_packet_size = builder
-1640 .buf
-1641 .datagram_remaining_mut()
-1642 .saturating_sub(builder.predict_packet_end());
-1643 max_packet_size > MIN_PACKET_SPACE
-1644 && self.has_pending_packet(space_id, max_packet_size, connection_close_pending)
-1645 } {
-1646 // We can append/coalesce the next packet into the current
-1647 // datagram. Finish the current packet without adding extra padding.
-1648 trace!("will coalesce with next packet");
-1649 builder.finish_and_track(now, self, path_id, PadDatagram::No);
-1650 } else {
-1651 // We need a new datagram for the next packet. Finish the current
-1652 // packet with padding.
-1653 // TODO(flub): if there isn't any more data to be sent, this will still pad
-1654 // to the segment size and only discover there is nothing to send before
-1655 // starting the next packet. That is wasting up to 32 bytes.
-1656 if builder.buf.num_datagrams() > 1 && matches!(pad_datagram, PadDatagram::No) {
-1657 // If too many padding bytes would be required to continue the
-1658 // GSO batch after this packet, end the GSO batch here. Ensures
-1659 // that fixed-size frames with heterogeneous sizes
-1660 // (e.g. application datagrams) won't inadvertently waste large
-1661 // amounts of bandwidth. The exact threshold is a bit arbitrary
-1662 // and might benefit from further tuning, though there's no
-1663 // universally optimal value.
-1664 const MAX_PADDING: usize = 32;
-1665 if builder.buf.datagram_remaining_mut()
-1666 > builder.predict_packet_end() + MAX_PADDING
-1667 {
-1668 trace!(
-1669 "GSO truncated by demand for {} padding bytes",
-1670 builder.buf.datagram_remaining_mut() - builder.predict_packet_end()
-1671 );
-1672 let last_pn = builder.packet_number;
-1673 builder.finish_and_track(now, self, path_id, PadDatagram::No);
-1674 return PollPathSpaceStatus::Send {
-1675 last_packet_number: last_pn,
-1676 };
-1677 }
-1678
-1679 // Pad the current datagram to GSO segment size so it can be
-1680 // included in the GSO batch.
-1681 builder.finish_and_track(now, self, path_id, PadDatagram::ToSegmentSize);
-1682 } else {
-1683 builder.finish_and_track(now, self, path_id, pad_datagram);
-1684 }
-1685
-1686 // If this is the first datagram we set the segment size to the size of the
-1687 // first datagram.
-1688 if transmit.num_datagrams() == 1 {
-1689 transmit.clip_segment_size();
-1690 }
-1691 }
-1692 }
-1693 }
-1694
-1695 fn poll_transmit_mtu_probe(
-1696 &mut self,
-1697 now: Instant,
-1698 buf: &mut Vec<u8>,
-1699 path_id: PathId,
-1700 ) -> Option<Transmit> {
-1701 let (active_cid, probe_size) = self.get_mtu_probe_data(now, path_id)?;
-1702
-1703 // We are definitely sending a DPLPMTUD probe.
-1704 let mut transmit = TransmitBuf::new(buf, NonZeroUsize::MIN, probe_size as usize);
-1705 transmit.start_new_datagram_with_size(probe_size as usize);
+1542 // Since there only 64 ACK frames there will always be enough space
+1543 // to encode the ConnectionClose frame too. However we still have the
+1544 // check here to prevent crashes if something changes.
+1545
+1546 // TODO(flub): This needs fixing for multipath, to ensure we can always
+1547 // write the CONNECTION_CLOSE even if we have many PATH_ACKs to send:
+1548 // https://github.com/n0-computer/quinn/issues/367.
+1549 debug_assert!(
+1550 builder.frame_space_remaining() > frame::ConnectionClose::SIZE_BOUND,
+1551 "ACKs should leave space for ConnectionClose"
+1552 );
+1553 let stats = &mut self.stats.frame_tx;
+1554 if frame::ConnectionClose::SIZE_BOUND < builder.frame_space_remaining() {
+1555 let max_frame_size = builder.frame_space_remaining();
+1556 let close: Close = match self.state.as_type() {
+1557 StateType::Closed => {
+1558 let reason: Close =
+1559 self.state.as_closed().expect("checked").clone().into();
+1560 if space_id == SpaceId::Data || reason.is_transport_layer() {
+1561 reason
+1562 } else {
+1563 TransportError::APPLICATION_ERROR("").into()
+1564 }
+1565 }
+1566 StateType::Draining => TransportError::NO_ERROR("").into(),
+1567 _ => unreachable!(
+1568 "tried to make a close packet when the connection wasn't closed"
+1569 ),
+1570 };
+1571 builder.write_frame(close.encoder(max_frame_size), stats);
+1572 }
+1573 let last_pn = builder.packet_number;
+1574 builder.finish_and_track(now, self, path_id, pad_datagram);
+1575 if space_id == self.highest_space {
+1576 // Don't send another close packet. Even with multipath we only send
+1577 // CONNECTION_CLOSE on a single path since we expect our paths to work.
+1578 self.connection_close_pending = false;
+1579 }
+1580 // Send a close frame in every possible space for robustness, per
+1581 // RFC9000 "Immediate Close during the Handshake". Don't bother trying
+1582 // to send anything else.
+1583 // TODO(flub): This breaks during the handshake if we can not coalesce
+1584 // packets due to space reasons: the next space would either fail a
+1585 // debug_assert checking for enough packet space or produce an invalid
+1586 // packet. We need to keep track of per-space pending CONNECTION_CLOSE to
+1587 // be able to send these across multiple calls to poll_transmit. Then
+1588 // check for coalescing space here because initial packets need to be in
+1589 // padded datagrams. And also add space checks for CONNECTION_CLOSE in
+1590 // space_can_send so it would stop a GSO batch if the datagram is too
+1591 // small for another CONNECTION_CLOSE packet.
+1592 return PollPathSpaceStatus::WrotePacket {
+1593 last_packet_number: last_pn,
+1594 pad_datagram,
+1595 };
+1596 }
+1597
+1598 // If this boolean is true we only want to send frames which can not be sent on
+1599 // any other path. See the path scheduling notes in Self::poll_transmit.
+1600 let path_exclusive_only =
+1601 have_available_path && self.path_data(path_id).local_status() == PathStatus::Backup;
+1602
+1603 self.populate_packet(now, space_id, path_id, path_exclusive_only, &mut builder);
+1604
+1605 // ACK-only packets should only be sent when explicitly allowed. If we write them due to
+1606 // any other reason, there is a bug which leads to one component announcing write
+1607 // readiness while not writing any data. This degrades performance. The condition is
+1608 // only checked if the full MTU is available and when potentially large fixed-size
+1609 // frames aren't queued, so that lack of space in the datagram isn't the reason for just
+1610 // writing ACKs.
+1611 debug_assert!(
+1612 !(builder.sent_frames().is_ack_only(&self.streams)
+1613 && !can_send.acks
+1614 && can_send.other
+1615 && builder.buf.segment_size()
+1616 == self.path_data(path_id).current_mtu() as usize
+1617 && self.datagrams.outgoing.is_empty()),
+1618 "SendableFrames was {can_send:?}, but only ACKs have been written"
+1619 );
+1620 if builder.sent_frames().requires_padding {
+1621 pad_datagram |= PadDatagram::ToMinMtu;
+1622 }
+1623
+1624 for (path_id, _pn) in builder.sent_frames().largest_acked.iter() {
+1625 self.spaces[space_id]
+1626 .for_path(*path_id)
+1627 .pending_acks
+1628 .acks_sent();
+1629 self.timers.stop(
+1630 Timer::PerPath(*path_id, PathTimer::MaxAckDelay),
+1631 self.qlog.with_time(now),
+1632 );
+1633 }
+1634
+1635 // Now we need to finish the packet. Before we do so we need to know if we will
+1636 // be coalescing the next packet into this one, or will be ending the datagram
+1637 // as well. Because if this is the last packet in the datagram more padding
+1638 // might be needed because of the packet type, or to fill the GSO segment size.
+1639
+1640 // Are we allowed to coalesce AND is there enough space for another *packet* in
+1641 // this datagram AND will we definitely send another packet?
+1642 if builder.can_coalesce && path_id == PathId::ZERO && {
+1643 let max_packet_size = builder
+1644 .buf
+1645 .datagram_remaining_mut()
+1646 .saturating_sub(builder.predict_packet_end());
+1647 max_packet_size > MIN_PACKET_SPACE
+1648 && self.has_pending_packet(space_id, max_packet_size, connection_close_pending)
+1649 } {
+1650 // We can append/coalesce the next packet into the current
+1651 // datagram. Finish the current packet without adding extra padding.
+1652 trace!("will coalesce with next packet");
+1653 builder.finish_and_track(now, self, path_id, PadDatagram::No);
+1654 } else {
+1655 // We need a new datagram for the next packet. Finish the current
+1656 // packet with padding.
+1657 // TODO(flub): if there isn't any more data to be sent, this will still pad
+1658 // to the segment size and only discover there is nothing to send before
+1659 // starting the next packet. That is wasting up to 32 bytes.
+1660 if builder.buf.num_datagrams() > 1 && matches!(pad_datagram, PadDatagram::No) {
+1661 // If too many padding bytes would be required to continue the
+1662 // GSO batch after this packet, end the GSO batch here. Ensures
+1663 // that fixed-size frames with heterogeneous sizes
+1664 // (e.g. application datagrams) won't inadvertently waste large
+1665 // amounts of bandwidth. The exact threshold is a bit arbitrary
+1666 // and might benefit from further tuning, though there's no
+1667 // universally optimal value.
+1668 const MAX_PADDING: usize = 32;
+1669 if builder.buf.datagram_remaining_mut()
+1670 > builder.predict_packet_end() + MAX_PADDING
+1671 {
+1672 trace!(
+1673 "GSO truncated by demand for {} padding bytes",
+1674 builder.buf.datagram_remaining_mut() - builder.predict_packet_end()
+1675 );
+1676 let last_pn = builder.packet_number;
+1677 builder.finish_and_track(now, self, path_id, PadDatagram::No);
+1678 return PollPathSpaceStatus::Send {
+1679 last_packet_number: last_pn,
+1680 };
+1681 }
+1682
+1683 // Pad the current datagram to GSO segment size so it can be
+1684 // included in the GSO batch.
+1685 builder.finish_and_track(now, self, path_id, PadDatagram::ToSegmentSize);
+1686 } else {
+1687 builder.finish_and_track(now, self, path_id, pad_datagram);
+1688 }
+1689
+1690 // If this is the first datagram we set the segment size to the size of the
+1691 // first datagram.
+1692 if transmit.num_datagrams() == 1 {
+1693 transmit.clip_segment_size();
+1694 }
+1695 }
+1696 }
+1697 }
+1698
+1699 fn poll_transmit_mtu_probe(
+1700 &mut self,
+1701 now: Instant,
+1702 buf: &mut Vec<u8>,
+1703 path_id: PathId,
+1704 ) -> Option<Transmit> {
+1705 let (active_cid, probe_size) = self.get_mtu_probe_data(now, path_id)?;
1706
-1707 let mut builder = PacketBuilder::new(
-1708 now,
-1709 SpaceId::Data,
-1710 path_id,
-1711 active_cid,
-1712 &mut transmit,
-1713 true,
-1714 self,
-1715 )?;
-1716
-1717 // We implement MTU probes as ping packets padded up to the probe size
-1718 trace!(?probe_size, "writing MTUD probe");
-1719 builder.write_frame(frame::Ping, &mut self.stats.frame_tx);
+1707 // We are definitely sending a DPLPMTUD probe.
+1708 let mut transmit = TransmitBuf::new(buf, NonZeroUsize::MIN, probe_size as usize);
+1709 transmit.start_new_datagram_with_size(probe_size as usize);
+1710
+1711 let mut builder = PacketBuilder::new(
+1712 now,
+1713 SpaceId::Data,
+1714 path_id,
+1715 active_cid,
+1716 &mut transmit,
+1717 true,
+1718 self,
+1719 )?;
1720
-1721 // If supported by the peer, we want no delays to the probe's ACK
-1722 if self.peer_supports_ack_frequency() {
-1723 builder.write_frame(frame::ImmediateAck, &mut self.stats.frame_tx);
-1724 }
-1725
-1726 builder.finish_and_track(now, self, path_id, PadDatagram::ToSize(probe_size));
-1727
-1728 self.path_stats
-1729 .entry(path_id)
-1730 .or_default()
-1731 .sent_plpmtud_probes += 1;
-1732
-1733 Some(self.build_transmit(path_id, transmit))
-1734 }
-1735
-1736 /// Returns the CID and probe size if a DPLPMTUD probe is needed.
-1737 ///
-1738 /// We MTU probe all paths for which all of the following is true:
-1739 /// - We have an active destination CID for the path.
-1740 /// - The remote address *and* path are validated.
-1741 /// - The path is not abandoned.
-1742 /// - The MTU Discovery subsystem wants to probe the path.
-1743 fn get_mtu_probe_data(&mut self, now: Instant, path_id: PathId) -> Option<(ConnectionId, u16)> {
-1744 let active_cid = self.remote_cids.get(&path_id).map(CidQueue::active)?;
-1745 let is_eligible = self.path_data(path_id).validated
-1746 && !self.path_data(path_id).is_validating_path()
-1747 && !self.abandoned_paths.contains(&path_id);
-1748
-1749 if !is_eligible {
-1750 return None;
-1751 }
-1752 let next_pn = self.spaces[SpaceId::Data]
-1753 .for_path(path_id)
-1754 .peek_tx_number();
-1755 let probe_size = self
-1756 .path_data_mut(path_id)
-1757 .mtud
-1758 .poll_transmit(now, next_pn)?;
-1759
-1760 Some((active_cid, probe_size))
-1761 }
-1762
-1763 /// Returns true if there is a further packet to send on [`PathId::ZERO`].
-1764 ///
-1765 /// In other words this is predicting whether the next call to
-1766 /// [`Connection::space_can_send`] issued will return some frames to be sent. Including
-1767 /// having to predict which packet number space it will be invoked with. This depends on
-1768 /// how both [`Connection::poll_transmit_path`] and
-1769 /// [`Connection::poll_transmit_path_space`] behave.
-1770 ///
-1771 /// This is needed to determine if packet coalescing can happen. Because the last packet
-1772 /// in a datagram may need to be padded and thus we must know if another packet will
-1773 /// follow or not.
+1721 // We implement MTU probes as ping packets padded up to the probe size
+1722 trace!(?probe_size, "writing MTUD probe");
+1723 builder.write_frame(frame::Ping, &mut self.stats.frame_tx);
+1724
+1725 // If supported by the peer, we want no delays to the probe's ACK
+1726 if self.peer_supports_ack_frequency() {
+1727 builder.write_frame(frame::ImmediateAck, &mut self.stats.frame_tx);
+1728 }
+1729
+1730 builder.finish_and_track(now, self, path_id, PadDatagram::ToSize(probe_size));
+1731
+1732 self.path_stats
+1733 .entry(path_id)
+1734 .or_default()
+1735 .sent_plpmtud_probes += 1;
+1736
+1737 Some(self.build_transmit(path_id, transmit))
+1738 }
+1739
+1740 /// Returns the CID and probe size if a DPLPMTUD probe is needed.
+1741 ///
+1742 /// We MTU probe all paths for which all of the following is true:
+1743 /// - We have an active destination CID for the path.
+1744 /// - The remote address *and* path are validated.
+1745 /// - The path is not abandoned.
+1746 /// - The MTU Discovery subsystem wants to probe the path.
+1747 fn get_mtu_probe_data(&mut self, now: Instant, path_id: PathId) -> Option<(ConnectionId, u16)> {
+1748 let active_cid = self.remote_cids.get(&path_id).map(CidQueue::active)?;
+1749 let is_eligible = self.path_data(path_id).validated
+1750 && !self.path_data(path_id).is_validating_path()
+1751 && !self.abandoned_paths.contains(&path_id);
+1752
+1753 if !is_eligible {
+1754 return None;
+1755 }
+1756 let next_pn = self.spaces[SpaceId::Data]
+1757 .for_path(path_id)
+1758 .peek_tx_number();
+1759 let probe_size = self
+1760 .path_data_mut(path_id)
+1761 .mtud
+1762 .poll_transmit(now, next_pn)?;
+1763
+1764 Some((active_cid, probe_size))
+1765 }
+1766
+1767 /// Returns true if there is a further packet to send on [`PathId::ZERO`].
+1768 ///
+1769 /// In other words this is predicting whether the next call to
+1770 /// [`Connection::space_can_send`] issued will return some frames to be sent. Including
+1771 /// having to predict which packet number space it will be invoked with. This depends on
+1772 /// how both [`Connection::poll_transmit_path`] and
+1773 /// [`Connection::poll_transmit_path_space`] behave.
1774 ///
-1775 /// The next packet can be either in the same space, or in one of the following spaces
-1776 /// on the same path. Because a 0-RTT packet can be coalesced with a 1-RTT packet and
-1777 /// both are in the Data(PathId::ZERO) space. Previous spaces are not checked, because
-1778 /// packets are built from Initial to Handshake to Data spaces.
-1779 fn has_pending_packet(
-1780 &mut self,
-1781 current_space_id: SpaceId,
-1782 max_packet_size: usize,
-1783 connection_close_pending: bool,
-1784 ) -> bool {
-1785 let mut space_id = current_space_id;
-1786 loop {
-1787 let can_send = self.space_can_send(
-1788 space_id,
-1789 PathId::ZERO,
-1790 max_packet_size,
-1791 connection_close_pending,
-1792 );
-1793 if !can_send.is_empty() {
-1794 return true;
-1795 }
-1796 match space_id.next() {
-1797 Some(next_space_id) => space_id = next_space_id,
-1798 None => break,
+1775 /// This is needed to determine if packet coalescing can happen. Because the last packet
+1776 /// in a datagram may need to be padded and thus we must know if another packet will
+1777 /// follow or not.
+1778 ///
+1779 /// The next packet can be either in the same space, or in one of the following spaces
+1780 /// on the same path. Because a 0-RTT packet can be coalesced with a 1-RTT packet and
+1781 /// both are in the Data(PathId::ZERO) space. Previous spaces are not checked, because
+1782 /// packets are built from Initial to Handshake to Data spaces.
+1783 fn has_pending_packet(
+1784 &mut self,
+1785 current_space_id: SpaceId,
+1786 max_packet_size: usize,
+1787 connection_close_pending: bool,
+1788 ) -> bool {
+1789 let mut space_id = current_space_id;
+1790 loop {
+1791 let can_send = self.space_can_send(
+1792 space_id,
+1793 PathId::ZERO,
+1794 max_packet_size,
+1795 connection_close_pending,
+1796 );
+1797 if !can_send.is_empty() {
+1798 return true;
1799 }
-1800 }
-1801 false
-1802 }
-1803
-1804 /// Checks if creating a new datagram would be blocked by congestion control
-1805 fn path_congestion_check(
-1806 &mut self,
-1807 space_id: SpaceId,
-1808 path_id: PathId,
-1809 transmit: &TransmitBuf<'_>,
-1810 can_send: &SendableFrames,
-1811 now: Instant,
-1812 ) -> PathBlocked {
-1813 // Anti-amplification is only based on `total_sent`, which gets updated after
-1814 // the transmit is sent. Therefore we pass the amount of bytes for datagrams
-1815 // that are already created, as well as 1 byte for starting another datagram. If
-1816 // there is any anti-amplification budget left, we always allow a full MTU to be
-1817 // sent (see https://github.com/quinn-rs/quinn/issues/1082).
-1818 if self.side().is_server()
-1819 && self
-1820 .path_data(path_id)
-1821 .anti_amplification_blocked(transmit.len() as u64 + 1)
-1822 {
-1823 trace!(?space_id, %path_id, "blocked by anti-amplification");
-1824 return PathBlocked::AntiAmplification;
-1825 }
-1826
-1827 // Congestion control check.
-1828 // Tail loss probes must not be blocked by congestion, or a deadlock could arise.
-1829 let bytes_to_send = transmit.segment_size() as u64;
-1830 let need_loss_probe = self.spaces[space_id].for_path(path_id).loss_probes > 0;
-1831
-1832 if can_send.other && !need_loss_probe && !can_send.close {
-1833 let path = self.path_data(path_id);
-1834 if path.in_flight.bytes + bytes_to_send >= path.congestion.window() {
-1835 trace!(?space_id, %path_id, "blocked by congestion control");
-1836 return PathBlocked::Congestion;
-1837 }
-1838 }
-1839
-1840 // Pacing check.
-1841 if let Some(delay) = self.path_data_mut(path_id).pacing_delay(bytes_to_send, now) {
-1842 self.timers.set(
-1843 Timer::PerPath(path_id, PathTimer::Pacing),
-1844 delay,
-1845 self.qlog.with_time(now),
-1846 );
-1847 // Loss probes and CONNECTION_CLOSE should be subject to pacing, even though
-1848 // they are not congestion controlled.
-1849 trace!(?space_id, %path_id, "blocked by pacing");
-1850 return PathBlocked::Pacing;
-1851 }
-1852
-1853 PathBlocked::No
-1854 }
-1855
-1856 /// Send PATH_CHALLENGE for a previous path if necessary
-1857 ///
-1858 /// QUIC-TRANSPORT section 9.3.3
-1859 /// <https://www.rfc-editor.org/rfc/rfc9000.html#name-off-path-packet-forwarding>
-1860 fn send_prev_path_challenge(
-1861 &mut self,
-1862 now: Instant,
-1863 buf: &mut Vec<u8>,
-1864 path_id: PathId,
-1865 ) -> Option<Transmit> {
-1866 let (prev_cid, prev_path) = self.paths.get_mut(&path_id)?.prev.as_mut()?;
-1867 // TODO (matheus23): We could use !prev_path.is_validating() here instead to
-1868 // (possibly) also re-send challenges when they get lost.
-1869 if !prev_path.send_new_challenge {
-1870 return None;
-1871 };
-1872 prev_path.send_new_challenge = false;
-1873 let network_path = prev_path.network_path;
-1874 let token = self.rng.random();
-1875 let info = paths::SentChallengeInfo {
-1876 sent_instant: now,
-1877 network_path,
-1878 };
-1879 prev_path.challenges_sent.insert(token, info);
-1880 debug_assert_eq!(
-1881 self.highest_space,
-1882 SpaceId::Data,
-1883 "PATH_CHALLENGE queued without 1-RTT keys"
-1884 );
-1885 let buf = &mut TransmitBuf::new(buf, NonZeroUsize::MIN, MIN_INITIAL_SIZE.into());
-1886 buf.start_new_datagram();
-1887
-1888 // Use the previous CID to avoid linking the new path with the previous path. We
-1889 // don't bother accounting for possible retirement of that prev_cid because this is
-1890 // sent once, immediately after migration, when the CID is known to be valid. Even
-1891 // if a post-migration packet caused the CID to be retired, it's fair to pretend
-1892 // this is sent first.
-1893 let mut builder =
-1894 PacketBuilder::new(now, SpaceId::Data, path_id, *prev_cid, buf, false, self)?;
-1895 let challenge = frame::PathChallenge(token);
-1896 let stats = &mut self.stats.frame_tx;
-1897 builder.write_frame_with_log_msg(challenge, stats, Some("validating previous path"));
-1898
-1899 // An endpoint MUST expand datagrams that contain a PATH_CHALLENGE frame
-1900 // to at least the smallest allowed maximum datagram size of 1200 bytes,
-1901 // unless the anti-amplification limit for the path does not permit
-1902 // sending a datagram of this size
-1903 builder.pad_to(MIN_INITIAL_SIZE);
-1904
-1905 builder.finish(self, now);
-1906 self.stats.udp_tx.on_sent(1, buf.len());
-1907 self.path_stats
-1908 .entry(path_id)
-1909 .or_default()
-1910 .udp_tx
-1911 .on_sent(1, buf.len());
-1912
-1913 Some(Transmit {
-1914 destination: network_path.remote,
-1915 size: buf.len(),
-1916 ecn: None,
-1917 segment_size: None,
-1918 src_ip: network_path.local_ip,
-1919 })
-1920 }
-1921
-1922 fn send_off_path_path_response(
-1923 &mut self,
-1924 now: Instant,
-1925 buf: &mut Vec<u8>,
-1926 path_id: PathId,
-1927 ) -> Option<Transmit> {
-1928 let path = self.paths.get_mut(&path_id).map(|state| &mut state.data)?;
-1929 let cid_queue = self.remote_cids.get_mut(&path_id)?;
-1930 let (token, network_path) = path.path_responses.pop_off_path(path.network_path)?;
-1931
-1932 let cid = cid_queue
-1933 .next_reserved()
-1934 .unwrap_or_else(|| cid_queue.active());
-1935 // TODO(@divma): we should take a different approach when there is no fresh CID to use.
-1936 // https://github.com/quinn-rs/quinn/issues/2184
-1937
-1938 let frame = frame::PathResponse(token);
-1939
-1940 let buf = &mut TransmitBuf::new(buf, NonZeroUsize::MIN, MIN_INITIAL_SIZE.into());
-1941 buf.start_new_datagram();
-1942
-1943 let mut builder = PacketBuilder::new(now, SpaceId::Data, path_id, cid, buf, false, self)?;
-1944 let stats = &mut self.stats.frame_tx;
-1945 builder.write_frame_with_log_msg(frame, stats, Some("(off-path)"));
-1946 builder.finish_and_track(now, self, path_id, PadDatagram::ToMinMtu);
-1947
-1948 let size = buf.len();
-1949
-1950 self.stats.udp_tx.on_sent(1, size);
-1951 self.path_stats
-1952 .entry(path_id)
-1953 .or_default()
-1954 .udp_tx
-1955 .on_sent(1, size);
-1956 Some(Transmit {
-1957 destination: network_path.remote,
-1958 size,
-1959 ecn: None,
-1960 segment_size: None,
-1961 src_ip: network_path.local_ip,
-1962 })
-1963 }
-1964
-1965 /// Send a nat traversal challenge (off-path) on this path if possible.
-1966 ///
-1967 /// This will ensure the path still has a remaining CID to use if the active one should be
-1968 /// retired.
-1969 fn send_nat_traversal_path_challenge(
-1970 &mut self,
-1971 now: Instant,
-1972 buf: &mut Vec<u8>,
-1973 path_id: PathId,
-1974 ) -> Option<Transmit> {
-1975 let server_side = self.iroh_hp.server_side_mut().ok()?;
-1976 let probe = server_side.next_probe()?;
-1977 if !self.paths.get(&path_id)?.data.validated {
-1978 // Path is not usable for probing
-1979 return None;
-1980 }
-1981
-1982 let remote_cids = self.remote_cids.get_mut(&path_id)?;
-1983
-1984 // Check if this path has enough CIDs to send a probe. One to be reserved, one in case the
-1985 // active CID needs to be retired.
-1986 if remote_cids.remaining() < 2 {
-1987 return None;
-1988 }
-1989
-1990 let cid = remote_cids.next_reserved()?;
-1991 let remote = probe.remote();
-1992 let token = self.rng.random();
-1993 probe.mark_as_sent();
-1994
-1995 let frame = frame::PathChallenge(token);
-1996
-1997 let mut buf = TransmitBuf::new(buf, NonZeroUsize::MIN, MIN_INITIAL_SIZE.into());
-1998 buf.start_new_datagram();
-1999
-2000 let mut builder =
-2001 PacketBuilder::new(now, SpaceId::Data, path_id, cid, &mut buf, false, self)?;
-2002 let stats = &mut self.stats.frame_tx;
-2003 builder.write_frame_with_log_msg(frame, stats, Some("(nat-traversal)"));
-2004 builder.finish_and_track(now, self, path_id, PadDatagram::ToMinMtu);
-2005
-2006 let path = &mut self.paths.get_mut(&path_id).expect("checked").data;
-2007
-2008 path.challenges_sent.insert(
-2009 token,
-2010 paths::SentChallengeInfo {
-2011 sent_instant: now,
-2012 network_path: FourTuple {
-2013 remote,
-2014 local_ip: None,
-2015 },
-2016 },
-2017 );
-2018
-2019 let size = buf.len();
-2020
-2021 self.stats.udp_tx.on_sent(1, size);
-2022 self.path_stats
-2023 .entry(path_id)
-2024 .or_default()
-2025 .udp_tx
-2026 .on_sent(1, size);
-2027
-2028 Some(Transmit {
-2029 destination: remote,
-2030 size,
-2031 ecn: None,
-2032 segment_size: None,
-2033 src_ip: None,
-2034 })
-2035 }
-2036
-2037 /// Indicate what types of frames are ready to send for the given space
-2038 ///
-2039 /// *packet_size* is the number of bytes available to build the next packet.
-2040 /// *connection_close_pending* indicates whether a CONNECTION_CLOSE frame needs to be
-2041 /// sent.
-2042 fn space_can_send(
-2043 &mut self,
-2044 space_id: SpaceId,
-2045 path_id: PathId,
-2046 packet_size: usize,
-2047 connection_close_pending: bool,
-2048 ) -> SendableFrames {
-2049 let space = &mut self.spaces[space_id];
-2050 let space_has_crypto = self.crypto_state.has_keys(space_id.encryption_level());
-2051
-2052 if !space_has_crypto
-2053 && (space_id != SpaceId::Data
-2054 || !self.crypto_state.has_keys(EncryptionLevel::ZeroRtt)
-2055 || self.side.is_server())
-2056 {
-2057 // Nothing to send in this space
-2058 return SendableFrames::empty();
-2059 }
-2060
-2061 let mut can_send = space.can_send(path_id, &self.streams);
-2062
-2063 // Check for 1RTT space.
-2064 if space_id == SpaceId::Data {
-2065 let pn = space.for_path(path_id).peek_tx_number();
-2066 // Number of bytes available for frames if this is a 1-RTT packet. We're
-2067 // guaranteed to be able to send an individual frame at least this large in the
-2068 // next 1-RTT packet. This could be generalized to support every space, but it's
-2069 // only needed to handle large fixed-size frames, which only exist in 1-RTT
-2070 // (application datagrams).
-2071 let frame_space_1rtt =
-2072 packet_size.saturating_sub(self.predict_1rtt_overhead(pn, path_id));
-2073 can_send |= self.can_send_1rtt(path_id, frame_space_1rtt);
-2074 }
-2075
-2076 can_send.close = connection_close_pending && space_has_crypto;
-2077
-2078 can_send
-2079 }
-2080
-2081 /// Process `ConnectionEvent`s generated by the associated `Endpoint`
-2082 ///
-2083 /// Will execute protocol logic upon receipt of a connection event, in turn preparing signals
-2084 /// (including application `Event`s, `EndpointEvent`s and outgoing datagrams) that should be
-2085 /// extracted through the relevant methods.
-2086 pub fn handle_event(&mut self, event: ConnectionEvent) {
-2087 use ConnectionEventInner::*;
-2088 match event.0 {
-2089 Datagram(DatagramConnectionEvent {
-2090 now,
-2091 network_path,
-2092 path_id,
-2093 ecn,
-2094 first_decode,
-2095 remaining,
-2096 }) => {
-2097 let span = trace_span!("pkt", %path_id);
-2098 let _guard = span.enter();
-2099
-2100 if self.update_network_path_or_discard(network_path, path_id) {
-2101 // A return value of true indicates we should discard this packet.
-2102 return;
-2103 }
-2104
-2105 let was_anti_amplification_blocked = self
-2106 .path(path_id)
-2107 .map(|path| path.anti_amplification_blocked(1))
-2108 // We never tried to send on an non-existing (new) path so have not been
-2109 // anti-amplification blocked for it previously.
-2110 .unwrap_or(false);
-2111
-2112 self.stats.udp_rx.datagrams += 1;
-2113 self.stats.udp_rx.bytes += first_decode.len() as u64;
-2114 let rx = &mut self.path_stats.entry(path_id).or_default().udp_rx;
-2115 rx.datagrams += 1;
-2116 rx.bytes += first_decode.len() as u64;
-2117 let data_len = first_decode.len();
-2118
-2119 self.handle_decode(now, network_path, path_id, ecn, first_decode);
-2120 // The current `path` might have changed inside `handle_decode` since the packet
-2121 // could have triggered a migration. The packet might also belong to an unknown
-2122 // path and have been rejected. Make sure the data received is accounted for the
-2123 // most recent path by accessing `path` after `handle_decode`.
-2124 if let Some(path) = self.path_mut(path_id) {
-2125 path.inc_total_recvd(data_len as u64);
-2126 }
-2127
-2128 if let Some(data) = remaining {
-2129 self.stats.udp_rx.bytes += data.len() as u64;
-2130 self.path_stats.entry(path_id).or_default().udp_rx.bytes += data.len() as u64;
-2131 self.handle_coalesced(now, network_path, path_id, ecn, data);
-2132 }
-2133
-2134 if let Some(path) = self.paths.get_mut(&path_id) {
-2135 self.qlog
-2136 .emit_recovery_metrics(path_id, &mut path.data, now);
-2137 }
-2138
-2139 if was_anti_amplification_blocked {
-2140 // A prior attempt to set the loss detection timer may have failed due to
-2141 // anti-amplification, so ensure it's set now. Prevents a handshake deadlock if
-2142 // the server's first flight is lost.
-2143 self.set_loss_detection_timer(now, path_id);
-2144 }
-2145 }
-2146 NewIdentifiers(ids, now, cid_len, cid_lifetime) => {
-2147 let path_id = ids.first().map(|issued| issued.path_id).unwrap_or_default();
-2148 debug_assert!(ids.iter().all(|issued| issued.path_id == path_id));
-2149 let cid_state = self
-2150 .local_cid_state
-2151 .entry(path_id)
-2152 .or_insert_with(|| CidState::new(cid_len, cid_lifetime, now, 0));
-2153 cid_state.new_cids(&ids, now);
-2154
-2155 ids.into_iter().rev().for_each(|frame| {
-2156 self.spaces[SpaceId::Data].pending.new_cids.push(frame);
-2157 });
-2158 // Always update Timer::PushNewCid
-2159 self.reset_cid_retirement(now);
-2160 }
-2161 }
-2162 }
-2163
-2164 /// Updates the network path for `path_id`.
-2165 ///
-2166 /// Returns true if a packet coming in for this `path_id` over given `network_path` should be discarded.
-2167 /// Returns false if the path was updated and the packet doesn't need to be discarded.
-2168 fn update_network_path_or_discard(&mut self, network_path: FourTuple, path_id: PathId) -> bool {
-2169 let remote_may_migrate = self.side.remote_may_migrate(&self.state);
-2170 let local_ip_may_migrate = self.side.is_client();
-2171 // If this packet could initiate a migration and we're a client or a server that
-2172 // forbids migration, drop the datagram. This could be relaxed to heuristically
-2173 // permit NAT-rebinding-like migration.
-2174 if let Some(known_path) = self.path_mut(path_id) {
-2175 if network_path.remote != known_path.network_path.remote && !remote_may_migrate {
-2176 trace!(
-2177 %path_id,
-2178 %network_path,
-2179 %known_path.network_path,
-2180 "discarding packet from unrecognized peer"
-2181 );
-2182 return true;
-2183 }
-2184
-2185 if known_path.network_path.local_ip.is_some()
-2186 && network_path.local_ip.is_some()
-2187 && known_path.network_path.local_ip != network_path.local_ip
-2188 && !local_ip_may_migrate
-2189 {
-2190 trace!(
-2191 %path_id,
-2192 %network_path,
-2193 %known_path.network_path,
-2194 "discarding packet sent to incorrect interface"
-2195 );
-2196 return true;
-2197 }
-2198 // If the datagram indicates that we've changed our local IP, we update it.
-2199 // This is alluded to in Section 5.2 of the Multipath RFC draft 18:
-2200 // https://www.ietf.org/archive/id/draft-ietf-quic-multipath-18.html#name-using-multiple-paths-on-the
-2201 // > Client receives the packet, recognizes a path migration, updates the source address of path 2 to 192.0.2.1.
-2202 if let Some(local_ip) = network_path.local_ip {
-2203 if known_path
-2204 .network_path
-2205 .local_ip
-2206 .is_some_and(|ip| ip != local_ip)
-2207 {
-2208 debug!(
-2209 %path_id,
-2210 %network_path,
-2211 %known_path.network_path,
-2212 "path's local address seemingly migrated"
-2213 );
-2214 }
-2215 // We update the address without path validation on the client side.
-2216 // https://www.ietf.org/archive/id/draft-ietf-quic-multipath-18.html#section-5.1
-2217 // > Servers observing a 4-tuple change will perform path validation (see Section 9 of [QUIC-TRANSPORT]).
-2218 // This sounds like it's *only* the server endpoints that do this.
-2219 // TODO(matheus23): We should still consider doing a proper migration on the client side in the future.
-2220 // For now, this preserves the behavior of this code pre 4-tuple tracking.
-2221 known_path.network_path.local_ip = Some(local_ip);
-2222 }
-2223 }
-2224 false
-2225 }
-2226
-2227 /// Process timer expirations
-2228 ///
-2229 /// Executes protocol logic, potentially preparing signals (including application `Event`s,
-2230 /// `EndpointEvent`s and outgoing datagrams) that should be extracted through the relevant
-2231 /// methods.
+1800 match space_id.next() {
+1801 Some(next_space_id) => space_id = next_space_id,
+1802 None => break,
+1803 }
+1804 }
+1805 false
+1806 }
+1807
+1808 /// Checks if creating a new datagram would be blocked by congestion control
+1809 fn path_congestion_check(
+1810 &mut self,
+1811 space_id: SpaceId,
+1812 path_id: PathId,
+1813 transmit: &TransmitBuf<'_>,
+1814 can_send: &SendableFrames,
+1815 now: Instant,
+1816 ) -> PathBlocked {
+1817 // Anti-amplification is only based on `total_sent`, which gets updated after
+1818 // the transmit is sent. Therefore we pass the amount of bytes for datagrams
+1819 // that are already created, as well as 1 byte for starting another datagram. If
+1820 // there is any anti-amplification budget left, we always allow a full MTU to be
+1821 // sent (see https://github.com/quinn-rs/quinn/issues/1082).
+1822 if self.side().is_server()
+1823 && self
+1824 .path_data(path_id)
+1825 .anti_amplification_blocked(transmit.len() as u64 + 1)
+1826 {
+1827 trace!(?space_id, %path_id, "blocked by anti-amplification");
+1828 return PathBlocked::AntiAmplification;
+1829 }
+1830
+1831 // Congestion control check.
+1832 // Tail loss probes must not be blocked by congestion, or a deadlock could arise.
+1833 let bytes_to_send = transmit.segment_size() as u64;
+1834 let need_loss_probe = self.spaces[space_id].for_path(path_id).loss_probes > 0;
+1835
+1836 if can_send.other && !need_loss_probe && !can_send.close {
+1837 let path = self.path_data(path_id);
+1838 if path.in_flight.bytes + bytes_to_send >= path.congestion.window() {
+1839 trace!(?space_id, %path_id, "blocked by congestion control");
+1840 return PathBlocked::Congestion;
+1841 }
+1842 }
+1843
+1844 // Pacing check.
+1845 if let Some(delay) = self.path_data_mut(path_id).pacing_delay(bytes_to_send, now) {
+1846 self.timers.set(
+1847 Timer::PerPath(path_id, PathTimer::Pacing),
+1848 delay,
+1849 self.qlog.with_time(now),
+1850 );
+1851 // Loss probes and CONNECTION_CLOSE should be subject to pacing, even though
+1852 // they are not congestion controlled.
+1853 trace!(?space_id, %path_id, "blocked by pacing");
+1854 return PathBlocked::Pacing;
+1855 }
+1856
+1857 PathBlocked::No
+1858 }
+1859
+1860 /// Send PATH_CHALLENGE for a previous path if necessary
+1861 ///
+1862 /// QUIC-TRANSPORT section 9.3.3
+1863 /// <https://www.rfc-editor.org/rfc/rfc9000.html#name-off-path-packet-forwarding>
+1864 fn send_prev_path_challenge(
+1865 &mut self,
+1866 now: Instant,
+1867 buf: &mut Vec<u8>,
+1868 path_id: PathId,
+1869 ) -> Option<Transmit> {
+1870 let (prev_cid, prev_path) = self.paths.get_mut(&path_id)?.prev.as_mut()?;
+1871 // TODO (matheus23): We could use !prev_path.is_validating() here instead to
+1872 // (possibly) also re-send challenges when they get lost.
+1873 if !prev_path.send_new_challenge {
+1874 return None;
+1875 };
+1876 prev_path.send_new_challenge = false;
+1877 let network_path = prev_path.network_path;
+1878 let token = self.rng.random();
+1879 let info = paths::SentChallengeInfo {
+1880 sent_instant: now,
+1881 network_path,
+1882 };
+1883 prev_path.challenges_sent.insert(token, info);
+1884 debug_assert_eq!(
+1885 self.highest_space,
+1886 SpaceId::Data,
+1887 "PATH_CHALLENGE queued without 1-RTT keys"
+1888 );
+1889 let buf = &mut TransmitBuf::new(buf, NonZeroUsize::MIN, MIN_INITIAL_SIZE.into());
+1890 buf.start_new_datagram();
+1891
+1892 // Use the previous CID to avoid linking the new path with the previous path. We
+1893 // don't bother accounting for possible retirement of that prev_cid because this is
+1894 // sent once, immediately after migration, when the CID is known to be valid. Even
+1895 // if a post-migration packet caused the CID to be retired, it's fair to pretend
+1896 // this is sent first.
+1897 let mut builder =
+1898 PacketBuilder::new(now, SpaceId::Data, path_id, *prev_cid, buf, false, self)?;
+1899 let challenge = frame::PathChallenge(token);
+1900 let stats = &mut self.stats.frame_tx;
+1901 builder.write_frame_with_log_msg(challenge, stats, Some("validating previous path"));
+1902
+1903 // An endpoint MUST expand datagrams that contain a PATH_CHALLENGE frame
+1904 // to at least the smallest allowed maximum datagram size of 1200 bytes,
+1905 // unless the anti-amplification limit for the path does not permit
+1906 // sending a datagram of this size
+1907 builder.pad_to(MIN_INITIAL_SIZE);
+1908
+1909 builder.finish(self, now);
+1910 self.stats.udp_tx.on_sent(1, buf.len());
+1911 self.path_stats
+1912 .entry(path_id)
+1913 .or_default()
+1914 .udp_tx
+1915 .on_sent(1, buf.len());
+1916
+1917 Some(Transmit {
+1918 destination: network_path.remote,
+1919 size: buf.len(),
+1920 ecn: None,
+1921 segment_size: None,
+1922 src_ip: network_path.local_ip,
+1923 })
+1924 }
+1925
+1926 fn send_off_path_path_response(
+1927 &mut self,
+1928 now: Instant,
+1929 buf: &mut Vec<u8>,
+1930 path_id: PathId,
+1931 ) -> Option<Transmit> {
+1932 let path = self.paths.get_mut(&path_id).map(|state| &mut state.data)?;
+1933 let cid_queue = self.remote_cids.get_mut(&path_id)?;
+1934 let (token, network_path) = path.path_responses.pop_off_path(path.network_path)?;
+1935
+1936 let cid = cid_queue
+1937 .next_reserved()
+1938 .unwrap_or_else(|| cid_queue.active());
+1939 // TODO(@divma): we should take a different approach when there is no fresh CID to use.
+1940 // https://github.com/quinn-rs/quinn/issues/2184
+1941
+1942 let frame = frame::PathResponse(token);
+1943
+1944 let buf = &mut TransmitBuf::new(buf, NonZeroUsize::MIN, MIN_INITIAL_SIZE.into());
+1945 buf.start_new_datagram();
+1946
+1947 let mut builder = PacketBuilder::new(now, SpaceId::Data, path_id, cid, buf, false, self)?;
+1948 let stats = &mut self.stats.frame_tx;
+1949 builder.write_frame_with_log_msg(frame, stats, Some("(off-path)"));
+1950 builder.finish_and_track(now, self, path_id, PadDatagram::ToMinMtu);
+1951
+1952 let size = buf.len();
+1953
+1954 self.stats.udp_tx.on_sent(1, size);
+1955 self.path_stats
+1956 .entry(path_id)
+1957 .or_default()
+1958 .udp_tx
+1959 .on_sent(1, size);
+1960 Some(Transmit {
+1961 destination: network_path.remote,
+1962 size,
+1963 ecn: None,
+1964 segment_size: None,
+1965 src_ip: network_path.local_ip,
+1966 })
+1967 }
+1968
+1969 /// Send a nat traversal challenge (off-path) on this path if possible.
+1970 ///
+1971 /// This will ensure the path still has a remaining CID to use if the active one should be
+1972 /// retired.
+1973 fn send_nat_traversal_path_challenge(
+1974 &mut self,
+1975 now: Instant,
+1976 buf: &mut Vec<u8>,
+1977 path_id: PathId,
+1978 ) -> Option<Transmit> {
+1979 let server_side = self.iroh_hp.server_side_mut().ok()?;
+1980 let probe = server_side.next_probe()?;
+1981 if !self.paths.get(&path_id)?.data.validated {
+1982 // Path is not usable for probing
+1983 return None;
+1984 }
+1985
+1986 let remote_cids = self.remote_cids.get_mut(&path_id)?;
+1987
+1988 // Check if this path has enough CIDs to send a probe. One to be reserved, one in case the
+1989 // active CID needs to be retired.
+1990 if remote_cids.remaining() < 2 {
+1991 return None;
+1992 }
+1993
+1994 let cid = remote_cids.next_reserved()?;
+1995 let remote = probe.remote();
+1996 let token = self.rng.random();
+1997 probe.mark_as_sent();
+1998
+1999 let frame = frame::PathChallenge(token);
+2000
+2001 let mut buf = TransmitBuf::new(buf, NonZeroUsize::MIN, MIN_INITIAL_SIZE.into());
+2002 buf.start_new_datagram();
+2003
+2004 let mut builder =
+2005 PacketBuilder::new(now, SpaceId::Data, path_id, cid, &mut buf, false, self)?;
+2006 let stats = &mut self.stats.frame_tx;
+2007 builder.write_frame_with_log_msg(frame, stats, Some("(nat-traversal)"));
+2008 builder.finish_and_track(now, self, path_id, PadDatagram::ToMinMtu);
+2009
+2010 let path = &mut self.paths.get_mut(&path_id).expect("checked").data;
+2011
+2012 path.challenges_sent.insert(
+2013 token,
+2014 paths::SentChallengeInfo {
+2015 sent_instant: now,
+2016 network_path: FourTuple {
+2017 remote,
+2018 local_ip: None,
+2019 },
+2020 },
+2021 );
+2022
+2023 let size = buf.len();
+2024
+2025 self.stats.udp_tx.on_sent(1, size);
+2026 self.path_stats
+2027 .entry(path_id)
+2028 .or_default()
+2029 .udp_tx
+2030 .on_sent(1, size);
+2031
+2032 Some(Transmit {
+2033 destination: remote,
+2034 size,
+2035 ecn: None,
+2036 segment_size: None,
+2037 src_ip: None,
+2038 })
+2039 }
+2040
+2041 /// Indicate what types of frames are ready to send for the given space
+2042 ///
+2043 /// *packet_size* is the number of bytes available to build the next packet.
+2044 /// *connection_close_pending* indicates whether a CONNECTION_CLOSE frame needs to be
+2045 /// sent.
+2046 fn space_can_send(
+2047 &mut self,
+2048 space_id: SpaceId,
+2049 path_id: PathId,
+2050 packet_size: usize,
+2051 connection_close_pending: bool,
+2052 ) -> SendableFrames {
+2053 let space = &mut self.spaces[space_id];
+2054 let space_has_crypto = self.crypto_state.has_keys(space_id.encryption_level());
+2055
+2056 if !space_has_crypto
+2057 && (space_id != SpaceId::Data
+2058 || !self.crypto_state.has_keys(EncryptionLevel::ZeroRtt)
+2059 || self.side.is_server())
+2060 {
+2061 // Nothing to send in this space
+2062 return SendableFrames::empty();
+2063 }
+2064
+2065 let mut can_send = space.can_send(path_id, &self.streams);
+2066
+2067 // Check for 1RTT space.
+2068 if space_id == SpaceId::Data {
+2069 let pn = space.for_path(path_id).peek_tx_number();
+2070 // Number of bytes available for frames if this is a 1-RTT packet. We're
+2071 // guaranteed to be able to send an individual frame at least this large in the
+2072 // next 1-RTT packet. This could be generalized to support every space, but it's
+2073 // only needed to handle large fixed-size frames, which only exist in 1-RTT
+2074 // (application datagrams).
+2075 let frame_space_1rtt =
+2076 packet_size.saturating_sub(self.predict_1rtt_overhead(pn, path_id));
+2077 can_send |= self.can_send_1rtt(path_id, frame_space_1rtt);
+2078 }
+2079
+2080 can_send.close = connection_close_pending && space_has_crypto;
+2081
+2082 can_send
+2083 }
+2084
+2085 /// Process `ConnectionEvent`s generated by the associated `Endpoint`
+2086 ///
+2087 /// Will execute protocol logic upon receipt of a connection event, in turn preparing signals
+2088 /// (including application `Event`s, `EndpointEvent`s and outgoing datagrams) that should be
+2089 /// extracted through the relevant methods.
+2090 pub fn handle_event(&mut self, event: ConnectionEvent) {
+2091 use ConnectionEventInner::*;
+2092 match event.0 {
+2093 Datagram(DatagramConnectionEvent {
+2094 now,
+2095 network_path,
+2096 path_id,
+2097 ecn,
+2098 first_decode,
+2099 remaining,
+2100 }) => {
+2101 let span = trace_span!("pkt", %path_id);
+2102 let _guard = span.enter();
+2103
+2104 if self.update_network_path_or_discard(network_path, path_id) {
+2105 // A return value of true indicates we should discard this packet.
+2106 return;
+2107 }
+2108
+2109 let was_anti_amplification_blocked = self
+2110 .path(path_id)
+2111 .map(|path| path.anti_amplification_blocked(1))
+2112 // We never tried to send on an non-existing (new) path so have not been
+2113 // anti-amplification blocked for it previously.
+2114 .unwrap_or(false);
+2115
+2116 self.stats.udp_rx.datagrams += 1;
+2117 self.stats.udp_rx.bytes += first_decode.len() as u64;
+2118 let rx = &mut self.path_stats.entry(path_id).or_default().udp_rx;
+2119 rx.datagrams += 1;
+2120 rx.bytes += first_decode.len() as u64;
+2121 let data_len = first_decode.len();
+2122
+2123 self.handle_decode(now, network_path, path_id, ecn, first_decode);
+2124 // The current `path` might have changed inside `handle_decode` since the packet
+2125 // could have triggered a migration. The packet might also belong to an unknown
+2126 // path and have been rejected. Make sure the data received is accounted for the
+2127 // most recent path by accessing `path` after `handle_decode`.
+2128 if let Some(path) = self.path_mut(path_id) {
+2129 path.inc_total_recvd(data_len as u64);
+2130 }
+2131
+2132 if let Some(data) = remaining {
+2133 self.stats.udp_rx.bytes += data.len() as u64;
+2134 self.path_stats.entry(path_id).or_default().udp_rx.bytes += data.len() as u64;
+2135 self.handle_coalesced(now, network_path, path_id, ecn, data);
+2136 }
+2137
+2138 if let Some(path) = self.paths.get_mut(&path_id) {
+2139 self.qlog
+2140 .emit_recovery_metrics(path_id, &mut path.data, now);
+2141 }
+2142
+2143 if was_anti_amplification_blocked {
+2144 // A prior attempt to set the loss detection timer may have failed due to
+2145 // anti-amplification, so ensure it's set now. Prevents a handshake deadlock if
+2146 // the server's first flight is lost.
+2147 self.set_loss_detection_timer(now, path_id);
+2148 }
+2149 }
+2150 NewIdentifiers(ids, now, cid_len, cid_lifetime) => {
+2151 let path_id = ids.first().map(|issued| issued.path_id).unwrap_or_default();
+2152 debug_assert!(ids.iter().all(|issued| issued.path_id == path_id));
+2153 let cid_state = self
+2154 .local_cid_state
+2155 .entry(path_id)
+2156 .or_insert_with(|| CidState::new(cid_len, cid_lifetime, now, 0));
+2157 cid_state.new_cids(&ids, now);
+2158
+2159 ids.into_iter().rev().for_each(|frame| {
+2160 self.spaces[SpaceId::Data].pending.new_cids.push(frame);
+2161 });
+2162 // Always update Timer::PushNewCid
+2163 self.reset_cid_retirement(now);
+2164 }
+2165 }
+2166 }
+2167
+2168 /// Updates the network path for `path_id`.
+2169 ///
+2170 /// Returns true if a packet coming in for this `path_id` over given `network_path` should be discarded.
+2171 /// Returns false if the path was updated and the packet doesn't need to be discarded.
+2172 fn update_network_path_or_discard(&mut self, network_path: FourTuple, path_id: PathId) -> bool {
+2173 let remote_may_migrate = self.side.remote_may_migrate(&self.state);
+2174 let local_ip_may_migrate = self.side.is_client();
+2175 // If this packet could initiate a migration and we're a client or a server that
+2176 // forbids migration, drop the datagram. This could be relaxed to heuristically
+2177 // permit NAT-rebinding-like migration.
+2178 if let Some(known_path) = self.path_mut(path_id) {
+2179 if network_path.remote != known_path.network_path.remote && !remote_may_migrate {
+2180 trace!(
+2181 %path_id,
+2182 %network_path,
+2183 %known_path.network_path,
+2184 "discarding packet from unrecognized peer"
+2185 );
+2186 return true;
+2187 }
+2188
+2189 if known_path.network_path.local_ip.is_some()
+2190 && network_path.local_ip.is_some()
+2191 && known_path.network_path.local_ip != network_path.local_ip
+2192 && !local_ip_may_migrate
+2193 {
+2194 trace!(
+2195 %path_id,
+2196 %network_path,
+2197 %known_path.network_path,
+2198 "discarding packet sent to incorrect interface"
+2199 );
+2200 return true;
+2201 }
+2202 // If the datagram indicates that we've changed our local IP, we update it.
+2203 // This is alluded to in Section 5.2 of the Multipath RFC draft 18:
+2204 // https://www.ietf.org/archive/id/draft-ietf-quic-multipath-18.html#name-using-multiple-paths-on-the
+2205 // > Client receives the packet, recognizes a path migration, updates the source address of path 2 to 192.0.2.1.
+2206 if let Some(local_ip) = network_path.local_ip {
+2207 if known_path
+2208 .network_path
+2209 .local_ip
+2210 .is_some_and(|ip| ip != local_ip)
+2211 {
+2212 debug!(
+2213 %path_id,
+2214 %network_path,
+2215 %known_path.network_path,
+2216 "path's local address seemingly migrated"
+2217 );
+2218 }
+2219 // We update the address without path validation on the client side.
+2220 // https://www.ietf.org/archive/id/draft-ietf-quic-multipath-18.html#section-5.1
+2221 // > Servers observing a 4-tuple change will perform path validation (see Section 9 of [QUIC-TRANSPORT]).
+2222 // This sounds like it's *only* the server endpoints that do this.
+2223 // TODO(matheus23): We should still consider doing a proper migration on the client side in the future.
+2224 // For now, this preserves the behavior of this code pre 4-tuple tracking.
+2225 known_path.network_path.local_ip = Some(local_ip);
+2226 }
+2227 }
+2228 false
+2229 }
+2230
+2231 /// Process timer expirations
2232 ///
-2233 /// It is most efficient to call this immediately after the system clock reaches the latest
-2234 /// `Instant` that was output by `poll_timeout`; however spurious extra calls will simply
-2235 /// no-op and therefore are safe.
-2236 pub fn handle_timeout(&mut self, now: Instant) {
-2237 while let Some((timer, _time)) = self.timers.expire_before(now, &self.qlog) {
-2238 // TODO(@divma): remove `at` when the unicorn is born
-2239 trace!(?timer, at=?now, "timeout");
-2240 match timer {
-2241 Timer::Conn(timer) => match timer {
-2242 ConnTimer::Close => {
-2243 self.state.move_to_drained(None);
-2244 self.endpoint_events.push_back(EndpointEventInner::Drained);
-2245 }
-2246 ConnTimer::Idle => {
-2247 self.kill(ConnectionError::TimedOut);
-2248 }
-2249 ConnTimer::KeepAlive => {
-2250 trace!("sending keep-alive");
-2251 self.ping();
+2233 /// Executes protocol logic, potentially preparing signals (including application `Event`s,
+2234 /// `EndpointEvent`s and outgoing datagrams) that should be extracted through the relevant
+2235 /// methods.
+2236 ///
+2237 /// It is most efficient to call this immediately after the system clock reaches the latest
+2238 /// `Instant` that was output by `poll_timeout`; however spurious extra calls will simply
+2239 /// no-op and therefore are safe.
+2240 pub fn handle_timeout(&mut self, now: Instant) {
+2241 while let Some((timer, _time)) = self.timers.expire_before(now, &self.qlog) {
+2242 // TODO(@divma): remove `at` when the unicorn is born
+2243 trace!(?timer, at=?now, "timeout");
+2244 match timer {
+2245 Timer::Conn(timer) => match timer {
+2246 ConnTimer::Close => {
+2247 self.state.move_to_drained(None);
+2248 self.endpoint_events.push_back(EndpointEventInner::Drained);
+2249 }
+2250 ConnTimer::Idle => {
+2251 self.kill(ConnectionError::TimedOut);
2252 }
-2253 ConnTimer::KeyDiscard => {
-2254 self.crypto_state.discard_temporary_keys();
-2255 }
-2256 ConnTimer::PushNewCid => {
-2257 while let Some((path_id, when)) = self.next_cid_retirement() {
-2258 if when > now {
-2259 break;
-2260 }
-2261 match self.local_cid_state.get_mut(&path_id) {
-2262 None => error!(%path_id, "No local CID state for path"),
-2263 Some(cid_state) => {
-2264 // Update `retire_prior_to` field in NEW_CONNECTION_ID frame
-2265 let num_new_cid = cid_state.on_cid_timeout().into();
-2266 if !self.state.is_closed() {
-2267 trace!(
-2268 "push a new CID to peer RETIRE_PRIOR_TO field {}",
-2269 cid_state.retire_prior_to()
-2270 );
-2271 self.endpoint_events.push_back(
-2272 EndpointEventInner::NeedIdentifiers(
-2273 path_id,
-2274 now,
-2275 num_new_cid,
-2276 ),
-2277 );
-2278 }
-2279 }
-2280 }
-2281 }
-2282 }
-2283 },
-2284 // TODO: add path_id as span somehow
-2285 Timer::PerPath(path_id, timer) => {
-2286 let span = trace_span!("per-path timer fired", %path_id, ?timer);
-2287 let _guard = span.enter();
-2288 match timer {
-2289 PathTimer::PathIdle => {
-2290 if let Err(err) =
-2291 self.close_path_inner(now, path_id, PathAbandonReason::TimedOut)
-2292 {
-2293 warn!(?err, "failed closing path");
-2294 }
-2295 }
-2296
-2297 PathTimer::PathKeepAlive => {
-2298 trace!("sending keep-alive on path");
-2299 self.ping_path(path_id).ok();
-2300 }
-2301 PathTimer::LossDetection => {
-2302 self.on_loss_detection_timeout(now, path_id);
-2303 self.qlog.emit_recovery_metrics(
-2304 path_id,
-2305 &mut self.paths.get_mut(&path_id).unwrap().data,
-2306 now,
-2307 );
-2308 }
-2309 PathTimer::PathValidation => {
-2310 let Some(path) = self.paths.get_mut(&path_id) else {
-2311 continue;
-2312 };
-2313 self.timers.stop(
-2314 Timer::PerPath(path_id, PathTimer::PathChallengeLost),
-2315 self.qlog.with_time(now),
-2316 );
-2317 debug!("path validation failed");
-2318 if let Some((_, prev)) = path.prev.take() {
-2319 path.data = prev;
-2320 }
-2321 path.data.challenges_sent.clear();
-2322 path.data.send_new_challenge = false;
-2323 }
-2324 PathTimer::PathChallengeLost => {
-2325 let Some(path) = self.paths.get_mut(&path_id) else {
-2326 continue;
-2327 };
-2328 trace!("path challenge deemed lost");
-2329 path.data.send_new_challenge = true;
-2330 }
-2331 PathTimer::PathOpen => {
-2332 let Some(path) = self.paths.get_mut(&path_id) else {
-2333 continue;
-2334 };
-2335 path.data.challenges_sent.clear();
-2336 path.data.send_new_challenge = false;
-2337 self.timers.stop(
-2338 Timer::PerPath(path_id, PathTimer::PathChallengeLost),
-2339 self.qlog.with_time(now),
-2340 );
-2341 debug!("new path validation failed");
-2342 if let Err(err) = self.close_path_inner(
-2343 now,
-2344 path_id,
-2345 PathAbandonReason::ValidationFailed,
-2346 ) {
-2347 warn!(?err, "failed closing path");
-2348 }
-2349 }
-2350 PathTimer::Pacing => trace!("pacing timer expired"),
-2351 PathTimer::MaxAckDelay => {
-2352 trace!("max ack delay reached");
-2353 // This timer is only armed in the Data space
-2354 self.spaces[SpaceId::Data]
-2355 .for_path(path_id)
-2356 .pending_acks
-2357 .on_max_ack_delay_timeout()
-2358 }
-2359 PathTimer::DiscardPath => {
-2360 // The path was abandoned and 3*PTO has expired since. Clean up all
-2361 // remaining state and install stateless reset token.
-2362 self.timers.stop_per_path(path_id, self.qlog.with_time(now));
-2363 if let Some(local_cid_state) = self.local_cid_state.remove(&path_id) {
-2364 let (min_seq, max_seq) = local_cid_state.active_seq();
-2365 for seq in min_seq..=max_seq {
-2366 self.endpoint_events.push_back(
-2367 EndpointEventInner::RetireConnectionId(
-2368 now, path_id, seq, false,
-2369 ),
-2370 );
-2371 }
-2372 }
-2373 self.discard_path(path_id, now);
-2374 }
-2375 }
-2376 }
-2377 }
-2378 }
-2379 }
-2380
-2381 /// Close a connection immediately
-2382 ///
-2383 /// This does not ensure delivery of outstanding data. It is the application's responsibility to
-2384 /// call this only when all important communications have been completed, e.g. by calling
-2385 /// [`SendStream::finish`] on outstanding streams and waiting for the corresponding
-2386 /// [`StreamEvent::Finished`] event.
-2387 ///
-2388 /// If [`Streams::send_streams`] returns 0, all outstanding stream data has been
-2389 /// delivered. There may still be data from the peer that has not been received.
-2390 ///
-2391 /// [`StreamEvent::Finished`]: crate::StreamEvent::Finished
-2392 pub fn close(&mut self, now: Instant, error_code: VarInt, reason: Bytes) {
-2393 self.close_inner(
-2394 now,
-2395 Close::Application(frame::ApplicationClose { error_code, reason }),
-2396 )
-2397 }
-2398
-2399 /// Close the connection immediately, initiated by an API call.
-2400 ///
-2401 /// This will not produce a [`ConnectionLost`] event propagated by the
-2402 /// [`Connection::poll`] call, because the API call already propagated the error to the
-2403 /// user.
+2253 ConnTimer::KeepAlive => {
+2254 trace!("sending keep-alive");
+2255 self.ping();
+2256 }
+2257 ConnTimer::KeyDiscard => {
+2258 self.crypto_state.discard_temporary_keys();
+2259 }
+2260 ConnTimer::PushNewCid => {
+2261 while let Some((path_id, when)) = self.next_cid_retirement() {
+2262 if when > now {
+2263 break;
+2264 }
+2265 match self.local_cid_state.get_mut(&path_id) {
+2266 None => error!(%path_id, "No local CID state for path"),
+2267 Some(cid_state) => {
+2268 // Update `retire_prior_to` field in NEW_CONNECTION_ID frame
+2269 let num_new_cid = cid_state.on_cid_timeout().into();
+2270 if !self.state.is_closed() {
+2271 trace!(
+2272 "push a new CID to peer RETIRE_PRIOR_TO field {}",
+2273 cid_state.retire_prior_to()
+2274 );
+2275 self.endpoint_events.push_back(
+2276 EndpointEventInner::NeedIdentifiers(
+2277 path_id,
+2278 now,
+2279 num_new_cid,
+2280 ),
+2281 );
+2282 }
+2283 }
+2284 }
+2285 }
+2286 }
+2287 },
+2288 // TODO: add path_id as span somehow
+2289 Timer::PerPath(path_id, timer) => {
+2290 let span = trace_span!("per-path timer fired", %path_id, ?timer);
+2291 let _guard = span.enter();
+2292 match timer {
+2293 PathTimer::PathIdle => {
+2294 if let Err(err) =
+2295 self.close_path_inner(now, path_id, PathAbandonReason::TimedOut)
+2296 {
+2297 warn!(?err, "failed closing path");
+2298 }
+2299 }
+2300
+2301 PathTimer::PathKeepAlive => {
+2302 trace!("sending keep-alive on path");
+2303 self.ping_path(path_id).ok();
+2304 }
+2305 PathTimer::LossDetection => {
+2306 self.on_loss_detection_timeout(now, path_id);
+2307 self.qlog.emit_recovery_metrics(
+2308 path_id,
+2309 &mut self.paths.get_mut(&path_id).unwrap().data,
+2310 now,
+2311 );
+2312 }
+2313 PathTimer::PathValidation => {
+2314 let Some(path) = self.paths.get_mut(&path_id) else {
+2315 continue;
+2316 };
+2317 self.timers.stop(
+2318 Timer::PerPath(path_id, PathTimer::PathChallengeLost),
+2319 self.qlog.with_time(now),
+2320 );
+2321 debug!("path validation failed");
+2322 if let Some((_, prev)) = path.prev.take() {
+2323 path.data = prev;
+2324 }
+2325 path.data.challenges_sent.clear();
+2326 path.data.send_new_challenge = false;
+2327 }
+2328 PathTimer::PathChallengeLost => {
+2329 let Some(path) = self.paths.get_mut(&path_id) else {
+2330 continue;
+2331 };
+2332 trace!("path challenge deemed lost");
+2333 path.data.send_new_challenge = true;
+2334 }
+2335 PathTimer::PathOpen => {
+2336 let Some(path) = self.paths.get_mut(&path_id) else {
+2337 continue;
+2338 };
+2339 path.data.challenges_sent.clear();
+2340 path.data.send_new_challenge = false;
+2341 self.timers.stop(
+2342 Timer::PerPath(path_id, PathTimer::PathChallengeLost),
+2343 self.qlog.with_time(now),
+2344 );
+2345 debug!("new path validation failed");
+2346 if let Err(err) = self.close_path_inner(
+2347 now,
+2348 path_id,
+2349 PathAbandonReason::ValidationFailed,
+2350 ) {
+2351 warn!(?err, "failed closing path");
+2352 }
+2353 }
+2354 PathTimer::Pacing => trace!("pacing timer expired"),
+2355 PathTimer::MaxAckDelay => {
+2356 trace!("max ack delay reached");
+2357 // This timer is only armed in the Data space
+2358 self.spaces[SpaceId::Data]
+2359 .for_path(path_id)
+2360 .pending_acks
+2361 .on_max_ack_delay_timeout()
+2362 }
+2363 PathTimer::DiscardPath => {
+2364 // The path was abandoned and 3*PTO has expired since. Clean up all
+2365 // remaining state and install stateless reset token.
+2366 self.timers.stop_per_path(path_id, self.qlog.with_time(now));
+2367 if let Some(local_cid_state) = self.local_cid_state.remove(&path_id) {
+2368 let (min_seq, max_seq) = local_cid_state.active_seq();
+2369 for seq in min_seq..=max_seq {
+2370 self.endpoint_events.push_back(
+2371 EndpointEventInner::RetireConnectionId(
+2372 now, path_id, seq, false,
+2373 ),
+2374 );
+2375 }
+2376 }
+2377 self.discard_path(path_id, now);
+2378 }
+2379 }
+2380 }
+2381 }
+2382 }
+2383 }
+2384
+2385 /// Close a connection immediately
+2386 ///
+2387 /// This does not ensure delivery of outstanding data. It is the application's responsibility to
+2388 /// call this only when all important communications have been completed, e.g. by calling
+2389 /// [`SendStream::finish`] on outstanding streams and waiting for the corresponding
+2390 /// [`StreamEvent::Finished`] event.
+2391 ///
+2392 /// If [`Streams::send_streams`] returns 0, all outstanding stream data has been
+2393 /// delivered. There may still be data from the peer that has not been received.
+2394 ///
+2395 /// [`StreamEvent::Finished`]: crate::StreamEvent::Finished
+2396 pub fn close(&mut self, now: Instant, error_code: VarInt, reason: Bytes) {
+2397 self.close_inner(
+2398 now,
+2399 Close::Application(frame::ApplicationClose { error_code, reason }),
+2400 )
+2401 }
+2402
+2403 /// Close the connection immediately, initiated by an API call.
2404 ///
-2405 /// Not to be used when entering immediate close due to an internal state change based
-2406 /// on an event. See [`State::move_to_closed_local`] for details.
-2407 ///
-2408 /// This initiates immediate close from
-2409 /// <https://www.rfc-editor.org/rfc/rfc9000.html#section-10.2>, moving to the closed
-2410 /// state.
+2405 /// This will not produce a [`ConnectionLost`] event propagated by the
+2406 /// [`Connection::poll`] call, because the API call already propagated the error to the
+2407 /// user.
+2408 ///
+2409 /// Not to be used when entering immediate close due to an internal state change based
+2410 /// on an event. See [`State::move_to_closed_local`] for details.
2411 ///
-2412 /// [`ConnectionLost`]: crate::Event::ConnectionLost
-2413 /// [`Connection::poll`]: super::Connection::poll
-2414 fn close_inner(&mut self, now: Instant, reason: Close) {
-2415 let was_closed = self.state.is_closed();
-2416 if !was_closed {
-2417 self.close_common();
-2418 self.set_close_timer(now);
-2419 self.connection_close_pending = true;
-2420 self.state.move_to_closed_local(reason);
-2421 }
-2422 }
-2423
-2424 /// Control datagrams
-2425 pub fn datagrams(&mut self) -> Datagrams<'_> {
-2426 Datagrams { conn: self }
-2427 }
-2428
-2429 /// Returns connection statistics
-2430 pub fn stats(&mut self) -> ConnectionStats {
-2431 self.stats.clone()
-2432 }
-2433
-2434 /// Returns path statistics
-2435 pub fn path_stats(&mut self, path_id: PathId) -> Option<PathStats> {
-2436 let path = self.paths.get(&path_id)?;
-2437 let stats = self.path_stats.entry(path_id).or_default();
-2438 stats.rtt = path.data.rtt.get();
-2439 stats.cwnd = path.data.congestion.window();
-2440 stats.current_mtu = path.data.mtud.current_mtu();
-2441 Some(*stats)
-2442 }
-2443
-2444 /// Ping the remote endpoint
-2445 ///
-2446 /// Causes an ACK-eliciting packet to be transmitted on the connection.
-2447 pub fn ping(&mut self) {
-2448 // TODO(flub): This is very brute-force: it pings *all* the paths. Instead it would
-2449 // be nice if we could only send a single packet for this.
-2450 for path_data in self.spaces[self.highest_space].number_spaces.values_mut() {
-2451 path_data.ping_pending = true;
-2452 }
-2453 }
-2454
-2455 /// Ping the remote endpoint over a specific path
-2456 ///
-2457 /// Causes an ACK-eliciting packet to be transmitted on the path.
-2458 pub fn ping_path(&mut self, path: PathId) -> Result<(), ClosedPath> {
-2459 let path_data = self.spaces[self.highest_space]
-2460 .number_spaces
-2461 .get_mut(&path)
-2462 .ok_or(ClosedPath { _private: () })?;
-2463 path_data.ping_pending = true;
-2464 Ok(())
-2465 }
-2466
-2467 /// Update traffic keys spontaneously
-2468 ///
-2469 /// This can be useful for testing key updates, as they otherwise only happen infrequently.
-2470 pub fn force_key_update(&mut self) {
-2471 if !self.state.is_established() {
-2472 debug!("ignoring forced key update in illegal state");
-2473 return;
-2474 }
-2475 if self.crypto_state.prev_crypto.is_some() {
-2476 // We already just updated, or are currently updating, the keys. Concurrent key updates
-2477 // are illegal.
-2478 debug!("ignoring redundant forced key update");
-2479 return;
-2480 }
-2481 self.crypto_state.update_keys(None, false);
-2482 }
-2483
-2484 /// Get a session reference
-2485 pub fn crypto_session(&self) -> &dyn crypto::Session {
-2486 self.crypto_state.session.as_ref()
-2487 }
-2488
-2489 /// Whether the connection is in the process of being established
-2490 ///
-2491 /// If this returns `false`, the connection may be either established or closed, signaled by the
-2492 /// emission of a `Connected` or `ConnectionLost` message respectively.
-2493 pub fn is_handshaking(&self) -> bool {
-2494 self.state.is_handshake()
-2495 }
-2496
-2497 /// Whether the connection is closed
-2498 ///
-2499 /// Closed connections cannot transport any further data. A connection becomes closed when
-2500 /// either peer application intentionally closes it, or when either transport layer detects an
-2501 /// error such as a time-out or certificate validation failure.
+2412 /// This initiates immediate close from
+2413 /// <https://www.rfc-editor.org/rfc/rfc9000.html#section-10.2>, moving to the closed
+2414 /// state.
+2415 ///
+2416 /// [`ConnectionLost`]: crate::Event::ConnectionLost
+2417 /// [`Connection::poll`]: super::Connection::poll
+2418 fn close_inner(&mut self, now: Instant, reason: Close) {
+2419 let was_closed = self.state.is_closed();
+2420 if !was_closed {
+2421 self.close_common();
+2422 self.set_close_timer(now);
+2423 self.connection_close_pending = true;
+2424 self.state.move_to_closed_local(reason);
+2425 }
+2426 }
+2427
+2428 /// Control datagrams
+2429 pub fn datagrams(&mut self) -> Datagrams<'_> {
+2430 Datagrams { conn: self }
+2431 }
+2432
+2433 /// Returns connection statistics
+2434 pub fn stats(&mut self) -> ConnectionStats {
+2435 self.stats.clone()
+2436 }
+2437
+2438 /// Returns path statistics
+2439 pub fn path_stats(&mut self, path_id: PathId) -> Option<PathStats> {
+2440 let path = self.paths.get(&path_id)?;
+2441 let stats = self.path_stats.entry(path_id).or_default();
+2442 stats.rtt = path.data.rtt.get();
+2443 stats.cwnd = path.data.congestion.window();
+2444 stats.current_mtu = path.data.mtud.current_mtu();
+2445 Some(*stats)
+2446 }
+2447
+2448 /// Ping the remote endpoint
+2449 ///
+2450 /// Causes an ACK-eliciting packet to be transmitted on the connection.
+2451 pub fn ping(&mut self) {
+2452 // TODO(flub): This is very brute-force: it pings *all* the paths. Instead it would
+2453 // be nice if we could only send a single packet for this.
+2454 for path_data in self.spaces[self.highest_space].number_spaces.values_mut() {
+2455 path_data.ping_pending = true;
+2456 }
+2457 }
+2458
+2459 /// Ping the remote endpoint over a specific path
+2460 ///
+2461 /// Causes an ACK-eliciting packet to be transmitted on the path.
+2462 pub fn ping_path(&mut self, path: PathId) -> Result<(), ClosedPath> {
+2463 let path_data = self.spaces[self.highest_space]
+2464 .number_spaces
+2465 .get_mut(&path)
+2466 .ok_or(ClosedPath { _private: () })?;
+2467 path_data.ping_pending = true;
+2468 Ok(())
+2469 }
+2470
+2471 /// Update traffic keys spontaneously
+2472 ///
+2473 /// This can be useful for testing key updates, as they otherwise only happen infrequently.
+2474 pub fn force_key_update(&mut self) {
+2475 if !self.state.is_established() {
+2476 debug!("ignoring forced key update in illegal state");
+2477 return;
+2478 }
+2479 if self.crypto_state.prev_crypto.is_some() {
+2480 // We already just updated, or are currently updating, the keys. Concurrent key updates
+2481 // are illegal.
+2482 debug!("ignoring redundant forced key update");
+2483 return;
+2484 }
+2485 self.crypto_state.update_keys(None, false);
+2486 }
+2487
+2488 /// Get a session reference
+2489 pub fn crypto_session(&self) -> &dyn crypto::Session {
+2490 self.crypto_state.session.as_ref()
+2491 }
+2492
+2493 /// Whether the connection is in the process of being established
+2494 ///
+2495 /// If this returns `false`, the connection may be either established or closed, signaled by the
+2496 /// emission of a `Connected` or `ConnectionLost` message respectively.
+2497 pub fn is_handshaking(&self) -> bool {
+2498 self.state.is_handshake()
+2499 }
+2500
+2501 /// Whether the connection is closed
2502 ///
-2503 /// A `ConnectionLost` event is emitted with details when the connection becomes closed.
-2504 pub fn is_closed(&self) -> bool {
-2505 self.state.is_closed()
-2506 }
-2507
-2508 /// Whether there is no longer any need to keep the connection around
-2509 ///
-2510 /// Closed connections become drained after a brief timeout to absorb any remaining in-flight
-2511 /// packets from the peer. All drained connections have been closed.
-2512 pub fn is_drained(&self) -> bool {
-2513 self.state.is_drained()
-2514 }
-2515
-2516 /// For clients, if the peer accepted the 0-RTT data packets
-2517 ///
-2518 /// The value is meaningless until after the handshake completes.
-2519 pub fn accepted_0rtt(&self) -> bool {
-2520 self.crypto_state.accepted_0rtt
-2521 }
-2522
-2523 /// Whether 0-RTT is/was possible during the handshake
-2524 pub fn has_0rtt(&self) -> bool {
-2525 self.crypto_state.zero_rtt_enabled
-2526 }
-2527
-2528 /// Whether there are any pending retransmits
-2529 pub fn has_pending_retransmits(&self) -> bool {
-2530 !self.spaces[SpaceId::Data].pending.is_empty(&self.streams)
-2531 }
-2532
-2533 /// Look up whether we're the client or server of this Connection
-2534 pub fn side(&self) -> Side {
-2535 self.side.side()
-2536 }
-2537
-2538 /// Get the address observed by the remote over the given path
-2539 pub fn path_observed_address(&self, path_id: PathId) -> Result<Option<SocketAddr>, ClosedPath> {
-2540 self.path(path_id)
-2541 .map(|path_data| {
-2542 path_data
-2543 .last_observed_addr_report
-2544 .as_ref()
-2545 .map(|observed| observed.socket_addr())
-2546 })
-2547 .ok_or(ClosedPath { _private: () })
-2548 }
-2549
-2550 /// Current best estimate of this connection's latency (round-trip-time)
-2551 pub fn rtt(&self, path_id: PathId) -> Option<Duration> {
-2552 self.path(path_id).map(|d| d.rtt.get())
-2553 }
-2554
-2555 /// Current state of this connection's congestion controller, for debugging purposes
-2556 pub fn congestion_state(&self, path_id: PathId) -> Option<&dyn Controller> {
-2557 self.path(path_id).map(|d| d.congestion.as_ref())
-2558 }
-2559
-2560 /// Modify the number of remotely initiated streams that may be concurrently open
-2561 ///
-2562 /// No streams may be opened by the peer unless fewer than `count` are already open. Large
-2563 /// `count`s increase both minimum and worst-case memory consumption.
-2564 pub fn set_max_concurrent_streams(&mut self, dir: Dir, count: VarInt) {
-2565 self.streams.set_max_concurrent(dir, count);
-2566 // If the limit was reduced, then a flow control update previously deemed insignificant may
-2567 // now be significant.
-2568 let pending = &mut self.spaces[SpaceId::Data].pending;
-2569 self.streams.queue_max_stream_id(pending);
-2570 }
-2571
-2572 /// Modify the number of open paths allowed when multipath is enabled
-2573 ///
-2574 /// When reducing the number of concurrent paths this will only affect delaying sending
-2575 /// new MAX_PATH_ID frames until fewer than this number of paths are possible. To
-2576 /// actively reduce paths they must be closed using [`Connection::close_path`], which
-2577 /// can also be used to close not-yet-opened paths.
-2578 ///
-2579 /// If multipath is not negotiated (see the [`TransportConfig`]) this can not enable
-2580 /// multipath and will fail.
-2581 pub fn set_max_concurrent_paths(
-2582 &mut self,
-2583 now: Instant,
-2584 count: NonZeroU32,
-2585 ) -> Result<(), MultipathNotNegotiated> {
-2586 if !self.is_multipath_negotiated() {
-2587 return Err(MultipathNotNegotiated { _private: () });
-2588 }
-2589 self.max_concurrent_paths = count;
-2590
-2591 let in_use_count = self
-2592 .local_max_path_id
-2593 .next()
-2594 .saturating_sub(self.abandoned_paths.len() as u32)
-2595 .as_u32();
-2596 let extra_needed = count.get().saturating_sub(in_use_count);
-2597 let new_max_path_id = self.local_max_path_id.saturating_add(extra_needed);
-2598
-2599 self.set_max_path_id(now, new_max_path_id);
-2600
-2601 Ok(())
-2602 }
-2603
-2604 /// If needed, issues a new MAX_PATH_ID frame and new CIDs for any newly allowed paths
-2605 fn set_max_path_id(&mut self, now: Instant, max_path_id: PathId) {
-2606 if max_path_id <= self.local_max_path_id {
-2607 return;
-2608 }
-2609
-2610 self.local_max_path_id = max_path_id;
-2611 self.spaces[SpaceId::Data].pending.max_path_id = true;
-2612
-2613 self.issue_first_path_cids(now);
-2614 }
-2615
-2616 /// Current number of remotely initiated streams that may be concurrently open
-2617 ///
-2618 /// If the target for this limit is reduced using [`set_max_concurrent_streams`](Self::set_max_concurrent_streams),
-2619 /// it will not change immediately, even if fewer streams are open. Instead, it will
-2620 /// decrement by one for each time a remotely initiated stream of matching directionality is closed.
-2621 pub fn max_concurrent_streams(&self, dir: Dir) -> u64 {
-2622 self.streams.max_concurrent(dir)
-2623 }
-2624
-2625 /// See [`TransportConfig::send_window()`]
-2626 pub fn set_send_window(&mut self, send_window: u64) {
-2627 self.streams.set_send_window(send_window);
-2628 }
-2629
-2630 /// See [`TransportConfig::receive_window()`]
-2631 pub fn set_receive_window(&mut self, receive_window: VarInt) {
-2632 if self.streams.set_receive_window(receive_window) {
-2633 self.spaces[SpaceId::Data].pending.max_data = true;
-2634 }
-2635 }
-2636
-2637 /// Whether the Multipath for QUIC extension is enabled.
-2638 ///
-2639 /// Multipath is only enabled after the handshake is completed and if it was enabled by both
-2640 /// peers.
-2641 pub fn is_multipath_negotiated(&self) -> bool {
-2642 !self.is_handshaking()
-2643 && self.config.max_concurrent_multipath_paths.is_some()
-2644 && self.peer_params.initial_max_path_id.is_some()
-2645 }
-2646
-2647 fn on_ack_received(
-2648 &mut self,
-2649 now: Instant,
-2650 space: SpaceId,
-2651 ack: frame::Ack,
-2652 ) -> Result<(), TransportError> {
-2653 // All ACKs are referencing path 0
-2654 let path = PathId::ZERO;
-2655 self.inner_on_ack_received(now, space, path, ack)
-2656 }
-2657
-2658 fn on_path_ack_received(
-2659 &mut self,
-2660 now: Instant,
-2661 space: SpaceId,
-2662 path_ack: frame::PathAck,
-2663 ) -> Result<(), TransportError> {
-2664 let (ack, path) = path_ack.into_ack();
-2665 self.inner_on_ack_received(now, space, path, ack)
-2666 }
-2667
-2668 /// Handles an ACK frame acknowledging packets sent on *path*.
-2669 fn inner_on_ack_received(
-2670 &mut self,
-2671 now: Instant,
-2672 space: SpaceId,
-2673 path: PathId,
-2674 ack: frame::Ack,
-2675 ) -> Result<(), TransportError> {
-2676 if self.abandoned_paths.contains(&path) {
-2677 // See also https://www.ietf.org/archive/id/draft-ietf-quic-multipath-17.html#section-3.4.3-3
-2678 // > PATH_ACK frames received with an abandoned path ID are silently ignored, as specified in Section 4.
-2679 trace!("silently ignoring PATH_ACK on abandoned path");
-2680 return Ok(());
-2681 }
-2682 if ack.largest >= self.spaces[space].for_path(path).next_packet_number {
-2683 return Err(TransportError::PROTOCOL_VIOLATION("unsent packet acked"));
-2684 }
-2685 let new_largest = {
-2686 let space = &mut self.spaces[space].for_path(path);
-2687 if space.largest_acked_packet.is_none_or(|pn| ack.largest > pn) {
-2688 space.largest_acked_packet = Some(ack.largest);
-2689 if let Some(info) = space.sent_packets.get(ack.largest) {
-2690 // This should always succeed, but a misbehaving peer might ACK a packet we
-2691 // haven't sent. At worst, that will result in us spuriously reducing the
-2692 // congestion window.
-2693 space.largest_acked_packet_sent = info.time_sent;
-2694 }
-2695 true
-2696 } else {
-2697 false
-2698 }
-2699 };
-2700
-2701 if self.detect_spurious_loss(&ack, space, path) {
-2702 self.path_data_mut(path)
-2703 .congestion
-2704 .on_spurious_congestion_event();
-2705 }
-2706
-2707 // Avoid DoS from unreasonably huge ack ranges by filtering out just the new acks.
-2708 let mut newly_acked = ArrayRangeSet::new();
-2709 for range in ack.iter() {
-2710 self.spaces[space].for_path(path).check_ack(range.clone())?;
-2711 for (pn, _) in self.spaces[space]
-2712 .for_path(path)
-2713 .sent_packets
-2714 .iter_range(range)
-2715 {
-2716 newly_acked.insert_one(pn);
-2717 }
-2718 }
-2719
-2720 if newly_acked.is_empty() {
-2721 return Ok(());
+2503 /// Closed connections cannot transport any further data. A connection becomes closed when
+2504 /// either peer application intentionally closes it, or when either transport layer detects an
+2505 /// error such as a time-out or certificate validation failure.
+2506 ///
+2507 /// A `ConnectionLost` event is emitted with details when the connection becomes closed.
+2508 pub fn is_closed(&self) -> bool {
+2509 self.state.is_closed()
+2510 }
+2511
+2512 /// Whether there is no longer any need to keep the connection around
+2513 ///
+2514 /// Closed connections become drained after a brief timeout to absorb any remaining in-flight
+2515 /// packets from the peer. All drained connections have been closed.
+2516 pub fn is_drained(&self) -> bool {
+2517 self.state.is_drained()
+2518 }
+2519
+2520 /// For clients, if the peer accepted the 0-RTT data packets
+2521 ///
+2522 /// The value is meaningless until after the handshake completes.
+2523 pub fn accepted_0rtt(&self) -> bool {
+2524 self.crypto_state.accepted_0rtt
+2525 }
+2526
+2527 /// Whether 0-RTT is/was possible during the handshake
+2528 pub fn has_0rtt(&self) -> bool {
+2529 self.crypto_state.zero_rtt_enabled
+2530 }
+2531
+2532 /// Whether there are any pending retransmits
+2533 pub fn has_pending_retransmits(&self) -> bool {
+2534 !self.spaces[SpaceId::Data].pending.is_empty(&self.streams)
+2535 }
+2536
+2537 /// Look up whether we're the client or server of this Connection
+2538 pub fn side(&self) -> Side {
+2539 self.side.side()
+2540 }
+2541
+2542 /// Get the address observed by the remote over the given path
+2543 pub fn path_observed_address(&self, path_id: PathId) -> Result<Option<SocketAddr>, ClosedPath> {
+2544 self.path(path_id)
+2545 .map(|path_data| {
+2546 path_data
+2547 .last_observed_addr_report
+2548 .as_ref()
+2549 .map(|observed| observed.socket_addr())
+2550 })
+2551 .ok_or(ClosedPath { _private: () })
+2552 }
+2553
+2554 /// Current best estimate of this connection's latency (round-trip-time)
+2555 pub fn rtt(&self, path_id: PathId) -> Option<Duration> {
+2556 self.path(path_id).map(|d| d.rtt.get())
+2557 }
+2558
+2559 /// Current state of this connection's congestion controller, for debugging purposes
+2560 pub fn congestion_state(&self, path_id: PathId) -> Option<&dyn Controller> {
+2561 self.path(path_id).map(|d| d.congestion.as_ref())
+2562 }
+2563
+2564 /// Modify the number of remotely initiated streams that may be concurrently open
+2565 ///
+2566 /// No streams may be opened by the peer unless fewer than `count` are already open. Large
+2567 /// `count`s increase both minimum and worst-case memory consumption.
+2568 pub fn set_max_concurrent_streams(&mut self, dir: Dir, count: VarInt) {
+2569 self.streams.set_max_concurrent(dir, count);
+2570 // If the limit was reduced, then a flow control update previously deemed insignificant may
+2571 // now be significant.
+2572 let pending = &mut self.spaces[SpaceId::Data].pending;
+2573 self.streams.queue_max_stream_id(pending);
+2574 }
+2575
+2576 /// Modify the number of open paths allowed when multipath is enabled
+2577 ///
+2578 /// When reducing the number of concurrent paths this will only affect delaying sending
+2579 /// new MAX_PATH_ID frames until fewer than this number of paths are possible. To
+2580 /// actively reduce paths they must be closed using [`Connection::close_path`], which
+2581 /// can also be used to close not-yet-opened paths.
+2582 ///
+2583 /// If multipath is not negotiated (see the [`TransportConfig`]) this can not enable
+2584 /// multipath and will fail.
+2585 pub fn set_max_concurrent_paths(
+2586 &mut self,
+2587 now: Instant,
+2588 count: NonZeroU32,
+2589 ) -> Result<(), MultipathNotNegotiated> {
+2590 if !self.is_multipath_negotiated() {
+2591 return Err(MultipathNotNegotiated { _private: () });
+2592 }
+2593 self.max_concurrent_paths = count;
+2594
+2595 let in_use_count = self
+2596 .local_max_path_id
+2597 .next()
+2598 .saturating_sub(self.abandoned_paths.len() as u32)
+2599 .as_u32();
+2600 let extra_needed = count.get().saturating_sub(in_use_count);
+2601 let new_max_path_id = self.local_max_path_id.saturating_add(extra_needed);
+2602
+2603 self.set_max_path_id(now, new_max_path_id);
+2604
+2605 Ok(())
+2606 }
+2607
+2608 /// If needed, issues a new MAX_PATH_ID frame and new CIDs for any newly allowed paths
+2609 fn set_max_path_id(&mut self, now: Instant, max_path_id: PathId) {
+2610 if max_path_id <= self.local_max_path_id {
+2611 return;
+2612 }
+2613
+2614 self.local_max_path_id = max_path_id;
+2615 self.spaces[SpaceId::Data].pending.max_path_id = true;
+2616
+2617 self.issue_first_path_cids(now);
+2618 }
+2619
+2620 /// Current number of remotely initiated streams that may be concurrently open
+2621 ///
+2622 /// If the target for this limit is reduced using [`set_max_concurrent_streams`](Self::set_max_concurrent_streams),
+2623 /// it will not change immediately, even if fewer streams are open. Instead, it will
+2624 /// decrement by one for each time a remotely initiated stream of matching directionality is closed.
+2625 pub fn max_concurrent_streams(&self, dir: Dir) -> u64 {
+2626 self.streams.max_concurrent(dir)
+2627 }
+2628
+2629 /// See [`TransportConfig::send_window()`]
+2630 pub fn set_send_window(&mut self, send_window: u64) {
+2631 self.streams.set_send_window(send_window);
+2632 }
+2633
+2634 /// See [`TransportConfig::receive_window()`]
+2635 pub fn set_receive_window(&mut self, receive_window: VarInt) {
+2636 if self.streams.set_receive_window(receive_window) {
+2637 self.spaces[SpaceId::Data].pending.max_data = true;
+2638 }
+2639 }
+2640
+2641 /// Whether the Multipath for QUIC extension is enabled.
+2642 ///
+2643 /// Multipath is only enabled after the handshake is completed and if it was enabled by both
+2644 /// peers.
+2645 pub fn is_multipath_negotiated(&self) -> bool {
+2646 !self.is_handshaking()
+2647 && self.config.max_concurrent_multipath_paths.is_some()
+2648 && self.peer_params.initial_max_path_id.is_some()
+2649 }
+2650
+2651 fn on_ack_received(
+2652 &mut self,
+2653 now: Instant,
+2654 space: SpaceId,
+2655 ack: frame::Ack,
+2656 ) -> Result<(), TransportError> {
+2657 // All ACKs are referencing path 0
+2658 let path = PathId::ZERO;
+2659 self.inner_on_ack_received(now, space, path, ack)
+2660 }
+2661
+2662 fn on_path_ack_received(
+2663 &mut self,
+2664 now: Instant,
+2665 space: SpaceId,
+2666 path_ack: frame::PathAck,
+2667 ) -> Result<(), TransportError> {
+2668 let (ack, path) = path_ack.into_ack();
+2669 self.inner_on_ack_received(now, space, path, ack)
+2670 }
+2671
+2672 /// Handles an ACK frame acknowledging packets sent on *path*.
+2673 fn inner_on_ack_received(
+2674 &mut self,
+2675 now: Instant,
+2676 space: SpaceId,
+2677 path: PathId,
+2678 ack: frame::Ack,
+2679 ) -> Result<(), TransportError> {
+2680 if self.abandoned_paths.contains(&path) {
+2681 // See also https://www.ietf.org/archive/id/draft-ietf-quic-multipath-17.html#section-3.4.3-3
+2682 // > PATH_ACK frames received with an abandoned path ID are silently ignored, as specified in Section 4.
+2683 trace!("silently ignoring PATH_ACK on abandoned path");
+2684 return Ok(());
+2685 }
+2686 if ack.largest >= self.spaces[space].for_path(path).next_packet_number {
+2687 return Err(TransportError::PROTOCOL_VIOLATION("unsent packet acked"));
+2688 }
+2689 let new_largest = {
+2690 let space = &mut self.spaces[space].for_path(path);
+2691 if space.largest_acked_packet.is_none_or(|pn| ack.largest > pn) {
+2692 space.largest_acked_packet = Some(ack.largest);
+2693 if let Some(info) = space.sent_packets.get(ack.largest) {
+2694 // This should always succeed, but a misbehaving peer might ACK a packet we
+2695 // haven't sent. At worst, that will result in us spuriously reducing the
+2696 // congestion window.
+2697 space.largest_acked_packet_sent = info.time_sent;
+2698 }
+2699 true
+2700 } else {
+2701 false
+2702 }
+2703 };
+2704
+2705 if self.detect_spurious_loss(&ack, space, path) {
+2706 self.path_data_mut(path)
+2707 .congestion
+2708 .on_spurious_congestion_event();
+2709 }
+2710
+2711 // Avoid DoS from unreasonably huge ack ranges by filtering out just the new acks.
+2712 let mut newly_acked = ArrayRangeSet::new();
+2713 for range in ack.iter() {
+2714 self.spaces[space].for_path(path).check_ack(range.clone())?;
+2715 for (pn, _) in self.spaces[space]
+2716 .for_path(path)
+2717 .sent_packets
+2718 .iter_range(range)
+2719 {
+2720 newly_acked.insert_one(pn);
+2721 }
2722 }
2723
-2724 let mut ack_eliciting_acked = false;
-2725 for packet in newly_acked.elts() {
-2726 if let Some(info) = self.spaces[space].for_path(path).take(packet) {
-2727 for (acked_path_id, acked_pn) in info.largest_acked.iter() {
-2728 // Assume ACKs for all packets below the largest acknowledged in
-2729 // `packet` have been received. This can cause the peer to spuriously
-2730 // retransmit if some of our earlier ACKs were lost, but allows for
-2731 // simpler state tracking. See discussion at
-2732 // https://www.rfc-editor.org/rfc/rfc9000.html#name-limiting-ranges-by-tracking
-2733 if let Some(pns) = self.spaces[space].path_space_mut(*acked_path_id) {
-2734 pns.pending_acks.subtract_below(*acked_pn);
-2735 }
-2736 }
-2737 ack_eliciting_acked |= info.ack_eliciting;
-2738
-2739 // Notify MTU discovery that a packet was acked, because it might be an MTU probe
-2740 let path_data = self.path_data_mut(path);
-2741 let mtu_updated = path_data.mtud.on_acked(space, packet, info.size);
-2742 if mtu_updated {
-2743 path_data
-2744 .congestion
-2745 .on_mtu_update(path_data.mtud.current_mtu());
-2746 }
-2747
-2748 // Notify ack frequency that a packet was acked, because it might contain an ACK_FREQUENCY frame
-2749 self.ack_frequency.on_acked(path, packet);
-2750
-2751 self.on_packet_acked(now, path, info);
-2752 }
-2753 }
+2724 if newly_acked.is_empty() {
+2725 return Ok(());
+2726 }
+2727
+2728 let mut ack_eliciting_acked = false;
+2729 for packet in newly_acked.elts() {
+2730 if let Some(info) = self.spaces[space].for_path(path).take(packet) {
+2731 for (acked_path_id, acked_pn) in info.largest_acked.iter() {
+2732 // Assume ACKs for all packets below the largest acknowledged in
+2733 // `packet` have been received. This can cause the peer to spuriously
+2734 // retransmit if some of our earlier ACKs were lost, but allows for
+2735 // simpler state tracking. See discussion at
+2736 // https://www.rfc-editor.org/rfc/rfc9000.html#name-limiting-ranges-by-tracking
+2737 if let Some(pns) = self.spaces[space].path_space_mut(*acked_path_id) {
+2738 pns.pending_acks.subtract_below(*acked_pn);
+2739 }
+2740 }
+2741 ack_eliciting_acked |= info.ack_eliciting;
+2742
+2743 // Notify MTU discovery that a packet was acked, because it might be an MTU probe
+2744 let path_data = self.path_data_mut(path);
+2745 let mtu_updated = path_data.mtud.on_acked(space, packet, info.size);
+2746 if mtu_updated {
+2747 path_data
+2748 .congestion
+2749 .on_mtu_update(path_data.mtud.current_mtu());
+2750 }
+2751
+2752 // Notify ack frequency that a packet was acked, because it might contain an ACK_FREQUENCY frame
+2753 self.ack_frequency.on_acked(path, packet);
2754
-2755 let largest_ackd = self.spaces[space].for_path(path).largest_acked_packet;
-2756 let app_limited = self.app_limited;
-2757 let path_data = self.path_data_mut(path);
-2758 let in_flight = path_data.in_flight.bytes;
-2759
-2760 path_data
-2761 .congestion
-2762 .on_end_acks(now, in_flight, app_limited, largest_ackd);
+2755 self.on_packet_acked(now, path, info);
+2756 }
+2757 }
+2758
+2759 let largest_ackd = self.spaces[space].for_path(path).largest_acked_packet;
+2760 let app_limited = self.app_limited;
+2761 let path_data = self.path_data_mut(path);
+2762 let in_flight = path_data.in_flight.bytes;
2763
-2764 if new_largest && ack_eliciting_acked {
-2765 let ack_delay = if space != SpaceId::Data {
-2766 Duration::from_micros(0)
-2767 } else {
-2768 cmp::min(
-2769 self.ack_frequency.peer_max_ack_delay,
-2770 Duration::from_micros(ack.delay << self.peer_params.ack_delay_exponent.0),
-2771 )
-2772 };
-2773 let rtt = now.saturating_duration_since(
-2774 self.spaces[space].for_path(path).largest_acked_packet_sent,
-2775 );
-2776
-2777 let next_pn = self.spaces[space].for_path(path).next_packet_number;
-2778 let path_data = self.path_data_mut(path);
-2779 // TODO(@divma): should be a method of path, should be contained in a single place
-2780 path_data.rtt.update(ack_delay, rtt);
-2781 if path_data.first_packet_after_rtt_sample.is_none() {
-2782 path_data.first_packet_after_rtt_sample = Some((space, next_pn));
-2783 }
-2784 }
-2785
-2786 // Must be called before crypto/pto_count are clobbered
-2787 self.detect_lost_packets(now, space, path, true);
-2788
-2789 if self.peer_completed_address_validation(path) {
-2790 self.path_data_mut(path).pto_count = 0;
-2791 }
+2764 path_data
+2765 .congestion
+2766 .on_end_acks(now, in_flight, app_limited, largest_ackd);
+2767
+2768 if new_largest && ack_eliciting_acked {
+2769 let ack_delay = if space != SpaceId::Data {
+2770 Duration::from_micros(0)
+2771 } else {
+2772 cmp::min(
+2773 self.ack_frequency.peer_max_ack_delay,
+2774 Duration::from_micros(ack.delay << self.peer_params.ack_delay_exponent.0),
+2775 )
+2776 };
+2777 let rtt = now.saturating_duration_since(
+2778 self.spaces[space].for_path(path).largest_acked_packet_sent,
+2779 );
+2780
+2781 let next_pn = self.spaces[space].for_path(path).next_packet_number;
+2782 let path_data = self.path_data_mut(path);
+2783 // TODO(@divma): should be a method of path, should be contained in a single place
+2784 path_data.rtt.update(ack_delay, rtt);
+2785 if path_data.first_packet_after_rtt_sample.is_none() {
+2786 path_data.first_packet_after_rtt_sample = Some((space, next_pn));
+2787 }
+2788 }
+2789
+2790 // Must be called before crypto/pto_count are clobbered
+2791 self.detect_lost_packets(now, space, path, true);
2792
-2793 // Explicit congestion notification
-2794 // TODO(@divma): this code is a good example of logic that should be contained in a single
-2795 // place but it's split between the path data and the packet number space data, we should
-2796 // find a way to make this work without two lookups
-2797 if self.path_data(path).sending_ecn {
-2798 if let Some(ecn) = ack.ecn {
-2799 // We only examine ECN counters from ACKs that we are certain we received in transmit
-2800 // order, allowing us to compute an increase in ECN counts to compare against the number
-2801 // of newly acked packets that remains well-defined in the presence of arbitrary packet
-2802 // reordering.
-2803 if new_largest {
-2804 let sent = self.spaces[space].for_path(path).largest_acked_packet_sent;
-2805 self.process_ecn(now, space, path, newly_acked.len() as u64, ecn, sent);
-2806 }
-2807 } else {
-2808 // We always start out sending ECN, so any ack that doesn't acknowledge it disables it.
-2809 debug!("ECN not acknowledged by peer");
-2810 self.path_data_mut(path).sending_ecn = false;
-2811 }
-2812 }
-2813
-2814 self.set_loss_detection_timer(now, path);
-2815 Ok(())
-2816 }
+2793 if self.peer_completed_address_validation(path) {
+2794 self.path_data_mut(path).pto_count = 0;
+2795 }
+2796
+2797 // Explicit congestion notification
+2798 // TODO(@divma): this code is a good example of logic that should be contained in a single
+2799 // place but it's split between the path data and the packet number space data, we should
+2800 // find a way to make this work without two lookups
+2801 if self.path_data(path).sending_ecn {
+2802 if let Some(ecn) = ack.ecn {
+2803 // We only examine ECN counters from ACKs that we are certain we received in transmit
+2804 // order, allowing us to compute an increase in ECN counts to compare against the number
+2805 // of newly acked packets that remains well-defined in the presence of arbitrary packet
+2806 // reordering.
+2807 if new_largest {
+2808 let sent = self.spaces[space].for_path(path).largest_acked_packet_sent;
+2809 self.process_ecn(now, space, path, newly_acked.len() as u64, ecn, sent);
+2810 }
+2811 } else {
+2812 // We always start out sending ECN, so any ack that doesn't acknowledge it disables it.
+2813 debug!("ECN not acknowledged by peer");
+2814 self.path_data_mut(path).sending_ecn = false;
+2815 }
+2816 }
2817
-2818 fn detect_spurious_loss(&mut self, ack: &frame::Ack, space: SpaceId, path: PathId) -> bool {
-2819 let lost_packets = &mut self.spaces[space].for_path(path).lost_packets;
-2820
-2821 if lost_packets.is_empty() {
-2822 return false;
-2823 }
+2818 self.set_loss_detection_timer(now, path);
+2819 Ok(())
+2820 }
+2821
+2822 fn detect_spurious_loss(&mut self, ack: &frame::Ack, space: SpaceId, path: PathId) -> bool {
+2823 let lost_packets = &mut self.spaces[space].for_path(path).lost_packets;
2824
-2825 for range in ack.iter() {
-2826 let spurious_losses: Vec<u64> = lost_packets
-2827 .iter_range(range.clone())
-2828 .map(|(pn, _info)| pn)
-2829 .collect();
-2830
-2831 for pn in spurious_losses {
-2832 lost_packets.remove(pn);
-2833 }
-2834 }
-2835
-2836 // If this ACK frame acknowledged all deemed lost packets,
-2837 // then we have raised a spurious congestion event in the past.
-2838 // We cannot conclude when there are remaining packets,
-2839 // but future ACK frames might indicate a spurious loss detection.
-2840 lost_packets.is_empty()
-2841 }
-2842
-2843 /// Drain lost packets that we reasonably think will never arrive
-2844 ///
-2845 /// The current criterion is copied from `msquic`:
-2846 /// discard packets that were sent earlier than 2 probe timeouts ago.
-2847 fn drain_lost_packets(&mut self, now: Instant, space: SpaceId, path: PathId) {
-2848 let two_pto = 2 * self.path_data(path).rtt.pto_base();
-2849
-2850 let lost_packets = &mut self.spaces[space].for_path(path).lost_packets;
-2851 lost_packets.retain(|_pn, info| now.saturating_duration_since(info.time_sent) <= two_pto);
-2852 }
+2825 if lost_packets.is_empty() {
+2826 return false;
+2827 }
+2828
+2829 for range in ack.iter() {
+2830 let spurious_losses: Vec<u64> = lost_packets
+2831 .iter_range(range.clone())
+2832 .map(|(pn, _info)| pn)
+2833 .collect();
+2834
+2835 for pn in spurious_losses {
+2836 lost_packets.remove(pn);
+2837 }
+2838 }
+2839
+2840 // If this ACK frame acknowledged all deemed lost packets,
+2841 // then we have raised a spurious congestion event in the past.
+2842 // We cannot conclude when there are remaining packets,
+2843 // but future ACK frames might indicate a spurious loss detection.
+2844 lost_packets.is_empty()
+2845 }
+2846
+2847 /// Drain lost packets that we reasonably think will never arrive
+2848 ///
+2849 /// The current criterion is copied from `msquic`:
+2850 /// discard packets that were sent earlier than 2 probe timeouts ago.
+2851 fn drain_lost_packets(&mut self, now: Instant, space: SpaceId, path: PathId) {
+2852 let two_pto = 2 * self.path_data(path).rtt.pto_base();
2853
-2854 /// Process a new ECN block from an in-order ACK
-2855 fn process_ecn(
-2856 &mut self,
-2857 now: Instant,
-2858 space: SpaceId,
-2859 path: PathId,
-2860 newly_acked: u64,
-2861 ecn: frame::EcnCounts,
-2862 largest_sent_time: Instant,
-2863 ) {
-2864 match self.spaces[space]
-2865 .for_path(path)
-2866 .detect_ecn(newly_acked, ecn)
-2867 {
-2868 Err(e) => {
-2869 debug!("halting ECN due to verification failure: {}", e);
-2870
-2871 self.path_data_mut(path).sending_ecn = false;
-2872 // Wipe out the existing value because it might be garbage and could interfere with
-2873 // future attempts to use ECN on new paths.
-2874 self.spaces[space].for_path(path).ecn_feedback = frame::EcnCounts::ZERO;
-2875 }
-2876 Ok(false) => {}
-2877 Ok(true) => {
-2878 self.path_stats.entry(path).or_default().congestion_events += 1;
-2879 self.path_data_mut(path).congestion.on_congestion_event(
-2880 now,
-2881 largest_sent_time,
-2882 false,
-2883 true,
-2884 0,
-2885 );
-2886 }
-2887 }
-2888 }
-2889
-2890 // Not timing-aware, so it's safe to call this for inferred acks, such as arise from
-2891 // high-latency handshakes
-2892 fn on_packet_acked(&mut self, now: Instant, path_id: PathId, info: SentPacket) {
-2893 self.paths
-2894 .get_mut(&path_id)
-2895 .expect("known path")
-2896 .remove_in_flight(&info);
-2897 let app_limited = self.app_limited;
-2898 let path = self.path_data_mut(path_id);
-2899 if info.ack_eliciting && !path.is_validating_path() {
-2900 // Only pass ACKs to the congestion controller if we are not validating the current
-2901 // path, so as to ignore any ACKs from older paths still coming in.
-2902 let rtt = path.rtt;
-2903 path.congestion
-2904 .on_ack(now, info.time_sent, info.size.into(), app_limited, &rtt);
-2905 }
-2906
-2907 // Update state for confirmed delivery of frames
-2908 if let Some(retransmits) = info.retransmits.get() {
-2909 for (id, _) in retransmits.reset_stream.iter() {
-2910 self.streams.reset_acked(*id);
-2911 }
-2912 }
-2913
-2914 for frame in info.stream_frames {
-2915 self.streams.received_ack_of(frame);
+2854 let lost_packets = &mut self.spaces[space].for_path(path).lost_packets;
+2855 lost_packets.retain(|_pn, info| now.saturating_duration_since(info.time_sent) <= two_pto);
+2856 }
+2857
+2858 /// Process a new ECN block from an in-order ACK
+2859 fn process_ecn(
+2860 &mut self,
+2861 now: Instant,
+2862 space: SpaceId,
+2863 path: PathId,
+2864 newly_acked: u64,
+2865 ecn: frame::EcnCounts,
+2866 largest_sent_time: Instant,
+2867 ) {
+2868 match self.spaces[space]
+2869 .for_path(path)
+2870 .detect_ecn(newly_acked, ecn)
+2871 {
+2872 Err(e) => {
+2873 debug!("halting ECN due to verification failure: {}", e);
+2874
+2875 self.path_data_mut(path).sending_ecn = false;
+2876 // Wipe out the existing value because it might be garbage and could interfere with
+2877 // future attempts to use ECN on new paths.
+2878 self.spaces[space].for_path(path).ecn_feedback = frame::EcnCounts::ZERO;
+2879 }
+2880 Ok(false) => {}
+2881 Ok(true) => {
+2882 self.path_stats.entry(path).or_default().congestion_events += 1;
+2883 self.path_data_mut(path).congestion.on_congestion_event(
+2884 now,
+2885 largest_sent_time,
+2886 false,
+2887 true,
+2888 0,
+2889 );
+2890 }
+2891 }
+2892 }
+2893
+2894 // Not timing-aware, so it's safe to call this for inferred acks, such as arise from
+2895 // high-latency handshakes
+2896 fn on_packet_acked(&mut self, now: Instant, path_id: PathId, info: SentPacket) {
+2897 self.paths
+2898 .get_mut(&path_id)
+2899 .expect("known path")
+2900 .remove_in_flight(&info);
+2901 let app_limited = self.app_limited;
+2902 let path = self.path_data_mut(path_id);
+2903 if info.ack_eliciting && !path.is_validating_path() {
+2904 // Only pass ACKs to the congestion controller if we are not validating the current
+2905 // path, so as to ignore any ACKs from older paths still coming in.
+2906 let rtt = path.rtt;
+2907 path.congestion
+2908 .on_ack(now, info.time_sent, info.size.into(), app_limited, &rtt);
+2909 }
+2910
+2911 // Update state for confirmed delivery of frames
+2912 if let Some(retransmits) = info.retransmits.get() {
+2913 for (id, _) in retransmits.reset_stream.iter() {
+2914 self.streams.reset_acked(*id);
+2915 }
2916 }
-2917 }
-2918
-2919 fn set_key_discard_timer(&mut self, now: Instant, space: SpaceId) {
-2920 let start = if self.crypto_state.has_keys(EncryptionLevel::ZeroRtt) {
-2921 now
-2922 } else {
-2923 self.crypto_state
-2924 .prev_crypto
-2925 .as_ref()
-2926 .expect("no previous keys")
-2927 .end_packet
-2928 .as_ref()
-2929 .expect("update not acknowledged yet")
-2930 .1
-2931 };
-2932
-2933 // QUIC-MULTIPATH § 2.5 Key Phase Update Process: use largest PTO of all paths.
-2934 self.timers.set(
-2935 Timer::Conn(ConnTimer::KeyDiscard),
-2936 start + self.max_pto_all_paths(space) * 3,
-2937 self.qlog.with_time(now),
-2938 );
-2939 }
-2940
-2941 /// Handle a [`PathTimer::LossDetection`] timeout.
-2942 ///
-2943 /// This timer expires for two reasons:
-2944 /// - An ACK-eliciting packet we sent should be considered lost.
-2945 /// - The PTO may have expired and a tail-loss probe needs to be scheduled.
+2917
+2918 for frame in info.stream_frames {
+2919 self.streams.received_ack_of(frame);
+2920 }
+2921 }
+2922
+2923 fn set_key_discard_timer(&mut self, now: Instant, space: SpaceId) {
+2924 let start = if self.crypto_state.has_keys(EncryptionLevel::ZeroRtt) {
+2925 now
+2926 } else {
+2927 self.crypto_state
+2928 .prev_crypto
+2929 .as_ref()
+2930 .expect("no previous keys")
+2931 .end_packet
+2932 .as_ref()
+2933 .expect("update not acknowledged yet")
+2934 .1
+2935 };
+2936
+2937 // QUIC-MULTIPATH § 2.5 Key Phase Update Process: use largest PTO of all paths.
+2938 self.timers.set(
+2939 Timer::Conn(ConnTimer::KeyDiscard),
+2940 start + self.max_pto_all_paths(space) * 3,
+2941 self.qlog.with_time(now),
+2942 );
+2943 }
+2944
+2945 /// Handle a [`PathTimer::LossDetection`] timeout.
2946 ///
-2947 /// The former needs us to schedule re-transmission of the lost data.
-2948 ///
-2949 /// The latter means we have not received an ACK for an ack-eliciting packet we sent
-2950 /// within the PTO time-window. We need to schedule a tail-loss probe, an ack-eliciting
-2951 /// packet, to try and elicit new acknowledgements. These new acknowledgements will
-2952 /// indicate whether the previously sent packets were lost or not.
-2953 fn on_loss_detection_timeout(&mut self, now: Instant, path_id: PathId) {
-2954 if let Some((_, pn_space)) = self.loss_time_and_space(path_id) {
-2955 // Time threshold loss Detection
-2956 self.detect_lost_packets(now, pn_space, path_id, false);
-2957 self.set_loss_detection_timer(now, path_id);
-2958 return;
-2959 }
-2960
-2961 let (_, space) = match self.pto_time_and_space(now, path_id) {
-2962 Some(x) => x,
-2963 None => {
-2964 error!(%path_id, "PTO expired while unset");
-2965 return;
-2966 }
-2967 };
-2968 trace!(
-2969 in_flight = self.path_data(path_id).in_flight.bytes,
-2970 count = self.path_data(path_id).pto_count,
-2971 ?space,
-2972 %path_id,
-2973 "PTO fired"
-2974 );
-2975
-2976 let count = match self.path_data(path_id).in_flight.ack_eliciting {
-2977 // A PTO when we're not expecting any ACKs must be due to handshake anti-amplification
-2978 // deadlock preventions
-2979 0 => {
-2980 debug_assert!(!self.peer_completed_address_validation(path_id));
-2981 1
-2982 }
-2983 // Conventional loss probe
-2984 _ => 2,
-2985 };
-2986 let pns = self.spaces[space].for_path(path_id);
-2987 pns.loss_probes = pns.loss_probes.saturating_add(count);
-2988 let path_data = self.path_data_mut(path_id);
-2989 path_data.pto_count = path_data.pto_count.saturating_add(1);
-2990 self.set_loss_detection_timer(now, path_id);
-2991 }
-2992
-2993 /// Detect any lost packets
-2994 ///
-2995 /// There are two cases in which we detects lost packets:
-2996 ///
-2997 /// - We received an ACK packet.
-2998 /// - The [`PathTimer::LossDetection`] timer expired. So there is an un-acknowledged packet
-2999 /// that was followed by an acknowledged packet. The loss timer for this
-3000 /// un-acknowledged packet expired and we need to detect that packet as lost.
-3001 ///
-3002 /// Packets are lost if they are both (See RFC9002 §6.1):
-3003 ///
-3004 /// - Unacknowledged, in flight and sent prior to an acknowledged packet.
-3005 /// - Old enough by either:
-3006 /// - Having a packet number [`TransportConfig::packet_threshold`] lower then the last
-3007 /// acknowledged packet.
-3008 /// - Being sent [`TransportConfig::time_threshold`] * RTT in the past.
-3009 fn detect_lost_packets(
-3010 &mut self,
-3011 now: Instant,
-3012 pn_space: SpaceId,
-3013 path_id: PathId,
-3014 due_to_ack: bool,
-3015 ) {
-3016 let mut lost_packets = Vec::<u64>::new();
-3017 let mut lost_mtu_probe = None;
-3018 let mut in_persistent_congestion = false;
-3019 let mut size_of_lost_packets = 0u64;
-3020 self.spaces[pn_space].for_path(path_id).loss_time = None;
-3021
-3022 // Find all the lost packets, populating all variables initialised above.
-3023
-3024 let path = self.path_data(path_id);
-3025 let in_flight_mtu_probe = path.mtud.in_flight_mtu_probe();
-3026 let loss_delay = path
-3027 .rtt
-3028 .conservative()
-3029 .mul_f32(self.config.time_threshold)
-3030 .max(TIMER_GRANULARITY);
-3031 let first_packet_after_rtt_sample = path.first_packet_after_rtt_sample;
-3032
-3033 let largest_acked_packet = self.spaces[pn_space]
-3034 .for_path(path_id)
-3035 .largest_acked_packet
-3036 .expect("detect_lost_packets only to be called if path received at least one ACK");
-3037 let packet_threshold = self.config.packet_threshold as u64;
-3038
-3039 // InPersistentCongestion: Determine if all packets in the time period before the newest
-3040 // lost packet, including the edges, are marked lost. PTO computation must always
-3041 // include max ACK delay, i.e. operate as if in Data space (see RFC9001 §7.6.1).
-3042 let congestion_period = self
-3043 .pto(SpaceId::Data, path_id)
-3044 .saturating_mul(self.config.persistent_congestion_threshold);
-3045 let mut persistent_congestion_start: Option<Instant> = None;
-3046 let mut prev_packet = None;
-3047 let space = self.spaces[pn_space].for_path(path_id);
-3048
-3049 for (packet, info) in space.sent_packets.iter_range(0..largest_acked_packet) {
-3050 if prev_packet != Some(packet.wrapping_sub(1)) {
-3051 // An intervening packet was acknowledged
-3052 persistent_congestion_start = None;
-3053 }
-3054
-3055 // Packets sent before now - loss_delay are deemed lost.
-3056 // However, we avoid subtraction as it can panic and there's no
-3057 // saturating equivalent of this subtraction operation with a Duration.
-3058 let packet_too_old = now.saturating_duration_since(info.time_sent) >= loss_delay;
-3059 if packet_too_old || largest_acked_packet >= packet + packet_threshold {
-3060 // The packet should be declared lost.
-3061 if Some(packet) == in_flight_mtu_probe {
-3062 // Lost MTU probes are not included in `lost_packets`, because they
-3063 // should not trigger a congestion control response
-3064 lost_mtu_probe = in_flight_mtu_probe;
-3065 } else {
-3066 lost_packets.push(packet);
-3067 size_of_lost_packets += info.size as u64;
-3068 if info.ack_eliciting && due_to_ack {
-3069 match persistent_congestion_start {
-3070 // Two ACK-eliciting packets lost more than
-3071 // congestion_period apart, with no ACKed packets in between
-3072 Some(start) if info.time_sent - start > congestion_period => {
-3073 in_persistent_congestion = true;
-3074 }
-3075 // Persistent congestion must start after the first RTT sample
-3076 None if first_packet_after_rtt_sample
-3077 .is_some_and(|x| x < (pn_space, packet)) =>
-3078 {
-3079 persistent_congestion_start = Some(info.time_sent);
-3080 }
-3081 _ => {}
-3082 }
-3083 }
-3084 }
-3085 } else {
-3086 // The packet should not yet be declared lost.
-3087 if space.loss_time.is_none() {
-3088 // Since we iterate in order the lowest packet number's loss time will
-3089 // always be the earliest.
-3090 space.loss_time = Some(info.time_sent + loss_delay);
-3091 }
-3092 persistent_congestion_start = None;
-3093 }
-3094
-3095 prev_packet = Some(packet);
-3096 }
-3097
-3098 self.handle_lost_packets(
-3099 pn_space,
-3100 path_id,
-3101 now,
-3102 lost_packets,
-3103 lost_mtu_probe,
-3104 loss_delay,
-3105 in_persistent_congestion,
-3106 size_of_lost_packets,
-3107 );
-3108 }
-3109
-3110 /// Drops the path state, declaring any remaining in-flight packets as lost
-3111 fn discard_path(&mut self, path_id: PathId, now: Instant) {
-3112 trace!(%path_id, "dropping path state");
-3113 let path = self.path_data(path_id);
-3114 let in_flight_mtu_probe = path.mtud.in_flight_mtu_probe();
-3115
-3116 let mut size_of_lost_packets = 0u64; // add to path_stats.lost_bytes;
-3117 let lost_pns: Vec<_> = self.spaces[SpaceId::Data]
-3118 .for_path(path_id)
-3119 .sent_packets
-3120 .iter()
-3121 .filter(|(pn, _info)| Some(*pn) != in_flight_mtu_probe)
-3122 .map(|(pn, info)| {
-3123 size_of_lost_packets += info.size as u64;
-3124 pn
-3125 })
-3126 .collect();
-3127
-3128 if !lost_pns.is_empty() {
-3129 trace!(
-3130 %path_id,
-3131 count = lost_pns.len(),
-3132 lost_bytes = size_of_lost_packets,
-3133 "packets lost on path abandon"
-3134 );
-3135 self.handle_lost_packets(
-3136 SpaceId::Data,
-3137 path_id,
-3138 now,
-3139 lost_pns,
-3140 in_flight_mtu_probe,
-3141 Duration::ZERO,
-3142 false,
-3143 size_of_lost_packets,
-3144 );
-3145 }
-3146 // Before removing the path, we fetch the final path stats via `Self::path_stats`.
-3147 // This updates some values for the last time.
-3148 let path_stats = self.path_stats(path_id).unwrap_or_default();
-3149 self.path_stats.remove(&path_id);
-3150 self.paths.remove(&path_id);
-3151 self.spaces[SpaceId::Data].number_spaces.remove(&path_id);
-3152
-3153 self.events.push_back(
-3154 PathEvent::Discarded {
-3155 id: path_id,
-3156 path_stats,
-3157 }
-3158 .into(),
-3159 );
-3160 }
-3161
-3162 fn handle_lost_packets(
-3163 &mut self,
-3164 pn_space: SpaceId,
-3165 path_id: PathId,
-3166 now: Instant,
-3167 lost_packets: Vec<u64>,
-3168 lost_mtu_probe: Option<u64>,
-3169 loss_delay: Duration,
-3170 in_persistent_congestion: bool,
-3171 size_of_lost_packets: u64,
-3172 ) {
-3173 debug_assert!(
-3174 {
-3175 let mut sorted = lost_packets.clone();
-3176 sorted.sort();
-3177 sorted == lost_packets
-3178 },
-3179 "lost_packets must be sorted"
-3180 );
-3181
-3182 self.drain_lost_packets(now, pn_space, path_id);
-3183
-3184 // OnPacketsLost
-3185 if let Some(largest_lost) = lost_packets.last().cloned() {
-3186 let old_bytes_in_flight = self.path_data_mut(path_id).in_flight.bytes;
-3187 let largest_lost_sent = self.spaces[pn_space]
-3188 .for_path(path_id)
-3189 .sent_packets
-3190 .get(largest_lost)
-3191 .unwrap()
-3192 .time_sent;
-3193 let path_stats = self.path_stats.entry(path_id).or_default();
-3194 path_stats.lost_packets += lost_packets.len() as u64;
-3195 path_stats.lost_bytes += size_of_lost_packets;
-3196 trace!(
-3197 %path_id,
-3198 count = lost_packets.len(),
-3199 lost_bytes = size_of_lost_packets,
-3200 "packets lost",
-3201 );
-3202
-3203 for &packet in &lost_packets {
-3204 let Some(info) = self.spaces[pn_space].for_path(path_id).take(packet) else {
-3205 continue;
-3206 };
-3207 self.qlog
-3208 .emit_packet_lost(packet, &info, loss_delay, pn_space, now);
-3209 self.paths
-3210 .get_mut(&path_id)
-3211 .unwrap()
-3212 .remove_in_flight(&info);
-3213
-3214 for frame in info.stream_frames {
-3215 self.streams.retransmit(frame);
-3216 }
-3217 self.spaces[pn_space].pending |= info.retransmits;
-3218 self.path_data_mut(path_id)
-3219 .mtud
-3220 .on_non_probe_lost(packet, info.size);
-3221
-3222 self.spaces[pn_space].for_path(path_id).lost_packets.insert(
-3223 packet,
-3224 LostPacket {
-3225 time_sent: info.time_sent,
-3226 },
-3227 );
-3228 }
-3229
-3230 let path = self.path_data_mut(path_id);
-3231 if path.mtud.black_hole_detected(now) {
-3232 path.congestion.on_mtu_update(path.mtud.current_mtu());
-3233 if let Some(max_datagram_size) = self.datagrams().max_size()
-3234 && self.datagrams.drop_oversized(max_datagram_size)
-3235 && self.datagrams.send_blocked
-3236 {
-3237 self.datagrams.send_blocked = false;
-3238 self.events.push_back(Event::DatagramsUnblocked);
-3239 }
-3240 self.path_stats
-3241 .entry(path_id)
-3242 .or_default()
-3243 .black_holes_detected += 1;
-3244 }
-3245
-3246 // Don't apply congestion penalty for lost ack-only packets
-3247 let lost_ack_eliciting =
-3248 old_bytes_in_flight != self.path_data_mut(path_id).in_flight.bytes;
+2947 /// This timer expires for two reasons:
+2948 /// - An ACK-eliciting packet we sent should be considered lost.
+2949 /// - The PTO may have expired and a tail-loss probe needs to be scheduled.
+2950 ///
+2951 /// The former needs us to schedule re-transmission of the lost data.
+2952 ///
+2953 /// The latter means we have not received an ACK for an ack-eliciting packet we sent
+2954 /// within the PTO time-window. We need to schedule a tail-loss probe, an ack-eliciting
+2955 /// packet, to try and elicit new acknowledgements. These new acknowledgements will
+2956 /// indicate whether the previously sent packets were lost or not.
+2957 fn on_loss_detection_timeout(&mut self, now: Instant, path_id: PathId) {
+2958 if let Some((_, pn_space)) = self.loss_time_and_space(path_id) {
+2959 // Time threshold loss Detection
+2960 self.detect_lost_packets(now, pn_space, path_id, false);
+2961 self.set_loss_detection_timer(now, path_id);
+2962 return;
+2963 }
+2964
+2965 let (_, space) = match self.pto_time_and_space(now, path_id) {
+2966 Some(x) => x,
+2967 None => {
+2968 error!(%path_id, "PTO expired while unset");
+2969 return;
+2970 }
+2971 };
+2972 trace!(
+2973 in_flight = self.path_data(path_id).in_flight.bytes,
+2974 count = self.path_data(path_id).pto_count,
+2975 ?space,
+2976 %path_id,
+2977 "PTO fired"
+2978 );
+2979
+2980 let count = match self.path_data(path_id).in_flight.ack_eliciting {
+2981 // A PTO when we're not expecting any ACKs must be due to handshake anti-amplification
+2982 // deadlock preventions
+2983 0 => {
+2984 debug_assert!(!self.peer_completed_address_validation(path_id));
+2985 1
+2986 }
+2987 // Conventional loss probe
+2988 _ => 2,
+2989 };
+2990 let pns = self.spaces[space].for_path(path_id);
+2991 pns.loss_probes = pns.loss_probes.saturating_add(count);
+2992 let path_data = self.path_data_mut(path_id);
+2993 path_data.pto_count = path_data.pto_count.saturating_add(1);
+2994 self.set_loss_detection_timer(now, path_id);
+2995 }
+2996
+2997 /// Detect any lost packets
+2998 ///
+2999 /// There are two cases in which we detects lost packets:
+3000 ///
+3001 /// - We received an ACK packet.
+3002 /// - The [`PathTimer::LossDetection`] timer expired. So there is an un-acknowledged packet
+3003 /// that was followed by an acknowledged packet. The loss timer for this
+3004 /// un-acknowledged packet expired and we need to detect that packet as lost.
+3005 ///
+3006 /// Packets are lost if they are both (See RFC9002 §6.1):
+3007 ///
+3008 /// - Unacknowledged, in flight and sent prior to an acknowledged packet.
+3009 /// - Old enough by either:
+3010 /// - Having a packet number [`TransportConfig::packet_threshold`] lower then the last
+3011 /// acknowledged packet.
+3012 /// - Being sent [`TransportConfig::time_threshold`] * RTT in the past.
+3013 fn detect_lost_packets(
+3014 &mut self,
+3015 now: Instant,
+3016 pn_space: SpaceId,
+3017 path_id: PathId,
+3018 due_to_ack: bool,
+3019 ) {
+3020 let mut lost_packets = Vec::<u64>::new();
+3021 let mut lost_mtu_probe = None;
+3022 let mut in_persistent_congestion = false;
+3023 let mut size_of_lost_packets = 0u64;
+3024 self.spaces[pn_space].for_path(path_id).loss_time = None;
+3025
+3026 // Find all the lost packets, populating all variables initialised above.
+3027
+3028 let path = self.path_data(path_id);
+3029 let in_flight_mtu_probe = path.mtud.in_flight_mtu_probe();
+3030 let loss_delay = path
+3031 .rtt
+3032 .conservative()
+3033 .mul_f32(self.config.time_threshold)
+3034 .max(TIMER_GRANULARITY);
+3035 let first_packet_after_rtt_sample = path.first_packet_after_rtt_sample;
+3036
+3037 let largest_acked_packet = self.spaces[pn_space]
+3038 .for_path(path_id)
+3039 .largest_acked_packet
+3040 .expect("detect_lost_packets only to be called if path received at least one ACK");
+3041 let packet_threshold = self.config.packet_threshold as u64;
+3042
+3043 // InPersistentCongestion: Determine if all packets in the time period before the newest
+3044 // lost packet, including the edges, are marked lost. PTO computation must always
+3045 // include max ACK delay, i.e. operate as if in Data space (see RFC9001 §7.6.1).
+3046 let congestion_period = self
+3047 .pto(SpaceId::Data, path_id)
+3048 .saturating_mul(self.config.persistent_congestion_threshold);
+3049 let mut persistent_congestion_start: Option<Instant> = None;
+3050 let mut prev_packet = None;
+3051 let space = self.spaces[pn_space].for_path(path_id);
+3052
+3053 for (packet, info) in space.sent_packets.iter_range(0..largest_acked_packet) {
+3054 if prev_packet != Some(packet.wrapping_sub(1)) {
+3055 // An intervening packet was acknowledged
+3056 persistent_congestion_start = None;
+3057 }
+3058
+3059 // Packets sent before now - loss_delay are deemed lost.
+3060 // However, we avoid subtraction as it can panic and there's no
+3061 // saturating equivalent of this subtraction operation with a Duration.
+3062 let packet_too_old = now.saturating_duration_since(info.time_sent) >= loss_delay;
+3063 if packet_too_old || largest_acked_packet >= packet + packet_threshold {
+3064 // The packet should be declared lost.
+3065 if Some(packet) == in_flight_mtu_probe {
+3066 // Lost MTU probes are not included in `lost_packets`, because they
+3067 // should not trigger a congestion control response
+3068 lost_mtu_probe = in_flight_mtu_probe;
+3069 } else {
+3070 lost_packets.push(packet);
+3071 size_of_lost_packets += info.size as u64;
+3072 if info.ack_eliciting && due_to_ack {
+3073 match persistent_congestion_start {
+3074 // Two ACK-eliciting packets lost more than
+3075 // congestion_period apart, with no ACKed packets in between
+3076 Some(start) if info.time_sent - start > congestion_period => {
+3077 in_persistent_congestion = true;
+3078 }
+3079 // Persistent congestion must start after the first RTT sample
+3080 None if first_packet_after_rtt_sample
+3081 .is_some_and(|x| x < (pn_space, packet)) =>
+3082 {
+3083 persistent_congestion_start = Some(info.time_sent);
+3084 }
+3085 _ => {}
+3086 }
+3087 }
+3088 }
+3089 } else {
+3090 // The packet should not yet be declared lost.
+3091 if space.loss_time.is_none() {
+3092 // Since we iterate in order the lowest packet number's loss time will
+3093 // always be the earliest.
+3094 space.loss_time = Some(info.time_sent + loss_delay);
+3095 }
+3096 persistent_congestion_start = None;
+3097 }
+3098
+3099 prev_packet = Some(packet);
+3100 }
+3101
+3102 self.handle_lost_packets(
+3103 pn_space,
+3104 path_id,
+3105 now,
+3106 lost_packets,
+3107 lost_mtu_probe,
+3108 loss_delay,
+3109 in_persistent_congestion,
+3110 size_of_lost_packets,
+3111 );
+3112 }
+3113
+3114 /// Drops the path state, declaring any remaining in-flight packets as lost
+3115 fn discard_path(&mut self, path_id: PathId, now: Instant) {
+3116 trace!(%path_id, "dropping path state");
+3117 let path = self.path_data(path_id);
+3118 let in_flight_mtu_probe = path.mtud.in_flight_mtu_probe();
+3119
+3120 let mut size_of_lost_packets = 0u64; // add to path_stats.lost_bytes;
+3121 let lost_pns: Vec<_> = self.spaces[SpaceId::Data]
+3122 .for_path(path_id)
+3123 .sent_packets
+3124 .iter()
+3125 .filter(|(pn, _info)| Some(*pn) != in_flight_mtu_probe)
+3126 .map(|(pn, info)| {
+3127 size_of_lost_packets += info.size as u64;
+3128 pn
+3129 })
+3130 .collect();
+3131
+3132 if !lost_pns.is_empty() {
+3133 trace!(
+3134 %path_id,
+3135 count = lost_pns.len(),
+3136 lost_bytes = size_of_lost_packets,
+3137 "packets lost on path abandon"
+3138 );
+3139 self.handle_lost_packets(
+3140 SpaceId::Data,
+3141 path_id,
+3142 now,
+3143 lost_pns,
+3144 in_flight_mtu_probe,
+3145 Duration::ZERO,
+3146 false,
+3147 size_of_lost_packets,
+3148 );
+3149 }
+3150 // Before removing the path, we fetch the final path stats via `Self::path_stats`.
+3151 // This updates some values for the last time.
+3152 let path_stats = self.path_stats(path_id).unwrap_or_default();
+3153 self.path_stats.remove(&path_id);
+3154 self.paths.remove(&path_id);
+3155 self.spaces[SpaceId::Data].number_spaces.remove(&path_id);
+3156
+3157 self.events.push_back(
+3158 PathEvent::Discarded {
+3159 id: path_id,
+3160 path_stats,
+3161 }
+3162 .into(),
+3163 );
+3164 }
+3165
+3166 fn handle_lost_packets(
+3167 &mut self,
+3168 pn_space: SpaceId,
+3169 path_id: PathId,
+3170 now: Instant,
+3171 lost_packets: Vec<u64>,
+3172 lost_mtu_probe: Option<u64>,
+3173 loss_delay: Duration,
+3174 in_persistent_congestion: bool,
+3175 size_of_lost_packets: u64,
+3176 ) {
+3177 debug_assert!(
+3178 {
+3179 let mut sorted = lost_packets.clone();
+3180 sorted.sort();
+3181 sorted == lost_packets
+3182 },
+3183 "lost_packets must be sorted"
+3184 );
+3185
+3186 self.drain_lost_packets(now, pn_space, path_id);
+3187
+3188 // OnPacketsLost
+3189 if let Some(largest_lost) = lost_packets.last().cloned() {
+3190 let old_bytes_in_flight = self.path_data_mut(path_id).in_flight.bytes;
+3191 let largest_lost_sent = self.spaces[pn_space]
+3192 .for_path(path_id)
+3193 .sent_packets
+3194 .get(largest_lost)
+3195 .unwrap()
+3196 .time_sent;
+3197 let path_stats = self.path_stats.entry(path_id).or_default();
+3198 path_stats.lost_packets += lost_packets.len() as u64;
+3199 path_stats.lost_bytes += size_of_lost_packets;
+3200 trace!(
+3201 %path_id,
+3202 count = lost_packets.len(),
+3203 lost_bytes = size_of_lost_packets,
+3204 "packets lost",
+3205 );
+3206
+3207 for &packet in &lost_packets {
+3208 let Some(info) = self.spaces[pn_space].for_path(path_id).take(packet) else {
+3209 continue;
+3210 };
+3211 self.qlog
+3212 .emit_packet_lost(packet, &info, loss_delay, pn_space, now);
+3213 self.paths
+3214 .get_mut(&path_id)
+3215 .unwrap()
+3216 .remove_in_flight(&info);
+3217
+3218 for frame in info.stream_frames {
+3219 self.streams.retransmit(frame);
+3220 }
+3221 self.spaces[pn_space].pending |= info.retransmits;
+3222 self.path_data_mut(path_id)
+3223 .mtud
+3224 .on_non_probe_lost(packet, info.size);
+3225
+3226 self.spaces[pn_space].for_path(path_id).lost_packets.insert(
+3227 packet,
+3228 LostPacket {
+3229 time_sent: info.time_sent,
+3230 },
+3231 );
+3232 }
+3233
+3234 let path = self.path_data_mut(path_id);
+3235 if path.mtud.black_hole_detected(now) {
+3236 path.congestion.on_mtu_update(path.mtud.current_mtu());
+3237 if let Some(max_datagram_size) = self.datagrams().max_size()
+3238 && self.datagrams.drop_oversized(max_datagram_size)
+3239 && self.datagrams.send_blocked
+3240 {
+3241 self.datagrams.send_blocked = false;
+3242 self.events.push_back(Event::DatagramsUnblocked);
+3243 }
+3244 self.path_stats
+3245 .entry(path_id)
+3246 .or_default()
+3247 .black_holes_detected += 1;
+3248 }
3249
-3250 if lost_ack_eliciting {
-3251 self.path_stats
-3252 .entry(path_id)
-3253 .or_default()
-3254 .congestion_events += 1;
-3255 self.path_data_mut(path_id).congestion.on_congestion_event(
-3256 now,
-3257 largest_lost_sent,
-3258 in_persistent_congestion,
-3259 false,
-3260 size_of_lost_packets,
-3261 );
-3262 }
-3263 }
-3264
-3265 // Handle a lost MTU probe
-3266 if let Some(packet) = lost_mtu_probe {
-3267 let info = self.spaces[SpaceId::Data]
-3268 .for_path(path_id)
-3269 .take(packet)
-3270 .unwrap(); // safe: lost_mtu_probe is omitted from lost_packets, and
-3271 // therefore must not have been removed yet
-3272 self.paths
-3273 .get_mut(&path_id)
-3274 .unwrap()
-3275 .remove_in_flight(&info);
-3276 self.path_data_mut(path_id).mtud.on_probe_lost();
-3277 self.path_stats
-3278 .entry(path_id)
-3279 .or_default()
-3280 .lost_plpmtud_probes += 1;
-3281 }
-3282 }
-3283
-3284 /// Returns the earliest time packets should be declared lost for all spaces on a path.
-3285 ///
-3286 /// If a path has an acknowledged packet with any prior un-acknowledged packets, the
-3287 /// earliest un-acknowledged packet can be declared lost after a timeout has elapsed.
-3288 /// The time returned is when this packet should be declared lost.
-3289 fn loss_time_and_space(&self, path_id: PathId) -> Option<(Instant, SpaceId)> {
-3290 SpaceId::iter()
-3291 .filter_map(|id| {
-3292 self.spaces[id]
-3293 .number_spaces
-3294 .get(&path_id)
-3295 .and_then(|pns| pns.loss_time)
-3296 .map(|time| (time, id))
-3297 })
-3298 .min_by_key(|&(time, _)| time)
-3299 }
-3300
-3301 /// Returns the earliest next PTO should fire for all spaces on a path.
-3302 fn pto_time_and_space(&mut self, now: Instant, path_id: PathId) -> Option<(Instant, SpaceId)> {
-3303 let path = self.path(path_id)?;
-3304 let pto_count = path.pto_count;
-3305 let backoff = 2u32.pow(pto_count.min(MAX_BACKOFF_EXPONENT));
-3306 let mut duration = path.rtt.pto_base() * backoff;
-3307
-3308 if path_id == PathId::ZERO
-3309 && path.in_flight.ack_eliciting == 0
-3310 && !self.peer_completed_address_validation(PathId::ZERO)
-3311 {
-3312 // Address Validation during Connection Establishment:
-3313 // https://www.rfc-editor.org/rfc/rfc9000.html#section-8.1. To prevent a
-3314 // deadlock if an Initial or Handshake packet from the server is lost and the
-3315 // server can not send more due to its anti-amplification limit the client must
-3316 // send another packet on PTO.
-3317 let space = match self.highest_space {
-3318 SpaceId::Handshake => SpaceId::Handshake,
-3319 _ => SpaceId::Initial,
-3320 };
-3321
-3322 return Some((now + duration, space));
-3323 }
-3324
-3325 let mut result = None;
-3326 for space in SpaceId::iter() {
-3327 let Some(pns) = self.spaces[space].number_spaces.get(&path_id) else {
-3328 continue;
-3329 };
-3330
-3331 if !pns.has_in_flight() {
+3250 // Don't apply congestion penalty for lost ack-only packets
+3251 let lost_ack_eliciting =
+3252 old_bytes_in_flight != self.path_data_mut(path_id).in_flight.bytes;
+3253
+3254 if lost_ack_eliciting {
+3255 self.path_stats
+3256 .entry(path_id)
+3257 .or_default()
+3258 .congestion_events += 1;
+3259 self.path_data_mut(path_id).congestion.on_congestion_event(
+3260 now,
+3261 largest_lost_sent,
+3262 in_persistent_congestion,
+3263 false,
+3264 size_of_lost_packets,
+3265 );
+3266 }
+3267 }
+3268
+3269 // Handle a lost MTU probe
+3270 if let Some(packet) = lost_mtu_probe {
+3271 let info = self.spaces[SpaceId::Data]
+3272 .for_path(path_id)
+3273 .take(packet)
+3274 .unwrap(); // safe: lost_mtu_probe is omitted from lost_packets, and
+3275 // therefore must not have been removed yet
+3276 self.paths
+3277 .get_mut(&path_id)
+3278 .unwrap()
+3279 .remove_in_flight(&info);
+3280 self.path_data_mut(path_id).mtud.on_probe_lost();
+3281 self.path_stats
+3282 .entry(path_id)
+3283 .or_default()
+3284 .lost_plpmtud_probes += 1;
+3285 }
+3286 }
+3287
+3288 /// Returns the earliest time packets should be declared lost for all spaces on a path.
+3289 ///
+3290 /// If a path has an acknowledged packet with any prior un-acknowledged packets, the
+3291 /// earliest un-acknowledged packet can be declared lost after a timeout has elapsed.
+3292 /// The time returned is when this packet should be declared lost.
+3293 fn loss_time_and_space(&self, path_id: PathId) -> Option<(Instant, SpaceId)> {
+3294 SpaceId::iter()
+3295 .filter_map(|id| {
+3296 self.spaces[id]
+3297 .number_spaces
+3298 .get(&path_id)
+3299 .and_then(|pns| pns.loss_time)
+3300 .map(|time| (time, id))
+3301 })
+3302 .min_by_key(|&(time, _)| time)
+3303 }
+3304
+3305 /// Returns the earliest next PTO should fire for all spaces on a path.
+3306 fn pto_time_and_space(&mut self, now: Instant, path_id: PathId) -> Option<(Instant, SpaceId)> {
+3307 let path = self.path(path_id)?;
+3308 let pto_count = path.pto_count;
+3309 let backoff = 2u32.pow(pto_count.min(MAX_BACKOFF_EXPONENT));
+3310 let mut duration = path.rtt.pto_base() * backoff;
+3311
+3312 if path_id == PathId::ZERO
+3313 && path.in_flight.ack_eliciting == 0
+3314 && !self.peer_completed_address_validation(PathId::ZERO)
+3315 {
+3316 // Address Validation during Connection Establishment:
+3317 // https://www.rfc-editor.org/rfc/rfc9000.html#section-8.1. To prevent a
+3318 // deadlock if an Initial or Handshake packet from the server is lost and the
+3319 // server can not send more due to its anti-amplification limit the client must
+3320 // send another packet on PTO.
+3321 let space = match self.highest_space {
+3322 SpaceId::Handshake => SpaceId::Handshake,
+3323 _ => SpaceId::Initial,
+3324 };
+3325
+3326 return Some((now + duration, space));
+3327 }
+3328
+3329 let mut result = None;
+3330 for space in SpaceId::iter() {
+3331 let Some(pns) = self.spaces[space].number_spaces.get(&path_id) else {
3332 continue;
-3333 }
-3334 if space == SpaceId::Data {
-3335 // Skip ApplicationData until handshake completes.
-3336 if self.is_handshaking() {
-3337 return result;
-3338 }
-3339 // Include max_ack_delay and backoff for ApplicationData.
-3340 duration += self.ack_frequency.max_ack_delay_for_pto() * backoff;
-3341 }
-3342 let Some(last_ack_eliciting) = pns.time_of_last_ack_eliciting_packet else {
-3343 continue;
-3344 };
-3345 let pto = last_ack_eliciting + duration;
-3346 if result.is_none_or(|(earliest_pto, _)| pto < earliest_pto) {
-3347 if path.anti_amplification_blocked(1) {
-3348 // Nothing would be able to be sent.
-3349 continue;
-3350 }
-3351 if path.in_flight.ack_eliciting == 0 {
-3352 // Nothing ack-eliciting, no PTO to arm/fire.
+3333 };
+3334
+3335 if !pns.has_in_flight() {
+3336 continue;
+3337 }
+3338 if space == SpaceId::Data {
+3339 // Skip ApplicationData until handshake completes.
+3340 if self.is_handshaking() {
+3341 return result;
+3342 }
+3343 // Include max_ack_delay and backoff for ApplicationData.
+3344 duration += self.ack_frequency.max_ack_delay_for_pto() * backoff;
+3345 }
+3346 let Some(last_ack_eliciting) = pns.time_of_last_ack_eliciting_packet else {
+3347 continue;
+3348 };
+3349 let pto = last_ack_eliciting + duration;
+3350 if result.is_none_or(|(earliest_pto, _)| pto < earliest_pto) {
+3351 if path.anti_amplification_blocked(1) {
+3352 // Nothing would be able to be sent.
3353 continue;
3354 }
-3355 result = Some((pto, space));
-3356 }
-3357 }
-3358 result
-3359 }
-3360
-3361 fn peer_completed_address_validation(&self, path: PathId) -> bool {
-3362 // TODO(flub): This logic needs updating for multipath
-3363 if self.side.is_server() || self.state.is_closed() {
-3364 return true;
-3365 }
-3366 // The server is guaranteed to have validated our address if any of our handshake or 1-RTT
-3367 // packets are acknowledged or we've seen HANDSHAKE_DONE and discarded handshake keys.
-3368 self.spaces[SpaceId::Handshake]
-3369 .path_space(PathId::ZERO)
-3370 .and_then(|pns| pns.largest_acked_packet)
-3371 .is_some()
-3372 || self.spaces[SpaceId::Data]
-3373 .path_space(path)
-3374 .and_then(|pns| pns.largest_acked_packet)
-3375 .is_some()
-3376 || (self.crypto_state.has_keys(EncryptionLevel::OneRtt)
-3377 && !self.crypto_state.has_keys(EncryptionLevel::Handshake))
-3378 }
-3379
-3380 /// Resets the the [`PathTimer::LossDetection`] timer to the next instant it may be needed
-3381 ///
-3382 /// The timer must fire if either:
-3383 /// - An ack-eliciting packet we sent needs to be declared lost.
-3384 /// - A tail-loss probe needs to be sent.
+3355 if path.in_flight.ack_eliciting == 0 {
+3356 // Nothing ack-eliciting, no PTO to arm/fire.
+3357 continue;
+3358 }
+3359 result = Some((pto, space));
+3360 }
+3361 }
+3362 result
+3363 }
+3364
+3365 fn peer_completed_address_validation(&self, path: PathId) -> bool {
+3366 // TODO(flub): This logic needs updating for multipath
+3367 if self.side.is_server() || self.state.is_closed() {
+3368 return true;
+3369 }
+3370 // The server is guaranteed to have validated our address if any of our handshake or 1-RTT
+3371 // packets are acknowledged or we've seen HANDSHAKE_DONE and discarded handshake keys.
+3372 self.spaces[SpaceId::Handshake]
+3373 .path_space(PathId::ZERO)
+3374 .and_then(|pns| pns.largest_acked_packet)
+3375 .is_some()
+3376 || self.spaces[SpaceId::Data]
+3377 .path_space(path)
+3378 .and_then(|pns| pns.largest_acked_packet)
+3379 .is_some()
+3380 || (self.crypto_state.has_keys(EncryptionLevel::OneRtt)
+3381 && !self.crypto_state.has_keys(EncryptionLevel::Handshake))
+3382 }
+3383
+3384 /// Resets the the [`PathTimer::LossDetection`] timer to the next instant it may be needed
3385 ///
-3386 /// See [`Connection::on_loss_detection_timeout`] for details.
-3387 fn set_loss_detection_timer(&mut self, now: Instant, path_id: PathId) {
-3388 if self.state.is_closed() {
-3389 // No loss detection takes place on closed connections, and `close_common` already
-3390 // stopped time timer. Ensure we don't restart it inadvertently, e.g. in response to a
-3391 // reordered packet being handled by state-insensitive code.
-3392 return;
-3393 }
-3394
-3395 if let Some((loss_time, _)) = self.loss_time_and_space(path_id) {
-3396 // Time threshold loss detection.
-3397 self.timers.set(
-3398 Timer::PerPath(path_id, PathTimer::LossDetection),
-3399 loss_time,
-3400 self.qlog.with_time(now),
-3401 );
-3402 return;
-3403 }
-3404
-3405 // Determine which PN space to arm PTO for.
-3406 // Calculate PTO duration
-3407 if let Some((timeout, _)) = self.pto_time_and_space(now, path_id) {
-3408 self.timers.set(
-3409 Timer::PerPath(path_id, PathTimer::LossDetection),
-3410 timeout,
-3411 self.qlog.with_time(now),
-3412 );
-3413 } else {
-3414 self.timers.stop(
-3415 Timer::PerPath(path_id, PathTimer::LossDetection),
-3416 self.qlog.with_time(now),
-3417 );
-3418 }
-3419 }
-3420
-3421 /// The maximum probe timeout across all paths
-3422 ///
-3423 /// See [`Connection::pto`]
-3424 fn max_pto_all_paths(&self, space: SpaceId) -> Duration {
-3425 self.paths
-3426 .keys()
-3427 .map(|path_id| self.pto(space, *path_id))
-3428 .max()
-3429 .expect("there should be at least one path")
-3430 }
-3431
-3432 /// Probe Timeout
-3433 ///
-3434 /// The PTO is logically the time in which you'd expect to receive an acknowledgement
-3435 /// for a packet. So approximately RTT + max_ack_delay.
-3436 fn pto(&self, space: SpaceId, path_id: PathId) -> Duration {
-3437 let max_ack_delay = match space {
-3438 SpaceId::Initial | SpaceId::Handshake => Duration::ZERO,
-3439 SpaceId::Data => self.ack_frequency.max_ack_delay_for_pto(),
-3440 };
-3441 self.path_data(path_id).rtt.pto_base() + max_ack_delay
-3442 }
-3443
-3444 fn on_packet_authenticated(
-3445 &mut self,
-3446 now: Instant,
-3447 space_id: SpaceId,
-3448 path_id: PathId,
-3449 ecn: Option<EcnCodepoint>,
-3450 packet: Option<u64>,
-3451 spin: bool,
-3452 is_1rtt: bool,
-3453 ) {
-3454 self.total_authed_packets += 1;
-3455 if let Some(AbandonState::ExpectingPathAbandon { deadline }) = self
-3456 .paths
-3457 .get(&path_id)
-3458 .map(|path| &path.data.abandon_state)
-3459 && now > *deadline
-3460 {
-3461 warn!("received data on path which we abandoned more than 3 * PTO ago");
-3462 // The peer failed to respond with a PATH_ABANDON in time.
-3463 if !self.state.is_closed() {
-3464 self.state
-3465 .move_to_closed(TransportError::PROTOCOL_VIOLATION(
-3466 "peer failed to respond with PATH_ABANDON in time",
-3467 ));
-3468 self.close_common();
-3469 self.set_close_timer(now);
-3470 self.connection_close_pending = true;
-3471 }
-3472 return;
-3473 }
-3474
-3475 self.reset_keep_alive(path_id, now);
-3476 self.reset_idle_timeout(now, space_id, path_id);
-3477 self.permit_idle_reset = true;
-3478 self.receiving_ecn |= ecn.is_some();
-3479 if let Some(x) = ecn {
-3480 let space = &mut self.spaces[space_id];
-3481 space.for_path(path_id).ecn_counters += x;
-3482
-3483 if x.is_ce() {
-3484 space
-3485 .for_path(path_id)
-3486 .pending_acks
-3487 .set_immediate_ack_required();
-3488 }
-3489 }
-3490
-3491 let packet = match packet {
-3492 Some(x) => x,
-3493 None => return,
-3494 };
-3495 match &self.side {
-3496 ConnectionSide::Client { .. } => {
-3497 // If we received a handshake packet that authenticated, then we're talking to
-3498 // the real server. From now on we should no longer allow the server to migrate
-3499 // its address.
-3500 if space_id == SpaceId::Handshake
-3501 && let Some(hs) = self.state.as_handshake_mut()
-3502 {
-3503 hs.allow_server_migration = false;
-3504 }
-3505 }
-3506 ConnectionSide::Server { .. } => {
-3507 if self.crypto_state.has_keys(EncryptionLevel::Initial)
-3508 && space_id == SpaceId::Handshake
-3509 {
-3510 // A server stops sending and processing Initial packets when it receives its first Handshake packet.
-3511 self.discard_space(now, SpaceId::Initial);
-3512 }
-3513 if self.crypto_state.has_keys(EncryptionLevel::ZeroRtt) && is_1rtt {
-3514 // Discard 0-RTT keys soon after receiving a 1-RTT packet
-3515 self.set_key_discard_timer(now, space_id)
+3386 /// The timer must fire if either:
+3387 /// - An ack-eliciting packet we sent needs to be declared lost.
+3388 /// - A tail-loss probe needs to be sent.
+3389 ///
+3390 /// See [`Connection::on_loss_detection_timeout`] for details.
+3391 fn set_loss_detection_timer(&mut self, now: Instant, path_id: PathId) {
+3392 if self.state.is_closed() {
+3393 // No loss detection takes place on closed connections, and `close_common` already
+3394 // stopped time timer. Ensure we don't restart it inadvertently, e.g. in response to a
+3395 // reordered packet being handled by state-insensitive code.
+3396 return;
+3397 }
+3398
+3399 if let Some((loss_time, _)) = self.loss_time_and_space(path_id) {
+3400 // Time threshold loss detection.
+3401 self.timers.set(
+3402 Timer::PerPath(path_id, PathTimer::LossDetection),
+3403 loss_time,
+3404 self.qlog.with_time(now),
+3405 );
+3406 return;
+3407 }
+3408
+3409 // Determine which PN space to arm PTO for.
+3410 // Calculate PTO duration
+3411 if let Some((timeout, _)) = self.pto_time_and_space(now, path_id) {
+3412 self.timers.set(
+3413 Timer::PerPath(path_id, PathTimer::LossDetection),
+3414 timeout,
+3415 self.qlog.with_time(now),
+3416 );
+3417 } else {
+3418 self.timers.stop(
+3419 Timer::PerPath(path_id, PathTimer::LossDetection),
+3420 self.qlog.with_time(now),
+3421 );
+3422 }
+3423 }
+3424
+3425 /// The maximum probe timeout across all paths
+3426 ///
+3427 /// See [`Connection::pto`]
+3428 fn max_pto_all_paths(&self, space: SpaceId) -> Duration {
+3429 self.paths
+3430 .keys()
+3431 .map(|path_id| self.pto(space, *path_id))
+3432 .max()
+3433 .expect("there should be at least one path")
+3434 }
+3435
+3436 /// Probe Timeout
+3437 ///
+3438 /// The PTO is logically the time in which you'd expect to receive an acknowledgement
+3439 /// for a packet. So approximately RTT + max_ack_delay.
+3440 fn pto(&self, space: SpaceId, path_id: PathId) -> Duration {
+3441 let max_ack_delay = match space {
+3442 SpaceId::Initial | SpaceId::Handshake => Duration::ZERO,
+3443 SpaceId::Data => self.ack_frequency.max_ack_delay_for_pto(),
+3444 };
+3445 self.path_data(path_id).rtt.pto_base() + max_ack_delay
+3446 }
+3447
+3448 fn on_packet_authenticated(
+3449 &mut self,
+3450 now: Instant,
+3451 space_id: SpaceId,
+3452 path_id: PathId,
+3453 ecn: Option<EcnCodepoint>,
+3454 packet: Option<u64>,
+3455 spin: bool,
+3456 is_1rtt: bool,
+3457 ) {
+3458 self.total_authed_packets += 1;
+3459 if let Some(AbandonState::ExpectingPathAbandon { deadline }) = self
+3460 .paths
+3461 .get(&path_id)
+3462 .map(|path| &path.data.abandon_state)
+3463 && now > *deadline
+3464 {
+3465 warn!("received data on path which we abandoned more than 3 * PTO ago");
+3466 // The peer failed to respond with a PATH_ABANDON in time.
+3467 if !self.state.is_closed() {
+3468 self.state
+3469 .move_to_closed(TransportError::PROTOCOL_VIOLATION(
+3470 "peer failed to respond with PATH_ABANDON in time",
+3471 ));
+3472 self.close_common();
+3473 self.set_close_timer(now);
+3474 self.connection_close_pending = true;
+3475 }
+3476 return;
+3477 }
+3478
+3479 self.reset_keep_alive(path_id, now);
+3480 self.reset_idle_timeout(now, space_id, path_id);
+3481 self.permit_idle_reset = true;
+3482 self.receiving_ecn |= ecn.is_some();
+3483 if let Some(x) = ecn {
+3484 let space = &mut self.spaces[space_id];
+3485 space.for_path(path_id).ecn_counters += x;
+3486
+3487 if x.is_ce() {
+3488 space
+3489 .for_path(path_id)
+3490 .pending_acks
+3491 .set_immediate_ack_required();
+3492 }
+3493 }
+3494
+3495 let packet = match packet {
+3496 Some(x) => x,
+3497 None => return,
+3498 };
+3499 match &self.side {
+3500 ConnectionSide::Client { .. } => {
+3501 // If we received a handshake packet that authenticated, then we're talking to
+3502 // the real server. From now on we should no longer allow the server to migrate
+3503 // its address.
+3504 if space_id == SpaceId::Handshake
+3505 && let Some(hs) = self.state.as_handshake_mut()
+3506 {
+3507 hs.allow_server_migration = false;
+3508 }
+3509 }
+3510 ConnectionSide::Server { .. } => {
+3511 if self.crypto_state.has_keys(EncryptionLevel::Initial)
+3512 && space_id == SpaceId::Handshake
+3513 {
+3514 // A server stops sending and processing Initial packets when it receives its first Handshake packet.
+3515 self.discard_space(now, SpaceId::Initial);
3516 }
-3517 }
-3518 }
-3519 let space = self.spaces[space_id].for_path(path_id);
-3520 space.pending_acks.insert_one(packet, now);
-3521 if packet >= space.rx_packet.unwrap_or_default() {
-3522 space.rx_packet = Some(packet);
-3523 // Update outgoing spin bit, inverting iff we're the client
-3524 self.spin = self.side.is_client() ^ spin;
-3525 }
-3526 }
-3527
-3528 /// Resets the idle timeout timers
-3529 ///
-3530 /// Without multipath there is only the connection-wide idle timeout. When multipath is
-3531 /// enabled there is an additional per-path idle timeout.
-3532 fn reset_idle_timeout(&mut self, now: Instant, space: SpaceId, path_id: PathId) {
-3533 // First reset the global idle timeout.
-3534 if let Some(timeout) = self.idle_timeout {
-3535 if self.state.is_closed() {
-3536 self.timers
-3537 .stop(Timer::Conn(ConnTimer::Idle), self.qlog.with_time(now));
-3538 } else {
-3539 let dt = cmp::max(timeout, 3 * self.max_pto_all_paths(space));
-3540 self.timers.set(
-3541 Timer::Conn(ConnTimer::Idle),
-3542 now + dt,
-3543 self.qlog.with_time(now),
-3544 );
-3545 }
-3546 }
-3547
-3548 // Now handle the per-path state
-3549 if let Some(timeout) = self.path_data(path_id).idle_timeout {
-3550 if self.state.is_closed() {
-3551 self.timers.stop(
-3552 Timer::PerPath(path_id, PathTimer::PathIdle),
-3553 self.qlog.with_time(now),
-3554 );
-3555 } else {
-3556 let dt = cmp::max(timeout, 3 * self.pto(space, path_id));
-3557 self.timers.set(
-3558 Timer::PerPath(path_id, PathTimer::PathIdle),
-3559 now + dt,
-3560 self.qlog.with_time(now),
-3561 );
-3562 }
-3563 }
-3564 }
-3565
-3566 /// Resets both the [`ConnTimer::KeepAlive`] and [`PathTimer::PathKeepAlive`] timers
-3567 fn reset_keep_alive(&mut self, path_id: PathId, now: Instant) {
-3568 if !self.state.is_established() {
-3569 return;
-3570 }
-3571
-3572 if let Some(interval) = self.config.keep_alive_interval {
-3573 self.timers.set(
-3574 Timer::Conn(ConnTimer::KeepAlive),
-3575 now + interval,
-3576 self.qlog.with_time(now),
-3577 );
-3578 }
-3579
-3580 if let Some(interval) = self.path_data(path_id).keep_alive {
-3581 self.timers.set(
-3582 Timer::PerPath(path_id, PathTimer::PathKeepAlive),
-3583 now + interval,
-3584 self.qlog.with_time(now),
-3585 );
-3586 }
-3587 }
-3588
-3589 /// Sets the timer for when a previously issued CID should be retired next
-3590 fn reset_cid_retirement(&mut self, now: Instant) {
-3591 if let Some((_path, t)) = self.next_cid_retirement() {
-3592 self.timers.set(
-3593 Timer::Conn(ConnTimer::PushNewCid),
-3594 t,
-3595 self.qlog.with_time(now),
-3596 );
-3597 }
-3598 }
-3599
-3600 /// The next time when a previously issued CID should be retired
-3601 fn next_cid_retirement(&self) -> Option<(PathId, Instant)> {
-3602 self.local_cid_state
-3603 .iter()
-3604 .filter_map(|(path_id, cid_state)| cid_state.next_timeout().map(|t| (*path_id, t)))
-3605 .min_by_key(|(_path_id, timeout)| *timeout)
-3606 }
-3607
-3608 /// Handle the already-decrypted first packet from the client
-3609 ///
-3610 /// Decrypting the first packet in the `Endpoint` allows stateless packet handling to be more
-3611 /// efficient.
-3612 pub(crate) fn handle_first_packet(
-3613 &mut self,
-3614 now: Instant,
-3615 network_path: FourTuple,
-3616 ecn: Option<EcnCodepoint>,
-3617 packet_number: u64,
-3618 packet: InitialPacket,
-3619 remaining: Option<BytesMut>,
-3620 ) -> Result<(), ConnectionError> {
-3621 let span = trace_span!("first recv");
-3622 let _guard = span.enter();
-3623 debug_assert!(self.side.is_server());
-3624 let len = packet.header_data.len() + packet.payload.len();
-3625 let path_id = PathId::ZERO;
-3626 self.path_data_mut(path_id).total_recvd = len as u64;
-3627
-3628 if let Some(hs) = self.state.as_handshake_mut() {
-3629 hs.expected_token = packet.header.token.clone();
-3630 } else {
-3631 unreachable!("first packet must be delivered in Handshake state");
-3632 }
-3633
-3634 // The first packet is always on PathId::ZERO
-3635 self.on_packet_authenticated(
-3636 now,
-3637 SpaceId::Initial,
-3638 path_id,
-3639 ecn,
-3640 Some(packet_number),
-3641 false,
-3642 false,
-3643 );
-3644
-3645 let packet: Packet = packet.into();
-3646
-3647 let mut qlog = QlogRecvPacket::new(len);
-3648 qlog.header(&packet.header, Some(packet_number), path_id);
-3649
-3650 self.process_decrypted_packet(
-3651 now,
-3652 network_path,
-3653 path_id,
-3654 Some(packet_number),
-3655 packet,
-3656 &mut qlog,
-3657 )?;
-3658 self.qlog.emit_packet_received(qlog, now);
-3659 if let Some(data) = remaining {
-3660 self.handle_coalesced(now, network_path, path_id, ecn, data);
-3661 }
-3662
-3663 self.qlog.emit_recovery_metrics(
-3664 path_id,
-3665 &mut self.paths.get_mut(&path_id).unwrap().data,
-3666 now,
-3667 );
-3668
-3669 Ok(())
-3670 }
-3671
-3672 fn init_0rtt(&mut self, now: Instant) {
-3673 let (header, packet) = match self.crypto_state.session.early_crypto() {
-3674 Some(x) => x,
-3675 None => return,
-3676 };
-3677 if self.side.is_client() {
-3678 match self.crypto_state.session.transport_parameters() {
-3679 Ok(params) => {
-3680 let params = params
-3681 .expect("crypto layer didn't supply transport parameters with ticket");
-3682 // Certain values must not be cached
-3683 let params = TransportParameters {
-3684 initial_src_cid: None,
-3685 original_dst_cid: None,
-3686 preferred_address: None,
-3687 retry_src_cid: None,
-3688 stateless_reset_token: None,
-3689 min_ack_delay: None,
-3690 ack_delay_exponent: TransportParameters::default().ack_delay_exponent,
-3691 max_ack_delay: TransportParameters::default().max_ack_delay,
-3692 initial_max_path_id: None,
-3693 ..params
-3694 };
-3695 self.set_peer_params(params);
-3696 self.qlog.emit_peer_transport_params_restored(self, now);
-3697 }
-3698 Err(e) => {
-3699 error!("session ticket has malformed transport parameters: {}", e);
-3700 return;
+3517 if self.crypto_state.has_keys(EncryptionLevel::ZeroRtt) && is_1rtt {
+3518 // Discard 0-RTT keys soon after receiving a 1-RTT packet
+3519 self.set_key_discard_timer(now, space_id)
+3520 }
+3521 }
+3522 }
+3523 let space = self.spaces[space_id].for_path(path_id);
+3524 space.pending_acks.insert_one(packet, now);
+3525 if packet >= space.rx_packet.unwrap_or_default() {
+3526 space.rx_packet = Some(packet);
+3527 // Update outgoing spin bit, inverting iff we're the client
+3528 self.spin = self.side.is_client() ^ spin;
+3529 }
+3530 }
+3531
+3532 /// Resets the idle timeout timers
+3533 ///
+3534 /// Without multipath there is only the connection-wide idle timeout. When multipath is
+3535 /// enabled there is an additional per-path idle timeout.
+3536 fn reset_idle_timeout(&mut self, now: Instant, space: SpaceId, path_id: PathId) {
+3537 // First reset the global idle timeout.
+3538 if let Some(timeout) = self.idle_timeout {
+3539 if self.state.is_closed() {
+3540 self.timers
+3541 .stop(Timer::Conn(ConnTimer::Idle), self.qlog.with_time(now));
+3542 } else {
+3543 let dt = cmp::max(timeout, 3 * self.max_pto_all_paths(space));
+3544 self.timers.set(
+3545 Timer::Conn(ConnTimer::Idle),
+3546 now + dt,
+3547 self.qlog.with_time(now),
+3548 );
+3549 }
+3550 }
+3551
+3552 // Now handle the per-path state
+3553 if let Some(timeout) = self.path_data(path_id).idle_timeout {
+3554 if self.state.is_closed() {
+3555 self.timers.stop(
+3556 Timer::PerPath(path_id, PathTimer::PathIdle),
+3557 self.qlog.with_time(now),
+3558 );
+3559 } else {
+3560 let dt = cmp::max(timeout, 3 * self.pto(space, path_id));
+3561 self.timers.set(
+3562 Timer::PerPath(path_id, PathTimer::PathIdle),
+3563 now + dt,
+3564 self.qlog.with_time(now),
+3565 );
+3566 }
+3567 }
+3568 }
+3569
+3570 /// Resets both the [`ConnTimer::KeepAlive`] and [`PathTimer::PathKeepAlive`] timers
+3571 fn reset_keep_alive(&mut self, path_id: PathId, now: Instant) {
+3572 if !self.state.is_established() {
+3573 return;
+3574 }
+3575
+3576 if let Some(interval) = self.config.keep_alive_interval {
+3577 self.timers.set(
+3578 Timer::Conn(ConnTimer::KeepAlive),
+3579 now + interval,
+3580 self.qlog.with_time(now),
+3581 );
+3582 }
+3583
+3584 if let Some(interval) = self.path_data(path_id).keep_alive {
+3585 self.timers.set(
+3586 Timer::PerPath(path_id, PathTimer::PathKeepAlive),
+3587 now + interval,
+3588 self.qlog.with_time(now),
+3589 );
+3590 }
+3591 }
+3592
+3593 /// Sets the timer for when a previously issued CID should be retired next
+3594 fn reset_cid_retirement(&mut self, now: Instant) {
+3595 if let Some((_path, t)) = self.next_cid_retirement() {
+3596 self.timers.set(
+3597 Timer::Conn(ConnTimer::PushNewCid),
+3598 t,
+3599 self.qlog.with_time(now),
+3600 );
+3601 }
+3602 }
+3603
+3604 /// The next time when a previously issued CID should be retired
+3605 fn next_cid_retirement(&self) -> Option<(PathId, Instant)> {
+3606 self.local_cid_state
+3607 .iter()
+3608 .filter_map(|(path_id, cid_state)| cid_state.next_timeout().map(|t| (*path_id, t)))
+3609 .min_by_key(|(_path_id, timeout)| *timeout)
+3610 }
+3611
+3612 /// Handle the already-decrypted first packet from the client
+3613 ///
+3614 /// Decrypting the first packet in the `Endpoint` allows stateless packet handling to be more
+3615 /// efficient.
+3616 pub(crate) fn handle_first_packet(
+3617 &mut self,
+3618 now: Instant,
+3619 network_path: FourTuple,
+3620 ecn: Option<EcnCodepoint>,
+3621 packet_number: u64,
+3622 packet: InitialPacket,
+3623 remaining: Option<BytesMut>,
+3624 ) -> Result<(), ConnectionError> {
+3625 let span = trace_span!("first recv");
+3626 let _guard = span.enter();
+3627 debug_assert!(self.side.is_server());
+3628 let len = packet.header_data.len() + packet.payload.len();
+3629 let path_id = PathId::ZERO;
+3630 self.path_data_mut(path_id).total_recvd = len as u64;
+3631
+3632 if let Some(hs) = self.state.as_handshake_mut() {
+3633 hs.expected_token = packet.header.token.clone();
+3634 } else {
+3635 unreachable!("first packet must be delivered in Handshake state");
+3636 }
+3637
+3638 // The first packet is always on PathId::ZERO
+3639 self.on_packet_authenticated(
+3640 now,
+3641 SpaceId::Initial,
+3642 path_id,
+3643 ecn,
+3644 Some(packet_number),
+3645 false,
+3646 false,
+3647 );
+3648
+3649 let packet: Packet = packet.into();
+3650
+3651 let mut qlog = QlogRecvPacket::new(len);
+3652 qlog.header(&packet.header, Some(packet_number), path_id);
+3653
+3654 self.process_decrypted_packet(
+3655 now,
+3656 network_path,
+3657 path_id,
+3658 Some(packet_number),
+3659 packet,
+3660 &mut qlog,
+3661 )?;
+3662 self.qlog.emit_packet_received(qlog, now);
+3663 if let Some(data) = remaining {
+3664 self.handle_coalesced(now, network_path, path_id, ecn, data);
+3665 }
+3666
+3667 self.qlog.emit_recovery_metrics(
+3668 path_id,
+3669 &mut self.paths.get_mut(&path_id).unwrap().data,
+3670 now,
+3671 );
+3672
+3673 Ok(())
+3674 }
+3675
+3676 fn init_0rtt(&mut self, now: Instant) {
+3677 let (header, packet) = match self.crypto_state.session.early_crypto() {
+3678 Some(x) => x,
+3679 None => return,
+3680 };
+3681 if self.side.is_client() {
+3682 match self.crypto_state.session.transport_parameters() {
+3683 Ok(params) => {
+3684 let params = params
+3685 .expect("crypto layer didn't supply transport parameters with ticket");
+3686 // Certain values must not be cached
+3687 let params = TransportParameters {
+3688 initial_src_cid: None,
+3689 original_dst_cid: None,
+3690 preferred_address: None,
+3691 retry_src_cid: None,
+3692 stateless_reset_token: None,
+3693 min_ack_delay: None,
+3694 ack_delay_exponent: TransportParameters::default().ack_delay_exponent,
+3695 max_ack_delay: TransportParameters::default().max_ack_delay,
+3696 initial_max_path_id: None,
+3697 ..params
+3698 };
+3699 self.set_peer_params(params);
+3700 self.qlog.emit_peer_transport_params_restored(self, now);
3701 }
-3702 }
-3703 }
-3704 trace!("0-RTT enabled");
-3705 self.crypto_state.enable_zero_rtt(header, packet);
-3706 }
-3707
-3708 fn read_crypto(
-3709 &mut self,
-3710 space: SpaceId,
-3711 crypto: &frame::Crypto,
-3712 payload_len: usize,
-3713 ) -> Result<(), TransportError> {
-3714 let expected = if !self.state.is_handshake() {
-3715 SpaceId::Data
-3716 } else if self.highest_space == SpaceId::Initial {
-3717 SpaceId::Initial
-3718 } else {
-3719 // On the server, self.highest_space can be Data after receiving the client's first
-3720 // flight, but we expect Handshake CRYPTO until the handshake is complete.
-3721 SpaceId::Handshake
-3722 };
-3723 // We can't decrypt Handshake packets when highest_space is Initial, CRYPTO frames in 0-RTT
-3724 // packets are illegal, and we don't process 1-RTT packets until the handshake is
-3725 // complete. Therefore, we will never see CRYPTO data from a later-than-expected space.
-3726 debug_assert!(space <= expected, "received out-of-order CRYPTO data");
-3727
-3728 let end = crypto.offset + crypto.data.len() as u64;
-3729 if space < expected
-3730 && end
-3731 > self.crypto_state.spaces[space.kind()]
-3732 .crypto_stream
-3733 .bytes_read()
-3734 {
-3735 warn!(
-3736 "received new {:?} CRYPTO data when expecting {:?}",
-3737 space, expected
-3738 );
-3739 return Err(TransportError::PROTOCOL_VIOLATION(
-3740 "new data at unexpected encryption level",
-3741 ));
-3742 }
-3743
-3744 let crypto_space = &mut self.crypto_state.spaces[space.kind()];
-3745 let max = end.saturating_sub(crypto_space.crypto_stream.bytes_read());
-3746 if max > self.config.crypto_buffer_size as u64 {
-3747 return Err(TransportError::CRYPTO_BUFFER_EXCEEDED(""));
-3748 }
-3749
-3750 crypto_space
-3751 .crypto_stream
-3752 .insert(crypto.offset, crypto.data.clone(), payload_len);
-3753 while let Some(chunk) = crypto_space.crypto_stream.read(usize::MAX, true) {
-3754 trace!("consumed {} CRYPTO bytes", chunk.bytes.len());
-3755 if self.crypto_state.session.read_handshake(&chunk.bytes)? {
-3756 self.events.push_back(Event::HandshakeDataReady);
-3757 }
-3758 }
-3759
-3760 Ok(())
-3761 }
-3762
-3763 fn write_crypto(&mut self) {
-3764 loop {
-3765 let space = self.highest_space;
-3766 let mut outgoing = Vec::new();
-3767 if let Some(crypto) = self.crypto_state.session.write_handshake(&mut outgoing) {
-3768 match space {
-3769 SpaceId::Initial => {
-3770 self.upgrade_crypto(SpaceId::Handshake, crypto);
-3771 }
-3772 SpaceId::Handshake => {
-3773 self.upgrade_crypto(SpaceId::Data, crypto);
-3774 }
-3775 _ => unreachable!("got updated secrets during 1-RTT"),
-3776 }
-3777 }
-3778 if outgoing.is_empty() {
-3779 if space == self.highest_space {
-3780 break;
-3781 } else {
-3782 // Keys updated, check for more data to send
-3783 continue;
-3784 }
-3785 }
-3786 let offset = self.crypto_state.spaces[space.kind()].crypto_offset;
-3787 let outgoing = Bytes::from(outgoing);
-3788 if let Some(hs) = self.state.as_handshake_mut()
-3789 && space == SpaceId::Initial
-3790 && offset == 0
-3791 && self.side.is_client()
-3792 {
-3793 hs.client_hello = Some(outgoing.clone());
-3794 }
-3795 self.crypto_state.spaces[space.kind()].crypto_offset += outgoing.len() as u64;
-3796 trace!("wrote {} {:?} CRYPTO bytes", outgoing.len(), space);
-3797 self.spaces[space].pending.crypto.push_back(frame::Crypto {
-3798 offset,
-3799 data: outgoing,
-3800 });
-3801 }
-3802 }
-3803
-3804 /// Switch to stronger cryptography during handshake
-3805 fn upgrade_crypto(&mut self, space: SpaceId, crypto: Keys) {
-3806 debug_assert!(
-3807 !self.crypto_state.has_keys(space.encryption_level()),
-3808 "already reached packet space {space:?}"
-3809 );
-3810 trace!("{:?} keys ready", space);
-3811 if space == SpaceId::Data {
-3812 // Precompute the first key update
-3813 self.crypto_state.next_crypto = Some(
-3814 self.crypto_state
-3815 .session
-3816 .next_1rtt_keys()
-3817 .expect("handshake should be complete"),
-3818 );
-3819 }
-3820
-3821 self.crypto_state.spaces[space.kind()].keys = Some(crypto);
-3822 debug_assert!(space as usize > self.highest_space as usize);
-3823 self.highest_space = space;
-3824 if space == SpaceId::Data && self.side.is_client() {
-3825 // Discard 0-RTT keys because 1-RTT keys are available.
-3826 self.crypto_state.discard_zero_rtt();
-3827 }
-3828 }
-3829
-3830 fn discard_space(&mut self, now: Instant, space_id: SpaceId) {
-3831 debug_assert!(space_id != SpaceId::Data);
-3832 trace!("discarding {:?} keys", space_id);
-3833 if space_id == SpaceId::Initial {
-3834 // No longer needed
-3835 if let ConnectionSide::Client { token, .. } = &mut self.side {
-3836 *token = Bytes::new();
-3837 }
-3838 }
-3839 self.crypto_state.spaces[space_id.kind()].keys = None;
-3840 let space = &mut self.spaces[space_id];
-3841 let pns = space.for_path(PathId::ZERO);
-3842 pns.time_of_last_ack_eliciting_packet = None;
-3843 pns.loss_time = None;
-3844 pns.loss_probes = 0;
-3845 let sent_packets = mem::take(&mut pns.sent_packets);
-3846 let path = self.paths.get_mut(&PathId::ZERO).unwrap();
-3847 for (_, packet) in sent_packets.into_iter() {
-3848 path.data.remove_in_flight(&packet);
-3849 }
-3850
-3851 self.set_loss_detection_timer(now, PathId::ZERO)
-3852 }
-3853
-3854 fn handle_coalesced(
-3855 &mut self,
-3856 now: Instant,
-3857 network_path: FourTuple,
-3858 path_id: PathId,
-3859 ecn: Option<EcnCodepoint>,
-3860 data: BytesMut,
-3861 ) {
-3862 self.path_data_mut(path_id)
-3863 .inc_total_recvd(data.len() as u64);
-3864 let mut remaining = Some(data);
-3865 let cid_len = self
-3866 .local_cid_state
-3867 .values()
-3868 .map(|cid_state| cid_state.cid_len())
-3869 .next()
-3870 .expect("one cid_state must exist");
-3871 while let Some(data) = remaining {
-3872 match PartialDecode::new(
-3873 data,
-3874 &FixedLengthConnectionIdParser::new(cid_len),
-3875 &[self.version],
-3876 self.endpoint_config.grease_quic_bit,
-3877 ) {
-3878 Ok((partial_decode, rest)) => {
-3879 remaining = rest;
-3880 self.handle_decode(now, network_path, path_id, ecn, partial_decode);
-3881 }
-3882 Err(e) => {
-3883 trace!("malformed header: {}", e);
-3884 return;
+3702 Err(e) => {
+3703 error!("session ticket has malformed transport parameters: {}", e);
+3704 return;
+3705 }
+3706 }
+3707 }
+3708 trace!("0-RTT enabled");
+3709 self.crypto_state.enable_zero_rtt(header, packet);
+3710 }
+3711
+3712 fn read_crypto(
+3713 &mut self,
+3714 space: SpaceId,
+3715 crypto: &frame::Crypto,
+3716 payload_len: usize,
+3717 ) -> Result<(), TransportError> {
+3718 let expected = if !self.state.is_handshake() {
+3719 SpaceId::Data
+3720 } else if self.highest_space == SpaceId::Initial {
+3721 SpaceId::Initial
+3722 } else {
+3723 // On the server, self.highest_space can be Data after receiving the client's first
+3724 // flight, but we expect Handshake CRYPTO until the handshake is complete.
+3725 SpaceId::Handshake
+3726 };
+3727 // We can't decrypt Handshake packets when highest_space is Initial, CRYPTO frames in 0-RTT
+3728 // packets are illegal, and we don't process 1-RTT packets until the handshake is
+3729 // complete. Therefore, we will never see CRYPTO data from a later-than-expected space.
+3730 debug_assert!(space <= expected, "received out-of-order CRYPTO data");
+3731
+3732 let end = crypto.offset + crypto.data.len() as u64;
+3733 if space < expected
+3734 && end
+3735 > self.crypto_state.spaces[space.kind()]
+3736 .crypto_stream
+3737 .bytes_read()
+3738 {
+3739 warn!(
+3740 "received new {:?} CRYPTO data when expecting {:?}",
+3741 space, expected
+3742 );
+3743 return Err(TransportError::PROTOCOL_VIOLATION(
+3744 "new data at unexpected encryption level",
+3745 ));
+3746 }
+3747
+3748 let crypto_space = &mut self.crypto_state.spaces[space.kind()];
+3749 let max = end.saturating_sub(crypto_space.crypto_stream.bytes_read());
+3750 if max > self.config.crypto_buffer_size as u64 {
+3751 return Err(TransportError::CRYPTO_BUFFER_EXCEEDED(""));
+3752 }
+3753
+3754 crypto_space
+3755 .crypto_stream
+3756 .insert(crypto.offset, crypto.data.clone(), payload_len);
+3757 while let Some(chunk) = crypto_space.crypto_stream.read(usize::MAX, true) {
+3758 trace!("consumed {} CRYPTO bytes", chunk.bytes.len());
+3759 if self.crypto_state.session.read_handshake(&chunk.bytes)? {
+3760 self.events.push_back(Event::HandshakeDataReady);
+3761 }
+3762 }
+3763
+3764 Ok(())
+3765 }
+3766
+3767 fn write_crypto(&mut self) {
+3768 loop {
+3769 let space = self.highest_space;
+3770 let mut outgoing = Vec::new();
+3771 if let Some(crypto) = self.crypto_state.session.write_handshake(&mut outgoing) {
+3772 match space {
+3773 SpaceId::Initial => {
+3774 self.upgrade_crypto(SpaceId::Handshake, crypto);
+3775 }
+3776 SpaceId::Handshake => {
+3777 self.upgrade_crypto(SpaceId::Data, crypto);
+3778 }
+3779 _ => unreachable!("got updated secrets during 1-RTT"),
+3780 }
+3781 }
+3782 if outgoing.is_empty() {
+3783 if space == self.highest_space {
+3784 break;
+3785 } else {
+3786 // Keys updated, check for more data to send
+3787 continue;
+3788 }
+3789 }
+3790 let offset = self.crypto_state.spaces[space.kind()].crypto_offset;
+3791 let outgoing = Bytes::from(outgoing);
+3792 if let Some(hs) = self.state.as_handshake_mut()
+3793 && space == SpaceId::Initial
+3794 && offset == 0
+3795 && self.side.is_client()
+3796 {
+3797 hs.client_hello = Some(outgoing.clone());
+3798 }
+3799 self.crypto_state.spaces[space.kind()].crypto_offset += outgoing.len() as u64;
+3800 trace!("wrote {} {:?} CRYPTO bytes", outgoing.len(), space);
+3801 self.spaces[space].pending.crypto.push_back(frame::Crypto {
+3802 offset,
+3803 data: outgoing,
+3804 });
+3805 }
+3806 }
+3807
+3808 /// Switch to stronger cryptography during handshake
+3809 fn upgrade_crypto(&mut self, space: SpaceId, crypto: Keys) {
+3810 debug_assert!(
+3811 !self.crypto_state.has_keys(space.encryption_level()),
+3812 "already reached packet space {space:?}"
+3813 );
+3814 trace!("{:?} keys ready", space);
+3815 if space == SpaceId::Data {
+3816 // Precompute the first key update
+3817 self.crypto_state.next_crypto = Some(
+3818 self.crypto_state
+3819 .session
+3820 .next_1rtt_keys()
+3821 .expect("handshake should be complete"),
+3822 );
+3823 }
+3824
+3825 self.crypto_state.spaces[space.kind()].keys = Some(crypto);
+3826 debug_assert!(space as usize > self.highest_space as usize);
+3827 self.highest_space = space;
+3828 if space == SpaceId::Data && self.side.is_client() {
+3829 // Discard 0-RTT keys because 1-RTT keys are available.
+3830 self.crypto_state.discard_zero_rtt();
+3831 }
+3832 }
+3833
+3834 fn discard_space(&mut self, now: Instant, space_id: SpaceId) {
+3835 debug_assert!(space_id != SpaceId::Data);
+3836 trace!("discarding {:?} keys", space_id);
+3837 if space_id == SpaceId::Initial {
+3838 // No longer needed
+3839 if let ConnectionSide::Client { token, .. } = &mut self.side {
+3840 *token = Bytes::new();
+3841 }
+3842 }
+3843 self.crypto_state.spaces[space_id.kind()].keys = None;
+3844 let space = &mut self.spaces[space_id];
+3845 let pns = space.for_path(PathId::ZERO);
+3846 pns.time_of_last_ack_eliciting_packet = None;
+3847 pns.loss_time = None;
+3848 pns.loss_probes = 0;
+3849 let sent_packets = mem::take(&mut pns.sent_packets);
+3850 let path = self.paths.get_mut(&PathId::ZERO).unwrap();
+3851 for (_, packet) in sent_packets.into_iter() {
+3852 path.data.remove_in_flight(&packet);
+3853 }
+3854
+3855 self.set_loss_detection_timer(now, PathId::ZERO)
+3856 }
+3857
+3858 fn handle_coalesced(
+3859 &mut self,
+3860 now: Instant,
+3861 network_path: FourTuple,
+3862 path_id: PathId,
+3863 ecn: Option<EcnCodepoint>,
+3864 data: BytesMut,
+3865 ) {
+3866 self.path_data_mut(path_id)
+3867 .inc_total_recvd(data.len() as u64);
+3868 let mut remaining = Some(data);
+3869 let cid_len = self
+3870 .local_cid_state
+3871 .values()
+3872 .map(|cid_state| cid_state.cid_len())
+3873 .next()
+3874 .expect("one cid_state must exist");
+3875 while let Some(data) = remaining {
+3876 match PartialDecode::new(
+3877 data,
+3878 &FixedLengthConnectionIdParser::new(cid_len),
+3879 &[self.version],
+3880 self.endpoint_config.grease_quic_bit,
+3881 ) {
+3882 Ok((partial_decode, rest)) => {
+3883 remaining = rest;
+3884 self.handle_decode(now, network_path, path_id, ecn, partial_decode);
3885 }
-3886 }
-3887 }
-3888 }
-3889
-3890 fn handle_decode(
-3891 &mut self,
-3892 now: Instant,
-3893 network_path: FourTuple,
-3894 path_id: PathId,
-3895 ecn: Option<EcnCodepoint>,
-3896 partial_decode: PartialDecode,
-3897 ) {
-3898 let qlog = QlogRecvPacket::new(partial_decode.len());
-3899 if let Some(decoded) = self
-3900 .crypto_state
-3901 .unprotect_header(partial_decode, self.peer_params.stateless_reset_token)
-3902 {
-3903 self.handle_packet(
-3904 now,
-3905 network_path,
-3906 path_id,
-3907 ecn,
-3908 decoded.packet,
-3909 decoded.stateless_reset,
-3910 qlog,
-3911 );
-3912 }
-3913 }
-3914
-3915 fn handle_packet(
-3916 &mut self,
-3917 now: Instant,
-3918 network_path: FourTuple,
-3919 path_id: PathId,
-3920 ecn: Option<EcnCodepoint>,
-3921 packet: Option<Packet>,
-3922 stateless_reset: bool,
-3923 mut qlog: QlogRecvPacket,
-3924 ) {
-3925 self.stats.udp_rx.ios += 1;
-3926 self.path_stats.entry(path_id).or_default().udp_rx.ios += 1;
-3927
-3928 if let Some(ref packet) = packet {
-3929 trace!(
-3930 "got {:?} packet ({} bytes) from {} using id {}",
-3931 packet.header.space(),
-3932 packet.payload.len() + packet.header_data.len(),
-3933 network_path,
-3934 packet.header.dst_cid(),
-3935 );
-3936 }
-3937
-3938 if self.is_handshaking() {
-3939 if path_id != PathId::ZERO {
-3940 debug!(%network_path, %path_id, "discarding multipath packet during handshake");
-3941 return;
-3942 }
-3943 if network_path != self.path_data_mut(path_id).network_path {
-3944 if let Some(hs) = self.state.as_handshake() {
-3945 if hs.allow_server_migration {
-3946 trace!(%network_path, prev = %self.path_data(path_id).network_path, "server migrated to new remote");
-3947 self.path_data_mut(path_id).network_path = network_path;
-3948 self.qlog.emit_tuple_assigned(path_id, network_path, now);
-3949 } else {
-3950 debug!("discarding packet with unexpected remote during handshake");
-3951 return;
-3952 }
-3953 } else {
-3954 debug!("discarding packet with unexpected remote during handshake");
-3955 return;
-3956 }
-3957 }
-3958 }
-3959
-3960 let was_closed = self.state.is_closed();
-3961 let was_drained = self.state.is_drained();
-3962
-3963 let decrypted = match packet {
-3964 None => Err(None),
-3965 Some(mut packet) => self
-3966 .decrypt_packet(now, path_id, &mut packet)
-3967 .map(move |number| (packet, number)),
-3968 };
-3969 let result = match decrypted {
-3970 _ if stateless_reset => {
-3971 debug!("got stateless reset");
-3972 Err(ConnectionError::Reset)
-3973 }
-3974 Err(Some(e)) => {
-3975 warn!("illegal packet: {}", e);
-3976 Err(e.into())
+3886 Err(e) => {
+3887 trace!("malformed header: {}", e);
+3888 return;
+3889 }
+3890 }
+3891 }
+3892 }
+3893
+3894 fn handle_decode(
+3895 &mut self,
+3896 now: Instant,
+3897 network_path: FourTuple,
+3898 path_id: PathId,
+3899 ecn: Option<EcnCodepoint>,
+3900 partial_decode: PartialDecode,
+3901 ) {
+3902 let qlog = QlogRecvPacket::new(partial_decode.len());
+3903 if let Some(decoded) = self
+3904 .crypto_state
+3905 .unprotect_header(partial_decode, self.peer_params.stateless_reset_token)
+3906 {
+3907 self.handle_packet(
+3908 now,
+3909 network_path,
+3910 path_id,
+3911 ecn,
+3912 decoded.packet,
+3913 decoded.stateless_reset,
+3914 qlog,
+3915 );
+3916 }
+3917 }
+3918
+3919 fn handle_packet(
+3920 &mut self,
+3921 now: Instant,
+3922 network_path: FourTuple,
+3923 path_id: PathId,
+3924 ecn: Option<EcnCodepoint>,
+3925 packet: Option<Packet>,
+3926 stateless_reset: bool,
+3927 mut qlog: QlogRecvPacket,
+3928 ) {
+3929 self.stats.udp_rx.ios += 1;
+3930 self.path_stats.entry(path_id).or_default().udp_rx.ios += 1;
+3931
+3932 if let Some(ref packet) = packet {
+3933 trace!(
+3934 "got {:?} packet ({} bytes) from {} using id {}",
+3935 packet.header.space(),
+3936 packet.payload.len() + packet.header_data.len(),
+3937 network_path,
+3938 packet.header.dst_cid(),
+3939 );
+3940 }
+3941
+3942 if self.is_handshaking() {
+3943 if path_id != PathId::ZERO {
+3944 debug!(%network_path, %path_id, "discarding multipath packet during handshake");
+3945 return;
+3946 }
+3947 if network_path != self.path_data_mut(path_id).network_path {
+3948 if let Some(hs) = self.state.as_handshake() {
+3949 if hs.allow_server_migration {
+3950 trace!(%network_path, prev = %self.path_data(path_id).network_path, "server migrated to new remote");
+3951 self.path_data_mut(path_id).network_path = network_path;
+3952 self.qlog.emit_tuple_assigned(path_id, network_path, now);
+3953 } else {
+3954 debug!("discarding packet with unexpected remote during handshake");
+3955 return;
+3956 }
+3957 } else {
+3958 debug!("discarding packet with unexpected remote during handshake");
+3959 return;
+3960 }
+3961 }
+3962 }
+3963
+3964 let was_closed = self.state.is_closed();
+3965 let was_drained = self.state.is_drained();
+3966
+3967 let decrypted = match packet {
+3968 None => Err(None),
+3969 Some(mut packet) => self
+3970 .decrypt_packet(now, path_id, &mut packet)
+3971 .map(move |number| (packet, number)),
+3972 };
+3973 let result = match decrypted {
+3974 _ if stateless_reset => {
+3975 debug!("got stateless reset");
+3976 Err(ConnectionError::Reset)
3977 }
-3978 Err(None) => {
-3979 debug!("failed to authenticate packet");
-3980 self.authentication_failures += 1;
-3981 let integrity_limit = self
-3982 .crypto_state
-3983 .integrity_limit(self.highest_space.kind())
-3984 .unwrap();
-3985 if self.authentication_failures > integrity_limit {
-3986 Err(TransportError::AEAD_LIMIT_REACHED("integrity limit violated").into())
-3987 } else {
-3988 return;
-3989 }
-3990 }
-3991 Ok((packet, number)) => {
-3992 qlog.header(&packet.header, number, path_id);
-3993 let span = match number {
-3994 Some(pn) => trace_span!("recv", space = ?packet.header.space(), pn),
-3995 None => trace_span!("recv", space = ?packet.header.space()),
-3996 };
-3997 let _guard = span.enter();
-3998
-3999 let dedup = self.spaces[packet.header.space()]
-4000 .path_space_mut(path_id)
-4001 .map(|pns| &mut pns.dedup);
-4002 if number.zip(dedup).is_some_and(|(n, d)| d.insert(n)) {
-4003 debug!("discarding possible duplicate packet");
-4004 self.qlog.emit_packet_received(qlog, now);
-4005 return;
-4006 } else if self.state.is_handshake() && packet.header.is_short() {
-4007 // TODO: SHOULD buffer these to improve reordering tolerance.
-4008 trace!("dropping short packet during handshake");
-4009 self.qlog.emit_packet_received(qlog, now);
-4010 return;
-4011 } else {
-4012 if let Header::Initial(InitialHeader { ref token, .. }) = packet.header
-4013 && let Some(hs) = self.state.as_handshake()
-4014 && self.side.is_server()
-4015 && token != &hs.expected_token
-4016 {
-4017 // Clients must send the same retry token in every Initial. Initial
-4018 // packets can be spoofed, so we discard rather than killing the
-4019 // connection.
-4020 warn!("discarding Initial with invalid retry token");
-4021 self.qlog.emit_packet_received(qlog, now);
-4022 return;
-4023 }
-4024
-4025 if !self.state.is_closed() {
-4026 let spin = match packet.header {
-4027 Header::Short { spin, .. } => spin,
-4028 _ => false,
-4029 };
-4030
-4031 if self.side().is_server() && !self.abandoned_paths.contains(&path_id) {
-4032 // Only the client is allowed to open paths
-4033 self.ensure_path(path_id, network_path, now, number);
-4034 }
-4035 if self.paths.contains_key(&path_id) {
-4036 self.on_packet_authenticated(
-4037 now,
-4038 packet.header.space(),
-4039 path_id,
-4040 ecn,
-4041 number,
-4042 spin,
-4043 packet.header.is_1rtt(),
-4044 );
-4045 }
-4046 }
-4047
-4048 let res = self.process_decrypted_packet(
-4049 now,
-4050 network_path,
-4051 path_id,
-4052 number,
-4053 packet,
-4054 &mut qlog,
-4055 );
-4056
-4057 self.qlog.emit_packet_received(qlog, now);
-4058 res
-4059 }
-4060 }
-4061 };
-4062
-4063 // State transitions for error cases
-4064 if let Err(conn_err) = result {
-4065 match conn_err {
-4066 ConnectionError::ApplicationClosed(reason) => self.state.move_to_closed(reason),
-4067 ConnectionError::ConnectionClosed(reason) => self.state.move_to_closed(reason),
-4068 ConnectionError::Reset
-4069 | ConnectionError::TransportError(TransportError {
-4070 code: TransportErrorCode::AEAD_LIMIT_REACHED,
-4071 ..
-4072 }) => {
-4073 self.state.move_to_drained(Some(conn_err));
-4074 }
-4075 ConnectionError::TimedOut => {
-4076 unreachable!("timeouts aren't generated by packet processing");
-4077 }
-4078 ConnectionError::TransportError(err) => {
-4079 debug!("closing connection due to transport error: {}", err);
-4080 self.state.move_to_closed(err);
+3978 Err(Some(e)) => {
+3979 warn!("illegal packet: {}", e);
+3980 Err(e.into())
+3981 }
+3982 Err(None) => {
+3983 debug!("failed to authenticate packet");
+3984 self.authentication_failures += 1;
+3985 let integrity_limit = self
+3986 .crypto_state
+3987 .integrity_limit(self.highest_space.kind())
+3988 .unwrap();
+3989 if self.authentication_failures > integrity_limit {
+3990 Err(TransportError::AEAD_LIMIT_REACHED("integrity limit violated").into())
+3991 } else {
+3992 return;
+3993 }
+3994 }
+3995 Ok((packet, number)) => {
+3996 qlog.header(&packet.header, number, path_id);
+3997 let span = match number {
+3998 Some(pn) => trace_span!("recv", space = ?packet.header.space(), pn),
+3999 None => trace_span!("recv", space = ?packet.header.space()),
+4000 };
+4001 let _guard = span.enter();
+4002
+4003 let dedup = self.spaces[packet.header.space()]
+4004 .path_space_mut(path_id)
+4005 .map(|pns| &mut pns.dedup);
+4006 if number.zip(dedup).is_some_and(|(n, d)| d.insert(n)) {
+4007 debug!("discarding possible duplicate packet");
+4008 self.qlog.emit_packet_received(qlog, now);
+4009 return;
+4010 } else if self.state.is_handshake() && packet.header.is_short() {
+4011 // TODO: SHOULD buffer these to improve reordering tolerance.
+4012 trace!("dropping short packet during handshake");
+4013 self.qlog.emit_packet_received(qlog, now);
+4014 return;
+4015 } else {
+4016 if let Header::Initial(InitialHeader { ref token, .. }) = packet.header
+4017 && let Some(hs) = self.state.as_handshake()
+4018 && self.side.is_server()
+4019 && token != &hs.expected_token
+4020 {
+4021 // Clients must send the same retry token in every Initial. Initial
+4022 // packets can be spoofed, so we discard rather than killing the
+4023 // connection.
+4024 warn!("discarding Initial with invalid retry token");
+4025 self.qlog.emit_packet_received(qlog, now);
+4026 return;
+4027 }
+4028
+4029 if !self.state.is_closed() {
+4030 let spin = match packet.header {
+4031 Header::Short { spin, .. } => spin,
+4032 _ => false,
+4033 };
+4034
+4035 if self.side().is_server() && !self.abandoned_paths.contains(&path_id) {
+4036 // Only the client is allowed to open paths
+4037 self.ensure_path(path_id, network_path, now, number);
+4038 }
+4039 if self.paths.contains_key(&path_id) {
+4040 self.on_packet_authenticated(
+4041 now,
+4042 packet.header.space(),
+4043 path_id,
+4044 ecn,
+4045 number,
+4046 spin,
+4047 packet.header.is_1rtt(),
+4048 );
+4049 }
+4050 }
+4051
+4052 let res = self.process_decrypted_packet(
+4053 now,
+4054 network_path,
+4055 path_id,
+4056 number,
+4057 packet,
+4058 &mut qlog,
+4059 );
+4060
+4061 self.qlog.emit_packet_received(qlog, now);
+4062 res
+4063 }
+4064 }
+4065 };
+4066
+4067 // State transitions for error cases
+4068 if let Err(conn_err) = result {
+4069 match conn_err {
+4070 ConnectionError::ApplicationClosed(reason) => self.state.move_to_closed(reason),
+4071 ConnectionError::ConnectionClosed(reason) => self.state.move_to_closed(reason),
+4072 ConnectionError::Reset
+4073 | ConnectionError::TransportError(TransportError {
+4074 code: TransportErrorCode::AEAD_LIMIT_REACHED,
+4075 ..
+4076 }) => {
+4077 self.state.move_to_drained(Some(conn_err));
+4078 }
+4079 ConnectionError::TimedOut => {
+4080 unreachable!("timeouts aren't generated by packet processing");
4081 }
-4082 ConnectionError::VersionMismatch => {
-4083 self.state.move_to_draining(Some(conn_err));
-4084 }
-4085 ConnectionError::LocallyClosed => {
-4086 unreachable!("LocallyClosed isn't generated by packet processing");
-4087 }
-4088 ConnectionError::CidsExhausted => {
-4089 unreachable!("CidsExhausted isn't generated by packet processing");
-4090 }
-4091 };
-4092 }
-4093
-4094 if !was_closed && self.state.is_closed() {
-4095 self.close_common();
-4096 if !self.state.is_drained() {
-4097 self.set_close_timer(now);
-4098 }
-4099 }
-4100 if !was_drained && self.state.is_drained() {
-4101 self.endpoint_events.push_back(EndpointEventInner::Drained);
-4102 // Close timer may have been started previously, e.g. if we sent a close and got a
-4103 // stateless reset in response
-4104 self.timers
-4105 .stop(Timer::Conn(ConnTimer::Close), self.qlog.with_time(now));
-4106 }
-4107
-4108 // Transmit CONNECTION_CLOSE if necessary.
-4109 //
-4110 // If we received a valid packet and we are in the closed state we should respond
-4111 // with a CONNECTION_CLOSE frame.
-4112 // TODO: This SHOULD be rate-limited according to §10.2.1 of QUIC-TRANSPORT, but
-4113 // that does not yet happen. This is triggered by each received packet.
-4114 if matches!(self.state.as_type(), StateType::Closed) {
-4115 // From https://www.rfc-editor.org/rfc/rfc9000.html#section-10.2.1-7
-4116 //
-4117 // While in the closing state we must either:
-4118 // - discard packets coming from an un-validated remote OR
-4119 // - ensure we do not send more than 3 times the received data
+4082 ConnectionError::TransportError(err) => {
+4083 debug!("closing connection due to transport error: {}", err);
+4084 self.state.move_to_closed(err);
+4085 }
+4086 ConnectionError::VersionMismatch => {
+4087 self.state.move_to_draining(Some(conn_err));
+4088 }
+4089 ConnectionError::LocallyClosed => {
+4090 unreachable!("LocallyClosed isn't generated by packet processing");
+4091 }
+4092 ConnectionError::CidsExhausted => {
+4093 unreachable!("CidsExhausted isn't generated by packet processing");
+4094 }
+4095 };
+4096 }
+4097
+4098 if !was_closed && self.state.is_closed() {
+4099 self.close_common();
+4100 if !self.state.is_drained() {
+4101 self.set_close_timer(now);
+4102 }
+4103 }
+4104 if !was_drained && self.state.is_drained() {
+4105 self.endpoint_events.push_back(EndpointEventInner::Drained);
+4106 // Close timer may have been started previously, e.g. if we sent a close and got a
+4107 // stateless reset in response
+4108 self.timers
+4109 .stop(Timer::Conn(ConnTimer::Close), self.qlog.with_time(now));
+4110 }
+4111
+4112 // Transmit CONNECTION_CLOSE if necessary.
+4113 //
+4114 // If we received a valid packet and we are in the closed state we should respond
+4115 // with a CONNECTION_CLOSE frame.
+4116 // TODO: This SHOULD be rate-limited according to §10.2.1 of QUIC-TRANSPORT, but
+4117 // that does not yet happen. This is triggered by each received packet.
+4118 if matches!(self.state.as_type(), StateType::Closed) {
+4119 // From https://www.rfc-editor.org/rfc/rfc9000.html#section-10.2.1-7
4120 //
-4121 // Doing the 2nd would mean we would be able to send CONNECTION_CLOSE to a peer
-4122 // who was (involuntary) migrated just at the time we initiated immediate
-4123 // close. It is a lot more work though. So while we would like to do this for
-4124 // now we only do 1.
-4125 //
-4126 // Another shortcoming of the current implementation is that when we have a
-4127 // previous PathData which is validated and the remote matches that path, we
-4128 // should schedule CONNECTION_CLOSE on that path. However currently we can not
-4129 // schedule such a packet. We should also fix this some day. This makes us
-4130 // vulnerable to an attacker faking a migration at the right time and then we'd
-4131 // be unable to send the CONNECTION_CLOSE to the real remote.
-4132 if self
-4133 .paths
-4134 .get(&path_id)
-4135 .map(|p| p.data.validated && p.data.network_path == network_path)
-4136 .unwrap_or(false)
-4137 {
-4138 self.connection_close_pending = true;
-4139 }
-4140 }
-4141 }
-4142
-4143 fn process_decrypted_packet(
-4144 &mut self,
-4145 now: Instant,
-4146 network_path: FourTuple,
-4147 path_id: PathId,
-4148 number: Option<u64>,
-4149 packet: Packet,
-4150 qlog: &mut QlogRecvPacket,
-4151 ) -> Result<(), ConnectionError> {
-4152 if !self.paths.contains_key(&path_id) {
-4153 // There is a chance this is a server side, first (for this path) packet, which would
-4154 // be a protocol violation. It's more likely, however, that this is a packet of a
-4155 // pruned path
-4156 trace!(%path_id, ?number, "discarding packet for unknown path");
-4157 return Ok(());
-4158 }
-4159 let state = match self.state.as_type() {
-4160 StateType::Established => {
-4161 match packet.header.space() {
-4162 SpaceId::Data => self.process_payload(
-4163 now,
-4164 network_path,
-4165 path_id,
-4166 number.unwrap(),
-4167 packet,
-4168 qlog,
-4169 )?,
-4170 _ if packet.header.has_frames() => {
-4171 self.process_early_payload(now, path_id, packet, qlog)?
-4172 }
-4173 _ => {
-4174 trace!("discarding unexpected pre-handshake packet");
-4175 }
-4176 }
-4177 return Ok(());
-4178 }
-4179 StateType::Closed => {
-4180 for result in frame::Iter::new(packet.payload.freeze())? {
-4181 let frame = match result {
-4182 Ok(frame) => frame,
-4183 Err(err) => {
-4184 debug!("frame decoding error: {err:?}");
-4185 continue;
-4186 }
-4187 };
-4188 qlog.frame(&frame);
-4189
-4190 if let Frame::Padding = frame {
-4191 continue;
-4192 };
+4121 // While in the closing state we must either:
+4122 // - discard packets coming from an un-validated remote OR
+4123 // - ensure we do not send more than 3 times the received data
+4124 //
+4125 // Doing the 2nd would mean we would be able to send CONNECTION_CLOSE to a peer
+4126 // who was (involuntary) migrated just at the time we initiated immediate
+4127 // close. It is a lot more work though. So while we would like to do this for
+4128 // now we only do 1.
+4129 //
+4130 // Another shortcoming of the current implementation is that when we have a
+4131 // previous PathData which is validated and the remote matches that path, we
+4132 // should schedule CONNECTION_CLOSE on that path. However currently we can not
+4133 // schedule such a packet. We should also fix this some day. This makes us
+4134 // vulnerable to an attacker faking a migration at the right time and then we'd
+4135 // be unable to send the CONNECTION_CLOSE to the real remote.
+4136 if self
+4137 .paths
+4138 .get(&path_id)
+4139 .map(|p| p.data.validated && p.data.network_path == network_path)
+4140 .unwrap_or(false)
+4141 {
+4142 self.connection_close_pending = true;
+4143 }
+4144 }
+4145 }
+4146
+4147 fn process_decrypted_packet(
+4148 &mut self,
+4149 now: Instant,
+4150 network_path: FourTuple,
+4151 path_id: PathId,
+4152 number: Option<u64>,
+4153 packet: Packet,
+4154 qlog: &mut QlogRecvPacket,
+4155 ) -> Result<(), ConnectionError> {
+4156 if !self.paths.contains_key(&path_id) {
+4157 // There is a chance this is a server side, first (for this path) packet, which would
+4158 // be a protocol violation. It's more likely, however, that this is a packet of a
+4159 // pruned path
+4160 trace!(%path_id, ?number, "discarding packet for unknown path");
+4161 return Ok(());
+4162 }
+4163 let state = match self.state.as_type() {
+4164 StateType::Established => {
+4165 match packet.header.space() {
+4166 SpaceId::Data => self.process_payload(
+4167 now,
+4168 network_path,
+4169 path_id,
+4170 number.unwrap(),
+4171 packet,
+4172 qlog,
+4173 )?,
+4174 _ if packet.header.has_frames() => {
+4175 self.process_early_payload(now, path_id, packet, qlog)?
+4176 }
+4177 _ => {
+4178 trace!("discarding unexpected pre-handshake packet");
+4179 }
+4180 }
+4181 return Ok(());
+4182 }
+4183 StateType::Closed => {
+4184 for result in frame::Iter::new(packet.payload.freeze())? {
+4185 let frame = match result {
+4186 Ok(frame) => frame,
+4187 Err(err) => {
+4188 debug!("frame decoding error: {err:?}");
+4189 continue;
+4190 }
+4191 };
+4192 qlog.frame(&frame);
4193
-4194 self.stats.frame_rx.record(frame.ty());
-4195
-4196 if let Frame::Close(_error) = frame {
-4197 self.state.move_to_draining(None);
-4198 break;
-4199 }
-4200 }
-4201 return Ok(());
-4202 }
-4203 StateType::Draining | StateType::Drained => return Ok(()),
-4204 StateType::Handshake => self.state.as_handshake_mut().expect("checked"),
-4205 };
-4206
-4207 match packet.header {
-4208 Header::Retry {
-4209 src_cid: remote_cid,
-4210 ..
-4211 } => {
-4212 debug_assert_eq!(path_id, PathId::ZERO);
-4213 if self.side.is_server() {
-4214 return Err(TransportError::PROTOCOL_VIOLATION("client sent Retry").into());
-4215 }
-4216
-4217 let is_valid_retry = self
-4218 .remote_cids
-4219 .get(&path_id)
-4220 .map(|cids| cids.active())
-4221 .map(|orig_dst_cid| {
-4222 self.crypto_state.session.is_valid_retry(
-4223 orig_dst_cid,
-4224 &packet.header_data,
-4225 &packet.payload,
-4226 )
-4227 })
-4228 .unwrap_or_default();
-4229 if self.total_authed_packets > 1
-4230 || packet.payload.len() <= 16 // token + 16 byte tag
-4231 || !is_valid_retry
-4232 {
-4233 trace!("discarding invalid Retry");
-4234 // - After the client has received and processed an Initial or Retry
-4235 // packet from the server, it MUST discard any subsequent Retry
-4236 // packets that it receives.
-4237 // - A client MUST discard a Retry packet with a zero-length Retry Token
-4238 // field.
-4239 // - Clients MUST discard Retry packets that have a Retry Integrity Tag
-4240 // that cannot be validated
-4241 return Ok(());
-4242 }
-4243
-4244 trace!("retrying with CID {}", remote_cid);
-4245 let client_hello = state.client_hello.take().unwrap();
-4246 self.retry_src_cid = Some(remote_cid);
-4247 self.remote_cids
-4248 .get_mut(&path_id)
-4249 .expect("PathId::ZERO not yet abandoned, is_valid_retry would have been false")
-4250 .update_initial_cid(remote_cid);
-4251 self.remote_handshake_cid = remote_cid;
-4252
-4253 let space = &mut self.spaces[SpaceId::Initial];
-4254 if let Some(info) = space.for_path(PathId::ZERO).take(0) {
-4255 self.on_packet_acked(now, PathId::ZERO, info);
-4256 };
-4257
-4258 self.discard_space(now, SpaceId::Initial); // Make sure we clean up after
-4259 // any retransmitted Initials
-4260 let crypto_space = &mut self.crypto_state.spaces[SpaceKind::Initial];
-4261 crypto_space.keys = Some(
-4262 self.crypto_state
-4263 .session
-4264 .initial_keys(remote_cid, self.side.side()),
-4265 );
-4266 crypto_space.crypto_offset = client_hello.len() as u64;
-4267
-4268 let next_pn = self.spaces[SpaceId::Initial]
-4269 .for_path(path_id)
-4270 .next_packet_number;
-4271 self.spaces[SpaceId::Initial] = {
-4272 let mut space = PacketSpace::new(now, SpaceId::Initial, &mut self.rng);
-4273 space.for_path(path_id).next_packet_number = next_pn;
-4274 space.pending.crypto.push_back(frame::Crypto {
-4275 offset: 0,
-4276 data: client_hello,
-4277 });
-4278 space
-4279 };
-4280
-4281 // Retransmit all 0-RTT data
-4282 let zero_rtt = mem::take(
-4283 &mut self.spaces[SpaceId::Data]
-4284 .for_path(PathId::ZERO)
-4285 .sent_packets,
-4286 );
-4287 for (_, info) in zero_rtt.into_iter() {
-4288 self.paths
-4289 .get_mut(&PathId::ZERO)
-4290 .unwrap()
-4291 .remove_in_flight(&info);
-4292 self.spaces[SpaceId::Data].pending |= info.retransmits;
-4293 }
-4294 self.streams.retransmit_all_for_0rtt();
-4295
-4296 let token_len = packet.payload.len() - 16;
-4297 let ConnectionSide::Client { ref mut token, .. } = self.side else {
-4298 unreachable!("we already short-circuited if we're server");
-4299 };
-4300 *token = packet.payload.freeze().split_to(token_len);
-4301
-4302 self.state = State::handshake(state::Handshake {
-4303 expected_token: Bytes::new(),
-4304 remote_cid_set: false,
-4305 client_hello: None,
-4306 allow_server_migration: true,
-4307 });
-4308 Ok(())
-4309 }
-4310 Header::Long {
-4311 ty: LongType::Handshake,
-4312 src_cid: remote_cid,
-4313 dst_cid: local_cid,
-4314 ..
-4315 } => {
-4316 debug_assert_eq!(path_id, PathId::ZERO);
-4317 if remote_cid != self.remote_handshake_cid {
-4318 debug!(
-4319 "discarding packet with mismatched remote CID: {} != {}",
-4320 self.remote_handshake_cid, remote_cid
-4321 );
-4322 return Ok(());
-4323 }
-4324 self.on_path_validated(path_id);
-4325
-4326 self.process_early_payload(now, path_id, packet, qlog)?;
-4327 if self.state.is_closed() {
-4328 return Ok(());
-4329 }
-4330
-4331 if self.crypto_state.session.is_handshaking() {
-4332 trace!("handshake ongoing");
-4333 return Ok(());
-4334 }
-4335
-4336 if self.side.is_client() {
-4337 // Client-only because server params were set from the client's Initial
-4338 let params = self
-4339 .crypto_state
-4340 .session
-4341 .transport_parameters()?
-4342 .ok_or_else(|| {
-4343 TransportError::new(
-4344 TransportErrorCode::crypto(0x6d),
-4345 "transport parameters missing".to_owned(),
-4346 )
-4347 })?;
-4348
-4349 if self.has_0rtt() {
-4350 if !self.crypto_state.session.early_data_accepted().unwrap() {
-4351 debug_assert!(self.side.is_client());
-4352 debug!("0-RTT rejected");
-4353 self.crypto_state.accepted_0rtt = false;
-4354 self.streams.zero_rtt_rejected();
-4355
-4356 // Discard already-queued frames
-4357 self.spaces[SpaceId::Data].pending = Retransmits::default();
-4358
-4359 // Discard 0-RTT packets
-4360 let sent_packets = mem::take(
-4361 &mut self.spaces[SpaceId::Data].for_path(path_id).sent_packets,
-4362 );
-4363 for (_, packet) in sent_packets.into_iter() {
-4364 self.paths
-4365 .get_mut(&path_id)
-4366 .unwrap()
-4367 .remove_in_flight(&packet);
-4368 }
-4369 } else {
-4370 self.crypto_state.accepted_0rtt = true;
-4371 params.validate_resumption_from(&self.peer_params)?;
-4372 }
-4373 }
-4374 if let Some(token) = params.stateless_reset_token {
-4375 // TODO(matheus23): Reset token for a remote, or for a 4-tuple?
-4376 let remote = self.path_data(path_id).network_path.remote;
-4377 self.endpoint_events
-4378 .push_back(EndpointEventInner::ResetToken(path_id, remote, token));
-4379 }
-4380 self.handle_peer_params(params, local_cid, remote_cid, now)?;
-4381 self.issue_first_cids(now);
-4382 } else {
-4383 // Server-only
-4384 self.spaces[SpaceId::Data].pending.handshake_done = true;
-4385 self.discard_space(now, SpaceId::Handshake);
-4386 self.events.push_back(Event::HandshakeConfirmed);
-4387 trace!("handshake confirmed");
-4388 }
-4389
-4390 self.events.push_back(Event::Connected);
-4391 self.state.move_to_established();
-4392 trace!("established");
+4194 if let Frame::Padding = frame {
+4195 continue;
+4196 };
+4197
+4198 self.stats.frame_rx.record(frame.ty());
+4199
+4200 if let Frame::Close(_error) = frame {
+4201 self.state.move_to_draining(None);
+4202 break;
+4203 }
+4204 }
+4205 return Ok(());
+4206 }
+4207 StateType::Draining | StateType::Drained => return Ok(()),
+4208 StateType::Handshake => self.state.as_handshake_mut().expect("checked"),
+4209 };
+4210
+4211 match packet.header {
+4212 Header::Retry {
+4213 src_cid: remote_cid,
+4214 ..
+4215 } => {
+4216 debug_assert_eq!(path_id, PathId::ZERO);
+4217 if self.side.is_server() {
+4218 return Err(TransportError::PROTOCOL_VIOLATION("client sent Retry").into());
+4219 }
+4220
+4221 let is_valid_retry = self
+4222 .remote_cids
+4223 .get(&path_id)
+4224 .map(|cids| cids.active())
+4225 .map(|orig_dst_cid| {
+4226 self.crypto_state.session.is_valid_retry(
+4227 orig_dst_cid,
+4228 &packet.header_data,
+4229 &packet.payload,
+4230 )
+4231 })
+4232 .unwrap_or_default();
+4233 if self.total_authed_packets > 1
+4234 || packet.payload.len() <= 16 // token + 16 byte tag
+4235 || !is_valid_retry
+4236 {
+4237 trace!("discarding invalid Retry");
+4238 // - After the client has received and processed an Initial or Retry
+4239 // packet from the server, it MUST discard any subsequent Retry
+4240 // packets that it receives.
+4241 // - A client MUST discard a Retry packet with a zero-length Retry Token
+4242 // field.
+4243 // - Clients MUST discard Retry packets that have a Retry Integrity Tag
+4244 // that cannot be validated
+4245 return Ok(());
+4246 }
+4247
+4248 trace!("retrying with CID {}", remote_cid);
+4249 let client_hello = state.client_hello.take().unwrap();
+4250 self.retry_src_cid = Some(remote_cid);
+4251 self.remote_cids
+4252 .get_mut(&path_id)
+4253 .expect("PathId::ZERO not yet abandoned, is_valid_retry would have been false")
+4254 .update_initial_cid(remote_cid);
+4255 self.remote_handshake_cid = remote_cid;
+4256
+4257 let space = &mut self.spaces[SpaceId::Initial];
+4258 if let Some(info) = space.for_path(PathId::ZERO).take(0) {
+4259 self.on_packet_acked(now, PathId::ZERO, info);
+4260 };
+4261
+4262 self.discard_space(now, SpaceId::Initial); // Make sure we clean up after
+4263 // any retransmitted Initials
+4264 let crypto_space = &mut self.crypto_state.spaces[SpaceKind::Initial];
+4265 crypto_space.keys = Some(
+4266 self.crypto_state
+4267 .session
+4268 .initial_keys(remote_cid, self.side.side()),
+4269 );
+4270 crypto_space.crypto_offset = client_hello.len() as u64;
+4271
+4272 let next_pn = self.spaces[SpaceId::Initial]
+4273 .for_path(path_id)
+4274 .next_packet_number;
+4275 self.spaces[SpaceId::Initial] = {
+4276 let mut space = PacketSpace::new(now, SpaceId::Initial, &mut self.rng);
+4277 space.for_path(path_id).next_packet_number = next_pn;
+4278 space.pending.crypto.push_back(frame::Crypto {
+4279 offset: 0,
+4280 data: client_hello,
+4281 });
+4282 space
+4283 };
+4284
+4285 // Retransmit all 0-RTT data
+4286 let zero_rtt = mem::take(
+4287 &mut self.spaces[SpaceId::Data]
+4288 .for_path(PathId::ZERO)
+4289 .sent_packets,
+4290 );
+4291 for (_, info) in zero_rtt.into_iter() {
+4292 self.paths
+4293 .get_mut(&PathId::ZERO)
+4294 .unwrap()
+4295 .remove_in_flight(&info);
+4296 self.spaces[SpaceId::Data].pending |= info.retransmits;
+4297 }
+4298 self.streams.retransmit_all_for_0rtt();
+4299
+4300 let token_len = packet.payload.len() - 16;
+4301 let ConnectionSide::Client { ref mut token, .. } = self.side else {
+4302 unreachable!("we already short-circuited if we're server");
+4303 };
+4304 *token = packet.payload.freeze().split_to(token_len);
+4305
+4306 self.state = State::handshake(state::Handshake {
+4307 expected_token: Bytes::new(),
+4308 remote_cid_set: false,
+4309 client_hello: None,
+4310 allow_server_migration: true,
+4311 });
+4312 Ok(())
+4313 }
+4314 Header::Long {
+4315 ty: LongType::Handshake,
+4316 src_cid: remote_cid,
+4317 dst_cid: local_cid,
+4318 ..
+4319 } => {
+4320 debug_assert_eq!(path_id, PathId::ZERO);
+4321 if remote_cid != self.remote_handshake_cid {
+4322 debug!(
+4323 "discarding packet with mismatched remote CID: {} != {}",
+4324 self.remote_handshake_cid, remote_cid
+4325 );
+4326 return Ok(());
+4327 }
+4328 self.on_path_validated(path_id);
+4329
+4330 self.process_early_payload(now, path_id, packet, qlog)?;
+4331 if self.state.is_closed() {
+4332 return Ok(());
+4333 }
+4334
+4335 if self.crypto_state.session.is_handshaking() {
+4336 trace!("handshake ongoing");
+4337 return Ok(());
+4338 }
+4339
+4340 if self.side.is_client() {
+4341 // Client-only because server params were set from the client's Initial
+4342 let params = self
+4343 .crypto_state
+4344 .session
+4345 .transport_parameters()?
+4346 .ok_or_else(|| {
+4347 TransportError::new(
+4348 TransportErrorCode::crypto(0x6d),
+4349 "transport parameters missing".to_owned(),
+4350 )
+4351 })?;
+4352
+4353 if self.has_0rtt() {
+4354 if !self.crypto_state.session.early_data_accepted().unwrap() {
+4355 debug_assert!(self.side.is_client());
+4356 debug!("0-RTT rejected");
+4357 self.crypto_state.accepted_0rtt = false;
+4358 self.streams.zero_rtt_rejected();
+4359
+4360 // Discard already-queued frames
+4361 self.spaces[SpaceId::Data].pending = Retransmits::default();
+4362
+4363 // Discard 0-RTT packets
+4364 let sent_packets = mem::take(
+4365 &mut self.spaces[SpaceId::Data].for_path(path_id).sent_packets,
+4366 );
+4367 for (_, packet) in sent_packets.into_iter() {
+4368 self.paths
+4369 .get_mut(&path_id)
+4370 .unwrap()
+4371 .remove_in_flight(&packet);
+4372 }
+4373 } else {
+4374 self.crypto_state.accepted_0rtt = true;
+4375 params.validate_resumption_from(&self.peer_params)?;
+4376 }
+4377 }
+4378 if let Some(token) = params.stateless_reset_token {
+4379 // TODO(matheus23): Reset token for a remote, or for a 4-tuple?
+4380 let remote = self.path_data(path_id).network_path.remote;
+4381 self.endpoint_events
+4382 .push_back(EndpointEventInner::ResetToken(path_id, remote, token));
+4383 }
+4384 self.handle_peer_params(params, local_cid, remote_cid, now)?;
+4385 self.issue_first_cids(now);
+4386 } else {
+4387 // Server-only
+4388 self.spaces[SpaceId::Data].pending.handshake_done = true;
+4389 self.discard_space(now, SpaceId::Handshake);
+4390 self.events.push_back(Event::HandshakeConfirmed);
+4391 trace!("handshake confirmed");
+4392 }
4393
-4394 // Multipath can only be enabled after the state has reached Established.
-4395 // So this can not happen any earlier.
-4396 self.issue_first_path_cids(now);
-4397 Ok(())
-4398 }
-4399 Header::Initial(InitialHeader {
-4400 src_cid: remote_cid,
-4401 dst_cid: local_cid,
-4402 ..
-4403 }) => {
-4404 debug_assert_eq!(path_id, PathId::ZERO);
-4405 if !state.remote_cid_set {
-4406 trace!("switching remote CID to {}", remote_cid);
-4407 let mut state = state.clone();
-4408 self.remote_cids
-4409 .get_mut(&path_id)
-4410 .expect("PathId::ZERO not yet abandoned")
-4411 .update_initial_cid(remote_cid);
-4412 self.remote_handshake_cid = remote_cid;
-4413 self.original_remote_cid = remote_cid;
-4414 state.remote_cid_set = true;
-4415 self.state.move_to_handshake(state);
-4416 } else if remote_cid != self.remote_handshake_cid {
-4417 debug!(
-4418 "discarding packet with mismatched remote CID: {} != {}",
-4419 self.remote_handshake_cid, remote_cid
-4420 );
-4421 return Ok(());
-4422 }
-4423
-4424 let starting_space = self.highest_space;
-4425 self.process_early_payload(now, path_id, packet, qlog)?;
-4426
-4427 if self.side.is_server()
-4428 && starting_space == SpaceId::Initial
-4429 && self.highest_space != SpaceId::Initial
-4430 {
-4431 let params = self
-4432 .crypto_state
-4433 .session
-4434 .transport_parameters()?
-4435 .ok_or_else(|| {
-4436 TransportError::new(
-4437 TransportErrorCode::crypto(0x6d),
-4438 "transport parameters missing".to_owned(),
-4439 )
-4440 })?;
-4441 self.handle_peer_params(params, local_cid, remote_cid, now)?;
-4442 self.issue_first_cids(now);
-4443 self.init_0rtt(now);
-4444 }
-4445 Ok(())
-4446 }
-4447 Header::Long {
-4448 ty: LongType::ZeroRtt,
-4449 ..
-4450 } => {
-4451 self.process_payload(now, network_path, path_id, number.unwrap(), packet, qlog)?;
-4452 Ok(())
-4453 }
-4454 Header::VersionNegotiate { .. } => {
-4455 if self.total_authed_packets > 1 {
-4456 return Ok(());
-4457 }
-4458 let supported = packet
-4459 .payload
-4460 .chunks(4)
-4461 .any(|x| match <[u8; 4]>::try_from(x) {
-4462 Ok(version) => self.version == u32::from_be_bytes(version),
-4463 Err(_) => false,
-4464 });
-4465 if supported {
-4466 return Ok(());
-4467 }
-4468 debug!("remote doesn't support our version");
-4469 Err(ConnectionError::VersionMismatch)
-4470 }
-4471 Header::Short { .. } => unreachable!(
-4472 "short packets received during handshake are discarded in handle_packet"
-4473 ),
-4474 }
-4475 }
-4476
-4477 /// Process an Initial or Handshake packet payload
-4478 fn process_early_payload(
-4479 &mut self,
-4480 now: Instant,
-4481 path_id: PathId,
-4482 packet: Packet,
-4483 #[allow(unused)] qlog: &mut QlogRecvPacket,
-4484 ) -> Result<(), TransportError> {
-4485 debug_assert_ne!(packet.header.space(), SpaceId::Data);
-4486 debug_assert_eq!(path_id, PathId::ZERO);
-4487 let payload_len = packet.payload.len();
-4488 let mut ack_eliciting = false;
-4489 for result in frame::Iter::new(packet.payload.freeze())? {
-4490 let frame = result?;
-4491 qlog.frame(&frame);
-4492 let span = match frame {
-4493 Frame::Padding => continue,
-4494 _ => Some(trace_span!("frame", ty = %frame.ty(), path = tracing::field::Empty)),
-4495 };
-4496
-4497 self.stats.frame_rx.record(frame.ty());
-4498
-4499 let _guard = span.as_ref().map(|x| x.enter());
-4500 ack_eliciting |= frame.is_ack_eliciting();
-4501
-4502 // Process frames
-4503 if frame.is_1rtt() && packet.header.space() != SpaceId::Data {
-4504 return Err(TransportError::PROTOCOL_VIOLATION(
-4505 "illegal frame type in handshake",
-4506 ));
-4507 }
-4508
-4509 match frame {
-4510 Frame::Padding | Frame::Ping => {}
-4511 Frame::Crypto(frame) => {
-4512 self.read_crypto(packet.header.space(), &frame, payload_len)?;
-4513 }
-4514 Frame::Ack(ack) => {
-4515 self.on_ack_received(now, packet.header.space(), ack)?;
-4516 }
-4517 Frame::PathAck(ack) => {
-4518 span.as_ref()
-4519 .map(|span| span.record("path", tracing::field::debug(&ack.path_id)));
-4520 self.on_path_ack_received(now, packet.header.space(), ack)?;
-4521 }
-4522 Frame::Close(reason) => {
-4523 self.state.move_to_draining(Some(reason.into()));
-4524 return Ok(());
+4394 self.events.push_back(Event::Connected);
+4395 self.state.move_to_established();
+4396 trace!("established");
+4397
+4398 // Multipath can only be enabled after the state has reached Established.
+4399 // So this can not happen any earlier.
+4400 self.issue_first_path_cids(now);
+4401 Ok(())
+4402 }
+4403 Header::Initial(InitialHeader {
+4404 src_cid: remote_cid,
+4405 dst_cid: local_cid,
+4406 ..
+4407 }) => {
+4408 debug_assert_eq!(path_id, PathId::ZERO);
+4409 if !state.remote_cid_set {
+4410 trace!("switching remote CID to {}", remote_cid);
+4411 let mut state = state.clone();
+4412 self.remote_cids
+4413 .get_mut(&path_id)
+4414 .expect("PathId::ZERO not yet abandoned")
+4415 .update_initial_cid(remote_cid);
+4416 self.remote_handshake_cid = remote_cid;
+4417 self.original_remote_cid = remote_cid;
+4418 state.remote_cid_set = true;
+4419 self.state.move_to_handshake(state);
+4420 } else if remote_cid != self.remote_handshake_cid {
+4421 debug!(
+4422 "discarding packet with mismatched remote CID: {} != {}",
+4423 self.remote_handshake_cid, remote_cid
+4424 );
+4425 return Ok(());
+4426 }
+4427
+4428 let starting_space = self.highest_space;
+4429 self.process_early_payload(now, path_id, packet, qlog)?;
+4430
+4431 if self.side.is_server()
+4432 && starting_space == SpaceId::Initial
+4433 && self.highest_space != SpaceId::Initial
+4434 {
+4435 let params = self
+4436 .crypto_state
+4437 .session
+4438 .transport_parameters()?
+4439 .ok_or_else(|| {
+4440 TransportError::new(
+4441 TransportErrorCode::crypto(0x6d),
+4442 "transport parameters missing".to_owned(),
+4443 )
+4444 })?;
+4445 self.handle_peer_params(params, local_cid, remote_cid, now)?;
+4446 self.issue_first_cids(now);
+4447 self.init_0rtt(now);
+4448 }
+4449 Ok(())
+4450 }
+4451 Header::Long {
+4452 ty: LongType::ZeroRtt,
+4453 ..
+4454 } => {
+4455 self.process_payload(now, network_path, path_id, number.unwrap(), packet, qlog)?;
+4456 Ok(())
+4457 }
+4458 Header::VersionNegotiate { .. } => {
+4459 if self.total_authed_packets > 1 {
+4460 return Ok(());
+4461 }
+4462 let supported = packet
+4463 .payload
+4464 .chunks(4)
+4465 .any(|x| match <[u8; 4]>::try_from(x) {
+4466 Ok(version) => self.version == u32::from_be_bytes(version),
+4467 Err(_) => false,
+4468 });
+4469 if supported {
+4470 return Ok(());
+4471 }
+4472 debug!("remote doesn't support our version");
+4473 Err(ConnectionError::VersionMismatch)
+4474 }
+4475 Header::Short { .. } => unreachable!(
+4476 "short packets received during handshake are discarded in handle_packet"
+4477 ),
+4478 }
+4479 }
+4480
+4481 /// Process an Initial or Handshake packet payload
+4482 fn process_early_payload(
+4483 &mut self,
+4484 now: Instant,
+4485 path_id: PathId,
+4486 packet: Packet,
+4487 #[allow(unused)] qlog: &mut QlogRecvPacket,
+4488 ) -> Result<(), TransportError> {
+4489 debug_assert_ne!(packet.header.space(), SpaceId::Data);
+4490 debug_assert_eq!(path_id, PathId::ZERO);
+4491 let payload_len = packet.payload.len();
+4492 let mut ack_eliciting = false;
+4493 for result in frame::Iter::new(packet.payload.freeze())? {
+4494 let frame = result?;
+4495 qlog.frame(&frame);
+4496 let span = match frame {
+4497 Frame::Padding => continue,
+4498 _ => Some(trace_span!("frame", ty = %frame.ty(), path = tracing::field::Empty)),
+4499 };
+4500
+4501 self.stats.frame_rx.record(frame.ty());
+4502
+4503 let _guard = span.as_ref().map(|x| x.enter());
+4504 ack_eliciting |= frame.is_ack_eliciting();
+4505
+4506 // Process frames
+4507 if frame.is_1rtt() && packet.header.space() != SpaceId::Data {
+4508 return Err(TransportError::PROTOCOL_VIOLATION(
+4509 "illegal frame type in handshake",
+4510 ));
+4511 }
+4512
+4513 match frame {
+4514 Frame::Padding | Frame::Ping => {}
+4515 Frame::Crypto(frame) => {
+4516 self.read_crypto(packet.header.space(), &frame, payload_len)?;
+4517 }
+4518 Frame::Ack(ack) => {
+4519 self.on_ack_received(now, packet.header.space(), ack)?;
+4520 }
+4521 Frame::PathAck(ack) => {
+4522 span.as_ref()
+4523 .map(|span| span.record("path", tracing::field::debug(&ack.path_id)));
+4524 self.on_path_ack_received(now, packet.header.space(), ack)?;
4525 }
-4526 _ => {
-4527 let mut err =
-4528 TransportError::PROTOCOL_VIOLATION("illegal frame type in handshake");
-4529 err.frame = frame::MaybeFrame::Known(frame.ty());
-4530 return Err(err);
-4531 }
-4532 }
-4533 }
-4534
-4535 if ack_eliciting {
-4536 // In the initial and handshake spaces, ACKs must be sent immediately
-4537 self.spaces[packet.header.space()]
-4538 .for_path(path_id)
-4539 .pending_acks
-4540 .set_immediate_ack_required();
-4541 }
-4542
-4543 self.write_crypto();
-4544 Ok(())
-4545 }
+4526 Frame::Close(reason) => {
+4527 self.state.move_to_draining(Some(reason.into()));
+4528 return Ok(());
+4529 }
+4530 _ => {
+4531 let mut err =
+4532 TransportError::PROTOCOL_VIOLATION("illegal frame type in handshake");
+4533 err.frame = frame::MaybeFrame::Known(frame.ty());
+4534 return Err(err);
+4535 }
+4536 }
+4537 }
+4538
+4539 if ack_eliciting {
+4540 // In the initial and handshake spaces, ACKs must be sent immediately
+4541 self.spaces[packet.header.space()]
+4542 .for_path(path_id)
+4543 .pending_acks
+4544 .set_immediate_ack_required();
+4545 }
4546
-4547 /// Processes the packet payload, always in the data space.
-4548 fn process_payload(
-4549 &mut self,
-4550 now: Instant,
-4551 network_path: FourTuple,
-4552 path_id: PathId,
-4553 number: u64,
-4554 packet: Packet,
-4555 #[allow(unused)] qlog: &mut QlogRecvPacket,
-4556 ) -> Result<(), TransportError> {
-4557 let is_multipath_negotiated = self.is_multipath_negotiated();
-4558 let payload = packet.payload.freeze();
-4559 let mut is_probing_packet = true;
-4560 let mut close = None;
-4561 let payload_len = payload.len();
-4562 let mut ack_eliciting = false;
-4563 // if this packet triggers a path migration and includes a observed address frame, it's
-4564 // stored here
-4565 let mut migration_observed_addr = None;
-4566 for result in frame::Iter::new(payload)? {
-4567 let frame = result?;
-4568 qlog.frame(&frame);
-4569 let span = match frame {
-4570 Frame::Padding => continue,
-4571 _ => trace_span!("frame", ty = %frame.ty(), path = tracing::field::Empty),
-4572 };
-4573
-4574 self.stats.frame_rx.record(frame.ty());
-4575 // Crypto, Stream and Datagram frames are special cased in order no pollute
-4576 // the log with payload data
-4577 match &frame {
-4578 Frame::Crypto(f) => {
-4579 trace!(offset = f.offset, len = f.data.len(), "got frame CRYPTO");
-4580 }
-4581 Frame::Stream(f) => {
-4582 trace!(id = %f.id, offset = f.offset, len = f.data.len(), fin = f.fin, "got frame STREAM");
-4583 }
-4584 Frame::Datagram(f) => {
-4585 trace!(len = f.data.len(), "got frame DATAGRAM");
-4586 }
-4587 f => {
-4588 trace!("got frame {f}");
-4589 }
-4590 }
-4591
-4592 let _guard = span.enter();
-4593 if packet.header.is_0rtt() {
-4594 match frame {
-4595 Frame::Crypto(_) | Frame::Close(Close::Application(_)) => {
-4596 return Err(TransportError::PROTOCOL_VIOLATION(
-4597 "illegal frame type in 0-RTT",
-4598 ));
-4599 }
-4600 _ => {
-4601 if frame.is_1rtt() {
-4602 return Err(TransportError::PROTOCOL_VIOLATION(
-4603 "illegal frame type in 0-RTT",
-4604 ));
-4605 }
-4606 }
-4607 }
-4608 }
-4609 ack_eliciting |= frame.is_ack_eliciting();
-4610
-4611 // Check whether this could be a probing packet
-4612 match frame {
-4613 Frame::Padding
-4614 | Frame::PathChallenge(_)
-4615 | Frame::PathResponse(_)
-4616 | Frame::NewConnectionId(_)
-4617 | Frame::ObservedAddr(_) => {}
-4618 _ => {
-4619 is_probing_packet = false;
-4620 }
-4621 }
-4622
-4623 match frame {
-4624 Frame::Crypto(frame) => {
-4625 self.read_crypto(SpaceId::Data, &frame, payload_len)?;
-4626 }
-4627 Frame::Stream(frame) => {
-4628 if self.streams.received(frame, payload_len)?.should_transmit() {
-4629 self.spaces[SpaceId::Data].pending.max_data = true;
-4630 }
-4631 }
-4632 Frame::Ack(ack) => {
-4633 self.on_ack_received(now, SpaceId::Data, ack)?;
-4634 }
-4635 Frame::PathAck(ack) => {
-4636 span.record("path", tracing::field::debug(&ack.path_id));
-4637 self.on_path_ack_received(now, SpaceId::Data, ack)?;
+4547 self.write_crypto();
+4548 Ok(())
+4549 }
+4550
+4551 /// Processes the packet payload, always in the data space.
+4552 fn process_payload(
+4553 &mut self,
+4554 now: Instant,
+4555 network_path: FourTuple,
+4556 path_id: PathId,
+4557 number: u64,
+4558 packet: Packet,
+4559 #[allow(unused)] qlog: &mut QlogRecvPacket,
+4560 ) -> Result<(), TransportError> {
+4561 let is_multipath_negotiated = self.is_multipath_negotiated();
+4562 let payload = packet.payload.freeze();
+4563 let mut is_probing_packet = true;
+4564 let mut close = None;
+4565 let payload_len = payload.len();
+4566 let mut ack_eliciting = false;
+4567 // if this packet triggers a path migration and includes a observed address frame, it's
+4568 // stored here
+4569 let mut migration_observed_addr = None;
+4570 for result in frame::Iter::new(payload)? {
+4571 let frame = result?;
+4572 qlog.frame(&frame);
+4573 let span = match frame {
+4574 Frame::Padding => continue,
+4575 _ => trace_span!("frame", ty = %frame.ty(), path = tracing::field::Empty),
+4576 };
+4577
+4578 self.stats.frame_rx.record(frame.ty());
+4579 // Crypto, Stream and Datagram frames are special cased in order no pollute
+4580 // the log with payload data
+4581 match &frame {
+4582 Frame::Crypto(f) => {
+4583 trace!(offset = f.offset, len = f.data.len(), "got frame CRYPTO");
+4584 }
+4585 Frame::Stream(f) => {
+4586 trace!(id = %f.id, offset = f.offset, len = f.data.len(), fin = f.fin, "got frame STREAM");
+4587 }
+4588 Frame::Datagram(f) => {
+4589 trace!(len = f.data.len(), "got frame DATAGRAM");
+4590 }
+4591 f => {
+4592 trace!("got frame {f}");
+4593 }
+4594 }
+4595
+4596 let _guard = span.enter();
+4597 if packet.header.is_0rtt() {
+4598 match frame {
+4599 Frame::Crypto(_) | Frame::Close(Close::Application(_)) => {
+4600 return Err(TransportError::PROTOCOL_VIOLATION(
+4601 "illegal frame type in 0-RTT",
+4602 ));
+4603 }
+4604 _ => {
+4605 if frame.is_1rtt() {
+4606 return Err(TransportError::PROTOCOL_VIOLATION(
+4607 "illegal frame type in 0-RTT",
+4608 ));
+4609 }
+4610 }
+4611 }
+4612 }
+4613 ack_eliciting |= frame.is_ack_eliciting();
+4614
+4615 // Check whether this could be a probing packet
+4616 match frame {
+4617 Frame::Padding
+4618 | Frame::PathChallenge(_)
+4619 | Frame::PathResponse(_)
+4620 | Frame::NewConnectionId(_)
+4621 | Frame::ObservedAddr(_) => {}
+4622 _ => {
+4623 is_probing_packet = false;
+4624 }
+4625 }
+4626
+4627 match frame {
+4628 Frame::Crypto(frame) => {
+4629 self.read_crypto(SpaceId::Data, &frame, payload_len)?;
+4630 }
+4631 Frame::Stream(frame) => {
+4632 if self.streams.received(frame, payload_len)?.should_transmit() {
+4633 self.spaces[SpaceId::Data].pending.max_data = true;
+4634 }
+4635 }
+4636 Frame::Ack(ack) => {
+4637 self.on_ack_received(now, SpaceId::Data, ack)?;
4638 }
-4639 Frame::Padding | Frame::Ping => {}
-4640 Frame::Close(reason) => {
-4641 close = Some(reason);
+4639 Frame::PathAck(ack) => {
+4640 span.record("path", tracing::field::debug(&ack.path_id));
+4641 self.on_path_ack_received(now, SpaceId::Data, ack)?;
4642 }
-4643 Frame::PathChallenge(challenge) => {
-4644 let path = &mut self
-4645 .path_mut(path_id)
-4646 .expect("payload is processed only after the path becomes known");
-4647 path.path_responses.push(number, challenge.0, network_path);
-4648 // At this point, update_network_path_or_discard was already called, so
-4649 // we don't need to be lenient about `local_ip` possibly mis-matching.
-4650 if network_path == path.network_path {
-4651 // PATH_CHALLENGE on active path, possible off-path packet forwarding
-4652 // attack. Send a non-probing packet to recover the active path.
-4653 // TODO(flub): No longer true! We now path_challege also to validate
-4654 // the path if the path is new, without an RFC9000-style
-4655 // migration involved. This means we add in an extra
-4656 // IMMEDIATE_ACK on some challenges. It isn't really wrong to do
-4657 // so, but it still is something untidy. We should instead
-4658 // suppress this when we know the remote is still validating the
-4659 // path.
-4660 match self.peer_supports_ack_frequency() {
-4661 true => self.immediate_ack(path_id),
-4662 false => {
-4663 self.ping_path(path_id).ok();
-4664 }
-4665 }
-4666 }
-4667 }
-4668 Frame::PathResponse(response) => {
-4669 let path = self
-4670 .paths
-4671 .get_mut(&path_id)
-4672 .expect("payload is processed only after the path becomes known");
-4673
-4674 use PathTimer::*;
-4675 use paths::OnPathResponseReceived::*;
-4676 match path
-4677 .data
-4678 .on_path_response_received(now, response.0, network_path)
-4679 {
-4680 OnPath { was_open } => {
-4681 let qlog = self.qlog.with_time(now);
-4682
-4683 self.timers
-4684 .stop(Timer::PerPath(path_id, PathValidation), qlog.clone());
-4685 self.timers
-4686 .stop(Timer::PerPath(path_id, PathOpen), qlog.clone());
-4687
-4688 let next_challenge = path
-4689 .data
-4690 .earliest_expiring_challenge()
-4691 .map(|time| time + self.ack_frequency.max_ack_delay_for_pto());
-4692 self.timers.set_or_stop(
-4693 Timer::PerPath(path_id, PathChallengeLost),
-4694 next_challenge,
-4695 qlog,
-4696 );
-4697
-4698 if !was_open {
-4699 if is_multipath_negotiated {
-4700 self.events
-4701 .push_back(Event::Path(PathEvent::Opened { id: path_id }));
-4702 }
-4703 if let Some(observed) = path.data.last_observed_addr_report.as_ref()
-4704 {
-4705 self.events.push_back(Event::Path(PathEvent::ObservedAddr {
-4706 id: path_id,
-4707 addr: observed.socket_addr(),
-4708 }));
-4709 }
-4710 }
-4711 if let Some((_, ref mut prev)) = path.prev {
-4712 prev.challenges_sent.clear();
-4713 prev.send_new_challenge = false;
+4643 Frame::Padding | Frame::Ping => {}
+4644 Frame::Close(reason) => {
+4645 close = Some(reason);
+4646 }
+4647 Frame::PathChallenge(challenge) => {
+4648 let path = &mut self
+4649 .path_mut(path_id)
+4650 .expect("payload is processed only after the path becomes known");
+4651 path.path_responses.push(number, challenge.0, network_path);
+4652 // At this point, update_network_path_or_discard was already called, so
+4653 // we don't need to be lenient about `local_ip` possibly mis-matching.
+4654 if network_path == path.network_path {
+4655 // PATH_CHALLENGE on active path, possible off-path packet forwarding
+4656 // attack. Send a non-probing packet to recover the active path.
+4657 // TODO(flub): No longer true! We now path_challege also to validate
+4658 // the path if the path is new, without an RFC9000-style
+4659 // migration involved. This means we add in an extra
+4660 // IMMEDIATE_ACK on some challenges. It isn't really wrong to do
+4661 // so, but it still is something untidy. We should instead
+4662 // suppress this when we know the remote is still validating the
+4663 // path.
+4664 match self.peer_supports_ack_frequency() {
+4665 true => self.immediate_ack(path_id),
+4666 false => {
+4667 self.ping_path(path_id).ok();
+4668 }
+4669 }
+4670 }
+4671 }
+4672 Frame::PathResponse(response) => {
+4673 let path = self
+4674 .paths
+4675 .get_mut(&path_id)
+4676 .expect("payload is processed only after the path becomes known");
+4677
+4678 use PathTimer::*;
+4679 use paths::OnPathResponseReceived::*;
+4680 match path
+4681 .data
+4682 .on_path_response_received(now, response.0, network_path)
+4683 {
+4684 OnPath { was_open } => {
+4685 let qlog = self.qlog.with_time(now);
+4686
+4687 self.timers
+4688 .stop(Timer::PerPath(path_id, PathValidation), qlog.clone());
+4689 self.timers
+4690 .stop(Timer::PerPath(path_id, PathOpen), qlog.clone());
+4691
+4692 let next_challenge = path
+4693 .data
+4694 .earliest_expiring_challenge()
+4695 .map(|time| time + self.ack_frequency.max_ack_delay_for_pto());
+4696 self.timers.set_or_stop(
+4697 Timer::PerPath(path_id, PathChallengeLost),
+4698 next_challenge,
+4699 qlog,
+4700 );
+4701
+4702 if !was_open {
+4703 if is_multipath_negotiated {
+4704 self.events
+4705 .push_back(Event::Path(PathEvent::Opened { id: path_id }));
+4706 }
+4707 if let Some(observed) = path.data.last_observed_addr_report.as_ref()
+4708 {
+4709 self.events.push_back(Event::Path(PathEvent::ObservedAddr {
+4710 id: path_id,
+4711 addr: observed.socket_addr(),
+4712 }));
+4713 }
4714 }
-4715 }
-4716 OffPath => {
-4717 debug!("Response to off-path PathChallenge!");
-4718 let next_challenge = path
-4719 .data
-4720 .earliest_expiring_challenge()
-4721 .map(|time| time + self.ack_frequency.max_ack_delay_for_pto());
-4722 self.timers.set_or_stop(
-4723 Timer::PerPath(path_id, PathChallengeLost),
-4724 next_challenge,
-4725 self.qlog.with_time(now),
-4726 );
-4727 }
-4728 Invalid { expected } => {
-4729 debug!(%response, %network_path, %expected, "ignoring invalid PATH_RESPONSE")
-4730 }
-4731 Unknown => debug!(%response, "ignoring invalid PATH_RESPONSE"),
-4732 }
-4733 }
-4734 Frame::MaxData(frame::MaxData(bytes)) => {
-4735 self.streams.received_max_data(bytes);
-4736 }
-4737 Frame::MaxStreamData(frame::MaxStreamData { id, offset }) => {
-4738 self.streams.received_max_stream_data(id, offset)?;
-4739 }
-4740 Frame::MaxStreams(frame::MaxStreams { dir, count }) => {
-4741 self.streams.received_max_streams(dir, count)?;
-4742 }
-4743 Frame::ResetStream(frame) => {
-4744 if self.streams.received_reset(frame)?.should_transmit() {
-4745 self.spaces[SpaceId::Data].pending.max_data = true;
-4746 }
-4747 }
-4748 Frame::DataBlocked(DataBlocked(offset)) => {
-4749 debug!(offset, "peer claims to be blocked at connection level");
-4750 }
-4751 Frame::StreamDataBlocked(StreamDataBlocked { id, offset }) => {
-4752 if id.initiator() == self.side.side() && id.dir() == Dir::Uni {
-4753 debug!("got STREAM_DATA_BLOCKED on send-only {}", id);
-4754 return Err(TransportError::STREAM_STATE_ERROR(
-4755 "STREAM_DATA_BLOCKED on send-only stream",
-4756 ));
-4757 }
-4758 debug!(
-4759 stream = %id,
-4760 offset, "peer claims to be blocked at stream level"
-4761 );
-4762 }
-4763 Frame::StreamsBlocked(StreamsBlocked { dir, limit }) => {
-4764 if limit > MAX_STREAM_COUNT {
-4765 return Err(TransportError::FRAME_ENCODING_ERROR(
-4766 "unrepresentable stream limit",
-4767 ));
-4768 }
-4769 debug!(
-4770 "peer claims to be blocked opening more than {} {} streams",
-4771 limit, dir
-4772 );
-4773 }
-4774 Frame::StopSending(frame::StopSending { id, error_code }) => {
-4775 if id.initiator() != self.side.side() {
-4776 if id.dir() == Dir::Uni {
-4777 debug!("got STOP_SENDING on recv-only {}", id);
-4778 return Err(TransportError::STREAM_STATE_ERROR(
-4779 "STOP_SENDING on recv-only stream",
-4780 ));
-4781 }
-4782 } else if self.streams.is_local_unopened(id) {
-4783 return Err(TransportError::STREAM_STATE_ERROR(
-4784 "STOP_SENDING on unopened stream",
-4785 ));
-4786 }
-4787 self.streams.received_stop_sending(id, error_code);
-4788 }
-4789 Frame::RetireConnectionId(frame::RetireConnectionId { path_id, sequence }) => {
-4790 if let Some(ref path_id) = path_id {
-4791 span.record("path", tracing::field::debug(&path_id));
-4792 }
-4793 let path_id = path_id.unwrap_or_default();
-4794 match self.local_cid_state.get_mut(&path_id) {
-4795 None => error!(?path_id, "RETIRE_CONNECTION_ID for unknown path"),
-4796 Some(cid_state) => {
-4797 let allow_more_cids = cid_state
-4798 .on_cid_retirement(sequence, self.peer_params.issue_cids_limit())?;
-4799
-4800 // If the path has closed, we do not issue more CIDs for this path
-4801 // For details see https://www.ietf.org/archive/id/draft-ietf-quic-multipath-17.html#section-3.2.2
-4802 // > an endpoint SHOULD provide new connection IDs for that path, if still open, using PATH_NEW_CONNECTION_ID frames.
-4803 let has_path = !self.abandoned_paths.contains(&path_id);
-4804 let allow_more_cids = allow_more_cids && has_path;
-4805
-4806 self.endpoint_events
-4807 .push_back(EndpointEventInner::RetireConnectionId(
-4808 now,
-4809 path_id,
-4810 sequence,
-4811 allow_more_cids,
-4812 ));
-4813 }
-4814 }
-4815 }
-4816 Frame::NewConnectionId(frame) => {
-4817 let path_id = if let Some(path_id) = frame.path_id {
-4818 if !self.is_multipath_negotiated() {
-4819 return Err(TransportError::PROTOCOL_VIOLATION(
-4820 "received PATH_NEW_CONNECTION_ID frame when multipath was not negotiated",
-4821 ));
-4822 }
-4823 if path_id > self.local_max_path_id {
-4824 return Err(TransportError::PROTOCOL_VIOLATION(
-4825 "PATH_NEW_CONNECTION_ID contains path_id exceeding current max",
-4826 ));
-4827 }
-4828 path_id
-4829 } else {
-4830 PathId::ZERO
-4831 };
-4832
-4833 if self.abandoned_paths.contains(&path_id) {
-4834 trace!("ignoring issued CID for abandoned path");
-4835 continue;
-4836 }
-4837 if let Some(ref path_id) = frame.path_id {
-4838 span.record("path", tracing::field::debug(&path_id));
-4839 }
-4840 let remote_cids = self
-4841 .remote_cids
-4842 .entry(path_id)
-4843 .or_insert_with(|| CidQueue::new(frame.id));
-4844 if remote_cids.active().is_empty() {
-4845 return Err(TransportError::PROTOCOL_VIOLATION(
-4846 "NEW_CONNECTION_ID when CIDs aren't in use",
-4847 ));
-4848 }
-4849 if frame.retire_prior_to > frame.sequence {
-4850 return Err(TransportError::PROTOCOL_VIOLATION(
-4851 "NEW_CONNECTION_ID retiring unissued CIDs",
-4852 ));
-4853 }
-4854
-4855 use crate::cid_queue::InsertError;
-4856 match remote_cids.insert(frame) {
-4857 Ok(None) if self.path(path_id).is_none() => {
-4858 // if this gives us CIDs to open a new path and a nat traversal attempt
-4859 // is underway we could try to probe a pending remote
-4860 self.continue_nat_traversal_round(now);
-4861 }
-4862 Ok(None) => {}
-4863 Ok(Some((retired, reset_token))) => {
-4864 let pending_retired =
-4865 &mut self.spaces[SpaceId::Data].pending.retire_cids;
-4866 /// Ensure `pending_retired` cannot grow without bound. Limit is
-4867 /// somewhat arbitrary but very permissive.
-4868 const MAX_PENDING_RETIRED_CIDS: u64 = CidQueue::LEN as u64 * 10;
-4869 // We don't bother counting in-flight frames because those are bounded
-4870 // by congestion control.
-4871 if (pending_retired.len() as u64)
-4872 .saturating_add(retired.end.saturating_sub(retired.start))
-4873 > MAX_PENDING_RETIRED_CIDS
-4874 {
-4875 return Err(TransportError::CONNECTION_ID_LIMIT_ERROR(
-4876 "queued too many retired CIDs",
-4877 ));
-4878 }
-4879 pending_retired.extend(retired.map(|seq| (path_id, seq)));
-4880 // TODO(matheus23): Reset token for a remote or a full 4-tuple?
-4881 self.set_reset_token(path_id, network_path.remote, reset_token);
-4882 }
-4883 Err(InsertError::ExceedsLimit) => {
-4884 return Err(TransportError::CONNECTION_ID_LIMIT_ERROR(""));
-4885 }
-4886 Err(InsertError::Retired) => {
-4887 trace!("discarding already-retired");
-4888 // RETIRE_CONNECTION_ID might not have been previously sent if e.g. a
-4889 // range of connection IDs larger than the active connection ID limit
-4890 // was retired all at once via retire_prior_to.
-4891 self.spaces[SpaceId::Data]
-4892 .pending
-4893 .retire_cids
-4894 .push((path_id, frame.sequence));
-4895 continue;
-4896 }
-4897 };
-4898
-4899 if self.side.is_server()
-4900 && path_id == PathId::ZERO
-4901 && self
-4902 .remote_cids
-4903 .get(&PathId::ZERO)
-4904 .map(|cids| cids.active_seq() == 0)
-4905 .unwrap_or_default()
-4906 {
-4907 // We're a server still using the initial remote CID for the client, so
-4908 // let's switch immediately to enable clientside stateless resets.
-4909 self.update_remote_cid(PathId::ZERO);
-4910 }
-4911 }
-4912 Frame::NewToken(NewToken { token }) => {
-4913 let ConnectionSide::Client {
-4914 token_store,
-4915 server_name,
-4916 ..
-4917 } = &self.side
-4918 else {
-4919 return Err(TransportError::PROTOCOL_VIOLATION("client sent NEW_TOKEN"));
-4920 };
-4921 if token.is_empty() {
-4922 return Err(TransportError::FRAME_ENCODING_ERROR("empty token"));
-4923 }
-4924 trace!("got new token");
-4925 token_store.insert(server_name, token);
-4926 }
-4927 Frame::Datagram(datagram) => {
-4928 if self
-4929 .datagrams
-4930 .received(datagram, &self.config.datagram_receive_buffer_size)?
-4931 {
-4932 self.events.push_back(Event::DatagramReceived);
-4933 }
-4934 }
-4935 Frame::AckFrequency(ack_frequency) => {
-4936 // This frame can only be sent in the Data space
-4937
-4938 if !self.ack_frequency.ack_frequency_received(&ack_frequency)? {
-4939 // The AckFrequency frame is stale (we have already received a more
-4940 // recent one)
-4941 continue;
-4942 }
-4943
-4944 // Update the params for all of our paths
-4945 for (path_id, space) in self.spaces[SpaceId::Data].number_spaces.iter_mut() {
-4946 space.pending_acks.set_ack_frequency_params(&ack_frequency);
+4715 if let Some((_, ref mut prev)) = path.prev {
+4716 prev.challenges_sent.clear();
+4717 prev.send_new_challenge = false;
+4718 }
+4719 }
+4720 OffPath => {
+4721 debug!("Response to off-path PathChallenge!");
+4722 let next_challenge = path
+4723 .data
+4724 .earliest_expiring_challenge()
+4725 .map(|time| time + self.ack_frequency.max_ack_delay_for_pto());
+4726 self.timers.set_or_stop(
+4727 Timer::PerPath(path_id, PathChallengeLost),
+4728 next_challenge,
+4729 self.qlog.with_time(now),
+4730 );
+4731 }
+4732 Invalid { expected } => {
+4733 debug!(%response, %network_path, %expected, "ignoring invalid PATH_RESPONSE")
+4734 }
+4735 Unknown => debug!(%response, "ignoring invalid PATH_RESPONSE"),
+4736 }
+4737 }
+4738 Frame::MaxData(frame::MaxData(bytes)) => {
+4739 self.streams.received_max_data(bytes);
+4740 }
+4741 Frame::MaxStreamData(frame::MaxStreamData { id, offset }) => {
+4742 self.streams.received_max_stream_data(id, offset)?;
+4743 }
+4744 Frame::MaxStreams(frame::MaxStreams { dir, count }) => {
+4745 self.streams.received_max_streams(dir, count)?;
+4746 }
+4747 Frame::ResetStream(frame) => {
+4748 if self.streams.received_reset(frame)?.should_transmit() {
+4749 self.spaces[SpaceId::Data].pending.max_data = true;
+4750 }
+4751 }
+4752 Frame::DataBlocked(DataBlocked(offset)) => {
+4753 debug!(offset, "peer claims to be blocked at connection level");
+4754 }
+4755 Frame::StreamDataBlocked(StreamDataBlocked { id, offset }) => {
+4756 if id.initiator() == self.side.side() && id.dir() == Dir::Uni {
+4757 debug!("got STREAM_DATA_BLOCKED on send-only {}", id);
+4758 return Err(TransportError::STREAM_STATE_ERROR(
+4759 "STREAM_DATA_BLOCKED on send-only stream",
+4760 ));
+4761 }
+4762 debug!(
+4763 stream = %id,
+4764 offset, "peer claims to be blocked at stream level"
+4765 );
+4766 }
+4767 Frame::StreamsBlocked(StreamsBlocked { dir, limit }) => {
+4768 if limit > MAX_STREAM_COUNT {
+4769 return Err(TransportError::FRAME_ENCODING_ERROR(
+4770 "unrepresentable stream limit",
+4771 ));
+4772 }
+4773 debug!(
+4774 "peer claims to be blocked opening more than {} {} streams",
+4775 limit, dir
+4776 );
+4777 }
+4778 Frame::StopSending(frame::StopSending { id, error_code }) => {
+4779 if id.initiator() != self.side.side() {
+4780 if id.dir() == Dir::Uni {
+4781 debug!("got STOP_SENDING on recv-only {}", id);
+4782 return Err(TransportError::STREAM_STATE_ERROR(
+4783 "STOP_SENDING on recv-only stream",
+4784 ));
+4785 }
+4786 } else if self.streams.is_local_unopened(id) {
+4787 return Err(TransportError::STREAM_STATE_ERROR(
+4788 "STOP_SENDING on unopened stream",
+4789 ));
+4790 }
+4791 self.streams.received_stop_sending(id, error_code);
+4792 }
+4793 Frame::RetireConnectionId(frame::RetireConnectionId { path_id, sequence }) => {
+4794 if let Some(ref path_id) = path_id {
+4795 span.record("path", tracing::field::debug(&path_id));
+4796 }
+4797 let path_id = path_id.unwrap_or_default();
+4798 match self.local_cid_state.get_mut(&path_id) {
+4799 None => error!(?path_id, "RETIRE_CONNECTION_ID for unknown path"),
+4800 Some(cid_state) => {
+4801 let allow_more_cids = cid_state
+4802 .on_cid_retirement(sequence, self.peer_params.issue_cids_limit())?;
+4803
+4804 // If the path has closed, we do not issue more CIDs for this path
+4805 // For details see https://www.ietf.org/archive/id/draft-ietf-quic-multipath-17.html#section-3.2.2
+4806 // > an endpoint SHOULD provide new connection IDs for that path, if still open, using PATH_NEW_CONNECTION_ID frames.
+4807 let has_path = !self.abandoned_paths.contains(&path_id);
+4808 let allow_more_cids = allow_more_cids && has_path;
+4809
+4810 self.endpoint_events
+4811 .push_back(EndpointEventInner::RetireConnectionId(
+4812 now,
+4813 path_id,
+4814 sequence,
+4815 allow_more_cids,
+4816 ));
+4817 }
+4818 }
+4819 }
+4820 Frame::NewConnectionId(frame) => {
+4821 let path_id = if let Some(path_id) = frame.path_id {
+4822 if !self.is_multipath_negotiated() {
+4823 return Err(TransportError::PROTOCOL_VIOLATION(
+4824 "received PATH_NEW_CONNECTION_ID frame when multipath was not negotiated",
+4825 ));
+4826 }
+4827 if path_id > self.local_max_path_id {
+4828 return Err(TransportError::PROTOCOL_VIOLATION(
+4829 "PATH_NEW_CONNECTION_ID contains path_id exceeding current max",
+4830 ));
+4831 }
+4832 path_id
+4833 } else {
+4834 PathId::ZERO
+4835 };
+4836
+4837 if self.abandoned_paths.contains(&path_id) {
+4838 trace!("ignoring issued CID for abandoned path");
+4839 continue;
+4840 }
+4841 if let Some(ref path_id) = frame.path_id {
+4842 span.record("path", tracing::field::debug(&path_id));
+4843 }
+4844 let remote_cids = self
+4845 .remote_cids
+4846 .entry(path_id)
+4847 .or_insert_with(|| CidQueue::new(frame.id));
+4848 if remote_cids.active().is_empty() {
+4849 return Err(TransportError::PROTOCOL_VIOLATION(
+4850 "NEW_CONNECTION_ID when CIDs aren't in use",
+4851 ));
+4852 }
+4853 if frame.retire_prior_to > frame.sequence {
+4854 return Err(TransportError::PROTOCOL_VIOLATION(
+4855 "NEW_CONNECTION_ID retiring unissued CIDs",
+4856 ));
+4857 }
+4858
+4859 use crate::cid_queue::InsertError;
+4860 match remote_cids.insert(frame) {
+4861 Ok(None) if self.path(path_id).is_none() => {
+4862 // if this gives us CIDs to open a new path and a nat traversal attempt
+4863 // is underway we could try to probe a pending remote
+4864 self.continue_nat_traversal_round(now);
+4865 }
+4866 Ok(None) => {}
+4867 Ok(Some((retired, reset_token))) => {
+4868 let pending_retired =
+4869 &mut self.spaces[SpaceId::Data].pending.retire_cids;
+4870 /// Ensure `pending_retired` cannot grow without bound. Limit is
+4871 /// somewhat arbitrary but very permissive.
+4872 const MAX_PENDING_RETIRED_CIDS: u64 = CidQueue::LEN as u64 * 10;
+4873 // We don't bother counting in-flight frames because those are bounded
+4874 // by congestion control.
+4875 if (pending_retired.len() as u64)
+4876 .saturating_add(retired.end.saturating_sub(retired.start))
+4877 > MAX_PENDING_RETIRED_CIDS
+4878 {
+4879 return Err(TransportError::CONNECTION_ID_LIMIT_ERROR(
+4880 "queued too many retired CIDs",
+4881 ));
+4882 }
+4883 pending_retired.extend(retired.map(|seq| (path_id, seq)));
+4884 // TODO(matheus23): Reset token for a remote or a full 4-tuple?
+4885 self.set_reset_token(path_id, network_path.remote, reset_token);
+4886 }
+4887 Err(InsertError::ExceedsLimit) => {
+4888 return Err(TransportError::CONNECTION_ID_LIMIT_ERROR(""));
+4889 }
+4890 Err(InsertError::Retired) => {
+4891 trace!("discarding already-retired");
+4892 // RETIRE_CONNECTION_ID might not have been previously sent if e.g. a
+4893 // range of connection IDs larger than the active connection ID limit
+4894 // was retired all at once via retire_prior_to.
+4895 self.spaces[SpaceId::Data]
+4896 .pending
+4897 .retire_cids
+4898 .push((path_id, frame.sequence));
+4899 continue;
+4900 }
+4901 };
+4902
+4903 if self.side.is_server()
+4904 && path_id == PathId::ZERO
+4905 && self
+4906 .remote_cids
+4907 .get(&PathId::ZERO)
+4908 .map(|cids| cids.active_seq() == 0)
+4909 .unwrap_or_default()
+4910 {
+4911 // We're a server still using the initial remote CID for the client, so
+4912 // let's switch immediately to enable clientside stateless resets.
+4913 self.update_remote_cid(PathId::ZERO);
+4914 }
+4915 }
+4916 Frame::NewToken(NewToken { token }) => {
+4917 let ConnectionSide::Client {
+4918 token_store,
+4919 server_name,
+4920 ..
+4921 } = &self.side
+4922 else {
+4923 return Err(TransportError::PROTOCOL_VIOLATION("client sent NEW_TOKEN"));
+4924 };
+4925 if token.is_empty() {
+4926 return Err(TransportError::FRAME_ENCODING_ERROR("empty token"));
+4927 }
+4928 trace!("got new token");
+4929 token_store.insert(server_name, token);
+4930 }
+4931 Frame::Datagram(datagram) => {
+4932 if self
+4933 .datagrams
+4934 .received(datagram, &self.config.datagram_receive_buffer_size)?
+4935 {
+4936 self.events.push_back(Event::DatagramReceived);
+4937 }
+4938 }
+4939 Frame::AckFrequency(ack_frequency) => {
+4940 // This frame can only be sent in the Data space
+4941
+4942 if !self.ack_frequency.ack_frequency_received(&ack_frequency)? {
+4943 // The AckFrequency frame is stale (we have already received a more
+4944 // recent one)
+4945 continue;
+4946 }
4947
-4948 // Our `max_ack_delay` has been updated, so we may need to adjust
-4949 // its associated timeout
-4950 if let Some(timeout) = space
-4951 .pending_acks
-4952 .max_ack_delay_timeout(self.ack_frequency.max_ack_delay)
-4953 {
-4954 self.timers.set(
-4955 Timer::PerPath(*path_id, PathTimer::MaxAckDelay),
-4956 timeout,
-4957 self.qlog.with_time(now),
-4958 );
-4959 }
-4960 }
-4961 }
-4962 Frame::ImmediateAck => {
-4963 // This frame can only be sent in the Data space
-4964 for pns in self.spaces[SpaceId::Data].iter_paths_mut() {
-4965 pns.pending_acks.set_immediate_ack_required();
-4966 }
-4967 }
-4968 Frame::HandshakeDone => {
-4969 if self.side.is_server() {
-4970 return Err(TransportError::PROTOCOL_VIOLATION(
-4971 "client sent HANDSHAKE_DONE",
-4972 ));
-4973 }
-4974 if self.crypto_state.has_keys(EncryptionLevel::Handshake) {
-4975 self.discard_space(now, SpaceId::Handshake);
-4976 }
-4977 self.events.push_back(Event::HandshakeConfirmed);
-4978 trace!("handshake confirmed");
-4979 }
-4980 Frame::ObservedAddr(observed) => {
-4981 // check if params allows the peer to send report and this node to receive it
-4982 trace!(seq_no = %observed.seq_no, ip = %observed.ip, port = observed.port);
-4983 if !self
-4984 .peer_params
-4985 .address_discovery_role
-4986 .should_report(&self.config.address_discovery_role)
-4987 {
-4988 return Err(TransportError::PROTOCOL_VIOLATION(
-4989 "received OBSERVED_ADDRESS frame when not negotiated",
-4990 ));
-4991 }
-4992 // must only be sent in data space
-4993 if packet.header.space() != SpaceId::Data {
-4994 return Err(TransportError::PROTOCOL_VIOLATION(
-4995 "OBSERVED_ADDRESS frame outside data space",
-4996 ));
-4997 }
-4998
-4999 let path = self.path_data_mut(path_id);
-5000 if network_path == path.network_path {
-5001 if let Some(updated) = path.update_observed_addr_report(observed)
-5002 && path.open
-5003 {
-5004 self.events.push_back(Event::Path(PathEvent::ObservedAddr {
-5005 id: path_id,
-5006 addr: updated,
-5007 }));
-5008 // otherwise the event is reported when the path is deemed open
-5009 }
-5010 } else {
-5011 // include in migration
-5012 migration_observed_addr = Some(observed)
-5013 }
-5014 }
-5015 Frame::PathAbandon(frame::PathAbandon {
-5016 path_id,
-5017 error_code,
-5018 }) => {
-5019 span.record("path", tracing::field::debug(&path_id));
-5020 match self.close_path_inner(
-5021 now,
-5022 path_id,
-5023 PathAbandonReason::RemoteAbandoned {
-5024 error_code: error_code.into(),
-5025 },
-5026 ) {
-5027 Ok(()) => {
-5028 trace!("peer abandoned path");
-5029 }
-5030 Err(ClosePathError::LastOpenPath) => {
-5031 trace!("peer abandoned last path, closing connection");
-5032 return Err(TransportError::NO_VIABLE_PATH(
-5033 "last path abandoned by peer",
-5034 ));
-5035 }
-5036 Err(ClosePathError::ClosedPath) => {
-5037 trace!("peer abandoned already closed path");
-5038 }
-5039 Err(ClosePathError::MultipathNotNegotiated) => {
-5040 return Err(TransportError::PROTOCOL_VIOLATION(
-5041 "received PATH_ABANDON frame when multipath was not negotiated",
-5042 ));
-5043 }
-5044 };
-5045 // If we receive a retransmit of PATH_ABANDON then we may already have
-5046 // abandoned this path locally. In that case the DiscardPath timer
-5047 // may already have fired and we no longer have any state for this path.
-5048 // Only set this timer if we still have path state.
-5049 if let Some(path) = self.paths.get_mut(&path_id)
-5050 && !matches!(path.data.abandon_state, AbandonState::ReceivedPathAbandon)
-5051 {
-5052 let ack_delay = self.ack_frequency.max_ack_delay_for_pto();
-5053 let pto = path.data.rtt.pto_base() + ack_delay;
-5054 self.timers.set(
-5055 Timer::PerPath(path_id, PathTimer::DiscardPath),
-5056 now + 3 * pto,
-5057 self.qlog.with_time(now),
-5058 );
-5059 // We received a PATH_ABANDON, we don't expect another one by a certain time.
-5060 path.data.abandon_state = AbandonState::ReceivedPathAbandon;
-5061 }
-5062 }
-5063 Frame::PathStatusAvailable(info) => {
-5064 span.record("path", tracing::field::debug(&info.path_id));
-5065 if self.is_multipath_negotiated() {
-5066 self.on_path_status(
-5067 info.path_id,
-5068 PathStatus::Available,
-5069 info.status_seq_no,
-5070 );
-5071 } else {
-5072 return Err(TransportError::PROTOCOL_VIOLATION(
-5073 "received PATH_STATUS_AVAILABLE frame when multipath was not negotiated",
-5074 ));
-5075 }
-5076 }
-5077 Frame::PathStatusBackup(info) => {
-5078 span.record("path", tracing::field::debug(&info.path_id));
-5079 if self.is_multipath_negotiated() {
-5080 self.on_path_status(info.path_id, PathStatus::Backup, info.status_seq_no);
-5081 } else {
-5082 return Err(TransportError::PROTOCOL_VIOLATION(
-5083 "received PATH_STATUS_BACKUP frame when multipath was not negotiated",
-5084 ));
-5085 }
-5086 }
-5087 Frame::MaxPathId(frame::MaxPathId(path_id)) => {
-5088 span.record("path", tracing::field::debug(&path_id));
-5089 if !self.is_multipath_negotiated() {
-5090 return Err(TransportError::PROTOCOL_VIOLATION(
-5091 "received MAX_PATH_ID frame when multipath was not negotiated",
-5092 ));
-5093 }
-5094 // frames that do not increase the path id are ignored
-5095 if path_id > self.remote_max_path_id {
-5096 self.remote_max_path_id = path_id;
-5097 self.issue_first_path_cids(now);
-5098 while let Some(true) = self.continue_nat_traversal_round(now) {}
-5099 }
-5100 }
-5101 Frame::PathsBlocked(frame::PathsBlocked(max_path_id)) => {
-5102 // Receipt of a value of Maximum Path Identifier or Path Identifier that is higher than the local maximum value MUST
-5103 // be treated as a connection error of type PROTOCOL_VIOLATION.
-5104 // Ref <https://www.ietf.org/archive/id/draft-ietf-quic-multipath-14.html#name-paths_blocked-and-path_cids>
-5105 if self.is_multipath_negotiated() {
-5106 if max_path_id > self.local_max_path_id {
-5107 return Err(TransportError::PROTOCOL_VIOLATION(
-5108 "PATHS_BLOCKED maximum path identifier was larger than local maximum",
-5109 ));
-5110 }
-5111 debug!("received PATHS_BLOCKED({:?})", max_path_id);
-5112 // TODO(@divma): ensure max concurrent paths
-5113 } else {
-5114 return Err(TransportError::PROTOCOL_VIOLATION(
-5115 "received PATHS_BLOCKED frame when not multipath was not negotiated",
-5116 ));
-5117 }
-5118 }
-5119 Frame::PathCidsBlocked(frame::PathCidsBlocked { path_id, next_seq }) => {
-5120 // Nothing to do. This is recorded in the frame stats, but otherwise we
-5121 // always issue all CIDs we're allowed to issue, so either this is an
-5122 // impatient peer or a bug on our side.
-5123
-5124 // Receipt of a value of Maximum Path Identifier or Path Identifier that is higher than the local maximum value MUST
-5125 // be treated as a connection error of type PROTOCOL_VIOLATION.
-5126 // Ref <https://www.ietf.org/archive/id/draft-ietf-quic-multipath-14.html#name-paths_blocked-and-path_cids>
-5127 if self.is_multipath_negotiated() {
-5128 if path_id > self.local_max_path_id {
-5129 return Err(TransportError::PROTOCOL_VIOLATION(
-5130 "PATH_CIDS_BLOCKED path identifier was larger than local maximum",
-5131 ));
-5132 }
-5133 if next_seq.0
-5134 > self
-5135 .local_cid_state
-5136 .get(&path_id)
-5137 .map(|cid_state| cid_state.active_seq().1 + 1)
-5138 .unwrap_or_default()
-5139 {
-5140 return Err(TransportError::PROTOCOL_VIOLATION(
-5141 "PATH_CIDS_BLOCKED next sequence number larger than in local state",
-5142 ));
-5143 }
-5144 debug!(%path_id, %next_seq, "received PATH_CIDS_BLOCKED");
-5145 } else {
-5146 return Err(TransportError::PROTOCOL_VIOLATION(
-5147 "received PATH_CIDS_BLOCKED frame when not multipath was not negotiated",
-5148 ));
-5149 }
-5150 }
-5151 Frame::AddAddress(addr) => {
-5152 let client_state = match self.iroh_hp.client_side_mut() {
-5153 Ok(state) => state,
-5154 Err(err) => {
-5155 return Err(TransportError::PROTOCOL_VIOLATION(format!(
-5156 "Nat traversal(ADD_ADDRESS): {err}"
-5157 )));
-5158 }
-5159 };
-5160
-5161 if !client_state.check_remote_address(&addr) {
-5162 // if the address is not valid we flag it, but update anyway
-5163 warn!(?addr, "server sent illegal ADD_ADDRESS frame");
-5164 }
-5165
-5166 match client_state.add_remote_address(addr) {
-5167 Ok(maybe_added) => {
-5168 if let Some(added) = maybe_added {
-5169 self.events.push_back(Event::NatTraversal(
-5170 iroh_hp::Event::AddressAdded(added),
-5171 ));
-5172 }
-5173 }
-5174 Err(e) => {
-5175 warn!(%e, "failed to add remote address")
-5176 }
-5177 }
-5178 }
-5179 Frame::RemoveAddress(addr) => {
-5180 let client_state = match self.iroh_hp.client_side_mut() {
-5181 Ok(state) => state,
-5182 Err(err) => {
-5183 return Err(TransportError::PROTOCOL_VIOLATION(format!(
-5184 "Nat traversal(REMOVE_ADDRESS): {err}"
-5185 )));
-5186 }
-5187 };
-5188 if let Some(removed_addr) = client_state.remove_remote_address(addr) {
-5189 self.events
-5190 .push_back(Event::NatTraversal(iroh_hp::Event::AddressRemoved(
-5191 removed_addr,
-5192 )));
-5193 }
-5194 }
-5195 Frame::ReachOut(reach_out) => {
-5196 let ipv6 = self.is_ipv6();
-5197 let server_state = match self.iroh_hp.server_side_mut() {
-5198 Ok(state) => state,
-5199 Err(err) => {
-5200 return Err(TransportError::PROTOCOL_VIOLATION(format!(
-5201 "Nat traversal(REACH_OUT): {err}"
-5202 )));
-5203 }
-5204 };
-5205
-5206 if let Err(err) = server_state.handle_reach_out(reach_out, ipv6) {
-5207 return Err(TransportError::PROTOCOL_VIOLATION(format!(
-5208 "Nat traversal(REACH_OUT): {err}"
-5209 )));
-5210 }
-5211 }
-5212 }
-5213 }
-5214
-5215 let space = self.spaces[SpaceId::Data].for_path(path_id);
-5216 if space
-5217 .pending_acks
-5218 .packet_received(now, number, ack_eliciting, &space.dedup)
-5219 {
-5220 if self.abandoned_paths.contains(&path_id) {
-5221 // § 3.4.3 QUIC-MULTIPATH: promptly send ACKs for packets received from
-5222 // abandoned paths.
-5223 space.pending_acks.set_immediate_ack_required();
-5224 } else {
-5225 self.timers.set(
-5226 Timer::PerPath(path_id, PathTimer::MaxAckDelay),
-5227 now + self.ack_frequency.max_ack_delay,
-5228 self.qlog.with_time(now),
-5229 );
-5230 }
-5231 }
-5232
-5233 // Issue stream ID credit due to ACKs of outgoing finish/resets and incoming finish/resets
-5234 // on stopped streams. Incoming finishes/resets on open streams are not handled here as they
-5235 // are only freed, and hence only issue credit, once the application has been notified
-5236 // during a read on the stream.
-5237 let pending = &mut self.spaces[SpaceId::Data].pending;
-5238 self.streams.queue_max_stream_id(pending);
-5239
-5240 if let Some(reason) = close {
-5241 self.state.move_to_draining(Some(reason.into()));
-5242 self.connection_close_pending = true;
-5243 }
-5244
-5245 if Some(number) == self.spaces[SpaceId::Data].for_path(path_id).rx_packet
-5246 && !is_probing_packet
-5247 && network_path != self.path_data(path_id).network_path
-5248 {
-5249 let ConnectionSide::Server { ref server_config } = self.side else {
-5250 panic!("packets from unknown remote should be dropped by clients");
-5251 };
-5252 debug_assert!(
-5253 server_config.migration,
-5254 "migration-initiating packets should have been dropped immediately"
-5255 );
-5256 self.migrate(path_id, now, network_path, migration_observed_addr);
-5257 // Break linkability, if possible
-5258 self.update_remote_cid(path_id);
-5259 self.spin = false;
-5260 }
-5261
-5262 Ok(())
-5263 }
-5264
-5265 fn migrate(
-5266 &mut self,
-5267 path_id: PathId,
-5268 now: Instant,
-5269 network_path: FourTuple,
-5270 observed_addr: Option<ObservedAddr>,
-5271 ) {
-5272 trace!(%network_path, %path_id, "migration initiated");
-5273 self.path_generation_counter = self.path_generation_counter.wrapping_add(1);
-5274 // TODO(@divma): conditions for path migration in multipath are very specific, check them
-5275 // again to prevent path migrations that should actually create a new path
-5276
-5277 // Reset rtt/congestion state for new path unless it looks like a NAT rebinding.
-5278 // Note that the congestion window will not grow until validation terminates. Helps mitigate
-5279 // amplification attacks performed by spoofing source addresses.
-5280 let prev_pto = self.pto(SpaceId::Data, path_id);
-5281 let path = self.paths.get_mut(&path_id).expect("known path");
-5282 let mut new_path_data = if network_path.remote.is_ipv4()
-5283 && network_path.remote.ip() == path.data.network_path.remote.ip()
-5284 {
-5285 PathData::from_previous(network_path, &path.data, self.path_generation_counter, now)
-5286 } else {
-5287 let peer_max_udp_payload_size =
-5288 u16::try_from(self.peer_params.max_udp_payload_size.into_inner())
-5289 .unwrap_or(u16::MAX);
-5290 PathData::new(
-5291 network_path,
-5292 self.allow_mtud,
-5293 Some(peer_max_udp_payload_size),
-5294 self.path_generation_counter,
-5295 now,
-5296 &self.config,
-5297 )
-5298 };
-5299 new_path_data.last_observed_addr_report = path.data.last_observed_addr_report.clone();
-5300 if let Some(report) = observed_addr
-5301 && let Some(updated) = new_path_data.update_observed_addr_report(report)
-5302 {
-5303 tracing::info!("adding observed addr event from migration");
-5304 self.events.push_back(Event::Path(PathEvent::ObservedAddr {
-5305 id: path_id,
-5306 addr: updated,
-5307 }));
-5308 }
-5309 new_path_data.send_new_challenge = true;
-5310
-5311 let mut prev_path_data = mem::replace(&mut path.data, new_path_data);
-5312
-5313 // Only store this as previous path if it was validated. For all we know there could
-5314 // already be a previous path stored which might have been validated in the past,
-5315 // which is more valuable than one that's not yet validated.
-5316 //
-5317 // With multipath it is possible that there are no remote CIDs for the path ID
-5318 // yet. In this case we would never have sent on this path yet and would not be able
-5319 // to send a PATH_CHALLENGE either, which is currently a fire-and-forget affair
-5320 // anyway. So don't store such a path either.
-5321 if !prev_path_data.validated
-5322 && let Some(cid) = self.remote_cids.get(&path_id).map(CidQueue::active)
-5323 {
-5324 prev_path_data.send_new_challenge = true;
-5325 // We haven't updated the remote CID yet, this captures the remote CID we were using on
-5326 // the previous path.
-5327 path.prev = Some((cid, prev_path_data));
-5328 }
-5329
-5330 // We need to re-assign the correct remote to this path in qlog
-5331 self.qlog.emit_tuple_assigned(path_id, network_path, now);
-5332
-5333 self.timers.set(
-5334 Timer::PerPath(path_id, PathTimer::PathValidation),
-5335 now + 3 * cmp::max(self.pto(SpaceId::Data, path_id), prev_pto),
-5336 self.qlog.with_time(now),
-5337 );
-5338 }
-5339
-5340 /// Handle a change in the local address, i.e. an active migration
-5341 ///
-5342 /// In the general (non-multipath) case, paths will perform a RFC9000 migration and be pinged
-5343 /// for a liveness check. This is the behaviour of a path assumed to be recoverable, even if
-5344 /// this is not the case.
+4948 // Update the params for all of our paths
+4949 for (path_id, space) in self.spaces[SpaceId::Data].number_spaces.iter_mut() {
+4950 space.pending_acks.set_ack_frequency_params(&ack_frequency);
+4951
+4952 // Our `max_ack_delay` has been updated, so we may need to adjust
+4953 // its associated timeout
+4954 if let Some(timeout) = space
+4955 .pending_acks
+4956 .max_ack_delay_timeout(self.ack_frequency.max_ack_delay)
+4957 {
+4958 self.timers.set(
+4959 Timer::PerPath(*path_id, PathTimer::MaxAckDelay),
+4960 timeout,
+4961 self.qlog.with_time(now),
+4962 );
+4963 }
+4964 }
+4965 }
+4966 Frame::ImmediateAck => {
+4967 // This frame can only be sent in the Data space
+4968 for pns in self.spaces[SpaceId::Data].iter_paths_mut() {
+4969 pns.pending_acks.set_immediate_ack_required();
+4970 }
+4971 }
+4972 Frame::HandshakeDone => {
+4973 if self.side.is_server() {
+4974 return Err(TransportError::PROTOCOL_VIOLATION(
+4975 "client sent HANDSHAKE_DONE",
+4976 ));
+4977 }
+4978 if self.crypto_state.has_keys(EncryptionLevel::Handshake) {
+4979 self.discard_space(now, SpaceId::Handshake);
+4980 }
+4981 self.events.push_back(Event::HandshakeConfirmed);
+4982 trace!("handshake confirmed");
+4983 }
+4984 Frame::ObservedAddr(observed) => {
+4985 // check if params allows the peer to send report and this node to receive it
+4986 trace!(seq_no = %observed.seq_no, ip = %observed.ip, port = observed.port);
+4987 if !self
+4988 .peer_params
+4989 .address_discovery_role
+4990 .should_report(&self.config.address_discovery_role)
+4991 {
+4992 return Err(TransportError::PROTOCOL_VIOLATION(
+4993 "received OBSERVED_ADDRESS frame when not negotiated",
+4994 ));
+4995 }
+4996 // must only be sent in data space
+4997 if packet.header.space() != SpaceId::Data {
+4998 return Err(TransportError::PROTOCOL_VIOLATION(
+4999 "OBSERVED_ADDRESS frame outside data space",
+5000 ));
+5001 }
+5002
+5003 let path = self.path_data_mut(path_id);
+5004 if network_path == path.network_path {
+5005 if let Some(updated) = path.update_observed_addr_report(observed)
+5006 && path.open
+5007 {
+5008 self.events.push_back(Event::Path(PathEvent::ObservedAddr {
+5009 id: path_id,
+5010 addr: updated,
+5011 }));
+5012 // otherwise the event is reported when the path is deemed open
+5013 }
+5014 } else {
+5015 // include in migration
+5016 migration_observed_addr = Some(observed)
+5017 }
+5018 }
+5019 Frame::PathAbandon(frame::PathAbandon {
+5020 path_id,
+5021 error_code,
+5022 }) => {
+5023 span.record("path", tracing::field::debug(&path_id));
+5024 match self.close_path_inner(
+5025 now,
+5026 path_id,
+5027 PathAbandonReason::RemoteAbandoned {
+5028 error_code: error_code.into(),
+5029 },
+5030 ) {
+5031 Ok(()) => {
+5032 trace!("peer abandoned path");
+5033 }
+5034 Err(ClosePathError::LastOpenPath) => {
+5035 trace!("peer abandoned last path, closing connection");
+5036 return Err(TransportError::NO_VIABLE_PATH(
+5037 "last path abandoned by peer",
+5038 ));
+5039 }
+5040 Err(ClosePathError::ClosedPath) => {
+5041 trace!("peer abandoned already closed path");
+5042 }
+5043 Err(ClosePathError::MultipathNotNegotiated) => {
+5044 return Err(TransportError::PROTOCOL_VIOLATION(
+5045 "received PATH_ABANDON frame when multipath was not negotiated",
+5046 ));
+5047 }
+5048 };
+5049 // If we receive a retransmit of PATH_ABANDON then we may already have
+5050 // abandoned this path locally. In that case the DiscardPath timer
+5051 // may already have fired and we no longer have any state for this path.
+5052 // Only set this timer if we still have path state.
+5053 if let Some(path) = self.paths.get_mut(&path_id)
+5054 && !matches!(path.data.abandon_state, AbandonState::ReceivedPathAbandon)
+5055 {
+5056 let ack_delay = self.ack_frequency.max_ack_delay_for_pto();
+5057 let pto = path.data.rtt.pto_base() + ack_delay;
+5058 self.timers.set(
+5059 Timer::PerPath(path_id, PathTimer::DiscardPath),
+5060 now + 3 * pto,
+5061 self.qlog.with_time(now),
+5062 );
+5063 // We received a PATH_ABANDON, we don't expect another one by a certain time.
+5064 path.data.abandon_state = AbandonState::ReceivedPathAbandon;
+5065 }
+5066 }
+5067 Frame::PathStatusAvailable(info) => {
+5068 span.record("path", tracing::field::debug(&info.path_id));
+5069 if self.is_multipath_negotiated() {
+5070 self.on_path_status(
+5071 info.path_id,
+5072 PathStatus::Available,
+5073 info.status_seq_no,
+5074 );
+5075 } else {
+5076 return Err(TransportError::PROTOCOL_VIOLATION(
+5077 "received PATH_STATUS_AVAILABLE frame when multipath was not negotiated",
+5078 ));
+5079 }
+5080 }
+5081 Frame::PathStatusBackup(info) => {
+5082 span.record("path", tracing::field::debug(&info.path_id));
+5083 if self.is_multipath_negotiated() {
+5084 self.on_path_status(info.path_id, PathStatus::Backup, info.status_seq_no);
+5085 } else {
+5086 return Err(TransportError::PROTOCOL_VIOLATION(
+5087 "received PATH_STATUS_BACKUP frame when multipath was not negotiated",
+5088 ));
+5089 }
+5090 }
+5091 Frame::MaxPathId(frame::MaxPathId(path_id)) => {
+5092 span.record("path", tracing::field::debug(&path_id));
+5093 if !self.is_multipath_negotiated() {
+5094 return Err(TransportError::PROTOCOL_VIOLATION(
+5095 "received MAX_PATH_ID frame when multipath was not negotiated",
+5096 ));
+5097 }
+5098 // frames that do not increase the path id are ignored
+5099 if path_id > self.remote_max_path_id {
+5100 self.remote_max_path_id = path_id;
+5101 self.issue_first_path_cids(now);
+5102 while let Some(true) = self.continue_nat_traversal_round(now) {}
+5103 }
+5104 }
+5105 Frame::PathsBlocked(frame::PathsBlocked(max_path_id)) => {
+5106 // Receipt of a value of Maximum Path Identifier or Path Identifier that is higher than the local maximum value MUST
+5107 // be treated as a connection error of type PROTOCOL_VIOLATION.
+5108 // Ref <https://www.ietf.org/archive/id/draft-ietf-quic-multipath-14.html#name-paths_blocked-and-path_cids>
+5109 if self.is_multipath_negotiated() {
+5110 if max_path_id > self.local_max_path_id {
+5111 return Err(TransportError::PROTOCOL_VIOLATION(
+5112 "PATHS_BLOCKED maximum path identifier was larger than local maximum",
+5113 ));
+5114 }
+5115 debug!("received PATHS_BLOCKED({:?})", max_path_id);
+5116 // TODO(@divma): ensure max concurrent paths
+5117 } else {
+5118 return Err(TransportError::PROTOCOL_VIOLATION(
+5119 "received PATHS_BLOCKED frame when not multipath was not negotiated",
+5120 ));
+5121 }
+5122 }
+5123 Frame::PathCidsBlocked(frame::PathCidsBlocked { path_id, next_seq }) => {
+5124 // Nothing to do. This is recorded in the frame stats, but otherwise we
+5125 // always issue all CIDs we're allowed to issue, so either this is an
+5126 // impatient peer or a bug on our side.
+5127
+5128 // Receipt of a value of Maximum Path Identifier or Path Identifier that is higher than the local maximum value MUST
+5129 // be treated as a connection error of type PROTOCOL_VIOLATION.
+5130 // Ref <https://www.ietf.org/archive/id/draft-ietf-quic-multipath-14.html#name-paths_blocked-and-path_cids>
+5131 if self.is_multipath_negotiated() {
+5132 if path_id > self.local_max_path_id {
+5133 return Err(TransportError::PROTOCOL_VIOLATION(
+5134 "PATH_CIDS_BLOCKED path identifier was larger than local maximum",
+5135 ));
+5136 }
+5137 if next_seq.0
+5138 > self
+5139 .local_cid_state
+5140 .get(&path_id)
+5141 .map(|cid_state| cid_state.active_seq().1 + 1)
+5142 .unwrap_or_default()
+5143 {
+5144 return Err(TransportError::PROTOCOL_VIOLATION(
+5145 "PATH_CIDS_BLOCKED next sequence number larger than in local state",
+5146 ));
+5147 }
+5148 debug!(%path_id, %next_seq, "received PATH_CIDS_BLOCKED");
+5149 } else {
+5150 return Err(TransportError::PROTOCOL_VIOLATION(
+5151 "received PATH_CIDS_BLOCKED frame when not multipath was not negotiated",
+5152 ));
+5153 }
+5154 }
+5155 Frame::AddAddress(addr) => {
+5156 let client_state = match self.iroh_hp.client_side_mut() {
+5157 Ok(state) => state,
+5158 Err(err) => {
+5159 return Err(TransportError::PROTOCOL_VIOLATION(format!(
+5160 "Nat traversal(ADD_ADDRESS): {err}"
+5161 )));
+5162 }
+5163 };
+5164
+5165 if !client_state.check_remote_address(&addr) {
+5166 // if the address is not valid we flag it, but update anyway
+5167 warn!(?addr, "server sent illegal ADD_ADDRESS frame");
+5168 }
+5169
+5170 match client_state.add_remote_address(addr) {
+5171 Ok(maybe_added) => {
+5172 if let Some(added) = maybe_added {
+5173 self.events.push_back(Event::NatTraversal(
+5174 iroh_hp::Event::AddressAdded(added),
+5175 ));
+5176 }
+5177 }
+5178 Err(e) => {
+5179 warn!(%e, "failed to add remote address")
+5180 }
+5181 }
+5182 }
+5183 Frame::RemoveAddress(addr) => {
+5184 let client_state = match self.iroh_hp.client_side_mut() {
+5185 Ok(state) => state,
+5186 Err(err) => {
+5187 return Err(TransportError::PROTOCOL_VIOLATION(format!(
+5188 "Nat traversal(REMOVE_ADDRESS): {err}"
+5189 )));
+5190 }
+5191 };
+5192 if let Some(removed_addr) = client_state.remove_remote_address(addr) {
+5193 self.events
+5194 .push_back(Event::NatTraversal(iroh_hp::Event::AddressRemoved(
+5195 removed_addr,
+5196 )));
+5197 }
+5198 }
+5199 Frame::ReachOut(reach_out) => {
+5200 let ipv6 = self.is_ipv6();
+5201 let server_state = match self.iroh_hp.server_side_mut() {
+5202 Ok(state) => state,
+5203 Err(err) => {
+5204 return Err(TransportError::PROTOCOL_VIOLATION(format!(
+5205 "Nat traversal(REACH_OUT): {err}"
+5206 )));
+5207 }
+5208 };
+5209
+5210 if let Err(err) = server_state.handle_reach_out(reach_out, ipv6) {
+5211 return Err(TransportError::PROTOCOL_VIOLATION(format!(
+5212 "Nat traversal(REACH_OUT): {err}"
+5213 )));
+5214 }
+5215 }
+5216 }
+5217 }
+5218
+5219 let space = self.spaces[SpaceId::Data].for_path(path_id);
+5220 if space
+5221 .pending_acks
+5222 .packet_received(now, number, ack_eliciting, &space.dedup)
+5223 {
+5224 if self.abandoned_paths.contains(&path_id) {
+5225 // § 3.4.3 QUIC-MULTIPATH: promptly send ACKs for packets received from
+5226 // abandoned paths.
+5227 space.pending_acks.set_immediate_ack_required();
+5228 } else {
+5229 self.timers.set(
+5230 Timer::PerPath(path_id, PathTimer::MaxAckDelay),
+5231 now + self.ack_frequency.max_ack_delay,
+5232 self.qlog.with_time(now),
+5233 );
+5234 }
+5235 }
+5236
+5237 // Issue stream ID credit due to ACKs of outgoing finish/resets and incoming finish/resets
+5238 // on stopped streams. Incoming finishes/resets on open streams are not handled here as they
+5239 // are only freed, and hence only issue credit, once the application has been notified
+5240 // during a read on the stream.
+5241 let pending = &mut self.spaces[SpaceId::Data].pending;
+5242 self.streams.queue_max_stream_id(pending);
+5243
+5244 if let Some(reason) = close {
+5245 self.state.move_to_draining(Some(reason.into()));
+5246 self.connection_close_pending = true;
+5247 }
+5248
+5249 if Some(number) == self.spaces[SpaceId::Data].for_path(path_id).rx_packet
+5250 && !is_probing_packet
+5251 && network_path != self.path_data(path_id).network_path
+5252 {
+5253 let ConnectionSide::Server { ref server_config } = self.side else {
+5254 panic!("packets from unknown remote should be dropped by clients");
+5255 };
+5256 debug_assert!(
+5257 server_config.migration,
+5258 "migration-initiating packets should have been dropped immediately"
+5259 );
+5260 self.migrate(path_id, now, network_path, migration_observed_addr);
+5261 // Break linkability, if possible
+5262 self.update_remote_cid(path_id);
+5263 self.spin = false;
+5264 }
+5265
+5266 Ok(())
+5267 }
+5268
+5269 fn migrate(
+5270 &mut self,
+5271 path_id: PathId,
+5272 now: Instant,
+5273 network_path: FourTuple,
+5274 observed_addr: Option<ObservedAddr>,
+5275 ) {
+5276 trace!(%network_path, %path_id, "migration initiated");
+5277 self.path_generation_counter = self.path_generation_counter.wrapping_add(1);
+5278 // TODO(@divma): conditions for path migration in multipath are very specific, check them
+5279 // again to prevent path migrations that should actually create a new path
+5280
+5281 // Reset rtt/congestion state for new path unless it looks like a NAT rebinding.
+5282 // Note that the congestion window will not grow until validation terminates. Helps mitigate
+5283 // amplification attacks performed by spoofing source addresses.
+5284 let prev_pto = self.pto(SpaceId::Data, path_id);
+5285 let path = self.paths.get_mut(&path_id).expect("known path");
+5286 let mut new_path_data = if network_path.remote.is_ipv4()
+5287 && network_path.remote.ip() == path.data.network_path.remote.ip()
+5288 {
+5289 PathData::from_previous(network_path, &path.data, self.path_generation_counter, now)
+5290 } else {
+5291 let peer_max_udp_payload_size =
+5292 u16::try_from(self.peer_params.max_udp_payload_size.into_inner())
+5293 .unwrap_or(u16::MAX);
+5294 PathData::new(
+5295 network_path,
+5296 self.allow_mtud,
+5297 Some(peer_max_udp_payload_size),
+5298 self.path_generation_counter,
+5299 now,
+5300 &self.config,
+5301 )
+5302 };
+5303 new_path_data.last_observed_addr_report = path.data.last_observed_addr_report.clone();
+5304 if let Some(report) = observed_addr
+5305 && let Some(updated) = new_path_data.update_observed_addr_report(report)
+5306 {
+5307 tracing::info!("adding observed addr event from migration");
+5308 self.events.push_back(Event::Path(PathEvent::ObservedAddr {
+5309 id: path_id,
+5310 addr: updated,
+5311 }));
+5312 }
+5313 new_path_data.send_new_challenge = true;
+5314
+5315 let mut prev_path_data = mem::replace(&mut path.data, new_path_data);
+5316
+5317 // Only store this as previous path if it was validated. For all we know there could
+5318 // already be a previous path stored which might have been validated in the past,
+5319 // which is more valuable than one that's not yet validated.
+5320 //
+5321 // With multipath it is possible that there are no remote CIDs for the path ID
+5322 // yet. In this case we would never have sent on this path yet and would not be able
+5323 // to send a PATH_CHALLENGE either, which is currently a fire-and-forget affair
+5324 // anyway. So don't store such a path either.
+5325 if !prev_path_data.validated
+5326 && let Some(cid) = self.remote_cids.get(&path_id).map(CidQueue::active)
+5327 {
+5328 prev_path_data.send_new_challenge = true;
+5329 // We haven't updated the remote CID yet, this captures the remote CID we were using on
+5330 // the previous path.
+5331 path.prev = Some((cid, prev_path_data));
+5332 }
+5333
+5334 // We need to re-assign the correct remote to this path in qlog
+5335 self.qlog.emit_tuple_assigned(path_id, network_path, now);
+5336
+5337 self.timers.set(
+5338 Timer::PerPath(path_id, PathTimer::PathValidation),
+5339 now + 3 * cmp::max(self.pto(SpaceId::Data, path_id), prev_pto),
+5340 self.qlog.with_time(now),
+5341 );
+5342 }
+5343
+5344 /// Handle a change in the local address, i.e. an active migration
5345 ///
-5346 /// Clients in a connection in which multipath has been negotiated should migrate paths to new
-5347 /// [`PathId`]s. For paths that are known to be non-recoverable can be migrated to a new
-5348 /// [`PathId`] by closing the current path, and opening a new one to the same remote. Treating
-5349 /// paths as non recoverable when necessary accelerates connectivity re-establishment, or might
-5350 /// allow it altogether.
-5351 ///
-5352 /// The optional `hint` allows callers to indicate when paths are non-recoverable and should be
-5353 /// migrated to new a [`PathId`].
-5354 // NOTE: only clients are allowed to migrate, but generally dealing with RFC9000 migrations is
-5355 // lacking <https://github.com/n0-computer/quinn/issues/364>
-5356 pub fn handle_network_change(&mut self, hint: Option<&dyn NetworkChangeHint>, now: Instant) {
-5357 debug!("network changed");
-5358 if self.highest_space < SpaceId::Data {
-5359 for path in self.paths.values_mut() {
-5360 // Clear the local address for it to be obtained from the socket again.
-5361 path.data.network_path.local_ip = None;
-5362 }
-5363
-5364 self.update_remote_cid(PathId::ZERO);
-5365 self.ping();
-5366
-5367 return;
-5368 }
-5369
-5370 // Paths that can't recover so a new path should be open instead. If multipath is not
-5371 // negotiated, this will be empty.
-5372 let mut non_recoverable_paths = Vec::default();
-5373 let mut recoverable_paths = Vec::default();
-5374 let mut open_paths = 0;
-5375
-5376 let is_multipath_negotiated = self.is_multipath_negotiated();
-5377 let is_client = self.side().is_client();
-5378 let immediate_ack_allowed = self.peer_supports_ack_frequency();
+5346 /// In the general (non-multipath) case, paths will perform a RFC9000 migration and be pinged
+5347 /// for a liveness check. This is the behaviour of a path assumed to be recoverable, even if
+5348 /// this is not the case.
+5349 ///
+5350 /// Clients in a connection in which multipath has been negotiated should migrate paths to new
+5351 /// [`PathId`]s. For paths that are known to be non-recoverable can be migrated to a new
+5352 /// [`PathId`] by closing the current path, and opening a new one to the same remote. Treating
+5353 /// paths as non recoverable when necessary accelerates connectivity re-establishment, or might
+5354 /// allow it altogether.
+5355 ///
+5356 /// The optional `hint` allows callers to indicate when paths are non-recoverable and should be
+5357 /// migrated to new a [`PathId`].
+5358 // NOTE: only clients are allowed to migrate, but generally dealing with RFC9000 migrations is
+5359 // lacking <https://github.com/n0-computer/quinn/issues/364>
+5360 pub fn handle_network_change(&mut self, hint: Option<&dyn NetworkChangeHint>, now: Instant) {
+5361 debug!("network changed");
+5362 if self.highest_space < SpaceId::Data {
+5363 for path in self.paths.values_mut() {
+5364 // Clear the local address for it to be obtained from the socket again.
+5365 path.data.network_path.local_ip = None;
+5366 }
+5367
+5368 self.update_remote_cid(PathId::ZERO);
+5369 self.ping();
+5370
+5371 return;
+5372 }
+5373
+5374 // Paths that can't recover so a new path should be open instead. If multipath is not
+5375 // negotiated, this will be empty.
+5376 let mut non_recoverable_paths = Vec::default();
+5377 let mut recoverable_paths = Vec::default();
+5378 let mut open_paths = 0;
5379
-5380 for (path_id, path) in self.paths.iter_mut() {
-5381 if self.abandoned_paths.contains(path_id) {
-5382 continue;
-5383 }
-5384 open_paths += 1;
-5385
-5386 // Clear the local address for it to be obtained from the socket again. This applies to
-5387 // all paths, regardless of being considered recoverable or not
-5388 path.data.network_path.local_ip = None;
+5380 let is_multipath_negotiated = self.is_multipath_negotiated();
+5381 let is_client = self.side().is_client();
+5382 let immediate_ack_allowed = self.peer_supports_ack_frequency();
+5383
+5384 for (path_id, path) in self.paths.iter_mut() {
+5385 if self.abandoned_paths.contains(path_id) {
+5386 continue;
+5387 }
+5388 open_paths += 1;
5389
-5390 let network_path = path.data.network_path;
-5391 let remote = network_path.remote;
-5392
-5393 // Without multipath, the connection tries to recover the single path, whereas with
-5394 // multipath, even in a single-path scenario, we attempt to migrate the path to a new
-5395 // PathId.
-5396 let attempt_to_recover = if is_multipath_negotiated {
-5397 if is_client {
-5398 hint.map(|h| h.is_path_recoverable(*path_id, network_path))
-5399 .unwrap_or(false)
-5400 } else {
-5401 // Servers should have stable addresses so this scenario is generally discouraged.
-5402 // There is no way to prevent this, so the best hope is to attempt to recover the
-5403 // path
-5404 true
-5405 }
-5406 } else {
-5407 // In the non multipath case, we try to recover the single active path
-5408 true
-5409 };
-5410
-5411 if attempt_to_recover {
-5412 recoverable_paths.push((*path_id, remote));
-5413 } else {
-5414 non_recoverable_paths.push((*path_id, remote, path.data.local_status()))
-5415 }
-5416 }
-5417
-5418 /* NON RECOVERABLE PATHS */
-5419 // This are handled first, so that in case the treatment intended for these fails, we can
-5420 // go the recoverable route instead.
+5390 // Clear the local address for it to be obtained from the socket again. This applies to
+5391 // all paths, regardless of being considered recoverable or not
+5392 path.data.network_path.local_ip = None;
+5393
+5394 let network_path = path.data.network_path;
+5395 let remote = network_path.remote;
+5396
+5397 // Without multipath, the connection tries to recover the single path, whereas with
+5398 // multipath, even in a single-path scenario, we attempt to migrate the path to a new
+5399 // PathId.
+5400 let attempt_to_recover = if is_multipath_negotiated {
+5401 if is_client {
+5402 hint.map(|h| h.is_path_recoverable(*path_id, network_path))
+5403 .unwrap_or(false)
+5404 } else {
+5405 // Servers should have stable addresses so this scenario is generally discouraged.
+5406 // There is no way to prevent this, so the best hope is to attempt to recover the
+5407 // path
+5408 true
+5409 }
+5410 } else {
+5411 // In the non multipath case, we try to recover the single active path
+5412 true
+5413 };
+5414
+5415 if attempt_to_recover {
+5416 recoverable_paths.push((*path_id, remote));
+5417 } else {
+5418 non_recoverable_paths.push((*path_id, remote, path.data.local_status()))
+5419 }
+5420 }
5421
-5422 // Decide if we need to close first or open first in the multipath case.
-5423 // - Opening first has a higher risk of getting limited by the negotiated MAX_PATH_ID.
-5424 // - Closing first risks this being the only open path.
-5425 // We prefer closing paths first unless we identify this is the last open path.
-5426 let open_first = open_paths == non_recoverable_paths.len();
-5427
-5428 for (path_id, remote, status) in non_recoverable_paths.into_iter() {
-5429 let network_path = FourTuple {
-5430 remote,
-5431 local_ip: None, /* allow the local ip to be discovered */
-5432 };
-5433
-5434 if open_first && let Err(e) = self.open_path(network_path, status, now) {
-5435 debug!(%e,"Failed to open new path for network change");
-5436 // if this fails, let the path try to recover itself
-5437 recoverable_paths.push((path_id, remote));
-5438 continue;
-5439 }
-5440
-5441 if let Err(e) =
-5442 self.close_path_inner(now, path_id, PathAbandonReason::UnusableAfterNetworkChange)
-5443 {
-5444 debug!(%e,"Failed to close unrecoverable path after network change");
-5445 recoverable_paths.push((path_id, remote));
-5446 continue;
-5447 }
-5448
-5449 if !open_first && let Err(e) = self.open_path(network_path, status, now) {
-5450 // Path has already been closed if we got here. Since the path was not recoverable,
-5451 // this might be desirable in any case, because other paths exist (!open_first) and
-5452 // this was is considered non recoverable
-5453 debug!(%e,"Failed to open new path for network change");
-5454 }
-5455 }
-5456
-5457 /* RECOVERABLE PATHS */
-5458
-5459 for (path_id, remote) in recoverable_paths.into_iter() {
-5460 let space = &mut self.spaces[SpaceId::Data];
-5461
-5462 // Schedule a Ping for a liveness check.
-5463 if let Some(path_space) = space.number_spaces.get_mut(&path_id) {
-5464 path_space.ping_pending = true;
+5422 /* NON RECOVERABLE PATHS */
+5423 // This are handled first, so that in case the treatment intended for these fails, we can
+5424 // go the recoverable route instead.
+5425
+5426 // Decide if we need to close first or open first in the multipath case.
+5427 // - Opening first has a higher risk of getting limited by the negotiated MAX_PATH_ID.
+5428 // - Closing first risks this being the only open path.
+5429 // We prefer closing paths first unless we identify this is the last open path.
+5430 let open_first = open_paths == non_recoverable_paths.len();
+5431
+5432 for (path_id, remote, status) in non_recoverable_paths.into_iter() {
+5433 let network_path = FourTuple {
+5434 remote,
+5435 local_ip: None, /* allow the local ip to be discovered */
+5436 };
+5437
+5438 if open_first && let Err(e) = self.open_path(network_path, status, now) {
+5439 debug!(%e,"Failed to open new path for network change");
+5440 // if this fails, let the path try to recover itself
+5441 recoverable_paths.push((path_id, remote));
+5442 continue;
+5443 }
+5444
+5445 if let Err(e) =
+5446 self.close_path_inner(now, path_id, PathAbandonReason::UnusableAfterNetworkChange)
+5447 {
+5448 debug!(%e,"Failed to close unrecoverable path after network change");
+5449 recoverable_paths.push((path_id, remote));
+5450 continue;
+5451 }
+5452
+5453 if !open_first && let Err(e) = self.open_path(network_path, status, now) {
+5454 // Path has already been closed if we got here. Since the path was not recoverable,
+5455 // this might be desirable in any case, because other paths exist (!open_first) and
+5456 // this was is considered non recoverable
+5457 debug!(%e,"Failed to open new path for network change");
+5458 }
+5459 }
+5460
+5461 /* RECOVERABLE PATHS */
+5462
+5463 for (path_id, remote) in recoverable_paths.into_iter() {
+5464 let space = &mut self.spaces[SpaceId::Data];
5465
-5466 if immediate_ack_allowed {
-5467 path_space.immediate_ack_pending = true;
-5468 }
-5469 }
-5470
-5471 let Some((reset_token, retired)) =
-5472 self.remote_cids.get_mut(&path_id).and_then(CidQueue::next)
-5473 else {
-5474 continue;
-5475 };
-5476
-5477 // Retire the current remote CID and any CIDs we had to skip.
-5478 space
-5479 .pending
-5480 .retire_cids
-5481 .extend(retired.map(|seq| (path_id, seq)));
-5482
-5483 self.endpoint_events
-5484 .push_back(EndpointEventInner::ResetToken(path_id, remote, reset_token));
-5485 }
-5486 }
-5487
-5488 /// Switch to a previously unused remote connection ID, if possible
-5489 fn update_remote_cid(&mut self, path_id: PathId) {
-5490 let Some((reset_token, retired)) = self
-5491 .remote_cids
-5492 .get_mut(&path_id)
-5493 .and_then(|cids| cids.next())
-5494 else {
-5495 return;
-5496 };
-5497
-5498 // Retire the current remote CID and any CIDs we had to skip.
-5499 self.spaces[SpaceId::Data]
-5500 .pending
-5501 .retire_cids
-5502 .extend(retired.map(|seq| (path_id, seq)));
-5503 let remote = self.path_data(path_id).network_path.remote;
-5504 self.set_reset_token(path_id, remote, reset_token);
-5505 }
-5506
-5507 /// Sends this reset token to the endpoint
-5508 ///
-5509 /// The endpoint needs to know the reset tokens issued by the peer, so that if the peer
-5510 /// sends a reset token it knows to route it to this connection. See RFC 9000 section
-5511 /// 10.3. Stateless Reset.
+5466 // Schedule a Ping for a liveness check.
+5467 if let Some(path_space) = space.number_spaces.get_mut(&path_id) {
+5468 path_space.ping_pending = true;
+5469
+5470 if immediate_ack_allowed {
+5471 path_space.immediate_ack_pending = true;
+5472 }
+5473 }
+5474
+5475 let Some((reset_token, retired)) =
+5476 self.remote_cids.get_mut(&path_id).and_then(CidQueue::next)
+5477 else {
+5478 continue;
+5479 };
+5480
+5481 // Retire the current remote CID and any CIDs we had to skip.
+5482 space
+5483 .pending
+5484 .retire_cids
+5485 .extend(retired.map(|seq| (path_id, seq)));
+5486
+5487 self.endpoint_events
+5488 .push_back(EndpointEventInner::ResetToken(path_id, remote, reset_token));
+5489 }
+5490 }
+5491
+5492 /// Switch to a previously unused remote connection ID, if possible
+5493 fn update_remote_cid(&mut self, path_id: PathId) {
+5494 let Some((reset_token, retired)) = self
+5495 .remote_cids
+5496 .get_mut(&path_id)
+5497 .and_then(|cids| cids.next())
+5498 else {
+5499 return;
+5500 };
+5501
+5502 // Retire the current remote CID and any CIDs we had to skip.
+5503 self.spaces[SpaceId::Data]
+5504 .pending
+5505 .retire_cids
+5506 .extend(retired.map(|seq| (path_id, seq)));
+5507 let remote = self.path_data(path_id).network_path.remote;
+5508 self.set_reset_token(path_id, remote, reset_token);
+5509 }
+5510
+5511 /// Sends this reset token to the endpoint
5512 ///
-5513 /// Reset tokens are different for each path, the endpoint identifies paths by peer
-5514 /// socket address however, not by path ID.
-5515 fn set_reset_token(&mut self, path_id: PathId, remote: SocketAddr, reset_token: ResetToken) {
-5516 self.endpoint_events
-5517 .push_back(EndpointEventInner::ResetToken(path_id, remote, reset_token));
-5518
-5519 // During the handshake the server sends a reset token in the transport
-5520 // parameters. When we are the client and we receive the reset token during the
-5521 // handshake we want this to affect our peer transport parameters.
-5522 // TODO(flub): Pretty sure this is pointless, the entire params is overwritten
-5523 // shortly after this was called. And then the params don't have this anymore.
-5524 if path_id == PathId::ZERO {
-5525 self.peer_params.stateless_reset_token = Some(reset_token);
-5526 }
-5527 }
-5528
-5529 /// Issue an initial set of connection IDs to the peer upon connection
-5530 fn issue_first_cids(&mut self, now: Instant) {
-5531 if self
-5532 .local_cid_state
-5533 .get(&PathId::ZERO)
-5534 .expect("PathId::ZERO exists when the connection is created")
-5535 .cid_len()
-5536 == 0
-5537 {
-5538 return;
-5539 }
-5540
-5541 // Subtract 1 to account for the CID we supplied while handshaking
-5542 let mut n = self.peer_params.issue_cids_limit() - 1;
-5543 if let ConnectionSide::Server { server_config } = &self.side
-5544 && server_config.has_preferred_address()
-5545 {
-5546 // We also sent a CID in the transport parameters
-5547 n -= 1;
-5548 }
-5549 self.endpoint_events
-5550 .push_back(EndpointEventInner::NeedIdentifiers(PathId::ZERO, now, n));
-5551 }
-5552
-5553 /// Issues an initial set of CIDs for paths that have not yet had any CIDs issued
-5554 ///
-5555 /// Later CIDs are issued when CIDs expire or are retired by the peer.
-5556 fn issue_first_path_cids(&mut self, now: Instant) {
-5557 if let Some(max_path_id) = self.max_path_id() {
-5558 let mut path_id = self.max_path_id_with_cids.next();
-5559 while path_id <= max_path_id {
-5560 self.endpoint_events
-5561 .push_back(EndpointEventInner::NeedIdentifiers(
-5562 path_id,
-5563 now,
-5564 self.peer_params.issue_cids_limit(),
-5565 ));
-5566 path_id = path_id.next();
-5567 }
-5568 self.max_path_id_with_cids = max_path_id;
-5569 }
-5570 }
-5571
-5572 /// Populates a packet with frames
-5573 ///
-5574 /// This tries to fit as many frames as possible into the packet.
-5575 ///
-5576 /// *path_exclusive_only* means to only build frames which can only be sent on this
-5577 /// *path. This is used in multipath for backup paths while there is still an active
-5578 /// *path.
-5579 fn populate_packet<'a, 'b>(
-5580 &mut self,
-5581 now: Instant,
-5582 space_id: SpaceId,
-5583 path_id: PathId,
-5584 path_exclusive_only: bool,
-5585 builder: &mut PacketBuilder<'a, 'b>,
-5586 ) {
-5587 let pn = builder.packet_number;
-5588 let is_multipath_negotiated = self.is_multipath_negotiated();
-5589 let space_has_keys = self.crypto_state.has_keys(space_id.encryption_level());
-5590 let is_0rtt = space_id == SpaceId::Data && !space_has_keys;
-5591 let stats = &mut self.stats.frame_tx;
-5592 let space = &mut self.spaces[space_id];
-5593 let path = &mut self.paths.get_mut(&path_id).expect("known path").data;
-5594 space
-5595 .for_path(path_id)
-5596 .pending_acks
-5597 .maybe_ack_non_eliciting();
-5598
-5599 // HANDSHAKE_DONE
-5600 if !is_0rtt
-5601 && !path_exclusive_only
-5602 && mem::replace(&mut space.pending.handshake_done, false)
-5603 {
-5604 builder.write_frame(frame::HandshakeDone, stats);
-5605 }
-5606
-5607 // REACH_OUT
-5608 if let Some((round, addresses)) = space.pending.reach_out.as_mut()
-5609 && !path_exclusive_only
-5610 {
-5611 while let Some(local_addr) = addresses.pop() {
-5612 let reach_out = frame::ReachOut::new(*round, local_addr);
-5613 if builder.frame_space_remaining() > reach_out.size() {
-5614 builder.write_frame(reach_out, stats);
-5615 } else {
-5616 addresses.push(local_addr);
-5617 break;
-5618 }
-5619 }
-5620 if addresses.is_empty() {
-5621 space.pending.reach_out = None;
-5622 }
-5623 }
-5624
-5625 // OBSERVED_ADDR
-5626 if !path_exclusive_only
-5627 && space_id == SpaceId::Data
-5628 && self
-5629 .config
-5630 .address_discovery_role
-5631 .should_report(&self.peer_params.address_discovery_role)
-5632 && (!path.observed_addr_sent || space.pending.observed_addr)
-5633 {
-5634 let frame =
-5635 frame::ObservedAddr::new(path.network_path.remote, self.next_observed_addr_seq_no);
-5636 if builder.frame_space_remaining() > frame.size() {
-5637 builder.write_frame(frame, stats);
-5638
-5639 self.next_observed_addr_seq_no = self.next_observed_addr_seq_no.saturating_add(1u8);
-5640 path.observed_addr_sent = true;
-5641
-5642 space.pending.observed_addr = false;
-5643 }
-5644 }
+5513 /// The endpoint needs to know the reset tokens issued by the peer, so that if the peer
+5514 /// sends a reset token it knows to route it to this connection. See RFC 9000 section
+5515 /// 10.3. Stateless Reset.
+5516 ///
+5517 /// Reset tokens are different for each path, the endpoint identifies paths by peer
+5518 /// socket address however, not by path ID.
+5519 fn set_reset_token(&mut self, path_id: PathId, remote: SocketAddr, reset_token: ResetToken) {
+5520 self.endpoint_events
+5521 .push_back(EndpointEventInner::ResetToken(path_id, remote, reset_token));
+5522
+5523 // During the handshake the server sends a reset token in the transport
+5524 // parameters. When we are the client and we receive the reset token during the
+5525 // handshake we want this to affect our peer transport parameters.
+5526 // TODO(flub): Pretty sure this is pointless, the entire params is overwritten
+5527 // shortly after this was called. And then the params don't have this anymore.
+5528 if path_id == PathId::ZERO {
+5529 self.peer_params.stateless_reset_token = Some(reset_token);
+5530 }
+5531 }
+5532
+5533 /// Issue an initial set of connection IDs to the peer upon connection
+5534 fn issue_first_cids(&mut self, now: Instant) {
+5535 if self
+5536 .local_cid_state
+5537 .get(&PathId::ZERO)
+5538 .expect("PathId::ZERO exists when the connection is created")
+5539 .cid_len()
+5540 == 0
+5541 {
+5542 return;
+5543 }
+5544
+5545 // Subtract 1 to account for the CID we supplied while handshaking
+5546 let mut n = self.peer_params.issue_cids_limit() - 1;
+5547 if let ConnectionSide::Server { server_config } = &self.side
+5548 && server_config.has_preferred_address()
+5549 {
+5550 // We also sent a CID in the transport parameters
+5551 n -= 1;
+5552 }
+5553 self.endpoint_events
+5554 .push_back(EndpointEventInner::NeedIdentifiers(PathId::ZERO, now, n));
+5555 }
+5556
+5557 /// Issues an initial set of CIDs for paths that have not yet had any CIDs issued
+5558 ///
+5559 /// Later CIDs are issued when CIDs expire or are retired by the peer.
+5560 fn issue_first_path_cids(&mut self, now: Instant) {
+5561 if let Some(max_path_id) = self.max_path_id() {
+5562 let mut path_id = self.max_path_id_with_cids.next();
+5563 while path_id <= max_path_id {
+5564 self.endpoint_events
+5565 .push_back(EndpointEventInner::NeedIdentifiers(
+5566 path_id,
+5567 now,
+5568 self.peer_params.issue_cids_limit(),
+5569 ));
+5570 path_id = path_id.next();
+5571 }
+5572 self.max_path_id_with_cids = max_path_id;
+5573 }
+5574 }
+5575
+5576 /// Populates a packet with frames
+5577 ///
+5578 /// This tries to fit as many frames as possible into the packet.
+5579 ///
+5580 /// *path_exclusive_only* means to only build frames which can only be sent on this
+5581 /// *path. This is used in multipath for backup paths while there is still an active
+5582 /// *path.
+5583 fn populate_packet<'a, 'b>(
+5584 &mut self,
+5585 now: Instant,
+5586 space_id: SpaceId,
+5587 path_id: PathId,
+5588 path_exclusive_only: bool,
+5589 builder: &mut PacketBuilder<'a, 'b>,
+5590 ) {
+5591 let pn = builder.packet_number;
+5592 let is_multipath_negotiated = self.is_multipath_negotiated();
+5593 let space_has_keys = self.crypto_state.has_keys(space_id.encryption_level());
+5594 let is_0rtt = space_id == SpaceId::Data && !space_has_keys;
+5595 let stats = &mut self.stats.frame_tx;
+5596 let space = &mut self.spaces[space_id];
+5597 let path = &mut self.paths.get_mut(&path_id).expect("known path").data;
+5598 space
+5599 .for_path(path_id)
+5600 .pending_acks
+5601 .maybe_ack_non_eliciting();
+5602
+5603 // HANDSHAKE_DONE
+5604 if !is_0rtt
+5605 && !path_exclusive_only
+5606 && mem::replace(&mut space.pending.handshake_done, false)
+5607 {
+5608 builder.write_frame(frame::HandshakeDone, stats);
+5609 }
+5610
+5611 // REACH_OUT
+5612 if let Some((round, addresses)) = space.pending.reach_out.as_mut()
+5613 && !path_exclusive_only
+5614 {
+5615 while let Some(local_addr) = addresses.pop() {
+5616 let reach_out = frame::ReachOut::new(*round, local_addr);
+5617 if builder.frame_space_remaining() > reach_out.size() {
+5618 builder.write_frame(reach_out, stats);
+5619 } else {
+5620 addresses.push(local_addr);
+5621 break;
+5622 }
+5623 }
+5624 if addresses.is_empty() {
+5625 space.pending.reach_out = None;
+5626 }
+5627 }
+5628
+5629 // OBSERVED_ADDR
+5630 if !path_exclusive_only
+5631 && space_id == SpaceId::Data
+5632 && self
+5633 .config
+5634 .address_discovery_role
+5635 .should_report(&self.peer_params.address_discovery_role)
+5636 && (!path.observed_addr_sent || space.pending.observed_addr)
+5637 {
+5638 let frame =
+5639 frame::ObservedAddr::new(path.network_path.remote, self.next_observed_addr_seq_no);
+5640 if builder.frame_space_remaining() > frame.size() {
+5641 builder.write_frame(frame, stats);
+5642
+5643 self.next_observed_addr_seq_no = self.next_observed_addr_seq_no.saturating_add(1u8);
+5644 path.observed_addr_sent = true;
5645
-5646 // PING
-5647 if mem::replace(&mut space.for_path(path_id).ping_pending, false) {
-5648 builder.write_frame(frame::Ping, stats);
-5649 }
-5650
-5651 // IMMEDIATE_ACK
-5652 if mem::replace(&mut space.for_path(path_id).immediate_ack_pending, false) {
-5653 debug_assert_eq!(
-5654 space_id,
-5655 SpaceId::Data,
-5656 "immediate acks must be sent in the data space"
-5657 );
-5658 builder.write_frame(frame::ImmediateAck, stats);
-5659 }
-5660
-5661 // ACK
-5662 // TODO(flub): Should this send acks for this path anyway?
-5663
-5664 if !path_exclusive_only {
-5665 for path_id in space
-5666 .number_spaces
-5667 .iter_mut()
-5668 .filter(|(_, pns)| pns.pending_acks.can_send())
-5669 .map(|(&path_id, _)| path_id)
-5670 .collect::<Vec<_>>()
-5671 {
-5672 Self::populate_acks(
-5673 now,
-5674 self.receiving_ecn,
-5675 path_id,
-5676 space_id,
-5677 space,
-5678 is_multipath_negotiated,
-5679 builder,
-5680 stats,
-5681 space_has_keys,
-5682 );
-5683 }
-5684 }
-5685
-5686 // ACK_FREQUENCY
-5687 if !path_exclusive_only && mem::replace(&mut space.pending.ack_frequency, false) {
-5688 let sequence_number = self.ack_frequency.next_sequence_number();
+5646 space.pending.observed_addr = false;
+5647 }
+5648 }
+5649
+5650 // PING
+5651 if mem::replace(&mut space.for_path(path_id).ping_pending, false) {
+5652 builder.write_frame(frame::Ping, stats);
+5653 }
+5654
+5655 // IMMEDIATE_ACK
+5656 if mem::replace(&mut space.for_path(path_id).immediate_ack_pending, false) {
+5657 debug_assert_eq!(
+5658 space_id,
+5659 SpaceId::Data,
+5660 "immediate acks must be sent in the data space"
+5661 );
+5662 builder.write_frame(frame::ImmediateAck, stats);
+5663 }
+5664
+5665 // ACK
+5666 // TODO(flub): Should this send acks for this path anyway?
+5667
+5668 if !path_exclusive_only {
+5669 for path_id in space
+5670 .number_spaces
+5671 .iter_mut()
+5672 .filter(|(_, pns)| pns.pending_acks.can_send())
+5673 .map(|(&path_id, _)| path_id)
+5674 .collect::<Vec<_>>()
+5675 {
+5676 Self::populate_acks(
+5677 now,
+5678 self.receiving_ecn,
+5679 path_id,
+5680 space_id,
+5681 space,
+5682 is_multipath_negotiated,
+5683 builder,
+5684 stats,
+5685 space_has_keys,
+5686 );
+5687 }
+5688 }
5689
-5690 // Safe to unwrap because this is always provided when ACK frequency is enabled
-5691 let config = self.config.ack_frequency_config.as_ref().unwrap();
-5692
-5693 // Ensure the delay is within bounds to avoid a PROTOCOL_VIOLATION error
-5694 let max_ack_delay = self.ack_frequency.candidate_max_ack_delay(
-5695 path.rtt.get(),
-5696 config,
-5697 &self.peer_params,
-5698 );
-5699
-5700 let frame = frame::AckFrequency {
-5701 sequence: sequence_number,
-5702 ack_eliciting_threshold: config.ack_eliciting_threshold,
-5703 request_max_ack_delay: max_ack_delay.as_micros().try_into().unwrap_or(VarInt::MAX),
-5704 reordering_threshold: config.reordering_threshold,
-5705 };
-5706 builder.write_frame(frame, stats);
-5707
-5708 self.ack_frequency
-5709 .ack_frequency_sent(path_id, pn, max_ack_delay);
-5710 }
+5690 // ACK_FREQUENCY
+5691 if !path_exclusive_only && mem::replace(&mut space.pending.ack_frequency, false) {
+5692 let sequence_number = self.ack_frequency.next_sequence_number();
+5693
+5694 // Safe to unwrap because this is always provided when ACK frequency is enabled
+5695 let config = self.config.ack_frequency_config.as_ref().unwrap();
+5696
+5697 // Ensure the delay is within bounds to avoid a PROTOCOL_VIOLATION error
+5698 let max_ack_delay = self.ack_frequency.candidate_max_ack_delay(
+5699 path.rtt.get(),
+5700 config,
+5701 &self.peer_params,
+5702 );
+5703
+5704 let frame = frame::AckFrequency {
+5705 sequence: sequence_number,
+5706 ack_eliciting_threshold: config.ack_eliciting_threshold,
+5707 request_max_ack_delay: max_ack_delay.as_micros().try_into().unwrap_or(VarInt::MAX),
+5708 reordering_threshold: config.reordering_threshold,
+5709 };
+5710 builder.write_frame(frame, stats);
5711
-5712 // PATH_CHALLENGE
-5713 if builder.frame_space_remaining() > frame::PathChallenge::SIZE_BOUND
-5714 && space_id == SpaceId::Data
-5715 && path.send_new_challenge
-5716 && !self.state.is_closed()
-5717 // we don't want to send new challenges if we are already closing
-5718 {
-5719 path.send_new_challenge = false;
-5720
-5721 // Generate a new challenge every time we send a new PATH_CHALLENGE
-5722 let token = self.rng.random();
-5723 let info = paths::SentChallengeInfo {
-5724 sent_instant: now,
-5725 network_path: path.network_path,
-5726 };
-5727 path.challenges_sent.insert(token, info);
-5728 let challenge = frame::PathChallenge(token);
-5729 trace!(frame = %challenge);
-5730 builder.write_frame(challenge, stats);
-5731 builder.require_padding();
-5732 let pto = self.ack_frequency.max_ack_delay_for_pto() + path.rtt.pto_base();
-5733 self.timers.set(
-5734 Timer::PerPath(path_id, PathTimer::PathChallengeLost),
-5735 now + pto,
-5736 self.qlog.with_time(now),
-5737 );
-5738
-5739 if is_multipath_negotiated && !path.validated && path.send_new_challenge {
-5740 // queue informing the path status along with the challenge
-5741 space.pending.path_status.insert(path_id);
-5742 }
-5743
-5744 // Always include an OBSERVED_ADDR frame with a PATH_CHALLENGE, regardless
-5745 // of whether one has already been sent on this path.
-5746 if space_id == SpaceId::Data
-5747 && self
-5748 .config
-5749 .address_discovery_role
-5750 .should_report(&self.peer_params.address_discovery_role)
-5751 {
-5752 let frame = frame::ObservedAddr::new(
-5753 path.network_path.remote,
-5754 self.next_observed_addr_seq_no,
-5755 );
-5756 if builder.frame_space_remaining() > frame.size() {
-5757 builder.write_frame(frame, stats);
-5758
-5759 self.next_observed_addr_seq_no =
-5760 self.next_observed_addr_seq_no.saturating_add(1u8);
-5761 path.observed_addr_sent = true;
+5712 self.ack_frequency
+5713 .ack_frequency_sent(path_id, pn, max_ack_delay);
+5714 }
+5715
+5716 // PATH_CHALLENGE
+5717 if builder.frame_space_remaining() > frame::PathChallenge::SIZE_BOUND
+5718 && space_id == SpaceId::Data
+5719 && path.send_new_challenge
+5720 && !self.state.is_closed()
+5721 // we don't want to send new challenges if we are already closing
+5722 {
+5723 path.send_new_challenge = false;
+5724
+5725 // Generate a new challenge every time we send a new PATH_CHALLENGE
+5726 let token = self.rng.random();
+5727 let info = paths::SentChallengeInfo {
+5728 sent_instant: now,
+5729 network_path: path.network_path,
+5730 };
+5731 path.challenges_sent.insert(token, info);
+5732 let challenge = frame::PathChallenge(token);
+5733 trace!(frame = %challenge);
+5734 builder.write_frame(challenge, stats);
+5735 builder.require_padding();
+5736 let pto = self.ack_frequency.max_ack_delay_for_pto() + path.rtt.pto_base();
+5737 self.timers.set(
+5738 Timer::PerPath(path_id, PathTimer::PathChallengeLost),
+5739 now + pto,
+5740 self.qlog.with_time(now),
+5741 );
+5742
+5743 if is_multipath_negotiated && !path.validated && path.send_new_challenge {
+5744 // queue informing the path status along with the challenge
+5745 space.pending.path_status.insert(path_id);
+5746 }
+5747
+5748 // Always include an OBSERVED_ADDR frame with a PATH_CHALLENGE, regardless
+5749 // of whether one has already been sent on this path.
+5750 if space_id == SpaceId::Data
+5751 && self
+5752 .config
+5753 .address_discovery_role
+5754 .should_report(&self.peer_params.address_discovery_role)
+5755 {
+5756 let frame = frame::ObservedAddr::new(
+5757 path.network_path.remote,
+5758 self.next_observed_addr_seq_no,
+5759 );
+5760 if builder.frame_space_remaining() > frame.size() {
+5761 builder.write_frame(frame, stats);
5762
-5763 space.pending.observed_addr = false;
-5764 }
-5765 }
-5766 }
-5767
-5768 // PATH_RESPONSE
-5769 if builder.frame_space_remaining() > frame::PathResponse::SIZE_BOUND
-5770 && space_id == SpaceId::Data
-5771 && let Some(token) = path.path_responses.pop_on_path(path.network_path)
-5772 {
-5773 let response = frame::PathResponse(token);
-5774 trace!(frame = %response);
-5775 builder.write_frame(response, stats);
-5776 builder.require_padding();
-5777
-5778 // NOTE: this is technically not required but might be useful to ride the
-5779 // request/response nature of path challenges to refresh an observation
-5780 // Since PATH_RESPONSE is a probing frame, this is allowed by the spec.
-5781 if space_id == SpaceId::Data
-5782 && self
-5783 .config
-5784 .address_discovery_role
-5785 .should_report(&self.peer_params.address_discovery_role)
-5786 {
-5787 let frame = frame::ObservedAddr::new(
-5788 path.network_path.remote,
-5789 self.next_observed_addr_seq_no,
-5790 );
-5791 if builder.frame_space_remaining() > frame.size() {
-5792 builder.write_frame(frame, stats);
-5793
-5794 self.next_observed_addr_seq_no =
-5795 self.next_observed_addr_seq_no.saturating_add(1u8);
-5796 path.observed_addr_sent = true;
+5763 self.next_observed_addr_seq_no =
+5764 self.next_observed_addr_seq_no.saturating_add(1u8);
+5765 path.observed_addr_sent = true;
+5766
+5767 space.pending.observed_addr = false;
+5768 }
+5769 }
+5770 }
+5771
+5772 // PATH_RESPONSE
+5773 if builder.frame_space_remaining() > frame::PathResponse::SIZE_BOUND
+5774 && space_id == SpaceId::Data
+5775 && let Some(token) = path.path_responses.pop_on_path(path.network_path)
+5776 {
+5777 let response = frame::PathResponse(token);
+5778 trace!(frame = %response);
+5779 builder.write_frame(response, stats);
+5780 builder.require_padding();
+5781
+5782 // NOTE: this is technically not required but might be useful to ride the
+5783 // request/response nature of path challenges to refresh an observation
+5784 // Since PATH_RESPONSE is a probing frame, this is allowed by the spec.
+5785 if space_id == SpaceId::Data
+5786 && self
+5787 .config
+5788 .address_discovery_role
+5789 .should_report(&self.peer_params.address_discovery_role)
+5790 {
+5791 let frame = frame::ObservedAddr::new(
+5792 path.network_path.remote,
+5793 self.next_observed_addr_seq_no,
+5794 );
+5795 if builder.frame_space_remaining() > frame.size() {
+5796 builder.write_frame(frame, stats);
5797
-5798 space.pending.observed_addr = false;
-5799 }
-5800 }
-5801 }
-5802
-5803 // CRYPTO
-5804 while !path_exclusive_only
-5805 && builder.frame_space_remaining() > frame::Crypto::SIZE_BOUND
-5806 && !is_0rtt
-5807 {
-5808 let mut frame = match space.pending.crypto.pop_front() {
-5809 Some(x) => x,
-5810 None => break,
-5811 };
-5812
-5813 // Calculate the maximum amount of crypto data we can store in the buffer.
-5814 // Since the offset is known, we can reserve the exact size required to encode it.
-5815 // For length we reserve 2bytes which allows to encode up to 2^14,
-5816 // which is more than what fits into normally sized QUIC frames.
-5817 let max_crypto_data_size = builder.frame_space_remaining()
-5818 - 1 // Frame Type
-5819 - VarInt::size(unsafe { VarInt::from_u64_unchecked(frame.offset) })
-5820 - 2; // Maximum encoded length for frame size, given we send less than 2^14 bytes
-5821
-5822 let len = frame
-5823 .data
-5824 .len()
-5825 .min(2usize.pow(14) - 1)
-5826 .min(max_crypto_data_size);
-5827
-5828 let data = frame.data.split_to(len);
-5829 let offset = frame.offset;
-5830 let truncated = frame::Crypto { offset, data };
-5831 builder.write_frame(truncated, stats);
-5832
-5833 if !frame.data.is_empty() {
-5834 frame.offset += len as u64;
-5835 space.pending.crypto.push_front(frame);
-5836 }
-5837 }
-5838
-5839 // TODO(flub): maybe this is much higher priority?
-5840 // PATH_ABANDON
-5841 while !path_exclusive_only
-5842 && space_id == SpaceId::Data
-5843 && frame::PathAbandon::SIZE_BOUND <= builder.frame_space_remaining()
-5844 {
-5845 let Some((abandoned_path_id, error_code)) = space.pending.path_abandon.pop_first()
-5846 else {
-5847 break;
-5848 };
-5849 let frame = frame::PathAbandon {
-5850 path_id: abandoned_path_id,
-5851 error_code,
+5798 self.next_observed_addr_seq_no =
+5799 self.next_observed_addr_seq_no.saturating_add(1u8);
+5800 path.observed_addr_sent = true;
+5801
+5802 space.pending.observed_addr = false;
+5803 }
+5804 }
+5805 }
+5806
+5807 // CRYPTO
+5808 while !path_exclusive_only
+5809 && builder.frame_space_remaining() > frame::Crypto::SIZE_BOUND
+5810 && !is_0rtt
+5811 {
+5812 let mut frame = match space.pending.crypto.pop_front() {
+5813 Some(x) => x,
+5814 None => break,
+5815 };
+5816
+5817 // Calculate the maximum amount of crypto data we can store in the buffer.
+5818 // Since the offset is known, we can reserve the exact size required to encode it.
+5819 // For length we reserve 2bytes which allows to encode up to 2^14,
+5820 // which is more than what fits into normally sized QUIC frames.
+5821 let max_crypto_data_size = builder.frame_space_remaining()
+5822 - 1 // Frame Type
+5823 - VarInt::size(unsafe { VarInt::from_u64_unchecked(frame.offset) })
+5824 - 2; // Maximum encoded length for frame size, given we send less than 2^14 bytes
+5825
+5826 let len = frame
+5827 .data
+5828 .len()
+5829 .min(2usize.pow(14) - 1)
+5830 .min(max_crypto_data_size);
+5831
+5832 let data = frame.data.split_to(len);
+5833 let offset = frame.offset;
+5834 let truncated = frame::Crypto { offset, data };
+5835 builder.write_frame(truncated, stats);
+5836
+5837 if !frame.data.is_empty() {
+5838 frame.offset += len as u64;
+5839 space.pending.crypto.push_front(frame);
+5840 }
+5841 }
+5842
+5843 // TODO(flub): maybe this is much higher priority?
+5844 // PATH_ABANDON
+5845 while !path_exclusive_only
+5846 && space_id == SpaceId::Data
+5847 && frame::PathAbandon::SIZE_BOUND <= builder.frame_space_remaining()
+5848 {
+5849 let Some((abandoned_path_id, error_code)) = space.pending.path_abandon.pop_first()
+5850 else {
+5851 break;
5852 };
-5853 builder.write_frame(frame, stats);
-5854
-5855 let ack_delay = self.ack_frequency.max_ack_delay_for_pto();
-5856 // We can't access path here anymore due to borrowing issues.
-5857 let send_pto = self.paths.get(&path_id).unwrap().data.rtt.pto_base() + ack_delay;
-5858 if let Some(abandoned_path) = self.paths.get_mut(&abandoned_path_id) {
-5859 // We only want to set the deadline on the *first* PATH_ABANDON we send.
-5860 // Retransmits shouldn't run this code again
-5861 if matches!(
-5862 abandoned_path.data.abandon_state,
-5863 AbandonState::NotAbandoned
-5864 ) {
-5865 // The peer MUST respond with a corresponding PATH_ABANDON frame.
-5866 // The other peer has 3 * PTO to do that.
-5867 // This uses the PTO of the path we send on!
-5868 // If the PATH_ABANDON comes in within the deadline we're giving here, then this
-5869 // state will be set to `AbandonState::ReceivedPathAbandon`, essentially clearing
-5870 // the deadline. If we receive a frame after the deadline, we error out with a
-5871 // protocol violation.
-5872 // Receiving other frames before the deadline is fine, as those might be packets
-5873 // that were still in-flight.
-5874 abandoned_path.data.abandon_state = AbandonState::ExpectingPathAbandon {
-5875 deadline: now + 3 * send_pto,
-5876 };
-5877
-5878 // At some point, we need to forget about the path.
-5879 // If we do so too early, then we'll have discarded the CIDs of that path and won't
-5880 // handle incoming packets on that path correctly.
-5881 // To give this path enough time, we assume that the peer will have received our
-5882 // PATH_ABANDON within 3 * PTO of the path we sent the abandon on,
-5883 // and then we give the path 3 * PTO time to make it very unlikely that there will
-5884 // still be packets incoming on the path at that point.
-5885 // This timer will actually get reset to a value that's likely to be even earlier
-5886 // once we actually receive the PATH_ABANDON frame itself.
-5887 let abandoned_pto =
-5888 self.paths.get(&path_id).unwrap().data.rtt.pto_base() + ack_delay;
-5889 self.timers.set(
-5890 Timer::PerPath(abandoned_path_id, PathTimer::DiscardPath),
-5891 now + 3 * send_pto + 3 * abandoned_pto,
-5892 self.qlog.with_time(now),
-5893 );
-5894 }
-5895 } else {
-5896 warn!("sent PATH_ABANDON after path was already discarded");
-5897 }
-5898 }
-5899
-5900 // PATH_STATUS_AVAILABLE & PATH_STATUS_BACKUP
-5901 while !path_exclusive_only
-5902 && space_id == SpaceId::Data
-5903 && frame::PathStatusAvailable::SIZE_BOUND <= builder.frame_space_remaining()
-5904 {
-5905 let Some(path_id) = space.pending.path_status.pop_first() else {
-5906 break;
-5907 };
-5908 let Some(path) = self.paths.get(&path_id).map(|path_state| &path_state.data) else {
-5909 trace!(%path_id, "discarding queued path status for unknown path");
-5910 continue;
+5853 let frame = frame::PathAbandon {
+5854 path_id: abandoned_path_id,
+5855 error_code,
+5856 };
+5857 builder.write_frame(frame, stats);
+5858
+5859 let ack_delay = self.ack_frequency.max_ack_delay_for_pto();
+5860 // We can't access path here anymore due to borrowing issues.
+5861 let send_pto = self.paths.get(&path_id).unwrap().data.rtt.pto_base() + ack_delay;
+5862 if let Some(abandoned_path) = self.paths.get_mut(&abandoned_path_id) {
+5863 // We only want to set the deadline on the *first* PATH_ABANDON we send.
+5864 // Retransmits shouldn't run this code again
+5865 if matches!(
+5866 abandoned_path.data.abandon_state,
+5867 AbandonState::NotAbandoned
+5868 ) {
+5869 // The peer MUST respond with a corresponding PATH_ABANDON frame.
+5870 // The other peer has 3 * PTO to do that.
+5871 // This uses the PTO of the path we send on!
+5872 // If the PATH_ABANDON comes in within the deadline we're giving here, then this
+5873 // state will be set to `AbandonState::ReceivedPathAbandon`, essentially clearing
+5874 // the deadline. If we receive a frame after the deadline, we error out with a
+5875 // protocol violation.
+5876 // Receiving other frames before the deadline is fine, as those might be packets
+5877 // that were still in-flight.
+5878 abandoned_path.data.abandon_state = AbandonState::ExpectingPathAbandon {
+5879 deadline: now + 3 * send_pto,
+5880 };
+5881
+5882 // At some point, we need to forget about the path.
+5883 // If we do so too early, then we'll have discarded the CIDs of that path and won't
+5884 // handle incoming packets on that path correctly.
+5885 // To give this path enough time, we assume that the peer will have received our
+5886 // PATH_ABANDON within 3 * PTO of the path we sent the abandon on,
+5887 // and then we give the path 3 * PTO time to make it very unlikely that there will
+5888 // still be packets incoming on the path at that point.
+5889 // This timer will actually get reset to a value that's likely to be even earlier
+5890 // once we actually receive the PATH_ABANDON frame itself.
+5891 let abandoned_pto =
+5892 self.paths.get(&path_id).unwrap().data.rtt.pto_base() + ack_delay;
+5893 self.timers.set(
+5894 Timer::PerPath(abandoned_path_id, PathTimer::DiscardPath),
+5895 now + 3 * send_pto + 3 * abandoned_pto,
+5896 self.qlog.with_time(now),
+5897 );
+5898 }
+5899 } else {
+5900 warn!("sent PATH_ABANDON after path was already discarded");
+5901 }
+5902 }
+5903
+5904 // PATH_STATUS_AVAILABLE & PATH_STATUS_BACKUP
+5905 while !path_exclusive_only
+5906 && space_id == SpaceId::Data
+5907 && frame::PathStatusAvailable::SIZE_BOUND <= builder.frame_space_remaining()
+5908 {
+5909 let Some(path_id) = space.pending.path_status.pop_first() else {
+5910 break;
5911 };
-5912
-5913 let seq = path.status.seq();
-5914 match path.local_status() {
-5915 PathStatus::Available => {
-5916 let frame = frame::PathStatusAvailable {
-5917 path_id,
-5918 status_seq_no: seq,
-5919 };
-5920 builder.write_frame(frame, stats);
-5921 }
-5922 PathStatus::Backup => {
-5923 let frame = frame::PathStatusBackup {
-5924 path_id,
-5925 status_seq_no: seq,
-5926 };
-5927 builder.write_frame(frame, stats);
-5928 }
-5929 }
-5930 }
-5931
-5932 // MAX_PATH_ID
-5933 if space_id == SpaceId::Data
-5934 && !path_exclusive_only
-5935 && space.pending.max_path_id
-5936 && frame::MaxPathId::SIZE_BOUND <= builder.frame_space_remaining()
-5937 {
-5938 let frame = frame::MaxPathId(self.local_max_path_id);
-5939 builder.write_frame(frame, stats);
-5940 space.pending.max_path_id = false;
-5941 }
-5942
-5943 // PATHS_BLOCKED
-5944 if space_id == SpaceId::Data
-5945 && !path_exclusive_only
-5946 && space.pending.paths_blocked
-5947 && frame::PathsBlocked::SIZE_BOUND <= builder.frame_space_remaining()
-5948 {
-5949 let frame = frame::PathsBlocked(self.remote_max_path_id);
-5950 builder.write_frame(frame, stats);
-5951 space.pending.paths_blocked = false;
-5952 }
-5953
-5954 // PATH_CIDS_BLOCKED
-5955 while space_id == SpaceId::Data
-5956 && !path_exclusive_only
-5957 && frame::PathCidsBlocked::SIZE_BOUND <= builder.frame_space_remaining()
-5958 {
-5959 let Some(path_id) = space.pending.path_cids_blocked.pop_first() else {
-5960 break;
-5961 };
-5962 let next_seq = match self.remote_cids.get(&path_id) {
-5963 Some(cid_queue) => VarInt(cid_queue.active_seq() + 1),
-5964 None => VarInt(0),
+5912 let Some(path) = self.paths.get(&path_id).map(|path_state| &path_state.data) else {
+5913 trace!(%path_id, "discarding queued path status for unknown path");
+5914 continue;
+5915 };
+5916
+5917 let seq = path.status.seq();
+5918 match path.local_status() {
+5919 PathStatus::Available => {
+5920 let frame = frame::PathStatusAvailable {
+5921 path_id,
+5922 status_seq_no: seq,
+5923 };
+5924 builder.write_frame(frame, stats);
+5925 }
+5926 PathStatus::Backup => {
+5927 let frame = frame::PathStatusBackup {
+5928 path_id,
+5929 status_seq_no: seq,
+5930 };
+5931 builder.write_frame(frame, stats);
+5932 }
+5933 }
+5934 }
+5935
+5936 // MAX_PATH_ID
+5937 if space_id == SpaceId::Data
+5938 && !path_exclusive_only
+5939 && space.pending.max_path_id
+5940 && frame::MaxPathId::SIZE_BOUND <= builder.frame_space_remaining()
+5941 {
+5942 let frame = frame::MaxPathId(self.local_max_path_id);
+5943 builder.write_frame(frame, stats);
+5944 space.pending.max_path_id = false;
+5945 }
+5946
+5947 // PATHS_BLOCKED
+5948 if space_id == SpaceId::Data
+5949 && !path_exclusive_only
+5950 && space.pending.paths_blocked
+5951 && frame::PathsBlocked::SIZE_BOUND <= builder.frame_space_remaining()
+5952 {
+5953 let frame = frame::PathsBlocked(self.remote_max_path_id);
+5954 builder.write_frame(frame, stats);
+5955 space.pending.paths_blocked = false;
+5956 }
+5957
+5958 // PATH_CIDS_BLOCKED
+5959 while space_id == SpaceId::Data
+5960 && !path_exclusive_only
+5961 && frame::PathCidsBlocked::SIZE_BOUND <= builder.frame_space_remaining()
+5962 {
+5963 let Some(path_id) = space.pending.path_cids_blocked.pop_first() else {
+5964 break;
5965 };
-5966 let frame = frame::PathCidsBlocked { path_id, next_seq };
-5967 builder.write_frame(frame, stats);
-5968 }
-5969
-5970 // RESET_STREAM, STOP_SENDING, MAX_DATA, MAX_STREAM_DATA, MAX_STREAMS
-5971 if space_id == SpaceId::Data && !path_exclusive_only {
-5972 self.streams
-5973 .write_control_frames(builder, &mut space.pending, stats);
-5974 }
-5975
-5976 // NEW_CONNECTION_ID
-5977 let cid_len = self
-5978 .local_cid_state
-5979 .values()
-5980 .map(|cid_state| cid_state.cid_len())
-5981 .max()
-5982 .expect("some local CID state must exist");
-5983 let new_cid_size_bound =
-5984 frame::NewConnectionId::size_bound(is_multipath_negotiated, cid_len);
-5985 while !path_exclusive_only && builder.frame_space_remaining() > new_cid_size_bound {
-5986 let issued = match space.pending.new_cids.pop() {
-5987 Some(x) => x,
-5988 None => break,
-5989 };
-5990 let retire_prior_to = self
-5991 .local_cid_state
-5992 .get(&issued.path_id)
-5993 .map(|cid_state| cid_state.retire_prior_to())
-5994 .unwrap_or_else(|| panic!("missing local CID state for path={}", issued.path_id));
-5995
-5996 let cid_path_id = match is_multipath_negotiated {
-5997 true => Some(issued.path_id),
-5998 false => {
-5999 debug_assert_eq!(issued.path_id, PathId::ZERO);
-6000 None
-6001 }
-6002 };
-6003 let frame = frame::NewConnectionId {
-6004 path_id: cid_path_id,
-6005 sequence: issued.sequence,
-6006 retire_prior_to,
-6007 id: issued.id,
-6008 reset_token: issued.reset_token,
-6009 };
-6010 builder.write_frame(frame, stats);
-6011 }
-6012
-6013 // RETIRE_CONNECTION_ID
-6014 let retire_cid_bound = frame::RetireConnectionId::size_bound(is_multipath_negotiated);
-6015 while !path_exclusive_only && builder.frame_space_remaining() > retire_cid_bound {
-6016 let (path_id, sequence) = match space.pending.retire_cids.pop() {
-6017 Some((PathId::ZERO, seq)) if !is_multipath_negotiated => (None, seq),
-6018 Some((path_id, seq)) => (Some(path_id), seq),
-6019 None => break,
-6020 };
-6021 let frame = frame::RetireConnectionId { path_id, sequence };
-6022 builder.write_frame(frame, stats);
-6023 }
-6024
-6025 // DATAGRAM
-6026 let mut sent_datagrams = false;
-6027 while !path_exclusive_only
-6028 && builder.frame_space_remaining() > Datagram::SIZE_BOUND
-6029 && space_id == SpaceId::Data
-6030 {
-6031 match self.datagrams.write(builder, stats) {
-6032 true => {
-6033 sent_datagrams = true;
-6034 }
-6035 false => break,
-6036 }
-6037 }
-6038 if self.datagrams.send_blocked && sent_datagrams {
-6039 self.events.push_back(Event::DatagramsUnblocked);
-6040 self.datagrams.send_blocked = false;
+5966 let next_seq = match self.remote_cids.get(&path_id) {
+5967 Some(cid_queue) => VarInt(cid_queue.active_seq() + 1),
+5968 None => VarInt(0),
+5969 };
+5970 let frame = frame::PathCidsBlocked { path_id, next_seq };
+5971 builder.write_frame(frame, stats);
+5972 }
+5973
+5974 // RESET_STREAM, STOP_SENDING, MAX_DATA, MAX_STREAM_DATA, MAX_STREAMS
+5975 if space_id == SpaceId::Data && !path_exclusive_only {
+5976 self.streams
+5977 .write_control_frames(builder, &mut space.pending, stats);
+5978 }
+5979
+5980 // NEW_CONNECTION_ID
+5981 let cid_len = self
+5982 .local_cid_state
+5983 .values()
+5984 .map(|cid_state| cid_state.cid_len())
+5985 .max()
+5986 .expect("some local CID state must exist");
+5987 let new_cid_size_bound =
+5988 frame::NewConnectionId::size_bound(is_multipath_negotiated, cid_len);
+5989 while !path_exclusive_only && builder.frame_space_remaining() > new_cid_size_bound {
+5990 let issued = match space.pending.new_cids.pop() {
+5991 Some(x) => x,
+5992 None => break,
+5993 };
+5994 let retire_prior_to = self
+5995 .local_cid_state
+5996 .get(&issued.path_id)
+5997 .map(|cid_state| cid_state.retire_prior_to())
+5998 .unwrap_or_else(|| panic!("missing local CID state for path={}", issued.path_id));
+5999
+6000 let cid_path_id = match is_multipath_negotiated {
+6001 true => Some(issued.path_id),
+6002 false => {
+6003 debug_assert_eq!(issued.path_id, PathId::ZERO);
+6004 None
+6005 }
+6006 };
+6007 let frame = frame::NewConnectionId {
+6008 path_id: cid_path_id,
+6009 sequence: issued.sequence,
+6010 retire_prior_to,
+6011 id: issued.id,
+6012 reset_token: issued.reset_token,
+6013 };
+6014 builder.write_frame(frame, stats);
+6015 }
+6016
+6017 // RETIRE_CONNECTION_ID
+6018 let retire_cid_bound = frame::RetireConnectionId::size_bound(is_multipath_negotiated);
+6019 while !path_exclusive_only && builder.frame_space_remaining() > retire_cid_bound {
+6020 let (path_id, sequence) = match space.pending.retire_cids.pop() {
+6021 Some((PathId::ZERO, seq)) if !is_multipath_negotiated => (None, seq),
+6022 Some((path_id, seq)) => (Some(path_id), seq),
+6023 None => break,
+6024 };
+6025 let frame = frame::RetireConnectionId { path_id, sequence };
+6026 builder.write_frame(frame, stats);
+6027 }
+6028
+6029 // DATAGRAM
+6030 let mut sent_datagrams = false;
+6031 while !path_exclusive_only
+6032 && builder.frame_space_remaining() > Datagram::SIZE_BOUND
+6033 && space_id == SpaceId::Data
+6034 {
+6035 match self.datagrams.write(builder, stats) {
+6036 true => {
+6037 sent_datagrams = true;
+6038 }
+6039 false => break,
+6040 }
6041 }
-6042
-6043 let path = &mut self.paths.get_mut(&path_id).expect("known path").data;
-6044
-6045 // NEW_TOKEN
-6046 if !path_exclusive_only {
-6047 while let Some(network_path) = space.pending.new_tokens.pop() {
-6048 debug_assert_eq!(space_id, SpaceId::Data);
-6049 let ConnectionSide::Server { server_config } = &self.side else {
-6050 panic!("NEW_TOKEN frames should not be enqueued by clients");
-6051 };
-6052
-6053 if !network_path.is_probably_same_path(&path.network_path) {
-6054 // NEW_TOKEN frames contain tokens bound to a client's IP address, and are only
-6055 // useful if used from the same IP address. Thus, we abandon enqueued NEW_TOKEN
-6056 // frames upon an path change. Instead, when the new path becomes validated,
-6057 // NEW_TOKEN frames may be enqueued for the new path instead.
-6058 continue;
-6059 }
-6060
-6061 let token = Token::new(
-6062 TokenPayload::Validation {
-6063 ip: network_path.remote.ip(),
-6064 issued: server_config.time_source.now(),
-6065 },
-6066 &mut self.rng,
-6067 );
-6068 let new_token = NewToken {
-6069 token: token.encode(&*server_config.token_key).into(),
-6070 };
-6071
-6072 if builder.frame_space_remaining() < new_token.size() {
-6073 space.pending.new_tokens.push(network_path);
-6074 break;
-6075 }
-6076
-6077 builder.write_frame(new_token, stats);
-6078 builder.retransmits_mut().new_tokens.push(network_path);
-6079 }
-6080 }
-6081
-6082 // STREAM
-6083 if !path_exclusive_only && space_id == SpaceId::Data {
-6084 self.streams
-6085 .write_stream_frames(builder, self.config.send_fairness, stats);
-6086 }
-6087
-6088 // ADD_ADDRESS
-6089 while space_id == SpaceId::Data
-6090 && !path_exclusive_only
-6091 && frame::AddAddress::SIZE_BOUND <= builder.frame_space_remaining()
-6092 {
-6093 if let Some(added_address) = space.pending.add_address.pop_last() {
-6094 builder.write_frame(added_address, stats);
-6095 } else {
-6096 break;
-6097 }
-6098 }
-6099
-6100 // REMOVE_ADDRESS
-6101 while space_id == SpaceId::Data
-6102 && !path_exclusive_only
-6103 && frame::RemoveAddress::SIZE_BOUND <= builder.frame_space_remaining()
-6104 {
-6105 if let Some(removed_address) = space.pending.remove_address.pop_last() {
-6106 builder.write_frame(removed_address, stats);
-6107 } else {
-6108 break;
-6109 }
-6110 }
-6111 }
-6112
-6113 /// Write pending ACKs into a buffer
-6114 fn populate_acks<'a, 'b>(
-6115 now: Instant,
-6116 receiving_ecn: bool,
-6117 path_id: PathId,
-6118 space_id: SpaceId,
-6119 space: &mut PacketSpace,
-6120 is_multipath_negotiated: bool,
-6121 builder: &mut PacketBuilder<'a, 'b>,
-6122 stats: &mut FrameStats,
-6123 space_has_keys: bool,
-6124 ) {
-6125 // 0-RTT packets must never carry acks (which would have to be of handshake packets)
-6126 debug_assert!(space_has_keys, "tried to send ACK in 0-RTT");
-6127
-6128 debug_assert!(
-6129 is_multipath_negotiated || path_id == PathId::ZERO,
-6130 "Only PathId::ZERO allowed without multipath (have {path_id:?})"
-6131 );
-6132 if is_multipath_negotiated {
-6133 debug_assert!(
-6134 space_id == SpaceId::Data || path_id == PathId::ZERO,
-6135 "path acks must be sent in 1RTT space (have {space_id:?})"
-6136 );
-6137 }
-6138
-6139 let pns = space.for_path(path_id);
-6140 let ranges = pns.pending_acks.ranges();
-6141 debug_assert!(!ranges.is_empty(), "can not send empty ACK range");
-6142 let ecn = if receiving_ecn {
-6143 Some(&pns.ecn_counters)
-6144 } else {
-6145 None
-6146 };
-6147
-6148 let delay_micros = pns.pending_acks.ack_delay(now).as_micros() as u64;
-6149 // TODO: This should come from `TransportConfig` if that gets configurable.
-6150 let ack_delay_exp = TransportParameters::default().ack_delay_exponent;
-6151 let delay = delay_micros >> ack_delay_exp.into_inner();
-6152
-6153 if is_multipath_negotiated && space_id == SpaceId::Data {
-6154 if !ranges.is_empty() {
-6155 let frame = frame::PathAck::encoder(path_id, delay, ranges, ecn);
-6156 builder.write_frame(frame, stats);
-6157 }
-6158 } else {
-6159 builder.write_frame(frame::Ack::encoder(delay, ranges, ecn), stats);
-6160 }
-6161 }
-6162
-6163 fn close_common(&mut self) {
-6164 trace!("connection closed");
-6165 self.timers.reset();
-6166 }
-6167
-6168 fn set_close_timer(&mut self, now: Instant) {
-6169 // QUIC-MULTIPATH § 2.6 Connection Closure: draining for 3*PTO using the max PTO of
-6170 // all paths.
-6171 let pto_max = self.max_pto_all_paths(self.highest_space);
-6172 self.timers.set(
-6173 Timer::Conn(ConnTimer::Close),
-6174 now + 3 * pto_max,
-6175 self.qlog.with_time(now),
-6176 );
-6177 }
-6178
-6179 /// Handle transport parameters received from the peer
-6180 ///
-6181 /// *remote_cid* and *local_cid* are the source and destination CIDs respectively of the
-6182 /// *packet into which the transport parameters arrived.
-6183 fn handle_peer_params(
-6184 &mut self,
-6185 params: TransportParameters,
-6186 local_cid: ConnectionId,
-6187 remote_cid: ConnectionId,
-6188 now: Instant,
-6189 ) -> Result<(), TransportError> {
-6190 if Some(self.original_remote_cid) != params.initial_src_cid
-6191 || (self.side.is_client()
-6192 && (Some(self.initial_dst_cid) != params.original_dst_cid
-6193 || self.retry_src_cid != params.retry_src_cid))
-6194 {
-6195 return Err(TransportError::TRANSPORT_PARAMETER_ERROR(
-6196 "CID authentication failure",
-6197 ));
-6198 }
-6199 if params.initial_max_path_id.is_some() && (local_cid.is_empty() || remote_cid.is_empty()) {
-6200 return Err(TransportError::PROTOCOL_VIOLATION(
-6201 "multipath must not use zero-length CIDs",
-6202 ));
-6203 }
-6204
-6205 self.set_peer_params(params);
-6206 self.qlog.emit_peer_transport_params_received(self, now);
-6207
-6208 Ok(())
-6209 }
-6210
-6211 fn set_peer_params(&mut self, params: TransportParameters) {
-6212 self.streams.set_params(¶ms);
-6213 self.idle_timeout =
-6214 negotiate_max_idle_timeout(self.config.max_idle_timeout, Some(params.max_idle_timeout));
-6215 trace!("negotiated max idle timeout {:?}", self.idle_timeout);
-6216
-6217 if let Some(ref info) = params.preferred_address {
-6218 // During the handshake PathId::ZERO exists.
-6219 self.remote_cids.get_mut(&PathId::ZERO).expect("not yet abandoned").insert(frame::NewConnectionId {
-6220 path_id: None,
-6221 sequence: 1,
-6222 id: info.connection_id,
-6223 reset_token: info.stateless_reset_token,
-6224 retire_prior_to: 0,
-6225 })
-6226 .expect(
-6227 "preferred address CID is the first received, and hence is guaranteed to be legal",
-6228 );
-6229 let remote = self.path_data(PathId::ZERO).network_path.remote;
-6230 self.set_reset_token(PathId::ZERO, remote, info.stateless_reset_token);
-6231 }
-6232 self.ack_frequency.peer_max_ack_delay = get_max_ack_delay(¶ms);
-6233
-6234 let mut multipath_enabled = None;
-6235 if let (Some(local_max_path_id), Some(remote_max_path_id)) = (
-6236 self.config.get_initial_max_path_id(),
-6237 params.initial_max_path_id,
-6238 ) {
-6239 // multipath is enabled, register the local and remote maximums
-6240 self.local_max_path_id = local_max_path_id;
-6241 self.remote_max_path_id = remote_max_path_id;
-6242 let initial_max_path_id = local_max_path_id.min(remote_max_path_id);
-6243 debug!(%initial_max_path_id, "multipath negotiated");
-6244 multipath_enabled = Some(initial_max_path_id);
-6245 }
-6246
-6247 if let Some((max_locally_allowed_remote_addresses, max_remotely_allowed_remote_addresses)) =
-6248 self.config
-6249 .max_remote_nat_traversal_addresses
-6250 .zip(params.max_remote_nat_traversal_addresses)
-6251 {
-6252 if let Some(max_initial_paths) =
-6253 multipath_enabled.map(|path_id| path_id.saturating_add(1u8))
-6254 {
-6255 let max_local_addresses = max_remotely_allowed_remote_addresses.get();
-6256 let max_remote_addresses = max_locally_allowed_remote_addresses.get();
-6257 self.iroh_hp =
-6258 iroh_hp::State::new(max_remote_addresses, max_local_addresses, self.side());
-6259 debug!(
-6260 %max_remote_addresses, %max_local_addresses,
-6261 "iroh hole punching negotiated"
-6262 );
-6263
-6264 match self.side() {
-6265 Side::Client => {
-6266 if max_initial_paths.as_u32() < max_remote_addresses as u32 + 1 {
-6267 // in this case the client might try to open `max_remote_addresses` new
-6268 // paths, but the current multipath configuration will not allow it
-6269 warn!(%max_initial_paths, %max_remote_addresses, "local client configuration might cause nat traversal issues")
-6270 } else if max_local_addresses as u64
-6271 > params.active_connection_id_limit.into_inner()
-6272 {
-6273 // the server allows us to send at most `params.active_connection_id_limit`
-6274 // but they might need at least `max_local_addresses` to effectively send
-6275 // `PATH_CHALLENGE` frames to each advertised local address
-6276 warn!(%max_local_addresses, remote_cid_limit=%params.active_connection_id_limit.into_inner(), "remote server configuration might cause nat traversal issues")
-6277 }
-6278 }
-6279 Side::Server => {
-6280 if (max_initial_paths.as_u32() as u64) < crate::LOCAL_CID_COUNT {
-6281 warn!(%max_initial_paths, local_cid_limit=%crate::LOCAL_CID_COUNT, "local server configuration might cause nat traversal issues")
-6282 }
-6283 }
-6284 }
-6285 } else {
-6286 debug!("iroh nat traversal enabled for both endpoints, but multipath is missing")
-6287 }
-6288 }
-6289
-6290 self.peer_params = params;
-6291 let peer_max_udp_payload_size =
-6292 u16::try_from(self.peer_params.max_udp_payload_size.into_inner()).unwrap_or(u16::MAX);
-6293 self.path_data_mut(PathId::ZERO)
-6294 .mtud
-6295 .on_peer_max_udp_payload_size_received(peer_max_udp_payload_size);
-6296 }
-6297
-6298 /// Decrypts a packet, returning the packet number on success
-6299 fn decrypt_packet(
-6300 &mut self,
-6301 now: Instant,
-6302 path_id: PathId,
-6303 packet: &mut Packet,
-6304 ) -> Result<Option<u64>, Option<TransportError>> {
-6305 let result = self
-6306 .crypto_state
-6307 .decrypt_packet_body(packet, path_id, &self.spaces)?;
-6308
-6309 let result = match result {
-6310 Some(r) => r,
-6311 None => return Ok(None),
-6312 };
-6313
-6314 if result.outgoing_key_update_acked
-6315 && let Some(prev) = self.crypto_state.prev_crypto.as_mut()
-6316 {
-6317 prev.end_packet = Some((result.number, now));
-6318 self.set_key_discard_timer(now, packet.header.space());
-6319 }
-6320
-6321 if result.incoming_key_update {
-6322 trace!("key update authenticated");
-6323 self.crypto_state
-6324 .update_keys(Some((result.number, now)), true);
-6325 self.set_key_discard_timer(now, packet.header.space());
-6326 }
-6327
-6328 Ok(Some(result.number))
-6329 }
-6330
-6331 fn peer_supports_ack_frequency(&self) -> bool {
-6332 self.peer_params.min_ack_delay.is_some()
+6042 if self.datagrams.send_blocked && sent_datagrams {
+6043 self.events.push_back(Event::DatagramsUnblocked);
+6044 self.datagrams.send_blocked = false;
+6045 }
+6046
+6047 let path = &mut self.paths.get_mut(&path_id).expect("known path").data;
+6048
+6049 // NEW_TOKEN
+6050 if !path_exclusive_only {
+6051 while let Some(network_path) = space.pending.new_tokens.pop() {
+6052 debug_assert_eq!(space_id, SpaceId::Data);
+6053 let ConnectionSide::Server { server_config } = &self.side else {
+6054 panic!("NEW_TOKEN frames should not be enqueued by clients");
+6055 };
+6056
+6057 if !network_path.is_probably_same_path(&path.network_path) {
+6058 // NEW_TOKEN frames contain tokens bound to a client's IP address, and are only
+6059 // useful if used from the same IP address. Thus, we abandon enqueued NEW_TOKEN
+6060 // frames upon an path change. Instead, when the new path becomes validated,
+6061 // NEW_TOKEN frames may be enqueued for the new path instead.
+6062 continue;
+6063 }
+6064
+6065 let token = Token::new(
+6066 TokenPayload::Validation {
+6067 ip: network_path.remote.ip(),
+6068 issued: server_config.time_source.now(),
+6069 },
+6070 &mut self.rng,
+6071 );
+6072 let new_token = NewToken {
+6073 token: token.encode(&*server_config.token_key).into(),
+6074 };
+6075
+6076 if builder.frame_space_remaining() < new_token.size() {
+6077 space.pending.new_tokens.push(network_path);
+6078 break;
+6079 }
+6080
+6081 builder.write_frame(new_token, stats);
+6082 builder.retransmits_mut().new_tokens.push(network_path);
+6083 }
+6084 }
+6085
+6086 // STREAM
+6087 if !path_exclusive_only && space_id == SpaceId::Data {
+6088 self.streams
+6089 .write_stream_frames(builder, self.config.send_fairness, stats);
+6090 }
+6091
+6092 // ADD_ADDRESS
+6093 while space_id == SpaceId::Data
+6094 && !path_exclusive_only
+6095 && frame::AddAddress::SIZE_BOUND <= builder.frame_space_remaining()
+6096 {
+6097 if let Some(added_address) = space.pending.add_address.pop_last() {
+6098 builder.write_frame(added_address, stats);
+6099 } else {
+6100 break;
+6101 }
+6102 }
+6103
+6104 // REMOVE_ADDRESS
+6105 while space_id == SpaceId::Data
+6106 && !path_exclusive_only
+6107 && frame::RemoveAddress::SIZE_BOUND <= builder.frame_space_remaining()
+6108 {
+6109 if let Some(removed_address) = space.pending.remove_address.pop_last() {
+6110 builder.write_frame(removed_address, stats);
+6111 } else {
+6112 break;
+6113 }
+6114 }
+6115 }
+6116
+6117 /// Write pending ACKs into a buffer
+6118 fn populate_acks<'a, 'b>(
+6119 now: Instant,
+6120 receiving_ecn: bool,
+6121 path_id: PathId,
+6122 space_id: SpaceId,
+6123 space: &mut PacketSpace,
+6124 is_multipath_negotiated: bool,
+6125 builder: &mut PacketBuilder<'a, 'b>,
+6126 stats: &mut FrameStats,
+6127 space_has_keys: bool,
+6128 ) {
+6129 // 0-RTT packets must never carry acks (which would have to be of handshake packets)
+6130 debug_assert!(space_has_keys, "tried to send ACK in 0-RTT");
+6131
+6132 debug_assert!(
+6133 is_multipath_negotiated || path_id == PathId::ZERO,
+6134 "Only PathId::ZERO allowed without multipath (have {path_id:?})"
+6135 );
+6136 if is_multipath_negotiated {
+6137 debug_assert!(
+6138 space_id == SpaceId::Data || path_id == PathId::ZERO,
+6139 "path acks must be sent in 1RTT space (have {space_id:?})"
+6140 );
+6141 }
+6142
+6143 let pns = space.for_path(path_id);
+6144 let ranges = pns.pending_acks.ranges();
+6145 debug_assert!(!ranges.is_empty(), "can not send empty ACK range");
+6146 let ecn = if receiving_ecn {
+6147 Some(&pns.ecn_counters)
+6148 } else {
+6149 None
+6150 };
+6151
+6152 let delay_micros = pns.pending_acks.ack_delay(now).as_micros() as u64;
+6153 // TODO: This should come from `TransportConfig` if that gets configurable.
+6154 let ack_delay_exp = TransportParameters::default().ack_delay_exponent;
+6155 let delay = delay_micros >> ack_delay_exp.into_inner();
+6156
+6157 if is_multipath_negotiated && space_id == SpaceId::Data {
+6158 if !ranges.is_empty() {
+6159 let frame = frame::PathAck::encoder(path_id, delay, ranges, ecn);
+6160 builder.write_frame(frame, stats);
+6161 }
+6162 } else {
+6163 builder.write_frame(frame::Ack::encoder(delay, ranges, ecn), stats);
+6164 }
+6165 }
+6166
+6167 fn close_common(&mut self) {
+6168 trace!("connection closed");
+6169 self.timers.reset();
+6170 }
+6171
+6172 fn set_close_timer(&mut self, now: Instant) {
+6173 // QUIC-MULTIPATH § 2.6 Connection Closure: draining for 3*PTO using the max PTO of
+6174 // all paths.
+6175 let pto_max = self.max_pto_all_paths(self.highest_space);
+6176 self.timers.set(
+6177 Timer::Conn(ConnTimer::Close),
+6178 now + 3 * pto_max,
+6179 self.qlog.with_time(now),
+6180 );
+6181 }
+6182
+6183 /// Handle transport parameters received from the peer
+6184 ///
+6185 /// *remote_cid* and *local_cid* are the source and destination CIDs respectively of the
+6186 /// *packet into which the transport parameters arrived.
+6187 fn handle_peer_params(
+6188 &mut self,
+6189 params: TransportParameters,
+6190 local_cid: ConnectionId,
+6191 remote_cid: ConnectionId,
+6192 now: Instant,
+6193 ) -> Result<(), TransportError> {
+6194 if Some(self.original_remote_cid) != params.initial_src_cid
+6195 || (self.side.is_client()
+6196 && (Some(self.initial_dst_cid) != params.original_dst_cid
+6197 || self.retry_src_cid != params.retry_src_cid))
+6198 {
+6199 return Err(TransportError::TRANSPORT_PARAMETER_ERROR(
+6200 "CID authentication failure",
+6201 ));
+6202 }
+6203 if params.initial_max_path_id.is_some() && (local_cid.is_empty() || remote_cid.is_empty()) {
+6204 return Err(TransportError::PROTOCOL_VIOLATION(
+6205 "multipath must not use zero-length CIDs",
+6206 ));
+6207 }
+6208
+6209 self.set_peer_params(params);
+6210 self.qlog.emit_peer_transport_params_received(self, now);
+6211
+6212 Ok(())
+6213 }
+6214
+6215 fn set_peer_params(&mut self, params: TransportParameters) {
+6216 self.streams.set_params(¶ms);
+6217 self.idle_timeout =
+6218 negotiate_max_idle_timeout(self.config.max_idle_timeout, Some(params.max_idle_timeout));
+6219 trace!("negotiated max idle timeout {:?}", self.idle_timeout);
+6220
+6221 if let Some(ref info) = params.preferred_address {
+6222 // During the handshake PathId::ZERO exists.
+6223 self.remote_cids.get_mut(&PathId::ZERO).expect("not yet abandoned").insert(frame::NewConnectionId {
+6224 path_id: None,
+6225 sequence: 1,
+6226 id: info.connection_id,
+6227 reset_token: info.stateless_reset_token,
+6228 retire_prior_to: 0,
+6229 })
+6230 .expect(
+6231 "preferred address CID is the first received, and hence is guaranteed to be legal",
+6232 );
+6233 let remote = self.path_data(PathId::ZERO).network_path.remote;
+6234 self.set_reset_token(PathId::ZERO, remote, info.stateless_reset_token);
+6235 }
+6236 self.ack_frequency.peer_max_ack_delay = get_max_ack_delay(¶ms);
+6237
+6238 let mut multipath_enabled = None;
+6239 if let (Some(local_max_path_id), Some(remote_max_path_id)) = (
+6240 self.config.get_initial_max_path_id(),
+6241 params.initial_max_path_id,
+6242 ) {
+6243 // multipath is enabled, register the local and remote maximums
+6244 self.local_max_path_id = local_max_path_id;
+6245 self.remote_max_path_id = remote_max_path_id;
+6246 let initial_max_path_id = local_max_path_id.min(remote_max_path_id);
+6247 debug!(%initial_max_path_id, "multipath negotiated");
+6248 multipath_enabled = Some(initial_max_path_id);
+6249 }
+6250
+6251 if let Some((max_locally_allowed_remote_addresses, max_remotely_allowed_remote_addresses)) =
+6252 self.config
+6253 .max_remote_nat_traversal_addresses
+6254 .zip(params.max_remote_nat_traversal_addresses)
+6255 {
+6256 if let Some(max_initial_paths) =
+6257 multipath_enabled.map(|path_id| path_id.saturating_add(1u8))
+6258 {
+6259 let max_local_addresses = max_remotely_allowed_remote_addresses.get();
+6260 let max_remote_addresses = max_locally_allowed_remote_addresses.get();
+6261 self.iroh_hp =
+6262 iroh_hp::State::new(max_remote_addresses, max_local_addresses, self.side());
+6263 debug!(
+6264 %max_remote_addresses, %max_local_addresses,
+6265 "iroh hole punching negotiated"
+6266 );
+6267
+6268 match self.side() {
+6269 Side::Client => {
+6270 if max_initial_paths.as_u32() < max_remote_addresses as u32 + 1 {
+6271 // in this case the client might try to open `max_remote_addresses` new
+6272 // paths, but the current multipath configuration will not allow it
+6273 warn!(%max_initial_paths, %max_remote_addresses, "local client configuration might cause nat traversal issues")
+6274 } else if max_local_addresses as u64
+6275 > params.active_connection_id_limit.into_inner()
+6276 {
+6277 // the server allows us to send at most `params.active_connection_id_limit`
+6278 // but they might need at least `max_local_addresses` to effectively send
+6279 // `PATH_CHALLENGE` frames to each advertised local address
+6280 warn!(%max_local_addresses, remote_cid_limit=%params.active_connection_id_limit.into_inner(), "remote server configuration might cause nat traversal issues")
+6281 }
+6282 }
+6283 Side::Server => {
+6284 if (max_initial_paths.as_u32() as u64) < crate::LOCAL_CID_COUNT {
+6285 warn!(%max_initial_paths, local_cid_limit=%crate::LOCAL_CID_COUNT, "local server configuration might cause nat traversal issues")
+6286 }
+6287 }
+6288 }
+6289 } else {
+6290 debug!("iroh nat traversal enabled for both endpoints, but multipath is missing")
+6291 }
+6292 }
+6293
+6294 self.peer_params = params;
+6295 let peer_max_udp_payload_size =
+6296 u16::try_from(self.peer_params.max_udp_payload_size.into_inner()).unwrap_or(u16::MAX);
+6297 self.path_data_mut(PathId::ZERO)
+6298 .mtud
+6299 .on_peer_max_udp_payload_size_received(peer_max_udp_payload_size);
+6300 }
+6301
+6302 /// Decrypts a packet, returning the packet number on success
+6303 fn decrypt_packet(
+6304 &mut self,
+6305 now: Instant,
+6306 path_id: PathId,
+6307 packet: &mut Packet,
+6308 ) -> Result<Option<u64>, Option<TransportError>> {
+6309 let result = self
+6310 .crypto_state
+6311 .decrypt_packet_body(packet, path_id, &self.spaces)?;
+6312
+6313 let result = match result {
+6314 Some(r) => r,
+6315 None => return Ok(None),
+6316 };
+6317
+6318 if result.outgoing_key_update_acked
+6319 && let Some(prev) = self.crypto_state.prev_crypto.as_mut()
+6320 {
+6321 prev.end_packet = Some((result.number, now));
+6322 self.set_key_discard_timer(now, packet.header.space());
+6323 }
+6324
+6325 if result.incoming_key_update {
+6326 trace!("key update authenticated");
+6327 self.crypto_state
+6328 .update_keys(Some((result.number, now)), true);
+6329 self.set_key_discard_timer(now, packet.header.space());
+6330 }
+6331
+6332 Ok(Some(result.number))
6333 }
6334
-6335 /// Send an IMMEDIATE_ACK frame to the remote endpoint
-6336 ///
-6337 /// According to the spec, this will result in an error if the remote endpoint does not support
-6338 /// the Acknowledgement Frequency extension
-6339 pub(crate) fn immediate_ack(&mut self, path_id: PathId) {
-6340 debug_assert_eq!(
-6341 self.highest_space,
-6342 SpaceId::Data,
-6343 "immediate ack must be written in the data space"
-6344 );
-6345 self.spaces[self.highest_space]
-6346 .for_path(path_id)
-6347 .immediate_ack_pending = true;
-6348 }
-6349
-6350 /// Decodes a packet, returning its decrypted payload, so it can be inspected in tests
-6351 #[cfg(test)]
-6352 pub(crate) fn decode_packet(&self, event: &ConnectionEvent) -> Option<Vec<u8>> {
-6353 let (path_id, first_decode, remaining) = match &event.0 {
-6354 ConnectionEventInner::Datagram(DatagramConnectionEvent {
-6355 path_id,
-6356 first_decode,
-6357 remaining,
-6358 ..
-6359 }) => (path_id, first_decode, remaining),
-6360 _ => return None,
-6361 };
-6362
-6363 if remaining.is_some() {
-6364 panic!("Packets should never be coalesced in tests");
-6365 }
+6335 fn peer_supports_ack_frequency(&self) -> bool {
+6336 self.peer_params.min_ack_delay.is_some()
+6337 }
+6338
+6339 /// Send an IMMEDIATE_ACK frame to the remote endpoint
+6340 ///
+6341 /// According to the spec, this will result in an error if the remote endpoint does not support
+6342 /// the Acknowledgement Frequency extension
+6343 pub(crate) fn immediate_ack(&mut self, path_id: PathId) {
+6344 debug_assert_eq!(
+6345 self.highest_space,
+6346 SpaceId::Data,
+6347 "immediate ack must be written in the data space"
+6348 );
+6349 self.spaces[self.highest_space]
+6350 .for_path(path_id)
+6351 .immediate_ack_pending = true;
+6352 }
+6353
+6354 /// Decodes a packet, returning its decrypted payload, so it can be inspected in tests
+6355 #[cfg(test)]
+6356 pub(crate) fn decode_packet(&self, event: &ConnectionEvent) -> Option<Vec<u8>> {
+6357 let (path_id, first_decode, remaining) = match &event.0 {
+6358 ConnectionEventInner::Datagram(DatagramConnectionEvent {
+6359 path_id,
+6360 first_decode,
+6361 remaining,
+6362 ..
+6363 }) => (path_id, first_decode, remaining),
+6364 _ => return None,
+6365 };
6366
-6367 let decrypted_header = self
-6368 .crypto_state
-6369 .unprotect_header(first_decode.clone(), self.peer_params.stateless_reset_token)?;
+6367 if remaining.is_some() {
+6368 panic!("Packets should never be coalesced in tests");
+6369 }
6370
-6371 let mut packet = decrypted_header.packet?;
-6372 self.crypto_state
-6373 .decrypt_packet_body(&mut packet, *path_id, &self.spaces)
-6374 .ok()?;
-6375
-6376 Some(packet.payload.to_vec())
-6377 }
-6378
-6379 /// The number of bytes of packets containing retransmittable frames that have not been
-6380 /// acknowledged or declared lost.
-6381 #[cfg(test)]
-6382 pub(crate) fn bytes_in_flight(&self) -> u64 {
-6383 // TODO(@divma): consider including for multipath?
-6384 self.path_data(PathId::ZERO).in_flight.bytes
-6385 }
-6386
-6387 /// Number of bytes worth of non-ack-only packets that may be sent
-6388 #[cfg(test)]
-6389 pub(crate) fn congestion_window(&self) -> u64 {
-6390 let path = self.path_data(PathId::ZERO);
-6391 path.congestion
-6392 .window()
-6393 .saturating_sub(path.in_flight.bytes)
-6394 }
-6395
-6396 /// Whether no timers but keepalive, idle, rtt, pushnewcid, and key discard are running
-6397 #[cfg(test)]
-6398 pub(crate) fn is_idle(&self) -> bool {
-6399 let current_timers = self.timers.values();
-6400 current_timers
-6401 .into_iter()
-6402 .filter(|(timer, _)| {
-6403 !matches!(
-6404 timer,
-6405 Timer::Conn(ConnTimer::KeepAlive)
-6406 | Timer::PerPath(_, PathTimer::PathKeepAlive)
-6407 | Timer::Conn(ConnTimer::PushNewCid)
-6408 | Timer::Conn(ConnTimer::KeyDiscard)
-6409 )
-6410 })
-6411 .min_by_key(|(_, time)| *time)
-6412 .is_none_or(|(timer, _)| timer == Timer::Conn(ConnTimer::Idle))
-6413 }
-6414
-6415 /// Whether explicit congestion notification is in use on outgoing packets.
-6416 #[cfg(test)]
-6417 pub(crate) fn using_ecn(&self) -> bool {
-6418 self.path_data(PathId::ZERO).sending_ecn
-6419 }
-6420
-6421 /// The number of received bytes in the current path
-6422 #[cfg(test)]
-6423 pub(crate) fn total_recvd(&self) -> u64 {
-6424 self.path_data(PathId::ZERO).total_recvd
-6425 }
-6426
-6427 #[cfg(test)]
-6428 pub(crate) fn active_local_cid_seq(&self) -> (u64, u64) {
-6429 self.local_cid_state
-6430 .get(&PathId::ZERO)
-6431 .unwrap()
-6432 .active_seq()
-6433 }
-6434
-6435 #[cfg(test)]
-6436 #[track_caller]
-6437 pub(crate) fn active_local_path_cid_seq(&self, path_id: u32) -> (u64, u64) {
-6438 self.local_cid_state
-6439 .get(&PathId(path_id))
-6440 .unwrap()
-6441 .active_seq()
-6442 }
-6443
-6444 /// Instruct the peer to replace previously issued CIDs by sending a NEW_CONNECTION_ID frame
-6445 /// with updated `retire_prior_to` field set to `v`
-6446 #[cfg(test)]
-6447 pub(crate) fn rotate_local_cid(&mut self, v: u64, now: Instant) {
-6448 let n = self
-6449 .local_cid_state
-6450 .get_mut(&PathId::ZERO)
-6451 .unwrap()
-6452 .assign_retire_seq(v);
-6453 self.endpoint_events
-6454 .push_back(EndpointEventInner::NeedIdentifiers(PathId::ZERO, now, n));
-6455 }
-6456
-6457 /// Check the current active remote CID sequence for `PathId::ZERO`
-6458 #[cfg(test)]
-6459 pub(crate) fn active_remote_cid_seq(&self) -> u64 {
-6460 self.remote_cids.get(&PathId::ZERO).unwrap().active_seq()
-6461 }
-6462
-6463 /// Returns the detected maximum udp payload size for the current path
-6464 #[cfg(test)]
-6465 pub(crate) fn path_mtu(&self, path_id: PathId) -> u16 {
-6466 self.path_data(path_id).current_mtu()
-6467 }
-6468
-6469 /// Triggers path validation on all paths
-6470 #[cfg(test)]
-6471 pub(crate) fn trigger_path_validation(&mut self) {
-6472 for path in self.paths.values_mut() {
-6473 path.data.send_new_challenge = true;
-6474 }
-6475 }
-6476
-6477 /// Whether we have 1-RTT data to send
-6478 ///
-6479 /// This checks for frames that can only be sent in the data space (1-RTT):
-6480 /// - Pending PATH_CHALLENGE frames on the active and previous path if just migrated.
-6481 /// - Pending PATH_RESPONSE frames.
-6482 /// - Pending data to send in STREAM frames.
-6483 /// - Pending DATAGRAM frames to send.
-6484 ///
-6485 /// See also [`PacketSpace::can_send`] which keeps track of all other frame types that
-6486 /// may need to be sent.
-6487 fn can_send_1rtt(&self, path_id: PathId, max_size: usize) -> SendableFrames {
-6488 let path_exclusive = self.paths.get(&path_id).is_some_and(|path| {
-6489 path.data.send_new_challenge
-6490 || path
-6491 .prev
-6492 .as_ref()
-6493 .is_some_and(|(_, path)| path.send_new_challenge)
-6494 || !path.data.path_responses.is_empty()
-6495 });
-6496 let other = self.streams.can_send_stream_data()
-6497 || self
-6498 .datagrams
-6499 .outgoing
-6500 .front()
-6501 .is_some_and(|x| x.size(true) <= max_size);
-6502 SendableFrames {
-6503 acks: false,
-6504 other,
-6505 close: false,
-6506 path_exclusive,
-6507 }
-6508 }
-6509
-6510 /// Terminate the connection instantly, without sending a close packet
-6511 fn kill(&mut self, reason: ConnectionError) {
-6512 self.close_common();
-6513 self.state.move_to_drained(Some(reason));
-6514 self.endpoint_events.push_back(EndpointEventInner::Drained);
-6515 }
-6516
-6517 /// Storage size required for the largest packet that can be transmitted on all currently
-6518 /// available paths
-6519 ///
-6520 /// Buffers passed to [`Connection::poll_transmit`] should be at least this large.
-6521 ///
-6522 /// When multipath is enabled, this value is the minimum MTU across all available paths.
-6523 pub fn current_mtu(&self) -> u16 {
-6524 self.paths
-6525 .iter()
-6526 .filter(|&(path_id, _path_state)| !self.abandoned_paths.contains(path_id))
-6527 .map(|(_path_id, path_state)| path_state.data.current_mtu())
-6528 .min()
-6529 .expect("There is always at least one available path")
-6530 }
-6531
-6532 /// Size of non-frame data for a 1-RTT packet
-6533 ///
-6534 /// Quantifies space consumed by the QUIC header and AEAD tag. All other bytes in a packet are
-6535 /// frames. Changes if the length of the remote connection ID changes, which is expected to be
-6536 /// rare. If `pn` is specified, may additionally change unpredictably due to variations in
-6537 /// latency and packet loss.
-6538 fn predict_1rtt_overhead(&mut self, pn: u64, path: PathId) -> usize {
-6539 let pn_len = PacketNumber::new(
-6540 pn,
-6541 self.spaces[SpaceId::Data]
-6542 .for_path(path)
-6543 .largest_acked_packet
-6544 .unwrap_or(0),
-6545 )
-6546 .len();
-6547
-6548 // 1 byte for flags
-6549 1 + self
-6550 .remote_cids
-6551 .get(&path)
-6552 .map(|cids| cids.active().len())
-6553 .unwrap_or(20) // Max CID len in QUIC v1
-6554 + pn_len
-6555 + self.tag_len_1rtt()
-6556 }
-6557
-6558 fn predict_1rtt_overhead_no_pn(&self) -> usize {
-6559 let pn_len = 4;
-6560
-6561 let cid_len = self
-6562 .remote_cids
-6563 .values()
-6564 .map(|cids| cids.active().len())
-6565 .max()
-6566 .unwrap_or(20); // Max CID len in QUIC v1
-6567
-6568 // 1 byte for flags
-6569 1 + cid_len + pn_len + self.tag_len_1rtt()
-6570 }
+6371 let decrypted_header = self
+6372 .crypto_state
+6373 .unprotect_header(first_decode.clone(), self.peer_params.stateless_reset_token)?;
+6374
+6375 let mut packet = decrypted_header.packet?;
+6376 self.crypto_state
+6377 .decrypt_packet_body(&mut packet, *path_id, &self.spaces)
+6378 .ok()?;
+6379
+6380 Some(packet.payload.to_vec())
+6381 }
+6382
+6383 /// The number of bytes of packets containing retransmittable frames that have not been
+6384 /// acknowledged or declared lost.
+6385 #[cfg(test)]
+6386 pub(crate) fn bytes_in_flight(&self) -> u64 {
+6387 // TODO(@divma): consider including for multipath?
+6388 self.path_data(PathId::ZERO).in_flight.bytes
+6389 }
+6390
+6391 /// Number of bytes worth of non-ack-only packets that may be sent
+6392 #[cfg(test)]
+6393 pub(crate) fn congestion_window(&self) -> u64 {
+6394 let path = self.path_data(PathId::ZERO);
+6395 path.congestion
+6396 .window()
+6397 .saturating_sub(path.in_flight.bytes)
+6398 }
+6399
+6400 /// Whether no timers but keepalive, idle, rtt, pushnewcid, and key discard are running
+6401 #[cfg(test)]
+6402 pub(crate) fn is_idle(&self) -> bool {
+6403 let current_timers = self.timers.values();
+6404 current_timers
+6405 .into_iter()
+6406 .filter(|(timer, _)| {
+6407 !matches!(
+6408 timer,
+6409 Timer::Conn(ConnTimer::KeepAlive)
+6410 | Timer::PerPath(_, PathTimer::PathKeepAlive)
+6411 | Timer::Conn(ConnTimer::PushNewCid)
+6412 | Timer::Conn(ConnTimer::KeyDiscard)
+6413 )
+6414 })
+6415 .min_by_key(|(_, time)| *time)
+6416 .is_none_or(|(timer, _)| timer == Timer::Conn(ConnTimer::Idle))
+6417 }
+6418
+6419 /// Whether explicit congestion notification is in use on outgoing packets.
+6420 #[cfg(test)]
+6421 pub(crate) fn using_ecn(&self) -> bool {
+6422 self.path_data(PathId::ZERO).sending_ecn
+6423 }
+6424
+6425 /// The number of received bytes in the current path
+6426 #[cfg(test)]
+6427 pub(crate) fn total_recvd(&self) -> u64 {
+6428 self.path_data(PathId::ZERO).total_recvd
+6429 }
+6430
+6431 #[cfg(test)]
+6432 pub(crate) fn active_local_cid_seq(&self) -> (u64, u64) {
+6433 self.local_cid_state
+6434 .get(&PathId::ZERO)
+6435 .unwrap()
+6436 .active_seq()
+6437 }
+6438
+6439 #[cfg(test)]
+6440 #[track_caller]
+6441 pub(crate) fn active_local_path_cid_seq(&self, path_id: u32) -> (u64, u64) {
+6442 self.local_cid_state
+6443 .get(&PathId(path_id))
+6444 .unwrap()
+6445 .active_seq()
+6446 }
+6447
+6448 /// Instruct the peer to replace previously issued CIDs by sending a NEW_CONNECTION_ID frame
+6449 /// with updated `retire_prior_to` field set to `v`
+6450 #[cfg(test)]
+6451 pub(crate) fn rotate_local_cid(&mut self, v: u64, now: Instant) {
+6452 let n = self
+6453 .local_cid_state
+6454 .get_mut(&PathId::ZERO)
+6455 .unwrap()
+6456 .assign_retire_seq(v);
+6457 self.endpoint_events
+6458 .push_back(EndpointEventInner::NeedIdentifiers(PathId::ZERO, now, n));
+6459 }
+6460
+6461 /// Check the current active remote CID sequence for `PathId::ZERO`
+6462 #[cfg(test)]
+6463 pub(crate) fn active_remote_cid_seq(&self) -> u64 {
+6464 self.remote_cids.get(&PathId::ZERO).unwrap().active_seq()
+6465 }
+6466
+6467 /// Returns the detected maximum udp payload size for the current path
+6468 #[cfg(test)]
+6469 pub(crate) fn path_mtu(&self, path_id: PathId) -> u16 {
+6470 self.path_data(path_id).current_mtu()
+6471 }
+6472
+6473 /// Triggers path validation on all paths
+6474 #[cfg(test)]
+6475 pub(crate) fn trigger_path_validation(&mut self) {
+6476 for path in self.paths.values_mut() {
+6477 path.data.send_new_challenge = true;
+6478 }
+6479 }
+6480
+6481 /// Whether we have 1-RTT data to send
+6482 ///
+6483 /// This checks for frames that can only be sent in the data space (1-RTT):
+6484 /// - Pending PATH_CHALLENGE frames on the active and previous path if just migrated.
+6485 /// - Pending PATH_RESPONSE frames.
+6486 /// - Pending data to send in STREAM frames.
+6487 /// - Pending DATAGRAM frames to send.
+6488 ///
+6489 /// See also [`PacketSpace::can_send`] which keeps track of all other frame types that
+6490 /// may need to be sent.
+6491 fn can_send_1rtt(&self, path_id: PathId, max_size: usize) -> SendableFrames {
+6492 let path_exclusive = self.paths.get(&path_id).is_some_and(|path| {
+6493 path.data.send_new_challenge
+6494 || path
+6495 .prev
+6496 .as_ref()
+6497 .is_some_and(|(_, path)| path.send_new_challenge)
+6498 || !path.data.path_responses.is_empty()
+6499 });
+6500 let other = self.streams.can_send_stream_data()
+6501 || self
+6502 .datagrams
+6503 .outgoing
+6504 .front()
+6505 .is_some_and(|x| x.size(true) <= max_size);
+6506 SendableFrames {
+6507 acks: false,
+6508 other,
+6509 close: false,
+6510 path_exclusive,
+6511 }
+6512 }
+6513
+6514 /// Terminate the connection instantly, without sending a close packet
+6515 fn kill(&mut self, reason: ConnectionError) {
+6516 self.close_common();
+6517 self.state.move_to_drained(Some(reason));
+6518 self.endpoint_events.push_back(EndpointEventInner::Drained);
+6519 }
+6520
+6521 /// Storage size required for the largest packet that can be transmitted on all currently
+6522 /// available paths
+6523 ///
+6524 /// Buffers passed to [`Connection::poll_transmit`] should be at least this large.
+6525 ///
+6526 /// When multipath is enabled, this value is the minimum MTU across all available paths.
+6527 pub fn current_mtu(&self) -> u16 {
+6528 self.paths
+6529 .iter()
+6530 .filter(|&(path_id, _path_state)| !self.abandoned_paths.contains(path_id))
+6531 .map(|(_path_id, path_state)| path_state.data.current_mtu())
+6532 .min()
+6533 .expect("There is always at least one available path")
+6534 }
+6535
+6536 /// Size of non-frame data for a 1-RTT packet
+6537 ///
+6538 /// Quantifies space consumed by the QUIC header and AEAD tag. All other bytes in a packet are
+6539 /// frames. Changes if the length of the remote connection ID changes, which is expected to be
+6540 /// rare. If `pn` is specified, may additionally change unpredictably due to variations in
+6541 /// latency and packet loss.
+6542 fn predict_1rtt_overhead(&mut self, pn: u64, path: PathId) -> usize {
+6543 let pn_len = PacketNumber::new(
+6544 pn,
+6545 self.spaces[SpaceId::Data]
+6546 .for_path(path)
+6547 .largest_acked_packet
+6548 .unwrap_or(0),
+6549 )
+6550 .len();
+6551
+6552 // 1 byte for flags
+6553 1 + self
+6554 .remote_cids
+6555 .get(&path)
+6556 .map(|cids| cids.active().len())
+6557 .unwrap_or(20) // Max CID len in QUIC v1
+6558 + pn_len
+6559 + self.tag_len_1rtt()
+6560 }
+6561
+6562 fn predict_1rtt_overhead_no_pn(&self) -> usize {
+6563 let pn_len = 4;
+6564
+6565 let cid_len = self
+6566 .remote_cids
+6567 .values()
+6568 .map(|cids| cids.active().len())
+6569 .max()
+6570 .unwrap_or(20); // Max CID len in QUIC v1
6571
-6572 fn tag_len_1rtt(&self) -> usize {
-6573 // encryption_keys for Data space returns 1-RTT keys if available, otherwise 0-RTT keys
-6574 let packet_crypto = self
-6575 .crypto_state
-6576 .encryption_keys(SpaceKind::Data, self.side.side())
-6577 .map(|(_header, packet, _level)| packet);
-6578 // If neither Data nor 0-RTT keys are available, make a reasonable tag length guess. As of
-6579 // this writing, all QUIC cipher suites use 16-byte tags. We could return `None` instead,
-6580 // but that would needlessly prevent sending datagrams during 0-RTT.
-6581 packet_crypto.map_or(16, |x| x.tag_len())
-6582 }
-6583
-6584 /// Mark the path as validated, and enqueue NEW_TOKEN frames to be sent as appropriate
-6585 fn on_path_validated(&mut self, path_id: PathId) {
-6586 self.path_data_mut(path_id).validated = true;
-6587 let ConnectionSide::Server { server_config } = &self.side else {
-6588 return;
-6589 };
-6590 let network_path = self.path_data(path_id).network_path;
-6591 let new_tokens = &mut self.spaces[SpaceId::Data as usize].pending.new_tokens;
-6592 new_tokens.clear();
-6593 for _ in 0..server_config.validation_token.sent {
-6594 new_tokens.push(network_path);
-6595 }
-6596 }
-6597
-6598 /// Handle new path status information: PATH_STATUS_AVAILABLE, PATH_STATUS_BACKUP
-6599 fn on_path_status(&mut self, path_id: PathId, status: PathStatus, status_seq_no: VarInt) {
-6600 if let Some(path) = self.paths.get_mut(&path_id) {
-6601 path.data.status.remote_update(status, status_seq_no);
-6602 } else {
-6603 debug!("PATH_STATUS_AVAILABLE received unknown path {:?}", path_id);
-6604 }
-6605 self.events.push_back(
-6606 PathEvent::RemoteStatus {
-6607 id: path_id,
-6608 status,
-6609 }
-6610 .into(),
-6611 );
-6612 }
-6613
-6614 /// Returns the maximum [`PathId`] to be used for sending in this connection.
-6615 ///
-6616 /// This is calculated as minimum between the local and remote's maximums when multipath is
-6617 /// enabled, or `None` when disabled.
-6618 ///
-6619 /// For data that's received, we should use [`Self::local_max_path_id`] instead.
-6620 /// The reasoning is that the remote might already have updated to its own newer
-6621 /// [`Self::max_path_id`] after sending out a `MAX_PATH_ID` frame, but it got re-ordered.
-6622 fn max_path_id(&self) -> Option<PathId> {
-6623 if self.is_multipath_negotiated() {
-6624 Some(self.remote_max_path_id.min(self.local_max_path_id))
-6625 } else {
-6626 None
-6627 }
-6628 }
-6629
-6630 /// Returns whether this connection has a socket that supports IPv6.
-6631 ///
-6632 /// TODO(matheus23): This is related to quinn endpoint state's `ipv6` bool. We should move that info
-6633 /// here instead of trying to hack around not knowing it exactly.
-6634 fn is_ipv6(&self) -> bool {
-6635 self.paths
-6636 .values()
-6637 .any(|p| p.data.network_path.remote.is_ipv6())
-6638 }
-6639
-6640 /// Add addresses the local endpoint considers are reachable for nat traversal.
-6641 pub fn add_nat_traversal_address(&mut self, address: SocketAddr) -> Result<(), iroh_hp::Error> {
-6642 if let Some(added) = self.iroh_hp.add_local_address(address)? {
-6643 self.spaces[SpaceId::Data].pending.add_address.insert(added);
-6644 };
-6645 Ok(())
-6646 }
-6647
-6648 /// Removes an address the endpoing no longer considers reachable for nat traversal
-6649 ///
-6650 /// Addresses not present in the set will be silently ignored.
-6651 pub fn remove_nat_traversal_address(
-6652 &mut self,
-6653 address: SocketAddr,
-6654 ) -> Result<(), iroh_hp::Error> {
-6655 if let Some(removed) = self.iroh_hp.remove_local_address(address)? {
-6656 self.spaces[SpaceId::Data]
-6657 .pending
-6658 .remove_address
-6659 .insert(removed);
-6660 }
-6661 Ok(())
-6662 }
-6663
-6664 /// Get the current local nat traversal addresses
-6665 pub fn get_local_nat_traversal_addresses(&self) -> Result<Vec<SocketAddr>, iroh_hp::Error> {
-6666 self.iroh_hp.get_local_nat_traversal_addresses()
-6667 }
-6668
-6669 /// Get the currently advertised nat traversal addresses by the server
-6670 pub fn get_remote_nat_traversal_addresses(&self) -> Result<Vec<SocketAddr>, iroh_hp::Error> {
-6671 Ok(self
-6672 .iroh_hp
-6673 .client_side()?
-6674 .get_remote_nat_traversal_addresses())
-6675 }
-6676
-6677 /// Attempts to open a path for nat traversal.
-6678 ///
-6679 /// On success returns the [`PathId`] and remote address of the path.
-6680 fn open_nat_traversal_path(
-6681 &mut self,
-6682 now: Instant,
-6683 ip_port: (IpAddr, u16),
-6684 ) -> Result<Option<(PathId, SocketAddr)>, PathError> {
-6685 let remote = ip_port.into();
-6686 // TODO(matheus23): Probe the correct 4-tuple, instead of only a remote address?
-6687 // By specifying None for `local_ip`, we do two things: 1. open_path_ensure won't
-6688 // generate two paths to the same remote and 2. we let the OS choose which
-6689 // interface to use for sending on that path.
-6690 let network_path = FourTuple {
-6691 remote,
-6692 local_ip: None,
-6693 };
-6694 match self.open_path_ensure(network_path, PathStatus::Backup, now) {
-6695 Ok((path_id, path_was_known)) => {
-6696 if path_was_known {
-6697 trace!(%path_id, %remote, "nat traversal: path existed for remote");
-6698 }
-6699 Ok(Some((path_id, remote)))
-6700 }
-6701 Err(e) => {
-6702 debug!(%remote, %e, "nat traversal: failed to probe remote");
-6703 Err(e)
+6572 // 1 byte for flags
+6573 1 + cid_len + pn_len + self.tag_len_1rtt()
+6574 }
+6575
+6576 fn tag_len_1rtt(&self) -> usize {
+6577 // encryption_keys for Data space returns 1-RTT keys if available, otherwise 0-RTT keys
+6578 let packet_crypto = self
+6579 .crypto_state
+6580 .encryption_keys(SpaceKind::Data, self.side.side())
+6581 .map(|(_header, packet, _level)| packet);
+6582 // If neither Data nor 0-RTT keys are available, make a reasonable tag length guess. As of
+6583 // this writing, all QUIC cipher suites use 16-byte tags. We could return `None` instead,
+6584 // but that would needlessly prevent sending datagrams during 0-RTT.
+6585 packet_crypto.map_or(16, |x| x.tag_len())
+6586 }
+6587
+6588 /// Mark the path as validated, and enqueue NEW_TOKEN frames to be sent as appropriate
+6589 fn on_path_validated(&mut self, path_id: PathId) {
+6590 self.path_data_mut(path_id).validated = true;
+6591 let ConnectionSide::Server { server_config } = &self.side else {
+6592 return;
+6593 };
+6594 let network_path = self.path_data(path_id).network_path;
+6595 let new_tokens = &mut self.spaces[SpaceId::Data as usize].pending.new_tokens;
+6596 new_tokens.clear();
+6597 for _ in 0..server_config.validation_token.sent {
+6598 new_tokens.push(network_path);
+6599 }
+6600 }
+6601
+6602 /// Handle new path status information: PATH_STATUS_AVAILABLE, PATH_STATUS_BACKUP
+6603 fn on_path_status(&mut self, path_id: PathId, status: PathStatus, status_seq_no: VarInt) {
+6604 if let Some(path) = self.paths.get_mut(&path_id) {
+6605 path.data.status.remote_update(status, status_seq_no);
+6606 } else {
+6607 debug!("PATH_STATUS_AVAILABLE received unknown path {:?}", path_id);
+6608 }
+6609 self.events.push_back(
+6610 PathEvent::RemoteStatus {
+6611 id: path_id,
+6612 status,
+6613 }
+6614 .into(),
+6615 );
+6616 }
+6617
+6618 /// Returns the maximum [`PathId`] to be used for sending in this connection.
+6619 ///
+6620 /// This is calculated as minimum between the local and remote's maximums when multipath is
+6621 /// enabled, or `None` when disabled.
+6622 ///
+6623 /// For data that's received, we should use [`Self::local_max_path_id`] instead.
+6624 /// The reasoning is that the remote might already have updated to its own newer
+6625 /// [`Self::max_path_id`] after sending out a `MAX_PATH_ID` frame, but it got re-ordered.
+6626 fn max_path_id(&self) -> Option<PathId> {
+6627 if self.is_multipath_negotiated() {
+6628 Some(self.remote_max_path_id.min(self.local_max_path_id))
+6629 } else {
+6630 None
+6631 }
+6632 }
+6633
+6634 /// Returns whether this connection has a socket that supports IPv6.
+6635 ///
+6636 /// TODO(matheus23): This is related to quinn endpoint state's `ipv6` bool. We should move that info
+6637 /// here instead of trying to hack around not knowing it exactly.
+6638 fn is_ipv6(&self) -> bool {
+6639 self.paths
+6640 .values()
+6641 .any(|p| p.data.network_path.remote.is_ipv6())
+6642 }
+6643
+6644 /// Add addresses the local endpoint considers are reachable for nat traversal.
+6645 pub fn add_nat_traversal_address(&mut self, address: SocketAddr) -> Result<(), iroh_hp::Error> {
+6646 if let Some(added) = self.iroh_hp.add_local_address(address)? {
+6647 self.spaces[SpaceId::Data].pending.add_address.insert(added);
+6648 };
+6649 Ok(())
+6650 }
+6651
+6652 /// Removes an address the endpoing no longer considers reachable for nat traversal
+6653 ///
+6654 /// Addresses not present in the set will be silently ignored.
+6655 pub fn remove_nat_traversal_address(
+6656 &mut self,
+6657 address: SocketAddr,
+6658 ) -> Result<(), iroh_hp::Error> {
+6659 if let Some(removed) = self.iroh_hp.remove_local_address(address)? {
+6660 self.spaces[SpaceId::Data]
+6661 .pending
+6662 .remove_address
+6663 .insert(removed);
+6664 }
+6665 Ok(())
+6666 }
+6667
+6668 /// Get the current local nat traversal addresses
+6669 pub fn get_local_nat_traversal_addresses(&self) -> Result<Vec<SocketAddr>, iroh_hp::Error> {
+6670 self.iroh_hp.get_local_nat_traversal_addresses()
+6671 }
+6672
+6673 /// Get the currently advertised nat traversal addresses by the server
+6674 pub fn get_remote_nat_traversal_addresses(&self) -> Result<Vec<SocketAddr>, iroh_hp::Error> {
+6675 Ok(self
+6676 .iroh_hp
+6677 .client_side()?
+6678 .get_remote_nat_traversal_addresses())
+6679 }
+6680
+6681 /// Attempts to open a path for nat traversal.
+6682 ///
+6683 /// On success returns the [`PathId`] and remote address of the path.
+6684 fn open_nat_traversal_path(
+6685 &mut self,
+6686 now: Instant,
+6687 ip_port: (IpAddr, u16),
+6688 ) -> Result<Option<(PathId, SocketAddr)>, PathError> {
+6689 let remote = ip_port.into();
+6690 // TODO(matheus23): Probe the correct 4-tuple, instead of only a remote address?
+6691 // By specifying None for `local_ip`, we do two things: 1. open_path_ensure won't
+6692 // generate two paths to the same remote and 2. we let the OS choose which
+6693 // interface to use for sending on that path.
+6694 let network_path = FourTuple {
+6695 remote,
+6696 local_ip: None,
+6697 };
+6698 match self.open_path_ensure(network_path, PathStatus::Backup, now) {
+6699 Ok((path_id, path_was_known)) => {
+6700 if path_was_known {
+6701 trace!(%path_id, %remote, "nat traversal: path existed for remote");
+6702 }
+6703 Ok(Some((path_id, remote)))
6704 }
-6705 }
-6706 }
-6707
-6708 /// Initiates a new nat traversal round
-6709 ///
-6710 /// A nat traversal round involves advertising the client's local addresses in `REACH_OUT`
-6711 /// frames, and initiating probing of the known remote addresses. When a new round is
-6712 /// initiated, the previous one is cancelled, and paths that have not been opened are closed.
+6705 Err(e) => {
+6706 debug!(%remote, %e, "nat traversal: failed to probe remote");
+6707 Err(e)
+6708 }
+6709 }
+6710 }
+6711
+6712 /// Initiates a new nat traversal round
6713 ///
-6714 /// Returns the server addresses that are now being probed.
-6715 /// If addresses fail due to spurious errors, these might succeed later and not be returned in
-6716 /// this set.
-6717 pub fn initiate_nat_traversal_round(
-6718 &mut self,
-6719 now: Instant,
-6720 ) -> Result<Vec<SocketAddr>, iroh_hp::Error> {
-6721 if self.state.is_closed() {
-6722 return Err(iroh_hp::Error::Closed);
-6723 }
-6724
-6725 let ipv6 = self.is_ipv6();
-6726 let client_state = self.iroh_hp.client_side_mut()?;
-6727 let iroh_hp::NatTraversalRound {
-6728 new_round,
-6729 reach_out_at,
-6730 addresses_to_probe,
-6731 prev_round_path_ids,
-6732 } = client_state.initiate_nat_traversal_round(ipv6)?;
-6733
-6734 trace!(%new_round, reach_out=reach_out_at.len(), to_probe=addresses_to_probe.len(),
-6735 "initiating nat traversal round");
-6736
-6737 self.spaces[SpaceId::Data].pending.reach_out = Some((new_round, reach_out_at));
-6738
-6739 for path_id in prev_round_path_ids {
-6740 let Some(path) = self.path(path_id) else {
-6741 continue;
-6742 };
-6743 let ip = path.network_path.remote.ip();
-6744 let port = path.network_path.remote.port();
-6745
-6746 // We only close paths that aren't validated (thus are working) that we opened
-6747 // in a previous round.
-6748 // And we only close paths that we don't want to probe anyways.
-6749 if !addresses_to_probe
-6750 .iter()
-6751 .any(|(_, probe)| *probe == (ip, port))
-6752 && !path.validated
-6753 && !self.abandoned_paths.contains(&path_id)
-6754 {
-6755 trace!(%path_id, "closing path from previous round");
-6756 let _ = self.close_path_inner(
-6757 now,
-6758 path_id,
-6759 PathAbandonReason::NatTraversalRoundAborted,
-6760 );
-6761 }
-6762 }
-6763
-6764 let mut err = None;
-6765
-6766 let mut path_ids = Vec::with_capacity(addresses_to_probe.len());
-6767 let mut probed_addresses = Vec::with_capacity(addresses_to_probe.len());
-6768
-6769 for (id, address) in addresses_to_probe {
-6770 match self.open_nat_traversal_path(now, address) {
-6771 Ok(None) => {}
-6772 Ok(Some((path_id, remote))) => {
-6773 path_ids.push(path_id);
-6774 probed_addresses.push(remote);
-6775 }
-6776 Err(e) => {
-6777 self.iroh_hp
-6778 .client_side_mut()
-6779 .expect("validated")
-6780 .report_in_continuation(id, e);
-6781 err.get_or_insert(e);
-6782 }
-6783 }
-6784 }
-6785
-6786 if let Some(err) = err {
-6787 // We failed to probe any addresses, bail out
-6788 if probed_addresses.is_empty() {
-6789 return Err(iroh_hp::Error::Multipath(err));
-6790 }
-6791 }
-6792
-6793 self.iroh_hp
-6794 .client_side_mut()
-6795 .expect("connection side validated")
-6796 .set_round_path_ids(path_ids);
-6797
-6798 Ok(probed_addresses)
-6799 }
-6800
-6801 /// Attempts to continue a nat traversal round by trying to open paths for pending client probes.
-6802 ///
-6803 /// If there was nothing to do, it returns `None`. Otherwise it returns whether the path was
-6804 /// successfully open.
-6805 fn continue_nat_traversal_round(&mut self, now: Instant) -> Option<bool> {
-6806 let ipv6 = self.is_ipv6();
-6807 let client_state = self.iroh_hp.client_side_mut().ok()?;
-6808 let (id, address) = client_state.continue_nat_traversal_round(ipv6)?;
-6809 let open_result = self.open_nat_traversal_path(now, address);
-6810 let client_state = self.iroh_hp.client_side_mut().expect("validated");
-6811 match open_result {
-6812 Ok(None) => Some(true),
-6813 Ok(Some((path_id, _remote))) => {
-6814 client_state.add_round_path_id(path_id);
-6815 Some(true)
-6816 }
-6817 Err(e) => {
-6818 client_state.report_in_continuation(id, e);
-6819 Some(false)
+6714 /// A nat traversal round involves advertising the client's local addresses in `REACH_OUT`
+6715 /// frames, and initiating probing of the known remote addresses. When a new round is
+6716 /// initiated, the previous one is cancelled, and paths that have not been opened are closed.
+6717 ///
+6718 /// Returns the server addresses that are now being probed.
+6719 /// If addresses fail due to spurious errors, these might succeed later and not be returned in
+6720 /// this set.
+6721 pub fn initiate_nat_traversal_round(
+6722 &mut self,
+6723 now: Instant,
+6724 ) -> Result<Vec<SocketAddr>, iroh_hp::Error> {
+6725 if self.state.is_closed() {
+6726 return Err(iroh_hp::Error::Closed);
+6727 }
+6728
+6729 let ipv6 = self.is_ipv6();
+6730 let client_state = self.iroh_hp.client_side_mut()?;
+6731 let iroh_hp::NatTraversalRound {
+6732 new_round,
+6733 reach_out_at,
+6734 addresses_to_probe,
+6735 prev_round_path_ids,
+6736 } = client_state.initiate_nat_traversal_round(ipv6)?;
+6737
+6738 trace!(%new_round, reach_out=reach_out_at.len(), to_probe=addresses_to_probe.len(),
+6739 "initiating nat traversal round");
+6740
+6741 self.spaces[SpaceId::Data].pending.reach_out = Some((new_round, reach_out_at));
+6742
+6743 for path_id in prev_round_path_ids {
+6744 let Some(path) = self.path(path_id) else {
+6745 continue;
+6746 };
+6747 let ip = path.network_path.remote.ip();
+6748 let port = path.network_path.remote.port();
+6749
+6750 // We only close paths that aren't validated (thus are working) that we opened
+6751 // in a previous round.
+6752 // And we only close paths that we don't want to probe anyways.
+6753 if !addresses_to_probe
+6754 .iter()
+6755 .any(|(_, probe)| *probe == (ip, port))
+6756 && !path.validated
+6757 && !self.abandoned_paths.contains(&path_id)
+6758 {
+6759 trace!(%path_id, "closing path from previous round");
+6760 let _ = self.close_path_inner(
+6761 now,
+6762 path_id,
+6763 PathAbandonReason::NatTraversalRoundAborted,
+6764 );
+6765 }
+6766 }
+6767
+6768 let mut err = None;
+6769
+6770 let mut path_ids = Vec::with_capacity(addresses_to_probe.len());
+6771 let mut probed_addresses = Vec::with_capacity(addresses_to_probe.len());
+6772
+6773 for (id, address) in addresses_to_probe {
+6774 match self.open_nat_traversal_path(now, address) {
+6775 Ok(None) => {}
+6776 Ok(Some((path_id, remote))) => {
+6777 path_ids.push(path_id);
+6778 probed_addresses.push(remote);
+6779 }
+6780 Err(e) => {
+6781 self.iroh_hp
+6782 .client_side_mut()
+6783 .expect("validated")
+6784 .report_in_continuation(id, e);
+6785 err.get_or_insert(e);
+6786 }
+6787 }
+6788 }
+6789
+6790 if let Some(err) = err {
+6791 // We failed to probe any addresses, bail out
+6792 if probed_addresses.is_empty() {
+6793 return Err(iroh_hp::Error::Multipath(err));
+6794 }
+6795 }
+6796
+6797 self.iroh_hp
+6798 .client_side_mut()
+6799 .expect("connection side validated")
+6800 .set_round_path_ids(path_ids);
+6801
+6802 Ok(probed_addresses)
+6803 }
+6804
+6805 /// Attempts to continue a nat traversal round by trying to open paths for pending client probes.
+6806 ///
+6807 /// If there was nothing to do, it returns `None`. Otherwise it returns whether the path was
+6808 /// successfully open.
+6809 fn continue_nat_traversal_round(&mut self, now: Instant) -> Option<bool> {
+6810 let ipv6 = self.is_ipv6();
+6811 let client_state = self.iroh_hp.client_side_mut().ok()?;
+6812 let (id, address) = client_state.continue_nat_traversal_round(ipv6)?;
+6813 let open_result = self.open_nat_traversal_path(now, address);
+6814 let client_state = self.iroh_hp.client_side_mut().expect("validated");
+6815 match open_result {
+6816 Ok(None) => Some(true),
+6817 Ok(Some((path_id, _remote))) => {
+6818 client_state.add_round_path_id(path_id);
+6819 Some(true)
6820 }
-6821 }
-6822 }
-6823}
-6824
-6825/// Hints when the caller identifies a network change.
-6826pub trait NetworkChangeHint: std::fmt::Debug + 'static {
-6827 /// Inform the connection if a path may recover after a network change.
-6828 ///
-6829 /// After network changes, paths may not be recoverable. In this case, waiting for the path to
-6830 /// become idle may take longer than what is desirable. If [`Self::is_path_recoverable`]
-6831 /// returns `false`, a multipath-enabled, client-side connection will establish a new path to
-6832 /// the same remote, closing the current one, instead of migrating the path.
-6833 ///
-6834 /// Paths that are deemed recoverable will simply be sent a PING for a liveness check.
-6835 fn is_path_recoverable(&self, path_id: PathId, network_path: FourTuple) -> bool;
-6836}
-6837
-6838impl fmt::Debug for Connection {
-6839 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-6840 f.debug_struct("Connection")
-6841 .field("handshake_cid", &self.handshake_cid)
-6842 .finish()
-6843 }
-6844}
-6845
-6846#[derive(Debug, Copy, Clone, PartialEq, Eq)]
-6847enum PathBlocked {
-6848 No,
-6849 AntiAmplification,
-6850 Congestion,
-6851 Pacing,
-6852}
-6853
-6854/// Fields of `Connection` specific to it being client-side or server-side
-6855enum ConnectionSide {
-6856 Client {
-6857 /// Sent in every outgoing Initial packet. Always empty after Initial keys are discarded
-6858 token: Bytes,
-6859 token_store: Arc<dyn TokenStore>,
-6860 server_name: String,
-6861 },
-6862 Server {
-6863 server_config: Arc<ServerConfig>,
-6864 },
-6865}
-6866
-6867impl ConnectionSide {
-6868 fn remote_may_migrate(&self, state: &State) -> bool {
-6869 match self {
-6870 Self::Server { server_config } => server_config.migration,
-6871 Self::Client { .. } => {
-6872 if let Some(hs) = state.as_handshake() {
-6873 hs.allow_server_migration
-6874 } else {
-6875 false
-6876 }
-6877 }
-6878 }
-6879 }
-6880
-6881 fn is_client(&self) -> bool {
-6882 self.side().is_client()
+6821 Err(e) => {
+6822 client_state.report_in_continuation(id, e);
+6823 Some(false)
+6824 }
+6825 }
+6826 }
+6827}
+6828
+6829/// Hints when the caller identifies a network change.
+6830pub trait NetworkChangeHint: std::fmt::Debug + 'static {
+6831 /// Inform the connection if a path may recover after a network change.
+6832 ///
+6833 /// After network changes, paths may not be recoverable. In this case, waiting for the path to
+6834 /// become idle may take longer than what is desirable. If [`Self::is_path_recoverable`]
+6835 /// returns `false`, a multipath-enabled, client-side connection will establish a new path to
+6836 /// the same remote, closing the current one, instead of migrating the path.
+6837 ///
+6838 /// Paths that are deemed recoverable will simply be sent a PING for a liveness check.
+6839 fn is_path_recoverable(&self, path_id: PathId, network_path: FourTuple) -> bool;
+6840}
+6841
+6842impl fmt::Debug for Connection {
+6843 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+6844 f.debug_struct("Connection")
+6845 .field("handshake_cid", &self.handshake_cid)
+6846 .finish()
+6847 }
+6848}
+6849
+6850#[derive(Debug, Copy, Clone, PartialEq, Eq)]
+6851enum PathBlocked {
+6852 No,
+6853 AntiAmplification,
+6854 Congestion,
+6855 Pacing,
+6856}
+6857
+6858/// Fields of `Connection` specific to it being client-side or server-side
+6859enum ConnectionSide {
+6860 Client {
+6861 /// Sent in every outgoing Initial packet. Always empty after Initial keys are discarded
+6862 token: Bytes,
+6863 token_store: Arc<dyn TokenStore>,
+6864 server_name: String,
+6865 },
+6866 Server {
+6867 server_config: Arc<ServerConfig>,
+6868 },
+6869}
+6870
+6871impl ConnectionSide {
+6872 fn remote_may_migrate(&self, state: &State) -> bool {
+6873 match self {
+6874 Self::Server { server_config } => server_config.migration,
+6875 Self::Client { .. } => {
+6876 if let Some(hs) = state.as_handshake() {
+6877 hs.allow_server_migration
+6878 } else {
+6879 false
+6880 }
+6881 }
+6882 }
6883 }
6884
-6885 fn is_server(&self) -> bool {
-6886 self.side().is_server()
+6885 fn is_client(&self) -> bool {
+6886 self.side().is_client()
6887 }
6888
-6889 fn side(&self) -> Side {
-6890 match *self {
-6891 Self::Client { .. } => Side::Client,
-6892 Self::Server { .. } => Side::Server,
-6893 }
-6894 }
-6895}
-6896
-6897impl From<SideArgs> for ConnectionSide {
-6898 fn from(side: SideArgs) -> Self {
-6899 match side {
-6900 SideArgs::Client {
-6901 token_store,
-6902 server_name,
-6903 } => Self::Client {
-6904 token: token_store.take(&server_name).unwrap_or_default(),
+6889 fn is_server(&self) -> bool {
+6890 self.side().is_server()
+6891 }
+6892
+6893 fn side(&self) -> Side {
+6894 match *self {
+6895 Self::Client { .. } => Side::Client,
+6896 Self::Server { .. } => Side::Server,
+6897 }
+6898 }
+6899}
+6900
+6901impl From<SideArgs> for ConnectionSide {
+6902 fn from(side: SideArgs) -> Self {
+6903 match side {
+6904 SideArgs::Client {
6905 token_store,
6906 server_name,
-6907 },
-6908 SideArgs::Server {
-6909 server_config,
-6910 pref_addr_cid: _,
-6911 path_validated: _,
-6912 } => Self::Server { server_config },
-6913 }
-6914 }
-6915}
-6916
-6917/// Parameters to `Connection::new` specific to it being client-side or server-side
-6918pub(crate) enum SideArgs {
-6919 Client {
-6920 token_store: Arc<dyn TokenStore>,
-6921 server_name: String,
-6922 },
-6923 Server {
-6924 server_config: Arc<ServerConfig>,
-6925 pref_addr_cid: Option<ConnectionId>,
-6926 path_validated: bool,
-6927 },
-6928}
-6929
-6930impl SideArgs {
-6931 pub(crate) fn pref_addr_cid(&self) -> Option<ConnectionId> {
-6932 match *self {
-6933 Self::Client { .. } => None,
-6934 Self::Server { pref_addr_cid, .. } => pref_addr_cid,
-6935 }
-6936 }
-6937
-6938 pub(crate) fn path_validated(&self) -> bool {
-6939 match *self {
-6940 Self::Client { .. } => true,
-6941 Self::Server { path_validated, .. } => path_validated,
-6942 }
-6943 }
-6944
-6945 pub(crate) fn side(&self) -> Side {
-6946 match *self {
-6947 Self::Client { .. } => Side::Client,
-6948 Self::Server { .. } => Side::Server,
-6949 }
-6950 }
-6951}
-6952
-6953/// Reasons why a connection might be lost
-6954#[derive(Debug, Error, Clone, PartialEq, Eq)]
-6955pub enum ConnectionError {
-6956 /// The peer doesn't implement any supported version
-6957 #[error("peer doesn't implement any supported version")]
-6958 VersionMismatch,
-6959 /// The peer violated the QUIC specification as understood by this implementation
-6960 #[error(transparent)]
-6961 TransportError(#[from] TransportError),
-6962 /// The peer's QUIC stack aborted the connection automatically
-6963 #[error("aborted by peer: {0}")]
-6964 ConnectionClosed(frame::ConnectionClose),
-6965 /// The peer closed the connection
-6966 #[error("closed by peer: {0}")]
-6967 ApplicationClosed(frame::ApplicationClose),
-6968 /// The peer is unable to continue processing this connection, usually due to having restarted
-6969 #[error("reset by peer")]
-6970 Reset,
-6971 /// Communication with the peer has lapsed for longer than the negotiated idle timeout
-6972 ///
-6973 /// If neither side is sending keep-alives, a connection will time out after a long enough idle
-6974 /// period even if the peer is still reachable. See also [`TransportConfig::max_idle_timeout()`]
-6975 /// and [`TransportConfig::keep_alive_interval()`].
-6976 #[error("timed out")]
-6977 TimedOut,
-6978 /// The local application closed the connection
-6979 #[error("closed")]
-6980 LocallyClosed,
-6981 /// The connection could not be created because not enough of the CID space is available
-6982 ///
-6983 /// Try using longer connection IDs.
-6984 #[error("CIDs exhausted")]
-6985 CidsExhausted,
-6986}
-6987
-6988impl From<Close> for ConnectionError {
-6989 fn from(x: Close) -> Self {
-6990 match x {
-6991 Close::Connection(reason) => Self::ConnectionClosed(reason),
-6992 Close::Application(reason) => Self::ApplicationClosed(reason),
-6993 }
-6994 }
-6995}
-6996
-6997// For compatibility with API consumers
-6998impl From<ConnectionError> for io::Error {
-6999 fn from(x: ConnectionError) -> Self {
-7000 use ConnectionError::*;
-7001 let kind = match x {
-7002 TimedOut => io::ErrorKind::TimedOut,
-7003 Reset => io::ErrorKind::ConnectionReset,
-7004 ApplicationClosed(_) | ConnectionClosed(_) => io::ErrorKind::ConnectionAborted,
-7005 TransportError(_) | VersionMismatch | LocallyClosed | CidsExhausted => {
-7006 io::ErrorKind::Other
-7007 }
-7008 };
-7009 Self::new(kind, x)
-7010 }
-7011}
-7012
-7013/// Errors that might trigger a path being closed
-7014// TODO(@divma): maybe needs to be reworked based on what we want to do with the public API
-7015#[derive(Debug, Error, PartialEq, Eq, Clone, Copy)]
-7016pub enum PathError {
-7017 /// The extension was not negotiated with the peer
-7018 #[error("multipath extension not negotiated")]
-7019 MultipathNotNegotiated,
-7020 /// Paths can only be opened client-side
-7021 #[error("the server side may not open a path")]
-7022 ServerSideNotAllowed,
-7023 /// Current limits do not allow us to open more paths
-7024 #[error("maximum number of concurrent paths reached")]
-7025 MaxPathIdReached,
-7026 /// No remote CIDs available to open a new path
-7027 #[error("remoted CIDs exhausted")]
-7028 RemoteCidsExhausted,
-7029 /// Path could not be validated and will be abandoned
-7030 #[error("path validation failed")]
-7031 ValidationFailed,
-7032 /// The remote address for the path is not supported by the endpoint
-7033 #[error("invalid remote address")]
-7034 InvalidRemoteAddress(SocketAddr),
-7035}
-7036
-7037/// Errors triggered when abandoning a path
-7038#[derive(Debug, Error, Clone, Eq, PartialEq)]
-7039pub enum ClosePathError {
-7040 /// Multipath is not negotiated
-7041 #[error("Multipath extension not negotiated")]
-7042 MultipathNotNegotiated,
-7043 /// The path is already closed or was never opened
-7044 #[error("closed path")]
-7045 ClosedPath,
-7046 /// This is the last path, which can not be abandoned
-7047 #[error("last open path")]
-7048 LastOpenPath,
-7049}
-7050
-7051/// Error when the multipath extension was not negotiated, but attempted to be used.
-7052#[derive(Debug, Error, Clone, Copy)]
-7053#[error("Multipath extension not negotiated")]
-7054pub struct MultipathNotNegotiated {
-7055 _private: (),
-7056}
-7057
-7058/// Events of interest to the application
-7059#[derive(Debug)]
-7060pub enum Event {
-7061 /// The connection's handshake data is ready
-7062 HandshakeDataReady,
-7063 /// The connection was successfully established
-7064 Connected,
-7065 /// The TLS handshake was confirmed
-7066 HandshakeConfirmed,
-7067 /// The connection was lost
-7068 ///
-7069 /// Emitted if the peer closes the connection or an error is encountered.
-7070 ConnectionLost {
-7071 /// Reason that the connection was closed
-7072 reason: ConnectionError,
-7073 },
-7074 /// Stream events
-7075 Stream(StreamEvent),
-7076 /// One or more application datagrams have been received
-7077 DatagramReceived,
-7078 /// One or more application datagrams have been sent after blocking
-7079 DatagramsUnblocked,
-7080 /// (Multi)Path events
-7081 Path(PathEvent),
-7082 /// Iroh's nat traversal events
-7083 NatTraversal(iroh_hp::Event),
-7084}
-7085
-7086impl From<PathEvent> for Event {
-7087 fn from(source: PathEvent) -> Self {
-7088 Self::Path(source)
-7089 }
-7090}
-7091
-7092fn get_max_ack_delay(params: &TransportParameters) -> Duration {
-7093 Duration::from_micros(params.max_ack_delay.0 * 1000)
+6907 } => Self::Client {
+6908 token: token_store.take(&server_name).unwrap_or_default(),
+6909 token_store,
+6910 server_name,
+6911 },
+6912 SideArgs::Server {
+6913 server_config,
+6914 pref_addr_cid: _,
+6915 path_validated: _,
+6916 } => Self::Server { server_config },
+6917 }
+6918 }
+6919}
+6920
+6921/// Parameters to `Connection::new` specific to it being client-side or server-side
+6922pub(crate) enum SideArgs {
+6923 Client {
+6924 token_store: Arc<dyn TokenStore>,
+6925 server_name: String,
+6926 },
+6927 Server {
+6928 server_config: Arc<ServerConfig>,
+6929 pref_addr_cid: Option<ConnectionId>,
+6930 path_validated: bool,
+6931 },
+6932}
+6933
+6934impl SideArgs {
+6935 pub(crate) fn pref_addr_cid(&self) -> Option<ConnectionId> {
+6936 match *self {
+6937 Self::Client { .. } => None,
+6938 Self::Server { pref_addr_cid, .. } => pref_addr_cid,
+6939 }
+6940 }
+6941
+6942 pub(crate) fn path_validated(&self) -> bool {
+6943 match *self {
+6944 Self::Client { .. } => true,
+6945 Self::Server { path_validated, .. } => path_validated,
+6946 }
+6947 }
+6948
+6949 pub(crate) fn side(&self) -> Side {
+6950 match *self {
+6951 Self::Client { .. } => Side::Client,
+6952 Self::Server { .. } => Side::Server,
+6953 }
+6954 }
+6955}
+6956
+6957/// Reasons why a connection might be lost
+6958#[derive(Debug, Error, Clone, PartialEq, Eq)]
+6959pub enum ConnectionError {
+6960 /// The peer doesn't implement any supported version
+6961 #[error("peer doesn't implement any supported version")]
+6962 VersionMismatch,
+6963 /// The peer violated the QUIC specification as understood by this implementation
+6964 #[error(transparent)]
+6965 TransportError(#[from] TransportError),
+6966 /// The peer's QUIC stack aborted the connection automatically
+6967 #[error("aborted by peer: {0}")]
+6968 ConnectionClosed(frame::ConnectionClose),
+6969 /// The peer closed the connection
+6970 #[error("closed by peer: {0}")]
+6971 ApplicationClosed(frame::ApplicationClose),
+6972 /// The peer is unable to continue processing this connection, usually due to having restarted
+6973 #[error("reset by peer")]
+6974 Reset,
+6975 /// Communication with the peer has lapsed for longer than the negotiated idle timeout
+6976 ///
+6977 /// If neither side is sending keep-alives, a connection will time out after a long enough idle
+6978 /// period even if the peer is still reachable. See also [`TransportConfig::max_idle_timeout()`]
+6979 /// and [`TransportConfig::keep_alive_interval()`].
+6980 #[error("timed out")]
+6981 TimedOut,
+6982 /// The local application closed the connection
+6983 #[error("closed")]
+6984 LocallyClosed,
+6985 /// The connection could not be created because not enough of the CID space is available
+6986 ///
+6987 /// Try using longer connection IDs.
+6988 #[error("CIDs exhausted")]
+6989 CidsExhausted,
+6990}
+6991
+6992impl From<Close> for ConnectionError {
+6993 fn from(x: Close) -> Self {
+6994 match x {
+6995 Close::Connection(reason) => Self::ConnectionClosed(reason),
+6996 Close::Application(reason) => Self::ApplicationClosed(reason),
+6997 }
+6998 }
+6999}
+7000
+7001// For compatibility with API consumers
+7002impl From<ConnectionError> for io::Error {
+7003 fn from(x: ConnectionError) -> Self {
+7004 use ConnectionError::*;
+7005 let kind = match x {
+7006 TimedOut => io::ErrorKind::TimedOut,
+7007 Reset => io::ErrorKind::ConnectionReset,
+7008 ApplicationClosed(_) | ConnectionClosed(_) => io::ErrorKind::ConnectionAborted,
+7009 TransportError(_) | VersionMismatch | LocallyClosed | CidsExhausted => {
+7010 io::ErrorKind::Other
+7011 }
+7012 };
+7013 Self::new(kind, x)
+7014 }
+7015}
+7016
+7017/// Errors that might trigger a path being closed
+7018// TODO(@divma): maybe needs to be reworked based on what we want to do with the public API
+7019#[derive(Debug, Error, PartialEq, Eq, Clone, Copy)]
+7020pub enum PathError {
+7021 /// The extension was not negotiated with the peer
+7022 #[error("multipath extension not negotiated")]
+7023 MultipathNotNegotiated,
+7024 /// Paths can only be opened client-side
+7025 #[error("the server side may not open a path")]
+7026 ServerSideNotAllowed,
+7027 /// Current limits do not allow us to open more paths
+7028 #[error("maximum number of concurrent paths reached")]
+7029 MaxPathIdReached,
+7030 /// No remote CIDs available to open a new path
+7031 #[error("remoted CIDs exhausted")]
+7032 RemoteCidsExhausted,
+7033 /// Path could not be validated and will be abandoned
+7034 #[error("path validation failed")]
+7035 ValidationFailed,
+7036 /// The remote address for the path is not supported by the endpoint
+7037 #[error("invalid remote address")]
+7038 InvalidRemoteAddress(SocketAddr),
+7039}
+7040
+7041/// Errors triggered when abandoning a path
+7042#[derive(Debug, Error, Clone, Eq, PartialEq)]
+7043pub enum ClosePathError {
+7044 /// Multipath is not negotiated
+7045 #[error("Multipath extension not negotiated")]
+7046 MultipathNotNegotiated,
+7047 /// The path is already closed or was never opened
+7048 #[error("closed path")]
+7049 ClosedPath,
+7050 /// This is the last path, which can not be abandoned
+7051 #[error("last open path")]
+7052 LastOpenPath,
+7053}
+7054
+7055/// Error when the multipath extension was not negotiated, but attempted to be used.
+7056#[derive(Debug, Error, Clone, Copy)]
+7057#[error("Multipath extension not negotiated")]
+7058pub struct MultipathNotNegotiated {
+7059 _private: (),
+7060}
+7061
+7062/// Events of interest to the application
+7063#[derive(Debug)]
+7064pub enum Event {
+7065 /// The connection's handshake data is ready
+7066 HandshakeDataReady,
+7067 /// The connection was successfully established
+7068 Connected,
+7069 /// The TLS handshake was confirmed
+7070 HandshakeConfirmed,
+7071 /// The connection was lost
+7072 ///
+7073 /// Emitted if the peer closes the connection or an error is encountered.
+7074 ConnectionLost {
+7075 /// Reason that the connection was closed
+7076 reason: ConnectionError,
+7077 },
+7078 /// Stream events
+7079 Stream(StreamEvent),
+7080 /// One or more application datagrams have been received
+7081 DatagramReceived,
+7082 /// One or more application datagrams have been sent after blocking
+7083 DatagramsUnblocked,
+7084 /// (Multi)Path events
+7085 Path(PathEvent),
+7086 /// Iroh's nat traversal events
+7087 NatTraversal(iroh_hp::Event),
+7088}
+7089
+7090impl From<PathEvent> for Event {
+7091 fn from(source: PathEvent) -> Self {
+7092 Self::Path(source)
+7093 }
7094}
7095
-7096// Prevents overflow and improves behavior in extreme circumstances
-7097const MAX_BACKOFF_EXPONENT: u32 = 16;
-7098
-7099/// Minimal remaining size to allow packet coalescing, excluding cryptographic tag
-7100///
-7101/// This must be at least as large as the header for a well-formed empty packet to be coalesced,
-7102/// plus some space for frames. We only care about handshake headers because short header packets
-7103/// necessarily have smaller headers, and initial packets are only ever the first packet in a
-7104/// datagram (because we coalesce in ascending packet space order and the only reason to split a
-7105/// packet is when packet space changes).
-7106const MIN_PACKET_SPACE: usize = MAX_HANDSHAKE_OR_0RTT_HEADER_SIZE + 32;
-7107
-7108/// Largest amount of space that could be occupied by a Handshake or 0-RTT packet's header
-7109///
-7110/// Excludes packet-type-specific fields such as packet number or Initial token
-7111// https://www.rfc-editor.org/rfc/rfc9000.html#name-0-rtt: flags + version + dcid len + dcid +
-7112// scid len + scid + length + pn
-7113const MAX_HANDSHAKE_OR_0RTT_HEADER_SIZE: usize =
-7114 1 + 4 + 1 + MAX_CID_SIZE + 1 + MAX_CID_SIZE + VarInt::from_u32(u16::MAX as u32).size() + 4;
-7115
-7116#[derive(Default)]
-7117struct SentFrames {
-7118 retransmits: ThinRetransmits,
-7119 /// The packet number of the largest acknowledged packet for each path
-7120 largest_acked: FxHashMap<PathId, u64>,
-7121 stream_frames: StreamMetaVec,
-7122 /// Whether the packet contains non-retransmittable frames (like datagrams)
-7123 non_retransmits: bool,
-7124 /// If the datagram containing these frames should be padded to the min MTU
-7125 requires_padding: bool,
-7126}
-7127
-7128impl SentFrames {
-7129 /// Returns whether the packet contains only ACKs
-7130 fn is_ack_only(&self, streams: &StreamsState) -> bool {
-7131 !self.largest_acked.is_empty()
-7132 && !self.non_retransmits
-7133 && self.stream_frames.is_empty()
-7134 && self.retransmits.is_empty(streams)
-7135 }
-7136
-7137 fn retransmits_mut(&mut self) -> &mut Retransmits {
-7138 self.retransmits.get_or_create()
+7096fn get_max_ack_delay(params: &TransportParameters) -> Duration {
+7097 Duration::from_micros(params.max_ack_delay.0 * 1000)
+7098}
+7099
+7100// Prevents overflow and improves behavior in extreme circumstances
+7101const MAX_BACKOFF_EXPONENT: u32 = 16;
+7102
+7103/// Minimal remaining size to allow packet coalescing, excluding cryptographic tag
+7104///
+7105/// This must be at least as large as the header for a well-formed empty packet to be coalesced,
+7106/// plus some space for frames. We only care about handshake headers because short header packets
+7107/// necessarily have smaller headers, and initial packets are only ever the first packet in a
+7108/// datagram (because we coalesce in ascending packet space order and the only reason to split a
+7109/// packet is when packet space changes).
+7110const MIN_PACKET_SPACE: usize = MAX_HANDSHAKE_OR_0RTT_HEADER_SIZE + 32;
+7111
+7112/// Largest amount of space that could be occupied by a Handshake or 0-RTT packet's header
+7113///
+7114/// Excludes packet-type-specific fields such as packet number or Initial token
+7115// https://www.rfc-editor.org/rfc/rfc9000.html#name-0-rtt: flags + version + dcid len + dcid +
+7116// scid len + scid + length + pn
+7117const MAX_HANDSHAKE_OR_0RTT_HEADER_SIZE: usize =
+7118 1 + 4 + 1 + MAX_CID_SIZE + 1 + MAX_CID_SIZE + VarInt::from_u32(u16::MAX as u32).size() + 4;
+7119
+7120#[derive(Default)]
+7121struct SentFrames {
+7122 retransmits: ThinRetransmits,
+7123 /// The packet number of the largest acknowledged packet for each path
+7124 largest_acked: FxHashMap<PathId, u64>,
+7125 stream_frames: StreamMetaVec,
+7126 /// Whether the packet contains non-retransmittable frames (like datagrams)
+7127 non_retransmits: bool,
+7128 /// If the datagram containing these frames should be padded to the min MTU
+7129 requires_padding: bool,
+7130}
+7131
+7132impl SentFrames {
+7133 /// Returns whether the packet contains only ACKs
+7134 fn is_ack_only(&self, streams: &StreamsState) -> bool {
+7135 !self.largest_acked.is_empty()
+7136 && !self.non_retransmits
+7137 && self.stream_frames.is_empty()
+7138 && self.retransmits.is_empty(streams)
7139 }
7140
-7141 fn record_sent_frame(&mut self, frame: frame::EncodableFrame<'_>) {
-7142 use frame::EncodableFrame::*;
-7143 match frame {
-7144 PathAck(path_ack_encoder) => {
-7145 if let Some(max) = path_ack_encoder.ranges.max() {
-7146 self.largest_acked.insert(path_ack_encoder.path_id, max);
-7147 }
-7148 }
-7149 Ack(ack_encoder) => {
-7150 if let Some(max) = ack_encoder.ranges.max() {
-7151 self.largest_acked.insert(PathId::ZERO, max);
-7152 }
-7153 }
-7154 Close(_) => { /* non retransmittable, but after this we don't really care */ }
-7155 PathResponse(_) => self.non_retransmits = true,
-7156 HandshakeDone(_) => self.retransmits_mut().handshake_done = true,
-7157 ReachOut(frame::ReachOut { round, ip, port }) => self
-7158 .retransmits_mut()
-7159 .reach_out
-7160 .get_or_insert_with(|| (round, Vec::new()))
-7161 .1
-7162 .push((ip, port)),
-7163 ObservedAddr(_) => self.retransmits_mut().observed_addr = true,
-7164 Ping(_) => self.non_retransmits = true,
-7165 ImmediateAck(_) => self.non_retransmits = true,
-7166 AckFrequency(_) => self.retransmits_mut().ack_frequency = true,
-7167 PathChallenge(_) => self.non_retransmits = true,
-7168 Crypto(crypto) => self.retransmits_mut().crypto.push_back(crypto),
-7169 PathAbandon(path_abandon) => {
-7170 self.retransmits_mut()
-7171 .path_abandon
-7172 .entry(path_abandon.path_id)
-7173 .or_insert(path_abandon.error_code);
-7174 }
-7175 PathStatusAvailable(frame::PathStatusAvailable { path_id, .. })
-7176 | PathStatusBackup(frame::PathStatusBackup { path_id, .. }) => {
-7177 self.retransmits_mut().path_status.insert(path_id);
+7141 fn retransmits_mut(&mut self) -> &mut Retransmits {
+7142 self.retransmits.get_or_create()
+7143 }
+7144
+7145 fn record_sent_frame(&mut self, frame: frame::EncodableFrame<'_>) {
+7146 use frame::EncodableFrame::*;
+7147 match frame {
+7148 PathAck(path_ack_encoder) => {
+7149 if let Some(max) = path_ack_encoder.ranges.max() {
+7150 self.largest_acked.insert(path_ack_encoder.path_id, max);
+7151 }
+7152 }
+7153 Ack(ack_encoder) => {
+7154 if let Some(max) = ack_encoder.ranges.max() {
+7155 self.largest_acked.insert(PathId::ZERO, max);
+7156 }
+7157 }
+7158 Close(_) => { /* non retransmittable, but after this we don't really care */ }
+7159 PathResponse(_) => self.non_retransmits = true,
+7160 HandshakeDone(_) => self.retransmits_mut().handshake_done = true,
+7161 ReachOut(frame::ReachOut { round, ip, port }) => self
+7162 .retransmits_mut()
+7163 .reach_out
+7164 .get_or_insert_with(|| (round, Vec::new()))
+7165 .1
+7166 .push((ip, port)),
+7167 ObservedAddr(_) => self.retransmits_mut().observed_addr = true,
+7168 Ping(_) => self.non_retransmits = true,
+7169 ImmediateAck(_) => self.non_retransmits = true,
+7170 AckFrequency(_) => self.retransmits_mut().ack_frequency = true,
+7171 PathChallenge(_) => self.non_retransmits = true,
+7172 Crypto(crypto) => self.retransmits_mut().crypto.push_back(crypto),
+7173 PathAbandon(path_abandon) => {
+7174 self.retransmits_mut()
+7175 .path_abandon
+7176 .entry(path_abandon.path_id)
+7177 .or_insert(path_abandon.error_code);
7178 }
-7179 MaxPathId(_) => self.retransmits_mut().max_path_id = true,
-7180 PathsBlocked(_) => self.retransmits_mut().paths_blocked = true,
-7181 PathCidsBlocked(path_cids_blocked) => {
-7182 self.retransmits_mut()
-7183 .path_cids_blocked
-7184 .insert(path_cids_blocked.path_id);
-7185 }
-7186 ResetStream(reset) => self
-7187 .retransmits_mut()
-7188 .reset_stream
-7189 .push((reset.id, reset.error_code)),
-7190 StopSending(stop_sending) => self.retransmits_mut().stop_sending.push(stop_sending),
-7191 NewConnectionId(new_cid) => self.retransmits_mut().new_cids.push(new_cid.issued()),
-7192 RetireConnectionId(retire_cid) => self
-7193 .retransmits_mut()
-7194 .retire_cids
-7195 .push((retire_cid.path_id.unwrap_or_default(), retire_cid.sequence)),
-7196 Datagram(_) => self.non_retransmits = true,
-7197 NewToken(_) => {}
-7198 AddAddress(add_address) => {
-7199 self.retransmits_mut().add_address.insert(add_address);
-7200 }
-7201 RemoveAddress(remove_address) => {
-7202 self.retransmits_mut().remove_address.insert(remove_address);
-7203 }
-7204 StreamMeta(stream_meta_encoder) => self.stream_frames.push(stream_meta_encoder.meta),
-7205 MaxData(_) => self.retransmits_mut().max_data = true,
-7206 MaxStreamData(max) => {
-7207 self.retransmits_mut().max_stream_data.insert(max.id);
-7208 }
-7209 MaxStreams(max_streams) => {
-7210 self.retransmits_mut().max_stream_id[max_streams.dir as usize] = true
-7211 }
-7212 }
-7213 }
-7214}
-7215
-7216/// Compute the negotiated idle timeout based on local and remote max_idle_timeout transport parameters.
-7217///
-7218/// According to the definition of max_idle_timeout, a value of `0` means the timeout is disabled; see <https://www.rfc-editor.org/rfc/rfc9000#section-18.2-4.4.1.>
-7219///
-7220/// According to the negotiation procedure, either the minimum of the timeouts or one specified is used as the negotiated value; see <https://www.rfc-editor.org/rfc/rfc9000#section-10.1-2.>
+7179 PathStatusAvailable(frame::PathStatusAvailable { path_id, .. })
+7180 | PathStatusBackup(frame::PathStatusBackup { path_id, .. }) => {
+7181 self.retransmits_mut().path_status.insert(path_id);
+7182 }
+7183 MaxPathId(_) => self.retransmits_mut().max_path_id = true,
+7184 PathsBlocked(_) => self.retransmits_mut().paths_blocked = true,
+7185 PathCidsBlocked(path_cids_blocked) => {
+7186 self.retransmits_mut()
+7187 .path_cids_blocked
+7188 .insert(path_cids_blocked.path_id);
+7189 }
+7190 ResetStream(reset) => self
+7191 .retransmits_mut()
+7192 .reset_stream
+7193 .push((reset.id, reset.error_code)),
+7194 StopSending(stop_sending) => self.retransmits_mut().stop_sending.push(stop_sending),
+7195 NewConnectionId(new_cid) => self.retransmits_mut().new_cids.push(new_cid.issued()),
+7196 RetireConnectionId(retire_cid) => self
+7197 .retransmits_mut()
+7198 .retire_cids
+7199 .push((retire_cid.path_id.unwrap_or_default(), retire_cid.sequence)),
+7200 Datagram(_) => self.non_retransmits = true,
+7201 NewToken(_) => {}
+7202 AddAddress(add_address) => {
+7203 self.retransmits_mut().add_address.insert(add_address);
+7204 }
+7205 RemoveAddress(remove_address) => {
+7206 self.retransmits_mut().remove_address.insert(remove_address);
+7207 }
+7208 StreamMeta(stream_meta_encoder) => self.stream_frames.push(stream_meta_encoder.meta),
+7209 MaxData(_) => self.retransmits_mut().max_data = true,
+7210 MaxStreamData(max) => {
+7211 self.retransmits_mut().max_stream_data.insert(max.id);
+7212 }
+7213 MaxStreams(max_streams) => {
+7214 self.retransmits_mut().max_stream_id[max_streams.dir as usize] = true
+7215 }
+7216 }
+7217 }
+7218}
+7219
+7220/// Compute the negotiated idle timeout based on local and remote max_idle_timeout transport parameters.
7221///
-7222/// Returns the negotiated idle timeout as a `Duration`, or `None` when both endpoints have opted out of idle timeout.
-7223fn negotiate_max_idle_timeout(x: Option<VarInt>, y: Option<VarInt>) -> Option<Duration> {
-7224 match (x, y) {
-7225 (Some(VarInt(0)) | None, Some(VarInt(0)) | None) => None,
-7226 (Some(VarInt(0)) | None, Some(y)) => Some(Duration::from_millis(y.0)),
-7227 (Some(x), Some(VarInt(0)) | None) => Some(Duration::from_millis(x.0)),
-7228 (Some(x), Some(y)) => Some(Duration::from_millis(cmp::min(x, y).0)),
-7229 }
-7230}
-7231
-7232#[cfg(test)]
-7233mod tests {
-7234 use super::*;
+7222/// According to the definition of max_idle_timeout, a value of `0` means the timeout is disabled; see <https://www.rfc-editor.org/rfc/rfc9000#section-18.2-4.4.1.>
+7223///
+7224/// According to the negotiation procedure, either the minimum of the timeouts or one specified is used as the negotiated value; see <https://www.rfc-editor.org/rfc/rfc9000#section-10.1-2.>
+7225///
+7226/// Returns the negotiated idle timeout as a `Duration`, or `None` when both endpoints have opted out of idle timeout.
+7227fn negotiate_max_idle_timeout(x: Option<VarInt>, y: Option<VarInt>) -> Option<Duration> {
+7228 match (x, y) {
+7229 (Some(VarInt(0)) | None, Some(VarInt(0)) | None) => None,
+7230 (Some(VarInt(0)) | None, Some(y)) => Some(Duration::from_millis(y.0)),
+7231 (Some(x), Some(VarInt(0)) | None) => Some(Duration::from_millis(x.0)),
+7232 (Some(x), Some(y)) => Some(Duration::from_millis(cmp::min(x, y).0)),
+7233 }
+7234}
7235
-7236 #[test]
-7237 fn negotiate_max_idle_timeout_commutative() {
-7238 let test_params = [
-7239 (None, None, None),
-7240 (None, Some(VarInt(0)), None),
-7241 (None, Some(VarInt(2)), Some(Duration::from_millis(2))),
-7242 (Some(VarInt(0)), Some(VarInt(0)), None),
-7243 (
-7244 Some(VarInt(2)),
-7245 Some(VarInt(0)),
-7246 Some(Duration::from_millis(2)),
-7247 ),
-7248 (
-7249 Some(VarInt(1)),
-7250 Some(VarInt(4)),
-7251 Some(Duration::from_millis(1)),
-7252 ),
-7253 ];
-7254
-7255 for (left, right, result) in test_params {
-7256 assert_eq!(negotiate_max_idle_timeout(left, right), result);
-7257 assert_eq!(negotiate_max_idle_timeout(right, left), result);
-7258 }
-7259 }
-7260}
\ No newline at end of file
+7236#[cfg(test)]
+7237mod tests {
+7238 use super::*;
+7239
+7240 #[test]
+7241 fn negotiate_max_idle_timeout_commutative() {
+7242 let test_params = [
+7243 (None, None, None),
+7244 (None, Some(VarInt(0)), None),
+7245 (None, Some(VarInt(2)), Some(Duration::from_millis(2))),
+7246 (Some(VarInt(0)), Some(VarInt(0)), None),
+7247 (
+7248 Some(VarInt(2)),
+7249 Some(VarInt(0)),
+7250 Some(Duration::from_millis(2)),
+7251 ),
+7252 (
+7253 Some(VarInt(1)),
+7254 Some(VarInt(4)),
+7255 Some(Duration::from_millis(1)),
+7256 ),
+7257 ];
+7258
+7259 for (left, right, result) in test_params {
+7260 assert_eq!(negotiate_max_idle_timeout(left, right), result);
+7261 assert_eq!(negotiate_max_idle_timeout(right, left), result);
+7262 }
+7263 }
+7264}
\ No newline at end of file