
/*** <<< 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] >>> ***/

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;

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

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_ENUMERATED,
		.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),
	0,	/* XER encoding is XMLDelimitedItemList */
};
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] >>> ***/

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;

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

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_INTEGER,
		.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 */
};

