
/*** <<< INCLUDES [T] >>> ***/

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

/*** <<< DEPS [T] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_T;

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


typedef struct T {
	INTEGER_t	 int;
	struct collection {
		A_SEQUENCE_OF(struct T2) list;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} collection;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} T_t;

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

static asn1_TYPE_member_t asn1_MBR_collection[] = {
	{ 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_T2,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = ""
		},
};
static ber_tlv_tag_t asn1_DEF_collection_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_SET_OF_specifics_t asn1_DEF_collection_specs = {
	sizeof(struct collection),
	offsetof(struct collection, _ber_dec_ctx),
};
asn1_TYPE_descriptor_t asn1_DEF_collection = {
	"collection",
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_print,
	SEQUENCE_OF_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_collection_tags,
	sizeof(asn1_DEF_collection_tags)
		/sizeof(asn1_DEF_collection_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_collection,
	1,	/* Single element */
	&asn1_DEF_collection_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_T[] = {
	{ 0, offsetof(struct T, int),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "int"
		},
	{ 0, offsetof(struct T, collection),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_collection,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "collection"
		},
};
static ber_tlv_tag_t asn1_DEF_T_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* int at 15 */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 0 }, /* collection at 17 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = {
	sizeof(struct T),
	offsetof(struct T, _ber_dec_ctx),
	asn1_DEF_T_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_T = {
	"T",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T_tags,
	sizeof(asn1_DEF_T_tags)
		/sizeof(asn1_DEF_T_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_T,
	2,	/* Elements count */
	&asn1_DEF_T_specs	/* Additional specs */
};


/*** <<< INCLUDES [T2] >>> ***/

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

/*** <<< DEPS [T2] >>> ***/

extern asn1_TYPE_descriptor_t asn1_DEF_T2;

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


typedef struct T2 {
	BOOLEAN_t	 flag;
	UTF8String_t	 str;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} T2_t;

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

static asn1_TYPE_member_t asn1_MBR_T2[] = {
	{ 0, offsetof(struct T2, flag),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_BOOLEAN,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "flag"
		},
	{ 0, offsetof(struct T2, str),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "str"
		},
};
static ber_tlv_tag_t asn1_DEF_T2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (1 << 2)), 0, 0, 0 }, /* flag at 20 */
    { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 1, 0, 0 }, /* str at 21 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_T2_specs = {
	sizeof(struct T2),
	offsetof(struct T2, _ber_dec_ctx),
	asn1_DEF_T2_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn1_TYPE_descriptor_t asn1_DEF_T2 = {
	"T2",
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_print,
	SEQUENCE_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T2_tags,
	sizeof(asn1_DEF_T2_tags)
		/sizeof(asn1_DEF_T2_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_T2,
	2,	/* Elements count */
	&asn1_DEF_T2_specs	/* Additional specs */
};

