Commit 307b763b authored by WEI-TAI CHEN's avatar WEI-TAI CHEN

-Uppdate RRC ASN1 Version to 38331-f21

But NR-RRC-Definitions.asn file only include the NR-RRC-Definitions DEFINITIONS section
If we include the NR-UE-Variables into asn file, it will can't be compile in asn tool
and also some of implict problem for new version asn file
parent 2ed120d2
...@@ -353,15 +353,18 @@ add_custom_command ( ...@@ -353,15 +353,18 @@ add_custom_command (
add_list2_option(NR_RRC_ASN1_VERSION "NR_Rel15" "ASN.1 version of NR_RRC interface") add_list2_option(NR_RRC_ASN1_VERSION "NR_Rel15" "ASN.1 version of NR_RRC interface")
if (${NR_RRC_ASN1_VERSION} STREQUAL "NR_Rel15") if (${NR_RRC_ASN1_VERSION} STREQUAL "NR_Rel15")
set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/NR-RRC-38331-f10.asn) set (NR_RRC_GRAMMAR ${OPENAIR2_DIR}/RRC/NR/MESSAGES/asn1c/ASN1_files/NR-RRC-Definitions.asn)
endif (${NR_RRC_ASN1_VERSION} STREQUAL "NR_Rel15") endif (${NR_RRC_ASN1_VERSION} STREQUAL "NR_Rel15")
set (NR_RRC_FULL_DIR ${asn1_generated_dir}/${NR_RRC_ASN1_VERSION}) set (NR_RRC_FULL_DIR ${asn1_generated_dir}/${NR_RRC_ASN1_VERSION})
message("calling ASN1C_PREFIX=NR_ asn1c -gen-PER -fcompound-names -findirect-choice -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR}") message("calling ASN1C_PREFIX=NR_ asn1c -gen-PER -fcompound-names -findirect-choice -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR}")
execute_process(COMMAND mkdir -p ${NR_RRC_FULL_DIR} execute_process(COMMAND mkdir -p ${NR_RRC_FULL_DIR}
COMMAND env "ASN1C_PREFIX=NR_" asn1c -gen-PER -fcompound-names -findirect-choice -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR} COMMAND env "ASN1C_PREFIX=NR_" asn1c -fcompound-names -findirect-choice -gen-PER -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR}
RESULT_VARIABLE ret) RESULT_VARIABLE ret
OUTPUT_QUIET
ERROR_QUIET
)
if (NOT ${ret} STREQUAL 0) if (NOT ${ret} STREQUAL 0)
...@@ -381,10 +384,9 @@ include_directories ("${NR_RRC_FULL_DIR}") ...@@ -381,10 +384,9 @@ include_directories ("${NR_RRC_FULL_DIR}")
# add the command to generate the source code # add the command to generate the source code
# Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make # Warning: if you modify ASN.1 source file to generate new C files, cmake should be re-run instead of make
add_custom_command ( add_custom_command (OUTPUT ${NR_RRC_FULL_DIR}/NR_asn1_constants.h
OUTPUT ${NR_RRC_FULL_DIR}/NR_asn1_constants.h
COMMAND mkdir -p ${NR_RRC_FULL_DIR} COMMAND mkdir -p ${NR_RRC_FULL_DIR}
COMMAND env "ASN1C_PREFIX=NR_" asn1c -gen-PER -fcompound-names -findirect-choice -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR} #COMMAND env "ASN1C_PREFIX=NR_" asn1c -gen-PER -fcompound-names -findirect-choice -no-gen-example -D ${NR_RRC_FULL_DIR} ${NR_RRC_GRAMMAR}
DEPENDS ${NR_RRC_GRAMMAR} DEPENDS ${NR_RRC_GRAMMAR}
) )
...@@ -417,7 +419,9 @@ message("calling ASN1C_PREFIX=S1AP_ asn1c -fcompound-names -fno-include-deps -ge ...@@ -417,7 +419,9 @@ message("calling ASN1C_PREFIX=S1AP_ asn1c -fcompound-names -fno-include-deps -ge
execute_process(COMMAND mkdir -p ${S1AP_C_DIR} execute_process(COMMAND mkdir -p ${S1AP_C_DIR}
COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES} COMMAND env "ASN1C_PREFIX=S1AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${S1AP_C_DIR} ${S1AP_ASN_DIR}/${S1AP_ASN_FILES}
RESULT_VARIABLE ret) RESULT_VARIABLE ret
OUTPUT_QUIET
ERROR_QUIET)
if (NOT ${ret} STREQUAL 0) if (NOT ${ret} STREQUAL 0)
...@@ -484,7 +488,9 @@ message("calling asn1c -fcompound-names -fno-include-deps -gen-PER -no-gen-OER - ...@@ -484,7 +488,9 @@ message("calling asn1c -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -
execute_process(COMMAND mkdir -p ${X2AP_C_DIR} execute_process(COMMAND mkdir -p ${X2AP_C_DIR}
COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES} COMMAND env "ASN1C_PREFIX=X2AP_" asn1c -pdu=all -fcompound-names -fno-include-deps -gen-PER -no-gen-OER -no-gen-example -D ${X2AP_C_DIR} ${X2AP_ASN_DIR}/${X2AP_ASN_FILES}
RESULT_VARIABLE ret) RESULT_VARIABLE ret
OUTPUT_QUIET
ERROR_QUIET)
#execute_process(COMMAND ${asn1c_call} #execute_process(COMMAND ${asn1c_call}
# ${X2AP_C_DIR} # ${X2AP_C_DIR}
...@@ -2177,6 +2183,7 @@ target_link_libraries (lte-uesoftmodem-nos1 ${T_LIB}) ...@@ -2177,6 +2183,7 @@ target_link_libraries (lte-uesoftmodem-nos1 ${T_LIB})
add_executable(nr-softmodem add_executable(nr-softmodem
${rrc_h} ${rrc_h}
${nr_rrc_h}
${s1ap_h} ${s1ap_h}
${OPENAIR_BIN_DIR}/messages_xml.h ${OPENAIR_BIN_DIR}/messages_xml.h
${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c
......
...@@ -275,14 +275,12 @@ typedef struct NRRrcConfigurationReq_s { ...@@ -275,14 +275,12 @@ typedef struct NRRrcConfigurationReq_s {
long SIB1_ss_PBCH_BlockPower[MAX_NUM_CCs]; long SIB1_ss_PBCH_BlockPower[MAX_NUM_CCs];
//NR FrequencyInfoDL //NR FrequencyInfoDL
long absoluteFrequencySSB[MAX_NUM_CCs]; long absoluteFrequencySSB[MAX_NUM_CCs];
uint32_t ssb_SubcarrierOffset[MAX_NUM_CCs];
long DL_FreqBandIndicatorNR[MAX_NUM_CCs]; long DL_FreqBandIndicatorNR[MAX_NUM_CCs];
long DL_absoluteFrequencyPointA[MAX_NUM_CCs]; long DL_absoluteFrequencyPointA[MAX_NUM_CCs];
//NR DL SCS-SpecificCarrier //NR DL SCS-SpecificCarrier
uint32_t DL_offsetToCarrier[MAX_NUM_CCs]; uint32_t DL_offsetToCarrier[MAX_NUM_CCs];
long DL_SCS_SubcarrierSpacing[MAX_NUM_CCs]; long DL_SCS_SubcarrierSpacing[MAX_NUM_CCs];
long DL_SCS_SpecificCarrier_k0[MAX_NUM_CCs];
uint32_t DL_carrierBandwidth[MAX_NUM_CCs]; uint32_t DL_carrierBandwidth[MAX_NUM_CCs];
//NR BWP-DownlinkCommon //NR BWP-DownlinkCommon
...@@ -300,14 +298,13 @@ typedef struct NRRrcConfigurationReq_s { ...@@ -300,14 +298,13 @@ typedef struct NRRrcConfigurationReq_s {
//NR UL SCS-SpecificCarrier //NR UL SCS-SpecificCarrier
uint32_t UL_offsetToCarrier[MAX_NUM_CCs]; uint32_t UL_offsetToCarrier[MAX_NUM_CCs];
long UL_SCS_SubcarrierSpacing[MAX_NUM_CCs]; long UL_SCS_SubcarrierSpacing[MAX_NUM_CCs];
long UL_SCS_SpecificCarrier_k0[MAX_NUM_CCs];
uint32_t UL_carrierBandwidth[MAX_NUM_CCs]; uint32_t UL_carrierBandwidth[MAX_NUM_CCs];
// NR BWP-UplinkCommon // NR BWP-UplinkCommon
uint32_t UL_locationAndBandwidth[MAX_NUM_CCs]; uint32_t UL_locationAndBandwidth[MAX_NUM_CCs];
long UL_BWP_SubcarrierSpacing[MAX_NUM_CCs]; long UL_BWP_SubcarrierSpacing[MAX_NUM_CCs];
lte_prefix_type_t UL_BWP_prefix_type[MAX_NUM_CCs]; lte_prefix_type_t UL_BWP_prefix_type[MAX_NUM_CCs];
long UL_timeAlignmentTimerCommon[MAX_NUM_CCs];
long ServingCellConfigCommon_ssb_PositionsInBurst_PR[MAX_NUM_CCs]; long ServingCellConfigCommon_ssb_PositionsInBurst_PR[MAX_NUM_CCs];
long ServingCellConfigCommon_ssb_periodicityServingCell[MAX_NUM_CCs]; //ServingCellConfigCommon long ServingCellConfigCommon_ssb_periodicityServingCell[MAX_NUM_CCs]; //ServingCellConfigCommon
long ServingCellConfigCommon_dmrs_TypeA_Position[MAX_NUM_CCs]; //ServingCellConfigCommon long ServingCellConfigCommon_dmrs_TypeA_Position[MAX_NUM_CCs]; //ServingCellConfigCommon
...@@ -367,16 +364,19 @@ typedef struct NRRrcConfigurationReq_s { ...@@ -367,16 +364,19 @@ typedef struct NRRrcConfigurationReq_s {
///NR PUSCH-TimeDomainResourceAllocation ///NR PUSCH-TimeDomainResourceAllocation
uint32_t PUSCH_TimeDomainResourceAllocation_k2[MAX_NUM_CCs]; uint32_t PUSCH_TimeDomainResourceAllocation_k2[MAX_NUM_CCs];
long PUSCH_TimeDomainResourceAllocation_mappingType[MAX_NUM_CCs]; long PUSCH_TimeDomainResourceAllocation_mappingType[MAX_NUM_CCs];
uint32_t PUSCH_TimeDomainResourceAllocation_startSymbolAndLength[MAX_NUM_CCs];
//NR PUCCH-ConfigCommon //NR PUCCH-ConfigCommon
uint32_t pucch_ResourceCommon[MAX_NUM_CCs];
long pucch_GroupHopping[MAX_NUM_CCs]; long pucch_GroupHopping[MAX_NUM_CCs];
uint32_t hoppingId[MAX_NUM_CCs];
long p0_nominal[MAX_NUM_CCs]; long p0_nominal[MAX_NUM_CCs];
//NR PDSCH-ConfigCOmmon //NR PDSCH-ConfigCOmmon
//NR PDSCH-TimeDomainResourceAllocation //NR PDSCH-TimeDomainResourceAllocation
uint32_t PDSCH_TimeDomainResourceAllocation_k0[MAX_NUM_CCs]; uint32_t PDSCH_TimeDomainResourceAllocation_k0[MAX_NUM_CCs];
long PDSCH_TimeDomainResourceAllocation_mappingType[MAX_NUM_CCs]; long PDSCH_TimeDomainResourceAllocation_mappingType[MAX_NUM_CCs];
long PDSCH_TimeDomainResourceAllocation_startSymbolAndLength[MAX_NUM_CCs];
//NR RateMatchPattern is used to configure one rate matching pattern for PDSCH //NR RateMatchPattern is used to configure one rate matching pattern for PDSCH
long rateMatchPatternId[MAX_NUM_CCs]; long rateMatchPatternId[MAX_NUM_CCs];
...@@ -388,11 +388,12 @@ typedef struct NRRrcConfigurationReq_s { ...@@ -388,11 +388,12 @@ typedef struct NRRrcConfigurationReq_s {
long RateMatchPattern_mode[MAX_NUM_CCs]; long RateMatchPattern_mode[MAX_NUM_CCs];
//NR PDCCH-ConfigCommon //NR PDCCH-ConfigCommon
uint32_t controlResourceSetZero[MAX_NUM_CCs];
uint32_t searchSpaceZero[MAX_NUM_CCs];
long searchSpaceSIB1[MAX_NUM_CCs]; long searchSpaceSIB1[MAX_NUM_CCs];
long searchSpaceOtherSystemInformation[MAX_NUM_CCs]; long searchSpaceOtherSystemInformation[MAX_NUM_CCs];
long pagingSearchSpace[MAX_NUM_CCs]; long pagingSearchSpace[MAX_NUM_CCs];
long ra_SearchSpace[MAX_NUM_CCs]; long ra_SearchSpace[MAX_NUM_CCs];
long rach_ra_ControlResourceSet[MAX_NUM_CCs];
//NR PDCCH-ConfigCommon commonControlResourcesSets //NR PDCCH-ConfigCommon commonControlResourcesSets
long PDCCH_common_controlResourceSetId[MAX_NUM_CCs]; long PDCCH_common_controlResourceSetId[MAX_NUM_CCs];
long PDCCH_common_ControlResourceSet_duration[MAX_NUM_CCs]; long PDCCH_common_ControlResourceSet_duration[MAX_NUM_CCs];
...@@ -403,19 +404,15 @@ typedef struct NRRrcConfigurationReq_s { ...@@ -403,19 +404,15 @@ typedef struct NRRrcConfigurationReq_s {
long PDCCH_precoderGranularity[MAX_NUM_CCs]; //Corresponds to L1 parameter 'CORESET-precoder-granuality' long PDCCH_precoderGranularity[MAX_NUM_CCs]; //Corresponds to L1 parameter 'CORESET-precoder-granuality'
long PDCCH_TCI_StateId[MAX_NUM_CCs]; long PDCCH_TCI_StateId[MAX_NUM_CCs];
BOOLEAN_t tci_PresentInDCI[MAX_NUM_CCs]; BOOLEAN_t tci_PresentInDCI[MAX_NUM_CCs];
uint32_t PDCCH_DMRS_ScramblingID[MAX_NUM_CCs];
uint8_t frequencyDomainResources_buf[6];
//NR PDCCH-ConfigCommon commonSearchSpaces //NR PDCCH-ConfigCommon commonSearchSpaces
long SearchSpaceId[MAX_NUM_CCs]; long SearchSpaceId[MAX_NUM_CCs];
long commonSearchSpaces_controlResourceSetId[MAX_NUM_CCs]; long commonSearchSpaces_controlResourceSetId[MAX_NUM_CCs];
long SearchSpace_monitoringSlotPeriodicityAndOffset_choice[MAX_NUM_CCs]; long SearchSpace_monitoringSlotPeriodicityAndOffset_choice[MAX_NUM_CCs];
long SearchSpace_monitoringSlotPeriodicityAndOffset_sl1[MAX_NUM_CCs]; uint32_t SearchSpace_monitoringSlotPeriodicityAndOffset_value[MAX_NUM_CCs];
long SearchSpace_monitoringSlotPeriodicityAndOffset_sl2[MAX_NUM_CCs]; uint32_t SearchSpace_duration[MAX_NUM_CCs];
long SearchSpace_monitoringSlotPeriodicityAndOffset_sl4[MAX_NUM_CCs];
long SearchSpace_monitoringSlotPeriodicityAndOffset_sl5[MAX_NUM_CCs];
long SearchSpace_monitoringSlotPeriodicityAndOffset_sl8[MAX_NUM_CCs];
long SearchSpace_monitoringSlotPeriodicityAndOffset_sl10[MAX_NUM_CCs];
long SearchSpace_monitoringSlotPeriodicityAndOffset_sl16[MAX_NUM_CCs];
long SearchSpace_monitoringSlotPeriodicityAndOffset_sl20[MAX_NUM_CCs];
long SearchSpace_nrofCandidates_aggregationLevel1[MAX_NUM_CCs]; long SearchSpace_nrofCandidates_aggregationLevel1[MAX_NUM_CCs];
long SearchSpace_nrofCandidates_aggregationLevel2[MAX_NUM_CCs]; long SearchSpace_nrofCandidates_aggregationLevel2[MAX_NUM_CCs];
long SearchSpace_nrofCandidates_aggregationLevel4[MAX_NUM_CCs]; long SearchSpace_nrofCandidates_aggregationLevel4[MAX_NUM_CCs];
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -49,12 +49,10 @@ gNBs = ...@@ -49,12 +49,10 @@ gNBs =
SIB1_ssb_PeriodicityServingCell = 5; SIB1_ssb_PeriodicityServingCell = 5;
SIB1_ss_PBCH_BlockPower = -60; SIB1_ss_PBCH_BlockPower = -60;
absoluteFrequencySSB = 0; absoluteFrequencySSB = 0;
ssb_SubcarrierOffset = 15;
DL_FreqBandIndicatorNR = 15; DL_FreqBandIndicatorNR = 15;
DL_absoluteFrequencyPointA = 15; DL_absoluteFrequencyPointA = 15;
DL_offsetToCarrier = 15; DL_offsetToCarrier = 15;
DL_SCS_SubcarrierSpacing = "kHz15"; DL_SCS_SubcarrierSpacing = "kHz15";
DL_SCS_SpecificCarrier_k0 = 0;
DL_carrierBandwidth = 15; DL_carrierBandwidth = 15;
DL_locationAndBandwidth = 15; DL_locationAndBandwidth = 15;
DL_BWP_SubcarrierSpacing = "kHz15"; DL_BWP_SubcarrierSpacing = "kHz15";
...@@ -66,11 +64,11 @@ gNBs = ...@@ -66,11 +64,11 @@ gNBs =
UL_frequencyShift7p5khz = "TRUE"; UL_frequencyShift7p5khz = "TRUE";
UL_offsetToCarrier = 10; UL_offsetToCarrier = 10;
UL_SCS_SubcarrierSpacing = "kHz15"; UL_SCS_SubcarrierSpacing = "kHz15";
UL_SCS_SpecificCarrier_k0 = 0;
UL_carrierBandwidth = 15; UL_carrierBandwidth = 15;
UL_locationAndBandwidth = 15; UL_locationAndBandwidth = 15;
UL_BWP_SubcarrierSpacing = "kHz15"; UL_BWP_SubcarrierSpacing = "kHz15";
UL_BWP_prefix_type = "NORMAL"; UL_BWP_prefix_type = "NORMAL";
UL_timeAlignmentTimerCommon = "infinity";
ServingCellConfigCommon__ssb_PositionsInBurst_PR = "shortBitmap"; ServingCellConfigCommon__ssb_PositionsInBurst_PR = "shortBitmap";
ServingCellConfigCommon_ssb_periodicityServingCell = 10; ServingCellConfigCommon_ssb_periodicityServingCell = 10;
ServingCellConfigCommon_dmrs_TypeA_Position = 2; ServingCellConfigCommon_dmrs_TypeA_Position = 2;
...@@ -118,7 +116,10 @@ gNBs = ...@@ -118,7 +116,10 @@ gNBs =
p0_NominalWithGrant = 0; p0_NominalWithGrant = 0;
PUSCH_TimeDomainResourceAllocation_k2 = 0; PUSCH_TimeDomainResourceAllocation_k2 = 0;
PUSCH_TimeDomainResourceAllocation_mappingType = "typeA"; PUSCH_TimeDomainResourceAllocation_mappingType = "typeA";
PUSCH_TimeDomainResourceAllocation_startSymbolAndLength = 0;
pucch_ResourceCommon = 0;
pucch_GroupHopping = "neither"; pucch_GroupHopping = "neither";
hoppingId = 0;
p0_nominal = -30; p0_nominal = -30;
PDSCH_TimeDomainResourceAllocation_k0 = 2; PDSCH_TimeDomainResourceAllocation_k0 = 2;
PDSCH_TimeDomainResourceAllocation_mappingType = "typeA"; PDSCH_TimeDomainResourceAllocation_mappingType = "typeA";
...@@ -129,11 +130,12 @@ gNBs = ...@@ -129,11 +130,12 @@ gNBs =
RateMatchPattern_controlResourceSet = 5; RateMatchPattern_controlResourceSet = 5;
RateMatchPattern_subcarrierSpacing = "kHz15"; RateMatchPattern_subcarrierSpacing = "kHz15";
RateMatchPattern_mode = "dynamic"; RateMatchPattern_mode = "dynamic";
controlResourceSetZero = 0;
searchSpaceZero = 0;
searchSpaceSIB1 = 10; searchSpaceSIB1 = 10;
searchSpaceOtherSystemInformation = 10; searchSpaceOtherSystemInformation = 10;
pagingSearchSpace = 10; pagingSearchSpace = 10;
ra_SearchSpace = 10; ra_SearchSpace = 10;
rach_ra_ControlResourceSet = 10;
PDCCH_common_controlResourceSetId = 5; PDCCH_common_controlResourceSetId = 5;
PDCCH_common_ControlResourceSet_duration = 2; PDCCH_common_ControlResourceSet_duration = 2;
PDCCH_cce_REG_MappingType = "nonInterleaved"; PDCCH_cce_REG_MappingType = "nonInterleaved";
...@@ -143,17 +145,12 @@ gNBs = ...@@ -143,17 +145,12 @@ gNBs =
PDCCH_precoderGranularity = "sameAsREG-bundle"; PDCCH_precoderGranularity = "sameAsREG-bundle";
PDCCH_TCI_StateId = 32; PDCCH_TCI_StateId = 32;
tci_PresentInDCI = "ENABLE"; tci_PresentInDCI = "ENABLE";
PDCCH_DMRS_ScramblingID = 0;
SearchSpaceId = 10; SearchSpaceId = 10;
commonSearchSpaces_controlResourceSetId = 5; commonSearchSpaces_controlResourceSetId = 5;
SearchSpace_monitoringSlotPeriodicityAndOffset_choice = "sl1"; SearchSpace_monitoringSlotPeriodicityAndOffset_choice = "sl1";
SearchSpace_monitoringSlotPeriodicityAndOffset_sl1 = 0; SearchSpace_monitoringSlotPeriodicityAndOffset_value = 0;
SearchSpace_monitoringSlotPeriodicityAndOffset_sl2 = 0; SearchSpace_duration = 0;
SearchSpace_monitoringSlotPeriodicityAndOffset_sl4 = 0;
SearchSpace_monitoringSlotPeriodicityAndOffset_sl5 = 0;
SearchSpace_monitoringSlotPeriodicityAndOffset_sl8 = 0;
SearchSpace_monitoringSlotPeriodicityAndOffset_sl10 = 0;
SearchSpace_monitoringSlotPeriodicityAndOffset_sl16 = 0;
SearchSpace_monitoringSlotPeriodicityAndOffset_sl20 = 0;
SearchSpace_nrofCandidates_aggregationLevel1 = 0; SearchSpace_nrofCandidates_aggregationLevel1 = 0;
SearchSpace_nrofCandidates_aggregationLevel2 = 0; SearchSpace_nrofCandidates_aggregationLevel2 = 0;
SearchSpace_nrofCandidates_aggregationLevel4 = 0; SearchSpace_nrofCandidates_aggregationLevel4 = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment