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

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

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

extern asn1_TYPE_descriptor_t asn1_DEF_Forest;

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


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

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

static asn1_TYPE_member_t asn1_MBR_Forest[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_Tree,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_Forest_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_Forest_specs = {
	sizeof(struct Forest),
	offsetof(struct Forest, _ber_dec_ctx),
};
asn1_TYPE_descriptor_t asn1_DEF_Forest = {
	"Forest",
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_print,
	SET_OF_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_Forest_tags,
	sizeof(asn1_DEF_Forest_tags)
		/sizeof(asn1_DEF_Forest_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_Forest,
	1,	/* Single element */
	&asn1_DEF_Forest_specs	/* Additional specs */
};


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

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

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

extern asn1_TYPE_descriptor_t asn1_DEF_Tree;

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


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

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

static asn1_TYPE_member_t asn1_MBR_Tree[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, height),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "height"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Tree, width),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "width"
		},
};
static ber_tlv_tag_t asn1_DEF_Tree_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_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 asn1_SEQUENCE_specifics_t asn1_DEF_Tree_specs = {
	sizeof(struct Tree),
	offsetof(struct Tree, _ber_dec_ctx),
	asn1_DEF_Tree_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_Tree = {
	"Tree",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_Tree_tags,
	sizeof(asn1_DEF_Tree_tags)
		/sizeof(asn1_DEF_Tree_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_Tree,
	2,	/* Elements count */
	&asn1_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 <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;
extern asn1_TYPE_descriptor_t asn1_DEF_Stuff;

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


typedef struct Stuff {
	struct trees {
		A_SET_OF(struct Forest) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_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 */
			ber_dec_ctx_t _ber_dec_ctx;
		} ) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} *anything;
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pStuff, Stuff_PR_x) */
	unsigned int _presence_map
		[((2+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} Stuff_t;

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

static asn1_TYPE_member_t asn1_MBR_trees[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (17 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_Forest,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_trees_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_trees_specs = {
	sizeof(struct trees),
	offsetof(struct trees, _ber_dec_ctx),
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_trees = {
	"trees",
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_print,
	SET_OF_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_trees_tags,
	sizeof(asn1_DEF_trees_tags)
		/sizeof(asn1_DEF_trees_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_trees,
	1,	/* Single element */
	&asn1_DEF_trees_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_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 *)&asn1_DEF_BIT_STRING,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "cup-of-coffee"
		},
};
static ber_tlv_tag_t asn1_DEF_anything_member_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_anything_member_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 }, /* cup-of-coffee at 26 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_anything_member_specs = {
	sizeof(struct anything_member),
	offsetof(struct anything_member, _ber_dec_ctx),
	asn1_DEF_anything_member_tag2el,
	1,	/* Count of tags in the map */
	0,	/* Start extensions */
	2	/* Stop extensions */
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_anything_member = {
	"",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_anything_member_tags,
	sizeof(asn1_DEF_anything_member_tags)
		/sizeof(asn1_DEF_anything_member_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_anything_member,
	1,	/* Elements count */
	&asn1_DEF_anything_member_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_anything[] = {
	{ ATF_NOFLAGS, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_anything_member,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_anything_tags[] = {
	(ASN_TAG_CLASS_CONTEXT | (1 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_anything_specs = {
	sizeof(struct anything),
	offsetof(struct anything, _ber_dec_ctx),
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_anything = {
	"anything",
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_print,
	SET_OF_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_anything_tags,
	sizeof(asn1_DEF_anything_tags)
		/sizeof(asn1_DEF_anything_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_anything,
	1,	/* Single element */
	&asn1_DEF_anything_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_Stuff[] = {
	{ ATF_POINTER, 2, offsetof(struct Stuff, trees),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_trees,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "trees"
		},
	{ ATF_POINTER, 1, offsetof(struct Stuff, anything),
		.tag = (ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_anything,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "anything"
		},
};
static ber_tlv_tag_t asn1_DEF_Stuff_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_Stuff_tag2el[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* trees at 23 */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* anything at 28 */
};
static uint8_t asn1_DEF_Stuff_mmap[(2 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(0 << 7) | (0 << 6)
};
static asn1_SET_specifics_t asn1_DEF_Stuff_specs = {
	sizeof(struct Stuff),
	offsetof(struct Stuff, _ber_dec_ctx),
	offsetof(struct Stuff, _presence_map),
	asn1_DEF_Stuff_tag2el,
	2,	/* Count of tags in the map */
	0,	/* Whether extensible */
	(unsigned int *)asn1_DEF_Stuff_mmap	/* Mandatory elements map */
};
asn1_TYPE_descriptor_t asn1_DEF_Stuff = {
	"Stuff",
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	SET_print,
	SET_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_Stuff_tags,
	sizeof(asn1_DEF_Stuff_tags)
		/sizeof(asn1_DEF_Stuff_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_Stuff,
	2,	/* Elements count */
	&asn1_DEF_Stuff_specs	/* Additional specs */
};

