# This file contains dependency information for the asn1c compiler's skeletons.
# Feel free to edit this file.
# The format is like this:
# 	<filename> <dependent-file> ...
#

ANY.h ANY.c
OPEN_TYPE.h OPEN_TYPE.c constr_CHOICE.h
BMPString.h BMPString.c UTF8String.h
BOOLEAN.h BOOLEAN.c
ENUMERATED.h ENUMERATED.c INTEGER.h NativeEnumerated.h
GeneralString.h GeneralString.c
GeneralizedTime.h GeneralizedTime.c
GraphicString.h GraphicString.c
IA5String.h IA5String.c
INTEGER.h INTEGER.c
ISO646String.h ISO646String.c
NULL.h NULL.c BOOLEAN.h
NativeEnumerated.h NativeEnumerated.c NativeInteger.h
NativeInteger.h NativeInteger.c INTEGER.h
NativeReal.h NativeReal.c REAL.h
NumericString.h NumericString.c
OBJECT_IDENTIFIER.h OBJECT_IDENTIFIER.c INTEGER.h
ObjectDescriptor.h ObjectDescriptor.c GraphicString.h
PrintableString.h PrintableString.c
REAL.h REAL.c INTEGER.h
RELATIVE-OID.h RELATIVE-OID.c OBJECT_IDENTIFIER.h
T61String.h T61String.c
TeletexString.h TeletexString.c	
UTCTime.h UTCTime.c GeneralizedTime.h
UTF8String.h UTF8String.c
UniversalString.h UniversalString.c UTF8String.h
VideotexString.h VideotexString.c
VisibleString.h VisibleString.c
asn_SEQUENCE_OF.h asn_SEQUENCE_OF.c asn_SET_OF.h
asn_SET_OF.h asn_SET_OF.c
constr_CHOICE.h constr_CHOICE.c
constr_SEQUENCE.h constr_SEQUENCE.c OPEN_TYPE.h
constr_SEQUENCE_OF.h constr_SEQUENCE_OF.c asn_SEQUENCE_OF.h constr_SET_OF.h
constr_SET.h constr_SET.c
constr_SET_OF.h constr_SET_OF.c asn_SET_OF.h

COMMON-FILES:			# THIS IS A SPECIAL SECTION
asn_application.h asn_application.c		# Applications should include this file
asn_ioc.h			# Information Object Classes, runtime support
asn_system.h			# Platform-dependent types
asn_codecs.h			# Return types of encoders and decoders
asn_internal.h			# Internal stuff
asn_bit_data.h asn_bit_data.c         # Bit streaming support
OCTET_STRING.h OCTET_STRING.c	# This one is used too widely
BIT_STRING.h BIT_STRING.c	# This one is necessary for the above one
asn_codecs_prim.c asn_codecs_prim.h	# enc/decoders for primitive types
ber_tlv_length.h ber_tlv_length.c	# BER TLV L (length)
ber_tlv_tag.h ber_tlv_tag.c	# BER TLV T (tag)
ber_decoder.h ber_decoder.c	# BER decoder support code
der_encoder.h der_encoder.c	# DER encoder support code
constr_TYPE.h constr_TYPE.c	# Description of a type
constraints.h constraints.c	# Subtype constraints support
xer_support.h xer_support.c	# XML parsing
xer_decoder.h xer_decoder.c	# XER decoding support
xer_encoder.h xer_encoder.c	# XER encoding support
per_support.h per_support.c	# PER parsing
per_decoder.h per_decoder.c	# PER decoding support
per_encoder.h per_encoder.c	# PER encoding support
per_opentype.h per_opentype.c	# PER "open type" handling

CONVERTER:			# THIS IS A SPECIAL SECTION
converter-sample.c		# A default name for sample transcoder

CODEC-OER:			# THIS IS A SPECIAL SECTION
oer_decoder.h oer_decoder.c # OER decoding support
oer_encoder.h oer_encoder.c # OER encoding support
oer_support.h oer_support.c # OER support
OPEN_TYPE.h OPEN_TYPE_oer.c
INTEGER_oer.c
OCTET_STRING_oer.c
NativeInteger_oer.c
NativeEnumerated_oer.c
constr_SEQUENCE_oer.c
constr_CHOICE_oer.c
constr_SET_OF_oer.c constr_SET_OF.h asn_SET_OF.h asn_SET_OF.c
BIT_STRING_oer.c

CODEC-PER:			# THIS IS A SPECIAL SECTION
