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

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

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

extern asn_TYPE_descriptor_t asn_DEF_T1;

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


typedef struct T1 {
	INTEGER_t	 i;
	ANY_t	 any;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T1_t;

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

static asn_TYPE_member_t asn_MBR_T1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T1, i),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "i"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct T1, any),
		.tag = -1 /* Ambiguous tag (ANY?) */,
		.tag_mode = 0,
		.type = (void *)&asn_DEF_ANY,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "any"
		},
};
static ber_tlv_tag_t asn_DEF_T1_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_T1_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 15 */
};
static asn_SEQUENCE_specifics_t asn_DEF_T1_specs = {
	sizeof(struct T1),
	offsetof(struct T1, _asn_ctx),
	asn_DEF_T1_tag2el,
	1,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_T1 = {
	"T1",
	"T1",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_T1_tags,
	sizeof(asn_DEF_T1_tags)
		/sizeof(asn_DEF_T1_tags[0]), /* 1 */
	asn_DEF_T1_tags,	/* Same as above */
	sizeof(asn_DEF_T1_tags)
		/sizeof(asn_DEF_T1_tags[0]), /* 1 */
	asn_MBR_T1,
	2,	/* Elements count */
	&asn_DEF_T1_specs	/* Additional specs */
};


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

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

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

extern asn_TYPE_descriptor_t asn_DEF_T2;

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


typedef struct T2 {
	INTEGER_t	 i;
	ANY_t	*any	/* OPTIONAL */;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} T2_t;

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

static asn_TYPE_member_t asn_MBR_T2[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct T2, i),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		.tag_mode = 0,
		.type = (void *)&asn_DEF_INTEGER,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "i"
		},
	{ ATF_POINTER, 1, offsetof(struct T2, any),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = +1,	/* EXPLICIT tag at current level */
		.type = (void *)&asn_DEF_ANY,
		.memb_constraints = 0,	/* Defer to actual type */
		.name = "any"
		},
};
static ber_tlv_tag_t asn_DEF_T2_tags[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_TYPE_tag2member_t asn_DEF_T2_tag2el[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* i at 20 */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 }, /* any at 21 */
};
static asn_SEQUENCE_specifics_t asn_DEF_T2_specs = {
	sizeof(struct T2),
	offsetof(struct T2, _asn_ctx),
	asn_DEF_T2_tag2el,
	2,	/* Count of tags in the map */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_T2 = {
	"T2",
	"T2",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_T2_tags,
	sizeof(asn_DEF_T2_tags)
		/sizeof(asn_DEF_T2_tags[0]), /* 1 */
	asn_DEF_T2_tags,	/* Same as above */
	sizeof(asn_DEF_T2_tags)
		/sizeof(asn_DEF_T2_tags[0]), /* 1 */
	asn_MBR_T2,
	2,	/* Elements count */
	&asn_DEF_T2_specs	/* Additional specs */
};

