
/*** <<< INCLUDES [PDU] >>> ***/

#include <Sequence.h>
#include <Set.h>
#include <SetOf.h>
#include <SequenceOf.h>
#include <ExtensibleSet.h>
#include <ExtensibleSequence.h>
#include <SetOfNULL.h>
#include <SetOfEnums.h>
#include <SeqOfZuka.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [PDU] >>> ***/

typedef enum PDU_PR {
	PDU_PR_NOTHING,	/* No components present */
	PDU_PR_sequence,
	PDU_PR_set,
	PDU_PR_setOf,
	PDU_PR_sequenceOf,
	PDU_PR_extensibleSet,
	PDU_PR_extensibleSequence,
	PDU_PR_setOfNULL,
	PDU_PR_setOfEnums,
	PDU_PR_seqOfZuka,
	/* Extensions may appear below */
} PDU_PR;
extern asn_TYPE_descriptor_t asn_DEF_PDU;

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


typedef struct PDU {
	PDU_PR present;
	union {
		Sequence_t	 sequence;
		Set_t	 set;
		SetOf_t	 setOf;
		SequenceOf_t	 sequenceOf;
		ExtensibleSet_t	 extensibleSet;
		ExtensibleSequence_t	 extensibleSequence;
		SetOfNULL_t	 setOfNULL;
		SetOfEnums_t	 setOfEnums;
		SeqOfZuka_t	 seqOfZuka;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
	} choice;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} PDU_t;

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

static asn_TYPE_member_t asn_MBR_PDU[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.sequence),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_Sequence,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "sequence"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.set),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_Set,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "set"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOf),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_SetOf,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "setOf"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.sequenceOf),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_SequenceOf,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "sequenceOf"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSet),
		.tag = (ASN_TAG_CLASS_CONTEXT | (4 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_ExtensibleSet,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "extensibleSet"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.extensibleSequence),
		.tag = (ASN_TAG_CLASS_CONTEXT | (5 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_ExtensibleSequence,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "extensibleSequence"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfNULL),
		.tag = (ASN_TAG_CLASS_CONTEXT | (6 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_SetOfNULL,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "setOfNULL"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.setOfEnums),
		.tag = (ASN_TAG_CLASS_CONTEXT | (7 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_SetOfEnums,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "setOfEnums"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PDU, choice.seqOfZuka),
		.tag = (ASN_TAG_CLASS_CONTEXT | (8 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_SeqOfZuka,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "seqOfZuka"
		},
};
static asn_TYPE_tag2member_t asn_DEF_PDU_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* sequence at 19 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* set at 20 */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* setOf at 21 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* sequenceOf at 22 */
    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 }, /* extensibleSet at 23 */
    { (ASN_TAG_CLASS_CONTEXT | (5 << 2)), 5, 0, 0 }, /* extensibleSequence at 24 */
    { (ASN_TAG_CLASS_CONTEXT | (6 << 2)), 6, 0, 0 }, /* setOfNULL at 25 */
    { (ASN_TAG_CLASS_CONTEXT | (7 << 2)), 7, 0, 0 }, /* setOfEnums at 26 */
    { (ASN_TAG_CLASS_CONTEXT | (8 << 2)), 8, 0, 0 } /* seqOfZuka at 27 */
};
static asn_CHOICE_specifics_t asn_DEF_PDU_specs = {
	sizeof(struct PDU),
	offsetof(struct PDU, _asn_ctx),
	offsetof(struct PDU, present),
	sizeof(((struct PDU *)0)->present),
	asn_DEF_PDU_tag2el,
	9,	/* Count of tags in the map */
	1	/* Whether extensible */
};
asn_TYPE_descriptor_t asn_DEF_PDU = {
	"PDU",
	"PDU",
	CHOICE_free,
	CHOICE_print,
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_decode_xer,
	CHOICE_encode_xer,
	CHOICE_outmost_tag,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	asn_MBR_PDU,
	9,	/* Elements count */
	&asn_DEF_PDU_specs	/* Additional specs */
};


/*** <<< INCLUDES [Sequence] >>> ***/

#include <INTEGER.h>
#include <Sequence.h>
#include <BIT_STRING.h>
#include <UTF8String.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [Sequence] >>> ***/


struct Sequence;	/* Forward declaration */
extern asn_TYPE_descriptor_t asn_DEF_Sequence;

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


typedef struct Sequence {
	INTEGER_t	 integer;
	struct Sequence	*sequence	/* OPTIONAL */;
	BIT_STRING_t	*bits	/* OPTIONAL */;
	UTF8String_t	 string;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Sequence_t;

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

static asn_TYPE_member_t asn_MBR_Sequence[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Sequence, integer),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "integer"
		},
	{ ATF_POINTER, 2, offsetof(struct Sequence, sequence),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_Sequence,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "sequence"
		},
	{ ATF_POINTER, 1, offsetof(struct Sequence, bits),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_BIT_STRING,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "bits"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Sequence, string),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "string"
		},
};
static ber_tlv_tag_t asn_DEF_Sequence_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Sequence_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* integer at 32 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* sequence at 33 */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* bits at 34 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* string at 35 */
};
static asn_SEQUENCE_specifics_t asn_DEF_Sequence_specs = {
	sizeof(struct Sequence),
	offsetof(struct Sequence, _asn_ctx),
	asn_DEF_Sequence_tag2el,
	4,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Sequence = {
	"Sequence",
	"Sequence",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Sequence_tags,
	sizeof(asn_DEF_Sequence_tags)
		/sizeof(asn_DEF_Sequence_tags[0]), /* 1 */
	asn_DEF_Sequence_tags,	/* Same as above */
	sizeof(asn_DEF_Sequence_tags)
		/sizeof(asn_DEF_Sequence_tags[0]), /* 1 */
	asn_MBR_Sequence,
	4,	/* Elements count */
	&asn_DEF_Sequence_specs	/* Additional specs */
};


/*** <<< INCLUDES [Set] >>> ***/

#include <RELATIVE-OID.h>
#include <OCTET_STRING.h>
#include <constr_SET.h>

/*** <<< DEPS [Set] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum Set_PR {
	Set_PR_roid,	/* Member roid is present */
	Set_PR_opaque,	/* Member opaque is present */
} Set_PR;
extern asn_TYPE_descriptor_t asn_DEF_Set;

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


typedef struct Set {
	RELATIVE_OID_t	 roid;
	OCTET_STRING_t	*opaque	/* OPTIONAL */;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pSet, Set_PR_x) */
	unsigned int _presence_map
		[((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Set_t;

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

static asn_TYPE_member_t asn_MBR_Set[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Set, roid),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_RELATIVE_OID,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "roid"
		},
	{ ATF_POINTER, 1, offsetof(struct Set, opaque),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_OCTET_STRING,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "opaque"
		},
};
static ber_tlv_tag_t asn_DEF_Set_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Set_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* roid at 39 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* opaque at 40 */
};
static uint8_t asn_DEF_Set_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(1 << 7) | (0 << 6)
};
static asn_SET_specifics_t asn_DEF_Set_specs = {
	sizeof(struct Set),
	offsetof(struct Set, _asn_ctx),
	offsetof(struct Set, _presence_map),
	asn_DEF_Set_tag2el,
	2,	/* Count of tags in the map */
	asn_DEF_Set_tag2el,	/* Same as above */
	2,	/* Count of tags in the CXER map */
	0,	/* Whether extensible */
	(unsigned int *)asn_DEF_Set_mmap	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_Set = {
	"Set",
	"Set",
	SET_free,
	SET_print,
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	SET_decode_xer,
	SET_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Set_tags,
	sizeof(asn_DEF_Set_tags)
		/sizeof(asn_DEF_Set_tags[0]), /* 1 */
	asn_DEF_Set_tags,	/* Same as above */
	sizeof(asn_DEF_Set_tags)
		/sizeof(asn_DEF_Set_tags[0]), /* 1 */
	asn_MBR_Set,
	2,	/* Elements count */
	&asn_DEF_Set_specs	/* Additional specs */
};


/*** <<< INCLUDES [ExtensibleSet] >>> ***/

#include <UTF8String.h>
#include <constr_SET.h>

/*** <<< DEPS [ExtensibleSet] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum ExtensibleSet_PR {
	ExtensibleSet_PR_string,	/* Member string is present */
} ExtensibleSet_PR;
extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSet;

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


typedef struct ExtensibleSet {
	UTF8String_t	*string	/* OPTIONAL */;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pExtensibleSet, ExtensibleSet_PR_x) */
	unsigned int _presence_map
		[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} ExtensibleSet_t;

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

static asn_TYPE_member_t asn_MBR_ExtensibleSet[] = {
	{ ATF_POINTER, 1, offsetof(struct ExtensibleSet, string),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "string"
		},
};
static ber_tlv_tag_t asn_DEF_ExtensibleSet_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_ExtensibleSet_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* string at 44 */
};
static uint8_t asn_DEF_ExtensibleSet_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7)
};
static asn_SET_specifics_t asn_DEF_ExtensibleSet_specs = {
	sizeof(struct ExtensibleSet),
	offsetof(struct ExtensibleSet, _asn_ctx),
	offsetof(struct ExtensibleSet, _presence_map),
	asn_DEF_ExtensibleSet_tag2el,
	1,	/* Count of tags in the map */
	asn_DEF_ExtensibleSet_tag2el,	/* Same as above */
	1,	/* Count of tags in the CXER map */
	1,	/* Whether extensible */
	(unsigned int *)asn_DEF_ExtensibleSet_mmap	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_ExtensibleSet = {
	"ExtensibleSet",
	"ExtensibleSet",
	SET_free,
	SET_print,
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	SET_decode_xer,
	SET_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_ExtensibleSet_tags,
	sizeof(asn_DEF_ExtensibleSet_tags)
		/sizeof(asn_DEF_ExtensibleSet_tags[0]), /* 1 */
	asn_DEF_ExtensibleSet_tags,	/* Same as above */
	sizeof(asn_DEF_ExtensibleSet_tags)
		/sizeof(asn_DEF_ExtensibleSet_tags[0]), /* 1 */
	asn_MBR_ExtensibleSet,
	1,	/* Elements count */
	&asn_DEF_ExtensibleSet_specs	/* Additional specs */
};


/*** <<< INCLUDES [ExtensibleSequence] >>> ***/

#include <UTF8String.h>
#include <INTEGER.h>
#include <constr_SEQUENCE.h>

/*** <<< DEPS [ExtensibleSequence] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence;

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


typedef struct ExtensibleSequence {
	UTF8String_t	*string	/* OPTIONAL */;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	INTEGER_t	*integer	/* OPTIONAL */;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} ExtensibleSequence_t;

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

static asn_TYPE_member_t asn_MBR_ExtensibleSequence[] = {
	{ ATF_POINTER, 2, offsetof(struct ExtensibleSequence, string),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "string"
		},
	{ ATF_POINTER, 1, offsetof(struct ExtensibleSequence, integer),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "integer"
		},
};
static ber_tlv_tag_t asn_DEF_ExtensibleSequence_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_ExtensibleSequence_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* string at 49 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* integer at 51 */
};
static asn_SEQUENCE_specifics_t asn_DEF_ExtensibleSequence_specs = {
	sizeof(struct ExtensibleSequence),
	offsetof(struct ExtensibleSequence, _asn_ctx),
	asn_DEF_ExtensibleSequence_tag2el,
	2,	/* Count of tags in the map */
	0,	/* Start extensions */
	3	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_ExtensibleSequence = {
	"ExtensibleSequence",
	"ExtensibleSequence",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_ExtensibleSequence_tags,
	sizeof(asn_DEF_ExtensibleSequence_tags)
		/sizeof(asn_DEF_ExtensibleSequence_tags[0]), /* 1 */
	asn_DEF_ExtensibleSequence_tags,	/* Same as above */
	sizeof(asn_DEF_ExtensibleSequence_tags)
		/sizeof(asn_DEF_ExtensibleSequence_tags[0]), /* 1 */
	asn_MBR_ExtensibleSequence,
	2,	/* Elements count */
	&asn_DEF_ExtensibleSequence_specs	/* Additional specs */
};


/*** <<< INCLUDES [SetOf] >>> ***/

#include <REAL.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< DEPS [SetOf] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SetOf;

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


typedef struct SetOf {
	A_SET_OF(REAL_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SetOf_t;

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

static asn_TYPE_member_t asn_MBR_SetOf[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (9 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_REAL,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_SetOf_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_SetOf_specs = {
	sizeof(struct SetOf),
	offsetof(struct SetOf, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_SetOf = {
	"SetOf",
	"SetOf",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SetOf_tags,
	sizeof(asn_DEF_SetOf_tags)
		/sizeof(asn_DEF_SetOf_tags[0]), /* 1 */
	asn_DEF_SetOf_tags,	/* Same as above */
	sizeof(asn_DEF_SetOf_tags)
		/sizeof(asn_DEF_SetOf_tags[0]), /* 1 */
	asn_MBR_SetOf,
	1,	/* Single element */
	&asn_DEF_SetOf_specs	/* Additional specs */
};


/*** <<< INCLUDES [SetOfNULL] >>> ***/

#include <NULL.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< DEPS [SetOfNULL] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SetOfNULL;

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


typedef struct SetOfNULL {
	A_SET_OF(NULL_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SetOfNULL_t;

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

static asn_TYPE_member_t asn_MBR_SetOfNULL[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_NULL,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_SetOfNULL_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_SetOfNULL_specs = {
	sizeof(struct SetOfNULL),
	offsetof(struct SetOfNULL, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_SetOfNULL = {
	"SetOfNULL",
	"SetOfNULL",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SetOfNULL_tags,
	sizeof(asn_DEF_SetOfNULL_tags)
		/sizeof(asn_DEF_SetOfNULL_tags[0]), /* 1 */
	asn_DEF_SetOfNULL_tags,	/* Same as above */
	sizeof(asn_DEF_SetOfNULL_tags)
		/sizeof(asn_DEF_SetOfNULL_tags[0]), /* 1 */
	asn_MBR_SetOfNULL,
	1,	/* Single element */
	&asn_DEF_SetOfNULL_specs	/* Additional specs */
};


/*** <<< INCLUDES [SetOfEnums] >>> ***/

#include <ENUMERATED.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< DEPS [SetOfEnums] >>> ***/

typedef enum SetOfEnums_Member {
	SetOfEnums_Member_one	= 0,
	SetOfEnums_Member_oneMore	= 1
} SetOfEnums_Member_e;
extern asn_TYPE_descriptor_t asn_DEF_SetOfEnums;

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


typedef struct SetOfEnums {
	A_SET_OF(ENUMERATED_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SetOfEnums_t;

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

/* extern asn_TYPE_descriptor_t asn_DEF_SetOfEnums_Member;	// (Use -fall-defs-global to expose) */

/*** <<< CODE [SetOfEnums] >>> ***/

static int
SetOfEnums_Member_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn_DEF_ENUMERATED.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using ENUMERATED,
 * so here we adjust the DEF accordingly.
 */
static void
SetOfEnums_Member_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_ENUMERATED.free_struct;
	td->print_struct   = asn_DEF_ENUMERATED.print_struct;
	td->ber_decoder    = asn_DEF_ENUMERATED.ber_decoder;
	td->der_encoder    = asn_DEF_ENUMERATED.der_encoder;
	td->xer_decoder    = asn_DEF_ENUMERATED.xer_decoder;
	td->xer_encoder    = asn_DEF_ENUMERATED.xer_encoder;
	td->elements       = asn_DEF_ENUMERATED.elements;
	td->elements_count = asn_DEF_ENUMERATED.elements_count;
    /* td->specifics      = asn_DEF_ENUMERATED.specifics;	// Defined explicitly */
}

static void
SetOfEnums_Member_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	SetOfEnums_Member_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

static int
SetOfEnums_Member_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	SetOfEnums_Member_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

static asn_dec_rval_t
SetOfEnums_Member_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	SetOfEnums_Member_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

static asn_enc_rval_t
SetOfEnums_Member_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	SetOfEnums_Member_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

static asn_dec_rval_t
SetOfEnums_Member_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, void *bufptr, size_t size) {
	SetOfEnums_Member_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

static asn_enc_rval_t
SetOfEnums_Member_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	SetOfEnums_Member_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static asn_INTEGER_enum_map_t asn_MAP_SetOfEnums_Member_value2enum[] = {
	{ 0,	3,	"one" },
	{ 1,	7,	"oneMore" }
};
static unsigned int asn_MAP_SetOfEnums_Member_enum2value[] = {
	0,	/* one(0) */
	1	/* oneMore(1) */
};
static asn_INTEGER_specifics_t asn_DEF_SetOfEnums_Member_specs = {
	asn_MAP_SetOfEnums_Member_value2enum,	/* "tag" => N; sorted by tag */
	asn_MAP_SetOfEnums_Member_enum2value,	/* N => "tag"; sorted by N */
	2,	/* Number of elements in the maps */
	0,	/* Enumeration is not extensible */
	1	/* Strict enumeration */
};
static ber_tlv_tag_t asn_DEF_SetOfEnums_Member_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (10 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_SetOfEnums_Member = {
	"",
	"",
	SetOfEnums_Member_free,
	SetOfEnums_Member_print,
	SetOfEnums_Member_constraint,
	SetOfEnums_Member_decode_ber,
	SetOfEnums_Member_encode_der,
	SetOfEnums_Member_decode_xer,
	SetOfEnums_Member_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SetOfEnums_Member_tags,
	sizeof(asn_DEF_SetOfEnums_Member_tags)
		/sizeof(asn_DEF_SetOfEnums_Member_tags[0]), /* 1 */
	asn_DEF_SetOfEnums_Member_tags,	/* Same as above */
	sizeof(asn_DEF_SetOfEnums_Member_tags)
		/sizeof(asn_DEF_SetOfEnums_Member_tags[0]), /* 1 */
	0, 0,	/* Defined elsewhere */
	&asn_DEF_SetOfEnums_Member_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_SetOfEnums[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_SetOfEnums_Member,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_SetOfEnums_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_SetOfEnums_specs = {
	sizeof(struct SetOfEnums),
	offsetof(struct SetOfEnums, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_SetOfEnums = {
	"SetOfEnums",
	"SetOfEnums",
	SET_OF_free,
	SET_OF_print,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SetOfEnums_tags,
	sizeof(asn_DEF_SetOfEnums_tags)
		/sizeof(asn_DEF_SetOfEnums_tags[0]), /* 1 */
	asn_DEF_SetOfEnums_tags,	/* Same as above */
	sizeof(asn_DEF_SetOfEnums_tags)
		/sizeof(asn_DEF_SetOfEnums_tags[0]), /* 1 */
	asn_MBR_SetOfEnums,
	1,	/* Single element */
	&asn_DEF_SetOfEnums_specs	/* Additional specs */
};


/*** <<< INCLUDES [SequenceOf] >>> ***/

#include <INTEGER.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>

/*** <<< DEPS [SequenceOf] >>> ***/

typedef enum id {
	id_one	= 1,
	id_two	= 2
} id_e;
extern asn_TYPE_descriptor_t asn_DEF_SequenceOf;

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


typedef struct SequenceOf {
	A_SEQUENCE_OF(INTEGER_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SequenceOf_t;

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

/* extern asn_TYPE_descriptor_t asn_DEF_id;	// (Use -fall-defs-global to expose) */

/*** <<< CODE [SequenceOf] >>> ***/

static int
id_constraint(asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_consume_bytes_f *app_errlog, void *app_key) {
	/* Replace with underlying type checker */
	td->check_constraints = asn_DEF_INTEGER.check_constraints;
	return td->check_constraints(td, sptr, app_errlog, app_key);
}

/*
 * This type is implemented using INTEGER,
 * so here we adjust the DEF accordingly.
 */
static void
id_inherit_TYPE_descriptor(asn_TYPE_descriptor_t *td) {
	td->free_struct    = asn_DEF_INTEGER.free_struct;
	td->print_struct   = asn_DEF_INTEGER.print_struct;
	td->ber_decoder    = asn_DEF_INTEGER.ber_decoder;
	td->der_encoder    = asn_DEF_INTEGER.der_encoder;
	td->xer_decoder    = asn_DEF_INTEGER.xer_decoder;
	td->xer_encoder    = asn_DEF_INTEGER.xer_encoder;
	td->elements       = asn_DEF_INTEGER.elements;
	td->elements_count = asn_DEF_INTEGER.elements_count;
    /* td->specifics      = asn_DEF_INTEGER.specifics;	// Defined explicitly */
}

static void
id_free(asn_TYPE_descriptor_t *td,
		void *struct_ptr, int contents_only) {
	id_inherit_TYPE_descriptor(td);
	td->free_struct(td, struct_ptr, contents_only);
}

static int
id_print(asn_TYPE_descriptor_t *td, const void *struct_ptr,
		int ilevel, asn_app_consume_bytes_f *cb, void *app_key) {
	id_inherit_TYPE_descriptor(td);
	return td->print_struct(td, struct_ptr, ilevel, cb, app_key);
}

static asn_dec_rval_t
id_decode_ber(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, void *bufptr, size_t size, int tag_mode) {
	id_inherit_TYPE_descriptor(td);
	return td->ber_decoder(opt_codec_ctx, td, structure, bufptr, size, tag_mode);
}

static asn_enc_rval_t
id_encode_der(asn_TYPE_descriptor_t *td,
		void *structure, int tag_mode, ber_tlv_tag_t tag,
		asn_app_consume_bytes_f *cb, void *app_key) {
	id_inherit_TYPE_descriptor(td);
	return td->der_encoder(td, structure, tag_mode, tag, cb, app_key);
}

static asn_dec_rval_t
id_decode_xer(asn_codec_ctx_t *opt_codec_ctx, asn_TYPE_descriptor_t *td,
		void **structure, const char *opt_mname, void *bufptr, size_t size) {
	id_inherit_TYPE_descriptor(td);
	return td->xer_decoder(opt_codec_ctx, td, structure, opt_mname, bufptr, size);
}

static asn_enc_rval_t
id_encode_xer(asn_TYPE_descriptor_t *td, void *structure,
		int ilevel, enum xer_encoder_flags_e flags,
		asn_app_consume_bytes_f *cb, void *app_key) {
	id_inherit_TYPE_descriptor(td);
	return td->xer_encoder(td, structure, ilevel, flags, cb, app_key);
}


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

static asn_INTEGER_enum_map_t asn_MAP_id_value2enum[] = {
	{ 1,	3,	"one" },
	{ 2,	3,	"two" }
	/* This list is extensible */
};
static unsigned int asn_MAP_id_enum2value[] = {
	0,	/* one(1) */
	1	/* two(2) */
	/* This list is extensible */
};
static asn_INTEGER_specifics_t asn_DEF_id_specs = {
	asn_MAP_id_value2enum,	/* "tag" => N; sorted by tag */
	asn_MAP_id_enum2value,	/* N => "tag"; sorted by N */
	2,	/* Number of elements in the maps */
	1,	/* Enumeration is extensible */
	0
};
static ber_tlv_tag_t asn_DEF_id_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (2 << 2))
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_id = {
	"",
	"",
	id_free,
	id_print,
	id_constraint,
	id_decode_ber,
	id_encode_der,
	id_decode_xer,
	id_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_id_tags,
	sizeof(asn_DEF_id_tags)
		/sizeof(asn_DEF_id_tags[0]), /* 1 */
	asn_DEF_id_tags,	/* Same as above */
	sizeof(asn_DEF_id_tags)
		/sizeof(asn_DEF_id_tags[0]), /* 1 */
	0, 0,	/* Defined elsewhere */
	&asn_DEF_id_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_SequenceOf[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_id,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "id"
		},
};
static ber_tlv_tag_t asn_DEF_SequenceOf_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_SequenceOf_specs = {
	sizeof(struct SequenceOf),
	offsetof(struct SequenceOf, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_SequenceOf = {
	"SequenceOf",
	"SequenceOf",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SequenceOf_tags,
	sizeof(asn_DEF_SequenceOf_tags)
		/sizeof(asn_DEF_SequenceOf_tags[0]), /* 1 */
	asn_DEF_SequenceOf_tags,	/* Same as above */
	sizeof(asn_DEF_SequenceOf_tags)
		/sizeof(asn_DEF_SequenceOf_tags[0]), /* 1 */
	asn_MBR_SequenceOf,
	1,	/* Single element */
	&asn_DEF_SequenceOf_specs	/* Additional specs */
};


/*** <<< INCLUDES [SeqOfZuka] >>> ***/

#include <NULL.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>

/*** <<< DEPS [SeqOfZuka] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SeqOfZuka;

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


typedef struct SeqOfZuka {
	A_SEQUENCE_OF(NULL_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SeqOfZuka_t;

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

static asn_TYPE_member_t asn_MBR_SeqOfZuka[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (5 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_NULL,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "zuka"
		},
};
static ber_tlv_tag_t asn_DEF_SeqOfZuka_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_SeqOfZuka_specs = {
	sizeof(struct SeqOfZuka),
	offsetof(struct SeqOfZuka, _asn_ctx),
	1,	/* XER encoding is XMLValueList */
};
asn_TYPE_descriptor_t asn_DEF_SeqOfZuka = {
	"SeqOfZuka",
	"SeqOfZuka",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SeqOfZuka_tags,
	sizeof(asn_DEF_SeqOfZuka_tags)
		/sizeof(asn_DEF_SeqOfZuka_tags[0]), /* 1 */
	asn_DEF_SeqOfZuka_tags,	/* Same as above */
	sizeof(asn_DEF_SeqOfZuka_tags)
		/sizeof(asn_DEF_SeqOfZuka_tags[0]), /* 1 */
	asn_MBR_SeqOfZuka,
	1,	/* Single element */
	&asn_DEF_SeqOfZuka_specs	/* Additional specs */
};

