From: Stephen-Seo Date: Thu, 9 Sep 2021 09:12:17 +0000 (+0000) Subject: deploy: 6e39e6dc1631d8682e76d9e50b4e612940f366a6 X-Git-Url: https://git.seodisparate.com/stephenseo/static/gitweb.css?a=commitdiff_plain;h=1e0b1188babc832136c03064639d7908c2578898;p=UDPConnection deploy: 6e39e6dc1631d8682e76d9e50b4e612940f366a6 --- diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/UDPC_8h.html b/UDPC_8h.html new file mode 100644 index 0000000..72e9219 --- /dev/null +++ b/UDPC_8h.html @@ -0,0 +1,1832 @@ + + + + + + + +UDPConnection: src/UDPC.h File Reference + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+ +
+
UDPC.h File Reference
+
+
+ +

Public API for UDPConnection. +More...

+
#include <winsock2.h>
+#include <Ws2ipdef.h>
+#include <In6addr.h>
+#include <stdint.h>
+
+

Go to the source code of this file.

+ + + + + + + + + + + + + +

+Data Structures

struct  UDPC_ConnectionId
 Data identifying a peer via addr, port, and scope_id. More...
 
struct  UDPC_PacketInfo
 Data representing a received/sent packet. More...
 
struct  UDPC_Event
 A struct containing information related to the type of event. More...
 
union  UDPC_Event::Value
 
+ + + + + + +

+Macros

+#define UDPC_PACKET_MAX_SIZE   8192
 The maximum size of a UDP packet.
 
+#define UDPC_DEFAULT_PROTOCOL_ID   1357924680
 
+ + + + + + + + + + + + + + + + + + + +

+Typedefs

+typedef struct UDPC_Context * UDPC_HContext
 
+typedef enum UDPC_EXPORT UDPC_LoggingType UDPC_LoggingType
 
typedef enum UDPC_EXPORT UDPC_AuthPolicy UDPC_AuthPolicy
 
typedef struct UDPC_EXPORT UDPC_ConnectionId UDPC_ConnectionId
 Data identifying a peer via addr, port, and scope_id. More...
 
typedef struct UDPC_EXPORT UDPC_PacketInfo UDPC_PacketInfo
 Data representing a received/sent packet. More...
 
typedef enum UDPC_EXPORT UDPC_EventType UDPC_EventType
 An enum describing the type of event. More...
 
typedef struct UDPC_EXPORT UDPC_Event UDPC_Event
 A struct containing information related to the type of event. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

UDPC_EXPORT UDPC_ConnectionId UDPC_create_id (UDPC_IPV6_ADDR_TYPE addr, uint16_t port)
 Creates an UDPC_ConnectionId with the given addr and port. More...
 
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_full (UDPC_IPV6_ADDR_TYPE addr, uint32_t scope_id, uint16_t port)
 Creates an UDPC_ConnectionId with the given addr, scope_id, and port. More...
 
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_anyaddr (uint16_t port)
 Creates an UDPC_ConnectionId with the given port. More...
 
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_easy (const char *addrString, uint16_t port)
 Creates an UDPC_ConnectionId with the given addr string and port. More...
 
+UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_hostname (const char *hostname, uint16_t port)
 
UDPC_EXPORT UDPC_HContext UDPC_init (UDPC_ConnectionId listenId, int isClient, int isUsingLibsodium)
 Creates an UDPC_HContext that holds state for connections. More...
 
UDPC_EXPORT UDPC_HContext UDPC_init_threaded_update (UDPC_ConnectionId listenId, int isClient, int isUsingLibsodium)
 Creates an UDPC_HContext that holds state for connections that auto-updates via a thread. More...
 
UDPC_EXPORT UDPC_HContext UDPC_init_threaded_update_ms (UDPC_ConnectionId listenId, int isClient, int updateMS, int isUsingLibsodium)
 Creates an UDPC_HContext that holds state for connections that auto-updates via a thread at a specified interval. More...
 
UDPC_EXPORT int UDPC_enable_threaded_update (UDPC_HContext ctx)
 Enables auto updating on a separate thread for the given UDPC_HContext. More...
 
UDPC_EXPORT int UDPC_enable_threaded_update_ms (UDPC_HContext ctx, int updateMS)
 Enables auto updating on a separate thread for the given UDPC_HContext with the specified update interval. More...
 
UDPC_EXPORT int UDPC_disable_threaded_update (UDPC_HContext ctx)
 Disables auto updating on a separate thread for the given UDPC_HContext. More...
 
UDPC_EXPORT int UDPC_is_valid_context (UDPC_HContext ctx)
 Checks if the given UDPC_HContext is valid (successfully initialized) More...
 
UDPC_EXPORT void UDPC_destroy (UDPC_HContext ctx)
 Cleans up the UDPC_HContext. More...
 
UDPC_EXPORT void UDPC_update (UDPC_HContext ctx)
 Updates the context. More...
 
UDPC_EXPORT void UDPC_client_initiate_connection (UDPC_HContext ctx, UDPC_ConnectionId connectionId, int enableLibSodium)
 Initiate a connection to a server peer. More...
 
UDPC_EXPORT void UDPC_queue_send (UDPC_HContext ctx, UDPC_ConnectionId destinationId, int isChecked, const void *data, uint32_t size)
 Queues a packet to be sent to the specified peer. More...
 
UDPC_EXPORT unsigned long UDPC_get_queue_send_current_size (UDPC_HContext ctx)
 Gets the size of the data structure holding queued packets. More...
 
UDPC_EXPORT unsigned long UDPC_get_queued_size (UDPC_HContext ctx, UDPC_ConnectionId id, int *exists)
 Gets the size of a connection's queue of queued packets. More...
 
UDPC_EXPORT unsigned long UDPC_get_max_queued_size ()
 Gets the size limit of a connection's queue of queued packets. More...
 
UDPC_EXPORT int UDPC_set_accept_new_connections (UDPC_HContext ctx, int isAccepting)
 Set whether or not the UDPC context will accept new connections. More...
 
UDPC_EXPORT void UDPC_drop_connection (UDPC_HContext ctx, UDPC_ConnectionId connectionId, int dropAllWithAddr)
 Drops an existing connection to a peer. More...
 
UDPC_EXPORT int UDPC_has_connection (UDPC_HContext ctx, UDPC_ConnectionId connectionId)
 Checks if a connection exists to the peer identified by the given connectionId. More...
 
UDPC_EXPORT UDPC_ConnectionIdUDPC_get_list_connected (UDPC_HContext ctx, unsigned int *size)
 Gets a dynamically allocated array of connected peers' identifiers. More...
 
UDPC_EXPORT void UDPC_free_list_connected (UDPC_ConnectionId *list)
 Cleans up a dynamically allocated array of connected peers' identifiers. More...
 
UDPC_EXPORT uint32_t UDPC_get_protocol_id (UDPC_HContext ctx)
 Gets the protocol id of the UDPC context. More...
 
UDPC_EXPORT uint32_t UDPC_set_protocol_id (UDPC_HContext ctx, uint32_t id)
 Sets the protocol id of the UDPC context. More...
 
UDPC_EXPORT UDPC_LoggingType UDPC_get_logging_type (UDPC_HContext ctx)
 Gets the logging type of the UDPC context. More...
 
UDPC_EXPORT UDPC_LoggingType UDPC_set_logging_type (UDPC_HContext ctx, UDPC_LoggingType loggingType)
 Sets the logging type of the UDPC context. More...
 
UDPC_EXPORT int UDPC_get_receiving_events (UDPC_HContext ctx)
 Returns non-zero if the UDPC context will record events. More...
 
UDPC_EXPORT int UDPC_set_receiving_events (UDPC_HContext ctx, int isReceivingEvents)
 Sets whether or not UDPC will record events. More...
 
UDPC_EXPORT UDPC_Event UDPC_get_event (UDPC_HContext ctx, unsigned long *remaining)
 Gets a recorded event. More...
 
UDPC_EXPORT UDPC_PacketInfo UDPC_get_received (UDPC_HContext ctx, unsigned long *remaining)
 Get a received packet from a given UDPC context. More...
 
UDPC_EXPORT void UDPC_free_PacketInfo (UDPC_PacketInfo pInfo)
 Frees a UDPC_PacketInfo. More...
 
UDPC_EXPORT int UDPC_set_libsodium_keys (UDPC_HContext ctx, const unsigned char *sk, const unsigned char *pk)
 Sets public/private keys used for packet verification. More...
 
UDPC_EXPORT int UDPC_set_libsodium_key_easy (UDPC_HContext ctx, const unsigned char *sk)
 Sets the public/private keys used for packet verification. More...
 
UDPC_EXPORT int UDPC_unset_libsodium_keys (UDPC_HContext ctx)
 Removes set keys if any used for packet verification. More...
 
UDPC_EXPORT int UDPC_add_whitelist_pk (UDPC_HContext ctx, const unsigned char *pk)
 Adds a public key to the whitelist. More...
 
UDPC_EXPORT int UDPC_has_whitelist_pk (UDPC_HContext ctx, const unsigned char *pk)
 Checks if a public key is in the whitelist. More...
 
UDPC_EXPORT int UDPC_remove_whitelist_pk (UDPC_HContext ctx, const unsigned char *pk)
 Removes a public key from the whitelist. More...
 
UDPC_EXPORT int UDPC_clear_whitelist (UDPC_HContext ctx)
 Clears the public key whitelist. More...
 
UDPC_EXPORT int UDPC_get_auth_policy (UDPC_HContext ctx)
 Gets how peers are handled regarding public key verification. More...
 
UDPC_EXPORT int UDPC_set_auth_policy (UDPC_HContext ctx, int value)
 Sets how peers are handled regarding public key verification. More...
 
+UDPC_EXPORT const char * UDPC_atostr_cid (UDPC_HContext ctx, UDPC_ConnectionId connectionId)
 
+UDPC_EXPORT const char * UDPC_atostr (UDPC_HContext ctx, UDPC_IPV6_ADDR_TYPE addr)
 
+UDPC_EXPORT UDPC_IPV6_ADDR_TYPE UDPC_strtoa (const char *addrStr)
 addrStr must be a valid ipv6 address or a valid ipv4 address
 
+UDPC_EXPORT UDPC_IPV6_ADDR_TYPE UDPC_strtoa_link (const char *addrStr, uint32_t *linkId_out)
 
+UDPC_EXPORT UDPC_IPV6_ADDR_TYPE UDPC_a4toa6 (uint32_t a4_be)
 
+UDPC_EXPORT int UDPC_is_big_endian ()
 
+UDPC_EXPORT uint16_t UDPC_no16i (uint16_t i)
 
+UDPC_EXPORT uint32_t UDPC_no32i (uint32_t i)
 
+UDPC_EXPORT uint64_t UDPC_no64i (uint64_t i)
 
+UDPC_EXPORT float UDPC_no32f (float f)
 
+UDPC_EXPORT double UDPC_no64f (double f)
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Variables

UDPC_SILENT
 Does not log anything.
 
UDPC_ERROR
 Only log errors.
 
UDPC_WARNING
 Log errors and warnings.
 
UDPC_INFO
 Log errors, warnings, and info.
 
UDPC_VERBOSE
 Log errors, warning, info, and verbose.
 
UDPC_AUTH_POLICY_FALLBACK =0
 All peers will not be denied regardless of use of public key verification.
 
UDPC_AUTH_POLICY_STRICT
 Only peers with public key verification will be allowed.
 
UDPC_ET_NONE
 
UDPC_ET_REQUEST_CONNECT
 
UDPC_ET_REQUEST_DISCONNECT
 
UDPC_ET_CONNECTED
 
UDPC_ET_DISCONNECTED
 
UDPC_ET_FAIL_CONNECT
 
UDPC_ET_GOOD_MODE
 
+

Detailed Description

+

Public API for UDPConnection.

+

Typedef Documentation

+ +

◆ UDPC_AuthPolicy

+ +
+
+ + + + +
enum UDPC_EXPORT UDPC_AuthPolicy
+
+

Note auth policy will only take effect if public key verification of packets is enabled (if libsodium is enabled).

+ +
+
+ +

◆ UDPC_ConnectionId

+ +
+
+ + + + +
typedef struct UDPC_EXPORT UDPC_ConnectionId UDPC_ConnectionId
+
+ +

Data identifying a peer via addr, port, and scope_id.

+

This struct needn't be used directly; use UDPC_create_id(), UDPC_create_id_full(), UDPC_create_id_anyaddr(), or UDPC_create_id_easy() to create one. This struct does not hold dynamic data, so there is no need to free it.

+ +
+
+ +

◆ UDPC_Event

+ +
+
+ + + + +
typedef struct UDPC_EXPORT UDPC_Event UDPC_Event
+
+ +

A struct containing information related to the type of event.

+

Note that instances of this struct received from a call to UDPC_get_event() will not store any useful data in its union member variable v (it will only be used internally). Thus, all events received through a call to UDPC_get_event() will contain a valid UDPC_ConnectionId conId that identifies the peer that the event is referring to.

+ +
+
+ +

◆ UDPC_EventType

+ +
+
+ + + + +
enum UDPC_EXPORT UDPC_EventType
+
+ +

An enum describing the type of event.

+

Note that only the following values will be presented when using UDPC_get_event()

    +
  • UDPC_ET_NONE: No events have ocurred
  • +
  • UDPC_ET_CONNECTED: A peer has initiated a connection
  • +
  • UDPC_ET_DISCONNECTED: A peer has disconnected
  • +
  • UDPC_ET_FAIL_CONNECT: Failed to establish a connection to server peer
  • +
  • UDPC_ET_GOOD_MODE: The connection has switched to "good mode"
  • +
  • UDPC_ET_BAD_MODE: The connection has switched to "bad mode"
  • +
+

The other unmentioned enum values are used internally, and should never be returned in a call to UDPC_get_event().

+

All events returned by UDPC_get_event() will have set the member variable conId in the UDPC_Event which refers to the peer with which the event ocurred.

+ +
+
+ +

◆ UDPC_PacketInfo

+ +
+
+ + + + +
typedef struct UDPC_EXPORT UDPC_PacketInfo UDPC_PacketInfo
+
+ +

Data representing a received/sent packet.

+

If data is NULL or dataSize is 0, then this packet is invalid.

+
Warning
This struct must be free'd with a call to UDPC_free_PacketInfo to avoid a memory leak.
+ +
+
+

Function Documentation

+ +

◆ UDPC_add_whitelist_pk()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_add_whitelist_pk (UDPC_HContext ctx,
const unsigned char * pk 
)
+
+ +

Adds a public key to the whitelist.

+

By default the whitelist is empty and any peer regardless of key will not be denied connection.

+

This function adds one public key to the whitelist. If the whitelist is not empty, then all peers that do not have the matching public key will be denied connection.

+

Note that public key verification will not occur if it is not enabled during the call to UDPC_init().

+
Returns
The size of the whitelist on success, zero otherwise
+ +
+
+ +

◆ UDPC_clear_whitelist()

+ +
+
+ + + + + + + + +
UDPC_EXPORT int UDPC_clear_whitelist (UDPC_HContext ctx)
+
+ +

Clears the public key whitelist.

+

If the whitelist is empty, then no connections will be denied.

+

If there are keys in the whitelist, then new connections will only be allowed if the peer uses a public key in the whitelist.

+

Note that public key verification will not occur if it is not enabled during the call to UDPC_init().

+
Returns
Zero if the context is invalid or libsodium is not enabled, non-zero if the whitelist was successfully cleared
+ +
+
+ +

◆ UDPC_client_initiate_connection()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
UDPC_EXPORT void UDPC_client_initiate_connection (UDPC_HContext ctx,
UDPC_ConnectionId connectionId,
int enableLibSodium 
)
+
+ +

Initiate a connection to a server peer.

+

Note that this function does nothing on a server context.

+
Parameters
+ + + + +
ctxThe context to initiate a connection from
connectionIdThe server peer to initiate a connection to
enableLibSodiumIf packet headers should be verified with the server peer (Fails if UDPC was not compiled with libsodium support)
+
+
+ +
+
+ +

◆ UDPC_create_id()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id (UDPC_IPV6_ADDR_TYPE addr,
uint16_t port 
)
+
+ +

Creates an UDPC_ConnectionId with the given addr and port.

+

port should be in native byte order (not network/big-endian). This means that there is no need to convert the 16-bit value to network byte order, this will be done automatically by this library when necessary (without modifying the value in the used UDPC_ConnectionId).

+
Returns
An initialized UDPC_ConnectionId
+ +
+
+ +

◆ UDPC_create_id_anyaddr()

+ +
+
+ + + + + + + + +
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_anyaddr (uint16_t port)
+
+ +

Creates an UDPC_ConnectionId with the given port.

+

The address contained in the returned UDPC_ConnectionId will be zeroed out (the "anyaddr" address). port should be in native byte order (not network/big-endian).

+
Returns
An initialized UDPC_ConnectionId
+ +
+
+ +

◆ UDPC_create_id_easy()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_easy (const char * addrString,
uint16_t port 
)
+
+ +

Creates an UDPC_ConnectionId with the given addr string and port.

+

The address string should be a valid ipv6 or ipv4 address. (If an ipv4 address is given, the internal address of the returned UDPC_ConnectionId will be ipv4-mapped ipv6 address.) port should be in native byte order (not network/big-endian).

+
Returns
An initialized UDPC_ConnectionId
+ +
+
+ +

◆ UDPC_create_id_full()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_full (UDPC_IPV6_ADDR_TYPE addr,
uint32_t scope_id,
uint16_t port 
)
+
+ +

Creates an UDPC_ConnectionId with the given addr, scope_id, and port.

+

port should be in native byte order (not network/big-endian).

+
Returns
An initialized UDPC_ConnectionId
+ +
+
+ +

◆ UDPC_destroy()

+ +
+
+ + + + + + + + +
UDPC_EXPORT void UDPC_destroy (UDPC_HContext ctx)
+
+ +

Cleans up the UDPC_HContext.

+

If auto updating was enabled for the given context, it will gracefully stop the thread before cleaning up the context.

+
Warning
This function must be called after a UDPC_HContext is no longer used to avoid memory leaks.
+ +
+
+ +

◆ UDPC_disable_threaded_update()

+ +
+
+ + + + + + + + +
UDPC_EXPORT int UDPC_disable_threaded_update (UDPC_HContext ctx)
+
+ +

Disables auto updating on a separate thread for the given UDPC_HContext.

+
Parameters
+ + +
ctxThe context to disable auto updating for
+
+
+
Returns
non-zero if auto updating is disabled. If the context already had auto updating disabled, this function will return zero.
+ +
+
+ +

◆ UDPC_drop_connection()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
UDPC_EXPORT void UDPC_drop_connection (UDPC_HContext ctx,
UDPC_ConnectionId connectionId,
int dropAllWithAddr 
)
+
+ +

Drops an existing connection to a peer.

+

Note that UDPC will send a disconnect packet to the peer before removing the internal connection data handling the connection to that peer.

+
Parameters
+ + + + +
ctxThe UDPC context
connectionIdThe identifier of the peer to disconnect from
dropAllWithAddrSet to non-zero to drop all peers with the ip address specified in connectionId
+
+
+ +
+
+ +

◆ UDPC_enable_threaded_update()

+ +
+
+ + + + + + + + +
UDPC_EXPORT int UDPC_enable_threaded_update (UDPC_HContext ctx)
+
+ +

Enables auto updating on a separate thread for the given UDPC_HContext.

+

By default, the update interval is set to 8 milliseconds.

+
Parameters
+ + +
ctxThe context to enable auto updating for
+
+
+
Returns
non-zero if auto updating is enabled. If the context already had auto updating enabled, this function will return zero.
+ +
+
+ +

◆ UDPC_enable_threaded_update_ms()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_enable_threaded_update_ms (UDPC_HContext ctx,
int updateMS 
)
+
+ +

Enables auto updating on a separate thread for the given UDPC_HContext with the specified update interval.

+
Parameters
+ + + +
ctxThe context to enable auto updating for
updateMSThe interval to update at in milliseconds (clamped at a minimum of 4 ms and a maximum of 333 ms)
+
+
+
Returns
non-zero if auto updating is enabled. If the context already had auto updating enabled, this function will return zero.
+ +
+
+ +

◆ UDPC_free_list_connected()

+ +
+
+ + + + + + + + +
UDPC_EXPORT void UDPC_free_list_connected (UDPC_ConnectionIdlist)
+
+ +

Cleans up a dynamically allocated array of connected peers' identifiers.

+
Parameters
+ + +
listThe array to clean up
+
+
+ +
+
+ +

◆ UDPC_free_PacketInfo()

+ +
+
+ + + + + + + + +
UDPC_EXPORT void UDPC_free_PacketInfo (UDPC_PacketInfo pInfo)
+
+ +

Frees a UDPC_PacketInfo.

+

Internally, the member variable UDPC_PacketInfo::data will be free'd and set to NULL and UDPC_PacketInfo::dataSize will be set to 0 if the given packet is valid.

+ +
+
+ +

◆ UDPC_get_auth_policy()

+ +
+
+ + + + + + + + +
UDPC_EXPORT int UDPC_get_auth_policy (UDPC_HContext ctx)
+
+ +

Gets how peers are handled regarding public key verification.

+

If libsodium is enabled and the auth policy is "strict", then peers attempting to connect will be denied if they do not have public key verification enabled. Otherwise if the auth policy is "fallback", then peers will not be denied a connection regardless of whether or not they use public key verification of packets.

+

Note that public key verification will not occur if it is not enabled during the call to UDPC_init().

+
Returns
The current auth policy (see UDPC_AuthPolicy) , or zero on fail
+ +
+
+ +

◆ UDPC_get_event()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_Event UDPC_get_event (UDPC_HContext ctx,
unsigned long * remaining 
)
+
+ +

Gets a recorded event.

+

See UDPC_EventType for possible types of a UDPC_Event.

+
Parameters
+ + + +
ctxThe UDPC context
remainingPointer to set the number of remaining events that can be returned
+
+
+
Returns
An UDPC_Event (will be of type UDPC_ET_NONE if there are no more events)
+ +
+
+ +

◆ UDPC_get_list_connected()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_ConnectionId* UDPC_get_list_connected (UDPC_HContext ctx,
unsigned int * size 
)
+
+ +

Gets a dynamically allocated array of connected peers' identifiers.

+

Note that an additional element is appended to the array that is initialized with all fields to zero.

+
Warning
One must call UDPC_free_list_connected() with the returned array to clean up data to avoid a memory leak
+
Parameters
+ + + +
ctxThe UDPC context
sizePointer to an unsigned int to set the size of the returned array (set to NULL to not get a size)
+
+
+
Returns
A dynamically allocated array of identifiers
+ +
+
+ +

◆ UDPC_get_logging_type()

+ +
+
+ + + + + + + + +
UDPC_EXPORT UDPC_LoggingType UDPC_get_logging_type (UDPC_HContext ctx)
+
+ +

Gets the logging type of the UDPC context.

+

See UDPC_LoggingType for possible values.

+
Parameters
+ + +
ctxThe UDPC context
+
+
+
Returns
The logging type of the UDPC context
+ +
+
+ +

◆ UDPC_get_max_queued_size()

+ +
+
+ + + + + + + +
UDPC_EXPORT unsigned long UDPC_get_max_queued_size ()
+
+ +

Gets the size limit of a connection's queue of queued packets.

+

Note that a call to this function does not use any locks, as the limit is known at compile time and is the same for all UDPC connections.

+
Returns
The size limit of a connection's queue
+ +
+
+ +

◆ UDPC_get_protocol_id()

+ +
+
+ + + + + + + + +
UDPC_EXPORT uint32_t UDPC_get_protocol_id (UDPC_HContext ctx)
+
+ +

Gets the protocol id of the UDPC context.

+

UDPC uses the protocol id by prefixing every sent packet with it. Other UDPC instances will only accept packets with the same protocol id.

+

One can use UDPC_set_protocol_id() to change it.

+
Parameters
+ + +
ctxThe UDPC context
+
+
+
Returns
The protocol id of the given UDPC context
+ +
+
+ +

◆ UDPC_get_queue_send_current_size()

+ +
+
+ + + + + + + + +
UDPC_EXPORT unsigned long UDPC_get_queue_send_current_size (UDPC_HContext ctx)
+
+ +

Gets the size of the data structure holding queued packets.

+

Note that a UDPC context holds a different data structure per established connection that holds a limited amount of packets to send. If a connection's queue is full, it will not be removed from the main queue that this function (and UDPC_queue_send()) uses. The queue that this function refers to does not have an imposed limit as it is implemented as a thread-safe linked list (data is dynamically stored on the heap) and access to this data structure is faster than accessing a connection's internal queue. Also note that this queue holds packets for all connections this context maintains. Thus if one connection has free space, then it may partially remove packets only destined for that connection from the queue this function refers to.

+
Returns
The size of the queue
+ +
+
+ +

◆ UDPC_get_queued_size()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
UDPC_EXPORT unsigned long UDPC_get_queued_size (UDPC_HContext ctx,
UDPC_ConnectionId id,
int * exists 
)
+
+ +

Gets the size of a connection's queue of queued packets.

+

Note that a UDPC context holds a queue per established connection that holds a limited amount of packets to send. This function checks a connection's internal queue, but must do so after locking an internal mutex (a call to UDPC_update() will lock this mutex, regardless of whether or not the context is using threaded update).

+

If exists is a non-null pointer to an int, and a connection to a peer identified by id exists, then the value of exists will be set to non-zero, otherwise a non-existing peer will set the value of exists to zero.

+
Returns
The size of a connection's queue
+ +
+
+ +

◆ UDPC_get_received()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_PacketInfo UDPC_get_received (UDPC_HContext ctx,
unsigned long * remaining 
)
+
+ +

Get a received packet from a given UDPC context.

+
Warning
The received packet (if valid) must be free'd with a call to UDPC_free_PacketInfo() to avoid a memory leak.
+ +
+
+ +

◆ UDPC_get_receiving_events()

+ +
+
+ + + + + + + + +
UDPC_EXPORT int UDPC_get_receiving_events (UDPC_HContext ctx)
+
+ +

Returns non-zero if the UDPC context will record events.

+

Events that have ocurred can by polled by calling UDPC_get_event()

+
Parameters
+ + +
ctxThe UDPC context
+
+
+
Returns
non-zero if receiving events
+ +
+
+ +

◆ UDPC_has_connection()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_has_connection (UDPC_HContext ctx,
UDPC_ConnectionId connectionId 
)
+
+ +

Checks if a connection exists to the peer identified by the given connectionId.

+
Parameters
+ + + +
ctxThe UDPC context
connectionIdThe identifier for a peer
+
+
+
Returns
non-zero if a connection to the peer exists
+ +
+
+ +

◆ UDPC_has_whitelist_pk()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_has_whitelist_pk (UDPC_HContext ctx,
const unsigned char * pk 
)
+
+ +

Checks if a public key is in the whitelist.

+

Note that public key verification will not occur if it is not enabled during the call to UDPC_init().

+
Returns
Non-zero if the given public key is in the whitelist
+ +
+
+ +

◆ UDPC_init()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_HContext UDPC_init (UDPC_ConnectionId listenId,
int isClient,
int isUsingLibsodium 
)
+
+ +

Creates an UDPC_HContext that holds state for connections.

+
Parameters
+ + + + +
listenIdThe addr and port to listen on (contained in a UDPC_ConnectionId)
isClientWhether or not this instance is a client or a server
isUsingLibsodiumSet to non-zero if libsodium verification of packets should be enabled (fails if libsodium support was not compiled)
+
+
+

UDPC_is_valid_context() may be used to check if the context was successfully created.

+
Warning
The received UDPC_HContext must be freed with a call to UDPC_destroy().
+
Returns
A UDPC context
+ +
+
+ +

◆ UDPC_init_threaded_update()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_HContext UDPC_init_threaded_update (UDPC_ConnectionId listenId,
int isClient,
int isUsingLibsodium 
)
+
+ +

Creates an UDPC_HContext that holds state for connections that auto-updates via a thread.

+

By default, the update interval is set to 8 milliseconds.

+
Parameters
+ + + + +
listenIdThe addr and port to listen on (contained in a UDPC_ConnectionId)
isClientWhether or not this instance is a client or a server
isUsingLibsodiumSet to non-zero if libsodium verification of packets should be enabled (fails if libsodium support was not compiled)
+
+
+

UDPC_is_valid_context() may be used to check if the context was successfully created.

+
Warning
The received UDPC_HContext must be freed with a call to UDPC_destroy().
+
Returns
A UDPC context
+ +
+
+ +

◆ UDPC_init_threaded_update_ms()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_HContext UDPC_init_threaded_update_ms (UDPC_ConnectionId listenId,
int isClient,
int updateMS,
int isUsingLibsodium 
)
+
+ +

Creates an UDPC_HContext that holds state for connections that auto-updates via a thread at a specified interval.

+
Parameters
+ + + + + +
listenIdThe addr and port to listen on (contained in a UDPC_ConnectionId)
isClientWhether or not this instance is a client or a server
updateMSThe interval to update at in milliseconds (clamped at a minimum of 4 ms and a maximum of 333 ms)
isUsingLibsodiumSet to non-zero if libsodium verification of packets should be enabled (fails if libsodium support was not compiled)
+
+
+

UDPC_is_valid_context() may be used to check if the context was successfully created.

+
Warning
The received UDPC_HContext must be freed with a call to UDPC_destroy().
+
Returns
A UDPC context
+ +
+
+ +

◆ UDPC_is_valid_context()

+ +
+
+ + + + + + + + +
UDPC_EXPORT int UDPC_is_valid_context (UDPC_HContext ctx)
+
+ +

Checks if the given UDPC_HContext is valid (successfully initialized)

+
Returns
non-zero if the given context is valid
+ +
+
+ +

◆ UDPC_queue_send()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UDPC_EXPORT void UDPC_queue_send (UDPC_HContext ctx,
UDPC_ConnectionId destinationId,
int isChecked,
const void * data,
uint32_t size 
)
+
+ +

Queues a packet to be sent to the specified peer.

+

Note that there must already be an established connection with the peer. If a packet is queued for a peer that is not connected, it will be dropped and logged with log-level warning. A client can establish a connection to a server peer via a call to UDPC_client_initiate_connection() or UDPC_client_initiate_connection_pk(). A server must receive an initiate-connection-packet from a client to establish a connection (sent by previously mentioned UDPC_client_initiate_* functions).

+
Parameters
+ + + + + + +
ctxThe context to send a packet on
destinationIdThe peer to send a packet to
isCheckedSet to non-zero if the packet should be re-sent if the peer doesn't receive it
dataA pointer to data to be sent in a packet
sizeThe size in bytes of the data to be sent
+
+
+ +
+
+ +

◆ UDPC_remove_whitelist_pk()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_remove_whitelist_pk (UDPC_HContext ctx,
const unsigned char * pk 
)
+
+ +

Removes a public key from the whitelist.

+

Note that public key verification will not occur if it is not enabled during the call to UDPC_init().

+
Returns
Non-zero if a public key was removed
+ +
+
+ +

◆ UDPC_set_accept_new_connections()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_set_accept_new_connections (UDPC_HContext ctx,
int isAccepting 
)
+
+ +

Set whether or not the UDPC context will accept new connections.

+
Parameters
+ + + +
ctxThe UDPC context
isAcceptingSet to non-zero to accept connections
+
+
+
Returns
The previous setting (1 if accepting, 0 if not)
+ +
+
+ +

◆ UDPC_set_auth_policy()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_set_auth_policy (UDPC_HContext ctx,
int value 
)
+
+ +

Sets how peers are handled regarding public key verification.

+

If libsodium is enabled and the auth policy is "strict", then peers attempting to connect will be denied if they do not have public key verification enabled. Otherwise if the auth policy is "fallback", then peers will not be denied a connection regardless of whether or not they use public key verification of packets.

+

Note that public key verification will not occur if it is not enabled during the call to UDPC_init().

+
Returns
The previous auth policy (see UDPC_AuthPolicy), or zero on fail
+ +
+
+ +

◆ UDPC_set_libsodium_key_easy()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_set_libsodium_key_easy (UDPC_HContext ctx,
const unsigned char * sk 
)
+
+ +

Sets the public/private keys used for packet verification.

+

This function is almost identical with UDPC_set_libsodium_keys, except it will utilize libsodium to generate the associated public key with the given private key.

+

Note that public key verification will not occur if it is not enabled during the call to UDPC_init().

+
Returns
Non-zero if keys were successfully set, zero if context is invalid or libsodium is not enabled
+ +
+
+ +

◆ UDPC_set_libsodium_keys()

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_set_libsodium_keys (UDPC_HContext ctx,
const unsigned char * sk,
const unsigned char * pk 
)
+
+ +

Sets public/private keys used for packet verification.

+

If keys are not set and packet verification is enabled, for each new connection new keys will be generated then used. The auto-generated keys used will be unique per connection. Conversely if keys are set, then new connections will use the given keys.

+

Note that connections established before calling this function will not use the given keys.

+

Note that public key verification will not occur if it is not enabled during the call to UDPC_init().

+
Returns
Non-zero if keys were successfully set, zero if context is invalid or libsodium is not enabled
+ +
+
+ +

◆ UDPC_set_logging_type()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT UDPC_LoggingType UDPC_set_logging_type (UDPC_HContext ctx,
UDPC_LoggingType loggingType 
)
+
+ +

Sets the logging type of the UDPC context.

+

See UDPC_LoggingType for possible values.

+
Parameters
+ + + +
ctxThe UDPC context
loggingTypeThe logging type to set to
+
+
+
Returns
The previously set logging type
+ +
+
+ +

◆ UDPC_set_protocol_id()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT uint32_t UDPC_set_protocol_id (UDPC_HContext ctx,
uint32_t id 
)
+
+ +

Sets the protocol id of the UDPC context.

+

UDPC uses the protocol id by prefixing every sent packet with it. Other UDPC instances will only accept packets with the same protocol id.

+
Parameters
+ + + +
ctxThe UDPC context
idThe new id to use as the protocol id
+
+
+
Returns
The previous protocol id of the UDPC context
+ +
+
+ +

◆ UDPC_set_receiving_events()

+ +
+
+ + + + + + + + + + + + + + + + + + +
UDPC_EXPORT int UDPC_set_receiving_events (UDPC_HContext ctx,
int isReceivingEvents 
)
+
+ +

Sets whether or not UDPC will record events.

+

Events that have ocurred can by polled by calling UDPC_get_event()

+
Parameters
+ + + +
ctxThe UDPC context
isReceivingEventsSet to non-zero to receive events
+
+
+
Returns
non-zero if UDPC was previously receiving events
+ +
+
+ +

◆ UDPC_unset_libsodium_keys()

+ +
+
+ + + + + + + + +
UDPC_EXPORT int UDPC_unset_libsodium_keys (UDPC_HContext ctx)
+
+ +

Removes set keys if any used for packet verification.

+

Note that public key verification will not occur if it is not enabled during the call to UDPC_init().

+
Returns
Zero if context is invalid or libsodium is not enabled
+ +
+
+ +

◆ UDPC_update()

+ +
+
+ + + + + + + + +
UDPC_EXPORT void UDPC_update (UDPC_HContext ctx)
+
+ +

Updates the context.

+

Updating consists of:

    +
  • Checking if peers have timed out
  • +
  • Handling requests to connect to server peers as a client
  • +
  • Sending packets to connected peers
  • +
  • Receiving packets from connected peers
  • +
  • Calculating round-trip-time (RTT) to peers
  • +
  • Checking if a peer has not received a packet and queuing that packet to be resent (this is done by using an ack)
  • +
+

If auto updating was enabled for the context, then there is no need to call this function.

+

Note that the context can only receive at most one packet per call to update (due to the fact that UDPC created its UDP socket to not block on receive checks). This is why it is expected to either call this function several times a second (such as in a game's update loop), or have auto-updating enabled via UDPC_init_threaded_update(), UDPC_init_threaded_update_ms(), UDPC_enable_threaded_update(), or UDPC_enable_threaded_update_ms().

+ +
+
+
+ + + + diff --git a/UDPC_8h_source.html b/UDPC_8h_source.html new file mode 100644 index 0000000..1da0baa --- /dev/null +++ b/UDPC_8h_source.html @@ -0,0 +1,418 @@ + + + + + + + +UDPConnection: src/UDPC.h Source File + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
UDPC.h
+
+
+Go to the documentation of this file.
1 
+
11 #ifndef UDPC_CONNECTION_H
+
12 #define UDPC_CONNECTION_H
+
13 
+
14 #ifndef DOXYGEN_SHOULD_SKIP_THIS
+
15 
+
16 // Determine platform macros
+
17 # define UDPC_PLATFORM_WINDOWS 1
+
18 # define UDPC_PLATFORM_MAC 2
+
19 # define UDPC_PLATFORM_LINUX 3
+
20 # define UDPC_PLATFORM_UNKNOWN 0
+
21 
+
22 # if defined _WIN32
+
23 # define UDPC_PLATFORM UDPC_PLATFORM_WINDOWS
+
24 # elif defined __APPLE__
+
25 # define UDPC_PLATFORM UDPC_PLATFORM_MAC
+
26 # elif defined __linux__
+
27 # define UDPC_PLATFORM UDPC_PLATFORM_LINUX
+
28 # else
+
29 # define UDPC_PLATFORM UDPC_PLATFORM_UNKNOWN
+
30 # endif
+
31 
+
32 #endif // DOXYGEN_SHOULD_SKIP_THIS
+
33 
+
34 // OS-based networking macros
+
35 #if UDPC_PLATFORM == UDPC_PLATFORM_WINDOWS
+
36 # include <winsock2.h>
+
37 # ifdef UDPC_PLATFORM_MINGW
+
38 # include <ws2ipdef.h>
+
39 # include <in6addr.h>
+
40 # else
+
41 # include <Ws2ipdef.h>
+
42 # include <In6addr.h>
+
43 # endif
+
44 
+
45 # ifndef DOXYGEN_SHOULD_SKIP_THIS
+
46 
+
47 # define UDPC_CLEANUPSOCKET(x) closesocket(x)
+
48 # define UDPC_SOCKETTYPE SOCKET
+
49 # define UDPC_IPV6_SOCKADDR_TYPE SOCKADDR_IN6
+
50 # define UDPC_IPV6_ADDR_TYPE IN6_ADDR
+
51 # define UDPC_IPV6_ADDR_SUB(addr) addr.u.Byte
+
52 # define UDPC_SOCKET_RETURN_ERROR(socket) (socket == INVALID_SOCKET)
+
53 
+
54 # endif // DOXYGEN_SHOULD_SKIP_THIS
+
55 
+
56 #elif UDPC_PLATFORM == UDPC_PLATFORM_MAC || UDPC_PLATFORM == UDPC_PLATFORM_LINUX
+
57 # include <fcntl.h>
+
58 # include <netinet/in.h>
+
59 # include <sys/socket.h>
+
60 # include <unistd.h>
+
61 
+
62 # ifndef DOXYGEN_SHOULD_SKIP_THIS
+
63 
+
64 # define UDPC_CLEANUPSOCKET(x) close(x)
+
65 # define UDPC_SOCKETTYPE int
+
66 # define UDPC_IPV6_SOCKADDR_TYPE struct sockaddr_in6
+
67 # define UDPC_IPV6_ADDR_TYPE struct in6_addr
+
68 # define UDPC_IPV6_ADDR_SUB(addr) addr.s6_addr
+
69 # define UDPC_SOCKET_RETURN_ERROR(socket) (socket <= 0)
+
70 
+
71 # endif // DOXYGEN_SHOULD_SKIP_THIS
+
72 
+
73 #else
+
74 # ifndef DOXYGEN_SHOULD_SKIP_THIS
+
75 # define UDPC_CLEANUPSOCKET(x) ((void)0)
+
76 # endif // DOXYGEN_SHOULD_SKIP_THIS
+
77 #endif
+
78 
+
79 // other defines
+
81 #define UDPC_PACKET_MAX_SIZE 8192
+
82 #define UDPC_DEFAULT_PROTOCOL_ID 1357924680 // 0x50f04948
+
83 
+
84 #ifndef DOXYGEN_SHOULD_SKIP_THIS
+
85 
+
86 // other defines continued
+
87 
+
88 # ifndef UDPC_LIBSODIUM_ENABLED
+
89 # ifndef crypto_sign_PUBLICKEYBYTES
+
90 # define crypto_sign_PUBLICKEYBYTES 1
+
91 # endif
+
92 # ifndef crypto_sign_SECRETKEYBYTES
+
93 # define crypto_sign_SECRETKEYBYTES 1
+
94 # endif
+
95 # ifndef crypto_sign_BYTES
+
96 # define crypto_sign_BYTES 1
+
97 # endif
+
98 # endif
+
99 
+
100 # if UDPC_PLATFORM == UDPC_PLATFORM_WINDOWS
+
101 # define UDPC_EXPORT __declspec(dllexport)
+
102 # else
+
103 # define UDPC_EXPORT
+
104 # endif
+
105 
+
106 #endif // DOXYGEN_SHOULD_SKIP_THIS
+
107 
+
108 #ifdef __cplusplus
+
109 # include <cstdint>
+
110 extern "C" {
+
111 #else
+
112 # include <stdint.h>
+
113 #endif
+
114 
+
116 struct UDPC_Context;
+
117 typedef struct UDPC_Context *UDPC_HContext;
+
118 
+
119 typedef enum UDPC_EXPORT UDPC_LoggingType {
+ + + + + +
131  UDPC_DEBUG
+
132 } UDPC_LoggingType;
+
133 
+
136 typedef enum UDPC_EXPORT UDPC_AuthPolicy {
+ + +
141  // Used internally to get max size of enum
+
142  UDPC_AUTH_POLICY_SIZE
+ +
144 
+
153 typedef struct UDPC_EXPORT UDPC_ConnectionId {
+
154  UDPC_IPV6_ADDR_TYPE addr;
+
155  uint32_t scope_id;
+
156  uint16_t port;
+ +
158 
+
167 typedef struct UDPC_EXPORT UDPC_PacketInfo {
+
172  // id is stored at offset 8, size 4 (uint32_t) even for "empty" PktInfos
+
173  char *data;
+
184  uint32_t flags;
+
192  uint32_t id;
+
202  uint16_t dataSize;
+
203  uint16_t rtt;
+ + + +
209 
+
229 typedef enum UDPC_EXPORT UDPC_EventType {
+
230  UDPC_ET_NONE,
+
231  UDPC_ET_REQUEST_CONNECT,
+
232  UDPC_ET_REQUEST_DISCONNECT,
+
233  UDPC_ET_CONNECTED,
+
234  UDPC_ET_DISCONNECTED,
+
235  UDPC_ET_FAIL_CONNECT,
+
236  UDPC_ET_GOOD_MODE,
+
237  UDPC_ET_BAD_MODE
+ +
239 
+
250 typedef struct UDPC_EXPORT UDPC_Event {
+
251  UDPC_EventType type;
+
252  UDPC_ConnectionId conId;
+
253  union Value {
+
254  int dropAllWithAddr;
+
255  int enableLibSodium;
+
256  } v;
+ +
258 
+
269 UDPC_EXPORT UDPC_ConnectionId UDPC_create_id(UDPC_IPV6_ADDR_TYPE addr, uint16_t port);
+
270 
+
278 UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_full(UDPC_IPV6_ADDR_TYPE addr, uint32_t scope_id, uint16_t port);
+
279 
+
289 UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_anyaddr(uint16_t port);
+
290 
+
301 UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_easy(const char *addrString, uint16_t port);
+
302 
+
303 UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_hostname(const char *hostname, uint16_t port);
+
304 
+
321 UDPC_EXPORT UDPC_HContext UDPC_init(UDPC_ConnectionId listenId, int isClient, int isUsingLibsodium);
+
341 UDPC_EXPORT UDPC_HContext UDPC_init_threaded_update(
+
342  UDPC_ConnectionId listenId,
+
343  int isClient,
+
344  int isUsingLibsodium);
+
364 UDPC_EXPORT UDPC_HContext UDPC_init_threaded_update_ms(
+
365  UDPC_ConnectionId listenId,
+
366  int isClient,
+
367  int updateMS,
+
368  int isUsingLibsodium);
+
369 
+
379 UDPC_EXPORT int UDPC_enable_threaded_update(UDPC_HContext ctx);
+
390 UDPC_EXPORT int UDPC_enable_threaded_update_ms(UDPC_HContext ctx, int updateMS);
+
399 UDPC_EXPORT int UDPC_disable_threaded_update(UDPC_HContext ctx);
+
400 
+
406 UDPC_EXPORT int UDPC_is_valid_context(UDPC_HContext ctx);
+
407 
+
417 UDPC_EXPORT void UDPC_destroy(UDPC_HContext ctx);
+
418 
+
441 UDPC_EXPORT void UDPC_update(UDPC_HContext ctx);
+
442 
+ +
454  UDPC_HContext ctx,
+
455  UDPC_ConnectionId connectionId,
+
456  int enableLibSodium);
+
457 
+
476 UDPC_EXPORT void UDPC_queue_send(UDPC_HContext ctx, UDPC_ConnectionId destinationId,
+
477  int isChecked, const void *data, uint32_t size);
+
478 
+
495 UDPC_EXPORT unsigned long UDPC_get_queue_send_current_size(UDPC_HContext ctx);
+
496 
+
513 UDPC_EXPORT unsigned long UDPC_get_queued_size(UDPC_HContext ctx, UDPC_ConnectionId id, int *exists);
+
514 
+
523 UDPC_EXPORT unsigned long UDPC_get_max_queued_size();
+
524 
+
531 UDPC_EXPORT int UDPC_set_accept_new_connections(UDPC_HContext ctx, int isAccepting);
+
532 
+
544 UDPC_EXPORT void UDPC_drop_connection(UDPC_HContext ctx, UDPC_ConnectionId connectionId, int dropAllWithAddr);
+
545 
+
555 UDPC_EXPORT int UDPC_has_connection(UDPC_HContext ctx, UDPC_ConnectionId connectionId);
+
556 
+
571 UDPC_EXPORT UDPC_ConnectionId* UDPC_get_list_connected(UDPC_HContext ctx, unsigned int *size);
+
572 
+ +
578 
+
590 UDPC_EXPORT uint32_t UDPC_get_protocol_id(UDPC_HContext ctx);
+
591 
+
602 UDPC_EXPORT uint32_t UDPC_set_protocol_id(UDPC_HContext ctx, uint32_t id);
+
603 
+
612 UDPC_EXPORT UDPC_LoggingType UDPC_get_logging_type(UDPC_HContext ctx);
+
613 
+
623 UDPC_EXPORT UDPC_LoggingType UDPC_set_logging_type(UDPC_HContext ctx, UDPC_LoggingType loggingType);
+
624 
+
633 UDPC_EXPORT int UDPC_get_receiving_events(UDPC_HContext ctx);
+
634 
+
644 UDPC_EXPORT int UDPC_set_receiving_events(UDPC_HContext ctx, int isReceivingEvents);
+
645 
+
657 UDPC_EXPORT UDPC_Event UDPC_get_event(UDPC_HContext ctx, unsigned long *remaining);
+
658 
+
665 UDPC_EXPORT UDPC_PacketInfo UDPC_get_received(UDPC_HContext ctx, unsigned long *remaining);
+
666 
+
674 UDPC_EXPORT void UDPC_free_PacketInfo(UDPC_PacketInfo pInfo);
+
675 
+
693 UDPC_EXPORT int UDPC_set_libsodium_keys(UDPC_HContext ctx, const unsigned char *sk, const unsigned char *pk);
+
694 
+
708 UDPC_EXPORT int UDPC_set_libsodium_key_easy(UDPC_HContext ctx, const unsigned char *sk);
+
709 
+
718 UDPC_EXPORT int UDPC_unset_libsodium_keys(UDPC_HContext ctx);
+
719 
+
735 UDPC_EXPORT int UDPC_add_whitelist_pk(UDPC_HContext ctx, const unsigned char *pk);
+
736 
+
745 UDPC_EXPORT int UDPC_has_whitelist_pk(UDPC_HContext ctx, const unsigned char *pk);
+
746 
+
755 UDPC_EXPORT int UDPC_remove_whitelist_pk(UDPC_HContext ctx, const unsigned char *pk);
+
756 
+
771 UDPC_EXPORT int UDPC_clear_whitelist(UDPC_HContext ctx);
+
772 
+
787 UDPC_EXPORT int UDPC_get_auth_policy(UDPC_HContext ctx);
+
788 
+
803 UDPC_EXPORT int UDPC_set_auth_policy(UDPC_HContext ctx, int value);
+
804 
+
805 UDPC_EXPORT const char *UDPC_atostr_cid(UDPC_HContext ctx, UDPC_ConnectionId connectionId);
+
806 
+
807 UDPC_EXPORT const char *UDPC_atostr(UDPC_HContext ctx, UDPC_IPV6_ADDR_TYPE addr);
+
808 
+
809 // =============================================================================
+
810 // Helpers
+
811 
+
813 UDPC_EXPORT UDPC_IPV6_ADDR_TYPE UDPC_strtoa(const char *addrStr);
+
814 
+
815 UDPC_EXPORT UDPC_IPV6_ADDR_TYPE UDPC_strtoa_link(const char *addrStr, uint32_t *linkId_out);
+
816 
+
817 UDPC_EXPORT UDPC_IPV6_ADDR_TYPE UDPC_a4toa6(uint32_t a4_be);
+
818 
+
819 UDPC_EXPORT int UDPC_is_big_endian();
+
820 UDPC_EXPORT uint16_t UDPC_no16i(uint16_t i);
+
821 UDPC_EXPORT uint32_t UDPC_no32i(uint32_t i);
+
822 UDPC_EXPORT uint64_t UDPC_no64i(uint64_t i);
+
823 UDPC_EXPORT float UDPC_no32f(float f);
+
824 UDPC_EXPORT double UDPC_no64f(double f);
+
825 
+
826 #ifdef __cplusplus
+
827 }
+
828 #endif
+
829 #endif
+
UDPC_EXPORT uint32_t UDPC_set_protocol_id(UDPC_HContext ctx, uint32_t id)
Sets the protocol id of the UDPC context.
+
UDPC_EXPORT int UDPC_clear_whitelist(UDPC_HContext ctx)
Clears the public key whitelist.
+
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_anyaddr(uint16_t port)
Creates an UDPC_ConnectionId with the given port.
+
UDPC_EXPORT int UDPC_enable_threaded_update(UDPC_HContext ctx)
Enables auto updating on a separate thread for the given UDPC_HContext.
+
UDPC_EXPORT void UDPC_client_initiate_connection(UDPC_HContext ctx, UDPC_ConnectionId connectionId, int enableLibSodium)
Initiate a connection to a server peer.
+
UDPC_EXPORT int UDPC_enable_threaded_update_ms(UDPC_HContext ctx, int updateMS)
Enables auto updating on a separate thread for the given UDPC_HContext with the specified update inte...
+
UDPC_EXPORT unsigned long UDPC_get_queued_size(UDPC_HContext ctx, UDPC_ConnectionId id, int *exists)
Gets the size of a connection's queue of queued packets.
+
enum UDPC_EXPORT UDPC_AuthPolicy UDPC_AuthPolicy
Definition: UDPC.h:136
+
UDPC_INFO
Log errors, warnings, and info.
Definition: UDPC.h:127
+
UDPC_EXPORT UDPC_IPV6_ADDR_TYPE UDPC_strtoa(const char *addrStr)
addrStr must be a valid ipv6 address or a valid ipv4 address
+
UDPC_EXPORT UDPC_Event UDPC_get_event(UDPC_HContext ctx, unsigned long *remaining)
Gets a recorded event.
+
UDPC_EXPORT int UDPC_set_accept_new_connections(UDPC_HContext ctx, int isAccepting)
Set whether or not the UDPC context will accept new connections.
+
UDPC_EXPORT int UDPC_set_receiving_events(UDPC_HContext ctx, int isReceivingEvents)
Sets whether or not UDPC will record events.
+
UDPC_EXPORT int UDPC_disable_threaded_update(UDPC_HContext ctx)
Disables auto updating on a separate thread for the given UDPC_HContext.
+
UDPC_EXPORT void UDPC_drop_connection(UDPC_HContext ctx, UDPC_ConnectionId connectionId, int dropAllWithAddr)
Drops an existing connection to a peer.
+
UDPC_EXPORT int UDPC_has_connection(UDPC_HContext ctx, UDPC_ConnectionId connectionId)
Checks if a connection exists to the peer identified by the given connectionId.
+
UDPC_EXPORT UDPC_HContext UDPC_init_threaded_update(UDPC_ConnectionId listenId, int isClient, int isUsingLibsodium)
Creates an UDPC_HContext that holds state for connections that auto-updates via a thread.
+
UDPC_EXPORT int UDPC_unset_libsodium_keys(UDPC_HContext ctx)
Removes set keys if any used for packet verification.
+
UDPC_EXPORT void UDPC_free_PacketInfo(UDPC_PacketInfo pInfo)
Frees a UDPC_PacketInfo.
+
UDPC_EXPORT void UDPC_update(UDPC_HContext ctx)
Updates the context.
+
UDPC_AUTH_POLICY_STRICT
Only peers with public key verification will be allowed.
Definition: UDPC.h:140
+
UDPC_EXPORT UDPC_LoggingType UDPC_set_logging_type(UDPC_HContext ctx, UDPC_LoggingType loggingType)
Sets the logging type of the UDPC context.
+
UDPC_EXPORT int UDPC_add_whitelist_pk(UDPC_HContext ctx, const unsigned char *pk)
Adds a public key to the whitelist.
+
UDPC_EXPORT void UDPC_queue_send(UDPC_HContext ctx, UDPC_ConnectionId destinationId, int isChecked, const void *data, uint32_t size)
Queues a packet to be sent to the specified peer.
+
UDPC_EXPORT unsigned long UDPC_get_max_queued_size()
Gets the size limit of a connection's queue of queued packets.
+
struct UDPC_EXPORT UDPC_Event UDPC_Event
A struct containing information related to the type of event.
+
UDPC_EXPORT UDPC_ConnectionId * UDPC_get_list_connected(UDPC_HContext ctx, unsigned int *size)
Gets a dynamically allocated array of connected peers' identifiers.
+
UDPC_EXPORT void UDPC_free_list_connected(UDPC_ConnectionId *list)
Cleans up a dynamically allocated array of connected peers' identifiers.
+
UDPC_EXPORT UDPC_HContext UDPC_init(UDPC_ConnectionId listenId, int isClient, int isUsingLibsodium)
Creates an UDPC_HContext that holds state for connections.
+
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_easy(const char *addrString, uint16_t port)
Creates an UDPC_ConnectionId with the given addr string and port.
+
UDPC_EXPORT int UDPC_get_receiving_events(UDPC_HContext ctx)
Returns non-zero if the UDPC context will record events.
+
UDPC_EXPORT int UDPC_set_auth_policy(UDPC_HContext ctx, int value)
Sets how peers are handled regarding public key verification.
+
UDPC_EXPORT int UDPC_has_whitelist_pk(UDPC_HContext ctx, const unsigned char *pk)
Checks if a public key is in the whitelist.
+
UDPC_AUTH_POLICY_FALLBACK
All peers will not be denied regardless of use of public key verification.
Definition: UDPC.h:138
+
UDPC_WARNING
Log errors and warnings.
Definition: UDPC.h:125
+
UDPC_EXPORT unsigned long UDPC_get_queue_send_current_size(UDPC_HContext ctx)
Gets the size of the data structure holding queued packets.
+
UDPC_SILENT
Does not log anything.
Definition: UDPC.h:121
+
UDPC_EXPORT uint32_t UDPC_get_protocol_id(UDPC_HContext ctx)
Gets the protocol id of the UDPC context.
+
UDPC_EXPORT void UDPC_destroy(UDPC_HContext ctx)
Cleans up the UDPC_HContext.
+
UDPC_EXPORT int UDPC_get_auth_policy(UDPC_HContext ctx)
Gets how peers are handled regarding public key verification.
+
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id_full(UDPC_IPV6_ADDR_TYPE addr, uint32_t scope_id, uint16_t port)
Creates an UDPC_ConnectionId with the given addr, scope_id, and port.
+
UDPC_EXPORT UDPC_HContext UDPC_init_threaded_update_ms(UDPC_ConnectionId listenId, int isClient, int updateMS, int isUsingLibsodium)
Creates an UDPC_HContext that holds state for connections that auto-updates via a thread at a specifi...
+
UDPC_EXPORT int UDPC_remove_whitelist_pk(UDPC_HContext ctx, const unsigned char *pk)
Removes a public key from the whitelist.
+
UDPC_EXPORT int UDPC_set_libsodium_keys(UDPC_HContext ctx, const unsigned char *sk, const unsigned char *pk)
Sets public/private keys used for packet verification.
+
UDPC_EXPORT int UDPC_is_valid_context(UDPC_HContext ctx)
Checks if the given UDPC_HContext is valid (successfully initialized)
+
UDPC_ERROR
Only log errors.
Definition: UDPC.h:123
+
UDPC_EXPORT UDPC_LoggingType UDPC_get_logging_type(UDPC_HContext ctx)
Gets the logging type of the UDPC context.
+
UDPC_VERBOSE
Log errors, warning, info, and verbose.
Definition: UDPC.h:129
+
UDPC_EXPORT int UDPC_set_libsodium_key_easy(UDPC_HContext ctx, const unsigned char *sk)
Sets the public/private keys used for packet verification.
+
enum UDPC_EXPORT UDPC_EventType UDPC_EventType
An enum describing the type of event.
Definition: UDPC.h:229
+
struct UDPC_EXPORT UDPC_PacketInfo UDPC_PacketInfo
Data representing a received/sent packet.
+
struct UDPC_EXPORT UDPC_ConnectionId UDPC_ConnectionId
Data identifying a peer via addr, port, and scope_id.
+
UDPC_EXPORT UDPC_ConnectionId UDPC_create_id(UDPC_IPV6_ADDR_TYPE addr, uint16_t port)
Creates an UDPC_ConnectionId with the given addr and port.
+
UDPC_EXPORT UDPC_PacketInfo UDPC_get_received(UDPC_HContext ctx, unsigned long *remaining)
Get a received packet from a given UDPC context.
+
Data identifying a peer via addr, port, and scope_id.
Definition: UDPC.h:153
+
A struct containing information related to the type of event.
Definition: UDPC.h:250
+
Data representing a received/sent packet.
Definition: UDPC.h:167
+
char * data
Definition: UDPC.h:173
+
UDPC_ConnectionId sender
The UDPC_ConnectionId of the sender.
Definition: UDPC.h:205
+
uint16_t dataSize
The size in bytes of the received packet's data inside the data pointer member variable.
Definition: UDPC.h:202
+
UDPC_ConnectionId receiver
The UDPC_ConnectionId of the receiver.
Definition: UDPC.h:207
+
uint32_t id
The packet's id.
Definition: UDPC.h:192
+
uint32_t flags
Flags indication some additional information about the received packet.
Definition: UDPC.h:184
+
Definition: UDPC.h:253
+
+ + + + diff --git a/annotated.html b/annotated.html new file mode 100644 index 0000000..df6a8f6 --- /dev/null +++ b/annotated.html @@ -0,0 +1,83 @@ + + + + + + + +UDPConnection: Data Structures + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Data Structures
+
+
+
Here are the data structures with brief descriptions:
+
[detail level 12]
+ + + + +
 CUDPC_ConnectionIdData identifying a peer via addr, port, and scope_id
 CUDPC_EventA struct containing information related to the type of event
 CValue
 CUDPC_PacketInfoData representing a received/sent packet
+
+
+ + + + diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 0000000..224b29a Binary files /dev/null and b/bc_s.png differ diff --git a/bdwn.png b/bdwn.png new file mode 100644 index 0000000..940a0b9 Binary files /dev/null and b/bdwn.png differ diff --git a/classes.html b/classes.html new file mode 100644 index 0000000..e2ed61a --- /dev/null +++ b/classes.html @@ -0,0 +1,84 @@ + + + + + + + +UDPConnection: Data Structure Index + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
Data Structure Index
+
+
+
U | V
+ +
+ + + + diff --git a/closed.png b/closed.png new file mode 100644 index 0000000..98cc2c9 Binary files /dev/null and b/closed.png differ diff --git a/dir_68267d1309a1af8e8297ef4c3efbcdba.html b/dir_68267d1309a1af8e8297ef4c3efbcdba.html new file mode 100644 index 0000000..4509c80 --- /dev/null +++ b/dir_68267d1309a1af8e8297ef4c3efbcdba.html @@ -0,0 +1,86 @@ + + + + + + + +UDPConnection: src Directory Reference + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + + +
+
+ + +
+ +
+ + +
+
+
+
src Directory Reference
+
+
+ + + + + +

+Files

file  UDPC.h [code]
 Public API for UDPConnection.
 
+
+ + + + diff --git a/doc.png b/doc.png new file mode 100644 index 0000000..17edabf Binary files /dev/null and b/doc.png differ diff --git a/doxygen.css b/doxygen.css new file mode 100644 index 0000000..ffbff02 --- /dev/null +++ b/doxygen.css @@ -0,0 +1,1793 @@ +/* The standard CSS for doxygen 1.9.1 */ + +body, table, div, p, dl { + font: 400 14px/22px Roboto,sans-serif; +} + +p.reference, p.definition { + font: 400 14px/22px Roboto,sans-serif; +} + +/* @group Heading Levels */ + +h1.groupheader { + font-size: 150%; +} + +.title { + font: 400 14px/28px Roboto,sans-serif; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h2.groupheader { + border-bottom: 1px solid #879ECB; + color: #354C7B; + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px cyan; +} + +dt { + font-weight: bold; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + border-right: 1px solid #A3B4D7; + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} +td.navtabHL { + background-image: url('tab_a.png'); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: #fff; + text-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: #A0A0A0; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: black; +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.odd { + background-color: #F8F9FC; +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: #3D578C; + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: #4665A2; +} + +a:hover { + text-decoration: underline; +} + +.contents a.qindexHL:visited { + color: #FFFFFF; +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: #4665A2; +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: #4665A2; +} + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: hidden; /*Fixed: list item bullets overlap floating elements*/ +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; /*Fixed: fragment lines overlap floating elements*/ + overflow-y: hidden; +} + +pre.fragment { + border: 1px solid #C4CFE5; + background-color: #FBFCFD; + padding: 4px 6px; + margin: 4px 8px 4px 2px; + overflow: auto; + word-wrap: break-word; + font-size: 9pt; + line-height: 125%; + font-family: monospace, fixed; + font-size: 105%; +} + +div.fragment { + padding: 0 0 1px 0; /*Fixed: last line underline overlap border*/ + margin: 4px 8px 4px 2px; + background-color: #FBFCFD; + border: 1px solid #C4CFE5; +} + +div.line { + font-family: monospace, fixed; + font-size: 13px; + min-height: 13px; + line-height: 1.0; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: cyan; + box-shadow: 0 0 10px cyan; +} + + +span.lineno { + padding-right: 4px; + text-align: right; + border-right: 2px solid #0F0; + background-color: #E8E8E8; + white-space: pre; +} +span.lineno a { + background-color: #D8D8D8; +} + +span.lineno a:hover { + background-color: #C8C8C8; +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.ah, span.ah { + background-color: black; + font-weight: bold; + color: #FFFFFF; + margin-bottom: 3px; + margin-top: 3px; + padding: 0.2em; + border: solid thin #333; + border-radius: 0.5em; + -webkit-border-radius: .5em; + -moz-border-radius: .5em; + box-shadow: 2px 2px 3px #999; + -webkit-box-shadow: 2px 2px 3px #999; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444)); + background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000 110%); +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + background-color: white; + color: black; + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +td.indexkey { + background-color: #EBEFF6; + font-weight: bold; + border: 1px solid #C4CFE5; + margin: 2px 0px 2px 0; + padding: 2px 10px; + white-space: nowrap; + vertical-align: top; +} + +td.indexvalue { + background-color: #EBEFF6; + border: 1px solid #C4CFE5; + padding: 2px 10px; + margin: 2px 0px; +} + +tr.memlist { + background-color: #EEF1F7; +} + +p.formulaDsp { + text-align: center; +} + +img.formulaDsp { + +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; +} + +/* @group Code Colorization */ + +span.keyword { + color: #008000 +} + +span.keywordtype { + color: #604020 +} + +span.keywordflow { + color: #e08000 +} + +span.comment { + color: #800000 +} + +span.preprocessor { + color: #806020 +} + +span.stringliteral { + color: #002080 +} + +span.charliteral { + color: #008080 +} + +span.vhdldigit { + color: #ff00ff +} + +span.vhdlchar { + color: #000000 +} + +span.vhdlkeyword { + color: #700070 +} + +span.vhdllogic { + color: #ff0000 +} + +blockquote { + background-color: #F7F8FB; + border-left: 2px solid #9CAFD4; + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +blockquote.DocNodeRTL { + border-left: 0; + border-right: 2px solid #9CAFD4; + margin: 0 4px 0 24px; + padding: 0 16px 0 12px; +} + +/* @end */ + +/* +.search { + color: #003399; + font-weight: bold; +} + +form.search { + margin-bottom: 0px; + margin-top: 0px; +} + +input.search { + font-size: 75%; + color: #000080; + font-weight: normal; + background-color: #e8eef2; +} +*/ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid #A3B4D7; +} + +th.dirtab { + background: #EBEFF6; + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid #4A6AAA; +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: cyan; + box-shadow: 0 0 15px cyan; +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: #F9FAFC; + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: #555; +} + +.memSeparator { + border-bottom: 1px solid #DEE4F0; + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: #4665A2; + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: url('nav_f.png'); + background-repeat: repeat-x; + background-color: #E2E8F2; + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: #4665A2; + font-weight: normal; + margin-left: 9px; +} + +.memnav { + background-color: #EBEFF6; + border: 1px solid #A3B4D7; + text-align: center; + margin: 2px; + margin-right: 15px; + padding: 2px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px cyan; +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 0px 6px 0px; + color: #253555; + font-weight: bold; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + background-color: #DFE5F1; + /* opera specific markup */ + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; + /* firefox specific markup */ + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + -moz-border-radius-topright: 4px; + /* webkit specific markup */ + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + -webkit-border-top-right-radius: 4px; + +} + +.overload { + font-family: "courier new",courier,monospace; + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid #A8B8D9; + border-left: 1px solid #A8B8D9; + border-right: 1px solid #A8B8D9; + padding: 6px 10px 2px 10px; + background-color: #FBFCFD; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: #FFFFFF; + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; +} + +.paramname { + color: #602020; + white-space: nowrap; +} +.paramname em { + font-style: normal; +} +.paramname code { + line-height: 14px; +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: "courier new",courier,monospace; + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: #728DC1; + border-top:1px solid #5373B4; + border-left:1px solid #5373B4; + border-right:1px solid #C4CFE5; + border-bottom:1px solid #C4CFE5; + text-shadow: none; + color: white; + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid #9CAFD4; + border-bottom: 1px solid #9CAFD4; + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.even { + padding-left: 6px; + background-color: #F7F8FB; +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: #3D578C; +} + +.arrow { + color: #9CAFD4; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: Arial, Helvetica; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: #728DC1; + color: white; + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderopen.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('folderclosed.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:url('doc.png'); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +table.directory { + font: 400 14px Roboto,sans-serif; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: #2A3D61; +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + /*width: 100%;*/ + margin-bottom: 10px; + border: 1px solid #A8B8D9; + border-spacing: 0px; + -moz-border-radius: 4px; + -webkit-border-radius: 4px; + border-radius: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px; + -webkit-box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid #A8B8D9; + border-bottom: 1px solid #A8B8D9; + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid #A8B8D9; + /*width: 100%;*/ +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image:url('nav_f.png'); + background-repeat:repeat-x; + background-color: #E2E8F2; + font-size: 90%; + color: #253555; + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid #A8B8D9; +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: url('tab_b.png'); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image:url('tab_b.png'); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:#8AA0CC; + border:solid 1px #C2CDE4; + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:url('bc_s.png'); + background-repeat:no-repeat; + background-position:right; + color:#364D7C; +} + +.navpath li.navelem a +{ + height:32px; + display:block; + text-decoration: none; + outline: none; + color: #283A5D; + font-family: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; + text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color:#6884BD; +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color:#364D7C; + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image:url('nav_h.png'); + background-repeat:repeat-x; + background-color: #F9FAFC; + margin: 0px; + border-bottom: 1px solid #C4CFE5; +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug, dl.examples */ +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.section.DocNodeRTL { + margin-right: 0px; + padding-right: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.note.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.warning.DocNodeRTL, dl.attention.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.pre.DocNodeRTL, dl.post.DocNodeRTL, dl.invariant.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.deprecated.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.todo.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.test.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +dl.bug.DocNodeRTL { + margin-left: 0; + padding-left: 0; + border-left: 0; + margin-right: -7px; + padding-right: 3px; + border-right: 4px solid; + border-color: #C08050; +} + +dl.section dd { + margin-bottom: 6px; +} + + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; +} + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font: 50% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid #5373B4; +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +div.zoom +{ + border: 1px solid #90A5CE; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:#334975; + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: #F4F6FA; + border: 1px solid #D8DFEE; + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +.PageDocRTL-title div.toc { + float: left !important; + text-align: right; +} + +div.toc li { + background: url("bdwn.png") no-repeat scroll 0 5px transparent; + font: 10px/1.2 Verdana,DejaVu Sans,Geneva,sans-serif; + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +.PageDocRTL-title div.toc li { + background-position-x: right !important; + padding-left: 0 !important; + padding-right: 10px; +} + +div.toc h3 { + font: bold 12px/1.2 Arial,FreeSans,sans-serif; + color: #4665A2; + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 30px; +} + +div.toc li.level4 { + margin-left: 45px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +.PageDocRTL-title div.toc li.level1 { + margin-left: 0 !important; + margin-right: 0; +} + +.PageDocRTL-title div.toc li.level2 { + margin-left: 0 !important; + margin-right: 15px; +} + +.PageDocRTL-title div.toc li.level3 { + margin-left: 0 !important; + margin-right: 30px; +} + +.PageDocRTL-title div.toc li.level4 { + margin-left: 0 !important; + margin-right: 45px; +} + +.inherit_header { + font-weight: bold; + color: gray; + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + white-space: nowrap; + background-color: white; + border: 1px solid gray; + border-radius: 4px 4px 4px 4px; + box-shadow: 1px 1px 7px gray; + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: grey; + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: #006318; +} + +#powerTip div { + margin: 0px; + padding: 0px; + font: 12px/16px Roboto,sans-serif; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before { + border-top-color: #808080; + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: #FFFFFF; + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: #808080; + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: #FFFFFF; + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: #808080; + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid #2D4068; + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: #374F7F; + color: #FFFFFF; + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +.DocNodeRTL { + text-align: right; + direction: rtl; +} + +.DocNodeLTR { + text-align: left; + direction: ltr; +} + +table.DocNodeRTL { + width: auto; + margin-right: 0; + margin-left: auto; +} + +table.DocNodeLTR { + width: auto; + margin-right: auto; + margin-left: 0; +} + +tt, code, kbd, samp +{ + display: inline-block; + direction:ltr; +} +/* @end */ + +u { + text-decoration: underline; +} + diff --git a/doxygen.svg b/doxygen.svg new file mode 100644 index 0000000..d42dad5 --- /dev/null +++ b/doxygen.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynsections.js b/dynsections.js new file mode 100644 index 0000000..3174bd7 --- /dev/null +++ b/dynsections.js @@ -0,0 +1,121 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function toggleVisibility(linkObj) +{ + var base = $(linkObj).attr('id'); + var summary = $('#'+base+'-summary'); + var content = $('#'+base+'-content'); + var trigger = $('#'+base+'-trigger'); + var src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; +} + +function updateStripes() +{ + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); +} + +function toggleLevel(level) +{ + $('table.directory tr').each(function() { + var l = this.id.split('_').length-1; + var i = $('#img'+this.id.substring(3)); + var a = $('#arr'+this.id.substring(3)); + if (l + + + + + + +UDPConnection: File List + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+
[detail level 12]
+ + +
  src
 UDPC.hPublic API for UDPConnection
+
+
+ + + + diff --git a/folderclosed.png b/folderclosed.png new file mode 100644 index 0000000..bb8ab35 Binary files /dev/null and b/folderclosed.png differ diff --git a/folderopen.png b/folderopen.png new file mode 100644 index 0000000..d6c7f67 Binary files /dev/null and b/folderopen.png differ diff --git a/functions.html b/functions.html new file mode 100644 index 0000000..ce07d71 --- /dev/null +++ b/functions.html @@ -0,0 +1,91 @@ + + + + + + + +UDPConnection: Data Fields + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+
+ + + + diff --git a/functions_vars.html b/functions_vars.html new file mode 100644 index 0000000..7448fc7 --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,91 @@ + + + + + + + +UDPConnection: Data Fields - Variables + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/globals.html b/globals.html new file mode 100644 index 0000000..39a38bb --- /dev/null +++ b/globals.html @@ -0,0 +1,240 @@ + + + + + + + +UDPConnection: Globals + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- u -

    +
  • UDPC_add_whitelist_pk() +: UDPC.h +
  • +
  • UDPC_AUTH_POLICY_FALLBACK +: UDPC.h +
  • +
  • UDPC_AUTH_POLICY_STRICT +: UDPC.h +
  • +
  • UDPC_AuthPolicy +: UDPC.h +
  • +
  • UDPC_clear_whitelist() +: UDPC.h +
  • +
  • UDPC_client_initiate_connection() +: UDPC.h +
  • +
  • UDPC_ConnectionId +: UDPC.h +
  • +
  • UDPC_create_id() +: UDPC.h +
  • +
  • UDPC_create_id_anyaddr() +: UDPC.h +
  • +
  • UDPC_create_id_easy() +: UDPC.h +
  • +
  • UDPC_create_id_full() +: UDPC.h +
  • +
  • UDPC_destroy() +: UDPC.h +
  • +
  • UDPC_disable_threaded_update() +: UDPC.h +
  • +
  • UDPC_drop_connection() +: UDPC.h +
  • +
  • UDPC_enable_threaded_update() +: UDPC.h +
  • +
  • UDPC_enable_threaded_update_ms() +: UDPC.h +
  • +
  • UDPC_ERROR +: UDPC.h +
  • +
  • UDPC_Event +: UDPC.h +
  • +
  • UDPC_EventType +: UDPC.h +
  • +
  • UDPC_free_list_connected() +: UDPC.h +
  • +
  • UDPC_free_PacketInfo() +: UDPC.h +
  • +
  • UDPC_get_auth_policy() +: UDPC.h +
  • +
  • UDPC_get_event() +: UDPC.h +
  • +
  • UDPC_get_list_connected() +: UDPC.h +
  • +
  • UDPC_get_logging_type() +: UDPC.h +
  • +
  • UDPC_get_max_queued_size() +: UDPC.h +
  • +
  • UDPC_get_protocol_id() +: UDPC.h +
  • +
  • UDPC_get_queue_send_current_size() +: UDPC.h +
  • +
  • UDPC_get_queued_size() +: UDPC.h +
  • +
  • UDPC_get_received() +: UDPC.h +
  • +
  • UDPC_get_receiving_events() +: UDPC.h +
  • +
  • UDPC_has_connection() +: UDPC.h +
  • +
  • UDPC_has_whitelist_pk() +: UDPC.h +
  • +
  • UDPC_INFO +: UDPC.h +
  • +
  • UDPC_init() +: UDPC.h +
  • +
  • UDPC_init_threaded_update() +: UDPC.h +
  • +
  • UDPC_init_threaded_update_ms() +: UDPC.h +
  • +
  • UDPC_is_valid_context() +: UDPC.h +
  • +
  • UDPC_PACKET_MAX_SIZE +: UDPC.h +
  • +
  • UDPC_PacketInfo +: UDPC.h +
  • +
  • UDPC_queue_send() +: UDPC.h +
  • +
  • UDPC_remove_whitelist_pk() +: UDPC.h +
  • +
  • UDPC_set_accept_new_connections() +: UDPC.h +
  • +
  • UDPC_set_auth_policy() +: UDPC.h +
  • +
  • UDPC_set_libsodium_key_easy() +: UDPC.h +
  • +
  • UDPC_set_libsodium_keys() +: UDPC.h +
  • +
  • UDPC_set_logging_type() +: UDPC.h +
  • +
  • UDPC_set_protocol_id() +: UDPC.h +
  • +
  • UDPC_set_receiving_events() +: UDPC.h +
  • +
  • UDPC_SILENT +: UDPC.h +
  • +
  • UDPC_strtoa() +: UDPC.h +
  • +
  • UDPC_unset_libsodium_keys() +: UDPC.h +
  • +
  • UDPC_update() +: UDPC.h +
  • +
  • UDPC_VERBOSE +: UDPC.h +
  • +
  • UDPC_WARNING +: UDPC.h +
  • +
+
+ + + + diff --git a/globals_defs.html b/globals_defs.html new file mode 100644 index 0000000..f4c7cee --- /dev/null +++ b/globals_defs.html @@ -0,0 +1,76 @@ + + + + + + + +UDPConnection: Globals + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
    +
  • UDPC_PACKET_MAX_SIZE +: UDPC.h +
  • +
+
+ + + + diff --git a/globals_func.html b/globals_func.html new file mode 100644 index 0000000..86aeb3a --- /dev/null +++ b/globals_func.html @@ -0,0 +1,201 @@ + + + + + + + +UDPConnection: Globals + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+  + +

- u -

    +
  • UDPC_add_whitelist_pk() +: UDPC.h +
  • +
  • UDPC_clear_whitelist() +: UDPC.h +
  • +
  • UDPC_client_initiate_connection() +: UDPC.h +
  • +
  • UDPC_create_id() +: UDPC.h +
  • +
  • UDPC_create_id_anyaddr() +: UDPC.h +
  • +
  • UDPC_create_id_easy() +: UDPC.h +
  • +
  • UDPC_create_id_full() +: UDPC.h +
  • +
  • UDPC_destroy() +: UDPC.h +
  • +
  • UDPC_disable_threaded_update() +: UDPC.h +
  • +
  • UDPC_drop_connection() +: UDPC.h +
  • +
  • UDPC_enable_threaded_update() +: UDPC.h +
  • +
  • UDPC_enable_threaded_update_ms() +: UDPC.h +
  • +
  • UDPC_free_list_connected() +: UDPC.h +
  • +
  • UDPC_free_PacketInfo() +: UDPC.h +
  • +
  • UDPC_get_auth_policy() +: UDPC.h +
  • +
  • UDPC_get_event() +: UDPC.h +
  • +
  • UDPC_get_list_connected() +: UDPC.h +
  • +
  • UDPC_get_logging_type() +: UDPC.h +
  • +
  • UDPC_get_max_queued_size() +: UDPC.h +
  • +
  • UDPC_get_protocol_id() +: UDPC.h +
  • +
  • UDPC_get_queue_send_current_size() +: UDPC.h +
  • +
  • UDPC_get_queued_size() +: UDPC.h +
  • +
  • UDPC_get_received() +: UDPC.h +
  • +
  • UDPC_get_receiving_events() +: UDPC.h +
  • +
  • UDPC_has_connection() +: UDPC.h +
  • +
  • UDPC_has_whitelist_pk() +: UDPC.h +
  • +
  • UDPC_init() +: UDPC.h +
  • +
  • UDPC_init_threaded_update() +: UDPC.h +
  • +
  • UDPC_init_threaded_update_ms() +: UDPC.h +
  • +
  • UDPC_is_valid_context() +: UDPC.h +
  • +
  • UDPC_queue_send() +: UDPC.h +
  • +
  • UDPC_remove_whitelist_pk() +: UDPC.h +
  • +
  • UDPC_set_accept_new_connections() +: UDPC.h +
  • +
  • UDPC_set_auth_policy() +: UDPC.h +
  • +
  • UDPC_set_libsodium_key_easy() +: UDPC.h +
  • +
  • UDPC_set_libsodium_keys() +: UDPC.h +
  • +
  • UDPC_set_logging_type() +: UDPC.h +
  • +
  • UDPC_set_protocol_id() +: UDPC.h +
  • +
  • UDPC_set_receiving_events() +: UDPC.h +
  • +
  • UDPC_strtoa() +: UDPC.h +
  • +
  • UDPC_unset_libsodium_keys() +: UDPC.h +
  • +
  • UDPC_update() +: UDPC.h +
  • +
+
+ + + + diff --git a/globals_type.html b/globals_type.html new file mode 100644 index 0000000..9ef8c09 --- /dev/null +++ b/globals_type.html @@ -0,0 +1,88 @@ + + + + + + + +UDPConnection: Globals + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/globals_vars.html b/globals_vars.html new file mode 100644 index 0000000..f650fc2 --- /dev/null +++ b/globals_vars.html @@ -0,0 +1,94 @@ + + + + + + + +UDPConnection: Globals + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+ + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..0a52389 --- /dev/null +++ b/index.html @@ -0,0 +1,77 @@ + + + + + + + +UDPConnection: UDPConnection + + + + + + + + + +
+
+ + + + + + +
+
UDPConnection +
+
A network connection implementation over UDP
+
+
+ + + + + + + +
+ +
+
+ + +
+ +
+ +
+
+
UDPConnection
+
+
+
+
+ + + + diff --git a/jquery.js b/jquery.js new file mode 100644 index 0000000..103c32d --- /dev/null +++ b/jquery.js @@ -0,0 +1,35 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0a;a++)for(i in o[a])n=o[a][i],o[a].hasOwnProperty(i)&&void 0!==n&&(e[i]=t.isPlainObject(n)?t.isPlainObject(e[i])?t.widget.extend({},e[i],n):t.widget.extend({},n):n);return e},t.widget.bridge=function(e,i){var n=i.prototype.widgetFullName||e;t.fn[e]=function(o){var a="string"==typeof o,r=s.call(arguments,1),h=this;return a?this.length||"instance"!==o?this.each(function(){var i,s=t.data(this,n);return"instance"===o?(h=s,!1):s?t.isFunction(s[o])&&"_"!==o.charAt(0)?(i=s[o].apply(s,r),i!==s&&void 0!==i?(h=i&&i.jquery?h.pushStack(i.get()):i,!1):void 0):t.error("no such method '"+o+"' for "+e+" widget instance"):t.error("cannot call methods on "+e+" prior to initialization; "+"attempted to call method '"+o+"'")}):h=void 0:(r.length&&(o=t.widget.extend.apply(null,[o].concat(r))),this.each(function(){var e=t.data(this,n);e?(e.option(o||{}),e._init&&e._init()):t.data(this,n,new i(o,this))})),h}},t.Widget=function(){},t.Widget._childConstructors=[],t.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"
",options:{classes:{},disabled:!1,create:null},_createWidget:function(e,s){s=t(s||this.defaultElement||this)[0],this.element=t(s),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=t(),this.hoverable=t(),this.focusable=t(),this.classesElementLookup={},s!==this&&(t.data(s,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===s&&this.destroy()}}),this.document=t(s.style?s.ownerDocument:s.document||s),this.window=t(this.document[0].defaultView||this.document[0].parentWindow)),this.options=t.widget.extend({},this.options,this._getCreateOptions(),e),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:t.noop,_create:t.noop,_init:t.noop,destroy:function(){var e=this;this._destroy(),t.each(this.classesElementLookup,function(t,i){e._removeClass(i,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:t.noop,widget:function(){return this.element},option:function(e,i){var s,n,o,a=e;if(0===arguments.length)return t.widget.extend({},this.options);if("string"==typeof e)if(a={},s=e.split("."),e=s.shift(),s.length){for(n=a[e]=t.widget.extend({},this.options[e]),o=0;s.length-1>o;o++)n[s[o]]=n[s[o]]||{},n=n[s[o]];if(e=s.pop(),1===arguments.length)return void 0===n[e]?null:n[e];n[e]=i}else{if(1===arguments.length)return void 0===this.options[e]?null:this.options[e];a[e]=i}return this._setOptions(a),this},_setOptions:function(t){var e;for(e in t)this._setOption(e,t[e]);return this},_setOption:function(t,e){return"classes"===t&&this._setOptionClasses(e),this.options[t]=e,"disabled"===t&&this._setOptionDisabled(e),this},_setOptionClasses:function(e){var i,s,n;for(i in e)n=this.classesElementLookup[i],e[i]!==this.options.classes[i]&&n&&n.length&&(s=t(n.get()),this._removeClass(n,i),s.addClass(this._classes({element:s,keys:i,classes:e,add:!0})))},_setOptionDisabled:function(t){this._toggleClass(this.widget(),this.widgetFullName+"-disabled",null,!!t),t&&(this._removeClass(this.hoverable,null,"ui-state-hover"),this._removeClass(this.focusable,null,"ui-state-focus"))},enable:function(){return this._setOptions({disabled:!1})},disable:function(){return this._setOptions({disabled:!0})},_classes:function(e){function i(i,o){var a,r;for(r=0;i.length>r;r++)a=n.classesElementLookup[i[r]]||t(),a=e.add?t(t.unique(a.get().concat(e.element.get()))):t(a.not(e.element).get()),n.classesElementLookup[i[r]]=a,s.push(i[r]),o&&e.classes[i[r]]&&s.push(e.classes[i[r]])}var s=[],n=this;return e=t.extend({element:this.element,classes:this.options.classes||{}},e),this._on(e.element,{remove:"_untrackClassesElement"}),e.keys&&i(e.keys.match(/\S+/g)||[],!0),e.extra&&i(e.extra.match(/\S+/g)||[]),s.join(" ")},_untrackClassesElement:function(e){var i=this;t.each(i.classesElementLookup,function(s,n){-1!==t.inArray(e.target,n)&&(i.classesElementLookup[s]=t(n.not(e.target).get()))})},_removeClass:function(t,e,i){return this._toggleClass(t,e,i,!1)},_addClass:function(t,e,i){return this._toggleClass(t,e,i,!0)},_toggleClass:function(t,e,i,s){s="boolean"==typeof s?s:i;var n="string"==typeof t||null===t,o={extra:n?e:i,keys:n?t:e,element:n?this.element:t,add:s};return o.element.toggleClass(this._classes(o),s),this},_on:function(e,i,s){var n,o=this;"boolean"!=typeof e&&(s=i,i=e,e=!1),s?(i=n=t(i),this.bindings=this.bindings.add(i)):(s=i,i=this.element,n=this.widget()),t.each(s,function(s,a){function r(){return e||o.options.disabled!==!0&&!t(this).hasClass("ui-state-disabled")?("string"==typeof a?o[a]:a).apply(o,arguments):void 0}"string"!=typeof a&&(r.guid=a.guid=a.guid||r.guid||t.guid++);var h=s.match(/^([\w:-]*)\s*(.*)$/),l=h[1]+o.eventNamespace,c=h[2];c?n.on(l,c,r):i.on(l,r)})},_off:function(e,i){i=(i||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.off(i).off(i),this.bindings=t(this.bindings.not(e).get()),this.focusable=t(this.focusable.not(e).get()),this.hoverable=t(this.hoverable.not(e).get())},_delay:function(t,e){function i(){return("string"==typeof t?s[t]:t).apply(s,arguments)}var s=this;return setTimeout(i,e||0)},_hoverable:function(e){this.hoverable=this.hoverable.add(e),this._on(e,{mouseenter:function(e){this._addClass(t(e.currentTarget),null,"ui-state-hover")},mouseleave:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-hover")}})},_focusable:function(e){this.focusable=this.focusable.add(e),this._on(e,{focusin:function(e){this._addClass(t(e.currentTarget),null,"ui-state-focus")},focusout:function(e){this._removeClass(t(e.currentTarget),null,"ui-state-focus")}})},_trigger:function(e,i,s){var n,o,a=this.options[e];if(s=s||{},i=t.Event(i),i.type=(e===this.widgetEventPrefix?e:this.widgetEventPrefix+e).toLowerCase(),i.target=this.element[0],o=i.originalEvent)for(n in o)n in i||(i[n]=o[n]);return this.element.trigger(i,s),!(t.isFunction(a)&&a.apply(this.element[0],[i].concat(s))===!1||i.isDefaultPrevented())}},t.each({show:"fadeIn",hide:"fadeOut"},function(e,i){t.Widget.prototype["_"+e]=function(s,n,o){"string"==typeof n&&(n={effect:n});var a,r=n?n===!0||"number"==typeof n?i:n.effect||i:e;n=n||{},"number"==typeof n&&(n={duration:n}),a=!t.isEmptyObject(n),n.complete=o,n.delay&&s.delay(n.delay),a&&t.effects&&t.effects.effect[r]?s[e](n):r!==e&&s[r]?s[r](n.duration,n.easing,o):s.queue(function(i){t(this)[e](),o&&o.call(s[0]),i()})}}),t.widget,function(){function e(t,e,i){return[parseFloat(t[0])*(u.test(t[0])?e/100:1),parseFloat(t[1])*(u.test(t[1])?i/100:1)]}function i(e,i){return parseInt(t.css(e,i),10)||0}function s(e){var i=e[0];return 9===i.nodeType?{width:e.width(),height:e.height(),offset:{top:0,left:0}}:t.isWindow(i)?{width:e.width(),height:e.height(),offset:{top:e.scrollTop(),left:e.scrollLeft()}}:i.preventDefault?{width:0,height:0,offset:{top:i.pageY,left:i.pageX}}:{width:e.outerWidth(),height:e.outerHeight(),offset:e.offset()}}var n,o=Math.max,a=Math.abs,r=/left|center|right/,h=/top|center|bottom/,l=/[\+\-]\d+(\.[\d]+)?%?/,c=/^\w+/,u=/%$/,d=t.fn.position;t.position={scrollbarWidth:function(){if(void 0!==n)return n;var e,i,s=t("
"),o=s.children()[0];return t("body").append(s),e=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,e===i&&(i=s[0].clientWidth),s.remove(),n=e-i},getScrollInfo:function(e){var i=e.isWindow||e.isDocument?"":e.element.css("overflow-x"),s=e.isWindow||e.isDocument?"":e.element.css("overflow-y"),n="scroll"===i||"auto"===i&&e.widthi?"left":e>0?"right":"center",vertical:0>r?"top":s>0?"bottom":"middle"};l>p&&p>a(e+i)&&(u.horizontal="center"),c>f&&f>a(s+r)&&(u.vertical="middle"),u.important=o(a(e),a(i))>o(a(s),a(r))?"horizontal":"vertical",n.using.call(this,t,u)}),h.offset(t.extend(D,{using:r}))})},t.ui.position={fit:{left:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollLeft:s.offset.left,a=s.width,r=t.left-e.collisionPosition.marginLeft,h=n-r,l=r+e.collisionWidth-a-n;e.collisionWidth>a?h>0&&0>=l?(i=t.left+h+e.collisionWidth-a-n,t.left+=h-i):t.left=l>0&&0>=h?n:h>l?n+a-e.collisionWidth:n:h>0?t.left+=h:l>0?t.left-=l:t.left=o(t.left-r,t.left)},top:function(t,e){var i,s=e.within,n=s.isWindow?s.scrollTop:s.offset.top,a=e.within.height,r=t.top-e.collisionPosition.marginTop,h=n-r,l=r+e.collisionHeight-a-n;e.collisionHeight>a?h>0&&0>=l?(i=t.top+h+e.collisionHeight-a-n,t.top+=h-i):t.top=l>0&&0>=h?n:h>l?n+a-e.collisionHeight:n:h>0?t.top+=h:l>0?t.top-=l:t.top=o(t.top-r,t.top)}},flip:{left:function(t,e){var i,s,n=e.within,o=n.offset.left+n.scrollLeft,r=n.width,h=n.isWindow?n.scrollLeft:n.offset.left,l=t.left-e.collisionPosition.marginLeft,c=l-h,u=l+e.collisionWidth-r-h,d="left"===e.my[0]?-e.elemWidth:"right"===e.my[0]?e.elemWidth:0,p="left"===e.at[0]?e.targetWidth:"right"===e.at[0]?-e.targetWidth:0,f=-2*e.offset[0];0>c?(i=t.left+d+p+f+e.collisionWidth-r-o,(0>i||a(c)>i)&&(t.left+=d+p+f)):u>0&&(s=t.left-e.collisionPosition.marginLeft+d+p+f-h,(s>0||u>a(s))&&(t.left+=d+p+f))},top:function(t,e){var i,s,n=e.within,o=n.offset.top+n.scrollTop,r=n.height,h=n.isWindow?n.scrollTop:n.offset.top,l=t.top-e.collisionPosition.marginTop,c=l-h,u=l+e.collisionHeight-r-h,d="top"===e.my[1],p=d?-e.elemHeight:"bottom"===e.my[1]?e.elemHeight:0,f="top"===e.at[1]?e.targetHeight:"bottom"===e.at[1]?-e.targetHeight:0,m=-2*e.offset[1];0>c?(s=t.top+p+f+m+e.collisionHeight-r-o,(0>s||a(c)>s)&&(t.top+=p+f+m)):u>0&&(i=t.top-e.collisionPosition.marginTop+p+f+m-h,(i>0||u>a(i))&&(t.top+=p+f+m))}},flipfit:{left:function(){t.ui.position.flip.left.apply(this,arguments),t.ui.position.fit.left.apply(this,arguments)},top:function(){t.ui.position.flip.top.apply(this,arguments),t.ui.position.fit.top.apply(this,arguments)}}}}(),t.ui.position,t.extend(t.expr[":"],{data:t.expr.createPseudo?t.expr.createPseudo(function(e){return function(i){return!!t.data(i,e)}}):function(e,i,s){return!!t.data(e,s[3])}}),t.fn.extend({disableSelection:function(){var t="onselectstart"in document.createElement("div")?"selectstart":"mousedown";return function(){return this.on(t+".ui-disableSelection",function(t){t.preventDefault()})}}(),enableSelection:function(){return this.off(".ui-disableSelection")}}),t.ui.focusable=function(i,s){var n,o,a,r,h,l=i.nodeName.toLowerCase();return"area"===l?(n=i.parentNode,o=n.name,i.href&&o&&"map"===n.nodeName.toLowerCase()?(a=t("img[usemap='#"+o+"']"),a.length>0&&a.is(":visible")):!1):(/^(input|select|textarea|button|object)$/.test(l)?(r=!i.disabled,r&&(h=t(i).closest("fieldset")[0],h&&(r=!h.disabled))):r="a"===l?i.href||s:s,r&&t(i).is(":visible")&&e(t(i)))},t.extend(t.expr[":"],{focusable:function(e){return t.ui.focusable(e,null!=t.attr(e,"tabindex"))}}),t.ui.focusable,t.fn.form=function(){return"string"==typeof this[0].form?this.closest("form"):t(this[0].form)},t.ui.formResetMixin={_formResetHandler:function(){var e=t(this);setTimeout(function(){var i=e.data("ui-form-reset-instances");t.each(i,function(){this.refresh()})})},_bindFormResetHandler:function(){if(this.form=this.element.form(),this.form.length){var t=this.form.data("ui-form-reset-instances")||[];t.length||this.form.on("reset.ui-form-reset",this._formResetHandler),t.push(this),this.form.data("ui-form-reset-instances",t)}},_unbindFormResetHandler:function(){if(this.form.length){var e=this.form.data("ui-form-reset-instances");e.splice(t.inArray(this,e),1),e.length?this.form.data("ui-form-reset-instances",e):this.form.removeData("ui-form-reset-instances").off("reset.ui-form-reset")}}},"1.7"===t.fn.jquery.substring(0,3)&&(t.each(["Width","Height"],function(e,i){function s(e,i,s,o){return t.each(n,function(){i-=parseFloat(t.css(e,"padding"+this))||0,s&&(i-=parseFloat(t.css(e,"border"+this+"Width"))||0),o&&(i-=parseFloat(t.css(e,"margin"+this))||0)}),i}var n="Width"===i?["Left","Right"]:["Top","Bottom"],o=i.toLowerCase(),a={innerWidth:t.fn.innerWidth,innerHeight:t.fn.innerHeight,outerWidth:t.fn.outerWidth,outerHeight:t.fn.outerHeight};t.fn["inner"+i]=function(e){return void 0===e?a["inner"+i].call(this):this.each(function(){t(this).css(o,s(this,e)+"px")})},t.fn["outer"+i]=function(e,n){return"number"!=typeof e?a["outer"+i].call(this,e):this.each(function(){t(this).css(o,s(this,e,!0,n)+"px")})}}),t.fn.addBack=function(t){return this.add(null==t?this.prevObject:this.prevObject.filter(t))}),t.ui.keyCode={BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38},t.ui.escapeSelector=function(){var t=/([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;return function(e){return e.replace(t,"\\$1")}}(),t.fn.labels=function(){var e,i,s,n,o;return this[0].labels&&this[0].labels.length?this.pushStack(this[0].labels):(n=this.eq(0).parents("label"),s=this.attr("id"),s&&(e=this.eq(0).parents().last(),o=e.add(e.length?e.siblings():this.siblings()),i="label[for='"+t.ui.escapeSelector(s)+"']",n=n.add(o.find(i).addBack(i))),this.pushStack(n))},t.fn.scrollParent=function(e){var i=this.css("position"),s="absolute"===i,n=e?/(auto|scroll|hidden)/:/(auto|scroll)/,o=this.parents().filter(function(){var e=t(this);return s&&"static"===e.css("position")?!1:n.test(e.css("overflow")+e.css("overflow-y")+e.css("overflow-x"))}).eq(0);return"fixed"!==i&&o.length?o:t(this[0].ownerDocument||document)},t.extend(t.expr[":"],{tabbable:function(e){var i=t.attr(e,"tabindex"),s=null!=i;return(!s||i>=0)&&t.ui.focusable(e,s)}}),t.fn.extend({uniqueId:function(){var t=0;return function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++t)})}}(),removeUniqueId:function(){return this.each(function(){/^ui-id-\d+$/.test(this.id)&&t(this).removeAttr("id")})}}),t.ui.ie=!!/msie [\w.]+/.exec(navigator.userAgent.toLowerCase());var n=!1;t(document).on("mouseup",function(){n=!1}),t.widget("ui.mouse",{version:"1.12.1",options:{cancel:"input, textarea, button, select, option",distance:1,delay:0},_mouseInit:function(){var e=this;this.element.on("mousedown."+this.widgetName,function(t){return e._mouseDown(t)}).on("click."+this.widgetName,function(i){return!0===t.data(i.target,e.widgetName+".preventClickEvent")?(t.removeData(i.target,e.widgetName+".preventClickEvent"),i.stopImmediatePropagation(),!1):void 0}),this.started=!1},_mouseDestroy:function(){this.element.off("."+this.widgetName),this._mouseMoveDelegate&&this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(e){if(!n){this._mouseMoved=!1,this._mouseStarted&&this._mouseUp(e),this._mouseDownEvent=e;var i=this,s=1===e.which,o="string"==typeof this.options.cancel&&e.target.nodeName?t(e.target).closest(this.options.cancel).length:!1;return s&&!o&&this._mouseCapture(e)?(this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){i.mouseDelayMet=!0},this.options.delay)),this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(e)!==!1,!this._mouseStarted)?(e.preventDefault(),!0):(!0===t.data(e.target,this.widgetName+".preventClickEvent")&&t.removeData(e.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(t){return i._mouseMove(t)},this._mouseUpDelegate=function(t){return i._mouseUp(t)},this.document.on("mousemove."+this.widgetName,this._mouseMoveDelegate).on("mouseup."+this.widgetName,this._mouseUpDelegate),e.preventDefault(),n=!0,!0)):!0}},_mouseMove:function(e){if(this._mouseMoved){if(t.ui.ie&&(!document.documentMode||9>document.documentMode)&&!e.button)return this._mouseUp(e);if(!e.which)if(e.originalEvent.altKey||e.originalEvent.ctrlKey||e.originalEvent.metaKey||e.originalEvent.shiftKey)this.ignoreMissingWhich=!0;else if(!this.ignoreMissingWhich)return this._mouseUp(e)}return(e.which||e.button)&&(this._mouseMoved=!0),this._mouseStarted?(this._mouseDrag(e),e.preventDefault()):(this._mouseDistanceMet(e)&&this._mouseDelayMet(e)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,e)!==!1,this._mouseStarted?this._mouseDrag(e):this._mouseUp(e)),!this._mouseStarted)},_mouseUp:function(e){this.document.off("mousemove."+this.widgetName,this._mouseMoveDelegate).off("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,e.target===this._mouseDownEvent.target&&t.data(e.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(e)),this._mouseDelayTimer&&(clearTimeout(this._mouseDelayTimer),delete this._mouseDelayTimer),this.ignoreMissingWhich=!1,n=!1,e.preventDefault()},_mouseDistanceMet:function(t){return Math.max(Math.abs(this._mouseDownEvent.pageX-t.pageX),Math.abs(this._mouseDownEvent.pageY-t.pageY))>=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),t.ui.plugin={add:function(e,i,s){var n,o=t.ui[e].prototype;for(n in s)o.plugins[n]=o.plugins[n]||[],o.plugins[n].push([i,s[n]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;o.length>n;n++)t.options[o[n][0]]&&o[n][1].apply(t.element,i)}},t.widget("ui.resizable",t.ui.mouse,{version:"1.12.1",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,classes:{"ui-resizable-se":"ui-icon ui-icon-gripsmall-diagonal-se"},containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:90,resize:null,start:null,stop:null},_num:function(t){return parseFloat(t)||0},_isNumber:function(t){return!isNaN(parseFloat(t))},_hasScroll:function(e,i){if("hidden"===t(e).css("overflow"))return!1;var s=i&&"left"===i?"scrollLeft":"scrollTop",n=!1;return e[s]>0?!0:(e[s]=1,n=e[s]>0,e[s]=0,n)},_create:function(){var e,i=this.options,s=this;this._addClass("ui-resizable"),t.extend(this,{_aspectRatio:!!i.aspectRatio,aspectRatio:i.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:i.helper||i.ghost||i.animate?i.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/^(canvas|textarea|input|select|button|img)$/i)&&(this.element.wrap(t("
").css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,e={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(e),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(e),this._proportionallyResize()),this._setupHandles(),i.autoHide&&t(this.element).on("mouseenter",function(){i.disabled||(s._removeClass("ui-resizable-autohide"),s._handles.show())}).on("mouseleave",function(){i.disabled||s.resizing||(s._addClass("ui-resizable-autohide"),s._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy();var e,i=function(e){t(e).removeData("resizable").removeData("ui-resizable").off(".resizable").find(".ui-resizable-handle").remove()};return this.elementIsWrapper&&(i(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),i(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;default:}},_setupHandles:function(){var e,i,s,n,o,a=this.options,r=this;if(this.handles=a.handles||(t(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=t(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),s=this.handles.split(","),this.handles={},i=0;s.length>i;i++)e=t.trim(s[i]),n="ui-resizable-"+e,o=t("
"),this._addClass(o,"ui-resizable-handle "+n),o.css({zIndex:a.zIndex}),this.handles[e]=".ui-resizable-"+e,this.element.append(o);this._renderAxis=function(e){var i,s,n,o;e=e||this.element;for(i in this.handles)this.handles[i].constructor===String?this.handles[i]=this.element.children(this.handles[i]).first().show():(this.handles[i].jquery||this.handles[i].nodeType)&&(this.handles[i]=t(this.handles[i]),this._on(this.handles[i],{mousedown:r._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(s=t(this.handles[i],this.element),o=/sw|ne|nw|se|n|s/.test(i)?s.outerHeight():s.outerWidth(),n=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join(""),e.css(n,o),this._proportionallyResize()),this._handles=this._handles.add(this.handles[i])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){r.resizing||(this.className&&(o=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),r.axis=o&&o[1]?o[1]:"se")}),a.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._handles.remove()},_mouseCapture:function(e){var i,s,n=!1;for(i in this.handles)s=t(this.handles[i])[0],(s===e.target||t.contains(s,e.target))&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(e){var i,s,n,o=this.options,a=this.element;return this.resizing=!0,this._renderProxy(),i=this._num(this.helper.css("left")),s=this._num(this.helper.css("top")),o.containment&&(i+=t(o.containment).scrollLeft()||0,s+=t(o.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:i,top:s},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:a.width(),height:a.height()},this.originalSize=this._helper?{width:a.outerWidth(),height:a.outerHeight()}:{width:a.width(),height:a.height()},this.sizeDiff={width:a.outerWidth()-a.width(),height:a.outerHeight()-a.height()},this.originalPosition={left:i,top:s},this.originalMousePosition={left:e.pageX,top:e.pageY},this.aspectRatio="number"==typeof o.aspectRatio?o.aspectRatio:this.originalSize.width/this.originalSize.height||1,n=t(".ui-resizable-"+this.axis).css("cursor"),t("body").css("cursor","auto"===n?this.axis+"-resize":n),this._addClass("ui-resizable-resizing"),this._propagate("start",e),!0},_mouseDrag:function(e){var i,s,n=this.originalMousePosition,o=this.axis,a=e.pageX-n.left||0,r=e.pageY-n.top||0,h=this._change[o];return this._updatePrevProperties(),h?(i=h.apply(this,[e,a,r]),this._updateVirtualBoundaries(e.shiftKey),(this._aspectRatio||e.shiftKey)&&(i=this._updateRatio(i,e)),i=this._respectSize(i,e),this._updateCache(i),this._propagate("resize",e),s=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),t.isEmptyObject(s)||(this._updatePrevProperties(),this._trigger("resize",e,this.ui()),this._applyChanges()),!1):!1},_mouseStop:function(e){this.resizing=!1;var i,s,n,o,a,r,h,l=this.options,c=this;return this._helper&&(i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),n=s&&this._hasScroll(i[0],"left")?0:c.sizeDiff.height,o=s?0:c.sizeDiff.width,a={width:c.helper.width()-o,height:c.helper.height()-n},r=parseFloat(c.element.css("left"))+(c.position.left-c.originalPosition.left)||null,h=parseFloat(c.element.css("top"))+(c.position.top-c.originalPosition.top)||null,l.animate||this.element.css(t.extend(a,{top:h,left:r})),c.helper.height(c.size.height),c.helper.width(c.size.width),this._helper&&!l.animate&&this._proportionallyResize()),t("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",e),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s,n,o,a=this.options;o={minWidth:this._isNumber(a.minWidth)?a.minWidth:0,maxWidth:this._isNumber(a.maxWidth)?a.maxWidth:1/0,minHeight:this._isNumber(a.minHeight)?a.minHeight:0,maxHeight:this._isNumber(a.maxHeight)?a.maxHeight:1/0},(this._aspectRatio||t)&&(e=o.minHeight*this.aspectRatio,s=o.minWidth/this.aspectRatio,i=o.maxHeight*this.aspectRatio,n=o.maxWidth/this.aspectRatio,e>o.minWidth&&(o.minWidth=e),s>o.minHeight&&(o.minHeight=s),o.maxWidth>i&&(o.maxWidth=i),o.maxHeight>n&&(o.maxHeight=n)),this._vBoundaries=o},_updateCache:function(t){this.offset=this.helper.offset(),this._isNumber(t.left)&&(this.position.left=t.left),this._isNumber(t.top)&&(this.position.top=t.top),this._isNumber(t.height)&&(this.size.height=t.height),this._isNumber(t.width)&&(this.size.width=t.width)},_updateRatio:function(t){var e=this.position,i=this.size,s=this.axis;return this._isNumber(t.height)?t.width=t.height*this.aspectRatio:this._isNumber(t.width)&&(t.height=t.width/this.aspectRatio),"sw"===s&&(t.left=e.left+(i.width-t.width),t.top=null),"nw"===s&&(t.top=e.top+(i.height-t.height),t.left=e.left+(i.width-t.width)),t},_respectSize:function(t){var e=this._vBoundaries,i=this.axis,s=this._isNumber(t.width)&&e.maxWidth&&e.maxWidtht.width,a=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,r=this.originalPosition.left+this.originalSize.width,h=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),c=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),a&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=r-e.minWidth),s&&l&&(t.left=r-e.maxWidth),a&&c&&(t.top=h-e.minHeight),n&&c&&(t.top=h-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];4>e;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;this._proportionallyResizeElements.length>e;e++)t=this._proportionallyResizeElements[e],this.outerDimensions||(this.outerDimensions=this._getPaddingPlusBorderDimensions(t)),t.css({height:i.height()-this.outerDimensions.height||0,width:i.width()-this.outerDimensions.width||0})},_renderProxy:function(){var e=this.element,i=this.options;this.elementOffset=e.offset(),this._helper?(this.helper=this.helper||t("
"),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++i.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element +},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize,s=this.originalPosition;return{left:s.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize,n=this.originalPosition;return{top:n.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},sw:function(e,i,s){return t.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[e,i,s]))},ne:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[e,i,s]))},nw:function(e,i,s){return t.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[e,i,s]))}},_propagate:function(e,i){t.ui.plugin.call(this,e,[i,this.ui()]),"resize"!==e&&this._trigger(e,i,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),t.ui.plugin.add("resizable","animate",{stop:function(e){var i=t(this).resizable("instance"),s=i.options,n=i._proportionallyResizeElements,o=n.length&&/textarea/i.test(n[0].nodeName),a=o&&i._hasScroll(n[0],"left")?0:i.sizeDiff.height,r=o?0:i.sizeDiff.width,h={width:i.size.width-r,height:i.size.height-a},l=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,c=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(t.extend(h,c&&l?{top:c,left:l}:{}),{duration:s.animateDuration,easing:s.animateEasing,step:function(){var s={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};n&&n.length&&t(n[0]).css({width:s.width,height:s.height}),i._updateCache(s),i._propagate("resize",e)}})}}),t.ui.plugin.add("resizable","containment",{start:function(){var e,i,s,n,o,a,r,h=t(this).resizable("instance"),l=h.options,c=h.element,u=l.containment,d=u instanceof t?u.get(0):/parent/.test(u)?c.parent().get(0):u;d&&(h.containerElement=t(d),/document/.test(u)||u===document?(h.containerOffset={left:0,top:0},h.containerPosition={left:0,top:0},h.parentData={element:t(document),left:0,top:0,width:t(document).width(),height:t(document).height()||document.body.parentNode.scrollHeight}):(e=t(d),i=[],t(["Top","Right","Left","Bottom"]).each(function(t,s){i[t]=h._num(e.css("padding"+s))}),h.containerOffset=e.offset(),h.containerPosition=e.position(),h.containerSize={height:e.innerHeight()-i[3],width:e.innerWidth()-i[1]},s=h.containerOffset,n=h.containerSize.height,o=h.containerSize.width,a=h._hasScroll(d,"left")?d.scrollWidth:o,r=h._hasScroll(d)?d.scrollHeight:n,h.parentData={element:d,left:s.left,top:s.top,width:a,height:r}))},resize:function(e){var i,s,n,o,a=t(this).resizable("instance"),r=a.options,h=a.containerOffset,l=a.position,c=a._aspectRatio||e.shiftKey,u={top:0,left:0},d=a.containerElement,p=!0;d[0]!==document&&/static/.test(d.css("position"))&&(u=h),l.left<(a._helper?h.left:0)&&(a.size.width=a.size.width+(a._helper?a.position.left-h.left:a.position.left-u.left),c&&(a.size.height=a.size.width/a.aspectRatio,p=!1),a.position.left=r.helper?h.left:0),l.top<(a._helper?h.top:0)&&(a.size.height=a.size.height+(a._helper?a.position.top-h.top:a.position.top),c&&(a.size.width=a.size.height*a.aspectRatio,p=!1),a.position.top=a._helper?h.top:0),n=a.containerElement.get(0)===a.element.parent().get(0),o=/relative|absolute/.test(a.containerElement.css("position")),n&&o?(a.offset.left=a.parentData.left+a.position.left,a.offset.top=a.parentData.top+a.position.top):(a.offset.left=a.element.offset().left,a.offset.top=a.element.offset().top),i=Math.abs(a.sizeDiff.width+(a._helper?a.offset.left-u.left:a.offset.left-h.left)),s=Math.abs(a.sizeDiff.height+(a._helper?a.offset.top-u.top:a.offset.top-h.top)),i+a.size.width>=a.parentData.width&&(a.size.width=a.parentData.width-i,c&&(a.size.height=a.size.width/a.aspectRatio,p=!1)),s+a.size.height>=a.parentData.height&&(a.size.height=a.parentData.height-s,c&&(a.size.width=a.size.height*a.aspectRatio,p=!1)),p||(a.position.left=a.prevPosition.left,a.position.top=a.prevPosition.top,a.size.width=a.prevSize.width,a.size.height=a.prevSize.height)},stop:function(){var e=t(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.containerPosition,o=e.containerElement,a=t(e.helper),r=a.offset(),h=a.outerWidth()-e.sizeDiff.width,l=a.outerHeight()-e.sizeDiff.height;e._helper&&!i.animate&&/relative/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l}),e._helper&&!i.animate&&/static/.test(o.css("position"))&&t(this).css({left:r.left-n.left-s.left,width:h,height:l})}}),t.ui.plugin.add("resizable","alsoResize",{start:function(){var e=t(this).resizable("instance"),i=e.options;t(i.alsoResize).each(function(){var e=t(this);e.data("ui-resizable-alsoresize",{width:parseFloat(e.width()),height:parseFloat(e.height()),left:parseFloat(e.css("left")),top:parseFloat(e.css("top"))})})},resize:function(e,i){var s=t(this).resizable("instance"),n=s.options,o=s.originalSize,a=s.originalPosition,r={height:s.size.height-o.height||0,width:s.size.width-o.width||0,top:s.position.top-a.top||0,left:s.position.left-a.left||0};t(n.alsoResize).each(function(){var e=t(this),s=t(this).data("ui-resizable-alsoresize"),n={},o=e.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];t.each(o,function(t,e){var i=(s[e]||0)+(r[e]||0);i&&i>=0&&(n[e]=i||null)}),e.css(n)})},stop:function(){t(this).removeData("ui-resizable-alsoresize")}}),t.ui.plugin.add("resizable","ghost",{start:function(){var e=t(this).resizable("instance"),i=e.size;e.ghost=e.originalElement.clone(),e.ghost.css({opacity:.25,display:"block",position:"relative",height:i.height,width:i.width,margin:0,left:0,top:0}),e._addClass(e.ghost,"ui-resizable-ghost"),t.uiBackCompat!==!1&&"string"==typeof e.options.ghost&&e.ghost.addClass(this.options.ghost),e.ghost.appendTo(e.helper)},resize:function(){var e=t(this).resizable("instance");e.ghost&&e.ghost.css({position:"relative",height:e.size.height,width:e.size.width})},stop:function(){var e=t(this).resizable("instance");e.ghost&&e.helper&&e.helper.get(0).removeChild(e.ghost.get(0))}}),t.ui.plugin.add("resizable","grid",{resize:function(){var e,i=t(this).resizable("instance"),s=i.options,n=i.size,o=i.originalSize,a=i.originalPosition,r=i.axis,h="number"==typeof s.grid?[s.grid,s.grid]:s.grid,l=h[0]||1,c=h[1]||1,u=Math.round((n.width-o.width)/l)*l,d=Math.round((n.height-o.height)/c)*c,p=o.width+u,f=o.height+d,m=s.maxWidth&&p>s.maxWidth,g=s.maxHeight&&f>s.maxHeight,_=s.minWidth&&s.minWidth>p,v=s.minHeight&&s.minHeight>f;s.grid=h,_&&(p+=l),v&&(f+=c),m&&(p-=l),g&&(f-=c),/^(se|s|e)$/.test(r)?(i.size.width=p,i.size.height=f):/^(ne)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.top=a.top-d):/^(sw)$/.test(r)?(i.size.width=p,i.size.height=f,i.position.left=a.left-u):((0>=f-c||0>=p-l)&&(e=i._getPaddingPlusBorderDimensions(this)),f-c>0?(i.size.height=f,i.position.top=a.top-d):(f=c-e.height,i.size.height=f,i.position.top=a.top+o.height-f),p-l>0?(i.size.width=p,i.position.left=a.left-u):(p=l-e.width,i.size.width=p,i.position.left=a.left+o.width-p))}}),t.ui.resizable});/** + * Copyright (c) 2007 Ariel Flesler - aflesler ○ gmail • com | https://github.com/flesler + * Licensed under MIT + * @author Ariel Flesler + * @version 2.1.2 + */ +;(function(f){"use strict";"function"===typeof define&&define.amd?define(["jquery"],f):"undefined"!==typeof module&&module.exports?module.exports=f(require("jquery")):f(jQuery)})(function($){"use strict";function n(a){return!a.nodeName||-1!==$.inArray(a.nodeName.toLowerCase(),["iframe","#document","html","body"])}function h(a){return $.isFunction(a)||$.isPlainObject(a)?a:{top:a,left:a}}var p=$.scrollTo=function(a,d,b){return $(window).scrollTo(a,d,b)};p.defaults={axis:"xy",duration:0,limit:!0};$.fn.scrollTo=function(a,d,b){"object"=== typeof d&&(b=d,d=0);"function"===typeof b&&(b={onAfter:b});"max"===a&&(a=9E9);b=$.extend({},p.defaults,b);d=d||b.duration;var u=b.queue&&1=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/menu.js b/menu.js new file mode 100644 index 0000000..2fe2214 --- /dev/null +++ b/menu.js @@ -0,0 +1,51 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + var result=''; + if ('children' in data) { + result+=''; + } + return result; + } + + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchEnabled) { + if (serverSide) { + $('#main-menu').append('
  • '); + } else { + $('#main-menu').append('
  • '); + } + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/menudata.js b/menudata.js new file mode 100644 index 0000000..9c5c4cc --- /dev/null +++ b/menudata.js @@ -0,0 +1,42 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Main Page",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html"}, +{text:"Variables",url:"functions_vars.html"}]}]}, +{text:"Files",url:"files.html",children:[ +{text:"File List",url:"files.html"}, +{text:"Globals",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"u",url:"globals.html#index_u"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"u",url:"globals_func.html#index_u"}]}, +{text:"Variables",url:"globals_vars.html"}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Macros",url:"globals_defs.html"}]}]}]} diff --git a/nav_f.png b/nav_f.png new file mode 100644 index 0000000..72a58a5 Binary files /dev/null and b/nav_f.png differ diff --git a/nav_g.png b/nav_g.png new file mode 100644 index 0000000..2093a23 Binary files /dev/null and b/nav_g.png differ diff --git a/nav_h.png b/nav_h.png new file mode 100644 index 0000000..33389b1 Binary files /dev/null and b/nav_h.png differ diff --git a/open.png b/open.png new file mode 100644 index 0000000..30f75c7 Binary files /dev/null and b/open.png differ diff --git a/search/all_0.html b/search/all_0.html new file mode 100644 index 0000000..1ec5b2d --- /dev/null +++ b/search/all_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_0.js b/search/all_0.js new file mode 100644 index 0000000..2eb9505 --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['data_0',['data',['../structUDPC__PacketInfo.html#a1358f91f28c4a023ef201e868bf1069e',1,'UDPC_PacketInfo']]], + ['datasize_1',['dataSize',['../structUDPC__PacketInfo.html#a70230a2eb6a638d9e9fc04e230c92a74',1,'UDPC_PacketInfo']]] +]; diff --git a/search/all_1.html b/search/all_1.html new file mode 100644 index 0000000..9f80e90 --- /dev/null +++ b/search/all_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 0000000..6193fee --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['flags_2',['flags',['../structUDPC__PacketInfo.html#ad538ac2682e8276dc33553237f012ce1',1,'UDPC_PacketInfo']]] +]; diff --git a/search/all_2.html b/search/all_2.html new file mode 100644 index 0000000..02cfffc --- /dev/null +++ b/search/all_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_2.js b/search/all_2.js new file mode 100644 index 0000000..9179800 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['id_3',['id',['../structUDPC__PacketInfo.html#ac21cc9beab22eb1e1a2d5c0797ed0fbe',1,'UDPC_PacketInfo']]] +]; diff --git a/search/all_3.html b/search/all_3.html new file mode 100644 index 0000000..39767b8 --- /dev/null +++ b/search/all_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 0000000..81d7653 --- /dev/null +++ b/search/all_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['receiver_4',['receiver',['../structUDPC__PacketInfo.html#a965f393584d389dc72becd439cafde0d',1,'UDPC_PacketInfo']]] +]; diff --git a/search/all_4.html b/search/all_4.html new file mode 100644 index 0000000..fc40463 --- /dev/null +++ b/search/all_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_4.js b/search/all_4.js new file mode 100644 index 0000000..454b766 --- /dev/null +++ b/search/all_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['sender_5',['sender',['../structUDPC__PacketInfo.html#a5af734c663d3df72dad2b81a8794b6dc',1,'UDPC_PacketInfo']]] +]; diff --git a/search/all_5.html b/search/all_5.html new file mode 100644 index 0000000..9dd9344 --- /dev/null +++ b/search/all_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_5.js b/search/all_5.js new file mode 100644 index 0000000..8a843fa --- /dev/null +++ b/search/all_5.js @@ -0,0 +1,60 @@ +var searchData= +[ + ['udpc_2eh_6',['UDPC.h',['../UDPC_8h.html',1,'']]], + ['udpc_5fadd_5fwhitelist_5fpk_7',['UDPC_add_whitelist_pk',['../UDPC_8h.html#a71f9bf85a02ddd1b4c921fe9b6694fe8',1,'UDPC.h']]], + ['udpc_5fauth_5fpolicy_5ffallback_8',['UDPC_AUTH_POLICY_FALLBACK',['../UDPC_8h.html#a96ecd597f88d458ed108f33e4f0a6612',1,'UDPC.h']]], + ['udpc_5fauth_5fpolicy_5fstrict_9',['UDPC_AUTH_POLICY_STRICT',['../UDPC_8h.html#a6af4629253b3ed1f411015410cee9ad3',1,'UDPC.h']]], + ['udpc_5fauthpolicy_10',['UDPC_AuthPolicy',['../UDPC_8h.html#a228cd7ddf56a4e76e216bc3b80e8bd4a',1,'UDPC.h']]], + ['udpc_5fclear_5fwhitelist_11',['UDPC_clear_whitelist',['../UDPC_8h.html#a0e2e0c6a6a442db2cb3223d26f849d26',1,'UDPC.h']]], + ['udpc_5fclient_5finitiate_5fconnection_12',['UDPC_client_initiate_connection',['../UDPC_8h.html#a1192e0307f75feeac888fe5d49976f55',1,'UDPC.h']]], + ['udpc_5fconnectionid_13',['UDPC_ConnectionId',['../structUDPC__ConnectionId.html',1,'UDPC_ConnectionId'],['../UDPC_8h.html#ae5afb11964c7a55edf34ddf9097779b2',1,'UDPC_ConnectionId(): UDPC.h']]], + ['udpc_5fcreate_5fid_14',['UDPC_create_id',['../UDPC_8h.html#aea7e32ca9fdc04530f95c97459391e6d',1,'UDPC.h']]], + ['udpc_5fcreate_5fid_5fanyaddr_15',['UDPC_create_id_anyaddr',['../UDPC_8h.html#a0fa3e1e54877029a226ab9cfb74215df',1,'UDPC.h']]], + ['udpc_5fcreate_5fid_5feasy_16',['UDPC_create_id_easy',['../UDPC_8h.html#a8b80d2df882f03aeee8a92bed7fb0131',1,'UDPC.h']]], + ['udpc_5fcreate_5fid_5ffull_17',['UDPC_create_id_full',['../UDPC_8h.html#ab7cb345ce117c04017afd443e5748f19',1,'UDPC.h']]], + ['udpc_5fdestroy_18',['UDPC_destroy',['../UDPC_8h.html#aad0e88866d4c5cb9c0676bc8d7df574e',1,'UDPC.h']]], + ['udpc_5fdisable_5fthreaded_5fupdate_19',['UDPC_disable_threaded_update',['../UDPC_8h.html#a404d2c7a83903004f928737241ecc63a',1,'UDPC.h']]], + ['udpc_5fdrop_5fconnection_20',['UDPC_drop_connection',['../UDPC_8h.html#a44bc5cc29862c93e938ac8a625c56380',1,'UDPC.h']]], + ['udpc_5fenable_5fthreaded_5fupdate_21',['UDPC_enable_threaded_update',['../UDPC_8h.html#a0fafce547e9185c29f42d06213b0ff4f',1,'UDPC.h']]], + ['udpc_5fenable_5fthreaded_5fupdate_5fms_22',['UDPC_enable_threaded_update_ms',['../UDPC_8h.html#a1a50763773d55aa7a2a9c7ad69575833',1,'UDPC.h']]], + ['udpc_5ferror_23',['UDPC_ERROR',['../UDPC_8h.html#ac04213a4287500a9c5330f543eac3103',1,'UDPC.h']]], + ['udpc_5fevent_24',['UDPC_Event',['../UDPC_8h.html#a7b3215b65686670720f098eda2ca1eed',1,'UDPC_Event(): UDPC.h'],['../structUDPC__Event.html',1,'UDPC_Event']]], + ['udpc_5feventtype_25',['UDPC_EventType',['../UDPC_8h.html#adaa0534bf7f04bb2f6ce8975c99c4af0',1,'UDPC.h']]], + ['udpc_5ffree_5flist_5fconnected_26',['UDPC_free_list_connected',['../UDPC_8h.html#a8880067a93211c257763c42264f6ceef',1,'UDPC.h']]], + ['udpc_5ffree_5fpacketinfo_27',['UDPC_free_PacketInfo',['../UDPC_8h.html#a68ed6dcb37c6024486fad28ab0bed845',1,'UDPC.h']]], + ['udpc_5fget_5fauth_5fpolicy_28',['UDPC_get_auth_policy',['../UDPC_8h.html#ab79769e36a92c346c6c410be158ddfe4',1,'UDPC.h']]], + ['udpc_5fget_5fevent_29',['UDPC_get_event',['../UDPC_8h.html#a2c05c6fe89edde1e05ba9b6d8b5f7510',1,'UDPC.h']]], + ['udpc_5fget_5flist_5fconnected_30',['UDPC_get_list_connected',['../UDPC_8h.html#a7fe3e502f4c6f86ce5b2cd1f303aa213',1,'UDPC.h']]], + ['udpc_5fget_5flogging_5ftype_31',['UDPC_get_logging_type',['../UDPC_8h.html#ad0c7d69eeda20e98696d5c89bbbab096',1,'UDPC.h']]], + ['udpc_5fget_5fmax_5fqueued_5fsize_32',['UDPC_get_max_queued_size',['../UDPC_8h.html#a7983f38fe13677f5b35b90cefa54974f',1,'UDPC.h']]], + ['udpc_5fget_5fprotocol_5fid_33',['UDPC_get_protocol_id',['../UDPC_8h.html#aab6fb21c6f5b44123e2660f84561d404',1,'UDPC.h']]], + ['udpc_5fget_5fqueue_5fsend_5fcurrent_5fsize_34',['UDPC_get_queue_send_current_size',['../UDPC_8h.html#aa3f67ad23ae34b647b7f4dd17a8a96dd',1,'UDPC.h']]], + ['udpc_5fget_5fqueued_5fsize_35',['UDPC_get_queued_size',['../UDPC_8h.html#a1fb87c1522d353bd9fde4c94ec8454c2',1,'UDPC.h']]], + ['udpc_5fget_5freceived_36',['UDPC_get_received',['../UDPC_8h.html#affa8655a4e7e3475be441060e92213b3',1,'UDPC.h']]], + ['udpc_5fget_5freceiving_5fevents_37',['UDPC_get_receiving_events',['../UDPC_8h.html#a8c74f1b9ee0fec610087f83096c9679d',1,'UDPC.h']]], + ['udpc_5fhas_5fconnection_38',['UDPC_has_connection',['../UDPC_8h.html#a4a555a011e95445ed4a2aa88deb17082',1,'UDPC.h']]], + ['udpc_5fhas_5fwhitelist_5fpk_39',['UDPC_has_whitelist_pk',['../UDPC_8h.html#a94660d04e7f9b4d9c51a7b2c67707172',1,'UDPC.h']]], + ['udpc_5finfo_40',['UDPC_INFO',['../UDPC_8h.html#a248f51c4df127b7fd3a5c91ad5509d15',1,'UDPC.h']]], + ['udpc_5finit_41',['UDPC_init',['../UDPC_8h.html#a89dee65fcd5b70d25abbf6d4a3ee59f2',1,'UDPC.h']]], + ['udpc_5finit_5fthreaded_5fupdate_42',['UDPC_init_threaded_update',['../UDPC_8h.html#a614e2a058b89839d53fe9d348a058323',1,'UDPC.h']]], + ['udpc_5finit_5fthreaded_5fupdate_5fms_43',['UDPC_init_threaded_update_ms',['../UDPC_8h.html#ab9a5258877ad3084f7d29954be525bd6',1,'UDPC.h']]], + ['udpc_5fis_5fvalid_5fcontext_44',['UDPC_is_valid_context',['../UDPC_8h.html#ac01480f803b063e2b44794420df0f671',1,'UDPC.h']]], + ['udpc_5fpacket_5fmax_5fsize_45',['UDPC_PACKET_MAX_SIZE',['../UDPC_8h.html#a8ed92f1223b3f658536728f22d3b3827',1,'UDPC.h']]], + ['udpc_5fpacketinfo_46',['UDPC_PacketInfo',['../UDPC_8h.html#ae0261958047ebb5c6a402aa805e4e55b',1,'UDPC_PacketInfo(): UDPC.h'],['../structUDPC__PacketInfo.html',1,'UDPC_PacketInfo']]], + ['udpc_5fqueue_5fsend_47',['UDPC_queue_send',['../UDPC_8h.html#a7527954b63f502479bdd3771df7cf3a4',1,'UDPC.h']]], + ['udpc_5fremove_5fwhitelist_5fpk_48',['UDPC_remove_whitelist_pk',['../UDPC_8h.html#abc2d3284e5c45d6cd888154e813a1383',1,'UDPC.h']]], + ['udpc_5fset_5faccept_5fnew_5fconnections_49',['UDPC_set_accept_new_connections',['../UDPC_8h.html#a32e217a02b2e8ba05568aabfaecbcdcb',1,'UDPC.h']]], + ['udpc_5fset_5fauth_5fpolicy_50',['UDPC_set_auth_policy',['../UDPC_8h.html#a8d0dbbd258e17844a2f9a0e277789581',1,'UDPC.h']]], + ['udpc_5fset_5flibsodium_5fkey_5feasy_51',['UDPC_set_libsodium_key_easy',['../UDPC_8h.html#ad7eb0c77561f84a63dad29388d099fbe',1,'UDPC.h']]], + ['udpc_5fset_5flibsodium_5fkeys_52',['UDPC_set_libsodium_keys',['../UDPC_8h.html#abd0a7d5c0a17cf3351dbe5abf5f70df1',1,'UDPC.h']]], + ['udpc_5fset_5flogging_5ftype_53',['UDPC_set_logging_type',['../UDPC_8h.html#a6c90dc723e67a07bf65c1fc97e526305',1,'UDPC.h']]], + ['udpc_5fset_5fprotocol_5fid_54',['UDPC_set_protocol_id',['../UDPC_8h.html#a0720bec1922660c983b1b3d9f6a5de3a',1,'UDPC.h']]], + ['udpc_5fset_5freceiving_5fevents_55',['UDPC_set_receiving_events',['../UDPC_8h.html#a380c91ee395cff22189c7988c3381787',1,'UDPC.h']]], + ['udpc_5fsilent_56',['UDPC_SILENT',['../UDPC_8h.html#aa5c197773a0914125cb358771139065c',1,'UDPC.h']]], + ['udpc_5fstrtoa_57',['UDPC_strtoa',['../UDPC_8h.html#a2ae8e7d87f785dd3b3353a00005c3dc6',1,'UDPC.h']]], + ['udpc_5funset_5flibsodium_5fkeys_58',['UDPC_unset_libsodium_keys',['../UDPC_8h.html#a62a5131b90653ccbfc86ad5db4031ba9',1,'UDPC.h']]], + ['udpc_5fupdate_59',['UDPC_update',['../UDPC_8h.html#a68fefba9edca7cd0a81d97ac27c70c0b',1,'UDPC.h']]], + ['udpc_5fverbose_60',['UDPC_VERBOSE',['../UDPC_8h.html#ad5741af4e5cf1da40fe4a7b92cd1c431',1,'UDPC.h']]], + ['udpc_5fwarning_61',['UDPC_WARNING',['../UDPC_8h.html#a9cc5d705069747eb439a1c5607baac17',1,'UDPC.h']]], + ['udpconnection_62',['UDPConnection',['../index.html',1,'']]] +]; diff --git a/search/all_6.html b/search/all_6.html new file mode 100644 index 0000000..f1e516d --- /dev/null +++ b/search/all_6.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/all_6.js b/search/all_6.js new file mode 100644 index 0000000..9ed5e0a --- /dev/null +++ b/search/all_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['value_63',['Value',['../unionUDPC__Event_1_1Value.html',1,'UDPC_Event']]] +]; diff --git a/search/classes_0.html b/search/classes_0.html new file mode 100644 index 0000000..af8159e --- /dev/null +++ b/search/classes_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_0.js b/search/classes_0.js new file mode 100644 index 0000000..a6138eb --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['udpc_5fconnectionid_64',['UDPC_ConnectionId',['../structUDPC__ConnectionId.html',1,'']]], + ['udpc_5fevent_65',['UDPC_Event',['../structUDPC__Event.html',1,'']]], + ['udpc_5fpacketinfo_66',['UDPC_PacketInfo',['../structUDPC__PacketInfo.html',1,'']]] +]; diff --git a/search/classes_1.html b/search/classes_1.html new file mode 100644 index 0000000..576e916 --- /dev/null +++ b/search/classes_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 0000000..6eea1f9 --- /dev/null +++ b/search/classes_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['value_67',['Value',['../unionUDPC__Event_1_1Value.html',1,'UDPC_Event']]] +]; diff --git a/search/close.svg b/search/close.svg new file mode 100644 index 0000000..a933eea --- /dev/null +++ b/search/close.svg @@ -0,0 +1,31 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/search/defines_0.html b/search/defines_0.html new file mode 100644 index 0000000..15cc3de --- /dev/null +++ b/search/defines_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/defines_0.js b/search/defines_0.js new file mode 100644 index 0000000..c833ad0 --- /dev/null +++ b/search/defines_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['udpc_5fpacket_5fmax_5fsize_129',['UDPC_PACKET_MAX_SIZE',['../UDPC_8h.html#a8ed92f1223b3f658536728f22d3b3827',1,'UDPC.h']]] +]; diff --git a/search/files_0.html b/search/files_0.html new file mode 100644 index 0000000..9498842 --- /dev/null +++ b/search/files_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/files_0.js b/search/files_0.js new file mode 100644 index 0000000..8c9a627 --- /dev/null +++ b/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['udpc_2eh_68',['UDPC.h',['../UDPC_8h.html',1,'']]] +]; diff --git a/search/functions_0.html b/search/functions_0.html new file mode 100644 index 0000000..eb4c501 --- /dev/null +++ b/search/functions_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/functions_0.js b/search/functions_0.js new file mode 100644 index 0000000..f1c155c --- /dev/null +++ b/search/functions_0.js @@ -0,0 +1,45 @@ +var searchData= +[ + ['udpc_5fadd_5fwhitelist_5fpk_69',['UDPC_add_whitelist_pk',['../UDPC_8h.html#a71f9bf85a02ddd1b4c921fe9b6694fe8',1,'UDPC.h']]], + ['udpc_5fclear_5fwhitelist_70',['UDPC_clear_whitelist',['../UDPC_8h.html#a0e2e0c6a6a442db2cb3223d26f849d26',1,'UDPC.h']]], + ['udpc_5fclient_5finitiate_5fconnection_71',['UDPC_client_initiate_connection',['../UDPC_8h.html#a1192e0307f75feeac888fe5d49976f55',1,'UDPC.h']]], + ['udpc_5fcreate_5fid_72',['UDPC_create_id',['../UDPC_8h.html#aea7e32ca9fdc04530f95c97459391e6d',1,'UDPC.h']]], + ['udpc_5fcreate_5fid_5fanyaddr_73',['UDPC_create_id_anyaddr',['../UDPC_8h.html#a0fa3e1e54877029a226ab9cfb74215df',1,'UDPC.h']]], + ['udpc_5fcreate_5fid_5feasy_74',['UDPC_create_id_easy',['../UDPC_8h.html#a8b80d2df882f03aeee8a92bed7fb0131',1,'UDPC.h']]], + ['udpc_5fcreate_5fid_5ffull_75',['UDPC_create_id_full',['../UDPC_8h.html#ab7cb345ce117c04017afd443e5748f19',1,'UDPC.h']]], + ['udpc_5fdestroy_76',['UDPC_destroy',['../UDPC_8h.html#aad0e88866d4c5cb9c0676bc8d7df574e',1,'UDPC.h']]], + ['udpc_5fdisable_5fthreaded_5fupdate_77',['UDPC_disable_threaded_update',['../UDPC_8h.html#a404d2c7a83903004f928737241ecc63a',1,'UDPC.h']]], + ['udpc_5fdrop_5fconnection_78',['UDPC_drop_connection',['../UDPC_8h.html#a44bc5cc29862c93e938ac8a625c56380',1,'UDPC.h']]], + ['udpc_5fenable_5fthreaded_5fupdate_79',['UDPC_enable_threaded_update',['../UDPC_8h.html#a0fafce547e9185c29f42d06213b0ff4f',1,'UDPC.h']]], + ['udpc_5fenable_5fthreaded_5fupdate_5fms_80',['UDPC_enable_threaded_update_ms',['../UDPC_8h.html#a1a50763773d55aa7a2a9c7ad69575833',1,'UDPC.h']]], + ['udpc_5ffree_5flist_5fconnected_81',['UDPC_free_list_connected',['../UDPC_8h.html#a8880067a93211c257763c42264f6ceef',1,'UDPC.h']]], + ['udpc_5ffree_5fpacketinfo_82',['UDPC_free_PacketInfo',['../UDPC_8h.html#a68ed6dcb37c6024486fad28ab0bed845',1,'UDPC.h']]], + ['udpc_5fget_5fauth_5fpolicy_83',['UDPC_get_auth_policy',['../UDPC_8h.html#ab79769e36a92c346c6c410be158ddfe4',1,'UDPC.h']]], + ['udpc_5fget_5fevent_84',['UDPC_get_event',['../UDPC_8h.html#a2c05c6fe89edde1e05ba9b6d8b5f7510',1,'UDPC.h']]], + ['udpc_5fget_5flist_5fconnected_85',['UDPC_get_list_connected',['../UDPC_8h.html#a7fe3e502f4c6f86ce5b2cd1f303aa213',1,'UDPC.h']]], + ['udpc_5fget_5flogging_5ftype_86',['UDPC_get_logging_type',['../UDPC_8h.html#ad0c7d69eeda20e98696d5c89bbbab096',1,'UDPC.h']]], + ['udpc_5fget_5fmax_5fqueued_5fsize_87',['UDPC_get_max_queued_size',['../UDPC_8h.html#a7983f38fe13677f5b35b90cefa54974f',1,'UDPC.h']]], + ['udpc_5fget_5fprotocol_5fid_88',['UDPC_get_protocol_id',['../UDPC_8h.html#aab6fb21c6f5b44123e2660f84561d404',1,'UDPC.h']]], + ['udpc_5fget_5fqueue_5fsend_5fcurrent_5fsize_89',['UDPC_get_queue_send_current_size',['../UDPC_8h.html#aa3f67ad23ae34b647b7f4dd17a8a96dd',1,'UDPC.h']]], + ['udpc_5fget_5fqueued_5fsize_90',['UDPC_get_queued_size',['../UDPC_8h.html#a1fb87c1522d353bd9fde4c94ec8454c2',1,'UDPC.h']]], + ['udpc_5fget_5freceived_91',['UDPC_get_received',['../UDPC_8h.html#affa8655a4e7e3475be441060e92213b3',1,'UDPC.h']]], + ['udpc_5fget_5freceiving_5fevents_92',['UDPC_get_receiving_events',['../UDPC_8h.html#a8c74f1b9ee0fec610087f83096c9679d',1,'UDPC.h']]], + ['udpc_5fhas_5fconnection_93',['UDPC_has_connection',['../UDPC_8h.html#a4a555a011e95445ed4a2aa88deb17082',1,'UDPC.h']]], + ['udpc_5fhas_5fwhitelist_5fpk_94',['UDPC_has_whitelist_pk',['../UDPC_8h.html#a94660d04e7f9b4d9c51a7b2c67707172',1,'UDPC.h']]], + ['udpc_5finit_95',['UDPC_init',['../UDPC_8h.html#a89dee65fcd5b70d25abbf6d4a3ee59f2',1,'UDPC.h']]], + ['udpc_5finit_5fthreaded_5fupdate_96',['UDPC_init_threaded_update',['../UDPC_8h.html#a614e2a058b89839d53fe9d348a058323',1,'UDPC.h']]], + ['udpc_5finit_5fthreaded_5fupdate_5fms_97',['UDPC_init_threaded_update_ms',['../UDPC_8h.html#ab9a5258877ad3084f7d29954be525bd6',1,'UDPC.h']]], + ['udpc_5fis_5fvalid_5fcontext_98',['UDPC_is_valid_context',['../UDPC_8h.html#ac01480f803b063e2b44794420df0f671',1,'UDPC.h']]], + ['udpc_5fqueue_5fsend_99',['UDPC_queue_send',['../UDPC_8h.html#a7527954b63f502479bdd3771df7cf3a4',1,'UDPC.h']]], + ['udpc_5fremove_5fwhitelist_5fpk_100',['UDPC_remove_whitelist_pk',['../UDPC_8h.html#abc2d3284e5c45d6cd888154e813a1383',1,'UDPC.h']]], + ['udpc_5fset_5faccept_5fnew_5fconnections_101',['UDPC_set_accept_new_connections',['../UDPC_8h.html#a32e217a02b2e8ba05568aabfaecbcdcb',1,'UDPC.h']]], + ['udpc_5fset_5fauth_5fpolicy_102',['UDPC_set_auth_policy',['../UDPC_8h.html#a8d0dbbd258e17844a2f9a0e277789581',1,'UDPC.h']]], + ['udpc_5fset_5flibsodium_5fkey_5feasy_103',['UDPC_set_libsodium_key_easy',['../UDPC_8h.html#ad7eb0c77561f84a63dad29388d099fbe',1,'UDPC.h']]], + ['udpc_5fset_5flibsodium_5fkeys_104',['UDPC_set_libsodium_keys',['../UDPC_8h.html#abd0a7d5c0a17cf3351dbe5abf5f70df1',1,'UDPC.h']]], + ['udpc_5fset_5flogging_5ftype_105',['UDPC_set_logging_type',['../UDPC_8h.html#a6c90dc723e67a07bf65c1fc97e526305',1,'UDPC.h']]], + ['udpc_5fset_5fprotocol_5fid_106',['UDPC_set_protocol_id',['../UDPC_8h.html#a0720bec1922660c983b1b3d9f6a5de3a',1,'UDPC.h']]], + ['udpc_5fset_5freceiving_5fevents_107',['UDPC_set_receiving_events',['../UDPC_8h.html#a380c91ee395cff22189c7988c3381787',1,'UDPC.h']]], + ['udpc_5fstrtoa_108',['UDPC_strtoa',['../UDPC_8h.html#a2ae8e7d87f785dd3b3353a00005c3dc6',1,'UDPC.h']]], + ['udpc_5funset_5flibsodium_5fkeys_109',['UDPC_unset_libsodium_keys',['../UDPC_8h.html#a62a5131b90653ccbfc86ad5db4031ba9',1,'UDPC.h']]], + ['udpc_5fupdate_110',['UDPC_update',['../UDPC_8h.html#a68fefba9edca7cd0a81d97ac27c70c0b',1,'UDPC.h']]] +]; diff --git a/search/mag_sel.svg b/search/mag_sel.svg new file mode 100644 index 0000000..03626f6 --- /dev/null +++ b/search/mag_sel.svg @@ -0,0 +1,74 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/search/nomatches.html b/search/nomatches.html new file mode 100644 index 0000000..2b9360b --- /dev/null +++ b/search/nomatches.html @@ -0,0 +1,13 @@ + + + + + + + + +
    +
    No Matches
    +
    + + diff --git a/search/pages_0.html b/search/pages_0.html new file mode 100644 index 0000000..8517b48 --- /dev/null +++ b/search/pages_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/pages_0.js b/search/pages_0.js new file mode 100644 index 0000000..8788991 --- /dev/null +++ b/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['udpconnection_130',['UDPConnection',['../index.html',1,'']]] +]; diff --git a/search/search.css b/search/search.css new file mode 100644 index 0000000..9074198 --- /dev/null +++ b/search/search.css @@ -0,0 +1,257 @@ +/*---------------- Search Box */ + +#MSearchBox { + white-space : nowrap; + background: white; + border-radius: 0.65em; + box-shadow: inset 0.5px 0.5px 3px 0px #555; + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + height: 1.4em; + padding: 0 0 0 0.3em; + margin: 0; +} + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 1.1em; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: #909090; + outline: none; + font-family: Arial, Verdana, sans-serif; + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + height: 1.4em; + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: #000000; +} + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #90A5CE; + background-color: #F9FAFC; + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt Arial, Verdana, sans-serif; + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: monospace; + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: #000000; + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: #000000; + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: #FFFFFF; + background-color: #3D578C; + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + width: 60ex; + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid #000; + background-color: #EEF1F7; + z-index:10000; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; + padding-bottom: 15px; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +body.SRPage { + margin: 5px 2px; +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: #425E97; + font-family: Arial, Verdana, sans-serif; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: Arial, Verdana, sans-serif; +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: Arial, Verdana, sans-serif; +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.searchresult { + background-color: #F0F3F8; +} + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: url("../tab_a.png"); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/search/search.js b/search/search.js new file mode 100644 index 0000000..fb226f7 --- /dev/null +++ b/search/search.js @@ -0,0 +1,816 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function convertToId(search) +{ + var result = ''; + for (i=0;i do a search + { + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) // Up + { + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } + else if (e.keyCode==13 || e.keyCode==27) + { + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() + { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() + { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() + { + this.keyTimeout = 0; + + // strip leading whitespace + var searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + var code = searchValue.toLowerCase().charCodeAt(0); + var idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) // surrogate pair + { + idxChar = searchValue.substr(0, 2); + } + + var resultsPage; + var resultsPageWithSearch; + var hasResultsPage; + + var idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) + { + var hexCode=idx.toString(16); + resultsPage = this.resultsPath + '/' + indexSectionNames[this.searchIndex] + '_' + hexCode + this.extension; + resultsPageWithSearch = resultsPage+'?'+escape(searchValue); + hasResultsPage = true; + } + else // nothing available for this search term + { + resultsPage = this.resultsPath + '/nomatches' + this.extension; + resultsPageWithSearch = resultsPage; + hasResultsPage = false; + } + + window.frames.MSearchResults.location = resultsPageWithSearch; + var domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + + if (domPopupSearchResultsWindow.style.display!='block') + { + var domSearchBox = this.DOMSearchBox(); + this.DOMSearchClose().style.display = 'inline-block'; + if (this.insideFrame) + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + domPopupSearchResultsWindow.style.position = 'relative'; + domPopupSearchResultsWindow.style.display = 'block'; + var width = document.body.clientWidth - 8; // the -8 is for IE :-( + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResults.style.width = width + 'px'; + } + else + { + var domPopupSearchResults = this.DOMPopupSearchResults(); + var left = getXPos(domSearchBox) + 150; // domSearchBox.offsetWidth; + var top = getYPos(domSearchBox) + 20; // domSearchBox.offsetHeight + 1; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + } + } + + this.lastSearchValue = searchValue; + this.lastResultsPage = resultsPage; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) + { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) + { + this.DOMSearchBox().className = 'MSearchBoxActive'; + + var searchField = this.DOMSearchField(); + + if (searchField.value == this.searchLabel) // clear "Search" term upon entry + { + searchField.value = ''; + this.searchActive = true; + } + } + else if (!isActive) // directly remove the panel + { + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.DOMSearchField().value = this.searchLabel; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults(name) +{ + // The number of matches from the last run of . + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) + { + var parentElement = document.getElementById(id); + var element = parentElement.firstChild; + + while (element && element!=parentElement) + { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') + { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) + { + element = element.firstChild; + } + else if (element.nextSibling) + { + element = element.nextSibling; + } + else + { + do + { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) + { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) + { + var element = this.FindChildElement(id); + if (element) + { + if (element.style.display == 'block') + { + element.style.display = 'none'; + } + else + { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) + { + if (!search) // get search word from URL + { + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + var resultRows = document.getElementsByTagName("div"); + var matches = 0; + + var i = 0; + while (i < resultRows.length) + { + var row = resultRows.item(i); + if (row.className == "SRResult") + { + var rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) + { + row.style.display = 'block'; + matches++; + } + else + { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) // no results + { + document.getElementById("NoMatches").style.display='block'; + } + else // at least one result + { + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) + { + var focusItem; + while (1) + { + var focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') + { + break; + } + else if (!focusItem) // last element + { + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) + { + if (e.type == "keydown") + { + this.repeatOn = false; + this.lastKey = e.keyCode; + } + else if (e.type == "keypress") + { + if (!this.repeatOn) + { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } + else if (e.type == "keyup") + { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + var newIndex = itemIndex-1; + var focusItem = this.NavPrev(newIndex); + if (focusItem) + { + var child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') // children visible + { + var n=0; + var tmpElem; + while (1) // search for last child + { + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) + { + focusItem = tmpElem; + } + else // found it! + { + break; + } + n++; + } + } + } + if (focusItem) + { + focusItem.focus(); + } + else // return focus to search field + { + parent.document.getElementById("MSearchField").focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = itemIndex+1; + var focusItem; + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') // children visible + { + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } + else if (this.lastKey==39) // Right + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } + else if (this.lastKey==37) // Left + { + var item = document.getElementById('Item'+itemIndex); + var elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) + { + var e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) // Up + { + if (childIndex>0) + { + var newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } + else // already at first child, jump to parent + { + document.getElementById('Item'+itemIndex).focus(); + } + } + else if (this.lastKey==40) // Down + { + var newIndex = childIndex+1; + var elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) // last child, jump to parent next parent + { + elem = this.NavNext(itemIndex+1); + } + if (elem) + { + elem.focus(); + } + } + else if (this.lastKey==27) // Escape + { + parent.searchBox.CloseResultsWindow(); + parent.document.getElementById("MSearchField").focus(); + } + else if (this.lastKey==13) // Enter + { + return true; + } + return false; + } +} + +function setKeyActions(elem,action) +{ + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); +} + +function setClassAttr(elem,attr) +{ + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); +} + +function createResults() +{ + var results = document.getElementById("SRResults"); + for (var e=0; e + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/typedefs_0.js b/search/typedefs_0.js new file mode 100644 index 0000000..8009f89 --- /dev/null +++ b/search/typedefs_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['udpc_5fauthpolicy_124',['UDPC_AuthPolicy',['../UDPC_8h.html#a228cd7ddf56a4e76e216bc3b80e8bd4a',1,'UDPC.h']]], + ['udpc_5fconnectionid_125',['UDPC_ConnectionId',['../UDPC_8h.html#ae5afb11964c7a55edf34ddf9097779b2',1,'UDPC.h']]], + ['udpc_5fevent_126',['UDPC_Event',['../UDPC_8h.html#a7b3215b65686670720f098eda2ca1eed',1,'UDPC.h']]], + ['udpc_5feventtype_127',['UDPC_EventType',['../UDPC_8h.html#adaa0534bf7f04bb2f6ce8975c99c4af0',1,'UDPC.h']]], + ['udpc_5fpacketinfo_128',['UDPC_PacketInfo',['../UDPC_8h.html#ae0261958047ebb5c6a402aa805e4e55b',1,'UDPC.h']]] +]; diff --git a/search/variables_0.html b/search/variables_0.html new file mode 100644 index 0000000..1e477c0 --- /dev/null +++ b/search/variables_0.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_0.js b/search/variables_0.js new file mode 100644 index 0000000..0c3c3b0 --- /dev/null +++ b/search/variables_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['data_111',['data',['../structUDPC__PacketInfo.html#a1358f91f28c4a023ef201e868bf1069e',1,'UDPC_PacketInfo']]], + ['datasize_112',['dataSize',['../structUDPC__PacketInfo.html#a70230a2eb6a638d9e9fc04e230c92a74',1,'UDPC_PacketInfo']]] +]; diff --git a/search/variables_1.html b/search/variables_1.html new file mode 100644 index 0000000..ea73d9a --- /dev/null +++ b/search/variables_1.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_1.js b/search/variables_1.js new file mode 100644 index 0000000..fda11d3 --- /dev/null +++ b/search/variables_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['flags_113',['flags',['../structUDPC__PacketInfo.html#ad538ac2682e8276dc33553237f012ce1',1,'UDPC_PacketInfo']]] +]; diff --git a/search/variables_2.html b/search/variables_2.html new file mode 100644 index 0000000..0580462 --- /dev/null +++ b/search/variables_2.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_2.js b/search/variables_2.js new file mode 100644 index 0000000..9259395 --- /dev/null +++ b/search/variables_2.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['id_114',['id',['../structUDPC__PacketInfo.html#ac21cc9beab22eb1e1a2d5c0797ed0fbe',1,'UDPC_PacketInfo']]] +]; diff --git a/search/variables_3.html b/search/variables_3.html new file mode 100644 index 0000000..0d69e76 --- /dev/null +++ b/search/variables_3.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_3.js b/search/variables_3.js new file mode 100644 index 0000000..0571ee3 --- /dev/null +++ b/search/variables_3.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['receiver_115',['receiver',['../structUDPC__PacketInfo.html#a965f393584d389dc72becd439cafde0d',1,'UDPC_PacketInfo']]] +]; diff --git a/search/variables_4.html b/search/variables_4.html new file mode 100644 index 0000000..a4b6506 --- /dev/null +++ b/search/variables_4.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_4.js b/search/variables_4.js new file mode 100644 index 0000000..9e2dbaf --- /dev/null +++ b/search/variables_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['sender_116',['sender',['../structUDPC__PacketInfo.html#a5af734c663d3df72dad2b81a8794b6dc',1,'UDPC_PacketInfo']]] +]; diff --git a/search/variables_5.html b/search/variables_5.html new file mode 100644 index 0000000..7e345d1 --- /dev/null +++ b/search/variables_5.html @@ -0,0 +1,37 @@ + + + + + + + + + + +
    +
    Loading...
    +
    + +
    Searching...
    +
    No Matches
    + +
    + + diff --git a/search/variables_5.js b/search/variables_5.js new file mode 100644 index 0000000..9272503 --- /dev/null +++ b/search/variables_5.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['udpc_5fauth_5fpolicy_5ffallback_117',['UDPC_AUTH_POLICY_FALLBACK',['../UDPC_8h.html#a96ecd597f88d458ed108f33e4f0a6612',1,'UDPC.h']]], + ['udpc_5fauth_5fpolicy_5fstrict_118',['UDPC_AUTH_POLICY_STRICT',['../UDPC_8h.html#a6af4629253b3ed1f411015410cee9ad3',1,'UDPC.h']]], + ['udpc_5ferror_119',['UDPC_ERROR',['../UDPC_8h.html#ac04213a4287500a9c5330f543eac3103',1,'UDPC.h']]], + ['udpc_5finfo_120',['UDPC_INFO',['../UDPC_8h.html#a248f51c4df127b7fd3a5c91ad5509d15',1,'UDPC.h']]], + ['udpc_5fsilent_121',['UDPC_SILENT',['../UDPC_8h.html#aa5c197773a0914125cb358771139065c',1,'UDPC.h']]], + ['udpc_5fverbose_122',['UDPC_VERBOSE',['../UDPC_8h.html#ad5741af4e5cf1da40fe4a7b92cd1c431',1,'UDPC.h']]], + ['udpc_5fwarning_123',['UDPC_WARNING',['../UDPC_8h.html#a9cc5d705069747eb439a1c5607baac17',1,'UDPC.h']]] +]; diff --git a/splitbar.png b/splitbar.png new file mode 100644 index 0000000..fe895f2 Binary files /dev/null and b/splitbar.png differ diff --git a/structUDPC__ConnectionId.html b/structUDPC__ConnectionId.html new file mode 100644 index 0000000..e04e6b6 --- /dev/null +++ b/structUDPC__ConnectionId.html @@ -0,0 +1,101 @@ + + + + + + + +UDPConnection: UDPC_ConnectionId Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    UDPConnection +
    +
    A network connection implementation over UDP
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    UDPC_ConnectionId Struct Reference
    +
    +
    + +

    Data identifying a peer via addr, port, and scope_id. + More...

    + +

    #include <UDPC.h>

    + + + + + + + + +

    +Data Fields

    +UDPC_IPV6_ADDR_TYPE addr
     
    +uint32_t scope_id
     
    +uint16_t port
     
    +

    Detailed Description

    +

    Data identifying a peer via addr, port, and scope_id.

    +

    This struct needn't be used directly; use UDPC_create_id(), UDPC_create_id_full(), UDPC_create_id_anyaddr(), or UDPC_create_id_easy() to create one. This struct does not hold dynamic data, so there is no need to free it.

    +

    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/structUDPC__Event.html b/structUDPC__Event.html new file mode 100644 index 0000000..576d9b9 --- /dev/null +++ b/structUDPC__Event.html @@ -0,0 +1,107 @@ + + + + + + + +UDPConnection: UDPC_Event Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    UDPConnection +
    +
    A network connection implementation over UDP
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    UDPC_Event Struct Reference
    +
    +
    + +

    A struct containing information related to the type of event. + More...

    + +

    #include <UDPC.h>

    + + + + +

    +Data Structures

    union  Value
     
    + + + + + + + +

    +Data Fields

    +UDPC_EventType type
     
    +UDPC_ConnectionId conId
     
    +union UDPC_Event::Value v
     
    +

    Detailed Description

    +

    A struct containing information related to the type of event.

    +

    Note that instances of this struct received from a call to UDPC_get_event() will not store any useful data in its union member variable v (it will only be used internally). Thus, all events received through a call to UDPC_get_event() will contain a valid UDPC_ConnectionId conId that identifies the peer that the event is referring to.

    +

    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/structUDPC__PacketInfo.html b/structUDPC__PacketInfo.html new file mode 100644 index 0000000..749ae70 --- /dev/null +++ b/structUDPC__PacketInfo.html @@ -0,0 +1,187 @@ + + + + + + + +UDPConnection: UDPC_PacketInfo Struct Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    UDPConnection +
    +
    A network connection implementation over UDP
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + +
    +
    + +
    +
    UDPC_PacketInfo Struct Reference
    +
    +
    + +

    Data representing a received/sent packet. + More...

    + +

    #include <UDPC.h>

    + + + + + + + + + + + + + + + + + + + + + +

    +Data Fields

    char * data
     
    uint32_t flags
     Flags indication some additional information about the received packet. More...
     
    uint32_t id
     The packet's id. More...
     
    uint16_t dataSize
     The size in bytes of the received packet's data inside the data pointer member variable. More...
     
    +uint16_t rtt
     
    +UDPC_ConnectionId sender
     The UDPC_ConnectionId of the sender.
     
    +UDPC_ConnectionId receiver
     The UDPC_ConnectionId of the receiver.
     
    +

    Detailed Description

    +

    Data representing a received/sent packet.

    +

    If data is NULL or dataSize is 0, then this packet is invalid.

    +
    Warning
    This struct must be free'd with a call to UDPC_free_PacketInfo to avoid a memory leak.
    +

    Field Documentation

    + +

    ◆ data

    + +
    +
    + + + + +
    char* UDPC_PacketInfo::data
    +
    +

    A char array of size dataSize. Will be NULL if this UDPC_PacketInfo is invalid.

    + +
    +
    + +

    ◆ dataSize

    + +
    +
    + + + + +
    uint16_t UDPC_PacketInfo::dataSize
    +
    + +

    The size in bytes of the received packet's data inside the data pointer member variable.

    +

    UDPC does not return an empty packet when calling UDPC_get_received(), so in such a packet dataSize shouldn't be zero. (UDPC only stores received packets that do have a payload.) This means that if this variable is 0, then this UDPC_PacketInfo is invalid.

    + +
    +
    + +

    ◆ flags

    + +
    +
    + + + + +
    uint32_t UDPC_PacketInfo::flags
    +
    + +

    Flags indication some additional information about the received packet.

    +

    The following list indicates what each used bit in flags refers to.

      +
    • 0x1: Is an initiate-connection packet
    • +
    • 0x2: Is a ping packet
    • +
    • 0x4: Is a packet that will not be re-sent if not received
    • +
    • 0x8: Is a packet that was re-sent
    • +
    + +
    +
    + +

    ◆ id

    + +
    +
    + + + + +
    uint32_t UDPC_PacketInfo::id
    +
    + +

    The packet's id.

    +

    Packets start with id = 0, and will wrap around. This can be used to determine specifically how out of order a packet may be.

    + +
    +
    +
    The documentation for this struct was generated from the following file: +
    + + + + diff --git a/sync_off.png b/sync_off.png new file mode 100644 index 0000000..3b443fc Binary files /dev/null and b/sync_off.png differ diff --git a/sync_on.png b/sync_on.png new file mode 100644 index 0000000..e08320f Binary files /dev/null and b/sync_on.png differ diff --git a/tab_a.png b/tab_a.png new file mode 100644 index 0000000..3b725c4 Binary files /dev/null and b/tab_a.png differ diff --git a/tab_b.png b/tab_b.png new file mode 100644 index 0000000..e2b4a86 Binary files /dev/null and b/tab_b.png differ diff --git a/tab_h.png b/tab_h.png new file mode 100644 index 0000000..fd5cb70 Binary files /dev/null and b/tab_h.png differ diff --git a/tab_s.png b/tab_s.png new file mode 100644 index 0000000..ab478c9 Binary files /dev/null and b/tab_s.png differ diff --git a/tabs.css b/tabs.css new file mode 100644 index 0000000..85a0cd5 --- /dev/null +++ b/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sm-dox{background-image:url("tab_b.png")}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:"Lucida Grande","Geneva","Helvetica",Arial,sans-serif;font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:0 1px 1px rgba(255,255,255,0.9);color:#283a5d;outline:0}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace!important;text-align:center;text-shadow:none;background:rgba(255,255,255,0.5);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:rgba(162,162,162,0.1)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:white;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:url("tab_b.png");line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:#283a5d transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:url("tab_s.png");background-repeat:no-repeat;background-position:right;-moz-border-radius:0!important;-webkit-border-radius:0;border-radius:0!important}.sm-dox a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox a:hover span.sub-arrow{border-color:white transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent #fff transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:#fff;-moz-border-radius:5px!important;-webkit-border-radius:5px;border-radius:5px!important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent #555;border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:#555;background-image:none;border:0!important;color:#555;background-image:none}.sm-dox ul a:hover{background-image:url("tab_a.png");background-repeat:repeat-x;color:white;text-shadow:0 1px 1px black}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent white}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:#fff;height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent #555 transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:#555 transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px!important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:url("tab_b.png")}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:#fff}} \ No newline at end of file diff --git a/unionUDPC__Event_1_1Value.html b/unionUDPC__Event_1_1Value.html new file mode 100644 index 0000000..8f11037 --- /dev/null +++ b/unionUDPC__Event_1_1Value.html @@ -0,0 +1,94 @@ + + + + + + + +UDPConnection: UDPC_Event::Value Union Reference + + + + + + + + + +
    +
    + + + + + + +
    +
    UDPConnection +
    +
    A network connection implementation over UDP
    +
    +
    + + + + + + + + +
    +
    + + +
    + +
    + + +
    +
    + +
    +
    UDPC_Event::Value Union Reference
    +
    +
    + + + + + + +

    +Data Fields

    +int dropAllWithAddr
     
    +int enableLibSodium
     
    +
    The documentation for this union was generated from the following file: +
    + + + +