/**
 * This file has no copyright assigned and is placed in the Public Domain.
 * This file is part of the mingw-w64 runtime package.
 * No warranty is given; refer to the file DISCLAIMER.PD within this package.
 */
#ifndef __MS_ASN1_H__
#define __MS_ASN1_H__

#include <pshpack8.h>

#ifdef __cplusplus
extern "C" {
#endif

  typedef unsigned char ASN1uint8_t;
  typedef signed char ASN1int8_t;
  typedef unsigned short ASN1uint16_t;
  typedef signed short ASN1int16_t;
  typedef unsigned long ASN1uint32_t;
  typedef signed long ASN1int32_t;

#ifndef WINAPI
#define WINAPI __stdcall
#endif

#define ASN1_PUBLIC __declspec(dllimport)
#define ASN1API WINAPI
#define ASN1CALL WINAPI
#define ASN1API_INLINE WINAPI

  typedef ASN1uint8_t ASN1octet_t;
  typedef ASN1uint8_t ASN1bool_t;

  typedef struct tagASN1intx_t {
    ASN1uint32_t length;
    ASN1octet_t *value;
  } ASN1intx_t;

  typedef struct tagASN1octetstring_t {
    ASN1uint32_t length;
    ASN1octet_t *value;
  } ASN1octetstring_t;

  typedef struct tagASN1octetstring2_t {
    ASN1uint32_t length;
    ASN1octet_t value[1];
  } ASN1octetstring2_t;

  typedef struct ASN1iterator_s {
    struct ASN1iterator_s *next;
    void *value;
  } ASN1iterator_t;

  typedef struct tagASN1bitstring_t {
    ASN1uint32_t length;
    ASN1octet_t *value;
  } ASN1bitstring_t;

  typedef char ASN1char_t;

  typedef struct tagASN1charstring_t {
    ASN1uint32_t length;
    ASN1char_t *value;
  } ASN1charstring_t;

  typedef ASN1uint16_t ASN1char16_t;

  typedef struct tagASN1char16string_t {
    ASN1uint32_t length;
    ASN1char16_t *value;
  } ASN1char16string_t;

  typedef ASN1uint32_t ASN1char32_t;

  typedef struct tagASN1char32string_t {
    ASN1uint32_t length;
    ASN1char32_t *value;
  } ASN1char32string_t;

  typedef ASN1char_t *ASN1ztcharstring_t;
  typedef ASN1char16_t *ASN1ztchar16string_t;
  typedef ASN1char32_t *ASN1ztchar32string_t;

  typedef struct tagASN1wstring_t {
    ASN1uint32_t length;
    WCHAR *value;
  } ASN1wstring_t;

  typedef struct ASN1objectidentifier_s {
    struct ASN1objectidentifier_s *next;
    ASN1uint32_t value;
  } *ASN1objectidentifier_t;

  typedef struct tagASN1objectidentifier2_t {
    ASN1uint16_t count;
    ASN1uint32_t value[16];
  } ASN1objectidentifier2_t;

  typedef struct tagASN1encodedOID_t {
    ASN1uint16_t length;
    ASN1octet_t *value;
  } ASN1encodedOID_t;

  typedef struct tagASN1stringtableentry_t {
    ASN1char32_t lower;
    ASN1char32_t upper;
    ASN1uint32_t value;
  } ASN1stringtableentry_t;

  typedef struct tagASN1stringtable_t {
    ASN1uint32_t length;
    ASN1stringtableentry_t *values;
  } ASN1stringtable_t;

  typedef ASN1ztcharstring_t ASN1objectdescriptor_t;

  typedef struct tagASN1generalizedtime_t {
    ASN1uint16_t year;
    ASN1uint8_t month;
    ASN1uint8_t day;
    ASN1uint8_t hour;
    ASN1uint8_t minute;
    ASN1uint8_t second;
    ASN1uint16_t millisecond;
    ASN1bool_t universal;
    ASN1int16_t diff;
  } ASN1generalizedtime_t;

  typedef struct tagASN1utctime_t {
    ASN1uint8_t year;
    ASN1uint8_t month;
    ASN1uint8_t day;
    ASN1uint8_t hour;
    ASN1uint8_t minute;
    ASN1uint8_t second;
    ASN1bool_t universal;
    ASN1int16_t diff;
  } ASN1utctime_t;

  typedef struct tagASN1open_t {
    ASN1uint32_t length;
    __C89_NAMELESS union {
      void *encoded;
      void *value;
    };
  } ASN1open_t;

  typedef enum tagASN1blocktype_e {
    ASN1_DER_SET_OF_BLOCK
  } ASN1blocktype_e;

  typedef ASN1int32_t ASN1enum_t;
  typedef ASN1uint16_t ASN1choice_t;
  typedef ASN1uint32_t ASN1magic_t;

#define ASN1_MAKE_VERSION(major,minor) (((major) << 16) | (minor))
#define ASN1_THIS_VERSION ASN1_MAKE_VERSION(1,0)

  enum {
    ASN1_CHOICE_BASE = 1,ASN1_CHOICE_INVALID = -1,ASN1_CHOICE_EXTENSION = 0
  };

  typedef enum tagASN1error_e {
    ASN1_SUCCESS = 0,ASN1_ERR_INTERNAL = (-1001),ASN1_ERR_EOD = (-1002),ASN1_ERR_CORRUPT = (-1003),ASN1_ERR_LARGE = (-1004),
    ASN1_ERR_CONSTRAINT = (-1005),ASN1_ERR_MEMORY = (-1006),ASN1_ERR_OVERFLOW = (-1007),ASN1_ERR_BADPDU = (-1008),ASN1_ERR_BADARGS = (-1009),
    ASN1_ERR_BADREAL = (-1010),ASN1_ERR_BADTAG = (-1011),ASN1_ERR_CHOICE = (-1012),ASN1_ERR_RULE = (-1013),ASN1_ERR_UTF8 = (-1014),
    ASN1_ERR_PDU_TYPE = (-1051),ASN1_ERR_NYI = (-1052),ASN1_WRN_EXTENDED = 1001,ASN1_WRN_NOEOD = 1002
  } ASN1error_e;

#define ASN1_SUCCEEDED(ret) (((int) (ret)) >= 0)
#define ASN1_FAILED(ret) (((int) (ret)) < 0)

  typedef enum {
    ASN1_PER_RULE_ALIGNED = 0x0001,ASN1_PER_RULE_UNALIGNED = 0x0002,ASN1_PER_RULE = ASN1_PER_RULE_ALIGNED | ASN1_PER_RULE_UNALIGNED,
    ASN1_BER_RULE_BER = 0x0100,ASN1_BER_RULE_CER = 0x0200,ASN1_BER_RULE_DER = 0x0400,
    ASN1_BER_RULE = ASN1_BER_RULE_BER | ASN1_BER_RULE_CER | ASN1_BER_RULE_DER
  } ASN1encodingrule_e;

  typedef struct ASN1encoding_s *ASN1encoding_t;
  typedef struct ASN1decoding_s *ASN1decoding_t;
  typedef ASN1int32_t (WINAPI *ASN1PerEncFun_t)(ASN1encoding_t enc,void *data);
  typedef ASN1int32_t (WINAPI *ASN1PerDecFun_t)(ASN1decoding_t enc,void *data);

  typedef struct tagASN1PerFunArr_t {
    const ASN1PerEncFun_t *apfnEncoder;
    const ASN1PerDecFun_t *apfnDecoder;
  } ASN1PerFunArr_t;

  typedef ASN1int32_t (WINAPI *ASN1BerEncFun_t)(ASN1encoding_t enc,ASN1uint32_t tag,void *data);
  typedef ASN1int32_t (WINAPI *ASN1BerDecFun_t)(ASN1decoding_t enc,ASN1uint32_t tag,void *data);

  typedef struct tagASN1BerFunArr_t {
    const ASN1BerEncFun_t *apfnEncoder;
    const ASN1BerDecFun_t *apfnDecoder;
  } ASN1BerFunArr_t;

  typedef void (WINAPI *ASN1GenericFun_t)(void);
  typedef void (WINAPI *ASN1FreeFun_t)(void *data);

  typedef struct tagASN1module_t {
    ASN1magic_t nModuleName;
    ASN1encodingrule_e eRule;
    ASN1uint32_t dwFlags;
    ASN1uint32_t cPDUs;
    const ASN1FreeFun_t *apfnFreeMemory;
    const ASN1uint32_t *acbStructSize;
    __C89_NAMELESS union {
      ASN1PerFunArr_t PER;
      ASN1BerFunArr_t BER;
    };
  } *ASN1module_t;

  struct ASN1encoding_s {
    ASN1magic_t magic;
    ASN1uint32_t version;
    ASN1module_t module;
    ASN1octet_t *buf;
    ASN1uint32_t size;
    ASN1uint32_t len;
    ASN1error_e err;
    ASN1uint32_t bit;
    ASN1octet_t *pos;
    ASN1uint32_t cbExtraHeader;
    ASN1encodingrule_e eRule;
    ASN1uint32_t dwFlags;
  };

  struct ASN1decoding_s {
    ASN1magic_t magic;
    ASN1uint32_t version;
    ASN1module_t module;
    ASN1octet_t *buf;
    ASN1uint32_t size;
    ASN1uint32_t len;
    ASN1error_e err;
    ASN1uint32_t bit;
    ASN1octet_t *pos;
    ASN1encodingrule_e eRule;
    ASN1uint32_t dwFlags;
  };

#define ASN1DECFREE_NON_PDU_ID ((ASN1uint32_t) -1)

  enum {
    ASN1FLAGS_NONE = 0x00000000,ASN1FLAGS_NOASSERT = 0x00001000
  };

  enum {
    ASN1ENCODE_APPEND = 0x00000001,ASN1ENCODE_REUSEBUFFER = 0x00000004,ASN1ENCODE_SETBUFFER = 0x00000008,ASN1ENCODE_ALLOCATEBUFFER = 0x00000010,
    ASN1ENCODE_NOASSERT = ASN1FLAGS_NOASSERT
  };

  enum {
    ASN1DECODE_APPENDED = 0x00000001,ASN1DECODE_REWINDBUFFER = 0x00000004,ASN1DECODE_SETBUFFER = 0x00000008,ASN1DECODE_AUTOFREEBUFFER = 0x00000010,
    ASN1DECODE_NOASSERT = ASN1FLAGS_NOASSERT
  };

  extern ASN1_PUBLIC ASN1module_t WINAPI ASN1_CreateModule(ASN1uint32_t nVersion,ASN1encodingrule_e eRule,ASN1uint32_t dwFlags,ASN1uint32_t cPDU,const ASN1GenericFun_t apfnEncoder[],const ASN1GenericFun_t apfnDecoder[],const ASN1FreeFun_t apfnFreeMemory[],const ASN1uint32_t acbStructSize[],ASN1magic_t nModuleName);
  extern ASN1_PUBLIC void WINAPI ASN1_CloseModule(ASN1module_t pModule);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1_CreateEncoder(ASN1module_t pModule,ASN1encoding_t *ppEncoderInfo,ASN1octet_t *pbBuf,ASN1uint32_t cbBufSize,ASN1encoding_t pParent);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1_Encode(ASN1encoding_t pEncoderInfo,void *pDataStruct,ASN1uint32_t nPduNum,ASN1uint32_t dwFlags,ASN1octet_t *pbBuf,ASN1uint32_t cbBufSize);
  extern ASN1_PUBLIC void WINAPI ASN1_CloseEncoder(ASN1encoding_t pEncoderInfo);
  extern ASN1_PUBLIC void WINAPI ASN1_CloseEncoder2(ASN1encoding_t pEncoderInfo);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1_CreateDecoder(ASN1module_t pModule,ASN1decoding_t *ppDecoderInfo,ASN1octet_t *pbBuf,ASN1uint32_t cbBufSize,ASN1decoding_t pParent);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1_CreateDecoderEx(ASN1module_t pModule,ASN1decoding_t *ppDecoderInfo,ASN1octet_t *pbBuf,ASN1uint32_t cbBufSize,ASN1decoding_t pParent,ASN1uint32_t dwFlags);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1_Decode(ASN1decoding_t pDecoderInfo,void **ppDataStruct,ASN1uint32_t nPduNum,ASN1uint32_t dwFlags,ASN1octet_t *pbBuf,ASN1uint32_t cbBufSize);
  extern ASN1_PUBLIC void WINAPI ASN1_CloseDecoder(ASN1decoding_t pDecoderInfo);
  extern ASN1_PUBLIC void WINAPI ASN1_FreeEncoded(ASN1encoding_t pEncoderInfo,void *pBuf);
  extern ASN1_PUBLIC void WINAPI ASN1_FreeDecoded(ASN1decoding_t pDecoderInfo,void *pDataStruct,ASN1uint32_t nPduNum);

  typedef enum {
    ASN1OPT_CHANGE_RULE = 0x101,ASN1OPT_GET_RULE = 0x201,ASN1OPT_NOT_REUSE_BUFFER = 0x301,ASN1OPT_REWIND_BUFFER = 0x302,
    ASN1OPT_SET_DECODED_BUFFER = 0x501,ASN1OPT_DEL_DECODED_BUFFER = 0x502,ASN1OPT_GET_DECODED_BUFFER_SIZE = 0x601
  } ASN1option_e;

  typedef struct tagASN1optionparam_t {
    ASN1option_e eOption;
    __C89_NAMELESS union {
      ASN1encodingrule_e eRule;
      ASN1uint32_t cbRequiredDecodedBufSize;
      struct {
	ASN1octet_t *pbBuf;
	ASN1uint32_t cbBufSize;
      } Buffer;
    };
  } ASN1optionparam_t,ASN1optionparam_s;

  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1_SetEncoderOption(ASN1encoding_t pEncoderInfo,ASN1optionparam_t *pOptParam);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1_GetEncoderOption(ASN1encoding_t pEncoderInfo,ASN1optionparam_t *pOptParam);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1_SetDecoderOption(ASN1decoding_t pDecoderInfo,ASN1optionparam_t *pOptParam);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1_GetDecoderOption(ASN1decoding_t pDecoderInfo,ASN1optionparam_t *pOptParam);
  extern ASN1_PUBLIC void WINAPI ASN1bitstring_free(ASN1bitstring_t *);
  extern ASN1_PUBLIC void WINAPI ASN1octetstring_free(ASN1octetstring_t *);
  extern ASN1_PUBLIC void WINAPI ASN1objectidentifier_free(ASN1objectidentifier_t *);
  extern ASN1_PUBLIC void WINAPI ASN1charstring_free(ASN1charstring_t *);
  extern ASN1_PUBLIC void WINAPI ASN1char16string_free(ASN1char16string_t *);
  extern ASN1_PUBLIC void WINAPI ASN1char32string_free(ASN1char32string_t *);
  extern ASN1_PUBLIC void WINAPI ASN1ztcharstring_free(ASN1ztcharstring_t);
  extern ASN1_PUBLIC void WINAPI ASN1ztchar16string_free(ASN1ztchar16string_t);
  extern ASN1_PUBLIC void WINAPI ASN1ztchar32string_free(ASN1ztchar32string_t);
  extern ASN1_PUBLIC void WINAPI ASN1open_free(ASN1open_t *);
  extern ASN1_PUBLIC void WINAPI ASN1utf8string_free(ASN1wstring_t *);
  extern ASN1_PUBLIC void *WINAPI ASN1DecAlloc(ASN1decoding_t dec,ASN1uint32_t size);
  extern ASN1_PUBLIC void *WINAPI ASN1DecRealloc(ASN1decoding_t dec,void *ptr,ASN1uint32_t size);
  extern ASN1_PUBLIC void WINAPI ASN1Free(void *ptr);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1EncSetError(ASN1encoding_t enc,ASN1error_e err);
  extern ASN1_PUBLIC ASN1error_e WINAPI ASN1DecSetError(ASN1decoding_t dec,ASN1error_e err);
  extern ASN1_PUBLIC void WINAPI ASN1intx_sub(ASN1intx_t *,ASN1intx_t *,ASN1intx_t *);
  extern ASN1_PUBLIC ASN1uint32_t WINAPI ASN1intx_uoctets(ASN1intx_t *);
  extern ASN1_PUBLIC void WINAPI ASN1intx_free(ASN1intx_t *);
  extern ASN1_PUBLIC void WINAPI ASN1intx_add(ASN1intx_t *,ASN1intx_t *,ASN1intx_t *);
  extern ASN1_PUBLIC ASN1int32_t WINAPI ASN1intx2int32(ASN1intx_t *val);
  extern ASN1_PUBLIC ASN1uint32_t WINAPI ASN1intx2uint32(ASN1intx_t *val);
  extern ASN1_PUBLIC int WINAPI ASN1intxisuint32(ASN1intx_t *val);
  extern ASN1_PUBLIC void WINAPI ASN1intx_setuint32(ASN1intx_t *dst,ASN1uint32_t val);
  extern ASN1_PUBLIC void WINAPI ASN1DbgMemTrackDumpCurrent (ASN1uint32_t nModuleName);
  extern ASN1_PUBLIC ASN1uint32_t WINAPI ASN1uint32_uoctets(ASN1uint32_t);
  extern ASN1_PUBLIC int WINAPI ASN1objectidentifier_cmp(ASN1objectidentifier_t *v1,ASN1objectidentifier_t *v2);
  extern ASN1_PUBLIC int WINAPI ASN1objectidentifier2_cmp(ASN1objectidentifier2_t *v1,ASN1objectidentifier2_t *v2);
  extern ASN1_PUBLIC int WINAPI ASN1bitstring_cmp(ASN1bitstring_t *,ASN1bitstring_t *,int);
  extern ASN1_PUBLIC int WINAPI ASN1octetstring_cmp(ASN1octetstring_t *,ASN1octetstring_t *);
  extern ASN1_PUBLIC int WINAPI ASN1objectidentifier_cmp(ASN1objectidentifier_t *,ASN1objectidentifier_t *);
  extern ASN1_PUBLIC int WINAPI ASN1charstring_cmp(ASN1charstring_t *,ASN1charstring_t *);
  extern ASN1_PUBLIC int WINAPI ASN1char16string_cmp(ASN1char16string_t *,ASN1char16string_t *);
  extern ASN1_PUBLIC int WINAPI ASN1char32string_cmp(ASN1char32string_t *,ASN1char32string_t *);
  extern ASN1_PUBLIC int WINAPI ASN1ztcharstring_cmp(ASN1ztcharstring_t,ASN1ztcharstring_t);
  extern ASN1_PUBLIC int WINAPI ASN1ztchar16string_cmp(ASN1ztchar16string_t,ASN1ztchar16string_t);
  extern ASN1_PUBLIC int WINAPI ASN1open_cmp(ASN1open_t *,ASN1open_t *);
  extern ASN1_PUBLIC int WINAPI ASN1generalizedtime_cmp(ASN1generalizedtime_t *,ASN1generalizedtime_t *);
  extern ASN1_PUBLIC int WINAPI ASN1utctime_cmp(ASN1utctime_t *,ASN1utctime_t *);

  typedef enum tagASN1real_e {
    eReal_Normal,eReal_PlusInfinity,eReal_MinusInfinity
  } ASN1real_e;

  typedef struct tagASN1real_t {
    ASN1real_e type;
    ASN1intx_t mantissa;
    ASN1uint32_t base;
    ASN1intx_t exponent;
  } ASN1real_t;

  typedef struct tagASN1external_t {
#define ASN1external_data_value_descriptor_o 0
    ASN1octet_t o[1];
    struct ASN1external_identification_s {
      ASN1uint8_t o;
      union {
#define ASN1external_identification_syntax_o 1
	ASN1objectidentifier_t syntax;
#define ASN1external_identification_presentation_context_id_o 2
	ASN1uint32_t presentation_context_id;
#define ASN1external_identification_context_negotiation_o 3
	struct ASN1external_identification_context_negotiation_s {
	  ASN1uint32_t presentation_context_id;
	  ASN1objectidentifier_t transfer_syntax;
	} context_negotiation;
      } u;
    } identification;
    ASN1objectdescriptor_t data_value_descriptor;
    struct ASN1external_data_value_s {
      ASN1uint8_t o;
      union {
#define ASN1external_data_value_notation_o 0
	ASN1open_t notation;
#define ASN1external_data_value_encoded_o 1
	ASN1bitstring_t encoded;
      } u;
    } data_value;
  } ASN1external_t;

  typedef struct ASN1external_identification_s ASN1external_identification_t;
  typedef struct ASN1external_identification_context_negotiation_s ASN1external_identification_context_negotiation_t;
  typedef struct ASN1external_data_value_s ASN1external_data_value_t;

  typedef struct tagASN1embeddedpdv_t {
    struct ASN1embeddedpdv_identification_s {
      ASN1uint8_t o;
      union {
#define ASN1embeddedpdv_identification_syntaxes_o 0
	struct ASN1embeddedpdv_identification_syntaxes_s {
	  ASN1objectidentifier_t abstract;
	  ASN1objectidentifier_t transfer;
	} syntaxes;
#define ASN1embeddedpdv_identification_syntax_o 1
	ASN1objectidentifier_t syntax;
#define ASN1embeddedpdv_identification_presentation_context_id_o 2
	ASN1uint32_t presentation_context_id;
#define ASN1embeddedpdv_identification_context_negotiation_o 3
	struct ASN1embeddedpdv_identification_context_negotiation_s {
	  ASN1uint32_t presentation_context_id;
	  ASN1objectidentifier_t transfer_syntax;
	} context_negotiation;
#define ASN1embeddedpdv_identification_transfer_syntax_o 4
	ASN1objectidentifier_t transfer_syntax;
#define ASN1embeddedpdv_identification_fixed_o 5
      } u;
    } identification;
    struct ASN1embeddedpdv_data_value_s {
      ASN1uint8_t o;
      union {
#define ASN1embeddedpdv_data_value_notation_o 0
	ASN1open_t notation;
#define ASN1embeddedpdv_data_value_encoded_o 1
	ASN1bitstring_t encoded;
      } u;
    } data_value;
  } ASN1embeddedpdv_t;

  typedef struct ASN1embeddedpdv_identification_s ASN1embeddedpdv_identification_t;
  typedef struct ASN1embeddedpdv_identification_syntaxes_s ASN1embeddedpdv_identification_syntaxes_t;
  typedef struct ASN1embeddedpdv_identification_context_negotiation_s ASN1embeddedpdv_identification_context_negotiation_t;
  typedef struct ASN1embeddedpdv_data_value_s ASN1embeddedpdv_data_value_t;

  typedef struct tagASN1characterstring_t {
    struct ASN1characterstring_identification_s {
      ASN1uint8_t o;
      union {
#define ASN1characterstring_identification_syntaxes_o 0
	struct ASN1characterstring_identification_syntaxes_s {
	  ASN1objectidentifier_t abstract;
	  ASN1objectidentifier_t transfer;
	} syntaxes;
#define ASN1characterstring_identification_syntax_o 1
	ASN1objectidentifier_t syntax;
#define ASN1characterstring_identification_presentation_context_id_o 2
	ASN1uint32_t presentation_context_id;
#define ASN1characterstring_identification_context_negotiation_o 3
	struct ASN1characterstring_identification_context_negotiation_s {
	  ASN1uint32_t presentation_context_id;
	  ASN1objectidentifier_t transfer_syntax;
	} context_negotiation;
#define ASN1characterstring_identification_transfer_syntax_o 4
	ASN1objectidentifier_t transfer_syntax;
#define ASN1characterstring_identification_fixed_o 5
      } u;
    } identification;
    struct ASN1characterstring_data_value_s {
      ASN1uint8_t o;
      union {
#define ASN1characterstring_data_value_notation_o 0
	ASN1open_t notation;
#define ASN1characterstring_data_value_encoded_o 1
	ASN1octetstring_t encoded;
      } u;
    } data_value;
  } ASN1characterstring_t;

  typedef struct ASN1characterstring_identification_s ASN1characterstring_identification_t;
  typedef struct ASN1characterstring_identification_syntaxes_s ASN1characterstring_identification_syntaxes_t;
  typedef struct ASN1characterstring_identification_context_negotiation_s ASN1characterstring_identification_context_negotiation_t;
  typedef struct ASN1characterstring_data_value_s ASN1characterstring_data_value_t;

  extern ASN1_PUBLIC void WINAPI ASN1real_free(ASN1real_t *);
  extern ASN1_PUBLIC void WINAPI ASN1external_free(ASN1external_t *);
  extern ASN1_PUBLIC void WINAPI ASN1embeddedpdv_free(ASN1embeddedpdv_t *);
  extern ASN1_PUBLIC void WINAPI ASN1characterstring_free(ASN1characterstring_t *);

#ifdef __cplusplus
}
#endif

#include <poppack.h>
#endif
