/*
 * Generated by asn1c-0.9.29 (http://lionet.info/asn1c)
 * From ASN.1 module "X2AP-Containers"
 * 	found in "Spec/e2_and_x2-combined-and-minimized.asn1"
 * 	`asn1c -pdu=auto -fincludes-quoted -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example`
 */

#include "ProtocolExtensionField.h"

static const long asn_VAL_1_id_ABSInformation = 61;
static const long asn_VAL_1_ignore = 1;
static const long asn_VAL_1_optional = 0;
static const long asn_VAL_2_id_InvokeIndication = 62;
static const long asn_VAL_2_ignore = 1;
static const long asn_VAL_2_optional = 0;
static const long asn_VAL_3_id_IntendedULDLConfiguration = 99;
static const long asn_VAL_3_ignore = 1;
static const long asn_VAL_3_optional = 0;
static const long asn_VAL_4_id_ExtendedULInterferenceOverloadInfo = 100;
static const long asn_VAL_4_ignore = 1;
static const long asn_VAL_4_optional = 0;
static const long asn_VAL_5_id_CoMPInformation = 108;
static const long asn_VAL_5_ignore = 1;
static const long asn_VAL_5_optional = 0;
static const long asn_VAL_6_id_DynamicDLTransmissionInformation = 106;
static const long asn_VAL_6_ignore = 1;
static const long asn_VAL_6_optional = 0;
static const asn_ioc_cell_t asn_IOS_CellInformation_Item_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_1_id_ABSInformation },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_1_ignore },
	{ "&Extension", aioc__type, &asn_DEF_ABSInformation },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_1_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_2_id_InvokeIndication },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_2_ignore },
	{ "&Extension", aioc__type, &asn_DEF_InvokeIndication },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_2_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_3_id_IntendedULDLConfiguration },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_3_ignore },
	{ "&Extension", aioc__type, &asn_DEF_SubframeAssignment },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_3_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_4_id_ExtendedULInterferenceOverloadInfo },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_4_ignore },
	{ "&Extension", aioc__type, &asn_DEF_ExtendedULInterferenceOverloadInfo },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_4_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_5_id_CoMPInformation },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_5_ignore },
	{ "&Extension", aioc__type, &asn_DEF_CoMPInformation },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_5_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_6_id_DynamicDLTransmissionInformation },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_6_ignore },
	{ "&Extension", aioc__type, &asn_DEF_DynamicDLTransmissionInformation },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_6_optional }
};
static const asn_ioc_set_t asn_IOS_CellInformation_Item_ExtIEs_1[] = {
	{ 6, 4, asn_IOS_CellInformation_Item_ExtIEs_1_rows }
};
static const long asn_VAL_7_id_DeactivationIndication = 59;
static const long asn_VAL_7_ignore = 1;
static const long asn_VAL_7_optional = 0;
static const asn_ioc_cell_t asn_IOS_ServedCellsToModify_Item_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_7_id_DeactivationIndication },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_7_ignore },
	{ "&Extension", aioc__type, &asn_DEF_DeactivationIndication },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_7_optional }
};
static const asn_ioc_set_t asn_IOS_ServedCellsToModify_Item_ExtIEs_1[] = {
	{ 1, 4, asn_IOS_ServedCellsToModify_Item_ExtIEs_1_rows }
};
static const long asn_VAL_8_id_CompositeAvailableCapacityGroup = 42;
static const long asn_VAL_8_ignore = 1;
static const long asn_VAL_8_optional = 0;
static const long asn_VAL_9_id_ABS_Status = 63;
static const long asn_VAL_9_ignore = 1;
static const long asn_VAL_9_optional = 0;
static const long asn_VAL_10_id_RSRPMRList = 110;
static const long asn_VAL_10_ignore = 1;
static const long asn_VAL_10_optional = 0;
static const long asn_VAL_11_id_CSIReportList = 146;
static const long asn_VAL_11_ignore = 1;
static const long asn_VAL_11_optional = 0;
static const long asn_VAL_12_id_CellReportingIndicator = 170;
static const long asn_VAL_12_ignore = 1;
static const long asn_VAL_12_optional = 0;
static const asn_ioc_cell_t asn_IOS_CellMeasurementResult_Item_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_8_id_CompositeAvailableCapacityGroup },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_8_ignore },
	{ "&Extension", aioc__type, &asn_DEF_CompositeAvailableCapacityGroup },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_8_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_9_id_ABS_Status },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_9_ignore },
	{ "&Extension", aioc__type, &asn_DEF_ABS_Status },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_9_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_10_id_RSRPMRList },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_10_ignore },
	{ "&Extension", aioc__type, &asn_DEF_RSRPMRList },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_10_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_11_id_CSIReportList },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_11_ignore },
	{ "&Extension", aioc__type, &asn_DEF_CSIReportList },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_11_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_12_id_CellReportingIndicator },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_12_ignore },
	{ "&Extension", aioc__type, &asn_DEF_CellReportingIndicator },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_12_optional }
};
static const asn_ioc_set_t asn_IOS_CellMeasurementResult_Item_ExtIEs_1[] = {
	{ 5, 4, asn_IOS_CellMeasurementResult_Item_ExtIEs_1_rows }
};
static const long asn_VAL_13_id_UL_EARFCNExtension = 95;
static const long asn_VAL_13_reject = 0;
static const long asn_VAL_13_optional = 0;
static const long asn_VAL_14_id_DL_EARFCNExtension = 96;
static const long asn_VAL_14_reject = 0;
static const long asn_VAL_14_optional = 0;
static const long asn_VAL_15_id_OffsetOfNbiotChannelNumberToDL_EARFCN = 177;
static const long asn_VAL_15_reject = 0;
static const long asn_VAL_15_optional = 0;
static const long asn_VAL_16_id_OffsetOfNbiotChannelNumberToUL_EARFCN = 178;
static const long asn_VAL_16_reject = 0;
static const long asn_VAL_16_optional = 0;
static const long asn_VAL_17_id_NRS_NSSS_PowerOffset = 282;
static const long asn_VAL_17_ignore = 1;
static const long asn_VAL_17_optional = 0;
static const long asn_VAL_18_id_NSSS_NumOccasionDifferentPrecoder = 283;
static const long asn_VAL_18_ignore = 1;
static const long asn_VAL_18_optional = 0;
static const asn_ioc_cell_t asn_IOS_FDD_Info_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_13_id_UL_EARFCNExtension },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_13_reject },
	{ "&Extension", aioc__type, &asn_DEF_EARFCNExtension },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_13_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_14_id_DL_EARFCNExtension },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_14_reject },
	{ "&Extension", aioc__type, &asn_DEF_EARFCNExtension },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_14_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_15_id_OffsetOfNbiotChannelNumberToDL_EARFCN },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_15_reject },
	{ "&Extension", aioc__type, &asn_DEF_OffsetOfNbiotChannelNumberToEARFCN },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_15_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_16_id_OffsetOfNbiotChannelNumberToUL_EARFCN },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_16_reject },
	{ "&Extension", aioc__type, &asn_DEF_OffsetOfNbiotChannelNumberToEARFCN },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_16_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_17_id_NRS_NSSS_PowerOffset },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_17_ignore },
	{ "&Extension", aioc__type, &asn_DEF_NRS_NSSS_PowerOffset },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_17_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_18_id_NSSS_NumOccasionDifferentPrecoder },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_18_ignore },
	{ "&Extension", aioc__type, &asn_DEF_NSSS_NumOccasionDifferentPrecoder },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_18_optional }
};
static const asn_ioc_set_t asn_IOS_FDD_Info_ExtIEs_1[] = {
	{ 6, 4, asn_IOS_FDD_Info_ExtIEs_1_rows }
};
static const long asn_VAL_19_id_NeighbourTAC = 76;
static const long asn_VAL_19_ignore = 1;
static const long asn_VAL_19_optional = 0;
static const long asn_VAL_20_id_eARFCNExtension = 94;
static const long asn_VAL_20_reject = 0;
static const long asn_VAL_20_optional = 0;
static const asn_ioc_cell_t asn_IOS_Neighbour_Information_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_19_id_NeighbourTAC },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_19_ignore },
	{ "&Extension", aioc__type, &asn_DEF_TAC },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_19_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_20_id_eARFCNExtension },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_20_reject },
	{ "&Extension", aioc__type, &asn_DEF_EARFCNExtension },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_20_optional }
};
static const asn_ioc_set_t asn_IOS_Neighbour_Information_ExtIEs_1[] = {
	{ 2, 4, asn_IOS_Neighbour_Information_ExtIEs_1_rows }
};
static const long asn_VAL_21_id_DL_scheduling_PDCCH_CCE_usage = 193;
static const long asn_VAL_21_ignore = 1;
static const long asn_VAL_21_optional = 0;
static const long asn_VAL_22_id_UL_scheduling_PDCCH_CCE_usage = 194;
static const long asn_VAL_22_ignore = 1;
static const long asn_VAL_22_optional = 0;
static const asn_ioc_cell_t asn_IOS_RadioResourceStatus_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_21_id_DL_scheduling_PDCCH_CCE_usage },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_21_ignore },
	{ "&Extension", aioc__type, &asn_DEF_DL_scheduling_PDCCH_CCE_usage },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_21_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_22_id_UL_scheduling_PDCCH_CCE_usage },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_22_ignore },
	{ "&Extension", aioc__type, &asn_DEF_UL_scheduling_PDCCH_CCE_usage },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_22_optional }
};
static const asn_ioc_set_t asn_IOS_RadioResourceStatus_ExtIEs_1[] = {
	{ 2, 4, asn_IOS_RadioResourceStatus_ExtIEs_1_rows }
};
static const long asn_VAL_23_id_enhancedRNTP = 148;
static const long asn_VAL_23_ignore = 1;
static const long asn_VAL_23_optional = 0;
static const asn_ioc_cell_t asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_23_id_enhancedRNTP },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_23_ignore },
	{ "&Extension", aioc__type, &asn_DEF_EnhancedRNTP },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_23_optional }
};
static const asn_ioc_set_t asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1[] = {
	{ 1, 4, asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1_rows }
};
static const long asn_VAL_24_id_UEID = 147;
static const long asn_VAL_24_ignore = 1;
static const long asn_VAL_24_optional = 0;
static const asn_ioc_cell_t asn_IOS_RSRPMRList_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_24_id_UEID },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_24_ignore },
	{ "&Extension", aioc__type, &asn_DEF_UEID },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_24_optional }
};
static const asn_ioc_set_t asn_IOS_RSRPMRList_ExtIEs_1[] = {
	{ 1, 4, asn_IOS_RSRPMRList_ExtIEs_1_rows }
};
static const long asn_VAL_25_id_Number_of_Antennaports = 41;
static const long asn_VAL_25_ignore = 1;
static const long asn_VAL_25_optional = 0;
static const long asn_VAL_26_id_PRACH_Configuration = 55;
static const long asn_VAL_26_ignore = 1;
static const long asn_VAL_26_optional = 0;
static const long asn_VAL_27_id_MBSFN_Subframe_Info = 56;
static const long asn_VAL_27_ignore = 1;
static const long asn_VAL_27_optional = 0;
static const long asn_VAL_28_id_CSG_Id = 70;
static const long asn_VAL_28_ignore = 1;
static const long asn_VAL_28_optional = 0;
static const long asn_VAL_29_id_MBMS_Service_Area_List = 79;
static const long asn_VAL_29_ignore = 1;
static const long asn_VAL_29_optional = 0;
static const long asn_VAL_30_id_MultibandInfoList = 84;
static const long asn_VAL_30_ignore = 1;
static const long asn_VAL_30_optional = 0;
static const long asn_VAL_31_id_FreqBandIndicatorPriority = 160;
static const long asn_VAL_31_ignore = 1;
static const long asn_VAL_31_optional = 0;
static const long asn_VAL_32_id_BandwidthReducedSI = 180;
static const long asn_VAL_32_ignore = 1;
static const long asn_VAL_32_optional = 0;
static const long asn_VAL_33_id_ProtectedEUTRAResourceIndication = 284;
static const long asn_VAL_33_ignore = 1;
static const long asn_VAL_33_optional = 0;
static const asn_ioc_cell_t asn_IOS_ServedCell_Information_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_25_id_Number_of_Antennaports },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_25_ignore },
	{ "&Extension", aioc__type, &asn_DEF_Number_of_Antennaports },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_25_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_26_id_PRACH_Configuration },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_26_ignore },
	{ "&Extension", aioc__type, &asn_DEF_PRACH_Configuration },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_26_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_27_id_MBSFN_Subframe_Info },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_27_ignore },
	{ "&Extension", aioc__type, &asn_DEF_MBSFN_Subframe_Infolist },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_27_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_28_id_CSG_Id },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_28_ignore },
	{ "&Extension", aioc__type, &asn_DEF_CSG_Id },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_28_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_29_id_MBMS_Service_Area_List },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_29_ignore },
	{ "&Extension", aioc__type, &asn_DEF_MBMS_Service_Area_Identity_List },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_29_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_30_id_MultibandInfoList },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_30_ignore },
	{ "&Extension", aioc__type, &asn_DEF_MultibandInfoList },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_30_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_31_id_FreqBandIndicatorPriority },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_31_ignore },
	{ "&Extension", aioc__type, &asn_DEF_FreqBandIndicatorPriority },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_31_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_32_id_BandwidthReducedSI },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_32_ignore },
	{ "&Extension", aioc__type, &asn_DEF_BandwidthReducedSI },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_32_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_33_id_ProtectedEUTRAResourceIndication },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_33_ignore },
	{ "&Extension", aioc__type, &asn_DEF_ProtectedEUTRAResourceIndication },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_33_optional }
};
static const asn_ioc_set_t asn_IOS_ServedCell_Information_ExtIEs_1[] = {
	{ 9, 4, asn_IOS_ServedCell_Information_ExtIEs_1_rows }
};
static const long asn_VAL_34_id_AdditionalSpecialSubframe_Info = 97;
static const long asn_VAL_34_ignore = 1;
static const long asn_VAL_34_optional = 0;
static const long asn_VAL_35_id_eARFCNExtension = 94;
static const long asn_VAL_35_reject = 0;
static const long asn_VAL_35_optional = 0;
static const long asn_VAL_36_id_AdditionalSpecialSubframeExtension_Info = 179;
static const long asn_VAL_36_ignore = 1;
static const long asn_VAL_36_optional = 0;
static const asn_ioc_cell_t asn_IOS_TDD_Info_ExtIEs_1_rows[] = {
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_34_id_AdditionalSpecialSubframe_Info },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_34_ignore },
	{ "&Extension", aioc__type, &asn_DEF_AdditionalSpecialSubframe_Info },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_34_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_35_id_eARFCNExtension },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_35_reject },
	{ "&Extension", aioc__type, &asn_DEF_EARFCNExtension },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_35_optional },
	{ "&id", aioc__value, &asn_DEF_ProtocolIE_ID, &asn_VAL_36_id_AdditionalSpecialSubframeExtension_Info },
	{ "&criticality", aioc__value, &asn_DEF_Criticality, &asn_VAL_36_ignore },
	{ "&Extension", aioc__type, &asn_DEF_AdditionalSpecialSubframeExtension_Info },
	{ "&presence", aioc__value, &asn_DEF_Presence, &asn_VAL_36_optional }
};
static const asn_ioc_set_t asn_IOS_TDD_Info_ExtIEs_1[] = {
	{ 3, 4, asn_IOS_TDD_Info_ExtIEs_1_rows }
};
static int
memb_id_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_CellInformation_Item_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_CellInformation_Item_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellInformation_Item_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_CellInformation_Item_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_CellInformation_Item_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellInformation_Item_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_1(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_ServedCellsToModify_Item_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_ServedCellsToModify_Item_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ServedCellsToModify_Item_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_ServedCellsToModify_Item_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_ServedCellsToModify_Item_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ServedCellsToModify_Item_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_5(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_9(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_13(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_17(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_21(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_CellMeasurementResult_Item_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_CellMeasurementResult_Item_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellMeasurementResult_Item_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_CellMeasurementResult_Item_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_CellMeasurementResult_Item_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct CellMeasurementResult_Item_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_25(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_29(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_33(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_37(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_41(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_45(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_49(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_53(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_57(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_61(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_65(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_69(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_73(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_77(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_81(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_85(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_89(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_93(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_97(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_101(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_105(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_105(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_105(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_109(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_109(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_109(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_113(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_113(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_113(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_117(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_117(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_117(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_121(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_121(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_121(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_125(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_125(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_125(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_129(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_129(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_129(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_133(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_133(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_133(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_137(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_137(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_137(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_141(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_141(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_141(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_145(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_145(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_145(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_149(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_149(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_149(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_153(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_153(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_153(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_157(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_157(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_157(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_161(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_161(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_161(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_165(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_165(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_165(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_169(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_169(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_169(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_173(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_FDD_Info_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_FDD_Info_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct FDD_Info_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_173(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_FDD_Info_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_FDD_Info_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct FDD_Info_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_173(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_177(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_177(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_177(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_181(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_181(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_181(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_185(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_185(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_185(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_189(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_189(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_189(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_193(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_193(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_193(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_197(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_197(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_197(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_201(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_201(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_201(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_205(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_Neighbour_Information_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_Neighbour_Information_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct Neighbour_Information_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_205(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_Neighbour_Information_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_Neighbour_Information_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct Neighbour_Information_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_205(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_209(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_209(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_209(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_213(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_213(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_213(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_217(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_217(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_217(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_221(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_221(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_221(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_225(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_225(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_225(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_229(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_229(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_229(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_233(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_233(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_233(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_237(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_RadioResourceStatus_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_RadioResourceStatus_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RadioResourceStatus_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_237(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_RadioResourceStatus_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_RadioResourceStatus_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RadioResourceStatus_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_237(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_241(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_RelativeNarrowbandTxPower_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RelativeNarrowbandTxPower_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_241(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_RelativeNarrowbandTxPower_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_RelativeNarrowbandTxPower_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RelativeNarrowbandTxPower_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_241(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_245(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_245(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_245(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_249(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_RSRPMRList_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_RSRPMRList_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RSRPMRList_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_249(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_RSRPMRList_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_RSRPMRList_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct RSRPMRList_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_249(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_253(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_253(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_253(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_257(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_257(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_257(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_261(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_ServedCell_Information_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_ServedCell_Information_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ServedCell_Information_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_261(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_ServedCell_Information_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_ServedCell_Information_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct ServedCell_Information_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_261(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_265(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_265(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_265(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_269(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_269(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_269(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_273(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_273(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_273(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_277(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_277(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_277(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_281(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_281(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_281(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_285(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static asn_type_selector_result_t
select_TDD_Info_ExtIEs_criticality_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_TDD_Info_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 1; /* &criticality */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct TDD_Info_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_criticality_constraint_285(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_type_selector_result_t
select_TDD_Info_ExtIEs_extensionValue_type(const asn_TYPE_descriptor_t *parent_type, const void *parent_sptr) {
	asn_type_selector_result_t result = {0, 0};
	const asn_ioc_set_t *itable = asn_IOS_TDD_Info_ExtIEs_1;
	size_t constraining_column = 0; /* &id */
	size_t for_column = 2; /* &Extension */
	size_t row, presence_index = 0;
	const long *constraining_value = (const long *)((const char *)parent_sptr + offsetof(struct TDD_Info_ExtIEs, id));
	
	for(row=0; row < itable->rows_count; row++) {
	    const asn_ioc_cell_t *constraining_cell = &itable->rows[row * itable->columns_count + constraining_column];
	    const asn_ioc_cell_t *type_cell = &itable->rows[row * itable->columns_count + for_column];
	
	    if(type_cell->cell_kind == aioc__undefined)
	        continue;
	
	    presence_index++;
	    if(constraining_cell->type_descriptor->op->compare_struct(constraining_cell->type_descriptor, constraining_value, constraining_cell->value_sptr) == 0) {
	        result.type_descriptor = type_cell->type_descriptor;
	        result.presence_index = presence_index;
	        break;
	    }
	}
	
	return result;
}

static int
memb_extensionValue_constraint_285(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_289(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_289(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_289(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_293(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_293(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_293(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_297(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_297(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_297(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_id_constraint_301(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	long value;
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	value = *(const long *)sptr;
	
	if((value >= 0 && value <= 65535)) {
		/* Constraint check succeeded */
		return 0;
	} else {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: constraint failed (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
}

static int
memb_criticality_constraint_301(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static int
memb_extensionValue_constraint_301(const asn_TYPE_descriptor_t *td, const void *sptr,
			asn_app_constraint_failed_f *ctfailcb, void *app_key) {
	
	if(!sptr) {
		ASN__CTFAIL(app_key, td, sptr,
			"%s: value not given (%s:%d)",
			td->name, __FILE__, __LINE__);
		return -1;
	}
	
	
	if(1 /* No applicable constraints whatsoever */) {
		/* Nothing is here. See below */
	}
	
	return td->encoding_constraints.general_constraints(td, sptr, ctfailcb, app_key);
}

static asn_per_constraints_t asn_PER_memb_id_constr_2 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_3 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_4 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_6 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_7 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_8 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_10 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_11 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_12 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_14 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_15 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_16 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_18 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_19 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_20 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_22 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_23 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_24 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_26 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_27 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_28 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_30 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_31 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_32 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_34 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_35 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_36 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_38 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_39 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_40 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_42 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_43 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_44 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_46 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_47 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_48 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_50 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_51 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_52 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_54 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_55 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_56 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_58 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_59 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_60 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_62 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_63 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_64 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_66 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_67 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_68 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_70 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_71 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_72 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_74 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_75 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_76 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_78 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_79 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_80 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_82 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_83 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_84 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_86 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_87 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_88 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_90 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_91 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_92 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_94 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_95 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_96 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_98 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_99 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_100 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_102 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_103 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_104 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_106 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_107 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_108 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_110 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_111 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_112 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_114 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_115 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_116 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_118 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_119 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_120 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_122 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_123 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_124 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_126 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_127 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_128 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_130 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_131 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_132 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_134 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_135 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_136 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_138 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_139 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_140 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_142 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_143 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_144 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_146 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_147 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_148 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_150 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_151 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_152 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_154 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_155 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_156 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_158 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_159 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_160 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_162 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_163 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_164 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_166 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_167 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_168 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_170 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_171 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_172 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_174 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_175 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_176 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_178 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_179 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_180 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_182 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_183 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_184 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_186 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_187 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_188 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_190 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_191 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_192 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_194 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_195 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_196 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_198 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_199 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_200 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_202 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_203 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_204 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_206 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_207 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_208 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_210 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_211 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_212 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_214 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_215 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_216 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_218 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_219 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_220 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_222 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_223 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_224 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_226 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_227 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_228 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_230 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_231 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_232 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_234 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_235 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_236 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_238 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_239 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_240 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_242 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_243 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_244 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_246 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_247 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_248 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_250 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_251 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_252 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_254 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_255 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_256 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_258 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_259 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_260 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_262 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_263 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_264 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_266 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_267 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_268 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_270 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_271 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_272 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_274 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_275 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_276 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_278 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_279 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_280 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_282 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_283 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_284 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_286 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_287 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_288 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_290 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_291 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_292 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_294 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_295 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_296 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_298 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_299 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_300 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_id_constr_302 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 16,  16,  0,  65535 }	/* (0..65535) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_criticality_constr_303 CC_NOTUSED = {
	{ APC_CONSTRAINED,	 2,  2,  0,  2 }	/* (0..2) */,
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_per_constraints_t asn_PER_memb_extensionValue_constr_304 CC_NOTUSED = {
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	{ APC_UNCONSTRAINED,	-1, -1,  0,  0 },
	0, 0	/* No PER value map */
};
static asn_TYPE_member_t asn_MBR_extensionValue_4[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.ABSInformation),
		-1 /* Ambiguous tag (CHOICE?) */,
		0,
		&asn_DEF_ABSInformation,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"ABSInformation"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.InvokeIndication),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_InvokeIndication,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"InvokeIndication"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.SubframeAssignment),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_SubframeAssignment,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"SubframeAssignment"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.ExtendedULInterferenceOverloadInfo),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_ExtendedULInterferenceOverloadInfo,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"ExtendedULInterferenceOverloadInfo"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.CoMPInformation),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_CoMPInformation,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"CoMPInformation"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs__extensionValue, choice.DynamicDLTransmissionInformation),
		-1 /* Ambiguous tag (CHOICE?) */,
		0,
		&asn_DEF_DynamicDLTransmissionInformation,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"DynamicDLTransmissionInformation"
		},
};
static const unsigned asn_MAP_extensionValue_to_canonical_4[] = { 1, 2, 3, 4, 0, 5 };
static const unsigned asn_MAP_extensionValue_from_canonical_4[] = { 4, 0, 1, 2, 3, 5 };
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_4[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 1 }, /* InvokeIndication */
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, -1, 0 }, /* SubframeAssignment */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, 0, 1 }, /* ExtendedULInterferenceOverloadInfo */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -1, 0 }, /* CoMPInformation */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 1 }, /* fdd */
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 5, -1, 0 }, /* naics-active */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 0, 0, 1 }, /* tdd */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 5, -1, 0 }, /* naics-inactive */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 0, 0, 0 } /* abs-inactive */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_4 = {
	sizeof(struct CellInformation_Item_ExtIEs__extensionValue),
	offsetof(struct CellInformation_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CellInformation_Item_ExtIEs__extensionValue, present),
	sizeof(((struct CellInformation_Item_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_4,
	9,	/* Count of tags in the map */
	asn_MAP_extensionValue_to_canonical_4,
	asn_MAP_extensionValue_from_canonical_4,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_4 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_4,
	6,	/* Elements count */
	&asn_SPC_extensionValue_specs_4	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CellInformation_Item_ExtIEs_1[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_2,  memb_id_constraint_1 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_CellInformation_Item_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_3,  memb_criticality_constraint_1 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellInformation_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_4,
		select_CellInformation_Item_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_4,  memb_extensionValue_constraint_1 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CellInformation_Item_ExtIEs_tags_1[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CellInformation_Item_ExtIEs_tag2el_1[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CellInformation_Item_ExtIEs_specs_1 = {
	sizeof(struct CellInformation_Item_ExtIEs),
	offsetof(struct CellInformation_Item_ExtIEs, _asn_ctx),
	asn_MAP_CellInformation_Item_ExtIEs_tag2el_1,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CellInformation_Item_ExtIEs = {
	"CellInformation-Item-ExtIEs",
	"CellInformation-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CellInformation_Item_ExtIEs_tags_1,
	sizeof(asn_DEF_CellInformation_Item_ExtIEs_tags_1)
		/sizeof(asn_DEF_CellInformation_Item_ExtIEs_tags_1[0]), /* 1 */
	asn_DEF_CellInformation_Item_ExtIEs_tags_1,	/* Same as above */
	sizeof(asn_DEF_CellInformation_Item_ExtIEs_tags_1)
		/sizeof(asn_DEF_CellInformation_Item_ExtIEs_tags_1[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CellInformation_Item_ExtIEs_1,
	3,	/* Elements count */
	&asn_SPC_CellInformation_Item_ExtIEs_specs_1	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_extensionValue_8[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item_ExtIEs__extensionValue, choice.DeactivationIndication),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_DeactivationIndication,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"DeactivationIndication"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_8[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 0 } /* DeactivationIndication */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_8 = {
	sizeof(struct ServedCellsToModify_Item_ExtIEs__extensionValue),
	offsetof(struct ServedCellsToModify_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ServedCellsToModify_Item_ExtIEs__extensionValue, present),
	sizeof(((struct ServedCellsToModify_Item_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_8,
	1,	/* Count of tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_8 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_8,
	1,	/* Elements count */
	&asn_SPC_extensionValue_specs_8	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ServedCellsToModify_Item_ExtIEs_5[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_6,  memb_id_constraint_5 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_ServedCellsToModify_Item_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_7,  memb_criticality_constraint_5 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedCellsToModify_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_8,
		select_ServedCellsToModify_Item_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_8,  memb_extensionValue_constraint_5 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ServedCellsToModify_Item_ExtIEs_tag2el_5[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ServedCellsToModify_Item_ExtIEs_specs_5 = {
	sizeof(struct ServedCellsToModify_Item_ExtIEs),
	offsetof(struct ServedCellsToModify_Item_ExtIEs, _asn_ctx),
	asn_MAP_ServedCellsToModify_Item_ExtIEs_tag2el_5,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ServedCellsToModify_Item_ExtIEs = {
	"ServedCellsToModify-Item-ExtIEs",
	"ServedCellsToModify-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5,
	sizeof(asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5)
		/sizeof(asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5[0]), /* 1 */
	asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5,	/* Same as above */
	sizeof(asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5)
		/sizeof(asn_DEF_ServedCellsToModify_Item_ExtIEs_tags_5[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ServedCellsToModify_Item_ExtIEs_5,
	3,	/* Elements count */
	&asn_SPC_ServedCellsToModify_Item_ExtIEs_specs_5	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_12 = {
	sizeof(struct CellToReport_Item_ExtIEs__extensionValue),
	offsetof(struct CellToReport_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CellToReport_Item_ExtIEs__extensionValue, present),
	sizeof(((struct CellToReport_Item_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_12 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_12	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CellToReport_Item_ExtIEs_9[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CellToReport_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_10,  memb_id_constraint_9 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellToReport_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_11,  memb_criticality_constraint_9 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellToReport_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_12,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_12,  memb_extensionValue_constraint_9 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CellToReport_Item_ExtIEs_tags_9[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CellToReport_Item_ExtIEs_tag2el_9[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CellToReport_Item_ExtIEs_specs_9 = {
	sizeof(struct CellToReport_Item_ExtIEs),
	offsetof(struct CellToReport_Item_ExtIEs, _asn_ctx),
	asn_MAP_CellToReport_Item_ExtIEs_tag2el_9,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CellToReport_Item_ExtIEs = {
	"CellToReport-Item-ExtIEs",
	"CellToReport-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CellToReport_Item_ExtIEs_tags_9,
	sizeof(asn_DEF_CellToReport_Item_ExtIEs_tags_9)
		/sizeof(asn_DEF_CellToReport_Item_ExtIEs_tags_9[0]), /* 1 */
	asn_DEF_CellToReport_Item_ExtIEs_tags_9,	/* Same as above */
	sizeof(asn_DEF_CellToReport_Item_ExtIEs_tags_9)
		/sizeof(asn_DEF_CellToReport_Item_ExtIEs_tags_9[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CellToReport_Item_ExtIEs_9,
	3,	/* Elements count */
	&asn_SPC_CellToReport_Item_ExtIEs_specs_9	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_16 = {
	sizeof(struct MeasurementInitiationResult_Item_ExtIEs__extensionValue),
	offsetof(struct MeasurementInitiationResult_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct MeasurementInitiationResult_Item_ExtIEs__extensionValue, present),
	sizeof(((struct MeasurementInitiationResult_Item_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_16 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_16	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_MeasurementInitiationResult_Item_ExtIEs_13[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_14,  memb_id_constraint_13 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_15,  memb_criticality_constraint_13 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct MeasurementInitiationResult_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_16,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_16,  memb_extensionValue_constraint_13 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_MeasurementInitiationResult_Item_ExtIEs_tag2el_13[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_MeasurementInitiationResult_Item_ExtIEs_specs_13 = {
	sizeof(struct MeasurementInitiationResult_Item_ExtIEs),
	offsetof(struct MeasurementInitiationResult_Item_ExtIEs, _asn_ctx),
	asn_MAP_MeasurementInitiationResult_Item_ExtIEs_tag2el_13,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_MeasurementInitiationResult_Item_ExtIEs = {
	"MeasurementInitiationResult-Item-ExtIEs",
	"MeasurementInitiationResult-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13,
	sizeof(asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13)
		/sizeof(asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13[0]), /* 1 */
	asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13,	/* Same as above */
	sizeof(asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13)
		/sizeof(asn_DEF_MeasurementInitiationResult_Item_ExtIEs_tags_13[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_MeasurementInitiationResult_Item_ExtIEs_13,
	3,	/* Elements count */
	&asn_SPC_MeasurementInitiationResult_Item_ExtIEs_specs_13	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_20 = {
	sizeof(struct MeasurementFailureCause_Item_ExtIEs__extensionValue),
	offsetof(struct MeasurementFailureCause_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct MeasurementFailureCause_Item_ExtIEs__extensionValue, present),
	sizeof(((struct MeasurementFailureCause_Item_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_20 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_20	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_MeasurementFailureCause_Item_ExtIEs_17[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_18,  memb_id_constraint_17 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_19,  memb_criticality_constraint_17 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct MeasurementFailureCause_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_20,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_20,  memb_extensionValue_constraint_17 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_MeasurementFailureCause_Item_ExtIEs_tag2el_17[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_MeasurementFailureCause_Item_ExtIEs_specs_17 = {
	sizeof(struct MeasurementFailureCause_Item_ExtIEs),
	offsetof(struct MeasurementFailureCause_Item_ExtIEs, _asn_ctx),
	asn_MAP_MeasurementFailureCause_Item_ExtIEs_tag2el_17,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_MeasurementFailureCause_Item_ExtIEs = {
	"MeasurementFailureCause-Item-ExtIEs",
	"MeasurementFailureCause-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17,
	sizeof(asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17)
		/sizeof(asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17[0]), /* 1 */
	asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17,	/* Same as above */
	sizeof(asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17)
		/sizeof(asn_DEF_MeasurementFailureCause_Item_ExtIEs_tags_17[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_MeasurementFailureCause_Item_ExtIEs_17,
	3,	/* Elements count */
	&asn_SPC_MeasurementFailureCause_Item_ExtIEs_specs_17	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_24 = {
	sizeof(struct CompleteFailureCauseInformation_Item_ExtIEs__extensionValue),
	offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs__extensionValue, present),
	sizeof(((struct CompleteFailureCauseInformation_Item_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_24 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_24	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CompleteFailureCauseInformation_Item_ExtIEs_21[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_22,  memb_id_constraint_21 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_23,  memb_criticality_constraint_21 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_24,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_24,  memb_extensionValue_constraint_21 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CompleteFailureCauseInformation_Item_ExtIEs_tag2el_21[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CompleteFailureCauseInformation_Item_ExtIEs_specs_21 = {
	sizeof(struct CompleteFailureCauseInformation_Item_ExtIEs),
	offsetof(struct CompleteFailureCauseInformation_Item_ExtIEs, _asn_ctx),
	asn_MAP_CompleteFailureCauseInformation_Item_ExtIEs_tag2el_21,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs = {
	"CompleteFailureCauseInformation-Item-ExtIEs",
	"CompleteFailureCauseInformation-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21,
	sizeof(asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21)
		/sizeof(asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21[0]), /* 1 */
	asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21,	/* Same as above */
	sizeof(asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21)
		/sizeof(asn_DEF_CompleteFailureCauseInformation_Item_ExtIEs_tags_21[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CompleteFailureCauseInformation_Item_ExtIEs_21,
	3,	/* Elements count */
	&asn_SPC_CompleteFailureCauseInformation_Item_ExtIEs_specs_21	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_extensionValue_28[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.CompositeAvailableCapacityGroup),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_CompositeAvailableCapacityGroup,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"CompositeAvailableCapacityGroup"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.ABS_Status),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_ABS_Status,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"ABS-Status"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.RSRPMRList),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_RSRPMRList,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"RSRPMRList"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.CSIReportList),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_CSIReportList,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"CSIReportList"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, choice.CellReportingIndicator),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_CellReportingIndicator,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"CellReportingIndicator"
		},
};
static const unsigned asn_MAP_extensionValue_to_canonical_28[] = { 4, 0, 1, 2, 3 };
static const unsigned asn_MAP_extensionValue_from_canonical_28[] = { 1, 2, 3, 4, 0 };
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_28[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 4, 0, 0 }, /* CellReportingIndicator */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 3 }, /* CompositeAvailableCapacityGroup */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, -1, 2 }, /* ABS-Status */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -2, 1 }, /* RSRPMRList */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 3, -3, 0 } /* CSIReportList */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_28 = {
	sizeof(struct CellMeasurementResult_Item_ExtIEs__extensionValue),
	offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CellMeasurementResult_Item_ExtIEs__extensionValue, present),
	sizeof(((struct CellMeasurementResult_Item_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_28,
	5,	/* Count of tags in the map */
	asn_MAP_extensionValue_to_canonical_28,
	asn_MAP_extensionValue_from_canonical_28,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_28 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_28,
	5,	/* Elements count */
	&asn_SPC_extensionValue_specs_28	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CellMeasurementResult_Item_ExtIEs_25[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_26,  memb_id_constraint_25 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_CellMeasurementResult_Item_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_27,  memb_criticality_constraint_25 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellMeasurementResult_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_28,
		select_CellMeasurementResult_Item_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_28,  memb_extensionValue_constraint_25 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CellMeasurementResult_Item_ExtIEs_tag2el_25[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CellMeasurementResult_Item_ExtIEs_specs_25 = {
	sizeof(struct CellMeasurementResult_Item_ExtIEs),
	offsetof(struct CellMeasurementResult_Item_ExtIEs, _asn_ctx),
	asn_MAP_CellMeasurementResult_Item_ExtIEs_tag2el_25,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CellMeasurementResult_Item_ExtIEs = {
	"CellMeasurementResult-Item-ExtIEs",
	"CellMeasurementResult-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25,
	sizeof(asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25)
		/sizeof(asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25[0]), /* 1 */
	asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25,	/* Same as above */
	sizeof(asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25)
		/sizeof(asn_DEF_CellMeasurementResult_Item_ExtIEs_tags_25[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CellMeasurementResult_Item_ExtIEs_25,
	3,	/* Elements count */
	&asn_SPC_CellMeasurementResult_Item_ExtIEs_specs_25	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_32 = {
	sizeof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue),
	offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue, present),
	sizeof(((struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_32 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_32	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_29[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_30,  memb_id_constraint_29 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_31,  memb_criticality_constraint_29 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_32,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_32,  memb_extensionValue_constraint_29 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tag2el_29[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_specs_29 = {
	sizeof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs),
	offsetof(struct ResponseInformationSeNBReconfComp_SuccessItemExtIEs, _asn_ctx),
	asn_MAP_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tag2el_29,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs = {
	"ResponseInformationSeNBReconfComp-SuccessItemExtIEs",
	"ResponseInformationSeNBReconfComp-SuccessItemExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29,
	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29)
		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29[0]), /* 1 */
	asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29,	/* Same as above */
	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29)
		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_tags_29[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_29,
	3,	/* Elements count */
	&asn_SPC_ResponseInformationSeNBReconfComp_SuccessItemExtIEs_specs_29	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_36 = {
	sizeof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue),
	offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue, present),
	sizeof(((struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_36 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_36	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_33[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_34,  memb_id_constraint_33 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_35,  memb_criticality_constraint_33 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_36,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_36,  memb_extensionValue_constraint_33 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tag2el_33[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_specs_33 = {
	sizeof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs),
	offsetof(struct ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs, _asn_ctx),
	asn_MAP_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tag2el_33,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs = {
	"ResponseInformationSeNBReconfComp-RejectByMeNBItemExtIEs",
	"ResponseInformationSeNBReconfComp-RejectByMeNBItemExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33,
	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33)
		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33[0]), /* 1 */
	asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33,	/* Same as above */
	sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33)
		/sizeof(asn_DEF_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_tags_33[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_33,
	3,	/* Elements count */
	&asn_SPC_ResponseInformationSeNBReconfComp_RejectByMeNBItemExtIEs_specs_33	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_40 = {
	sizeof(struct ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue),
	offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue, present),
	sizeof(((struct ServedEUTRAcellsENDCX2Management_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_40 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_40	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ServedEUTRAcellsENDCX2Management_ExtIEs_37[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_38,  memb_id_constraint_37 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_39,  memb_criticality_constraint_37 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_40,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_40,  memb_extensionValue_constraint_37 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ServedEUTRAcellsENDCX2Management_ExtIEs_tag2el_37[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ServedEUTRAcellsENDCX2Management_ExtIEs_specs_37 = {
	sizeof(struct ServedEUTRAcellsENDCX2Management_ExtIEs),
	offsetof(struct ServedEUTRAcellsENDCX2Management_ExtIEs, _asn_ctx),
	asn_MAP_ServedEUTRAcellsENDCX2Management_ExtIEs_tag2el_37,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs = {
	"ServedEUTRAcellsENDCX2Management-ExtIEs",
	"ServedEUTRAcellsENDCX2Management-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37,
	sizeof(asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37)
		/sizeof(asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37[0]), /* 1 */
	asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37,	/* Same as above */
	sizeof(asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37)
		/sizeof(asn_DEF_ServedEUTRAcellsENDCX2Management_ExtIEs_tags_37[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ServedEUTRAcellsENDCX2Management_ExtIEs_37,
	3,	/* Elements count */
	&asn_SPC_ServedEUTRAcellsENDCX2Management_ExtIEs_specs_37	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_44 = {
	sizeof(struct En_gNBServedCells_ExtIEs__extensionValue),
	offsetof(struct En_gNBServedCells_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct En_gNBServedCells_ExtIEs__extensionValue, present),
	sizeof(((struct En_gNBServedCells_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_44 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_44	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_En_gNBServedCells_ExtIEs_41[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct En_gNBServedCells_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_42,  memb_id_constraint_41 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct En_gNBServedCells_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_43,  memb_criticality_constraint_41 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct En_gNBServedCells_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_44,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_44,  memb_extensionValue_constraint_41 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_En_gNBServedCells_ExtIEs_tags_41[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_En_gNBServedCells_ExtIEs_tag2el_41[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_En_gNBServedCells_ExtIEs_specs_41 = {
	sizeof(struct En_gNBServedCells_ExtIEs),
	offsetof(struct En_gNBServedCells_ExtIEs, _asn_ctx),
	asn_MAP_En_gNBServedCells_ExtIEs_tag2el_41,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_En_gNBServedCells_ExtIEs = {
	"En-gNBServedCells-ExtIEs",
	"En-gNBServedCells-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_En_gNBServedCells_ExtIEs_tags_41,
	sizeof(asn_DEF_En_gNBServedCells_ExtIEs_tags_41)
		/sizeof(asn_DEF_En_gNBServedCells_ExtIEs_tags_41[0]), /* 1 */
	asn_DEF_En_gNBServedCells_ExtIEs_tags_41,	/* Same as above */
	sizeof(asn_DEF_En_gNBServedCells_ExtIEs_tags_41)
		/sizeof(asn_DEF_En_gNBServedCells_ExtIEs_tags_41[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_En_gNBServedCells_ExtIEs_41,
	3,	/* Elements count */
	&asn_SPC_En_gNBServedCells_ExtIEs_specs_41	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_48 = {
	sizeof(struct ServedNRCell_Information_ExtIEs__extensionValue),
	offsetof(struct ServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ServedNRCell_Information_ExtIEs__extensionValue, present),
	sizeof(((struct ServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_48 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_48	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ServedNRCell_Information_ExtIEs_45[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_46,  memb_id_constraint_45 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_47,  memb_criticality_constraint_45 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedNRCell_Information_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_48,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_48,  memb_extensionValue_constraint_45 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ServedNRCell_Information_ExtIEs_tags_45[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ServedNRCell_Information_ExtIEs_tag2el_45[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ServedNRCell_Information_ExtIEs_specs_45 = {
	sizeof(struct ServedNRCell_Information_ExtIEs),
	offsetof(struct ServedNRCell_Information_ExtIEs, _asn_ctx),
	asn_MAP_ServedNRCell_Information_ExtIEs_tag2el_45,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ServedNRCell_Information_ExtIEs = {
	"ServedNRCell-Information-ExtIEs",
	"ServedNRCell-Information-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ServedNRCell_Information_ExtIEs_tags_45,
	sizeof(asn_DEF_ServedNRCell_Information_ExtIEs_tags_45)
		/sizeof(asn_DEF_ServedNRCell_Information_ExtIEs_tags_45[0]), /* 1 */
	asn_DEF_ServedNRCell_Information_ExtIEs_tags_45,	/* Same as above */
	sizeof(asn_DEF_ServedNRCell_Information_ExtIEs_tags_45)
		/sizeof(asn_DEF_ServedNRCell_Information_ExtIEs_tags_45[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ServedNRCell_Information_ExtIEs_45,
	3,	/* Elements count */
	&asn_SPC_ServedNRCell_Information_ExtIEs_specs_45	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_52 = {
	sizeof(struct FDD_InfoServedNRCell_Information_ExtIEs__extensionValue),
	offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs__extensionValue, present),
	sizeof(((struct FDD_InfoServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_52 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_52	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_FDD_InfoServedNRCell_Information_ExtIEs_49[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_50,  memb_id_constraint_49 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_51,  memb_criticality_constraint_49 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_52,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_52,  memb_extensionValue_constraint_49 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_FDD_InfoServedNRCell_Information_ExtIEs_tag2el_49[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoServedNRCell_Information_ExtIEs_specs_49 = {
	sizeof(struct FDD_InfoServedNRCell_Information_ExtIEs),
	offsetof(struct FDD_InfoServedNRCell_Information_ExtIEs, _asn_ctx),
	asn_MAP_FDD_InfoServedNRCell_Information_ExtIEs_tag2el_49,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs = {
	"FDD-InfoServedNRCell-Information-ExtIEs",
	"FDD-InfoServedNRCell-Information-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49,
	sizeof(asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49)
		/sizeof(asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49[0]), /* 1 */
	asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49,	/* Same as above */
	sizeof(asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49)
		/sizeof(asn_DEF_FDD_InfoServedNRCell_Information_ExtIEs_tags_49[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_FDD_InfoServedNRCell_Information_ExtIEs_49,
	3,	/* Elements count */
	&asn_SPC_FDD_InfoServedNRCell_Information_ExtIEs_specs_49	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_56 = {
	sizeof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue),
	offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue, present),
	sizeof(((struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_56 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_56	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_53[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_54,  memb_id_constraint_53 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_55,  memb_criticality_constraint_53 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_56,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_56,  memb_extensionValue_constraint_53 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tag2el_53[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_53 = {
	sizeof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs),
	offsetof(struct FDD_InfoNeighbourServedNRCell_Information_ExtIEs, _asn_ctx),
	asn_MAP_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tag2el_53,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs = {
	"FDD-InfoNeighbourServedNRCell-Information-ExtIEs",
	"FDD-InfoNeighbourServedNRCell-Information-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53,
	sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53)
		/sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53[0]), /* 1 */
	asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53,	/* Same as above */
	sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53)
		/sizeof(asn_DEF_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_53[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_53,
	3,	/* Elements count */
	&asn_SPC_FDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_53	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_60 = {
	sizeof(struct TDD_InfoServedNRCell_Information_ExtIEs__extensionValue),
	offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs__extensionValue, present),
	sizeof(((struct TDD_InfoServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_60 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_60	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_TDD_InfoServedNRCell_Information_ExtIEs_57[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_58,  memb_id_constraint_57 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_59,  memb_criticality_constraint_57 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_60,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_60,  memb_extensionValue_constraint_57 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_TDD_InfoServedNRCell_Information_ExtIEs_tag2el_57[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoServedNRCell_Information_ExtIEs_specs_57 = {
	sizeof(struct TDD_InfoServedNRCell_Information_ExtIEs),
	offsetof(struct TDD_InfoServedNRCell_Information_ExtIEs, _asn_ctx),
	asn_MAP_TDD_InfoServedNRCell_Information_ExtIEs_tag2el_57,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs = {
	"TDD-InfoServedNRCell-Information-ExtIEs",
	"TDD-InfoServedNRCell-Information-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57,
	sizeof(asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57)
		/sizeof(asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57[0]), /* 1 */
	asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57,	/* Same as above */
	sizeof(asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57)
		/sizeof(asn_DEF_TDD_InfoServedNRCell_Information_ExtIEs_tags_57[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_TDD_InfoServedNRCell_Information_ExtIEs_57,
	3,	/* Elements count */
	&asn_SPC_TDD_InfoServedNRCell_Information_ExtIEs_specs_57	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_64 = {
	sizeof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue),
	offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue, present),
	sizeof(((struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_64 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_64	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_61[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_62,  memb_id_constraint_61 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_63,  memb_criticality_constraint_61 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_64,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_64,  memb_extensionValue_constraint_61 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tag2el_61[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_61 = {
	sizeof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs),
	offsetof(struct TDD_InfoNeighbourServedNRCell_Information_ExtIEs, _asn_ctx),
	asn_MAP_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tag2el_61,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs = {
	"TDD-InfoNeighbourServedNRCell-Information-ExtIEs",
	"TDD-InfoNeighbourServedNRCell-Information-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61,
	sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61)
		/sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61[0]), /* 1 */
	asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61,	/* Same as above */
	sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61)
		/sizeof(asn_DEF_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_tags_61[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_61,
	3,	/* Elements count */
	&asn_SPC_TDD_InfoNeighbourServedNRCell_Information_ExtIEs_specs_61	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_68 = {
	sizeof(struct NRNeighbour_Information_ExtIEs__extensionValue),
	offsetof(struct NRNeighbour_Information_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct NRNeighbour_Information_ExtIEs__extensionValue, present),
	sizeof(((struct NRNeighbour_Information_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_68 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_68	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_NRNeighbour_Information_ExtIEs_65[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_66,  memb_id_constraint_65 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_67,  memb_criticality_constraint_65 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct NRNeighbour_Information_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_68,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_68,  memb_extensionValue_constraint_65 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_NRNeighbour_Information_ExtIEs_tags_65[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_NRNeighbour_Information_ExtIEs_tag2el_65[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_NRNeighbour_Information_ExtIEs_specs_65 = {
	sizeof(struct NRNeighbour_Information_ExtIEs),
	offsetof(struct NRNeighbour_Information_ExtIEs, _asn_ctx),
	asn_MAP_NRNeighbour_Information_ExtIEs_tag2el_65,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_NRNeighbour_Information_ExtIEs = {
	"NRNeighbour-Information-ExtIEs",
	"NRNeighbour-Information-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_NRNeighbour_Information_ExtIEs_tags_65,
	sizeof(asn_DEF_NRNeighbour_Information_ExtIEs_tags_65)
		/sizeof(asn_DEF_NRNeighbour_Information_ExtIEs_tags_65[0]), /* 1 */
	asn_DEF_NRNeighbour_Information_ExtIEs_tags_65,	/* Same as above */
	sizeof(asn_DEF_NRNeighbour_Information_ExtIEs_tags_65)
		/sizeof(asn_DEF_NRNeighbour_Information_ExtIEs_tags_65[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_NRNeighbour_Information_ExtIEs_65,
	3,	/* Elements count */
	&asn_SPC_NRNeighbour_Information_ExtIEs_specs_65	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_72 = {
	sizeof(struct Limited_list_ExtIEs__extensionValue),
	offsetof(struct Limited_list_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct Limited_list_ExtIEs__extensionValue, present),
	sizeof(((struct Limited_list_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_72 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_72	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_Limited_list_ExtIEs_69[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Limited_list_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_70,  memb_id_constraint_69 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Limited_list_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_71,  memb_criticality_constraint_69 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct Limited_list_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_72,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_72,  memb_extensionValue_constraint_69 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_Limited_list_ExtIEs_tags_69[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Limited_list_ExtIEs_tag2el_69[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_Limited_list_ExtIEs_specs_69 = {
	sizeof(struct Limited_list_ExtIEs),
	offsetof(struct Limited_list_ExtIEs, _asn_ctx),
	asn_MAP_Limited_list_ExtIEs_tag2el_69,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_Limited_list_ExtIEs = {
	"Limited-list-ExtIEs",
	"Limited-list-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_Limited_list_ExtIEs_tags_69,
	sizeof(asn_DEF_Limited_list_ExtIEs_tags_69)
		/sizeof(asn_DEF_Limited_list_ExtIEs_tags_69[0]), /* 1 */
	asn_DEF_Limited_list_ExtIEs_tags_69,	/* Same as above */
	sizeof(asn_DEF_Limited_list_ExtIEs_tags_69)
		/sizeof(asn_DEF_Limited_list_ExtIEs_tags_69[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Limited_list_ExtIEs_69,
	3,	/* Elements count */
	&asn_SPC_Limited_list_ExtIEs_specs_69	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_76 = {
	sizeof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue),
	offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue, present),
	sizeof(((struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_76 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_76	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_73[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_74,  memb_id_constraint_73 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_75,  memb_criticality_constraint_73 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_76,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_76,  memb_extensionValue_constraint_73 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tag2el_73[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_specs_73 = {
	sizeof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs),
	offsetof(struct ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs, _asn_ctx),
	asn_MAP_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tag2el_73,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs = {
	"ServedEUTRAcellsToModifyListENDCConfUpd-ExtIEs",
	"ServedEUTRAcellsToModifyListENDCConfUpd-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73,
	sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73)
		/sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73[0]), /* 1 */
	asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73,	/* Same as above */
	sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73)
		/sizeof(asn_DEF_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_tags_73[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_73,
	3,	/* Elements count */
	&asn_SPC_ServedEUTRAcellsToModifyListENDCConfUpd_ExtIEs_specs_73	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_80 = {
	sizeof(struct ServedNRCellsToModify_Item_ExtIEs__extensionValue),
	offsetof(struct ServedNRCellsToModify_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ServedNRCellsToModify_Item_ExtIEs__extensionValue, present),
	sizeof(((struct ServedNRCellsToModify_Item_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_80 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_80	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ServedNRCellsToModify_Item_ExtIEs_77[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCellsToModify_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_78,  memb_id_constraint_77 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedNRCellsToModify_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_79,  memb_criticality_constraint_77 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedNRCellsToModify_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_80,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_80,  memb_extensionValue_constraint_77 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ServedNRCellsToModify_Item_ExtIEs_tag2el_77[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ServedNRCellsToModify_Item_ExtIEs_specs_77 = {
	sizeof(struct ServedNRCellsToModify_Item_ExtIEs),
	offsetof(struct ServedNRCellsToModify_Item_ExtIEs, _asn_ctx),
	asn_MAP_ServedNRCellsToModify_Item_ExtIEs_tag2el_77,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ServedNRCellsToModify_Item_ExtIEs = {
	"ServedNRCellsToModify-Item-ExtIEs",
	"ServedNRCellsToModify-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77,
	sizeof(asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77)
		/sizeof(asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77[0]), /* 1 */
	asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77,	/* Same as above */
	sizeof(asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77)
		/sizeof(asn_DEF_ServedNRCellsToModify_Item_ExtIEs_tags_77[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ServedNRCellsToModify_Item_ExtIEs_77,
	3,	/* Elements count */
	&asn_SPC_ServedNRCellsToModify_Item_ExtIEs_specs_77	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_84 = {
	sizeof(struct ABSInformationFDD_ExtIEs__extensionValue),
	offsetof(struct ABSInformationFDD_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ABSInformationFDD_ExtIEs__extensionValue, present),
	sizeof(((struct ABSInformationFDD_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_84 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_84	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ABSInformationFDD_ExtIEs_81[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationFDD_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_82,  memb_id_constraint_81 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationFDD_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_83,  memb_criticality_constraint_81 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ABSInformationFDD_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_84,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_84,  memb_extensionValue_constraint_81 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ABSInformationFDD_ExtIEs_tags_81[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ABSInformationFDD_ExtIEs_tag2el_81[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ABSInformationFDD_ExtIEs_specs_81 = {
	sizeof(struct ABSInformationFDD_ExtIEs),
	offsetof(struct ABSInformationFDD_ExtIEs, _asn_ctx),
	asn_MAP_ABSInformationFDD_ExtIEs_tag2el_81,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ABSInformationFDD_ExtIEs = {
	"ABSInformationFDD-ExtIEs",
	"ABSInformationFDD-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ABSInformationFDD_ExtIEs_tags_81,
	sizeof(asn_DEF_ABSInformationFDD_ExtIEs_tags_81)
		/sizeof(asn_DEF_ABSInformationFDD_ExtIEs_tags_81[0]), /* 1 */
	asn_DEF_ABSInformationFDD_ExtIEs_tags_81,	/* Same as above */
	sizeof(asn_DEF_ABSInformationFDD_ExtIEs_tags_81)
		/sizeof(asn_DEF_ABSInformationFDD_ExtIEs_tags_81[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ABSInformationFDD_ExtIEs_81,
	3,	/* Elements count */
	&asn_SPC_ABSInformationFDD_ExtIEs_specs_81	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_88 = {
	sizeof(struct ABSInformationTDD_ExtIEs__extensionValue),
	offsetof(struct ABSInformationTDD_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ABSInformationTDD_ExtIEs__extensionValue, present),
	sizeof(((struct ABSInformationTDD_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_88 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_88	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ABSInformationTDD_ExtIEs_85[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationTDD_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_86,  memb_id_constraint_85 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ABSInformationTDD_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_87,  memb_criticality_constraint_85 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ABSInformationTDD_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_88,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_88,  memb_extensionValue_constraint_85 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ABSInformationTDD_ExtIEs_tags_85[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ABSInformationTDD_ExtIEs_tag2el_85[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ABSInformationTDD_ExtIEs_specs_85 = {
	sizeof(struct ABSInformationTDD_ExtIEs),
	offsetof(struct ABSInformationTDD_ExtIEs, _asn_ctx),
	asn_MAP_ABSInformationTDD_ExtIEs_tag2el_85,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ABSInformationTDD_ExtIEs = {
	"ABSInformationTDD-ExtIEs",
	"ABSInformationTDD-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ABSInformationTDD_ExtIEs_tags_85,
	sizeof(asn_DEF_ABSInformationTDD_ExtIEs_tags_85)
		/sizeof(asn_DEF_ABSInformationTDD_ExtIEs_tags_85[0]), /* 1 */
	asn_DEF_ABSInformationTDD_ExtIEs_tags_85,	/* Same as above */
	sizeof(asn_DEF_ABSInformationTDD_ExtIEs_tags_85)
		/sizeof(asn_DEF_ABSInformationTDD_ExtIEs_tags_85[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ABSInformationTDD_ExtIEs_85,
	3,	/* Elements count */
	&asn_SPC_ABSInformationTDD_ExtIEs_specs_85	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_92 = {
	sizeof(struct ABS_Status_ExtIEs__extensionValue),
	offsetof(struct ABS_Status_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ABS_Status_ExtIEs__extensionValue, present),
	sizeof(((struct ABS_Status_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_92 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_92	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ABS_Status_ExtIEs_89[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ABS_Status_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_90,  memb_id_constraint_89 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ABS_Status_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_91,  memb_criticality_constraint_89 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ABS_Status_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_92,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_92,  memb_extensionValue_constraint_89 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ABS_Status_ExtIEs_tags_89[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ABS_Status_ExtIEs_tag2el_89[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ABS_Status_ExtIEs_specs_89 = {
	sizeof(struct ABS_Status_ExtIEs),
	offsetof(struct ABS_Status_ExtIEs, _asn_ctx),
	asn_MAP_ABS_Status_ExtIEs_tag2el_89,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ABS_Status_ExtIEs = {
	"ABS-Status-ExtIEs",
	"ABS-Status-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ABS_Status_ExtIEs_tags_89,
	sizeof(asn_DEF_ABS_Status_ExtIEs_tags_89)
		/sizeof(asn_DEF_ABS_Status_ExtIEs_tags_89[0]), /* 1 */
	asn_DEF_ABS_Status_ExtIEs_tags_89,	/* Same as above */
	sizeof(asn_DEF_ABS_Status_ExtIEs_tags_89)
		/sizeof(asn_DEF_ABS_Status_ExtIEs_tags_89[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ABS_Status_ExtIEs_89,
	3,	/* Elements count */
	&asn_SPC_ABS_Status_ExtIEs_specs_89	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_96 = {
	sizeof(struct AdditionalSpecialSubframe_Info_ExtIEs__extensionValue),
	offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs__extensionValue, present),
	sizeof(((struct AdditionalSpecialSubframe_Info_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_96 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_96	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_AdditionalSpecialSubframe_Info_ExtIEs_93[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_94,  memb_id_constraint_93 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_95,  memb_criticality_constraint_93 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_96,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_96,  memb_extensionValue_constraint_93 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_AdditionalSpecialSubframe_Info_ExtIEs_tag2el_93[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_AdditionalSpecialSubframe_Info_ExtIEs_specs_93 = {
	sizeof(struct AdditionalSpecialSubframe_Info_ExtIEs),
	offsetof(struct AdditionalSpecialSubframe_Info_ExtIEs, _asn_ctx),
	asn_MAP_AdditionalSpecialSubframe_Info_ExtIEs_tag2el_93,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs = {
	"AdditionalSpecialSubframe-Info-ExtIEs",
	"AdditionalSpecialSubframe-Info-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93,
	sizeof(asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93)
		/sizeof(asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93[0]), /* 1 */
	asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93,	/* Same as above */
	sizeof(asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93)
		/sizeof(asn_DEF_AdditionalSpecialSubframe_Info_ExtIEs_tags_93[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_AdditionalSpecialSubframe_Info_ExtIEs_93,
	3,	/* Elements count */
	&asn_SPC_AdditionalSpecialSubframe_Info_ExtIEs_specs_93	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_100 = {
	sizeof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue),
	offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue, present),
	sizeof(((struct AdditionalSpecialSubframeExtension_Info_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_100 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_100	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_AdditionalSpecialSubframeExtension_Info_ExtIEs_97[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_98,  memb_id_constraint_97 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_99,  memb_criticality_constraint_97 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_100,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_100,  memb_extensionValue_constraint_97 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_AdditionalSpecialSubframeExtension_Info_ExtIEs_tag2el_97[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_AdditionalSpecialSubframeExtension_Info_ExtIEs_specs_97 = {
	sizeof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs),
	offsetof(struct AdditionalSpecialSubframeExtension_Info_ExtIEs, _asn_ctx),
	asn_MAP_AdditionalSpecialSubframeExtension_Info_ExtIEs_tag2el_97,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs = {
	"AdditionalSpecialSubframeExtension-Info-ExtIEs",
	"AdditionalSpecialSubframeExtension-Info-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97,
	sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97)
		/sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97[0]), /* 1 */
	asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97,	/* Same as above */
	sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97)
		/sizeof(asn_DEF_AdditionalSpecialSubframeExtension_Info_ExtIEs_tags_97[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_AdditionalSpecialSubframeExtension_Info_ExtIEs_97,
	3,	/* Elements count */
	&asn_SPC_AdditionalSpecialSubframeExtension_Info_ExtIEs_specs_97	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_104 = {
	sizeof(struct CellBasedQMC_ExtIEs__extensionValue),
	offsetof(struct CellBasedQMC_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CellBasedQMC_ExtIEs__extensionValue, present),
	sizeof(((struct CellBasedQMC_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_104 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_104	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CellBasedQMC_ExtIEs_101[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CellBasedQMC_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_102,  memb_id_constraint_101 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellBasedQMC_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_103,  memb_criticality_constraint_101 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellBasedQMC_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_104,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_104,  memb_extensionValue_constraint_101 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CellBasedQMC_ExtIEs_tags_101[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CellBasedQMC_ExtIEs_tag2el_101[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CellBasedQMC_ExtIEs_specs_101 = {
	sizeof(struct CellBasedQMC_ExtIEs),
	offsetof(struct CellBasedQMC_ExtIEs, _asn_ctx),
	asn_MAP_CellBasedQMC_ExtIEs_tag2el_101,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CellBasedQMC_ExtIEs = {
	"CellBasedQMC-ExtIEs",
	"CellBasedQMC-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CellBasedQMC_ExtIEs_tags_101,
	sizeof(asn_DEF_CellBasedQMC_ExtIEs_tags_101)
		/sizeof(asn_DEF_CellBasedQMC_ExtIEs_tags_101[0]), /* 1 */
	asn_DEF_CellBasedQMC_ExtIEs_tags_101,	/* Same as above */
	sizeof(asn_DEF_CellBasedQMC_ExtIEs_tags_101)
		/sizeof(asn_DEF_CellBasedQMC_ExtIEs_tags_101[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CellBasedQMC_ExtIEs_101,
	3,	/* Elements count */
	&asn_SPC_CellBasedQMC_ExtIEs_specs_101	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_108 = {
	sizeof(struct CellReplacingInfo_ExtIEs__extensionValue),
	offsetof(struct CellReplacingInfo_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CellReplacingInfo_ExtIEs__extensionValue, present),
	sizeof(((struct CellReplacingInfo_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_108 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_108	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CellReplacingInfo_ExtIEs_105[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CellReplacingInfo_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_106,  memb_id_constraint_105 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CellReplacingInfo_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_107,  memb_criticality_constraint_105 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CellReplacingInfo_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_108,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_108,  memb_extensionValue_constraint_105 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CellReplacingInfo_ExtIEs_tags_105[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CellReplacingInfo_ExtIEs_tag2el_105[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CellReplacingInfo_ExtIEs_specs_105 = {
	sizeof(struct CellReplacingInfo_ExtIEs),
	offsetof(struct CellReplacingInfo_ExtIEs, _asn_ctx),
	asn_MAP_CellReplacingInfo_ExtIEs_tag2el_105,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CellReplacingInfo_ExtIEs = {
	"CellReplacingInfo-ExtIEs",
	"CellReplacingInfo-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CellReplacingInfo_ExtIEs_tags_105,
	sizeof(asn_DEF_CellReplacingInfo_ExtIEs_tags_105)
		/sizeof(asn_DEF_CellReplacingInfo_ExtIEs_tags_105[0]), /* 1 */
	asn_DEF_CellReplacingInfo_ExtIEs_tags_105,	/* Same as above */
	sizeof(asn_DEF_CellReplacingInfo_ExtIEs_tags_105)
		/sizeof(asn_DEF_CellReplacingInfo_ExtIEs_tags_105[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CellReplacingInfo_ExtIEs_105,
	3,	/* Elements count */
	&asn_SPC_CellReplacingInfo_ExtIEs_specs_105	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_112 = {
	sizeof(struct CoMPHypothesisSetItem_ExtIEs__extensionValue),
	offsetof(struct CoMPHypothesisSetItem_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CoMPHypothesisSetItem_ExtIEs__extensionValue, present),
	sizeof(((struct CoMPHypothesisSetItem_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_112 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_112	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CoMPHypothesisSetItem_ExtIEs_109[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CoMPHypothesisSetItem_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_110,  memb_id_constraint_109 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CoMPHypothesisSetItem_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_111,  memb_criticality_constraint_109 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CoMPHypothesisSetItem_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_112,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_112,  memb_extensionValue_constraint_109 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CoMPHypothesisSetItem_ExtIEs_tag2el_109[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CoMPHypothesisSetItem_ExtIEs_specs_109 = {
	sizeof(struct CoMPHypothesisSetItem_ExtIEs),
	offsetof(struct CoMPHypothesisSetItem_ExtIEs, _asn_ctx),
	asn_MAP_CoMPHypothesisSetItem_ExtIEs_tag2el_109,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CoMPHypothesisSetItem_ExtIEs = {
	"CoMPHypothesisSetItem-ExtIEs",
	"CoMPHypothesisSetItem-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109,
	sizeof(asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109)
		/sizeof(asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109[0]), /* 1 */
	asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109,	/* Same as above */
	sizeof(asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109)
		/sizeof(asn_DEF_CoMPHypothesisSetItem_ExtIEs_tags_109[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CoMPHypothesisSetItem_ExtIEs_109,
	3,	/* Elements count */
	&asn_SPC_CoMPHypothesisSetItem_ExtIEs_specs_109	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_116 = {
	sizeof(struct CoMPInformation_ExtIEs__extensionValue),
	offsetof(struct CoMPInformation_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CoMPInformation_ExtIEs__extensionValue, present),
	sizeof(((struct CoMPInformation_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_116 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_116	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CoMPInformation_ExtIEs_113[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformation_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_114,  memb_id_constraint_113 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformation_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_115,  memb_criticality_constraint_113 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CoMPInformation_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_116,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_116,  memb_extensionValue_constraint_113 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CoMPInformation_ExtIEs_tags_113[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CoMPInformation_ExtIEs_tag2el_113[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CoMPInformation_ExtIEs_specs_113 = {
	sizeof(struct CoMPInformation_ExtIEs),
	offsetof(struct CoMPInformation_ExtIEs, _asn_ctx),
	asn_MAP_CoMPInformation_ExtIEs_tag2el_113,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CoMPInformation_ExtIEs = {
	"CoMPInformation-ExtIEs",
	"CoMPInformation-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CoMPInformation_ExtIEs_tags_113,
	sizeof(asn_DEF_CoMPInformation_ExtIEs_tags_113)
		/sizeof(asn_DEF_CoMPInformation_ExtIEs_tags_113[0]), /* 1 */
	asn_DEF_CoMPInformation_ExtIEs_tags_113,	/* Same as above */
	sizeof(asn_DEF_CoMPInformation_ExtIEs_tags_113)
		/sizeof(asn_DEF_CoMPInformation_ExtIEs_tags_113[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CoMPInformation_ExtIEs_113,
	3,	/* Elements count */
	&asn_SPC_CoMPInformation_ExtIEs_specs_113	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_120 = {
	sizeof(struct CoMPInformationItem_ExtIEs__extensionValue),
	offsetof(struct CoMPInformationItem_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CoMPInformationItem_ExtIEs__extensionValue, present),
	sizeof(((struct CoMPInformationItem_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_120 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_120	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CoMPInformationItem_ExtIEs_117[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationItem_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_118,  memb_id_constraint_117 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationItem_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_119,  memb_criticality_constraint_117 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CoMPInformationItem_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_120,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_120,  memb_extensionValue_constraint_117 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CoMPInformationItem_ExtIEs_tags_117[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CoMPInformationItem_ExtIEs_tag2el_117[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CoMPInformationItem_ExtIEs_specs_117 = {
	sizeof(struct CoMPInformationItem_ExtIEs),
	offsetof(struct CoMPInformationItem_ExtIEs, _asn_ctx),
	asn_MAP_CoMPInformationItem_ExtIEs_tag2el_117,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CoMPInformationItem_ExtIEs = {
	"CoMPInformationItem-ExtIEs",
	"CoMPInformationItem-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CoMPInformationItem_ExtIEs_tags_117,
	sizeof(asn_DEF_CoMPInformationItem_ExtIEs_tags_117)
		/sizeof(asn_DEF_CoMPInformationItem_ExtIEs_tags_117[0]), /* 1 */
	asn_DEF_CoMPInformationItem_ExtIEs_tags_117,	/* Same as above */
	sizeof(asn_DEF_CoMPInformationItem_ExtIEs_tags_117)
		/sizeof(asn_DEF_CoMPInformationItem_ExtIEs_tags_117[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CoMPInformationItem_ExtIEs_117,
	3,	/* Elements count */
	&asn_SPC_CoMPInformationItem_ExtIEs_specs_117	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_124 = {
	sizeof(struct CoMPInformationStartTime_ExtIEs__extensionValue),
	offsetof(struct CoMPInformationStartTime_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CoMPInformationStartTime_ExtIEs__extensionValue, present),
	sizeof(((struct CoMPInformationStartTime_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_124 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_124	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CoMPInformationStartTime_ExtIEs_121[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationStartTime_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_122,  memb_id_constraint_121 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CoMPInformationStartTime_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_123,  memb_criticality_constraint_121 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CoMPInformationStartTime_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_124,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_124,  memb_extensionValue_constraint_121 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CoMPInformationStartTime_ExtIEs_tag2el_121[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CoMPInformationStartTime_ExtIEs_specs_121 = {
	sizeof(struct CoMPInformationStartTime_ExtIEs),
	offsetof(struct CoMPInformationStartTime_ExtIEs, _asn_ctx),
	asn_MAP_CoMPInformationStartTime_ExtIEs_tag2el_121,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CoMPInformationStartTime_ExtIEs = {
	"CoMPInformationStartTime-ExtIEs",
	"CoMPInformationStartTime-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121,
	sizeof(asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121)
		/sizeof(asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121[0]), /* 1 */
	asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121,	/* Same as above */
	sizeof(asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121)
		/sizeof(asn_DEF_CoMPInformationStartTime_ExtIEs_tags_121[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CoMPInformationStartTime_ExtIEs_121,
	3,	/* Elements count */
	&asn_SPC_CoMPInformationStartTime_ExtIEs_specs_121	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_128 = {
	sizeof(struct CompositeAvailableCapacity_ExtIEs__extensionValue),
	offsetof(struct CompositeAvailableCapacity_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CompositeAvailableCapacity_ExtIEs__extensionValue, present),
	sizeof(((struct CompositeAvailableCapacity_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_128 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_128	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CompositeAvailableCapacity_ExtIEs_125[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacity_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_126,  memb_id_constraint_125 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacity_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_127,  memb_criticality_constraint_125 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacity_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_128,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_128,  memb_extensionValue_constraint_125 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CompositeAvailableCapacity_ExtIEs_tag2el_125[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CompositeAvailableCapacity_ExtIEs_specs_125 = {
	sizeof(struct CompositeAvailableCapacity_ExtIEs),
	offsetof(struct CompositeAvailableCapacity_ExtIEs, _asn_ctx),
	asn_MAP_CompositeAvailableCapacity_ExtIEs_tag2el_125,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacity_ExtIEs = {
	"CompositeAvailableCapacity-ExtIEs",
	"CompositeAvailableCapacity-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125,
	sizeof(asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125)
		/sizeof(asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125[0]), /* 1 */
	asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125,	/* Same as above */
	sizeof(asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125)
		/sizeof(asn_DEF_CompositeAvailableCapacity_ExtIEs_tags_125[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CompositeAvailableCapacity_ExtIEs_125,
	3,	/* Elements count */
	&asn_SPC_CompositeAvailableCapacity_ExtIEs_specs_125	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_132 = {
	sizeof(struct CompositeAvailableCapacityGroup_ExtIEs__extensionValue),
	offsetof(struct CompositeAvailableCapacityGroup_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CompositeAvailableCapacityGroup_ExtIEs__extensionValue, present),
	sizeof(((struct CompositeAvailableCapacityGroup_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_132 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_132	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CompositeAvailableCapacityGroup_ExtIEs_129[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacityGroup_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_130,  memb_id_constraint_129 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacityGroup_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_131,  memb_criticality_constraint_129 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CompositeAvailableCapacityGroup_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_132,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_132,  memb_extensionValue_constraint_129 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CompositeAvailableCapacityGroup_ExtIEs_tag2el_129[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CompositeAvailableCapacityGroup_ExtIEs_specs_129 = {
	sizeof(struct CompositeAvailableCapacityGroup_ExtIEs),
	offsetof(struct CompositeAvailableCapacityGroup_ExtIEs, _asn_ctx),
	asn_MAP_CompositeAvailableCapacityGroup_ExtIEs_tag2el_129,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CompositeAvailableCapacityGroup_ExtIEs = {
	"CompositeAvailableCapacityGroup-ExtIEs",
	"CompositeAvailableCapacityGroup-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129,
	sizeof(asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129)
		/sizeof(asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129[0]), /* 1 */
	asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129,	/* Same as above */
	sizeof(asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129)
		/sizeof(asn_DEF_CompositeAvailableCapacityGroup_ExtIEs_tags_129[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CompositeAvailableCapacityGroup_ExtIEs_129,
	3,	/* Elements count */
	&asn_SPC_CompositeAvailableCapacityGroup_ExtIEs_specs_129	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_136 = {
	sizeof(struct CriticalityDiagnostics_ExtIEs__extensionValue),
	offsetof(struct CriticalityDiagnostics_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CriticalityDiagnostics_ExtIEs__extensionValue, present),
	sizeof(((struct CriticalityDiagnostics_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_136 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_136	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_ExtIEs_133[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_134,  memb_id_constraint_133 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_135,  memb_criticality_constraint_133 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_136,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_136,  memb_extensionValue_constraint_133 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnostics_ExtIEs_tag2el_133[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_ExtIEs_specs_133 = {
	sizeof(struct CriticalityDiagnostics_ExtIEs),
	offsetof(struct CriticalityDiagnostics_ExtIEs, _asn_ctx),
	asn_MAP_CriticalityDiagnostics_ExtIEs_tag2el_133,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_ExtIEs = {
	"CriticalityDiagnostics-ExtIEs",
	"CriticalityDiagnostics-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133,
	sizeof(asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133)
		/sizeof(asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133[0]), /* 1 */
	asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133,	/* Same as above */
	sizeof(asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133)
		/sizeof(asn_DEF_CriticalityDiagnostics_ExtIEs_tags_133[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CriticalityDiagnostics_ExtIEs_133,
	3,	/* Elements count */
	&asn_SPC_CriticalityDiagnostics_ExtIEs_specs_133	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_140 = {
	sizeof(struct CriticalityDiagnostics_IE_List_ExtIEs__extensionValue),
	offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs__extensionValue, present),
	sizeof(((struct CriticalityDiagnostics_IE_List_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_140 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_140	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CriticalityDiagnostics_IE_List_ExtIEs_137[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_138,  memb_id_constraint_137 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_139,  memb_criticality_constraint_137 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_140,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_140,  memb_extensionValue_constraint_137 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CriticalityDiagnostics_IE_List_ExtIEs_tag2el_137[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CriticalityDiagnostics_IE_List_ExtIEs_specs_137 = {
	sizeof(struct CriticalityDiagnostics_IE_List_ExtIEs),
	offsetof(struct CriticalityDiagnostics_IE_List_ExtIEs, _asn_ctx),
	asn_MAP_CriticalityDiagnostics_IE_List_ExtIEs_tag2el_137,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs = {
	"CriticalityDiagnostics-IE-List-ExtIEs",
	"CriticalityDiagnostics-IE-List-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137,
	sizeof(asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137)
		/sizeof(asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137[0]), /* 1 */
	asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137,	/* Same as above */
	sizeof(asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137)
		/sizeof(asn_DEF_CriticalityDiagnostics_IE_List_ExtIEs_tags_137[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CriticalityDiagnostics_IE_List_ExtIEs_137,
	3,	/* Elements count */
	&asn_SPC_CriticalityDiagnostics_IE_List_ExtIEs_specs_137	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_144 = {
	sizeof(struct CSIReportList_ExtIEs__extensionValue),
	offsetof(struct CSIReportList_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CSIReportList_ExtIEs__extensionValue, present),
	sizeof(((struct CSIReportList_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_144 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_144	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CSIReportList_ExtIEs_141[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportList_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_142,  memb_id_constraint_141 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportList_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_143,  memb_criticality_constraint_141 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CSIReportList_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_144,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_144,  memb_extensionValue_constraint_141 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CSIReportList_ExtIEs_tags_141[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CSIReportList_ExtIEs_tag2el_141[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CSIReportList_ExtIEs_specs_141 = {
	sizeof(struct CSIReportList_ExtIEs),
	offsetof(struct CSIReportList_ExtIEs, _asn_ctx),
	asn_MAP_CSIReportList_ExtIEs_tag2el_141,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CSIReportList_ExtIEs = {
	"CSIReportList-ExtIEs",
	"CSIReportList-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CSIReportList_ExtIEs_tags_141,
	sizeof(asn_DEF_CSIReportList_ExtIEs_tags_141)
		/sizeof(asn_DEF_CSIReportList_ExtIEs_tags_141[0]), /* 1 */
	asn_DEF_CSIReportList_ExtIEs_tags_141,	/* Same as above */
	sizeof(asn_DEF_CSIReportList_ExtIEs_tags_141)
		/sizeof(asn_DEF_CSIReportList_ExtIEs_tags_141[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CSIReportList_ExtIEs_141,
	3,	/* Elements count */
	&asn_SPC_CSIReportList_ExtIEs_specs_141	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_148 = {
	sizeof(struct CSIReportPerCSIProcess_ExtIEs__extensionValue),
	offsetof(struct CSIReportPerCSIProcess_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CSIReportPerCSIProcess_ExtIEs__extensionValue, present),
	sizeof(((struct CSIReportPerCSIProcess_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_148 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_148	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcess_ExtIEs_145[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcess_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_146,  memb_id_constraint_145 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcess_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_147,  memb_criticality_constraint_145 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcess_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_148,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_148,  memb_extensionValue_constraint_145 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CSIReportPerCSIProcess_ExtIEs_tag2el_145[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CSIReportPerCSIProcess_ExtIEs_specs_145 = {
	sizeof(struct CSIReportPerCSIProcess_ExtIEs),
	offsetof(struct CSIReportPerCSIProcess_ExtIEs, _asn_ctx),
	asn_MAP_CSIReportPerCSIProcess_ExtIEs_tag2el_145,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcess_ExtIEs = {
	"CSIReportPerCSIProcess-ExtIEs",
	"CSIReportPerCSIProcess-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145,
	sizeof(asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145)
		/sizeof(asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145[0]), /* 1 */
	asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145,	/* Same as above */
	sizeof(asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145)
		/sizeof(asn_DEF_CSIReportPerCSIProcess_ExtIEs_tags_145[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CSIReportPerCSIProcess_ExtIEs_145,
	3,	/* Elements count */
	&asn_SPC_CSIReportPerCSIProcess_ExtIEs_specs_145	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_152 = {
	sizeof(struct CSIReportPerCSIProcessItem_ExtIEs__extensionValue),
	offsetof(struct CSIReportPerCSIProcessItem_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct CSIReportPerCSIProcessItem_ExtIEs__extensionValue, present),
	sizeof(((struct CSIReportPerCSIProcessItem_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_152 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_152	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_CSIReportPerCSIProcessItem_ExtIEs_149[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcessItem_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_150,  memb_id_constraint_149 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcessItem_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_151,  memb_criticality_constraint_149 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct CSIReportPerCSIProcessItem_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_152,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_152,  memb_extensionValue_constraint_149 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_CSIReportPerCSIProcessItem_ExtIEs_tag2el_149[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_CSIReportPerCSIProcessItem_ExtIEs_specs_149 = {
	sizeof(struct CSIReportPerCSIProcessItem_ExtIEs),
	offsetof(struct CSIReportPerCSIProcessItem_ExtIEs, _asn_ctx),
	asn_MAP_CSIReportPerCSIProcessItem_ExtIEs_tag2el_149,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_CSIReportPerCSIProcessItem_ExtIEs = {
	"CSIReportPerCSIProcessItem-ExtIEs",
	"CSIReportPerCSIProcessItem-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149,
	sizeof(asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149)
		/sizeof(asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149[0]), /* 1 */
	asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149,	/* Same as above */
	sizeof(asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149)
		/sizeof(asn_DEF_CSIReportPerCSIProcessItem_ExtIEs_tags_149[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_CSIReportPerCSIProcessItem_ExtIEs_149,
	3,	/* Elements count */
	&asn_SPC_CSIReportPerCSIProcessItem_ExtIEs_specs_149	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_156 = {
	sizeof(struct DynamicNAICSInformation_ExtIEs__extensionValue),
	offsetof(struct DynamicNAICSInformation_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct DynamicNAICSInformation_ExtIEs__extensionValue, present),
	sizeof(((struct DynamicNAICSInformation_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_156 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_156	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_DynamicNAICSInformation_ExtIEs_153[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct DynamicNAICSInformation_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_154,  memb_id_constraint_153 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct DynamicNAICSInformation_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_155,  memb_criticality_constraint_153 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct DynamicNAICSInformation_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_156,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_156,  memb_extensionValue_constraint_153 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_DynamicNAICSInformation_ExtIEs_tag2el_153[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_DynamicNAICSInformation_ExtIEs_specs_153 = {
	sizeof(struct DynamicNAICSInformation_ExtIEs),
	offsetof(struct DynamicNAICSInformation_ExtIEs, _asn_ctx),
	asn_MAP_DynamicNAICSInformation_ExtIEs_tag2el_153,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_DynamicNAICSInformation_ExtIEs = {
	"DynamicNAICSInformation-ExtIEs",
	"DynamicNAICSInformation-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153,
	sizeof(asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153)
		/sizeof(asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153[0]), /* 1 */
	asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153,	/* Same as above */
	sizeof(asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153)
		/sizeof(asn_DEF_DynamicNAICSInformation_ExtIEs_tags_153[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_DynamicNAICSInformation_ExtIEs_153,
	3,	/* Elements count */
	&asn_SPC_DynamicNAICSInformation_ExtIEs_specs_153	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_160 = {
	sizeof(struct ECGI_ExtIEs__extensionValue),
	offsetof(struct ECGI_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ECGI_ExtIEs__extensionValue, present),
	sizeof(((struct ECGI_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_160 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_160	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ECGI_ExtIEs_157[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ECGI_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_158,  memb_id_constraint_157 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ECGI_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_159,  memb_criticality_constraint_157 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ECGI_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_160,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_160,  memb_extensionValue_constraint_157 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ECGI_ExtIEs_tags_157[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ECGI_ExtIEs_tag2el_157[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ECGI_ExtIEs_specs_157 = {
	sizeof(struct ECGI_ExtIEs),
	offsetof(struct ECGI_ExtIEs, _asn_ctx),
	asn_MAP_ECGI_ExtIEs_tag2el_157,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ECGI_ExtIEs = {
	"ECGI-ExtIEs",
	"ECGI-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ECGI_ExtIEs_tags_157,
	sizeof(asn_DEF_ECGI_ExtIEs_tags_157)
		/sizeof(asn_DEF_ECGI_ExtIEs_tags_157[0]), /* 1 */
	asn_DEF_ECGI_ExtIEs_tags_157,	/* Same as above */
	sizeof(asn_DEF_ECGI_ExtIEs_tags_157)
		/sizeof(asn_DEF_ECGI_ExtIEs_tags_157[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ECGI_ExtIEs_157,
	3,	/* Elements count */
	&asn_SPC_ECGI_ExtIEs_specs_157	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_164 = {
	sizeof(struct EnhancedRNTP_ExtIEs__extensionValue),
	offsetof(struct EnhancedRNTP_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct EnhancedRNTP_ExtIEs__extensionValue, present),
	sizeof(((struct EnhancedRNTP_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_164 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_164	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_EnhancedRNTP_ExtIEs_161[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTP_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_162,  memb_id_constraint_161 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTP_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_163,  memb_criticality_constraint_161 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTP_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_164,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_164,  memb_extensionValue_constraint_161 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_EnhancedRNTP_ExtIEs_tags_161[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_EnhancedRNTP_ExtIEs_tag2el_161[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_EnhancedRNTP_ExtIEs_specs_161 = {
	sizeof(struct EnhancedRNTP_ExtIEs),
	offsetof(struct EnhancedRNTP_ExtIEs, _asn_ctx),
	asn_MAP_EnhancedRNTP_ExtIEs_tag2el_161,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_EnhancedRNTP_ExtIEs = {
	"EnhancedRNTP-ExtIEs",
	"EnhancedRNTP-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_EnhancedRNTP_ExtIEs_tags_161,
	sizeof(asn_DEF_EnhancedRNTP_ExtIEs_tags_161)
		/sizeof(asn_DEF_EnhancedRNTP_ExtIEs_tags_161[0]), /* 1 */
	asn_DEF_EnhancedRNTP_ExtIEs_tags_161,	/* Same as above */
	sizeof(asn_DEF_EnhancedRNTP_ExtIEs_tags_161)
		/sizeof(asn_DEF_EnhancedRNTP_ExtIEs_tags_161[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_EnhancedRNTP_ExtIEs_161,
	3,	/* Elements count */
	&asn_SPC_EnhancedRNTP_ExtIEs_specs_161	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_168 = {
	sizeof(struct EnhancedRNTPStartTime_ExtIEs__extensionValue),
	offsetof(struct EnhancedRNTPStartTime_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct EnhancedRNTPStartTime_ExtIEs__extensionValue, present),
	sizeof(((struct EnhancedRNTPStartTime_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_168 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_168	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_EnhancedRNTPStartTime_ExtIEs_165[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTPStartTime_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_166,  memb_id_constraint_165 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTPStartTime_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_167,  memb_criticality_constraint_165 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct EnhancedRNTPStartTime_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_168,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_168,  memb_extensionValue_constraint_165 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_EnhancedRNTPStartTime_ExtIEs_tag2el_165[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_EnhancedRNTPStartTime_ExtIEs_specs_165 = {
	sizeof(struct EnhancedRNTPStartTime_ExtIEs),
	offsetof(struct EnhancedRNTPStartTime_ExtIEs, _asn_ctx),
	asn_MAP_EnhancedRNTPStartTime_ExtIEs_tag2el_165,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_EnhancedRNTPStartTime_ExtIEs = {
	"EnhancedRNTPStartTime-ExtIEs",
	"EnhancedRNTPStartTime-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165,
	sizeof(asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165)
		/sizeof(asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165[0]), /* 1 */
	asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165,	/* Same as above */
	sizeof(asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165)
		/sizeof(asn_DEF_EnhancedRNTPStartTime_ExtIEs_tags_165[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_EnhancedRNTPStartTime_ExtIEs_165,
	3,	/* Elements count */
	&asn_SPC_EnhancedRNTPStartTime_ExtIEs_specs_165	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_172 = {
	sizeof(struct ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue),
	offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue, present),
	sizeof(((struct ExtendedULInterferenceOverloadInfo_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_172 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_172	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ExtendedULInterferenceOverloadInfo_ExtIEs_169[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_170,  memb_id_constraint_169 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_171,  memb_criticality_constraint_169 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_172,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_172,  memb_extensionValue_constraint_169 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ExtendedULInterferenceOverloadInfo_ExtIEs_tag2el_169[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ExtendedULInterferenceOverloadInfo_ExtIEs_specs_169 = {
	sizeof(struct ExtendedULInterferenceOverloadInfo_ExtIEs),
	offsetof(struct ExtendedULInterferenceOverloadInfo_ExtIEs, _asn_ctx),
	asn_MAP_ExtendedULInterferenceOverloadInfo_ExtIEs_tag2el_169,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs = {
	"ExtendedULInterferenceOverloadInfo-ExtIEs",
	"ExtendedULInterferenceOverloadInfo-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169,
	sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169)
		/sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169[0]), /* 1 */
	asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169,	/* Same as above */
	sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169)
		/sizeof(asn_DEF_ExtendedULInterferenceOverloadInfo_ExtIEs_tags_169[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ExtendedULInterferenceOverloadInfo_ExtIEs_169,
	3,	/* Elements count */
	&asn_SPC_ExtendedULInterferenceOverloadInfo_ExtIEs_specs_169	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_extensionValue_176[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs__extensionValue, choice.EARFCNExtension),
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		&asn_DEF_EARFCNExtension,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"EARFCNExtension"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs__extensionValue, choice.OffsetOfNbiotChannelNumberToEARFCN),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_OffsetOfNbiotChannelNumberToEARFCN,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"OffsetOfNbiotChannelNumberToEARFCN"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs__extensionValue, choice.NRS_NSSS_PowerOffset),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_NRS_NSSS_PowerOffset,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"NRS-NSSS-PowerOffset"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs__extensionValue, choice.NSSS_NumOccasionDifferentPrecoder),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_NSSS_NumOccasionDifferentPrecoder,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"NSSS-NumOccasionDifferentPrecoder"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_176[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 0 }, /* EARFCNExtension */
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 1, 0, 2 }, /* OffsetOfNbiotChannelNumberToEARFCN */
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 2, -1, 1 }, /* NRS-NSSS-PowerOffset */
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 3, -2, 0 } /* NSSS-NumOccasionDifferentPrecoder */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_176 = {
	sizeof(struct FDD_Info_ExtIEs__extensionValue),
	offsetof(struct FDD_Info_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct FDD_Info_ExtIEs__extensionValue, present),
	sizeof(((struct FDD_Info_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_176,
	4,	/* Count of tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_176 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_176,
	4,	/* Elements count */
	&asn_SPC_extensionValue_specs_176	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_FDD_Info_ExtIEs_173[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_174,  memb_id_constraint_173 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_FDD_Info_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_175,  memb_criticality_constraint_173 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct FDD_Info_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_176,
		select_FDD_Info_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_176,  memb_extensionValue_constraint_173 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_FDD_Info_ExtIEs_tags_173[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_FDD_Info_ExtIEs_tag2el_173[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_FDD_Info_ExtIEs_specs_173 = {
	sizeof(struct FDD_Info_ExtIEs),
	offsetof(struct FDD_Info_ExtIEs, _asn_ctx),
	asn_MAP_FDD_Info_ExtIEs_tag2el_173,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_FDD_Info_ExtIEs = {
	"FDD-Info-ExtIEs",
	"FDD-Info-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_FDD_Info_ExtIEs_tags_173,
	sizeof(asn_DEF_FDD_Info_ExtIEs_tags_173)
		/sizeof(asn_DEF_FDD_Info_ExtIEs_tags_173[0]), /* 1 */
	asn_DEF_FDD_Info_ExtIEs_tags_173,	/* Same as above */
	sizeof(asn_DEF_FDD_Info_ExtIEs_tags_173)
		/sizeof(asn_DEF_FDD_Info_ExtIEs_tags_173[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_FDD_Info_ExtIEs_173,
	3,	/* Elements count */
	&asn_SPC_FDD_Info_ExtIEs_specs_173	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_180 = {
	sizeof(struct FreqBandNrItem_ExtIEs__extensionValue),
	offsetof(struct FreqBandNrItem_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct FreqBandNrItem_ExtIEs__extensionValue, present),
	sizeof(((struct FreqBandNrItem_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_180 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_180	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_FreqBandNrItem_ExtIEs_177[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct FreqBandNrItem_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_178,  memb_id_constraint_177 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct FreqBandNrItem_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_179,  memb_criticality_constraint_177 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct FreqBandNrItem_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_180,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_180,  memb_extensionValue_constraint_177 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_FreqBandNrItem_ExtIEs_tags_177[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_FreqBandNrItem_ExtIEs_tag2el_177[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_FreqBandNrItem_ExtIEs_specs_177 = {
	sizeof(struct FreqBandNrItem_ExtIEs),
	offsetof(struct FreqBandNrItem_ExtIEs, _asn_ctx),
	asn_MAP_FreqBandNrItem_ExtIEs_tag2el_177,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_FreqBandNrItem_ExtIEs = {
	"FreqBandNrItem-ExtIEs",
	"FreqBandNrItem-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_FreqBandNrItem_ExtIEs_tags_177,
	sizeof(asn_DEF_FreqBandNrItem_ExtIEs_tags_177)
		/sizeof(asn_DEF_FreqBandNrItem_ExtIEs_tags_177[0]), /* 1 */
	asn_DEF_FreqBandNrItem_ExtIEs_tags_177,	/* Same as above */
	sizeof(asn_DEF_FreqBandNrItem_ExtIEs_tags_177)
		/sizeof(asn_DEF_FreqBandNrItem_ExtIEs_tags_177[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_FreqBandNrItem_ExtIEs_177,
	3,	/* Elements count */
	&asn_SPC_FreqBandNrItem_ExtIEs_specs_177	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_184 = {
	sizeof(struct GlobalENB_ID_ExtIEs__extensionValue),
	offsetof(struct GlobalENB_ID_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct GlobalENB_ID_ExtIEs__extensionValue, present),
	sizeof(((struct GlobalENB_ID_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_184 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_184	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_GlobalENB_ID_ExtIEs_181[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_182,  memb_id_constraint_181 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_183,  memb_criticality_constraint_181 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct GlobalENB_ID_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_184,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_184,  memb_extensionValue_constraint_181 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_GlobalENB_ID_ExtIEs_tags_181[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_GlobalENB_ID_ExtIEs_tag2el_181[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_GlobalENB_ID_ExtIEs_specs_181 = {
	sizeof(struct GlobalENB_ID_ExtIEs),
	offsetof(struct GlobalENB_ID_ExtIEs, _asn_ctx),
	asn_MAP_GlobalENB_ID_ExtIEs_tag2el_181,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_GlobalENB_ID_ExtIEs = {
	"GlobalENB-ID-ExtIEs",
	"GlobalENB-ID-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_GlobalENB_ID_ExtIEs_tags_181,
	sizeof(asn_DEF_GlobalENB_ID_ExtIEs_tags_181)
		/sizeof(asn_DEF_GlobalENB_ID_ExtIEs_tags_181[0]), /* 1 */
	asn_DEF_GlobalENB_ID_ExtIEs_tags_181,	/* Same as above */
	sizeof(asn_DEF_GlobalENB_ID_ExtIEs_tags_181)
		/sizeof(asn_DEF_GlobalENB_ID_ExtIEs_tags_181[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_GlobalENB_ID_ExtIEs_181,
	3,	/* Elements count */
	&asn_SPC_GlobalENB_ID_ExtIEs_specs_181	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_188 = {
	sizeof(struct GlobalGNB_ID_ExtIEs__extensionValue),
	offsetof(struct GlobalGNB_ID_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct GlobalGNB_ID_ExtIEs__extensionValue, present),
	sizeof(((struct GlobalGNB_ID_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_188 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_188	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_GlobalGNB_ID_ExtIEs_185[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct GlobalGNB_ID_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_186,  memb_id_constraint_185 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct GlobalGNB_ID_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_187,  memb_criticality_constraint_185 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct GlobalGNB_ID_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_188,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_188,  memb_extensionValue_constraint_185 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_GlobalGNB_ID_ExtIEs_tags_185[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_GlobalGNB_ID_ExtIEs_tag2el_185[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_GlobalGNB_ID_ExtIEs_specs_185 = {
	sizeof(struct GlobalGNB_ID_ExtIEs),
	offsetof(struct GlobalGNB_ID_ExtIEs, _asn_ctx),
	asn_MAP_GlobalGNB_ID_ExtIEs_tag2el_185,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_GlobalGNB_ID_ExtIEs = {
	"GlobalGNB-ID-ExtIEs",
	"GlobalGNB-ID-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_GlobalGNB_ID_ExtIEs_tags_185,
	sizeof(asn_DEF_GlobalGNB_ID_ExtIEs_tags_185)
		/sizeof(asn_DEF_GlobalGNB_ID_ExtIEs_tags_185[0]), /* 1 */
	asn_DEF_GlobalGNB_ID_ExtIEs_tags_185,	/* Same as above */
	sizeof(asn_DEF_GlobalGNB_ID_ExtIEs_tags_185)
		/sizeof(asn_DEF_GlobalGNB_ID_ExtIEs_tags_185[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_GlobalGNB_ID_ExtIEs_185,
	3,	/* Elements count */
	&asn_SPC_GlobalGNB_ID_ExtIEs_specs_185	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_192 = {
	sizeof(struct GU_Group_ID_ExtIEs__extensionValue),
	offsetof(struct GU_Group_ID_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct GU_Group_ID_ExtIEs__extensionValue, present),
	sizeof(((struct GU_Group_ID_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_192 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_192	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_GU_Group_ID_ExtIEs_189[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct GU_Group_ID_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_190,  memb_id_constraint_189 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct GU_Group_ID_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_191,  memb_criticality_constraint_189 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct GU_Group_ID_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_192,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_192,  memb_extensionValue_constraint_189 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_GU_Group_ID_ExtIEs_tags_189[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_GU_Group_ID_ExtIEs_tag2el_189[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_GU_Group_ID_ExtIEs_specs_189 = {
	sizeof(struct GU_Group_ID_ExtIEs),
	offsetof(struct GU_Group_ID_ExtIEs, _asn_ctx),
	asn_MAP_GU_Group_ID_ExtIEs_tag2el_189,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_GU_Group_ID_ExtIEs = {
	"GU-Group-ID-ExtIEs",
	"GU-Group-ID-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_GU_Group_ID_ExtIEs_tags_189,
	sizeof(asn_DEF_GU_Group_ID_ExtIEs_tags_189)
		/sizeof(asn_DEF_GU_Group_ID_ExtIEs_tags_189[0]), /* 1 */
	asn_DEF_GU_Group_ID_ExtIEs_tags_189,	/* Same as above */
	sizeof(asn_DEF_GU_Group_ID_ExtIEs_tags_189)
		/sizeof(asn_DEF_GU_Group_ID_ExtIEs_tags_189[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_GU_Group_ID_ExtIEs_189,
	3,	/* Elements count */
	&asn_SPC_GU_Group_ID_ExtIEs_specs_189	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_196 = {
	sizeof(struct HWLoadIndicator_ExtIEs__extensionValue),
	offsetof(struct HWLoadIndicator_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct HWLoadIndicator_ExtIEs__extensionValue, present),
	sizeof(((struct HWLoadIndicator_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_196 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_196	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_HWLoadIndicator_ExtIEs_193[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct HWLoadIndicator_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_194,  memb_id_constraint_193 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct HWLoadIndicator_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_195,  memb_criticality_constraint_193 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct HWLoadIndicator_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_196,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_196,  memb_extensionValue_constraint_193 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_HWLoadIndicator_ExtIEs_tags_193[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_HWLoadIndicator_ExtIEs_tag2el_193[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_HWLoadIndicator_ExtIEs_specs_193 = {
	sizeof(struct HWLoadIndicator_ExtIEs),
	offsetof(struct HWLoadIndicator_ExtIEs, _asn_ctx),
	asn_MAP_HWLoadIndicator_ExtIEs_tag2el_193,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_HWLoadIndicator_ExtIEs = {
	"HWLoadIndicator-ExtIEs",
	"HWLoadIndicator-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_HWLoadIndicator_ExtIEs_tags_193,
	sizeof(asn_DEF_HWLoadIndicator_ExtIEs_tags_193)
		/sizeof(asn_DEF_HWLoadIndicator_ExtIEs_tags_193[0]), /* 1 */
	asn_DEF_HWLoadIndicator_ExtIEs_tags_193,	/* Same as above */
	sizeof(asn_DEF_HWLoadIndicator_ExtIEs_tags_193)
		/sizeof(asn_DEF_HWLoadIndicator_ExtIEs_tags_193[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_HWLoadIndicator_ExtIEs_193,
	3,	/* Elements count */
	&asn_SPC_HWLoadIndicator_ExtIEs_specs_193	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_200 = {
	sizeof(struct MBSFN_Subframe_Info_ExtIEs__extensionValue),
	offsetof(struct MBSFN_Subframe_Info_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct MBSFN_Subframe_Info_ExtIEs__extensionValue, present),
	sizeof(((struct MBSFN_Subframe_Info_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_200 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_200	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_MBSFN_Subframe_Info_ExtIEs_197[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct MBSFN_Subframe_Info_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_198,  memb_id_constraint_197 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct MBSFN_Subframe_Info_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_199,  memb_criticality_constraint_197 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct MBSFN_Subframe_Info_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_200,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_200,  memb_extensionValue_constraint_197 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_MBSFN_Subframe_Info_ExtIEs_tag2el_197[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_MBSFN_Subframe_Info_ExtIEs_specs_197 = {
	sizeof(struct MBSFN_Subframe_Info_ExtIEs),
	offsetof(struct MBSFN_Subframe_Info_ExtIEs, _asn_ctx),
	asn_MAP_MBSFN_Subframe_Info_ExtIEs_tag2el_197,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_MBSFN_Subframe_Info_ExtIEs = {
	"MBSFN-Subframe-Info-ExtIEs",
	"MBSFN-Subframe-Info-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197,
	sizeof(asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197)
		/sizeof(asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197[0]), /* 1 */
	asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197,	/* Same as above */
	sizeof(asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197)
		/sizeof(asn_DEF_MBSFN_Subframe_Info_ExtIEs_tags_197[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_MBSFN_Subframe_Info_ExtIEs_197,
	3,	/* Elements count */
	&asn_SPC_MBSFN_Subframe_Info_ExtIEs_specs_197	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_204 = {
	sizeof(struct BandInfo_ExtIEs__extensionValue),
	offsetof(struct BandInfo_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct BandInfo_ExtIEs__extensionValue, present),
	sizeof(((struct BandInfo_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_204 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_204	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_BandInfo_ExtIEs_201[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct BandInfo_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_202,  memb_id_constraint_201 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct BandInfo_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_203,  memb_criticality_constraint_201 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct BandInfo_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_204,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_204,  memb_extensionValue_constraint_201 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_BandInfo_ExtIEs_tags_201[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_BandInfo_ExtIEs_tag2el_201[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_BandInfo_ExtIEs_specs_201 = {
	sizeof(struct BandInfo_ExtIEs),
	offsetof(struct BandInfo_ExtIEs, _asn_ctx),
	asn_MAP_BandInfo_ExtIEs_tag2el_201,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_BandInfo_ExtIEs = {
	"BandInfo-ExtIEs",
	"BandInfo-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_BandInfo_ExtIEs_tags_201,
	sizeof(asn_DEF_BandInfo_ExtIEs_tags_201)
		/sizeof(asn_DEF_BandInfo_ExtIEs_tags_201[0]), /* 1 */
	asn_DEF_BandInfo_ExtIEs_tags_201,	/* Same as above */
	sizeof(asn_DEF_BandInfo_ExtIEs_tags_201)
		/sizeof(asn_DEF_BandInfo_ExtIEs_tags_201[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_BandInfo_ExtIEs_201,
	3,	/* Elements count */
	&asn_SPC_BandInfo_ExtIEs_specs_201	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_extensionValue_208[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs__extensionValue, choice.TAC),
		(ASN_TAG_CLASS_UNIVERSAL | (4 << 2)),
		0,
		&asn_DEF_TAC,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"TAC"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs__extensionValue, choice.EARFCNExtension),
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		&asn_DEF_EARFCNExtension,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"EARFCNExtension"
		},
};
static const unsigned asn_MAP_extensionValue_to_canonical_208[] = { 1, 0 };
static const unsigned asn_MAP_extensionValue_from_canonical_208[] = { 1, 0 };
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_208[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* EARFCNExtension */
    { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, 0, 0 } /* TAC */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_208 = {
	sizeof(struct Neighbour_Information_ExtIEs__extensionValue),
	offsetof(struct Neighbour_Information_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct Neighbour_Information_ExtIEs__extensionValue, present),
	sizeof(((struct Neighbour_Information_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_208,
	2,	/* Count of tags in the map */
	asn_MAP_extensionValue_to_canonical_208,
	asn_MAP_extensionValue_from_canonical_208,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_208 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_208,
	2,	/* Elements count */
	&asn_SPC_extensionValue_specs_208	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_Neighbour_Information_ExtIEs_205[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_206,  memb_id_constraint_205 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_Neighbour_Information_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_207,  memb_criticality_constraint_205 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct Neighbour_Information_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_208,
		select_Neighbour_Information_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_208,  memb_extensionValue_constraint_205 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_Neighbour_Information_ExtIEs_tags_205[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_Neighbour_Information_ExtIEs_tag2el_205[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_Neighbour_Information_ExtIEs_specs_205 = {
	sizeof(struct Neighbour_Information_ExtIEs),
	offsetof(struct Neighbour_Information_ExtIEs, _asn_ctx),
	asn_MAP_Neighbour_Information_ExtIEs_tag2el_205,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_Neighbour_Information_ExtIEs = {
	"Neighbour-Information-ExtIEs",
	"Neighbour-Information-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_Neighbour_Information_ExtIEs_tags_205,
	sizeof(asn_DEF_Neighbour_Information_ExtIEs_tags_205)
		/sizeof(asn_DEF_Neighbour_Information_ExtIEs_tags_205[0]), /* 1 */
	asn_DEF_Neighbour_Information_ExtIEs_tags_205,	/* Same as above */
	sizeof(asn_DEF_Neighbour_Information_ExtIEs_tags_205)
		/sizeof(asn_DEF_Neighbour_Information_ExtIEs_tags_205[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_Neighbour_Information_ExtIEs_205,
	3,	/* Elements count */
	&asn_SPC_Neighbour_Information_ExtIEs_specs_205	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_212 = {
	sizeof(struct NRFreqInfo_ExtIEs__extensionValue),
	offsetof(struct NRFreqInfo_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct NRFreqInfo_ExtIEs__extensionValue, present),
	sizeof(((struct NRFreqInfo_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_212 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_212	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_NRFreqInfo_ExtIEs_209[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct NRFreqInfo_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_210,  memb_id_constraint_209 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct NRFreqInfo_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_211,  memb_criticality_constraint_209 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct NRFreqInfo_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_212,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_212,  memb_extensionValue_constraint_209 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_NRFreqInfo_ExtIEs_tags_209[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_NRFreqInfo_ExtIEs_tag2el_209[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_NRFreqInfo_ExtIEs_specs_209 = {
	sizeof(struct NRFreqInfo_ExtIEs),
	offsetof(struct NRFreqInfo_ExtIEs, _asn_ctx),
	asn_MAP_NRFreqInfo_ExtIEs_tag2el_209,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_NRFreqInfo_ExtIEs = {
	"NRFreqInfo-ExtIEs",
	"NRFreqInfo-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_NRFreqInfo_ExtIEs_tags_209,
	sizeof(asn_DEF_NRFreqInfo_ExtIEs_tags_209)
		/sizeof(asn_DEF_NRFreqInfo_ExtIEs_tags_209[0]), /* 1 */
	asn_DEF_NRFreqInfo_ExtIEs_tags_209,	/* Same as above */
	sizeof(asn_DEF_NRFreqInfo_ExtIEs_tags_209)
		/sizeof(asn_DEF_NRFreqInfo_ExtIEs_tags_209[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_NRFreqInfo_ExtIEs_209,
	3,	/* Elements count */
	&asn_SPC_NRFreqInfo_ExtIEs_specs_209	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_216 = {
	sizeof(struct NRCGI_ExtIEs__extensionValue),
	offsetof(struct NRCGI_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct NRCGI_ExtIEs__extensionValue, present),
	sizeof(((struct NRCGI_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_216 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_216	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_NRCGI_ExtIEs_213[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct NRCGI_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_214,  memb_id_constraint_213 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct NRCGI_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_215,  memb_criticality_constraint_213 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct NRCGI_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_216,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_216,  memb_extensionValue_constraint_213 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_NRCGI_ExtIEs_tags_213[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_NRCGI_ExtIEs_tag2el_213[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_NRCGI_ExtIEs_specs_213 = {
	sizeof(struct NRCGI_ExtIEs),
	offsetof(struct NRCGI_ExtIEs, _asn_ctx),
	asn_MAP_NRCGI_ExtIEs_tag2el_213,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_NRCGI_ExtIEs = {
	"NRCGI-ExtIEs",
	"NRCGI-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_NRCGI_ExtIEs_tags_213,
	sizeof(asn_DEF_NRCGI_ExtIEs_tags_213)
		/sizeof(asn_DEF_NRCGI_ExtIEs_tags_213[0]), /* 1 */
	asn_DEF_NRCGI_ExtIEs_tags_213,	/* Same as above */
	sizeof(asn_DEF_NRCGI_ExtIEs_tags_213)
		/sizeof(asn_DEF_NRCGI_ExtIEs_tags_213[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_NRCGI_ExtIEs_213,
	3,	/* Elements count */
	&asn_SPC_NRCGI_ExtIEs_specs_213	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_220 = {
	sizeof(struct NR_TxBW_ExtIEs__extensionValue),
	offsetof(struct NR_TxBW_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct NR_TxBW_ExtIEs__extensionValue, present),
	sizeof(((struct NR_TxBW_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_220 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_220	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_NR_TxBW_ExtIEs_217[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct NR_TxBW_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_218,  memb_id_constraint_217 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct NR_TxBW_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_219,  memb_criticality_constraint_217 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct NR_TxBW_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_220,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_220,  memb_extensionValue_constraint_217 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_NR_TxBW_ExtIEs_tags_217[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_NR_TxBW_ExtIEs_tag2el_217[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_NR_TxBW_ExtIEs_specs_217 = {
	sizeof(struct NR_TxBW_ExtIEs),
	offsetof(struct NR_TxBW_ExtIEs, _asn_ctx),
	asn_MAP_NR_TxBW_ExtIEs_tag2el_217,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_NR_TxBW_ExtIEs = {
	"NR-TxBW-ExtIEs",
	"NR-TxBW-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_NR_TxBW_ExtIEs_tags_217,
	sizeof(asn_DEF_NR_TxBW_ExtIEs_tags_217)
		/sizeof(asn_DEF_NR_TxBW_ExtIEs_tags_217[0]), /* 1 */
	asn_DEF_NR_TxBW_ExtIEs_tags_217,	/* Same as above */
	sizeof(asn_DEF_NR_TxBW_ExtIEs_tags_217)
		/sizeof(asn_DEF_NR_TxBW_ExtIEs_tags_217[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_NR_TxBW_ExtIEs_217,
	3,	/* Elements count */
	&asn_SPC_NR_TxBW_ExtIEs_specs_217	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_224 = {
	sizeof(struct PRACH_Configuration_ExtIEs__extensionValue),
	offsetof(struct PRACH_Configuration_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct PRACH_Configuration_ExtIEs__extensionValue, present),
	sizeof(((struct PRACH_Configuration_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_224 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_224	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_PRACH_Configuration_ExtIEs_221[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_222,  memb_id_constraint_221 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_223,  memb_criticality_constraint_221 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct PRACH_Configuration_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_224,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_224,  memb_extensionValue_constraint_221 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_PRACH_Configuration_ExtIEs_tags_221[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_PRACH_Configuration_ExtIEs_tag2el_221[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_PRACH_Configuration_ExtIEs_specs_221 = {
	sizeof(struct PRACH_Configuration_ExtIEs),
	offsetof(struct PRACH_Configuration_ExtIEs, _asn_ctx),
	asn_MAP_PRACH_Configuration_ExtIEs_tag2el_221,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_PRACH_Configuration_ExtIEs = {
	"PRACH-Configuration-ExtIEs",
	"PRACH-Configuration-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_PRACH_Configuration_ExtIEs_tags_221,
	sizeof(asn_DEF_PRACH_Configuration_ExtIEs_tags_221)
		/sizeof(asn_DEF_PRACH_Configuration_ExtIEs_tags_221[0]), /* 1 */
	asn_DEF_PRACH_Configuration_ExtIEs_tags_221,	/* Same as above */
	sizeof(asn_DEF_PRACH_Configuration_ExtIEs_tags_221)
		/sizeof(asn_DEF_PRACH_Configuration_ExtIEs_tags_221[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_PRACH_Configuration_ExtIEs_221,
	3,	/* Elements count */
	&asn_SPC_PRACH_Configuration_ExtIEs_specs_221	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_228 = {
	sizeof(struct ProtectedEUTRAResourceIndication_ExtIEs__extensionValue),
	offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs__extensionValue, present),
	sizeof(((struct ProtectedEUTRAResourceIndication_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_228 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_228	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ProtectedEUTRAResourceIndication_ExtIEs_225[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_226,  memb_id_constraint_225 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_227,  memb_criticality_constraint_225 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_228,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_228,  memb_extensionValue_constraint_225 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ProtectedEUTRAResourceIndication_ExtIEs_tag2el_225[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ProtectedEUTRAResourceIndication_ExtIEs_specs_225 = {
	sizeof(struct ProtectedEUTRAResourceIndication_ExtIEs),
	offsetof(struct ProtectedEUTRAResourceIndication_ExtIEs, _asn_ctx),
	asn_MAP_ProtectedEUTRAResourceIndication_ExtIEs_tag2el_225,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs = {
	"ProtectedEUTRAResourceIndication-ExtIEs",
	"ProtectedEUTRAResourceIndication-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225,
	sizeof(asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225)
		/sizeof(asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225[0]), /* 1 */
	asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225,	/* Same as above */
	sizeof(asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225)
		/sizeof(asn_DEF_ProtectedEUTRAResourceIndication_ExtIEs_tags_225[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ProtectedEUTRAResourceIndication_ExtIEs_225,
	3,	/* Elements count */
	&asn_SPC_ProtectedEUTRAResourceIndication_ExtIEs_specs_225	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_232 = {
	sizeof(struct ProtectedFootprintTimePattern_ExtIEs__extensionValue),
	offsetof(struct ProtectedFootprintTimePattern_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ProtectedFootprintTimePattern_ExtIEs__extensionValue, present),
	sizeof(((struct ProtectedFootprintTimePattern_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_232 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_232	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ProtectedFootprintTimePattern_ExtIEs_229[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedFootprintTimePattern_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_230,  memb_id_constraint_229 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedFootprintTimePattern_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_231,  memb_criticality_constraint_229 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ProtectedFootprintTimePattern_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_232,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_232,  memb_extensionValue_constraint_229 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ProtectedFootprintTimePattern_ExtIEs_tag2el_229[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ProtectedFootprintTimePattern_ExtIEs_specs_229 = {
	sizeof(struct ProtectedFootprintTimePattern_ExtIEs),
	offsetof(struct ProtectedFootprintTimePattern_ExtIEs, _asn_ctx),
	asn_MAP_ProtectedFootprintTimePattern_ExtIEs_tag2el_229,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ProtectedFootprintTimePattern_ExtIEs = {
	"ProtectedFootprintTimePattern-ExtIEs",
	"ProtectedFootprintTimePattern-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229,
	sizeof(asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229)
		/sizeof(asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229[0]), /* 1 */
	asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229,	/* Same as above */
	sizeof(asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229)
		/sizeof(asn_DEF_ProtectedFootprintTimePattern_ExtIEs_tags_229[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ProtectedFootprintTimePattern_ExtIEs_229,
	3,	/* Elements count */
	&asn_SPC_ProtectedFootprintTimePattern_ExtIEs_specs_229	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_236 = {
	sizeof(struct ProtectedResourceList_Item_ExtIEs__extensionValue),
	offsetof(struct ProtectedResourceList_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ProtectedResourceList_Item_ExtIEs__extensionValue, present),
	sizeof(((struct ProtectedResourceList_Item_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_236 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_236	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ProtectedResourceList_Item_ExtIEs_233[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_234,  memb_id_constraint_233 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_235,  memb_criticality_constraint_233 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ProtectedResourceList_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_236,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_236,  memb_extensionValue_constraint_233 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ProtectedResourceList_Item_ExtIEs_tag2el_233[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ProtectedResourceList_Item_ExtIEs_specs_233 = {
	sizeof(struct ProtectedResourceList_Item_ExtIEs),
	offsetof(struct ProtectedResourceList_Item_ExtIEs, _asn_ctx),
	asn_MAP_ProtectedResourceList_Item_ExtIEs_tag2el_233,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ProtectedResourceList_Item_ExtIEs = {
	"ProtectedResourceList-Item-ExtIEs",
	"ProtectedResourceList-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233,
	sizeof(asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233)
		/sizeof(asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233[0]), /* 1 */
	asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233,	/* Same as above */
	sizeof(asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233)
		/sizeof(asn_DEF_ProtectedResourceList_Item_ExtIEs_tags_233[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ProtectedResourceList_Item_ExtIEs_233,
	3,	/* Elements count */
	&asn_SPC_ProtectedResourceList_Item_ExtIEs_specs_233	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_extensionValue_240[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs__extensionValue, choice.DL_scheduling_PDCCH_CCE_usage),
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		&asn_DEF_DL_scheduling_PDCCH_CCE_usage,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"DL-scheduling-PDCCH-CCE-usage"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs__extensionValue, choice.UL_scheduling_PDCCH_CCE_usage),
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		&asn_DEF_UL_scheduling_PDCCH_CCE_usage,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"UL-scheduling-PDCCH-CCE-usage"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_240[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 0, 0, 1 }, /* DL-scheduling-PDCCH-CCE-usage */
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, -1, 0 } /* UL-scheduling-PDCCH-CCE-usage */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_240 = {
	sizeof(struct RadioResourceStatus_ExtIEs__extensionValue),
	offsetof(struct RadioResourceStatus_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct RadioResourceStatus_ExtIEs__extensionValue, present),
	sizeof(((struct RadioResourceStatus_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_240,
	2,	/* Count of tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_240 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_240,
	2,	/* Elements count */
	&asn_SPC_extensionValue_specs_240	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_RadioResourceStatus_ExtIEs_237[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_238,  memb_id_constraint_237 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_RadioResourceStatus_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_239,  memb_criticality_constraint_237 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RadioResourceStatus_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_240,
		select_RadioResourceStatus_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_240,  memb_extensionValue_constraint_237 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_RadioResourceStatus_ExtIEs_tags_237[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RadioResourceStatus_ExtIEs_tag2el_237[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_RadioResourceStatus_ExtIEs_specs_237 = {
	sizeof(struct RadioResourceStatus_ExtIEs),
	offsetof(struct RadioResourceStatus_ExtIEs, _asn_ctx),
	asn_MAP_RadioResourceStatus_ExtIEs_tag2el_237,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_RadioResourceStatus_ExtIEs = {
	"RadioResourceStatus-ExtIEs",
	"RadioResourceStatus-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_RadioResourceStatus_ExtIEs_tags_237,
	sizeof(asn_DEF_RadioResourceStatus_ExtIEs_tags_237)
		/sizeof(asn_DEF_RadioResourceStatus_ExtIEs_tags_237[0]), /* 1 */
	asn_DEF_RadioResourceStatus_ExtIEs_tags_237,	/* Same as above */
	sizeof(asn_DEF_RadioResourceStatus_ExtIEs_tags_237)
		/sizeof(asn_DEF_RadioResourceStatus_ExtIEs_tags_237[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_RadioResourceStatus_ExtIEs_237,
	3,	/* Elements count */
	&asn_SPC_RadioResourceStatus_ExtIEs_specs_237	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_extensionValue_244[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower_ExtIEs__extensionValue, choice.EnhancedRNTP),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_EnhancedRNTP,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"EnhancedRNTP"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_244[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 0 } /* EnhancedRNTP */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_244 = {
	sizeof(struct RelativeNarrowbandTxPower_ExtIEs__extensionValue),
	offsetof(struct RelativeNarrowbandTxPower_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct RelativeNarrowbandTxPower_ExtIEs__extensionValue, present),
	sizeof(((struct RelativeNarrowbandTxPower_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_244,
	1,	/* Count of tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_244 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_244,
	1,	/* Elements count */
	&asn_SPC_extensionValue_specs_244	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_RelativeNarrowbandTxPower_ExtIEs_241[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_242,  memb_id_constraint_241 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_RelativeNarrowbandTxPower_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_243,  memb_criticality_constraint_241 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RelativeNarrowbandTxPower_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_244,
		select_RelativeNarrowbandTxPower_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_244,  memb_extensionValue_constraint_241 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RelativeNarrowbandTxPower_ExtIEs_tag2el_241[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_RelativeNarrowbandTxPower_ExtIEs_specs_241 = {
	sizeof(struct RelativeNarrowbandTxPower_ExtIEs),
	offsetof(struct RelativeNarrowbandTxPower_ExtIEs, _asn_ctx),
	asn_MAP_RelativeNarrowbandTxPower_ExtIEs_tag2el_241,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_RelativeNarrowbandTxPower_ExtIEs = {
	"RelativeNarrowbandTxPower-ExtIEs",
	"RelativeNarrowbandTxPower-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241,
	sizeof(asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241)
		/sizeof(asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241[0]), /* 1 */
	asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241,	/* Same as above */
	sizeof(asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241)
		/sizeof(asn_DEF_RelativeNarrowbandTxPower_ExtIEs_tags_241[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_RelativeNarrowbandTxPower_ExtIEs_241,
	3,	/* Elements count */
	&asn_SPC_RelativeNarrowbandTxPower_ExtIEs_specs_241	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_248 = {
	sizeof(struct RSRPMeasurementResult_ExtIEs__extensionValue),
	offsetof(struct RSRPMeasurementResult_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct RSRPMeasurementResult_ExtIEs__extensionValue, present),
	sizeof(((struct RSRPMeasurementResult_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_248 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_248	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_RSRPMeasurementResult_ExtIEs_245[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMeasurementResult_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_246,  memb_id_constraint_245 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMeasurementResult_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_247,  memb_criticality_constraint_245 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RSRPMeasurementResult_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_248,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_248,  memb_extensionValue_constraint_245 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RSRPMeasurementResult_ExtIEs_tag2el_245[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_RSRPMeasurementResult_ExtIEs_specs_245 = {
	sizeof(struct RSRPMeasurementResult_ExtIEs),
	offsetof(struct RSRPMeasurementResult_ExtIEs, _asn_ctx),
	asn_MAP_RSRPMeasurementResult_ExtIEs_tag2el_245,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_RSRPMeasurementResult_ExtIEs = {
	"RSRPMeasurementResult-ExtIEs",
	"RSRPMeasurementResult-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245,
	sizeof(asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245)
		/sizeof(asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245[0]), /* 1 */
	asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245,	/* Same as above */
	sizeof(asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245)
		/sizeof(asn_DEF_RSRPMeasurementResult_ExtIEs_tags_245[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_RSRPMeasurementResult_ExtIEs_245,
	3,	/* Elements count */
	&asn_SPC_RSRPMeasurementResult_ExtIEs_specs_245	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_extensionValue_252[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMRList_ExtIEs__extensionValue, choice.UEID),
		(ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
		0,
		&asn_DEF_UEID,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"UEID"
		},
};
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_252[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 0, 0, 0 } /* UEID */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_252 = {
	sizeof(struct RSRPMRList_ExtIEs__extensionValue),
	offsetof(struct RSRPMRList_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct RSRPMRList_ExtIEs__extensionValue, present),
	sizeof(((struct RSRPMRList_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_252,
	1,	/* Count of tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_252 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_252,
	1,	/* Elements count */
	&asn_SPC_extensionValue_specs_252	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_RSRPMRList_ExtIEs_249[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMRList_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_250,  memb_id_constraint_249 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct RSRPMRList_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_RSRPMRList_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_251,  memb_criticality_constraint_249 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct RSRPMRList_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_252,
		select_RSRPMRList_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_252,  memb_extensionValue_constraint_249 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_RSRPMRList_ExtIEs_tags_249[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_RSRPMRList_ExtIEs_tag2el_249[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_RSRPMRList_ExtIEs_specs_249 = {
	sizeof(struct RSRPMRList_ExtIEs),
	offsetof(struct RSRPMRList_ExtIEs, _asn_ctx),
	asn_MAP_RSRPMRList_ExtIEs_tag2el_249,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_RSRPMRList_ExtIEs = {
	"RSRPMRList-ExtIEs",
	"RSRPMRList-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_RSRPMRList_ExtIEs_tags_249,
	sizeof(asn_DEF_RSRPMRList_ExtIEs_tags_249)
		/sizeof(asn_DEF_RSRPMRList_ExtIEs_tags_249[0]), /* 1 */
	asn_DEF_RSRPMRList_ExtIEs_tags_249,	/* Same as above */
	sizeof(asn_DEF_RSRPMRList_ExtIEs_tags_249)
		/sizeof(asn_DEF_RSRPMRList_ExtIEs_tags_249[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_RSRPMRList_ExtIEs_249,
	3,	/* Elements count */
	&asn_SPC_RSRPMRList_ExtIEs_specs_249	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_256 = {
	sizeof(struct S1TNLLoadIndicator_ExtIEs__extensionValue),
	offsetof(struct S1TNLLoadIndicator_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct S1TNLLoadIndicator_ExtIEs__extensionValue, present),
	sizeof(((struct S1TNLLoadIndicator_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_256 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_256	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_S1TNLLoadIndicator_ExtIEs_253[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct S1TNLLoadIndicator_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_254,  memb_id_constraint_253 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct S1TNLLoadIndicator_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_255,  memb_criticality_constraint_253 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct S1TNLLoadIndicator_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_256,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_256,  memb_extensionValue_constraint_253 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_S1TNLLoadIndicator_ExtIEs_tag2el_253[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_S1TNLLoadIndicator_ExtIEs_specs_253 = {
	sizeof(struct S1TNLLoadIndicator_ExtIEs),
	offsetof(struct S1TNLLoadIndicator_ExtIEs, _asn_ctx),
	asn_MAP_S1TNLLoadIndicator_ExtIEs_tag2el_253,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_S1TNLLoadIndicator_ExtIEs = {
	"S1TNLLoadIndicator-ExtIEs",
	"S1TNLLoadIndicator-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253,
	sizeof(asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253)
		/sizeof(asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253[0]), /* 1 */
	asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253,	/* Same as above */
	sizeof(asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253)
		/sizeof(asn_DEF_S1TNLLoadIndicator_ExtIEs_tags_253[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_S1TNLLoadIndicator_ExtIEs_253,
	3,	/* Elements count */
	&asn_SPC_S1TNLLoadIndicator_ExtIEs_specs_253	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_260 = {
	sizeof(struct ServedCell_ExtIEs__extensionValue),
	offsetof(struct ServedCell_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ServedCell_ExtIEs__extensionValue, present),
	sizeof(((struct ServedCell_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_260 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_260	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ServedCell_ExtIEs_257[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_258,  memb_id_constraint_257 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_259,  memb_criticality_constraint_257 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedCell_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_260,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_260,  memb_extensionValue_constraint_257 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ServedCell_ExtIEs_tags_257[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ServedCell_ExtIEs_tag2el_257[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ServedCell_ExtIEs_specs_257 = {
	sizeof(struct ServedCell_ExtIEs),
	offsetof(struct ServedCell_ExtIEs, _asn_ctx),
	asn_MAP_ServedCell_ExtIEs_tag2el_257,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ServedCell_ExtIEs = {
	"ServedCell-ExtIEs",
	"ServedCell-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ServedCell_ExtIEs_tags_257,
	sizeof(asn_DEF_ServedCell_ExtIEs_tags_257)
		/sizeof(asn_DEF_ServedCell_ExtIEs_tags_257[0]), /* 1 */
	asn_DEF_ServedCell_ExtIEs_tags_257,	/* Same as above */
	sizeof(asn_DEF_ServedCell_ExtIEs_tags_257)
		/sizeof(asn_DEF_ServedCell_ExtIEs_tags_257[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ServedCell_ExtIEs_257,
	3,	/* Elements count */
	&asn_SPC_ServedCell_ExtIEs_specs_257	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_extensionValue_264[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.Number_of_Antennaports),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_Number_of_Antennaports,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"Number-of-Antennaports"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.PRACH_Configuration),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_PRACH_Configuration,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"PRACH-Configuration"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.MBSFN_Subframe_Infolist),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_MBSFN_Subframe_Infolist,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"MBSFN-Subframe-Infolist"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.CSG_Id),
		(ASN_TAG_CLASS_UNIVERSAL | (3 << 2)),
		0,
		&asn_DEF_CSG_Id,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"CSG-Id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.MBMS_Service_Area_Identity_List),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_MBMS_Service_Area_Identity_List,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"MBMS-Service-Area-Identity-List"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.MultibandInfoList),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_MultibandInfoList,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"MultibandInfoList"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.FreqBandIndicatorPriority),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_FreqBandIndicatorPriority,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"FreqBandIndicatorPriority"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.BandwidthReducedSI),
		(ASN_TAG_CLASS_UNIVERSAL | (10 << 2)),
		0,
		&asn_DEF_BandwidthReducedSI,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"BandwidthReducedSI"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs__extensionValue, choice.ProtectedEUTRAResourceIndication),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_ProtectedEUTRAResourceIndication,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"ProtectedEUTRAResourceIndication"
		},
};
static const unsigned asn_MAP_extensionValue_to_canonical_264[] = { 3, 0, 6, 7, 1, 2, 4, 5, 8 };
static const unsigned asn_MAP_extensionValue_from_canonical_264[] = { 1, 4, 5, 0, 6, 7, 2, 3, 8 };
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_264[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)), 3, 0, 0 }, /* CSG-Id */
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 0, 0, 2 }, /* Number-of-Antennaports */
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 6, -1, 1 }, /* FreqBandIndicatorPriority */
    { (ASN_TAG_CLASS_UNIVERSAL | (10 << 2)), 7, -2, 0 }, /* BandwidthReducedSI */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 1, 0, 4 }, /* PRACH-Configuration */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 3 }, /* MBSFN-Subframe-Infolist */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 4, -2, 2 }, /* MBMS-Service-Area-Identity-List */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 5, -3, 1 }, /* MultibandInfoList */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 8, -4, 0 } /* ProtectedEUTRAResourceIndication */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_264 = {
	sizeof(struct ServedCell_Information_ExtIEs__extensionValue),
	offsetof(struct ServedCell_Information_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct ServedCell_Information_ExtIEs__extensionValue, present),
	sizeof(((struct ServedCell_Information_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_264,
	9,	/* Count of tags in the map */
	asn_MAP_extensionValue_to_canonical_264,
	asn_MAP_extensionValue_from_canonical_264,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_264 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_264,
	9,	/* Elements count */
	&asn_SPC_extensionValue_specs_264	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_ServedCell_Information_ExtIEs_261[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_262,  memb_id_constraint_261 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_ServedCell_Information_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_263,  memb_criticality_constraint_261 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct ServedCell_Information_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_264,
		select_ServedCell_Information_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_264,  memb_extensionValue_constraint_261 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_ServedCell_Information_ExtIEs_tags_261[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_ServedCell_Information_ExtIEs_tag2el_261[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_ServedCell_Information_ExtIEs_specs_261 = {
	sizeof(struct ServedCell_Information_ExtIEs),
	offsetof(struct ServedCell_Information_ExtIEs, _asn_ctx),
	asn_MAP_ServedCell_Information_ExtIEs_tag2el_261,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_ServedCell_Information_ExtIEs = {
	"ServedCell-Information-ExtIEs",
	"ServedCell-Information-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_ServedCell_Information_ExtIEs_tags_261,
	sizeof(asn_DEF_ServedCell_Information_ExtIEs_tags_261)
		/sizeof(asn_DEF_ServedCell_Information_ExtIEs_tags_261[0]), /* 1 */
	asn_DEF_ServedCell_Information_ExtIEs_tags_261,	/* Same as above */
	sizeof(asn_DEF_ServedCell_Information_ExtIEs_tags_261)
		/sizeof(asn_DEF_ServedCell_Information_ExtIEs_tags_261[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_ServedCell_Information_ExtIEs_261,
	3,	/* Elements count */
	&asn_SPC_ServedCell_Information_ExtIEs_specs_261	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_268 = {
	sizeof(struct SpecialSubframe_Info_ExtIEs__extensionValue),
	offsetof(struct SpecialSubframe_Info_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct SpecialSubframe_Info_ExtIEs__extensionValue, present),
	sizeof(((struct SpecialSubframe_Info_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_268 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_268	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_SpecialSubframe_Info_ExtIEs_265[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SpecialSubframe_Info_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_266,  memb_id_constraint_265 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SpecialSubframe_Info_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_267,  memb_criticality_constraint_265 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SpecialSubframe_Info_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_268,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_268,  memb_extensionValue_constraint_265 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SpecialSubframe_Info_ExtIEs_tag2el_265[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_SpecialSubframe_Info_ExtIEs_specs_265 = {
	sizeof(struct SpecialSubframe_Info_ExtIEs),
	offsetof(struct SpecialSubframe_Info_ExtIEs, _asn_ctx),
	asn_MAP_SpecialSubframe_Info_ExtIEs_tag2el_265,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_SpecialSubframe_Info_ExtIEs = {
	"SpecialSubframe-Info-ExtIEs",
	"SpecialSubframe-Info-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265,
	sizeof(asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265)
		/sizeof(asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265[0]), /* 1 */
	asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265,	/* Same as above */
	sizeof(asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265)
		/sizeof(asn_DEF_SpecialSubframe_Info_ExtIEs_tags_265[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_SpecialSubframe_Info_ExtIEs_265,
	3,	/* Elements count */
	&asn_SPC_SpecialSubframe_Info_ExtIEs_specs_265	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_272 = {
	sizeof(struct SubbandCQI_ExtIEs__extensionValue),
	offsetof(struct SubbandCQI_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct SubbandCQI_ExtIEs__extensionValue, present),
	sizeof(((struct SubbandCQI_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_272 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_272	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_SubbandCQI_ExtIEs_269[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQI_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_270,  memb_id_constraint_269 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQI_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_271,  memb_criticality_constraint_269 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SubbandCQI_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_272,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_272,  memb_extensionValue_constraint_269 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_SubbandCQI_ExtIEs_tags_269[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SubbandCQI_ExtIEs_tag2el_269[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_SubbandCQI_ExtIEs_specs_269 = {
	sizeof(struct SubbandCQI_ExtIEs),
	offsetof(struct SubbandCQI_ExtIEs, _asn_ctx),
	asn_MAP_SubbandCQI_ExtIEs_tag2el_269,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_SubbandCQI_ExtIEs = {
	"SubbandCQI-ExtIEs",
	"SubbandCQI-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_SubbandCQI_ExtIEs_tags_269,
	sizeof(asn_DEF_SubbandCQI_ExtIEs_tags_269)
		/sizeof(asn_DEF_SubbandCQI_ExtIEs_tags_269[0]), /* 1 */
	asn_DEF_SubbandCQI_ExtIEs_tags_269,	/* Same as above */
	sizeof(asn_DEF_SubbandCQI_ExtIEs_tags_269)
		/sizeof(asn_DEF_SubbandCQI_ExtIEs_tags_269[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_SubbandCQI_ExtIEs_269,
	3,	/* Elements count */
	&asn_SPC_SubbandCQI_ExtIEs_specs_269	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_276 = {
	sizeof(struct SubbandCQIItem_ExtIEs__extensionValue),
	offsetof(struct SubbandCQIItem_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct SubbandCQIItem_ExtIEs__extensionValue, present),
	sizeof(((struct SubbandCQIItem_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_276 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_276	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_SubbandCQIItem_ExtIEs_273[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQIItem_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_274,  memb_id_constraint_273 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SubbandCQIItem_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_275,  memb_criticality_constraint_273 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SubbandCQIItem_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_276,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_276,  memb_extensionValue_constraint_273 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_SubbandCQIItem_ExtIEs_tags_273[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SubbandCQIItem_ExtIEs_tag2el_273[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_SubbandCQIItem_ExtIEs_specs_273 = {
	sizeof(struct SubbandCQIItem_ExtIEs),
	offsetof(struct SubbandCQIItem_ExtIEs, _asn_ctx),
	asn_MAP_SubbandCQIItem_ExtIEs_tag2el_273,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_SubbandCQIItem_ExtIEs = {
	"SubbandCQIItem-ExtIEs",
	"SubbandCQIItem-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_SubbandCQIItem_ExtIEs_tags_273,
	sizeof(asn_DEF_SubbandCQIItem_ExtIEs_tags_273)
		/sizeof(asn_DEF_SubbandCQIItem_ExtIEs_tags_273[0]), /* 1 */
	asn_DEF_SubbandCQIItem_ExtIEs_tags_273,	/* Same as above */
	sizeof(asn_DEF_SubbandCQIItem_ExtIEs_tags_273)
		/sizeof(asn_DEF_SubbandCQIItem_ExtIEs_tags_273[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_SubbandCQIItem_ExtIEs_273,
	3,	/* Elements count */
	&asn_SPC_SubbandCQIItem_ExtIEs_specs_273	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_280 = {
	sizeof(struct SULInformation_ExtIEs__extensionValue),
	offsetof(struct SULInformation_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct SULInformation_ExtIEs__extensionValue, present),
	sizeof(((struct SULInformation_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_280 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_280	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_SULInformation_ExtIEs_277[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SULInformation_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_278,  memb_id_constraint_277 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SULInformation_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_279,  memb_criticality_constraint_277 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SULInformation_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_280,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_280,  memb_extensionValue_constraint_277 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_SULInformation_ExtIEs_tags_277[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SULInformation_ExtIEs_tag2el_277[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_SULInformation_ExtIEs_specs_277 = {
	sizeof(struct SULInformation_ExtIEs),
	offsetof(struct SULInformation_ExtIEs, _asn_ctx),
	asn_MAP_SULInformation_ExtIEs_tag2el_277,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_SULInformation_ExtIEs = {
	"SULInformation-ExtIEs",
	"SULInformation-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_SULInformation_ExtIEs_tags_277,
	sizeof(asn_DEF_SULInformation_ExtIEs_tags_277)
		/sizeof(asn_DEF_SULInformation_ExtIEs_tags_277[0]), /* 1 */
	asn_DEF_SULInformation_ExtIEs_tags_277,	/* Same as above */
	sizeof(asn_DEF_SULInformation_ExtIEs_tags_277)
		/sizeof(asn_DEF_SULInformation_ExtIEs_tags_277[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_SULInformation_ExtIEs_277,
	3,	/* Elements count */
	&asn_SPC_SULInformation_ExtIEs_specs_277	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_284 = {
	sizeof(struct SupportedSULFreqBandItem_ExtIEs__extensionValue),
	offsetof(struct SupportedSULFreqBandItem_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct SupportedSULFreqBandItem_ExtIEs__extensionValue, present),
	sizeof(((struct SupportedSULFreqBandItem_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_284 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_284	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_SupportedSULFreqBandItem_ExtIEs_281[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct SupportedSULFreqBandItem_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_282,  memb_id_constraint_281 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct SupportedSULFreqBandItem_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_283,  memb_criticality_constraint_281 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct SupportedSULFreqBandItem_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_284,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_284,  memb_extensionValue_constraint_281 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_SupportedSULFreqBandItem_ExtIEs_tag2el_281[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_SupportedSULFreqBandItem_ExtIEs_specs_281 = {
	sizeof(struct SupportedSULFreqBandItem_ExtIEs),
	offsetof(struct SupportedSULFreqBandItem_ExtIEs, _asn_ctx),
	asn_MAP_SupportedSULFreqBandItem_ExtIEs_tag2el_281,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_SupportedSULFreqBandItem_ExtIEs = {
	"SupportedSULFreqBandItem-ExtIEs",
	"SupportedSULFreqBandItem-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281,
	sizeof(asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281)
		/sizeof(asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281[0]), /* 1 */
	asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281,	/* Same as above */
	sizeof(asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281)
		/sizeof(asn_DEF_SupportedSULFreqBandItem_ExtIEs_tags_281[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_SupportedSULFreqBandItem_ExtIEs_281,
	3,	/* Elements count */
	&asn_SPC_SupportedSULFreqBandItem_ExtIEs_specs_281	/* Additional specs */
};

static asn_TYPE_member_t asn_MBR_extensionValue_288[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs__extensionValue, choice.AdditionalSpecialSubframe_Info),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_AdditionalSpecialSubframe_Info,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"AdditionalSpecialSubframe-Info"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs__extensionValue, choice.EARFCNExtension),
		(ASN_TAG_CLASS_UNIVERSAL | (2 << 2)),
		0,
		&asn_DEF_EARFCNExtension,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"EARFCNExtension"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs__extensionValue, choice.AdditionalSpecialSubframeExtension_Info),
		(ASN_TAG_CLASS_UNIVERSAL | (16 << 2)),
		0,
		&asn_DEF_AdditionalSpecialSubframeExtension_Info,
		0,
		{ 0, 0, 0 },
		0, 0, /* No default value */
		"AdditionalSpecialSubframeExtension-Info"
		},
};
static const unsigned asn_MAP_extensionValue_to_canonical_288[] = { 1, 0, 2 };
static const unsigned asn_MAP_extensionValue_from_canonical_288[] = { 1, 0, 2 };
static const asn_TYPE_tag2member_t asn_MAP_extensionValue_tag2el_288[] = {
    { (ASN_TAG_CLASS_UNIVERSAL | (2 << 2)), 1, 0, 0 }, /* EARFCNExtension */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 0, 0, 1 }, /* AdditionalSpecialSubframe-Info */
    { (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)), 2, -1, 0 } /* AdditionalSpecialSubframeExtension-Info */
};
static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_288 = {
	sizeof(struct TDD_Info_ExtIEs__extensionValue),
	offsetof(struct TDD_Info_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct TDD_Info_ExtIEs__extensionValue, present),
	sizeof(((struct TDD_Info_ExtIEs__extensionValue *)0)->present),
	asn_MAP_extensionValue_tag2el_288,
	3,	/* Count of tags in the map */
	asn_MAP_extensionValue_to_canonical_288,
	asn_MAP_extensionValue_from_canonical_288,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_288 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	asn_MBR_extensionValue_288,
	3,	/* Elements count */
	&asn_SPC_extensionValue_specs_288	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_TDD_Info_ExtIEs_285[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_286,  memb_id_constraint_285 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		select_TDD_Info_ExtIEs_criticality_type,
		{ 0, &asn_PER_memb_criticality_constr_287,  memb_criticality_constraint_285 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct TDD_Info_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_288,
		select_TDD_Info_ExtIEs_extensionValue_type,
		{ 0, &asn_PER_memb_extensionValue_constr_288,  memb_extensionValue_constraint_285 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_TDD_Info_ExtIEs_tags_285[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_TDD_Info_ExtIEs_tag2el_285[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_TDD_Info_ExtIEs_specs_285 = {
	sizeof(struct TDD_Info_ExtIEs),
	offsetof(struct TDD_Info_ExtIEs, _asn_ctx),
	asn_MAP_TDD_Info_ExtIEs_tag2el_285,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_TDD_Info_ExtIEs = {
	"TDD-Info-ExtIEs",
	"TDD-Info-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_TDD_Info_ExtIEs_tags_285,
	sizeof(asn_DEF_TDD_Info_ExtIEs_tags_285)
		/sizeof(asn_DEF_TDD_Info_ExtIEs_tags_285[0]), /* 1 */
	asn_DEF_TDD_Info_ExtIEs_tags_285,	/* Same as above */
	sizeof(asn_DEF_TDD_Info_ExtIEs_tags_285)
		/sizeof(asn_DEF_TDD_Info_ExtIEs_tags_285[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_TDD_Info_ExtIEs_285,
	3,	/* Elements count */
	&asn_SPC_TDD_Info_ExtIEs_specs_285	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_292 = {
	sizeof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue),
	offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue, present),
	sizeof(((struct UL_HighInterferenceIndicationInfo_Item_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_292 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_292	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_UL_HighInterferenceIndicationInfo_Item_ExtIEs_289[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_290,  memb_id_constraint_289 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_291,  memb_criticality_constraint_289 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_292,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_292,  memb_extensionValue_constraint_289 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tag2el_289[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_UL_HighInterferenceIndicationInfo_Item_ExtIEs_specs_289 = {
	sizeof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs),
	offsetof(struct UL_HighInterferenceIndicationInfo_Item_ExtIEs, _asn_ctx),
	asn_MAP_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tag2el_289,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs = {
	"UL-HighInterferenceIndicationInfo-Item-ExtIEs",
	"UL-HighInterferenceIndicationInfo-Item-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289,
	sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289)
		/sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289[0]), /* 1 */
	asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289,	/* Same as above */
	sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289)
		/sizeof(asn_DEF_UL_HighInterferenceIndicationInfo_Item_ExtIEs_tags_289[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_UL_HighInterferenceIndicationInfo_Item_ExtIEs_289,
	3,	/* Elements count */
	&asn_SPC_UL_HighInterferenceIndicationInfo_Item_ExtIEs_specs_289	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_296 = {
	sizeof(struct UsableABSInformationFDD_ExtIEs__extensionValue),
	offsetof(struct UsableABSInformationFDD_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct UsableABSInformationFDD_ExtIEs__extensionValue, present),
	sizeof(((struct UsableABSInformationFDD_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_296 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_296	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_UsableABSInformationFDD_ExtIEs_293[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationFDD_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_294,  memb_id_constraint_293 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationFDD_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_295,  memb_criticality_constraint_293 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationFDD_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_296,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_296,  memb_extensionValue_constraint_293 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_UsableABSInformationFDD_ExtIEs_tag2el_293[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationFDD_ExtIEs_specs_293 = {
	sizeof(struct UsableABSInformationFDD_ExtIEs),
	offsetof(struct UsableABSInformationFDD_ExtIEs, _asn_ctx),
	asn_MAP_UsableABSInformationFDD_ExtIEs_tag2el_293,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_UsableABSInformationFDD_ExtIEs = {
	"UsableABSInformationFDD-ExtIEs",
	"UsableABSInformationFDD-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293,
	sizeof(asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293)
		/sizeof(asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293[0]), /* 1 */
	asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293,	/* Same as above */
	sizeof(asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293)
		/sizeof(asn_DEF_UsableABSInformationFDD_ExtIEs_tags_293[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_UsableABSInformationFDD_ExtIEs_293,
	3,	/* Elements count */
	&asn_SPC_UsableABSInformationFDD_ExtIEs_specs_293	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_300 = {
	sizeof(struct UsableABSInformationTDD_ExtIEs__extensionValue),
	offsetof(struct UsableABSInformationTDD_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct UsableABSInformationTDD_ExtIEs__extensionValue, present),
	sizeof(((struct UsableABSInformationTDD_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_300 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_300	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_UsableABSInformationTDD_ExtIEs_297[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationTDD_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_298,  memb_id_constraint_297 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationTDD_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_299,  memb_criticality_constraint_297 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct UsableABSInformationTDD_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_300,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_300,  memb_extensionValue_constraint_297 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_UsableABSInformationTDD_ExtIEs_tag2el_297[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_UsableABSInformationTDD_ExtIEs_specs_297 = {
	sizeof(struct UsableABSInformationTDD_ExtIEs),
	offsetof(struct UsableABSInformationTDD_ExtIEs, _asn_ctx),
	asn_MAP_UsableABSInformationTDD_ExtIEs_tag2el_297,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_UsableABSInformationTDD_ExtIEs = {
	"UsableABSInformationTDD-ExtIEs",
	"UsableABSInformationTDD-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297,
	sizeof(asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297)
		/sizeof(asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297[0]), /* 1 */
	asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297,	/* Same as above */
	sizeof(asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297)
		/sizeof(asn_DEF_UsableABSInformationTDD_ExtIEs_tags_297[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_UsableABSInformationTDD_ExtIEs_297,
	3,	/* Elements count */
	&asn_SPC_UsableABSInformationTDD_ExtIEs_specs_297	/* Additional specs */
};

static asn_CHOICE_specifics_t asn_SPC_extensionValue_specs_304 = {
	sizeof(struct WidebandCQI_ExtIEs__extensionValue),
	offsetof(struct WidebandCQI_ExtIEs__extensionValue, _asn_ctx),
	offsetof(struct WidebandCQI_ExtIEs__extensionValue, present),
	sizeof(((struct WidebandCQI_ExtIEs__extensionValue *)0)->present),
	0,	/* No top level tags */
	0,	/* No tags in the map */
	0, 0,
	-1	/* Extensions start */
};
static /* Use -fall-defs-global to expose */
asn_TYPE_descriptor_t asn_DEF_extensionValue_304 = {
	"extensionValue",
	"extensionValue",
	&asn_OP_OPEN_TYPE,
	0,	/* No effective tags (pointer) */
	0,	/* No effective tags (count) */
	0,	/* No tags (pointer) */
	0,	/* No tags (count) */
	{ 0, 0, OPEN_TYPE_constraint },
	0, 0,	/* No members */
	&asn_SPC_extensionValue_specs_304	/* Additional specs */
};

asn_TYPE_member_t asn_MBR_WidebandCQI_ExtIEs_301[] = {
	{ ATF_NOFLAGS, 0, offsetof(struct WidebandCQI_ExtIEs, id),
		(ASN_TAG_CLASS_CONTEXT | (0 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_ProtocolIE_ID,
		0,
		{ 0, &asn_PER_memb_id_constr_302,  memb_id_constraint_301 },
		0, 0, /* No default value */
		"id"
		},
	{ ATF_NOFLAGS, 0, offsetof(struct WidebandCQI_ExtIEs, criticality),
		(ASN_TAG_CLASS_CONTEXT | (1 << 2)),
		-1,	/* IMPLICIT tag at current level */
		&asn_DEF_Criticality,
		0,
		{ 0, &asn_PER_memb_criticality_constr_303,  memb_criticality_constraint_301 },
		0, 0, /* No default value */
		"criticality"
		},
	{ ATF_OPEN_TYPE | ATF_NOFLAGS, 0, offsetof(struct WidebandCQI_ExtIEs, extensionValue),
		(ASN_TAG_CLASS_CONTEXT | (2 << 2)),
		+1,	/* EXPLICIT tag at current level */
		&asn_DEF_extensionValue_304,
		0,
		{ 0, &asn_PER_memb_extensionValue_constr_304,  memb_extensionValue_constraint_301 },
		0, 0, /* No default value */
		"extensionValue"
		},
};
static const ber_tlv_tag_t asn_DEF_WidebandCQI_ExtIEs_tags_301[] = {
	(ASN_TAG_CLASS_UNIVERSAL | (16 << 2))
};
static const asn_TYPE_tag2member_t asn_MAP_WidebandCQI_ExtIEs_tag2el_301[] = {
    { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* id */
    { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* criticality */
    { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* extensionValue */
};
asn_SEQUENCE_specifics_t asn_SPC_WidebandCQI_ExtIEs_specs_301 = {
	sizeof(struct WidebandCQI_ExtIEs),
	offsetof(struct WidebandCQI_ExtIEs, _asn_ctx),
	asn_MAP_WidebandCQI_ExtIEs_tag2el_301,
	3,	/* Count of tags in the map */
	0, 0, 0,	/* Optional elements (not needed) */
	-1,	/* First extension addition */
};
asn_TYPE_descriptor_t asn_DEF_WidebandCQI_ExtIEs = {
	"WidebandCQI-ExtIEs",
	"WidebandCQI-ExtIEs",
	&asn_OP_SEQUENCE,
	asn_DEF_WidebandCQI_ExtIEs_tags_301,
	sizeof(asn_DEF_WidebandCQI_ExtIEs_tags_301)
		/sizeof(asn_DEF_WidebandCQI_ExtIEs_tags_301[0]), /* 1 */
	asn_DEF_WidebandCQI_ExtIEs_tags_301,	/* Same as above */
	sizeof(asn_DEF_WidebandCQI_ExtIEs_tags_301)
		/sizeof(asn_DEF_WidebandCQI_ExtIEs_tags_301[0]), /* 1 */
	{ 0, 0, SEQUENCE_constraint },
	asn_MBR_WidebandCQI_ExtIEs_301,
	3,	/* Elements count */
	&asn_SPC_WidebandCQI_ExtIEs_specs_301	/* Additional specs */
};

