diff --git a/contrib/src/gnutls/gnutls-3.6.7-win32-compat.patch b/contrib/src/gnutls/gnutls-3.6.7-win32-compat.patch
new file mode 100644
index 0000000000000000000000000000000000000000..e53a5c70c9500930285b52f766d3197c524dc35b
--- /dev/null
+++ b/contrib/src/gnutls/gnutls-3.6.7-win32-compat.patch
@@ -0,0 +1,420 @@
+From e30e6957e0f7fa707e15fbcd8077023ec6c793d8 Mon Sep 17 00:00:00 2001
+From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
+Date: Fri, 21 Jun 2019 15:53:30 -0400
+Subject: [PATCH] gnutls-3.6.7-win32-compat
+
+---
+ gl/c-strcase.h                    |  10 +-
+ gl/read-file.c                    | 379 +++++++++++++++++++-------------------
+ lib/nettle/gost/nettle-internal.h |   9 +-
+ lib/nettle/gost/streebog.c        |   4 +-
+ lib/nettle/pk.c                   |  10 +-
+ lib/priority.c                    |   8 -
+ lib/system/fastopen.c             |   9 +-
+ lib/x509/common.c                 |  16 +-
+ lib/x509/hostname-verify.c        |  12 +-
+ lib/x509/ip.c                     |   5 +-
+ 10 files changed, 230 insertions(+), 232 deletions(-)
+
+diff --git a/gl/c-strcase.h b/gl/c-strcase.h
+index b67c9b5..64d794f 100644
+--- a/gl/c-strcase.h
++++ b/gl/c-strcase.h
+@@ -20,7 +20,6 @@
+ 
+ #include <stddef.h>
+ 
+-
+ /* The functions defined in this file assume the "C" locale and a character
+    set without diacritics (ASCII-US or EBCDIC-US or something like that).
+    Even if the "C" locale on a particular system is an extension of the ASCII
+@@ -30,12 +29,11 @@
+    string; the other one can also contain non-ASCII characters (but then
+    the comparison result will be nonzero).  */
+ 
+-
+ #ifdef __cplusplus
+ extern "C" {
+ #endif
+ 
+-
++#ifndef _MSC_VER
+ /* Compare strings S1 and S2, ignoring case, returning less than, equal to or
+    greater than zero if S1 is lexicographically less than, equal to or greater
+    than S2.  */
+@@ -46,11 +44,13 @@ extern int c_strcasecmp (const char *s1, const char *s2) _GL_ATTRIBUTE_PURE;
+    lexicographically less than, equal to or greater than S2.  */
+ extern int c_strncasecmp (const char *s1, const char *s2, size_t n)
+   _GL_ATTRIBUTE_PURE;
+-
++#else
++#define c_strcasecmp strcasecmp
++#define c_strncasecmp strncasecmp
++#endif
+ 
+ #ifdef __cplusplus
+ }
+ #endif
+ 
+-
+ #endif /* C_STRCASE_H */
+diff --git a/lib/nettle/gost/nettle-internal.h b/lib/nettle/gost/nettle-internal.h
+index 2e06ebb..f40430e 100644
+--- a/lib/nettle/gost/nettle-internal.h
++++ b/lib/nettle/gost/nettle-internal.h
+@@ -42,11 +42,16 @@
+ 
+ #if HAVE_ALLOCA
+ # define TMP_DECL(name, type, max) type *name
+-# define TMP_ALLOC(name, size) (name = alloca(sizeof (*name) * (size)))
++# ifndef _MSC_VER
++#  define TMP_ALLOC(name, size) (name = alloca(sizeof (*name) * (size)))
++# else
++#  include <malloc.h>
++#  define TMP_ALLOC(name, size) (name = _alloca(sizeof (*name) * (size)))
++# endif
+ #else /* !HAVE_ALLOCA */
+ # define TMP_DECL(name, type, max) type name[max]
+ # define TMP_ALLOC(name, size) \
+   do { if ((size) > (sizeof(name) / sizeof(name[0]))) abort(); } while (0)
+-#endif 
++#endif
+ 
+ #endif /* NETTLE_INTERNAL_H_INCLUDED */
+diff --git a/lib/nettle/gost/streebog.c b/lib/nettle/gost/streebog.c
+index 12c5c08..bc5c1ee 100644
+--- a/lib/nettle/gost/streebog.c
++++ b/lib/nettle/gost/streebog.c
+@@ -45,7 +45,6 @@
+ #include <nettle/macros.h>
+ #include "nettle-write.h"
+ 
+-
+ /* Pre-computed results of multiplication of bytes on A and reordered with
+    Pi[]. */
+ static const uint64_t streebog_table[8][256] =
+@@ -1195,7 +1194,6 @@ static inline void g (uint64_t *h, uint64_t *m, uint64_t *N)
+   h[7] ^= T[7] ^ K[7] ^ m[7];
+ }
+ 
+-
+ static void
+ streebog512_compress (struct streebog512_ctx *ctx, const uint8_t *input, size_t count)
+ {
+@@ -1230,7 +1228,7 @@ streebog512_compress (struct streebog512_ctx *ctx, const uint8_t *input, size_t
+ static void
+ streebog_final (struct streebog512_ctx *ctx)
+ {
+-  uint64_t Z[8] = {};
++  uint64_t Z[8] = {0};
+   unsigned int i;
+ 
+   /* PAD. It does not count towards message length */
+diff --git a/lib/nettle/pk.c b/lib/nettle/pk.c
+index 9aa5166..ee90af6 100644
+--- a/lib/nettle/pk.c
++++ b/lib/nettle/pk.c
+@@ -99,7 +99,7 @@ ecc_point_zclear (struct ecc_point *p)
+ 	zeroize_key(p->p, ecc_size_a(p->ecc)*sizeof(mp_limb_t));
+ 	ecc_point_clear(p);
+ }
+- 
++
+ static void
+ _dsa_params_get(const gnutls_pk_params_st * pk_params,
+ 		struct dsa_params *pub)
+@@ -276,7 +276,6 @@ static int _wrap_nettle_pk_derive(gnutls_pk_algorithm_t algo,
+ 			goto dh_cleanup;
+ 		}
+ 
+-
+ 		ret = _gnutls_mpi_powm(k, f, x, prime);
+ 		if (ret < 0) {
+ 			gnutls_assert();
+@@ -562,7 +561,7 @@ _wrap_nettle_pk_decrypt2(gnutls_pk_algorithm_t algo,
+ 		return gnutls_assert_val (GNUTLS_E_MPI_SCAN_FAILED);
+ 	}
+ 
+-	ret = rsa_sec_decrypt(&pub, &priv, NULL, rnd_nonce_func,
++	ret = nettle_rsa_sec_decrypt(&pub, &priv, NULL, rnd_nonce_func,
+ 			     plaintext_size, plaintext, TOMPZ(c));
+ 	/* after this point, any conditional on failure that cause differences
+ 	 * in execution may create a timing or cache access pattern side
+@@ -1464,7 +1463,6 @@ int _gnutls_ecdh_generate_key(gnutls_ecc_curve_t curve,
+ 			      gnutls_datum_t *x, gnutls_datum_t *y,
+ 			      gnutls_datum_t *k);
+ 
+-
+ int _gnutls_dh_generate_key(gnutls_dh_params_t dh_params,
+ 			    gnutls_datum_t *priv_key, gnutls_datum_t *pub_key)
+ {
+@@ -1669,7 +1667,6 @@ int _gnutls_ecdh_compute_key(gnutls_ecc_curve_t curve,
+ 		goto cleanup;
+ 	}
+ 
+-
+ 	priv.params_nr = 3;
+ 	priv.algo = GNUTLS_PK_ECDSA;
+ 	priv.curve = curve;
+@@ -2170,7 +2167,6 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
+ 				goto ecc_fail;
+ 			}
+ 
+-
+ 			ret = _gnutls_mpi_init_multi(&params->params[GOST_X], &params->params[GOST_Y],
+ 					&params->params[GOST_K], NULL);
+ 			if (ret < 0) {
+@@ -2258,7 +2254,6 @@ wrap_nettle_pk_generate_keys(gnutls_pk_algorithm_t algo,
+ 	return ret;
+ }
+ 
+-
+ static int
+ wrap_nettle_pk_verify_priv_params(gnutls_pk_algorithm_t algo,
+ 			     const gnutls_pk_params_st * params)
+@@ -2703,7 +2698,6 @@ fail:
+ 	return ret;
+ }
+ 
+-
+ static int
+ wrap_nettle_pk_fixup(gnutls_pk_algorithm_t algo,
+ 		     gnutls_direction_t direction,
+diff --git a/lib/priority.c b/lib/priority.c
+index 900bbf7..5f158f3 100644
+--- a/lib/priority.c
++++ b/lib/priority.c
+@@ -337,7 +337,6 @@ static const int cipher_priority_normal_fips[] = {
+ 	0
+ };
+ 
+-
+ static const int _cipher_priority_suiteb128[] = {
+ 	GNUTLS_CIPHER_AES_256_GCM,
+ 	GNUTLS_CIPHER_AES_128_GCM,
+@@ -351,7 +350,6 @@ static const int _cipher_priority_suiteb192[] = {
+ };
+ static const int* cipher_priority_suiteb192 = _cipher_priority_suiteb192;
+ 
+-
+ static const int _cipher_priority_secure128[] = {
+ 	GNUTLS_CIPHER_AES_256_GCM,
+ 	GNUTLS_CIPHER_CHACHA20_POLY1305,
+@@ -365,7 +363,6 @@ static const int _cipher_priority_secure128[] = {
+ };
+ static const int *cipher_priority_secure128 = _cipher_priority_secure128;
+ 
+-
+ static const int _cipher_priority_secure192[] = {
+ 	GNUTLS_CIPHER_AES_256_GCM,
+ 	GNUTLS_CIPHER_CHACHA20_POLY1305,
+@@ -566,7 +563,6 @@ static void prio_add(priority_st * priority_list, unsigned int algo)
+ 	return;
+ }
+ 
+-
+ /**
+  * gnutls_priority_set:
+  * @session: is a #gnutls_session_t type.
+@@ -630,7 +626,6 @@ gnutls_priority_set(gnutls_session_t session, gnutls_priority_t priority)
+ 	return 0;
+ }
+ 
+-
+ #define LEVEL_NONE "NONE"
+ #define LEVEL_NORMAL "NORMAL"
+ #define LEVEL_PFS "PFS"
+@@ -993,7 +988,6 @@ static char *system_priority_buf = NULL;
+ static size_t system_priority_buf_size = 0;
+ static time_t system_priority_last_mod = 0;
+ 
+-
+ static void _gnutls_update_system_priorities(void)
+ {
+ #ifdef HAVE_FMEMOPEN
+@@ -1293,7 +1287,6 @@ static int set_ciphersuite_list(gnutls_priority_t priority_cache)
+ 	if ((!tlsmax || !tlsmin) && (!dtlsmax || !dtlsmin))
+ 		return gnutls_assert_val(GNUTLS_E_NO_PRIORITIES_WERE_SET);
+ 
+-
+ 	priority_cache->have_psk = have_psk;
+ 
+ 	/* if we are have TLS1.3+ do not enable any key exchange algorithms,
+@@ -1923,7 +1916,6 @@ void gnutls_priority_deinit(gnutls_priority_t priority_cache)
+ 	}
+ }
+ 
+-
+ /**
+  * gnutls_priority_set_direct:
+  * @session: is a #gnutls_session_t type.
+diff --git a/lib/system/fastopen.c b/lib/system/fastopen.c
+index 8d8409e..0118d77 100644
+--- a/lib/system/fastopen.c
++++ b/lib/system/fastopen.c
+@@ -26,7 +26,11 @@
+ #include "errors.h"
+ 
+ #include <sys/socket.h>
+-#include <netinet/in.h> /* IPPROTO_TCP */
++#ifndef _WIN32
++# include <netinet/in.h> /* IPPROTO_TCP */
++#else
++# include <winsock.h> /* IPPROTO_TCP */
++#endif
+ #include <errno.h>
+ #include <sys/stat.h>
+ #include <sys/types.h>
+@@ -191,7 +195,7 @@ tfo_read(gnutls_transport_ptr_t ptr, void *data, size_t data_size)
+  * Note: This function overrides all the transport callback functions.
+  * If this is undesirable, TCP Fast Open must be implemented on the user
+  * callback functions without calling this function. When using
+- * this function, transport callbacks must not be set, and 
++ * this function, transport callbacks must not be set, and
+  * gnutls_transport_set_ptr() or gnutls_transport_set_int()
+  * must not be called.
+  *
+@@ -238,4 +242,3 @@ gnutls_transport_set_fastopen(gnutls_session_t session,
+ 	gnutls_transport_set_vec_push_function(session, tfo_writev);
+ #endif
+ }
+-
+diff --git a/lib/x509/common.c b/lib/x509/common.c
+index 4669d37..39986ea 100644
+--- a/lib/x509/common.c
++++ b/lib/x509/common.c
+@@ -274,7 +274,7 @@ const char *gnutls_x509_dn_oid_name(const char *oid, unsigned int flags)
+ 	unsigned len = strlen(oid);
+ 
+ 	do {
+-		if ((_oid2str[i].oid_size == len) && 
++		if ((_oid2str[i].oid_size == len) &&
+ 			strcmp(_oid2str[i].oid, oid) == 0 && _oid2str[i].ldap_desc != NULL)
+ 			return _oid2str[i].ldap_desc;
+ 		i++;
+@@ -428,7 +428,6 @@ decode_complex_string(const struct oid_to_string *oentry, void *value,
+ 	return 0;
+ }
+ 
+-
+ /* This function will convert an attribute value, specified by the OID,
+  * to a string. The result will be a null terminated string.
+  *
+@@ -684,7 +683,6 @@ _gnutls_x509_decode_string(unsigned int etype,
+ 	return ret;
+ }
+ 
+-
+ /* Reads a value from an ASN1 tree, and puts the output
+  * in an allocated variable in the given datum.
+  *
+@@ -972,7 +970,7 @@ _gnutls_x509_der_encode_and_copy(ASN1_TYPE src, const char *src_name,
+ 	return 0;
+ }
+ 
+-/* Writes the value of the datum in the given ASN1_TYPE. 
++/* Writes the value of the datum in the given ASN1_TYPE.
+  */
+ int
+ _gnutls_x509_write_value(ASN1_TYPE c, const char *root,
+@@ -991,7 +989,7 @@ _gnutls_x509_write_value(ASN1_TYPE c, const char *root,
+ 	return 0;
+ }
+ 
+-/* Writes the value of the datum in the given ASN1_TYPE as a string. 
++/* Writes the value of the datum in the given ASN1_TYPE as a string.
+  */
+ int
+ _gnutls_x509_write_string(ASN1_TYPE c, const char *root,
+@@ -1034,8 +1032,6 @@ _asnstr_append_name(char *name, size_t name_size, const char *part1,
+ 				part2 + 1 /* remove initial dot */ );
+ }
+ 
+-
+-
+ /* Encodes and copies the private key parameters into a
+  * subjectPublicKeyInfo structure.
+  *
+@@ -1182,7 +1178,7 @@ _gnutls_x509_get_pk_algorithm(ASN1_TYPE src, const char *src_name,
+ 		return algo;
+ 	}
+ 
+-	/* Now read the parameters' bits 
++	/* Now read the parameters' bits
+ 	 */
+ 	if (lcurve != GNUTLS_ECC_CURVE_INVALID) { /* curve present */
+ 		bits[0] = gnutls_ecc_curve_get_size(lcurve)*8;
+@@ -1307,7 +1303,6 @@ _gnutls_x509_get_signature_algorithm(ASN1_TYPE src, const char *src_name)
+ 	return result;
+ }
+ 
+-
+ /* Reads the DER signature from the certificate and allocates space and
+  * returns them into signed_data.
+  */
+@@ -1321,7 +1316,7 @@ _gnutls_x509_get_signature(ASN1_TYPE src, const char *src_name,
+ 	signature->data = NULL;
+ 	signature->size = 0;
+ 
+-	/* Read the signature 
++	/* Read the signature
+ 	 */
+ 	len = 0;
+ 	result = asn1_read_value(src, src_name, NULL, &len);
+@@ -1445,7 +1440,6 @@ static int write_complex_string(ASN1_TYPE asn_struct, const char *where,
+ 	return result;
+ }
+ 
+-
+ /* This will encode and write the AttributeTypeAndValue field.
+  * 'multi' must be (0) if writing an AttributeTypeAndValue, and 1 if Attribute.
+  * In all cases only one value is written.
+diff --git a/lib/x509/hostname-verify.c b/lib/x509/hostname-verify.c
+index 967d9b8..d3b6968 100644
+--- a/lib/x509/hostname-verify.c
++++ b/lib/x509/hostname-verify.c
+@@ -26,8 +26,14 @@
+ #include <common.h>
+ #include "errors.h"
+ #include <system.h>
+-#include <netinet/in.h>
+-#include <arpa/inet.h>
++#ifndef _WIN32
++# include <netinet/in.h> /* IPPROTO_TCP */
++#else
++# include <winsock.h> /* IPPROTO_TCP */
++#endif
++#ifdef HAVE_INET_NTOP
++# include <arpa/inet.h>
++#endif
+ 
+ /**
+  * gnutls_x509_crt_check_hostname:
+@@ -100,7 +106,7 @@ static int has_embedded_null(const char *str, unsigned size)
+  * @ip_size: the number of bytes in ip (4 or 16)
+  * @flags: should be zero
+  *
+- * This function will check if the IP allowed IP addresses in 
++ * This function will check if the IP allowed IP addresses in
+  * the certificate's subject alternative name match the provided
+  * IP address.
+  *
+diff --git a/lib/x509/ip.c b/lib/x509/ip.c
+index c4cb008..b359d27 100644
+--- a/lib/x509/ip.c
++++ b/lib/x509/ip.c
+@@ -24,7 +24,10 @@
+ #include "gnutls_int.h"
+ #include "ip.h"
+ #include <gnutls/x509.h>
+-#include <arpa/inet.h>
++
++#ifdef HAVE_INET_NTOP
++# include <arpa/inet.h>
++#endif
+ 
+ /*-
+  * _gnutls_mask_to_prefix:
+-- 
+2.7.4
+
diff --git a/contrib/src/gnutls/gnutls-3.6.7-win32-vs-support.patch b/contrib/src/gnutls/gnutls-3.6.7-win32-vs-support.patch
new file mode 100644
index 0000000000000000000000000000000000000000..537ffbd20483c2f0defaec93474b9544034f8c5f
--- /dev/null
+++ b/contrib/src/gnutls/gnutls-3.6.7-win32-vs-support.patch
@@ -0,0 +1,56920 @@
+From 14ea482521f9fcba7ade4837a67eba45ab08d3fb Mon Sep 17 00:00:00 2001
+From: Andreas Traczyk <andreas.traczyk@savoirfairelinux.com>
+Date: Fri, 21 Jun 2019 16:10:36 -0400
+Subject: [PATCH] gnutls-3.6.7-win32-vs-support
+
+---
+ SMP/.gitattributes                                 |    4 +
+ SMP/.gitignore                                     |   28 +
+ SMP/appveyor.yml                                   |  142 +
+ SMP/byteswap.h                                     |   36 +
+ SMP/config.h                                       | 2273 ++++++
+ SMP/dirent.h                                       |  757 ++
+ SMP/gnutls/gnutls.h                                | 3329 ++++++++
+ SMP/lib/accelerated/x86/coff/aes-ssse3-x86.asm     |  643 ++
+ SMP/lib/accelerated/x86/coff/aes-ssse3-x86_64.asm  | 1137 +++
+ SMP/lib/accelerated/x86/coff/aesni-gcm-x86_64.asm  |  986 +++
+ SMP/lib/accelerated/x86/coff/aesni-x86.asm         | 3204 ++++++++
+ SMP/lib/accelerated/x86/coff/aesni-x86_64.asm      | 4994 ++++++++++++
+ SMP/lib/accelerated/x86/coff/cpuid-x86.asm         |   54 +
+ SMP/lib/accelerated/x86/coff/cpuid-x86_64.asm      |   53 +
+ SMP/lib/accelerated/x86/coff/e_padlock-x86.asm     | 1015 +++
+ SMP/lib/accelerated/x86/coff/e_padlock-x86_64.asm  | 1171 +++
+ SMP/lib/accelerated/x86/coff/ghash-x86.asm         |  692 ++
+ SMP/lib/accelerated/x86/coff/ghash-x86_64.asm      | 2018 +++++
+ SMP/lib/accelerated/x86/coff/sha1-ssse3-x86.asm    | 1386 ++++
+ SMP/lib/accelerated/x86/coff/sha1-ssse3-x86_64.asm | 5714 ++++++++++++++
+ SMP/lib/accelerated/x86/coff/sha256-avx-x86_64.asm | 8209 ++++++++++++++++++++
+ SMP/lib/accelerated/x86/coff/sha256-ssse3-x86.asm  | 3356 ++++++++
+ .../accelerated/x86/coff/sha256-ssse3-x86_64.asm   | 5634 ++++++++++++++
+ SMP/lib/priority_options.h                         |  179 +
+ SMP/lib/unistring/unictype.h                       | 1060 +++
+ SMP/lib/unistring/unictype/categ_byname.h          |  622 ++
+ SMP/lib/unistring/uninorm.h                        |  258 +
+ SMP/lib/unistring/unistr.h                         |  756 ++
+ SMP/lib/unistring/unitypes.h                       |   56 +
+ SMP/lib/unused-parameter.h                         |   36 +
+ SMP/libgnutls.def                                  | 1056 +++
+ SMP/libgnutls.sln                                  |   57 +
+ SMP/libgnutls.vcxproj                              | 2811 +++++++
+ SMP/libgnutls.vcxproj.filters                      | 1804 +++++
+ SMP/libgnutls_deps.sln                             |  195 +
+ SMP/project_get_dependencies.bat                   |  161 +
+ SMP/readme.txt                                     |   16 +
+ SMP/stdio.h                                        |  147 +
+ SMP/string.h                                       |  130 +
+ SMP/sys/socket.h                                   |   35 +
+ SMP/sys/stat.h                                     |  103 +
+ SMP/sys/time.h                                     |   72 +
+ SMP/test.bat                                       |    6 +
+ SMP/time.h                                         |   47 +
+ SMP/unistd.h                                       |   78 +
+ SMP/version.h                                      |    5 +
+ 46 files changed, 56525 insertions(+)
+ create mode 100644 SMP/.gitattributes
+ create mode 100644 SMP/.gitignore
+ create mode 100644 SMP/appveyor.yml
+ create mode 100644 SMP/byteswap.h
+ create mode 100644 SMP/config.h
+ create mode 100644 SMP/dirent.h
+ create mode 100644 SMP/gnutls/gnutls.h
+ create mode 100644 SMP/lib/accelerated/x86/coff/aes-ssse3-x86.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/aes-ssse3-x86_64.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/aesni-gcm-x86_64.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/aesni-x86.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/aesni-x86_64.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/cpuid-x86.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/cpuid-x86_64.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/e_padlock-x86.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/e_padlock-x86_64.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/ghash-x86.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/ghash-x86_64.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/sha1-ssse3-x86.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/sha1-ssse3-x86_64.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/sha256-avx-x86_64.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/sha256-ssse3-x86.asm
+ create mode 100644 SMP/lib/accelerated/x86/coff/sha256-ssse3-x86_64.asm
+ create mode 100644 SMP/lib/priority_options.h
+ create mode 100644 SMP/lib/unistring/unictype.h
+ create mode 100644 SMP/lib/unistring/unictype/categ_byname.h
+ create mode 100644 SMP/lib/unistring/uninorm.h
+ create mode 100644 SMP/lib/unistring/unistr.h
+ create mode 100644 SMP/lib/unistring/unitypes.h
+ create mode 100644 SMP/lib/unused-parameter.h
+ create mode 100644 SMP/libgnutls.def
+ create mode 100644 SMP/libgnutls.sln
+ create mode 100644 SMP/libgnutls.vcxproj
+ create mode 100644 SMP/libgnutls.vcxproj.filters
+ create mode 100644 SMP/libgnutls_deps.sln
+ create mode 100644 SMP/project_get_dependencies.bat
+ create mode 100644 SMP/readme.txt
+ create mode 100644 SMP/stdio.h
+ create mode 100644 SMP/string.h
+ create mode 100644 SMP/sys/socket.h
+ create mode 100644 SMP/sys/stat.h
+ create mode 100644 SMP/sys/time.h
+ create mode 100644 SMP/test.bat
+ create mode 100644 SMP/time.h
+ create mode 100644 SMP/unistd.h
+ create mode 100644 SMP/version.h
+
+diff --git a/SMP/.gitattributes b/SMP/.gitattributes
+new file mode 100644
+index 0000000..c25326f
+--- /dev/null
++++ b/SMP/.gitattributes
+@@ -0,0 +1,4 @@
++*.sln              text=auto
++*.vcxproj          text=auto
++*.vcxproj.filters  text=auto
++*.bat              text=auto
+\ No newline at end of file
+diff --git a/SMP/.gitignore b/SMP/.gitignore
+new file mode 100644
+index 0000000..46bcf6a
+--- /dev/null
++++ b/SMP/.gitignore
+@@ -0,0 +1,28 @@
++*.obj
++*.lib
++*.log
++*.tlog
++*.pdb
++*.ildb
++*.pgd
++*.pch
++*.manifest
++*.suo
++*.user
++*.sdf
++*.opensdf
++[Oo]bj/
++*.exe
++!*.h
++!*.c
++!*.asm
++!*.def
++!*.rc
++*.sbr
++*.iobj
++*.ipdb
++.vs/
++*.VC.db
++*.opendb
++*.ilk
++[Bb]in/
+\ No newline at end of file
+diff --git a/SMP/appveyor.yml b/SMP/appveyor.yml
+new file mode 100644
+index 0000000..b86a17c
+--- /dev/null
++++ b/SMP/appveyor.yml
+@@ -0,0 +1,142 @@
++version: '{build}'
++
++branches:
++  only:
++  - master
++skip_non_tags: true
++clone_depth: 10
++
++configuration: Release+ReleaseDLLStaticDeps
++
++platform: x86+x64
++
++environment:
++  GITHUBTOKEN:
++    secure: aiTcAD/YitqgwuiBdC3ImXiUlHfIIDD7ayjCs3Y3aAO5vEm1gA7flCZpUZ60a5am
++  matrix:
++  - MSVC_VER: 12
++    APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2013
++  - MSVC_VER: 14
++    APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
++  - MSVC_VER: 15
++    APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017
++
++install:
++# Install GitLink
++- cmd: nuget install gitlink -Version 2.4.0
++- cmd: for /f "tokens=*" %%f in ('dir /s /b gitlink.exe') do copy /b %%f .\
++
++before_build:
++# Backup platform so it is not affected by vcvars
++- cmd: SET PLATFORMBACK=%PLATFORM%
++
++# Setup msvc environment for required compiler version (specified by MSVC_VER)
++- ps: >-
++    if ($env:MSVC_VER -eq 15) {
++        $env:VCVARS="C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Auxiliary\Build\vcvarsall.bat"
++    } else {
++        $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:MSVC_VER" + "0COMNTOOLS"))
++        $env:VCVARS="%VSCOMNTOOLS%\..\..\VC\vcvarsall.bat"
++    }
++
++- cmd: call "%VCVARS%" amd64
++
++# Detect latest available windows sdk version
++- ps: >-
++    if ($env:MSVC_VER -eq 12) {
++        $env:WindowsSDKVersion=8.1
++    } else {
++        $env:WindowsSDKVersion=$env:WindowsSDKVersion.TrimEnd('\')
++    }
++
++# Reset platform
++- cmd: SET PLATFORM=%PLATFORMBACK%
++
++# Create build project to compile all configurations and platforms at once
++- ps: >-
++    $script = @'
++
++    <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="GitLink" ToolsVersion="APPVEYOR_MSVC_VER.0">
++      <ItemGroup>
++        <ConfigurationList Condition="'@(ConfigurationList)' == '' and $(Configuration) != ''" Include="$(Configuration.Split('+'))" />
++        <ConfigurationList Condition="'@(ConfigurationList)' == ''" Include="Release" />
++        <PlatformList Condition="'@(PlatformList)' == '' and $(Platform) != ''" Include="$(Platform.Split('+'))" />
++        <PlatformList Condition="'@(PlatformList)' == ''" Include="x64;x86" />
++      </ItemGroup>
++      <Target Name="List" Outputs="%(PlatformList.Identity)">
++        <PropertyGroup>
++          <CurrentPlatform>%(PlatformList.Identity)</CurrentPlatform>
++        </PropertyGroup>
++        <ItemGroup>
++          <ProjectToBuild Include="SMP/APPVEYOR_PROJECT_NAME.sln">
++            <Properties>Configuration=%(ConfigurationList.Identity);Platform=$(CurrentPlatform);OutDir=$(MSBuildThisFileDirectory)build_out\;WindowsTargetPlatformVersion=SDK_VER</Properties>
++          </ProjectToBuild>
++        </ItemGroup>
++      </Target>
++      <Target Name="Build" DependsOnTargets="List">
++        <MSBuild Projects="@(ProjectToBuild)" BuildInParallel="true" />
++      </Target>
++      <Target Name="GitLink" DependsOnTargets="Build" Outputs="%(PlatformList.Identity)">
++        <PropertyGroup>
++          <CurrentPlatform>%(PlatformList.Identity)</CurrentPlatform>
++        </PropertyGroup>
++        <Exec Command="GitLink . -f SMP/APPVEYOR_PROJECT_NAME.sln -c %(ConfigurationList.Identity) -p $(CurrentPlatform) -d $(MSBuildThisFileDirectory)build_out\lib\$(CurrentPlatform) -u https://github.com/APPVEYOR_REPO_NAME.git -s APPVEYOR_REPO_COMMIT -errorsaswarnings"/>
++      </Target>
++    </Project>
++
++    '@
++
++
++    $script = $script -replace "APPVEYOR_PROJECT_NAME", "$env:APPVEYOR_PROJECT_NAME"
++
++    $script = $script -replace "APPVEYOR_REPO_NAME", "$env:APPVEYOR_REPO_NAME"
++
++    $script = $script -replace "APPVEYOR_REPO_COMMIT", "$env:APPVEYOR_REPO_COMMIT"
++
++    $script = $script -replace "APPVEYOR_MSVC_VER", "$env:MSVC_VER"
++
++    $script = $script -replace "SDK_VER", "$env:WindowsSDKVersion"
++
++    $script | Out-File build.vcxproj
++
++# Set Targets path so that gitlink works correctly
++- ps: $env:MSBUILDDIR=((Get-Command msbuild.exe).Path | Split-Path -parent)
++- ps: >-
++    if ($env:MSVC_VER -eq 15) {
++        $env:VCTargetsPath="$env:MSBUILDDIR\..\..\..\Common7\IDE\VC\VCTargets"
++    } else {
++        $env:VCTargetsPath="$env:MSBUILDDIR\..\..\..\Microsoft.Cpp\v4.0\V${env:MSVC_VER}0"
++    }
++
++# Download and install yasm integration
++- ps: (New-Object Net.WebClient).DownloadFile('https://github.com/ShiftMediaProject/VSYASM/releases/download/0.1/VSYASM.zip', "$pwd\yasm.zip")
++- ps: Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory("$pwd\yasm.zip", "$pwd\TempYASMUnpack")
++- cmd: call ".\TempYASMUnpack\install_script.bat"
++# Additional yasm location in order to fix gitlink error
++- ps: if ($env:MSVC_VER -ne 15) { Copy-Item -Force "TempYASMUnpack\*.*" "$env:VCTargetsPath\..\BuildCustomizations" }
++
++# Use project supplied script to download all required dependency libraries
++- cmd: call "%APPVEYOR_BUILD_FOLDER%\SMP\project_get_dependencies.bat"
++
++build:
++  project: build.vcxproj
++  parallel: true
++  verbosity: minimal
++
++after_build:
++# Copy licenses for dependencies
++- cmd: copy /y %APPVEYOR_BUILD_FOLDER%\..\prebuilt\licenses\*.* %APPVEYOR_BUILD_FOLDER%\build_out\licenses\
++
++artifacts:
++- path: build_out
++  name: $(APPVEYOR_PROJECT_NAME)_$(APPVEYOR_REPO_TAG_NAME)_msvc$(MSVC_VER)
++  type: zip
++
++deploy:
++- provider: GitHub
++  tag: $(APPVEYOR_REPO_TAG_NAME)
++  description: Pre-built static and shared libraries in 32b and 64b for $(APPVEYOR_PROJECT_NAME) $(APPVEYOR_REPO_TAG_NAME)
++  auth_token:
++    secure: aiTcAD/YitqgwuiBdC3ImXiUlHfIIDD7ayjCs3Y3aAO5vEm1gA7flCZpUZ60a5am
++  artifact: $(APPVEYOR_PROJECT_NAME)_$(APPVEYOR_REPO_TAG_NAME)_msvc$(MSVC_VER)
++  force_update: true
+\ No newline at end of file
+diff --git a/SMP/byteswap.h b/SMP/byteswap.h
+new file mode 100644
+index 0000000..db77db3
+--- /dev/null
++++ b/SMP/byteswap.h
+@@ -0,0 +1,36 @@
++/*
++ * MSVC byteswap.h compatibility header.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#ifndef SMP_BYTESWAP_H
++#define SMP_BYTESWAP_H
++
++#ifndef _MSC_VER
++#   include_next <byteswap.h>
++#else
++
++#define bswap_16 _byteswap_ushort
++#define bswap_32 _byteswap_ulong
++#define bswap_64 _byteswap_uint64
++
++#endif /* _MSC_VER */
++
++#endif /* SMP_BYTESWAP_H */
+diff --git a/SMP/config.h b/SMP/config.h
+new file mode 100644
+index 0000000..911fa49
+--- /dev/null
++++ b/SMP/config.h
+@@ -0,0 +1,2273 @@
++
++/* Define if building universal (internal helper macro) */
++/* #undef AC_APPLE_UNIVERSAL_BUILD */
++
++/* Define to the number of bits in type 'ptrdiff_t'. */
++/* #undef BITSIZEOF_PTRDIFF_T */
++
++/* Define to the number of bits in type 'sig_atomic_t'. */
++/* #undef BITSIZEOF_SIG_ATOMIC_T */
++
++/* Define to the number of bits in type 'size_t'. */
++/* #undef BITSIZEOF_SIZE_T */
++
++/* Define to the number of bits in type 'wchar_t'. */
++/* #undef BITSIZEOF_WCHAR_T */
++
++/* Define to the number of bits in type 'wint_t'. */
++/* #undef BITSIZEOF_WINT_T */
++
++/* C99 macros are supported */
++#define C99_MACROS 1
++
++/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP
++   systems. This function is required for `alloca.c' support on those systems.
++   */
++/* #undef CRAY_STACKSEG_END */
++
++/* Define to 1 if using `alloca.c'. */
++/* #undef C_ALLOCA */
++
++/* Define as the bit index in the word where to find bit 0 of the exponent of
++   'double'. */
++#define DBL_EXPBIT0_BIT 20
++
++/* Define as the word index where to find the exponent of 'double'. */
++#define DBL_EXPBIT0_WORD 1
++
++/* use the given certificate blacklist file */
++/* #undef DEFAULT_BLACKLIST_FILE */
++
++/* use the given CRL file */
++/* #undef DEFAULT_CRL_FILE */
++
++/* The default priority string */
++#define DEFAULT_PRIORITY_STRING "NORMAL"
++
++/* use the given directory as default trust store */
++/* #undef DEFAULT_TRUST_STORE_DIR */
++
++/* use the given file default trust store */
++/* #undef DEFAULT_TRUST_STORE_FILE */
++
++/* use the given pkcs11 uri as default trust store */
++/* #undef DEFAULT_TRUST_STORE_PKCS11 */
++
++/* Define to 1 if // is a file system root distinct from /. */
++/* #undef DOUBLE_SLASH_IS_DISTINCT_ROOT */
++
++/* enable ALPN support */
++#define ENABLE_ALPN 1
++
++/* enable anonymous authentication */
++#define ENABLE_ANON 1
++
++/* Enable cryptodev support */
++/* #undef ENABLE_CRYPTODEV */
++
++/* enable DHE */
++#define ENABLE_DHE 1
++
++/* enable DTLS-SRTP support */
++/* #undef ENABLE_DTLS_SRTP */
++
++/* enable DHE */
++#define ENABLE_ECDHE 1
++
++/* Enable FIPS140-2 mode */
++/* #undef ENABLE_FIPS140 */
++
++/* enable GOST */
++#define ENABLE_GOST 1
++
++/* enable heartbeat support */
++#define ENABLE_HEARTBEAT 1
++
++/* nls support in libopts */
++/* #undef ENABLE_NLS */
++
++/* Enable all curves */
++#define ENABLE_NON_SUITEB_CURVES 1
++
++/* enable OCSP support */
++#define ENABLE_OCSP 1
++
++/* use openpgp authentication */
++#define ENABLE_OPENPGP 1
++
++/* Enable padlock acceleration */
++#define ENABLE_PADLOCK 1
++
++/* Build PKCS#11 support */
++/* #undef ENABLE_PKCS11 */
++
++/* enable PSK authentication */
++#define ENABLE_PSK 1
++
++/* Self checks are included in the library */
++/* #undef ENABLE_SELF_CHECKS */
++
++/* enable session tickets support */
++#define ENABLE_SESSION_TICKETS 1
++
++/* enable SRP authentication */
++#define ENABLE_SRP 1
++
++/* enable SSL2.0 support for client hello */
++#define ENABLE_SSL2 1
++
++/* enable SSL3.0 support */
++#define ENABLE_SSL3 1
++
++/* The FIPS140-2 integrity key */
++/* #undef FIPS_KEY */
++
++/* Define to nothing if C supports flexible array members, and to 1 if it does
++   not. That way, with a declaration like 'struct s { int n; double
++   d[FLEXIBLE_ARRAY_MEMBER]; };', the struct hack can be used with pre-C99
++   compilers. When computing the size of such an object, don't use 'sizeof
++   (struct s)' as it overestimates the size. Use 'offsetof (struct s, d)'
++   instead. Don't use 'offsetof (struct s, d[0])', as this doesn't work with
++   MSVC and with C++ compilers. */
++#define FLEXIBLE_ARRAY_MEMBER /**/
++
++/* fopen(3) accepts a 'b' in the mode flag */
++/* #undef FOPEN_BINARY_FLAG */
++
++/* fopen(3) accepts a 't' in the mode flag */
++/* #undef FOPEN_TEXT_FLAG */
++
++/* Define to 1 if the system's ftello function has the Solaris bug. */
++/* #undef FTELLO_BROKEN_AFTER_SWITCHING_FROM_READ_TO_WRITE */
++
++/* Define to 1 if ungetc is broken when used on arbitrary bytes. */
++/* #undef FUNC_UNGETC_BROKEN */
++
++/* Define if gettimeofday clobbers the localtime buffer. */
++/* #undef GETTIMEOFDAY_CLOBBERS_LOCALTIME */
++
++/* Define this to 'void' or 'struct timezone' to match the system's
++   declaration of the second argument to gettimeofday. */
++#define GETTIMEOFDAY_TIMEZONE struct timezone
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module fscanf shall be considered present. */
++#define GNULIB_FSCANF 1
++
++/* Define to 1 if printf and friends should be labeled with attribute
++   "__gnu_printf__" instead of "__printf__" */
++/* #undef GNULIB_PRINTF_ATTRIBUTE_FLAVOR_GNU */
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module scanf shall be considered present. */
++#define GNULIB_SCANF 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module snprintf shall be considered present. */
++#define GNULIB_SNPRINTF 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module strerror shall be considered present. */
++#define GNULIB_STRERROR 1
++
++/* Define to 1 when the gnulib module accept should be tested. */
++#define GNULIB_TEST_ACCEPT 1
++
++/* Define to 1 when the gnulib module bind should be tested. */
++#define GNULIB_TEST_BIND 1
++
++/* Define to 1 when the gnulib module close should be tested. */
++#define GNULIB_TEST_CLOSE 1
++
++/* Define to 1 when the gnulib module connect should be tested. */
++#define GNULIB_TEST_CONNECT 1
++
++/* Define to 1 when the gnulib module dup2 should be tested. */
++#define GNULIB_TEST_DUP2 1
++
++/* Define to 1 when the gnulib module environ should be tested. */
++#define GNULIB_TEST_ENVIRON 1
++
++/* Define to 1 when the gnulib module fdopen should be tested. */
++#define GNULIB_TEST_FDOPEN 1
++
++/* Define to 1 when the gnulib module fseek should be tested. */
++#define GNULIB_TEST_FSEEK 1
++
++/* Define to 1 when the gnulib module fseeko should be tested. */
++#define GNULIB_TEST_FSEEKO 1
++
++/* Define to 1 when the gnulib module fstat should be tested. */
++#define GNULIB_TEST_FSTAT 1
++
++/* Define to 1 when the gnulib module ftell should be tested. */
++#define GNULIB_TEST_FTELL 1
++
++/* Define to 1 when the gnulib module ftello should be tested. */
++#define GNULIB_TEST_FTELLO 1
++
++/* Define to 1 when the gnulib module getaddrinfo should be tested. */
++#define GNULIB_TEST_GETADDRINFO 1
++
++/* Define to 1 when the gnulib module getdelim should be tested. */
++#define GNULIB_TEST_GETDELIM 1
++
++/* Define to 1 when the gnulib module getline should be tested. */
++#define GNULIB_TEST_GETLINE 1
++
++/* Define to 1 when the gnulib module getpagesize should be tested. */
++#define GNULIB_TEST_GETPAGESIZE 1
++
++/* Define to 1 when the gnulib module getpeername should be tested. */
++#define GNULIB_TEST_GETPEERNAME 1
++
++/* Define to 1 when the gnulib module gettimeofday should be tested. */
++#define GNULIB_TEST_GETTIMEOFDAY 1
++
++/* Define to 1 when the gnulib module listen should be tested. */
++#define GNULIB_TEST_LISTEN 1
++
++/* Define to 1 when the gnulib module lseek should be tested. */
++#define GNULIB_TEST_LSEEK 1
++
++/* Define to 1 when the gnulib module malloc-posix should be tested. */
++#define GNULIB_TEST_MALLOC_POSIX 1
++
++/* Define to 1 when the gnulib module memchr should be tested. */
++#define GNULIB_TEST_MEMCHR 1
++
++/* Define to 1 when the gnulib module memmem should be tested. */
++#define GNULIB_TEST_MEMMEM 1
++
++/* Define to 1 when the gnulib module mktime should be tested. */
++#define GNULIB_TEST_MKTIME 1
++
++/* Define to 1 when the gnulib module realloc-posix should be tested. */
++#define GNULIB_TEST_REALLOC_POSIX 1
++
++/* Define to 1 when the gnulib module recv should be tested. */
++#define GNULIB_TEST_RECV 1
++
++/* Define to 1 when the gnulib module recvfrom should be tested. */
++#define GNULIB_TEST_RECVFROM 1
++
++/* Define to 1 when the gnulib module secure_getenv should be tested. */
++#define GNULIB_TEST_SECURE_GETENV 1
++
++/* Define to 1 when the gnulib module select should be tested. */
++#define GNULIB_TEST_SELECT 1
++
++/* Define to 1 when the gnulib module send should be tested. */
++#define GNULIB_TEST_SEND 1
++
++/* Define to 1 when the gnulib module sendto should be tested. */
++#define GNULIB_TEST_SENDTO 1
++
++/* Define to 1 when the gnulib module setenv should be tested. */
++#define GNULIB_TEST_SETENV 1
++
++/* Define to 1 when the gnulib module setsockopt should be tested. */
++#define GNULIB_TEST_SETSOCKOPT 1
++
++/* Define to 1 when the gnulib module shutdown should be tested. */
++#define GNULIB_TEST_SHUTDOWN 1
++
++/* Define to 1 when the gnulib module snprintf should be tested. */
++#define GNULIB_TEST_SNPRINTF 1
++
++/* Define to 1 when the gnulib module socket should be tested. */
++#define GNULIB_TEST_SOCKET 1
++
++/* Define to 1 when the gnulib module strdup should be tested. */
++#define GNULIB_TEST_STRDUP 1
++
++/* Define to 1 when the gnulib module strerror should be tested. */
++#define GNULIB_TEST_STRERROR 1
++
++/* Define to 1 when the gnulib module strndup should be tested. */
++#define GNULIB_TEST_STRNDUP 1
++
++/* Define to 1 when the gnulib module strnlen should be tested. */
++#define GNULIB_TEST_STRNLEN 1
++
++/* Define to 1 when the gnulib module strtok_r should be tested. */
++#define GNULIB_TEST_STRTOK_R 1
++
++/* Define to 1 when the gnulib module strverscmp should be tested. */
++#define GNULIB_TEST_STRVERSCMP 1
++
++/* Define to 1 when the gnulib module timegm should be tested. */
++#define GNULIB_TEST_TIMEGM 1
++
++/* Define to 1 when the gnulib module time_r should be tested. */
++#define GNULIB_TEST_TIME_R 1
++
++/* Define to 1 when the gnulib module time_rz should be tested. */
++#define GNULIB_TEST_TIME_RZ 1
++
++/* Define to 1 when the gnulib module uninorm/u16-normalize should be tested.
++   */
++#define GNULIB_TEST_UNINORM_U16_NORMALIZE 1
++
++/* Define to 1 when the gnulib module uninorm/u32-normalize should be tested.
++   */
++#define GNULIB_TEST_UNINORM_U32_NORMALIZE 1
++
++/* Define to 1 when the gnulib module uninorm/u8-normalize should be tested.
++   */
++#define GNULIB_TEST_UNINORM_U8_NORMALIZE 1
++
++/* Define to 1 when the gnulib module unsetenv should be tested. */
++#define GNULIB_TEST_UNSETENV 1
++
++/* Define to 1 when the gnulib module vasprintf should be tested. */
++#define GNULIB_TEST_VASPRINTF 1
++
++/* Define to 1 when the gnulib module vsnprintf should be tested. */
++#define GNULIB_TEST_VSNPRINTF 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module unistr/u16-mbtoucr shall be considered present.
++   */
++#define GNULIB_UNISTR_U16_MBTOUCR 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module unistr/u16-mbtouc-unsafe shall be considered
++   present. */
++#define GNULIB_UNISTR_U16_MBTOUC_UNSAFE 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module unistr/u16-uctomb shall be considered present. */
++#define GNULIB_UNISTR_U16_UCTOMB 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module unistr/u32-mbtouc-unsafe shall be considered
++   present. */
++#define GNULIB_UNISTR_U32_MBTOUC_UNSAFE 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module unistr/u32-uctomb shall be considered present. */
++#define GNULIB_UNISTR_U32_UCTOMB 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module unistr/u8-mbtoucr shall be considered present. */
++#define GNULIB_UNISTR_U8_MBTOUCR 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module unistr/u8-mbtouc-unsafe shall be considered
++   present. */
++#define GNULIB_UNISTR_U8_MBTOUC_UNSAFE 1
++
++/* Define to a C preprocessor expression that evaluates to 1 or 0, depending
++   whether the gnulib module unistr/u8-uctomb shall be considered present. */
++#define GNULIB_UNISTR_U8_UCTOMB 1
++
++/* Make sure we don't use old features in code. */
++#define GNUTLS_COMPAT_H 1
++
++/* We allow temporarily usage of deprecated functions - until they are
++   removed. */
++#define GNUTLS_INTERNAL_BUILD 1
++
++/* Additional cast to bring void* to a type castable to int. */
++#define GNUTLS_POINTER_TO_INT_CAST (long)
++
++/* Define to 1 if you have 'alloca' after including <alloca.h>, a header that
++   may be supplied by this distribution. */
++#define HAVE_ALLOCA 1
++
++/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).
++   */
++/* #undef HAVE_ALLOCA_H */
++
++/* Define to 1 if you have the <arpa/inet.h> header file. */
++/* #undef HAVE_ARPA_INET_H */
++
++/* Define to 1 if you have the <bp-sym.h> header file. */
++/* #undef HAVE_BP_SYM_H */
++
++/* Define to 1 if you have the <byteswap.h> header file. */
++/* #undef HAVE_BYTESWAP_H */
++
++/* Define to 1 if you have the `canonicalize_file_name' function. */
++/* #undef HAVE_CANONICALIZE_FILE_NAME */
++
++/* Define to 1 if you have the Mac OS X function CFLocaleCopyCurrent in the
++   CoreFoundation framework. */
++/* #undef HAVE_CFLOCALECOPYCURRENT */
++
++/* Define to 1 if you have the Mac OS X function CFPreferencesCopyAppValue in
++   the CoreFoundation framework. */
++/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */
++
++/* Define to 1 if you have the `chmod' function. */
++/* #undef HAVE_CHMOD */
++
++/* Define to 1 if you have the `clock_gettime' function. */
++/* #undef HAVE_CLOCK_GETTIME */
++
++/* Define to 1 if you have the `clock_settime' function. */
++/* #undef HAVE_CLOCK_SETTIME */
++
++/* Define if you have compound literals. */
++#define HAVE_COMPOUND_LITERALS 1
++
++/* Define to 1 if you have the <cpuid.h> header file. */
++#define HAVE_CPUID_H 1
++
++/* Define to 1 if you have the `daemon' function. */
++/* #undef HAVE_DAEMON */
++
++/* Enable the DANE library */
++/* #undef HAVE_DANE */
++
++/* Define if the GNU dcgettext() function is already present or preinstalled.
++   */
++/* #undef HAVE_DCGETTEXT */
++
++/* Define to 1 if you have the declaration of `alarm', and to 0 if you don't.
++   */
++#define HAVE_DECL_ALARM 0
++
++/* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if
++   you don't. */
++#define HAVE_DECL_FFLUSH_UNLOCKED 0
++
++/* Define to 1 if you have the declaration of `flockfile', and to 0 if you
++   don't. */
++#define HAVE_DECL_FLOCKFILE 0
++
++/* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if
++   you don't. */
++#define HAVE_DECL_FPUTS_UNLOCKED 0
++
++/* Define to 1 if you have the declaration of `freeaddrinfo', and to 0 if you
++   don't. */
++#define HAVE_DECL_FREEADDRINFO 1
++
++/* Define to 1 if you have the declaration of `fseeko', and to 0 if you don't.
++   */
++#define HAVE_DECL_FSEEKO 1
++
++/* Define to 1 if you have the declaration of `ftello', and to 0 if you don't.
++   */
++#define HAVE_DECL_FTELLO 1
++
++/* Define to 1 if you have the declaration of `funlockfile', and to 0 if you
++   don't. */
++#define HAVE_DECL_FUNLOCKFILE 0
++
++/* Define to 1 if you have the declaration of `gai_strerror', and to 0 if you
++   don't. */
++#define HAVE_DECL_GAI_STRERROR 1
++
++/* Define to 1 if you have the declaration of `gai_strerrorA', and to 0 if you
++   don't. */
++#define HAVE_DECL_GAI_STRERRORA 0
++
++/* Define to 1 if you have the declaration of `getaddrinfo', and to 0 if you
++   don't. */
++#define HAVE_DECL_GETADDRINFO 1
++
++/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you
++   don't. */
++#define HAVE_DECL_GETC_UNLOCKED 0
++
++/* Define to 1 if you have the declaration of `getdelim', and to 0 if you
++   don't. */
++#define HAVE_DECL_GETDELIM 0
++
++/* Define to 1 if you have the declaration of `getline', and to 0 if you
++   don't. */
++#define HAVE_DECL_GETLINE 0
++
++/* Define to 1 if you have the declaration of `getnameinfo', and to 0 if you
++   don't. */
++#define HAVE_DECL_GETNAMEINFO 1
++
++/* Define to 1 if you have the declaration of `getpass', and to 0 if you
++   don't. */
++#define HAVE_DECL_GETPASS 0
++
++/* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you
++   don't. */
++#define HAVE_DECL_INET_NTOP 0
++
++/* Define to 1 if you have the declaration of `inet_pton', and to 0 if you
++   don't. */
++#define HAVE_DECL_INET_PTON 0
++
++/* Define to 1 if you have the declaration of `localtime_r', and to 0 if you
++   don't. */
++#define HAVE_DECL_LOCALTIME_R 0
++
++/* Define to 1 if you have the declaration of `memmem', and to 0 if you don't.
++   */
++#define HAVE_DECL_MEMMEM 0
++
++/* Define to 1 if you have the declaration of `program_invocation_name', and
++   to 0 if you don't. */
++#define HAVE_DECL_PROGRAM_INVOCATION_NAME 0
++
++/* Define to 1 if you have the declaration of `program_invocation_short_name',
++   and to 0 if you don't. */
++#define HAVE_DECL_PROGRAM_INVOCATION_SHORT_NAME 0
++
++/* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you
++   don't. */
++#define HAVE_DECL_PUTC_UNLOCKED 0
++
++/* Define to 1 if you have the declaration of `setenv', and to 0 if you don't.
++   */
++#define HAVE_DECL_SETENV 0
++
++/* Define to 1 if you have the declaration of `snprintf', and to 0 if you
++   don't. */
++#define HAVE_DECL_SNPRINTF 1
++
++/* Define to 1 if you have the declaration of `strdup', and to 0 if you don't.
++   */
++#define HAVE_DECL_STRDUP 1
++
++/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you
++   don't. */
++#define HAVE_DECL_STRERROR_R 0
++
++/* Define to 1 if you have the declaration of `strncasecmp', and to 0 if you
++   don't. */
++#define HAVE_DECL_STRNCASECMP 1
++
++/* Define to 1 if you have the declaration of `strndup', and to 0 if you
++   don't. */
++#define HAVE_DECL_STRNDUP 0
++
++/* Define to 1 if you have the declaration of `strnlen', and to 0 if you
++   don't. */
++#define HAVE_DECL_STRNLEN 1
++
++/* Define to 1 if you have the declaration of `strtok_r', and to 0 if you
++   don't. */
++#define HAVE_DECL_STRTOK_R 0
++
++/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't.
++   */
++#define HAVE_DECL_TZNAME 1
++
++/* Define to 1 if you have the declaration of `unsetenv', and to 0 if you
++   don't. */
++#define HAVE_DECL_UNSETENV 0
++
++/* Define to 1 if you have the declaration of `vsnprintf', and to 0 if you
++   don't. */
++#define HAVE_DECL_VSNPRINTF 1
++
++/* Define to 1 if you have the declaration of `_snprintf', and to 0 if you
++   don't. */
++#define HAVE_DECL__SNPRINTF 1
++
++/* Define to 1 if you have the declaration of `__argv', and to 0 if you don't.
++   */
++#define HAVE_DECL___ARGV 0
++
++/* Define to 1 if you have the declaration of `__fsetlocking', and to 0 if you
++   don't. */
++#define HAVE_DECL___FSETLOCKING 0
++
++/* Define this if /dev/zero is readable device */
++/* #undef HAVE_DEV_ZERO */
++
++/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'.
++   */
++/* #undef HAVE_DIRENT_H */
++
++/* Define to 1 if you have the <dlfcn.h> header file. */
++/* #undef HAVE_DLFCN_H */
++
++/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
++/* #undef HAVE_DOPRNT */
++
++/* Define to 1 if you have the 'dup2' function. */
++#define HAVE_DUP2 1
++
++/* Define if you have the declaration of environ. */
++#define HAVE_ENVIRON_DECL 1
++
++/* Define to 1 if you have the <errno.h> header file. */
++/* #undef HAVE_ERRNO_H */
++
++/* Define to 1 if you have the `fchmod' function. */
++/* #undef HAVE_FCHMOD */
++
++/* Define to 1 if you have the <fcntl.h> header file. */
++/* #undef HAVE_FCNTL_H */
++
++/* Define to 1 if you have the <features.h> header file. */
++/* #undef HAVE_FEATURES_H */
++
++/* Define to 1 if you have the `flockfile' function. */
++/* #undef HAVE_FLOCKFILE */
++
++/* Define to 1 if you have the `fmemopen' function. */
++/* #undef HAVE_FMEMOPEN */
++
++/* Define to 1 if you have the `fork' function. */
++/* #undef HAVE_FORK */
++
++/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */
++#define HAVE_FSEEKO 1
++
++/* Define to 1 if you have the `fstat' function. */
++/* #undef HAVE_FSTAT */
++
++/* Define to 1 if you have the `funlockfile' function. */
++/* #undef HAVE_FUNLOCKFILE */
++
++/* Define to 1 if you have the `getdelim' function. */
++/* #undef HAVE_GETDELIM */
++
++/* Define to 1 if you have the `getegid' function. */
++/* #undef HAVE_GETEGID */
++
++/* Enable the OpenBSD getentropy function */
++/* #undef HAVE_GETENTROPY */
++
++/* Define to 1 if you have the `geteuid' function. */
++/* #undef HAVE_GETEUID */
++
++/* Define to 1 if you have the `getexecname' function. */
++/* #undef HAVE_GETEXECNAME */
++
++/* Define to 1 if you have the `getgid' function. */
++/* #undef HAVE_GETGID */
++
++/* Define to 1 if you have the `gethostbyname' function. */
++/* #undef HAVE_GETHOSTBYNAME */
++
++/* Define to 1 if you have the `getpagesize' function. */
++#define HAVE_GETPAGESIZE 1
++
++/* Define to 1 if you have the `getpass' function. */
++/* #undef HAVE_GETPASS */
++
++/* Define to 1 if you have the `getpid' function. */
++/* #undef HAVE_GETPID */
++
++/* Define to 1 if you have the `getprogname' function. */
++/* #undef HAVE_GETPROGNAME */
++
++/* Define to 1 if you have the `getpwuid_r' function. */
++/* #undef HAVE_GETPWUID_R */
++
++/* Define to 1 if you have the `getrusage' function. */
++/* #undef HAVE_GETRUSAGE */
++
++/* Define to 1 if you have the `getservbyname' function. */
++/* #undef HAVE_GETSERVBYNAME */
++
++/* Define if the GNU gettext() function is already present or preinstalled. */
++/* #undef HAVE_GETTEXT */
++
++/* Define to 1 if you have the `gettimeofday' function. */
++#define HAVE_GETTIMEOFDAY 1
++
++/* Define to 1 if you have the `getuid' function. */
++/* #undef HAVE_GETUID */
++
++/* Define if you have the iconv() function and it works. */
++/* #undef HAVE_ICONV */
++
++/* Define to 1 if you have the `inet_ntop' function. */
++/* #undef HAVE_INET_NTOP */
++
++/* Define to 1 if you have the `inet_pton' function. */
++/* #undef HAVE_INET_PTON */
++
++/* Define to 1 if the compiler supports one of the keywords 'inline',
++   '__inline__', '__inline' and effectively inlines functions marked as such.
++   */
++#define HAVE_INLINE 1
++
++/* Define to 1 if the system has the type `int16_t'. */
++#define HAVE_INT16_T 1
++
++/* Define to 1 if the system has the type `int32_t'. */
++#define HAVE_INT32_T 1
++
++/* Define to 1 if the system has the type `int8_t'. */
++#define HAVE_INT8_T 1
++
++/* Define if you have the 'intmax_t' type in <stdint.h> or <inttypes.h>. */
++#define HAVE_INTMAX_T 1
++
++/* Define to 1 if the system has the type `intptr_t'. */
++#define HAVE_INTPTR_T 1
++
++/* Define to 1 if you have the <inttypes.h> header file. */
++#define HAVE_INTTYPES_H 1
++
++/* Define if <inttypes.h> exists, doesn't clash with <sys/types.h>, and
++   declares uintmax_t. */
++#define HAVE_INTTYPES_H_WITH_UINTMAX 1
++
++/* Define to 1 if <sys/socket.h> defines AF_INET. */
++#define HAVE_IPV4 1
++
++/* Define to 1 if <sys/socket.h> defines AF_INET6. */
++#define HAVE_IPV6 1
++
++/* Define to 1 if you have the `issetugid' function. */
++/* #undef HAVE_ISSETUGID */
++
++/* Define if you have the libcrypto library. */
++/* #undef HAVE_LIBCRYPTO */
++
++/* Define if you have the libdl library. */
++/* #undef HAVE_LIBDL */
++
++/* Define to 1 if you have the `gen' library (-lgen). */
++/* #undef HAVE_LIBGEN */
++
++/* Define to 1 if you have the <libgen.h> header file. */
++/* #undef HAVE_LIBGEN_H */
++
++/* Build IDNA support */
++/* #undef HAVE_LIBIDN */
++
++/* Define if IDNA 2008 support is enabled. */
++/* #undef HAVE_LIBIDN2 */
++
++/* Define to 1 if you have the `intl' library (-lintl). */
++/* #undef HAVE_LIBINTL */
++
++/* Define to 1 if you have the <libintl.h> header file. */
++/* #undef HAVE_LIBINTL_H */
++
++/* nettle is enabled */
++#define HAVE_LIBNETTLE 1
++
++/* Define if you have the libnsl library. */
++/* #undef HAVE_LIBNSL */
++
++/* Define if you have the libpthread library. */
++/* #undef HAVE_LIBPTHREAD */
++
++/* Define if you have the librt library. */
++/* #undef HAVE_LIBRT */
++
++/* Define if you have the libseccomp library. */
++/* #undef HAVE_LIBSECCOMP */
++
++/* Define if you have the libunistring library. */
++/* #undef HAVE_LIBUNISTRING */
++
++/* Define if you have the libz library. */
++#define HAVE_LIBZ 1
++
++/* Define to 1 if you have the <limits.h> header file. */
++#define HAVE_LIMITS_H 1
++
++/* Enable the Linux getrandom function */
++/* #undef HAVE_GETRANDOM */
++
++/* Define to 1 if you have the `localtime' function. */
++#define HAVE_LOCALTIME 1
++
++/* Define to 1 if you have the `localtime_r' function. */
++/* #undef HAVE_LOCALTIME_R */
++
++/* Define to 1 if the system has the type 'long long int'. */
++#define HAVE_LONG_LONG_INT 1
++
++/* Define if the 'malloc' function is POSIX compliant. */
++/* #undef HAVE_MALLOC_POSIX */
++
++/* Define to 1 if mmap()'s MAP_ANONYMOUS flag is available after including
++   config.h and <sys/mman.h>. */
++/* #undef HAVE_MAP_ANONYMOUS */
++
++/* Define to 1 if you have the `mbrtowc' function. */
++#define HAVE_MBRTOWC 1
++
++/* Define to 1 if you have the `memmem' function. */
++/* #undef HAVE_MEMMEM */
++
++/* Define to 1 if you have the <memory.h> header file. */
++#define HAVE_MEMORY_H 1
++
++/* Define to 1 if <limits.h> defines the MIN and MAX macros. */
++/* #undef HAVE_MINMAX_IN_LIMITS_H */
++
++/* Define to 1 if <sys/param.h> defines the MIN and MAX macros. */
++/* #undef HAVE_MINMAX_IN_SYS_PARAM_H */
++
++/* Define to 1 if you have the `mmap' function. */
++/* #undef HAVE_MMAP */
++
++/* Define to 1 if you have the `mprotect' function. */
++#define HAVE_MPROTECT 1
++
++/* Define to 1 on MSVC platforms that have the "invalid parameter handler"
++   concept. */
++#define HAVE_MSVC_INVALID_PARAMETER_HANDLER 1
++
++/* Define to 1 if you have the `nanosleep' function. */
++/* #undef HAVE_NANOSLEEP */
++
++/* Define to 1 if you have the `nanotime' function. */
++/* #undef HAVE_NANOTIME */
++
++/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
++/* #undef HAVE_NDIR_H */
++
++/* Define to 1 if you have the <netdb.h> header file. */
++/* #undef HAVE_NETDB_H */
++
++/* Define to 1 if you have the <netinet/in.h> header file. */
++/* #undef HAVE_NETINET_IN_H */
++
++/* Define to 1 if you have the <netinet/tcp.h> header file. */
++/* #undef HAVE_NETINET_TCP_H */
++
++/* Define to 1 if you have the <OS.h> header file. */
++/* #undef HAVE_OS_H */
++
++/* Define this if pathfind(3) works */
++/* #undef HAVE_PATHFIND */
++
++/* Define to 1 if the system has the type `pid_t'. */
++#define HAVE_PID_T 1
++
++/* Define to 1 if you have the `pthread_mutex_lock' function. */
++/* #undef HAVE_PTHREAD_MUTEX_LOCK */
++
++/* Define to 1 if the system has the type `ptrdiff_t'. */
++#define HAVE_PTRDIFF_T 1
++
++/* Define to 1 if accept is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_ACCEPT */
++
++/* Define to 1 if accept4 is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_ACCEPT4 */
++
++/* Define to 1 if atoll is declared even after undefining macros. */
++#define HAVE_RAW_DECL_ATOLL 1
++
++/* Define to 1 if bind is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_BIND */
++
++/* Define to 1 if btowc is declared even after undefining macros. */
++#define HAVE_RAW_DECL_BTOWC 1
++
++/* Define to 1 if canonicalize_file_name is declared even after undefining
++   macros. */
++/* #undef HAVE_RAW_DECL_CANONICALIZE_FILE_NAME */
++
++/* Define to 1 if chdir is declared even after undefining macros. */
++#define HAVE_RAW_DECL_CHDIR 1
++
++/* Define to 1 if chown is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_CHOWN */
++
++/* Define to 1 if connect is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_CONNECT */
++
++/* Define to 1 if dprintf is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_DPRINTF */
++
++/* Define to 1 if dup is declared even after undefining macros. */
++#define HAVE_RAW_DECL_DUP 1
++
++/* Define to 1 if dup2 is declared even after undefining macros. */
++#define HAVE_RAW_DECL_DUP2 1
++
++/* Define to 1 if dup3 is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_DUP3 */
++
++/* Define to 1 if endusershell is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_ENDUSERSHELL */
++
++/* Define to 1 if environ is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_ENVIRON */
++
++/* Define to 1 if euidaccess is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_EUIDACCESS */
++
++/* Define to 1 if faccessat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FACCESSAT */
++
++/* Define to 1 if fchdir is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FCHDIR */
++
++/* Define to 1 if fchmodat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FCHMODAT */
++
++/* Define to 1 if fchownat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FCHOWNAT */
++
++/* Define to 1 if fcntl is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FCNTL */
++
++/* Define to 1 if fdatasync is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FDATASYNC */
++
++/* Define to 1 if ffs is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FFS */
++
++/* Define to 1 if ffsl is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FFSL */
++
++/* Define to 1 if ffsll is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FFSLL */
++
++/* Define to 1 if fpurge is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FPURGE */
++
++/* Define to 1 if freeaddrinfo is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FREEADDRINFO */
++
++/* Define to 1 if fseeko is declared even after undefining macros. */
++#define HAVE_RAW_DECL_FSEEKO 1
++
++/* Define to 1 if fstat is declared even after undefining macros. */
++#define HAVE_RAW_DECL_FSTAT 1
++
++/* Define to 1 if fstatat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FSTATAT */
++
++/* Define to 1 if fsync is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FSYNC */
++
++/* Define to 1 if ftello is declared even after undefining macros. */
++#define HAVE_RAW_DECL_FTELLO 1
++
++/* Define to 1 if ftruncate is declared even after undefining macros. */
++#define HAVE_RAW_DECL_FTRUNCATE 1
++
++/* Define to 1 if futimens is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_FUTIMENS */
++
++/* Define to 1 if gai_strerror is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GAI_STRERROR */
++
++/* Define to 1 if getaddrinfo is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETADDRINFO */
++
++/* Define to 1 if getcwd is declared even after undefining macros. */
++#define HAVE_RAW_DECL_GETCWD 1
++
++/* Define to 1 if getdelim is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETDELIM */
++
++/* Define to 1 if getdomainname is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETDOMAINNAME */
++
++/* Define to 1 if getdtablesize is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETDTABLESIZE */
++
++/* Define to 1 if getgroups is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETGROUPS */
++
++/* Define to 1 if gethostname is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETHOSTNAME */
++
++/* Define to 1 if getline is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETLINE */
++
++/* Define to 1 if getloadavg is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETLOADAVG */
++
++/* Define to 1 if getlogin is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETLOGIN */
++
++/* Define to 1 if getlogin_r is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETLOGIN_R */
++
++/* Define to 1 if getnameinfo is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETNAMEINFO */
++
++/* Define to 1 if getpagesize is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETPAGESIZE */
++
++/* Define to 1 if getpeername is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETPEERNAME */
++
++/* Define to 1 if gets is declared even after undefining macros. */
++#define HAVE_RAW_DECL_GETS 1
++
++/* Define to 1 if getsockname is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETSOCKNAME */
++
++/* Define to 1 if getsockopt is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETSOCKOPT */
++
++/* Define to 1 if getsubopt is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETSUBOPT */
++
++/* Define to 1 if gettimeofday is declared even after undefining macros. */
++#define HAVE_RAW_DECL_GETTIMEOFDAY 1
++
++/* Define to 1 if getusershell is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GETUSERSHELL */
++
++/* Define to 1 if grantpt is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GRANTPT */
++
++/* Define to 1 if group_member is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_GROUP_MEMBER */
++
++/* Define to 1 if imaxabs is declared even after undefining macros. */
++#define HAVE_RAW_DECL_IMAXABS 1
++
++/* Define to 1 if imaxdiv is declared even after undefining macros. */
++#define HAVE_RAW_DECL_IMAXDIV 1
++
++/* Define to 1 if inet_ntop is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_INET_NTOP */
++
++/* Define to 1 if inet_pton is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_INET_PTON */
++
++/* Define to 1 if initstate is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_INITSTATE */
++
++/* Define to 1 if initstate_r is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_INITSTATE_R */
++
++/* Define to 1 if isatty is declared even after undefining macros. */
++#define HAVE_RAW_DECL_ISATTY 1
++
++/* Define to 1 if isblank is declared even after undefining macros. */
++#define HAVE_RAW_DECL_ISBLANK 1
++
++/* Define to 1 if lchmod is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_LCHMOD */
++
++/* Define to 1 if lchown is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_LCHOWN */
++
++/* Define to 1 if link is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_LINK */
++
++/* Define to 1 if linkat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_LINKAT */
++
++/* Define to 1 if listen is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_LISTEN */
++
++/* Define to 1 if lseek is declared even after undefining macros. */
++#define HAVE_RAW_DECL_LSEEK 1
++
++/* Define to 1 if lstat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_LSTAT */
++
++/* Define to 1 if mbrlen is declared even after undefining macros. */
++#define HAVE_RAW_DECL_MBRLEN 1
++
++/* Define to 1 if mbrtowc is declared even after undefining macros. */
++#define HAVE_RAW_DECL_MBRTOWC 1
++
++/* Define to 1 if mbsinit is declared even after undefining macros. */
++#define HAVE_RAW_DECL_MBSINIT 1
++
++/* Define to 1 if mbsnrtowcs is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MBSNRTOWCS */
++
++/* Define to 1 if mbsrtowcs is declared even after undefining macros. */
++#define HAVE_RAW_DECL_MBSRTOWCS 1
++
++/* Define to 1 if memmem is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MEMMEM */
++
++/* Define to 1 if mempcpy is declared even after undefining macros. */
++#define HAVE_RAW_DECL_MEMPCPY 1
++
++/* Define to 1 if memrchr is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MEMRCHR */
++
++/* Define to 1 if mkdirat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKDIRAT */
++
++/* Define to 1 if mkdtemp is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKDTEMP */
++
++/* Define to 1 if mkfifo is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKFIFO */
++
++/* Define to 1 if mkfifoat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKFIFOAT */
++
++/* Define to 1 if mknod is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKNOD */
++
++/* Define to 1 if mknodat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKNODAT */
++
++/* Define to 1 if mkostemp is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKOSTEMP */
++
++/* Define to 1 if mkostemps is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKOSTEMPS */
++
++/* Define to 1 if mkstemp is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKSTEMP */
++
++/* Define to 1 if mkstemps is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_MKSTEMPS */
++
++/* Define to 1 if openat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_OPENAT */
++
++/* Define to 1 if pclose is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_PCLOSE */
++
++/* Define to 1 if pipe is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_PIPE */
++
++/* Define to 1 if pipe2 is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_PIPE2 */
++
++/* Define to 1 if popen is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_POPEN */
++
++/* Define to 1 if posix_openpt is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_POSIX_OPENPT */
++
++/* Define to 1 if pread is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_PREAD */
++
++/* Define to 1 if pselect is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_PSELECT */
++
++/* Define to 1 if pthread_sigmask is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_PTHREAD_SIGMASK */
++
++/* Define to 1 if ptsname is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_PTSNAME */
++
++/* Define to 1 if ptsname_r is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_PTSNAME_R */
++
++/* Define to 1 if pwrite is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_PWRITE */
++
++/* Define to 1 if random is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_RANDOM */
++
++/* Define to 1 if random_r is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_RANDOM_R */
++
++/* Define to 1 if rawmemchr is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_RAWMEMCHR */
++
++/* Define to 1 if readlink is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_READLINK */
++
++/* Define to 1 if readlinkat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_READLINKAT */
++
++/* Define to 1 if realpath is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_REALPATH */
++
++/* Define to 1 if recv is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_RECV */
++
++/* Define to 1 if recvfrom is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_RECVFROM */
++
++/* Define to 1 if renameat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_RENAMEAT */
++
++/* Define to 1 if rmdir is declared even after undefining macros. */
++#define HAVE_RAW_DECL_RMDIR 1
++
++/* Define to 1 if rpmatch is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_RPMATCH */
++
++/* Define to 1 if secure_getenv is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SECURE_GETENV */
++
++/* Define to 1 if select is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SELECT */
++
++/* Define to 1 if send is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SEND */
++
++/* Define to 1 if sendto is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SENDTO */
++
++/* Define to 1 if setenv is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SETENV */
++
++/* Define to 1 if sethostname is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SETHOSTNAME */
++
++/* Define to 1 if setsockopt is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SETSOCKOPT */
++
++/* Define to 1 if setstate is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SETSTATE */
++
++/* Define to 1 if setstate_r is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SETSTATE_R */
++
++/* Define to 1 if setusershell is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SETUSERSHELL */
++
++/* Define to 1 if shutdown is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SHUTDOWN */
++
++/* Define to 1 if sigaction is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SIGACTION */
++
++/* Define to 1 if sigaddset is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SIGADDSET */
++
++/* Define to 1 if sigdelset is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SIGDELSET */
++
++/* Define to 1 if sigemptyset is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SIGEMPTYSET */
++
++/* Define to 1 if sigfillset is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SIGFILLSET */
++
++/* Define to 1 if sigismember is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SIGISMEMBER */
++
++/* Define to 1 if sigpending is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SIGPENDING */
++
++/* Define to 1 if sigprocmask is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SIGPROCMASK */
++
++/* Define to 1 if sleep is declared even after undefining macros. */
++#define HAVE_RAW_DECL_SLEEP 1
++
++/* Define to 1 if snprintf is declared even after undefining macros. */
++#define HAVE_RAW_DECL_SNPRINTF 1
++
++/* Define to 1 if socket is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SOCKET */
++
++/* Define to 1 if srandom is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SRANDOM */
++
++/* Define to 1 if srandom_r is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SRANDOM_R */
++
++/* Define to 1 if stat is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STAT 1
++
++/* Define to 1 if stpcpy is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STPCPY */
++
++/* Define to 1 if stpncpy is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STPNCPY */
++
++/* Define to 1 if strcasecmp is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRCASECMP 1
++
++/* Define to 1 if strcasestr is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STRCASESTR */
++
++/* Define to 1 if strchrnul is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STRCHRNUL */
++
++/* Define to 1 if strdup is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRDUP 1
++
++/* Define to 1 if strerror_r is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STRERROR_R */
++
++/* Define to 1 if strncasecmp is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRNCASECMP 1
++
++/* Define to 1 if strncat is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRNCAT 1
++
++/* Define to 1 if strndup is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STRNDUP */
++
++/* Define to 1 if strnlen is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRNLEN 1
++
++/* Define to 1 if strpbrk is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRPBRK 1
++
++/* Define to 1 if strsep is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STRSEP */
++
++/* Define to 1 if strsignal is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STRSIGNAL */
++
++/* Define to 1 if strtod is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRTOD 1
++
++/* Define to 1 if strtoimax is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRTOIMAX 1
++
++/* Define to 1 if strtok_r is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STRTOK_R */
++
++/* Define to 1 if strtoll is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRTOLL 1
++
++/* Define to 1 if strtoull is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRTOULL 1
++
++/* Define to 1 if strtoumax is declared even after undefining macros. */
++#define HAVE_RAW_DECL_STRTOUMAX 1
++
++/* Define to 1 if strverscmp is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_STRVERSCMP */
++
++/* Define to 1 if symlink is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SYMLINK */
++
++/* Define to 1 if symlinkat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_SYMLINKAT */
++
++/* Define to 1 if tmpfile is declared even after undefining macros. */
++#define HAVE_RAW_DECL_TMPFILE 1
++
++/* Define to 1 if ttyname_r is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_TTYNAME_R */
++
++/* Define to 1 if unlink is declared even after undefining macros. */
++#define HAVE_RAW_DECL_UNLINK 1
++
++/* Define to 1 if unlinkat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_UNLINKAT */
++
++/* Define to 1 if unlockpt is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_UNLOCKPT */
++
++/* Define to 1 if unsetenv is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_UNSETENV */
++
++/* Define to 1 if usleep is declared even after undefining macros. */
++#define HAVE_RAW_DECL_USLEEP 1
++
++/* Define to 1 if utimensat is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_UTIMENSAT */
++
++/* Define to 1 if vdprintf is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_VDPRINTF */
++
++/* Define to 1 if vsnprintf is declared even after undefining macros. */
++#define HAVE_RAW_DECL_VSNPRINTF 1
++
++/* Define to 1 if wcpcpy is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_WCPCPY */
++
++/* Define to 1 if wcpncpy is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_WCPNCPY */
++
++/* Define to 1 if wcrtomb is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCRTOMB 1
++
++/* Define to 1 if wcscasecmp is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_WCSCASECMP */
++
++/* Define to 1 if wcscat is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSCAT 1
++
++/* Define to 1 if wcschr is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSCHR 1
++
++/* Define to 1 if wcscmp is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSCMP 1
++
++/* Define to 1 if wcscoll is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSCOLL 1
++
++/* Define to 1 if wcscpy is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSCPY 1
++
++/* Define to 1 if wcscspn is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSCSPN 1
++
++/* Define to 1 if wcsdup is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSDUP 1
++
++/* Define to 1 if wcslen is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSLEN 1
++
++/* Define to 1 if wcsncasecmp is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_WCSNCASECMP */
++
++/* Define to 1 if wcsncat is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSNCAT 1
++
++/* Define to 1 if wcsncmp is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSNCMP 1
++
++/* Define to 1 if wcsncpy is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSNCPY 1
++
++/* Define to 1 if wcsnlen is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSNLEN 1
++
++/* Define to 1 if wcsnrtombs is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_WCSNRTOMBS */
++
++/* Define to 1 if wcspbrk is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSPBRK 1
++
++/* Define to 1 if wcsrchr is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSRCHR 1
++
++/* Define to 1 if wcsrtombs is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSRTOMBS 1
++
++/* Define to 1 if wcsspn is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSSPN 1
++
++/* Define to 1 if wcsstr is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSSTR 1
++
++/* Define to 1 if wcstok is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSTOK 1
++
++/* Define to 1 if wcswidth is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_WCSWIDTH */
++
++/* Define to 1 if wcsxfrm is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCSXFRM 1
++
++/* Define to 1 if wctob is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WCTOB 1
++
++/* Define to 1 if wcwidth is declared even after undefining macros. */
++/* #undef HAVE_RAW_DECL_WCWIDTH */
++
++/* Define to 1 if wmemchr is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WMEMCHR 1
++
++/* Define to 1 if wmemcmp is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WMEMCMP 1
++
++/* Define to 1 if wmemcpy is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WMEMCPY 1
++
++/* Define to 1 if wmemmove is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WMEMMOVE 1
++
++/* Define to 1 if wmemset is declared even after undefining macros. */
++#define HAVE_RAW_DECL_WMEMSET 1
++
++/* Define to 1 if _Exit is declared even after undefining macros. */
++#define HAVE_RAW_DECL__EXIT 1
++
++/* Define if the 'realloc' function is POSIX compliant. */
++/* #undef HAVE_REALLOC_POSIX */
++
++/* Define this if we have a functional realpath(3C) */
++/* #undef HAVE_REALPATH */
++
++/* Define to 1 if you have the <runetype.h> header file. */
++/* #undef HAVE_RUNETYPE_H */
++
++/* Define to 1 if the system has the type `sa_family_t'. */
++/* #undef HAVE_SA_FAMILY_T */
++
++/* Define to 1 if you have the `scm_gc_malloc_pointerless' function. */
++/* #undef HAVE_SCM_GC_MALLOC_POINTERLESS */
++
++/* Define to 1 if you have the <search.h> header file. */
++#define HAVE_SEARCH_H 1
++
++/* Define to 1 if you have the `secure_getenv' function. */
++/* #undef HAVE_SECURE_GETENV */
++
++/* Define to 1 if you have the `setdtablesize' function. */
++/* #undef HAVE_SETDTABLESIZE */
++
++/* Define to 1 if you have the `setenv' function. */
++/* #undef HAVE_SETENV */
++
++/* Define to 1 if you have the `setitimer' function. */
++/* #undef HAVE_SETITIMER */
++
++/* Define to 1 if you have the <setjmp.h> header file. */
++/* #undef HAVE_SETJMP_H */
++
++/* Define to 1 if you have the `shutdown' function. */
++/* #undef HAVE_SHUTDOWN */
++
++/* Define to 1 if 'sig_atomic_t' is a signed integer type. */
++/* #undef HAVE_SIGNED_SIG_ATOMIC_T */
++
++/* Define to 1 if 'wchar_t' is a signed integer type. */
++/* #undef HAVE_SIGNED_WCHAR_T */
++
++/* Define to 1 if 'wint_t' is a signed integer type. */
++/* #undef HAVE_SIGNED_WINT_T */
++
++/* Define to 1 if the system has the type `sigset_t'. */
++/* #undef HAVE_SIGSET_T */
++
++/* Define to 1 if the system has the type `size_t'. */
++#define HAVE_SIZE_T 1
++
++/* Define to 1 if you have the `sleep' function. */
++#define HAVE_SLEEP 1
++
++/* Define to 1 if you have the `snprintf' function. */
++#define HAVE_SNPRINTF 1
++
++/* Define if the return value of the snprintf function is the number of of
++   bytes (excluding the terminating NUL) that would have been produced if the
++   buffer had been large enough. */
++#define HAVE_SNPRINTF_RETVAL_C99 1
++
++/* Define to 1 if you have the <stdarg.h> header file. */
++#define HAVE_STDARG_H 1
++
++/* Define to 1 if you have the <stdatomic.h> header file. */
++/* #undef HAVE_STDATOMIC_H */
++
++/* Define to 1 if you have the <stdbool.h> header file. */
++#define HAVE_STDBOOL_H 1
++
++/* Define to 1 if you have the <stdint.h> header file. */
++#define HAVE_STDINT_H 1
++
++/* Define if <stdint.h> exists, doesn't clash with <sys/types.h>, and declares
++   uintmax_t. */
++#define HAVE_STDINT_H_WITH_UINTMAX 1
++
++/* Define to 1 if you have the <stdio_ext.h> header file. */
++/* #undef HAVE_STDIO_EXT_H */
++
++/* Define to 1 if you have the <stdlib.h> header file. */
++#define HAVE_STDLIB_H 1
++
++/* Define to 1 if you have the `strcasecmp' function. */
++#define HAVE_STRCASECMP 1
++
++/* Define to 1 if you have the `strchr' function. */
++#define HAVE_STRCHR 1
++
++/* Define to 1 if you have the `strdup' function. */
++#define HAVE_STRDUP 1
++
++/* Define to 1 if you have the `strerror_r' function. */
++/* #undef HAVE_STRERROR_R */
++
++/* Define this if strftime() works */
++/* #undef HAVE_STRFTIME */
++
++/* Define to 1 if you have the <strings.h> header file. */
++#define HAVE_STRINGS_H 1
++
++/* Define to 1 if you have the <string.h> header file. */
++#define HAVE_STRING_H 1
++
++/* Define to 1 if you have the `strncasecmp' function. */
++#define HAVE_STRNCASECMP 1
++
++/* Define to 1 if you have the `strndup' function. */
++/* #undef HAVE_STRNDUP */
++
++/* Define to 1 if you have the `strnlen' function. */
++#define HAVE_STRNLEN 1
++
++/* Define to 1 if you have the `strrchr' function. */
++/* #undef HAVE_STRRCHR */
++
++/* Define to 1 if you have the `strsignal' function. */
++/* #undef HAVE_STRSIGNAL */
++
++/* Define to 1 if you have the `strtok_r' function. */
++/* #undef HAVE_STRTOK_R */
++
++/* Define to 1 if the system has the type `struct addrinfo'. */
++#define HAVE_STRUCT_ADDRINFO 1
++
++/* Define to 1 if `iov_basea' is a member of `struct iovec'. */
++/* #undef HAVE_STRUCT_IOVEC_IOV_BASEA */
++
++/* Define to 1 if `sa_len' is a member of `struct sockaddr'. */
++/* #undef HAVE_STRUCT_SOCKADDR_SA_LEN */
++
++/* Define to 1 if the system has the type `struct sockaddr_storage'. */
++#define HAVE_STRUCT_SOCKADDR_STORAGE 1
++
++/* Define to 1 if `ss_family' is a member of `struct sockaddr_storage'. */
++#define HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY 1
++
++/* Define to 1 if `tm_zone' is a member of `struct tm'. */
++/* #undef HAVE_STRUCT_TM_TM_ZONE */
++
++/* Define to 1 if you have the `strverscmp' function. */
++/* #undef HAVE_STRVERSCMP */
++
++/* Define to 1 if you have the `symlink' function. */
++/* #undef HAVE_SYMLINK */
++
++/* Define to 1 if you have the <sysexits.h> header file. */
++/* #undef HAVE_SYSEXITS_H */
++
++/* Define to 1 if you have the <sys/bitypes.h> header file. */
++/* #undef HAVE_SYS_BITYPES_H */
++
++/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
++   */
++/* #undef HAVE_SYS_DIR_H */
++
++/* Define to 1 if you have the <sys/inttypes.h> header file. */
++/* #undef HAVE_SYS_INTTYPES_H */
++
++/* Define to 1 if you have the <sys/limits.h> header file. */
++/* #undef HAVE_SYS_LIMITS_H */
++
++/* Define to 1 if you have the <sys/mman.h> header file. */
++/* #undef HAVE_SYS_MMAN_H */
++
++/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
++   */
++/* #undef HAVE_SYS_NDIR_H */
++
++/* Define to 1 if you have the <sys/param.h> header file. */
++/* #undef HAVE_SYS_PARAM_H */
++
++/* Define to 1 if you have the <sys/poll.h> header file. */
++/* #undef HAVE_SYS_POLL_H */
++
++/* Define to 1 if you have the <sys/procset.h> header file. */
++/* #undef HAVE_SYS_PROCSET_H */
++
++/* Define to 1 if you have the <sys/select.h> header file. */
++/* #undef HAVE_SYS_SELECT_H */
++
++/* Define to 1 if you have the <sys/socket.h> header file. */
++/* #undef HAVE_SYS_SOCKET_H */
++
++/* Define to 1 if you have the <sys/stat.h> header file. */
++#define HAVE_SYS_STAT_H 1
++
++/* Define to 1 if you have the <sys/stropts.h> header file. */
++/* #undef HAVE_SYS_STROPTS_H */
++
++/* Define to 1 if you have the <sys/timeb.h> header file. */
++/* #undef HAVE_SYS_TIMEB_H */
++
++/* Define to 1 if you have the <sys/time.h> header file. */
++#define HAVE_SYS_TIME_H 1
++
++/* Define to 1 if you have the <sys/types.h> header file. */
++#define HAVE_SYS_TYPES_H 1
++
++/* Define to 1 if you have the <sys/uio.h> header file. */
++/* #undef HAVE_SYS_UIO_H */
++
++/* Define to 1 if you have the <sys/un.h> header file. */
++/* #undef HAVE_SYS_UN_H */
++
++/* Define to 1 if you have the <sys/wait.h> header file. */
++/* #undef HAVE_SYS_WAIT_H */
++
++/* Define to 1 if you have the `tcgetattr' function. */
++/* #undef HAVE_TCGETATTR */
++
++/* Define to 1 if you have the `tcsetattr' function. */
++/* #undef HAVE_TCSETATTR */
++
++/* Define to 1 if you have the <termios.h> header file. */
++/* #undef HAVE_TERMIOS_H */
++
++/* Define to 1 if you have the `timegm' function. */
++#define HAVE_TIMEGM 1
++
++/* Define to 1 if the system has the type `timezone_t'. */
++/* #undef HAVE_TIMEZONE_T */
++
++/* Define if struct tm has the tm_gmtoff member. */
++/* #undef HAVE_TM_GMTOFF */
++
++/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use
++   `HAVE_STRUCT_TM_TM_ZONE' instead. */
++/* #undef HAVE_TM_ZONE */
++
++/* Enable TPM */
++/* #undef HAVE_TROUSERS */
++
++/* Define to 1 if you have the `tsearch' function. */
++#define HAVE_TSEARCH 1
++
++/* Define to 1 if you don't have `tm_zone' but do have the external array
++   `tzname'. */
++#define HAVE_TZNAME 1
++
++/* Define to 1 if you have the `tzset' function. */
++#define HAVE_TZSET 1
++
++/* Define to 1 if the system has the type `uint16_t'. */
++#define HAVE_UINT16_T 1
++
++/* Define to 1 if the system has the type `uint32_t'. */
++#define HAVE_UINT32_T 1
++
++/* Define to 1 if the system has the type `uint8_t'. */
++#define HAVE_UINT8_T 1
++
++/* Define to 1 if the system has the type `uintptr_t'. */
++#define HAVE_UINTPTR_T 1
++
++/* Define to 1 if the system has the type `uint_t'. */
++#define HAVE_UINT_T 1
++
++/* Define to 1 if you have the <unistd.h> header file. */
++#define HAVE_UNISTD_H 1
++
++/* Define to 1 if you have the `unsetenv' function. */
++/* #undef HAVE_UNSETENV */
++
++/* Define to 1 if the system has the type 'unsigned long long int'. */
++#define HAVE_UNSIGNED_LONG_LONG_INT 1
++
++/* Define to 1 if you have the <utime.h> header file. */
++/* #undef HAVE_UTIME_H */
++
++/* Define to 1 if you have the <values.h> header file. */
++/* #undef HAVE_VALUES_H */
++
++/* Define to 1 if you have the <varargs.h> header file. */
++/* #undef HAVE_VARARGS_H */
++
++/* Define if you have a global __progname variable */
++/* #undef HAVE_VAR___PROGNAME */
++
++/* Define to 1 if you have the `vasnprintf' function. */
++/* #undef HAVE_VASNPRINTF */
++
++/* Define to 1 if you have the `vasprintf' function. */
++#define HAVE_VASPRINTF 1
++
++/* Have va_copy() */
++/* #undef HAVE_VA_COPY */
++
++/* Define to 1 if you have the `vfork' function. */
++/* #undef HAVE_VFORK */
++
++/* Define to 1 if you have the <vfork.h> header file. */
++/* #undef HAVE_VFORK_H */
++
++/* Define to 1 if you have the `vprintf' function. */
++/* #undef HAVE_VPRINTF */
++
++/* Define to 1 if you have the `vsnprintf' function. */
++#define HAVE_VSNPRINTF 1
++
++/* Define to 1 if you have the <wchar.h> header file. */
++#define HAVE_WCHAR_H 1
++
++/* Define to 1 if the system has the type `wchar_t'. */
++#define HAVE_WCHAR_T 1
++
++/* Define to 1 if you have the `wcrtomb' function. */
++#define HAVE_WCRTOMB 1
++
++/* Define to 1 if you have the `wcslen' function. */
++#define HAVE_WCSLEN 1
++
++/* Define to 1 if you have the `wcsnlen' function. */
++#define HAVE_WCSNLEN 1
++
++/* Define to 1 if you have the <winsock2.h> header file. */
++#define HAVE_WINSOCK2_H 1
++
++/* Define to 1 if the system has the type `wint_t'. */
++#define HAVE_WINT_T 1
++
++/* Define to 1 if `fork' works. */
++/* #undef HAVE_WORKING_FORK */
++
++/* Define to 1 if O_NOATIME works. */
++#define HAVE_WORKING_O_NOATIME 0
++
++/* Define to 1 if O_NOFOLLOW works. */
++#define HAVE_WORKING_O_NOFOLLOW 0
++
++/* Define to 1 if `vfork' works. */
++/* #undef HAVE_WORKING_VFORK */
++
++/* Define to 1 if you have the <ws2tcpip.h> header file. */
++#define HAVE_WS2TCPIP_H 1
++
++/* Define to 1 if the system has the type `_Bool'. */
++#define HAVE__BOOL 1
++
++/* Define to 1 if you have the `_fseeki64' function. */
++#define HAVE__FSEEKI64 1
++
++/* Define to 1 if you have the `_ftelli64' function. */
++#define HAVE__FTELLI64 1
++
++/* Define to 1 if you have the `_ftime' function. */
++#define HAVE__FTIME 1
++
++/* Define to 1 if you have the `_set_invalid_parameter_handler' function. */
++#define HAVE__SET_INVALID_PARAMETER_HANDLER 1
++
++/* Define to 1 if you have the `__fsetlocking' function. */
++/* #undef HAVE___FSETLOCKING */
++
++/* Define to 1 if you have the `__register_atfork' function. */
++/* #undef HAVE___REGISTER_ATFORK */
++
++/* Define to 1 if you have the `__secure_getenv' function. */
++/* #undef HAVE___SECURE_GETENV */
++
++/* Have __va_copy() */
++/* #undef HAVE___VA_COPY */
++
++/* Define to 1 if lseek does not detect pipes. */
++#define LSEEK_PIPE_BROKEN 1
++
++/* Define to the sub-directory where libtool stores uninstalled libraries. */
++#define LT_OBJDIR ".libs/"
++
++/* If malloc(0) is != NULL, define this to 1. Otherwise define this to 0. */
++#define MALLOC_0_IS_NONNULL 1
++
++/* Define to a substitute value for mmap()'s MAP_ANONYMOUS flag. */
++/* #undef MAP_ANONYMOUS */
++
++/* Define this if optional arguments are disallowed */
++/* #undef NO_OPTIONAL_OPT_ARGS */
++
++/* no ssize_t type was found */
++/* #undef NO_SSIZE_T */
++
++/* Name of package */
++#define PACKAGE "gnutls"
++
++/* Define to the address where bug reports for this package should be sent. */
++#define PACKAGE_BUGREPORT "bugs@gnutls.org"
++
++/* Define to the full name of this package. */
++#define PACKAGE_NAME "GnuTLS"
++
++/* Define to the full name and version of this package. */
++#define PACKAGE_STRING "GnuTLS 3.6.7"
++
++/* Define to the one symbol short name of this package. */
++#define PACKAGE_TARNAME "gnutls"
++
++/* Define to the home page for this package. */
++#define PACKAGE_URL ""
++
++/* Define to the version of this package. */
++#define PACKAGE_VERSION "3.6.7"
++
++/* define to a working POSIX compliant shell */
++#define POSIX_SHELL "/bin/bash"
++
++/* Define if <inttypes.h> exists and defines unusable PRI* macros. */
++/* #undef PRI_MACROS_BROKEN */
++
++/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
++   'ptrdiff_t'. */
++/* #undef PTRDIFF_T_SUFFIX */
++
++/* name of regex header file */
++/* #undef REGEX_HEADER */
++
++/* Define to 1 if strerror(0) does not return a message implying success. */
++/* #undef REPLACE_STRERROR_0 */
++
++/* Define if vasnprintf exists but is overridden by gnulib. */
++/* #undef REPLACE_VASNPRINTF */
++
++/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
++   'sig_atomic_t'. */
++/* #undef SIG_ATOMIC_T_SUFFIX */
++
++/* The size of `char*', as computed by sizeof. */
++#if defined(__x86_64) || defined(_M_X64)
++#define SIZEOF_CHARP 8
++#else
++#define SIZEOF_CHARP 4
++#endif
++
++/* The size of `int', as computed by sizeof. */
++#define SIZEOF_INT 4
++
++/* The size of `long', as computed by sizeof. */
++#define SIZEOF_LONG 4
++
++/* The size of `long long', as computed by sizeof. */
++#define SIZEOF_LONG_LONG 8
++
++/* The size of `short', as computed by sizeof. */
++#define SIZEOF_SHORT 2
++
++/* The size of `unsigned int', as computed by sizeof. */
++#define SIZEOF_UNSIGNED_INT 4
++
++/* The size of `unsigned long int', as computed by sizeof. */
++#define SIZEOF_UNSIGNED_LONG_INT 4
++
++/* The size of `void *', as computed by sizeof. */
++#if defined(__x86_64) || defined(_M_X64)
++#define SIZEOF_VOID_P 8
++#else
++#define SIZEOF_VOID_P 4
++#endif
++
++/* Define as the maximum value of type 'size_t', if the system doesn't define
++   it. */
++#ifndef SIZE_MAX
++/* # undef SIZE_MAX */
++#endif
++
++/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
++   'size_t'. */
++/* #undef SIZE_T_SUFFIX */
++
++/* If using the C implementation of alloca, define if you know the
++   direction of stack growth for your system; otherwise it will be
++   automatically deduced at runtime.
++	STACK_DIRECTION > 0 => grows toward higher addresses
++	STACK_DIRECTION < 0 => grows toward lower addresses
++	STACK_DIRECTION = 0 => direction of growth unknown */
++/* #undef STACK_DIRECTION */
++
++/* Define to 1 if the `S_IS*' macros in <sys/stat.h> do not work properly. */
++/* #undef STAT_MACROS_BROKEN */
++
++/* Define to 1 if you have the ANSI C header files. */
++#define STDC_HEADERS 1
++
++/* Define to 1 if strerror_r returns char *. */
++/* #undef STRERROR_R_CHAR_P */
++
++/* The system priority file */
++#define SYSTEM_PRIORITY_FILE "/etc/gnutls/default-priorities"
++
++/* Define to 1 if all 'time_t' values fit in a 'long int'. */
++/* #undef TIME_T_FITS_IN_LONG_INT */
++
++/* Define to 1 if time_t is signed. */
++#define TIME_T_IS_SIGNED 1
++
++/* Define to 1 if your <sys/time.h> declares `struct tm'. */
++/* #undef TM_IN_SYS_TIME */
++
++/* the location of the trousers library */
++#define TROUSERS_LIB ""
++
++/* The DNSSEC root key file */
++#define UNBOUND_ROOT_KEY_FILE "C:\Program Files\Unbound\root.key"
++
++/* Enable extensions on AIX 3, Interix.  */
++#ifndef _ALL_SOURCE
++# define _ALL_SOURCE 1
++#endif
++/* Enable general extensions on macOS.  */
++#ifndef _DARWIN_C_SOURCE
++# define _DARWIN_C_SOURCE 1
++#endif
++/* Enable GNU extensions on systems that have them.  */
++#ifndef _GNU_SOURCE
++# define _GNU_SOURCE 1
++#endif
++/* Use GNU style printf and scanf.  */
++#ifndef __USE_MINGW_ANSI_STDIO
++# define __USE_MINGW_ANSI_STDIO 1
++#endif
++/* Enable threading extensions on Solaris.  */
++#ifndef _POSIX_PTHREAD_SEMANTICS
++# define _POSIX_PTHREAD_SEMANTICS 1
++#endif
++/* Enable extensions on HP NonStop.  */
++#ifndef _TANDEM_SOURCE
++# define _TANDEM_SOURCE 1
++#endif
++/* Enable X/Open extensions if necessary.  HP-UX 11.11 defines
++   mbstate_t only if _XOPEN_SOURCE is defined to 500, regardless of
++   whether compiling with -Ae or -D_HPUX_SOURCE=1.  */
++#ifndef _XOPEN_SOURCE
++/* # undef _XOPEN_SOURCE */
++#endif
++/* Enable general extensions on Solaris.  */
++#ifndef __EXTENSIONS__
++# define __EXTENSIONS__ 1
++#endif
++
++#include "version.h"
++
++/* Define to 1 if unsetenv returns void instead of int. */
++/* #undef VOID_UNSETENV */
++
++/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
++   'wchar_t'. */
++/* #undef WCHAR_T_SUFFIX */
++
++/* Define if WSAStartup is needed. */
++#define WINDOWS_SOCKETS 1
++
++/* Define to l, ll, u, ul, ull, etc., as suitable for constants of type
++   'wint_t'. */
++/* #undef WINT_T_SUFFIX */
++
++/* Define this if a working libregex can be found */
++/* #undef WITH_LIBREGEX */
++
++/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
++   significant byte first (like Motorola and SPARC, unlike Intel). */
++#if defined AC_APPLE_UNIVERSAL_BUILD
++# if defined __BIG_ENDIAN__
++#  define WORDS_BIGENDIAN 1
++# endif
++#else
++# ifndef WORDS_BIGENDIAN
++/* #  undef WORDS_BIGENDIAN */
++# endif
++#endif
++
++/* Enable large inode numbers on Mac OS X 10.5. */
++#define _DARWIN_USE_64_BIT_INODE 1
++
++/* Number of bits in a file offset, on hosts where this is settable. */
++#define _FILE_OFFSET_BITS 64
++
++/* Define to 1 if Gnulib overrides 'struct stat' on Windows so that struct
++   stat.st_size becomes 64-bit. */
++#define _GL_WINDOWS_64_BIT_ST_SIZE 1
++
++/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */
++/* #undef _LARGEFILE_SOURCE */
++
++/* Define for large files, on AIX-style hosts. */
++/* #undef _LARGE_FILES */
++
++/* Define to 1 if on MINIX. */
++/* #undef _MINIX */
++
++/* Define to 1 to make NetBSD features available. MINIX 3 needs this. */
++/* #undef _NETBSD_SOURCE */
++
++/* The _Noreturn keyword of C11.  */
++#if ! (defined _Noreturn \
++       || (defined __STDC_VERSION__ && 201112 <= __STDC_VERSION__))
++# if (3 <= __GNUC__ || (__GNUC__ == 2 && 8 <= __GNUC_MINOR__) \
++      || 0x5110 <= __SUNPRO_C)
++#  define _Noreturn __attribute__ ((__noreturn__))
++# elif defined _MSC_VER && 1200 <= _MSC_VER
++#  define _Noreturn __declspec (noreturn)
++# else
++#  define _Noreturn
++# endif
++#endif
++
++/* Define to 2 if the system does not provide POSIX.1 features except with
++   this defined. */
++/* #undef _POSIX_1_SOURCE */
++
++/* Define to 1 in order to get the POSIX compatible declarations of socket
++   functions. */
++/* #undef _POSIX_PII_SOCKET */
++
++/* Define to 1 if you need to in order for 'stat' and other things to work. */
++/* #undef _POSIX_SOURCE */
++
++/* Define to 1 if the system <stdint.h> predates C++11. */
++/* #undef __STDC_CONSTANT_MACROS */
++
++/* Define to 1 if the system <stdint.h> predates C++11. */
++/* #undef __STDC_LIMIT_MACROS */
++
++/* Define as a replacement for the ISO C99 __func__ variable. */
++/* #undef __func__ */
++
++/* Please see the Gnulib manual for how to use these macros.
++
++   Suppress extern inline with HP-UX cc, as it appears to be broken; see
++   <http://lists.gnu.org/archive/html/bug-texinfo/2013-02/msg00030.html>.
++
++   Suppress extern inline with Sun C in standards-conformance mode, as it
++   mishandles inline functions that call each other.  E.g., for 'inline void f
++   (void) { } inline void g (void) { f (); }', c99 incorrectly complains
++   'reference to static identifier "f" in extern inline function'.
++   This bug was observed with Sun C 5.12 SunOS_i386 2011/11/16.
++
++   Suppress the use of extern inline on problematic Apple configurations.
++   OS X 10.8 and earlier mishandle it; see, e.g.,
++   <http://lists.gnu.org/archive/html/bug-gnulib/2012-12/msg00023.html>.
++   OS X 10.9 has a macro __header_inline indicating the bug is fixed for C and
++   for clang but remains for g++; see <http://trac.macports.org/ticket/41033>.
++   Perhaps Apple will fix this some day.  */
++#if (defined __APPLE__ \
++     && (defined __header_inline \
++         ? (defined __cplusplus && defined __GNUC_STDC_INLINE__ \
++            && ! defined __clang__) \
++         : ((! defined _DONT_USE_CTYPE_INLINE_ \
++             && (defined __GNUC__ || defined __cplusplus)) \
++            || (defined _FORTIFY_SOURCE && 0 < _FORTIFY_SOURCE \
++                && defined __GNUC__ && ! defined __cplusplus))))
++# define _GL_EXTERN_INLINE_APPLE_BUG
++#endif
++#if ((__GNUC__ \
++      ? defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__ \
++      : (199901L <= __STDC_VERSION__ \
++         && !defined __HP_cc \
++         && !(defined __SUNPRO_C && __STDC__))) \
++     && !defined _GL_EXTERN_INLINE_APPLE_BUG)
++# define _GL_INLINE inline
++# define _GL_EXTERN_INLINE extern inline
++# define _GL_EXTERN_INLINE_IN_USE
++#elif (2 < __GNUC__ + (7 <= __GNUC_MINOR__) && !defined __STRICT_ANSI__ \
++       && !defined _GL_EXTERN_INLINE_APPLE_BUG)
++# if defined __GNUC_GNU_INLINE__ && __GNUC_GNU_INLINE__
++   /* __gnu_inline__ suppresses a GCC 4.2 diagnostic.  */
++#  define _GL_INLINE extern inline __attribute__ ((__gnu_inline__))
++# else
++#  define _GL_INLINE extern inline
++# endif
++# define _GL_EXTERN_INLINE extern
++# define _GL_EXTERN_INLINE_IN_USE
++#else
++# define _GL_INLINE static _GL_UNUSED
++# define _GL_EXTERN_INLINE static _GL_UNUSED
++#endif
++
++#if 4 < __GNUC__ + (6 <= __GNUC_MINOR__)
++# if defined __GNUC_STDC_INLINE__ && __GNUC_STDC_INLINE__
++#  define _GL_INLINE_HEADER_CONST_PRAGMA
++# else
++#  define _GL_INLINE_HEADER_CONST_PRAGMA \
++     _Pragma ("GCC diagnostic ignored \"-Wsuggest-attribute=const\"")
++# endif
++  /* Suppress GCC's bogus "no previous prototype for 'FOO'"
++     and "no previous declaration for 'FOO'"  diagnostics,
++     when FOO is an inline function in the header; see
++     <http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54113>.  */
++# define _GL_INLINE_HEADER_BEGIN \
++    _Pragma ("GCC diagnostic push") \
++    _Pragma ("GCC diagnostic ignored \"-Wmissing-prototypes\"") \
++    _Pragma ("GCC diagnostic ignored \"-Wmissing-declarations\"") \
++    _GL_INLINE_HEADER_CONST_PRAGMA
++# define _GL_INLINE_HEADER_END \
++    _Pragma ("GCC diagnostic pop")
++#else
++# define _GL_INLINE_HEADER_BEGIN
++# define _GL_INLINE_HEADER_END
++#endif
++
++/* static lib rename */
++#define fread_file _gnutls_fread_file
++
++/* Define to `int' if <sys/types.h> doesn't define. */
++#define gid_t int
++
++/* Define to `__inline__' or `__inline' if that's what the C compiler
++   calls it, or to nothing if 'inline' is not supported under any name.  */
++#ifndef __cplusplus
++/* #undef inline */
++#endif
++
++/* Define to long or long long if <stdint.h> and <inttypes.h> don't define. */
++/* #undef intmax_t */
++
++/* Work around a bug in Apple GCC 4.0.1 build 5465: In C99 mode, it supports
++   the ISO C 99 semantics of 'extern inline' (unlike the GNU C semantics of
++   earlier versions), but does not display it by setting __GNUC_STDC_INLINE__.
++   __APPLE__ && __MACH__ test for Mac OS X.
++   __APPLE_CC__ tests for the Apple compiler and its version.
++   __STDC_VERSION__ tests for the C99 mode.  */
++#if defined __APPLE__ && defined __MACH__ && __APPLE_CC__ >= 5465 && !defined __cplusplus && __STDC_VERSION__ >= 199901L && !defined __GNUC_STDC_INLINE__
++# define __GNUC_STDC_INLINE__ 1
++#endif
++
++/* Define to the real name of the mktime_internal function. */
++/* #undef mktime_internal */
++
++/* Define to `int' if <sys/types.h> does not define. */
++/* #undef mode_t */
++
++/* Define to the name of the strftime replacement function. */
++#define my_strftime nstrftime
++
++/* Define to the type of st_nlink in struct stat, or a supertype. */
++#define nlink_t int
++
++/* Define to `int' if <sys/types.h> does not define. */
++/* #undef pid_t */
++
++/* Define as the type of the result of subtracting two pointers, if the system
++   doesn't define it. */
++/* #undef ptrdiff_t */
++
++/* static lib rename */
++#define read_binary_file _gnutls_read_binary_file
++
++/* static lib rename */
++#define read_file _gnutls_read_file
++
++/* Define to the equivalent of the C99 'restrict' keyword, or to
++   nothing if this is not supported.  Do not define if restrict is
++   supported directly.  */
++#define restrict //__restrict
++/* Work around a bug in Sun C++: it does not support _Restrict or
++   __restrict__, even though the corresponding Sun C compiler ends up with
++   "#define restrict _Restrict" or "#define restrict __restrict__" in the
++   previous line.  Perhaps some future version of Sun C++ will work with
++   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */
++#if defined __SUNPRO_CC && !defined __RESTRICT
++# define _Restrict
++# define __restrict__
++#endif
++
++/* Define to `unsigned int' if <sys/types.h> does not define. */
++/* #undef size_t */
++
++/* type to use in place of socklen_t if not defined */
++/* #undef socklen_t */
++
++/* Define as a signed type of the same size as size_t. */
++/* #undef ssize_t */
++
++/* Define to `int' if <sys/types.h> doesn't define. */
++#define uid_t int
++
++/* Define as a marker that can be attached to declarations that might not
++    be used.  This helps to reduce warnings, such as from
++    GCC -Wunused-parameter.  */
++#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
++# define _GL_UNUSED __attribute__ ((__unused__))
++#else
++# define _GL_UNUSED
++#endif
++/* The name _UNUSED_PARAMETER_ is an earlier spelling, although the name
++   is a misnomer outside of parameter lists.  */
++#define _UNUSED_PARAMETER_ _GL_UNUSED
++
++/* gcc supports the "unused" attribute on possibly unused labels, and
++   g++ has since version 4.5.  Note to support C++ as well as C,
++   _GL_UNUSED_LABEL should be used with a trailing ;  */
++#if !defined __cplusplus || __GNUC__ > 4 \
++    || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
++# define _GL_UNUSED_LABEL _GL_UNUSED
++#else
++# define _GL_UNUSED_LABEL
++#endif
++
++/* The __pure__ attribute was added in gcc 2.96.  */
++#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
++# define _GL_ATTRIBUTE_PURE __attribute__ ((__pure__))
++#else
++# define _GL_ATTRIBUTE_PURE /* empty */
++#endif
++
++/* The __const__ attribute was added in gcc 2.95.  */
++#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
++# define _GL_ATTRIBUTE_CONST __attribute__ ((__const__))
++#else
++# define _GL_ATTRIBUTE_CONST /* empty */
++#endif
++
++/* Define as `fork' if `vfork' does not work. */
++/* #undef vfork */
+diff --git a/SMP/dirent.h b/SMP/dirent.h
+new file mode 100644
+index 0000000..5fc402e
+--- /dev/null
++++ b/SMP/dirent.h
+@@ -0,0 +1,757 @@
++/*
++* MSVC dirent.h compatibility header.
++*
++* Permission is hereby granted, free of charge, to any person obtaining a copy
++* of this software and associated documentation files (the "Software"), to deal
++* in the Software without restriction, including without limitation the rights
++* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++* copies of the Software, and to permit persons to whom the Software is
++* furnished to do so, subject to the following conditions:
++*
++* The above copyright notice and this permission notice shall be included in
++* all copies or substantial portions of the Software.
++*
++* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++* THE SOFTWARE.
++*/
++
++#ifndef SMP_DIRENT_H
++#define SMP_DIRENT_H
++
++#ifndef _MSC_VER
++#   include_next <dirent.h>
++#else
++
++#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && defined(_M_IX86)
++#   define _X86_
++#endif
++#include <stdio.h>
++#include <stdarg.h>
++#include <wtypes.h>
++#include <windef.h>
++#include <winbase.h>
++#include <wchar.h>
++#include <string.h>
++#include <stdlib.h>
++#include <malloc.h>
++#include <sys/types.h>
++#include <sys/stat.h>
++#include <errno.h>
++
++/* Indicates that d_type field is available in dirent structure */
++#define _DIRENT_HAVE_D_TYPE
++
++/* Indicates that d_namlen field is available in dirent structure */
++#define _DIRENT_HAVE_D_NAMLEN
++
++/* Entries missing from MSVC 6.0 */
++#if !defined(FILE_ATTRIBUTE_DEVICE)
++#   define FILE_ATTRIBUTE_DEVICE 0x40
++#endif
++
++/* File type and permission flags for stat() */
++#if !defined(S_IFMT)
++#   define S_IFMT   _S_IFMT                     /* File type mask */
++#endif
++#if !defined(S_IFDIR)
++#   define S_IFDIR  _S_IFDIR                    /* Directory */
++#endif
++#if !defined(S_IFCHR)
++#   define S_IFCHR  _S_IFCHR                    /* Character device */
++#endif
++#if !defined(S_IFFIFO)
++#   define S_IFFIFO _S_IFFIFO                   /* Pipe */
++#endif
++#if !defined(S_IFREG)
++#   define S_IFREG  _S_IFREG                    /* Regular file */
++#endif
++#if !defined(S_IREAD)
++#   define S_IREAD  _S_IREAD                    /* Read permission */
++#endif
++#if !defined(S_IWRITE)
++#   define S_IWRITE _S_IWRITE                   /* Write permission */
++#endif
++#if !defined(S_IEXEC)
++#   define S_IEXEC  _S_IEXEC                    /* Execute permission */
++#endif
++#if !defined(S_IFIFO)
++#   define S_IFIFO _S_IFIFO                     /* Pipe */
++#endif
++#if !defined(S_IFBLK)
++#   define S_IFBLK   0                          /* Block device */
++#endif
++#if !defined(S_IFLNK)
++#   define S_IFLNK   0                          /* Link */
++#endif
++#if !defined(S_IFSOCK)
++#   define S_IFSOCK  0                          /* Socket */
++#endif
++
++#if defined(_MSC_VER)
++#if !defined(S_IRUSR)
++#   define S_IRUSR  S_IREAD                     /* Read user */
++#endif
++#if !defined(S_IWUSR)
++#   define S_IWUSR  S_IWRITE                    /* Write user */
++#endif
++#if !defined(S_IXUSR)
++#   define S_IXUSR  0                           /* Execute user */
++#endif
++#if !defined(S_IRGRP)
++#   define S_IRGRP  0                           /* Read group */
++#endif
++#if !defined(S_IWGRP)
++#   define S_IWGRP  0                           /* Write group */
++#endif
++#if !defined(S_IXGRP)
++#   define S_IXGRP  0                           /* Execute group */
++#endif
++#if !defined(S_IROTH)
++#   define S_IROTH  0                           /* Read others */
++#endif
++#if !defined(S_IWOTH)
++#   define S_IWOTH  0                           /* Write others */
++#endif
++#if !defined(S_IXOTH)
++#   define S_IXOTH  0                           /* Execute others */
++#endif
++#endif
++
++/* Maximum length of file name */
++#if !defined(PATH_MAX)
++#   define PATH_MAX MAX_PATH
++#endif
++#if !defined(FILENAME_MAX)
++#   define FILENAME_MAX MAX_PATH
++#endif
++#if !defined(NAME_MAX)
++#   define NAME_MAX FILENAME_MAX
++#endif
++
++/* File type flags for d_type */
++#define DT_UNKNOWN  0
++#define DT_REG      S_IFREG
++#define DT_DIR      S_IFDIR
++#define DT_FIFO     S_IFIFO
++#define DT_SOCK     S_IFSOCK
++#define DT_CHR      S_IFCHR
++#define DT_BLK      S_IFBLK
++#define DT_LNK      S_IFLNK
++
++/* Macros for converting between st_mode and d_type */
++#define IFTODT(mode) ((mode) & S_IFMT)
++#define DTTOIF(type) (type)
++
++/*
++ * File type macros.  Note that block devices, sockets and links cannot be
++ * distinguished on Windows and the macros S_ISBLK, S_ISSOCK and S_ISLNK are
++ * only defined for compatibility.  These macros should always return false
++ * on Windows.
++ */
++#define	S_ISFIFO(mode) (((mode) & S_IFMT) == S_IFIFO)
++#define	S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
++#define	S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)
++#define	S_ISLNK(mode)  (((mode) & S_IFMT) == S_IFLNK)
++#define	S_ISSOCK(mode) (((mode) & S_IFMT) == S_IFSOCK)
++#define	S_ISCHR(mode)  (((mode) & S_IFMT) == S_IFCHR)
++#define	S_ISBLK(mode)  (((mode) & S_IFMT) == S_IFBLK)
++
++/* Return the exact length of d_namlen without zero terminator */
++#define _D_EXACT_NAMLEN(p) ((p)->d_namlen)
++
++/* Return number of bytes needed to store d_namlen */
++#define _D_ALLOC_NAMLEN(p) (PATH_MAX + 1)
++
++/* Wide-character version */
++struct _wdirent
++{
++    long d_ino;                                 /* Always zero */
++    unsigned short d_reclen;                    /* Structure size */
++    size_t d_namlen;                            /* Length of name without \0 */
++    int d_type;                                 /* File type */
++    wchar_t d_name[PATH_MAX + 1];               /* File name */
++};
++typedef struct _wdirent _wdirent;
++
++struct _WDIR
++{
++    struct _wdirent ent;                        /* Current directory entry */
++    WIN32_FIND_DATAW data;                      /* Private file data */
++    int cached;                                 /* True if data is valid */
++    HANDLE handle;                              /* Win32 search handle */
++    wchar_t *patt;                              /* Initial directory name */
++};
++typedef struct _WDIR _WDIR;
++
++static _WDIR *_wopendir(const wchar_t *dirname);
++static struct _wdirent *_wreaddir(_WDIR *dirp);
++static int _wclosedir(_WDIR *dirp);
++static void _wrewinddir(_WDIR* dirp);
++
++/* For compatibility with Symbian */
++#define wdirent _wdirent
++#define WDIR _WDIR
++#define wopendir _wopendir
++#define wreaddir _wreaddir
++#define wclosedir _wclosedir
++#define wrewinddir _wrewinddir
++
++/* Multi-byte character versions */
++struct dirent
++{
++    long d_ino;                                 /* Always zero */
++    unsigned short d_reclen;                    /* Structure size */
++    size_t d_namlen;                            /* Length of name without \0 */
++    int d_type;                                 /* File type */
++    char d_name[PATH_MAX + 1];                  /* File name */
++};
++typedef struct dirent dirent;
++
++struct DIR
++{
++    struct dirent ent;
++    struct _WDIR *wdirp;
++};
++typedef struct DIR DIR;
++
++static DIR *opendir(const char *dirname);
++static struct dirent *readdir(DIR *dirp);
++static int closedir(DIR *dirp);
++static void rewinddir(DIR* dirp);
++
++/* Internal utility functions */
++static WIN32_FIND_DATAW *dirent_first(_WDIR *dirp);
++static WIN32_FIND_DATAW *dirent_next(_WDIR *dirp);
++
++static int dirent_mbstowcs_s(
++    size_t *pReturnValue,
++    wchar_t *wcstr,
++    size_t sizeInWords,
++    const char *mbstr,
++    size_t count);
++
++static int dirent_wcstombs_s(
++    size_t *pReturnValue,
++    char *mbstr,
++    size_t sizeInBytes,
++    const wchar_t *wcstr,
++    size_t count);
++
++static void dirent_set_errno(int error);
++
++/*
++ * Open directory stream DIRNAME for read and return a pointer to the
++ * internal working area that is used to retrieve individual directory
++ * entries.
++ */
++static __inline _WDIR* _wopendir(const wchar_t *dirname)
++{
++    _WDIR *dirp = NULL;
++    int error;
++
++    /* Must have directory name */
++    if (dirname == NULL || dirname[0] == '\0') {
++        dirent_set_errno(ENOENT);
++        return NULL;
++    }
++
++    /* Allocate new _WDIR structure */
++    dirp = (_WDIR*)malloc(sizeof(struct _WDIR));
++    if (dirp != NULL) {
++        DWORD n;
++
++        /* Reset _WDIR structure */
++        dirp->handle = INVALID_HANDLE_VALUE;
++        dirp->patt = NULL;
++        dirp->cached = 0;
++
++        /* Compute the length of full path plus zero terminator */
++        n = GetFullPathNameW(dirname, 0, NULL, NULL);
++
++        /* Allocate room for absolute directory name and search pattern */
++        dirp->patt = (wchar_t*)malloc(sizeof(wchar_t) * n + 16);
++        if (dirp->patt) {
++            /*
++             * Convert relative directory name to an absolute one.  This
++             * allows rewinddir() to function correctly even when current
++             * working directory is changed between opendir() and rewinddir().
++             */
++            n = GetFullPathNameW(dirname, n, dirp->patt, NULL);
++            if (n > 0) {
++                wchar_t *p;
++
++                /* Append search pattern \* to the directory name */
++                p = dirp->patt + n;
++                if (dirp->patt < p) {
++                    switch (p[-1]) {
++                        case '\\':
++                        case '/':
++                        case ':':
++                            /* Directory ends in path separator, e.g. c:\temp\ */
++                            /*NOP*/;
++                            break;
++
++                        default:
++                            /* Directory name doesn't end in path separator */
++                            *p++ = '\\';
++                    }
++                }
++                *p++ = '*';
++                *p = '\0';
++
++                /* Open directory stream and retrieve the first entry */
++                if (dirent_first(dirp)) {
++                    /* Directory stream opened successfully */
++                    error = 0;
++                } else {
++                    /* Cannot retrieve first entry */
++                    error = 1;
++                    dirent_set_errno(ENOENT);
++                }
++            } else {
++                /* Cannot retrieve full path name */
++                dirent_set_errno(ENOENT);
++                error = 1;
++            }
++        } else {
++            /* Cannot allocate memory for search pattern */
++            error = 1;
++        }
++    } else {
++        /* Cannot allocate _WDIR structure */
++        error = 1;
++    }
++
++    /* Clean up in case of error */
++    if (error  &&  dirp) {
++        _wclosedir(dirp);
++        dirp = NULL;
++    }
++
++    return dirp;
++}
++
++/*
++ * Read next directory entry.  The directory entry is returned in dirent
++ * structure in the d_name field.  Individual directory entries returned by
++ * this function include regular files, sub-directories, pseudo-directories
++ * "." and ".." as well as volume labels, hidden files and system files.
++ */
++static __inline struct _wdirent* _wreaddir(_WDIR *dirp)
++{
++    WIN32_FIND_DATAW *datap;
++    struct _wdirent *entp;
++
++    /* Read next directory entry */
++    datap = dirent_next(dirp);
++    if (datap) {
++        size_t n;
++        DWORD attr;
++
++        /* Pointer to directory entry to return */
++        entp = &dirp->ent;
++
++        /*
++         * Copy file name as wide-character string.  If the file name is too
++         * long to fit in to the destination buffer, then truncate file name
++         * to PATH_MAX characters and zero-terminate the buffer.
++         */
++        n = 0;
++        while (n < PATH_MAX  &&  datap->cFileName[n] != 0) {
++            entp->d_name[n] = datap->cFileName[n];
++            n++;
++        }
++        dirp->ent.d_name[n] = 0;
++
++        /* Length of file name excluding zero terminator */
++        entp->d_namlen = n;
++
++        /* File type */
++        attr = datap->dwFileAttributes;
++        if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
++            entp->d_type = DT_CHR;
++        } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
++            entp->d_type = DT_DIR;
++        } else {
++            entp->d_type = DT_REG;
++        }
++
++        /* Reset dummy fields */
++        entp->d_ino = 0;
++        entp->d_reclen = sizeof(struct _wdirent);
++    } else {
++        /* Last directory entry read */
++        entp = NULL;
++    }
++
++    return entp;
++}
++
++/*
++ * Close directory stream opened by opendir() function.  This invalidates the
++ * DIR structure as well as any directory entry read previously by
++ * _wreaddir().
++ */
++static __inline int _wclosedir(_WDIR *dirp)
++{
++    int ok;
++    if (dirp) {
++        /* Release search handle */
++        if (dirp->handle != INVALID_HANDLE_VALUE) {
++            FindClose(dirp->handle);
++            dirp->handle = INVALID_HANDLE_VALUE;
++        }
++
++        /* Release search pattern */
++        if (dirp->patt) {
++            free(dirp->patt);
++            dirp->patt = NULL;
++        }
++
++        /* Release directory structure */
++        free(dirp);
++        ok = /*success*/0;
++    } else {
++        /* Invalid directory stream */
++        dirent_set_errno(EBADF);
++        ok = /*failure*/-1;
++    }
++    return ok;
++}
++
++/*
++ * Rewind directory stream such that _wreaddir() returns the very first
++ * file name again.
++ */
++static __inline void _wrewinddir(_WDIR* dirp)
++{
++    if (dirp) {
++        /* Release existing search handle */
++        if (dirp->handle != INVALID_HANDLE_VALUE) {
++            FindClose(dirp->handle);
++        }
++
++        /* Open new search handle */
++        dirent_first(dirp);
++    }
++}
++
++/* Get first directory entry (internal) */
++static __inline WIN32_FIND_DATAW* dirent_first(_WDIR *dirp)
++{
++    WIN32_FIND_DATAW *datap;
++
++    /* Open directory and retrieve the first entry */
++    dirp->handle = FindFirstFileW(dirp->patt, &dirp->data);
++    if (dirp->handle != INVALID_HANDLE_VALUE) {
++        /* a directory entry is now waiting in memory */
++        datap = &dirp->data;
++        dirp->cached = 1;
++    } else {
++        /* Failed to re-open directory: no directory entry in memory */
++        dirp->cached = 0;
++        datap = NULL;
++    }
++    return datap;
++}
++
++/* Get next directory entry (internal) */
++static __inline WIN32_FIND_DATAW* dirent_next(_WDIR *dirp)
++{
++    WIN32_FIND_DATAW *p;
++
++    /* Get next directory entry */
++    if (dirp->cached != 0) {
++        /* A valid directory entry already in memory */
++        p = &dirp->data;
++        dirp->cached = 0;
++    } else if (dirp->handle != INVALID_HANDLE_VALUE) {
++        /* Get the next directory entry from stream */
++        if (FindNextFileW(dirp->handle, &dirp->data) != FALSE) {
++            /* Got a file */
++            p = &dirp->data;
++        } else {
++            /* The very last entry has been processed or an error occured */
++            FindClose(dirp->handle);
++            dirp->handle = INVALID_HANDLE_VALUE;
++            p = NULL;
++        }
++    } else {
++        /* End of directory stream reached */
++        p = NULL;
++    }
++    return p;
++}
++
++/*
++ * Open directory stream using plain old C-string.
++ */
++static __inline DIR* opendir(const char *dirname)
++{
++    struct DIR *dirp;
++    int error;
++
++    /* Must have directory name */
++    if (dirname == NULL || dirname[0] == '\0') {
++        dirent_set_errno(ENOENT);
++        return NULL;
++    }
++
++    /* Allocate memory for DIR structure */
++    dirp = (DIR*)malloc(sizeof(struct DIR));
++    if (dirp) {
++        wchar_t wname[PATH_MAX + 1];
++        size_t n;
++
++        /* Convert directory name to wide-character string */
++        error = dirent_mbstowcs_s(
++            &n, wname, PATH_MAX + 1, dirname, PATH_MAX);
++        if (!error) {
++            /* Open directory stream using wide-character name */
++            dirp->wdirp = _wopendir(wname);
++            if (dirp->wdirp) {
++                /* Directory stream opened */
++                error = 0;
++            } else {
++                /* Failed to open directory stream */
++                error = 1;
++            }
++        } else {
++            /*
++             * Cannot convert file name to wide-character string.  This
++             * occurs if the string contains invalid multi-byte sequences or
++             * the output buffer is too small to contain the resulting
++             * string.
++             */
++            error = 1;
++        }
++    } else {
++        /* Cannot allocate DIR structure */
++        error = 1;
++    }
++
++    /* Clean up in case of error */
++    if (error  &&  dirp) {
++        free(dirp);
++        dirp = NULL;
++    }
++
++    return dirp;
++}
++
++/*
++ * Read next directory entry.
++ *
++ * When working with text consoles, please note that file names returned by
++ * readdir() are represented in the default ANSI code page while any output to
++ * console is typically formatted on another code page.  Thus, non-ASCII
++ * characters in file names will not usually display correctly on console.  The
++ * problem can be fixed in two ways: (1) change the character set of console
++ * to 1252 using chcp utility and use Lucida Console font, or (2) use
++ * _cprintf function when writing to console.  The _cprinf() will re-encode
++ * ANSI strings to the console code page so many non-ASCII characters will
++ * display correcly.
++ */
++static __inline struct dirent* readdir(DIR *dirp)
++{
++    WIN32_FIND_DATAW *datap;
++    struct dirent *entp;
++
++    /* Read next directory entry */
++    datap = dirent_next(dirp->wdirp);
++    if (datap) {
++        size_t n;
++        int error;
++
++        /* Attempt to convert file name to multi-byte string */
++        error = dirent_wcstombs_s(
++            &n, dirp->ent.d_name, MAX_PATH + 1, datap->cFileName, MAX_PATH);
++
++        /*
++         * If the file name cannot be represented by a multi-byte string,
++         * then attempt to use old 8+3 file name.  This allows traditional
++         * Unix-code to access some file names despite of unicode
++         * characters, although file names may seem unfamiliar to the user.
++         *
++         * Be ware that the code below cannot come up with a short file
++         * name unless the file system provides one.  At least
++         * VirtualBox shared folders fail to do this.
++         */
++        if (error  &&  datap->cAlternateFileName[0] != '\0') {
++            error = dirent_wcstombs_s(
++                &n, dirp->ent.d_name, MAX_PATH + 1, datap->cAlternateFileName,
++                sizeof(datap->cAlternateFileName) /
++                sizeof(datap->cAlternateFileName[0]));
++        }
++
++        if (!error) {
++            DWORD attr;
++
++            /* Initialize directory entry for return */
++            entp = &dirp->ent;
++
++            /* Length of file name excluding zero terminator */
++            entp->d_namlen = n - 1;
++
++            /* File attributes */
++            attr = datap->dwFileAttributes;
++            if ((attr & FILE_ATTRIBUTE_DEVICE) != 0) {
++                entp->d_type = DT_CHR;
++            } else if ((attr & FILE_ATTRIBUTE_DIRECTORY) != 0) {
++                entp->d_type = DT_DIR;
++            } else {
++                entp->d_type = DT_REG;
++            }
++
++            /* Reset dummy fields */
++            entp->d_ino = 0;
++            entp->d_reclen = sizeof(struct dirent);
++        } else {
++            /*
++             * Cannot convert file name to multi-byte string so construct
++             * an errornous directory entry and return that.  Note that
++             * we cannot return NULL as that would stop the processing
++             * of directory entries completely.
++             */
++            entp = &dirp->ent;
++            entp->d_name[0] = '?';
++            entp->d_name[1] = '\0';
++            entp->d_namlen = 1;
++            entp->d_type = DT_UNKNOWN;
++            entp->d_ino = 0;
++            entp->d_reclen = 0;
++        }
++    } else {
++        /* No more directory entries */
++        entp = NULL;
++    }
++
++    return entp;
++}
++
++/*
++ * Close directory stream.
++ */
++static __inline int closedir(DIR *dirp)
++{
++    int ok;
++    if (dirp) {
++        /* Close wide-character directory stream */
++        ok = _wclosedir(dirp->wdirp);
++        dirp->wdirp = NULL;
++
++        /* Release multi-byte character version */
++        free(dirp);
++    } else {
++        /* Invalid directory stream */
++        dirent_set_errno(EBADF);
++        ok = /*failure*/-1;
++    }
++    return ok;
++}
++
++/*
++ * Rewind directory stream to beginning.
++ */
++static __inline void rewinddir(DIR* dirp)
++{
++    /* Rewind wide-character string directory stream */
++    _wrewinddir(dirp->wdirp);
++}
++
++/* Convert multi-byte string to wide character string */
++static __inline int dirent_mbstowcs_s(
++    size_t *pReturnValue,
++    wchar_t *wcstr,
++    size_t sizeInWords,
++    const char *mbstr,
++    size_t count)
++{
++    int error;
++
++#if _MSC_VER >= 1400
++    /* Microsoft Visual Studio 2005 or later */
++    error = mbstowcs_s(pReturnValue, wcstr, sizeInWords, mbstr, count);
++#else
++    /* Older Visual Studio or non-Microsoft compiler */
++    size_t n;
++
++    /* Convert to wide-character string */
++    n = mbstowcs(wcstr, mbstr, count);
++    if (n < sizeInWords) {
++        /* Zero-terminate output buffer */
++        if (wcstr) {
++            wcstr[n] = 0;
++        }
++
++        /* Length of resuting multi-byte string WITH zero terminator */
++        if (pReturnValue) {
++            *pReturnValue = n + 1;
++        }
++
++        /* Success */
++        error = 0;
++    } else {
++        /* Could not convert string */
++        error = 1;
++    }
++#endif
++    return error;
++}
++
++/* Convert wide-character string to multi-byte string */
++static __inline int dirent_wcstombs_s(
++    size_t *pReturnValue,
++    char *mbstr,
++    size_t sizeInBytes,
++    const wchar_t *wcstr,
++    size_t count)
++{
++    int error;
++
++#if _MSC_VER >= 1400
++    /* Microsoft Visual Studio 2005 or later */
++    error = wcstombs_s(pReturnValue, mbstr, sizeInBytes, wcstr, count);
++#else
++    /* Older Visual Studio or non-Microsoft compiler */
++    size_t n;
++
++    /* Convert to multi-byte string */
++    n = wcstombs(mbstr, wcstr, count);
++    if (n < sizeInBytes) {
++        /* Zero-terminate output buffer */
++        if (mbstr) {
++            mbstr[n] = '\0';
++        }
++
++        /* Lenght of resulting multi-bytes string WITH zero-terminator */
++        if (pReturnValue) {
++            *pReturnValue = n + 1;
++        }
++
++        /* Success */
++        error = 0;
++    } else {
++        /* Cannot convert string */
++        error = 1;
++    }
++#endif
++
++    return error;
++}
++
++/* Set errno variable */
++static __inline void dirent_set_errno(int error)
++{
++    /* Microsoft Visual Studio */
++    _set_errno(error);
++}
++
++#endif /* _MSC_VER */
++
++#endif /*SMP_DIRENT_H*/
+diff --git a/SMP/gnutls/gnutls.h b/SMP/gnutls/gnutls.h
+new file mode 100644
+index 0000000..11e8af8
+--- /dev/null
++++ b/SMP/gnutls/gnutls.h
+@@ -0,0 +1,3329 @@
++/* -*- c -*-
++ * Copyright (C) 2000-2016 Free Software Foundation, Inc.
++ * Copyright (C) 2015-2016 Red Hat, Inc.
++ *
++ * Author: Nikos Mavrogiannopoulos
++ *
++ * This file is part of GnuTLS.
++ *
++ * The GnuTLS is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public License
++ * as published by the Free Software Foundation; either version 2.1 of
++ * the License, or (at your option) any later version.
++ *
++ * This library is distributed in the hope that it will be useful, but
++ * WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public License
++ * along with this program.  If not, see <https://www.gnu.org/licenses/>
++ *
++ */
++
++/* This file contains the types and prototypes for all the
++ * high level functionality of the gnutls main library.
++ *
++ * If the optional C++ binding was built, it is available in
++ * gnutls/gnutlsxx.h.
++ *
++ * The openssl compatibility layer (which is under the GNU GPL
++ * license) is in gnutls/openssl.h.
++ *
++ * The low level cipher functionality is in gnutls/crypto.h.
++ */
++
++#ifndef GNUTLS_H
++#define GNUTLS_H
++
++/* Get size_t. */
++#include <stddef.h>
++/* Get ssize_t. */
++#ifndef HAVE_SSIZE_T
++#define HAVE_SSIZE_T
++/* *INDENT-OFF* */
++#include <sys/types.h>
++#include <BaseTsd.h>
++typedef SSIZE_T ssize_t;
++/* *INDENT-ON* */
++#endif
++/* Get time_t. */
++#include <time.h>
++
++/* *INDENT-OFF* */
++#ifdef __cplusplus
++extern "C" {
++#endif
++/* *INDENT-ON* */
++
++#define GNUTLS_VERSION "3.6.7"
++
++#define GNUTLS_VERSION_MAJOR 3
++#define GNUTLS_VERSION_MINOR 6
++#define GNUTLS_VERSION_PATCH 7
++
++#define GNUTLS_VERSION_NUMBER 0x030607
++
++#define GNUTLS_CIPHER_RIJNDAEL_128_CBC GNUTLS_CIPHER_AES_128_CBC
++#define GNUTLS_CIPHER_RIJNDAEL_256_CBC GNUTLS_CIPHER_AES_256_CBC
++#define GNUTLS_CIPHER_RIJNDAEL_CBC GNUTLS_CIPHER_AES_128_CBC
++#define GNUTLS_CIPHER_ARCFOUR GNUTLS_CIPHER_ARCFOUR_128
++
++#if !defined(GNUTLS_INTERNAL_BUILD) && defined(_WIN32)
++# define _SYM_EXPORT __declspec(dllimport)
++#else
++# define _SYM_EXPORT
++#endif
++
++#ifdef __GNUC__
++# define __GNUTLS_CONST__  __attribute__((const))
++# define __GNUTLS_PURE__  __attribute__((pure))
++#else
++# define __GNUTLS_CONST__
++# define __GNUTLS_PURE__
++#endif
++
++/* Use the following definition globally in your program to disable
++ * implicit initialization of gnutls. */
++#define GNUTLS_SKIP_GLOBAL_INIT int _gnutls_global_init_skip(void); \
++    int _gnutls_global_init_skip(void) {return 1;}
++
++/**
++ * gnutls_cipher_algorithm_t:
++ * @GNUTLS_CIPHER_UNKNOWN: Value to identify an unknown/unsupported algorithm.
++ * @GNUTLS_CIPHER_NULL: The NULL (identity) encryption algorithm.
++ * @GNUTLS_CIPHER_ARCFOUR_128: ARCFOUR stream cipher with 128-bit keys.
++ * @GNUTLS_CIPHER_3DES_CBC: 3DES in CBC mode.
++ * @GNUTLS_CIPHER_AES_128_CBC: AES in CBC mode with 128-bit keys.
++ * @GNUTLS_CIPHER_AES_192_CBC: AES in CBC mode with 192-bit keys.
++ * @GNUTLS_CIPHER_AES_256_CBC: AES in CBC mode with 256-bit keys.
++ * @GNUTLS_CIPHER_AES_128_CFB8: AES in CFB8 mode with 128-bit keys.
++ * @GNUTLS_CIPHER_AES_192_CFB8: AES in CFB8 mode with 192-bit keys.
++ * @GNUTLS_CIPHER_AES_256_CFB8: AES in CFB8 mode with 256-bit keys.
++ * @GNUTLS_CIPHER_ARCFOUR_40: ARCFOUR stream cipher with 40-bit keys.
++ * @GNUTLS_CIPHER_CAMELLIA_128_CBC: Camellia in CBC mode with 128-bit keys.
++ * @GNUTLS_CIPHER_CAMELLIA_192_CBC: Camellia in CBC mode with 192-bit keys.
++ * @GNUTLS_CIPHER_CAMELLIA_256_CBC: Camellia in CBC mode with 256-bit keys.
++ * @GNUTLS_CIPHER_RC2_40_CBC: RC2 in CBC mode with 40-bit keys.
++ * @GNUTLS_CIPHER_DES_CBC: DES in CBC mode (56-bit keys).
++ * @GNUTLS_CIPHER_AES_128_GCM: AES in GCM mode with 128-bit keys.
++ * @GNUTLS_CIPHER_AES_256_GCM: AES in GCM mode with 256-bit keys.
++ * @GNUTLS_CIPHER_AES_128_CCM: AES in CCM mode with 128-bit keys.
++ * @GNUTLS_CIPHER_AES_256_CCM: AES in CCM mode with 256-bit keys.
++ * @GNUTLS_CIPHER_AES_128_CCM_8: AES in CCM mode with 64-bit tag and 128-bit keys.
++ * @GNUTLS_CIPHER_AES_256_CCM_8: AES in CCM mode with 64-bit tag and 256-bit keys.
++ * @GNUTLS_CIPHER_CAMELLIA_128_GCM: CAMELLIA in GCM mode with 128-bit keys.
++ * @GNUTLS_CIPHER_CAMELLIA_256_GCM: CAMELLIA in GCM mode with 256-bit keys.
++ * @GNUTLS_CIPHER_SALSA20_256: Salsa20 with 256-bit keys.
++ * @GNUTLS_CIPHER_ESTREAM_SALSA20_256: Estream's Salsa20 variant with 256-bit keys.
++ * @GNUTLS_CIPHER_CHACHA20_POLY1305: The Chacha20 cipher with the Poly1305 authenticator (AEAD).
++ * @GNUTLS_CIPHER_GOST28147_TC26Z_CFB: GOST 28147-89 (Magma) cipher in CFB mode with TC26 Z S-box.
++ * @GNUTLS_CIPHER_GOST28147_CPA_CFB: GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro A S-box.
++ * @GNUTLS_CIPHER_GOST28147_CPB_CFB: GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro B S-box.
++ * @GNUTLS_CIPHER_GOST28147_CPC_CFB: GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro C S-box.
++ * @GNUTLS_CIPHER_GOST28147_CPD_CFB: GOST 28147-89 (Magma) cipher in CFB mode with CryptoPro D S-box.
++ * @GNUTLS_CIPHER_IDEA_PGP_CFB: IDEA in CFB mode (placeholder - unsupported).
++ * @GNUTLS_CIPHER_3DES_PGP_CFB: 3DES in CFB mode (placeholder - unsupported).
++ * @GNUTLS_CIPHER_CAST5_PGP_CFB: CAST5 in CFB mode (placeholder - unsupported).
++ * @GNUTLS_CIPHER_BLOWFISH_PGP_CFB: Blowfish in CFB mode (placeholder - unsupported).
++ * @GNUTLS_CIPHER_SAFER_SK128_PGP_CFB: Safer-SK in CFB mode with 128-bit keys (placeholder - unsupported).
++ * @GNUTLS_CIPHER_AES128_PGP_CFB: AES in CFB mode with 128-bit keys (placeholder - unsupported).
++ * @GNUTLS_CIPHER_AES192_PGP_CFB: AES in CFB mode with 192-bit keys (placeholder - unsupported).
++ * @GNUTLS_CIPHER_AES256_PGP_CFB: AES in CFB mode with 256-bit keys (placeholder - unsupported).
++ * @GNUTLS_CIPHER_TWOFISH_PGP_CFB: Twofish in CFB mode (placeholder - unsupported).
++ *
++ * Enumeration of different symmetric encryption algorithms.
++ */
++typedef enum gnutls_cipher_algorithm {
++	GNUTLS_CIPHER_UNKNOWN = 0,
++	GNUTLS_CIPHER_NULL = 1,
++	GNUTLS_CIPHER_ARCFOUR_128 = 2,
++	GNUTLS_CIPHER_3DES_CBC = 3,
++	GNUTLS_CIPHER_AES_128_CBC = 4,
++	GNUTLS_CIPHER_AES_256_CBC = 5,
++	GNUTLS_CIPHER_ARCFOUR_40 = 6,
++	GNUTLS_CIPHER_CAMELLIA_128_CBC = 7,
++	GNUTLS_CIPHER_CAMELLIA_256_CBC = 8,
++	GNUTLS_CIPHER_AES_192_CBC = 9,
++	GNUTLS_CIPHER_AES_128_GCM = 10,
++	GNUTLS_CIPHER_AES_256_GCM = 11,
++	GNUTLS_CIPHER_CAMELLIA_192_CBC = 12,
++	GNUTLS_CIPHER_SALSA20_256 = 13,
++	GNUTLS_CIPHER_ESTREAM_SALSA20_256 = 14,
++	GNUTLS_CIPHER_CAMELLIA_128_GCM = 15,
++	GNUTLS_CIPHER_CAMELLIA_256_GCM = 16,
++	GNUTLS_CIPHER_RC2_40_CBC = 17,
++	GNUTLS_CIPHER_DES_CBC = 18,
++	GNUTLS_CIPHER_AES_128_CCM = 19,
++	GNUTLS_CIPHER_AES_256_CCM = 20,
++	GNUTLS_CIPHER_AES_128_CCM_8 = 21,
++	GNUTLS_CIPHER_AES_256_CCM_8 = 22,
++	GNUTLS_CIPHER_CHACHA20_POLY1305 = 23,
++	GNUTLS_CIPHER_GOST28147_TC26Z_CFB = 24,
++	GNUTLS_CIPHER_GOST28147_CPA_CFB = 25,
++	GNUTLS_CIPHER_GOST28147_CPB_CFB = 26,
++	GNUTLS_CIPHER_GOST28147_CPC_CFB = 27,
++	GNUTLS_CIPHER_GOST28147_CPD_CFB = 28,
++	GNUTLS_CIPHER_AES_128_CFB8 = 29,
++	GNUTLS_CIPHER_AES_192_CFB8 = 30,
++	GNUTLS_CIPHER_AES_256_CFB8 = 31,
++
++	/* used only for PGP internals. Ignored in TLS/SSL
++	 */
++	GNUTLS_CIPHER_IDEA_PGP_CFB = 200,
++	GNUTLS_CIPHER_3DES_PGP_CFB = 201,
++	GNUTLS_CIPHER_CAST5_PGP_CFB = 202,
++	GNUTLS_CIPHER_BLOWFISH_PGP_CFB = 203,
++	GNUTLS_CIPHER_SAFER_SK128_PGP_CFB = 204,
++	GNUTLS_CIPHER_AES128_PGP_CFB = 205,
++	GNUTLS_CIPHER_AES192_PGP_CFB = 206,
++	GNUTLS_CIPHER_AES256_PGP_CFB = 207,
++	GNUTLS_CIPHER_TWOFISH_PGP_CFB = 208
++} gnutls_cipher_algorithm_t;
++
++/**
++ * gnutls_kx_algorithm_t:
++ * @GNUTLS_KX_UNKNOWN: Unknown key-exchange algorithm.
++ * @GNUTLS_KX_RSA: RSA key-exchange algorithm.
++ * @GNUTLS_KX_DHE_DSS: DHE-DSS key-exchange algorithm.
++ * @GNUTLS_KX_DHE_RSA: DHE-RSA key-exchange algorithm.
++ * @GNUTLS_KX_ECDHE_RSA: ECDHE-RSA key-exchange algorithm.
++ * @GNUTLS_KX_ECDHE_ECDSA: ECDHE-ECDSA key-exchange algorithm.
++ * @GNUTLS_KX_ANON_DH: Anon-DH key-exchange algorithm.
++ * @GNUTLS_KX_ANON_ECDH: Anon-ECDH key-exchange algorithm.
++ * @GNUTLS_KX_SRP: SRP key-exchange algorithm.
++ * @GNUTLS_KX_RSA_EXPORT: RSA-EXPORT key-exchange algorithm (defunc).
++ * @GNUTLS_KX_SRP_RSA: SRP-RSA key-exchange algorithm.
++ * @GNUTLS_KX_SRP_DSS: SRP-DSS key-exchange algorithm.
++ * @GNUTLS_KX_PSK: PSK key-exchange algorithm.
++ * @GNUTLS_KX_DHE_PSK: DHE-PSK key-exchange algorithm.
++ * @GNUTLS_KX_ECDHE_PSK: ECDHE-PSK key-exchange algorithm.
++ * @GNUTLS_KX_RSA_PSK: RSA-PSK key-exchange algorithm.
++ *
++ * Enumeration of different key exchange algorithms.
++ */
++typedef enum {
++	GNUTLS_KX_UNKNOWN = 0,
++	GNUTLS_KX_RSA = 1,
++	GNUTLS_KX_DHE_DSS = 2,
++	GNUTLS_KX_DHE_RSA = 3,
++	GNUTLS_KX_ANON_DH = 4,
++	GNUTLS_KX_SRP = 5,
++	GNUTLS_KX_RSA_EXPORT = 6,
++	GNUTLS_KX_SRP_RSA = 7,
++	GNUTLS_KX_SRP_DSS = 8,
++	GNUTLS_KX_PSK = 9,
++	GNUTLS_KX_DHE_PSK = 10,
++	GNUTLS_KX_ANON_ECDH = 11,
++	GNUTLS_KX_ECDHE_RSA = 12,
++	GNUTLS_KX_ECDHE_ECDSA = 13,
++	GNUTLS_KX_ECDHE_PSK = 14,
++	GNUTLS_KX_RSA_PSK = 15
++} gnutls_kx_algorithm_t;
++
++/**
++ * gnutls_params_type_t:
++ * @GNUTLS_PARAMS_RSA_EXPORT: Session RSA-EXPORT parameters (defunc).
++ * @GNUTLS_PARAMS_DH: Session Diffie-Hellman parameters.
++ * @GNUTLS_PARAMS_ECDH: Session Elliptic-Curve Diffie-Hellman parameters.
++ *
++ * Enumeration of different TLS session parameter types.
++ */
++typedef enum {
++	GNUTLS_PARAMS_RSA_EXPORT = 1,
++	GNUTLS_PARAMS_DH = 2,
++	GNUTLS_PARAMS_ECDH = 3
++} gnutls_params_type_t;
++
++/**
++ * gnutls_credentials_type_t:
++ * @GNUTLS_CRD_CERTIFICATE: Certificate credential.
++ * @GNUTLS_CRD_ANON: Anonymous credential.
++ * @GNUTLS_CRD_SRP: SRP credential.
++ * @GNUTLS_CRD_PSK: PSK credential.
++ * @GNUTLS_CRD_IA: IA credential.
++ *
++ * Enumeration of different credential types.
++ */
++typedef enum {
++	GNUTLS_CRD_CERTIFICATE = 1,
++	GNUTLS_CRD_ANON,
++	GNUTLS_CRD_SRP,
++	GNUTLS_CRD_PSK,
++	GNUTLS_CRD_IA
++} gnutls_credentials_type_t;
++
++#define GNUTLS_MAC_SHA GNUTLS_MAC_SHA1
++#define GNUTLS_DIG_SHA GNUTLS_DIG_SHA1
++
++/**
++ * gnutls_mac_algorithm_t:
++ * @GNUTLS_MAC_UNKNOWN: Unknown MAC algorithm.
++ * @GNUTLS_MAC_NULL: NULL MAC algorithm (empty output).
++ * @GNUTLS_MAC_MD5: HMAC-MD5 algorithm.
++ * @GNUTLS_MAC_SHA1: HMAC-SHA-1 algorithm.
++ * @GNUTLS_MAC_RMD160: HMAC-RMD160 algorithm.
++ * @GNUTLS_MAC_MD2: HMAC-MD2 algorithm.
++ * @GNUTLS_MAC_SHA256: HMAC-SHA-256 algorithm.
++ * @GNUTLS_MAC_SHA384: HMAC-SHA-384 algorithm.
++ * @GNUTLS_MAC_SHA512: HMAC-SHA-512 algorithm.
++ * @GNUTLS_MAC_SHA224: HMAC-SHA-224 algorithm.
++ * @GNUTLS_MAC_MD5_SHA1: Combined MD5+SHA1 MAC placeholder.
++ * @GNUTLS_MAC_GOSTR_94: HMAC GOST R 34.11-94 algorithm.
++ * @GNUTLS_MAC_STREEBOG_256: HMAC GOST R 34.11-2001 (Streebog) algorithm, 256 bit.
++ * @GNUTLS_MAC_STREEBOG_512: HMAC GOST R 34.11-2001 (Streebog) algorithm, 512 bit.
++ * @GNUTLS_MAC_AEAD: MAC implicit through AEAD cipher.
++ * @GNUTLS_MAC_UMAC_96: The UMAC-96 MAC algorithm.
++ * @GNUTLS_MAC_UMAC_128: The UMAC-128 MAC algorithm.
++ * @GNUTLS_MAC_AES_CMAC_128: The AES-CMAC-128 MAC algorithm.
++ * @GNUTLS_MAC_AES_CMAC_256: The AES-CMAC-256 MAC algorithm.
++ * @GNUTLS_MAC_SHA3_224: Reserved; unimplemented.
++ * @GNUTLS_MAC_SHA3_256: Reserved; unimplemented.
++ * @GNUTLS_MAC_SHA3_384: Reserved; unimplemented.
++ * @GNUTLS_MAC_SHA3_512: Reserved; unimplemented.
++ *
++ * Enumeration of different Message Authentication Code (MAC)
++ * algorithms.
++ */
++typedef enum {
++	GNUTLS_MAC_UNKNOWN = 0,
++	GNUTLS_MAC_NULL = 1,
++	GNUTLS_MAC_MD5 = 2,
++	GNUTLS_MAC_SHA1 = 3,
++	GNUTLS_MAC_RMD160 = 4,
++	GNUTLS_MAC_MD2 = 5,
++	GNUTLS_MAC_SHA256 = 6,
++	GNUTLS_MAC_SHA384 = 7,
++	GNUTLS_MAC_SHA512 = 8,
++	GNUTLS_MAC_SHA224 = 9,
++	GNUTLS_MAC_SHA3_224 = 10, /* reserved: no implementation */
++	GNUTLS_MAC_SHA3_256 = 11, /* reserved: no implementation */
++	GNUTLS_MAC_SHA3_384 = 12, /* reserved: no implementation */
++	GNUTLS_MAC_SHA3_512 = 13, /* reserved: no implementation */
++	GNUTLS_MAC_MD5_SHA1 = 14, /* reserved: no implementation */
++	GNUTLS_MAC_GOSTR_94 = 15,
++	GNUTLS_MAC_STREEBOG_256 = 16,
++	GNUTLS_MAC_STREEBOG_512 = 17,
++	/* If you add anything here, make sure you align with
++	   gnutls_digest_algorithm_t. */
++	GNUTLS_MAC_AEAD = 200,	/* indicates that MAC is on the cipher */
++	GNUTLS_MAC_UMAC_96 = 201,
++	GNUTLS_MAC_UMAC_128 = 202,
++	GNUTLS_MAC_AES_CMAC_128 = 203,
++	GNUTLS_MAC_AES_CMAC_256 = 204,
++} gnutls_mac_algorithm_t;
++
++/**
++ * gnutls_digest_algorithm_t:
++ * @GNUTLS_DIG_UNKNOWN: Unknown hash algorithm.
++ * @GNUTLS_DIG_NULL: NULL hash algorithm (empty output).
++ * @GNUTLS_DIG_MD5: MD5 algorithm.
++ * @GNUTLS_DIG_SHA1: SHA-1 algorithm.
++ * @GNUTLS_DIG_RMD160: RMD160 algorithm.
++ * @GNUTLS_DIG_MD2: MD2 algorithm.
++ * @GNUTLS_DIG_SHA256: SHA-256 algorithm.
++ * @GNUTLS_DIG_SHA384: SHA-384 algorithm.
++ * @GNUTLS_DIG_SHA512: SHA-512 algorithm.
++ * @GNUTLS_DIG_SHA224: SHA-224 algorithm.
++ * @GNUTLS_DIG_SHA3_224: SHA3-224 algorithm.
++ * @GNUTLS_DIG_SHA3_256: SHA3-256 algorithm.
++ * @GNUTLS_DIG_SHA3_384: SHA3-384 algorithm.
++ * @GNUTLS_DIG_SHA3_512: SHA3-512 algorithm.
++ * @GNUTLS_DIG_MD5_SHA1: Combined MD5+SHA1 algorithm.
++ * @GNUTLS_DIG_GOSTR_94: GOST R 34.11-94 algorithm.
++ * @GNUTLS_DIG_STREEBOG_256: GOST R 34.11-2001 (Streebog) algorithm, 256 bit.
++ * @GNUTLS_DIG_STREEBOG_512: GOST R 34.11-2001 (Streebog) algorithm, 512 bit.
++ *
++ * Enumeration of different digest (hash) algorithms.
++ */
++typedef enum {
++	GNUTLS_DIG_UNKNOWN = GNUTLS_MAC_UNKNOWN,
++	GNUTLS_DIG_NULL = GNUTLS_MAC_NULL,
++	GNUTLS_DIG_MD5 = GNUTLS_MAC_MD5,
++	GNUTLS_DIG_SHA1 = GNUTLS_MAC_SHA1,
++	GNUTLS_DIG_RMD160 = GNUTLS_MAC_RMD160,
++	GNUTLS_DIG_MD2 = GNUTLS_MAC_MD2,
++	GNUTLS_DIG_SHA256 = GNUTLS_MAC_SHA256,
++	GNUTLS_DIG_SHA384 = GNUTLS_MAC_SHA384,
++	GNUTLS_DIG_SHA512 = GNUTLS_MAC_SHA512,
++	GNUTLS_DIG_SHA224 = GNUTLS_MAC_SHA224,
++	GNUTLS_DIG_SHA3_224 = GNUTLS_MAC_SHA3_224,
++	GNUTLS_DIG_SHA3_256 = GNUTLS_MAC_SHA3_256,
++	GNUTLS_DIG_SHA3_384 = GNUTLS_MAC_SHA3_384,
++	GNUTLS_DIG_SHA3_512 = GNUTLS_MAC_SHA3_512,
++	GNUTLS_DIG_MD5_SHA1 = GNUTLS_MAC_MD5_SHA1,
++	GNUTLS_DIG_GOSTR_94 = GNUTLS_MAC_GOSTR_94,
++	GNUTLS_DIG_STREEBOG_256 = GNUTLS_MAC_STREEBOG_256,
++	GNUTLS_DIG_STREEBOG_512 = GNUTLS_MAC_STREEBOG_512
++	    /* If you add anything here, make sure you align with
++	       gnutls_mac_algorithm_t. */
++} gnutls_digest_algorithm_t;
++
++  /* exported for other gnutls headers. This is the maximum number of
++   * algorithms (ciphers, kx or macs).
++   */
++#define GNUTLS_MAX_ALGORITHM_NUM 64
++#define GNUTLS_MAX_SESSION_ID_SIZE 32
++
++/**
++ * gnutls_compression_method_t:
++ * @GNUTLS_COMP_UNKNOWN: Unknown compression method.
++ * @GNUTLS_COMP_NULL: The NULL compression method (no compression).
++ * @GNUTLS_COMP_DEFLATE: The DEFLATE compression method from zlib.
++ * @GNUTLS_COMP_ZLIB: Same as %GNUTLS_COMP_DEFLATE.
++ *
++ * Enumeration of different TLS compression methods.
++ */
++typedef enum {
++	GNUTLS_COMP_UNKNOWN = 0,
++	GNUTLS_COMP_NULL = 1,
++	GNUTLS_COMP_DEFLATE = 2,
++	GNUTLS_COMP_ZLIB = GNUTLS_COMP_DEFLATE
++} gnutls_compression_method_t;
++
++/**
++ * gnutls_init_flags_t:
++ *
++ * @GNUTLS_SERVER: Connection end is a server.
++ * @GNUTLS_CLIENT: Connection end is a client.
++ * @GNUTLS_DATAGRAM: Connection is datagram oriented (DTLS). Since 3.0.0.
++ * @GNUTLS_NONBLOCK: Connection should not block. Since 3.0.0.
++ * @GNUTLS_NO_SIGNAL: In systems where SIGPIPE is delivered on send, it will be disabled. That flag has effect in systems which support the MSG_NOSIGNAL sockets flag (since 3.4.2).
++ * @GNUTLS_NO_EXTENSIONS: Do not enable any TLS extensions by default (since 3.1.2). As TLS 1.2 and later require extensions this option is considered obsolete and should not be used.
++ * @GNUTLS_NO_REPLAY_PROTECTION: Disable any replay protection in DTLS. This must only be used if  replay protection is achieved using other means. Since 3.2.2.
++ * @GNUTLS_ALLOW_ID_CHANGE: Allow the peer to replace its certificate, or change its ID during a rehandshake. This change is often used in attacks and thus prohibited by default. Since 3.5.0.
++ * @GNUTLS_ENABLE_FALSE_START: Enable the TLS false start on client side if the negotiated ciphersuites allow it. This will enable sending data prior to the handshake being complete, and may introduce a risk of crypto failure when combined with certain key exchanged; for that GnuTLS may not enable that option in ciphersuites that are known to be not safe for false start. Since 3.5.0.
++ * @GNUTLS_ENABLE_EARLY_START: Under TLS1.3 allow the server to return earlier than the full handshake
++ *   finish; similarly to false start the handshake will be completed once data are received by the
++ *   client, while the server is able to transmit sooner. This is not enabled by default as it could
++ *   break certain existing server assumptions and use-cases. Since 3.6.4.
++ * @GNUTLS_ENABLE_EARLY_DATA: Under TLS1.3 allow the server to receive early data sent as part of the initial ClientHello (0-RTT). This is not enabled by default as early data has weaker security properties than other data. Since 3.6.5.
++ * @GNUTLS_FORCE_CLIENT_CERT: When in client side and only a single cert is specified, send that certificate irrespective of the issuers expected by the server. Since 3.5.0.
++ * @GNUTLS_NO_TICKETS: Flag to indicate that the session should not use resumption with session tickets.
++ * @GNUTLS_KEY_SHARE_TOP3: Generate key shares for the top-3 different groups which are enabled.
++ *   That is, as each group is associated with a key type (EC, finite field, x25519), generate
++ *   three keys using %GNUTLS_PK_DH, %GNUTLS_PK_EC, %GNUTLS_PK_ECDH_X25519 if all of them are enabled.
++ * @GNUTLS_KEY_SHARE_TOP2: Generate key shares for the top-2 different groups which are enabled.
++ *   For example (ECDH + x25519). This is the default.
++ * @GNUTLS_KEY_SHARE_TOP: Generate key share for the first group which is enabled.
++ *   For example x25519. This option is the most performant for client (less CPU spent
++ *   generating keys), but if the server doesn't support the advertized option it may
++ *   result to more roundtrips needed to discover the server's choice.
++ * @GNUTLS_NO_AUTO_REKEY: Disable auto-rekeying under TLS1.3. If this option is not specified
++ *   gnutls will force a rekey after 2^24 records have been sent.
++ * @GNUTLS_POST_HANDSHAKE_AUTH: Enable post handshake authentication for server and client. When set and
++ *   a server requests authentication after handshake %GNUTLS_E_REAUTH_REQUEST will be returned
++ *   by gnutls_record_recv(). A client should then call gnutls_reauth() to re-authenticate.
++ * @GNUTLS_SAFE_PADDING_CHECK: Flag to indicate that the TLS 1.3 padding check will be done in a
++ *   safe way which doesn't leak the pad size based on GnuTLS processing time. This is of use to
++ *   applications which hide the length of transferred data via the TLS1.3 padding mechanism and
++ *   are already taking steps to hide the data processing time. This comes at a performance
++ *   penalty.
++ * @GNUTLS_AUTO_REAUTH: Enable transparent re-authentication in client side when the server
++ *    requests to. That is, reauthentication is handled within gnutls_record_recv(), and
++ *    the %GNUTLS_E_REHANDSHAKE or %GNUTLS_E_REAUTH_REQUEST are not returned. This must be
++ *    enabled with %GNUTLS_POST_HANDSHAKE_AUTH for TLS1.3. Enabling this flag requires to restore
++ *    interrupted calls to gnutls_record_recv() based on the output of gnutls_record_get_direction(),
++ *    since gnutls_record_recv() could be interrupted when sending when this flag is enabled.
++ *    Note this flag may not be used if you are using the same session for sending and receiving
++ *    in different threads.
++ * @GNUTLS_ENABLE_EARLY_DATA: Under TLS1.3 allow the server to receive early data sent as part of the initial ClientHello (0-RTT).
++ *    This is not enabled by default as early data has weaker security properties than other data. Since 3.6.5.
++ * @GNUTLS_ENABLE_RAWPK: Allows raw public-keys to be negotiated during the handshake. Since 3.6.6.
++ *
++ * Enumeration of different flags for gnutls_init() function. All the flags
++ * can be combined except @GNUTLS_SERVER and @GNUTLS_CLIENT which are mutually
++ * exclusive.
++ *
++ * The key share options relate to the TLS 1.3 key share extension
++ * which is a speculative key generation expecting that the server
++ * would support the generated key.
++ */
++typedef enum {
++	GNUTLS_SERVER = 1,
++	GNUTLS_CLIENT = (1<<1),
++	GNUTLS_DATAGRAM = (1<<2),
++	GNUTLS_NONBLOCK = (1<<3),
++	GNUTLS_NO_EXTENSIONS = (1<<4),
++	GNUTLS_NO_REPLAY_PROTECTION = (1<<5),
++	GNUTLS_NO_SIGNAL = (1<<6),
++	GNUTLS_ALLOW_ID_CHANGE = (1<<7),
++	GNUTLS_ENABLE_FALSE_START = (1<<8),
++	GNUTLS_FORCE_CLIENT_CERT = (1<<9),
++	GNUTLS_NO_TICKETS = (1<<10),
++	GNUTLS_KEY_SHARE_TOP = (1<<11),
++	GNUTLS_KEY_SHARE_TOP2 = (1<<12),
++	GNUTLS_KEY_SHARE_TOP3 = (1<<13),
++	GNUTLS_POST_HANDSHAKE_AUTH = (1<<14),
++	GNUTLS_NO_AUTO_REKEY = (1<<15),
++	GNUTLS_SAFE_PADDING_CHECK = (1<<16),
++	GNUTLS_ENABLE_EARLY_START = (1<<17),
++	GNUTLS_ENABLE_RAWPK = (1<<18),
++	GNUTLS_AUTO_REAUTH = (1<<19),
++	GNUTLS_ENABLE_EARLY_DATA = (1<<20)
++} gnutls_init_flags_t;
++
++/* compatibility defines (previous versions of gnutls
++ * used defines instead of enumerated values). */
++#define GNUTLS_SERVER (1)
++#define GNUTLS_CLIENT (1<<1)
++#define GNUTLS_DATAGRAM (1<<2)
++#define GNUTLS_NONBLOCK (1<<3)
++#define GNUTLS_NO_EXTENSIONS (1<<4)
++#define GNUTLS_NO_REPLAY_PROTECTION (1<<5)
++#define GNUTLS_NO_SIGNAL (1<<6)
++#define GNUTLS_ALLOW_ID_CHANGE (1<<7)
++#define GNUTLS_ENABLE_FALSE_START (1<<8)
++#define GNUTLS_FORCE_CLIENT_CERT (1<<9)
++#define GNUTLS_NO_TICKETS (1<<10)
++#define GNUTLS_ENABLE_CERT_TYPE_NEG 0
++	// Here for compatibility reasons
++
++/**
++ * gnutls_alert_level_t:
++ * @GNUTLS_AL_WARNING: Alert of warning severity.
++ * @GNUTLS_AL_FATAL: Alert of fatal severity.
++ *
++ * Enumeration of different TLS alert severities.
++ */
++typedef enum {
++	GNUTLS_AL_WARNING = 1,
++	GNUTLS_AL_FATAL
++} gnutls_alert_level_t;
++
++/**
++ * gnutls_alert_description_t:
++ * @GNUTLS_A_CLOSE_NOTIFY: Close notify.
++ * @GNUTLS_A_UNEXPECTED_MESSAGE: Unexpected message.
++ * @GNUTLS_A_BAD_RECORD_MAC: Bad record MAC.
++ * @GNUTLS_A_DECRYPTION_FAILED: Decryption failed.
++ * @GNUTLS_A_RECORD_OVERFLOW: Record overflow.
++ * @GNUTLS_A_DECOMPRESSION_FAILURE: Decompression failed.
++ * @GNUTLS_A_HANDSHAKE_FAILURE: Handshake failed.
++ * @GNUTLS_A_SSL3_NO_CERTIFICATE: No certificate.
++ * @GNUTLS_A_BAD_CERTIFICATE: Certificate is bad.
++ * @GNUTLS_A_UNSUPPORTED_CERTIFICATE: Certificate is not supported.
++ * @GNUTLS_A_CERTIFICATE_REVOKED: Certificate was revoked.
++ * @GNUTLS_A_CERTIFICATE_EXPIRED: Certificate is expired.
++ * @GNUTLS_A_CERTIFICATE_UNKNOWN: Unknown certificate.
++ * @GNUTLS_A_ILLEGAL_PARAMETER: Illegal parameter.
++ * @GNUTLS_A_UNKNOWN_CA: CA is unknown.
++ * @GNUTLS_A_ACCESS_DENIED: Access was denied.
++ * @GNUTLS_A_DECODE_ERROR: Decode error.
++ * @GNUTLS_A_DECRYPT_ERROR: Decrypt error.
++ * @GNUTLS_A_EXPORT_RESTRICTION: Export restriction.
++ * @GNUTLS_A_PROTOCOL_VERSION: Error in protocol version.
++ * @GNUTLS_A_INSUFFICIENT_SECURITY: Insufficient security.
++ * @GNUTLS_A_INTERNAL_ERROR: Internal error.
++ * @GNUTLS_A_INAPPROPRIATE_FALLBACK: Inappropriate fallback,
++ * @GNUTLS_A_USER_CANCELED: User canceled.
++ * @GNUTLS_A_NO_RENEGOTIATION: No renegotiation is allowed.
++ * @GNUTLS_A_MISSING_EXTENSION: An extension was expected but was not seen
++ * @GNUTLS_A_UNSUPPORTED_EXTENSION: An unsupported extension was
++ *   sent.
++ * @GNUTLS_A_CERTIFICATE_UNOBTAINABLE: Could not retrieve the
++ *   specified certificate.
++ * @GNUTLS_A_UNRECOGNIZED_NAME: The server name sent was not
++ *   recognized.
++ * @GNUTLS_A_UNKNOWN_PSK_IDENTITY: The SRP/PSK username is missing
++ *   or not known.
++ * @GNUTLS_A_CERTIFICATE_REQUIRED: Certificate is required.
++ * @GNUTLS_A_NO_APPLICATION_PROTOCOL: The ALPN protocol requested is
++ *   not supported by the peer.
++ *
++ * Enumeration of different TLS alerts.
++ */
++typedef enum {
++	GNUTLS_A_CLOSE_NOTIFY,
++	GNUTLS_A_UNEXPECTED_MESSAGE = 10,
++	GNUTLS_A_BAD_RECORD_MAC = 20,
++	GNUTLS_A_DECRYPTION_FAILED,
++	GNUTLS_A_RECORD_OVERFLOW,
++	GNUTLS_A_DECOMPRESSION_FAILURE = 30,
++	GNUTLS_A_HANDSHAKE_FAILURE = 40,
++	GNUTLS_A_SSL3_NO_CERTIFICATE = 41,
++	GNUTLS_A_BAD_CERTIFICATE = 42,
++	GNUTLS_A_UNSUPPORTED_CERTIFICATE,
++	GNUTLS_A_CERTIFICATE_REVOKED,
++	GNUTLS_A_CERTIFICATE_EXPIRED,
++	GNUTLS_A_CERTIFICATE_UNKNOWN,
++	GNUTLS_A_ILLEGAL_PARAMETER,
++	GNUTLS_A_UNKNOWN_CA,
++	GNUTLS_A_ACCESS_DENIED,
++	GNUTLS_A_DECODE_ERROR = 50,
++	GNUTLS_A_DECRYPT_ERROR,
++	GNUTLS_A_EXPORT_RESTRICTION = 60,
++	GNUTLS_A_PROTOCOL_VERSION = 70,
++	GNUTLS_A_INSUFFICIENT_SECURITY,
++	GNUTLS_A_INTERNAL_ERROR = 80,
++	GNUTLS_A_INAPPROPRIATE_FALLBACK = 86,
++	GNUTLS_A_USER_CANCELED = 90,
++	GNUTLS_A_NO_RENEGOTIATION = 100,
++	GNUTLS_A_MISSING_EXTENSION = 109,
++	GNUTLS_A_UNSUPPORTED_EXTENSION = 110,
++	GNUTLS_A_CERTIFICATE_UNOBTAINABLE = 111,
++	GNUTLS_A_UNRECOGNIZED_NAME = 112,
++	GNUTLS_A_UNKNOWN_PSK_IDENTITY = 115,
++	GNUTLS_A_CERTIFICATE_REQUIRED = 116,
++	GNUTLS_A_NO_APPLICATION_PROTOCOL = 120,
++	GNUTLS_A_MAX = GNUTLS_A_NO_APPLICATION_PROTOCOL
++} gnutls_alert_description_t;
++
++/**
++ * gnutls_handshake_description_t:
++ * @GNUTLS_HANDSHAKE_HELLO_REQUEST: Hello request.
++ * @GNUTLS_HANDSHAKE_HELLO_VERIFY_REQUEST: DTLS Hello verify request.
++ * @GNUTLS_HANDSHAKE_CLIENT_HELLO: Client hello.
++ * @GNUTLS_HANDSHAKE_SERVER_HELLO: Server hello.
++ * @GNUTLS_HANDSHAKE_END_OF_EARLY_DATA: End of early data.
++ * @GNUTLS_HANDSHAKE_HELLO_RETRY_REQUEST: Hello retry request.
++ * @GNUTLS_HANDSHAKE_NEW_SESSION_TICKET: New session ticket.
++ * @GNUTLS_HANDSHAKE_CERTIFICATE_PKT: Certificate packet.
++ * @GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE: Server key exchange.
++ * @GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST: Certificate request.
++ * @GNUTLS_HANDSHAKE_SERVER_HELLO_DONE: Server hello done.
++ * @GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY: Certificate verify.
++ * @GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE: Client key exchange.
++ * @GNUTLS_HANDSHAKE_FINISHED: Finished.
++ * @GNUTLS_HANDSHAKE_CERTIFICATE_STATUS: Certificate status (OCSP).
++ * @GNUTLS_HANDSHAKE_KEY_UPDATE: TLS1.3 key update message.
++ * @GNUTLS_HANDSHAKE_SUPPLEMENTAL: Supplemental.
++ * @GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC: Change Cipher Spec.
++ * @GNUTLS_HANDSHAKE_CLIENT_HELLO_V2: SSLv2 Client Hello.
++ * @GNUTLS_HANDSHAKE_ENCRYPTED_EXTENSIONS: Encrypted extensions message.
++ *
++ * Enumeration of different TLS handshake packets.
++ */
++typedef enum {
++	GNUTLS_HANDSHAKE_HELLO_REQUEST = 0,
++	GNUTLS_HANDSHAKE_CLIENT_HELLO = 1,
++	GNUTLS_HANDSHAKE_SERVER_HELLO = 2,
++	GNUTLS_HANDSHAKE_HELLO_VERIFY_REQUEST = 3,
++	GNUTLS_HANDSHAKE_NEW_SESSION_TICKET = 4,
++	GNUTLS_HANDSHAKE_END_OF_EARLY_DATA = 5,
++	GNUTLS_HANDSHAKE_ENCRYPTED_EXTENSIONS = 8,
++	GNUTLS_HANDSHAKE_CERTIFICATE_PKT = 11,
++	GNUTLS_HANDSHAKE_SERVER_KEY_EXCHANGE = 12,
++	GNUTLS_HANDSHAKE_CERTIFICATE_REQUEST = 13,
++	GNUTLS_HANDSHAKE_SERVER_HELLO_DONE = 14,
++	GNUTLS_HANDSHAKE_CERTIFICATE_VERIFY = 15,
++	GNUTLS_HANDSHAKE_CLIENT_KEY_EXCHANGE = 16,
++	GNUTLS_HANDSHAKE_FINISHED = 20,
++	GNUTLS_HANDSHAKE_CERTIFICATE_STATUS = 22,
++	GNUTLS_HANDSHAKE_SUPPLEMENTAL = 23,
++	GNUTLS_HANDSHAKE_KEY_UPDATE = 24,
++	GNUTLS_HANDSHAKE_CHANGE_CIPHER_SPEC = 254,
++	GNUTLS_HANDSHAKE_CLIENT_HELLO_V2 = 1024,
++	GNUTLS_HANDSHAKE_HELLO_RETRY_REQUEST = 1025,
++} gnutls_handshake_description_t;
++
++#define GNUTLS_HANDSHAKE_ANY ((unsigned int)-1)
++
++const char
++    *gnutls_handshake_description_get_name(gnutls_handshake_description_t
++					   type);
++
++/**
++ * gnutls_certificate_status_t:
++ * @GNUTLS_CERT_INVALID: The certificate is not signed by one of the
++ *   known authorities or the signature is invalid (deprecated by the flags
++ *   %GNUTLS_CERT_SIGNATURE_FAILURE and %GNUTLS_CERT_SIGNER_NOT_FOUND).
++ * @GNUTLS_CERT_SIGNATURE_FAILURE: The signature verification failed.
++ * @GNUTLS_CERT_REVOKED: Certificate is revoked by its authority.  In X.509 this will be
++ *   set only if CRLs are checked.
++ * @GNUTLS_CERT_SIGNER_NOT_FOUND: The certificate's issuer is not known.
++ *   This is the case if the issuer is not included in the trusted certificate list.
++ * @GNUTLS_CERT_SIGNER_NOT_CA: The certificate's signer was not a CA. This
++ *   may happen if this was a version 1 certificate, which is common with
++ *   some CAs, or a version 3 certificate without the basic constrains extension.
++ * @GNUTLS_CERT_SIGNER_CONSTRAINTS_FAILURE: The certificate's signer constraints were
++ *   violated.
++ * @GNUTLS_CERT_INSECURE_ALGORITHM:  The certificate was signed using an insecure
++ *   algorithm such as MD2 or MD5. These algorithms have been broken and
++ *   should not be trusted.
++ * @GNUTLS_CERT_NOT_ACTIVATED: The certificate is not yet activated.
++ * @GNUTLS_CERT_EXPIRED: The certificate has expired.
++ * @GNUTLS_CERT_REVOCATION_DATA_SUPERSEDED: The revocation data are old and have been superseded.
++ * @GNUTLS_CERT_REVOCATION_DATA_ISSUED_IN_FUTURE: The revocation data have a future issue date.
++ * @GNUTLS_CERT_UNEXPECTED_OWNER: The owner is not the expected one.
++ * @GNUTLS_CERT_MISMATCH: The certificate presented isn't the expected one (TOFU)
++ * @GNUTLS_CERT_PURPOSE_MISMATCH: The certificate or an intermediate does not match the intended purpose (extended key usage).
++ * @GNUTLS_CERT_MISSING_OCSP_STATUS: The certificate requires the server to send the certifiate status, but no status was received.
++ * @GNUTLS_CERT_INVALID_OCSP_STATUS: The received OCSP status response is invalid.
++ * @GNUTLS_CERT_UNKNOWN_CRIT_EXTENSIONS: The certificate has extensions marked as critical which are not supported.
++ *
++ * Enumeration of certificate status codes.  Note that the status
++ * bits may have different meanings in OpenPGP keys and X.509
++ * certificate verification.
++ */
++typedef enum {
++	GNUTLS_CERT_INVALID = 1 << 1,
++	GNUTLS_CERT_REVOKED = 1 << 5,
++	GNUTLS_CERT_SIGNER_NOT_FOUND = 1 << 6,
++	GNUTLS_CERT_SIGNER_NOT_CA = 1 << 7,
++	GNUTLS_CERT_INSECURE_ALGORITHM = 1 << 8,
++	GNUTLS_CERT_NOT_ACTIVATED = 1 << 9,
++	GNUTLS_CERT_EXPIRED = 1 << 10,
++	GNUTLS_CERT_SIGNATURE_FAILURE = 1 << 11,
++	GNUTLS_CERT_REVOCATION_DATA_SUPERSEDED = 1 << 12,
++	GNUTLS_CERT_UNEXPECTED_OWNER = 1 << 14,
++	GNUTLS_CERT_REVOCATION_DATA_ISSUED_IN_FUTURE = 1 << 15,
++	GNUTLS_CERT_SIGNER_CONSTRAINTS_FAILURE = 1 << 16,
++	GNUTLS_CERT_MISMATCH = 1 << 17,
++	GNUTLS_CERT_PURPOSE_MISMATCH = 1 << 18,
++	GNUTLS_CERT_MISSING_OCSP_STATUS = 1 << 19,
++	GNUTLS_CERT_INVALID_OCSP_STATUS = 1 << 20,
++	GNUTLS_CERT_UNKNOWN_CRIT_EXTENSIONS = 1 << 21
++} gnutls_certificate_status_t;
++
++/**
++ * gnutls_certificate_request_t:
++ * @GNUTLS_CERT_IGNORE: Ignore certificate.
++ * @GNUTLS_CERT_REQUEST: Request certificate.
++ * @GNUTLS_CERT_REQUIRE: Require certificate.
++ *
++ * Enumeration of certificate request types.
++ */
++typedef enum {
++	GNUTLS_CERT_IGNORE = 0,
++	GNUTLS_CERT_REQUEST = 1,
++	GNUTLS_CERT_REQUIRE = 2
++} gnutls_certificate_request_t;
++
++/**
++ * gnutls_openpgp_crt_status_t:
++ * @GNUTLS_OPENPGP_CERT: Send entire certificate.
++ * @GNUTLS_OPENPGP_CERT_FINGERPRINT: Send only certificate fingerprint.
++ *
++ * Enumeration of ways to send OpenPGP certificate.
++ */
++typedef enum {
++	GNUTLS_OPENPGP_CERT = 0,
++	GNUTLS_OPENPGP_CERT_FINGERPRINT = 1
++} gnutls_openpgp_crt_status_t;
++
++/**
++ * gnutls_close_request_t:
++ * @GNUTLS_SHUT_RDWR: Disallow further receives/sends.
++ * @GNUTLS_SHUT_WR: Disallow further sends.
++ *
++ * Enumeration of how TLS session should be terminated.  See gnutls_bye().
++ */
++typedef enum {
++	GNUTLS_SHUT_RDWR = 0,
++	GNUTLS_SHUT_WR = 1
++} gnutls_close_request_t;
++
++/**
++ * gnutls_protocol_t:
++ * @GNUTLS_SSL3: SSL version 3.0.
++ * @GNUTLS_TLS1_0: TLS version 1.0.
++ * @GNUTLS_TLS1: Same as %GNUTLS_TLS1_0.
++ * @GNUTLS_TLS1_1: TLS version 1.1.
++ * @GNUTLS_TLS1_2: TLS version 1.2.
++ * @GNUTLS_TLS1_3: TLS version 1.3.
++ * @GNUTLS_DTLS1_0: DTLS version 1.0.
++ * @GNUTLS_DTLS1_2: DTLS version 1.2.
++ * @GNUTLS_DTLS0_9: DTLS version 0.9 (Cisco AnyConnect / OpenSSL 0.9.8e).
++ * @GNUTLS_TLS_VERSION_MAX: Maps to the highest supported TLS version.
++ * @GNUTLS_DTLS_VERSION_MAX: Maps to the highest supported DTLS version.
++ * @GNUTLS_VERSION_UNKNOWN: Unknown SSL/TLS version.
++ *
++ * Enumeration of different SSL/TLS protocol versions.
++ */
++typedef enum {
++	GNUTLS_SSL3 = 1,
++	GNUTLS_TLS1_0 = 2,
++	GNUTLS_TLS1 = GNUTLS_TLS1_0,
++	GNUTLS_TLS1_1 = 3,
++	GNUTLS_TLS1_2 = 4,
++	GNUTLS_TLS1_3 = 5,
++
++	GNUTLS_DTLS0_9 = 200,
++	GNUTLS_DTLS1_0 = 201,	/* 201 */
++	GNUTLS_DTLS1_2 = 202,
++	GNUTLS_DTLS_VERSION_MIN = GNUTLS_DTLS0_9,
++	GNUTLS_DTLS_VERSION_MAX = GNUTLS_DTLS1_2,
++	GNUTLS_TLS_VERSION_MAX = GNUTLS_TLS1_3,
++	GNUTLS_VERSION_UNKNOWN = 0xff	/* change it to 0xffff */
++} gnutls_protocol_t;
++
++/**
++ * gnutls_certificate_type_t:
++ * @GNUTLS_CRT_UNKNOWN: Unknown certificate type.
++ * @GNUTLS_CRT_X509: X.509 Certificate.
++ * @GNUTLS_CRT_OPENPGP: OpenPGP certificate.
++ * @GNUTLS_CRT_RAWPK: Raw public-key (SubjectPublicKeyInfo)
++ *
++ * Enumeration of different certificate types.
++ */
++typedef enum {
++	GNUTLS_CRT_UNKNOWN = 0,
++	GNUTLS_CRT_X509 = 1,
++	GNUTLS_CRT_OPENPGP = 2,
++	GNUTLS_CRT_RAWPK = 3,
++	GNUTLS_CRT_MAX = GNUTLS_CRT_RAWPK
++} gnutls_certificate_type_t;
++
++/**
++ * gnutls_x509_crt_fmt_t:
++ * @GNUTLS_X509_FMT_DER: X.509 certificate in DER format (binary).
++ * @GNUTLS_X509_FMT_PEM: X.509 certificate in PEM format (text).
++ *
++ * Enumeration of different certificate encoding formats.
++ */
++typedef enum {
++	GNUTLS_X509_FMT_DER = 0,
++	GNUTLS_X509_FMT_PEM = 1
++} gnutls_x509_crt_fmt_t;
++
++/**
++ * gnutls_certificate_print_formats_t:
++ * @GNUTLS_CRT_PRINT_FULL: Full information about certificate.
++ * @GNUTLS_CRT_PRINT_FULL_NUMBERS: Full information about certificate and include easy to parse public key parameters.
++ * @GNUTLS_CRT_PRINT_COMPACT: Information about certificate name in one line, plus identification of the public key.
++ * @GNUTLS_CRT_PRINT_ONELINE: Information about certificate in one line.
++ * @GNUTLS_CRT_PRINT_UNSIGNED_FULL: All info for an unsigned certificate.
++ *
++ * Enumeration of different certificate printing variants.
++ */
++typedef enum gnutls_certificate_print_formats {
++	GNUTLS_CRT_PRINT_FULL = 0,
++	GNUTLS_CRT_PRINT_ONELINE = 1,
++	GNUTLS_CRT_PRINT_UNSIGNED_FULL = 2,
++	GNUTLS_CRT_PRINT_COMPACT = 3,
++	GNUTLS_CRT_PRINT_FULL_NUMBERS = 4
++} gnutls_certificate_print_formats_t;
++
++#define GNUTLS_PK_ECC GNUTLS_PK_ECDSA
++#define GNUTLS_PK_EC GNUTLS_PK_ECDSA
++
++#define GNUTLS_PK_ECDHX GNUTLS_PK_ECDH_X25519
++/**
++ * gnutls_pk_algorithm_t:
++ * @GNUTLS_PK_UNKNOWN: Unknown public-key algorithm.
++ * @GNUTLS_PK_RSA: RSA public-key algorithm.
++ * @GNUTLS_PK_RSA_PSS: RSA public-key algorithm, with PSS padding.
++ * @GNUTLS_PK_DSA: DSA public-key algorithm.
++ * @GNUTLS_PK_DH: Diffie-Hellman algorithm. Used to generate parameters.
++ * @GNUTLS_PK_ECDSA: Elliptic curve algorithm. These parameters are compatible with the ECDSA and ECDH algorithm.
++ * @GNUTLS_PK_ECDH_X25519: Elliptic curve algorithm, restricted to ECDH as per rfc7748.
++ * @GNUTLS_PK_EDDSA_ED25519: Edwards curve Digital signature algorithm. Used with SHA512 on signatures.
++ * @GNUTLS_PK_GOST_01: GOST R 34.10-2001 algorithm per rfc5832.
++ * @GNUTLS_PK_GOST_12_256: GOST R 34.10-2012 algorithm, 256-bit key per rfc7091.
++ * @GNUTLS_PK_GOST_12_512: GOST R 34.10-2012 algorithm, 512-bit key per rfc7091.
++ *
++ * Enumeration of different public-key algorithms.
++ */
++typedef enum {
++	GNUTLS_PK_UNKNOWN = 0,
++	GNUTLS_PK_RSA = 1,
++	GNUTLS_PK_DSA = 2,
++	GNUTLS_PK_DH = 3,
++	GNUTLS_PK_ECDSA = 4,
++	GNUTLS_PK_ECDH_X25519 = 5,
++	GNUTLS_PK_RSA_PSS = 6,
++	GNUTLS_PK_EDDSA_ED25519 = 7,
++	GNUTLS_PK_GOST_01 = 8,
++	GNUTLS_PK_GOST_12_256 = 9,
++	GNUTLS_PK_GOST_12_512 = 10,
++	GNUTLS_PK_MAX = GNUTLS_PK_GOST_12_512
++} gnutls_pk_algorithm_t;
++
++const char *gnutls_pk_algorithm_get_name(gnutls_pk_algorithm_t algorithm);
++
++/**
++ * gnutls_sign_algorithm_t:
++ * @GNUTLS_SIGN_UNKNOWN: Unknown signature algorithm.
++ * @GNUTLS_SIGN_RSA_RAW: Digital signature algorithm RSA with DigestInfo formatted data
++ * @GNUTLS_SIGN_RSA_SHA1: Digital signature algorithm RSA with SHA-1
++ * @GNUTLS_SIGN_RSA_SHA: Same as %GNUTLS_SIGN_RSA_SHA1.
++ * @GNUTLS_SIGN_DSA_SHA1: Digital signature algorithm DSA with SHA-1
++ * @GNUTLS_SIGN_DSA_SHA224: Digital signature algorithm DSA with SHA-224
++ * @GNUTLS_SIGN_DSA_SHA256: Digital signature algorithm DSA with SHA-256
++ * @GNUTLS_SIGN_DSA_SHA384: Digital signature algorithm DSA with SHA-384
++ * @GNUTLS_SIGN_DSA_SHA512: Digital signature algorithm DSA with SHA-512
++ * @GNUTLS_SIGN_DSA_SHA: Same as %GNUTLS_SIGN_DSA_SHA1.
++ * @GNUTLS_SIGN_RSA_MD5: Digital signature algorithm RSA with MD5.
++ * @GNUTLS_SIGN_RSA_MD2: Digital signature algorithm RSA with MD2.
++ * @GNUTLS_SIGN_RSA_RMD160: Digital signature algorithm RSA with RMD-160.
++ * @GNUTLS_SIGN_RSA_SHA256: Digital signature algorithm RSA with SHA-256.
++ * @GNUTLS_SIGN_RSA_SHA384: Digital signature algorithm RSA with SHA-384.
++ * @GNUTLS_SIGN_RSA_SHA512: Digital signature algorithm RSA with SHA-512.
++ * @GNUTLS_SIGN_RSA_SHA224: Digital signature algorithm RSA with SHA-224.
++ * @GNUTLS_SIGN_ECDSA_SHA1: ECDSA with SHA1.
++ * @GNUTLS_SIGN_ECDSA_SHA224: Digital signature algorithm ECDSA with SHA-224.
++ * @GNUTLS_SIGN_ECDSA_SHA256: Digital signature algorithm ECDSA with SHA-256.
++ * @GNUTLS_SIGN_ECDSA_SHA384: Digital signature algorithm ECDSA with SHA-384.
++ * @GNUTLS_SIGN_ECDSA_SHA512: Digital signature algorithm ECDSA with SHA-512.
++ * @GNUTLS_SIGN_ECDSA_SECP256R1_SHA256: Digital signature algorithm ECDSA-SECP256R1 with SHA-256 (used in TLS 1.3 but not PKIX).
++ * @GNUTLS_SIGN_ECDSA_SECP384R1_SHA384: Digital signature algorithm ECDSA-SECP384R1 with SHA-384 (used in TLS 1.3 but not PKIX).
++ * @GNUTLS_SIGN_ECDSA_SECP521R1_SHA512: Digital signature algorithm ECDSA-SECP521R1 with SHA-512 (used in TLS 1.3 but not PKIX).
++ * @GNUTLS_SIGN_ECDSA_SHA3_224: Digital signature algorithm ECDSA with SHA3-224.
++ * @GNUTLS_SIGN_ECDSA_SHA3_256: Digital signature algorithm ECDSA with SHA3-256.
++ * @GNUTLS_SIGN_ECDSA_SHA3_384: Digital signature algorithm ECDSA with SHA3-384.
++ * @GNUTLS_SIGN_ECDSA_SHA3_512: Digital signature algorithm ECDSA with SHA3-512.
++ * @GNUTLS_SIGN_DSA_SHA3_224: Digital signature algorithm DSA with SHA3-224.
++ * @GNUTLS_SIGN_DSA_SHA3_256: Digital signature algorithm DSA with SHA3-256.
++ * @GNUTLS_SIGN_DSA_SHA3_384: Digital signature algorithm DSA with SHA3-384.
++ * @GNUTLS_SIGN_DSA_SHA3_512: Digital signature algorithm DSA with SHA3-512.
++ * @GNUTLS_SIGN_RSA_SHA3_224: Digital signature algorithm RSA with SHA3-224.
++ * @GNUTLS_SIGN_RSA_SHA3_256: Digital signature algorithm RSA with SHA3-256.
++ * @GNUTLS_SIGN_RSA_SHA3_384: Digital signature algorithm RSA with SHA3-384.
++ * @GNUTLS_SIGN_RSA_SHA3_512: Digital signature algorithm RSA with SHA3-512.
++ * @GNUTLS_SIGN_RSA_PSS_RSAE_SHA256: Digital signature algorithm RSA with SHA-256,
++ *      with PSS padding (RSA PKCS#1 1.5 certificate). This signature is identical
++ *      to #GNUTLS_SIGN_RSA_PSS_SHA256, but they are distinct as the TLS1.3 protocol
++ *      treats them differently.
++ * @GNUTLS_SIGN_RSA_PSS_RSAE_SHA384: Digital signature algorithm RSA with SHA-384,
++ *      with PSS padding (RSA PKCS#1 1.5 certificate). This signature is identical
++ *      to #GNUTLS_SIGN_RSA_PSS_SHA384, but they are distinct as the TLS1.3 protocol
++ *      treats them differently.
++ * @GNUTLS_SIGN_RSA_PSS_RSAE_SHA512: Digital signature algorithm RSA with SHA-512,
++ *      with PSS padding (RSA PKCS#1 1.5 certificate). This signature is identical
++ *      to #GNUTLS_SIGN_RSA_PSS_SHA512, but they are distinct as the TLS1.3 protocol
++ *      treats them differently.
++ * @GNUTLS_SIGN_RSA_PSS_SHA256: Digital signature algorithm RSA with SHA-256, with PSS padding (RSA-PSS certificate).
++ * @GNUTLS_SIGN_RSA_PSS_SHA384: Digital signature algorithm RSA with SHA-384, with PSS padding (RSA-PSS certificate).
++ * @GNUTLS_SIGN_RSA_PSS_SHA512: Digital signature algorithm RSA with SHA-512, with PSS padding (RSA-PSS certificate).
++ * @GNUTLS_SIGN_EDDSA_ED25519: Digital signature algorithm EdDSA with Ed25519 curve.
++ * @GNUTLS_SIGN_GOST_94: Digital signature algorithm GOST R 34.10-2001 with GOST R 34.11-94
++ * @GNUTLS_SIGN_GOST_256: Digital signature algorithm GOST R 34.10-2012 with GOST R 34.11-2012 256 bit
++ * @GNUTLS_SIGN_GOST_512: Digital signature algorithm GOST R 34.10-2012 with GOST R 34.11-2012 512 bit
++ *
++ * Enumeration of different digital signature algorithms.
++ */
++typedef enum {
++	GNUTLS_SIGN_UNKNOWN = 0,
++	GNUTLS_SIGN_RSA_SHA1 = 1,
++	GNUTLS_SIGN_RSA_SHA = GNUTLS_SIGN_RSA_SHA1,
++	GNUTLS_SIGN_DSA_SHA1 = 2,
++	GNUTLS_SIGN_DSA_SHA = GNUTLS_SIGN_DSA_SHA1,
++	GNUTLS_SIGN_RSA_MD5 = 3,
++	GNUTLS_SIGN_RSA_MD2 = 4,
++	GNUTLS_SIGN_RSA_RMD160 = 5,
++	GNUTLS_SIGN_RSA_SHA256 = 6,
++	GNUTLS_SIGN_RSA_SHA384 = 7,
++	GNUTLS_SIGN_RSA_SHA512 = 8,
++	GNUTLS_SIGN_RSA_SHA224 = 9,
++	GNUTLS_SIGN_DSA_SHA224 = 10,
++	GNUTLS_SIGN_DSA_SHA256 = 11,
++	GNUTLS_SIGN_ECDSA_SHA1 = 12,
++	GNUTLS_SIGN_ECDSA_SHA224 = 13,
++	GNUTLS_SIGN_ECDSA_SHA256 = 14,
++	GNUTLS_SIGN_ECDSA_SHA384 = 15,
++	GNUTLS_SIGN_ECDSA_SHA512 = 16,
++	GNUTLS_SIGN_DSA_SHA384 = 17,
++	GNUTLS_SIGN_DSA_SHA512 = 18,
++	GNUTLS_SIGN_ECDSA_SHA3_224 = 20,
++	GNUTLS_SIGN_ECDSA_SHA3_256 = 21,
++	GNUTLS_SIGN_ECDSA_SHA3_384 = 22,
++	GNUTLS_SIGN_ECDSA_SHA3_512 = 23,
++
++	GNUTLS_SIGN_DSA_SHA3_224 = 24,
++	GNUTLS_SIGN_DSA_SHA3_256 = 25,
++	GNUTLS_SIGN_DSA_SHA3_384 = 26,
++	GNUTLS_SIGN_DSA_SHA3_512 = 27,
++	GNUTLS_SIGN_RSA_SHA3_224 = 28,
++	GNUTLS_SIGN_RSA_SHA3_256 = 29,
++	GNUTLS_SIGN_RSA_SHA3_384 = 30,
++	GNUTLS_SIGN_RSA_SHA3_512 = 31,
++
++	GNUTLS_SIGN_RSA_PSS_SHA256 = 32,
++	GNUTLS_SIGN_RSA_PSS_SHA384 = 33,
++	GNUTLS_SIGN_RSA_PSS_SHA512 = 34,
++	GNUTLS_SIGN_EDDSA_ED25519 = 35,
++	GNUTLS_SIGN_RSA_RAW = 36,
++
++	GNUTLS_SIGN_ECDSA_SECP256R1_SHA256 = 37,
++	GNUTLS_SIGN_ECDSA_SECP384R1_SHA384 = 38,
++	GNUTLS_SIGN_ECDSA_SECP521R1_SHA512 = 39,
++
++	GNUTLS_SIGN_RSA_PSS_RSAE_SHA256 = 40,
++	GNUTLS_SIGN_RSA_PSS_RSAE_SHA384 = 41,
++	GNUTLS_SIGN_RSA_PSS_RSAE_SHA512 = 42,
++
++	GNUTLS_SIGN_GOST_94 = 43,
++	GNUTLS_SIGN_GOST_256 = 44,
++	GNUTLS_SIGN_GOST_512 = 45,
++	GNUTLS_SIGN_MAX = GNUTLS_SIGN_GOST_512
++} gnutls_sign_algorithm_t;
++
++/**
++ * gnutls_ecc_curve_t:
++ * @GNUTLS_ECC_CURVE_INVALID: Cannot be known
++ * @GNUTLS_ECC_CURVE_SECP192R1: the SECP192R1 curve
++ * @GNUTLS_ECC_CURVE_SECP224R1: the SECP224R1 curve
++ * @GNUTLS_ECC_CURVE_SECP256R1: the SECP256R1 curve
++ * @GNUTLS_ECC_CURVE_SECP384R1: the SECP384R1 curve
++ * @GNUTLS_ECC_CURVE_SECP521R1: the SECP521R1 curve
++ * @GNUTLS_ECC_CURVE_X25519: the X25519 curve (ECDH only)
++ * @GNUTLS_ECC_CURVE_ED25519: the Ed25519 curve
++ * @GNUTLS_ECC_CURVE_GOST256CPA: GOST R 34.10 CryptoPro 256 A curve
++ * @GNUTLS_ECC_CURVE_GOST256CPB: GOST R 34.10 CryptoPro 256 B curve
++ * @GNUTLS_ECC_CURVE_GOST256CPC: GOST R 34.10 CryptoPro 256 C curve
++ * @GNUTLS_ECC_CURVE_GOST256CPXA: GOST R 34.10 CryptoPro 256 XchA curve
++ * @GNUTLS_ECC_CURVE_GOST256CPXB: GOST R 34.10 CryptoPro 256 XchB curve
++ * @GNUTLS_ECC_CURVE_GOST512A: GOST R 34.10 TC26 512 A curve
++ * @GNUTLS_ECC_CURVE_GOST512B: GOST R 34.10 TC26 512 B curve
++ *
++ * Enumeration of ECC curves.
++ */
++typedef enum {
++	GNUTLS_ECC_CURVE_INVALID = 0,
++	GNUTLS_ECC_CURVE_SECP224R1,
++	GNUTLS_ECC_CURVE_SECP256R1,
++	GNUTLS_ECC_CURVE_SECP384R1,
++	GNUTLS_ECC_CURVE_SECP521R1,
++	GNUTLS_ECC_CURVE_SECP192R1,
++	GNUTLS_ECC_CURVE_X25519,
++	GNUTLS_ECC_CURVE_ED25519,
++	GNUTLS_ECC_CURVE_GOST256CPA,
++	GNUTLS_ECC_CURVE_GOST256CPB,
++	GNUTLS_ECC_CURVE_GOST256CPC,
++	GNUTLS_ECC_CURVE_GOST256CPXA,
++	GNUTLS_ECC_CURVE_GOST256CPXB,
++	GNUTLS_ECC_CURVE_GOST512A,
++	GNUTLS_ECC_CURVE_GOST512B,
++	GNUTLS_ECC_CURVE_MAX = GNUTLS_ECC_CURVE_GOST512B
++} gnutls_ecc_curve_t;
++
++/**
++ * gnutls_group_t:
++ * @GNUTLS_GROUP_INVALID: Indicates unknown/invalid group
++ * @GNUTLS_GROUP_SECP192R1: the SECP192R1 curve group (legacy, only for TLS 1.2 compatibility)
++ * @GNUTLS_GROUP_SECP224R1: the SECP224R1 curve group (legacy, only for TLS 1.2 compatibility)
++ * @GNUTLS_GROUP_SECP256R1: the SECP256R1 curve group
++ * @GNUTLS_GROUP_SECP384R1: the SECP384R1 curve group
++ * @GNUTLS_GROUP_SECP521R1: the SECP521R1 curve group
++ * @GNUTLS_GROUP_X25519: the X25519 curve group
++ * @GNUTLS_GROUP_FFDHE2048: the FFDHE2048 group
++ * @GNUTLS_GROUP_FFDHE3072: the FFDHE3072 group
++ * @GNUTLS_GROUP_FFDHE4096: the FFDHE4096 group
++ * @GNUTLS_GROUP_FFDHE6144: the FFDHE6144 group
++ * @GNUTLS_GROUP_FFDHE8192: the FFDHE8192 group
++ *
++ * Enumeration of supported groups. It is intended to be backwards
++ * compatible with the enumerations in %gnutls_ecc_curve_t for the groups
++ * which are valid elliptic curves.
++ */
++typedef enum {
++	GNUTLS_GROUP_INVALID = 0,
++	GNUTLS_GROUP_SECP192R1 = GNUTLS_ECC_CURVE_SECP192R1,
++	GNUTLS_GROUP_SECP224R1 = GNUTLS_ECC_CURVE_SECP224R1,
++	GNUTLS_GROUP_SECP256R1 = GNUTLS_ECC_CURVE_SECP256R1,
++	GNUTLS_GROUP_SECP384R1 = GNUTLS_ECC_CURVE_SECP384R1,
++	GNUTLS_GROUP_SECP521R1 = GNUTLS_ECC_CURVE_SECP521R1,
++	GNUTLS_GROUP_X25519 = GNUTLS_ECC_CURVE_X25519,
++
++	GNUTLS_GROUP_FFDHE2048 = 256,
++	GNUTLS_GROUP_FFDHE3072,
++	GNUTLS_GROUP_FFDHE4096,
++	GNUTLS_GROUP_FFDHE8192,
++	GNUTLS_GROUP_FFDHE6144,
++	GNUTLS_GROUP_MAX = GNUTLS_GROUP_FFDHE6144,
++} gnutls_group_t;
++
++/* macros to allow specifying a specific curve in gnutls_privkey_generate()
++ * and gnutls_x509_privkey_generate() */
++#define GNUTLS_CURVE_TO_BITS(curve) (unsigned int)(((unsigned int)1<<31)|((unsigned int)(curve)))
++#define GNUTLS_BITS_TO_CURVE(bits) (((unsigned int)(bits)) & 0x7FFFFFFF)
++#define GNUTLS_BITS_ARE_CURVE(bits) (((unsigned int)(bits)) & 0x80000000)
++
++/**
++ * gnutls_sec_param_t:
++ * @GNUTLS_SEC_PARAM_UNKNOWN: Cannot be known
++ * @GNUTLS_SEC_PARAM_INSECURE: Less than 42 bits of security
++ * @GNUTLS_SEC_PARAM_EXPORT: 42 bits of security
++ * @GNUTLS_SEC_PARAM_VERY_WEAK: 64 bits of security
++ * @GNUTLS_SEC_PARAM_WEAK: 72 bits of security
++ * @GNUTLS_SEC_PARAM_LOW: 80 bits of security
++ * @GNUTLS_SEC_PARAM_LEGACY: 96 bits of security
++ * @GNUTLS_SEC_PARAM_MEDIUM: 112 bits of security (used to be %GNUTLS_SEC_PARAM_NORMAL)
++ * @GNUTLS_SEC_PARAM_HIGH: 128 bits of security
++ * @GNUTLS_SEC_PARAM_ULTRA: 192 bits of security
++ * @GNUTLS_SEC_PARAM_FUTURE: 256 bits of security
++ *
++ * Enumeration of security parameters for passive attacks.
++ */
++typedef enum {
++	GNUTLS_SEC_PARAM_UNKNOWN = 0,
++	GNUTLS_SEC_PARAM_INSECURE = 5,
++	GNUTLS_SEC_PARAM_EXPORT = 10,
++	GNUTLS_SEC_PARAM_VERY_WEAK = 15,
++	GNUTLS_SEC_PARAM_WEAK = 20,
++	GNUTLS_SEC_PARAM_LOW = 25,
++	GNUTLS_SEC_PARAM_LEGACY = 30,
++	GNUTLS_SEC_PARAM_MEDIUM = 35,
++	GNUTLS_SEC_PARAM_HIGH = 40,
++	GNUTLS_SEC_PARAM_ULTRA = 45,
++	GNUTLS_SEC_PARAM_FUTURE = 50,
++	GNUTLS_SEC_PARAM_MAX = GNUTLS_SEC_PARAM_FUTURE
++} gnutls_sec_param_t;
++
++/* old name */
++#define GNUTLS_SEC_PARAM_NORMAL GNUTLS_SEC_PARAM_MEDIUM
++
++/**
++ * gnutls_channel_binding_t:
++ * @GNUTLS_CB_TLS_UNIQUE: "tls-unique" (RFC 5929) channel binding
++ *
++ * Enumeration of support channel binding types.
++ */
++typedef enum {
++	GNUTLS_CB_TLS_UNIQUE
++} gnutls_channel_binding_t;
++
++/**
++ * gnutls_gost_paramset_t:
++ * @GNUTLS_GOST_PARAMSET_UNKNOWN: Unknown/default parameter set
++ * @GNUTLS_GOST_PARAMSET_TC26_Z: Specified by TC26, see rfc7836
++ * @GNUTLS_GOST_PARAMSET_CP_A: CryptoPro-A, see rfc4357
++ * @GNUTLS_GOST_PARAMSET_CP_B: CryptoPro-B, see rfc4357
++ * @GNUTLS_GOST_PARAMSET_CP_C: CryptoPro-C, see rfc4357
++ * @GNUTLS_GOST_PARAMSET_CP_D: CryptoPro-D, see rfc4357
++ *
++ * Enumeration of different GOST 28147 parameter sets.
++ */
++typedef enum {
++	GNUTLS_GOST_PARAMSET_UNKNOWN = 0,
++	GNUTLS_GOST_PARAMSET_TC26_Z,
++	GNUTLS_GOST_PARAMSET_CP_A,
++	GNUTLS_GOST_PARAMSET_CP_B,
++	GNUTLS_GOST_PARAMSET_CP_C,
++	GNUTLS_GOST_PARAMSET_CP_D
++} gnutls_gost_paramset_t;
++
++/**
++ * gnutls_ctype_target_t:
++ * @GNUTLS_CTYPE_CLIENT: for requesting client certificate type values.
++ * @GNUTLS_CTYPE_SERVER: for requesting server certificate type values.
++ * @GNUTLS_CTYPE_OURS: for requesting our certificate type values.
++ * @GNUTLS_CTYPE_PEERS: for requesting the peers' certificate type values.
++ *
++ * Enumeration of certificate type targets with respect to asymmetric
++ * certificate types as specified in RFC7250 and P2P connection set up
++ * as specified in draft-vanrein-tls-symmetry-02.
++ */
++typedef enum {
++	GNUTLS_CTYPE_CLIENT,
++	GNUTLS_CTYPE_SERVER,
++	GNUTLS_CTYPE_OURS,
++	GNUTLS_CTYPE_PEERS
++} gnutls_ctype_target_t;
++
++/* If you want to change this, then also change the define in
++ * gnutls_int.h, and recompile.
++ */
++typedef void *gnutls_transport_ptr_t;
++
++struct gnutls_session_int;
++typedef struct gnutls_session_int *gnutls_session_t;
++
++struct gnutls_dh_params_int;
++typedef struct gnutls_dh_params_int *gnutls_dh_params_t;
++
++  /* XXX ugly. */
++struct gnutls_x509_privkey_int;
++typedef struct gnutls_x509_privkey_int *gnutls_rsa_params_t;
++
++struct gnutls_priority_st;
++typedef struct gnutls_priority_st *gnutls_priority_t;
++
++typedef struct {
++	unsigned char *data;
++	unsigned int size;
++} gnutls_datum_t;
++
++typedef struct gnutls_params_st {
++	gnutls_params_type_t type;
++	union params {
++		gnutls_dh_params_t dh;
++		gnutls_rsa_params_t rsa_export;
++	} params;
++	int deinit;
++} gnutls_params_st;
++
++typedef int gnutls_params_function(gnutls_session_t, gnutls_params_type_t,
++				   gnutls_params_st *);
++
++/* internal functions */
++
++int gnutls_init(gnutls_session_t * session, unsigned int flags);
++void gnutls_deinit(gnutls_session_t session);
++#define _gnutls_deinit(x) gnutls_deinit(x)
++
++int gnutls_bye(gnutls_session_t session, gnutls_close_request_t how);
++
++int gnutls_handshake(gnutls_session_t session);
++
++int gnutls_reauth(gnutls_session_t session, unsigned int flags);
++
++#define GNUTLS_DEFAULT_HANDSHAKE_TIMEOUT ((unsigned int)-1)
++#define GNUTLS_INDEFINITE_TIMEOUT ((unsigned int)-2)
++void gnutls_handshake_set_timeout(gnutls_session_t session,
++				  unsigned int ms);
++int gnutls_rehandshake(gnutls_session_t session);
++
++#define GNUTLS_KU_PEER 1
++int gnutls_session_key_update(gnutls_session_t session, unsigned flags);
++
++gnutls_alert_description_t gnutls_alert_get(gnutls_session_t session);
++int gnutls_alert_send(gnutls_session_t session,
++		      gnutls_alert_level_t level,
++		      gnutls_alert_description_t desc);
++int gnutls_alert_send_appropriate(gnutls_session_t session, int err);
++const char *gnutls_alert_get_name(gnutls_alert_description_t alert);
++const char *gnutls_alert_get_strname(gnutls_alert_description_t alert);
++
++gnutls_sec_param_t gnutls_pk_bits_to_sec_param(gnutls_pk_algorithm_t algo,
++					       unsigned int bits);
++const char *gnutls_sec_param_get_name(gnutls_sec_param_t param);
++unsigned int gnutls_sec_param_to_pk_bits(gnutls_pk_algorithm_t algo,
++					 gnutls_sec_param_t param);
++unsigned int
++	gnutls_sec_param_to_symmetric_bits(gnutls_sec_param_t param) __GNUTLS_CONST__;
++
++/* Elliptic curves */
++const char *
++	gnutls_ecc_curve_get_name(gnutls_ecc_curve_t curve) __GNUTLS_CONST__;
++const char *
++	gnutls_ecc_curve_get_oid(gnutls_ecc_curve_t curve) __GNUTLS_CONST__;
++
++const char *
++	gnutls_group_get_name(gnutls_group_t group) __GNUTLS_CONST__;
++
++int
++	gnutls_ecc_curve_get_size(gnutls_ecc_curve_t curve) __GNUTLS_CONST__;
++gnutls_ecc_curve_t gnutls_ecc_curve_get(gnutls_session_t session);
++
++gnutls_group_t gnutls_group_get(gnutls_session_t session);
++
++/* get information on the current session */
++gnutls_cipher_algorithm_t gnutls_cipher_get(gnutls_session_t session);
++gnutls_kx_algorithm_t gnutls_kx_get(gnutls_session_t session);
++gnutls_mac_algorithm_t gnutls_mac_get(gnutls_session_t session);
++gnutls_certificate_type_t
++gnutls_certificate_type_get(gnutls_session_t session);
++gnutls_certificate_type_t
++gnutls_certificate_type_get2(gnutls_session_t session,
++								gnutls_ctype_target_t target);
++
++int gnutls_sign_algorithm_get(gnutls_session_t session);
++int gnutls_sign_algorithm_get_client(gnutls_session_t session);
++
++int gnutls_sign_algorithm_get_requested(gnutls_session_t session,
++					size_t indx,
++					gnutls_sign_algorithm_t * algo);
++
++/* the name of the specified algorithms */
++const char *
++	gnutls_cipher_get_name(gnutls_cipher_algorithm_t algorithm) __GNUTLS_CONST__;
++const char *
++	gnutls_mac_get_name(gnutls_mac_algorithm_t algorithm) __GNUTLS_CONST__;
++
++const char *
++	gnutls_digest_get_name(gnutls_digest_algorithm_t algorithm) __GNUTLS_CONST__;
++const char *
++	gnutls_digest_get_oid(gnutls_digest_algorithm_t algorithm) __GNUTLS_CONST__;
++
++const char *
++	gnutls_kx_get_name(gnutls_kx_algorithm_t algorithm) __GNUTLS_CONST__;
++const char *
++	gnutls_certificate_type_get_name(gnutls_certificate_type_t
++					     type) __GNUTLS_CONST__;
++const char *
++	gnutls_pk_get_name(gnutls_pk_algorithm_t algorithm) __GNUTLS_CONST__;
++const char *
++	gnutls_pk_get_oid(gnutls_pk_algorithm_t algorithm) __GNUTLS_CONST__;
++
++const char *
++	gnutls_sign_get_name(gnutls_sign_algorithm_t algorithm) __GNUTLS_CONST__;
++
++const char *gnutls_sign_get_oid(gnutls_sign_algorithm_t sign) __GNUTLS_CONST__;
++
++const char *
++	gnutls_gost_paramset_get_name(gnutls_gost_paramset_t param) __GNUTLS_CONST__;
++const char *
++	gnutls_gost_paramset_get_oid(gnutls_gost_paramset_t param) __GNUTLS_CONST__;
++
++size_t
++	gnutls_cipher_get_key_size(gnutls_cipher_algorithm_t algorithm) __GNUTLS_CONST__;
++size_t
++	gnutls_mac_get_key_size(gnutls_mac_algorithm_t algorithm) __GNUTLS_CONST__;
++
++unsigned gnutls_sign_is_secure(gnutls_sign_algorithm_t algorithm) __GNUTLS_CONST__;
++
++/* It is possible that a signature algorithm is ok to use for short-lived
++ * data (e.g., to sign a TLS session), but not for data that are long-lived
++ * like certificates. This flag is about checking the security of the algorithm
++ * for long-lived data. */
++#define GNUTLS_SIGN_FLAG_SECURE_FOR_CERTS 1
++unsigned gnutls_sign_is_secure2(gnutls_sign_algorithm_t algorithm, unsigned int flags) __GNUTLS_CONST__;
++
++gnutls_digest_algorithm_t
++	gnutls_sign_get_hash_algorithm(gnutls_sign_algorithm_t sign) __GNUTLS_CONST__;
++gnutls_pk_algorithm_t
++	gnutls_sign_get_pk_algorithm(gnutls_sign_algorithm_t sign) __GNUTLS_CONST__;
++gnutls_sign_algorithm_t
++	gnutls_pk_to_sign(gnutls_pk_algorithm_t pk,
++		  gnutls_digest_algorithm_t hash) __GNUTLS_CONST__;
++
++unsigned
++gnutls_sign_supports_pk_algorithm(gnutls_sign_algorithm_t sign, gnutls_pk_algorithm_t pk) __GNUTLS_CONST__;
++
++#define gnutls_sign_algorithm_get_name gnutls_sign_get_name
++
++gnutls_mac_algorithm_t gnutls_mac_get_id(const char *name) __GNUTLS_CONST__;
++gnutls_digest_algorithm_t gnutls_digest_get_id(const char *name) __GNUTLS_CONST__;
++
++gnutls_cipher_algorithm_t
++	gnutls_cipher_get_id(const char *name) __GNUTLS_CONST__;
++
++gnutls_kx_algorithm_t
++	gnutls_kx_get_id(const char *name) __GNUTLS_CONST__;
++gnutls_protocol_t
++	gnutls_protocol_get_id(const char *name) __GNUTLS_CONST__;
++gnutls_certificate_type_t
++	gnutls_certificate_type_get_id(const char *name) __GNUTLS_CONST__;
++gnutls_pk_algorithm_t
++	gnutls_pk_get_id(const char *name) __GNUTLS_CONST__;
++gnutls_sign_algorithm_t
++	gnutls_sign_get_id(const char *name) __GNUTLS_CONST__;
++gnutls_ecc_curve_t gnutls_ecc_curve_get_id(const char *name)  __GNUTLS_CONST__;
++gnutls_pk_algorithm_t gnutls_ecc_curve_get_pk(gnutls_ecc_curve_t curve) __GNUTLS_CONST__;
++gnutls_group_t gnutls_group_get_id(const char *name);
++
++gnutls_digest_algorithm_t
++	gnutls_oid_to_digest(const char *oid)  __GNUTLS_CONST__;
++gnutls_mac_algorithm_t
++	gnutls_oid_to_mac(const char *oid)  __GNUTLS_CONST__;
++gnutls_pk_algorithm_t
++	gnutls_oid_to_pk(const char *oid) __GNUTLS_CONST__;
++gnutls_sign_algorithm_t
++	gnutls_oid_to_sign(const char *oid) __GNUTLS_CONST__;
++gnutls_ecc_curve_t
++	gnutls_oid_to_ecc_curve(const char *oid) __GNUTLS_CONST__;
++gnutls_gost_paramset_t
++	gnutls_oid_to_gost_paramset(const char *oid) __GNUTLS_CONST__;
++
++  /* list supported algorithms */
++const gnutls_ecc_curve_t *
++	gnutls_ecc_curve_list(void)  __GNUTLS_PURE__;
++const gnutls_group_t *
++	gnutls_group_list(void)  __GNUTLS_PURE__;
++const gnutls_cipher_algorithm_t *
++	gnutls_cipher_list(void) __GNUTLS_PURE__;
++const gnutls_mac_algorithm_t *
++	gnutls_mac_list(void) __GNUTLS_PURE__;
++const gnutls_digest_algorithm_t *
++	gnutls_digest_list(void) __GNUTLS_PURE__;
++const gnutls_protocol_t *
++	gnutls_protocol_list(void) __GNUTLS_PURE__;
++const gnutls_certificate_type_t *
++	gnutls_certificate_type_list(void) __GNUTLS_PURE__;
++const gnutls_kx_algorithm_t *
++	gnutls_kx_list(void) __GNUTLS_PURE__;
++const gnutls_pk_algorithm_t *
++	gnutls_pk_list(void) __GNUTLS_PURE__;
++const gnutls_sign_algorithm_t *
++	gnutls_sign_list(void) __GNUTLS_PURE__;
++const char *
++	gnutls_cipher_suite_info(size_t idx,
++			         unsigned char *cs_id,
++				 gnutls_kx_algorithm_t * kx,
++				 gnutls_cipher_algorithm_t * cipher,
++				 gnutls_mac_algorithm_t * mac,
++				 gnutls_protocol_t * min_version);
++
++  /* error functions */
++int gnutls_error_is_fatal(int error) __GNUTLS_CONST__;
++int gnutls_error_to_alert(int err, int *level);
++
++void gnutls_perror(int error);
++const char * gnutls_strerror(int error) __GNUTLS_CONST__;
++const char * gnutls_strerror_name(int error) __GNUTLS_CONST__;
++
++/* Semi-internal functions.
++ */
++void gnutls_handshake_set_private_extensions(gnutls_session_t session,
++					     int allow);
++int gnutls_handshake_set_random(gnutls_session_t session,
++				const gnutls_datum_t * random);
++
++gnutls_handshake_description_t
++gnutls_handshake_get_last_out(gnutls_session_t session);
++gnutls_handshake_description_t
++gnutls_handshake_get_last_in(gnutls_session_t session);
++
++/* Record layer functions.
++ */
++#define GNUTLS_HEARTBEAT_WAIT 1
++int gnutls_heartbeat_ping(gnutls_session_t session, size_t data_size,
++			  unsigned int max_tries, unsigned int flags);
++int gnutls_heartbeat_pong(gnutls_session_t session, unsigned int flags);
++
++void gnutls_record_set_timeout(gnutls_session_t session, unsigned int ms);
++void gnutls_record_disable_padding(gnutls_session_t session);
++
++void gnutls_record_cork(gnutls_session_t session);
++#define GNUTLS_RECORD_WAIT 1
++int gnutls_record_uncork(gnutls_session_t session, unsigned int flags);
++size_t gnutls_record_discard_queued(gnutls_session_t session);
++
++int
++gnutls_record_get_state(gnutls_session_t session,
++			unsigned read,
++			gnutls_datum_t *mac_key,
++			gnutls_datum_t *IV,
++			gnutls_datum_t *cipher_key,
++			unsigned char seq_number[8]);
++
++int
++gnutls_record_set_state(gnutls_session_t session,
++			unsigned read,
++			unsigned char seq_number[8]);
++
++typedef struct {
++	size_t low;
++	size_t high;
++} gnutls_range_st;
++
++int gnutls_range_split(gnutls_session_t session,
++		       const gnutls_range_st * orig,
++		       gnutls_range_st * small_range,
++		       gnutls_range_st * rem_range);
++
++ssize_t gnutls_record_send(gnutls_session_t session, const void *data,
++			   size_t data_size);
++ssize_t gnutls_record_send2(gnutls_session_t session, const void *data,
++			   size_t data_size, size_t pad, unsigned flags);
++ssize_t gnutls_record_send_range(gnutls_session_t session,
++				 const void *data, size_t data_size,
++				 const gnutls_range_st * range);
++ssize_t gnutls_record_recv(gnutls_session_t session, void *data,
++			   size_t data_size);
++
++typedef struct mbuffer_st *gnutls_packet_t;
++
++ssize_t
++gnutls_record_recv_packet(gnutls_session_t session,
++			  gnutls_packet_t *packet);
++
++void gnutls_packet_get(gnutls_packet_t packet, gnutls_datum_t *data, unsigned char *sequence);
++void gnutls_packet_deinit(gnutls_packet_t packet);
++
++#define gnutls_read gnutls_record_recv
++#define gnutls_write gnutls_record_send
++ssize_t gnutls_record_recv_seq(gnutls_session_t session, void *data,
++			       size_t data_size, unsigned char *seq);
++
++size_t gnutls_record_overhead_size(gnutls_session_t session);
++
++size_t
++	gnutls_est_record_overhead_size(gnutls_protocol_t version,
++				        gnutls_cipher_algorithm_t cipher,
++				        gnutls_mac_algorithm_t mac,
++				        gnutls_compression_method_t comp,
++				        unsigned int flags) __GNUTLS_CONST__;
++
++void gnutls_session_enable_compatibility_mode(gnutls_session_t session);
++#define gnutls_record_set_max_empty_records(session, x)
++
++int gnutls_record_can_use_length_hiding(gnutls_session_t session);
++
++int gnutls_record_get_direction(gnutls_session_t session);
++
++size_t gnutls_record_get_max_size(gnutls_session_t session);
++ssize_t gnutls_record_set_max_size(gnutls_session_t session, size_t size);
++
++size_t gnutls_record_check_pending(gnutls_session_t session);
++size_t gnutls_record_check_corked(gnutls_session_t session);
++
++size_t gnutls_record_get_max_early_data_size(gnutls_session_t session);
++int gnutls_record_set_max_early_data_size(gnutls_session_t session, size_t size);
++ssize_t gnutls_record_send_early_data(gnutls_session_t session,
++				      const void *data,
++				      size_t length);
++ssize_t gnutls_record_recv_early_data(gnutls_session_t session,
++				      void *data,
++				      size_t data_size);
++
++void gnutls_session_force_valid(gnutls_session_t session);
++
++int gnutls_prf(gnutls_session_t session,
++	       size_t label_size, const char *label,
++	       int server_random_first,
++	       size_t extra_size, const char *extra,
++	       size_t outsize, char *out);
++int gnutls_prf_rfc5705(gnutls_session_t session,
++	       size_t label_size, const char *label,
++	       size_t context_size, const char *context,
++	       size_t outsize, char *out);
++
++int gnutls_prf_raw(gnutls_session_t session,
++		   size_t label_size, const char *label,
++		   size_t seed_size, const char *seed,
++		   size_t outsize, char *out);
++
++/**
++ * gnutls_server_name_type_t:
++ * @GNUTLS_NAME_DNS: Domain Name System name type.
++ *
++ * Enumeration of different server name types.
++ */
++typedef enum {
++	GNUTLS_NAME_DNS = 1
++} gnutls_server_name_type_t;
++
++int gnutls_server_name_set(gnutls_session_t session,
++			   gnutls_server_name_type_t type,
++			   const void *name, size_t name_length);
++
++int gnutls_server_name_get(gnutls_session_t session,
++			   void *data, size_t * data_length,
++			   unsigned int *type, unsigned int indx);
++
++unsigned int gnutls_heartbeat_get_timeout(gnutls_session_t session);
++void gnutls_heartbeat_set_timeouts(gnutls_session_t session,
++				   unsigned int retrans_timeout,
++				   unsigned int total_timeout);
++
++#define GNUTLS_HB_PEER_ALLOWED_TO_SEND (1)
++#define GNUTLS_HB_PEER_NOT_ALLOWED_TO_SEND (1<<1)
++
++  /* Heartbeat */
++void gnutls_heartbeat_enable(gnutls_session_t session, unsigned int type);
++
++#define GNUTLS_HB_LOCAL_ALLOWED_TO_SEND (1<<2)
++unsigned gnutls_heartbeat_allowed(gnutls_session_t session, unsigned int type);
++
++  /* Safe renegotiation */
++unsigned gnutls_safe_renegotiation_status(gnutls_session_t session);
++unsigned gnutls_session_ext_master_secret_status(gnutls_session_t session);
++unsigned gnutls_session_etm_status(gnutls_session_t session);
++
++/**
++ * gnutls_session_flags_t:
++ * @GNUTLS_SFLAGS_SAFE_RENEGOTIATION: Safe renegotiation (RFC5746) was used
++ * @GNUTLS_SFLAGS_EXT_MASTER_SECRET: The extended master secret (RFC7627) extension was used
++ * @GNUTLS_SFLAGS_ETM: The encrypt then MAC (RFC7366) extension was used
++ * @GNUTLS_SFLAGS_RFC7919: The RFC7919 Diffie-Hellman parameters were negotiated
++ * @GNUTLS_SFLAGS_HB_LOCAL_SEND: The heartbeat negotiation allows the local side to send heartbeat messages
++ * @GNUTLS_SFLAGS_HB_PEER_SEND: The heartbeat negotiation allows the peer to send heartbeat messages
++ * @GNUTLS_SFLAGS_FALSE_START: False start was used in this client session.
++ * @GNUTLS_SFLAGS_SESSION_TICKET: A session ticket has been received by the server.
++ * @GNUTLS_SFLAGS_POST_HANDSHAKE_AUTH: Indicates client capability for post-handshake auth; set only on server side.
++ * @GNUTLS_SFLAGS_EARLY_START: The TLS1.3 server session returned early.
++ * @GNUTLS_SFLAGS_EARLY_DATA: The TLS1.3 early data has been received by the server.
++ *
++ * Enumeration of different session parameters.
++ */
++typedef enum {
++	GNUTLS_SFLAGS_SAFE_RENEGOTIATION = 1,
++	GNUTLS_SFLAGS_EXT_MASTER_SECRET = 1<<1,
++	GNUTLS_SFLAGS_ETM = 1<<2,
++	GNUTLS_SFLAGS_HB_LOCAL_SEND = 1<<3,
++	GNUTLS_SFLAGS_HB_PEER_SEND = 1<<4,
++	GNUTLS_SFLAGS_FALSE_START = 1<<5,
++	GNUTLS_SFLAGS_RFC7919 = 1<<6,
++	GNUTLS_SFLAGS_SESSION_TICKET = 1<<7,
++	GNUTLS_SFLAGS_POST_HANDSHAKE_AUTH = 1<<8,
++	GNUTLS_SFLAGS_EARLY_START = 1<<9,
++	GNUTLS_SFLAGS_EARLY_DATA = 1<<10
++} gnutls_session_flags_t;
++
++unsigned gnutls_session_get_flags(gnutls_session_t session);
++
++/**
++ * gnutls_supplemental_data_format_type_t:
++ * @GNUTLS_SUPPLEMENTAL_UNKNOWN: Unknown data format
++ *
++ * Enumeration of different supplemental data types (RFC 4680).
++ */
++typedef enum {
++	GNUTLS_SUPPLEMENTAL_UNKNOWN = 0,
++} gnutls_supplemental_data_format_type_t;
++
++const char
++*gnutls_supplemental_get_name(gnutls_supplemental_data_format_type_t type);
++
++  /* SessionTicket, RFC 5077. */
++int gnutls_session_ticket_key_generate(gnutls_datum_t * key);
++int gnutls_session_ticket_enable_client(gnutls_session_t session);
++int gnutls_session_ticket_enable_server(gnutls_session_t session,
++					const gnutls_datum_t * key);
++
++int gnutls_session_ticket_send(gnutls_session_t session, unsigned nr, unsigned flags);
++
++  /* SRTP, RFC 5764 */
++
++/**
++ * gnutls_srtp_profile_t:
++ * @GNUTLS_SRTP_AES128_CM_HMAC_SHA1_80: 128 bit AES with a 80 bit HMAC-SHA1
++ * @GNUTLS_SRTP_AES128_CM_HMAC_SHA1_32: 128 bit AES with a 32 bit HMAC-SHA1
++ * @GNUTLS_SRTP_NULL_HMAC_SHA1_80: NULL cipher with a 80 bit HMAC-SHA1
++ * @GNUTLS_SRTP_NULL_HMAC_SHA1_32: NULL cipher with a 32 bit HMAC-SHA1
++ *
++ * Enumeration of different SRTP protection profiles.
++ */
++typedef enum {
++	GNUTLS_SRTP_AES128_CM_HMAC_SHA1_80 = 0x0001,
++	GNUTLS_SRTP_AES128_CM_HMAC_SHA1_32 = 0x0002,
++	GNUTLS_SRTP_NULL_HMAC_SHA1_80 = 0x0005,
++	GNUTLS_SRTP_NULL_HMAC_SHA1_32 = 0x0006
++} gnutls_srtp_profile_t;
++
++int gnutls_srtp_set_profile(gnutls_session_t session,
++			    gnutls_srtp_profile_t profile);
++int gnutls_srtp_set_profile_direct(gnutls_session_t session,
++				   const char *profiles,
++				   const char **err_pos);
++int gnutls_srtp_get_selected_profile(gnutls_session_t session,
++				     gnutls_srtp_profile_t * profile);
++
++const char *gnutls_srtp_get_profile_name(gnutls_srtp_profile_t profile);
++int gnutls_srtp_get_profile_id(const char *name,
++			       gnutls_srtp_profile_t * profile);
++int gnutls_srtp_get_keys(gnutls_session_t session,
++			 void *key_material,
++			 unsigned int key_material_size,
++			 gnutls_datum_t * client_key,
++			 gnutls_datum_t * client_salt,
++			 gnutls_datum_t * server_key,
++			 gnutls_datum_t * server_salt);
++
++int gnutls_srtp_set_mki(gnutls_session_t session,
++			const gnutls_datum_t * mki);
++int gnutls_srtp_get_mki(gnutls_session_t session, gnutls_datum_t * mki);
++
++/* ALPN TLS extension */
++
++/**
++ * gnutls_alpn_flags_t:
++ * @GNUTLS_ALPN_MANDATORY: Require ALPN negotiation. The connection will be
++ *   aborted if no matching ALPN protocol is found.
++ * @GNUTLS_ALPN_SERVER_PRECEDENCE: The choices set by the server
++ *   will take precedence over the client's.
++ *
++ * Enumeration of different ALPN flags. These are used by gnutls_alpn_set_protocols().
++ */
++typedef enum {
++	GNUTLS_ALPN_MANDATORY = 1,
++	GNUTLS_ALPN_SERVER_PRECEDENCE = (1<<1)
++} gnutls_alpn_flags_t;
++
++#define GNUTLS_ALPN_MAND GNUTLS_ALPN_MANDATORY
++int gnutls_alpn_get_selected_protocol(gnutls_session_t session,
++				      gnutls_datum_t * protocol);
++int gnutls_alpn_set_protocols(gnutls_session_t session,
++			      const gnutls_datum_t * protocols,
++			      unsigned protocols_size, unsigned flags);
++
++int gnutls_key_generate(gnutls_datum_t * key, unsigned int key_size);
++
++#define GNUTLS_PRIORITY_INIT_DEF_APPEND 1
++int gnutls_priority_init(gnutls_priority_t * priority_cache,
++			 const char *priorities, const char **err_pos);
++int gnutls_priority_init2(gnutls_priority_t * priority_cache,
++			  const char *priorities, const char **err_pos,
++			  unsigned flags);
++void gnutls_priority_deinit(gnutls_priority_t priority_cache);
++int gnutls_priority_get_cipher_suite_index(gnutls_priority_t pcache,
++					   unsigned int idx,
++					   unsigned int *sidx);
++
++#define GNUTLS_PRIORITY_LIST_INIT_KEYWORDS 1
++#define GNUTLS_PRIORITY_LIST_SPECIAL 2
++const char *
++gnutls_priority_string_list(unsigned iter, unsigned int flags);
++
++int gnutls_priority_set(gnutls_session_t session,
++			gnutls_priority_t priority);
++
++int gnutls_priority_set_direct(gnutls_session_t session,
++			       const char *priorities,
++			       const char **err_pos);
++
++int gnutls_priority_certificate_type_list(gnutls_priority_t pcache,
++					  const unsigned int **list);
++int gnutls_priority_certificate_type_list2(gnutls_priority_t pcache,
++					  const unsigned int **list,
++					  gnutls_ctype_target_t target);
++int gnutls_priority_sign_list(gnutls_priority_t pcache,
++			      const unsigned int **list);
++int gnutls_priority_protocol_list(gnutls_priority_t pcache,
++				  const unsigned int **list);
++int gnutls_priority_ecc_curve_list(gnutls_priority_t pcache,
++				   const unsigned int **list);
++int
++gnutls_priority_group_list(gnutls_priority_t pcache,
++			   const unsigned int **list);
++
++int gnutls_priority_kx_list(gnutls_priority_t pcache,
++			    const unsigned int **list);
++int gnutls_priority_cipher_list(gnutls_priority_t pcache,
++				const unsigned int **list);
++int gnutls_priority_mac_list(gnutls_priority_t pcache,
++			     const unsigned int **list);
++
++int gnutls_set_default_priority(gnutls_session_t session);
++int gnutls_set_default_priority_append(gnutls_session_t session,
++				       const char *add_prio,
++				       const char **err_pos,
++				       unsigned flags);
++
++/* Returns the name of a cipher suite */
++const char *
++	gnutls_cipher_suite_get_name(gnutls_kx_algorithm_t kx_algorithm,
++				     gnutls_cipher_algorithm_t cipher_algorithm,
++				     gnutls_mac_algorithm_t mac_algorithm) __GNUTLS_CONST__;
++
++/* get the currently used protocol version */
++gnutls_protocol_t gnutls_protocol_get_version(gnutls_session_t session);
++
++const char *
++	gnutls_protocol_get_name(gnutls_protocol_t version) __GNUTLS_CONST__;
++
++/* get/set session
++ */
++int gnutls_session_set_data(gnutls_session_t session,
++			    const void *session_data,
++			    size_t session_data_size);
++int gnutls_session_get_data(gnutls_session_t session, void *session_data,
++			    size_t * session_data_size);
++int gnutls_session_get_data2(gnutls_session_t session,
++			     gnutls_datum_t * data);
++void gnutls_session_get_random(gnutls_session_t session,
++			       gnutls_datum_t * client,
++			       gnutls_datum_t * server);
++
++void gnutls_session_get_master_secret(gnutls_session_t session,
++			              gnutls_datum_t * secret);
++
++char *gnutls_session_get_desc(gnutls_session_t session);
++
++typedef int gnutls_certificate_verify_function(gnutls_session_t);
++void gnutls_session_set_verify_function(gnutls_session_t session, gnutls_certificate_verify_function * func);
++
++/**
++ * gnutls_vdata_types_t:
++ * @GNUTLS_DT_UNKNOWN: Unknown data type.
++ * @GNUTLS_DT_DNS_HOSTNAME: The data contain a null-terminated DNS hostname; the hostname will be
++ *   matched using the RFC6125 rules. If the data contain a textual IP (v4 or v6) address it will
++ *   be marched against the IPAddress Alternative name, unless the verification flag %GNUTLS_VERIFY_DO_NOT_ALLOW_IP_MATCHES
++ *   is specified.
++ * @GNUTLS_DT_IP_ADDRESS: The data contain a raw IP address (4 or 16 bytes). If will be matched
++ *   against the IPAddress Alternative name; option available since 3.6.0.
++ * @GNUTLS_DT_RFC822NAME: The data contain a null-terminated email address; the email will be
++ *   matched against the RFC822Name Alternative name of the certificate, or the EMAIL DN component if the
++ *   former isn't available. Prior to matching the email address will be converted to ACE
++ *   (ASCII-compatible-encoding).
++ * @GNUTLS_DT_KEY_PURPOSE_OID: The data contain a null-terminated key purpose OID. It will be matched
++ *   against the certificate's Extended Key Usage extension.
++ *
++ * Enumeration of different typed-data options. They are used as input to certificate
++ * verification functions to provide information about the name and purpose of the
++ * certificate. Only a single option of a type can be provided to the relevant functions
++ * (i.e., options %GNUTLS_DT_DNS_HOSTNAME, %GNUTLS_DT_IP_ADDRESS and
++ * %GNUTLS_DT_RFC822NAME cannot be combined).
++ */
++typedef enum {
++	GNUTLS_DT_UNKNOWN = 0,
++	GNUTLS_DT_DNS_HOSTNAME = 1,
++	GNUTLS_DT_KEY_PURPOSE_OID = 2,
++	GNUTLS_DT_RFC822NAME = 3,
++	GNUTLS_DT_IP_ADDRESS = 4
++} gnutls_vdata_types_t;
++
++typedef struct {
++	gnutls_vdata_types_t type;
++	unsigned char *data;
++	unsigned int size;
++} gnutls_typed_vdata_st;
++
++void gnutls_session_set_verify_cert(gnutls_session_t session,
++			       const char *hostname, unsigned flags);
++
++void
++gnutls_session_set_verify_cert2(gnutls_session_t session,
++				gnutls_typed_vdata_st * data,
++				unsigned elements, unsigned flags);
++
++unsigned int gnutls_session_get_verify_cert_status(gnutls_session_t);
++
++int gnutls_session_set_premaster(gnutls_session_t session,
++				 unsigned int entity,
++				 gnutls_protocol_t version,
++				 gnutls_kx_algorithm_t kx,
++				 gnutls_cipher_algorithm_t cipher,
++				 gnutls_mac_algorithm_t mac,
++				 gnutls_compression_method_t comp,
++				 const gnutls_datum_t * master,
++				 const gnutls_datum_t * session_id);
++
++/* returns the session ID */
++#define GNUTLS_MAX_SESSION_ID 32
++int gnutls_session_get_id(gnutls_session_t session, void *session_id,
++			  size_t * session_id_size);
++int gnutls_session_get_id2(gnutls_session_t session,
++			   gnutls_datum_t * session_id);
++
++int gnutls_session_set_id(gnutls_session_t session,
++			  const gnutls_datum_t * sid);
++
++int gnutls_session_channel_binding(gnutls_session_t session,
++				   gnutls_channel_binding_t cbtype,
++				   gnutls_datum_t * cb);
++
++/* checks if this session is a resumed one
++ */
++int gnutls_session_is_resumed(gnutls_session_t session);
++int gnutls_session_resumption_requested(gnutls_session_t session);
++
++typedef int (*gnutls_db_store_func) (void *, gnutls_datum_t key,
++				     gnutls_datum_t data);
++typedef int (*gnutls_db_remove_func) (void *, gnutls_datum_t key);
++typedef gnutls_datum_t(*gnutls_db_retr_func) (void *, gnutls_datum_t key);
++
++void gnutls_db_set_cache_expiration(gnutls_session_t session, int seconds);
++unsigned gnutls_db_get_default_cache_expiration(void);
++
++void gnutls_db_remove_session(gnutls_session_t session);
++void gnutls_db_set_retrieve_function(gnutls_session_t session,
++				     gnutls_db_retr_func retr_func);
++void gnutls_db_set_remove_function(gnutls_session_t session,
++				   gnutls_db_remove_func rem_func);
++void gnutls_db_set_store_function(gnutls_session_t session,
++				  gnutls_db_store_func store_func);
++void gnutls_db_set_ptr(gnutls_session_t session, void *ptr);
++void *gnutls_db_get_ptr(gnutls_session_t session);
++int gnutls_db_check_entry(gnutls_session_t session,
++			  gnutls_datum_t session_entry);
++time_t gnutls_db_check_entry_time(gnutls_datum_t * entry);
++time_t gnutls_db_check_entry_expire_time(gnutls_datum_t * entry);
++
++  /**
++   * gnutls_handshake_hook_func:
++   * @session: the current session
++   * @htype: the type of the handshake message (%gnutls_handshake_description_t)
++   * @when: non zero if this is a post-process/generation call and zero otherwise
++   * @incoming: non zero if this is an incoming message and zero if this is an outgoing message
++   * @msg: the (const) data of the handshake message without the handshake headers.
++   *
++   * Function prototype for handshake hooks. It is set using
++   * gnutls_handshake_set_hook_function().
++   *
++   * Returns: Non zero on error.
++   */
++#define GNUTLS_HOOK_POST (1)
++#define GNUTLS_HOOK_PRE (0)
++#define GNUTLS_HOOK_BOTH (-1)
++
++typedef int (*gnutls_handshake_hook_func) (gnutls_session_t,
++					   unsigned int htype,
++					   unsigned when,
++					   unsigned int incoming,
++					   const gnutls_datum_t *msg);
++void gnutls_handshake_set_hook_function(gnutls_session_t session,
++					unsigned int htype, int when,
++					gnutls_handshake_hook_func func);
++
++#define gnutls_handshake_post_client_hello_func gnutls_handshake_simple_hook_func
++typedef int (*gnutls_handshake_simple_hook_func) (gnutls_session_t);
++void
++gnutls_handshake_set_post_client_hello_function(gnutls_session_t session,
++						gnutls_handshake_simple_hook_func func);
++
++void gnutls_handshake_set_max_packet_length(gnutls_session_t session,
++					    size_t max);
++
++/* returns libgnutls version (call it with a NULL argument)
++ */
++const char * gnutls_check_version(const char *req_version) __GNUTLS_CONST__;
++
++/* A macro which will allow optimizing out calls to gnutls_check_version()
++ * when the version being compiled with is sufficient.
++ * Used as:
++ *   if (gnutls_check_version_numerc(3,3,16)) {
++ */
++#define gnutls_check_version_numeric(a,b,c) \
++	((GNUTLS_VERSION_MAJOR >= (a)) &&  \
++	 ((GNUTLS_VERSION_NUMBER >= ( ((a) << 16) + ((b) << 8) + (c) )) || \
++	 gnutls_check_version(#a "." #b "." #c)))
++
++/* Functions for setting/clearing credentials
++ */
++void gnutls_credentials_clear(gnutls_session_t session);
++
++/* cred is a structure defined by the kx algorithm
++ */
++int gnutls_credentials_set(gnutls_session_t session,
++			   gnutls_credentials_type_t type, void *cred);
++int gnutls_credentials_get(gnutls_session_t session,
++			   gnutls_credentials_type_t type, void **cred);
++#define gnutls_cred_set	gnutls_credentials_set
++
++/* x.509 types */
++
++struct gnutls_pubkey_st;
++typedef struct gnutls_pubkey_st *gnutls_pubkey_t;
++
++struct gnutls_privkey_st;
++typedef struct gnutls_privkey_st *gnutls_privkey_t;
++
++struct gnutls_x509_privkey_int;
++typedef struct gnutls_x509_privkey_int *gnutls_x509_privkey_t;
++
++struct gnutls_x509_crl_int;
++typedef struct gnutls_x509_crl_int *gnutls_x509_crl_t;
++
++struct gnutls_x509_crt_int;
++typedef struct gnutls_x509_crt_int *gnutls_x509_crt_t;
++
++struct gnutls_x509_crq_int;
++typedef struct gnutls_x509_crq_int *gnutls_x509_crq_t;
++
++struct gnutls_openpgp_keyring_int;
++typedef struct gnutls_openpgp_keyring_int *gnutls_openpgp_keyring_t;
++
++/* Credential structures - used in gnutls_credentials_set(); */
++
++struct gnutls_certificate_credentials_st;
++typedef struct gnutls_certificate_credentials_st
++*gnutls_certificate_credentials_t;
++typedef gnutls_certificate_credentials_t
++    gnutls_certificate_server_credentials;
++typedef gnutls_certificate_credentials_t
++    gnutls_certificate_client_credentials;
++
++typedef struct gnutls_anon_server_credentials_st
++*gnutls_anon_server_credentials_t;
++typedef struct gnutls_anon_client_credentials_st
++*gnutls_anon_client_credentials_t;
++
++void gnutls_anon_free_server_credentials(gnutls_anon_server_credentials_t
++					 sc);
++int
++gnutls_anon_allocate_server_credentials(gnutls_anon_server_credentials_t
++					* sc);
++
++void gnutls_anon_set_server_dh_params(gnutls_anon_server_credentials_t res,
++				      gnutls_dh_params_t dh_params);
++
++int
++gnutls_anon_set_server_known_dh_params(gnutls_anon_server_credentials_t res,
++					gnutls_sec_param_t sec_param);
++
++void
++gnutls_anon_set_server_params_function(gnutls_anon_server_credentials_t
++				       res, gnutls_params_function * func);
++
++void
++gnutls_anon_free_client_credentials(gnutls_anon_client_credentials_t sc);
++int
++gnutls_anon_allocate_client_credentials(gnutls_anon_client_credentials_t
++					* sc);
++
++/* CERTFILE is an x509 certificate in PEM form.
++ * KEYFILE is a pkcs-1 private key in PEM form (for RSA keys).
++ */
++void
++gnutls_certificate_free_credentials(gnutls_certificate_credentials_t sc);
++int
++gnutls_certificate_allocate_credentials(gnutls_certificate_credentials_t
++					* res);
++
++int
++gnutls_certificate_get_issuer(gnutls_certificate_credentials_t sc,
++			      gnutls_x509_crt_t cert,
++			      gnutls_x509_crt_t * issuer,
++			      unsigned int flags);
++
++int gnutls_certificate_get_crt_raw(gnutls_certificate_credentials_t sc,
++				   unsigned idx1, unsigned idx2,
++				   gnutls_datum_t * cert);
++
++void gnutls_certificate_free_keys(gnutls_certificate_credentials_t sc);
++void gnutls_certificate_free_cas(gnutls_certificate_credentials_t sc);
++void gnutls_certificate_free_ca_names(gnutls_certificate_credentials_t sc);
++void gnutls_certificate_free_crls(gnutls_certificate_credentials_t sc);
++
++void gnutls_certificate_set_dh_params(gnutls_certificate_credentials_t res,
++				      gnutls_dh_params_t dh_params);
++
++int gnutls_certificate_set_known_dh_params(gnutls_certificate_credentials_t res,
++					   gnutls_sec_param_t sec_param);
++void gnutls_certificate_set_verify_flags(gnutls_certificate_credentials_t
++					 res, unsigned int flags);
++unsigned int
++gnutls_certificate_get_verify_flags(gnutls_certificate_credentials_t res);
++
++/**
++ * gnutls_certificate_flags:
++ * @GNUTLS_CERTIFICATE_SKIP_KEY_CERT_MATCH: Skip the key and certificate matching check.
++ * @GNUTLS_CERTIFICATE_API_V2: If set the gnutls_certificate_set_*key* functions will return an index of the added key pair instead of zero.
++ * @GNUTLS_CERTIFICATE_SKIP_OCSP_RESPONSE_CHECK: If set, the gnutls_certificate_set_ocsp_status_request_file
++ *    function, will not check whether the response set matches any of the certificates.
++ * @GNUTLS_CERTIFICATE_VERIFY_CRLS: This will enable CRL verification when added in the certificate structure.
++ *    When used, it requires CAs to be added before CRLs.
++ *
++ * Enumeration of different certificate credentials flags.
++ */
++typedef enum gnutls_certificate_flags {
++	GNUTLS_CERTIFICATE_SKIP_KEY_CERT_MATCH = 1,
++	GNUTLS_CERTIFICATE_API_V2 = (1<<1),
++	GNUTLS_CERTIFICATE_SKIP_OCSP_RESPONSE_CHECK = (1<<2),
++	GNUTLS_CERTIFICATE_VERIFY_CRLS = (1<<3)
++} gnutls_certificate_flags;
++
++void gnutls_certificate_set_flags(gnutls_certificate_credentials_t,
++				  unsigned flags);
++
++void gnutls_certificate_set_verify_limits(gnutls_certificate_credentials_t
++					  res, unsigned int max_bits,
++					  unsigned int max_depth);
++
++int
++gnutls_certificate_set_x509_system_trust(gnutls_certificate_credentials_t
++					 cred);
++
++int
++gnutls_certificate_set_x509_trust_file(gnutls_certificate_credentials_t
++				       cred, const char *cafile,
++				       gnutls_x509_crt_fmt_t type);
++int
++gnutls_certificate_set_x509_trust_dir(gnutls_certificate_credentials_t cred,
++				      const char *ca_dir,
++				      gnutls_x509_crt_fmt_t type);
++
++int gnutls_certificate_set_x509_trust_mem(gnutls_certificate_credentials_t
++					  res, const gnutls_datum_t * ca,
++					  gnutls_x509_crt_fmt_t type);
++
++int
++gnutls_certificate_set_x509_crl_file(gnutls_certificate_credentials_t
++				     res, const char *crlfile,
++				     gnutls_x509_crt_fmt_t type);
++int gnutls_certificate_set_x509_crl_mem(gnutls_certificate_credentials_t
++					res, const gnutls_datum_t * CRL,
++					gnutls_x509_crt_fmt_t type);
++
++int
++gnutls_certificate_set_x509_key_file(gnutls_certificate_credentials_t
++				     res, const char *certfile,
++				     const char *keyfile,
++				     gnutls_x509_crt_fmt_t type);
++
++int
++gnutls_certificate_set_x509_key_file2(gnutls_certificate_credentials_t
++				      res, const char *certfile,
++				      const char *keyfile,
++				      gnutls_x509_crt_fmt_t type,
++				      const char *pass,
++				      unsigned int flags);
++
++int gnutls_certificate_set_x509_key_mem(gnutls_certificate_credentials_t
++					res, const gnutls_datum_t * cert,
++					const gnutls_datum_t * key,
++					gnutls_x509_crt_fmt_t type);
++
++int gnutls_certificate_set_x509_key_mem2(gnutls_certificate_credentials_t
++					 res, const gnutls_datum_t * cert,
++					 const gnutls_datum_t * key,
++					 gnutls_x509_crt_fmt_t type,
++					 const char *pass,
++					 unsigned int flags);
++
++void gnutls_certificate_send_x509_rdn_sequence(gnutls_session_t session,
++					       int status);
++
++int
++gnutls_certificate_set_x509_simple_pkcs12_file
++(gnutls_certificate_credentials_t res, const char *pkcs12file,
++ gnutls_x509_crt_fmt_t type, const char *password);
++int
++gnutls_certificate_set_x509_simple_pkcs12_mem
++(gnutls_certificate_credentials_t res, const gnutls_datum_t * p12blob,
++ gnutls_x509_crt_fmt_t type, const char *password);
++
++/* New functions to allow setting already parsed X.509 stuff.
++ */
++
++int gnutls_certificate_set_x509_key(gnutls_certificate_credentials_t res,
++				    gnutls_x509_crt_t * cert_list,
++				    int cert_list_size,
++				    gnutls_x509_privkey_t key);
++int gnutls_certificate_set_x509_trust(gnutls_certificate_credentials_t res,
++				      gnutls_x509_crt_t * ca_list,
++				      int ca_list_size);
++int gnutls_certificate_set_x509_crl(gnutls_certificate_credentials_t res,
++				    gnutls_x509_crl_t * crl_list,
++				    int crl_list_size);
++
++int gnutls_certificate_get_x509_key(gnutls_certificate_credentials_t res,
++                                    unsigned index,
++                                    gnutls_x509_privkey_t *key);
++int gnutls_certificate_get_x509_crt(gnutls_certificate_credentials_t res,
++                                    unsigned index,
++                                    gnutls_x509_crt_t **crt_list,
++                                    unsigned *crt_list_size);
++
++  /* OCSP status request extension, RFC 6066 */
++typedef int (*gnutls_status_request_ocsp_func)
++ (gnutls_session_t session, void *ptr, gnutls_datum_t *ocsp_response);
++
++void
++gnutls_certificate_set_ocsp_status_request_function
++(gnutls_certificate_credentials_t res,
++gnutls_status_request_ocsp_func ocsp_func, void *ptr);
++
++int
++gnutls_certificate_set_ocsp_status_request_function2
++(gnutls_certificate_credentials_t res, unsigned idx,
++gnutls_status_request_ocsp_func ocsp_func, void *ptr);
++
++int
++gnutls_certificate_set_ocsp_status_request_file
++(gnutls_certificate_credentials_t res, const char *response_file,
++ unsigned idx);
++
++int
++gnutls_certificate_set_ocsp_status_request_file2
++(gnutls_certificate_credentials_t res, const char *response_file,
++ unsigned idx, gnutls_x509_crt_fmt_t fmt);
++
++int
++gnutls_certificate_set_ocsp_status_request_mem
++(gnutls_certificate_credentials_t res, const gnutls_datum_t *resp,
++ unsigned idx, gnutls_x509_crt_fmt_t fmt);
++
++typedef struct gnutls_ocsp_data_st {
++	unsigned int version; /* must be zero */
++	gnutls_datum_t response;
++	time_t exptime;
++	unsigned char padding[32];
++} gnutls_ocsp_data_st;
++
++time_t
++gnutls_certificate_get_ocsp_expiration(gnutls_certificate_credentials_t sc,
++				       unsigned idx,
++				       int oidx,
++				       unsigned flags);
++
++int gnutls_ocsp_status_request_enable_client(gnutls_session_t session,
++					     gnutls_datum_t * responder_id,
++					     size_t responder_id_size,
++					     gnutls_datum_t *
++					     request_extensions);
++
++int gnutls_ocsp_status_request_get(gnutls_session_t session,
++				   gnutls_datum_t * response);
++
++#define GNUTLS_OCSP_SR_IS_AVAIL 1
++int gnutls_ocsp_status_request_is_checked(gnutls_session_t session,
++					  unsigned int flags);
++
++int
++gnutls_ocsp_status_request_get2(gnutls_session_t session,
++			        unsigned idx,
++			        gnutls_datum_t * response);
++
++/* RAW public key functions (RFC7250) */
++int gnutls_certificate_set_rawpk_key_mem(gnutls_certificate_credentials_t cred,
++				    const gnutls_datum_t* spki,
++				    const gnutls_datum_t* pkey,
++				    gnutls_x509_crt_fmt_t format,
++				    const char* pass,
++				    unsigned int key_usage,
++				    const char **names,
++				    unsigned int names_length,
++				    unsigned int flags);
++
++int gnutls_certificate_set_rawpk_key_file(gnutls_certificate_credentials_t cred,
++				      const char* rawpkfile,
++				      const char* privkeyfile,
++				      gnutls_x509_crt_fmt_t format,
++				      const char *pass,
++				      unsigned int key_usage,
++				      const char **names,
++				      unsigned int names_length,
++				      unsigned int privkey_flags,
++				      unsigned int pkcs11_flags);
++
++/* global state functions
++ */
++int gnutls_global_init(void);
++void gnutls_global_deinit(void);
++
++  /**
++   * gnutls_time_func:
++   * @t: where to store time.
++   *
++   * Function prototype for time()-like function.  Set with
++   * gnutls_global_set_time_function().
++   *
++   * Returns: Number of seconds since the epoch, or (time_t)-1 on errors.
++   */
++typedef time_t(*gnutls_time_func) (time_t * t);
++
++typedef int (*mutex_init_func) (void **mutex);
++typedef int (*mutex_lock_func) (void **mutex);
++typedef int (*mutex_unlock_func) (void **mutex);
++typedef int (*mutex_deinit_func) (void **mutex);
++
++void gnutls_global_set_mutex(mutex_init_func init,
++			     mutex_deinit_func deinit,
++			     mutex_lock_func lock,
++			     mutex_unlock_func unlock);
++
++typedef void *(*gnutls_alloc_function) (size_t);
++typedef void *(*gnutls_calloc_function) (size_t, size_t);
++typedef int (*gnutls_is_secure_function) (const void *);
++typedef void (*gnutls_free_function) (void *);
++typedef void *(*gnutls_realloc_function) (void *, size_t);
++
++void gnutls_global_set_time_function(gnutls_time_func time_func);
++
++/* For use in callbacks */
++extern _SYM_EXPORT gnutls_alloc_function gnutls_malloc;
++extern _SYM_EXPORT gnutls_realloc_function gnutls_realloc;
++extern _SYM_EXPORT gnutls_calloc_function gnutls_calloc;
++extern _SYM_EXPORT gnutls_free_function gnutls_free;
++
++#ifdef GNUTLS_INTERNAL_BUILD
++#define gnutls_free(a) gnutls_free((void *) (a)), a=NULL
++#endif
++
++extern _SYM_EXPORT char *(*gnutls_strdup) (const char *);
++
++/* a variant of memset that doesn't get optimized out */
++void gnutls_memset(void *data, int c, size_t size);
++
++/* constant time memcmp */
++int gnutls_memcmp(const void *s1, const void *s2, size_t n);
++
++typedef void (*gnutls_log_func) (int, const char *);
++typedef void (*gnutls_audit_log_func) (gnutls_session_t, const char *);
++void gnutls_global_set_log_function(gnutls_log_func log_func);
++void gnutls_global_set_audit_log_function(gnutls_audit_log_func log_func);
++void gnutls_global_set_log_level(int level);
++
++/* Diffie-Hellman parameter handling.
++ */
++int gnutls_dh_params_init(gnutls_dh_params_t * dh_params);
++void gnutls_dh_params_deinit(gnutls_dh_params_t dh_params);
++int gnutls_dh_params_import_raw(gnutls_dh_params_t dh_params,
++				const gnutls_datum_t * prime,
++				const gnutls_datum_t * generator);
++int gnutls_dh_params_import_dsa(gnutls_dh_params_t dh_params, gnutls_x509_privkey_t key);
++int gnutls_dh_params_import_raw2(gnutls_dh_params_t dh_params,
++				 const gnutls_datum_t * prime,
++				 const gnutls_datum_t * generator,
++				 unsigned key_bits);
++int gnutls_dh_params_import_pkcs3(gnutls_dh_params_t params,
++				  const gnutls_datum_t * pkcs3_params,
++				  gnutls_x509_crt_fmt_t format);
++int gnutls_dh_params_generate2(gnutls_dh_params_t params,
++			       unsigned int bits);
++int gnutls_dh_params_export_pkcs3(gnutls_dh_params_t params,
++				  gnutls_x509_crt_fmt_t format,
++				  unsigned char *params_data,
++				  size_t * params_data_size);
++int gnutls_dh_params_export2_pkcs3(gnutls_dh_params_t params,
++				   gnutls_x509_crt_fmt_t format,
++				   gnutls_datum_t * out);
++int gnutls_dh_params_export_raw(gnutls_dh_params_t params,
++				gnutls_datum_t * prime,
++				gnutls_datum_t * generator,
++				unsigned int *bits);
++int gnutls_dh_params_cpy(gnutls_dh_params_t dst, gnutls_dh_params_t src);
++
++/* Session stuff
++ */
++typedef struct {
++    void *iov_base;
++    size_t iov_len;
++} giovec_t;
++
++typedef ssize_t(*gnutls_pull_func) (gnutls_transport_ptr_t, void *,
++				    size_t);
++typedef ssize_t(*gnutls_push_func) (gnutls_transport_ptr_t, const void *,
++				    size_t);
++
++int gnutls_system_recv_timeout(gnutls_transport_ptr_t ptr, unsigned int ms);
++typedef int (*gnutls_pull_timeout_func) (gnutls_transport_ptr_t,
++					 unsigned int ms);
++
++typedef ssize_t(*gnutls_vec_push_func) (gnutls_transport_ptr_t,
++					const giovec_t * iov, int iovcnt);
++
++typedef int (*gnutls_errno_func) (gnutls_transport_ptr_t);
++
++#if 0
++ /* This will be defined as macro. */
++  void gnutls_transport_set_int (gnutls_session_t session, int r);
++#endif
++
++void gnutls_transport_set_int2(gnutls_session_t session, int r, int s);
++#define gnutls_transport_set_int(s, i) gnutls_transport_set_int2(s, i, i)
++
++void gnutls_transport_get_int2(gnutls_session_t session, int *r, int *s);
++int gnutls_transport_get_int(gnutls_session_t session);
++
++void gnutls_transport_set_ptr(gnutls_session_t session,
++			      gnutls_transport_ptr_t ptr);
++void gnutls_transport_set_ptr2(gnutls_session_t session,
++			       gnutls_transport_ptr_t recv_ptr,
++			       gnutls_transport_ptr_t send_ptr);
++
++gnutls_transport_ptr_t gnutls_transport_get_ptr(gnutls_session_t session);
++void gnutls_transport_get_ptr2(gnutls_session_t session,
++			       gnutls_transport_ptr_t * recv_ptr,
++			       gnutls_transport_ptr_t * send_ptr);
++
++void gnutls_transport_set_vec_push_function(gnutls_session_t session,
++					    gnutls_vec_push_func vec_func);
++void gnutls_transport_set_push_function(gnutls_session_t session,
++					gnutls_push_func push_func);
++void gnutls_transport_set_pull_function(gnutls_session_t session,
++					gnutls_pull_func pull_func);
++
++void gnutls_transport_set_pull_timeout_function(gnutls_session_t session,
++						gnutls_pull_timeout_func
++						func);
++
++void gnutls_transport_set_errno_function(gnutls_session_t session,
++					 gnutls_errno_func errno_func);
++
++void gnutls_transport_set_errno(gnutls_session_t session, int err);
++
++/* session specific
++ */
++void gnutls_session_set_ptr(gnutls_session_t session, void *ptr);
++void *gnutls_session_get_ptr(gnutls_session_t session);
++
++void gnutls_openpgp_send_cert(gnutls_session_t session,
++			      gnutls_openpgp_crt_status_t status);
++
++/* This function returns the hash of the given data.
++ */
++int gnutls_fingerprint(gnutls_digest_algorithm_t algo,
++		       const gnutls_datum_t * data, void *result,
++		       size_t * result_size);
++
++  /**
++   * gnutls_random_art_t:
++   * @GNUTLS_RANDOM_ART_OPENSSH: OpenSSH-style random art.
++   *
++   * Enumeration of different random art types.
++   */
++typedef enum gnutls_random_art {
++	GNUTLS_RANDOM_ART_OPENSSH = 1
++} gnutls_random_art_t;
++
++int gnutls_random_art(gnutls_random_art_t type,
++		      const char *key_type, unsigned int key_size,
++		      void *fpr, size_t fpr_size, gnutls_datum_t * art);
++
++/* IDNA */
++#define GNUTLS_IDNA_FORCE_2008 (1<<1)
++int gnutls_idna_map(const char * input, unsigned ilen, gnutls_datum_t *out, unsigned flags);
++int gnutls_idna_reverse_map(const char *input, unsigned ilen, gnutls_datum_t *out, unsigned flags);
++
++/* SRP
++ */
++
++typedef struct gnutls_srp_server_credentials_st
++*gnutls_srp_server_credentials_t;
++typedef struct gnutls_srp_client_credentials_st
++*gnutls_srp_client_credentials_t;
++
++void
++gnutls_srp_free_client_credentials(gnutls_srp_client_credentials_t sc);
++int
++gnutls_srp_allocate_client_credentials(gnutls_srp_client_credentials_t *
++				       sc);
++int gnutls_srp_set_client_credentials(gnutls_srp_client_credentials_t res,
++				      const char *username,
++				      const char *password);
++
++void
++gnutls_srp_free_server_credentials(gnutls_srp_server_credentials_t sc);
++int
++gnutls_srp_allocate_server_credentials(gnutls_srp_server_credentials_t *
++				       sc);
++int gnutls_srp_set_server_credentials_file(gnutls_srp_server_credentials_t
++					   res, const char *password_file,
++					   const char *password_conf_file);
++
++const char *gnutls_srp_server_get_username(gnutls_session_t session);
++
++void gnutls_srp_set_prime_bits(gnutls_session_t session,
++                               unsigned int bits);
++
++int gnutls_srp_verifier(const char *username,
++			const char *password,
++			const gnutls_datum_t * salt,
++			const gnutls_datum_t * generator,
++			const gnutls_datum_t * prime,
++			gnutls_datum_t * res);
++
++/* The static parameters defined in draft-ietf-tls-srp-05
++ * Those should be used as input to gnutls_srp_verifier().
++ */
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_8192_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_8192_group_generator;
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_4096_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_4096_group_generator;
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_3072_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_3072_group_generator;
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_2048_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_2048_group_generator;
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_1536_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_1536_group_generator;
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_1024_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_srp_1024_group_generator;
++
++/* The static parameters defined in rfc7919
++ */
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_8192_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_8192_group_generator;
++extern _SYM_EXPORT const unsigned int gnutls_ffdhe_8192_key_bits;
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_6144_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_6144_group_generator;
++extern _SYM_EXPORT const unsigned int gnutls_ffdhe_6144_key_bits;
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_4096_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_4096_group_generator;
++extern _SYM_EXPORT const unsigned int gnutls_ffdhe_4096_key_bits;
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_3072_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_3072_group_generator;
++extern _SYM_EXPORT const unsigned int gnutls_ffdhe_3072_key_bits;
++
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_2048_group_prime;
++extern _SYM_EXPORT const gnutls_datum_t gnutls_ffdhe_2048_group_generator;
++extern _SYM_EXPORT const unsigned int gnutls_ffdhe_2048_key_bits;
++
++typedef int gnutls_srp_server_credentials_function(gnutls_session_t,
++						   const char *username,
++						   gnutls_datum_t * salt,
++						   gnutls_datum_t *
++						   verifier,
++						   gnutls_datum_t *
++						   generator,
++						   gnutls_datum_t * prime);
++void
++gnutls_srp_set_server_credentials_function(gnutls_srp_server_credentials_t
++					   cred,
++					   gnutls_srp_server_credentials_function
++					   * func);
++
++typedef int gnutls_srp_client_credentials_function(gnutls_session_t,
++						   char **, char **);
++void
++gnutls_srp_set_client_credentials_function(gnutls_srp_client_credentials_t
++					   cred,
++					   gnutls_srp_client_credentials_function
++					   * func);
++
++int gnutls_srp_base64_encode(const gnutls_datum_t * data, char *result,
++			     size_t * result_size);
++int gnutls_srp_base64_encode2(const gnutls_datum_t * data,
++				   gnutls_datum_t * result);
++
++int gnutls_srp_base64_decode(const gnutls_datum_t * b64_data, char *result,
++			     size_t * result_size);
++int gnutls_srp_base64_decode2(const gnutls_datum_t * b64_data,
++				   gnutls_datum_t * result);
++
++#define gnutls_srp_base64_encode_alloc gnutls_srp_base64_encode2
++#define gnutls_srp_base64_decode_alloc gnutls_srp_base64_decode2
++
++void
++gnutls_srp_set_server_fake_salt_seed(gnutls_srp_server_credentials_t
++				     sc,
++				     const gnutls_datum_t * seed,
++				     unsigned int salt_length);
++
++/* PSK stuff */
++typedef struct gnutls_psk_server_credentials_st
++*gnutls_psk_server_credentials_t;
++typedef struct gnutls_psk_client_credentials_st
++*gnutls_psk_client_credentials_t;
++
++/**
++ * gnutls_psk_key_flags:
++ * @GNUTLS_PSK_KEY_RAW: PSK-key in raw format.
++ * @GNUTLS_PSK_KEY_HEX: PSK-key in hex format.
++ *
++ * Enumeration of different PSK key flags.
++ */
++typedef enum gnutls_psk_key_flags {
++	GNUTLS_PSK_KEY_RAW = 0,
++	GNUTLS_PSK_KEY_HEX
++} gnutls_psk_key_flags;
++
++void
++gnutls_psk_free_client_credentials(gnutls_psk_client_credentials_t sc);
++int
++gnutls_psk_allocate_client_credentials(gnutls_psk_client_credentials_t *
++				       sc);
++int gnutls_psk_set_client_credentials(gnutls_psk_client_credentials_t res,
++				      const char *username,
++				      const gnutls_datum_t * key,
++				      gnutls_psk_key_flags flags);
++
++void
++gnutls_psk_free_server_credentials(gnutls_psk_server_credentials_t sc);
++int
++gnutls_psk_allocate_server_credentials(gnutls_psk_server_credentials_t *
++				       sc);
++int gnutls_psk_set_server_credentials_file(gnutls_psk_server_credentials_t
++					   res, const char *password_file);
++
++int
++gnutls_psk_set_server_credentials_hint(gnutls_psk_server_credentials_t
++				       res, const char *hint);
++
++const char *gnutls_psk_server_get_username(gnutls_session_t session);
++const char *gnutls_psk_client_get_hint(gnutls_session_t session);
++
++typedef int gnutls_psk_server_credentials_function(gnutls_session_t,
++						   const char *username,
++						   gnutls_datum_t * key);
++void
++gnutls_psk_set_server_credentials_function(gnutls_psk_server_credentials_t
++					   cred,
++					   gnutls_psk_server_credentials_function
++					   * func);
++
++typedef int gnutls_psk_client_credentials_function(gnutls_session_t,
++						   char **username,
++						   gnutls_datum_t * key);
++void
++gnutls_psk_set_client_credentials_function(gnutls_psk_client_credentials_t
++					   cred,
++					   gnutls_psk_client_credentials_function
++					   * func);
++
++int gnutls_hex_encode(const gnutls_datum_t * data, char *result,
++		      size_t * result_size);
++int gnutls_hex_decode(const gnutls_datum_t * hex_data, void *result,
++		      size_t * result_size);
++
++int gnutls_hex_encode2(const gnutls_datum_t * data, gnutls_datum_t *result);
++int gnutls_hex_decode2(const gnutls_datum_t * data, gnutls_datum_t *result);
++
++void
++gnutls_psk_set_server_dh_params(gnutls_psk_server_credentials_t res,
++				gnutls_dh_params_t dh_params);
++
++int
++gnutls_psk_set_server_known_dh_params(gnutls_psk_server_credentials_t res,
++				      gnutls_sec_param_t sec_param);
++
++void
++gnutls_psk_set_server_params_function(gnutls_psk_server_credentials_t
++				      res, gnutls_params_function * func);
++
++/**
++ * gnutls_x509_subject_alt_name_t:
++ * @GNUTLS_SAN_DNSNAME: DNS-name SAN.
++ * @GNUTLS_SAN_RFC822NAME: E-mail address SAN.
++ * @GNUTLS_SAN_URI: URI SAN.
++ * @GNUTLS_SAN_IPADDRESS: IP address SAN.
++ * @GNUTLS_SAN_OTHERNAME: OtherName SAN.
++ * @GNUTLS_SAN_DN: DN SAN.
++ * @GNUTLS_SAN_OTHERNAME_XMPP: Virtual SAN, used by certain functions for convenience.
++ * @GNUTLS_SAN_OTHERNAME_KRB5PRINCIPAL: Virtual SAN, used by certain functions for convenience.
++ *
++ * Enumeration of different subject alternative names types.
++ */
++typedef enum gnutls_x509_subject_alt_name_t {
++	GNUTLS_SAN_DNSNAME = 1,
++	GNUTLS_SAN_RFC822NAME = 2,
++	GNUTLS_SAN_URI = 3,
++	GNUTLS_SAN_IPADDRESS = 4,
++	GNUTLS_SAN_OTHERNAME = 5,
++	GNUTLS_SAN_DN = 6,
++	GNUTLS_SAN_MAX = GNUTLS_SAN_DN,
++	/* The following are "virtual" subject alternative name types, in
++	   that they are represented by an otherName value and an OID.
++	   Used by gnutls_x509_crt_get_subject_alt_othername_oid.  */
++	GNUTLS_SAN_OTHERNAME_XMPP = 1000,
++	GNUTLS_SAN_OTHERNAME_KRB5PRINCIPAL
++} gnutls_x509_subject_alt_name_t;
++
++struct gnutls_openpgp_crt_int;
++typedef struct gnutls_openpgp_crt_int *gnutls_openpgp_crt_t;
++
++struct gnutls_openpgp_privkey_int;
++typedef struct gnutls_openpgp_privkey_int *gnutls_openpgp_privkey_t;
++
++struct gnutls_pkcs11_privkey_st;
++typedef struct gnutls_pkcs11_privkey_st *gnutls_pkcs11_privkey_t;
++
++/**
++ * gnutls_privkey_type_t:
++ * @GNUTLS_PRIVKEY_X509: X.509 private key, #gnutls_x509_privkey_t.
++ * @GNUTLS_PRIVKEY_OPENPGP: OpenPGP private key, #gnutls_openpgp_privkey_t.
++ * @GNUTLS_PRIVKEY_PKCS11: PKCS11 private key, #gnutls_pkcs11_privkey_t.
++ * @GNUTLS_PRIVKEY_EXT: External private key, operating using callbacks.
++ *
++ * Enumeration of different private key types.
++ */
++typedef enum {
++	GNUTLS_PRIVKEY_X509,
++	GNUTLS_PRIVKEY_OPENPGP,
++	GNUTLS_PRIVKEY_PKCS11,
++	GNUTLS_PRIVKEY_EXT
++} gnutls_privkey_type_t;
++
++typedef struct gnutls_retr2_st {
++	gnutls_certificate_type_t cert_type;
++	gnutls_privkey_type_t key_type;
++
++	union {
++		gnutls_x509_crt_t *x509;
++		gnutls_openpgp_crt_t pgp;
++	} cert;
++	unsigned int ncerts;	/* one for pgp keys */
++
++	union {
++		gnutls_x509_privkey_t x509;
++		gnutls_openpgp_privkey_t pgp;
++		gnutls_pkcs11_privkey_t pkcs11;
++	} key;
++
++	unsigned int deinit_all;	/* if non zero all keys will be deinited */
++} gnutls_retr2_st;
++
++  /* Functions that allow auth_info_t structures handling
++   */
++
++gnutls_credentials_type_t gnutls_auth_get_type(gnutls_session_t session);
++gnutls_credentials_type_t
++gnutls_auth_server_get_type(gnutls_session_t session);
++gnutls_credentials_type_t
++gnutls_auth_client_get_type(gnutls_session_t session);
++
++  /* DH */
++
++void gnutls_dh_set_prime_bits(gnutls_session_t session, unsigned int bits);
++int gnutls_dh_get_secret_bits(gnutls_session_t session);
++int gnutls_dh_get_peers_public_bits(gnutls_session_t session);
++int gnutls_dh_get_prime_bits(gnutls_session_t session);
++
++int gnutls_dh_get_group(gnutls_session_t session, gnutls_datum_t * raw_gen,
++			gnutls_datum_t * raw_prime);
++int gnutls_dh_get_pubkey(gnutls_session_t session,
++			 gnutls_datum_t * raw_key);
++
++  /* X509PKI */
++
++  /* These are set on the credentials structure.
++   */
++
++  /* use gnutls_certificate_set_retrieve_function2() in abstract.h
++   * instead. It's much more efficient.
++   */
++
++typedef int gnutls_certificate_retrieve_function(gnutls_session_t,
++						 const
++						 gnutls_datum_t *
++						 req_ca_rdn,
++						 int nreqs,
++						 const
++						 gnutls_pk_algorithm_t
++						 * pk_algos,
++						 int
++						 pk_algos_length,
++						 gnutls_retr2_st *);
++
++void
++gnutls_certificate_set_retrieve_function(gnutls_certificate_credentials_t
++					 cred,
++					 gnutls_certificate_retrieve_function
++					 * func);
++
++void
++gnutls_certificate_set_verify_function(gnutls_certificate_credentials_t
++				       cred,
++				       gnutls_certificate_verify_function
++				       * func);
++
++void
++gnutls_certificate_server_set_request(gnutls_session_t session,
++				      gnutls_certificate_request_t req);
++
++  /* get data from the session
++   */
++const gnutls_datum_t *gnutls_certificate_get_peers(gnutls_session_t
++						   session, unsigned int
++						   *list_size);
++const gnutls_datum_t *gnutls_certificate_get_ours(gnutls_session_t
++						  session);
++
++int gnutls_certificate_get_peers_subkey_id(gnutls_session_t session,
++					   gnutls_datum_t * id);
++
++time_t gnutls_certificate_activation_time_peers(gnutls_session_t session);
++time_t gnutls_certificate_expiration_time_peers(gnutls_session_t session);
++
++unsigned gnutls_certificate_client_get_request_status(gnutls_session_t session);
++int gnutls_certificate_verify_peers2(gnutls_session_t session,
++				     unsigned int *status);
++int gnutls_certificate_verify_peers3(gnutls_session_t session,
++				     const char *hostname,
++				     unsigned int *status);
++
++int
++gnutls_certificate_verify_peers(gnutls_session_t session,
++				gnutls_typed_vdata_st * data,
++				unsigned int elements,
++				unsigned int *status);
++
++int gnutls_certificate_verification_status_print(unsigned int status,
++						 gnutls_certificate_type_t
++						 type,
++						 gnutls_datum_t * out,
++						 unsigned int flags);
++
++int gnutls_pem_base64_encode(const char *msg, const gnutls_datum_t * data,
++			     char *result, size_t * result_size);
++int gnutls_pem_base64_decode(const char *header,
++			     const gnutls_datum_t * b64_data,
++			     unsigned char *result, size_t * result_size);
++
++int gnutls_pem_base64_encode2(const char *msg,
++				   const gnutls_datum_t * data,
++				   gnutls_datum_t * result);
++int gnutls_pem_base64_decode2(const char *header,
++				   const gnutls_datum_t * b64_data,
++				   gnutls_datum_t * result);
++
++#define gnutls_pem_base64_encode_alloc gnutls_pem_base64_encode2
++#define gnutls_pem_base64_decode_alloc gnutls_pem_base64_decode2
++
++  /* key_usage will be an OR of the following values:
++   */
++
++  /* when the key is to be used for signing: */
++#define GNUTLS_KEY_DIGITAL_SIGNATURE	128
++#define GNUTLS_KEY_NON_REPUDIATION	64
++  /* when the key is to be used for encryption: */
++#define GNUTLS_KEY_KEY_ENCIPHERMENT	32
++#define GNUTLS_KEY_DATA_ENCIPHERMENT	16
++#define GNUTLS_KEY_KEY_AGREEMENT	8
++#define GNUTLS_KEY_KEY_CERT_SIGN	4
++#define GNUTLS_KEY_CRL_SIGN		2
++#define GNUTLS_KEY_ENCIPHER_ONLY	1
++#define GNUTLS_KEY_DECIPHER_ONLY	32768
++
++void
++gnutls_certificate_set_params_function(gnutls_certificate_credentials_t
++				       res, gnutls_params_function * func);
++void gnutls_anon_set_params_function(gnutls_anon_server_credentials_t res,
++				     gnutls_params_function * func);
++void gnutls_psk_set_params_function(gnutls_psk_server_credentials_t res,
++				    gnutls_params_function * func);
++
++int gnutls_hex2bin(const char *hex_data, size_t hex_size,
++		   void *bin_data, size_t * bin_size);
++
++  /* Trust on first use (or ssh like) functions */
++
++  /* stores the provided information to a database
++   */
++typedef int (*gnutls_tdb_store_func) (const char *db_name,
++				      const char *host,
++				      const char *service,
++				      time_t expiration,
++				      const gnutls_datum_t * pubkey);
++
++typedef int (*gnutls_tdb_store_commitment_func) (const char *db_name,
++						 const char *host,
++						 const char *service,
++						 time_t expiration,
++						 gnutls_digest_algorithm_t
++						 hash_algo,
++						 const gnutls_datum_t *
++						 hash);
++
++  /* searches for the provided host/service pair that match the
++   * provided public key in the database. */
++typedef int (*gnutls_tdb_verify_func) (const char *db_name,
++				       const char *host,
++				       const char *service,
++				       const gnutls_datum_t * pubkey);
++
++struct gnutls_tdb_int;
++typedef struct gnutls_tdb_int *gnutls_tdb_t;
++
++int gnutls_tdb_init(gnutls_tdb_t * tdb);
++void gnutls_tdb_set_store_func(gnutls_tdb_t tdb,
++			       gnutls_tdb_store_func store);
++void gnutls_tdb_set_store_commitment_func(gnutls_tdb_t tdb,
++					  gnutls_tdb_store_commitment_func
++					  cstore);
++void gnutls_tdb_set_verify_func(gnutls_tdb_t tdb,
++				gnutls_tdb_verify_func verify);
++void gnutls_tdb_deinit(gnutls_tdb_t tdb);
++
++int gnutls_verify_stored_pubkey(const char *db_name,
++				gnutls_tdb_t tdb,
++				const char *host,
++				const char *service,
++				gnutls_certificate_type_t cert_type,
++				const gnutls_datum_t * cert,
++				unsigned int flags);
++
++#define GNUTLS_SCOMMIT_FLAG_ALLOW_BROKEN 1
++int gnutls_store_commitment(const char *db_name,
++			    gnutls_tdb_t tdb,
++			    const char *host,
++			    const char *service,
++			    gnutls_digest_algorithm_t hash_algo,
++			    const gnutls_datum_t * hash,
++			    time_t expiration, unsigned int flags);
++
++int gnutls_store_pubkey(const char *db_name,
++			gnutls_tdb_t tdb,
++			const char *host,
++			const char *service,
++			gnutls_certificate_type_t cert_type,
++			const gnutls_datum_t * cert,
++			time_t expiration, unsigned int flags);
++
++  /* Other helper functions */
++int gnutls_load_file(const char *filename, gnutls_datum_t * data);
++
++unsigned gnutls_url_is_supported(const char *url);
++
++  /* PIN callback */
++
++/**
++ * gnutls_pin_flag_t:
++ * @GNUTLS_PIN_USER: The PIN for the user.
++ * @GNUTLS_PIN_SO: The PIN for the security officer (admin).
++ * @GNUTLS_PIN_CONTEXT_SPECIFIC: The PIN is for a specific action and key like signing.
++ * @GNUTLS_PIN_FINAL_TRY: This is the final try before blocking.
++ * @GNUTLS_PIN_COUNT_LOW: Few tries remain before token blocks.
++ * @GNUTLS_PIN_WRONG: Last given PIN was not correct.
++ *
++ * Enumeration of different flags that are input to the PIN function.
++ */
++typedef enum {
++	GNUTLS_PIN_USER = (1 << 0),
++	GNUTLS_PIN_SO = (1 << 1),
++	GNUTLS_PIN_FINAL_TRY = (1 << 2),
++	GNUTLS_PIN_COUNT_LOW = (1 << 3),
++	GNUTLS_PIN_CONTEXT_SPECIFIC = (1 << 4),
++	GNUTLS_PIN_WRONG = (1 << 5)
++} gnutls_pin_flag_t;
++
++#define GNUTLS_PKCS11_PIN_USER GNUTLS_PIN_USER
++#define GNUTLS_PKCS11_PIN_SO GNUTLS_PIN_SO
++#define GNUTLS_PKCS11_PIN_FINAL_TRY GNUTLS_PIN_FINAL_TRY
++#define GNUTLS_PKCS11_PIN_COUNT_LOW  GNUTLS_PIN_COUNT_LOW
++#define GNUTLS_PKCS11_PIN_CONTEXT_SPECIFIC GNUTLS_PIN_CONTEXT_SPECIFIC
++#define GNUTLS_PKCS11_PIN_WRONG GNUTLS_PIN_WRONG
++
++/**
++ * gnutls_pin_callback_t:
++ * @userdata: user-controlled data from gnutls_pkcs11_set_pin_function().
++ * @attempt: pin-attempt counter, initially 0.
++ * @token_url: URL of token.
++ * @token_label: label of token.
++ * @flags: a #gnutls_pin_flag_t flag.
++ * @pin: buffer to hold PIN, of size @pin_max.
++ * @pin_max: size of @pin buffer.
++ *
++ * Callback function type for PKCS#11 or TPM PIN entry.  It is set by
++ * functions like gnutls_pkcs11_set_pin_function().
++ *
++ * The callback should provides the PIN code to unlock the token with
++ * label @token_label, specified by the URL @token_url.
++ *
++ * The PIN code, as a NUL-terminated ASCII string, should be copied
++ * into the @pin buffer (of maximum size @pin_max), and return 0 to
++ * indicate success.  Alternatively, the callback may return a
++ * negative gnutls error code to indicate failure and cancel PIN entry
++ * (in which case, the contents of the @pin parameter are ignored).
++ *
++ * When a PIN is required, the callback will be invoked repeatedly
++ * (and indefinitely) until either the returned PIN code is correct,
++ * the callback returns failure, or the token refuses login (e.g. when
++ * the token is locked due to too many incorrect PINs!).  For the
++ * first such invocation, the @attempt counter will have value zero;
++ * it will increase by one for each subsequent attempt.
++ *
++ * Returns: %GNUTLS_E_SUCCESS (0) on success or a negative error code on error.
++ *
++ * Since: 2.12.0
++ **/
++typedef int (*gnutls_pin_callback_t) (void *userdata, int attempt,
++				      const char *token_url,
++				      const char *token_label,
++				      unsigned int flags,
++				      char *pin, size_t pin_max);
++
++void gnutls_certificate_set_pin_function(gnutls_certificate_credentials_t,
++					 gnutls_pin_callback_t fn,
++					 void *userdata);
++
++/* Public string related functions */
++typedef struct gnutls_buffer_st *gnutls_buffer_t;
++
++int gnutls_buffer_append_data(gnutls_buffer_t, const void *data, size_t data_size);
++
++#define GNUTLS_UTF8_IGNORE_ERRS 1
++int gnutls_utf8_password_normalize(const unsigned char *password, unsigned password_len,
++				   gnutls_datum_t *out, unsigned flags);
++
++/* Public extensions related functions */
++
++typedef void *gnutls_ext_priv_data_t;
++
++void gnutls_ext_set_data(gnutls_session_t session, unsigned type,
++			 gnutls_ext_priv_data_t);
++int gnutls_ext_get_data(gnutls_session_t session, unsigned type,
++			gnutls_ext_priv_data_t *);
++
++unsigned gnutls_ext_get_current_msg(gnutls_session_t session);
++
++typedef int (*gnutls_ext_recv_func) (gnutls_session_t session,
++				     const unsigned char *data,
++				     size_t len);
++
++typedef int (*gnutls_ext_send_func) (gnutls_session_t session,
++				     gnutls_buffer_t extdata);
++
++typedef void (*gnutls_ext_deinit_data_func) (gnutls_ext_priv_data_t data);
++
++typedef int (*gnutls_ext_pack_func) (gnutls_ext_priv_data_t data,
++				     gnutls_buffer_t packed_data);
++
++typedef int (*gnutls_ext_unpack_func) (gnutls_buffer_t packed_data,
++				       gnutls_ext_priv_data_t *data);
++
++#define GNUTLS_EXT_RAW_FLAG_TLS_CLIENT_HELLO 1
++#define GNUTLS_EXT_RAW_FLAG_DTLS_CLIENT_HELLO (1<<1)
++typedef int (*gnutls_ext_raw_process_func)(void *ctx, unsigned tls_id, const unsigned char *data, unsigned data_size);
++int gnutls_ext_raw_parse(void *ctx, gnutls_ext_raw_process_func cb,
++			 const gnutls_datum_t *data, unsigned int flags);
++
++/**
++ * gnutls_ext_parse_type_t:
++ * @GNUTLS_EXT_NONE: Never to be parsed
++ * @GNUTLS_EXT_ANY: Any extension type (should not be used as it is used only internally).
++ * @GNUTLS_EXT_VERSION_NEG: Extensions to be parsed first for TLS version negotiation.
++ * @GNUTLS_EXT_MANDATORY: Parsed after @GNUTLS_EXT_VERSION_NEG and even when resuming.
++ * @GNUTLS_EXT_APPLICATION: Parsed after @GNUTLS_EXT_MANDATORY
++ * @GNUTLS_EXT_TLS: TLS-internal extensions, parsed after @GNUTLS_EXT_APPLICATION.
++ *
++ * Enumeration of different TLS extension parsing phases.  The @gnutls_ext_parse_type_t
++ * indicates the time/phase an extension is parsed during Client or Server hello parsing.
++ *
++ */
++typedef enum {
++  GNUTLS_EXT_ANY = 0,
++  GNUTLS_EXT_APPLICATION = 1,
++  GNUTLS_EXT_TLS = 2,
++  GNUTLS_EXT_MANDATORY = 3,
++  GNUTLS_EXT_NONE = 4,
++  GNUTLS_EXT_VERSION_NEG = 5
++} gnutls_ext_parse_type_t;
++
++/**
++ * gnutls_ext_flags_t:
++ * @GNUTLS_EXT_FLAG_OVERRIDE_INTERNAL: If specified the extension registered will override the internal; this does not work with extensions existing prior to 3.6.0.
++ * @GNUTLS_EXT_FLAG_CLIENT_HELLO: This extension can be present in a client hello
++ * @GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO: This extension can be present in a TLS1.2 or earlier server hello
++ * @GNUTLS_EXT_FLAG_TLS13_SERVER_HELLO: This extension can be present in a TLS1.3 server hello
++ * @GNUTLS_EXT_FLAG_EE: This extension can be present in encrypted extensions message
++ * @GNUTLS_EXT_FLAG_HRR: This extension can be present in hello retry request message
++ * @GNUTLS_EXT_FLAG_IGNORE_CLIENT_REQUEST: When flag is present, this extension will be send even if the client didn't advertise it. An extension of this type is the Cookie TLS1.3 extension.
++ * @GNUTLS_EXT_FLAG_DTLS: This extension can be present under DTLS; otherwise ignored.
++ * @GNUTLS_EXT_FLAG_TLS: This extension can be present under TLS; otherwise ignored.
++ *
++ * Enumeration of different TLS extension registration flags.
++ */
++typedef enum {
++  GNUTLS_EXT_FLAG_OVERRIDE_INTERNAL = 1,
++  GNUTLS_EXT_FLAG_CLIENT_HELLO = (1<<1),
++  GNUTLS_EXT_FLAG_TLS12_SERVER_HELLO = (1<<2),
++  GNUTLS_EXT_FLAG_TLS13_SERVER_HELLO = (1<<3),
++  GNUTLS_EXT_FLAG_EE = (1<<4), /* ENCRYPTED */
++  GNUTLS_EXT_FLAG_HRR = (1<<5),
++  GNUTLS_EXT_FLAG_IGNORE_CLIENT_REQUEST = (1<<6),
++  GNUTLS_EXT_FLAG_TLS = (1<<7),
++  GNUTLS_EXT_FLAG_DTLS = (1<<8)
++} gnutls_ext_flags_t;
++
++/* Register a custom tls extension
++ */
++int gnutls_ext_register(const char *name, int type, gnutls_ext_parse_type_t parse_type,
++				gnutls_ext_recv_func recv_func, gnutls_ext_send_func send_func,
++				gnutls_ext_deinit_data_func deinit_func, gnutls_ext_pack_func pack_func,
++				gnutls_ext_unpack_func unpack_func);
++
++int gnutls_session_ext_register(gnutls_session_t, const char *name, int type, gnutls_ext_parse_type_t parse_type,
++				gnutls_ext_recv_func recv_func, gnutls_ext_send_func send_func,
++				gnutls_ext_deinit_data_func deinit_func, gnutls_ext_pack_func pack_func,
++				gnutls_ext_unpack_func unpack_func, unsigned flags);
++
++const char *gnutls_ext_get_name(unsigned int ext);
++
++/* Public supplemental data related functions */
++
++typedef int (*gnutls_supp_recv_func) (gnutls_session_t session,
++			       const unsigned char * data, size_t data_size);
++typedef int (*gnutls_supp_send_func) (gnutls_session_t session,
++			       gnutls_buffer_t buf);
++
++int gnutls_supplemental_register(const char *name,
++				gnutls_supplemental_data_format_type_t type,
++				gnutls_supp_recv_func supp_recv_func,
++				gnutls_supp_send_func supp_send_func);
++
++int gnutls_session_supplemental_register(gnutls_session_t session, const char *name,
++				gnutls_supplemental_data_format_type_t type,
++				gnutls_supp_recv_func supp_recv_func,
++				gnutls_supp_send_func supp_send_func,
++				unsigned int flags);
++
++void gnutls_supplemental_recv(gnutls_session_t session, unsigned do_recv_supplemental);
++
++void gnutls_supplemental_send(gnutls_session_t session, unsigned do_send_supplemental);
++
++/* Anti-replay related functions */
++
++typedef struct gnutls_anti_replay_st *gnutls_anti_replay_t;
++
++int gnutls_anti_replay_init(gnutls_anti_replay_t *anti_replay);
++void gnutls_anti_replay_deinit(gnutls_anti_replay_t anti_replay);
++void gnutls_anti_replay_set_window(gnutls_anti_replay_t anti_replay,
++				   unsigned int window);
++void gnutls_anti_replay_enable(gnutls_session_t session,
++			       gnutls_anti_replay_t anti_replay);
++
++typedef int (*gnutls_db_add_func) (void *, time_t exp_time, const gnutls_datum_t *key,
++				   const gnutls_datum_t *data);
++
++void gnutls_anti_replay_set_add_function(gnutls_anti_replay_t,
++					 gnutls_db_add_func add_func);
++
++void gnutls_anti_replay_set_ptr(gnutls_anti_replay_t, void *ptr);
++
++/* FIPS140-2 related functions */
++unsigned gnutls_fips140_mode_enabled(void);
++
++/**
++ * gnutls_fips_mode_t:
++ * @GNUTLS_FIPS140_DISABLED: The FIPS140-2 mode is disabled.
++ * @GNUTLS_FIPS140_STRICT: The default mode; all forbidden operations will cause an
++ *                         operation failure via error code.
++ * @GNUTLS_FIPS140_LAX: The library still uses the FIPS140-2 relevant algorithms but all
++ *                      forbidden by FIPS140-2 operations are allowed; this is useful when the
++ *                      application is aware of the followed security policy, and needs
++ *                      to utilize disallowed operations for other reasons (e.g., compatibility).
++ * @GNUTLS_FIPS140_LOG: Similarly to %GNUTLS_FIPS140_LAX, it allows forbidden operations; any use of them results
++ *                      to a message to the audit callback functions.
++ * @GNUTLS_FIPS140_SELFTESTS: A transient state during library initialization. That state
++ *			cannot be set or seen by applications.
++ *
++ * Enumeration of different operational modes under FIPS140-2.
++ */
++typedef enum gnutls_fips_mode_t {
++  GNUTLS_FIPS140_DISABLED = 0,
++  GNUTLS_FIPS140_STRICT = 1,
++  GNUTLS_FIPS140_SELFTESTS = 2,
++  GNUTLS_FIPS140_LAX = 3,
++  GNUTLS_FIPS140_LOG = 4
++} gnutls_fips_mode_t;
++
++#define GNUTLS_FIPS140_SET_MODE_THREAD 1
++
++void gnutls_fips140_set_mode(gnutls_fips_mode_t mode, unsigned flags);
++
++#define GNUTLS_FIPS140_SET_LAX_MODE() do { \
++	if (gnutls_fips140_mode_enabled()) \
++		gnutls_fips140_set_mode(GNUTLS_FIPS140_LAX, GNUTLS_FIPS140_SET_MODE_THREAD); \
++	} while(0)
++
++#define GNUTLS_FIPS140_SET_STRICT_MODE() do { \
++	if (gnutls_fips140_mode_enabled()) \
++		gnutls_fips140_set_mode(GNUTLS_FIPS140_STRICT, GNUTLS_FIPS140_SET_MODE_THREAD); \
++	} while(0)
++
++  /* Gnutls error codes. The mapping to a TLS alert is also shown in
++   * comments.
++   */
++
++#define GNUTLS_E_SUCCESS 0
++#define	GNUTLS_E_UNKNOWN_COMPRESSION_ALGORITHM -3
++#define	GNUTLS_E_UNKNOWN_CIPHER_TYPE -6
++#define	GNUTLS_E_LARGE_PACKET -7
++#define GNUTLS_E_UNSUPPORTED_VERSION_PACKET -8	/* GNUTLS_A_PROTOCOL_VERSION */
++#define GNUTLS_E_TLS_PACKET_DECODING_ERROR GNUTLS_E_UNEXPECTED_PACKET_LENGTH
++#define GNUTLS_E_UNEXPECTED_PACKET_LENGTH -9	/* GNUTLS_A_DECODE_ERROR */
++#define GNUTLS_E_INVALID_SESSION -10
++#define GNUTLS_E_FATAL_ALERT_RECEIVED -12
++#define GNUTLS_E_UNEXPECTED_PACKET -15	/* GNUTLS_A_UNEXPECTED_MESSAGE */
++#define GNUTLS_E_WARNING_ALERT_RECEIVED -16
++#define GNUTLS_E_ERROR_IN_FINISHED_PACKET -18
++#define GNUTLS_E_UNEXPECTED_HANDSHAKE_PACKET -19
++#define	GNUTLS_E_UNKNOWN_CIPHER_SUITE -21	/* GNUTLS_A_HANDSHAKE_FAILURE */
++#define	GNUTLS_E_UNWANTED_ALGORITHM -22
++#define	GNUTLS_E_MPI_SCAN_FAILED -23
++#define GNUTLS_E_DECRYPTION_FAILED -24	/* GNUTLS_A_DECRYPTION_FAILED, GNUTLS_A_BAD_RECORD_MAC */
++#define GNUTLS_E_MEMORY_ERROR -25
++#define GNUTLS_E_DECOMPRESSION_FAILED -26	/* GNUTLS_A_DECOMPRESSION_FAILURE */
++#define GNUTLS_E_COMPRESSION_FAILED -27
++#define GNUTLS_E_AGAIN -28
++#define GNUTLS_E_EXPIRED -29
++#define GNUTLS_E_DB_ERROR -30
++#define GNUTLS_E_SRP_PWD_ERROR GNUTLS_E_KEYFILE_ERROR
++#define GNUTLS_E_KEYFILE_ERROR -31
++#define GNUTLS_E_INSUFFICIENT_CREDENTIALS -32
++#define GNUTLS_E_INSUFICIENT_CREDENTIALS GNUTLS_E_INSUFFICIENT_CREDENTIALS	/* for backwards compatibility only */
++#define GNUTLS_E_INSUFFICIENT_CRED GNUTLS_E_INSUFFICIENT_CREDENTIALS
++#define GNUTLS_E_INSUFICIENT_CRED GNUTLS_E_INSUFFICIENT_CREDENTIALS	/* for backwards compatibility only */
++
++#define GNUTLS_E_HASH_FAILED -33
++#define GNUTLS_E_BASE64_DECODING_ERROR -34
++
++#define	GNUTLS_E_MPI_PRINT_FAILED -35
++#define GNUTLS_E_REHANDSHAKE -37	/* GNUTLS_A_NO_RENEGOTIATION */
++#define GNUTLS_E_GOT_APPLICATION_DATA -38
++#define GNUTLS_E_RECORD_LIMIT_REACHED -39
++#define GNUTLS_E_ENCRYPTION_FAILED -40
++
++#define GNUTLS_E_PK_ENCRYPTION_FAILED -44
++#define GNUTLS_E_PK_DECRYPTION_FAILED -45
++#define GNUTLS_E_PK_SIGN_FAILED -46
++#define GNUTLS_E_X509_UNSUPPORTED_CRITICAL_EXTENSION -47
++#define GNUTLS_E_KEY_USAGE_VIOLATION -48
++#define GNUTLS_E_NO_CERTIFICATE_FOUND -49	/* GNUTLS_A_BAD_CERTIFICATE */
++#define GNUTLS_E_INVALID_REQUEST -50
++#define GNUTLS_E_SHORT_MEMORY_BUFFER -51
++#define GNUTLS_E_INTERRUPTED -52
++#define GNUTLS_E_PUSH_ERROR -53
++#define GNUTLS_E_PULL_ERROR -54
++#define GNUTLS_E_RECEIVED_ILLEGAL_PARAMETER -55	/* GNUTLS_A_ILLEGAL_PARAMETER */
++#define GNUTLS_E_REQUESTED_DATA_NOT_AVAILABLE -56
++#define GNUTLS_E_PKCS1_WRONG_PAD -57
++#define GNUTLS_E_RECEIVED_ILLEGAL_EXTENSION -58
++#define GNUTLS_E_INTERNAL_ERROR -59
++#define GNUTLS_E_DH_PRIME_UNACCEPTABLE -63
++#define GNUTLS_E_FILE_ERROR -64
++#define GNUTLS_E_TOO_MANY_EMPTY_PACKETS -78
++#define GNUTLS_E_UNKNOWN_PK_ALGORITHM -80
++#define GNUTLS_E_TOO_MANY_HANDSHAKE_PACKETS -81
++#define GNUTLS_E_RECEIVED_DISALLOWED_NAME -82 /* GNUTLS_A_ILLEGAL_PARAMETER */
++#define GNUTLS_E_CERTIFICATE_REQUIRED -112 /* GNUTLS_A_CERTIFICATE_REQUIRED */
++
++  /* returned if you need to generate temporary RSA
++   * parameters. These are needed for export cipher suites.
++   */
++#define GNUTLS_E_NO_TEMPORARY_RSA_PARAMS -84
++
++#define GNUTLS_E_NO_COMPRESSION_ALGORITHMS -86
++#define GNUTLS_E_NO_CIPHER_SUITES -87
++
++#define GNUTLS_E_OPENPGP_GETKEY_FAILED -88
++#define GNUTLS_E_PK_SIG_VERIFY_FAILED -89
++
++#define GNUTLS_E_ILLEGAL_SRP_USERNAME -90
++#define GNUTLS_E_SRP_PWD_PARSING_ERROR GNUTLS_E_KEYFILE_PARSING_ERROR
++#define GNUTLS_E_KEYFILE_PARSING_ERROR -91
++#define GNUTLS_E_NO_TEMPORARY_DH_PARAMS -93
++
++  /* For certificate and key stuff
++   */
++#define GNUTLS_E_ASN1_ELEMENT_NOT_FOUND -67
++#define GNUTLS_E_ASN1_IDENTIFIER_NOT_FOUND -68
++#define GNUTLS_E_ASN1_DER_ERROR -69
++#define GNUTLS_E_ASN1_VALUE_NOT_FOUND -70
++#define GNUTLS_E_ASN1_GENERIC_ERROR -71
++#define GNUTLS_E_ASN1_VALUE_NOT_VALID -72
++#define GNUTLS_E_ASN1_TAG_ERROR -73
++#define GNUTLS_E_ASN1_TAG_IMPLICIT -74
++#define GNUTLS_E_ASN1_TYPE_ANY_ERROR -75
++#define GNUTLS_E_ASN1_SYNTAX_ERROR -76
++#define GNUTLS_E_ASN1_DER_OVERFLOW -77
++#define GNUTLS_E_OPENPGP_UID_REVOKED -79
++#define GNUTLS_E_CERTIFICATE_ERROR -43
++#define GNUTLS_E_X509_CERTIFICATE_ERROR GNUTLS_E_CERTIFICATE_ERROR
++#define GNUTLS_E_CERTIFICATE_KEY_MISMATCH -60
++#define GNUTLS_E_UNSUPPORTED_CERTIFICATE_TYPE -61	/* GNUTLS_A_UNSUPPORTED_CERTIFICATE */
++#define GNUTLS_E_X509_UNKNOWN_SAN -62
++#define GNUTLS_E_OPENPGP_FINGERPRINT_UNSUPPORTED -94
++#define GNUTLS_E_X509_UNSUPPORTED_ATTRIBUTE -95
++#define GNUTLS_E_UNKNOWN_HASH_ALGORITHM -96
++#define GNUTLS_E_UNKNOWN_PKCS_CONTENT_TYPE -97
++#define GNUTLS_E_UNKNOWN_PKCS_BAG_TYPE -98
++#define GNUTLS_E_INVALID_PASSWORD -99
++#define GNUTLS_E_MAC_VERIFY_FAILED -100	/* for PKCS #12 MAC */
++#define GNUTLS_E_CONSTRAINT_ERROR -101
++
++#define GNUTLS_E_WARNING_IA_IPHF_RECEIVED -102
++#define GNUTLS_E_WARNING_IA_FPHF_RECEIVED -103
++
++#define GNUTLS_E_IA_VERIFY_FAILED -104
++#define GNUTLS_E_UNKNOWN_ALGORITHM -105
++#define GNUTLS_E_UNSUPPORTED_SIGNATURE_ALGORITHM -106
++#define GNUTLS_E_SAFE_RENEGOTIATION_FAILED -107
++#define GNUTLS_E_UNSAFE_RENEGOTIATION_DENIED -108
++#define GNUTLS_E_UNKNOWN_SRP_USERNAME -109
++#define GNUTLS_E_PREMATURE_TERMINATION -110
++
++#define GNUTLS_E_MALFORMED_CIDR -111
++
++#define GNUTLS_E_BASE64_ENCODING_ERROR -201
++#define GNUTLS_E_INCOMPATIBLE_GCRYPT_LIBRARY -202	/* obsolete */
++#define GNUTLS_E_INCOMPATIBLE_CRYPTO_LIBRARY -202
++#define GNUTLS_E_INCOMPATIBLE_LIBTASN1_LIBRARY -203
++
++#define GNUTLS_E_OPENPGP_KEYRING_ERROR -204
++#define GNUTLS_E_X509_UNSUPPORTED_OID -205
++
++#define GNUTLS_E_RANDOM_FAILED -206
++#define GNUTLS_E_BASE64_UNEXPECTED_HEADER_ERROR -207
++
++#define GNUTLS_E_OPENPGP_SUBKEY_ERROR -208
++
++#define GNUTLS_E_CRYPTO_ALREADY_REGISTERED GNUTLS_E_ALREADY_REGISTERED
++#define GNUTLS_E_ALREADY_REGISTERED -209
++
++#define GNUTLS_E_HANDSHAKE_TOO_LARGE -210
++
++#define GNUTLS_E_CRYPTODEV_IOCTL_ERROR -211
++#define GNUTLS_E_CRYPTODEV_DEVICE_ERROR -212
++
++#define GNUTLS_E_CHANNEL_BINDING_NOT_AVAILABLE -213
++#define GNUTLS_E_BAD_COOKIE -214
++#define GNUTLS_E_OPENPGP_PREFERRED_KEY_ERROR -215
++#define GNUTLS_E_INCOMPAT_DSA_KEY_WITH_TLS_PROTOCOL -216
++#define GNUTLS_E_INSUFFICIENT_SECURITY -217
++
++#define GNUTLS_E_HEARTBEAT_PONG_RECEIVED -292
++#define GNUTLS_E_HEARTBEAT_PING_RECEIVED -293
++
++#define GNUTLS_E_UNRECOGNIZED_NAME -294
++
++/* PKCS11 related */
++#define GNUTLS_E_PKCS11_ERROR -300
++#define GNUTLS_E_PKCS11_LOAD_ERROR -301
++#define GNUTLS_E_PARSING_ERROR -302
++#define GNUTLS_E_PKCS11_PIN_ERROR -303
++
++#define GNUTLS_E_PKCS11_SLOT_ERROR -305
++#define GNUTLS_E_LOCKING_ERROR -306
++#define GNUTLS_E_PKCS11_ATTRIBUTE_ERROR -307
++#define GNUTLS_E_PKCS11_DEVICE_ERROR -308
++#define GNUTLS_E_PKCS11_DATA_ERROR -309
++#define GNUTLS_E_PKCS11_UNSUPPORTED_FEATURE_ERROR -310
++#define GNUTLS_E_PKCS11_KEY_ERROR -311
++#define GNUTLS_E_PKCS11_PIN_EXPIRED -312
++#define GNUTLS_E_PKCS11_PIN_LOCKED -313
++#define GNUTLS_E_PKCS11_SESSION_ERROR -314
++#define GNUTLS_E_PKCS11_SIGNATURE_ERROR -315
++#define GNUTLS_E_PKCS11_TOKEN_ERROR -316
++#define GNUTLS_E_PKCS11_USER_ERROR -317
++
++#define GNUTLS_E_CRYPTO_INIT_FAILED -318
++#define GNUTLS_E_TIMEDOUT -319
++#define GNUTLS_E_USER_ERROR -320
++#define GNUTLS_E_ECC_NO_SUPPORTED_CURVES -321
++#define GNUTLS_E_ECC_UNSUPPORTED_CURVE -322
++#define GNUTLS_E_PKCS11_REQUESTED_OBJECT_NOT_AVAILBLE -323
++#define GNUTLS_E_CERTIFICATE_LIST_UNSORTED -324
++#define GNUTLS_E_ILLEGAL_PARAMETER -325 /* GNUTLS_A_ILLEGAL_PARAMETER */
++#define GNUTLS_E_NO_PRIORITIES_WERE_SET -326
++#define GNUTLS_E_X509_UNSUPPORTED_EXTENSION -327
++#define GNUTLS_E_SESSION_EOF -328
++
++#define GNUTLS_E_TPM_ERROR -329
++#define GNUTLS_E_TPM_KEY_PASSWORD_ERROR -330
++#define GNUTLS_E_TPM_SRK_PASSWORD_ERROR -331
++#define GNUTLS_E_TPM_SESSION_ERROR -332
++#define GNUTLS_E_TPM_KEY_NOT_FOUND -333
++#define GNUTLS_E_TPM_UNINITIALIZED -334
++#define GNUTLS_E_TPM_NO_LIB -335
++
++#define GNUTLS_E_NO_CERTIFICATE_STATUS -340
++#define GNUTLS_E_OCSP_RESPONSE_ERROR -341
++#define GNUTLS_E_RANDOM_DEVICE_ERROR -342
++#define GNUTLS_E_AUTH_ERROR -343
++#define GNUTLS_E_NO_APPLICATION_PROTOCOL -344
++#define GNUTLS_E_SOCKETS_INIT_ERROR -345
++#define GNUTLS_E_KEY_IMPORT_FAILED -346
++#define GNUTLS_E_INAPPROPRIATE_FALLBACK -347 /*GNUTLS_A_INAPPROPRIATE_FALLBACK*/
++#define GNUTLS_E_CERTIFICATE_VERIFICATION_ERROR -348
++#define GNUTLS_E_PRIVKEY_VERIFICATION_ERROR -349
++#define GNUTLS_E_UNEXPECTED_EXTENSIONS_LENGTH -350 /*GNUTLS_A_DECODE_ERROR*/
++#define GNUTLS_E_ASN1_EMBEDDED_NULL_IN_STRING -351
++
++#define GNUTLS_E_SELF_TEST_ERROR -400
++#define GNUTLS_E_NO_SELF_TEST -401
++#define GNUTLS_E_LIB_IN_ERROR_STATE -402
++#define GNUTLS_E_PK_GENERATION_ERROR -403
++#define GNUTLS_E_IDNA_ERROR -404
++
++#define GNUTLS_E_NEED_FALLBACK -405
++#define GNUTLS_E_SESSION_USER_ID_CHANGED -406
++#define GNUTLS_E_HANDSHAKE_DURING_FALSE_START -407
++#define GNUTLS_E_UNAVAILABLE_DURING_HANDSHAKE -408
++#define GNUTLS_E_PK_INVALID_PUBKEY -409
++#define GNUTLS_E_PK_INVALID_PRIVKEY -410
++#define GNUTLS_E_NOT_YET_ACTIVATED -411
++#define GNUTLS_E_INVALID_UTF8_STRING -412
++#define GNUTLS_E_NO_EMBEDDED_DATA -413
++#define GNUTLS_E_INVALID_UTF8_EMAIL -414
++#define GNUTLS_E_INVALID_PASSWORD_STRING -415
++#define GNUTLS_E_CERTIFICATE_TIME_ERROR -416
++#define GNUTLS_E_RECORD_OVERFLOW -417	/* GNUTLS_A_RECORD_OVERFLOW */
++#define GNUTLS_E_ASN1_TIME_ERROR -418
++#define GNUTLS_E_INCOMPATIBLE_SIG_WITH_KEY -419
++#define GNUTLS_E_PK_INVALID_PUBKEY_PARAMS -420
++#define GNUTLS_E_PK_NO_VALIDATION_PARAMS -421
++#define GNUTLS_E_OCSP_MISMATCH_WITH_CERTS -422
++
++#define GNUTLS_E_NO_COMMON_KEY_SHARE -423
++#define GNUTLS_E_REAUTH_REQUEST -424
++#define GNUTLS_E_TOO_MANY_MATCHES -425
++#define GNUTLS_E_CRL_VERIFICATION_ERROR -426
++#define GNUTLS_E_MISSING_EXTENSION -427
++#define GNUTLS_E_DB_ENTRY_EXISTS -428
++#define GNUTLS_E_EARLY_DATA_REJECTED -429
++
++#define GNUTLS_E_UNIMPLEMENTED_FEATURE -1250
++
++/* Internal errors of the library; will never be returned
++ * to a calling application */
++#define GNUTLS_E_INT_RET_0 -1251
++#define GNUTLS_E_INT_CHECK_AGAIN -1252
++
++#define GNUTLS_E_APPLICATION_ERROR_MAX -65000
++#define GNUTLS_E_APPLICATION_ERROR_MIN -65500
++
++/* *INDENT-OFF* */
++#ifdef __cplusplus
++}
++#endif
++/* *INDENT-ON* */
++
++#include <gnutls/compat.h>
++
++#endif				/* GNUTLS_H */
+diff --git a/SMP/lib/accelerated/x86/coff/aes-ssse3-x86.asm b/SMP/lib/accelerated/x86/coff/aes-ssse3-x86.asm
+new file mode 100644
+index 0000000..aa84848
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/aes-ssse3-x86.asm
+@@ -0,0 +1,643 @@
++%ifidn __OUTPUT_FORMAT__,obj
++section	code	use32 class=code align=64
++%elifidn __OUTPUT_FORMAT__,win32
++%ifndef __YASM_VER__
++$@feat.00 equ 1
++%endif
++section	.text	code align=64
++%else
++section	.text	code
++%endif
++align	64
++L$_vpaes_consts:
++dd	218628480,235210255,168496130,67568393
++dd	252381056,17041926,33884169,51187212
++dd	252645135,252645135,252645135,252645135
++dd	1512730624,3266504856,1377990664,3401244816
++dd	830229760,1275146365,2969422977,3447763452
++dd	3411033600,2979783055,338359620,2782886510
++dd	4209124096,907596821,221174255,1006095553
++dd	191964160,3799684038,3164090317,1589111125
++dd	182528256,1777043520,2877432650,3265356744
++dd	1874708224,3503451415,3305285752,363511674
++dd	1606117888,3487855781,1093350906,2384367825
++dd	197121,67569157,134941193,202313229
++dd	67569157,134941193,202313229,197121
++dd	134941193,202313229,197121,67569157
++dd	202313229,197121,67569157,134941193
++dd	33619971,100992007,168364043,235736079
++dd	235736079,33619971,100992007,168364043
++dd	168364043,235736079,33619971,100992007
++dd	100992007,168364043,235736079,33619971
++dd	50462976,117835012,185207048,252579084
++dd	252314880,51251460,117574920,184942860
++dd	184682752,252054788,50987272,118359308
++dd	118099200,185467140,251790600,50727180
++dd	2946363062,528716217,1300004225,1881839624
++dd	1532713819,1532713819,1532713819,1532713819
++dd	3602276352,4288629033,3737020424,4153884961
++dd	1354558464,32357713,2958822624,3775749553
++dd	1201988352,132424512,1572796698,503232858
++dd	2213177600,1597421020,4103937655,675398315
++dd	2749646592,4273543773,1511898873,121693092
++dd	3040248576,1103263732,2871565598,1608280554
++dd	2236667136,2588920351,482954393,64377734
++dd	3069987328,291237287,2117370568,3650299247
++dd	533321216,3573750986,2572112006,1401264716
++dd	1339849704,2721158661,548607111,3445553514
++dd	2128193280,3054596040,2183486460,1257083700
++dd	655635200,1165381986,3923443150,2344132524
++dd	190078720,256924420,290342170,357187870
++dd	1610966272,2263057382,4103205268,309794674
++dd	2592527872,2233205587,1335446729,3402964816
++dd	3973531904,3225098121,3002836325,1918774430
++dd	3870401024,2102906079,2284471353,4117666579
++dd	617007872,1021508343,366931923,691083277
++dd	2528395776,3491914898,2968704004,1613121270
++dd	3445188352,3247741094,844474987,4093578302
++dd	651481088,1190302358,1689581232,574775300
++dd	4289380608,206939853,2555985458,2489840491
++dd	2130264064,327674451,3566485037,3349835193
++dd	2470714624,316102159,3636825756,3393945945
++db	86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105
++db	111,110,32,65,69,83,32,102,111,114,32,120,56,54,47,83
++db	83,83,69,51,44,32,77,105,107,101,32,72,97,109,98,117
++db	114,103,32,40,83,116,97,110,102,111,114,100,32,85,110,105
++db	118,101,114,115,105,116,121,41,0
++align	64
++align	16
++__vpaes_preheat:
++	add	ebp,DWORD [esp]
++	movdqa	xmm7,[ebp-48]
++	movdqa	xmm6,[ebp-16]
++	ret
++align	16
++__vpaes_encrypt_core:
++	mov	ecx,16
++	mov	eax,DWORD [240+edx]
++	movdqa	xmm1,xmm6
++	movdqa	xmm2,[ebp]
++	pandn	xmm1,xmm0
++	pand	xmm0,xmm6
++	movdqu	xmm5,[edx]
++db	102,15,56,0,208
++	movdqa	xmm0,[16+ebp]
++	pxor	xmm2,xmm5
++	psrld	xmm1,4
++	add	edx,16
++db	102,15,56,0,193
++	lea	ebx,[192+ebp]
++	pxor	xmm0,xmm2
++	jmp	NEAR L$000enc_entry
++align	16
++L$001enc_loop:
++	movdqa	xmm4,[32+ebp]
++	movdqa	xmm0,[48+ebp]
++db	102,15,56,0,226
++db	102,15,56,0,195
++	pxor	xmm4,xmm5
++	movdqa	xmm5,[64+ebp]
++	pxor	xmm0,xmm4
++	movdqa	xmm1,[ecx*1+ebx-64]
++db	102,15,56,0,234
++	movdqa	xmm2,[80+ebp]
++	movdqa	xmm4,[ecx*1+ebx]
++db	102,15,56,0,211
++	movdqa	xmm3,xmm0
++	pxor	xmm2,xmm5
++db	102,15,56,0,193
++	add	edx,16
++	pxor	xmm0,xmm2
++db	102,15,56,0,220
++	add	ecx,16
++	pxor	xmm3,xmm0
++db	102,15,56,0,193
++	and	ecx,48
++	sub	eax,1
++	pxor	xmm0,xmm3
++L$000enc_entry:
++	movdqa	xmm1,xmm6
++	movdqa	xmm5,[ebp-32]
++	pandn	xmm1,xmm0
++	psrld	xmm1,4
++	pand	xmm0,xmm6
++db	102,15,56,0,232
++	movdqa	xmm3,xmm7
++	pxor	xmm0,xmm1
++db	102,15,56,0,217
++	movdqa	xmm4,xmm7
++	pxor	xmm3,xmm5
++db	102,15,56,0,224
++	movdqa	xmm2,xmm7
++	pxor	xmm4,xmm5
++db	102,15,56,0,211
++	movdqa	xmm3,xmm7
++	pxor	xmm2,xmm0
++db	102,15,56,0,220
++	movdqu	xmm5,[edx]
++	pxor	xmm3,xmm1
++	jnz	NEAR L$001enc_loop
++	movdqa	xmm4,[96+ebp]
++	movdqa	xmm0,[112+ebp]
++db	102,15,56,0,226
++	pxor	xmm4,xmm5
++db	102,15,56,0,195
++	movdqa	xmm1,[64+ecx*1+ebx]
++	pxor	xmm0,xmm4
++db	102,15,56,0,193
++	ret
++align	16
++__vpaes_decrypt_core:
++	lea	ebx,[608+ebp]
++	mov	eax,DWORD [240+edx]
++	movdqa	xmm1,xmm6
++	movdqa	xmm2,[ebx-64]
++	pandn	xmm1,xmm0
++	mov	ecx,eax
++	psrld	xmm1,4
++	movdqu	xmm5,[edx]
++	shl	ecx,4
++	pand	xmm0,xmm6
++db	102,15,56,0,208
++	movdqa	xmm0,[ebx-48]
++	xor	ecx,48
++db	102,15,56,0,193
++	and	ecx,48
++	pxor	xmm2,xmm5
++	movdqa	xmm5,[176+ebp]
++	pxor	xmm0,xmm2
++	add	edx,16
++	lea	ecx,[ecx*1+ebx-352]
++	jmp	NEAR L$002dec_entry
++align	16
++L$003dec_loop:
++	movdqa	xmm4,[ebx-32]
++	movdqa	xmm1,[ebx-16]
++db	102,15,56,0,226
++db	102,15,56,0,203
++	pxor	xmm0,xmm4
++	movdqa	xmm4,[ebx]
++	pxor	xmm0,xmm1
++	movdqa	xmm1,[16+ebx]
++db	102,15,56,0,226
++db	102,15,56,0,197
++db	102,15,56,0,203
++	pxor	xmm0,xmm4
++	movdqa	xmm4,[32+ebx]
++	pxor	xmm0,xmm1
++	movdqa	xmm1,[48+ebx]
++db	102,15,56,0,226
++db	102,15,56,0,197
++db	102,15,56,0,203
++	pxor	xmm0,xmm4
++	movdqa	xmm4,[64+ebx]
++	pxor	xmm0,xmm1
++	movdqa	xmm1,[80+ebx]
++db	102,15,56,0,226
++db	102,15,56,0,197
++db	102,15,56,0,203
++	pxor	xmm0,xmm4
++	add	edx,16
++db	102,15,58,15,237,12
++	pxor	xmm0,xmm1
++	sub	eax,1
++L$002dec_entry:
++	movdqa	xmm1,xmm6
++	movdqa	xmm2,[ebp-32]
++	pandn	xmm1,xmm0
++	pand	xmm0,xmm6
++	psrld	xmm1,4
++db	102,15,56,0,208
++	movdqa	xmm3,xmm7
++	pxor	xmm0,xmm1
++db	102,15,56,0,217
++	movdqa	xmm4,xmm7
++	pxor	xmm3,xmm2
++db	102,15,56,0,224
++	pxor	xmm4,xmm2
++	movdqa	xmm2,xmm7
++db	102,15,56,0,211
++	movdqa	xmm3,xmm7
++	pxor	xmm2,xmm0
++db	102,15,56,0,220
++	movdqu	xmm0,[edx]
++	pxor	xmm3,xmm1
++	jnz	NEAR L$003dec_loop
++	movdqa	xmm4,[96+ebx]
++db	102,15,56,0,226
++	pxor	xmm4,xmm0
++	movdqa	xmm0,[112+ebx]
++	movdqa	xmm2,[ecx]
++db	102,15,56,0,195
++	pxor	xmm0,xmm4
++db	102,15,56,0,194
++	ret
++align	16
++__vpaes_schedule_core:
++	add	ebp,DWORD [esp]
++	movdqu	xmm0,[esi]
++	movdqa	xmm2,[320+ebp]
++	movdqa	xmm3,xmm0
++	lea	ebx,[ebp]
++	movdqa	[4+esp],xmm2
++	call	__vpaes_schedule_transform
++	movdqa	xmm7,xmm0
++	test	edi,edi
++	jnz	NEAR L$004schedule_am_decrypting
++	movdqu	[edx],xmm0
++	jmp	NEAR L$005schedule_go
++L$004schedule_am_decrypting:
++	movdqa	xmm1,[256+ecx*1+ebp]
++db	102,15,56,0,217
++	movdqu	[edx],xmm3
++	xor	ecx,48
++L$005schedule_go:
++	cmp	eax,192
++	ja	NEAR L$006schedule_256
++	je	NEAR L$007schedule_192
++L$008schedule_128:
++	mov	eax,10
++L$009loop_schedule_128:
++	call	__vpaes_schedule_round
++	dec	eax
++	jz	NEAR L$010schedule_mangle_last
++	call	__vpaes_schedule_mangle
++	jmp	NEAR L$009loop_schedule_128
++align	16
++L$007schedule_192:
++	movdqu	xmm0,[8+esi]
++	call	__vpaes_schedule_transform
++	movdqa	xmm6,xmm0
++	pxor	xmm4,xmm4
++	movhlps	xmm6,xmm4
++	mov	eax,4
++L$011loop_schedule_192:
++	call	__vpaes_schedule_round
++db	102,15,58,15,198,8
++	call	__vpaes_schedule_mangle
++	call	__vpaes_schedule_192_smear
++	call	__vpaes_schedule_mangle
++	call	__vpaes_schedule_round
++	dec	eax
++	jz	NEAR L$010schedule_mangle_last
++	call	__vpaes_schedule_mangle
++	call	__vpaes_schedule_192_smear
++	jmp	NEAR L$011loop_schedule_192
++align	16
++L$006schedule_256:
++	movdqu	xmm0,[16+esi]
++	call	__vpaes_schedule_transform
++	mov	eax,7
++L$012loop_schedule_256:
++	call	__vpaes_schedule_mangle
++	movdqa	xmm6,xmm0
++	call	__vpaes_schedule_round
++	dec	eax
++	jz	NEAR L$010schedule_mangle_last
++	call	__vpaes_schedule_mangle
++	pshufd	xmm0,xmm0,255
++	movdqa	[20+esp],xmm7
++	movdqa	xmm7,xmm6
++	call	L$_vpaes_schedule_low_round
++	movdqa	xmm7,[20+esp]
++	jmp	NEAR L$012loop_schedule_256
++align	16
++L$010schedule_mangle_last:
++	lea	ebx,[384+ebp]
++	test	edi,edi
++	jnz	NEAR L$013schedule_mangle_last_dec
++	movdqa	xmm1,[256+ecx*1+ebp]
++db	102,15,56,0,193
++	lea	ebx,[352+ebp]
++	add	edx,32
++L$013schedule_mangle_last_dec:
++	add	edx,-16
++	pxor	xmm0,[336+ebp]
++	call	__vpaes_schedule_transform
++	movdqu	[edx],xmm0
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	pxor	xmm6,xmm6
++	pxor	xmm7,xmm7
++	ret
++align	16
++__vpaes_schedule_192_smear:
++	pshufd	xmm1,xmm6,128
++	pshufd	xmm0,xmm7,254
++	pxor	xmm6,xmm1
++	pxor	xmm1,xmm1
++	pxor	xmm6,xmm0
++	movdqa	xmm0,xmm6
++	movhlps	xmm6,xmm1
++	ret
++align	16
++__vpaes_schedule_round:
++	movdqa	xmm2,[8+esp]
++	pxor	xmm1,xmm1
++db	102,15,58,15,202,15
++db	102,15,58,15,210,15
++	pxor	xmm7,xmm1
++	pshufd	xmm0,xmm0,255
++db	102,15,58,15,192,1
++	movdqa	[8+esp],xmm2
++L$_vpaes_schedule_low_round:
++	movdqa	xmm1,xmm7
++	pslldq	xmm7,4
++	pxor	xmm7,xmm1
++	movdqa	xmm1,xmm7
++	pslldq	xmm7,8
++	pxor	xmm7,xmm1
++	pxor	xmm7,[336+ebp]
++	movdqa	xmm4,[ebp-16]
++	movdqa	xmm5,[ebp-48]
++	movdqa	xmm1,xmm4
++	pandn	xmm1,xmm0
++	psrld	xmm1,4
++	pand	xmm0,xmm4
++	movdqa	xmm2,[ebp-32]
++db	102,15,56,0,208
++	pxor	xmm0,xmm1
++	movdqa	xmm3,xmm5
++db	102,15,56,0,217
++	pxor	xmm3,xmm2
++	movdqa	xmm4,xmm5
++db	102,15,56,0,224
++	pxor	xmm4,xmm2
++	movdqa	xmm2,xmm5
++db	102,15,56,0,211
++	pxor	xmm2,xmm0
++	movdqa	xmm3,xmm5
++db	102,15,56,0,220
++	pxor	xmm3,xmm1
++	movdqa	xmm4,[32+ebp]
++db	102,15,56,0,226
++	movdqa	xmm0,[48+ebp]
++db	102,15,56,0,195
++	pxor	xmm0,xmm4
++	pxor	xmm0,xmm7
++	movdqa	xmm7,xmm0
++	ret
++align	16
++__vpaes_schedule_transform:
++	movdqa	xmm2,[ebp-16]
++	movdqa	xmm1,xmm2
++	pandn	xmm1,xmm0
++	psrld	xmm1,4
++	pand	xmm0,xmm2
++	movdqa	xmm2,[ebx]
++db	102,15,56,0,208
++	movdqa	xmm0,[16+ebx]
++db	102,15,56,0,193
++	pxor	xmm0,xmm2
++	ret
++align	16
++__vpaes_schedule_mangle:
++	movdqa	xmm4,xmm0
++	movdqa	xmm5,[128+ebp]
++	test	edi,edi
++	jnz	NEAR L$014schedule_mangle_dec
++	add	edx,16
++	pxor	xmm4,[336+ebp]
++db	102,15,56,0,229
++	movdqa	xmm3,xmm4
++db	102,15,56,0,229
++	pxor	xmm3,xmm4
++db	102,15,56,0,229
++	pxor	xmm3,xmm4
++	jmp	NEAR L$015schedule_mangle_both
++align	16
++L$014schedule_mangle_dec:
++	movdqa	xmm2,[ebp-16]
++	lea	esi,[416+ebp]
++	movdqa	xmm1,xmm2
++	pandn	xmm1,xmm4
++	psrld	xmm1,4
++	pand	xmm4,xmm2
++	movdqa	xmm2,[esi]
++db	102,15,56,0,212
++	movdqa	xmm3,[16+esi]
++db	102,15,56,0,217
++	pxor	xmm3,xmm2
++db	102,15,56,0,221
++	movdqa	xmm2,[32+esi]
++db	102,15,56,0,212
++	pxor	xmm2,xmm3
++	movdqa	xmm3,[48+esi]
++db	102,15,56,0,217
++	pxor	xmm3,xmm2
++db	102,15,56,0,221
++	movdqa	xmm2,[64+esi]
++db	102,15,56,0,212
++	pxor	xmm2,xmm3
++	movdqa	xmm3,[80+esi]
++db	102,15,56,0,217
++	pxor	xmm3,xmm2
++db	102,15,56,0,221
++	movdqa	xmm2,[96+esi]
++db	102,15,56,0,212
++	pxor	xmm2,xmm3
++	movdqa	xmm3,[112+esi]
++db	102,15,56,0,217
++	pxor	xmm3,xmm2
++	add	edx,-16
++L$015schedule_mangle_both:
++	movdqa	xmm1,[256+ecx*1+ebp]
++db	102,15,56,0,217
++	add	ecx,-16
++	and	ecx,48
++	movdqu	[edx],xmm3
++	ret
++global	_vpaes_set_encrypt_key
++align	16
++_vpaes_set_encrypt_key:
++L$_vpaes_set_encrypt_key_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	esi,DWORD [20+esp]
++	lea	ebx,[esp-56]
++	mov	eax,DWORD [24+esp]
++	and	ebx,-16
++	mov	edx,DWORD [28+esp]
++	xchg	ebx,esp
++	mov	DWORD [48+esp],ebx
++	mov	ebx,eax
++	shr	ebx,5
++	add	ebx,5
++	mov	DWORD [240+edx],ebx
++	mov	ecx,48
++	mov	edi,0
++	lea	ebp,[(L$_vpaes_consts+0x30-L$016pic_point)]
++	call	__vpaes_schedule_core
++L$016pic_point:
++	mov	esp,DWORD [48+esp]
++	xor	eax,eax
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_vpaes_set_decrypt_key
++align	16
++_vpaes_set_decrypt_key:
++L$_vpaes_set_decrypt_key_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	esi,DWORD [20+esp]
++	lea	ebx,[esp-56]
++	mov	eax,DWORD [24+esp]
++	and	ebx,-16
++	mov	edx,DWORD [28+esp]
++	xchg	ebx,esp
++	mov	DWORD [48+esp],ebx
++	mov	ebx,eax
++	shr	ebx,5
++	add	ebx,5
++	mov	DWORD [240+edx],ebx
++	shl	ebx,4
++	lea	edx,[16+ebx*1+edx]
++	mov	edi,1
++	mov	ecx,eax
++	shr	ecx,1
++	and	ecx,32
++	xor	ecx,32
++	lea	ebp,[(L$_vpaes_consts+0x30-L$017pic_point)]
++	call	__vpaes_schedule_core
++L$017pic_point:
++	mov	esp,DWORD [48+esp]
++	xor	eax,eax
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_vpaes_encrypt
++align	16
++_vpaes_encrypt:
++L$_vpaes_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	lea	ebp,[(L$_vpaes_consts+0x30-L$018pic_point)]
++	call	__vpaes_preheat
++L$018pic_point:
++	mov	esi,DWORD [20+esp]
++	lea	ebx,[esp-56]
++	mov	edi,DWORD [24+esp]
++	and	ebx,-16
++	mov	edx,DWORD [28+esp]
++	xchg	ebx,esp
++	mov	DWORD [48+esp],ebx
++	movdqu	xmm0,[esi]
++	call	__vpaes_encrypt_core
++	movdqu	[edi],xmm0
++	mov	esp,DWORD [48+esp]
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_vpaes_decrypt
++align	16
++_vpaes_decrypt:
++L$_vpaes_decrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	lea	ebp,[(L$_vpaes_consts+0x30-L$019pic_point)]
++	call	__vpaes_preheat
++L$019pic_point:
++	mov	esi,DWORD [20+esp]
++	lea	ebx,[esp-56]
++	mov	edi,DWORD [24+esp]
++	and	ebx,-16
++	mov	edx,DWORD [28+esp]
++	xchg	ebx,esp
++	mov	DWORD [48+esp],ebx
++	movdqu	xmm0,[esi]
++	call	__vpaes_decrypt_core
++	movdqu	[edi],xmm0
++	mov	esp,DWORD [48+esp]
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_vpaes_cbc_encrypt
++align	16
++_vpaes_cbc_encrypt:
++L$_vpaes_cbc_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	edx,DWORD [32+esp]
++	sub	eax,16
++	jc	NEAR L$020cbc_abort
++	lea	ebx,[esp-56]
++	mov	ebp,DWORD [36+esp]
++	and	ebx,-16
++	mov	ecx,DWORD [40+esp]
++	xchg	ebx,esp
++	movdqu	xmm1,[ebp]
++	sub	edi,esi
++	mov	DWORD [48+esp],ebx
++	mov	DWORD [esp],edi
++	mov	DWORD [4+esp],edx
++	mov	DWORD [8+esp],ebp
++	mov	edi,eax
++	lea	ebp,[(L$_vpaes_consts+0x30-L$021pic_point)]
++	call	__vpaes_preheat
++L$021pic_point:
++	cmp	ecx,0
++	je	NEAR L$022cbc_dec_loop
++	jmp	NEAR L$023cbc_enc_loop
++align	16
++L$023cbc_enc_loop:
++	movdqu	xmm0,[esi]
++	pxor	xmm0,xmm1
++	call	__vpaes_encrypt_core
++	mov	ebx,DWORD [esp]
++	mov	edx,DWORD [4+esp]
++	movdqa	xmm1,xmm0
++	movdqu	[esi*1+ebx],xmm0
++	lea	esi,[16+esi]
++	sub	edi,16
++	jnc	NEAR L$023cbc_enc_loop
++	jmp	NEAR L$024cbc_done
++align	16
++L$022cbc_dec_loop:
++	movdqu	xmm0,[esi]
++	movdqa	[16+esp],xmm1
++	movdqa	[32+esp],xmm0
++	call	__vpaes_decrypt_core
++	mov	ebx,DWORD [esp]
++	mov	edx,DWORD [4+esp]
++	pxor	xmm0,[16+esp]
++	movdqa	xmm1,[32+esp]
++	movdqu	[esi*1+ebx],xmm0
++	lea	esi,[16+esi]
++	sub	edi,16
++	jnc	NEAR L$022cbc_dec_loop
++L$024cbc_done:
++	mov	ebx,DWORD [8+esp]
++	mov	esp,DWORD [48+esp]
++	movdqu	[ebx],xmm1
++L$020cbc_abort:
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
+diff --git a/SMP/lib/accelerated/x86/coff/aes-ssse3-x86_64.asm b/SMP/lib/accelerated/x86/coff/aes-ssse3-x86_64.asm
+new file mode 100644
+index 0000000..3edde9f
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/aes-ssse3-x86_64.asm
+@@ -0,0 +1,1137 @@
++default	rel
++%define XMMWORD
++%define YMMWORD
++%define ZMMWORD
++section	.text code align=64
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++ALIGN	16
++_vpaes_encrypt_core:
++	mov	r9,rdx
++	mov	r11,16
++	mov	eax,DWORD[240+rdx]
++	movdqa	xmm1,xmm9
++	movdqa	xmm2,XMMWORD[$L$k_ipt]
++	pandn	xmm1,xmm0
++	movdqu	xmm5,XMMWORD[r9]
++	psrld	xmm1,4
++	pand	xmm0,xmm9
++DB	102,15,56,0,208
++	movdqa	xmm0,XMMWORD[(($L$k_ipt+16))]
++DB	102,15,56,0,193
++	pxor	xmm2,xmm5
++	add	r9,16
++	pxor	xmm0,xmm2
++	lea	r10,[$L$k_mc_backward]
++	jmp	NEAR $L$enc_entry
++
++ALIGN	16
++$L$enc_loop:
++
++	movdqa	xmm4,xmm13
++	movdqa	xmm0,xmm12
++DB	102,15,56,0,226
++DB	102,15,56,0,195
++	pxor	xmm4,xmm5
++	movdqa	xmm5,xmm15
++	pxor	xmm0,xmm4
++	movdqa	xmm1,XMMWORD[((-64))+r10*1+r11]
++DB	102,15,56,0,234
++	movdqa	xmm4,XMMWORD[r10*1+r11]
++	movdqa	xmm2,xmm14
++DB	102,15,56,0,211
++	movdqa	xmm3,xmm0
++	pxor	xmm2,xmm5
++DB	102,15,56,0,193
++	add	r9,16
++	pxor	xmm0,xmm2
++DB	102,15,56,0,220
++	add	r11,16
++	pxor	xmm3,xmm0
++DB	102,15,56,0,193
++	and	r11,0x30
++	sub	rax,1
++	pxor	xmm0,xmm3
++
++$L$enc_entry:
++
++	movdqa	xmm1,xmm9
++	movdqa	xmm5,xmm11
++	pandn	xmm1,xmm0
++	psrld	xmm1,4
++	pand	xmm0,xmm9
++DB	102,15,56,0,232
++	movdqa	xmm3,xmm10
++	pxor	xmm0,xmm1
++DB	102,15,56,0,217
++	movdqa	xmm4,xmm10
++	pxor	xmm3,xmm5
++DB	102,15,56,0,224
++	movdqa	xmm2,xmm10
++	pxor	xmm4,xmm5
++DB	102,15,56,0,211
++	movdqa	xmm3,xmm10
++	pxor	xmm2,xmm0
++DB	102,15,56,0,220
++	movdqu	xmm5,XMMWORD[r9]
++	pxor	xmm3,xmm1
++	jnz	NEAR $L$enc_loop
++
++
++	movdqa	xmm4,XMMWORD[((-96))+r10]
++	movdqa	xmm0,XMMWORD[((-80))+r10]
++DB	102,15,56,0,226
++	pxor	xmm4,xmm5
++DB	102,15,56,0,195
++	movdqa	xmm1,XMMWORD[64+r10*1+r11]
++	pxor	xmm0,xmm4
++DB	102,15,56,0,193
++	DB	0F3h,0C3h		;repret
++
++
++
++
++
++
++
++
++ALIGN	16
++_vpaes_decrypt_core:
++	mov	r9,rdx
++	mov	eax,DWORD[240+rdx]
++	movdqa	xmm1,xmm9
++	movdqa	xmm2,XMMWORD[$L$k_dipt]
++	pandn	xmm1,xmm0
++	mov	r11,rax
++	psrld	xmm1,4
++	movdqu	xmm5,XMMWORD[r9]
++	shl	r11,4
++	pand	xmm0,xmm9
++DB	102,15,56,0,208
++	movdqa	xmm0,XMMWORD[(($L$k_dipt+16))]
++	xor	r11,0x30
++	lea	r10,[$L$k_dsbd]
++DB	102,15,56,0,193
++	and	r11,0x30
++	pxor	xmm2,xmm5
++	movdqa	xmm5,XMMWORD[(($L$k_mc_forward+48))]
++	pxor	xmm0,xmm2
++	add	r9,16
++	add	r11,r10
++	jmp	NEAR $L$dec_entry
++
++ALIGN	16
++$L$dec_loop:
++
++
++
++	movdqa	xmm4,XMMWORD[((-32))+r10]
++	movdqa	xmm1,XMMWORD[((-16))+r10]
++DB	102,15,56,0,226
++DB	102,15,56,0,203
++	pxor	xmm0,xmm4
++	movdqa	xmm4,XMMWORD[r10]
++	pxor	xmm0,xmm1
++	movdqa	xmm1,XMMWORD[16+r10]
++
++DB	102,15,56,0,226
++DB	102,15,56,0,197
++DB	102,15,56,0,203
++	pxor	xmm0,xmm4
++	movdqa	xmm4,XMMWORD[32+r10]
++	pxor	xmm0,xmm1
++	movdqa	xmm1,XMMWORD[48+r10]
++
++DB	102,15,56,0,226
++DB	102,15,56,0,197
++DB	102,15,56,0,203
++	pxor	xmm0,xmm4
++	movdqa	xmm4,XMMWORD[64+r10]
++	pxor	xmm0,xmm1
++	movdqa	xmm1,XMMWORD[80+r10]
++
++DB	102,15,56,0,226
++DB	102,15,56,0,197
++DB	102,15,56,0,203
++	pxor	xmm0,xmm4
++	add	r9,16
++DB	102,15,58,15,237,12
++	pxor	xmm0,xmm1
++	sub	rax,1
++
++$L$dec_entry:
++
++	movdqa	xmm1,xmm9
++	pandn	xmm1,xmm0
++	movdqa	xmm2,xmm11
++	psrld	xmm1,4
++	pand	xmm0,xmm9
++DB	102,15,56,0,208
++	movdqa	xmm3,xmm10
++	pxor	xmm0,xmm1
++DB	102,15,56,0,217
++	movdqa	xmm4,xmm10
++	pxor	xmm3,xmm2
++DB	102,15,56,0,224
++	pxor	xmm4,xmm2
++	movdqa	xmm2,xmm10
++DB	102,15,56,0,211
++	movdqa	xmm3,xmm10
++	pxor	xmm2,xmm0
++DB	102,15,56,0,220
++	movdqu	xmm0,XMMWORD[r9]
++	pxor	xmm3,xmm1
++	jnz	NEAR $L$dec_loop
++
++
++	movdqa	xmm4,XMMWORD[96+r10]
++DB	102,15,56,0,226
++	pxor	xmm4,xmm0
++	movdqa	xmm0,XMMWORD[112+r10]
++	movdqa	xmm2,XMMWORD[((-352))+r11]
++DB	102,15,56,0,195
++	pxor	xmm0,xmm4
++DB	102,15,56,0,194
++	DB	0F3h,0C3h		;repret
++
++
++
++
++
++
++
++
++ALIGN	16
++_vpaes_schedule_core:
++
++
++
++
++
++	call	_vpaes_preheat
++	movdqa	xmm8,XMMWORD[$L$k_rcon]
++	movdqu	xmm0,XMMWORD[rdi]
++
++
++	movdqa	xmm3,xmm0
++	lea	r11,[$L$k_ipt]
++	call	_vpaes_schedule_transform
++	movdqa	xmm7,xmm0
++
++	lea	r10,[$L$k_sr]
++	test	rcx,rcx
++	jnz	NEAR $L$schedule_am_decrypting
++
++
++	movdqu	XMMWORD[rdx],xmm0
++	jmp	NEAR $L$schedule_go
++
++$L$schedule_am_decrypting:
++
++	movdqa	xmm1,XMMWORD[r10*1+r8]
++DB	102,15,56,0,217
++	movdqu	XMMWORD[rdx],xmm3
++	xor	r8,0x30
++
++$L$schedule_go:
++	cmp	esi,192
++	ja	NEAR $L$schedule_256
++	je	NEAR $L$schedule_192
++
++
++
++
++
++
++
++
++
++
++$L$schedule_128:
++	mov	esi,10
++
++$L$oop_schedule_128:
++	call	_vpaes_schedule_round
++	dec	rsi
++	jz	NEAR $L$schedule_mangle_last
++	call	_vpaes_schedule_mangle
++	jmp	NEAR $L$oop_schedule_128
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++ALIGN	16
++$L$schedule_192:
++	movdqu	xmm0,XMMWORD[8+rdi]
++	call	_vpaes_schedule_transform
++	movdqa	xmm6,xmm0
++	pxor	xmm4,xmm4
++	movhlps	xmm6,xmm4
++	mov	esi,4
++
++$L$oop_schedule_192:
++	call	_vpaes_schedule_round
++DB	102,15,58,15,198,8
++	call	_vpaes_schedule_mangle
++	call	_vpaes_schedule_192_smear
++	call	_vpaes_schedule_mangle
++	call	_vpaes_schedule_round
++	dec	rsi
++	jz	NEAR $L$schedule_mangle_last
++	call	_vpaes_schedule_mangle
++	call	_vpaes_schedule_192_smear
++	jmp	NEAR $L$oop_schedule_192
++
++
++
++
++
++
++
++
++
++
++
++ALIGN	16
++$L$schedule_256:
++	movdqu	xmm0,XMMWORD[16+rdi]
++	call	_vpaes_schedule_transform
++	mov	esi,7
++
++$L$oop_schedule_256:
++	call	_vpaes_schedule_mangle
++	movdqa	xmm6,xmm0
++
++
++	call	_vpaes_schedule_round
++	dec	rsi
++	jz	NEAR $L$schedule_mangle_last
++	call	_vpaes_schedule_mangle
++
++
++	pshufd	xmm0,xmm0,0xFF
++	movdqa	xmm5,xmm7
++	movdqa	xmm7,xmm6
++	call	_vpaes_schedule_low_round
++	movdqa	xmm7,xmm5
++
++	jmp	NEAR $L$oop_schedule_256
++
++
++
++
++
++
++
++
++
++
++
++
++ALIGN	16
++$L$schedule_mangle_last:
++
++	lea	r11,[$L$k_deskew]
++	test	rcx,rcx
++	jnz	NEAR $L$schedule_mangle_last_dec
++
++
++	movdqa	xmm1,XMMWORD[r10*1+r8]
++DB	102,15,56,0,193
++	lea	r11,[$L$k_opt]
++	add	rdx,32
++
++$L$schedule_mangle_last_dec:
++	add	rdx,-16
++	pxor	xmm0,XMMWORD[$L$k_s63]
++	call	_vpaes_schedule_transform
++	movdqu	XMMWORD[rdx],xmm0
++
++
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	pxor	xmm6,xmm6
++	pxor	xmm7,xmm7
++	DB	0F3h,0C3h		;repret
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++ALIGN	16
++_vpaes_schedule_192_smear:
++	pshufd	xmm1,xmm6,0x80
++	pshufd	xmm0,xmm7,0xFE
++	pxor	xmm6,xmm1
++	pxor	xmm1,xmm1
++	pxor	xmm6,xmm0
++	movdqa	xmm0,xmm6
++	movhlps	xmm6,xmm1
++	DB	0F3h,0C3h		;repret
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++ALIGN	16
++_vpaes_schedule_round:
++
++	pxor	xmm1,xmm1
++DB	102,65,15,58,15,200,15
++DB	102,69,15,58,15,192,15
++	pxor	xmm7,xmm1
++
++
++	pshufd	xmm0,xmm0,0xFF
++DB	102,15,58,15,192,1
++
++
++
++
++_vpaes_schedule_low_round:
++
++	movdqa	xmm1,xmm7
++	pslldq	xmm7,4
++	pxor	xmm7,xmm1
++	movdqa	xmm1,xmm7
++	pslldq	xmm7,8
++	pxor	xmm7,xmm1
++	pxor	xmm7,XMMWORD[$L$k_s63]
++
++
++	movdqa	xmm1,xmm9
++	pandn	xmm1,xmm0
++	psrld	xmm1,4
++	pand	xmm0,xmm9
++	movdqa	xmm2,xmm11
++DB	102,15,56,0,208
++	pxor	xmm0,xmm1
++	movdqa	xmm3,xmm10
++DB	102,15,56,0,217
++	pxor	xmm3,xmm2
++	movdqa	xmm4,xmm10
++DB	102,15,56,0,224
++	pxor	xmm4,xmm2
++	movdqa	xmm2,xmm10
++DB	102,15,56,0,211
++	pxor	xmm2,xmm0
++	movdqa	xmm3,xmm10
++DB	102,15,56,0,220
++	pxor	xmm3,xmm1
++	movdqa	xmm4,xmm13
++DB	102,15,56,0,226
++	movdqa	xmm0,xmm12
++DB	102,15,56,0,195
++	pxor	xmm0,xmm4
++
++
++	pxor	xmm0,xmm7
++	movdqa	xmm7,xmm0
++	DB	0F3h,0C3h		;repret
++
++
++
++
++
++
++
++
++
++
++
++
++ALIGN	16
++_vpaes_schedule_transform:
++	movdqa	xmm1,xmm9
++	pandn	xmm1,xmm0
++	psrld	xmm1,4
++	pand	xmm0,xmm9
++	movdqa	xmm2,XMMWORD[r11]
++DB	102,15,56,0,208
++	movdqa	xmm0,XMMWORD[16+r11]
++DB	102,15,56,0,193
++	pxor	xmm0,xmm2
++	DB	0F3h,0C3h		;repret
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++ALIGN	16
++_vpaes_schedule_mangle:
++	movdqa	xmm4,xmm0
++	movdqa	xmm5,XMMWORD[$L$k_mc_forward]
++	test	rcx,rcx
++	jnz	NEAR $L$schedule_mangle_dec
++
++
++	add	rdx,16
++	pxor	xmm4,XMMWORD[$L$k_s63]
++DB	102,15,56,0,229
++	movdqa	xmm3,xmm4
++DB	102,15,56,0,229
++	pxor	xmm3,xmm4
++DB	102,15,56,0,229
++	pxor	xmm3,xmm4
++
++	jmp	NEAR $L$schedule_mangle_both
++ALIGN	16
++$L$schedule_mangle_dec:
++
++	lea	r11,[$L$k_dksd]
++	movdqa	xmm1,xmm9
++	pandn	xmm1,xmm4
++	psrld	xmm1,4
++	pand	xmm4,xmm9
++
++	movdqa	xmm2,XMMWORD[r11]
++DB	102,15,56,0,212
++	movdqa	xmm3,XMMWORD[16+r11]
++DB	102,15,56,0,217
++	pxor	xmm3,xmm2
++DB	102,15,56,0,221
++
++	movdqa	xmm2,XMMWORD[32+r11]
++DB	102,15,56,0,212
++	pxor	xmm2,xmm3
++	movdqa	xmm3,XMMWORD[48+r11]
++DB	102,15,56,0,217
++	pxor	xmm3,xmm2
++DB	102,15,56,0,221
++
++	movdqa	xmm2,XMMWORD[64+r11]
++DB	102,15,56,0,212
++	pxor	xmm2,xmm3
++	movdqa	xmm3,XMMWORD[80+r11]
++DB	102,15,56,0,217
++	pxor	xmm3,xmm2
++DB	102,15,56,0,221
++
++	movdqa	xmm2,XMMWORD[96+r11]
++DB	102,15,56,0,212
++	pxor	xmm2,xmm3
++	movdqa	xmm3,XMMWORD[112+r11]
++DB	102,15,56,0,217
++	pxor	xmm3,xmm2
++
++	add	rdx,-16
++
++$L$schedule_mangle_both:
++	movdqa	xmm1,XMMWORD[r10*1+r8]
++DB	102,15,56,0,217
++	add	r8,-16
++	and	r8,0x30
++	movdqu	XMMWORD[rdx],xmm3
++	DB	0F3h,0C3h		;repret
++
++
++
++
++
++global	vpaes_set_encrypt_key
++
++ALIGN	16
++vpaes_set_encrypt_key:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_vpaes_set_encrypt_key:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	lea	rsp,[((-184))+rsp]
++	movaps	XMMWORD[16+rsp],xmm6
++	movaps	XMMWORD[32+rsp],xmm7
++	movaps	XMMWORD[48+rsp],xmm8
++	movaps	XMMWORD[64+rsp],xmm9
++	movaps	XMMWORD[80+rsp],xmm10
++	movaps	XMMWORD[96+rsp],xmm11
++	movaps	XMMWORD[112+rsp],xmm12
++	movaps	XMMWORD[128+rsp],xmm13
++	movaps	XMMWORD[144+rsp],xmm14
++	movaps	XMMWORD[160+rsp],xmm15
++$L$enc_key_body:
++	mov	eax,esi
++	shr	eax,5
++	add	eax,5
++	mov	DWORD[240+rdx],eax
++
++	mov	ecx,0
++	mov	r8d,0x30
++	call	_vpaes_schedule_core
++	movaps	xmm6,XMMWORD[16+rsp]
++	movaps	xmm7,XMMWORD[32+rsp]
++	movaps	xmm8,XMMWORD[48+rsp]
++	movaps	xmm9,XMMWORD[64+rsp]
++	movaps	xmm10,XMMWORD[80+rsp]
++	movaps	xmm11,XMMWORD[96+rsp]
++	movaps	xmm12,XMMWORD[112+rsp]
++	movaps	xmm13,XMMWORD[128+rsp]
++	movaps	xmm14,XMMWORD[144+rsp]
++	movaps	xmm15,XMMWORD[160+rsp]
++	lea	rsp,[184+rsp]
++$L$enc_key_epilogue:
++	xor	eax,eax
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_vpaes_set_encrypt_key:
++
++global	vpaes_set_decrypt_key
++
++ALIGN	16
++vpaes_set_decrypt_key:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_vpaes_set_decrypt_key:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	lea	rsp,[((-184))+rsp]
++	movaps	XMMWORD[16+rsp],xmm6
++	movaps	XMMWORD[32+rsp],xmm7
++	movaps	XMMWORD[48+rsp],xmm8
++	movaps	XMMWORD[64+rsp],xmm9
++	movaps	XMMWORD[80+rsp],xmm10
++	movaps	XMMWORD[96+rsp],xmm11
++	movaps	XMMWORD[112+rsp],xmm12
++	movaps	XMMWORD[128+rsp],xmm13
++	movaps	XMMWORD[144+rsp],xmm14
++	movaps	XMMWORD[160+rsp],xmm15
++$L$dec_key_body:
++	mov	eax,esi
++	shr	eax,5
++	add	eax,5
++	mov	DWORD[240+rdx],eax
++	shl	eax,4
++	lea	rdx,[16+rax*1+rdx]
++
++	mov	ecx,1
++	mov	r8d,esi
++	shr	r8d,1
++	and	r8d,32
++	xor	r8d,32
++	call	_vpaes_schedule_core
++	movaps	xmm6,XMMWORD[16+rsp]
++	movaps	xmm7,XMMWORD[32+rsp]
++	movaps	xmm8,XMMWORD[48+rsp]
++	movaps	xmm9,XMMWORD[64+rsp]
++	movaps	xmm10,XMMWORD[80+rsp]
++	movaps	xmm11,XMMWORD[96+rsp]
++	movaps	xmm12,XMMWORD[112+rsp]
++	movaps	xmm13,XMMWORD[128+rsp]
++	movaps	xmm14,XMMWORD[144+rsp]
++	movaps	xmm15,XMMWORD[160+rsp]
++	lea	rsp,[184+rsp]
++$L$dec_key_epilogue:
++	xor	eax,eax
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_vpaes_set_decrypt_key:
++
++global	vpaes_encrypt
++
++ALIGN	16
++vpaes_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_vpaes_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	lea	rsp,[((-184))+rsp]
++	movaps	XMMWORD[16+rsp],xmm6
++	movaps	XMMWORD[32+rsp],xmm7
++	movaps	XMMWORD[48+rsp],xmm8
++	movaps	XMMWORD[64+rsp],xmm9
++	movaps	XMMWORD[80+rsp],xmm10
++	movaps	XMMWORD[96+rsp],xmm11
++	movaps	XMMWORD[112+rsp],xmm12
++	movaps	XMMWORD[128+rsp],xmm13
++	movaps	XMMWORD[144+rsp],xmm14
++	movaps	XMMWORD[160+rsp],xmm15
++$L$enc_body:
++	movdqu	xmm0,XMMWORD[rdi]
++	call	_vpaes_preheat
++	call	_vpaes_encrypt_core
++	movdqu	XMMWORD[rsi],xmm0
++	movaps	xmm6,XMMWORD[16+rsp]
++	movaps	xmm7,XMMWORD[32+rsp]
++	movaps	xmm8,XMMWORD[48+rsp]
++	movaps	xmm9,XMMWORD[64+rsp]
++	movaps	xmm10,XMMWORD[80+rsp]
++	movaps	xmm11,XMMWORD[96+rsp]
++	movaps	xmm12,XMMWORD[112+rsp]
++	movaps	xmm13,XMMWORD[128+rsp]
++	movaps	xmm14,XMMWORD[144+rsp]
++	movaps	xmm15,XMMWORD[160+rsp]
++	lea	rsp,[184+rsp]
++$L$enc_epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_vpaes_encrypt:
++
++global	vpaes_decrypt
++
++ALIGN	16
++vpaes_decrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_vpaes_decrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	lea	rsp,[((-184))+rsp]
++	movaps	XMMWORD[16+rsp],xmm6
++	movaps	XMMWORD[32+rsp],xmm7
++	movaps	XMMWORD[48+rsp],xmm8
++	movaps	XMMWORD[64+rsp],xmm9
++	movaps	XMMWORD[80+rsp],xmm10
++	movaps	XMMWORD[96+rsp],xmm11
++	movaps	XMMWORD[112+rsp],xmm12
++	movaps	XMMWORD[128+rsp],xmm13
++	movaps	XMMWORD[144+rsp],xmm14
++	movaps	XMMWORD[160+rsp],xmm15
++$L$dec_body:
++	movdqu	xmm0,XMMWORD[rdi]
++	call	_vpaes_preheat
++	call	_vpaes_decrypt_core
++	movdqu	XMMWORD[rsi],xmm0
++	movaps	xmm6,XMMWORD[16+rsp]
++	movaps	xmm7,XMMWORD[32+rsp]
++	movaps	xmm8,XMMWORD[48+rsp]
++	movaps	xmm9,XMMWORD[64+rsp]
++	movaps	xmm10,XMMWORD[80+rsp]
++	movaps	xmm11,XMMWORD[96+rsp]
++	movaps	xmm12,XMMWORD[112+rsp]
++	movaps	xmm13,XMMWORD[128+rsp]
++	movaps	xmm14,XMMWORD[144+rsp]
++	movaps	xmm15,XMMWORD[160+rsp]
++	lea	rsp,[184+rsp]
++$L$dec_epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_vpaes_decrypt:
++global	vpaes_cbc_encrypt
++
++ALIGN	16
++vpaes_cbc_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_vpaes_cbc_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	xchg	rdx,rcx
++	sub	rcx,16
++	jc	NEAR $L$cbc_abort
++	lea	rsp,[((-184))+rsp]
++	movaps	XMMWORD[16+rsp],xmm6
++	movaps	XMMWORD[32+rsp],xmm7
++	movaps	XMMWORD[48+rsp],xmm8
++	movaps	XMMWORD[64+rsp],xmm9
++	movaps	XMMWORD[80+rsp],xmm10
++	movaps	XMMWORD[96+rsp],xmm11
++	movaps	XMMWORD[112+rsp],xmm12
++	movaps	XMMWORD[128+rsp],xmm13
++	movaps	XMMWORD[144+rsp],xmm14
++	movaps	XMMWORD[160+rsp],xmm15
++$L$cbc_body:
++	movdqu	xmm6,XMMWORD[r8]
++	sub	rsi,rdi
++	call	_vpaes_preheat
++	cmp	r9d,0
++	je	NEAR $L$cbc_dec_loop
++	jmp	NEAR $L$cbc_enc_loop
++ALIGN	16
++$L$cbc_enc_loop:
++	movdqu	xmm0,XMMWORD[rdi]
++	pxor	xmm0,xmm6
++	call	_vpaes_encrypt_core
++	movdqa	xmm6,xmm0
++	movdqu	XMMWORD[rdi*1+rsi],xmm0
++	lea	rdi,[16+rdi]
++	sub	rcx,16
++	jnc	NEAR $L$cbc_enc_loop
++	jmp	NEAR $L$cbc_done
++ALIGN	16
++$L$cbc_dec_loop:
++	movdqu	xmm0,XMMWORD[rdi]
++	movdqa	xmm7,xmm0
++	call	_vpaes_decrypt_core
++	pxor	xmm0,xmm6
++	movdqa	xmm6,xmm7
++	movdqu	XMMWORD[rdi*1+rsi],xmm0
++	lea	rdi,[16+rdi]
++	sub	rcx,16
++	jnc	NEAR $L$cbc_dec_loop
++$L$cbc_done:
++	movdqu	XMMWORD[r8],xmm6
++	movaps	xmm6,XMMWORD[16+rsp]
++	movaps	xmm7,XMMWORD[32+rsp]
++	movaps	xmm8,XMMWORD[48+rsp]
++	movaps	xmm9,XMMWORD[64+rsp]
++	movaps	xmm10,XMMWORD[80+rsp]
++	movaps	xmm11,XMMWORD[96+rsp]
++	movaps	xmm12,XMMWORD[112+rsp]
++	movaps	xmm13,XMMWORD[128+rsp]
++	movaps	xmm14,XMMWORD[144+rsp]
++	movaps	xmm15,XMMWORD[160+rsp]
++	lea	rsp,[184+rsp]
++$L$cbc_epilogue:
++$L$cbc_abort:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_vpaes_cbc_encrypt:
++
++
++
++
++
++
++
++ALIGN	16
++_vpaes_preheat:
++	lea	r10,[$L$k_s0F]
++	movdqa	xmm10,XMMWORD[((-32))+r10]
++	movdqa	xmm11,XMMWORD[((-16))+r10]
++	movdqa	xmm9,XMMWORD[r10]
++	movdqa	xmm13,XMMWORD[48+r10]
++	movdqa	xmm12,XMMWORD[64+r10]
++	movdqa	xmm15,XMMWORD[80+r10]
++	movdqa	xmm14,XMMWORD[96+r10]
++	DB	0F3h,0C3h		;repret
++
++
++
++
++
++
++
++ALIGN	64
++_vpaes_consts:
++$L$k_inv:
++	DQ	0x0E05060F0D080180,0x040703090A0B0C02
++	DQ	0x01040A060F0B0780,0x030D0E0C02050809
++
++$L$k_s0F:
++	DQ	0x0F0F0F0F0F0F0F0F,0x0F0F0F0F0F0F0F0F
++
++$L$k_ipt:
++	DQ	0xC2B2E8985A2A7000,0xCABAE09052227808
++	DQ	0x4C01307D317C4D00,0xCD80B1FCB0FDCC81
++
++$L$k_sb1:
++	DQ	0xB19BE18FCB503E00,0xA5DF7A6E142AF544
++	DQ	0x3618D415FAE22300,0x3BF7CCC10D2ED9EF
++$L$k_sb2:
++	DQ	0xE27A93C60B712400,0x5EB7E955BC982FCD
++	DQ	0x69EB88400AE12900,0xC2A163C8AB82234A
++$L$k_sbo:
++	DQ	0xD0D26D176FBDC700,0x15AABF7AC502A878
++	DQ	0xCFE474A55FBB6A00,0x8E1E90D1412B35FA
++
++$L$k_mc_forward:
++	DQ	0x0407060500030201,0x0C0F0E0D080B0A09
++	DQ	0x080B0A0904070605,0x000302010C0F0E0D
++	DQ	0x0C0F0E0D080B0A09,0x0407060500030201
++	DQ	0x000302010C0F0E0D,0x080B0A0904070605
++
++$L$k_mc_backward:
++	DQ	0x0605040702010003,0x0E0D0C0F0A09080B
++	DQ	0x020100030E0D0C0F,0x0A09080B06050407
++	DQ	0x0E0D0C0F0A09080B,0x0605040702010003
++	DQ	0x0A09080B06050407,0x020100030E0D0C0F
++
++$L$k_sr:
++	DQ	0x0706050403020100,0x0F0E0D0C0B0A0908
++	DQ	0x030E09040F0A0500,0x0B06010C07020D08
++	DQ	0x0F060D040B020900,0x070E050C030A0108
++	DQ	0x0B0E0104070A0D00,0x0306090C0F020508
++
++$L$k_rcon:
++	DQ	0x1F8391B9AF9DEEB6,0x702A98084D7C7D81
++
++$L$k_s63:
++	DQ	0x5B5B5B5B5B5B5B5B,0x5B5B5B5B5B5B5B5B
++
++$L$k_opt:
++	DQ	0xFF9F4929D6B66000,0xF7974121DEBE6808
++	DQ	0x01EDBD5150BCEC00,0xE10D5DB1B05C0CE0
++
++$L$k_deskew:
++	DQ	0x07E4A34047A4E300,0x1DFEB95A5DBEF91A
++	DQ	0x5F36B5DC83EA6900,0x2841C2ABF49D1E77
++
++
++
++
++
++$L$k_dksd:
++	DQ	0xFEB91A5DA3E44700,0x0740E3A45A1DBEF9
++	DQ	0x41C277F4B5368300,0x5FDC69EAAB289D1E
++$L$k_dksb:
++	DQ	0x9A4FCA1F8550D500,0x03D653861CC94C99
++	DQ	0x115BEDA7B6FC4A00,0xD993256F7E3482C8
++$L$k_dkse:
++	DQ	0xD5031CCA1FC9D600,0x53859A4C994F5086
++	DQ	0xA23196054FDC7BE8,0xCD5EF96A20B31487
++$L$k_dks9:
++	DQ	0xB6116FC87ED9A700,0x4AED933482255BFC
++	DQ	0x4576516227143300,0x8BB89FACE9DAFDCE
++
++
++
++
++
++$L$k_dipt:
++	DQ	0x0F505B040B545F00,0x154A411E114E451A
++	DQ	0x86E383E660056500,0x12771772F491F194
++
++$L$k_dsb9:
++	DQ	0x851C03539A86D600,0xCAD51F504F994CC9
++	DQ	0xC03B1789ECD74900,0x725E2C9EB2FBA565
++$L$k_dsbd:
++	DQ	0x7D57CCDFE6B1A200,0xF56E9B13882A4439
++	DQ	0x3CE2FAF724C6CB00,0x2931180D15DEEFD3
++$L$k_dsbb:
++	DQ	0xD022649296B44200,0x602646F6B0F2D404
++	DQ	0xC19498A6CD596700,0xF3FF0C3E3255AA6B
++$L$k_dsbe:
++	DQ	0x46F2929626D4D000,0x2242600464B4F6B0
++	DQ	0x0C55A6CDFFAAC100,0x9467F36B98593E32
++$L$k_dsbo:
++	DQ	0x1387EA537EF94000,0xC7AA6DB9D4943E2D
++	DQ	0x12D7560F93441D00,0xCA4B8159D8C58E9C
++DB	86,101,99,116,111,114,32,80,101,114,109,117,116,97,116,105
++DB	111,110,32,65,69,83,32,102,111,114,32,120,56,54,95,54
++DB	52,47,83,83,83,69,51,44,32,77,105,107,101,32,72,97
++DB	109,98,117,114,103,32,40,83,116,97,110,102,111,114,100,32
++DB	85,110,105,118,101,114,115,105,116,121,41,0
++ALIGN	64
++
++EXTERN	__imp_RtlVirtualUnwind
++
++ALIGN	16
++se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$in_prologue
++
++	mov	rax,QWORD[152+r8]
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$in_prologue
++
++	lea	rsi,[16+rax]
++	lea	rdi,[512+r8]
++	mov	ecx,20
++	DD	0xa548f3fc
++	lea	rax,[184+rax]
++
++$L$in_prologue:
++	mov	rdi,QWORD[8+rax]
++	mov	rsi,QWORD[16+rax]
++	mov	QWORD[152+r8],rax
++	mov	QWORD[168+r8],rsi
++	mov	QWORD[176+r8],rdi
++
++	mov	rdi,QWORD[40+r9]
++	mov	rsi,r8
++	mov	ecx,154
++	DD	0xa548f3fc
++
++	mov	rsi,r9
++	xor	rcx,rcx
++	mov	rdx,QWORD[8+rsi]
++	mov	r8,QWORD[rsi]
++	mov	r9,QWORD[16+rsi]
++	mov	r10,QWORD[40+rsi]
++	lea	r11,[56+rsi]
++	lea	r12,[24+rsi]
++	mov	QWORD[32+rsp],r10
++	mov	QWORD[40+rsp],r11
++	mov	QWORD[48+rsp],r12
++	mov	QWORD[56+rsp],rcx
++	call	QWORD[__imp_RtlVirtualUnwind]
++
++	mov	eax,1
++	add	rsp,64
++	popfq
++	pop	r15
++	pop	r14
++	pop	r13
++	pop	r12
++	pop	rbp
++	pop	rbx
++	pop	rdi
++	pop	rsi
++	DB	0F3h,0C3h		;repret
++
++
++section	.pdata rdata align=4
++ALIGN	4
++	DD	$L$SEH_begin_vpaes_set_encrypt_key wrt ..imagebase
++	DD	$L$SEH_end_vpaes_set_encrypt_key wrt ..imagebase
++	DD	$L$SEH_info_vpaes_set_encrypt_key wrt ..imagebase
++
++	DD	$L$SEH_begin_vpaes_set_decrypt_key wrt ..imagebase
++	DD	$L$SEH_end_vpaes_set_decrypt_key wrt ..imagebase
++	DD	$L$SEH_info_vpaes_set_decrypt_key wrt ..imagebase
++
++	DD	$L$SEH_begin_vpaes_encrypt wrt ..imagebase
++	DD	$L$SEH_end_vpaes_encrypt wrt ..imagebase
++	DD	$L$SEH_info_vpaes_encrypt wrt ..imagebase
++
++	DD	$L$SEH_begin_vpaes_decrypt wrt ..imagebase
++	DD	$L$SEH_end_vpaes_decrypt wrt ..imagebase
++	DD	$L$SEH_info_vpaes_decrypt wrt ..imagebase
++
++	DD	$L$SEH_begin_vpaes_cbc_encrypt wrt ..imagebase
++	DD	$L$SEH_end_vpaes_cbc_encrypt wrt ..imagebase
++	DD	$L$SEH_info_vpaes_cbc_encrypt wrt ..imagebase
++
++section	.xdata rdata align=8
++ALIGN	8
++$L$SEH_info_vpaes_set_encrypt_key:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$enc_key_body wrt ..imagebase,$L$enc_key_epilogue wrt ..imagebase
++$L$SEH_info_vpaes_set_decrypt_key:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$dec_key_body wrt ..imagebase,$L$dec_key_epilogue wrt ..imagebase
++$L$SEH_info_vpaes_encrypt:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$enc_body wrt ..imagebase,$L$enc_epilogue wrt ..imagebase
++$L$SEH_info_vpaes_decrypt:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$dec_body wrt ..imagebase,$L$dec_epilogue wrt ..imagebase
++$L$SEH_info_vpaes_cbc_encrypt:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$cbc_body wrt ..imagebase,$L$cbc_epilogue wrt ..imagebase
+diff --git a/SMP/lib/accelerated/x86/coff/aesni-gcm-x86_64.asm b/SMP/lib/accelerated/x86/coff/aesni-gcm-x86_64.asm
+new file mode 100644
+index 0000000..741a9e4
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/aesni-gcm-x86_64.asm
+@@ -0,0 +1,986 @@
++default	rel
++%define XMMWORD
++%define YMMWORD
++%define ZMMWORD
++section	.text code align=64
++
++
++
++ALIGN	32
++_aesni_ctr32_ghash_6x:
++	vmovdqu	xmm2,XMMWORD[32+r11]
++	sub	rdx,6
++	vpxor	xmm4,xmm4,xmm4
++	vmovdqu	xmm15,XMMWORD[((0-128))+rcx]
++	vpaddb	xmm10,xmm1,xmm2
++	vpaddb	xmm11,xmm10,xmm2
++	vpaddb	xmm12,xmm11,xmm2
++	vpaddb	xmm13,xmm12,xmm2
++	vpaddb	xmm14,xmm13,xmm2
++	vpxor	xmm9,xmm1,xmm15
++	vmovdqu	XMMWORD[(16+8)+rsp],xmm4
++	jmp	NEAR $L$oop6x
++
++ALIGN	32
++$L$oop6x:
++	add	ebx,100663296
++	jc	NEAR $L$handle_ctr32
++	vmovdqu	xmm3,XMMWORD[((0-32))+r9]
++	vpaddb	xmm1,xmm14,xmm2
++	vpxor	xmm10,xmm10,xmm15
++	vpxor	xmm11,xmm11,xmm15
++
++$L$resume_ctr32:
++	vmovdqu	XMMWORD[r8],xmm1
++	vpclmulqdq	xmm5,xmm7,xmm3,0x10
++	vpxor	xmm12,xmm12,xmm15
++	vmovups	xmm2,XMMWORD[((16-128))+rcx]
++	vpclmulqdq	xmm6,xmm7,xmm3,0x01
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++
++	xor	r12,r12
++	cmp	r15,r14
++
++	vaesenc	xmm9,xmm9,xmm2
++	vmovdqu	xmm0,XMMWORD[((48+8))+rsp]
++	vpxor	xmm13,xmm13,xmm15
++	vpclmulqdq	xmm1,xmm7,xmm3,0x00
++	vaesenc	xmm10,xmm10,xmm2
++	vpxor	xmm14,xmm14,xmm15
++	setnc	r12b
++	vpclmulqdq	xmm7,xmm7,xmm3,0x11
++	vaesenc	xmm11,xmm11,xmm2
++	vmovdqu	xmm3,XMMWORD[((16-32))+r9]
++	neg	r12
++	vaesenc	xmm12,xmm12,xmm2
++	vpxor	xmm6,xmm6,xmm5
++	vpclmulqdq	xmm5,xmm0,xmm3,0x00
++	vpxor	xmm8,xmm8,xmm4
++	vaesenc	xmm13,xmm13,xmm2
++	vpxor	xmm4,xmm1,xmm5
++	and	r12,0x60
++	vmovups	xmm15,XMMWORD[((32-128))+rcx]
++	vpclmulqdq	xmm1,xmm0,xmm3,0x10
++	vaesenc	xmm14,xmm14,xmm2
++
++	vpclmulqdq	xmm2,xmm0,xmm3,0x01
++	lea	r14,[r12*1+r14]
++	vaesenc	xmm9,xmm9,xmm15
++	vpxor	xmm8,xmm8,XMMWORD[((16+8))+rsp]
++	vpclmulqdq	xmm3,xmm0,xmm3,0x11
++	vmovdqu	xmm0,XMMWORD[((64+8))+rsp]
++	vaesenc	xmm10,xmm10,xmm15
++	movbe	r13,QWORD[88+r14]
++	vaesenc	xmm11,xmm11,xmm15
++	movbe	r12,QWORD[80+r14]
++	vaesenc	xmm12,xmm12,xmm15
++	mov	QWORD[((32+8))+rsp],r13
++	vaesenc	xmm13,xmm13,xmm15
++	mov	QWORD[((40+8))+rsp],r12
++	vmovdqu	xmm5,XMMWORD[((48-32))+r9]
++	vaesenc	xmm14,xmm14,xmm15
++
++	vmovups	xmm15,XMMWORD[((48-128))+rcx]
++	vpxor	xmm6,xmm6,xmm1
++	vpclmulqdq	xmm1,xmm0,xmm5,0x00
++	vaesenc	xmm9,xmm9,xmm15
++	vpxor	xmm6,xmm6,xmm2
++	vpclmulqdq	xmm2,xmm0,xmm5,0x10
++	vaesenc	xmm10,xmm10,xmm15
++	vpxor	xmm7,xmm7,xmm3
++	vpclmulqdq	xmm3,xmm0,xmm5,0x01
++	vaesenc	xmm11,xmm11,xmm15
++	vpclmulqdq	xmm5,xmm0,xmm5,0x11
++	vmovdqu	xmm0,XMMWORD[((80+8))+rsp]
++	vaesenc	xmm12,xmm12,xmm15
++	vaesenc	xmm13,xmm13,xmm15
++	vpxor	xmm4,xmm4,xmm1
++	vmovdqu	xmm1,XMMWORD[((64-32))+r9]
++	vaesenc	xmm14,xmm14,xmm15
++
++	vmovups	xmm15,XMMWORD[((64-128))+rcx]
++	vpxor	xmm6,xmm6,xmm2
++	vpclmulqdq	xmm2,xmm0,xmm1,0x00
++	vaesenc	xmm9,xmm9,xmm15
++	vpxor	xmm6,xmm6,xmm3
++	vpclmulqdq	xmm3,xmm0,xmm1,0x10
++	vaesenc	xmm10,xmm10,xmm15
++	movbe	r13,QWORD[72+r14]
++	vpxor	xmm7,xmm7,xmm5
++	vpclmulqdq	xmm5,xmm0,xmm1,0x01
++	vaesenc	xmm11,xmm11,xmm15
++	movbe	r12,QWORD[64+r14]
++	vpclmulqdq	xmm1,xmm0,xmm1,0x11
++	vmovdqu	xmm0,XMMWORD[((96+8))+rsp]
++	vaesenc	xmm12,xmm12,xmm15
++	mov	QWORD[((48+8))+rsp],r13
++	vaesenc	xmm13,xmm13,xmm15
++	mov	QWORD[((56+8))+rsp],r12
++	vpxor	xmm4,xmm4,xmm2
++	vmovdqu	xmm2,XMMWORD[((96-32))+r9]
++	vaesenc	xmm14,xmm14,xmm15
++
++	vmovups	xmm15,XMMWORD[((80-128))+rcx]
++	vpxor	xmm6,xmm6,xmm3
++	vpclmulqdq	xmm3,xmm0,xmm2,0x00
++	vaesenc	xmm9,xmm9,xmm15
++	vpxor	xmm6,xmm6,xmm5
++	vpclmulqdq	xmm5,xmm0,xmm2,0x10
++	vaesenc	xmm10,xmm10,xmm15
++	movbe	r13,QWORD[56+r14]
++	vpxor	xmm7,xmm7,xmm1
++	vpclmulqdq	xmm1,xmm0,xmm2,0x01
++	vpxor	xmm8,xmm8,XMMWORD[((112+8))+rsp]
++	vaesenc	xmm11,xmm11,xmm15
++	movbe	r12,QWORD[48+r14]
++	vpclmulqdq	xmm2,xmm0,xmm2,0x11
++	vaesenc	xmm12,xmm12,xmm15
++	mov	QWORD[((64+8))+rsp],r13
++	vaesenc	xmm13,xmm13,xmm15
++	mov	QWORD[((72+8))+rsp],r12
++	vpxor	xmm4,xmm4,xmm3
++	vmovdqu	xmm3,XMMWORD[((112-32))+r9]
++	vaesenc	xmm14,xmm14,xmm15
++
++	vmovups	xmm15,XMMWORD[((96-128))+rcx]
++	vpxor	xmm6,xmm6,xmm5
++	vpclmulqdq	xmm5,xmm8,xmm3,0x10
++	vaesenc	xmm9,xmm9,xmm15
++	vpxor	xmm6,xmm6,xmm1
++	vpclmulqdq	xmm1,xmm8,xmm3,0x01
++	vaesenc	xmm10,xmm10,xmm15
++	movbe	r13,QWORD[40+r14]
++	vpxor	xmm7,xmm7,xmm2
++	vpclmulqdq	xmm2,xmm8,xmm3,0x00
++	vaesenc	xmm11,xmm11,xmm15
++	movbe	r12,QWORD[32+r14]
++	vpclmulqdq	xmm8,xmm8,xmm3,0x11
++	vaesenc	xmm12,xmm12,xmm15
++	mov	QWORD[((80+8))+rsp],r13
++	vaesenc	xmm13,xmm13,xmm15
++	mov	QWORD[((88+8))+rsp],r12
++	vpxor	xmm6,xmm6,xmm5
++	vaesenc	xmm14,xmm14,xmm15
++	vpxor	xmm6,xmm6,xmm1
++
++	vmovups	xmm15,XMMWORD[((112-128))+rcx]
++	vpslldq	xmm5,xmm6,8
++	vpxor	xmm4,xmm4,xmm2
++	vmovdqu	xmm3,XMMWORD[16+r11]
++
++	vaesenc	xmm9,xmm9,xmm15
++	vpxor	xmm7,xmm7,xmm8
++	vaesenc	xmm10,xmm10,xmm15
++	vpxor	xmm4,xmm4,xmm5
++	movbe	r13,QWORD[24+r14]
++	vaesenc	xmm11,xmm11,xmm15
++	movbe	r12,QWORD[16+r14]
++	vpalignr	xmm0,xmm4,xmm4,8
++	vpclmulqdq	xmm4,xmm4,xmm3,0x10
++	mov	QWORD[((96+8))+rsp],r13
++	vaesenc	xmm12,xmm12,xmm15
++	mov	QWORD[((104+8))+rsp],r12
++	vaesenc	xmm13,xmm13,xmm15
++	vmovups	xmm1,XMMWORD[((128-128))+rcx]
++	vaesenc	xmm14,xmm14,xmm15
++
++	vaesenc	xmm9,xmm9,xmm1
++	vmovups	xmm15,XMMWORD[((144-128))+rcx]
++	vaesenc	xmm10,xmm10,xmm1
++	vpsrldq	xmm6,xmm6,8
++	vaesenc	xmm11,xmm11,xmm1
++	vpxor	xmm7,xmm7,xmm6
++	vaesenc	xmm12,xmm12,xmm1
++	vpxor	xmm4,xmm4,xmm0
++	movbe	r13,QWORD[8+r14]
++	vaesenc	xmm13,xmm13,xmm1
++	movbe	r12,QWORD[r14]
++	vaesenc	xmm14,xmm14,xmm1
++	vmovups	xmm1,XMMWORD[((160-128))+rcx]
++	cmp	ebp,11
++	jb	NEAR $L$enc_tail
++
++	vaesenc	xmm9,xmm9,xmm15
++	vaesenc	xmm10,xmm10,xmm15
++	vaesenc	xmm11,xmm11,xmm15
++	vaesenc	xmm12,xmm12,xmm15
++	vaesenc	xmm13,xmm13,xmm15
++	vaesenc	xmm14,xmm14,xmm15
++
++	vaesenc	xmm9,xmm9,xmm1
++	vaesenc	xmm10,xmm10,xmm1
++	vaesenc	xmm11,xmm11,xmm1
++	vaesenc	xmm12,xmm12,xmm1
++	vaesenc	xmm13,xmm13,xmm1
++	vmovups	xmm15,XMMWORD[((176-128))+rcx]
++	vaesenc	xmm14,xmm14,xmm1
++	vmovups	xmm1,XMMWORD[((192-128))+rcx]
++	je	NEAR $L$enc_tail
++
++	vaesenc	xmm9,xmm9,xmm15
++	vaesenc	xmm10,xmm10,xmm15
++	vaesenc	xmm11,xmm11,xmm15
++	vaesenc	xmm12,xmm12,xmm15
++	vaesenc	xmm13,xmm13,xmm15
++	vaesenc	xmm14,xmm14,xmm15
++
++	vaesenc	xmm9,xmm9,xmm1
++	vaesenc	xmm10,xmm10,xmm1
++	vaesenc	xmm11,xmm11,xmm1
++	vaesenc	xmm12,xmm12,xmm1
++	vaesenc	xmm13,xmm13,xmm1
++	vmovups	xmm15,XMMWORD[((208-128))+rcx]
++	vaesenc	xmm14,xmm14,xmm1
++	vmovups	xmm1,XMMWORD[((224-128))+rcx]
++	jmp	NEAR $L$enc_tail
++
++ALIGN	32
++$L$handle_ctr32:
++	vmovdqu	xmm0,XMMWORD[r11]
++	vpshufb	xmm6,xmm1,xmm0
++	vmovdqu	xmm5,XMMWORD[48+r11]
++	vpaddd	xmm10,xmm6,XMMWORD[64+r11]
++	vpaddd	xmm11,xmm6,xmm5
++	vmovdqu	xmm3,XMMWORD[((0-32))+r9]
++	vpaddd	xmm12,xmm10,xmm5
++	vpshufb	xmm10,xmm10,xmm0
++	vpaddd	xmm13,xmm11,xmm5
++	vpshufb	xmm11,xmm11,xmm0
++	vpxor	xmm10,xmm10,xmm15
++	vpaddd	xmm14,xmm12,xmm5
++	vpshufb	xmm12,xmm12,xmm0
++	vpxor	xmm11,xmm11,xmm15
++	vpaddd	xmm1,xmm13,xmm5
++	vpshufb	xmm13,xmm13,xmm0
++	vpshufb	xmm14,xmm14,xmm0
++	vpshufb	xmm1,xmm1,xmm0
++	jmp	NEAR $L$resume_ctr32
++
++ALIGN	32
++$L$enc_tail:
++	vaesenc	xmm9,xmm9,xmm15
++	vmovdqu	XMMWORD[(16+8)+rsp],xmm7
++	vpalignr	xmm8,xmm4,xmm4,8
++	vaesenc	xmm10,xmm10,xmm15
++	vpclmulqdq	xmm4,xmm4,xmm3,0x10
++	vpxor	xmm2,xmm1,XMMWORD[rdi]
++	vaesenc	xmm11,xmm11,xmm15
++	vpxor	xmm0,xmm1,XMMWORD[16+rdi]
++	vaesenc	xmm12,xmm12,xmm15
++	vpxor	xmm5,xmm1,XMMWORD[32+rdi]
++	vaesenc	xmm13,xmm13,xmm15
++	vpxor	xmm6,xmm1,XMMWORD[48+rdi]
++	vaesenc	xmm14,xmm14,xmm15
++	vpxor	xmm7,xmm1,XMMWORD[64+rdi]
++	vpxor	xmm3,xmm1,XMMWORD[80+rdi]
++	vmovdqu	xmm1,XMMWORD[r8]
++
++	vaesenclast	xmm9,xmm9,xmm2
++	vmovdqu	xmm2,XMMWORD[32+r11]
++	vaesenclast	xmm10,xmm10,xmm0
++	vpaddb	xmm0,xmm1,xmm2
++	mov	QWORD[((112+8))+rsp],r13
++	lea	rdi,[96+rdi]
++	vaesenclast	xmm11,xmm11,xmm5
++	vpaddb	xmm5,xmm0,xmm2
++	mov	QWORD[((120+8))+rsp],r12
++	lea	rsi,[96+rsi]
++	vmovdqu	xmm15,XMMWORD[((0-128))+rcx]
++	vaesenclast	xmm12,xmm12,xmm6
++	vpaddb	xmm6,xmm5,xmm2
++	vaesenclast	xmm13,xmm13,xmm7
++	vpaddb	xmm7,xmm6,xmm2
++	vaesenclast	xmm14,xmm14,xmm3
++	vpaddb	xmm3,xmm7,xmm2
++
++	add	r10,0x60
++	sub	rdx,0x6
++	jc	NEAR $L$6x_done
++
++	vmovups	XMMWORD[(-96)+rsi],xmm9
++	vpxor	xmm9,xmm1,xmm15
++	vmovups	XMMWORD[(-80)+rsi],xmm10
++	vmovdqa	xmm10,xmm0
++	vmovups	XMMWORD[(-64)+rsi],xmm11
++	vmovdqa	xmm11,xmm5
++	vmovups	XMMWORD[(-48)+rsi],xmm12
++	vmovdqa	xmm12,xmm6
++	vmovups	XMMWORD[(-32)+rsi],xmm13
++	vmovdqa	xmm13,xmm7
++	vmovups	XMMWORD[(-16)+rsi],xmm14
++	vmovdqa	xmm14,xmm3
++	vmovdqu	xmm7,XMMWORD[((32+8))+rsp]
++	jmp	NEAR $L$oop6x
++
++$L$6x_done:
++	vpxor	xmm8,xmm8,XMMWORD[((16+8))+rsp]
++	vpxor	xmm8,xmm8,xmm4
++
++	DB	0F3h,0C3h		;repret
++
++global	aesni_gcm_decrypt
++
++ALIGN	32
++aesni_gcm_decrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_gcm_decrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	xor	r10,r10
++
++
++
++	cmp	rdx,0x60
++	jb	NEAR $L$gcm_dec_abort
++
++	lea	rax,[rsp]
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	lea	rsp,[((-168))+rsp]
++	movaps	XMMWORD[(-216)+rax],xmm6
++	movaps	XMMWORD[(-200)+rax],xmm7
++	movaps	XMMWORD[(-184)+rax],xmm8
++	movaps	XMMWORD[(-168)+rax],xmm9
++	movaps	XMMWORD[(-152)+rax],xmm10
++	movaps	XMMWORD[(-136)+rax],xmm11
++	movaps	XMMWORD[(-120)+rax],xmm12
++	movaps	XMMWORD[(-104)+rax],xmm13
++	movaps	XMMWORD[(-88)+rax],xmm14
++	movaps	XMMWORD[(-72)+rax],xmm15
++$L$gcm_dec_body:
++	vzeroupper
++
++	vmovdqu	xmm1,XMMWORD[r8]
++	add	rsp,-128
++	mov	ebx,DWORD[12+r8]
++	lea	r11,[$L$bswap_mask]
++	lea	r14,[((-128))+rcx]
++	mov	r15,0xf80
++	vmovdqu	xmm8,XMMWORD[r9]
++	and	rsp,-128
++	vmovdqu	xmm0,XMMWORD[r11]
++	lea	rcx,[128+rcx]
++	lea	r9,[((32+32))+r9]
++	mov	ebp,DWORD[((240-128))+rcx]
++	vpshufb	xmm8,xmm8,xmm0
++
++	and	r14,r15
++	and	r15,rsp
++	sub	r15,r14
++	jc	NEAR $L$dec_no_key_aliasing
++	cmp	r15,768
++	jnc	NEAR $L$dec_no_key_aliasing
++	sub	rsp,r15
++$L$dec_no_key_aliasing:
++
++	vmovdqu	xmm7,XMMWORD[80+rdi]
++	lea	r14,[rdi]
++	vmovdqu	xmm4,XMMWORD[64+rdi]
++
++
++
++
++
++
++
++	lea	r15,[((-192))+rdx*1+rdi]
++
++	vmovdqu	xmm5,XMMWORD[48+rdi]
++	shr	rdx,4
++	xor	r10,r10
++	vmovdqu	xmm6,XMMWORD[32+rdi]
++	vpshufb	xmm7,xmm7,xmm0
++	vmovdqu	xmm2,XMMWORD[16+rdi]
++	vpshufb	xmm4,xmm4,xmm0
++	vmovdqu	xmm3,XMMWORD[rdi]
++	vpshufb	xmm5,xmm5,xmm0
++	vmovdqu	XMMWORD[48+rsp],xmm4
++	vpshufb	xmm6,xmm6,xmm0
++	vmovdqu	XMMWORD[64+rsp],xmm5
++	vpshufb	xmm2,xmm2,xmm0
++	vmovdqu	XMMWORD[80+rsp],xmm6
++	vpshufb	xmm3,xmm3,xmm0
++	vmovdqu	XMMWORD[96+rsp],xmm2
++	vmovdqu	XMMWORD[112+rsp],xmm3
++
++	call	_aesni_ctr32_ghash_6x
++
++	vmovups	XMMWORD[(-96)+rsi],xmm9
++	vmovups	XMMWORD[(-80)+rsi],xmm10
++	vmovups	XMMWORD[(-64)+rsi],xmm11
++	vmovups	XMMWORD[(-48)+rsi],xmm12
++	vmovups	XMMWORD[(-32)+rsi],xmm13
++	vmovups	XMMWORD[(-16)+rsi],xmm14
++
++	vpshufb	xmm8,xmm8,XMMWORD[r11]
++	vmovdqu	XMMWORD[(-64)+r9],xmm8
++
++	vzeroupper
++	movaps	xmm6,XMMWORD[((-216))+rax]
++	movaps	xmm7,XMMWORD[((-200))+rax]
++	movaps	xmm8,XMMWORD[((-184))+rax]
++	movaps	xmm9,XMMWORD[((-168))+rax]
++	movaps	xmm10,XMMWORD[((-152))+rax]
++	movaps	xmm11,XMMWORD[((-136))+rax]
++	movaps	xmm12,XMMWORD[((-120))+rax]
++	movaps	xmm13,XMMWORD[((-104))+rax]
++	movaps	xmm14,XMMWORD[((-88))+rax]
++	movaps	xmm15,XMMWORD[((-72))+rax]
++	mov	r15,QWORD[((-48))+rax]
++	mov	r14,QWORD[((-40))+rax]
++	mov	r13,QWORD[((-32))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	rbx,QWORD[((-8))+rax]
++	lea	rsp,[rax]
++$L$gcm_dec_abort:
++	mov	rax,r10
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_gcm_decrypt:
++
++ALIGN	32
++_aesni_ctr32_6x:
++	vmovdqu	xmm4,XMMWORD[((0-128))+rcx]
++	vmovdqu	xmm2,XMMWORD[32+r11]
++	lea	r13,[((-1))+rbp]
++	vmovups	xmm15,XMMWORD[((16-128))+rcx]
++	lea	r12,[((32-128))+rcx]
++	vpxor	xmm9,xmm1,xmm4
++	add	ebx,100663296
++	jc	NEAR $L$handle_ctr32_2
++	vpaddb	xmm10,xmm1,xmm2
++	vpaddb	xmm11,xmm10,xmm2
++	vpxor	xmm10,xmm10,xmm4
++	vpaddb	xmm12,xmm11,xmm2
++	vpxor	xmm11,xmm11,xmm4
++	vpaddb	xmm13,xmm12,xmm2
++	vpxor	xmm12,xmm12,xmm4
++	vpaddb	xmm14,xmm13,xmm2
++	vpxor	xmm13,xmm13,xmm4
++	vpaddb	xmm1,xmm14,xmm2
++	vpxor	xmm14,xmm14,xmm4
++	jmp	NEAR $L$oop_ctr32
++
++ALIGN	16
++$L$oop_ctr32:
++	vaesenc	xmm9,xmm9,xmm15
++	vaesenc	xmm10,xmm10,xmm15
++	vaesenc	xmm11,xmm11,xmm15
++	vaesenc	xmm12,xmm12,xmm15
++	vaesenc	xmm13,xmm13,xmm15
++	vaesenc	xmm14,xmm14,xmm15
++	vmovups	xmm15,XMMWORD[r12]
++	lea	r12,[16+r12]
++	dec	r13d
++	jnz	NEAR $L$oop_ctr32
++
++	vmovdqu	xmm3,XMMWORD[r12]
++	vaesenc	xmm9,xmm9,xmm15
++	vpxor	xmm4,xmm3,XMMWORD[rdi]
++	vaesenc	xmm10,xmm10,xmm15
++	vpxor	xmm5,xmm3,XMMWORD[16+rdi]
++	vaesenc	xmm11,xmm11,xmm15
++	vpxor	xmm6,xmm3,XMMWORD[32+rdi]
++	vaesenc	xmm12,xmm12,xmm15
++	vpxor	xmm8,xmm3,XMMWORD[48+rdi]
++	vaesenc	xmm13,xmm13,xmm15
++	vpxor	xmm2,xmm3,XMMWORD[64+rdi]
++	vaesenc	xmm14,xmm14,xmm15
++	vpxor	xmm3,xmm3,XMMWORD[80+rdi]
++	lea	rdi,[96+rdi]
++
++	vaesenclast	xmm9,xmm9,xmm4
++	vaesenclast	xmm10,xmm10,xmm5
++	vaesenclast	xmm11,xmm11,xmm6
++	vaesenclast	xmm12,xmm12,xmm8
++	vaesenclast	xmm13,xmm13,xmm2
++	vaesenclast	xmm14,xmm14,xmm3
++	vmovups	XMMWORD[rsi],xmm9
++	vmovups	XMMWORD[16+rsi],xmm10
++	vmovups	XMMWORD[32+rsi],xmm11
++	vmovups	XMMWORD[48+rsi],xmm12
++	vmovups	XMMWORD[64+rsi],xmm13
++	vmovups	XMMWORD[80+rsi],xmm14
++	lea	rsi,[96+rsi]
++
++	DB	0F3h,0C3h		;repret
++ALIGN	32
++$L$handle_ctr32_2:
++	vpshufb	xmm6,xmm1,xmm0
++	vmovdqu	xmm5,XMMWORD[48+r11]
++	vpaddd	xmm10,xmm6,XMMWORD[64+r11]
++	vpaddd	xmm11,xmm6,xmm5
++	vpaddd	xmm12,xmm10,xmm5
++	vpshufb	xmm10,xmm10,xmm0
++	vpaddd	xmm13,xmm11,xmm5
++	vpshufb	xmm11,xmm11,xmm0
++	vpxor	xmm10,xmm10,xmm4
++	vpaddd	xmm14,xmm12,xmm5
++	vpshufb	xmm12,xmm12,xmm0
++	vpxor	xmm11,xmm11,xmm4
++	vpaddd	xmm1,xmm13,xmm5
++	vpshufb	xmm13,xmm13,xmm0
++	vpxor	xmm12,xmm12,xmm4
++	vpshufb	xmm14,xmm14,xmm0
++	vpxor	xmm13,xmm13,xmm4
++	vpshufb	xmm1,xmm1,xmm0
++	vpxor	xmm14,xmm14,xmm4
++	jmp	NEAR $L$oop_ctr32
++
++
++global	aesni_gcm_encrypt
++
++ALIGN	32
++aesni_gcm_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_gcm_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	xor	r10,r10
++
++
++
++
++	cmp	rdx,0x60*3
++	jb	NEAR $L$gcm_enc_abort
++
++	lea	rax,[rsp]
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	lea	rsp,[((-168))+rsp]
++	movaps	XMMWORD[(-216)+rax],xmm6
++	movaps	XMMWORD[(-200)+rax],xmm7
++	movaps	XMMWORD[(-184)+rax],xmm8
++	movaps	XMMWORD[(-168)+rax],xmm9
++	movaps	XMMWORD[(-152)+rax],xmm10
++	movaps	XMMWORD[(-136)+rax],xmm11
++	movaps	XMMWORD[(-120)+rax],xmm12
++	movaps	XMMWORD[(-104)+rax],xmm13
++	movaps	XMMWORD[(-88)+rax],xmm14
++	movaps	XMMWORD[(-72)+rax],xmm15
++$L$gcm_enc_body:
++	vzeroupper
++
++	vmovdqu	xmm1,XMMWORD[r8]
++	add	rsp,-128
++	mov	ebx,DWORD[12+r8]
++	lea	r11,[$L$bswap_mask]
++	lea	r14,[((-128))+rcx]
++	mov	r15,0xf80
++	lea	rcx,[128+rcx]
++	vmovdqu	xmm0,XMMWORD[r11]
++	and	rsp,-128
++	mov	ebp,DWORD[((240-128))+rcx]
++
++	and	r14,r15
++	and	r15,rsp
++	sub	r15,r14
++	jc	NEAR $L$enc_no_key_aliasing
++	cmp	r15,768
++	jnc	NEAR $L$enc_no_key_aliasing
++	sub	rsp,r15
++$L$enc_no_key_aliasing:
++
++	lea	r14,[rsi]
++
++
++
++
++
++
++
++
++	lea	r15,[((-192))+rdx*1+rsi]
++
++	shr	rdx,4
++
++	call	_aesni_ctr32_6x
++	vpshufb	xmm8,xmm9,xmm0
++	vpshufb	xmm2,xmm10,xmm0
++	vmovdqu	XMMWORD[112+rsp],xmm8
++	vpshufb	xmm4,xmm11,xmm0
++	vmovdqu	XMMWORD[96+rsp],xmm2
++	vpshufb	xmm5,xmm12,xmm0
++	vmovdqu	XMMWORD[80+rsp],xmm4
++	vpshufb	xmm6,xmm13,xmm0
++	vmovdqu	XMMWORD[64+rsp],xmm5
++	vpshufb	xmm7,xmm14,xmm0
++	vmovdqu	XMMWORD[48+rsp],xmm6
++
++	call	_aesni_ctr32_6x
++
++	vmovdqu	xmm8,XMMWORD[r9]
++	lea	r9,[((32+32))+r9]
++	sub	rdx,12
++	mov	r10,0x60*2
++	vpshufb	xmm8,xmm8,xmm0
++
++	call	_aesni_ctr32_ghash_6x
++	vmovdqu	xmm7,XMMWORD[32+rsp]
++	vmovdqu	xmm0,XMMWORD[r11]
++	vmovdqu	xmm3,XMMWORD[((0-32))+r9]
++	vpunpckhqdq	xmm1,xmm7,xmm7
++	vmovdqu	xmm15,XMMWORD[((32-32))+r9]
++	vmovups	XMMWORD[(-96)+rsi],xmm9
++	vpshufb	xmm9,xmm9,xmm0
++	vpxor	xmm1,xmm1,xmm7
++	vmovups	XMMWORD[(-80)+rsi],xmm10
++	vpshufb	xmm10,xmm10,xmm0
++	vmovups	XMMWORD[(-64)+rsi],xmm11
++	vpshufb	xmm11,xmm11,xmm0
++	vmovups	XMMWORD[(-48)+rsi],xmm12
++	vpshufb	xmm12,xmm12,xmm0
++	vmovups	XMMWORD[(-32)+rsi],xmm13
++	vpshufb	xmm13,xmm13,xmm0
++	vmovups	XMMWORD[(-16)+rsi],xmm14
++	vpshufb	xmm14,xmm14,xmm0
++	vmovdqu	XMMWORD[16+rsp],xmm9
++	vmovdqu	xmm6,XMMWORD[48+rsp]
++	vmovdqu	xmm0,XMMWORD[((16-32))+r9]
++	vpunpckhqdq	xmm2,xmm6,xmm6
++	vpclmulqdq	xmm5,xmm7,xmm3,0x00
++	vpxor	xmm2,xmm2,xmm6
++	vpclmulqdq	xmm7,xmm7,xmm3,0x11
++	vpclmulqdq	xmm1,xmm1,xmm15,0x00
++
++	vmovdqu	xmm9,XMMWORD[64+rsp]
++	vpclmulqdq	xmm4,xmm6,xmm0,0x00
++	vmovdqu	xmm3,XMMWORD[((48-32))+r9]
++	vpxor	xmm4,xmm4,xmm5
++	vpunpckhqdq	xmm5,xmm9,xmm9
++	vpclmulqdq	xmm6,xmm6,xmm0,0x11
++	vpxor	xmm5,xmm5,xmm9
++	vpxor	xmm6,xmm6,xmm7
++	vpclmulqdq	xmm2,xmm2,xmm15,0x10
++	vmovdqu	xmm15,XMMWORD[((80-32))+r9]
++	vpxor	xmm2,xmm2,xmm1
++
++	vmovdqu	xmm1,XMMWORD[80+rsp]
++	vpclmulqdq	xmm7,xmm9,xmm3,0x00
++	vmovdqu	xmm0,XMMWORD[((64-32))+r9]
++	vpxor	xmm7,xmm7,xmm4
++	vpunpckhqdq	xmm4,xmm1,xmm1
++	vpclmulqdq	xmm9,xmm9,xmm3,0x11
++	vpxor	xmm4,xmm4,xmm1
++	vpxor	xmm9,xmm9,xmm6
++	vpclmulqdq	xmm5,xmm5,xmm15,0x00
++	vpxor	xmm5,xmm5,xmm2
++
++	vmovdqu	xmm2,XMMWORD[96+rsp]
++	vpclmulqdq	xmm6,xmm1,xmm0,0x00
++	vmovdqu	xmm3,XMMWORD[((96-32))+r9]
++	vpxor	xmm6,xmm6,xmm7
++	vpunpckhqdq	xmm7,xmm2,xmm2
++	vpclmulqdq	xmm1,xmm1,xmm0,0x11
++	vpxor	xmm7,xmm7,xmm2
++	vpxor	xmm1,xmm1,xmm9
++	vpclmulqdq	xmm4,xmm4,xmm15,0x10
++	vmovdqu	xmm15,XMMWORD[((128-32))+r9]
++	vpxor	xmm4,xmm4,xmm5
++
++	vpxor	xmm8,xmm8,XMMWORD[112+rsp]
++	vpclmulqdq	xmm5,xmm2,xmm3,0x00
++	vmovdqu	xmm0,XMMWORD[((112-32))+r9]
++	vpunpckhqdq	xmm9,xmm8,xmm8
++	vpxor	xmm5,xmm5,xmm6
++	vpclmulqdq	xmm2,xmm2,xmm3,0x11
++	vpxor	xmm9,xmm9,xmm8
++	vpxor	xmm2,xmm2,xmm1
++	vpclmulqdq	xmm7,xmm7,xmm15,0x00
++	vpxor	xmm4,xmm7,xmm4
++
++	vpclmulqdq	xmm6,xmm8,xmm0,0x00
++	vmovdqu	xmm3,XMMWORD[((0-32))+r9]
++	vpunpckhqdq	xmm1,xmm14,xmm14
++	vpclmulqdq	xmm8,xmm8,xmm0,0x11
++	vpxor	xmm1,xmm1,xmm14
++	vpxor	xmm5,xmm6,xmm5
++	vpclmulqdq	xmm9,xmm9,xmm15,0x10
++	vmovdqu	xmm15,XMMWORD[((32-32))+r9]
++	vpxor	xmm7,xmm8,xmm2
++	vpxor	xmm6,xmm9,xmm4
++
++	vmovdqu	xmm0,XMMWORD[((16-32))+r9]
++	vpxor	xmm9,xmm7,xmm5
++	vpclmulqdq	xmm4,xmm14,xmm3,0x00
++	vpxor	xmm6,xmm6,xmm9
++	vpunpckhqdq	xmm2,xmm13,xmm13
++	vpclmulqdq	xmm14,xmm14,xmm3,0x11
++	vpxor	xmm2,xmm2,xmm13
++	vpslldq	xmm9,xmm6,8
++	vpclmulqdq	xmm1,xmm1,xmm15,0x00
++	vpxor	xmm8,xmm5,xmm9
++	vpsrldq	xmm6,xmm6,8
++	vpxor	xmm7,xmm7,xmm6
++
++	vpclmulqdq	xmm5,xmm13,xmm0,0x00
++	vmovdqu	xmm3,XMMWORD[((48-32))+r9]
++	vpxor	xmm5,xmm5,xmm4
++	vpunpckhqdq	xmm9,xmm12,xmm12
++	vpclmulqdq	xmm13,xmm13,xmm0,0x11
++	vpxor	xmm9,xmm9,xmm12
++	vpxor	xmm13,xmm13,xmm14
++	vpalignr	xmm14,xmm8,xmm8,8
++	vpclmulqdq	xmm2,xmm2,xmm15,0x10
++	vmovdqu	xmm15,XMMWORD[((80-32))+r9]
++	vpxor	xmm2,xmm2,xmm1
++
++	vpclmulqdq	xmm4,xmm12,xmm3,0x00
++	vmovdqu	xmm0,XMMWORD[((64-32))+r9]
++	vpxor	xmm4,xmm4,xmm5
++	vpunpckhqdq	xmm1,xmm11,xmm11
++	vpclmulqdq	xmm12,xmm12,xmm3,0x11
++	vpxor	xmm1,xmm1,xmm11
++	vpxor	xmm12,xmm12,xmm13
++	vxorps	xmm7,xmm7,XMMWORD[16+rsp]
++	vpclmulqdq	xmm9,xmm9,xmm15,0x00
++	vpxor	xmm9,xmm9,xmm2
++
++	vpclmulqdq	xmm8,xmm8,XMMWORD[16+r11],0x10
++	vxorps	xmm8,xmm8,xmm14
++
++	vpclmulqdq	xmm5,xmm11,xmm0,0x00
++	vmovdqu	xmm3,XMMWORD[((96-32))+r9]
++	vpxor	xmm5,xmm5,xmm4
++	vpunpckhqdq	xmm2,xmm10,xmm10
++	vpclmulqdq	xmm11,xmm11,xmm0,0x11
++	vpxor	xmm2,xmm2,xmm10
++	vpalignr	xmm14,xmm8,xmm8,8
++	vpxor	xmm11,xmm11,xmm12
++	vpclmulqdq	xmm1,xmm1,xmm15,0x10
++	vmovdqu	xmm15,XMMWORD[((128-32))+r9]
++	vpxor	xmm1,xmm1,xmm9
++
++	vxorps	xmm14,xmm14,xmm7
++	vpclmulqdq	xmm8,xmm8,XMMWORD[16+r11],0x10
++	vxorps	xmm8,xmm8,xmm14
++
++	vpclmulqdq	xmm4,xmm10,xmm3,0x00
++	vmovdqu	xmm0,XMMWORD[((112-32))+r9]
++	vpxor	xmm4,xmm4,xmm5
++	vpunpckhqdq	xmm9,xmm8,xmm8
++	vpclmulqdq	xmm10,xmm10,xmm3,0x11
++	vpxor	xmm9,xmm9,xmm8
++	vpxor	xmm10,xmm10,xmm11
++	vpclmulqdq	xmm2,xmm2,xmm15,0x00
++	vpxor	xmm2,xmm2,xmm1
++
++	vpclmulqdq	xmm5,xmm8,xmm0,0x00
++	vpclmulqdq	xmm7,xmm8,xmm0,0x11
++	vpxor	xmm5,xmm5,xmm4
++	vpclmulqdq	xmm6,xmm9,xmm15,0x10
++	vpxor	xmm7,xmm7,xmm10
++	vpxor	xmm6,xmm6,xmm2
++
++	vpxor	xmm4,xmm7,xmm5
++	vpxor	xmm6,xmm6,xmm4
++	vpslldq	xmm1,xmm6,8
++	vmovdqu	xmm3,XMMWORD[16+r11]
++	vpsrldq	xmm6,xmm6,8
++	vpxor	xmm8,xmm5,xmm1
++	vpxor	xmm7,xmm7,xmm6
++
++	vpalignr	xmm2,xmm8,xmm8,8
++	vpclmulqdq	xmm8,xmm8,xmm3,0x10
++	vpxor	xmm8,xmm8,xmm2
++
++	vpalignr	xmm2,xmm8,xmm8,8
++	vpclmulqdq	xmm8,xmm8,xmm3,0x10
++	vpxor	xmm2,xmm2,xmm7
++	vpxor	xmm8,xmm8,xmm2
++	vpshufb	xmm8,xmm8,XMMWORD[r11]
++	vmovdqu	XMMWORD[(-64)+r9],xmm8
++
++	vzeroupper
++	movaps	xmm6,XMMWORD[((-216))+rax]
++	movaps	xmm7,XMMWORD[((-200))+rax]
++	movaps	xmm8,XMMWORD[((-184))+rax]
++	movaps	xmm9,XMMWORD[((-168))+rax]
++	movaps	xmm10,XMMWORD[((-152))+rax]
++	movaps	xmm11,XMMWORD[((-136))+rax]
++	movaps	xmm12,XMMWORD[((-120))+rax]
++	movaps	xmm13,XMMWORD[((-104))+rax]
++	movaps	xmm14,XMMWORD[((-88))+rax]
++	movaps	xmm15,XMMWORD[((-72))+rax]
++	mov	r15,QWORD[((-48))+rax]
++	mov	r14,QWORD[((-40))+rax]
++	mov	r13,QWORD[((-32))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	rbx,QWORD[((-8))+rax]
++	lea	rsp,[rax]
++$L$gcm_enc_abort:
++	mov	rax,r10
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_gcm_encrypt:
++ALIGN	64
++$L$bswap_mask:
++DB	15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
++$L$poly:
++DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2
++$L$one_msb:
++DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
++$L$two_lsb:
++DB	2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
++$L$one_lsb:
++DB	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
++DB	65,69,83,45,78,73,32,71,67,77,32,109,111,100,117,108
++DB	101,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82
++DB	89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112
++DB	114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
++ALIGN	64
++EXTERN	__imp_RtlVirtualUnwind
++
++ALIGN	16
++gcm_se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$common_seh_tail
++
++	mov	rax,QWORD[152+r8]
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$common_seh_tail
++
++	mov	rax,QWORD[120+r8]
++
++	mov	r15,QWORD[((-48))+rax]
++	mov	r14,QWORD[((-40))+rax]
++	mov	r13,QWORD[((-32))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	rbx,QWORD[((-8))+rax]
++	mov	QWORD[240+r8],r15
++	mov	QWORD[232+r8],r14
++	mov	QWORD[224+r8],r13
++	mov	QWORD[216+r8],r12
++	mov	QWORD[160+r8],rbp
++	mov	QWORD[144+r8],rbx
++
++	lea	rsi,[((-216))+rax]
++	lea	rdi,[512+r8]
++	mov	ecx,20
++	DD	0xa548f3fc
++
++$L$common_seh_tail:
++	mov	rdi,QWORD[8+rax]
++	mov	rsi,QWORD[16+rax]
++	mov	QWORD[152+r8],rax
++	mov	QWORD[168+r8],rsi
++	mov	QWORD[176+r8],rdi
++
++	mov	rdi,QWORD[40+r9]
++	mov	rsi,r8
++	mov	ecx,154
++	DD	0xa548f3fc
++
++	mov	rsi,r9
++	xor	rcx,rcx
++	mov	rdx,QWORD[8+rsi]
++	mov	r8,QWORD[rsi]
++	mov	r9,QWORD[16+rsi]
++	mov	r10,QWORD[40+rsi]
++	lea	r11,[56+rsi]
++	lea	r12,[24+rsi]
++	mov	QWORD[32+rsp],r10
++	mov	QWORD[40+rsp],r11
++	mov	QWORD[48+rsp],r12
++	mov	QWORD[56+rsp],rcx
++	call	QWORD[__imp_RtlVirtualUnwind]
++
++	mov	eax,1
++	add	rsp,64
++	popfq
++	pop	r15
++	pop	r14
++	pop	r13
++	pop	r12
++	pop	rbp
++	pop	rbx
++	pop	rdi
++	pop	rsi
++	DB	0F3h,0C3h		;repret
++
++
++section	.pdata rdata align=4
++ALIGN	4
++	DD	$L$SEH_begin_aesni_gcm_decrypt wrt ..imagebase
++	DD	$L$SEH_end_aesni_gcm_decrypt wrt ..imagebase
++	DD	$L$SEH_gcm_dec_info wrt ..imagebase
++
++	DD	$L$SEH_begin_aesni_gcm_encrypt wrt ..imagebase
++	DD	$L$SEH_end_aesni_gcm_encrypt wrt ..imagebase
++	DD	$L$SEH_gcm_enc_info wrt ..imagebase
++section	.xdata rdata align=8
++ALIGN	8
++$L$SEH_gcm_dec_info:
++DB	9,0,0,0
++	DD	gcm_se_handler wrt ..imagebase
++	DD	$L$gcm_dec_body wrt ..imagebase,$L$gcm_dec_abort wrt ..imagebase
++$L$SEH_gcm_enc_info:
++DB	9,0,0,0
++	DD	gcm_se_handler wrt ..imagebase
++	DD	$L$gcm_enc_body wrt ..imagebase,$L$gcm_enc_abort wrt ..imagebase
+diff --git a/SMP/lib/accelerated/x86/coff/aesni-x86.asm b/SMP/lib/accelerated/x86/coff/aesni-x86.asm
+new file mode 100644
+index 0000000..1b64723
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/aesni-x86.asm
+@@ -0,0 +1,3204 @@
++%ifidn __OUTPUT_FORMAT__,obj
++section	code	use32 class=code align=64
++%elifidn __OUTPUT_FORMAT__,win32
++%ifndef __YASM_VER__
++$@feat.00 equ 1
++%endif
++section	.text	code align=64
++%else
++section	.text	code
++%endif
++;extern	__gnutls_x86_cpuid_s
++global	_aesni_encrypt
++align	16
++_aesni_encrypt:
++L$_aesni_encrypt_begin:
++	mov	eax,DWORD [4+esp]
++	mov	edx,DWORD [12+esp]
++	movups	xmm2,[eax]
++	mov	ecx,DWORD [240+edx]
++	mov	eax,DWORD [8+esp]
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$000enc1_loop_1:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$000enc1_loop_1
++db	102,15,56,221,209
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	movups	[eax],xmm2
++	pxor	xmm2,xmm2
++	ret
++global	_aesni_decrypt
++align	16
++_aesni_decrypt:
++L$_aesni_decrypt_begin:
++	mov	eax,DWORD [4+esp]
++	mov	edx,DWORD [12+esp]
++	movups	xmm2,[eax]
++	mov	ecx,DWORD [240+edx]
++	mov	eax,DWORD [8+esp]
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$001dec1_loop_2:
++db	102,15,56,222,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$001dec1_loop_2
++db	102,15,56,223,209
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	movups	[eax],xmm2
++	pxor	xmm2,xmm2
++	ret
++align	16
++__aesni_encrypt2:
++	movups	xmm0,[edx]
++	shl	ecx,4
++	movups	xmm1,[16+edx]
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	movups	xmm0,[32+edx]
++	lea	edx,[32+ecx*1+edx]
++	neg	ecx
++	add	ecx,16
++L$002enc2_loop:
++db	102,15,56,220,209
++db	102,15,56,220,217
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,220,208
++db	102,15,56,220,216
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$002enc2_loop
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,221,208
++db	102,15,56,221,216
++	ret
++align	16
++__aesni_decrypt2:
++	movups	xmm0,[edx]
++	shl	ecx,4
++	movups	xmm1,[16+edx]
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	movups	xmm0,[32+edx]
++	lea	edx,[32+ecx*1+edx]
++	neg	ecx
++	add	ecx,16
++L$003dec2_loop:
++db	102,15,56,222,209
++db	102,15,56,222,217
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,222,208
++db	102,15,56,222,216
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$003dec2_loop
++db	102,15,56,222,209
++db	102,15,56,222,217
++db	102,15,56,223,208
++db	102,15,56,223,216
++	ret
++align	16
++__aesni_encrypt3:
++	movups	xmm0,[edx]
++	shl	ecx,4
++	movups	xmm1,[16+edx]
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++	movups	xmm0,[32+edx]
++	lea	edx,[32+ecx*1+edx]
++	neg	ecx
++	add	ecx,16
++L$004enc3_loop:
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,220,225
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,220,208
++db	102,15,56,220,216
++db	102,15,56,220,224
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$004enc3_loop
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,220,225
++db	102,15,56,221,208
++db	102,15,56,221,216
++db	102,15,56,221,224
++	ret
++align	16
++__aesni_decrypt3:
++	movups	xmm0,[edx]
++	shl	ecx,4
++	movups	xmm1,[16+edx]
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++	movups	xmm0,[32+edx]
++	lea	edx,[32+ecx*1+edx]
++	neg	ecx
++	add	ecx,16
++L$005dec3_loop:
++db	102,15,56,222,209
++db	102,15,56,222,217
++db	102,15,56,222,225
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,222,208
++db	102,15,56,222,216
++db	102,15,56,222,224
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$005dec3_loop
++db	102,15,56,222,209
++db	102,15,56,222,217
++db	102,15,56,222,225
++db	102,15,56,223,208
++db	102,15,56,223,216
++db	102,15,56,223,224
++	ret
++align	16
++__aesni_encrypt4:
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	shl	ecx,4
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++	pxor	xmm5,xmm0
++	movups	xmm0,[32+edx]
++	lea	edx,[32+ecx*1+edx]
++	neg	ecx
++db	15,31,64,0
++	add	ecx,16
++L$006enc4_loop:
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,220,225
++db	102,15,56,220,233
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,220,208
++db	102,15,56,220,216
++db	102,15,56,220,224
++db	102,15,56,220,232
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$006enc4_loop
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,220,225
++db	102,15,56,220,233
++db	102,15,56,221,208
++db	102,15,56,221,216
++db	102,15,56,221,224
++db	102,15,56,221,232
++	ret
++align	16
++__aesni_decrypt4:
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	shl	ecx,4
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++	pxor	xmm5,xmm0
++	movups	xmm0,[32+edx]
++	lea	edx,[32+ecx*1+edx]
++	neg	ecx
++db	15,31,64,0
++	add	ecx,16
++L$007dec4_loop:
++db	102,15,56,222,209
++db	102,15,56,222,217
++db	102,15,56,222,225
++db	102,15,56,222,233
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,222,208
++db	102,15,56,222,216
++db	102,15,56,222,224
++db	102,15,56,222,232
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$007dec4_loop
++db	102,15,56,222,209
++db	102,15,56,222,217
++db	102,15,56,222,225
++db	102,15,56,222,233
++db	102,15,56,223,208
++db	102,15,56,223,216
++db	102,15,56,223,224
++db	102,15,56,223,232
++	ret
++align	16
++__aesni_encrypt6:
++	movups	xmm0,[edx]
++	shl	ecx,4
++	movups	xmm1,[16+edx]
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++db	102,15,56,220,209
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm0
++db	102,15,56,220,217
++	lea	edx,[32+ecx*1+edx]
++	neg	ecx
++db	102,15,56,220,225
++	pxor	xmm7,xmm0
++	movups	xmm0,[ecx*1+edx]
++	add	ecx,16
++	jmp	NEAR L$008_aesni_encrypt6_inner
++align	16
++L$009enc6_loop:
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,220,225
++L$008_aesni_encrypt6_inner:
++db	102,15,56,220,233
++db	102,15,56,220,241
++db	102,15,56,220,249
++L$_aesni_encrypt6_enter:
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,220,208
++db	102,15,56,220,216
++db	102,15,56,220,224
++db	102,15,56,220,232
++db	102,15,56,220,240
++db	102,15,56,220,248
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$009enc6_loop
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,220,225
++db	102,15,56,220,233
++db	102,15,56,220,241
++db	102,15,56,220,249
++db	102,15,56,221,208
++db	102,15,56,221,216
++db	102,15,56,221,224
++db	102,15,56,221,232
++db	102,15,56,221,240
++db	102,15,56,221,248
++	ret
++align	16
++__aesni_decrypt6:
++	movups	xmm0,[edx]
++	shl	ecx,4
++	movups	xmm1,[16+edx]
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++db	102,15,56,222,209
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm0
++db	102,15,56,222,217
++	lea	edx,[32+ecx*1+edx]
++	neg	ecx
++db	102,15,56,222,225
++	pxor	xmm7,xmm0
++	movups	xmm0,[ecx*1+edx]
++	add	ecx,16
++	jmp	NEAR L$010_aesni_decrypt6_inner
++align	16
++L$011dec6_loop:
++db	102,15,56,222,209
++db	102,15,56,222,217
++db	102,15,56,222,225
++L$010_aesni_decrypt6_inner:
++db	102,15,56,222,233
++db	102,15,56,222,241
++db	102,15,56,222,249
++L$_aesni_decrypt6_enter:
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,222,208
++db	102,15,56,222,216
++db	102,15,56,222,224
++db	102,15,56,222,232
++db	102,15,56,222,240
++db	102,15,56,222,248
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$011dec6_loop
++db	102,15,56,222,209
++db	102,15,56,222,217
++db	102,15,56,222,225
++db	102,15,56,222,233
++db	102,15,56,222,241
++db	102,15,56,222,249
++db	102,15,56,223,208
++db	102,15,56,223,216
++db	102,15,56,223,224
++db	102,15,56,223,232
++db	102,15,56,223,240
++db	102,15,56,223,248
++	ret
++global	_aesni_ecb_encrypt
++align	16
++_aesni_ecb_encrypt:
++L$_aesni_ecb_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	edx,DWORD [32+esp]
++	mov	ebx,DWORD [36+esp]
++	and	eax,-16
++	jz	NEAR L$012ecb_ret
++	mov	ecx,DWORD [240+edx]
++	test	ebx,ebx
++	jz	NEAR L$013ecb_decrypt
++	mov	ebp,edx
++	mov	ebx,ecx
++	cmp	eax,96
++	jb	NEAR L$014ecb_enc_tail
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	movdqu	xmm5,[48+esi]
++	movdqu	xmm6,[64+esi]
++	movdqu	xmm7,[80+esi]
++	lea	esi,[96+esi]
++	sub	eax,96
++	jmp	NEAR L$015ecb_enc_loop6_enter
++align	16
++L$016ecb_enc_loop6:
++	movups	[edi],xmm2
++	movdqu	xmm2,[esi]
++	movups	[16+edi],xmm3
++	movdqu	xmm3,[16+esi]
++	movups	[32+edi],xmm4
++	movdqu	xmm4,[32+esi]
++	movups	[48+edi],xmm5
++	movdqu	xmm5,[48+esi]
++	movups	[64+edi],xmm6
++	movdqu	xmm6,[64+esi]
++	movups	[80+edi],xmm7
++	lea	edi,[96+edi]
++	movdqu	xmm7,[80+esi]
++	lea	esi,[96+esi]
++L$015ecb_enc_loop6_enter:
++	call	__aesni_encrypt6
++	mov	edx,ebp
++	mov	ecx,ebx
++	sub	eax,96
++	jnc	NEAR L$016ecb_enc_loop6
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	movups	[64+edi],xmm6
++	movups	[80+edi],xmm7
++	lea	edi,[96+edi]
++	add	eax,96
++	jz	NEAR L$012ecb_ret
++L$014ecb_enc_tail:
++	movups	xmm2,[esi]
++	cmp	eax,32
++	jb	NEAR L$017ecb_enc_one
++	movups	xmm3,[16+esi]
++	je	NEAR L$018ecb_enc_two
++	movups	xmm4,[32+esi]
++	cmp	eax,64
++	jb	NEAR L$019ecb_enc_three
++	movups	xmm5,[48+esi]
++	je	NEAR L$020ecb_enc_four
++	movups	xmm6,[64+esi]
++	xorps	xmm7,xmm7
++	call	__aesni_encrypt6
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	movups	[64+edi],xmm6
++	jmp	NEAR L$012ecb_ret
++align	16
++L$017ecb_enc_one:
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$021enc1_loop_3:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$021enc1_loop_3
++db	102,15,56,221,209
++	movups	[edi],xmm2
++	jmp	NEAR L$012ecb_ret
++align	16
++L$018ecb_enc_two:
++	call	__aesni_encrypt2
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	jmp	NEAR L$012ecb_ret
++align	16
++L$019ecb_enc_three:
++	call	__aesni_encrypt3
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	jmp	NEAR L$012ecb_ret
++align	16
++L$020ecb_enc_four:
++	call	__aesni_encrypt4
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	jmp	NEAR L$012ecb_ret
++align	16
++L$013ecb_decrypt:
++	mov	ebp,edx
++	mov	ebx,ecx
++	cmp	eax,96
++	jb	NEAR L$022ecb_dec_tail
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	movdqu	xmm5,[48+esi]
++	movdqu	xmm6,[64+esi]
++	movdqu	xmm7,[80+esi]
++	lea	esi,[96+esi]
++	sub	eax,96
++	jmp	NEAR L$023ecb_dec_loop6_enter
++align	16
++L$024ecb_dec_loop6:
++	movups	[edi],xmm2
++	movdqu	xmm2,[esi]
++	movups	[16+edi],xmm3
++	movdqu	xmm3,[16+esi]
++	movups	[32+edi],xmm4
++	movdqu	xmm4,[32+esi]
++	movups	[48+edi],xmm5
++	movdqu	xmm5,[48+esi]
++	movups	[64+edi],xmm6
++	movdqu	xmm6,[64+esi]
++	movups	[80+edi],xmm7
++	lea	edi,[96+edi]
++	movdqu	xmm7,[80+esi]
++	lea	esi,[96+esi]
++L$023ecb_dec_loop6_enter:
++	call	__aesni_decrypt6
++	mov	edx,ebp
++	mov	ecx,ebx
++	sub	eax,96
++	jnc	NEAR L$024ecb_dec_loop6
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	movups	[64+edi],xmm6
++	movups	[80+edi],xmm7
++	lea	edi,[96+edi]
++	add	eax,96
++	jz	NEAR L$012ecb_ret
++L$022ecb_dec_tail:
++	movups	xmm2,[esi]
++	cmp	eax,32
++	jb	NEAR L$025ecb_dec_one
++	movups	xmm3,[16+esi]
++	je	NEAR L$026ecb_dec_two
++	movups	xmm4,[32+esi]
++	cmp	eax,64
++	jb	NEAR L$027ecb_dec_three
++	movups	xmm5,[48+esi]
++	je	NEAR L$028ecb_dec_four
++	movups	xmm6,[64+esi]
++	xorps	xmm7,xmm7
++	call	__aesni_decrypt6
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	movups	[64+edi],xmm6
++	jmp	NEAR L$012ecb_ret
++align	16
++L$025ecb_dec_one:
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$029dec1_loop_4:
++db	102,15,56,222,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$029dec1_loop_4
++db	102,15,56,223,209
++	movups	[edi],xmm2
++	jmp	NEAR L$012ecb_ret
++align	16
++L$026ecb_dec_two:
++	call	__aesni_decrypt2
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	jmp	NEAR L$012ecb_ret
++align	16
++L$027ecb_dec_three:
++	call	__aesni_decrypt3
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	jmp	NEAR L$012ecb_ret
++align	16
++L$028ecb_dec_four:
++	call	__aesni_decrypt4
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++L$012ecb_ret:
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	pxor	xmm6,xmm6
++	pxor	xmm7,xmm7
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_aesni_ccm64_encrypt_blocks
++align	16
++_aesni_ccm64_encrypt_blocks:
++L$_aesni_ccm64_encrypt_blocks_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	edx,DWORD [32+esp]
++	mov	ebx,DWORD [36+esp]
++	mov	ecx,DWORD [40+esp]
++	mov	ebp,esp
++	sub	esp,60
++	and	esp,-16
++	mov	DWORD [48+esp],ebp
++	movdqu	xmm7,[ebx]
++	movdqu	xmm3,[ecx]
++	mov	ecx,DWORD [240+edx]
++	mov	DWORD [esp],202182159
++	mov	DWORD [4+esp],134810123
++	mov	DWORD [8+esp],67438087
++	mov	DWORD [12+esp],66051
++	mov	ebx,1
++	xor	ebp,ebp
++	mov	DWORD [16+esp],ebx
++	mov	DWORD [20+esp],ebp
++	mov	DWORD [24+esp],ebp
++	mov	DWORD [28+esp],ebp
++	shl	ecx,4
++	mov	ebx,16
++	lea	ebp,[edx]
++	movdqa	xmm5,[esp]
++	movdqa	xmm2,xmm7
++	lea	edx,[32+ecx*1+edx]
++	sub	ebx,ecx
++db	102,15,56,0,253
++L$030ccm64_enc_outer:
++	movups	xmm0,[ebp]
++	mov	ecx,ebx
++	movups	xmm6,[esi]
++	xorps	xmm2,xmm0
++	movups	xmm1,[16+ebp]
++	xorps	xmm0,xmm6
++	xorps	xmm3,xmm0
++	movups	xmm0,[32+ebp]
++L$031ccm64_enc2_loop:
++db	102,15,56,220,209
++db	102,15,56,220,217
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,220,208
++db	102,15,56,220,216
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$031ccm64_enc2_loop
++db	102,15,56,220,209
++db	102,15,56,220,217
++	paddq	xmm7,[16+esp]
++	dec	eax
++db	102,15,56,221,208
++db	102,15,56,221,216
++	lea	esi,[16+esi]
++	xorps	xmm6,xmm2
++	movdqa	xmm2,xmm7
++	movups	[edi],xmm6
++db	102,15,56,0,213
++	lea	edi,[16+edi]
++	jnz	NEAR L$030ccm64_enc_outer
++	mov	esp,DWORD [48+esp]
++	mov	edi,DWORD [40+esp]
++	movups	[edi],xmm3
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	pxor	xmm6,xmm6
++	pxor	xmm7,xmm7
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_aesni_ccm64_decrypt_blocks
++align	16
++_aesni_ccm64_decrypt_blocks:
++L$_aesni_ccm64_decrypt_blocks_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	edx,DWORD [32+esp]
++	mov	ebx,DWORD [36+esp]
++	mov	ecx,DWORD [40+esp]
++	mov	ebp,esp
++	sub	esp,60
++	and	esp,-16
++	mov	DWORD [48+esp],ebp
++	movdqu	xmm7,[ebx]
++	movdqu	xmm3,[ecx]
++	mov	ecx,DWORD [240+edx]
++	mov	DWORD [esp],202182159
++	mov	DWORD [4+esp],134810123
++	mov	DWORD [8+esp],67438087
++	mov	DWORD [12+esp],66051
++	mov	ebx,1
++	xor	ebp,ebp
++	mov	DWORD [16+esp],ebx
++	mov	DWORD [20+esp],ebp
++	mov	DWORD [24+esp],ebp
++	mov	DWORD [28+esp],ebp
++	movdqa	xmm5,[esp]
++	movdqa	xmm2,xmm7
++	mov	ebp,edx
++	mov	ebx,ecx
++db	102,15,56,0,253
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$032enc1_loop_5:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$032enc1_loop_5
++db	102,15,56,221,209
++	shl	ebx,4
++	mov	ecx,16
++	movups	xmm6,[esi]
++	paddq	xmm7,[16+esp]
++	lea	esi,[16+esi]
++	sub	ecx,ebx
++	lea	edx,[32+ebx*1+ebp]
++	mov	ebx,ecx
++	jmp	NEAR L$033ccm64_dec_outer
++align	16
++L$033ccm64_dec_outer:
++	xorps	xmm6,xmm2
++	movdqa	xmm2,xmm7
++	movups	[edi],xmm6
++	lea	edi,[16+edi]
++db	102,15,56,0,213
++	sub	eax,1
++	jz	NEAR L$034ccm64_dec_break
++	movups	xmm0,[ebp]
++	mov	ecx,ebx
++	movups	xmm1,[16+ebp]
++	xorps	xmm6,xmm0
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm6
++	movups	xmm0,[32+ebp]
++L$035ccm64_dec2_loop:
++db	102,15,56,220,209
++db	102,15,56,220,217
++	movups	xmm1,[ecx*1+edx]
++	add	ecx,32
++db	102,15,56,220,208
++db	102,15,56,220,216
++	movups	xmm0,[ecx*1+edx-16]
++	jnz	NEAR L$035ccm64_dec2_loop
++	movups	xmm6,[esi]
++	paddq	xmm7,[16+esp]
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,221,208
++db	102,15,56,221,216
++	lea	esi,[16+esi]
++	jmp	NEAR L$033ccm64_dec_outer
++align	16
++L$034ccm64_dec_break:
++	mov	ecx,DWORD [240+ebp]
++	mov	edx,ebp
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	xorps	xmm6,xmm0
++	lea	edx,[32+edx]
++	xorps	xmm3,xmm6
++L$036enc1_loop_6:
++db	102,15,56,220,217
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$036enc1_loop_6
++db	102,15,56,221,217
++	mov	esp,DWORD [48+esp]
++	mov	edi,DWORD [40+esp]
++	movups	[edi],xmm3
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	pxor	xmm6,xmm6
++	pxor	xmm7,xmm7
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_aesni_ctr32_encrypt_blocks
++align	16
++_aesni_ctr32_encrypt_blocks:
++L$_aesni_ctr32_encrypt_blocks_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	edx,DWORD [32+esp]
++	mov	ebx,DWORD [36+esp]
++	mov	ebp,esp
++	sub	esp,88
++	and	esp,-16
++	mov	DWORD [80+esp],ebp
++	cmp	eax,1
++	je	NEAR L$037ctr32_one_shortcut
++	movdqu	xmm7,[ebx]
++	mov	DWORD [esp],202182159
++	mov	DWORD [4+esp],134810123
++	mov	DWORD [8+esp],67438087
++	mov	DWORD [12+esp],66051
++	mov	ecx,6
++	xor	ebp,ebp
++	mov	DWORD [16+esp],ecx
++	mov	DWORD [20+esp],ecx
++	mov	DWORD [24+esp],ecx
++	mov	DWORD [28+esp],ebp
++db	102,15,58,22,251,3
++db	102,15,58,34,253,3
++	mov	ecx,DWORD [240+edx]
++	bswap	ebx
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	movdqa	xmm2,[esp]
++db	102,15,58,34,195,0
++	lea	ebp,[3+ebx]
++db	102,15,58,34,205,0
++	inc	ebx
++db	102,15,58,34,195,1
++	inc	ebp
++db	102,15,58,34,205,1
++	inc	ebx
++db	102,15,58,34,195,2
++	inc	ebp
++db	102,15,58,34,205,2
++	movdqa	[48+esp],xmm0
++db	102,15,56,0,194
++	movdqu	xmm6,[edx]
++	movdqa	[64+esp],xmm1
++db	102,15,56,0,202
++	pshufd	xmm2,xmm0,192
++	pshufd	xmm3,xmm0,128
++	cmp	eax,6
++	jb	NEAR L$038ctr32_tail
++	pxor	xmm7,xmm6
++	shl	ecx,4
++	mov	ebx,16
++	movdqa	[32+esp],xmm7
++	mov	ebp,edx
++	sub	ebx,ecx
++	lea	edx,[32+ecx*1+edx]
++	sub	eax,6
++	jmp	NEAR L$039ctr32_loop6
++align	16
++L$039ctr32_loop6:
++	pshufd	xmm4,xmm0,64
++	movdqa	xmm0,[32+esp]
++	pshufd	xmm5,xmm1,192
++	pxor	xmm2,xmm0
++	pshufd	xmm6,xmm1,128
++	pxor	xmm3,xmm0
++	pshufd	xmm7,xmm1,64
++	movups	xmm1,[16+ebp]
++	pxor	xmm4,xmm0
++	pxor	xmm5,xmm0
++db	102,15,56,220,209
++	pxor	xmm6,xmm0
++	pxor	xmm7,xmm0
++db	102,15,56,220,217
++	movups	xmm0,[32+ebp]
++	mov	ecx,ebx
++db	102,15,56,220,225
++db	102,15,56,220,233
++db	102,15,56,220,241
++db	102,15,56,220,249
++	call	L$_aesni_encrypt6_enter
++	movups	xmm1,[esi]
++	movups	xmm0,[16+esi]
++	xorps	xmm2,xmm1
++	movups	xmm1,[32+esi]
++	xorps	xmm3,xmm0
++	movups	[edi],xmm2
++	movdqa	xmm0,[16+esp]
++	xorps	xmm4,xmm1
++	movdqa	xmm1,[64+esp]
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	paddd	xmm1,xmm0
++	paddd	xmm0,[48+esp]
++	movdqa	xmm2,[esp]
++	movups	xmm3,[48+esi]
++	movups	xmm4,[64+esi]
++	xorps	xmm5,xmm3
++	movups	xmm3,[80+esi]
++	lea	esi,[96+esi]
++	movdqa	[48+esp],xmm0
++db	102,15,56,0,194
++	xorps	xmm6,xmm4
++	movups	[48+edi],xmm5
++	xorps	xmm7,xmm3
++	movdqa	[64+esp],xmm1
++db	102,15,56,0,202
++	movups	[64+edi],xmm6
++	pshufd	xmm2,xmm0,192
++	movups	[80+edi],xmm7
++	lea	edi,[96+edi]
++	pshufd	xmm3,xmm0,128
++	sub	eax,6
++	jnc	NEAR L$039ctr32_loop6
++	add	eax,6
++	jz	NEAR L$040ctr32_ret
++	movdqu	xmm7,[ebp]
++	mov	edx,ebp
++	pxor	xmm7,[32+esp]
++	mov	ecx,DWORD [240+ebp]
++L$038ctr32_tail:
++	por	xmm2,xmm7
++	cmp	eax,2
++	jb	NEAR L$041ctr32_one
++	pshufd	xmm4,xmm0,64
++	por	xmm3,xmm7
++	je	NEAR L$042ctr32_two
++	pshufd	xmm5,xmm1,192
++	por	xmm4,xmm7
++	cmp	eax,4
++	jb	NEAR L$043ctr32_three
++	pshufd	xmm6,xmm1,128
++	por	xmm5,xmm7
++	je	NEAR L$044ctr32_four
++	por	xmm6,xmm7
++	call	__aesni_encrypt6
++	movups	xmm1,[esi]
++	movups	xmm0,[16+esi]
++	xorps	xmm2,xmm1
++	movups	xmm1,[32+esi]
++	xorps	xmm3,xmm0
++	movups	xmm0,[48+esi]
++	xorps	xmm4,xmm1
++	movups	xmm1,[64+esi]
++	xorps	xmm5,xmm0
++	movups	[edi],xmm2
++	xorps	xmm6,xmm1
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	movups	[64+edi],xmm6
++	jmp	NEAR L$040ctr32_ret
++align	16
++L$037ctr32_one_shortcut:
++	movups	xmm2,[ebx]
++	mov	ecx,DWORD [240+edx]
++L$041ctr32_one:
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$045enc1_loop_7:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$045enc1_loop_7
++db	102,15,56,221,209
++	movups	xmm6,[esi]
++	xorps	xmm6,xmm2
++	movups	[edi],xmm6
++	jmp	NEAR L$040ctr32_ret
++align	16
++L$042ctr32_two:
++	call	__aesni_encrypt2
++	movups	xmm5,[esi]
++	movups	xmm6,[16+esi]
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	jmp	NEAR L$040ctr32_ret
++align	16
++L$043ctr32_three:
++	call	__aesni_encrypt3
++	movups	xmm5,[esi]
++	movups	xmm6,[16+esi]
++	xorps	xmm2,xmm5
++	movups	xmm7,[32+esi]
++	xorps	xmm3,xmm6
++	movups	[edi],xmm2
++	xorps	xmm4,xmm7
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	jmp	NEAR L$040ctr32_ret
++align	16
++L$044ctr32_four:
++	call	__aesni_encrypt4
++	movups	xmm6,[esi]
++	movups	xmm7,[16+esi]
++	movups	xmm1,[32+esi]
++	xorps	xmm2,xmm6
++	movups	xmm0,[48+esi]
++	xorps	xmm3,xmm7
++	movups	[edi],xmm2
++	xorps	xmm4,xmm1
++	movups	[16+edi],xmm3
++	xorps	xmm5,xmm0
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++L$040ctr32_ret:
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	movdqa	[32+esp],xmm0
++	pxor	xmm5,xmm5
++	movdqa	[48+esp],xmm0
++	pxor	xmm6,xmm6
++	movdqa	[64+esp],xmm0
++	pxor	xmm7,xmm7
++	mov	esp,DWORD [80+esp]
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_aesni_xts_encrypt
++align	16
++_aesni_xts_encrypt:
++L$_aesni_xts_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	edx,DWORD [36+esp]
++	mov	esi,DWORD [40+esp]
++	mov	ecx,DWORD [240+edx]
++	movups	xmm2,[esi]
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$046enc1_loop_8:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$046enc1_loop_8
++db	102,15,56,221,209
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	edx,DWORD [32+esp]
++	mov	ebp,esp
++	sub	esp,120
++	mov	ecx,DWORD [240+edx]
++	and	esp,-16
++	mov	DWORD [96+esp],135
++	mov	DWORD [100+esp],0
++	mov	DWORD [104+esp],1
++	mov	DWORD [108+esp],0
++	mov	DWORD [112+esp],eax
++	mov	DWORD [116+esp],ebp
++	movdqa	xmm1,xmm2
++	pxor	xmm0,xmm0
++	movdqa	xmm3,[96+esp]
++	pcmpgtd	xmm0,xmm1
++	and	eax,-16
++	mov	ebp,edx
++	mov	ebx,ecx
++	sub	eax,96
++	jc	NEAR L$047xts_enc_short
++	shl	ecx,4
++	mov	ebx,16
++	sub	ebx,ecx
++	lea	edx,[32+ecx*1+edx]
++	jmp	NEAR L$048xts_enc_loop6
++align	16
++L$048xts_enc_loop6:
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	[esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	[16+esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	[32+esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	[48+esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	pshufd	xmm7,xmm0,19
++	movdqa	[64+esp],xmm1
++	paddq	xmm1,xmm1
++	movups	xmm0,[ebp]
++	pand	xmm7,xmm3
++	movups	xmm2,[esi]
++	pxor	xmm7,xmm1
++	mov	ecx,ebx
++	movdqu	xmm3,[16+esi]
++	xorps	xmm2,xmm0
++	movdqu	xmm4,[32+esi]
++	pxor	xmm3,xmm0
++	movdqu	xmm5,[48+esi]
++	pxor	xmm4,xmm0
++	movdqu	xmm6,[64+esi]
++	pxor	xmm5,xmm0
++	movdqu	xmm1,[80+esi]
++	pxor	xmm6,xmm0
++	lea	esi,[96+esi]
++	pxor	xmm2,[esp]
++	movdqa	[80+esp],xmm7
++	pxor	xmm7,xmm1
++	movups	xmm1,[16+ebp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++db	102,15,56,220,209
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,[64+esp]
++db	102,15,56,220,217
++	pxor	xmm7,xmm0
++	movups	xmm0,[32+ebp]
++db	102,15,56,220,225
++db	102,15,56,220,233
++db	102,15,56,220,241
++db	102,15,56,220,249
++	call	L$_aesni_encrypt6_enter
++	movdqa	xmm1,[80+esp]
++	pxor	xmm0,xmm0
++	xorps	xmm2,[esp]
++	pcmpgtd	xmm0,xmm1
++	xorps	xmm3,[16+esp]
++	movups	[edi],xmm2
++	xorps	xmm4,[32+esp]
++	movups	[16+edi],xmm3
++	xorps	xmm5,[48+esp]
++	movups	[32+edi],xmm4
++	xorps	xmm6,[64+esp]
++	movups	[48+edi],xmm5
++	xorps	xmm7,xmm1
++	movups	[64+edi],xmm6
++	pshufd	xmm2,xmm0,19
++	movups	[80+edi],xmm7
++	lea	edi,[96+edi]
++	movdqa	xmm3,[96+esp]
++	pxor	xmm0,xmm0
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	sub	eax,96
++	jnc	NEAR L$048xts_enc_loop6
++	mov	ecx,DWORD [240+ebp]
++	mov	edx,ebp
++	mov	ebx,ecx
++L$047xts_enc_short:
++	add	eax,96
++	jz	NEAR L$049xts_enc_done6x
++	movdqa	xmm5,xmm1
++	cmp	eax,32
++	jb	NEAR L$050xts_enc_one
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	je	NEAR L$051xts_enc_two
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	xmm6,xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	cmp	eax,64
++	jb	NEAR L$052xts_enc_three
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	xmm7,xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	movdqa	[esp],xmm5
++	movdqa	[16+esp],xmm6
++	je	NEAR L$053xts_enc_four
++	movdqa	[32+esp],xmm7
++	pshufd	xmm7,xmm0,19
++	movdqa	[48+esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm7,xmm3
++	pxor	xmm7,xmm1
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	pxor	xmm2,[esp]
++	movdqu	xmm5,[48+esi]
++	pxor	xmm3,[16+esp]
++	movdqu	xmm6,[64+esi]
++	pxor	xmm4,[32+esp]
++	lea	esi,[80+esi]
++	pxor	xmm5,[48+esp]
++	movdqa	[64+esp],xmm7
++	pxor	xmm6,xmm7
++	call	__aesni_encrypt6
++	movaps	xmm1,[64+esp]
++	xorps	xmm2,[esp]
++	xorps	xmm3,[16+esp]
++	xorps	xmm4,[32+esp]
++	movups	[edi],xmm2
++	xorps	xmm5,[48+esp]
++	movups	[16+edi],xmm3
++	xorps	xmm6,xmm1
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	movups	[64+edi],xmm6
++	lea	edi,[80+edi]
++	jmp	NEAR L$054xts_enc_done
++align	16
++L$050xts_enc_one:
++	movups	xmm2,[esi]
++	lea	esi,[16+esi]
++	xorps	xmm2,xmm5
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$055enc1_loop_9:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$055enc1_loop_9
++db	102,15,56,221,209
++	xorps	xmm2,xmm5
++	movups	[edi],xmm2
++	lea	edi,[16+edi]
++	movdqa	xmm1,xmm5
++	jmp	NEAR L$054xts_enc_done
++align	16
++L$051xts_enc_two:
++	movaps	xmm6,xmm1
++	movups	xmm2,[esi]
++	movups	xmm3,[16+esi]
++	lea	esi,[32+esi]
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	call	__aesni_encrypt2
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	lea	edi,[32+edi]
++	movdqa	xmm1,xmm6
++	jmp	NEAR L$054xts_enc_done
++align	16
++L$052xts_enc_three:
++	movaps	xmm7,xmm1
++	movups	xmm2,[esi]
++	movups	xmm3,[16+esi]
++	movups	xmm4,[32+esi]
++	lea	esi,[48+esi]
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	xorps	xmm4,xmm7
++	call	__aesni_encrypt3
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	xorps	xmm4,xmm7
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	lea	edi,[48+edi]
++	movdqa	xmm1,xmm7
++	jmp	NEAR L$054xts_enc_done
++align	16
++L$053xts_enc_four:
++	movaps	xmm6,xmm1
++	movups	xmm2,[esi]
++	movups	xmm3,[16+esi]
++	movups	xmm4,[32+esi]
++	xorps	xmm2,[esp]
++	movups	xmm5,[48+esi]
++	lea	esi,[64+esi]
++	xorps	xmm3,[16+esp]
++	xorps	xmm4,xmm7
++	xorps	xmm5,xmm6
++	call	__aesni_encrypt4
++	xorps	xmm2,[esp]
++	xorps	xmm3,[16+esp]
++	xorps	xmm4,xmm7
++	movups	[edi],xmm2
++	xorps	xmm5,xmm6
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	lea	edi,[64+edi]
++	movdqa	xmm1,xmm6
++	jmp	NEAR L$054xts_enc_done
++align	16
++L$049xts_enc_done6x:
++	mov	eax,DWORD [112+esp]
++	and	eax,15
++	jz	NEAR L$056xts_enc_ret
++	movdqa	xmm5,xmm1
++	mov	DWORD [112+esp],eax
++	jmp	NEAR L$057xts_enc_steal
++align	16
++L$054xts_enc_done:
++	mov	eax,DWORD [112+esp]
++	pxor	xmm0,xmm0
++	and	eax,15
++	jz	NEAR L$056xts_enc_ret
++	pcmpgtd	xmm0,xmm1
++	mov	DWORD [112+esp],eax
++	pshufd	xmm5,xmm0,19
++	paddq	xmm1,xmm1
++	pand	xmm5,[96+esp]
++	pxor	xmm5,xmm1
++L$057xts_enc_steal:
++	movzx	ecx,BYTE [esi]
++	movzx	edx,BYTE [edi-16]
++	lea	esi,[1+esi]
++	mov	BYTE [edi-16],cl
++	mov	BYTE [edi],dl
++	lea	edi,[1+edi]
++	sub	eax,1
++	jnz	NEAR L$057xts_enc_steal
++	sub	edi,DWORD [112+esp]
++	mov	edx,ebp
++	mov	ecx,ebx
++	movups	xmm2,[edi-16]
++	xorps	xmm2,xmm5
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$058enc1_loop_10:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$058enc1_loop_10
++db	102,15,56,221,209
++	xorps	xmm2,xmm5
++	movups	[edi-16],xmm2
++L$056xts_enc_ret:
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	movdqa	[esp],xmm0
++	pxor	xmm3,xmm3
++	movdqa	[16+esp],xmm0
++	pxor	xmm4,xmm4
++	movdqa	[32+esp],xmm0
++	pxor	xmm5,xmm5
++	movdqa	[48+esp],xmm0
++	pxor	xmm6,xmm6
++	movdqa	[64+esp],xmm0
++	pxor	xmm7,xmm7
++	movdqa	[80+esp],xmm0
++	mov	esp,DWORD [116+esp]
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_aesni_xts_decrypt
++align	16
++_aesni_xts_decrypt:
++L$_aesni_xts_decrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	edx,DWORD [36+esp]
++	mov	esi,DWORD [40+esp]
++	mov	ecx,DWORD [240+edx]
++	movups	xmm2,[esi]
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$059enc1_loop_11:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$059enc1_loop_11
++db	102,15,56,221,209
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	edx,DWORD [32+esp]
++	mov	ebp,esp
++	sub	esp,120
++	and	esp,-16
++	xor	ebx,ebx
++	test	eax,15
++	setnz	bl
++	shl	ebx,4
++	sub	eax,ebx
++	mov	DWORD [96+esp],135
++	mov	DWORD [100+esp],0
++	mov	DWORD [104+esp],1
++	mov	DWORD [108+esp],0
++	mov	DWORD [112+esp],eax
++	mov	DWORD [116+esp],ebp
++	mov	ecx,DWORD [240+edx]
++	mov	ebp,edx
++	mov	ebx,ecx
++	movdqa	xmm1,xmm2
++	pxor	xmm0,xmm0
++	movdqa	xmm3,[96+esp]
++	pcmpgtd	xmm0,xmm1
++	and	eax,-16
++	sub	eax,96
++	jc	NEAR L$060xts_dec_short
++	shl	ecx,4
++	mov	ebx,16
++	sub	ebx,ecx
++	lea	edx,[32+ecx*1+edx]
++	jmp	NEAR L$061xts_dec_loop6
++align	16
++L$061xts_dec_loop6:
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	[esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	[16+esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	[32+esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	[48+esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	pshufd	xmm7,xmm0,19
++	movdqa	[64+esp],xmm1
++	paddq	xmm1,xmm1
++	movups	xmm0,[ebp]
++	pand	xmm7,xmm3
++	movups	xmm2,[esi]
++	pxor	xmm7,xmm1
++	mov	ecx,ebx
++	movdqu	xmm3,[16+esi]
++	xorps	xmm2,xmm0
++	movdqu	xmm4,[32+esi]
++	pxor	xmm3,xmm0
++	movdqu	xmm5,[48+esi]
++	pxor	xmm4,xmm0
++	movdqu	xmm6,[64+esi]
++	pxor	xmm5,xmm0
++	movdqu	xmm1,[80+esi]
++	pxor	xmm6,xmm0
++	lea	esi,[96+esi]
++	pxor	xmm2,[esp]
++	movdqa	[80+esp],xmm7
++	pxor	xmm7,xmm1
++	movups	xmm1,[16+ebp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++db	102,15,56,222,209
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,[64+esp]
++db	102,15,56,222,217
++	pxor	xmm7,xmm0
++	movups	xmm0,[32+ebp]
++db	102,15,56,222,225
++db	102,15,56,222,233
++db	102,15,56,222,241
++db	102,15,56,222,249
++	call	L$_aesni_decrypt6_enter
++	movdqa	xmm1,[80+esp]
++	pxor	xmm0,xmm0
++	xorps	xmm2,[esp]
++	pcmpgtd	xmm0,xmm1
++	xorps	xmm3,[16+esp]
++	movups	[edi],xmm2
++	xorps	xmm4,[32+esp]
++	movups	[16+edi],xmm3
++	xorps	xmm5,[48+esp]
++	movups	[32+edi],xmm4
++	xorps	xmm6,[64+esp]
++	movups	[48+edi],xmm5
++	xorps	xmm7,xmm1
++	movups	[64+edi],xmm6
++	pshufd	xmm2,xmm0,19
++	movups	[80+edi],xmm7
++	lea	edi,[96+edi]
++	movdqa	xmm3,[96+esp]
++	pxor	xmm0,xmm0
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	sub	eax,96
++	jnc	NEAR L$061xts_dec_loop6
++	mov	ecx,DWORD [240+ebp]
++	mov	edx,ebp
++	mov	ebx,ecx
++L$060xts_dec_short:
++	add	eax,96
++	jz	NEAR L$062xts_dec_done6x
++	movdqa	xmm5,xmm1
++	cmp	eax,32
++	jb	NEAR L$063xts_dec_one
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	je	NEAR L$064xts_dec_two
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	xmm6,xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	cmp	eax,64
++	jb	NEAR L$065xts_dec_three
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	xmm7,xmm1
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++	movdqa	[esp],xmm5
++	movdqa	[16+esp],xmm6
++	je	NEAR L$066xts_dec_four
++	movdqa	[32+esp],xmm7
++	pshufd	xmm7,xmm0,19
++	movdqa	[48+esp],xmm1
++	paddq	xmm1,xmm1
++	pand	xmm7,xmm3
++	pxor	xmm7,xmm1
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	pxor	xmm2,[esp]
++	movdqu	xmm5,[48+esi]
++	pxor	xmm3,[16+esp]
++	movdqu	xmm6,[64+esi]
++	pxor	xmm4,[32+esp]
++	lea	esi,[80+esi]
++	pxor	xmm5,[48+esp]
++	movdqa	[64+esp],xmm7
++	pxor	xmm6,xmm7
++	call	__aesni_decrypt6
++	movaps	xmm1,[64+esp]
++	xorps	xmm2,[esp]
++	xorps	xmm3,[16+esp]
++	xorps	xmm4,[32+esp]
++	movups	[edi],xmm2
++	xorps	xmm5,[48+esp]
++	movups	[16+edi],xmm3
++	xorps	xmm6,xmm1
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	movups	[64+edi],xmm6
++	lea	edi,[80+edi]
++	jmp	NEAR L$067xts_dec_done
++align	16
++L$063xts_dec_one:
++	movups	xmm2,[esi]
++	lea	esi,[16+esi]
++	xorps	xmm2,xmm5
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$068dec1_loop_12:
++db	102,15,56,222,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$068dec1_loop_12
++db	102,15,56,223,209
++	xorps	xmm2,xmm5
++	movups	[edi],xmm2
++	lea	edi,[16+edi]
++	movdqa	xmm1,xmm5
++	jmp	NEAR L$067xts_dec_done
++align	16
++L$064xts_dec_two:
++	movaps	xmm6,xmm1
++	movups	xmm2,[esi]
++	movups	xmm3,[16+esi]
++	lea	esi,[32+esi]
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	call	__aesni_decrypt2
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	lea	edi,[32+edi]
++	movdqa	xmm1,xmm6
++	jmp	NEAR L$067xts_dec_done
++align	16
++L$065xts_dec_three:
++	movaps	xmm7,xmm1
++	movups	xmm2,[esi]
++	movups	xmm3,[16+esi]
++	movups	xmm4,[32+esi]
++	lea	esi,[48+esi]
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	xorps	xmm4,xmm7
++	call	__aesni_decrypt3
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	xorps	xmm4,xmm7
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	lea	edi,[48+edi]
++	movdqa	xmm1,xmm7
++	jmp	NEAR L$067xts_dec_done
++align	16
++L$066xts_dec_four:
++	movaps	xmm6,xmm1
++	movups	xmm2,[esi]
++	movups	xmm3,[16+esi]
++	movups	xmm4,[32+esi]
++	xorps	xmm2,[esp]
++	movups	xmm5,[48+esi]
++	lea	esi,[64+esi]
++	xorps	xmm3,[16+esp]
++	xorps	xmm4,xmm7
++	xorps	xmm5,xmm6
++	call	__aesni_decrypt4
++	xorps	xmm2,[esp]
++	xorps	xmm3,[16+esp]
++	xorps	xmm4,xmm7
++	movups	[edi],xmm2
++	xorps	xmm5,xmm6
++	movups	[16+edi],xmm3
++	movups	[32+edi],xmm4
++	movups	[48+edi],xmm5
++	lea	edi,[64+edi]
++	movdqa	xmm1,xmm6
++	jmp	NEAR L$067xts_dec_done
++align	16
++L$062xts_dec_done6x:
++	mov	eax,DWORD [112+esp]
++	and	eax,15
++	jz	NEAR L$069xts_dec_ret
++	mov	DWORD [112+esp],eax
++	jmp	NEAR L$070xts_dec_only_one_more
++align	16
++L$067xts_dec_done:
++	mov	eax,DWORD [112+esp]
++	pxor	xmm0,xmm0
++	and	eax,15
++	jz	NEAR L$069xts_dec_ret
++	pcmpgtd	xmm0,xmm1
++	mov	DWORD [112+esp],eax
++	pshufd	xmm2,xmm0,19
++	pxor	xmm0,xmm0
++	movdqa	xmm3,[96+esp]
++	paddq	xmm1,xmm1
++	pand	xmm2,xmm3
++	pcmpgtd	xmm0,xmm1
++	pxor	xmm1,xmm2
++L$070xts_dec_only_one_more:
++	pshufd	xmm5,xmm0,19
++	movdqa	xmm6,xmm1
++	paddq	xmm1,xmm1
++	pand	xmm5,xmm3
++	pxor	xmm5,xmm1
++	mov	edx,ebp
++	mov	ecx,ebx
++	movups	xmm2,[esi]
++	xorps	xmm2,xmm5
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$071dec1_loop_13:
++db	102,15,56,222,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$071dec1_loop_13
++db	102,15,56,223,209
++	xorps	xmm2,xmm5
++	movups	[edi],xmm2
++L$072xts_dec_steal:
++	movzx	ecx,BYTE [16+esi]
++	movzx	edx,BYTE [edi]
++	lea	esi,[1+esi]
++	mov	BYTE [edi],cl
++	mov	BYTE [16+edi],dl
++	lea	edi,[1+edi]
++	sub	eax,1
++	jnz	NEAR L$072xts_dec_steal
++	sub	edi,DWORD [112+esp]
++	mov	edx,ebp
++	mov	ecx,ebx
++	movups	xmm2,[edi]
++	xorps	xmm2,xmm6
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$073dec1_loop_14:
++db	102,15,56,222,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$073dec1_loop_14
++db	102,15,56,223,209
++	xorps	xmm2,xmm6
++	movups	[edi],xmm2
++L$069xts_dec_ret:
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	movdqa	[esp],xmm0
++	pxor	xmm3,xmm3
++	movdqa	[16+esp],xmm0
++	pxor	xmm4,xmm4
++	movdqa	[32+esp],xmm0
++	pxor	xmm5,xmm5
++	movdqa	[48+esp],xmm0
++	pxor	xmm6,xmm6
++	movdqa	[64+esp],xmm0
++	pxor	xmm7,xmm7
++	movdqa	[80+esp],xmm0
++	mov	esp,DWORD [116+esp]
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_aesni_ocb_encrypt
++align	16
++_aesni_ocb_encrypt:
++L$_aesni_ocb_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	ecx,DWORD [40+esp]
++	mov	ebx,DWORD [48+esp]
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	edx,DWORD [32+esp]
++	movdqu	xmm0,[ecx]
++	mov	ebp,DWORD [36+esp]
++	movdqu	xmm1,[ebx]
++	mov	ebx,DWORD [44+esp]
++	mov	ecx,esp
++	sub	esp,132
++	and	esp,-16
++	sub	edi,esi
++	shl	eax,4
++	lea	eax,[eax*1+esi-96]
++	mov	DWORD [120+esp],edi
++	mov	DWORD [124+esp],eax
++	mov	DWORD [128+esp],ecx
++	mov	ecx,DWORD [240+edx]
++	test	ebp,1
++	jnz	NEAR L$074odd
++	bsf	eax,ebp
++	add	ebp,1
++	shl	eax,4
++	movdqu	xmm7,[eax*1+ebx]
++	mov	eax,edx
++	movdqu	xmm2,[esi]
++	lea	esi,[16+esi]
++	pxor	xmm7,xmm0
++	pxor	xmm1,xmm2
++	pxor	xmm2,xmm7
++	movdqa	xmm6,xmm1
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$075enc1_loop_15:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$075enc1_loop_15
++db	102,15,56,221,209
++	xorps	xmm2,xmm7
++	movdqa	xmm0,xmm7
++	movdqa	xmm1,xmm6
++	movups	[esi*1+edi-16],xmm2
++	mov	ecx,DWORD [240+eax]
++	mov	edx,eax
++	mov	eax,DWORD [124+esp]
++L$074odd:
++	shl	ecx,4
++	mov	edi,16
++	sub	edi,ecx
++	mov	DWORD [112+esp],edx
++	lea	edx,[32+ecx*1+edx]
++	mov	DWORD [116+esp],edi
++	cmp	esi,eax
++	ja	NEAR L$076short
++	jmp	NEAR L$077grandloop
++align	32
++L$077grandloop:
++	lea	ecx,[1+ebp]
++	lea	eax,[3+ebp]
++	lea	edi,[5+ebp]
++	add	ebp,6
++	bsf	ecx,ecx
++	bsf	eax,eax
++	bsf	edi,edi
++	shl	ecx,4
++	shl	eax,4
++	shl	edi,4
++	movdqu	xmm2,[ebx]
++	movdqu	xmm3,[ecx*1+ebx]
++	mov	ecx,DWORD [116+esp]
++	movdqa	xmm4,xmm2
++	movdqu	xmm5,[eax*1+ebx]
++	movdqa	xmm6,xmm2
++	movdqu	xmm7,[edi*1+ebx]
++	pxor	xmm2,xmm0
++	pxor	xmm3,xmm2
++	movdqa	[esp],xmm2
++	pxor	xmm4,xmm3
++	movdqa	[16+esp],xmm3
++	pxor	xmm5,xmm4
++	movdqa	[32+esp],xmm4
++	pxor	xmm6,xmm5
++	movdqa	[48+esp],xmm5
++	pxor	xmm7,xmm6
++	movdqa	[64+esp],xmm6
++	movdqa	[80+esp],xmm7
++	movups	xmm0,[ecx*1+edx-48]
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	movdqu	xmm5,[48+esi]
++	movdqu	xmm6,[64+esi]
++	movdqu	xmm7,[80+esi]
++	lea	esi,[96+esi]
++	pxor	xmm1,xmm2
++	pxor	xmm2,xmm0
++	pxor	xmm1,xmm3
++	pxor	xmm3,xmm0
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm0
++	pxor	xmm1,xmm5
++	pxor	xmm5,xmm0
++	pxor	xmm1,xmm6
++	pxor	xmm6,xmm0
++	pxor	xmm1,xmm7
++	pxor	xmm7,xmm0
++	movdqa	[96+esp],xmm1
++	movups	xmm1,[ecx*1+edx-32]
++	pxor	xmm2,[esp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,[64+esp]
++	pxor	xmm7,[80+esp]
++	movups	xmm0,[ecx*1+edx-16]
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,220,225
++db	102,15,56,220,233
++db	102,15,56,220,241
++db	102,15,56,220,249
++	mov	edi,DWORD [120+esp]
++	mov	eax,DWORD [124+esp]
++	call	L$_aesni_encrypt6_enter
++	movdqa	xmm0,[80+esp]
++	pxor	xmm2,[esp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,[64+esp]
++	pxor	xmm7,xmm0
++	movdqa	xmm1,[96+esp]
++	movdqu	[esi*1+edi-96],xmm2
++	movdqu	[esi*1+edi-80],xmm3
++	movdqu	[esi*1+edi-64],xmm4
++	movdqu	[esi*1+edi-48],xmm5
++	movdqu	[esi*1+edi-32],xmm6
++	movdqu	[esi*1+edi-16],xmm7
++	cmp	esi,eax
++	jb	NEAR L$077grandloop
++L$076short:
++	add	eax,96
++	sub	eax,esi
++	jz	NEAR L$078done
++	cmp	eax,32
++	jb	NEAR L$079one
++	je	NEAR L$080two
++	cmp	eax,64
++	jb	NEAR L$081three
++	je	NEAR L$082four
++	lea	ecx,[1+ebp]
++	lea	eax,[3+ebp]
++	bsf	ecx,ecx
++	bsf	eax,eax
++	shl	ecx,4
++	shl	eax,4
++	movdqu	xmm2,[ebx]
++	movdqu	xmm3,[ecx*1+ebx]
++	mov	ecx,DWORD [116+esp]
++	movdqa	xmm4,xmm2
++	movdqu	xmm5,[eax*1+ebx]
++	movdqa	xmm6,xmm2
++	pxor	xmm2,xmm0
++	pxor	xmm3,xmm2
++	movdqa	[esp],xmm2
++	pxor	xmm4,xmm3
++	movdqa	[16+esp],xmm3
++	pxor	xmm5,xmm4
++	movdqa	[32+esp],xmm4
++	pxor	xmm6,xmm5
++	movdqa	[48+esp],xmm5
++	pxor	xmm7,xmm6
++	movdqa	[64+esp],xmm6
++	movups	xmm0,[ecx*1+edx-48]
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	movdqu	xmm5,[48+esi]
++	movdqu	xmm6,[64+esi]
++	pxor	xmm7,xmm7
++	pxor	xmm1,xmm2
++	pxor	xmm2,xmm0
++	pxor	xmm1,xmm3
++	pxor	xmm3,xmm0
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm0
++	pxor	xmm1,xmm5
++	pxor	xmm5,xmm0
++	pxor	xmm1,xmm6
++	pxor	xmm6,xmm0
++	movdqa	[96+esp],xmm1
++	movups	xmm1,[ecx*1+edx-32]
++	pxor	xmm2,[esp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,[64+esp]
++	movups	xmm0,[ecx*1+edx-16]
++db	102,15,56,220,209
++db	102,15,56,220,217
++db	102,15,56,220,225
++db	102,15,56,220,233
++db	102,15,56,220,241
++db	102,15,56,220,249
++	mov	edi,DWORD [120+esp]
++	call	L$_aesni_encrypt6_enter
++	movdqa	xmm0,[64+esp]
++	pxor	xmm2,[esp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,xmm0
++	movdqa	xmm1,[96+esp]
++	movdqu	[esi*1+edi],xmm2
++	movdqu	[16+esi*1+edi],xmm3
++	movdqu	[32+esi*1+edi],xmm4
++	movdqu	[48+esi*1+edi],xmm5
++	movdqu	[64+esi*1+edi],xmm6
++	jmp	NEAR L$078done
++align	16
++L$079one:
++	movdqu	xmm7,[ebx]
++	mov	edx,DWORD [112+esp]
++	movdqu	xmm2,[esi]
++	mov	ecx,DWORD [240+edx]
++	pxor	xmm7,xmm0
++	pxor	xmm1,xmm2
++	pxor	xmm2,xmm7
++	movdqa	xmm6,xmm1
++	mov	edi,DWORD [120+esp]
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$083enc1_loop_16:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$083enc1_loop_16
++db	102,15,56,221,209
++	xorps	xmm2,xmm7
++	movdqa	xmm0,xmm7
++	movdqa	xmm1,xmm6
++	movups	[esi*1+edi],xmm2
++	jmp	NEAR L$078done
++align	16
++L$080two:
++	lea	ecx,[1+ebp]
++	mov	edx,DWORD [112+esp]
++	bsf	ecx,ecx
++	shl	ecx,4
++	movdqu	xmm6,[ebx]
++	movdqu	xmm7,[ecx*1+ebx]
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	mov	ecx,DWORD [240+edx]
++	pxor	xmm6,xmm0
++	pxor	xmm7,xmm6
++	pxor	xmm1,xmm2
++	pxor	xmm2,xmm6
++	pxor	xmm1,xmm3
++	pxor	xmm3,xmm7
++	movdqa	xmm5,xmm1
++	mov	edi,DWORD [120+esp]
++	call	__aesni_encrypt2
++	xorps	xmm2,xmm6
++	xorps	xmm3,xmm7
++	movdqa	xmm0,xmm7
++	movdqa	xmm1,xmm5
++	movups	[esi*1+edi],xmm2
++	movups	[16+esi*1+edi],xmm3
++	jmp	NEAR L$078done
++align	16
++L$081three:
++	lea	ecx,[1+ebp]
++	mov	edx,DWORD [112+esp]
++	bsf	ecx,ecx
++	shl	ecx,4
++	movdqu	xmm5,[ebx]
++	movdqu	xmm6,[ecx*1+ebx]
++	movdqa	xmm7,xmm5
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	mov	ecx,DWORD [240+edx]
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm5
++	pxor	xmm7,xmm6
++	pxor	xmm1,xmm2
++	pxor	xmm2,xmm5
++	pxor	xmm1,xmm3
++	pxor	xmm3,xmm6
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm7
++	movdqa	[96+esp],xmm1
++	mov	edi,DWORD [120+esp]
++	call	__aesni_encrypt3
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	xorps	xmm4,xmm7
++	movdqa	xmm0,xmm7
++	movdqa	xmm1,[96+esp]
++	movups	[esi*1+edi],xmm2
++	movups	[16+esi*1+edi],xmm3
++	movups	[32+esi*1+edi],xmm4
++	jmp	NEAR L$078done
++align	16
++L$082four:
++	lea	ecx,[1+ebp]
++	lea	eax,[3+ebp]
++	bsf	ecx,ecx
++	bsf	eax,eax
++	mov	edx,DWORD [112+esp]
++	shl	ecx,4
++	shl	eax,4
++	movdqu	xmm4,[ebx]
++	movdqu	xmm5,[ecx*1+ebx]
++	movdqa	xmm6,xmm4
++	movdqu	xmm7,[eax*1+ebx]
++	pxor	xmm4,xmm0
++	movdqu	xmm2,[esi]
++	pxor	xmm5,xmm4
++	movdqu	xmm3,[16+esi]
++	pxor	xmm6,xmm5
++	movdqa	[esp],xmm4
++	pxor	xmm7,xmm6
++	movdqa	[16+esp],xmm5
++	movdqu	xmm4,[32+esi]
++	movdqu	xmm5,[48+esi]
++	mov	ecx,DWORD [240+edx]
++	pxor	xmm1,xmm2
++	pxor	xmm2,[esp]
++	pxor	xmm1,xmm3
++	pxor	xmm3,[16+esp]
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm6
++	pxor	xmm1,xmm5
++	pxor	xmm5,xmm7
++	movdqa	[96+esp],xmm1
++	mov	edi,DWORD [120+esp]
++	call	__aesni_encrypt4
++	xorps	xmm2,[esp]
++	xorps	xmm3,[16+esp]
++	xorps	xmm4,xmm6
++	movups	[esi*1+edi],xmm2
++	xorps	xmm5,xmm7
++	movups	[16+esi*1+edi],xmm3
++	movdqa	xmm0,xmm7
++	movups	[32+esi*1+edi],xmm4
++	movdqa	xmm1,[96+esp]
++	movups	[48+esi*1+edi],xmm5
++L$078done:
++	mov	edx,DWORD [128+esp]
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	movdqa	[esp],xmm2
++	pxor	xmm4,xmm4
++	movdqa	[16+esp],xmm2
++	pxor	xmm5,xmm5
++	movdqa	[32+esp],xmm2
++	pxor	xmm6,xmm6
++	movdqa	[48+esp],xmm2
++	pxor	xmm7,xmm7
++	movdqa	[64+esp],xmm2
++	movdqa	[80+esp],xmm2
++	movdqa	[96+esp],xmm2
++	lea	esp,[edx]
++	mov	ecx,DWORD [40+esp]
++	mov	ebx,DWORD [48+esp]
++	movdqu	[ecx],xmm0
++	pxor	xmm0,xmm0
++	movdqu	[ebx],xmm1
++	pxor	xmm1,xmm1
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_aesni_ocb_decrypt
++align	16
++_aesni_ocb_decrypt:
++L$_aesni_ocb_decrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	ecx,DWORD [40+esp]
++	mov	ebx,DWORD [48+esp]
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	edx,DWORD [32+esp]
++	movdqu	xmm0,[ecx]
++	mov	ebp,DWORD [36+esp]
++	movdqu	xmm1,[ebx]
++	mov	ebx,DWORD [44+esp]
++	mov	ecx,esp
++	sub	esp,132
++	and	esp,-16
++	sub	edi,esi
++	shl	eax,4
++	lea	eax,[eax*1+esi-96]
++	mov	DWORD [120+esp],edi
++	mov	DWORD [124+esp],eax
++	mov	DWORD [128+esp],ecx
++	mov	ecx,DWORD [240+edx]
++	test	ebp,1
++	jnz	NEAR L$084odd
++	bsf	eax,ebp
++	add	ebp,1
++	shl	eax,4
++	movdqu	xmm7,[eax*1+ebx]
++	mov	eax,edx
++	movdqu	xmm2,[esi]
++	lea	esi,[16+esi]
++	pxor	xmm7,xmm0
++	pxor	xmm2,xmm7
++	movdqa	xmm6,xmm1
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$085dec1_loop_17:
++db	102,15,56,222,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$085dec1_loop_17
++db	102,15,56,223,209
++	xorps	xmm2,xmm7
++	movaps	xmm1,xmm6
++	movdqa	xmm0,xmm7
++	xorps	xmm1,xmm2
++	movups	[esi*1+edi-16],xmm2
++	mov	ecx,DWORD [240+eax]
++	mov	edx,eax
++	mov	eax,DWORD [124+esp]
++L$084odd:
++	shl	ecx,4
++	mov	edi,16
++	sub	edi,ecx
++	mov	DWORD [112+esp],edx
++	lea	edx,[32+ecx*1+edx]
++	mov	DWORD [116+esp],edi
++	cmp	esi,eax
++	ja	NEAR L$086short
++	jmp	NEAR L$087grandloop
++align	32
++L$087grandloop:
++	lea	ecx,[1+ebp]
++	lea	eax,[3+ebp]
++	lea	edi,[5+ebp]
++	add	ebp,6
++	bsf	ecx,ecx
++	bsf	eax,eax
++	bsf	edi,edi
++	shl	ecx,4
++	shl	eax,4
++	shl	edi,4
++	movdqu	xmm2,[ebx]
++	movdqu	xmm3,[ecx*1+ebx]
++	mov	ecx,DWORD [116+esp]
++	movdqa	xmm4,xmm2
++	movdqu	xmm5,[eax*1+ebx]
++	movdqa	xmm6,xmm2
++	movdqu	xmm7,[edi*1+ebx]
++	pxor	xmm2,xmm0
++	pxor	xmm3,xmm2
++	movdqa	[esp],xmm2
++	pxor	xmm4,xmm3
++	movdqa	[16+esp],xmm3
++	pxor	xmm5,xmm4
++	movdqa	[32+esp],xmm4
++	pxor	xmm6,xmm5
++	movdqa	[48+esp],xmm5
++	pxor	xmm7,xmm6
++	movdqa	[64+esp],xmm6
++	movdqa	[80+esp],xmm7
++	movups	xmm0,[ecx*1+edx-48]
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	movdqu	xmm5,[48+esi]
++	movdqu	xmm6,[64+esi]
++	movdqu	xmm7,[80+esi]
++	lea	esi,[96+esi]
++	movdqa	[96+esp],xmm1
++	pxor	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm0
++	pxor	xmm7,xmm0
++	movups	xmm1,[ecx*1+edx-32]
++	pxor	xmm2,[esp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,[64+esp]
++	pxor	xmm7,[80+esp]
++	movups	xmm0,[ecx*1+edx-16]
++db	102,15,56,222,209
++db	102,15,56,222,217
++db	102,15,56,222,225
++db	102,15,56,222,233
++db	102,15,56,222,241
++db	102,15,56,222,249
++	mov	edi,DWORD [120+esp]
++	mov	eax,DWORD [124+esp]
++	call	L$_aesni_decrypt6_enter
++	movdqa	xmm0,[80+esp]
++	pxor	xmm2,[esp]
++	movdqa	xmm1,[96+esp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,[64+esp]
++	pxor	xmm7,xmm0
++	pxor	xmm1,xmm2
++	movdqu	[esi*1+edi-96],xmm2
++	pxor	xmm1,xmm3
++	movdqu	[esi*1+edi-80],xmm3
++	pxor	xmm1,xmm4
++	movdqu	[esi*1+edi-64],xmm4
++	pxor	xmm1,xmm5
++	movdqu	[esi*1+edi-48],xmm5
++	pxor	xmm1,xmm6
++	movdqu	[esi*1+edi-32],xmm6
++	pxor	xmm1,xmm7
++	movdqu	[esi*1+edi-16],xmm7
++	cmp	esi,eax
++	jb	NEAR L$087grandloop
++L$086short:
++	add	eax,96
++	sub	eax,esi
++	jz	NEAR L$088done
++	cmp	eax,32
++	jb	NEAR L$089one
++	je	NEAR L$090two
++	cmp	eax,64
++	jb	NEAR L$091three
++	je	NEAR L$092four
++	lea	ecx,[1+ebp]
++	lea	eax,[3+ebp]
++	bsf	ecx,ecx
++	bsf	eax,eax
++	shl	ecx,4
++	shl	eax,4
++	movdqu	xmm2,[ebx]
++	movdqu	xmm3,[ecx*1+ebx]
++	mov	ecx,DWORD [116+esp]
++	movdqa	xmm4,xmm2
++	movdqu	xmm5,[eax*1+ebx]
++	movdqa	xmm6,xmm2
++	pxor	xmm2,xmm0
++	pxor	xmm3,xmm2
++	movdqa	[esp],xmm2
++	pxor	xmm4,xmm3
++	movdqa	[16+esp],xmm3
++	pxor	xmm5,xmm4
++	movdqa	[32+esp],xmm4
++	pxor	xmm6,xmm5
++	movdqa	[48+esp],xmm5
++	pxor	xmm7,xmm6
++	movdqa	[64+esp],xmm6
++	movups	xmm0,[ecx*1+edx-48]
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	movdqu	xmm5,[48+esi]
++	movdqu	xmm6,[64+esi]
++	pxor	xmm7,xmm7
++	movdqa	[96+esp],xmm1
++	pxor	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm0
++	movups	xmm1,[ecx*1+edx-32]
++	pxor	xmm2,[esp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,[64+esp]
++	movups	xmm0,[ecx*1+edx-16]
++db	102,15,56,222,209
++db	102,15,56,222,217
++db	102,15,56,222,225
++db	102,15,56,222,233
++db	102,15,56,222,241
++db	102,15,56,222,249
++	mov	edi,DWORD [120+esp]
++	call	L$_aesni_decrypt6_enter
++	movdqa	xmm0,[64+esp]
++	pxor	xmm2,[esp]
++	movdqa	xmm1,[96+esp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,[32+esp]
++	pxor	xmm5,[48+esp]
++	pxor	xmm6,xmm0
++	pxor	xmm1,xmm2
++	movdqu	[esi*1+edi],xmm2
++	pxor	xmm1,xmm3
++	movdqu	[16+esi*1+edi],xmm3
++	pxor	xmm1,xmm4
++	movdqu	[32+esi*1+edi],xmm4
++	pxor	xmm1,xmm5
++	movdqu	[48+esi*1+edi],xmm5
++	pxor	xmm1,xmm6
++	movdqu	[64+esi*1+edi],xmm6
++	jmp	NEAR L$088done
++align	16
++L$089one:
++	movdqu	xmm7,[ebx]
++	mov	edx,DWORD [112+esp]
++	movdqu	xmm2,[esi]
++	mov	ecx,DWORD [240+edx]
++	pxor	xmm7,xmm0
++	pxor	xmm2,xmm7
++	movdqa	xmm6,xmm1
++	mov	edi,DWORD [120+esp]
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$093dec1_loop_18:
++db	102,15,56,222,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$093dec1_loop_18
++db	102,15,56,223,209
++	xorps	xmm2,xmm7
++	movaps	xmm1,xmm6
++	movdqa	xmm0,xmm7
++	xorps	xmm1,xmm2
++	movups	[esi*1+edi],xmm2
++	jmp	NEAR L$088done
++align	16
++L$090two:
++	lea	ecx,[1+ebp]
++	mov	edx,DWORD [112+esp]
++	bsf	ecx,ecx
++	shl	ecx,4
++	movdqu	xmm6,[ebx]
++	movdqu	xmm7,[ecx*1+ebx]
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	mov	ecx,DWORD [240+edx]
++	movdqa	xmm5,xmm1
++	pxor	xmm6,xmm0
++	pxor	xmm7,xmm6
++	pxor	xmm2,xmm6
++	pxor	xmm3,xmm7
++	mov	edi,DWORD [120+esp]
++	call	__aesni_decrypt2
++	xorps	xmm2,xmm6
++	xorps	xmm3,xmm7
++	movdqa	xmm0,xmm7
++	xorps	xmm5,xmm2
++	movups	[esi*1+edi],xmm2
++	xorps	xmm5,xmm3
++	movups	[16+esi*1+edi],xmm3
++	movaps	xmm1,xmm5
++	jmp	NEAR L$088done
++align	16
++L$091three:
++	lea	ecx,[1+ebp]
++	mov	edx,DWORD [112+esp]
++	bsf	ecx,ecx
++	shl	ecx,4
++	movdqu	xmm5,[ebx]
++	movdqu	xmm6,[ecx*1+ebx]
++	movdqa	xmm7,xmm5
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	mov	ecx,DWORD [240+edx]
++	movdqa	[96+esp],xmm1
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm5
++	pxor	xmm7,xmm6
++	pxor	xmm2,xmm5
++	pxor	xmm3,xmm6
++	pxor	xmm4,xmm7
++	mov	edi,DWORD [120+esp]
++	call	__aesni_decrypt3
++	movdqa	xmm1,[96+esp]
++	xorps	xmm2,xmm5
++	xorps	xmm3,xmm6
++	xorps	xmm4,xmm7
++	movups	[esi*1+edi],xmm2
++	pxor	xmm1,xmm2
++	movdqa	xmm0,xmm7
++	movups	[16+esi*1+edi],xmm3
++	pxor	xmm1,xmm3
++	movups	[32+esi*1+edi],xmm4
++	pxor	xmm1,xmm4
++	jmp	NEAR L$088done
++align	16
++L$092four:
++	lea	ecx,[1+ebp]
++	lea	eax,[3+ebp]
++	bsf	ecx,ecx
++	bsf	eax,eax
++	mov	edx,DWORD [112+esp]
++	shl	ecx,4
++	shl	eax,4
++	movdqu	xmm4,[ebx]
++	movdqu	xmm5,[ecx*1+ebx]
++	movdqa	xmm6,xmm4
++	movdqu	xmm7,[eax*1+ebx]
++	pxor	xmm4,xmm0
++	movdqu	xmm2,[esi]
++	pxor	xmm5,xmm4
++	movdqu	xmm3,[16+esi]
++	pxor	xmm6,xmm5
++	movdqa	[esp],xmm4
++	pxor	xmm7,xmm6
++	movdqa	[16+esp],xmm5
++	movdqu	xmm4,[32+esi]
++	movdqu	xmm5,[48+esi]
++	mov	ecx,DWORD [240+edx]
++	movdqa	[96+esp],xmm1
++	pxor	xmm2,[esp]
++	pxor	xmm3,[16+esp]
++	pxor	xmm4,xmm6
++	pxor	xmm5,xmm7
++	mov	edi,DWORD [120+esp]
++	call	__aesni_decrypt4
++	movdqa	xmm1,[96+esp]
++	xorps	xmm2,[esp]
++	xorps	xmm3,[16+esp]
++	xorps	xmm4,xmm6
++	movups	[esi*1+edi],xmm2
++	pxor	xmm1,xmm2
++	xorps	xmm5,xmm7
++	movups	[16+esi*1+edi],xmm3
++	pxor	xmm1,xmm3
++	movdqa	xmm0,xmm7
++	movups	[32+esi*1+edi],xmm4
++	pxor	xmm1,xmm4
++	movups	[48+esi*1+edi],xmm5
++	pxor	xmm1,xmm5
++L$088done:
++	mov	edx,DWORD [128+esp]
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	movdqa	[esp],xmm2
++	pxor	xmm4,xmm4
++	movdqa	[16+esp],xmm2
++	pxor	xmm5,xmm5
++	movdqa	[32+esp],xmm2
++	pxor	xmm6,xmm6
++	movdqa	[48+esp],xmm2
++	pxor	xmm7,xmm7
++	movdqa	[64+esp],xmm2
++	movdqa	[80+esp],xmm2
++	movdqa	[96+esp],xmm2
++	lea	esp,[edx]
++	mov	ecx,DWORD [40+esp]
++	mov	ebx,DWORD [48+esp]
++	movdqu	[ecx],xmm0
++	pxor	xmm0,xmm0
++	movdqu	[ebx],xmm1
++	pxor	xmm1,xmm1
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_aesni_cbc_encrypt
++align	16
++_aesni_cbc_encrypt:
++L$_aesni_cbc_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	esi,DWORD [20+esp]
++	mov	ebx,esp
++	mov	edi,DWORD [24+esp]
++	sub	ebx,24
++	mov	eax,DWORD [28+esp]
++	and	ebx,-16
++	mov	edx,DWORD [32+esp]
++	mov	ebp,DWORD [36+esp]
++	test	eax,eax
++	jz	NEAR L$094cbc_abort
++	cmp	DWORD [40+esp],0
++	xchg	ebx,esp
++	movups	xmm7,[ebp]
++	mov	ecx,DWORD [240+edx]
++	mov	ebp,edx
++	mov	DWORD [16+esp],ebx
++	mov	ebx,ecx
++	je	NEAR L$095cbc_decrypt
++	movaps	xmm2,xmm7
++	cmp	eax,16
++	jb	NEAR L$096cbc_enc_tail
++	sub	eax,16
++	jmp	NEAR L$097cbc_enc_loop
++align	16
++L$097cbc_enc_loop:
++	movups	xmm7,[esi]
++	lea	esi,[16+esi]
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	xorps	xmm7,xmm0
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm7
++L$098enc1_loop_19:
++db	102,15,56,220,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$098enc1_loop_19
++db	102,15,56,221,209
++	mov	ecx,ebx
++	mov	edx,ebp
++	movups	[edi],xmm2
++	lea	edi,[16+edi]
++	sub	eax,16
++	jnc	NEAR L$097cbc_enc_loop
++	add	eax,16
++	jnz	NEAR L$096cbc_enc_tail
++	movaps	xmm7,xmm2
++	pxor	xmm2,xmm2
++	jmp	NEAR L$099cbc_ret
++L$096cbc_enc_tail:
++	mov	ecx,eax
++dd	2767451785
++	mov	ecx,16
++	sub	ecx,eax
++	xor	eax,eax
++dd	2868115081
++	lea	edi,[edi-16]
++	mov	ecx,ebx
++	mov	esi,edi
++	mov	edx,ebp
++	jmp	NEAR L$097cbc_enc_loop
++align	16
++L$095cbc_decrypt:
++	cmp	eax,80
++	jbe	NEAR L$100cbc_dec_tail
++	movaps	[esp],xmm7
++	sub	eax,80
++	jmp	NEAR L$101cbc_dec_loop6_enter
++align	16
++L$102cbc_dec_loop6:
++	movaps	[esp],xmm0
++	movups	[edi],xmm7
++	lea	edi,[16+edi]
++L$101cbc_dec_loop6_enter:
++	movdqu	xmm2,[esi]
++	movdqu	xmm3,[16+esi]
++	movdqu	xmm4,[32+esi]
++	movdqu	xmm5,[48+esi]
++	movdqu	xmm6,[64+esi]
++	movdqu	xmm7,[80+esi]
++	call	__aesni_decrypt6
++	movups	xmm1,[esi]
++	movups	xmm0,[16+esi]
++	xorps	xmm2,[esp]
++	xorps	xmm3,xmm1
++	movups	xmm1,[32+esi]
++	xorps	xmm4,xmm0
++	movups	xmm0,[48+esi]
++	xorps	xmm5,xmm1
++	movups	xmm1,[64+esi]
++	xorps	xmm6,xmm0
++	movups	xmm0,[80+esi]
++	xorps	xmm7,xmm1
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	lea	esi,[96+esi]
++	movups	[32+edi],xmm4
++	mov	ecx,ebx
++	movups	[48+edi],xmm5
++	mov	edx,ebp
++	movups	[64+edi],xmm6
++	lea	edi,[80+edi]
++	sub	eax,96
++	ja	NEAR L$102cbc_dec_loop6
++	movaps	xmm2,xmm7
++	movaps	xmm7,xmm0
++	add	eax,80
++	jle	NEAR L$103cbc_dec_clear_tail_collected
++	movups	[edi],xmm2
++	lea	edi,[16+edi]
++L$100cbc_dec_tail:
++	movups	xmm2,[esi]
++	movaps	xmm6,xmm2
++	cmp	eax,16
++	jbe	NEAR L$104cbc_dec_one
++	movups	xmm3,[16+esi]
++	movaps	xmm5,xmm3
++	cmp	eax,32
++	jbe	NEAR L$105cbc_dec_two
++	movups	xmm4,[32+esi]
++	cmp	eax,48
++	jbe	NEAR L$106cbc_dec_three
++	movups	xmm5,[48+esi]
++	cmp	eax,64
++	jbe	NEAR L$107cbc_dec_four
++	movups	xmm6,[64+esi]
++	movaps	[esp],xmm7
++	movups	xmm2,[esi]
++	xorps	xmm7,xmm7
++	call	__aesni_decrypt6
++	movups	xmm1,[esi]
++	movups	xmm0,[16+esi]
++	xorps	xmm2,[esp]
++	xorps	xmm3,xmm1
++	movups	xmm1,[32+esi]
++	xorps	xmm4,xmm0
++	movups	xmm0,[48+esi]
++	xorps	xmm5,xmm1
++	movups	xmm7,[64+esi]
++	xorps	xmm6,xmm0
++	movups	[edi],xmm2
++	movups	[16+edi],xmm3
++	pxor	xmm3,xmm3
++	movups	[32+edi],xmm4
++	pxor	xmm4,xmm4
++	movups	[48+edi],xmm5
++	pxor	xmm5,xmm5
++	lea	edi,[64+edi]
++	movaps	xmm2,xmm6
++	pxor	xmm6,xmm6
++	sub	eax,80
++	jmp	NEAR L$108cbc_dec_tail_collected
++align	16
++L$104cbc_dec_one:
++	movups	xmm0,[edx]
++	movups	xmm1,[16+edx]
++	lea	edx,[32+edx]
++	xorps	xmm2,xmm0
++L$109dec1_loop_20:
++db	102,15,56,222,209
++	dec	ecx
++	movups	xmm1,[edx]
++	lea	edx,[16+edx]
++	jnz	NEAR L$109dec1_loop_20
++db	102,15,56,223,209
++	xorps	xmm2,xmm7
++	movaps	xmm7,xmm6
++	sub	eax,16
++	jmp	NEAR L$108cbc_dec_tail_collected
++align	16
++L$105cbc_dec_two:
++	call	__aesni_decrypt2
++	xorps	xmm2,xmm7
++	xorps	xmm3,xmm6
++	movups	[edi],xmm2
++	movaps	xmm2,xmm3
++	pxor	xmm3,xmm3
++	lea	edi,[16+edi]
++	movaps	xmm7,xmm5
++	sub	eax,32
++	jmp	NEAR L$108cbc_dec_tail_collected
++align	16
++L$106cbc_dec_three:
++	call	__aesni_decrypt3
++	xorps	xmm2,xmm7
++	xorps	xmm3,xmm6
++	xorps	xmm4,xmm5
++	movups	[edi],xmm2
++	movaps	xmm2,xmm4
++	pxor	xmm4,xmm4
++	movups	[16+edi],xmm3
++	pxor	xmm3,xmm3
++	lea	edi,[32+edi]
++	movups	xmm7,[32+esi]
++	sub	eax,48
++	jmp	NEAR L$108cbc_dec_tail_collected
++align	16
++L$107cbc_dec_four:
++	call	__aesni_decrypt4
++	movups	xmm1,[16+esi]
++	movups	xmm0,[32+esi]
++	xorps	xmm2,xmm7
++	movups	xmm7,[48+esi]
++	xorps	xmm3,xmm6
++	movups	[edi],xmm2
++	xorps	xmm4,xmm1
++	movups	[16+edi],xmm3
++	pxor	xmm3,xmm3
++	xorps	xmm5,xmm0
++	movups	[32+edi],xmm4
++	pxor	xmm4,xmm4
++	lea	edi,[48+edi]
++	movaps	xmm2,xmm5
++	pxor	xmm5,xmm5
++	sub	eax,64
++	jmp	NEAR L$108cbc_dec_tail_collected
++align	16
++L$103cbc_dec_clear_tail_collected:
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	pxor	xmm6,xmm6
++L$108cbc_dec_tail_collected:
++	and	eax,15
++	jnz	NEAR L$110cbc_dec_tail_partial
++	movups	[edi],xmm2
++	pxor	xmm0,xmm0
++	jmp	NEAR L$099cbc_ret
++align	16
++L$110cbc_dec_tail_partial:
++	movaps	[esp],xmm2
++	pxor	xmm0,xmm0
++	mov	ecx,16
++	mov	esi,esp
++	sub	ecx,eax
++dd	2767451785
++	movdqa	[esp],xmm2
++L$099cbc_ret:
++	mov	esp,DWORD [16+esp]
++	mov	ebp,DWORD [36+esp]
++	pxor	xmm2,xmm2
++	pxor	xmm1,xmm1
++	movups	[ebp],xmm7
++	pxor	xmm7,xmm7
++L$094cbc_abort:
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++align	16
++__aesni_set_encrypt_key:
++	push	ebp
++	push	ebx
++	test	eax,eax
++	jz	NEAR L$111bad_pointer
++	test	edx,edx
++	jz	NEAR L$111bad_pointer
++	call	L$112pic
++L$112pic:
++	pop	ebx
++	lea	ebx,[(L$key_const-L$112pic)+ebx]
++	lea	ebp,[__gnutls_x86_cpuid_s]
++	movups	xmm0,[eax]
++	xorps	xmm4,xmm4
++	mov	ebp,DWORD [4+ebp]
++	lea	edx,[16+edx]
++	and	ebp,268437504
++	cmp	ecx,256
++	je	NEAR L$11314rounds
++	cmp	ecx,192
++	je	NEAR L$11412rounds
++	cmp	ecx,128
++	jne	NEAR L$115bad_keybits
++align	16
++L$11610rounds:
++	cmp	ebp,268435456
++	je	NEAR L$11710rounds_alt
++	mov	ecx,9
++	movups	[edx-16],xmm0
++db	102,15,58,223,200,1
++	call	L$118key_128_cold
++db	102,15,58,223,200,2
++	call	L$119key_128
++db	102,15,58,223,200,4
++	call	L$119key_128
++db	102,15,58,223,200,8
++	call	L$119key_128
++db	102,15,58,223,200,16
++	call	L$119key_128
++db	102,15,58,223,200,32
++	call	L$119key_128
++db	102,15,58,223,200,64
++	call	L$119key_128
++db	102,15,58,223,200,128
++	call	L$119key_128
++db	102,15,58,223,200,27
++	call	L$119key_128
++db	102,15,58,223,200,54
++	call	L$119key_128
++	movups	[edx],xmm0
++	mov	DWORD [80+edx],ecx
++	jmp	NEAR L$120good_key
++align	16
++L$119key_128:
++	movups	[edx],xmm0
++	lea	edx,[16+edx]
++L$118key_128_cold:
++	shufps	xmm4,xmm0,16
++	xorps	xmm0,xmm4
++	shufps	xmm4,xmm0,140
++	xorps	xmm0,xmm4
++	shufps	xmm1,xmm1,255
++	xorps	xmm0,xmm1
++	ret
++align	16
++L$11710rounds_alt:
++	movdqa	xmm5,[ebx]
++	mov	ecx,8
++	movdqa	xmm4,[32+ebx]
++	movdqa	xmm2,xmm0
++	movdqu	[edx-16],xmm0
++L$121loop_key128:
++db	102,15,56,0,197
++db	102,15,56,221,196
++	pslld	xmm4,1
++	lea	edx,[16+edx]
++	movdqa	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm2,xmm3
++	pxor	xmm0,xmm2
++	movdqu	[edx-16],xmm0
++	movdqa	xmm2,xmm0
++	dec	ecx
++	jnz	NEAR L$121loop_key128
++	movdqa	xmm4,[48+ebx]
++db	102,15,56,0,197
++db	102,15,56,221,196
++	pslld	xmm4,1
++	movdqa	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm2,xmm3
++	pxor	xmm0,xmm2
++	movdqu	[edx],xmm0
++	movdqa	xmm2,xmm0
++db	102,15,56,0,197
++db	102,15,56,221,196
++	movdqa	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm2,xmm3
++	pxor	xmm0,xmm2
++	movdqu	[16+edx],xmm0
++	mov	ecx,9
++	mov	DWORD [96+edx],ecx
++	jmp	NEAR L$120good_key
++align	16
++L$11412rounds:
++	movq	xmm2,[16+eax]
++	cmp	ebp,268435456
++	je	NEAR L$12212rounds_alt
++	mov	ecx,11
++	movups	[edx-16],xmm0
++db	102,15,58,223,202,1
++	call	L$123key_192a_cold
++db	102,15,58,223,202,2
++	call	L$124key_192b
++db	102,15,58,223,202,4
++	call	L$125key_192a
++db	102,15,58,223,202,8
++	call	L$124key_192b
++db	102,15,58,223,202,16
++	call	L$125key_192a
++db	102,15,58,223,202,32
++	call	L$124key_192b
++db	102,15,58,223,202,64
++	call	L$125key_192a
++db	102,15,58,223,202,128
++	call	L$124key_192b
++	movups	[edx],xmm0
++	mov	DWORD [48+edx],ecx
++	jmp	NEAR L$120good_key
++align	16
++L$125key_192a:
++	movups	[edx],xmm0
++	lea	edx,[16+edx]
++align	16
++L$123key_192a_cold:
++	movaps	xmm5,xmm2
++L$126key_192b_warm:
++	shufps	xmm4,xmm0,16
++	movdqa	xmm3,xmm2
++	xorps	xmm0,xmm4
++	shufps	xmm4,xmm0,140
++	pslldq	xmm3,4
++	xorps	xmm0,xmm4
++	pshufd	xmm1,xmm1,85
++	pxor	xmm2,xmm3
++	pxor	xmm0,xmm1
++	pshufd	xmm3,xmm0,255
++	pxor	xmm2,xmm3
++	ret
++align	16
++L$124key_192b:
++	movaps	xmm3,xmm0
++	shufps	xmm5,xmm0,68
++	movups	[edx],xmm5
++	shufps	xmm3,xmm2,78
++	movups	[16+edx],xmm3
++	lea	edx,[32+edx]
++	jmp	NEAR L$126key_192b_warm
++align	16
++L$12212rounds_alt:
++	movdqa	xmm5,[16+ebx]
++	movdqa	xmm4,[32+ebx]
++	mov	ecx,8
++	movdqu	[edx-16],xmm0
++L$127loop_key192:
++	movq	[edx],xmm2
++	movdqa	xmm1,xmm2
++db	102,15,56,0,213
++db	102,15,56,221,212
++	pslld	xmm4,1
++	lea	edx,[24+edx]
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm0,xmm3
++	pshufd	xmm3,xmm0,255
++	pxor	xmm3,xmm1
++	pslldq	xmm1,4
++	pxor	xmm3,xmm1
++	pxor	xmm0,xmm2
++	pxor	xmm2,xmm3
++	movdqu	[edx-16],xmm0
++	dec	ecx
++	jnz	NEAR L$127loop_key192
++	mov	ecx,11
++	mov	DWORD [32+edx],ecx
++	jmp	NEAR L$120good_key
++align	16
++L$11314rounds:
++	movups	xmm2,[16+eax]
++	lea	edx,[16+edx]
++	cmp	ebp,268435456
++	je	NEAR L$12814rounds_alt
++	mov	ecx,13
++	movups	[edx-32],xmm0
++	movups	[edx-16],xmm2
++db	102,15,58,223,202,1
++	call	L$129key_256a_cold
++db	102,15,58,223,200,1
++	call	L$130key_256b
++db	102,15,58,223,202,2
++	call	L$131key_256a
++db	102,15,58,223,200,2
++	call	L$130key_256b
++db	102,15,58,223,202,4
++	call	L$131key_256a
++db	102,15,58,223,200,4
++	call	L$130key_256b
++db	102,15,58,223,202,8
++	call	L$131key_256a
++db	102,15,58,223,200,8
++	call	L$130key_256b
++db	102,15,58,223,202,16
++	call	L$131key_256a
++db	102,15,58,223,200,16
++	call	L$130key_256b
++db	102,15,58,223,202,32
++	call	L$131key_256a
++db	102,15,58,223,200,32
++	call	L$130key_256b
++db	102,15,58,223,202,64
++	call	L$131key_256a
++	movups	[edx],xmm0
++	mov	DWORD [16+edx],ecx
++	xor	eax,eax
++	jmp	NEAR L$120good_key
++align	16
++L$131key_256a:
++	movups	[edx],xmm2
++	lea	edx,[16+edx]
++L$129key_256a_cold:
++	shufps	xmm4,xmm0,16
++	xorps	xmm0,xmm4
++	shufps	xmm4,xmm0,140
++	xorps	xmm0,xmm4
++	shufps	xmm1,xmm1,255
++	xorps	xmm0,xmm1
++	ret
++align	16
++L$130key_256b:
++	movups	[edx],xmm0
++	lea	edx,[16+edx]
++	shufps	xmm4,xmm2,16
++	xorps	xmm2,xmm4
++	shufps	xmm4,xmm2,140
++	xorps	xmm2,xmm4
++	shufps	xmm1,xmm1,170
++	xorps	xmm2,xmm1
++	ret
++align	16
++L$12814rounds_alt:
++	movdqa	xmm5,[ebx]
++	movdqa	xmm4,[32+ebx]
++	mov	ecx,7
++	movdqu	[edx-32],xmm0
++	movdqa	xmm1,xmm2
++	movdqu	[edx-16],xmm2
++L$132loop_key256:
++db	102,15,56,0,213
++db	102,15,56,221,212
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm0,xmm3
++	pslld	xmm4,1
++	pxor	xmm0,xmm2
++	movdqu	[edx],xmm0
++	dec	ecx
++	jz	NEAR L$133done_key256
++	pshufd	xmm2,xmm0,255
++	pxor	xmm3,xmm3
++db	102,15,56,221,211
++	movdqa	xmm3,xmm1
++	pslldq	xmm1,4
++	pxor	xmm3,xmm1
++	pslldq	xmm1,4
++	pxor	xmm3,xmm1
++	pslldq	xmm1,4
++	pxor	xmm1,xmm3
++	pxor	xmm2,xmm1
++	movdqu	[16+edx],xmm2
++	lea	edx,[32+edx]
++	movdqa	xmm1,xmm2
++	jmp	NEAR L$132loop_key256
++L$133done_key256:
++	mov	ecx,13
++	mov	DWORD [16+edx],ecx
++L$120good_key:
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	xor	eax,eax
++	pop	ebx
++	pop	ebp
++	ret
++align	4
++L$111bad_pointer:
++	mov	eax,-1
++	pop	ebx
++	pop	ebp
++	ret
++align	4
++L$115bad_keybits:
++	pxor	xmm0,xmm0
++	mov	eax,-2
++	pop	ebx
++	pop	ebp
++	ret
++global	_aesni_set_encrypt_key
++align	16
++_aesni_set_encrypt_key:
++L$_aesni_set_encrypt_key_begin:
++	mov	eax,DWORD [4+esp]
++	mov	ecx,DWORD [8+esp]
++	mov	edx,DWORD [12+esp]
++	call	__aesni_set_encrypt_key
++	ret
++global	_aesni_set_decrypt_key
++align	16
++_aesni_set_decrypt_key:
++L$_aesni_set_decrypt_key_begin:
++	mov	eax,DWORD [4+esp]
++	mov	ecx,DWORD [8+esp]
++	mov	edx,DWORD [12+esp]
++	call	__aesni_set_encrypt_key
++	mov	edx,DWORD [12+esp]
++	shl	ecx,4
++	test	eax,eax
++	jnz	NEAR L$134dec_key_ret
++	lea	eax,[16+ecx*1+edx]
++	movups	xmm0,[edx]
++	movups	xmm1,[eax]
++	movups	[eax],xmm0
++	movups	[edx],xmm1
++	lea	edx,[16+edx]
++	lea	eax,[eax-16]
++L$135dec_key_inverse:
++	movups	xmm0,[edx]
++	movups	xmm1,[eax]
++db	102,15,56,219,192
++db	102,15,56,219,201
++	lea	edx,[16+edx]
++	lea	eax,[eax-16]
++	movups	[16+eax],xmm0
++	movups	[edx-16],xmm1
++	cmp	eax,edx
++	ja	NEAR L$135dec_key_inverse
++	movups	xmm0,[edx]
++db	102,15,56,219,192
++	movups	[edx],xmm0
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	xor	eax,eax
++L$134dec_key_ret:
++	ret
++align	64
++L$key_const:
++dd	202313229,202313229,202313229,202313229
++dd	67569157,67569157,67569157,67569157
++dd	1,1,1,1
++dd	27,27,27,27
++db	65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69
++db	83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83
++db	32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115
++db	115,108,46,111,114,103,62,0
++segment	.bss
++common	__gnutls_x86_cpuid_s 16
+diff --git a/SMP/lib/accelerated/x86/coff/aesni-x86_64.asm b/SMP/lib/accelerated/x86/coff/aesni-x86_64.asm
+new file mode 100644
+index 0000000..021b735
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/aesni-x86_64.asm
+@@ -0,0 +1,4994 @@
++default	rel
++%define XMMWORD
++%define YMMWORD
++%define ZMMWORD
++section	.text code align=64
++
++EXTERN	_gnutls_x86_cpuid_s
++global	aesni_encrypt
++
++ALIGN	16
++aesni_encrypt:
++	movups	xmm2,XMMWORD[rcx]
++	mov	eax,DWORD[240+r8]
++	movups	xmm0,XMMWORD[r8]
++	movups	xmm1,XMMWORD[16+r8]
++	lea	r8,[32+r8]
++	xorps	xmm2,xmm0
++$L$oop_enc1_1:
++DB	102,15,56,220,209
++	dec	eax
++	movups	xmm1,XMMWORD[r8]
++	lea	r8,[16+r8]
++	jnz	NEAR $L$oop_enc1_1
++DB	102,15,56,221,209
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	movups	XMMWORD[rdx],xmm2
++	pxor	xmm2,xmm2
++	DB	0F3h,0C3h		;repret
++
++
++global	aesni_decrypt
++
++ALIGN	16
++aesni_decrypt:
++	movups	xmm2,XMMWORD[rcx]
++	mov	eax,DWORD[240+r8]
++	movups	xmm0,XMMWORD[r8]
++	movups	xmm1,XMMWORD[16+r8]
++	lea	r8,[32+r8]
++	xorps	xmm2,xmm0
++$L$oop_dec1_2:
++DB	102,15,56,222,209
++	dec	eax
++	movups	xmm1,XMMWORD[r8]
++	lea	r8,[16+r8]
++	jnz	NEAR $L$oop_dec1_2
++DB	102,15,56,223,209
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	movups	XMMWORD[rdx],xmm2
++	pxor	xmm2,xmm2
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_encrypt2:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm0
++	movups	xmm0,XMMWORD[32+rcx]
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++	add	rax,16
++
++$L$enc_loop2:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$enc_loop2
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,221,208
++DB	102,15,56,221,216
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_decrypt2:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm0
++	movups	xmm0,XMMWORD[32+rcx]
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++	add	rax,16
++
++$L$dec_loop2:
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$dec_loop2
++
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,223,208
++DB	102,15,56,223,216
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_encrypt3:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm0
++	xorps	xmm4,xmm0
++	movups	xmm0,XMMWORD[32+rcx]
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++	add	rax,16
++
++$L$enc_loop3:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$enc_loop3
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,221,208
++DB	102,15,56,221,216
++DB	102,15,56,221,224
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_decrypt3:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm0
++	xorps	xmm4,xmm0
++	movups	xmm0,XMMWORD[32+rcx]
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++	add	rax,16
++
++$L$dec_loop3:
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$dec_loop3
++
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,223,208
++DB	102,15,56,223,216
++DB	102,15,56,223,224
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_encrypt4:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm0
++	xorps	xmm4,xmm0
++	xorps	xmm5,xmm0
++	movups	xmm0,XMMWORD[32+rcx]
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++DB	0x0f,0x1f,0x00
++	add	rax,16
++
++$L$enc_loop4:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$enc_loop4
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,221,208
++DB	102,15,56,221,216
++DB	102,15,56,221,224
++DB	102,15,56,221,232
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_decrypt4:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm0
++	xorps	xmm4,xmm0
++	xorps	xmm5,xmm0
++	movups	xmm0,XMMWORD[32+rcx]
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++DB	0x0f,0x1f,0x00
++	add	rax,16
++
++$L$dec_loop4:
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$dec_loop4
++
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,223,208
++DB	102,15,56,223,216
++DB	102,15,56,223,224
++DB	102,15,56,223,232
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_encrypt6:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++DB	102,15,56,220,209
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++DB	102,15,56,220,217
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm0
++DB	102,15,56,220,225
++	pxor	xmm7,xmm0
++	movups	xmm0,XMMWORD[rax*1+rcx]
++	add	rax,16
++	jmp	NEAR $L$enc_loop6_enter
++ALIGN	16
++$L$enc_loop6:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++$L$enc_loop6_enter:
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$enc_loop6
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,15,56,221,208
++DB	102,15,56,221,216
++DB	102,15,56,221,224
++DB	102,15,56,221,232
++DB	102,15,56,221,240
++DB	102,15,56,221,248
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_decrypt6:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	pxor	xmm3,xmm0
++	pxor	xmm4,xmm0
++DB	102,15,56,222,209
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++DB	102,15,56,222,217
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm0
++DB	102,15,56,222,225
++	pxor	xmm7,xmm0
++	movups	xmm0,XMMWORD[rax*1+rcx]
++	add	rax,16
++	jmp	NEAR $L$dec_loop6_enter
++ALIGN	16
++$L$dec_loop6:
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++$L$dec_loop6_enter:
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$dec_loop6
++
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++DB	102,15,56,223,208
++DB	102,15,56,223,216
++DB	102,15,56,223,224
++DB	102,15,56,223,232
++DB	102,15,56,223,240
++DB	102,15,56,223,248
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_encrypt8:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm0
++	pxor	xmm4,xmm0
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm0
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++DB	102,15,56,220,209
++	pxor	xmm7,xmm0
++	pxor	xmm8,xmm0
++DB	102,15,56,220,217
++	pxor	xmm9,xmm0
++	movups	xmm0,XMMWORD[rax*1+rcx]
++	add	rax,16
++	jmp	NEAR $L$enc_loop8_inner
++ALIGN	16
++$L$enc_loop8:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++$L$enc_loop8_inner:
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++DB	102,68,15,56,220,201
++$L$enc_loop8_enter:
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++DB	102,68,15,56,220,192
++DB	102,68,15,56,220,200
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$enc_loop8
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++DB	102,68,15,56,220,201
++DB	102,15,56,221,208
++DB	102,15,56,221,216
++DB	102,15,56,221,224
++DB	102,15,56,221,232
++DB	102,15,56,221,240
++DB	102,15,56,221,248
++DB	102,68,15,56,221,192
++DB	102,68,15,56,221,200
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++_aesni_decrypt8:
++	movups	xmm0,XMMWORD[rcx]
++	shl	eax,4
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm0
++	pxor	xmm4,xmm0
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm0
++	lea	rcx,[32+rax*1+rcx]
++	neg	rax
++DB	102,15,56,222,209
++	pxor	xmm7,xmm0
++	pxor	xmm8,xmm0
++DB	102,15,56,222,217
++	pxor	xmm9,xmm0
++	movups	xmm0,XMMWORD[rax*1+rcx]
++	add	rax,16
++	jmp	NEAR $L$dec_loop8_inner
++ALIGN	16
++$L$dec_loop8:
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++$L$dec_loop8_inner:
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++DB	102,68,15,56,222,193
++DB	102,68,15,56,222,201
++$L$dec_loop8_enter:
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++DB	102,68,15,56,222,192
++DB	102,68,15,56,222,200
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$dec_loop8
++
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++DB	102,68,15,56,222,193
++DB	102,68,15,56,222,201
++DB	102,15,56,223,208
++DB	102,15,56,223,216
++DB	102,15,56,223,224
++DB	102,15,56,223,232
++DB	102,15,56,223,240
++DB	102,15,56,223,248
++DB	102,68,15,56,223,192
++DB	102,68,15,56,223,200
++	DB	0F3h,0C3h		;repret
++
++global	aesni_ecb_encrypt
++
++ALIGN	16
++aesni_ecb_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_ecb_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++
++
++	lea	rsp,[((-88))+rsp]
++	movaps	XMMWORD[rsp],xmm6
++	movaps	XMMWORD[16+rsp],xmm7
++	movaps	XMMWORD[32+rsp],xmm8
++	movaps	XMMWORD[48+rsp],xmm9
++$L$ecb_enc_body:
++	and	rdx,-16
++	jz	NEAR $L$ecb_ret
++
++	mov	eax,DWORD[240+rcx]
++	movups	xmm0,XMMWORD[rcx]
++	mov	r11,rcx
++	mov	r10d,eax
++	test	r8d,r8d
++	jz	NEAR $L$ecb_decrypt
++
++	cmp	rdx,0x80
++	jb	NEAR $L$ecb_enc_tail
++
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movdqu	xmm4,XMMWORD[32+rdi]
++	movdqu	xmm5,XMMWORD[48+rdi]
++	movdqu	xmm6,XMMWORD[64+rdi]
++	movdqu	xmm7,XMMWORD[80+rdi]
++	movdqu	xmm8,XMMWORD[96+rdi]
++	movdqu	xmm9,XMMWORD[112+rdi]
++	lea	rdi,[128+rdi]
++	sub	rdx,0x80
++	jmp	NEAR $L$ecb_enc_loop8_enter
++ALIGN	16
++$L$ecb_enc_loop8:
++	movups	XMMWORD[rsi],xmm2
++	mov	rcx,r11
++	movdqu	xmm2,XMMWORD[rdi]
++	mov	eax,r10d
++	movups	XMMWORD[16+rsi],xmm3
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movups	XMMWORD[32+rsi],xmm4
++	movdqu	xmm4,XMMWORD[32+rdi]
++	movups	XMMWORD[48+rsi],xmm5
++	movdqu	xmm5,XMMWORD[48+rdi]
++	movups	XMMWORD[64+rsi],xmm6
++	movdqu	xmm6,XMMWORD[64+rdi]
++	movups	XMMWORD[80+rsi],xmm7
++	movdqu	xmm7,XMMWORD[80+rdi]
++	movups	XMMWORD[96+rsi],xmm8
++	movdqu	xmm8,XMMWORD[96+rdi]
++	movups	XMMWORD[112+rsi],xmm9
++	lea	rsi,[128+rsi]
++	movdqu	xmm9,XMMWORD[112+rdi]
++	lea	rdi,[128+rdi]
++$L$ecb_enc_loop8_enter:
++
++	call	_aesni_encrypt8
++
++	sub	rdx,0x80
++	jnc	NEAR $L$ecb_enc_loop8
++
++	movups	XMMWORD[rsi],xmm2
++	mov	rcx,r11
++	movups	XMMWORD[16+rsi],xmm3
++	mov	eax,r10d
++	movups	XMMWORD[32+rsi],xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	movups	XMMWORD[80+rsi],xmm7
++	movups	XMMWORD[96+rsi],xmm8
++	movups	XMMWORD[112+rsi],xmm9
++	lea	rsi,[128+rsi]
++	add	rdx,0x80
++	jz	NEAR $L$ecb_ret
++
++$L$ecb_enc_tail:
++	movups	xmm2,XMMWORD[rdi]
++	cmp	rdx,0x20
++	jb	NEAR $L$ecb_enc_one
++	movups	xmm3,XMMWORD[16+rdi]
++	je	NEAR $L$ecb_enc_two
++	movups	xmm4,XMMWORD[32+rdi]
++	cmp	rdx,0x40
++	jb	NEAR $L$ecb_enc_three
++	movups	xmm5,XMMWORD[48+rdi]
++	je	NEAR $L$ecb_enc_four
++	movups	xmm6,XMMWORD[64+rdi]
++	cmp	rdx,0x60
++	jb	NEAR $L$ecb_enc_five
++	movups	xmm7,XMMWORD[80+rdi]
++	je	NEAR $L$ecb_enc_six
++	movdqu	xmm8,XMMWORD[96+rdi]
++	xorps	xmm9,xmm9
++	call	_aesni_encrypt8
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	movups	XMMWORD[80+rsi],xmm7
++	movups	XMMWORD[96+rsi],xmm8
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_enc_one:
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_enc1_3:
++DB	102,15,56,220,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_enc1_3
++DB	102,15,56,221,209
++	movups	XMMWORD[rsi],xmm2
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_enc_two:
++	call	_aesni_encrypt2
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_enc_three:
++	call	_aesni_encrypt3
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_enc_four:
++	call	_aesni_encrypt4
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_enc_five:
++	xorps	xmm7,xmm7
++	call	_aesni_encrypt6
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_enc_six:
++	call	_aesni_encrypt6
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	movups	XMMWORD[80+rsi],xmm7
++	jmp	NEAR $L$ecb_ret
++
++ALIGN	16
++$L$ecb_decrypt:
++	cmp	rdx,0x80
++	jb	NEAR $L$ecb_dec_tail
++
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movdqu	xmm4,XMMWORD[32+rdi]
++	movdqu	xmm5,XMMWORD[48+rdi]
++	movdqu	xmm6,XMMWORD[64+rdi]
++	movdqu	xmm7,XMMWORD[80+rdi]
++	movdqu	xmm8,XMMWORD[96+rdi]
++	movdqu	xmm9,XMMWORD[112+rdi]
++	lea	rdi,[128+rdi]
++	sub	rdx,0x80
++	jmp	NEAR $L$ecb_dec_loop8_enter
++ALIGN	16
++$L$ecb_dec_loop8:
++	movups	XMMWORD[rsi],xmm2
++	mov	rcx,r11
++	movdqu	xmm2,XMMWORD[rdi]
++	mov	eax,r10d
++	movups	XMMWORD[16+rsi],xmm3
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movups	XMMWORD[32+rsi],xmm4
++	movdqu	xmm4,XMMWORD[32+rdi]
++	movups	XMMWORD[48+rsi],xmm5
++	movdqu	xmm5,XMMWORD[48+rdi]
++	movups	XMMWORD[64+rsi],xmm6
++	movdqu	xmm6,XMMWORD[64+rdi]
++	movups	XMMWORD[80+rsi],xmm7
++	movdqu	xmm7,XMMWORD[80+rdi]
++	movups	XMMWORD[96+rsi],xmm8
++	movdqu	xmm8,XMMWORD[96+rdi]
++	movups	XMMWORD[112+rsi],xmm9
++	lea	rsi,[128+rsi]
++	movdqu	xmm9,XMMWORD[112+rdi]
++	lea	rdi,[128+rdi]
++$L$ecb_dec_loop8_enter:
++
++	call	_aesni_decrypt8
++
++	movups	xmm0,XMMWORD[r11]
++	sub	rdx,0x80
++	jnc	NEAR $L$ecb_dec_loop8
++
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	mov	rcx,r11
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	mov	eax,r10d
++	movups	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	pxor	xmm5,xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	pxor	xmm6,xmm6
++	movups	XMMWORD[80+rsi],xmm7
++	pxor	xmm7,xmm7
++	movups	XMMWORD[96+rsi],xmm8
++	pxor	xmm8,xmm8
++	movups	XMMWORD[112+rsi],xmm9
++	pxor	xmm9,xmm9
++	lea	rsi,[128+rsi]
++	add	rdx,0x80
++	jz	NEAR $L$ecb_ret
++
++$L$ecb_dec_tail:
++	movups	xmm2,XMMWORD[rdi]
++	cmp	rdx,0x20
++	jb	NEAR $L$ecb_dec_one
++	movups	xmm3,XMMWORD[16+rdi]
++	je	NEAR $L$ecb_dec_two
++	movups	xmm4,XMMWORD[32+rdi]
++	cmp	rdx,0x40
++	jb	NEAR $L$ecb_dec_three
++	movups	xmm5,XMMWORD[48+rdi]
++	je	NEAR $L$ecb_dec_four
++	movups	xmm6,XMMWORD[64+rdi]
++	cmp	rdx,0x60
++	jb	NEAR $L$ecb_dec_five
++	movups	xmm7,XMMWORD[80+rdi]
++	je	NEAR $L$ecb_dec_six
++	movups	xmm8,XMMWORD[96+rdi]
++	movups	xmm0,XMMWORD[rcx]
++	xorps	xmm9,xmm9
++	call	_aesni_decrypt8
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	pxor	xmm5,xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	pxor	xmm6,xmm6
++	movups	XMMWORD[80+rsi],xmm7
++	pxor	xmm7,xmm7
++	movups	XMMWORD[96+rsi],xmm8
++	pxor	xmm8,xmm8
++	pxor	xmm9,xmm9
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_dec_one:
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_dec1_4:
++DB	102,15,56,222,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_dec1_4
++DB	102,15,56,223,209
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_dec_two:
++	call	_aesni_decrypt2
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_dec_three:
++	call	_aesni_decrypt3
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_dec_four:
++	call	_aesni_decrypt4
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	pxor	xmm5,xmm5
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_dec_five:
++	xorps	xmm7,xmm7
++	call	_aesni_decrypt6
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	pxor	xmm5,xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	pxor	xmm6,xmm6
++	pxor	xmm7,xmm7
++	jmp	NEAR $L$ecb_ret
++ALIGN	16
++$L$ecb_dec_six:
++	call	_aesni_decrypt6
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	pxor	xmm5,xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	pxor	xmm6,xmm6
++	movups	XMMWORD[80+rsi],xmm7
++	pxor	xmm7,xmm7
++
++$L$ecb_ret:
++	xorps	xmm0,xmm0
++	pxor	xmm1,xmm1
++	movaps	xmm6,XMMWORD[rsp]
++	movaps	XMMWORD[rsp],xmm0
++	movaps	xmm7,XMMWORD[16+rsp]
++	movaps	XMMWORD[16+rsp],xmm0
++	movaps	xmm8,XMMWORD[32+rsp]
++	movaps	XMMWORD[32+rsp],xmm0
++	movaps	xmm9,XMMWORD[48+rsp]
++	movaps	XMMWORD[48+rsp],xmm0
++	lea	rsp,[88+rsp]
++$L$ecb_enc_ret:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_ecb_encrypt:
++global	aesni_ccm64_encrypt_blocks
++
++ALIGN	16
++aesni_ccm64_encrypt_blocks:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_ccm64_encrypt_blocks:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	lea	rsp,[((-88))+rsp]
++	movaps	XMMWORD[rsp],xmm6
++	movaps	XMMWORD[16+rsp],xmm7
++	movaps	XMMWORD[32+rsp],xmm8
++	movaps	XMMWORD[48+rsp],xmm9
++$L$ccm64_enc_body:
++	mov	eax,DWORD[240+rcx]
++	movdqu	xmm6,XMMWORD[r8]
++	movdqa	xmm9,XMMWORD[$L$increment64]
++	movdqa	xmm7,XMMWORD[$L$bswap_mask]
++
++	shl	eax,4
++	mov	r10d,16
++	lea	r11,[rcx]
++	movdqu	xmm3,XMMWORD[r9]
++	movdqa	xmm2,xmm6
++	lea	rcx,[32+rax*1+rcx]
++DB	102,15,56,0,247
++	sub	r10,rax
++	jmp	NEAR $L$ccm64_enc_outer
++ALIGN	16
++$L$ccm64_enc_outer:
++	movups	xmm0,XMMWORD[r11]
++	mov	rax,r10
++	movups	xmm8,XMMWORD[rdi]
++
++	xorps	xmm2,xmm0
++	movups	xmm1,XMMWORD[16+r11]
++	xorps	xmm0,xmm8
++	xorps	xmm3,xmm0
++	movups	xmm0,XMMWORD[32+r11]
++
++$L$ccm64_enc2_loop:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$ccm64_enc2_loop
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++	paddq	xmm6,xmm9
++	dec	rdx
++DB	102,15,56,221,208
++DB	102,15,56,221,216
++
++	lea	rdi,[16+rdi]
++	xorps	xmm8,xmm2
++	movdqa	xmm2,xmm6
++	movups	XMMWORD[rsi],xmm8
++DB	102,15,56,0,215
++	lea	rsi,[16+rsi]
++	jnz	NEAR $L$ccm64_enc_outer
++
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	movups	XMMWORD[r9],xmm3
++	pxor	xmm3,xmm3
++	pxor	xmm8,xmm8
++	pxor	xmm6,xmm6
++	movaps	xmm6,XMMWORD[rsp]
++	movaps	XMMWORD[rsp],xmm0
++	movaps	xmm7,XMMWORD[16+rsp]
++	movaps	XMMWORD[16+rsp],xmm0
++	movaps	xmm8,XMMWORD[32+rsp]
++	movaps	XMMWORD[32+rsp],xmm0
++	movaps	xmm9,XMMWORD[48+rsp]
++	movaps	XMMWORD[48+rsp],xmm0
++	lea	rsp,[88+rsp]
++$L$ccm64_enc_ret:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_ccm64_encrypt_blocks:
++global	aesni_ccm64_decrypt_blocks
++
++ALIGN	16
++aesni_ccm64_decrypt_blocks:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_ccm64_decrypt_blocks:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	lea	rsp,[((-88))+rsp]
++	movaps	XMMWORD[rsp],xmm6
++	movaps	XMMWORD[16+rsp],xmm7
++	movaps	XMMWORD[32+rsp],xmm8
++	movaps	XMMWORD[48+rsp],xmm9
++$L$ccm64_dec_body:
++	mov	eax,DWORD[240+rcx]
++	movups	xmm6,XMMWORD[r8]
++	movdqu	xmm3,XMMWORD[r9]
++	movdqa	xmm9,XMMWORD[$L$increment64]
++	movdqa	xmm7,XMMWORD[$L$bswap_mask]
++
++	movaps	xmm2,xmm6
++	mov	r10d,eax
++	mov	r11,rcx
++DB	102,15,56,0,247
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_enc1_5:
++DB	102,15,56,220,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_enc1_5
++DB	102,15,56,221,209
++	shl	r10d,4
++	mov	eax,16
++	movups	xmm8,XMMWORD[rdi]
++	paddq	xmm6,xmm9
++	lea	rdi,[16+rdi]
++	sub	rax,r10
++	lea	rcx,[32+r10*1+r11]
++	mov	r10,rax
++	jmp	NEAR $L$ccm64_dec_outer
++ALIGN	16
++$L$ccm64_dec_outer:
++	xorps	xmm8,xmm2
++	movdqa	xmm2,xmm6
++	movups	XMMWORD[rsi],xmm8
++	lea	rsi,[16+rsi]
++DB	102,15,56,0,215
++
++	sub	rdx,1
++	jz	NEAR $L$ccm64_dec_break
++
++	movups	xmm0,XMMWORD[r11]
++	mov	rax,r10
++	movups	xmm1,XMMWORD[16+r11]
++	xorps	xmm8,xmm0
++	xorps	xmm2,xmm0
++	xorps	xmm3,xmm8
++	movups	xmm0,XMMWORD[32+r11]
++	jmp	NEAR $L$ccm64_dec2_loop
++ALIGN	16
++$L$ccm64_dec2_loop:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$ccm64_dec2_loop
++	movups	xmm8,XMMWORD[rdi]
++	paddq	xmm6,xmm9
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,221,208
++DB	102,15,56,221,216
++	lea	rdi,[16+rdi]
++	jmp	NEAR $L$ccm64_dec_outer
++
++ALIGN	16
++$L$ccm64_dec_break:
++
++	mov	eax,DWORD[240+r11]
++	movups	xmm0,XMMWORD[r11]
++	movups	xmm1,XMMWORD[16+r11]
++	xorps	xmm8,xmm0
++	lea	r11,[32+r11]
++	xorps	xmm3,xmm8
++$L$oop_enc1_6:
++DB	102,15,56,220,217
++	dec	eax
++	movups	xmm1,XMMWORD[r11]
++	lea	r11,[16+r11]
++	jnz	NEAR $L$oop_enc1_6
++DB	102,15,56,221,217
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	movups	XMMWORD[r9],xmm3
++	pxor	xmm3,xmm3
++	pxor	xmm8,xmm8
++	pxor	xmm6,xmm6
++	movaps	xmm6,XMMWORD[rsp]
++	movaps	XMMWORD[rsp],xmm0
++	movaps	xmm7,XMMWORD[16+rsp]
++	movaps	XMMWORD[16+rsp],xmm0
++	movaps	xmm8,XMMWORD[32+rsp]
++	movaps	XMMWORD[32+rsp],xmm0
++	movaps	xmm9,XMMWORD[48+rsp]
++	movaps	XMMWORD[48+rsp],xmm0
++	lea	rsp,[88+rsp]
++$L$ccm64_dec_ret:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_ccm64_decrypt_blocks:
++global	aesni_ctr32_encrypt_blocks
++
++ALIGN	16
++aesni_ctr32_encrypt_blocks:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_ctr32_encrypt_blocks:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++
++
++	cmp	rdx,1
++	jne	NEAR $L$ctr32_bulk
++
++
++
++	movups	xmm2,XMMWORD[r8]
++	movups	xmm3,XMMWORD[rdi]
++	mov	edx,DWORD[240+rcx]
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_enc1_7:
++DB	102,15,56,220,209
++	dec	edx
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_enc1_7
++DB	102,15,56,221,209
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	xorps	xmm2,xmm3
++	pxor	xmm3,xmm3
++	movups	XMMWORD[rsi],xmm2
++	xorps	xmm2,xmm2
++	jmp	NEAR $L$ctr32_epilogue
++
++ALIGN	16
++$L$ctr32_bulk:
++	lea	rax,[rsp]
++	push	rbp
++	sub	rsp,288
++	and	rsp,-16
++	movaps	XMMWORD[(-168)+rax],xmm6
++	movaps	XMMWORD[(-152)+rax],xmm7
++	movaps	XMMWORD[(-136)+rax],xmm8
++	movaps	XMMWORD[(-120)+rax],xmm9
++	movaps	XMMWORD[(-104)+rax],xmm10
++	movaps	XMMWORD[(-88)+rax],xmm11
++	movaps	XMMWORD[(-72)+rax],xmm12
++	movaps	XMMWORD[(-56)+rax],xmm13
++	movaps	XMMWORD[(-40)+rax],xmm14
++	movaps	XMMWORD[(-24)+rax],xmm15
++$L$ctr32_body:
++	lea	rbp,[((-8))+rax]
++
++
++
++
++	movdqu	xmm2,XMMWORD[r8]
++	movdqu	xmm0,XMMWORD[rcx]
++	mov	r8d,DWORD[12+r8]
++	pxor	xmm2,xmm0
++	mov	r11d,DWORD[12+rcx]
++	movdqa	XMMWORD[rsp],xmm2
++	bswap	r8d
++	movdqa	xmm3,xmm2
++	movdqa	xmm4,xmm2
++	movdqa	xmm5,xmm2
++	movdqa	XMMWORD[64+rsp],xmm2
++	movdqa	XMMWORD[80+rsp],xmm2
++	movdqa	XMMWORD[96+rsp],xmm2
++	mov	r10,rdx
++	movdqa	XMMWORD[112+rsp],xmm2
++
++	lea	rax,[1+r8]
++	lea	rdx,[2+r8]
++	bswap	eax
++	bswap	edx
++	xor	eax,r11d
++	xor	edx,r11d
++DB	102,15,58,34,216,3
++	lea	rax,[3+r8]
++	movdqa	XMMWORD[16+rsp],xmm3
++DB	102,15,58,34,226,3
++	bswap	eax
++	mov	rdx,r10
++	lea	r10,[4+r8]
++	movdqa	XMMWORD[32+rsp],xmm4
++	xor	eax,r11d
++	bswap	r10d
++DB	102,15,58,34,232,3
++	xor	r10d,r11d
++	movdqa	XMMWORD[48+rsp],xmm5
++	lea	r9,[5+r8]
++	mov	DWORD[((64+12))+rsp],r10d
++	bswap	r9d
++	lea	r10,[6+r8]
++	mov	eax,DWORD[240+rcx]
++	xor	r9d,r11d
++	bswap	r10d
++	mov	DWORD[((80+12))+rsp],r9d
++	xor	r10d,r11d
++	lea	r9,[7+r8]
++	mov	DWORD[((96+12))+rsp],r10d
++	bswap	r9d
++	mov	r10d,DWORD[((_gnutls_x86_cpuid_s+4))]
++	xor	r9d,r11d
++	and	r10d,71303168
++	mov	DWORD[((112+12))+rsp],r9d
++
++	movups	xmm1,XMMWORD[16+rcx]
++
++	movdqa	xmm6,XMMWORD[64+rsp]
++	movdqa	xmm7,XMMWORD[80+rsp]
++
++	cmp	rdx,8
++	jb	NEAR $L$ctr32_tail
++
++	sub	rdx,6
++	cmp	r10d,4194304
++	je	NEAR $L$ctr32_6x
++
++	lea	rcx,[128+rcx]
++	sub	rdx,2
++	jmp	NEAR $L$ctr32_loop8
++
++ALIGN	16
++$L$ctr32_6x:
++	shl	eax,4
++	mov	r10d,48
++	bswap	r11d
++	lea	rcx,[32+rax*1+rcx]
++	sub	r10,rax
++	jmp	NEAR $L$ctr32_loop6
++
++ALIGN	16
++$L$ctr32_loop6:
++	add	r8d,6
++	movups	xmm0,XMMWORD[((-48))+r10*1+rcx]
++DB	102,15,56,220,209
++	mov	eax,r8d
++	xor	eax,r11d
++DB	102,15,56,220,217
++DB	0x0f,0x38,0xf1,0x44,0x24,12
++	lea	eax,[1+r8]
++DB	102,15,56,220,225
++	xor	eax,r11d
++DB	0x0f,0x38,0xf1,0x44,0x24,28
++DB	102,15,56,220,233
++	lea	eax,[2+r8]
++	xor	eax,r11d
++DB	102,15,56,220,241
++DB	0x0f,0x38,0xf1,0x44,0x24,44
++	lea	eax,[3+r8]
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[((-32))+r10*1+rcx]
++	xor	eax,r11d
++
++DB	102,15,56,220,208
++DB	0x0f,0x38,0xf1,0x44,0x24,60
++	lea	eax,[4+r8]
++DB	102,15,56,220,216
++	xor	eax,r11d
++DB	0x0f,0x38,0xf1,0x44,0x24,76
++DB	102,15,56,220,224
++	lea	eax,[5+r8]
++	xor	eax,r11d
++DB	102,15,56,220,232
++DB	0x0f,0x38,0xf1,0x44,0x24,92
++	mov	rax,r10
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++	movups	xmm0,XMMWORD[((-16))+r10*1+rcx]
++
++	call	$L$enc_loop6
++
++	movdqu	xmm8,XMMWORD[rdi]
++	movdqu	xmm9,XMMWORD[16+rdi]
++	movdqu	xmm10,XMMWORD[32+rdi]
++	movdqu	xmm11,XMMWORD[48+rdi]
++	movdqu	xmm12,XMMWORD[64+rdi]
++	movdqu	xmm13,XMMWORD[80+rdi]
++	lea	rdi,[96+rdi]
++	movups	xmm1,XMMWORD[((-64))+r10*1+rcx]
++	pxor	xmm8,xmm2
++	movaps	xmm2,XMMWORD[rsp]
++	pxor	xmm9,xmm3
++	movaps	xmm3,XMMWORD[16+rsp]
++	pxor	xmm10,xmm4
++	movaps	xmm4,XMMWORD[32+rsp]
++	pxor	xmm11,xmm5
++	movaps	xmm5,XMMWORD[48+rsp]
++	pxor	xmm12,xmm6
++	movaps	xmm6,XMMWORD[64+rsp]
++	pxor	xmm13,xmm7
++	movaps	xmm7,XMMWORD[80+rsp]
++	movdqu	XMMWORD[rsi],xmm8
++	movdqu	XMMWORD[16+rsi],xmm9
++	movdqu	XMMWORD[32+rsi],xmm10
++	movdqu	XMMWORD[48+rsi],xmm11
++	movdqu	XMMWORD[64+rsi],xmm12
++	movdqu	XMMWORD[80+rsi],xmm13
++	lea	rsi,[96+rsi]
++
++	sub	rdx,6
++	jnc	NEAR $L$ctr32_loop6
++
++	add	rdx,6
++	jz	NEAR $L$ctr32_done
++
++	lea	eax,[((-48))+r10]
++	lea	rcx,[((-80))+r10*1+rcx]
++	neg	eax
++	shr	eax,4
++	jmp	NEAR $L$ctr32_tail
++
++ALIGN	32
++$L$ctr32_loop8:
++	add	r8d,8
++	movdqa	xmm8,XMMWORD[96+rsp]
++DB	102,15,56,220,209
++	mov	r9d,r8d
++	movdqa	xmm9,XMMWORD[112+rsp]
++DB	102,15,56,220,217
++	bswap	r9d
++	movups	xmm0,XMMWORD[((32-128))+rcx]
++DB	102,15,56,220,225
++	xor	r9d,r11d
++	nop
++DB	102,15,56,220,233
++	mov	DWORD[((0+12))+rsp],r9d
++	lea	r9,[1+r8]
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++DB	102,68,15,56,220,201
++	movups	xmm1,XMMWORD[((48-128))+rcx]
++	bswap	r9d
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++	xor	r9d,r11d
++DB	0x66,0x90
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++	mov	DWORD[((16+12))+rsp],r9d
++	lea	r9,[2+r8]
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++DB	102,68,15,56,220,192
++DB	102,68,15,56,220,200
++	movups	xmm0,XMMWORD[((64-128))+rcx]
++	bswap	r9d
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++	xor	r9d,r11d
++DB	0x66,0x90
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	mov	DWORD[((32+12))+rsp],r9d
++	lea	r9,[3+r8]
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++DB	102,68,15,56,220,201
++	movups	xmm1,XMMWORD[((80-128))+rcx]
++	bswap	r9d
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++	xor	r9d,r11d
++DB	0x66,0x90
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++	mov	DWORD[((48+12))+rsp],r9d
++	lea	r9,[4+r8]
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++DB	102,68,15,56,220,192
++DB	102,68,15,56,220,200
++	movups	xmm0,XMMWORD[((96-128))+rcx]
++	bswap	r9d
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++	xor	r9d,r11d
++DB	0x66,0x90
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	mov	DWORD[((64+12))+rsp],r9d
++	lea	r9,[5+r8]
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++DB	102,68,15,56,220,201
++	movups	xmm1,XMMWORD[((112-128))+rcx]
++	bswap	r9d
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++	xor	r9d,r11d
++DB	0x66,0x90
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++	mov	DWORD[((80+12))+rsp],r9d
++	lea	r9,[6+r8]
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++DB	102,68,15,56,220,192
++DB	102,68,15,56,220,200
++	movups	xmm0,XMMWORD[((128-128))+rcx]
++	bswap	r9d
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++	xor	r9d,r11d
++DB	0x66,0x90
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	mov	DWORD[((96+12))+rsp],r9d
++	lea	r9,[7+r8]
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++DB	102,68,15,56,220,201
++	movups	xmm1,XMMWORD[((144-128))+rcx]
++	bswap	r9d
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++	xor	r9d,r11d
++	movdqu	xmm10,XMMWORD[rdi]
++DB	102,15,56,220,232
++	mov	DWORD[((112+12))+rsp],r9d
++	cmp	eax,11
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++DB	102,68,15,56,220,192
++DB	102,68,15,56,220,200
++	movups	xmm0,XMMWORD[((160-128))+rcx]
++
++	jb	NEAR $L$ctr32_enc_done
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++DB	102,68,15,56,220,201
++	movups	xmm1,XMMWORD[((176-128))+rcx]
++
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++DB	102,68,15,56,220,192
++DB	102,68,15,56,220,200
++	movups	xmm0,XMMWORD[((192-128))+rcx]
++	je	NEAR $L$ctr32_enc_done
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++DB	102,68,15,56,220,201
++	movups	xmm1,XMMWORD[((208-128))+rcx]
++
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++DB	102,68,15,56,220,192
++DB	102,68,15,56,220,200
++	movups	xmm0,XMMWORD[((224-128))+rcx]
++	jmp	NEAR $L$ctr32_enc_done
++
++ALIGN	16
++$L$ctr32_enc_done:
++	movdqu	xmm11,XMMWORD[16+rdi]
++	pxor	xmm10,xmm0
++	movdqu	xmm12,XMMWORD[32+rdi]
++	pxor	xmm11,xmm0
++	movdqu	xmm13,XMMWORD[48+rdi]
++	pxor	xmm12,xmm0
++	movdqu	xmm14,XMMWORD[64+rdi]
++	pxor	xmm13,xmm0
++	movdqu	xmm15,XMMWORD[80+rdi]
++	pxor	xmm14,xmm0
++	pxor	xmm15,xmm0
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++DB	102,68,15,56,220,201
++	movdqu	xmm1,XMMWORD[96+rdi]
++	lea	rdi,[128+rdi]
++
++DB	102,65,15,56,221,210
++	pxor	xmm1,xmm0
++	movdqu	xmm10,XMMWORD[((112-128))+rdi]
++DB	102,65,15,56,221,219
++	pxor	xmm10,xmm0
++	movdqa	xmm11,XMMWORD[rsp]
++DB	102,65,15,56,221,228
++DB	102,65,15,56,221,237
++	movdqa	xmm12,XMMWORD[16+rsp]
++	movdqa	xmm13,XMMWORD[32+rsp]
++DB	102,65,15,56,221,246
++DB	102,65,15,56,221,255
++	movdqa	xmm14,XMMWORD[48+rsp]
++	movdqa	xmm15,XMMWORD[64+rsp]
++DB	102,68,15,56,221,193
++	movdqa	xmm0,XMMWORD[80+rsp]
++	movups	xmm1,XMMWORD[((16-128))+rcx]
++DB	102,69,15,56,221,202
++
++	movups	XMMWORD[rsi],xmm2
++	movdqa	xmm2,xmm11
++	movups	XMMWORD[16+rsi],xmm3
++	movdqa	xmm3,xmm12
++	movups	XMMWORD[32+rsi],xmm4
++	movdqa	xmm4,xmm13
++	movups	XMMWORD[48+rsi],xmm5
++	movdqa	xmm5,xmm14
++	movups	XMMWORD[64+rsi],xmm6
++	movdqa	xmm6,xmm15
++	movups	XMMWORD[80+rsi],xmm7
++	movdqa	xmm7,xmm0
++	movups	XMMWORD[96+rsi],xmm8
++	movups	XMMWORD[112+rsi],xmm9
++	lea	rsi,[128+rsi]
++
++	sub	rdx,8
++	jnc	NEAR $L$ctr32_loop8
++
++	add	rdx,8
++	jz	NEAR $L$ctr32_done
++	lea	rcx,[((-128))+rcx]
++
++$L$ctr32_tail:
++
++
++	lea	rcx,[16+rcx]
++	cmp	rdx,4
++	jb	NEAR $L$ctr32_loop3
++	je	NEAR $L$ctr32_loop4
++
++
++	shl	eax,4
++	movdqa	xmm8,XMMWORD[96+rsp]
++	pxor	xmm9,xmm9
++
++	movups	xmm0,XMMWORD[16+rcx]
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++	lea	rcx,[((32-16))+rax*1+rcx]
++	neg	rax
++DB	102,15,56,220,225
++	add	rax,16
++	movups	xmm10,XMMWORD[rdi]
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++	movups	xmm11,XMMWORD[16+rdi]
++	movups	xmm12,XMMWORD[32+rdi]
++DB	102,15,56,220,249
++DB	102,68,15,56,220,193
++
++	call	$L$enc_loop8_enter
++
++	movdqu	xmm13,XMMWORD[48+rdi]
++	pxor	xmm2,xmm10
++	movdqu	xmm10,XMMWORD[64+rdi]
++	pxor	xmm3,xmm11
++	movdqu	XMMWORD[rsi],xmm2
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[16+rsi],xmm3
++	pxor	xmm5,xmm13
++	movdqu	XMMWORD[32+rsi],xmm4
++	pxor	xmm6,xmm10
++	movdqu	XMMWORD[48+rsi],xmm5
++	movdqu	XMMWORD[64+rsi],xmm6
++	cmp	rdx,6
++	jb	NEAR $L$ctr32_done
++
++	movups	xmm11,XMMWORD[80+rdi]
++	xorps	xmm7,xmm11
++	movups	XMMWORD[80+rsi],xmm7
++	je	NEAR $L$ctr32_done
++
++	movups	xmm12,XMMWORD[96+rdi]
++	xorps	xmm8,xmm12
++	movups	XMMWORD[96+rsi],xmm8
++	jmp	NEAR $L$ctr32_done
++
++ALIGN	32
++$L$ctr32_loop4:
++DB	102,15,56,220,209
++	lea	rcx,[16+rcx]
++	dec	eax
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	movups	xmm1,XMMWORD[rcx]
++	jnz	NEAR $L$ctr32_loop4
++DB	102,15,56,221,209
++DB	102,15,56,221,217
++	movups	xmm10,XMMWORD[rdi]
++	movups	xmm11,XMMWORD[16+rdi]
++DB	102,15,56,221,225
++DB	102,15,56,221,233
++	movups	xmm12,XMMWORD[32+rdi]
++	movups	xmm13,XMMWORD[48+rdi]
++
++	xorps	xmm2,xmm10
++	movups	XMMWORD[rsi],xmm2
++	xorps	xmm3,xmm11
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[32+rsi],xmm4
++	pxor	xmm5,xmm13
++	movdqu	XMMWORD[48+rsi],xmm5
++	jmp	NEAR $L$ctr32_done
++
++ALIGN	32
++$L$ctr32_loop3:
++DB	102,15,56,220,209
++	lea	rcx,[16+rcx]
++	dec	eax
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++	movups	xmm1,XMMWORD[rcx]
++	jnz	NEAR $L$ctr32_loop3
++DB	102,15,56,221,209
++DB	102,15,56,221,217
++DB	102,15,56,221,225
++
++	movups	xmm10,XMMWORD[rdi]
++	xorps	xmm2,xmm10
++	movups	XMMWORD[rsi],xmm2
++	cmp	rdx,2
++	jb	NEAR $L$ctr32_done
++
++	movups	xmm11,XMMWORD[16+rdi]
++	xorps	xmm3,xmm11
++	movups	XMMWORD[16+rsi],xmm3
++	je	NEAR $L$ctr32_done
++
++	movups	xmm12,XMMWORD[32+rdi]
++	xorps	xmm4,xmm12
++	movups	XMMWORD[32+rsi],xmm4
++
++$L$ctr32_done:
++	xorps	xmm0,xmm0
++	xor	r11d,r11d
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	movaps	xmm6,XMMWORD[((-160))+rbp]
++	movaps	XMMWORD[(-160)+rbp],xmm0
++	movaps	xmm7,XMMWORD[((-144))+rbp]
++	movaps	XMMWORD[(-144)+rbp],xmm0
++	movaps	xmm8,XMMWORD[((-128))+rbp]
++	movaps	XMMWORD[(-128)+rbp],xmm0
++	movaps	xmm9,XMMWORD[((-112))+rbp]
++	movaps	XMMWORD[(-112)+rbp],xmm0
++	movaps	xmm10,XMMWORD[((-96))+rbp]
++	movaps	XMMWORD[(-96)+rbp],xmm0
++	movaps	xmm11,XMMWORD[((-80))+rbp]
++	movaps	XMMWORD[(-80)+rbp],xmm0
++	movaps	xmm12,XMMWORD[((-64))+rbp]
++	movaps	XMMWORD[(-64)+rbp],xmm0
++	movaps	xmm13,XMMWORD[((-48))+rbp]
++	movaps	XMMWORD[(-48)+rbp],xmm0
++	movaps	xmm14,XMMWORD[((-32))+rbp]
++	movaps	XMMWORD[(-32)+rbp],xmm0
++	movaps	xmm15,XMMWORD[((-16))+rbp]
++	movaps	XMMWORD[(-16)+rbp],xmm0
++	movaps	XMMWORD[rsp],xmm0
++	movaps	XMMWORD[16+rsp],xmm0
++	movaps	XMMWORD[32+rsp],xmm0
++	movaps	XMMWORD[48+rsp],xmm0
++	movaps	XMMWORD[64+rsp],xmm0
++	movaps	XMMWORD[80+rsp],xmm0
++	movaps	XMMWORD[96+rsp],xmm0
++	movaps	XMMWORD[112+rsp],xmm0
++	lea	rsp,[rbp]
++	pop	rbp
++$L$ctr32_epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_ctr32_encrypt_blocks:
++global	aesni_xts_encrypt
++
++ALIGN	16
++aesni_xts_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_xts_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	lea	rax,[rsp]
++	push	rbp
++	sub	rsp,272
++	and	rsp,-16
++	movaps	XMMWORD[(-168)+rax],xmm6
++	movaps	XMMWORD[(-152)+rax],xmm7
++	movaps	XMMWORD[(-136)+rax],xmm8
++	movaps	XMMWORD[(-120)+rax],xmm9
++	movaps	XMMWORD[(-104)+rax],xmm10
++	movaps	XMMWORD[(-88)+rax],xmm11
++	movaps	XMMWORD[(-72)+rax],xmm12
++	movaps	XMMWORD[(-56)+rax],xmm13
++	movaps	XMMWORD[(-40)+rax],xmm14
++	movaps	XMMWORD[(-24)+rax],xmm15
++$L$xts_enc_body:
++	lea	rbp,[((-8))+rax]
++	movups	xmm2,XMMWORD[r9]
++	mov	eax,DWORD[240+r8]
++	mov	r10d,DWORD[240+rcx]
++	movups	xmm0,XMMWORD[r8]
++	movups	xmm1,XMMWORD[16+r8]
++	lea	r8,[32+r8]
++	xorps	xmm2,xmm0
++$L$oop_enc1_8:
++DB	102,15,56,220,209
++	dec	eax
++	movups	xmm1,XMMWORD[r8]
++	lea	r8,[16+r8]
++	jnz	NEAR $L$oop_enc1_8
++DB	102,15,56,221,209
++	movups	xmm0,XMMWORD[rcx]
++	mov	r11,rcx
++	mov	eax,r10d
++	shl	r10d,4
++	mov	r9,rdx
++	and	rdx,-16
++
++	movups	xmm1,XMMWORD[16+r10*1+rcx]
++
++	movdqa	xmm8,XMMWORD[$L$xts_magic]
++	movdqa	xmm15,xmm2
++	pshufd	xmm9,xmm2,0x5f
++	pxor	xmm1,xmm0
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++	movdqa	xmm10,xmm15
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++	pxor	xmm10,xmm0
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++	movdqa	xmm11,xmm15
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++	pxor	xmm11,xmm0
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++	movdqa	xmm12,xmm15
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++	pxor	xmm12,xmm0
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++	movdqa	xmm13,xmm15
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++	pxor	xmm13,xmm0
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm15
++	psrad	xmm9,31
++	paddq	xmm15,xmm15
++	pand	xmm9,xmm8
++	pxor	xmm14,xmm0
++	pxor	xmm15,xmm9
++	movaps	XMMWORD[96+rsp],xmm1
++
++	sub	rdx,16*6
++	jc	NEAR $L$xts_enc_short
++
++	mov	eax,16+96
++	lea	rcx,[32+r10*1+r11]
++	sub	rax,r10
++	movups	xmm1,XMMWORD[16+r11]
++	mov	r10,rax
++	lea	r8,[$L$xts_magic]
++	jmp	NEAR $L$xts_enc_grandloop
++
++ALIGN	32
++$L$xts_enc_grandloop:
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqa	xmm8,xmm0
++	movdqu	xmm3,XMMWORD[16+rdi]
++	pxor	xmm2,xmm10
++	movdqu	xmm4,XMMWORD[32+rdi]
++	pxor	xmm3,xmm11
++DB	102,15,56,220,209
++	movdqu	xmm5,XMMWORD[48+rdi]
++	pxor	xmm4,xmm12
++DB	102,15,56,220,217
++	movdqu	xmm6,XMMWORD[64+rdi]
++	pxor	xmm5,xmm13
++DB	102,15,56,220,225
++	movdqu	xmm7,XMMWORD[80+rdi]
++	pxor	xmm8,xmm15
++	movdqa	xmm9,XMMWORD[96+rsp]
++	pxor	xmm6,xmm14
++DB	102,15,56,220,233
++	movups	xmm0,XMMWORD[32+r11]
++	lea	rdi,[96+rdi]
++	pxor	xmm7,xmm8
++
++	pxor	xmm10,xmm9
++DB	102,15,56,220,241
++	pxor	xmm11,xmm9
++	movdqa	XMMWORD[rsp],xmm10
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[48+r11]
++	pxor	xmm12,xmm9
++
++DB	102,15,56,220,208
++	pxor	xmm13,xmm9
++	movdqa	XMMWORD[16+rsp],xmm11
++DB	102,15,56,220,216
++	pxor	xmm14,xmm9
++	movdqa	XMMWORD[32+rsp],xmm12
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++	pxor	xmm8,xmm9
++	movdqa	XMMWORD[64+rsp],xmm14
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++	movups	xmm0,XMMWORD[64+r11]
++	movdqa	XMMWORD[80+rsp],xmm8
++	pshufd	xmm9,xmm15,0x5f
++	jmp	NEAR $L$xts_enc_loop6
++ALIGN	32
++$L$xts_enc_loop6:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[((-64))+rax*1+rcx]
++	add	rax,32
++
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++	movups	xmm0,XMMWORD[((-80))+rax*1+rcx]
++	jnz	NEAR $L$xts_enc_loop6
++
++	movdqa	xmm8,XMMWORD[r8]
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++DB	102,15,56,220,209
++	paddq	xmm15,xmm15
++	psrad	xmm14,31
++DB	102,15,56,220,217
++	pand	xmm14,xmm8
++	movups	xmm10,XMMWORD[r11]
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++	pxor	xmm15,xmm14
++	movaps	xmm11,xmm10
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[((-64))+rcx]
++
++	movdqa	xmm14,xmm9
++DB	102,15,56,220,208
++	paddd	xmm9,xmm9
++	pxor	xmm10,xmm15
++DB	102,15,56,220,216
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++	pand	xmm14,xmm8
++	movaps	xmm12,xmm11
++DB	102,15,56,220,240
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm9
++DB	102,15,56,220,248
++	movups	xmm0,XMMWORD[((-48))+rcx]
++
++	paddd	xmm9,xmm9
++DB	102,15,56,220,209
++	pxor	xmm11,xmm15
++	psrad	xmm14,31
++DB	102,15,56,220,217
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	movdqa	XMMWORD[48+rsp],xmm13
++	pxor	xmm15,xmm14
++DB	102,15,56,220,241
++	movaps	xmm13,xmm12
++	movdqa	xmm14,xmm9
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[((-32))+rcx]
++
++	paddd	xmm9,xmm9
++DB	102,15,56,220,208
++	pxor	xmm12,xmm15
++	psrad	xmm14,31
++DB	102,15,56,220,216
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++DB	102,15,56,220,240
++	pxor	xmm15,xmm14
++	movaps	xmm14,xmm13
++DB	102,15,56,220,248
++
++	movdqa	xmm0,xmm9
++	paddd	xmm9,xmm9
++DB	102,15,56,220,209
++	pxor	xmm13,xmm15
++	psrad	xmm0,31
++DB	102,15,56,220,217
++	paddq	xmm15,xmm15
++	pand	xmm0,xmm8
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	pxor	xmm15,xmm0
++	movups	xmm0,XMMWORD[r11]
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[16+r11]
++
++	pxor	xmm14,xmm15
++DB	102,15,56,221,84,36,0
++	psrad	xmm9,31
++	paddq	xmm15,xmm15
++DB	102,15,56,221,92,36,16
++DB	102,15,56,221,100,36,32
++	pand	xmm9,xmm8
++	mov	rax,r10
++DB	102,15,56,221,108,36,48
++DB	102,15,56,221,116,36,64
++DB	102,15,56,221,124,36,80
++	pxor	xmm15,xmm9
++
++	lea	rsi,[96+rsi]
++	movups	XMMWORD[(-96)+rsi],xmm2
++	movups	XMMWORD[(-80)+rsi],xmm3
++	movups	XMMWORD[(-64)+rsi],xmm4
++	movups	XMMWORD[(-48)+rsi],xmm5
++	movups	XMMWORD[(-32)+rsi],xmm6
++	movups	XMMWORD[(-16)+rsi],xmm7
++	sub	rdx,16*6
++	jnc	NEAR $L$xts_enc_grandloop
++
++	mov	eax,16+96
++	sub	eax,r10d
++	mov	rcx,r11
++	shr	eax,4
++
++$L$xts_enc_short:
++
++	mov	r10d,eax
++	pxor	xmm10,xmm0
++	add	rdx,16*6
++	jz	NEAR $L$xts_enc_done
++
++	pxor	xmm11,xmm0
++	cmp	rdx,0x20
++	jb	NEAR $L$xts_enc_one
++	pxor	xmm12,xmm0
++	je	NEAR $L$xts_enc_two
++
++	pxor	xmm13,xmm0
++	cmp	rdx,0x40
++	jb	NEAR $L$xts_enc_three
++	pxor	xmm14,xmm0
++	je	NEAR $L$xts_enc_four
++
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movdqu	xmm4,XMMWORD[32+rdi]
++	pxor	xmm2,xmm10
++	movdqu	xmm5,XMMWORD[48+rdi]
++	pxor	xmm3,xmm11
++	movdqu	xmm6,XMMWORD[64+rdi]
++	lea	rdi,[80+rdi]
++	pxor	xmm4,xmm12
++	pxor	xmm5,xmm13
++	pxor	xmm6,xmm14
++	pxor	xmm7,xmm7
++
++	call	_aesni_encrypt6
++
++	xorps	xmm2,xmm10
++	movdqa	xmm10,xmm15
++	xorps	xmm3,xmm11
++	xorps	xmm4,xmm12
++	movdqu	XMMWORD[rsi],xmm2
++	xorps	xmm5,xmm13
++	movdqu	XMMWORD[16+rsi],xmm3
++	xorps	xmm6,xmm14
++	movdqu	XMMWORD[32+rsi],xmm4
++	movdqu	XMMWORD[48+rsi],xmm5
++	movdqu	XMMWORD[64+rsi],xmm6
++	lea	rsi,[80+rsi]
++	jmp	NEAR $L$xts_enc_done
++
++ALIGN	16
++$L$xts_enc_one:
++	movups	xmm2,XMMWORD[rdi]
++	lea	rdi,[16+rdi]
++	xorps	xmm2,xmm10
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_enc1_9:
++DB	102,15,56,220,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_enc1_9
++DB	102,15,56,221,209
++	xorps	xmm2,xmm10
++	movdqa	xmm10,xmm11
++	movups	XMMWORD[rsi],xmm2
++	lea	rsi,[16+rsi]
++	jmp	NEAR $L$xts_enc_done
++
++ALIGN	16
++$L$xts_enc_two:
++	movups	xmm2,XMMWORD[rdi]
++	movups	xmm3,XMMWORD[16+rdi]
++	lea	rdi,[32+rdi]
++	xorps	xmm2,xmm10
++	xorps	xmm3,xmm11
++
++	call	_aesni_encrypt2
++
++	xorps	xmm2,xmm10
++	movdqa	xmm10,xmm12
++	xorps	xmm3,xmm11
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	lea	rsi,[32+rsi]
++	jmp	NEAR $L$xts_enc_done
++
++ALIGN	16
++$L$xts_enc_three:
++	movups	xmm2,XMMWORD[rdi]
++	movups	xmm3,XMMWORD[16+rdi]
++	movups	xmm4,XMMWORD[32+rdi]
++	lea	rdi,[48+rdi]
++	xorps	xmm2,xmm10
++	xorps	xmm3,xmm11
++	xorps	xmm4,xmm12
++
++	call	_aesni_encrypt3
++
++	xorps	xmm2,xmm10
++	movdqa	xmm10,xmm13
++	xorps	xmm3,xmm11
++	xorps	xmm4,xmm12
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	lea	rsi,[48+rsi]
++	jmp	NEAR $L$xts_enc_done
++
++ALIGN	16
++$L$xts_enc_four:
++	movups	xmm2,XMMWORD[rdi]
++	movups	xmm3,XMMWORD[16+rdi]
++	movups	xmm4,XMMWORD[32+rdi]
++	xorps	xmm2,xmm10
++	movups	xmm5,XMMWORD[48+rdi]
++	lea	rdi,[64+rdi]
++	xorps	xmm3,xmm11
++	xorps	xmm4,xmm12
++	xorps	xmm5,xmm13
++
++	call	_aesni_encrypt4
++
++	pxor	xmm2,xmm10
++	movdqa	xmm10,xmm14
++	pxor	xmm3,xmm11
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[rsi],xmm2
++	pxor	xmm5,xmm13
++	movdqu	XMMWORD[16+rsi],xmm3
++	movdqu	XMMWORD[32+rsi],xmm4
++	movdqu	XMMWORD[48+rsi],xmm5
++	lea	rsi,[64+rsi]
++	jmp	NEAR $L$xts_enc_done
++
++ALIGN	16
++$L$xts_enc_done:
++	and	r9,15
++	jz	NEAR $L$xts_enc_ret
++	mov	rdx,r9
++
++$L$xts_enc_steal:
++	movzx	eax,BYTE[rdi]
++	movzx	ecx,BYTE[((-16))+rsi]
++	lea	rdi,[1+rdi]
++	mov	BYTE[((-16))+rsi],al
++	mov	BYTE[rsi],cl
++	lea	rsi,[1+rsi]
++	sub	rdx,1
++	jnz	NEAR $L$xts_enc_steal
++
++	sub	rsi,r9
++	mov	rcx,r11
++	mov	eax,r10d
++
++	movups	xmm2,XMMWORD[((-16))+rsi]
++	xorps	xmm2,xmm10
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_enc1_10:
++DB	102,15,56,220,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_enc1_10
++DB	102,15,56,221,209
++	xorps	xmm2,xmm10
++	movups	XMMWORD[(-16)+rsi],xmm2
++
++$L$xts_enc_ret:
++	xorps	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	movaps	xmm6,XMMWORD[((-160))+rbp]
++	movaps	XMMWORD[(-160)+rbp],xmm0
++	movaps	xmm7,XMMWORD[((-144))+rbp]
++	movaps	XMMWORD[(-144)+rbp],xmm0
++	movaps	xmm8,XMMWORD[((-128))+rbp]
++	movaps	XMMWORD[(-128)+rbp],xmm0
++	movaps	xmm9,XMMWORD[((-112))+rbp]
++	movaps	XMMWORD[(-112)+rbp],xmm0
++	movaps	xmm10,XMMWORD[((-96))+rbp]
++	movaps	XMMWORD[(-96)+rbp],xmm0
++	movaps	xmm11,XMMWORD[((-80))+rbp]
++	movaps	XMMWORD[(-80)+rbp],xmm0
++	movaps	xmm12,XMMWORD[((-64))+rbp]
++	movaps	XMMWORD[(-64)+rbp],xmm0
++	movaps	xmm13,XMMWORD[((-48))+rbp]
++	movaps	XMMWORD[(-48)+rbp],xmm0
++	movaps	xmm14,XMMWORD[((-32))+rbp]
++	movaps	XMMWORD[(-32)+rbp],xmm0
++	movaps	xmm15,XMMWORD[((-16))+rbp]
++	movaps	XMMWORD[(-16)+rbp],xmm0
++	movaps	XMMWORD[rsp],xmm0
++	movaps	XMMWORD[16+rsp],xmm0
++	movaps	XMMWORD[32+rsp],xmm0
++	movaps	XMMWORD[48+rsp],xmm0
++	movaps	XMMWORD[64+rsp],xmm0
++	movaps	XMMWORD[80+rsp],xmm0
++	movaps	XMMWORD[96+rsp],xmm0
++	lea	rsp,[rbp]
++	pop	rbp
++$L$xts_enc_epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_xts_encrypt:
++global	aesni_xts_decrypt
++
++ALIGN	16
++aesni_xts_decrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_xts_decrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	lea	rax,[rsp]
++	push	rbp
++	sub	rsp,272
++	and	rsp,-16
++	movaps	XMMWORD[(-168)+rax],xmm6
++	movaps	XMMWORD[(-152)+rax],xmm7
++	movaps	XMMWORD[(-136)+rax],xmm8
++	movaps	XMMWORD[(-120)+rax],xmm9
++	movaps	XMMWORD[(-104)+rax],xmm10
++	movaps	XMMWORD[(-88)+rax],xmm11
++	movaps	XMMWORD[(-72)+rax],xmm12
++	movaps	XMMWORD[(-56)+rax],xmm13
++	movaps	XMMWORD[(-40)+rax],xmm14
++	movaps	XMMWORD[(-24)+rax],xmm15
++$L$xts_dec_body:
++	lea	rbp,[((-8))+rax]
++	movups	xmm2,XMMWORD[r9]
++	mov	eax,DWORD[240+r8]
++	mov	r10d,DWORD[240+rcx]
++	movups	xmm0,XMMWORD[r8]
++	movups	xmm1,XMMWORD[16+r8]
++	lea	r8,[32+r8]
++	xorps	xmm2,xmm0
++$L$oop_enc1_11:
++DB	102,15,56,220,209
++	dec	eax
++	movups	xmm1,XMMWORD[r8]
++	lea	r8,[16+r8]
++	jnz	NEAR $L$oop_enc1_11
++DB	102,15,56,221,209
++	xor	eax,eax
++	test	rdx,15
++	setnz	al
++	shl	rax,4
++	sub	rdx,rax
++
++	movups	xmm0,XMMWORD[rcx]
++	mov	r11,rcx
++	mov	eax,r10d
++	shl	r10d,4
++	mov	r9,rdx
++	and	rdx,-16
++
++	movups	xmm1,XMMWORD[16+r10*1+rcx]
++
++	movdqa	xmm8,XMMWORD[$L$xts_magic]
++	movdqa	xmm15,xmm2
++	pshufd	xmm9,xmm2,0x5f
++	pxor	xmm1,xmm0
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++	movdqa	xmm10,xmm15
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++	pxor	xmm10,xmm0
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++	movdqa	xmm11,xmm15
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++	pxor	xmm11,xmm0
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++	movdqa	xmm12,xmm15
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++	pxor	xmm12,xmm0
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++	movdqa	xmm13,xmm15
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++	pxor	xmm13,xmm0
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm15
++	psrad	xmm9,31
++	paddq	xmm15,xmm15
++	pand	xmm9,xmm8
++	pxor	xmm14,xmm0
++	pxor	xmm15,xmm9
++	movaps	XMMWORD[96+rsp],xmm1
++
++	sub	rdx,16*6
++	jc	NEAR $L$xts_dec_short
++
++	mov	eax,16+96
++	lea	rcx,[32+r10*1+r11]
++	sub	rax,r10
++	movups	xmm1,XMMWORD[16+r11]
++	mov	r10,rax
++	lea	r8,[$L$xts_magic]
++	jmp	NEAR $L$xts_dec_grandloop
++
++ALIGN	32
++$L$xts_dec_grandloop:
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqa	xmm8,xmm0
++	movdqu	xmm3,XMMWORD[16+rdi]
++	pxor	xmm2,xmm10
++	movdqu	xmm4,XMMWORD[32+rdi]
++	pxor	xmm3,xmm11
++DB	102,15,56,222,209
++	movdqu	xmm5,XMMWORD[48+rdi]
++	pxor	xmm4,xmm12
++DB	102,15,56,222,217
++	movdqu	xmm6,XMMWORD[64+rdi]
++	pxor	xmm5,xmm13
++DB	102,15,56,222,225
++	movdqu	xmm7,XMMWORD[80+rdi]
++	pxor	xmm8,xmm15
++	movdqa	xmm9,XMMWORD[96+rsp]
++	pxor	xmm6,xmm14
++DB	102,15,56,222,233
++	movups	xmm0,XMMWORD[32+r11]
++	lea	rdi,[96+rdi]
++	pxor	xmm7,xmm8
++
++	pxor	xmm10,xmm9
++DB	102,15,56,222,241
++	pxor	xmm11,xmm9
++	movdqa	XMMWORD[rsp],xmm10
++DB	102,15,56,222,249
++	movups	xmm1,XMMWORD[48+r11]
++	pxor	xmm12,xmm9
++
++DB	102,15,56,222,208
++	pxor	xmm13,xmm9
++	movdqa	XMMWORD[16+rsp],xmm11
++DB	102,15,56,222,216
++	pxor	xmm14,xmm9
++	movdqa	XMMWORD[32+rsp],xmm12
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++	pxor	xmm8,xmm9
++	movdqa	XMMWORD[64+rsp],xmm14
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++	movups	xmm0,XMMWORD[64+r11]
++	movdqa	XMMWORD[80+rsp],xmm8
++	pshufd	xmm9,xmm15,0x5f
++	jmp	NEAR $L$xts_dec_loop6
++ALIGN	32
++$L$xts_dec_loop6:
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++	movups	xmm1,XMMWORD[((-64))+rax*1+rcx]
++	add	rax,32
++
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++	movups	xmm0,XMMWORD[((-80))+rax*1+rcx]
++	jnz	NEAR $L$xts_dec_loop6
++
++	movdqa	xmm8,XMMWORD[r8]
++	movdqa	xmm14,xmm9
++	paddd	xmm9,xmm9
++DB	102,15,56,222,209
++	paddq	xmm15,xmm15
++	psrad	xmm14,31
++DB	102,15,56,222,217
++	pand	xmm14,xmm8
++	movups	xmm10,XMMWORD[r11]
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++	pxor	xmm15,xmm14
++	movaps	xmm11,xmm10
++DB	102,15,56,222,249
++	movups	xmm1,XMMWORD[((-64))+rcx]
++
++	movdqa	xmm14,xmm9
++DB	102,15,56,222,208
++	paddd	xmm9,xmm9
++	pxor	xmm10,xmm15
++DB	102,15,56,222,216
++	psrad	xmm14,31
++	paddq	xmm15,xmm15
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++	pand	xmm14,xmm8
++	movaps	xmm12,xmm11
++DB	102,15,56,222,240
++	pxor	xmm15,xmm14
++	movdqa	xmm14,xmm9
++DB	102,15,56,222,248
++	movups	xmm0,XMMWORD[((-48))+rcx]
++
++	paddd	xmm9,xmm9
++DB	102,15,56,222,209
++	pxor	xmm11,xmm15
++	psrad	xmm14,31
++DB	102,15,56,222,217
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++	movdqa	XMMWORD[48+rsp],xmm13
++	pxor	xmm15,xmm14
++DB	102,15,56,222,241
++	movaps	xmm13,xmm12
++	movdqa	xmm14,xmm9
++DB	102,15,56,222,249
++	movups	xmm1,XMMWORD[((-32))+rcx]
++
++	paddd	xmm9,xmm9
++DB	102,15,56,222,208
++	pxor	xmm12,xmm15
++	psrad	xmm14,31
++DB	102,15,56,222,216
++	paddq	xmm15,xmm15
++	pand	xmm14,xmm8
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++	pxor	xmm15,xmm14
++	movaps	xmm14,xmm13
++DB	102,15,56,222,248
++
++	movdqa	xmm0,xmm9
++	paddd	xmm9,xmm9
++DB	102,15,56,222,209
++	pxor	xmm13,xmm15
++	psrad	xmm0,31
++DB	102,15,56,222,217
++	paddq	xmm15,xmm15
++	pand	xmm0,xmm8
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++	pxor	xmm15,xmm0
++	movups	xmm0,XMMWORD[r11]
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++	movups	xmm1,XMMWORD[16+r11]
++
++	pxor	xmm14,xmm15
++DB	102,15,56,223,84,36,0
++	psrad	xmm9,31
++	paddq	xmm15,xmm15
++DB	102,15,56,223,92,36,16
++DB	102,15,56,223,100,36,32
++	pand	xmm9,xmm8
++	mov	rax,r10
++DB	102,15,56,223,108,36,48
++DB	102,15,56,223,116,36,64
++DB	102,15,56,223,124,36,80
++	pxor	xmm15,xmm9
++
++	lea	rsi,[96+rsi]
++	movups	XMMWORD[(-96)+rsi],xmm2
++	movups	XMMWORD[(-80)+rsi],xmm3
++	movups	XMMWORD[(-64)+rsi],xmm4
++	movups	XMMWORD[(-48)+rsi],xmm5
++	movups	XMMWORD[(-32)+rsi],xmm6
++	movups	XMMWORD[(-16)+rsi],xmm7
++	sub	rdx,16*6
++	jnc	NEAR $L$xts_dec_grandloop
++
++	mov	eax,16+96
++	sub	eax,r10d
++	mov	rcx,r11
++	shr	eax,4
++
++$L$xts_dec_short:
++
++	mov	r10d,eax
++	pxor	xmm10,xmm0
++	pxor	xmm11,xmm0
++	add	rdx,16*6
++	jz	NEAR $L$xts_dec_done
++
++	pxor	xmm12,xmm0
++	cmp	rdx,0x20
++	jb	NEAR $L$xts_dec_one
++	pxor	xmm13,xmm0
++	je	NEAR $L$xts_dec_two
++
++	pxor	xmm14,xmm0
++	cmp	rdx,0x40
++	jb	NEAR $L$xts_dec_three
++	je	NEAR $L$xts_dec_four
++
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movdqu	xmm4,XMMWORD[32+rdi]
++	pxor	xmm2,xmm10
++	movdqu	xmm5,XMMWORD[48+rdi]
++	pxor	xmm3,xmm11
++	movdqu	xmm6,XMMWORD[64+rdi]
++	lea	rdi,[80+rdi]
++	pxor	xmm4,xmm12
++	pxor	xmm5,xmm13
++	pxor	xmm6,xmm14
++
++	call	_aesni_decrypt6
++
++	xorps	xmm2,xmm10
++	xorps	xmm3,xmm11
++	xorps	xmm4,xmm12
++	movdqu	XMMWORD[rsi],xmm2
++	xorps	xmm5,xmm13
++	movdqu	XMMWORD[16+rsi],xmm3
++	xorps	xmm6,xmm14
++	movdqu	XMMWORD[32+rsi],xmm4
++	pxor	xmm14,xmm14
++	movdqu	XMMWORD[48+rsi],xmm5
++	pcmpgtd	xmm14,xmm15
++	movdqu	XMMWORD[64+rsi],xmm6
++	lea	rsi,[80+rsi]
++	pshufd	xmm11,xmm14,0x13
++	and	r9,15
++	jz	NEAR $L$xts_dec_ret
++
++	movdqa	xmm10,xmm15
++	paddq	xmm15,xmm15
++	pand	xmm11,xmm8
++	pxor	xmm11,xmm15
++	jmp	NEAR $L$xts_dec_done2
++
++ALIGN	16
++$L$xts_dec_one:
++	movups	xmm2,XMMWORD[rdi]
++	lea	rdi,[16+rdi]
++	xorps	xmm2,xmm10
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_dec1_12:
++DB	102,15,56,222,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_dec1_12
++DB	102,15,56,223,209
++	xorps	xmm2,xmm10
++	movdqa	xmm10,xmm11
++	movups	XMMWORD[rsi],xmm2
++	movdqa	xmm11,xmm12
++	lea	rsi,[16+rsi]
++	jmp	NEAR $L$xts_dec_done
++
++ALIGN	16
++$L$xts_dec_two:
++	movups	xmm2,XMMWORD[rdi]
++	movups	xmm3,XMMWORD[16+rdi]
++	lea	rdi,[32+rdi]
++	xorps	xmm2,xmm10
++	xorps	xmm3,xmm11
++
++	call	_aesni_decrypt2
++
++	xorps	xmm2,xmm10
++	movdqa	xmm10,xmm12
++	xorps	xmm3,xmm11
++	movdqa	xmm11,xmm13
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	lea	rsi,[32+rsi]
++	jmp	NEAR $L$xts_dec_done
++
++ALIGN	16
++$L$xts_dec_three:
++	movups	xmm2,XMMWORD[rdi]
++	movups	xmm3,XMMWORD[16+rdi]
++	movups	xmm4,XMMWORD[32+rdi]
++	lea	rdi,[48+rdi]
++	xorps	xmm2,xmm10
++	xorps	xmm3,xmm11
++	xorps	xmm4,xmm12
++
++	call	_aesni_decrypt3
++
++	xorps	xmm2,xmm10
++	movdqa	xmm10,xmm13
++	xorps	xmm3,xmm11
++	movdqa	xmm11,xmm14
++	xorps	xmm4,xmm12
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	lea	rsi,[48+rsi]
++	jmp	NEAR $L$xts_dec_done
++
++ALIGN	16
++$L$xts_dec_four:
++	movups	xmm2,XMMWORD[rdi]
++	movups	xmm3,XMMWORD[16+rdi]
++	movups	xmm4,XMMWORD[32+rdi]
++	xorps	xmm2,xmm10
++	movups	xmm5,XMMWORD[48+rdi]
++	lea	rdi,[64+rdi]
++	xorps	xmm3,xmm11
++	xorps	xmm4,xmm12
++	xorps	xmm5,xmm13
++
++	call	_aesni_decrypt4
++
++	pxor	xmm2,xmm10
++	movdqa	xmm10,xmm14
++	pxor	xmm3,xmm11
++	movdqa	xmm11,xmm15
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[rsi],xmm2
++	pxor	xmm5,xmm13
++	movdqu	XMMWORD[16+rsi],xmm3
++	movdqu	XMMWORD[32+rsi],xmm4
++	movdqu	XMMWORD[48+rsi],xmm5
++	lea	rsi,[64+rsi]
++	jmp	NEAR $L$xts_dec_done
++
++ALIGN	16
++$L$xts_dec_done:
++	and	r9,15
++	jz	NEAR $L$xts_dec_ret
++$L$xts_dec_done2:
++	mov	rdx,r9
++	mov	rcx,r11
++	mov	eax,r10d
++
++	movups	xmm2,XMMWORD[rdi]
++	xorps	xmm2,xmm11
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_dec1_13:
++DB	102,15,56,222,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_dec1_13
++DB	102,15,56,223,209
++	xorps	xmm2,xmm11
++	movups	XMMWORD[rsi],xmm2
++
++$L$xts_dec_steal:
++	movzx	eax,BYTE[16+rdi]
++	movzx	ecx,BYTE[rsi]
++	lea	rdi,[1+rdi]
++	mov	BYTE[rsi],al
++	mov	BYTE[16+rsi],cl
++	lea	rsi,[1+rsi]
++	sub	rdx,1
++	jnz	NEAR $L$xts_dec_steal
++
++	sub	rsi,r9
++	mov	rcx,r11
++	mov	eax,r10d
++
++	movups	xmm2,XMMWORD[rsi]
++	xorps	xmm2,xmm10
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_dec1_14:
++DB	102,15,56,222,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_dec1_14
++DB	102,15,56,223,209
++	xorps	xmm2,xmm10
++	movups	XMMWORD[rsi],xmm2
++
++$L$xts_dec_ret:
++	xorps	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	movaps	xmm6,XMMWORD[((-160))+rbp]
++	movaps	XMMWORD[(-160)+rbp],xmm0
++	movaps	xmm7,XMMWORD[((-144))+rbp]
++	movaps	XMMWORD[(-144)+rbp],xmm0
++	movaps	xmm8,XMMWORD[((-128))+rbp]
++	movaps	XMMWORD[(-128)+rbp],xmm0
++	movaps	xmm9,XMMWORD[((-112))+rbp]
++	movaps	XMMWORD[(-112)+rbp],xmm0
++	movaps	xmm10,XMMWORD[((-96))+rbp]
++	movaps	XMMWORD[(-96)+rbp],xmm0
++	movaps	xmm11,XMMWORD[((-80))+rbp]
++	movaps	XMMWORD[(-80)+rbp],xmm0
++	movaps	xmm12,XMMWORD[((-64))+rbp]
++	movaps	XMMWORD[(-64)+rbp],xmm0
++	movaps	xmm13,XMMWORD[((-48))+rbp]
++	movaps	XMMWORD[(-48)+rbp],xmm0
++	movaps	xmm14,XMMWORD[((-32))+rbp]
++	movaps	XMMWORD[(-32)+rbp],xmm0
++	movaps	xmm15,XMMWORD[((-16))+rbp]
++	movaps	XMMWORD[(-16)+rbp],xmm0
++	movaps	XMMWORD[rsp],xmm0
++	movaps	XMMWORD[16+rsp],xmm0
++	movaps	XMMWORD[32+rsp],xmm0
++	movaps	XMMWORD[48+rsp],xmm0
++	movaps	XMMWORD[64+rsp],xmm0
++	movaps	XMMWORD[80+rsp],xmm0
++	movaps	XMMWORD[96+rsp],xmm0
++	lea	rsp,[rbp]
++	pop	rbp
++$L$xts_dec_epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_xts_decrypt:
++global	aesni_ocb_encrypt
++
++ALIGN	32
++aesni_ocb_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_ocb_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	lea	rax,[rsp]
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	lea	rsp,[((-160))+rsp]
++	movaps	XMMWORD[rsp],xmm6
++	movaps	XMMWORD[16+rsp],xmm7
++	movaps	XMMWORD[32+rsp],xmm8
++	movaps	XMMWORD[48+rsp],xmm9
++	movaps	XMMWORD[64+rsp],xmm10
++	movaps	XMMWORD[80+rsp],xmm11
++	movaps	XMMWORD[96+rsp],xmm12
++	movaps	XMMWORD[112+rsp],xmm13
++	movaps	XMMWORD[128+rsp],xmm14
++	movaps	XMMWORD[144+rsp],xmm15
++$L$ocb_enc_body:
++	mov	rbx,QWORD[56+rax]
++	mov	rbp,QWORD[((56+8))+rax]
++
++	mov	r10d,DWORD[240+rcx]
++	mov	r11,rcx
++	shl	r10d,4
++	movups	xmm9,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+r10*1+rcx]
++
++	movdqu	xmm15,XMMWORD[r9]
++	pxor	xmm9,xmm1
++	pxor	xmm15,xmm1
++
++	mov	eax,16+32
++	lea	rcx,[32+r10*1+r11]
++	movups	xmm1,XMMWORD[16+r11]
++	sub	rax,r10
++	mov	r10,rax
++
++	movdqu	xmm10,XMMWORD[rbx]
++	movdqu	xmm8,XMMWORD[rbp]
++
++	test	r8,1
++	jnz	NEAR $L$ocb_enc_odd
++
++	bsf	r12,r8
++	add	r8,1
++	shl	r12,4
++	movdqu	xmm7,XMMWORD[r12*1+rbx]
++	movdqu	xmm2,XMMWORD[rdi]
++	lea	rdi,[16+rdi]
++
++	call	__ocb_encrypt1
++
++	movdqa	xmm15,xmm7
++	movups	XMMWORD[rsi],xmm2
++	lea	rsi,[16+rsi]
++	sub	rdx,1
++	jz	NEAR $L$ocb_enc_done
++
++$L$ocb_enc_odd:
++	lea	r12,[1+r8]
++	lea	r13,[3+r8]
++	lea	r14,[5+r8]
++	lea	r8,[6+r8]
++	bsf	r12,r12
++	bsf	r13,r13
++	bsf	r14,r14
++	shl	r12,4
++	shl	r13,4
++	shl	r14,4
++
++	sub	rdx,6
++	jc	NEAR $L$ocb_enc_short
++	jmp	NEAR $L$ocb_enc_grandloop
++
++ALIGN	32
++$L$ocb_enc_grandloop:
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movdqu	xmm4,XMMWORD[32+rdi]
++	movdqu	xmm5,XMMWORD[48+rdi]
++	movdqu	xmm6,XMMWORD[64+rdi]
++	movdqu	xmm7,XMMWORD[80+rdi]
++	lea	rdi,[96+rdi]
++
++	call	__ocb_encrypt6
++
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	movups	XMMWORD[80+rsi],xmm7
++	lea	rsi,[96+rsi]
++	sub	rdx,6
++	jnc	NEAR $L$ocb_enc_grandloop
++
++$L$ocb_enc_short:
++	add	rdx,6
++	jz	NEAR $L$ocb_enc_done
++
++	movdqu	xmm2,XMMWORD[rdi]
++	cmp	rdx,2
++	jb	NEAR $L$ocb_enc_one
++	movdqu	xmm3,XMMWORD[16+rdi]
++	je	NEAR $L$ocb_enc_two
++
++	movdqu	xmm4,XMMWORD[32+rdi]
++	cmp	rdx,4
++	jb	NEAR $L$ocb_enc_three
++	movdqu	xmm5,XMMWORD[48+rdi]
++	je	NEAR $L$ocb_enc_four
++
++	movdqu	xmm6,XMMWORD[64+rdi]
++	pxor	xmm7,xmm7
++
++	call	__ocb_encrypt6
++
++	movdqa	xmm15,xmm14
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	movups	XMMWORD[64+rsi],xmm6
++
++	jmp	NEAR $L$ocb_enc_done
++
++ALIGN	16
++$L$ocb_enc_one:
++	movdqa	xmm7,xmm10
++
++	call	__ocb_encrypt1
++
++	movdqa	xmm15,xmm7
++	movups	XMMWORD[rsi],xmm2
++	jmp	NEAR $L$ocb_enc_done
++
++ALIGN	16
++$L$ocb_enc_two:
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++
++	call	__ocb_encrypt4
++
++	movdqa	xmm15,xmm11
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++
++	jmp	NEAR $L$ocb_enc_done
++
++ALIGN	16
++$L$ocb_enc_three:
++	pxor	xmm5,xmm5
++
++	call	__ocb_encrypt4
++
++	movdqa	xmm15,xmm12
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++
++	jmp	NEAR $L$ocb_enc_done
++
++ALIGN	16
++$L$ocb_enc_four:
++	call	__ocb_encrypt4
++
++	movdqa	xmm15,xmm13
++	movups	XMMWORD[rsi],xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	movups	XMMWORD[48+rsi],xmm5
++
++$L$ocb_enc_done:
++	pxor	xmm15,xmm0
++	movdqu	XMMWORD[rbp],xmm8
++	movdqu	XMMWORD[r9],xmm15
++
++	xorps	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	movaps	xmm6,XMMWORD[rsp]
++	movaps	XMMWORD[rsp],xmm0
++	movaps	xmm7,XMMWORD[16+rsp]
++	movaps	XMMWORD[16+rsp],xmm0
++	movaps	xmm8,XMMWORD[32+rsp]
++	movaps	XMMWORD[32+rsp],xmm0
++	movaps	xmm9,XMMWORD[48+rsp]
++	movaps	XMMWORD[48+rsp],xmm0
++	movaps	xmm10,XMMWORD[64+rsp]
++	movaps	XMMWORD[64+rsp],xmm0
++	movaps	xmm11,XMMWORD[80+rsp]
++	movaps	XMMWORD[80+rsp],xmm0
++	movaps	xmm12,XMMWORD[96+rsp]
++	movaps	XMMWORD[96+rsp],xmm0
++	movaps	xmm13,XMMWORD[112+rsp]
++	movaps	XMMWORD[112+rsp],xmm0
++	movaps	xmm14,XMMWORD[128+rsp]
++	movaps	XMMWORD[128+rsp],xmm0
++	movaps	xmm15,XMMWORD[144+rsp]
++	movaps	XMMWORD[144+rsp],xmm0
++	lea	rax,[((160+40))+rsp]
++$L$ocb_enc_pop:
++	lea	rsp,[160+rsp]
++	pop	r14
++	pop	r13
++	pop	r12
++	pop	rbp
++	pop	rbx
++$L$ocb_enc_epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_ocb_encrypt:
++
++
++ALIGN	32
++__ocb_encrypt6:
++	pxor	xmm15,xmm9
++	movdqu	xmm11,XMMWORD[r12*1+rbx]
++	movdqa	xmm12,xmm10
++	movdqu	xmm13,XMMWORD[r13*1+rbx]
++	movdqa	xmm14,xmm10
++	pxor	xmm10,xmm15
++	movdqu	xmm15,XMMWORD[r14*1+rbx]
++	pxor	xmm11,xmm10
++	pxor	xmm8,xmm2
++	pxor	xmm2,xmm10
++	pxor	xmm12,xmm11
++	pxor	xmm8,xmm3
++	pxor	xmm3,xmm11
++	pxor	xmm13,xmm12
++	pxor	xmm8,xmm4
++	pxor	xmm4,xmm12
++	pxor	xmm14,xmm13
++	pxor	xmm8,xmm5
++	pxor	xmm5,xmm13
++	pxor	xmm15,xmm14
++	pxor	xmm8,xmm6
++	pxor	xmm6,xmm14
++	pxor	xmm8,xmm7
++	pxor	xmm7,xmm15
++	movups	xmm0,XMMWORD[32+r11]
++
++	lea	r12,[1+r8]
++	lea	r13,[3+r8]
++	lea	r14,[5+r8]
++	add	r8,6
++	pxor	xmm10,xmm9
++	bsf	r12,r12
++	bsf	r13,r13
++	bsf	r14,r14
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	pxor	xmm11,xmm9
++	pxor	xmm12,xmm9
++DB	102,15,56,220,241
++	pxor	xmm13,xmm9
++	pxor	xmm14,xmm9
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[48+r11]
++	pxor	xmm15,xmm9
++
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++	movups	xmm0,XMMWORD[64+r11]
++	shl	r12,4
++	shl	r13,4
++	jmp	NEAR $L$ocb_enc_loop6
++
++ALIGN	32
++$L$ocb_enc_loop6:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++DB	102,15,56,220,240
++DB	102,15,56,220,248
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$ocb_enc_loop6
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++DB	102,15,56,220,241
++DB	102,15,56,220,249
++	movups	xmm1,XMMWORD[16+r11]
++	shl	r14,4
++
++DB	102,65,15,56,221,210
++	movdqu	xmm10,XMMWORD[rbx]
++	mov	rax,r10
++DB	102,65,15,56,221,219
++DB	102,65,15,56,221,228
++DB	102,65,15,56,221,237
++DB	102,65,15,56,221,246
++DB	102,65,15,56,221,255
++	DB	0F3h,0C3h		;repret
++
++
++
++ALIGN	32
++__ocb_encrypt4:
++	pxor	xmm15,xmm9
++	movdqu	xmm11,XMMWORD[r12*1+rbx]
++	movdqa	xmm12,xmm10
++	movdqu	xmm13,XMMWORD[r13*1+rbx]
++	pxor	xmm10,xmm15
++	pxor	xmm11,xmm10
++	pxor	xmm8,xmm2
++	pxor	xmm2,xmm10
++	pxor	xmm12,xmm11
++	pxor	xmm8,xmm3
++	pxor	xmm3,xmm11
++	pxor	xmm13,xmm12
++	pxor	xmm8,xmm4
++	pxor	xmm4,xmm12
++	pxor	xmm8,xmm5
++	pxor	xmm5,xmm13
++	movups	xmm0,XMMWORD[32+r11]
++
++	pxor	xmm10,xmm9
++	pxor	xmm11,xmm9
++	pxor	xmm12,xmm9
++	pxor	xmm13,xmm9
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	movups	xmm1,XMMWORD[48+r11]
++
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++	movups	xmm0,XMMWORD[64+r11]
++	jmp	NEAR $L$ocb_enc_loop4
++
++ALIGN	32
++$L$ocb_enc_loop4:
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++
++DB	102,15,56,220,208
++DB	102,15,56,220,216
++DB	102,15,56,220,224
++DB	102,15,56,220,232
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$ocb_enc_loop4
++
++DB	102,15,56,220,209
++DB	102,15,56,220,217
++DB	102,15,56,220,225
++DB	102,15,56,220,233
++	movups	xmm1,XMMWORD[16+r11]
++	mov	rax,r10
++
++DB	102,65,15,56,221,210
++DB	102,65,15,56,221,219
++DB	102,65,15,56,221,228
++DB	102,65,15,56,221,237
++	DB	0F3h,0C3h		;repret
++
++
++
++ALIGN	32
++__ocb_encrypt1:
++	pxor	xmm7,xmm15
++	pxor	xmm7,xmm9
++	pxor	xmm8,xmm2
++	pxor	xmm2,xmm7
++	movups	xmm0,XMMWORD[32+r11]
++
++DB	102,15,56,220,209
++	movups	xmm1,XMMWORD[48+r11]
++	pxor	xmm7,xmm9
++
++DB	102,15,56,220,208
++	movups	xmm0,XMMWORD[64+r11]
++	jmp	NEAR $L$ocb_enc_loop1
++
++ALIGN	32
++$L$ocb_enc_loop1:
++DB	102,15,56,220,209
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++
++DB	102,15,56,220,208
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$ocb_enc_loop1
++
++DB	102,15,56,220,209
++	movups	xmm1,XMMWORD[16+r11]
++	mov	rax,r10
++
++DB	102,15,56,221,215
++	DB	0F3h,0C3h		;repret
++
++
++global	aesni_ocb_decrypt
++
++ALIGN	32
++aesni_ocb_decrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_ocb_decrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	lea	rax,[rsp]
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	lea	rsp,[((-160))+rsp]
++	movaps	XMMWORD[rsp],xmm6
++	movaps	XMMWORD[16+rsp],xmm7
++	movaps	XMMWORD[32+rsp],xmm8
++	movaps	XMMWORD[48+rsp],xmm9
++	movaps	XMMWORD[64+rsp],xmm10
++	movaps	XMMWORD[80+rsp],xmm11
++	movaps	XMMWORD[96+rsp],xmm12
++	movaps	XMMWORD[112+rsp],xmm13
++	movaps	XMMWORD[128+rsp],xmm14
++	movaps	XMMWORD[144+rsp],xmm15
++$L$ocb_dec_body:
++	mov	rbx,QWORD[56+rax]
++	mov	rbp,QWORD[((56+8))+rax]
++
++	mov	r10d,DWORD[240+rcx]
++	mov	r11,rcx
++	shl	r10d,4
++	movups	xmm9,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+r10*1+rcx]
++
++	movdqu	xmm15,XMMWORD[r9]
++	pxor	xmm9,xmm1
++	pxor	xmm15,xmm1
++
++	mov	eax,16+32
++	lea	rcx,[32+r10*1+r11]
++	movups	xmm1,XMMWORD[16+r11]
++	sub	rax,r10
++	mov	r10,rax
++
++	movdqu	xmm10,XMMWORD[rbx]
++	movdqu	xmm8,XMMWORD[rbp]
++
++	test	r8,1
++	jnz	NEAR $L$ocb_dec_odd
++
++	bsf	r12,r8
++	add	r8,1
++	shl	r12,4
++	movdqu	xmm7,XMMWORD[r12*1+rbx]
++	movdqu	xmm2,XMMWORD[rdi]
++	lea	rdi,[16+rdi]
++
++	call	__ocb_decrypt1
++
++	movdqa	xmm15,xmm7
++	movups	XMMWORD[rsi],xmm2
++	xorps	xmm8,xmm2
++	lea	rsi,[16+rsi]
++	sub	rdx,1
++	jz	NEAR $L$ocb_dec_done
++
++$L$ocb_dec_odd:
++	lea	r12,[1+r8]
++	lea	r13,[3+r8]
++	lea	r14,[5+r8]
++	lea	r8,[6+r8]
++	bsf	r12,r12
++	bsf	r13,r13
++	bsf	r14,r14
++	shl	r12,4
++	shl	r13,4
++	shl	r14,4
++
++	sub	rdx,6
++	jc	NEAR $L$ocb_dec_short
++	jmp	NEAR $L$ocb_dec_grandloop
++
++ALIGN	32
++$L$ocb_dec_grandloop:
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movdqu	xmm4,XMMWORD[32+rdi]
++	movdqu	xmm5,XMMWORD[48+rdi]
++	movdqu	xmm6,XMMWORD[64+rdi]
++	movdqu	xmm7,XMMWORD[80+rdi]
++	lea	rdi,[96+rdi]
++
++	call	__ocb_decrypt6
++
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm8,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm8,xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	pxor	xmm8,xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	pxor	xmm8,xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	pxor	xmm8,xmm6
++	movups	XMMWORD[80+rsi],xmm7
++	pxor	xmm8,xmm7
++	lea	rsi,[96+rsi]
++	sub	rdx,6
++	jnc	NEAR $L$ocb_dec_grandloop
++
++$L$ocb_dec_short:
++	add	rdx,6
++	jz	NEAR $L$ocb_dec_done
++
++	movdqu	xmm2,XMMWORD[rdi]
++	cmp	rdx,2
++	jb	NEAR $L$ocb_dec_one
++	movdqu	xmm3,XMMWORD[16+rdi]
++	je	NEAR $L$ocb_dec_two
++
++	movdqu	xmm4,XMMWORD[32+rdi]
++	cmp	rdx,4
++	jb	NEAR $L$ocb_dec_three
++	movdqu	xmm5,XMMWORD[48+rdi]
++	je	NEAR $L$ocb_dec_four
++
++	movdqu	xmm6,XMMWORD[64+rdi]
++	pxor	xmm7,xmm7
++
++	call	__ocb_decrypt6
++
++	movdqa	xmm15,xmm14
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm8,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm8,xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	pxor	xmm8,xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	pxor	xmm8,xmm5
++	movups	XMMWORD[64+rsi],xmm6
++	pxor	xmm8,xmm6
++
++	jmp	NEAR $L$ocb_dec_done
++
++ALIGN	16
++$L$ocb_dec_one:
++	movdqa	xmm7,xmm10
++
++	call	__ocb_decrypt1
++
++	movdqa	xmm15,xmm7
++	movups	XMMWORD[rsi],xmm2
++	xorps	xmm8,xmm2
++	jmp	NEAR $L$ocb_dec_done
++
++ALIGN	16
++$L$ocb_dec_two:
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++
++	call	__ocb_decrypt4
++
++	movdqa	xmm15,xmm11
++	movups	XMMWORD[rsi],xmm2
++	xorps	xmm8,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	xorps	xmm8,xmm3
++
++	jmp	NEAR $L$ocb_dec_done
++
++ALIGN	16
++$L$ocb_dec_three:
++	pxor	xmm5,xmm5
++
++	call	__ocb_decrypt4
++
++	movdqa	xmm15,xmm12
++	movups	XMMWORD[rsi],xmm2
++	xorps	xmm8,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	xorps	xmm8,xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	xorps	xmm8,xmm4
++
++	jmp	NEAR $L$ocb_dec_done
++
++ALIGN	16
++$L$ocb_dec_four:
++	call	__ocb_decrypt4
++
++	movdqa	xmm15,xmm13
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm8,xmm2
++	movups	XMMWORD[16+rsi],xmm3
++	pxor	xmm8,xmm3
++	movups	XMMWORD[32+rsi],xmm4
++	pxor	xmm8,xmm4
++	movups	XMMWORD[48+rsi],xmm5
++	pxor	xmm8,xmm5
++
++$L$ocb_dec_done:
++	pxor	xmm15,xmm0
++	movdqu	XMMWORD[rbp],xmm8
++	movdqu	XMMWORD[r9],xmm15
++
++	xorps	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	movaps	xmm6,XMMWORD[rsp]
++	movaps	XMMWORD[rsp],xmm0
++	movaps	xmm7,XMMWORD[16+rsp]
++	movaps	XMMWORD[16+rsp],xmm0
++	movaps	xmm8,XMMWORD[32+rsp]
++	movaps	XMMWORD[32+rsp],xmm0
++	movaps	xmm9,XMMWORD[48+rsp]
++	movaps	XMMWORD[48+rsp],xmm0
++	movaps	xmm10,XMMWORD[64+rsp]
++	movaps	XMMWORD[64+rsp],xmm0
++	movaps	xmm11,XMMWORD[80+rsp]
++	movaps	XMMWORD[80+rsp],xmm0
++	movaps	xmm12,XMMWORD[96+rsp]
++	movaps	XMMWORD[96+rsp],xmm0
++	movaps	xmm13,XMMWORD[112+rsp]
++	movaps	XMMWORD[112+rsp],xmm0
++	movaps	xmm14,XMMWORD[128+rsp]
++	movaps	XMMWORD[128+rsp],xmm0
++	movaps	xmm15,XMMWORD[144+rsp]
++	movaps	XMMWORD[144+rsp],xmm0
++	lea	rax,[((160+40))+rsp]
++$L$ocb_dec_pop:
++	lea	rsp,[160+rsp]
++	pop	r14
++	pop	r13
++	pop	r12
++	pop	rbp
++	pop	rbx
++$L$ocb_dec_epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_ocb_decrypt:
++
++
++ALIGN	32
++__ocb_decrypt6:
++	pxor	xmm15,xmm9
++	movdqu	xmm11,XMMWORD[r12*1+rbx]
++	movdqa	xmm12,xmm10
++	movdqu	xmm13,XMMWORD[r13*1+rbx]
++	movdqa	xmm14,xmm10
++	pxor	xmm10,xmm15
++	movdqu	xmm15,XMMWORD[r14*1+rbx]
++	pxor	xmm11,xmm10
++	pxor	xmm2,xmm10
++	pxor	xmm12,xmm11
++	pxor	xmm3,xmm11
++	pxor	xmm13,xmm12
++	pxor	xmm4,xmm12
++	pxor	xmm14,xmm13
++	pxor	xmm5,xmm13
++	pxor	xmm15,xmm14
++	pxor	xmm6,xmm14
++	pxor	xmm7,xmm15
++	movups	xmm0,XMMWORD[32+r11]
++
++	lea	r12,[1+r8]
++	lea	r13,[3+r8]
++	lea	r14,[5+r8]
++	add	r8,6
++	pxor	xmm10,xmm9
++	bsf	r12,r12
++	bsf	r13,r13
++	bsf	r14,r14
++
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++	pxor	xmm11,xmm9
++	pxor	xmm12,xmm9
++DB	102,15,56,222,241
++	pxor	xmm13,xmm9
++	pxor	xmm14,xmm9
++DB	102,15,56,222,249
++	movups	xmm1,XMMWORD[48+r11]
++	pxor	xmm15,xmm9
++
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++	movups	xmm0,XMMWORD[64+r11]
++	shl	r12,4
++	shl	r13,4
++	jmp	NEAR $L$ocb_dec_loop6
++
++ALIGN	32
++$L$ocb_dec_loop6:
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$ocb_dec_loop6
++
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++	movups	xmm1,XMMWORD[16+r11]
++	shl	r14,4
++
++DB	102,65,15,56,223,210
++	movdqu	xmm10,XMMWORD[rbx]
++	mov	rax,r10
++DB	102,65,15,56,223,219
++DB	102,65,15,56,223,228
++DB	102,65,15,56,223,237
++DB	102,65,15,56,223,246
++DB	102,65,15,56,223,255
++	DB	0F3h,0C3h		;repret
++
++
++
++ALIGN	32
++__ocb_decrypt4:
++	pxor	xmm15,xmm9
++	movdqu	xmm11,XMMWORD[r12*1+rbx]
++	movdqa	xmm12,xmm10
++	movdqu	xmm13,XMMWORD[r13*1+rbx]
++	pxor	xmm10,xmm15
++	pxor	xmm11,xmm10
++	pxor	xmm2,xmm10
++	pxor	xmm12,xmm11
++	pxor	xmm3,xmm11
++	pxor	xmm13,xmm12
++	pxor	xmm4,xmm12
++	pxor	xmm5,xmm13
++	movups	xmm0,XMMWORD[32+r11]
++
++	pxor	xmm10,xmm9
++	pxor	xmm11,xmm9
++	pxor	xmm12,xmm9
++	pxor	xmm13,xmm9
++
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++	movups	xmm1,XMMWORD[48+r11]
++
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++	movups	xmm0,XMMWORD[64+r11]
++	jmp	NEAR $L$ocb_dec_loop4
++
++ALIGN	32
++$L$ocb_dec_loop4:
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$ocb_dec_loop4
++
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++	movups	xmm1,XMMWORD[16+r11]
++	mov	rax,r10
++
++DB	102,65,15,56,223,210
++DB	102,65,15,56,223,219
++DB	102,65,15,56,223,228
++DB	102,65,15,56,223,237
++	DB	0F3h,0C3h		;repret
++
++
++
++ALIGN	32
++__ocb_decrypt1:
++	pxor	xmm7,xmm15
++	pxor	xmm7,xmm9
++	pxor	xmm2,xmm7
++	movups	xmm0,XMMWORD[32+r11]
++
++DB	102,15,56,222,209
++	movups	xmm1,XMMWORD[48+r11]
++	pxor	xmm7,xmm9
++
++DB	102,15,56,222,208
++	movups	xmm0,XMMWORD[64+r11]
++	jmp	NEAR $L$ocb_dec_loop1
++
++ALIGN	32
++$L$ocb_dec_loop1:
++DB	102,15,56,222,209
++	movups	xmm1,XMMWORD[rax*1+rcx]
++	add	rax,32
++
++DB	102,15,56,222,208
++	movups	xmm0,XMMWORD[((-16))+rax*1+rcx]
++	jnz	NEAR $L$ocb_dec_loop1
++
++DB	102,15,56,222,209
++	movups	xmm1,XMMWORD[16+r11]
++	mov	rax,r10
++
++DB	102,15,56,223,215
++	DB	0F3h,0C3h		;repret
++
++global	aesni_cbc_encrypt
++
++ALIGN	16
++aesni_cbc_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_aesni_cbc_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	test	rdx,rdx
++	jz	NEAR $L$cbc_ret
++
++	mov	r10d,DWORD[240+rcx]
++	mov	r11,rcx
++	test	r9d,r9d
++	jz	NEAR $L$cbc_decrypt
++
++	movups	xmm2,XMMWORD[r8]
++	mov	eax,r10d
++	cmp	rdx,16
++	jb	NEAR $L$cbc_enc_tail
++	sub	rdx,16
++	jmp	NEAR $L$cbc_enc_loop
++ALIGN	16
++$L$cbc_enc_loop:
++	movups	xmm3,XMMWORD[rdi]
++	lea	rdi,[16+rdi]
++
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	xorps	xmm3,xmm0
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm3
++$L$oop_enc1_15:
++DB	102,15,56,220,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_enc1_15
++DB	102,15,56,221,209
++	mov	eax,r10d
++	mov	rcx,r11
++	movups	XMMWORD[rsi],xmm2
++	lea	rsi,[16+rsi]
++	sub	rdx,16
++	jnc	NEAR $L$cbc_enc_loop
++	add	rdx,16
++	jnz	NEAR $L$cbc_enc_tail
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	movups	XMMWORD[r8],xmm2
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	jmp	NEAR $L$cbc_ret
++
++$L$cbc_enc_tail:
++	mov	rcx,rdx
++	xchg	rsi,rdi
++	DD	0x9066A4F3
++	mov	ecx,16
++	sub	rcx,rdx
++	xor	eax,eax
++	DD	0x9066AAF3
++	lea	rdi,[((-16))+rdi]
++	mov	eax,r10d
++	mov	rsi,rdi
++	mov	rcx,r11
++	xor	rdx,rdx
++	jmp	NEAR $L$cbc_enc_loop
++
++ALIGN	16
++$L$cbc_decrypt:
++	cmp	rdx,16
++	jne	NEAR $L$cbc_decrypt_bulk
++
++
++
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqu	xmm3,XMMWORD[r8]
++	movdqa	xmm4,xmm2
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_dec1_16:
++DB	102,15,56,222,209
++	dec	r10d
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_dec1_16
++DB	102,15,56,223,209
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	movdqu	XMMWORD[r8],xmm4
++	xorps	xmm2,xmm3
++	pxor	xmm3,xmm3
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	jmp	NEAR $L$cbc_ret
++ALIGN	16
++$L$cbc_decrypt_bulk:
++	lea	rax,[rsp]
++	push	rbp
++	sub	rsp,176
++	and	rsp,-16
++	movaps	XMMWORD[16+rsp],xmm6
++	movaps	XMMWORD[32+rsp],xmm7
++	movaps	XMMWORD[48+rsp],xmm8
++	movaps	XMMWORD[64+rsp],xmm9
++	movaps	XMMWORD[80+rsp],xmm10
++	movaps	XMMWORD[96+rsp],xmm11
++	movaps	XMMWORD[112+rsp],xmm12
++	movaps	XMMWORD[128+rsp],xmm13
++	movaps	XMMWORD[144+rsp],xmm14
++	movaps	XMMWORD[160+rsp],xmm15
++$L$cbc_decrypt_body:
++	lea	rbp,[((-8))+rax]
++	movups	xmm10,XMMWORD[r8]
++	mov	eax,r10d
++	cmp	rdx,0x50
++	jbe	NEAR $L$cbc_dec_tail
++
++	movups	xmm0,XMMWORD[rcx]
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movdqa	xmm11,xmm2
++	movdqu	xmm4,XMMWORD[32+rdi]
++	movdqa	xmm12,xmm3
++	movdqu	xmm5,XMMWORD[48+rdi]
++	movdqa	xmm13,xmm4
++	movdqu	xmm6,XMMWORD[64+rdi]
++	movdqa	xmm14,xmm5
++	movdqu	xmm7,XMMWORD[80+rdi]
++	movdqa	xmm15,xmm6
++	mov	r9d,DWORD[((_gnutls_x86_cpuid_s+4))]
++	cmp	rdx,0x70
++	jbe	NEAR $L$cbc_dec_six_or_seven
++
++	and	r9d,71303168
++	sub	rdx,0x50
++	cmp	r9d,4194304
++	je	NEAR $L$cbc_dec_loop6_enter
++	sub	rdx,0x20
++	lea	rcx,[112+rcx]
++	jmp	NEAR $L$cbc_dec_loop8_enter
++ALIGN	16
++$L$cbc_dec_loop8:
++	movups	XMMWORD[rsi],xmm9
++	lea	rsi,[16+rsi]
++$L$cbc_dec_loop8_enter:
++	movdqu	xmm8,XMMWORD[96+rdi]
++	pxor	xmm2,xmm0
++	movdqu	xmm9,XMMWORD[112+rdi]
++	pxor	xmm3,xmm0
++	movups	xmm1,XMMWORD[((16-112))+rcx]
++	pxor	xmm4,xmm0
++	xor	r11,r11
++	cmp	rdx,0x70
++	pxor	xmm5,xmm0
++	pxor	xmm6,xmm0
++	pxor	xmm7,xmm0
++	pxor	xmm8,xmm0
++
++DB	102,15,56,222,209
++	pxor	xmm9,xmm0
++	movups	xmm0,XMMWORD[((32-112))+rcx]
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++DB	102,68,15,56,222,193
++	setnc	r11b
++	shl	r11,7
++DB	102,68,15,56,222,201
++	add	r11,rdi
++	movups	xmm1,XMMWORD[((48-112))+rcx]
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++DB	102,68,15,56,222,192
++DB	102,68,15,56,222,200
++	movups	xmm0,XMMWORD[((64-112))+rcx]
++	nop
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++DB	102,68,15,56,222,193
++DB	102,68,15,56,222,201
++	movups	xmm1,XMMWORD[((80-112))+rcx]
++	nop
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++DB	102,68,15,56,222,192
++DB	102,68,15,56,222,200
++	movups	xmm0,XMMWORD[((96-112))+rcx]
++	nop
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++DB	102,68,15,56,222,193
++DB	102,68,15,56,222,201
++	movups	xmm1,XMMWORD[((112-112))+rcx]
++	nop
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++DB	102,68,15,56,222,192
++DB	102,68,15,56,222,200
++	movups	xmm0,XMMWORD[((128-112))+rcx]
++	nop
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++DB	102,68,15,56,222,193
++DB	102,68,15,56,222,201
++	movups	xmm1,XMMWORD[((144-112))+rcx]
++	cmp	eax,11
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++DB	102,68,15,56,222,192
++DB	102,68,15,56,222,200
++	movups	xmm0,XMMWORD[((160-112))+rcx]
++	jb	NEAR $L$cbc_dec_done
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++DB	102,68,15,56,222,193
++DB	102,68,15,56,222,201
++	movups	xmm1,XMMWORD[((176-112))+rcx]
++	nop
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++DB	102,68,15,56,222,192
++DB	102,68,15,56,222,200
++	movups	xmm0,XMMWORD[((192-112))+rcx]
++	je	NEAR $L$cbc_dec_done
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++DB	102,68,15,56,222,193
++DB	102,68,15,56,222,201
++	movups	xmm1,XMMWORD[((208-112))+rcx]
++	nop
++DB	102,15,56,222,208
++DB	102,15,56,222,216
++DB	102,15,56,222,224
++DB	102,15,56,222,232
++DB	102,15,56,222,240
++DB	102,15,56,222,248
++DB	102,68,15,56,222,192
++DB	102,68,15,56,222,200
++	movups	xmm0,XMMWORD[((224-112))+rcx]
++	jmp	NEAR $L$cbc_dec_done
++ALIGN	16
++$L$cbc_dec_done:
++DB	102,15,56,222,209
++DB	102,15,56,222,217
++	pxor	xmm10,xmm0
++	pxor	xmm11,xmm0
++DB	102,15,56,222,225
++DB	102,15,56,222,233
++	pxor	xmm12,xmm0
++	pxor	xmm13,xmm0
++DB	102,15,56,222,241
++DB	102,15,56,222,249
++	pxor	xmm14,xmm0
++	pxor	xmm15,xmm0
++DB	102,68,15,56,222,193
++DB	102,68,15,56,222,201
++	movdqu	xmm1,XMMWORD[80+rdi]
++
++DB	102,65,15,56,223,210
++	movdqu	xmm10,XMMWORD[96+rdi]
++	pxor	xmm1,xmm0
++DB	102,65,15,56,223,219
++	pxor	xmm10,xmm0
++	movdqu	xmm0,XMMWORD[112+rdi]
++DB	102,65,15,56,223,228
++	lea	rdi,[128+rdi]
++	movdqu	xmm11,XMMWORD[r11]
++DB	102,65,15,56,223,237
++DB	102,65,15,56,223,246
++	movdqu	xmm12,XMMWORD[16+r11]
++	movdqu	xmm13,XMMWORD[32+r11]
++DB	102,65,15,56,223,255
++DB	102,68,15,56,223,193
++	movdqu	xmm14,XMMWORD[48+r11]
++	movdqu	xmm15,XMMWORD[64+r11]
++DB	102,69,15,56,223,202
++	movdqa	xmm10,xmm0
++	movdqu	xmm1,XMMWORD[80+r11]
++	movups	xmm0,XMMWORD[((-112))+rcx]
++
++	movups	XMMWORD[rsi],xmm2
++	movdqa	xmm2,xmm11
++	movups	XMMWORD[16+rsi],xmm3
++	movdqa	xmm3,xmm12
++	movups	XMMWORD[32+rsi],xmm4
++	movdqa	xmm4,xmm13
++	movups	XMMWORD[48+rsi],xmm5
++	movdqa	xmm5,xmm14
++	movups	XMMWORD[64+rsi],xmm6
++	movdqa	xmm6,xmm15
++	movups	XMMWORD[80+rsi],xmm7
++	movdqa	xmm7,xmm1
++	movups	XMMWORD[96+rsi],xmm8
++	lea	rsi,[112+rsi]
++
++	sub	rdx,0x80
++	ja	NEAR $L$cbc_dec_loop8
++
++	movaps	xmm2,xmm9
++	lea	rcx,[((-112))+rcx]
++	add	rdx,0x70
++	jle	NEAR $L$cbc_dec_clear_tail_collected
++	movups	XMMWORD[rsi],xmm9
++	lea	rsi,[16+rsi]
++	cmp	rdx,0x50
++	jbe	NEAR $L$cbc_dec_tail
++
++	movaps	xmm2,xmm11
++$L$cbc_dec_six_or_seven:
++	cmp	rdx,0x60
++	ja	NEAR $L$cbc_dec_seven
++
++	movaps	xmm8,xmm7
++	call	_aesni_decrypt6
++	pxor	xmm2,xmm10
++	movaps	xmm10,xmm8
++	pxor	xmm3,xmm11
++	movdqu	XMMWORD[rsi],xmm2
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	pxor	xmm5,xmm13
++	movdqu	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	pxor	xmm6,xmm14
++	movdqu	XMMWORD[48+rsi],xmm5
++	pxor	xmm5,xmm5
++	pxor	xmm7,xmm15
++	movdqu	XMMWORD[64+rsi],xmm6
++	pxor	xmm6,xmm6
++	lea	rsi,[80+rsi]
++	movdqa	xmm2,xmm7
++	pxor	xmm7,xmm7
++	jmp	NEAR $L$cbc_dec_tail_collected
++
++ALIGN	16
++$L$cbc_dec_seven:
++	movups	xmm8,XMMWORD[96+rdi]
++	xorps	xmm9,xmm9
++	call	_aesni_decrypt8
++	movups	xmm9,XMMWORD[80+rdi]
++	pxor	xmm2,xmm10
++	movups	xmm10,XMMWORD[96+rdi]
++	pxor	xmm3,xmm11
++	movdqu	XMMWORD[rsi],xmm2
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	pxor	xmm5,xmm13
++	movdqu	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	pxor	xmm6,xmm14
++	movdqu	XMMWORD[48+rsi],xmm5
++	pxor	xmm5,xmm5
++	pxor	xmm7,xmm15
++	movdqu	XMMWORD[64+rsi],xmm6
++	pxor	xmm6,xmm6
++	pxor	xmm8,xmm9
++	movdqu	XMMWORD[80+rsi],xmm7
++	pxor	xmm7,xmm7
++	lea	rsi,[96+rsi]
++	movdqa	xmm2,xmm8
++	pxor	xmm8,xmm8
++	pxor	xmm9,xmm9
++	jmp	NEAR $L$cbc_dec_tail_collected
++
++ALIGN	16
++$L$cbc_dec_loop6:
++	movups	XMMWORD[rsi],xmm7
++	lea	rsi,[16+rsi]
++	movdqu	xmm2,XMMWORD[rdi]
++	movdqu	xmm3,XMMWORD[16+rdi]
++	movdqa	xmm11,xmm2
++	movdqu	xmm4,XMMWORD[32+rdi]
++	movdqa	xmm12,xmm3
++	movdqu	xmm5,XMMWORD[48+rdi]
++	movdqa	xmm13,xmm4
++	movdqu	xmm6,XMMWORD[64+rdi]
++	movdqa	xmm14,xmm5
++	movdqu	xmm7,XMMWORD[80+rdi]
++	movdqa	xmm15,xmm6
++$L$cbc_dec_loop6_enter:
++	lea	rdi,[96+rdi]
++	movdqa	xmm8,xmm7
++
++	call	_aesni_decrypt6
++
++	pxor	xmm2,xmm10
++	movdqa	xmm10,xmm8
++	pxor	xmm3,xmm11
++	movdqu	XMMWORD[rsi],xmm2
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[16+rsi],xmm3
++	pxor	xmm5,xmm13
++	movdqu	XMMWORD[32+rsi],xmm4
++	pxor	xmm6,xmm14
++	mov	rcx,r11
++	movdqu	XMMWORD[48+rsi],xmm5
++	pxor	xmm7,xmm15
++	mov	eax,r10d
++	movdqu	XMMWORD[64+rsi],xmm6
++	lea	rsi,[80+rsi]
++	sub	rdx,0x60
++	ja	NEAR $L$cbc_dec_loop6
++
++	movdqa	xmm2,xmm7
++	add	rdx,0x50
++	jle	NEAR $L$cbc_dec_clear_tail_collected
++	movups	XMMWORD[rsi],xmm7
++	lea	rsi,[16+rsi]
++
++$L$cbc_dec_tail:
++	movups	xmm2,XMMWORD[rdi]
++	sub	rdx,0x10
++	jbe	NEAR $L$cbc_dec_one
++
++	movups	xmm3,XMMWORD[16+rdi]
++	movaps	xmm11,xmm2
++	sub	rdx,0x10
++	jbe	NEAR $L$cbc_dec_two
++
++	movups	xmm4,XMMWORD[32+rdi]
++	movaps	xmm12,xmm3
++	sub	rdx,0x10
++	jbe	NEAR $L$cbc_dec_three
++
++	movups	xmm5,XMMWORD[48+rdi]
++	movaps	xmm13,xmm4
++	sub	rdx,0x10
++	jbe	NEAR $L$cbc_dec_four
++
++	movups	xmm6,XMMWORD[64+rdi]
++	movaps	xmm14,xmm5
++	movaps	xmm15,xmm6
++	xorps	xmm7,xmm7
++	call	_aesni_decrypt6
++	pxor	xmm2,xmm10
++	movaps	xmm10,xmm15
++	pxor	xmm3,xmm11
++	movdqu	XMMWORD[rsi],xmm2
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	pxor	xmm5,xmm13
++	movdqu	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	pxor	xmm6,xmm14
++	movdqu	XMMWORD[48+rsi],xmm5
++	pxor	xmm5,xmm5
++	lea	rsi,[64+rsi]
++	movdqa	xmm2,xmm6
++	pxor	xmm6,xmm6
++	pxor	xmm7,xmm7
++	sub	rdx,0x10
++	jmp	NEAR $L$cbc_dec_tail_collected
++
++ALIGN	16
++$L$cbc_dec_one:
++	movaps	xmm11,xmm2
++	movups	xmm0,XMMWORD[rcx]
++	movups	xmm1,XMMWORD[16+rcx]
++	lea	rcx,[32+rcx]
++	xorps	xmm2,xmm0
++$L$oop_dec1_17:
++DB	102,15,56,222,209
++	dec	eax
++	movups	xmm1,XMMWORD[rcx]
++	lea	rcx,[16+rcx]
++	jnz	NEAR $L$oop_dec1_17
++DB	102,15,56,223,209
++	xorps	xmm2,xmm10
++	movaps	xmm10,xmm11
++	jmp	NEAR $L$cbc_dec_tail_collected
++ALIGN	16
++$L$cbc_dec_two:
++	movaps	xmm12,xmm3
++	call	_aesni_decrypt2
++	pxor	xmm2,xmm10
++	movaps	xmm10,xmm12
++	pxor	xmm3,xmm11
++	movdqu	XMMWORD[rsi],xmm2
++	movdqa	xmm2,xmm3
++	pxor	xmm3,xmm3
++	lea	rsi,[16+rsi]
++	jmp	NEAR $L$cbc_dec_tail_collected
++ALIGN	16
++$L$cbc_dec_three:
++	movaps	xmm13,xmm4
++	call	_aesni_decrypt3
++	pxor	xmm2,xmm10
++	movaps	xmm10,xmm13
++	pxor	xmm3,xmm11
++	movdqu	XMMWORD[rsi],xmm2
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	movdqa	xmm2,xmm4
++	pxor	xmm4,xmm4
++	lea	rsi,[32+rsi]
++	jmp	NEAR $L$cbc_dec_tail_collected
++ALIGN	16
++$L$cbc_dec_four:
++	movaps	xmm14,xmm5
++	call	_aesni_decrypt4
++	pxor	xmm2,xmm10
++	movaps	xmm10,xmm14
++	pxor	xmm3,xmm11
++	movdqu	XMMWORD[rsi],xmm2
++	pxor	xmm4,xmm12
++	movdqu	XMMWORD[16+rsi],xmm3
++	pxor	xmm3,xmm3
++	pxor	xmm5,xmm13
++	movdqu	XMMWORD[32+rsi],xmm4
++	pxor	xmm4,xmm4
++	movdqa	xmm2,xmm5
++	pxor	xmm5,xmm5
++	lea	rsi,[48+rsi]
++	jmp	NEAR $L$cbc_dec_tail_collected
++
++ALIGN	16
++$L$cbc_dec_clear_tail_collected:
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++$L$cbc_dec_tail_collected:
++	movups	XMMWORD[r8],xmm10
++	and	rdx,15
++	jnz	NEAR $L$cbc_dec_tail_partial
++	movups	XMMWORD[rsi],xmm2
++	pxor	xmm2,xmm2
++	jmp	NEAR $L$cbc_dec_ret
++ALIGN	16
++$L$cbc_dec_tail_partial:
++	movaps	XMMWORD[rsp],xmm2
++	pxor	xmm2,xmm2
++	mov	rcx,16
++	mov	rdi,rsi
++	sub	rcx,rdx
++	lea	rsi,[rsp]
++	DD	0x9066A4F3
++	movdqa	XMMWORD[rsp],xmm2
++
++$L$cbc_dec_ret:
++	xorps	xmm0,xmm0
++	pxor	xmm1,xmm1
++	movaps	xmm6,XMMWORD[16+rsp]
++	movaps	XMMWORD[16+rsp],xmm0
++	movaps	xmm7,XMMWORD[32+rsp]
++	movaps	XMMWORD[32+rsp],xmm0
++	movaps	xmm8,XMMWORD[48+rsp]
++	movaps	XMMWORD[48+rsp],xmm0
++	movaps	xmm9,XMMWORD[64+rsp]
++	movaps	XMMWORD[64+rsp],xmm0
++	movaps	xmm10,XMMWORD[80+rsp]
++	movaps	XMMWORD[80+rsp],xmm0
++	movaps	xmm11,XMMWORD[96+rsp]
++	movaps	XMMWORD[96+rsp],xmm0
++	movaps	xmm12,XMMWORD[112+rsp]
++	movaps	XMMWORD[112+rsp],xmm0
++	movaps	xmm13,XMMWORD[128+rsp]
++	movaps	XMMWORD[128+rsp],xmm0
++	movaps	xmm14,XMMWORD[144+rsp]
++	movaps	XMMWORD[144+rsp],xmm0
++	movaps	xmm15,XMMWORD[160+rsp]
++	movaps	XMMWORD[160+rsp],xmm0
++	lea	rsp,[rbp]
++	pop	rbp
++$L$cbc_ret:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_aesni_cbc_encrypt:
++global	aesni_set_decrypt_key
++
++ALIGN	16
++aesni_set_decrypt_key:
++DB	0x48,0x83,0xEC,0x08
++	call	__aesni_set_encrypt_key
++	shl	edx,4
++	test	eax,eax
++	jnz	NEAR $L$dec_key_ret
++	lea	rcx,[16+rdx*1+r8]
++
++	movups	xmm0,XMMWORD[r8]
++	movups	xmm1,XMMWORD[rcx]
++	movups	XMMWORD[rcx],xmm0
++	movups	XMMWORD[r8],xmm1
++	lea	r8,[16+r8]
++	lea	rcx,[((-16))+rcx]
++
++$L$dec_key_inverse:
++	movups	xmm0,XMMWORD[r8]
++	movups	xmm1,XMMWORD[rcx]
++DB	102,15,56,219,192
++DB	102,15,56,219,201
++	lea	r8,[16+r8]
++	lea	rcx,[((-16))+rcx]
++	movups	XMMWORD[16+rcx],xmm0
++	movups	XMMWORD[(-16)+r8],xmm1
++	cmp	rcx,r8
++	ja	NEAR $L$dec_key_inverse
++
++	movups	xmm0,XMMWORD[r8]
++DB	102,15,56,219,192
++	pxor	xmm1,xmm1
++	movups	XMMWORD[rcx],xmm0
++	pxor	xmm0,xmm0
++$L$dec_key_ret:
++	add	rsp,8
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_set_decrypt_key:
++
++global	aesni_set_encrypt_key
++
++ALIGN	16
++aesni_set_encrypt_key:
++__aesni_set_encrypt_key:
++DB	0x48,0x83,0xEC,0x08
++	mov	rax,-1
++	test	rcx,rcx
++	jz	NEAR $L$enc_key_ret
++	test	r8,r8
++	jz	NEAR $L$enc_key_ret
++
++	mov	r10d,268437504
++	movups	xmm0,XMMWORD[rcx]
++	xorps	xmm4,xmm4
++	and	r10d,DWORD[((_gnutls_x86_cpuid_s+4))]
++	lea	rax,[16+r8]
++	cmp	edx,256
++	je	NEAR $L$14rounds
++	cmp	edx,192
++	je	NEAR $L$12rounds
++	cmp	edx,128
++	jne	NEAR $L$bad_keybits
++
++$L$10rounds:
++	mov	edx,9
++	cmp	r10d,268435456
++	je	NEAR $L$10rounds_alt
++
++	movups	XMMWORD[r8],xmm0
++DB	102,15,58,223,200,1
++	call	$L$key_expansion_128_cold
++DB	102,15,58,223,200,2
++	call	$L$key_expansion_128
++DB	102,15,58,223,200,4
++	call	$L$key_expansion_128
++DB	102,15,58,223,200,8
++	call	$L$key_expansion_128
++DB	102,15,58,223,200,16
++	call	$L$key_expansion_128
++DB	102,15,58,223,200,32
++	call	$L$key_expansion_128
++DB	102,15,58,223,200,64
++	call	$L$key_expansion_128
++DB	102,15,58,223,200,128
++	call	$L$key_expansion_128
++DB	102,15,58,223,200,27
++	call	$L$key_expansion_128
++DB	102,15,58,223,200,54
++	call	$L$key_expansion_128
++	movups	XMMWORD[rax],xmm0
++	mov	DWORD[80+rax],edx
++	xor	eax,eax
++	jmp	NEAR $L$enc_key_ret
++
++ALIGN	16
++$L$10rounds_alt:
++	movdqa	xmm5,XMMWORD[$L$key_rotate]
++	mov	r10d,8
++	movdqa	xmm4,XMMWORD[$L$key_rcon1]
++	movdqa	xmm2,xmm0
++	movdqu	XMMWORD[r8],xmm0
++	jmp	NEAR $L$oop_key128
++
++ALIGN	16
++$L$oop_key128:
++DB	102,15,56,0,197
++DB	102,15,56,221,196
++	pslld	xmm4,1
++	lea	rax,[16+rax]
++
++	movdqa	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm2,xmm3
++
++	pxor	xmm0,xmm2
++	movdqu	XMMWORD[(-16)+rax],xmm0
++	movdqa	xmm2,xmm0
++
++	dec	r10d
++	jnz	NEAR $L$oop_key128
++
++	movdqa	xmm4,XMMWORD[$L$key_rcon1b]
++
++DB	102,15,56,0,197
++DB	102,15,56,221,196
++	pslld	xmm4,1
++
++	movdqa	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm2,xmm3
++
++	pxor	xmm0,xmm2
++	movdqu	XMMWORD[rax],xmm0
++
++	movdqa	xmm2,xmm0
++DB	102,15,56,0,197
++DB	102,15,56,221,196
++
++	movdqa	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm3,xmm2
++	pslldq	xmm2,4
++	pxor	xmm2,xmm3
++
++	pxor	xmm0,xmm2
++	movdqu	XMMWORD[16+rax],xmm0
++
++	mov	DWORD[96+rax],edx
++	xor	eax,eax
++	jmp	NEAR $L$enc_key_ret
++
++ALIGN	16
++$L$12rounds:
++	movq	xmm2,QWORD[16+rcx]
++	mov	edx,11
++	cmp	r10d,268435456
++	je	NEAR $L$12rounds_alt
++
++	movups	XMMWORD[r8],xmm0
++DB	102,15,58,223,202,1
++	call	$L$key_expansion_192a_cold
++DB	102,15,58,223,202,2
++	call	$L$key_expansion_192b
++DB	102,15,58,223,202,4
++	call	$L$key_expansion_192a
++DB	102,15,58,223,202,8
++	call	$L$key_expansion_192b
++DB	102,15,58,223,202,16
++	call	$L$key_expansion_192a
++DB	102,15,58,223,202,32
++	call	$L$key_expansion_192b
++DB	102,15,58,223,202,64
++	call	$L$key_expansion_192a
++DB	102,15,58,223,202,128
++	call	$L$key_expansion_192b
++	movups	XMMWORD[rax],xmm0
++	mov	DWORD[48+rax],edx
++	xor	rax,rax
++	jmp	NEAR $L$enc_key_ret
++
++ALIGN	16
++$L$12rounds_alt:
++	movdqa	xmm5,XMMWORD[$L$key_rotate192]
++	movdqa	xmm4,XMMWORD[$L$key_rcon1]
++	mov	r10d,8
++	movdqu	XMMWORD[r8],xmm0
++	jmp	NEAR $L$oop_key192
++
++ALIGN	16
++$L$oop_key192:
++	movq	QWORD[rax],xmm2
++	movdqa	xmm1,xmm2
++DB	102,15,56,0,213
++DB	102,15,56,221,212
++	pslld	xmm4,1
++	lea	rax,[24+rax]
++
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm0,xmm3
++
++	pshufd	xmm3,xmm0,0xff
++	pxor	xmm3,xmm1
++	pslldq	xmm1,4
++	pxor	xmm3,xmm1
++
++	pxor	xmm0,xmm2
++	pxor	xmm2,xmm3
++	movdqu	XMMWORD[(-16)+rax],xmm0
++
++	dec	r10d
++	jnz	NEAR $L$oop_key192
++
++	mov	DWORD[32+rax],edx
++	xor	eax,eax
++	jmp	NEAR $L$enc_key_ret
++
++ALIGN	16
++$L$14rounds:
++	movups	xmm2,XMMWORD[16+rcx]
++	mov	edx,13
++	lea	rax,[16+rax]
++	cmp	r10d,268435456
++	je	NEAR $L$14rounds_alt
++
++	movups	XMMWORD[r8],xmm0
++	movups	XMMWORD[16+r8],xmm2
++DB	102,15,58,223,202,1
++	call	$L$key_expansion_256a_cold
++DB	102,15,58,223,200,1
++	call	$L$key_expansion_256b
++DB	102,15,58,223,202,2
++	call	$L$key_expansion_256a
++DB	102,15,58,223,200,2
++	call	$L$key_expansion_256b
++DB	102,15,58,223,202,4
++	call	$L$key_expansion_256a
++DB	102,15,58,223,200,4
++	call	$L$key_expansion_256b
++DB	102,15,58,223,202,8
++	call	$L$key_expansion_256a
++DB	102,15,58,223,200,8
++	call	$L$key_expansion_256b
++DB	102,15,58,223,202,16
++	call	$L$key_expansion_256a
++DB	102,15,58,223,200,16
++	call	$L$key_expansion_256b
++DB	102,15,58,223,202,32
++	call	$L$key_expansion_256a
++DB	102,15,58,223,200,32
++	call	$L$key_expansion_256b
++DB	102,15,58,223,202,64
++	call	$L$key_expansion_256a
++	movups	XMMWORD[rax],xmm0
++	mov	DWORD[16+rax],edx
++	xor	rax,rax
++	jmp	NEAR $L$enc_key_ret
++
++ALIGN	16
++$L$14rounds_alt:
++	movdqa	xmm5,XMMWORD[$L$key_rotate]
++	movdqa	xmm4,XMMWORD[$L$key_rcon1]
++	mov	r10d,7
++	movdqu	XMMWORD[r8],xmm0
++	movdqa	xmm1,xmm2
++	movdqu	XMMWORD[16+r8],xmm2
++	jmp	NEAR $L$oop_key256
++
++ALIGN	16
++$L$oop_key256:
++DB	102,15,56,0,213
++DB	102,15,56,221,212
++
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm3,xmm0
++	pslldq	xmm0,4
++	pxor	xmm0,xmm3
++	pslld	xmm4,1
++
++	pxor	xmm0,xmm2
++	movdqu	XMMWORD[rax],xmm0
++
++	dec	r10d
++	jz	NEAR $L$done_key256
++
++	pshufd	xmm2,xmm0,0xff
++	pxor	xmm3,xmm3
++DB	102,15,56,221,211
++
++	movdqa	xmm3,xmm1
++	pslldq	xmm1,4
++	pxor	xmm3,xmm1
++	pslldq	xmm1,4
++	pxor	xmm3,xmm1
++	pslldq	xmm1,4
++	pxor	xmm1,xmm3
++
++	pxor	xmm2,xmm1
++	movdqu	XMMWORD[16+rax],xmm2
++	lea	rax,[32+rax]
++	movdqa	xmm1,xmm2
++
++	jmp	NEAR $L$oop_key256
++
++$L$done_key256:
++	mov	DWORD[16+rax],edx
++	xor	eax,eax
++	jmp	NEAR $L$enc_key_ret
++
++ALIGN	16
++$L$bad_keybits:
++	mov	rax,-2
++$L$enc_key_ret:
++	pxor	xmm0,xmm0
++	pxor	xmm1,xmm1
++	pxor	xmm2,xmm2
++	pxor	xmm3,xmm3
++	pxor	xmm4,xmm4
++	pxor	xmm5,xmm5
++	add	rsp,8
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_set_encrypt_key:
++
++ALIGN	16
++$L$key_expansion_128:
++	movups	XMMWORD[rax],xmm0
++	lea	rax,[16+rax]
++$L$key_expansion_128_cold:
++	shufps	xmm4,xmm0,16
++	xorps	xmm0,xmm4
++	shufps	xmm4,xmm0,140
++	xorps	xmm0,xmm4
++	shufps	xmm1,xmm1,255
++	xorps	xmm0,xmm1
++	DB	0F3h,0C3h		;repret
++
++ALIGN	16
++$L$key_expansion_192a:
++	movups	XMMWORD[rax],xmm0
++	lea	rax,[16+rax]
++$L$key_expansion_192a_cold:
++	movaps	xmm5,xmm2
++$L$key_expansion_192b_warm:
++	shufps	xmm4,xmm0,16
++	movdqa	xmm3,xmm2
++	xorps	xmm0,xmm4
++	shufps	xmm4,xmm0,140
++	pslldq	xmm3,4
++	xorps	xmm0,xmm4
++	pshufd	xmm1,xmm1,85
++	pxor	xmm2,xmm3
++	pxor	xmm0,xmm1
++	pshufd	xmm3,xmm0,255
++	pxor	xmm2,xmm3
++	DB	0F3h,0C3h		;repret
++
++ALIGN	16
++$L$key_expansion_192b:
++	movaps	xmm3,xmm0
++	shufps	xmm5,xmm0,68
++	movups	XMMWORD[rax],xmm5
++	shufps	xmm3,xmm2,78
++	movups	XMMWORD[16+rax],xmm3
++	lea	rax,[32+rax]
++	jmp	NEAR $L$key_expansion_192b_warm
++
++ALIGN	16
++$L$key_expansion_256a:
++	movups	XMMWORD[rax],xmm2
++	lea	rax,[16+rax]
++$L$key_expansion_256a_cold:
++	shufps	xmm4,xmm0,16
++	xorps	xmm0,xmm4
++	shufps	xmm4,xmm0,140
++	xorps	xmm0,xmm4
++	shufps	xmm1,xmm1,255
++	xorps	xmm0,xmm1
++	DB	0F3h,0C3h		;repret
++
++ALIGN	16
++$L$key_expansion_256b:
++	movups	XMMWORD[rax],xmm0
++	lea	rax,[16+rax]
++
++	shufps	xmm4,xmm2,16
++	xorps	xmm2,xmm4
++	shufps	xmm4,xmm2,140
++	xorps	xmm2,xmm4
++	shufps	xmm1,xmm1,170
++	xorps	xmm2,xmm1
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	64
++$L$bswap_mask:
++DB	15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
++$L$increment32:
++	DD	6,6,6,0
++$L$increment64:
++	DD	1,0,0,0
++$L$xts_magic:
++	DD	0x87,0,1,0
++$L$increment1:
++DB	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1
++$L$key_rotate:
++	DD	0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d
++$L$key_rotate192:
++	DD	0x04070605,0x04070605,0x04070605,0x04070605
++$L$key_rcon1:
++	DD	1,1,1,1
++$L$key_rcon1b:
++	DD	0x1b,0x1b,0x1b,0x1b
++
++DB	65,69,83,32,102,111,114,32,73,110,116,101,108,32,65,69
++DB	83,45,78,73,44,32,67,82,89,80,84,79,71,65,77,83
++DB	32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115
++DB	115,108,46,111,114,103,62,0
++ALIGN	64
++EXTERN	__imp_RtlVirtualUnwind
++
++ALIGN	16
++ecb_ccm64_se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$common_seh_tail
++
++	mov	rax,QWORD[152+r8]
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$common_seh_tail
++
++	lea	rsi,[rax]
++	lea	rdi,[512+r8]
++	mov	ecx,8
++	DD	0xa548f3fc
++	lea	rax,[88+rax]
++
++	jmp	NEAR $L$common_seh_tail
++
++
++
++ALIGN	16
++ctr_xts_se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$common_seh_tail
++
++	mov	rax,QWORD[152+r8]
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$common_seh_tail
++
++	mov	rax,QWORD[160+r8]
++	lea	rsi,[((-160))+rax]
++	lea	rdi,[512+r8]
++	mov	ecx,20
++	DD	0xa548f3fc
++
++	jmp	NEAR $L$common_rbp_tail
++
++
++
++ALIGN	16
++ocb_se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$common_seh_tail
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$common_seh_tail
++
++	mov	r10d,DWORD[8+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$ocb_no_xmm
++
++	mov	rax,QWORD[152+r8]
++
++	lea	rsi,[rax]
++	lea	rdi,[512+r8]
++	mov	ecx,20
++	DD	0xa548f3fc
++	lea	rax,[((160+40))+rax]
++
++$L$ocb_no_xmm:
++	mov	rbx,QWORD[((-8))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	r13,QWORD[((-32))+rax]
++	mov	r14,QWORD[((-40))+rax]
++
++	mov	QWORD[144+r8],rbx
++	mov	QWORD[160+r8],rbp
++	mov	QWORD[216+r8],r12
++	mov	QWORD[224+r8],r13
++	mov	QWORD[232+r8],r14
++
++	jmp	NEAR $L$common_seh_tail
++
++
++ALIGN	16
++cbc_se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[152+r8]
++	mov	rbx,QWORD[248+r8]
++
++	lea	r10,[$L$cbc_decrypt_bulk]
++	cmp	rbx,r10
++	jb	NEAR $L$common_seh_tail
++
++	lea	r10,[$L$cbc_decrypt_body]
++	cmp	rbx,r10
++	jb	NEAR $L$restore_cbc_rax
++
++	lea	r10,[$L$cbc_ret]
++	cmp	rbx,r10
++	jae	NEAR $L$common_seh_tail
++
++	lea	rsi,[16+rax]
++	lea	rdi,[512+r8]
++	mov	ecx,20
++	DD	0xa548f3fc
++
++$L$common_rbp_tail:
++	mov	rax,QWORD[160+r8]
++	mov	rbp,QWORD[rax]
++	lea	rax,[8+rax]
++	mov	QWORD[160+r8],rbp
++	jmp	NEAR $L$common_seh_tail
++
++$L$restore_cbc_rax:
++	mov	rax,QWORD[120+r8]
++
++$L$common_seh_tail:
++	mov	rdi,QWORD[8+rax]
++	mov	rsi,QWORD[16+rax]
++	mov	QWORD[152+r8],rax
++	mov	QWORD[168+r8],rsi
++	mov	QWORD[176+r8],rdi
++
++	mov	rdi,QWORD[40+r9]
++	mov	rsi,r8
++	mov	ecx,154
++	DD	0xa548f3fc
++
++	mov	rsi,r9
++	xor	rcx,rcx
++	mov	rdx,QWORD[8+rsi]
++	mov	r8,QWORD[rsi]
++	mov	r9,QWORD[16+rsi]
++	mov	r10,QWORD[40+rsi]
++	lea	r11,[56+rsi]
++	lea	r12,[24+rsi]
++	mov	QWORD[32+rsp],r10
++	mov	QWORD[40+rsp],r11
++	mov	QWORD[48+rsp],r12
++	mov	QWORD[56+rsp],rcx
++	call	QWORD[__imp_RtlVirtualUnwind]
++
++	mov	eax,1
++	add	rsp,64
++	popfq
++	pop	r15
++	pop	r14
++	pop	r13
++	pop	r12
++	pop	rbp
++	pop	rbx
++	pop	rdi
++	pop	rsi
++	DB	0F3h,0C3h		;repret
++
++
++section	.pdata rdata align=4
++ALIGN	4
++	DD	$L$SEH_begin_aesni_ecb_encrypt wrt ..imagebase
++	DD	$L$SEH_end_aesni_ecb_encrypt wrt ..imagebase
++	DD	$L$SEH_info_ecb wrt ..imagebase
++
++	DD	$L$SEH_begin_aesni_ccm64_encrypt_blocks wrt ..imagebase
++	DD	$L$SEH_end_aesni_ccm64_encrypt_blocks wrt ..imagebase
++	DD	$L$SEH_info_ccm64_enc wrt ..imagebase
++
++	DD	$L$SEH_begin_aesni_ccm64_decrypt_blocks wrt ..imagebase
++	DD	$L$SEH_end_aesni_ccm64_decrypt_blocks wrt ..imagebase
++	DD	$L$SEH_info_ccm64_dec wrt ..imagebase
++
++	DD	$L$SEH_begin_aesni_ctr32_encrypt_blocks wrt ..imagebase
++	DD	$L$SEH_end_aesni_ctr32_encrypt_blocks wrt ..imagebase
++	DD	$L$SEH_info_ctr32 wrt ..imagebase
++
++	DD	$L$SEH_begin_aesni_xts_encrypt wrt ..imagebase
++	DD	$L$SEH_end_aesni_xts_encrypt wrt ..imagebase
++	DD	$L$SEH_info_xts_enc wrt ..imagebase
++
++	DD	$L$SEH_begin_aesni_xts_decrypt wrt ..imagebase
++	DD	$L$SEH_end_aesni_xts_decrypt wrt ..imagebase
++	DD	$L$SEH_info_xts_dec wrt ..imagebase
++
++	DD	$L$SEH_begin_aesni_ocb_encrypt wrt ..imagebase
++	DD	$L$SEH_end_aesni_ocb_encrypt wrt ..imagebase
++	DD	$L$SEH_info_ocb_enc wrt ..imagebase
++
++	DD	$L$SEH_begin_aesni_ocb_decrypt wrt ..imagebase
++	DD	$L$SEH_end_aesni_ocb_decrypt wrt ..imagebase
++	DD	$L$SEH_info_ocb_dec wrt ..imagebase
++	DD	$L$SEH_begin_aesni_cbc_encrypt wrt ..imagebase
++	DD	$L$SEH_end_aesni_cbc_encrypt wrt ..imagebase
++	DD	$L$SEH_info_cbc wrt ..imagebase
++
++	DD	aesni_set_decrypt_key wrt ..imagebase
++	DD	$L$SEH_end_set_decrypt_key wrt ..imagebase
++	DD	$L$SEH_info_key wrt ..imagebase
++
++	DD	aesni_set_encrypt_key wrt ..imagebase
++	DD	$L$SEH_end_set_encrypt_key wrt ..imagebase
++	DD	$L$SEH_info_key wrt ..imagebase
++section	.xdata rdata align=8
++ALIGN	8
++$L$SEH_info_ecb:
++DB	9,0,0,0
++	DD	ecb_ccm64_se_handler wrt ..imagebase
++	DD	$L$ecb_enc_body wrt ..imagebase,$L$ecb_enc_ret wrt ..imagebase
++$L$SEH_info_ccm64_enc:
++DB	9,0,0,0
++	DD	ecb_ccm64_se_handler wrt ..imagebase
++	DD	$L$ccm64_enc_body wrt ..imagebase,$L$ccm64_enc_ret wrt ..imagebase
++$L$SEH_info_ccm64_dec:
++DB	9,0,0,0
++	DD	ecb_ccm64_se_handler wrt ..imagebase
++	DD	$L$ccm64_dec_body wrt ..imagebase,$L$ccm64_dec_ret wrt ..imagebase
++$L$SEH_info_ctr32:
++DB	9,0,0,0
++	DD	ctr_xts_se_handler wrt ..imagebase
++	DD	$L$ctr32_body wrt ..imagebase,$L$ctr32_epilogue wrt ..imagebase
++$L$SEH_info_xts_enc:
++DB	9,0,0,0
++	DD	ctr_xts_se_handler wrt ..imagebase
++	DD	$L$xts_enc_body wrt ..imagebase,$L$xts_enc_epilogue wrt ..imagebase
++$L$SEH_info_xts_dec:
++DB	9,0,0,0
++	DD	ctr_xts_se_handler wrt ..imagebase
++	DD	$L$xts_dec_body wrt ..imagebase,$L$xts_dec_epilogue wrt ..imagebase
++$L$SEH_info_ocb_enc:
++DB	9,0,0,0
++	DD	ocb_se_handler wrt ..imagebase
++	DD	$L$ocb_enc_body wrt ..imagebase,$L$ocb_enc_epilogue wrt ..imagebase
++	DD	$L$ocb_enc_pop wrt ..imagebase
++	DD	0
++$L$SEH_info_ocb_dec:
++DB	9,0,0,0
++	DD	ocb_se_handler wrt ..imagebase
++	DD	$L$ocb_dec_body wrt ..imagebase,$L$ocb_dec_epilogue wrt ..imagebase
++	DD	$L$ocb_dec_pop wrt ..imagebase
++	DD	0
++$L$SEH_info_cbc:
++DB	9,0,0,0
++	DD	cbc_se_handler wrt ..imagebase
++$L$SEH_info_key:
++DB	0x01,0x04,0x01,0x00
++DB	0x04,0x02,0x00,0x00
+diff --git a/SMP/lib/accelerated/x86/coff/cpuid-x86.asm b/SMP/lib/accelerated/x86/coff/cpuid-x86.asm
+new file mode 100644
+index 0000000..beee69a
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/cpuid-x86.asm
+@@ -0,0 +1,54 @@
++%ifidn __OUTPUT_FORMAT__,obj
++section	code	use32 class=code align=64
++%elifidn __OUTPUT_FORMAT__,win32
++%ifndef __YASM_VER__
++$@feat.00 equ 1
++%endif
++section	.text	code align=64
++%else
++section	.text	code
++%endif
++global	_gnutls_cpuid
++align	16
++_gnutls_cpuid:
++L$_gnutls_cpuid_begin:
++	push	ebp
++	mov	ebp,esp
++	sub	esp,12
++	mov	DWORD [esp],ebx
++	mov	eax,DWORD [8+ebp]
++	mov	DWORD [4+esp],esi
++	mov	DWORD [8+esp],edi
++	push	ebx
++	cpuid
++	mov	edi,ebx
++	pop	ebx
++	mov	esi,edx
++	mov	edx,DWORD [12+ebp]
++	mov	DWORD [edx],eax
++	mov	eax,DWORD [16+ebp]
++	mov	DWORD [eax],edi
++	mov	eax,DWORD [20+ebp]
++	mov	DWORD [eax],ecx
++	mov	eax,DWORD [24+ebp]
++	mov	DWORD [eax],esi
++	mov	ebx,DWORD [esp]
++	mov	esi,DWORD [4+esp]
++	mov	edi,DWORD [8+esp]
++	mov	esp,ebp
++	pop	ebp
++	ret
++global	_gnutls_have_cpuid
++align	16
++_gnutls_have_cpuid:
++L$_gnutls_have_cpuid_begin:
++	pushfd
++	pop	eax
++	or	eax,2097152
++	push	eax
++	popfd
++	pushfd
++	pop	eax
++	and	eax,2097152
++	ret
++db	67,80,85,73,68,32,102,111,114,32,120,56,54,0
+diff --git a/SMP/lib/accelerated/x86/coff/cpuid-x86_64.asm b/SMP/lib/accelerated/x86/coff/cpuid-x86_64.asm
+new file mode 100644
+index 0000000..c1c9c77
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/cpuid-x86_64.asm
+@@ -0,0 +1,53 @@
++default	rel
++%define XMMWORD
++%define YMMWORD
++%define ZMMWORD
++section	.text code align=64
++
++global	gnutls_cpuid
++
++ALIGN	16
++gnutls_cpuid:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_gnutls_cpuid:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++	mov	r8,QWORD[40+rsp]
++	mov	r9,QWORD[48+rsp]
++
++
++	push	rbp
++	mov	rbp,rsp
++	push	rbx
++	mov	DWORD[((-12))+rbp],edi
++	mov	QWORD[((-24))+rbp],rsi
++	mov	QWORD[((-32))+rbp],rdx
++	mov	QWORD[((-40))+rbp],rcx
++	mov	QWORD[((-48))+rbp],r8
++	mov	eax,DWORD[((-12))+rbp]
++	mov	DWORD[((-60))+rbp],eax
++	mov	eax,DWORD[((-60))+rbp]
++	cpuid
++	mov	DWORD[((-56))+rbp],edx
++	mov	esi,ecx
++	mov	DWORD[((-52))+rbp],eax
++	mov	rax,QWORD[((-24))+rbp]
++	mov	edx,DWORD[((-52))+rbp]
++	mov	DWORD[rax],edx
++	mov	rax,QWORD[((-32))+rbp]
++	mov	DWORD[rax],ebx
++	mov	rax,QWORD[((-40))+rbp]
++	mov	DWORD[rax],esi
++	mov	rax,QWORD[((-48))+rbp]
++	mov	ecx,DWORD[((-56))+rbp]
++	mov	DWORD[rax],ecx
++	pop	rbx
++	leave
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_gnutls_cpuid:
+diff --git a/SMP/lib/accelerated/x86/coff/e_padlock-x86.asm b/SMP/lib/accelerated/x86/coff/e_padlock-x86.asm
+new file mode 100644
+index 0000000..3620a6d
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/e_padlock-x86.asm
+@@ -0,0 +1,1015 @@
++%ifidn __OUTPUT_FORMAT__,obj
++section	code	use32 class=code align=64
++%elifidn __OUTPUT_FORMAT__,win32
++%ifndef __YASM_VER__
++$@feat.00 equ 1
++%endif
++section	.text	code align=64
++%else
++section	.text	code
++%endif
++global	_padlock_capability
++align	16
++_padlock_capability:
++L$_padlock_capability_begin:
++	push	ebx
++	pushfd
++	pop	eax
++	mov	ecx,eax
++	xor	eax,2097152
++	push	eax
++	popfd
++	pushfd
++	pop	eax
++	xor	ecx,eax
++	xor	eax,eax
++	bt	ecx,21
++	jnc	NEAR L$000noluck
++	cpuid
++	xor	eax,eax
++	cmp	ebx,0x746e6543
++	jne	NEAR L$000noluck
++	cmp	edx,0x48727561
++	jne	NEAR L$000noluck
++	cmp	ecx,0x736c7561
++	jne	NEAR L$000noluck
++	mov	eax,3221225472
++	cpuid
++	mov	edx,eax
++	xor	eax,eax
++	cmp	edx,3221225473
++	jb	NEAR L$000noluck
++	mov	eax,1
++	cpuid
++	or	eax,15
++	xor	ebx,ebx
++	and	eax,4095
++	cmp	eax,1791
++	sete	bl
++	mov	eax,3221225473
++	push	ebx
++	cpuid
++	pop	ebx
++	mov	eax,edx
++	shl	ebx,4
++	and	eax,4294967279
++	or	eax,ebx
++L$000noluck:
++	pop	ebx
++	ret
++global	_padlock_key_bswap
++align	16
++_padlock_key_bswap:
++L$_padlock_key_bswap_begin:
++	mov	edx,DWORD [4+esp]
++	mov	ecx,DWORD [240+edx]
++L$001bswap_loop:
++	mov	eax,DWORD [edx]
++	bswap	eax
++	mov	DWORD [edx],eax
++	lea	edx,[4+edx]
++	sub	ecx,1
++	jnz	NEAR L$001bswap_loop
++	ret
++global	_padlock_verify_context
++align	16
++_padlock_verify_context:
++L$_padlock_verify_context_begin:
++	mov	edx,DWORD [4+esp]
++	lea	eax,[L$padlock_saved_context]
++	pushfd
++	call	__padlock_verify_ctx
++L$002verify_pic_point:
++	lea	esp,[4+esp]
++	ret
++align	16
++__padlock_verify_ctx:
++	bt	DWORD [4+esp],30
++	jnc	NEAR L$003verified
++	cmp	edx,DWORD [eax]
++	je	NEAR L$003verified
++	pushfd
++	popfd
++L$003verified:
++	mov	DWORD [eax],edx
++	ret
++global	_padlock_reload_key
++align	16
++_padlock_reload_key:
++L$_padlock_reload_key_begin:
++	pushfd
++	popfd
++	ret
++global	_padlock_aes_block
++align	16
++_padlock_aes_block:
++L$_padlock_aes_block_begin:
++	push	edi
++	push	esi
++	push	ebx
++	mov	edi,DWORD [16+esp]
++	mov	esi,DWORD [20+esp]
++	mov	edx,DWORD [24+esp]
++	mov	ecx,1
++	lea	ebx,[32+edx]
++	lea	edx,[16+edx]
++db	243,15,167,200
++	pop	ebx
++	pop	esi
++	pop	edi
++	ret
++global	_padlock_ecb_encrypt
++align	16
++_padlock_ecb_encrypt:
++L$_padlock_ecb_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	edi,DWORD [20+esp]
++	mov	esi,DWORD [24+esp]
++	mov	edx,DWORD [28+esp]
++	mov	ecx,DWORD [32+esp]
++	test	edx,15
++	jnz	NEAR L$004ecb_abort
++	test	ecx,15
++	jnz	NEAR L$004ecb_abort
++	lea	eax,[L$padlock_saved_context]
++	pushfd
++	cld
++	call	__padlock_verify_ctx
++L$005ecb_pic_point:
++	lea	edx,[16+edx]
++	xor	eax,eax
++	xor	ebx,ebx
++	test	DWORD [edx],32
++	jnz	NEAR L$006ecb_aligned
++	test	edi,15
++	setz	al
++	test	esi,15
++	setz	bl
++	test	eax,ebx
++	jnz	NEAR L$006ecb_aligned
++	neg	eax
++	mov	ebx,512
++	not	eax
++	lea	ebp,[esp-24]
++	cmp	ecx,ebx
++	cmovc	ebx,ecx
++	and	eax,ebx
++	mov	ebx,ecx
++	neg	eax
++	and	ebx,511
++	lea	esp,[ebp*1+eax]
++	mov	eax,512
++	cmovz	ebx,eax
++	mov	eax,ebp
++	and	ebp,-16
++	and	esp,-16
++	mov	DWORD [16+ebp],eax
++	cmp	ecx,ebx
++	ja	NEAR L$007ecb_loop
++	mov	eax,esi
++	cmp	ebp,esp
++	cmove	eax,edi
++	add	eax,ecx
++	neg	eax
++	and	eax,4095
++	cmp	eax,128
++	mov	eax,-128
++	cmovae	eax,ebx
++	and	ebx,eax
++	jz	NEAR L$008ecb_unaligned_tail
++	jmp	NEAR L$007ecb_loop
++align	16
++L$007ecb_loop:
++	mov	DWORD [ebp],edi
++	mov	DWORD [4+ebp],esi
++	mov	DWORD [8+ebp],ecx
++	mov	ecx,ebx
++	mov	DWORD [12+ebp],ebx
++	test	edi,15
++	cmovnz	edi,esp
++	test	esi,15
++	jz	NEAR L$009ecb_inp_aligned
++	shr	ecx,2
++db	243,165
++	sub	edi,ebx
++	mov	ecx,ebx
++	mov	esi,edi
++L$009ecb_inp_aligned:
++	lea	eax,[edx-16]
++	lea	ebx,[16+edx]
++	shr	ecx,4
++db	243,15,167,200
++	mov	edi,DWORD [ebp]
++	mov	ebx,DWORD [12+ebp]
++	test	edi,15
++	jz	NEAR L$010ecb_out_aligned
++	mov	ecx,ebx
++	lea	esi,[esp]
++	shr	ecx,2
++db	243,165
++	sub	edi,ebx
++L$010ecb_out_aligned:
++	mov	esi,DWORD [4+ebp]
++	mov	ecx,DWORD [8+ebp]
++	add	edi,ebx
++	add	esi,ebx
++	sub	ecx,ebx
++	mov	ebx,512
++	jz	NEAR L$011ecb_break
++	cmp	ecx,ebx
++	jae	NEAR L$007ecb_loop
++L$008ecb_unaligned_tail:
++	xor	eax,eax
++	cmp	esp,ebp
++	cmove	eax,ecx
++	sub	esp,eax
++	mov	eax,edi
++	mov	ebx,ecx
++	shr	ecx,2
++	lea	edi,[esp]
++db	243,165
++	mov	esi,esp
++	mov	edi,eax
++	mov	ecx,ebx
++	jmp	NEAR L$007ecb_loop
++align	16
++L$011ecb_break:
++	cmp	esp,ebp
++	je	NEAR L$012ecb_done
++	pxor	xmm0,xmm0
++	lea	eax,[esp]
++L$013ecb_bzero:
++	movaps	[eax],xmm0
++	lea	eax,[16+eax]
++	cmp	ebp,eax
++	ja	NEAR L$013ecb_bzero
++L$012ecb_done:
++	mov	ebp,DWORD [16+ebp]
++	lea	esp,[24+ebp]
++	jmp	NEAR L$014ecb_exit
++align	16
++L$006ecb_aligned:
++	lea	ebp,[ecx*1+esi]
++	neg	ebp
++	and	ebp,4095
++	xor	eax,eax
++	cmp	ebp,128
++	mov	ebp,127
++	cmovae	ebp,eax
++	and	ebp,ecx
++	sub	ecx,ebp
++	jz	NEAR L$015ecb_aligned_tail
++	lea	eax,[edx-16]
++	lea	ebx,[16+edx]
++	shr	ecx,4
++db	243,15,167,200
++	test	ebp,ebp
++	jz	NEAR L$014ecb_exit
++L$015ecb_aligned_tail:
++	mov	ecx,ebp
++	lea	ebp,[esp-24]
++	mov	esp,ebp
++	mov	eax,ebp
++	sub	esp,ecx
++	and	ebp,-16
++	and	esp,-16
++	mov	DWORD [16+ebp],eax
++	mov	eax,edi
++	mov	ebx,ecx
++	shr	ecx,2
++	lea	edi,[esp]
++db	243,165
++	mov	esi,esp
++	mov	edi,eax
++	mov	ecx,ebx
++	jmp	NEAR L$007ecb_loop
++L$014ecb_exit:
++	mov	eax,1
++	lea	esp,[4+esp]
++L$004ecb_abort:
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_padlock_cbc_encrypt
++align	16
++_padlock_cbc_encrypt:
++L$_padlock_cbc_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	edi,DWORD [20+esp]
++	mov	esi,DWORD [24+esp]
++	mov	edx,DWORD [28+esp]
++	mov	ecx,DWORD [32+esp]
++	test	edx,15
++	jnz	NEAR L$016cbc_abort
++	test	ecx,15
++	jnz	NEAR L$016cbc_abort
++	lea	eax,[L$padlock_saved_context]
++	pushfd
++	cld
++	call	__padlock_verify_ctx
++L$017cbc_pic_point:
++	lea	edx,[16+edx]
++	xor	eax,eax
++	xor	ebx,ebx
++	test	DWORD [edx],32
++	jnz	NEAR L$018cbc_aligned
++	test	edi,15
++	setz	al
++	test	esi,15
++	setz	bl
++	test	eax,ebx
++	jnz	NEAR L$018cbc_aligned
++	neg	eax
++	mov	ebx,512
++	not	eax
++	lea	ebp,[esp-24]
++	cmp	ecx,ebx
++	cmovc	ebx,ecx
++	and	eax,ebx
++	mov	ebx,ecx
++	neg	eax
++	and	ebx,511
++	lea	esp,[ebp*1+eax]
++	mov	eax,512
++	cmovz	ebx,eax
++	mov	eax,ebp
++	and	ebp,-16
++	and	esp,-16
++	mov	DWORD [16+ebp],eax
++	cmp	ecx,ebx
++	ja	NEAR L$019cbc_loop
++	mov	eax,esi
++	cmp	ebp,esp
++	cmove	eax,edi
++	add	eax,ecx
++	neg	eax
++	and	eax,4095
++	cmp	eax,64
++	mov	eax,-64
++	cmovae	eax,ebx
++	and	ebx,eax
++	jz	NEAR L$020cbc_unaligned_tail
++	jmp	NEAR L$019cbc_loop
++align	16
++L$019cbc_loop:
++	mov	DWORD [ebp],edi
++	mov	DWORD [4+ebp],esi
++	mov	DWORD [8+ebp],ecx
++	mov	ecx,ebx
++	mov	DWORD [12+ebp],ebx
++	test	edi,15
++	cmovnz	edi,esp
++	test	esi,15
++	jz	NEAR L$021cbc_inp_aligned
++	shr	ecx,2
++db	243,165
++	sub	edi,ebx
++	mov	ecx,ebx
++	mov	esi,edi
++L$021cbc_inp_aligned:
++	lea	eax,[edx-16]
++	lea	ebx,[16+edx]
++	shr	ecx,4
++db	243,15,167,208
++	movaps	xmm0,[eax]
++	movaps	[edx-16],xmm0
++	mov	edi,DWORD [ebp]
++	mov	ebx,DWORD [12+ebp]
++	test	edi,15
++	jz	NEAR L$022cbc_out_aligned
++	mov	ecx,ebx
++	lea	esi,[esp]
++	shr	ecx,2
++db	243,165
++	sub	edi,ebx
++L$022cbc_out_aligned:
++	mov	esi,DWORD [4+ebp]
++	mov	ecx,DWORD [8+ebp]
++	add	edi,ebx
++	add	esi,ebx
++	sub	ecx,ebx
++	mov	ebx,512
++	jz	NEAR L$023cbc_break
++	cmp	ecx,ebx
++	jae	NEAR L$019cbc_loop
++L$020cbc_unaligned_tail:
++	xor	eax,eax
++	cmp	esp,ebp
++	cmove	eax,ecx
++	sub	esp,eax
++	mov	eax,edi
++	mov	ebx,ecx
++	shr	ecx,2
++	lea	edi,[esp]
++db	243,165
++	mov	esi,esp
++	mov	edi,eax
++	mov	ecx,ebx
++	jmp	NEAR L$019cbc_loop
++align	16
++L$023cbc_break:
++	cmp	esp,ebp
++	je	NEAR L$024cbc_done
++	pxor	xmm0,xmm0
++	lea	eax,[esp]
++L$025cbc_bzero:
++	movaps	[eax],xmm0
++	lea	eax,[16+eax]
++	cmp	ebp,eax
++	ja	NEAR L$025cbc_bzero
++L$024cbc_done:
++	mov	ebp,DWORD [16+ebp]
++	lea	esp,[24+ebp]
++	jmp	NEAR L$026cbc_exit
++align	16
++L$018cbc_aligned:
++	lea	ebp,[ecx*1+esi]
++	neg	ebp
++	and	ebp,4095
++	xor	eax,eax
++	cmp	ebp,64
++	mov	ebp,63
++	cmovae	ebp,eax
++	and	ebp,ecx
++	sub	ecx,ebp
++	jz	NEAR L$027cbc_aligned_tail
++	lea	eax,[edx-16]
++	lea	ebx,[16+edx]
++	shr	ecx,4
++db	243,15,167,208
++	movaps	xmm0,[eax]
++	movaps	[edx-16],xmm0
++	test	ebp,ebp
++	jz	NEAR L$026cbc_exit
++L$027cbc_aligned_tail:
++	mov	ecx,ebp
++	lea	ebp,[esp-24]
++	mov	esp,ebp
++	mov	eax,ebp
++	sub	esp,ecx
++	and	ebp,-16
++	and	esp,-16
++	mov	DWORD [16+ebp],eax
++	mov	eax,edi
++	mov	ebx,ecx
++	shr	ecx,2
++	lea	edi,[esp]
++db	243,165
++	mov	esi,esp
++	mov	edi,eax
++	mov	ecx,ebx
++	jmp	NEAR L$019cbc_loop
++L$026cbc_exit:
++	mov	eax,1
++	lea	esp,[4+esp]
++L$016cbc_abort:
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_padlock_cfb_encrypt
++align	16
++_padlock_cfb_encrypt:
++L$_padlock_cfb_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	edi,DWORD [20+esp]
++	mov	esi,DWORD [24+esp]
++	mov	edx,DWORD [28+esp]
++	mov	ecx,DWORD [32+esp]
++	test	edx,15
++	jnz	NEAR L$028cfb_abort
++	test	ecx,15
++	jnz	NEAR L$028cfb_abort
++	lea	eax,[L$padlock_saved_context]
++	pushfd
++	cld
++	call	__padlock_verify_ctx
++L$029cfb_pic_point:
++	lea	edx,[16+edx]
++	xor	eax,eax
++	xor	ebx,ebx
++	test	DWORD [edx],32
++	jnz	NEAR L$030cfb_aligned
++	test	edi,15
++	setz	al
++	test	esi,15
++	setz	bl
++	test	eax,ebx
++	jnz	NEAR L$030cfb_aligned
++	neg	eax
++	mov	ebx,512
++	not	eax
++	lea	ebp,[esp-24]
++	cmp	ecx,ebx
++	cmovc	ebx,ecx
++	and	eax,ebx
++	mov	ebx,ecx
++	neg	eax
++	and	ebx,511
++	lea	esp,[ebp*1+eax]
++	mov	eax,512
++	cmovz	ebx,eax
++	mov	eax,ebp
++	and	ebp,-16
++	and	esp,-16
++	mov	DWORD [16+ebp],eax
++	jmp	NEAR L$031cfb_loop
++align	16
++L$031cfb_loop:
++	mov	DWORD [ebp],edi
++	mov	DWORD [4+ebp],esi
++	mov	DWORD [8+ebp],ecx
++	mov	ecx,ebx
++	mov	DWORD [12+ebp],ebx
++	test	edi,15
++	cmovnz	edi,esp
++	test	esi,15
++	jz	NEAR L$032cfb_inp_aligned
++	shr	ecx,2
++db	243,165
++	sub	edi,ebx
++	mov	ecx,ebx
++	mov	esi,edi
++L$032cfb_inp_aligned:
++	lea	eax,[edx-16]
++	lea	ebx,[16+edx]
++	shr	ecx,4
++db	243,15,167,224
++	movaps	xmm0,[eax]
++	movaps	[edx-16],xmm0
++	mov	edi,DWORD [ebp]
++	mov	ebx,DWORD [12+ebp]
++	test	edi,15
++	jz	NEAR L$033cfb_out_aligned
++	mov	ecx,ebx
++	lea	esi,[esp]
++	shr	ecx,2
++db	243,165
++	sub	edi,ebx
++L$033cfb_out_aligned:
++	mov	esi,DWORD [4+ebp]
++	mov	ecx,DWORD [8+ebp]
++	add	edi,ebx
++	add	esi,ebx
++	sub	ecx,ebx
++	mov	ebx,512
++	jnz	NEAR L$031cfb_loop
++	cmp	esp,ebp
++	je	NEAR L$034cfb_done
++	pxor	xmm0,xmm0
++	lea	eax,[esp]
++L$035cfb_bzero:
++	movaps	[eax],xmm0
++	lea	eax,[16+eax]
++	cmp	ebp,eax
++	ja	NEAR L$035cfb_bzero
++L$034cfb_done:
++	mov	ebp,DWORD [16+ebp]
++	lea	esp,[24+ebp]
++	jmp	NEAR L$036cfb_exit
++align	16
++L$030cfb_aligned:
++	lea	eax,[edx-16]
++	lea	ebx,[16+edx]
++	shr	ecx,4
++db	243,15,167,224
++	movaps	xmm0,[eax]
++	movaps	[edx-16],xmm0
++L$036cfb_exit:
++	mov	eax,1
++	lea	esp,[4+esp]
++L$028cfb_abort:
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_padlock_ofb_encrypt
++align	16
++_padlock_ofb_encrypt:
++L$_padlock_ofb_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	edi,DWORD [20+esp]
++	mov	esi,DWORD [24+esp]
++	mov	edx,DWORD [28+esp]
++	mov	ecx,DWORD [32+esp]
++	test	edx,15
++	jnz	NEAR L$037ofb_abort
++	test	ecx,15
++	jnz	NEAR L$037ofb_abort
++	lea	eax,[L$padlock_saved_context]
++	pushfd
++	cld
++	call	__padlock_verify_ctx
++L$038ofb_pic_point:
++	lea	edx,[16+edx]
++	xor	eax,eax
++	xor	ebx,ebx
++	test	DWORD [edx],32
++	jnz	NEAR L$039ofb_aligned
++	test	edi,15
++	setz	al
++	test	esi,15
++	setz	bl
++	test	eax,ebx
++	jnz	NEAR L$039ofb_aligned
++	neg	eax
++	mov	ebx,512
++	not	eax
++	lea	ebp,[esp-24]
++	cmp	ecx,ebx
++	cmovc	ebx,ecx
++	and	eax,ebx
++	mov	ebx,ecx
++	neg	eax
++	and	ebx,511
++	lea	esp,[ebp*1+eax]
++	mov	eax,512
++	cmovz	ebx,eax
++	mov	eax,ebp
++	and	ebp,-16
++	and	esp,-16
++	mov	DWORD [16+ebp],eax
++	jmp	NEAR L$040ofb_loop
++align	16
++L$040ofb_loop:
++	mov	DWORD [ebp],edi
++	mov	DWORD [4+ebp],esi
++	mov	DWORD [8+ebp],ecx
++	mov	ecx,ebx
++	mov	DWORD [12+ebp],ebx
++	test	edi,15
++	cmovnz	edi,esp
++	test	esi,15
++	jz	NEAR L$041ofb_inp_aligned
++	shr	ecx,2
++db	243,165
++	sub	edi,ebx
++	mov	ecx,ebx
++	mov	esi,edi
++L$041ofb_inp_aligned:
++	lea	eax,[edx-16]
++	lea	ebx,[16+edx]
++	shr	ecx,4
++db	243,15,167,232
++	movaps	xmm0,[eax]
++	movaps	[edx-16],xmm0
++	mov	edi,DWORD [ebp]
++	mov	ebx,DWORD [12+ebp]
++	test	edi,15
++	jz	NEAR L$042ofb_out_aligned
++	mov	ecx,ebx
++	lea	esi,[esp]
++	shr	ecx,2
++db	243,165
++	sub	edi,ebx
++L$042ofb_out_aligned:
++	mov	esi,DWORD [4+ebp]
++	mov	ecx,DWORD [8+ebp]
++	add	edi,ebx
++	add	esi,ebx
++	sub	ecx,ebx
++	mov	ebx,512
++	jnz	NEAR L$040ofb_loop
++	cmp	esp,ebp
++	je	NEAR L$043ofb_done
++	pxor	xmm0,xmm0
++	lea	eax,[esp]
++L$044ofb_bzero:
++	movaps	[eax],xmm0
++	lea	eax,[16+eax]
++	cmp	ebp,eax
++	ja	NEAR L$044ofb_bzero
++L$043ofb_done:
++	mov	ebp,DWORD [16+ebp]
++	lea	esp,[24+ebp]
++	jmp	NEAR L$045ofb_exit
++align	16
++L$039ofb_aligned:
++	lea	eax,[edx-16]
++	lea	ebx,[16+edx]
++	shr	ecx,4
++db	243,15,167,232
++	movaps	xmm0,[eax]
++	movaps	[edx-16],xmm0
++L$045ofb_exit:
++	mov	eax,1
++	lea	esp,[4+esp]
++L$037ofb_abort:
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_padlock_ctr32_encrypt
++align	16
++_padlock_ctr32_encrypt:
++L$_padlock_ctr32_encrypt_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	edi,DWORD [20+esp]
++	mov	esi,DWORD [24+esp]
++	mov	edx,DWORD [28+esp]
++	mov	ecx,DWORD [32+esp]
++	test	edx,15
++	jnz	NEAR L$046ctr32_abort
++	test	ecx,15
++	jnz	NEAR L$046ctr32_abort
++	lea	eax,[L$padlock_saved_context]
++	pushfd
++	cld
++	call	__padlock_verify_ctx
++L$047ctr32_pic_point:
++	lea	edx,[16+edx]
++	xor	eax,eax
++	movq	mm0,[edx-16]
++	mov	ebx,512
++	not	eax
++	lea	ebp,[esp-24]
++	cmp	ecx,ebx
++	cmovc	ebx,ecx
++	and	eax,ebx
++	mov	ebx,ecx
++	neg	eax
++	and	ebx,511
++	lea	esp,[ebp*1+eax]
++	mov	eax,512
++	cmovz	ebx,eax
++	mov	eax,ebp
++	and	ebp,-16
++	and	esp,-16
++	mov	DWORD [16+ebp],eax
++	jmp	NEAR L$048ctr32_loop
++align	16
++L$048ctr32_loop:
++	mov	DWORD [ebp],edi
++	mov	DWORD [4+ebp],esi
++	mov	DWORD [8+ebp],ecx
++	mov	ecx,ebx
++	mov	DWORD [12+ebp],ebx
++	mov	ecx,DWORD [edx-4]
++	xor	edi,edi
++	mov	eax,DWORD [edx-8]
++L$049ctr32_prepare:
++	mov	DWORD [12+edi*1+esp],ecx
++	bswap	ecx
++	movq	[edi*1+esp],mm0
++	inc	ecx
++	mov	DWORD [8+edi*1+esp],eax
++	bswap	ecx
++	lea	edi,[16+edi]
++	cmp	edi,ebx
++	jb	NEAR L$049ctr32_prepare
++	mov	DWORD [edx-4],ecx
++	lea	esi,[esp]
++	lea	edi,[esp]
++	mov	ecx,ebx
++	lea	eax,[edx-16]
++	lea	ebx,[16+edx]
++	shr	ecx,4
++db	243,15,167,200
++	mov	edi,DWORD [ebp]
++	mov	ebx,DWORD [12+ebp]
++	mov	esi,DWORD [4+ebp]
++	xor	ecx,ecx
++L$050ctr32_xor:
++	movups	xmm1,[ecx*1+esi]
++	lea	ecx,[16+ecx]
++	pxor	xmm1,[ecx*1+esp-16]
++	movups	[ecx*1+edi-16],xmm1
++	cmp	ecx,ebx
++	jb	NEAR L$050ctr32_xor
++	mov	ecx,DWORD [8+ebp]
++	add	edi,ebx
++	add	esi,ebx
++	sub	ecx,ebx
++	mov	ebx,512
++	jnz	NEAR L$048ctr32_loop
++	pxor	xmm0,xmm0
++	lea	eax,[esp]
++L$051ctr32_bzero:
++	movaps	[eax],xmm0
++	lea	eax,[16+eax]
++	cmp	ebp,eax
++	ja	NEAR L$051ctr32_bzero
++L$052ctr32_done:
++	mov	ebp,DWORD [16+ebp]
++	lea	esp,[24+ebp]
++	mov	eax,1
++	lea	esp,[4+esp]
++	emms
++L$046ctr32_abort:
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_padlock_xstore
++align	16
++_padlock_xstore:
++L$_padlock_xstore_begin:
++	push	edi
++	mov	edi,DWORD [8+esp]
++	mov	edx,DWORD [12+esp]
++db	15,167,192
++	pop	edi
++	ret
++align	16
++__win32_segv_handler:
++	mov	eax,1
++	mov	edx,DWORD [4+esp]
++	mov	ecx,DWORD [12+esp]
++	cmp	DWORD [edx],3221225477
++	jne	NEAR L$053ret
++	add	DWORD [184+ecx],4
++	mov	eax,0
++L$053ret:
++	ret
++%if	__NASM_VERSION_ID__ >= 0x02030000
++safeseh	__win32_segv_handler
++%endif
++global	_padlock_sha1_oneshot
++align	16
++_padlock_sha1_oneshot:
++L$_padlock_sha1_oneshot_begin:
++	push	edi
++	push	esi
++	xor	eax,eax
++	mov	edi,DWORD [12+esp]
++	mov	esi,DWORD [16+esp]
++	mov	ecx,DWORD [20+esp]
++	push	__win32_segv_handler
++db	100,255,48
++db	100,137,32
++	mov	edx,esp
++	add	esp,-128
++	movups	xmm0,[edi]
++	and	esp,-16
++	mov	eax,DWORD [16+edi]
++	movaps	[esp],xmm0
++	mov	edi,esp
++	mov	DWORD [16+esp],eax
++	xor	eax,eax
++db	243,15,166,200
++	movaps	xmm0,[esp]
++	mov	eax,DWORD [16+esp]
++	mov	esp,edx
++db	100,143,5,0,0,0,0
++	lea	esp,[4+esp]
++	mov	edi,DWORD [16+esp]
++	movups	[edi],xmm0
++	mov	DWORD [16+edi],eax
++	pop	esi
++	pop	edi
++	ret
++global	_padlock_sha1_blocks
++align	16
++_padlock_sha1_blocks:
++L$_padlock_sha1_blocks_begin:
++	push	edi
++	push	esi
++	mov	edi,DWORD [12+esp]
++	mov	esi,DWORD [16+esp]
++	mov	edx,esp
++	mov	ecx,DWORD [20+esp]
++	add	esp,-128
++	movups	xmm0,[edi]
++	and	esp,-16
++	mov	eax,DWORD [16+edi]
++	movaps	[esp],xmm0
++	mov	edi,esp
++	mov	DWORD [16+esp],eax
++	mov	eax,-1
++db	243,15,166,200
++	movaps	xmm0,[esp]
++	mov	eax,DWORD [16+esp]
++	mov	esp,edx
++	mov	edi,DWORD [12+esp]
++	movups	[edi],xmm0
++	mov	DWORD [16+edi],eax
++	pop	esi
++	pop	edi
++	ret
++global	_padlock_sha256_oneshot
++align	16
++_padlock_sha256_oneshot:
++L$_padlock_sha256_oneshot_begin:
++	push	edi
++	push	esi
++	xor	eax,eax
++	mov	edi,DWORD [12+esp]
++	mov	esi,DWORD [16+esp]
++	mov	ecx,DWORD [20+esp]
++	push	__win32_segv_handler
++db	100,255,48
++db	100,137,32
++	mov	edx,esp
++	add	esp,-128
++	movups	xmm0,[edi]
++	and	esp,-16
++	movups	xmm1,[16+edi]
++	movaps	[esp],xmm0
++	mov	edi,esp
++	movaps	[16+esp],xmm1
++	xor	eax,eax
++db	243,15,166,208
++	movaps	xmm0,[esp]
++	movaps	xmm1,[16+esp]
++	mov	esp,edx
++db	100,143,5,0,0,0,0
++	lea	esp,[4+esp]
++	mov	edi,DWORD [16+esp]
++	movups	[edi],xmm0
++	movups	[16+edi],xmm1
++	pop	esi
++	pop	edi
++	ret
++global	_padlock_sha256_blocks
++align	16
++_padlock_sha256_blocks:
++L$_padlock_sha256_blocks_begin:
++	push	edi
++	push	esi
++	mov	edi,DWORD [12+esp]
++	mov	esi,DWORD [16+esp]
++	mov	ecx,DWORD [20+esp]
++	mov	edx,esp
++	add	esp,-128
++	movups	xmm0,[edi]
++	and	esp,-16
++	movups	xmm1,[16+edi]
++	movaps	[esp],xmm0
++	mov	edi,esp
++	movaps	[16+esp],xmm1
++	mov	eax,-1
++db	243,15,166,208
++	movaps	xmm0,[esp]
++	movaps	xmm1,[16+esp]
++	mov	esp,edx
++	mov	edi,DWORD [12+esp]
++	movups	[edi],xmm0
++	movups	[16+edi],xmm1
++	pop	esi
++	pop	edi
++	ret
++global	_padlock_sha512_blocks
++align	16
++_padlock_sha512_blocks:
++L$_padlock_sha512_blocks_begin:
++	push	edi
++	push	esi
++	mov	edi,DWORD [12+esp]
++	mov	esi,DWORD [16+esp]
++	mov	ecx,DWORD [20+esp]
++	mov	edx,esp
++	add	esp,-128
++	movups	xmm0,[edi]
++	and	esp,-16
++	movups	xmm1,[16+edi]
++	movups	xmm2,[32+edi]
++	movups	xmm3,[48+edi]
++	movaps	[esp],xmm0
++	mov	edi,esp
++	movaps	[16+esp],xmm1
++	movaps	[32+esp],xmm2
++	movaps	[48+esp],xmm3
++db	243,15,166,224
++	movaps	xmm0,[esp]
++	movaps	xmm1,[16+esp]
++	movaps	xmm2,[32+esp]
++	movaps	xmm3,[48+esp]
++	mov	esp,edx
++	mov	edi,DWORD [12+esp]
++	movups	[edi],xmm0
++	movups	[16+edi],xmm1
++	movups	[32+edi],xmm2
++	movups	[48+edi],xmm3
++	pop	esi
++	pop	edi
++	ret
++db	86,73,65,32,80,97,100,108,111,99,107,32,120,56,54,32
++db	109,111,100,117,108,101,44,32,67,82,89,80,84,79,71,65
++db	77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101
++db	110,115,115,108,46,111,114,103,62,0
++align	16
++section	.data align=4
++align	4
++L$padlock_saved_context:
++dd	0
+diff --git a/SMP/lib/accelerated/x86/coff/e_padlock-x86_64.asm b/SMP/lib/accelerated/x86/coff/e_padlock-x86_64.asm
+new file mode 100644
+index 0000000..1cb48ea
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/e_padlock-x86_64.asm
+@@ -0,0 +1,1171 @@
++default	rel
++%define XMMWORD
++%define YMMWORD
++%define ZMMWORD
++section	.text code align=64
++
++global	padlock_capability
++
++ALIGN	16
++padlock_capability:
++	mov	r8,rbx
++	xor	eax,eax
++	cpuid
++	xor	eax,eax
++	cmp	ebx,0x746e6543
++	jne	NEAR $L$noluck
++	cmp	edx,0x48727561
++	jne	NEAR $L$noluck
++	cmp	ecx,0x736c7561
++	jne	NEAR $L$noluck
++	mov	eax,0xC0000000
++	cpuid
++	mov	edx,eax
++	xor	eax,eax
++	cmp	edx,0xC0000001
++	jb	NEAR $L$noluck
++	mov	eax,0xC0000001
++	cpuid
++	mov	eax,edx
++	and	eax,0xffffffef
++	or	eax,0x10
++$L$noluck:
++	mov	rbx,r8
++	DB	0F3h,0C3h		;repret
++
++
++global	padlock_key_bswap
++
++ALIGN	16
++padlock_key_bswap:
++	mov	edx,DWORD[240+rcx]
++$L$bswap_loop:
++	mov	eax,DWORD[rcx]
++	bswap	eax
++	mov	DWORD[rcx],eax
++	lea	rcx,[4+rcx]
++	sub	edx,1
++	jnz	NEAR $L$bswap_loop
++	DB	0F3h,0C3h		;repret
++
++
++global	padlock_verify_context
++
++ALIGN	16
++padlock_verify_context:
++	mov	rdx,rcx
++	pushf
++	lea	rax,[$L$padlock_saved_context]
++	call	_padlock_verify_ctx
++	lea	rsp,[8+rsp]
++	DB	0F3h,0C3h		;repret
++
++
++
++ALIGN	16
++_padlock_verify_ctx:
++	mov	r8,QWORD[8+rsp]
++	bt	r8,30
++	jnc	NEAR $L$verified
++	cmp	rdx,QWORD[rax]
++	je	NEAR $L$verified
++	pushf
++	popf
++$L$verified:
++	mov	QWORD[rax],rdx
++	DB	0F3h,0C3h		;repret
++
++
++global	padlock_reload_key
++
++ALIGN	16
++padlock_reload_key:
++	pushf
++	popf
++	DB	0F3h,0C3h		;repret
++
++
++global	padlock_aes_block
++
++ALIGN	16
++padlock_aes_block:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_aes_block:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	mov	r8,rbx
++	mov	rcx,1
++	lea	rbx,[32+rdx]
++	lea	rdx,[16+rdx]
++DB	0xf3,0x0f,0xa7,0xc8
++	mov	rbx,r8
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_aes_block:
++
++global	padlock_xstore
++
++ALIGN	16
++padlock_xstore:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_xstore:
++	mov	rdi,rcx
++	mov	rsi,rdx
++
++
++	mov	edx,esi
++DB	0x0f,0xa7,0xc0
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_xstore:
++
++global	padlock_sha1_oneshot
++
++ALIGN	16
++padlock_sha1_oneshot:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_sha1_oneshot:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	mov	rcx,rdx
++	mov	rdx,rdi
++	movups	xmm0,XMMWORD[rdi]
++	sub	rsp,128+8
++	mov	eax,DWORD[16+rdi]
++	movaps	XMMWORD[rsp],xmm0
++	mov	rdi,rsp
++	mov	DWORD[16+rsp],eax
++	xor	rax,rax
++DB	0xf3,0x0f,0xa6,0xc8
++	movaps	xmm0,XMMWORD[rsp]
++	mov	eax,DWORD[16+rsp]
++	add	rsp,128+8
++	movups	XMMWORD[rdx],xmm0
++	mov	DWORD[16+rdx],eax
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_sha1_oneshot:
++
++global	padlock_sha1_blocks
++
++ALIGN	16
++padlock_sha1_blocks:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_sha1_blocks:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	mov	rcx,rdx
++	mov	rdx,rdi
++	movups	xmm0,XMMWORD[rdi]
++	sub	rsp,128+8
++	mov	eax,DWORD[16+rdi]
++	movaps	XMMWORD[rsp],xmm0
++	mov	rdi,rsp
++	mov	DWORD[16+rsp],eax
++	mov	rax,-1
++DB	0xf3,0x0f,0xa6,0xc8
++	movaps	xmm0,XMMWORD[rsp]
++	mov	eax,DWORD[16+rsp]
++	add	rsp,128+8
++	movups	XMMWORD[rdx],xmm0
++	mov	DWORD[16+rdx],eax
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_sha1_blocks:
++
++global	padlock_sha256_oneshot
++
++ALIGN	16
++padlock_sha256_oneshot:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_sha256_oneshot:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	mov	rcx,rdx
++	mov	rdx,rdi
++	movups	xmm0,XMMWORD[rdi]
++	sub	rsp,128+8
++	movups	xmm1,XMMWORD[16+rdi]
++	movaps	XMMWORD[rsp],xmm0
++	mov	rdi,rsp
++	movaps	XMMWORD[16+rsp],xmm1
++	xor	rax,rax
++DB	0xf3,0x0f,0xa6,0xd0
++	movaps	xmm0,XMMWORD[rsp]
++	movaps	xmm1,XMMWORD[16+rsp]
++	add	rsp,128+8
++	movups	XMMWORD[rdx],xmm0
++	movups	XMMWORD[16+rdx],xmm1
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_sha256_oneshot:
++
++global	padlock_sha256_blocks
++
++ALIGN	16
++padlock_sha256_blocks:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_sha256_blocks:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	mov	rcx,rdx
++	mov	rdx,rdi
++	movups	xmm0,XMMWORD[rdi]
++	sub	rsp,128+8
++	movups	xmm1,XMMWORD[16+rdi]
++	movaps	XMMWORD[rsp],xmm0
++	mov	rdi,rsp
++	movaps	XMMWORD[16+rsp],xmm1
++	mov	rax,-1
++DB	0xf3,0x0f,0xa6,0xd0
++	movaps	xmm0,XMMWORD[rsp]
++	movaps	xmm1,XMMWORD[16+rsp]
++	add	rsp,128+8
++	movups	XMMWORD[rdx],xmm0
++	movups	XMMWORD[16+rdx],xmm1
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_sha256_blocks:
++
++global	padlock_sha512_blocks
++
++ALIGN	16
++padlock_sha512_blocks:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_sha512_blocks:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	mov	rcx,rdx
++	mov	rdx,rdi
++	movups	xmm0,XMMWORD[rdi]
++	sub	rsp,128+8
++	movups	xmm1,XMMWORD[16+rdi]
++	movups	xmm2,XMMWORD[32+rdi]
++	movups	xmm3,XMMWORD[48+rdi]
++	movaps	XMMWORD[rsp],xmm0
++	mov	rdi,rsp
++	movaps	XMMWORD[16+rsp],xmm1
++	movaps	XMMWORD[32+rsp],xmm2
++	movaps	XMMWORD[48+rsp],xmm3
++DB	0xf3,0x0f,0xa6,0xe0
++	movaps	xmm0,XMMWORD[rsp]
++	movaps	xmm1,XMMWORD[16+rsp]
++	movaps	xmm2,XMMWORD[32+rsp]
++	movaps	xmm3,XMMWORD[48+rsp]
++	add	rsp,128+8
++	movups	XMMWORD[rdx],xmm0
++	movups	XMMWORD[16+rdx],xmm1
++	movups	XMMWORD[32+rdx],xmm2
++	movups	XMMWORD[48+rdx],xmm3
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_sha512_blocks:
++global	padlock_ecb_encrypt
++
++ALIGN	16
++padlock_ecb_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_ecb_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++
++
++	push	rbp
++	push	rbx
++
++	xor	eax,eax
++	test	rdx,15
++	jnz	NEAR $L$ecb_abort
++	test	rcx,15
++	jnz	NEAR $L$ecb_abort
++	lea	rax,[$L$padlock_saved_context]
++	pushf
++	cld
++	call	_padlock_verify_ctx
++	lea	rdx,[16+rdx]
++	xor	eax,eax
++	xor	ebx,ebx
++	test	DWORD[rdx],32
++	jnz	NEAR $L$ecb_aligned
++	test	rdi,0x0f
++	setz	al
++	test	rsi,0x0f
++	setz	bl
++	test	eax,ebx
++	jnz	NEAR $L$ecb_aligned
++	neg	rax
++	mov	rbx,512
++	not	rax
++	lea	rbp,[rsp]
++	cmp	rcx,rbx
++	cmovc	rbx,rcx
++	and	rax,rbx
++	mov	rbx,rcx
++	neg	rax
++	and	rbx,512-1
++	lea	rsp,[rbp*1+rax]
++	mov	rax,512
++	cmovz	rbx,rax
++	cmp	rcx,rbx
++	ja	NEAR $L$ecb_loop
++	mov	rax,rsi
++	cmp	rbp,rsp
++	cmove	rax,rdi
++	add	rax,rcx
++	neg	rax
++	and	rax,0xfff
++	cmp	rax,128
++	mov	rax,-128
++	cmovae	rax,rbx
++	and	rbx,rax
++	jz	NEAR $L$ecb_unaligned_tail
++	jmp	NEAR $L$ecb_loop
++ALIGN	16
++$L$ecb_loop:
++	cmp	rbx,rcx
++	cmova	rbx,rcx
++	mov	r8,rdi
++	mov	r9,rsi
++	mov	r10,rcx
++	mov	rcx,rbx
++	mov	r11,rbx
++	test	rdi,0x0f
++	cmovnz	rdi,rsp
++	test	rsi,0x0f
++	jz	NEAR $L$ecb_inp_aligned
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++	mov	rcx,rbx
++	mov	rsi,rdi
++$L$ecb_inp_aligned:
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,200
++	mov	rdi,r8
++	mov	rbx,r11
++	test	rdi,0x0f
++	jz	NEAR $L$ecb_out_aligned
++	mov	rcx,rbx
++	lea	rsi,[rsp]
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++$L$ecb_out_aligned:
++	mov	rsi,r9
++	mov	rcx,r10
++	add	rdi,rbx
++	add	rsi,rbx
++	sub	rcx,rbx
++	mov	rbx,512
++	jz	NEAR $L$ecb_break
++	cmp	rcx,rbx
++	jae	NEAR $L$ecb_loop
++$L$ecb_unaligned_tail:
++	xor	eax,eax
++	cmp	rbp,rsp
++	cmove	rax,rcx
++	mov	r8,rdi
++	mov	rbx,rcx
++	sub	rsp,rax
++	shr	rcx,3
++	lea	rdi,[rsp]
++DB	0xf3,0x48,0xa5
++	mov	rsi,rsp
++	mov	rdi,r8
++	mov	rcx,rbx
++	jmp	NEAR $L$ecb_loop
++ALIGN	16
++$L$ecb_break:
++	cmp	rsp,rbp
++	je	NEAR $L$ecb_done
++
++	pxor	xmm0,xmm0
++	lea	rax,[rsp]
++$L$ecb_bzero:
++	movaps	XMMWORD[rax],xmm0
++	lea	rax,[16+rax]
++	cmp	rbp,rax
++	ja	NEAR $L$ecb_bzero
++
++$L$ecb_done:
++	lea	rsp,[rbp]
++	jmp	NEAR $L$ecb_exit
++
++ALIGN	16
++$L$ecb_aligned:
++	lea	rbp,[rcx*1+rsi]
++	neg	rbp
++	and	rbp,0xfff
++	xor	eax,eax
++	cmp	rbp,128
++	mov	rbp,128-1
++	cmovae	rbp,rax
++	and	rbp,rcx
++	sub	rcx,rbp
++	jz	NEAR $L$ecb_aligned_tail
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,200
++	test	rbp,rbp
++	jz	NEAR $L$ecb_exit
++
++$L$ecb_aligned_tail:
++	mov	r8,rdi
++	mov	rbx,rbp
++	mov	rcx,rbp
++	lea	rbp,[rsp]
++	sub	rsp,rcx
++	shr	rcx,3
++	lea	rdi,[rsp]
++DB	0xf3,0x48,0xa5
++	lea	rdi,[r8]
++	lea	rsi,[rsp]
++	mov	rcx,rbx
++	jmp	NEAR $L$ecb_loop
++$L$ecb_exit:
++	mov	eax,1
++	lea	rsp,[8+rsp]
++$L$ecb_abort:
++	pop	rbx
++	pop	rbp
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_ecb_encrypt:
++global	padlock_cbc_encrypt
++
++ALIGN	16
++padlock_cbc_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_cbc_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++
++
++	push	rbp
++	push	rbx
++
++	xor	eax,eax
++	test	rdx,15
++	jnz	NEAR $L$cbc_abort
++	test	rcx,15
++	jnz	NEAR $L$cbc_abort
++	lea	rax,[$L$padlock_saved_context]
++	pushf
++	cld
++	call	_padlock_verify_ctx
++	lea	rdx,[16+rdx]
++	xor	eax,eax
++	xor	ebx,ebx
++	test	DWORD[rdx],32
++	jnz	NEAR $L$cbc_aligned
++	test	rdi,0x0f
++	setz	al
++	test	rsi,0x0f
++	setz	bl
++	test	eax,ebx
++	jnz	NEAR $L$cbc_aligned
++	neg	rax
++	mov	rbx,512
++	not	rax
++	lea	rbp,[rsp]
++	cmp	rcx,rbx
++	cmovc	rbx,rcx
++	and	rax,rbx
++	mov	rbx,rcx
++	neg	rax
++	and	rbx,512-1
++	lea	rsp,[rbp*1+rax]
++	mov	rax,512
++	cmovz	rbx,rax
++	cmp	rcx,rbx
++	ja	NEAR $L$cbc_loop
++	mov	rax,rsi
++	cmp	rbp,rsp
++	cmove	rax,rdi
++	add	rax,rcx
++	neg	rax
++	and	rax,0xfff
++	cmp	rax,64
++	mov	rax,-64
++	cmovae	rax,rbx
++	and	rbx,rax
++	jz	NEAR $L$cbc_unaligned_tail
++	jmp	NEAR $L$cbc_loop
++ALIGN	16
++$L$cbc_loop:
++	cmp	rbx,rcx
++	cmova	rbx,rcx
++	mov	r8,rdi
++	mov	r9,rsi
++	mov	r10,rcx
++	mov	rcx,rbx
++	mov	r11,rbx
++	test	rdi,0x0f
++	cmovnz	rdi,rsp
++	test	rsi,0x0f
++	jz	NEAR $L$cbc_inp_aligned
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++	mov	rcx,rbx
++	mov	rsi,rdi
++$L$cbc_inp_aligned:
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,208
++	movdqa	xmm0,XMMWORD[rax]
++	movdqa	XMMWORD[(-16)+rdx],xmm0
++	mov	rdi,r8
++	mov	rbx,r11
++	test	rdi,0x0f
++	jz	NEAR $L$cbc_out_aligned
++	mov	rcx,rbx
++	lea	rsi,[rsp]
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++$L$cbc_out_aligned:
++	mov	rsi,r9
++	mov	rcx,r10
++	add	rdi,rbx
++	add	rsi,rbx
++	sub	rcx,rbx
++	mov	rbx,512
++	jz	NEAR $L$cbc_break
++	cmp	rcx,rbx
++	jae	NEAR $L$cbc_loop
++$L$cbc_unaligned_tail:
++	xor	eax,eax
++	cmp	rbp,rsp
++	cmove	rax,rcx
++	mov	r8,rdi
++	mov	rbx,rcx
++	sub	rsp,rax
++	shr	rcx,3
++	lea	rdi,[rsp]
++DB	0xf3,0x48,0xa5
++	mov	rsi,rsp
++	mov	rdi,r8
++	mov	rcx,rbx
++	jmp	NEAR $L$cbc_loop
++ALIGN	16
++$L$cbc_break:
++	cmp	rsp,rbp
++	je	NEAR $L$cbc_done
++
++	pxor	xmm0,xmm0
++	lea	rax,[rsp]
++$L$cbc_bzero:
++	movaps	XMMWORD[rax],xmm0
++	lea	rax,[16+rax]
++	cmp	rbp,rax
++	ja	NEAR $L$cbc_bzero
++
++$L$cbc_done:
++	lea	rsp,[rbp]
++	jmp	NEAR $L$cbc_exit
++
++ALIGN	16
++$L$cbc_aligned:
++	lea	rbp,[rcx*1+rsi]
++	neg	rbp
++	and	rbp,0xfff
++	xor	eax,eax
++	cmp	rbp,64
++	mov	rbp,64-1
++	cmovae	rbp,rax
++	and	rbp,rcx
++	sub	rcx,rbp
++	jz	NEAR $L$cbc_aligned_tail
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,208
++	movdqa	xmm0,XMMWORD[rax]
++	movdqa	XMMWORD[(-16)+rdx],xmm0
++	test	rbp,rbp
++	jz	NEAR $L$cbc_exit
++
++$L$cbc_aligned_tail:
++	mov	r8,rdi
++	mov	rbx,rbp
++	mov	rcx,rbp
++	lea	rbp,[rsp]
++	sub	rsp,rcx
++	shr	rcx,3
++	lea	rdi,[rsp]
++DB	0xf3,0x48,0xa5
++	lea	rdi,[r8]
++	lea	rsi,[rsp]
++	mov	rcx,rbx
++	jmp	NEAR $L$cbc_loop
++$L$cbc_exit:
++	mov	eax,1
++	lea	rsp,[8+rsp]
++$L$cbc_abort:
++	pop	rbx
++	pop	rbp
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_cbc_encrypt:
++global	padlock_cfb_encrypt
++
++ALIGN	16
++padlock_cfb_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_cfb_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++
++
++	push	rbp
++	push	rbx
++
++	xor	eax,eax
++	test	rdx,15
++	jnz	NEAR $L$cfb_abort
++	test	rcx,15
++	jnz	NEAR $L$cfb_abort
++	lea	rax,[$L$padlock_saved_context]
++	pushf
++	cld
++	call	_padlock_verify_ctx
++	lea	rdx,[16+rdx]
++	xor	eax,eax
++	xor	ebx,ebx
++	test	DWORD[rdx],32
++	jnz	NEAR $L$cfb_aligned
++	test	rdi,0x0f
++	setz	al
++	test	rsi,0x0f
++	setz	bl
++	test	eax,ebx
++	jnz	NEAR $L$cfb_aligned
++	neg	rax
++	mov	rbx,512
++	not	rax
++	lea	rbp,[rsp]
++	cmp	rcx,rbx
++	cmovc	rbx,rcx
++	and	rax,rbx
++	mov	rbx,rcx
++	neg	rax
++	and	rbx,512-1
++	lea	rsp,[rbp*1+rax]
++	mov	rax,512
++	cmovz	rbx,rax
++	jmp	NEAR $L$cfb_loop
++ALIGN	16
++$L$cfb_loop:
++	cmp	rbx,rcx
++	cmova	rbx,rcx
++	mov	r8,rdi
++	mov	r9,rsi
++	mov	r10,rcx
++	mov	rcx,rbx
++	mov	r11,rbx
++	test	rdi,0x0f
++	cmovnz	rdi,rsp
++	test	rsi,0x0f
++	jz	NEAR $L$cfb_inp_aligned
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++	mov	rcx,rbx
++	mov	rsi,rdi
++$L$cfb_inp_aligned:
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,224
++	movdqa	xmm0,XMMWORD[rax]
++	movdqa	XMMWORD[(-16)+rdx],xmm0
++	mov	rdi,r8
++	mov	rbx,r11
++	test	rdi,0x0f
++	jz	NEAR $L$cfb_out_aligned
++	mov	rcx,rbx
++	lea	rsi,[rsp]
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++$L$cfb_out_aligned:
++	mov	rsi,r9
++	mov	rcx,r10
++	add	rdi,rbx
++	add	rsi,rbx
++	sub	rcx,rbx
++	mov	rbx,512
++	jnz	NEAR $L$cfb_loop
++	cmp	rsp,rbp
++	je	NEAR $L$cfb_done
++
++	pxor	xmm0,xmm0
++	lea	rax,[rsp]
++$L$cfb_bzero:
++	movaps	XMMWORD[rax],xmm0
++	lea	rax,[16+rax]
++	cmp	rbp,rax
++	ja	NEAR $L$cfb_bzero
++
++$L$cfb_done:
++	lea	rsp,[rbp]
++	jmp	NEAR $L$cfb_exit
++
++ALIGN	16
++$L$cfb_aligned:
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,224
++	movdqa	xmm0,XMMWORD[rax]
++	movdqa	XMMWORD[(-16)+rdx],xmm0
++$L$cfb_exit:
++	mov	eax,1
++	lea	rsp,[8+rsp]
++$L$cfb_abort:
++	pop	rbx
++	pop	rbp
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_cfb_encrypt:
++global	padlock_ofb_encrypt
++
++ALIGN	16
++padlock_ofb_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_ofb_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++
++
++	push	rbp
++	push	rbx
++
++	xor	eax,eax
++	test	rdx,15
++	jnz	NEAR $L$ofb_abort
++	test	rcx,15
++	jnz	NEAR $L$ofb_abort
++	lea	rax,[$L$padlock_saved_context]
++	pushf
++	cld
++	call	_padlock_verify_ctx
++	lea	rdx,[16+rdx]
++	xor	eax,eax
++	xor	ebx,ebx
++	test	DWORD[rdx],32
++	jnz	NEAR $L$ofb_aligned
++	test	rdi,0x0f
++	setz	al
++	test	rsi,0x0f
++	setz	bl
++	test	eax,ebx
++	jnz	NEAR $L$ofb_aligned
++	neg	rax
++	mov	rbx,512
++	not	rax
++	lea	rbp,[rsp]
++	cmp	rcx,rbx
++	cmovc	rbx,rcx
++	and	rax,rbx
++	mov	rbx,rcx
++	neg	rax
++	and	rbx,512-1
++	lea	rsp,[rbp*1+rax]
++	mov	rax,512
++	cmovz	rbx,rax
++	jmp	NEAR $L$ofb_loop
++ALIGN	16
++$L$ofb_loop:
++	cmp	rbx,rcx
++	cmova	rbx,rcx
++	mov	r8,rdi
++	mov	r9,rsi
++	mov	r10,rcx
++	mov	rcx,rbx
++	mov	r11,rbx
++	test	rdi,0x0f
++	cmovnz	rdi,rsp
++	test	rsi,0x0f
++	jz	NEAR $L$ofb_inp_aligned
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++	mov	rcx,rbx
++	mov	rsi,rdi
++$L$ofb_inp_aligned:
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,232
++	movdqa	xmm0,XMMWORD[rax]
++	movdqa	XMMWORD[(-16)+rdx],xmm0
++	mov	rdi,r8
++	mov	rbx,r11
++	test	rdi,0x0f
++	jz	NEAR $L$ofb_out_aligned
++	mov	rcx,rbx
++	lea	rsi,[rsp]
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++$L$ofb_out_aligned:
++	mov	rsi,r9
++	mov	rcx,r10
++	add	rdi,rbx
++	add	rsi,rbx
++	sub	rcx,rbx
++	mov	rbx,512
++	jnz	NEAR $L$ofb_loop
++	cmp	rsp,rbp
++	je	NEAR $L$ofb_done
++
++	pxor	xmm0,xmm0
++	lea	rax,[rsp]
++$L$ofb_bzero:
++	movaps	XMMWORD[rax],xmm0
++	lea	rax,[16+rax]
++	cmp	rbp,rax
++	ja	NEAR $L$ofb_bzero
++
++$L$ofb_done:
++	lea	rsp,[rbp]
++	jmp	NEAR $L$ofb_exit
++
++ALIGN	16
++$L$ofb_aligned:
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,232
++	movdqa	xmm0,XMMWORD[rax]
++	movdqa	XMMWORD[(-16)+rdx],xmm0
++$L$ofb_exit:
++	mov	eax,1
++	lea	rsp,[8+rsp]
++$L$ofb_abort:
++	pop	rbx
++	pop	rbp
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_ofb_encrypt:
++global	padlock_ctr32_encrypt
++
++ALIGN	16
++padlock_ctr32_encrypt:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_padlock_ctr32_encrypt:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++
++
++	push	rbp
++	push	rbx
++
++	xor	eax,eax
++	test	rdx,15
++	jnz	NEAR $L$ctr32_abort
++	test	rcx,15
++	jnz	NEAR $L$ctr32_abort
++	lea	rax,[$L$padlock_saved_context]
++	pushf
++	cld
++	call	_padlock_verify_ctx
++	lea	rdx,[16+rdx]
++	xor	eax,eax
++	xor	ebx,ebx
++	test	DWORD[rdx],32
++	jnz	NEAR $L$ctr32_aligned
++	test	rdi,0x0f
++	setz	al
++	test	rsi,0x0f
++	setz	bl
++	test	eax,ebx
++	jnz	NEAR $L$ctr32_aligned
++	neg	rax
++	mov	rbx,512
++	not	rax
++	lea	rbp,[rsp]
++	cmp	rcx,rbx
++	cmovc	rbx,rcx
++	and	rax,rbx
++	mov	rbx,rcx
++	neg	rax
++	and	rbx,512-1
++	lea	rsp,[rbp*1+rax]
++	mov	rax,512
++	cmovz	rbx,rax
++$L$ctr32_reenter:
++	mov	eax,DWORD[((-4))+rdx]
++	bswap	eax
++	neg	eax
++	and	eax,31
++	mov	rbx,512
++	shl	eax,4
++	cmovz	rax,rbx
++	cmp	rcx,rax
++	cmova	rbx,rax
++	cmovbe	rbx,rcx
++	cmp	rcx,rbx
++	ja	NEAR $L$ctr32_loop
++	mov	rax,rsi
++	cmp	rbp,rsp
++	cmove	rax,rdi
++	add	rax,rcx
++	neg	rax
++	and	rax,0xfff
++	cmp	rax,32
++	mov	rax,-32
++	cmovae	rax,rbx
++	and	rbx,rax
++	jz	NEAR $L$ctr32_unaligned_tail
++	jmp	NEAR $L$ctr32_loop
++ALIGN	16
++$L$ctr32_loop:
++	cmp	rbx,rcx
++	cmova	rbx,rcx
++	mov	r8,rdi
++	mov	r9,rsi
++	mov	r10,rcx
++	mov	rcx,rbx
++	mov	r11,rbx
++	test	rdi,0x0f
++	cmovnz	rdi,rsp
++	test	rsi,0x0f
++	jz	NEAR $L$ctr32_inp_aligned
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++	mov	rcx,rbx
++	mov	rsi,rdi
++$L$ctr32_inp_aligned:
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,216
++	mov	eax,DWORD[((-4))+rdx]
++	test	eax,0xffff0000
++	jnz	NEAR $L$ctr32_no_carry
++	bswap	eax
++	add	eax,0x10000
++	bswap	eax
++	mov	DWORD[((-4))+rdx],eax
++$L$ctr32_no_carry:
++	mov	rdi,r8
++	mov	rbx,r11
++	test	rdi,0x0f
++	jz	NEAR $L$ctr32_out_aligned
++	mov	rcx,rbx
++	lea	rsi,[rsp]
++	shr	rcx,3
++DB	0xf3,0x48,0xa5
++	sub	rdi,rbx
++$L$ctr32_out_aligned:
++	mov	rsi,r9
++	mov	rcx,r10
++	add	rdi,rbx
++	add	rsi,rbx
++	sub	rcx,rbx
++	mov	rbx,512
++	jz	NEAR $L$ctr32_break
++	cmp	rcx,rbx
++	jae	NEAR $L$ctr32_loop
++	mov	rbx,rcx
++	mov	rax,rsi
++	cmp	rbp,rsp
++	cmove	rax,rdi
++	add	rax,rcx
++	neg	rax
++	and	rax,0xfff
++	cmp	rax,32
++	mov	rax,-32
++	cmovae	rax,rbx
++	and	rbx,rax
++	jnz	NEAR $L$ctr32_loop
++$L$ctr32_unaligned_tail:
++	xor	eax,eax
++	cmp	rbp,rsp
++	cmove	rax,rcx
++	mov	r8,rdi
++	mov	rbx,rcx
++	sub	rsp,rax
++	shr	rcx,3
++	lea	rdi,[rsp]
++DB	0xf3,0x48,0xa5
++	mov	rsi,rsp
++	mov	rdi,r8
++	mov	rcx,rbx
++	jmp	NEAR $L$ctr32_loop
++ALIGN	16
++$L$ctr32_break:
++	cmp	rsp,rbp
++	je	NEAR $L$ctr32_done
++
++	pxor	xmm0,xmm0
++	lea	rax,[rsp]
++$L$ctr32_bzero:
++	movaps	XMMWORD[rax],xmm0
++	lea	rax,[16+rax]
++	cmp	rbp,rax
++	ja	NEAR $L$ctr32_bzero
++
++$L$ctr32_done:
++	lea	rsp,[rbp]
++	jmp	NEAR $L$ctr32_exit
++
++ALIGN	16
++$L$ctr32_aligned:
++	mov	eax,DWORD[((-4))+rdx]
++	bswap	eax
++	neg	eax
++	and	eax,0xffff
++	mov	rbx,1048576
++	shl	eax,4
++	cmovz	rax,rbx
++	cmp	rcx,rax
++	cmova	rbx,rax
++	cmovbe	rbx,rcx
++	jbe	NEAR $L$ctr32_aligned_skip
++
++$L$ctr32_aligned_loop:
++	mov	r10,rcx
++	mov	rcx,rbx
++	mov	r11,rbx
++
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,216
++
++	mov	eax,DWORD[((-4))+rdx]
++	bswap	eax
++	add	eax,0x10000
++	bswap	eax
++	mov	DWORD[((-4))+rdx],eax
++
++	mov	rcx,r10
++	sub	rcx,r11
++	mov	rbx,1048576
++	jz	NEAR $L$ctr32_exit
++	cmp	rcx,rbx
++	jae	NEAR $L$ctr32_aligned_loop
++
++$L$ctr32_aligned_skip:
++	lea	rbp,[rcx*1+rsi]
++	neg	rbp
++	and	rbp,0xfff
++	xor	eax,eax
++	cmp	rbp,32
++	mov	rbp,32-1
++	cmovae	rbp,rax
++	and	rbp,rcx
++	sub	rcx,rbp
++	jz	NEAR $L$ctr32_aligned_tail
++	lea	rax,[((-16))+rdx]
++	lea	rbx,[16+rdx]
++	shr	rcx,4
++DB	0xf3,0x0f,0xa7,216
++	test	rbp,rbp
++	jz	NEAR $L$ctr32_exit
++
++$L$ctr32_aligned_tail:
++	mov	r8,rdi
++	mov	rbx,rbp
++	mov	rcx,rbp
++	lea	rbp,[rsp]
++	sub	rsp,rcx
++	shr	rcx,3
++	lea	rdi,[rsp]
++DB	0xf3,0x48,0xa5
++	lea	rdi,[r8]
++	lea	rsi,[rsp]
++	mov	rcx,rbx
++	jmp	NEAR $L$ctr32_loop
++$L$ctr32_exit:
++	mov	eax,1
++	lea	rsp,[8+rsp]
++$L$ctr32_abort:
++	pop	rbx
++	pop	rbp
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_padlock_ctr32_encrypt:
++DB	86,73,65,32,80,97,100,108,111,99,107,32,120,56,54,95
++DB	54,52,32,109,111,100,117,108,101,44,32,67,82,89,80,84
++DB	79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64
++DB	111,112,101,110,115,115,108,46,111,114,103,62,0
++ALIGN	16
++section	.data data align=8
++
++ALIGN	8
++$L$padlock_saved_context:
++	DQ	0
+diff --git a/SMP/lib/accelerated/x86/coff/ghash-x86.asm b/SMP/lib/accelerated/x86/coff/ghash-x86.asm
+new file mode 100644
+index 0000000..3dfb7d8
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/ghash-x86.asm
+@@ -0,0 +1,692 @@
++%ifidn __OUTPUT_FORMAT__,obj
++section	code	use32 class=code align=64
++%elifidn __OUTPUT_FORMAT__,win32
++%ifndef __YASM_VER__
++$@feat.00 equ 1
++%endif
++section	.text	code align=64
++%else
++section	.text	code
++%endif
++global	_gcm_gmult_4bit_x86
++align	16
++_gcm_gmult_4bit_x86:
++L$_gcm_gmult_4bit_x86_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	sub	esp,84
++	mov	edi,DWORD [104+esp]
++	mov	esi,DWORD [108+esp]
++	mov	ebp,DWORD [edi]
++	mov	edx,DWORD [4+edi]
++	mov	ecx,DWORD [8+edi]
++	mov	ebx,DWORD [12+edi]
++	mov	DWORD [16+esp],0
++	mov	DWORD [20+esp],471859200
++	mov	DWORD [24+esp],943718400
++	mov	DWORD [28+esp],610271232
++	mov	DWORD [32+esp],1887436800
++	mov	DWORD [36+esp],1822425088
++	mov	DWORD [40+esp],1220542464
++	mov	DWORD [44+esp],1423966208
++	mov	DWORD [48+esp],3774873600
++	mov	DWORD [52+esp],4246732800
++	mov	DWORD [56+esp],3644850176
++	mov	DWORD [60+esp],3311403008
++	mov	DWORD [64+esp],2441084928
++	mov	DWORD [68+esp],2376073216
++	mov	DWORD [72+esp],2847932416
++	mov	DWORD [76+esp],3051356160
++	mov	DWORD [esp],ebp
++	mov	DWORD [4+esp],edx
++	mov	DWORD [8+esp],ecx
++	mov	DWORD [12+esp],ebx
++	shr	ebx,20
++	and	ebx,240
++	mov	ebp,DWORD [4+ebx*1+esi]
++	mov	edx,DWORD [ebx*1+esi]
++	mov	ecx,DWORD [12+ebx*1+esi]
++	mov	ebx,DWORD [8+ebx*1+esi]
++	xor	eax,eax
++	mov	edi,15
++	jmp	NEAR L$000x86_loop
++align	16
++L$000x86_loop:
++	mov	al,bl
++	shrd	ebx,ecx,4
++	and	al,15
++	shrd	ecx,edx,4
++	shrd	edx,ebp,4
++	shr	ebp,4
++	xor	ebp,DWORD [16+eax*4+esp]
++	mov	al,BYTE [edi*1+esp]
++	and	al,240
++	xor	ebx,DWORD [8+eax*1+esi]
++	xor	ecx,DWORD [12+eax*1+esi]
++	xor	edx,DWORD [eax*1+esi]
++	xor	ebp,DWORD [4+eax*1+esi]
++	dec	edi
++	js	NEAR L$001x86_break
++	mov	al,bl
++	shrd	ebx,ecx,4
++	and	al,15
++	shrd	ecx,edx,4
++	shrd	edx,ebp,4
++	shr	ebp,4
++	xor	ebp,DWORD [16+eax*4+esp]
++	mov	al,BYTE [edi*1+esp]
++	shl	al,4
++	xor	ebx,DWORD [8+eax*1+esi]
++	xor	ecx,DWORD [12+eax*1+esi]
++	xor	edx,DWORD [eax*1+esi]
++	xor	ebp,DWORD [4+eax*1+esi]
++	jmp	NEAR L$000x86_loop
++align	16
++L$001x86_break:
++	bswap	ebx
++	bswap	ecx
++	bswap	edx
++	bswap	ebp
++	mov	edi,DWORD [104+esp]
++	mov	DWORD [12+edi],ebx
++	mov	DWORD [8+edi],ecx
++	mov	DWORD [4+edi],edx
++	mov	DWORD [edi],ebp
++	add	esp,84
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_gcm_ghash_4bit_x86
++align	16
++_gcm_ghash_4bit_x86:
++L$_gcm_ghash_4bit_x86_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	sub	esp,84
++	mov	ebx,DWORD [104+esp]
++	mov	esi,DWORD [108+esp]
++	mov	edi,DWORD [112+esp]
++	mov	ecx,DWORD [116+esp]
++	add	ecx,edi
++	mov	DWORD [116+esp],ecx
++	mov	ebp,DWORD [ebx]
++	mov	edx,DWORD [4+ebx]
++	mov	ecx,DWORD [8+ebx]
++	mov	ebx,DWORD [12+ebx]
++	mov	DWORD [16+esp],0
++	mov	DWORD [20+esp],471859200
++	mov	DWORD [24+esp],943718400
++	mov	DWORD [28+esp],610271232
++	mov	DWORD [32+esp],1887436800
++	mov	DWORD [36+esp],1822425088
++	mov	DWORD [40+esp],1220542464
++	mov	DWORD [44+esp],1423966208
++	mov	DWORD [48+esp],3774873600
++	mov	DWORD [52+esp],4246732800
++	mov	DWORD [56+esp],3644850176
++	mov	DWORD [60+esp],3311403008
++	mov	DWORD [64+esp],2441084928
++	mov	DWORD [68+esp],2376073216
++	mov	DWORD [72+esp],2847932416
++	mov	DWORD [76+esp],3051356160
++align	16
++L$002x86_outer_loop:
++	xor	ebx,DWORD [12+edi]
++	xor	ecx,DWORD [8+edi]
++	xor	edx,DWORD [4+edi]
++	xor	ebp,DWORD [edi]
++	mov	DWORD [12+esp],ebx
++	mov	DWORD [8+esp],ecx
++	mov	DWORD [4+esp],edx
++	mov	DWORD [esp],ebp
++	shr	ebx,20
++	and	ebx,240
++	mov	ebp,DWORD [4+ebx*1+esi]
++	mov	edx,DWORD [ebx*1+esi]
++	mov	ecx,DWORD [12+ebx*1+esi]
++	mov	ebx,DWORD [8+ebx*1+esi]
++	xor	eax,eax
++	mov	edi,15
++	jmp	NEAR L$003x86_loop
++align	16
++L$003x86_loop:
++	mov	al,bl
++	shrd	ebx,ecx,4
++	and	al,15
++	shrd	ecx,edx,4
++	shrd	edx,ebp,4
++	shr	ebp,4
++	xor	ebp,DWORD [16+eax*4+esp]
++	mov	al,BYTE [edi*1+esp]
++	and	al,240
++	xor	ebx,DWORD [8+eax*1+esi]
++	xor	ecx,DWORD [12+eax*1+esi]
++	xor	edx,DWORD [eax*1+esi]
++	xor	ebp,DWORD [4+eax*1+esi]
++	dec	edi
++	js	NEAR L$004x86_break
++	mov	al,bl
++	shrd	ebx,ecx,4
++	and	al,15
++	shrd	ecx,edx,4
++	shrd	edx,ebp,4
++	shr	ebp,4
++	xor	ebp,DWORD [16+eax*4+esp]
++	mov	al,BYTE [edi*1+esp]
++	shl	al,4
++	xor	ebx,DWORD [8+eax*1+esi]
++	xor	ecx,DWORD [12+eax*1+esi]
++	xor	edx,DWORD [eax*1+esi]
++	xor	ebp,DWORD [4+eax*1+esi]
++	jmp	NEAR L$003x86_loop
++align	16
++L$004x86_break:
++	bswap	ebx
++	bswap	ecx
++	bswap	edx
++	bswap	ebp
++	mov	edi,DWORD [112+esp]
++	lea	edi,[16+edi]
++	cmp	edi,DWORD [116+esp]
++	mov	DWORD [112+esp],edi
++	jb	NEAR L$002x86_outer_loop
++	mov	edi,DWORD [104+esp]
++	mov	DWORD [12+edi],ebx
++	mov	DWORD [8+edi],ecx
++	mov	DWORD [4+edi],edx
++	mov	DWORD [edi],ebp
++	add	esp,84
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++align	16
++__mmx_gmult_4bit_inner:
++	xor	ecx,ecx
++	mov	edx,ebx
++	mov	cl,dl
++	shl	cl,4
++	and	edx,240
++	movq	mm0,[8+ecx*1+esi]
++	movq	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [14+edi]
++	psllq	mm2,60
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [13+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [12+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [11+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [10+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [9+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [8+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [7+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [6+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [5+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [4+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [3+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [2+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [1+edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	mov	cl,BYTE [edi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	mov	edx,ecx
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	shl	cl,4
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+ecx*1+esi]
++	psllq	mm2,60
++	and	edx,240
++	pxor	mm1,[ebp*8+eax]
++	and	ebx,15
++	pxor	mm1,[ecx*1+esi]
++	movd	ebp,mm0
++	pxor	mm0,mm2
++	psrlq	mm0,4
++	movq	mm2,mm1
++	psrlq	mm1,4
++	pxor	mm0,[8+edx*1+esi]
++	psllq	mm2,60
++	pxor	mm1,[ebx*8+eax]
++	and	ebp,15
++	pxor	mm1,[edx*1+esi]
++	movd	ebx,mm0
++	pxor	mm0,mm2
++	mov	edi,DWORD [4+ebp*8+eax]
++	psrlq	mm0,32
++	movd	edx,mm1
++	psrlq	mm1,32
++	movd	ecx,mm0
++	movd	ebp,mm1
++	shl	edi,4
++	bswap	ebx
++	bswap	edx
++	bswap	ecx
++	xor	ebp,edi
++	bswap	ebp
++	ret
++global	_gcm_gmult_4bit_mmx
++align	16
++_gcm_gmult_4bit_mmx:
++L$_gcm_gmult_4bit_mmx_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	edi,DWORD [20+esp]
++	mov	esi,DWORD [24+esp]
++	call	L$005pic_point
++L$005pic_point:
++	pop	eax
++	lea	eax,[(L$rem_4bit-L$005pic_point)+eax]
++	movzx	ebx,BYTE [15+edi]
++	call	__mmx_gmult_4bit_inner
++	mov	edi,DWORD [20+esp]
++	emms
++	mov	DWORD [12+edi],ebx
++	mov	DWORD [4+edi],edx
++	mov	DWORD [8+edi],ecx
++	mov	DWORD [edi],ebp
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++global	_gcm_ghash_4bit_mmx
++align	16
++_gcm_ghash_4bit_mmx:
++L$_gcm_ghash_4bit_mmx_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	ebp,DWORD [20+esp]
++	mov	esi,DWORD [24+esp]
++	mov	edi,DWORD [28+esp]
++	mov	ecx,DWORD [32+esp]
++	call	L$006pic_point
++L$006pic_point:
++	pop	eax
++	lea	eax,[(L$rem_4bit-L$006pic_point)+eax]
++	add	ecx,edi
++	mov	DWORD [32+esp],ecx
++	sub	esp,20
++	mov	ebx,DWORD [12+ebp]
++	mov	edx,DWORD [4+ebp]
++	mov	ecx,DWORD [8+ebp]
++	mov	ebp,DWORD [ebp]
++	jmp	NEAR L$007mmx_outer_loop
++align	16
++L$007mmx_outer_loop:
++	xor	ebx,DWORD [12+edi]
++	xor	edx,DWORD [4+edi]
++	xor	ecx,DWORD [8+edi]
++	xor	ebp,DWORD [edi]
++	mov	DWORD [48+esp],edi
++	mov	DWORD [12+esp],ebx
++	mov	DWORD [4+esp],edx
++	mov	DWORD [8+esp],ecx
++	mov	DWORD [esp],ebp
++	mov	edi,esp
++	shr	ebx,24
++	call	__mmx_gmult_4bit_inner
++	mov	edi,DWORD [48+esp]
++	lea	edi,[16+edi]
++	cmp	edi,DWORD [52+esp]
++	jb	NEAR L$007mmx_outer_loop
++	mov	edi,DWORD [40+esp]
++	emms
++	mov	DWORD [12+edi],ebx
++	mov	DWORD [4+edi],edx
++	mov	DWORD [8+edi],ecx
++	mov	DWORD [edi],ebp
++	add	esp,20
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++align	64
++L$rem_4bit:
++dd	0,0,0,29491200,0,58982400,0,38141952
++dd	0,117964800,0,113901568,0,76283904,0,88997888
++dd	0,235929600,0,265420800,0,227803136,0,206962688
++dd	0,152567808,0,148504576,0,177995776,0,190709760
++db	71,72,65,83,72,32,102,111,114,32,120,56,54,44,32,67
++db	82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112
++db	112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62
++db	0
+diff --git a/SMP/lib/accelerated/x86/coff/ghash-x86_64.asm b/SMP/lib/accelerated/x86/coff/ghash-x86_64.asm
+new file mode 100644
+index 0000000..adedc83
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/ghash-x86_64.asm
+@@ -0,0 +1,2018 @@
++default	rel
++%define XMMWORD
++%define YMMWORD
++%define ZMMWORD
++section	.text code align=64
++
++EXTERN	_gnutls_x86_cpuid_s
++
++global	gcm_gmult_4bit
++
++ALIGN	16
++gcm_gmult_4bit:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_gcm_gmult_4bit:
++	mov	rdi,rcx
++	mov	rsi,rdx
++
++
++	push	rbx
++	push	rbp
++	push	r12
++$L$gmult_prologue:
++
++	movzx	r8,BYTE[15+rdi]
++	lea	r11,[$L$rem_4bit]
++	xor	rax,rax
++	xor	rbx,rbx
++	mov	al,r8b
++	mov	bl,r8b
++	shl	al,4
++	mov	rcx,14
++	mov	r8,QWORD[8+rax*1+rsi]
++	mov	r9,QWORD[rax*1+rsi]
++	and	bl,0xf0
++	mov	rdx,r8
++	jmp	NEAR $L$oop1
++
++ALIGN	16
++$L$oop1:
++	shr	r8,4
++	and	rdx,0xf
++	mov	r10,r9
++	mov	al,BYTE[rcx*1+rdi]
++	shr	r9,4
++	xor	r8,QWORD[8+rbx*1+rsi]
++	shl	r10,60
++	xor	r9,QWORD[rbx*1+rsi]
++	mov	bl,al
++	xor	r9,QWORD[rdx*8+r11]
++	mov	rdx,r8
++	shl	al,4
++	xor	r8,r10
++	dec	rcx
++	js	NEAR $L$break1
++
++	shr	r8,4
++	and	rdx,0xf
++	mov	r10,r9
++	shr	r9,4
++	xor	r8,QWORD[8+rax*1+rsi]
++	shl	r10,60
++	xor	r9,QWORD[rax*1+rsi]
++	and	bl,0xf0
++	xor	r9,QWORD[rdx*8+r11]
++	mov	rdx,r8
++	xor	r8,r10
++	jmp	NEAR $L$oop1
++
++ALIGN	16
++$L$break1:
++	shr	r8,4
++	and	rdx,0xf
++	mov	r10,r9
++	shr	r9,4
++	xor	r8,QWORD[8+rax*1+rsi]
++	shl	r10,60
++	xor	r9,QWORD[rax*1+rsi]
++	and	bl,0xf0
++	xor	r9,QWORD[rdx*8+r11]
++	mov	rdx,r8
++	xor	r8,r10
++
++	shr	r8,4
++	and	rdx,0xf
++	mov	r10,r9
++	shr	r9,4
++	xor	r8,QWORD[8+rbx*1+rsi]
++	shl	r10,60
++	xor	r9,QWORD[rbx*1+rsi]
++	xor	r8,r10
++	xor	r9,QWORD[rdx*8+r11]
++
++	bswap	r8
++	bswap	r9
++	mov	QWORD[8+rdi],r8
++	mov	QWORD[rdi],r9
++
++	mov	rbx,QWORD[16+rsp]
++	lea	rsp,[24+rsp]
++$L$gmult_epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_gcm_gmult_4bit:
++global	gcm_ghash_4bit
++
++ALIGN	16
++gcm_ghash_4bit:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_gcm_ghash_4bit:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++	mov	rcx,r9
++
++
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	sub	rsp,280
++$L$ghash_prologue:
++	mov	r14,rdx
++	mov	r15,rcx
++	sub	rsi,-128
++	lea	rbp,[((16+128))+rsp]
++	xor	edx,edx
++	mov	r8,QWORD[((0+0-128))+rsi]
++	mov	rax,QWORD[((0+8-128))+rsi]
++	mov	dl,al
++	shr	rax,4
++	mov	r10,r8
++	shr	r8,4
++	mov	r9,QWORD[((16+0-128))+rsi]
++	shl	dl,4
++	mov	rbx,QWORD[((16+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[rsp],dl
++	or	rax,r10
++	mov	dl,bl
++	shr	rbx,4
++	mov	r10,r9
++	shr	r9,4
++	mov	QWORD[rbp],r8
++	mov	r8,QWORD[((32+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((0-128))+rbp],rax
++	mov	rax,QWORD[((32+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[1+rsp],dl
++	or	rbx,r10
++	mov	dl,al
++	shr	rax,4
++	mov	r10,r8
++	shr	r8,4
++	mov	QWORD[8+rbp],r9
++	mov	r9,QWORD[((48+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((8-128))+rbp],rbx
++	mov	rbx,QWORD[((48+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[2+rsp],dl
++	or	rax,r10
++	mov	dl,bl
++	shr	rbx,4
++	mov	r10,r9
++	shr	r9,4
++	mov	QWORD[16+rbp],r8
++	mov	r8,QWORD[((64+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((16-128))+rbp],rax
++	mov	rax,QWORD[((64+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[3+rsp],dl
++	or	rbx,r10
++	mov	dl,al
++	shr	rax,4
++	mov	r10,r8
++	shr	r8,4
++	mov	QWORD[24+rbp],r9
++	mov	r9,QWORD[((80+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((24-128))+rbp],rbx
++	mov	rbx,QWORD[((80+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[4+rsp],dl
++	or	rax,r10
++	mov	dl,bl
++	shr	rbx,4
++	mov	r10,r9
++	shr	r9,4
++	mov	QWORD[32+rbp],r8
++	mov	r8,QWORD[((96+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((32-128))+rbp],rax
++	mov	rax,QWORD[((96+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[5+rsp],dl
++	or	rbx,r10
++	mov	dl,al
++	shr	rax,4
++	mov	r10,r8
++	shr	r8,4
++	mov	QWORD[40+rbp],r9
++	mov	r9,QWORD[((112+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((40-128))+rbp],rbx
++	mov	rbx,QWORD[((112+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[6+rsp],dl
++	or	rax,r10
++	mov	dl,bl
++	shr	rbx,4
++	mov	r10,r9
++	shr	r9,4
++	mov	QWORD[48+rbp],r8
++	mov	r8,QWORD[((128+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((48-128))+rbp],rax
++	mov	rax,QWORD[((128+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[7+rsp],dl
++	or	rbx,r10
++	mov	dl,al
++	shr	rax,4
++	mov	r10,r8
++	shr	r8,4
++	mov	QWORD[56+rbp],r9
++	mov	r9,QWORD[((144+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((56-128))+rbp],rbx
++	mov	rbx,QWORD[((144+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[8+rsp],dl
++	or	rax,r10
++	mov	dl,bl
++	shr	rbx,4
++	mov	r10,r9
++	shr	r9,4
++	mov	QWORD[64+rbp],r8
++	mov	r8,QWORD[((160+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((64-128))+rbp],rax
++	mov	rax,QWORD[((160+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[9+rsp],dl
++	or	rbx,r10
++	mov	dl,al
++	shr	rax,4
++	mov	r10,r8
++	shr	r8,4
++	mov	QWORD[72+rbp],r9
++	mov	r9,QWORD[((176+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((72-128))+rbp],rbx
++	mov	rbx,QWORD[((176+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[10+rsp],dl
++	or	rax,r10
++	mov	dl,bl
++	shr	rbx,4
++	mov	r10,r9
++	shr	r9,4
++	mov	QWORD[80+rbp],r8
++	mov	r8,QWORD[((192+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((80-128))+rbp],rax
++	mov	rax,QWORD[((192+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[11+rsp],dl
++	or	rbx,r10
++	mov	dl,al
++	shr	rax,4
++	mov	r10,r8
++	shr	r8,4
++	mov	QWORD[88+rbp],r9
++	mov	r9,QWORD[((208+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((88-128))+rbp],rbx
++	mov	rbx,QWORD[((208+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[12+rsp],dl
++	or	rax,r10
++	mov	dl,bl
++	shr	rbx,4
++	mov	r10,r9
++	shr	r9,4
++	mov	QWORD[96+rbp],r8
++	mov	r8,QWORD[((224+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((96-128))+rbp],rax
++	mov	rax,QWORD[((224+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[13+rsp],dl
++	or	rbx,r10
++	mov	dl,al
++	shr	rax,4
++	mov	r10,r8
++	shr	r8,4
++	mov	QWORD[104+rbp],r9
++	mov	r9,QWORD[((240+0-128))+rsi]
++	shl	dl,4
++	mov	QWORD[((104-128))+rbp],rbx
++	mov	rbx,QWORD[((240+8-128))+rsi]
++	shl	r10,60
++	mov	BYTE[14+rsp],dl
++	or	rax,r10
++	mov	dl,bl
++	shr	rbx,4
++	mov	r10,r9
++	shr	r9,4
++	mov	QWORD[112+rbp],r8
++	shl	dl,4
++	mov	QWORD[((112-128))+rbp],rax
++	shl	r10,60
++	mov	BYTE[15+rsp],dl
++	or	rbx,r10
++	mov	QWORD[120+rbp],r9
++	mov	QWORD[((120-128))+rbp],rbx
++	add	rsi,-128
++	mov	r8,QWORD[8+rdi]
++	mov	r9,QWORD[rdi]
++	add	r15,r14
++	lea	r11,[$L$rem_8bit]
++	jmp	NEAR $L$outer_loop
++ALIGN	16
++$L$outer_loop:
++	xor	r9,QWORD[r14]
++	mov	rdx,QWORD[8+r14]
++	lea	r14,[16+r14]
++	xor	rdx,r8
++	mov	QWORD[rdi],r9
++	mov	QWORD[8+rdi],rdx
++	shr	rdx,32
++	xor	rax,rax
++	rol	edx,8
++	mov	al,dl
++	movzx	ebx,dl
++	shl	al,4
++	shr	ebx,4
++	rol	edx,8
++	mov	r8,QWORD[8+rax*1+rsi]
++	mov	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	movzx	ecx,dl
++	shl	al,4
++	movzx	r12,BYTE[rbx*1+rsp]
++	shr	ecx,4
++	xor	r12,r8
++	mov	r10,r9
++	shr	r8,8
++	movzx	r12,r12b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rbx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rbx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r12,WORD[r12*2+r11]
++	movzx	ebx,dl
++	shl	al,4
++	movzx	r13,BYTE[rcx*1+rsp]
++	shr	ebx,4
++	shl	r12,48
++	xor	r13,r8
++	mov	r10,r9
++	xor	r9,r12
++	shr	r8,8
++	movzx	r13,r13b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rcx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rcx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r13,WORD[r13*2+r11]
++	movzx	ecx,dl
++	shl	al,4
++	movzx	r12,BYTE[rbx*1+rsp]
++	shr	ecx,4
++	shl	r13,48
++	xor	r12,r8
++	mov	r10,r9
++	xor	r9,r13
++	shr	r8,8
++	movzx	r12,r12b
++	mov	edx,DWORD[8+rdi]
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rbx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rbx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r12,WORD[r12*2+r11]
++	movzx	ebx,dl
++	shl	al,4
++	movzx	r13,BYTE[rcx*1+rsp]
++	shr	ebx,4
++	shl	r12,48
++	xor	r13,r8
++	mov	r10,r9
++	xor	r9,r12
++	shr	r8,8
++	movzx	r13,r13b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rcx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rcx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r13,WORD[r13*2+r11]
++	movzx	ecx,dl
++	shl	al,4
++	movzx	r12,BYTE[rbx*1+rsp]
++	shr	ecx,4
++	shl	r13,48
++	xor	r12,r8
++	mov	r10,r9
++	xor	r9,r13
++	shr	r8,8
++	movzx	r12,r12b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rbx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rbx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r12,WORD[r12*2+r11]
++	movzx	ebx,dl
++	shl	al,4
++	movzx	r13,BYTE[rcx*1+rsp]
++	shr	ebx,4
++	shl	r12,48
++	xor	r13,r8
++	mov	r10,r9
++	xor	r9,r12
++	shr	r8,8
++	movzx	r13,r13b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rcx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rcx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r13,WORD[r13*2+r11]
++	movzx	ecx,dl
++	shl	al,4
++	movzx	r12,BYTE[rbx*1+rsp]
++	shr	ecx,4
++	shl	r13,48
++	xor	r12,r8
++	mov	r10,r9
++	xor	r9,r13
++	shr	r8,8
++	movzx	r12,r12b
++	mov	edx,DWORD[4+rdi]
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rbx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rbx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r12,WORD[r12*2+r11]
++	movzx	ebx,dl
++	shl	al,4
++	movzx	r13,BYTE[rcx*1+rsp]
++	shr	ebx,4
++	shl	r12,48
++	xor	r13,r8
++	mov	r10,r9
++	xor	r9,r12
++	shr	r8,8
++	movzx	r13,r13b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rcx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rcx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r13,WORD[r13*2+r11]
++	movzx	ecx,dl
++	shl	al,4
++	movzx	r12,BYTE[rbx*1+rsp]
++	shr	ecx,4
++	shl	r13,48
++	xor	r12,r8
++	mov	r10,r9
++	xor	r9,r13
++	shr	r8,8
++	movzx	r12,r12b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rbx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rbx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r12,WORD[r12*2+r11]
++	movzx	ebx,dl
++	shl	al,4
++	movzx	r13,BYTE[rcx*1+rsp]
++	shr	ebx,4
++	shl	r12,48
++	xor	r13,r8
++	mov	r10,r9
++	xor	r9,r12
++	shr	r8,8
++	movzx	r13,r13b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rcx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rcx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r13,WORD[r13*2+r11]
++	movzx	ecx,dl
++	shl	al,4
++	movzx	r12,BYTE[rbx*1+rsp]
++	shr	ecx,4
++	shl	r13,48
++	xor	r12,r8
++	mov	r10,r9
++	xor	r9,r13
++	shr	r8,8
++	movzx	r12,r12b
++	mov	edx,DWORD[rdi]
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rbx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rbx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r12,WORD[r12*2+r11]
++	movzx	ebx,dl
++	shl	al,4
++	movzx	r13,BYTE[rcx*1+rsp]
++	shr	ebx,4
++	shl	r12,48
++	xor	r13,r8
++	mov	r10,r9
++	xor	r9,r12
++	shr	r8,8
++	movzx	r13,r13b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rcx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rcx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r13,WORD[r13*2+r11]
++	movzx	ecx,dl
++	shl	al,4
++	movzx	r12,BYTE[rbx*1+rsp]
++	shr	ecx,4
++	shl	r13,48
++	xor	r12,r8
++	mov	r10,r9
++	xor	r9,r13
++	shr	r8,8
++	movzx	r12,r12b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rbx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rbx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r12,WORD[r12*2+r11]
++	movzx	ebx,dl
++	shl	al,4
++	movzx	r13,BYTE[rcx*1+rsp]
++	shr	ebx,4
++	shl	r12,48
++	xor	r13,r8
++	mov	r10,r9
++	xor	r9,r12
++	shr	r8,8
++	movzx	r13,r13b
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rcx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rcx*8+rbp]
++	rol	edx,8
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	mov	al,dl
++	xor	r8,r10
++	movzx	r13,WORD[r13*2+r11]
++	movzx	ecx,dl
++	shl	al,4
++	movzx	r12,BYTE[rbx*1+rsp]
++	and	ecx,240
++	shl	r13,48
++	xor	r12,r8
++	mov	r10,r9
++	xor	r9,r13
++	shr	r8,8
++	movzx	r12,r12b
++	mov	edx,DWORD[((-4))+rdi]
++	shr	r9,8
++	xor	r8,QWORD[((-128))+rbx*8+rbp]
++	shl	r10,56
++	xor	r9,QWORD[rbx*8+rbp]
++	movzx	r12,WORD[r12*2+r11]
++	xor	r8,QWORD[8+rax*1+rsi]
++	xor	r9,QWORD[rax*1+rsi]
++	shl	r12,48
++	xor	r8,r10
++	xor	r9,r12
++	movzx	r13,r8b
++	shr	r8,4
++	mov	r10,r9
++	shl	r13b,4
++	shr	r9,4
++	xor	r8,QWORD[8+rcx*1+rsi]
++	movzx	r13,WORD[r13*2+r11]
++	shl	r10,60
++	xor	r9,QWORD[rcx*1+rsi]
++	xor	r8,r10
++	shl	r13,48
++	bswap	r8
++	xor	r9,r13
++	bswap	r9
++	cmp	r14,r15
++	jb	NEAR $L$outer_loop
++	mov	QWORD[8+rdi],r8
++	mov	QWORD[rdi],r9
++
++	lea	rsi,[280+rsp]
++	mov	r15,QWORD[rsi]
++	mov	r14,QWORD[8+rsi]
++	mov	r13,QWORD[16+rsi]
++	mov	r12,QWORD[24+rsi]
++	mov	rbp,QWORD[32+rsi]
++	mov	rbx,QWORD[40+rsi]
++	lea	rsp,[48+rsi]
++$L$ghash_epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_gcm_ghash_4bit:
++global	gcm_init_clmul
++
++ALIGN	16
++gcm_init_clmul:
++$L$_init_clmul:
++$L$SEH_begin_gcm_init_clmul:
++
++DB	0x48,0x83,0xec,0x18
++DB	0x0f,0x29,0x34,0x24
++	movdqu	xmm2,XMMWORD[rdx]
++	pshufd	xmm2,xmm2,78
++
++
++	pshufd	xmm4,xmm2,255
++	movdqa	xmm3,xmm2
++	psllq	xmm2,1
++	pxor	xmm5,xmm5
++	psrlq	xmm3,63
++	pcmpgtd	xmm5,xmm4
++	pslldq	xmm3,8
++	por	xmm2,xmm3
++
++
++	pand	xmm5,XMMWORD[$L$0x1c2_polynomial]
++	pxor	xmm2,xmm5
++
++
++	pshufd	xmm6,xmm2,78
++	movdqa	xmm0,xmm2
++	pxor	xmm6,xmm2
++	movdqa	xmm1,xmm0
++	pshufd	xmm3,xmm0,78
++	pxor	xmm3,xmm0
++DB	102,15,58,68,194,0
++DB	102,15,58,68,202,17
++DB	102,15,58,68,222,0
++	pxor	xmm3,xmm0
++	pxor	xmm3,xmm1
++
++	movdqa	xmm4,xmm3
++	psrldq	xmm3,8
++	pslldq	xmm4,8
++	pxor	xmm1,xmm3
++	pxor	xmm0,xmm4
++
++	movdqa	xmm4,xmm0
++	movdqa	xmm3,xmm0
++	psllq	xmm0,5
++	pxor	xmm3,xmm0
++	psllq	xmm0,1
++	pxor	xmm0,xmm3
++	psllq	xmm0,57
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,8
++	psrldq	xmm3,8
++	pxor	xmm0,xmm4
++	pxor	xmm1,xmm3
++
++
++	movdqa	xmm4,xmm0
++	psrlq	xmm0,1
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm0
++	psrlq	xmm0,5
++	pxor	xmm0,xmm4
++	psrlq	xmm0,1
++	pxor	xmm0,xmm1
++	pshufd	xmm3,xmm2,78
++	pshufd	xmm4,xmm0,78
++	pxor	xmm3,xmm2
++	movdqu	XMMWORD[rcx],xmm2
++	pxor	xmm4,xmm0
++	movdqu	XMMWORD[16+rcx],xmm0
++DB	102,15,58,15,227,8
++	movdqu	XMMWORD[32+rcx],xmm4
++	movdqa	xmm1,xmm0
++	pshufd	xmm3,xmm0,78
++	pxor	xmm3,xmm0
++DB	102,15,58,68,194,0
++DB	102,15,58,68,202,17
++DB	102,15,58,68,222,0
++	pxor	xmm3,xmm0
++	pxor	xmm3,xmm1
++
++	movdqa	xmm4,xmm3
++	psrldq	xmm3,8
++	pslldq	xmm4,8
++	pxor	xmm1,xmm3
++	pxor	xmm0,xmm4
++
++	movdqa	xmm4,xmm0
++	movdqa	xmm3,xmm0
++	psllq	xmm0,5
++	pxor	xmm3,xmm0
++	psllq	xmm0,1
++	pxor	xmm0,xmm3
++	psllq	xmm0,57
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,8
++	psrldq	xmm3,8
++	pxor	xmm0,xmm4
++	pxor	xmm1,xmm3
++
++
++	movdqa	xmm4,xmm0
++	psrlq	xmm0,1
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm0
++	psrlq	xmm0,5
++	pxor	xmm0,xmm4
++	psrlq	xmm0,1
++	pxor	xmm0,xmm1
++	movdqa	xmm5,xmm0
++	movdqa	xmm1,xmm0
++	pshufd	xmm3,xmm0,78
++	pxor	xmm3,xmm0
++DB	102,15,58,68,194,0
++DB	102,15,58,68,202,17
++DB	102,15,58,68,222,0
++	pxor	xmm3,xmm0
++	pxor	xmm3,xmm1
++
++	movdqa	xmm4,xmm3
++	psrldq	xmm3,8
++	pslldq	xmm4,8
++	pxor	xmm1,xmm3
++	pxor	xmm0,xmm4
++
++	movdqa	xmm4,xmm0
++	movdqa	xmm3,xmm0
++	psllq	xmm0,5
++	pxor	xmm3,xmm0
++	psllq	xmm0,1
++	pxor	xmm0,xmm3
++	psllq	xmm0,57
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,8
++	psrldq	xmm3,8
++	pxor	xmm0,xmm4
++	pxor	xmm1,xmm3
++
++
++	movdqa	xmm4,xmm0
++	psrlq	xmm0,1
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm0
++	psrlq	xmm0,5
++	pxor	xmm0,xmm4
++	psrlq	xmm0,1
++	pxor	xmm0,xmm1
++	pshufd	xmm3,xmm5,78
++	pshufd	xmm4,xmm0,78
++	pxor	xmm3,xmm5
++	movdqu	XMMWORD[48+rcx],xmm5
++	pxor	xmm4,xmm0
++	movdqu	XMMWORD[64+rcx],xmm0
++DB	102,15,58,15,227,8
++	movdqu	XMMWORD[80+rcx],xmm4
++	movaps	xmm6,XMMWORD[rsp]
++	lea	rsp,[24+rsp]
++$L$SEH_end_gcm_init_clmul:
++	DB	0F3h,0C3h		;repret
++
++global	gcm_gmult_clmul
++
++ALIGN	16
++gcm_gmult_clmul:
++$L$_gmult_clmul:
++	movdqu	xmm0,XMMWORD[rcx]
++	movdqa	xmm5,XMMWORD[$L$bswap_mask]
++	movdqu	xmm2,XMMWORD[rdx]
++	movdqu	xmm4,XMMWORD[32+rdx]
++DB	102,15,56,0,197
++	movdqa	xmm1,xmm0
++	pshufd	xmm3,xmm0,78
++	pxor	xmm3,xmm0
++DB	102,15,58,68,194,0
++DB	102,15,58,68,202,17
++DB	102,15,58,68,220,0
++	pxor	xmm3,xmm0
++	pxor	xmm3,xmm1
++
++	movdqa	xmm4,xmm3
++	psrldq	xmm3,8
++	pslldq	xmm4,8
++	pxor	xmm1,xmm3
++	pxor	xmm0,xmm4
++
++	movdqa	xmm4,xmm0
++	movdqa	xmm3,xmm0
++	psllq	xmm0,5
++	pxor	xmm3,xmm0
++	psllq	xmm0,1
++	pxor	xmm0,xmm3
++	psllq	xmm0,57
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,8
++	psrldq	xmm3,8
++	pxor	xmm0,xmm4
++	pxor	xmm1,xmm3
++
++
++	movdqa	xmm4,xmm0
++	psrlq	xmm0,1
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm0
++	psrlq	xmm0,5
++	pxor	xmm0,xmm4
++	psrlq	xmm0,1
++	pxor	xmm0,xmm1
++DB	102,15,56,0,197
++	movdqu	XMMWORD[rcx],xmm0
++	DB	0F3h,0C3h		;repret
++
++global	gcm_ghash_clmul
++
++ALIGN	32
++gcm_ghash_clmul:
++$L$_ghash_clmul:
++	lea	rax,[((-136))+rsp]
++$L$SEH_begin_gcm_ghash_clmul:
++
++DB	0x48,0x8d,0x60,0xe0
++DB	0x0f,0x29,0x70,0xe0
++DB	0x0f,0x29,0x78,0xf0
++DB	0x44,0x0f,0x29,0x00
++DB	0x44,0x0f,0x29,0x48,0x10
++DB	0x44,0x0f,0x29,0x50,0x20
++DB	0x44,0x0f,0x29,0x58,0x30
++DB	0x44,0x0f,0x29,0x60,0x40
++DB	0x44,0x0f,0x29,0x68,0x50
++DB	0x44,0x0f,0x29,0x70,0x60
++DB	0x44,0x0f,0x29,0x78,0x70
++	movdqa	xmm10,XMMWORD[$L$bswap_mask]
++
++	movdqu	xmm0,XMMWORD[rcx]
++	movdqu	xmm2,XMMWORD[rdx]
++	movdqu	xmm7,XMMWORD[32+rdx]
++DB	102,65,15,56,0,194
++
++	sub	r9,0x10
++	jz	NEAR $L$odd_tail
++
++	movdqu	xmm6,XMMWORD[16+rdx]
++	mov	eax,DWORD[((_gnutls_x86_cpuid_s+4))]
++	cmp	r9,0x30
++	jb	NEAR $L$skip4x
++
++	and	eax,71303168
++	cmp	eax,4194304
++	je	NEAR $L$skip4x
++
++	sub	r9,0x30
++	mov	rax,0xA040608020C0E000
++	movdqu	xmm14,XMMWORD[48+rdx]
++	movdqu	xmm15,XMMWORD[64+rdx]
++
++
++
++
++	movdqu	xmm3,XMMWORD[48+r8]
++	movdqu	xmm11,XMMWORD[32+r8]
++DB	102,65,15,56,0,218
++DB	102,69,15,56,0,218
++	movdqa	xmm5,xmm3
++	pshufd	xmm4,xmm3,78
++	pxor	xmm4,xmm3
++DB	102,15,58,68,218,0
++DB	102,15,58,68,234,17
++DB	102,15,58,68,231,0
++
++	movdqa	xmm13,xmm11
++	pshufd	xmm12,xmm11,78
++	pxor	xmm12,xmm11
++DB	102,68,15,58,68,222,0
++DB	102,68,15,58,68,238,17
++DB	102,68,15,58,68,231,16
++	xorps	xmm3,xmm11
++	xorps	xmm5,xmm13
++	movups	xmm7,XMMWORD[80+rdx]
++	xorps	xmm4,xmm12
++
++	movdqu	xmm11,XMMWORD[16+r8]
++	movdqu	xmm8,XMMWORD[r8]
++DB	102,69,15,56,0,218
++DB	102,69,15,56,0,194
++	movdqa	xmm13,xmm11
++	pshufd	xmm12,xmm11,78
++	pxor	xmm0,xmm8
++	pxor	xmm12,xmm11
++DB	102,69,15,58,68,222,0
++	movdqa	xmm1,xmm0
++	pshufd	xmm8,xmm0,78
++	pxor	xmm8,xmm0
++DB	102,69,15,58,68,238,17
++DB	102,68,15,58,68,231,0
++	xorps	xmm3,xmm11
++	xorps	xmm5,xmm13
++
++	lea	r8,[64+r8]
++	sub	r9,0x40
++	jc	NEAR $L$tail4x
++
++	jmp	NEAR $L$mod4_loop
++ALIGN	32
++$L$mod4_loop:
++DB	102,65,15,58,68,199,0
++	xorps	xmm4,xmm12
++	movdqu	xmm11,XMMWORD[48+r8]
++DB	102,69,15,56,0,218
++DB	102,65,15,58,68,207,17
++	xorps	xmm0,xmm3
++	movdqu	xmm3,XMMWORD[32+r8]
++	movdqa	xmm13,xmm11
++DB	102,68,15,58,68,199,16
++	pshufd	xmm12,xmm11,78
++	xorps	xmm1,xmm5
++	pxor	xmm12,xmm11
++DB	102,65,15,56,0,218
++	movups	xmm7,XMMWORD[32+rdx]
++	xorps	xmm8,xmm4
++DB	102,68,15,58,68,218,0
++	pshufd	xmm4,xmm3,78
++
++	pxor	xmm8,xmm0
++	movdqa	xmm5,xmm3
++	pxor	xmm8,xmm1
++	pxor	xmm4,xmm3
++	movdqa	xmm9,xmm8
++DB	102,68,15,58,68,234,17
++	pslldq	xmm8,8
++	psrldq	xmm9,8
++	pxor	xmm0,xmm8
++	movdqa	xmm8,XMMWORD[$L$7_mask]
++	pxor	xmm1,xmm9
++DB	102,76,15,110,200
++
++	pand	xmm8,xmm0
++DB	102,69,15,56,0,200
++	pxor	xmm9,xmm0
++DB	102,68,15,58,68,231,0
++	psllq	xmm9,57
++	movdqa	xmm8,xmm9
++	pslldq	xmm9,8
++DB	102,15,58,68,222,0
++	psrldq	xmm8,8
++	pxor	xmm0,xmm9
++	pxor	xmm1,xmm8
++	movdqu	xmm8,XMMWORD[r8]
++
++	movdqa	xmm9,xmm0
++	psrlq	xmm0,1
++DB	102,15,58,68,238,17
++	xorps	xmm3,xmm11
++	movdqu	xmm11,XMMWORD[16+r8]
++DB	102,69,15,56,0,218
++DB	102,15,58,68,231,16
++	xorps	xmm5,xmm13
++	movups	xmm7,XMMWORD[80+rdx]
++DB	102,69,15,56,0,194
++	pxor	xmm1,xmm9
++	pxor	xmm9,xmm0
++	psrlq	xmm0,5
++
++	movdqa	xmm13,xmm11
++	pxor	xmm4,xmm12
++	pshufd	xmm12,xmm11,78
++	pxor	xmm0,xmm9
++	pxor	xmm1,xmm8
++	pxor	xmm12,xmm11
++DB	102,69,15,58,68,222,0
++	psrlq	xmm0,1
++	pxor	xmm0,xmm1
++	movdqa	xmm1,xmm0
++DB	102,69,15,58,68,238,17
++	xorps	xmm3,xmm11
++	pshufd	xmm8,xmm0,78
++	pxor	xmm8,xmm0
++
++DB	102,68,15,58,68,231,0
++	xorps	xmm5,xmm13
++
++	lea	r8,[64+r8]
++	sub	r9,0x40
++	jnc	NEAR $L$mod4_loop
++
++$L$tail4x:
++DB	102,65,15,58,68,199,0
++DB	102,65,15,58,68,207,17
++DB	102,68,15,58,68,199,16
++	xorps	xmm4,xmm12
++	xorps	xmm0,xmm3
++	xorps	xmm1,xmm5
++	pxor	xmm1,xmm0
++	pxor	xmm8,xmm4
++
++	pxor	xmm8,xmm1
++	pxor	xmm1,xmm0
++
++	movdqa	xmm9,xmm8
++	psrldq	xmm8,8
++	pslldq	xmm9,8
++	pxor	xmm1,xmm8
++	pxor	xmm0,xmm9
++
++	movdqa	xmm4,xmm0
++	movdqa	xmm3,xmm0
++	psllq	xmm0,5
++	pxor	xmm3,xmm0
++	psllq	xmm0,1
++	pxor	xmm0,xmm3
++	psllq	xmm0,57
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,8
++	psrldq	xmm3,8
++	pxor	xmm0,xmm4
++	pxor	xmm1,xmm3
++
++
++	movdqa	xmm4,xmm0
++	psrlq	xmm0,1
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm0
++	psrlq	xmm0,5
++	pxor	xmm0,xmm4
++	psrlq	xmm0,1
++	pxor	xmm0,xmm1
++	add	r9,0x40
++	jz	NEAR $L$done
++	movdqu	xmm7,XMMWORD[32+rdx]
++	sub	r9,0x10
++	jz	NEAR $L$odd_tail
++$L$skip4x:
++
++
++
++
++
++	movdqu	xmm8,XMMWORD[r8]
++	movdqu	xmm3,XMMWORD[16+r8]
++DB	102,69,15,56,0,194
++DB	102,65,15,56,0,218
++	pxor	xmm0,xmm8
++
++	movdqa	xmm5,xmm3
++	pshufd	xmm4,xmm3,78
++	pxor	xmm4,xmm3
++DB	102,15,58,68,218,0
++DB	102,15,58,68,234,17
++DB	102,15,58,68,231,0
++
++	lea	r8,[32+r8]
++	nop
++	sub	r9,0x20
++	jbe	NEAR $L$even_tail
++	nop
++	jmp	NEAR $L$mod_loop
++
++ALIGN	32
++$L$mod_loop:
++	movdqa	xmm1,xmm0
++	movdqa	xmm8,xmm4
++	pshufd	xmm4,xmm0,78
++	pxor	xmm4,xmm0
++
++DB	102,15,58,68,198,0
++DB	102,15,58,68,206,17
++DB	102,15,58,68,231,16
++
++	pxor	xmm0,xmm3
++	pxor	xmm1,xmm5
++	movdqu	xmm9,XMMWORD[r8]
++	pxor	xmm8,xmm0
++DB	102,69,15,56,0,202
++	movdqu	xmm3,XMMWORD[16+r8]
++
++	pxor	xmm8,xmm1
++	pxor	xmm1,xmm9
++	pxor	xmm4,xmm8
++DB	102,65,15,56,0,218
++	movdqa	xmm8,xmm4
++	psrldq	xmm8,8
++	pslldq	xmm4,8
++	pxor	xmm1,xmm8
++	pxor	xmm0,xmm4
++
++	movdqa	xmm5,xmm3
++
++	movdqa	xmm9,xmm0
++	movdqa	xmm8,xmm0
++	psllq	xmm0,5
++	pxor	xmm8,xmm0
++DB	102,15,58,68,218,0
++	psllq	xmm0,1
++	pxor	xmm0,xmm8
++	psllq	xmm0,57
++	movdqa	xmm8,xmm0
++	pslldq	xmm0,8
++	psrldq	xmm8,8
++	pxor	xmm0,xmm9
++	pshufd	xmm4,xmm5,78
++	pxor	xmm1,xmm8
++	pxor	xmm4,xmm5
++
++	movdqa	xmm9,xmm0
++	psrlq	xmm0,1
++DB	102,15,58,68,234,17
++	pxor	xmm1,xmm9
++	pxor	xmm9,xmm0
++	psrlq	xmm0,5
++	pxor	xmm0,xmm9
++	lea	r8,[32+r8]
++	psrlq	xmm0,1
++DB	102,15,58,68,231,0
++	pxor	xmm0,xmm1
++
++	sub	r9,0x20
++	ja	NEAR $L$mod_loop
++
++$L$even_tail:
++	movdqa	xmm1,xmm0
++	movdqa	xmm8,xmm4
++	pshufd	xmm4,xmm0,78
++	pxor	xmm4,xmm0
++
++DB	102,15,58,68,198,0
++DB	102,15,58,68,206,17
++DB	102,15,58,68,231,16
++
++	pxor	xmm0,xmm3
++	pxor	xmm1,xmm5
++	pxor	xmm8,xmm0
++	pxor	xmm8,xmm1
++	pxor	xmm4,xmm8
++	movdqa	xmm8,xmm4
++	psrldq	xmm8,8
++	pslldq	xmm4,8
++	pxor	xmm1,xmm8
++	pxor	xmm0,xmm4
++
++	movdqa	xmm4,xmm0
++	movdqa	xmm3,xmm0
++	psllq	xmm0,5
++	pxor	xmm3,xmm0
++	psllq	xmm0,1
++	pxor	xmm0,xmm3
++	psllq	xmm0,57
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,8
++	psrldq	xmm3,8
++	pxor	xmm0,xmm4
++	pxor	xmm1,xmm3
++
++
++	movdqa	xmm4,xmm0
++	psrlq	xmm0,1
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm0
++	psrlq	xmm0,5
++	pxor	xmm0,xmm4
++	psrlq	xmm0,1
++	pxor	xmm0,xmm1
++	test	r9,r9
++	jnz	NEAR $L$done
++
++$L$odd_tail:
++	movdqu	xmm8,XMMWORD[r8]
++DB	102,69,15,56,0,194
++	pxor	xmm0,xmm8
++	movdqa	xmm1,xmm0
++	pshufd	xmm3,xmm0,78
++	pxor	xmm3,xmm0
++DB	102,15,58,68,194,0
++DB	102,15,58,68,202,17
++DB	102,15,58,68,223,0
++	pxor	xmm3,xmm0
++	pxor	xmm3,xmm1
++
++	movdqa	xmm4,xmm3
++	psrldq	xmm3,8
++	pslldq	xmm4,8
++	pxor	xmm1,xmm3
++	pxor	xmm0,xmm4
++
++	movdqa	xmm4,xmm0
++	movdqa	xmm3,xmm0
++	psllq	xmm0,5
++	pxor	xmm3,xmm0
++	psllq	xmm0,1
++	pxor	xmm0,xmm3
++	psllq	xmm0,57
++	movdqa	xmm3,xmm0
++	pslldq	xmm0,8
++	psrldq	xmm3,8
++	pxor	xmm0,xmm4
++	pxor	xmm1,xmm3
++
++
++	movdqa	xmm4,xmm0
++	psrlq	xmm0,1
++	pxor	xmm1,xmm4
++	pxor	xmm4,xmm0
++	psrlq	xmm0,5
++	pxor	xmm0,xmm4
++	psrlq	xmm0,1
++	pxor	xmm0,xmm1
++$L$done:
++DB	102,65,15,56,0,194
++	movdqu	XMMWORD[rcx],xmm0
++	movaps	xmm6,XMMWORD[rsp]
++	movaps	xmm7,XMMWORD[16+rsp]
++	movaps	xmm8,XMMWORD[32+rsp]
++	movaps	xmm9,XMMWORD[48+rsp]
++	movaps	xmm10,XMMWORD[64+rsp]
++	movaps	xmm11,XMMWORD[80+rsp]
++	movaps	xmm12,XMMWORD[96+rsp]
++	movaps	xmm13,XMMWORD[112+rsp]
++	movaps	xmm14,XMMWORD[128+rsp]
++	movaps	xmm15,XMMWORD[144+rsp]
++	lea	rsp,[168+rsp]
++$L$SEH_end_gcm_ghash_clmul:
++	DB	0F3h,0C3h		;repret
++
++global	gcm_init_avx
++
++ALIGN	32
++gcm_init_avx:
++$L$SEH_begin_gcm_init_avx:
++
++DB	0x48,0x83,0xec,0x18
++DB	0x0f,0x29,0x34,0x24
++	vzeroupper
++
++	vmovdqu	xmm2,XMMWORD[rdx]
++	vpshufd	xmm2,xmm2,78
++
++
++	vpshufd	xmm4,xmm2,255
++	vpsrlq	xmm3,xmm2,63
++	vpsllq	xmm2,xmm2,1
++	vpxor	xmm5,xmm5,xmm5
++	vpcmpgtd	xmm5,xmm5,xmm4
++	vpslldq	xmm3,xmm3,8
++	vpor	xmm2,xmm2,xmm3
++
++
++	vpand	xmm5,xmm5,XMMWORD[$L$0x1c2_polynomial]
++	vpxor	xmm2,xmm2,xmm5
++
++	vpunpckhqdq	xmm6,xmm2,xmm2
++	vmovdqa	xmm0,xmm2
++	vpxor	xmm6,xmm6,xmm2
++	mov	r10,4
++	jmp	NEAR $L$init_start_avx
++ALIGN	32
++$L$init_loop_avx:
++	vpalignr	xmm5,xmm4,xmm3,8
++	vmovdqu	XMMWORD[(-16)+rcx],xmm5
++	vpunpckhqdq	xmm3,xmm0,xmm0
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm1,xmm0,xmm2,0x11
++	vpclmulqdq	xmm0,xmm0,xmm2,0x00
++	vpclmulqdq	xmm3,xmm3,xmm6,0x00
++	vpxor	xmm4,xmm1,xmm0
++	vpxor	xmm3,xmm3,xmm4
++
++	vpslldq	xmm4,xmm3,8
++	vpsrldq	xmm3,xmm3,8
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm1,xmm1,xmm3
++	vpsllq	xmm3,xmm0,57
++	vpsllq	xmm4,xmm0,62
++	vpxor	xmm4,xmm4,xmm3
++	vpsllq	xmm3,xmm0,63
++	vpxor	xmm4,xmm4,xmm3
++	vpslldq	xmm3,xmm4,8
++	vpsrldq	xmm4,xmm4,8
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm1,xmm1,xmm4
++
++	vpsrlq	xmm4,xmm0,1
++	vpxor	xmm1,xmm1,xmm0
++	vpxor	xmm0,xmm0,xmm4
++	vpsrlq	xmm4,xmm4,5
++	vpxor	xmm0,xmm0,xmm4
++	vpsrlq	xmm0,xmm0,1
++	vpxor	xmm0,xmm0,xmm1
++$L$init_start_avx:
++	vmovdqa	xmm5,xmm0
++	vpunpckhqdq	xmm3,xmm0,xmm0
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm1,xmm0,xmm2,0x11
++	vpclmulqdq	xmm0,xmm0,xmm2,0x00
++	vpclmulqdq	xmm3,xmm3,xmm6,0x00
++	vpxor	xmm4,xmm1,xmm0
++	vpxor	xmm3,xmm3,xmm4
++
++	vpslldq	xmm4,xmm3,8
++	vpsrldq	xmm3,xmm3,8
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm1,xmm1,xmm3
++	vpsllq	xmm3,xmm0,57
++	vpsllq	xmm4,xmm0,62
++	vpxor	xmm4,xmm4,xmm3
++	vpsllq	xmm3,xmm0,63
++	vpxor	xmm4,xmm4,xmm3
++	vpslldq	xmm3,xmm4,8
++	vpsrldq	xmm4,xmm4,8
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm1,xmm1,xmm4
++
++	vpsrlq	xmm4,xmm0,1
++	vpxor	xmm1,xmm1,xmm0
++	vpxor	xmm0,xmm0,xmm4
++	vpsrlq	xmm4,xmm4,5
++	vpxor	xmm0,xmm0,xmm4
++	vpsrlq	xmm0,xmm0,1
++	vpxor	xmm0,xmm0,xmm1
++	vpshufd	xmm3,xmm5,78
++	vpshufd	xmm4,xmm0,78
++	vpxor	xmm3,xmm3,xmm5
++	vmovdqu	XMMWORD[rcx],xmm5
++	vpxor	xmm4,xmm4,xmm0
++	vmovdqu	XMMWORD[16+rcx],xmm0
++	lea	rcx,[48+rcx]
++	sub	r10,1
++	jnz	NEAR $L$init_loop_avx
++
++	vpalignr	xmm5,xmm3,xmm4,8
++	vmovdqu	XMMWORD[(-16)+rcx],xmm5
++
++	vzeroupper
++	movaps	xmm6,XMMWORD[rsp]
++	lea	rsp,[24+rsp]
++$L$SEH_end_gcm_init_avx:
++	DB	0F3h,0C3h		;repret
++
++global	gcm_gmult_avx
++
++ALIGN	32
++gcm_gmult_avx:
++	jmp	NEAR $L$_gmult_clmul
++
++global	gcm_ghash_avx
++
++ALIGN	32
++gcm_ghash_avx:
++	lea	rax,[((-136))+rsp]
++$L$SEH_begin_gcm_ghash_avx:
++
++DB	0x48,0x8d,0x60,0xe0
++DB	0x0f,0x29,0x70,0xe0
++DB	0x0f,0x29,0x78,0xf0
++DB	0x44,0x0f,0x29,0x00
++DB	0x44,0x0f,0x29,0x48,0x10
++DB	0x44,0x0f,0x29,0x50,0x20
++DB	0x44,0x0f,0x29,0x58,0x30
++DB	0x44,0x0f,0x29,0x60,0x40
++DB	0x44,0x0f,0x29,0x68,0x50
++DB	0x44,0x0f,0x29,0x70,0x60
++DB	0x44,0x0f,0x29,0x78,0x70
++	vzeroupper
++
++	vmovdqu	xmm10,XMMWORD[rcx]
++	lea	r10,[$L$0x1c2_polynomial]
++	lea	rdx,[64+rdx]
++	vmovdqu	xmm13,XMMWORD[$L$bswap_mask]
++	vpshufb	xmm10,xmm10,xmm13
++	cmp	r9,0x80
++	jb	NEAR $L$short_avx
++	sub	r9,0x80
++
++	vmovdqu	xmm14,XMMWORD[112+r8]
++	vmovdqu	xmm6,XMMWORD[((0-64))+rdx]
++	vpshufb	xmm14,xmm14,xmm13
++	vmovdqu	xmm7,XMMWORD[((32-64))+rdx]
++
++	vpunpckhqdq	xmm9,xmm14,xmm14
++	vmovdqu	xmm15,XMMWORD[96+r8]
++	vpclmulqdq	xmm0,xmm14,xmm6,0x00
++	vpxor	xmm9,xmm9,xmm14
++	vpshufb	xmm15,xmm15,xmm13
++	vpclmulqdq	xmm1,xmm14,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((16-64))+rdx]
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vmovdqu	xmm14,XMMWORD[80+r8]
++	vpclmulqdq	xmm2,xmm9,xmm7,0x00
++	vpxor	xmm8,xmm8,xmm15
++
++	vpshufb	xmm14,xmm14,xmm13
++	vpclmulqdq	xmm3,xmm15,xmm6,0x00
++	vpunpckhqdq	xmm9,xmm14,xmm14
++	vpclmulqdq	xmm4,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((48-64))+rdx]
++	vpxor	xmm9,xmm9,xmm14
++	vmovdqu	xmm15,XMMWORD[64+r8]
++	vpclmulqdq	xmm5,xmm8,xmm7,0x10
++	vmovdqu	xmm7,XMMWORD[((80-64))+rdx]
++
++	vpshufb	xmm15,xmm15,xmm13
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm14,xmm6,0x00
++	vpxor	xmm4,xmm4,xmm1
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpclmulqdq	xmm1,xmm14,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((64-64))+rdx]
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm2,xmm9,xmm7,0x00
++	vpxor	xmm8,xmm8,xmm15
++
++	vmovdqu	xmm14,XMMWORD[48+r8]
++	vpxor	xmm0,xmm0,xmm3
++	vpclmulqdq	xmm3,xmm15,xmm6,0x00
++	vpxor	xmm1,xmm1,xmm4
++	vpshufb	xmm14,xmm14,xmm13
++	vpclmulqdq	xmm4,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((96-64))+rdx]
++	vpxor	xmm2,xmm2,xmm5
++	vpunpckhqdq	xmm9,xmm14,xmm14
++	vpclmulqdq	xmm5,xmm8,xmm7,0x10
++	vmovdqu	xmm7,XMMWORD[((128-64))+rdx]
++	vpxor	xmm9,xmm9,xmm14
++
++	vmovdqu	xmm15,XMMWORD[32+r8]
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm14,xmm6,0x00
++	vpxor	xmm4,xmm4,xmm1
++	vpshufb	xmm15,xmm15,xmm13
++	vpclmulqdq	xmm1,xmm14,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((112-64))+rdx]
++	vpxor	xmm5,xmm5,xmm2
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpclmulqdq	xmm2,xmm9,xmm7,0x00
++	vpxor	xmm8,xmm8,xmm15
++
++	vmovdqu	xmm14,XMMWORD[16+r8]
++	vpxor	xmm0,xmm0,xmm3
++	vpclmulqdq	xmm3,xmm15,xmm6,0x00
++	vpxor	xmm1,xmm1,xmm4
++	vpshufb	xmm14,xmm14,xmm13
++	vpclmulqdq	xmm4,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((144-64))+rdx]
++	vpxor	xmm2,xmm2,xmm5
++	vpunpckhqdq	xmm9,xmm14,xmm14
++	vpclmulqdq	xmm5,xmm8,xmm7,0x10
++	vmovdqu	xmm7,XMMWORD[((176-64))+rdx]
++	vpxor	xmm9,xmm9,xmm14
++
++	vmovdqu	xmm15,XMMWORD[r8]
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm14,xmm6,0x00
++	vpxor	xmm4,xmm4,xmm1
++	vpshufb	xmm15,xmm15,xmm13
++	vpclmulqdq	xmm1,xmm14,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((160-64))+rdx]
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm2,xmm9,xmm7,0x10
++
++	lea	r8,[128+r8]
++	cmp	r9,0x80
++	jb	NEAR $L$tail_avx
++
++	vpxor	xmm15,xmm15,xmm10
++	sub	r9,0x80
++	jmp	NEAR $L$oop8x_avx
++
++ALIGN	32
++$L$oop8x_avx:
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vmovdqu	xmm14,XMMWORD[112+r8]
++	vpxor	xmm3,xmm3,xmm0
++	vpxor	xmm8,xmm8,xmm15
++	vpclmulqdq	xmm10,xmm15,xmm6,0x00
++	vpshufb	xmm14,xmm14,xmm13
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm11,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((0-64))+rdx]
++	vpunpckhqdq	xmm9,xmm14,xmm14
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm12,xmm8,xmm7,0x00
++	vmovdqu	xmm7,XMMWORD[((32-64))+rdx]
++	vpxor	xmm9,xmm9,xmm14
++
++	vmovdqu	xmm15,XMMWORD[96+r8]
++	vpclmulqdq	xmm0,xmm14,xmm6,0x00
++	vpxor	xmm10,xmm10,xmm3
++	vpshufb	xmm15,xmm15,xmm13
++	vpclmulqdq	xmm1,xmm14,xmm6,0x11
++	vxorps	xmm11,xmm11,xmm4
++	vmovdqu	xmm6,XMMWORD[((16-64))+rdx]
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpclmulqdq	xmm2,xmm9,xmm7,0x00
++	vpxor	xmm12,xmm12,xmm5
++	vxorps	xmm8,xmm8,xmm15
++
++	vmovdqu	xmm14,XMMWORD[80+r8]
++	vpxor	xmm12,xmm12,xmm10
++	vpclmulqdq	xmm3,xmm15,xmm6,0x00
++	vpxor	xmm12,xmm12,xmm11
++	vpslldq	xmm9,xmm12,8
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm4,xmm15,xmm6,0x11
++	vpsrldq	xmm12,xmm12,8
++	vpxor	xmm10,xmm10,xmm9
++	vmovdqu	xmm6,XMMWORD[((48-64))+rdx]
++	vpshufb	xmm14,xmm14,xmm13
++	vxorps	xmm11,xmm11,xmm12
++	vpxor	xmm4,xmm4,xmm1
++	vpunpckhqdq	xmm9,xmm14,xmm14
++	vpclmulqdq	xmm5,xmm8,xmm7,0x10
++	vmovdqu	xmm7,XMMWORD[((80-64))+rdx]
++	vpxor	xmm9,xmm9,xmm14
++	vpxor	xmm5,xmm5,xmm2
++
++	vmovdqu	xmm15,XMMWORD[64+r8]
++	vpalignr	xmm12,xmm10,xmm10,8
++	vpclmulqdq	xmm0,xmm14,xmm6,0x00
++	vpshufb	xmm15,xmm15,xmm13
++	vpxor	xmm0,xmm0,xmm3
++	vpclmulqdq	xmm1,xmm14,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((64-64))+rdx]
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpxor	xmm1,xmm1,xmm4
++	vpclmulqdq	xmm2,xmm9,xmm7,0x00
++	vxorps	xmm8,xmm8,xmm15
++	vpxor	xmm2,xmm2,xmm5
++
++	vmovdqu	xmm14,XMMWORD[48+r8]
++	vpclmulqdq	xmm10,xmm10,XMMWORD[r10],0x10
++	vpclmulqdq	xmm3,xmm15,xmm6,0x00
++	vpshufb	xmm14,xmm14,xmm13
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm4,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((96-64))+rdx]
++	vpunpckhqdq	xmm9,xmm14,xmm14
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm5,xmm8,xmm7,0x10
++	vmovdqu	xmm7,XMMWORD[((128-64))+rdx]
++	vpxor	xmm9,xmm9,xmm14
++	vpxor	xmm5,xmm5,xmm2
++
++	vmovdqu	xmm15,XMMWORD[32+r8]
++	vpclmulqdq	xmm0,xmm14,xmm6,0x00
++	vpshufb	xmm15,xmm15,xmm13
++	vpxor	xmm0,xmm0,xmm3
++	vpclmulqdq	xmm1,xmm14,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((112-64))+rdx]
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpxor	xmm1,xmm1,xmm4
++	vpclmulqdq	xmm2,xmm9,xmm7,0x00
++	vpxor	xmm8,xmm8,xmm15
++	vpxor	xmm2,xmm2,xmm5
++	vxorps	xmm10,xmm10,xmm12
++
++	vmovdqu	xmm14,XMMWORD[16+r8]
++	vpalignr	xmm12,xmm10,xmm10,8
++	vpclmulqdq	xmm3,xmm15,xmm6,0x00
++	vpshufb	xmm14,xmm14,xmm13
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm4,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((144-64))+rdx]
++	vpclmulqdq	xmm10,xmm10,XMMWORD[r10],0x10
++	vxorps	xmm12,xmm12,xmm11
++	vpunpckhqdq	xmm9,xmm14,xmm14
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm5,xmm8,xmm7,0x10
++	vmovdqu	xmm7,XMMWORD[((176-64))+rdx]
++	vpxor	xmm9,xmm9,xmm14
++	vpxor	xmm5,xmm5,xmm2
++
++	vmovdqu	xmm15,XMMWORD[r8]
++	vpclmulqdq	xmm0,xmm14,xmm6,0x00
++	vpshufb	xmm15,xmm15,xmm13
++	vpclmulqdq	xmm1,xmm14,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((160-64))+rdx]
++	vpxor	xmm15,xmm15,xmm12
++	vpclmulqdq	xmm2,xmm9,xmm7,0x10
++	vpxor	xmm15,xmm15,xmm10
++
++	lea	r8,[128+r8]
++	sub	r9,0x80
++	jnc	NEAR $L$oop8x_avx
++
++	add	r9,0x80
++	jmp	NEAR $L$tail_no_xor_avx
++
++ALIGN	32
++$L$short_avx:
++	vmovdqu	xmm14,XMMWORD[((-16))+r9*1+r8]
++	lea	r8,[r9*1+r8]
++	vmovdqu	xmm6,XMMWORD[((0-64))+rdx]
++	vmovdqu	xmm7,XMMWORD[((32-64))+rdx]
++	vpshufb	xmm15,xmm14,xmm13
++
++	vmovdqa	xmm3,xmm0
++	vmovdqa	xmm4,xmm1
++	vmovdqa	xmm5,xmm2
++	sub	r9,0x10
++	jz	NEAR $L$tail_avx
++
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm15,xmm6,0x00
++	vpxor	xmm8,xmm8,xmm15
++	vmovdqu	xmm14,XMMWORD[((-32))+r8]
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm1,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((16-64))+rdx]
++	vpshufb	xmm15,xmm14,xmm13
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm2,xmm8,xmm7,0x00
++	vpsrldq	xmm7,xmm7,8
++	sub	r9,0x10
++	jz	NEAR $L$tail_avx
++
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm15,xmm6,0x00
++	vpxor	xmm8,xmm8,xmm15
++	vmovdqu	xmm14,XMMWORD[((-48))+r8]
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm1,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((48-64))+rdx]
++	vpshufb	xmm15,xmm14,xmm13
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm2,xmm8,xmm7,0x00
++	vmovdqu	xmm7,XMMWORD[((80-64))+rdx]
++	sub	r9,0x10
++	jz	NEAR $L$tail_avx
++
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm15,xmm6,0x00
++	vpxor	xmm8,xmm8,xmm15
++	vmovdqu	xmm14,XMMWORD[((-64))+r8]
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm1,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((64-64))+rdx]
++	vpshufb	xmm15,xmm14,xmm13
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm2,xmm8,xmm7,0x00
++	vpsrldq	xmm7,xmm7,8
++	sub	r9,0x10
++	jz	NEAR $L$tail_avx
++
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm15,xmm6,0x00
++	vpxor	xmm8,xmm8,xmm15
++	vmovdqu	xmm14,XMMWORD[((-80))+r8]
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm1,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((96-64))+rdx]
++	vpshufb	xmm15,xmm14,xmm13
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm2,xmm8,xmm7,0x00
++	vmovdqu	xmm7,XMMWORD[((128-64))+rdx]
++	sub	r9,0x10
++	jz	NEAR $L$tail_avx
++
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm15,xmm6,0x00
++	vpxor	xmm8,xmm8,xmm15
++	vmovdqu	xmm14,XMMWORD[((-96))+r8]
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm1,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((112-64))+rdx]
++	vpshufb	xmm15,xmm14,xmm13
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm2,xmm8,xmm7,0x00
++	vpsrldq	xmm7,xmm7,8
++	sub	r9,0x10
++	jz	NEAR $L$tail_avx
++
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm15,xmm6,0x00
++	vpxor	xmm8,xmm8,xmm15
++	vmovdqu	xmm14,XMMWORD[((-112))+r8]
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm1,xmm15,xmm6,0x11
++	vmovdqu	xmm6,XMMWORD[((144-64))+rdx]
++	vpshufb	xmm15,xmm14,xmm13
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm2,xmm8,xmm7,0x00
++	vmovq	xmm7,QWORD[((184-64))+rdx]
++	sub	r9,0x10
++	jmp	NEAR $L$tail_avx
++
++ALIGN	32
++$L$tail_avx:
++	vpxor	xmm15,xmm15,xmm10
++$L$tail_no_xor_avx:
++	vpunpckhqdq	xmm8,xmm15,xmm15
++	vpxor	xmm3,xmm3,xmm0
++	vpclmulqdq	xmm0,xmm15,xmm6,0x00
++	vpxor	xmm8,xmm8,xmm15
++	vpxor	xmm4,xmm4,xmm1
++	vpclmulqdq	xmm1,xmm15,xmm6,0x11
++	vpxor	xmm5,xmm5,xmm2
++	vpclmulqdq	xmm2,xmm8,xmm7,0x00
++
++	vmovdqu	xmm12,XMMWORD[r10]
++
++	vpxor	xmm10,xmm3,xmm0
++	vpxor	xmm11,xmm4,xmm1
++	vpxor	xmm5,xmm5,xmm2
++
++	vpxor	xmm5,xmm5,xmm10
++	vpxor	xmm5,xmm5,xmm11
++	vpslldq	xmm9,xmm5,8
++	vpsrldq	xmm5,xmm5,8
++	vpxor	xmm10,xmm10,xmm9
++	vpxor	xmm11,xmm11,xmm5
++
++	vpclmulqdq	xmm9,xmm10,xmm12,0x10
++	vpalignr	xmm10,xmm10,xmm10,8
++	vpxor	xmm10,xmm10,xmm9
++
++	vpclmulqdq	xmm9,xmm10,xmm12,0x10
++	vpalignr	xmm10,xmm10,xmm10,8
++	vpxor	xmm10,xmm10,xmm11
++	vpxor	xmm10,xmm10,xmm9
++
++	cmp	r9,0
++	jne	NEAR $L$short_avx
++
++	vpshufb	xmm10,xmm10,xmm13
++	vmovdqu	XMMWORD[rcx],xmm10
++	vzeroupper
++	movaps	xmm6,XMMWORD[rsp]
++	movaps	xmm7,XMMWORD[16+rsp]
++	movaps	xmm8,XMMWORD[32+rsp]
++	movaps	xmm9,XMMWORD[48+rsp]
++	movaps	xmm10,XMMWORD[64+rsp]
++	movaps	xmm11,XMMWORD[80+rsp]
++	movaps	xmm12,XMMWORD[96+rsp]
++	movaps	xmm13,XMMWORD[112+rsp]
++	movaps	xmm14,XMMWORD[128+rsp]
++	movaps	xmm15,XMMWORD[144+rsp]
++	lea	rsp,[168+rsp]
++$L$SEH_end_gcm_ghash_avx:
++	DB	0F3h,0C3h		;repret
++
++ALIGN	64
++$L$bswap_mask:
++DB	15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
++$L$0x1c2_polynomial:
++DB	1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xc2
++$L$7_mask:
++	DD	7,0,7,0
++$L$7_mask_poly:
++	DD	7,0,450,0
++ALIGN	64
++
++$L$rem_4bit:
++	DD	0,0,0,471859200,0,943718400,0,610271232
++	DD	0,1887436800,0,1822425088,0,1220542464,0,1423966208
++	DD	0,3774873600,0,4246732800,0,3644850176,0,3311403008
++	DD	0,2441084928,0,2376073216,0,2847932416,0,3051356160
++
++$L$rem_8bit:
++	DW	0x0000,0x01C2,0x0384,0x0246,0x0708,0x06CA,0x048C,0x054E
++	DW	0x0E10,0x0FD2,0x0D94,0x0C56,0x0918,0x08DA,0x0A9C,0x0B5E
++	DW	0x1C20,0x1DE2,0x1FA4,0x1E66,0x1B28,0x1AEA,0x18AC,0x196E
++	DW	0x1230,0x13F2,0x11B4,0x1076,0x1538,0x14FA,0x16BC,0x177E
++	DW	0x3840,0x3982,0x3BC4,0x3A06,0x3F48,0x3E8A,0x3CCC,0x3D0E
++	DW	0x3650,0x3792,0x35D4,0x3416,0x3158,0x309A,0x32DC,0x331E
++	DW	0x2460,0x25A2,0x27E4,0x2626,0x2368,0x22AA,0x20EC,0x212E
++	DW	0x2A70,0x2BB2,0x29F4,0x2836,0x2D78,0x2CBA,0x2EFC,0x2F3E
++	DW	0x7080,0x7142,0x7304,0x72C6,0x7788,0x764A,0x740C,0x75CE
++	DW	0x7E90,0x7F52,0x7D14,0x7CD6,0x7998,0x785A,0x7A1C,0x7BDE
++	DW	0x6CA0,0x6D62,0x6F24,0x6EE6,0x6BA8,0x6A6A,0x682C,0x69EE
++	DW	0x62B0,0x6372,0x6134,0x60F6,0x65B8,0x647A,0x663C,0x67FE
++	DW	0x48C0,0x4902,0x4B44,0x4A86,0x4FC8,0x4E0A,0x4C4C,0x4D8E
++	DW	0x46D0,0x4712,0x4554,0x4496,0x41D8,0x401A,0x425C,0x439E
++	DW	0x54E0,0x5522,0x5764,0x56A6,0x53E8,0x522A,0x506C,0x51AE
++	DW	0x5AF0,0x5B32,0x5974,0x58B6,0x5DF8,0x5C3A,0x5E7C,0x5FBE
++	DW	0xE100,0xE0C2,0xE284,0xE346,0xE608,0xE7CA,0xE58C,0xE44E
++	DW	0xEF10,0xEED2,0xEC94,0xED56,0xE818,0xE9DA,0xEB9C,0xEA5E
++	DW	0xFD20,0xFCE2,0xFEA4,0xFF66,0xFA28,0xFBEA,0xF9AC,0xF86E
++	DW	0xF330,0xF2F2,0xF0B4,0xF176,0xF438,0xF5FA,0xF7BC,0xF67E
++	DW	0xD940,0xD882,0xDAC4,0xDB06,0xDE48,0xDF8A,0xDDCC,0xDC0E
++	DW	0xD750,0xD692,0xD4D4,0xD516,0xD058,0xD19A,0xD3DC,0xD21E
++	DW	0xC560,0xC4A2,0xC6E4,0xC726,0xC268,0xC3AA,0xC1EC,0xC02E
++	DW	0xCB70,0xCAB2,0xC8F4,0xC936,0xCC78,0xCDBA,0xCFFC,0xCE3E
++	DW	0x9180,0x9042,0x9204,0x93C6,0x9688,0x974A,0x950C,0x94CE
++	DW	0x9F90,0x9E52,0x9C14,0x9DD6,0x9898,0x995A,0x9B1C,0x9ADE
++	DW	0x8DA0,0x8C62,0x8E24,0x8FE6,0x8AA8,0x8B6A,0x892C,0x88EE
++	DW	0x83B0,0x8272,0x8034,0x81F6,0x84B8,0x857A,0x873C,0x86FE
++	DW	0xA9C0,0xA802,0xAA44,0xAB86,0xAEC8,0xAF0A,0xAD4C,0xAC8E
++	DW	0xA7D0,0xA612,0xA454,0xA596,0xA0D8,0xA11A,0xA35C,0xA29E
++	DW	0xB5E0,0xB422,0xB664,0xB7A6,0xB2E8,0xB32A,0xB16C,0xB0AE
++	DW	0xBBF0,0xBA32,0xB874,0xB9B6,0xBCF8,0xBD3A,0xBF7C,0xBEBE
++
++DB	71,72,65,83,72,32,102,111,114,32,120,56,54,95,54,52
++DB	44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32
++DB	60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111
++DB	114,103,62,0
++ALIGN	64
++EXTERN	__imp_RtlVirtualUnwind
++
++ALIGN	16
++se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$in_prologue
++
++	mov	rax,QWORD[152+r8]
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$in_prologue
++
++	lea	rax,[24+rax]
++
++	mov	rbx,QWORD[((-8))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	QWORD[144+r8],rbx
++	mov	QWORD[160+r8],rbp
++	mov	QWORD[216+r8],r12
++
++$L$in_prologue:
++	mov	rdi,QWORD[8+rax]
++	mov	rsi,QWORD[16+rax]
++	mov	QWORD[152+r8],rax
++	mov	QWORD[168+r8],rsi
++	mov	QWORD[176+r8],rdi
++
++	mov	rdi,QWORD[40+r9]
++	mov	rsi,r8
++	mov	ecx,154
++	DD	0xa548f3fc
++
++	mov	rsi,r9
++	xor	rcx,rcx
++	mov	rdx,QWORD[8+rsi]
++	mov	r8,QWORD[rsi]
++	mov	r9,QWORD[16+rsi]
++	mov	r10,QWORD[40+rsi]
++	lea	r11,[56+rsi]
++	lea	r12,[24+rsi]
++	mov	QWORD[32+rsp],r10
++	mov	QWORD[40+rsp],r11
++	mov	QWORD[48+rsp],r12
++	mov	QWORD[56+rsp],rcx
++	call	QWORD[__imp_RtlVirtualUnwind]
++
++	mov	eax,1
++	add	rsp,64
++	popfq
++	pop	r15
++	pop	r14
++	pop	r13
++	pop	r12
++	pop	rbp
++	pop	rbx
++	pop	rdi
++	pop	rsi
++	DB	0F3h,0C3h		;repret
++
++
++section	.pdata rdata align=4
++ALIGN	4
++	DD	$L$SEH_begin_gcm_gmult_4bit wrt ..imagebase
++	DD	$L$SEH_end_gcm_gmult_4bit wrt ..imagebase
++	DD	$L$SEH_info_gcm_gmult_4bit wrt ..imagebase
++
++	DD	$L$SEH_begin_gcm_ghash_4bit wrt ..imagebase
++	DD	$L$SEH_end_gcm_ghash_4bit wrt ..imagebase
++	DD	$L$SEH_info_gcm_ghash_4bit wrt ..imagebase
++
++	DD	$L$SEH_begin_gcm_init_clmul wrt ..imagebase
++	DD	$L$SEH_end_gcm_init_clmul wrt ..imagebase
++	DD	$L$SEH_info_gcm_init_clmul wrt ..imagebase
++
++	DD	$L$SEH_begin_gcm_ghash_clmul wrt ..imagebase
++	DD	$L$SEH_end_gcm_ghash_clmul wrt ..imagebase
++	DD	$L$SEH_info_gcm_ghash_clmul wrt ..imagebase
++	DD	$L$SEH_begin_gcm_init_avx wrt ..imagebase
++	DD	$L$SEH_end_gcm_init_avx wrt ..imagebase
++	DD	$L$SEH_info_gcm_init_clmul wrt ..imagebase
++
++	DD	$L$SEH_begin_gcm_ghash_avx wrt ..imagebase
++	DD	$L$SEH_end_gcm_ghash_avx wrt ..imagebase
++	DD	$L$SEH_info_gcm_ghash_clmul wrt ..imagebase
++section	.xdata rdata align=8
++ALIGN	8
++$L$SEH_info_gcm_gmult_4bit:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$gmult_prologue wrt ..imagebase,$L$gmult_epilogue wrt ..imagebase
++$L$SEH_info_gcm_ghash_4bit:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$ghash_prologue wrt ..imagebase,$L$ghash_epilogue wrt ..imagebase
++$L$SEH_info_gcm_init_clmul:
++DB	0x01,0x08,0x03,0x00
++DB	0x08,0x68,0x00,0x00
++DB	0x04,0x22,0x00,0x00
++$L$SEH_info_gcm_ghash_clmul:
++DB	0x01,0x33,0x16,0x00
++DB	0x33,0xf8,0x09,0x00
++DB	0x2e,0xe8,0x08,0x00
++DB	0x29,0xd8,0x07,0x00
++DB	0x24,0xc8,0x06,0x00
++DB	0x1f,0xb8,0x05,0x00
++DB	0x1a,0xa8,0x04,0x00
++DB	0x15,0x98,0x03,0x00
++DB	0x10,0x88,0x02,0x00
++DB	0x0c,0x78,0x01,0x00
++DB	0x08,0x68,0x00,0x00
++DB	0x04,0x01,0x15,0x00
+diff --git a/SMP/lib/accelerated/x86/coff/sha1-ssse3-x86.asm b/SMP/lib/accelerated/x86/coff/sha1-ssse3-x86.asm
+new file mode 100644
+index 0000000..0dfcc2e
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/sha1-ssse3-x86.asm
+@@ -0,0 +1,1386 @@
++%ifidn __OUTPUT_FORMAT__,obj
++section	code	use32 class=code align=64
++%elifidn __OUTPUT_FORMAT__,win32
++%ifndef __YASM_VER__
++$@feat.00 equ 1
++%endif
++section	.text	code align=64
++%else
++section	.text	code
++%endif
++global	_sha1_block_data_order
++align	16
++_sha1_block_data_order:
++L$_sha1_block_data_order_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	ebp,DWORD [20+esp]
++	mov	esi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	sub	esp,76
++	shl	eax,6
++	add	eax,esi
++	mov	DWORD [104+esp],eax
++	mov	edi,DWORD [16+ebp]
++	jmp	NEAR L$000loop
++align	16
++L$000loop:
++	mov	eax,DWORD [esi]
++	mov	ebx,DWORD [4+esi]
++	mov	ecx,DWORD [8+esi]
++	mov	edx,DWORD [12+esi]
++	bswap	eax
++	bswap	ebx
++	bswap	ecx
++	bswap	edx
++	mov	DWORD [esp],eax
++	mov	DWORD [4+esp],ebx
++	mov	DWORD [8+esp],ecx
++	mov	DWORD [12+esp],edx
++	mov	eax,DWORD [16+esi]
++	mov	ebx,DWORD [20+esi]
++	mov	ecx,DWORD [24+esi]
++	mov	edx,DWORD [28+esi]
++	bswap	eax
++	bswap	ebx
++	bswap	ecx
++	bswap	edx
++	mov	DWORD [16+esp],eax
++	mov	DWORD [20+esp],ebx
++	mov	DWORD [24+esp],ecx
++	mov	DWORD [28+esp],edx
++	mov	eax,DWORD [32+esi]
++	mov	ebx,DWORD [36+esi]
++	mov	ecx,DWORD [40+esi]
++	mov	edx,DWORD [44+esi]
++	bswap	eax
++	bswap	ebx
++	bswap	ecx
++	bswap	edx
++	mov	DWORD [32+esp],eax
++	mov	DWORD [36+esp],ebx
++	mov	DWORD [40+esp],ecx
++	mov	DWORD [44+esp],edx
++	mov	eax,DWORD [48+esi]
++	mov	ebx,DWORD [52+esi]
++	mov	ecx,DWORD [56+esi]
++	mov	edx,DWORD [60+esi]
++	bswap	eax
++	bswap	ebx
++	bswap	ecx
++	bswap	edx
++	mov	DWORD [48+esp],eax
++	mov	DWORD [52+esp],ebx
++	mov	DWORD [56+esp],ecx
++	mov	DWORD [60+esp],edx
++	mov	DWORD [100+esp],esi
++	mov	eax,DWORD [ebp]
++	mov	ebx,DWORD [4+ebp]
++	mov	ecx,DWORD [8+ebp]
++	mov	edx,DWORD [12+ebp]
++	; 00_15 0
++	mov	esi,ecx
++	mov	ebp,eax
++	rol	ebp,5
++	xor	esi,edx
++	add	ebp,edi
++	mov	edi,DWORD [esp]
++	and	esi,ebx
++	ror	ebx,2
++	xor	esi,edx
++	lea	ebp,[1518500249+edi*1+ebp]
++	add	ebp,esi
++	; 00_15 1
++	mov	edi,ebx
++	mov	esi,ebp
++	rol	ebp,5
++	xor	edi,ecx
++	add	ebp,edx
++	mov	edx,DWORD [4+esp]
++	and	edi,eax
++	ror	eax,2
++	xor	edi,ecx
++	lea	ebp,[1518500249+edx*1+ebp]
++	add	ebp,edi
++	; 00_15 2
++	mov	edx,eax
++	mov	edi,ebp
++	rol	ebp,5
++	xor	edx,ebx
++	add	ebp,ecx
++	mov	ecx,DWORD [8+esp]
++	and	edx,esi
++	ror	esi,2
++	xor	edx,ebx
++	lea	ebp,[1518500249+ecx*1+ebp]
++	add	ebp,edx
++	; 00_15 3
++	mov	ecx,esi
++	mov	edx,ebp
++	rol	ebp,5
++	xor	ecx,eax
++	add	ebp,ebx
++	mov	ebx,DWORD [12+esp]
++	and	ecx,edi
++	ror	edi,2
++	xor	ecx,eax
++	lea	ebp,[1518500249+ebx*1+ebp]
++	add	ebp,ecx
++	; 00_15 4
++	mov	ebx,edi
++	mov	ecx,ebp
++	rol	ebp,5
++	xor	ebx,esi
++	add	ebp,eax
++	mov	eax,DWORD [16+esp]
++	and	ebx,edx
++	ror	edx,2
++	xor	ebx,esi
++	lea	ebp,[1518500249+eax*1+ebp]
++	add	ebp,ebx
++	; 00_15 5
++	mov	eax,edx
++	mov	ebx,ebp
++	rol	ebp,5
++	xor	eax,edi
++	add	ebp,esi
++	mov	esi,DWORD [20+esp]
++	and	eax,ecx
++	ror	ecx,2
++	xor	eax,edi
++	lea	ebp,[1518500249+esi*1+ebp]
++	add	ebp,eax
++	; 00_15 6
++	mov	esi,ecx
++	mov	eax,ebp
++	rol	ebp,5
++	xor	esi,edx
++	add	ebp,edi
++	mov	edi,DWORD [24+esp]
++	and	esi,ebx
++	ror	ebx,2
++	xor	esi,edx
++	lea	ebp,[1518500249+edi*1+ebp]
++	add	ebp,esi
++	; 00_15 7
++	mov	edi,ebx
++	mov	esi,ebp
++	rol	ebp,5
++	xor	edi,ecx
++	add	ebp,edx
++	mov	edx,DWORD [28+esp]
++	and	edi,eax
++	ror	eax,2
++	xor	edi,ecx
++	lea	ebp,[1518500249+edx*1+ebp]
++	add	ebp,edi
++	; 00_15 8
++	mov	edx,eax
++	mov	edi,ebp
++	rol	ebp,5
++	xor	edx,ebx
++	add	ebp,ecx
++	mov	ecx,DWORD [32+esp]
++	and	edx,esi
++	ror	esi,2
++	xor	edx,ebx
++	lea	ebp,[1518500249+ecx*1+ebp]
++	add	ebp,edx
++	; 00_15 9
++	mov	ecx,esi
++	mov	edx,ebp
++	rol	ebp,5
++	xor	ecx,eax
++	add	ebp,ebx
++	mov	ebx,DWORD [36+esp]
++	and	ecx,edi
++	ror	edi,2
++	xor	ecx,eax
++	lea	ebp,[1518500249+ebx*1+ebp]
++	add	ebp,ecx
++	; 00_15 10
++	mov	ebx,edi
++	mov	ecx,ebp
++	rol	ebp,5
++	xor	ebx,esi
++	add	ebp,eax
++	mov	eax,DWORD [40+esp]
++	and	ebx,edx
++	ror	edx,2
++	xor	ebx,esi
++	lea	ebp,[1518500249+eax*1+ebp]
++	add	ebp,ebx
++	; 00_15 11
++	mov	eax,edx
++	mov	ebx,ebp
++	rol	ebp,5
++	xor	eax,edi
++	add	ebp,esi
++	mov	esi,DWORD [44+esp]
++	and	eax,ecx
++	ror	ecx,2
++	xor	eax,edi
++	lea	ebp,[1518500249+esi*1+ebp]
++	add	ebp,eax
++	; 00_15 12
++	mov	esi,ecx
++	mov	eax,ebp
++	rol	ebp,5
++	xor	esi,edx
++	add	ebp,edi
++	mov	edi,DWORD [48+esp]
++	and	esi,ebx
++	ror	ebx,2
++	xor	esi,edx
++	lea	ebp,[1518500249+edi*1+ebp]
++	add	ebp,esi
++	; 00_15 13
++	mov	edi,ebx
++	mov	esi,ebp
++	rol	ebp,5
++	xor	edi,ecx
++	add	ebp,edx
++	mov	edx,DWORD [52+esp]
++	and	edi,eax
++	ror	eax,2
++	xor	edi,ecx
++	lea	ebp,[1518500249+edx*1+ebp]
++	add	ebp,edi
++	; 00_15 14
++	mov	edx,eax
++	mov	edi,ebp
++	rol	ebp,5
++	xor	edx,ebx
++	add	ebp,ecx
++	mov	ecx,DWORD [56+esp]
++	and	edx,esi
++	ror	esi,2
++	xor	edx,ebx
++	lea	ebp,[1518500249+ecx*1+ebp]
++	add	ebp,edx
++	; 00_15 15
++	mov	ecx,esi
++	mov	edx,ebp
++	rol	ebp,5
++	xor	ecx,eax
++	add	ebp,ebx
++	mov	ebx,DWORD [60+esp]
++	and	ecx,edi
++	ror	edi,2
++	xor	ecx,eax
++	lea	ebp,[1518500249+ebx*1+ebp]
++	mov	ebx,DWORD [esp]
++	add	ecx,ebp
++	; 16_19 16
++	mov	ebp,edi
++	xor	ebx,DWORD [8+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [32+esp]
++	and	ebp,edx
++	xor	ebx,DWORD [52+esp]
++	rol	ebx,1
++	xor	ebp,esi
++	add	eax,ebp
++	mov	ebp,ecx
++	ror	edx,2
++	mov	DWORD [esp],ebx
++	rol	ebp,5
++	lea	ebx,[1518500249+eax*1+ebx]
++	mov	eax,DWORD [4+esp]
++	add	ebx,ebp
++	; 16_19 17
++	mov	ebp,edx
++	xor	eax,DWORD [12+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [36+esp]
++	and	ebp,ecx
++	xor	eax,DWORD [56+esp]
++	rol	eax,1
++	xor	ebp,edi
++	add	esi,ebp
++	mov	ebp,ebx
++	ror	ecx,2
++	mov	DWORD [4+esp],eax
++	rol	ebp,5
++	lea	eax,[1518500249+esi*1+eax]
++	mov	esi,DWORD [8+esp]
++	add	eax,ebp
++	; 16_19 18
++	mov	ebp,ecx
++	xor	esi,DWORD [16+esp]
++	xor	ebp,edx
++	xor	esi,DWORD [40+esp]
++	and	ebp,ebx
++	xor	esi,DWORD [60+esp]
++	rol	esi,1
++	xor	ebp,edx
++	add	edi,ebp
++	mov	ebp,eax
++	ror	ebx,2
++	mov	DWORD [8+esp],esi
++	rol	ebp,5
++	lea	esi,[1518500249+edi*1+esi]
++	mov	edi,DWORD [12+esp]
++	add	esi,ebp
++	; 16_19 19
++	mov	ebp,ebx
++	xor	edi,DWORD [20+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [44+esp]
++	and	ebp,eax
++	xor	edi,DWORD [esp]
++	rol	edi,1
++	xor	ebp,ecx
++	add	edx,ebp
++	mov	ebp,esi
++	ror	eax,2
++	mov	DWORD [12+esp],edi
++	rol	ebp,5
++	lea	edi,[1518500249+edx*1+edi]
++	mov	edx,DWORD [16+esp]
++	add	edi,ebp
++	; 20_39 20
++	mov	ebp,esi
++	xor	edx,DWORD [24+esp]
++	xor	ebp,eax
++	xor	edx,DWORD [48+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [4+esp]
++	rol	edx,1
++	add	ecx,ebp
++	ror	esi,2
++	mov	ebp,edi
++	rol	ebp,5
++	mov	DWORD [16+esp],edx
++	lea	edx,[1859775393+ecx*1+edx]
++	mov	ecx,DWORD [20+esp]
++	add	edx,ebp
++	; 20_39 21
++	mov	ebp,edi
++	xor	ecx,DWORD [28+esp]
++	xor	ebp,esi
++	xor	ecx,DWORD [52+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [8+esp]
++	rol	ecx,1
++	add	ebx,ebp
++	ror	edi,2
++	mov	ebp,edx
++	rol	ebp,5
++	mov	DWORD [20+esp],ecx
++	lea	ecx,[1859775393+ebx*1+ecx]
++	mov	ebx,DWORD [24+esp]
++	add	ecx,ebp
++	; 20_39 22
++	mov	ebp,edx
++	xor	ebx,DWORD [32+esp]
++	xor	ebp,edi
++	xor	ebx,DWORD [56+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [12+esp]
++	rol	ebx,1
++	add	eax,ebp
++	ror	edx,2
++	mov	ebp,ecx
++	rol	ebp,5
++	mov	DWORD [24+esp],ebx
++	lea	ebx,[1859775393+eax*1+ebx]
++	mov	eax,DWORD [28+esp]
++	add	ebx,ebp
++	; 20_39 23
++	mov	ebp,ecx
++	xor	eax,DWORD [36+esp]
++	xor	ebp,edx
++	xor	eax,DWORD [60+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [16+esp]
++	rol	eax,1
++	add	esi,ebp
++	ror	ecx,2
++	mov	ebp,ebx
++	rol	ebp,5
++	mov	DWORD [28+esp],eax
++	lea	eax,[1859775393+esi*1+eax]
++	mov	esi,DWORD [32+esp]
++	add	eax,ebp
++	; 20_39 24
++	mov	ebp,ebx
++	xor	esi,DWORD [40+esp]
++	xor	ebp,ecx
++	xor	esi,DWORD [esp]
++	xor	ebp,edx
++	xor	esi,DWORD [20+esp]
++	rol	esi,1
++	add	edi,ebp
++	ror	ebx,2
++	mov	ebp,eax
++	rol	ebp,5
++	mov	DWORD [32+esp],esi
++	lea	esi,[1859775393+edi*1+esi]
++	mov	edi,DWORD [36+esp]
++	add	esi,ebp
++	; 20_39 25
++	mov	ebp,eax
++	xor	edi,DWORD [44+esp]
++	xor	ebp,ebx
++	xor	edi,DWORD [4+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [24+esp]
++	rol	edi,1
++	add	edx,ebp
++	ror	eax,2
++	mov	ebp,esi
++	rol	ebp,5
++	mov	DWORD [36+esp],edi
++	lea	edi,[1859775393+edx*1+edi]
++	mov	edx,DWORD [40+esp]
++	add	edi,ebp
++	; 20_39 26
++	mov	ebp,esi
++	xor	edx,DWORD [48+esp]
++	xor	ebp,eax
++	xor	edx,DWORD [8+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [28+esp]
++	rol	edx,1
++	add	ecx,ebp
++	ror	esi,2
++	mov	ebp,edi
++	rol	ebp,5
++	mov	DWORD [40+esp],edx
++	lea	edx,[1859775393+ecx*1+edx]
++	mov	ecx,DWORD [44+esp]
++	add	edx,ebp
++	; 20_39 27
++	mov	ebp,edi
++	xor	ecx,DWORD [52+esp]
++	xor	ebp,esi
++	xor	ecx,DWORD [12+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [32+esp]
++	rol	ecx,1
++	add	ebx,ebp
++	ror	edi,2
++	mov	ebp,edx
++	rol	ebp,5
++	mov	DWORD [44+esp],ecx
++	lea	ecx,[1859775393+ebx*1+ecx]
++	mov	ebx,DWORD [48+esp]
++	add	ecx,ebp
++	; 20_39 28
++	mov	ebp,edx
++	xor	ebx,DWORD [56+esp]
++	xor	ebp,edi
++	xor	ebx,DWORD [16+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [36+esp]
++	rol	ebx,1
++	add	eax,ebp
++	ror	edx,2
++	mov	ebp,ecx
++	rol	ebp,5
++	mov	DWORD [48+esp],ebx
++	lea	ebx,[1859775393+eax*1+ebx]
++	mov	eax,DWORD [52+esp]
++	add	ebx,ebp
++	; 20_39 29
++	mov	ebp,ecx
++	xor	eax,DWORD [60+esp]
++	xor	ebp,edx
++	xor	eax,DWORD [20+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [40+esp]
++	rol	eax,1
++	add	esi,ebp
++	ror	ecx,2
++	mov	ebp,ebx
++	rol	ebp,5
++	mov	DWORD [52+esp],eax
++	lea	eax,[1859775393+esi*1+eax]
++	mov	esi,DWORD [56+esp]
++	add	eax,ebp
++	; 20_39 30
++	mov	ebp,ebx
++	xor	esi,DWORD [esp]
++	xor	ebp,ecx
++	xor	esi,DWORD [24+esp]
++	xor	ebp,edx
++	xor	esi,DWORD [44+esp]
++	rol	esi,1
++	add	edi,ebp
++	ror	ebx,2
++	mov	ebp,eax
++	rol	ebp,5
++	mov	DWORD [56+esp],esi
++	lea	esi,[1859775393+edi*1+esi]
++	mov	edi,DWORD [60+esp]
++	add	esi,ebp
++	; 20_39 31
++	mov	ebp,eax
++	xor	edi,DWORD [4+esp]
++	xor	ebp,ebx
++	xor	edi,DWORD [28+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [48+esp]
++	rol	edi,1
++	add	edx,ebp
++	ror	eax,2
++	mov	ebp,esi
++	rol	ebp,5
++	mov	DWORD [60+esp],edi
++	lea	edi,[1859775393+edx*1+edi]
++	mov	edx,DWORD [esp]
++	add	edi,ebp
++	; 20_39 32
++	mov	ebp,esi
++	xor	edx,DWORD [8+esp]
++	xor	ebp,eax
++	xor	edx,DWORD [32+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [52+esp]
++	rol	edx,1
++	add	ecx,ebp
++	ror	esi,2
++	mov	ebp,edi
++	rol	ebp,5
++	mov	DWORD [esp],edx
++	lea	edx,[1859775393+ecx*1+edx]
++	mov	ecx,DWORD [4+esp]
++	add	edx,ebp
++	; 20_39 33
++	mov	ebp,edi
++	xor	ecx,DWORD [12+esp]
++	xor	ebp,esi
++	xor	ecx,DWORD [36+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [56+esp]
++	rol	ecx,1
++	add	ebx,ebp
++	ror	edi,2
++	mov	ebp,edx
++	rol	ebp,5
++	mov	DWORD [4+esp],ecx
++	lea	ecx,[1859775393+ebx*1+ecx]
++	mov	ebx,DWORD [8+esp]
++	add	ecx,ebp
++	; 20_39 34
++	mov	ebp,edx
++	xor	ebx,DWORD [16+esp]
++	xor	ebp,edi
++	xor	ebx,DWORD [40+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [60+esp]
++	rol	ebx,1
++	add	eax,ebp
++	ror	edx,2
++	mov	ebp,ecx
++	rol	ebp,5
++	mov	DWORD [8+esp],ebx
++	lea	ebx,[1859775393+eax*1+ebx]
++	mov	eax,DWORD [12+esp]
++	add	ebx,ebp
++	; 20_39 35
++	mov	ebp,ecx
++	xor	eax,DWORD [20+esp]
++	xor	ebp,edx
++	xor	eax,DWORD [44+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [esp]
++	rol	eax,1
++	add	esi,ebp
++	ror	ecx,2
++	mov	ebp,ebx
++	rol	ebp,5
++	mov	DWORD [12+esp],eax
++	lea	eax,[1859775393+esi*1+eax]
++	mov	esi,DWORD [16+esp]
++	add	eax,ebp
++	; 20_39 36
++	mov	ebp,ebx
++	xor	esi,DWORD [24+esp]
++	xor	ebp,ecx
++	xor	esi,DWORD [48+esp]
++	xor	ebp,edx
++	xor	esi,DWORD [4+esp]
++	rol	esi,1
++	add	edi,ebp
++	ror	ebx,2
++	mov	ebp,eax
++	rol	ebp,5
++	mov	DWORD [16+esp],esi
++	lea	esi,[1859775393+edi*1+esi]
++	mov	edi,DWORD [20+esp]
++	add	esi,ebp
++	; 20_39 37
++	mov	ebp,eax
++	xor	edi,DWORD [28+esp]
++	xor	ebp,ebx
++	xor	edi,DWORD [52+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [8+esp]
++	rol	edi,1
++	add	edx,ebp
++	ror	eax,2
++	mov	ebp,esi
++	rol	ebp,5
++	mov	DWORD [20+esp],edi
++	lea	edi,[1859775393+edx*1+edi]
++	mov	edx,DWORD [24+esp]
++	add	edi,ebp
++	; 20_39 38
++	mov	ebp,esi
++	xor	edx,DWORD [32+esp]
++	xor	ebp,eax
++	xor	edx,DWORD [56+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [12+esp]
++	rol	edx,1
++	add	ecx,ebp
++	ror	esi,2
++	mov	ebp,edi
++	rol	ebp,5
++	mov	DWORD [24+esp],edx
++	lea	edx,[1859775393+ecx*1+edx]
++	mov	ecx,DWORD [28+esp]
++	add	edx,ebp
++	; 20_39 39
++	mov	ebp,edi
++	xor	ecx,DWORD [36+esp]
++	xor	ebp,esi
++	xor	ecx,DWORD [60+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [16+esp]
++	rol	ecx,1
++	add	ebx,ebp
++	ror	edi,2
++	mov	ebp,edx
++	rol	ebp,5
++	mov	DWORD [28+esp],ecx
++	lea	ecx,[1859775393+ebx*1+ecx]
++	mov	ebx,DWORD [32+esp]
++	add	ecx,ebp
++	; 40_59 40
++	mov	ebp,edi
++	xor	ebx,DWORD [40+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [esp]
++	and	ebp,edx
++	xor	ebx,DWORD [20+esp]
++	rol	ebx,1
++	add	ebp,eax
++	ror	edx,2
++	mov	eax,ecx
++	rol	eax,5
++	mov	DWORD [32+esp],ebx
++	lea	ebx,[2400959708+ebp*1+ebx]
++	mov	ebp,edi
++	add	ebx,eax
++	and	ebp,esi
++	mov	eax,DWORD [36+esp]
++	add	ebx,ebp
++	; 40_59 41
++	mov	ebp,edx
++	xor	eax,DWORD [44+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [4+esp]
++	and	ebp,ecx
++	xor	eax,DWORD [24+esp]
++	rol	eax,1
++	add	ebp,esi
++	ror	ecx,2
++	mov	esi,ebx
++	rol	esi,5
++	mov	DWORD [36+esp],eax
++	lea	eax,[2400959708+ebp*1+eax]
++	mov	ebp,edx
++	add	eax,esi
++	and	ebp,edi
++	mov	esi,DWORD [40+esp]
++	add	eax,ebp
++	; 40_59 42
++	mov	ebp,ecx
++	xor	esi,DWORD [48+esp]
++	xor	ebp,edx
++	xor	esi,DWORD [8+esp]
++	and	ebp,ebx
++	xor	esi,DWORD [28+esp]
++	rol	esi,1
++	add	ebp,edi
++	ror	ebx,2
++	mov	edi,eax
++	rol	edi,5
++	mov	DWORD [40+esp],esi
++	lea	esi,[2400959708+ebp*1+esi]
++	mov	ebp,ecx
++	add	esi,edi
++	and	ebp,edx
++	mov	edi,DWORD [44+esp]
++	add	esi,ebp
++	; 40_59 43
++	mov	ebp,ebx
++	xor	edi,DWORD [52+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [12+esp]
++	and	ebp,eax
++	xor	edi,DWORD [32+esp]
++	rol	edi,1
++	add	ebp,edx
++	ror	eax,2
++	mov	edx,esi
++	rol	edx,5
++	mov	DWORD [44+esp],edi
++	lea	edi,[2400959708+ebp*1+edi]
++	mov	ebp,ebx
++	add	edi,edx
++	and	ebp,ecx
++	mov	edx,DWORD [48+esp]
++	add	edi,ebp
++	; 40_59 44
++	mov	ebp,eax
++	xor	edx,DWORD [56+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [16+esp]
++	and	ebp,esi
++	xor	edx,DWORD [36+esp]
++	rol	edx,1
++	add	ebp,ecx
++	ror	esi,2
++	mov	ecx,edi
++	rol	ecx,5
++	mov	DWORD [48+esp],edx
++	lea	edx,[2400959708+ebp*1+edx]
++	mov	ebp,eax
++	add	edx,ecx
++	and	ebp,ebx
++	mov	ecx,DWORD [52+esp]
++	add	edx,ebp
++	; 40_59 45
++	mov	ebp,esi
++	xor	ecx,DWORD [60+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [20+esp]
++	and	ebp,edi
++	xor	ecx,DWORD [40+esp]
++	rol	ecx,1
++	add	ebp,ebx
++	ror	edi,2
++	mov	ebx,edx
++	rol	ebx,5
++	mov	DWORD [52+esp],ecx
++	lea	ecx,[2400959708+ebp*1+ecx]
++	mov	ebp,esi
++	add	ecx,ebx
++	and	ebp,eax
++	mov	ebx,DWORD [56+esp]
++	add	ecx,ebp
++	; 40_59 46
++	mov	ebp,edi
++	xor	ebx,DWORD [esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [24+esp]
++	and	ebp,edx
++	xor	ebx,DWORD [44+esp]
++	rol	ebx,1
++	add	ebp,eax
++	ror	edx,2
++	mov	eax,ecx
++	rol	eax,5
++	mov	DWORD [56+esp],ebx
++	lea	ebx,[2400959708+ebp*1+ebx]
++	mov	ebp,edi
++	add	ebx,eax
++	and	ebp,esi
++	mov	eax,DWORD [60+esp]
++	add	ebx,ebp
++	; 40_59 47
++	mov	ebp,edx
++	xor	eax,DWORD [4+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [28+esp]
++	and	ebp,ecx
++	xor	eax,DWORD [48+esp]
++	rol	eax,1
++	add	ebp,esi
++	ror	ecx,2
++	mov	esi,ebx
++	rol	esi,5
++	mov	DWORD [60+esp],eax
++	lea	eax,[2400959708+ebp*1+eax]
++	mov	ebp,edx
++	add	eax,esi
++	and	ebp,edi
++	mov	esi,DWORD [esp]
++	add	eax,ebp
++	; 40_59 48
++	mov	ebp,ecx
++	xor	esi,DWORD [8+esp]
++	xor	ebp,edx
++	xor	esi,DWORD [32+esp]
++	and	ebp,ebx
++	xor	esi,DWORD [52+esp]
++	rol	esi,1
++	add	ebp,edi
++	ror	ebx,2
++	mov	edi,eax
++	rol	edi,5
++	mov	DWORD [esp],esi
++	lea	esi,[2400959708+ebp*1+esi]
++	mov	ebp,ecx
++	add	esi,edi
++	and	ebp,edx
++	mov	edi,DWORD [4+esp]
++	add	esi,ebp
++	; 40_59 49
++	mov	ebp,ebx
++	xor	edi,DWORD [12+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [36+esp]
++	and	ebp,eax
++	xor	edi,DWORD [56+esp]
++	rol	edi,1
++	add	ebp,edx
++	ror	eax,2
++	mov	edx,esi
++	rol	edx,5
++	mov	DWORD [4+esp],edi
++	lea	edi,[2400959708+ebp*1+edi]
++	mov	ebp,ebx
++	add	edi,edx
++	and	ebp,ecx
++	mov	edx,DWORD [8+esp]
++	add	edi,ebp
++	; 40_59 50
++	mov	ebp,eax
++	xor	edx,DWORD [16+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [40+esp]
++	and	ebp,esi
++	xor	edx,DWORD [60+esp]
++	rol	edx,1
++	add	ebp,ecx
++	ror	esi,2
++	mov	ecx,edi
++	rol	ecx,5
++	mov	DWORD [8+esp],edx
++	lea	edx,[2400959708+ebp*1+edx]
++	mov	ebp,eax
++	add	edx,ecx
++	and	ebp,ebx
++	mov	ecx,DWORD [12+esp]
++	add	edx,ebp
++	; 40_59 51
++	mov	ebp,esi
++	xor	ecx,DWORD [20+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [44+esp]
++	and	ebp,edi
++	xor	ecx,DWORD [esp]
++	rol	ecx,1
++	add	ebp,ebx
++	ror	edi,2
++	mov	ebx,edx
++	rol	ebx,5
++	mov	DWORD [12+esp],ecx
++	lea	ecx,[2400959708+ebp*1+ecx]
++	mov	ebp,esi
++	add	ecx,ebx
++	and	ebp,eax
++	mov	ebx,DWORD [16+esp]
++	add	ecx,ebp
++	; 40_59 52
++	mov	ebp,edi
++	xor	ebx,DWORD [24+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [48+esp]
++	and	ebp,edx
++	xor	ebx,DWORD [4+esp]
++	rol	ebx,1
++	add	ebp,eax
++	ror	edx,2
++	mov	eax,ecx
++	rol	eax,5
++	mov	DWORD [16+esp],ebx
++	lea	ebx,[2400959708+ebp*1+ebx]
++	mov	ebp,edi
++	add	ebx,eax
++	and	ebp,esi
++	mov	eax,DWORD [20+esp]
++	add	ebx,ebp
++	; 40_59 53
++	mov	ebp,edx
++	xor	eax,DWORD [28+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [52+esp]
++	and	ebp,ecx
++	xor	eax,DWORD [8+esp]
++	rol	eax,1
++	add	ebp,esi
++	ror	ecx,2
++	mov	esi,ebx
++	rol	esi,5
++	mov	DWORD [20+esp],eax
++	lea	eax,[2400959708+ebp*1+eax]
++	mov	ebp,edx
++	add	eax,esi
++	and	ebp,edi
++	mov	esi,DWORD [24+esp]
++	add	eax,ebp
++	; 40_59 54
++	mov	ebp,ecx
++	xor	esi,DWORD [32+esp]
++	xor	ebp,edx
++	xor	esi,DWORD [56+esp]
++	and	ebp,ebx
++	xor	esi,DWORD [12+esp]
++	rol	esi,1
++	add	ebp,edi
++	ror	ebx,2
++	mov	edi,eax
++	rol	edi,5
++	mov	DWORD [24+esp],esi
++	lea	esi,[2400959708+ebp*1+esi]
++	mov	ebp,ecx
++	add	esi,edi
++	and	ebp,edx
++	mov	edi,DWORD [28+esp]
++	add	esi,ebp
++	; 40_59 55
++	mov	ebp,ebx
++	xor	edi,DWORD [36+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [60+esp]
++	and	ebp,eax
++	xor	edi,DWORD [16+esp]
++	rol	edi,1
++	add	ebp,edx
++	ror	eax,2
++	mov	edx,esi
++	rol	edx,5
++	mov	DWORD [28+esp],edi
++	lea	edi,[2400959708+ebp*1+edi]
++	mov	ebp,ebx
++	add	edi,edx
++	and	ebp,ecx
++	mov	edx,DWORD [32+esp]
++	add	edi,ebp
++	; 40_59 56
++	mov	ebp,eax
++	xor	edx,DWORD [40+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [esp]
++	and	ebp,esi
++	xor	edx,DWORD [20+esp]
++	rol	edx,1
++	add	ebp,ecx
++	ror	esi,2
++	mov	ecx,edi
++	rol	ecx,5
++	mov	DWORD [32+esp],edx
++	lea	edx,[2400959708+ebp*1+edx]
++	mov	ebp,eax
++	add	edx,ecx
++	and	ebp,ebx
++	mov	ecx,DWORD [36+esp]
++	add	edx,ebp
++	; 40_59 57
++	mov	ebp,esi
++	xor	ecx,DWORD [44+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [4+esp]
++	and	ebp,edi
++	xor	ecx,DWORD [24+esp]
++	rol	ecx,1
++	add	ebp,ebx
++	ror	edi,2
++	mov	ebx,edx
++	rol	ebx,5
++	mov	DWORD [36+esp],ecx
++	lea	ecx,[2400959708+ebp*1+ecx]
++	mov	ebp,esi
++	add	ecx,ebx
++	and	ebp,eax
++	mov	ebx,DWORD [40+esp]
++	add	ecx,ebp
++	; 40_59 58
++	mov	ebp,edi
++	xor	ebx,DWORD [48+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [8+esp]
++	and	ebp,edx
++	xor	ebx,DWORD [28+esp]
++	rol	ebx,1
++	add	ebp,eax
++	ror	edx,2
++	mov	eax,ecx
++	rol	eax,5
++	mov	DWORD [40+esp],ebx
++	lea	ebx,[2400959708+ebp*1+ebx]
++	mov	ebp,edi
++	add	ebx,eax
++	and	ebp,esi
++	mov	eax,DWORD [44+esp]
++	add	ebx,ebp
++	; 40_59 59
++	mov	ebp,edx
++	xor	eax,DWORD [52+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [12+esp]
++	and	ebp,ecx
++	xor	eax,DWORD [32+esp]
++	rol	eax,1
++	add	ebp,esi
++	ror	ecx,2
++	mov	esi,ebx
++	rol	esi,5
++	mov	DWORD [44+esp],eax
++	lea	eax,[2400959708+ebp*1+eax]
++	mov	ebp,edx
++	add	eax,esi
++	and	ebp,edi
++	mov	esi,DWORD [48+esp]
++	add	eax,ebp
++	; 20_39 60
++	mov	ebp,ebx
++	xor	esi,DWORD [56+esp]
++	xor	ebp,ecx
++	xor	esi,DWORD [16+esp]
++	xor	ebp,edx
++	xor	esi,DWORD [36+esp]
++	rol	esi,1
++	add	edi,ebp
++	ror	ebx,2
++	mov	ebp,eax
++	rol	ebp,5
++	mov	DWORD [48+esp],esi
++	lea	esi,[3395469782+edi*1+esi]
++	mov	edi,DWORD [52+esp]
++	add	esi,ebp
++	; 20_39 61
++	mov	ebp,eax
++	xor	edi,DWORD [60+esp]
++	xor	ebp,ebx
++	xor	edi,DWORD [20+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [40+esp]
++	rol	edi,1
++	add	edx,ebp
++	ror	eax,2
++	mov	ebp,esi
++	rol	ebp,5
++	mov	DWORD [52+esp],edi
++	lea	edi,[3395469782+edx*1+edi]
++	mov	edx,DWORD [56+esp]
++	add	edi,ebp
++	; 20_39 62
++	mov	ebp,esi
++	xor	edx,DWORD [esp]
++	xor	ebp,eax
++	xor	edx,DWORD [24+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [44+esp]
++	rol	edx,1
++	add	ecx,ebp
++	ror	esi,2
++	mov	ebp,edi
++	rol	ebp,5
++	mov	DWORD [56+esp],edx
++	lea	edx,[3395469782+ecx*1+edx]
++	mov	ecx,DWORD [60+esp]
++	add	edx,ebp
++	; 20_39 63
++	mov	ebp,edi
++	xor	ecx,DWORD [4+esp]
++	xor	ebp,esi
++	xor	ecx,DWORD [28+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [48+esp]
++	rol	ecx,1
++	add	ebx,ebp
++	ror	edi,2
++	mov	ebp,edx
++	rol	ebp,5
++	mov	DWORD [60+esp],ecx
++	lea	ecx,[3395469782+ebx*1+ecx]
++	mov	ebx,DWORD [esp]
++	add	ecx,ebp
++	; 20_39 64
++	mov	ebp,edx
++	xor	ebx,DWORD [8+esp]
++	xor	ebp,edi
++	xor	ebx,DWORD [32+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [52+esp]
++	rol	ebx,1
++	add	eax,ebp
++	ror	edx,2
++	mov	ebp,ecx
++	rol	ebp,5
++	mov	DWORD [esp],ebx
++	lea	ebx,[3395469782+eax*1+ebx]
++	mov	eax,DWORD [4+esp]
++	add	ebx,ebp
++	; 20_39 65
++	mov	ebp,ecx
++	xor	eax,DWORD [12+esp]
++	xor	ebp,edx
++	xor	eax,DWORD [36+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [56+esp]
++	rol	eax,1
++	add	esi,ebp
++	ror	ecx,2
++	mov	ebp,ebx
++	rol	ebp,5
++	mov	DWORD [4+esp],eax
++	lea	eax,[3395469782+esi*1+eax]
++	mov	esi,DWORD [8+esp]
++	add	eax,ebp
++	; 20_39 66
++	mov	ebp,ebx
++	xor	esi,DWORD [16+esp]
++	xor	ebp,ecx
++	xor	esi,DWORD [40+esp]
++	xor	ebp,edx
++	xor	esi,DWORD [60+esp]
++	rol	esi,1
++	add	edi,ebp
++	ror	ebx,2
++	mov	ebp,eax
++	rol	ebp,5
++	mov	DWORD [8+esp],esi
++	lea	esi,[3395469782+edi*1+esi]
++	mov	edi,DWORD [12+esp]
++	add	esi,ebp
++	; 20_39 67
++	mov	ebp,eax
++	xor	edi,DWORD [20+esp]
++	xor	ebp,ebx
++	xor	edi,DWORD [44+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [esp]
++	rol	edi,1
++	add	edx,ebp
++	ror	eax,2
++	mov	ebp,esi
++	rol	ebp,5
++	mov	DWORD [12+esp],edi
++	lea	edi,[3395469782+edx*1+edi]
++	mov	edx,DWORD [16+esp]
++	add	edi,ebp
++	; 20_39 68
++	mov	ebp,esi
++	xor	edx,DWORD [24+esp]
++	xor	ebp,eax
++	xor	edx,DWORD [48+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [4+esp]
++	rol	edx,1
++	add	ecx,ebp
++	ror	esi,2
++	mov	ebp,edi
++	rol	ebp,5
++	mov	DWORD [16+esp],edx
++	lea	edx,[3395469782+ecx*1+edx]
++	mov	ecx,DWORD [20+esp]
++	add	edx,ebp
++	; 20_39 69
++	mov	ebp,edi
++	xor	ecx,DWORD [28+esp]
++	xor	ebp,esi
++	xor	ecx,DWORD [52+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [8+esp]
++	rol	ecx,1
++	add	ebx,ebp
++	ror	edi,2
++	mov	ebp,edx
++	rol	ebp,5
++	mov	DWORD [20+esp],ecx
++	lea	ecx,[3395469782+ebx*1+ecx]
++	mov	ebx,DWORD [24+esp]
++	add	ecx,ebp
++	; 20_39 70
++	mov	ebp,edx
++	xor	ebx,DWORD [32+esp]
++	xor	ebp,edi
++	xor	ebx,DWORD [56+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [12+esp]
++	rol	ebx,1
++	add	eax,ebp
++	ror	edx,2
++	mov	ebp,ecx
++	rol	ebp,5
++	mov	DWORD [24+esp],ebx
++	lea	ebx,[3395469782+eax*1+ebx]
++	mov	eax,DWORD [28+esp]
++	add	ebx,ebp
++	; 20_39 71
++	mov	ebp,ecx
++	xor	eax,DWORD [36+esp]
++	xor	ebp,edx
++	xor	eax,DWORD [60+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [16+esp]
++	rol	eax,1
++	add	esi,ebp
++	ror	ecx,2
++	mov	ebp,ebx
++	rol	ebp,5
++	mov	DWORD [28+esp],eax
++	lea	eax,[3395469782+esi*1+eax]
++	mov	esi,DWORD [32+esp]
++	add	eax,ebp
++	; 20_39 72
++	mov	ebp,ebx
++	xor	esi,DWORD [40+esp]
++	xor	ebp,ecx
++	xor	esi,DWORD [esp]
++	xor	ebp,edx
++	xor	esi,DWORD [20+esp]
++	rol	esi,1
++	add	edi,ebp
++	ror	ebx,2
++	mov	ebp,eax
++	rol	ebp,5
++	mov	DWORD [32+esp],esi
++	lea	esi,[3395469782+edi*1+esi]
++	mov	edi,DWORD [36+esp]
++	add	esi,ebp
++	; 20_39 73
++	mov	ebp,eax
++	xor	edi,DWORD [44+esp]
++	xor	ebp,ebx
++	xor	edi,DWORD [4+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [24+esp]
++	rol	edi,1
++	add	edx,ebp
++	ror	eax,2
++	mov	ebp,esi
++	rol	ebp,5
++	mov	DWORD [36+esp],edi
++	lea	edi,[3395469782+edx*1+edi]
++	mov	edx,DWORD [40+esp]
++	add	edi,ebp
++	; 20_39 74
++	mov	ebp,esi
++	xor	edx,DWORD [48+esp]
++	xor	ebp,eax
++	xor	edx,DWORD [8+esp]
++	xor	ebp,ebx
++	xor	edx,DWORD [28+esp]
++	rol	edx,1
++	add	ecx,ebp
++	ror	esi,2
++	mov	ebp,edi
++	rol	ebp,5
++	mov	DWORD [40+esp],edx
++	lea	edx,[3395469782+ecx*1+edx]
++	mov	ecx,DWORD [44+esp]
++	add	edx,ebp
++	; 20_39 75
++	mov	ebp,edi
++	xor	ecx,DWORD [52+esp]
++	xor	ebp,esi
++	xor	ecx,DWORD [12+esp]
++	xor	ebp,eax
++	xor	ecx,DWORD [32+esp]
++	rol	ecx,1
++	add	ebx,ebp
++	ror	edi,2
++	mov	ebp,edx
++	rol	ebp,5
++	mov	DWORD [44+esp],ecx
++	lea	ecx,[3395469782+ebx*1+ecx]
++	mov	ebx,DWORD [48+esp]
++	add	ecx,ebp
++	; 20_39 76
++	mov	ebp,edx
++	xor	ebx,DWORD [56+esp]
++	xor	ebp,edi
++	xor	ebx,DWORD [16+esp]
++	xor	ebp,esi
++	xor	ebx,DWORD [36+esp]
++	rol	ebx,1
++	add	eax,ebp
++	ror	edx,2
++	mov	ebp,ecx
++	rol	ebp,5
++	mov	DWORD [48+esp],ebx
++	lea	ebx,[3395469782+eax*1+ebx]
++	mov	eax,DWORD [52+esp]
++	add	ebx,ebp
++	; 20_39 77
++	mov	ebp,ecx
++	xor	eax,DWORD [60+esp]
++	xor	ebp,edx
++	xor	eax,DWORD [20+esp]
++	xor	ebp,edi
++	xor	eax,DWORD [40+esp]
++	rol	eax,1
++	add	esi,ebp
++	ror	ecx,2
++	mov	ebp,ebx
++	rol	ebp,5
++	lea	eax,[3395469782+esi*1+eax]
++	mov	esi,DWORD [56+esp]
++	add	eax,ebp
++	; 20_39 78
++	mov	ebp,ebx
++	xor	esi,DWORD [esp]
++	xor	ebp,ecx
++	xor	esi,DWORD [24+esp]
++	xor	ebp,edx
++	xor	esi,DWORD [44+esp]
++	rol	esi,1
++	add	edi,ebp
++	ror	ebx,2
++	mov	ebp,eax
++	rol	ebp,5
++	lea	esi,[3395469782+edi*1+esi]
++	mov	edi,DWORD [60+esp]
++	add	esi,ebp
++	; 20_39 79
++	mov	ebp,eax
++	xor	edi,DWORD [4+esp]
++	xor	ebp,ebx
++	xor	edi,DWORD [28+esp]
++	xor	ebp,ecx
++	xor	edi,DWORD [48+esp]
++	rol	edi,1
++	add	edx,ebp
++	ror	eax,2
++	mov	ebp,esi
++	rol	ebp,5
++	lea	edi,[3395469782+edx*1+edi]
++	add	edi,ebp
++	mov	ebp,DWORD [96+esp]
++	mov	edx,DWORD [100+esp]
++	add	edi,DWORD [ebp]
++	add	esi,DWORD [4+ebp]
++	add	eax,DWORD [8+ebp]
++	add	ebx,DWORD [12+ebp]
++	add	ecx,DWORD [16+ebp]
++	mov	DWORD [ebp],edi
++	add	edx,64
++	mov	DWORD [4+ebp],esi
++	cmp	edx,DWORD [104+esp]
++	mov	DWORD [8+ebp],eax
++	mov	edi,ecx
++	mov	DWORD [12+ebp],ebx
++	mov	esi,edx
++	mov	DWORD [16+ebp],ecx
++	jb	NEAR L$000loop
++	add	esp,76
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++db	83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115
++db	102,111,114,109,32,102,111,114,32,120,56,54,44,32,67,82
++db	89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112
++db	114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
+diff --git a/SMP/lib/accelerated/x86/coff/sha1-ssse3-x86_64.asm b/SMP/lib/accelerated/x86/coff/sha1-ssse3-x86_64.asm
+new file mode 100644
+index 0000000..98d9dcb
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/sha1-ssse3-x86_64.asm
+@@ -0,0 +1,5714 @@
++default	rel
++%define XMMWORD
++%define YMMWORD
++%define ZMMWORD
++section	.text code align=64
++
++EXTERN	_gnutls_x86_cpuid_s
++
++global	sha1_block_data_order
++
++ALIGN	16
++sha1_block_data_order:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha1_block_data_order:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	mov	r9d,DWORD[((_gnutls_x86_cpuid_s+0))]
++	mov	r8d,DWORD[((_gnutls_x86_cpuid_s+4))]
++	mov	r10d,DWORD[((_gnutls_x86_cpuid_s+8))]
++	test	r8d,512
++	jz	NEAR $L$ialu
++	test	r10d,536870912
++	jnz	NEAR _shaext_shortcut
++	and	r10d,296
++	cmp	r10d,296
++	je	NEAR _avx2_shortcut
++	and	r8d,268435456
++	and	r9d,1073741824
++	or	r8d,r9d
++	cmp	r8d,1342177280
++	je	NEAR _avx_shortcut
++	jmp	NEAR _ssse3_shortcut
++
++ALIGN	16
++$L$ialu:
++	mov	rax,rsp
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	mov	r8,rdi
++	sub	rsp,72
++	mov	r9,rsi
++	and	rsp,-64
++	mov	r10,rdx
++	mov	QWORD[64+rsp],rax
++$L$prologue:
++
++	mov	esi,DWORD[r8]
++	mov	edi,DWORD[4+r8]
++	mov	r11d,DWORD[8+r8]
++	mov	r12d,DWORD[12+r8]
++	mov	r13d,DWORD[16+r8]
++	jmp	NEAR $L$loop
++
++ALIGN	16
++$L$loop:
++	mov	edx,DWORD[r9]
++	bswap	edx
++	mov	ebp,DWORD[4+r9]
++	mov	eax,r12d
++	mov	DWORD[rsp],edx
++	mov	ecx,esi
++	bswap	ebp
++	xor	eax,r11d
++	rol	ecx,5
++	and	eax,edi
++	lea	r13d,[1518500249+r13*1+rdx]
++	add	r13d,ecx
++	xor	eax,r12d
++	rol	edi,30
++	add	r13d,eax
++	mov	r14d,DWORD[8+r9]
++	mov	eax,r11d
++	mov	DWORD[4+rsp],ebp
++	mov	ecx,r13d
++	bswap	r14d
++	xor	eax,edi
++	rol	ecx,5
++	and	eax,esi
++	lea	r12d,[1518500249+r12*1+rbp]
++	add	r12d,ecx
++	xor	eax,r11d
++	rol	esi,30
++	add	r12d,eax
++	mov	edx,DWORD[12+r9]
++	mov	eax,edi
++	mov	DWORD[8+rsp],r14d
++	mov	ecx,r12d
++	bswap	edx
++	xor	eax,esi
++	rol	ecx,5
++	and	eax,r13d
++	lea	r11d,[1518500249+r11*1+r14]
++	add	r11d,ecx
++	xor	eax,edi
++	rol	r13d,30
++	add	r11d,eax
++	mov	ebp,DWORD[16+r9]
++	mov	eax,esi
++	mov	DWORD[12+rsp],edx
++	mov	ecx,r11d
++	bswap	ebp
++	xor	eax,r13d
++	rol	ecx,5
++	and	eax,r12d
++	lea	edi,[1518500249+rdi*1+rdx]
++	add	edi,ecx
++	xor	eax,esi
++	rol	r12d,30
++	add	edi,eax
++	mov	r14d,DWORD[20+r9]
++	mov	eax,r13d
++	mov	DWORD[16+rsp],ebp
++	mov	ecx,edi
++	bswap	r14d
++	xor	eax,r12d
++	rol	ecx,5
++	and	eax,r11d
++	lea	esi,[1518500249+rsi*1+rbp]
++	add	esi,ecx
++	xor	eax,r13d
++	rol	r11d,30
++	add	esi,eax
++	mov	edx,DWORD[24+r9]
++	mov	eax,r12d
++	mov	DWORD[20+rsp],r14d
++	mov	ecx,esi
++	bswap	edx
++	xor	eax,r11d
++	rol	ecx,5
++	and	eax,edi
++	lea	r13d,[1518500249+r13*1+r14]
++	add	r13d,ecx
++	xor	eax,r12d
++	rol	edi,30
++	add	r13d,eax
++	mov	ebp,DWORD[28+r9]
++	mov	eax,r11d
++	mov	DWORD[24+rsp],edx
++	mov	ecx,r13d
++	bswap	ebp
++	xor	eax,edi
++	rol	ecx,5
++	and	eax,esi
++	lea	r12d,[1518500249+r12*1+rdx]
++	add	r12d,ecx
++	xor	eax,r11d
++	rol	esi,30
++	add	r12d,eax
++	mov	r14d,DWORD[32+r9]
++	mov	eax,edi
++	mov	DWORD[28+rsp],ebp
++	mov	ecx,r12d
++	bswap	r14d
++	xor	eax,esi
++	rol	ecx,5
++	and	eax,r13d
++	lea	r11d,[1518500249+r11*1+rbp]
++	add	r11d,ecx
++	xor	eax,edi
++	rol	r13d,30
++	add	r11d,eax
++	mov	edx,DWORD[36+r9]
++	mov	eax,esi
++	mov	DWORD[32+rsp],r14d
++	mov	ecx,r11d
++	bswap	edx
++	xor	eax,r13d
++	rol	ecx,5
++	and	eax,r12d
++	lea	edi,[1518500249+rdi*1+r14]
++	add	edi,ecx
++	xor	eax,esi
++	rol	r12d,30
++	add	edi,eax
++	mov	ebp,DWORD[40+r9]
++	mov	eax,r13d
++	mov	DWORD[36+rsp],edx
++	mov	ecx,edi
++	bswap	ebp
++	xor	eax,r12d
++	rol	ecx,5
++	and	eax,r11d
++	lea	esi,[1518500249+rsi*1+rdx]
++	add	esi,ecx
++	xor	eax,r13d
++	rol	r11d,30
++	add	esi,eax
++	mov	r14d,DWORD[44+r9]
++	mov	eax,r12d
++	mov	DWORD[40+rsp],ebp
++	mov	ecx,esi
++	bswap	r14d
++	xor	eax,r11d
++	rol	ecx,5
++	and	eax,edi
++	lea	r13d,[1518500249+r13*1+rbp]
++	add	r13d,ecx
++	xor	eax,r12d
++	rol	edi,30
++	add	r13d,eax
++	mov	edx,DWORD[48+r9]
++	mov	eax,r11d
++	mov	DWORD[44+rsp],r14d
++	mov	ecx,r13d
++	bswap	edx
++	xor	eax,edi
++	rol	ecx,5
++	and	eax,esi
++	lea	r12d,[1518500249+r12*1+r14]
++	add	r12d,ecx
++	xor	eax,r11d
++	rol	esi,30
++	add	r12d,eax
++	mov	ebp,DWORD[52+r9]
++	mov	eax,edi
++	mov	DWORD[48+rsp],edx
++	mov	ecx,r12d
++	bswap	ebp
++	xor	eax,esi
++	rol	ecx,5
++	and	eax,r13d
++	lea	r11d,[1518500249+r11*1+rdx]
++	add	r11d,ecx
++	xor	eax,edi
++	rol	r13d,30
++	add	r11d,eax
++	mov	r14d,DWORD[56+r9]
++	mov	eax,esi
++	mov	DWORD[52+rsp],ebp
++	mov	ecx,r11d
++	bswap	r14d
++	xor	eax,r13d
++	rol	ecx,5
++	and	eax,r12d
++	lea	edi,[1518500249+rdi*1+rbp]
++	add	edi,ecx
++	xor	eax,esi
++	rol	r12d,30
++	add	edi,eax
++	mov	edx,DWORD[60+r9]
++	mov	eax,r13d
++	mov	DWORD[56+rsp],r14d
++	mov	ecx,edi
++	bswap	edx
++	xor	eax,r12d
++	rol	ecx,5
++	and	eax,r11d
++	lea	esi,[1518500249+rsi*1+r14]
++	add	esi,ecx
++	xor	eax,r13d
++	rol	r11d,30
++	add	esi,eax
++	xor	ebp,DWORD[rsp]
++	mov	eax,r12d
++	mov	DWORD[60+rsp],edx
++	mov	ecx,esi
++	xor	ebp,DWORD[8+rsp]
++	xor	eax,r11d
++	rol	ecx,5
++	xor	ebp,DWORD[32+rsp]
++	and	eax,edi
++	lea	r13d,[1518500249+r13*1+rdx]
++	rol	edi,30
++	xor	eax,r12d
++	add	r13d,ecx
++	rol	ebp,1
++	add	r13d,eax
++	xor	r14d,DWORD[4+rsp]
++	mov	eax,r11d
++	mov	DWORD[rsp],ebp
++	mov	ecx,r13d
++	xor	r14d,DWORD[12+rsp]
++	xor	eax,edi
++	rol	ecx,5
++	xor	r14d,DWORD[36+rsp]
++	and	eax,esi
++	lea	r12d,[1518500249+r12*1+rbp]
++	rol	esi,30
++	xor	eax,r11d
++	add	r12d,ecx
++	rol	r14d,1
++	add	r12d,eax
++	xor	edx,DWORD[8+rsp]
++	mov	eax,edi
++	mov	DWORD[4+rsp],r14d
++	mov	ecx,r12d
++	xor	edx,DWORD[16+rsp]
++	xor	eax,esi
++	rol	ecx,5
++	xor	edx,DWORD[40+rsp]
++	and	eax,r13d
++	lea	r11d,[1518500249+r11*1+r14]
++	rol	r13d,30
++	xor	eax,edi
++	add	r11d,ecx
++	rol	edx,1
++	add	r11d,eax
++	xor	ebp,DWORD[12+rsp]
++	mov	eax,esi
++	mov	DWORD[8+rsp],edx
++	mov	ecx,r11d
++	xor	ebp,DWORD[20+rsp]
++	xor	eax,r13d
++	rol	ecx,5
++	xor	ebp,DWORD[44+rsp]
++	and	eax,r12d
++	lea	edi,[1518500249+rdi*1+rdx]
++	rol	r12d,30
++	xor	eax,esi
++	add	edi,ecx
++	rol	ebp,1
++	add	edi,eax
++	xor	r14d,DWORD[16+rsp]
++	mov	eax,r13d
++	mov	DWORD[12+rsp],ebp
++	mov	ecx,edi
++	xor	r14d,DWORD[24+rsp]
++	xor	eax,r12d
++	rol	ecx,5
++	xor	r14d,DWORD[48+rsp]
++	and	eax,r11d
++	lea	esi,[1518500249+rsi*1+rbp]
++	rol	r11d,30
++	xor	eax,r13d
++	add	esi,ecx
++	rol	r14d,1
++	add	esi,eax
++	xor	edx,DWORD[20+rsp]
++	mov	eax,edi
++	mov	DWORD[16+rsp],r14d
++	mov	ecx,esi
++	xor	edx,DWORD[28+rsp]
++	xor	eax,r12d
++	rol	ecx,5
++	xor	edx,DWORD[52+rsp]
++	lea	r13d,[1859775393+r13*1+r14]
++	xor	eax,r11d
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,eax
++	rol	edx,1
++	xor	ebp,DWORD[24+rsp]
++	mov	eax,esi
++	mov	DWORD[20+rsp],edx
++	mov	ecx,r13d
++	xor	ebp,DWORD[32+rsp]
++	xor	eax,r11d
++	rol	ecx,5
++	xor	ebp,DWORD[56+rsp]
++	lea	r12d,[1859775393+r12*1+rdx]
++	xor	eax,edi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,eax
++	rol	ebp,1
++	xor	r14d,DWORD[28+rsp]
++	mov	eax,r13d
++	mov	DWORD[24+rsp],ebp
++	mov	ecx,r12d
++	xor	r14d,DWORD[36+rsp]
++	xor	eax,edi
++	rol	ecx,5
++	xor	r14d,DWORD[60+rsp]
++	lea	r11d,[1859775393+r11*1+rbp]
++	xor	eax,esi
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,eax
++	rol	r14d,1
++	xor	edx,DWORD[32+rsp]
++	mov	eax,r12d
++	mov	DWORD[28+rsp],r14d
++	mov	ecx,r11d
++	xor	edx,DWORD[40+rsp]
++	xor	eax,esi
++	rol	ecx,5
++	xor	edx,DWORD[rsp]
++	lea	edi,[1859775393+rdi*1+r14]
++	xor	eax,r13d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,eax
++	rol	edx,1
++	xor	ebp,DWORD[36+rsp]
++	mov	eax,r11d
++	mov	DWORD[32+rsp],edx
++	mov	ecx,edi
++	xor	ebp,DWORD[44+rsp]
++	xor	eax,r13d
++	rol	ecx,5
++	xor	ebp,DWORD[4+rsp]
++	lea	esi,[1859775393+rsi*1+rdx]
++	xor	eax,r12d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,eax
++	rol	ebp,1
++	xor	r14d,DWORD[40+rsp]
++	mov	eax,edi
++	mov	DWORD[36+rsp],ebp
++	mov	ecx,esi
++	xor	r14d,DWORD[48+rsp]
++	xor	eax,r12d
++	rol	ecx,5
++	xor	r14d,DWORD[8+rsp]
++	lea	r13d,[1859775393+r13*1+rbp]
++	xor	eax,r11d
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,eax
++	rol	r14d,1
++	xor	edx,DWORD[44+rsp]
++	mov	eax,esi
++	mov	DWORD[40+rsp],r14d
++	mov	ecx,r13d
++	xor	edx,DWORD[52+rsp]
++	xor	eax,r11d
++	rol	ecx,5
++	xor	edx,DWORD[12+rsp]
++	lea	r12d,[1859775393+r12*1+r14]
++	xor	eax,edi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,eax
++	rol	edx,1
++	xor	ebp,DWORD[48+rsp]
++	mov	eax,r13d
++	mov	DWORD[44+rsp],edx
++	mov	ecx,r12d
++	xor	ebp,DWORD[56+rsp]
++	xor	eax,edi
++	rol	ecx,5
++	xor	ebp,DWORD[16+rsp]
++	lea	r11d,[1859775393+r11*1+rdx]
++	xor	eax,esi
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,eax
++	rol	ebp,1
++	xor	r14d,DWORD[52+rsp]
++	mov	eax,r12d
++	mov	DWORD[48+rsp],ebp
++	mov	ecx,r11d
++	xor	r14d,DWORD[60+rsp]
++	xor	eax,esi
++	rol	ecx,5
++	xor	r14d,DWORD[20+rsp]
++	lea	edi,[1859775393+rdi*1+rbp]
++	xor	eax,r13d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,eax
++	rol	r14d,1
++	xor	edx,DWORD[56+rsp]
++	mov	eax,r11d
++	mov	DWORD[52+rsp],r14d
++	mov	ecx,edi
++	xor	edx,DWORD[rsp]
++	xor	eax,r13d
++	rol	ecx,5
++	xor	edx,DWORD[24+rsp]
++	lea	esi,[1859775393+rsi*1+r14]
++	xor	eax,r12d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,eax
++	rol	edx,1
++	xor	ebp,DWORD[60+rsp]
++	mov	eax,edi
++	mov	DWORD[56+rsp],edx
++	mov	ecx,esi
++	xor	ebp,DWORD[4+rsp]
++	xor	eax,r12d
++	rol	ecx,5
++	xor	ebp,DWORD[28+rsp]
++	lea	r13d,[1859775393+r13*1+rdx]
++	xor	eax,r11d
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,eax
++	rol	ebp,1
++	xor	r14d,DWORD[rsp]
++	mov	eax,esi
++	mov	DWORD[60+rsp],ebp
++	mov	ecx,r13d
++	xor	r14d,DWORD[8+rsp]
++	xor	eax,r11d
++	rol	ecx,5
++	xor	r14d,DWORD[32+rsp]
++	lea	r12d,[1859775393+r12*1+rbp]
++	xor	eax,edi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,eax
++	rol	r14d,1
++	xor	edx,DWORD[4+rsp]
++	mov	eax,r13d
++	mov	DWORD[rsp],r14d
++	mov	ecx,r12d
++	xor	edx,DWORD[12+rsp]
++	xor	eax,edi
++	rol	ecx,5
++	xor	edx,DWORD[36+rsp]
++	lea	r11d,[1859775393+r11*1+r14]
++	xor	eax,esi
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,eax
++	rol	edx,1
++	xor	ebp,DWORD[8+rsp]
++	mov	eax,r12d
++	mov	DWORD[4+rsp],edx
++	mov	ecx,r11d
++	xor	ebp,DWORD[16+rsp]
++	xor	eax,esi
++	rol	ecx,5
++	xor	ebp,DWORD[40+rsp]
++	lea	edi,[1859775393+rdi*1+rdx]
++	xor	eax,r13d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,eax
++	rol	ebp,1
++	xor	r14d,DWORD[12+rsp]
++	mov	eax,r11d
++	mov	DWORD[8+rsp],ebp
++	mov	ecx,edi
++	xor	r14d,DWORD[20+rsp]
++	xor	eax,r13d
++	rol	ecx,5
++	xor	r14d,DWORD[44+rsp]
++	lea	esi,[1859775393+rsi*1+rbp]
++	xor	eax,r12d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,eax
++	rol	r14d,1
++	xor	edx,DWORD[16+rsp]
++	mov	eax,edi
++	mov	DWORD[12+rsp],r14d
++	mov	ecx,esi
++	xor	edx,DWORD[24+rsp]
++	xor	eax,r12d
++	rol	ecx,5
++	xor	edx,DWORD[48+rsp]
++	lea	r13d,[1859775393+r13*1+r14]
++	xor	eax,r11d
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,eax
++	rol	edx,1
++	xor	ebp,DWORD[20+rsp]
++	mov	eax,esi
++	mov	DWORD[16+rsp],edx
++	mov	ecx,r13d
++	xor	ebp,DWORD[28+rsp]
++	xor	eax,r11d
++	rol	ecx,5
++	xor	ebp,DWORD[52+rsp]
++	lea	r12d,[1859775393+r12*1+rdx]
++	xor	eax,edi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,eax
++	rol	ebp,1
++	xor	r14d,DWORD[24+rsp]
++	mov	eax,r13d
++	mov	DWORD[20+rsp],ebp
++	mov	ecx,r12d
++	xor	r14d,DWORD[32+rsp]
++	xor	eax,edi
++	rol	ecx,5
++	xor	r14d,DWORD[56+rsp]
++	lea	r11d,[1859775393+r11*1+rbp]
++	xor	eax,esi
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,eax
++	rol	r14d,1
++	xor	edx,DWORD[28+rsp]
++	mov	eax,r12d
++	mov	DWORD[24+rsp],r14d
++	mov	ecx,r11d
++	xor	edx,DWORD[36+rsp]
++	xor	eax,esi
++	rol	ecx,5
++	xor	edx,DWORD[60+rsp]
++	lea	edi,[1859775393+rdi*1+r14]
++	xor	eax,r13d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,eax
++	rol	edx,1
++	xor	ebp,DWORD[32+rsp]
++	mov	eax,r11d
++	mov	DWORD[28+rsp],edx
++	mov	ecx,edi
++	xor	ebp,DWORD[40+rsp]
++	xor	eax,r13d
++	rol	ecx,5
++	xor	ebp,DWORD[rsp]
++	lea	esi,[1859775393+rsi*1+rdx]
++	xor	eax,r12d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,eax
++	rol	ebp,1
++	xor	r14d,DWORD[36+rsp]
++	mov	eax,r12d
++	mov	DWORD[32+rsp],ebp
++	mov	ebx,r12d
++	xor	r14d,DWORD[44+rsp]
++	and	eax,r11d
++	mov	ecx,esi
++	xor	r14d,DWORD[4+rsp]
++	lea	r13d,[((-1894007588))+r13*1+rbp]
++	xor	ebx,r11d
++	rol	ecx,5
++	add	r13d,eax
++	rol	r14d,1
++	and	ebx,edi
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,ebx
++	xor	edx,DWORD[40+rsp]
++	mov	eax,r11d
++	mov	DWORD[36+rsp],r14d
++	mov	ebx,r11d
++	xor	edx,DWORD[48+rsp]
++	and	eax,edi
++	mov	ecx,r13d
++	xor	edx,DWORD[8+rsp]
++	lea	r12d,[((-1894007588))+r12*1+r14]
++	xor	ebx,edi
++	rol	ecx,5
++	add	r12d,eax
++	rol	edx,1
++	and	ebx,esi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,ebx
++	xor	ebp,DWORD[44+rsp]
++	mov	eax,edi
++	mov	DWORD[40+rsp],edx
++	mov	ebx,edi
++	xor	ebp,DWORD[52+rsp]
++	and	eax,esi
++	mov	ecx,r12d
++	xor	ebp,DWORD[12+rsp]
++	lea	r11d,[((-1894007588))+r11*1+rdx]
++	xor	ebx,esi
++	rol	ecx,5
++	add	r11d,eax
++	rol	ebp,1
++	and	ebx,r13d
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,ebx
++	xor	r14d,DWORD[48+rsp]
++	mov	eax,esi
++	mov	DWORD[44+rsp],ebp
++	mov	ebx,esi
++	xor	r14d,DWORD[56+rsp]
++	and	eax,r13d
++	mov	ecx,r11d
++	xor	r14d,DWORD[16+rsp]
++	lea	edi,[((-1894007588))+rdi*1+rbp]
++	xor	ebx,r13d
++	rol	ecx,5
++	add	edi,eax
++	rol	r14d,1
++	and	ebx,r12d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,ebx
++	xor	edx,DWORD[52+rsp]
++	mov	eax,r13d
++	mov	DWORD[48+rsp],r14d
++	mov	ebx,r13d
++	xor	edx,DWORD[60+rsp]
++	and	eax,r12d
++	mov	ecx,edi
++	xor	edx,DWORD[20+rsp]
++	lea	esi,[((-1894007588))+rsi*1+r14]
++	xor	ebx,r12d
++	rol	ecx,5
++	add	esi,eax
++	rol	edx,1
++	and	ebx,r11d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,ebx
++	xor	ebp,DWORD[56+rsp]
++	mov	eax,r12d
++	mov	DWORD[52+rsp],edx
++	mov	ebx,r12d
++	xor	ebp,DWORD[rsp]
++	and	eax,r11d
++	mov	ecx,esi
++	xor	ebp,DWORD[24+rsp]
++	lea	r13d,[((-1894007588))+r13*1+rdx]
++	xor	ebx,r11d
++	rol	ecx,5
++	add	r13d,eax
++	rol	ebp,1
++	and	ebx,edi
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,ebx
++	xor	r14d,DWORD[60+rsp]
++	mov	eax,r11d
++	mov	DWORD[56+rsp],ebp
++	mov	ebx,r11d
++	xor	r14d,DWORD[4+rsp]
++	and	eax,edi
++	mov	ecx,r13d
++	xor	r14d,DWORD[28+rsp]
++	lea	r12d,[((-1894007588))+r12*1+rbp]
++	xor	ebx,edi
++	rol	ecx,5
++	add	r12d,eax
++	rol	r14d,1
++	and	ebx,esi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,ebx
++	xor	edx,DWORD[rsp]
++	mov	eax,edi
++	mov	DWORD[60+rsp],r14d
++	mov	ebx,edi
++	xor	edx,DWORD[8+rsp]
++	and	eax,esi
++	mov	ecx,r12d
++	xor	edx,DWORD[32+rsp]
++	lea	r11d,[((-1894007588))+r11*1+r14]
++	xor	ebx,esi
++	rol	ecx,5
++	add	r11d,eax
++	rol	edx,1
++	and	ebx,r13d
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,ebx
++	xor	ebp,DWORD[4+rsp]
++	mov	eax,esi
++	mov	DWORD[rsp],edx
++	mov	ebx,esi
++	xor	ebp,DWORD[12+rsp]
++	and	eax,r13d
++	mov	ecx,r11d
++	xor	ebp,DWORD[36+rsp]
++	lea	edi,[((-1894007588))+rdi*1+rdx]
++	xor	ebx,r13d
++	rol	ecx,5
++	add	edi,eax
++	rol	ebp,1
++	and	ebx,r12d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,ebx
++	xor	r14d,DWORD[8+rsp]
++	mov	eax,r13d
++	mov	DWORD[4+rsp],ebp
++	mov	ebx,r13d
++	xor	r14d,DWORD[16+rsp]
++	and	eax,r12d
++	mov	ecx,edi
++	xor	r14d,DWORD[40+rsp]
++	lea	esi,[((-1894007588))+rsi*1+rbp]
++	xor	ebx,r12d
++	rol	ecx,5
++	add	esi,eax
++	rol	r14d,1
++	and	ebx,r11d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,ebx
++	xor	edx,DWORD[12+rsp]
++	mov	eax,r12d
++	mov	DWORD[8+rsp],r14d
++	mov	ebx,r12d
++	xor	edx,DWORD[20+rsp]
++	and	eax,r11d
++	mov	ecx,esi
++	xor	edx,DWORD[44+rsp]
++	lea	r13d,[((-1894007588))+r13*1+r14]
++	xor	ebx,r11d
++	rol	ecx,5
++	add	r13d,eax
++	rol	edx,1
++	and	ebx,edi
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,ebx
++	xor	ebp,DWORD[16+rsp]
++	mov	eax,r11d
++	mov	DWORD[12+rsp],edx
++	mov	ebx,r11d
++	xor	ebp,DWORD[24+rsp]
++	and	eax,edi
++	mov	ecx,r13d
++	xor	ebp,DWORD[48+rsp]
++	lea	r12d,[((-1894007588))+r12*1+rdx]
++	xor	ebx,edi
++	rol	ecx,5
++	add	r12d,eax
++	rol	ebp,1
++	and	ebx,esi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,ebx
++	xor	r14d,DWORD[20+rsp]
++	mov	eax,edi
++	mov	DWORD[16+rsp],ebp
++	mov	ebx,edi
++	xor	r14d,DWORD[28+rsp]
++	and	eax,esi
++	mov	ecx,r12d
++	xor	r14d,DWORD[52+rsp]
++	lea	r11d,[((-1894007588))+r11*1+rbp]
++	xor	ebx,esi
++	rol	ecx,5
++	add	r11d,eax
++	rol	r14d,1
++	and	ebx,r13d
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,ebx
++	xor	edx,DWORD[24+rsp]
++	mov	eax,esi
++	mov	DWORD[20+rsp],r14d
++	mov	ebx,esi
++	xor	edx,DWORD[32+rsp]
++	and	eax,r13d
++	mov	ecx,r11d
++	xor	edx,DWORD[56+rsp]
++	lea	edi,[((-1894007588))+rdi*1+r14]
++	xor	ebx,r13d
++	rol	ecx,5
++	add	edi,eax
++	rol	edx,1
++	and	ebx,r12d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,ebx
++	xor	ebp,DWORD[28+rsp]
++	mov	eax,r13d
++	mov	DWORD[24+rsp],edx
++	mov	ebx,r13d
++	xor	ebp,DWORD[36+rsp]
++	and	eax,r12d
++	mov	ecx,edi
++	xor	ebp,DWORD[60+rsp]
++	lea	esi,[((-1894007588))+rsi*1+rdx]
++	xor	ebx,r12d
++	rol	ecx,5
++	add	esi,eax
++	rol	ebp,1
++	and	ebx,r11d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,ebx
++	xor	r14d,DWORD[32+rsp]
++	mov	eax,r12d
++	mov	DWORD[28+rsp],ebp
++	mov	ebx,r12d
++	xor	r14d,DWORD[40+rsp]
++	and	eax,r11d
++	mov	ecx,esi
++	xor	r14d,DWORD[rsp]
++	lea	r13d,[((-1894007588))+r13*1+rbp]
++	xor	ebx,r11d
++	rol	ecx,5
++	add	r13d,eax
++	rol	r14d,1
++	and	ebx,edi
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,ebx
++	xor	edx,DWORD[36+rsp]
++	mov	eax,r11d
++	mov	DWORD[32+rsp],r14d
++	mov	ebx,r11d
++	xor	edx,DWORD[44+rsp]
++	and	eax,edi
++	mov	ecx,r13d
++	xor	edx,DWORD[4+rsp]
++	lea	r12d,[((-1894007588))+r12*1+r14]
++	xor	ebx,edi
++	rol	ecx,5
++	add	r12d,eax
++	rol	edx,1
++	and	ebx,esi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,ebx
++	xor	ebp,DWORD[40+rsp]
++	mov	eax,edi
++	mov	DWORD[36+rsp],edx
++	mov	ebx,edi
++	xor	ebp,DWORD[48+rsp]
++	and	eax,esi
++	mov	ecx,r12d
++	xor	ebp,DWORD[8+rsp]
++	lea	r11d,[((-1894007588))+r11*1+rdx]
++	xor	ebx,esi
++	rol	ecx,5
++	add	r11d,eax
++	rol	ebp,1
++	and	ebx,r13d
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,ebx
++	xor	r14d,DWORD[44+rsp]
++	mov	eax,esi
++	mov	DWORD[40+rsp],ebp
++	mov	ebx,esi
++	xor	r14d,DWORD[52+rsp]
++	and	eax,r13d
++	mov	ecx,r11d
++	xor	r14d,DWORD[12+rsp]
++	lea	edi,[((-1894007588))+rdi*1+rbp]
++	xor	ebx,r13d
++	rol	ecx,5
++	add	edi,eax
++	rol	r14d,1
++	and	ebx,r12d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,ebx
++	xor	edx,DWORD[48+rsp]
++	mov	eax,r13d
++	mov	DWORD[44+rsp],r14d
++	mov	ebx,r13d
++	xor	edx,DWORD[56+rsp]
++	and	eax,r12d
++	mov	ecx,edi
++	xor	edx,DWORD[16+rsp]
++	lea	esi,[((-1894007588))+rsi*1+r14]
++	xor	ebx,r12d
++	rol	ecx,5
++	add	esi,eax
++	rol	edx,1
++	and	ebx,r11d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,ebx
++	xor	ebp,DWORD[52+rsp]
++	mov	eax,edi
++	mov	DWORD[48+rsp],edx
++	mov	ecx,esi
++	xor	ebp,DWORD[60+rsp]
++	xor	eax,r12d
++	rol	ecx,5
++	xor	ebp,DWORD[20+rsp]
++	lea	r13d,[((-899497514))+r13*1+rdx]
++	xor	eax,r11d
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,eax
++	rol	ebp,1
++	xor	r14d,DWORD[56+rsp]
++	mov	eax,esi
++	mov	DWORD[52+rsp],ebp
++	mov	ecx,r13d
++	xor	r14d,DWORD[rsp]
++	xor	eax,r11d
++	rol	ecx,5
++	xor	r14d,DWORD[24+rsp]
++	lea	r12d,[((-899497514))+r12*1+rbp]
++	xor	eax,edi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,eax
++	rol	r14d,1
++	xor	edx,DWORD[60+rsp]
++	mov	eax,r13d
++	mov	DWORD[56+rsp],r14d
++	mov	ecx,r12d
++	xor	edx,DWORD[4+rsp]
++	xor	eax,edi
++	rol	ecx,5
++	xor	edx,DWORD[28+rsp]
++	lea	r11d,[((-899497514))+r11*1+r14]
++	xor	eax,esi
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,eax
++	rol	edx,1
++	xor	ebp,DWORD[rsp]
++	mov	eax,r12d
++	mov	DWORD[60+rsp],edx
++	mov	ecx,r11d
++	xor	ebp,DWORD[8+rsp]
++	xor	eax,esi
++	rol	ecx,5
++	xor	ebp,DWORD[32+rsp]
++	lea	edi,[((-899497514))+rdi*1+rdx]
++	xor	eax,r13d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,eax
++	rol	ebp,1
++	xor	r14d,DWORD[4+rsp]
++	mov	eax,r11d
++	mov	DWORD[rsp],ebp
++	mov	ecx,edi
++	xor	r14d,DWORD[12+rsp]
++	xor	eax,r13d
++	rol	ecx,5
++	xor	r14d,DWORD[36+rsp]
++	lea	esi,[((-899497514))+rsi*1+rbp]
++	xor	eax,r12d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,eax
++	rol	r14d,1
++	xor	edx,DWORD[8+rsp]
++	mov	eax,edi
++	mov	DWORD[4+rsp],r14d
++	mov	ecx,esi
++	xor	edx,DWORD[16+rsp]
++	xor	eax,r12d
++	rol	ecx,5
++	xor	edx,DWORD[40+rsp]
++	lea	r13d,[((-899497514))+r13*1+r14]
++	xor	eax,r11d
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,eax
++	rol	edx,1
++	xor	ebp,DWORD[12+rsp]
++	mov	eax,esi
++	mov	DWORD[8+rsp],edx
++	mov	ecx,r13d
++	xor	ebp,DWORD[20+rsp]
++	xor	eax,r11d
++	rol	ecx,5
++	xor	ebp,DWORD[44+rsp]
++	lea	r12d,[((-899497514))+r12*1+rdx]
++	xor	eax,edi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,eax
++	rol	ebp,1
++	xor	r14d,DWORD[16+rsp]
++	mov	eax,r13d
++	mov	DWORD[12+rsp],ebp
++	mov	ecx,r12d
++	xor	r14d,DWORD[24+rsp]
++	xor	eax,edi
++	rol	ecx,5
++	xor	r14d,DWORD[48+rsp]
++	lea	r11d,[((-899497514))+r11*1+rbp]
++	xor	eax,esi
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,eax
++	rol	r14d,1
++	xor	edx,DWORD[20+rsp]
++	mov	eax,r12d
++	mov	DWORD[16+rsp],r14d
++	mov	ecx,r11d
++	xor	edx,DWORD[28+rsp]
++	xor	eax,esi
++	rol	ecx,5
++	xor	edx,DWORD[52+rsp]
++	lea	edi,[((-899497514))+rdi*1+r14]
++	xor	eax,r13d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,eax
++	rol	edx,1
++	xor	ebp,DWORD[24+rsp]
++	mov	eax,r11d
++	mov	DWORD[20+rsp],edx
++	mov	ecx,edi
++	xor	ebp,DWORD[32+rsp]
++	xor	eax,r13d
++	rol	ecx,5
++	xor	ebp,DWORD[56+rsp]
++	lea	esi,[((-899497514))+rsi*1+rdx]
++	xor	eax,r12d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,eax
++	rol	ebp,1
++	xor	r14d,DWORD[28+rsp]
++	mov	eax,edi
++	mov	DWORD[24+rsp],ebp
++	mov	ecx,esi
++	xor	r14d,DWORD[36+rsp]
++	xor	eax,r12d
++	rol	ecx,5
++	xor	r14d,DWORD[60+rsp]
++	lea	r13d,[((-899497514))+r13*1+rbp]
++	xor	eax,r11d
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,eax
++	rol	r14d,1
++	xor	edx,DWORD[32+rsp]
++	mov	eax,esi
++	mov	DWORD[28+rsp],r14d
++	mov	ecx,r13d
++	xor	edx,DWORD[40+rsp]
++	xor	eax,r11d
++	rol	ecx,5
++	xor	edx,DWORD[rsp]
++	lea	r12d,[((-899497514))+r12*1+r14]
++	xor	eax,edi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,eax
++	rol	edx,1
++	xor	ebp,DWORD[36+rsp]
++	mov	eax,r13d
++
++	mov	ecx,r12d
++	xor	ebp,DWORD[44+rsp]
++	xor	eax,edi
++	rol	ecx,5
++	xor	ebp,DWORD[4+rsp]
++	lea	r11d,[((-899497514))+r11*1+rdx]
++	xor	eax,esi
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,eax
++	rol	ebp,1
++	xor	r14d,DWORD[40+rsp]
++	mov	eax,r12d
++
++	mov	ecx,r11d
++	xor	r14d,DWORD[48+rsp]
++	xor	eax,esi
++	rol	ecx,5
++	xor	r14d,DWORD[8+rsp]
++	lea	edi,[((-899497514))+rdi*1+rbp]
++	xor	eax,r13d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,eax
++	rol	r14d,1
++	xor	edx,DWORD[44+rsp]
++	mov	eax,r11d
++
++	mov	ecx,edi
++	xor	edx,DWORD[52+rsp]
++	xor	eax,r13d
++	rol	ecx,5
++	xor	edx,DWORD[12+rsp]
++	lea	esi,[((-899497514))+rsi*1+r14]
++	xor	eax,r12d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,eax
++	rol	edx,1
++	xor	ebp,DWORD[48+rsp]
++	mov	eax,edi
++
++	mov	ecx,esi
++	xor	ebp,DWORD[56+rsp]
++	xor	eax,r12d
++	rol	ecx,5
++	xor	ebp,DWORD[16+rsp]
++	lea	r13d,[((-899497514))+r13*1+rdx]
++	xor	eax,r11d
++	add	r13d,ecx
++	rol	edi,30
++	add	r13d,eax
++	rol	ebp,1
++	xor	r14d,DWORD[52+rsp]
++	mov	eax,esi
++
++	mov	ecx,r13d
++	xor	r14d,DWORD[60+rsp]
++	xor	eax,r11d
++	rol	ecx,5
++	xor	r14d,DWORD[20+rsp]
++	lea	r12d,[((-899497514))+r12*1+rbp]
++	xor	eax,edi
++	add	r12d,ecx
++	rol	esi,30
++	add	r12d,eax
++	rol	r14d,1
++	xor	edx,DWORD[56+rsp]
++	mov	eax,r13d
++
++	mov	ecx,r12d
++	xor	edx,DWORD[rsp]
++	xor	eax,edi
++	rol	ecx,5
++	xor	edx,DWORD[24+rsp]
++	lea	r11d,[((-899497514))+r11*1+r14]
++	xor	eax,esi
++	add	r11d,ecx
++	rol	r13d,30
++	add	r11d,eax
++	rol	edx,1
++	xor	ebp,DWORD[60+rsp]
++	mov	eax,r12d
++
++	mov	ecx,r11d
++	xor	ebp,DWORD[4+rsp]
++	xor	eax,esi
++	rol	ecx,5
++	xor	ebp,DWORD[28+rsp]
++	lea	edi,[((-899497514))+rdi*1+rdx]
++	xor	eax,r13d
++	add	edi,ecx
++	rol	r12d,30
++	add	edi,eax
++	rol	ebp,1
++	mov	eax,r11d
++	mov	ecx,edi
++	xor	eax,r13d
++	lea	esi,[((-899497514))+rsi*1+rbp]
++	rol	ecx,5
++	xor	eax,r12d
++	add	esi,ecx
++	rol	r11d,30
++	add	esi,eax
++	add	esi,DWORD[r8]
++	add	edi,DWORD[4+r8]
++	add	r11d,DWORD[8+r8]
++	add	r12d,DWORD[12+r8]
++	add	r13d,DWORD[16+r8]
++	mov	DWORD[r8],esi
++	mov	DWORD[4+r8],edi
++	mov	DWORD[8+r8],r11d
++	mov	DWORD[12+r8],r12d
++	mov	DWORD[16+r8],r13d
++
++	sub	r10,1
++	lea	r9,[64+r9]
++	jnz	NEAR $L$loop
++
++	mov	rsi,QWORD[64+rsp]
++	mov	r14,QWORD[((-40))+rsi]
++	mov	r13,QWORD[((-32))+rsi]
++	mov	r12,QWORD[((-24))+rsi]
++	mov	rbp,QWORD[((-16))+rsi]
++	mov	rbx,QWORD[((-8))+rsi]
++	lea	rsp,[rsi]
++$L$epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha1_block_data_order:
++
++ALIGN	32
++sha1_block_data_order_shaext:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha1_block_data_order_shaext:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++_shaext_shortcut:
++	lea	rsp,[((-72))+rsp]
++	movaps	XMMWORD[(-8-64)+rax],xmm6
++	movaps	XMMWORD[(-8-48)+rax],xmm7
++	movaps	XMMWORD[(-8-32)+rax],xmm8
++	movaps	XMMWORD[(-8-16)+rax],xmm9
++$L$prologue_shaext:
++	movdqu	xmm0,XMMWORD[rdi]
++	movd	xmm1,DWORD[16+rdi]
++	movdqa	xmm3,XMMWORD[((K_XX_XX+160))]
++
++	movdqu	xmm4,XMMWORD[rsi]
++	pshufd	xmm0,xmm0,27
++	movdqu	xmm5,XMMWORD[16+rsi]
++	pshufd	xmm1,xmm1,27
++	movdqu	xmm6,XMMWORD[32+rsi]
++DB	102,15,56,0,227
++	movdqu	xmm7,XMMWORD[48+rsi]
++DB	102,15,56,0,235
++DB	102,15,56,0,243
++	movdqa	xmm9,xmm1
++DB	102,15,56,0,251
++	jmp	NEAR $L$oop_shaext
++
++ALIGN	16
++$L$oop_shaext:
++	dec	rdx
++	lea	r8,[64+rsi]
++	paddd	xmm1,xmm4
++	cmovne	rsi,r8
++	movdqa	xmm8,xmm0
++DB	15,56,201,229
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,0
++DB	15,56,200,213
++	pxor	xmm4,xmm6
++DB	15,56,201,238
++DB	15,56,202,231
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,0
++DB	15,56,200,206
++	pxor	xmm5,xmm7
++DB	15,56,202,236
++DB	15,56,201,247
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,0
++DB	15,56,200,215
++	pxor	xmm6,xmm4
++DB	15,56,201,252
++DB	15,56,202,245
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,0
++DB	15,56,200,204
++	pxor	xmm7,xmm5
++DB	15,56,202,254
++DB	15,56,201,229
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,0
++DB	15,56,200,213
++	pxor	xmm4,xmm6
++DB	15,56,201,238
++DB	15,56,202,231
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,1
++DB	15,56,200,206
++	pxor	xmm5,xmm7
++DB	15,56,202,236
++DB	15,56,201,247
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,1
++DB	15,56,200,215
++	pxor	xmm6,xmm4
++DB	15,56,201,252
++DB	15,56,202,245
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,1
++DB	15,56,200,204
++	pxor	xmm7,xmm5
++DB	15,56,202,254
++DB	15,56,201,229
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,1
++DB	15,56,200,213
++	pxor	xmm4,xmm6
++DB	15,56,201,238
++DB	15,56,202,231
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,1
++DB	15,56,200,206
++	pxor	xmm5,xmm7
++DB	15,56,202,236
++DB	15,56,201,247
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,2
++DB	15,56,200,215
++	pxor	xmm6,xmm4
++DB	15,56,201,252
++DB	15,56,202,245
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,2
++DB	15,56,200,204
++	pxor	xmm7,xmm5
++DB	15,56,202,254
++DB	15,56,201,229
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,2
++DB	15,56,200,213
++	pxor	xmm4,xmm6
++DB	15,56,201,238
++DB	15,56,202,231
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,2
++DB	15,56,200,206
++	pxor	xmm5,xmm7
++DB	15,56,202,236
++DB	15,56,201,247
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,2
++DB	15,56,200,215
++	pxor	xmm6,xmm4
++DB	15,56,201,252
++DB	15,56,202,245
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,3
++DB	15,56,200,204
++	pxor	xmm7,xmm5
++DB	15,56,202,254
++	movdqu	xmm4,XMMWORD[rsi]
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,3
++DB	15,56,200,213
++	movdqu	xmm5,XMMWORD[16+rsi]
++DB	102,15,56,0,227
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,3
++DB	15,56,200,206
++	movdqu	xmm6,XMMWORD[32+rsi]
++DB	102,15,56,0,235
++
++	movdqa	xmm2,xmm0
++DB	15,58,204,193,3
++DB	15,56,200,215
++	movdqu	xmm7,XMMWORD[48+rsi]
++DB	102,15,56,0,243
++
++	movdqa	xmm1,xmm0
++DB	15,58,204,194,3
++DB	65,15,56,200,201
++DB	102,15,56,0,251
++
++	paddd	xmm0,xmm8
++	movdqa	xmm9,xmm1
++
++	jnz	NEAR $L$oop_shaext
++
++	pshufd	xmm0,xmm0,27
++	pshufd	xmm1,xmm1,27
++	movdqu	XMMWORD[rdi],xmm0
++	movd	DWORD[16+rdi],xmm1
++	movaps	xmm6,XMMWORD[((-8-64))+rax]
++	movaps	xmm7,XMMWORD[((-8-48))+rax]
++	movaps	xmm8,XMMWORD[((-8-32))+rax]
++	movaps	xmm9,XMMWORD[((-8-16))+rax]
++	mov	rsp,rax
++$L$epilogue_shaext:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha1_block_data_order_shaext:
++
++ALIGN	16
++sha1_block_data_order_ssse3:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha1_block_data_order_ssse3:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++_ssse3_shortcut:
++	mov	rax,rsp
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	lea	rsp,[((-160))+rsp]
++	movaps	XMMWORD[(-40-96)+rax],xmm6
++	movaps	XMMWORD[(-40-80)+rax],xmm7
++	movaps	XMMWORD[(-40-64)+rax],xmm8
++	movaps	XMMWORD[(-40-48)+rax],xmm9
++	movaps	XMMWORD[(-40-32)+rax],xmm10
++	movaps	XMMWORD[(-40-16)+rax],xmm11
++$L$prologue_ssse3:
++	mov	r14,rax
++	and	rsp,-64
++	mov	r8,rdi
++	mov	r9,rsi
++	mov	r10,rdx
++
++	shl	r10,6
++	add	r10,r9
++	lea	r11,[((K_XX_XX+64))]
++
++	mov	eax,DWORD[r8]
++	mov	ebx,DWORD[4+r8]
++	mov	ecx,DWORD[8+r8]
++	mov	edx,DWORD[12+r8]
++	mov	esi,ebx
++	mov	ebp,DWORD[16+r8]
++	mov	edi,ecx
++	xor	edi,edx
++	and	esi,edi
++
++	movdqa	xmm6,XMMWORD[64+r11]
++	movdqa	xmm9,XMMWORD[((-64))+r11]
++	movdqu	xmm0,XMMWORD[r9]
++	movdqu	xmm1,XMMWORD[16+r9]
++	movdqu	xmm2,XMMWORD[32+r9]
++	movdqu	xmm3,XMMWORD[48+r9]
++DB	102,15,56,0,198
++DB	102,15,56,0,206
++DB	102,15,56,0,214
++	add	r9,64
++	paddd	xmm0,xmm9
++DB	102,15,56,0,222
++	paddd	xmm1,xmm9
++	paddd	xmm2,xmm9
++	movdqa	XMMWORD[rsp],xmm0
++	psubd	xmm0,xmm9
++	movdqa	XMMWORD[16+rsp],xmm1
++	psubd	xmm1,xmm9
++	movdqa	XMMWORD[32+rsp],xmm2
++	psubd	xmm2,xmm9
++	jmp	NEAR $L$oop_ssse3
++ALIGN	16
++$L$oop_ssse3:
++	ror	ebx,2
++	pshufd	xmm4,xmm0,238
++	xor	esi,edx
++	movdqa	xmm8,xmm3
++	paddd	xmm9,xmm3
++	mov	edi,eax
++	add	ebp,DWORD[rsp]
++	punpcklqdq	xmm4,xmm1
++	xor	ebx,ecx
++	rol	eax,5
++	add	ebp,esi
++	psrldq	xmm8,4
++	and	edi,ebx
++	xor	ebx,ecx
++	pxor	xmm4,xmm0
++	add	ebp,eax
++	ror	eax,7
++	pxor	xmm8,xmm2
++	xor	edi,ecx
++	mov	esi,ebp
++	add	edx,DWORD[4+rsp]
++	pxor	xmm4,xmm8
++	xor	eax,ebx
++	rol	ebp,5
++	movdqa	XMMWORD[48+rsp],xmm9
++	add	edx,edi
++	and	esi,eax
++	movdqa	xmm10,xmm4
++	xor	eax,ebx
++	add	edx,ebp
++	ror	ebp,7
++	movdqa	xmm8,xmm4
++	xor	esi,ebx
++	pslldq	xmm10,12
++	paddd	xmm4,xmm4
++	mov	edi,edx
++	add	ecx,DWORD[8+rsp]
++	psrld	xmm8,31
++	xor	ebp,eax
++	rol	edx,5
++	add	ecx,esi
++	movdqa	xmm9,xmm10
++	and	edi,ebp
++	xor	ebp,eax
++	psrld	xmm10,30
++	add	ecx,edx
++	ror	edx,7
++	por	xmm4,xmm8
++	xor	edi,eax
++	mov	esi,ecx
++	add	ebx,DWORD[12+rsp]
++	pslld	xmm9,2
++	pxor	xmm4,xmm10
++	xor	edx,ebp
++	movdqa	xmm10,XMMWORD[((-64))+r11]
++	rol	ecx,5
++	add	ebx,edi
++	and	esi,edx
++	pxor	xmm4,xmm9
++	xor	edx,ebp
++	add	ebx,ecx
++	ror	ecx,7
++	pshufd	xmm5,xmm1,238
++	xor	esi,ebp
++	movdqa	xmm9,xmm4
++	paddd	xmm10,xmm4
++	mov	edi,ebx
++	add	eax,DWORD[16+rsp]
++	punpcklqdq	xmm5,xmm2
++	xor	ecx,edx
++	rol	ebx,5
++	add	eax,esi
++	psrldq	xmm9,4
++	and	edi,ecx
++	xor	ecx,edx
++	pxor	xmm5,xmm1
++	add	eax,ebx
++	ror	ebx,7
++	pxor	xmm9,xmm3
++	xor	edi,edx
++	mov	esi,eax
++	add	ebp,DWORD[20+rsp]
++	pxor	xmm5,xmm9
++	xor	ebx,ecx
++	rol	eax,5
++	movdqa	XMMWORD[rsp],xmm10
++	add	ebp,edi
++	and	esi,ebx
++	movdqa	xmm8,xmm5
++	xor	ebx,ecx
++	add	ebp,eax
++	ror	eax,7
++	movdqa	xmm9,xmm5
++	xor	esi,ecx
++	pslldq	xmm8,12
++	paddd	xmm5,xmm5
++	mov	edi,ebp
++	add	edx,DWORD[24+rsp]
++	psrld	xmm9,31
++	xor	eax,ebx
++	rol	ebp,5
++	add	edx,esi
++	movdqa	xmm10,xmm8
++	and	edi,eax
++	xor	eax,ebx
++	psrld	xmm8,30
++	add	edx,ebp
++	ror	ebp,7
++	por	xmm5,xmm9
++	xor	edi,ebx
++	mov	esi,edx
++	add	ecx,DWORD[28+rsp]
++	pslld	xmm10,2
++	pxor	xmm5,xmm8
++	xor	ebp,eax
++	movdqa	xmm8,XMMWORD[((-32))+r11]
++	rol	edx,5
++	add	ecx,edi
++	and	esi,ebp
++	pxor	xmm5,xmm10
++	xor	ebp,eax
++	add	ecx,edx
++	ror	edx,7
++	pshufd	xmm6,xmm2,238
++	xor	esi,eax
++	movdqa	xmm10,xmm5
++	paddd	xmm8,xmm5
++	mov	edi,ecx
++	add	ebx,DWORD[32+rsp]
++	punpcklqdq	xmm6,xmm3
++	xor	edx,ebp
++	rol	ecx,5
++	add	ebx,esi
++	psrldq	xmm10,4
++	and	edi,edx
++	xor	edx,ebp
++	pxor	xmm6,xmm2
++	add	ebx,ecx
++	ror	ecx,7
++	pxor	xmm10,xmm4
++	xor	edi,ebp
++	mov	esi,ebx
++	add	eax,DWORD[36+rsp]
++	pxor	xmm6,xmm10
++	xor	ecx,edx
++	rol	ebx,5
++	movdqa	XMMWORD[16+rsp],xmm8
++	add	eax,edi
++	and	esi,ecx
++	movdqa	xmm9,xmm6
++	xor	ecx,edx
++	add	eax,ebx
++	ror	ebx,7
++	movdqa	xmm10,xmm6
++	xor	esi,edx
++	pslldq	xmm9,12
++	paddd	xmm6,xmm6
++	mov	edi,eax
++	add	ebp,DWORD[40+rsp]
++	psrld	xmm10,31
++	xor	ebx,ecx
++	rol	eax,5
++	add	ebp,esi
++	movdqa	xmm8,xmm9
++	and	edi,ebx
++	xor	ebx,ecx
++	psrld	xmm9,30
++	add	ebp,eax
++	ror	eax,7
++	por	xmm6,xmm10
++	xor	edi,ecx
++	mov	esi,ebp
++	add	edx,DWORD[44+rsp]
++	pslld	xmm8,2
++	pxor	xmm6,xmm9
++	xor	eax,ebx
++	movdqa	xmm9,XMMWORD[((-32))+r11]
++	rol	ebp,5
++	add	edx,edi
++	and	esi,eax
++	pxor	xmm6,xmm8
++	xor	eax,ebx
++	add	edx,ebp
++	ror	ebp,7
++	pshufd	xmm7,xmm3,238
++	xor	esi,ebx
++	movdqa	xmm8,xmm6
++	paddd	xmm9,xmm6
++	mov	edi,edx
++	add	ecx,DWORD[48+rsp]
++	punpcklqdq	xmm7,xmm4
++	xor	ebp,eax
++	rol	edx,5
++	add	ecx,esi
++	psrldq	xmm8,4
++	and	edi,ebp
++	xor	ebp,eax
++	pxor	xmm7,xmm3
++	add	ecx,edx
++	ror	edx,7
++	pxor	xmm8,xmm5
++	xor	edi,eax
++	mov	esi,ecx
++	add	ebx,DWORD[52+rsp]
++	pxor	xmm7,xmm8
++	xor	edx,ebp
++	rol	ecx,5
++	movdqa	XMMWORD[32+rsp],xmm9
++	add	ebx,edi
++	and	esi,edx
++	movdqa	xmm10,xmm7
++	xor	edx,ebp
++	add	ebx,ecx
++	ror	ecx,7
++	movdqa	xmm8,xmm7
++	xor	esi,ebp
++	pslldq	xmm10,12
++	paddd	xmm7,xmm7
++	mov	edi,ebx
++	add	eax,DWORD[56+rsp]
++	psrld	xmm8,31
++	xor	ecx,edx
++	rol	ebx,5
++	add	eax,esi
++	movdqa	xmm9,xmm10
++	and	edi,ecx
++	xor	ecx,edx
++	psrld	xmm10,30
++	add	eax,ebx
++	ror	ebx,7
++	por	xmm7,xmm8
++	xor	edi,edx
++	mov	esi,eax
++	add	ebp,DWORD[60+rsp]
++	pslld	xmm9,2
++	pxor	xmm7,xmm10
++	xor	ebx,ecx
++	movdqa	xmm10,XMMWORD[((-32))+r11]
++	rol	eax,5
++	add	ebp,edi
++	and	esi,ebx
++	pxor	xmm7,xmm9
++	pshufd	xmm9,xmm6,238
++	xor	ebx,ecx
++	add	ebp,eax
++	ror	eax,7
++	pxor	xmm0,xmm4
++	xor	esi,ecx
++	mov	edi,ebp
++	add	edx,DWORD[rsp]
++	punpcklqdq	xmm9,xmm7
++	xor	eax,ebx
++	rol	ebp,5
++	pxor	xmm0,xmm1
++	add	edx,esi
++	and	edi,eax
++	movdqa	xmm8,xmm10
++	xor	eax,ebx
++	paddd	xmm10,xmm7
++	add	edx,ebp
++	pxor	xmm0,xmm9
++	ror	ebp,7
++	xor	edi,ebx
++	mov	esi,edx
++	add	ecx,DWORD[4+rsp]
++	movdqa	xmm9,xmm0
++	xor	ebp,eax
++	rol	edx,5
++	movdqa	XMMWORD[48+rsp],xmm10
++	add	ecx,edi
++	and	esi,ebp
++	xor	ebp,eax
++	pslld	xmm0,2
++	add	ecx,edx
++	ror	edx,7
++	psrld	xmm9,30
++	xor	esi,eax
++	mov	edi,ecx
++	add	ebx,DWORD[8+rsp]
++	por	xmm0,xmm9
++	xor	edx,ebp
++	rol	ecx,5
++	pshufd	xmm10,xmm7,238
++	add	ebx,esi
++	and	edi,edx
++	xor	edx,ebp
++	add	ebx,ecx
++	add	eax,DWORD[12+rsp]
++	xor	edi,ebp
++	mov	esi,ebx
++	rol	ebx,5
++	add	eax,edi
++	xor	esi,edx
++	ror	ecx,7
++	add	eax,ebx
++	pxor	xmm1,xmm5
++	add	ebp,DWORD[16+rsp]
++	xor	esi,ecx
++	punpcklqdq	xmm10,xmm0
++	mov	edi,eax
++	rol	eax,5
++	pxor	xmm1,xmm2
++	add	ebp,esi
++	xor	edi,ecx
++	movdqa	xmm9,xmm8
++	ror	ebx,7
++	paddd	xmm8,xmm0
++	add	ebp,eax
++	pxor	xmm1,xmm10
++	add	edx,DWORD[20+rsp]
++	xor	edi,ebx
++	mov	esi,ebp
++	rol	ebp,5
++	movdqa	xmm10,xmm1
++	add	edx,edi
++	xor	esi,ebx
++	movdqa	XMMWORD[rsp],xmm8
++	ror	eax,7
++	add	edx,ebp
++	add	ecx,DWORD[24+rsp]
++	pslld	xmm1,2
++	xor	esi,eax
++	mov	edi,edx
++	psrld	xmm10,30
++	rol	edx,5
++	add	ecx,esi
++	xor	edi,eax
++	ror	ebp,7
++	por	xmm1,xmm10
++	add	ecx,edx
++	add	ebx,DWORD[28+rsp]
++	pshufd	xmm8,xmm0,238
++	xor	edi,ebp
++	mov	esi,ecx
++	rol	ecx,5
++	add	ebx,edi
++	xor	esi,ebp
++	ror	edx,7
++	add	ebx,ecx
++	pxor	xmm2,xmm6
++	add	eax,DWORD[32+rsp]
++	xor	esi,edx
++	punpcklqdq	xmm8,xmm1
++	mov	edi,ebx
++	rol	ebx,5
++	pxor	xmm2,xmm3
++	add	eax,esi
++	xor	edi,edx
++	movdqa	xmm10,XMMWORD[r11]
++	ror	ecx,7
++	paddd	xmm9,xmm1
++	add	eax,ebx
++	pxor	xmm2,xmm8
++	add	ebp,DWORD[36+rsp]
++	xor	edi,ecx
++	mov	esi,eax
++	rol	eax,5
++	movdqa	xmm8,xmm2
++	add	ebp,edi
++	xor	esi,ecx
++	movdqa	XMMWORD[16+rsp],xmm9
++	ror	ebx,7
++	add	ebp,eax
++	add	edx,DWORD[40+rsp]
++	pslld	xmm2,2
++	xor	esi,ebx
++	mov	edi,ebp
++	psrld	xmm8,30
++	rol	ebp,5
++	add	edx,esi
++	xor	edi,ebx
++	ror	eax,7
++	por	xmm2,xmm8
++	add	edx,ebp
++	add	ecx,DWORD[44+rsp]
++	pshufd	xmm9,xmm1,238
++	xor	edi,eax
++	mov	esi,edx
++	rol	edx,5
++	add	ecx,edi
++	xor	esi,eax
++	ror	ebp,7
++	add	ecx,edx
++	pxor	xmm3,xmm7
++	add	ebx,DWORD[48+rsp]
++	xor	esi,ebp
++	punpcklqdq	xmm9,xmm2
++	mov	edi,ecx
++	rol	ecx,5
++	pxor	xmm3,xmm4
++	add	ebx,esi
++	xor	edi,ebp
++	movdqa	xmm8,xmm10
++	ror	edx,7
++	paddd	xmm10,xmm2
++	add	ebx,ecx
++	pxor	xmm3,xmm9
++	add	eax,DWORD[52+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	rol	ebx,5
++	movdqa	xmm9,xmm3
++	add	eax,edi
++	xor	esi,edx
++	movdqa	XMMWORD[32+rsp],xmm10
++	ror	ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[56+rsp]
++	pslld	xmm3,2
++	xor	esi,ecx
++	mov	edi,eax
++	psrld	xmm9,30
++	rol	eax,5
++	add	ebp,esi
++	xor	edi,ecx
++	ror	ebx,7
++	por	xmm3,xmm9
++	add	ebp,eax
++	add	edx,DWORD[60+rsp]
++	pshufd	xmm10,xmm2,238
++	xor	edi,ebx
++	mov	esi,ebp
++	rol	ebp,5
++	add	edx,edi
++	xor	esi,ebx
++	ror	eax,7
++	add	edx,ebp
++	pxor	xmm4,xmm0
++	add	ecx,DWORD[rsp]
++	xor	esi,eax
++	punpcklqdq	xmm10,xmm3
++	mov	edi,edx
++	rol	edx,5
++	pxor	xmm4,xmm5
++	add	ecx,esi
++	xor	edi,eax
++	movdqa	xmm9,xmm8
++	ror	ebp,7
++	paddd	xmm8,xmm3
++	add	ecx,edx
++	pxor	xmm4,xmm10
++	add	ebx,DWORD[4+rsp]
++	xor	edi,ebp
++	mov	esi,ecx
++	rol	ecx,5
++	movdqa	xmm10,xmm4
++	add	ebx,edi
++	xor	esi,ebp
++	movdqa	XMMWORD[48+rsp],xmm8
++	ror	edx,7
++	add	ebx,ecx
++	add	eax,DWORD[8+rsp]
++	pslld	xmm4,2
++	xor	esi,edx
++	mov	edi,ebx
++	psrld	xmm10,30
++	rol	ebx,5
++	add	eax,esi
++	xor	edi,edx
++	ror	ecx,7
++	por	xmm4,xmm10
++	add	eax,ebx
++	add	ebp,DWORD[12+rsp]
++	pshufd	xmm8,xmm3,238
++	xor	edi,ecx
++	mov	esi,eax
++	rol	eax,5
++	add	ebp,edi
++	xor	esi,ecx
++	ror	ebx,7
++	add	ebp,eax
++	pxor	xmm5,xmm1
++	add	edx,DWORD[16+rsp]
++	xor	esi,ebx
++	punpcklqdq	xmm8,xmm4
++	mov	edi,ebp
++	rol	ebp,5
++	pxor	xmm5,xmm6
++	add	edx,esi
++	xor	edi,ebx
++	movdqa	xmm10,xmm9
++	ror	eax,7
++	paddd	xmm9,xmm4
++	add	edx,ebp
++	pxor	xmm5,xmm8
++	add	ecx,DWORD[20+rsp]
++	xor	edi,eax
++	mov	esi,edx
++	rol	edx,5
++	movdqa	xmm8,xmm5
++	add	ecx,edi
++	xor	esi,eax
++	movdqa	XMMWORD[rsp],xmm9
++	ror	ebp,7
++	add	ecx,edx
++	add	ebx,DWORD[24+rsp]
++	pslld	xmm5,2
++	xor	esi,ebp
++	mov	edi,ecx
++	psrld	xmm8,30
++	rol	ecx,5
++	add	ebx,esi
++	xor	edi,ebp
++	ror	edx,7
++	por	xmm5,xmm8
++	add	ebx,ecx
++	add	eax,DWORD[28+rsp]
++	pshufd	xmm9,xmm4,238
++	ror	ecx,7
++	mov	esi,ebx
++	xor	edi,edx
++	rol	ebx,5
++	add	eax,edi
++	xor	esi,ecx
++	xor	ecx,edx
++	add	eax,ebx
++	pxor	xmm6,xmm2
++	add	ebp,DWORD[32+rsp]
++	and	esi,ecx
++	xor	ecx,edx
++	ror	ebx,7
++	punpcklqdq	xmm9,xmm5
++	mov	edi,eax
++	xor	esi,ecx
++	pxor	xmm6,xmm7
++	rol	eax,5
++	add	ebp,esi
++	movdqa	xmm8,xmm10
++	xor	edi,ebx
++	paddd	xmm10,xmm5
++	xor	ebx,ecx
++	pxor	xmm6,xmm9
++	add	ebp,eax
++	add	edx,DWORD[36+rsp]
++	and	edi,ebx
++	xor	ebx,ecx
++	ror	eax,7
++	movdqa	xmm9,xmm6
++	mov	esi,ebp
++	xor	edi,ebx
++	movdqa	XMMWORD[16+rsp],xmm10
++	rol	ebp,5
++	add	edx,edi
++	xor	esi,eax
++	pslld	xmm6,2
++	xor	eax,ebx
++	add	edx,ebp
++	psrld	xmm9,30
++	add	ecx,DWORD[40+rsp]
++	and	esi,eax
++	xor	eax,ebx
++	por	xmm6,xmm9
++	ror	ebp,7
++	mov	edi,edx
++	xor	esi,eax
++	rol	edx,5
++	pshufd	xmm10,xmm5,238
++	add	ecx,esi
++	xor	edi,ebp
++	xor	ebp,eax
++	add	ecx,edx
++	add	ebx,DWORD[44+rsp]
++	and	edi,ebp
++	xor	ebp,eax
++	ror	edx,7
++	mov	esi,ecx
++	xor	edi,ebp
++	rol	ecx,5
++	add	ebx,edi
++	xor	esi,edx
++	xor	edx,ebp
++	add	ebx,ecx
++	pxor	xmm7,xmm3
++	add	eax,DWORD[48+rsp]
++	and	esi,edx
++	xor	edx,ebp
++	ror	ecx,7
++	punpcklqdq	xmm10,xmm6
++	mov	edi,ebx
++	xor	esi,edx
++	pxor	xmm7,xmm0
++	rol	ebx,5
++	add	eax,esi
++	movdqa	xmm9,XMMWORD[32+r11]
++	xor	edi,ecx
++	paddd	xmm8,xmm6
++	xor	ecx,edx
++	pxor	xmm7,xmm10
++	add	eax,ebx
++	add	ebp,DWORD[52+rsp]
++	and	edi,ecx
++	xor	ecx,edx
++	ror	ebx,7
++	movdqa	xmm10,xmm7
++	mov	esi,eax
++	xor	edi,ecx
++	movdqa	XMMWORD[32+rsp],xmm8
++	rol	eax,5
++	add	ebp,edi
++	xor	esi,ebx
++	pslld	xmm7,2
++	xor	ebx,ecx
++	add	ebp,eax
++	psrld	xmm10,30
++	add	edx,DWORD[56+rsp]
++	and	esi,ebx
++	xor	ebx,ecx
++	por	xmm7,xmm10
++	ror	eax,7
++	mov	edi,ebp
++	xor	esi,ebx
++	rol	ebp,5
++	pshufd	xmm8,xmm6,238
++	add	edx,esi
++	xor	edi,eax
++	xor	eax,ebx
++	add	edx,ebp
++	add	ecx,DWORD[60+rsp]
++	and	edi,eax
++	xor	eax,ebx
++	ror	ebp,7
++	mov	esi,edx
++	xor	edi,eax
++	rol	edx,5
++	add	ecx,edi
++	xor	esi,ebp
++	xor	ebp,eax
++	add	ecx,edx
++	pxor	xmm0,xmm4
++	add	ebx,DWORD[rsp]
++	and	esi,ebp
++	xor	ebp,eax
++	ror	edx,7
++	punpcklqdq	xmm8,xmm7
++	mov	edi,ecx
++	xor	esi,ebp
++	pxor	xmm0,xmm1
++	rol	ecx,5
++	add	ebx,esi
++	movdqa	xmm10,xmm9
++	xor	edi,edx
++	paddd	xmm9,xmm7
++	xor	edx,ebp
++	pxor	xmm0,xmm8
++	add	ebx,ecx
++	add	eax,DWORD[4+rsp]
++	and	edi,edx
++	xor	edx,ebp
++	ror	ecx,7
++	movdqa	xmm8,xmm0
++	mov	esi,ebx
++	xor	edi,edx
++	movdqa	XMMWORD[48+rsp],xmm9
++	rol	ebx,5
++	add	eax,edi
++	xor	esi,ecx
++	pslld	xmm0,2
++	xor	ecx,edx
++	add	eax,ebx
++	psrld	xmm8,30
++	add	ebp,DWORD[8+rsp]
++	and	esi,ecx
++	xor	ecx,edx
++	por	xmm0,xmm8
++	ror	ebx,7
++	mov	edi,eax
++	xor	esi,ecx
++	rol	eax,5
++	pshufd	xmm9,xmm7,238
++	add	ebp,esi
++	xor	edi,ebx
++	xor	ebx,ecx
++	add	ebp,eax
++	add	edx,DWORD[12+rsp]
++	and	edi,ebx
++	xor	ebx,ecx
++	ror	eax,7
++	mov	esi,ebp
++	xor	edi,ebx
++	rol	ebp,5
++	add	edx,edi
++	xor	esi,eax
++	xor	eax,ebx
++	add	edx,ebp
++	pxor	xmm1,xmm5
++	add	ecx,DWORD[16+rsp]
++	and	esi,eax
++	xor	eax,ebx
++	ror	ebp,7
++	punpcklqdq	xmm9,xmm0
++	mov	edi,edx
++	xor	esi,eax
++	pxor	xmm1,xmm2
++	rol	edx,5
++	add	ecx,esi
++	movdqa	xmm8,xmm10
++	xor	edi,ebp
++	paddd	xmm10,xmm0
++	xor	ebp,eax
++	pxor	xmm1,xmm9
++	add	ecx,edx
++	add	ebx,DWORD[20+rsp]
++	and	edi,ebp
++	xor	ebp,eax
++	ror	edx,7
++	movdqa	xmm9,xmm1
++	mov	esi,ecx
++	xor	edi,ebp
++	movdqa	XMMWORD[rsp],xmm10
++	rol	ecx,5
++	add	ebx,edi
++	xor	esi,edx
++	pslld	xmm1,2
++	xor	edx,ebp
++	add	ebx,ecx
++	psrld	xmm9,30
++	add	eax,DWORD[24+rsp]
++	and	esi,edx
++	xor	edx,ebp
++	por	xmm1,xmm9
++	ror	ecx,7
++	mov	edi,ebx
++	xor	esi,edx
++	rol	ebx,5
++	pshufd	xmm10,xmm0,238
++	add	eax,esi
++	xor	edi,ecx
++	xor	ecx,edx
++	add	eax,ebx
++	add	ebp,DWORD[28+rsp]
++	and	edi,ecx
++	xor	ecx,edx
++	ror	ebx,7
++	mov	esi,eax
++	xor	edi,ecx
++	rol	eax,5
++	add	ebp,edi
++	xor	esi,ebx
++	xor	ebx,ecx
++	add	ebp,eax
++	pxor	xmm2,xmm6
++	add	edx,DWORD[32+rsp]
++	and	esi,ebx
++	xor	ebx,ecx
++	ror	eax,7
++	punpcklqdq	xmm10,xmm1
++	mov	edi,ebp
++	xor	esi,ebx
++	pxor	xmm2,xmm3
++	rol	ebp,5
++	add	edx,esi
++	movdqa	xmm9,xmm8
++	xor	edi,eax
++	paddd	xmm8,xmm1
++	xor	eax,ebx
++	pxor	xmm2,xmm10
++	add	edx,ebp
++	add	ecx,DWORD[36+rsp]
++	and	edi,eax
++	xor	eax,ebx
++	ror	ebp,7
++	movdqa	xmm10,xmm2
++	mov	esi,edx
++	xor	edi,eax
++	movdqa	XMMWORD[16+rsp],xmm8
++	rol	edx,5
++	add	ecx,edi
++	xor	esi,ebp
++	pslld	xmm2,2
++	xor	ebp,eax
++	add	ecx,edx
++	psrld	xmm10,30
++	add	ebx,DWORD[40+rsp]
++	and	esi,ebp
++	xor	ebp,eax
++	por	xmm2,xmm10
++	ror	edx,7
++	mov	edi,ecx
++	xor	esi,ebp
++	rol	ecx,5
++	pshufd	xmm8,xmm1,238
++	add	ebx,esi
++	xor	edi,edx
++	xor	edx,ebp
++	add	ebx,ecx
++	add	eax,DWORD[44+rsp]
++	and	edi,edx
++	xor	edx,ebp
++	ror	ecx,7
++	mov	esi,ebx
++	xor	edi,edx
++	rol	ebx,5
++	add	eax,edi
++	xor	esi,edx
++	add	eax,ebx
++	pxor	xmm3,xmm7
++	add	ebp,DWORD[48+rsp]
++	xor	esi,ecx
++	punpcklqdq	xmm8,xmm2
++	mov	edi,eax
++	rol	eax,5
++	pxor	xmm3,xmm4
++	add	ebp,esi
++	xor	edi,ecx
++	movdqa	xmm10,xmm9
++	ror	ebx,7
++	paddd	xmm9,xmm2
++	add	ebp,eax
++	pxor	xmm3,xmm8
++	add	edx,DWORD[52+rsp]
++	xor	edi,ebx
++	mov	esi,ebp
++	rol	ebp,5
++	movdqa	xmm8,xmm3
++	add	edx,edi
++	xor	esi,ebx
++	movdqa	XMMWORD[32+rsp],xmm9
++	ror	eax,7
++	add	edx,ebp
++	add	ecx,DWORD[56+rsp]
++	pslld	xmm3,2
++	xor	esi,eax
++	mov	edi,edx
++	psrld	xmm8,30
++	rol	edx,5
++	add	ecx,esi
++	xor	edi,eax
++	ror	ebp,7
++	por	xmm3,xmm8
++	add	ecx,edx
++	add	ebx,DWORD[60+rsp]
++	xor	edi,ebp
++	mov	esi,ecx
++	rol	ecx,5
++	add	ebx,edi
++	xor	esi,ebp
++	ror	edx,7
++	add	ebx,ecx
++	add	eax,DWORD[rsp]
++	xor	esi,edx
++	mov	edi,ebx
++	rol	ebx,5
++	paddd	xmm10,xmm3
++	add	eax,esi
++	xor	edi,edx
++	movdqa	XMMWORD[48+rsp],xmm10
++	ror	ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[4+rsp]
++	xor	edi,ecx
++	mov	esi,eax
++	rol	eax,5
++	add	ebp,edi
++	xor	esi,ecx
++	ror	ebx,7
++	add	ebp,eax
++	add	edx,DWORD[8+rsp]
++	xor	esi,ebx
++	mov	edi,ebp
++	rol	ebp,5
++	add	edx,esi
++	xor	edi,ebx
++	ror	eax,7
++	add	edx,ebp
++	add	ecx,DWORD[12+rsp]
++	xor	edi,eax
++	mov	esi,edx
++	rol	edx,5
++	add	ecx,edi
++	xor	esi,eax
++	ror	ebp,7
++	add	ecx,edx
++	cmp	r9,r10
++	je	NEAR $L$done_ssse3
++	movdqa	xmm6,XMMWORD[64+r11]
++	movdqa	xmm9,XMMWORD[((-64))+r11]
++	movdqu	xmm0,XMMWORD[r9]
++	movdqu	xmm1,XMMWORD[16+r9]
++	movdqu	xmm2,XMMWORD[32+r9]
++	movdqu	xmm3,XMMWORD[48+r9]
++DB	102,15,56,0,198
++	add	r9,64
++	add	ebx,DWORD[16+rsp]
++	xor	esi,ebp
++	mov	edi,ecx
++DB	102,15,56,0,206
++	rol	ecx,5
++	add	ebx,esi
++	xor	edi,ebp
++	ror	edx,7
++	paddd	xmm0,xmm9
++	add	ebx,ecx
++	add	eax,DWORD[20+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	movdqa	XMMWORD[rsp],xmm0
++	rol	ebx,5
++	add	eax,edi
++	xor	esi,edx
++	ror	ecx,7
++	psubd	xmm0,xmm9
++	add	eax,ebx
++	add	ebp,DWORD[24+rsp]
++	xor	esi,ecx
++	mov	edi,eax
++	rol	eax,5
++	add	ebp,esi
++	xor	edi,ecx
++	ror	ebx,7
++	add	ebp,eax
++	add	edx,DWORD[28+rsp]
++	xor	edi,ebx
++	mov	esi,ebp
++	rol	ebp,5
++	add	edx,edi
++	xor	esi,ebx
++	ror	eax,7
++	add	edx,ebp
++	add	ecx,DWORD[32+rsp]
++	xor	esi,eax
++	mov	edi,edx
++DB	102,15,56,0,214
++	rol	edx,5
++	add	ecx,esi
++	xor	edi,eax
++	ror	ebp,7
++	paddd	xmm1,xmm9
++	add	ecx,edx
++	add	ebx,DWORD[36+rsp]
++	xor	edi,ebp
++	mov	esi,ecx
++	movdqa	XMMWORD[16+rsp],xmm1
++	rol	ecx,5
++	add	ebx,edi
++	xor	esi,ebp
++	ror	edx,7
++	psubd	xmm1,xmm9
++	add	ebx,ecx
++	add	eax,DWORD[40+rsp]
++	xor	esi,edx
++	mov	edi,ebx
++	rol	ebx,5
++	add	eax,esi
++	xor	edi,edx
++	ror	ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[44+rsp]
++	xor	edi,ecx
++	mov	esi,eax
++	rol	eax,5
++	add	ebp,edi
++	xor	esi,ecx
++	ror	ebx,7
++	add	ebp,eax
++	add	edx,DWORD[48+rsp]
++	xor	esi,ebx
++	mov	edi,ebp
++DB	102,15,56,0,222
++	rol	ebp,5
++	add	edx,esi
++	xor	edi,ebx
++	ror	eax,7
++	paddd	xmm2,xmm9
++	add	edx,ebp
++	add	ecx,DWORD[52+rsp]
++	xor	edi,eax
++	mov	esi,edx
++	movdqa	XMMWORD[32+rsp],xmm2
++	rol	edx,5
++	add	ecx,edi
++	xor	esi,eax
++	ror	ebp,7
++	psubd	xmm2,xmm9
++	add	ecx,edx
++	add	ebx,DWORD[56+rsp]
++	xor	esi,ebp
++	mov	edi,ecx
++	rol	ecx,5
++	add	ebx,esi
++	xor	edi,ebp
++	ror	edx,7
++	add	ebx,ecx
++	add	eax,DWORD[60+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	rol	ebx,5
++	add	eax,edi
++	ror	ecx,7
++	add	eax,ebx
++	add	eax,DWORD[r8]
++	add	esi,DWORD[4+r8]
++	add	ecx,DWORD[8+r8]
++	add	edx,DWORD[12+r8]
++	mov	DWORD[r8],eax
++	add	ebp,DWORD[16+r8]
++	mov	DWORD[4+r8],esi
++	mov	ebx,esi
++	mov	DWORD[8+r8],ecx
++	mov	edi,ecx
++	mov	DWORD[12+r8],edx
++	xor	edi,edx
++	mov	DWORD[16+r8],ebp
++	and	esi,edi
++	jmp	NEAR $L$oop_ssse3
++
++ALIGN	16
++$L$done_ssse3:
++	add	ebx,DWORD[16+rsp]
++	xor	esi,ebp
++	mov	edi,ecx
++	rol	ecx,5
++	add	ebx,esi
++	xor	edi,ebp
++	ror	edx,7
++	add	ebx,ecx
++	add	eax,DWORD[20+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	rol	ebx,5
++	add	eax,edi
++	xor	esi,edx
++	ror	ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[24+rsp]
++	xor	esi,ecx
++	mov	edi,eax
++	rol	eax,5
++	add	ebp,esi
++	xor	edi,ecx
++	ror	ebx,7
++	add	ebp,eax
++	add	edx,DWORD[28+rsp]
++	xor	edi,ebx
++	mov	esi,ebp
++	rol	ebp,5
++	add	edx,edi
++	xor	esi,ebx
++	ror	eax,7
++	add	edx,ebp
++	add	ecx,DWORD[32+rsp]
++	xor	esi,eax
++	mov	edi,edx
++	rol	edx,5
++	add	ecx,esi
++	xor	edi,eax
++	ror	ebp,7
++	add	ecx,edx
++	add	ebx,DWORD[36+rsp]
++	xor	edi,ebp
++	mov	esi,ecx
++	rol	ecx,5
++	add	ebx,edi
++	xor	esi,ebp
++	ror	edx,7
++	add	ebx,ecx
++	add	eax,DWORD[40+rsp]
++	xor	esi,edx
++	mov	edi,ebx
++	rol	ebx,5
++	add	eax,esi
++	xor	edi,edx
++	ror	ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[44+rsp]
++	xor	edi,ecx
++	mov	esi,eax
++	rol	eax,5
++	add	ebp,edi
++	xor	esi,ecx
++	ror	ebx,7
++	add	ebp,eax
++	add	edx,DWORD[48+rsp]
++	xor	esi,ebx
++	mov	edi,ebp
++	rol	ebp,5
++	add	edx,esi
++	xor	edi,ebx
++	ror	eax,7
++	add	edx,ebp
++	add	ecx,DWORD[52+rsp]
++	xor	edi,eax
++	mov	esi,edx
++	rol	edx,5
++	add	ecx,edi
++	xor	esi,eax
++	ror	ebp,7
++	add	ecx,edx
++	add	ebx,DWORD[56+rsp]
++	xor	esi,ebp
++	mov	edi,ecx
++	rol	ecx,5
++	add	ebx,esi
++	xor	edi,ebp
++	ror	edx,7
++	add	ebx,ecx
++	add	eax,DWORD[60+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	rol	ebx,5
++	add	eax,edi
++	ror	ecx,7
++	add	eax,ebx
++	add	eax,DWORD[r8]
++	add	esi,DWORD[4+r8]
++	add	ecx,DWORD[8+r8]
++	mov	DWORD[r8],eax
++	add	edx,DWORD[12+r8]
++	mov	DWORD[4+r8],esi
++	add	ebp,DWORD[16+r8]
++	mov	DWORD[8+r8],ecx
++	mov	DWORD[12+r8],edx
++	mov	DWORD[16+r8],ebp
++	movaps	xmm6,XMMWORD[((-40-96))+r14]
++	movaps	xmm7,XMMWORD[((-40-80))+r14]
++	movaps	xmm8,XMMWORD[((-40-64))+r14]
++	movaps	xmm9,XMMWORD[((-40-48))+r14]
++	movaps	xmm10,XMMWORD[((-40-32))+r14]
++	movaps	xmm11,XMMWORD[((-40-16))+r14]
++	lea	rsi,[r14]
++	mov	r14,QWORD[((-40))+rsi]
++	mov	r13,QWORD[((-32))+rsi]
++	mov	r12,QWORD[((-24))+rsi]
++	mov	rbp,QWORD[((-16))+rsi]
++	mov	rbx,QWORD[((-8))+rsi]
++	lea	rsp,[rsi]
++$L$epilogue_ssse3:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha1_block_data_order_ssse3:
++
++ALIGN	16
++sha1_block_data_order_avx:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha1_block_data_order_avx:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++_avx_shortcut:
++	mov	rax,rsp
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	lea	rsp,[((-160))+rsp]
++	vzeroupper
++	vmovaps	XMMWORD[(-40-96)+rax],xmm6
++	vmovaps	XMMWORD[(-40-80)+rax],xmm7
++	vmovaps	XMMWORD[(-40-64)+rax],xmm8
++	vmovaps	XMMWORD[(-40-48)+rax],xmm9
++	vmovaps	XMMWORD[(-40-32)+rax],xmm10
++	vmovaps	XMMWORD[(-40-16)+rax],xmm11
++$L$prologue_avx:
++	mov	r14,rax
++	and	rsp,-64
++	mov	r8,rdi
++	mov	r9,rsi
++	mov	r10,rdx
++
++	shl	r10,6
++	add	r10,r9
++	lea	r11,[((K_XX_XX+64))]
++
++	mov	eax,DWORD[r8]
++	mov	ebx,DWORD[4+r8]
++	mov	ecx,DWORD[8+r8]
++	mov	edx,DWORD[12+r8]
++	mov	esi,ebx
++	mov	ebp,DWORD[16+r8]
++	mov	edi,ecx
++	xor	edi,edx
++	and	esi,edi
++
++	vmovdqa	xmm6,XMMWORD[64+r11]
++	vmovdqa	xmm11,XMMWORD[((-64))+r11]
++	vmovdqu	xmm0,XMMWORD[r9]
++	vmovdqu	xmm1,XMMWORD[16+r9]
++	vmovdqu	xmm2,XMMWORD[32+r9]
++	vmovdqu	xmm3,XMMWORD[48+r9]
++	vpshufb	xmm0,xmm0,xmm6
++	add	r9,64
++	vpshufb	xmm1,xmm1,xmm6
++	vpshufb	xmm2,xmm2,xmm6
++	vpshufb	xmm3,xmm3,xmm6
++	vpaddd	xmm4,xmm0,xmm11
++	vpaddd	xmm5,xmm1,xmm11
++	vpaddd	xmm6,xmm2,xmm11
++	vmovdqa	XMMWORD[rsp],xmm4
++	vmovdqa	XMMWORD[16+rsp],xmm5
++	vmovdqa	XMMWORD[32+rsp],xmm6
++	jmp	NEAR $L$oop_avx
++ALIGN	16
++$L$oop_avx:
++	shrd	ebx,ebx,2
++	xor	esi,edx
++	vpalignr	xmm4,xmm1,xmm0,8
++	mov	edi,eax
++	add	ebp,DWORD[rsp]
++	vpaddd	xmm9,xmm11,xmm3
++	xor	ebx,ecx
++	shld	eax,eax,5
++	vpsrldq	xmm8,xmm3,4
++	add	ebp,esi
++	and	edi,ebx
++	vpxor	xmm4,xmm4,xmm0
++	xor	ebx,ecx
++	add	ebp,eax
++	vpxor	xmm8,xmm8,xmm2
++	shrd	eax,eax,7
++	xor	edi,ecx
++	mov	esi,ebp
++	add	edx,DWORD[4+rsp]
++	vpxor	xmm4,xmm4,xmm8
++	xor	eax,ebx
++	shld	ebp,ebp,5
++	vmovdqa	XMMWORD[48+rsp],xmm9
++	add	edx,edi
++	and	esi,eax
++	vpsrld	xmm8,xmm4,31
++	xor	eax,ebx
++	add	edx,ebp
++	shrd	ebp,ebp,7
++	xor	esi,ebx
++	vpslldq	xmm10,xmm4,12
++	vpaddd	xmm4,xmm4,xmm4
++	mov	edi,edx
++	add	ecx,DWORD[8+rsp]
++	xor	ebp,eax
++	shld	edx,edx,5
++	vpsrld	xmm9,xmm10,30
++	vpor	xmm4,xmm4,xmm8
++	add	ecx,esi
++	and	edi,ebp
++	xor	ebp,eax
++	add	ecx,edx
++	vpslld	xmm10,xmm10,2
++	vpxor	xmm4,xmm4,xmm9
++	shrd	edx,edx,7
++	xor	edi,eax
++	mov	esi,ecx
++	add	ebx,DWORD[12+rsp]
++	vpxor	xmm4,xmm4,xmm10
++	xor	edx,ebp
++	shld	ecx,ecx,5
++	add	ebx,edi
++	and	esi,edx
++	xor	edx,ebp
++	add	ebx,ecx
++	shrd	ecx,ecx,7
++	xor	esi,ebp
++	vpalignr	xmm5,xmm2,xmm1,8
++	mov	edi,ebx
++	add	eax,DWORD[16+rsp]
++	vpaddd	xmm9,xmm11,xmm4
++	xor	ecx,edx
++	shld	ebx,ebx,5
++	vpsrldq	xmm8,xmm4,4
++	add	eax,esi
++	and	edi,ecx
++	vpxor	xmm5,xmm5,xmm1
++	xor	ecx,edx
++	add	eax,ebx
++	vpxor	xmm8,xmm8,xmm3
++	shrd	ebx,ebx,7
++	xor	edi,edx
++	mov	esi,eax
++	add	ebp,DWORD[20+rsp]
++	vpxor	xmm5,xmm5,xmm8
++	xor	ebx,ecx
++	shld	eax,eax,5
++	vmovdqa	XMMWORD[rsp],xmm9
++	add	ebp,edi
++	and	esi,ebx
++	vpsrld	xmm8,xmm5,31
++	xor	ebx,ecx
++	add	ebp,eax
++	shrd	eax,eax,7
++	xor	esi,ecx
++	vpslldq	xmm10,xmm5,12
++	vpaddd	xmm5,xmm5,xmm5
++	mov	edi,ebp
++	add	edx,DWORD[24+rsp]
++	xor	eax,ebx
++	shld	ebp,ebp,5
++	vpsrld	xmm9,xmm10,30
++	vpor	xmm5,xmm5,xmm8
++	add	edx,esi
++	and	edi,eax
++	xor	eax,ebx
++	add	edx,ebp
++	vpslld	xmm10,xmm10,2
++	vpxor	xmm5,xmm5,xmm9
++	shrd	ebp,ebp,7
++	xor	edi,ebx
++	mov	esi,edx
++	add	ecx,DWORD[28+rsp]
++	vpxor	xmm5,xmm5,xmm10
++	xor	ebp,eax
++	shld	edx,edx,5
++	vmovdqa	xmm11,XMMWORD[((-32))+r11]
++	add	ecx,edi
++	and	esi,ebp
++	xor	ebp,eax
++	add	ecx,edx
++	shrd	edx,edx,7
++	xor	esi,eax
++	vpalignr	xmm6,xmm3,xmm2,8
++	mov	edi,ecx
++	add	ebx,DWORD[32+rsp]
++	vpaddd	xmm9,xmm11,xmm5
++	xor	edx,ebp
++	shld	ecx,ecx,5
++	vpsrldq	xmm8,xmm5,4
++	add	ebx,esi
++	and	edi,edx
++	vpxor	xmm6,xmm6,xmm2
++	xor	edx,ebp
++	add	ebx,ecx
++	vpxor	xmm8,xmm8,xmm4
++	shrd	ecx,ecx,7
++	xor	edi,ebp
++	mov	esi,ebx
++	add	eax,DWORD[36+rsp]
++	vpxor	xmm6,xmm6,xmm8
++	xor	ecx,edx
++	shld	ebx,ebx,5
++	vmovdqa	XMMWORD[16+rsp],xmm9
++	add	eax,edi
++	and	esi,ecx
++	vpsrld	xmm8,xmm6,31
++	xor	ecx,edx
++	add	eax,ebx
++	shrd	ebx,ebx,7
++	xor	esi,edx
++	vpslldq	xmm10,xmm6,12
++	vpaddd	xmm6,xmm6,xmm6
++	mov	edi,eax
++	add	ebp,DWORD[40+rsp]
++	xor	ebx,ecx
++	shld	eax,eax,5
++	vpsrld	xmm9,xmm10,30
++	vpor	xmm6,xmm6,xmm8
++	add	ebp,esi
++	and	edi,ebx
++	xor	ebx,ecx
++	add	ebp,eax
++	vpslld	xmm10,xmm10,2
++	vpxor	xmm6,xmm6,xmm9
++	shrd	eax,eax,7
++	xor	edi,ecx
++	mov	esi,ebp
++	add	edx,DWORD[44+rsp]
++	vpxor	xmm6,xmm6,xmm10
++	xor	eax,ebx
++	shld	ebp,ebp,5
++	add	edx,edi
++	and	esi,eax
++	xor	eax,ebx
++	add	edx,ebp
++	shrd	ebp,ebp,7
++	xor	esi,ebx
++	vpalignr	xmm7,xmm4,xmm3,8
++	mov	edi,edx
++	add	ecx,DWORD[48+rsp]
++	vpaddd	xmm9,xmm11,xmm6
++	xor	ebp,eax
++	shld	edx,edx,5
++	vpsrldq	xmm8,xmm6,4
++	add	ecx,esi
++	and	edi,ebp
++	vpxor	xmm7,xmm7,xmm3
++	xor	ebp,eax
++	add	ecx,edx
++	vpxor	xmm8,xmm8,xmm5
++	shrd	edx,edx,7
++	xor	edi,eax
++	mov	esi,ecx
++	add	ebx,DWORD[52+rsp]
++	vpxor	xmm7,xmm7,xmm8
++	xor	edx,ebp
++	shld	ecx,ecx,5
++	vmovdqa	XMMWORD[32+rsp],xmm9
++	add	ebx,edi
++	and	esi,edx
++	vpsrld	xmm8,xmm7,31
++	xor	edx,ebp
++	add	ebx,ecx
++	shrd	ecx,ecx,7
++	xor	esi,ebp
++	vpslldq	xmm10,xmm7,12
++	vpaddd	xmm7,xmm7,xmm7
++	mov	edi,ebx
++	add	eax,DWORD[56+rsp]
++	xor	ecx,edx
++	shld	ebx,ebx,5
++	vpsrld	xmm9,xmm10,30
++	vpor	xmm7,xmm7,xmm8
++	add	eax,esi
++	and	edi,ecx
++	xor	ecx,edx
++	add	eax,ebx
++	vpslld	xmm10,xmm10,2
++	vpxor	xmm7,xmm7,xmm9
++	shrd	ebx,ebx,7
++	xor	edi,edx
++	mov	esi,eax
++	add	ebp,DWORD[60+rsp]
++	vpxor	xmm7,xmm7,xmm10
++	xor	ebx,ecx
++	shld	eax,eax,5
++	add	ebp,edi
++	and	esi,ebx
++	xor	ebx,ecx
++	add	ebp,eax
++	vpalignr	xmm8,xmm7,xmm6,8
++	vpxor	xmm0,xmm0,xmm4
++	shrd	eax,eax,7
++	xor	esi,ecx
++	mov	edi,ebp
++	add	edx,DWORD[rsp]
++	vpxor	xmm0,xmm0,xmm1
++	xor	eax,ebx
++	shld	ebp,ebp,5
++	vpaddd	xmm9,xmm11,xmm7
++	add	edx,esi
++	and	edi,eax
++	vpxor	xmm0,xmm0,xmm8
++	xor	eax,ebx
++	add	edx,ebp
++	shrd	ebp,ebp,7
++	xor	edi,ebx
++	vpsrld	xmm8,xmm0,30
++	vmovdqa	XMMWORD[48+rsp],xmm9
++	mov	esi,edx
++	add	ecx,DWORD[4+rsp]
++	xor	ebp,eax
++	shld	edx,edx,5
++	vpslld	xmm0,xmm0,2
++	add	ecx,edi
++	and	esi,ebp
++	xor	ebp,eax
++	add	ecx,edx
++	shrd	edx,edx,7
++	xor	esi,eax
++	mov	edi,ecx
++	add	ebx,DWORD[8+rsp]
++	vpor	xmm0,xmm0,xmm8
++	xor	edx,ebp
++	shld	ecx,ecx,5
++	add	ebx,esi
++	and	edi,edx
++	xor	edx,ebp
++	add	ebx,ecx
++	add	eax,DWORD[12+rsp]
++	xor	edi,ebp
++	mov	esi,ebx
++	shld	ebx,ebx,5
++	add	eax,edi
++	xor	esi,edx
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	vpalignr	xmm8,xmm0,xmm7,8
++	vpxor	xmm1,xmm1,xmm5
++	add	ebp,DWORD[16+rsp]
++	xor	esi,ecx
++	mov	edi,eax
++	shld	eax,eax,5
++	vpxor	xmm1,xmm1,xmm2
++	add	ebp,esi
++	xor	edi,ecx
++	vpaddd	xmm9,xmm11,xmm0
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	vpxor	xmm1,xmm1,xmm8
++	add	edx,DWORD[20+rsp]
++	xor	edi,ebx
++	mov	esi,ebp
++	shld	ebp,ebp,5
++	vpsrld	xmm8,xmm1,30
++	vmovdqa	XMMWORD[rsp],xmm9
++	add	edx,edi
++	xor	esi,ebx
++	shrd	eax,eax,7
++	add	edx,ebp
++	vpslld	xmm1,xmm1,2
++	add	ecx,DWORD[24+rsp]
++	xor	esi,eax
++	mov	edi,edx
++	shld	edx,edx,5
++	add	ecx,esi
++	xor	edi,eax
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	vpor	xmm1,xmm1,xmm8
++	add	ebx,DWORD[28+rsp]
++	xor	edi,ebp
++	mov	esi,ecx
++	shld	ecx,ecx,5
++	add	ebx,edi
++	xor	esi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	vpalignr	xmm8,xmm1,xmm0,8
++	vpxor	xmm2,xmm2,xmm6
++	add	eax,DWORD[32+rsp]
++	xor	esi,edx
++	mov	edi,ebx
++	shld	ebx,ebx,5
++	vpxor	xmm2,xmm2,xmm3
++	add	eax,esi
++	xor	edi,edx
++	vpaddd	xmm9,xmm11,xmm1
++	vmovdqa	xmm11,XMMWORD[r11]
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	vpxor	xmm2,xmm2,xmm8
++	add	ebp,DWORD[36+rsp]
++	xor	edi,ecx
++	mov	esi,eax
++	shld	eax,eax,5
++	vpsrld	xmm8,xmm2,30
++	vmovdqa	XMMWORD[16+rsp],xmm9
++	add	ebp,edi
++	xor	esi,ecx
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	vpslld	xmm2,xmm2,2
++	add	edx,DWORD[40+rsp]
++	xor	esi,ebx
++	mov	edi,ebp
++	shld	ebp,ebp,5
++	add	edx,esi
++	xor	edi,ebx
++	shrd	eax,eax,7
++	add	edx,ebp
++	vpor	xmm2,xmm2,xmm8
++	add	ecx,DWORD[44+rsp]
++	xor	edi,eax
++	mov	esi,edx
++	shld	edx,edx,5
++	add	ecx,edi
++	xor	esi,eax
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	vpalignr	xmm8,xmm2,xmm1,8
++	vpxor	xmm3,xmm3,xmm7
++	add	ebx,DWORD[48+rsp]
++	xor	esi,ebp
++	mov	edi,ecx
++	shld	ecx,ecx,5
++	vpxor	xmm3,xmm3,xmm4
++	add	ebx,esi
++	xor	edi,ebp
++	vpaddd	xmm9,xmm11,xmm2
++	shrd	edx,edx,7
++	add	ebx,ecx
++	vpxor	xmm3,xmm3,xmm8
++	add	eax,DWORD[52+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	shld	ebx,ebx,5
++	vpsrld	xmm8,xmm3,30
++	vmovdqa	XMMWORD[32+rsp],xmm9
++	add	eax,edi
++	xor	esi,edx
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	vpslld	xmm3,xmm3,2
++	add	ebp,DWORD[56+rsp]
++	xor	esi,ecx
++	mov	edi,eax
++	shld	eax,eax,5
++	add	ebp,esi
++	xor	edi,ecx
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	vpor	xmm3,xmm3,xmm8
++	add	edx,DWORD[60+rsp]
++	xor	edi,ebx
++	mov	esi,ebp
++	shld	ebp,ebp,5
++	add	edx,edi
++	xor	esi,ebx
++	shrd	eax,eax,7
++	add	edx,ebp
++	vpalignr	xmm8,xmm3,xmm2,8
++	vpxor	xmm4,xmm4,xmm0
++	add	ecx,DWORD[rsp]
++	xor	esi,eax
++	mov	edi,edx
++	shld	edx,edx,5
++	vpxor	xmm4,xmm4,xmm5
++	add	ecx,esi
++	xor	edi,eax
++	vpaddd	xmm9,xmm11,xmm3
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	vpxor	xmm4,xmm4,xmm8
++	add	ebx,DWORD[4+rsp]
++	xor	edi,ebp
++	mov	esi,ecx
++	shld	ecx,ecx,5
++	vpsrld	xmm8,xmm4,30
++	vmovdqa	XMMWORD[48+rsp],xmm9
++	add	ebx,edi
++	xor	esi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	vpslld	xmm4,xmm4,2
++	add	eax,DWORD[8+rsp]
++	xor	esi,edx
++	mov	edi,ebx
++	shld	ebx,ebx,5
++	add	eax,esi
++	xor	edi,edx
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	vpor	xmm4,xmm4,xmm8
++	add	ebp,DWORD[12+rsp]
++	xor	edi,ecx
++	mov	esi,eax
++	shld	eax,eax,5
++	add	ebp,edi
++	xor	esi,ecx
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	vpalignr	xmm8,xmm4,xmm3,8
++	vpxor	xmm5,xmm5,xmm1
++	add	edx,DWORD[16+rsp]
++	xor	esi,ebx
++	mov	edi,ebp
++	shld	ebp,ebp,5
++	vpxor	xmm5,xmm5,xmm6
++	add	edx,esi
++	xor	edi,ebx
++	vpaddd	xmm9,xmm11,xmm4
++	shrd	eax,eax,7
++	add	edx,ebp
++	vpxor	xmm5,xmm5,xmm8
++	add	ecx,DWORD[20+rsp]
++	xor	edi,eax
++	mov	esi,edx
++	shld	edx,edx,5
++	vpsrld	xmm8,xmm5,30
++	vmovdqa	XMMWORD[rsp],xmm9
++	add	ecx,edi
++	xor	esi,eax
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	vpslld	xmm5,xmm5,2
++	add	ebx,DWORD[24+rsp]
++	xor	esi,ebp
++	mov	edi,ecx
++	shld	ecx,ecx,5
++	add	ebx,esi
++	xor	edi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	vpor	xmm5,xmm5,xmm8
++	add	eax,DWORD[28+rsp]
++	shrd	ecx,ecx,7
++	mov	esi,ebx
++	xor	edi,edx
++	shld	ebx,ebx,5
++	add	eax,edi
++	xor	esi,ecx
++	xor	ecx,edx
++	add	eax,ebx
++	vpalignr	xmm8,xmm5,xmm4,8
++	vpxor	xmm6,xmm6,xmm2
++	add	ebp,DWORD[32+rsp]
++	and	esi,ecx
++	xor	ecx,edx
++	shrd	ebx,ebx,7
++	vpxor	xmm6,xmm6,xmm7
++	mov	edi,eax
++	xor	esi,ecx
++	vpaddd	xmm9,xmm11,xmm5
++	shld	eax,eax,5
++	add	ebp,esi
++	vpxor	xmm6,xmm6,xmm8
++	xor	edi,ebx
++	xor	ebx,ecx
++	add	ebp,eax
++	add	edx,DWORD[36+rsp]
++	vpsrld	xmm8,xmm6,30
++	vmovdqa	XMMWORD[16+rsp],xmm9
++	and	edi,ebx
++	xor	ebx,ecx
++	shrd	eax,eax,7
++	mov	esi,ebp
++	vpslld	xmm6,xmm6,2
++	xor	edi,ebx
++	shld	ebp,ebp,5
++	add	edx,edi
++	xor	esi,eax
++	xor	eax,ebx
++	add	edx,ebp
++	add	ecx,DWORD[40+rsp]
++	and	esi,eax
++	vpor	xmm6,xmm6,xmm8
++	xor	eax,ebx
++	shrd	ebp,ebp,7
++	mov	edi,edx
++	xor	esi,eax
++	shld	edx,edx,5
++	add	ecx,esi
++	xor	edi,ebp
++	xor	ebp,eax
++	add	ecx,edx
++	add	ebx,DWORD[44+rsp]
++	and	edi,ebp
++	xor	ebp,eax
++	shrd	edx,edx,7
++	mov	esi,ecx
++	xor	edi,ebp
++	shld	ecx,ecx,5
++	add	ebx,edi
++	xor	esi,edx
++	xor	edx,ebp
++	add	ebx,ecx
++	vpalignr	xmm8,xmm6,xmm5,8
++	vpxor	xmm7,xmm7,xmm3
++	add	eax,DWORD[48+rsp]
++	and	esi,edx
++	xor	edx,ebp
++	shrd	ecx,ecx,7
++	vpxor	xmm7,xmm7,xmm0
++	mov	edi,ebx
++	xor	esi,edx
++	vpaddd	xmm9,xmm11,xmm6
++	vmovdqa	xmm11,XMMWORD[32+r11]
++	shld	ebx,ebx,5
++	add	eax,esi
++	vpxor	xmm7,xmm7,xmm8
++	xor	edi,ecx
++	xor	ecx,edx
++	add	eax,ebx
++	add	ebp,DWORD[52+rsp]
++	vpsrld	xmm8,xmm7,30
++	vmovdqa	XMMWORD[32+rsp],xmm9
++	and	edi,ecx
++	xor	ecx,edx
++	shrd	ebx,ebx,7
++	mov	esi,eax
++	vpslld	xmm7,xmm7,2
++	xor	edi,ecx
++	shld	eax,eax,5
++	add	ebp,edi
++	xor	esi,ebx
++	xor	ebx,ecx
++	add	ebp,eax
++	add	edx,DWORD[56+rsp]
++	and	esi,ebx
++	vpor	xmm7,xmm7,xmm8
++	xor	ebx,ecx
++	shrd	eax,eax,7
++	mov	edi,ebp
++	xor	esi,ebx
++	shld	ebp,ebp,5
++	add	edx,esi
++	xor	edi,eax
++	xor	eax,ebx
++	add	edx,ebp
++	add	ecx,DWORD[60+rsp]
++	and	edi,eax
++	xor	eax,ebx
++	shrd	ebp,ebp,7
++	mov	esi,edx
++	xor	edi,eax
++	shld	edx,edx,5
++	add	ecx,edi
++	xor	esi,ebp
++	xor	ebp,eax
++	add	ecx,edx
++	vpalignr	xmm8,xmm7,xmm6,8
++	vpxor	xmm0,xmm0,xmm4
++	add	ebx,DWORD[rsp]
++	and	esi,ebp
++	xor	ebp,eax
++	shrd	edx,edx,7
++	vpxor	xmm0,xmm0,xmm1
++	mov	edi,ecx
++	xor	esi,ebp
++	vpaddd	xmm9,xmm11,xmm7
++	shld	ecx,ecx,5
++	add	ebx,esi
++	vpxor	xmm0,xmm0,xmm8
++	xor	edi,edx
++	xor	edx,ebp
++	add	ebx,ecx
++	add	eax,DWORD[4+rsp]
++	vpsrld	xmm8,xmm0,30
++	vmovdqa	XMMWORD[48+rsp],xmm9
++	and	edi,edx
++	xor	edx,ebp
++	shrd	ecx,ecx,7
++	mov	esi,ebx
++	vpslld	xmm0,xmm0,2
++	xor	edi,edx
++	shld	ebx,ebx,5
++	add	eax,edi
++	xor	esi,ecx
++	xor	ecx,edx
++	add	eax,ebx
++	add	ebp,DWORD[8+rsp]
++	and	esi,ecx
++	vpor	xmm0,xmm0,xmm8
++	xor	ecx,edx
++	shrd	ebx,ebx,7
++	mov	edi,eax
++	xor	esi,ecx
++	shld	eax,eax,5
++	add	ebp,esi
++	xor	edi,ebx
++	xor	ebx,ecx
++	add	ebp,eax
++	add	edx,DWORD[12+rsp]
++	and	edi,ebx
++	xor	ebx,ecx
++	shrd	eax,eax,7
++	mov	esi,ebp
++	xor	edi,ebx
++	shld	ebp,ebp,5
++	add	edx,edi
++	xor	esi,eax
++	xor	eax,ebx
++	add	edx,ebp
++	vpalignr	xmm8,xmm0,xmm7,8
++	vpxor	xmm1,xmm1,xmm5
++	add	ecx,DWORD[16+rsp]
++	and	esi,eax
++	xor	eax,ebx
++	shrd	ebp,ebp,7
++	vpxor	xmm1,xmm1,xmm2
++	mov	edi,edx
++	xor	esi,eax
++	vpaddd	xmm9,xmm11,xmm0
++	shld	edx,edx,5
++	add	ecx,esi
++	vpxor	xmm1,xmm1,xmm8
++	xor	edi,ebp
++	xor	ebp,eax
++	add	ecx,edx
++	add	ebx,DWORD[20+rsp]
++	vpsrld	xmm8,xmm1,30
++	vmovdqa	XMMWORD[rsp],xmm9
++	and	edi,ebp
++	xor	ebp,eax
++	shrd	edx,edx,7
++	mov	esi,ecx
++	vpslld	xmm1,xmm1,2
++	xor	edi,ebp
++	shld	ecx,ecx,5
++	add	ebx,edi
++	xor	esi,edx
++	xor	edx,ebp
++	add	ebx,ecx
++	add	eax,DWORD[24+rsp]
++	and	esi,edx
++	vpor	xmm1,xmm1,xmm8
++	xor	edx,ebp
++	shrd	ecx,ecx,7
++	mov	edi,ebx
++	xor	esi,edx
++	shld	ebx,ebx,5
++	add	eax,esi
++	xor	edi,ecx
++	xor	ecx,edx
++	add	eax,ebx
++	add	ebp,DWORD[28+rsp]
++	and	edi,ecx
++	xor	ecx,edx
++	shrd	ebx,ebx,7
++	mov	esi,eax
++	xor	edi,ecx
++	shld	eax,eax,5
++	add	ebp,edi
++	xor	esi,ebx
++	xor	ebx,ecx
++	add	ebp,eax
++	vpalignr	xmm8,xmm1,xmm0,8
++	vpxor	xmm2,xmm2,xmm6
++	add	edx,DWORD[32+rsp]
++	and	esi,ebx
++	xor	ebx,ecx
++	shrd	eax,eax,7
++	vpxor	xmm2,xmm2,xmm3
++	mov	edi,ebp
++	xor	esi,ebx
++	vpaddd	xmm9,xmm11,xmm1
++	shld	ebp,ebp,5
++	add	edx,esi
++	vpxor	xmm2,xmm2,xmm8
++	xor	edi,eax
++	xor	eax,ebx
++	add	edx,ebp
++	add	ecx,DWORD[36+rsp]
++	vpsrld	xmm8,xmm2,30
++	vmovdqa	XMMWORD[16+rsp],xmm9
++	and	edi,eax
++	xor	eax,ebx
++	shrd	ebp,ebp,7
++	mov	esi,edx
++	vpslld	xmm2,xmm2,2
++	xor	edi,eax
++	shld	edx,edx,5
++	add	ecx,edi
++	xor	esi,ebp
++	xor	ebp,eax
++	add	ecx,edx
++	add	ebx,DWORD[40+rsp]
++	and	esi,ebp
++	vpor	xmm2,xmm2,xmm8
++	xor	ebp,eax
++	shrd	edx,edx,7
++	mov	edi,ecx
++	xor	esi,ebp
++	shld	ecx,ecx,5
++	add	ebx,esi
++	xor	edi,edx
++	xor	edx,ebp
++	add	ebx,ecx
++	add	eax,DWORD[44+rsp]
++	and	edi,edx
++	xor	edx,ebp
++	shrd	ecx,ecx,7
++	mov	esi,ebx
++	xor	edi,edx
++	shld	ebx,ebx,5
++	add	eax,edi
++	xor	esi,edx
++	add	eax,ebx
++	vpalignr	xmm8,xmm2,xmm1,8
++	vpxor	xmm3,xmm3,xmm7
++	add	ebp,DWORD[48+rsp]
++	xor	esi,ecx
++	mov	edi,eax
++	shld	eax,eax,5
++	vpxor	xmm3,xmm3,xmm4
++	add	ebp,esi
++	xor	edi,ecx
++	vpaddd	xmm9,xmm11,xmm2
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	vpxor	xmm3,xmm3,xmm8
++	add	edx,DWORD[52+rsp]
++	xor	edi,ebx
++	mov	esi,ebp
++	shld	ebp,ebp,5
++	vpsrld	xmm8,xmm3,30
++	vmovdqa	XMMWORD[32+rsp],xmm9
++	add	edx,edi
++	xor	esi,ebx
++	shrd	eax,eax,7
++	add	edx,ebp
++	vpslld	xmm3,xmm3,2
++	add	ecx,DWORD[56+rsp]
++	xor	esi,eax
++	mov	edi,edx
++	shld	edx,edx,5
++	add	ecx,esi
++	xor	edi,eax
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	vpor	xmm3,xmm3,xmm8
++	add	ebx,DWORD[60+rsp]
++	xor	edi,ebp
++	mov	esi,ecx
++	shld	ecx,ecx,5
++	add	ebx,edi
++	xor	esi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	add	eax,DWORD[rsp]
++	vpaddd	xmm9,xmm11,xmm3
++	xor	esi,edx
++	mov	edi,ebx
++	shld	ebx,ebx,5
++	add	eax,esi
++	vmovdqa	XMMWORD[48+rsp],xmm9
++	xor	edi,edx
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[4+rsp]
++	xor	edi,ecx
++	mov	esi,eax
++	shld	eax,eax,5
++	add	ebp,edi
++	xor	esi,ecx
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	add	edx,DWORD[8+rsp]
++	xor	esi,ebx
++	mov	edi,ebp
++	shld	ebp,ebp,5
++	add	edx,esi
++	xor	edi,ebx
++	shrd	eax,eax,7
++	add	edx,ebp
++	add	ecx,DWORD[12+rsp]
++	xor	edi,eax
++	mov	esi,edx
++	shld	edx,edx,5
++	add	ecx,edi
++	xor	esi,eax
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	cmp	r9,r10
++	je	NEAR $L$done_avx
++	vmovdqa	xmm6,XMMWORD[64+r11]
++	vmovdqa	xmm11,XMMWORD[((-64))+r11]
++	vmovdqu	xmm0,XMMWORD[r9]
++	vmovdqu	xmm1,XMMWORD[16+r9]
++	vmovdqu	xmm2,XMMWORD[32+r9]
++	vmovdqu	xmm3,XMMWORD[48+r9]
++	vpshufb	xmm0,xmm0,xmm6
++	add	r9,64
++	add	ebx,DWORD[16+rsp]
++	xor	esi,ebp
++	vpshufb	xmm1,xmm1,xmm6
++	mov	edi,ecx
++	shld	ecx,ecx,5
++	vpaddd	xmm4,xmm0,xmm11
++	add	ebx,esi
++	xor	edi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	vmovdqa	XMMWORD[rsp],xmm4
++	add	eax,DWORD[20+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	shld	ebx,ebx,5
++	add	eax,edi
++	xor	esi,edx
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[24+rsp]
++	xor	esi,ecx
++	mov	edi,eax
++	shld	eax,eax,5
++	add	ebp,esi
++	xor	edi,ecx
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	add	edx,DWORD[28+rsp]
++	xor	edi,ebx
++	mov	esi,ebp
++	shld	ebp,ebp,5
++	add	edx,edi
++	xor	esi,ebx
++	shrd	eax,eax,7
++	add	edx,ebp
++	add	ecx,DWORD[32+rsp]
++	xor	esi,eax
++	vpshufb	xmm2,xmm2,xmm6
++	mov	edi,edx
++	shld	edx,edx,5
++	vpaddd	xmm5,xmm1,xmm11
++	add	ecx,esi
++	xor	edi,eax
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	vmovdqa	XMMWORD[16+rsp],xmm5
++	add	ebx,DWORD[36+rsp]
++	xor	edi,ebp
++	mov	esi,ecx
++	shld	ecx,ecx,5
++	add	ebx,edi
++	xor	esi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	add	eax,DWORD[40+rsp]
++	xor	esi,edx
++	mov	edi,ebx
++	shld	ebx,ebx,5
++	add	eax,esi
++	xor	edi,edx
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[44+rsp]
++	xor	edi,ecx
++	mov	esi,eax
++	shld	eax,eax,5
++	add	ebp,edi
++	xor	esi,ecx
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	add	edx,DWORD[48+rsp]
++	xor	esi,ebx
++	vpshufb	xmm3,xmm3,xmm6
++	mov	edi,ebp
++	shld	ebp,ebp,5
++	vpaddd	xmm6,xmm2,xmm11
++	add	edx,esi
++	xor	edi,ebx
++	shrd	eax,eax,7
++	add	edx,ebp
++	vmovdqa	XMMWORD[32+rsp],xmm6
++	add	ecx,DWORD[52+rsp]
++	xor	edi,eax
++	mov	esi,edx
++	shld	edx,edx,5
++	add	ecx,edi
++	xor	esi,eax
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	add	ebx,DWORD[56+rsp]
++	xor	esi,ebp
++	mov	edi,ecx
++	shld	ecx,ecx,5
++	add	ebx,esi
++	xor	edi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	add	eax,DWORD[60+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	shld	ebx,ebx,5
++	add	eax,edi
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	add	eax,DWORD[r8]
++	add	esi,DWORD[4+r8]
++	add	ecx,DWORD[8+r8]
++	add	edx,DWORD[12+r8]
++	mov	DWORD[r8],eax
++	add	ebp,DWORD[16+r8]
++	mov	DWORD[4+r8],esi
++	mov	ebx,esi
++	mov	DWORD[8+r8],ecx
++	mov	edi,ecx
++	mov	DWORD[12+r8],edx
++	xor	edi,edx
++	mov	DWORD[16+r8],ebp
++	and	esi,edi
++	jmp	NEAR $L$oop_avx
++
++ALIGN	16
++$L$done_avx:
++	add	ebx,DWORD[16+rsp]
++	xor	esi,ebp
++	mov	edi,ecx
++	shld	ecx,ecx,5
++	add	ebx,esi
++	xor	edi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	add	eax,DWORD[20+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	shld	ebx,ebx,5
++	add	eax,edi
++	xor	esi,edx
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[24+rsp]
++	xor	esi,ecx
++	mov	edi,eax
++	shld	eax,eax,5
++	add	ebp,esi
++	xor	edi,ecx
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	add	edx,DWORD[28+rsp]
++	xor	edi,ebx
++	mov	esi,ebp
++	shld	ebp,ebp,5
++	add	edx,edi
++	xor	esi,ebx
++	shrd	eax,eax,7
++	add	edx,ebp
++	add	ecx,DWORD[32+rsp]
++	xor	esi,eax
++	mov	edi,edx
++	shld	edx,edx,5
++	add	ecx,esi
++	xor	edi,eax
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	add	ebx,DWORD[36+rsp]
++	xor	edi,ebp
++	mov	esi,ecx
++	shld	ecx,ecx,5
++	add	ebx,edi
++	xor	esi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	add	eax,DWORD[40+rsp]
++	xor	esi,edx
++	mov	edi,ebx
++	shld	ebx,ebx,5
++	add	eax,esi
++	xor	edi,edx
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	add	ebp,DWORD[44+rsp]
++	xor	edi,ecx
++	mov	esi,eax
++	shld	eax,eax,5
++	add	ebp,edi
++	xor	esi,ecx
++	shrd	ebx,ebx,7
++	add	ebp,eax
++	add	edx,DWORD[48+rsp]
++	xor	esi,ebx
++	mov	edi,ebp
++	shld	ebp,ebp,5
++	add	edx,esi
++	xor	edi,ebx
++	shrd	eax,eax,7
++	add	edx,ebp
++	add	ecx,DWORD[52+rsp]
++	xor	edi,eax
++	mov	esi,edx
++	shld	edx,edx,5
++	add	ecx,edi
++	xor	esi,eax
++	shrd	ebp,ebp,7
++	add	ecx,edx
++	add	ebx,DWORD[56+rsp]
++	xor	esi,ebp
++	mov	edi,ecx
++	shld	ecx,ecx,5
++	add	ebx,esi
++	xor	edi,ebp
++	shrd	edx,edx,7
++	add	ebx,ecx
++	add	eax,DWORD[60+rsp]
++	xor	edi,edx
++	mov	esi,ebx
++	shld	ebx,ebx,5
++	add	eax,edi
++	shrd	ecx,ecx,7
++	add	eax,ebx
++	vzeroupper
++
++	add	eax,DWORD[r8]
++	add	esi,DWORD[4+r8]
++	add	ecx,DWORD[8+r8]
++	mov	DWORD[r8],eax
++	add	edx,DWORD[12+r8]
++	mov	DWORD[4+r8],esi
++	add	ebp,DWORD[16+r8]
++	mov	DWORD[8+r8],ecx
++	mov	DWORD[12+r8],edx
++	mov	DWORD[16+r8],ebp
++	movaps	xmm6,XMMWORD[((-40-96))+r14]
++	movaps	xmm7,XMMWORD[((-40-80))+r14]
++	movaps	xmm8,XMMWORD[((-40-64))+r14]
++	movaps	xmm9,XMMWORD[((-40-48))+r14]
++	movaps	xmm10,XMMWORD[((-40-32))+r14]
++	movaps	xmm11,XMMWORD[((-40-16))+r14]
++	lea	rsi,[r14]
++	mov	r14,QWORD[((-40))+rsi]
++	mov	r13,QWORD[((-32))+rsi]
++	mov	r12,QWORD[((-24))+rsi]
++	mov	rbp,QWORD[((-16))+rsi]
++	mov	rbx,QWORD[((-8))+rsi]
++	lea	rsp,[rsi]
++$L$epilogue_avx:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha1_block_data_order_avx:
++
++ALIGN	16
++sha1_block_data_order_avx2:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha1_block_data_order_avx2:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++_avx2_shortcut:
++	mov	rax,rsp
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	vzeroupper
++	lea	rsp,[((-96))+rsp]
++	vmovaps	XMMWORD[(-40-96)+rax],xmm6
++	vmovaps	XMMWORD[(-40-80)+rax],xmm7
++	vmovaps	XMMWORD[(-40-64)+rax],xmm8
++	vmovaps	XMMWORD[(-40-48)+rax],xmm9
++	vmovaps	XMMWORD[(-40-32)+rax],xmm10
++	vmovaps	XMMWORD[(-40-16)+rax],xmm11
++$L$prologue_avx2:
++	mov	r14,rax
++	mov	r8,rdi
++	mov	r9,rsi
++	mov	r10,rdx
++
++	lea	rsp,[((-640))+rsp]
++	shl	r10,6
++	lea	r13,[64+r9]
++	and	rsp,-128
++	add	r10,r9
++	lea	r11,[((K_XX_XX+64))]
++
++	mov	eax,DWORD[r8]
++	cmp	r13,r10
++	cmovae	r13,r9
++	mov	ebp,DWORD[4+r8]
++	mov	ecx,DWORD[8+r8]
++	mov	edx,DWORD[12+r8]
++	mov	esi,DWORD[16+r8]
++	vmovdqu	ymm6,YMMWORD[64+r11]
++
++	vmovdqu	xmm0,XMMWORD[r9]
++	vmovdqu	xmm1,XMMWORD[16+r9]
++	vmovdqu	xmm2,XMMWORD[32+r9]
++	vmovdqu	xmm3,XMMWORD[48+r9]
++	lea	r9,[64+r9]
++	vinserti128	ymm0,ymm0,XMMWORD[r13],1
++	vinserti128	ymm1,ymm1,XMMWORD[16+r13],1
++	vpshufb	ymm0,ymm0,ymm6
++	vinserti128	ymm2,ymm2,XMMWORD[32+r13],1
++	vpshufb	ymm1,ymm1,ymm6
++	vinserti128	ymm3,ymm3,XMMWORD[48+r13],1
++	vpshufb	ymm2,ymm2,ymm6
++	vmovdqu	ymm11,YMMWORD[((-64))+r11]
++	vpshufb	ymm3,ymm3,ymm6
++
++	vpaddd	ymm4,ymm0,ymm11
++	vpaddd	ymm5,ymm1,ymm11
++	vmovdqu	YMMWORD[rsp],ymm4
++	vpaddd	ymm6,ymm2,ymm11
++	vmovdqu	YMMWORD[32+rsp],ymm5
++	vpaddd	ymm7,ymm3,ymm11
++	vmovdqu	YMMWORD[64+rsp],ymm6
++	vmovdqu	YMMWORD[96+rsp],ymm7
++	vpalignr	ymm4,ymm1,ymm0,8
++	vpsrldq	ymm8,ymm3,4
++	vpxor	ymm4,ymm4,ymm0
++	vpxor	ymm8,ymm8,ymm2
++	vpxor	ymm4,ymm4,ymm8
++	vpsrld	ymm8,ymm4,31
++	vpslldq	ymm10,ymm4,12
++	vpaddd	ymm4,ymm4,ymm4
++	vpsrld	ymm9,ymm10,30
++	vpor	ymm4,ymm4,ymm8
++	vpslld	ymm10,ymm10,2
++	vpxor	ymm4,ymm4,ymm9
++	vpxor	ymm4,ymm4,ymm10
++	vpaddd	ymm9,ymm4,ymm11
++	vmovdqu	YMMWORD[128+rsp],ymm9
++	vpalignr	ymm5,ymm2,ymm1,8
++	vpsrldq	ymm8,ymm4,4
++	vpxor	ymm5,ymm5,ymm1
++	vpxor	ymm8,ymm8,ymm3
++	vpxor	ymm5,ymm5,ymm8
++	vpsrld	ymm8,ymm5,31
++	vmovdqu	ymm11,YMMWORD[((-32))+r11]
++	vpslldq	ymm10,ymm5,12
++	vpaddd	ymm5,ymm5,ymm5
++	vpsrld	ymm9,ymm10,30
++	vpor	ymm5,ymm5,ymm8
++	vpslld	ymm10,ymm10,2
++	vpxor	ymm5,ymm5,ymm9
++	vpxor	ymm5,ymm5,ymm10
++	vpaddd	ymm9,ymm5,ymm11
++	vmovdqu	YMMWORD[160+rsp],ymm9
++	vpalignr	ymm6,ymm3,ymm2,8
++	vpsrldq	ymm8,ymm5,4
++	vpxor	ymm6,ymm6,ymm2
++	vpxor	ymm8,ymm8,ymm4
++	vpxor	ymm6,ymm6,ymm8
++	vpsrld	ymm8,ymm6,31
++	vpslldq	ymm10,ymm6,12
++	vpaddd	ymm6,ymm6,ymm6
++	vpsrld	ymm9,ymm10,30
++	vpor	ymm6,ymm6,ymm8
++	vpslld	ymm10,ymm10,2
++	vpxor	ymm6,ymm6,ymm9
++	vpxor	ymm6,ymm6,ymm10
++	vpaddd	ymm9,ymm6,ymm11
++	vmovdqu	YMMWORD[192+rsp],ymm9
++	vpalignr	ymm7,ymm4,ymm3,8
++	vpsrldq	ymm8,ymm6,4
++	vpxor	ymm7,ymm7,ymm3
++	vpxor	ymm8,ymm8,ymm5
++	vpxor	ymm7,ymm7,ymm8
++	vpsrld	ymm8,ymm7,31
++	vpslldq	ymm10,ymm7,12
++	vpaddd	ymm7,ymm7,ymm7
++	vpsrld	ymm9,ymm10,30
++	vpor	ymm7,ymm7,ymm8
++	vpslld	ymm10,ymm10,2
++	vpxor	ymm7,ymm7,ymm9
++	vpxor	ymm7,ymm7,ymm10
++	vpaddd	ymm9,ymm7,ymm11
++	vmovdqu	YMMWORD[224+rsp],ymm9
++	lea	r13,[128+rsp]
++	jmp	NEAR $L$oop_avx2
++ALIGN	32
++$L$oop_avx2:
++	rorx	ebx,ebp,2
++	andn	edi,ebp,edx
++	and	ebp,ecx
++	xor	ebp,edi
++	jmp	NEAR $L$align32_1
++ALIGN	32
++$L$align32_1:
++	vpalignr	ymm8,ymm7,ymm6,8
++	vpxor	ymm0,ymm0,ymm4
++	add	esi,DWORD[((-128))+r13]
++	andn	edi,eax,ecx
++	vpxor	ymm0,ymm0,ymm1
++	add	esi,ebp
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	vpxor	ymm0,ymm0,ymm8
++	and	eax,ebx
++	add	esi,r12d
++	xor	eax,edi
++	vpsrld	ymm8,ymm0,30
++	vpslld	ymm0,ymm0,2
++	add	edx,DWORD[((-124))+r13]
++	andn	edi,esi,ebx
++	add	edx,eax
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	and	esi,ebp
++	vpor	ymm0,ymm0,ymm8
++	add	edx,r12d
++	xor	esi,edi
++	add	ecx,DWORD[((-120))+r13]
++	andn	edi,edx,ebp
++	vpaddd	ymm9,ymm0,ymm11
++	add	ecx,esi
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	and	edx,eax
++	vmovdqu	YMMWORD[256+rsp],ymm9
++	add	ecx,r12d
++	xor	edx,edi
++	add	ebx,DWORD[((-116))+r13]
++	andn	edi,ecx,eax
++	add	ebx,edx
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	and	ecx,esi
++	add	ebx,r12d
++	xor	ecx,edi
++	add	ebp,DWORD[((-96))+r13]
++	andn	edi,ebx,esi
++	add	ebp,ecx
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	and	ebx,edx
++	add	ebp,r12d
++	xor	ebx,edi
++	vpalignr	ymm8,ymm0,ymm7,8
++	vpxor	ymm1,ymm1,ymm5
++	add	eax,DWORD[((-92))+r13]
++	andn	edi,ebp,edx
++	vpxor	ymm1,ymm1,ymm2
++	add	eax,ebx
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	vpxor	ymm1,ymm1,ymm8
++	and	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edi
++	vpsrld	ymm8,ymm1,30
++	vpslld	ymm1,ymm1,2
++	add	esi,DWORD[((-88))+r13]
++	andn	edi,eax,ecx
++	add	esi,ebp
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	and	eax,ebx
++	vpor	ymm1,ymm1,ymm8
++	add	esi,r12d
++	xor	eax,edi
++	add	edx,DWORD[((-84))+r13]
++	andn	edi,esi,ebx
++	vpaddd	ymm9,ymm1,ymm11
++	add	edx,eax
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	and	esi,ebp
++	vmovdqu	YMMWORD[288+rsp],ymm9
++	add	edx,r12d
++	xor	esi,edi
++	add	ecx,DWORD[((-64))+r13]
++	andn	edi,edx,ebp
++	add	ecx,esi
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	and	edx,eax
++	add	ecx,r12d
++	xor	edx,edi
++	add	ebx,DWORD[((-60))+r13]
++	andn	edi,ecx,eax
++	add	ebx,edx
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	and	ecx,esi
++	add	ebx,r12d
++	xor	ecx,edi
++	vpalignr	ymm8,ymm1,ymm0,8
++	vpxor	ymm2,ymm2,ymm6
++	add	ebp,DWORD[((-56))+r13]
++	andn	edi,ebx,esi
++	vpxor	ymm2,ymm2,ymm3
++	vmovdqu	ymm11,YMMWORD[r11]
++	add	ebp,ecx
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	vpxor	ymm2,ymm2,ymm8
++	and	ebx,edx
++	add	ebp,r12d
++	xor	ebx,edi
++	vpsrld	ymm8,ymm2,30
++	vpslld	ymm2,ymm2,2
++	add	eax,DWORD[((-52))+r13]
++	andn	edi,ebp,edx
++	add	eax,ebx
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	and	ebp,ecx
++	vpor	ymm2,ymm2,ymm8
++	add	eax,r12d
++	xor	ebp,edi
++	add	esi,DWORD[((-32))+r13]
++	andn	edi,eax,ecx
++	vpaddd	ymm9,ymm2,ymm11
++	add	esi,ebp
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	and	eax,ebx
++	vmovdqu	YMMWORD[320+rsp],ymm9
++	add	esi,r12d
++	xor	eax,edi
++	add	edx,DWORD[((-28))+r13]
++	andn	edi,esi,ebx
++	add	edx,eax
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	and	esi,ebp
++	add	edx,r12d
++	xor	esi,edi
++	add	ecx,DWORD[((-24))+r13]
++	andn	edi,edx,ebp
++	add	ecx,esi
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	and	edx,eax
++	add	ecx,r12d
++	xor	edx,edi
++	vpalignr	ymm8,ymm2,ymm1,8
++	vpxor	ymm3,ymm3,ymm7
++	add	ebx,DWORD[((-20))+r13]
++	andn	edi,ecx,eax
++	vpxor	ymm3,ymm3,ymm4
++	add	ebx,edx
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	vpxor	ymm3,ymm3,ymm8
++	and	ecx,esi
++	add	ebx,r12d
++	xor	ecx,edi
++	vpsrld	ymm8,ymm3,30
++	vpslld	ymm3,ymm3,2
++	add	ebp,DWORD[r13]
++	andn	edi,ebx,esi
++	add	ebp,ecx
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	and	ebx,edx
++	vpor	ymm3,ymm3,ymm8
++	add	ebp,r12d
++	xor	ebx,edi
++	add	eax,DWORD[4+r13]
++	andn	edi,ebp,edx
++	vpaddd	ymm9,ymm3,ymm11
++	add	eax,ebx
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	and	ebp,ecx
++	vmovdqu	YMMWORD[352+rsp],ymm9
++	add	eax,r12d
++	xor	ebp,edi
++	add	esi,DWORD[8+r13]
++	andn	edi,eax,ecx
++	add	esi,ebp
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	and	eax,ebx
++	add	esi,r12d
++	xor	eax,edi
++	add	edx,DWORD[12+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	vpalignr	ymm8,ymm3,ymm2,8
++	vpxor	ymm4,ymm4,ymm0
++	add	ecx,DWORD[32+r13]
++	lea	ecx,[rsi*1+rcx]
++	vpxor	ymm4,ymm4,ymm5
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	vpxor	ymm4,ymm4,ymm8
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[36+r13]
++	vpsrld	ymm8,ymm4,30
++	vpslld	ymm4,ymm4,2
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	vpor	ymm4,ymm4,ymm8
++	add	ebp,DWORD[40+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	vpaddd	ymm9,ymm4,ymm11
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	add	eax,DWORD[44+r13]
++	vmovdqu	YMMWORD[384+rsp],ymm9
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	add	esi,DWORD[64+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	vpalignr	ymm8,ymm4,ymm3,8
++	vpxor	ymm5,ymm5,ymm1
++	add	edx,DWORD[68+r13]
++	lea	edx,[rax*1+rdx]
++	vpxor	ymm5,ymm5,ymm6
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	vpxor	ymm5,ymm5,ymm8
++	add	edx,r12d
++	xor	esi,ebx
++	add	ecx,DWORD[72+r13]
++	vpsrld	ymm8,ymm5,30
++	vpslld	ymm5,ymm5,2
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	vpor	ymm5,ymm5,ymm8
++	add	ebx,DWORD[76+r13]
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	vpaddd	ymm9,ymm5,ymm11
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	add	ebp,DWORD[96+r13]
++	vmovdqu	YMMWORD[416+rsp],ymm9
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	add	eax,DWORD[100+r13]
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	vpalignr	ymm8,ymm5,ymm4,8
++	vpxor	ymm6,ymm6,ymm2
++	add	esi,DWORD[104+r13]
++	lea	esi,[rbp*1+rsi]
++	vpxor	ymm6,ymm6,ymm7
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	vpxor	ymm6,ymm6,ymm8
++	add	esi,r12d
++	xor	eax,ecx
++	add	edx,DWORD[108+r13]
++	lea	r13,[256+r13]
++	vpsrld	ymm8,ymm6,30
++	vpslld	ymm6,ymm6,2
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	vpor	ymm6,ymm6,ymm8
++	add	ecx,DWORD[((-128))+r13]
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	vpaddd	ymm9,ymm6,ymm11
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[((-124))+r13]
++	vmovdqu	YMMWORD[448+rsp],ymm9
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	add	ebp,DWORD[((-120))+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	vpalignr	ymm8,ymm6,ymm5,8
++	vpxor	ymm7,ymm7,ymm3
++	add	eax,DWORD[((-116))+r13]
++	lea	eax,[rbx*1+rax]
++	vpxor	ymm7,ymm7,ymm0
++	vmovdqu	ymm11,YMMWORD[32+r11]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	vpxor	ymm7,ymm7,ymm8
++	add	eax,r12d
++	xor	ebp,edx
++	add	esi,DWORD[((-96))+r13]
++	vpsrld	ymm8,ymm7,30
++	vpslld	ymm7,ymm7,2
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	vpor	ymm7,ymm7,ymm8
++	add	edx,DWORD[((-92))+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	vpaddd	ymm9,ymm7,ymm11
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	add	ecx,DWORD[((-88))+r13]
++	vmovdqu	YMMWORD[480+rsp],ymm9
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[((-84))+r13]
++	mov	edi,esi
++	xor	edi,eax
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	and	ecx,edi
++	jmp	NEAR $L$align32_2
++ALIGN	32
++$L$align32_2:
++	vpalignr	ymm8,ymm7,ymm6,8
++	vpxor	ymm0,ymm0,ymm4
++	add	ebp,DWORD[((-64))+r13]
++	xor	ecx,esi
++	vpxor	ymm0,ymm0,ymm1
++	mov	edi,edx
++	xor	edi,esi
++	lea	ebp,[rbp*1+rcx]
++	vpxor	ymm0,ymm0,ymm8
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	vpsrld	ymm8,ymm0,30
++	vpslld	ymm0,ymm0,2
++	add	ebp,r12d
++	and	ebx,edi
++	add	eax,DWORD[((-60))+r13]
++	xor	ebx,edx
++	mov	edi,ecx
++	xor	edi,edx
++	vpor	ymm0,ymm0,ymm8
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	vpaddd	ymm9,ymm0,ymm11
++	add	eax,r12d
++	and	ebp,edi
++	add	esi,DWORD[((-56))+r13]
++	xor	ebp,ecx
++	vmovdqu	YMMWORD[512+rsp],ymm9
++	mov	edi,ebx
++	xor	edi,ecx
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	and	eax,edi
++	add	edx,DWORD[((-52))+r13]
++	xor	eax,ebx
++	mov	edi,ebp
++	xor	edi,ebx
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	and	esi,edi
++	add	ecx,DWORD[((-32))+r13]
++	xor	esi,ebp
++	mov	edi,eax
++	xor	edi,ebp
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	and	edx,edi
++	vpalignr	ymm8,ymm0,ymm7,8
++	vpxor	ymm1,ymm1,ymm5
++	add	ebx,DWORD[((-28))+r13]
++	xor	edx,eax
++	vpxor	ymm1,ymm1,ymm2
++	mov	edi,esi
++	xor	edi,eax
++	lea	ebx,[rdx*1+rbx]
++	vpxor	ymm1,ymm1,ymm8
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	vpsrld	ymm8,ymm1,30
++	vpslld	ymm1,ymm1,2
++	add	ebx,r12d
++	and	ecx,edi
++	add	ebp,DWORD[((-24))+r13]
++	xor	ecx,esi
++	mov	edi,edx
++	xor	edi,esi
++	vpor	ymm1,ymm1,ymm8
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	vpaddd	ymm9,ymm1,ymm11
++	add	ebp,r12d
++	and	ebx,edi
++	add	eax,DWORD[((-20))+r13]
++	xor	ebx,edx
++	vmovdqu	YMMWORD[544+rsp],ymm9
++	mov	edi,ecx
++	xor	edi,edx
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	and	ebp,edi
++	add	esi,DWORD[r13]
++	xor	ebp,ecx
++	mov	edi,ebx
++	xor	edi,ecx
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	and	eax,edi
++	add	edx,DWORD[4+r13]
++	xor	eax,ebx
++	mov	edi,ebp
++	xor	edi,ebx
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	and	esi,edi
++	vpalignr	ymm8,ymm1,ymm0,8
++	vpxor	ymm2,ymm2,ymm6
++	add	ecx,DWORD[8+r13]
++	xor	esi,ebp
++	vpxor	ymm2,ymm2,ymm3
++	mov	edi,eax
++	xor	edi,ebp
++	lea	ecx,[rsi*1+rcx]
++	vpxor	ymm2,ymm2,ymm8
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	vpsrld	ymm8,ymm2,30
++	vpslld	ymm2,ymm2,2
++	add	ecx,r12d
++	and	edx,edi
++	add	ebx,DWORD[12+r13]
++	xor	edx,eax
++	mov	edi,esi
++	xor	edi,eax
++	vpor	ymm2,ymm2,ymm8
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	vpaddd	ymm9,ymm2,ymm11
++	add	ebx,r12d
++	and	ecx,edi
++	add	ebp,DWORD[32+r13]
++	xor	ecx,esi
++	vmovdqu	YMMWORD[576+rsp],ymm9
++	mov	edi,edx
++	xor	edi,esi
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	and	ebx,edi
++	add	eax,DWORD[36+r13]
++	xor	ebx,edx
++	mov	edi,ecx
++	xor	edi,edx
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	and	ebp,edi
++	add	esi,DWORD[40+r13]
++	xor	ebp,ecx
++	mov	edi,ebx
++	xor	edi,ecx
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	and	eax,edi
++	vpalignr	ymm8,ymm2,ymm1,8
++	vpxor	ymm3,ymm3,ymm7
++	add	edx,DWORD[44+r13]
++	xor	eax,ebx
++	vpxor	ymm3,ymm3,ymm4
++	mov	edi,ebp
++	xor	edi,ebx
++	lea	edx,[rax*1+rdx]
++	vpxor	ymm3,ymm3,ymm8
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	vpsrld	ymm8,ymm3,30
++	vpslld	ymm3,ymm3,2
++	add	edx,r12d
++	and	esi,edi
++	add	ecx,DWORD[64+r13]
++	xor	esi,ebp
++	mov	edi,eax
++	xor	edi,ebp
++	vpor	ymm3,ymm3,ymm8
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	vpaddd	ymm9,ymm3,ymm11
++	add	ecx,r12d
++	and	edx,edi
++	add	ebx,DWORD[68+r13]
++	xor	edx,eax
++	vmovdqu	YMMWORD[608+rsp],ymm9
++	mov	edi,esi
++	xor	edi,eax
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	and	ecx,edi
++	add	ebp,DWORD[72+r13]
++	xor	ecx,esi
++	mov	edi,edx
++	xor	edi,esi
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	and	ebx,edi
++	add	eax,DWORD[76+r13]
++	xor	ebx,edx
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	add	esi,DWORD[96+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	add	edx,DWORD[100+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	add	ecx,DWORD[104+r13]
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[108+r13]
++	lea	r13,[256+r13]
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	add	ebp,DWORD[((-128))+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	add	eax,DWORD[((-124))+r13]
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	add	esi,DWORD[((-120))+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	add	edx,DWORD[((-116))+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	add	ecx,DWORD[((-96))+r13]
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[((-92))+r13]
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	add	ebp,DWORD[((-88))+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	add	eax,DWORD[((-84))+r13]
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	add	esi,DWORD[((-64))+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	add	edx,DWORD[((-60))+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	add	ecx,DWORD[((-56))+r13]
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[((-52))+r13]
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	add	ebp,DWORD[((-32))+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	add	eax,DWORD[((-28))+r13]
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	add	esi,DWORD[((-24))+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	add	edx,DWORD[((-20))+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	add	edx,r12d
++	lea	r13,[128+r9]
++	lea	rdi,[128+r9]
++	cmp	r13,r10
++	cmovae	r13,r9
++
++
++	add	edx,DWORD[r8]
++	add	esi,DWORD[4+r8]
++	add	ebp,DWORD[8+r8]
++	mov	DWORD[r8],edx
++	add	ebx,DWORD[12+r8]
++	mov	DWORD[4+r8],esi
++	mov	eax,edx
++	add	ecx,DWORD[16+r8]
++	mov	r12d,ebp
++	mov	DWORD[8+r8],ebp
++	mov	edx,ebx
++
++	mov	DWORD[12+r8],ebx
++	mov	ebp,esi
++	mov	DWORD[16+r8],ecx
++
++	mov	esi,ecx
++	mov	ecx,r12d
++
++
++	cmp	r9,r10
++	je	NEAR $L$done_avx2
++	vmovdqu	ymm6,YMMWORD[64+r11]
++	cmp	rdi,r10
++	ja	NEAR $L$ast_avx2
++
++	vmovdqu	xmm0,XMMWORD[((-64))+rdi]
++	vmovdqu	xmm1,XMMWORD[((-48))+rdi]
++	vmovdqu	xmm2,XMMWORD[((-32))+rdi]
++	vmovdqu	xmm3,XMMWORD[((-16))+rdi]
++	vinserti128	ymm0,ymm0,XMMWORD[r13],1
++	vinserti128	ymm1,ymm1,XMMWORD[16+r13],1
++	vinserti128	ymm2,ymm2,XMMWORD[32+r13],1
++	vinserti128	ymm3,ymm3,XMMWORD[48+r13],1
++	jmp	NEAR $L$ast_avx2
++
++ALIGN	32
++$L$ast_avx2:
++	lea	r13,[((128+16))+rsp]
++	rorx	ebx,ebp,2
++	andn	edi,ebp,edx
++	and	ebp,ecx
++	xor	ebp,edi
++	sub	r9,-128
++	add	esi,DWORD[((-128))+r13]
++	andn	edi,eax,ecx
++	add	esi,ebp
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	and	eax,ebx
++	add	esi,r12d
++	xor	eax,edi
++	add	edx,DWORD[((-124))+r13]
++	andn	edi,esi,ebx
++	add	edx,eax
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	and	esi,ebp
++	add	edx,r12d
++	xor	esi,edi
++	add	ecx,DWORD[((-120))+r13]
++	andn	edi,edx,ebp
++	add	ecx,esi
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	and	edx,eax
++	add	ecx,r12d
++	xor	edx,edi
++	add	ebx,DWORD[((-116))+r13]
++	andn	edi,ecx,eax
++	add	ebx,edx
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	and	ecx,esi
++	add	ebx,r12d
++	xor	ecx,edi
++	add	ebp,DWORD[((-96))+r13]
++	andn	edi,ebx,esi
++	add	ebp,ecx
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	and	ebx,edx
++	add	ebp,r12d
++	xor	ebx,edi
++	add	eax,DWORD[((-92))+r13]
++	andn	edi,ebp,edx
++	add	eax,ebx
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	and	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edi
++	add	esi,DWORD[((-88))+r13]
++	andn	edi,eax,ecx
++	add	esi,ebp
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	and	eax,ebx
++	add	esi,r12d
++	xor	eax,edi
++	add	edx,DWORD[((-84))+r13]
++	andn	edi,esi,ebx
++	add	edx,eax
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	and	esi,ebp
++	add	edx,r12d
++	xor	esi,edi
++	add	ecx,DWORD[((-64))+r13]
++	andn	edi,edx,ebp
++	add	ecx,esi
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	and	edx,eax
++	add	ecx,r12d
++	xor	edx,edi
++	add	ebx,DWORD[((-60))+r13]
++	andn	edi,ecx,eax
++	add	ebx,edx
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	and	ecx,esi
++	add	ebx,r12d
++	xor	ecx,edi
++	add	ebp,DWORD[((-56))+r13]
++	andn	edi,ebx,esi
++	add	ebp,ecx
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	and	ebx,edx
++	add	ebp,r12d
++	xor	ebx,edi
++	add	eax,DWORD[((-52))+r13]
++	andn	edi,ebp,edx
++	add	eax,ebx
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	and	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edi
++	add	esi,DWORD[((-32))+r13]
++	andn	edi,eax,ecx
++	add	esi,ebp
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	and	eax,ebx
++	add	esi,r12d
++	xor	eax,edi
++	add	edx,DWORD[((-28))+r13]
++	andn	edi,esi,ebx
++	add	edx,eax
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	and	esi,ebp
++	add	edx,r12d
++	xor	esi,edi
++	add	ecx,DWORD[((-24))+r13]
++	andn	edi,edx,ebp
++	add	ecx,esi
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	and	edx,eax
++	add	ecx,r12d
++	xor	edx,edi
++	add	ebx,DWORD[((-20))+r13]
++	andn	edi,ecx,eax
++	add	ebx,edx
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	and	ecx,esi
++	add	ebx,r12d
++	xor	ecx,edi
++	add	ebp,DWORD[r13]
++	andn	edi,ebx,esi
++	add	ebp,ecx
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	and	ebx,edx
++	add	ebp,r12d
++	xor	ebx,edi
++	add	eax,DWORD[4+r13]
++	andn	edi,ebp,edx
++	add	eax,ebx
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	and	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edi
++	add	esi,DWORD[8+r13]
++	andn	edi,eax,ecx
++	add	esi,ebp
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	and	eax,ebx
++	add	esi,r12d
++	xor	eax,edi
++	add	edx,DWORD[12+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	add	ecx,DWORD[32+r13]
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[36+r13]
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	add	ebp,DWORD[40+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	add	eax,DWORD[44+r13]
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	add	esi,DWORD[64+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	vmovdqu	ymm11,YMMWORD[((-64))+r11]
++	vpshufb	ymm0,ymm0,ymm6
++	add	edx,DWORD[68+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	add	ecx,DWORD[72+r13]
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[76+r13]
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	add	ebp,DWORD[96+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	add	eax,DWORD[100+r13]
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	vpshufb	ymm1,ymm1,ymm6
++	vpaddd	ymm8,ymm0,ymm11
++	add	esi,DWORD[104+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	add	edx,DWORD[108+r13]
++	lea	r13,[256+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	add	ecx,DWORD[((-128))+r13]
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[((-124))+r13]
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	add	ebp,DWORD[((-120))+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	vmovdqu	YMMWORD[rsp],ymm8
++	vpshufb	ymm2,ymm2,ymm6
++	vpaddd	ymm9,ymm1,ymm11
++	add	eax,DWORD[((-116))+r13]
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	add	esi,DWORD[((-96))+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	add	edx,DWORD[((-92))+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	add	ecx,DWORD[((-88))+r13]
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[((-84))+r13]
++	mov	edi,esi
++	xor	edi,eax
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	and	ecx,edi
++	vmovdqu	YMMWORD[32+rsp],ymm9
++	vpshufb	ymm3,ymm3,ymm6
++	vpaddd	ymm6,ymm2,ymm11
++	add	ebp,DWORD[((-64))+r13]
++	xor	ecx,esi
++	mov	edi,edx
++	xor	edi,esi
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	and	ebx,edi
++	add	eax,DWORD[((-60))+r13]
++	xor	ebx,edx
++	mov	edi,ecx
++	xor	edi,edx
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	and	ebp,edi
++	add	esi,DWORD[((-56))+r13]
++	xor	ebp,ecx
++	mov	edi,ebx
++	xor	edi,ecx
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	and	eax,edi
++	add	edx,DWORD[((-52))+r13]
++	xor	eax,ebx
++	mov	edi,ebp
++	xor	edi,ebx
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	and	esi,edi
++	add	ecx,DWORD[((-32))+r13]
++	xor	esi,ebp
++	mov	edi,eax
++	xor	edi,ebp
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	and	edx,edi
++	jmp	NEAR $L$align32_3
++ALIGN	32
++$L$align32_3:
++	vmovdqu	YMMWORD[64+rsp],ymm6
++	vpaddd	ymm7,ymm3,ymm11
++	add	ebx,DWORD[((-28))+r13]
++	xor	edx,eax
++	mov	edi,esi
++	xor	edi,eax
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	and	ecx,edi
++	add	ebp,DWORD[((-24))+r13]
++	xor	ecx,esi
++	mov	edi,edx
++	xor	edi,esi
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	and	ebx,edi
++	add	eax,DWORD[((-20))+r13]
++	xor	ebx,edx
++	mov	edi,ecx
++	xor	edi,edx
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	and	ebp,edi
++	add	esi,DWORD[r13]
++	xor	ebp,ecx
++	mov	edi,ebx
++	xor	edi,ecx
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	and	eax,edi
++	add	edx,DWORD[4+r13]
++	xor	eax,ebx
++	mov	edi,ebp
++	xor	edi,ebx
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	and	esi,edi
++	vmovdqu	YMMWORD[96+rsp],ymm7
++	add	ecx,DWORD[8+r13]
++	xor	esi,ebp
++	mov	edi,eax
++	xor	edi,ebp
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	and	edx,edi
++	add	ebx,DWORD[12+r13]
++	xor	edx,eax
++	mov	edi,esi
++	xor	edi,eax
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	and	ecx,edi
++	add	ebp,DWORD[32+r13]
++	xor	ecx,esi
++	mov	edi,edx
++	xor	edi,esi
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	and	ebx,edi
++	add	eax,DWORD[36+r13]
++	xor	ebx,edx
++	mov	edi,ecx
++	xor	edi,edx
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	and	ebp,edi
++	add	esi,DWORD[40+r13]
++	xor	ebp,ecx
++	mov	edi,ebx
++	xor	edi,ecx
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	and	eax,edi
++	vpalignr	ymm4,ymm1,ymm0,8
++	add	edx,DWORD[44+r13]
++	xor	eax,ebx
++	mov	edi,ebp
++	xor	edi,ebx
++	vpsrldq	ymm8,ymm3,4
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	vpxor	ymm4,ymm4,ymm0
++	vpxor	ymm8,ymm8,ymm2
++	xor	esi,ebp
++	add	edx,r12d
++	vpxor	ymm4,ymm4,ymm8
++	and	esi,edi
++	add	ecx,DWORD[64+r13]
++	xor	esi,ebp
++	mov	edi,eax
++	vpsrld	ymm8,ymm4,31
++	xor	edi,ebp
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	vpslldq	ymm10,ymm4,12
++	vpaddd	ymm4,ymm4,ymm4
++	rorx	esi,edx,2
++	xor	edx,eax
++	vpsrld	ymm9,ymm10,30
++	vpor	ymm4,ymm4,ymm8
++	add	ecx,r12d
++	and	edx,edi
++	vpslld	ymm10,ymm10,2
++	vpxor	ymm4,ymm4,ymm9
++	add	ebx,DWORD[68+r13]
++	xor	edx,eax
++	vpxor	ymm4,ymm4,ymm10
++	mov	edi,esi
++	xor	edi,eax
++	lea	ebx,[rdx*1+rbx]
++	vpaddd	ymm9,ymm4,ymm11
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	vmovdqu	YMMWORD[128+rsp],ymm9
++	add	ebx,r12d
++	and	ecx,edi
++	add	ebp,DWORD[72+r13]
++	xor	ecx,esi
++	mov	edi,edx
++	xor	edi,esi
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	and	ebx,edi
++	add	eax,DWORD[76+r13]
++	xor	ebx,edx
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	vpalignr	ymm5,ymm2,ymm1,8
++	add	esi,DWORD[96+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	vpsrldq	ymm8,ymm4,4
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	vpxor	ymm5,ymm5,ymm1
++	vpxor	ymm8,ymm8,ymm3
++	add	edx,DWORD[100+r13]
++	lea	edx,[rax*1+rdx]
++	vpxor	ymm5,ymm5,ymm8
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	xor	esi,ebp
++	add	edx,r12d
++	vpsrld	ymm8,ymm5,31
++	vmovdqu	ymm11,YMMWORD[((-32))+r11]
++	xor	esi,ebx
++	add	ecx,DWORD[104+r13]
++	lea	ecx,[rsi*1+rcx]
++	vpslldq	ymm10,ymm5,12
++	vpaddd	ymm5,ymm5,ymm5
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	vpsrld	ymm9,ymm10,30
++	vpor	ymm5,ymm5,ymm8
++	xor	edx,eax
++	add	ecx,r12d
++	vpslld	ymm10,ymm10,2
++	vpxor	ymm5,ymm5,ymm9
++	xor	edx,ebp
++	add	ebx,DWORD[108+r13]
++	lea	r13,[256+r13]
++	vpxor	ymm5,ymm5,ymm10
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	vpaddd	ymm9,ymm5,ymm11
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	vmovdqu	YMMWORD[160+rsp],ymm9
++	add	ebp,DWORD[((-128))+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	vpalignr	ymm6,ymm3,ymm2,8
++	add	eax,DWORD[((-124))+r13]
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	vpsrldq	ymm8,ymm5,4
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	vpxor	ymm6,ymm6,ymm2
++	vpxor	ymm8,ymm8,ymm4
++	add	esi,DWORD[((-120))+r13]
++	lea	esi,[rbp*1+rsi]
++	vpxor	ymm6,ymm6,ymm8
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	vpsrld	ymm8,ymm6,31
++	xor	eax,ecx
++	add	edx,DWORD[((-116))+r13]
++	lea	edx,[rax*1+rdx]
++	vpslldq	ymm10,ymm6,12
++	vpaddd	ymm6,ymm6,ymm6
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	vpsrld	ymm9,ymm10,30
++	vpor	ymm6,ymm6,ymm8
++	xor	esi,ebp
++	add	edx,r12d
++	vpslld	ymm10,ymm10,2
++	vpxor	ymm6,ymm6,ymm9
++	xor	esi,ebx
++	add	ecx,DWORD[((-96))+r13]
++	vpxor	ymm6,ymm6,ymm10
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	vpaddd	ymm9,ymm6,ymm11
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	vmovdqu	YMMWORD[192+rsp],ymm9
++	add	ebx,DWORD[((-92))+r13]
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	vpalignr	ymm7,ymm4,ymm3,8
++	add	ebp,DWORD[((-88))+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	vpsrldq	ymm8,ymm6,4
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	vpxor	ymm7,ymm7,ymm3
++	vpxor	ymm8,ymm8,ymm5
++	add	eax,DWORD[((-84))+r13]
++	lea	eax,[rbx*1+rax]
++	vpxor	ymm7,ymm7,ymm8
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	vpsrld	ymm8,ymm7,31
++	xor	ebp,edx
++	add	esi,DWORD[((-64))+r13]
++	lea	esi,[rbp*1+rsi]
++	vpslldq	ymm10,ymm7,12
++	vpaddd	ymm7,ymm7,ymm7
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	vpsrld	ymm9,ymm10,30
++	vpor	ymm7,ymm7,ymm8
++	xor	eax,ebx
++	add	esi,r12d
++	vpslld	ymm10,ymm10,2
++	vpxor	ymm7,ymm7,ymm9
++	xor	eax,ecx
++	add	edx,DWORD[((-60))+r13]
++	vpxor	ymm7,ymm7,ymm10
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	rorx	eax,esi,2
++	vpaddd	ymm9,ymm7,ymm11
++	xor	esi,ebp
++	add	edx,r12d
++	xor	esi,ebx
++	vmovdqu	YMMWORD[224+rsp],ymm9
++	add	ecx,DWORD[((-56))+r13]
++	lea	ecx,[rsi*1+rcx]
++	rorx	r12d,edx,27
++	rorx	esi,edx,2
++	xor	edx,eax
++	add	ecx,r12d
++	xor	edx,ebp
++	add	ebx,DWORD[((-52))+r13]
++	lea	ebx,[rdx*1+rbx]
++	rorx	r12d,ecx,27
++	rorx	edx,ecx,2
++	xor	ecx,esi
++	add	ebx,r12d
++	xor	ecx,eax
++	add	ebp,DWORD[((-32))+r13]
++	lea	ebp,[rbp*1+rcx]
++	rorx	r12d,ebx,27
++	rorx	ecx,ebx,2
++	xor	ebx,edx
++	add	ebp,r12d
++	xor	ebx,esi
++	add	eax,DWORD[((-28))+r13]
++	lea	eax,[rbx*1+rax]
++	rorx	r12d,ebp,27
++	rorx	ebx,ebp,2
++	xor	ebp,ecx
++	add	eax,r12d
++	xor	ebp,edx
++	add	esi,DWORD[((-24))+r13]
++	lea	esi,[rbp*1+rsi]
++	rorx	r12d,eax,27
++	rorx	ebp,eax,2
++	xor	eax,ebx
++	add	esi,r12d
++	xor	eax,ecx
++	add	edx,DWORD[((-20))+r13]
++	lea	edx,[rax*1+rdx]
++	rorx	r12d,esi,27
++	add	edx,r12d
++	lea	r13,[128+rsp]
++
++
++	add	edx,DWORD[r8]
++	add	esi,DWORD[4+r8]
++	add	ebp,DWORD[8+r8]
++	mov	DWORD[r8],edx
++	add	ebx,DWORD[12+r8]
++	mov	DWORD[4+r8],esi
++	mov	eax,edx
++	add	ecx,DWORD[16+r8]
++	mov	r12d,ebp
++	mov	DWORD[8+r8],ebp
++	mov	edx,ebx
++
++	mov	DWORD[12+r8],ebx
++	mov	ebp,esi
++	mov	DWORD[16+r8],ecx
++
++	mov	esi,ecx
++	mov	ecx,r12d
++
++
++	cmp	r9,r10
++	jbe	NEAR $L$oop_avx2
++
++$L$done_avx2:
++	vzeroupper
++	movaps	xmm6,XMMWORD[((-40-96))+r14]
++	movaps	xmm7,XMMWORD[((-40-80))+r14]
++	movaps	xmm8,XMMWORD[((-40-64))+r14]
++	movaps	xmm9,XMMWORD[((-40-48))+r14]
++	movaps	xmm10,XMMWORD[((-40-32))+r14]
++	movaps	xmm11,XMMWORD[((-40-16))+r14]
++	lea	rsi,[r14]
++	mov	r14,QWORD[((-40))+rsi]
++	mov	r13,QWORD[((-32))+rsi]
++	mov	r12,QWORD[((-24))+rsi]
++	mov	rbp,QWORD[((-16))+rsi]
++	mov	rbx,QWORD[((-8))+rsi]
++	lea	rsp,[rsi]
++$L$epilogue_avx2:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha1_block_data_order_avx2:
++ALIGN	64
++K_XX_XX:
++	DD	0x5a827999,0x5a827999,0x5a827999,0x5a827999
++	DD	0x5a827999,0x5a827999,0x5a827999,0x5a827999
++	DD	0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1
++	DD	0x6ed9eba1,0x6ed9eba1,0x6ed9eba1,0x6ed9eba1
++	DD	0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc
++	DD	0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc,0x8f1bbcdc
++	DD	0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6
++	DD	0xca62c1d6,0xca62c1d6,0xca62c1d6,0xca62c1d6
++	DD	0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f
++	DD	0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f
++DB	0xf,0xe,0xd,0xc,0xb,0xa,0x9,0x8,0x7,0x6,0x5,0x4,0x3,0x2,0x1,0x0
++DB	83,72,65,49,32,98,108,111,99,107,32,116,114,97,110,115
++DB	102,111,114,109,32,102,111,114,32,120,56,54,95,54,52,44
++DB	32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60
++DB	97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114
++DB	103,62,0
++ALIGN	64
++EXTERN	__imp_RtlVirtualUnwind
++
++ALIGN	16
++se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	lea	r10,[$L$prologue]
++	cmp	rbx,r10
++	jb	NEAR $L$common_seh_tail
++
++	mov	rax,QWORD[152+r8]
++
++	lea	r10,[$L$epilogue]
++	cmp	rbx,r10
++	jae	NEAR $L$common_seh_tail
++
++	mov	rax,QWORD[64+rax]
++
++	mov	rbx,QWORD[((-8))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	r13,QWORD[((-32))+rax]
++	mov	r14,QWORD[((-40))+rax]
++	mov	QWORD[144+r8],rbx
++	mov	QWORD[160+r8],rbp
++	mov	QWORD[216+r8],r12
++	mov	QWORD[224+r8],r13
++	mov	QWORD[232+r8],r14
++
++	jmp	NEAR $L$common_seh_tail
++
++
++ALIGN	16
++shaext_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	lea	r10,[$L$prologue_shaext]
++	cmp	rbx,r10
++	jb	NEAR $L$common_seh_tail
++
++	lea	r10,[$L$epilogue_shaext]
++	cmp	rbx,r10
++	jae	NEAR $L$common_seh_tail
++
++	lea	rsi,[((-8-64))+rax]
++	lea	rdi,[512+r8]
++	mov	ecx,8
++	DD	0xa548f3fc
++
++	jmp	NEAR $L$common_seh_tail
++
++
++ALIGN	16
++ssse3_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$common_seh_tail
++
++	mov	rax,QWORD[152+r8]
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$common_seh_tail
++
++	mov	rax,QWORD[232+r8]
++
++	lea	rsi,[((-40-96))+rax]
++	lea	rdi,[512+r8]
++	mov	ecx,12
++	DD	0xa548f3fc
++
++	mov	rbx,QWORD[((-8))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	r13,QWORD[((-32))+rax]
++	mov	r14,QWORD[((-40))+rax]
++	mov	QWORD[144+r8],rbx
++	mov	QWORD[160+r8],rbp
++	mov	QWORD[216+r8],r12
++	mov	QWORD[224+r8],r13
++	mov	QWORD[232+r8],r14
++
++$L$common_seh_tail:
++	mov	rdi,QWORD[8+rax]
++	mov	rsi,QWORD[16+rax]
++	mov	QWORD[152+r8],rax
++	mov	QWORD[168+r8],rsi
++	mov	QWORD[176+r8],rdi
++
++	mov	rdi,QWORD[40+r9]
++	mov	rsi,r8
++	mov	ecx,154
++	DD	0xa548f3fc
++
++	mov	rsi,r9
++	xor	rcx,rcx
++	mov	rdx,QWORD[8+rsi]
++	mov	r8,QWORD[rsi]
++	mov	r9,QWORD[16+rsi]
++	mov	r10,QWORD[40+rsi]
++	lea	r11,[56+rsi]
++	lea	r12,[24+rsi]
++	mov	QWORD[32+rsp],r10
++	mov	QWORD[40+rsp],r11
++	mov	QWORD[48+rsp],r12
++	mov	QWORD[56+rsp],rcx
++	call	QWORD[__imp_RtlVirtualUnwind]
++
++	mov	eax,1
++	add	rsp,64
++	popfq
++	pop	r15
++	pop	r14
++	pop	r13
++	pop	r12
++	pop	rbp
++	pop	rbx
++	pop	rdi
++	pop	rsi
++	DB	0F3h,0C3h		;repret
++
++
++section	.pdata rdata align=4
++ALIGN	4
++	DD	$L$SEH_begin_sha1_block_data_order wrt ..imagebase
++	DD	$L$SEH_end_sha1_block_data_order wrt ..imagebase
++	DD	$L$SEH_info_sha1_block_data_order wrt ..imagebase
++	DD	$L$SEH_begin_sha1_block_data_order_shaext wrt ..imagebase
++	DD	$L$SEH_end_sha1_block_data_order_shaext wrt ..imagebase
++	DD	$L$SEH_info_sha1_block_data_order_shaext wrt ..imagebase
++	DD	$L$SEH_begin_sha1_block_data_order_ssse3 wrt ..imagebase
++	DD	$L$SEH_end_sha1_block_data_order_ssse3 wrt ..imagebase
++	DD	$L$SEH_info_sha1_block_data_order_ssse3 wrt ..imagebase
++	DD	$L$SEH_begin_sha1_block_data_order_avx wrt ..imagebase
++	DD	$L$SEH_end_sha1_block_data_order_avx wrt ..imagebase
++	DD	$L$SEH_info_sha1_block_data_order_avx wrt ..imagebase
++	DD	$L$SEH_begin_sha1_block_data_order_avx2 wrt ..imagebase
++	DD	$L$SEH_end_sha1_block_data_order_avx2 wrt ..imagebase
++	DD	$L$SEH_info_sha1_block_data_order_avx2 wrt ..imagebase
++section	.xdata rdata align=8
++ALIGN	8
++$L$SEH_info_sha1_block_data_order:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++$L$SEH_info_sha1_block_data_order_shaext:
++DB	9,0,0,0
++	DD	shaext_handler wrt ..imagebase
++$L$SEH_info_sha1_block_data_order_ssse3:
++DB	9,0,0,0
++	DD	ssse3_handler wrt ..imagebase
++	DD	$L$prologue_ssse3 wrt ..imagebase,$L$epilogue_ssse3 wrt ..imagebase
++$L$SEH_info_sha1_block_data_order_avx:
++DB	9,0,0,0
++	DD	ssse3_handler wrt ..imagebase
++	DD	$L$prologue_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase
++$L$SEH_info_sha1_block_data_order_avx2:
++DB	9,0,0,0
++	DD	ssse3_handler wrt ..imagebase
++	DD	$L$prologue_avx2 wrt ..imagebase,$L$epilogue_avx2 wrt ..imagebase
+diff --git a/SMP/lib/accelerated/x86/coff/sha256-avx-x86_64.asm b/SMP/lib/accelerated/x86/coff/sha256-avx-x86_64.asm
+new file mode 100644
+index 0000000..217199a
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/sha256-avx-x86_64.asm
+@@ -0,0 +1,8209 @@
++default	rel
++%define XMMWORD
++%define YMMWORD
++%define ZMMWORD
++section	.text code align=64
++
++
++EXTERN	_gnutls_x86_cpuid_s
++
++global	sha256_multi_block
++
++ALIGN	32
++sha256_multi_block:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha256_multi_block:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	mov	rcx,QWORD[((_gnutls_x86_cpuid_s+4))]
++	bt	rcx,61
++	jc	NEAR _shaext_shortcut
++	test	ecx,268435456
++	jnz	NEAR _avx_shortcut
++	mov	rax,rsp
++	push	rbx
++	push	rbp
++	lea	rsp,[((-168))+rsp]
++	movaps	XMMWORD[rsp],xmm6
++	movaps	XMMWORD[16+rsp],xmm7
++	movaps	XMMWORD[32+rsp],xmm8
++	movaps	XMMWORD[48+rsp],xmm9
++	movaps	XMMWORD[(-120)+rax],xmm10
++	movaps	XMMWORD[(-104)+rax],xmm11
++	movaps	XMMWORD[(-88)+rax],xmm12
++	movaps	XMMWORD[(-72)+rax],xmm13
++	movaps	XMMWORD[(-56)+rax],xmm14
++	movaps	XMMWORD[(-40)+rax],xmm15
++	sub	rsp,288
++	and	rsp,-256
++	mov	QWORD[272+rsp],rax
++$L$body:
++	lea	rbp,[((K256+128))]
++	lea	rbx,[256+rsp]
++	lea	rdi,[128+rdi]
++
++$L$oop_grande:
++	mov	DWORD[280+rsp],edx
++	xor	edx,edx
++	mov	r8,QWORD[rsi]
++	mov	ecx,DWORD[8+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[rbx],ecx
++	cmovle	r8,rbp
++	mov	r9,QWORD[16+rsi]
++	mov	ecx,DWORD[24+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[4+rbx],ecx
++	cmovle	r9,rbp
++	mov	r10,QWORD[32+rsi]
++	mov	ecx,DWORD[40+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[8+rbx],ecx
++	cmovle	r10,rbp
++	mov	r11,QWORD[48+rsi]
++	mov	ecx,DWORD[56+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[12+rbx],ecx
++	cmovle	r11,rbp
++	test	edx,edx
++	jz	NEAR $L$done
++
++	movdqu	xmm8,XMMWORD[((0-128))+rdi]
++	lea	rax,[128+rsp]
++	movdqu	xmm9,XMMWORD[((32-128))+rdi]
++	movdqu	xmm10,XMMWORD[((64-128))+rdi]
++	movdqu	xmm11,XMMWORD[((96-128))+rdi]
++	movdqu	xmm12,XMMWORD[((128-128))+rdi]
++	movdqu	xmm13,XMMWORD[((160-128))+rdi]
++	movdqu	xmm14,XMMWORD[((192-128))+rdi]
++	movdqu	xmm15,XMMWORD[((224-128))+rdi]
++	movdqu	xmm6,XMMWORD[$L$pbswap]
++	jmp	NEAR $L$oop
++
++ALIGN	32
++$L$oop:
++	movdqa	xmm4,xmm10
++	pxor	xmm4,xmm9
++	movd	xmm5,DWORD[r8]
++	movd	xmm0,DWORD[r9]
++	movd	xmm1,DWORD[r10]
++	movd	xmm2,DWORD[r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm12
++DB	102,15,56,0,238
++	movdqa	xmm2,xmm12
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm12
++	pslld	xmm2,7
++	movdqa	XMMWORD[(0-128)+rax],xmm5
++	paddd	xmm5,xmm15
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-128))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm12
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm12
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm14
++	pand	xmm3,xmm13
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm8
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm8
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm9
++	movdqa	xmm7,xmm8
++	pslld	xmm2,10
++	pxor	xmm3,xmm8
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm15,xmm9
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm15,xmm4
++	paddd	xmm11,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm15,xmm5
++	paddd	xmm15,xmm7
++	movd	xmm5,DWORD[4+r8]
++	movd	xmm0,DWORD[4+r9]
++	movd	xmm1,DWORD[4+r10]
++	movd	xmm2,DWORD[4+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm11
++
++	movdqa	xmm2,xmm11
++DB	102,15,56,0,238
++	psrld	xmm7,6
++	movdqa	xmm1,xmm11
++	pslld	xmm2,7
++	movdqa	XMMWORD[(16-128)+rax],xmm5
++	paddd	xmm5,xmm14
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-96))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm11
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm11
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm13
++	pand	xmm4,xmm12
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm15
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm15
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm8
++	movdqa	xmm7,xmm15
++	pslld	xmm2,10
++	pxor	xmm4,xmm15
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm14,xmm8
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm14,xmm3
++	paddd	xmm10,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm14,xmm5
++	paddd	xmm14,xmm7
++	movd	xmm5,DWORD[8+r8]
++	movd	xmm0,DWORD[8+r9]
++	movd	xmm1,DWORD[8+r10]
++	movd	xmm2,DWORD[8+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm10
++DB	102,15,56,0,238
++	movdqa	xmm2,xmm10
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm10
++	pslld	xmm2,7
++	movdqa	XMMWORD[(32-128)+rax],xmm5
++	paddd	xmm5,xmm13
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-64))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm10
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm10
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm12
++	pand	xmm3,xmm11
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm14
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm14
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm15
++	movdqa	xmm7,xmm14
++	pslld	xmm2,10
++	pxor	xmm3,xmm14
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm13,xmm15
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm13,xmm4
++	paddd	xmm9,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm13,xmm5
++	paddd	xmm13,xmm7
++	movd	xmm5,DWORD[12+r8]
++	movd	xmm0,DWORD[12+r9]
++	movd	xmm1,DWORD[12+r10]
++	movd	xmm2,DWORD[12+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm9
++
++	movdqa	xmm2,xmm9
++DB	102,15,56,0,238
++	psrld	xmm7,6
++	movdqa	xmm1,xmm9
++	pslld	xmm2,7
++	movdqa	XMMWORD[(48-128)+rax],xmm5
++	paddd	xmm5,xmm12
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-32))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm9
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm9
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm11
++	pand	xmm4,xmm10
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm13
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm13
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm14
++	movdqa	xmm7,xmm13
++	pslld	xmm2,10
++	pxor	xmm4,xmm13
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm12,xmm14
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm12,xmm3
++	paddd	xmm8,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm12,xmm5
++	paddd	xmm12,xmm7
++	movd	xmm5,DWORD[16+r8]
++	movd	xmm0,DWORD[16+r9]
++	movd	xmm1,DWORD[16+r10]
++	movd	xmm2,DWORD[16+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm8
++DB	102,15,56,0,238
++	movdqa	xmm2,xmm8
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm8
++	pslld	xmm2,7
++	movdqa	XMMWORD[(64-128)+rax],xmm5
++	paddd	xmm5,xmm11
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm8
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm8
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm10
++	pand	xmm3,xmm9
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm12
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm12
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm13
++	movdqa	xmm7,xmm12
++	pslld	xmm2,10
++	pxor	xmm3,xmm12
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm11,xmm13
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm11,xmm4
++	paddd	xmm15,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm11,xmm5
++	paddd	xmm11,xmm7
++	movd	xmm5,DWORD[20+r8]
++	movd	xmm0,DWORD[20+r9]
++	movd	xmm1,DWORD[20+r10]
++	movd	xmm2,DWORD[20+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm15
++
++	movdqa	xmm2,xmm15
++DB	102,15,56,0,238
++	psrld	xmm7,6
++	movdqa	xmm1,xmm15
++	pslld	xmm2,7
++	movdqa	XMMWORD[(80-128)+rax],xmm5
++	paddd	xmm5,xmm10
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[32+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm15
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm15
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm9
++	pand	xmm4,xmm8
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm11
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm11
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm12
++	movdqa	xmm7,xmm11
++	pslld	xmm2,10
++	pxor	xmm4,xmm11
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm10,xmm12
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm10,xmm3
++	paddd	xmm14,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm10,xmm5
++	paddd	xmm10,xmm7
++	movd	xmm5,DWORD[24+r8]
++	movd	xmm0,DWORD[24+r9]
++	movd	xmm1,DWORD[24+r10]
++	movd	xmm2,DWORD[24+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm14
++DB	102,15,56,0,238
++	movdqa	xmm2,xmm14
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm14
++	pslld	xmm2,7
++	movdqa	XMMWORD[(96-128)+rax],xmm5
++	paddd	xmm5,xmm9
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[64+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm14
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm14
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm8
++	pand	xmm3,xmm15
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm10
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm10
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm11
++	movdqa	xmm7,xmm10
++	pslld	xmm2,10
++	pxor	xmm3,xmm10
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm9,xmm11
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm9,xmm4
++	paddd	xmm13,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm9,xmm5
++	paddd	xmm9,xmm7
++	movd	xmm5,DWORD[28+r8]
++	movd	xmm0,DWORD[28+r9]
++	movd	xmm1,DWORD[28+r10]
++	movd	xmm2,DWORD[28+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm13
++
++	movdqa	xmm2,xmm13
++DB	102,15,56,0,238
++	psrld	xmm7,6
++	movdqa	xmm1,xmm13
++	pslld	xmm2,7
++	movdqa	XMMWORD[(112-128)+rax],xmm5
++	paddd	xmm5,xmm8
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[96+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm13
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm13
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm15
++	pand	xmm4,xmm14
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm9
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm9
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm10
++	movdqa	xmm7,xmm9
++	pslld	xmm2,10
++	pxor	xmm4,xmm9
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm8,xmm10
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm8,xmm3
++	paddd	xmm12,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm8,xmm5
++	paddd	xmm8,xmm7
++	lea	rbp,[256+rbp]
++	movd	xmm5,DWORD[32+r8]
++	movd	xmm0,DWORD[32+r9]
++	movd	xmm1,DWORD[32+r10]
++	movd	xmm2,DWORD[32+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm12
++DB	102,15,56,0,238
++	movdqa	xmm2,xmm12
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm12
++	pslld	xmm2,7
++	movdqa	XMMWORD[(128-128)+rax],xmm5
++	paddd	xmm5,xmm15
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-128))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm12
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm12
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm14
++	pand	xmm3,xmm13
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm8
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm8
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm9
++	movdqa	xmm7,xmm8
++	pslld	xmm2,10
++	pxor	xmm3,xmm8
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm15,xmm9
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm15,xmm4
++	paddd	xmm11,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm15,xmm5
++	paddd	xmm15,xmm7
++	movd	xmm5,DWORD[36+r8]
++	movd	xmm0,DWORD[36+r9]
++	movd	xmm1,DWORD[36+r10]
++	movd	xmm2,DWORD[36+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm11
++
++	movdqa	xmm2,xmm11
++DB	102,15,56,0,238
++	psrld	xmm7,6
++	movdqa	xmm1,xmm11
++	pslld	xmm2,7
++	movdqa	XMMWORD[(144-128)+rax],xmm5
++	paddd	xmm5,xmm14
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-96))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm11
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm11
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm13
++	pand	xmm4,xmm12
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm15
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm15
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm8
++	movdqa	xmm7,xmm15
++	pslld	xmm2,10
++	pxor	xmm4,xmm15
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm14,xmm8
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm14,xmm3
++	paddd	xmm10,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm14,xmm5
++	paddd	xmm14,xmm7
++	movd	xmm5,DWORD[40+r8]
++	movd	xmm0,DWORD[40+r9]
++	movd	xmm1,DWORD[40+r10]
++	movd	xmm2,DWORD[40+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm10
++DB	102,15,56,0,238
++	movdqa	xmm2,xmm10
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm10
++	pslld	xmm2,7
++	movdqa	XMMWORD[(160-128)+rax],xmm5
++	paddd	xmm5,xmm13
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-64))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm10
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm10
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm12
++	pand	xmm3,xmm11
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm14
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm14
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm15
++	movdqa	xmm7,xmm14
++	pslld	xmm2,10
++	pxor	xmm3,xmm14
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm13,xmm15
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm13,xmm4
++	paddd	xmm9,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm13,xmm5
++	paddd	xmm13,xmm7
++	movd	xmm5,DWORD[44+r8]
++	movd	xmm0,DWORD[44+r9]
++	movd	xmm1,DWORD[44+r10]
++	movd	xmm2,DWORD[44+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm9
++
++	movdqa	xmm2,xmm9
++DB	102,15,56,0,238
++	psrld	xmm7,6
++	movdqa	xmm1,xmm9
++	pslld	xmm2,7
++	movdqa	XMMWORD[(176-128)+rax],xmm5
++	paddd	xmm5,xmm12
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-32))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm9
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm9
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm11
++	pand	xmm4,xmm10
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm13
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm13
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm14
++	movdqa	xmm7,xmm13
++	pslld	xmm2,10
++	pxor	xmm4,xmm13
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm12,xmm14
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm12,xmm3
++	paddd	xmm8,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm12,xmm5
++	paddd	xmm12,xmm7
++	movd	xmm5,DWORD[48+r8]
++	movd	xmm0,DWORD[48+r9]
++	movd	xmm1,DWORD[48+r10]
++	movd	xmm2,DWORD[48+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm8
++DB	102,15,56,0,238
++	movdqa	xmm2,xmm8
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm8
++	pslld	xmm2,7
++	movdqa	XMMWORD[(192-128)+rax],xmm5
++	paddd	xmm5,xmm11
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm8
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm8
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm10
++	pand	xmm3,xmm9
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm12
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm12
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm13
++	movdqa	xmm7,xmm12
++	pslld	xmm2,10
++	pxor	xmm3,xmm12
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm11,xmm13
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm11,xmm4
++	paddd	xmm15,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm11,xmm5
++	paddd	xmm11,xmm7
++	movd	xmm5,DWORD[52+r8]
++	movd	xmm0,DWORD[52+r9]
++	movd	xmm1,DWORD[52+r10]
++	movd	xmm2,DWORD[52+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm15
++
++	movdqa	xmm2,xmm15
++DB	102,15,56,0,238
++	psrld	xmm7,6
++	movdqa	xmm1,xmm15
++	pslld	xmm2,7
++	movdqa	XMMWORD[(208-128)+rax],xmm5
++	paddd	xmm5,xmm10
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[32+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm15
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm15
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm9
++	pand	xmm4,xmm8
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm11
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm11
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm12
++	movdqa	xmm7,xmm11
++	pslld	xmm2,10
++	pxor	xmm4,xmm11
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm10,xmm12
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm10,xmm3
++	paddd	xmm14,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm10,xmm5
++	paddd	xmm10,xmm7
++	movd	xmm5,DWORD[56+r8]
++	movd	xmm0,DWORD[56+r9]
++	movd	xmm1,DWORD[56+r10]
++	movd	xmm2,DWORD[56+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm14
++DB	102,15,56,0,238
++	movdqa	xmm2,xmm14
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm14
++	pslld	xmm2,7
++	movdqa	XMMWORD[(224-128)+rax],xmm5
++	paddd	xmm5,xmm9
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[64+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm14
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm14
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm8
++	pand	xmm3,xmm15
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm10
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm10
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm11
++	movdqa	xmm7,xmm10
++	pslld	xmm2,10
++	pxor	xmm3,xmm10
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm9,xmm11
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm9,xmm4
++	paddd	xmm13,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm9,xmm5
++	paddd	xmm9,xmm7
++	movd	xmm5,DWORD[60+r8]
++	lea	r8,[64+r8]
++	movd	xmm0,DWORD[60+r9]
++	lea	r9,[64+r9]
++	movd	xmm1,DWORD[60+r10]
++	lea	r10,[64+r10]
++	movd	xmm2,DWORD[60+r11]
++	lea	r11,[64+r11]
++	punpckldq	xmm5,xmm1
++	punpckldq	xmm0,xmm2
++	punpckldq	xmm5,xmm0
++	movdqa	xmm7,xmm13
++
++	movdqa	xmm2,xmm13
++DB	102,15,56,0,238
++	psrld	xmm7,6
++	movdqa	xmm1,xmm13
++	pslld	xmm2,7
++	movdqa	XMMWORD[(240-128)+rax],xmm5
++	paddd	xmm5,xmm8
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[96+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm13
++	prefetcht0	[63+r8]
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm13
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm15
++	pand	xmm4,xmm14
++	pxor	xmm7,xmm1
++
++	prefetcht0	[63+r9]
++	movdqa	xmm1,xmm9
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm9
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm10
++	movdqa	xmm7,xmm9
++	pslld	xmm2,10
++	pxor	xmm4,xmm9
++
++	prefetcht0	[63+r10]
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++	prefetcht0	[63+r11]
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm8,xmm10
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm8,xmm3
++	paddd	xmm12,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm8,xmm5
++	paddd	xmm8,xmm7
++	lea	rbp,[256+rbp]
++	movdqu	xmm5,XMMWORD[((0-128))+rax]
++	mov	ecx,3
++	jmp	NEAR $L$oop_16_xx
++ALIGN	32
++$L$oop_16_xx:
++	movdqa	xmm6,XMMWORD[((16-128))+rax]
++	paddd	xmm5,XMMWORD[((144-128))+rax]
++
++	movdqa	xmm7,xmm6
++	movdqa	xmm1,xmm6
++	psrld	xmm7,3
++	movdqa	xmm2,xmm6
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((224-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm3,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm3
++
++	psrld	xmm3,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	psrld	xmm3,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm3
++	pxor	xmm0,xmm1
++	paddd	xmm5,xmm0
++	movdqa	xmm7,xmm12
++
++	movdqa	xmm2,xmm12
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm12
++	pslld	xmm2,7
++	movdqa	XMMWORD[(0-128)+rax],xmm5
++	paddd	xmm5,xmm15
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-128))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm12
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm12
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm14
++	pand	xmm3,xmm13
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm8
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm8
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm9
++	movdqa	xmm7,xmm8
++	pslld	xmm2,10
++	pxor	xmm3,xmm8
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm15,xmm9
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm15,xmm4
++	paddd	xmm11,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm15,xmm5
++	paddd	xmm15,xmm7
++	movdqa	xmm5,XMMWORD[((32-128))+rax]
++	paddd	xmm6,XMMWORD[((160-128))+rax]
++
++	movdqa	xmm7,xmm5
++	movdqa	xmm1,xmm5
++	psrld	xmm7,3
++	movdqa	xmm2,xmm5
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((240-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm4,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm4
++
++	psrld	xmm4,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	psrld	xmm4,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm4
++	pxor	xmm0,xmm1
++	paddd	xmm6,xmm0
++	movdqa	xmm7,xmm11
++
++	movdqa	xmm2,xmm11
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm11
++	pslld	xmm2,7
++	movdqa	XMMWORD[(16-128)+rax],xmm6
++	paddd	xmm6,xmm14
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm6,XMMWORD[((-96))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm11
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm11
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm13
++	pand	xmm4,xmm12
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm15
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm15
++	psrld	xmm1,2
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm8
++	movdqa	xmm7,xmm15
++	pslld	xmm2,10
++	pxor	xmm4,xmm15
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm6,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm14,xmm8
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm14,xmm3
++	paddd	xmm10,xmm6
++	pxor	xmm7,xmm2
++
++	paddd	xmm14,xmm6
++	paddd	xmm14,xmm7
++	movdqa	xmm6,XMMWORD[((48-128))+rax]
++	paddd	xmm5,XMMWORD[((176-128))+rax]
++
++	movdqa	xmm7,xmm6
++	movdqa	xmm1,xmm6
++	psrld	xmm7,3
++	movdqa	xmm2,xmm6
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((0-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm3,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm3
++
++	psrld	xmm3,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	psrld	xmm3,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm3
++	pxor	xmm0,xmm1
++	paddd	xmm5,xmm0
++	movdqa	xmm7,xmm10
++
++	movdqa	xmm2,xmm10
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm10
++	pslld	xmm2,7
++	movdqa	XMMWORD[(32-128)+rax],xmm5
++	paddd	xmm5,xmm13
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-64))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm10
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm10
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm12
++	pand	xmm3,xmm11
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm14
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm14
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm15
++	movdqa	xmm7,xmm14
++	pslld	xmm2,10
++	pxor	xmm3,xmm14
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm13,xmm15
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm13,xmm4
++	paddd	xmm9,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm13,xmm5
++	paddd	xmm13,xmm7
++	movdqa	xmm5,XMMWORD[((64-128))+rax]
++	paddd	xmm6,XMMWORD[((192-128))+rax]
++
++	movdqa	xmm7,xmm5
++	movdqa	xmm1,xmm5
++	psrld	xmm7,3
++	movdqa	xmm2,xmm5
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((16-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm4,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm4
++
++	psrld	xmm4,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	psrld	xmm4,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm4
++	pxor	xmm0,xmm1
++	paddd	xmm6,xmm0
++	movdqa	xmm7,xmm9
++
++	movdqa	xmm2,xmm9
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm9
++	pslld	xmm2,7
++	movdqa	XMMWORD[(48-128)+rax],xmm6
++	paddd	xmm6,xmm12
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm6,XMMWORD[((-32))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm9
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm9
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm11
++	pand	xmm4,xmm10
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm13
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm13
++	psrld	xmm1,2
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm14
++	movdqa	xmm7,xmm13
++	pslld	xmm2,10
++	pxor	xmm4,xmm13
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm6,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm12,xmm14
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm12,xmm3
++	paddd	xmm8,xmm6
++	pxor	xmm7,xmm2
++
++	paddd	xmm12,xmm6
++	paddd	xmm12,xmm7
++	movdqa	xmm6,XMMWORD[((80-128))+rax]
++	paddd	xmm5,XMMWORD[((208-128))+rax]
++
++	movdqa	xmm7,xmm6
++	movdqa	xmm1,xmm6
++	psrld	xmm7,3
++	movdqa	xmm2,xmm6
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((32-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm3,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm3
++
++	psrld	xmm3,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	psrld	xmm3,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm3
++	pxor	xmm0,xmm1
++	paddd	xmm5,xmm0
++	movdqa	xmm7,xmm8
++
++	movdqa	xmm2,xmm8
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm8
++	pslld	xmm2,7
++	movdqa	XMMWORD[(64-128)+rax],xmm5
++	paddd	xmm5,xmm11
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm8
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm8
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm10
++	pand	xmm3,xmm9
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm12
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm12
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm13
++	movdqa	xmm7,xmm12
++	pslld	xmm2,10
++	pxor	xmm3,xmm12
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm11,xmm13
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm11,xmm4
++	paddd	xmm15,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm11,xmm5
++	paddd	xmm11,xmm7
++	movdqa	xmm5,XMMWORD[((96-128))+rax]
++	paddd	xmm6,XMMWORD[((224-128))+rax]
++
++	movdqa	xmm7,xmm5
++	movdqa	xmm1,xmm5
++	psrld	xmm7,3
++	movdqa	xmm2,xmm5
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((48-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm4,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm4
++
++	psrld	xmm4,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	psrld	xmm4,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm4
++	pxor	xmm0,xmm1
++	paddd	xmm6,xmm0
++	movdqa	xmm7,xmm15
++
++	movdqa	xmm2,xmm15
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm15
++	pslld	xmm2,7
++	movdqa	XMMWORD[(80-128)+rax],xmm6
++	paddd	xmm6,xmm10
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm6,XMMWORD[32+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm15
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm15
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm9
++	pand	xmm4,xmm8
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm11
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm11
++	psrld	xmm1,2
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm12
++	movdqa	xmm7,xmm11
++	pslld	xmm2,10
++	pxor	xmm4,xmm11
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm6,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm10,xmm12
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm10,xmm3
++	paddd	xmm14,xmm6
++	pxor	xmm7,xmm2
++
++	paddd	xmm10,xmm6
++	paddd	xmm10,xmm7
++	movdqa	xmm6,XMMWORD[((112-128))+rax]
++	paddd	xmm5,XMMWORD[((240-128))+rax]
++
++	movdqa	xmm7,xmm6
++	movdqa	xmm1,xmm6
++	psrld	xmm7,3
++	movdqa	xmm2,xmm6
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((64-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm3,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm3
++
++	psrld	xmm3,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	psrld	xmm3,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm3
++	pxor	xmm0,xmm1
++	paddd	xmm5,xmm0
++	movdqa	xmm7,xmm14
++
++	movdqa	xmm2,xmm14
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm14
++	pslld	xmm2,7
++	movdqa	XMMWORD[(96-128)+rax],xmm5
++	paddd	xmm5,xmm9
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[64+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm14
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm14
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm8
++	pand	xmm3,xmm15
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm10
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm10
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm11
++	movdqa	xmm7,xmm10
++	pslld	xmm2,10
++	pxor	xmm3,xmm10
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm9,xmm11
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm9,xmm4
++	paddd	xmm13,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm9,xmm5
++	paddd	xmm9,xmm7
++	movdqa	xmm5,XMMWORD[((128-128))+rax]
++	paddd	xmm6,XMMWORD[((0-128))+rax]
++
++	movdqa	xmm7,xmm5
++	movdqa	xmm1,xmm5
++	psrld	xmm7,3
++	movdqa	xmm2,xmm5
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((80-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm4,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm4
++
++	psrld	xmm4,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	psrld	xmm4,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm4
++	pxor	xmm0,xmm1
++	paddd	xmm6,xmm0
++	movdqa	xmm7,xmm13
++
++	movdqa	xmm2,xmm13
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm13
++	pslld	xmm2,7
++	movdqa	XMMWORD[(112-128)+rax],xmm6
++	paddd	xmm6,xmm8
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm6,XMMWORD[96+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm13
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm13
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm15
++	pand	xmm4,xmm14
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm9
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm9
++	psrld	xmm1,2
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm10
++	movdqa	xmm7,xmm9
++	pslld	xmm2,10
++	pxor	xmm4,xmm9
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm6,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm8,xmm10
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm8,xmm3
++	paddd	xmm12,xmm6
++	pxor	xmm7,xmm2
++
++	paddd	xmm8,xmm6
++	paddd	xmm8,xmm7
++	lea	rbp,[256+rbp]
++	movdqa	xmm6,XMMWORD[((144-128))+rax]
++	paddd	xmm5,XMMWORD[((16-128))+rax]
++
++	movdqa	xmm7,xmm6
++	movdqa	xmm1,xmm6
++	psrld	xmm7,3
++	movdqa	xmm2,xmm6
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((96-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm3,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm3
++
++	psrld	xmm3,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	psrld	xmm3,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm3
++	pxor	xmm0,xmm1
++	paddd	xmm5,xmm0
++	movdqa	xmm7,xmm12
++
++	movdqa	xmm2,xmm12
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm12
++	pslld	xmm2,7
++	movdqa	XMMWORD[(128-128)+rax],xmm5
++	paddd	xmm5,xmm15
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-128))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm12
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm12
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm14
++	pand	xmm3,xmm13
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm8
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm8
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm9
++	movdqa	xmm7,xmm8
++	pslld	xmm2,10
++	pxor	xmm3,xmm8
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm15,xmm9
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm15,xmm4
++	paddd	xmm11,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm15,xmm5
++	paddd	xmm15,xmm7
++	movdqa	xmm5,XMMWORD[((160-128))+rax]
++	paddd	xmm6,XMMWORD[((32-128))+rax]
++
++	movdqa	xmm7,xmm5
++	movdqa	xmm1,xmm5
++	psrld	xmm7,3
++	movdqa	xmm2,xmm5
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((112-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm4,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm4
++
++	psrld	xmm4,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	psrld	xmm4,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm4
++	pxor	xmm0,xmm1
++	paddd	xmm6,xmm0
++	movdqa	xmm7,xmm11
++
++	movdqa	xmm2,xmm11
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm11
++	pslld	xmm2,7
++	movdqa	XMMWORD[(144-128)+rax],xmm6
++	paddd	xmm6,xmm14
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm6,XMMWORD[((-96))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm11
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm11
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm13
++	pand	xmm4,xmm12
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm15
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm15
++	psrld	xmm1,2
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm8
++	movdqa	xmm7,xmm15
++	pslld	xmm2,10
++	pxor	xmm4,xmm15
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm6,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm14,xmm8
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm14,xmm3
++	paddd	xmm10,xmm6
++	pxor	xmm7,xmm2
++
++	paddd	xmm14,xmm6
++	paddd	xmm14,xmm7
++	movdqa	xmm6,XMMWORD[((176-128))+rax]
++	paddd	xmm5,XMMWORD[((48-128))+rax]
++
++	movdqa	xmm7,xmm6
++	movdqa	xmm1,xmm6
++	psrld	xmm7,3
++	movdqa	xmm2,xmm6
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((128-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm3,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm3
++
++	psrld	xmm3,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	psrld	xmm3,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm3
++	pxor	xmm0,xmm1
++	paddd	xmm5,xmm0
++	movdqa	xmm7,xmm10
++
++	movdqa	xmm2,xmm10
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm10
++	pslld	xmm2,7
++	movdqa	XMMWORD[(160-128)+rax],xmm5
++	paddd	xmm5,xmm13
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[((-64))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm10
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm10
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm12
++	pand	xmm3,xmm11
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm14
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm14
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm15
++	movdqa	xmm7,xmm14
++	pslld	xmm2,10
++	pxor	xmm3,xmm14
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm13,xmm15
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm13,xmm4
++	paddd	xmm9,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm13,xmm5
++	paddd	xmm13,xmm7
++	movdqa	xmm5,XMMWORD[((192-128))+rax]
++	paddd	xmm6,XMMWORD[((64-128))+rax]
++
++	movdqa	xmm7,xmm5
++	movdqa	xmm1,xmm5
++	psrld	xmm7,3
++	movdqa	xmm2,xmm5
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((144-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm4,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm4
++
++	psrld	xmm4,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	psrld	xmm4,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm4
++	pxor	xmm0,xmm1
++	paddd	xmm6,xmm0
++	movdqa	xmm7,xmm9
++
++	movdqa	xmm2,xmm9
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm9
++	pslld	xmm2,7
++	movdqa	XMMWORD[(176-128)+rax],xmm6
++	paddd	xmm6,xmm12
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm6,XMMWORD[((-32))+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm9
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm9
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm11
++	pand	xmm4,xmm10
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm13
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm13
++	psrld	xmm1,2
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm14
++	movdqa	xmm7,xmm13
++	pslld	xmm2,10
++	pxor	xmm4,xmm13
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm6,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm12,xmm14
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm12,xmm3
++	paddd	xmm8,xmm6
++	pxor	xmm7,xmm2
++
++	paddd	xmm12,xmm6
++	paddd	xmm12,xmm7
++	movdqa	xmm6,XMMWORD[((208-128))+rax]
++	paddd	xmm5,XMMWORD[((80-128))+rax]
++
++	movdqa	xmm7,xmm6
++	movdqa	xmm1,xmm6
++	psrld	xmm7,3
++	movdqa	xmm2,xmm6
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((160-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm3,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm3
++
++	psrld	xmm3,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	psrld	xmm3,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm3
++	pxor	xmm0,xmm1
++	paddd	xmm5,xmm0
++	movdqa	xmm7,xmm8
++
++	movdqa	xmm2,xmm8
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm8
++	pslld	xmm2,7
++	movdqa	XMMWORD[(192-128)+rax],xmm5
++	paddd	xmm5,xmm11
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm8
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm8
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm10
++	pand	xmm3,xmm9
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm12
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm12
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm13
++	movdqa	xmm7,xmm12
++	pslld	xmm2,10
++	pxor	xmm3,xmm12
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm11,xmm13
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm11,xmm4
++	paddd	xmm15,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm11,xmm5
++	paddd	xmm11,xmm7
++	movdqa	xmm5,XMMWORD[((224-128))+rax]
++	paddd	xmm6,XMMWORD[((96-128))+rax]
++
++	movdqa	xmm7,xmm5
++	movdqa	xmm1,xmm5
++	psrld	xmm7,3
++	movdqa	xmm2,xmm5
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((176-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm4,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm4
++
++	psrld	xmm4,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	psrld	xmm4,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm4
++	pxor	xmm0,xmm1
++	paddd	xmm6,xmm0
++	movdqa	xmm7,xmm15
++
++	movdqa	xmm2,xmm15
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm15
++	pslld	xmm2,7
++	movdqa	XMMWORD[(208-128)+rax],xmm6
++	paddd	xmm6,xmm10
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm6,XMMWORD[32+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm15
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm15
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm9
++	pand	xmm4,xmm8
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm11
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm11
++	psrld	xmm1,2
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm12
++	movdqa	xmm7,xmm11
++	pslld	xmm2,10
++	pxor	xmm4,xmm11
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm6,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm10,xmm12
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm10,xmm3
++	paddd	xmm14,xmm6
++	pxor	xmm7,xmm2
++
++	paddd	xmm10,xmm6
++	paddd	xmm10,xmm7
++	movdqa	xmm6,XMMWORD[((240-128))+rax]
++	paddd	xmm5,XMMWORD[((112-128))+rax]
++
++	movdqa	xmm7,xmm6
++	movdqa	xmm1,xmm6
++	psrld	xmm7,3
++	movdqa	xmm2,xmm6
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((192-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm3,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm3
++
++	psrld	xmm3,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	psrld	xmm3,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm3
++	pxor	xmm0,xmm1
++	paddd	xmm5,xmm0
++	movdqa	xmm7,xmm14
++
++	movdqa	xmm2,xmm14
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm14
++	pslld	xmm2,7
++	movdqa	XMMWORD[(224-128)+rax],xmm5
++	paddd	xmm5,xmm9
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm5,XMMWORD[64+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm14
++
++	pxor	xmm7,xmm2
++	movdqa	xmm3,xmm14
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm8
++	pand	xmm3,xmm15
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm10
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm10
++	psrld	xmm1,2
++	paddd	xmm5,xmm7
++	pxor	xmm0,xmm3
++	movdqa	xmm3,xmm11
++	movdqa	xmm7,xmm10
++	pslld	xmm2,10
++	pxor	xmm3,xmm10
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm5,xmm0
++	pslld	xmm2,19-10
++	pand	xmm4,xmm3
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm9,xmm11
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm9,xmm4
++	paddd	xmm13,xmm5
++	pxor	xmm7,xmm2
++
++	paddd	xmm9,xmm5
++	paddd	xmm9,xmm7
++	movdqa	xmm5,XMMWORD[((0-128))+rax]
++	paddd	xmm6,XMMWORD[((128-128))+rax]
++
++	movdqa	xmm7,xmm5
++	movdqa	xmm1,xmm5
++	psrld	xmm7,3
++	movdqa	xmm2,xmm5
++
++	psrld	xmm1,7
++	movdqa	xmm0,XMMWORD[((208-128))+rax]
++	pslld	xmm2,14
++	pxor	xmm7,xmm1
++	psrld	xmm1,18-7
++	movdqa	xmm4,xmm0
++	pxor	xmm7,xmm2
++	pslld	xmm2,25-14
++	pxor	xmm7,xmm1
++	psrld	xmm0,10
++	movdqa	xmm1,xmm4
++
++	psrld	xmm4,17
++	pxor	xmm7,xmm2
++	pslld	xmm1,13
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	psrld	xmm4,19-17
++	pxor	xmm0,xmm1
++	pslld	xmm1,15-13
++	pxor	xmm0,xmm4
++	pxor	xmm0,xmm1
++	paddd	xmm6,xmm0
++	movdqa	xmm7,xmm13
++
++	movdqa	xmm2,xmm13
++
++	psrld	xmm7,6
++	movdqa	xmm1,xmm13
++	pslld	xmm2,7
++	movdqa	XMMWORD[(240-128)+rax],xmm6
++	paddd	xmm6,xmm8
++
++	psrld	xmm1,11
++	pxor	xmm7,xmm2
++	pslld	xmm2,21-7
++	paddd	xmm6,XMMWORD[96+rbp]
++	pxor	xmm7,xmm1
++
++	psrld	xmm1,25-11
++	movdqa	xmm0,xmm13
++
++	pxor	xmm7,xmm2
++	movdqa	xmm4,xmm13
++	pslld	xmm2,26-21
++	pandn	xmm0,xmm15
++	pand	xmm4,xmm14
++	pxor	xmm7,xmm1
++
++
++	movdqa	xmm1,xmm9
++	pxor	xmm7,xmm2
++	movdqa	xmm2,xmm9
++	psrld	xmm1,2
++	paddd	xmm6,xmm7
++	pxor	xmm0,xmm4
++	movdqa	xmm4,xmm10
++	movdqa	xmm7,xmm9
++	pslld	xmm2,10
++	pxor	xmm4,xmm9
++
++
++	psrld	xmm7,13
++	pxor	xmm1,xmm2
++	paddd	xmm6,xmm0
++	pslld	xmm2,19-10
++	pand	xmm3,xmm4
++	pxor	xmm1,xmm7
++
++
++	psrld	xmm7,22-13
++	pxor	xmm1,xmm2
++	movdqa	xmm8,xmm10
++	pslld	xmm2,30-19
++	pxor	xmm7,xmm1
++	pxor	xmm8,xmm3
++	paddd	xmm12,xmm6
++	pxor	xmm7,xmm2
++
++	paddd	xmm8,xmm6
++	paddd	xmm8,xmm7
++	lea	rbp,[256+rbp]
++	dec	ecx
++	jnz	NEAR $L$oop_16_xx
++
++	mov	ecx,1
++	lea	rbp,[((K256+128))]
++
++	movdqa	xmm7,XMMWORD[rbx]
++	cmp	ecx,DWORD[rbx]
++	pxor	xmm0,xmm0
++	cmovge	r8,rbp
++	cmp	ecx,DWORD[4+rbx]
++	movdqa	xmm6,xmm7
++	cmovge	r9,rbp
++	cmp	ecx,DWORD[8+rbx]
++	pcmpgtd	xmm6,xmm0
++	cmovge	r10,rbp
++	cmp	ecx,DWORD[12+rbx]
++	paddd	xmm7,xmm6
++	cmovge	r11,rbp
++
++	movdqu	xmm0,XMMWORD[((0-128))+rdi]
++	pand	xmm8,xmm6
++	movdqu	xmm1,XMMWORD[((32-128))+rdi]
++	pand	xmm9,xmm6
++	movdqu	xmm2,XMMWORD[((64-128))+rdi]
++	pand	xmm10,xmm6
++	movdqu	xmm5,XMMWORD[((96-128))+rdi]
++	pand	xmm11,xmm6
++	paddd	xmm8,xmm0
++	movdqu	xmm0,XMMWORD[((128-128))+rdi]
++	pand	xmm12,xmm6
++	paddd	xmm9,xmm1
++	movdqu	xmm1,XMMWORD[((160-128))+rdi]
++	pand	xmm13,xmm6
++	paddd	xmm10,xmm2
++	movdqu	xmm2,XMMWORD[((192-128))+rdi]
++	pand	xmm14,xmm6
++	paddd	xmm11,xmm5
++	movdqu	xmm5,XMMWORD[((224-128))+rdi]
++	pand	xmm15,xmm6
++	paddd	xmm12,xmm0
++	paddd	xmm13,xmm1
++	movdqu	XMMWORD[(0-128)+rdi],xmm8
++	paddd	xmm14,xmm2
++	movdqu	XMMWORD[(32-128)+rdi],xmm9
++	paddd	xmm15,xmm5
++	movdqu	XMMWORD[(64-128)+rdi],xmm10
++	movdqu	XMMWORD[(96-128)+rdi],xmm11
++	movdqu	XMMWORD[(128-128)+rdi],xmm12
++	movdqu	XMMWORD[(160-128)+rdi],xmm13
++	movdqu	XMMWORD[(192-128)+rdi],xmm14
++	movdqu	XMMWORD[(224-128)+rdi],xmm15
++
++	movdqa	XMMWORD[rbx],xmm7
++	movdqa	xmm6,XMMWORD[$L$pbswap]
++	dec	edx
++	jnz	NEAR $L$oop
++
++	mov	edx,DWORD[280+rsp]
++	lea	rdi,[16+rdi]
++	lea	rsi,[64+rsi]
++	dec	edx
++	jnz	NEAR $L$oop_grande
++
++$L$done:
++	mov	rax,QWORD[272+rsp]
++	movaps	xmm6,XMMWORD[((-184))+rax]
++	movaps	xmm7,XMMWORD[((-168))+rax]
++	movaps	xmm8,XMMWORD[((-152))+rax]
++	movaps	xmm9,XMMWORD[((-136))+rax]
++	movaps	xmm10,XMMWORD[((-120))+rax]
++	movaps	xmm11,XMMWORD[((-104))+rax]
++	movaps	xmm12,XMMWORD[((-88))+rax]
++	movaps	xmm13,XMMWORD[((-72))+rax]
++	movaps	xmm14,XMMWORD[((-56))+rax]
++	movaps	xmm15,XMMWORD[((-40))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	rbx,QWORD[((-8))+rax]
++	lea	rsp,[rax]
++$L$epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha256_multi_block:
++
++ALIGN	32
++sha256_multi_block_shaext:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha256_multi_block_shaext:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++_shaext_shortcut:
++	mov	rax,rsp
++	push	rbx
++	push	rbp
++	lea	rsp,[((-168))+rsp]
++	movaps	XMMWORD[rsp],xmm6
++	movaps	XMMWORD[16+rsp],xmm7
++	movaps	XMMWORD[32+rsp],xmm8
++	movaps	XMMWORD[48+rsp],xmm9
++	movaps	XMMWORD[(-120)+rax],xmm10
++	movaps	XMMWORD[(-104)+rax],xmm11
++	movaps	XMMWORD[(-88)+rax],xmm12
++	movaps	XMMWORD[(-72)+rax],xmm13
++	movaps	XMMWORD[(-56)+rax],xmm14
++	movaps	XMMWORD[(-40)+rax],xmm15
++	sub	rsp,288
++	shl	edx,1
++	and	rsp,-256
++	lea	rdi,[128+rdi]
++	mov	QWORD[272+rsp],rax
++$L$body_shaext:
++	lea	rbx,[256+rsp]
++	lea	rbp,[((K256_shaext+128))]
++
++$L$oop_grande_shaext:
++	mov	DWORD[280+rsp],edx
++	xor	edx,edx
++	mov	r8,QWORD[rsi]
++	mov	ecx,DWORD[8+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[rbx],ecx
++	cmovle	r8,rsp
++	mov	r9,QWORD[16+rsi]
++	mov	ecx,DWORD[24+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[4+rbx],ecx
++	cmovle	r9,rsp
++	test	edx,edx
++	jz	NEAR $L$done_shaext
++
++	movq	xmm12,QWORD[((0-128))+rdi]
++	movq	xmm4,QWORD[((32-128))+rdi]
++	movq	xmm13,QWORD[((64-128))+rdi]
++	movq	xmm5,QWORD[((96-128))+rdi]
++	movq	xmm8,QWORD[((128-128))+rdi]
++	movq	xmm9,QWORD[((160-128))+rdi]
++	movq	xmm10,QWORD[((192-128))+rdi]
++	movq	xmm11,QWORD[((224-128))+rdi]
++
++	punpckldq	xmm12,xmm4
++	punpckldq	xmm13,xmm5
++	punpckldq	xmm8,xmm9
++	punpckldq	xmm10,xmm11
++	movdqa	xmm3,XMMWORD[((K256_shaext-16))]
++
++	movdqa	xmm14,xmm12
++	movdqa	xmm15,xmm13
++	punpcklqdq	xmm12,xmm8
++	punpcklqdq	xmm13,xmm10
++	punpckhqdq	xmm14,xmm8
++	punpckhqdq	xmm15,xmm10
++
++	pshufd	xmm12,xmm12,27
++	pshufd	xmm13,xmm13,27
++	pshufd	xmm14,xmm14,27
++	pshufd	xmm15,xmm15,27
++	jmp	NEAR $L$oop_shaext
++
++ALIGN	32
++$L$oop_shaext:
++	movdqu	xmm4,XMMWORD[r8]
++	movdqu	xmm8,XMMWORD[r9]
++	movdqu	xmm5,XMMWORD[16+r8]
++	movdqu	xmm9,XMMWORD[16+r9]
++	movdqu	xmm6,XMMWORD[32+r8]
++DB	102,15,56,0,227
++	movdqu	xmm10,XMMWORD[32+r9]
++DB	102,68,15,56,0,195
++	movdqu	xmm7,XMMWORD[48+r8]
++	lea	r8,[64+r8]
++	movdqu	xmm11,XMMWORD[48+r9]
++	lea	r9,[64+r9]
++
++	movdqa	xmm0,XMMWORD[((0-128))+rbp]
++DB	102,15,56,0,235
++	paddd	xmm0,xmm4
++	pxor	xmm4,xmm12
++	movdqa	xmm1,xmm0
++	movdqa	xmm2,XMMWORD[((0-128))+rbp]
++DB	102,68,15,56,0,203
++	paddd	xmm2,xmm8
++	movdqa	XMMWORD[80+rsp],xmm13
++DB	69,15,56,203,236
++	pxor	xmm8,xmm14
++	movdqa	xmm0,xmm2
++	movdqa	XMMWORD[112+rsp],xmm15
++DB	69,15,56,203,254
++	pshufd	xmm0,xmm1,0x0e
++	pxor	xmm4,xmm12
++	movdqa	XMMWORD[64+rsp],xmm12
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	pxor	xmm8,xmm14
++	movdqa	XMMWORD[96+rsp],xmm14
++	movdqa	xmm1,XMMWORD[((16-128))+rbp]
++	paddd	xmm1,xmm5
++DB	102,15,56,0,243
++DB	69,15,56,203,247
++
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((16-128))+rbp]
++	paddd	xmm2,xmm9
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	prefetcht0	[127+r8]
++DB	102,15,56,0,251
++DB	102,68,15,56,0,211
++	prefetcht0	[127+r9]
++DB	69,15,56,203,254
++	pshufd	xmm0,xmm1,0x0e
++DB	102,68,15,56,0,219
++DB	15,56,204,229
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((32-128))+rbp]
++	paddd	xmm1,xmm6
++DB	69,15,56,203,247
++
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((32-128))+rbp]
++	paddd	xmm2,xmm10
++DB	69,15,56,203,236
++DB	69,15,56,204,193
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm7
++DB	69,15,56,203,254
++	pshufd	xmm0,xmm1,0x0e
++DB	102,15,58,15,222,4
++	paddd	xmm4,xmm3
++	movdqa	xmm3,xmm11
++DB	102,65,15,58,15,218,4
++DB	15,56,204,238
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((48-128))+rbp]
++	paddd	xmm1,xmm7
++DB	69,15,56,203,247
++DB	69,15,56,204,202
++
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((48-128))+rbp]
++	paddd	xmm8,xmm3
++	paddd	xmm2,xmm11
++DB	15,56,205,231
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm4
++DB	102,15,58,15,223,4
++DB	69,15,56,203,254
++DB	69,15,56,205,195
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm5,xmm3
++	movdqa	xmm3,xmm8
++DB	102,65,15,58,15,219,4
++DB	15,56,204,247
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((64-128))+rbp]
++	paddd	xmm1,xmm4
++DB	69,15,56,203,247
++DB	69,15,56,204,211
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((64-128))+rbp]
++	paddd	xmm9,xmm3
++	paddd	xmm2,xmm8
++DB	15,56,205,236
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm5
++DB	102,15,58,15,220,4
++DB	69,15,56,203,254
++DB	69,15,56,205,200
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm6,xmm3
++	movdqa	xmm3,xmm9
++DB	102,65,15,58,15,216,4
++DB	15,56,204,252
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((80-128))+rbp]
++	paddd	xmm1,xmm5
++DB	69,15,56,203,247
++DB	69,15,56,204,216
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((80-128))+rbp]
++	paddd	xmm10,xmm3
++	paddd	xmm2,xmm9
++DB	15,56,205,245
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm6
++DB	102,15,58,15,221,4
++DB	69,15,56,203,254
++DB	69,15,56,205,209
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm7,xmm3
++	movdqa	xmm3,xmm10
++DB	102,65,15,58,15,217,4
++DB	15,56,204,229
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((96-128))+rbp]
++	paddd	xmm1,xmm6
++DB	69,15,56,203,247
++DB	69,15,56,204,193
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((96-128))+rbp]
++	paddd	xmm11,xmm3
++	paddd	xmm2,xmm10
++DB	15,56,205,254
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm7
++DB	102,15,58,15,222,4
++DB	69,15,56,203,254
++DB	69,15,56,205,218
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm4,xmm3
++	movdqa	xmm3,xmm11
++DB	102,65,15,58,15,218,4
++DB	15,56,204,238
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((112-128))+rbp]
++	paddd	xmm1,xmm7
++DB	69,15,56,203,247
++DB	69,15,56,204,202
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((112-128))+rbp]
++	paddd	xmm8,xmm3
++	paddd	xmm2,xmm11
++DB	15,56,205,231
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm4
++DB	102,15,58,15,223,4
++DB	69,15,56,203,254
++DB	69,15,56,205,195
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm5,xmm3
++	movdqa	xmm3,xmm8
++DB	102,65,15,58,15,219,4
++DB	15,56,204,247
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((128-128))+rbp]
++	paddd	xmm1,xmm4
++DB	69,15,56,203,247
++DB	69,15,56,204,211
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((128-128))+rbp]
++	paddd	xmm9,xmm3
++	paddd	xmm2,xmm8
++DB	15,56,205,236
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm5
++DB	102,15,58,15,220,4
++DB	69,15,56,203,254
++DB	69,15,56,205,200
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm6,xmm3
++	movdqa	xmm3,xmm9
++DB	102,65,15,58,15,216,4
++DB	15,56,204,252
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((144-128))+rbp]
++	paddd	xmm1,xmm5
++DB	69,15,56,203,247
++DB	69,15,56,204,216
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((144-128))+rbp]
++	paddd	xmm10,xmm3
++	paddd	xmm2,xmm9
++DB	15,56,205,245
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm6
++DB	102,15,58,15,221,4
++DB	69,15,56,203,254
++DB	69,15,56,205,209
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm7,xmm3
++	movdqa	xmm3,xmm10
++DB	102,65,15,58,15,217,4
++DB	15,56,204,229
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((160-128))+rbp]
++	paddd	xmm1,xmm6
++DB	69,15,56,203,247
++DB	69,15,56,204,193
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((160-128))+rbp]
++	paddd	xmm11,xmm3
++	paddd	xmm2,xmm10
++DB	15,56,205,254
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm7
++DB	102,15,58,15,222,4
++DB	69,15,56,203,254
++DB	69,15,56,205,218
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm4,xmm3
++	movdqa	xmm3,xmm11
++DB	102,65,15,58,15,218,4
++DB	15,56,204,238
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((176-128))+rbp]
++	paddd	xmm1,xmm7
++DB	69,15,56,203,247
++DB	69,15,56,204,202
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((176-128))+rbp]
++	paddd	xmm8,xmm3
++	paddd	xmm2,xmm11
++DB	15,56,205,231
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm4
++DB	102,15,58,15,223,4
++DB	69,15,56,203,254
++DB	69,15,56,205,195
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm5,xmm3
++	movdqa	xmm3,xmm8
++DB	102,65,15,58,15,219,4
++DB	15,56,204,247
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((192-128))+rbp]
++	paddd	xmm1,xmm4
++DB	69,15,56,203,247
++DB	69,15,56,204,211
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((192-128))+rbp]
++	paddd	xmm9,xmm3
++	paddd	xmm2,xmm8
++DB	15,56,205,236
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm5
++DB	102,15,58,15,220,4
++DB	69,15,56,203,254
++DB	69,15,56,205,200
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm6,xmm3
++	movdqa	xmm3,xmm9
++DB	102,65,15,58,15,216,4
++DB	15,56,204,252
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((208-128))+rbp]
++	paddd	xmm1,xmm5
++DB	69,15,56,203,247
++DB	69,15,56,204,216
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((208-128))+rbp]
++	paddd	xmm10,xmm3
++	paddd	xmm2,xmm9
++DB	15,56,205,245
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	movdqa	xmm3,xmm6
++DB	102,15,58,15,221,4
++DB	69,15,56,203,254
++DB	69,15,56,205,209
++	pshufd	xmm0,xmm1,0x0e
++	paddd	xmm7,xmm3
++	movdqa	xmm3,xmm10
++DB	102,65,15,58,15,217,4
++	nop
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm1,XMMWORD[((224-128))+rbp]
++	paddd	xmm1,xmm6
++DB	69,15,56,203,247
++
++	movdqa	xmm0,xmm1
++	movdqa	xmm2,XMMWORD[((224-128))+rbp]
++	paddd	xmm11,xmm3
++	paddd	xmm2,xmm10
++DB	15,56,205,254
++	nop
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	mov	ecx,1
++	pxor	xmm6,xmm6
++DB	69,15,56,203,254
++DB	69,15,56,205,218
++	pshufd	xmm0,xmm1,0x0e
++	movdqa	xmm1,XMMWORD[((240-128))+rbp]
++	paddd	xmm1,xmm7
++	movq	xmm7,QWORD[rbx]
++	nop
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	movdqa	xmm2,XMMWORD[((240-128))+rbp]
++	paddd	xmm2,xmm11
++DB	69,15,56,203,247
++
++	movdqa	xmm0,xmm1
++	cmp	ecx,DWORD[rbx]
++	cmovge	r8,rsp
++	cmp	ecx,DWORD[4+rbx]
++	cmovge	r9,rsp
++	pshufd	xmm9,xmm7,0x00
++DB	69,15,56,203,236
++	movdqa	xmm0,xmm2
++	pshufd	xmm10,xmm7,0x55
++	movdqa	xmm11,xmm7
++DB	69,15,56,203,254
++	pshufd	xmm0,xmm1,0x0e
++	pcmpgtd	xmm9,xmm6
++	pcmpgtd	xmm10,xmm6
++DB	69,15,56,203,229
++	pshufd	xmm0,xmm2,0x0e
++	pcmpgtd	xmm11,xmm6
++	movdqa	xmm3,XMMWORD[((K256_shaext-16))]
++DB	69,15,56,203,247
++
++	pand	xmm13,xmm9
++	pand	xmm15,xmm10
++	pand	xmm12,xmm9
++	pand	xmm14,xmm10
++	paddd	xmm11,xmm7
++
++	paddd	xmm13,XMMWORD[80+rsp]
++	paddd	xmm15,XMMWORD[112+rsp]
++	paddd	xmm12,XMMWORD[64+rsp]
++	paddd	xmm14,XMMWORD[96+rsp]
++
++	movq	QWORD[rbx],xmm11
++	dec	edx
++	jnz	NEAR $L$oop_shaext
++
++	mov	edx,DWORD[280+rsp]
++
++	pshufd	xmm12,xmm12,27
++	pshufd	xmm13,xmm13,27
++	pshufd	xmm14,xmm14,27
++	pshufd	xmm15,xmm15,27
++
++	movdqa	xmm5,xmm12
++	movdqa	xmm6,xmm13
++	punpckldq	xmm12,xmm14
++	punpckhdq	xmm5,xmm14
++	punpckldq	xmm13,xmm15
++	punpckhdq	xmm6,xmm15
++
++	movq	QWORD[(0-128)+rdi],xmm12
++	psrldq	xmm12,8
++	movq	QWORD[(128-128)+rdi],xmm5
++	psrldq	xmm5,8
++	movq	QWORD[(32-128)+rdi],xmm12
++	movq	QWORD[(160-128)+rdi],xmm5
++
++	movq	QWORD[(64-128)+rdi],xmm13
++	psrldq	xmm13,8
++	movq	QWORD[(192-128)+rdi],xmm6
++	psrldq	xmm6,8
++	movq	QWORD[(96-128)+rdi],xmm13
++	movq	QWORD[(224-128)+rdi],xmm6
++
++	lea	rdi,[8+rdi]
++	lea	rsi,[32+rsi]
++	dec	edx
++	jnz	NEAR $L$oop_grande_shaext
++
++$L$done_shaext:
++
++	movaps	xmm6,XMMWORD[((-184))+rax]
++	movaps	xmm7,XMMWORD[((-168))+rax]
++	movaps	xmm8,XMMWORD[((-152))+rax]
++	movaps	xmm9,XMMWORD[((-136))+rax]
++	movaps	xmm10,XMMWORD[((-120))+rax]
++	movaps	xmm11,XMMWORD[((-104))+rax]
++	movaps	xmm12,XMMWORD[((-88))+rax]
++	movaps	xmm13,XMMWORD[((-72))+rax]
++	movaps	xmm14,XMMWORD[((-56))+rax]
++	movaps	xmm15,XMMWORD[((-40))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	rbx,QWORD[((-8))+rax]
++	lea	rsp,[rax]
++$L$epilogue_shaext:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha256_multi_block_shaext:
++
++ALIGN	32
++sha256_multi_block_avx:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha256_multi_block_avx:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++_avx_shortcut:
++	shr	rcx,32
++	cmp	edx,2
++	jb	NEAR $L$avx
++	test	ecx,32
++	jnz	NEAR _avx2_shortcut
++	jmp	NEAR $L$avx
++ALIGN	32
++$L$avx:
++	mov	rax,rsp
++	push	rbx
++	push	rbp
++	lea	rsp,[((-168))+rsp]
++	movaps	XMMWORD[rsp],xmm6
++	movaps	XMMWORD[16+rsp],xmm7
++	movaps	XMMWORD[32+rsp],xmm8
++	movaps	XMMWORD[48+rsp],xmm9
++	movaps	XMMWORD[(-120)+rax],xmm10
++	movaps	XMMWORD[(-104)+rax],xmm11
++	movaps	XMMWORD[(-88)+rax],xmm12
++	movaps	XMMWORD[(-72)+rax],xmm13
++	movaps	XMMWORD[(-56)+rax],xmm14
++	movaps	XMMWORD[(-40)+rax],xmm15
++	sub	rsp,288
++	and	rsp,-256
++	mov	QWORD[272+rsp],rax
++$L$body_avx:
++	lea	rbp,[((K256+128))]
++	lea	rbx,[256+rsp]
++	lea	rdi,[128+rdi]
++
++$L$oop_grande_avx:
++	mov	DWORD[280+rsp],edx
++	xor	edx,edx
++	mov	r8,QWORD[rsi]
++	mov	ecx,DWORD[8+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[rbx],ecx
++	cmovle	r8,rbp
++	mov	r9,QWORD[16+rsi]
++	mov	ecx,DWORD[24+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[4+rbx],ecx
++	cmovle	r9,rbp
++	mov	r10,QWORD[32+rsi]
++	mov	ecx,DWORD[40+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[8+rbx],ecx
++	cmovle	r10,rbp
++	mov	r11,QWORD[48+rsi]
++	mov	ecx,DWORD[56+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[12+rbx],ecx
++	cmovle	r11,rbp
++	test	edx,edx
++	jz	NEAR $L$done_avx
++
++	vmovdqu	xmm8,XMMWORD[((0-128))+rdi]
++	lea	rax,[128+rsp]
++	vmovdqu	xmm9,XMMWORD[((32-128))+rdi]
++	vmovdqu	xmm10,XMMWORD[((64-128))+rdi]
++	vmovdqu	xmm11,XMMWORD[((96-128))+rdi]
++	vmovdqu	xmm12,XMMWORD[((128-128))+rdi]
++	vmovdqu	xmm13,XMMWORD[((160-128))+rdi]
++	vmovdqu	xmm14,XMMWORD[((192-128))+rdi]
++	vmovdqu	xmm15,XMMWORD[((224-128))+rdi]
++	vmovdqu	xmm6,XMMWORD[$L$pbswap]
++	jmp	NEAR $L$oop_avx
++
++ALIGN	32
++$L$oop_avx:
++	vpxor	xmm4,xmm10,xmm9
++	vmovd	xmm5,DWORD[r8]
++	vmovd	xmm0,DWORD[r9]
++	vpinsrd	xmm5,xmm5,DWORD[r10],1
++	vpinsrd	xmm0,xmm0,DWORD[r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm12,6
++	vpslld	xmm2,xmm12,26
++	vmovdqu	XMMWORD[(0-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm15
++
++	vpsrld	xmm1,xmm12,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm12,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-128))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm12,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm12,7
++	vpandn	xmm0,xmm12,xmm14
++	vpand	xmm3,xmm12,xmm13
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm15,xmm8,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm8,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm9,xmm8
++
++	vpxor	xmm15,xmm15,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm8,13
++
++	vpslld	xmm2,xmm8,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm15,xmm1
++
++	vpsrld	xmm1,xmm8,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm8,10
++	vpxor	xmm15,xmm9,xmm4
++	vpaddd	xmm11,xmm11,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm15,xmm15,xmm5
++	vpaddd	xmm15,xmm15,xmm7
++	vmovd	xmm5,DWORD[4+r8]
++	vmovd	xmm0,DWORD[4+r9]
++	vpinsrd	xmm5,xmm5,DWORD[4+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[4+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm11,6
++	vpslld	xmm2,xmm11,26
++	vmovdqu	XMMWORD[(16-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm14
++
++	vpsrld	xmm1,xmm11,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm11,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-96))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm11,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm11,7
++	vpandn	xmm0,xmm11,xmm13
++	vpand	xmm4,xmm11,xmm12
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm14,xmm15,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm15,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm8,xmm15
++
++	vpxor	xmm14,xmm14,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm15,13
++
++	vpslld	xmm2,xmm15,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm14,xmm1
++
++	vpsrld	xmm1,xmm15,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm15,10
++	vpxor	xmm14,xmm8,xmm3
++	vpaddd	xmm10,xmm10,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm14,xmm14,xmm5
++	vpaddd	xmm14,xmm14,xmm7
++	vmovd	xmm5,DWORD[8+r8]
++	vmovd	xmm0,DWORD[8+r9]
++	vpinsrd	xmm5,xmm5,DWORD[8+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[8+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm10,6
++	vpslld	xmm2,xmm10,26
++	vmovdqu	XMMWORD[(32-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm13
++
++	vpsrld	xmm1,xmm10,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm10,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-64))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm10,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm10,7
++	vpandn	xmm0,xmm10,xmm12
++	vpand	xmm3,xmm10,xmm11
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm13,xmm14,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm14,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm15,xmm14
++
++	vpxor	xmm13,xmm13,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm14,13
++
++	vpslld	xmm2,xmm14,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm13,xmm1
++
++	vpsrld	xmm1,xmm14,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm14,10
++	vpxor	xmm13,xmm15,xmm4
++	vpaddd	xmm9,xmm9,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm13,xmm13,xmm5
++	vpaddd	xmm13,xmm13,xmm7
++	vmovd	xmm5,DWORD[12+r8]
++	vmovd	xmm0,DWORD[12+r9]
++	vpinsrd	xmm5,xmm5,DWORD[12+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[12+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm9,6
++	vpslld	xmm2,xmm9,26
++	vmovdqu	XMMWORD[(48-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm12
++
++	vpsrld	xmm1,xmm9,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm9,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-32))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm9,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm9,7
++	vpandn	xmm0,xmm9,xmm11
++	vpand	xmm4,xmm9,xmm10
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm12,xmm13,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm13,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm14,xmm13
++
++	vpxor	xmm12,xmm12,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm13,13
++
++	vpslld	xmm2,xmm13,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm12,xmm1
++
++	vpsrld	xmm1,xmm13,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm13,10
++	vpxor	xmm12,xmm14,xmm3
++	vpaddd	xmm8,xmm8,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm12,xmm12,xmm5
++	vpaddd	xmm12,xmm12,xmm7
++	vmovd	xmm5,DWORD[16+r8]
++	vmovd	xmm0,DWORD[16+r9]
++	vpinsrd	xmm5,xmm5,DWORD[16+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[16+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm8,6
++	vpslld	xmm2,xmm8,26
++	vmovdqu	XMMWORD[(64-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm11
++
++	vpsrld	xmm1,xmm8,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm8,21
++	vpaddd	xmm5,xmm5,XMMWORD[rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm8,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm8,7
++	vpandn	xmm0,xmm8,xmm10
++	vpand	xmm3,xmm8,xmm9
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm11,xmm12,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm12,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm13,xmm12
++
++	vpxor	xmm11,xmm11,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm12,13
++
++	vpslld	xmm2,xmm12,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm11,xmm1
++
++	vpsrld	xmm1,xmm12,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm12,10
++	vpxor	xmm11,xmm13,xmm4
++	vpaddd	xmm15,xmm15,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm11,xmm11,xmm5
++	vpaddd	xmm11,xmm11,xmm7
++	vmovd	xmm5,DWORD[20+r8]
++	vmovd	xmm0,DWORD[20+r9]
++	vpinsrd	xmm5,xmm5,DWORD[20+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[20+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm15,6
++	vpslld	xmm2,xmm15,26
++	vmovdqu	XMMWORD[(80-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm10
++
++	vpsrld	xmm1,xmm15,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm15,21
++	vpaddd	xmm5,xmm5,XMMWORD[32+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm15,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm15,7
++	vpandn	xmm0,xmm15,xmm9
++	vpand	xmm4,xmm15,xmm8
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm10,xmm11,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm11,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm12,xmm11
++
++	vpxor	xmm10,xmm10,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm11,13
++
++	vpslld	xmm2,xmm11,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm10,xmm1
++
++	vpsrld	xmm1,xmm11,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm11,10
++	vpxor	xmm10,xmm12,xmm3
++	vpaddd	xmm14,xmm14,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm10,xmm10,xmm5
++	vpaddd	xmm10,xmm10,xmm7
++	vmovd	xmm5,DWORD[24+r8]
++	vmovd	xmm0,DWORD[24+r9]
++	vpinsrd	xmm5,xmm5,DWORD[24+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[24+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm14,6
++	vpslld	xmm2,xmm14,26
++	vmovdqu	XMMWORD[(96-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm9
++
++	vpsrld	xmm1,xmm14,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm14,21
++	vpaddd	xmm5,xmm5,XMMWORD[64+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm14,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm14,7
++	vpandn	xmm0,xmm14,xmm8
++	vpand	xmm3,xmm14,xmm15
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm9,xmm10,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm10,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm11,xmm10
++
++	vpxor	xmm9,xmm9,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm10,13
++
++	vpslld	xmm2,xmm10,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm9,xmm1
++
++	vpsrld	xmm1,xmm10,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm10,10
++	vpxor	xmm9,xmm11,xmm4
++	vpaddd	xmm13,xmm13,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm9,xmm9,xmm5
++	vpaddd	xmm9,xmm9,xmm7
++	vmovd	xmm5,DWORD[28+r8]
++	vmovd	xmm0,DWORD[28+r9]
++	vpinsrd	xmm5,xmm5,DWORD[28+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[28+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm13,6
++	vpslld	xmm2,xmm13,26
++	vmovdqu	XMMWORD[(112-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm8
++
++	vpsrld	xmm1,xmm13,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm13,21
++	vpaddd	xmm5,xmm5,XMMWORD[96+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm13,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm13,7
++	vpandn	xmm0,xmm13,xmm15
++	vpand	xmm4,xmm13,xmm14
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm8,xmm9,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm9,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm10,xmm9
++
++	vpxor	xmm8,xmm8,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm9,13
++
++	vpslld	xmm2,xmm9,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm8,xmm1
++
++	vpsrld	xmm1,xmm9,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm9,10
++	vpxor	xmm8,xmm10,xmm3
++	vpaddd	xmm12,xmm12,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm8,xmm8,xmm5
++	vpaddd	xmm8,xmm8,xmm7
++	add	rbp,256
++	vmovd	xmm5,DWORD[32+r8]
++	vmovd	xmm0,DWORD[32+r9]
++	vpinsrd	xmm5,xmm5,DWORD[32+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[32+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm12,6
++	vpslld	xmm2,xmm12,26
++	vmovdqu	XMMWORD[(128-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm15
++
++	vpsrld	xmm1,xmm12,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm12,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-128))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm12,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm12,7
++	vpandn	xmm0,xmm12,xmm14
++	vpand	xmm3,xmm12,xmm13
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm15,xmm8,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm8,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm9,xmm8
++
++	vpxor	xmm15,xmm15,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm8,13
++
++	vpslld	xmm2,xmm8,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm15,xmm1
++
++	vpsrld	xmm1,xmm8,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm8,10
++	vpxor	xmm15,xmm9,xmm4
++	vpaddd	xmm11,xmm11,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm15,xmm15,xmm5
++	vpaddd	xmm15,xmm15,xmm7
++	vmovd	xmm5,DWORD[36+r8]
++	vmovd	xmm0,DWORD[36+r9]
++	vpinsrd	xmm5,xmm5,DWORD[36+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[36+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm11,6
++	vpslld	xmm2,xmm11,26
++	vmovdqu	XMMWORD[(144-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm14
++
++	vpsrld	xmm1,xmm11,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm11,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-96))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm11,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm11,7
++	vpandn	xmm0,xmm11,xmm13
++	vpand	xmm4,xmm11,xmm12
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm14,xmm15,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm15,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm8,xmm15
++
++	vpxor	xmm14,xmm14,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm15,13
++
++	vpslld	xmm2,xmm15,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm14,xmm1
++
++	vpsrld	xmm1,xmm15,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm15,10
++	vpxor	xmm14,xmm8,xmm3
++	vpaddd	xmm10,xmm10,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm14,xmm14,xmm5
++	vpaddd	xmm14,xmm14,xmm7
++	vmovd	xmm5,DWORD[40+r8]
++	vmovd	xmm0,DWORD[40+r9]
++	vpinsrd	xmm5,xmm5,DWORD[40+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[40+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm10,6
++	vpslld	xmm2,xmm10,26
++	vmovdqu	XMMWORD[(160-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm13
++
++	vpsrld	xmm1,xmm10,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm10,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-64))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm10,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm10,7
++	vpandn	xmm0,xmm10,xmm12
++	vpand	xmm3,xmm10,xmm11
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm13,xmm14,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm14,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm15,xmm14
++
++	vpxor	xmm13,xmm13,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm14,13
++
++	vpslld	xmm2,xmm14,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm13,xmm1
++
++	vpsrld	xmm1,xmm14,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm14,10
++	vpxor	xmm13,xmm15,xmm4
++	vpaddd	xmm9,xmm9,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm13,xmm13,xmm5
++	vpaddd	xmm13,xmm13,xmm7
++	vmovd	xmm5,DWORD[44+r8]
++	vmovd	xmm0,DWORD[44+r9]
++	vpinsrd	xmm5,xmm5,DWORD[44+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[44+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm9,6
++	vpslld	xmm2,xmm9,26
++	vmovdqu	XMMWORD[(176-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm12
++
++	vpsrld	xmm1,xmm9,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm9,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-32))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm9,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm9,7
++	vpandn	xmm0,xmm9,xmm11
++	vpand	xmm4,xmm9,xmm10
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm12,xmm13,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm13,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm14,xmm13
++
++	vpxor	xmm12,xmm12,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm13,13
++
++	vpslld	xmm2,xmm13,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm12,xmm1
++
++	vpsrld	xmm1,xmm13,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm13,10
++	vpxor	xmm12,xmm14,xmm3
++	vpaddd	xmm8,xmm8,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm12,xmm12,xmm5
++	vpaddd	xmm12,xmm12,xmm7
++	vmovd	xmm5,DWORD[48+r8]
++	vmovd	xmm0,DWORD[48+r9]
++	vpinsrd	xmm5,xmm5,DWORD[48+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[48+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm8,6
++	vpslld	xmm2,xmm8,26
++	vmovdqu	XMMWORD[(192-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm11
++
++	vpsrld	xmm1,xmm8,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm8,21
++	vpaddd	xmm5,xmm5,XMMWORD[rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm8,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm8,7
++	vpandn	xmm0,xmm8,xmm10
++	vpand	xmm3,xmm8,xmm9
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm11,xmm12,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm12,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm13,xmm12
++
++	vpxor	xmm11,xmm11,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm12,13
++
++	vpslld	xmm2,xmm12,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm11,xmm1
++
++	vpsrld	xmm1,xmm12,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm12,10
++	vpxor	xmm11,xmm13,xmm4
++	vpaddd	xmm15,xmm15,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm11,xmm11,xmm5
++	vpaddd	xmm11,xmm11,xmm7
++	vmovd	xmm5,DWORD[52+r8]
++	vmovd	xmm0,DWORD[52+r9]
++	vpinsrd	xmm5,xmm5,DWORD[52+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[52+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm15,6
++	vpslld	xmm2,xmm15,26
++	vmovdqu	XMMWORD[(208-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm10
++
++	vpsrld	xmm1,xmm15,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm15,21
++	vpaddd	xmm5,xmm5,XMMWORD[32+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm15,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm15,7
++	vpandn	xmm0,xmm15,xmm9
++	vpand	xmm4,xmm15,xmm8
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm10,xmm11,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm11,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm12,xmm11
++
++	vpxor	xmm10,xmm10,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm11,13
++
++	vpslld	xmm2,xmm11,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm10,xmm1
++
++	vpsrld	xmm1,xmm11,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm11,10
++	vpxor	xmm10,xmm12,xmm3
++	vpaddd	xmm14,xmm14,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm10,xmm10,xmm5
++	vpaddd	xmm10,xmm10,xmm7
++	vmovd	xmm5,DWORD[56+r8]
++	vmovd	xmm0,DWORD[56+r9]
++	vpinsrd	xmm5,xmm5,DWORD[56+r10],1
++	vpinsrd	xmm0,xmm0,DWORD[56+r11],1
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm14,6
++	vpslld	xmm2,xmm14,26
++	vmovdqu	XMMWORD[(224-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm9
++
++	vpsrld	xmm1,xmm14,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm14,21
++	vpaddd	xmm5,xmm5,XMMWORD[64+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm14,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm14,7
++	vpandn	xmm0,xmm14,xmm8
++	vpand	xmm3,xmm14,xmm15
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm9,xmm10,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm10,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm11,xmm10
++
++	vpxor	xmm9,xmm9,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm10,13
++
++	vpslld	xmm2,xmm10,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm9,xmm1
++
++	vpsrld	xmm1,xmm10,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm10,10
++	vpxor	xmm9,xmm11,xmm4
++	vpaddd	xmm13,xmm13,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm9,xmm9,xmm5
++	vpaddd	xmm9,xmm9,xmm7
++	vmovd	xmm5,DWORD[60+r8]
++	lea	r8,[64+r8]
++	vmovd	xmm0,DWORD[60+r9]
++	lea	r9,[64+r9]
++	vpinsrd	xmm5,xmm5,DWORD[60+r10],1
++	lea	r10,[64+r10]
++	vpinsrd	xmm0,xmm0,DWORD[60+r11],1
++	lea	r11,[64+r11]
++	vpunpckldq	xmm5,xmm5,xmm0
++	vpshufb	xmm5,xmm5,xmm6
++	vpsrld	xmm7,xmm13,6
++	vpslld	xmm2,xmm13,26
++	vmovdqu	XMMWORD[(240-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm8
++
++	vpsrld	xmm1,xmm13,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm13,21
++	vpaddd	xmm5,xmm5,XMMWORD[96+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm13,25
++	vpxor	xmm7,xmm7,xmm2
++	prefetcht0	[63+r8]
++	vpslld	xmm2,xmm13,7
++	vpandn	xmm0,xmm13,xmm15
++	vpand	xmm4,xmm13,xmm14
++	prefetcht0	[63+r9]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm8,xmm9,2
++	vpxor	xmm7,xmm7,xmm2
++	prefetcht0	[63+r10]
++	vpslld	xmm1,xmm9,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm10,xmm9
++	prefetcht0	[63+r11]
++	vpxor	xmm8,xmm8,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm9,13
++
++	vpslld	xmm2,xmm9,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm8,xmm1
++
++	vpsrld	xmm1,xmm9,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm9,10
++	vpxor	xmm8,xmm10,xmm3
++	vpaddd	xmm12,xmm12,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm8,xmm8,xmm5
++	vpaddd	xmm8,xmm8,xmm7
++	add	rbp,256
++	vmovdqu	xmm5,XMMWORD[((0-128))+rax]
++	mov	ecx,3
++	jmp	NEAR $L$oop_16_xx_avx
++ALIGN	32
++$L$oop_16_xx_avx:
++	vmovdqu	xmm6,XMMWORD[((16-128))+rax]
++	vpaddd	xmm5,xmm5,XMMWORD[((144-128))+rax]
++
++	vpsrld	xmm7,xmm6,3
++	vpsrld	xmm1,xmm6,7
++	vpslld	xmm2,xmm6,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm6,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm6,14
++	vmovdqu	xmm0,XMMWORD[((224-128))+rax]
++	vpsrld	xmm3,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm5,xmm5,xmm7
++	vpxor	xmm7,xmm3,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm5,xmm5,xmm7
++	vpsrld	xmm7,xmm12,6
++	vpslld	xmm2,xmm12,26
++	vmovdqu	XMMWORD[(0-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm15
++
++	vpsrld	xmm1,xmm12,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm12,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-128))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm12,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm12,7
++	vpandn	xmm0,xmm12,xmm14
++	vpand	xmm3,xmm12,xmm13
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm15,xmm8,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm8,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm9,xmm8
++
++	vpxor	xmm15,xmm15,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm8,13
++
++	vpslld	xmm2,xmm8,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm15,xmm1
++
++	vpsrld	xmm1,xmm8,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm8,10
++	vpxor	xmm15,xmm9,xmm4
++	vpaddd	xmm11,xmm11,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm15,xmm15,xmm5
++	vpaddd	xmm15,xmm15,xmm7
++	vmovdqu	xmm5,XMMWORD[((32-128))+rax]
++	vpaddd	xmm6,xmm6,XMMWORD[((160-128))+rax]
++
++	vpsrld	xmm7,xmm5,3
++	vpsrld	xmm1,xmm5,7
++	vpslld	xmm2,xmm5,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm5,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm5,14
++	vmovdqu	xmm0,XMMWORD[((240-128))+rax]
++	vpsrld	xmm4,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm6,xmm6,xmm7
++	vpxor	xmm7,xmm4,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm6,xmm6,xmm7
++	vpsrld	xmm7,xmm11,6
++	vpslld	xmm2,xmm11,26
++	vmovdqu	XMMWORD[(16-128)+rax],xmm6
++	vpaddd	xmm6,xmm6,xmm14
++
++	vpsrld	xmm1,xmm11,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm11,21
++	vpaddd	xmm6,xmm6,XMMWORD[((-96))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm11,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm11,7
++	vpandn	xmm0,xmm11,xmm13
++	vpand	xmm4,xmm11,xmm12
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm14,xmm15,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm15,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm8,xmm15
++
++	vpxor	xmm14,xmm14,xmm1
++	vpaddd	xmm6,xmm6,xmm7
++
++	vpsrld	xmm1,xmm15,13
++
++	vpslld	xmm2,xmm15,19
++	vpaddd	xmm6,xmm6,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm14,xmm1
++
++	vpsrld	xmm1,xmm15,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm15,10
++	vpxor	xmm14,xmm8,xmm3
++	vpaddd	xmm10,xmm10,xmm6
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm14,xmm14,xmm6
++	vpaddd	xmm14,xmm14,xmm7
++	vmovdqu	xmm6,XMMWORD[((48-128))+rax]
++	vpaddd	xmm5,xmm5,XMMWORD[((176-128))+rax]
++
++	vpsrld	xmm7,xmm6,3
++	vpsrld	xmm1,xmm6,7
++	vpslld	xmm2,xmm6,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm6,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm6,14
++	vmovdqu	xmm0,XMMWORD[((0-128))+rax]
++	vpsrld	xmm3,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm5,xmm5,xmm7
++	vpxor	xmm7,xmm3,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm5,xmm5,xmm7
++	vpsrld	xmm7,xmm10,6
++	vpslld	xmm2,xmm10,26
++	vmovdqu	XMMWORD[(32-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm13
++
++	vpsrld	xmm1,xmm10,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm10,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-64))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm10,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm10,7
++	vpandn	xmm0,xmm10,xmm12
++	vpand	xmm3,xmm10,xmm11
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm13,xmm14,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm14,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm15,xmm14
++
++	vpxor	xmm13,xmm13,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm14,13
++
++	vpslld	xmm2,xmm14,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm13,xmm1
++
++	vpsrld	xmm1,xmm14,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm14,10
++	vpxor	xmm13,xmm15,xmm4
++	vpaddd	xmm9,xmm9,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm13,xmm13,xmm5
++	vpaddd	xmm13,xmm13,xmm7
++	vmovdqu	xmm5,XMMWORD[((64-128))+rax]
++	vpaddd	xmm6,xmm6,XMMWORD[((192-128))+rax]
++
++	vpsrld	xmm7,xmm5,3
++	vpsrld	xmm1,xmm5,7
++	vpslld	xmm2,xmm5,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm5,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm5,14
++	vmovdqu	xmm0,XMMWORD[((16-128))+rax]
++	vpsrld	xmm4,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm6,xmm6,xmm7
++	vpxor	xmm7,xmm4,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm6,xmm6,xmm7
++	vpsrld	xmm7,xmm9,6
++	vpslld	xmm2,xmm9,26
++	vmovdqu	XMMWORD[(48-128)+rax],xmm6
++	vpaddd	xmm6,xmm6,xmm12
++
++	vpsrld	xmm1,xmm9,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm9,21
++	vpaddd	xmm6,xmm6,XMMWORD[((-32))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm9,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm9,7
++	vpandn	xmm0,xmm9,xmm11
++	vpand	xmm4,xmm9,xmm10
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm12,xmm13,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm13,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm14,xmm13
++
++	vpxor	xmm12,xmm12,xmm1
++	vpaddd	xmm6,xmm6,xmm7
++
++	vpsrld	xmm1,xmm13,13
++
++	vpslld	xmm2,xmm13,19
++	vpaddd	xmm6,xmm6,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm12,xmm1
++
++	vpsrld	xmm1,xmm13,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm13,10
++	vpxor	xmm12,xmm14,xmm3
++	vpaddd	xmm8,xmm8,xmm6
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm12,xmm12,xmm6
++	vpaddd	xmm12,xmm12,xmm7
++	vmovdqu	xmm6,XMMWORD[((80-128))+rax]
++	vpaddd	xmm5,xmm5,XMMWORD[((208-128))+rax]
++
++	vpsrld	xmm7,xmm6,3
++	vpsrld	xmm1,xmm6,7
++	vpslld	xmm2,xmm6,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm6,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm6,14
++	vmovdqu	xmm0,XMMWORD[((32-128))+rax]
++	vpsrld	xmm3,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm5,xmm5,xmm7
++	vpxor	xmm7,xmm3,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm5,xmm5,xmm7
++	vpsrld	xmm7,xmm8,6
++	vpslld	xmm2,xmm8,26
++	vmovdqu	XMMWORD[(64-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm11
++
++	vpsrld	xmm1,xmm8,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm8,21
++	vpaddd	xmm5,xmm5,XMMWORD[rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm8,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm8,7
++	vpandn	xmm0,xmm8,xmm10
++	vpand	xmm3,xmm8,xmm9
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm11,xmm12,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm12,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm13,xmm12
++
++	vpxor	xmm11,xmm11,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm12,13
++
++	vpslld	xmm2,xmm12,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm11,xmm1
++
++	vpsrld	xmm1,xmm12,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm12,10
++	vpxor	xmm11,xmm13,xmm4
++	vpaddd	xmm15,xmm15,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm11,xmm11,xmm5
++	vpaddd	xmm11,xmm11,xmm7
++	vmovdqu	xmm5,XMMWORD[((96-128))+rax]
++	vpaddd	xmm6,xmm6,XMMWORD[((224-128))+rax]
++
++	vpsrld	xmm7,xmm5,3
++	vpsrld	xmm1,xmm5,7
++	vpslld	xmm2,xmm5,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm5,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm5,14
++	vmovdqu	xmm0,XMMWORD[((48-128))+rax]
++	vpsrld	xmm4,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm6,xmm6,xmm7
++	vpxor	xmm7,xmm4,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm6,xmm6,xmm7
++	vpsrld	xmm7,xmm15,6
++	vpslld	xmm2,xmm15,26
++	vmovdqu	XMMWORD[(80-128)+rax],xmm6
++	vpaddd	xmm6,xmm6,xmm10
++
++	vpsrld	xmm1,xmm15,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm15,21
++	vpaddd	xmm6,xmm6,XMMWORD[32+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm15,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm15,7
++	vpandn	xmm0,xmm15,xmm9
++	vpand	xmm4,xmm15,xmm8
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm10,xmm11,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm11,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm12,xmm11
++
++	vpxor	xmm10,xmm10,xmm1
++	vpaddd	xmm6,xmm6,xmm7
++
++	vpsrld	xmm1,xmm11,13
++
++	vpslld	xmm2,xmm11,19
++	vpaddd	xmm6,xmm6,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm10,xmm1
++
++	vpsrld	xmm1,xmm11,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm11,10
++	vpxor	xmm10,xmm12,xmm3
++	vpaddd	xmm14,xmm14,xmm6
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm10,xmm10,xmm6
++	vpaddd	xmm10,xmm10,xmm7
++	vmovdqu	xmm6,XMMWORD[((112-128))+rax]
++	vpaddd	xmm5,xmm5,XMMWORD[((240-128))+rax]
++
++	vpsrld	xmm7,xmm6,3
++	vpsrld	xmm1,xmm6,7
++	vpslld	xmm2,xmm6,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm6,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm6,14
++	vmovdqu	xmm0,XMMWORD[((64-128))+rax]
++	vpsrld	xmm3,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm5,xmm5,xmm7
++	vpxor	xmm7,xmm3,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm5,xmm5,xmm7
++	vpsrld	xmm7,xmm14,6
++	vpslld	xmm2,xmm14,26
++	vmovdqu	XMMWORD[(96-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm9
++
++	vpsrld	xmm1,xmm14,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm14,21
++	vpaddd	xmm5,xmm5,XMMWORD[64+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm14,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm14,7
++	vpandn	xmm0,xmm14,xmm8
++	vpand	xmm3,xmm14,xmm15
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm9,xmm10,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm10,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm11,xmm10
++
++	vpxor	xmm9,xmm9,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm10,13
++
++	vpslld	xmm2,xmm10,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm9,xmm1
++
++	vpsrld	xmm1,xmm10,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm10,10
++	vpxor	xmm9,xmm11,xmm4
++	vpaddd	xmm13,xmm13,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm9,xmm9,xmm5
++	vpaddd	xmm9,xmm9,xmm7
++	vmovdqu	xmm5,XMMWORD[((128-128))+rax]
++	vpaddd	xmm6,xmm6,XMMWORD[((0-128))+rax]
++
++	vpsrld	xmm7,xmm5,3
++	vpsrld	xmm1,xmm5,7
++	vpslld	xmm2,xmm5,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm5,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm5,14
++	vmovdqu	xmm0,XMMWORD[((80-128))+rax]
++	vpsrld	xmm4,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm6,xmm6,xmm7
++	vpxor	xmm7,xmm4,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm6,xmm6,xmm7
++	vpsrld	xmm7,xmm13,6
++	vpslld	xmm2,xmm13,26
++	vmovdqu	XMMWORD[(112-128)+rax],xmm6
++	vpaddd	xmm6,xmm6,xmm8
++
++	vpsrld	xmm1,xmm13,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm13,21
++	vpaddd	xmm6,xmm6,XMMWORD[96+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm13,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm13,7
++	vpandn	xmm0,xmm13,xmm15
++	vpand	xmm4,xmm13,xmm14
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm8,xmm9,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm9,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm10,xmm9
++
++	vpxor	xmm8,xmm8,xmm1
++	vpaddd	xmm6,xmm6,xmm7
++
++	vpsrld	xmm1,xmm9,13
++
++	vpslld	xmm2,xmm9,19
++	vpaddd	xmm6,xmm6,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm8,xmm1
++
++	vpsrld	xmm1,xmm9,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm9,10
++	vpxor	xmm8,xmm10,xmm3
++	vpaddd	xmm12,xmm12,xmm6
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm8,xmm8,xmm6
++	vpaddd	xmm8,xmm8,xmm7
++	add	rbp,256
++	vmovdqu	xmm6,XMMWORD[((144-128))+rax]
++	vpaddd	xmm5,xmm5,XMMWORD[((16-128))+rax]
++
++	vpsrld	xmm7,xmm6,3
++	vpsrld	xmm1,xmm6,7
++	vpslld	xmm2,xmm6,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm6,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm6,14
++	vmovdqu	xmm0,XMMWORD[((96-128))+rax]
++	vpsrld	xmm3,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm5,xmm5,xmm7
++	vpxor	xmm7,xmm3,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm5,xmm5,xmm7
++	vpsrld	xmm7,xmm12,6
++	vpslld	xmm2,xmm12,26
++	vmovdqu	XMMWORD[(128-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm15
++
++	vpsrld	xmm1,xmm12,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm12,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-128))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm12,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm12,7
++	vpandn	xmm0,xmm12,xmm14
++	vpand	xmm3,xmm12,xmm13
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm15,xmm8,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm8,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm9,xmm8
++
++	vpxor	xmm15,xmm15,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm8,13
++
++	vpslld	xmm2,xmm8,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm15,xmm1
++
++	vpsrld	xmm1,xmm8,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm8,10
++	vpxor	xmm15,xmm9,xmm4
++	vpaddd	xmm11,xmm11,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm15,xmm15,xmm5
++	vpaddd	xmm15,xmm15,xmm7
++	vmovdqu	xmm5,XMMWORD[((160-128))+rax]
++	vpaddd	xmm6,xmm6,XMMWORD[((32-128))+rax]
++
++	vpsrld	xmm7,xmm5,3
++	vpsrld	xmm1,xmm5,7
++	vpslld	xmm2,xmm5,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm5,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm5,14
++	vmovdqu	xmm0,XMMWORD[((112-128))+rax]
++	vpsrld	xmm4,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm6,xmm6,xmm7
++	vpxor	xmm7,xmm4,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm6,xmm6,xmm7
++	vpsrld	xmm7,xmm11,6
++	vpslld	xmm2,xmm11,26
++	vmovdqu	XMMWORD[(144-128)+rax],xmm6
++	vpaddd	xmm6,xmm6,xmm14
++
++	vpsrld	xmm1,xmm11,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm11,21
++	vpaddd	xmm6,xmm6,XMMWORD[((-96))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm11,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm11,7
++	vpandn	xmm0,xmm11,xmm13
++	vpand	xmm4,xmm11,xmm12
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm14,xmm15,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm15,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm8,xmm15
++
++	vpxor	xmm14,xmm14,xmm1
++	vpaddd	xmm6,xmm6,xmm7
++
++	vpsrld	xmm1,xmm15,13
++
++	vpslld	xmm2,xmm15,19
++	vpaddd	xmm6,xmm6,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm14,xmm1
++
++	vpsrld	xmm1,xmm15,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm15,10
++	vpxor	xmm14,xmm8,xmm3
++	vpaddd	xmm10,xmm10,xmm6
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm14,xmm14,xmm6
++	vpaddd	xmm14,xmm14,xmm7
++	vmovdqu	xmm6,XMMWORD[((176-128))+rax]
++	vpaddd	xmm5,xmm5,XMMWORD[((48-128))+rax]
++
++	vpsrld	xmm7,xmm6,3
++	vpsrld	xmm1,xmm6,7
++	vpslld	xmm2,xmm6,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm6,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm6,14
++	vmovdqu	xmm0,XMMWORD[((128-128))+rax]
++	vpsrld	xmm3,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm5,xmm5,xmm7
++	vpxor	xmm7,xmm3,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm5,xmm5,xmm7
++	vpsrld	xmm7,xmm10,6
++	vpslld	xmm2,xmm10,26
++	vmovdqu	XMMWORD[(160-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm13
++
++	vpsrld	xmm1,xmm10,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm10,21
++	vpaddd	xmm5,xmm5,XMMWORD[((-64))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm10,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm10,7
++	vpandn	xmm0,xmm10,xmm12
++	vpand	xmm3,xmm10,xmm11
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm13,xmm14,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm14,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm15,xmm14
++
++	vpxor	xmm13,xmm13,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm14,13
++
++	vpslld	xmm2,xmm14,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm13,xmm1
++
++	vpsrld	xmm1,xmm14,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm14,10
++	vpxor	xmm13,xmm15,xmm4
++	vpaddd	xmm9,xmm9,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm13,xmm13,xmm5
++	vpaddd	xmm13,xmm13,xmm7
++	vmovdqu	xmm5,XMMWORD[((192-128))+rax]
++	vpaddd	xmm6,xmm6,XMMWORD[((64-128))+rax]
++
++	vpsrld	xmm7,xmm5,3
++	vpsrld	xmm1,xmm5,7
++	vpslld	xmm2,xmm5,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm5,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm5,14
++	vmovdqu	xmm0,XMMWORD[((144-128))+rax]
++	vpsrld	xmm4,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm6,xmm6,xmm7
++	vpxor	xmm7,xmm4,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm6,xmm6,xmm7
++	vpsrld	xmm7,xmm9,6
++	vpslld	xmm2,xmm9,26
++	vmovdqu	XMMWORD[(176-128)+rax],xmm6
++	vpaddd	xmm6,xmm6,xmm12
++
++	vpsrld	xmm1,xmm9,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm9,21
++	vpaddd	xmm6,xmm6,XMMWORD[((-32))+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm9,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm9,7
++	vpandn	xmm0,xmm9,xmm11
++	vpand	xmm4,xmm9,xmm10
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm12,xmm13,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm13,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm14,xmm13
++
++	vpxor	xmm12,xmm12,xmm1
++	vpaddd	xmm6,xmm6,xmm7
++
++	vpsrld	xmm1,xmm13,13
++
++	vpslld	xmm2,xmm13,19
++	vpaddd	xmm6,xmm6,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm12,xmm1
++
++	vpsrld	xmm1,xmm13,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm13,10
++	vpxor	xmm12,xmm14,xmm3
++	vpaddd	xmm8,xmm8,xmm6
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm12,xmm12,xmm6
++	vpaddd	xmm12,xmm12,xmm7
++	vmovdqu	xmm6,XMMWORD[((208-128))+rax]
++	vpaddd	xmm5,xmm5,XMMWORD[((80-128))+rax]
++
++	vpsrld	xmm7,xmm6,3
++	vpsrld	xmm1,xmm6,7
++	vpslld	xmm2,xmm6,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm6,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm6,14
++	vmovdqu	xmm0,XMMWORD[((160-128))+rax]
++	vpsrld	xmm3,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm5,xmm5,xmm7
++	vpxor	xmm7,xmm3,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm5,xmm5,xmm7
++	vpsrld	xmm7,xmm8,6
++	vpslld	xmm2,xmm8,26
++	vmovdqu	XMMWORD[(192-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm11
++
++	vpsrld	xmm1,xmm8,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm8,21
++	vpaddd	xmm5,xmm5,XMMWORD[rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm8,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm8,7
++	vpandn	xmm0,xmm8,xmm10
++	vpand	xmm3,xmm8,xmm9
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm11,xmm12,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm12,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm13,xmm12
++
++	vpxor	xmm11,xmm11,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm12,13
++
++	vpslld	xmm2,xmm12,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm11,xmm1
++
++	vpsrld	xmm1,xmm12,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm12,10
++	vpxor	xmm11,xmm13,xmm4
++	vpaddd	xmm15,xmm15,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm11,xmm11,xmm5
++	vpaddd	xmm11,xmm11,xmm7
++	vmovdqu	xmm5,XMMWORD[((224-128))+rax]
++	vpaddd	xmm6,xmm6,XMMWORD[((96-128))+rax]
++
++	vpsrld	xmm7,xmm5,3
++	vpsrld	xmm1,xmm5,7
++	vpslld	xmm2,xmm5,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm5,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm5,14
++	vmovdqu	xmm0,XMMWORD[((176-128))+rax]
++	vpsrld	xmm4,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm6,xmm6,xmm7
++	vpxor	xmm7,xmm4,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm6,xmm6,xmm7
++	vpsrld	xmm7,xmm15,6
++	vpslld	xmm2,xmm15,26
++	vmovdqu	XMMWORD[(208-128)+rax],xmm6
++	vpaddd	xmm6,xmm6,xmm10
++
++	vpsrld	xmm1,xmm15,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm15,21
++	vpaddd	xmm6,xmm6,XMMWORD[32+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm15,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm15,7
++	vpandn	xmm0,xmm15,xmm9
++	vpand	xmm4,xmm15,xmm8
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm10,xmm11,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm11,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm12,xmm11
++
++	vpxor	xmm10,xmm10,xmm1
++	vpaddd	xmm6,xmm6,xmm7
++
++	vpsrld	xmm1,xmm11,13
++
++	vpslld	xmm2,xmm11,19
++	vpaddd	xmm6,xmm6,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm10,xmm1
++
++	vpsrld	xmm1,xmm11,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm11,10
++	vpxor	xmm10,xmm12,xmm3
++	vpaddd	xmm14,xmm14,xmm6
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm10,xmm10,xmm6
++	vpaddd	xmm10,xmm10,xmm7
++	vmovdqu	xmm6,XMMWORD[((240-128))+rax]
++	vpaddd	xmm5,xmm5,XMMWORD[((112-128))+rax]
++
++	vpsrld	xmm7,xmm6,3
++	vpsrld	xmm1,xmm6,7
++	vpslld	xmm2,xmm6,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm6,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm6,14
++	vmovdqu	xmm0,XMMWORD[((192-128))+rax]
++	vpsrld	xmm3,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm5,xmm5,xmm7
++	vpxor	xmm7,xmm3,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm5,xmm5,xmm7
++	vpsrld	xmm7,xmm14,6
++	vpslld	xmm2,xmm14,26
++	vmovdqu	XMMWORD[(224-128)+rax],xmm5
++	vpaddd	xmm5,xmm5,xmm9
++
++	vpsrld	xmm1,xmm14,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm14,21
++	vpaddd	xmm5,xmm5,XMMWORD[64+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm14,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm14,7
++	vpandn	xmm0,xmm14,xmm8
++	vpand	xmm3,xmm14,xmm15
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm9,xmm10,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm10,30
++	vpxor	xmm0,xmm0,xmm3
++	vpxor	xmm3,xmm11,xmm10
++
++	vpxor	xmm9,xmm9,xmm1
++	vpaddd	xmm5,xmm5,xmm7
++
++	vpsrld	xmm1,xmm10,13
++
++	vpslld	xmm2,xmm10,19
++	vpaddd	xmm5,xmm5,xmm0
++	vpand	xmm4,xmm4,xmm3
++
++	vpxor	xmm7,xmm9,xmm1
++
++	vpsrld	xmm1,xmm10,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm10,10
++	vpxor	xmm9,xmm11,xmm4
++	vpaddd	xmm13,xmm13,xmm5
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm9,xmm9,xmm5
++	vpaddd	xmm9,xmm9,xmm7
++	vmovdqu	xmm5,XMMWORD[((0-128))+rax]
++	vpaddd	xmm6,xmm6,XMMWORD[((128-128))+rax]
++
++	vpsrld	xmm7,xmm5,3
++	vpsrld	xmm1,xmm5,7
++	vpslld	xmm2,xmm5,25
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm5,18
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm5,14
++	vmovdqu	xmm0,XMMWORD[((208-128))+rax]
++	vpsrld	xmm4,xmm0,10
++
++	vpxor	xmm7,xmm7,xmm1
++	vpsrld	xmm1,xmm0,17
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,15
++	vpaddd	xmm6,xmm6,xmm7
++	vpxor	xmm7,xmm4,xmm1
++	vpsrld	xmm1,xmm0,19
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm0,13
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++	vpaddd	xmm6,xmm6,xmm7
++	vpsrld	xmm7,xmm13,6
++	vpslld	xmm2,xmm13,26
++	vmovdqu	XMMWORD[(240-128)+rax],xmm6
++	vpaddd	xmm6,xmm6,xmm8
++
++	vpsrld	xmm1,xmm13,11
++	vpxor	xmm7,xmm7,xmm2
++	vpslld	xmm2,xmm13,21
++	vpaddd	xmm6,xmm6,XMMWORD[96+rbp]
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm1,xmm13,25
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm13,7
++	vpandn	xmm0,xmm13,xmm15
++	vpand	xmm4,xmm13,xmm14
++
++	vpxor	xmm7,xmm7,xmm1
++
++	vpsrld	xmm8,xmm9,2
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm1,xmm9,30
++	vpxor	xmm0,xmm0,xmm4
++	vpxor	xmm4,xmm10,xmm9
++
++	vpxor	xmm8,xmm8,xmm1
++	vpaddd	xmm6,xmm6,xmm7
++
++	vpsrld	xmm1,xmm9,13
++
++	vpslld	xmm2,xmm9,19
++	vpaddd	xmm6,xmm6,xmm0
++	vpand	xmm3,xmm3,xmm4
++
++	vpxor	xmm7,xmm8,xmm1
++
++	vpsrld	xmm1,xmm9,22
++	vpxor	xmm7,xmm7,xmm2
++
++	vpslld	xmm2,xmm9,10
++	vpxor	xmm8,xmm10,xmm3
++	vpaddd	xmm12,xmm12,xmm6
++
++	vpxor	xmm7,xmm7,xmm1
++	vpxor	xmm7,xmm7,xmm2
++
++	vpaddd	xmm8,xmm8,xmm6
++	vpaddd	xmm8,xmm8,xmm7
++	add	rbp,256
++	dec	ecx
++	jnz	NEAR $L$oop_16_xx_avx
++
++	mov	ecx,1
++	lea	rbp,[((K256+128))]
++	cmp	ecx,DWORD[rbx]
++	cmovge	r8,rbp
++	cmp	ecx,DWORD[4+rbx]
++	cmovge	r9,rbp
++	cmp	ecx,DWORD[8+rbx]
++	cmovge	r10,rbp
++	cmp	ecx,DWORD[12+rbx]
++	cmovge	r11,rbp
++	vmovdqa	xmm7,XMMWORD[rbx]
++	vpxor	xmm0,xmm0,xmm0
++	vmovdqa	xmm6,xmm7
++	vpcmpgtd	xmm6,xmm6,xmm0
++	vpaddd	xmm7,xmm7,xmm6
++
++	vmovdqu	xmm0,XMMWORD[((0-128))+rdi]
++	vpand	xmm8,xmm8,xmm6
++	vmovdqu	xmm1,XMMWORD[((32-128))+rdi]
++	vpand	xmm9,xmm9,xmm6
++	vmovdqu	xmm2,XMMWORD[((64-128))+rdi]
++	vpand	xmm10,xmm10,xmm6
++	vmovdqu	xmm5,XMMWORD[((96-128))+rdi]
++	vpand	xmm11,xmm11,xmm6
++	vpaddd	xmm8,xmm8,xmm0
++	vmovdqu	xmm0,XMMWORD[((128-128))+rdi]
++	vpand	xmm12,xmm12,xmm6
++	vpaddd	xmm9,xmm9,xmm1
++	vmovdqu	xmm1,XMMWORD[((160-128))+rdi]
++	vpand	xmm13,xmm13,xmm6
++	vpaddd	xmm10,xmm10,xmm2
++	vmovdqu	xmm2,XMMWORD[((192-128))+rdi]
++	vpand	xmm14,xmm14,xmm6
++	vpaddd	xmm11,xmm11,xmm5
++	vmovdqu	xmm5,XMMWORD[((224-128))+rdi]
++	vpand	xmm15,xmm15,xmm6
++	vpaddd	xmm12,xmm12,xmm0
++	vpaddd	xmm13,xmm13,xmm1
++	vmovdqu	XMMWORD[(0-128)+rdi],xmm8
++	vpaddd	xmm14,xmm14,xmm2
++	vmovdqu	XMMWORD[(32-128)+rdi],xmm9
++	vpaddd	xmm15,xmm15,xmm5
++	vmovdqu	XMMWORD[(64-128)+rdi],xmm10
++	vmovdqu	XMMWORD[(96-128)+rdi],xmm11
++	vmovdqu	XMMWORD[(128-128)+rdi],xmm12
++	vmovdqu	XMMWORD[(160-128)+rdi],xmm13
++	vmovdqu	XMMWORD[(192-128)+rdi],xmm14
++	vmovdqu	XMMWORD[(224-128)+rdi],xmm15
++
++	vmovdqu	XMMWORD[rbx],xmm7
++	vmovdqu	xmm6,XMMWORD[$L$pbswap]
++	dec	edx
++	jnz	NEAR $L$oop_avx
++
++	mov	edx,DWORD[280+rsp]
++	lea	rdi,[16+rdi]
++	lea	rsi,[64+rsi]
++	dec	edx
++	jnz	NEAR $L$oop_grande_avx
++
++$L$done_avx:
++	mov	rax,QWORD[272+rsp]
++	vzeroupper
++	movaps	xmm6,XMMWORD[((-184))+rax]
++	movaps	xmm7,XMMWORD[((-168))+rax]
++	movaps	xmm8,XMMWORD[((-152))+rax]
++	movaps	xmm9,XMMWORD[((-136))+rax]
++	movaps	xmm10,XMMWORD[((-120))+rax]
++	movaps	xmm11,XMMWORD[((-104))+rax]
++	movaps	xmm12,XMMWORD[((-88))+rax]
++	movaps	xmm13,XMMWORD[((-72))+rax]
++	movaps	xmm14,XMMWORD[((-56))+rax]
++	movaps	xmm15,XMMWORD[((-40))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	rbx,QWORD[((-8))+rax]
++	lea	rsp,[rax]
++$L$epilogue_avx:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha256_multi_block_avx:
++
++ALIGN	32
++sha256_multi_block_avx2:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha256_multi_block_avx2:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++_avx2_shortcut:
++	mov	rax,rsp
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	lea	rsp,[((-168))+rsp]
++	movaps	XMMWORD[rsp],xmm6
++	movaps	XMMWORD[16+rsp],xmm7
++	movaps	XMMWORD[32+rsp],xmm8
++	movaps	XMMWORD[48+rsp],xmm9
++	movaps	XMMWORD[64+rsp],xmm10
++	movaps	XMMWORD[80+rsp],xmm11
++	movaps	XMMWORD[(-120)+rax],xmm12
++	movaps	XMMWORD[(-104)+rax],xmm13
++	movaps	XMMWORD[(-88)+rax],xmm14
++	movaps	XMMWORD[(-72)+rax],xmm15
++	sub	rsp,576
++	and	rsp,-256
++	mov	QWORD[544+rsp],rax
++$L$body_avx2:
++	lea	rbp,[((K256+128))]
++	lea	rdi,[128+rdi]
++
++$L$oop_grande_avx2:
++	mov	DWORD[552+rsp],edx
++	xor	edx,edx
++	lea	rbx,[512+rsp]
++	mov	r12,QWORD[rsi]
++	mov	ecx,DWORD[8+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[rbx],ecx
++	cmovle	r12,rbp
++	mov	r13,QWORD[16+rsi]
++	mov	ecx,DWORD[24+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[4+rbx],ecx
++	cmovle	r13,rbp
++	mov	r14,QWORD[32+rsi]
++	mov	ecx,DWORD[40+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[8+rbx],ecx
++	cmovle	r14,rbp
++	mov	r15,QWORD[48+rsi]
++	mov	ecx,DWORD[56+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[12+rbx],ecx
++	cmovle	r15,rbp
++	mov	r8,QWORD[64+rsi]
++	mov	ecx,DWORD[72+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[16+rbx],ecx
++	cmovle	r8,rbp
++	mov	r9,QWORD[80+rsi]
++	mov	ecx,DWORD[88+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[20+rbx],ecx
++	cmovle	r9,rbp
++	mov	r10,QWORD[96+rsi]
++	mov	ecx,DWORD[104+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[24+rbx],ecx
++	cmovle	r10,rbp
++	mov	r11,QWORD[112+rsi]
++	mov	ecx,DWORD[120+rsi]
++	cmp	ecx,edx
++	cmovg	edx,ecx
++	test	ecx,ecx
++	mov	DWORD[28+rbx],ecx
++	cmovle	r11,rbp
++	vmovdqu	ymm8,YMMWORD[((0-128))+rdi]
++	lea	rax,[128+rsp]
++	vmovdqu	ymm9,YMMWORD[((32-128))+rdi]
++	lea	rbx,[((256+128))+rsp]
++	vmovdqu	ymm10,YMMWORD[((64-128))+rdi]
++	vmovdqu	ymm11,YMMWORD[((96-128))+rdi]
++	vmovdqu	ymm12,YMMWORD[((128-128))+rdi]
++	vmovdqu	ymm13,YMMWORD[((160-128))+rdi]
++	vmovdqu	ymm14,YMMWORD[((192-128))+rdi]
++	vmovdqu	ymm15,YMMWORD[((224-128))+rdi]
++	vmovdqu	ymm6,YMMWORD[$L$pbswap]
++	jmp	NEAR $L$oop_avx2
++
++ALIGN	32
++$L$oop_avx2:
++	vpxor	ymm4,ymm10,ymm9
++	vmovd	xmm5,DWORD[r12]
++	vmovd	xmm0,DWORD[r8]
++	vmovd	xmm1,DWORD[r13]
++	vmovd	xmm2,DWORD[r9]
++	vpinsrd	xmm5,xmm5,DWORD[r14],1
++	vpinsrd	xmm0,xmm0,DWORD[r10],1
++	vpinsrd	xmm1,xmm1,DWORD[r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm12,6
++	vpslld	ymm2,ymm12,26
++	vmovdqu	YMMWORD[(0-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm15
++
++	vpsrld	ymm1,ymm12,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm12,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-128))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm12,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm12,7
++	vpandn	ymm0,ymm12,ymm14
++	vpand	ymm3,ymm12,ymm13
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm15,ymm8,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm8,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm9,ymm8
++
++	vpxor	ymm15,ymm15,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm8,13
++
++	vpslld	ymm2,ymm8,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm15,ymm1
++
++	vpsrld	ymm1,ymm8,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm8,10
++	vpxor	ymm15,ymm9,ymm4
++	vpaddd	ymm11,ymm11,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm15,ymm15,ymm5
++	vpaddd	ymm15,ymm15,ymm7
++	vmovd	xmm5,DWORD[4+r12]
++	vmovd	xmm0,DWORD[4+r8]
++	vmovd	xmm1,DWORD[4+r13]
++	vmovd	xmm2,DWORD[4+r9]
++	vpinsrd	xmm5,xmm5,DWORD[4+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[4+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[4+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[4+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm11,6
++	vpslld	ymm2,ymm11,26
++	vmovdqu	YMMWORD[(32-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm14
++
++	vpsrld	ymm1,ymm11,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm11,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-96))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm11,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm11,7
++	vpandn	ymm0,ymm11,ymm13
++	vpand	ymm4,ymm11,ymm12
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm14,ymm15,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm15,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm8,ymm15
++
++	vpxor	ymm14,ymm14,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm15,13
++
++	vpslld	ymm2,ymm15,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm14,ymm1
++
++	vpsrld	ymm1,ymm15,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm15,10
++	vpxor	ymm14,ymm8,ymm3
++	vpaddd	ymm10,ymm10,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm14,ymm14,ymm5
++	vpaddd	ymm14,ymm14,ymm7
++	vmovd	xmm5,DWORD[8+r12]
++	vmovd	xmm0,DWORD[8+r8]
++	vmovd	xmm1,DWORD[8+r13]
++	vmovd	xmm2,DWORD[8+r9]
++	vpinsrd	xmm5,xmm5,DWORD[8+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[8+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[8+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[8+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm10,6
++	vpslld	ymm2,ymm10,26
++	vmovdqu	YMMWORD[(64-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm13
++
++	vpsrld	ymm1,ymm10,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm10,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-64))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm10,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm10,7
++	vpandn	ymm0,ymm10,ymm12
++	vpand	ymm3,ymm10,ymm11
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm13,ymm14,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm14,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm15,ymm14
++
++	vpxor	ymm13,ymm13,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm14,13
++
++	vpslld	ymm2,ymm14,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm13,ymm1
++
++	vpsrld	ymm1,ymm14,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm14,10
++	vpxor	ymm13,ymm15,ymm4
++	vpaddd	ymm9,ymm9,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm13,ymm13,ymm5
++	vpaddd	ymm13,ymm13,ymm7
++	vmovd	xmm5,DWORD[12+r12]
++	vmovd	xmm0,DWORD[12+r8]
++	vmovd	xmm1,DWORD[12+r13]
++	vmovd	xmm2,DWORD[12+r9]
++	vpinsrd	xmm5,xmm5,DWORD[12+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[12+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[12+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[12+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm9,6
++	vpslld	ymm2,ymm9,26
++	vmovdqu	YMMWORD[(96-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm12
++
++	vpsrld	ymm1,ymm9,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm9,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-32))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm9,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm9,7
++	vpandn	ymm0,ymm9,ymm11
++	vpand	ymm4,ymm9,ymm10
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm12,ymm13,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm13,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm14,ymm13
++
++	vpxor	ymm12,ymm12,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm13,13
++
++	vpslld	ymm2,ymm13,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm12,ymm1
++
++	vpsrld	ymm1,ymm13,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm13,10
++	vpxor	ymm12,ymm14,ymm3
++	vpaddd	ymm8,ymm8,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm12,ymm12,ymm5
++	vpaddd	ymm12,ymm12,ymm7
++	vmovd	xmm5,DWORD[16+r12]
++	vmovd	xmm0,DWORD[16+r8]
++	vmovd	xmm1,DWORD[16+r13]
++	vmovd	xmm2,DWORD[16+r9]
++	vpinsrd	xmm5,xmm5,DWORD[16+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[16+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[16+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[16+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm8,6
++	vpslld	ymm2,ymm8,26
++	vmovdqu	YMMWORD[(128-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm11
++
++	vpsrld	ymm1,ymm8,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm8,21
++	vpaddd	ymm5,ymm5,YMMWORD[rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm8,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm8,7
++	vpandn	ymm0,ymm8,ymm10
++	vpand	ymm3,ymm8,ymm9
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm11,ymm12,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm12,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm13,ymm12
++
++	vpxor	ymm11,ymm11,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm12,13
++
++	vpslld	ymm2,ymm12,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm11,ymm1
++
++	vpsrld	ymm1,ymm12,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm12,10
++	vpxor	ymm11,ymm13,ymm4
++	vpaddd	ymm15,ymm15,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm11,ymm11,ymm5
++	vpaddd	ymm11,ymm11,ymm7
++	vmovd	xmm5,DWORD[20+r12]
++	vmovd	xmm0,DWORD[20+r8]
++	vmovd	xmm1,DWORD[20+r13]
++	vmovd	xmm2,DWORD[20+r9]
++	vpinsrd	xmm5,xmm5,DWORD[20+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[20+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[20+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[20+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm15,6
++	vpslld	ymm2,ymm15,26
++	vmovdqu	YMMWORD[(160-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm10
++
++	vpsrld	ymm1,ymm15,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm15,21
++	vpaddd	ymm5,ymm5,YMMWORD[32+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm15,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm15,7
++	vpandn	ymm0,ymm15,ymm9
++	vpand	ymm4,ymm15,ymm8
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm10,ymm11,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm11,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm12,ymm11
++
++	vpxor	ymm10,ymm10,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm11,13
++
++	vpslld	ymm2,ymm11,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm10,ymm1
++
++	vpsrld	ymm1,ymm11,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm11,10
++	vpxor	ymm10,ymm12,ymm3
++	vpaddd	ymm14,ymm14,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm10,ymm10,ymm5
++	vpaddd	ymm10,ymm10,ymm7
++	vmovd	xmm5,DWORD[24+r12]
++	vmovd	xmm0,DWORD[24+r8]
++	vmovd	xmm1,DWORD[24+r13]
++	vmovd	xmm2,DWORD[24+r9]
++	vpinsrd	xmm5,xmm5,DWORD[24+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[24+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[24+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[24+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm14,6
++	vpslld	ymm2,ymm14,26
++	vmovdqu	YMMWORD[(192-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm9
++
++	vpsrld	ymm1,ymm14,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm14,21
++	vpaddd	ymm5,ymm5,YMMWORD[64+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm14,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm14,7
++	vpandn	ymm0,ymm14,ymm8
++	vpand	ymm3,ymm14,ymm15
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm9,ymm10,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm10,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm11,ymm10
++
++	vpxor	ymm9,ymm9,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm10,13
++
++	vpslld	ymm2,ymm10,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm9,ymm1
++
++	vpsrld	ymm1,ymm10,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm10,10
++	vpxor	ymm9,ymm11,ymm4
++	vpaddd	ymm13,ymm13,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm9,ymm9,ymm5
++	vpaddd	ymm9,ymm9,ymm7
++	vmovd	xmm5,DWORD[28+r12]
++	vmovd	xmm0,DWORD[28+r8]
++	vmovd	xmm1,DWORD[28+r13]
++	vmovd	xmm2,DWORD[28+r9]
++	vpinsrd	xmm5,xmm5,DWORD[28+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[28+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[28+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[28+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm13,6
++	vpslld	ymm2,ymm13,26
++	vmovdqu	YMMWORD[(224-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm8
++
++	vpsrld	ymm1,ymm13,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm13,21
++	vpaddd	ymm5,ymm5,YMMWORD[96+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm13,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm13,7
++	vpandn	ymm0,ymm13,ymm15
++	vpand	ymm4,ymm13,ymm14
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm8,ymm9,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm9,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm10,ymm9
++
++	vpxor	ymm8,ymm8,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm9,13
++
++	vpslld	ymm2,ymm9,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm8,ymm1
++
++	vpsrld	ymm1,ymm9,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm9,10
++	vpxor	ymm8,ymm10,ymm3
++	vpaddd	ymm12,ymm12,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm8,ymm8,ymm5
++	vpaddd	ymm8,ymm8,ymm7
++	add	rbp,256
++	vmovd	xmm5,DWORD[32+r12]
++	vmovd	xmm0,DWORD[32+r8]
++	vmovd	xmm1,DWORD[32+r13]
++	vmovd	xmm2,DWORD[32+r9]
++	vpinsrd	xmm5,xmm5,DWORD[32+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[32+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[32+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[32+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm12,6
++	vpslld	ymm2,ymm12,26
++	vmovdqu	YMMWORD[(256-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm15
++
++	vpsrld	ymm1,ymm12,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm12,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-128))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm12,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm12,7
++	vpandn	ymm0,ymm12,ymm14
++	vpand	ymm3,ymm12,ymm13
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm15,ymm8,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm8,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm9,ymm8
++
++	vpxor	ymm15,ymm15,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm8,13
++
++	vpslld	ymm2,ymm8,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm15,ymm1
++
++	vpsrld	ymm1,ymm8,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm8,10
++	vpxor	ymm15,ymm9,ymm4
++	vpaddd	ymm11,ymm11,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm15,ymm15,ymm5
++	vpaddd	ymm15,ymm15,ymm7
++	vmovd	xmm5,DWORD[36+r12]
++	vmovd	xmm0,DWORD[36+r8]
++	vmovd	xmm1,DWORD[36+r13]
++	vmovd	xmm2,DWORD[36+r9]
++	vpinsrd	xmm5,xmm5,DWORD[36+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[36+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[36+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[36+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm11,6
++	vpslld	ymm2,ymm11,26
++	vmovdqu	YMMWORD[(288-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm14
++
++	vpsrld	ymm1,ymm11,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm11,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-96))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm11,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm11,7
++	vpandn	ymm0,ymm11,ymm13
++	vpand	ymm4,ymm11,ymm12
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm14,ymm15,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm15,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm8,ymm15
++
++	vpxor	ymm14,ymm14,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm15,13
++
++	vpslld	ymm2,ymm15,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm14,ymm1
++
++	vpsrld	ymm1,ymm15,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm15,10
++	vpxor	ymm14,ymm8,ymm3
++	vpaddd	ymm10,ymm10,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm14,ymm14,ymm5
++	vpaddd	ymm14,ymm14,ymm7
++	vmovd	xmm5,DWORD[40+r12]
++	vmovd	xmm0,DWORD[40+r8]
++	vmovd	xmm1,DWORD[40+r13]
++	vmovd	xmm2,DWORD[40+r9]
++	vpinsrd	xmm5,xmm5,DWORD[40+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[40+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[40+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[40+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm10,6
++	vpslld	ymm2,ymm10,26
++	vmovdqu	YMMWORD[(320-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm13
++
++	vpsrld	ymm1,ymm10,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm10,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-64))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm10,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm10,7
++	vpandn	ymm0,ymm10,ymm12
++	vpand	ymm3,ymm10,ymm11
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm13,ymm14,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm14,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm15,ymm14
++
++	vpxor	ymm13,ymm13,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm14,13
++
++	vpslld	ymm2,ymm14,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm13,ymm1
++
++	vpsrld	ymm1,ymm14,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm14,10
++	vpxor	ymm13,ymm15,ymm4
++	vpaddd	ymm9,ymm9,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm13,ymm13,ymm5
++	vpaddd	ymm13,ymm13,ymm7
++	vmovd	xmm5,DWORD[44+r12]
++	vmovd	xmm0,DWORD[44+r8]
++	vmovd	xmm1,DWORD[44+r13]
++	vmovd	xmm2,DWORD[44+r9]
++	vpinsrd	xmm5,xmm5,DWORD[44+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[44+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[44+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[44+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm9,6
++	vpslld	ymm2,ymm9,26
++	vmovdqu	YMMWORD[(352-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm12
++
++	vpsrld	ymm1,ymm9,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm9,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-32))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm9,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm9,7
++	vpandn	ymm0,ymm9,ymm11
++	vpand	ymm4,ymm9,ymm10
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm12,ymm13,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm13,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm14,ymm13
++
++	vpxor	ymm12,ymm12,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm13,13
++
++	vpslld	ymm2,ymm13,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm12,ymm1
++
++	vpsrld	ymm1,ymm13,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm13,10
++	vpxor	ymm12,ymm14,ymm3
++	vpaddd	ymm8,ymm8,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm12,ymm12,ymm5
++	vpaddd	ymm12,ymm12,ymm7
++	vmovd	xmm5,DWORD[48+r12]
++	vmovd	xmm0,DWORD[48+r8]
++	vmovd	xmm1,DWORD[48+r13]
++	vmovd	xmm2,DWORD[48+r9]
++	vpinsrd	xmm5,xmm5,DWORD[48+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[48+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[48+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[48+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm8,6
++	vpslld	ymm2,ymm8,26
++	vmovdqu	YMMWORD[(384-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm11
++
++	vpsrld	ymm1,ymm8,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm8,21
++	vpaddd	ymm5,ymm5,YMMWORD[rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm8,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm8,7
++	vpandn	ymm0,ymm8,ymm10
++	vpand	ymm3,ymm8,ymm9
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm11,ymm12,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm12,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm13,ymm12
++
++	vpxor	ymm11,ymm11,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm12,13
++
++	vpslld	ymm2,ymm12,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm11,ymm1
++
++	vpsrld	ymm1,ymm12,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm12,10
++	vpxor	ymm11,ymm13,ymm4
++	vpaddd	ymm15,ymm15,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm11,ymm11,ymm5
++	vpaddd	ymm11,ymm11,ymm7
++	vmovd	xmm5,DWORD[52+r12]
++	vmovd	xmm0,DWORD[52+r8]
++	vmovd	xmm1,DWORD[52+r13]
++	vmovd	xmm2,DWORD[52+r9]
++	vpinsrd	xmm5,xmm5,DWORD[52+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[52+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[52+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[52+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm15,6
++	vpslld	ymm2,ymm15,26
++	vmovdqu	YMMWORD[(416-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm10
++
++	vpsrld	ymm1,ymm15,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm15,21
++	vpaddd	ymm5,ymm5,YMMWORD[32+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm15,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm15,7
++	vpandn	ymm0,ymm15,ymm9
++	vpand	ymm4,ymm15,ymm8
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm10,ymm11,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm11,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm12,ymm11
++
++	vpxor	ymm10,ymm10,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm11,13
++
++	vpslld	ymm2,ymm11,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm10,ymm1
++
++	vpsrld	ymm1,ymm11,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm11,10
++	vpxor	ymm10,ymm12,ymm3
++	vpaddd	ymm14,ymm14,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm10,ymm10,ymm5
++	vpaddd	ymm10,ymm10,ymm7
++	vmovd	xmm5,DWORD[56+r12]
++	vmovd	xmm0,DWORD[56+r8]
++	vmovd	xmm1,DWORD[56+r13]
++	vmovd	xmm2,DWORD[56+r9]
++	vpinsrd	xmm5,xmm5,DWORD[56+r14],1
++	vpinsrd	xmm0,xmm0,DWORD[56+r10],1
++	vpinsrd	xmm1,xmm1,DWORD[56+r15],1
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[56+r11],1
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm14,6
++	vpslld	ymm2,ymm14,26
++	vmovdqu	YMMWORD[(448-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm9
++
++	vpsrld	ymm1,ymm14,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm14,21
++	vpaddd	ymm5,ymm5,YMMWORD[64+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm14,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm14,7
++	vpandn	ymm0,ymm14,ymm8
++	vpand	ymm3,ymm14,ymm15
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm9,ymm10,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm10,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm11,ymm10
++
++	vpxor	ymm9,ymm9,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm10,13
++
++	vpslld	ymm2,ymm10,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm9,ymm1
++
++	vpsrld	ymm1,ymm10,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm10,10
++	vpxor	ymm9,ymm11,ymm4
++	vpaddd	ymm13,ymm13,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm9,ymm9,ymm5
++	vpaddd	ymm9,ymm9,ymm7
++	vmovd	xmm5,DWORD[60+r12]
++	lea	r12,[64+r12]
++	vmovd	xmm0,DWORD[60+r8]
++	lea	r8,[64+r8]
++	vmovd	xmm1,DWORD[60+r13]
++	lea	r13,[64+r13]
++	vmovd	xmm2,DWORD[60+r9]
++	lea	r9,[64+r9]
++	vpinsrd	xmm5,xmm5,DWORD[60+r14],1
++	lea	r14,[64+r14]
++	vpinsrd	xmm0,xmm0,DWORD[60+r10],1
++	lea	r10,[64+r10]
++	vpinsrd	xmm1,xmm1,DWORD[60+r15],1
++	lea	r15,[64+r15]
++	vpunpckldq	ymm5,ymm5,ymm1
++	vpinsrd	xmm2,xmm2,DWORD[60+r11],1
++	lea	r11,[64+r11]
++	vpunpckldq	ymm0,ymm0,ymm2
++	vinserti128	ymm5,ymm5,xmm0,1
++	vpshufb	ymm5,ymm5,ymm6
++	vpsrld	ymm7,ymm13,6
++	vpslld	ymm2,ymm13,26
++	vmovdqu	YMMWORD[(480-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm8
++
++	vpsrld	ymm1,ymm13,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm13,21
++	vpaddd	ymm5,ymm5,YMMWORD[96+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm13,25
++	vpxor	ymm7,ymm7,ymm2
++	prefetcht0	[63+r12]
++	vpslld	ymm2,ymm13,7
++	vpandn	ymm0,ymm13,ymm15
++	vpand	ymm4,ymm13,ymm14
++	prefetcht0	[63+r13]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm8,ymm9,2
++	vpxor	ymm7,ymm7,ymm2
++	prefetcht0	[63+r14]
++	vpslld	ymm1,ymm9,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm10,ymm9
++	prefetcht0	[63+r15]
++	vpxor	ymm8,ymm8,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm9,13
++	prefetcht0	[63+r8]
++	vpslld	ymm2,ymm9,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm3,ymm3,ymm4
++	prefetcht0	[63+r9]
++	vpxor	ymm7,ymm8,ymm1
++
++	vpsrld	ymm1,ymm9,22
++	vpxor	ymm7,ymm7,ymm2
++	prefetcht0	[63+r10]
++	vpslld	ymm2,ymm9,10
++	vpxor	ymm8,ymm10,ymm3
++	vpaddd	ymm12,ymm12,ymm5
++	prefetcht0	[63+r11]
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm8,ymm8,ymm5
++	vpaddd	ymm8,ymm8,ymm7
++	add	rbp,256
++	vmovdqu	ymm5,YMMWORD[((0-128))+rax]
++	mov	ecx,3
++	jmp	NEAR $L$oop_16_xx_avx2
++ALIGN	32
++$L$oop_16_xx_avx2:
++	vmovdqu	ymm6,YMMWORD[((32-128))+rax]
++	vpaddd	ymm5,ymm5,YMMWORD[((288-256-128))+rbx]
++
++	vpsrld	ymm7,ymm6,3
++	vpsrld	ymm1,ymm6,7
++	vpslld	ymm2,ymm6,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm6,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm6,14
++	vmovdqu	ymm0,YMMWORD[((448-256-128))+rbx]
++	vpsrld	ymm3,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm5,ymm5,ymm7
++	vpxor	ymm7,ymm3,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm5,ymm5,ymm7
++	vpsrld	ymm7,ymm12,6
++	vpslld	ymm2,ymm12,26
++	vmovdqu	YMMWORD[(0-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm15
++
++	vpsrld	ymm1,ymm12,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm12,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-128))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm12,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm12,7
++	vpandn	ymm0,ymm12,ymm14
++	vpand	ymm3,ymm12,ymm13
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm15,ymm8,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm8,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm9,ymm8
++
++	vpxor	ymm15,ymm15,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm8,13
++
++	vpslld	ymm2,ymm8,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm15,ymm1
++
++	vpsrld	ymm1,ymm8,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm8,10
++	vpxor	ymm15,ymm9,ymm4
++	vpaddd	ymm11,ymm11,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm15,ymm15,ymm5
++	vpaddd	ymm15,ymm15,ymm7
++	vmovdqu	ymm5,YMMWORD[((64-128))+rax]
++	vpaddd	ymm6,ymm6,YMMWORD[((320-256-128))+rbx]
++
++	vpsrld	ymm7,ymm5,3
++	vpsrld	ymm1,ymm5,7
++	vpslld	ymm2,ymm5,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm5,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm5,14
++	vmovdqu	ymm0,YMMWORD[((480-256-128))+rbx]
++	vpsrld	ymm4,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm6,ymm6,ymm7
++	vpxor	ymm7,ymm4,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm6,ymm6,ymm7
++	vpsrld	ymm7,ymm11,6
++	vpslld	ymm2,ymm11,26
++	vmovdqu	YMMWORD[(32-128)+rax],ymm6
++	vpaddd	ymm6,ymm6,ymm14
++
++	vpsrld	ymm1,ymm11,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm11,21
++	vpaddd	ymm6,ymm6,YMMWORD[((-96))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm11,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm11,7
++	vpandn	ymm0,ymm11,ymm13
++	vpand	ymm4,ymm11,ymm12
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm14,ymm15,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm15,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm8,ymm15
++
++	vpxor	ymm14,ymm14,ymm1
++	vpaddd	ymm6,ymm6,ymm7
++
++	vpsrld	ymm1,ymm15,13
++
++	vpslld	ymm2,ymm15,19
++	vpaddd	ymm6,ymm6,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm14,ymm1
++
++	vpsrld	ymm1,ymm15,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm15,10
++	vpxor	ymm14,ymm8,ymm3
++	vpaddd	ymm10,ymm10,ymm6
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm14,ymm14,ymm6
++	vpaddd	ymm14,ymm14,ymm7
++	vmovdqu	ymm6,YMMWORD[((96-128))+rax]
++	vpaddd	ymm5,ymm5,YMMWORD[((352-256-128))+rbx]
++
++	vpsrld	ymm7,ymm6,3
++	vpsrld	ymm1,ymm6,7
++	vpslld	ymm2,ymm6,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm6,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm6,14
++	vmovdqu	ymm0,YMMWORD[((0-128))+rax]
++	vpsrld	ymm3,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm5,ymm5,ymm7
++	vpxor	ymm7,ymm3,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm5,ymm5,ymm7
++	vpsrld	ymm7,ymm10,6
++	vpslld	ymm2,ymm10,26
++	vmovdqu	YMMWORD[(64-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm13
++
++	vpsrld	ymm1,ymm10,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm10,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-64))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm10,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm10,7
++	vpandn	ymm0,ymm10,ymm12
++	vpand	ymm3,ymm10,ymm11
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm13,ymm14,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm14,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm15,ymm14
++
++	vpxor	ymm13,ymm13,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm14,13
++
++	vpslld	ymm2,ymm14,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm13,ymm1
++
++	vpsrld	ymm1,ymm14,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm14,10
++	vpxor	ymm13,ymm15,ymm4
++	vpaddd	ymm9,ymm9,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm13,ymm13,ymm5
++	vpaddd	ymm13,ymm13,ymm7
++	vmovdqu	ymm5,YMMWORD[((128-128))+rax]
++	vpaddd	ymm6,ymm6,YMMWORD[((384-256-128))+rbx]
++
++	vpsrld	ymm7,ymm5,3
++	vpsrld	ymm1,ymm5,7
++	vpslld	ymm2,ymm5,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm5,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm5,14
++	vmovdqu	ymm0,YMMWORD[((32-128))+rax]
++	vpsrld	ymm4,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm6,ymm6,ymm7
++	vpxor	ymm7,ymm4,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm6,ymm6,ymm7
++	vpsrld	ymm7,ymm9,6
++	vpslld	ymm2,ymm9,26
++	vmovdqu	YMMWORD[(96-128)+rax],ymm6
++	vpaddd	ymm6,ymm6,ymm12
++
++	vpsrld	ymm1,ymm9,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm9,21
++	vpaddd	ymm6,ymm6,YMMWORD[((-32))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm9,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm9,7
++	vpandn	ymm0,ymm9,ymm11
++	vpand	ymm4,ymm9,ymm10
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm12,ymm13,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm13,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm14,ymm13
++
++	vpxor	ymm12,ymm12,ymm1
++	vpaddd	ymm6,ymm6,ymm7
++
++	vpsrld	ymm1,ymm13,13
++
++	vpslld	ymm2,ymm13,19
++	vpaddd	ymm6,ymm6,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm12,ymm1
++
++	vpsrld	ymm1,ymm13,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm13,10
++	vpxor	ymm12,ymm14,ymm3
++	vpaddd	ymm8,ymm8,ymm6
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm12,ymm12,ymm6
++	vpaddd	ymm12,ymm12,ymm7
++	vmovdqu	ymm6,YMMWORD[((160-128))+rax]
++	vpaddd	ymm5,ymm5,YMMWORD[((416-256-128))+rbx]
++
++	vpsrld	ymm7,ymm6,3
++	vpsrld	ymm1,ymm6,7
++	vpslld	ymm2,ymm6,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm6,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm6,14
++	vmovdqu	ymm0,YMMWORD[((64-128))+rax]
++	vpsrld	ymm3,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm5,ymm5,ymm7
++	vpxor	ymm7,ymm3,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm5,ymm5,ymm7
++	vpsrld	ymm7,ymm8,6
++	vpslld	ymm2,ymm8,26
++	vmovdqu	YMMWORD[(128-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm11
++
++	vpsrld	ymm1,ymm8,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm8,21
++	vpaddd	ymm5,ymm5,YMMWORD[rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm8,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm8,7
++	vpandn	ymm0,ymm8,ymm10
++	vpand	ymm3,ymm8,ymm9
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm11,ymm12,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm12,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm13,ymm12
++
++	vpxor	ymm11,ymm11,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm12,13
++
++	vpslld	ymm2,ymm12,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm11,ymm1
++
++	vpsrld	ymm1,ymm12,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm12,10
++	vpxor	ymm11,ymm13,ymm4
++	vpaddd	ymm15,ymm15,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm11,ymm11,ymm5
++	vpaddd	ymm11,ymm11,ymm7
++	vmovdqu	ymm5,YMMWORD[((192-128))+rax]
++	vpaddd	ymm6,ymm6,YMMWORD[((448-256-128))+rbx]
++
++	vpsrld	ymm7,ymm5,3
++	vpsrld	ymm1,ymm5,7
++	vpslld	ymm2,ymm5,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm5,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm5,14
++	vmovdqu	ymm0,YMMWORD[((96-128))+rax]
++	vpsrld	ymm4,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm6,ymm6,ymm7
++	vpxor	ymm7,ymm4,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm6,ymm6,ymm7
++	vpsrld	ymm7,ymm15,6
++	vpslld	ymm2,ymm15,26
++	vmovdqu	YMMWORD[(160-128)+rax],ymm6
++	vpaddd	ymm6,ymm6,ymm10
++
++	vpsrld	ymm1,ymm15,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm15,21
++	vpaddd	ymm6,ymm6,YMMWORD[32+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm15,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm15,7
++	vpandn	ymm0,ymm15,ymm9
++	vpand	ymm4,ymm15,ymm8
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm10,ymm11,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm11,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm12,ymm11
++
++	vpxor	ymm10,ymm10,ymm1
++	vpaddd	ymm6,ymm6,ymm7
++
++	vpsrld	ymm1,ymm11,13
++
++	vpslld	ymm2,ymm11,19
++	vpaddd	ymm6,ymm6,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm10,ymm1
++
++	vpsrld	ymm1,ymm11,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm11,10
++	vpxor	ymm10,ymm12,ymm3
++	vpaddd	ymm14,ymm14,ymm6
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm10,ymm10,ymm6
++	vpaddd	ymm10,ymm10,ymm7
++	vmovdqu	ymm6,YMMWORD[((224-128))+rax]
++	vpaddd	ymm5,ymm5,YMMWORD[((480-256-128))+rbx]
++
++	vpsrld	ymm7,ymm6,3
++	vpsrld	ymm1,ymm6,7
++	vpslld	ymm2,ymm6,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm6,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm6,14
++	vmovdqu	ymm0,YMMWORD[((128-128))+rax]
++	vpsrld	ymm3,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm5,ymm5,ymm7
++	vpxor	ymm7,ymm3,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm5,ymm5,ymm7
++	vpsrld	ymm7,ymm14,6
++	vpslld	ymm2,ymm14,26
++	vmovdqu	YMMWORD[(192-128)+rax],ymm5
++	vpaddd	ymm5,ymm5,ymm9
++
++	vpsrld	ymm1,ymm14,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm14,21
++	vpaddd	ymm5,ymm5,YMMWORD[64+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm14,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm14,7
++	vpandn	ymm0,ymm14,ymm8
++	vpand	ymm3,ymm14,ymm15
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm9,ymm10,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm10,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm11,ymm10
++
++	vpxor	ymm9,ymm9,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm10,13
++
++	vpslld	ymm2,ymm10,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm9,ymm1
++
++	vpsrld	ymm1,ymm10,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm10,10
++	vpxor	ymm9,ymm11,ymm4
++	vpaddd	ymm13,ymm13,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm9,ymm9,ymm5
++	vpaddd	ymm9,ymm9,ymm7
++	vmovdqu	ymm5,YMMWORD[((256-256-128))+rbx]
++	vpaddd	ymm6,ymm6,YMMWORD[((0-128))+rax]
++
++	vpsrld	ymm7,ymm5,3
++	vpsrld	ymm1,ymm5,7
++	vpslld	ymm2,ymm5,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm5,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm5,14
++	vmovdqu	ymm0,YMMWORD[((160-128))+rax]
++	vpsrld	ymm4,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm6,ymm6,ymm7
++	vpxor	ymm7,ymm4,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm6,ymm6,ymm7
++	vpsrld	ymm7,ymm13,6
++	vpslld	ymm2,ymm13,26
++	vmovdqu	YMMWORD[(224-128)+rax],ymm6
++	vpaddd	ymm6,ymm6,ymm8
++
++	vpsrld	ymm1,ymm13,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm13,21
++	vpaddd	ymm6,ymm6,YMMWORD[96+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm13,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm13,7
++	vpandn	ymm0,ymm13,ymm15
++	vpand	ymm4,ymm13,ymm14
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm8,ymm9,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm9,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm10,ymm9
++
++	vpxor	ymm8,ymm8,ymm1
++	vpaddd	ymm6,ymm6,ymm7
++
++	vpsrld	ymm1,ymm9,13
++
++	vpslld	ymm2,ymm9,19
++	vpaddd	ymm6,ymm6,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm8,ymm1
++
++	vpsrld	ymm1,ymm9,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm9,10
++	vpxor	ymm8,ymm10,ymm3
++	vpaddd	ymm12,ymm12,ymm6
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm8,ymm8,ymm6
++	vpaddd	ymm8,ymm8,ymm7
++	add	rbp,256
++	vmovdqu	ymm6,YMMWORD[((288-256-128))+rbx]
++	vpaddd	ymm5,ymm5,YMMWORD[((32-128))+rax]
++
++	vpsrld	ymm7,ymm6,3
++	vpsrld	ymm1,ymm6,7
++	vpslld	ymm2,ymm6,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm6,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm6,14
++	vmovdqu	ymm0,YMMWORD[((192-128))+rax]
++	vpsrld	ymm3,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm5,ymm5,ymm7
++	vpxor	ymm7,ymm3,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm5,ymm5,ymm7
++	vpsrld	ymm7,ymm12,6
++	vpslld	ymm2,ymm12,26
++	vmovdqu	YMMWORD[(256-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm15
++
++	vpsrld	ymm1,ymm12,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm12,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-128))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm12,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm12,7
++	vpandn	ymm0,ymm12,ymm14
++	vpand	ymm3,ymm12,ymm13
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm15,ymm8,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm8,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm9,ymm8
++
++	vpxor	ymm15,ymm15,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm8,13
++
++	vpslld	ymm2,ymm8,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm15,ymm1
++
++	vpsrld	ymm1,ymm8,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm8,10
++	vpxor	ymm15,ymm9,ymm4
++	vpaddd	ymm11,ymm11,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm15,ymm15,ymm5
++	vpaddd	ymm15,ymm15,ymm7
++	vmovdqu	ymm5,YMMWORD[((320-256-128))+rbx]
++	vpaddd	ymm6,ymm6,YMMWORD[((64-128))+rax]
++
++	vpsrld	ymm7,ymm5,3
++	vpsrld	ymm1,ymm5,7
++	vpslld	ymm2,ymm5,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm5,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm5,14
++	vmovdqu	ymm0,YMMWORD[((224-128))+rax]
++	vpsrld	ymm4,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm6,ymm6,ymm7
++	vpxor	ymm7,ymm4,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm6,ymm6,ymm7
++	vpsrld	ymm7,ymm11,6
++	vpslld	ymm2,ymm11,26
++	vmovdqu	YMMWORD[(288-256-128)+rbx],ymm6
++	vpaddd	ymm6,ymm6,ymm14
++
++	vpsrld	ymm1,ymm11,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm11,21
++	vpaddd	ymm6,ymm6,YMMWORD[((-96))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm11,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm11,7
++	vpandn	ymm0,ymm11,ymm13
++	vpand	ymm4,ymm11,ymm12
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm14,ymm15,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm15,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm8,ymm15
++
++	vpxor	ymm14,ymm14,ymm1
++	vpaddd	ymm6,ymm6,ymm7
++
++	vpsrld	ymm1,ymm15,13
++
++	vpslld	ymm2,ymm15,19
++	vpaddd	ymm6,ymm6,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm14,ymm1
++
++	vpsrld	ymm1,ymm15,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm15,10
++	vpxor	ymm14,ymm8,ymm3
++	vpaddd	ymm10,ymm10,ymm6
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm14,ymm14,ymm6
++	vpaddd	ymm14,ymm14,ymm7
++	vmovdqu	ymm6,YMMWORD[((352-256-128))+rbx]
++	vpaddd	ymm5,ymm5,YMMWORD[((96-128))+rax]
++
++	vpsrld	ymm7,ymm6,3
++	vpsrld	ymm1,ymm6,7
++	vpslld	ymm2,ymm6,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm6,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm6,14
++	vmovdqu	ymm0,YMMWORD[((256-256-128))+rbx]
++	vpsrld	ymm3,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm5,ymm5,ymm7
++	vpxor	ymm7,ymm3,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm5,ymm5,ymm7
++	vpsrld	ymm7,ymm10,6
++	vpslld	ymm2,ymm10,26
++	vmovdqu	YMMWORD[(320-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm13
++
++	vpsrld	ymm1,ymm10,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm10,21
++	vpaddd	ymm5,ymm5,YMMWORD[((-64))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm10,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm10,7
++	vpandn	ymm0,ymm10,ymm12
++	vpand	ymm3,ymm10,ymm11
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm13,ymm14,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm14,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm15,ymm14
++
++	vpxor	ymm13,ymm13,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm14,13
++
++	vpslld	ymm2,ymm14,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm13,ymm1
++
++	vpsrld	ymm1,ymm14,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm14,10
++	vpxor	ymm13,ymm15,ymm4
++	vpaddd	ymm9,ymm9,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm13,ymm13,ymm5
++	vpaddd	ymm13,ymm13,ymm7
++	vmovdqu	ymm5,YMMWORD[((384-256-128))+rbx]
++	vpaddd	ymm6,ymm6,YMMWORD[((128-128))+rax]
++
++	vpsrld	ymm7,ymm5,3
++	vpsrld	ymm1,ymm5,7
++	vpslld	ymm2,ymm5,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm5,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm5,14
++	vmovdqu	ymm0,YMMWORD[((288-256-128))+rbx]
++	vpsrld	ymm4,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm6,ymm6,ymm7
++	vpxor	ymm7,ymm4,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm6,ymm6,ymm7
++	vpsrld	ymm7,ymm9,6
++	vpslld	ymm2,ymm9,26
++	vmovdqu	YMMWORD[(352-256-128)+rbx],ymm6
++	vpaddd	ymm6,ymm6,ymm12
++
++	vpsrld	ymm1,ymm9,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm9,21
++	vpaddd	ymm6,ymm6,YMMWORD[((-32))+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm9,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm9,7
++	vpandn	ymm0,ymm9,ymm11
++	vpand	ymm4,ymm9,ymm10
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm12,ymm13,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm13,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm14,ymm13
++
++	vpxor	ymm12,ymm12,ymm1
++	vpaddd	ymm6,ymm6,ymm7
++
++	vpsrld	ymm1,ymm13,13
++
++	vpslld	ymm2,ymm13,19
++	vpaddd	ymm6,ymm6,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm12,ymm1
++
++	vpsrld	ymm1,ymm13,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm13,10
++	vpxor	ymm12,ymm14,ymm3
++	vpaddd	ymm8,ymm8,ymm6
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm12,ymm12,ymm6
++	vpaddd	ymm12,ymm12,ymm7
++	vmovdqu	ymm6,YMMWORD[((416-256-128))+rbx]
++	vpaddd	ymm5,ymm5,YMMWORD[((160-128))+rax]
++
++	vpsrld	ymm7,ymm6,3
++	vpsrld	ymm1,ymm6,7
++	vpslld	ymm2,ymm6,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm6,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm6,14
++	vmovdqu	ymm0,YMMWORD[((320-256-128))+rbx]
++	vpsrld	ymm3,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm5,ymm5,ymm7
++	vpxor	ymm7,ymm3,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm5,ymm5,ymm7
++	vpsrld	ymm7,ymm8,6
++	vpslld	ymm2,ymm8,26
++	vmovdqu	YMMWORD[(384-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm11
++
++	vpsrld	ymm1,ymm8,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm8,21
++	vpaddd	ymm5,ymm5,YMMWORD[rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm8,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm8,7
++	vpandn	ymm0,ymm8,ymm10
++	vpand	ymm3,ymm8,ymm9
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm11,ymm12,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm12,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm13,ymm12
++
++	vpxor	ymm11,ymm11,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm12,13
++
++	vpslld	ymm2,ymm12,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm11,ymm1
++
++	vpsrld	ymm1,ymm12,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm12,10
++	vpxor	ymm11,ymm13,ymm4
++	vpaddd	ymm15,ymm15,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm11,ymm11,ymm5
++	vpaddd	ymm11,ymm11,ymm7
++	vmovdqu	ymm5,YMMWORD[((448-256-128))+rbx]
++	vpaddd	ymm6,ymm6,YMMWORD[((192-128))+rax]
++
++	vpsrld	ymm7,ymm5,3
++	vpsrld	ymm1,ymm5,7
++	vpslld	ymm2,ymm5,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm5,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm5,14
++	vmovdqu	ymm0,YMMWORD[((352-256-128))+rbx]
++	vpsrld	ymm4,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm6,ymm6,ymm7
++	vpxor	ymm7,ymm4,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm6,ymm6,ymm7
++	vpsrld	ymm7,ymm15,6
++	vpslld	ymm2,ymm15,26
++	vmovdqu	YMMWORD[(416-256-128)+rbx],ymm6
++	vpaddd	ymm6,ymm6,ymm10
++
++	vpsrld	ymm1,ymm15,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm15,21
++	vpaddd	ymm6,ymm6,YMMWORD[32+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm15,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm15,7
++	vpandn	ymm0,ymm15,ymm9
++	vpand	ymm4,ymm15,ymm8
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm10,ymm11,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm11,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm12,ymm11
++
++	vpxor	ymm10,ymm10,ymm1
++	vpaddd	ymm6,ymm6,ymm7
++
++	vpsrld	ymm1,ymm11,13
++
++	vpslld	ymm2,ymm11,19
++	vpaddd	ymm6,ymm6,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm10,ymm1
++
++	vpsrld	ymm1,ymm11,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm11,10
++	vpxor	ymm10,ymm12,ymm3
++	vpaddd	ymm14,ymm14,ymm6
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm10,ymm10,ymm6
++	vpaddd	ymm10,ymm10,ymm7
++	vmovdqu	ymm6,YMMWORD[((480-256-128))+rbx]
++	vpaddd	ymm5,ymm5,YMMWORD[((224-128))+rax]
++
++	vpsrld	ymm7,ymm6,3
++	vpsrld	ymm1,ymm6,7
++	vpslld	ymm2,ymm6,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm6,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm6,14
++	vmovdqu	ymm0,YMMWORD[((384-256-128))+rbx]
++	vpsrld	ymm3,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm5,ymm5,ymm7
++	vpxor	ymm7,ymm3,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm5,ymm5,ymm7
++	vpsrld	ymm7,ymm14,6
++	vpslld	ymm2,ymm14,26
++	vmovdqu	YMMWORD[(448-256-128)+rbx],ymm5
++	vpaddd	ymm5,ymm5,ymm9
++
++	vpsrld	ymm1,ymm14,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm14,21
++	vpaddd	ymm5,ymm5,YMMWORD[64+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm14,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm14,7
++	vpandn	ymm0,ymm14,ymm8
++	vpand	ymm3,ymm14,ymm15
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm9,ymm10,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm10,30
++	vpxor	ymm0,ymm0,ymm3
++	vpxor	ymm3,ymm11,ymm10
++
++	vpxor	ymm9,ymm9,ymm1
++	vpaddd	ymm5,ymm5,ymm7
++
++	vpsrld	ymm1,ymm10,13
++
++	vpslld	ymm2,ymm10,19
++	vpaddd	ymm5,ymm5,ymm0
++	vpand	ymm4,ymm4,ymm3
++
++	vpxor	ymm7,ymm9,ymm1
++
++	vpsrld	ymm1,ymm10,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm10,10
++	vpxor	ymm9,ymm11,ymm4
++	vpaddd	ymm13,ymm13,ymm5
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm9,ymm9,ymm5
++	vpaddd	ymm9,ymm9,ymm7
++	vmovdqu	ymm5,YMMWORD[((0-128))+rax]
++	vpaddd	ymm6,ymm6,YMMWORD[((256-256-128))+rbx]
++
++	vpsrld	ymm7,ymm5,3
++	vpsrld	ymm1,ymm5,7
++	vpslld	ymm2,ymm5,25
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm5,18
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm5,14
++	vmovdqu	ymm0,YMMWORD[((416-256-128))+rbx]
++	vpsrld	ymm4,ymm0,10
++
++	vpxor	ymm7,ymm7,ymm1
++	vpsrld	ymm1,ymm0,17
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,15
++	vpaddd	ymm6,ymm6,ymm7
++	vpxor	ymm7,ymm4,ymm1
++	vpsrld	ymm1,ymm0,19
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm0,13
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++	vpaddd	ymm6,ymm6,ymm7
++	vpsrld	ymm7,ymm13,6
++	vpslld	ymm2,ymm13,26
++	vmovdqu	YMMWORD[(480-256-128)+rbx],ymm6
++	vpaddd	ymm6,ymm6,ymm8
++
++	vpsrld	ymm1,ymm13,11
++	vpxor	ymm7,ymm7,ymm2
++	vpslld	ymm2,ymm13,21
++	vpaddd	ymm6,ymm6,YMMWORD[96+rbp]
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm1,ymm13,25
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm13,7
++	vpandn	ymm0,ymm13,ymm15
++	vpand	ymm4,ymm13,ymm14
++
++	vpxor	ymm7,ymm7,ymm1
++
++	vpsrld	ymm8,ymm9,2
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm1,ymm9,30
++	vpxor	ymm0,ymm0,ymm4
++	vpxor	ymm4,ymm10,ymm9
++
++	vpxor	ymm8,ymm8,ymm1
++	vpaddd	ymm6,ymm6,ymm7
++
++	vpsrld	ymm1,ymm9,13
++
++	vpslld	ymm2,ymm9,19
++	vpaddd	ymm6,ymm6,ymm0
++	vpand	ymm3,ymm3,ymm4
++
++	vpxor	ymm7,ymm8,ymm1
++
++	vpsrld	ymm1,ymm9,22
++	vpxor	ymm7,ymm7,ymm2
++
++	vpslld	ymm2,ymm9,10
++	vpxor	ymm8,ymm10,ymm3
++	vpaddd	ymm12,ymm12,ymm6
++
++	vpxor	ymm7,ymm7,ymm1
++	vpxor	ymm7,ymm7,ymm2
++
++	vpaddd	ymm8,ymm8,ymm6
++	vpaddd	ymm8,ymm8,ymm7
++	add	rbp,256
++	dec	ecx
++	jnz	NEAR $L$oop_16_xx_avx2
++
++	mov	ecx,1
++	lea	rbx,[512+rsp]
++	lea	rbp,[((K256+128))]
++	cmp	ecx,DWORD[rbx]
++	cmovge	r12,rbp
++	cmp	ecx,DWORD[4+rbx]
++	cmovge	r13,rbp
++	cmp	ecx,DWORD[8+rbx]
++	cmovge	r14,rbp
++	cmp	ecx,DWORD[12+rbx]
++	cmovge	r15,rbp
++	cmp	ecx,DWORD[16+rbx]
++	cmovge	r8,rbp
++	cmp	ecx,DWORD[20+rbx]
++	cmovge	r9,rbp
++	cmp	ecx,DWORD[24+rbx]
++	cmovge	r10,rbp
++	cmp	ecx,DWORD[28+rbx]
++	cmovge	r11,rbp
++	vmovdqa	ymm7,YMMWORD[rbx]
++	vpxor	ymm0,ymm0,ymm0
++	vmovdqa	ymm6,ymm7
++	vpcmpgtd	ymm6,ymm6,ymm0
++	vpaddd	ymm7,ymm7,ymm6
++
++	vmovdqu	ymm0,YMMWORD[((0-128))+rdi]
++	vpand	ymm8,ymm8,ymm6
++	vmovdqu	ymm1,YMMWORD[((32-128))+rdi]
++	vpand	ymm9,ymm9,ymm6
++	vmovdqu	ymm2,YMMWORD[((64-128))+rdi]
++	vpand	ymm10,ymm10,ymm6
++	vmovdqu	ymm5,YMMWORD[((96-128))+rdi]
++	vpand	ymm11,ymm11,ymm6
++	vpaddd	ymm8,ymm8,ymm0
++	vmovdqu	ymm0,YMMWORD[((128-128))+rdi]
++	vpand	ymm12,ymm12,ymm6
++	vpaddd	ymm9,ymm9,ymm1
++	vmovdqu	ymm1,YMMWORD[((160-128))+rdi]
++	vpand	ymm13,ymm13,ymm6
++	vpaddd	ymm10,ymm10,ymm2
++	vmovdqu	ymm2,YMMWORD[((192-128))+rdi]
++	vpand	ymm14,ymm14,ymm6
++	vpaddd	ymm11,ymm11,ymm5
++	vmovdqu	ymm5,YMMWORD[((224-128))+rdi]
++	vpand	ymm15,ymm15,ymm6
++	vpaddd	ymm12,ymm12,ymm0
++	vpaddd	ymm13,ymm13,ymm1
++	vmovdqu	YMMWORD[(0-128)+rdi],ymm8
++	vpaddd	ymm14,ymm14,ymm2
++	vmovdqu	YMMWORD[(32-128)+rdi],ymm9
++	vpaddd	ymm15,ymm15,ymm5
++	vmovdqu	YMMWORD[(64-128)+rdi],ymm10
++	vmovdqu	YMMWORD[(96-128)+rdi],ymm11
++	vmovdqu	YMMWORD[(128-128)+rdi],ymm12
++	vmovdqu	YMMWORD[(160-128)+rdi],ymm13
++	vmovdqu	YMMWORD[(192-128)+rdi],ymm14
++	vmovdqu	YMMWORD[(224-128)+rdi],ymm15
++
++	vmovdqu	YMMWORD[rbx],ymm7
++	lea	rbx,[((256+128))+rsp]
++	vmovdqu	ymm6,YMMWORD[$L$pbswap]
++	dec	edx
++	jnz	NEAR $L$oop_avx2
++
++
++
++
++
++
++
++$L$done_avx2:
++	mov	rax,QWORD[544+rsp]
++	vzeroupper
++	movaps	xmm6,XMMWORD[((-216))+rax]
++	movaps	xmm7,XMMWORD[((-200))+rax]
++	movaps	xmm8,XMMWORD[((-184))+rax]
++	movaps	xmm9,XMMWORD[((-168))+rax]
++	movaps	xmm10,XMMWORD[((-152))+rax]
++	movaps	xmm11,XMMWORD[((-136))+rax]
++	movaps	xmm12,XMMWORD[((-120))+rax]
++	movaps	xmm13,XMMWORD[((-104))+rax]
++	movaps	xmm14,XMMWORD[((-88))+rax]
++	movaps	xmm15,XMMWORD[((-72))+rax]
++	mov	r15,QWORD[((-48))+rax]
++	mov	r14,QWORD[((-40))+rax]
++	mov	r13,QWORD[((-32))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	rbx,QWORD[((-8))+rax]
++	lea	rsp,[rax]
++$L$epilogue_avx2:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha256_multi_block_avx2:
++ALIGN	256
++K256:
++	DD	1116352408,1116352408,1116352408,1116352408
++	DD	1116352408,1116352408,1116352408,1116352408
++	DD	1899447441,1899447441,1899447441,1899447441
++	DD	1899447441,1899447441,1899447441,1899447441
++	DD	3049323471,3049323471,3049323471,3049323471
++	DD	3049323471,3049323471,3049323471,3049323471
++	DD	3921009573,3921009573,3921009573,3921009573
++	DD	3921009573,3921009573,3921009573,3921009573
++	DD	961987163,961987163,961987163,961987163
++	DD	961987163,961987163,961987163,961987163
++	DD	1508970993,1508970993,1508970993,1508970993
++	DD	1508970993,1508970993,1508970993,1508970993
++	DD	2453635748,2453635748,2453635748,2453635748
++	DD	2453635748,2453635748,2453635748,2453635748
++	DD	2870763221,2870763221,2870763221,2870763221
++	DD	2870763221,2870763221,2870763221,2870763221
++	DD	3624381080,3624381080,3624381080,3624381080
++	DD	3624381080,3624381080,3624381080,3624381080
++	DD	310598401,310598401,310598401,310598401
++	DD	310598401,310598401,310598401,310598401
++	DD	607225278,607225278,607225278,607225278
++	DD	607225278,607225278,607225278,607225278
++	DD	1426881987,1426881987,1426881987,1426881987
++	DD	1426881987,1426881987,1426881987,1426881987
++	DD	1925078388,1925078388,1925078388,1925078388
++	DD	1925078388,1925078388,1925078388,1925078388
++	DD	2162078206,2162078206,2162078206,2162078206
++	DD	2162078206,2162078206,2162078206,2162078206
++	DD	2614888103,2614888103,2614888103,2614888103
++	DD	2614888103,2614888103,2614888103,2614888103
++	DD	3248222580,3248222580,3248222580,3248222580
++	DD	3248222580,3248222580,3248222580,3248222580
++	DD	3835390401,3835390401,3835390401,3835390401
++	DD	3835390401,3835390401,3835390401,3835390401
++	DD	4022224774,4022224774,4022224774,4022224774
++	DD	4022224774,4022224774,4022224774,4022224774
++	DD	264347078,264347078,264347078,264347078
++	DD	264347078,264347078,264347078,264347078
++	DD	604807628,604807628,604807628,604807628
++	DD	604807628,604807628,604807628,604807628
++	DD	770255983,770255983,770255983,770255983
++	DD	770255983,770255983,770255983,770255983
++	DD	1249150122,1249150122,1249150122,1249150122
++	DD	1249150122,1249150122,1249150122,1249150122
++	DD	1555081692,1555081692,1555081692,1555081692
++	DD	1555081692,1555081692,1555081692,1555081692
++	DD	1996064986,1996064986,1996064986,1996064986
++	DD	1996064986,1996064986,1996064986,1996064986
++	DD	2554220882,2554220882,2554220882,2554220882
++	DD	2554220882,2554220882,2554220882,2554220882
++	DD	2821834349,2821834349,2821834349,2821834349
++	DD	2821834349,2821834349,2821834349,2821834349
++	DD	2952996808,2952996808,2952996808,2952996808
++	DD	2952996808,2952996808,2952996808,2952996808
++	DD	3210313671,3210313671,3210313671,3210313671
++	DD	3210313671,3210313671,3210313671,3210313671
++	DD	3336571891,3336571891,3336571891,3336571891
++	DD	3336571891,3336571891,3336571891,3336571891
++	DD	3584528711,3584528711,3584528711,3584528711
++	DD	3584528711,3584528711,3584528711,3584528711
++	DD	113926993,113926993,113926993,113926993
++	DD	113926993,113926993,113926993,113926993
++	DD	338241895,338241895,338241895,338241895
++	DD	338241895,338241895,338241895,338241895
++	DD	666307205,666307205,666307205,666307205
++	DD	666307205,666307205,666307205,666307205
++	DD	773529912,773529912,773529912,773529912
++	DD	773529912,773529912,773529912,773529912
++	DD	1294757372,1294757372,1294757372,1294757372
++	DD	1294757372,1294757372,1294757372,1294757372
++	DD	1396182291,1396182291,1396182291,1396182291
++	DD	1396182291,1396182291,1396182291,1396182291
++	DD	1695183700,1695183700,1695183700,1695183700
++	DD	1695183700,1695183700,1695183700,1695183700
++	DD	1986661051,1986661051,1986661051,1986661051
++	DD	1986661051,1986661051,1986661051,1986661051
++	DD	2177026350,2177026350,2177026350,2177026350
++	DD	2177026350,2177026350,2177026350,2177026350
++	DD	2456956037,2456956037,2456956037,2456956037
++	DD	2456956037,2456956037,2456956037,2456956037
++	DD	2730485921,2730485921,2730485921,2730485921
++	DD	2730485921,2730485921,2730485921,2730485921
++	DD	2820302411,2820302411,2820302411,2820302411
++	DD	2820302411,2820302411,2820302411,2820302411
++	DD	3259730800,3259730800,3259730800,3259730800
++	DD	3259730800,3259730800,3259730800,3259730800
++	DD	3345764771,3345764771,3345764771,3345764771
++	DD	3345764771,3345764771,3345764771,3345764771
++	DD	3516065817,3516065817,3516065817,3516065817
++	DD	3516065817,3516065817,3516065817,3516065817
++	DD	3600352804,3600352804,3600352804,3600352804
++	DD	3600352804,3600352804,3600352804,3600352804
++	DD	4094571909,4094571909,4094571909,4094571909
++	DD	4094571909,4094571909,4094571909,4094571909
++	DD	275423344,275423344,275423344,275423344
++	DD	275423344,275423344,275423344,275423344
++	DD	430227734,430227734,430227734,430227734
++	DD	430227734,430227734,430227734,430227734
++	DD	506948616,506948616,506948616,506948616
++	DD	506948616,506948616,506948616,506948616
++	DD	659060556,659060556,659060556,659060556
++	DD	659060556,659060556,659060556,659060556
++	DD	883997877,883997877,883997877,883997877
++	DD	883997877,883997877,883997877,883997877
++	DD	958139571,958139571,958139571,958139571
++	DD	958139571,958139571,958139571,958139571
++	DD	1322822218,1322822218,1322822218,1322822218
++	DD	1322822218,1322822218,1322822218,1322822218
++	DD	1537002063,1537002063,1537002063,1537002063
++	DD	1537002063,1537002063,1537002063,1537002063
++	DD	1747873779,1747873779,1747873779,1747873779
++	DD	1747873779,1747873779,1747873779,1747873779
++	DD	1955562222,1955562222,1955562222,1955562222
++	DD	1955562222,1955562222,1955562222,1955562222
++	DD	2024104815,2024104815,2024104815,2024104815
++	DD	2024104815,2024104815,2024104815,2024104815
++	DD	2227730452,2227730452,2227730452,2227730452
++	DD	2227730452,2227730452,2227730452,2227730452
++	DD	2361852424,2361852424,2361852424,2361852424
++	DD	2361852424,2361852424,2361852424,2361852424
++	DD	2428436474,2428436474,2428436474,2428436474
++	DD	2428436474,2428436474,2428436474,2428436474
++	DD	2756734187,2756734187,2756734187,2756734187
++	DD	2756734187,2756734187,2756734187,2756734187
++	DD	3204031479,3204031479,3204031479,3204031479
++	DD	3204031479,3204031479,3204031479,3204031479
++	DD	3329325298,3329325298,3329325298,3329325298
++	DD	3329325298,3329325298,3329325298,3329325298
++$L$pbswap:
++	DD	0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f
++	DD	0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f
++K256_shaext:
++	DD	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
++	DD	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
++	DD	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
++	DD	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
++	DD	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
++	DD	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
++	DD	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
++	DD	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
++	DD	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
++	DD	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
++	DD	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
++	DD	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
++	DD	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
++	DD	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
++	DD	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
++	DD	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
++DB	83,72,65,50,53,54,32,109,117,108,116,105,45,98,108,111
++DB	99,107,32,116,114,97,110,115,102,111,114,109,32,102,111,114
++DB	32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71
++DB	65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112
++DB	101,110,115,115,108,46,111,114,103,62,0
++EXTERN	__imp_RtlVirtualUnwind
++
++ALIGN	16
++se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$in_prologue
++
++	mov	rax,QWORD[152+r8]
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$in_prologue
++
++	mov	rax,QWORD[272+rax]
++
++	mov	rbx,QWORD[((-8))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	QWORD[144+r8],rbx
++	mov	QWORD[160+r8],rbp
++
++	lea	rsi,[((-24-160))+rax]
++	lea	rdi,[512+r8]
++	mov	ecx,20
++	DD	0xa548f3fc
++
++$L$in_prologue:
++	mov	rdi,QWORD[8+rax]
++	mov	rsi,QWORD[16+rax]
++	mov	QWORD[152+r8],rax
++	mov	QWORD[168+r8],rsi
++	mov	QWORD[176+r8],rdi
++
++	mov	rdi,QWORD[40+r9]
++	mov	rsi,r8
++	mov	ecx,154
++	DD	0xa548f3fc
++
++	mov	rsi,r9
++	xor	rcx,rcx
++	mov	rdx,QWORD[8+rsi]
++	mov	r8,QWORD[rsi]
++	mov	r9,QWORD[16+rsi]
++	mov	r10,QWORD[40+rsi]
++	lea	r11,[56+rsi]
++	lea	r12,[24+rsi]
++	mov	QWORD[32+rsp],r10
++	mov	QWORD[40+rsp],r11
++	mov	QWORD[48+rsp],r12
++	mov	QWORD[56+rsp],rcx
++	call	QWORD[__imp_RtlVirtualUnwind]
++
++	mov	eax,1
++	add	rsp,64
++	popfq
++	pop	r15
++	pop	r14
++	pop	r13
++	pop	r12
++	pop	rbp
++	pop	rbx
++	pop	rdi
++	pop	rsi
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++avx2_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$in_prologue
++
++	mov	rax,QWORD[152+r8]
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$in_prologue
++
++	mov	rax,QWORD[544+r8]
++
++	mov	rbx,QWORD[((-8))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	r13,QWORD[((-32))+rax]
++	mov	r14,QWORD[((-40))+rax]
++	mov	r15,QWORD[((-48))+rax]
++	mov	QWORD[144+r8],rbx
++	mov	QWORD[160+r8],rbp
++	mov	QWORD[216+r8],r12
++	mov	QWORD[224+r8],r13
++	mov	QWORD[232+r8],r14
++	mov	QWORD[240+r8],r15
++
++	lea	rsi,[((-56-160))+rax]
++	lea	rdi,[512+r8]
++	mov	ecx,20
++	DD	0xa548f3fc
++
++	jmp	NEAR $L$in_prologue
++
++section	.pdata rdata align=4
++ALIGN	4
++	DD	$L$SEH_begin_sha256_multi_block wrt ..imagebase
++	DD	$L$SEH_end_sha256_multi_block wrt ..imagebase
++	DD	$L$SEH_info_sha256_multi_block wrt ..imagebase
++	DD	$L$SEH_begin_sha256_multi_block_shaext wrt ..imagebase
++	DD	$L$SEH_end_sha256_multi_block_shaext wrt ..imagebase
++	DD	$L$SEH_info_sha256_multi_block_shaext wrt ..imagebase
++	DD	$L$SEH_begin_sha256_multi_block_avx wrt ..imagebase
++	DD	$L$SEH_end_sha256_multi_block_avx wrt ..imagebase
++	DD	$L$SEH_info_sha256_multi_block_avx wrt ..imagebase
++	DD	$L$SEH_begin_sha256_multi_block_avx2 wrt ..imagebase
++	DD	$L$SEH_end_sha256_multi_block_avx2 wrt ..imagebase
++	DD	$L$SEH_info_sha256_multi_block_avx2 wrt ..imagebase
++section	.xdata rdata align=8
++ALIGN	8
++$L$SEH_info_sha256_multi_block:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$body wrt ..imagebase,$L$epilogue wrt ..imagebase
++$L$SEH_info_sha256_multi_block_shaext:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$body_shaext wrt ..imagebase,$L$epilogue_shaext wrt ..imagebase
++$L$SEH_info_sha256_multi_block_avx:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$body_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase
++$L$SEH_info_sha256_multi_block_avx2:
++DB	9,0,0,0
++	DD	avx2_handler wrt ..imagebase
++	DD	$L$body_avx2 wrt ..imagebase,$L$epilogue_avx2 wrt ..imagebase
+diff --git a/SMP/lib/accelerated/x86/coff/sha256-ssse3-x86.asm b/SMP/lib/accelerated/x86/coff/sha256-ssse3-x86.asm
+new file mode 100644
+index 0000000..0db7ba8
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/sha256-ssse3-x86.asm
+@@ -0,0 +1,3356 @@
++%ifidn __OUTPUT_FORMAT__,obj
++section	code	use32 class=code align=64
++%elifidn __OUTPUT_FORMAT__,win32
++%ifndef __YASM_VER__
++$@feat.00 equ 1
++%endif
++section	.text	code align=64
++%else
++section	.text	code
++%endif
++;extern	__gnutls_x86_cpuid_s
++global	_sha256_block_data_order
++align	16
++_sha256_block_data_order:
++L$_sha256_block_data_order_begin:
++	push	ebp
++	push	ebx
++	push	esi
++	push	edi
++	mov	esi,DWORD [20+esp]
++	mov	edi,DWORD [24+esp]
++	mov	eax,DWORD [28+esp]
++	mov	ebx,esp
++	call	L$000pic_point
++L$000pic_point:
++	pop	ebp
++	lea	ebp,[(L$001K256-L$000pic_point)+ebp]
++	sub	esp,16
++	and	esp,-64
++	shl	eax,6
++	add	eax,edi
++	mov	DWORD [esp],esi
++	mov	DWORD [4+esp],edi
++	mov	DWORD [8+esp],eax
++	mov	DWORD [12+esp],ebx
++	jmp	NEAR L$002loop
++align	16
++L$002loop:
++	mov	eax,DWORD [edi]
++	mov	ebx,DWORD [4+edi]
++	mov	ecx,DWORD [8+edi]
++	bswap	eax
++	mov	edx,DWORD [12+edi]
++	bswap	ebx
++	push	eax
++	bswap	ecx
++	push	ebx
++	bswap	edx
++	push	ecx
++	push	edx
++	mov	eax,DWORD [16+edi]
++	mov	ebx,DWORD [20+edi]
++	mov	ecx,DWORD [24+edi]
++	bswap	eax
++	mov	edx,DWORD [28+edi]
++	bswap	ebx
++	push	eax
++	bswap	ecx
++	push	ebx
++	bswap	edx
++	push	ecx
++	push	edx
++	mov	eax,DWORD [32+edi]
++	mov	ebx,DWORD [36+edi]
++	mov	ecx,DWORD [40+edi]
++	bswap	eax
++	mov	edx,DWORD [44+edi]
++	bswap	ebx
++	push	eax
++	bswap	ecx
++	push	ebx
++	bswap	edx
++	push	ecx
++	push	edx
++	mov	eax,DWORD [48+edi]
++	mov	ebx,DWORD [52+edi]
++	mov	ecx,DWORD [56+edi]
++	bswap	eax
++	mov	edx,DWORD [60+edi]
++	bswap	ebx
++	push	eax
++	bswap	ecx
++	push	ebx
++	bswap	edx
++	push	ecx
++	push	edx
++	add	edi,64
++	lea	esp,[esp-36]
++	mov	DWORD [104+esp],edi
++	mov	eax,DWORD [esi]
++	mov	ebx,DWORD [4+esi]
++	mov	ecx,DWORD [8+esi]
++	mov	edi,DWORD [12+esi]
++	mov	DWORD [8+esp],ebx
++	xor	ebx,ecx
++	mov	DWORD [12+esp],ecx
++	mov	DWORD [16+esp],edi
++	mov	DWORD [esp],ebx
++	mov	edx,DWORD [16+esi]
++	mov	ebx,DWORD [20+esi]
++	mov	ecx,DWORD [24+esi]
++	mov	edi,DWORD [28+esi]
++	mov	DWORD [24+esp],ebx
++	mov	DWORD [28+esp],ecx
++	mov	DWORD [32+esp],edi
++align	16
++L$00300_15:
++	mov	ecx,edx
++	mov	esi,DWORD [24+esp]
++	ror	ecx,14
++	mov	edi,DWORD [28+esp]
++	xor	ecx,edx
++	xor	esi,edi
++	mov	ebx,DWORD [96+esp]
++	ror	ecx,5
++	and	esi,edx
++	mov	DWORD [20+esp],edx
++	xor	edx,ecx
++	add	ebx,DWORD [32+esp]
++	xor	esi,edi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,esi
++	ror	ecx,9
++	add	ebx,edx
++	mov	edi,DWORD [8+esp]
++	xor	ecx,eax
++	mov	DWORD [4+esp],eax
++	lea	esp,[esp-4]
++	ror	ecx,11
++	mov	esi,DWORD [ebp]
++	xor	ecx,eax
++	mov	edx,DWORD [20+esp]
++	xor	eax,edi
++	ror	ecx,2
++	add	ebx,esi
++	mov	DWORD [esp],eax
++	add	edx,ebx
++	and	eax,DWORD [4+esp]
++	add	ebx,ecx
++	xor	eax,edi
++	add	ebp,4
++	add	eax,ebx
++	cmp	esi,3248222580
++	jne	NEAR L$00300_15
++	mov	ecx,DWORD [156+esp]
++	jmp	NEAR L$00416_63
++align	16
++L$00416_63:
++	mov	ebx,ecx
++	mov	esi,DWORD [104+esp]
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [160+esp]
++	shr	edi,10
++	add	ebx,DWORD [124+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [24+esp]
++	ror	ecx,14
++	add	ebx,edi
++	mov	edi,DWORD [28+esp]
++	xor	ecx,edx
++	xor	esi,edi
++	mov	DWORD [96+esp],ebx
++	ror	ecx,5
++	and	esi,edx
++	mov	DWORD [20+esp],edx
++	xor	edx,ecx
++	add	ebx,DWORD [32+esp]
++	xor	esi,edi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,esi
++	ror	ecx,9
++	add	ebx,edx
++	mov	edi,DWORD [8+esp]
++	xor	ecx,eax
++	mov	DWORD [4+esp],eax
++	lea	esp,[esp-4]
++	ror	ecx,11
++	mov	esi,DWORD [ebp]
++	xor	ecx,eax
++	mov	edx,DWORD [20+esp]
++	xor	eax,edi
++	ror	ecx,2
++	add	ebx,esi
++	mov	DWORD [esp],eax
++	add	edx,ebx
++	and	eax,DWORD [4+esp]
++	add	ebx,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [156+esp]
++	add	ebp,4
++	add	eax,ebx
++	cmp	esi,3329325298
++	jne	NEAR L$00416_63
++	mov	esi,DWORD [356+esp]
++	mov	ebx,DWORD [8+esp]
++	mov	ecx,DWORD [16+esp]
++	add	eax,DWORD [esi]
++	add	ebx,DWORD [4+esi]
++	add	edi,DWORD [8+esi]
++	add	ecx,DWORD [12+esi]
++	mov	DWORD [esi],eax
++	mov	DWORD [4+esi],ebx
++	mov	DWORD [8+esi],edi
++	mov	DWORD [12+esi],ecx
++	mov	eax,DWORD [24+esp]
++	mov	ebx,DWORD [28+esp]
++	mov	ecx,DWORD [32+esp]
++	mov	edi,DWORD [360+esp]
++	add	edx,DWORD [16+esi]
++	add	eax,DWORD [20+esi]
++	add	ebx,DWORD [24+esi]
++	add	ecx,DWORD [28+esi]
++	mov	DWORD [16+esi],edx
++	mov	DWORD [20+esi],eax
++	mov	DWORD [24+esi],ebx
++	mov	DWORD [28+esi],ecx
++	lea	esp,[356+esp]
++	sub	ebp,256
++	cmp	edi,DWORD [8+esp]
++	jb	NEAR L$002loop
++	mov	esp,DWORD [12+esp]
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++align	32
++L$005loop_shrd:
++	mov	eax,DWORD [edi]
++	mov	ebx,DWORD [4+edi]
++	mov	ecx,DWORD [8+edi]
++	bswap	eax
++	mov	edx,DWORD [12+edi]
++	bswap	ebx
++	push	eax
++	bswap	ecx
++	push	ebx
++	bswap	edx
++	push	ecx
++	push	edx
++	mov	eax,DWORD [16+edi]
++	mov	ebx,DWORD [20+edi]
++	mov	ecx,DWORD [24+edi]
++	bswap	eax
++	mov	edx,DWORD [28+edi]
++	bswap	ebx
++	push	eax
++	bswap	ecx
++	push	ebx
++	bswap	edx
++	push	ecx
++	push	edx
++	mov	eax,DWORD [32+edi]
++	mov	ebx,DWORD [36+edi]
++	mov	ecx,DWORD [40+edi]
++	bswap	eax
++	mov	edx,DWORD [44+edi]
++	bswap	ebx
++	push	eax
++	bswap	ecx
++	push	ebx
++	bswap	edx
++	push	ecx
++	push	edx
++	mov	eax,DWORD [48+edi]
++	mov	ebx,DWORD [52+edi]
++	mov	ecx,DWORD [56+edi]
++	bswap	eax
++	mov	edx,DWORD [60+edi]
++	bswap	ebx
++	push	eax
++	bswap	ecx
++	push	ebx
++	bswap	edx
++	push	ecx
++	push	edx
++	add	edi,64
++	lea	esp,[esp-36]
++	mov	DWORD [104+esp],edi
++	mov	eax,DWORD [esi]
++	mov	ebx,DWORD [4+esi]
++	mov	ecx,DWORD [8+esi]
++	mov	edi,DWORD [12+esi]
++	mov	DWORD [8+esp],ebx
++	xor	ebx,ecx
++	mov	DWORD [12+esp],ecx
++	mov	DWORD [16+esp],edi
++	mov	DWORD [esp],ebx
++	mov	edx,DWORD [16+esi]
++	mov	ebx,DWORD [20+esi]
++	mov	ecx,DWORD [24+esi]
++	mov	edi,DWORD [28+esi]
++	mov	DWORD [24+esp],ebx
++	mov	DWORD [28+esp],ecx
++	mov	DWORD [32+esp],edi
++align	16
++L$00600_15_shrd:
++	mov	ecx,edx
++	mov	esi,DWORD [24+esp]
++	shrd	ecx,ecx,14
++	mov	edi,DWORD [28+esp]
++	xor	ecx,edx
++	xor	esi,edi
++	mov	ebx,DWORD [96+esp]
++	shrd	ecx,ecx,5
++	and	esi,edx
++	mov	DWORD [20+esp],edx
++	xor	edx,ecx
++	add	ebx,DWORD [32+esp]
++	xor	esi,edi
++	shrd	edx,edx,6
++	mov	ecx,eax
++	add	ebx,esi
++	shrd	ecx,ecx,9
++	add	ebx,edx
++	mov	edi,DWORD [8+esp]
++	xor	ecx,eax
++	mov	DWORD [4+esp],eax
++	lea	esp,[esp-4]
++	shrd	ecx,ecx,11
++	mov	esi,DWORD [ebp]
++	xor	ecx,eax
++	mov	edx,DWORD [20+esp]
++	xor	eax,edi
++	shrd	ecx,ecx,2
++	add	ebx,esi
++	mov	DWORD [esp],eax
++	add	edx,ebx
++	and	eax,DWORD [4+esp]
++	add	ebx,ecx
++	xor	eax,edi
++	add	ebp,4
++	add	eax,ebx
++	cmp	esi,3248222580
++	jne	NEAR L$00600_15_shrd
++	mov	ecx,DWORD [156+esp]
++	jmp	NEAR L$00716_63_shrd
++align	16
++L$00716_63_shrd:
++	mov	ebx,ecx
++	mov	esi,DWORD [104+esp]
++	shrd	ecx,ecx,11
++	mov	edi,esi
++	shrd	esi,esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	shrd	ecx,ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	shrd	esi,esi,17
++	add	ebx,DWORD [160+esp]
++	shr	edi,10
++	add	ebx,DWORD [124+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [24+esp]
++	shrd	ecx,ecx,14
++	add	ebx,edi
++	mov	edi,DWORD [28+esp]
++	xor	ecx,edx
++	xor	esi,edi
++	mov	DWORD [96+esp],ebx
++	shrd	ecx,ecx,5
++	and	esi,edx
++	mov	DWORD [20+esp],edx
++	xor	edx,ecx
++	add	ebx,DWORD [32+esp]
++	xor	esi,edi
++	shrd	edx,edx,6
++	mov	ecx,eax
++	add	ebx,esi
++	shrd	ecx,ecx,9
++	add	ebx,edx
++	mov	edi,DWORD [8+esp]
++	xor	ecx,eax
++	mov	DWORD [4+esp],eax
++	lea	esp,[esp-4]
++	shrd	ecx,ecx,11
++	mov	esi,DWORD [ebp]
++	xor	ecx,eax
++	mov	edx,DWORD [20+esp]
++	xor	eax,edi
++	shrd	ecx,ecx,2
++	add	ebx,esi
++	mov	DWORD [esp],eax
++	add	edx,ebx
++	and	eax,DWORD [4+esp]
++	add	ebx,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [156+esp]
++	add	ebp,4
++	add	eax,ebx
++	cmp	esi,3329325298
++	jne	NEAR L$00716_63_shrd
++	mov	esi,DWORD [356+esp]
++	mov	ebx,DWORD [8+esp]
++	mov	ecx,DWORD [16+esp]
++	add	eax,DWORD [esi]
++	add	ebx,DWORD [4+esi]
++	add	edi,DWORD [8+esi]
++	add	ecx,DWORD [12+esi]
++	mov	DWORD [esi],eax
++	mov	DWORD [4+esi],ebx
++	mov	DWORD [8+esi],edi
++	mov	DWORD [12+esi],ecx
++	mov	eax,DWORD [24+esp]
++	mov	ebx,DWORD [28+esp]
++	mov	ecx,DWORD [32+esp]
++	mov	edi,DWORD [360+esp]
++	add	edx,DWORD [16+esi]
++	add	eax,DWORD [20+esi]
++	add	ebx,DWORD [24+esi]
++	add	ecx,DWORD [28+esi]
++	mov	DWORD [16+esi],edx
++	mov	DWORD [20+esi],eax
++	mov	DWORD [24+esi],ebx
++	mov	DWORD [28+esi],ecx
++	lea	esp,[356+esp]
++	sub	ebp,256
++	cmp	edi,DWORD [8+esp]
++	jb	NEAR L$005loop_shrd
++	mov	esp,DWORD [12+esp]
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++align	64
++L$001K256:
++dd	1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298
++dd	66051,67438087,134810123,202182159
++db	83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97
++db	110,115,102,111,114,109,32,102,111,114,32,120,56,54,44,32
++db	67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97
++db	112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103
++db	62,0
++align	16
++L$008unrolled:
++	lea	esp,[esp-96]
++	mov	eax,DWORD [esi]
++	mov	ebp,DWORD [4+esi]
++	mov	ecx,DWORD [8+esi]
++	mov	ebx,DWORD [12+esi]
++	mov	DWORD [4+esp],ebp
++	xor	ebp,ecx
++	mov	DWORD [8+esp],ecx
++	mov	DWORD [12+esp],ebx
++	mov	edx,DWORD [16+esi]
++	mov	ebx,DWORD [20+esi]
++	mov	ecx,DWORD [24+esi]
++	mov	esi,DWORD [28+esi]
++	mov	DWORD [20+esp],ebx
++	mov	DWORD [24+esp],ecx
++	mov	DWORD [28+esp],esi
++	jmp	NEAR L$009grand_loop
++align	16
++L$009grand_loop:
++	mov	ebx,DWORD [edi]
++	mov	ecx,DWORD [4+edi]
++	bswap	ebx
++	mov	esi,DWORD [8+edi]
++	bswap	ecx
++	mov	DWORD [32+esp],ebx
++	bswap	esi
++	mov	DWORD [36+esp],ecx
++	mov	DWORD [40+esp],esi
++	mov	ebx,DWORD [12+edi]
++	mov	ecx,DWORD [16+edi]
++	bswap	ebx
++	mov	esi,DWORD [20+edi]
++	bswap	ecx
++	mov	DWORD [44+esp],ebx
++	bswap	esi
++	mov	DWORD [48+esp],ecx
++	mov	DWORD [52+esp],esi
++	mov	ebx,DWORD [24+edi]
++	mov	ecx,DWORD [28+edi]
++	bswap	ebx
++	mov	esi,DWORD [32+edi]
++	bswap	ecx
++	mov	DWORD [56+esp],ebx
++	bswap	esi
++	mov	DWORD [60+esp],ecx
++	mov	DWORD [64+esp],esi
++	mov	ebx,DWORD [36+edi]
++	mov	ecx,DWORD [40+edi]
++	bswap	ebx
++	mov	esi,DWORD [44+edi]
++	bswap	ecx
++	mov	DWORD [68+esp],ebx
++	bswap	esi
++	mov	DWORD [72+esp],ecx
++	mov	DWORD [76+esp],esi
++	mov	ebx,DWORD [48+edi]
++	mov	ecx,DWORD [52+edi]
++	bswap	ebx
++	mov	esi,DWORD [56+edi]
++	bswap	ecx
++	mov	DWORD [80+esp],ebx
++	bswap	esi
++	mov	DWORD [84+esp],ecx
++	mov	DWORD [88+esp],esi
++	mov	ebx,DWORD [60+edi]
++	add	edi,64
++	bswap	ebx
++	mov	DWORD [100+esp],edi
++	mov	DWORD [92+esp],ebx
++	mov	ecx,edx
++	mov	esi,DWORD [20+esp]
++	ror	edx,14
++	mov	edi,DWORD [24+esp]
++	xor	edx,ecx
++	mov	ebx,DWORD [32+esp]
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [16+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [28+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [4+esp]
++	xor	ecx,eax
++	mov	DWORD [esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[1116352408+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [12+esp]
++	add	ebp,ecx
++	mov	esi,edx
++	mov	ecx,DWORD [16+esp]
++	ror	edx,14
++	mov	edi,DWORD [20+esp]
++	xor	edx,esi
++	mov	ebx,DWORD [36+esp]
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [12+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [24+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [esp]
++	xor	esi,ebp
++	mov	DWORD [28+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[1899447441+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [8+esp]
++	add	eax,esi
++	mov	ecx,edx
++	mov	esi,DWORD [12+esp]
++	ror	edx,14
++	mov	edi,DWORD [16+esp]
++	xor	edx,ecx
++	mov	ebx,DWORD [40+esp]
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [8+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [20+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [28+esp]
++	xor	ecx,eax
++	mov	DWORD [24+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[3049323471+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [4+esp]
++	add	ebp,ecx
++	mov	esi,edx
++	mov	ecx,DWORD [8+esp]
++	ror	edx,14
++	mov	edi,DWORD [12+esp]
++	xor	edx,esi
++	mov	ebx,DWORD [44+esp]
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [4+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [16+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [24+esp]
++	xor	esi,ebp
++	mov	DWORD [20+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[3921009573+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [esp]
++	add	eax,esi
++	mov	ecx,edx
++	mov	esi,DWORD [4+esp]
++	ror	edx,14
++	mov	edi,DWORD [8+esp]
++	xor	edx,ecx
++	mov	ebx,DWORD [48+esp]
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [12+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [20+esp]
++	xor	ecx,eax
++	mov	DWORD [16+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[961987163+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [28+esp]
++	add	ebp,ecx
++	mov	esi,edx
++	mov	ecx,DWORD [esp]
++	ror	edx,14
++	mov	edi,DWORD [4+esp]
++	xor	edx,esi
++	mov	ebx,DWORD [52+esp]
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [28+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [8+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [16+esp]
++	xor	esi,ebp
++	mov	DWORD [12+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[1508970993+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [24+esp]
++	add	eax,esi
++	mov	ecx,edx
++	mov	esi,DWORD [28+esp]
++	ror	edx,14
++	mov	edi,DWORD [esp]
++	xor	edx,ecx
++	mov	ebx,DWORD [56+esp]
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [24+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [4+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [12+esp]
++	xor	ecx,eax
++	mov	DWORD [8+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[2453635748+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [20+esp]
++	add	ebp,ecx
++	mov	esi,edx
++	mov	ecx,DWORD [24+esp]
++	ror	edx,14
++	mov	edi,DWORD [28+esp]
++	xor	edx,esi
++	mov	ebx,DWORD [60+esp]
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [20+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [8+esp]
++	xor	esi,ebp
++	mov	DWORD [4+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[2870763221+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [16+esp]
++	add	eax,esi
++	mov	ecx,edx
++	mov	esi,DWORD [20+esp]
++	ror	edx,14
++	mov	edi,DWORD [24+esp]
++	xor	edx,ecx
++	mov	ebx,DWORD [64+esp]
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [16+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [28+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [4+esp]
++	xor	ecx,eax
++	mov	DWORD [esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[3624381080+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [12+esp]
++	add	ebp,ecx
++	mov	esi,edx
++	mov	ecx,DWORD [16+esp]
++	ror	edx,14
++	mov	edi,DWORD [20+esp]
++	xor	edx,esi
++	mov	ebx,DWORD [68+esp]
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [12+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [24+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [esp]
++	xor	esi,ebp
++	mov	DWORD [28+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[310598401+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [8+esp]
++	add	eax,esi
++	mov	ecx,edx
++	mov	esi,DWORD [12+esp]
++	ror	edx,14
++	mov	edi,DWORD [16+esp]
++	xor	edx,ecx
++	mov	ebx,DWORD [72+esp]
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [8+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [20+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [28+esp]
++	xor	ecx,eax
++	mov	DWORD [24+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[607225278+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [4+esp]
++	add	ebp,ecx
++	mov	esi,edx
++	mov	ecx,DWORD [8+esp]
++	ror	edx,14
++	mov	edi,DWORD [12+esp]
++	xor	edx,esi
++	mov	ebx,DWORD [76+esp]
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [4+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [16+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [24+esp]
++	xor	esi,ebp
++	mov	DWORD [20+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[1426881987+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [esp]
++	add	eax,esi
++	mov	ecx,edx
++	mov	esi,DWORD [4+esp]
++	ror	edx,14
++	mov	edi,DWORD [8+esp]
++	xor	edx,ecx
++	mov	ebx,DWORD [80+esp]
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [12+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [20+esp]
++	xor	ecx,eax
++	mov	DWORD [16+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[1925078388+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [28+esp]
++	add	ebp,ecx
++	mov	esi,edx
++	mov	ecx,DWORD [esp]
++	ror	edx,14
++	mov	edi,DWORD [4+esp]
++	xor	edx,esi
++	mov	ebx,DWORD [84+esp]
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [28+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [8+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [16+esp]
++	xor	esi,ebp
++	mov	DWORD [12+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[2162078206+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [24+esp]
++	add	eax,esi
++	mov	ecx,edx
++	mov	esi,DWORD [28+esp]
++	ror	edx,14
++	mov	edi,DWORD [esp]
++	xor	edx,ecx
++	mov	ebx,DWORD [88+esp]
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [24+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [4+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [12+esp]
++	xor	ecx,eax
++	mov	DWORD [8+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[2614888103+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [20+esp]
++	add	ebp,ecx
++	mov	esi,edx
++	mov	ecx,DWORD [24+esp]
++	ror	edx,14
++	mov	edi,DWORD [28+esp]
++	xor	edx,esi
++	mov	ebx,DWORD [92+esp]
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [20+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [8+esp]
++	xor	esi,ebp
++	mov	DWORD [4+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[3248222580+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [36+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [16+esp]
++	add	eax,esi
++	mov	esi,DWORD [88+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [32+esp]
++	shr	edi,10
++	add	ebx,DWORD [68+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [20+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [24+esp]
++	xor	edx,ecx
++	mov	DWORD [32+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [16+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [28+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [4+esp]
++	xor	ecx,eax
++	mov	DWORD [esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[3835390401+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [40+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [12+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [92+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [36+esp]
++	shr	edi,10
++	add	ebx,DWORD [72+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [16+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [20+esp]
++	xor	edx,esi
++	mov	DWORD [36+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [12+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [24+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [esp]
++	xor	esi,ebp
++	mov	DWORD [28+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[4022224774+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [44+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [8+esp]
++	add	eax,esi
++	mov	esi,DWORD [32+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [40+esp]
++	shr	edi,10
++	add	ebx,DWORD [76+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [12+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [16+esp]
++	xor	edx,ecx
++	mov	DWORD [40+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [8+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [20+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [28+esp]
++	xor	ecx,eax
++	mov	DWORD [24+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[264347078+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [48+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [4+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [36+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [44+esp]
++	shr	edi,10
++	add	ebx,DWORD [80+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [8+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [12+esp]
++	xor	edx,esi
++	mov	DWORD [44+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [4+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [16+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [24+esp]
++	xor	esi,ebp
++	mov	DWORD [20+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[604807628+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [52+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [esp]
++	add	eax,esi
++	mov	esi,DWORD [40+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [48+esp]
++	shr	edi,10
++	add	ebx,DWORD [84+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [4+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [8+esp]
++	xor	edx,ecx
++	mov	DWORD [48+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [12+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [20+esp]
++	xor	ecx,eax
++	mov	DWORD [16+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[770255983+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [56+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [28+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [44+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [52+esp]
++	shr	edi,10
++	add	ebx,DWORD [88+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [4+esp]
++	xor	edx,esi
++	mov	DWORD [52+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [28+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [8+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [16+esp]
++	xor	esi,ebp
++	mov	DWORD [12+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[1249150122+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [60+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [24+esp]
++	add	eax,esi
++	mov	esi,DWORD [48+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [56+esp]
++	shr	edi,10
++	add	ebx,DWORD [92+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [28+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [esp]
++	xor	edx,ecx
++	mov	DWORD [56+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [24+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [4+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [12+esp]
++	xor	ecx,eax
++	mov	DWORD [8+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[1555081692+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [64+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [20+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [52+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [60+esp]
++	shr	edi,10
++	add	ebx,DWORD [32+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [24+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [28+esp]
++	xor	edx,esi
++	mov	DWORD [60+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [20+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [8+esp]
++	xor	esi,ebp
++	mov	DWORD [4+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[1996064986+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [68+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [16+esp]
++	add	eax,esi
++	mov	esi,DWORD [56+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [64+esp]
++	shr	edi,10
++	add	ebx,DWORD [36+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [20+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [24+esp]
++	xor	edx,ecx
++	mov	DWORD [64+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [16+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [28+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [4+esp]
++	xor	ecx,eax
++	mov	DWORD [esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[2554220882+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [72+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [12+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [60+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [68+esp]
++	shr	edi,10
++	add	ebx,DWORD [40+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [16+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [20+esp]
++	xor	edx,esi
++	mov	DWORD [68+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [12+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [24+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [esp]
++	xor	esi,ebp
++	mov	DWORD [28+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[2821834349+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [76+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [8+esp]
++	add	eax,esi
++	mov	esi,DWORD [64+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [72+esp]
++	shr	edi,10
++	add	ebx,DWORD [44+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [12+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [16+esp]
++	xor	edx,ecx
++	mov	DWORD [72+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [8+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [20+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [28+esp]
++	xor	ecx,eax
++	mov	DWORD [24+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[2952996808+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [80+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [4+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [68+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [76+esp]
++	shr	edi,10
++	add	ebx,DWORD [48+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [8+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [12+esp]
++	xor	edx,esi
++	mov	DWORD [76+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [4+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [16+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [24+esp]
++	xor	esi,ebp
++	mov	DWORD [20+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[3210313671+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [84+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [esp]
++	add	eax,esi
++	mov	esi,DWORD [72+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [80+esp]
++	shr	edi,10
++	add	ebx,DWORD [52+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [4+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [8+esp]
++	xor	edx,ecx
++	mov	DWORD [80+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [12+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [20+esp]
++	xor	ecx,eax
++	mov	DWORD [16+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[3336571891+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [88+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [28+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [76+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [84+esp]
++	shr	edi,10
++	add	ebx,DWORD [56+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [4+esp]
++	xor	edx,esi
++	mov	DWORD [84+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [28+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [8+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [16+esp]
++	xor	esi,ebp
++	mov	DWORD [12+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[3584528711+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [92+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [24+esp]
++	add	eax,esi
++	mov	esi,DWORD [80+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [88+esp]
++	shr	edi,10
++	add	ebx,DWORD [60+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [28+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [esp]
++	xor	edx,ecx
++	mov	DWORD [88+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [24+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [4+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [12+esp]
++	xor	ecx,eax
++	mov	DWORD [8+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[113926993+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [32+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [20+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [84+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [92+esp]
++	shr	edi,10
++	add	ebx,DWORD [64+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [24+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [28+esp]
++	xor	edx,esi
++	mov	DWORD [92+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [20+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [8+esp]
++	xor	esi,ebp
++	mov	DWORD [4+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[338241895+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [36+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [16+esp]
++	add	eax,esi
++	mov	esi,DWORD [88+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [32+esp]
++	shr	edi,10
++	add	ebx,DWORD [68+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [20+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [24+esp]
++	xor	edx,ecx
++	mov	DWORD [32+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [16+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [28+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [4+esp]
++	xor	ecx,eax
++	mov	DWORD [esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[666307205+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [40+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [12+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [92+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [36+esp]
++	shr	edi,10
++	add	ebx,DWORD [72+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [16+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [20+esp]
++	xor	edx,esi
++	mov	DWORD [36+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [12+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [24+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [esp]
++	xor	esi,ebp
++	mov	DWORD [28+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[773529912+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [44+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [8+esp]
++	add	eax,esi
++	mov	esi,DWORD [32+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [40+esp]
++	shr	edi,10
++	add	ebx,DWORD [76+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [12+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [16+esp]
++	xor	edx,ecx
++	mov	DWORD [40+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [8+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [20+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [28+esp]
++	xor	ecx,eax
++	mov	DWORD [24+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[1294757372+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [48+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [4+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [36+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [44+esp]
++	shr	edi,10
++	add	ebx,DWORD [80+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [8+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [12+esp]
++	xor	edx,esi
++	mov	DWORD [44+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [4+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [16+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [24+esp]
++	xor	esi,ebp
++	mov	DWORD [20+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[1396182291+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [52+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [esp]
++	add	eax,esi
++	mov	esi,DWORD [40+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [48+esp]
++	shr	edi,10
++	add	ebx,DWORD [84+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [4+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [8+esp]
++	xor	edx,ecx
++	mov	DWORD [48+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [12+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [20+esp]
++	xor	ecx,eax
++	mov	DWORD [16+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[1695183700+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [56+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [28+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [44+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [52+esp]
++	shr	edi,10
++	add	ebx,DWORD [88+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [4+esp]
++	xor	edx,esi
++	mov	DWORD [52+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [28+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [8+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [16+esp]
++	xor	esi,ebp
++	mov	DWORD [12+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[1986661051+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [60+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [24+esp]
++	add	eax,esi
++	mov	esi,DWORD [48+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [56+esp]
++	shr	edi,10
++	add	ebx,DWORD [92+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [28+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [esp]
++	xor	edx,ecx
++	mov	DWORD [56+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [24+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [4+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [12+esp]
++	xor	ecx,eax
++	mov	DWORD [8+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[2177026350+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [64+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [20+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [52+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [60+esp]
++	shr	edi,10
++	add	ebx,DWORD [32+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [24+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [28+esp]
++	xor	edx,esi
++	mov	DWORD [60+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [20+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [8+esp]
++	xor	esi,ebp
++	mov	DWORD [4+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[2456956037+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [68+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [16+esp]
++	add	eax,esi
++	mov	esi,DWORD [56+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [64+esp]
++	shr	edi,10
++	add	ebx,DWORD [36+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [20+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [24+esp]
++	xor	edx,ecx
++	mov	DWORD [64+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [16+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [28+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [4+esp]
++	xor	ecx,eax
++	mov	DWORD [esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[2730485921+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [72+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [12+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [60+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [68+esp]
++	shr	edi,10
++	add	ebx,DWORD [40+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [16+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [20+esp]
++	xor	edx,esi
++	mov	DWORD [68+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [12+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [24+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [esp]
++	xor	esi,ebp
++	mov	DWORD [28+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[2820302411+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [76+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [8+esp]
++	add	eax,esi
++	mov	esi,DWORD [64+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [72+esp]
++	shr	edi,10
++	add	ebx,DWORD [44+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [12+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [16+esp]
++	xor	edx,ecx
++	mov	DWORD [72+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [8+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [20+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [28+esp]
++	xor	ecx,eax
++	mov	DWORD [24+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[3259730800+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [80+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [4+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [68+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [76+esp]
++	shr	edi,10
++	add	ebx,DWORD [48+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [8+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [12+esp]
++	xor	edx,esi
++	mov	DWORD [76+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [4+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [16+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [24+esp]
++	xor	esi,ebp
++	mov	DWORD [20+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[3345764771+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [84+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [esp]
++	add	eax,esi
++	mov	esi,DWORD [72+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [80+esp]
++	shr	edi,10
++	add	ebx,DWORD [52+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [4+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [8+esp]
++	xor	edx,ecx
++	mov	DWORD [80+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [12+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [20+esp]
++	xor	ecx,eax
++	mov	DWORD [16+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[3516065817+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [88+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [28+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [76+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [84+esp]
++	shr	edi,10
++	add	ebx,DWORD [56+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [4+esp]
++	xor	edx,esi
++	mov	DWORD [84+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [28+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [8+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [16+esp]
++	xor	esi,ebp
++	mov	DWORD [12+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[3600352804+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [92+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [24+esp]
++	add	eax,esi
++	mov	esi,DWORD [80+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [88+esp]
++	shr	edi,10
++	add	ebx,DWORD [60+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [28+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [esp]
++	xor	edx,ecx
++	mov	DWORD [88+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [24+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [4+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [12+esp]
++	xor	ecx,eax
++	mov	DWORD [8+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[4094571909+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [32+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [20+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [84+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [92+esp]
++	shr	edi,10
++	add	ebx,DWORD [64+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [24+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [28+esp]
++	xor	edx,esi
++	mov	DWORD [92+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [20+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [8+esp]
++	xor	esi,ebp
++	mov	DWORD [4+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[275423344+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [36+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [16+esp]
++	add	eax,esi
++	mov	esi,DWORD [88+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [32+esp]
++	shr	edi,10
++	add	ebx,DWORD [68+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [20+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [24+esp]
++	xor	edx,ecx
++	mov	DWORD [32+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [16+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [28+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [4+esp]
++	xor	ecx,eax
++	mov	DWORD [esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[430227734+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [40+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [12+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [92+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [36+esp]
++	shr	edi,10
++	add	ebx,DWORD [72+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [16+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [20+esp]
++	xor	edx,esi
++	mov	DWORD [36+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [12+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [24+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [esp]
++	xor	esi,ebp
++	mov	DWORD [28+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[506948616+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [44+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [8+esp]
++	add	eax,esi
++	mov	esi,DWORD [32+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [40+esp]
++	shr	edi,10
++	add	ebx,DWORD [76+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [12+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [16+esp]
++	xor	edx,ecx
++	mov	DWORD [40+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [8+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [20+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [28+esp]
++	xor	ecx,eax
++	mov	DWORD [24+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[659060556+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [48+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [4+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [36+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [44+esp]
++	shr	edi,10
++	add	ebx,DWORD [80+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [8+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [12+esp]
++	xor	edx,esi
++	mov	DWORD [44+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [4+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [16+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [24+esp]
++	xor	esi,ebp
++	mov	DWORD [20+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[883997877+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [52+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [esp]
++	add	eax,esi
++	mov	esi,DWORD [40+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [48+esp]
++	shr	edi,10
++	add	ebx,DWORD [84+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [4+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [8+esp]
++	xor	edx,ecx
++	mov	DWORD [48+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [12+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [20+esp]
++	xor	ecx,eax
++	mov	DWORD [16+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[958139571+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [56+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [28+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [44+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [52+esp]
++	shr	edi,10
++	add	ebx,DWORD [88+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [4+esp]
++	xor	edx,esi
++	mov	DWORD [52+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [28+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [8+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [16+esp]
++	xor	esi,ebp
++	mov	DWORD [12+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[1322822218+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [60+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [24+esp]
++	add	eax,esi
++	mov	esi,DWORD [48+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [56+esp]
++	shr	edi,10
++	add	ebx,DWORD [92+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [28+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [esp]
++	xor	edx,ecx
++	mov	DWORD [56+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [24+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [4+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [12+esp]
++	xor	ecx,eax
++	mov	DWORD [8+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[1537002063+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [64+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [20+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [52+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [60+esp]
++	shr	edi,10
++	add	ebx,DWORD [32+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [24+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [28+esp]
++	xor	edx,esi
++	mov	DWORD [60+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [20+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [8+esp]
++	xor	esi,ebp
++	mov	DWORD [4+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[1747873779+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [68+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [16+esp]
++	add	eax,esi
++	mov	esi,DWORD [56+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [64+esp]
++	shr	edi,10
++	add	ebx,DWORD [36+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [20+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [24+esp]
++	xor	edx,ecx
++	mov	DWORD [64+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [16+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [28+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [4+esp]
++	xor	ecx,eax
++	mov	DWORD [esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[1955562222+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [72+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [12+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [60+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [68+esp]
++	shr	edi,10
++	add	ebx,DWORD [40+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [16+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [20+esp]
++	xor	edx,esi
++	mov	DWORD [68+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [12+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [24+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [esp]
++	xor	esi,ebp
++	mov	DWORD [28+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[2024104815+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [76+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [8+esp]
++	add	eax,esi
++	mov	esi,DWORD [64+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [72+esp]
++	shr	edi,10
++	add	ebx,DWORD [44+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [12+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [16+esp]
++	xor	edx,ecx
++	mov	DWORD [72+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [8+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [20+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [28+esp]
++	xor	ecx,eax
++	mov	DWORD [24+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[2227730452+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [80+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [4+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [68+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [76+esp]
++	shr	edi,10
++	add	ebx,DWORD [48+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [8+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [12+esp]
++	xor	edx,esi
++	mov	DWORD [76+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [4+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [16+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [24+esp]
++	xor	esi,ebp
++	mov	DWORD [20+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[2361852424+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [84+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [esp]
++	add	eax,esi
++	mov	esi,DWORD [72+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [80+esp]
++	shr	edi,10
++	add	ebx,DWORD [52+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [4+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [8+esp]
++	xor	edx,ecx
++	mov	DWORD [80+esp],ebx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [12+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [20+esp]
++	xor	ecx,eax
++	mov	DWORD [16+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[2428436474+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [88+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [28+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [76+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [84+esp]
++	shr	edi,10
++	add	ebx,DWORD [56+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [4+esp]
++	xor	edx,esi
++	mov	DWORD [84+esp],ebx
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [28+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [8+esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [16+esp]
++	xor	esi,ebp
++	mov	DWORD [12+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[2756734187+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	mov	ecx,DWORD [92+esp]
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [24+esp]
++	add	eax,esi
++	mov	esi,DWORD [80+esp]
++	mov	ebx,ecx
++	ror	ecx,11
++	mov	edi,esi
++	ror	esi,2
++	xor	ecx,ebx
++	shr	ebx,3
++	ror	ecx,7
++	xor	esi,edi
++	xor	ebx,ecx
++	ror	esi,17
++	add	ebx,DWORD [88+esp]
++	shr	edi,10
++	add	ebx,DWORD [60+esp]
++	mov	ecx,edx
++	xor	edi,esi
++	mov	esi,DWORD [28+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [esp]
++	xor	edx,ecx
++	xor	esi,edi
++	ror	edx,5
++	and	esi,ecx
++	mov	DWORD [24+esp],ecx
++	xor	edx,ecx
++	add	ebx,DWORD [4+esp]
++	xor	edi,esi
++	ror	edx,6
++	mov	ecx,eax
++	add	ebx,edi
++	ror	ecx,9
++	mov	esi,eax
++	mov	edi,DWORD [12+esp]
++	xor	ecx,eax
++	mov	DWORD [8+esp],eax
++	xor	eax,edi
++	ror	ecx,11
++	and	ebp,eax
++	lea	edx,[3204031479+edx*1+ebx]
++	xor	ecx,esi
++	xor	ebp,edi
++	mov	esi,DWORD [32+esp]
++	ror	ecx,2
++	add	ebp,edx
++	add	edx,DWORD [20+esp]
++	add	ebp,ecx
++	mov	ecx,DWORD [84+esp]
++	mov	ebx,esi
++	ror	esi,11
++	mov	edi,ecx
++	ror	ecx,2
++	xor	esi,ebx
++	shr	ebx,3
++	ror	esi,7
++	xor	ecx,edi
++	xor	ebx,esi
++	ror	ecx,17
++	add	ebx,DWORD [92+esp]
++	shr	edi,10
++	add	ebx,DWORD [64+esp]
++	mov	esi,edx
++	xor	edi,ecx
++	mov	ecx,DWORD [24+esp]
++	ror	edx,14
++	add	ebx,edi
++	mov	edi,DWORD [28+esp]
++	xor	edx,esi
++	xor	ecx,edi
++	ror	edx,5
++	and	ecx,esi
++	mov	DWORD [20+esp],esi
++	xor	edx,esi
++	add	ebx,DWORD [esp]
++	xor	edi,ecx
++	ror	edx,6
++	mov	esi,ebp
++	add	ebx,edi
++	ror	esi,9
++	mov	ecx,ebp
++	mov	edi,DWORD [8+esp]
++	xor	esi,ebp
++	mov	DWORD [4+esp],ebp
++	xor	ebp,edi
++	ror	esi,11
++	and	eax,ebp
++	lea	edx,[3329325298+edx*1+ebx]
++	xor	esi,ecx
++	xor	eax,edi
++	ror	esi,2
++	add	eax,edx
++	add	edx,DWORD [16+esp]
++	add	eax,esi
++	mov	esi,DWORD [96+esp]
++	xor	ebp,edi
++	mov	ecx,DWORD [12+esp]
++	add	eax,DWORD [esi]
++	add	ebp,DWORD [4+esi]
++	add	edi,DWORD [8+esi]
++	add	ecx,DWORD [12+esi]
++	mov	DWORD [esi],eax
++	mov	DWORD [4+esi],ebp
++	mov	DWORD [8+esi],edi
++	mov	DWORD [12+esi],ecx
++	mov	DWORD [4+esp],ebp
++	xor	ebp,edi
++	mov	DWORD [8+esp],edi
++	mov	DWORD [12+esp],ecx
++	mov	edi,DWORD [20+esp]
++	mov	ebx,DWORD [24+esp]
++	mov	ecx,DWORD [28+esp]
++	add	edx,DWORD [16+esi]
++	add	edi,DWORD [20+esi]
++	add	ebx,DWORD [24+esi]
++	add	ecx,DWORD [28+esi]
++	mov	DWORD [16+esi],edx
++	mov	DWORD [20+esi],edi
++	mov	DWORD [24+esi],ebx
++	mov	DWORD [28+esi],ecx
++	mov	DWORD [20+esp],edi
++	mov	edi,DWORD [100+esp]
++	mov	DWORD [24+esp],ebx
++	mov	DWORD [28+esp],ecx
++	cmp	edi,DWORD [104+esp]
++	jb	NEAR L$009grand_loop
++	mov	esp,DWORD [108+esp]
++	pop	edi
++	pop	esi
++	pop	ebx
++	pop	ebp
++	ret
++segment	.bss
++common	__gnutls_x86_cpuid_s 16
+diff --git a/SMP/lib/accelerated/x86/coff/sha256-ssse3-x86_64.asm b/SMP/lib/accelerated/x86/coff/sha256-ssse3-x86_64.asm
+new file mode 100644
+index 0000000..ce1656d
+--- /dev/null
++++ b/SMP/lib/accelerated/x86/coff/sha256-ssse3-x86_64.asm
+@@ -0,0 +1,5634 @@
++default	rel
++%define XMMWORD
++%define YMMWORD
++%define ZMMWORD
++section	.text code align=64
++
++
++EXTERN	_gnutls_x86_cpuid_s
++global	sha256_block_data_order
++
++ALIGN	16
++sha256_block_data_order:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha256_block_data_order:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++	lea	r11,[_gnutls_x86_cpuid_s]
++	mov	r9d,DWORD[r11]
++	mov	r10d,DWORD[4+r11]
++	mov	r11d,DWORD[8+r11]
++	test	r11d,536870912
++	jnz	NEAR _shaext_shortcut
++	and	r11d,296
++	cmp	r11d,296
++	je	NEAR $L$avx2_shortcut
++	and	r9d,1073741824
++	and	r10d,268435968
++	or	r10d,r9d
++	cmp	r10d,1342177792
++	je	NEAR $L$avx_shortcut
++	test	r10d,512
++	jnz	NEAR $L$ssse3_shortcut
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	mov	r11,rsp
++	shl	rdx,4
++	sub	rsp,16*4+4*8
++	lea	rdx,[rdx*4+rsi]
++	and	rsp,-64
++	mov	QWORD[((64+0))+rsp],rdi
++	mov	QWORD[((64+8))+rsp],rsi
++	mov	QWORD[((64+16))+rsp],rdx
++	mov	QWORD[((64+24))+rsp],r11
++$L$prologue:
++
++	mov	eax,DWORD[rdi]
++	mov	ebx,DWORD[4+rdi]
++	mov	ecx,DWORD[8+rdi]
++	mov	edx,DWORD[12+rdi]
++	mov	r8d,DWORD[16+rdi]
++	mov	r9d,DWORD[20+rdi]
++	mov	r10d,DWORD[24+rdi]
++	mov	r11d,DWORD[28+rdi]
++	jmp	NEAR $L$loop
++
++ALIGN	16
++$L$loop:
++	mov	edi,ebx
++	lea	rbp,[K256]
++	xor	edi,ecx
++	mov	r12d,DWORD[rsi]
++	mov	r13d,r8d
++	mov	r14d,eax
++	bswap	r12d
++	ror	r13d,14
++	mov	r15d,r9d
++
++	xor	r13d,r8d
++	ror	r14d,9
++	xor	r15d,r10d
++
++	mov	DWORD[rsp],r12d
++	xor	r14d,eax
++	and	r15d,r8d
++
++	ror	r13d,5
++	add	r12d,r11d
++	xor	r15d,r10d
++
++	ror	r14d,11
++	xor	r13d,r8d
++	add	r12d,r15d
++
++	mov	r15d,eax
++	add	r12d,DWORD[rbp]
++	xor	r14d,eax
++
++	xor	r15d,ebx
++	ror	r13d,6
++	mov	r11d,ebx
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r11d,edi
++	add	edx,r12d
++	add	r11d,r12d
++
++	lea	rbp,[4+rbp]
++	add	r11d,r14d
++	mov	r12d,DWORD[4+rsi]
++	mov	r13d,edx
++	mov	r14d,r11d
++	bswap	r12d
++	ror	r13d,14
++	mov	edi,r8d
++
++	xor	r13d,edx
++	ror	r14d,9
++	xor	edi,r9d
++
++	mov	DWORD[4+rsp],r12d
++	xor	r14d,r11d
++	and	edi,edx
++
++	ror	r13d,5
++	add	r12d,r10d
++	xor	edi,r9d
++
++	ror	r14d,11
++	xor	r13d,edx
++	add	r12d,edi
++
++	mov	edi,r11d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r11d
++
++	xor	edi,eax
++	ror	r13d,6
++	mov	r10d,eax
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r10d,r15d
++	add	ecx,r12d
++	add	r10d,r12d
++
++	lea	rbp,[4+rbp]
++	add	r10d,r14d
++	mov	r12d,DWORD[8+rsi]
++	mov	r13d,ecx
++	mov	r14d,r10d
++	bswap	r12d
++	ror	r13d,14
++	mov	r15d,edx
++
++	xor	r13d,ecx
++	ror	r14d,9
++	xor	r15d,r8d
++
++	mov	DWORD[8+rsp],r12d
++	xor	r14d,r10d
++	and	r15d,ecx
++
++	ror	r13d,5
++	add	r12d,r9d
++	xor	r15d,r8d
++
++	ror	r14d,11
++	xor	r13d,ecx
++	add	r12d,r15d
++
++	mov	r15d,r10d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r10d
++
++	xor	r15d,r11d
++	ror	r13d,6
++	mov	r9d,r11d
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r9d,edi
++	add	ebx,r12d
++	add	r9d,r12d
++
++	lea	rbp,[4+rbp]
++	add	r9d,r14d
++	mov	r12d,DWORD[12+rsi]
++	mov	r13d,ebx
++	mov	r14d,r9d
++	bswap	r12d
++	ror	r13d,14
++	mov	edi,ecx
++
++	xor	r13d,ebx
++	ror	r14d,9
++	xor	edi,edx
++
++	mov	DWORD[12+rsp],r12d
++	xor	r14d,r9d
++	and	edi,ebx
++
++	ror	r13d,5
++	add	r12d,r8d
++	xor	edi,edx
++
++	ror	r14d,11
++	xor	r13d,ebx
++	add	r12d,edi
++
++	mov	edi,r9d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r9d
++
++	xor	edi,r10d
++	ror	r13d,6
++	mov	r8d,r10d
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r8d,r15d
++	add	eax,r12d
++	add	r8d,r12d
++
++	lea	rbp,[20+rbp]
++	add	r8d,r14d
++	mov	r12d,DWORD[16+rsi]
++	mov	r13d,eax
++	mov	r14d,r8d
++	bswap	r12d
++	ror	r13d,14
++	mov	r15d,ebx
++
++	xor	r13d,eax
++	ror	r14d,9
++	xor	r15d,ecx
++
++	mov	DWORD[16+rsp],r12d
++	xor	r14d,r8d
++	and	r15d,eax
++
++	ror	r13d,5
++	add	r12d,edx
++	xor	r15d,ecx
++
++	ror	r14d,11
++	xor	r13d,eax
++	add	r12d,r15d
++
++	mov	r15d,r8d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r8d
++
++	xor	r15d,r9d
++	ror	r13d,6
++	mov	edx,r9d
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	edx,edi
++	add	r11d,r12d
++	add	edx,r12d
++
++	lea	rbp,[4+rbp]
++	add	edx,r14d
++	mov	r12d,DWORD[20+rsi]
++	mov	r13d,r11d
++	mov	r14d,edx
++	bswap	r12d
++	ror	r13d,14
++	mov	edi,eax
++
++	xor	r13d,r11d
++	ror	r14d,9
++	xor	edi,ebx
++
++	mov	DWORD[20+rsp],r12d
++	xor	r14d,edx
++	and	edi,r11d
++
++	ror	r13d,5
++	add	r12d,ecx
++	xor	edi,ebx
++
++	ror	r14d,11
++	xor	r13d,r11d
++	add	r12d,edi
++
++	mov	edi,edx
++	add	r12d,DWORD[rbp]
++	xor	r14d,edx
++
++	xor	edi,r8d
++	ror	r13d,6
++	mov	ecx,r8d
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	ecx,r15d
++	add	r10d,r12d
++	add	ecx,r12d
++
++	lea	rbp,[4+rbp]
++	add	ecx,r14d
++	mov	r12d,DWORD[24+rsi]
++	mov	r13d,r10d
++	mov	r14d,ecx
++	bswap	r12d
++	ror	r13d,14
++	mov	r15d,r11d
++
++	xor	r13d,r10d
++	ror	r14d,9
++	xor	r15d,eax
++
++	mov	DWORD[24+rsp],r12d
++	xor	r14d,ecx
++	and	r15d,r10d
++
++	ror	r13d,5
++	add	r12d,ebx
++	xor	r15d,eax
++
++	ror	r14d,11
++	xor	r13d,r10d
++	add	r12d,r15d
++
++	mov	r15d,ecx
++	add	r12d,DWORD[rbp]
++	xor	r14d,ecx
++
++	xor	r15d,edx
++	ror	r13d,6
++	mov	ebx,edx
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	ebx,edi
++	add	r9d,r12d
++	add	ebx,r12d
++
++	lea	rbp,[4+rbp]
++	add	ebx,r14d
++	mov	r12d,DWORD[28+rsi]
++	mov	r13d,r9d
++	mov	r14d,ebx
++	bswap	r12d
++	ror	r13d,14
++	mov	edi,r10d
++
++	xor	r13d,r9d
++	ror	r14d,9
++	xor	edi,r11d
++
++	mov	DWORD[28+rsp],r12d
++	xor	r14d,ebx
++	and	edi,r9d
++
++	ror	r13d,5
++	add	r12d,eax
++	xor	edi,r11d
++
++	ror	r14d,11
++	xor	r13d,r9d
++	add	r12d,edi
++
++	mov	edi,ebx
++	add	r12d,DWORD[rbp]
++	xor	r14d,ebx
++
++	xor	edi,ecx
++	ror	r13d,6
++	mov	eax,ecx
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	eax,r15d
++	add	r8d,r12d
++	add	eax,r12d
++
++	lea	rbp,[20+rbp]
++	add	eax,r14d
++	mov	r12d,DWORD[32+rsi]
++	mov	r13d,r8d
++	mov	r14d,eax
++	bswap	r12d
++	ror	r13d,14
++	mov	r15d,r9d
++
++	xor	r13d,r8d
++	ror	r14d,9
++	xor	r15d,r10d
++
++	mov	DWORD[32+rsp],r12d
++	xor	r14d,eax
++	and	r15d,r8d
++
++	ror	r13d,5
++	add	r12d,r11d
++	xor	r15d,r10d
++
++	ror	r14d,11
++	xor	r13d,r8d
++	add	r12d,r15d
++
++	mov	r15d,eax
++	add	r12d,DWORD[rbp]
++	xor	r14d,eax
++
++	xor	r15d,ebx
++	ror	r13d,6
++	mov	r11d,ebx
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r11d,edi
++	add	edx,r12d
++	add	r11d,r12d
++
++	lea	rbp,[4+rbp]
++	add	r11d,r14d
++	mov	r12d,DWORD[36+rsi]
++	mov	r13d,edx
++	mov	r14d,r11d
++	bswap	r12d
++	ror	r13d,14
++	mov	edi,r8d
++
++	xor	r13d,edx
++	ror	r14d,9
++	xor	edi,r9d
++
++	mov	DWORD[36+rsp],r12d
++	xor	r14d,r11d
++	and	edi,edx
++
++	ror	r13d,5
++	add	r12d,r10d
++	xor	edi,r9d
++
++	ror	r14d,11
++	xor	r13d,edx
++	add	r12d,edi
++
++	mov	edi,r11d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r11d
++
++	xor	edi,eax
++	ror	r13d,6
++	mov	r10d,eax
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r10d,r15d
++	add	ecx,r12d
++	add	r10d,r12d
++
++	lea	rbp,[4+rbp]
++	add	r10d,r14d
++	mov	r12d,DWORD[40+rsi]
++	mov	r13d,ecx
++	mov	r14d,r10d
++	bswap	r12d
++	ror	r13d,14
++	mov	r15d,edx
++
++	xor	r13d,ecx
++	ror	r14d,9
++	xor	r15d,r8d
++
++	mov	DWORD[40+rsp],r12d
++	xor	r14d,r10d
++	and	r15d,ecx
++
++	ror	r13d,5
++	add	r12d,r9d
++	xor	r15d,r8d
++
++	ror	r14d,11
++	xor	r13d,ecx
++	add	r12d,r15d
++
++	mov	r15d,r10d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r10d
++
++	xor	r15d,r11d
++	ror	r13d,6
++	mov	r9d,r11d
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r9d,edi
++	add	ebx,r12d
++	add	r9d,r12d
++
++	lea	rbp,[4+rbp]
++	add	r9d,r14d
++	mov	r12d,DWORD[44+rsi]
++	mov	r13d,ebx
++	mov	r14d,r9d
++	bswap	r12d
++	ror	r13d,14
++	mov	edi,ecx
++
++	xor	r13d,ebx
++	ror	r14d,9
++	xor	edi,edx
++
++	mov	DWORD[44+rsp],r12d
++	xor	r14d,r9d
++	and	edi,ebx
++
++	ror	r13d,5
++	add	r12d,r8d
++	xor	edi,edx
++
++	ror	r14d,11
++	xor	r13d,ebx
++	add	r12d,edi
++
++	mov	edi,r9d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r9d
++
++	xor	edi,r10d
++	ror	r13d,6
++	mov	r8d,r10d
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r8d,r15d
++	add	eax,r12d
++	add	r8d,r12d
++
++	lea	rbp,[20+rbp]
++	add	r8d,r14d
++	mov	r12d,DWORD[48+rsi]
++	mov	r13d,eax
++	mov	r14d,r8d
++	bswap	r12d
++	ror	r13d,14
++	mov	r15d,ebx
++
++	xor	r13d,eax
++	ror	r14d,9
++	xor	r15d,ecx
++
++	mov	DWORD[48+rsp],r12d
++	xor	r14d,r8d
++	and	r15d,eax
++
++	ror	r13d,5
++	add	r12d,edx
++	xor	r15d,ecx
++
++	ror	r14d,11
++	xor	r13d,eax
++	add	r12d,r15d
++
++	mov	r15d,r8d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r8d
++
++	xor	r15d,r9d
++	ror	r13d,6
++	mov	edx,r9d
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	edx,edi
++	add	r11d,r12d
++	add	edx,r12d
++
++	lea	rbp,[4+rbp]
++	add	edx,r14d
++	mov	r12d,DWORD[52+rsi]
++	mov	r13d,r11d
++	mov	r14d,edx
++	bswap	r12d
++	ror	r13d,14
++	mov	edi,eax
++
++	xor	r13d,r11d
++	ror	r14d,9
++	xor	edi,ebx
++
++	mov	DWORD[52+rsp],r12d
++	xor	r14d,edx
++	and	edi,r11d
++
++	ror	r13d,5
++	add	r12d,ecx
++	xor	edi,ebx
++
++	ror	r14d,11
++	xor	r13d,r11d
++	add	r12d,edi
++
++	mov	edi,edx
++	add	r12d,DWORD[rbp]
++	xor	r14d,edx
++
++	xor	edi,r8d
++	ror	r13d,6
++	mov	ecx,r8d
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	ecx,r15d
++	add	r10d,r12d
++	add	ecx,r12d
++
++	lea	rbp,[4+rbp]
++	add	ecx,r14d
++	mov	r12d,DWORD[56+rsi]
++	mov	r13d,r10d
++	mov	r14d,ecx
++	bswap	r12d
++	ror	r13d,14
++	mov	r15d,r11d
++
++	xor	r13d,r10d
++	ror	r14d,9
++	xor	r15d,eax
++
++	mov	DWORD[56+rsp],r12d
++	xor	r14d,ecx
++	and	r15d,r10d
++
++	ror	r13d,5
++	add	r12d,ebx
++	xor	r15d,eax
++
++	ror	r14d,11
++	xor	r13d,r10d
++	add	r12d,r15d
++
++	mov	r15d,ecx
++	add	r12d,DWORD[rbp]
++	xor	r14d,ecx
++
++	xor	r15d,edx
++	ror	r13d,6
++	mov	ebx,edx
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	ebx,edi
++	add	r9d,r12d
++	add	ebx,r12d
++
++	lea	rbp,[4+rbp]
++	add	ebx,r14d
++	mov	r12d,DWORD[60+rsi]
++	mov	r13d,r9d
++	mov	r14d,ebx
++	bswap	r12d
++	ror	r13d,14
++	mov	edi,r10d
++
++	xor	r13d,r9d
++	ror	r14d,9
++	xor	edi,r11d
++
++	mov	DWORD[60+rsp],r12d
++	xor	r14d,ebx
++	and	edi,r9d
++
++	ror	r13d,5
++	add	r12d,eax
++	xor	edi,r11d
++
++	ror	r14d,11
++	xor	r13d,r9d
++	add	r12d,edi
++
++	mov	edi,ebx
++	add	r12d,DWORD[rbp]
++	xor	r14d,ebx
++
++	xor	edi,ecx
++	ror	r13d,6
++	mov	eax,ecx
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	eax,r15d
++	add	r8d,r12d
++	add	eax,r12d
++
++	lea	rbp,[20+rbp]
++	jmp	NEAR $L$rounds_16_xx
++ALIGN	16
++$L$rounds_16_xx:
++	mov	r13d,DWORD[4+rsp]
++	mov	r15d,DWORD[56+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	eax,r14d
++	mov	r14d,r15d
++	ror	r15d,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	r15d,r14d
++	shr	r14d,10
++
++	ror	r15d,17
++	xor	r12d,r13d
++	xor	r15d,r14d
++	add	r12d,DWORD[36+rsp]
++
++	add	r12d,DWORD[rsp]
++	mov	r13d,r8d
++	add	r12d,r15d
++	mov	r14d,eax
++	ror	r13d,14
++	mov	r15d,r9d
++
++	xor	r13d,r8d
++	ror	r14d,9
++	xor	r15d,r10d
++
++	mov	DWORD[rsp],r12d
++	xor	r14d,eax
++	and	r15d,r8d
++
++	ror	r13d,5
++	add	r12d,r11d
++	xor	r15d,r10d
++
++	ror	r14d,11
++	xor	r13d,r8d
++	add	r12d,r15d
++
++	mov	r15d,eax
++	add	r12d,DWORD[rbp]
++	xor	r14d,eax
++
++	xor	r15d,ebx
++	ror	r13d,6
++	mov	r11d,ebx
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r11d,edi
++	add	edx,r12d
++	add	r11d,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[8+rsp]
++	mov	edi,DWORD[60+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	r11d,r14d
++	mov	r14d,edi
++	ror	edi,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	edi,r14d
++	shr	r14d,10
++
++	ror	edi,17
++	xor	r12d,r13d
++	xor	edi,r14d
++	add	r12d,DWORD[40+rsp]
++
++	add	r12d,DWORD[4+rsp]
++	mov	r13d,edx
++	add	r12d,edi
++	mov	r14d,r11d
++	ror	r13d,14
++	mov	edi,r8d
++
++	xor	r13d,edx
++	ror	r14d,9
++	xor	edi,r9d
++
++	mov	DWORD[4+rsp],r12d
++	xor	r14d,r11d
++	and	edi,edx
++
++	ror	r13d,5
++	add	r12d,r10d
++	xor	edi,r9d
++
++	ror	r14d,11
++	xor	r13d,edx
++	add	r12d,edi
++
++	mov	edi,r11d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r11d
++
++	xor	edi,eax
++	ror	r13d,6
++	mov	r10d,eax
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r10d,r15d
++	add	ecx,r12d
++	add	r10d,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[12+rsp]
++	mov	r15d,DWORD[rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	r10d,r14d
++	mov	r14d,r15d
++	ror	r15d,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	r15d,r14d
++	shr	r14d,10
++
++	ror	r15d,17
++	xor	r12d,r13d
++	xor	r15d,r14d
++	add	r12d,DWORD[44+rsp]
++
++	add	r12d,DWORD[8+rsp]
++	mov	r13d,ecx
++	add	r12d,r15d
++	mov	r14d,r10d
++	ror	r13d,14
++	mov	r15d,edx
++
++	xor	r13d,ecx
++	ror	r14d,9
++	xor	r15d,r8d
++
++	mov	DWORD[8+rsp],r12d
++	xor	r14d,r10d
++	and	r15d,ecx
++
++	ror	r13d,5
++	add	r12d,r9d
++	xor	r15d,r8d
++
++	ror	r14d,11
++	xor	r13d,ecx
++	add	r12d,r15d
++
++	mov	r15d,r10d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r10d
++
++	xor	r15d,r11d
++	ror	r13d,6
++	mov	r9d,r11d
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r9d,edi
++	add	ebx,r12d
++	add	r9d,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[16+rsp]
++	mov	edi,DWORD[4+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	r9d,r14d
++	mov	r14d,edi
++	ror	edi,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	edi,r14d
++	shr	r14d,10
++
++	ror	edi,17
++	xor	r12d,r13d
++	xor	edi,r14d
++	add	r12d,DWORD[48+rsp]
++
++	add	r12d,DWORD[12+rsp]
++	mov	r13d,ebx
++	add	r12d,edi
++	mov	r14d,r9d
++	ror	r13d,14
++	mov	edi,ecx
++
++	xor	r13d,ebx
++	ror	r14d,9
++	xor	edi,edx
++
++	mov	DWORD[12+rsp],r12d
++	xor	r14d,r9d
++	and	edi,ebx
++
++	ror	r13d,5
++	add	r12d,r8d
++	xor	edi,edx
++
++	ror	r14d,11
++	xor	r13d,ebx
++	add	r12d,edi
++
++	mov	edi,r9d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r9d
++
++	xor	edi,r10d
++	ror	r13d,6
++	mov	r8d,r10d
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r8d,r15d
++	add	eax,r12d
++	add	r8d,r12d
++
++	lea	rbp,[20+rbp]
++	mov	r13d,DWORD[20+rsp]
++	mov	r15d,DWORD[8+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	r8d,r14d
++	mov	r14d,r15d
++	ror	r15d,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	r15d,r14d
++	shr	r14d,10
++
++	ror	r15d,17
++	xor	r12d,r13d
++	xor	r15d,r14d
++	add	r12d,DWORD[52+rsp]
++
++	add	r12d,DWORD[16+rsp]
++	mov	r13d,eax
++	add	r12d,r15d
++	mov	r14d,r8d
++	ror	r13d,14
++	mov	r15d,ebx
++
++	xor	r13d,eax
++	ror	r14d,9
++	xor	r15d,ecx
++
++	mov	DWORD[16+rsp],r12d
++	xor	r14d,r8d
++	and	r15d,eax
++
++	ror	r13d,5
++	add	r12d,edx
++	xor	r15d,ecx
++
++	ror	r14d,11
++	xor	r13d,eax
++	add	r12d,r15d
++
++	mov	r15d,r8d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r8d
++
++	xor	r15d,r9d
++	ror	r13d,6
++	mov	edx,r9d
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	edx,edi
++	add	r11d,r12d
++	add	edx,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[24+rsp]
++	mov	edi,DWORD[12+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	edx,r14d
++	mov	r14d,edi
++	ror	edi,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	edi,r14d
++	shr	r14d,10
++
++	ror	edi,17
++	xor	r12d,r13d
++	xor	edi,r14d
++	add	r12d,DWORD[56+rsp]
++
++	add	r12d,DWORD[20+rsp]
++	mov	r13d,r11d
++	add	r12d,edi
++	mov	r14d,edx
++	ror	r13d,14
++	mov	edi,eax
++
++	xor	r13d,r11d
++	ror	r14d,9
++	xor	edi,ebx
++
++	mov	DWORD[20+rsp],r12d
++	xor	r14d,edx
++	and	edi,r11d
++
++	ror	r13d,5
++	add	r12d,ecx
++	xor	edi,ebx
++
++	ror	r14d,11
++	xor	r13d,r11d
++	add	r12d,edi
++
++	mov	edi,edx
++	add	r12d,DWORD[rbp]
++	xor	r14d,edx
++
++	xor	edi,r8d
++	ror	r13d,6
++	mov	ecx,r8d
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	ecx,r15d
++	add	r10d,r12d
++	add	ecx,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[28+rsp]
++	mov	r15d,DWORD[16+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	ecx,r14d
++	mov	r14d,r15d
++	ror	r15d,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	r15d,r14d
++	shr	r14d,10
++
++	ror	r15d,17
++	xor	r12d,r13d
++	xor	r15d,r14d
++	add	r12d,DWORD[60+rsp]
++
++	add	r12d,DWORD[24+rsp]
++	mov	r13d,r10d
++	add	r12d,r15d
++	mov	r14d,ecx
++	ror	r13d,14
++	mov	r15d,r11d
++
++	xor	r13d,r10d
++	ror	r14d,9
++	xor	r15d,eax
++
++	mov	DWORD[24+rsp],r12d
++	xor	r14d,ecx
++	and	r15d,r10d
++
++	ror	r13d,5
++	add	r12d,ebx
++	xor	r15d,eax
++
++	ror	r14d,11
++	xor	r13d,r10d
++	add	r12d,r15d
++
++	mov	r15d,ecx
++	add	r12d,DWORD[rbp]
++	xor	r14d,ecx
++
++	xor	r15d,edx
++	ror	r13d,6
++	mov	ebx,edx
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	ebx,edi
++	add	r9d,r12d
++	add	ebx,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[32+rsp]
++	mov	edi,DWORD[20+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	ebx,r14d
++	mov	r14d,edi
++	ror	edi,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	edi,r14d
++	shr	r14d,10
++
++	ror	edi,17
++	xor	r12d,r13d
++	xor	edi,r14d
++	add	r12d,DWORD[rsp]
++
++	add	r12d,DWORD[28+rsp]
++	mov	r13d,r9d
++	add	r12d,edi
++	mov	r14d,ebx
++	ror	r13d,14
++	mov	edi,r10d
++
++	xor	r13d,r9d
++	ror	r14d,9
++	xor	edi,r11d
++
++	mov	DWORD[28+rsp],r12d
++	xor	r14d,ebx
++	and	edi,r9d
++
++	ror	r13d,5
++	add	r12d,eax
++	xor	edi,r11d
++
++	ror	r14d,11
++	xor	r13d,r9d
++	add	r12d,edi
++
++	mov	edi,ebx
++	add	r12d,DWORD[rbp]
++	xor	r14d,ebx
++
++	xor	edi,ecx
++	ror	r13d,6
++	mov	eax,ecx
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	eax,r15d
++	add	r8d,r12d
++	add	eax,r12d
++
++	lea	rbp,[20+rbp]
++	mov	r13d,DWORD[36+rsp]
++	mov	r15d,DWORD[24+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	eax,r14d
++	mov	r14d,r15d
++	ror	r15d,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	r15d,r14d
++	shr	r14d,10
++
++	ror	r15d,17
++	xor	r12d,r13d
++	xor	r15d,r14d
++	add	r12d,DWORD[4+rsp]
++
++	add	r12d,DWORD[32+rsp]
++	mov	r13d,r8d
++	add	r12d,r15d
++	mov	r14d,eax
++	ror	r13d,14
++	mov	r15d,r9d
++
++	xor	r13d,r8d
++	ror	r14d,9
++	xor	r15d,r10d
++
++	mov	DWORD[32+rsp],r12d
++	xor	r14d,eax
++	and	r15d,r8d
++
++	ror	r13d,5
++	add	r12d,r11d
++	xor	r15d,r10d
++
++	ror	r14d,11
++	xor	r13d,r8d
++	add	r12d,r15d
++
++	mov	r15d,eax
++	add	r12d,DWORD[rbp]
++	xor	r14d,eax
++
++	xor	r15d,ebx
++	ror	r13d,6
++	mov	r11d,ebx
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r11d,edi
++	add	edx,r12d
++	add	r11d,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[40+rsp]
++	mov	edi,DWORD[28+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	r11d,r14d
++	mov	r14d,edi
++	ror	edi,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	edi,r14d
++	shr	r14d,10
++
++	ror	edi,17
++	xor	r12d,r13d
++	xor	edi,r14d
++	add	r12d,DWORD[8+rsp]
++
++	add	r12d,DWORD[36+rsp]
++	mov	r13d,edx
++	add	r12d,edi
++	mov	r14d,r11d
++	ror	r13d,14
++	mov	edi,r8d
++
++	xor	r13d,edx
++	ror	r14d,9
++	xor	edi,r9d
++
++	mov	DWORD[36+rsp],r12d
++	xor	r14d,r11d
++	and	edi,edx
++
++	ror	r13d,5
++	add	r12d,r10d
++	xor	edi,r9d
++
++	ror	r14d,11
++	xor	r13d,edx
++	add	r12d,edi
++
++	mov	edi,r11d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r11d
++
++	xor	edi,eax
++	ror	r13d,6
++	mov	r10d,eax
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r10d,r15d
++	add	ecx,r12d
++	add	r10d,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[44+rsp]
++	mov	r15d,DWORD[32+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	r10d,r14d
++	mov	r14d,r15d
++	ror	r15d,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	r15d,r14d
++	shr	r14d,10
++
++	ror	r15d,17
++	xor	r12d,r13d
++	xor	r15d,r14d
++	add	r12d,DWORD[12+rsp]
++
++	add	r12d,DWORD[40+rsp]
++	mov	r13d,ecx
++	add	r12d,r15d
++	mov	r14d,r10d
++	ror	r13d,14
++	mov	r15d,edx
++
++	xor	r13d,ecx
++	ror	r14d,9
++	xor	r15d,r8d
++
++	mov	DWORD[40+rsp],r12d
++	xor	r14d,r10d
++	and	r15d,ecx
++
++	ror	r13d,5
++	add	r12d,r9d
++	xor	r15d,r8d
++
++	ror	r14d,11
++	xor	r13d,ecx
++	add	r12d,r15d
++
++	mov	r15d,r10d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r10d
++
++	xor	r15d,r11d
++	ror	r13d,6
++	mov	r9d,r11d
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r9d,edi
++	add	ebx,r12d
++	add	r9d,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[48+rsp]
++	mov	edi,DWORD[36+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	r9d,r14d
++	mov	r14d,edi
++	ror	edi,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	edi,r14d
++	shr	r14d,10
++
++	ror	edi,17
++	xor	r12d,r13d
++	xor	edi,r14d
++	add	r12d,DWORD[16+rsp]
++
++	add	r12d,DWORD[44+rsp]
++	mov	r13d,ebx
++	add	r12d,edi
++	mov	r14d,r9d
++	ror	r13d,14
++	mov	edi,ecx
++
++	xor	r13d,ebx
++	ror	r14d,9
++	xor	edi,edx
++
++	mov	DWORD[44+rsp],r12d
++	xor	r14d,r9d
++	and	edi,ebx
++
++	ror	r13d,5
++	add	r12d,r8d
++	xor	edi,edx
++
++	ror	r14d,11
++	xor	r13d,ebx
++	add	r12d,edi
++
++	mov	edi,r9d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r9d
++
++	xor	edi,r10d
++	ror	r13d,6
++	mov	r8d,r10d
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	r8d,r15d
++	add	eax,r12d
++	add	r8d,r12d
++
++	lea	rbp,[20+rbp]
++	mov	r13d,DWORD[52+rsp]
++	mov	r15d,DWORD[40+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	r8d,r14d
++	mov	r14d,r15d
++	ror	r15d,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	r15d,r14d
++	shr	r14d,10
++
++	ror	r15d,17
++	xor	r12d,r13d
++	xor	r15d,r14d
++	add	r12d,DWORD[20+rsp]
++
++	add	r12d,DWORD[48+rsp]
++	mov	r13d,eax
++	add	r12d,r15d
++	mov	r14d,r8d
++	ror	r13d,14
++	mov	r15d,ebx
++
++	xor	r13d,eax
++	ror	r14d,9
++	xor	r15d,ecx
++
++	mov	DWORD[48+rsp],r12d
++	xor	r14d,r8d
++	and	r15d,eax
++
++	ror	r13d,5
++	add	r12d,edx
++	xor	r15d,ecx
++
++	ror	r14d,11
++	xor	r13d,eax
++	add	r12d,r15d
++
++	mov	r15d,r8d
++	add	r12d,DWORD[rbp]
++	xor	r14d,r8d
++
++	xor	r15d,r9d
++	ror	r13d,6
++	mov	edx,r9d
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	edx,edi
++	add	r11d,r12d
++	add	edx,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[56+rsp]
++	mov	edi,DWORD[44+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	edx,r14d
++	mov	r14d,edi
++	ror	edi,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	edi,r14d
++	shr	r14d,10
++
++	ror	edi,17
++	xor	r12d,r13d
++	xor	edi,r14d
++	add	r12d,DWORD[24+rsp]
++
++	add	r12d,DWORD[52+rsp]
++	mov	r13d,r11d
++	add	r12d,edi
++	mov	r14d,edx
++	ror	r13d,14
++	mov	edi,eax
++
++	xor	r13d,r11d
++	ror	r14d,9
++	xor	edi,ebx
++
++	mov	DWORD[52+rsp],r12d
++	xor	r14d,edx
++	and	edi,r11d
++
++	ror	r13d,5
++	add	r12d,ecx
++	xor	edi,ebx
++
++	ror	r14d,11
++	xor	r13d,r11d
++	add	r12d,edi
++
++	mov	edi,edx
++	add	r12d,DWORD[rbp]
++	xor	r14d,edx
++
++	xor	edi,r8d
++	ror	r13d,6
++	mov	ecx,r8d
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	ecx,r15d
++	add	r10d,r12d
++	add	ecx,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[60+rsp]
++	mov	r15d,DWORD[48+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	ecx,r14d
++	mov	r14d,r15d
++	ror	r15d,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	r15d,r14d
++	shr	r14d,10
++
++	ror	r15d,17
++	xor	r12d,r13d
++	xor	r15d,r14d
++	add	r12d,DWORD[28+rsp]
++
++	add	r12d,DWORD[56+rsp]
++	mov	r13d,r10d
++	add	r12d,r15d
++	mov	r14d,ecx
++	ror	r13d,14
++	mov	r15d,r11d
++
++	xor	r13d,r10d
++	ror	r14d,9
++	xor	r15d,eax
++
++	mov	DWORD[56+rsp],r12d
++	xor	r14d,ecx
++	and	r15d,r10d
++
++	ror	r13d,5
++	add	r12d,ebx
++	xor	r15d,eax
++
++	ror	r14d,11
++	xor	r13d,r10d
++	add	r12d,r15d
++
++	mov	r15d,ecx
++	add	r12d,DWORD[rbp]
++	xor	r14d,ecx
++
++	xor	r15d,edx
++	ror	r13d,6
++	mov	ebx,edx
++
++	and	edi,r15d
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	ebx,edi
++	add	r9d,r12d
++	add	ebx,r12d
++
++	lea	rbp,[4+rbp]
++	mov	r13d,DWORD[rsp]
++	mov	edi,DWORD[52+rsp]
++
++	mov	r12d,r13d
++	ror	r13d,11
++	add	ebx,r14d
++	mov	r14d,edi
++	ror	edi,2
++
++	xor	r13d,r12d
++	shr	r12d,3
++	ror	r13d,7
++	xor	edi,r14d
++	shr	r14d,10
++
++	ror	edi,17
++	xor	r12d,r13d
++	xor	edi,r14d
++	add	r12d,DWORD[32+rsp]
++
++	add	r12d,DWORD[60+rsp]
++	mov	r13d,r9d
++	add	r12d,edi
++	mov	r14d,ebx
++	ror	r13d,14
++	mov	edi,r10d
++
++	xor	r13d,r9d
++	ror	r14d,9
++	xor	edi,r11d
++
++	mov	DWORD[60+rsp],r12d
++	xor	r14d,ebx
++	and	edi,r9d
++
++	ror	r13d,5
++	add	r12d,eax
++	xor	edi,r11d
++
++	ror	r14d,11
++	xor	r13d,r9d
++	add	r12d,edi
++
++	mov	edi,ebx
++	add	r12d,DWORD[rbp]
++	xor	r14d,ebx
++
++	xor	edi,ecx
++	ror	r13d,6
++	mov	eax,ecx
++
++	and	r15d,edi
++	ror	r14d,2
++	add	r12d,r13d
++
++	xor	eax,r15d
++	add	r8d,r12d
++	add	eax,r12d
++
++	lea	rbp,[20+rbp]
++	cmp	BYTE[3+rbp],0
++	jnz	NEAR $L$rounds_16_xx
++
++	mov	rdi,QWORD[((64+0))+rsp]
++	add	eax,r14d
++	lea	rsi,[64+rsi]
++
++	add	eax,DWORD[rdi]
++	add	ebx,DWORD[4+rdi]
++	add	ecx,DWORD[8+rdi]
++	add	edx,DWORD[12+rdi]
++	add	r8d,DWORD[16+rdi]
++	add	r9d,DWORD[20+rdi]
++	add	r10d,DWORD[24+rdi]
++	add	r11d,DWORD[28+rdi]
++
++	cmp	rsi,QWORD[((64+16))+rsp]
++
++	mov	DWORD[rdi],eax
++	mov	DWORD[4+rdi],ebx
++	mov	DWORD[8+rdi],ecx
++	mov	DWORD[12+rdi],edx
++	mov	DWORD[16+rdi],r8d
++	mov	DWORD[20+rdi],r9d
++	mov	DWORD[24+rdi],r10d
++	mov	DWORD[28+rdi],r11d
++	jb	NEAR $L$loop
++
++	mov	rsi,QWORD[((64+24))+rsp]
++	mov	r15,QWORD[rsi]
++	mov	r14,QWORD[8+rsi]
++	mov	r13,QWORD[16+rsi]
++	mov	r12,QWORD[24+rsi]
++	mov	rbp,QWORD[32+rsi]
++	mov	rbx,QWORD[40+rsi]
++	lea	rsp,[48+rsi]
++$L$epilogue:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha256_block_data_order:
++ALIGN	64
++
++K256:
++	DD	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
++	DD	0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5
++	DD	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
++	DD	0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5
++	DD	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
++	DD	0xd807aa98,0x12835b01,0x243185be,0x550c7dc3
++	DD	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
++	DD	0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174
++	DD	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
++	DD	0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc
++	DD	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
++	DD	0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da
++	DD	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
++	DD	0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7
++	DD	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
++	DD	0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967
++	DD	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
++	DD	0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13
++	DD	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
++	DD	0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85
++	DD	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
++	DD	0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3
++	DD	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
++	DD	0xd192e819,0xd6990624,0xf40e3585,0x106aa070
++	DD	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
++	DD	0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5
++	DD	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
++	DD	0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3
++	DD	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
++	DD	0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208
++	DD	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
++	DD	0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2
++
++	DD	0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f
++	DD	0x00010203,0x04050607,0x08090a0b,0x0c0d0e0f
++	DD	0x03020100,0x0b0a0908,0xffffffff,0xffffffff
++	DD	0x03020100,0x0b0a0908,0xffffffff,0xffffffff
++	DD	0xffffffff,0xffffffff,0x03020100,0x0b0a0908
++	DD	0xffffffff,0xffffffff,0x03020100,0x0b0a0908
++DB	83,72,65,50,53,54,32,98,108,111,99,107,32,116,114,97
++DB	110,115,102,111,114,109,32,102,111,114,32,120,56,54,95,54
++DB	52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121
++DB	32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46
++DB	111,114,103,62,0
++
++ALIGN	64
++sha256_block_data_order_shaext:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha256_block_data_order_shaext:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++_shaext_shortcut:
++	lea	rsp,[((-88))+rsp]
++	movaps	XMMWORD[(-8-80)+rax],xmm6
++	movaps	XMMWORD[(-8-64)+rax],xmm7
++	movaps	XMMWORD[(-8-48)+rax],xmm8
++	movaps	XMMWORD[(-8-32)+rax],xmm9
++	movaps	XMMWORD[(-8-16)+rax],xmm10
++$L$prologue_shaext:
++	lea	rcx,[((K256+128))]
++	movdqu	xmm1,XMMWORD[rdi]
++	movdqu	xmm2,XMMWORD[16+rdi]
++	movdqa	xmm7,XMMWORD[((512-128))+rcx]
++
++	pshufd	xmm0,xmm1,0x1b
++	pshufd	xmm1,xmm1,0xb1
++	pshufd	xmm2,xmm2,0x1b
++	movdqa	xmm8,xmm7
++DB	102,15,58,15,202,8
++	punpcklqdq	xmm2,xmm0
++	jmp	NEAR $L$oop_shaext
++
++ALIGN	16
++$L$oop_shaext:
++	movdqu	xmm3,XMMWORD[rsi]
++	movdqu	xmm4,XMMWORD[16+rsi]
++	movdqu	xmm5,XMMWORD[32+rsi]
++DB	102,15,56,0,223
++	movdqu	xmm6,XMMWORD[48+rsi]
++
++	movdqa	xmm0,XMMWORD[((0-128))+rcx]
++	paddd	xmm0,xmm3
++DB	102,15,56,0,231
++	movdqa	xmm10,xmm2
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	nop
++	movdqa	xmm9,xmm1
++DB	15,56,203,202
++
++	movdqa	xmm0,XMMWORD[((32-128))+rcx]
++	paddd	xmm0,xmm4
++DB	102,15,56,0,239
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	lea	rsi,[64+rsi]
++DB	15,56,204,220
++DB	15,56,203,202
++
++	movdqa	xmm0,XMMWORD[((64-128))+rcx]
++	paddd	xmm0,xmm5
++DB	102,15,56,0,247
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm6
++DB	102,15,58,15,253,4
++	nop
++	paddd	xmm3,xmm7
++DB	15,56,204,229
++DB	15,56,203,202
++
++	movdqa	xmm0,XMMWORD[((96-128))+rcx]
++	paddd	xmm0,xmm6
++DB	15,56,205,222
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm3
++DB	102,15,58,15,254,4
++	nop
++	paddd	xmm4,xmm7
++DB	15,56,204,238
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((128-128))+rcx]
++	paddd	xmm0,xmm3
++DB	15,56,205,227
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm4
++DB	102,15,58,15,251,4
++	nop
++	paddd	xmm5,xmm7
++DB	15,56,204,243
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((160-128))+rcx]
++	paddd	xmm0,xmm4
++DB	15,56,205,236
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm5
++DB	102,15,58,15,252,4
++	nop
++	paddd	xmm6,xmm7
++DB	15,56,204,220
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((192-128))+rcx]
++	paddd	xmm0,xmm5
++DB	15,56,205,245
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm6
++DB	102,15,58,15,253,4
++	nop
++	paddd	xmm3,xmm7
++DB	15,56,204,229
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((224-128))+rcx]
++	paddd	xmm0,xmm6
++DB	15,56,205,222
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm3
++DB	102,15,58,15,254,4
++	nop
++	paddd	xmm4,xmm7
++DB	15,56,204,238
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((256-128))+rcx]
++	paddd	xmm0,xmm3
++DB	15,56,205,227
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm4
++DB	102,15,58,15,251,4
++	nop
++	paddd	xmm5,xmm7
++DB	15,56,204,243
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((288-128))+rcx]
++	paddd	xmm0,xmm4
++DB	15,56,205,236
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm5
++DB	102,15,58,15,252,4
++	nop
++	paddd	xmm6,xmm7
++DB	15,56,204,220
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((320-128))+rcx]
++	paddd	xmm0,xmm5
++DB	15,56,205,245
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm6
++DB	102,15,58,15,253,4
++	nop
++	paddd	xmm3,xmm7
++DB	15,56,204,229
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((352-128))+rcx]
++	paddd	xmm0,xmm6
++DB	15,56,205,222
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm3
++DB	102,15,58,15,254,4
++	nop
++	paddd	xmm4,xmm7
++DB	15,56,204,238
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((384-128))+rcx]
++	paddd	xmm0,xmm3
++DB	15,56,205,227
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm4
++DB	102,15,58,15,251,4
++	nop
++	paddd	xmm5,xmm7
++DB	15,56,204,243
++DB	15,56,203,202
++	movdqa	xmm0,XMMWORD[((416-128))+rcx]
++	paddd	xmm0,xmm4
++DB	15,56,205,236
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	movdqa	xmm7,xmm5
++DB	102,15,58,15,252,4
++DB	15,56,203,202
++	paddd	xmm6,xmm7
++
++	movdqa	xmm0,XMMWORD[((448-128))+rcx]
++	paddd	xmm0,xmm5
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++DB	15,56,205,245
++	movdqa	xmm7,xmm8
++DB	15,56,203,202
++
++	movdqa	xmm0,XMMWORD[((480-128))+rcx]
++	paddd	xmm0,xmm6
++	nop
++DB	15,56,203,209
++	pshufd	xmm0,xmm0,0x0e
++	dec	rdx
++	nop
++DB	15,56,203,202
++
++	paddd	xmm2,xmm10
++	paddd	xmm1,xmm9
++	jnz	NEAR $L$oop_shaext
++
++	pshufd	xmm2,xmm2,0xb1
++	pshufd	xmm7,xmm1,0x1b
++	pshufd	xmm1,xmm1,0xb1
++	punpckhqdq	xmm1,xmm2
++DB	102,15,58,15,215,8
++
++	movdqu	XMMWORD[rdi],xmm1
++	movdqu	XMMWORD[16+rdi],xmm2
++	movaps	xmm6,XMMWORD[((-8-80))+rax]
++	movaps	xmm7,XMMWORD[((-8-64))+rax]
++	movaps	xmm8,XMMWORD[((-8-48))+rax]
++	movaps	xmm9,XMMWORD[((-8-32))+rax]
++	movaps	xmm10,XMMWORD[((-8-16))+rax]
++	mov	rsp,rax
++$L$epilogue_shaext:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha256_block_data_order_shaext:
++
++ALIGN	64
++sha256_block_data_order_ssse3:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha256_block_data_order_ssse3:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++$L$ssse3_shortcut:
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	mov	r11,rsp
++	shl	rdx,4
++	sub	rsp,160
++	lea	rdx,[rdx*4+rsi]
++	and	rsp,-64
++	mov	QWORD[((64+0))+rsp],rdi
++	mov	QWORD[((64+8))+rsp],rsi
++	mov	QWORD[((64+16))+rsp],rdx
++	mov	QWORD[((64+24))+rsp],r11
++	movaps	XMMWORD[(64+32)+rsp],xmm6
++	movaps	XMMWORD[(64+48)+rsp],xmm7
++	movaps	XMMWORD[(64+64)+rsp],xmm8
++	movaps	XMMWORD[(64+80)+rsp],xmm9
++$L$prologue_ssse3:
++
++	mov	eax,DWORD[rdi]
++	mov	ebx,DWORD[4+rdi]
++	mov	ecx,DWORD[8+rdi]
++	mov	edx,DWORD[12+rdi]
++	mov	r8d,DWORD[16+rdi]
++	mov	r9d,DWORD[20+rdi]
++	mov	r10d,DWORD[24+rdi]
++	mov	r11d,DWORD[28+rdi]
++
++
++	jmp	NEAR $L$loop_ssse3
++ALIGN	16
++$L$loop_ssse3:
++	movdqa	xmm7,XMMWORD[((K256+512))]
++	movdqu	xmm0,XMMWORD[rsi]
++	movdqu	xmm1,XMMWORD[16+rsi]
++	movdqu	xmm2,XMMWORD[32+rsi]
++DB	102,15,56,0,199
++	movdqu	xmm3,XMMWORD[48+rsi]
++	lea	rbp,[K256]
++DB	102,15,56,0,207
++	movdqa	xmm4,XMMWORD[rbp]
++	movdqa	xmm5,XMMWORD[32+rbp]
++DB	102,15,56,0,215
++	paddd	xmm4,xmm0
++	movdqa	xmm6,XMMWORD[64+rbp]
++DB	102,15,56,0,223
++	movdqa	xmm7,XMMWORD[96+rbp]
++	paddd	xmm5,xmm1
++	paddd	xmm6,xmm2
++	paddd	xmm7,xmm3
++	movdqa	XMMWORD[rsp],xmm4
++	mov	r14d,eax
++	movdqa	XMMWORD[16+rsp],xmm5
++	mov	edi,ebx
++	movdqa	XMMWORD[32+rsp],xmm6
++	xor	edi,ecx
++	movdqa	XMMWORD[48+rsp],xmm7
++	mov	r13d,r8d
++	jmp	NEAR $L$ssse3_00_47
++
++ALIGN	16
++$L$ssse3_00_47:
++	sub	rbp,-128
++	ror	r13d,14
++	movdqa	xmm4,xmm1
++	mov	eax,r14d
++	mov	r12d,r9d
++	movdqa	xmm7,xmm3
++	ror	r14d,9
++	xor	r13d,r8d
++	xor	r12d,r10d
++	ror	r13d,5
++	xor	r14d,eax
++DB	102,15,58,15,224,4
++	and	r12d,r8d
++	xor	r13d,r8d
++DB	102,15,58,15,250,4
++	add	r11d,DWORD[rsp]
++	mov	r15d,eax
++	xor	r12d,r10d
++	ror	r14d,11
++	movdqa	xmm5,xmm4
++	xor	r15d,ebx
++	add	r11d,r12d
++	movdqa	xmm6,xmm4
++	ror	r13d,6
++	and	edi,r15d
++	psrld	xmm4,3
++	xor	r14d,eax
++	add	r11d,r13d
++	xor	edi,ebx
++	paddd	xmm0,xmm7
++	ror	r14d,2
++	add	edx,r11d
++	psrld	xmm6,7
++	add	r11d,edi
++	mov	r13d,edx
++	pshufd	xmm7,xmm3,250
++	add	r14d,r11d
++	ror	r13d,14
++	pslld	xmm5,14
++	mov	r11d,r14d
++	mov	r12d,r8d
++	pxor	xmm4,xmm6
++	ror	r14d,9
++	xor	r13d,edx
++	xor	r12d,r9d
++	ror	r13d,5
++	psrld	xmm6,11
++	xor	r14d,r11d
++	pxor	xmm4,xmm5
++	and	r12d,edx
++	xor	r13d,edx
++	pslld	xmm5,11
++	add	r10d,DWORD[4+rsp]
++	mov	edi,r11d
++	pxor	xmm4,xmm6
++	xor	r12d,r9d
++	ror	r14d,11
++	movdqa	xmm6,xmm7
++	xor	edi,eax
++	add	r10d,r12d
++	pxor	xmm4,xmm5
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,r11d
++	psrld	xmm7,10
++	add	r10d,r13d
++	xor	r15d,eax
++	paddd	xmm0,xmm4
++	ror	r14d,2
++	add	ecx,r10d
++	psrlq	xmm6,17
++	add	r10d,r15d
++	mov	r13d,ecx
++	add	r14d,r10d
++	pxor	xmm7,xmm6
++	ror	r13d,14
++	mov	r10d,r14d
++	mov	r12d,edx
++	ror	r14d,9
++	psrlq	xmm6,2
++	xor	r13d,ecx
++	xor	r12d,r8d
++	pxor	xmm7,xmm6
++	ror	r13d,5
++	xor	r14d,r10d
++	and	r12d,ecx
++	pshufd	xmm7,xmm7,128
++	xor	r13d,ecx
++	add	r9d,DWORD[8+rsp]
++	mov	r15d,r10d
++	psrldq	xmm7,8
++	xor	r12d,r8d
++	ror	r14d,11
++	xor	r15d,r11d
++	add	r9d,r12d
++	ror	r13d,6
++	paddd	xmm0,xmm7
++	and	edi,r15d
++	xor	r14d,r10d
++	add	r9d,r13d
++	pshufd	xmm7,xmm0,80
++	xor	edi,r11d
++	ror	r14d,2
++	add	ebx,r9d
++	movdqa	xmm6,xmm7
++	add	r9d,edi
++	mov	r13d,ebx
++	psrld	xmm7,10
++	add	r14d,r9d
++	ror	r13d,14
++	psrlq	xmm6,17
++	mov	r9d,r14d
++	mov	r12d,ecx
++	pxor	xmm7,xmm6
++	ror	r14d,9
++	xor	r13d,ebx
++	xor	r12d,edx
++	ror	r13d,5
++	xor	r14d,r9d
++	psrlq	xmm6,2
++	and	r12d,ebx
++	xor	r13d,ebx
++	add	r8d,DWORD[12+rsp]
++	pxor	xmm7,xmm6
++	mov	edi,r9d
++	xor	r12d,edx
++	ror	r14d,11
++	pshufd	xmm7,xmm7,8
++	xor	edi,r10d
++	add	r8d,r12d
++	movdqa	xmm6,XMMWORD[rbp]
++	ror	r13d,6
++	and	r15d,edi
++	pslldq	xmm7,8
++	xor	r14d,r9d
++	add	r8d,r13d
++	xor	r15d,r10d
++	paddd	xmm0,xmm7
++	ror	r14d,2
++	add	eax,r8d
++	add	r8d,r15d
++	paddd	xmm6,xmm0
++	mov	r13d,eax
++	add	r14d,r8d
++	movdqa	XMMWORD[rsp],xmm6
++	ror	r13d,14
++	movdqa	xmm4,xmm2
++	mov	r8d,r14d
++	mov	r12d,ebx
++	movdqa	xmm7,xmm0
++	ror	r14d,9
++	xor	r13d,eax
++	xor	r12d,ecx
++	ror	r13d,5
++	xor	r14d,r8d
++DB	102,15,58,15,225,4
++	and	r12d,eax
++	xor	r13d,eax
++DB	102,15,58,15,251,4
++	add	edx,DWORD[16+rsp]
++	mov	r15d,r8d
++	xor	r12d,ecx
++	ror	r14d,11
++	movdqa	xmm5,xmm4
++	xor	r15d,r9d
++	add	edx,r12d
++	movdqa	xmm6,xmm4
++	ror	r13d,6
++	and	edi,r15d
++	psrld	xmm4,3
++	xor	r14d,r8d
++	add	edx,r13d
++	xor	edi,r9d
++	paddd	xmm1,xmm7
++	ror	r14d,2
++	add	r11d,edx
++	psrld	xmm6,7
++	add	edx,edi
++	mov	r13d,r11d
++	pshufd	xmm7,xmm0,250
++	add	r14d,edx
++	ror	r13d,14
++	pslld	xmm5,14
++	mov	edx,r14d
++	mov	r12d,eax
++	pxor	xmm4,xmm6
++	ror	r14d,9
++	xor	r13d,r11d
++	xor	r12d,ebx
++	ror	r13d,5
++	psrld	xmm6,11
++	xor	r14d,edx
++	pxor	xmm4,xmm5
++	and	r12d,r11d
++	xor	r13d,r11d
++	pslld	xmm5,11
++	add	ecx,DWORD[20+rsp]
++	mov	edi,edx
++	pxor	xmm4,xmm6
++	xor	r12d,ebx
++	ror	r14d,11
++	movdqa	xmm6,xmm7
++	xor	edi,r8d
++	add	ecx,r12d
++	pxor	xmm4,xmm5
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,edx
++	psrld	xmm7,10
++	add	ecx,r13d
++	xor	r15d,r8d
++	paddd	xmm1,xmm4
++	ror	r14d,2
++	add	r10d,ecx
++	psrlq	xmm6,17
++	add	ecx,r15d
++	mov	r13d,r10d
++	add	r14d,ecx
++	pxor	xmm7,xmm6
++	ror	r13d,14
++	mov	ecx,r14d
++	mov	r12d,r11d
++	ror	r14d,9
++	psrlq	xmm6,2
++	xor	r13d,r10d
++	xor	r12d,eax
++	pxor	xmm7,xmm6
++	ror	r13d,5
++	xor	r14d,ecx
++	and	r12d,r10d
++	pshufd	xmm7,xmm7,128
++	xor	r13d,r10d
++	add	ebx,DWORD[24+rsp]
++	mov	r15d,ecx
++	psrldq	xmm7,8
++	xor	r12d,eax
++	ror	r14d,11
++	xor	r15d,edx
++	add	ebx,r12d
++	ror	r13d,6
++	paddd	xmm1,xmm7
++	and	edi,r15d
++	xor	r14d,ecx
++	add	ebx,r13d
++	pshufd	xmm7,xmm1,80
++	xor	edi,edx
++	ror	r14d,2
++	add	r9d,ebx
++	movdqa	xmm6,xmm7
++	add	ebx,edi
++	mov	r13d,r9d
++	psrld	xmm7,10
++	add	r14d,ebx
++	ror	r13d,14
++	psrlq	xmm6,17
++	mov	ebx,r14d
++	mov	r12d,r10d
++	pxor	xmm7,xmm6
++	ror	r14d,9
++	xor	r13d,r9d
++	xor	r12d,r11d
++	ror	r13d,5
++	xor	r14d,ebx
++	psrlq	xmm6,2
++	and	r12d,r9d
++	xor	r13d,r9d
++	add	eax,DWORD[28+rsp]
++	pxor	xmm7,xmm6
++	mov	edi,ebx
++	xor	r12d,r11d
++	ror	r14d,11
++	pshufd	xmm7,xmm7,8
++	xor	edi,ecx
++	add	eax,r12d
++	movdqa	xmm6,XMMWORD[32+rbp]
++	ror	r13d,6
++	and	r15d,edi
++	pslldq	xmm7,8
++	xor	r14d,ebx
++	add	eax,r13d
++	xor	r15d,ecx
++	paddd	xmm1,xmm7
++	ror	r14d,2
++	add	r8d,eax
++	add	eax,r15d
++	paddd	xmm6,xmm1
++	mov	r13d,r8d
++	add	r14d,eax
++	movdqa	XMMWORD[16+rsp],xmm6
++	ror	r13d,14
++	movdqa	xmm4,xmm3
++	mov	eax,r14d
++	mov	r12d,r9d
++	movdqa	xmm7,xmm1
++	ror	r14d,9
++	xor	r13d,r8d
++	xor	r12d,r10d
++	ror	r13d,5
++	xor	r14d,eax
++DB	102,15,58,15,226,4
++	and	r12d,r8d
++	xor	r13d,r8d
++DB	102,15,58,15,248,4
++	add	r11d,DWORD[32+rsp]
++	mov	r15d,eax
++	xor	r12d,r10d
++	ror	r14d,11
++	movdqa	xmm5,xmm4
++	xor	r15d,ebx
++	add	r11d,r12d
++	movdqa	xmm6,xmm4
++	ror	r13d,6
++	and	edi,r15d
++	psrld	xmm4,3
++	xor	r14d,eax
++	add	r11d,r13d
++	xor	edi,ebx
++	paddd	xmm2,xmm7
++	ror	r14d,2
++	add	edx,r11d
++	psrld	xmm6,7
++	add	r11d,edi
++	mov	r13d,edx
++	pshufd	xmm7,xmm1,250
++	add	r14d,r11d
++	ror	r13d,14
++	pslld	xmm5,14
++	mov	r11d,r14d
++	mov	r12d,r8d
++	pxor	xmm4,xmm6
++	ror	r14d,9
++	xor	r13d,edx
++	xor	r12d,r9d
++	ror	r13d,5
++	psrld	xmm6,11
++	xor	r14d,r11d
++	pxor	xmm4,xmm5
++	and	r12d,edx
++	xor	r13d,edx
++	pslld	xmm5,11
++	add	r10d,DWORD[36+rsp]
++	mov	edi,r11d
++	pxor	xmm4,xmm6
++	xor	r12d,r9d
++	ror	r14d,11
++	movdqa	xmm6,xmm7
++	xor	edi,eax
++	add	r10d,r12d
++	pxor	xmm4,xmm5
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,r11d
++	psrld	xmm7,10
++	add	r10d,r13d
++	xor	r15d,eax
++	paddd	xmm2,xmm4
++	ror	r14d,2
++	add	ecx,r10d
++	psrlq	xmm6,17
++	add	r10d,r15d
++	mov	r13d,ecx
++	add	r14d,r10d
++	pxor	xmm7,xmm6
++	ror	r13d,14
++	mov	r10d,r14d
++	mov	r12d,edx
++	ror	r14d,9
++	psrlq	xmm6,2
++	xor	r13d,ecx
++	xor	r12d,r8d
++	pxor	xmm7,xmm6
++	ror	r13d,5
++	xor	r14d,r10d
++	and	r12d,ecx
++	pshufd	xmm7,xmm7,128
++	xor	r13d,ecx
++	add	r9d,DWORD[40+rsp]
++	mov	r15d,r10d
++	psrldq	xmm7,8
++	xor	r12d,r8d
++	ror	r14d,11
++	xor	r15d,r11d
++	add	r9d,r12d
++	ror	r13d,6
++	paddd	xmm2,xmm7
++	and	edi,r15d
++	xor	r14d,r10d
++	add	r9d,r13d
++	pshufd	xmm7,xmm2,80
++	xor	edi,r11d
++	ror	r14d,2
++	add	ebx,r9d
++	movdqa	xmm6,xmm7
++	add	r9d,edi
++	mov	r13d,ebx
++	psrld	xmm7,10
++	add	r14d,r9d
++	ror	r13d,14
++	psrlq	xmm6,17
++	mov	r9d,r14d
++	mov	r12d,ecx
++	pxor	xmm7,xmm6
++	ror	r14d,9
++	xor	r13d,ebx
++	xor	r12d,edx
++	ror	r13d,5
++	xor	r14d,r9d
++	psrlq	xmm6,2
++	and	r12d,ebx
++	xor	r13d,ebx
++	add	r8d,DWORD[44+rsp]
++	pxor	xmm7,xmm6
++	mov	edi,r9d
++	xor	r12d,edx
++	ror	r14d,11
++	pshufd	xmm7,xmm7,8
++	xor	edi,r10d
++	add	r8d,r12d
++	movdqa	xmm6,XMMWORD[64+rbp]
++	ror	r13d,6
++	and	r15d,edi
++	pslldq	xmm7,8
++	xor	r14d,r9d
++	add	r8d,r13d
++	xor	r15d,r10d
++	paddd	xmm2,xmm7
++	ror	r14d,2
++	add	eax,r8d
++	add	r8d,r15d
++	paddd	xmm6,xmm2
++	mov	r13d,eax
++	add	r14d,r8d
++	movdqa	XMMWORD[32+rsp],xmm6
++	ror	r13d,14
++	movdqa	xmm4,xmm0
++	mov	r8d,r14d
++	mov	r12d,ebx
++	movdqa	xmm7,xmm2
++	ror	r14d,9
++	xor	r13d,eax
++	xor	r12d,ecx
++	ror	r13d,5
++	xor	r14d,r8d
++DB	102,15,58,15,227,4
++	and	r12d,eax
++	xor	r13d,eax
++DB	102,15,58,15,249,4
++	add	edx,DWORD[48+rsp]
++	mov	r15d,r8d
++	xor	r12d,ecx
++	ror	r14d,11
++	movdqa	xmm5,xmm4
++	xor	r15d,r9d
++	add	edx,r12d
++	movdqa	xmm6,xmm4
++	ror	r13d,6
++	and	edi,r15d
++	psrld	xmm4,3
++	xor	r14d,r8d
++	add	edx,r13d
++	xor	edi,r9d
++	paddd	xmm3,xmm7
++	ror	r14d,2
++	add	r11d,edx
++	psrld	xmm6,7
++	add	edx,edi
++	mov	r13d,r11d
++	pshufd	xmm7,xmm2,250
++	add	r14d,edx
++	ror	r13d,14
++	pslld	xmm5,14
++	mov	edx,r14d
++	mov	r12d,eax
++	pxor	xmm4,xmm6
++	ror	r14d,9
++	xor	r13d,r11d
++	xor	r12d,ebx
++	ror	r13d,5
++	psrld	xmm6,11
++	xor	r14d,edx
++	pxor	xmm4,xmm5
++	and	r12d,r11d
++	xor	r13d,r11d
++	pslld	xmm5,11
++	add	ecx,DWORD[52+rsp]
++	mov	edi,edx
++	pxor	xmm4,xmm6
++	xor	r12d,ebx
++	ror	r14d,11
++	movdqa	xmm6,xmm7
++	xor	edi,r8d
++	add	ecx,r12d
++	pxor	xmm4,xmm5
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,edx
++	psrld	xmm7,10
++	add	ecx,r13d
++	xor	r15d,r8d
++	paddd	xmm3,xmm4
++	ror	r14d,2
++	add	r10d,ecx
++	psrlq	xmm6,17
++	add	ecx,r15d
++	mov	r13d,r10d
++	add	r14d,ecx
++	pxor	xmm7,xmm6
++	ror	r13d,14
++	mov	ecx,r14d
++	mov	r12d,r11d
++	ror	r14d,9
++	psrlq	xmm6,2
++	xor	r13d,r10d
++	xor	r12d,eax
++	pxor	xmm7,xmm6
++	ror	r13d,5
++	xor	r14d,ecx
++	and	r12d,r10d
++	pshufd	xmm7,xmm7,128
++	xor	r13d,r10d
++	add	ebx,DWORD[56+rsp]
++	mov	r15d,ecx
++	psrldq	xmm7,8
++	xor	r12d,eax
++	ror	r14d,11
++	xor	r15d,edx
++	add	ebx,r12d
++	ror	r13d,6
++	paddd	xmm3,xmm7
++	and	edi,r15d
++	xor	r14d,ecx
++	add	ebx,r13d
++	pshufd	xmm7,xmm3,80
++	xor	edi,edx
++	ror	r14d,2
++	add	r9d,ebx
++	movdqa	xmm6,xmm7
++	add	ebx,edi
++	mov	r13d,r9d
++	psrld	xmm7,10
++	add	r14d,ebx
++	ror	r13d,14
++	psrlq	xmm6,17
++	mov	ebx,r14d
++	mov	r12d,r10d
++	pxor	xmm7,xmm6
++	ror	r14d,9
++	xor	r13d,r9d
++	xor	r12d,r11d
++	ror	r13d,5
++	xor	r14d,ebx
++	psrlq	xmm6,2
++	and	r12d,r9d
++	xor	r13d,r9d
++	add	eax,DWORD[60+rsp]
++	pxor	xmm7,xmm6
++	mov	edi,ebx
++	xor	r12d,r11d
++	ror	r14d,11
++	pshufd	xmm7,xmm7,8
++	xor	edi,ecx
++	add	eax,r12d
++	movdqa	xmm6,XMMWORD[96+rbp]
++	ror	r13d,6
++	and	r15d,edi
++	pslldq	xmm7,8
++	xor	r14d,ebx
++	add	eax,r13d
++	xor	r15d,ecx
++	paddd	xmm3,xmm7
++	ror	r14d,2
++	add	r8d,eax
++	add	eax,r15d
++	paddd	xmm6,xmm3
++	mov	r13d,r8d
++	add	r14d,eax
++	movdqa	XMMWORD[48+rsp],xmm6
++	cmp	BYTE[131+rbp],0
++	jne	NEAR $L$ssse3_00_47
++	ror	r13d,14
++	mov	eax,r14d
++	mov	r12d,r9d
++	ror	r14d,9
++	xor	r13d,r8d
++	xor	r12d,r10d
++	ror	r13d,5
++	xor	r14d,eax
++	and	r12d,r8d
++	xor	r13d,r8d
++	add	r11d,DWORD[rsp]
++	mov	r15d,eax
++	xor	r12d,r10d
++	ror	r14d,11
++	xor	r15d,ebx
++	add	r11d,r12d
++	ror	r13d,6
++	and	edi,r15d
++	xor	r14d,eax
++	add	r11d,r13d
++	xor	edi,ebx
++	ror	r14d,2
++	add	edx,r11d
++	add	r11d,edi
++	mov	r13d,edx
++	add	r14d,r11d
++	ror	r13d,14
++	mov	r11d,r14d
++	mov	r12d,r8d
++	ror	r14d,9
++	xor	r13d,edx
++	xor	r12d,r9d
++	ror	r13d,5
++	xor	r14d,r11d
++	and	r12d,edx
++	xor	r13d,edx
++	add	r10d,DWORD[4+rsp]
++	mov	edi,r11d
++	xor	r12d,r9d
++	ror	r14d,11
++	xor	edi,eax
++	add	r10d,r12d
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,r11d
++	add	r10d,r13d
++	xor	r15d,eax
++	ror	r14d,2
++	add	ecx,r10d
++	add	r10d,r15d
++	mov	r13d,ecx
++	add	r14d,r10d
++	ror	r13d,14
++	mov	r10d,r14d
++	mov	r12d,edx
++	ror	r14d,9
++	xor	r13d,ecx
++	xor	r12d,r8d
++	ror	r13d,5
++	xor	r14d,r10d
++	and	r12d,ecx
++	xor	r13d,ecx
++	add	r9d,DWORD[8+rsp]
++	mov	r15d,r10d
++	xor	r12d,r8d
++	ror	r14d,11
++	xor	r15d,r11d
++	add	r9d,r12d
++	ror	r13d,6
++	and	edi,r15d
++	xor	r14d,r10d
++	add	r9d,r13d
++	xor	edi,r11d
++	ror	r14d,2
++	add	ebx,r9d
++	add	r9d,edi
++	mov	r13d,ebx
++	add	r14d,r9d
++	ror	r13d,14
++	mov	r9d,r14d
++	mov	r12d,ecx
++	ror	r14d,9
++	xor	r13d,ebx
++	xor	r12d,edx
++	ror	r13d,5
++	xor	r14d,r9d
++	and	r12d,ebx
++	xor	r13d,ebx
++	add	r8d,DWORD[12+rsp]
++	mov	edi,r9d
++	xor	r12d,edx
++	ror	r14d,11
++	xor	edi,r10d
++	add	r8d,r12d
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,r9d
++	add	r8d,r13d
++	xor	r15d,r10d
++	ror	r14d,2
++	add	eax,r8d
++	add	r8d,r15d
++	mov	r13d,eax
++	add	r14d,r8d
++	ror	r13d,14
++	mov	r8d,r14d
++	mov	r12d,ebx
++	ror	r14d,9
++	xor	r13d,eax
++	xor	r12d,ecx
++	ror	r13d,5
++	xor	r14d,r8d
++	and	r12d,eax
++	xor	r13d,eax
++	add	edx,DWORD[16+rsp]
++	mov	r15d,r8d
++	xor	r12d,ecx
++	ror	r14d,11
++	xor	r15d,r9d
++	add	edx,r12d
++	ror	r13d,6
++	and	edi,r15d
++	xor	r14d,r8d
++	add	edx,r13d
++	xor	edi,r9d
++	ror	r14d,2
++	add	r11d,edx
++	add	edx,edi
++	mov	r13d,r11d
++	add	r14d,edx
++	ror	r13d,14
++	mov	edx,r14d
++	mov	r12d,eax
++	ror	r14d,9
++	xor	r13d,r11d
++	xor	r12d,ebx
++	ror	r13d,5
++	xor	r14d,edx
++	and	r12d,r11d
++	xor	r13d,r11d
++	add	ecx,DWORD[20+rsp]
++	mov	edi,edx
++	xor	r12d,ebx
++	ror	r14d,11
++	xor	edi,r8d
++	add	ecx,r12d
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,edx
++	add	ecx,r13d
++	xor	r15d,r8d
++	ror	r14d,2
++	add	r10d,ecx
++	add	ecx,r15d
++	mov	r13d,r10d
++	add	r14d,ecx
++	ror	r13d,14
++	mov	ecx,r14d
++	mov	r12d,r11d
++	ror	r14d,9
++	xor	r13d,r10d
++	xor	r12d,eax
++	ror	r13d,5
++	xor	r14d,ecx
++	and	r12d,r10d
++	xor	r13d,r10d
++	add	ebx,DWORD[24+rsp]
++	mov	r15d,ecx
++	xor	r12d,eax
++	ror	r14d,11
++	xor	r15d,edx
++	add	ebx,r12d
++	ror	r13d,6
++	and	edi,r15d
++	xor	r14d,ecx
++	add	ebx,r13d
++	xor	edi,edx
++	ror	r14d,2
++	add	r9d,ebx
++	add	ebx,edi
++	mov	r13d,r9d
++	add	r14d,ebx
++	ror	r13d,14
++	mov	ebx,r14d
++	mov	r12d,r10d
++	ror	r14d,9
++	xor	r13d,r9d
++	xor	r12d,r11d
++	ror	r13d,5
++	xor	r14d,ebx
++	and	r12d,r9d
++	xor	r13d,r9d
++	add	eax,DWORD[28+rsp]
++	mov	edi,ebx
++	xor	r12d,r11d
++	ror	r14d,11
++	xor	edi,ecx
++	add	eax,r12d
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,ebx
++	add	eax,r13d
++	xor	r15d,ecx
++	ror	r14d,2
++	add	r8d,eax
++	add	eax,r15d
++	mov	r13d,r8d
++	add	r14d,eax
++	ror	r13d,14
++	mov	eax,r14d
++	mov	r12d,r9d
++	ror	r14d,9
++	xor	r13d,r8d
++	xor	r12d,r10d
++	ror	r13d,5
++	xor	r14d,eax
++	and	r12d,r8d
++	xor	r13d,r8d
++	add	r11d,DWORD[32+rsp]
++	mov	r15d,eax
++	xor	r12d,r10d
++	ror	r14d,11
++	xor	r15d,ebx
++	add	r11d,r12d
++	ror	r13d,6
++	and	edi,r15d
++	xor	r14d,eax
++	add	r11d,r13d
++	xor	edi,ebx
++	ror	r14d,2
++	add	edx,r11d
++	add	r11d,edi
++	mov	r13d,edx
++	add	r14d,r11d
++	ror	r13d,14
++	mov	r11d,r14d
++	mov	r12d,r8d
++	ror	r14d,9
++	xor	r13d,edx
++	xor	r12d,r9d
++	ror	r13d,5
++	xor	r14d,r11d
++	and	r12d,edx
++	xor	r13d,edx
++	add	r10d,DWORD[36+rsp]
++	mov	edi,r11d
++	xor	r12d,r9d
++	ror	r14d,11
++	xor	edi,eax
++	add	r10d,r12d
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,r11d
++	add	r10d,r13d
++	xor	r15d,eax
++	ror	r14d,2
++	add	ecx,r10d
++	add	r10d,r15d
++	mov	r13d,ecx
++	add	r14d,r10d
++	ror	r13d,14
++	mov	r10d,r14d
++	mov	r12d,edx
++	ror	r14d,9
++	xor	r13d,ecx
++	xor	r12d,r8d
++	ror	r13d,5
++	xor	r14d,r10d
++	and	r12d,ecx
++	xor	r13d,ecx
++	add	r9d,DWORD[40+rsp]
++	mov	r15d,r10d
++	xor	r12d,r8d
++	ror	r14d,11
++	xor	r15d,r11d
++	add	r9d,r12d
++	ror	r13d,6
++	and	edi,r15d
++	xor	r14d,r10d
++	add	r9d,r13d
++	xor	edi,r11d
++	ror	r14d,2
++	add	ebx,r9d
++	add	r9d,edi
++	mov	r13d,ebx
++	add	r14d,r9d
++	ror	r13d,14
++	mov	r9d,r14d
++	mov	r12d,ecx
++	ror	r14d,9
++	xor	r13d,ebx
++	xor	r12d,edx
++	ror	r13d,5
++	xor	r14d,r9d
++	and	r12d,ebx
++	xor	r13d,ebx
++	add	r8d,DWORD[44+rsp]
++	mov	edi,r9d
++	xor	r12d,edx
++	ror	r14d,11
++	xor	edi,r10d
++	add	r8d,r12d
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,r9d
++	add	r8d,r13d
++	xor	r15d,r10d
++	ror	r14d,2
++	add	eax,r8d
++	add	r8d,r15d
++	mov	r13d,eax
++	add	r14d,r8d
++	ror	r13d,14
++	mov	r8d,r14d
++	mov	r12d,ebx
++	ror	r14d,9
++	xor	r13d,eax
++	xor	r12d,ecx
++	ror	r13d,5
++	xor	r14d,r8d
++	and	r12d,eax
++	xor	r13d,eax
++	add	edx,DWORD[48+rsp]
++	mov	r15d,r8d
++	xor	r12d,ecx
++	ror	r14d,11
++	xor	r15d,r9d
++	add	edx,r12d
++	ror	r13d,6
++	and	edi,r15d
++	xor	r14d,r8d
++	add	edx,r13d
++	xor	edi,r9d
++	ror	r14d,2
++	add	r11d,edx
++	add	edx,edi
++	mov	r13d,r11d
++	add	r14d,edx
++	ror	r13d,14
++	mov	edx,r14d
++	mov	r12d,eax
++	ror	r14d,9
++	xor	r13d,r11d
++	xor	r12d,ebx
++	ror	r13d,5
++	xor	r14d,edx
++	and	r12d,r11d
++	xor	r13d,r11d
++	add	ecx,DWORD[52+rsp]
++	mov	edi,edx
++	xor	r12d,ebx
++	ror	r14d,11
++	xor	edi,r8d
++	add	ecx,r12d
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,edx
++	add	ecx,r13d
++	xor	r15d,r8d
++	ror	r14d,2
++	add	r10d,ecx
++	add	ecx,r15d
++	mov	r13d,r10d
++	add	r14d,ecx
++	ror	r13d,14
++	mov	ecx,r14d
++	mov	r12d,r11d
++	ror	r14d,9
++	xor	r13d,r10d
++	xor	r12d,eax
++	ror	r13d,5
++	xor	r14d,ecx
++	and	r12d,r10d
++	xor	r13d,r10d
++	add	ebx,DWORD[56+rsp]
++	mov	r15d,ecx
++	xor	r12d,eax
++	ror	r14d,11
++	xor	r15d,edx
++	add	ebx,r12d
++	ror	r13d,6
++	and	edi,r15d
++	xor	r14d,ecx
++	add	ebx,r13d
++	xor	edi,edx
++	ror	r14d,2
++	add	r9d,ebx
++	add	ebx,edi
++	mov	r13d,r9d
++	add	r14d,ebx
++	ror	r13d,14
++	mov	ebx,r14d
++	mov	r12d,r10d
++	ror	r14d,9
++	xor	r13d,r9d
++	xor	r12d,r11d
++	ror	r13d,5
++	xor	r14d,ebx
++	and	r12d,r9d
++	xor	r13d,r9d
++	add	eax,DWORD[60+rsp]
++	mov	edi,ebx
++	xor	r12d,r11d
++	ror	r14d,11
++	xor	edi,ecx
++	add	eax,r12d
++	ror	r13d,6
++	and	r15d,edi
++	xor	r14d,ebx
++	add	eax,r13d
++	xor	r15d,ecx
++	ror	r14d,2
++	add	r8d,eax
++	add	eax,r15d
++	mov	r13d,r8d
++	add	r14d,eax
++	mov	rdi,QWORD[((64+0))+rsp]
++	mov	eax,r14d
++
++	add	eax,DWORD[rdi]
++	lea	rsi,[64+rsi]
++	add	ebx,DWORD[4+rdi]
++	add	ecx,DWORD[8+rdi]
++	add	edx,DWORD[12+rdi]
++	add	r8d,DWORD[16+rdi]
++	add	r9d,DWORD[20+rdi]
++	add	r10d,DWORD[24+rdi]
++	add	r11d,DWORD[28+rdi]
++
++	cmp	rsi,QWORD[((64+16))+rsp]
++
++	mov	DWORD[rdi],eax
++	mov	DWORD[4+rdi],ebx
++	mov	DWORD[8+rdi],ecx
++	mov	DWORD[12+rdi],edx
++	mov	DWORD[16+rdi],r8d
++	mov	DWORD[20+rdi],r9d
++	mov	DWORD[24+rdi],r10d
++	mov	DWORD[28+rdi],r11d
++	jb	NEAR $L$loop_ssse3
++
++	mov	rsi,QWORD[((64+24))+rsp]
++	movaps	xmm6,XMMWORD[((64+32))+rsp]
++	movaps	xmm7,XMMWORD[((64+48))+rsp]
++	movaps	xmm8,XMMWORD[((64+64))+rsp]
++	movaps	xmm9,XMMWORD[((64+80))+rsp]
++	mov	r15,QWORD[rsi]
++	mov	r14,QWORD[8+rsi]
++	mov	r13,QWORD[16+rsi]
++	mov	r12,QWORD[24+rsi]
++	mov	rbp,QWORD[32+rsi]
++	mov	rbx,QWORD[40+rsi]
++	lea	rsp,[48+rsi]
++$L$epilogue_ssse3:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha256_block_data_order_ssse3:
++
++ALIGN	64
++sha256_block_data_order_avx:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha256_block_data_order_avx:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++$L$avx_shortcut:
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	mov	r11,rsp
++	shl	rdx,4
++	sub	rsp,160
++	lea	rdx,[rdx*4+rsi]
++	and	rsp,-64
++	mov	QWORD[((64+0))+rsp],rdi
++	mov	QWORD[((64+8))+rsp],rsi
++	mov	QWORD[((64+16))+rsp],rdx
++	mov	QWORD[((64+24))+rsp],r11
++	movaps	XMMWORD[(64+32)+rsp],xmm6
++	movaps	XMMWORD[(64+48)+rsp],xmm7
++	movaps	XMMWORD[(64+64)+rsp],xmm8
++	movaps	XMMWORD[(64+80)+rsp],xmm9
++$L$prologue_avx:
++
++	vzeroupper
++	mov	eax,DWORD[rdi]
++	mov	ebx,DWORD[4+rdi]
++	mov	ecx,DWORD[8+rdi]
++	mov	edx,DWORD[12+rdi]
++	mov	r8d,DWORD[16+rdi]
++	mov	r9d,DWORD[20+rdi]
++	mov	r10d,DWORD[24+rdi]
++	mov	r11d,DWORD[28+rdi]
++	vmovdqa	xmm8,XMMWORD[((K256+512+32))]
++	vmovdqa	xmm9,XMMWORD[((K256+512+64))]
++	jmp	NEAR $L$loop_avx
++ALIGN	16
++$L$loop_avx:
++	vmovdqa	xmm7,XMMWORD[((K256+512))]
++	vmovdqu	xmm0,XMMWORD[rsi]
++	vmovdqu	xmm1,XMMWORD[16+rsi]
++	vmovdqu	xmm2,XMMWORD[32+rsi]
++	vmovdqu	xmm3,XMMWORD[48+rsi]
++	vpshufb	xmm0,xmm0,xmm7
++	lea	rbp,[K256]
++	vpshufb	xmm1,xmm1,xmm7
++	vpshufb	xmm2,xmm2,xmm7
++	vpaddd	xmm4,xmm0,XMMWORD[rbp]
++	vpshufb	xmm3,xmm3,xmm7
++	vpaddd	xmm5,xmm1,XMMWORD[32+rbp]
++	vpaddd	xmm6,xmm2,XMMWORD[64+rbp]
++	vpaddd	xmm7,xmm3,XMMWORD[96+rbp]
++	vmovdqa	XMMWORD[rsp],xmm4
++	mov	r14d,eax
++	vmovdqa	XMMWORD[16+rsp],xmm5
++	mov	edi,ebx
++	vmovdqa	XMMWORD[32+rsp],xmm6
++	xor	edi,ecx
++	vmovdqa	XMMWORD[48+rsp],xmm7
++	mov	r13d,r8d
++	jmp	NEAR $L$avx_00_47
++
++ALIGN	16
++$L$avx_00_47:
++	sub	rbp,-128
++	vpalignr	xmm4,xmm1,xmm0,4
++	shrd	r13d,r13d,14
++	mov	eax,r14d
++	mov	r12d,r9d
++	vpalignr	xmm7,xmm3,xmm2,4
++	shrd	r14d,r14d,9
++	xor	r13d,r8d
++	xor	r12d,r10d
++	vpsrld	xmm6,xmm4,7
++	shrd	r13d,r13d,5
++	xor	r14d,eax
++	and	r12d,r8d
++	vpaddd	xmm0,xmm0,xmm7
++	xor	r13d,r8d
++	add	r11d,DWORD[rsp]
++	mov	r15d,eax
++	vpsrld	xmm7,xmm4,3
++	xor	r12d,r10d
++	shrd	r14d,r14d,11
++	xor	r15d,ebx
++	vpslld	xmm5,xmm4,14
++	add	r11d,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	vpxor	xmm4,xmm7,xmm6
++	xor	r14d,eax
++	add	r11d,r13d
++	xor	edi,ebx
++	vpshufd	xmm7,xmm3,250
++	shrd	r14d,r14d,2
++	add	edx,r11d
++	add	r11d,edi
++	vpsrld	xmm6,xmm6,11
++	mov	r13d,edx
++	add	r14d,r11d
++	shrd	r13d,r13d,14
++	vpxor	xmm4,xmm4,xmm5
++	mov	r11d,r14d
++	mov	r12d,r8d
++	shrd	r14d,r14d,9
++	vpslld	xmm5,xmm5,11
++	xor	r13d,edx
++	xor	r12d,r9d
++	shrd	r13d,r13d,5
++	vpxor	xmm4,xmm4,xmm6
++	xor	r14d,r11d
++	and	r12d,edx
++	xor	r13d,edx
++	vpsrld	xmm6,xmm7,10
++	add	r10d,DWORD[4+rsp]
++	mov	edi,r11d
++	xor	r12d,r9d
++	vpxor	xmm4,xmm4,xmm5
++	shrd	r14d,r14d,11
++	xor	edi,eax
++	add	r10d,r12d
++	vpsrlq	xmm7,xmm7,17
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,r11d
++	vpaddd	xmm0,xmm0,xmm4
++	add	r10d,r13d
++	xor	r15d,eax
++	shrd	r14d,r14d,2
++	vpxor	xmm6,xmm6,xmm7
++	add	ecx,r10d
++	add	r10d,r15d
++	mov	r13d,ecx
++	vpsrlq	xmm7,xmm7,2
++	add	r14d,r10d
++	shrd	r13d,r13d,14
++	mov	r10d,r14d
++	vpxor	xmm6,xmm6,xmm7
++	mov	r12d,edx
++	shrd	r14d,r14d,9
++	xor	r13d,ecx
++	vpshufb	xmm6,xmm6,xmm8
++	xor	r12d,r8d
++	shrd	r13d,r13d,5
++	xor	r14d,r10d
++	vpaddd	xmm0,xmm0,xmm6
++	and	r12d,ecx
++	xor	r13d,ecx
++	add	r9d,DWORD[8+rsp]
++	vpshufd	xmm7,xmm0,80
++	mov	r15d,r10d
++	xor	r12d,r8d
++	shrd	r14d,r14d,11
++	vpsrld	xmm6,xmm7,10
++	xor	r15d,r11d
++	add	r9d,r12d
++	shrd	r13d,r13d,6
++	vpsrlq	xmm7,xmm7,17
++	and	edi,r15d
++	xor	r14d,r10d
++	add	r9d,r13d
++	vpxor	xmm6,xmm6,xmm7
++	xor	edi,r11d
++	shrd	r14d,r14d,2
++	add	ebx,r9d
++	vpsrlq	xmm7,xmm7,2
++	add	r9d,edi
++	mov	r13d,ebx
++	add	r14d,r9d
++	vpxor	xmm6,xmm6,xmm7
++	shrd	r13d,r13d,14
++	mov	r9d,r14d
++	mov	r12d,ecx
++	vpshufb	xmm6,xmm6,xmm9
++	shrd	r14d,r14d,9
++	xor	r13d,ebx
++	xor	r12d,edx
++	vpaddd	xmm0,xmm0,xmm6
++	shrd	r13d,r13d,5
++	xor	r14d,r9d
++	and	r12d,ebx
++	vpaddd	xmm6,xmm0,XMMWORD[rbp]
++	xor	r13d,ebx
++	add	r8d,DWORD[12+rsp]
++	mov	edi,r9d
++	xor	r12d,edx
++	shrd	r14d,r14d,11
++	xor	edi,r10d
++	add	r8d,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,r9d
++	add	r8d,r13d
++	xor	r15d,r10d
++	shrd	r14d,r14d,2
++	add	eax,r8d
++	add	r8d,r15d
++	mov	r13d,eax
++	add	r14d,r8d
++	vmovdqa	XMMWORD[rsp],xmm6
++	vpalignr	xmm4,xmm2,xmm1,4
++	shrd	r13d,r13d,14
++	mov	r8d,r14d
++	mov	r12d,ebx
++	vpalignr	xmm7,xmm0,xmm3,4
++	shrd	r14d,r14d,9
++	xor	r13d,eax
++	xor	r12d,ecx
++	vpsrld	xmm6,xmm4,7
++	shrd	r13d,r13d,5
++	xor	r14d,r8d
++	and	r12d,eax
++	vpaddd	xmm1,xmm1,xmm7
++	xor	r13d,eax
++	add	edx,DWORD[16+rsp]
++	mov	r15d,r8d
++	vpsrld	xmm7,xmm4,3
++	xor	r12d,ecx
++	shrd	r14d,r14d,11
++	xor	r15d,r9d
++	vpslld	xmm5,xmm4,14
++	add	edx,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	vpxor	xmm4,xmm7,xmm6
++	xor	r14d,r8d
++	add	edx,r13d
++	xor	edi,r9d
++	vpshufd	xmm7,xmm0,250
++	shrd	r14d,r14d,2
++	add	r11d,edx
++	add	edx,edi
++	vpsrld	xmm6,xmm6,11
++	mov	r13d,r11d
++	add	r14d,edx
++	shrd	r13d,r13d,14
++	vpxor	xmm4,xmm4,xmm5
++	mov	edx,r14d
++	mov	r12d,eax
++	shrd	r14d,r14d,9
++	vpslld	xmm5,xmm5,11
++	xor	r13d,r11d
++	xor	r12d,ebx
++	shrd	r13d,r13d,5
++	vpxor	xmm4,xmm4,xmm6
++	xor	r14d,edx
++	and	r12d,r11d
++	xor	r13d,r11d
++	vpsrld	xmm6,xmm7,10
++	add	ecx,DWORD[20+rsp]
++	mov	edi,edx
++	xor	r12d,ebx
++	vpxor	xmm4,xmm4,xmm5
++	shrd	r14d,r14d,11
++	xor	edi,r8d
++	add	ecx,r12d
++	vpsrlq	xmm7,xmm7,17
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,edx
++	vpaddd	xmm1,xmm1,xmm4
++	add	ecx,r13d
++	xor	r15d,r8d
++	shrd	r14d,r14d,2
++	vpxor	xmm6,xmm6,xmm7
++	add	r10d,ecx
++	add	ecx,r15d
++	mov	r13d,r10d
++	vpsrlq	xmm7,xmm7,2
++	add	r14d,ecx
++	shrd	r13d,r13d,14
++	mov	ecx,r14d
++	vpxor	xmm6,xmm6,xmm7
++	mov	r12d,r11d
++	shrd	r14d,r14d,9
++	xor	r13d,r10d
++	vpshufb	xmm6,xmm6,xmm8
++	xor	r12d,eax
++	shrd	r13d,r13d,5
++	xor	r14d,ecx
++	vpaddd	xmm1,xmm1,xmm6
++	and	r12d,r10d
++	xor	r13d,r10d
++	add	ebx,DWORD[24+rsp]
++	vpshufd	xmm7,xmm1,80
++	mov	r15d,ecx
++	xor	r12d,eax
++	shrd	r14d,r14d,11
++	vpsrld	xmm6,xmm7,10
++	xor	r15d,edx
++	add	ebx,r12d
++	shrd	r13d,r13d,6
++	vpsrlq	xmm7,xmm7,17
++	and	edi,r15d
++	xor	r14d,ecx
++	add	ebx,r13d
++	vpxor	xmm6,xmm6,xmm7
++	xor	edi,edx
++	shrd	r14d,r14d,2
++	add	r9d,ebx
++	vpsrlq	xmm7,xmm7,2
++	add	ebx,edi
++	mov	r13d,r9d
++	add	r14d,ebx
++	vpxor	xmm6,xmm6,xmm7
++	shrd	r13d,r13d,14
++	mov	ebx,r14d
++	mov	r12d,r10d
++	vpshufb	xmm6,xmm6,xmm9
++	shrd	r14d,r14d,9
++	xor	r13d,r9d
++	xor	r12d,r11d
++	vpaddd	xmm1,xmm1,xmm6
++	shrd	r13d,r13d,5
++	xor	r14d,ebx
++	and	r12d,r9d
++	vpaddd	xmm6,xmm1,XMMWORD[32+rbp]
++	xor	r13d,r9d
++	add	eax,DWORD[28+rsp]
++	mov	edi,ebx
++	xor	r12d,r11d
++	shrd	r14d,r14d,11
++	xor	edi,ecx
++	add	eax,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,ebx
++	add	eax,r13d
++	xor	r15d,ecx
++	shrd	r14d,r14d,2
++	add	r8d,eax
++	add	eax,r15d
++	mov	r13d,r8d
++	add	r14d,eax
++	vmovdqa	XMMWORD[16+rsp],xmm6
++	vpalignr	xmm4,xmm3,xmm2,4
++	shrd	r13d,r13d,14
++	mov	eax,r14d
++	mov	r12d,r9d
++	vpalignr	xmm7,xmm1,xmm0,4
++	shrd	r14d,r14d,9
++	xor	r13d,r8d
++	xor	r12d,r10d
++	vpsrld	xmm6,xmm4,7
++	shrd	r13d,r13d,5
++	xor	r14d,eax
++	and	r12d,r8d
++	vpaddd	xmm2,xmm2,xmm7
++	xor	r13d,r8d
++	add	r11d,DWORD[32+rsp]
++	mov	r15d,eax
++	vpsrld	xmm7,xmm4,3
++	xor	r12d,r10d
++	shrd	r14d,r14d,11
++	xor	r15d,ebx
++	vpslld	xmm5,xmm4,14
++	add	r11d,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	vpxor	xmm4,xmm7,xmm6
++	xor	r14d,eax
++	add	r11d,r13d
++	xor	edi,ebx
++	vpshufd	xmm7,xmm1,250
++	shrd	r14d,r14d,2
++	add	edx,r11d
++	add	r11d,edi
++	vpsrld	xmm6,xmm6,11
++	mov	r13d,edx
++	add	r14d,r11d
++	shrd	r13d,r13d,14
++	vpxor	xmm4,xmm4,xmm5
++	mov	r11d,r14d
++	mov	r12d,r8d
++	shrd	r14d,r14d,9
++	vpslld	xmm5,xmm5,11
++	xor	r13d,edx
++	xor	r12d,r9d
++	shrd	r13d,r13d,5
++	vpxor	xmm4,xmm4,xmm6
++	xor	r14d,r11d
++	and	r12d,edx
++	xor	r13d,edx
++	vpsrld	xmm6,xmm7,10
++	add	r10d,DWORD[36+rsp]
++	mov	edi,r11d
++	xor	r12d,r9d
++	vpxor	xmm4,xmm4,xmm5
++	shrd	r14d,r14d,11
++	xor	edi,eax
++	add	r10d,r12d
++	vpsrlq	xmm7,xmm7,17
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,r11d
++	vpaddd	xmm2,xmm2,xmm4
++	add	r10d,r13d
++	xor	r15d,eax
++	shrd	r14d,r14d,2
++	vpxor	xmm6,xmm6,xmm7
++	add	ecx,r10d
++	add	r10d,r15d
++	mov	r13d,ecx
++	vpsrlq	xmm7,xmm7,2
++	add	r14d,r10d
++	shrd	r13d,r13d,14
++	mov	r10d,r14d
++	vpxor	xmm6,xmm6,xmm7
++	mov	r12d,edx
++	shrd	r14d,r14d,9
++	xor	r13d,ecx
++	vpshufb	xmm6,xmm6,xmm8
++	xor	r12d,r8d
++	shrd	r13d,r13d,5
++	xor	r14d,r10d
++	vpaddd	xmm2,xmm2,xmm6
++	and	r12d,ecx
++	xor	r13d,ecx
++	add	r9d,DWORD[40+rsp]
++	vpshufd	xmm7,xmm2,80
++	mov	r15d,r10d
++	xor	r12d,r8d
++	shrd	r14d,r14d,11
++	vpsrld	xmm6,xmm7,10
++	xor	r15d,r11d
++	add	r9d,r12d
++	shrd	r13d,r13d,6
++	vpsrlq	xmm7,xmm7,17
++	and	edi,r15d
++	xor	r14d,r10d
++	add	r9d,r13d
++	vpxor	xmm6,xmm6,xmm7
++	xor	edi,r11d
++	shrd	r14d,r14d,2
++	add	ebx,r9d
++	vpsrlq	xmm7,xmm7,2
++	add	r9d,edi
++	mov	r13d,ebx
++	add	r14d,r9d
++	vpxor	xmm6,xmm6,xmm7
++	shrd	r13d,r13d,14
++	mov	r9d,r14d
++	mov	r12d,ecx
++	vpshufb	xmm6,xmm6,xmm9
++	shrd	r14d,r14d,9
++	xor	r13d,ebx
++	xor	r12d,edx
++	vpaddd	xmm2,xmm2,xmm6
++	shrd	r13d,r13d,5
++	xor	r14d,r9d
++	and	r12d,ebx
++	vpaddd	xmm6,xmm2,XMMWORD[64+rbp]
++	xor	r13d,ebx
++	add	r8d,DWORD[44+rsp]
++	mov	edi,r9d
++	xor	r12d,edx
++	shrd	r14d,r14d,11
++	xor	edi,r10d
++	add	r8d,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,r9d
++	add	r8d,r13d
++	xor	r15d,r10d
++	shrd	r14d,r14d,2
++	add	eax,r8d
++	add	r8d,r15d
++	mov	r13d,eax
++	add	r14d,r8d
++	vmovdqa	XMMWORD[32+rsp],xmm6
++	vpalignr	xmm4,xmm0,xmm3,4
++	shrd	r13d,r13d,14
++	mov	r8d,r14d
++	mov	r12d,ebx
++	vpalignr	xmm7,xmm2,xmm1,4
++	shrd	r14d,r14d,9
++	xor	r13d,eax
++	xor	r12d,ecx
++	vpsrld	xmm6,xmm4,7
++	shrd	r13d,r13d,5
++	xor	r14d,r8d
++	and	r12d,eax
++	vpaddd	xmm3,xmm3,xmm7
++	xor	r13d,eax
++	add	edx,DWORD[48+rsp]
++	mov	r15d,r8d
++	vpsrld	xmm7,xmm4,3
++	xor	r12d,ecx
++	shrd	r14d,r14d,11
++	xor	r15d,r9d
++	vpslld	xmm5,xmm4,14
++	add	edx,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	vpxor	xmm4,xmm7,xmm6
++	xor	r14d,r8d
++	add	edx,r13d
++	xor	edi,r9d
++	vpshufd	xmm7,xmm2,250
++	shrd	r14d,r14d,2
++	add	r11d,edx
++	add	edx,edi
++	vpsrld	xmm6,xmm6,11
++	mov	r13d,r11d
++	add	r14d,edx
++	shrd	r13d,r13d,14
++	vpxor	xmm4,xmm4,xmm5
++	mov	edx,r14d
++	mov	r12d,eax
++	shrd	r14d,r14d,9
++	vpslld	xmm5,xmm5,11
++	xor	r13d,r11d
++	xor	r12d,ebx
++	shrd	r13d,r13d,5
++	vpxor	xmm4,xmm4,xmm6
++	xor	r14d,edx
++	and	r12d,r11d
++	xor	r13d,r11d
++	vpsrld	xmm6,xmm7,10
++	add	ecx,DWORD[52+rsp]
++	mov	edi,edx
++	xor	r12d,ebx
++	vpxor	xmm4,xmm4,xmm5
++	shrd	r14d,r14d,11
++	xor	edi,r8d
++	add	ecx,r12d
++	vpsrlq	xmm7,xmm7,17
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,edx
++	vpaddd	xmm3,xmm3,xmm4
++	add	ecx,r13d
++	xor	r15d,r8d
++	shrd	r14d,r14d,2
++	vpxor	xmm6,xmm6,xmm7
++	add	r10d,ecx
++	add	ecx,r15d
++	mov	r13d,r10d
++	vpsrlq	xmm7,xmm7,2
++	add	r14d,ecx
++	shrd	r13d,r13d,14
++	mov	ecx,r14d
++	vpxor	xmm6,xmm6,xmm7
++	mov	r12d,r11d
++	shrd	r14d,r14d,9
++	xor	r13d,r10d
++	vpshufb	xmm6,xmm6,xmm8
++	xor	r12d,eax
++	shrd	r13d,r13d,5
++	xor	r14d,ecx
++	vpaddd	xmm3,xmm3,xmm6
++	and	r12d,r10d
++	xor	r13d,r10d
++	add	ebx,DWORD[56+rsp]
++	vpshufd	xmm7,xmm3,80
++	mov	r15d,ecx
++	xor	r12d,eax
++	shrd	r14d,r14d,11
++	vpsrld	xmm6,xmm7,10
++	xor	r15d,edx
++	add	ebx,r12d
++	shrd	r13d,r13d,6
++	vpsrlq	xmm7,xmm7,17
++	and	edi,r15d
++	xor	r14d,ecx
++	add	ebx,r13d
++	vpxor	xmm6,xmm6,xmm7
++	xor	edi,edx
++	shrd	r14d,r14d,2
++	add	r9d,ebx
++	vpsrlq	xmm7,xmm7,2
++	add	ebx,edi
++	mov	r13d,r9d
++	add	r14d,ebx
++	vpxor	xmm6,xmm6,xmm7
++	shrd	r13d,r13d,14
++	mov	ebx,r14d
++	mov	r12d,r10d
++	vpshufb	xmm6,xmm6,xmm9
++	shrd	r14d,r14d,9
++	xor	r13d,r9d
++	xor	r12d,r11d
++	vpaddd	xmm3,xmm3,xmm6
++	shrd	r13d,r13d,5
++	xor	r14d,ebx
++	and	r12d,r9d
++	vpaddd	xmm6,xmm3,XMMWORD[96+rbp]
++	xor	r13d,r9d
++	add	eax,DWORD[60+rsp]
++	mov	edi,ebx
++	xor	r12d,r11d
++	shrd	r14d,r14d,11
++	xor	edi,ecx
++	add	eax,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,ebx
++	add	eax,r13d
++	xor	r15d,ecx
++	shrd	r14d,r14d,2
++	add	r8d,eax
++	add	eax,r15d
++	mov	r13d,r8d
++	add	r14d,eax
++	vmovdqa	XMMWORD[48+rsp],xmm6
++	cmp	BYTE[131+rbp],0
++	jne	NEAR $L$avx_00_47
++	shrd	r13d,r13d,14
++	mov	eax,r14d
++	mov	r12d,r9d
++	shrd	r14d,r14d,9
++	xor	r13d,r8d
++	xor	r12d,r10d
++	shrd	r13d,r13d,5
++	xor	r14d,eax
++	and	r12d,r8d
++	xor	r13d,r8d
++	add	r11d,DWORD[rsp]
++	mov	r15d,eax
++	xor	r12d,r10d
++	shrd	r14d,r14d,11
++	xor	r15d,ebx
++	add	r11d,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	xor	r14d,eax
++	add	r11d,r13d
++	xor	edi,ebx
++	shrd	r14d,r14d,2
++	add	edx,r11d
++	add	r11d,edi
++	mov	r13d,edx
++	add	r14d,r11d
++	shrd	r13d,r13d,14
++	mov	r11d,r14d
++	mov	r12d,r8d
++	shrd	r14d,r14d,9
++	xor	r13d,edx
++	xor	r12d,r9d
++	shrd	r13d,r13d,5
++	xor	r14d,r11d
++	and	r12d,edx
++	xor	r13d,edx
++	add	r10d,DWORD[4+rsp]
++	mov	edi,r11d
++	xor	r12d,r9d
++	shrd	r14d,r14d,11
++	xor	edi,eax
++	add	r10d,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,r11d
++	add	r10d,r13d
++	xor	r15d,eax
++	shrd	r14d,r14d,2
++	add	ecx,r10d
++	add	r10d,r15d
++	mov	r13d,ecx
++	add	r14d,r10d
++	shrd	r13d,r13d,14
++	mov	r10d,r14d
++	mov	r12d,edx
++	shrd	r14d,r14d,9
++	xor	r13d,ecx
++	xor	r12d,r8d
++	shrd	r13d,r13d,5
++	xor	r14d,r10d
++	and	r12d,ecx
++	xor	r13d,ecx
++	add	r9d,DWORD[8+rsp]
++	mov	r15d,r10d
++	xor	r12d,r8d
++	shrd	r14d,r14d,11
++	xor	r15d,r11d
++	add	r9d,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	xor	r14d,r10d
++	add	r9d,r13d
++	xor	edi,r11d
++	shrd	r14d,r14d,2
++	add	ebx,r9d
++	add	r9d,edi
++	mov	r13d,ebx
++	add	r14d,r9d
++	shrd	r13d,r13d,14
++	mov	r9d,r14d
++	mov	r12d,ecx
++	shrd	r14d,r14d,9
++	xor	r13d,ebx
++	xor	r12d,edx
++	shrd	r13d,r13d,5
++	xor	r14d,r9d
++	and	r12d,ebx
++	xor	r13d,ebx
++	add	r8d,DWORD[12+rsp]
++	mov	edi,r9d
++	xor	r12d,edx
++	shrd	r14d,r14d,11
++	xor	edi,r10d
++	add	r8d,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,r9d
++	add	r8d,r13d
++	xor	r15d,r10d
++	shrd	r14d,r14d,2
++	add	eax,r8d
++	add	r8d,r15d
++	mov	r13d,eax
++	add	r14d,r8d
++	shrd	r13d,r13d,14
++	mov	r8d,r14d
++	mov	r12d,ebx
++	shrd	r14d,r14d,9
++	xor	r13d,eax
++	xor	r12d,ecx
++	shrd	r13d,r13d,5
++	xor	r14d,r8d
++	and	r12d,eax
++	xor	r13d,eax
++	add	edx,DWORD[16+rsp]
++	mov	r15d,r8d
++	xor	r12d,ecx
++	shrd	r14d,r14d,11
++	xor	r15d,r9d
++	add	edx,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	xor	r14d,r8d
++	add	edx,r13d
++	xor	edi,r9d
++	shrd	r14d,r14d,2
++	add	r11d,edx
++	add	edx,edi
++	mov	r13d,r11d
++	add	r14d,edx
++	shrd	r13d,r13d,14
++	mov	edx,r14d
++	mov	r12d,eax
++	shrd	r14d,r14d,9
++	xor	r13d,r11d
++	xor	r12d,ebx
++	shrd	r13d,r13d,5
++	xor	r14d,edx
++	and	r12d,r11d
++	xor	r13d,r11d
++	add	ecx,DWORD[20+rsp]
++	mov	edi,edx
++	xor	r12d,ebx
++	shrd	r14d,r14d,11
++	xor	edi,r8d
++	add	ecx,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,edx
++	add	ecx,r13d
++	xor	r15d,r8d
++	shrd	r14d,r14d,2
++	add	r10d,ecx
++	add	ecx,r15d
++	mov	r13d,r10d
++	add	r14d,ecx
++	shrd	r13d,r13d,14
++	mov	ecx,r14d
++	mov	r12d,r11d
++	shrd	r14d,r14d,9
++	xor	r13d,r10d
++	xor	r12d,eax
++	shrd	r13d,r13d,5
++	xor	r14d,ecx
++	and	r12d,r10d
++	xor	r13d,r10d
++	add	ebx,DWORD[24+rsp]
++	mov	r15d,ecx
++	xor	r12d,eax
++	shrd	r14d,r14d,11
++	xor	r15d,edx
++	add	ebx,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	xor	r14d,ecx
++	add	ebx,r13d
++	xor	edi,edx
++	shrd	r14d,r14d,2
++	add	r9d,ebx
++	add	ebx,edi
++	mov	r13d,r9d
++	add	r14d,ebx
++	shrd	r13d,r13d,14
++	mov	ebx,r14d
++	mov	r12d,r10d
++	shrd	r14d,r14d,9
++	xor	r13d,r9d
++	xor	r12d,r11d
++	shrd	r13d,r13d,5
++	xor	r14d,ebx
++	and	r12d,r9d
++	xor	r13d,r9d
++	add	eax,DWORD[28+rsp]
++	mov	edi,ebx
++	xor	r12d,r11d
++	shrd	r14d,r14d,11
++	xor	edi,ecx
++	add	eax,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,ebx
++	add	eax,r13d
++	xor	r15d,ecx
++	shrd	r14d,r14d,2
++	add	r8d,eax
++	add	eax,r15d
++	mov	r13d,r8d
++	add	r14d,eax
++	shrd	r13d,r13d,14
++	mov	eax,r14d
++	mov	r12d,r9d
++	shrd	r14d,r14d,9
++	xor	r13d,r8d
++	xor	r12d,r10d
++	shrd	r13d,r13d,5
++	xor	r14d,eax
++	and	r12d,r8d
++	xor	r13d,r8d
++	add	r11d,DWORD[32+rsp]
++	mov	r15d,eax
++	xor	r12d,r10d
++	shrd	r14d,r14d,11
++	xor	r15d,ebx
++	add	r11d,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	xor	r14d,eax
++	add	r11d,r13d
++	xor	edi,ebx
++	shrd	r14d,r14d,2
++	add	edx,r11d
++	add	r11d,edi
++	mov	r13d,edx
++	add	r14d,r11d
++	shrd	r13d,r13d,14
++	mov	r11d,r14d
++	mov	r12d,r8d
++	shrd	r14d,r14d,9
++	xor	r13d,edx
++	xor	r12d,r9d
++	shrd	r13d,r13d,5
++	xor	r14d,r11d
++	and	r12d,edx
++	xor	r13d,edx
++	add	r10d,DWORD[36+rsp]
++	mov	edi,r11d
++	xor	r12d,r9d
++	shrd	r14d,r14d,11
++	xor	edi,eax
++	add	r10d,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,r11d
++	add	r10d,r13d
++	xor	r15d,eax
++	shrd	r14d,r14d,2
++	add	ecx,r10d
++	add	r10d,r15d
++	mov	r13d,ecx
++	add	r14d,r10d
++	shrd	r13d,r13d,14
++	mov	r10d,r14d
++	mov	r12d,edx
++	shrd	r14d,r14d,9
++	xor	r13d,ecx
++	xor	r12d,r8d
++	shrd	r13d,r13d,5
++	xor	r14d,r10d
++	and	r12d,ecx
++	xor	r13d,ecx
++	add	r9d,DWORD[40+rsp]
++	mov	r15d,r10d
++	xor	r12d,r8d
++	shrd	r14d,r14d,11
++	xor	r15d,r11d
++	add	r9d,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	xor	r14d,r10d
++	add	r9d,r13d
++	xor	edi,r11d
++	shrd	r14d,r14d,2
++	add	ebx,r9d
++	add	r9d,edi
++	mov	r13d,ebx
++	add	r14d,r9d
++	shrd	r13d,r13d,14
++	mov	r9d,r14d
++	mov	r12d,ecx
++	shrd	r14d,r14d,9
++	xor	r13d,ebx
++	xor	r12d,edx
++	shrd	r13d,r13d,5
++	xor	r14d,r9d
++	and	r12d,ebx
++	xor	r13d,ebx
++	add	r8d,DWORD[44+rsp]
++	mov	edi,r9d
++	xor	r12d,edx
++	shrd	r14d,r14d,11
++	xor	edi,r10d
++	add	r8d,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,r9d
++	add	r8d,r13d
++	xor	r15d,r10d
++	shrd	r14d,r14d,2
++	add	eax,r8d
++	add	r8d,r15d
++	mov	r13d,eax
++	add	r14d,r8d
++	shrd	r13d,r13d,14
++	mov	r8d,r14d
++	mov	r12d,ebx
++	shrd	r14d,r14d,9
++	xor	r13d,eax
++	xor	r12d,ecx
++	shrd	r13d,r13d,5
++	xor	r14d,r8d
++	and	r12d,eax
++	xor	r13d,eax
++	add	edx,DWORD[48+rsp]
++	mov	r15d,r8d
++	xor	r12d,ecx
++	shrd	r14d,r14d,11
++	xor	r15d,r9d
++	add	edx,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	xor	r14d,r8d
++	add	edx,r13d
++	xor	edi,r9d
++	shrd	r14d,r14d,2
++	add	r11d,edx
++	add	edx,edi
++	mov	r13d,r11d
++	add	r14d,edx
++	shrd	r13d,r13d,14
++	mov	edx,r14d
++	mov	r12d,eax
++	shrd	r14d,r14d,9
++	xor	r13d,r11d
++	xor	r12d,ebx
++	shrd	r13d,r13d,5
++	xor	r14d,edx
++	and	r12d,r11d
++	xor	r13d,r11d
++	add	ecx,DWORD[52+rsp]
++	mov	edi,edx
++	xor	r12d,ebx
++	shrd	r14d,r14d,11
++	xor	edi,r8d
++	add	ecx,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,edx
++	add	ecx,r13d
++	xor	r15d,r8d
++	shrd	r14d,r14d,2
++	add	r10d,ecx
++	add	ecx,r15d
++	mov	r13d,r10d
++	add	r14d,ecx
++	shrd	r13d,r13d,14
++	mov	ecx,r14d
++	mov	r12d,r11d
++	shrd	r14d,r14d,9
++	xor	r13d,r10d
++	xor	r12d,eax
++	shrd	r13d,r13d,5
++	xor	r14d,ecx
++	and	r12d,r10d
++	xor	r13d,r10d
++	add	ebx,DWORD[56+rsp]
++	mov	r15d,ecx
++	xor	r12d,eax
++	shrd	r14d,r14d,11
++	xor	r15d,edx
++	add	ebx,r12d
++	shrd	r13d,r13d,6
++	and	edi,r15d
++	xor	r14d,ecx
++	add	ebx,r13d
++	xor	edi,edx
++	shrd	r14d,r14d,2
++	add	r9d,ebx
++	add	ebx,edi
++	mov	r13d,r9d
++	add	r14d,ebx
++	shrd	r13d,r13d,14
++	mov	ebx,r14d
++	mov	r12d,r10d
++	shrd	r14d,r14d,9
++	xor	r13d,r9d
++	xor	r12d,r11d
++	shrd	r13d,r13d,5
++	xor	r14d,ebx
++	and	r12d,r9d
++	xor	r13d,r9d
++	add	eax,DWORD[60+rsp]
++	mov	edi,ebx
++	xor	r12d,r11d
++	shrd	r14d,r14d,11
++	xor	edi,ecx
++	add	eax,r12d
++	shrd	r13d,r13d,6
++	and	r15d,edi
++	xor	r14d,ebx
++	add	eax,r13d
++	xor	r15d,ecx
++	shrd	r14d,r14d,2
++	add	r8d,eax
++	add	eax,r15d
++	mov	r13d,r8d
++	add	r14d,eax
++	mov	rdi,QWORD[((64+0))+rsp]
++	mov	eax,r14d
++
++	add	eax,DWORD[rdi]
++	lea	rsi,[64+rsi]
++	add	ebx,DWORD[4+rdi]
++	add	ecx,DWORD[8+rdi]
++	add	edx,DWORD[12+rdi]
++	add	r8d,DWORD[16+rdi]
++	add	r9d,DWORD[20+rdi]
++	add	r10d,DWORD[24+rdi]
++	add	r11d,DWORD[28+rdi]
++
++	cmp	rsi,QWORD[((64+16))+rsp]
++
++	mov	DWORD[rdi],eax
++	mov	DWORD[4+rdi],ebx
++	mov	DWORD[8+rdi],ecx
++	mov	DWORD[12+rdi],edx
++	mov	DWORD[16+rdi],r8d
++	mov	DWORD[20+rdi],r9d
++	mov	DWORD[24+rdi],r10d
++	mov	DWORD[28+rdi],r11d
++	jb	NEAR $L$loop_avx
++
++	mov	rsi,QWORD[((64+24))+rsp]
++	vzeroupper
++	movaps	xmm6,XMMWORD[((64+32))+rsp]
++	movaps	xmm7,XMMWORD[((64+48))+rsp]
++	movaps	xmm8,XMMWORD[((64+64))+rsp]
++	movaps	xmm9,XMMWORD[((64+80))+rsp]
++	mov	r15,QWORD[rsi]
++	mov	r14,QWORD[8+rsi]
++	mov	r13,QWORD[16+rsi]
++	mov	r12,QWORD[24+rsi]
++	mov	rbp,QWORD[32+rsi]
++	mov	rbx,QWORD[40+rsi]
++	lea	rsp,[48+rsi]
++$L$epilogue_avx:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha256_block_data_order_avx:
++
++ALIGN	64
++sha256_block_data_order_avx2:
++	mov	QWORD[8+rsp],rdi	;WIN64 prologue
++	mov	QWORD[16+rsp],rsi
++	mov	rax,rsp
++$L$SEH_begin_sha256_block_data_order_avx2:
++	mov	rdi,rcx
++	mov	rsi,rdx
++	mov	rdx,r8
++
++
++$L$avx2_shortcut:
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	mov	r11,rsp
++	sub	rsp,608
++	shl	rdx,4
++	and	rsp,-256*4
++	lea	rdx,[rdx*4+rsi]
++	add	rsp,448
++	mov	QWORD[((64+0))+rsp],rdi
++	mov	QWORD[((64+8))+rsp],rsi
++	mov	QWORD[((64+16))+rsp],rdx
++	mov	QWORD[((64+24))+rsp],r11
++	movaps	XMMWORD[(64+32)+rsp],xmm6
++	movaps	XMMWORD[(64+48)+rsp],xmm7
++	movaps	XMMWORD[(64+64)+rsp],xmm8
++	movaps	XMMWORD[(64+80)+rsp],xmm9
++$L$prologue_avx2:
++
++	vzeroupper
++	sub	rsi,-16*4
++	mov	eax,DWORD[rdi]
++	mov	r12,rsi
++	mov	ebx,DWORD[4+rdi]
++	cmp	rsi,rdx
++	mov	ecx,DWORD[8+rdi]
++	cmove	r12,rsp
++	mov	edx,DWORD[12+rdi]
++	mov	r8d,DWORD[16+rdi]
++	mov	r9d,DWORD[20+rdi]
++	mov	r10d,DWORD[24+rdi]
++	mov	r11d,DWORD[28+rdi]
++	vmovdqa	ymm8,YMMWORD[((K256+512+32))]
++	vmovdqa	ymm9,YMMWORD[((K256+512+64))]
++	jmp	NEAR $L$oop_avx2
++ALIGN	16
++$L$oop_avx2:
++	vmovdqa	ymm7,YMMWORD[((K256+512))]
++	vmovdqu	xmm0,XMMWORD[((-64+0))+rsi]
++	vmovdqu	xmm1,XMMWORD[((-64+16))+rsi]
++	vmovdqu	xmm2,XMMWORD[((-64+32))+rsi]
++	vmovdqu	xmm3,XMMWORD[((-64+48))+rsi]
++
++	vinserti128	ymm0,ymm0,XMMWORD[r12],1
++	vinserti128	ymm1,ymm1,XMMWORD[16+r12],1
++	vpshufb	ymm0,ymm0,ymm7
++	vinserti128	ymm2,ymm2,XMMWORD[32+r12],1
++	vpshufb	ymm1,ymm1,ymm7
++	vinserti128	ymm3,ymm3,XMMWORD[48+r12],1
++
++	lea	rbp,[K256]
++	vpshufb	ymm2,ymm2,ymm7
++	vpaddd	ymm4,ymm0,YMMWORD[rbp]
++	vpshufb	ymm3,ymm3,ymm7
++	vpaddd	ymm5,ymm1,YMMWORD[32+rbp]
++	vpaddd	ymm6,ymm2,YMMWORD[64+rbp]
++	vpaddd	ymm7,ymm3,YMMWORD[96+rbp]
++	vmovdqa	YMMWORD[rsp],ymm4
++	xor	r14d,r14d
++	vmovdqa	YMMWORD[32+rsp],ymm5
++	lea	rsp,[((-64))+rsp]
++	mov	edi,ebx
++	vmovdqa	YMMWORD[rsp],ymm6
++	xor	edi,ecx
++	vmovdqa	YMMWORD[32+rsp],ymm7
++	mov	r12d,r9d
++	sub	rbp,-16*2*4
++	jmp	NEAR $L$avx2_00_47
++
++ALIGN	16
++$L$avx2_00_47:
++	lea	rsp,[((-64))+rsp]
++	vpalignr	ymm4,ymm1,ymm0,4
++	add	r11d,DWORD[((0+128))+rsp]
++	and	r12d,r8d
++	rorx	r13d,r8d,25
++	vpalignr	ymm7,ymm3,ymm2,4
++	rorx	r15d,r8d,11
++	lea	eax,[r14*1+rax]
++	lea	r11d,[r12*1+r11]
++	vpsrld	ymm6,ymm4,7
++	andn	r12d,r8d,r10d
++	xor	r13d,r15d
++	rorx	r14d,r8d,6
++	vpaddd	ymm0,ymm0,ymm7
++	lea	r11d,[r12*1+r11]
++	xor	r13d,r14d
++	mov	r15d,eax
++	vpsrld	ymm7,ymm4,3
++	rorx	r12d,eax,22
++	lea	r11d,[r13*1+r11]
++	xor	r15d,ebx
++	vpslld	ymm5,ymm4,14
++	rorx	r14d,eax,13
++	rorx	r13d,eax,2
++	lea	edx,[r11*1+rdx]
++	vpxor	ymm4,ymm7,ymm6
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,ebx
++	vpshufd	ymm7,ymm3,250
++	xor	r14d,r13d
++	lea	r11d,[rdi*1+r11]
++	mov	r12d,r8d
++	vpsrld	ymm6,ymm6,11
++	add	r10d,DWORD[((4+128))+rsp]
++	and	r12d,edx
++	rorx	r13d,edx,25
++	vpxor	ymm4,ymm4,ymm5
++	rorx	edi,edx,11
++	lea	r11d,[r14*1+r11]
++	lea	r10d,[r12*1+r10]
++	vpslld	ymm5,ymm5,11
++	andn	r12d,edx,r9d
++	xor	r13d,edi
++	rorx	r14d,edx,6
++	vpxor	ymm4,ymm4,ymm6
++	lea	r10d,[r12*1+r10]
++	xor	r13d,r14d
++	mov	edi,r11d
++	vpsrld	ymm6,ymm7,10
++	rorx	r12d,r11d,22
++	lea	r10d,[r13*1+r10]
++	xor	edi,eax
++	vpxor	ymm4,ymm4,ymm5
++	rorx	r14d,r11d,13
++	rorx	r13d,r11d,2
++	lea	ecx,[r10*1+rcx]
++	vpsrlq	ymm7,ymm7,17
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,eax
++	vpaddd	ymm0,ymm0,ymm4
++	xor	r14d,r13d
++	lea	r10d,[r15*1+r10]
++	mov	r12d,edx
++	vpxor	ymm6,ymm6,ymm7
++	add	r9d,DWORD[((8+128))+rsp]
++	and	r12d,ecx
++	rorx	r13d,ecx,25
++	vpsrlq	ymm7,ymm7,2
++	rorx	r15d,ecx,11
++	lea	r10d,[r14*1+r10]
++	lea	r9d,[r12*1+r9]
++	vpxor	ymm6,ymm6,ymm7
++	andn	r12d,ecx,r8d
++	xor	r13d,r15d
++	rorx	r14d,ecx,6
++	vpshufb	ymm6,ymm6,ymm8
++	lea	r9d,[r12*1+r9]
++	xor	r13d,r14d
++	mov	r15d,r10d
++	vpaddd	ymm0,ymm0,ymm6
++	rorx	r12d,r10d,22
++	lea	r9d,[r13*1+r9]
++	xor	r15d,r11d
++	vpshufd	ymm7,ymm0,80
++	rorx	r14d,r10d,13
++	rorx	r13d,r10d,2
++	lea	ebx,[r9*1+rbx]
++	vpsrld	ymm6,ymm7,10
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r11d
++	vpsrlq	ymm7,ymm7,17
++	xor	r14d,r13d
++	lea	r9d,[rdi*1+r9]
++	mov	r12d,ecx
++	vpxor	ymm6,ymm6,ymm7
++	add	r8d,DWORD[((12+128))+rsp]
++	and	r12d,ebx
++	rorx	r13d,ebx,25
++	vpsrlq	ymm7,ymm7,2
++	rorx	edi,ebx,11
++	lea	r9d,[r14*1+r9]
++	lea	r8d,[r12*1+r8]
++	vpxor	ymm6,ymm6,ymm7
++	andn	r12d,ebx,edx
++	xor	r13d,edi
++	rorx	r14d,ebx,6
++	vpshufb	ymm6,ymm6,ymm9
++	lea	r8d,[r12*1+r8]
++	xor	r13d,r14d
++	mov	edi,r9d
++	vpaddd	ymm0,ymm0,ymm6
++	rorx	r12d,r9d,22
++	lea	r8d,[r13*1+r8]
++	xor	edi,r10d
++	vpaddd	ymm6,ymm0,YMMWORD[rbp]
++	rorx	r14d,r9d,13
++	rorx	r13d,r9d,2
++	lea	eax,[r8*1+rax]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r10d
++	xor	r14d,r13d
++	lea	r8d,[r15*1+r8]
++	mov	r12d,ebx
++	vmovdqa	YMMWORD[rsp],ymm6
++	vpalignr	ymm4,ymm2,ymm1,4
++	add	edx,DWORD[((32+128))+rsp]
++	and	r12d,eax
++	rorx	r13d,eax,25
++	vpalignr	ymm7,ymm0,ymm3,4
++	rorx	r15d,eax,11
++	lea	r8d,[r14*1+r8]
++	lea	edx,[r12*1+rdx]
++	vpsrld	ymm6,ymm4,7
++	andn	r12d,eax,ecx
++	xor	r13d,r15d
++	rorx	r14d,eax,6
++	vpaddd	ymm1,ymm1,ymm7
++	lea	edx,[r12*1+rdx]
++	xor	r13d,r14d
++	mov	r15d,r8d
++	vpsrld	ymm7,ymm4,3
++	rorx	r12d,r8d,22
++	lea	edx,[r13*1+rdx]
++	xor	r15d,r9d
++	vpslld	ymm5,ymm4,14
++	rorx	r14d,r8d,13
++	rorx	r13d,r8d,2
++	lea	r11d,[rdx*1+r11]
++	vpxor	ymm4,ymm7,ymm6
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r9d
++	vpshufd	ymm7,ymm0,250
++	xor	r14d,r13d
++	lea	edx,[rdi*1+rdx]
++	mov	r12d,eax
++	vpsrld	ymm6,ymm6,11
++	add	ecx,DWORD[((36+128))+rsp]
++	and	r12d,r11d
++	rorx	r13d,r11d,25
++	vpxor	ymm4,ymm4,ymm5
++	rorx	edi,r11d,11
++	lea	edx,[r14*1+rdx]
++	lea	ecx,[r12*1+rcx]
++	vpslld	ymm5,ymm5,11
++	andn	r12d,r11d,ebx
++	xor	r13d,edi
++	rorx	r14d,r11d,6
++	vpxor	ymm4,ymm4,ymm6
++	lea	ecx,[r12*1+rcx]
++	xor	r13d,r14d
++	mov	edi,edx
++	vpsrld	ymm6,ymm7,10
++	rorx	r12d,edx,22
++	lea	ecx,[r13*1+rcx]
++	xor	edi,r8d
++	vpxor	ymm4,ymm4,ymm5
++	rorx	r14d,edx,13
++	rorx	r13d,edx,2
++	lea	r10d,[rcx*1+r10]
++	vpsrlq	ymm7,ymm7,17
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r8d
++	vpaddd	ymm1,ymm1,ymm4
++	xor	r14d,r13d
++	lea	ecx,[r15*1+rcx]
++	mov	r12d,r11d
++	vpxor	ymm6,ymm6,ymm7
++	add	ebx,DWORD[((40+128))+rsp]
++	and	r12d,r10d
++	rorx	r13d,r10d,25
++	vpsrlq	ymm7,ymm7,2
++	rorx	r15d,r10d,11
++	lea	ecx,[r14*1+rcx]
++	lea	ebx,[r12*1+rbx]
++	vpxor	ymm6,ymm6,ymm7
++	andn	r12d,r10d,eax
++	xor	r13d,r15d
++	rorx	r14d,r10d,6
++	vpshufb	ymm6,ymm6,ymm8
++	lea	ebx,[r12*1+rbx]
++	xor	r13d,r14d
++	mov	r15d,ecx
++	vpaddd	ymm1,ymm1,ymm6
++	rorx	r12d,ecx,22
++	lea	ebx,[r13*1+rbx]
++	xor	r15d,edx
++	vpshufd	ymm7,ymm1,80
++	rorx	r14d,ecx,13
++	rorx	r13d,ecx,2
++	lea	r9d,[rbx*1+r9]
++	vpsrld	ymm6,ymm7,10
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,edx
++	vpsrlq	ymm7,ymm7,17
++	xor	r14d,r13d
++	lea	ebx,[rdi*1+rbx]
++	mov	r12d,r10d
++	vpxor	ymm6,ymm6,ymm7
++	add	eax,DWORD[((44+128))+rsp]
++	and	r12d,r9d
++	rorx	r13d,r9d,25
++	vpsrlq	ymm7,ymm7,2
++	rorx	edi,r9d,11
++	lea	ebx,[r14*1+rbx]
++	lea	eax,[r12*1+rax]
++	vpxor	ymm6,ymm6,ymm7
++	andn	r12d,r9d,r11d
++	xor	r13d,edi
++	rorx	r14d,r9d,6
++	vpshufb	ymm6,ymm6,ymm9
++	lea	eax,[r12*1+rax]
++	xor	r13d,r14d
++	mov	edi,ebx
++	vpaddd	ymm1,ymm1,ymm6
++	rorx	r12d,ebx,22
++	lea	eax,[r13*1+rax]
++	xor	edi,ecx
++	vpaddd	ymm6,ymm1,YMMWORD[32+rbp]
++	rorx	r14d,ebx,13
++	rorx	r13d,ebx,2
++	lea	r8d,[rax*1+r8]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,ecx
++	xor	r14d,r13d
++	lea	eax,[r15*1+rax]
++	mov	r12d,r9d
++	vmovdqa	YMMWORD[32+rsp],ymm6
++	lea	rsp,[((-64))+rsp]
++	vpalignr	ymm4,ymm3,ymm2,4
++	add	r11d,DWORD[((0+128))+rsp]
++	and	r12d,r8d
++	rorx	r13d,r8d,25
++	vpalignr	ymm7,ymm1,ymm0,4
++	rorx	r15d,r8d,11
++	lea	eax,[r14*1+rax]
++	lea	r11d,[r12*1+r11]
++	vpsrld	ymm6,ymm4,7
++	andn	r12d,r8d,r10d
++	xor	r13d,r15d
++	rorx	r14d,r8d,6
++	vpaddd	ymm2,ymm2,ymm7
++	lea	r11d,[r12*1+r11]
++	xor	r13d,r14d
++	mov	r15d,eax
++	vpsrld	ymm7,ymm4,3
++	rorx	r12d,eax,22
++	lea	r11d,[r13*1+r11]
++	xor	r15d,ebx
++	vpslld	ymm5,ymm4,14
++	rorx	r14d,eax,13
++	rorx	r13d,eax,2
++	lea	edx,[r11*1+rdx]
++	vpxor	ymm4,ymm7,ymm6
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,ebx
++	vpshufd	ymm7,ymm1,250
++	xor	r14d,r13d
++	lea	r11d,[rdi*1+r11]
++	mov	r12d,r8d
++	vpsrld	ymm6,ymm6,11
++	add	r10d,DWORD[((4+128))+rsp]
++	and	r12d,edx
++	rorx	r13d,edx,25
++	vpxor	ymm4,ymm4,ymm5
++	rorx	edi,edx,11
++	lea	r11d,[r14*1+r11]
++	lea	r10d,[r12*1+r10]
++	vpslld	ymm5,ymm5,11
++	andn	r12d,edx,r9d
++	xor	r13d,edi
++	rorx	r14d,edx,6
++	vpxor	ymm4,ymm4,ymm6
++	lea	r10d,[r12*1+r10]
++	xor	r13d,r14d
++	mov	edi,r11d
++	vpsrld	ymm6,ymm7,10
++	rorx	r12d,r11d,22
++	lea	r10d,[r13*1+r10]
++	xor	edi,eax
++	vpxor	ymm4,ymm4,ymm5
++	rorx	r14d,r11d,13
++	rorx	r13d,r11d,2
++	lea	ecx,[r10*1+rcx]
++	vpsrlq	ymm7,ymm7,17
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,eax
++	vpaddd	ymm2,ymm2,ymm4
++	xor	r14d,r13d
++	lea	r10d,[r15*1+r10]
++	mov	r12d,edx
++	vpxor	ymm6,ymm6,ymm7
++	add	r9d,DWORD[((8+128))+rsp]
++	and	r12d,ecx
++	rorx	r13d,ecx,25
++	vpsrlq	ymm7,ymm7,2
++	rorx	r15d,ecx,11
++	lea	r10d,[r14*1+r10]
++	lea	r9d,[r12*1+r9]
++	vpxor	ymm6,ymm6,ymm7
++	andn	r12d,ecx,r8d
++	xor	r13d,r15d
++	rorx	r14d,ecx,6
++	vpshufb	ymm6,ymm6,ymm8
++	lea	r9d,[r12*1+r9]
++	xor	r13d,r14d
++	mov	r15d,r10d
++	vpaddd	ymm2,ymm2,ymm6
++	rorx	r12d,r10d,22
++	lea	r9d,[r13*1+r9]
++	xor	r15d,r11d
++	vpshufd	ymm7,ymm2,80
++	rorx	r14d,r10d,13
++	rorx	r13d,r10d,2
++	lea	ebx,[r9*1+rbx]
++	vpsrld	ymm6,ymm7,10
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r11d
++	vpsrlq	ymm7,ymm7,17
++	xor	r14d,r13d
++	lea	r9d,[rdi*1+r9]
++	mov	r12d,ecx
++	vpxor	ymm6,ymm6,ymm7
++	add	r8d,DWORD[((12+128))+rsp]
++	and	r12d,ebx
++	rorx	r13d,ebx,25
++	vpsrlq	ymm7,ymm7,2
++	rorx	edi,ebx,11
++	lea	r9d,[r14*1+r9]
++	lea	r8d,[r12*1+r8]
++	vpxor	ymm6,ymm6,ymm7
++	andn	r12d,ebx,edx
++	xor	r13d,edi
++	rorx	r14d,ebx,6
++	vpshufb	ymm6,ymm6,ymm9
++	lea	r8d,[r12*1+r8]
++	xor	r13d,r14d
++	mov	edi,r9d
++	vpaddd	ymm2,ymm2,ymm6
++	rorx	r12d,r9d,22
++	lea	r8d,[r13*1+r8]
++	xor	edi,r10d
++	vpaddd	ymm6,ymm2,YMMWORD[64+rbp]
++	rorx	r14d,r9d,13
++	rorx	r13d,r9d,2
++	lea	eax,[r8*1+rax]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r10d
++	xor	r14d,r13d
++	lea	r8d,[r15*1+r8]
++	mov	r12d,ebx
++	vmovdqa	YMMWORD[rsp],ymm6
++	vpalignr	ymm4,ymm0,ymm3,4
++	add	edx,DWORD[((32+128))+rsp]
++	and	r12d,eax
++	rorx	r13d,eax,25
++	vpalignr	ymm7,ymm2,ymm1,4
++	rorx	r15d,eax,11
++	lea	r8d,[r14*1+r8]
++	lea	edx,[r12*1+rdx]
++	vpsrld	ymm6,ymm4,7
++	andn	r12d,eax,ecx
++	xor	r13d,r15d
++	rorx	r14d,eax,6
++	vpaddd	ymm3,ymm3,ymm7
++	lea	edx,[r12*1+rdx]
++	xor	r13d,r14d
++	mov	r15d,r8d
++	vpsrld	ymm7,ymm4,3
++	rorx	r12d,r8d,22
++	lea	edx,[r13*1+rdx]
++	xor	r15d,r9d
++	vpslld	ymm5,ymm4,14
++	rorx	r14d,r8d,13
++	rorx	r13d,r8d,2
++	lea	r11d,[rdx*1+r11]
++	vpxor	ymm4,ymm7,ymm6
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r9d
++	vpshufd	ymm7,ymm2,250
++	xor	r14d,r13d
++	lea	edx,[rdi*1+rdx]
++	mov	r12d,eax
++	vpsrld	ymm6,ymm6,11
++	add	ecx,DWORD[((36+128))+rsp]
++	and	r12d,r11d
++	rorx	r13d,r11d,25
++	vpxor	ymm4,ymm4,ymm5
++	rorx	edi,r11d,11
++	lea	edx,[r14*1+rdx]
++	lea	ecx,[r12*1+rcx]
++	vpslld	ymm5,ymm5,11
++	andn	r12d,r11d,ebx
++	xor	r13d,edi
++	rorx	r14d,r11d,6
++	vpxor	ymm4,ymm4,ymm6
++	lea	ecx,[r12*1+rcx]
++	xor	r13d,r14d
++	mov	edi,edx
++	vpsrld	ymm6,ymm7,10
++	rorx	r12d,edx,22
++	lea	ecx,[r13*1+rcx]
++	xor	edi,r8d
++	vpxor	ymm4,ymm4,ymm5
++	rorx	r14d,edx,13
++	rorx	r13d,edx,2
++	lea	r10d,[rcx*1+r10]
++	vpsrlq	ymm7,ymm7,17
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r8d
++	vpaddd	ymm3,ymm3,ymm4
++	xor	r14d,r13d
++	lea	ecx,[r15*1+rcx]
++	mov	r12d,r11d
++	vpxor	ymm6,ymm6,ymm7
++	add	ebx,DWORD[((40+128))+rsp]
++	and	r12d,r10d
++	rorx	r13d,r10d,25
++	vpsrlq	ymm7,ymm7,2
++	rorx	r15d,r10d,11
++	lea	ecx,[r14*1+rcx]
++	lea	ebx,[r12*1+rbx]
++	vpxor	ymm6,ymm6,ymm7
++	andn	r12d,r10d,eax
++	xor	r13d,r15d
++	rorx	r14d,r10d,6
++	vpshufb	ymm6,ymm6,ymm8
++	lea	ebx,[r12*1+rbx]
++	xor	r13d,r14d
++	mov	r15d,ecx
++	vpaddd	ymm3,ymm3,ymm6
++	rorx	r12d,ecx,22
++	lea	ebx,[r13*1+rbx]
++	xor	r15d,edx
++	vpshufd	ymm7,ymm3,80
++	rorx	r14d,ecx,13
++	rorx	r13d,ecx,2
++	lea	r9d,[rbx*1+r9]
++	vpsrld	ymm6,ymm7,10
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,edx
++	vpsrlq	ymm7,ymm7,17
++	xor	r14d,r13d
++	lea	ebx,[rdi*1+rbx]
++	mov	r12d,r10d
++	vpxor	ymm6,ymm6,ymm7
++	add	eax,DWORD[((44+128))+rsp]
++	and	r12d,r9d
++	rorx	r13d,r9d,25
++	vpsrlq	ymm7,ymm7,2
++	rorx	edi,r9d,11
++	lea	ebx,[r14*1+rbx]
++	lea	eax,[r12*1+rax]
++	vpxor	ymm6,ymm6,ymm7
++	andn	r12d,r9d,r11d
++	xor	r13d,edi
++	rorx	r14d,r9d,6
++	vpshufb	ymm6,ymm6,ymm9
++	lea	eax,[r12*1+rax]
++	xor	r13d,r14d
++	mov	edi,ebx
++	vpaddd	ymm3,ymm3,ymm6
++	rorx	r12d,ebx,22
++	lea	eax,[r13*1+rax]
++	xor	edi,ecx
++	vpaddd	ymm6,ymm3,YMMWORD[96+rbp]
++	rorx	r14d,ebx,13
++	rorx	r13d,ebx,2
++	lea	r8d,[rax*1+r8]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,ecx
++	xor	r14d,r13d
++	lea	eax,[r15*1+rax]
++	mov	r12d,r9d
++	vmovdqa	YMMWORD[32+rsp],ymm6
++	lea	rbp,[128+rbp]
++	cmp	BYTE[3+rbp],0
++	jne	NEAR $L$avx2_00_47
++	add	r11d,DWORD[((0+64))+rsp]
++	and	r12d,r8d
++	rorx	r13d,r8d,25
++	rorx	r15d,r8d,11
++	lea	eax,[r14*1+rax]
++	lea	r11d,[r12*1+r11]
++	andn	r12d,r8d,r10d
++	xor	r13d,r15d
++	rorx	r14d,r8d,6
++	lea	r11d,[r12*1+r11]
++	xor	r13d,r14d
++	mov	r15d,eax
++	rorx	r12d,eax,22
++	lea	r11d,[r13*1+r11]
++	xor	r15d,ebx
++	rorx	r14d,eax,13
++	rorx	r13d,eax,2
++	lea	edx,[r11*1+rdx]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,ebx
++	xor	r14d,r13d
++	lea	r11d,[rdi*1+r11]
++	mov	r12d,r8d
++	add	r10d,DWORD[((4+64))+rsp]
++	and	r12d,edx
++	rorx	r13d,edx,25
++	rorx	edi,edx,11
++	lea	r11d,[r14*1+r11]
++	lea	r10d,[r12*1+r10]
++	andn	r12d,edx,r9d
++	xor	r13d,edi
++	rorx	r14d,edx,6
++	lea	r10d,[r12*1+r10]
++	xor	r13d,r14d
++	mov	edi,r11d
++	rorx	r12d,r11d,22
++	lea	r10d,[r13*1+r10]
++	xor	edi,eax
++	rorx	r14d,r11d,13
++	rorx	r13d,r11d,2
++	lea	ecx,[r10*1+rcx]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,eax
++	xor	r14d,r13d
++	lea	r10d,[r15*1+r10]
++	mov	r12d,edx
++	add	r9d,DWORD[((8+64))+rsp]
++	and	r12d,ecx
++	rorx	r13d,ecx,25
++	rorx	r15d,ecx,11
++	lea	r10d,[r14*1+r10]
++	lea	r9d,[r12*1+r9]
++	andn	r12d,ecx,r8d
++	xor	r13d,r15d
++	rorx	r14d,ecx,6
++	lea	r9d,[r12*1+r9]
++	xor	r13d,r14d
++	mov	r15d,r10d
++	rorx	r12d,r10d,22
++	lea	r9d,[r13*1+r9]
++	xor	r15d,r11d
++	rorx	r14d,r10d,13
++	rorx	r13d,r10d,2
++	lea	ebx,[r9*1+rbx]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r11d
++	xor	r14d,r13d
++	lea	r9d,[rdi*1+r9]
++	mov	r12d,ecx
++	add	r8d,DWORD[((12+64))+rsp]
++	and	r12d,ebx
++	rorx	r13d,ebx,25
++	rorx	edi,ebx,11
++	lea	r9d,[r14*1+r9]
++	lea	r8d,[r12*1+r8]
++	andn	r12d,ebx,edx
++	xor	r13d,edi
++	rorx	r14d,ebx,6
++	lea	r8d,[r12*1+r8]
++	xor	r13d,r14d
++	mov	edi,r9d
++	rorx	r12d,r9d,22
++	lea	r8d,[r13*1+r8]
++	xor	edi,r10d
++	rorx	r14d,r9d,13
++	rorx	r13d,r9d,2
++	lea	eax,[r8*1+rax]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r10d
++	xor	r14d,r13d
++	lea	r8d,[r15*1+r8]
++	mov	r12d,ebx
++	add	edx,DWORD[((32+64))+rsp]
++	and	r12d,eax
++	rorx	r13d,eax,25
++	rorx	r15d,eax,11
++	lea	r8d,[r14*1+r8]
++	lea	edx,[r12*1+rdx]
++	andn	r12d,eax,ecx
++	xor	r13d,r15d
++	rorx	r14d,eax,6
++	lea	edx,[r12*1+rdx]
++	xor	r13d,r14d
++	mov	r15d,r8d
++	rorx	r12d,r8d,22
++	lea	edx,[r13*1+rdx]
++	xor	r15d,r9d
++	rorx	r14d,r8d,13
++	rorx	r13d,r8d,2
++	lea	r11d,[rdx*1+r11]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r9d
++	xor	r14d,r13d
++	lea	edx,[rdi*1+rdx]
++	mov	r12d,eax
++	add	ecx,DWORD[((36+64))+rsp]
++	and	r12d,r11d
++	rorx	r13d,r11d,25
++	rorx	edi,r11d,11
++	lea	edx,[r14*1+rdx]
++	lea	ecx,[r12*1+rcx]
++	andn	r12d,r11d,ebx
++	xor	r13d,edi
++	rorx	r14d,r11d,6
++	lea	ecx,[r12*1+rcx]
++	xor	r13d,r14d
++	mov	edi,edx
++	rorx	r12d,edx,22
++	lea	ecx,[r13*1+rcx]
++	xor	edi,r8d
++	rorx	r14d,edx,13
++	rorx	r13d,edx,2
++	lea	r10d,[rcx*1+r10]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r8d
++	xor	r14d,r13d
++	lea	ecx,[r15*1+rcx]
++	mov	r12d,r11d
++	add	ebx,DWORD[((40+64))+rsp]
++	and	r12d,r10d
++	rorx	r13d,r10d,25
++	rorx	r15d,r10d,11
++	lea	ecx,[r14*1+rcx]
++	lea	ebx,[r12*1+rbx]
++	andn	r12d,r10d,eax
++	xor	r13d,r15d
++	rorx	r14d,r10d,6
++	lea	ebx,[r12*1+rbx]
++	xor	r13d,r14d
++	mov	r15d,ecx
++	rorx	r12d,ecx,22
++	lea	ebx,[r13*1+rbx]
++	xor	r15d,edx
++	rorx	r14d,ecx,13
++	rorx	r13d,ecx,2
++	lea	r9d,[rbx*1+r9]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,edx
++	xor	r14d,r13d
++	lea	ebx,[rdi*1+rbx]
++	mov	r12d,r10d
++	add	eax,DWORD[((44+64))+rsp]
++	and	r12d,r9d
++	rorx	r13d,r9d,25
++	rorx	edi,r9d,11
++	lea	ebx,[r14*1+rbx]
++	lea	eax,[r12*1+rax]
++	andn	r12d,r9d,r11d
++	xor	r13d,edi
++	rorx	r14d,r9d,6
++	lea	eax,[r12*1+rax]
++	xor	r13d,r14d
++	mov	edi,ebx
++	rorx	r12d,ebx,22
++	lea	eax,[r13*1+rax]
++	xor	edi,ecx
++	rorx	r14d,ebx,13
++	rorx	r13d,ebx,2
++	lea	r8d,[rax*1+r8]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,ecx
++	xor	r14d,r13d
++	lea	eax,[r15*1+rax]
++	mov	r12d,r9d
++	add	r11d,DWORD[rsp]
++	and	r12d,r8d
++	rorx	r13d,r8d,25
++	rorx	r15d,r8d,11
++	lea	eax,[r14*1+rax]
++	lea	r11d,[r12*1+r11]
++	andn	r12d,r8d,r10d
++	xor	r13d,r15d
++	rorx	r14d,r8d,6
++	lea	r11d,[r12*1+r11]
++	xor	r13d,r14d
++	mov	r15d,eax
++	rorx	r12d,eax,22
++	lea	r11d,[r13*1+r11]
++	xor	r15d,ebx
++	rorx	r14d,eax,13
++	rorx	r13d,eax,2
++	lea	edx,[r11*1+rdx]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,ebx
++	xor	r14d,r13d
++	lea	r11d,[rdi*1+r11]
++	mov	r12d,r8d
++	add	r10d,DWORD[4+rsp]
++	and	r12d,edx
++	rorx	r13d,edx,25
++	rorx	edi,edx,11
++	lea	r11d,[r14*1+r11]
++	lea	r10d,[r12*1+r10]
++	andn	r12d,edx,r9d
++	xor	r13d,edi
++	rorx	r14d,edx,6
++	lea	r10d,[r12*1+r10]
++	xor	r13d,r14d
++	mov	edi,r11d
++	rorx	r12d,r11d,22
++	lea	r10d,[r13*1+r10]
++	xor	edi,eax
++	rorx	r14d,r11d,13
++	rorx	r13d,r11d,2
++	lea	ecx,[r10*1+rcx]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,eax
++	xor	r14d,r13d
++	lea	r10d,[r15*1+r10]
++	mov	r12d,edx
++	add	r9d,DWORD[8+rsp]
++	and	r12d,ecx
++	rorx	r13d,ecx,25
++	rorx	r15d,ecx,11
++	lea	r10d,[r14*1+r10]
++	lea	r9d,[r12*1+r9]
++	andn	r12d,ecx,r8d
++	xor	r13d,r15d
++	rorx	r14d,ecx,6
++	lea	r9d,[r12*1+r9]
++	xor	r13d,r14d
++	mov	r15d,r10d
++	rorx	r12d,r10d,22
++	lea	r9d,[r13*1+r9]
++	xor	r15d,r11d
++	rorx	r14d,r10d,13
++	rorx	r13d,r10d,2
++	lea	ebx,[r9*1+rbx]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r11d
++	xor	r14d,r13d
++	lea	r9d,[rdi*1+r9]
++	mov	r12d,ecx
++	add	r8d,DWORD[12+rsp]
++	and	r12d,ebx
++	rorx	r13d,ebx,25
++	rorx	edi,ebx,11
++	lea	r9d,[r14*1+r9]
++	lea	r8d,[r12*1+r8]
++	andn	r12d,ebx,edx
++	xor	r13d,edi
++	rorx	r14d,ebx,6
++	lea	r8d,[r12*1+r8]
++	xor	r13d,r14d
++	mov	edi,r9d
++	rorx	r12d,r9d,22
++	lea	r8d,[r13*1+r8]
++	xor	edi,r10d
++	rorx	r14d,r9d,13
++	rorx	r13d,r9d,2
++	lea	eax,[r8*1+rax]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r10d
++	xor	r14d,r13d
++	lea	r8d,[r15*1+r8]
++	mov	r12d,ebx
++	add	edx,DWORD[32+rsp]
++	and	r12d,eax
++	rorx	r13d,eax,25
++	rorx	r15d,eax,11
++	lea	r8d,[r14*1+r8]
++	lea	edx,[r12*1+rdx]
++	andn	r12d,eax,ecx
++	xor	r13d,r15d
++	rorx	r14d,eax,6
++	lea	edx,[r12*1+rdx]
++	xor	r13d,r14d
++	mov	r15d,r8d
++	rorx	r12d,r8d,22
++	lea	edx,[r13*1+rdx]
++	xor	r15d,r9d
++	rorx	r14d,r8d,13
++	rorx	r13d,r8d,2
++	lea	r11d,[rdx*1+r11]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r9d
++	xor	r14d,r13d
++	lea	edx,[rdi*1+rdx]
++	mov	r12d,eax
++	add	ecx,DWORD[36+rsp]
++	and	r12d,r11d
++	rorx	r13d,r11d,25
++	rorx	edi,r11d,11
++	lea	edx,[r14*1+rdx]
++	lea	ecx,[r12*1+rcx]
++	andn	r12d,r11d,ebx
++	xor	r13d,edi
++	rorx	r14d,r11d,6
++	lea	ecx,[r12*1+rcx]
++	xor	r13d,r14d
++	mov	edi,edx
++	rorx	r12d,edx,22
++	lea	ecx,[r13*1+rcx]
++	xor	edi,r8d
++	rorx	r14d,edx,13
++	rorx	r13d,edx,2
++	lea	r10d,[rcx*1+r10]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r8d
++	xor	r14d,r13d
++	lea	ecx,[r15*1+rcx]
++	mov	r12d,r11d
++	add	ebx,DWORD[40+rsp]
++	and	r12d,r10d
++	rorx	r13d,r10d,25
++	rorx	r15d,r10d,11
++	lea	ecx,[r14*1+rcx]
++	lea	ebx,[r12*1+rbx]
++	andn	r12d,r10d,eax
++	xor	r13d,r15d
++	rorx	r14d,r10d,6
++	lea	ebx,[r12*1+rbx]
++	xor	r13d,r14d
++	mov	r15d,ecx
++	rorx	r12d,ecx,22
++	lea	ebx,[r13*1+rbx]
++	xor	r15d,edx
++	rorx	r14d,ecx,13
++	rorx	r13d,ecx,2
++	lea	r9d,[rbx*1+r9]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,edx
++	xor	r14d,r13d
++	lea	ebx,[rdi*1+rbx]
++	mov	r12d,r10d
++	add	eax,DWORD[44+rsp]
++	and	r12d,r9d
++	rorx	r13d,r9d,25
++	rorx	edi,r9d,11
++	lea	ebx,[r14*1+rbx]
++	lea	eax,[r12*1+rax]
++	andn	r12d,r9d,r11d
++	xor	r13d,edi
++	rorx	r14d,r9d,6
++	lea	eax,[r12*1+rax]
++	xor	r13d,r14d
++	mov	edi,ebx
++	rorx	r12d,ebx,22
++	lea	eax,[r13*1+rax]
++	xor	edi,ecx
++	rorx	r14d,ebx,13
++	rorx	r13d,ebx,2
++	lea	r8d,[rax*1+r8]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,ecx
++	xor	r14d,r13d
++	lea	eax,[r15*1+rax]
++	mov	r12d,r9d
++	mov	rdi,QWORD[512+rsp]
++	add	eax,r14d
++
++	lea	rbp,[448+rsp]
++
++	add	eax,DWORD[rdi]
++	add	ebx,DWORD[4+rdi]
++	add	ecx,DWORD[8+rdi]
++	add	edx,DWORD[12+rdi]
++	add	r8d,DWORD[16+rdi]
++	add	r9d,DWORD[20+rdi]
++	add	r10d,DWORD[24+rdi]
++	add	r11d,DWORD[28+rdi]
++
++	mov	DWORD[rdi],eax
++	mov	DWORD[4+rdi],ebx
++	mov	DWORD[8+rdi],ecx
++	mov	DWORD[12+rdi],edx
++	mov	DWORD[16+rdi],r8d
++	mov	DWORD[20+rdi],r9d
++	mov	DWORD[24+rdi],r10d
++	mov	DWORD[28+rdi],r11d
++
++	cmp	rsi,QWORD[80+rbp]
++	je	NEAR $L$done_avx2
++
++	xor	r14d,r14d
++	mov	edi,ebx
++	xor	edi,ecx
++	mov	r12d,r9d
++	jmp	NEAR $L$ower_avx2
++ALIGN	16
++$L$ower_avx2:
++	add	r11d,DWORD[((0+16))+rbp]
++	and	r12d,r8d
++	rorx	r13d,r8d,25
++	rorx	r15d,r8d,11
++	lea	eax,[r14*1+rax]
++	lea	r11d,[r12*1+r11]
++	andn	r12d,r8d,r10d
++	xor	r13d,r15d
++	rorx	r14d,r8d,6
++	lea	r11d,[r12*1+r11]
++	xor	r13d,r14d
++	mov	r15d,eax
++	rorx	r12d,eax,22
++	lea	r11d,[r13*1+r11]
++	xor	r15d,ebx
++	rorx	r14d,eax,13
++	rorx	r13d,eax,2
++	lea	edx,[r11*1+rdx]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,ebx
++	xor	r14d,r13d
++	lea	r11d,[rdi*1+r11]
++	mov	r12d,r8d
++	add	r10d,DWORD[((4+16))+rbp]
++	and	r12d,edx
++	rorx	r13d,edx,25
++	rorx	edi,edx,11
++	lea	r11d,[r14*1+r11]
++	lea	r10d,[r12*1+r10]
++	andn	r12d,edx,r9d
++	xor	r13d,edi
++	rorx	r14d,edx,6
++	lea	r10d,[r12*1+r10]
++	xor	r13d,r14d
++	mov	edi,r11d
++	rorx	r12d,r11d,22
++	lea	r10d,[r13*1+r10]
++	xor	edi,eax
++	rorx	r14d,r11d,13
++	rorx	r13d,r11d,2
++	lea	ecx,[r10*1+rcx]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,eax
++	xor	r14d,r13d
++	lea	r10d,[r15*1+r10]
++	mov	r12d,edx
++	add	r9d,DWORD[((8+16))+rbp]
++	and	r12d,ecx
++	rorx	r13d,ecx,25
++	rorx	r15d,ecx,11
++	lea	r10d,[r14*1+r10]
++	lea	r9d,[r12*1+r9]
++	andn	r12d,ecx,r8d
++	xor	r13d,r15d
++	rorx	r14d,ecx,6
++	lea	r9d,[r12*1+r9]
++	xor	r13d,r14d
++	mov	r15d,r10d
++	rorx	r12d,r10d,22
++	lea	r9d,[r13*1+r9]
++	xor	r15d,r11d
++	rorx	r14d,r10d,13
++	rorx	r13d,r10d,2
++	lea	ebx,[r9*1+rbx]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r11d
++	xor	r14d,r13d
++	lea	r9d,[rdi*1+r9]
++	mov	r12d,ecx
++	add	r8d,DWORD[((12+16))+rbp]
++	and	r12d,ebx
++	rorx	r13d,ebx,25
++	rorx	edi,ebx,11
++	lea	r9d,[r14*1+r9]
++	lea	r8d,[r12*1+r8]
++	andn	r12d,ebx,edx
++	xor	r13d,edi
++	rorx	r14d,ebx,6
++	lea	r8d,[r12*1+r8]
++	xor	r13d,r14d
++	mov	edi,r9d
++	rorx	r12d,r9d,22
++	lea	r8d,[r13*1+r8]
++	xor	edi,r10d
++	rorx	r14d,r9d,13
++	rorx	r13d,r9d,2
++	lea	eax,[r8*1+rax]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r10d
++	xor	r14d,r13d
++	lea	r8d,[r15*1+r8]
++	mov	r12d,ebx
++	add	edx,DWORD[((32+16))+rbp]
++	and	r12d,eax
++	rorx	r13d,eax,25
++	rorx	r15d,eax,11
++	lea	r8d,[r14*1+r8]
++	lea	edx,[r12*1+rdx]
++	andn	r12d,eax,ecx
++	xor	r13d,r15d
++	rorx	r14d,eax,6
++	lea	edx,[r12*1+rdx]
++	xor	r13d,r14d
++	mov	r15d,r8d
++	rorx	r12d,r8d,22
++	lea	edx,[r13*1+rdx]
++	xor	r15d,r9d
++	rorx	r14d,r8d,13
++	rorx	r13d,r8d,2
++	lea	r11d,[rdx*1+r11]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,r9d
++	xor	r14d,r13d
++	lea	edx,[rdi*1+rdx]
++	mov	r12d,eax
++	add	ecx,DWORD[((36+16))+rbp]
++	and	r12d,r11d
++	rorx	r13d,r11d,25
++	rorx	edi,r11d,11
++	lea	edx,[r14*1+rdx]
++	lea	ecx,[r12*1+rcx]
++	andn	r12d,r11d,ebx
++	xor	r13d,edi
++	rorx	r14d,r11d,6
++	lea	ecx,[r12*1+rcx]
++	xor	r13d,r14d
++	mov	edi,edx
++	rorx	r12d,edx,22
++	lea	ecx,[r13*1+rcx]
++	xor	edi,r8d
++	rorx	r14d,edx,13
++	rorx	r13d,edx,2
++	lea	r10d,[rcx*1+r10]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,r8d
++	xor	r14d,r13d
++	lea	ecx,[r15*1+rcx]
++	mov	r12d,r11d
++	add	ebx,DWORD[((40+16))+rbp]
++	and	r12d,r10d
++	rorx	r13d,r10d,25
++	rorx	r15d,r10d,11
++	lea	ecx,[r14*1+rcx]
++	lea	ebx,[r12*1+rbx]
++	andn	r12d,r10d,eax
++	xor	r13d,r15d
++	rorx	r14d,r10d,6
++	lea	ebx,[r12*1+rbx]
++	xor	r13d,r14d
++	mov	r15d,ecx
++	rorx	r12d,ecx,22
++	lea	ebx,[r13*1+rbx]
++	xor	r15d,edx
++	rorx	r14d,ecx,13
++	rorx	r13d,ecx,2
++	lea	r9d,[rbx*1+r9]
++	and	edi,r15d
++	xor	r14d,r12d
++	xor	edi,edx
++	xor	r14d,r13d
++	lea	ebx,[rdi*1+rbx]
++	mov	r12d,r10d
++	add	eax,DWORD[((44+16))+rbp]
++	and	r12d,r9d
++	rorx	r13d,r9d,25
++	rorx	edi,r9d,11
++	lea	ebx,[r14*1+rbx]
++	lea	eax,[r12*1+rax]
++	andn	r12d,r9d,r11d
++	xor	r13d,edi
++	rorx	r14d,r9d,6
++	lea	eax,[r12*1+rax]
++	xor	r13d,r14d
++	mov	edi,ebx
++	rorx	r12d,ebx,22
++	lea	eax,[r13*1+rax]
++	xor	edi,ecx
++	rorx	r14d,ebx,13
++	rorx	r13d,ebx,2
++	lea	r8d,[rax*1+r8]
++	and	r15d,edi
++	xor	r14d,r12d
++	xor	r15d,ecx
++	xor	r14d,r13d
++	lea	eax,[r15*1+rax]
++	mov	r12d,r9d
++	lea	rbp,[((-64))+rbp]
++	cmp	rbp,rsp
++	jae	NEAR $L$ower_avx2
++
++	mov	rdi,QWORD[512+rsp]
++	add	eax,r14d
++
++	lea	rsp,[448+rsp]
++
++	add	eax,DWORD[rdi]
++	add	ebx,DWORD[4+rdi]
++	add	ecx,DWORD[8+rdi]
++	add	edx,DWORD[12+rdi]
++	add	r8d,DWORD[16+rdi]
++	add	r9d,DWORD[20+rdi]
++	lea	rsi,[128+rsi]
++	add	r10d,DWORD[24+rdi]
++	mov	r12,rsi
++	add	r11d,DWORD[28+rdi]
++	cmp	rsi,QWORD[((64+16))+rsp]
++
++	mov	DWORD[rdi],eax
++	cmove	r12,rsp
++	mov	DWORD[4+rdi],ebx
++	mov	DWORD[8+rdi],ecx
++	mov	DWORD[12+rdi],edx
++	mov	DWORD[16+rdi],r8d
++	mov	DWORD[20+rdi],r9d
++	mov	DWORD[24+rdi],r10d
++	mov	DWORD[28+rdi],r11d
++
++	jbe	NEAR $L$oop_avx2
++	lea	rbp,[rsp]
++
++$L$done_avx2:
++	lea	rsp,[rbp]
++	mov	rsi,QWORD[((64+24))+rsp]
++	vzeroupper
++	movaps	xmm6,XMMWORD[((64+32))+rsp]
++	movaps	xmm7,XMMWORD[((64+48))+rsp]
++	movaps	xmm8,XMMWORD[((64+64))+rsp]
++	movaps	xmm9,XMMWORD[((64+80))+rsp]
++	mov	r15,QWORD[rsi]
++	mov	r14,QWORD[8+rsi]
++	mov	r13,QWORD[16+rsi]
++	mov	r12,QWORD[24+rsi]
++	mov	rbp,QWORD[32+rsi]
++	mov	rbx,QWORD[40+rsi]
++	lea	rsp,[48+rsi]
++$L$epilogue_avx2:
++	mov	rdi,QWORD[8+rsp]	;WIN64 epilogue
++	mov	rsi,QWORD[16+rsp]
++	DB	0F3h,0C3h		;repret
++$L$SEH_end_sha256_block_data_order_avx2:
++EXTERN	__imp_RtlVirtualUnwind
++
++ALIGN	16
++se_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	mov	rsi,QWORD[8+r9]
++	mov	r11,QWORD[56+r9]
++
++	mov	r10d,DWORD[r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jb	NEAR $L$in_prologue
++
++	mov	rax,QWORD[152+r8]
++
++	mov	r10d,DWORD[4+r11]
++	lea	r10,[r10*1+rsi]
++	cmp	rbx,r10
++	jae	NEAR $L$in_prologue
++	lea	r10,[$L$avx2_shortcut]
++	cmp	rbx,r10
++	jb	NEAR $L$not_in_avx2
++
++	and	rax,-256*4
++	add	rax,448
++$L$not_in_avx2:
++	mov	rsi,rax
++	mov	rax,QWORD[((64+24))+rax]
++	lea	rax,[48+rax]
++
++	mov	rbx,QWORD[((-8))+rax]
++	mov	rbp,QWORD[((-16))+rax]
++	mov	r12,QWORD[((-24))+rax]
++	mov	r13,QWORD[((-32))+rax]
++	mov	r14,QWORD[((-40))+rax]
++	mov	r15,QWORD[((-48))+rax]
++	mov	QWORD[144+r8],rbx
++	mov	QWORD[160+r8],rbp
++	mov	QWORD[216+r8],r12
++	mov	QWORD[224+r8],r13
++	mov	QWORD[232+r8],r14
++	mov	QWORD[240+r8],r15
++
++	lea	r10,[$L$epilogue]
++	cmp	rbx,r10
++	jb	NEAR $L$in_prologue
++
++	lea	rsi,[((64+32))+rsi]
++	lea	rdi,[512+r8]
++	mov	ecx,8
++	DD	0xa548f3fc
++
++$L$in_prologue:
++	mov	rdi,QWORD[8+rax]
++	mov	rsi,QWORD[16+rax]
++	mov	QWORD[152+r8],rax
++	mov	QWORD[168+r8],rsi
++	mov	QWORD[176+r8],rdi
++
++	mov	rdi,QWORD[40+r9]
++	mov	rsi,r8
++	mov	ecx,154
++	DD	0xa548f3fc
++
++	mov	rsi,r9
++	xor	rcx,rcx
++	mov	rdx,QWORD[8+rsi]
++	mov	r8,QWORD[rsi]
++	mov	r9,QWORD[16+rsi]
++	mov	r10,QWORD[40+rsi]
++	lea	r11,[56+rsi]
++	lea	r12,[24+rsi]
++	mov	QWORD[32+rsp],r10
++	mov	QWORD[40+rsp],r11
++	mov	QWORD[48+rsp],r12
++	mov	QWORD[56+rsp],rcx
++	call	QWORD[__imp_RtlVirtualUnwind]
++
++	mov	eax,1
++	add	rsp,64
++	popfq
++	pop	r15
++	pop	r14
++	pop	r13
++	pop	r12
++	pop	rbp
++	pop	rbx
++	pop	rdi
++	pop	rsi
++	DB	0F3h,0C3h		;repret
++
++
++ALIGN	16
++shaext_handler:
++	push	rsi
++	push	rdi
++	push	rbx
++	push	rbp
++	push	r12
++	push	r13
++	push	r14
++	push	r15
++	pushfq
++	sub	rsp,64
++
++	mov	rax,QWORD[120+r8]
++	mov	rbx,QWORD[248+r8]
++
++	lea	r10,[$L$prologue_shaext]
++	cmp	rbx,r10
++	jb	NEAR $L$in_prologue
++
++	lea	r10,[$L$epilogue_shaext]
++	cmp	rbx,r10
++	jae	NEAR $L$in_prologue
++
++	lea	rsi,[((-8-80))+rax]
++	lea	rdi,[512+r8]
++	mov	ecx,10
++	DD	0xa548f3fc
++
++	jmp	NEAR $L$in_prologue
++
++section	.pdata rdata align=4
++ALIGN	4
++	DD	$L$SEH_begin_sha256_block_data_order wrt ..imagebase
++	DD	$L$SEH_end_sha256_block_data_order wrt ..imagebase
++	DD	$L$SEH_info_sha256_block_data_order wrt ..imagebase
++	DD	$L$SEH_begin_sha256_block_data_order_shaext wrt ..imagebase
++	DD	$L$SEH_end_sha256_block_data_order_shaext wrt ..imagebase
++	DD	$L$SEH_info_sha256_block_data_order_shaext wrt ..imagebase
++	DD	$L$SEH_begin_sha256_block_data_order_ssse3 wrt ..imagebase
++	DD	$L$SEH_end_sha256_block_data_order_ssse3 wrt ..imagebase
++	DD	$L$SEH_info_sha256_block_data_order_ssse3 wrt ..imagebase
++	DD	$L$SEH_begin_sha256_block_data_order_avx wrt ..imagebase
++	DD	$L$SEH_end_sha256_block_data_order_avx wrt ..imagebase
++	DD	$L$SEH_info_sha256_block_data_order_avx wrt ..imagebase
++	DD	$L$SEH_begin_sha256_block_data_order_avx2 wrt ..imagebase
++	DD	$L$SEH_end_sha256_block_data_order_avx2 wrt ..imagebase
++	DD	$L$SEH_info_sha256_block_data_order_avx2 wrt ..imagebase
++section	.xdata rdata align=8
++ALIGN	8
++$L$SEH_info_sha256_block_data_order:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$prologue wrt ..imagebase,$L$epilogue wrt ..imagebase
++$L$SEH_info_sha256_block_data_order_shaext:
++DB	9,0,0,0
++	DD	shaext_handler wrt ..imagebase
++$L$SEH_info_sha256_block_data_order_ssse3:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$prologue_ssse3 wrt ..imagebase,$L$epilogue_ssse3 wrt ..imagebase
++$L$SEH_info_sha256_block_data_order_avx:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$prologue_avx wrt ..imagebase,$L$epilogue_avx wrt ..imagebase
++$L$SEH_info_sha256_block_data_order_avx2:
++DB	9,0,0,0
++	DD	se_handler wrt ..imagebase
++	DD	$L$prologue_avx2 wrt ..imagebase,$L$epilogue_avx2 wrt ..imagebase
+diff --git a/SMP/lib/priority_options.h b/SMP/lib/priority_options.h
+new file mode 100644
+index 0000000..77bc9ae
+--- /dev/null
++++ b/SMP/lib/priority_options.h
+@@ -0,0 +1,179 @@
++/* ANSI-C code produced by gperf version 3.0.4 */
++/* Command-line: gperf --global-table -t lib/priority_options.gperf  */
++/* Computed positions: -k'1,$' */
++
++#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
++      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
++      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
++      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
++      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
++      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
++      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
++      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
++      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
++      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
++      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
++      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
++      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
++      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
++      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
++      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
++      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
++      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
++      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
++      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
++      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
++      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
++      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
++/* The character set is not based on ISO-646.  */
++#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
++#endif
++
++#line 1 "lib/priority_options.gperf"
++
++typedef void (*option_set_func)(gnutls_priority_t);
++#line 6 "lib/priority_options.gperf"
++struct priority_options_st { const char *name; option_set_func func; };
++
++#define TOTAL_KEYWORDS 29
++#define MIN_WORD_LENGTH 6
++#define MAX_WORD_LENGTH 32
++#define MIN_HASH_VALUE 6
++#define MAX_HASH_VALUE 52
++/* maximum key range = 47, duplicates = 0 */
++
++#ifdef __GNUC__
++__inline
++#else
++#ifdef __cplusplus
++inline
++#endif
++#endif
++static unsigned int
++hash (register const char *str, register unsigned int len)
++{
++  static const unsigned char asso_values[] =
++    {
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      25, 53, 53,  5, 53, 53, 20, 53, 53, 53,
++      53, 53, 53, 53, 53,  5, 53, 10,  0, 25,
++      10,  0,  0, 53, 53, 10, 20,  0,  0, 53,
++      10, 53, 53,  0,  0,  0,  0, 30, 53,  5,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53, 53, 53, 53, 53,
++      53, 53, 53, 53, 53, 53
++    };
++  return len + asso_values[(unsigned char)str[len - 1]] + asso_values[(unsigned char)str[0]];
++}
++
++static const struct priority_options_st wordlist[] =
++  {
++    {""}, {""}, {""}, {""}, {""}, {""},
++#line 12 "lib/priority_options.gperf"
++    {"NO_ETM", enable_no_etm},
++    {""}, {""}, {""},
++#line 11 "lib/priority_options.gperf"
++    {"NO_TICKETS", enable_no_tickets},
++#line 35 "lib/priority_options.gperf"
++    {"NEW_PADDING", dummy_func},
++    {""},
++#line 10 "lib/priority_options.gperf"
++    {"NO_EXTENSIONS", enable_no_extensions},
++    {""},
++#line 13 "lib/priority_options.gperf"
++    {"NO_SESSION_HASH", enable_no_ext_master_secret},
++#line 8 "lib/priority_options.gperf"
++    {"COMPAT", enable_compat},
++#line 25 "lib/priority_options.gperf"
++    {"DISABLE_WILDCARDS", disable_wildcards},
++#line 21 "lib/priority_options.gperf"
++    {"SAFE_RENEGOTIATION", enable_safe_renegotiation},
++#line 17 "lib/priority_options.gperf"
++    {"SSL3_RECORD_VERSION", enable_ssl3_record_version},
++#line 20 "lib/priority_options.gperf"
++    {"UNSAFE_RENEGOTIATION", enable_unsafe_renegotiation},
++#line 14 "lib/priority_options.gperf"
++    {"STATELESS_COMPRESSION", dummy_func},
++#line 31 "lib/priority_options.gperf"
++    {"PROFILE_HIGH", enable_profile_high},
++#line 24 "lib/priority_options.gperf"
++    {"FALLBACK_SCSV", enable_fallback_scsv},
++#line 30 "lib/priority_options.gperf"
++    {"PROFILE_MEDIUM", enable_profile_medium},
++#line 16 "lib/priority_options.gperf"
++    {"VERIFY_DISABLE_CRL_CHECKS", disable_crl_checks},
++#line 23 "lib/priority_options.gperf"
++    {"DISABLE_SAFE_RENEGOTIATION", disable_safe_renegotiation},
++#line 19 "lib/priority_options.gperf"
++    {"VERIFY_ALLOW_X509_V1_CA_CRT", dummy_func},
++#line 32 "lib/priority_options.gperf"
++    {"PROFILE_ULTRA", enable_profile_ultra},
++#line 29 "lib/priority_options.gperf"
++    {"PROFILE_LEGACY", enable_profile_legacy},
++#line 15 "lib/priority_options.gperf"
++    {"VERIFY_ALLOW_SIGN_RSA_MD5", enable_verify_allow_rsa_md5},
++#line 22 "lib/priority_options.gperf"
++    {"PARTIAL_RENEGOTIATION", enable_partial_safe_renegotiation},
++#line 36 "lib/priority_options.gperf"
++    {"DEBUG_ALLOW_KEY_USAGE_VIOLATIONS", enable_server_key_usage_violations},
++    {""}, {""}, {""},
++#line 9 "lib/priority_options.gperf"
++    {"DUMBFW", enable_dumbfw},
++#line 27 "lib/priority_options.gperf"
++    {"PROFILE_VERY_WEAK", enable_profile_very_weak},
++    {""}, {""}, {""},
++#line 18 "lib/priority_options.gperf"
++    {"LATEST_RECORD_VERSION", enable_latest_record_version},
++#line 26 "lib/priority_options.gperf"
++    {"SERVER_PRECEDENCE", enable_server_precedence},
++    {""}, {""}, {""}, {""},
++#line 33 "lib/priority_options.gperf"
++    {"PROFILE_SUITEB128", enable_profile_suiteb128},
++    {""}, {""}, {""},
++#line 28 "lib/priority_options.gperf"
++    {"PROFILE_LOW", enable_profile_low},
++#line 34 "lib/priority_options.gperf"
++    {"PROFILE_SUITEB192", enable_profile_suiteb192}
++  };
++
++#ifdef __GNUC__
++__inline
++#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
++__attribute__ ((__gnu_inline__))
++#endif
++#endif
++static const struct priority_options_st *
++in_word_set (register const char *str, register unsigned int len)
++{
++  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
++    {
++      register int key = hash (str, len);
++
++      if (key <= MAX_HASH_VALUE && key >= 0)
++        {
++          register const char *s = wordlist[key].name;
++
++          if (*str == *s && !strcmp (str + 1, s + 1))
++            return &wordlist[key];
++        }
++    }
++  return 0;
++}
+diff --git a/SMP/lib/unistring/unictype.h b/SMP/lib/unistring/unictype.h
+new file mode 100644
+index 0000000..cd35351
+--- /dev/null
++++ b/SMP/lib/unistring/unictype.h
+@@ -0,0 +1,1060 @@
++/* Unicode character classification and properties.
++   Copyright (C) 2002, 2005-2016 Free Software Foundation, Inc.
++
++   This program is free software: you can redistribute it and/or modify it
++   under the terms of either:
++
++    * the GNU Lesser General Public License as published
++   by the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   or
++
++   * the GNU General Public License as published by the Free
++   Software Foundation; either version 2 of the License, or
++   (at your option) any later version.
++
++   or both in parallel, as here.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
++
++#ifndef _UNICTYPE_H
++#define _UNICTYPE_H
++
++#include "unitypes.h"
++
++/* Get bool.  */
++#include <stdbool.h>
++
++/* Get size_t.  */
++#include <stddef.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++/* ========================================================================= */
++
++/* Field 1 of Unicode Character Database: Character name.
++   See "uniname.h".  */
++
++/* ========================================================================= */
++
++/* Field 2 of Unicode Character Database: General category.  */
++
++/* Data type denoting a General category value.  This is not just a bitmask,
++   but rather a bitmask and a pointer to the lookup table, so that programs
++   that use only the predefined bitmasks (i.e. don't combine bitmasks with &
++   and |) don't have a link-time dependency towards the big general table.  */
++typedef struct
++{
++  uint32_t bitmask : 31;
++  /*bool*/ unsigned int generic : 1;
++  union
++  {
++    const void *table;                               /* when generic is 0 */
++    bool (*lookup_fn) (ucs4_t uc, uint32_t bitmask); /* when generic is 1 */
++  } lookup;
++}
++uc_general_category_t;
++
++/* Bits and bit masks denoting General category values.  UnicodeData-3.2.0.html
++   says a 32-bit integer will always suffice to represent them.
++   These bit masks can only be used with the uc_is_general_category_withtable
++   function.  */
++enum
++{
++  UC_CATEGORY_MASK_L  = 0x0000001f,
++  UC_CATEGORY_MASK_LC = 0x00000007,
++  UC_CATEGORY_MASK_Lu = 0x00000001,
++  UC_CATEGORY_MASK_Ll = 0x00000002,
++  UC_CATEGORY_MASK_Lt = 0x00000004,
++  UC_CATEGORY_MASK_Lm = 0x00000008,
++  UC_CATEGORY_MASK_Lo = 0x00000010,
++  UC_CATEGORY_MASK_M  = 0x000000e0,
++  UC_CATEGORY_MASK_Mn = 0x00000020,
++  UC_CATEGORY_MASK_Mc = 0x00000040,
++  UC_CATEGORY_MASK_Me = 0x00000080,
++  UC_CATEGORY_MASK_N  = 0x00000700,
++  UC_CATEGORY_MASK_Nd = 0x00000100,
++  UC_CATEGORY_MASK_Nl = 0x00000200,
++  UC_CATEGORY_MASK_No = 0x00000400,
++  UC_CATEGORY_MASK_P  = 0x0003f800,
++  UC_CATEGORY_MASK_Pc = 0x00000800,
++  UC_CATEGORY_MASK_Pd = 0x00001000,
++  UC_CATEGORY_MASK_Ps = 0x00002000,
++  UC_CATEGORY_MASK_Pe = 0x00004000,
++  UC_CATEGORY_MASK_Pi = 0x00008000,
++  UC_CATEGORY_MASK_Pf = 0x00010000,
++  UC_CATEGORY_MASK_Po = 0x00020000,
++  UC_CATEGORY_MASK_S  = 0x003c0000,
++  UC_CATEGORY_MASK_Sm = 0x00040000,
++  UC_CATEGORY_MASK_Sc = 0x00080000,
++  UC_CATEGORY_MASK_Sk = 0x00100000,
++  UC_CATEGORY_MASK_So = 0x00200000,
++  UC_CATEGORY_MASK_Z  = 0x01c00000,
++  UC_CATEGORY_MASK_Zs = 0x00400000,
++  UC_CATEGORY_MASK_Zl = 0x00800000,
++  UC_CATEGORY_MASK_Zp = 0x01000000,
++  UC_CATEGORY_MASK_C  = 0x3e000000,
++  UC_CATEGORY_MASK_Cc = 0x02000000,
++  UC_CATEGORY_MASK_Cf = 0x04000000,
++  UC_CATEGORY_MASK_Cs = 0x08000000,
++  UC_CATEGORY_MASK_Co = 0x10000000,
++  UC_CATEGORY_MASK_Cn = 0x20000000
++};
++
++/* Predefined General category values.  */
++extern const uc_general_category_t UC_CATEGORY_L;
++extern const uc_general_category_t UC_CATEGORY_LC;
++extern const uc_general_category_t UC_CATEGORY_Lu;
++extern const uc_general_category_t UC_CATEGORY_Ll;
++extern const uc_general_category_t UC_CATEGORY_Lt;
++extern const uc_general_category_t UC_CATEGORY_Lm;
++extern const uc_general_category_t UC_CATEGORY_Lo;
++extern const uc_general_category_t UC_CATEGORY_M;
++extern const uc_general_category_t UC_CATEGORY_Mn;
++extern const uc_general_category_t UC_CATEGORY_Mc;
++extern const uc_general_category_t UC_CATEGORY_Me;
++extern const uc_general_category_t UC_CATEGORY_N;
++extern const uc_general_category_t UC_CATEGORY_Nd;
++extern const uc_general_category_t UC_CATEGORY_Nl;
++extern const uc_general_category_t UC_CATEGORY_No;
++extern const uc_general_category_t UC_CATEGORY_P;
++extern const uc_general_category_t UC_CATEGORY_Pc;
++extern const uc_general_category_t UC_CATEGORY_Pd;
++extern const uc_general_category_t UC_CATEGORY_Ps;
++extern const uc_general_category_t UC_CATEGORY_Pe;
++extern const uc_general_category_t UC_CATEGORY_Pi;
++extern const uc_general_category_t UC_CATEGORY_Pf;
++extern const uc_general_category_t UC_CATEGORY_Po;
++extern const uc_general_category_t UC_CATEGORY_S;
++extern const uc_general_category_t UC_CATEGORY_Sm;
++extern const uc_general_category_t UC_CATEGORY_Sc;
++extern const uc_general_category_t UC_CATEGORY_Sk;
++extern const uc_general_category_t UC_CATEGORY_So;
++extern const uc_general_category_t UC_CATEGORY_Z;
++extern const uc_general_category_t UC_CATEGORY_Zs;
++extern const uc_general_category_t UC_CATEGORY_Zl;
++extern const uc_general_category_t UC_CATEGORY_Zp;
++extern const uc_general_category_t UC_CATEGORY_C;
++extern const uc_general_category_t UC_CATEGORY_Cc;
++extern const uc_general_category_t UC_CATEGORY_Cf;
++extern const uc_general_category_t UC_CATEGORY_Cs;
++extern const uc_general_category_t UC_CATEGORY_Co;
++extern const uc_general_category_t UC_CATEGORY_Cn;
++/* Non-public.  */
++extern const uc_general_category_t _UC_CATEGORY_NONE;
++
++/* Alias names for predefined General category values.  */
++#define UC_LETTER                    UC_CATEGORY_L
++#define UC_CASED_LETTER              UC_CATEGORY_LC
++#define UC_UPPERCASE_LETTER          UC_CATEGORY_Lu
++#define UC_LOWERCASE_LETTER          UC_CATEGORY_Ll
++#define UC_TITLECASE_LETTER          UC_CATEGORY_Lt
++#define UC_MODIFIER_LETTER           UC_CATEGORY_Lm
++#define UC_OTHER_LETTER              UC_CATEGORY_Lo
++#define UC_MARK                      UC_CATEGORY_M
++#define UC_NON_SPACING_MARK          UC_CATEGORY_Mn
++#define UC_COMBINING_SPACING_MARK    UC_CATEGORY_Mc
++#define UC_ENCLOSING_MARK            UC_CATEGORY_Me
++#define UC_NUMBER                    UC_CATEGORY_N
++#define UC_DECIMAL_DIGIT_NUMBER      UC_CATEGORY_Nd
++#define UC_LETTER_NUMBER             UC_CATEGORY_Nl
++#define UC_OTHER_NUMBER              UC_CATEGORY_No
++#define UC_PUNCTUATION               UC_CATEGORY_P
++#define UC_CONNECTOR_PUNCTUATION     UC_CATEGORY_Pc
++#define UC_DASH_PUNCTUATION          UC_CATEGORY_Pd
++#define UC_OPEN_PUNCTUATION          UC_CATEGORY_Ps /* a.k.a. UC_START_PUNCTUATION */
++#define UC_CLOSE_PUNCTUATION         UC_CATEGORY_Pe /* a.k.a. UC_END_PUNCTUATION */
++#define UC_INITIAL_QUOTE_PUNCTUATION UC_CATEGORY_Pi
++#define UC_FINAL_QUOTE_PUNCTUATION   UC_CATEGORY_Pf
++#define UC_OTHER_PUNCTUATION         UC_CATEGORY_Po
++#define UC_SYMBOL                    UC_CATEGORY_S
++#define UC_MATH_SYMBOL               UC_CATEGORY_Sm
++#define UC_CURRENCY_SYMBOL           UC_CATEGORY_Sc
++#define UC_MODIFIER_SYMBOL           UC_CATEGORY_Sk
++#define UC_OTHER_SYMBOL              UC_CATEGORY_So
++#define UC_SEPARATOR                 UC_CATEGORY_Z
++#define UC_SPACE_SEPARATOR           UC_CATEGORY_Zs
++#define UC_LINE_SEPARATOR            UC_CATEGORY_Zl
++#define UC_PARAGRAPH_SEPARATOR       UC_CATEGORY_Zp
++#define UC_OTHER                     UC_CATEGORY_C
++#define UC_CONTROL                   UC_CATEGORY_Cc
++#define UC_FORMAT                    UC_CATEGORY_Cf
++#define UC_SURROGATE                 UC_CATEGORY_Cs /* all of them are invalid characters */
++#define UC_PRIVATE_USE               UC_CATEGORY_Co
++#define UC_UNASSIGNED                UC_CATEGORY_Cn /* some of them are invalid characters */
++
++/* Return the union of two general categories.
++   This corresponds to the unions of the two sets of characters.  */
++extern uc_general_category_t
++       uc_general_category_or (uc_general_category_t category1,
++                               uc_general_category_t category2);
++
++/* Return the intersection of two general categories as bit masks.
++   This *does*not* correspond to the intersection of the two sets of
++   characters.  */
++extern uc_general_category_t
++       uc_general_category_and (uc_general_category_t category1,
++                                uc_general_category_t category2);
++
++/* Return the intersection of a general category with the complement of a
++   second general category, as bit masks.
++   This *does*not* correspond to the intersection with complement, when
++   viewing the categories as sets of characters.  */
++extern uc_general_category_t
++       uc_general_category_and_not (uc_general_category_t category1,
++                                    uc_general_category_t category2);
++
++/* Return the name of a general category.  */
++extern const char *
++       uc_general_category_name (uc_general_category_t category)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the long name of a general category.  */
++extern const char *
++       uc_general_category_long_name (uc_general_category_t category)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the general category given by name, e.g. "Lu", or by long name,
++   e.g. "Uppercase Letter".  */
++extern uc_general_category_t
++       uc_general_category_byname (const char *category_name)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the general category of a Unicode character.  */
++extern uc_general_category_t
++       uc_general_category (ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++
++/* Test whether a Unicode character belongs to a given category.
++   The CATEGORY argument can be the combination of several predefined
++   general categories.  */
++extern bool
++       uc_is_general_category (ucs4_t uc, uc_general_category_t category)
++       _UC_ATTRIBUTE_PURE;
++/* Likewise.  This function uses a big table comprising all categories.  */
++extern bool
++       uc_is_general_category_withtable (ucs4_t uc, uint32_t bitmask)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++/* Field 3 of Unicode Character Database: Canonical combining class.  */
++
++/* The possible results of uc_combining_class (0..255) are described in
++   UCD.html.  The list here is not definitive; more values can be added
++   in future versions.  */
++enum
++{
++  UC_CCC_NR   =   0, /* Not Reordered */
++  UC_CCC_OV   =   1, /* Overlay */
++  UC_CCC_NK   =   7, /* Nukta */
++  UC_CCC_KV   =   8, /* Kana Voicing */
++  UC_CCC_VR   =   9, /* Virama */
++  UC_CCC_ATBL = 200, /* Attached Below Left */
++  UC_CCC_ATB  = 202, /* Attached Below */
++  UC_CCC_ATA  = 214, /* Attached Above */
++  UC_CCC_ATAR = 216, /* Attached Above Right */
++  UC_CCC_BL   = 218, /* Below Left */
++  UC_CCC_B    = 220, /* Below */
++  UC_CCC_BR   = 222, /* Below Right */
++  UC_CCC_L    = 224, /* Left */
++  UC_CCC_R    = 226, /* Right */
++  UC_CCC_AL   = 228, /* Above Left */
++  UC_CCC_A    = 230, /* Above */
++  UC_CCC_AR   = 232, /* Above Right */
++  UC_CCC_DB   = 233, /* Double Below */
++  UC_CCC_DA   = 234, /* Double Above */
++  UC_CCC_IS   = 240  /* Iota Subscript */
++};
++
++/* Return the canonical combining class of a Unicode character.  */
++extern int
++       uc_combining_class (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the name of a canonical combining class.  */
++extern const char *
++       uc_combining_class_name (int ccc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the long name of a canonical combining class.  */
++extern const char *
++       uc_combining_class_long_name (int ccc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the canonical combining class given by name, e.g. "BL", or by long
++   name, e.g. "Below Left".  */
++extern int
++       uc_combining_class_byname (const char *ccc_name)
++       _UC_ATTRIBUTE_PURE;
++
++/* ========================================================================= */
++
++/* Field 4 of Unicode Character Database: Bidi class.
++   Before Unicode 4.0, this field was called "Bidirectional category".  */
++
++enum
++{
++  UC_BIDI_L,   /* Left-to-Right */
++  UC_BIDI_LRE, /* Left-to-Right Embedding */
++  UC_BIDI_LRO, /* Left-to-Right Override */
++  UC_BIDI_R,   /* Right-to-Left */
++  UC_BIDI_AL,  /* Right-to-Left Arabic */
++  UC_BIDI_RLE, /* Right-to-Left Embedding */
++  UC_BIDI_RLO, /* Right-to-Left Override */
++  UC_BIDI_PDF, /* Pop Directional Format */
++  UC_BIDI_EN,  /* European Number */
++  UC_BIDI_ES,  /* European Number Separator */
++  UC_BIDI_ET,  /* European Number Terminator */
++  UC_BIDI_AN,  /* Arabic Number */
++  UC_BIDI_CS,  /* Common Number Separator */
++  UC_BIDI_NSM, /* Non-Spacing Mark */
++  UC_BIDI_BN,  /* Boundary Neutral */
++  UC_BIDI_B,   /* Paragraph Separator */
++  UC_BIDI_S,   /* Segment Separator */
++  UC_BIDI_WS,  /* Whitespace */
++  UC_BIDI_ON,  /* Other Neutral */
++  UC_BIDI_LRI, /* Left-to-Right Isolate */
++  UC_BIDI_RLI, /* Right-to-Left Isolate */
++  UC_BIDI_FSI, /* First Strong Isolate */
++  UC_BIDI_PDI  /* Pop Directional Isolate */
++};
++
++/* Return the name of a bidi class.  */
++extern const char *
++       uc_bidi_class_name (int bidi_class)
++       _UC_ATTRIBUTE_CONST;
++/* Same; obsolete function name.  */
++extern const char *
++       uc_bidi_category_name (int category)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the long name of a bidi class.  */
++extern const char *
++       uc_bidi_class_long_name (int bidi_class)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the bidi class given by name, e.g. "LRE", or by long name, e.g.
++   "Left-to-Right Embedding".  */
++extern int
++       uc_bidi_class_byname (const char *bidi_class_name)
++       _UC_ATTRIBUTE_PURE;
++/* Same; obsolete function name.  */
++extern int
++       uc_bidi_category_byname (const char *category_name)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the bidi class of a Unicode character.  */
++extern int
++       uc_bidi_class (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++/* Same; obsolete function name.  */
++extern int
++       uc_bidi_category (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test whether a Unicode character belongs to a given bidi class.  */
++extern bool
++       uc_is_bidi_class (ucs4_t uc, int bidi_class)
++       _UC_ATTRIBUTE_CONST;
++/* Same; obsolete function name.  */
++extern bool
++       uc_is_bidi_category (ucs4_t uc, int category)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++/* Field 5 of Unicode Character Database: Character decomposition mapping.
++   See "uninorm.h".  */
++
++/* ========================================================================= */
++
++/* Field 6 of Unicode Character Database: Decimal digit value.  */
++
++/* Return the decimal digit value of a Unicode character.  */
++extern int
++       uc_decimal_value (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++/* Field 7 of Unicode Character Database: Digit value.  */
++
++/* Return the digit value of a Unicode character.  */
++extern int
++       uc_digit_value (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++/* Field 8 of Unicode Character Database: Numeric value.  */
++
++/* Return the numeric value of a Unicode character.  */
++typedef struct
++{
++  int numerator;
++  int denominator;
++}
++uc_fraction_t;
++extern uc_fraction_t
++       uc_numeric_value (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++/* Field 9 of Unicode Character Database: Mirrored.  */
++
++/* Return the mirrored character of a Unicode character UC in *PUC.  */
++extern bool
++       uc_mirror_char (ucs4_t uc, ucs4_t *puc);
++
++/* ========================================================================= */
++
++/* Field 10 of Unicode Character Database: Unicode 1.0 Name.
++   Not available in this library.  */
++
++/* ========================================================================= */
++
++/* Field 11 of Unicode Character Database: ISO 10646 comment.
++   Not available in this library.  */
++
++/* ========================================================================= */
++
++/* Field 12, 13, 14 of Unicode Character Database: Uppercase mapping,
++   lowercase mapping, titlecase mapping.  See "unicase.h".  */
++
++/* ========================================================================= */
++
++/* Field 2 of the file ArabicShaping.txt in the Unicode Character Database.  */
++
++/* Possible joining types.  */
++enum
++{
++  UC_JOINING_TYPE_U, /* Non_Joining */
++  UC_JOINING_TYPE_T, /* Transparent */
++  UC_JOINING_TYPE_C, /* Join_Causing */
++  UC_JOINING_TYPE_L, /* Left_Joining */
++  UC_JOINING_TYPE_R, /* Right_Joining */
++  UC_JOINING_TYPE_D  /* Dual_Joining */
++};
++
++/* Return the name of a joining type.  */
++extern const char *
++       uc_joining_type_name (int joining_type)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the long name of a joining type.  */
++extern const char *
++       uc_joining_type_long_name (int joining_type)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the joining type given by name, e.g. "D", or by long name, e.g.
++   "Dual Joining".  */
++extern int
++       uc_joining_type_byname (const char *joining_type_name)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the joining type of a Unicode character.  */
++extern int
++       uc_joining_type (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++/* Field 3 of the file ArabicShaping.txt in the Unicode Character Database.  */
++
++/* Possible joining groups.
++   This enumeration may be extended in the future.  */
++enum
++{
++  UC_JOINING_GROUP_NONE,                  /* No_Joining_Group */
++  UC_JOINING_GROUP_AIN,                   /* Ain */
++  UC_JOINING_GROUP_ALAPH,                 /* Alaph */
++  UC_JOINING_GROUP_ALEF,                  /* Alef */
++  UC_JOINING_GROUP_BEH,                   /* Beh */
++  UC_JOINING_GROUP_BETH,                  /* Beth */
++  UC_JOINING_GROUP_BURUSHASKI_YEH_BARREE, /* Burushaski_Yeh_Barree */
++  UC_JOINING_GROUP_DAL,                   /* Dal */
++  UC_JOINING_GROUP_DALATH_RISH,           /* Dalath_Rish */
++  UC_JOINING_GROUP_E,                     /* E */
++  UC_JOINING_GROUP_FARSI_YEH,             /* Farsi_Yeh */
++  UC_JOINING_GROUP_FE,                    /* Fe */
++  UC_JOINING_GROUP_FEH,                   /* Feh */
++  UC_JOINING_GROUP_FINAL_SEMKATH,         /* Final_Semkath */
++  UC_JOINING_GROUP_GAF,                   /* Gaf */
++  UC_JOINING_GROUP_GAMAL,                 /* Gamal */
++  UC_JOINING_GROUP_HAH,                   /* Hah */
++  UC_JOINING_GROUP_HE,                    /* He */
++  UC_JOINING_GROUP_HEH,                   /* Heh */
++  UC_JOINING_GROUP_HEH_GOAL,              /* Heh_Goal */
++  UC_JOINING_GROUP_HETH,                  /* Heth */
++  UC_JOINING_GROUP_KAF,                   /* Kaf */
++  UC_JOINING_GROUP_KAPH,                  /* Kaph */
++  UC_JOINING_GROUP_KHAPH,                 /* Khaph */
++  UC_JOINING_GROUP_KNOTTED_HEH,           /* Knotted_Heh */
++  UC_JOINING_GROUP_LAM,                   /* Lam */
++  UC_JOINING_GROUP_LAMADH,                /* Lamadh */
++  UC_JOINING_GROUP_MEEM,                  /* Meem */
++  UC_JOINING_GROUP_MIM,                   /* Mim */
++  UC_JOINING_GROUP_NOON,                  /* Noon */
++  UC_JOINING_GROUP_NUN,                   /* Nun */
++  UC_JOINING_GROUP_NYA,                   /* Nya */
++  UC_JOINING_GROUP_PE,                    /* Pe */
++  UC_JOINING_GROUP_QAF,                   /* Qaf */
++  UC_JOINING_GROUP_QAPH,                  /* Qaph */
++  UC_JOINING_GROUP_REH,                   /* Reh */
++  UC_JOINING_GROUP_REVERSED_PE,           /* Reversed_Pe */
++  UC_JOINING_GROUP_SAD,                   /* Sad */
++  UC_JOINING_GROUP_SADHE,                 /* Sadhe */
++  UC_JOINING_GROUP_SEEN,                  /* Seen */
++  UC_JOINING_GROUP_SEMKATH,               /* Semkath */
++  UC_JOINING_GROUP_SHIN,                  /* Shin */
++  UC_JOINING_GROUP_SWASH_KAF,             /* Swash_Kaf */
++  UC_JOINING_GROUP_SYRIAC_WAW,            /* Syriac_Waw */
++  UC_JOINING_GROUP_TAH,                   /* Tah */
++  UC_JOINING_GROUP_TAW,                   /* Taw */
++  UC_JOINING_GROUP_TEH_MARBUTA,           /* Teh_Marbuta */
++  UC_JOINING_GROUP_TEH_MARBUTA_GOAL,      /* Teh_Marbuta_Goal */
++  UC_JOINING_GROUP_TETH,                  /* Teth */
++  UC_JOINING_GROUP_WAW,                   /* Waw */
++  UC_JOINING_GROUP_YEH,                   /* Yeh */
++  UC_JOINING_GROUP_YEH_BARREE,            /* Yeh_Barree */
++  UC_JOINING_GROUP_YEH_WITH_TAIL,         /* Yeh_With_Tail */
++  UC_JOINING_GROUP_YUDH,                  /* Yudh */
++  UC_JOINING_GROUP_YUDH_HE,               /* Yudh_He */
++  UC_JOINING_GROUP_ZAIN,                  /* Zain */
++  UC_JOINING_GROUP_ZHAIN,                 /* Zhain */
++  UC_JOINING_GROUP_ROHINGYA_YEH,          /* Rohingya_Yeh */
++  UC_JOINING_GROUP_STRAIGHT_WAW,          /* Straight_Waw */
++  UC_JOINING_GROUP_MANICHAEAN_ALEPH,      /* Manichaean_Aleph */
++  UC_JOINING_GROUP_MANICHAEAN_BETH,       /* Manichaean_Beth */
++  UC_JOINING_GROUP_MANICHAEAN_GIMEL,      /* Manichaean_Gimel */
++  UC_JOINING_GROUP_MANICHAEAN_DALETH,     /* Manichaean_Daleth */
++  UC_JOINING_GROUP_MANICHAEAN_WAW,        /* Manichaean_Waw */
++  UC_JOINING_GROUP_MANICHAEAN_ZAYIN,      /* Manichaean_Zayin */
++  UC_JOINING_GROUP_MANICHAEAN_HETH,       /* Manichaean_Heth */
++  UC_JOINING_GROUP_MANICHAEAN_TETH,       /* Manichaean_Teth */
++  UC_JOINING_GROUP_MANICHAEAN_YODH,       /* Manichaean_Yodh */
++  UC_JOINING_GROUP_MANICHAEAN_KAPH,       /* Manichaean_Kaph */
++  UC_JOINING_GROUP_MANICHAEAN_LAMEDH,     /* Manichaean_Lamedh */
++  UC_JOINING_GROUP_MANICHAEAN_DHAMEDH,    /* Manichaean_Dhamedh */
++  UC_JOINING_GROUP_MANICHAEAN_THAMEDH,    /* Manichaean_Thamedh */
++  UC_JOINING_GROUP_MANICHAEAN_MEM,        /* Manichaean_Mem */
++  UC_JOINING_GROUP_MANICHAEAN_NUN,        /* Manichaean_Nun */
++  UC_JOINING_GROUP_MANICHAEAN_SAMEKH,     /* Manichaean_Aleph */
++  UC_JOINING_GROUP_MANICHAEAN_AYIN,       /* Manichaean_Ayin */
++  UC_JOINING_GROUP_MANICHAEAN_PE,         /* Manichaean_Pe */
++  UC_JOINING_GROUP_MANICHAEAN_SADHE,      /* Manichaean_Sadhe */
++  UC_JOINING_GROUP_MANICHAEAN_QOPH,       /* Manichaean_Qoph */
++  UC_JOINING_GROUP_MANICHAEAN_RESH,       /* Manichaean_Resh */
++  UC_JOINING_GROUP_MANICHAEAN_TAW,        /* Manichaean_Taw */
++  UC_JOINING_GROUP_MANICHAEAN_ONE,        /* Manichaean_One */
++  UC_JOINING_GROUP_MANICHAEAN_FIVE,       /* Manichaean_Five */
++  UC_JOINING_GROUP_MANICHAEAN_TEN,        /* Manichaean_Ten */
++  UC_JOINING_GROUP_MANICHAEAN_TWENTY,     /* Manichaean_Twenty */
++  UC_JOINING_GROUP_MANICHAEAN_HUNDRED     /* Manichaean_Hundred */
++};
++
++/* Return the name of a joining group.  */
++extern const char *
++       uc_joining_group_name (int joining_group)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the joining group given by name, e.g. "Teh_Marbuta".  */
++extern int
++       uc_joining_group_byname (const char *joining_group_name)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the joining group of a Unicode character.  */
++extern int
++       uc_joining_group (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++/* Common API for properties.  */
++
++/* Data type denoting a property.  This is not just a number, but rather a
++   pointer to the test functions, so that programs that use only few of the
++   properties don't have a link-time dependency towards all the tables.  */
++typedef struct
++{
++  bool (*test_fn) (ucs4_t uc);
++}
++uc_property_t;
++
++/* Predefined properties.  */
++/* General.  */
++extern const uc_property_t UC_PROPERTY_WHITE_SPACE;
++extern const uc_property_t UC_PROPERTY_ALPHABETIC;
++extern const uc_property_t UC_PROPERTY_OTHER_ALPHABETIC;
++extern const uc_property_t UC_PROPERTY_NOT_A_CHARACTER;
++extern const uc_property_t UC_PROPERTY_DEFAULT_IGNORABLE_CODE_POINT;
++extern const uc_property_t UC_PROPERTY_OTHER_DEFAULT_IGNORABLE_CODE_POINT;
++extern const uc_property_t UC_PROPERTY_DEPRECATED;
++extern const uc_property_t UC_PROPERTY_LOGICAL_ORDER_EXCEPTION;
++extern const uc_property_t UC_PROPERTY_VARIATION_SELECTOR;
++extern const uc_property_t UC_PROPERTY_PRIVATE_USE;
++extern const uc_property_t UC_PROPERTY_UNASSIGNED_CODE_VALUE;
++/* Case.  */
++extern const uc_property_t UC_PROPERTY_UPPERCASE;
++extern const uc_property_t UC_PROPERTY_OTHER_UPPERCASE;
++extern const uc_property_t UC_PROPERTY_LOWERCASE;
++extern const uc_property_t UC_PROPERTY_OTHER_LOWERCASE;
++extern const uc_property_t UC_PROPERTY_TITLECASE;
++extern const uc_property_t UC_PROPERTY_CASED;
++extern const uc_property_t UC_PROPERTY_CASE_IGNORABLE;
++extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_LOWERCASED;
++extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_UPPERCASED;
++extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_TITLECASED;
++extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEFOLDED;
++extern const uc_property_t UC_PROPERTY_CHANGES_WHEN_CASEMAPPED;
++extern const uc_property_t UC_PROPERTY_SOFT_DOTTED;
++/* Identifiers.  */
++extern const uc_property_t UC_PROPERTY_ID_START;
++extern const uc_property_t UC_PROPERTY_OTHER_ID_START;
++extern const uc_property_t UC_PROPERTY_ID_CONTINUE;
++extern const uc_property_t UC_PROPERTY_OTHER_ID_CONTINUE;
++extern const uc_property_t UC_PROPERTY_XID_START;
++extern const uc_property_t UC_PROPERTY_XID_CONTINUE;
++extern const uc_property_t UC_PROPERTY_PATTERN_WHITE_SPACE;
++extern const uc_property_t UC_PROPERTY_PATTERN_SYNTAX;
++/* Shaping and rendering.  */
++extern const uc_property_t UC_PROPERTY_JOIN_CONTROL;
++extern const uc_property_t UC_PROPERTY_GRAPHEME_BASE;
++extern const uc_property_t UC_PROPERTY_GRAPHEME_EXTEND;
++extern const uc_property_t UC_PROPERTY_OTHER_GRAPHEME_EXTEND;
++extern const uc_property_t UC_PROPERTY_GRAPHEME_LINK;
++/* Bidi.  */
++extern const uc_property_t UC_PROPERTY_BIDI_CONTROL;
++extern const uc_property_t UC_PROPERTY_BIDI_LEFT_TO_RIGHT;
++extern const uc_property_t UC_PROPERTY_BIDI_HEBREW_RIGHT_TO_LEFT;
++extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_RIGHT_TO_LEFT;
++extern const uc_property_t UC_PROPERTY_BIDI_EUROPEAN_DIGIT;
++extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_SEPARATOR;
++extern const uc_property_t UC_PROPERTY_BIDI_EUR_NUM_TERMINATOR;
++extern const uc_property_t UC_PROPERTY_BIDI_ARABIC_DIGIT;
++extern const uc_property_t UC_PROPERTY_BIDI_COMMON_SEPARATOR;
++extern const uc_property_t UC_PROPERTY_BIDI_BLOCK_SEPARATOR;
++extern const uc_property_t UC_PROPERTY_BIDI_SEGMENT_SEPARATOR;
++extern const uc_property_t UC_PROPERTY_BIDI_WHITESPACE;
++extern const uc_property_t UC_PROPERTY_BIDI_NON_SPACING_MARK;
++extern const uc_property_t UC_PROPERTY_BIDI_BOUNDARY_NEUTRAL;
++extern const uc_property_t UC_PROPERTY_BIDI_PDF;
++extern const uc_property_t UC_PROPERTY_BIDI_EMBEDDING_OR_OVERRIDE;
++extern const uc_property_t UC_PROPERTY_BIDI_OTHER_NEUTRAL;
++/* Numeric.  */
++extern const uc_property_t UC_PROPERTY_HEX_DIGIT;
++extern const uc_property_t UC_PROPERTY_ASCII_HEX_DIGIT;
++/* CJK.  */
++extern const uc_property_t UC_PROPERTY_IDEOGRAPHIC;
++extern const uc_property_t UC_PROPERTY_UNIFIED_IDEOGRAPH;
++extern const uc_property_t UC_PROPERTY_RADICAL;
++extern const uc_property_t UC_PROPERTY_IDS_BINARY_OPERATOR;
++extern const uc_property_t UC_PROPERTY_IDS_TRINARY_OPERATOR;
++/* Misc.  */
++extern const uc_property_t UC_PROPERTY_ZERO_WIDTH;
++extern const uc_property_t UC_PROPERTY_SPACE;
++extern const uc_property_t UC_PROPERTY_NON_BREAK;
++extern const uc_property_t UC_PROPERTY_ISO_CONTROL;
++extern const uc_property_t UC_PROPERTY_FORMAT_CONTROL;
++extern const uc_property_t UC_PROPERTY_DASH;
++extern const uc_property_t UC_PROPERTY_HYPHEN;
++extern const uc_property_t UC_PROPERTY_PUNCTUATION;
++extern const uc_property_t UC_PROPERTY_LINE_SEPARATOR;
++extern const uc_property_t UC_PROPERTY_PARAGRAPH_SEPARATOR;
++extern const uc_property_t UC_PROPERTY_QUOTATION_MARK;
++extern const uc_property_t UC_PROPERTY_SENTENCE_TERMINAL;
++extern const uc_property_t UC_PROPERTY_TERMINAL_PUNCTUATION;
++extern const uc_property_t UC_PROPERTY_CURRENCY_SYMBOL;
++extern const uc_property_t UC_PROPERTY_MATH;
++extern const uc_property_t UC_PROPERTY_OTHER_MATH;
++extern const uc_property_t UC_PROPERTY_PAIRED_PUNCTUATION;
++extern const uc_property_t UC_PROPERTY_LEFT_OF_PAIR;
++extern const uc_property_t UC_PROPERTY_COMBINING;
++extern const uc_property_t UC_PROPERTY_COMPOSITE;
++extern const uc_property_t UC_PROPERTY_DECIMAL_DIGIT;
++extern const uc_property_t UC_PROPERTY_NUMERIC;
++extern const uc_property_t UC_PROPERTY_DIACRITIC;
++extern const uc_property_t UC_PROPERTY_EXTENDER;
++extern const uc_property_t UC_PROPERTY_IGNORABLE_CONTROL;
++
++/* Return the property given by name, e.g. "White space".  */
++extern uc_property_t
++       uc_property_byname (const char *property_name);
++
++/* Test whether a property is valid.  */
++#define uc_property_is_valid(property) ((property).test_fn != NULL)
++
++/* Test whether a Unicode character has a given property.  */
++extern bool
++       uc_is_property (ucs4_t uc, uc_property_t property);
++extern bool uc_is_property_white_space (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_alphabetic (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_other_alphabetic (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_not_a_character (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_default_ignorable_code_point (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_other_default_ignorable_code_point (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_deprecated (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_logical_order_exception (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_variation_selector (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_private_use (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_unassigned_code_value (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_uppercase (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_other_uppercase (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_lowercase (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_other_lowercase (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_titlecase (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_cased (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_case_ignorable (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_changes_when_lowercased (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_changes_when_uppercased (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_changes_when_titlecased (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_changes_when_casefolded (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_changes_when_casemapped (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_soft_dotted (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_id_start (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_other_id_start (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_id_continue (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_other_id_continue (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_xid_start (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_xid_continue (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_pattern_white_space (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_pattern_syntax (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_join_control (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_grapheme_base (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_grapheme_extend (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_other_grapheme_extend (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_grapheme_link (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_control (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_left_to_right (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_hebrew_right_to_left (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_arabic_right_to_left (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_european_digit (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_eur_num_separator (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_eur_num_terminator (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_arabic_digit (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_common_separator (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_block_separator (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_segment_separator (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_whitespace (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_non_spacing_mark (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_boundary_neutral (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_pdf (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_embedding_or_override (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_bidi_other_neutral (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_hex_digit (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_ascii_hex_digit (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_ideographic (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_unified_ideograph (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_radical (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_ids_binary_operator (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_ids_trinary_operator (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_zero_width (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_space (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_non_break (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_iso_control (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_format_control (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_dash (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_hyphen (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_punctuation (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_line_separator (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_paragraph_separator (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_quotation_mark (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_sentence_terminal (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_terminal_punctuation (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_currency_symbol (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_math (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_other_math (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_paired_punctuation (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_left_of_pair (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_combining (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_composite (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_decimal_digit (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_numeric (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_diacritic (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_extender (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++extern bool uc_is_property_ignorable_control (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++/* Subdivision of the Unicode characters into scripts.  */
++
++typedef struct
++{
++  unsigned int code : 21;
++  unsigned int start : 1;
++  unsigned int end : 1;
++}
++uc_interval_t;
++typedef struct
++{
++  unsigned int nintervals;
++  const uc_interval_t *intervals;
++  const char *name;
++}
++uc_script_t;
++
++/* Return the script of a Unicode character.  */
++extern const uc_script_t *
++       uc_script (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the script given by name, e.g. "HAN".  */
++extern const uc_script_t *
++       uc_script_byname (const char *script_name)
++       _UC_ATTRIBUTE_PURE;
++
++/* Test whether a Unicode character belongs to a given script.  */
++extern bool
++       uc_is_script (ucs4_t uc, const uc_script_t *script)
++       _UC_ATTRIBUTE_PURE;
++
++/* Get the list of all scripts.  */
++extern void
++       uc_all_scripts (const uc_script_t **scripts, size_t *count);
++
++/* ========================================================================= */
++
++/* Subdivision of the Unicode character range into blocks.  */
++
++typedef struct
++{
++  ucs4_t start;
++  ucs4_t end;
++  const char *name;
++}
++uc_block_t;
++
++/* Return the block a character belongs to.  */
++extern const uc_block_t *
++       uc_block (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test whether a Unicode character belongs to a given block.  */
++extern bool
++       uc_is_block (ucs4_t uc, const uc_block_t *block)
++       _UC_ATTRIBUTE_PURE;
++
++/* Get the list of all blocks.  */
++extern void
++       uc_all_blocks (const uc_block_t **blocks, size_t *count);
++
++/* ========================================================================= */
++
++/* Properties taken from language standards.  */
++
++/* Test whether a Unicode character is considered whitespace in ISO C 99.  */
++extern bool
++       uc_is_c_whitespace (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test whether a Unicode character is considered whitespace in Java.  */
++extern bool
++       uc_is_java_whitespace (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++enum
++{
++  UC_IDENTIFIER_START,    /* valid as first or subsequent character */
++  UC_IDENTIFIER_VALID,    /* valid as subsequent character only */
++  UC_IDENTIFIER_INVALID,  /* not valid */
++  UC_IDENTIFIER_IGNORABLE /* ignorable (Java only) */
++};
++
++/* Return the categorization of a Unicode character w.r.t. the ISO C 99
++   identifier syntax.  */
++extern int
++       uc_c_ident_category (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Return the categorization of a Unicode character w.r.t. the Java
++   identifier syntax.  */
++extern int
++       uc_java_ident_category (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++/* Like ISO C <ctype.h> and <wctype.h>.  These functions are deprecated,
++   because this set of functions was designed with ASCII in mind and cannot
++   reflect the more diverse reality of the Unicode character set.  But they
++   can be a quick-and-dirty porting aid when migrating from wchar_t APIs
++   to Unicode strings.  */
++
++/* Test for any character for which 'uc_is_alpha' or 'uc_is_digit' is true.  */
++extern bool
++       uc_is_alnum (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any character for which 'uc_is_upper' or 'uc_is_lower' is true,
++   or any character that is one of a locale-specific set of characters for
++   which none of 'uc_is_cntrl', 'uc_is_digit', 'uc_is_punct', or 'uc_is_space'
++   is true.  */
++extern bool
++       uc_is_alpha (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any control character.  */
++extern bool
++       uc_is_cntrl (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any character that corresponds to a decimal-digit character.  */
++extern bool
++       uc_is_digit (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any character for which 'uc_is_print' is true and 'uc_is_space'
++   is false.  */
++extern bool
++       uc_is_graph (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any character that corresponds to a lowercase letter or is one
++   of a locale-specific set of characters for which none of 'uc_is_cntrl',
++   'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true.  */
++extern bool
++       uc_is_lower (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any printing character.  */
++extern bool
++       uc_is_print (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any printing character that is one of a locale-specific set of
++   characters for which neither 'uc_is_space' nor 'uc_is_alnum' is true.  */
++extern bool
++       uc_is_punct (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any character that corresponds to a locale-specific set of
++   characters for which none of 'uc_is_alnum', 'uc_is_graph', or 'uc_is_punct'
++   is true.  */
++extern bool
++       uc_is_space (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any character that corresponds to an uppercase letter or is one
++   of a locale-specific set of character for which none of 'uc_is_cntrl',
++   'uc_is_digit', 'uc_is_punct', or 'uc_is_space' is true.  */
++extern bool
++       uc_is_upper (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* Test for any character that corresponds to a hexadecimal-digit
++   character.  */
++extern bool
++       uc_is_xdigit (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* GNU extension. */
++/* Test for any character that corresponds to a standard blank character or
++   a locale-specific set of characters for which 'uc_is_alnum' is false.  */
++extern bool
++       uc_is_blank (ucs4_t uc)
++       _UC_ATTRIBUTE_CONST;
++
++/* ========================================================================= */
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _UNICTYPE_H */
+diff --git a/SMP/lib/unistring/unictype/categ_byname.h b/SMP/lib/unistring/unictype/categ_byname.h
+new file mode 100644
+index 0000000..3681715
+--- /dev/null
++++ b/SMP/lib/unistring/unictype/categ_byname.h
+@@ -0,0 +1,622 @@
++/* ANSI-C code produced by gperf version 3.0.4 */
++/* Command-line: gperf -m 10 lib/unistring/unictype/categ_byname.gperf  */
++/* Computed positions: -k'1-2,7,$' */
++
++#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
++      && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
++      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
++      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
++      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
++      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
++      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
++      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
++      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
++      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
++      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
++      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
++      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
++      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
++      && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
++      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
++      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
++      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
++      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
++      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
++      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
++      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
++      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
++/* The character set is not based on ISO-646.  */
++#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
++#endif
++
++#line 2 "lib/unistring/unictype/categ_byname.gperf"
++struct named_category { int name; unsigned int category_index; };
++
++#define TOTAL_KEYWORDS 103
++#define MIN_WORD_LENGTH 1
++#define MAX_WORD_LENGTH 21
++#define MIN_HASH_VALUE 1
++#define MAX_HASH_VALUE 150
++/* maximum key range = 150, duplicates = 0 */
++
++#ifndef GPERF_DOWNCASE
++#define GPERF_DOWNCASE 1
++static unsigned char gperf_downcase[256] =
++  {
++      0,   1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  11,  12,  13,  14,
++     15,  16,  17,  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  28,  29,
++     30,  31,  32,  33,  34,  35,  36,  37,  38,  39,  40,  41,  42,  43,  44,
++     45,  46,  47,  48,  49,  50,  51,  52,  53,  54,  55,  56,  57,  58,  59,
++     60,  61,  62,  63,  64,  97,  98,  99, 100, 101, 102, 103, 104, 105, 106,
++    107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
++    122,  91,  92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104,
++    105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
++    120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
++    135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
++    150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
++    165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
++    180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
++    195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
++    210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
++    225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
++    240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
++    255
++  };
++#endif
++
++#ifndef GPERF_CASE_STRCMP
++#define GPERF_CASE_STRCMP 1
++static int
++gperf_case_strcmp (register const char *s1, register const char *s2)
++{
++  for (;;)
++    {
++      unsigned char c1 = gperf_downcase[(unsigned char)*s1++];
++      unsigned char c2 = gperf_downcase[(unsigned char)*s2++];
++      if (c1 != 0 && c1 == c2)
++        continue;
++      return (int)c1 - (int)c2;
++    }
++}
++#endif
++
++#ifdef __GNUC__
++__inline
++#else
++#ifdef __cplusplus
++inline
++#endif
++#endif
++static unsigned int
++general_category_hash (register const char *str, register unsigned int len)
++{
++  static const unsigned char asso_values[] =
++    {
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151,   1, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151,  16, 151,   1,  66,  21,
++        9,  25, 151,  62, 151,  49,   0,  51,   4,   7,
++        6, 151,  25,  42,   5,   8, 151, 151, 151,   0,
++       45, 151, 151, 151, 151, 151, 151,  16, 151,   1,
++       66,  21,   9,  25, 151,  62, 151,  49,   0,  51,
++        4,   7,   6, 151,  25,  42,   5,   8, 151, 151,
++      151,   0,  45, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151, 151, 151, 151, 151,
++      151, 151, 151, 151, 151, 151
++    };
++  register int hval = len;
++
++  switch (hval)
++    {
++      default:
++        hval += asso_values[(unsigned char)str[6]];
++      /*FALLTHROUGH*/
++      case 6:
++      case 5:
++      case 4:
++      case 3:
++      case 2:
++        hval += asso_values[(unsigned char)str[1]];
++      /*FALLTHROUGH*/
++      case 1:
++        hval += asso_values[(unsigned char)str[0]];
++        break;
++    }
++  return hval + asso_values[(unsigned char)str[len - 1]];
++}
++
++struct general_category_stringpool_t
++  {
++    char general_category_stringpool_str1[sizeof("L")];
++    char general_category_stringpool_str2[sizeof("Ll")];
++    char general_category_stringpool_str3[sizeof("C")];
++    char general_category_stringpool_str4[sizeof("LC")];
++    char general_category_stringpool_str5[sizeof("Cc")];
++    char general_category_stringpool_str6[sizeof("Nl")];
++    char general_category_stringpool_str9[sizeof("N")];
++    char general_category_stringpool_str10[sizeof("Pc")];
++    char general_category_stringpool_str11[sizeof("Cn")];
++    char general_category_stringpool_str12[sizeof("Lt")];
++    char general_category_stringpool_str13[sizeof("P")];
++    char general_category_stringpool_str15[sizeof("Control")];
++    char general_category_stringpool_str16[sizeof("Lo")];
++    char general_category_stringpool_str17[sizeof("Co")];
++    char general_category_stringpool_str18[sizeof("Lu")];
++    char general_category_stringpool_str20[sizeof("No")];
++    char general_category_stringpool_str21[sizeof("Cf")];
++    char general_category_stringpool_str22[sizeof("Po")];
++    char general_category_stringpool_str23[sizeof("OtherSymbol")];
++    char general_category_stringpool_str24[sizeof("CurrencySymbol")];
++    char general_category_stringpool_str25[sizeof("Currency Symbol")];
++    char general_category_stringpool_str26[sizeof("Pf")];
++    char general_category_stringpool_str27[sizeof("Format")];
++    char general_category_stringpool_str28[sizeof("Close Punctuation")];
++    char general_category_stringpool_str29[sizeof("ClosePunctuation")];
++    char general_category_stringpool_str36[sizeof("OpenPunctuation")];
++    char general_category_stringpool_str37[sizeof("ConnectorPunctuation")];
++    char general_category_stringpool_str38[sizeof("Connector Punctuation")];
++    char general_category_stringpool_str39[sizeof("Other Punctuation")];
++    char general_category_stringpool_str40[sizeof("OtherPunctuation")];
++    char general_category_stringpool_str41[sizeof("Open Punctuation")];
++    char general_category_stringpool_str42[sizeof("Other")];
++    char general_category_stringpool_str43[sizeof("Number")];
++    char general_category_stringpool_str45[sizeof("Punctuation")];
++    char general_category_stringpool_str46[sizeof("Sc")];
++    char general_category_stringpool_str47[sizeof("Zl")];
++    char general_category_stringpool_str48[sizeof("Symbol")];
++    char general_category_stringpool_str49[sizeof("Other Letter")];
++    char general_category_stringpool_str50[sizeof("Pe")];
++    char general_category_stringpool_str52[sizeof("Letter")];
++    char general_category_stringpool_str53[sizeof("Other Number")];
++    char general_category_stringpool_str54[sizeof("Cased Letter")];
++    char general_category_stringpool_str55[sizeof("Mc")];
++    char general_category_stringpool_str56[sizeof("OtherNumber")];
++    char general_category_stringpool_str58[sizeof("So")];
++    char general_category_stringpool_str59[sizeof("Zp")];
++    char general_category_stringpool_str60[sizeof("Letter Number")];
++    char general_category_stringpool_str61[sizeof("Mn")];
++    char general_category_stringpool_str62[sizeof("LetterNumber")];
++    char general_category_stringpool_str63[sizeof("LowercaseLetter")];
++    char general_category_stringpool_str64[sizeof("Lowercase Letter")];
++    char general_category_stringpool_str66[sizeof("Other Symbol")];
++    char general_category_stringpool_str69[sizeof("OtherLetter")];
++    char general_category_stringpool_str70[sizeof("UppercaseLetter")];
++    char general_category_stringpool_str71[sizeof("Uppercase Letter")];
++    char general_category_stringpool_str74[sizeof("CasedLetter")];
++    char general_category_stringpool_str75[sizeof("NonspacingMark")];
++    char general_category_stringpool_str76[sizeof("Nonspacing Mark")];
++    char general_category_stringpool_str78[sizeof("Math Symbol")];
++    char general_category_stringpool_str81[sizeof("ParagraphSeparator")];
++    char general_category_stringpool_str82[sizeof("Paragraph Separator")];
++    char general_category_stringpool_str83[sizeof("PrivateUse")];
++    char general_category_stringpool_str84[sizeof("Private Use")];
++    char general_category_stringpool_str85[sizeof("S")];
++    char general_category_stringpool_str87[sizeof("Cs")];
++    char general_category_stringpool_str88[sizeof("InitialPunctuation")];
++    char general_category_stringpool_str89[sizeof("Initial Punctuation")];
++    char general_category_stringpool_str91[sizeof("Z")];
++    char general_category_stringpool_str92[sizeof("Ps")];
++    char general_category_stringpool_str93[sizeof("ModifierSymbol")];
++    char general_category_stringpool_str94[sizeof("Modifier Symbol")];
++    char general_category_stringpool_str95[sizeof("Me")];
++    char general_category_stringpool_str96[sizeof("Surrogate")];
++    char general_category_stringpool_str98[sizeof("Final Punctuation")];
++    char general_category_stringpool_str99[sizeof("FinalPunctuation")];
++    char general_category_stringpool_str102[sizeof("Separator")];
++    char general_category_stringpool_str103[sizeof("M")];
++    char general_category_stringpool_str104[sizeof("Lm")];
++    char general_category_stringpool_str105[sizeof("DashPunctuation")];
++    char general_category_stringpool_str106[sizeof("LineSeparator")];
++    char general_category_stringpool_str108[sizeof("SpaceSeparator")];
++    char general_category_stringpool_str110[sizeof("Dash Punctuation")];
++    char general_category_stringpool_str113[sizeof("Unassigned")];
++    char general_category_stringpool_str118[sizeof("ModifierLetter")];
++    char general_category_stringpool_str119[sizeof("Modifier Letter")];
++    char general_category_stringpool_str120[sizeof("Mark")];
++    char general_category_stringpool_str122[sizeof("Line Separator")];
++    char general_category_stringpool_str123[sizeof("TitlecaseLetter")];
++    char general_category_stringpool_str124[sizeof("Titlecase Letter")];
++    char general_category_stringpool_str125[sizeof("DecimalNumber")];
++    char general_category_stringpool_str126[sizeof("Decimal Number")];
++    char general_category_stringpool_str128[sizeof("MathSymbol")];
++    char general_category_stringpool_str130[sizeof("Space Separator")];
++    char general_category_stringpool_str131[sizeof("Zs")];
++    char general_category_stringpool_str132[sizeof("Pi")];
++    char general_category_stringpool_str133[sizeof("SpacingMark")];
++    char general_category_stringpool_str134[sizeof("Spacing Mark")];
++    char general_category_stringpool_str138[sizeof("Nd")];
++    char general_category_stringpool_str140[sizeof("Pd")];
++    char general_category_stringpool_str142[sizeof("Sk")];
++    char general_category_stringpool_str146[sizeof("Sm")];
++    char general_category_stringpool_str149[sizeof("EnclosingMark")];
++    char general_category_stringpool_str150[sizeof("Enclosing Mark")];
++  };
++static const struct general_category_stringpool_t general_category_stringpool_contents =
++  {
++    "L",
++    "Ll",
++    "C",
++    "LC",
++    "Cc",
++    "Nl",
++    "N",
++    "Pc",
++    "Cn",
++    "Lt",
++    "P",
++    "Control",
++    "Lo",
++    "Co",
++    "Lu",
++    "No",
++    "Cf",
++    "Po",
++    "OtherSymbol",
++    "CurrencySymbol",
++    "Currency Symbol",
++    "Pf",
++    "Format",
++    "Close Punctuation",
++    "ClosePunctuation",
++    "OpenPunctuation",
++    "ConnectorPunctuation",
++    "Connector Punctuation",
++    "Other Punctuation",
++    "OtherPunctuation",
++    "Open Punctuation",
++    "Other",
++    "Number",
++    "Punctuation",
++    "Sc",
++    "Zl",
++    "Symbol",
++    "Other Letter",
++    "Pe",
++    "Letter",
++    "Other Number",
++    "Cased Letter",
++    "Mc",
++    "OtherNumber",
++    "So",
++    "Zp",
++    "Letter Number",
++    "Mn",
++    "LetterNumber",
++    "LowercaseLetter",
++    "Lowercase Letter",
++    "Other Symbol",
++    "OtherLetter",
++    "UppercaseLetter",
++    "Uppercase Letter",
++    "CasedLetter",
++    "NonspacingMark",
++    "Nonspacing Mark",
++    "Math Symbol",
++    "ParagraphSeparator",
++    "Paragraph Separator",
++    "PrivateUse",
++    "Private Use",
++    "S",
++    "Cs",
++    "InitialPunctuation",
++    "Initial Punctuation",
++    "Z",
++    "Ps",
++    "ModifierSymbol",
++    "Modifier Symbol",
++    "Me",
++    "Surrogate",
++    "Final Punctuation",
++    "FinalPunctuation",
++    "Separator",
++    "M",
++    "Lm",
++    "DashPunctuation",
++    "LineSeparator",
++    "SpaceSeparator",
++    "Dash Punctuation",
++    "Unassigned",
++    "ModifierLetter",
++    "Modifier Letter",
++    "Mark",
++    "Line Separator",
++    "TitlecaseLetter",
++    "Titlecase Letter",
++    "DecimalNumber",
++    "Decimal Number",
++    "MathSymbol",
++    "Space Separator",
++    "Zs",
++    "Pi",
++    "SpacingMark",
++    "Spacing Mark",
++    "Nd",
++    "Pd",
++    "Sk",
++    "Sm",
++    "EnclosingMark",
++    "Enclosing Mark"
++  };
++#define general_category_stringpool ((const char *) &general_category_stringpool_contents)
++
++static const struct named_category general_category_names[] =
++  {
++    {-1},
++#line 14 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str1, UC_CATEGORY_INDEX_L},
++#line 17 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str2, UC_CATEGORY_INDEX_Ll},
++#line 46 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str3, UC_CATEGORY_INDEX_C},
++#line 15 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str4, UC_CATEGORY_INDEX_LC},
++#line 47 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str5, UC_CATEGORY_INDEX_Cc},
++#line 27 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str6, UC_CATEGORY_INDEX_Nl},
++    {-1}, {-1},
++#line 25 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str9, UC_CATEGORY_INDEX_N},
++#line 30 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str10, UC_CATEGORY_INDEX_Pc},
++#line 51 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str11, UC_CATEGORY_INDEX_Cn},
++#line 18 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str12, UC_CATEGORY_INDEX_Lt},
++#line 29 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str13, UC_CATEGORY_INDEX_P},
++    {-1},
++#line 111 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str15, UC_CATEGORY_INDEX_Cc},
++#line 20 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str16, UC_CATEGORY_INDEX_Lo},
++#line 50 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str17, UC_CATEGORY_INDEX_Co},
++#line 16 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str18, UC_CATEGORY_INDEX_Lu},
++    {-1},
++#line 28 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str20, UC_CATEGORY_INDEX_No},
++#line 48 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str21, UC_CATEGORY_INDEX_Cf},
++#line 36 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str22, UC_CATEGORY_INDEX_Po},
++#line 102 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str23, UC_CATEGORY_INDEX_So},
++#line 98 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str24, UC_CATEGORY_INDEX_Sc},
++#line 97 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str25, UC_CATEGORY_INDEX_Sc},
++#line 35 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str26, UC_CATEGORY_INDEX_Pf},
++#line 112 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str27, UC_CATEGORY_INDEX_Cf},
++#line 86 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str28, UC_CATEGORY_INDEX_Pe},
++#line 87 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str29, UC_CATEGORY_INDEX_Pe},
++    {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
++#line 85 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str36, UC_CATEGORY_INDEX_Ps},
++#line 81 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str37, UC_CATEGORY_INDEX_Pc},
++#line 80 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str38, UC_CATEGORY_INDEX_Pc},
++#line 92 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str39, UC_CATEGORY_INDEX_Po},
++#line 93 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str40, UC_CATEGORY_INDEX_Po},
++#line 84 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str41, UC_CATEGORY_INDEX_Ps},
++#line 110 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str42, UC_CATEGORY_INDEX_C},
++#line 72 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str43, UC_CATEGORY_INDEX_N},
++    {-1},
++#line 79 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str45, UC_CATEGORY_INDEX_P},
++#line 39 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str46, UC_CATEGORY_INDEX_Sc},
++#line 44 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str47, UC_CATEGORY_INDEX_Zl},
++#line 94 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str48, UC_CATEGORY_INDEX_S},
++#line 63 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str49, UC_CATEGORY_INDEX_Lo},
++#line 33 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str50, UC_CATEGORY_INDEX_Pe},
++    {-1},
++#line 52 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str52, UC_CATEGORY_INDEX_L},
++#line 77 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str53, UC_CATEGORY_INDEX_No},
++#line 53 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str54, UC_CATEGORY_INDEX_LC},
++#line 23 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str55, UC_CATEGORY_INDEX_Mc},
++#line 78 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str56, UC_CATEGORY_INDEX_No},
++    {-1},
++#line 41 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str58, UC_CATEGORY_INDEX_So},
++#line 45 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str59, UC_CATEGORY_INDEX_Zp},
++#line 75 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str60, UC_CATEGORY_INDEX_Nl},
++#line 22 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str61, UC_CATEGORY_INDEX_Mn},
++#line 76 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str62, UC_CATEGORY_INDEX_Nl},
++#line 58 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str63, UC_CATEGORY_INDEX_Ll},
++#line 57 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str64, UC_CATEGORY_INDEX_Ll},
++    {-1},
++#line 101 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str66, UC_CATEGORY_INDEX_So},
++    {-1}, {-1},
++#line 64 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str69, UC_CATEGORY_INDEX_Lo},
++#line 56 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str70, UC_CATEGORY_INDEX_Lu},
++#line 55 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str71, UC_CATEGORY_INDEX_Lu},
++    {-1}, {-1},
++#line 54 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str74, UC_CATEGORY_INDEX_LC},
++#line 67 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str75, UC_CATEGORY_INDEX_Mn},
++#line 66 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str76, UC_CATEGORY_INDEX_Mn},
++    {-1},
++#line 95 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str78, UC_CATEGORY_INDEX_Sm},
++    {-1}, {-1},
++#line 109 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str81, UC_CATEGORY_INDEX_Zp},
++#line 108 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str82, UC_CATEGORY_INDEX_Zp},
++#line 115 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str83, UC_CATEGORY_INDEX_Co},
++#line 114 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str84, UC_CATEGORY_INDEX_Co},
++#line 37 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str85, UC_CATEGORY_INDEX_S},
++    {-1},
++#line 49 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str87, UC_CATEGORY_INDEX_Cs},
++#line 89 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str88, UC_CATEGORY_INDEX_Pi},
++#line 88 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str89, UC_CATEGORY_INDEX_Pi},
++    {-1},
++#line 42 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str91, UC_CATEGORY_INDEX_Z},
++#line 32 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str92, UC_CATEGORY_INDEX_Ps},
++#line 100 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str93, UC_CATEGORY_INDEX_Sk},
++#line 99 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str94, UC_CATEGORY_INDEX_Sk},
++#line 24 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str95, UC_CATEGORY_INDEX_Me},
++#line 113 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str96, UC_CATEGORY_INDEX_Cs},
++    {-1},
++#line 90 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str98, UC_CATEGORY_INDEX_Pf},
++#line 91 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str99, UC_CATEGORY_INDEX_Pf},
++    {-1}, {-1},
++#line 103 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str102, UC_CATEGORY_INDEX_Z},
++#line 21 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str103, UC_CATEGORY_INDEX_M},
++#line 19 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str104, UC_CATEGORY_INDEX_Lm},
++#line 83 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str105, UC_CATEGORY_INDEX_Pd},
++#line 107 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str106, UC_CATEGORY_INDEX_Zl},
++    {-1},
++#line 105 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str108, UC_CATEGORY_INDEX_Zs},
++    {-1},
++#line 82 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str110, UC_CATEGORY_INDEX_Pd},
++    {-1}, {-1},
++#line 116 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str113, UC_CATEGORY_INDEX_Cn},
++    {-1}, {-1}, {-1}, {-1},
++#line 62 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str118, UC_CATEGORY_INDEX_Lm},
++#line 61 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str119, UC_CATEGORY_INDEX_Lm},
++#line 65 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str120, UC_CATEGORY_INDEX_M},
++    {-1},
++#line 106 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str122, UC_CATEGORY_INDEX_Zl},
++#line 60 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str123, UC_CATEGORY_INDEX_Lt},
++#line 59 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str124, UC_CATEGORY_INDEX_Lt},
++#line 74 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str125, UC_CATEGORY_INDEX_Nd},
++#line 73 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str126, UC_CATEGORY_INDEX_Nd},
++    {-1},
++#line 96 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str128, UC_CATEGORY_INDEX_Sm},
++    {-1},
++#line 104 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str130, UC_CATEGORY_INDEX_Zs},
++#line 43 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str131, UC_CATEGORY_INDEX_Zs},
++#line 34 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str132, UC_CATEGORY_INDEX_Pi},
++#line 69 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str133, UC_CATEGORY_INDEX_Mc},
++#line 68 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str134, UC_CATEGORY_INDEX_Mc},
++    {-1}, {-1}, {-1},
++#line 26 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str138, UC_CATEGORY_INDEX_Nd},
++    {-1},
++#line 31 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str140, UC_CATEGORY_INDEX_Pd},
++    {-1},
++#line 40 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str142, UC_CATEGORY_INDEX_Sk},
++    {-1}, {-1}, {-1},
++#line 38 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str146, UC_CATEGORY_INDEX_Sm},
++    {-1}, {-1},
++#line 71 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str149, UC_CATEGORY_INDEX_Me},
++#line 70 "lib/unistring/unictype/categ_byname.gperf"
++    {(int)(long)&((struct general_category_stringpool_t *)0)->general_category_stringpool_str150, UC_CATEGORY_INDEX_Me}
++  };
++
++#ifdef __GNUC__
++__inline
++#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
++__attribute__ ((__gnu_inline__))
++#endif
++#endif
++const struct named_category *
++uc_general_category_lookup (register const char *str, register unsigned int len)
++{
++  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
++    {
++      register int key = general_category_hash (str, len);
++
++      if (key <= MAX_HASH_VALUE && key >= 0)
++        {
++          register int o = general_category_names[key].name;
++          if (o >= 0)
++            {
++              register const char *s = o + general_category_stringpool;
++
++              if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strcmp (str, s))
++                return &general_category_names[key];
++            }
++        }
++    }
++  return 0;
++}
+diff --git a/SMP/lib/unistring/uninorm.h b/SMP/lib/unistring/uninorm.h
+new file mode 100644
+index 0000000..9c15471
+--- /dev/null
++++ b/SMP/lib/unistring/uninorm.h
+@@ -0,0 +1,258 @@
++/* Normalization forms (composition and decomposition) of Unicode strings.
++   Copyright (C) 2001-2002, 2009-2016 Free Software Foundation, Inc.
++   Written by Bruno Haible <bruno@clisp.org>, 2009.
++
++   This program is free software: you can redistribute it and/or modify it
++   under the terms of either:
++
++    * the GNU Lesser General Public License as published
++   by the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   or
++
++   * the GNU General Public License as published by the Free
++   Software Foundation; either version 2 of the License, or
++   (at your option) any later version.
++
++   or both in parallel, as here.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
++
++#ifndef _UNINORM_H
++#define _UNINORM_H
++
++/* Get size_t.  */
++#include <stddef.h>
++
++#include "unitypes.h"
++
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/* Conventions:
++
++   All functions prefixed with u8_ operate on UTF-8 encoded strings.
++   Their unit is an uint8_t (1 byte).
++
++   All functions prefixed with u16_ operate on UTF-16 encoded strings.
++   Their unit is an uint16_t (a 2-byte word).
++
++   All functions prefixed with u32_ operate on UCS-4 encoded strings.
++   Their unit is an uint32_t (a 4-byte word).
++
++   All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
++   n units.
++
++   Functions returning a string result take a (resultbuf, lengthp) argument
++   pair.  If resultbuf is not NULL and the result fits into *lengthp units,
++   it is put in resultbuf, and resultbuf is returned.  Otherwise, a freshly
++   allocated string is returned.  In both cases, *lengthp is set to the
++   length (number of units) of the returned string.  In case of error,
++   NULL is returned and errno is set.  */
++
++
++enum
++{
++  UC_DECOMP_CANONICAL,/*            Canonical decomposition.                  */
++  UC_DECOMP_FONT,    /*   <font>    A font variant (e.g. a blackletter form). */
++  UC_DECOMP_NOBREAK, /* <noBreak>   A no-break version of a space or hyphen.  */
++  UC_DECOMP_INITIAL, /* <initial>   An initial presentation form (Arabic).    */
++  UC_DECOMP_MEDIAL,  /*  <medial>   A medial presentation form (Arabic).      */
++  UC_DECOMP_FINAL,   /*  <final>    A final presentation form (Arabic).       */
++  UC_DECOMP_ISOLATED,/* <isolated>  An isolated presentation form (Arabic).   */
++  UC_DECOMP_CIRCLE,  /*  <circle>   An encircled form.                        */
++  UC_DECOMP_SUPER,   /*  <super>    A superscript form.                       */
++  UC_DECOMP_SUB,     /*   <sub>     A subscript form.                         */
++  UC_DECOMP_VERTICAL,/* <vertical>  A vertical layout presentation form.      */
++  UC_DECOMP_WIDE,    /*   <wide>    A wide (or zenkaku) compatibility character. */
++  UC_DECOMP_NARROW,  /*  <narrow>   A narrow (or hankaku) compatibility character. */
++  UC_DECOMP_SMALL,   /*  <small>    A small variant form (CNS compatibility). */
++  UC_DECOMP_SQUARE,  /*  <square>   A CJK squared font variant.               */
++  UC_DECOMP_FRACTION,/* <fraction>  A vulgar fraction form.                   */
++  UC_DECOMP_COMPAT   /*  <compat>   Otherwise unspecified compatibility character. */
++};
++
++/* Maximum size of decomposition of a single Unicode character.  */
++#define UC_DECOMPOSITION_MAX_LENGTH 32
++
++/* Return the character decomposition mapping of a Unicode character.
++   DECOMPOSITION must point to an array of at least UC_DECOMPOSITION_MAX_LENGTH
++   ucs_t elements.
++   When a decomposition exists, DECOMPOSITION[0..N-1] and *DECOMP_TAG are
++   filled and N is returned.  Otherwise -1 is returned.  */
++extern int
++       uc_decomposition (ucs4_t uc, int *decomp_tag, ucs4_t *decomposition);
++
++/* Return the canonical character decomposition mapping of a Unicode character.
++   DECOMPOSITION must point to an array of at least UC_DECOMPOSITION_MAX_LENGTH
++   ucs_t elements.
++   When a decomposition exists, DECOMPOSITION[0..N-1] is filled and N is
++   returned.  Otherwise -1 is returned.  */
++extern int
++       uc_canonical_decomposition (ucs4_t uc, ucs4_t *decomposition);
++
++
++/* Attempt to combine the Unicode characters uc1, uc2.
++   uc1 is known to have canonical combining class 0.
++   Return the combination of uc1 and uc2, if it exists.
++   Return 0 otherwise.
++   Not all decompositions can be recombined using this function.  See the
++   Unicode file CompositionExclusions.txt for details.  */
++extern ucs4_t
++       uc_composition (ucs4_t uc1, ucs4_t uc2)
++       _UC_ATTRIBUTE_CONST;
++
++
++/* An object of type uninorm_t denotes a Unicode normalization form.  */
++struct unicode_normalization_form;
++typedef const struct unicode_normalization_form *uninorm_t;
++
++/* UNINORM_NFD: Normalization form D: canonical decomposition.  */
++extern const struct unicode_normalization_form uninorm_nfd;
++#define UNINORM_NFD (&uninorm_nfd)
++
++/* UNINORM_NFC: Normalization form C: canonical decomposition, then
++   canonical composition.  */
++extern const struct unicode_normalization_form uninorm_nfc;
++#define UNINORM_NFC (&uninorm_nfc)
++
++/* UNINORM_NFKD: Normalization form KD: compatibility decomposition.  */
++extern const struct unicode_normalization_form uninorm_nfkd;
++#define UNINORM_NFKD (&uninorm_nfkd)
++
++/* UNINORM_NFKC: Normalization form KC: compatibility decomposition, then
++   canonical composition.  */
++extern const struct unicode_normalization_form uninorm_nfkc;
++#define UNINORM_NFKC (&uninorm_nfkc)
++
++/* Test whether a normalization form does compatibility decomposition.  */
++#define uninorm_is_compat_decomposing(nf) \
++  ((* (const unsigned int *) (nf) >> 0) & 1)
++
++/* Test whether a normalization form includes canonical composition.  */
++#define uninorm_is_composing(nf) \
++  ((* (const unsigned int *) (nf) >> 1) & 1)
++
++/* Return the decomposing variant of a normalization form.
++   This maps NFC,NFD -> NFD and NFKC,NFKD -> NFKD.  */
++extern uninorm_t
++       uninorm_decomposing_form (uninorm_t nf)
++       _UC_ATTRIBUTE_PURE;
++
++
++/* Return the specified normalization form of a string.  */
++extern uint8_t *
++       u8_normalize (uninorm_t nf, const uint8_t *s, size_t n,
++                     uint8_t *resultbuf, size_t *lengthp);
++extern uint16_t *
++       u16_normalize (uninorm_t nf, const uint16_t *s, size_t n,
++                      uint16_t *resultbuf, size_t *lengthp);
++extern uint32_t *
++       u32_normalize (uninorm_t nf, const uint32_t *s, size_t n,
++                      uint32_t *resultbuf, size_t *lengthp);
++
++
++/* Compare S1 and S2, ignoring differences in normalization.
++   NF must be either UNINORM_NFD or UNINORM_NFKD.
++   If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
++   return 0.  Upon failure, return -1 with errno set.  */
++extern int
++       u8_normcmp (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2,
++                   uninorm_t nf, int *resultp);
++extern int
++       u16_normcmp (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2,
++                    uninorm_t nf, int *resultp);
++extern int
++       u32_normcmp (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2,
++                    uninorm_t nf, int *resultp);
++
++
++/* Converts the string S of length N to a NUL-terminated byte sequence, in such
++   a way that comparing uN_normxfrm (S1) and uN_normxfrm (S2) with uN_cmp2() is
++   equivalent to comparing S1 and S2 with uN_normcoll().
++   NF must be either UNINORM_NFC or UNINORM_NFKC.  */
++extern char *
++       u8_normxfrm (const uint8_t *s, size_t n, uninorm_t nf,
++                    char *resultbuf, size_t *lengthp);
++extern char *
++       u16_normxfrm (const uint16_t *s, size_t n, uninorm_t nf,
++                     char *resultbuf, size_t *lengthp);
++extern char *
++       u32_normxfrm (const uint32_t *s, size_t n, uninorm_t nf,
++                     char *resultbuf, size_t *lengthp);
++
++
++/* Compare S1 and S2, ignoring differences in normalization, using the
++   collation rules of the current locale.
++   NF must be either UNINORM_NFC or UNINORM_NFKC.
++   If successful, set *RESULTP to -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2, and
++   return 0.  Upon failure, return -1 with errno set.  */
++extern int
++       u8_normcoll (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2,
++                    uninorm_t nf, int *resultp);
++extern int
++       u16_normcoll (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2,
++                     uninorm_t nf, int *resultp);
++extern int
++       u32_normcoll (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2,
++                     uninorm_t nf, int *resultp);
++
++
++/* Normalization of a stream of Unicode characters.
++
++   A "stream of Unicode characters" is essentially a function that accepts an
++   ucs4_t argument repeatedly, optionally combined with a function that
++   "flushes" the stream.  */
++
++/* Data type of a stream of Unicode characters that normalizes its input
++   according to a given normalization form and passes the normalized character
++   sequence to the encapsulated stream of Unicode characters.  */
++struct uninorm_filter;
++
++/* Create and return a normalization filter for Unicode characters.
++   The pair (stream_func, stream_data) is the encapsulated stream.
++   stream_func (stream_data, uc) receives the Unicode character uc
++   and returns 0 if successful, or -1 with errno set upon failure.
++   Return the new filter, or NULL with errno set upon failure.  */
++extern struct uninorm_filter *
++       uninorm_filter_create (uninorm_t nf,
++                              int (*stream_func) (void *stream_data, ucs4_t uc),
++                              void *stream_data);
++
++/* Stuff a Unicode character into a normalizing filter.
++   Return 0 if successful, or -1 with errno set upon failure.  */
++extern int
++       uninorm_filter_write (struct uninorm_filter *filter, ucs4_t uc);
++
++/* Bring data buffered in the filter to its destination, the encapsulated
++   stream.
++   Return 0 if successful, or -1 with errno set upon failure.
++   Note! If after calling this function, additional characters are written
++   into the filter, the resulting character sequence in the encapsulated stream
++   will not necessarily be normalized.  */
++extern int
++       uninorm_filter_flush (struct uninorm_filter *filter);
++
++/* Bring data buffered in the filter to its destination, the encapsulated
++   stream, then close and free the filter.
++   Return 0 if successful, or -1 with errno set upon failure.  */
++extern int
++       uninorm_filter_free (struct uninorm_filter *filter);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++
++#endif /* _UNINORM_H */
+diff --git a/SMP/lib/unistring/unistr.h b/SMP/lib/unistring/unistr.h
+new file mode 100644
+index 0000000..4619fa8
+--- /dev/null
++++ b/SMP/lib/unistring/unistr.h
+@@ -0,0 +1,756 @@
++/* Elementary Unicode string functions.
++   Copyright (C) 2001-2002, 2005-2016 Free Software Foundation, Inc.
++
++   This program is free software: you can redistribute it and/or modify it
++   under the terms of either:
++
++    * the GNU Lesser General Public License as published
++   by the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   or
++
++   * the GNU General Public License as published by the Free
++   Software Foundation; either version 2 of the License, or
++   (at your option) any later version.
++
++   or both in parallel, as here.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
++
++#ifndef _UNISTR_H
++#define _UNISTR_H
++
++#include "unitypes.h"
++
++/* Get common macros for C.  */
++#include "unused-parameter.h"
++
++/* Get bool.  */
++#include <stdbool.h>
++
++/* Get size_t.  */
++#include <stddef.h>
++
++#ifdef __cplusplus
++extern "C" {
++#endif
++
++
++/* Conventions:
++
++   All functions prefixed with u8_ operate on UTF-8 encoded strings.
++   Their unit is an uint8_t (1 byte).
++
++   All functions prefixed with u16_ operate on UTF-16 encoded strings.
++   Their unit is an uint16_t (a 2-byte word).
++
++   All functions prefixed with u32_ operate on UCS-4 encoded strings.
++   Their unit is an uint32_t (a 4-byte word).
++
++   All argument pairs (s, n) denote a Unicode string s[0..n-1] with exactly
++   n units.
++
++   All arguments starting with "str" and the arguments of functions starting
++   with u8_str/u16_str/u32_str denote a NUL terminated string, i.e. a string
++   which terminates at the first NUL unit.  This termination unit is
++   considered part of the string for all memory allocation purposes, but
++   is not considered part of the string for all other logical purposes.
++
++   Functions returning a string result take a (resultbuf, lengthp) argument
++   pair.  If resultbuf is not NULL and the result fits into *lengthp units,
++   it is put in resultbuf, and resultbuf is returned.  Otherwise, a freshly
++   allocated string is returned.  In both cases, *lengthp is set to the
++   length (number of units) of the returned string.  In case of error,
++   NULL is returned and errno is set.  */
++
++
++/* Elementary string checks.  */
++
++/* Check whether an UTF-8 string is well-formed.
++   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
++extern const uint8_t *
++       u8_check (const uint8_t *s, size_t n)
++       _UC_ATTRIBUTE_PURE;
++
++/* Check whether an UTF-16 string is well-formed.
++   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
++extern const uint16_t *
++       u16_check (const uint16_t *s, size_t n)
++       _UC_ATTRIBUTE_PURE;
++
++/* Check whether an UCS-4 string is well-formed.
++   Return NULL if valid, or a pointer to the first invalid unit otherwise.  */
++extern const uint32_t *
++       u32_check (const uint32_t *s, size_t n)
++       _UC_ATTRIBUTE_PURE;
++
++
++/* Elementary string conversions.  */
++
++/* Convert an UTF-8 string to an UTF-16 string.  */
++extern uint16_t *
++       u8_to_u16 (const uint8_t *s, size_t n, uint16_t *resultbuf,
++                  size_t *lengthp);
++
++/* Convert an UTF-8 string to an UCS-4 string.  */
++extern uint32_t *
++       u8_to_u32 (const uint8_t *s, size_t n, uint32_t *resultbuf,
++                  size_t *lengthp);
++
++/* Convert an UTF-16 string to an UTF-8 string.  */
++extern uint8_t *
++       u16_to_u8 (const uint16_t *s, size_t n, uint8_t *resultbuf,
++                  size_t *lengthp);
++
++/* Convert an UTF-16 string to an UCS-4 string.  */
++extern uint32_t *
++       u16_to_u32 (const uint16_t *s, size_t n, uint32_t *resultbuf,
++                   size_t *lengthp);
++
++/* Convert an UCS-4 string to an UTF-8 string.  */
++extern uint8_t *
++       u32_to_u8 (const uint32_t *s, size_t n, uint8_t *resultbuf,
++                  size_t *lengthp);
++
++/* Convert an UCS-4 string to an UTF-16 string.  */
++extern uint16_t *
++       u32_to_u16 (const uint32_t *s, size_t n, uint16_t *resultbuf,
++                   size_t *lengthp);
++
++
++/* Elementary string functions.  */
++
++/* Return the length (number of units) of the first character in S, which is
++   no longer than N.  Return 0 if it is the NUL character.  Return -1 upon
++   failure.  */
++/* Similar to mblen(), except that s must not be NULL.  */
++extern int
++       u8_mblen (const uint8_t *s, size_t n)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u16_mblen (const uint16_t *s, size_t n)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u32_mblen (const uint32_t *s, size_t n)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the length (number of units) of the first character in S, putting
++   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
++   and an appropriate number of units is returned.
++   The number of available units, N, must be > 0.  */
++/* Similar to mbtowc(), except that puc and s must not be NULL, n must be > 0,
++   and the NUL character is not treated specially.  */
++/* The variants with _safe suffix are safe, even if the library is compiled
++   without --enable-safety.  */
++
++#if GNULIB_UNISTR_U8_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
++# if !HAVE_INLINE
++extern int
++       u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n);
++# else
++extern int
++       u8_mbtouc_unsafe_aux (ucs4_t *puc, const uint8_t *s, size_t n);
++static inline int
++u8_mbtouc_unsafe (ucs4_t *puc, const uint8_t *s, size_t n)
++{
++  uint8_t c = *s;
++
++  if (c < 0x80)
++    {
++      *puc = c;
++      return 1;
++    }
++  else
++    return u8_mbtouc_unsafe_aux (puc, s, n);
++}
++# endif
++#endif
++
++#if GNULIB_UNISTR_U16_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
++# if !HAVE_INLINE
++extern int
++       u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n);
++# else
++extern int
++       u16_mbtouc_unsafe_aux (ucs4_t *puc, const uint16_t *s, size_t n);
++static inline int
++u16_mbtouc_unsafe (ucs4_t *puc, const uint16_t *s, size_t n)
++{
++  uint16_t c = *s;
++
++  if (c < 0xd800 || c >= 0xe000)
++    {
++      *puc = c;
++      return 1;
++    }
++  else
++    return u16_mbtouc_unsafe_aux (puc, s, n);
++}
++# endif
++#endif
++
++#if GNULIB_UNISTR_U32_MBTOUC_UNSAFE || HAVE_LIBUNISTRING
++# if !HAVE_INLINE
++extern int
++       u32_mbtouc_unsafe (ucs4_t *puc, const uint32_t *s, size_t n);
++# else
++static inline int
++u32_mbtouc_unsafe (ucs4_t *puc,
++                   const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
++{
++  uint32_t c = *s;
++
++  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
++    *puc = c;
++  else
++    /* invalid multibyte character */
++    *puc = 0xfffd;
++  return 1;
++}
++# endif
++#endif
++
++#if GNULIB_UNISTR_U8_MBTOUC || HAVE_LIBUNISTRING
++# if !HAVE_INLINE
++extern int
++       u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n);
++# else
++extern int
++       u8_mbtouc_aux (ucs4_t *puc, const uint8_t *s, size_t n);
++static inline int
++u8_mbtouc (ucs4_t *puc, const uint8_t *s, size_t n)
++{
++  uint8_t c = *s;
++
++  if (c < 0x80)
++    {
++      *puc = c;
++      return 1;
++    }
++  else
++    return u8_mbtouc_aux (puc, s, n);
++}
++# endif
++#endif
++
++#if GNULIB_UNISTR_U16_MBTOUC || HAVE_LIBUNISTRING
++# if !HAVE_INLINE
++extern int
++       u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n);
++# else
++extern int
++       u16_mbtouc_aux (ucs4_t *puc, const uint16_t *s, size_t n);
++static inline int
++u16_mbtouc (ucs4_t *puc, const uint16_t *s, size_t n)
++{
++  uint16_t c = *s;
++
++  if (c < 0xd800 || c >= 0xe000)
++    {
++      *puc = c;
++      return 1;
++    }
++  else
++    return u16_mbtouc_aux (puc, s, n);
++}
++# endif
++#endif
++
++#if GNULIB_UNISTR_U32_MBTOUC || HAVE_LIBUNISTRING
++# if !HAVE_INLINE
++extern int
++       u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n);
++# else
++static inline int
++u32_mbtouc (ucs4_t *puc, const uint32_t *s, size_t n _GL_UNUSED_PARAMETER)
++{
++  uint32_t c = *s;
++
++  if (c < 0xd800 || (c >= 0xe000 && c < 0x110000))
++    *puc = c;
++  else
++    /* invalid multibyte character */
++    *puc = 0xfffd;
++  return 1;
++}
++# endif
++#endif
++
++/* Return the length (number of units) of the first character in S, putting
++   its 'ucs4_t' representation in *PUC.  Upon failure, *PUC is set to 0xfffd,
++   and -1 is returned for an invalid sequence of units, -2 is returned for an
++   incomplete sequence of units.
++   The number of available units, N, must be > 0.  */
++/* Similar to u*_mbtouc(), except that the return value gives more details
++   about the failure, similar to mbrtowc().  */
++
++#if GNULIB_UNISTR_U8_MBTOUCR || HAVE_LIBUNISTRING
++extern int
++       u8_mbtoucr (ucs4_t *puc, const uint8_t *s, size_t n);
++#endif
++
++#if GNULIB_UNISTR_U16_MBTOUCR || HAVE_LIBUNISTRING
++extern int
++       u16_mbtoucr (ucs4_t *puc, const uint16_t *s, size_t n);
++#endif
++
++#if GNULIB_UNISTR_U32_MBTOUCR || HAVE_LIBUNISTRING
++extern int
++       u32_mbtoucr (ucs4_t *puc, const uint32_t *s, size_t n);
++#endif
++
++/* Put the multibyte character represented by UC in S, returning its
++   length.  Return -1 upon failure, -2 if the number of available units, N,
++   is too small.  The latter case cannot occur if N >= 6/2/1, respectively.  */
++/* Similar to wctomb(), except that s must not be NULL, and the argument n
++   must be specified.  */
++
++#if GNULIB_UNISTR_U8_UCTOMB || HAVE_LIBUNISTRING
++/* Auxiliary function, also used by u8_chr, u8_strchr, u8_strrchr.  */
++extern int
++       u8_uctomb_aux (uint8_t *s, ucs4_t uc, int n);
++# if !HAVE_INLINE
++extern int
++       u8_uctomb (uint8_t *s, ucs4_t uc, int n);
++# else
++static inline int
++u8_uctomb (uint8_t *s, ucs4_t uc, int n)
++{
++  if (uc < 0x80 && n > 0)
++    {
++      s[0] = uc;
++      return 1;
++    }
++  else
++    return u8_uctomb_aux (s, uc, n);
++}
++# endif
++#endif
++
++#if GNULIB_UNISTR_U16_UCTOMB || HAVE_LIBUNISTRING
++/* Auxiliary function, also used by u16_chr, u16_strchr, u16_strrchr.  */
++extern int
++       u16_uctomb_aux (uint16_t *s, ucs4_t uc, int n);
++# if !HAVE_INLINE
++extern int
++       u16_uctomb (uint16_t *s, ucs4_t uc, int n);
++# else
++static inline int
++u16_uctomb (uint16_t *s, ucs4_t uc, int n)
++{
++  if (uc < 0xd800 && n > 0)
++    {
++      s[0] = uc;
++      return 1;
++    }
++  else
++    return u16_uctomb_aux (s, uc, n);
++}
++# endif
++#endif
++
++#if GNULIB_UNISTR_U32_UCTOMB || HAVE_LIBUNISTRING
++# if !HAVE_INLINE
++extern int
++       u32_uctomb (uint32_t *s, ucs4_t uc, int n);
++# else
++static inline int
++u32_uctomb (uint32_t *s, ucs4_t uc, int n)
++{
++  if (uc < 0xd800 || (uc >= 0xe000 && uc < 0x110000))
++    {
++      if (n > 0)
++        {
++          *s = uc;
++          return 1;
++        }
++      else
++        return -2;
++    }
++  else
++    return -1;
++}
++# endif
++#endif
++
++/* Copy N units from SRC to DEST.  */
++/* Similar to memcpy().  */
++extern uint8_t *
++       u8_cpy (uint8_t *dest, const uint8_t *src, size_t n);
++extern uint16_t *
++       u16_cpy (uint16_t *dest, const uint16_t *src, size_t n);
++extern uint32_t *
++       u32_cpy (uint32_t *dest, const uint32_t *src, size_t n);
++
++/* Copy N units from SRC to DEST, guaranteeing correct behavior for
++   overlapping memory areas.  */
++/* Similar to memmove().  */
++extern uint8_t *
++       u8_move (uint8_t *dest, const uint8_t *src, size_t n);
++extern uint16_t *
++       u16_move (uint16_t *dest, const uint16_t *src, size_t n);
++extern uint32_t *
++       u32_move (uint32_t *dest, const uint32_t *src, size_t n);
++
++/* Set the first N characters of S to UC.  UC should be a character that
++   occupies only 1 unit.  */
++/* Similar to memset().  */
++extern uint8_t *
++       u8_set (uint8_t *s, ucs4_t uc, size_t n);
++extern uint16_t *
++       u16_set (uint16_t *s, ucs4_t uc, size_t n);
++extern uint32_t *
++       u32_set (uint32_t *s, ucs4_t uc, size_t n);
++
++/* Compare S1 and S2, each of length N.  */
++/* Similar to memcmp().  */
++extern int
++       u8_cmp (const uint8_t *s1, const uint8_t *s2, size_t n)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u16_cmp (const uint16_t *s1, const uint16_t *s2, size_t n)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u32_cmp (const uint32_t *s1, const uint32_t *s2, size_t n)
++       _UC_ATTRIBUTE_PURE;
++
++/* Compare S1 and S2.  */
++/* Similar to the gnulib function memcmp2().  */
++extern int
++       u8_cmp2 (const uint8_t *s1, size_t n1, const uint8_t *s2, size_t n2)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u16_cmp2 (const uint16_t *s1, size_t n1, const uint16_t *s2, size_t n2)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u32_cmp2 (const uint32_t *s1, size_t n1, const uint32_t *s2, size_t n2)
++       _UC_ATTRIBUTE_PURE;
++
++/* Search the string at S for UC.  */
++/* Similar to memchr().  */
++extern uint8_t *
++       u8_chr (const uint8_t *s, size_t n, ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++extern uint16_t *
++       u16_chr (const uint16_t *s, size_t n, ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++extern uint32_t *
++       u32_chr (const uint32_t *s, size_t n, ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++
++/* Count the number of Unicode characters in the N units from S.  */
++/* Similar to mbsnlen().  */
++extern size_t
++       u8_mbsnlen (const uint8_t *s, size_t n)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u16_mbsnlen (const uint16_t *s, size_t n)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u32_mbsnlen (const uint32_t *s, size_t n)
++       _UC_ATTRIBUTE_PURE;
++
++/* Elementary string functions with memory allocation.  */
++
++/* Make a freshly allocated copy of S, of length N.  */
++extern uint8_t *
++       u8_cpy_alloc (const uint8_t *s, size_t n);
++extern uint16_t *
++       u16_cpy_alloc (const uint16_t *s, size_t n);
++extern uint32_t *
++       u32_cpy_alloc (const uint32_t *s, size_t n);
++
++/* Elementary string functions on NUL terminated strings.  */
++
++/* Return the length (number of units) of the first character in S.
++   Return 0 if it is the NUL character.  Return -1 upon failure.  */
++extern int
++       u8_strmblen (const uint8_t *s)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u16_strmblen (const uint16_t *s)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u32_strmblen (const uint32_t *s)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the length (number of units) of the first character in S, putting
++   its 'ucs4_t' representation in *PUC.  Return 0 if it is the NUL
++   character.  Return -1 upon failure.  */
++extern int
++       u8_strmbtouc (ucs4_t *puc, const uint8_t *s);
++extern int
++       u16_strmbtouc (ucs4_t *puc, const uint16_t *s);
++extern int
++       u32_strmbtouc (ucs4_t *puc, const uint32_t *s);
++
++/* Forward iteration step.  Advances the pointer past the next character,
++   or returns NULL if the end of the string has been reached.  Puts the
++   character's 'ucs4_t' representation in *PUC.  */
++extern const uint8_t *
++       u8_next (ucs4_t *puc, const uint8_t *s);
++extern const uint16_t *
++       u16_next (ucs4_t *puc, const uint16_t *s);
++extern const uint32_t *
++       u32_next (ucs4_t *puc, const uint32_t *s);
++
++/* Backward iteration step.  Advances the pointer to point to the previous
++   character, or returns NULL if the beginning of the string had been reached.
++   Puts the character's 'ucs4_t' representation in *PUC.  */
++extern const uint8_t *
++       u8_prev (ucs4_t *puc, const uint8_t *s, const uint8_t *start);
++extern const uint16_t *
++       u16_prev (ucs4_t *puc, const uint16_t *s, const uint16_t *start);
++extern const uint32_t *
++       u32_prev (ucs4_t *puc, const uint32_t *s, const uint32_t *start);
++
++/* Return the number of units in S.  */
++/* Similar to strlen(), wcslen().  */
++extern size_t
++       u8_strlen (const uint8_t *s)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u16_strlen (const uint16_t *s)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u32_strlen (const uint32_t *s)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the number of units in S, but at most MAXLEN.  */
++/* Similar to strnlen(), wcsnlen().  */
++extern size_t
++       u8_strnlen (const uint8_t *s, size_t maxlen)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u16_strnlen (const uint16_t *s, size_t maxlen)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u32_strnlen (const uint32_t *s, size_t maxlen)
++       _UC_ATTRIBUTE_PURE;
++
++/* Copy SRC to DEST.  */
++/* Similar to strcpy(), wcscpy().  */
++extern uint8_t *
++       u8_strcpy (uint8_t *dest, const uint8_t *src);
++extern uint16_t *
++       u16_strcpy (uint16_t *dest, const uint16_t *src);
++extern uint32_t *
++       u32_strcpy (uint32_t *dest, const uint32_t *src);
++
++/* Copy SRC to DEST, returning the address of the terminating NUL in DEST.  */
++/* Similar to stpcpy().  */
++extern uint8_t *
++       u8_stpcpy (uint8_t *dest, const uint8_t *src);
++extern uint16_t *
++       u16_stpcpy (uint16_t *dest, const uint16_t *src);
++extern uint32_t *
++       u32_stpcpy (uint32_t *dest, const uint32_t *src);
++
++/* Copy no more than N units of SRC to DEST.  */
++/* Similar to strncpy(), wcsncpy().  */
++extern uint8_t *
++       u8_strncpy (uint8_t *dest, const uint8_t *src, size_t n);
++extern uint16_t *
++       u16_strncpy (uint16_t *dest, const uint16_t *src, size_t n);
++extern uint32_t *
++       u32_strncpy (uint32_t *dest, const uint32_t *src, size_t n);
++
++/* Copy no more than N units of SRC to DEST.  Return a pointer past the last
++   non-NUL unit written into DEST.  */
++/* Similar to stpncpy().  */
++extern uint8_t *
++       u8_stpncpy (uint8_t *dest, const uint8_t *src, size_t n);
++extern uint16_t *
++       u16_stpncpy (uint16_t *dest, const uint16_t *src, size_t n);
++extern uint32_t *
++       u32_stpncpy (uint32_t *dest, const uint32_t *src, size_t n);
++
++/* Append SRC onto DEST.  */
++/* Similar to strcat(), wcscat().  */
++extern uint8_t *
++       u8_strcat (uint8_t *dest, const uint8_t *src);
++extern uint16_t *
++       u16_strcat (uint16_t *dest, const uint16_t *src);
++extern uint32_t *
++       u32_strcat (uint32_t *dest, const uint32_t *src);
++
++/* Append no more than N units of SRC onto DEST.  */
++/* Similar to strncat(), wcsncat().  */
++extern uint8_t *
++       u8_strncat (uint8_t *dest, const uint8_t *src, size_t n);
++extern uint16_t *
++       u16_strncat (uint16_t *dest, const uint16_t *src, size_t n);
++extern uint32_t *
++       u32_strncat (uint32_t *dest, const uint32_t *src, size_t n);
++
++/* Compare S1 and S2.  */
++/* Similar to strcmp(), wcscmp().  */
++#ifdef __sun
++/* Avoid a collision with the u8_strcmp() function in Solaris 11 libc.  */
++extern int
++       u8_strcmp_gnu (const uint8_t *s1, const uint8_t *s2)
++       _UC_ATTRIBUTE_PURE;
++# define u8_strcmp u8_strcmp_gnu
++#else
++extern int
++       u8_strcmp (const uint8_t *s1, const uint8_t *s2)
++       _UC_ATTRIBUTE_PURE;
++#endif
++extern int
++       u16_strcmp (const uint16_t *s1, const uint16_t *s2)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u32_strcmp (const uint32_t *s1, const uint32_t *s2)
++       _UC_ATTRIBUTE_PURE;
++
++/* Compare S1 and S2 using the collation rules of the current locale.
++   Return -1 if S1 < S2, 0 if S1 = S2, 1 if S1 > S2.
++   Upon failure, set errno and return any value.  */
++/* Similar to strcoll(), wcscoll().  */
++extern int
++       u8_strcoll (const uint8_t *s1, const uint8_t *s2);
++extern int
++       u16_strcoll (const uint16_t *s1, const uint16_t *s2);
++extern int
++       u32_strcoll (const uint32_t *s1, const uint32_t *s2);
++
++/* Compare no more than N units of S1 and S2.  */
++/* Similar to strncmp(), wcsncmp().  */
++extern int
++       u8_strncmp (const uint8_t *s1, const uint8_t *s2, size_t n)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u16_strncmp (const uint16_t *s1, const uint16_t *s2, size_t n)
++       _UC_ATTRIBUTE_PURE;
++extern int
++       u32_strncmp (const uint32_t *s1, const uint32_t *s2, size_t n)
++       _UC_ATTRIBUTE_PURE;
++
++/* Duplicate S, returning an identical malloc'd string.  */
++/* Similar to strdup(), wcsdup().  */
++extern uint8_t *
++       u8_strdup (const uint8_t *s);
++extern uint16_t *
++       u16_strdup (const uint16_t *s);
++extern uint32_t *
++       u32_strdup (const uint32_t *s);
++
++/* Find the first occurrence of UC in STR.  */
++/* Similar to strchr(), wcschr().  */
++extern uint8_t *
++       u8_strchr (const uint8_t *str, ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++extern uint16_t *
++       u16_strchr (const uint16_t *str, ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++extern uint32_t *
++       u32_strchr (const uint32_t *str, ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++
++/* Find the last occurrence of UC in STR.  */
++/* Similar to strrchr(), wcsrchr().  */
++extern uint8_t *
++       u8_strrchr (const uint8_t *str, ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++extern uint16_t *
++       u16_strrchr (const uint16_t *str, ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++extern uint32_t *
++       u32_strrchr (const uint32_t *str, ucs4_t uc)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the length of the initial segment of STR which consists entirely
++   of Unicode characters not in REJECT.  */
++/* Similar to strcspn(), wcscspn().  */
++extern size_t
++       u8_strcspn (const uint8_t *str, const uint8_t *reject)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u16_strcspn (const uint16_t *str, const uint16_t *reject)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u32_strcspn (const uint32_t *str, const uint32_t *reject)
++       _UC_ATTRIBUTE_PURE;
++
++/* Return the length of the initial segment of STR which consists entirely
++   of Unicode characters in ACCEPT.  */
++/* Similar to strspn(), wcsspn().  */
++extern size_t
++       u8_strspn (const uint8_t *str, const uint8_t *accept)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u16_strspn (const uint16_t *str, const uint16_t *accept)
++       _UC_ATTRIBUTE_PURE;
++extern size_t
++       u32_strspn (const uint32_t *str, const uint32_t *accept)
++       _UC_ATTRIBUTE_PURE;
++
++/* Find the first occurrence in STR of any character in ACCEPT.  */
++/* Similar to strpbrk(), wcspbrk().  */
++extern uint8_t *
++       u8_strpbrk (const uint8_t *str, const uint8_t *accept)
++       _UC_ATTRIBUTE_PURE;
++extern uint16_t *
++       u16_strpbrk (const uint16_t *str, const uint16_t *accept)
++       _UC_ATTRIBUTE_PURE;
++extern uint32_t *
++       u32_strpbrk (const uint32_t *str, const uint32_t *accept)
++       _UC_ATTRIBUTE_PURE;
++
++/* Find the first occurrence of NEEDLE in HAYSTACK.  */
++/* Similar to strstr(), wcsstr().  */
++extern uint8_t *
++       u8_strstr (const uint8_t *haystack, const uint8_t *needle)
++       _UC_ATTRIBUTE_PURE;
++extern uint16_t *
++       u16_strstr (const uint16_t *haystack, const uint16_t *needle)
++       _UC_ATTRIBUTE_PURE;
++extern uint32_t *
++       u32_strstr (const uint32_t *haystack, const uint32_t *needle)
++       _UC_ATTRIBUTE_PURE;
++
++/* Test whether STR starts with PREFIX.  */
++extern bool
++       u8_startswith (const uint8_t *str, const uint8_t *prefix)
++       _UC_ATTRIBUTE_PURE;
++extern bool
++       u16_startswith (const uint16_t *str, const uint16_t *prefix)
++       _UC_ATTRIBUTE_PURE;
++extern bool
++       u32_startswith (const uint32_t *str, const uint32_t *prefix)
++       _UC_ATTRIBUTE_PURE;
++
++/* Test whether STR ends with SUFFIX.  */
++extern bool
++       u8_endswith (const uint8_t *str, const uint8_t *suffix)
++       _UC_ATTRIBUTE_PURE;
++extern bool
++       u16_endswith (const uint16_t *str, const uint16_t *suffix)
++       _UC_ATTRIBUTE_PURE;
++extern bool
++       u32_endswith (const uint32_t *str, const uint32_t *suffix)
++       _UC_ATTRIBUTE_PURE;
++
++/* Divide STR into tokens separated by characters in DELIM.
++   This interface is actually more similar to wcstok than to strtok.  */
++/* Similar to strtok_r(), wcstok().  */
++extern uint8_t *
++       u8_strtok (uint8_t *str, const uint8_t *delim, uint8_t **ptr);
++extern uint16_t *
++       u16_strtok (uint16_t *str, const uint16_t *delim, uint16_t **ptr);
++extern uint32_t *
++       u32_strtok (uint32_t *str, const uint32_t *delim, uint32_t **ptr);
++
++
++#ifdef __cplusplus
++}
++#endif
++
++#endif /* _UNISTR_H */
+diff --git a/SMP/lib/unistring/unitypes.h b/SMP/lib/unistring/unitypes.h
+new file mode 100644
+index 0000000..7380d5c
+--- /dev/null
++++ b/SMP/lib/unistring/unitypes.h
+@@ -0,0 +1,56 @@
++/* Elementary types and macros for the GNU UniString library.
++   Copyright (C) 2002, 2005-2006, 2009-2016 Free Software Foundation, Inc.
++
++   This program is free software: you can redistribute it and/or modify it
++   under the terms of either:
++
++    * the GNU Lesser General Public License as published
++   by the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   or
++
++   * the GNU General Public License as published by the Free
++   Software Foundation; either version 2 of the License, or
++   (at your option) any later version.
++
++   or both in parallel, as here.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   Lesser General Public License for more details.
++
++   You should have received a copy of the GNU Lesser General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
++
++#ifndef _UNITYPES_H
++#define _UNITYPES_H
++
++/* Get uint8_t, uint16_t, uint32_t.  */
++#include <stdint.h>
++
++/* Type representing a Unicode character.  */
++typedef uint32_t ucs4_t;
++
++/* Attribute of a function whose result depends only on the arguments
++   (not pointers!) and which has no side effects.  */
++#ifndef _UC_ATTRIBUTE_CONST
++# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 95)
++#  define _UC_ATTRIBUTE_CONST __attribute__ ((__const__))
++# else
++#  define _UC_ATTRIBUTE_CONST
++# endif
++#endif
++
++/* Attribute of a function whose result depends only on the arguments
++   (possibly pointers) and global memory, and which has no side effects.  */
++#ifndef _UC_ATTRIBUTE_PURE
++# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
++#  define _UC_ATTRIBUTE_PURE __attribute__ ((__pure__))
++# else
++#  define _UC_ATTRIBUTE_PURE
++# endif
++#endif
++
++#endif /* _UNITYPES_H */
+diff --git a/SMP/lib/unused-parameter.h b/SMP/lib/unused-parameter.h
+new file mode 100644
+index 0000000..843db76
+--- /dev/null
++++ b/SMP/lib/unused-parameter.h
+@@ -0,0 +1,36 @@
++/* A C macro for declaring that specific function parameters are not used.
++   Copyright (C) 2008-2016 Free Software Foundation, Inc.
++
++   This program is free software: you can redistribute it and/or modify it
++   under the terms of the GNU General Public License as published
++   by the Free Software Foundation; either version 3 of the License, or
++   (at your option) any later version.
++
++   This program is distributed in the hope that it will be useful,
++   but WITHOUT ANY WARRANTY; without even the implied warranty of
++   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
++   General Public License for more details.
++
++   You should have received a copy of the GNU General Public License
++   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
++
++/* _GL_UNUSED_PARAMETER is a marker that can be appended to function parameter
++   declarations for parameters that are not used.  This helps to reduce
++   warnings, such as from GCC -Wunused-parameter.  The syntax is as follows:
++       type param _GL_UNUSED_PARAMETER
++   or more generally
++       param_decl _GL_UNUSED_PARAMETER
++   For example:
++       int param _GL_UNUSED_PARAMETER
++       int *(*param)(void) _GL_UNUSED_PARAMETER
++   Other possible, but obscure and discouraged syntaxes:
++       int _GL_UNUSED_PARAMETER *(*param)(void)
++       _GL_UNUSED_PARAMETER int *(*param)(void)
++ */
++#ifndef _GL_UNUSED_PARAMETER
++# if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7)
++#  define _GL_UNUSED_PARAMETER __attribute__ ((__unused__))
++# else
++#  define _GL_UNUSED_PARAMETER
++# endif
++#endif
+diff --git a/SMP/libgnutls.def b/SMP/libgnutls.def
+new file mode 100644
+index 0000000..179940e
+--- /dev/null
++++ b/SMP/libgnutls.def
+@@ -0,0 +1,1056 @@
++EXPORTS
++	gnutls_alert_get
++	gnutls_alert_get_name
++	gnutls_alert_send
++	gnutls_alert_send_appropriate
++	gnutls_anon_allocate_client_credentials
++	gnutls_anon_allocate_server_credentials
++	gnutls_anon_free_client_credentials
++	gnutls_anon_free_server_credentials
++	gnutls_anon_set_params_function
++	gnutls_anon_set_server_dh_params
++	gnutls_anon_set_server_params_function
++	gnutls_auth_client_get_type
++	gnutls_auth_get_type
++	gnutls_auth_server_get_type
++	gnutls_bye
++	gnutls_calloc
++	gnutls_certificate_activation_time_peers
++	gnutls_certificate_allocate_credentials
++	gnutls_certificate_client_get_request_status
++	gnutls_certificate_expiration_time_peers
++	gnutls_certificate_free_ca_names
++	gnutls_certificate_free_cas
++	gnutls_certificate_free_credentials
++	gnutls_certificate_free_crls
++	gnutls_certificate_free_keys
++	gnutls_certificate_get_ours
++	gnutls_certificate_get_peers
++	gnutls_certificate_send_x509_rdn_sequence
++	gnutls_certificate_server_set_request
++	gnutls_certificate_set_dh_params
++	gnutls_certificate_set_openpgp_key
++	gnutls_certificate_set_openpgp_key_file2
++	gnutls_certificate_set_openpgp_key_file
++	gnutls_certificate_set_openpgp_key_mem2
++	gnutls_certificate_set_openpgp_key_mem
++	gnutls_certificate_set_openpgp_keyring_file
++	gnutls_certificate_set_openpgp_keyring_mem
++	gnutls_certificate_set_params_function
++	gnutls_certificate_set_verify_flags
++	gnutls_certificate_set_verify_limits
++	gnutls_certificate_set_x509_crl
++	gnutls_certificate_set_x509_crl_file
++	gnutls_certificate_set_x509_crl_mem
++	gnutls_certificate_set_x509_key
++	gnutls_certificate_set_x509_key_file
++	gnutls_certificate_set_x509_key_mem
++	gnutls_certificate_set_x509_simple_pkcs12_file
++	gnutls_certificate_set_x509_trust
++	gnutls_certificate_set_x509_trust_file
++	gnutls_certificate_set_x509_trust_mem
++	gnutls_certificate_type_get
++	gnutls_certificate_type_get_id
++	gnutls_certificate_type_get_name
++	gnutls_certificate_type_list
++	gnutls_certificate_verify_peers2
++	gnutls_check_version
++	gnutls_cipher_get
++	gnutls_cipher_get_id
++	gnutls_cipher_get_key_size
++	gnutls_cipher_get_name
++	gnutls_cipher_list
++	gnutls_cipher_suite_get_name
++	gnutls_cipher_suite_info
++	gnutls_compression_get
++	gnutls_compression_get_id
++	gnutls_compression_get_name
++	gnutls_compression_list
++	gnutls_credentials_clear
++	gnutls_credentials_set
++	gnutls_db_check_entry
++	gnutls_db_get_ptr
++	gnutls_db_remove_session
++	gnutls_db_set_cache_expiration
++	gnutls_db_set_ptr
++	gnutls_db_set_remove_function
++	gnutls_db_set_retrieve_function
++	gnutls_db_set_store_function
++	gnutls_deinit
++	gnutls_dh_get_group
++	gnutls_dh_get_peers_public_bits
++	gnutls_dh_get_prime_bits
++	gnutls_dh_get_pubkey
++	gnutls_dh_get_secret_bits
++	gnutls_dh_params_cpy
++	gnutls_dh_params_deinit
++	gnutls_dh_params_export_pkcs3
++	gnutls_dh_params_export_raw
++	gnutls_dh_params_generate2
++	gnutls_dh_params_import_pkcs3
++	gnutls_dh_params_import_raw
++	gnutls_dh_params_init
++	gnutls_dh_set_prime_bits
++	gnutls_error_is_fatal
++	gnutls_error_to_alert
++	gnutls_fingerprint
++	gnutls_free
++	gnutls_global_deinit
++	gnutls_global_init
++	gnutls_global_set_log_function
++	gnutls_global_set_log_level
++	gnutls_global_set_mem_functions
++	gnutls_handshake
++	gnutls_handshake_get_last_in
++	gnutls_handshake_get_last_out
++	gnutls_handshake_set_max_packet_length
++	gnutls_handshake_set_post_client_hello_function
++	gnutls_handshake_set_private_extensions
++	gnutls_hex2bin
++	gnutls_hex_decode
++	gnutls_hex_encode
++	gnutls_init
++	gnutls_kx_get
++	gnutls_kx_get_id
++	gnutls_kx_get_name
++	gnutls_kx_list
++	gnutls_mac_get
++	gnutls_mac_get_id
++	gnutls_mac_get_key_size
++	gnutls_mac_get_name
++	gnutls_mac_list
++	gnutls_malloc
++	gnutls_openpgp_crt_check_hostname
++	gnutls_openpgp_crt_deinit
++	gnutls_openpgp_crt_export
++	gnutls_openpgp_crt_get_auth_subkey
++	gnutls_openpgp_crt_get_creation_time
++	gnutls_openpgp_crt_get_expiration_time
++	gnutls_openpgp_crt_get_fingerprint
++	gnutls_openpgp_crt_get_key_id
++	gnutls_openpgp_crt_get_key_usage
++	gnutls_openpgp_crt_get_name
++	gnutls_openpgp_crt_get_pk_algorithm
++	gnutls_openpgp_crt_get_pk_dsa_raw
++	gnutls_openpgp_crt_get_pk_rsa_raw
++	gnutls_openpgp_crt_get_preferred_key_id
++	gnutls_openpgp_crt_get_revoked_status
++	gnutls_openpgp_crt_get_subkey_count
++	gnutls_openpgp_crt_get_subkey_creation_time
++	gnutls_openpgp_crt_get_subkey_expiration_time
++	gnutls_openpgp_crt_get_subkey_fingerprint
++	gnutls_openpgp_crt_get_subkey_id
++	gnutls_openpgp_crt_get_subkey_idx
++	gnutls_openpgp_crt_get_subkey_pk_algorithm
++	gnutls_openpgp_crt_get_subkey_pk_dsa_raw
++	gnutls_openpgp_crt_get_subkey_pk_rsa_raw
++	gnutls_openpgp_crt_get_subkey_revoked_status
++	gnutls_openpgp_crt_get_subkey_usage
++	gnutls_openpgp_crt_get_version
++	gnutls_openpgp_crt_import
++	gnutls_openpgp_crt_init
++	gnutls_openpgp_crt_print
++	gnutls_openpgp_crt_set_preferred_key_id
++	gnutls_openpgp_crt_verify_ring
++	gnutls_openpgp_crt_verify_self
++	gnutls_openpgp_keyring_check_id
++	gnutls_openpgp_keyring_deinit
++	gnutls_openpgp_keyring_get_crt
++	gnutls_openpgp_keyring_get_crt_count
++	gnutls_openpgp_keyring_import
++	gnutls_openpgp_keyring_init
++	gnutls_openpgp_privkey_deinit
++	gnutls_openpgp_privkey_export
++	gnutls_openpgp_privkey_export_dsa_raw
++	gnutls_openpgp_privkey_export_rsa_raw
++	gnutls_openpgp_privkey_export_subkey_dsa_raw
++	gnutls_openpgp_privkey_export_subkey_rsa_raw
++	gnutls_openpgp_privkey_get_fingerprint
++	gnutls_openpgp_privkey_get_key_id
++	gnutls_openpgp_privkey_get_pk_algorithm
++	gnutls_openpgp_privkey_get_preferred_key_id
++	gnutls_openpgp_privkey_get_revoked_status
++	gnutls_openpgp_privkey_get_subkey_count
++	gnutls_openpgp_privkey_get_subkey_creation_time
++	gnutls_openpgp_privkey_get_subkey_expiration_time
++	gnutls_openpgp_privkey_get_subkey_fingerprint
++	gnutls_openpgp_privkey_get_subkey_id
++	gnutls_openpgp_privkey_get_subkey_idx
++	gnutls_openpgp_privkey_get_subkey_pk_algorithm
++	gnutls_openpgp_privkey_get_subkey_revoked_status
++	gnutls_openpgp_privkey_import
++	gnutls_openpgp_privkey_init
++	gnutls_openpgp_privkey_set_preferred_key_id
++	gnutls_openpgp_privkey_sign_hash
++	gnutls_openpgp_send_cert
++	gnutls_openpgp_set_recv_key_function
++	gnutls_pem_base64_decode
++	gnutls_pem_base64_decode2
++	gnutls_pem_base64_encode
++	gnutls_pem_base64_encode2
++	gnutls_perror
++	gnutls_pk_algorithm_get_name
++	gnutls_pk_get_id
++	gnutls_pk_get_name
++	gnutls_pk_list
++	gnutls_pkcs12_bag_decrypt
++	gnutls_pkcs12_bag_deinit
++	gnutls_pkcs12_bag_encrypt
++	gnutls_pkcs12_bag_get_count
++	gnutls_pkcs12_bag_get_data
++	gnutls_pkcs12_bag_get_friendly_name
++	gnutls_pkcs12_bag_get_key_id
++	gnutls_pkcs12_bag_get_type
++	gnutls_pkcs12_bag_init
++	gnutls_pkcs12_bag_set_crl
++	gnutls_pkcs12_bag_set_crt
++	gnutls_pkcs12_bag_set_data
++	gnutls_pkcs12_bag_set_friendly_name
++	gnutls_pkcs12_bag_set_key_id
++	gnutls_pkcs12_deinit
++	gnutls_pkcs12_export
++	gnutls_pkcs12_generate_mac
++	gnutls_pkcs12_get_bag
++	gnutls_pkcs12_import
++	gnutls_pkcs12_init
++	gnutls_pkcs12_set_bag
++	gnutls_pkcs12_verify_mac
++	gnutls_pkcs7_deinit
++	gnutls_pkcs7_delete_crl
++	gnutls_pkcs7_delete_crt
++	gnutls_pkcs7_export
++	gnutls_pkcs7_get_crl_count
++	gnutls_pkcs7_get_crl_raw
++	gnutls_pkcs7_get_crt_count
++	gnutls_pkcs7_get_crt_raw
++	gnutls_pkcs7_import
++	gnutls_pkcs7_init
++	gnutls_pkcs7_set_crl
++	gnutls_pkcs7_set_crl_raw
++	gnutls_pkcs7_set_crt
++	gnutls_pkcs7_set_crt_raw
++	gnutls_prf
++	gnutls_prf_raw
++	gnutls_priority_deinit
++	gnutls_priority_init
++	gnutls_priority_set
++	gnutls_priority_set_direct
++	gnutls_protocol_get_id
++	gnutls_protocol_get_name
++	gnutls_protocol_get_version
++	gnutls_protocol_list
++	gnutls_psk_allocate_client_credentials
++	gnutls_psk_allocate_server_credentials
++	gnutls_psk_client_get_hint
++	gnutls_psk_free_client_credentials
++	gnutls_psk_free_server_credentials
++	gnutls_psk_server_get_username
++	gnutls_psk_set_client_credentials
++	gnutls_psk_set_client_credentials_function
++	gnutls_psk_set_params_function
++	gnutls_psk_set_server_credentials_file
++	gnutls_psk_set_server_credentials_function
++	gnutls_psk_set_server_credentials_hint
++	gnutls_psk_set_server_dh_params
++	gnutls_psk_set_server_params_function
++	gnutls_realloc
++	gnutls_record_check_pending
++	gnutls_record_disable_padding
++	gnutls_record_get_direction
++	gnutls_record_get_max_size
++	gnutls_record_recv
++	gnutls_record_send
++	gnutls_record_set_max_size
++	gnutls_rehandshake
++	gnutls_secure_malloc
++	gnutls_server_name_get
++	gnutls_server_name_set
++	gnutls_session_enable_compatibility_mode
++	gnutls_session_get_data2
++	gnutls_session_get_data
++	gnutls_session_get_id
++	gnutls_session_get_ptr
++	gnutls_session_is_resumed
++	gnutls_session_set_data
++	gnutls_session_set_ptr
++	gnutls_set_default_priority
++	gnutls_sign_get_id
++	gnutls_sign_get_name
++	gnutls_sign_list
++	gnutls_srp_1024_group_generator
++	gnutls_srp_1024_group_prime
++	gnutls_srp_1536_group_generator
++	gnutls_srp_1536_group_prime
++	gnutls_srp_2048_group_generator
++	gnutls_srp_2048_group_prime
++	gnutls_srp_allocate_client_credentials
++	gnutls_srp_allocate_server_credentials
++	gnutls_srp_base64_decode
++	gnutls_srp_base64_decode2
++	gnutls_srp_base64_encode
++	gnutls_srp_base64_encode2
++	gnutls_srp_free_client_credentials
++	gnutls_srp_free_server_credentials
++	gnutls_srp_server_get_username
++	gnutls_srp_set_client_credentials
++	gnutls_srp_set_client_credentials_function
++	gnutls_srp_set_prime_bits
++	gnutls_srp_set_server_credentials_file
++	gnutls_srp_set_server_credentials_function
++	gnutls_srp_verifier
++	gnutls_strdup
++	gnutls_strerror
++	gnutls_strerror_name
++	gnutls_supplemental_get_name
++	gnutls_transport_get_ptr2
++	gnutls_transport_get_ptr
++	gnutls_transport_set_errno
++	gnutls_transport_set_ptr2
++	gnutls_transport_set_ptr
++	gnutls_transport_set_pull_function
++	gnutls_transport_set_push_function
++	gnutls_x509_crl_check_issuer
++	gnutls_x509_crl_deinit
++	gnutls_x509_crl_export
++	gnutls_x509_crl_get_crt_count
++	gnutls_x509_crl_get_crt_serial
++	gnutls_x509_crl_get_dn_oid
++	gnutls_x509_crl_get_issuer_dn
++	gnutls_x509_crl_get_issuer_dn_by_oid
++	gnutls_x509_crl_get_next_update
++	gnutls_x509_crl_get_signature
++	gnutls_x509_crl_get_signature_algorithm
++	gnutls_x509_crl_get_this_update
++	gnutls_x509_crl_get_version
++	gnutls_x509_crl_import
++	gnutls_x509_crl_init
++	gnutls_x509_crl_print
++	gnutls_x509_crl_set_crt
++	gnutls_x509_crl_set_crt_serial
++	gnutls_x509_crl_set_next_update
++	gnutls_x509_crl_set_this_update
++	gnutls_x509_crl_set_version
++	gnutls_x509_crl_sign2
++	gnutls_x509_crl_sign
++	gnutls_x509_crl_verify
++	gnutls_x509_crq_deinit
++	gnutls_x509_crq_export
++	gnutls_x509_crq_get_attribute_by_oid
++	gnutls_x509_crq_get_challenge_password
++	gnutls_x509_crq_get_dn
++	gnutls_x509_crq_get_dn_by_oid
++	gnutls_x509_crq_get_dn_oid
++	gnutls_x509_crq_get_pk_algorithm
++	gnutls_x509_crq_get_version
++	gnutls_x509_crq_import
++	gnutls_x509_crq_init
++	gnutls_x509_crq_set_attribute_by_oid
++	gnutls_x509_crq_set_challenge_password
++	gnutls_x509_crq_set_dn_by_oid
++	gnutls_x509_crq_set_key
++	gnutls_x509_crq_set_key_rsa_raw
++	gnutls_x509_crq_set_version
++	gnutls_x509_crq_sign2
++	gnutls_x509_crq_sign
++	gnutls_x509_crt_check_hostname
++	gnutls_x509_crt_check_issuer
++	gnutls_x509_crt_check_revocation
++	gnutls_x509_crt_cpy_crl_dist_points
++	gnutls_x509_crt_deinit
++	gnutls_x509_crt_export
++	gnutls_x509_crt_get_activation_time
++	gnutls_x509_crt_get_authority_key_id
++	gnutls_x509_crt_get_basic_constraints
++	gnutls_x509_crt_get_ca_status
++	gnutls_x509_crt_get_crl_dist_points
++	gnutls_x509_crt_get_dn
++	gnutls_x509_crt_get_dn_by_oid
++	gnutls_x509_crt_get_dn_oid
++	gnutls_x509_crt_get_expiration_time
++	gnutls_x509_crt_get_extension_by_oid
++	gnutls_x509_crt_get_extension_data
++	gnutls_x509_crt_get_extension_info
++	gnutls_x509_crt_get_extension_oid
++	gnutls_x509_crt_get_fingerprint
++	gnutls_x509_crt_get_issuer
++	gnutls_x509_crt_get_issuer_dn
++	gnutls_x509_crt_get_issuer_dn_by_oid
++	gnutls_x509_crt_get_issuer_dn_oid
++	gnutls_x509_crt_get_issuer_unique_id
++	gnutls_x509_crt_get_key_id
++	gnutls_x509_crt_get_key_purpose_oid
++	gnutls_x509_crt_get_key_usage
++	gnutls_x509_crt_get_pk_algorithm
++	gnutls_x509_crt_get_pk_dsa_raw
++	gnutls_x509_crt_get_pk_rsa_raw
++	gnutls_x509_crt_get_proxy
++	gnutls_x509_crt_get_raw_dn
++	gnutls_x509_crt_get_raw_issuer_dn
++	gnutls_x509_crt_get_serial
++	gnutls_x509_crt_get_signature
++	gnutls_x509_crt_get_signature_algorithm
++	gnutls_x509_crt_get_subject
++	gnutls_x509_crt_get_subject_alt_name2
++	gnutls_x509_crt_get_subject_alt_name
++	gnutls_x509_crt_get_subject_alt_othername_oid
++	gnutls_x509_crt_get_subject_key_id
++	gnutls_x509_crt_get_subject_unique_id
++	gnutls_x509_crt_get_version
++	gnutls_x509_crt_import
++	gnutls_x509_crt_init
++	gnutls_x509_crt_list_import
++	gnutls_x509_crt_list_verify
++	gnutls_x509_crt_print
++	gnutls_x509_crt_set_activation_time
++	gnutls_x509_crt_set_authority_key_id
++	gnutls_x509_crt_set_basic_constraints
++	gnutls_x509_crt_set_ca_status
++	gnutls_x509_crt_set_crl_dist_points2
++	gnutls_x509_crt_set_crl_dist_points
++	gnutls_x509_crt_set_crq
++	gnutls_x509_crt_set_dn_by_oid
++	gnutls_x509_crt_set_expiration_time
++	gnutls_x509_crt_set_extension_by_oid
++	gnutls_x509_crt_set_issuer_dn_by_oid
++	gnutls_x509_crt_set_key
++	gnutls_x509_crt_set_key_purpose_oid
++	gnutls_x509_crt_set_key_usage
++	gnutls_x509_crt_set_proxy
++	gnutls_x509_crt_set_proxy_dn
++	gnutls_x509_crt_set_serial
++	gnutls_x509_crt_set_subject_alt_name
++	gnutls_x509_crt_set_subject_alternative_name
++	gnutls_x509_crt_set_subject_key_id
++	gnutls_x509_crt_set_version
++	gnutls_x509_crt_sign2
++	gnutls_x509_crt_sign
++	gnutls_x509_crt_verify
++	gnutls_x509_dn_deinit
++	gnutls_x509_dn_export
++	gnutls_x509_dn_get_rdn_ava
++	gnutls_x509_dn_import
++	gnutls_x509_dn_init
++	gnutls_x509_dn_oid_known
++	gnutls_x509_privkey_cpy
++	gnutls_x509_privkey_deinit
++	gnutls_x509_privkey_export
++	gnutls_x509_privkey_export_dsa_raw
++	gnutls_x509_privkey_export_pkcs8
++	gnutls_x509_privkey_export_rsa_raw
++	gnutls_x509_privkey_fix
++	gnutls_x509_privkey_generate
++	gnutls_x509_privkey_get_key_id
++	gnutls_x509_privkey_get_pk_algorithm
++	gnutls_x509_privkey_import
++	gnutls_x509_privkey_import_dsa_raw
++	gnutls_x509_privkey_import_pkcs8
++	gnutls_x509_privkey_import_rsa_raw
++	gnutls_x509_privkey_init
++	gnutls_x509_privkey_sign_data
++	gnutls_x509_privkey_sign_hash
++	gnutls_x509_rdn_get
++	gnutls_x509_rdn_get_by_oid
++	gnutls_x509_rdn_get_oid
++	gnutls_certificate_set_x509_simple_pkcs12_mem
++	gnutls_x509_crl_get_authority_key_id
++	gnutls_x509_crl_get_extension_data
++	gnutls_x509_crl_get_extension_info
++	gnutls_x509_crl_get_extension_oid
++	gnutls_x509_crl_get_number
++	gnutls_x509_crl_set_authority_key_id
++	gnutls_x509_crl_set_number
++	gnutls_x509_crq_get_attribute_data
++	gnutls_x509_crq_get_attribute_info
++	gnutls_x509_crq_get_basic_constraints
++	gnutls_x509_crq_get_extension_by_oid
++	gnutls_x509_crq_get_extension_data
++	gnutls_x509_crq_get_extension_info
++	gnutls_x509_crq_get_key_id
++	gnutls_x509_crq_get_key_purpose_oid
++	gnutls_x509_crq_get_key_rsa_raw
++	gnutls_x509_crq_get_key_usage
++	gnutls_x509_crq_get_subject_alt_name
++	gnutls_x509_crq_get_subject_alt_othername_oid
++	gnutls_x509_crq_print
++	gnutls_x509_crq_set_basic_constraints
++	gnutls_x509_crq_set_key_purpose_oid
++	gnutls_x509_crq_set_key_usage
++	gnutls_x509_crq_set_subject_alt_name
++	gnutls_x509_crt_set_crq_extensions
++	gnutls_session_ticket_key_generate
++	gnutls_session_ticket_enable_client
++	gnutls_session_ticket_enable_server
++	gnutls_x509_crt_get_issuer_alt_name2
++	gnutls_x509_crt_get_issuer_alt_name
++	gnutls_x509_crt_get_issuer_alt_othername_oid
++	gnutls_sign_algorithm_get_requested
++	gnutls_cipher_init
++	gnutls_cipher_encrypt
++	gnutls_cipher_decrypt
++	gnutls_cipher_deinit
++	gnutls_cipher_get_block_size
++	gnutls_hash_init
++	gnutls_hash_get_len
++	gnutls_hash
++	gnutls_hash_fast
++	gnutls_hash_deinit
++	gnutls_hash_output
++	gnutls_hmac_init
++	gnutls_hmac_get_len
++	gnutls_hmac
++	gnutls_hmac_fast
++	gnutls_hmac_deinit
++	gnutls_hmac_output
++	gnutls_certificate_set_verify_function
++	gnutls_safe_renegotiation_status
++	gnutls_certificate_set_retrieve_function
++	gnutls_x509_crt_import_url
++	gnutls_privkey_init
++	gnutls_privkey_deinit
++	gnutls_privkey_get_pk_algorithm
++	gnutls_privkey_get_type
++	gnutls_privkey_import_x509
++	gnutls_privkey_import_openpgp
++	gnutls_privkey_decrypt_data
++	gnutls_x509_crq_privkey_sign
++	gnutls_x509_crl_privkey_sign
++	gnutls_x509_crt_privkey_sign
++	gnutls_pubkey_init
++	gnutls_pubkey_deinit
++	gnutls_pubkey_get_pk_algorithm
++	gnutls_pubkey_import_x509
++	gnutls_pubkey_import_openpgp
++	gnutls_pubkey_export
++	gnutls_pubkey_get_key_id
++	gnutls_pubkey_get_key_usage
++	gnutls_pubkey_import_dsa_raw
++	gnutls_pubkey_import_rsa_raw
++	gnutls_pubkey_import
++	gnutls_x509_crt_set_pubkey
++	gnutls_x509_crq_set_pubkey
++	gnutls_x509_privkey_export_rsa_raw2
++	gnutls_pubkey_get_preferred_hash_algorithm
++	gnutls_x509_crt_get_preferred_hash_algorithm
++	gnutls_global_set_mutex
++	gnutls_transport_set_vec_push_function
++	gnutls_transport_set_errno_function
++	gnutls_sec_param_to_pk_bits
++	gnutls_sec_param_get_name
++	gnutls_pk_bits_to_sec_param
++	gnutls_rnd
++	gnutls_cipher_encrypt2
++	gnutls_cipher_decrypt2
++	gnutls_openpgp_privkey_sec_param
++	gnutls_x509_privkey_sec_param
++	gnutls_session_channel_binding
++	gnutls_privkey_sign_hash
++	gnutls_privkey_sign_data
++	gnutls_pubkey_import_privkey
++	gnutls_certificate_get_issuer
++	gnutls_x509_crq_verify
++	gnutls_global_set_time_function
++	gnutls_x509_trust_list_verify_crt
++	gnutls_x509_trust_list_add_crls
++	gnutls_x509_trust_list_add_cas
++	gnutls_x509_trust_list_init
++	gnutls_x509_trust_list_deinit
++	gnutls_x509_crl_list_import
++	gnutls_x509_crl_list_import2
++	gnutls_x509_crt_list_import2
++	gnutls_cipher_tag
++	gnutls_cipher_add_auth
++	gnutls_dtls_set_timeouts
++	gnutls_transport_set_pull_timeout_function
++	gnutls_dtls_get_mtu
++	gnutls_dtls_set_mtu
++	gnutls_record_recv_seq
++	gnutls_key_generate
++	gnutls_dtls_cookie_verify
++	gnutls_dtls_cookie_send
++	gnutls_dtls_prestate_set
++	gnutls_dtls_get_data_mtu
++	gnutls_dtls_set_data_mtu
++	gnutls_cipher_set_iv
++	gnutls_pcert_deinit
++	gnutls_pcert_import_x509
++	gnutls_pcert_import_x509_raw
++	gnutls_pcert_import_openpgp
++	gnutls_pcert_import_openpgp_raw
++	gnutls_pcert_export_x509
++	gnutls_pcert_export_openpgp
++	gnutls_pubkey_get_openpgp_key_id
++	gnutls_certificate_set_retrieve_function2
++	gnutls_x509_trust_list_get_issuer
++	gnutls_global_set_audit_log_function
++	gnutls_ecc_curve_get_name
++	gnutls_ecc_curve_get_size
++	gnutls_ecc_curve_get
++	gnutls_x509_privkey_export_ecc_raw
++	gnutls_x509_privkey_import_ecc_raw
++	gnutls_pubkey_verify_data2
++	gnutls_x509_trust_list_verify_named_crt
++	gnutls_x509_trust_list_add_named_crt
++	gnutls_alert_get_strname
++	gnutls_pcert_list_import_x509_raw
++	gnutls_pubkey_import_ecc_raw
++	gnutls_record_get_discarded
++	gnutls_x509_crt_get_authority_info_access
++	gnutls_ocsp_req_add_cert
++	gnutls_ocsp_req_add_cert_id
++	gnutls_ocsp_req_deinit
++	gnutls_ocsp_req_export
++	gnutls_ocsp_req_get_cert_id
++	gnutls_ocsp_req_get_extension
++	gnutls_ocsp_req_get_nonce
++	gnutls_ocsp_req_get_version
++	gnutls_ocsp_req_import
++	gnutls_ocsp_req_init
++	gnutls_ocsp_req_print
++	gnutls_ocsp_req_randomize_nonce
++	gnutls_ocsp_req_set_extension
++	gnutls_ocsp_req_set_nonce
++	gnutls_ocsp_resp_deinit
++	gnutls_ocsp_resp_export
++	gnutls_ocsp_resp_get_certs
++	gnutls_ocsp_resp_get_extension
++	gnutls_ocsp_resp_get_nonce
++	gnutls_ocsp_resp_get_produced
++	gnutls_ocsp_resp_get_responder
++	gnutls_ocsp_resp_get_response
++	gnutls_ocsp_resp_get_signature
++	gnutls_ocsp_resp_get_signature_algorithm
++	gnutls_ocsp_resp_get_single
++	gnutls_ocsp_resp_get_status
++	gnutls_ocsp_resp_get_version
++	gnutls_ocsp_resp_import
++	gnutls_ocsp_resp_init
++	gnutls_ocsp_resp_print
++	gnutls_ocsp_resp_verify
++	gnutls_ocsp_resp_verify_direct
++	gnutls_privkey_import_ext
++	gnutls_certificate_set_key
++	gnutls_srp_3072_group_generator
++	gnutls_srp_3072_group_prime
++	gnutls_srp_4096_group_generator
++	gnutls_srp_4096_group_prime
++	gnutls_x509_privkey_verify_params
++	gnutls_priority_get_cipher_suite_index
++	gnutls_random_art
++	gnutls_pubkey_encrypt_data
++	gnutls_x509_dn_oid_name
++	gnutls_session_resumption_requested
++	gnutls_x509_crt_get_authority_key_gn_serial
++	gnutls_x509_crl_get_authority_key_gn_serial
++	gnutls_ecc_curve_list
++	gnutls_priority_certificate_type_list
++	gnutls_priority_sign_list
++	gnutls_priority_protocol_list
++	gnutls_priority_compression_list
++	gnutls_priority_ecc_curve_list
++	gnutls_verify_stored_pubkey
++	gnutls_store_commitment
++	gnutls_store_pubkey
++	gnutls_dtls_get_timeout
++	gnutls_tdb_init
++	gnutls_tdb_set_store_func
++	gnutls_tdb_set_store_commitment_func
++	gnutls_tdb_set_verify_func
++	gnutls_tdb_deinit
++	gnutls_x509_crt_set_authority_info_access
++	gnutls_x509_crt_get_private_key_usage_period
++	gnutls_x509_crq_get_private_key_usage_period
++	gnutls_x509_crt_set_private_key_usage_period
++	gnutls_x509_crq_set_private_key_usage_period
++	gnutls_session_get_random
++	gnutls_pubkey_verify_hash2
++	gnutls_pk_to_sign
++	gnutls_certificate_set_x509_system_trust
++	gnutls_session_set_premaster
++	gnutls_ocsp_resp_check_crt
++	gnutls_x509_trust_list_add_system_trust
++	gnutls_x509_trust_list_add_trust_file
++	gnutls_x509_trust_list_add_trust_mem
++	gnutls_x509_trust_list_iter_get_ca
++	gnutls_x509_trust_list_iter_deinit
++	gnutls_pkcs12_simple_parse
++	gnutls_privkey_import_openpgp_raw
++	gnutls_privkey_import_x509_raw
++	gnutls_load_file
++	gnutls_x509_privkey_import_openssl
++	gnutls_x509_privkey_import2
++	gnutls_privkey_import_ext2
++	gnutls_privkey_import_tpm_raw
++	gnutls_tpm_privkey_generate
++	gnutls_pubkey_import_tpm_raw
++	gnutls_tpm_key_list_deinit
++	gnutls_tpm_key_list_get_url
++	gnutls_tpm_get_registered
++	gnutls_tpm_privkey_delete
++	gnutls_pubkey_import_tpm_url
++	gnutls_privkey_import_tpm_url
++	gnutls_privkey_import_url
++	gnutls_pubkey_import_url
++	gnutls_url_is_supported
++	gnutls_privkey_set_pin_function
++	gnutls_pubkey_set_pin_function
++	gnutls_certificate_set_pin_function
++	gnutls_x509_crt_set_pin_function
++	gnutls_handshake_set_timeout
++	gnutls_sign_get_pk_algorithm
++	gnutls_sign_get_hash_algorithm
++	gnutls_sign_algorithm_get
++	gnutls_x509_privkey_get_pk_algorithm2
++	gnutls_heartbeat_ping
++	gnutls_heartbeat_pong
++	gnutls_heartbeat_enable
++	gnutls_heartbeat_allowed
++	gnutls_heartbeat_get_timeout
++	gnutls_heartbeat_set_timeouts
++	gnutls_certificate_set_ocsp_status_request_function
++	gnutls_certificate_set_ocsp_status_request_file
++	gnutls_ocsp_status_request_enable_client
++	gnutls_ocsp_status_request_get
++	gnutls_dh_params_export2_pkcs3
++	gnutls_pubkey_export2
++	gnutls_x509_crt_export2
++	gnutls_x509_dn_export2
++	gnutls_x509_crl_export2
++	gnutls_pkcs7_export2
++	gnutls_x509_privkey_export2
++	gnutls_x509_privkey_export2_pkcs8
++	gnutls_x509_crq_export2
++	gnutls_openpgp_crt_export2
++	gnutls_openpgp_privkey_export2
++	gnutls_pkcs12_export2
++	gnutls_pubkey_import_openpgp_raw
++	gnutls_pubkey_import_x509_raw
++	gnutls_certificate_get_peers_subkey_id
++	gnutls_session_get_id2
++	gnutls_certificate_verify_peers3
++	gnutls_certificate_verification_status_print
++	gnutls_srtp_get_profile_id
++	gnutls_srtp_get_profile_name
++	gnutls_srtp_get_selected_profile
++	gnutls_srtp_set_profile
++	gnutls_srtp_set_profile_direct
++	gnutls_srtp_get_keys
++	gnutls_srtp_get_mki
++	gnutls_srtp_set_mki
++	gnutls_ocsp_status_request_is_checked
++	gnutls_sign_is_secure
++	gnutls_x509_crt_get_policy
++	gnutls_x509_policy_release
++	gnutls_x509_crt_set_policy
++	gnutls_pubkey_import_x509_crq
++	gnutls_pubkey_print
++	gnutls_x509_crt_set_dn
++	gnutls_x509_crq_set_dn
++	gnutls_x509_crt_set_issuer_dn
++	gnutls_session_force_valid
++	gnutls_record_can_use_length_hiding
++	gnutls_range_split
++	gnutls_record_send_range
++	gnutls_db_check_entry_time
++	gnutls_handshake_set_random
++	gnutls_record_cork
++	gnutls_record_uncork
++	gnutls_transport_set_int2
++	gnutls_transport_get_int2
++	gnutls_transport_get_int
++	gnutls_x509_crt_get_issuer_dn2
++	gnutls_x509_crt_get_dn2
++	gnutls_x509_crl_get_issuer_dn2
++	gnutls_x509_crq_get_dn2
++	gnutls_x509_trust_list_remove_trust_mem
++	gnutls_x509_trust_list_remove_trust_file
++	gnutls_x509_trust_list_remove_cas
++	gnutls_session_get_desc
++	gnutls_privkey_status
++	gnutls_cipher_get_iv_size
++	gnutls_hmac_set_nonce
++	gnutls_sign_algorithm_get_client
++	gnutls_certificate_set_x509_key_mem2
++	gnutls_certificate_set_x509_key_file2
++	gnutls_alpn_get_selected_protocol
++	gnutls_alpn_set_protocols
++	gnutls_session_set_id
++	gnutls_certificate_set_trust_list
++	gnutls_certificate_get_trust_list
++	gnutls_cipher_get_tag_size
++	gnutls_record_overhead_size
++	gnutls_handshake_set_hook_function
++	gnutls_handshake_description_get_name
++	gnutls_digest_list
++	gnutls_digest_get_id
++	gnutls_digest_get_name
++	gnutls_priority_mac_list
++	gnutls_priority_cipher_list
++	gnutls_priority_kx_list
++	gnutls_record_set_timeout
++	gnutls_est_record_overhead_size
++	gnutls_pubkey_set_key_usage
++	gnutls_x509_privkey_import_rsa_raw2
++	gnutls_pubkey_import_ecc_x962
++	gnutls_rnd_refresh
++	gnutls_mac_get_nonce_size
++	gnutls_x509_crl_get_raw_issuer_dn
++	gnutls_certificate_get_crt_raw
++	gnutls_privkey_generate
++	gnutls_privkey_export_x509
++	gnutls_privkey_export_openpgp
++	gnutls_fips140_mode_enabled
++	gnutls_record_check_corked
++	gnutls_sec_param_to_symmetric_bits
++	gnutls_privkey_export_ecc_raw
++	gnutls_privkey_export_dsa_raw
++	gnutls_privkey_export_rsa_raw
++	gnutls_privkey_import_rsa_raw
++	gnutls_privkey_import_dsa_raw
++	gnutls_privkey_import_ecc_raw
++	gnutls_pubkey_export_ecc_x962
++	gnutls_pubkey_export_ecc_raw
++	gnutls_pubkey_export_dsa_raw
++	gnutls_pubkey_export_rsa_raw
++	gnutls_privkey_verify_params
++	gnutls_pubkey_verify_params
++	gnutls_db_get_default_cache_expiration
++	gnutls_x509_name_constraints_init
++	gnutls_x509_name_constraints_deinit
++	gnutls_x509_crt_get_name_constraints
++	gnutls_x509_name_constraints_add_permitted
++	gnutls_x509_name_constraints_add_excluded
++	gnutls_x509_crt_set_name_constraints
++	gnutls_x509_name_constraints_get_permitted
++	gnutls_x509_name_constraints_get_excluded
++	gnutls_x509_name_constraints_check
++	gnutls_x509_name_constraints_check_crt
++	gnutls_x509_cidr_to_rfc5280
++	gnutls_srp_set_server_fake_salt_seed
++	gnutls_x509_crt_get_extension_data2
++	gnutls_x509_crq_get_extension_data2
++	gnutls_x509_crl_get_extension_data2
++	gnutls_subject_alt_names_init
++	gnutls_subject_alt_names_deinit
++	gnutls_subject_alt_names_get
++	gnutls_subject_alt_names_set
++	gnutls_x509_ext_import_subject_alt_names
++	gnutls_x509_ext_export_subject_alt_names
++	gnutls_x509_crl_dist_points_init
++	gnutls_x509_crl_dist_points_deinit
++	gnutls_x509_crl_dist_points_get
++	gnutls_x509_crl_dist_points_set
++	gnutls_x509_ext_import_crl_dist_points
++	gnutls_x509_ext_export_crl_dist_points
++	gnutls_x509_ext_import_name_constraints
++	gnutls_x509_ext_export_name_constraints
++	gnutls_x509_aia_init
++	gnutls_x509_aia_deinit
++	gnutls_x509_aia_get
++	gnutls_x509_aia_set
++	gnutls_x509_ext_import_aia
++	gnutls_x509_ext_export_aia
++	gnutls_x509_ext_import_subject_key_id
++	gnutls_x509_ext_export_subject_key_id
++	gnutls_x509_ext_export_authority_key_id
++	gnutls_x509_ext_import_authority_key_id
++	gnutls_x509_aki_init
++	gnutls_x509_aki_get_id
++	gnutls_x509_aki_get_cert_issuer
++	gnutls_x509_aki_set_id
++	gnutls_x509_aki_set_cert_issuer
++	gnutls_x509_aki_deinit
++	gnutls_x509_ext_import_private_key_usage_period
++	gnutls_x509_ext_export_private_key_usage_period
++	gnutls_x509_ext_import_basic_constraints
++	gnutls_x509_ext_export_basic_constraints
++	gnutls_x509_ext_import_key_usage
++	gnutls_x509_ext_export_key_usage
++	gnutls_x509_ext_import_proxy
++	gnutls_x509_ext_export_proxy
++	gnutls_x509_policies_init
++	gnutls_x509_policies_deinit
++	gnutls_x509_policies_get
++	gnutls_x509_policies_set
++	gnutls_x509_ext_import_policies
++	gnutls_x509_ext_export_policies
++	gnutls_x509_crt_set_issuer_alt_name
++	gnutls_x509_key_purpose_init
++	gnutls_x509_key_purpose_deinit
++	gnutls_x509_key_purpose_set
++	gnutls_x509_key_purpose_get
++	gnutls_x509_ext_import_key_purposes
++	gnutls_x509_ext_export_key_purposes
++	gnutls_x509_crt_check_hostname2
++	gnutls_openpgp_crt_check_hostname2
++	gnutls_certificate_verify_peers
++	gnutls_certificate_get_verify_flags
++	gnutls_certificate_get_x509_key
++	gnutls_certificate_get_x509_crt
++	gnutls_certificate_get_openpgp_key
++	gnutls_certificate_get_openpgp_crt
++	gnutls_credentials_get
++	gnutls_x509_crl_iter_crt_serial
++	gnutls_x509_crl_iter_deinit
++	gnutls_packet_deinit
++	gnutls_record_recv_packet
++	gnutls_packet_get
++	gnutls_x509_trust_list_add_trust_dir
++	gnutls_certificate_set_x509_trust_dir
++	gnutls_pkcs_schema_get_name
++	gnutls_pkcs_schema_get_oid
++	gnutls_pkcs8_info
++	gnutls_pkcs12_bag_enc_info
++	gnutls_pkcs12_mac_info
++	gnutls_pkcs12_generate_mac2
++	gnutls_x509_trust_list_verify_crt2
++	gnutls_x509_crt_get_extension_by_oid2
++	gnutls_x509_crq_get_extension_by_oid2
++	gnutls_x509_ext_deinit
++	gnutls_x509_ext_print
++	gnutls_x509_othername_to_virtual
++	gnutls_x509_crq_get_signature_algorithm
++	gnutls_privkey_import_ext3
++	gnutls_record_discard_queued
++	gnutls_session_ext_master_secret_status
++	gnutls_session_etm_status
++	gnutls_priority_string_list
++	gnutls_aead_cipher_init
++	gnutls_aead_cipher_decrypt
++	gnutls_aead_cipher_encrypt
++	gnutls_aead_cipher_deinit
++	gnutls_dh_params_import_raw2
++	gnutls_memset
++	gnutls_memcmp
++	gnutls_pkcs12_bag_set_privkey
++	gnutls_x509_privkey_set_pin_function
++	gnutls_ocsp_resp_get_responder_raw_id
++	gnutls_system_key_iter_deinit
++	gnutls_system_key_iter_get_info
++	gnutls_system_key_delete
++	gnutls_system_key_add_x509
++	gnutls_register_custom_url
++	gnutls_pcert_import_x509_list
++	gnutls_x509_trust_list_get_issuer_by_dn
++	gnutls_system_recv_timeout
++	gnutls_record_set_state
++	gnutls_record_get_state
++	gnutls_crypto_register_cipher
++	gnutls_crypto_register_aead_cipher
++	gnutls_crypto_register_mac
++	gnutls_crypto_register_digest
++	gnutls_ext_register
++	gnutls_buffer_append_data
++	gnutls_supplemental_register
++	gnutls_supplemental_send
++	gnutls_supplemental_recv
++	gnutls_ext_get_data
++	gnutls_ext_set_data
++	gnutls_openpgp_crt_check_email
++	gnutls_x509_crt_check_email
++	gnutls_x509_crt_get_pk_ecc_raw
++	gnutls_x509_dn_get_str
++	gnutls_x509_trust_list_get_issuer_by_subject_key_id
++	gnutls_pkcs7_get_crt_raw2
++	gnutls_pkcs7_signature_info_deinit
++	gnutls_pkcs7_get_signature_info
++	gnutls_pkcs7_verify_direct
++	gnutls_pkcs7_verify
++	gnutls_pkcs7_get_crl_raw2
++	gnutls_pkcs7_sign
++	gnutls_pkcs7_attrs_deinit
++	gnutls_pkcs7_add_attr
++	gnutls_pkcs7_get_attr
++	gnutls_pkcs7_print
++	gnutls_x509_crt_verify_data2
++	gnutls_pkcs7_get_signature_count
++	gnutls_ecc_curve_get_oid
++	gnutls_digest_get_oid
++	gnutls_pk_get_oid
++	gnutls_sign_get_oid
++	gnutls_ecc_curve_get_id
++	gnutls_oid_to_digest
++	gnutls_oid_to_pk
++	gnutls_oid_to_sign
++	gnutls_oid_to_ecc_curve
++	gnutls_prf_rfc5705
++	gnutls_hex_decode2
++	gnutls_hex_encode2
++	gnutls_session_set_verify_function
++	gnutls_session_set_verify_cert
++	gnutls_session_set_verify_cert2
++	gnutls_session_get_verify_cert_status
++	gnutls_x509_privkey_generate2
++	gnutls_x509_privkey_get_seed
++	gnutls_x509_privkey_verify_seed
++	gnutls_privkey_generate2
++	gnutls_privkey_get_seed
++	gnutls_privkey_verify_seed
++	gnutls_x509_privkey_set_flags
++	gnutls_privkey_set_flags
++	gnutls_x509_crt_set_subject_unique_id
++	gnutls_x509_crt_set_issuer_unique_id
++	gnutls_certificate_set_flags
++	gnutls_decode_ber_digest_info
++	gnutls_encode_ber_digest_info
++	gnutls_pkcs7_get_embedded_data
++	gnutls_x509_crq_set_subject_alt_othername
++	gnutls_x509_crt_set_subject_alt_othername
++	gnutls_x509_crt_set_issuer_alt_othername
++	gnutls_dh_params_import_dsa
++	gnutls_session_get_flags
++	gnutls_session_get_master_secret
++	gnutls_x509_crt_get_signature_oid
++	gnutls_x509_crt_get_pk_oid
++	gnutls_x509_crq_get_signature_oid
++	gnutls_x509_crq_get_pk_oid
++	gnutls_x509_crl_get_signature_oid
++	gnutls_ecc_curve_get_pk
++	gnutls_x509_crt_equals
++	gnutls_x509_crt_equals2
++	gnutls_x509_ext_import_tlsfeatures
++	gnutls_x509_ext_export_tlsfeatures
++	gnutls_x509_tlsfeatures_add
++	gnutls_x509_tlsfeatures_init
++	gnutls_x509_tlsfeatures_deinit
++	gnutls_x509_tlsfeatures_get
++	gnutls_x509_crt_get_tlsfeatures
++	gnutls_x509_crt_set_tlsfeatures
++	gnutls_x509_crq_get_tlsfeatures
++	gnutls_x509_crq_set_tlsfeatures
++	gnutls_ext_get_name
++	gnutls_x509_crt_set_crq_extension_by_oid
++	gnutls_x509_tlsfeatures_check_crt
++	gnutls_x509_crq_set_extension_by_oid
++	gnutls_x509_dn_set_str
++	gnutls_transport_set_fastopen
++	gnutls_oid_to_mac
++	gnutls_certificate_set_ocsp_status_request_function2
++	gnutls_session_ext_register
++	gnutls_session_supplemental_register
++	gnutls_pkcs7_get_embedded_data_oid
++	gnutls_ffdhe_8192_group_prime
++	gnutls_ffdhe_8192_group_generator
++	gnutls_ffdhe_4096_group_prime
++	gnutls_ffdhe_4096_group_generator
++	gnutls_ffdhe_3072_group_prime
++	gnutls_ffdhe_3072_group_generator
++	gnutls_ffdhe_2048_group_prime
++	gnutls_ffdhe_2048_group_generator
++	gnutls_ffdhe_8192_key_bits
++	gnutls_ffdhe_4096_key_bits
++	gnutls_ffdhe_2048_key_bits
++	gnutls_ffdhe_3072_key_bits
++	gnutls_certificate_set_known_dh_params
++	gnutls_anon_set_server_known_dh_params
++	gnutls_psk_set_server_known_dh_params
++	gnutls_x509_crt_check_key_purpose
++	gnutls_ocsp_resp_get_responder2
++	gnutls_x509_crt_get_issuer_dn3
++	gnutls_x509_crt_get_dn3
++	gnutls_x509_rdn_get2
++	gnutls_x509_dn_get_str2
++	gnutls_x509_crl_get_issuer_dn3
++	gnutls_x509_crq_get_dn3
++	gnutls_utf8_password_normalize
++	gnutls_idna_map
++	gnutls_idna_reverse_map
+diff --git a/SMP/libgnutls.sln b/SMP/libgnutls.sln
+new file mode 100644
+index 0000000..86b4ce7
+--- /dev/null
++++ b/SMP/libgnutls.sln
+@@ -0,0 +1,57 @@
++
++Microsoft Visual Studio Solution File, Format Version 12.00
++VisualStudioVersion = 12.0.30501.0
++MinimumVisualStudioVersion = 12.0.30501.0
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgnutls", "libgnutls.vcxproj", "{6F610EE8-7F59-4191-AB88-F63843267C02}"
++EndProject
++Global
++	GlobalSection(SolutionConfigurationPlatforms) = preSolution
++		Debug|x64 = Debug|x64
++		Debug|x86 = Debug|x86
++		DebugDLL|x64 = DebugDLL|x64
++		DebugDLL|x86 = DebugDLL|x86
++		DebugDLLStaticDeps|x64 = DebugDLLStaticDeps|x64
++		DebugDLLStaticDeps|x86 = DebugDLLStaticDeps|x86
++		Release|x64 = Release|x64
++		Release|x86 = Release|x86
++		ReleaseDLL|x64 = ReleaseDLL|x64
++		ReleaseDLL|x86 = ReleaseDLL|x86
++		ReleaseDLLStaticDeps|x64 = ReleaseDLLStaticDeps|x64
++		ReleaseDLLStaticDeps|x86 = ReleaseDLLStaticDeps|x86
++		ReleaseLTO|x64 = ReleaseLTO|x64
++		ReleaseLTO|x86 = ReleaseLTO|x86
++	EndGlobalSection
++	GlobalSection(ProjectConfigurationPlatforms) = postSolution
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Debug|x64.ActiveCfg = Debug|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Debug|x64.Build.0 = Debug|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Debug|x86.ActiveCfg = Debug|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Debug|x86.Build.0 = Debug|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLL|x64.ActiveCfg = DebugDLL|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLL|x64.Build.0 = DebugDLL|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLL|x86.ActiveCfg = DebugDLL|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLL|x86.Build.0 = DebugDLL|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLLStaticDeps|x64.ActiveCfg = DebugDLLStaticDeps|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLLStaticDeps|x64.Build.0 = DebugDLLStaticDeps|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLLStaticDeps|x86.ActiveCfg = DebugDLLStaticDeps|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLLStaticDeps|x86.Build.0 = DebugDLLStaticDeps|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Release|x64.ActiveCfg = Release|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Release|x64.Build.0 = Release|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Release|x86.ActiveCfg = Release|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Release|x86.Build.0 = Release|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLL|x86.ActiveCfg = ReleaseDLL|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLL|x86.Build.0 = ReleaseDLL|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLLStaticDeps|x64.ActiveCfg = ReleaseDLLStaticDeps|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLLStaticDeps|x64.Build.0 = ReleaseDLLStaticDeps|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLLStaticDeps|x86.ActiveCfg = ReleaseDLLStaticDeps|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLLStaticDeps|x86.Build.0 = ReleaseDLLStaticDeps|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseLTO|x64.ActiveCfg = ReleaseLTO|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseLTO|x64.Build.0 = ReleaseLTO|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseLTO|x86.ActiveCfg = ReleaseLTO|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseLTO|x86.Build.0 = ReleaseLTO|Win32
++	EndGlobalSection
++	GlobalSection(SolutionProperties) = preSolution
++		HideSolutionNode = FALSE
++	EndGlobalSection
++EndGlobal
+diff --git a/SMP/libgnutls.vcxproj b/SMP/libgnutls.vcxproj
+new file mode 100644
+index 0000000..1b385ab
+--- /dev/null
++++ b/SMP/libgnutls.vcxproj
+@@ -0,0 +1,2811 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++  <ItemGroup Label="ProjectConfigurations">
++    <ProjectConfiguration Include="DebugDLLStaticDeps|Win32">
++      <Configuration>DebugDLLStaticDeps</Configuration>
++      <Platform>Win32</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="DebugDLLStaticDeps|x64">
++      <Configuration>DebugDLLStaticDeps</Configuration>
++      <Platform>x64</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="DebugDLL|Win32">
++      <Configuration>DebugDLL</Configuration>
++      <Platform>Win32</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="DebugDLL|x64">
++      <Configuration>DebugDLL</Configuration>
++      <Platform>x64</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="Debug|Win32">
++      <Configuration>Debug</Configuration>
++      <Platform>Win32</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="Debug|x64">
++      <Configuration>Debug</Configuration>
++      <Platform>x64</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="ReleaseDLLStaticDeps|Win32">
++      <Configuration>ReleaseDLLStaticDeps</Configuration>
++      <Platform>Win32</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="ReleaseDLLStaticDeps|x64">
++      <Configuration>ReleaseDLLStaticDeps</Configuration>
++      <Platform>x64</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="ReleaseDLL|Win32">
++      <Configuration>ReleaseDLL</Configuration>
++      <Platform>Win32</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="ReleaseDLL|x64">
++      <Configuration>ReleaseDLL</Configuration>
++      <Platform>x64</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="ReleaseLTO|Win32">
++      <Configuration>ReleaseLTO</Configuration>
++      <Platform>Win32</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="ReleaseLTO|x64">
++      <Configuration>ReleaseLTO</Configuration>
++      <Platform>x64</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="Release|Win32">
++      <Configuration>Release</Configuration>
++      <Platform>Win32</Platform>
++    </ProjectConfiguration>
++    <ProjectConfiguration Include="Release|x64">
++      <Configuration>Release</Configuration>
++      <Platform>x64</Platform>
++    </ProjectConfiguration>
++  </ItemGroup>
++  <ItemGroup>
++    <ClInclude Include="..\lib\abstract_int.h" />
++    <ClInclude Include="..\lib\accelerated\accelerated.h" />
++    <ClInclude Include="..\lib\accelerated\cryptodev.h" />
++    <ClInclude Include="..\lib\accelerated\x86\aes-gcm-aead.h" />
++    <ClInclude Include="..\lib\accelerated\x86\aes-padlock.h" />
++    <ClInclude Include="..\lib\accelerated\x86\aes-x86.h" />
++    <ClInclude Include="..\lib\accelerated\x86\sha-padlock.h" />
++    <ClInclude Include="..\lib\accelerated\x86\sha-x86.h" />
++    <ClInclude Include="..\lib\accelerated\x86\x86-common.h" />
++    <ClInclude Include="..\lib\algorithms.h" />
++    <ClInclude Include="..\lib\atfork.h" />
++    <ClInclude Include="..\lib\auth.h" />
++    <ClInclude Include="..\lib\auth\anon.h" />
++    <ClInclude Include="..\lib\auth\cert.h" />
++    <ClInclude Include="..\lib\auth\dh_common.h" />
++    <ClInclude Include="..\lib\auth\ecdhe.h" />
++    <ClInclude Include="..\lib\auth\psk.h" />
++    <ClInclude Include="..\lib\auth\psk_passwd.h" />
++    <ClInclude Include="..\lib\auth\rsa_common.h" />
++    <ClInclude Include="..\lib\auth\srp_kx.h" />
++    <ClInclude Include="..\lib\auth\srp_passwd.h" />
++    <ClInclude Include="..\lib\buffers.h" />
++    <ClInclude Include="..\lib\cipher.h" />
++    <ClInclude Include="..\lib\cipher_int.h" />
++    <ClInclude Include="..\lib\compress.h" />
++    <ClInclude Include="..\lib\constate.h" />
++    <ClInclude Include="..\lib\crypto-backend.h" />
++    <ClInclude Include="..\lib\crypto.h" />
++    <ClInclude Include="..\lib\datum.h" />
++    <ClInclude Include="..\lib\db.h" />
++    <ClInclude Include="..\lib\debug.h" />
++    <ClInclude Include="..\lib\dh.h" />
++    <ClInclude Include="..\lib\dtls.h" />
++    <ClInclude Include="..\lib\ecc.h" />
++    <ClInclude Include="..\lib\errors.h" />
++    <ClInclude Include="..\lib\extensions.h" />
++    <ClInclude Include="..\lib\extras\hex.h" />
++    <ClInclude Include="..\lib\extras\randomart.h" />
++    <ClInclude Include="..\lib\ext\alpn.h" />
++    <ClInclude Include="..\lib\ext\cert_type.h" />
++    <ClInclude Include="..\lib\ext\dumbfw.h" />
++    <ClInclude Include="..\lib\ext\ecc.h" />
++    <ClInclude Include="..\lib\ext\etm.h" />
++    <ClInclude Include="..\lib\ext\ext_master_secret.h" />
++    <ClInclude Include="..\lib\ext\heartbeat.h" />
++    <ClInclude Include="..\lib\ext\max_record.h" />
++    <ClInclude Include="..\lib\ext\safe_renegotiation.h" />
++    <ClInclude Include="..\lib\ext\server_name.h" />
++    <ClInclude Include="..\lib\ext\session_ticket.h" />
++    <ClInclude Include="..\lib\ext\signature.h" />
++    <ClInclude Include="..\lib\ext\srp.h" />
++    <ClInclude Include="..\lib\ext\srtp.h" />
++    <ClInclude Include="..\lib\ext\status_request.h" />
++    <ClInclude Include="..\lib\file.h" />
++    <ClInclude Include="..\lib\fips.h" />
++    <ClInclude Include="..\lib\global.h" />
++    <ClInclude Include="..\lib\gnutls_int.h" />
++    <ClInclude Include="..\lib\handshake.h" />
++    <ClInclude Include="..\lib\hash_int.h" />
++    <ClInclude Include="..\lib\includes\gnutls\abstract.h" />
++    <ClInclude Include="..\lib\includes\gnutls\compat.h" />
++    <ClInclude Include="..\lib\includes\gnutls\crypto.h" />
++    <ClInclude Include="..\lib\includes\gnutls\dtls.h" />
++    <ClInclude Include="..\lib\includes\gnutls\ocsp.h" />
++    <ClInclude Include="..\lib\includes\gnutls\openpgp.h" />
++    <ClInclude Include="..\lib\includes\gnutls\pkcs11.h" />
++    <ClInclude Include="..\lib\includes\gnutls\pkcs12.h" />
++    <ClInclude Include="..\lib\includes\gnutls\pkcs7.h" />
++    <ClInclude Include="..\lib\includes\gnutls\self-test.h" />
++    <ClInclude Include="..\lib\includes\gnutls\socket.h" />
++    <ClInclude Include="..\lib\includes\gnutls\system-keys.h" />
++    <ClInclude Include="..\lib\includes\gnutls\tpm.h" />
++    <ClInclude Include="..\lib\includes\gnutls\urls.h" />
++    <ClInclude Include="..\lib\includes\gnutls\x509-ext.h" />
++    <ClInclude Include="..\lib\includes\gnutls\x509.h" />
++    <ClInclude Include="..\lib\kx.h" />
++    <ClInclude Include="..\lib\locks.h" />
++    <ClInclude Include="..\lib\mbuffers.h" />
++    <ClInclude Include="..\lib\mem.h" />
++    <ClInclude Include="..\lib\minitasn1\element.h" />
++    <ClInclude Include="..\lib\minitasn1\gstr.h" />
++    <ClInclude Include="..\lib\minitasn1\int.h" />
++    <ClInclude Include="..\lib\minitasn1\libtasn1.h" />
++    <ClInclude Include="..\lib\minitasn1\parser_aux.h" />
++    <ClInclude Include="..\lib\minitasn1\structure.h" />
++    <ClInclude Include="..\lib\mpi.h" />
++    <ClInclude Include="..\lib\nettle\gnettle.h" />
++    <ClInclude Include="..\lib\nettle\int\dsa-fips.h" />
++    <ClInclude Include="..\lib\nettle\int\rsa-fips.h" />
++    <ClInclude Include="..\lib\nettle\rnd-common.h" />
++    <ClInclude Include="..\lib\num.h" />
++    <ClInclude Include="..\lib\opencdk\context.h" />
++    <ClInclude Include="..\lib\opencdk\filters.h" />
++    <ClInclude Include="..\lib\opencdk\keydb.h" />
++    <ClInclude Include="..\lib\opencdk\main.h" />
++    <ClInclude Include="..\lib\opencdk\opencdk.h" />
++    <ClInclude Include="..\lib\opencdk\packet.h" />
++    <ClInclude Include="..\lib\opencdk\stream.h" />
++    <ClInclude Include="..\lib\opencdk\types.h" />
++    <ClInclude Include="..\lib\openpgp\openpgp.h" />
++    <ClInclude Include="..\lib\openpgp\openpgp_int.h" />
++    <ClInclude Include="..\lib\pin.h" />
++    <ClInclude Include="..\lib\pk.h" />
++    <ClInclude Include="..\lib\random.h" />
++    <ClInclude Include="..\lib\record.h" />
++    <ClInclude Include="..\lib\session_pack.h" />
++    <ClInclude Include="..\lib\srp.h" />
++    <ClInclude Include="..\lib\sslv2_compat.h" />
++    <ClInclude Include="..\lib\state.h" />
++    <ClInclude Include="..\lib\str.h" />
++    <ClInclude Include="..\lib\str_array.h" />
++    <ClInclude Include="..\lib\supplemental.h" />
++    <ClInclude Include="..\lib\system-keys.h" />
++    <ClInclude Include="..\lib\system.h" />
++    <ClInclude Include="..\lib\tls-sig.h" />
++    <ClInclude Include="..\lib\unistring\unicase\special-casing-table.h" />
++    <ClInclude Include="..\lib\unistring\unictype\bitmap.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_C.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Cc.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Cf.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Cn.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Co.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Cs.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_L.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_LC.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Ll.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Lm.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Lo.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Lt.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Lu.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_M.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Mc.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Me.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Mn.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_N.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Nd.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Nl.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_No.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_of.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_P.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pc.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pd.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pe.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pf.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pi.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Po.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Ps.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_S.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Sc.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Sk.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Sm.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_So.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Z.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Zl.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Zp.h" />
++    <ClInclude Include="..\lib\unistring\unictype\categ_Zs.h" />
++    <ClInclude Include="..\lib\unistring\unictype\combiningclass.h" />
++    <ClInclude Include="..\lib\unistring\unictype\pr_default_ignorable_code_point.h" />
++    <ClInclude Include="..\lib\unistring\unictype\pr_join_control.h" />
++    <ClInclude Include="..\lib\unistring\unictype\pr_not_a_character.h" />
++    <ClInclude Include="..\lib\unistring\uninorm\composition-table.h" />
++    <ClInclude Include="..\lib\unistring\uninorm\decompose-internal.h" />
++    <ClInclude Include="..\lib\unistring\uninorm\decomposition-table.h" />
++    <ClInclude Include="..\lib\unistring\uninorm\decomposition-table1.h" />
++    <ClInclude Include="..\lib\unistring\uninorm\decomposition-table2.h" />
++    <ClInclude Include="..\lib\unistring\uninorm\normalize-internal.h" />
++    <ClInclude Include="..\lib\unistring\uninorm\u-normalize-internal.h" />
++    <ClInclude Include="..\lib\unistring\unistr\u-cpy.h" />
++    <ClInclude Include="..\lib\urls.h" />
++    <ClInclude Include="..\lib\vasprintf.h" />
++    <ClInclude Include="..\lib\x509.h" />
++    <ClInclude Include="..\lib\x509\attributes.h" />
++    <ClInclude Include="..\lib\x509\common.h" />
++    <ClInclude Include="..\lib\x509\ip-in-cidr.h" />
++    <ClInclude Include="..\lib\x509\ip.h" />
++    <ClInclude Include="..\lib\x509\krb5.h" />
++    <ClInclude Include="..\lib\x509\pkcs7_int.h" />
++    <ClInclude Include="..\lib\x509\prov-seed.h" />
++    <ClInclude Include="..\lib\x509\verify-high.h" />
++    <ClInclude Include="..\lib\x509\virt-san.h" />
++    <ClInclude Include="..\lib\x509\x509_ext_int.h" />
++    <ClInclude Include="..\lib\x509\x509_int.h" />
++    <ClInclude Include="..\lib\x509_b64.h" />
++    <ClInclude Include="config.h" />
++    <ClInclude Include="lib\priority_options.h" />
++    <ClInclude Include="version.h" />
++  </ItemGroup>
++  <ItemGroup>
++    <ClCompile Include="..\gl\c-ctype.c" />
++    <ClCompile Include="..\gl\hash-pjw-bare.c" />
++    <ClCompile Include="..\gl\msvc-inval.c" />
++    <ClCompile Include="..\gl\msvc-nothrow.c" />
++    <ClCompile Include="..\gl\read-file.c" />
++    <ClCompile Include="..\gl\secure_getenv.c" />
++    <ClCompile Include="..\lib\accelerated\accelerated.c" />
++    <ClCompile Include="..\lib\accelerated\cryptodev-gcm.c" />
++    <ClCompile Include="..\lib\accelerated\cryptodev.c" />
++    <ClCompile Include="..\lib\accelerated\x86\aes-cbc-x86-aesni.c" />
++    <ClCompile Include="..\lib\accelerated\x86\aes-cbc-x86-ssse3.c" />
++    <ClCompile Include="..\lib\accelerated\x86\aes-ccm-x86-aesni.c" />
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-padlock.c" />
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-x86-aesni.c" />
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-x86-pclmul-avx.c">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-x86-pclmul.c">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-x86-ssse3.c" />
++    <ClCompile Include="..\lib\accelerated\x86\aes-padlock.c" />
++    <ClCompile Include="..\lib\accelerated\x86\hmac-padlock.c" />
++    <ClCompile Include="..\lib\accelerated\x86\hmac-x86-ssse3.c" />
++    <ClCompile Include="..\lib\accelerated\x86\sha-padlock.c" />
++    <ClCompile Include="..\lib\accelerated\x86\sha-x86-ssse3.c" />
++    <ClCompile Include="..\lib\accelerated\x86\x86-common.c" />
++    <ClCompile Include="..\lib\alert.c" />
++    <ClCompile Include="..\lib\algorithms\cert_types.c" />
++    <ClCompile Include="..\lib\algorithms\ciphers.c" />
++    <ClCompile Include="..\lib\algorithms\ciphersuites.c" />
++    <ClCompile Include="..\lib\algorithms\ecc.c" />
++    <ClCompile Include="..\lib\algorithms\groups.c" />
++    <ClCompile Include="..\lib\algorithms\kx.c" />
++    <ClCompile Include="..\lib\algorithms\mac.c" />
++    <ClCompile Include="..\lib\algorithms\protocols.c" />
++    <ClCompile Include="..\lib\algorithms\publickey.c" />
++    <ClCompile Include="..\lib\algorithms\secparams.c" />
++    <ClCompile Include="..\lib\algorithms\sign.c" />
++    <ClCompile Include="..\lib\anon_cred.c" />
++    <ClCompile Include="..\lib\atfork.c" />
++    <ClCompile Include="..\lib\auth.c" />
++    <ClCompile Include="..\lib\auth\anon.c" />
++    <ClCompile Include="..\lib\auth\anon_ecdh.c" />
++    <ClCompile Include="..\lib\auth\cert.c">
++      <ObjectFileName>$(IntDir)\auth_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\dhe.c" />
++    <ClCompile Include="..\lib\auth\dhe_psk.c" />
++    <ClCompile Include="..\lib\auth\dh_common.c" />
++    <ClCompile Include="..\lib\auth\ecdhe.c" />
++    <ClCompile Include="..\lib\auth\psk.c">
++      <ObjectFileName>$(IntDir)\auth_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\psk_passwd.c" />
++    <ClCompile Include="..\lib\auth\rsa.c" />
++    <ClCompile Include="..\lib\auth\rsa_psk.c" />
++    <ClCompile Include="..\lib\auth\srp_kx.c" />
++    <ClCompile Include="..\lib\auth\srp_passwd.c" />
++    <ClCompile Include="..\lib\auth\srp_rsa.c" />
++    <ClCompile Include="..\lib\auth\srp_sb64.c" />
++    <ClCompile Include="..\lib\auto-verify.c" />
++    <ClCompile Include="..\lib\buffers.c" />
++    <ClCompile Include="..\lib\cert-cred-rawpk.c" />
++    <ClCompile Include="..\lib\cert-cred-x509.c" />
++    <ClCompile Include="..\lib\cert-cred.c" />
++    <ClCompile Include="..\lib\cert-session.c" />
++    <ClCompile Include="..\lib\cipher-cbc.c" />
++    <ClCompile Include="..\lib\cipher.c" />
++    <ClCompile Include="..\lib\cipher_int.c" />
++    <ClCompile Include="..\lib\compress.c" />
++    <ClCompile Include="..\lib\constate.c" />
++    <ClCompile Include="..\lib\crypto-api.c" />
++    <ClCompile Include="..\lib\crypto-backend.c" />
++    <ClCompile Include="..\lib\crypto-selftests-pk.c" />
++    <ClCompile Include="..\lib\crypto-selftests.c" />
++    <ClCompile Include="..\lib\datum.c" />
++    <ClCompile Include="..\lib\db.c" />
++    <ClCompile Include="..\lib\debug.c" />
++    <ClCompile Include="..\lib\dh-primes.c" />
++    <ClCompile Include="..\lib\dh-session.c" />
++    <ClCompile Include="..\lib\dh.c" />
++    <ClCompile Include="..\lib\dtls-sw.c" />
++    <ClCompile Include="..\lib\dtls.c" />
++    <ClCompile Include="..\lib\ecc.c" />
++    <ClCompile Include="..\lib\errors.c" />
++    <ClCompile Include="..\lib\extras\hex.c" />
++    <ClCompile Include="..\lib\extras\randomart.c">
++      <ObjectFileName>$(IntDir)\extras_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\extv.c" />
++    <ClCompile Include="..\lib\ext\alpn.c" />
++    <ClCompile Include="..\lib\ext\client_cert_type.c" />
++    <ClCompile Include="..\lib\ext\cookie.c" />
++    <ClCompile Include="..\lib\ext\dumbfw.c" />
++    <ClCompile Include="..\lib\ext\early_data.c" />
++    <ClCompile Include="..\lib\ext\ec_point_formats.c" />
++    <ClCompile Include="..\lib\ext\etm.c" />
++    <ClCompile Include="..\lib\ext\ext_master_secret.c" />
++    <ClCompile Include="..\lib\ext\heartbeat.c" />
++    <ClCompile Include="..\lib\ext\key_share.c" />
++    <ClCompile Include="..\lib\ext\max_record.c" />
++    <ClCompile Include="..\lib\ext\post_handshake.c" />
++    <ClCompile Include="..\lib\ext\pre_shared_key.c" />
++    <ClCompile Include="..\lib\ext\psk_ke_modes.c" />
++    <ClCompile Include="..\lib\ext\record_size_limit.c" />
++    <ClCompile Include="..\lib\ext\safe_renegotiation.c" />
++    <ClCompile Include="..\lib\ext\server_cert_type.c" />
++    <ClCompile Include="..\lib\ext\server_name.c" />
++    <ClCompile Include="..\lib\ext\session_ticket.c" />
++    <ClCompile Include="..\lib\ext\signature.c" />
++    <ClCompile Include="..\lib\ext\srp.c" />
++    <ClCompile Include="..\lib\ext\srtp.c" />
++    <ClCompile Include="..\lib\ext\status_request.c" />
++    <ClCompile Include="..\lib\ext\supported_groups.c" />
++    <ClCompile Include="..\lib\ext\supported_versions.c" />
++    <ClCompile Include="..\lib\file.c" />
++    <ClCompile Include="..\lib\fingerprint.c" />
++    <ClCompile Include="..\lib\fips.c" />
++    <ClCompile Include="..\lib\global.c" />
++    <ClCompile Include="..\lib\gnutls_asn1_tab.c" />
++    <ClCompile Include="..\lib\handshake-checks.c" />
++    <ClCompile Include="..\lib\handshake-tls13.c" />
++    <ClCompile Include="..\lib\handshake.c" />
++    <ClCompile Include="..\lib\hash_int.c" />
++    <ClCompile Include="..\lib\hello_ext.c" />
++    <ClCompile Include="..\lib\hello_ext_lib.c" />
++    <ClCompile Include="..\lib\kx.c" />
++    <ClCompile Include="..\lib\locks.c" />
++    <ClCompile Include="..\lib\mbuffers.c" />
++    <ClCompile Include="..\lib\mem.c" />
++    <ClCompile Include="..\lib\minitasn1\coding.c" />
++    <ClCompile Include="..\lib\minitasn1\decoding.c" />
++    <ClCompile Include="..\lib\minitasn1\element.c" />
++    <ClCompile Include="..\lib\minitasn1\errors.c">
++      <ObjectFileName>$(IntDir)\minitasn1_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\minitasn1\gstr.c" />
++    <ClCompile Include="..\lib\minitasn1\parser_aux.c" />
++    <ClCompile Include="..\lib\minitasn1\structure.c" />
++    <ClCompile Include="..\lib\minitasn1\version.c" />
++    <ClCompile Include="..\lib\mpi.c" />
++    <ClCompile Include="..\lib\nettle\backport\cfb8.c" />
++    <ClCompile Include="..\lib\nettle\backport\cmac.c" />
++    <ClCompile Include="..\lib\nettle\cipher.c">
++      <ObjectFileName>$(IntDir)\nettle_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\bignum-le.c" />
++    <ClCompile Include="..\lib\nettle\gost\ecc-gost-hash.c" />
++    <ClCompile Include="..\lib\nettle\gost\ecc-gost256cpa.c" />
++    <ClCompile Include="..\lib\nettle\gost\ecc-gost512a.c" />
++    <ClCompile Include="..\lib\nettle\gost\ecc-gostdsa-sign.c" />
++    <ClCompile Include="..\lib\nettle\gost\ecc-gostdsa-verify.c" />
++    <ClCompile Include="..\lib\nettle\gost\gost28147.c" />
++    <ClCompile Include="..\lib\nettle\gost\gostdsa-mask.c" />
++    <ClCompile Include="..\lib\nettle\gost\gostdsa-sign.c" />
++    <ClCompile Include="..\lib\nettle\gost\gostdsa-verify.c" />
++    <ClCompile Include="..\lib\nettle\gost\gosthash94-meta.c" />
++    <ClCompile Include="..\lib\nettle\gost\gosthash94.c" />
++    <ClCompile Include="..\lib\nettle\gost\hmac-gosthash94.c" />
++    <ClCompile Include="..\lib\nettle\gost\hmac-streebog.c" />
++    <ClCompile Include="..\lib\nettle\gost\pbkdf2-hmac-gosthash94.c" />
++    <ClCompile Include="..\lib\nettle\gost\pbkdf2-hmac-streebog.c" />
++    <ClCompile Include="..\lib\nettle\gost\streebog-meta.c" />
++    <ClCompile Include="..\lib\nettle\gost\streebog.c">
++      <CompileAs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">CompileAsC</CompileAs>
++      <CompileAs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">CompileAsC</CompileAs>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\init.c" />
++    <ClCompile Include="..\lib\nettle\int\drbg-aes-self-test.c" />
++    <ClCompile Include="..\lib\nettle\int\drbg-aes.c" />
++    <ClCompile Include="..\lib\nettle\int\dsa-keygen-fips186.c" />
++    <ClCompile Include="..\lib\nettle\int\dsa-validate.c" />
++    <ClCompile Include="..\lib\nettle\int\provable-prime.c" />
++    <ClCompile Include="..\lib\nettle\int\rsa-keygen-fips186.c" />
++    <ClCompile Include="..\lib\nettle\int\tls1-prf.c" />
++    <ClCompile Include="..\lib\nettle\mac.c">
++      <ObjectFileName>$(IntDir)\net_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\mpi.c">
++      <ObjectFileName>$(IntDir)\nettle_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\pk.c">
++      <ObjectFileName>$(IntDir)\nettle_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\prf.c" />
++    <ClCompile Include="..\lib\nettle\rnd.c" />
++    <ClCompile Include="..\lib\nettle\sysrng-windows.c" />
++    <ClCompile Include="..\lib\num.c" />
++    <ClCompile Include="..\lib\ocsp-api.c" />
++    <ClCompile Include="..\lib\openpgp_compat.c" />
++    <ClCompile Include="..\lib\pcert.c" />
++    <ClCompile Include="..\lib\pin.c" />
++    <ClCompile Include="..\lib\pk.c" />
++    <ClCompile Include="..\lib\pkcs11.c">
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11x.c">
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11_int.c">
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11_privkey.c">
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11_secret.c">
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11_write.c">
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'">true</ExcludedFromBuild>
++      <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">true</ExcludedFromBuild>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkix_asn1_tab.c" />
++    <ClCompile Include="..\lib\prf.c" />
++    <ClCompile Include="..\lib\priority.c" />
++    <ClCompile Include="..\lib\privkey.c" />
++    <ClCompile Include="..\lib\privkey_raw.c" />
++    <ClCompile Include="..\lib\psk.c" />
++    <ClCompile Include="..\lib\pubkey.c" />
++    <ClCompile Include="..\lib\random.c" />
++    <ClCompile Include="..\lib\randomart.c" />
++    <ClCompile Include="..\lib\range.c" />
++    <ClCompile Include="..\lib\record.c" />
++    <ClCompile Include="..\lib\safe-memfuncs.c" />
++    <ClCompile Include="..\lib\secrets.c" />
++    <ClCompile Include="..\lib\session.c" />
++    <ClCompile Include="..\lib\session_pack.c" />
++    <ClCompile Include="..\lib\srp.c" />
++    <ClCompile Include="..\lib\sslv2_compat.c" />
++    <ClCompile Include="..\lib\state.c" />
++    <ClCompile Include="..\lib\stek.c" />
++    <ClCompile Include="..\lib\str-iconv.c" />
++    <ClCompile Include="..\lib\str-idna.c" />
++    <ClCompile Include="..\lib\str-unicode.c" />
++    <ClCompile Include="..\lib\str.c" />
++    <ClCompile Include="..\lib\supplemental.c" />
++    <ClCompile Include="..\lib\system.c" />
++    <ClCompile Include="..\lib\system\certs.c" />
++    <ClCompile Include="..\lib\system\fastopen.c" />
++    <ClCompile Include="..\lib\system\keys-win.c" />
++    <ClCompile Include="..\lib\system\sockets.c" />
++    <ClCompile Include="..\lib\system\threads.c" />
++    <ClCompile Include="..\lib\system_override.c" />
++    <ClCompile Include="..\lib\tls-sig.c" />
++    <ClCompile Include="..\lib\tls13-sig.c" />
++    <ClCompile Include="..\lib\tls13\anti_replay.c" />
++    <ClCompile Include="..\lib\tls13\certificate.c" />
++    <ClCompile Include="..\lib\tls13\certificate_request.c" />
++    <ClCompile Include="..\lib\tls13\certificate_verify.c" />
++    <ClCompile Include="..\lib\tls13\early_data.c" />
++    <ClCompile Include="..\lib\tls13\encrypted_extensions.c" />
++    <ClCompile Include="..\lib\tls13\finished.c" />
++    <ClCompile Include="..\lib\tls13\hello_retry.c" />
++    <ClCompile Include="..\lib\tls13\key_update.c" />
++    <ClCompile Include="..\lib\tls13\post_handshake.c" />
++    <ClCompile Include="..\lib\tls13\psk_ext_parser.c" />
++    <ClCompile Include="..\lib\tls13\session_ticket.c" />
++    <ClCompile Include="..\lib\tpm.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_and.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_and_not.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_byname.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_C.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Cc.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Cf.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Cn.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Co.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Cs.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_L.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_LC.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Ll.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Lm.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Lo.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_longname.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Lt.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Lu.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_M.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Mc.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Me.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Mn.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_N.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_name.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Nd.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Nl.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_No.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_none.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_of.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_or.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_P.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pc.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pd.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pe.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pf.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pi.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Po.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Ps.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_S.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Sc.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Sk.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Sm.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_So.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_test.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Z.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Zl.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Zp.c" />
++    <ClCompile Include="..\lib\unistring\unictype\categ_Zs.c" />
++    <ClCompile Include="..\lib\unistring\unictype\combiningclass.c" />
++    <ClCompile Include="..\lib\unistring\unictype\pr_default_ignorable_code_point.c" />
++    <ClCompile Include="..\lib\unistring\unictype\pr_join_control.c" />
++    <ClCompile Include="..\lib\unistring\unictype\pr_not_a_character.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\canonical-decomposition.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\compat-decomposition.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\composition.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\decompose-internal.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\decomposition-table.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\decomposition.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\nfc.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\nfd.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\nfkc.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\nfkd.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\u16-normalize.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\u32-normalize.c" />
++    <ClCompile Include="..\lib\unistring\uninorm\u8-normalize.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u16-cpy.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u16-mbtouc-unsafe-aux.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u16-mbtouc-unsafe.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u16-mbtoucr.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u16-to-u8.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u16-uctomb-aux.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u16-uctomb.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u32-cpy.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u32-mbtouc-unsafe.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u32-to-u8.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u32-uctomb.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u8-check.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u8-cpy.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u8-mbtouc-unsafe-aux.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u8-mbtouc-unsafe.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u8-mbtoucr.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u8-to-u16.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u8-to-u32.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u8-uctomb-aux.c" />
++    <ClCompile Include="..\lib\unistring\unistr\u8-uctomb.c" />
++    <ClCompile Include="..\lib\urls.c" />
++    <ClCompile Include="..\lib\verify-tofu.c" />
++    <ClCompile Include="..\lib\x509\attributes.c" />
++    <ClCompile Include="..\lib\x509\common.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\crl.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\crl_write.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\crq.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\dn.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\email-verify.c" />
++    <ClCompile Include="..\lib\x509\extensions.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\hostname-verify.c" />
++    <ClCompile Include="..\lib\x509\ip.c" />
++    <ClCompile Include="..\lib\x509\key_decode.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\key_encode.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\krb5.c" />
++    <ClCompile Include="..\lib\x509\mpi.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\name_constraints.c" />
++    <ClCompile Include="..\lib\x509\ocsp.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\ocsp_output.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\output.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs12.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs12_bag.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs12_encr.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs7-attrs.c" />
++    <ClCompile Include="..\lib\x509\pkcs7-crypt.c" />
++    <ClCompile Include="..\lib\x509\pkcs7-output.c" />
++    <ClCompile Include="..\lib\x509\pkcs7.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\privkey.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\privkey_openssl.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\privkey_pkcs8.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\privkey_pkcs8_pbes1.c" />
++    <ClCompile Include="..\lib\x509\prov-seed.c" />
++    <ClCompile Include="..\lib\x509\sign.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\time.c" />
++    <ClCompile Include="..\lib\x509\tls_features.c" />
++    <ClCompile Include="..\lib\x509\verify-high.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\verify-high2.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\verify.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\virt-san.c" />
++    <ClCompile Include="..\lib\x509\x509.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\x509_dn.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\x509_ext.c" />
++    <ClCompile Include="..\lib\x509\x509_write.c">
++      <ObjectFileName>$(IntDir)\x509_%(Filename).obj</ObjectFileName>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509_b64.c" />
++  </ItemGroup>
++  <ItemGroup>
++    <None Include="libgnutls.def" />
++  </ItemGroup>
++  <ItemGroup>
++    <YASM Include="lib\accelerated\x86\coff\aes-ssse3-x86.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='x64'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\aes-ssse3-x86_64.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\aesni-gcm-x86_64.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\aesni-x86.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='x64'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\aesni-x86_64.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\cpuid-x86.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='x64'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\cpuid-x86_64.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\e_padlock-x86.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='x64'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\e_padlock-x86_64.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\ghash-x86.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='x64'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\ghash-x86_64.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha1-ssse3-x86.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='x64'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha1-ssse3-x86_64.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha256-avx-x86_64.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha256-ssse3-x86.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='x64'">true</ExcludedFromBuild>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha256-ssse3-x86_64.asm">
++      <ExcludedFromBuild Condition="'$(Platform)'=='Win32'">true</ExcludedFromBuild>
++    </YASM>
++  </ItemGroup>
++  <PropertyGroup Label="Globals">
++    <ProjectGuid>{6F610EE8-7F59-4191-AB88-F63843267C02}</ProjectGuid>
++    <RootNamespace>libgnutls</RootNamespace>
++    <WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
++  </PropertyGroup>
++  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
++    <ConfigurationType>StaticLibrary</ConfigurationType>
++    <UseDebugLibraries>true</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
++    <ConfigurationType>StaticLibrary</ConfigurationType>
++    <UseDebugLibraries>true</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'" Label="Configuration">
++    <ConfigurationType>DynamicLibrary</ConfigurationType>
++    <UseDebugLibraries>true</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'" Label="Configuration">
++    <ConfigurationType>DynamicLibrary</ConfigurationType>
++    <UseDebugLibraries>true</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'" Label="Configuration">
++    <ConfigurationType>DynamicLibrary</ConfigurationType>
++    <UseDebugLibraries>true</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'" Label="Configuration">
++    <ConfigurationType>DynamicLibrary</ConfigurationType>
++    <UseDebugLibraries>true</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
++    <ConfigurationType>StaticLibrary</ConfigurationType>
++    <UseDebugLibraries>false</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'" Label="Configuration">
++    <ConfigurationType>StaticLibrary</ConfigurationType>
++    <UseDebugLibraries>false</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++    <WholeProgramOptimization>true</WholeProgramOptimization>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
++    <ConfigurationType>StaticLibrary</ConfigurationType>
++    <UseDebugLibraries>false</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'" Label="Configuration">
++    <ConfigurationType>StaticLibrary</ConfigurationType>
++    <UseDebugLibraries>false</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++    <WholeProgramOptimization>true</WholeProgramOptimization>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'" Label="Configuration">
++    <ConfigurationType>DynamicLibrary</ConfigurationType>
++    <UseDebugLibraries>false</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'" Label="Configuration">
++    <ConfigurationType>DynamicLibrary</ConfigurationType>
++    <UseDebugLibraries>false</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'" Label="Configuration">
++    <ConfigurationType>DynamicLibrary</ConfigurationType>
++    <UseDebugLibraries>false</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'" Label="Configuration">
++    <ConfigurationType>DynamicLibrary</ConfigurationType>
++    <UseDebugLibraries>false</UseDebugLibraries>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '15.0'">v141</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '14.0'">v140</PlatformToolset>
++    <PlatformToolset Condition="'$(VisualStudioVersion)' == '12.0'">v120</PlatformToolset>
++    <CharacterSet>MultiByte</CharacterSet>
++  </PropertyGroup>
++  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
++  <ImportGroup Label="ExtensionSettings">
++    <Import Project="$(VCTargetsPath)\BuildCustomizations\yasm.props" />
++  </ImportGroup>
++  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'" Label="PropertySheets">
++    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
++  </ImportGroup>
++  <PropertyGroup Label="UserMacros" />
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>libgnutlsd</TargetName>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>libgnutlsd</TargetName>
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'">
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>gnutlsd</TargetName>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'">
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>gnutlsd</TargetName>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>gnutlsd</TargetName>
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'">
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>gnutlsd</TargetName>
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>libgnutls</TargetName>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'">
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>libgnutls</TargetName>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>libgnutls</TargetName>
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'">
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>libgnutls</TargetName>
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'">
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>gnutls</TargetName>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'">
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>gnutls</TargetName>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'">
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>gnutls</TargetName>
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'">
++    <IntDir>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(ProjectName)\</IntDir>
++    <TargetName>gnutls</TargetName>
++    <OutDir>$(ProjectDir)..\..\..\msvc\</OutDir>
++    <CustomBuildAfterTargets>Clean</CustomBuildAfterTargets>
++  </PropertyGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>Disabled</Optimization>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86;ASM_X86_32;_WIN32_WINNT=0x0502;_DEBUG;DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\backport;..\lib\nettle\gost;..\lib\nettle\int;..\lib\tls13;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4133;4142;4013;4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(OutDir)\lib\x86\$(TargetName).pdb</ProgramDataBaseFileName>
++      <MinimalRebuild>false</MinimalRebuild>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++    </Link>
++    <Lib>
++      <OutputFile>$(OutDir)\lib\x86\$(TargetName)$(TargetExt)</OutputFile>
++      <TargetMachine>MachineX86</TargetMachine>
++      <SubSystem>Windows</SubSystem>
++      <AdditionalDependencies>Crypt32.lib;Ws2_32.lib;libzlibd.lib;libhogweedd.lib;libgmpd.lib;libnettled.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x86\;$(ProjectDir)\..\..\prebuilt\lib\x86\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++    </Lib>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>Disabled</Optimization>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86_64;_WIN32_WINNT=0x0A00;_DEBUG;DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\backport;..\lib\nettle\gost;..\lib\nettle\int;..\lib\tls13;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4133;4142;4013;4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(OutDir)\lib\x64\$(TargetName).pdb</ProgramDataBaseFileName>
++      <MinimalRebuild>false</MinimalRebuild>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++    </Link>
++    <Lib>
++      <OutputFile>$(OutDir)\lib\x64\$(TargetName)$(TargetExt)</OutputFile>
++      <TargetMachine>MachineX64</TargetMachine>
++      <SubSystem>Windows</SubSystem>
++      <AdditionalDependencies>Crypt32.lib;bcrypt.lib;Ws2_32.lib;libzlibd.lib;libhogweedd.lib;libgmpd.lib;libnettled.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x64\;$(ProjectDir)\..\..\prebuilt\lib\x64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++    </Lib>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|Win32'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>Disabled</Optimization>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86;ASM_X86_32;_WIN32_WINNT=0x0502;_DEBUG;DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <BufferSecurityCheck>true</BufferSecurityCheck>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
++      <MinimalRebuild>false</MinimalRebuild>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <OutputFile>$(OutDir)\bin\x86\$(TargetName)$(TargetExt)</OutputFile>
++      <ProgramDatabaseFile>$(OutDir)\lib\x86\$(TargetName).pdb</ProgramDatabaseFile>
++      <SubSystem>Windows</SubSystem>
++      <ImportLibrary>$(OutDir)\lib\x86\$(TargetName).lib</ImportLibrary>
++      <ProfileGuidedDatabase>$(IntDir)\$(TargetName).pgd</ProfileGuidedDatabase>
++      <ModuleDefinitionFile>libgnutls.def</ModuleDefinitionFile>
++      <AdditionalDependencies>Crypt32.lib;Ws2_32.lib;zlibd.lib;hogweedd.lib;gmpd.lib;nettled.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x86\;$(ProjectDir)\..\..\prebuilt\lib\x86\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <LargeAddressAware>true</LargeAddressAware>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++      <MinimumRequiredVersion>5.1</MinimumRequiredVersion>
++    </Link>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|Win32'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>Disabled</Optimization>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86;ASM_X86_32;_WIN32_WINNT=0x0502;_DEBUG;DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <BufferSecurityCheck>true</BufferSecurityCheck>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
++      <MinimalRebuild>false</MinimalRebuild>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <OutputFile>$(OutDir)\bin\x86\$(TargetName)$(TargetExt)</OutputFile>
++      <ProgramDatabaseFile>$(OutDir)\lib\x86\$(TargetName).pdb</ProgramDatabaseFile>
++      <SubSystem>Windows</SubSystem>
++      <ImportLibrary>$(OutDir)\lib\x86\$(TargetName).lib</ImportLibrary>
++      <ProfileGuidedDatabase>$(IntDir)\$(TargetName).pgd</ProfileGuidedDatabase>
++      <ModuleDefinitionFile>libgnutls.def</ModuleDefinitionFile>
++      <AdditionalDependencies>Crypt32.lib;Ws2_32.lib;libzlibd.lib;libhogweedd.lib;libgmpd.lib;libnettled.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x86\;$(ProjectDir)\..\..\prebuilt\lib\x86\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <LargeAddressAware>true</LargeAddressAware>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++      <MinimumRequiredVersion>5.1</MinimumRequiredVersion>
++    </Link>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLL|x64'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>Disabled</Optimization>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86_64;_WIN32_WINNT=0x0A00;_DEBUG;DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
++      <MinimalRebuild>false</MinimalRebuild>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <OutputFile>$(OutDir)\bin\x64\$(TargetName)$(TargetExt)</OutputFile>
++      <ProgramDatabaseFile>$(OutDir)\lib\x64\$(TargetName).pdb</ProgramDatabaseFile>
++      <SubSystem>Windows</SubSystem>
++      <ImportLibrary>$(OutDir)\lib\x64\$(TargetName).lib</ImportLibrary>
++      <ProfileGuidedDatabase>$(IntDir)\$(TargetName).pgd</ProfileGuidedDatabase>
++      <ModuleDefinitionFile>libgnutls.def</ModuleDefinitionFile>
++      <AdditionalDependencies>Crypt32.lib;bcrypt.lib;Ws2_32.lib;zlibd.lib;hogweedd.lib;gmpd.lib;nettled.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x64\;$(ProjectDir)\..\..\prebuilt\lib\x64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++      <MinimumRequiredVersion>6.0</MinimumRequiredVersion>
++    </Link>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='DebugDLLStaticDeps|x64'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>Disabled</Optimization>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86_64;_WIN32_WINNT=0x0A00;_DEBUG;DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
++      <MinimalRebuild>false</MinimalRebuild>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <OutputFile>$(OutDir)\bin\x64\$(TargetName)$(TargetExt)</OutputFile>
++      <ProgramDatabaseFile>$(OutDir)\lib\x64\$(TargetName).pdb</ProgramDatabaseFile>
++      <SubSystem>Windows</SubSystem>
++      <ImportLibrary>$(OutDir)\lib\x64\$(TargetName).lib</ImportLibrary>
++      <ProfileGuidedDatabase>$(IntDir)\$(TargetName).pgd</ProfileGuidedDatabase>
++      <ModuleDefinitionFile>libgnutls.def</ModuleDefinitionFile>
++      <AdditionalDependencies>Crypt32.lib;bcrypt.lib;Ws2_32.lib;libzlibd.lib;libhogweedd.lib;libgmpd.lib;libnettled.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x64\;$(ProjectDir)\..\..\prebuilt\lib\x64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++      <MinimumRequiredVersion>6.0</MinimumRequiredVersion>
++    </Link>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>MaxSpeed</Optimization>
++      <FunctionLevelLinking>true</FunctionLevelLinking>
++      <IntrinsicFunctions>true</IntrinsicFunctions>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
++      <OmitFramePointers>true</OmitFramePointers>
++      <StringPooling>true</StringPooling>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86;ASM_X86_32;_WIN32_WINNT=0x0502;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\backport;..\lib\nettle\gost;..\lib\nettle\int;..\lib\tls13;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4133;4142;4013;4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <InterproceduralOptimization>SingleFile</InterproceduralOptimization>
++      <ProgramDataBaseFileName>$(OutDir)\lib\x86\$(TargetName).pdb</ProgramDataBaseFileName>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <EnableCOMDATFolding>true</EnableCOMDATFolding>
++      <OptimizeReferences>true</OptimizeReferences>
++    </Link>
++    <Lib>
++      <OutputFile>$(OutDir)\lib\x86\$(TargetName)$(TargetExt)</OutputFile>
++      <TargetMachine>MachineX86</TargetMachine>
++      <SubSystem>Windows</SubSystem>
++      <AdditionalDependencies>Crypt32.lib;Ws2_32.lib;libzlib.lib;libhogweed.lib;libgmp.lib;libnettle.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x86\;$(ProjectDir)\..\..\prebuilt\lib\x86\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++    </Lib>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir "$(OutDir)"\licenses
++copy ..\LICENSE "$(OutDir)"\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|Win32'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>MaxSpeed</Optimization>
++      <FunctionLevelLinking>true</FunctionLevelLinking>
++      <IntrinsicFunctions>true</IntrinsicFunctions>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
++      <OmitFramePointers>true</OmitFramePointers>
++      <StringPooling>true</StringPooling>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86;ASM_X86_32;_WIN32_WINNT=0x0502;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <InterproceduralOptimization>SingleFile</InterproceduralOptimization>
++      <ProgramDataBaseFileName>$(OutDir)\lib\x86\$(TargetName).pdb</ProgramDataBaseFileName>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <EnableCOMDATFolding>true</EnableCOMDATFolding>
++      <OptimizeReferences>true</OptimizeReferences>
++    </Link>
++    <Lib>
++      <OutputFile>$(OutDir)\lib\x86\$(TargetName)$(TargetExt)</OutputFile>
++      <TargetMachine>MachineX86</TargetMachine>
++      <SubSystem>Windows</SubSystem>
++      <AdditionalDependencies>Crypt32.lib;Ws2_32.lib;libzlib.lib;libhogweed.lib;libgmp.lib;libnettle.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x86\;$(ProjectDir)\..\..\prebuilt\lib\x86\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++    </Lib>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>MaxSpeed</Optimization>
++      <FunctionLevelLinking>true</FunctionLevelLinking>
++      <IntrinsicFunctions>true</IntrinsicFunctions>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
++      <OmitFramePointers>true</OmitFramePointers>
++      <StringPooling>true</StringPooling>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86_64;_WIN32_WINNT=0x0A00;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\backport;..\lib\nettle\gost;..\lib\nettle\int;..\lib\tls13;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4133;4142;4013;4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <InterproceduralOptimization>SingleFile</InterproceduralOptimization>
++      <ProgramDataBaseFileName>$(OutDir)\lib\x64\$(TargetName).pdb</ProgramDataBaseFileName>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++      <AdditionalOptions>
++      </AdditionalOptions>
++    </ClCompile>
++    <Link>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <EnableCOMDATFolding>true</EnableCOMDATFolding>
++      <OptimizeReferences>true</OptimizeReferences>
++    </Link>
++    <Lib>
++      <OutputFile>$(OutDir)\lib\x64\$(TargetName)$(TargetExt)</OutputFile>
++      <TargetMachine>MachineX64</TargetMachine>
++      <SubSystem>Windows</SubSystem>
++      <AdditionalDependencies>Crypt32.lib;bcrypt.lib;Ws2_32.lib;libzlib.lib;libhogweed.lib;libgmp.lib;libnettle.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x64\;$(ProjectDir)\..\..\prebuilt\lib\x64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 /NODEFAULTLIB:LIBCMT.LIB %(AdditionalOptions)</AdditionalOptions>
++    </Lib>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir "$(OutDir)"\licenses
++copy ..\LICENSE "$(OutDir)"\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseLTO|x64'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>MaxSpeed</Optimization>
++      <FunctionLevelLinking>true</FunctionLevelLinking>
++      <IntrinsicFunctions>true</IntrinsicFunctions>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
++      <OmitFramePointers>true</OmitFramePointers>
++      <StringPooling>true</StringPooling>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86_64;_WIN32_WINNT=0x0A00;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <InterproceduralOptimization>SingleFile</InterproceduralOptimization>
++      <ProgramDataBaseFileName>$(OutDir)\lib\x64\$(TargetName).pdb</ProgramDataBaseFileName>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <EnableCOMDATFolding>true</EnableCOMDATFolding>
++      <OptimizeReferences>true</OptimizeReferences>
++    </Link>
++    <Lib>
++      <OutputFile>$(OutDir)\lib\x64\$(TargetName)$(TargetExt)</OutputFile>
++      <TargetMachine>MachineX64</TargetMachine>
++      <SubSystem>Windows</SubSystem>
++      <AdditionalDependencies>Crypt32.lib;bcrypt.lib;Ws2_32.lib;libzlib.lib;libhogweed.lib;libgmp.lib;libnettle.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x64\;$(ProjectDir)\..\..\prebuilt\lib\x64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++    </Lib>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>MaxSpeed</Optimization>
++      <FunctionLevelLinking>true</FunctionLevelLinking>
++      <IntrinsicFunctions>true</IntrinsicFunctions>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
++      <OmitFramePointers>true</OmitFramePointers>
++      <StringPooling>true</StringPooling>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86;ASM_X86_32;_WIN32_WINNT=0x0502;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <EnableCOMDATFolding>true</EnableCOMDATFolding>
++      <OptimizeReferences>true</OptimizeReferences>
++      <OutputFile>$(OutDir)\bin\x86\$(TargetName)$(TargetExt)</OutputFile>
++      <ProgramDatabaseFile>$(OutDir)\lib\x86\$(TargetName).pdb</ProgramDatabaseFile>
++      <SubSystem>Windows</SubSystem>
++      <ImportLibrary>$(OutDir)\lib\x86\$(TargetName).lib</ImportLibrary>
++      <ProfileGuidedDatabase>$(IntDir)\$(TargetName).pgd</ProfileGuidedDatabase>
++      <ModuleDefinitionFile>libgnutls.def</ModuleDefinitionFile>
++      <AdditionalDependencies>Crypt32.lib;Ws2_32.lib;zlib.lib;hogweed.lib;gmp.lib;nettle.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x86\;$(ProjectDir)\..\..\prebuilt\lib\x86\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <LargeAddressAware>true</LargeAddressAware>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <MinimumRequiredVersion>5.1</MinimumRequiredVersion>
++    </Link>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|Win32'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>MaxSpeed</Optimization>
++      <FunctionLevelLinking>true</FunctionLevelLinking>
++      <IntrinsicFunctions>true</IntrinsicFunctions>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
++      <OmitFramePointers>true</OmitFramePointers>
++      <StringPooling>true</StringPooling>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86;ASM_X86_32;_WIN32_WINNT=0x0502;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <EnableCOMDATFolding>true</EnableCOMDATFolding>
++      <OptimizeReferences>true</OptimizeReferences>
++      <OutputFile>$(OutDir)\bin\x86\$(TargetName)$(TargetExt)</OutputFile>
++      <ProgramDatabaseFile>$(OutDir)\lib\x86\$(TargetName).pdb</ProgramDatabaseFile>
++      <SubSystem>Windows</SubSystem>
++      <ImportLibrary>$(OutDir)\lib\x86\$(TargetName).lib</ImportLibrary>
++      <ProfileGuidedDatabase>$(IntDir)\$(TargetName).pgd</ProfileGuidedDatabase>
++      <ModuleDefinitionFile>libgnutls.def</ModuleDefinitionFile>
++      <AdditionalDependencies>Crypt32.lib;Ws2_32.lib;libzlib.lib;libhogweed.lib;libgmp.lib;libnettle.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x86\;$(ProjectDir)\..\..\prebuilt\lib\x86\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <LargeAddressAware>true</LargeAddressAware>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <MinimumRequiredVersion>5.1</MinimumRequiredVersion>
++    </Link>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>MaxSpeed</Optimization>
++      <FunctionLevelLinking>true</FunctionLevelLinking>
++      <IntrinsicFunctions>true</IntrinsicFunctions>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
++      <OmitFramePointers>true</OmitFramePointers>
++      <StringPooling>true</StringPooling>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86_64;_WIN32_WINNT=0x0A00;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <EnableCOMDATFolding>true</EnableCOMDATFolding>
++      <OptimizeReferences>true</OptimizeReferences>
++      <OutputFile>$(OutDir)\bin\x64\$(TargetName)$(TargetExt)</OutputFile>
++      <ProgramDatabaseFile>$(OutDir)\lib\x64\$(TargetName).pdb</ProgramDatabaseFile>
++      <SubSystem>Windows</SubSystem>
++      <ImportLibrary>$(OutDir)\lib\x64\$(TargetName).lib</ImportLibrary>
++      <ProfileGuidedDatabase>$(IntDir)\$(TargetName).pgd</ProfileGuidedDatabase>
++      <ModuleDefinitionFile>libgnutls.def</ModuleDefinitionFile>
++      <AdditionalDependencies>Crypt32.lib;bcrypt.lib;Ws2_32.lib;zlib.lib;hogweed.lib;gmp.lib;nettle.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x64\;$(ProjectDir)\..\..\prebuilt\lib\x64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <MinimumRequiredVersion>6.0</MinimumRequiredVersion>
++    </Link>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseDLLStaticDeps|x64'">
++    <ClCompile>
++      <WarningLevel>Level3</WarningLevel>
++      <Optimization>MaxSpeed</Optimization>
++      <FunctionLevelLinking>true</FunctionLevelLinking>
++      <IntrinsicFunctions>true</IntrinsicFunctions>
++      <MultiProcessorCompilation>true</MultiProcessorCompilation>
++      <InlineFunctionExpansion>AnySuitable</InlineFunctionExpansion>
++      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
++      <EnableFiberSafeOptimizations>true</EnableFiberSafeOptimizations>
++      <OmitFramePointers>true</OmitFramePointers>
++      <StringPooling>true</StringPooling>
++      <PreprocessorDefinitions>HAVE_WIN32_LOCKS;HAVE_CONFIG_H;inline=__inline;ASN1_BUILDING;ASN1_STATIC;LOCALEDIR=".";__func__=__FUNCTION__;ASM_X86_64;_WIN32_WINNT=0x0A00;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++      <AdditionalIncludeDirectories>.\;.\lib;..\lib;..\lib\accelerated;..\lib\auth;..\lib\ext;..\lib\extras;..\lib\minitasn1;..\lib\nettle;..\lib\nettle\int;..\lib\openpgp;..\lib\opencdk;..\lib\x509;..\lib\includes;..\gl;$(OutDir)\include;..\lib\accelerated\x86;.\lib\unistring;..\lib\unistring;$(ProjectDir)\..\..\prebuilt\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
++      <DisableSpecificWarnings>4996;4244;4018;4146;4267;4028;4101;4020;4047;4024;4005;4311;4312;4334;4116;4090;%(DisableSpecificWarnings)</DisableSpecificWarnings>
++      <ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
++      <ObjectFileName>$(IntDir)\%(RelativeDir)\</ObjectFileName>
++    </ClCompile>
++    <Link>
++      <EnableCOMDATFolding>true</EnableCOMDATFolding>
++      <OptimizeReferences>true</OptimizeReferences>
++      <OutputFile>$(OutDir)\bin\x64\$(TargetName)$(TargetExt)</OutputFile>
++      <ProgramDatabaseFile>$(OutDir)\lib\x64\$(TargetName).pdb</ProgramDatabaseFile>
++      <SubSystem>Windows</SubSystem>
++      <ImportLibrary>$(OutDir)\lib\x64\$(TargetName).lib</ImportLibrary>
++      <ProfileGuidedDatabase>$(IntDir)\$(TargetName).pgd</ProfileGuidedDatabase>
++      <ModuleDefinitionFile>libgnutls.def</ModuleDefinitionFile>
++      <AdditionalDependencies>Crypt32.lib;bcrypt.lib;Ws2_32.lib;libzlib.lib;libhogweed.lib;libgmp.lib;libnettle.lib;%(AdditionalDependencies)</AdditionalDependencies>
++      <AdditionalLibraryDirectories>$(OutDir)\lib\x64\;$(ProjectDir)\..\..\prebuilt\lib\x64\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
++      <AdditionalOptions>/IGNORE:4006,4221,4042 %(AdditionalOptions)</AdditionalOptions>
++      <GenerateDebugInformation>true</GenerateDebugInformation>
++      <MinimumRequiredVersion>6.0</MinimumRequiredVersion>
++    </Link>
++    <PostBuildEvent>
++      <Command>mkdir "$(OutDir)"\include
++mkdir "$(OutDir)"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "$(OutDir)"\include\gnutls
++copy .\gnutls\gnutls.h "$(OutDir)"\include\gnutls
++mkdir $(OutDir)\licenses
++copy ..\LICENSE $(OutDir)\licenses\gnutls.txt</Command>
++    </PostBuildEvent>
++    <PreBuildEvent>
++      <Command>if exist ..\config.h (
++del ..\config.h
++)
++if exist ..\lib\includes\gnutls\gnutls.h (
++del ..\lib\includes\gnutls\gnutls.h
++)
++if exist ..\lib\priority_options.h (
++del ..\lib\priority_options.h
++)
++if exist "$(OutDir)"\include\gnutls (
++rd /s /q "$(OutDir)"\include\gnutls
++cd ../
++cd $(ProjectDir)
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\arpa\inet.h (
++del ..\gl\arpa\inet.h
++)
++if exist ..\gl\byteswap.h (
++del ..\gl\\byteswap.h
++)
++if exist ..\gl\signal.h (
++del ..\gl\signal.h
++)
++if exist ..\gl\stdio.h (
++del ..\gl\stdio.h
++)
++if exist ..\gl\stdlib.h (
++del ..\gl\stdlib.h
++)
++if exist ..\gl\string.h (
++del ..\gl\string.h
++)
++if exist ..\gl\strings.h (
++del ..\gl\strings.h
++)
++if exist ..\gl\sys\select.h (
++del ..\gl\sys\select.h
++)
++if exist ..\gl\sys\socket.h (
++del ..\gl\sys\socket.h
++)
++if exist ..\gl\sys\stat.h (
++del ..\gl\sys\stat.h
++)
++if exist ..\gl\sys\time.h (
++del ..\gl\sys\time.h
++)
++if exist ..\gl\sys\types.h (
++del ..\gl\sys\types.h
++)
++if exist ..\gl\sys\uio.h (
++del ..\gl\sys\uio.h
++)
++if exist ..\gl\time.h (
++del ..\gl\time.h
++)
++if exist ..\gl\unistd.h (
++del ..\gl\unistd.h
++)
++if exist ..\gl\wchar.h (
++del ..\gl\wchar.h
++)
++if exist ..\gl\errno.h (
++del ..\gl\errno.h
++)</Command>
++    </PreBuildEvent>
++    <CustomBuildStep>
++      <Message>Custom Clean Step</Message>
++    </CustomBuildStep>
++    <CustomBuildStep>
++      <Outputs>force_clean</Outputs>
++      <Command>if exist "$(OutDir)"\include\gnutls (
++rmdir /s /q "$(OutDir)"\include\gnutls
++)
++if exist $(OutDir)\licenses\gnutls.txt (
++del /f /q $(OutDir)\licenses\gnutls.txt
++)</Command>
++    </CustomBuildStep>
++    <YASM>
++      <PreprocessorDefinitions>__NASM_VERSION_ID__=0x02030000;%(PreprocessorDefinitions)</PreprocessorDefinitions>
++    </YASM>
++  </ItemDefinitionGroup>
++  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
++  <ImportGroup Label="ExtensionTargets">
++    <Import Project="$(VCTargetsPath)\BuildCustomizations\yasm.targets" />
++  </ImportGroup>
++</Project>
+\ No newline at end of file
+diff --git a/SMP/libgnutls.vcxproj.filters b/SMP/libgnutls.vcxproj.filters
+new file mode 100644
+index 0000000..85202ab
+--- /dev/null
++++ b/SMP/libgnutls.vcxproj.filters
+@@ -0,0 +1,1804 @@
++<?xml version="1.0" encoding="utf-8"?>
++<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
++  <ItemGroup>
++    <Filter Include="Header Files">
++      <UniqueIdentifier>{e850f24d-093f-4c30-a99c-413a7dfa71b8}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Resource Files">
++      <UniqueIdentifier>{f18cd969-acc3-480c-9147-ea3ae1c8ba92}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files">
++      <UniqueIdentifier>{bdd0568e-d423-4fcc-affe-6ba0c2a40f78}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib">
++      <UniqueIdentifier>{846a84d9-f6ed-42fa-b50c-2f7863cb6f59}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib">
++      <UniqueIdentifier>{71e41116-0a7f-426b-ac4c-8171392cfb42}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\x509">
++      <UniqueIdentifier>{1e36f4d1-6f20-4d58-943b-cea4ad43176a}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\x509">
++      <UniqueIdentifier>{6bc6970b-1b78-4be2-9533-f22a0e1c4e4f}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\accelerated">
++      <UniqueIdentifier>{cacc9806-9bcd-4062-804c-4944b45f0633}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\accelerated">
++      <UniqueIdentifier>{6687ddd2-a384-4b88-b6f1-6d8ebb43f65f}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\auth">
++      <UniqueIdentifier>{37a0ca08-651d-420d-97c6-9c577325bdbd}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\auth">
++      <UniqueIdentifier>{dea014de-cf7e-464e-aa39-96603d49a936}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\ext">
++      <UniqueIdentifier>{17cfe271-8110-465e-b2b0-b2a7731203fc}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\ext">
++      <UniqueIdentifier>{6c654e49-dc39-45e3-bb25-88a1d6df16c1}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\algorithms">
++      <UniqueIdentifier>{3ff047f2-7e65-4a3f-8cf6-9f1cabb20c9d}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\extras">
++      <UniqueIdentifier>{e0df656e-9c3c-41cc-8c76-e066482dd266}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\extras">
++      <UniqueIdentifier>{d11cb355-4d28-468c-a771-99d8caaa37b8}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\minitasn1">
++      <UniqueIdentifier>{ea53b459-c726-4e60-ae2a-e8b1942d1e04}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\minitasn1">
++      <UniqueIdentifier>{0b42137d-60dd-4225-89f7-04f9c16bc03f}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\opencdk">
++      <UniqueIdentifier>{a716acb9-1d19-4901-b51d-e8491cd6b1cd}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\openpgp">
++      <UniqueIdentifier>{801859ed-a82a-4425-bc41-853a3e36c91f}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\nettle">
++      <UniqueIdentifier>{1d37e53c-2b42-4c10-b915-8d5ea32ad5b8}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\nettle">
++      <UniqueIdentifier>{5f3f5aa7-e3c3-4b10-bcfd-e57affb22689}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\includes">
++      <UniqueIdentifier>{8196ba47-8e25-4785-84b7-5585d48180f0}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\includes\gnutls">
++      <UniqueIdentifier>{a627b137-991b-4990-b694-a9b2d2c653a5}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\gl">
++      <UniqueIdentifier>{f35f5731-aedc-4518-a473-6d2cb214104d}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\accelerated\x86">
++      <UniqueIdentifier>{075c40f2-5cd7-4fd6-8eed-4d712901d635}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\accelerated\x86">
++      <UniqueIdentifier>{c5ee836d-4b0b-49bc-873a-28ceb87a5faa}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\accelerated\x86\coff">
++      <UniqueIdentifier>{8c3b1839-8bb4-46d1-9a23-50782c575e2b}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\system">
++      <UniqueIdentifier>{76aa5080-e372-4c96-a1c7-83f54eb77073}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\nettle\int">
++      <UniqueIdentifier>{b4e1b395-c5b4-4cca-bf0c-8b2dd4d759d6}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\nettle\int">
++      <UniqueIdentifier>{10367618-d480-419d-a5fe-8ec68eb12027}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\unistring">
++      <UniqueIdentifier>{abc680d5-b39e-4f85-87c0-e0aa59d89e9f}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\unistring\unictype">
++      <UniqueIdentifier>{b9ad9166-4729-4357-995d-373469886c60}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\unistring\uninorm">
++      <UniqueIdentifier>{fd64761c-61cb-4651-be22-593c83c644d5}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\unistring\unistr">
++      <UniqueIdentifier>{ad287a87-3bf8-43f1-bc30-847e503bab04}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\unistring">
++      <UniqueIdentifier>{5a6accd0-2489-4547-87f7-47aa7007346e}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\unistring\unicase">
++      <UniqueIdentifier>{73e37f29-8dea-41f2-a47c-b7c615301f3f}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\unistring\unictype">
++      <UniqueIdentifier>{cec5d9f9-5fa1-4465-b15c-90bc17c739c3}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\unistring\uninorm">
++      <UniqueIdentifier>{9fdad55e-e7bb-48d5-b9bb-69e4a0a05bdc}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Header Files\lib\unistring\unistring">
++      <UniqueIdentifier>{61d0ba14-cae2-4b4d-ba92-1e608145d2aa}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\nettle\gost">
++      <UniqueIdentifier>{4b6e9ec2-1641-476a-a471-5c4fdd17cbdc}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\nettle\backport">
++      <UniqueIdentifier>{acbf7848-4968-43cc-a912-95a1e5b88a7d}</UniqueIdentifier>
++    </Filter>
++    <Filter Include="Source Files\lib\tls13">
++      <UniqueIdentifier>{3ef6a57c-114c-4352-b886-9e06e1297905}</UniqueIdentifier>
++    </Filter>
++  </ItemGroup>
++  <ItemGroup>
++    <ClInclude Include="config.h">
++      <Filter>Header Files</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\ocsp.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\openpgp.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\pkcs11.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\pkcs12.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\tpm.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\x509.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\abstract.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\compat.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\crypto.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\dtls.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\common.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\verify-high.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\x509_int.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\accelerated\cryptodev.h">
++      <Filter>Header Files\lib\accelerated</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\accelerated\accelerated.h">
++      <Filter>Header Files\lib\accelerated</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth\anon.h">
++      <Filter>Header Files\lib\auth</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth\cert.h">
++      <Filter>Header Files\lib\auth</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth\dh_common.h">
++      <Filter>Header Files\lib\auth</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth\ecdhe.h">
++      <Filter>Header Files\lib\auth</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth\psk.h">
++      <Filter>Header Files\lib\auth</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth\psk_passwd.h">
++      <Filter>Header Files\lib\auth</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth\rsa_common.h">
++      <Filter>Header Files\lib\auth</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth\srp_passwd.h">
++      <Filter>Header Files\lib\auth</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\alpn.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\cert_type.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\dumbfw.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\ecc.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\heartbeat.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\max_record.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\safe_renegotiation.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\server_name.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\session_ticket.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\signature.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\srp.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\srtp.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\status_request.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\extras\randomart.h">
++      <Filter>Header Files\lib\extras</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\minitasn1\element.h">
++      <Filter>Header Files\lib\minitasn1</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\minitasn1\gstr.h">
++      <Filter>Header Files\lib\minitasn1</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\minitasn1\int.h">
++      <Filter>Header Files\lib\minitasn1</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\minitasn1\libtasn1.h">
++      <Filter>Header Files\lib\minitasn1</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\minitasn1\parser_aux.h">
++      <Filter>Header Files\lib\minitasn1</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\minitasn1\structure.h">
++      <Filter>Header Files\lib\minitasn1</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\opencdk\context.h">
++      <Filter>Header Files\lib\opencdk</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\opencdk\filters.h">
++      <Filter>Header Files\lib\opencdk</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\opencdk\keydb.h">
++      <Filter>Header Files\lib\opencdk</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\opencdk\main.h">
++      <Filter>Header Files\lib\opencdk</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\opencdk\opencdk.h">
++      <Filter>Header Files\lib\opencdk</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\opencdk\packet.h">
++      <Filter>Header Files\lib\opencdk</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\opencdk\stream.h">
++      <Filter>Header Files\lib\opencdk</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\opencdk\types.h">
++      <Filter>Header Files\lib\opencdk</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\openpgp\openpgp_int.h">
++      <Filter>Header Files\lib\openpgp</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\nettle\gnettle.h">
++      <Filter>Header Files\lib\nettle</Filter>
++    </ClInclude>
++    <ClInclude Include="version.h">
++      <Filter>Header Files</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\self-test.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\x509-ext.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\nettle\rnd-common.h">
++      <Filter>Header Files\lib\nettle</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\accelerated\x86\aes-padlock.h">
++      <Filter>Header Files\lib\accelerated\x86</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\accelerated\x86\aes-x86.h">
++      <Filter>Header Files\lib\accelerated\x86</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\accelerated\x86\sha-padlock.h">
++      <Filter>Header Files\lib\accelerated\x86</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\accelerated\x86\sha-x86.h">
++      <Filter>Header Files\lib\accelerated\x86</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\accelerated\x86\x86-common.h">
++      <Filter>Header Files\lib\accelerated\x86</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\accelerated\x86\aes-gcm-aead.h">
++      <Filter>Header Files\lib\accelerated\x86</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\etm.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ext\ext_master_secret.h">
++      <Filter>Header Files\lib\ext</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\extras\hex.h">
++      <Filter>Header Files\lib\extras</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\system-keys.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\urls.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\pkcs7.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth\srp_kx.h">
++      <Filter>Header Files\lib\auth</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\includes\gnutls\socket.h">
++      <Filter>Header Files\lib\includes\gnutls</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\abstract_int.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\algorithms.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\atfork.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\auth.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\buffers.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\cipher.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\cipher_int.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\compress.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\constate.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\crypto.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\crypto-backend.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\datum.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\db.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\debug.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\dh.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\dtls.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\ecc.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\errors.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\extensions.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\file.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\fips.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\global.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\gnutls_int.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\handshake.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\hash_int.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\kx.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\locks.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\mbuffers.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\mem.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\mpi.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\num.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\pin.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\pk.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\random.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\record.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\session_pack.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\srp.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\sslv2_compat.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\state.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\str.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\str_array.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\supplemental.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\system.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\system-keys.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\tls-sig.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\urls.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\vasprintf.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509_b64.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="lib\priority_options.h">
++      <Filter>Header Files\lib</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\nettle\int\dsa-fips.h">
++      <Filter>Header Files\lib\nettle\int</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\nettle\int\rsa-fips.h">
++      <Filter>Header Files\lib\nettle\int</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\openpgp\openpgp.h">
++      <Filter>Header Files\lib\openpgp</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\ip.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\ip-in-cidr.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\krb5.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\pkcs7_int.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\virt-san.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\x509_ext_int.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unicase\special-casing-table.h">
++      <Filter>Header Files\lib\unistring\unicase</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pc.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pd.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pe.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pf.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Pi.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Po.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Ps.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_S.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Sc.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Sk.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Sm.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_So.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Z.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Zl.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Zp.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Zs.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\combiningclass.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\pr_default_ignorable_code_point.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\pr_join_control.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\pr_not_a_character.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\bitmap.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_C.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Cc.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Cf.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Cn.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Co.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Cs.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_L.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_LC.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Ll.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Lm.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Lo.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Lt.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Lu.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_M.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Mc.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Me.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Mn.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_N.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Nd.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_Nl.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_No.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_of.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unictype\categ_P.h">
++      <Filter>Header Files\lib\unistring\unictype</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\uninorm\composition-table.h">
++      <Filter>Header Files\lib\unistring\uninorm</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\uninorm\decompose-internal.h">
++      <Filter>Header Files\lib\unistring\uninorm</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\uninorm\decomposition-table.h">
++      <Filter>Header Files\lib\unistring\uninorm</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\uninorm\decomposition-table1.h">
++      <Filter>Header Files\lib\unistring\uninorm</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\uninorm\decomposition-table2.h">
++      <Filter>Header Files\lib\unistring\uninorm</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\uninorm\normalize-internal.h">
++      <Filter>Header Files\lib\unistring\uninorm</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\uninorm\u-normalize-internal.h">
++      <Filter>Header Files\lib\unistring\uninorm</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\unistring\unistr\u-cpy.h">
++      <Filter>Header Files\lib\unistring\unistring</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\attributes.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++    <ClInclude Include="..\lib\x509\prov-seed.h">
++      <Filter>Header Files\lib\x509</Filter>
++    </ClInclude>
++  </ItemGroup>
++  <ItemGroup>
++    <ClCompile Include="..\lib\x509\pkcs7.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs12.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs12_bag.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs12_encr.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\privkey.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\privkey_openssl.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\privkey_pkcs8.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\sign.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\verify.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\verify-high.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\verify-high2.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\x509.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\x509_dn.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\x509_write.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\common.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\crl.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\crl_write.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\crq.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\dn.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\extensions.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\key_decode.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\key_encode.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\mpi.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\ocsp.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\ocsp_output.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\output.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\cryptodev-gcm.c">
++      <Filter>Source Files\lib\accelerated</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\accelerated.c">
++      <Filter>Source Files\lib\accelerated</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\cryptodev.c">
++      <Filter>Source Files\lib\accelerated</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\dhe_psk.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\ecdhe.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\psk.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\psk_passwd.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\rsa.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\rsa_psk.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\srp_passwd.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\srp_rsa.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\srp_sb64.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\anon.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\anon_ecdh.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\cert.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\dh_common.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\dhe.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\extras\randomart.c">
++      <Filter>Source Files\lib\extras</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\minitasn1\parser_aux.c">
++      <Filter>Source Files\lib\minitasn1</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\minitasn1\structure.c">
++      <Filter>Source Files\lib\minitasn1</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\minitasn1\version.c">
++      <Filter>Source Files\lib\minitasn1</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\minitasn1\coding.c">
++      <Filter>Source Files\lib\minitasn1</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\minitasn1\decoding.c">
++      <Filter>Source Files\lib\minitasn1</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\minitasn1\element.c">
++      <Filter>Source Files\lib\minitasn1</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\minitasn1\errors.c">
++      <Filter>Source Files\lib\minitasn1</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\minitasn1\gstr.c">
++      <Filter>Source Files\lib\minitasn1</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\mac.c">
++      <Filter>Source Files\lib\nettle</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\mpi.c">
++      <Filter>Source Files\lib\nettle</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\pk.c">
++      <Filter>Source Files\lib\nettle</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\cipher.c">
++      <Filter>Source Files\lib\nettle</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\init.c">
++      <Filter>Source Files\lib\nettle</Filter>
++    </ClCompile>
++    <ClCompile Include="..\gl\c-ctype.c">
++      <Filter>Source Files\gl</Filter>
++    </ClCompile>
++    <ClCompile Include="..\gl\read-file.c">
++      <Filter>Source Files\gl</Filter>
++    </ClCompile>
++    <ClCompile Include="..\gl\hash-pjw-bare.c">
++      <Filter>Source Files\gl</Filter>
++    </ClCompile>
++    <ClCompile Include="..\gl\msvc-nothrow.c">
++      <Filter>Source Files\gl</Filter>
++    </ClCompile>
++    <ClCompile Include="..\gl\msvc-inval.c">
++      <Filter>Source Files\gl</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\rnd.c">
++      <Filter>Source Files\lib\nettle</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\name_constraints.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\x509_ext.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\x86-common.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-x86-pclmul.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-x86-ssse3.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-padlock.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\hmac-padlock.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\hmac-x86-ssse3.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\sha-padlock.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\sha-x86-ssse3.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-cbc-x86-aesni.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-cbc-x86-ssse3.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-padlock.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-x86-aesni.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-ccm-x86-aesni.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\extras\hex.c">
++      <Filter>Source Files\lib\extras</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\email-verify.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\hostname-verify.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs7-attrs.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs7-output.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\gl\secure_getenv.c">
++      <Filter>Source Files\gl</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\accelerated\x86\aes-gcm-x86-pclmul-avx.c">
++      <Filter>Source Files\lib\accelerated\x86</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth\srp_kx.c">
++      <Filter>Source Files\lib\auth</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\system\certs.c">
++      <Filter>Source Files\lib\system</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\system\fastopen.c">
++      <Filter>Source Files\lib\system</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\system\keys-win.c">
++      <Filter>Source Files\lib\system</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\system\sockets.c">
++      <Filter>Source Files\lib\system</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\system\threads.c">
++      <Filter>Source Files\lib\system</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\sysrng-windows.c">
++      <Filter>Source Files\lib\nettle</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\ip.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\krb5.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\pkcs7-crypt.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\privkey_pkcs8_pbes1.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\tls_features.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\virt-san.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Sm.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_So.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_test.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Z.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Zl.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Zp.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Zs.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\combiningclass.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\pr_default_ignorable_code_point.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\pr_join_control.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\pr_not_a_character.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_and.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_and_not.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_byname.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_C.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Cc.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Cf.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Cn.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Co.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Cs.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_L.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_LC.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Ll.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Lm.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Lo.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_longname.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Lt.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Lu.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_M.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Mc.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Me.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Mn.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_N.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_name.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Nd.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Nl.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_No.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_none.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_of.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_or.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_P.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pc.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pd.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pe.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pf.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Pi.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Po.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Ps.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_S.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Sc.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unictype\categ_Sk.c">
++      <Filter>Source Files\lib\unistring\unictype</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\u32-normalize.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\canonical-decomposition.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\compat-decomposition.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\composition.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\decompose-internal.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\decomposition.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\decomposition-table.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\nfc.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\nfd.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\nfkc.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\nfkd.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\u8-normalize.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\uninorm\u16-normalize.c">
++      <Filter>Source Files\lib\unistring\uninorm</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u8-mbtouc-unsafe-aux.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u8-to-u16.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u8-to-u32.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u8-uctomb.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u8-uctomb-aux.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u16-cpy.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u16-mbtoucr.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u16-mbtouc-unsafe.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u16-mbtouc-unsafe-aux.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u16-to-u8.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u16-uctomb.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u16-uctomb-aux.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u32-cpy.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u32-mbtouc-unsafe.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u32-to-u8.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u32-uctomb.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u8-check.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u8-cpy.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u8-mbtoucr.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\unistring\unistr\u8-mbtouc-unsafe.c">
++      <Filter>Source Files\lib\unistring\unistr</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\time.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\attributes.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509\prov-seed.c">
++      <Filter>Source Files\lib\x509</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\early_data.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\ec_point_formats.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\etm.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\ext_master_secret.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\heartbeat.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\key_share.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\max_record.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\post_handshake.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\pre_shared_key.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\psk_ke_modes.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\record_size_limit.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\safe_renegotiation.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\server_cert_type.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\server_name.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\session_ticket.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\signature.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\srp.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\srtp.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\status_request.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\supported_groups.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\supported_versions.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\alpn.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\client_cert_type.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\cookie.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ext\dumbfw.c">
++      <Filter>Source Files\lib\ext</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\ecc-gost-hash.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\gost28147.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\gostdsa-mask.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\gostdsa-sign.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\gostdsa-verify.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\gosthash94.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\gosthash94-meta.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\hmac-gosthash94.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\hmac-streebog.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\pbkdf2-hmac-gosthash94.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\pbkdf2-hmac-streebog.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\streebog.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\streebog-meta.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\bignum-le.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\ecc-gost256cpa.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\ecc-gost512a.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\ecc-gostdsa-sign.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\gost\ecc-gostdsa-verify.c">
++      <Filter>Source Files\lib\nettle\gost</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\backport\cfb8.c">
++      <Filter>Source Files\lib\nettle\backport</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\backport\cmac.c">
++      <Filter>Source Files\lib\nettle\backport</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\certificate_request.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\certificate_verify.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\early_data.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\encrypted_extensions.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\finished.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\hello_retry.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\key_update.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\post_handshake.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\psk_ext_parser.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\session_ticket.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\anti_replay.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13\certificate.c">
++      <Filter>Source Files\lib\tls13</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\gnutls_asn1_tab.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\handshake.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\handshake-checks.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\handshake-tls13.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\hash_int.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\hello_ext.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\hello_ext_lib.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\kx.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\locks.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\mbuffers.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\mem.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\mpi.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\num.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ocsp-api.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\openpgp_compat.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pcert.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pin.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pk.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11_int.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11_privkey.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11_secret.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11_write.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkcs11x.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pkix_asn1_tab.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\prf.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\priority.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\privkey.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\privkey_raw.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\psk.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\pubkey.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\random.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\randomart.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\range.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\record.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\safe-memfuncs.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\secrets.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\session.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\session_pack.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\srp.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\sslv2_compat.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\state.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\stek.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\str.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\str-iconv.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\str-idna.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\str-unicode.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\supplemental.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\system.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\system_override.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls13-sig.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tls-sig.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\tpm.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\urls.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\verify-tofu.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\x509_b64.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\alert.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\anon_cred.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\atfork.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auth.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\auto-verify.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\buffers.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\cert-cred.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\cert-cred-rawpk.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\cert-cred-x509.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\cert-session.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\cipher.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\cipher_int.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\cipher-cbc.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\compress.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\constate.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\crypto-api.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\crypto-backend.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\crypto-selftests.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\crypto-selftests-pk.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\datum.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\db.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\debug.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\dh.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\dh-primes.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\dh-session.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\dtls.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\dtls-sw.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\ecc.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\errors.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\extv.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\file.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\fingerprint.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\fips.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\global.c">
++      <Filter>Source Files\lib</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\ciphers.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\ciphersuites.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\ecc.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\groups.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\kx.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\mac.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\protocols.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\publickey.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\secparams.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\sign.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\algorithms\cert_types.c">
++      <Filter>Source Files\lib\algorithms</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\prf.c">
++      <Filter>Source Files\lib\nettle</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\int\drbg-aes-self-test.c">
++      <Filter>Source Files\lib\nettle\int</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\int\dsa-keygen-fips186.c">
++      <Filter>Source Files\lib\nettle\int</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\int\dsa-validate.c">
++      <Filter>Source Files\lib\nettle\int</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\int\provable-prime.c">
++      <Filter>Source Files\lib\nettle\int</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\int\rsa-keygen-fips186.c">
++      <Filter>Source Files\lib\nettle\int</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\int\tls1-prf.c">
++      <Filter>Source Files\lib\nettle\int</Filter>
++    </ClCompile>
++    <ClCompile Include="..\lib\nettle\int\drbg-aes.c">
++      <Filter>Source Files\lib\nettle\int</Filter>
++    </ClCompile>
++  </ItemGroup>
++  <ItemGroup>
++    <None Include="libgnutls.def">
++      <Filter>Resource Files</Filter>
++    </None>
++  </ItemGroup>
++  <ItemGroup>
++    <YASM Include="lib\accelerated\x86\coff\aesni-gcm-x86_64.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\aesni-x86.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\aesni-x86_64.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\aes-ssse3-x86.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\aes-ssse3-x86_64.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\cpuid-x86.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\cpuid-x86_64.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\e_padlock-x86.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\e_padlock-x86_64.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\ghash-x86.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\ghash-x86_64.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha1-ssse3-x86.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha1-ssse3-x86_64.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha256-ssse3-x86.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha256-avx-x86_64.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++    <YASM Include="lib\accelerated\x86\coff\sha256-ssse3-x86_64.asm">
++      <Filter>Source Files\lib\accelerated\x86\coff</Filter>
++    </YASM>
++  </ItemGroup>
++</Project>
+\ No newline at end of file
+diff --git a/SMP/libgnutls_deps.sln b/SMP/libgnutls_deps.sln
+new file mode 100644
+index 0000000..03cf8e4
+--- /dev/null
++++ b/SMP/libgnutls_deps.sln
+@@ -0,0 +1,195 @@
++
++Microsoft Visual Studio Solution File, Format Version 12.00
++VisualStudioVersion = 12.0.30501.0
++MinimumVisualStudioVersion = 12.0.30501.0
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgnutls", "libgnutls.vcxproj", "{6F610EE8-7F59-4191-AB88-F63843267C02}"
++	ProjectSection(ProjectDependencies) = postProject
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2} = {02B94302-23D6-43EF-8865-95CDE99D5DC2}
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518} = {070FEF2B-0C3F-4F33-9D3C-53C7330BF518}
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32} = {CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C} = {200F3D3C-8B84-46D8-953A-6C0EBD283B5C}
++	EndProjectSection
++EndProject
++Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "dependencies", "dependencies", "{653672DB-3E16-4696-981A-81294116434F}"
++EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libhogweed", "..\..\nettle\SMP\libhogweed.vcxproj", "{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}"
++	ProjectSection(ProjectDependencies) = postProject
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2} = {02B94302-23D6-43EF-8865-95CDE99D5DC2}
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518} = {070FEF2B-0C3F-4F33-9D3C-53C7330BF518}
++	EndProjectSection
++EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libnettle", "..\..\nettle\SMP\libnettle.vcxproj", "{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}"
++EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libgmp", "..\..\gmp\SMP\libgmp.vcxproj", "{02B94302-23D6-43EF-8865-95CDE99D5DC2}"
++EndProject
++Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libzlib", "..\..\zlib\SMP\libzlib.vcxproj", "{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}"
++EndProject
++Global
++	GlobalSection(SolutionConfigurationPlatforms) = preSolution
++		Debug|x64 = Debug|x64
++		Debug|x86 = Debug|x86
++		DebugDLL|x64 = DebugDLL|x64
++		DebugDLL|x86 = DebugDLL|x86
++		DebugDLLStaticDeps|x64 = DebugDLLStaticDeps|x64
++		DebugDLLStaticDeps|x86 = DebugDLLStaticDeps|x86
++		Release|x64 = Release|x64
++		Release|x86 = Release|x86
++		ReleaseDLL|x64 = ReleaseDLL|x64
++		ReleaseDLL|x86 = ReleaseDLL|x86
++		ReleaseDLLStaticDeps|x64 = ReleaseDLLStaticDeps|x64
++		ReleaseDLLStaticDeps|x86 = ReleaseDLLStaticDeps|x86
++		ReleaseLTO|x64 = ReleaseLTO|x64
++		ReleaseLTO|x86 = ReleaseLTO|x86
++	EndGlobalSection
++	GlobalSection(ProjectConfigurationPlatforms) = postSolution
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Debug|x64.ActiveCfg = Debug|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Debug|x64.Build.0 = Debug|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Debug|x86.ActiveCfg = Debug|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Debug|x86.Build.0 = Debug|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLL|x64.ActiveCfg = DebugDLL|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLL|x64.Build.0 = DebugDLL|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLL|x86.ActiveCfg = DebugDLL|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLL|x86.Build.0 = DebugDLL|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLLStaticDeps|x64.ActiveCfg = DebugDLLStaticDeps|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLLStaticDeps|x64.Build.0 = DebugDLLStaticDeps|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLLStaticDeps|x86.ActiveCfg = DebugDLLStaticDeps|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.DebugDLLStaticDeps|x86.Build.0 = DebugDLLStaticDeps|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Release|x64.ActiveCfg = Release|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Release|x64.Build.0 = Release|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Release|x86.ActiveCfg = Release|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.Release|x86.Build.0 = Release|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLL|x86.ActiveCfg = ReleaseDLL|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLL|x86.Build.0 = ReleaseDLL|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLLStaticDeps|x64.ActiveCfg = ReleaseDLLStaticDeps|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLLStaticDeps|x64.Build.0 = ReleaseDLLStaticDeps|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLLStaticDeps|x86.ActiveCfg = ReleaseDLLStaticDeps|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseDLLStaticDeps|x86.Build.0 = ReleaseDLLStaticDeps|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseLTO|x64.ActiveCfg = ReleaseLTO|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseLTO|x64.Build.0 = ReleaseLTO|x64
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseLTO|x86.ActiveCfg = ReleaseLTO|Win32
++		{6F610EE8-7F59-4191-AB88-F63843267C02}.ReleaseLTO|x86.Build.0 = ReleaseLTO|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.Debug|x64.ActiveCfg = Debug|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.Debug|x64.Build.0 = Debug|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.Debug|x86.ActiveCfg = Debug|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.Debug|x86.Build.0 = Debug|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.DebugDLL|x64.ActiveCfg = DebugDLL|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.DebugDLL|x64.Build.0 = DebugDLL|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.DebugDLL|x86.ActiveCfg = DebugDLL|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.DebugDLL|x86.Build.0 = DebugDLL|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.DebugDLLStaticDeps|x64.ActiveCfg = Debug|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.DebugDLLStaticDeps|x64.Build.0 = Debug|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.DebugDLLStaticDeps|x86.ActiveCfg = Debug|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.DebugDLLStaticDeps|x86.Build.0 = Debug|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.Release|x64.ActiveCfg = Release|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.Release|x64.Build.0 = Release|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.Release|x86.ActiveCfg = Release|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.Release|x86.Build.0 = Release|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseDLL|x86.ActiveCfg = ReleaseDLL|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseDLL|x86.Build.0 = ReleaseDLL|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseDLLStaticDeps|x64.ActiveCfg = Release|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseDLLStaticDeps|x64.Build.0 = Release|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseDLLStaticDeps|x86.ActiveCfg = Release|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseDLLStaticDeps|x86.Build.0 = Release|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseLTO|x64.ActiveCfg = ReleaseLTO|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseLTO|x64.Build.0 = ReleaseLTO|x64
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseLTO|x86.ActiveCfg = ReleaseLTO|Win32
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C}.ReleaseLTO|x86.Build.0 = ReleaseLTO|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.Debug|x64.ActiveCfg = Debug|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.Debug|x64.Build.0 = Debug|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.Debug|x86.ActiveCfg = Debug|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.Debug|x86.Build.0 = Debug|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.DebugDLL|x64.ActiveCfg = DebugDLL|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.DebugDLL|x64.Build.0 = DebugDLL|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.DebugDLL|x86.ActiveCfg = DebugDLL|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.DebugDLL|x86.Build.0 = DebugDLL|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.DebugDLLStaticDeps|x64.ActiveCfg = Debug|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.DebugDLLStaticDeps|x64.Build.0 = Debug|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.DebugDLLStaticDeps|x86.ActiveCfg = Debug|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.DebugDLLStaticDeps|x86.Build.0 = Debug|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.Release|x64.ActiveCfg = Release|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.Release|x64.Build.0 = Release|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.Release|x86.ActiveCfg = Release|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.Release|x86.Build.0 = Release|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseDLL|x86.ActiveCfg = ReleaseDLL|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseDLL|x86.Build.0 = ReleaseDLL|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseDLLStaticDeps|x64.ActiveCfg = Release|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseDLLStaticDeps|x64.Build.0 = Release|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseDLLStaticDeps|x86.ActiveCfg = Release|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseDLLStaticDeps|x86.Build.0 = Release|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseLTO|x64.ActiveCfg = ReleaseLTO|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseLTO|x64.Build.0 = ReleaseLTO|x64
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseLTO|x86.ActiveCfg = ReleaseLTO|Win32
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518}.ReleaseLTO|x86.Build.0 = ReleaseLTO|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.Debug|x64.ActiveCfg = Debug|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.Debug|x64.Build.0 = Debug|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.Debug|x86.ActiveCfg = Debug|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.Debug|x86.Build.0 = Debug|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.DebugDLL|x64.ActiveCfg = DebugDLL|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.DebugDLL|x64.Build.0 = DebugDLL|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.DebugDLL|x86.ActiveCfg = DebugDLL|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.DebugDLL|x86.Build.0 = DebugDLL|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.DebugDLLStaticDeps|x64.ActiveCfg = Debug|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.DebugDLLStaticDeps|x64.Build.0 = Debug|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.DebugDLLStaticDeps|x86.ActiveCfg = Debug|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.DebugDLLStaticDeps|x86.Build.0 = Debug|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.Release|x64.ActiveCfg = Release|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.Release|x64.Build.0 = Release|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.Release|x86.ActiveCfg = Release|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.Release|x86.Build.0 = Release|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseDLL|x86.ActiveCfg = ReleaseDLL|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseDLL|x86.Build.0 = ReleaseDLL|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseDLLStaticDeps|x64.ActiveCfg = Release|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseDLLStaticDeps|x64.Build.0 = Release|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseDLLStaticDeps|x86.ActiveCfg = Release|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseDLLStaticDeps|x86.Build.0 = Release|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseLTO|x64.ActiveCfg = ReleaseLTO|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseLTO|x64.Build.0 = ReleaseLTO|x64
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseLTO|x86.ActiveCfg = ReleaseLTO|Win32
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2}.ReleaseLTO|x86.Build.0 = ReleaseLTO|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.Debug|x64.ActiveCfg = Debug|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.Debug|x64.Build.0 = Debug|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.Debug|x86.ActiveCfg = Debug|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.Debug|x86.Build.0 = Debug|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.DebugDLL|x64.ActiveCfg = DebugDLL|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.DebugDLL|x64.Build.0 = DebugDLL|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.DebugDLL|x86.ActiveCfg = DebugDLL|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.DebugDLL|x86.Build.0 = DebugDLL|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.DebugDLLStaticDeps|x64.ActiveCfg = Debug|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.DebugDLLStaticDeps|x64.Build.0 = Debug|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.DebugDLLStaticDeps|x86.ActiveCfg = Debug|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.DebugDLLStaticDeps|x86.Build.0 = Debug|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.Release|x64.ActiveCfg = Release|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.Release|x64.Build.0 = Release|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.Release|x86.ActiveCfg = Release|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.Release|x86.Build.0 = Release|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseDLL|x86.ActiveCfg = ReleaseDLL|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseDLL|x86.Build.0 = ReleaseDLL|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseDLLStaticDeps|x64.ActiveCfg = Release|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseDLLStaticDeps|x64.Build.0 = Release|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseDLLStaticDeps|x86.ActiveCfg = Release|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseDLLStaticDeps|x86.Build.0 = Release|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseLTO|x64.ActiveCfg = ReleaseLTO|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseLTO|x64.Build.0 = ReleaseLTO|x64
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseLTO|x86.ActiveCfg = ReleaseLTO|Win32
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32}.ReleaseLTO|x86.Build.0 = ReleaseLTO|Win32
++	EndGlobalSection
++	GlobalSection(SolutionProperties) = preSolution
++		HideSolutionNode = FALSE
++	EndGlobalSection
++	GlobalSection(NestedProjects) = preSolution
++		{200F3D3C-8B84-46D8-953A-6C0EBD283B5C} = {653672DB-3E16-4696-981A-81294116434F}
++		{070FEF2B-0C3F-4F33-9D3C-53C7330BF518} = {653672DB-3E16-4696-981A-81294116434F}
++		{02B94302-23D6-43EF-8865-95CDE99D5DC2} = {653672DB-3E16-4696-981A-81294116434F}
++		{CA9A4A38-CC63-4BDB-8CFB-E058965DDA32} = {653672DB-3E16-4696-981A-81294116434F}
++	EndGlobalSection
++EndGlobal
+diff --git a/SMP/project_get_dependencies.bat b/SMP/project_get_dependencies.bat
+new file mode 100644
+index 0000000..91fd902
+--- /dev/null
++++ b/SMP/project_get_dependencies.bat
+@@ -0,0 +1,161 @@
++@ECHO OFF
++SETLOCAL EnableDelayedExpansion
++
++SET UPSTREAMURL=https://github.com/ShiftMediaProject
++SET DEPENDENCIES=( ^
++nettle, ^
++zlib, ^
++gmp ^
++)
++
++REM Get passed in list of dependencies to skip
++SET PASSDEPENDENCIES=%~1
++
++REM Check if git is installed and available
++IF "%MSVC_VER%"=="" (
++    git status >NUL 2>&1
++    IF ERRORLEVEL 1 (
++        ECHO A working copy of git was not found. To use this script you must first install git for windows.
++        GOTO exitOnError
++    )
++)
++
++REM Store current directory and ensure working directory is the location of current .bat
++SET CURRDIR="%CD%"
++cd "%~dp0"
++
++REM Initialise error check value
++SET ERROR=0
++
++cd ..\..
++FOR %%I IN %DEPENDENCIES% DO (
++    ECHO !PASSDEPENDENCIES! | FINDSTR /C:"%%I" >NUL 2>&1 || (
++        REM Check if MSVC_VER environment variable is set
++        IF "%MSVC_VER%"=="" (
++            CALL :cloneOrUpdateRepo "%%I" || GOTO exitOnError
++        ) ELSE (
++            CALL :downloadLibs "%%I" || GOTO exitOnError
++        )
++    )
++)
++cd "%CURRDIR%" >NUL
++GOTO exit
++
++REM Function to clone or update a repo
++REM  cloneOrUpdateRepo: RepoName
++REM    RepoName = Name of the repository
++:cloneOrUpdateRepo
++SET REPONAME=%~1
++REM Check if the repo folder already exists
++IF EXIST "%REPONAME%" (
++    ECHO %REPONAME%: Existing folder found. Checking for updates...
++    cd %REPONAME%
++    REM Check if any updates are available
++    FOR /f %%J IN ('git rev-parse HEAD') do set CURRHEAD=%%J
++    FOR /f %%J IN ('git ls-remote origin HEAD') do set ORIGHEAD=%%J
++    IF "!CURRHEAD!"=="!ORIGHEAD!" (
++        ECHO %REPONAME%: Repository up to date.
++    ) ELSE (
++        REM Stash any uncommited changes then update from origin
++        ECHO %REPONAME%: Updates available. Updating repository...
++        git checkout master --quiet
++        git stash --quiet
++        git pull origin master --quiet -ff
++        git stash pop --quiet
++    )
++    cd ..\
++) ELSE (
++    ECHO %REPONAME%: Existing folder not found. Cloning repository...
++    REM Clone from the origin repo
++    SET REPOURL=%UPSTREAMURL%/%REPONAME%.git
++    git clone !REPOURL! --quiet
++    IF ERRORLEVEL 1 (
++        ECHO %REPONAME%: Git clone failed.
++        GOTO exitOnError
++    )
++    REM Initialise autocrlf options to fix cross platform interoperation
++    REM  Once updated the repo needs to be reset to correct the local line endings
++    cd %REPONAME%
++    git config --local core.autocrlf false
++    git rm --cached -r . --quiet
++    git reset --hard --quiet
++    cd ..\
++)
++REM Add current repo to list of already passed dependencies
++SET PASSDEPENDENCIES=%PASSDEPENDENCIES% %REPONAME%
++REM Check if the repo itself has required dependencies
++IF EXIST "%REPONAME%\SMP\project_get_dependencies.bat" (
++    ECHO %REPONAME%: Found additional dependencies...
++    ECHO.
++    cd %REPONAME%\SMP
++    project_get_dependencies.bat "!PASSDEPENDENCIES!" || EXIT /B 1
++    cd ..\..
++)
++ECHO.
++EXIT /B %ERRORLEVEL%
++
++REM Function to download existing prebuilt libraries
++REM  downloadLibs: RepoName
++REM    RepoName = Name of the repository
++:downloadLibs
++SET REPONAME=%~1
++REM Get latest release
++ECHO %REPONAME%: Getting latest release...
++SET UPSTREAMAPIURL=%UPSTREAMURL:github.com=api.github.com/repos%
++REM Check if secure OAuth is available
++IF "%GITHUBTOKEN%" == "" (
++    powershell -nologo -noprofile -command "$currentMaxTls = [Math]::Max([Net.ServicePointManager]::SecurityProtocol.value__,[Net.SecurityProtocolType]::Tls.value__);$newTlsTypes = [enum]::GetValues('Net.SecurityProtocolType') | ?{ $_ -gt $currentMaxTls };ForEach ($newTls in $newTlsTypes) { [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor $newTls };try { Invoke-RestMethod -Uri %UPSTREAMAPIURL%/%REPONAME%/releases/latest > latest.json } catch {exit 1}"
++) ELSE (
++    powershell -nologo -noprofile -command "$currentMaxTls = [Math]::Max([Net.ServicePointManager]::SecurityProtocol.value__,[Net.SecurityProtocolType]::Tls.value__);$newTlsTypes = [enum]::GetValues('Net.SecurityProtocolType') | ?{ $_ -gt $currentMaxTls };ForEach ($newTls in $newTlsTypes) { [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor $newTls };try { Invoke-RestMethod -Uri %UPSTREAMAPIURL%/%REPONAME%/releases/latest -Headers @{'Authorization' = 'token %GITHUBTOKEN%'} > latest.json } catch {exit 1}"
++)
++IF ERRORLEVEL 1 ( ECHO Failed getting latest %REPONAME% release & EXIT /B 1 )
++REM Get tag for latest release
++FOR /F "tokens=* USEBACKQ" %%F IN (`TYPE latest.json ^| FINDSTR /B "tag_name"`) DO SET TAG=%%F
++FOR /F "tokens=2 delims=: " %%F in ("%TAG%") DO SET TAG=%%F
++IF "%TAG%"=="" ( ECHO Failed getting latest %REPONAME% release tag information & EXIT /B 1 )
++REM Get download name of latest release
++SET LIBNAME=
++FOR /F "tokens=* USEBACKQ" %%F IN (`TYPE latest.json ^| FINDSTR "name="`) DO ( SET TEMPF=%%F
++    SET TEMPF=!TEMPF:*name=!
++    IF "!TEMPF:~1,3!"=="lib" ( SET LIBNAME=!TEMPF:~1! )
++)
++FOR /F "tokens=1 delims=_" %%F in ("%LIBNAME%") DO SET LIBNAME=%%F
++IF "%LIBNAME%"=="" ( ECHO Failed getting latest %REPONAME% release name information & EXIT /B 1 )
++DEL /F /Q latest.json
++REM Get the download location for the required tag
++SET TAG2=%TAG:+=.%
++SET DLURL=%UPSTREAMURL%/%REPONAME%/releases/download/%TAG%/%LIBNAME%_%TAG2%_msvc%MSVC_VER%.zip
++REM Download a pre-built archive and extract
++ECHO %REPONAME%: Downloading %LIBNAME%_%TAG%_msvc%MSVC_VER%.zip...
++SET PREBUILTDIR=prebuilt
++MKDIR %PREBUILTDIR% >NUL 2>&1
++powershell -nologo -noprofile -command "$currentMaxTls = [Math]::Max([Net.ServicePointManager]::SecurityProtocol.value__,[Net.SecurityProtocolType]::Tls.value__);$newTlsTypes = [enum]::GetValues('Net.SecurityProtocolType') | ?{ $_ -gt $currentMaxTls };ForEach ($newTls in $newTlsTypes) { [Net.ServicePointManager]::SecurityProtocol = [Net.ServicePointManager]::SecurityProtocol -bor $newTls };try { (New-Object Net.WebClient).DownloadFile('%DLURL%', '%PREBUILTDIR%\temp.zip') } catch {exit 1}"
++IF ERRORLEVEL 1 ( ECHO Failed downloading %DLURL% & EXIT /B 1 )
++powershell -nologo -noprofile -command "Add-Type -AssemblyName System.IO.Compression.FileSystem; $zip=[System.IO.Compression.ZipFile]::OpenRead('%PREBUILTDIR%\temp.zip'); foreach ($item in $zip.Entries) { try {$file=(Join-Path -Path .\%PREBUILTDIR% -ChildPath $item.FullName); $null=[System.IO.Directory]::CreateDirectory((Split-Path -Path $file)); [System.IO.Compression.ZipFileExtensions]::ExtractToFile($item,$file,$true)} catch {exit 1} }"
++IF ERRORLEVEL 1 ( ECHO Failed extracting downloaded archive & EXIT /B 1 )
++DEL /F /Q %PREBUILTDIR%\\temp.zip
++ECHO.
++EXIT /B %ERRORLEVEL%
++
++:exitOnError
++cd "%CURRDIR%"
++SET ERROR=1
++
++:exit
++REM Directly exit if an AppVeyor build
++IF NOT "%APPVEYOR%"=="" (
++    GOTO return
++)
++REM Return the passed dependency list
++(
++    ENDLOCAL
++    SET PASSDEPENDENCIES=%PASSDEPENDENCIES%
++)
++    
++REM Check if this was launched from an existing terminal or directly from .bat
++REM  If launched by executing the .bat then pause on completion
++ECHO %CMDCMDLINE% | FINDSTR /L %COMSPEC% >NUL 2>&1
++IF %ERRORLEVEL% == 0 IF "%~1"=="" PAUSE
++
++:return
++EXIT /B %ERROR%
+\ No newline at end of file
+diff --git a/SMP/readme.txt b/SMP/readme.txt
+new file mode 100644
+index 0000000..fa73ea3
+--- /dev/null
++++ b/SMP/readme.txt
+@@ -0,0 +1,16 @@
++
++This is a small list of steps in order to build gnutls into a msvc DLL and lib file.
++
++The project contains Release and Debug builds for static lib files (Debug/Release)
++  as well as dynamic shared dll files (DebugDLL/ReleaseDLL).
++Choose whichever project configuration meets your requirements.
++
++
++*** Building with YASM ***
++
++In order to build gmp using msvc you must first download and install YASM.
++YASM is required to compile all gmp assembly files.
++
++1) Visual Studio YASM integration can be downloaded from https://github.com/ShiftMediaProject/VSYASM/releases/latest
++
++2) Once downloaded simply follow the install instructions included in the download.
+\ No newline at end of file
+diff --git a/SMP/stdio.h b/SMP/stdio.h
+new file mode 100644
+index 0000000..1f97403
+--- /dev/null
++++ b/SMP/stdio.h
+@@ -0,0 +1,147 @@
++/*
++ * MSVC stdio.h compatibility header.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#ifndef SMP_STDIO_H
++#define SMP_STDIO_H
++
++#ifndef _MSC_VER
++#   include_next <stdio.h>
++#else
++
++#include <crtversion.h>
++#if _VC_CRT_MAJOR_VERSION >= 14
++#   include <../ucrt/stdio.h>
++#else
++#   include <../include/stdio.h>
++#   define snprintf _snprintf
++#endif
++
++#include <unistd.h>
++#include <limits.h>
++#include <stdint.h>
++#include <stdlib.h>
++#include <errno.h>
++#include <stdarg.h>
++
++#ifndef SSIZE_MAX
++#   define SSIZE_MAX ((ssize_t) (SIZE_MAX / 2))
++#endif
++
++static __inline ssize_t getdelim(char **lineptr, size_t *n, int delimiter, FILE *fp)
++{
++    ssize_t result;
++    size_t cur_len = 0;
++
++    if (lineptr == NULL || n == NULL || fp == NULL) {
++        errno = EINVAL;
++        return -1;
++    }
++    if (*lineptr == NULL || *n == 0) {
++        char *new_lineptr;
++        *n = 120;
++        new_lineptr = (char *)realloc(*lineptr, *n);
++        if (new_lineptr == NULL) {
++            result = -1;
++            return result;
++        }
++        *lineptr = new_lineptr;
++    }
++
++    for (;;) {
++        int i;
++        i = getc(fp);
++        if (i == EOF) {
++            result = -1;
++            break;
++        }
++        if (cur_len + 1 >= *n) {
++            size_t needed_max = SSIZE_MAX < SIZE_MAX ? (size_t)SSIZE_MAX + 1 : SIZE_MAX;
++            size_t needed = 2 * *n + 1;
++            char *new_lineptr;
++            if (needed_max < needed) {
++                needed = needed_max;
++            }
++            if (cur_len + 1 >= needed) {
++                result = -1;
++                errno = EOVERFLOW;
++                return result;
++            }
++            new_lineptr = (char *)realloc(*lineptr, needed);
++            if (new_lineptr == NULL) {
++                result = -1;
++                return result;
++            }
++            *lineptr = new_lineptr;
++            *n = needed;
++        }
++        (*lineptr)[cur_len] = i;
++        cur_len++;
++        if (i == delimiter) {
++            break;
++        }
++    }
++    (*lineptr)[cur_len] = '\0';
++    result = cur_len ? cur_len : result;
++
++    return result;
++}
++
++static __inline ssize_t getline(char **lineptr, size_t *n, FILE *stream)
++{
++    return getdelim(lineptr, n, '\n', stream);
++}
++
++static __inline int vasprintf(char **res, char const *fmt, va_list args)
++{
++    int r, sz = _vscprintf(fmt, args);
++    if (sz >= 0) {
++        if ((*res = malloc(sz + 1)) == NULL) {
++            return -1;
++        }
++        r = vsnprintf(*res, sz + 1, fmt, args);
++        if ((r < 0) || (r > sz)) {
++            free(*res);
++            *res = NULL;
++            return -1;
++        }
++        return r;
++    } else {
++        return -1;
++    }
++}
++
++static __inline int asprintf(char **strp, const char *fmt, ...)
++{
++    int r;
++    va_list ap;
++    va_start(ap, fmt);
++    r = vasprintf(strp, fmt, ap);
++    va_end(ap);
++    return(r);
++}
++
++#define fseeko _fseeki64
++#define ftello _ftelli64
++
++#endif /* _MSC_VER */
++
++#endif /* SMP_STDIO_H */
+\ No newline at end of file
+diff --git a/SMP/string.h b/SMP/string.h
+new file mode 100644
+index 0000000..39854ea
+--- /dev/null
++++ b/SMP/string.h
+@@ -0,0 +1,130 @@
++/*
++ * MSVC string.h compatibility header.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#ifndef SMP_STRING_H
++#define SMP_STRING_H
++
++#ifndef _MSC_VER
++#   include_next <string.h>
++#else
++
++#include <crtversion.h>
++#if _VC_CRT_MAJOR_VERSION >= 14
++#   include <../ucrt/string.h>
++#else
++#   include <../include/string.h>
++#   define strtoll _strtoi64
++#endif
++
++static __inline void *memmem(const void *haystack, size_t haystack_len, const void *needle, size_t needle_len)
++{
++    const char *begin = haystack;
++    const char *last_possible = begin + haystack_len - needle_len;
++    const char *tail = needle;
++    char point;
++
++    if (needle_len == 0)
++        return (void *)begin;
++
++    if (haystack_len < needle_len)
++        return NULL;
++
++    point = *tail++;
++    for (; begin <= last_possible; begin++) {
++        if (*begin == point && !memcmp(begin + 1, tail, needle_len - 1))
++            return (void *)begin;
++    }
++
++    return NULL;
++}
++
++#include <stdint.h>
++#include <ctype.h>
++
++#define  S_N    0x0
++#define  S_I    0x3
++#define  S_F    0x6
++#define  S_Z    0x9
++
++#define  CMP    2
++#define  LEN    3
++
++static __inline int strverscmp(const char *s1, const char *s2)
++{
++    const unsigned char *p1 = (const unsigned char *)s1;
++    const unsigned char *p2 = (const unsigned char *)s2;
++
++    const uint8_t next_state[] =
++    {
++        /* state    x    d    0  */
++        /* S_N */  S_N, S_I, S_Z,
++        /* S_I */  S_N, S_I, S_I,
++        /* S_F */  S_N, S_F, S_F,
++        /* S_Z */  S_N, S_F, S_Z
++    };
++
++    const int8_t result_type[] =
++    {
++        /* S_N */  CMP, CMP, CMP, CMP, LEN, CMP, CMP, CMP, CMP,
++        /* S_I */  CMP, -1, -1, +1, LEN, LEN, +1, LEN, LEN,
++        /* S_F */  CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,
++        /* S_Z */  CMP, +1, +1, -1, CMP, CMP, -1, CMP, CMP
++    };
++
++    if (p1 == p2)
++        return 0;
++    unsigned char c1 = *p1++;
++    unsigned char c2 = *p2++;
++    int state = S_N + ((c1 == '0') + (isdigit(c1) != 0));
++    int diff;
++    while ((diff = c1 - c2) == 0) {
++        if (c1 == '\0') {
++            return diff;
++        }
++        state = next_state[state];
++        c1 = *p1++;
++        c2 = *p2++;
++        state += (c1 == '0') + (isdigit(c1) != 0);
++    }
++    state = result_type[state * 3 + (((c2 == '0') + (isdigit(c2) != 0)))];
++    switch (state) {
++        case CMP:
++            return diff;
++        case LEN:
++            while (isdigit(*p1++)) {
++                if (!isdigit(*p2++)) {
++                    return 1;
++                }
++            }
++            return isdigit(*p2) ? -1 : diff;
++        default:
++            return state;
++    }
++}
++
++#define strtok_r strtok_s
++#define strcasecmp _stricmp
++#define strncasecmp _strnicmp
++
++#endif /* _MSC_VER */
++
++#endif /* SMP_STRING_H */
+\ No newline at end of file
+diff --git a/SMP/sys/socket.h b/SMP/sys/socket.h
+new file mode 100644
+index 0000000..9fff505
+--- /dev/null
++++ b/SMP/sys/socket.h
+@@ -0,0 +1,35 @@
++/*
++ * MSVC sys/socket.h compatibility header.
++ * Copyright (c) 2015 Matthew Oliver
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#ifndef SMP_SYS_SOCKET_H
++#define SMP_SYS_SOCKET_H
++
++#ifndef _MSC_VER
++#   include_next <sys/socket.h>
++#else
++
++#include <Winsock2.h>
++
++#endif /* _MSC_VER */
++
++#endif /* SMP_SYS_SOCKET_H */
+\ No newline at end of file
+diff --git a/SMP/sys/stat.h b/SMP/sys/stat.h
+new file mode 100644
+index 0000000..e35d122
+--- /dev/null
++++ b/SMP/sys/stat.h
+@@ -0,0 +1,103 @@
++/*
++ * MSVC sys/stat.h compatibility header.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#ifndef SMP_SYS_STAT_H
++#define SMP_SYS_STAT_H
++
++#ifndef _MSC_VER
++#   include_next <sys/stat.h>
++#else
++
++#include <crtversion.h>
++#if _VC_CRT_MAJOR_VERSION >= 14
++#   include <../ucrt/sys/stat.h>
++#else
++#   include <../include/sys/stat.h>
++#endif
++
++#ifndef S_ISBLK
++#define S_ISBLK(mode)  (((mode) & S_IFMT) == S_IFBLK)
++#endif
++
++#ifndef S_ISFIFO
++#define S_ISFIFO(mode)  (((mode) & S_IFMT) == S_IFIFO)
++#endif
++
++#ifndef S_ISCHR
++#define S_ISCHR(mode)  (((mode) & S_IFMT) == S_IFCHR)
++#endif
++
++#ifndef S_ISDIR
++#define S_ISDIR(mode)  (((mode) & S_IFMT) == S_IFDIR)
++#endif
++
++#ifndef S_ISREG
++#define S_ISREG(mode)  (((mode) & S_IFMT) == S_IFREG)
++#endif
++
++#ifndef S_ISLNK
++#define S_ISLNK(mode)  (((mode) & S_IFMT) == S_IFLNK)
++#endif
++
++#ifndef S_ISSOCK
++#define S_ISSOCK(mode)  (((mode) & S_IFMT) == S_IFSOCK)
++#endif
++
++#define	_S_ISUID        0004000
++#define	_S_ISGID        0002000
++#define	_S_ISVTX        0001000
++
++#define	S_ISUID        _S_ISUID
++#define	S_ISGID        _S_ISGID
++#define	S_ISVTX        _S_ISVTX
++
++#define	_S_IRWXU	     (_S_IREAD | _S_IWRITE | _S_IEXEC)
++#define	_S_IXUSR	     _S_IEXEC
++#define	_S_IWUSR	     _S_IWRITE
++#define	_S_IRUSR	     _S_IREAD
++#define	_S_IRWXG        (_S_IRWXU >> 3)
++#define	_S_IXGRP        (_S_IXUSR >> 3)
++#define	_S_IWGRP        (_S_IWUSR >> 3)
++#define	_S_IRGRP        (_S_IRUSR >> 3)
++#define	_S_IRWXO        (_S_IRWXG >> 3)
++#define	_S_IXOTH        (_S_IXGRP >> 3)
++#define	_S_IWOTH        (_S_IWGRP >> 3)
++#define	_S_IROTH        (_S_IRGRP  >> 3)
++
++#ifndef S_IRWXU
++#define	S_IRWXU	     _S_IRWXU
++#define	S_IXUSR	     _S_IXUSR
++#define	S_IWUSR	     _S_IWUSR
++#define	S_IRUSR	     _S_IRUSR
++#endif
++#define	S_IRWXG        _S_IRWXG
++#define	S_IXGRP        _S_IXGRP
++#define	S_IWGRP        _S_IWGRP
++#define	S_IRGRP        _S_IRGRP
++#define	S_IRWXO        _S_IRWXO
++#define	S_IXOTH        _S_IXOTH
++#define	S_IWOTH        _S_IWOTH
++#define	S_IROTH        _S_IROTH
++
++#endif /* _MSC_VER */
++
++#endif /* SMP_SYS_STAT_H */
+\ No newline at end of file
+diff --git a/SMP/sys/time.h b/SMP/sys/time.h
+new file mode 100644
+index 0000000..8d060ea
+--- /dev/null
++++ b/SMP/sys/time.h
+@@ -0,0 +1,72 @@
++/*
++ * MSVC sys/time.h compatibility header.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#ifndef SMP_SYS_TIME_H
++#define SMP_SYS_TIME_H
++
++#ifndef _MSC_VER
++#   include_next <sys/time.h>
++#else
++
++#include <time.h>
++#include <winsock2.h>
++#include <winapifamily.h>
++
++struct timezone
++{
++    int  tz_minuteswest; /* minutes W of Greenwich */
++    int  tz_dsttime;     /* type of dst correction */
++};
++
++static __inline int gettimeofday(struct timeval * tp, struct timezone * tzp)
++{
++    FILETIME    file_time;
++    SYSTEMTIME  system_time;
++    ULARGE_INTEGER ularge;
++    static int tzflag;
++
++    GetSystemTime(&system_time);
++    SystemTimeToFileTime(&system_time, &file_time);
++    ularge.LowPart = file_time.dwLowDateTime;
++    ularge.HighPart = file_time.dwHighDateTime;
++
++    tp->tv_sec = (long) ((ularge.QuadPart - 116444736000000000Ui64) / 10000000L);
++    tp->tv_usec = (long) (system_time.wMilliseconds * 1000);
++
++#if !(defined(WINAPI_FAMILY_PARTITION) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP))
++    if (NULL != tzp)
++    {
++        if (!tzflag)
++        {
++          _tzset();
++          tzflag++;
++        }
++        tzp->tz_minuteswest = _timezone / 60;
++        tzp->tz_dsttime = _daylight;
++    }
++#endif
++    return 0;
++}
++
++#endif /* _MSC_VER */
++
++#endif /* SMP_SYS_TIME_H */
+\ No newline at end of file
+diff --git a/SMP/test.bat b/SMP/test.bat
+new file mode 100644
+index 0000000..1836af3
+--- /dev/null
++++ b/SMP/test.bat
+@@ -0,0 +1,6 @@
++mkdir "C:\Users\fner\Projects\ring-project\daemon\contrib\build\gnutls - 3.6.7\SMP\..\..\..\msvc\"\include
++mkdir "C:\Users\fner\Projects\ring-project\daemon\contrib\build\gnutls - 3.6.7\SMP\..\..\..\msvc\"\include\gnutls
++copy ..\lib\includes\gnutls\*.h "C:\Users\fner\Projects\ring-project\daemon\contrib\build\gnutls - 3.6.7\SMP\..\..\..\msvc\"\include\gnutls
++copy .\gnutls\gnutls.h "C:\Users\fner\Projects\ring-project\daemon\contrib\build\gnutls - 3.6.7\SMP\..\..\..\msvc\"\include\gnutls
++mkdir C:\Users\fner\Projects\ring-project\daemon\contrib\build\gnutls - 3.6.7\SMP\..\..\..\msvc\\licenses
++copy ..\LICENSE C:\Users\fner\Projects\ring-project\daemon\contrib\build\gnutls - 3.6.7\SMP\..\..\..\msvc\\licenses\gnutls.txt
+\ No newline at end of file
+diff --git a/SMP/time.h b/SMP/time.h
+new file mode 100644
+index 0000000..05f55a9
+--- /dev/null
++++ b/SMP/time.h
+@@ -0,0 +1,47 @@
++/*
++ * MSVC time.h compatibility header.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#ifndef SMP_TIME_H
++#define SMP_TIME_H
++
++#ifndef _MSC_VER
++#   include_next <time.h>
++#else
++
++#include <crtversion.h>
++#if _VC_CRT_MAJOR_VERSION >= 14
++#   include <../ucrt/time.h>
++#else
++#   include <../include/time.h>
++struct timespec
++{
++    time_t tv_sec;
++    long int tv_nsec;
++};
++#endif
++
++#define gmtime_r(x,y) ((gmtime_s(y,x)==0)?x:NULL)
++#define localtime_r ((localtime_s(y,x)==0)?x:NULL)
++
++#endif /* _MSC_VER */
++
++#endif /* SMP_TIME_H */
+\ No newline at end of file
+diff --git a/SMP/unistd.h b/SMP/unistd.h
+new file mode 100644
+index 0000000..cef9584
+--- /dev/null
++++ b/SMP/unistd.h
+@@ -0,0 +1,78 @@
++/*
++ * MSVC unistd.h compatibility header.
++ *
++ * Permission is hereby granted, free of charge, to any person obtaining a copy
++ * of this software and associated documentation files (the "Software"), to deal
++ * in the Software without restriction, including without limitation the rights
++ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
++ * copies of the Software, and to permit persons to whom the Software is
++ * furnished to do so, subject to the following conditions:
++ *
++ * The above copyright notice and this permission notice shall be included in
++ * all copies or substantial portions of the Software.
++ *
++ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
++ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
++ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
++ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
++ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
++ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
++ * THE SOFTWARE.
++ */
++
++#ifndef SMP_UNISTD_H
++#define SMP_UNISTD_H
++
++#ifndef _MSC_VER
++#   include_next <unistd.h>
++#else
++
++#include <stdlib.h>
++#include <process.h>
++#include <direct.h>
++#include <fcntl.h>
++
++#define R_OK    4       /* Test for read permission.  */
++#define W_OK    2       /* Test for write permission.  */
++//#define   X_OK    1       /* execute permission - unsupported in windows*/
++#define F_OK    0       /* Test for existence.  */
++
++#ifndef STDIN_FILENO
++#define STDIN_FILENO 0
++#endif
++
++#ifndef STDOUT_FILENO
++#define STDOUT_FILENO 1
++#endif
++
++#ifndef STDERR_FILENO
++#define STDERR_FILENO 2
++#endif
++
++#define srandom srand
++#define random rand
++
++#define inline __inline
++typedef int mode_t;
++#include <BaseTsd.h>
++typedef SSIZE_T ssize_t;
++
++#include <winapifamily.h>
++#if defined(WINAPI_FAMILY_PARTITION) && WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) && !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
++#include <winsock2.h>
++#include <windows.h>
++static __inline char *getcwd(char *buffer, size_t size)
++{
++    return NULL;
++}
++
++typedef int pid_t;
++static __inline pid_t getpid(void)
++{
++    return GetCurrentProcessId();
++}
++#endif
++
++#endif /* _MSC_VER */
++
++#endif /* SMP_UNISTD_H */
+\ No newline at end of file
+diff --git a/SMP/version.h b/SMP/version.h
+new file mode 100644
+index 0000000..9d44d0d
+--- /dev/null
++++ b/SMP/version.h
+@@ -0,0 +1,5 @@
++/* Define to the version of this package. */
++#define PACKAGE_VERSION "3.6.7"
++
++/* Version number of package */
++#define VERSION "3.6.7"
+-- 
+2.7.4
+
+
diff --git a/contrib/src/gnutls/read-file-limits.h.patch b/contrib/src/gnutls/read-file-limits.h.patch
new file mode 100644
index 0000000000000000000000000000000000000000..b13b1a88f482bce0d18cb239132237313b5cfd0b
--- /dev/null
+++ b/contrib/src/gnutls/read-file-limits.h.patch
@@ -0,0 +1,12 @@
+--- gnutls/gl/read-file.c.orig	2012-03-06 20:59:29.600593329 -0500
++++ gnutls/gl/read-file.c	2012-03-06 20:59:44.568593328 -0500
+@@ -35,6 +35,9 @@
+ /* Get errno. */
+ #include <errno.h>
+ 
++/* Get SIZE_MAX */
++#include <limits.h>
++
+ /* Read a STREAM and return a newly allocated string with the content,
+    and set *LENGTH to the length of the string.  The string is
+    zero-terminated, but the terminating zero byte is not counted in
diff --git a/contrib/src/gnutls/rules.mak b/contrib/src/gnutls/rules.mak
index d4e85f60900befcb8b963c77c6e15a53ae861918..b8fbd734f8482498c0eec087ce50e091f0aa578c 100644
--- a/contrib/src/gnutls/rules.mak
+++ b/contrib/src/gnutls/rules.mak
@@ -21,6 +21,7 @@ ifndef HAVE_IOS
 	$(APPLY) $(SRC)/gnutls/mac-keychain-lookup.patch
 endif
 	$(call pkg_static,"lib/gnutls.pc.in")
+	$(UPDATE_AUTOCONFIG)
 	$(MOVE)
 
 GNUTLS_CONF := \
@@ -28,10 +29,8 @@ GNUTLS_CONF := \
 	--without-p11-kit \
 	--disable-cxx \
 	--disable-srp-authentication \
-	--disable-psk-authentication-FIXME \
 	--with-included-libtasn1 \
 	--with-included-unistring \
-	--disable-openpgp-authentication \
 	--disable-openssl-compatibility \
 	--disable-guile \
 	--disable-nls \
@@ -53,6 +52,7 @@ CFLAGS="-D_POSIX_C_SOURCE"
 endif
 
 .gnutls: gnutls
+	$(RECONF)
 ifdef HAVE_ANDROID
 	cd $< && $(HOSTVARS) ./configure $(GNUTLS_CONF)
 else