%% Generated by the Erlang ASN.1 BER compiler. Version: 5.4.3
%% Purpose: Encoding and decoding of the types in megaco_ber_media_gateway_control_v1.

-module('megaco_ber_media_gateway_control_v1').
-moduledoc false.
-compile(nowarn_unused_vars).
-dialyzer(no_improper_lists).
-dialyzer(no_match).
-include("megaco_ber_media_gateway_control_v1.hrl").
-asn1_info([{vsn,'5.4.3'},
            {module,'megaco_ber_media_gateway_control_v1'},
            {options,[warnings,ber,errors,
 {cwd,"/buildroot/otp/lib/megaco/src/binary"},
 {outdir,"/buildroot/otp/lib/megaco/src/binary"},
 noobj,legacy_erlang_types,asn1config,
 {i,"."},
 {i,"/buildroot/otp/lib/megaco/src/binary"}]}]).

-export([encoding_rule/0,maps/0,bit_string_format/0,
         legacy_erlang_types/0]).
-export(['dialyzer-suppressions'/1]).
-export([
enc_Value/2,
enc_TimeNotation/2,
enc_H221NonStandard/2,
enc_NonStandardIdentifier/2,
enc_NonStandardData/2,
enc_StatisticsParameter/2,
enc_StatisticsDescriptor/2,
enc_PackagesItem/2,
enc_PackagesDescriptor/2,
enc_ServiceChangeProfile/2,
enc_ServiceChangeMethod/2,
enc_ServiceChangeResParm/2,
enc_ServiceChangeAddress/2,
enc_ServiceChangeParm/2,
enc_DigitMapValue/2,
enc_DigitMapName/2,
enc_DigitMapDescriptor/2,
enc_ModemType/2,
enc_ModemDescriptor/2,
enc_RequestID/2,
enc_SigParameter/2,
enc_NotifyCompletion/2,
enc_SignalName/2,
enc_SignalType/2,
enc_Signal/2,
enc_SeqSigList/2,
enc_SignalRequest/2,
enc_SignalsDescriptor/2,
enc_EventSpec/2,
enc_EventBufferDescriptor/2,
enc_SecondRequestedActions/2,
enc_SecondRequestedEvent/2,
enc_SecondEventsDescriptor/2,
enc_EventDM/2,
enc_RequestedActions/2,
enc_RequestedEvent/2,
enc_EventsDescriptor/2,
enc_StreamID/2,
enc_MuxType/2,
enc_MuxDescriptor/2,
enc_ServiceState/2,
enc_EventBufferControl/2,
enc_TerminationStateDescriptor/2,
enc_PropertyGroup/2,
enc_LocalRemoteDescriptor/2,
enc_Relation/2,
enc_PkgdName/2,
enc_Name/2,
enc_PropertyParm/2,
enc_StreamMode/2,
enc_LocalControlDescriptor/2,
enc_StreamParms/2,
enc_StreamDescriptor/2,
enc_MediaDescriptor/2,
enc_TerminationIDList/2,
enc_TerminationID/2,
enc_WildcardField/2,
enc_ServiceChangeResult/2,
enc_ServiceChangeReply/2,
enc_ServiceChangeRequest/2,
enc_EventParameter/2,
enc_EventName/2,
enc_ObservedEvent/2,
enc_ObservedEventsDescriptor/2,
enc_NotifyReply/2,
enc_NotifyRequest/2,
enc_AuditDescriptor/2,
enc_AuditReturnParameter/2,
enc_TerminationAudit/2,
enc_AuditResult/2,
enc_AuditReply/2,
enc_AuditRequest/2,
enc_SubtractRequest/2,
enc_AmmsReply/2,
enc_AmmDescriptor/2,
enc_AmmRequest/2,
enc_TopologyRequest/2,
enc_CommandReply/2,
enc_Command/2,
enc_CommandRequest/2,
enc_ContextAttrAuditRequest/2,
enc_ContextRequest/2,
enc_ActionReply/2,
enc_ActionRequest/2,
enc_ContextID/2,
enc_ErrorText/2,
enc_ErrorCode/2,
enc_ErrorDescriptor/2,
enc_TransactionAck/2,
enc_TransactionResponseAck/2,
enc_TransactionReply/2,
enc_TransactionPending/2,
enc_TransactionRequest/2,
enc_TransactionId/2,
enc_Transaction/2,
enc_PathName/2,
enc_IP6Address/2,
enc_IP4Address/2,
enc_DomainName/2,
enc_MId/2,
enc_Message/2,
enc_AuthData/2,
enc_SequenceNum/2,
enc_SecurityParmIndex/2,
enc_AuthenticationHeader/2,
enc_MegacoMessage/2
]).

-export([
dec_Value/2,
dec_TimeNotation/2,
dec_H221NonStandard/2,
dec_NonStandardIdentifier/2,
dec_NonStandardData/2,
dec_StatisticsParameter/2,
dec_StatisticsDescriptor/2,
dec_PackagesItem/2,
dec_PackagesDescriptor/2,
dec_ServiceChangeProfile/2,
dec_ServiceChangeMethod/2,
dec_ServiceChangeResParm/2,
dec_ServiceChangeAddress/2,
dec_ServiceChangeParm/2,
dec_DigitMapValue/2,
dec_DigitMapName/2,
dec_DigitMapDescriptor/2,
dec_ModemType/2,
dec_ModemDescriptor/2,
dec_RequestID/2,
dec_SigParameter/2,
dec_NotifyCompletion/2,
dec_SignalName/2,
dec_SignalType/2,
dec_Signal/2,
dec_SeqSigList/2,
dec_SignalRequest/2,
dec_SignalsDescriptor/2,
dec_EventSpec/2,
dec_EventBufferDescriptor/2,
dec_SecondRequestedActions/2,
dec_SecondRequestedEvent/2,
dec_SecondEventsDescriptor/2,
dec_EventDM/2,
dec_RequestedActions/2,
dec_RequestedEvent/2,
dec_EventsDescriptor/2,
dec_StreamID/2,
dec_MuxType/2,
dec_MuxDescriptor/2,
dec_ServiceState/2,
dec_EventBufferControl/2,
dec_TerminationStateDescriptor/2,
dec_PropertyGroup/2,
dec_LocalRemoteDescriptor/2,
dec_Relation/2,
dec_PkgdName/2,
dec_Name/2,
dec_PropertyParm/2,
dec_StreamMode/2,
dec_LocalControlDescriptor/2,
dec_StreamParms/2,
dec_StreamDescriptor/2,
dec_MediaDescriptor/2,
dec_TerminationIDList/2,
dec_TerminationID/2,
dec_WildcardField/2,
dec_ServiceChangeResult/2,
dec_ServiceChangeReply/2,
dec_ServiceChangeRequest/2,
dec_EventParameter/2,
dec_EventName/2,
dec_ObservedEvent/2,
dec_ObservedEventsDescriptor/2,
dec_NotifyReply/2,
dec_NotifyRequest/2,
dec_AuditDescriptor/2,
dec_AuditReturnParameter/2,
dec_TerminationAudit/2,
dec_AuditResult/2,
dec_AuditReply/2,
dec_AuditRequest/2,
dec_SubtractRequest/2,
dec_AmmsReply/2,
dec_AmmDescriptor/2,
dec_AmmRequest/2,
dec_TopologyRequest/2,
dec_CommandReply/2,
dec_Command/2,
dec_CommandRequest/2,
dec_ContextAttrAuditRequest/2,
dec_ContextRequest/2,
dec_ActionReply/2,
dec_ActionRequest/2,
dec_ContextID/2,
dec_ErrorText/2,
dec_ErrorCode/2,
dec_ErrorDescriptor/2,
dec_TransactionAck/2,
dec_TransactionResponseAck/2,
dec_TransactionReply/2,
dec_TransactionPending/2,
dec_TransactionRequest/2,
dec_TransactionId/2,
dec_Transaction/2,
dec_PathName/2,
dec_IP6Address/2,
dec_IP4Address/2,
dec_DomainName/2,
dec_MId/2,
dec_Message/2,
dec_AuthData/2,
dec_SequenceNum/2,
dec_SecurityParmIndex/2,
dec_AuthenticationHeader/2,
dec_MegacoMessage/2
]).

-export([info/0]).

-export([
decode_message_trans_partial/1,
decode_message_acts_partial/1,
decode_message_version/1,
decode_message_mId/1
]).

-export([decode_part/2]).

-export([encode/2,decode/2]).

encoding_rule() -> ber.

maps() -> false.

bit_string_format() -> bitstring.

legacy_erlang_types() -> true.

encode(Type, Data) ->
try iolist_to_binary(element(1, encode_disp(Type, Data))) of
  Bytes ->
    {ok,Bytes}
  catch
    Class:Exception:Stk when Class =:= error; Class =:= exit ->
      case Exception of
        {error,{asn1,Reason}} ->
          {error,{asn1,{Reason,Stk}}};
        Reason ->
         {error,{asn1,{Reason,Stk}}}
      end
end.


decode(Type, Data) ->
try
   Result = decode_disp(Type, element(1, ber_decode_nif(Data))),
   {ok,Result}
  catch
    Class:Exception:Stk when Class =:= error; Class =:= exit ->
      case Exception of
        {error,{asn1,Reason}} ->
          {error,{asn1,{Reason,Stk}}};
        Reason ->
         {error,{asn1,{Reason,Stk}}}
      end
end.

decode_partial_incomplete(Type, Data0, Pattern) ->
  {Data,RestBin} =
    decode_primitive_incomplete(Pattern, Data0),
  try {ok,decode_partial_inc_disp(Type, Data)}
  catch
    Class:Exception:Stk when Class =:= error; Class =:= exit ->
      case Exception of
        {error,{asn1,Reason}} ->
          {error,{asn1,{Reason,Stk}}};
        Reason ->
         {error,{asn1,{Reason,Stk}}}
      end
end.

decode_part(Type, Data0) when is_binary(Data0) ->
  try {ok,decode_inc_disp(Type, element(1, ber_decode_nif(Data0)))}
  catch
    Class:Exception:Stk when Class =:= error; Class =:= exit ->
      case Exception of
        {error,{asn1,Reason}} ->
          {error,{asn1,{Reason,Stk}}};
        Reason ->
         {error,{asn1,{Reason,Stk}}}
      end
end;
decode_part(Type, Data0) ->
  try {ok,decode_inc_disp(Type, Data0)}
  catch
    Class:Exception:Stk when Class =:= error; Class =:= exit ->
      case Exception of
        {error,{asn1,Reason}} ->
          {error,{asn1,{Reason,Stk}}};
        Reason ->
         {error,{asn1,{Reason,Stk}}}
      end
end.

decode_partial_inc_disp('MegacoMessage',Data) ->
  'dec-inc-MegacoMessage'(Data);
decode_partial_inc_disp('Transaction',Data) ->
  'dec-inc-Transaction'(Data);
decode_partial_inc_disp('MegacoMessage_1',Data) ->
  'dec-inc-MegacoMessage_1'(Data);
decode_partial_inc_disp('MegacoMessage_2',Data) ->
  'dec-inc-MegacoMessage_2'(Data).
encode_disp('Value', Data) -> enc_Value(Data);
encode_disp('TimeNotation', Data) -> enc_TimeNotation(Data);
encode_disp('H221NonStandard', Data) -> enc_H221NonStandard(Data);
encode_disp('NonStandardIdentifier', Data) -> enc_NonStandardIdentifier(Data);
encode_disp('NonStandardData', Data) -> enc_NonStandardData(Data);
encode_disp('StatisticsParameter', Data) -> enc_StatisticsParameter(Data);
encode_disp('StatisticsDescriptor', Data) -> enc_StatisticsDescriptor(Data);
encode_disp('PackagesItem', Data) -> enc_PackagesItem(Data);
encode_disp('PackagesDescriptor', Data) -> enc_PackagesDescriptor(Data);
encode_disp('ServiceChangeProfile', Data) -> enc_ServiceChangeProfile(Data);
encode_disp('ServiceChangeMethod', Data) -> enc_ServiceChangeMethod(Data);
encode_disp('ServiceChangeResParm', Data) -> enc_ServiceChangeResParm(Data);
encode_disp('ServiceChangeAddress', Data) -> enc_ServiceChangeAddress(Data);
encode_disp('ServiceChangeParm', Data) -> enc_ServiceChangeParm(Data);
encode_disp('DigitMapValue', Data) -> enc_DigitMapValue(Data);
encode_disp('DigitMapName', Data) -> enc_DigitMapName(Data);
encode_disp('DigitMapDescriptor', Data) -> enc_DigitMapDescriptor(Data);
encode_disp('ModemType', Data) -> enc_ModemType(Data);
encode_disp('ModemDescriptor', Data) -> enc_ModemDescriptor(Data);
encode_disp('RequestID', Data) -> enc_RequestID(Data);
encode_disp('SigParameter', Data) -> enc_SigParameter(Data);
encode_disp('NotifyCompletion', Data) -> enc_NotifyCompletion(Data);
encode_disp('SignalName', Data) -> enc_SignalName(Data);
encode_disp('SignalType', Data) -> enc_SignalType(Data);
encode_disp('Signal', Data) -> enc_Signal(Data);
encode_disp('SeqSigList', Data) -> enc_SeqSigList(Data);
encode_disp('SignalRequest', Data) -> enc_SignalRequest(Data);
encode_disp('SignalsDescriptor', Data) -> enc_SignalsDescriptor(Data);
encode_disp('EventSpec', Data) -> enc_EventSpec(Data);
encode_disp('EventBufferDescriptor', Data) -> enc_EventBufferDescriptor(Data);
encode_disp('SecondRequestedActions', Data) -> enc_SecondRequestedActions(Data);
encode_disp('SecondRequestedEvent', Data) -> enc_SecondRequestedEvent(Data);
encode_disp('SecondEventsDescriptor', Data) -> enc_SecondEventsDescriptor(Data);
encode_disp('EventDM', Data) -> enc_EventDM(Data);
encode_disp('RequestedActions', Data) -> enc_RequestedActions(Data);
encode_disp('RequestedEvent', Data) -> enc_RequestedEvent(Data);
encode_disp('EventsDescriptor', Data) -> enc_EventsDescriptor(Data);
encode_disp('StreamID', Data) -> enc_StreamID(Data);
encode_disp('MuxType', Data) -> enc_MuxType(Data);
encode_disp('MuxDescriptor', Data) -> enc_MuxDescriptor(Data);
encode_disp('ServiceState', Data) -> enc_ServiceState(Data);
encode_disp('EventBufferControl', Data) -> enc_EventBufferControl(Data);
encode_disp('TerminationStateDescriptor', Data) -> enc_TerminationStateDescriptor(Data);
encode_disp('PropertyGroup', Data) -> enc_PropertyGroup(Data);
encode_disp('LocalRemoteDescriptor', Data) -> enc_LocalRemoteDescriptor(Data);
encode_disp('Relation', Data) -> enc_Relation(Data);
encode_disp('PkgdName', Data) -> enc_PkgdName(Data);
encode_disp('Name', Data) -> enc_Name(Data);
encode_disp('PropertyParm', Data) -> enc_PropertyParm(Data);
encode_disp('StreamMode', Data) -> enc_StreamMode(Data);
encode_disp('LocalControlDescriptor', Data) -> enc_LocalControlDescriptor(Data);
encode_disp('StreamParms', Data) -> enc_StreamParms(Data);
encode_disp('StreamDescriptor', Data) -> enc_StreamDescriptor(Data);
encode_disp('MediaDescriptor', Data) -> enc_MediaDescriptor(Data);
encode_disp('TerminationIDList', Data) -> enc_TerminationIDList(Data);
encode_disp('TerminationID', Data) -> enc_TerminationID(Data);
encode_disp('WildcardField', Data) -> enc_WildcardField(Data);
encode_disp('ServiceChangeResult', Data) -> enc_ServiceChangeResult(Data);
encode_disp('ServiceChangeReply', Data) -> enc_ServiceChangeReply(Data);
encode_disp('ServiceChangeRequest', Data) -> enc_ServiceChangeRequest(Data);
encode_disp('EventParameter', Data) -> enc_EventParameter(Data);
encode_disp('EventName', Data) -> enc_EventName(Data);
encode_disp('ObservedEvent', Data) -> enc_ObservedEvent(Data);
encode_disp('ObservedEventsDescriptor', Data) -> enc_ObservedEventsDescriptor(Data);
encode_disp('NotifyReply', Data) -> enc_NotifyReply(Data);
encode_disp('NotifyRequest', Data) -> enc_NotifyRequest(Data);
encode_disp('AuditDescriptor', Data) -> enc_AuditDescriptor(Data);
encode_disp('AuditReturnParameter', Data) -> enc_AuditReturnParameter(Data);
encode_disp('TerminationAudit', Data) -> enc_TerminationAudit(Data);
encode_disp('AuditResult', Data) -> enc_AuditResult(Data);
encode_disp('AuditReply', Data) -> enc_AuditReply(Data);
encode_disp('AuditRequest', Data) -> enc_AuditRequest(Data);
encode_disp('SubtractRequest', Data) -> enc_SubtractRequest(Data);
encode_disp('AmmsReply', Data) -> enc_AmmsReply(Data);
encode_disp('AmmDescriptor', Data) -> enc_AmmDescriptor(Data);
encode_disp('AmmRequest', Data) -> enc_AmmRequest(Data);
encode_disp('TopologyRequest', Data) -> enc_TopologyRequest(Data);
encode_disp('CommandReply', Data) -> enc_CommandReply(Data);
encode_disp('Command', Data) -> enc_Command(Data);
encode_disp('CommandRequest', Data) -> enc_CommandRequest(Data);
encode_disp('ContextAttrAuditRequest', Data) -> enc_ContextAttrAuditRequest(Data);
encode_disp('ContextRequest', Data) -> enc_ContextRequest(Data);
encode_disp('ActionReply', Data) -> enc_ActionReply(Data);
encode_disp('ActionRequest', Data) -> enc_ActionRequest(Data);
encode_disp('ContextID', Data) -> enc_ContextID(Data);
encode_disp('ErrorText', Data) -> enc_ErrorText(Data);
encode_disp('ErrorCode', Data) -> enc_ErrorCode(Data);
encode_disp('ErrorDescriptor', Data) -> enc_ErrorDescriptor(Data);
encode_disp('TransactionAck', Data) -> enc_TransactionAck(Data);
encode_disp('TransactionResponseAck', Data) -> enc_TransactionResponseAck(Data);
encode_disp('TransactionReply', Data) -> enc_TransactionReply(Data);
encode_disp('TransactionPending', Data) -> enc_TransactionPending(Data);
encode_disp('TransactionRequest', Data) -> enc_TransactionRequest(Data);
encode_disp('TransactionId', Data) -> enc_TransactionId(Data);
encode_disp('Transaction', Data) -> enc_Transaction(Data);
encode_disp('PathName', Data) -> enc_PathName(Data);
encode_disp('IP6Address', Data) -> enc_IP6Address(Data);
encode_disp('IP4Address', Data) -> enc_IP4Address(Data);
encode_disp('DomainName', Data) -> enc_DomainName(Data);
encode_disp('MId', Data) -> enc_MId(Data);
encode_disp('Message', Data) -> enc_Message(Data);
encode_disp('AuthData', Data) -> enc_AuthData(Data);
encode_disp('SequenceNum', Data) -> enc_SequenceNum(Data);
encode_disp('SecurityParmIndex', Data) -> enc_SecurityParmIndex(Data);
encode_disp('AuthenticationHeader', Data) -> enc_AuthenticationHeader(Data);
encode_disp('MegacoMessage', Data) -> enc_MegacoMessage(Data);
encode_disp(Type, _Data) -> exit({error,{asn1,{undefined_type,Type}}}).

decode_disp('Value', Data) -> dec_Value(Data);
decode_disp('TimeNotation', Data) -> dec_TimeNotation(Data);
decode_disp('H221NonStandard', Data) -> dec_H221NonStandard(Data);
decode_disp('NonStandardIdentifier', Data) -> dec_NonStandardIdentifier(Data);
decode_disp('NonStandardData', Data) -> dec_NonStandardData(Data);
decode_disp('StatisticsParameter', Data) -> dec_StatisticsParameter(Data);
decode_disp('StatisticsDescriptor', Data) -> dec_StatisticsDescriptor(Data);
decode_disp('PackagesItem', Data) -> dec_PackagesItem(Data);
decode_disp('PackagesDescriptor', Data) -> dec_PackagesDescriptor(Data);
decode_disp('ServiceChangeProfile', Data) -> dec_ServiceChangeProfile(Data);
decode_disp('ServiceChangeMethod', Data) -> dec_ServiceChangeMethod(Data);
decode_disp('ServiceChangeResParm', Data) -> dec_ServiceChangeResParm(Data);
decode_disp('ServiceChangeAddress', Data) -> dec_ServiceChangeAddress(Data);
decode_disp('ServiceChangeParm', Data) -> dec_ServiceChangeParm(Data);
decode_disp('DigitMapValue', Data) -> dec_DigitMapValue(Data);
decode_disp('DigitMapName', Data) -> dec_DigitMapName(Data);
decode_disp('DigitMapDescriptor', Data) -> dec_DigitMapDescriptor(Data);
decode_disp('ModemType', Data) -> dec_ModemType(Data);
decode_disp('ModemDescriptor', Data) -> dec_ModemDescriptor(Data);
decode_disp('RequestID', Data) -> dec_RequestID(Data);
decode_disp('SigParameter', Data) -> dec_SigParameter(Data);
decode_disp('NotifyCompletion', Data) -> dec_NotifyCompletion(Data);
decode_disp('SignalName', Data) -> dec_SignalName(Data);
decode_disp('SignalType', Data) -> dec_SignalType(Data);
decode_disp('Signal', Data) -> dec_Signal(Data);
decode_disp('SeqSigList', Data) -> dec_SeqSigList(Data);
decode_disp('SignalRequest', Data) -> dec_SignalRequest(Data);
decode_disp('SignalsDescriptor', Data) -> dec_SignalsDescriptor(Data);
decode_disp('EventSpec', Data) -> dec_EventSpec(Data);
decode_disp('EventBufferDescriptor', Data) -> dec_EventBufferDescriptor(Data);
decode_disp('SecondRequestedActions', Data) -> dec_SecondRequestedActions(Data);
decode_disp('SecondRequestedEvent', Data) -> dec_SecondRequestedEvent(Data);
decode_disp('SecondEventsDescriptor', Data) -> dec_SecondEventsDescriptor(Data);
decode_disp('EventDM', Data) -> dec_EventDM(Data);
decode_disp('RequestedActions', Data) -> dec_RequestedActions(Data);
decode_disp('RequestedEvent', Data) -> dec_RequestedEvent(Data);
decode_disp('EventsDescriptor', Data) -> dec_EventsDescriptor(Data);
decode_disp('StreamID', Data) -> dec_StreamID(Data);
decode_disp('MuxType', Data) -> dec_MuxType(Data);
decode_disp('MuxDescriptor', Data) -> dec_MuxDescriptor(Data);
decode_disp('ServiceState', Data) -> dec_ServiceState(Data);
decode_disp('EventBufferControl', Data) -> dec_EventBufferControl(Data);
decode_disp('TerminationStateDescriptor', Data) -> dec_TerminationStateDescriptor(Data);
decode_disp('PropertyGroup', Data) -> dec_PropertyGroup(Data);
decode_disp('LocalRemoteDescriptor', Data) -> dec_LocalRemoteDescriptor(Data);
decode_disp('Relation', Data) -> dec_Relation(Data);
decode_disp('PkgdName', Data) -> dec_PkgdName(Data);
decode_disp('Name', Data) -> dec_Name(Data);
decode_disp('PropertyParm', Data) -> dec_PropertyParm(Data);
decode_disp('StreamMode', Data) -> dec_StreamMode(Data);
decode_disp('LocalControlDescriptor', Data) -> dec_LocalControlDescriptor(Data);
decode_disp('StreamParms', Data) -> dec_StreamParms(Data);
decode_disp('StreamDescriptor', Data) -> dec_StreamDescriptor(Data);
decode_disp('MediaDescriptor', Data) -> dec_MediaDescriptor(Data);
decode_disp('TerminationIDList', Data) -> dec_TerminationIDList(Data);
decode_disp('TerminationID', Data) -> dec_TerminationID(Data);
decode_disp('WildcardField', Data) -> dec_WildcardField(Data);
decode_disp('ServiceChangeResult', Data) -> dec_ServiceChangeResult(Data);
decode_disp('ServiceChangeReply', Data) -> dec_ServiceChangeReply(Data);
decode_disp('ServiceChangeRequest', Data) -> dec_ServiceChangeRequest(Data);
decode_disp('EventParameter', Data) -> dec_EventParameter(Data);
decode_disp('EventName', Data) -> dec_EventName(Data);
decode_disp('ObservedEvent', Data) -> dec_ObservedEvent(Data);
decode_disp('ObservedEventsDescriptor', Data) -> dec_ObservedEventsDescriptor(Data);
decode_disp('NotifyReply', Data) -> dec_NotifyReply(Data);
decode_disp('NotifyRequest', Data) -> dec_NotifyRequest(Data);
decode_disp('AuditDescriptor', Data) -> dec_AuditDescriptor(Data);
decode_disp('AuditReturnParameter', Data) -> dec_AuditReturnParameter(Data);
decode_disp('TerminationAudit', Data) -> dec_TerminationAudit(Data);
decode_disp('AuditResult', Data) -> dec_AuditResult(Data);
decode_disp('AuditReply', Data) -> dec_AuditReply(Data);
decode_disp('AuditRequest', Data) -> dec_AuditRequest(Data);
decode_disp('SubtractRequest', Data) -> dec_SubtractRequest(Data);
decode_disp('AmmsReply', Data) -> dec_AmmsReply(Data);
decode_disp('AmmDescriptor', Data) -> dec_AmmDescriptor(Data);
decode_disp('AmmRequest', Data) -> dec_AmmRequest(Data);
decode_disp('TopologyRequest', Data) -> dec_TopologyRequest(Data);
decode_disp('CommandReply', Data) -> dec_CommandReply(Data);
decode_disp('Command', Data) -> dec_Command(Data);
decode_disp('CommandRequest', Data) -> dec_CommandRequest(Data);
decode_disp('ContextAttrAuditRequest', Data) -> dec_ContextAttrAuditRequest(Data);
decode_disp('ContextRequest', Data) -> dec_ContextRequest(Data);
decode_disp('ActionReply', Data) -> dec_ActionReply(Data);
decode_disp('ActionRequest', Data) -> dec_ActionRequest(Data);
decode_disp('ContextID', Data) -> dec_ContextID(Data);
decode_disp('ErrorText', Data) -> dec_ErrorText(Data);
decode_disp('ErrorCode', Data) -> dec_ErrorCode(Data);
decode_disp('ErrorDescriptor', Data) -> dec_ErrorDescriptor(Data);
decode_disp('TransactionAck', Data) -> dec_TransactionAck(Data);
decode_disp('TransactionResponseAck', Data) -> dec_TransactionResponseAck(Data);
decode_disp('TransactionReply', Data) -> dec_TransactionReply(Data);
decode_disp('TransactionPending', Data) -> dec_TransactionPending(Data);
decode_disp('TransactionRequest', Data) -> dec_TransactionRequest(Data);
decode_disp('TransactionId', Data) -> dec_TransactionId(Data);
decode_disp('Transaction', Data) -> dec_Transaction(Data);
decode_disp('PathName', Data) -> dec_PathName(Data);
decode_disp('IP6Address', Data) -> dec_IP6Address(Data);
decode_disp('IP4Address', Data) -> dec_IP4Address(Data);
decode_disp('DomainName', Data) -> dec_DomainName(Data);
decode_disp('MId', Data) -> dec_MId(Data);
decode_disp('Message', Data) -> dec_Message(Data);
decode_disp('AuthData', Data) -> dec_AuthData(Data);
decode_disp('SequenceNum', Data) -> dec_SequenceNum(Data);
decode_disp('SecurityParmIndex', Data) -> dec_SecurityParmIndex(Data);
decode_disp('AuthenticationHeader', Data) -> dec_AuthenticationHeader(Data);
decode_disp('MegacoMessage', Data) -> dec_MegacoMessage(Data);
decode_disp(Type, _Data) -> exit({error,{asn1,{undefined_type,Type}}}).

info() ->
   case ?MODULE:module_info(attributes) of
     Attributes when is_list(Attributes) ->
       case lists:keyfind(asn1_info, 1, Attributes) of
         {_,Info} when is_list(Info) ->
           Info;
         _ ->
           []
       end;
     _ ->
       []
   end.


%%================================
%%  Value
%%================================
enc_Value(Val) ->
    enc_Value(Val, [<<48>>]).

enc_Value(Val, TagIn) ->
   {EncBytes,EncLen} = 'enc_Value_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_Value_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_Value_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = encode_restricted_string(H, [<<4>>]),
   'enc_Value_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_Value(Tlv) ->
   dec_Value(Tlv, [16]).

dec_Value(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
[begin
binary_to_list(decode_restricted_string(V1, [4]))
end
 || V1 <- Tlv1].




%%================================
%%  TimeNotation
%%================================
enc_TimeNotation(Val) ->
    enc_TimeNotation(Val, [<<48>>]).

enc_TimeNotation(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute date(1) with type IA5String
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute time(2) with type IA5String
%%-------------------------------------------------
   {EncBytes2,EncLen2} = encode_restricted_string(Cindex2, [<<129>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_TimeNotation(Tlv) ->
   dec_TimeNotation(Tlv, [16]).

dec_TimeNotation(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute date(1) with type IA5String
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 8 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute time(2) with type IA5String
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = begin
Val2 = decode_restricted_string(V2, [131073]),
C2 = byte_size(Val2),
if C2 =:= 8 ->
binary_to_list(Val2);
true ->
exit({error,{asn1,bad_range}})
end
end,

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'TimeNotation',Term1,Term2},
Res1.


%%================================
%%  H221NonStandard
%%================================
enc_H221NonStandard(Val) ->
    enc_H221NonStandard(Val, [<<48>>]).

enc_H221NonStandard(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4} = Val,

%%-------------------------------------------------
%% attribute t35CountryCode1(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute t35CountryCode2(2) with type INTEGER
%%-------------------------------------------------
   {EncBytes2,EncLen2} = encode_integer(Cindex2, [<<129>>]),

%%-------------------------------------------------
%% attribute t35Extension(3) with type INTEGER
%%-------------------------------------------------
   {EncBytes3,EncLen3} = encode_integer(Cindex3, [<<130>>]),

%%-------------------------------------------------
%% attribute manufacturerCode(4) with type INTEGER
%%-------------------------------------------------
   {EncBytes4,EncLen4} = encode_integer(Cindex4, [<<131>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_H221NonStandard(Tlv) ->
   dec_H221NonStandard(Tlv, [16]).

dec_H221NonStandard(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute t35CountryCode1(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 255 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute t35CountryCode2(2) with type INTEGER
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = begin
Val2 = decode_integer(V2, [131073]),
if 0 =< Val2, Val2 =< 255 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute t35Extension(3) with type INTEGER
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = begin
Val3 = decode_integer(V3, [131074]),
if 0 =< Val3, Val3 =< 255 ->
Val3;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute manufacturerCode(4) with type INTEGER
%%-------------------------------------------------
[V4|Tlv5] = Tlv4, 
Term4 = begin
Val4 = decode_integer(V4, [131075]),
if 0 =< Val4, Val4 =< 65535 ->
Val4;
true ->
exit({error,{asn1,bad_range}})
end
end,

case Tlv5 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'H221NonStandard',Term1,Term2,Term3,Term4},
Res1.


%%================================
%%  NonStandardIdentifier
%%================================
enc_NonStandardIdentifier(Val) ->
    enc_NonStandardIdentifier(Val, []).

enc_NonStandardIdentifier(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      object ->
         encode_object_identifier(element(2,Val), [<<128>>]);
      h221NonStandard ->
         'enc_H221NonStandard'(element(2,Val), [<<161>>]);
      experimental ->
         encode_restricted_string(element(2,Val), [<<130>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_NonStandardIdentifier(Tlv) ->
   dec_NonStandardIdentifier(Tlv, []).

dec_NonStandardIdentifier(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'object'
    {131072, V1} -> 
        {object, decode_object_identifier(V1, [])};


%% 'h221NonStandard'
    {131073, V1} -> 
        {h221NonStandard, 'dec_H221NonStandard'(V1, [])};


%% 'experimental'
    {131074, V1} -> 
        {experimental, begin
Val1 = decode_restricted_string(V1, []),
C1 = byte_size(Val1),
if C1 =:= 8 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  NonStandardData
%%================================
enc_NonStandardData(Val) ->
    enc_NonStandardData(Val, [<<48>>]).

enc_NonStandardData(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute nonStandardIdentifier(1)   External megaco_ber_media_gateway_control_v1:NonStandardIdentifier
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_NonStandardIdentifier'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute data(2) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes2,EncLen2} = encode_restricted_string(Cindex2, [<<129>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_NonStandardData(Tlv) ->
   dec_NonStandardData(Tlv, [16]).

dec_NonStandardData(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute nonStandardIdentifier(1)   External megaco_ber_media_gateway_control_v1:NonStandardIdentifier
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_NonStandardIdentifier'(V1, [131072]),

%%-------------------------------------------------
%% attribute data(2) with type OCTET STRING
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = begin
binary_to_list(decode_restricted_string(V2, [131073]))
end
,

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'NonStandardData',Term1,Term2},
Res1.


%%================================
%%  StatisticsParameter
%%================================
enc_StatisticsParameter(Val) ->
    enc_StatisticsParameter(Val, [<<48>>]).

enc_StatisticsParameter(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute statName(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute statValue(2)   External megaco_ber_media_gateway_control_v1:Value OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_Value'(Cindex2, [<<161>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_StatisticsParameter(Tlv) ->
   dec_StatisticsParameter(Tlv, [16]).

dec_StatisticsParameter(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute statName(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute statValue(2)   External megaco_ber_media_gateway_control_v1:Value OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_Value'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'StatisticsParameter',Term1,Term2},
Res1.


%%================================
%%  StatisticsDescriptor
%%================================
enc_StatisticsDescriptor(Val) ->
    enc_StatisticsDescriptor(Val, [<<48>>]).

enc_StatisticsDescriptor(Val, TagIn) ->
   {EncBytes,EncLen} = 'enc_StatisticsDescriptor_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_StatisticsDescriptor_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_StatisticsDescriptor_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_StatisticsParameter'(H, [<<48>>]),
   'enc_StatisticsDescriptor_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_StatisticsDescriptor(Tlv) ->
   dec_StatisticsDescriptor(Tlv, [16]).

dec_StatisticsDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_StatisticsParameter'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  PackagesItem
%%================================
enc_PackagesItem(Val) ->
    enc_PackagesItem(Val, [<<48>>]).

enc_PackagesItem(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute packageName(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute packageVersion(2) with type INTEGER
%%-------------------------------------------------
   {EncBytes2,EncLen2} = encode_integer(Cindex2, [<<129>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_PackagesItem(Tlv) ->
   dec_PackagesItem(Tlv, [16]).

dec_PackagesItem(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute packageName(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 2 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute packageVersion(2) with type INTEGER
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = begin
Val2 = decode_integer(V2, [131073]),
if 0 =< Val2, Val2 =< 99 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end,

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'PackagesItem',Term1,Term2},
Res1.


%%================================
%%  PackagesDescriptor
%%================================
enc_PackagesDescriptor(Val) ->
    enc_PackagesDescriptor(Val, [<<48>>]).

enc_PackagesDescriptor(Val, TagIn) ->
   {EncBytes,EncLen} = 'enc_PackagesDescriptor_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_PackagesDescriptor_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_PackagesDescriptor_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_PackagesItem'(H, [<<48>>]),
   'enc_PackagesDescriptor_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_PackagesDescriptor(Tlv) ->
   dec_PackagesDescriptor(Tlv, [16]).

dec_PackagesDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_PackagesItem'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  ServiceChangeProfile
%%================================
enc_ServiceChangeProfile(Val) ->
    enc_ServiceChangeProfile(Val, [<<48>>]).

enc_ServiceChangeProfile(Val, TagIn) ->
{_,Cindex1} = Val,

%%-------------------------------------------------
%% attribute profileName(1) with type IA5String
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

   BytesSoFar = [EncBytes1],
LenSoFar = EncLen1,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_ServiceChangeProfile(Tlv) ->
   dec_ServiceChangeProfile(Tlv, [16]).

dec_ServiceChangeProfile(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute profileName(1) with type IA5String
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if 1 =< C1, C1 =< 67 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

case Tlv2 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv2}}}) % extra fields not allowed
end,
Res1 = {'ServiceChangeProfile',Term1},
Res1.


%%================================
%%  ServiceChangeMethod
%%================================
enc_ServiceChangeMethod(Val) ->
    enc_ServiceChangeMethod(Val, [<<10>>]).

enc_ServiceChangeMethod(Val, TagIn) ->
case Val of
failover -> encode_tags(TagIn, [0], 1);
forced -> encode_tags(TagIn, [1], 1);
graceful -> encode_tags(TagIn, [2], 1);
restart -> encode_tags(TagIn, [3], 1);
disconnected -> encode_tags(TagIn, [4], 1);
handOff -> encode_tags(TagIn, [5], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end.


dec_ServiceChangeMethod(Tlv) ->
   dec_ServiceChangeMethod(Tlv, [10]).

dec_ServiceChangeMethod(Tlv, TagIn) ->
case decode_integer(Tlv, TagIn) of
0 -> failover;
1 -> forced;
2 -> graceful;
3 -> restart;
4 -> disconnected;
5 -> handOff;
Default1 -> {asn1_enum,Default1}
end.



%%================================
%%  ServiceChangeResParm
%%================================
enc_ServiceChangeResParm(Val) ->
    enc_ServiceChangeResParm(Val, [<<48>>]).

enc_ServiceChangeResParm(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4,Cindex5} = Val,

%%-------------------------------------------------
%% attribute serviceChangeMgcId(1)   External megaco_ber_media_gateway_control_v1:MId OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_MId'(Cindex1, [<<160>>])
       end,

%%-------------------------------------------------
%% attribute serviceChangeAddress(2)   External megaco_ber_media_gateway_control_v1:ServiceChangeAddress OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ServiceChangeAddress'(Cindex2, [<<161>>])
       end,

%%-------------------------------------------------
%% attribute serviceChangeVersion(3) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex3, [<<130>>])
       end,

%%-------------------------------------------------
%% attribute serviceChangeProfile(4)   External megaco_ber_media_gateway_control_v1:ServiceChangeProfile OPTIONAL
%%-------------------------------------------------
   {EncBytes4,EncLen4} =  case Cindex4 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ServiceChangeProfile'(Cindex4, [<<163>>])
       end,

%%-------------------------------------------------
%% attribute timeStamp(5)   External megaco_ber_media_gateway_control_v1:TimeNotation OPTIONAL
%%-------------------------------------------------
   {EncBytes5,EncLen5} =  case Cindex5 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_TimeNotation'(Cindex5, [<<164>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4, EncBytes5],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4 + EncLen5,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_ServiceChangeResParm(Tlv) ->
   dec_ServiceChangeResParm(Tlv, [16]).

dec_ServiceChangeResParm(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute serviceChangeMgcId(1)   External megaco_ber_media_gateway_control_v1:MId OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {'dec_MId'(V1, []), TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute serviceChangeAddress(2)   External megaco_ber_media_gateway_control_v1:ServiceChangeAddress OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_ServiceChangeAddress'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute serviceChangeVersion(3) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {begin
Val1 = decode_integer(V3, []),
if 0 =< Val1, Val1 =< 99 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute serviceChangeProfile(4)   External megaco_ber_media_gateway_control_v1:ServiceChangeProfile OPTIONAL
%%-------------------------------------------------
{Term4,Tlv5} = case Tlv4 of
[{131075,V4}|TempTlv5] ->
    {'dec_ServiceChangeProfile'(V4, []), TempTlv5};
    _ ->
        { asn1_NOVALUE, Tlv4}
end,

%%-------------------------------------------------
%% attribute timeStamp(5)   External megaco_ber_media_gateway_control_v1:TimeNotation OPTIONAL
%%-------------------------------------------------
{Term5,Tlv6} = case Tlv5 of
[{131076,V5}|TempTlv6] ->
    {'dec_TimeNotation'(V5, []), TempTlv6};
    _ ->
        { asn1_NOVALUE, Tlv5}
end,

case Tlv6 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'ServiceChangeResParm',Term1,Term2,Term3,Term4,Term5},
Res1.


%%================================
%%  ServiceChangeAddress
%%================================
enc_ServiceChangeAddress(Val) ->
    enc_ServiceChangeAddress(Val, []).

enc_ServiceChangeAddress(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      portNumber ->
         encode_integer(element(2,Val), [<<128>>]);
      ip4Address ->
         'enc_IP4Address'(element(2,Val), [<<161>>]);
      ip6Address ->
         'enc_IP6Address'(element(2,Val), [<<162>>]);
      domainName ->
         'enc_DomainName'(element(2,Val), [<<163>>]);
      deviceName ->
         encode_restricted_string(element(2,Val), [<<132>>]);
      mtpAddress ->
         encode_restricted_string(element(2,Val), [<<133>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_ServiceChangeAddress(Tlv) ->
   dec_ServiceChangeAddress(Tlv, []).

dec_ServiceChangeAddress(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'portNumber'
    {131072, V1} -> 
        {portNumber, begin
Val1 = decode_integer(V1, []),
if 0 =< Val1, Val1 =< 65535 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end};


%% 'ip4Address'
    {131073, V1} -> 
        {ip4Address, 'dec_IP4Address'(V1, [])};


%% 'ip6Address'
    {131074, V1} -> 
        {ip6Address, 'dec_IP6Address'(V1, [])};


%% 'domainName'
    {131075, V1} -> 
        {domainName, 'dec_DomainName'(V1, [])};


%% 'deviceName'
    {131076, V1} -> 
        {deviceName, begin
Val2 = decode_restricted_string(V1, []),
C1 = byte_size(Val2),
if 1 =< C1, C1 =< 64 ->
binary_to_list(Val2);
true ->
exit({error,{asn1,bad_range}})
end
end};


%% 'mtpAddress'
    {131077, V1} -> 
        {mtpAddress, begin
Val3 = decode_restricted_string(V1, []),
C2 = byte_size(Val3),
if 2 =< C2, C2 =< 4 ->
binary_to_list(Val3);
true ->
exit({error,{asn1,bad_range}})
end
end};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  ServiceChangeParm
%%================================
enc_ServiceChangeParm(Val) ->
    enc_ServiceChangeParm(Val, [<<48>>]).

enc_ServiceChangeParm(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4,Cindex5,Cindex6,Cindex7,Cindex8,Cindex9} = Val,

%%-------------------------------------------------
%% attribute serviceChangeMethod(1) with type ENUMERATED
%%-------------------------------------------------
   {EncBytes1,EncLen1} = case Cindex1 of
failover -> encode_tags([<<128>>], [0], 1);
forced -> encode_tags([<<128>>], [1], 1);
graceful -> encode_tags([<<128>>], [2], 1);
restart -> encode_tags([<<128>>], [3], 1);
disconnected -> encode_tags([<<128>>], [4], 1);
handOff -> encode_tags([<<128>>], [5], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end,

%%-------------------------------------------------
%% attribute serviceChangeAddress(2)   External megaco_ber_media_gateway_control_v1:ServiceChangeAddress OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ServiceChangeAddress'(Cindex2, [<<161>>])
       end,

%%-------------------------------------------------
%% attribute serviceChangeVersion(3) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex3, [<<130>>])
       end,

%%-------------------------------------------------
%% attribute serviceChangeProfile(4)   External megaco_ber_media_gateway_control_v1:ServiceChangeProfile OPTIONAL
%%-------------------------------------------------
   {EncBytes4,EncLen4} =  case Cindex4 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ServiceChangeProfile'(Cindex4, [<<163>>])
       end,

%%-------------------------------------------------
%% attribute serviceChangeReason(5)   External megaco_ber_media_gateway_control_v1:Value
%%-------------------------------------------------
   {EncBytes5,EncLen5} = 'enc_Value'(Cindex5, [<<164>>]),

%%-------------------------------------------------
%% attribute serviceChangeDelay(6) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes6,EncLen6} =  case Cindex6 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex6, [<<133>>])
       end,

%%-------------------------------------------------
%% attribute serviceChangeMgcId(7)   External megaco_ber_media_gateway_control_v1:MId OPTIONAL
%%-------------------------------------------------
   {EncBytes7,EncLen7} =  case Cindex7 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_MId'(Cindex7, [<<166>>])
       end,

%%-------------------------------------------------
%% attribute timeStamp(8)   External megaco_ber_media_gateway_control_v1:TimeNotation OPTIONAL
%%-------------------------------------------------
   {EncBytes8,EncLen8} =  case Cindex8 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_TimeNotation'(Cindex8, [<<167>>])
       end,

%%-------------------------------------------------
%% attribute nonStandardData(9)   External megaco_ber_media_gateway_control_v1:NonStandardData OPTIONAL
%%-------------------------------------------------
   {EncBytes9,EncLen9} =  case Cindex9 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_NonStandardData'(Cindex9, [<<168>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4, EncBytes5, EncBytes6, EncBytes7, EncBytes8, EncBytes9],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4 + EncLen5 + EncLen6 + EncLen7 + EncLen8 + EncLen9,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_ServiceChangeParm(Tlv) ->
   dec_ServiceChangeParm(Tlv, [16]).

dec_ServiceChangeParm(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute serviceChangeMethod(1) with type ENUMERATED
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = case decode_integer(V1, [131072]) of
0 -> failover;
1 -> forced;
2 -> graceful;
3 -> restart;
4 -> disconnected;
5 -> handOff;
Default1 -> {asn1_enum,Default1}
end,

%%-------------------------------------------------
%% attribute serviceChangeAddress(2)   External megaco_ber_media_gateway_control_v1:ServiceChangeAddress OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_ServiceChangeAddress'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute serviceChangeVersion(3) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {begin
Val1 = decode_integer(V3, []),
if 0 =< Val1, Val1 =< 99 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute serviceChangeProfile(4)   External megaco_ber_media_gateway_control_v1:ServiceChangeProfile OPTIONAL
%%-------------------------------------------------
{Term4,Tlv5} = case Tlv4 of
[{131075,V4}|TempTlv5] ->
    {'dec_ServiceChangeProfile'(V4, []), TempTlv5};
    _ ->
        { asn1_NOVALUE, Tlv4}
end,

%%-------------------------------------------------
%% attribute serviceChangeReason(5)   External megaco_ber_media_gateway_control_v1:Value
%%-------------------------------------------------
[V5|Tlv6] = Tlv5, 
Term5 = 'dec_Value'(V5, [131076]),

%%-------------------------------------------------
%% attribute serviceChangeDelay(6) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term6,Tlv7} = case Tlv6 of
[{131077,V6}|TempTlv7] ->
    {begin
Val2 = decode_integer(V6, []),
if 0 =< Val2, Val2 =< 4294967295 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv7};
    _ ->
        { asn1_NOVALUE, Tlv6}
end,

%%-------------------------------------------------
%% attribute serviceChangeMgcId(7)   External megaco_ber_media_gateway_control_v1:MId OPTIONAL
%%-------------------------------------------------
{Term7,Tlv8} = case Tlv7 of
[{131078,V7}|TempTlv8] ->
    {'dec_MId'(V7, []), TempTlv8};
    _ ->
        { asn1_NOVALUE, Tlv7}
end,

%%-------------------------------------------------
%% attribute timeStamp(8)   External megaco_ber_media_gateway_control_v1:TimeNotation OPTIONAL
%%-------------------------------------------------
{Term8,Tlv9} = case Tlv8 of
[{131079,V8}|TempTlv9] ->
    {'dec_TimeNotation'(V8, []), TempTlv9};
    _ ->
        { asn1_NOVALUE, Tlv8}
end,

%%-------------------------------------------------
%% attribute nonStandardData(9)   External megaco_ber_media_gateway_control_v1:NonStandardData OPTIONAL
%%-------------------------------------------------
{Term9,Tlv10} = case Tlv9 of
[{131080,V9}|TempTlv10] ->
    {'dec_NonStandardData'(V9, []), TempTlv10};
    _ ->
        { asn1_NOVALUE, Tlv9}
end,

case Tlv10 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'ServiceChangeParm',Term1,Term2,Term3,Term4,Term5,Term6,Term7,Term8,Term9},
Res1.


%%================================
%%  DigitMapValue
%%================================
enc_DigitMapValue(Val) ->
    enc_DigitMapValue(Val, [<<48>>]).

enc_DigitMapValue(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4} = Val,

%%-------------------------------------------------
%% attribute startTimer(1) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex1, [<<128>>])
       end,

%%-------------------------------------------------
%% attribute shortTimer(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute longTimer(3) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex3, [<<130>>])
       end,

%%-------------------------------------------------
%% attribute digitMapBody(4) with type IA5String
%%-------------------------------------------------
   {EncBytes4,EncLen4} = encode_restricted_string(Cindex4, [<<131>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_DigitMapValue(Tlv) ->
   dec_DigitMapValue(Tlv, [16]).

dec_DigitMapValue(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute startTimer(1) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {begin
Val1 = decode_integer(V1, []),
if 0 =< Val1, Val1 =< 99 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute shortTimer(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val2 = decode_integer(V2, []),
if 0 =< Val2, Val2 =< 99 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute longTimer(3) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {begin
Val3 = decode_integer(V3, []),
if 0 =< Val3, Val3 =< 99 ->
Val3;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute digitMapBody(4) with type IA5String
%%-------------------------------------------------
[V4|Tlv5] = Tlv4, 
Term4 = begin
binary_to_list(decode_restricted_string(V4, [131075]))
end
,

case Tlv5 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'DigitMapValue',Term1,Term2,Term3,Term4},
Res1.


%%================================
%%  DigitMapName
%%================================
enc_DigitMapName(Val) ->
    enc_DigitMapName(Val, [<<4>>]).

enc_DigitMapName(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_DigitMapName(Tlv) ->
   dec_DigitMapName(Tlv, [4]).

dec_DigitMapName(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if C1 =:= 2 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  DigitMapDescriptor
%%================================
enc_DigitMapDescriptor(Val) ->
    enc_DigitMapDescriptor(Val, [<<48>>]).

enc_DigitMapDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute digitMapName(1) with type OCTET STRING OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_restricted_string(Cindex1, [<<128>>])
       end,

%%-------------------------------------------------
%% attribute digitMapValue(2)   External megaco_ber_media_gateway_control_v1:DigitMapValue OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_DigitMapValue'(Cindex2, [<<161>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_DigitMapDescriptor(Tlv) ->
   dec_DigitMapDescriptor(Tlv, [16]).

dec_DigitMapDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute digitMapName(1) with type OCTET STRING OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {begin
Val1 = decode_restricted_string(V1, []),
C1 = byte_size(Val1),
if C1 =:= 2 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute digitMapValue(2)   External megaco_ber_media_gateway_control_v1:DigitMapValue OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_DigitMapValue'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'DigitMapDescriptor',Term1,Term2},
Res1.


%%================================
%%  ModemType
%%================================
enc_ModemType(Val) ->
    enc_ModemType(Val, [<<10>>]).

enc_ModemType(Val, TagIn) ->
case Val of
v18 -> encode_tags(TagIn, [0], 1);
v22 -> encode_tags(TagIn, [1], 1);
v22bis -> encode_tags(TagIn, [2], 1);
v32 -> encode_tags(TagIn, [3], 1);
v32bis -> encode_tags(TagIn, [4], 1);
v34 -> encode_tags(TagIn, [5], 1);
v90 -> encode_tags(TagIn, [6], 1);
v91 -> encode_tags(TagIn, [7], 1);
synchISDN -> encode_tags(TagIn, [8], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end.


dec_ModemType(Tlv) ->
   dec_ModemType(Tlv, [10]).

dec_ModemType(Tlv, TagIn) ->
case decode_integer(Tlv, TagIn) of
0 -> v18;
1 -> v22;
2 -> v22bis;
3 -> v32;
4 -> v32bis;
5 -> v34;
6 -> v90;
7 -> v91;
8 -> synchISDN;
Default1 -> {asn1_enum,Default1}
end.



%%================================
%%  ModemDescriptor
%%================================
enc_ModemDescriptor(Val) ->
    enc_ModemDescriptor(Val, [<<48>>]).

enc_ModemDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute mtl(1) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_ModemDescriptor_mtl'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute mpl(2) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_ModemDescriptor_mpl'(Cindex2, [<<161>>]),

%%-------------------------------------------------
%% attribute nonStandardData(3)   External megaco_ber_media_gateway_control_v1:NonStandardData OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_NonStandardData'(Cindex3, [<<162>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  ModemDescriptor_mtl
%%================================
enc_ModemDescriptor_mtl(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_ModemDescriptor_mtl_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_ModemDescriptor_mtl_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_ModemDescriptor_mtl_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = case H of
v18 -> encode_tags([<<10>>], [0], 1);
v22 -> encode_tags([<<10>>], [1], 1);
v22bis -> encode_tags([<<10>>], [2], 1);
v32 -> encode_tags([<<10>>], [3], 1);
v32bis -> encode_tags([<<10>>], [4], 1);
v34 -> encode_tags([<<10>>], [5], 1);
v90 -> encode_tags([<<10>>], [6], 1);
v91 -> encode_tags([<<10>>], [7], 1);
synchISDN -> encode_tags([<<10>>], [8], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end,
   'enc_ModemDescriptor_mtl_components'(T,[EncBytes|AccBytes], AccLen + EncLen).




%%================================
%%  ModemDescriptor_mpl
%%================================
enc_ModemDescriptor_mpl(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_ModemDescriptor_mpl_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_ModemDescriptor_mpl_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_ModemDescriptor_mpl_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_PropertyParm'(H, [<<48>>]),
   'enc_ModemDescriptor_mpl_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_ModemDescriptor(Tlv) ->
   dec_ModemDescriptor(Tlv, [16]).

dec_ModemDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute mtl(1) with type SEQUENCE OF
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_ModemDescriptor_mtl'(V1, [131072]),

%%-------------------------------------------------
%% attribute mpl(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_ModemDescriptor_mpl'(V2, [131073]),

%%-------------------------------------------------
%% attribute nonStandardData(3)   External megaco_ber_media_gateway_control_v1:NonStandardData OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_NonStandardData'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv4}}}) % extra fields not allowed
end,
Res1 = {'ModemDescriptor',Term1,Term2,Term3},
Res1.
'dec_ModemDescriptor_mtl'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
[case decode_integer(V1, [10]) of
0 -> v18;
1 -> v22;
2 -> v22bis;
3 -> v32;
4 -> v32bis;
5 -> v34;
6 -> v90;
7 -> v91;
8 -> synchISDN;
Default1 -> {asn1_enum,Default1}
end || V1 <- Tlv1].


'dec_ModemDescriptor_mpl'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_PropertyParm'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  RequestID
%%================================
enc_RequestID(Val) ->
    enc_RequestID(Val, [<<2>>]).

enc_RequestID(Val, TagIn) ->
encode_integer(Val, TagIn).


dec_RequestID(Tlv) ->
   dec_RequestID(Tlv, [2]).

dec_RequestID(Tlv, TagIn) ->
begin
Val1 = decode_integer(Tlv, TagIn),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  SigParameter
%%================================
enc_SigParameter(Val) ->
    enc_SigParameter(Val, [<<48>>]).

enc_SigParameter(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute sigParameterName(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute value(2)   External megaco_ber_media_gateway_control_v1:Value
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_Value'(Cindex2, [<<161>>]),

%%-------------------------------------------------
%% attribute extraInfo(3) with type CHOICE OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_SigParameter_extraInfo'(Cindex3, [<<162>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  SigParameter_extraInfo
%%================================
enc_SigParameter_extraInfo(Val, TagIn) ->
      {EncBytes,EncLen} = case element(1,Val) of
      relation ->
         case element(2,Val) of
greaterThan -> encode_tags([<<128>>], [0], 1);
smallerThan -> encode_tags([<<128>>], [1], 1);
unequalTo -> encode_tags([<<128>>], [2], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end;
      range ->
         encode_boolean(element(2,Val), [<<129>>]);
      sublist ->
         encode_boolean(element(2,Val), [<<130>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_SigParameter(Tlv) ->
   dec_SigParameter(Tlv, [16]).

dec_SigParameter(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute sigParameterName(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 2 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute value(2)   External megaco_ber_media_gateway_control_v1:Value
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_Value'(V2, [131073]),

%%-------------------------------------------------
%% attribute extraInfo(3) with type CHOICE OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_SigParameter_extraInfo'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'SigParameter',Term1,Term2,Term3},
Res1.
'dec_SigParameter_extraInfo'(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'relation'
    {131072, V1} -> 
        {relation, case decode_integer(V1, []) of
0 -> greaterThan;
1 -> smallerThan;
2 -> unequalTo;
Default1 -> {asn1_enum,Default1}
end};


%% 'range'
    {131073, V1} -> 
        {range, decode_boolean(V1, [])};


%% 'sublist'
    {131074, V1} -> 
        {sublist, decode_boolean(V1, [])};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.


%%================================
%%  NotifyCompletion
%%================================
enc_NotifyCompletion(Val) ->
    enc_NotifyCompletion(Val, [<<3>>]).

enc_NotifyCompletion(Val, TagIn) ->
encode_bit_string([], Val, [{onTimeOut,0},{onInterruptByEvent,1},{onInterruptByNewSignalDescr,2},{otherReason,3}], TagIn).


dec_NotifyCompletion(Tlv) ->
   dec_NotifyCompletion(Tlv, [3]).

dec_NotifyCompletion(Tlv, TagIn) ->
decode_named_bit_string(Tlv, [{onTimeOut,0},{onInterruptByEvent,1},{onInterruptByNewSignalDescr,2},{otherReason,3}], TagIn).



%%================================
%%  SignalName
%%================================
enc_SignalName(Val) ->
    enc_SignalName(Val, [<<4>>]).

enc_SignalName(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_SignalName(Tlv) ->
   dec_SignalName(Tlv, [4]).

dec_SignalName(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  SignalType
%%================================
enc_SignalType(Val) ->
    enc_SignalType(Val, [<<10>>]).

enc_SignalType(Val, TagIn) ->
case Val of
brief -> encode_tags(TagIn, [0], 1);
onOff -> encode_tags(TagIn, [1], 1);
timeOut -> encode_tags(TagIn, [2], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end.


dec_SignalType(Tlv) ->
   dec_SignalType(Tlv, [10]).

dec_SignalType(Tlv, TagIn) ->
case decode_integer(Tlv, TagIn) of
0 -> brief;
1 -> onOff;
2 -> timeOut;
Default1 -> {asn1_enum,Default1}
end.



%%================================
%%  Signal
%%================================
enc_Signal(Val) ->
    enc_Signal(Val, [<<48>>]).

enc_Signal(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4,Cindex5,Cindex6,Cindex7} = Val,

%%-------------------------------------------------
%% attribute signalName(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute sigType(3) with type ENUMERATED OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            case Cindex3 of
brief -> encode_tags([<<130>>], [0], 1);
onOff -> encode_tags([<<130>>], [1], 1);
timeOut -> encode_tags([<<130>>], [2], 1);
Enumval3 -> exit({error,{asn1, {enumerated_not_in_range,Enumval3}}})
end
       end,

%%-------------------------------------------------
%% attribute duration(4) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes4,EncLen4} =  case Cindex4 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex4, [<<131>>])
       end,

%%-------------------------------------------------
%% attribute notifyCompletion(5) with type BIT STRING OPTIONAL
%%-------------------------------------------------
   {EncBytes5,EncLen5} =  case Cindex5 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_bit_string([], Cindex5, [{onTimeOut,0},{onInterruptByEvent,1},{onInterruptByNewSignalDescr,2},{otherReason,3}], [<<132>>])
       end,

%%-------------------------------------------------
%% attribute keepActive(6) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
   {EncBytes6,EncLen6} =  case Cindex6 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_boolean(Cindex6, [<<133>>])
       end,

%%-------------------------------------------------
%% attribute sigParList(7) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes7,EncLen7} = 'enc_Signal_sigParList'(Cindex7, [<<166>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4, EncBytes5, EncBytes6, EncBytes7],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4 + EncLen5 + EncLen6 + EncLen7,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  Signal_sigParList
%%================================
enc_Signal_sigParList(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_Signal_sigParList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_Signal_sigParList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_Signal_sigParList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_SigParameter'(H, [<<48>>]),
   'enc_Signal_sigParList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_Signal(Tlv) ->
   dec_Signal(Tlv, [16]).

dec_Signal(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute signalName(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val2 = decode_integer(V2, []),
if 0 =< Val2, Val2 =< 65535 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute sigType(3) with type ENUMERATED OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {case decode_integer(V3, []) of
0 -> brief;
1 -> onOff;
2 -> timeOut;
Default1 -> {asn1_enum,Default1}
end, TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute duration(4) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term4,Tlv5} = case Tlv4 of
[{131075,V4}|TempTlv5] ->
    {begin
Val3 = decode_integer(V4, []),
if 0 =< Val3, Val3 =< 65535 ->
Val3;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv5};
    _ ->
        { asn1_NOVALUE, Tlv4}
end,

%%-------------------------------------------------
%% attribute notifyCompletion(5) with type BIT STRING OPTIONAL
%%-------------------------------------------------
{Term5,Tlv6} = case Tlv5 of
[{131076,V5}|TempTlv6] ->
    {decode_named_bit_string(V5, [{onTimeOut,0},{onInterruptByEvent,1},{onInterruptByNewSignalDescr,2},{otherReason,3}], []), TempTlv6};
    _ ->
        { asn1_NOVALUE, Tlv5}
end,

%%-------------------------------------------------
%% attribute keepActive(6) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
{Term6,Tlv7} = case Tlv6 of
[{131077,V6}|TempTlv7] ->
    {decode_boolean(V6, []), TempTlv7};
    _ ->
        { asn1_NOVALUE, Tlv6}
end,

%%-------------------------------------------------
%% attribute sigParList(7) with type SEQUENCE OF
%%-------------------------------------------------
[V7|Tlv8] = Tlv7, 
Term7 = 'dec_Signal_sigParList'(V7, [131078]),

case Tlv8 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'Signal',Term1,Term2,Term3,Term4,Term5,Term6,Term7},
Res1.
'dec_Signal_sigParList'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_SigParameter'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  SeqSigList
%%================================
enc_SeqSigList(Val) ->
    enc_SeqSigList(Val, [<<48>>]).

enc_SeqSigList(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute id(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute signalList(2) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_SeqSigList_signalList'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  SeqSigList_signalList
%%================================
enc_SeqSigList_signalList(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_SeqSigList_signalList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_SeqSigList_signalList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_SeqSigList_signalList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_Signal'(H, [<<48>>]),
   'enc_SeqSigList_signalList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_SeqSigList(Tlv) ->
   dec_SeqSigList(Tlv, [16]).

dec_SeqSigList(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute id(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 65535 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute signalList(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_SeqSigList_signalList'(V2, [131073]),

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'SeqSigList',Term1,Term2},
Res1.
'dec_SeqSigList_signalList'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_Signal'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  SignalRequest
%%================================
enc_SignalRequest(Val) ->
    enc_SignalRequest(Val, []).

enc_SignalRequest(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      signal ->
         'enc_Signal'(element(2,Val), [<<160>>]);
      seqSigList ->
         'enc_SeqSigList'(element(2,Val), [<<161>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_SignalRequest(Tlv) ->
   dec_SignalRequest(Tlv, []).

dec_SignalRequest(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'signal'
    {131072, V1} -> 
        {signal, 'dec_Signal'(V1, [])};


%% 'seqSigList'
    {131073, V1} -> 
        {seqSigList, 'dec_SeqSigList'(V1, [])};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  SignalsDescriptor
%%================================
enc_SignalsDescriptor(Val) ->
    enc_SignalsDescriptor(Val, [<<48>>]).

enc_SignalsDescriptor(Val, TagIn) ->
   {EncBytes,EncLen} = 'enc_SignalsDescriptor_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_SignalsDescriptor_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_SignalsDescriptor_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_SignalRequest'(H, []),
   'enc_SignalsDescriptor_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_SignalsDescriptor(Tlv) ->
   dec_SignalsDescriptor(Tlv, [16]).

dec_SignalsDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_SignalRequest'(V1, []) || V1 <- Tlv1].




%%================================
%%  EventSpec
%%================================
enc_EventSpec(Val) ->
    enc_EventSpec(Val, [<<48>>]).

enc_EventSpec(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute eventName(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute eventParList(3) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes3,EncLen3} = 'enc_EventSpec_eventParList'(Cindex3, [<<162>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  EventSpec_eventParList
%%================================
enc_EventSpec_eventParList(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_EventSpec_eventParList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_EventSpec_eventParList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_EventSpec_eventParList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_EventParameter'(H, [<<48>>]),
   'enc_EventSpec_eventParList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_EventSpec(Tlv) ->
   dec_EventSpec(Tlv, [16]).

dec_EventSpec(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute eventName(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val2 = decode_integer(V2, []),
if 0 =< Val2, Val2 =< 65535 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute eventParList(3) with type SEQUENCE OF
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = 'dec_EventSpec_eventParList'(V3, [131074]),

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'EventSpec',Term1,Term2,Term3},
Res1.
'dec_EventSpec_eventParList'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_EventParameter'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  EventBufferDescriptor
%%================================
enc_EventBufferDescriptor(Val) ->
    enc_EventBufferDescriptor(Val, [<<48>>]).

enc_EventBufferDescriptor(Val, TagIn) ->
   {EncBytes,EncLen} = 'enc_EventBufferDescriptor_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_EventBufferDescriptor_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_EventBufferDescriptor_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_EventSpec'(H, [<<48>>]),
   'enc_EventBufferDescriptor_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_EventBufferDescriptor(Tlv) ->
   dec_EventBufferDescriptor(Tlv, [16]).

dec_EventBufferDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_EventSpec'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  SecondRequestedActions
%%================================
enc_SecondRequestedActions(Val) ->
    enc_SecondRequestedActions(Val, [<<48>>]).

enc_SecondRequestedActions(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute keepActive(1) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_boolean(Cindex1, [<<128>>])
       end,

%%-------------------------------------------------
%% attribute eventDM(2)   External megaco_ber_media_gateway_control_v1:EventDM OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_EventDM'(Cindex2, [<<161>>])
       end,

%%-------------------------------------------------
%% attribute signalsDescriptor(3)   External megaco_ber_media_gateway_control_v1:SignalsDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_SignalsDescriptor'(Cindex3, [<<162>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_SecondRequestedActions(Tlv) ->
   dec_SecondRequestedActions(Tlv, [16]).

dec_SecondRequestedActions(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute keepActive(1) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {decode_boolean(V1, []), TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute eventDM(2)   External megaco_ber_media_gateway_control_v1:EventDM OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_EventDM'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute signalsDescriptor(3)   External megaco_ber_media_gateway_control_v1:SignalsDescriptor OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_SignalsDescriptor'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'SecondRequestedActions',Term1,Term2,Term3},
Res1.


%%================================
%%  SecondRequestedEvent
%%================================
enc_SecondRequestedEvent(Val) ->
    enc_SecondRequestedEvent(Val, [<<48>>]).

enc_SecondRequestedEvent(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4} = Val,

%%-------------------------------------------------
%% attribute pkgdName(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute eventAction(3)   External megaco_ber_media_gateway_control_v1:SecondRequestedActions OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_SecondRequestedActions'(Cindex3, [<<162>>])
       end,

%%-------------------------------------------------
%% attribute evParList(4) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes4,EncLen4} = 'enc_SecondRequestedEvent_evParList'(Cindex4, [<<163>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  SecondRequestedEvent_evParList
%%================================
enc_SecondRequestedEvent_evParList(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_SecondRequestedEvent_evParList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_SecondRequestedEvent_evParList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_SecondRequestedEvent_evParList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_EventParameter'(H, [<<48>>]),
   'enc_SecondRequestedEvent_evParList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_SecondRequestedEvent(Tlv) ->
   dec_SecondRequestedEvent(Tlv, [16]).

dec_SecondRequestedEvent(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute pkgdName(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val2 = decode_integer(V2, []),
if 0 =< Val2, Val2 =< 65535 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute eventAction(3)   External megaco_ber_media_gateway_control_v1:SecondRequestedActions OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_SecondRequestedActions'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute evParList(4) with type SEQUENCE OF
%%-------------------------------------------------
[V4|Tlv5] = Tlv4, 
Term4 = 'dec_SecondRequestedEvent_evParList'(V4, [131075]),

case Tlv5 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'SecondRequestedEvent',Term1,Term2,Term3,Term4},
Res1.
'dec_SecondRequestedEvent_evParList'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_EventParameter'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  SecondEventsDescriptor
%%================================
enc_SecondEventsDescriptor(Val) ->
    enc_SecondEventsDescriptor(Val, [<<48>>]).

enc_SecondEventsDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute requestID(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute eventList(2) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_SecondEventsDescriptor_eventList'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  SecondEventsDescriptor_eventList
%%================================
enc_SecondEventsDescriptor_eventList(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_SecondEventsDescriptor_eventList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_SecondEventsDescriptor_eventList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_SecondEventsDescriptor_eventList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_SecondRequestedEvent'(H, [<<48>>]),
   'enc_SecondEventsDescriptor_eventList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_SecondEventsDescriptor(Tlv) ->
   dec_SecondEventsDescriptor(Tlv, [16]).

dec_SecondEventsDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute requestID(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute eventList(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_SecondEventsDescriptor_eventList'(V2, [131073]),

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'SecondEventsDescriptor',Term1,Term2},
Res1.
'dec_SecondEventsDescriptor_eventList'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_SecondRequestedEvent'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  EventDM
%%================================
enc_EventDM(Val) ->
    enc_EventDM(Val, []).

enc_EventDM(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      digitMapName ->
         encode_restricted_string(element(2,Val), [<<128>>]);
      digitMapValue ->
         'enc_DigitMapValue'(element(2,Val), [<<161>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_EventDM(Tlv) ->
   dec_EventDM(Tlv, []).

dec_EventDM(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'digitMapName'
    {131072, V1} -> 
        {digitMapName, begin
Val1 = decode_restricted_string(V1, []),
C1 = byte_size(Val1),
if C1 =:= 2 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end};


%% 'digitMapValue'
    {131073, V1} -> 
        {digitMapValue, 'dec_DigitMapValue'(V1, [])};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.


%%================================
%%  RequestedActions
%%================================
enc_RequestedActions(Val) ->
    enc_RequestedActions(Val, [<<48>>]).

enc_RequestedActions(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4} = Val,

%%-------------------------------------------------
%% attribute keepActive(1) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_boolean(Cindex1, [<<128>>])
       end,

%%-------------------------------------------------
%% attribute eventDM(2)   External megaco_ber_media_gateway_control_v1:EventDM OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_EventDM'(Cindex2, [<<161>>])
       end,

%%-------------------------------------------------
%% attribute secondEvent(3)   External megaco_ber_media_gateway_control_v1:SecondEventsDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_SecondEventsDescriptor'(Cindex3, [<<162>>])
       end,

%%-------------------------------------------------
%% attribute signalsDescriptor(4)   External megaco_ber_media_gateway_control_v1:SignalsDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes4,EncLen4} =  case Cindex4 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_SignalsDescriptor'(Cindex4, [<<163>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_RequestedActions(Tlv) ->
   dec_RequestedActions(Tlv, [16]).

dec_RequestedActions(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute keepActive(1) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {decode_boolean(V1, []), TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute eventDM(2)   External megaco_ber_media_gateway_control_v1:EventDM OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_EventDM'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute secondEvent(3)   External megaco_ber_media_gateway_control_v1:SecondEventsDescriptor OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_SecondEventsDescriptor'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute signalsDescriptor(4)   External megaco_ber_media_gateway_control_v1:SignalsDescriptor OPTIONAL
%%-------------------------------------------------
{Term4,Tlv5} = case Tlv4 of
[{131075,V4}|TempTlv5] ->
    {'dec_SignalsDescriptor'(V4, []), TempTlv5};
    _ ->
        { asn1_NOVALUE, Tlv4}
end,

case Tlv5 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'RequestedActions',Term1,Term2,Term3,Term4},
Res1.


%%================================
%%  RequestedEvent
%%================================
enc_RequestedEvent(Val) ->
    enc_RequestedEvent(Val, [<<48>>]).

enc_RequestedEvent(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4} = Val,

%%-------------------------------------------------
%% attribute pkgdName(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute eventAction(3)   External megaco_ber_media_gateway_control_v1:RequestedActions OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_RequestedActions'(Cindex3, [<<162>>])
       end,

%%-------------------------------------------------
%% attribute evParList(4) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes4,EncLen4} = 'enc_RequestedEvent_evParList'(Cindex4, [<<163>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  RequestedEvent_evParList
%%================================
enc_RequestedEvent_evParList(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_RequestedEvent_evParList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_RequestedEvent_evParList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_RequestedEvent_evParList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_EventParameter'(H, [<<48>>]),
   'enc_RequestedEvent_evParList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_RequestedEvent(Tlv) ->
   dec_RequestedEvent(Tlv, [16]).

dec_RequestedEvent(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute pkgdName(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val2 = decode_integer(V2, []),
if 0 =< Val2, Val2 =< 65535 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute eventAction(3)   External megaco_ber_media_gateway_control_v1:RequestedActions OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_RequestedActions'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute evParList(4) with type SEQUENCE OF
%%-------------------------------------------------
[V4|Tlv5] = Tlv4, 
Term4 = 'dec_RequestedEvent_evParList'(V4, [131075]),

case Tlv5 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'RequestedEvent',Term1,Term2,Term3,Term4},
Res1.
'dec_RequestedEvent_evParList'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_EventParameter'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  EventsDescriptor
%%================================
enc_EventsDescriptor(Val) ->
    enc_EventsDescriptor(Val, [<<48>>]).

enc_EventsDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute requestID(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute eventList(2) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_EventsDescriptor_eventList'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  EventsDescriptor_eventList
%%================================
enc_EventsDescriptor_eventList(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_EventsDescriptor_eventList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_EventsDescriptor_eventList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_EventsDescriptor_eventList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_RequestedEvent'(H, [<<48>>]),
   'enc_EventsDescriptor_eventList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_EventsDescriptor(Tlv) ->
   dec_EventsDescriptor(Tlv, [16]).

dec_EventsDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute requestID(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute eventList(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_EventsDescriptor_eventList'(V2, [131073]),

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'EventsDescriptor',Term1,Term2},
Res1.
'dec_EventsDescriptor_eventList'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_RequestedEvent'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  StreamID
%%================================
enc_StreamID(Val) ->
    enc_StreamID(Val, [<<2>>]).

enc_StreamID(Val, TagIn) ->
encode_integer(Val, TagIn).


dec_StreamID(Tlv) ->
   dec_StreamID(Tlv, [2]).

dec_StreamID(Tlv, TagIn) ->
begin
Val1 = decode_integer(Tlv, TagIn),
if 0 =< Val1, Val1 =< 65535 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  MuxType
%%================================
enc_MuxType(Val) ->
    enc_MuxType(Val, [<<10>>]).

enc_MuxType(Val, TagIn) ->
case Val of
h221 -> encode_tags(TagIn, [0], 1);
h223 -> encode_tags(TagIn, [1], 1);
h226 -> encode_tags(TagIn, [2], 1);
v76 -> encode_tags(TagIn, [3], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end.


dec_MuxType(Tlv) ->
   dec_MuxType(Tlv, [10]).

dec_MuxType(Tlv, TagIn) ->
case decode_integer(Tlv, TagIn) of
0 -> h221;
1 -> h223;
2 -> h226;
3 -> v76;
Default1 -> {asn1_enum,Default1}
end.



%%================================
%%  MuxDescriptor
%%================================
enc_MuxDescriptor(Val) ->
    enc_MuxDescriptor(Val, [<<48>>]).

enc_MuxDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute muxType(1) with type ENUMERATED
%%-------------------------------------------------
   {EncBytes1,EncLen1} = case Cindex1 of
h221 -> encode_tags([<<128>>], [0], 1);
h223 -> encode_tags([<<128>>], [1], 1);
h226 -> encode_tags([<<128>>], [2], 1);
v76 -> encode_tags([<<128>>], [3], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end,

%%-------------------------------------------------
%% attribute termList(2) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_MuxDescriptor_termList'(Cindex2, [<<161>>]),

%%-------------------------------------------------
%% attribute nonStandardData(3)   External megaco_ber_media_gateway_control_v1:NonStandardData OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_NonStandardData'(Cindex3, [<<162>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  MuxDescriptor_termList
%%================================
enc_MuxDescriptor_termList(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_MuxDescriptor_termList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_MuxDescriptor_termList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_MuxDescriptor_termList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_TerminationID'(H, [<<48>>]),
   'enc_MuxDescriptor_termList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_MuxDescriptor(Tlv) ->
   dec_MuxDescriptor(Tlv, [16]).

dec_MuxDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute muxType(1) with type ENUMERATED
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = case decode_integer(V1, [131072]) of
0 -> h221;
1 -> h223;
2 -> h226;
3 -> v76;
Default1 -> {asn1_enum,Default1}
end,

%%-------------------------------------------------
%% attribute termList(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_MuxDescriptor_termList'(V2, [131073]),

%%-------------------------------------------------
%% attribute nonStandardData(3)   External megaco_ber_media_gateway_control_v1:NonStandardData OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_NonStandardData'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'MuxDescriptor',Term1,Term2,Term3},
Res1.
'dec_MuxDescriptor_termList'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_TerminationID'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  ServiceState
%%================================
enc_ServiceState(Val) ->
    enc_ServiceState(Val, [<<10>>]).

enc_ServiceState(Val, TagIn) ->
case Val of
test -> encode_tags(TagIn, [0], 1);
outOfSvc -> encode_tags(TagIn, [1], 1);
inSvc -> encode_tags(TagIn, [2], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end.


dec_ServiceState(Tlv) ->
   dec_ServiceState(Tlv, [10]).

dec_ServiceState(Tlv, TagIn) ->
case decode_integer(Tlv, TagIn) of
0 -> test;
1 -> outOfSvc;
2 -> inSvc;
Default1 -> {asn1_enum,Default1}
end.



%%================================
%%  EventBufferControl
%%================================
enc_EventBufferControl(Val) ->
    enc_EventBufferControl(Val, [<<10>>]).

enc_EventBufferControl(Val, TagIn) ->
case Val of
off -> encode_tags(TagIn, [0], 1);
lockStep -> encode_tags(TagIn, [1], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end.


dec_EventBufferControl(Tlv) ->
   dec_EventBufferControl(Tlv, [10]).

dec_EventBufferControl(Tlv, TagIn) ->
case decode_integer(Tlv, TagIn) of
0 -> off;
1 -> lockStep;
Default1 -> {asn1_enum,Default1}
end.



%%================================
%%  TerminationStateDescriptor
%%================================
enc_TerminationStateDescriptor(Val) ->
    enc_TerminationStateDescriptor(Val, [<<48>>]).

enc_TerminationStateDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute propertyParms(1) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationStateDescriptor_propertyParms'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute eventBufferControl(2) with type ENUMERATED OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            case Cindex2 of
off -> encode_tags([<<129>>], [0], 1);
lockStep -> encode_tags([<<129>>], [1], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end
       end,

%%-------------------------------------------------
%% attribute serviceState(3) with type ENUMERATED OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            case Cindex3 of
test -> encode_tags([<<130>>], [0], 1);
outOfSvc -> encode_tags([<<130>>], [1], 1);
inSvc -> encode_tags([<<130>>], [2], 1);
Enumval2 -> exit({error,{asn1, {enumerated_not_in_range,Enumval2}}})
end
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  TerminationStateDescriptor_propertyParms
%%================================
enc_TerminationStateDescriptor_propertyParms(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_TerminationStateDescriptor_propertyParms_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_TerminationStateDescriptor_propertyParms_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_TerminationStateDescriptor_propertyParms_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_PropertyParm'(H, [<<48>>]),
   'enc_TerminationStateDescriptor_propertyParms_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_TerminationStateDescriptor(Tlv) ->
   dec_TerminationStateDescriptor(Tlv, [16]).

dec_TerminationStateDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute propertyParms(1) with type SEQUENCE OF
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationStateDescriptor_propertyParms'(V1, [131072]),

%%-------------------------------------------------
%% attribute eventBufferControl(2) with type ENUMERATED OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {case decode_integer(V2, []) of
0 -> off;
1 -> lockStep;
Default1 -> {asn1_enum,Default1}
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute serviceState(3) with type ENUMERATED OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {case decode_integer(V3, []) of
0 -> test;
1 -> outOfSvc;
2 -> inSvc;
Default2 -> {asn1_enum,Default2}
end, TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'TerminationStateDescriptor',Term1,Term2,Term3},
Res1.
'dec_TerminationStateDescriptor_propertyParms'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_PropertyParm'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  PropertyGroup
%%================================
enc_PropertyGroup(Val) ->
    enc_PropertyGroup(Val, [<<48>>]).

enc_PropertyGroup(Val, TagIn) ->
   {EncBytes,EncLen} = 'enc_PropertyGroup_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_PropertyGroup_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_PropertyGroup_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_PropertyParm'(H, [<<48>>]),
   'enc_PropertyGroup_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_PropertyGroup(Tlv) ->
   dec_PropertyGroup(Tlv, [16]).

dec_PropertyGroup(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_PropertyParm'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  LocalRemoteDescriptor
%%================================
enc_LocalRemoteDescriptor(Val) ->
    enc_LocalRemoteDescriptor(Val, [<<48>>]).

enc_LocalRemoteDescriptor(Val, TagIn) ->
{_,Cindex1} = Val,

%%-------------------------------------------------
%% attribute propGrps(1) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_LocalRemoteDescriptor_propGrps'(Cindex1, [<<160>>]),

   BytesSoFar = [EncBytes1],
LenSoFar = EncLen1,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  LocalRemoteDescriptor_propGrps
%%================================
enc_LocalRemoteDescriptor_propGrps(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_LocalRemoteDescriptor_propGrps_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_LocalRemoteDescriptor_propGrps_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_LocalRemoteDescriptor_propGrps_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_PropertyGroup'(H, [<<48>>]),
   'enc_LocalRemoteDescriptor_propGrps_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_LocalRemoteDescriptor(Tlv) ->
   dec_LocalRemoteDescriptor(Tlv, [16]).

dec_LocalRemoteDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute propGrps(1) with type SEQUENCE OF
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_LocalRemoteDescriptor_propGrps'(V1, [131072]),

case Tlv2 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'LocalRemoteDescriptor',Term1},
Res1.
'dec_LocalRemoteDescriptor_propGrps'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_PropertyGroup'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  Relation
%%================================
enc_Relation(Val) ->
    enc_Relation(Val, [<<10>>]).

enc_Relation(Val, TagIn) ->
case Val of
greaterThan -> encode_tags(TagIn, [0], 1);
smallerThan -> encode_tags(TagIn, [1], 1);
unequalTo -> encode_tags(TagIn, [2], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end.


dec_Relation(Tlv) ->
   dec_Relation(Tlv, [10]).

dec_Relation(Tlv, TagIn) ->
case decode_integer(Tlv, TagIn) of
0 -> greaterThan;
1 -> smallerThan;
2 -> unequalTo;
Default1 -> {asn1_enum,Default1}
end.



%%================================
%%  PkgdName
%%================================
enc_PkgdName(Val) ->
    enc_PkgdName(Val, [<<4>>]).

enc_PkgdName(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_PkgdName(Tlv) ->
   dec_PkgdName(Tlv, [4]).

dec_PkgdName(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  Name
%%================================
enc_Name(Val) ->
    enc_Name(Val, [<<4>>]).

enc_Name(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_Name(Tlv) ->
   dec_Name(Tlv, [4]).

dec_Name(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if C1 =:= 2 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  PropertyParm
%%================================
enc_PropertyParm(Val) ->
    enc_PropertyParm(Val, [<<48>>]).

enc_PropertyParm(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute name(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute value(2) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_PropertyParm_value'(Cindex2, [<<161>>]),

%%-------------------------------------------------
%% attribute extraInfo(3) with type CHOICE OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_PropertyParm_extraInfo'(Cindex3, [<<162>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  PropertyParm_value
%%================================
enc_PropertyParm_value(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_PropertyParm_value_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_PropertyParm_value_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_PropertyParm_value_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = encode_restricted_string(H, [<<4>>]),
   'enc_PropertyParm_value_components'(T,[EncBytes|AccBytes], AccLen + EncLen).




%%================================
%%  PropertyParm_extraInfo
%%================================
enc_PropertyParm_extraInfo(Val, TagIn) ->
      {EncBytes,EncLen} = case element(1,Val) of
      relation ->
         case element(2,Val) of
greaterThan -> encode_tags([<<128>>], [0], 1);
smallerThan -> encode_tags([<<128>>], [1], 1);
unequalTo -> encode_tags([<<128>>], [2], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end;
      range ->
         encode_boolean(element(2,Val), [<<129>>]);
      sublist ->
         encode_boolean(element(2,Val), [<<130>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_PropertyParm(Tlv) ->
   dec_PropertyParm(Tlv, [16]).

dec_PropertyParm(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute name(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute value(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_PropertyParm_value'(V2, [131073]),

%%-------------------------------------------------
%% attribute extraInfo(3) with type CHOICE OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_PropertyParm_extraInfo'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'PropertyParm',Term1,Term2,Term3},
Res1.
'dec_PropertyParm_value'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
[begin
binary_to_list(decode_restricted_string(V1, [4]))
end
 || V1 <- Tlv1].


'dec_PropertyParm_extraInfo'(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'relation'
    {131072, V1} -> 
        {relation, case decode_integer(V1, []) of
0 -> greaterThan;
1 -> smallerThan;
2 -> unequalTo;
Default1 -> {asn1_enum,Default1}
end};


%% 'range'
    {131073, V1} -> 
        {range, decode_boolean(V1, [])};


%% 'sublist'
    {131074, V1} -> 
        {sublist, decode_boolean(V1, [])};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.


%%================================
%%  StreamMode
%%================================
enc_StreamMode(Val) ->
    enc_StreamMode(Val, [<<10>>]).

enc_StreamMode(Val, TagIn) ->
case Val of
sendOnly -> encode_tags(TagIn, [0], 1);
recvOnly -> encode_tags(TagIn, [1], 1);
sendRecv -> encode_tags(TagIn, [2], 1);
inactive -> encode_tags(TagIn, [3], 1);
loopBack -> encode_tags(TagIn, [4], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end.


dec_StreamMode(Tlv) ->
   dec_StreamMode(Tlv, [10]).

dec_StreamMode(Tlv, TagIn) ->
case decode_integer(Tlv, TagIn) of
0 -> sendOnly;
1 -> recvOnly;
2 -> sendRecv;
3 -> inactive;
4 -> loopBack;
Default1 -> {asn1_enum,Default1}
end.



%%================================
%%  LocalControlDescriptor
%%================================
enc_LocalControlDescriptor(Val) ->
    enc_LocalControlDescriptor(Val, [<<48>>]).

enc_LocalControlDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4} = Val,

%%-------------------------------------------------
%% attribute streamMode(1) with type ENUMERATED OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            case Cindex1 of
sendOnly -> encode_tags([<<128>>], [0], 1);
recvOnly -> encode_tags([<<128>>], [1], 1);
sendRecv -> encode_tags([<<128>>], [2], 1);
inactive -> encode_tags([<<128>>], [3], 1);
loopBack -> encode_tags([<<128>>], [4], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end
       end,

%%-------------------------------------------------
%% attribute reserveValue(2) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_boolean(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute reserveGroup(3) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_boolean(Cindex3, [<<130>>])
       end,

%%-------------------------------------------------
%% attribute propertyParms(4) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes4,EncLen4} = 'enc_LocalControlDescriptor_propertyParms'(Cindex4, [<<163>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  LocalControlDescriptor_propertyParms
%%================================
enc_LocalControlDescriptor_propertyParms(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_LocalControlDescriptor_propertyParms_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_LocalControlDescriptor_propertyParms_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_LocalControlDescriptor_propertyParms_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_PropertyParm'(H, [<<48>>]),
   'enc_LocalControlDescriptor_propertyParms_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_LocalControlDescriptor(Tlv) ->
   dec_LocalControlDescriptor(Tlv, [16]).

dec_LocalControlDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute streamMode(1) with type ENUMERATED OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {case decode_integer(V1, []) of
0 -> sendOnly;
1 -> recvOnly;
2 -> sendRecv;
3 -> inactive;
4 -> loopBack;
Default1 -> {asn1_enum,Default1}
end, TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute reserveValue(2) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {decode_boolean(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute reserveGroup(3) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {decode_boolean(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute propertyParms(4) with type SEQUENCE OF
%%-------------------------------------------------
[V4|Tlv5] = Tlv4, 
Term4 = 'dec_LocalControlDescriptor_propertyParms'(V4, [131075]),

case Tlv5 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'LocalControlDescriptor',Term1,Term2,Term3,Term4},
Res1.
'dec_LocalControlDescriptor_propertyParms'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_PropertyParm'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  StreamParms
%%================================
enc_StreamParms(Val) ->
    enc_StreamParms(Val, [<<48>>]).

enc_StreamParms(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute localControlDescriptor(1)   External megaco_ber_media_gateway_control_v1:LocalControlDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_LocalControlDescriptor'(Cindex1, [<<160>>])
       end,

%%-------------------------------------------------
%% attribute localDescriptor(2)   External megaco_ber_media_gateway_control_v1:LocalRemoteDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_LocalRemoteDescriptor'(Cindex2, [<<161>>])
       end,

%%-------------------------------------------------
%% attribute remoteDescriptor(3)   External megaco_ber_media_gateway_control_v1:LocalRemoteDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_LocalRemoteDescriptor'(Cindex3, [<<162>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_StreamParms(Tlv) ->
   dec_StreamParms(Tlv, [16]).

dec_StreamParms(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute localControlDescriptor(1)   External megaco_ber_media_gateway_control_v1:LocalControlDescriptor OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {'dec_LocalControlDescriptor'(V1, []), TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute localDescriptor(2)   External megaco_ber_media_gateway_control_v1:LocalRemoteDescriptor OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_LocalRemoteDescriptor'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute remoteDescriptor(3)   External megaco_ber_media_gateway_control_v1:LocalRemoteDescriptor OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_LocalRemoteDescriptor'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'StreamParms',Term1,Term2,Term3},
Res1.


%%================================
%%  StreamDescriptor
%%================================
enc_StreamDescriptor(Val) ->
    enc_StreamDescriptor(Val, [<<48>>]).

enc_StreamDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute streamID(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute streamParms(2)   External megaco_ber_media_gateway_control_v1:StreamParms
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_StreamParms'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_StreamDescriptor(Tlv) ->
   dec_StreamDescriptor(Tlv, [16]).

dec_StreamDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute streamID(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 65535 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute streamParms(2)   External megaco_ber_media_gateway_control_v1:StreamParms
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_StreamParms'(V2, [131073]),

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'StreamDescriptor',Term1,Term2},
Res1.


%%================================
%%  MediaDescriptor
%%================================
enc_MediaDescriptor(Val) ->
    enc_MediaDescriptor(Val, [<<48>>]).

enc_MediaDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute termStateDescr(1)   External megaco_ber_media_gateway_control_v1:TerminationStateDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_TerminationStateDescriptor'(Cindex1, [<<160>>])
       end,

%%-------------------------------------------------
%% attribute streams(2) with type CHOICE OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_MediaDescriptor_streams'(Cindex2, [<<161>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  MediaDescriptor_streams
%%================================
enc_MediaDescriptor_streams(Val, TagIn) ->
      {EncBytes,EncLen} = case element(1,Val) of
      oneStream ->
         'enc_StreamParms'(element(2,Val), [<<160>>]);
      multiStream ->
         'enc_MediaDescriptor_streams_multiStream'(element(2,Val), [<<161>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).





%%================================
%%  MediaDescriptor_streams_multiStream
%%================================
enc_MediaDescriptor_streams_multiStream(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_MediaDescriptor_streams_multiStream_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_MediaDescriptor_streams_multiStream_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_MediaDescriptor_streams_multiStream_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_StreamDescriptor'(H, [<<48>>]),
   'enc_MediaDescriptor_streams_multiStream_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_MediaDescriptor(Tlv) ->
   dec_MediaDescriptor(Tlv, [16]).

dec_MediaDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute termStateDescr(1)   External megaco_ber_media_gateway_control_v1:TerminationStateDescriptor OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {'dec_TerminationStateDescriptor'(V1, []), TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute streams(2) with type CHOICE OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_MediaDescriptor_streams'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'MediaDescriptor',Term1,Term2},
Res1.
'dec_MediaDescriptor_streams'(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'oneStream'
    {131072, V1} -> 
        {oneStream, 'dec_StreamParms'(V1, [])};


%% 'multiStream'
    {131073, V1} -> 
        {multiStream, 'dec_MediaDescriptor_streams_multiStream'(V1, [])};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.
'dec_MediaDescriptor_streams_multiStream'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_StreamDescriptor'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  TerminationIDList
%%================================
enc_TerminationIDList(Val) ->
    enc_TerminationIDList(Val, [<<48>>]).

enc_TerminationIDList(Val, TagIn) ->
   {EncBytes,EncLen} = 'enc_TerminationIDList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_TerminationIDList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_TerminationIDList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_TerminationID'(H, [<<48>>]),
   'enc_TerminationIDList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_TerminationIDList(Tlv) ->
   dec_TerminationIDList(Tlv, [16]).

dec_TerminationIDList(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_TerminationID'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  TerminationID
%%================================
enc_TerminationID(Val) ->
    enc_TerminationID(Val, [<<48>>]).

enc_TerminationID(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute wildcard(1) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationID_wildcard'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute id(2) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes2,EncLen2} = encode_restricted_string(Cindex2, [<<129>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  TerminationID_wildcard
%%================================
enc_TerminationID_wildcard(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_TerminationID_wildcard_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_TerminationID_wildcard_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_TerminationID_wildcard_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = encode_restricted_string(H, [<<4>>]),
   'enc_TerminationID_wildcard_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_TerminationID(Tlv) ->
   dec_TerminationID(Tlv, [16]).

dec_TerminationID(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute wildcard(1) with type SEQUENCE OF
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationID_wildcard'(V1, [131072]),

%%-------------------------------------------------
%% attribute id(2) with type OCTET STRING
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = begin
Val1 = decode_restricted_string(V2, [131073]),
C1 = byte_size(Val1),
if 1 =< C1, C1 =< 8 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'TerminationID',Term1,Term2},
Res1.
'dec_TerminationID_wildcard'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
[begin
Val1 = decode_restricted_string(V1, [4]),
C1 = byte_size(Val1),
if C1 =:= 1 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end || V1 <- Tlv1].




%%================================
%%  WildcardField
%%================================
enc_WildcardField(Val) ->
    enc_WildcardField(Val, [<<4>>]).

enc_WildcardField(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_WildcardField(Tlv) ->
   dec_WildcardField(Tlv, [4]).

dec_WildcardField(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if C1 =:= 1 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  ServiceChangeResult
%%================================
enc_ServiceChangeResult(Val) ->
    enc_ServiceChangeResult(Val, []).

enc_ServiceChangeResult(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      errorDescriptor ->
         'enc_ErrorDescriptor'(element(2,Val), [<<160>>]);
      serviceChangeResParms ->
         'enc_ServiceChangeResParm'(element(2,Val), [<<161>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_ServiceChangeResult(Tlv) ->
   dec_ServiceChangeResult(Tlv, []).

dec_ServiceChangeResult(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'errorDescriptor'
    {131072, V1} -> 
        {errorDescriptor, 'dec_ErrorDescriptor'(V1, [])};


%% 'serviceChangeResParms'
    {131073, V1} -> 
        {serviceChangeResParms, 'dec_ServiceChangeResParm'(V1, [])};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.


%%================================
%%  ServiceChangeReply
%%================================
enc_ServiceChangeReply(Val) ->
    enc_ServiceChangeReply(Val, [<<48>>]).

enc_ServiceChangeReply(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationIDList'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute serviceChangeResult(2)   External megaco_ber_media_gateway_control_v1:ServiceChangeResult
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_ServiceChangeResult'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_ServiceChangeReply(Tlv) ->
   dec_ServiceChangeReply(Tlv, [16]).

dec_ServiceChangeReply(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationIDList'(V1, [131072]),

%%-------------------------------------------------
%% attribute serviceChangeResult(2)   External megaco_ber_media_gateway_control_v1:ServiceChangeResult
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_ServiceChangeResult'(V2, [131073]),

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'ServiceChangeReply',Term1,Term2},
Res1.


%%================================
%%  ServiceChangeRequest
%%================================
enc_ServiceChangeRequest(Val) ->
    enc_ServiceChangeRequest(Val, [<<48>>]).

enc_ServiceChangeRequest(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationIDList'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute serviceChangeParms(2)   External megaco_ber_media_gateway_control_v1:ServiceChangeParm
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_ServiceChangeParm'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_ServiceChangeRequest(Tlv) ->
   dec_ServiceChangeRequest(Tlv, [16]).

dec_ServiceChangeRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationIDList'(V1, [131072]),

%%-------------------------------------------------
%% attribute serviceChangeParms(2)   External megaco_ber_media_gateway_control_v1:ServiceChangeParm
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_ServiceChangeParm'(V2, [131073]),

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'ServiceChangeRequest',Term1,Term2},
Res1.


%%================================
%%  EventParameter
%%================================
enc_EventParameter(Val) ->
    enc_EventParameter(Val, [<<48>>]).

enc_EventParameter(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute eventParameterName(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute value(2)   External megaco_ber_media_gateway_control_v1:Value
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_Value'(Cindex2, [<<161>>]),

%%-------------------------------------------------
%% attribute extraInfo(3) with type CHOICE OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_EventParameter_extraInfo'(Cindex3, [<<162>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  EventParameter_extraInfo
%%================================
enc_EventParameter_extraInfo(Val, TagIn) ->
      {EncBytes,EncLen} = case element(1,Val) of
      relation ->
         case element(2,Val) of
greaterThan -> encode_tags([<<128>>], [0], 1);
smallerThan -> encode_tags([<<128>>], [1], 1);
unequalTo -> encode_tags([<<128>>], [2], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end;
      range ->
         encode_boolean(element(2,Val), [<<129>>]);
      sublist ->
         encode_boolean(element(2,Val), [<<130>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_EventParameter(Tlv) ->
   dec_EventParameter(Tlv, [16]).

dec_EventParameter(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute eventParameterName(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 2 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute value(2)   External megaco_ber_media_gateway_control_v1:Value
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_Value'(V2, [131073]),

%%-------------------------------------------------
%% attribute extraInfo(3) with type CHOICE OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_EventParameter_extraInfo'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'EventParameter',Term1,Term2,Term3},
Res1.
'dec_EventParameter_extraInfo'(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'relation'
    {131072, V1} -> 
        {relation, case decode_integer(V1, []) of
0 -> greaterThan;
1 -> smallerThan;
2 -> unequalTo;
Default1 -> {asn1_enum,Default1}
end};


%% 'range'
    {131073, V1} -> 
        {range, decode_boolean(V1, [])};


%% 'sublist'
    {131074, V1} -> 
        {sublist, decode_boolean(V1, [])};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.


%%================================
%%  EventName
%%================================
enc_EventName(Val) ->
    enc_EventName(Val, [<<4>>]).

enc_EventName(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_EventName(Tlv) ->
   dec_EventName(Tlv, [4]).

dec_EventName(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  ObservedEvent
%%================================
enc_ObservedEvent(Val) ->
    enc_ObservedEvent(Val, [<<48>>]).

enc_ObservedEvent(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4} = Val,

%%-------------------------------------------------
%% attribute eventName(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute eventParList(3) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes3,EncLen3} = 'enc_ObservedEvent_eventParList'(Cindex3, [<<162>>]),

%%-------------------------------------------------
%% attribute timeNotation(4)   External megaco_ber_media_gateway_control_v1:TimeNotation OPTIONAL
%%-------------------------------------------------
   {EncBytes4,EncLen4} =  case Cindex4 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_TimeNotation'(Cindex4, [<<163>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  ObservedEvent_eventParList
%%================================
enc_ObservedEvent_eventParList(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_ObservedEvent_eventParList_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_ObservedEvent_eventParList_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_ObservedEvent_eventParList_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_EventParameter'(H, [<<48>>]),
   'enc_ObservedEvent_eventParList_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_ObservedEvent(Tlv) ->
   dec_ObservedEvent(Tlv, [16]).

dec_ObservedEvent(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute eventName(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute streamID(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val2 = decode_integer(V2, []),
if 0 =< Val2, Val2 =< 65535 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute eventParList(3) with type SEQUENCE OF
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = 'dec_ObservedEvent_eventParList'(V3, [131074]),

%%-------------------------------------------------
%% attribute timeNotation(4)   External megaco_ber_media_gateway_control_v1:TimeNotation OPTIONAL
%%-------------------------------------------------
{Term4,Tlv5} = case Tlv4 of
[{131075,V4}|TempTlv5] ->
    {'dec_TimeNotation'(V4, []), TempTlv5};
    _ ->
        { asn1_NOVALUE, Tlv4}
end,

case Tlv5 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'ObservedEvent',Term1,Term2,Term3,Term4},
Res1.
'dec_ObservedEvent_eventParList'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_EventParameter'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  ObservedEventsDescriptor
%%================================
enc_ObservedEventsDescriptor(Val) ->
    enc_ObservedEventsDescriptor(Val, [<<48>>]).

enc_ObservedEventsDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute requestId(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute observedEventLst(2) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_ObservedEventsDescriptor_observedEventLst'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  ObservedEventsDescriptor_observedEventLst
%%================================
enc_ObservedEventsDescriptor_observedEventLst(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_ObservedEventsDescriptor_observedEventLst_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_ObservedEventsDescriptor_observedEventLst_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_ObservedEventsDescriptor_observedEventLst_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_ObservedEvent'(H, [<<48>>]),
   'enc_ObservedEventsDescriptor_observedEventLst_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_ObservedEventsDescriptor(Tlv) ->
   dec_ObservedEventsDescriptor(Tlv, [16]).

dec_ObservedEventsDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute requestId(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute observedEventLst(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_ObservedEventsDescriptor_observedEventLst'(V2, [131073]),

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'ObservedEventsDescriptor',Term1,Term2},
Res1.
'dec_ObservedEventsDescriptor_observedEventLst'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_ObservedEvent'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  NotifyReply
%%================================
enc_NotifyReply(Val) ->
    enc_NotifyReply(Val, [<<48>>]).

enc_NotifyReply(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationIDList'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute errorDescriptor(2)   External megaco_ber_media_gateway_control_v1:ErrorDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ErrorDescriptor'(Cindex2, [<<161>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_NotifyReply(Tlv) ->
   dec_NotifyReply(Tlv, [16]).

dec_NotifyReply(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationIDList'(V1, [131072]),

%%-------------------------------------------------
%% attribute errorDescriptor(2)   External megaco_ber_media_gateway_control_v1:ErrorDescriptor OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_ErrorDescriptor'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'NotifyReply',Term1,Term2},
Res1.


%%================================
%%  NotifyRequest
%%================================
enc_NotifyRequest(Val) ->
    enc_NotifyRequest(Val, [<<48>>]).

enc_NotifyRequest(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationIDList'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute observedEventsDescriptor(2)   External megaco_ber_media_gateway_control_v1:ObservedEventsDescriptor
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_ObservedEventsDescriptor'(Cindex2, [<<161>>]),

%%-------------------------------------------------
%% attribute errorDescriptor(3)   External megaco_ber_media_gateway_control_v1:ErrorDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ErrorDescriptor'(Cindex3, [<<162>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_NotifyRequest(Tlv) ->
   dec_NotifyRequest(Tlv, [16]).

dec_NotifyRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationIDList'(V1, [131072]),

%%-------------------------------------------------
%% attribute observedEventsDescriptor(2)   External megaco_ber_media_gateway_control_v1:ObservedEventsDescriptor
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_ObservedEventsDescriptor'(V2, [131073]),

%%-------------------------------------------------
%% attribute errorDescriptor(3)   External megaco_ber_media_gateway_control_v1:ErrorDescriptor OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_ErrorDescriptor'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'NotifyRequest',Term1,Term2,Term3},
Res1.


%%================================
%%  AuditDescriptor
%%================================
enc_AuditDescriptor(Val) ->
    enc_AuditDescriptor(Val, [<<48>>]).

enc_AuditDescriptor(Val, TagIn) ->
{_,Cindex1} = Val,

%%-------------------------------------------------
%% attribute auditToken(1) with type BIT STRING OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_bit_string([], Cindex1, [{muxToken,0},{modemToken,1},{mediaToken,2},{eventsToken,3},{signalsToken,4},{digitMapToken,5},{statsToken,6},{observedEventsToken,7},{packagesToken,8},{eventBufferToken,9}], [<<128>>])
       end,

   BytesSoFar = [EncBytes1],
LenSoFar = EncLen1,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_AuditDescriptor(Tlv) ->
   dec_AuditDescriptor(Tlv, [16]).

dec_AuditDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute auditToken(1) with type BIT STRING OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {decode_named_bit_string(V1, [{muxToken,0},{modemToken,1},{mediaToken,2},{eventsToken,3},{signalsToken,4},{digitMapToken,5},{statsToken,6},{observedEventsToken,7},{packagesToken,8},{eventBufferToken,9}], []), TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

case Tlv2 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'AuditDescriptor',Term1},
Res1.


%%================================
%%  AuditReturnParameter
%%================================
enc_AuditReturnParameter(Val) ->
    enc_AuditReturnParameter(Val, []).

enc_AuditReturnParameter(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      errorDescriptor ->
         'enc_ErrorDescriptor'(element(2,Val), [<<160>>]);
      mediaDescriptor ->
         'enc_MediaDescriptor'(element(2,Val), [<<161>>]);
      modemDescriptor ->
         'enc_ModemDescriptor'(element(2,Val), [<<162>>]);
      muxDescriptor ->
         'enc_MuxDescriptor'(element(2,Val), [<<163>>]);
      eventsDescriptor ->
         'enc_EventsDescriptor'(element(2,Val), [<<164>>]);
      eventBufferDescriptor ->
         'enc_EventBufferDescriptor'(element(2,Val), [<<165>>]);
      signalsDescriptor ->
         'enc_SignalsDescriptor'(element(2,Val), [<<166>>]);
      digitMapDescriptor ->
         'enc_DigitMapDescriptor'(element(2,Val), [<<167>>]);
      observedEventsDescriptor ->
         'enc_ObservedEventsDescriptor'(element(2,Val), [<<168>>]);
      statisticsDescriptor ->
         'enc_StatisticsDescriptor'(element(2,Val), [<<169>>]);
      packagesDescriptor ->
         'enc_PackagesDescriptor'(element(2,Val), [<<170>>]);
      emptyDescriptors ->
         'enc_AuditDescriptor'(element(2,Val), [<<171>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_AuditReturnParameter(Tlv) ->
   dec_AuditReturnParameter(Tlv, []).

dec_AuditReturnParameter(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'errorDescriptor'
    {131072, V1} -> 
        {errorDescriptor, 'dec_ErrorDescriptor'(V1, [])};


%% 'mediaDescriptor'
    {131073, V1} -> 
        {mediaDescriptor, 'dec_MediaDescriptor'(V1, [])};


%% 'modemDescriptor'
    {131074, V1} -> 
        {modemDescriptor, 'dec_ModemDescriptor'(V1, [])};


%% 'muxDescriptor'
    {131075, V1} -> 
        {muxDescriptor, 'dec_MuxDescriptor'(V1, [])};


%% 'eventsDescriptor'
    {131076, V1} -> 
        {eventsDescriptor, 'dec_EventsDescriptor'(V1, [])};


%% 'eventBufferDescriptor'
    {131077, V1} -> 
        {eventBufferDescriptor, 'dec_EventBufferDescriptor'(V1, [])};


%% 'signalsDescriptor'
    {131078, V1} -> 
        {signalsDescriptor, 'dec_SignalsDescriptor'(V1, [])};


%% 'digitMapDescriptor'
    {131079, V1} -> 
        {digitMapDescriptor, 'dec_DigitMapDescriptor'(V1, [])};


%% 'observedEventsDescriptor'
    {131080, V1} -> 
        {observedEventsDescriptor, 'dec_ObservedEventsDescriptor'(V1, [])};


%% 'statisticsDescriptor'
    {131081, V1} -> 
        {statisticsDescriptor, 'dec_StatisticsDescriptor'(V1, [])};


%% 'packagesDescriptor'
    {131082, V1} -> 
        {packagesDescriptor, 'dec_PackagesDescriptor'(V1, [])};


%% 'emptyDescriptors'
    {131083, V1} -> 
        {emptyDescriptors, 'dec_AuditDescriptor'(V1, [])};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  TerminationAudit
%%================================
enc_TerminationAudit(Val) ->
    enc_TerminationAudit(Val, [<<48>>]).

enc_TerminationAudit(Val, TagIn) ->
   {EncBytes,EncLen} = 'enc_TerminationAudit_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_TerminationAudit_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_TerminationAudit_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_AuditReturnParameter'(H, []),
   'enc_TerminationAudit_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_TerminationAudit(Tlv) ->
   dec_TerminationAudit(Tlv, [16]).

dec_TerminationAudit(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_AuditReturnParameter'(V1, []) || V1 <- Tlv1].




%%================================
%%  AuditResult
%%================================
enc_AuditResult(Val) ->
    enc_AuditResult(Val, [<<48>>]).

enc_AuditResult(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationID
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationID'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute terminationAuditResult(2)   External megaco_ber_media_gateway_control_v1:TerminationAudit
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_TerminationAudit'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_AuditResult(Tlv) ->
   dec_AuditResult(Tlv, [16]).

dec_AuditResult(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationID
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationID'(V1, [131072]),

%%-------------------------------------------------
%% attribute terminationAuditResult(2)   External megaco_ber_media_gateway_control_v1:TerminationAudit
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_TerminationAudit'(V2, [131073]),

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'AuditResult',Term1,Term2},
Res1.


%%================================
%%  AuditReply
%%================================
enc_AuditReply(Val) ->
    enc_AuditReply(Val, []).

enc_AuditReply(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      contextAuditResult ->
         'enc_TerminationIDList'(element(2,Val), [<<160>>]);
      error ->
         'enc_ErrorDescriptor'(element(2,Val), [<<161>>]);
      auditResult ->
         'enc_AuditResult'(element(2,Val), [<<162>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_AuditReply(Tlv) ->
   dec_AuditReply(Tlv, []).

dec_AuditReply(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'contextAuditResult'
    {131072, V1} -> 
        {contextAuditResult, 'dec_TerminationIDList'(V1, [])};


%% 'error'
    {131073, V1} -> 
        {error, 'dec_ErrorDescriptor'(V1, [])};


%% 'auditResult'
    {131074, V1} -> 
        {auditResult, 'dec_AuditResult'(V1, [])};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  AuditRequest
%%================================
enc_AuditRequest(Val) ->
    enc_AuditRequest(Val, [<<48>>]).

enc_AuditRequest(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationID
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationID'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute auditDescriptor(2)   External megaco_ber_media_gateway_control_v1:AuditDescriptor
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_AuditDescriptor'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_AuditRequest(Tlv) ->
   dec_AuditRequest(Tlv, [16]).

dec_AuditRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationID
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationID'(V1, [131072]),

%%-------------------------------------------------
%% attribute auditDescriptor(2)   External megaco_ber_media_gateway_control_v1:AuditDescriptor
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_AuditDescriptor'(V2, [131073]),

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'AuditRequest',Term1,Term2},
Res1.


%%================================
%%  SubtractRequest
%%================================
enc_SubtractRequest(Val) ->
    enc_SubtractRequest(Val, [<<48>>]).

enc_SubtractRequest(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationIDList'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute auditDescriptor(2)   External megaco_ber_media_gateway_control_v1:AuditDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_AuditDescriptor'(Cindex2, [<<161>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_SubtractRequest(Tlv) ->
   dec_SubtractRequest(Tlv, [16]).

dec_SubtractRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationIDList'(V1, [131072]),

%%-------------------------------------------------
%% attribute auditDescriptor(2)   External megaco_ber_media_gateway_control_v1:AuditDescriptor OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_AuditDescriptor'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'SubtractRequest',Term1,Term2},
Res1.


%%================================
%%  AmmsReply
%%================================
enc_AmmsReply(Val) ->
    enc_AmmsReply(Val, [<<48>>]).

enc_AmmsReply(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationIDList'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute terminationAudit(2)   External megaco_ber_media_gateway_control_v1:TerminationAudit OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_TerminationAudit'(Cindex2, [<<161>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_AmmsReply(Tlv) ->
   dec_AmmsReply(Tlv, [16]).

dec_AmmsReply(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationIDList'(V1, [131072]),

%%-------------------------------------------------
%% attribute terminationAudit(2)   External megaco_ber_media_gateway_control_v1:TerminationAudit OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_TerminationAudit'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'AmmsReply',Term1,Term2},
Res1.


%%================================
%%  AmmDescriptor
%%================================
enc_AmmDescriptor(Val) ->
    enc_AmmDescriptor(Val, []).

enc_AmmDescriptor(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      mediaDescriptor ->
         'enc_MediaDescriptor'(element(2,Val), [<<160>>]);
      modemDescriptor ->
         'enc_ModemDescriptor'(element(2,Val), [<<161>>]);
      muxDescriptor ->
         'enc_MuxDescriptor'(element(2,Val), [<<162>>]);
      eventsDescriptor ->
         'enc_EventsDescriptor'(element(2,Val), [<<163>>]);
      eventBufferDescriptor ->
         'enc_EventBufferDescriptor'(element(2,Val), [<<164>>]);
      signalsDescriptor ->
         'enc_SignalsDescriptor'(element(2,Val), [<<165>>]);
      digitMapDescriptor ->
         'enc_DigitMapDescriptor'(element(2,Val), [<<166>>]);
      auditDescriptor ->
         'enc_AuditDescriptor'(element(2,Val), [<<167>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_AmmDescriptor(Tlv) ->
   dec_AmmDescriptor(Tlv, []).

dec_AmmDescriptor(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'mediaDescriptor'
    {131072, V1} -> 
        {mediaDescriptor, 'dec_MediaDescriptor'(V1, [])};


%% 'modemDescriptor'
    {131073, V1} -> 
        {modemDescriptor, 'dec_ModemDescriptor'(V1, [])};


%% 'muxDescriptor'
    {131074, V1} -> 
        {muxDescriptor, 'dec_MuxDescriptor'(V1, [])};


%% 'eventsDescriptor'
    {131075, V1} -> 
        {eventsDescriptor, 'dec_EventsDescriptor'(V1, [])};


%% 'eventBufferDescriptor'
    {131076, V1} -> 
        {eventBufferDescriptor, 'dec_EventBufferDescriptor'(V1, [])};


%% 'signalsDescriptor'
    {131077, V1} -> 
        {signalsDescriptor, 'dec_SignalsDescriptor'(V1, [])};


%% 'digitMapDescriptor'
    {131078, V1} -> 
        {digitMapDescriptor, 'dec_DigitMapDescriptor'(V1, [])};


%% 'auditDescriptor'
    {131079, V1} -> 
        {auditDescriptor, 'dec_AuditDescriptor'(V1, [])};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  AmmRequest
%%================================
enc_AmmRequest(Val) ->
    enc_AmmRequest(Val, [<<48>>]).

enc_AmmRequest(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationIDList'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute descriptors(2) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_AmmRequest_descriptors'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  AmmRequest_descriptors
%%================================
enc_AmmRequest_descriptors(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_AmmRequest_descriptors_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_AmmRequest_descriptors_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_AmmRequest_descriptors_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_AmmDescriptor'(H, []),
   'enc_AmmRequest_descriptors_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_AmmRequest(Tlv) ->
   dec_AmmRequest(Tlv, [16]).

dec_AmmRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationID(1)   External megaco_ber_media_gateway_control_v1:TerminationIDList
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationIDList'(V1, [131072]),

%%-------------------------------------------------
%% attribute descriptors(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_AmmRequest_descriptors'(V2, [131073]),

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'AmmRequest',Term1,Term2},
Res1.
'dec_AmmRequest_descriptors'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_AmmDescriptor'(V1, []) || V1 <- Tlv1].




%%================================
%%  TopologyRequest
%%================================
enc_TopologyRequest(Val) ->
    enc_TopologyRequest(Val, [<<48>>]).

enc_TopologyRequest(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute terminationFrom(1)   External megaco_ber_media_gateway_control_v1:TerminationID
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_TerminationID'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute terminationTo(2)   External megaco_ber_media_gateway_control_v1:TerminationID
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_TerminationID'(Cindex2, [<<161>>]),

%%-------------------------------------------------
%% attribute topologyDirection(3) with type ENUMERATED
%%-------------------------------------------------
   {EncBytes3,EncLen3} = case Cindex3 of
bothway -> encode_tags([<<130>>], [0], 1);
isolate -> encode_tags([<<130>>], [1], 1);
oneway -> encode_tags([<<130>>], [2], 1);
Enumval1 -> exit({error,{asn1, {enumerated_not_in_range,Enumval1}}})
end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_TopologyRequest(Tlv) ->
   dec_TopologyRequest(Tlv, [16]).

dec_TopologyRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute terminationFrom(1)   External megaco_ber_media_gateway_control_v1:TerminationID
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_TerminationID'(V1, [131072]),

%%-------------------------------------------------
%% attribute terminationTo(2)   External megaco_ber_media_gateway_control_v1:TerminationID
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_TerminationID'(V2, [131073]),

%%-------------------------------------------------
%% attribute topologyDirection(3) with type ENUMERATED
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = case decode_integer(V3, [131074]) of
0 -> bothway;
1 -> isolate;
2 -> oneway;
Default1 -> exit({error,{asn1,{illegal_enumerated,Default1}}})
end,

case Tlv4 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv4}}}) % extra fields not allowed
end,
Res1 = {'TopologyRequest',Term1,Term2,Term3},
Res1.


%%================================
%%  CommandReply
%%================================
enc_CommandReply(Val) ->
    enc_CommandReply(Val, []).

enc_CommandReply(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      addReply ->
         'enc_AmmsReply'(element(2,Val), [<<160>>]);
      moveReply ->
         'enc_AmmsReply'(element(2,Val), [<<161>>]);
      modReply ->
         'enc_AmmsReply'(element(2,Val), [<<162>>]);
      subtractReply ->
         'enc_AmmsReply'(element(2,Val), [<<163>>]);
      auditCapReply ->
         'enc_AuditReply'(element(2,Val), [<<164>>]);
      auditValueReply ->
         'enc_AuditReply'(element(2,Val), [<<165>>]);
      notifyReply ->
         'enc_NotifyReply'(element(2,Val), [<<166>>]);
      serviceChangeReply ->
         'enc_ServiceChangeReply'(element(2,Val), [<<167>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_CommandReply(Tlv) ->
   dec_CommandReply(Tlv, []).

dec_CommandReply(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'addReply'
    {131072, V1} -> 
        {addReply, 'dec_AmmsReply'(V1, [])};


%% 'moveReply'
    {131073, V1} -> 
        {moveReply, 'dec_AmmsReply'(V1, [])};


%% 'modReply'
    {131074, V1} -> 
        {modReply, 'dec_AmmsReply'(V1, [])};


%% 'subtractReply'
    {131075, V1} -> 
        {subtractReply, 'dec_AmmsReply'(V1, [])};


%% 'auditCapReply'
    {131076, V1} -> 
        {auditCapReply, 'dec_AuditReply'(V1, [])};


%% 'auditValueReply'
    {131077, V1} -> 
        {auditValueReply, 'dec_AuditReply'(V1, [])};


%% 'notifyReply'
    {131078, V1} -> 
        {notifyReply, 'dec_NotifyReply'(V1, [])};


%% 'serviceChangeReply'
    {131079, V1} -> 
        {serviceChangeReply, 'dec_ServiceChangeReply'(V1, [])};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  Command
%%================================
enc_Command(Val) ->
    enc_Command(Val, []).

enc_Command(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      addReq ->
         'enc_AmmRequest'(element(2,Val), [<<160>>]);
      moveReq ->
         'enc_AmmRequest'(element(2,Val), [<<161>>]);
      modReq ->
         'enc_AmmRequest'(element(2,Val), [<<162>>]);
      subtractReq ->
         'enc_SubtractRequest'(element(2,Val), [<<163>>]);
      auditCapRequest ->
         'enc_AuditRequest'(element(2,Val), [<<164>>]);
      auditValueRequest ->
         'enc_AuditRequest'(element(2,Val), [<<165>>]);
      notifyReq ->
         'enc_NotifyRequest'(element(2,Val), [<<166>>]);
      serviceChangeReq ->
         'enc_ServiceChangeRequest'(element(2,Val), [<<167>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_Command(Tlv) ->
   dec_Command(Tlv, []).

dec_Command(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'addReq'
    {131072, V1} -> 
        {addReq, 'dec_AmmRequest'(V1, [])};


%% 'moveReq'
    {131073, V1} -> 
        {moveReq, 'dec_AmmRequest'(V1, [])};


%% 'modReq'
    {131074, V1} -> 
        {modReq, 'dec_AmmRequest'(V1, [])};


%% 'subtractReq'
    {131075, V1} -> 
        {subtractReq, 'dec_SubtractRequest'(V1, [])};


%% 'auditCapRequest'
    {131076, V1} -> 
        {auditCapRequest, 'dec_AuditRequest'(V1, [])};


%% 'auditValueRequest'
    {131077, V1} -> 
        {auditValueRequest, 'dec_AuditRequest'(V1, [])};


%% 'notifyReq'
    {131078, V1} -> 
        {notifyReq, 'dec_NotifyRequest'(V1, [])};


%% 'serviceChangeReq'
    {131079, V1} -> 
        {serviceChangeReq, 'dec_ServiceChangeRequest'(V1, [])};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  CommandRequest
%%================================
enc_CommandRequest(Val) ->
    enc_CommandRequest(Val, [<<48>>]).

enc_CommandRequest(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute command(1)   External megaco_ber_media_gateway_control_v1:Command
%%-------------------------------------------------
   {EncBytes1,EncLen1} = 'enc_Command'(Cindex1, [<<160>>]),

%%-------------------------------------------------
%% attribute optional(2) with type NULL OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_null(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute wildcardReturn(3) with type NULL OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_null(Cindex3, [<<130>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_CommandRequest(Tlv) ->
   dec_CommandRequest(Tlv, [16]).

dec_CommandRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute command(1)   External megaco_ber_media_gateway_control_v1:Command
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = 'dec_Command'(V1, [131072]),

%%-------------------------------------------------
%% attribute optional(2) with type NULL OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {decode_null(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute wildcardReturn(3) with type NULL OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {decode_null(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'CommandRequest',Term1,Term2,Term3},
Res1.


%%================================
%%  ContextAttrAuditRequest
%%================================
enc_ContextAttrAuditRequest(Val) ->
    enc_ContextAttrAuditRequest(Val, [<<48>>]).

enc_ContextAttrAuditRequest(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute topology(1) with type NULL OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_null(Cindex1, [<<128>>])
       end,

%%-------------------------------------------------
%% attribute emergency(2) with type NULL OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_null(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute priority(3) with type NULL OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_null(Cindex3, [<<130>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_ContextAttrAuditRequest(Tlv) ->
   dec_ContextAttrAuditRequest(Tlv, [16]).

dec_ContextAttrAuditRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute topology(1) with type NULL OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {decode_null(V1, []), TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute emergency(2) with type NULL OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {decode_null(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute priority(3) with type NULL OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {decode_null(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'ContextAttrAuditRequest',Term1,Term2,Term3},
Res1.


%%================================
%%  ContextRequest
%%================================
enc_ContextRequest(Val) ->
    enc_ContextRequest(Val, [<<48>>]).

enc_ContextRequest(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute priority(1) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex1, [<<128>>])
       end,

%%-------------------------------------------------
%% attribute emergency(2) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_boolean(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute topologyReq(3) with type SEQUENCE OF OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ContextRequest_topologyReq'(Cindex3, [<<162>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  ContextRequest_topologyReq
%%================================
enc_ContextRequest_topologyReq(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_ContextRequest_topologyReq_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_ContextRequest_topologyReq_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_ContextRequest_topologyReq_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_TopologyRequest'(H, [<<48>>]),
   'enc_ContextRequest_topologyReq_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_ContextRequest(Tlv) ->
   dec_ContextRequest(Tlv, [16]).

dec_ContextRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute priority(1) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {begin
Val1 = decode_integer(V1, []),
if 0 =< Val1, Val1 =< 15 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute emergency(2) with type BOOLEAN OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {decode_boolean(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute topologyReq(3) with type SEQUENCE OF OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_ContextRequest_topologyReq'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'ContextRequest',Term1,Term2,Term3},
Res1.
'dec_ContextRequest_topologyReq'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_TopologyRequest'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  ActionReply
%%================================
enc_ActionReply(Val) ->
    enc_ActionReply(Val, [<<48>>]).

enc_ActionReply(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4} = Val,

%%-------------------------------------------------
%% attribute contextId(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute errorDescriptor(2)   External megaco_ber_media_gateway_control_v1:ErrorDescriptor OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ErrorDescriptor'(Cindex2, [<<161>>])
       end,

%%-------------------------------------------------
%% attribute contextReply(3)   External megaco_ber_media_gateway_control_v1:ContextRequest OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ContextRequest'(Cindex3, [<<162>>])
       end,

%%-------------------------------------------------
%% attribute commandReply(4) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes4,EncLen4} = 'enc_ActionReply_commandReply'(Cindex4, [<<163>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  ActionReply_commandReply
%%================================
enc_ActionReply_commandReply(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_ActionReply_commandReply_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_ActionReply_commandReply_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_ActionReply_commandReply_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_CommandReply'(H, []),
   'enc_ActionReply_commandReply_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_ActionReply(Tlv) ->
   dec_ActionReply(Tlv, [16]).

dec_ActionReply(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute contextId(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute errorDescriptor(2)   External megaco_ber_media_gateway_control_v1:ErrorDescriptor OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_ErrorDescriptor'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute contextReply(3)   External megaco_ber_media_gateway_control_v1:ContextRequest OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_ContextRequest'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute commandReply(4) with type SEQUENCE OF
%%-------------------------------------------------
[V4|Tlv5] = Tlv4, 
Term4 = 'dec_ActionReply_commandReply'(V4, [131075]),

case Tlv5 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv5}}}) % extra fields not allowed
end,
Res1 = {'ActionReply',Term1,Term2,Term3,Term4},
Res1.
'dec_ActionReply_commandReply'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_CommandReply'(V1, []) || V1 <- Tlv1].




%%================================
%%  ActionRequest
%%================================
enc_ActionRequest(Val) ->
    enc_ActionRequest(Val, [<<48>>]).

enc_ActionRequest(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3,Cindex4} = Val,

%%-------------------------------------------------
%% attribute contextId(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute contextRequest(2)   External megaco_ber_media_gateway_control_v1:ContextRequest OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ContextRequest'(Cindex2, [<<161>>])
       end,

%%-------------------------------------------------
%% attribute contextAttrAuditReq(3)   External megaco_ber_media_gateway_control_v1:ContextAttrAuditRequest OPTIONAL
%%-------------------------------------------------
   {EncBytes3,EncLen3} =  case Cindex3 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_ContextAttrAuditRequest'(Cindex3, [<<162>>])
       end,

%%-------------------------------------------------
%% attribute commandRequests(4) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes4,EncLen4} = 'enc_ActionRequest_commandRequests'(Cindex4, [<<163>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3, EncBytes4],
LenSoFar = EncLen1 + EncLen2 + EncLen3 + EncLen4,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  ActionRequest_commandRequests
%%================================
enc_ActionRequest_commandRequests(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_ActionRequest_commandRequests_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_ActionRequest_commandRequests_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_ActionRequest_commandRequests_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_CommandRequest'(H, [<<48>>]),
   'enc_ActionRequest_commandRequests_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_ActionRequest(Tlv) ->
   dec_ActionRequest(Tlv, [16]).

dec_ActionRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute contextId(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute contextRequest(2)   External megaco_ber_media_gateway_control_v1:ContextRequest OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {'dec_ContextRequest'(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute contextAttrAuditReq(3)   External megaco_ber_media_gateway_control_v1:ContextAttrAuditRequest OPTIONAL
%%-------------------------------------------------
{Term3,Tlv4} = case Tlv3 of
[{131074,V3}|TempTlv4] ->
    {'dec_ContextAttrAuditRequest'(V3, []), TempTlv4};
    _ ->
        { asn1_NOVALUE, Tlv3}
end,

%%-------------------------------------------------
%% attribute commandRequests(4) with type SEQUENCE OF
%%-------------------------------------------------
[V4|Tlv5] = Tlv4, 
Term4 = 'dec_ActionRequest_commandRequests'(V4, [131075]),

case Tlv5 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv5}}}) % extra fields not allowed
end,
Res1 = {'ActionRequest',Term1,Term2,Term3,Term4},
Res1.
'dec_ActionRequest_commandRequests'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_CommandRequest'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  ContextID
%%================================
enc_ContextID(Val) ->
    enc_ContextID(Val, [<<2>>]).

enc_ContextID(Val, TagIn) ->
encode_integer(Val, TagIn).


dec_ContextID(Tlv) ->
   dec_ContextID(Tlv, [2]).

dec_ContextID(Tlv, TagIn) ->
begin
Val1 = decode_integer(Tlv, TagIn),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  ErrorText
%%================================
enc_ErrorText(Val) ->
    enc_ErrorText(Val, [<<22>>]).

enc_ErrorText(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_ErrorText(Tlv) ->
   dec_ErrorText(Tlv, [22]).

dec_ErrorText(Tlv, TagIn) ->
begin
binary_to_list(decode_restricted_string(Tlv, TagIn))
end
.



%%================================
%%  ErrorCode
%%================================
enc_ErrorCode(Val) ->
    enc_ErrorCode(Val, [<<2>>]).

enc_ErrorCode(Val, TagIn) ->
encode_integer(Val, TagIn).


dec_ErrorCode(Tlv) ->
   dec_ErrorCode(Tlv, [2]).

dec_ErrorCode(Tlv, TagIn) ->
begin
Val1 = decode_integer(Tlv, TagIn),
if 0 =< Val1, Val1 =< 65535 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  ErrorDescriptor
%%================================
enc_ErrorDescriptor(Val) ->
    enc_ErrorDescriptor(Val, [<<48>>]).

enc_ErrorDescriptor(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute errorCode(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute errorText(2) with type IA5String OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_restricted_string(Cindex2, [<<129>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_ErrorDescriptor(Tlv) ->
   dec_ErrorDescriptor(Tlv, [16]).

dec_ErrorDescriptor(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute errorCode(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 65535 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute errorText(2) with type IA5String OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
binary_to_list(decode_restricted_string(V2, []))
end
, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'ErrorDescriptor',Term1,Term2},
Res1.


%%================================
%%  TransactionAck
%%================================
enc_TransactionAck(Val) ->
    enc_TransactionAck(Val, [<<48>>]).

enc_TransactionAck(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute firstAck(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute lastAck(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_TransactionAck(Tlv) ->
   dec_TransactionAck(Tlv, [16]).

dec_TransactionAck(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute firstAck(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute lastAck(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val2 = decode_integer(V2, []),
if 0 =< Val2, Val2 =< 4294967295 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'TransactionAck',Term1,Term2},
Res1.


%%================================
%%  TransactionResponseAck
%%================================
enc_TransactionResponseAck(Val) ->
    enc_TransactionResponseAck(Val, [<<48>>]).

enc_TransactionResponseAck(Val, TagIn) ->
   {EncBytes,EncLen} = 'enc_TransactionResponseAck_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_TransactionResponseAck_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_TransactionResponseAck_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_TransactionAck'(H, [<<48>>]),
   'enc_TransactionResponseAck_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_TransactionResponseAck(Tlv) ->
   dec_TransactionResponseAck(Tlv, [16]).

dec_TransactionResponseAck(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_TransactionAck'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  TransactionReply
%%================================
enc_TransactionReply(Val) ->
    enc_TransactionReply(Val, [<<48>>]).

enc_TransactionReply(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute transactionId(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute immAckRequired(2) with type NULL OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_null(Cindex2, [<<129>>])
       end,

%%-------------------------------------------------
%% attribute transactionResult(3) with type CHOICE
%%-------------------------------------------------
   {EncBytes3,EncLen3} = 'enc_TransactionReply_transactionResult'(Cindex3, [<<162>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  TransactionReply_transactionResult
%%================================
enc_TransactionReply_transactionResult(Val, TagIn) ->
      {EncBytes,EncLen} = case element(1,Val) of
      transactionError ->
         'enc_ErrorDescriptor'(element(2,Val), [<<160>>]);
      actionReplies ->
         'enc_TransactionReply_transactionResult_actionReplies'(element(2,Val), [<<161>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).





%%================================
%%  TransactionReply_transactionResult_actionReplies
%%================================
enc_TransactionReply_transactionResult_actionReplies(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_TransactionReply_transactionResult_actionReplies_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_TransactionReply_transactionResult_actionReplies_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_TransactionReply_transactionResult_actionReplies_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_ActionReply'(H, [<<48>>]),
   'enc_TransactionReply_transactionResult_actionReplies_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_TransactionReply(Tlv) ->
   dec_TransactionReply(Tlv, [16]).

dec_TransactionReply(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute transactionId(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute immAckRequired(2) with type NULL OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {decode_null(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute transactionResult(3) with type CHOICE
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = 'dec_TransactionReply_transactionResult'(V3, [131074]),

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'TransactionReply',Term1,Term2,Term3},
Res1.
'dec_TransactionReply_transactionResult'(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'transactionError'
    {131072, V1} -> 
        {transactionError, 'dec_ErrorDescriptor'(V1, [])};


%% 'actionReplies'
    {131073, V1} -> 
        {actionReplies, 'dec_TransactionReply_transactionResult_actionReplies'(V1, [])};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.
'dec_TransactionReply_transactionResult_actionReplies'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_ActionReply'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  TransactionPending
%%================================
enc_TransactionPending(Val) ->
    enc_TransactionPending(Val, [<<48>>]).

enc_TransactionPending(Val, TagIn) ->
{_,Cindex1} = Val,

%%-------------------------------------------------
%% attribute transactionId(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

   BytesSoFar = [EncBytes1],
LenSoFar = EncLen1,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_TransactionPending(Tlv) ->
   dec_TransactionPending(Tlv, [16]).

dec_TransactionPending(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute transactionId(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

case Tlv2 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'TransactionPending',Term1},
Res1.


%%================================
%%  TransactionRequest
%%================================
enc_TransactionRequest(Val) ->
    enc_TransactionRequest(Val, [<<48>>]).

enc_TransactionRequest(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute transactionId(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute actions(2) with type SEQUENCE OF
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_TransactionRequest_actions'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  TransactionRequest_actions
%%================================
enc_TransactionRequest_actions(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_TransactionRequest_actions_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_TransactionRequest_actions_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_TransactionRequest_actions_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_ActionRequest'(H, [<<48>>]),
   'enc_TransactionRequest_actions_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_TransactionRequest(Tlv) ->
   dec_TransactionRequest(Tlv, [16]).

dec_TransactionRequest(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute transactionId(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute actions(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_TransactionRequest_actions'(V2, [131073]),

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'TransactionRequest',Term1,Term2},
Res1.
'dec_TransactionRequest_actions'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_ActionRequest'(V1, [16]) || V1 <- Tlv1].




%%================================
%%  TransactionId
%%================================
enc_TransactionId(Val) ->
    enc_TransactionId(Val, [<<2>>]).

enc_TransactionId(Val, TagIn) ->
encode_integer(Val, TagIn).


dec_TransactionId(Tlv) ->
   dec_TransactionId(Tlv, [2]).

dec_TransactionId(Tlv, TagIn) ->
begin
Val1 = decode_integer(Tlv, TagIn),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  Transaction
%%================================
enc_Transaction(Val) ->
    enc_Transaction(Val, []).

enc_Transaction(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      transactionRequest ->
         'enc_TransactionRequest'(element(2,Val), [<<160>>]);
      transactionPending ->
         'enc_TransactionPending'(element(2,Val), [<<161>>]);
      transactionReply ->
         'enc_TransactionReply'(element(2,Val), [<<162>>]);
      transactionResponseAck ->
         'enc_TransactionResponseAck'(element(2,Val), [<<163>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_Transaction(Tlv) ->
   dec_Transaction(Tlv, []).

dec_Transaction(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'transactionRequest'
    {131072, V1} -> 
        {transactionRequest, 'dec_TransactionRequest'(V1, [])};


%% 'transactionPending'
    {131073, V1} -> 
        {transactionPending, 'dec_TransactionPending'(V1, [])};


%% 'transactionReply'
    {131074, V1} -> 
        {transactionReply, 'dec_TransactionReply'(V1, [])};


%% 'transactionResponseAck'
    {131075, V1} -> 
        {transactionResponseAck, 'dec_TransactionResponseAck'(V1, [])};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  PathName
%%================================
enc_PathName(Val) ->
    enc_PathName(Val, [<<22>>]).

enc_PathName(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_PathName(Tlv) ->
   dec_PathName(Tlv, [22]).

dec_PathName(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if 1 =< C1, C1 =< 64 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  IP6Address
%%================================
enc_IP6Address(Val) ->
    enc_IP6Address(Val, [<<48>>]).

enc_IP6Address(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute address(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute portNumber(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_IP6Address(Tlv) ->
   dec_IP6Address(Tlv, [16]).

dec_IP6Address(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute address(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 16 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute portNumber(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val2 = decode_integer(V2, []),
if 0 =< Val2, Val2 =< 65535 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'IP6Address',Term1,Term2},
Res1.


%%================================
%%  IP4Address
%%================================
enc_IP4Address(Val) ->
    enc_IP4Address(Val, [<<48>>]).

enc_IP4Address(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute address(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute portNumber(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_IP4Address(Tlv) ->
   dec_IP4Address(Tlv, [16]).

dec_IP4Address(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute address(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute portNumber(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val2 = decode_integer(V2, []),
if 0 =< Val2, Val2 =< 65535 ->
Val2;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'IP4Address',Term1,Term2},
Res1.


%%================================
%%  DomainName
%%================================
enc_DomainName(Val) ->
    enc_DomainName(Val, [<<48>>]).

enc_DomainName(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute name(1) with type IA5String
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute portNumber(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
   {EncBytes2,EncLen2} =  case Cindex2 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            encode_integer(Cindex2, [<<129>>])
       end,

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_DomainName(Tlv) ->
   dec_DomainName(Tlv, [16]).

dec_DomainName(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute name(1) with type IA5String
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
binary_to_list(decode_restricted_string(V1, [131072]))
end
,

%%-------------------------------------------------
%% attribute portNumber(2) with type INTEGER OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {begin
Val1 = decode_integer(V2, []),
if 0 =< Val1, Val1 =< 65535 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end, TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'DomainName',Term1,Term2},
Res1.


%%================================
%%  MId
%%================================
enc_MId(Val) ->
    enc_MId(Val, []).

enc_MId(Val, TagIn) ->
   {EncBytes,EncLen} = case element(1,Val) of
      ip4Address ->
         'enc_IP4Address'(element(2,Val), [<<160>>]);
      ip6Address ->
         'enc_IP6Address'(element(2,Val), [<<161>>]);
      domainName ->
         'enc_DomainName'(element(2,Val), [<<162>>]);
      deviceName ->
         encode_restricted_string(element(2,Val), [<<131>>]);
      mtpAddress ->
         encode_restricted_string(element(2,Val), [<<132>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).




dec_MId(Tlv) ->
   dec_MId(Tlv, []).

dec_MId(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'ip4Address'
    {131072, V1} -> 
        {ip4Address, 'dec_IP4Address'(V1, [])};


%% 'ip6Address'
    {131073, V1} -> 
        {ip6Address, 'dec_IP6Address'(V1, [])};


%% 'domainName'
    {131074, V1} -> 
        {domainName, 'dec_DomainName'(V1, [])};


%% 'deviceName'
    {131075, V1} -> 
        {deviceName, begin
Val1 = decode_restricted_string(V1, []),
C1 = byte_size(Val1),
if 1 =< C1, C1 =< 64 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end};


%% 'mtpAddress'
    {131076, V1} -> 
        {mtpAddress, begin
Val2 = decode_restricted_string(V1, []),
C2 = byte_size(Val2),
if 2 =< C2, C2 =< 4 ->
binary_to_list(Val2);
true ->
exit({error,{asn1,bad_range}})
end
end};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


%%================================
%%  Message
%%================================
enc_Message(Val) ->
    enc_Message(Val, [<<48>>]).

enc_Message(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute version(1) with type INTEGER
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_integer(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute mId(2)   External megaco_ber_media_gateway_control_v1:MId
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_MId'(Cindex2, [<<161>>]),

%%-------------------------------------------------
%% attribute messageBody(3) with type CHOICE
%%-------------------------------------------------
   {EncBytes3,EncLen3} = 'enc_Message_messageBody'(Cindex3, [<<162>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).



%%================================
%%  Message_messageBody
%%================================
enc_Message_messageBody(Val, TagIn) ->
      {EncBytes,EncLen} = case element(1,Val) of
      messageError ->
         'enc_ErrorDescriptor'(element(2,Val), [<<160>>]);
      transactions ->
         'enc_Message_messageBody_transactions'(element(2,Val), [<<161>>]);
      Else -> 
         exit({error,{asn1,{invalid_choice_type,Else}}})
   end,

encode_tags(TagIn, EncBytes, EncLen).





%%================================
%%  Message_messageBody_transactions
%%================================
enc_Message_messageBody_transactions(Val, TagIn) ->
      {EncBytes,EncLen} = 'enc_Message_messageBody_transactions_components'(Val,[],0),
   encode_tags(TagIn, EncBytes, EncLen).

'enc_Message_messageBody_transactions_components'([], AccBytes, AccLen) -> 
   {lists:reverse(AccBytes),AccLen};

'enc_Message_messageBody_transactions_components'([H|T],AccBytes, AccLen) ->
   {EncBytes,EncLen} = 'enc_Transaction'(H, []),
   'enc_Message_messageBody_transactions_components'(T,[EncBytes|AccBytes], AccLen + EncLen).



dec_Message(Tlv) ->
   dec_Message(Tlv, [16]).

dec_Message(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute version(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 99 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute mId(2)   External megaco_ber_media_gateway_control_v1:MId
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_MId'(V2, [131073]),

%%-------------------------------------------------
%% attribute messageBody(3) with type CHOICE
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = 'dec_Message_messageBody'(V3, [131074]),

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'Message',Term1,Term2,Term3},
Res1.
'dec_Message_messageBody'(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'messageError'
    {131072, V1} -> 
        {messageError, 'dec_ErrorDescriptor'(V1, [])};


%% 'transactions'
    {131073, V1} -> 
        {transactions, 'dec_Message_messageBody_transactions'(V1, [])};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.
'dec_Message_messageBody_transactions'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),
['dec_Transaction'(V1, []) || V1 <- Tlv1].




%%================================
%%  AuthData
%%================================
enc_AuthData(Val) ->
    enc_AuthData(Val, [<<4>>]).

enc_AuthData(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_AuthData(Tlv) ->
   dec_AuthData(Tlv, [4]).

dec_AuthData(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if 12 =< C1, C1 =< 32 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  SequenceNum
%%================================
enc_SequenceNum(Val) ->
    enc_SequenceNum(Val, [<<4>>]).

enc_SequenceNum(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_SequenceNum(Tlv) ->
   dec_SequenceNum(Tlv, [4]).

dec_SequenceNum(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  SecurityParmIndex
%%================================
enc_SecurityParmIndex(Val) ->
    enc_SecurityParmIndex(Val, [<<4>>]).

enc_SecurityParmIndex(Val, TagIn) ->
encode_restricted_string(Val, TagIn).


dec_SecurityParmIndex(Tlv) ->
   dec_SecurityParmIndex(Tlv, [4]).

dec_SecurityParmIndex(Tlv, TagIn) ->
begin
Val1 = decode_restricted_string(Tlv, TagIn),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end.



%%================================
%%  AuthenticationHeader
%%================================
enc_AuthenticationHeader(Val) ->
    enc_AuthenticationHeader(Val, [<<48>>]).

enc_AuthenticationHeader(Val, TagIn) ->
{_,Cindex1,Cindex2,Cindex3} = Val,

%%-------------------------------------------------
%% attribute secParmIndex(1) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes1,EncLen1} = encode_restricted_string(Cindex1, [<<128>>]),

%%-------------------------------------------------
%% attribute seqNum(2) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes2,EncLen2} = encode_restricted_string(Cindex2, [<<129>>]),

%%-------------------------------------------------
%% attribute ad(3) with type OCTET STRING
%%-------------------------------------------------
   {EncBytes3,EncLen3} = encode_restricted_string(Cindex3, [<<130>>]),

   BytesSoFar = [EncBytes1, EncBytes2, EncBytes3],
LenSoFar = EncLen1 + EncLen2 + EncLen3,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_AuthenticationHeader(Tlv) ->
   dec_AuthenticationHeader(Tlv, [16]).

dec_AuthenticationHeader(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute secParmIndex(1) with type OCTET STRING
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_restricted_string(V1, [131072]),
C1 = byte_size(Val1),
if C1 =:= 4 ->
binary_to_list(Val1);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute seqNum(2) with type OCTET STRING
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = begin
Val2 = decode_restricted_string(V2, [131073]),
C2 = byte_size(Val2),
if C2 =:= 4 ->
binary_to_list(Val2);
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute ad(3) with type OCTET STRING
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = begin
Val3 = decode_restricted_string(V3, [131074]),
C3 = byte_size(Val3),
if 12 =< C3, C3 =< 32 ->
binary_to_list(Val3);
true ->
exit({error,{asn1,bad_range}})
end
end,

case Tlv4 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv4}}}) % extra fields not allowed
end,
Res1 = {'AuthenticationHeader',Term1,Term2,Term3},
Res1.


%%================================
%%  MegacoMessage
%%================================
enc_MegacoMessage(Val) ->
    enc_MegacoMessage(Val, [<<48>>]).

enc_MegacoMessage(Val, TagIn) ->
{_,Cindex1,Cindex2} = Val,

%%-------------------------------------------------
%% attribute authHeader(1)   External megaco_ber_media_gateway_control_v1:AuthenticationHeader OPTIONAL
%%-------------------------------------------------
   {EncBytes1,EncLen1} =  case Cindex1 of
         asn1_NOVALUE -> {<<>>,0};
         _ ->
            'enc_AuthenticationHeader'(Cindex1, [<<160>>])
       end,

%%-------------------------------------------------
%% attribute mess(2)   External megaco_ber_media_gateway_control_v1:Message
%%-------------------------------------------------
   {EncBytes2,EncLen2} = 'enc_Message'(Cindex2, [<<161>>]),

   BytesSoFar = [EncBytes1, EncBytes2],
LenSoFar = EncLen1 + EncLen2,
encode_tags(TagIn, BytesSoFar, LenSoFar).


dec_MegacoMessage(Tlv) ->
   dec_MegacoMessage(Tlv, [16]).

dec_MegacoMessage(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute authHeader(1)   External megaco_ber_media_gateway_control_v1:AuthenticationHeader OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {'dec_AuthenticationHeader'(V1, []), TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute mess(2)   External megaco_ber_media_gateway_control_v1:Message
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_Message'(V2, [131073]),

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'MegacoMessage',Term1,Term2},
Res1.


'dec-inc-MegacoMessage'(Tlv) ->
   'dec-inc-MegacoMessage'(Tlv, [16]).

'dec-inc-MegacoMessage'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute authHeader(1)   External megaco_ber_media_gateway_control_v1:AuthenticationHeader OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[{131072,V1}|TempTlv2] ->
    {'dec_AuthenticationHeader'(V1, []), TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute mess(2)   External megaco_ber_media_gateway_control_v1:Message
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec-inc-Message'(V2, [131073]),

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'MegacoMessage',Term1,Term2},
Res1.


'dec-inc-Transaction'(Tlv) ->
   'dec-inc-Transaction'(Tlv, []).

'dec-inc-Transaction'(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'transactionRequest'
    {131072, V1} -> 
        {transactionRequest, 'dec-inc-TransactionRequest'(V1, [])};


%% 'transactionPending'
    {131073, V1} -> 
        {transactionPending, 'dec_TransactionPending'(V1, [])};


%% 'transactionReply'
    {131074, V1} -> 
        {transactionReply, 'dec-inc-TransactionReply'(V1, [])};


%% 'transactionResponseAck'
    {131075, V1} -> 
        {transactionResponseAck, 'dec_TransactionResponseAck'(V1, [])};

      Else -> 
         {asn1_ExtAlt,ber_encode(Else)}
   end
.


'dec-inc-MegacoMessage_1'(Tlv) ->
   'dec-inc-MegacoMessage_1'(Tlv, [16]).

'dec-inc-MegacoMessage_1'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute authHeader(1)   External megaco_ber_media_gateway_control_v1:AuthenticationHeader OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[V1|TempTlv2] when is_binary(V1) ->
    {{'MegacoMessage_authHeader',V1}, TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute mess(2)   External megaco_ber_media_gateway_control_v1:Message
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec-inc-Message_1'(V2, [131073]),

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'MegacoMessage',Term1,Term2},
Res1.


'dec-inc-MegacoMessage_2'(Tlv) ->
   'dec-inc-MegacoMessage_2'(Tlv, [16]).

'dec-inc-MegacoMessage_2'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute authHeader(1)   External megaco_ber_media_gateway_control_v1:AuthenticationHeader OPTIONAL
%%-------------------------------------------------
{Term1,Tlv2} = case Tlv1 of
[V1|TempTlv2] when is_binary(V1) ->
    {{'MegacoMessage_authHeader',V1}, TempTlv2};
    _ ->
        { asn1_NOVALUE, Tlv1}
end,

%%-------------------------------------------------
%% attribute mess(2)   External megaco_ber_media_gateway_control_v1:Message
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec-inc-Message_2'(V2, [131073]),

case Tlv3 of
[] -> true;_ -> exit({error,{asn1, {unexpected,Tlv3}}}) % extra fields not allowed
end,
Res1 = {'MegacoMessage',Term1,Term2},
Res1.


'dec-inc-Message_2'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute version(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 99 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute mId(2)   External megaco_ber_media_gateway_control_v1:MId
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_MId'(V2, [131073]),

%%-------------------------------------------------
%% attribute messageBody(3) with type CHOICE
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = {'Message_messageBody',V3},

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'Message',Term1,Term2,Term3},
Res1.


'dec-inc-Message_1'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute version(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 99 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute mId(2)   External megaco_ber_media_gateway_control_v1:MId
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = {'Message_mId',V2},

%%-------------------------------------------------
%% attribute messageBody(3) with type CHOICE
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = {'Message_messageBody',V3},

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'Message',Term1,Term2,Term3},
Res1.


'dec-inc-TransactionReply'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute transactionId(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute immAckRequired(2) with type NULL OPTIONAL
%%-------------------------------------------------
{Term2,Tlv3} = case Tlv2 of
[{131073,V2}|TempTlv3] ->
    {decode_null(V2, []), TempTlv3};
    _ ->
        { asn1_NOVALUE, Tlv2}
end,

%%-------------------------------------------------
%% attribute transactionResult(3) with type CHOICE
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = 'dec-inc-TransactionReply_transactionResult'(V3, [131074]),

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'TransactionReply',Term1,Term2,Term3},
Res1.


'dec-inc-TransactionReply_transactionResult'(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'transactionError'
    {131072, V1} -> 
        {transactionError, 'dec_ErrorDescriptor'(V1, [])};


%% 'actionReplies'
    {131073, V1} -> 
        {actionReplies, {'TransactionReply_transactionResult_actionReplies_parts',match_tags(V1, [])}};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.


'dec-inc-TransactionRequest'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute transactionId(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 4294967295 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute actions(2) with type SEQUENCE OF
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = {'TransactionRequest_actions_parts',match_tags(V2, [131073])},

case Tlv3 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'TransactionRequest',Term1,Term2},
Res1.


'dec-inc-Message'(Tlv, TagIn) ->
   %%-------------------------------------------------
   %% decode tag and length 
   %%-------------------------------------------------
Tlv1 = match_tags(Tlv, TagIn),

%%-------------------------------------------------
%% attribute version(1) with type INTEGER
%%-------------------------------------------------
[V1|Tlv2] = Tlv1, 
Term1 = begin
Val1 = decode_integer(V1, [131072]),
if 0 =< Val1, Val1 =< 99 ->
Val1;
true ->
exit({error,{asn1,bad_range}})
end
end,

%%-------------------------------------------------
%% attribute mId(2)   External megaco_ber_media_gateway_control_v1:MId
%%-------------------------------------------------
[V2|Tlv3] = Tlv2, 
Term2 = 'dec_MId'(V2, [131073]),

%%-------------------------------------------------
%% attribute messageBody(3) with type CHOICE
%%-------------------------------------------------
[V3|Tlv4] = Tlv3, 
Term3 = 'dec-inc-Message_messageBody'(V3, [131074]),

case Tlv4 of [] -> true; _ -> true end, % ... extra fields skipped
Res1 = {'Message',Term1,Term2,Term3},
Res1.


'dec-inc-Message_messageBody'(Tlv, TagIn) ->
Tlv1 = match_tags(Tlv, TagIn),
case (case Tlv1 of [CtempTlv1] -> CtempTlv1; _ -> Tlv1 end) of

%% 'messageError'
    {131072, V1} -> 
        {messageError, 'dec_ErrorDescriptor'(V1, [])};


%% 'transactions'
    {131073, V1} -> 
        {transactions, {'Message_messageBody_transactions_parts',match_tags(V1, [])}};

      Else -> 
         exit({error,{asn1,{invalid_choice_tag,Else}}})
   end
.
decode_message_trans_partial(Bytes) ->
  decode_partial_incomplete('MegacoMessage', Bytes, [mandatory,{opt,131072},{mandatory,[mandatory,mandatory,{mandatory,[{alt,131072},{alt_parts,131073}]}]}]).
decode_message_acts_partial(Bytes) ->
  decode_partial_incomplete('Transaction', Bytes, [{alt,131072,[mandatory,{parts,[131073]}]},{alt,131073},{alt,131074,[mandatory,{opt,131073},{mandatory,[{alt,131072},{alt_parts,131073}]}]}]).
decode_message_version(Bytes) ->
  decode_partial_incomplete('MegacoMessage_1', Bytes, [mandatory,{opt_undecoded,[131072]},{mandatory,[mandatory,{undecoded,[131073]},{undecoded,[131074]}]}]).
decode_message_mId(Bytes) ->
  decode_partial_incomplete('MegacoMessage_2', Bytes, [mandatory,{opt_undecoded,[131072]},{mandatory,[mandatory,mandatory,{undecoded,[131074]}]}]).
decode_inc_disp('Message_messageBody_transactions_parts',Data) ->
  case Data of
    L when is_list(L) ->
      'dec_Message_messageBody_transactions'(lists:map(fun(X) -> element(1, ber_decode_erlang(X)) end, L),[]);
    _ ->
      [Res] = 'dec_Message_messageBody_transactions'([Data],[]),
      Res
  end;
decode_inc_disp('TransactionRequest_actions_parts',Data) ->
  case Data of
    L when is_list(L) ->
      'dec_TransactionRequest_actions'(lists:map(fun(X) -> element(1, ber_decode_erlang(X)) end, L),[]);
    _ ->
      [Res] = 'dec_TransactionRequest_actions'([Data],[]),
      Res
  end;
decode_inc_disp('TransactionReply_transactionResult_actionReplies_parts',Data) ->
  case Data of
    L when is_list(L) ->
      'dec_TransactionReply_transactionResult_actionReplies'(lists:map(fun(X) -> element(1, ber_decode_erlang(X)) end, L),[]);
    _ ->
      [Res] = 'dec_TransactionReply_transactionResult_actionReplies'([Data],[]),
      Res
  end;
decode_inc_disp('Message_mId',Data) ->
  'dec_MId'(Data,[131073]);
decode_inc_disp('Message_messageBody',Data) ->
  'dec_Message_messageBody'(Data,[131074]);
decode_inc_disp('MegacoMessage_authHeader',Data) ->
  'dec_AuthenticationHeader'(Data,[131072]).

%%%
%%% Run-time functions.
%%%

'dialyzer-suppressions'(Arg) ->
    _ = encode_bit_string(element(1, Arg), element(2, Arg), element(3, Arg), element(4, Arg)),
    _ = decode_primitive_incomplete([{undecoded,0},{alt_parts,0}], element(6, Arg)),
    ok.

ber_decode_erlang(B) when is_binary(B) ->
    decode_primitive(B);
ber_decode_erlang(Tlv) ->
    {Tlv, <<>>}.

ber_decode_nif(B) ->
    asn1rt_nif:decode_ber_tlv(B).

ber_encode([Tlv]) ->
    ber_encode(Tlv);
ber_encode(Tlv) when is_binary(Tlv) ->
    Tlv;
ber_encode(Tlv) ->
    asn1rt_nif:encode_ber_tlv(Tlv).

collect_parts(TlvList) ->
    collect_parts(TlvList, []).

collect_parts([{_, L} | Rest], Acc) when is_list(L) ->
    collect_parts(Rest, [collect_parts(L) | Acc]);
collect_parts([{3, <<Unused,Bits/binary>>} | Rest], _Acc) ->
    collect_parts_bit(Rest, [Bits], Unused);
collect_parts([{_T, V} | Rest], Acc) ->
    collect_parts(Rest, [V | Acc]);
collect_parts([], Acc) ->
    list_to_binary(lists:reverse(Acc)).

collect_parts_bit([{3, <<Unused,Bits/binary>>} | Rest], Acc, Uacc) ->
    collect_parts_bit(Rest, [Bits | Acc], Unused + Uacc);
collect_parts_bit([], Acc, Uacc) ->
    list_to_binary([Uacc | lists:reverse(Acc)]).

dec_subidentifiers(<<>>, _Av, Al) ->
    lists:reverse(Al);
dec_subidentifiers(<<1:1,H:7,T/binary>>, Av, Al) ->
    dec_subidentifiers(T, Av bsl 7 + H, Al);
dec_subidentifiers(<<H,T/binary>>, Av, Al) ->
    dec_subidentifiers(T, 0, [Av bsl 7 + H | Al]).

decode_bitstring2(1, Unused,
                  <<B7:1,B6:1,B5:1,B4:1,B3:1,B2:1,B1:1,B0:1,_/binary>>) ->
    lists:sublist([B7, B6, B5, B4, B3, B2, B1, B0], 8 - Unused);
decode_bitstring2(Len, Unused,
                  <<B7:1,
                    B6:1,
                    B5:1,
                    B4:1,
                    B3:1,
                    B2:1,
                    B1:1,
                    B0:1,
                    Buffer/binary>>) ->
    [B7, B6, B5, B4, B3, B2, B1, B0 |
     decode_bitstring2(Len - 1, Unused, Buffer)].

decode_bitstring_NNL(BitList, NamedNumberList) ->
    decode_bitstring_NNL(BitList, NamedNumberList, 0, []).

decode_bitstring_NNL([], _, _No, Result) ->
    lists:reverse(Result);
decode_bitstring_NNL([B | BitList],
                     [{Name, No} | NamedNumberList],
                     No, Result) ->
    if
        B =:= 0 ->
            decode_bitstring_NNL(BitList, NamedNumberList,
                                 No + 1,
                                 Result);
        true ->
            decode_bitstring_NNL(BitList, NamedNumberList,
                                 No + 1,
                                 [Name | Result])
    end;
decode_bitstring_NNL([1 | BitList], NamedNumberList, No, Result) ->
    decode_bitstring_NNL(BitList, NamedNumberList,
                         No + 1,
                         [{bit, No} | Result]);
decode_bitstring_NNL([0 | BitList], NamedNumberList, No, Result) ->
    decode_bitstring_NNL(BitList, NamedNumberList, No + 1, Result).

decode_boolean(Tlv, TagIn) ->
    Val = match_tags(Tlv, TagIn),
    case Val of
        <<0:8>> ->
            false;
        <<_:8>> ->
            true;
        _ ->
            exit({error, {asn1, {decode_boolean, Val}}})
    end.

decode_constr_indef_incomplete(_TagMatch, <<0,0,Rest/binary>>, Acc) ->
    {lists:reverse(Acc), Rest};
decode_constr_indef_incomplete([Tag | RestTags], Bin, Acc) ->
    case decode_primitive_incomplete([Tag], Bin) of
        {Tlv, Rest} ->
            decode_constr_indef_incomplete(RestTags, Rest, [Tlv | Acc]);
        asn1_NOVALUE ->
            decode_constr_indef_incomplete(RestTags, Bin, Acc)
    end.

decode_constructed(Bin) when byte_size(Bin) =:= 0 ->
    [];
decode_constructed(Bin) ->
    {Tlv, Rest} = decode_primitive(Bin),
    [Tlv | decode_constructed(Rest)].

decode_constructed_incomplete([Tags = [Ts]], Bin) when is_list(Ts) ->
    decode_constructed_incomplete(Tags, Bin);
decode_constructed_incomplete(_TagMatch, <<>>) ->
    [];
decode_constructed_incomplete([mandatory | RestTag], Bin) ->
    {Tlv, Rest} = decode_primitive(Bin),
    [Tlv | decode_constructed_incomplete(RestTag, Rest)];
decode_constructed_incomplete([{Alt, _} | _] = Directives, Bin)
    when Alt =:= alt_undecoded; Alt =:= alt; Alt =:= alt_parts ->
    {_Form, TagNo, V, Rest} = decode_tag_and_length(Bin),
    case incomplete_choice_alt(TagNo, Directives) of
        {alt_undecoded, _} ->
            LenA = byte_size(Bin) - byte_size(Rest),
            <<A:LenA/binary,Rest/binary>> = Bin,
            A;
        {alt, InnerDirectives} ->
            {Tlv, Rest} =
                decode_primitive_incomplete(InnerDirectives, V),
            {TagNo, Tlv};
        {alt_parts, _} ->
            [{TagNo, decode_parts_incomplete(V)}];
        no_match ->
            {Tlv, _} = decode_primitive(Bin),
            Tlv
    end;
decode_constructed_incomplete([TagNo | RestTag], Bin) ->
    case decode_primitive_incomplete([TagNo], Bin) of
        {Tlv, Rest} ->
            [Tlv | decode_constructed_incomplete(RestTag, Rest)];
        asn1_NOVALUE ->
            decode_constructed_incomplete(RestTag, Bin)
    end;
decode_constructed_incomplete([], Bin) ->
    {Tlv, Rest} = decode_primitive(Bin),
    [Tlv | decode_constructed_incomplete([], Rest)].

decode_constructed_indefinite(<<0,0,Rest/binary>>, Acc) ->
    {lists:reverse(Acc), Rest};
decode_constructed_indefinite(Bin, Acc) ->
    {Tlv, Rest} = decode_primitive(Bin),
    decode_constructed_indefinite(Rest, [Tlv | Acc]).

decode_incomplete2(_Form = 2, TagNo, V, TagMatch, _) ->
    {Vlist, Rest2} = decode_constr_indef_incomplete(TagMatch, V, []),
    {{TagNo, Vlist}, Rest2};
decode_incomplete2(1, TagNo, V, [TagMatch], Rest) when is_list(TagMatch) ->
    {{TagNo, decode_constructed_incomplete(TagMatch, V)}, Rest};
decode_incomplete2(1, TagNo, V, TagMatch, Rest) ->
    {{TagNo, decode_constructed_incomplete(TagMatch, V)}, Rest};
decode_incomplete2(0, TagNo, V, _TagMatch, Rest) ->
    {{TagNo, V}, Rest}.

decode_incomplete_bin(Bin) ->
    {ok, Rest} = skip_tag(Bin),
    {ok, Rest2} = skip_length_and_value(Rest),
    IncLen = byte_size(Bin) - byte_size(Rest2),
    <<IncBin:IncLen/binary,Ret/binary>> = Bin,
    {IncBin, Ret}.

decode_integer(Tlv, TagIn) ->
    Bin = match_tags(Tlv, TagIn),
    Len = byte_size(Bin),
    <<Int:Len/signed-unit:8>> = Bin,
    Int.

decode_length(<<1:1,0:7,T/binary>>) ->
    {indefinite, T};
decode_length(<<0:1,Length:7,T/binary>>) ->
    {Length, T};
decode_length(<<1:1,LL:7,Length:LL/unit:8,T/binary>>) ->
    {Length, T}.

decode_named_bit_string(Buffer, NamedNumberList, Tags) ->
    case match_and_collect(Buffer, Tags) of
        <<0>> ->
            [];
        <<Unused,Bits/binary>> ->
            BitString = decode_bitstring2(byte_size(Bits), Unused, Bits),
            decode_bitstring_NNL(BitString, NamedNumberList)
    end.

decode_null(Tlv, Tags) ->
    Val = match_tags(Tlv, Tags),
    case Val of
        <<>> ->
            'NULL';
        _ ->
            exit({error, {asn1, {decode_null, Val}}})
    end.

decode_object_identifier(Tlv, Tags) ->
    Val = match_tags(Tlv, Tags),
    [AddedObjVal | ObjVals] = dec_subidentifiers(Val, 0, []),
    {Val1, Val2} =
        if
            AddedObjVal < 40 ->
                {0, AddedObjVal};
            AddedObjVal < 80 ->
                {1, AddedObjVal - 40};
            true ->
                {2, AddedObjVal - 80}
        end,
    list_to_tuple([Val1, Val2 | ObjVals]).

decode_parts_incomplete(<<>>) ->
    [];
decode_parts_incomplete(Bin) ->
    {ok, Rest} = skip_tag(Bin),
    {ok, Rest2} = skip_length_and_value(Rest),
    LenPart = byte_size(Bin) - byte_size(Rest2),
    <<Part:LenPart/binary,RestBin/binary>> = Bin,
    [Part | decode_parts_incomplete(RestBin)].

decode_primitive(Bin) ->
    {Form, TagNo, V, Rest} = decode_tag_and_length(Bin),
    case Form of
        1 ->
            {{TagNo, decode_constructed(V)}, Rest};
        0 ->
            {{TagNo, V}, Rest};
        2 ->
            {Vlist, Rest2} = decode_constructed_indefinite(V, []),
            {{TagNo, Vlist}, Rest2}
    end.

decode_primitive_incomplete([{default, TagNo}], Bin) ->
    case decode_tag_and_length(Bin) of
        {Form, TagNo, V, Rest} ->
            decode_incomplete2(Form, TagNo, V, [], Rest);
        _ ->
            asn1_NOVALUE
    end;
decode_primitive_incomplete([{default, TagNo, Directives}], Bin) ->
    case decode_tag_and_length(Bin) of
        {Form, TagNo, V, Rest} ->
            decode_incomplete2(Form, TagNo, V, Directives, Rest);
        _ ->
            asn1_NOVALUE
    end;
decode_primitive_incomplete([{default_undecoded, [Tag | _]}], Bin) ->
    case decode_tag_and_length(Bin) of
        {_, Tag, _, _} ->
            decode_incomplete_bin(Bin);
        _ ->
            asn1_NOVALUE
    end;
decode_primitive_incomplete([{opt, TagNo}], Bin) ->
    case decode_tag_and_length(Bin) of
        {Form, TagNo, V, Rest} ->
            decode_incomplete2(Form, TagNo, V, [], Rest);
        _ ->
            asn1_NOVALUE
    end;
decode_primitive_incomplete([{opt, TagNo, Directives}], Bin) ->
    case decode_tag_and_length(Bin) of
        {Form, TagNo, V, Rest} ->
            decode_incomplete2(Form, TagNo, V, Directives, Rest);
        _ ->
            asn1_NOVALUE
    end;
decode_primitive_incomplete([{opt_undecoded, [Tag | _]}], Bin) ->
    case decode_tag_and_length(Bin) of
        {_, Tag, _, _} ->
            decode_incomplete_bin(Bin);
        _ ->
            asn1_NOVALUE
    end;
decode_primitive_incomplete([{alt_undecoded, TagNo} | RestAlts], Bin) ->
    case decode_tag_and_length(Bin) of
        {_, TagNo, _, _} ->
            decode_incomplete_bin(Bin);
        _ ->
            decode_primitive_incomplete(RestAlts, Bin)
    end;
decode_primitive_incomplete([{alt, TagNo} | RestAlts], Bin) ->
    case decode_tag_and_length(Bin) of
        {_Form, TagNo, V, Rest} ->
            {{TagNo, V}, Rest};
        _ ->
            decode_primitive_incomplete(RestAlts, Bin)
    end;
decode_primitive_incomplete([{alt, TagNo, Directives} | RestAlts], Bin) ->
    case decode_tag_and_length(Bin) of
        {Form, TagNo, V, Rest} ->
            decode_incomplete2(Form, TagNo, V, Directives, Rest);
        _ ->
            decode_primitive_incomplete(RestAlts, Bin)
    end;
decode_primitive_incomplete([{alt_parts, TagNo}], Bin) ->
    case decode_tag_and_length(Bin) of
        {_Form, TagNo, V, Rest} ->
            {{TagNo, V}, Rest};
        _ ->
            asn1_NOVALUE
    end;
decode_primitive_incomplete([{alt_parts, TagNo} | RestAlts], Bin) ->
    case decode_tag_and_length(Bin) of
        {_Form, TagNo, V, Rest} ->
            {{TagNo, decode_parts_incomplete(V)}, Rest};
        _ ->
            decode_primitive_incomplete(RestAlts, Bin)
    end;
decode_primitive_incomplete([{undecoded, _TagNo} | _RestTag], Bin) ->
    decode_incomplete_bin(Bin);
decode_primitive_incomplete([{parts, [TagNo | MoreTags]} | _RestTag],
                            Bin) ->
    case decode_tag_and_length(Bin) of
        {_Form, TagNo, V, Rest} ->
            case MoreTags of
                [] ->
                    {{TagNo, decode_parts_incomplete(V)}, Rest};
                [TagNo2] ->
                    {_, TagNo2, V2, <<>>} = decode_tag_and_length(V),
                    {{TagNo, {TagNo2, decode_parts_incomplete(V2)}},
                     Rest}
            end;
        Err ->
            {error, {asn1, "tag failure", TagNo, Err}}
    end;
decode_primitive_incomplete([mandatory | RestTag], Bin) ->
    {Form, TagNo, V, Rest} = decode_tag_and_length(Bin),
    decode_incomplete2(Form, TagNo, V, RestTag, Rest);
decode_primitive_incomplete([{mandatory, Directives}], Bin) ->
    {Form, TagNo, V, Rest} = decode_tag_and_length(Bin),
    decode_incomplete2(Form, TagNo, V, Directives, Rest);
decode_primitive_incomplete([], Bin) ->
    decode_primitive(Bin).

decode_restricted_string(Tlv, TagsIn) ->
    match_and_collect(Tlv, TagsIn).

decode_tag(<<0:1,PartialTag:7,Buffer/binary>>, TagAck) ->
    TagNo = TagAck bsl 7 bor PartialTag,
    {TagNo, Buffer};
decode_tag(<<_:1,PartialTag:7,Buffer/binary>>, TagAck) ->
    TagAck1 = TagAck bsl 7 bor PartialTag,
    decode_tag(Buffer, TagAck1).

decode_tag_and_length(<<Class:2,
                        Form:1,
                        TagNo:5,
                        0:1,
                        Length:7,
                        V:Length/binary,
                        RestBuffer/binary>>)
    when TagNo < 31 ->
    {Form, Class bsl 16 bor TagNo, V, RestBuffer};
decode_tag_and_length(<<Class:2,1:1,TagNo:5,1:1,0:7,T/binary>>)
    when TagNo < 31 ->
    {2, Class bsl 16 + TagNo, T, <<>>};
decode_tag_and_length(<<Class:2,
                        Form:1,
                        TagNo:5,
                        1:1,
                        LL:7,
                        Length:LL/unit:8,
                        V:Length/binary,
                        T/binary>>)
    when TagNo < 31 ->
    {Form, Class bsl 16 bor TagNo, V, T};
decode_tag_and_length(<<Class:2,
                        Form:1,
                        31:5,
                        0:1,
                        TagNo:7,
                        0:1,
                        Length:7,
                        V:Length/binary,
                        RestBuffer/binary>>) ->
    {Form, Class bsl 16 bor TagNo, V, RestBuffer};
decode_tag_and_length(<<Class:2,1:1,31:5,0:1,TagNo:7,1:1,0:7,T/binary>>) ->
    {2, Class bsl 16 bor TagNo, T, <<>>};
decode_tag_and_length(<<Class:2,
                        Form:1,
                        31:5,
                        0:1,
                        TagNo:7,
                        1:1,
                        LL:7,
                        Length:LL/unit:8,
                        V:Length/binary,
                        T/binary>>) ->
    {Form, Class bsl 16 bor TagNo, V, T};
decode_tag_and_length(<<Class:2,
                        Form:1,
                        31:5,
                        1:1,
                        TagPart1:7,
                        0:1,
                        TagPartLast,
                        Buffer/binary>>) ->
    TagNo = TagPart1 bsl 7 bor TagPartLast,
    {Length, RestBuffer} = decode_length(Buffer),
    <<V:Length/binary,RestBuffer2/binary>> = RestBuffer,
    {Form, Class bsl 16 bor TagNo, V, RestBuffer2};
decode_tag_and_length(<<Class:2,Form:1,31:5,Buffer/binary>>) ->
    {TagNo, Buffer1} = decode_tag(Buffer, 0),
    {Length, RestBuffer} = decode_length(Buffer1),
    <<V:Length/binary,RestBuffer2/binary>> = RestBuffer,
    {Form, Class bsl 16 bor TagNo, V, RestBuffer2}.

e_object_identifier({'OBJECT IDENTIFIER', V}) ->
    e_object_identifier(V);
e_object_identifier(V) when is_tuple(V) ->
    e_object_identifier(tuple_to_list(V));
e_object_identifier([E1, E2 | Tail]) ->
    Head = 40 * E1 + E2,
    {H, Lh} = mk_object_val(Head),
    {R, Lr} = lists:mapfoldl(fun enc_obj_id_tail/2, 0, Tail),
    {[H | R], Lh + Lr}.

enc_obj_id_tail(H, Len) ->
    {B, L} = mk_object_val(H),
    {B, Len + L}.

encode_bin_bit_string(C, {Unused, BinBits}, _NamedBitList, TagIn) ->
    case C of
        [] ->
            remove_unused_then_dotag(TagIn, Unused, BinBits);
        {_Min, Max} ->
            BBLen = byte_size(BinBits) * 8 - Unused,
            if
                BBLen > Max ->
                    exit({error,
                          {asn1,
                           {bitstring_length,
                            {{was, BBLen}, {maximum, Max}}}}});
                true ->
                    remove_unused_then_dotag(TagIn, Unused, BinBits)
            end;
        Size ->
            case byte_size(BinBits) * 8 - Unused of
                BBSize when BBSize =< Size ->
                    remove_unused_then_dotag(TagIn, Unused, BinBits);
                BBSize ->
                    exit({error,
                          {asn1,
                           {bitstring_length,
                            {{was, BBSize}, {should_be, Size}}}}})
            end
    end.

encode_bit_string(C, Bits, NamedBitList, TagIn) when is_bitstring(Bits) ->
    PadLen = (8 - bit_size(Bits) band 7) band 7,
    Compact = {PadLen, <<Bits/bitstring,0:PadLen>>},
    encode_bin_bit_string(C, Compact, NamedBitList, TagIn);
encode_bit_string(C, Bin = {Unused, BinBits}, NamedBitList, TagIn)
    when is_integer(Unused), is_binary(BinBits) ->
    encode_bin_bit_string(C, Bin, NamedBitList, TagIn);
encode_bit_string(C, [FirstVal | RestVal], NamedBitList, TagIn)
    when is_atom(FirstVal) ->
    encode_bit_string_named(C,
                            [FirstVal | RestVal],
                            NamedBitList, TagIn);
encode_bit_string(C, [{bit, X} | RestVal], NamedBitList, TagIn) ->
    encode_bit_string_named(C,
                            [{bit, X} | RestVal],
                            NamedBitList, TagIn);
encode_bit_string(C, [FirstVal | RestVal], NamedBitList, TagIn)
    when is_integer(FirstVal) ->
    encode_bit_string_bits(C, [FirstVal | RestVal], NamedBitList, TagIn);
encode_bit_string(_C, 0, _NamedBitList, TagIn) ->
    encode_tags(TagIn, <<0>>, 1);
encode_bit_string(_C, [], _NamedBitList, TagIn) ->
    encode_tags(TagIn, <<0>>, 1);
encode_bit_string(C, IntegerVal, NamedBitList, TagIn)
    when is_integer(IntegerVal) ->
    BitListVal = int_to_bitlist(IntegerVal),
    encode_bit_string_bits(C, BitListVal, NamedBitList, TagIn).

encode_bit_string_bits(C, BitListVal, _NamedBitList, TagIn)
    when is_list(BitListVal) ->
    case C of
        [] ->
            {Len, Unused, OctetList} = encode_bitstring(BitListVal),
            encode_tags(TagIn, [Unused | OctetList], Len + 1);
        Constr = {Min, _Max} when is_integer(Min) ->
            encode_constr_bit_str_bits(Constr, BitListVal, TagIn);
        {Constr = {_, _}, []} ->
            encode_constr_bit_str_bits(Constr, BitListVal, TagIn);
        Constr = {{_, _}, {_, _}} ->
            encode_constr_bit_str_bits(Constr, BitListVal, TagIn);
        Size when is_integer(Size) ->
            case length(BitListVal) of
                BitSize when BitSize == Size ->
                    {Len, Unused, OctetList} =
                        encode_bitstring(BitListVal),
                    encode_tags(TagIn, [Unused | OctetList], Len + 1);
                BitSize when BitSize < Size ->
                    PaddedList =
                        pad_bit_list(Size - BitSize, BitListVal),
                    {Len, Unused, OctetList} =
                        encode_bitstring(PaddedList),
                    encode_tags(TagIn, [Unused | OctetList], Len + 1);
                BitSize ->
                    exit({error,
                          {asn1,
                           {bitstring_length,
                            {{was, BitSize}, {should_be, Size}}}}})
            end
    end.

encode_bit_string_named(C, [FirstVal | RestVal], NamedBitList, TagIn) ->
    ToSetPos = get_all_bitposes([FirstVal | RestVal], NamedBitList, []),
    Size =
        case C of
            [] ->
                lists:max(ToSetPos) + 1;
            {_Min, Max} ->
                Max;
            TSize ->
                TSize
        end,
    BitList = make_and_set_list(Size, ToSetPos, 0),
    {Len, Unused, OctetList} = encode_bitstring(BitList),
    encode_tags(TagIn, [Unused | OctetList], Len + 1).

encode_bitstring([B8, B7, B6, B5, B4, B3, B2, B1 | Rest]) ->
    Val =
        B8 bsl 7 bor (B7 bsl 6) bor (B6 bsl 5) bor (B5 bsl 4)
        bor
        (B4 bsl 3)
        bor
        (B3 bsl 2)
        bor
        (B2 bsl 1)
        bor
        B1,
    encode_bitstring(Rest, [Val], 1);
encode_bitstring(Val) ->
    {Unused, Octet} = unused_bitlist(Val, 7, 0),
    {1, Unused, [Octet]}.

encode_bitstring([B8, B7, B6, B5, B4, B3, B2, B1 | Rest], Ack, Len) ->
    Val =
        B8 bsl 7 bor (B7 bsl 6) bor (B6 bsl 5) bor (B5 bsl 4)
        bor
        (B4 bsl 3)
        bor
        (B3 bsl 2)
        bor
        (B2 bsl 1)
        bor
        B1,
    encode_bitstring(Rest, [Ack, Val], Len + 1);
encode_bitstring([], Ack, Len) ->
    {Len, 0, Ack};
encode_bitstring(Rest, Ack, Len) ->
    {Unused, Val} = unused_bitlist(Rest, 7, 0),
    {Len + 1, Unused, [Ack, Val]}.

encode_boolean(true, TagIn) ->
    encode_tags(TagIn, [255], 1);
encode_boolean(false, TagIn) ->
    encode_tags(TagIn, [0], 1);
encode_boolean(X, _) ->
    exit({error, {asn1, {encode_boolean, X}}}).

encode_constr_bit_str_bits({{_Min1, Max1}, {Min2, Max2}},
                           BitListVal, TagIn) ->
    BitLen = length(BitListVal),
    case BitLen of
        Len when Len > Max2 ->
            exit({error,
                  {asn1,
                   {bitstring_length, {{was, BitLen}, {maximum, Max2}}}}});
        Len when Len > Max1, Len < Min2 ->
            exit({error,
                  {asn1,
                   {bitstring_length,
                    {{was, BitLen}, {not_allowed_interval, Max1, Min2}}}}});
        _ ->
            {Len, Unused, OctetList} = encode_bitstring(BitListVal),
            encode_tags(TagIn, [Unused, OctetList], Len + 1)
    end;
encode_constr_bit_str_bits({Min, Max}, BitListVal, TagIn) ->
    BitLen = length(BitListVal),
    if
        BitLen > Max ->
            exit({error,
                  {asn1,
                   {bitstring_length, {{was, BitLen}, {maximum, Max}}}}});
        BitLen < Min ->
            exit({error,
                  {asn1,
                   {bitstring_length, {{was, BitLen}, {minimum, Max}}}}});
        true ->
            {Len, Unused, OctetList} = encode_bitstring(BitListVal),
            encode_tags(TagIn, [Unused, OctetList], Len + 1)
    end.

encode_integer(Val) ->
    Bytes =
        if
            Val >= 0 ->
                encode_integer_pos(Val, []);
            true ->
                encode_integer_neg(Val, [])
        end,
    {Bytes, length(Bytes)}.

encode_integer(Val, Tag) when is_integer(Val) ->
    encode_tags(Tag, encode_integer(Val));
encode_integer(Val, _Tag) ->
    exit({error, {asn1, {encode_integer, Val}}}).

encode_integer_neg(-1, [B1 | _T] = L) when B1 > 127 ->
    L;
encode_integer_neg(N, Acc) ->
    encode_integer_neg(N bsr 8, [N band 255 | Acc]).

encode_integer_pos(0, [B | _Acc] = L) when B < 128 ->
    L;
encode_integer_pos(N, Acc) ->
    encode_integer_pos(N bsr 8, [N band 255 | Acc]).

encode_length(L) when L =< 127 ->
    {[L], 1};
encode_length(L) ->
    Oct = minimum_octets(L),
    Len = length(Oct),
    if
        Len =< 126 ->
            {[128 bor Len | Oct], Len + 1};
        true ->
            exit({error, {asn1, too_long_length_oct, Len}})
    end.

encode_null(_Val, TagIn) ->
    encode_tags(TagIn, [], 0).

encode_object_identifier(Val, TagIn) ->
    encode_tags(TagIn, e_object_identifier(Val)).

encode_restricted_string(OctetList, TagIn) when is_binary(OctetList) ->
    encode_tags(TagIn, OctetList, byte_size(OctetList));
encode_restricted_string(OctetList, TagIn) when is_list(OctetList) ->
    encode_tags(TagIn, OctetList, length(OctetList)).

encode_tags(TagIn, {BytesSoFar, LenSoFar}) ->
    encode_tags(TagIn, BytesSoFar, LenSoFar).

encode_tags([Tag | Trest], BytesSoFar, LenSoFar) ->
    {Bytes2, L2} = encode_length(LenSoFar),
    encode_tags(Trest,
                [Tag, Bytes2 | BytesSoFar],
                LenSoFar + byte_size(Tag) + L2);
encode_tags([], BytesSoFar, LenSoFar) ->
    {BytesSoFar, LenSoFar}.

get_all_bitposes([{bit, ValPos} | Rest], NamedBitList, Ack) ->
    get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]);
get_all_bitposes([Val | Rest], NamedBitList, Ack) when is_atom(Val) ->
    case lists:keyfind(Val, 1, NamedBitList) of
        {_ValName, ValPos} ->
            get_all_bitposes(Rest, NamedBitList, [ValPos | Ack]);
        _ ->
            exit({error, {asn1, {bitstring_namedbit, Val}}})
    end;
get_all_bitposes([], _NamedBitList, Ack) ->
    lists:sort(Ack).

incomplete_choice_alt(TagNo, [{Alt, TagNo} | Directives]) ->
    {Alt, Directives};
incomplete_choice_alt(TagNo, [D]) when is_list(D) ->
    incomplete_choice_alt(TagNo, D);
incomplete_choice_alt(TagNo, [_H | Directives]) ->
    incomplete_choice_alt(TagNo, Directives);
incomplete_choice_alt(_, []) ->
    no_match.

int_to_bitlist(0) ->
    [];
int_to_bitlist(Int) when is_integer(Int), Int >= 0 ->
    [Int band 1 | int_to_bitlist(Int bsr 1)].

make_and_set_list(0, [], _) ->
    [];
make_and_set_list(0, _, _) ->
    exit({error, {asn1, bitstring_sizeconstraint}});
make_and_set_list(Len, [XPos | SetPos], XPos) ->
    [1 | make_and_set_list(Len - 1, SetPos, XPos + 1)];
make_and_set_list(Len, [Pos | SetPos], XPos) ->
    [0 | make_and_set_list(Len - 1, [Pos | SetPos], XPos + 1)];
make_and_set_list(Len, [], XPos) ->
    [0 | make_and_set_list(Len - 1, [], XPos + 1)].

match_and_collect(Tlv, TagsIn) ->
    Val = match_tags(Tlv, TagsIn),
    case Val of
        [_ | _] = PartList ->
            collect_parts(PartList);
        Bin when is_binary(Bin) ->
            Bin
    end.

match_tags({T, V}, [T]) ->
    V;
match_tags({T, V}, [T | Tt]) ->
    match_tags(V, Tt);
match_tags([{T, V}], [T | Tt]) ->
    match_tags(V, Tt);
match_tags([{T, _V} | _] = Vlist, [T]) ->
    Vlist;
match_tags(Tlv, []) ->
    Tlv;
match_tags({Tag, _V} = Tlv, [T | _Tt]) ->
    exit({error, {asn1, {wrong_tag, {{expected, T}, {got, Tag, Tlv}}}}}).

minimum_octets(0, Acc) ->
    Acc;
minimum_octets(Val, Acc) ->
    minimum_octets(Val bsr 8, [Val band 255 | Acc]).

minimum_octets(Val) ->
    minimum_octets(Val, []).

mk_object_val(0, Ack, Len) ->
    {Ack, Len};
mk_object_val(Val, Ack, Len) ->
    mk_object_val(Val bsr 7, [Val band 127 bor 128 | Ack], Len + 1).

mk_object_val(Val) when Val =< 127 ->
    {[255 band Val], 1};
mk_object_val(Val) ->
    mk_object_val(Val bsr 7, [Val band 127], 1).

pad_bit_list(Size, BitListVal) ->
    Tail = lists:duplicate(Size, 0),
    lists:append(BitListVal, Tail).

remove_unused_then_dotag(TagIn, Unused, BinBits) ->
    case Unused of
        0 when byte_size(BinBits) =:= 0 ->
            encode_tags(TagIn, <<0>>, 1);
        0 ->
            Bin = <<Unused,BinBits/binary>>,
            encode_tags(TagIn, Bin, byte_size(Bin));
        Num ->
            N = byte_size(BinBits) - 1,
            <<BBits:N/binary,LastByte>> = BinBits,
            encode_tags(TagIn,
                        [Unused,
                         binary_to_list(BBits)
                         ++
                         [LastByte bsr Num bsl Num]],
                        1 + byte_size(BinBits))
    end.

skip_indefinite_value(<<0,0,Rest/binary>>) ->
    {ok, Rest};
skip_indefinite_value(Binary) ->
    {ok, RestBinary} = skip_tag(Binary),
    {ok, RestBinary2} = skip_length_and_value(RestBinary),
    skip_indefinite_value(RestBinary2).

skip_length_and_value(Binary) ->
    case decode_length(Binary) of
        {indefinite, RestBinary} ->
            skip_indefinite_value(RestBinary);
        {Length, RestBinary} ->
            <<_:Length/unit:8,Rest/binary>> = RestBinary,
            {ok, Rest}
    end.

skip_long_tag(<<1:1,_:7,Rest/binary>>) ->
    skip_long_tag(Rest);
skip_long_tag(<<0:1,_:7,Rest/binary>>) ->
    {ok, Rest}.

skip_tag(<<_:3,31:5,Rest/binary>>) ->
    skip_long_tag(Rest);
skip_tag(<<_:3,_Tag:5,Rest/binary>>) ->
    {ok, Rest}.

unused_bitlist([], Trail, Ack) ->
    {Trail + 1, Ack};
unused_bitlist([Bit | Rest], Trail, Ack) ->
    unused_bitlist(Rest, Trail - 1, Bit bsl Trail bor Ack).
