
/*** <<< 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[] = {
	{ ATF_NOFLAGS, 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),
};
static /* Use -fall-defs-global to expose */
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 */
	asn1_DEF_collection_tags,	/* Same as above */
	sizeof(asn1_DEF_collection_tags)
		/sizeof(asn1_DEF_collection_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_collection,
	1,	/* Single element */
	&asn1_DEF_collection_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_T[] = {
	{ ATF_NOFLAGS, 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"
		},
	{ ATF_NOFLAGS, 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 */
	asn1_DEF_T_tags,	/* Same as above */
	sizeof(asn1_DEF_T_tags)
		/sizeof(asn1_DEF_T_tags[0]), /* 1 */
	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[] = {
	{ ATF_NOFLAGS, 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"
		},
	{ ATF_NOFLAGS, 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 */
	asn1_DEF_T2_tags,	/* Same as above */
	sizeof(asn1_DEF_T2_tags)
		/sizeof(asn1_DEF_T2_tags[0]), /* 1 */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_T2,
	2,	/* Elements count */
	&asn1_DEF_T2_specs	/* Additional specs */
};

