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

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

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

struct Tree;

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

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

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

extern asn_TYPE_descriptor_t asn_DEF_Forest;

/*** <<< POST-INCLUDE [Forest] >>> ***/

#include <Tree.h>

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

static asn_TYPE_member_t asn_MBR_Forest_1[] = {
	{ 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_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Forest_1_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_1_tags,
	sizeof(asn_DEF_Forest_1_tags)
		/sizeof(asn_DEF_Forest_1_tags[0]), /* 1 */
	asn_DEF_Forest_1_tags,	/* Same as above */
	sizeof(asn_DEF_Forest_1_tags)
		/sizeof(asn_DEF_Forest_1_tags[0]), /* 1 */
	asn_MBR_Forest_1,
	1,	/* Single element */
	&asn_SPC_Forest_1_specs	/* Additional specs */
};


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

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

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

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

extern asn_TYPE_descriptor_t asn_DEF_Tree;

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

static asn_TYPE_member_t asn_MBR_Tree_1[] = {
	{ 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_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_Tree_1_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_SPC_Tree_1_specs = {
	sizeof(struct Tree),
	offsetof(struct Tree, _asn_ctx),
	asn_MAP_Tree_1_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_1_tags,
	sizeof(asn_DEF_Tree_1_tags)
		/sizeof(asn_DEF_Tree_1_tags[0]), /* 1 */
	asn_DEF_Tree_1_tags,	/* Same as above */
	sizeof(asn_DEF_Tree_1_tags)
		/sizeof(asn_DEF_Tree_1_tags[0]), /* 1 */
	asn_MBR_Tree_1,
	2,	/* Elements count */
	&asn_SPC_Tree_1_specs	/* Additional specs */
};


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

#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;

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

struct Forest;

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

typedef struct Stuff {
	struct trees {
		A_SET_OF(struct Forest) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *trees;
	struct anything {
		A_SET_OF(struct 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;

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

extern asn_TYPE_descriptor_t asn_DEF_Stuff;

/*** <<< POST-INCLUDE [Stuff] >>> ***/

#include <Forest.h>

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

static asn_TYPE_member_t asn_MBR_trees_2[] = {
	{ 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_2_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_trees_2_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_2 = {
	"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_2_tags,
	sizeof(asn_DEF_trees_2_tags)
		/sizeof(asn_DEF_trees_2_tags[0]) - 1, /* 1 */
	asn_DEF_trees_2_tags,	/* Same as above */
	sizeof(asn_DEF_trees_2_tags)
		/sizeof(asn_DEF_trees_2_tags[0]), /* 2 */
	asn_MBR_trees_2,
	1,	/* Single element */
	&asn_SPC_trees_2_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Member_5[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct 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_Member_5_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_Member_5_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* cup-of-coffee at 32 */
};
static asn_SEQUENCE_specifics_t asn_SPC_Member_5_specs = {
	sizeof(struct Member),
	offsetof(struct Member, _asn_ctx),
	asn_MAP_Member_5_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_Member_5 = {
	"",
	"",
	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_Member_5_tags,
	sizeof(asn_DEF_Member_5_tags)
		/sizeof(asn_DEF_Member_5_tags[0]), /* 1 */
	asn_DEF_Member_5_tags,	/* Same as above */
	sizeof(asn_DEF_Member_5_tags)
		/sizeof(asn_DEF_Member_5_tags[0]), /* 1 */
	asn_MBR_Member_5,
	1,	/* Elements count */
	&asn_SPC_Member_5_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_anything_4[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_Member_5,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = ""
		},
};
static ber_tlv_tag_t asn_DEF_anything_4_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_anything_4_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_4 = {
	"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_4_tags,
	sizeof(asn_DEF_anything_4_tags)
		/sizeof(asn_DEF_anything_4_tags[0]) - 1, /* 1 */
	asn_DEF_anything_4_tags,	/* Same as above */
	sizeof(asn_DEF_anything_4_tags)
		/sizeof(asn_DEF_anything_4_tags[0]), /* 2 */
	asn_MBR_anything_4,
	1,	/* Single element */
	&asn_SPC_anything_4_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_other_9[] = {
	{ 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_MAP_other_9_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_SPC_other_9_specs = {
	sizeof(struct other),
	offsetof(struct other, _asn_ctx),
	offsetof(struct other, present),
	sizeof(((struct other *)0)->present),
	asn_MAP_other_9_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_9 = {
	"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_9,
	2,	/* Elements count */
	&asn_SPC_other_9_specs	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_Stuff_1[] = {
	{ 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_2,
		.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_4,
		.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_9,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.name = "other"
		},
};
static ber_tlv_tag_t asn_DEF_Stuff_1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn_TYPE_tag2member_t asn_MAP_Stuff_1_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_MAP_Stuff_1_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_MAP_Stuff_1_mmap[(3 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7) | (0 << 6) | (0 << 5)
};
static asn_SET_specifics_t asn_SPC_Stuff_1_specs = {
	sizeof(struct Stuff),
	offsetof(struct Stuff, _asn_ctx),
	offsetof(struct Stuff, _presence_map),
	asn_MAP_Stuff_1_tag2el,
	4,	/* Count of tags in the map */
	asn_MAP_Stuff_1_tag2el_cxer,
	3,	/* Count of tags in the CXER map */
	1,	/* Whether extensible */
	(unsigned int *)asn_MAP_Stuff_1_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_1_tags,
	sizeof(asn_DEF_Stuff_1_tags)
		/sizeof(asn_DEF_Stuff_1_tags[0]), /* 1 */
	asn_DEF_Stuff_1_tags,	/* Same as above */
	sizeof(asn_DEF_Stuff_1_tags)
		/sizeof(asn_DEF_Stuff_1_tags[0]), /* 1 */
	asn_MBR_Stuff_1,
	3,	/* Elements count */
	&asn_SPC_Stuff_1_specs	/* Additional specs */
};

