
/*** <<< INCLUDES [Programming] >>> ***/

#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>

/*** <<< FWD-DECLS [Programming] >>> ***/

struct Fault;

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

typedef struct Programming {
	A_SEQUENCE_OF(struct Fault) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Programming_t;

/*** <<< FUNC-DECLS [Programming] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Programming;

/*** <<< POST-INCLUDE [Programming] >>> ***/

#include "Fault.h"

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

static asn_TYPE_member_t asn_MBR_Programming_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = -1,	/* IMPLICIT tag at current level */
		.type = &asn_DEF_Fault,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_Programming_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_Programming_specs_1 = {
	sizeof(struct Programming),
	offsetof(struct Programming, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Programming = {
	"Programming",
	"Programming",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_compare,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Programming_tags_1,
	sizeof(asn_DEF_Programming_tags_1)
		/sizeof(asn_DEF_Programming_tags_1[0]), /* 1 */
	asn_DEF_Programming_tags_1,	/* Same as above */
	sizeof(asn_DEF_Programming_tags_1)
		/sizeof(asn_DEF_Programming_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_Programming_1,
	1,	/* Single element */
	&asn_SPC_Programming_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Fault] >>> ***/

#include <asn_SET_OF.h>
#include <constr_SET_OF.h>

/*** <<< FWD-DECLS [Fault] >>> ***/

struct Error;

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

typedef struct Fault {
	A_SET_OF(struct Error) list;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Fault_t;

/*** <<< FUNC-DECLS [Fault] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Fault;
extern asn_SET_OF_specifics_t asn_SPC_Fault_specs_1;
extern asn_TYPE_member_t asn_MBR_Fault_1[1];

/*** <<< POST-INCLUDE [Fault] >>> ***/

#include "Error.h"

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

asn_TYPE_member_t asn_MBR_Fault_1[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Error,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_Fault_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (17 << 2))
};
asn_SET_OF_specifics_t asn_SPC_Fault_specs_1 = {
	sizeof(struct Fault),
	offsetof(struct Fault, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
asn_TYPE_descriptor_t asn_DEF_Fault = {
	"Fault",
	"Fault",
	SET_OF_free,
	SET_OF_print,
	SET_OF_compare,
	SET_OF_constraint,
	SET_OF_decode_ber,
	SET_OF_encode_der,
	SET_OF_decode_xer,
	SET_OF_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Fault_tags_1,
	sizeof(asn_DEF_Fault_tags_1)
		/sizeof(asn_DEF_Fault_tags_1[0]), /* 1 */
	asn_DEF_Fault_tags_1,	/* Same as above */
	sizeof(asn_DEF_Fault_tags_1)
		/sizeof(asn_DEF_Fault_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_Fault_1,
	1,	/* Single element */
	&asn_SPC_Fault_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [Error] >>> ***/

#include <constr_SEQUENCE.h>

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

typedef struct Error {
	/*
	 * This type is extensible,
	 * possible extensions are below.
	 */
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} Error_t;

/*** <<< FUNC-DECLS [Error] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_Error;
extern asn_SEQUENCE_specifics_t asn_SPC_Error_specs_1;

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

static const ber_tlv_tag_t asn_DEF_Error_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
asn_SEQUENCE_specifics_t asn_SPC_Error_specs_1 = {
	sizeof(struct Error),
	offsetof(struct Error, _asn_ctx),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_Error = {
	"Error",
	"Error",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_compare,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_Error_tags_1,
	sizeof(asn_DEF_Error_tags_1)
		/sizeof(asn_DEF_Error_tags_1[0]), /* 1 */
	asn_DEF_Error_tags_1,	/* Same as above */
	sizeof(asn_DEF_Error_tags_1)
		/sizeof(asn_DEF_Error_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	0, 0,	/* No members */
	&asn_SPC_Error_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SeqWithMandatory] >>> ***/

#include <UTF8String.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

/*** <<< FWD-DECLS [SeqWithMandatory] >>> ***/

struct Error;

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

typedef struct SeqWithMandatory {
	UTF8String_t	 someString;
	struct seqOfMan {
		A_SEQUENCE_OF(struct Error) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} seqOfMan;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SeqWithMandatory_t;

/*** <<< FUNC-DECLS [SeqWithMandatory] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SeqWithMandatory;

/*** <<< POST-INCLUDE [SeqWithMandatory] >>> ***/

#include "Error.h"

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

static asn_TYPE_member_t asn_MBR_seqOfMan_3[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Error,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_seqOfMan_tags_3[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_seqOfMan_specs_3 = {
	sizeof(struct seqOfMan),
	offsetof(struct seqOfMan, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_seqOfMan_3 = {
	"seqOfMan",
	"seqOfMan",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_compare,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_seqOfMan_tags_3,
	sizeof(asn_DEF_seqOfMan_tags_3)
		/sizeof(asn_DEF_seqOfMan_tags_3[0]), /* 2 */
	asn_DEF_seqOfMan_tags_3,	/* Same as above */
	sizeof(asn_DEF_seqOfMan_tags_3)
		/sizeof(asn_DEF_seqOfMan_tags_3[0]), /* 2 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_seqOfMan_3,
	1,	/* Single element */
	&asn_SPC_seqOfMan_specs_3	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_SeqWithMandatory_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SeqWithMandatory, someString),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "someString"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SeqWithMandatory, seqOfMan),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_seqOfMan_3,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "seqOfMan"
		},
};
static const ber_tlv_tag_t asn_DEF_SeqWithMandatory_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SeqWithMandatory_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 0, 0, 0 }, /* someString */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* seqOfMan */
};
static asn_SEQUENCE_specifics_t asn_SPC_SeqWithMandatory_specs_1 = {
	sizeof(struct SeqWithMandatory),
	offsetof(struct SeqWithMandatory, _asn_ctx),
	asn_MAP_SeqWithMandatory_tag2el_1,
	2,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_SeqWithMandatory = {
	"SeqWithMandatory",
	"SeqWithMandatory",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_compare,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SeqWithMandatory_tags_1,
	sizeof(asn_DEF_SeqWithMandatory_tags_1)
		/sizeof(asn_DEF_SeqWithMandatory_tags_1[0]), /* 1 */
	asn_DEF_SeqWithMandatory_tags_1,	/* Same as above */
	sizeof(asn_DEF_SeqWithMandatory_tags_1)
		/sizeof(asn_DEF_SeqWithMandatory_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_SeqWithMandatory_1,
	2,	/* Elements count */
	&asn_SPC_SeqWithMandatory_specs_1	/* Additional specs */
};


/*** <<< INCLUDES [SeqWithOptional] >>> ***/

#include <UTF8String.h>
#include <asn_SEQUENCE_OF.h>
#include <constr_SEQUENCE_OF.h>
#include <constr_SEQUENCE.h>

/*** <<< FWD-DECLS [SeqWithOptional] >>> ***/

struct Error;

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

typedef struct SeqWithOptional {
	UTF8String_t	 someString;
	struct seqOfOpt {
		A_SEQUENCE_OF(struct Error) list;
		
		/* Context for parsing across buffer boundaries */
		asn_struct_ctx_t _asn_ctx;
	} *seqOfOpt;
	
	/* Context for parsing across buffer boundaries */
	asn_struct_ctx_t _asn_ctx;
} SeqWithOptional_t;

/*** <<< FUNC-DECLS [SeqWithOptional] >>> ***/

extern asn_TYPE_descriptor_t asn_DEF_SeqWithOptional;

/*** <<< POST-INCLUDE [SeqWithOptional] >>> ***/

#include "Error.h"

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

static asn_TYPE_member_t asn_MBR_seqOfOpt_3[] = {
	{ ATF_POINTER, 0, 0,
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_Error,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = ""
		},
};
static const ber_tlv_tag_t asn_DEF_seqOfOpt_tags_3[] = {
	(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static asn_SET_OF_specifics_t asn_SPC_seqOfOpt_specs_3 = {
	sizeof(struct seqOfOpt),
	offsetof(struct seqOfOpt, _asn_ctx),
	0,	/* XER encoding is XMLDelimitedItemList */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_seqOfOpt_3 = {
	"seqOfOpt",
	"seqOfOpt",
	SEQUENCE_OF_free,
	SEQUENCE_OF_print,
	SEQUENCE_OF_compare,
	SEQUENCE_OF_constraint,
	SEQUENCE_OF_decode_ber,
	SEQUENCE_OF_encode_der,
	SEQUENCE_OF_decode_xer,
	SEQUENCE_OF_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_seqOfOpt_tags_3,
	sizeof(asn_DEF_seqOfOpt_tags_3)
		/sizeof(asn_DEF_seqOfOpt_tags_3[0]), /* 2 */
	asn_DEF_seqOfOpt_tags_3,	/* Same as above */
	sizeof(asn_DEF_seqOfOpt_tags_3)
		/sizeof(asn_DEF_seqOfOpt_tags_3[0]), /* 2 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_seqOfOpt_3,
	1,	/* Single element */
	&asn_SPC_seqOfOpt_specs_3	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_SeqWithOptional_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SeqWithOptional, someString),
		.tag = (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_UTF8String,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "someString"
		},
	{ ATF_POINTER, 1, offsetof(struct SeqWithOptional, seqOfOpt),
		.tag = (ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		.tag_mode = 0,
		.type = &asn_DEF_seqOfOpt_3,
		.memb_constraints = 0,	/* Defer constraints checking to the member type */
		.oer_constraints = 0,	/* OER is not compiled, use -gen-OER */
		.per_constraints = 0,	/* PER is not compiled, use -gen-PER */
		.default_value = 0,
		.name = "seqOfOpt"
		},
};
static const ber_tlv_tag_t asn_DEF_SeqWithOptional_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SeqWithOptional_tag2el_1[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (12 << 2)), 0, 0, 0 }, /* someString */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 1, 0, 0 } /* seqOfOpt */
};
static asn_SEQUENCE_specifics_t asn_SPC_SeqWithOptional_specs_1 = {
	sizeof(struct SeqWithOptional),
	offsetof(struct SeqWithOptional, _asn_ctx),
	asn_MAP_SeqWithOptional_tag2el_1,
	2,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* Start extensions */
	-1	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_SeqWithOptional = {
	"SeqWithOptional",
	"SeqWithOptional",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_compare,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	0, 0,	/* No OER support, use "-gen-OER" to enable */
	0, 0,	/* No PER support, use "-gen-PER" to enable */
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_SeqWithOptional_tags_1,
	sizeof(asn_DEF_SeqWithOptional_tags_1)
		/sizeof(asn_DEF_SeqWithOptional_tags_1[0]), /* 1 */
	asn_DEF_SeqWithOptional_tags_1,	/* Same as above */
	sizeof(asn_DEF_SeqWithOptional_tags_1)
		/sizeof(asn_DEF_SeqWithOptional_tags_1[0]), /* 1 */
	0,	/* No OER visible constraints */
	0,	/* No PER visible constraints */
	asn_MBR_SeqWithOptional_1,
	2,	/* Elements count */
	&asn_SPC_SeqWithOptional_specs_1	/* Additional specs */
};

