
/*** <<< INCLUDES [Forest] >>> ***/

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

/*** <<< DEPS [Forest] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Forest;

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


typedef struct Forest {
	A_SET_OF(Tree_t) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Forest_t;

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

static asn_TYPE_member_t asn_MBR_Forest[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Tree,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_Forest_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_Forest_specs = {
	sizeof(struct Forest),
	offsetof(struct Forest, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Forest = {
	"Forest",
	"Forest",
	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_Forest_tags,
	sizeof(asn_DEF_Forest_tags)
		/sizeof(asn_DEF_Forest_tags[0]), /* 1 */
	asn_DEF_Forest_tags,	/* Same as above */
	sizeof(asn_DEF_Forest_tags)
		/sizeof(asn_DEF_Forest_tags[0]), /* 1 */
	asn_MBR_Forest,
	1,	/* Single element */
	&asn_DEF_Forest_specs	/* Additional specs */
};


/*** <<< INCLUDES [Tree] >>> ***/

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

/*** <<< DEPS [Tree] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Tree;

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


typedef struct Tree {
	INTEGER_t	 height;
	INTEGER_t	 width;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Tree_t;

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

static asn_TYPE_member_t asn_MBR_Tree[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, height),
		.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 = "height"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, width),
		.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 = "width"
		},
};
static ber_tlv_tag_t asn_DEF_Tree_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Tree_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* height at 17 */
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 }, /* width at 19 */
};
static asn_SEQUENCE_specifics_t asn_DEF_Tree_specs = {
	sizeof(struct Tree),
	offsetof(struct Tree, _asn_ctx),
	asn_DEF_Tree_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Tree = {
	"Tree",
	"Tree",
	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_Tree_tags,
	sizeof(asn_DEF_Tree_tags)
		/sizeof(asn_DEF_Tree_tags[0]), /* 1 */
	asn_DEF_Tree_tags,	/* Same as above */
	sizeof(asn_DEF_Tree_tags)
		/sizeof(asn_DEF_Tree_tags[0]), /* 1 */
	asn_MBR_Tree,
	2,	/* Elements count */
	&asn_DEF_Tree_specs	/* Additional specs */
};


/*** <<< INCLUDES [Stuff] >>> ***/

#include <Forest.h>
#include <asn_SET_OF.h>
#include <constr_SET_OF.h>
#include <BIT_STRING.h>
#include <constr_SEQUENCE.h>
#include <INTEGER.h>
#include <constr_CHOICE.h>
#include <constr_SET.h>

/*** <<< DEPS [Stuff] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum Stuff_PR {
	Stuff_PR_trees,	/* Member trees is present */
	Stuff_PR_anything,	/* Member anything is present */
	Stuff_PR_other,	/* Member other is present */
} Stuff_PR;
typedef enum other_PR {
	other_PR_NOTHING,	/* No components present */
	other_PR_a,
	other_PR_b,
} other_PR;
extern asn_TYPE_descriptor_t asn_DEF_Stuff;

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


typedef struct Stuff {
	struct trees {
		A_SET_OF(Forest_t) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *trees;
	struct anything {
		A_SET_OF(struct anything_Member {
			BIT_STRING_t	 cup_of_coffee;
			/*
			 * This type is extensible,
			 * possible extensions are below.
			 */
			
			/* Context for parsing across buffer boundaries */
			asn_struct_ctx_t _asn_ctx;
		} ) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *anything;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	struct other {
		other_PR present;
		union {
			INTEGER_t	 a;
			INTEGER_t	 b;
		} choice;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *other;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pStuff, Stuff_PR_x) */
	unsigned int _presence_map
		[((3+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Stuff_t;

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

static asn_TYPE_member_t asn_MBR_trees[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Forest,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_trees_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_trees_specs = {
	sizeof(struct trees),
	offsetof(struct trees, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_trees = {
	"trees",
	"trees",
	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_trees_tags,
	sizeof(asn_DEF_trees_tags)
		/sizeof(asn_DEF_trees_tags[0]) - 1, /* 1 */
	asn_DEF_trees_tags,	/* Same as above */
	sizeof(asn_DEF_trees_tags)
		/sizeof(asn_DEF_trees_tags[0]), /* 2 */
	asn_MBR_trees,
	1,	/* Single element */
	&asn_DEF_trees_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_anything_Member[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct anything_Member, cup_of_coffee),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_BIT_STRING,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "cup-of-coffee"
		},
};
static ber_tlv_tag_t asn_DEF_anything_Member_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_anything_Member_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 }, /* cup-of-coffee at 32 */
};
static asn_SEQUENCE_specifics_t asn_DEF_anything_Member_specs = {
	sizeof(struct anything_Member),
	offsetof(struct anything_Member, _asn_ctx),
	asn_DEF_anything_Member_tag2el,
	1,	/* Count of tags in the map */
	0,	/* Start extensions */
	2	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_anything_Member = {
	"",
	"",
	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_anything_Member_tags,
	sizeof(asn_DEF_anything_Member_tags)
		/sizeof(asn_DEF_anything_Member_tags[0]), /* 1 */
	asn_DEF_anything_Member_tags,	/* Same as above */
	sizeof(asn_DEF_anything_Member_tags)
		/sizeof(asn_DEF_anything_Member_tags[0]), /* 1 */
	asn_MBR_anything_Member,
	1,	/* Elements count */
	&asn_DEF_anything_Member_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_anything[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_anything_Member,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_anything_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_DEF_anything_specs = {
	sizeof(struct anything),
	offsetof(struct anything, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_anything = {
	"anything",
	"anything",
	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_anything_tags,
	sizeof(asn_DEF_anything_tags)
		/sizeof(asn_DEF_anything_tags[0]) - 1, /* 1 */
	asn_DEF_anything_tags,	/* Same as above */
	sizeof(asn_DEF_anything_tags)
		/sizeof(asn_DEF_anything_tags[0]), /* 2 */
	asn_MBR_anything,
	1,	/* Single element */
	&asn_DEF_anything_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_other[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct other, choice.a),
		.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 = "a"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct other, choice.b),
		.tag = (ASN_TAG_CLASS_CONTEXT | (3 << 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 = "b"
		},
};
static asn_TYPE_tag2member_t asn_DEF_other_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* a at 26 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 1, 0, 0 }, /* b at 28 */
};
static asn_CHOICE_specifics_t asn_DEF_other_specs = {
	sizeof(struct other),
	offsetof(struct other, _asn_ctx),
	offsetof(struct other, present),
	sizeof(((struct other *)0)->present),
	asn_DEF_other_tag2el,
	2,	/* Count of tags in the map */
	0	/* Whether extensible */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_other = {
	"other",
	"other",
	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_other,
	2,	/* Elements count */
	&asn_DEF_other_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Stuff[] = {
	{ ATF_POINTER, 3, offsetof(struct Stuff, trees),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_trees,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "trees"
		},
	{ ATF_POINTER, 2, offsetof(struct Stuff, anything),
		.tag = (ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn_DEF_anything,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "anything"
		},
	{ ATF_POINTER, 0, offsetof(struct Stuff, other),
		.tag = -1 /* Ambiguous tag (CHOICE?) */,
		.tag_mode = 0,
		.type = (void *)&asn_DEF_other,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "other"
		},
};
static ber_tlv_tag_t asn_DEF_Stuff_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_Stuff_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* a at 26 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees at 23 */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything at 34 */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 2, 0, 0 }, /* b at 28 */
};
static asn_TYPE_tag2member_t asn_DEF_Stuff_tag2el_cxer[] = {
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 0 }, /* trees at 23 */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 1, 0, 0 }, /* anything at 34 */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 2, 0, 0 }, /* a at 26 */
};
static uint8_t asn_DEF_Stuff_mmap[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7) | (0 << 6) | (0 << 5)
};
static asn_SET_specifics_t asn_DEF_Stuff_specs = {
	sizeof(struct Stuff),
	offsetof(struct Stuff, _asn_ctx),
	offsetof(struct Stuff, _presence_map),
	asn_DEF_Stuff_tag2el,
	4,	/* Count of tags in the map */
	asn_DEF_Stuff_tag2el_cxer,
	3,	/* Count of tags in the CANONICAL-XER map */
	1,	/* Whether extensible */
	(unsigned int *)asn_DEF_Stuff_mmap	/* Mandatory elements map */
};
asn_TYPE_descriptor_t asn_DEF_Stuff = {
	"Stuff",
	"Stuff",
	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_Stuff_tags,
	sizeof(asn_DEF_Stuff_tags)
		/sizeof(asn_DEF_Stuff_tags[0]), /* 1 */
	asn_DEF_Stuff_tags,	/* Same as above */
	sizeof(asn_DEF_Stuff_tags)
		/sizeof(asn_DEF_Stuff_tags[0]), /* 1 */
	asn_MBR_Stuff,
	3,	/* Elements count */
	&asn_DEF_Stuff_specs	/* Additional specs */
};

