/*
 * Generated by asn1c-0.9.28 (http://lionet.info/asn1c)
 * From ASN.1 module "HNBAP-IEs"
 * 	found in "../../asn1/hnbap/HNBAP-IEs.asn"
 * 	`asn1c -gen-PER`
 */

#include "HNBConfigurationInformationProvided.h"

static asn_TYPE_member_t asn_MBR_HNBConfigurationInformationProvided_1[] = {
	{ ATF_POINTER, 2, offsetof(struct HNBConfigurationInformationProvided, psc),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_PSC,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"psc"
		},
	{ ATF_POINTER, 1, offsetof(struct HNBConfigurationInformationProvided, cSG_ID),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_CSG_ID,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"cSG-ID"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct HNBConfigurationInformationProvided, hNB_Cell_Access_Mode),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_HNB_Cell_Access_Mode,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"hNB-Cell-Access-Mode"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct HNBConfigurationInformationProvided, iurh_Signalling_TNL_AddressList),
		(ASN_TAG_CLASS_CONTEXT | (3 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Iurh_Signalling_TNL_AddressList,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iurh-Signalling-TNL-AddressList"
		},
	{ ATF_POINTER, 1, offsetof(struct HNBConfigurationInformationProvided, iE_Extensions),
		(ASN_TAG_CLASS_CONTEXT | (4 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_IE_Extensions,
		0,	/* Defer constraints checking to the member type */
		0,	/* No PER visible constraints */
		0,
		"iE-Extensions"
		},
};
static const int asn_MAP_HNBConfigurationInformationProvided_oms_1[] = { 0, 1, 4 };
static const ber_tlv_tag_t asn_DEF_HNBConfigurationInformationProvided_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_HNBConfigurationInformationProvided_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* psc */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* cSG-ID */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 }, /* hNB-Cell-Access-Mode */
    { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 }, /* iurh-Signalling-TNL-AddressList */
    { (ASN_TAG_CLASS_CONTEXT | (4 << 2)), 4, 0, 0 } /* iE-Extensions */
};
static asn_SEQUENCE_specifics_t asn_SPC_HNBConfigurationInformationProvided_specs_1 = {
	sizeof(struct HNBConfigurationInformationProvided),
	offsetof(struct HNBConfigurationInformationProvided, _asn_ctx),
	asn_MAP_HNBConfigurationInformationProvided_tag2el_1,
	5,	/* Count of tags in the map */
	asn_MAP_HNBConfigurationInformationProvided_oms_1,	/* Optional members */
	3, 0,	/* Root/Additions */
	4,	/* Start extensions */
	6	/* Stop extensions */
};
asn_TYPE_descriptor_t asn_DEF_HNBConfigurationInformationProvided = {
	"HNBConfigurationInformationProvided",
	"HNBConfigurationInformationProvided",
	SEQUENCE_free,
	SEQUENCE_print,
	SEQUENCE_constraint,
	SEQUENCE_decode_ber,
	SEQUENCE_encode_der,
	SEQUENCE_decode_xer,
	SEQUENCE_encode_xer,
	SEQUENCE_decode_uper,
	SEQUENCE_encode_uper,
	SEQUENCE_decode_aper,
	SEQUENCE_encode_aper,
	0,	/* Use generic outmost tag fetcher */
	asn_DEF_HNBConfigurationInformationProvided_tags_1,
	sizeof(asn_DEF_HNBConfigurationInformationProvided_tags_1)
		/sizeof(asn_DEF_HNBConfigurationInformationProvided_tags_1[0]), /* 1 */
	asn_DEF_HNBConfigurationInformationProvided_tags_1,	/* Same as above */
	sizeof(asn_DEF_HNBConfigurationInformationProvided_tags_1)
		/sizeof(asn_DEF_HNBConfigurationInformationProvided_tags_1[0]), /* 1 */
	0,	/* No PER visible constraints */
	asn_MBR_HNBConfigurationInformationProvided_1,
	5,	/* Elements count */
	&asn_SPC_HNBConfigurationInformationProvided_specs_1	/* Additional specs */
};

