/** @file
  EFI TCPv4(Transmission Control Protocol version 4) Protocol Definition
  The EFI TCPv4 Service Binding Protocol is used to locate EFI TCPv4 Protocol drivers to create
  and destroy child of the driver to communicate with other host using TCP protocol.
  The EFI TCPv4 Protocol provides services to send and receive data stream.

Copyright (c) 2006 - 2010, Intel Corporation.  All rights reserved<BR>
This program and the accompanying materials are licensed and made available under 
the terms and conditions of the BSD License that accompanies this distribution.  
The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php.                                          
    
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

  @par Revision Reference:
  This Protocol is introduced in UEFI Specification 2.0.

**/

#ifndef __EFI_TCP4_PROTOCOL_H__
#define __EFI_TCP4_PROTOCOL_H__

#include <Protocol/Ip4.h>

#define EFI_TCP4_SERVICE_BINDING_PROTOCOL_GUID \
  { \
    0x00720665, 0x67EB, 0x4a99, {0xBA, 0xF7, 0xD3, 0xC3, 0x3A, 0x1C, 0x7C, 0xC9 } \
  }

#define EFI_TCP4_PROTOCOL_GUID \
  { \
    0x65530BC7, 0xA359, 0x410f, {0xB0, 0x10, 0x5A, 0xAD, 0xC7, 0xEC, 0x2B, 0x62 } \
  }

typedef struct _EFI_TCP4_PROTOCOL EFI_TCP4_PROTOCOL;

typedef struct {
  EFI_HANDLE              InstanceHandle;
  EFI_IPv4_ADDRESS        LocalAddress;
  UINT16                  LocalPort;
  EFI_IPv4_ADDRESS        RemoteAddress;
  UINT16                  RemotePort;
} EFI_TCP4_SERVICE_POINT;

typedef struct {
  EFI_HANDLE              DriverHandle;
  UINT32                  ServiceCount;
  EFI_TCP4_SERVICE_POINT  Services[1];
} EFI_TCP4_VARIABLE_DATA;

typedef struct {
  BOOLEAN                 UseDefaultAddress;
  EFI_IPv4_ADDRESS        StationAddress;
  EFI_IPv4_ADDRESS        SubnetMask;
  UINT16                  StationPort;
  EFI_IPv4_ADDRESS        RemoteAddress;
  UINT16                  RemotePort;
  BOOLEAN                 ActiveFlag;
} EFI_TCP4_ACCESS_POINT;

typedef struct {
  UINT32                  ReceiveBufferSize;
  UINT32                  SendBufferSize;
  UINT32                  MaxSynBackLog;
  UINT32                  ConnectionTimeout;
  UINT32                  DataRetries;
  UINT32                  FinTimeout;
  UINT32                  TimeWaitTimeout;
  UINT32                  KeepAliveProbes;
  UINT32                  KeepAliveTime;
  UINT32                  KeepAliveInterval;
  BOOLEAN                 EnableNagle;
  BOOLEAN                 EnableTimeStamp;
  BOOLEAN                 EnableWindowScaling;
  BOOLEAN                 EnableSelectiveAck;
  BOOLEAN                 EnablePathMtuDiscovery;
} EFI_TCP4_OPTION;

typedef struct {
  //
  // I/O parameters
  //
  UINT8                   TypeOfService;
  UINT8                   TimeToLive;

  //
  // Access Point
  //
  EFI_TCP4_ACCESS_POINT   AccessPoint;

  //
  // TCP Control Options
  //
  EFI_TCP4_OPTION         *ControlOption;
} EFI_TCP4_CONFIG_DATA;

///
/// TCP4 connnection state
///
typedef enum {
  Tcp4StateClosed         = 0,
  Tcp4StateListen         = 1,
  Tcp4StateSynSent        = 2,
  Tcp4StateSynReceived    = 3,
  Tcp4StateEstablished    = 4,
  Tcp4StateFinWait1       = 5,
  Tcp4StateFinWait2       = 6,
  Tcp4StateClosing        = 7,
  Tcp4StateTimeWait       = 8,
  Tcp4StateCloseWait      = 9,
  Tcp4StateLastAck        = 10
} EFI_TCP4_CONNECTION_STATE;

typedef struct {
  EFI_EVENT   Event;
  EFI_STATUS  Status;
} EFI_TCP4_COMPLETION_TOKEN;

typedef struct {
  ///
  /// The Status in the CompletionToken will be set to one of
  /// the following values if the active open succeeds or an unexpected
  /// error happens:
  /// EFI_SUCCESS:              The active open succeeds and the instance's
  ///                           state is Tcp4StateEstablished.
  /// EFI_CONNECTION_RESET:     The connect fails because the connection is reset
  ///                           either by instance itself or the communication peer.
  /// EFI_CONNECTION_REFUSED:   The connect fails because this connection is initiated with
  ///                           an active open and the connection is refused.
  /// EFI_ABORTED:              The active open is aborted.
  /// EFI_TIMEOUT:              The connection establishment timer expires and
  ///                           no more specific information is available.
  /// EFI_NETWORK_UNREACHABLE:  The active open fails because
  ///                           an ICMP network unreachable error is received.
  /// EFI_HOST_UNREACHABLE:     The active open fails because an
  ///                           ICMP host unreachable error is received.
  /// EFI_PROTOCOL_UNREACHABLE: The active open fails
  ///                           because an ICMP protocol unreachable error is received.
  /// EFI_PORT_UNREACHABLE:     The connection establishment
  ///                           timer times out and an ICMP port unreachable error is received.
  /// EFI_ICMP_ERROR:           The connection establishment timer timeout and some other ICMP
  ///                           error is received.
  /// EFI_DEVICE_ERROR:         An unexpected system or network error occurred.
  /// EFI_NO_MEDIA:             There was a media error.
  ///
  EFI_TCP4_COMPLETION_TOKEN CompletionToken;
} EFI_TCP4_CONNECTION_TOKEN;

typedef struct {
  EFI_TCP4_COMPLETION_TOKEN CompletionToken;
  EFI_HANDLE                NewChildHandle;
} EFI_TCP4_LISTEN_TOKEN;

typedef struct {
  UINT32 FragmentLength;
  VOID   *FragmentBuffer;
} EFI_TCP4_FRAGMENT_DATA;

typedef struct {
  BOOLEAN                   UrgentFlag;
  UINT32                    DataLength;
  UINT32                    FragmentCount;
  EFI_TCP4_FRAGMENT_DATA    FragmentTable[1];
} EFI_TCP4_RECEIVE_DATA;

typedef struct {
  BOOLEAN                   Push;
  BOOLEAN                   Urgent;
  UINT32                    DataLength;
  UINT32                    FragmentCount;
  EFI_TCP4_FRAGMENT_DATA    FragmentTable[1];
} EFI_TCP4_TRANSMIT_DATA;

typedef struct {
  ///
  /// When transmission finishes or meets any unexpected error it will
  /// be set to one of the following values:
  /// EFI_SUCCESS:              The receiving or transmission operation
  ///                           completes successfully.
  /// EFI_CONNECTION_FIN:       The receiving operation fails because the communication peer
  ///                           has closed the connection and there is no more data in the
  ///                           receive buffer of the instance.
  /// EFI_CONNECTION_RESET:     The receiving or transmission operation fails
  ///                           because this connection is reset either by instance
  ///                           itself or the communication peer.
  /// EFI_ABORTED:              The receiving or transmission is aborted.
  /// EFI_TIMEOUT:              The transmission timer expires and no more
  ///                           specific information is available.
  /// EFI_NETWORK_UNREACHABLE:  The transmission fails
  ///                           because an ICMP network unreachable error is received.
  /// EFI_HOST_UNREACHABLE:     The transmission fails because an
  ///                           ICMP host unreachable error is received.
  /// EFI_PROTOCOL_UNREACHABLE: The transmission fails
  ///                           because an ICMP protocol unreachable error is received.
  /// EFI_PORT_UNREACHABLE:     The transmission fails and an
  ///                           ICMP port unreachable error is received.
  /// EFI_ICMP_ERROR:           The transmission fails and some other
  ///                           ICMP error is received.
  /// EFI_DEVICE_ERROR:         An unexpected system or network error occurs.
  /// EFI_NO_MEDIA:             There was a media error.
  ///
  EFI_TCP4_COMPLETION_TOKEN CompletionToken;
  union {
    ///
    /// When this token is used for receiving, RxData is a pointer to EFI_TCP4_RECEIVE_DATA.
    ///
    EFI_TCP4_RECEIVE_DATA   *RxData;
    ///
    /// When this token is used for transmitting, TxData is a pointer to EFI_TCP4_TRANSMIT_DATA.
    ///
    EFI_TCP4_TRANSMIT_DATA  *TxData;
  } Packet;
} EFI_TCP4_IO_TOKEN;

typedef struct {
  EFI_TCP4_COMPLETION_TOKEN CompletionToken;
  BOOLEAN                   AbortOnClose;
} EFI_TCP4_CLOSE_TOKEN;

//
// Interface definition for TCP4 protocol
//

/**
  Get the current operational status.

  @param  This           The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Tcp4State      The pointer to the buffer to receive the current TCP state.
  @param  Tcp4ConfigData The pointer to the buffer to receive the current TCP configuration.
  @param  Ip4ModeData    The pointer to the buffer to receive the current IPv4 configuration
                         data used by the TCPv4 instance.
  @param  MnpConfigData  The pointer to the buffer to receive the current MNP configuration
                         data used indirectly by the TCPv4 instance.
  @param  SnpModeData    The pointer to the buffer to receive the current SNP configuration
                         data used indirectly by the TCPv4 instance.

  @retval EFI_SUCCESS           The mode data was read.
  @retval EFI_INVALID_PARAMETER This is NULL.
  @retval EFI_NOT_STARTED       No configuration data is available because this instance hasn't
                                 been started.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_GET_MODE_DATA)(
  IN CONST  EFI_TCP4_PROTOCOL                  *This,
  OUT       EFI_TCP4_CONNECTION_STATE          *Tcp4State      OPTIONAL,
  OUT       EFI_TCP4_CONFIG_DATA               *Tcp4ConfigData OPTIONAL,
  OUT       EFI_IP4_MODE_DATA                  *Ip4ModeData    OPTIONAL,
  OUT       EFI_MANAGED_NETWORK_CONFIG_DATA    *MnpConfigData  OPTIONAL,
  OUT       EFI_SIMPLE_NETWORK_MODE            *SnpModeData    OPTIONAL
  );

/**
  Initialize or brutally reset the operational parameters for this EFI TCPv4 instance.

  @param  This           The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Tcp4ConfigData The pointer to the configure data to configure the instance.

  @retval EFI_SUCCESS           The operational settings are set, changed, or reset
                                successfully.
  @retval EFI_INVALID_PARAMETER Some parameter is invalid.
  @retval EFI_NO_MAPPING        When using a default address, configuration (through
                                DHCP, BOOTP, RARP, etc.) is not finished yet.
  @retval EFI_ACCESS_DENIED     Configuring TCP instance when it is configured without
                                calling Configure() with NULL to reset it.
  @retval EFI_DEVICE_ERROR      An unexpected network or system error occurred.
  @retval EFI_UNSUPPORTED       One or more of the control options are not supported in
                                the implementation.
  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough system resources when
                                executing Configure().

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_CONFIGURE)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_CONFIG_DATA                *TcpConfigData OPTIONAL
  );


/**
  Add or delete a route entry to the route table

  @param  This           The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  DeleteRoute    Set it to TRUE to delete this route from the routing table. Set it to
                         FALSE to add this route to the routing table.
                         DestinationAddress and SubnetMask are used as the
                         keywords to search route entry.
  @param  SubnetAddress  The destination network.
  @param  SubnetMask     The subnet mask of the destination network.
  @param  GatewayAddress The gateway address for this route. It must be on the same
                         subnet with the station address unless a direct route is specified.

  @retval EFI_SUCCESS           The operation completed successfully.
  @retval EFI_NOT_STARTED       The EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP,
                                RARP, etc.) is not finished yet.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - This is NULL.
                                - SubnetAddress is NULL.
                                - SubnetMask is NULL.
                                - GatewayAddress is NULL.
                                - *SubnetAddress is not NULL a valid subnet address.
                                - *SubnetMask is not a valid subnet mask.
                                - *GatewayAddress is not a valid unicast IP address or it
                                is not in the same subnet.
  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough resources to add the entry to the
                                routing table.
  @retval EFI_NOT_FOUND         This route is not in the routing table.
  @retval EFI_ACCESS_DENIED     The route is already defined in the routing table.
  @retval EFI_UNSUPPORTED       The TCP driver does not support this operation.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_ROUTES)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN BOOLEAN                             DeleteRoute,
  IN EFI_IPv4_ADDRESS                    *SubnetAddress,
  IN EFI_IPv4_ADDRESS                    *SubnetMask,
  IN EFI_IPv4_ADDRESS                    *GatewayAddress
  );

/**
  Initiate a nonblocking TCP connection request for an active TCP instance.

  @param  This                  The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  ConnectionToken       The pointer to the connection token to return when the TCP three
                                way handshake finishes.

  @retval EFI_SUCCESS           The connection request is successfully initiated and the state
                                of this TCPv4 instance has been changed to Tcp4StateSynSent.
  @retval EFI_NOT_STARTED       This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_ACCESS_DENIED     One or more of the following conditions are TRUE:
                                - This instance is not configured as an active one.
                                - This instance is not in Tcp4StateClosed state.
  @retval EFI_INVALID_PARAMETER One or more of the following are TRUE:
                                - This is NULL.
                                - ConnectionToken is NULL.
                                - ConnectionToken->CompletionToken.Event is NULL.
  @retval EFI_OUT_OF_RESOURCES  The driver can't allocate enough resource to initiate the activ eopen.
  @retval EFI_DEVICE_ERROR      An unexpected system or network error occurred.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_CONNECT)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_CONNECTION_TOKEN           *ConnectionToken
  );


/**
  Listen on the passive instance to accept an incoming connection request. This is a nonblocking operation.

  @param  This        The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  ListenToken The pointer to the listen token to return when operation finishes.

  @retval EFI_SUCCESS           The listen token has been queued successfully.
  @retval EFI_NOT_STARTED       This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_ACCESS_DENIED     One or more of the following are TRUE:
                                - This instance is not a passive instance.
                                - This instance is not in Tcp4StateListen state.
                                - The same listen token has already existed in the listen
                                token queue of this TCP instance.
  @retval EFI_INVALID_PARAMETER One or more of the following are TRUE:
                                - This is NULL.
                                - ListenToken is NULL.
                                - ListentToken->CompletionToken.Event is NULL.
  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough resource to finish the operation.
  @retval EFI_DEVICE_ERROR      Any unexpected and not belonged to above category error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_ACCEPT)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_LISTEN_TOKEN               *ListenToken
  );

/**
  Queues outgoing data into the transmit queue.

  @param  This  The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Token The pointer to the completion token to queue to the transmit queue.

  @retval EFI_SUCCESS             The data has been queued for transmission.
  @retval EFI_NOT_STARTED         This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_NO_MAPPING          When using a default address, configuration (DHCP, BOOTP,
                                  RARP, etc.) is not finished yet.
  @retval EFI_INVALID_PARAMETER   One or more of the following are TRUE:
                                  - This is NULL.
                                  - Token is NULL.
                                  - Token->CompletionToken.Event is NULL.
                                  - Token->Packet.TxData is NULL L.
                                  - Token->Packet.FragmentCount is zero.
                                  - Token->Packet.DataLength is not equal to the sum of fragment lengths.
  @retval EFI_ACCESS_DENIED       One or more of the following conditions is TRUE:
                                  - A transmit completion token with the same Token->CompletionToken.Event
                                  was already in the transmission queue.
                                  - The current instance is in Tcp4StateClosed state.
                                  - The current instance is a passive one and it is in
                                  Tcp4StateListen state.
                                  - User has called Close() to disconnect this connection.
  @retval EFI_NOT_READY           The completion token could not be queued because the
                                  transmit queue is full.
  @retval EFI_OUT_OF_RESOURCES    Could not queue the transmit data because of resource
                                  shortage.
  @retval EFI_NETWORK_UNREACHABLE There is no route to the destination network or address.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_TRANSMIT)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_IO_TOKEN                   *Token
  );


/**
  Places an asynchronous receive request into the receiving queue.

  @param  This  The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Token The pointer to a token that is associated with the receive data
                descriptor.

  @retval EFI_SUCCESS           The receive completion token was cached.
  @retval EFI_NOT_STARTED       This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_NO_MAPPING        When using a default address, configuration (DHCP, BOOTP, RARP,
                                etc.) is not finished yet.
  @retval EFI_INVALID_PARAMETER One or more of the following conditions is TRUE:
                                - This is NULL.
                                - Token is NULL.
                                - Token->CompletionToken.Event is NULL.
                                - Token->Packet.RxData is NULL.
                                - Token->Packet.RxData->DataLength is 0.
                                - The Token->Packet.RxData->DataLength is not
                                the sum of all FragmentBuffer length in FragmentTable.
  @retval EFI_OUT_OF_RESOURCES The receive completion token could not be queued due to a lack of
                               system resources (usually memory).
  @retval EFI_DEVICE_ERROR     An unexpected system or network error occurred.
  @retval EFI_ACCESS_DENIED    One or more of the following conditions is TRUE:
                               - A receive completion token with the same Token-
                               >CompletionToken.Event was already in the receive
                               queue.
                               - The current instance is in Tcp4StateClosed state.
                               - The current instance is a passive one and it is in
                               Tcp4StateListen state.
                               - User has called Close() to disconnect this connection.
  @retval EFI_CONNECTION_FIN   The communication peer has closed the connection and there is
                               no any buffered data in the receive buffer of this instance.
  @retval EFI_NOT_READY        The receive request could not be queued because the receive queue is full.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_RECEIVE)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_IO_TOKEN                   *Token
  );

/**
  Disconnecting a TCP connection gracefully or reset a TCP connection. This function is a
  nonblocking operation.

  @param  This       The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  CloseToken The pointer to the close token to return when operation finishes.

  @retval EFI_SUCCESS           The Close() is called successfully.
  @retval EFI_NOT_STARTED       This EFI TCPv4 Protocol instance has not been configured.
  @retval EFI_ACCESS_DENIED     One or more of the following are TRUE:
                                - Configure() has been called with
                                TcpConfigData set to NULL and this function has
                                not returned.
                                - Previous Close() call on this instance has not
                                finished.
  @retval EFI_INVALID_PARAMETER One or more of the following are TRUE:
                                - This is NULL.
                                - CloseToken is NULL.
                                - CloseToken->CompletionToken.Event is NULL.
  @retval EFI_OUT_OF_RESOURCES  Could not allocate enough resource to finish the operation.
  @retval EFI_DEVICE_ERROR      Any unexpected and not belonged to above category error.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_CLOSE)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_CLOSE_TOKEN                *CloseToken
  );

/**
  Abort an asynchronous connection, listen, transmission or receive request.

  @param  This  The pointer to the EFI_TCP4_PROTOCOL instance.
  @param  Token The pointer to a token that has been issued by
                EFI_TCP4_PROTOCOL.Connect(),
                EFI_TCP4_PROTOCOL.Accept(),
                EFI_TCP4_PROTOCOL.Transmit() or
                EFI_TCP4_PROTOCOL.Receive(). If NULL, all pending
                tokens issued by above four functions will be aborted. Type
                EFI_TCP4_COMPLETION_TOKEN is defined in
                EFI_TCP4_PROTOCOL.Connect().

  @retval  EFI_SUCCESS             The asynchronous I/O request is aborted and Token->Event
                                   is signaled.
  @retval  EFI_INVALID_PARAMETER   This is NULL.
  @retval  EFI_NOT_STARTED         This instance hasn't been configured.
  @retval  EFI_NO_MAPPING          When using the default address, configuration
                                   (DHCP, BOOTP,RARP, etc.) hasn't finished yet.
  @retval  EFI_NOT_FOUND           The asynchronous I/O request isn't found in the
                                   transmission or receive queue. It has either
                                   completed or wasn't issued by Transmit() and Receive().
  @retval  EFI_UNSUPPORTED         The implementation does not support this function.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_CANCEL)(
  IN EFI_TCP4_PROTOCOL                   *This,
  IN EFI_TCP4_COMPLETION_TOKEN           *Token OPTIONAL
  );


/**
  Poll to receive incoming data and transmit outgoing segments.

  @param  This The pointer to the EFI_TCP4_PROTOCOL instance.

  @retval  EFI_SUCCESS           Incoming or outgoing data was processed.
  @retval  EFI_INVALID_PARAMETER This is NULL.
  @retval  EFI_DEVICE_ERROR      An unexpected system or network error occurred.
  @retval  EFI_NOT_READY         No incoming or outgoing data is processed.
  @retval  EFI_TIMEOUT           Data was dropped out of the transmission or receive queue.
                                 Consider increasing the polling rate.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TCP4_POLL)(
  IN EFI_TCP4_PROTOCOL                   *This
  );

///
/// The EFI_TCP4_PROTOCOL defines the EFI TCPv4 Protocol child to be used by
/// any network drivers or applications to send or receive data stream.
/// It can either listen on a specified port as a service or actively connected
/// to remote peer as a client. Each instance has its own independent settings,
/// such as the routing table.
///
struct _EFI_TCP4_PROTOCOL {
  EFI_TCP4_GET_MODE_DATA                 GetModeData;
  EFI_TCP4_CONFIGURE                     Configure;
  EFI_TCP4_ROUTES                        Routes;
  EFI_TCP4_CONNECT                       Connect;
  EFI_TCP4_ACCEPT                        Accept;
  EFI_TCP4_TRANSMIT                      Transmit;
  EFI_TCP4_RECEIVE                       Receive;
  EFI_TCP4_CLOSE                         Close;
  EFI_TCP4_CANCEL                        Cancel;
  EFI_TCP4_POLL                          Poll;
};

extern EFI_GUID gEfiTcp4ServiceBindingProtocolGuid;
extern EFI_GUID gEfiTcp4ProtocolGuid;

#endif
