
/*** <<< INCLUDES [T1] >>> ***/

#include <INTEGER.h>
#include <constr_SET.h>

/*** <<< DEPS [T1] >>> ***/


/*
 * Method of determining the components presence
 */
typedef enum T1_PR {
	T1_PR_i,	/* Member i is present */
} T1_PR;
extern asn1_TYPE_descriptor_t asn1_DEF_T1;

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


typedef struct T1 {
	INTEGER_t	 i;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pT1, T1_PR_x) */
	unsigned int _presence_map
		[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} T1_t;

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

static asn1_SET_element_t asn1_DEF_T1_elements[] = {
	{ offsetof(struct T1, i), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		(void *)&asn1_DEF_INTEGER,
		"i"
		},
};
static ber_tlv_tag_t asn1_DEF_T1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_T1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 14 */
};
static uint8_t asn1_DEF_T1_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(1 << 7)
};
static asn1_SET_specifics_t asn1_DEF_T1_specs = {
	sizeof(struct T1),
	offsetof(struct T1, _ber_dec_ctx),
	offsetof(struct T1, _presence_map),
	asn1_DEF_T1_elements,
	1,	/* Elements count */
	asn1_DEF_T1_tag2el,
	1,	/* Count of tags in the map */
	1,	/* Whether extensible */
	(unsigned int *)asn1_DEF_T1_mmap	/* Mandatory elements map */
};
asn1_TYPE_descriptor_t asn1_DEF_T1 = {
	"T1",
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	SET_print,
	SET_free,
	0,	/* Use generic outmost tag fetcher */
	asn1_DEF_T1_tags,
	sizeof(asn1_DEF_T1_tags)
		/sizeof(asn1_DEF_T1_tags[0]), /* 1 */
	1,	/* Tags to skip */
	1,	/* Whether CONSTRUCTED */
	&asn1_DEF_T1_specs	/* Additional specs */
};


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

#include <INTEGER.h>
#include <constr_SET.h>

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


/*
 * Method of determining the components presence
 */
typedef enum T2_PR {
	T2_PR_i,	/* Member i is present */
} T2_PR;
extern asn1_TYPE_descriptor_t asn1_DEF_T2;

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


typedef struct T2 {
	INTEGER_t	 i;
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Presence bitmask: ASN_SET_ISPRESENT(pT2, T2_PR_x) */
	unsigned int _presence_map
		[((1+(8*sizeof(unsigned int))-1)/(8*sizeof(unsigned int)))];
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} T2_t;

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

static asn1_SET_element_t asn1_DEF_T2_elements[] = {
	{ offsetof(struct T2, i), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		(void *)&asn1_DEF_INTEGER,
		"i"
		},
};
static ber_tlv_tag_t asn1_DEF_T2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
static asn1_TYPE_tag2member_t asn1_DEF_T2_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 15 */
};
static uint8_t asn1_DEF_T2_mmap[(1 + (8 * sizeof(unsigned int)) - 1) / 8] = {
	(1 << 7)
};
static asn1_SET_specifics_t asn1_DEF_T2_specs = {
	sizeof(struct T2),
	offsetof(struct T2, _ber_dec_ctx),
	offsetof(struct T2, _presence_map),
	asn1_DEF_T2_elements,
	1,	/* Elements count */
	asn1_DEF_T2_tag2el,
	1,	/* Count of tags in the map */
	1,	/* Whether extensible */
	(unsigned int *)asn1_DEF_T2_mmap	/* Mandatory elements map */
};
asn1_TYPE_descriptor_t asn1_DEF_T2 = {
	"T2",
	SET_constraint,
	SET_decode_ber,
	SET_encode_der,
	SET_print,
	SET_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_DEF_T2_specs	/* Additional specs */
};


/*** <<< INCLUDES [T3] >>> ***/

#include <INTEGER.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [T3] >>> ***/

typedef enum T3_PR {
	T3_PR_NOTHING,	/* No components present */
	T3_PR_i,
	/* Extensions may appear below */
} T3_PR;
extern asn1_TYPE_descriptor_t asn1_DEF_T3;

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


typedef struct T3 {
	T3_PR present;
	union {
		INTEGER_t	 i;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
	} choice;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} T3_t;

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

static asn1_CHOICE_element_t asn1_DEF_T3_elements[] = {
	{ offsetof(struct T3, choice.i), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		(void *)&asn1_DEF_INTEGER,
		"i"
		},
};
static asn1_TYPE_tag2member_t asn1_DEF_T3_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 16 */
};
static asn1_CHOICE_specifics_t asn1_DEF_T3_specs = {
	sizeof(struct T3),
	offsetof(struct T3, _ber_dec_ctx),
	offsetof(struct T3, present),
	sizeof(((struct T3 *)0)->present),
	asn1_DEF_T3_elements,
	1,	/* Elements count */
	asn1_DEF_T3_tag2el,
	1,	/* Count of tags in the map */
	1	/* Whether extensible */
};
asn1_TYPE_descriptor_t asn1_DEF_T3 = {
	"T3",
	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_DEF_T3_specs	/* Additional specs */
};


/*** <<< INCLUDES [T4] >>> ***/

#include <INTEGER.h>
#include <constr_CHOICE.h>

/*** <<< DEPS [T4] >>> ***/

typedef enum T4_PR {
	T4_PR_NOTHING,	/* No components present */
	T4_PR_i,
	/* Extensions may appear below */
} T4_PR;
extern asn1_TYPE_descriptor_t asn1_DEF_T4;

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


typedef struct T4 {
	T4_PR present;
	union {
		INTEGER_t	 i;
		/*
		 * This type is extensible,
		 * possible extensions are below.
		 */
	} choice;
	
	/* Context for parsing across buffer boundaries */
	ber_dec_ctx_t _ber_dec_ctx;
} T4_t;

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

static asn1_CHOICE_element_t asn1_DEF_T4_elements[] = {
	{ offsetof(struct T4, choice.i), 0,
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		(void *)&asn1_DEF_INTEGER,
		"i"
		},
};
static asn1_TYPE_tag2member_t asn1_DEF_T4_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 17 */
};
static asn1_CHOICE_specifics_t asn1_DEF_T4_specs = {
	sizeof(struct T4),
	offsetof(struct T4, _ber_dec_ctx),
	offsetof(struct T4, present),
	sizeof(((struct T4 *)0)->present),
	asn1_DEF_T4_elements,
	1,	/* Elements count */
	asn1_DEF_T4_tag2el,
	1,	/* Count of tags in the map */
	1	/* Whether extensible */
};
asn1_TYPE_descriptor_t asn1_DEF_T4 = {
	"T4",
	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_DEF_T4_specs	/* Additional specs */
};

