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

#include <NULL.h>
#include <constr_CHOICE.h>
#include <constr_SEQUENCE.h>

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

typedef enum b_PR {
	b_PR_NOTHING,	/* No components present */
	b_PR_c,
	b_PR_d,
	b_PR_e,
	b_PR_h,
} b_PR;
typedef enum e_PR {
	e_PR_NOTHING,	/* No components present */
	e_PR_f,
	e_PR_g,
} e_PR;
typedef enum h_PR {
	h_PR_NOTHING,	/* No components present */
	h_PR_i,
	h_PR_j,
} h_PR;
extern asn1_TYPE_descriptor_t asn1_DEF_T;

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


typedef struct T {
	NULL_t	 a;
	struct b {
		b_PR present;
		union {
			NULL_t	 c;
			NULL_t	 d;
			struct e {
				e_PR present;
				union {
					NULL_t	 f;
					NULL_t	 g;
				} choice;
				
				/* Context for parsing across buffer boundaries */
				ber_dec_ctx_t _ber_dec_ctx;
			} e;
			struct h {
				h_PR present;
				union {
					NULL_t	 i;
					NULL_t	 j;
				} choice;
				
				/* Context for parsing across buffer boundaries */
				ber_dec_ctx_t _ber_dec_ctx;
			} h;
		} choice;
		
		/* Context for parsing across buffer boundaries */
		ber_dec_ctx_t _ber_dec_ctx;
	} b;
	
	/* 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_e[] = {
	{ 0, offsetof(struct e, choice.f),
		.tag = (ASN_TAG_CLASS_PRIVATE | (7 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_NULL,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "f"
		},
	{ 0, offsetof(struct e, choice.g),
		.tag = (ASN_TAG_CLASS_PRIVATE | (8 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_NULL,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "g"
		},
};
static asn1_TYPE_tag2member_t asn1_DEF_e_tag2el[] = {
    { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 0, 0, 0 }, /* f at 20 */
    { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */
};
static asn1_CHOICE_specifics_t asn1_DEF_e_specs = {
	sizeof(struct e),
	offsetof(struct e, _ber_dec_ctx),
	offsetof(struct e, present),
	sizeof(((struct e *)0)->present),
	asn1_DEF_e_tag2el,
	2,	/* Count of tags in the map */
	0	/* Whether extensible */
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_e = {
	"e",
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_print,
	CHOICE_free,
	CHOICE_outmost_tag,
	0,	/* No explicit tags (pointer) */
	0,	/* No explicit tags (count) */
	0,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_e,
	2,	/* Elements count */
	&asn1_DEF_e_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_h[] = {
	{ 0, offsetof(struct h, choice.i),
		.tag = (ASN_TAG_CLASS_PRIVATE | (1 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_NULL,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "i"
		},
	{ 0, offsetof(struct h, choice.j),
		.tag = (ASN_TAG_CLASS_PRIVATE | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_NULL,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "j"
		},
};
static asn1_TYPE_tag2member_t asn1_DEF_h_tag2el[] = {
    { (ASN_TAG_CLASS_PRIVATE | (1 << 2)), 0, 0, 0 }, /* i at 24 */
    { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 1, 0, 0 }, /* j at 25 */
};
static asn1_CHOICE_specifics_t asn1_DEF_h_specs = {
	sizeof(struct h),
	offsetof(struct h, _ber_dec_ctx),
	offsetof(struct h, present),
	sizeof(((struct h *)0)->present),
	asn1_DEF_h_tag2el,
	2,	/* Count of tags in the map */
	0	/* Whether extensible */
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_h = {
	"h",
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_print,
	CHOICE_free,
	CHOICE_outmost_tag,
	0,	/* No explicit tags (pointer) */
	0,	/* No explicit tags (count) */
	0,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_h,
	2,	/* Elements count */
	&asn1_DEF_h_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_b[] = {
	{ 0, offsetof(struct b, choice.c),
		.tag = (ASN_TAG_CLASS_PRIVATE | (5 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_NULL,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "c"
		},
	{ 0, offsetof(struct b, choice.d),
		.tag = (ASN_TAG_CLASS_PRIVATE | (6 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_NULL,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "d"
		},
	{ 0, offsetof(struct b, choice.e),
		.tag = -1 /* Ambiguous tag (CHOICE|ANY?) */,
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_e,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "e"
		},
	{ 0, offsetof(struct b, choice.h),
		.tag = (ASN_TAG_CLASS_PRIVATE | (9 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = (void *)&asn1_DEF_h,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "h"
		},
};
static asn1_TYPE_tag2member_t asn1_DEF_b_tag2el[] = {
    { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 0, 0, 0 }, /* c at 17 */
    { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */
    { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 2, 0, 0 }, /* f at 20 */
    { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 2, 0, 0 }, /* g at 21 */
    { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 3, 0, 0 }, /* h at 24 */
};
static asn1_CHOICE_specifics_t asn1_DEF_b_specs = {
	sizeof(struct b),
	offsetof(struct b, _ber_dec_ctx),
	offsetof(struct b, present),
	sizeof(((struct b *)0)->present),
	asn1_DEF_b_tag2el,
	5,	/* Count of tags in the map */
	0	/* Whether extensible */
};
static /* Use -fall-defs-global to expose */
asn1_TYPE_descriptor_t asn1_DEF_b = {
	"b",
	CHOICE_constraint,
	CHOICE_decode_ber,
	CHOICE_encode_der,
	CHOICE_print,
	CHOICE_free,
	CHOICE_outmost_tag,
	0,	/* No explicit tags (pointer) */
	0,	/* No explicit tags (count) */
	0,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	asn1_MBR_b,
	4,	/* Elements count */
	&asn1_DEF_b_specs	/* Additional specs */
};

static asn1_TYPE_member_t asn1_MBR_T[] = {
	{ 0, offsetof(struct T, a),
		.tag = (ASN_TAG_CLASS_PRIVATE | (2 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = (void *)&asn1_DEF_NULL,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "a"
		},
	{ 0, offsetof(struct T, b),
		.tag = -1 /* Ambiguous tag (CHOICE|ANY?) */,
		.tag_mode = 0,
		.type = (void *)&asn1_DEF_b,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "b"
		},
};
static ber_tlv_tag_t asn1_DEF_T_tags[] = {
	(ASN_TAG_CLASS_PRIVATE | (1 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_T_tag2el[] = {
    { (ASN_TAG_CLASS_PRIVATE | (2 << 2)), 0, 0, 0 }, /* a at 15 */
    { (ASN_TAG_CLASS_PRIVATE | (5 << 2)), 1, 0, 0 }, /* c at 17 */
    { (ASN_TAG_CLASS_PRIVATE | (6 << 2)), 1, 0, 0 }, /* d at 18 */
    { (ASN_TAG_CLASS_PRIVATE | (7 << 2)), 1, 0, 0 }, /* f at 20 */
    { (ASN_TAG_CLASS_PRIVATE | (8 << 2)), 1, 0, 0 }, /* g at 21 */
    { (ASN_TAG_CLASS_PRIVATE | (9 << 2)), 1, 0, 0 }, /* h at 24 */
};
static asn1_SEQUENCE_specifics_t asn1_DEF_T_specs = {
	sizeof(struct T),
	offsetof(struct T, _ber_dec_ctx),
	asn1_DEF_T_tag2el,
	6,	/* 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 */
};

