
/*** <<< INCLUDES [Enum1] >>> ***/

#include <ENUMERATED.h>

/*** <<< DEPS [Enum1] >>> ***/

typedef enum Enum1 {
	Enum1_red	= 0,
	Enum1_green	= 1,
	Enum1_blue	= 4,
	Enum1_alpha	= 5
	/*
	 * Enumeration is extensible
	 */
} e_Enum1;

/*** <<< TYPE-DECLS [Enum1] >>> ***/

typedef ENUMERATED_t	 Enum1_t;

/*** <<< FUNC-DECLS [Enum1] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Enum1;
asn_struct_free_f Enum1_free;
asn_struct_print_f Enum1_print;
asn_constr_check_f Enum1_constraint;
ber_type_decoder_f Enum1_decode_ber;
der_type_encoder_f Enum1_encode_der;
xer_type_decoder_f Enum1_decode_xer;
xer_type_encoder_f Enum1_encode_xer;

/*** <<< CODE [Enum1] >>> ***/

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */

/*** <<< STAT-DEFS [Enum1] >>> ***/

static const asn_INTEGER_enum_map_t asn_MAP_Enum1_value2enum_1[] = {
	{ 0,	3,	"red" },
	{ 1,	5,	"green" },
	{ 4,	4,	"blue" },
	{ 5,	5,	"alpha" }
	/* This list is extensible */
};
static const unsigned int asn_MAP_Enum1_enum2value_1[] = {
	3,	/* alpha(5) */
	2,	/* blue(4) */
	1,	/* green(1) */
	0	/* red(0) */
	/* This list is extensible */
};
static const asn_INTEGER_specifics_t asn_SPC_Enum1_specs_1 = {
	asn_MAP_Enum1_value2enum_1,	/* "tag" => N; sorted by tag */
	asn_MAP_Enum1_enum2value_1,	/* N => "tag"; sorted by N */
	4,	/* Number of elements in the maps */
	5,	/* Extensions before this member */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_Enum1_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
asn_TYPE_descriptor_t asn_DEF_Enum1 = {
	"Enum1",
	"Enum1",
	ENUMERATED_free,
	ENUMERATED_print,
	ENUMERATED_compare,
	ENUMERATED_constraint,
	ENUMERATED_decode_ber,
	ENUMERATED_encode_der,
	ENUMERATED_decode_xer,
	ENUMERATED_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Enum1_tags_1,
	sizeof(asn_DEF_Enum1_tags_1)
		/sizeof(asn_DEF_Enum1_tags_1[0]), /* 1 */
	asn_DEF_Enum1_tags_1,	/* Same as above */
	sizeof(asn_DEF_Enum1_tags_1)
		/sizeof(asn_DEF_Enum1_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* Defined elsewhere */
	&asn_SPC_Enum1_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Enum2] >>> ***/

#include <ENUMERATED.h>

/*** <<< DEPS [Enum2] >>> ***/

typedef enum Enum2 {
	Enum2_red	= 0,
	Enum2_green	= 1,
	Enum2_blue	= 45,
	Enum2_orange	= 23,
	Enum2_alpha	= 46,
	/*
	 * Enumeration is extensible
	 */
	Enum2_beta	= 12,
	Enum2_gamma	= 103
} e_Enum2;

/*** <<< TYPE-DECLS [Enum2] >>> ***/

typedef ENUMERATED_t	 Enum2_t;

/*** <<< FUNC-DECLS [Enum2] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Enum2;
asn_struct_free_f Enum2_free;
asn_struct_print_f Enum2_print;
asn_constr_check_f Enum2_constraint;
ber_type_decoder_f Enum2_decode_ber;
der_type_encoder_f Enum2_encode_der;
xer_type_decoder_f Enum2_decode_xer;
xer_type_encoder_f Enum2_encode_xer;

/*** <<< CODE [Enum2] >>> ***/

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */

/*** <<< STAT-DEFS [Enum2] >>> ***/

static const asn_INTEGER_enum_map_t asn_MAP_Enum2_value2enum_1[] = {
	{ 0,	3,	"red" },
	{ 1,	5,	"green" },
	{ 12,	4,	"beta" },
	{ 23,	6,	"orange" },
	{ 45,	4,	"blue" },
	{ 46,	5,	"alpha" },
	{ 103,	5,	"gamma" }
	/* This list is extensible */
};
static const unsigned int asn_MAP_Enum2_enum2value_1[] = {
	5,	/* alpha(46) */
	2,	/* beta(12) */
	4,	/* blue(45) */
	6,	/* gamma(103) */
	1,	/* green(1) */
	3,	/* orange(23) */
	0	/* red(0) */
	/* This list is extensible */
};
static const asn_INTEGER_specifics_t asn_SPC_Enum2_specs_1 = {
	asn_MAP_Enum2_value2enum_1,	/* "tag" => N; sorted by tag */
	asn_MAP_Enum2_enum2value_1,	/* N => "tag"; sorted by N */
	7,	/* Number of elements in the maps */
	6,	/* Extensions before this member */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_Enum2_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
asn_TYPE_descriptor_t asn_DEF_Enum2 = {
	"Enum2",
	"Enum2",
	ENUMERATED_free,
	ENUMERATED_print,
	ENUMERATED_compare,
	ENUMERATED_constraint,
	ENUMERATED_decode_ber,
	ENUMERATED_encode_der,
	ENUMERATED_decode_xer,
	ENUMERATED_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Enum2_tags_1,
	sizeof(asn_DEF_Enum2_tags_1)
		/sizeof(asn_DEF_Enum2_tags_1[0]), /* 1 */
	asn_DEF_Enum2_tags_1,	/* Same as above */
	sizeof(asn_DEF_Enum2_tags_1)
		/sizeof(asn_DEF_Enum2_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* Defined elsewhere */
	&asn_SPC_Enum2_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Enum3] >>> ***/

#include <ENUMERATED.h>

/*** <<< DEPS [Enum3] >>> ***/

typedef enum Enum3 {
	Enum3_a	= 0,
	Enum3_b	= 3,
	/*
	 * Enumeration is extensible
	 */
	Enum3_c	= 1
} e_Enum3;

/*** <<< TYPE-DECLS [Enum3] >>> ***/

typedef ENUMERATED_t	 Enum3_t;

/*** <<< FUNC-DECLS [Enum3] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Enum3;
asn_struct_free_f Enum3_free;
asn_struct_print_f Enum3_print;
asn_constr_check_f Enum3_constraint;
ber_type_decoder_f Enum3_decode_ber;
der_type_encoder_f Enum3_encode_der;
xer_type_decoder_f Enum3_decode_xer;
xer_type_encoder_f Enum3_encode_xer;

/*** <<< CODE [Enum3] >>> ***/

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */

/*** <<< STAT-DEFS [Enum3] >>> ***/

static const asn_INTEGER_enum_map_t asn_MAP_Enum3_value2enum_1[] = {
	{ 0,	1,	"a" },
	{ 1,	1,	"c" },
	{ 3,	1,	"b" }
	/* This list is extensible */
};
static const unsigned int asn_MAP_Enum3_enum2value_1[] = {
	0,	/* a(0) */
	2,	/* b(3) */
	1	/* c(1) */
	/* This list is extensible */
};
static const asn_INTEGER_specifics_t asn_SPC_Enum3_specs_1 = {
	asn_MAP_Enum3_value2enum_1,	/* "tag" => N; sorted by tag */
	asn_MAP_Enum3_enum2value_1,	/* N => "tag"; sorted by N */
	3,	/* Number of elements in the maps */
	3,	/* Extensions before this member */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_Enum3_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
asn_TYPE_descriptor_t asn_DEF_Enum3 = {
	"Enum3",
	"Enum3",
	ENUMERATED_free,
	ENUMERATED_print,
	ENUMERATED_compare,
	ENUMERATED_constraint,
	ENUMERATED_decode_ber,
	ENUMERATED_encode_der,
	ENUMERATED_decode_xer,
	ENUMERATED_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Enum3_tags_1,
	sizeof(asn_DEF_Enum3_tags_1)
		/sizeof(asn_DEF_Enum3_tags_1[0]), /* 1 */
	asn_DEF_Enum3_tags_1,	/* Same as above */
	sizeof(asn_DEF_Enum3_tags_1)
		/sizeof(asn_DEF_Enum3_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* Defined elsewhere */
	&asn_SPC_Enum3_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Enum4] >>> ***/

#include <ENUMERATED.h>

/*** <<< DEPS [Enum4] >>> ***/

typedef enum Enum4 {
	Enum4_a	= 0,
	Enum4_b	= 1,
	/*
	 * Enumeration is extensible
	 */
	Enum4_c	= 3,
	Enum4_d	= 4
} e_Enum4;

/*** <<< TYPE-DECLS [Enum4] >>> ***/

typedef ENUMERATED_t	 Enum4_t;

/*** <<< FUNC-DECLS [Enum4] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Enum4;
asn_struct_free_f Enum4_free;
asn_struct_print_f Enum4_print;
asn_constr_check_f Enum4_constraint;
ber_type_decoder_f Enum4_decode_ber;
der_type_encoder_f Enum4_encode_der;
xer_type_decoder_f Enum4_decode_xer;
xer_type_encoder_f Enum4_encode_xer;

/*** <<< CODE [Enum4] >>> ***/

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */

/*** <<< STAT-DEFS [Enum4] >>> ***/

static const asn_INTEGER_enum_map_t asn_MAP_Enum4_value2enum_1[] = {
	{ 0,	1,	"a" },
	{ 1,	1,	"b" },
	{ 3,	1,	"c" },
	{ 4,	1,	"d" }
	/* This list is extensible */
};
static const unsigned int asn_MAP_Enum4_enum2value_1[] = {
	0,	/* a(0) */
	1,	/* b(1) */
	2,	/* c(3) */
	3	/* d(4) */
	/* This list is extensible */
};
static const asn_INTEGER_specifics_t asn_SPC_Enum4_specs_1 = {
	asn_MAP_Enum4_value2enum_1,	/* "tag" => N; sorted by tag */
	asn_MAP_Enum4_enum2value_1,	/* N => "tag"; sorted by N */
	4,	/* Number of elements in the maps */
	3,	/* Extensions before this member */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_Enum4_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
asn_TYPE_descriptor_t asn_DEF_Enum4 = {
	"Enum4",
	"Enum4",
	ENUMERATED_free,
	ENUMERATED_print,
	ENUMERATED_compare,
	ENUMERATED_constraint,
	ENUMERATED_decode_ber,
	ENUMERATED_encode_der,
	ENUMERATED_decode_xer,
	ENUMERATED_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Enum4_tags_1,
	sizeof(asn_DEF_Enum4_tags_1)
		/sizeof(asn_DEF_Enum4_tags_1[0]), /* 1 */
	asn_DEF_Enum4_tags_1,	/* Same as above */
	sizeof(asn_DEF_Enum4_tags_1)
		/sizeof(asn_DEF_Enum4_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* Defined elsewhere */
	&asn_SPC_Enum4_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Enum5] >>> ***/

#include <ENUMERATED.h>

/*** <<< DEPS [Enum5] >>> ***/

typedef enum Enum5 {
	Enum5_a	= 0,
	Enum5_z	= 25,
	/*
	 * Enumeration is extensible
	 */
	Enum5_d	= 26
} e_Enum5;

/*** <<< TYPE-DECLS [Enum5] >>> ***/

typedef ENUMERATED_t	 Enum5_t;

/*** <<< FUNC-DECLS [Enum5] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Enum5;
asn_struct_free_f Enum5_free;
asn_struct_print_f Enum5_print;
asn_constr_check_f Enum5_constraint;
ber_type_decoder_f Enum5_decode_ber;
der_type_encoder_f Enum5_encode_der;
xer_type_decoder_f Enum5_decode_xer;
xer_type_encoder_f Enum5_encode_xer;

/*** <<< CODE [Enum5] >>> ***/

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */

/*** <<< STAT-DEFS [Enum5] >>> ***/

static const asn_INTEGER_enum_map_t asn_MAP_Enum5_value2enum_1[] = {
	{ 0,	1,	"a" },
	{ 25,	1,	"z" },
	{ 26,	1,	"d" }
	/* This list is extensible */
};
static const unsigned int asn_MAP_Enum5_enum2value_1[] = {
	0,	/* a(0) */
	2,	/* d(26) */
	1	/* z(25) */
	/* This list is extensible */
};
static const asn_INTEGER_specifics_t asn_SPC_Enum5_specs_1 = {
	asn_MAP_Enum5_value2enum_1,	/* "tag" => N; sorted by tag */
	asn_MAP_Enum5_enum2value_1,	/* N => "tag"; sorted by N */
	3,	/* Number of elements in the maps */
	3,	/* Extensions before this member */
	1,	/* Strict enumeration */
	0,	/* Native long size */
	0
};
static const ber_tlv_tag_t asn_DEF_Enum5_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
asn_TYPE_descriptor_t asn_DEF_Enum5 = {
	"Enum5",
	"Enum5",
	ENUMERATED_free,
	ENUMERATED_print,
	ENUMERATED_compare,
	ENUMERATED_constraint,
	ENUMERATED_decode_ber,
	ENUMERATED_encode_der,
	ENUMERATED_decode_xer,
	ENUMERATED_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Enum5_tags_1,
	sizeof(asn_DEF_Enum5_tags_1)
		/sizeof(asn_DEF_Enum5_tags_1[0]), /* 1 */
	asn_DEF_Enum5_tags_1,	/* Same as above */
	sizeof(asn_DEF_Enum5_tags_1)
		/sizeof(asn_DEF_Enum5_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* Defined elsewhere */
	&asn_SPC_Enum5_specs_1	/* Additional specs */
};

