# This only declares these constants with dummy values. They are
# initialized at run time in the file
# `read_load_time_mpi_constants.jl`.

module Consts

import ..MPI_Comm
import ..MPI_Datatype
import ..MPI_Errhandler
import ..MPI_File
import ..MPI_Group
import ..MPI_Info
import ..MPI_Message
import ..MPI_Offset
import ..MPI_Op
import ..MPI_Request
import ..MPI_Win

# We want to be able to use these values for comparisons while
# precompiling, so they should all be different
_mpi_val_counter = 1

const MPI_ANY_SOURCE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ANY_TAG = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_PROC_NULL = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ROOT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_CART = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_DIST_GRAPH = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_GRAPH = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_CONGRUENT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_IDENT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_SIMILAR = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_UNEQUAL = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_KEYVAL_INVALID = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_UNDEFINED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_APPNUM = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_HOST = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_IO = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_LASTUSEDCODE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_TAG_UB = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_UNIVERSE_SIZE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_WIN_BASE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_WIN_CREATE_FLAVOR = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_WIN_DISP_UNIT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_WIN_MODEL = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_WIN_SIZE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_WTIME_IS_GLOBAL = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_CONTIGUOUS = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_DARRAY = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_DUP = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_F90_COMPLEX = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_F90_INTEGER = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_F90_REAL = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_HINDEXED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_HINDEXED_BLOCK = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_HVECTOR = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_INDEXED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_INDEXED_BLOCK = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_NAMED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_RESIZED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_STRUCT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_SUBARRAY = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMBINER_VECTOR = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_COMM_TYPE_SHARED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_DISTRIBUTE_BLOCK = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_DISTRIBUTE_CYCLIC = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_DISTRIBUTE_NONE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_ACCESS = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_AMODE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_ARG = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_ASSERT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_BAD_FILE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_BASE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_BUFFER = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_COMM = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_CONVERSION = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_COUNT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_DIMS = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_DISP = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_DUP_DATAREP = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_FILE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_FILE_EXISTS = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_FILE_IN_USE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_GROUP = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_INFO = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_INFO_KEY = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_INFO_NOKEY = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_INFO_VALUE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_INTERN = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_IN_STATUS = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_IO = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_KEYVAL = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_LASTCODE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_LOCKTYPE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_NAME = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_NOT_SAME = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_NO_MEM = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_NO_SPACE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_NO_SUCH_FILE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_OP = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_OTHER = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_PENDING = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_PORT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_QUOTA = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_RANK = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_READ_ONLY = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_REQUEST = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_RMA_ATTACH = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_RMA_CONFLICT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_RMA_FLAVOR = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_RMA_RANGE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_RMA_SHARED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_RMA_SYNC = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_ROOT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_SERVICE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_SIZE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_SPAWN = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_TAG = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_TOPOLOGY = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_TRUNCATE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_TYPE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_UNKNOWN = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_UNSUPPORTED_DATAREP = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_UNSUPPORTED_OPERATION = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ERR_WIN = Ref(Cint(-(_mpi_val_counter += 1)))
# We special-case MPI_SUCCESS which is required to be 0
# const MPI_SUCCESS = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_SUCCESS = Ref(Cint(0))
const MPI_LOCK_EXCLUSIVE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_LOCK_SHARED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_APPEND = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_CREATE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_DELETE_ON_CLOSE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_EXCL = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_NOCHECK = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_NOPRECEDE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_NOPUT = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_NOSTORE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_NOSUCCEED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_RDONLY = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_RDWR = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_SEQUENTIAL = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_UNIQUE_OPEN = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_MODE_WRONLY = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ORDER_C = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_ORDER_FORTRAN = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_SEEK_CUR = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_SEEK_END = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_SEEK_SET = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_THREAD_SINGLE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_THREAD_FUNNELED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_THREAD_SERIALIZED = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_THREAD_MULTIPLE = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_TYPECLASS_COMPLEX = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_TYPECLASS_INTEGER = Ref(Cint(-(_mpi_val_counter += 1)))
const MPI_TYPECLASS_REAL = Ref(Cint(-(_mpi_val_counter += 1)))

const MPI_ARGV_NULL = Ref(C_NULL)
const MPI_ARGVS_NULL = Ref(C_NULL)
const MPI_UNWEIGHTED = Ref(C_NULL)
const MPI_WEIGHTS_EMPTY = Ref(C_NULL)
const MPI_BOTTOM = Ref(C_NULL)
const MPI_IN_PLACE = Ref(C_NULL)

const MPI_COMM_NULL = Ref(MPI_Comm(_mpi_val_counter += 1))
const MPI_COMM_SELF = Ref(MPI_Comm(_mpi_val_counter += 1))
const MPI_COMM_WORLD = Ref(MPI_Comm(_mpi_val_counter += 1))

const MPI_COMM_DUP_FN = Ref(C_NULL)

const MPI_COMM_NULL_COPY_FN = Ref(C_NULL)

const MPI_COMM_NULL_DELETE_FN = Ref(C_NULL)

const MPI_NULL_COPY_FN = Ref(C_NULL)

const MPI_2DOUBLE_PRECISION = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_2INT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_2INTEGER = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_2REAL = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_AINT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_BYTE = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_CHAR = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_CHARACTER = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_COMPLEX = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_COMPLEX16 = Ref(MPI_Datatype(_mpi_val_counter += 1))
# const MPI_COMPLEX32 = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_COMPLEX8 = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_COUNT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_CXX_BOOL = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_CXX_DOUBLE_COMPLEX = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_CXX_FLOAT_COMPLEX = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_CXX_LONG_DOUBLE_COMPLEX = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_C_BOOL = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_C_COMPLEX = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_C_DOUBLE_COMPLEX = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_C_FLOAT_COMPLEX = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_C_LONG_DOUBLE_COMPLEX = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_DATATYPE_NULL = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_DOUBLE = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_DOUBLE_COMPLEX = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_DOUBLE_INT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_DOUBLE_PRECISION = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_FLOAT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_FLOAT_INT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INT16_T = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INT32_T = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INT64_T = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INT8_T = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INTEGER = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INTEGER1 = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INTEGER2 = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INTEGER4 = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_INTEGER8 = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_LOGICAL = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_LONG = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_LONG_DOUBLE = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_LONG_DOUBLE_INT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_LONG_INT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_LONG_LONG = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_LONG_LONG_INT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_OFFSET = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_PACKED = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_REAL = Ref(MPI_Datatype(_mpi_val_counter += 1))
# const MPI_REAL16 = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_REAL4 = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_REAL8 = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_SHORT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_SHORT_INT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_SIGNED_CHAR = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_UINT16_T = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_UINT32_T = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_UINT64_T = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_UINT8_T = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_UNSIGNED = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_UNSIGNED_CHAR = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_UNSIGNED_LONG = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_UNSIGNED_LONG_LONG = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_UNSIGNED_SHORT = Ref(MPI_Datatype(_mpi_val_counter += 1))
const MPI_WCHAR = Ref(MPI_Datatype(_mpi_val_counter += 1))

const MPI_NULL_DELETE_FN = Ref(C_NULL)

const MPI_ERRHANDLER_NULL = Ref(MPI_Errhandler(_mpi_val_counter += 1))
const MPI_ERRORS_ARE_FATAL = Ref(MPI_Errhandler(_mpi_val_counter += 1))
const MPI_ERRORS_RETURN = Ref(MPI_Errhandler(_mpi_val_counter += 1))

const MPI_FILE_NULL = Ref(MPI_File(_mpi_val_counter += 1))

const MPI_GROUP_EMPTY = Ref(MPI_Group(_mpi_val_counter += 1))
const MPI_GROUP_NULL = Ref(MPI_Group(_mpi_val_counter += 1))

const MPI_INFO_ENV = Ref(MPI_Info(_mpi_val_counter += 1))
const MPI_INFO_NULL = Ref(MPI_Info(_mpi_val_counter += 1))

const MPI_MESSAGE_NO_PROC = Ref(MPI_Message(_mpi_val_counter += 1))
const MPI_MESSAGE_NULL = Ref(MPI_Message(_mpi_val_counter += 1))

const MPI_DISPLACEMENT_CURRENT = Ref(MPI_Offset(_mpi_val_counter += 1))

const MPI_BAND = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_BOR = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_BXOR = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_LAND = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_LOR = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_LXOR = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_MAX = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_MAXLOC = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_MIN = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_MINLOC = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_NO_OP = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_OP_NULL = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_PROD = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_REPLACE = Ref(MPI_Op(_mpi_val_counter += 1))
const MPI_SUM = Ref(MPI_Op(_mpi_val_counter += 1))

const MPI_REQUEST_NULL = Ref(MPI_Request(_mpi_val_counter += 1))

const MPI_STATUS_IGNORE = Ref(C_NULL)
const MPI_STATUSES_IGNORE = Ref(C_NULL)

const MPI_TYPE_DUP_FN = Ref(C_NULL)

const MPI_TYPE_NULL_COPY_FN = Ref(C_NULL)

const MPI_TYPE_NULL_DELETE_FN = Ref(C_NULL)

const MPI_WIN_NULL = Ref(MPI_Win(_mpi_val_counter += 1))

const MPI_WIN_DUP_FN = Ref(C_NULL)
const MPI_WIN_NULL_COPY_FN = Ref(C_NULL)

const MPI_WIN_NULL_DELETE_FN = Ref(C_NULL)

end



# These functions are run after reading the values of the constants above)
const _mpi_load_time_hooks = Any[]
const _finished_loading = Ref(false)
function add_load_time_hook!(f)
    @assert !_finished_loading[]
    push!(_mpi_load_time_hooks, f)
end
function run_load_time_hooks()
    @assert !_finished_loading[]
    _finished_loading[] = true
    for hook in _mpi_load_time_hooks
        hook()
    end
    empty!(_mpi_load_time_hooks)
    nothing
end
