
/*** <<< INCLUDES [T] >>> ***/

#include <INTEGER.h>
#include <OCTET_STRING.h>
#include "Choice1.h"
#include "Choice2.h"
#include <constr_CHOICE.h>

/*** <<< DEPS [T] >>> ***/

typedef enum T_PR {
	T_PR_NOTHING,	/* No components present */
	T_PR_t_a,
	T_PR_t_b,
	T_PR_t_c,
	T_PR_t_d
} T_PR;

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

typedef struct T {
	T_PR present;
	union T_u {
		INTEGER_t	 t_a;
		OCTET_STRING_t	 t_b;
		Choice1_t	 t_c;
		Choice2_t	 t_d;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T_t;

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

extern asn_TYPE_descriptor_t asn_DEF_T;

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

static asn_TYPE_member_t asn_MBR_T_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T, choice.t_a),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_INTEGER,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "t-a"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T, choice.t_b),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_OCTET_STRING,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "t-b"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T, choice.t_c),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = &asn_DEF_Choice1,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "t-c"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct T, choice.t_d),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_Choice2,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "t-d"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_T_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* t-a */
    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 1, 0, 0 }, /* t-b */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* t-c */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* t-d */
};
static asn_CHOICE_specifics_t asn_SPC_T_specs_1 = {
	sizeof(struct T),
	offsetof(struct T, _asn_ctx),
	offsetof(struct T, present),
	sizeof(((struct T *)0)->present),
	.tag2el = asn_MAP_T_tag2el_1,
	.tag2el_count = 4,	/* Count of tags in the map */
	0, 0,
	.first_extension = -1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_T = {
	"T",
	"T",
	&asn_OP_CHOICE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, CHOICE_constraint },
	asn_MBR_T_1,
	4,	/* Elements count */
	&asn_SPC_T_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Choice1] >>> ***/

#include <OCTET_STRING.h>
#include <INTEGER.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [Choice1] >>> ***/

typedef enum Choice1_PR {
	Choice1_PR_NOTHING,	/* No components present */
	Choice1_PR_c_a,
	Choice1_PR_c_b
} Choice1_PR;

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

typedef struct Choice1 {
	Choice1_PR present;
	union Choice1_u {
		OCTET_STRING_t	 c_a;
		INTEGER_t	 c_b;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Choice1_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Choice1;
extern asn_CHOICE_specifics_t asn_SPC_Choice1_specs_1;
extern asn_TYPE_member_t asn_MBR_Choice1_1[2];

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

asn_TYPE_member_t asn_MBR_Choice1_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Choice1, choice.c_a),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_OCTET_STRING,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "c-a"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Choice1, choice.c_b),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_INTEGER,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "c-b"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_Choice1_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* c-b */
    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, 0, 0 } /* c-a */
};
asn_CHOICE_specifics_t asn_SPC_Choice1_specs_1 = {
	sizeof(struct Choice1),
	offsetof(struct Choice1, _asn_ctx),
	offsetof(struct Choice1, present),
	sizeof(((struct Choice1 *)0)->present),
	.tag2el = asn_MAP_Choice1_tag2el_1,
	.tag2el_count = 2,	/* Count of tags in the map */
	0, 0,
	.first_extension = -1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_Choice1 = {
	"Choice1",
	"Choice1",
	&asn_OP_CHOICE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, CHOICE_constraint },
	asn_MBR_Choice1_1,
	2,	/* Elements count */
	&asn_SPC_Choice1_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Choice2] >>> ***/

#include <OCTET_STRING.h>
#include <INTEGER.h>
#include "Choice1.h"
#include <constr_CHOICE.h>

/*** <<< DEPS [Choice2] >>> ***/

typedef enum Choice2_PR {
	Choice2_PR_NOTHING,	/* No components present */
	Choice2_PR_c_a,
	Choice2_PR_c_b,
	Choice2_PR_c_d,
	Choice2_PR_c_e
} Choice2_PR;

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

typedef struct Choice2 {
	Choice2_PR present;
	union Choice2_u {
		OCTET_STRING_t	 c_a;
		INTEGER_t	 c_b;
		Choice1_t	 c_d;
		Choice1_t	 c_e;
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Choice2_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Choice2;
extern asn_CHOICE_specifics_t asn_SPC_Choice2_specs_1;
extern asn_TYPE_member_t asn_MBR_Choice2_1[4];

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

asn_TYPE_member_t asn_MBR_Choice2_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.c_a),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_OCTET_STRING,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "c-a"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.c_b),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_INTEGER,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "c-b"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.c_d),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = &asn_DEF_Choice1,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "c-d"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Choice2, choice.c_e),
		.tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = &asn_DEF_Choice1,
		.type_selector = 0,
		{ .oer_constraints = 0, .per_constraints = 0, .general_constraints = 0 },
		0, 0, /* No default value */
		.name = "c-e"
		},
};
static const ber_tlv_tag_t asn_DEF_Choice2_tags_1[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Choice2_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* c-b */
    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, 0, 0 }, /* c-a */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* c-d */
    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 3, 0, 0 } /* c-e */
};
asn_CHOICE_specifics_t asn_SPC_Choice2_specs_1 = {
	sizeof(struct Choice2),
	offsetof(struct Choice2, _asn_ctx),
	offsetof(struct Choice2, present),
	sizeof(((struct Choice2 *)0)->present),
	.tag2el = asn_MAP_Choice2_tag2el_1,
	.tag2el_count = 4,	/* Count of tags in the map */
	0, 0,
	.first_extension = -1	/* Extensions start */
};
asn_TYPE_descriptor_t asn_DEF_Choice2 = {
	"Choice2",
	"Choice2",
	&asn_OP_CHOICE,
	asn_DEF_Choice2_tags_1,
	sizeof(asn_DEF_Choice2_tags_1)
		/sizeof(asn_DEF_Choice2_tags_1[0]), /* 1 */
	asn_DEF_Choice2_tags_1,	/* Same as above */
	sizeof(asn_DEF_Choice2_tags_1)
		/sizeof(asn_DEF_Choice2_tags_1[0]), /* 1 */
	{ 0, 0, CHOICE_constraint },
	asn_MBR_Choice2_1,
	4,	/* Elements count */
	&asn_SPC_Choice2_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Choice3] >>> ***/

#include "Choice2.h"

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

typedef Choice2_t	 Choice3_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Choice3;
asn_struct_free_f Choice3_free;
asn_struct_print_f Choice3_print;
asn_constr_check_f Choice3_constraint;
ber_type_decoder_f Choice3_decode_ber;
der_type_encoder_f Choice3_encode_der;
xer_type_decoder_f Choice3_decode_xer;
xer_type_encoder_f Choice3_encode_xer;

/*** <<< CODE [Choice3] >>> ***/

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

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

static const ber_tlv_tag_t asn_DEF_Choice3_tags_1[] = {
	(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_Choice3 = {
	"Choice3",
	"Choice3",
	&asn_OP_CHOICE,
	asn_DEF_Choice3_tags_1,
	sizeof(asn_DEF_Choice3_tags_1)
		/sizeof(asn_DEF_Choice3_tags_1[0]), /* 2 */
	asn_DEF_Choice3_tags_1,	/* Same as above */
	sizeof(asn_DEF_Choice3_tags_1)
		/sizeof(asn_DEF_Choice3_tags_1[0]), /* 2 */
	{ 0, 0, CHOICE_constraint },
	asn_MBR_Choice2_1,
	4,	/* Elements count */
	&asn_SPC_Choice2_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Choice4] >>> ***/

#include "Choice2.h"

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

typedef Choice2_t	 Choice4_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Choice4;
asn_struct_free_f Choice4_free;
asn_struct_print_f Choice4_print;
asn_constr_check_f Choice4_constraint;
ber_type_decoder_f Choice4_decode_ber;
der_type_encoder_f Choice4_encode_der;
xer_type_decoder_f Choice4_decode_xer;
xer_type_encoder_f Choice4_encode_xer;

/*** <<< CODE [Choice4] >>> ***/

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

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

static const ber_tlv_tag_t asn_DEF_Choice4_tags_1[] = {
	(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
	(ASN_TAG_CLASS_CONTEXT | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_Choice4 = {
	"Choice4",
	"Choice4",
	&asn_OP_CHOICE,
	asn_DEF_Choice4_tags_1,
	sizeof(asn_DEF_Choice4_tags_1)
		/sizeof(asn_DEF_Choice4_tags_1[0]) - 1, /* 1 */
	asn_DEF_Choice4_tags_1,	/* Same as above */
	sizeof(asn_DEF_Choice4_tags_1)
		/sizeof(asn_DEF_Choice4_tags_1[0]), /* 2 */
	{ 0, 0, CHOICE_constraint },
	asn_MBR_Choice2_1,
	4,	/* Elements count */
	&asn_SPC_Choice2_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Choice5] >>> ***/

#include "Choice2.h"

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

typedef Choice2_t	 Choice5_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Choice5;
asn_struct_free_f Choice5_free;
asn_struct_print_f Choice5_print;
asn_constr_check_f Choice5_constraint;
ber_type_decoder_f Choice5_decode_ber;
der_type_encoder_f Choice5_encode_der;
xer_type_decoder_f Choice5_decode_xer;
xer_type_encoder_f Choice5_encode_xer;

/*** <<< CODE [Choice5] >>> ***/

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

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

static const ber_tlv_tag_t asn_DEF_Choice5_tags_1[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2))
};
asn_TYPE_descriptor_t asn_DEF_Choice5 = {
	"Choice5",
	"Choice5",
	&asn_OP_CHOICE,
	asn_DEF_Choice5_tags_1,
	sizeof(asn_DEF_Choice5_tags_1)
		/sizeof(asn_DEF_Choice5_tags_1[0]), /* 1 */
	asn_DEF_Choice5_tags_1,	/* Same as above */
	sizeof(asn_DEF_Choice5_tags_1)
		/sizeof(asn_DEF_Choice5_tags_1[0]), /* 1 */
	{ 0, 0, CHOICE_constraint },
	asn_MBR_Choice2_1,
	4,	/* Elements count */
	&asn_SPC_Choice2_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Choice6] >>> ***/

#include "Choice1.h"

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

typedef Choice1_t	 Choice6_t;

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

extern asn_TYPE_descriptor_t asn_DEF_Choice6;
asn_struct_free_f Choice6_free;
asn_struct_print_f Choice6_print;
asn_constr_check_f Choice6_constraint;
ber_type_decoder_f Choice6_decode_ber;
der_type_encoder_f Choice6_encode_der;
xer_type_decoder_f Choice6_decode_xer;
xer_type_encoder_f Choice6_encode_xer;

/*** <<< CODE [Choice6] >>> ***/

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

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

asn_TYPE_descriptor_t asn_DEF_Choice6 = {
	"Choice6",
	"Choice6",
	&asn_OP_CHOICE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, CHOICE_constraint },
	asn_MBR_Choice1_1,
	2,	/* Elements count */
	&asn_SPC_Choice1_specs_1	/* Additional specs */
};

