diff --git a/CryptoPkg/Include/Library/BaseCryptLib.h b/CryptoPkg/Include/Library/BaseCryptLib.h index a9ddcc0162f..dd527d78790 100644 --- a/CryptoPkg/Include/Library/BaseCryptLib.h +++ b/CryptoPkg/Include/Library/BaseCryptLib.h @@ -2048,6 +2048,48 @@ X509GetTBSCert ( OUT UINTN *TBSCertSize ); +/** + Compute the digest of a DER-encoded X.509 certificate using the + hash algorithm identified by HashType. + + The caller selects the digest algorithm by HashType (e.g. + gEfiCertX509Sha256Guid, gEfiCertX509Sha384Guid, gEfiCertX509Sha512Guid). + + If the Digest buffer is too small to hold the contents of the digest, + the error EFI_BUFFER_TOO_SMALL is returned and DigestSize is set to + the required buffer size to obtain the data. + + @param[in] Cert Pointer to the DER-encoded X.509 certificate. + @param[in] CertSize Size of Cert in bytes. + @param[in] HashType Signature-type GUID identifying the hash + algorithm to use. + @param[out] Digest Caller-provided buffer that receives the + computed digest. Must be at least + SHA512_DIGEST_SIZE bytes. + @param[out] DigestSize On success, receives the digest length in + bytes. + + @retval EFI_SUCCESS Digest was computed successfully. + @retval EFI_INVALID_PARAMETER A required pointer is NULL or CertSize + is zero. + @retval EFI_BUFFER_TOO_SMALL DigestSize is too small for the + requested hash algorithm. + @retval EFI_UNSUPPORTED HashType is not a recognized X.509 + certificate hash algorithm, or this + interface is not supported by the + underlying library instance. + @retval EFI_SECURITY_VIOLATION The hash computation failed. +**/ +EFI_STATUS +EFIAPI +GetX509Hash ( + IN VOID *Cert, + IN UINTN CertSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ); + /** Derives a key from a password using a salt and iteration count, based on PKCS#5 v2.0 password based encryption key derivation function PBKDF2, as specified in RFC 2898. @@ -2588,6 +2630,200 @@ AuthenticodeVerify ( IN UINTN HashSize ); +/** + Compute the PE/COFF Authenticode-style image hash of an image as described + in "Windows Authenticode Portable Executable Signature Format". + + The caller selects the digest algorithm by HashType (e.g. + gEfiCertSha256Guid, gEfiCertSha384Guid). + + If the Data buffer is too small to hold the contents of the digest, + the error EFI_BUFFER_TOO_SMALL is returned and DigestSize is set to + the required buffer size to obtain the data. + + @param[in] FileBuffer Pointer to the in-memory PE/COFF image. + @param[in] FileSize Size of FileBuffer in bytes. + @param[in] HashType Signature-type GUID identifying the hash + algorithm to use. + @param[out] Digest Caller-provided buffer that receives the + computed digest. Must be at least + SHA512_DIGEST_SIZE bytes. + @param[out] DigestSize On success, receives the digest length in + bytes. + + @retval EFI_SUCCESS Digest was computed successfully. + @retval EFI_INVALID_PARAMETER A required pointer is NULL. + @retval EFI_BUFFER_TOO_SMALL DigestSize is too small for the + requested hash algorithm. + @retval EFI_UNSUPPORTED HashType is not a recognized image + hash algorithm, or this interface is + not supported by the underlying + library instance. +**/ +EFI_STATUS +EFIAPI +GetAuthenticodeHash ( + IN VOID *FileBuffer, + IN UINTN FileSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ); + +/** + Determine the image-hash algorithm declared by a PE/COFF Authenticode + signature. + + The signature's PKCS#7 SignedData header carries the digest algorithm + used to hash the image. This function parses that header and returns + the matching signature-type GUID (for example gEfiCertSha256Guid). + The returned GUID can be passed directly to GetAuthenticodeHash to + compute the corresponding image hash. + + @param[in] AuthData Pointer to the Authenticode signature retrieved + from a signed PE/COFF image. + @param[in] AuthDataSize Size of AuthData in bytes. + @param[out] HashType On success, receives the signature-type GUID + identifying the digest algorithm declared by + the signature. + + @retval EFI_SUCCESS HashType has been populated. + @retval EFI_INVALID_PARAMETER AuthData or HashType is NULL, or + AuthDataSize is zero. + @retval EFI_BAD_BUFFER_SIZE AuthData is too small or not encoded in a + supported ASN.1 form. + @retval EFI_UNSUPPORTED The signature's digest algorithm is not a + recognized image hash algorithm, or this + interface is not supported by the + underlying library instance. +**/ +EFI_STATUS +EFIAPI +GetAuthenticodeHashAlgorithm ( + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + OUT EFI_GUID *HashType + ); + +/** + Compute the digest of the TBSCertificate of an X.509 certificate. + + Extracts the TBSCertificate (the to-be-signed portion) of the given + DER-encoded certificate and hashes it with the algorithm selected by + HashType. The TBSCertificate is the exact byte range a certificate + authority signs, so its digest uniquely identifies the certificate + independent of the issuer signature. + + The caller selects the digest algorithm by HashType (e.g. + gEfiCertSha256Guid, gEfiCertSha384Guid). The digest is written to + Digest, which must be large enough to hold the largest supported + digest (at least SHA512_DIGEST_SIZE bytes). + + @param[in] Cert Pointer to the DER-encoded X.509 certificate. + @param[in] CertSize Size of Cert in bytes. + @param[in] HashType Signature-type GUID identifying the hash + algorithm to use. + @param[out] Digest Caller-provided buffer that receives the + computed TBSCertificate digest. Must be at + least SHA512_DIGEST_SIZE bytes. + @param[out] DigestSize On success, receives the digest length in + bytes. + + @retval EFI_SUCCESS Digest was computed successfully. + @retval EFI_INVALID_PARAMETER A required pointer is NULL, CertSize is + 0, or Cert is not a well-formed X.509 + certificate. + @retval EFI_UNSUPPORTED HashType is not a recognized image + hash algorithm, or this interface is + not supported by the underlying + library instance. +**/ +EFI_STATUS +EFIAPI +X509GetTbsCertHash ( + IN VOID *Cert, + IN UINTN CertSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ); + +/** + Locate, in a PKCS#7 SignedData blob, the X.509 certificate whose + TBSCertificate digest matches a caller-supplied hash, and return that + certificate as a newly allocated DER-encoded buffer. + + The hash algorithm is selected by TbsCertHashSize: + 20 -> SHA-1, 32 -> SHA-256, 48 -> SHA-384, 64 -> SHA-512. + + An optional cache may be passed via CacheHandle. CacheHandle is a + pointer to a caller-owned VOID *: + - If CacheHandle is NULL, no caching is performed. + - If *CacheHandle is NULL, this function allocates a new cache and + writes its handle to *CacheHandle. The caller releases it with + FreeTrustAnchorX509Cache(). + - Otherwise, *CacheHandle is reused. The cache may be reused across + different AuthData inputs; entries are de-duplicated by the cert + DER bytes. + + Caution: AuthData is untrusted. The PKCS#7 ASN.1 DER is parsed with + bounds-checked length decoding to avoid out-of-bounds reads. + + @param[in,out] CacheHandle Optional cache handle pointer. + @param[in] TbsCertHash Pointer to the target TBSCertificate + digest bytes to match. + @param[in] TbsCertHashSize Length of TbsCertHash in bytes; this + selects the hash algorithm. + @param[in] AuthData Pointer to the PKCS#7 SignedData + blob (DER-encoded). + @param[in] AuthDataSize Size of AuthData in bytes. + @param[out] TrustAnchorX509 On success, *TrustAnchorX509 points + to a newly allocated buffer + containing the matching X.509 + certificate in DER form. The caller + must release it with FreePool(). + @param[out] TrustAnchorX509Size On success, receives the length + of the certificate in bytes. + + @retval EFI_SUCCESS A matching certificate was found and + returned. + @retval EFI_NOT_FOUND No certificate in AuthData has a + TBSCertificate digest equal to the + supplied TbsCertHash. + @retval EFI_INVALID_PARAMETER A required pointer is NULL, a size + parameter is 0, the hash size is not a + supported value, or AuthData is not a + valid PKCS#7 SignedData blob. + @retval EFI_OUT_OF_RESOURCES Memory allocation failed. + @retval EFI_UNSUPPORTED This interface is not supported by the + current library instance. +**/ +EFI_STATUS +EFIAPI +GetTrustAnchorX509FromAuthData ( + IN OUT VOID **CacheHandle OPTIONAL, + IN CONST UINT8 *TbsCertHash, + IN UINTN TbsCertHashSize, + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + OUT UINT8 **TrustAnchorX509, + OUT UINTN *TrustAnchorX509Size + ); + +/** + Release a trust-anchor cache previously allocated by + GetTrustAnchorX509FromAuthData(). + + @param[in] CacheHandle Cache handle returned by a previous call to + GetTrustAnchorX509FromAuthData(). May be + NULL, in which case the function is a no-op. +**/ +VOID +EFIAPI +FreeTrustAnchorX509Cache ( + IN VOID *CacheHandle OPTIONAL + ); + /** Verifies the validity of a RFC3161 Timestamp CounterSignature embedded in PE/COFF Authenticode signature. diff --git a/CryptoPkg/Include/Protocol/OneCrypto.h b/CryptoPkg/Include/Protocol/OneCrypto.h index 8e71513c13f..cc229a89ec6 100644 --- a/CryptoPkg/Include/Protocol/OneCrypto.h +++ b/CryptoPkg/Include/Protocol/OneCrypto.h @@ -1986,6 +1986,99 @@ typedef BOOLEAN (EFIAPI *ONE_CRYPTO_AUTHENTICODE_VERIFY)( IN UINTN HashSize ); +/** + Locate, in a PKCS#7 SignedData blob, the X.509 certificate whose + TBSCertificate digest matches a caller-supplied hash, and return that + certificate as a newly allocated DER-encoded buffer. + + The hash algorithm is selected by TbsCertHashSize: + 20 -> SHA-1, 32 -> SHA-256, 48 -> SHA-384, 64 -> SHA-512. + + CacheHandle is an optional caller-managed cache pointer: + - If CacheHandle is NULL, no caching is performed. + - If *CacheHandle is NULL, a new cache is allocated; the caller + releases it with ONE_CRYPTO_FREE_TRUST_ANCHOR_X509_CACHE. + + @param[in,out] CacheHandle Optional cache handle pointer. + @param[in] TbsCertHash Pointer to the target TBSCertificate + digest bytes. + @param[in] TbsCertHashSize Length of TbsCertHash in bytes. + @param[in] AuthData Pointer to the PKCS#7 SignedData + blob (DER-encoded). + @param[in] AuthDataSize Size of AuthData in bytes. + @param[out] TrustAnchorX509 Receives a newly allocated buffer + holding the matching X.509 cert in + DER form. Caller frees with + FreePool(). + @param[out] TrustAnchorX509Size Receives the certificate length. + + @retval EFI_SUCCESS A matching certificate was found. + @retval EFI_NOT_FOUND No certificate matched. + @retval EFI_INVALID_PARAMETER Bad parameter or malformed AuthData. + @retval EFI_OUT_OF_RESOURCES Memory allocation failed. + @retval EFI_UNSUPPORTED Interface not supported. + + @since 1.1 + @ingroup PKCS +**/ +typedef EFI_STATUS (EFIAPI *ONE_CRYPTO_GET_TRUST_ANCHOR_X509_FROM_AUTH_DATA)( + IN OUT VOID **CacheHandle OPTIONAL, + IN CONST UINT8 *TbsCertHash, + IN UINTN TbsCertHashSize, + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + OUT UINT8 **TrustAnchorX509, + OUT UINTN *TrustAnchorX509Size + ); + +/** + Release a trust-anchor cache previously allocated by + ONE_CRYPTO_GET_TRUST_ANCHOR_X509_FROM_AUTH_DATA. + + @param[in] CacheHandle Cache handle, or NULL. + + @since 1.1 + @ingroup PKCS +**/ +typedef VOID (EFIAPI *ONE_CRYPTO_FREE_TRUST_ANCHOR_X509_CACHE)( + IN VOID *CacheHandle OPTIONAL + ); + +/** + Compute the digest of the TBSCertificate of an X.509 certificate. + + Extracts the TBSCertificate (the to-be-signed portion) of the given + DER-encoded certificate and hashes it with the algorithm selected by + HashType. The recovered digest uniquely identifies the certificate + independent of the issuer signature and can be matched against the + TbsCertHash argument of GetTrustAnchorX509FromAuthData(). + + @param[in] Cert Pointer to the DER-encoded X.509 certificate. + @param[in] CertSize Size of Cert in bytes. + @param[in] HashType Signature-type GUID identifying the hash + algorithm to use. + @param[out] Digest Caller-provided buffer that receives the + computed TBSCertificate digest. Must be at + least SHA512_DIGEST_SIZE bytes. + @param[out] DigestSize On success, receives the digest length in + bytes. + + @retval EFI_SUCCESS Digest was computed successfully. + @retval EFI_INVALID_PARAMETER Bad parameter or malformed certificate. + @retval EFI_UNSUPPORTED Unrecognized hash algorithm, or + interface not supported. + + @since 1.1 + @ingroup PKCS +**/ +typedef EFI_STATUS (EFIAPI *ONE_CRYPTO_X509_GET_TBS_CERT_HASH)( + IN VOID *Cert, + IN UINTN CertSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ); + /** Encrypts a blob using PKCS1v2 (RSAES-OAEP) schema. On success, will return the encrypted message in a newly allocated buffer. @@ -5241,236 +5334,239 @@ typedef struct _ONE_CRYPTO_PROTOCOL { // Minor - Functions added to the end of this structure // // --------------------------------------------------------------------------- - UINT16 Major; - UINT16 Minor; + UINT16 Major; + UINT16 Minor; /// v1.0 HMAC -------------------------------------------------------------- - ONE_CRYPTO_HMAC_SHA256_NEW HmacSha256New; - ONE_CRYPTO_HMAC_SHA256_FREE HmacSha256Free; - ONE_CRYPTO_HMAC_SHA256_SET_KEY HmacSha256SetKey; - ONE_CRYPTO_HMAC_SHA256_DUPLICATE HmacSha256Duplicate; - ONE_CRYPTO_HMAC_SHA256_UPDATE HmacSha256Update; - ONE_CRYPTO_HMAC_SHA256_FINAL HmacSha256Final; - ONE_CRYPTO_HMAC_SHA256_ALL HmacSha256All; - ONE_CRYPTO_HMAC_SHA384_NEW HmacSha384New; - ONE_CRYPTO_HMAC_SHA384_FREE HmacSha384Free; - ONE_CRYPTO_HMAC_SHA384_SET_KEY HmacSha384SetKey; - ONE_CRYPTO_HMAC_SHA384_DUPLICATE HmacSha384Duplicate; - ONE_CRYPTO_HMAC_SHA384_UPDATE HmacSha384Update; - ONE_CRYPTO_HMAC_SHA384_FINAL HmacSha384Final; - ONE_CRYPTO_HMAC_SHA384_ALL HmacSha384All; + ONE_CRYPTO_HMAC_SHA256_NEW HmacSha256New; + ONE_CRYPTO_HMAC_SHA256_FREE HmacSha256Free; + ONE_CRYPTO_HMAC_SHA256_SET_KEY HmacSha256SetKey; + ONE_CRYPTO_HMAC_SHA256_DUPLICATE HmacSha256Duplicate; + ONE_CRYPTO_HMAC_SHA256_UPDATE HmacSha256Update; + ONE_CRYPTO_HMAC_SHA256_FINAL HmacSha256Final; + ONE_CRYPTO_HMAC_SHA256_ALL HmacSha256All; + ONE_CRYPTO_HMAC_SHA384_NEW HmacSha384New; + ONE_CRYPTO_HMAC_SHA384_FREE HmacSha384Free; + ONE_CRYPTO_HMAC_SHA384_SET_KEY HmacSha384SetKey; + ONE_CRYPTO_HMAC_SHA384_DUPLICATE HmacSha384Duplicate; + ONE_CRYPTO_HMAC_SHA384_UPDATE HmacSha384Update; + ONE_CRYPTO_HMAC_SHA384_FINAL HmacSha384Final; + ONE_CRYPTO_HMAC_SHA384_ALL HmacSha384All; /// v1.0 Hash -------------------------------------------------------------- - ONE_CRYPTO_MD5_GET_CONTEXT_SIZE Md5GetContextSize; - ONE_CRYPTO_MD5_INIT Md5Init; - ONE_CRYPTO_MD5_UPDATE Md5Update; - ONE_CRYPTO_MD5_FINAL Md5Final; - ONE_CRYPTO_MD5_HASH_ALL Md5HashAll; - ONE_CRYPTO_MD5_DUPLICATE Md5Duplicate; - ONE_CRYPTO_SHA1_GET_CONTEXT_SIZE Sha1GetContextSize; - ONE_CRYPTO_SHA1_INIT Sha1Init; - ONE_CRYPTO_SHA1_UPDATE Sha1Update; - ONE_CRYPTO_SHA1_FINAL Sha1Final; - ONE_CRYPTO_SHA1_HASH_ALL Sha1HashAll; - ONE_CRYPTO_SHA1_DUPLICATE Sha1Duplicate; - ONE_CRYPTO_SHA256_GET_CONTEXT_SIZE Sha256GetContextSize; - ONE_CRYPTO_SHA256_INIT Sha256Init; - ONE_CRYPTO_SHA256_UPDATE Sha256Update; - ONE_CRYPTO_SHA256_FINAL Sha256Final; - ONE_CRYPTO_SHA256_HASH_ALL Sha256HashAll; - ONE_CRYPTO_SHA256_DUPLICATE Sha256Duplicate; - ONE_CRYPTO_SHA384_GET_CONTEXT_SIZE Sha384GetContextSize; - ONE_CRYPTO_SHA384_INIT Sha384Init; - ONE_CRYPTO_SHA384_DUPLICATE Sha384Duplicate; - ONE_CRYPTO_SHA384_UPDATE Sha384Update; - ONE_CRYPTO_SHA384_FINAL Sha384Final; - ONE_CRYPTO_SHA384_HASH_ALL Sha384HashAll; - ONE_CRYPTO_SHA512_GET_CONTEXT_SIZE Sha512GetContextSize; - ONE_CRYPTO_SHA512_INIT Sha512Init; - ONE_CRYPTO_SHA512_DUPLICATE Sha512Duplicate; - ONE_CRYPTO_SHA512_UPDATE Sha512Update; - ONE_CRYPTO_SHA512_FINAL Sha512Final; - ONE_CRYPTO_SHA512_HASH_ALL Sha512HashAll; - ONE_CRYPTO_SM3_GET_CONTEXT_SIZE Sm3GetContextSize; - ONE_CRYPTO_SM3_INIT Sm3Init; - ONE_CRYPTO_SM3_DUPLICATE Sm3Duplicate; - ONE_CRYPTO_SM3_UPDATE Sm3Update; - ONE_CRYPTO_SM3_FINAL Sm3Final; - ONE_CRYPTO_SM3_HASH_ALL Sm3HashAll; + ONE_CRYPTO_MD5_GET_CONTEXT_SIZE Md5GetContextSize; + ONE_CRYPTO_MD5_INIT Md5Init; + ONE_CRYPTO_MD5_UPDATE Md5Update; + ONE_CRYPTO_MD5_FINAL Md5Final; + ONE_CRYPTO_MD5_HASH_ALL Md5HashAll; + ONE_CRYPTO_MD5_DUPLICATE Md5Duplicate; + ONE_CRYPTO_SHA1_GET_CONTEXT_SIZE Sha1GetContextSize; + ONE_CRYPTO_SHA1_INIT Sha1Init; + ONE_CRYPTO_SHA1_UPDATE Sha1Update; + ONE_CRYPTO_SHA1_FINAL Sha1Final; + ONE_CRYPTO_SHA1_HASH_ALL Sha1HashAll; + ONE_CRYPTO_SHA1_DUPLICATE Sha1Duplicate; + ONE_CRYPTO_SHA256_GET_CONTEXT_SIZE Sha256GetContextSize; + ONE_CRYPTO_SHA256_INIT Sha256Init; + ONE_CRYPTO_SHA256_UPDATE Sha256Update; + ONE_CRYPTO_SHA256_FINAL Sha256Final; + ONE_CRYPTO_SHA256_HASH_ALL Sha256HashAll; + ONE_CRYPTO_SHA256_DUPLICATE Sha256Duplicate; + ONE_CRYPTO_SHA384_GET_CONTEXT_SIZE Sha384GetContextSize; + ONE_CRYPTO_SHA384_INIT Sha384Init; + ONE_CRYPTO_SHA384_DUPLICATE Sha384Duplicate; + ONE_CRYPTO_SHA384_UPDATE Sha384Update; + ONE_CRYPTO_SHA384_FINAL Sha384Final; + ONE_CRYPTO_SHA384_HASH_ALL Sha384HashAll; + ONE_CRYPTO_SHA512_GET_CONTEXT_SIZE Sha512GetContextSize; + ONE_CRYPTO_SHA512_INIT Sha512Init; + ONE_CRYPTO_SHA512_DUPLICATE Sha512Duplicate; + ONE_CRYPTO_SHA512_UPDATE Sha512Update; + ONE_CRYPTO_SHA512_FINAL Sha512Final; + ONE_CRYPTO_SHA512_HASH_ALL Sha512HashAll; + ONE_CRYPTO_SM3_GET_CONTEXT_SIZE Sm3GetContextSize; + ONE_CRYPTO_SM3_INIT Sm3Init; + ONE_CRYPTO_SM3_DUPLICATE Sm3Duplicate; + ONE_CRYPTO_SM3_UPDATE Sm3Update; + ONE_CRYPTO_SM3_FINAL Sm3Final; + ONE_CRYPTO_SM3_HASH_ALL Sm3HashAll; /// v1.0 AES --------------------------------------------------------------- - ONE_CRYPTO_AES_GET_CONTEXT_SIZE AesGetContextSize; - ONE_CRYPTO_AES_INIT AesInit; - ONE_CRYPTO_AES_CBC_ENCRYPT AesCbcEncrypt; - ONE_CRYPTO_AES_CBC_DECRYPT AesCbcDecrypt; - ONE_CRYPTO_AEAD_AES_GCM_ENCRYPT AeadAesGcmEncrypt; - ONE_CRYPTO_AEAD_AES_GCM_DECRYPT AeadAesGcmDecrypt; + ONE_CRYPTO_AES_GET_CONTEXT_SIZE AesGetContextSize; + ONE_CRYPTO_AES_INIT AesInit; + ONE_CRYPTO_AES_CBC_ENCRYPT AesCbcEncrypt; + ONE_CRYPTO_AES_CBC_DECRYPT AesCbcDecrypt; + ONE_CRYPTO_AEAD_AES_GCM_ENCRYPT AeadAesGcmEncrypt; + ONE_CRYPTO_AEAD_AES_GCM_DECRYPT AeadAesGcmDecrypt; /// v1.0 BN ---------------------------------------------------------------- - ONE_CRYPTO_BIG_NUM_INIT BigNumInit; - ONE_CRYPTO_BIG_NUM_FROM_BIN BigNumFromBin; - ONE_CRYPTO_BIG_NUM_TO_BIN BigNumToBin; - ONE_CRYPTO_BIG_NUM_FREE BigNumFree; - ONE_CRYPTO_BIG_NUM_ADD BigNumAdd; - ONE_CRYPTO_BIG_NUM_SUB BigNumSub; - ONE_CRYPTO_BIG_NUM_MOD BigNumMod; - ONE_CRYPTO_BIG_NUM_EXP_MOD BigNumExpMod; - ONE_CRYPTO_BIG_NUM_INVERSE_MOD BigNumInverseMod; - ONE_CRYPTO_BIG_NUM_DIV BigNumDiv; - ONE_CRYPTO_BIG_NUM_MUL_MOD BigNumMulMod; - ONE_CRYPTO_BIG_NUM_CMP BigNumCmp; - ONE_CRYPTO_BIG_NUM_BITS BigNumBits; - ONE_CRYPTO_BIG_NUM_BYTES BigNumBytes; - ONE_CRYPTO_BIG_NUM_IS_WORD BigNumIsWord; - ONE_CRYPTO_BIG_NUM_IS_ODD BigNumIsOdd; - ONE_CRYPTO_BIG_NUM_COPY BigNumCopy; - ONE_CRYPTO_BIG_NUM_VALUE_ONE BigNumValueOne; - ONE_CRYPTO_BIG_NUM_R_SHIFT BigNumRShift; - ONE_CRYPTO_BIG_NUM_CONST_TIME BigNumConstTime; - ONE_CRYPTO_BIG_NUM_SQR_MOD BigNumSqrMod; - ONE_CRYPTO_BIG_NUM_NEW_CONTEXT BigNumNewContext; - ONE_CRYPTO_BIG_NUM_CONTEXT_FREE BigNumContextFree; - ONE_CRYPTO_BIG_NUM_SET_UINT BigNumSetUint; - ONE_CRYPTO_BIG_NUM_ADD_MOD BigNumAddMod; + ONE_CRYPTO_BIG_NUM_INIT BigNumInit; + ONE_CRYPTO_BIG_NUM_FROM_BIN BigNumFromBin; + ONE_CRYPTO_BIG_NUM_TO_BIN BigNumToBin; + ONE_CRYPTO_BIG_NUM_FREE BigNumFree; + ONE_CRYPTO_BIG_NUM_ADD BigNumAdd; + ONE_CRYPTO_BIG_NUM_SUB BigNumSub; + ONE_CRYPTO_BIG_NUM_MOD BigNumMod; + ONE_CRYPTO_BIG_NUM_EXP_MOD BigNumExpMod; + ONE_CRYPTO_BIG_NUM_INVERSE_MOD BigNumInverseMod; + ONE_CRYPTO_BIG_NUM_DIV BigNumDiv; + ONE_CRYPTO_BIG_NUM_MUL_MOD BigNumMulMod; + ONE_CRYPTO_BIG_NUM_CMP BigNumCmp; + ONE_CRYPTO_BIG_NUM_BITS BigNumBits; + ONE_CRYPTO_BIG_NUM_BYTES BigNumBytes; + ONE_CRYPTO_BIG_NUM_IS_WORD BigNumIsWord; + ONE_CRYPTO_BIG_NUM_IS_ODD BigNumIsOdd; + ONE_CRYPTO_BIG_NUM_COPY BigNumCopy; + ONE_CRYPTO_BIG_NUM_VALUE_ONE BigNumValueOne; + ONE_CRYPTO_BIG_NUM_R_SHIFT BigNumRShift; + ONE_CRYPTO_BIG_NUM_CONST_TIME BigNumConstTime; + ONE_CRYPTO_BIG_NUM_SQR_MOD BigNumSqrMod; + ONE_CRYPTO_BIG_NUM_NEW_CONTEXT BigNumNewContext; + ONE_CRYPTO_BIG_NUM_CONTEXT_FREE BigNumContextFree; + ONE_CRYPTO_BIG_NUM_SET_UINT BigNumSetUint; + ONE_CRYPTO_BIG_NUM_ADD_MOD BigNumAddMod; /// v1.0 HKDF -------------------------------------------------------------- - ONE_CRYPTO_HKDF_SHA256_EXTRACT_AND_EXPAND HkdfSha256ExtractAndExpand; - ONE_CRYPTO_HKDF_SHA256_EXTRACT HkdfSha256Extract; - ONE_CRYPTO_HKDF_SHA256_EXPAND HkdfSha256Expand; - ONE_CRYPTO_HKDF_SHA384_EXTRACT_AND_EXPAND HkdfSha384ExtractAndExpand; - ONE_CRYPTO_HKDF_SHA384_EXTRACT HkdfSha384Extract; - ONE_CRYPTO_HKDF_SHA384_EXPAND HkdfSha384Expand; + ONE_CRYPTO_HKDF_SHA256_EXTRACT_AND_EXPAND HkdfSha256ExtractAndExpand; + ONE_CRYPTO_HKDF_SHA256_EXTRACT HkdfSha256Extract; + ONE_CRYPTO_HKDF_SHA256_EXPAND HkdfSha256Expand; + ONE_CRYPTO_HKDF_SHA384_EXTRACT_AND_EXPAND HkdfSha384ExtractAndExpand; + ONE_CRYPTO_HKDF_SHA384_EXTRACT HkdfSha384Extract; + ONE_CRYPTO_HKDF_SHA384_EXPAND HkdfSha384Expand; /// v1.0 PKCS -------------------------------------------------------------- - ONE_CRYPTO_AUTHENTICODE_VERIFY AuthenticodeVerify; - ONE_CRYPTO_PKCS1V2_ENCRYPT Pkcs1v2Encrypt; - ONE_CRYPTO_PKCS1V2_DECRYPT Pkcs1v2Decrypt; - ONE_CRYPTO_RSA_OAEP_ENCRYPT RsaOaepEncrypt; - ONE_CRYPTO_RSA_OAEP_DECRYPT RsaOaepDecrypt; - ONE_CRYPTO_PKCS5_HASH_PASSWORD Pkcs5HashPassword; - ONE_CRYPTO_PKCS7_GET_SIGNERS Pkcs7GetSigners; - ONE_CRYPTO_PKCS7_FREE_SIGNERS Pkcs7FreeSigners; - ONE_CRYPTO_PKCS7_GET_CERTIFICATES_LIST Pkcs7GetCertificatesList; - ONE_CRYPTO_PKCS7_SIGN Pkcs7Sign; - ONE_CRYPTO_PKCS7_VERIFY Pkcs7Verify; - ONE_CRYPTO_PKCS7_ENCRYPT Pkcs7Encrypt; - ONE_CRYPTO_VERIFY_EK_US_IN_PKCS7_SIGNATURE VerifyEKUsInPkcs7Signature; - ONE_CRYPTO_PKCS7_GET_ATTACHED_CONTENT Pkcs7GetAttachedContent; + ONE_CRYPTO_AUTHENTICODE_VERIFY AuthenticodeVerify; + ONE_CRYPTO_PKCS1V2_ENCRYPT Pkcs1v2Encrypt; + ONE_CRYPTO_PKCS1V2_DECRYPT Pkcs1v2Decrypt; + ONE_CRYPTO_RSA_OAEP_ENCRYPT RsaOaepEncrypt; + ONE_CRYPTO_RSA_OAEP_DECRYPT RsaOaepDecrypt; + ONE_CRYPTO_PKCS5_HASH_PASSWORD Pkcs5HashPassword; + ONE_CRYPTO_PKCS7_GET_SIGNERS Pkcs7GetSigners; + ONE_CRYPTO_PKCS7_FREE_SIGNERS Pkcs7FreeSigners; + ONE_CRYPTO_PKCS7_GET_CERTIFICATES_LIST Pkcs7GetCertificatesList; + ONE_CRYPTO_PKCS7_SIGN Pkcs7Sign; + ONE_CRYPTO_PKCS7_VERIFY Pkcs7Verify; + ONE_CRYPTO_PKCS7_ENCRYPT Pkcs7Encrypt; + ONE_CRYPTO_VERIFY_EK_US_IN_PKCS7_SIGNATURE VerifyEKUsInPkcs7Signature; + ONE_CRYPTO_PKCS7_GET_ATTACHED_CONTENT Pkcs7GetAttachedContent; /// v1.0 DH ---------------------------------------------------------------- - ONE_CRYPTO_DH_NEW DhNew; - ONE_CRYPTO_DH_FREE DhFree; - ONE_CRYPTO_DH_GENERATE_PARAMETER DhGenerateParameter; - ONE_CRYPTO_DH_SET_PARAMETER DhSetParameter; - ONE_CRYPTO_DH_GENERATE_KEY DhGenerateKey; - ONE_CRYPTO_DH_COMPUTE_KEY DhComputeKey; + ONE_CRYPTO_DH_NEW DhNew; + ONE_CRYPTO_DH_FREE DhFree; + ONE_CRYPTO_DH_GENERATE_PARAMETER DhGenerateParameter; + ONE_CRYPTO_DH_SET_PARAMETER DhSetParameter; + ONE_CRYPTO_DH_GENERATE_KEY DhGenerateKey; + ONE_CRYPTO_DH_COMPUTE_KEY DhComputeKey; /// v1.0 EC ---------------------------------------------------------------- - ONE_CRYPTO_EC_GROUP_INIT EcGroupInit; - ONE_CRYPTO_EC_GROUP_GET_CURVE EcGroupGetCurve; - ONE_CRYPTO_EC_GROUP_GET_ORDER EcGroupGetOrder; - ONE_CRYPTO_EC_GROUP_FREE EcGroupFree; - ONE_CRYPTO_EC_POINT_INIT EcPointInit; - ONE_CRYPTO_EC_POINT_DE_INIT EcPointDeInit; - ONE_CRYPTO_EC_POINT_GET_AFFINE_COORDINATES EcPointGetAffineCoordinates; - ONE_CRYPTO_EC_POINT_SET_AFFINE_COORDINATES EcPointSetAffineCoordinates; - ONE_CRYPTO_EC_POINT_ADD EcPointAdd; - ONE_CRYPTO_EC_POINT_MUL EcPointMul; - ONE_CRYPTO_EC_POINT_INVERT EcPointInvert; - ONE_CRYPTO_EC_POINT_IS_ON_CURVE EcPointIsOnCurve; - ONE_CRYPTO_EC_POINT_IS_AT_INFINITY EcPointIsAtInfinity; - ONE_CRYPTO_EC_POINT_EQUAL EcPointEqual; - ONE_CRYPTO_EC_POINT_SET_COMPRESSED_COORDINATES EcPointSetCompressedCoordinates; - ONE_CRYPTO_EC_NEW_BY_NID EcNewByNid; - ONE_CRYPTO_EC_FREE EcFree; - ONE_CRYPTO_EC_GENERATE_KEY EcGenerateKey; - ONE_CRYPTO_EC_GET_PUB_KEY EcGetPubKey; - ONE_CRYPTO_EC_DH_COMPUTE_KEY EcDhComputeKey; - ONE_CRYPTO_EC_GET_PRIVATE_KEY_FROM_PEM EcGetPrivateKeyFromPem; - ONE_CRYPTO_EC_GET_PUBLIC_KEY_FROM_X509 EcGetPublicKeyFromX509; - ONE_CRYPTO_EC_DSA_SIGN EcDsaSign; - ONE_CRYPTO_EC_DSA_VERIFY EcDsaVerify; + ONE_CRYPTO_EC_GROUP_INIT EcGroupInit; + ONE_CRYPTO_EC_GROUP_GET_CURVE EcGroupGetCurve; + ONE_CRYPTO_EC_GROUP_GET_ORDER EcGroupGetOrder; + ONE_CRYPTO_EC_GROUP_FREE EcGroupFree; + ONE_CRYPTO_EC_POINT_INIT EcPointInit; + ONE_CRYPTO_EC_POINT_DE_INIT EcPointDeInit; + ONE_CRYPTO_EC_POINT_GET_AFFINE_COORDINATES EcPointGetAffineCoordinates; + ONE_CRYPTO_EC_POINT_SET_AFFINE_COORDINATES EcPointSetAffineCoordinates; + ONE_CRYPTO_EC_POINT_ADD EcPointAdd; + ONE_CRYPTO_EC_POINT_MUL EcPointMul; + ONE_CRYPTO_EC_POINT_INVERT EcPointInvert; + ONE_CRYPTO_EC_POINT_IS_ON_CURVE EcPointIsOnCurve; + ONE_CRYPTO_EC_POINT_IS_AT_INFINITY EcPointIsAtInfinity; + ONE_CRYPTO_EC_POINT_EQUAL EcPointEqual; + ONE_CRYPTO_EC_POINT_SET_COMPRESSED_COORDINATES EcPointSetCompressedCoordinates; + ONE_CRYPTO_EC_NEW_BY_NID EcNewByNid; + ONE_CRYPTO_EC_FREE EcFree; + ONE_CRYPTO_EC_GENERATE_KEY EcGenerateKey; + ONE_CRYPTO_EC_GET_PUB_KEY EcGetPubKey; + ONE_CRYPTO_EC_DH_COMPUTE_KEY EcDhComputeKey; + ONE_CRYPTO_EC_GET_PRIVATE_KEY_FROM_PEM EcGetPrivateKeyFromPem; + ONE_CRYPTO_EC_GET_PUBLIC_KEY_FROM_X509 EcGetPublicKeyFromX509; + ONE_CRYPTO_EC_DSA_SIGN EcDsaSign; + ONE_CRYPTO_EC_DSA_VERIFY EcDsaVerify; /// v1.0 RSA --------------------------------------------------------------- - ONE_CRYPTO_RSA_NEW RsaNew; - ONE_CRYPTO_RSA_FREE RsaFree; - ONE_CRYPTO_RSA_SET_KEY RsaSetKey; - ONE_CRYPTO_RSA_GET_KEY RsaGetKey; - ONE_CRYPTO_RSA_GENERATE_KEY RsaGenerateKey; - ONE_CRYPTO_RSA_CHECK_KEY RsaCheckKey; - ONE_CRYPTO_RSA_PKCS1_SIGN RsaPkcs1Sign; - ONE_CRYPTO_RSA_PKCS1_VERIFY RsaPkcs1Verify; - ONE_CRYPTO_RSA_PSS_SIGN RsaPssSign; - ONE_CRYPTO_RSA_PSS_VERIFY RsaPssVerify; - ONE_CRYPTO_RSA_GET_PRIVATE_KEY_FROM_PEM RsaGetPrivateKeyFromPem; - ONE_CRYPTO_RSA_GET_PUBLIC_KEY_FROM_X509 RsaGetPublicKeyFromX509; + ONE_CRYPTO_RSA_NEW RsaNew; + ONE_CRYPTO_RSA_FREE RsaFree; + ONE_CRYPTO_RSA_SET_KEY RsaSetKey; + ONE_CRYPTO_RSA_GET_KEY RsaGetKey; + ONE_CRYPTO_RSA_GENERATE_KEY RsaGenerateKey; + ONE_CRYPTO_RSA_CHECK_KEY RsaCheckKey; + ONE_CRYPTO_RSA_PKCS1_SIGN RsaPkcs1Sign; + ONE_CRYPTO_RSA_PKCS1_VERIFY RsaPkcs1Verify; + ONE_CRYPTO_RSA_PSS_SIGN RsaPssSign; + ONE_CRYPTO_RSA_PSS_VERIFY RsaPssVerify; + ONE_CRYPTO_RSA_GET_PRIVATE_KEY_FROM_PEM RsaGetPrivateKeyFromPem; + ONE_CRYPTO_RSA_GET_PUBLIC_KEY_FROM_X509 RsaGetPublicKeyFromX509; /// v1.0 X509 -------------------------------------------------------------- - ONE_CRYPTO_X509_GET_SUBJECT_NAME X509GetSubjectName; - ONE_CRYPTO_X509_GET_COMMON_NAME X509GetCommonName; - ONE_CRYPTO_X509_GET_ORGANIZATION_NAME X509GetOrganizationName; - ONE_CRYPTO_X509_VERIFY_CERT X509VerifyCert; - ONE_CRYPTO_X509_CONSTRUCT_CERTIFICATE X509ConstructCertificate; - ONE_CRYPTO_X509_CONSTRUCT_CERTIFICATE_STACK_V X509ConstructCertificateStackV; - ONE_CRYPTO_X509_CONSTRUCT_CERTIFICATE_STACK X509ConstructCertificateStack; - ONE_CRYPTO_X509_FREE X509Free; - ONE_CRYPTO_X509_STACK_FREE X509StackFree; - ONE_CRYPTO_X509_GET_TBS_CERT X509GetTBSCert; - ONE_CRYPTO_X509_GET_VERSION X509GetVersion; - ONE_CRYPTO_X509_GET_SERIAL_NUMBER X509GetSerialNumber; - ONE_CRYPTO_X509_GET_ISSUER_NAME X509GetIssuerName; - ONE_CRYPTO_X509_GET_SIGNATURE_ALGORITHM X509GetSignatureAlgorithm; - ONE_CRYPTO_X509_GET_EXTENDED_KEY_USAGE X509GetExtendedKeyUsage; - ONE_CRYPTO_X509_GET_EXTENSION_DATA X509GetExtensionData; - ONE_CRYPTO_X509_GET_VALIDITY X509GetValidity; - ONE_CRYPTO_X509_FORMAT_DATE_TIME X509FormatDateTime; - ONE_CRYPTO_X509_GET_KEY_USAGE X509GetKeyUsage; - ONE_CRYPTO_X509_VERIFY_CERT_CHAIN X509VerifyCertChain; - ONE_CRYPTO_X509_GET_CERT_FROM_CERT_CHAIN X509GetCertFromCertChain; - ONE_CRYPTO_X509_GET_EXTENDED_BASIC_CONSTRAINTS X509GetExtendedBasicConstraints; - ONE_CRYPTO_ASN1_GET_TAG Asn1GetTag; - ONE_CRYPTO_X509_COMPARE_DATE_TIME X509CompareDateTime; + ONE_CRYPTO_X509_GET_SUBJECT_NAME X509GetSubjectName; + ONE_CRYPTO_X509_GET_COMMON_NAME X509GetCommonName; + ONE_CRYPTO_X509_GET_ORGANIZATION_NAME X509GetOrganizationName; + ONE_CRYPTO_X509_VERIFY_CERT X509VerifyCert; + ONE_CRYPTO_X509_CONSTRUCT_CERTIFICATE X509ConstructCertificate; + ONE_CRYPTO_X509_CONSTRUCT_CERTIFICATE_STACK_V X509ConstructCertificateStackV; + ONE_CRYPTO_X509_CONSTRUCT_CERTIFICATE_STACK X509ConstructCertificateStack; + ONE_CRYPTO_X509_FREE X509Free; + ONE_CRYPTO_X509_STACK_FREE X509StackFree; + ONE_CRYPTO_X509_GET_TBS_CERT X509GetTBSCert; + ONE_CRYPTO_X509_GET_VERSION X509GetVersion; + ONE_CRYPTO_X509_GET_SERIAL_NUMBER X509GetSerialNumber; + ONE_CRYPTO_X509_GET_ISSUER_NAME X509GetIssuerName; + ONE_CRYPTO_X509_GET_SIGNATURE_ALGORITHM X509GetSignatureAlgorithm; + ONE_CRYPTO_X509_GET_EXTENDED_KEY_USAGE X509GetExtendedKeyUsage; + ONE_CRYPTO_X509_GET_EXTENSION_DATA X509GetExtensionData; + ONE_CRYPTO_X509_GET_VALIDITY X509GetValidity; + ONE_CRYPTO_X509_FORMAT_DATE_TIME X509FormatDateTime; + ONE_CRYPTO_X509_GET_KEY_USAGE X509GetKeyUsage; + ONE_CRYPTO_X509_VERIFY_CERT_CHAIN X509VerifyCertChain; + ONE_CRYPTO_X509_GET_CERT_FROM_CERT_CHAIN X509GetCertFromCertChain; + ONE_CRYPTO_X509_GET_EXTENDED_BASIC_CONSTRAINTS X509GetExtendedBasicConstraints; + ONE_CRYPTO_ASN1_GET_TAG Asn1GetTag; + ONE_CRYPTO_X509_COMPARE_DATE_TIME X509CompareDateTime; /// v1.0 Random ------------------------------------------------------------ - ONE_CRYPTO_RANDOM_SEED RandomSeed; - ONE_CRYPTO_RANDOM_BYTES RandomBytes; + ONE_CRYPTO_RANDOM_SEED RandomSeed; + ONE_CRYPTO_RANDOM_BYTES RandomBytes; /// v1.0 Tls --------------------------------------------------------------- - ONE_CRYPTO_TLS_INITIALIZE TlsInitialize; - ONE_CRYPTO_TLS_CTX_FREE TlsCtxFree; - ONE_CRYPTO_TLS_CTX_NEW TlsCtxNew; - ONE_CRYPTO_TLS_FREE TlsFree; - ONE_CRYPTO_TLS_NEW TlsNew; - ONE_CRYPTO_TLS_IN_HANDSHAKE TlsInHandshake; - ONE_CRYPTO_TLS_DO_HANDSHAKE TlsDoHandshake; - ONE_CRYPTO_TLS_HANDLE_ALERT TlsHandleAlert; - ONE_CRYPTO_TLS_CLOSE_NOTIFY TlsCloseNotify; - ONE_CRYPTO_TLS_CTRL_TRAFFIC_OUT TlsCtrlTrafficOut; - ONE_CRYPTO_TLS_CTRL_TRAFFIC_IN TlsCtrlTrafficIn; - ONE_CRYPTO_TLS_READ TlsRead; - ONE_CRYPTO_TLS_WRITE TlsWrite; - ONE_CRYPTO_TLS_SHUTDOWN TlsShutdown; - ONE_CRYPTO_TLS_SET_VERSION TlsSetVersion; - ONE_CRYPTO_TLS_SET_CONNECTION_END TlsSetConnectionEnd; - ONE_CRYPTO_TLS_SET_CIPHER_LIST TlsSetCipherList; - ONE_CRYPTO_TLS_SET_COMPRESSION_METHOD TlsSetCompressionMethod; - ONE_CRYPTO_TLS_SET_VERIFY TlsSetVerify; - ONE_CRYPTO_TLS_SET_VERIFY_HOST TlsSetVerifyHost; - ONE_CRYPTO_TLS_SET_SESSION_ID TlsSetSessionId; - ONE_CRYPTO_TLS_SET_CA_CERTIFICATE TlsSetCaCertificate; - ONE_CRYPTO_TLS_SET_HOST_PUBLIC_CERT TlsSetHostPublicCert; - ONE_CRYPTO_TLS_SET_HOST_PRIVATE_KEY_EX TlsSetHostPrivateKeyEx; - ONE_CRYPTO_TLS_SET_HOST_PRIVATE_KEY TlsSetHostPrivateKey; - ONE_CRYPTO_TLS_SET_CERT_REVOCATION_LIST TlsSetCertRevocationList; - ONE_CRYPTO_TLS_SET_SIGNATURE_ALGO_LIST TlsSetSignatureAlgoList; - ONE_CRYPTO_TLS_SET_EC_CURVE TlsSetEcCurve; - ONE_CRYPTO_TLS_GET_VERSION TlsGetVersion; - ONE_CRYPTO_TLS_GET_CONNECTION_END TlsGetConnectionEnd; - ONE_CRYPTO_TLS_GET_CURRENT_CIPHER TlsGetCurrentCipher; - ONE_CRYPTO_TLS_GET_CURRENT_COMPRESSION_ID TlsGetCurrentCompressionId; - ONE_CRYPTO_TLS_GET_VERIFY TlsGetVerify; - ONE_CRYPTO_TLS_GET_SESSION_ID TlsGetSessionId; - ONE_CRYPTO_TLS_GET_CLIENT_RANDOM TlsGetClientRandom; - ONE_CRYPTO_TLS_GET_SERVER_RANDOM TlsGetServerRandom; - ONE_CRYPTO_TLS_GET_KEY_MATERIAL TlsGetKeyMaterial; - ONE_CRYPTO_TLS_GET_CA_CERTIFICATE TlsGetCaCertificate; - ONE_CRYPTO_TLS_GET_HOST_PUBLIC_CERT TlsGetHostPublicCert; - ONE_CRYPTO_TLS_GET_HOST_PRIVATE_KEY TlsGetHostPrivateKey; - ONE_CRYPTO_TLS_GET_CERT_REVOCATION_LIST TlsGetCertRevocationList; - ONE_CRYPTO_TLS_GET_EXPORT_KEY TlsGetExportKey; + ONE_CRYPTO_TLS_INITIALIZE TlsInitialize; + ONE_CRYPTO_TLS_CTX_FREE TlsCtxFree; + ONE_CRYPTO_TLS_CTX_NEW TlsCtxNew; + ONE_CRYPTO_TLS_FREE TlsFree; + ONE_CRYPTO_TLS_NEW TlsNew; + ONE_CRYPTO_TLS_IN_HANDSHAKE TlsInHandshake; + ONE_CRYPTO_TLS_DO_HANDSHAKE TlsDoHandshake; + ONE_CRYPTO_TLS_HANDLE_ALERT TlsHandleAlert; + ONE_CRYPTO_TLS_CLOSE_NOTIFY TlsCloseNotify; + ONE_CRYPTO_TLS_CTRL_TRAFFIC_OUT TlsCtrlTrafficOut; + ONE_CRYPTO_TLS_CTRL_TRAFFIC_IN TlsCtrlTrafficIn; + ONE_CRYPTO_TLS_READ TlsRead; + ONE_CRYPTO_TLS_WRITE TlsWrite; + ONE_CRYPTO_TLS_SHUTDOWN TlsShutdown; + ONE_CRYPTO_TLS_SET_VERSION TlsSetVersion; + ONE_CRYPTO_TLS_SET_CONNECTION_END TlsSetConnectionEnd; + ONE_CRYPTO_TLS_SET_CIPHER_LIST TlsSetCipherList; + ONE_CRYPTO_TLS_SET_COMPRESSION_METHOD TlsSetCompressionMethod; + ONE_CRYPTO_TLS_SET_VERIFY TlsSetVerify; + ONE_CRYPTO_TLS_SET_VERIFY_HOST TlsSetVerifyHost; + ONE_CRYPTO_TLS_SET_SESSION_ID TlsSetSessionId; + ONE_CRYPTO_TLS_SET_CA_CERTIFICATE TlsSetCaCertificate; + ONE_CRYPTO_TLS_SET_HOST_PUBLIC_CERT TlsSetHostPublicCert; + ONE_CRYPTO_TLS_SET_HOST_PRIVATE_KEY_EX TlsSetHostPrivateKeyEx; + ONE_CRYPTO_TLS_SET_HOST_PRIVATE_KEY TlsSetHostPrivateKey; + ONE_CRYPTO_TLS_SET_CERT_REVOCATION_LIST TlsSetCertRevocationList; + ONE_CRYPTO_TLS_SET_SIGNATURE_ALGO_LIST TlsSetSignatureAlgoList; + ONE_CRYPTO_TLS_SET_EC_CURVE TlsSetEcCurve; + ONE_CRYPTO_TLS_GET_VERSION TlsGetVersion; + ONE_CRYPTO_TLS_GET_CONNECTION_END TlsGetConnectionEnd; + ONE_CRYPTO_TLS_GET_CURRENT_CIPHER TlsGetCurrentCipher; + ONE_CRYPTO_TLS_GET_CURRENT_COMPRESSION_ID TlsGetCurrentCompressionId; + ONE_CRYPTO_TLS_GET_VERIFY TlsGetVerify; + ONE_CRYPTO_TLS_GET_SESSION_ID TlsGetSessionId; + ONE_CRYPTO_TLS_GET_CLIENT_RANDOM TlsGetClientRandom; + ONE_CRYPTO_TLS_GET_SERVER_RANDOM TlsGetServerRandom; + ONE_CRYPTO_TLS_GET_KEY_MATERIAL TlsGetKeyMaterial; + ONE_CRYPTO_TLS_GET_CA_CERTIFICATE TlsGetCaCertificate; + ONE_CRYPTO_TLS_GET_HOST_PUBLIC_CERT TlsGetHostPublicCert; + ONE_CRYPTO_TLS_GET_HOST_PRIVATE_KEY TlsGetHostPrivateKey; + ONE_CRYPTO_TLS_GET_CERT_REVOCATION_LIST TlsGetCertRevocationList; + ONE_CRYPTO_TLS_GET_EXPORT_KEY TlsGetExportKey; /// v1.0 Timestamp --------------------------------------------------------- - ONE_CRYPTO_IMAGE_TIMESTAMP_VERIFY ImageTimestampVerify; + ONE_CRYPTO_IMAGE_TIMESTAMP_VERIFY ImageTimestampVerify; /// v1.0 Info -------------------------------------------------------------- - ONE_CRYPTO_GET_CRYPTO_PROVIDER_VERSION_STRING GetCryptoProviderVersionString; + ONE_CRYPTO_GET_CRYPTO_PROVIDER_VERSION_STRING GetCryptoProviderVersionString; + ONE_CRYPTO_GET_TRUST_ANCHOR_X509_FROM_AUTH_DATA GetTrustAnchorX509FromAuthData; + ONE_CRYPTO_FREE_TRUST_ANCHOR_X509_CACHE FreeTrustAnchorX509Cache; + ONE_CRYPTO_X509_GET_TBS_CERT_HASH X509GetTbsCertHash; } ONE_CRYPTO_PROTOCOL; /** @} */ diff --git a/CryptoPkg/Library/BaseCryptLibNull/Pk/CryptAuthenticodeNull.c b/CryptoPkg/Library/BaseCryptLibNull/Pk/CryptAuthenticodeNull.c index 62e8400c4cc..d0197ddb924 100644 --- a/CryptoPkg/Library/BaseCryptLibNull/Pk/CryptAuthenticodeNull.c +++ b/CryptoPkg/Library/BaseCryptLibNull/Pk/CryptAuthenticodeNull.c @@ -43,3 +43,146 @@ AuthenticodeVerify ( ASSERT (FALSE); return FALSE; } + +/** + Compute the PE/COFF Authenticode-style image hash of an image as described + in "Windows Authenticode Portable Executable Signature Format". + + The caller selects the digest algorithm by HashType (e.g. + gEfiCertSha256Guid, gEfiCertSha384Guid). + + If the Data buffer is too small to hold the contents of the digest, + the error EFI_BUFFER_TOO_SMALL is returned and DigestSize is set to + the required buffer size to obtain the data. + + @param[in] FileBuffer Pointer to the in-memory PE/COFF image. + @param[in] FileSize Size of FileBuffer in bytes. + @param[in] HashType Signature-type GUID identifying the hash + algorithm to use. + @param[out] Digest Caller-provided buffer that receives the + computed digest. Must be at least + SHA512_DIGEST_SIZE bytes. + @param[out] DigestSize On success, receives the digest length in + bytes. + + @retval EFI_SUCCESS Digest was computed successfully. + @retval EFI_INVALID_PARAMETER A required pointer is NULL. + @retval EFI_BUFFER_TOO_SMALL DigestSize is too small for the + requested hash algorithm. + @retval EFI_UNSUPPORTED HashType is not a recognized image + hash algorithm, or this interface is + not supported by the underlying + library instance. +**/ +EFI_STATUS +EFIAPI +GetAuthenticodeHash ( + IN VOID *FileBuffer, + IN UINTN FileSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ) +{ + ASSERT (FALSE); + return EFI_UNSUPPORTED; +} + +/** + Determine the image-hash algorithm declared by a PE/COFF Authenticode + signature. + + The signature's PKCS#7 SignedData header carries the digest algorithm + used to hash the image. This function parses that header and returns + the matching signature-type GUID (for example gEfiCertSha256Guid). + The returned GUID can be passed directly to GetAuthenticodeHash to + compute the corresponding image hash. + + @param[in] AuthData Pointer to the Authenticode signature retrieved + from a signed PE/COFF image. + @param[in] AuthDataSize Size of AuthData in bytes. + @param[out] HashType On success, receives the signature-type GUID + identifying the digest algorithm declared by + the signature. + + @retval EFI_SUCCESS HashType has been populated. + @retval EFI_INVALID_PARAMETER AuthData or HashType is NULL, or + AuthDataSize is zero. + @retval EFI_BAD_BUFFER_SIZE AuthData is too small or not encoded in a + supported ASN.1 form. + @retval EFI_UNSUPPORTED The signature's digest algorithm is not a + recognized image hash algorithm, or this + interface is not supported by the + underlying library instance. +**/ +EFI_STATUS +EFIAPI +GetAuthenticodeHashAlgorithm ( + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + OUT EFI_GUID *HashType + ) +{ + ASSERT (FALSE); + return EFI_UNSUPPORTED; +} + +/** + Compute the digest of the TBSCertificate of an X.509 certificate. + + Return EFI_UNSUPPORTED to indicate this interface is not supported. + + @retval EFI_UNSUPPORTED This interface is not supported. + +**/ +EFI_STATUS +EFIAPI +X509GetTbsCertHash ( + IN VOID *Cert, + IN UINTN CertSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ) +{ + ASSERT (FALSE); + return EFI_UNSUPPORTED; +} + +/** + Locate, in a PKCS#7 SignedData blob, the X.509 certificate whose + TBSCertificate digest matches a caller-supplied hash. + + Return EFI_UNSUPPORTED to indicate this interface is not supported. + + @retval EFI_UNSUPPORTED This interface is not supported. + +**/ +EFI_STATUS +EFIAPI +GetTrustAnchorX509FromAuthData ( + IN OUT VOID **CacheHandle OPTIONAL, + IN CONST UINT8 *TbsCertHash, + IN UINTN TbsCertHashSize, + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + OUT UINT8 **TrustAnchorX509, + OUT UINTN *TrustAnchorX509Size + ) +{ + ASSERT (FALSE); + return EFI_UNSUPPORTED; +} + +/** + Release a trust-anchor cache. No-op for the Null instance. + +**/ +VOID +EFIAPI +FreeTrustAnchorX509Cache ( + IN VOID *CacheHandle OPTIONAL + ) +{ + ASSERT (FALSE); +} diff --git a/CryptoPkg/Library/BaseCryptLibNull/Pk/CryptX509Null.c b/CryptoPkg/Library/BaseCryptLibNull/Pk/CryptX509Null.c index 128fcf1241c..8e34df705f3 100644 --- a/CryptoPkg/Library/BaseCryptLibNull/Pk/CryptX509Null.c +++ b/CryptoPkg/Library/BaseCryptLibNull/Pk/CryptX509Null.c @@ -749,3 +749,34 @@ X509GetExtendedBasicConstraints ( ASSERT (FALSE); return FALSE; } + +/** + Compute the digest of a DER-encoded X.509 certificate using the + hash algorithm identified by HashType. + + Return EFI_UNSUPPORTED to indicate this interface is not supported. + + @param[in] Cert Pointer to the DER-encoded X.509 certificate. + @param[in] CertSize Size of Cert in bytes. + @param[in] HashType Signature-type GUID identifying the hash + algorithm to use. + @param[out] Digest Caller-provided buffer that receives the + computed digest. + @param[out] DigestSize On success, receives the digest length in + bytes. + + @retval EFI_UNSUPPORTED This interface is not supported. +**/ +EFI_STATUS +EFIAPI +GetX509Hash ( + IN VOID *Cert, + IN UINTN CertSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ) +{ + ASSERT (FALSE); + return EFI_UNSUPPORTED; +} diff --git a/CryptoPkg/Library/BaseCryptLibOnOneCrypto/OneCryptoLib.c b/CryptoPkg/Library/BaseCryptLibOnOneCrypto/OneCryptoLib.c index 28c5fec9860..99d47d22b6f 100644 --- a/CryptoPkg/Library/BaseCryptLibOnOneCrypto/OneCryptoLib.c +++ b/CryptoPkg/Library/BaseCryptLibOnOneCrypto/OneCryptoLib.c @@ -2499,6 +2499,98 @@ AuthenticodeVerify ( CALL_CRYPTO_SERVICE (AuthenticodeVerify, (AuthData, DataSize, TrustedCert, CertSize, ImageHash, HashSize), FALSE, 1, 0); } +/** + Compute the digest of the TBSCertificate of an X.509 certificate. + + @param[in] Cert Pointer to the DER-encoded X.509 certificate. + @param[in] CertSize Size of Cert in bytes. + @param[in] HashType Signature-type GUID identifying the hash + algorithm to use. + @param[out] Digest Caller-provided buffer that receives the + computed TBSCertificate digest. + @param[out] DigestSize On success, receives the digest length in + bytes. + + @retval EFI_SUCCESS Digest was computed successfully. + @retval EFI_INVALID_PARAMETER Bad parameter or malformed certificate. + @retval EFI_UNSUPPORTED Unrecognized hash algorithm, or + interface not supported. + + @since 1.1 + @ingroup PKCS +**/ +EFI_STATUS +EFIAPI +X509GetTbsCertHash ( + IN VOID *Cert, + IN UINTN CertSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ) +{ + CALL_CRYPTO_SERVICE (X509GetTbsCertHash, (Cert, CertSize, HashType, Digest, DigestSize), EFI_UNSUPPORTED, 1, 1); +} + +/** + Locate, in a PKCS#7 SignedData blob, the X.509 certificate whose + TBSCertificate digest matches a caller-supplied hash. + + @param[in,out] CacheHandle Optional cache handle pointer. + @param[in] TbsCertHash Pointer to the target TBSCertificate + digest bytes. + @param[in] TbsCertHashSize Length of TbsCertHash in bytes + (selects the algorithm). + @param[in] AuthData Pointer to the PKCS#7 SignedData + blob. + @param[in] AuthDataSize Size of AuthData in bytes. + @param[out] TrustAnchorX509 Receives a newly allocated buffer + holding the matching X.509 cert in + DER form. + @param[out] TrustAnchorX509Size Receives the certificate length. + + @retval EFI_SUCCESS Match found. + @retval EFI_NOT_FOUND No certificate matched. + @retval EFI_INVALID_PARAMETER Bad parameter or malformed AuthData. + @retval EFI_OUT_OF_RESOURCES Memory allocation failed. + @retval EFI_UNSUPPORTED Interface not supported. + + @since 1.1 + @ingroup PKCS +**/ +EFI_STATUS +EFIAPI +GetTrustAnchorX509FromAuthData ( + IN OUT VOID **CacheHandle OPTIONAL, + IN CONST UINT8 *TbsCertHash, + IN UINTN TbsCertHashSize, + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + OUT UINT8 **TrustAnchorX509, + OUT UINTN *TrustAnchorX509Size + ) +{ + CALL_CRYPTO_SERVICE (GetTrustAnchorX509FromAuthData, (CacheHandle, TbsCertHash, TbsCertHashSize, AuthData, AuthDataSize, TrustAnchorX509, TrustAnchorX509Size), EFI_UNSUPPORTED, 1, 1); +} + +/** + Release a trust-anchor cache previously allocated by + GetTrustAnchorX509FromAuthData(). + + @param[in] CacheHandle Cache handle, or NULL. + + @since 1.1 + @ingroup PKCS +**/ +VOID +EFIAPI +FreeTrustAnchorX509Cache ( + IN VOID *CacheHandle OPTIONAL + ) +{ + CALL_VOID_CRYPTO_SERVICE (FreeTrustAnchorX509Cache, (CacheHandle), 1, 1); +} + /** Encrypts a blob using PKCS1v2 (RSAES-OAEP) schema. On success, will return the encrypted message in a newly allocated buffer. diff --git a/CryptoPkg/Test/Mock/Include/GoogleTest/Library/MockBaseCryptLib.h b/CryptoPkg/Test/Mock/Include/GoogleTest/Library/MockBaseCryptLib.h index d8a47d458f0..bc399ec6e4b 100644 --- a/CryptoPkg/Test/Mock/Include/GoogleTest/Library/MockBaseCryptLib.h +++ b/CryptoPkg/Test/Mock/Include/GoogleTest/Library/MockBaseCryptLib.h @@ -869,9 +869,7 @@ struct MockBaseCryptLib { IN CONST UINT8 *KeyPassword, IN UINT8 *InData, IN UINTN InDataSize, - // MU_CHANGE [TCBZ3925] - Pkcs7Sign is broken IN CONST UINT8 *SignCert, - // MU_CHANGE [TCBZ3925] - Pkcs7Sign is broken IN UINTN SignCertSize, IN UINT8 *OtherCerts OPTIONAL, OUT UINT8 **SignedData, @@ -942,6 +940,74 @@ struct MockBaseCryptLib { ) ); + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + GetAuthenticodeHash, + ( + IN VOID *FileBuffer, + IN UINTN FileSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + GetAuthenticodeHashAlgorithm, + ( + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + OUT EFI_GUID *HashType + ) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + X509GetTbsCertHash, + ( + IN VOID *Cert, + IN UINTN CertSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + GetTrustAnchorX509FromAuthData, + ( + IN OUT VOID **CacheHandle OPTIONAL, + IN CONST UINT8 *TbsCertHash, + IN UINTN TbsCertHashSize, + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + OUT UINT8 **TrustAnchorX509, + OUT UINTN *TrustAnchorX509Size + ) + ); + + MOCK_FUNCTION_DECLARATION ( + VOID, + FreeTrustAnchorX509Cache, + ( + IN VOID *CacheHandle OPTIONAL + ) + ); + + MOCK_FUNCTION_DECLARATION ( + EFI_STATUS, + GetX509Hash, + ( + IN VOID *Cert, + IN UINTN CertSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *Digest, + OUT UINTN *DigestSize + ) + ); + MOCK_FUNCTION_DECLARATION ( BOOLEAN, ImageTimestampVerify, diff --git a/CryptoPkg/Test/Mock/Library/GoogleTest/MockBaseCryptLib/MockBaseCryptLib.cpp b/CryptoPkg/Test/Mock/Library/GoogleTest/MockBaseCryptLib/MockBaseCryptLib.cpp index f5144911963..0e97467795f 100644 --- a/CryptoPkg/Test/Mock/Library/GoogleTest/MockBaseCryptLib/MockBaseCryptLib.cpp +++ b/CryptoPkg/Test/Mock/Library/GoogleTest/MockBaseCryptLib/MockBaseCryptLib.cpp @@ -92,14 +92,18 @@ MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, RsaOaepDecrypt, 6, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, Pkcs7GetSigners, 6, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, Pkcs7FreeSigners, 1, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, Pkcs7GetCertificatesList, 6, EFIAPI); -// MU_CHANGE [TCBZ3925] - Pkcs7Sign is broken MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, Pkcs7Sign, 10, EFIAPI); -// MU_CHANGE [TCBZ3925] - Pkcs7Sign is broken MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, Pkcs7Verify, 6, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, Pkcs7Encrypt, 7, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, VerifyEKUsInPkcs7Signature, 5, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, Pkcs7GetAttachedContent, 4, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, AuthenticodeVerify, 6, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, GetAuthenticodeHash, 5, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, GetAuthenticodeHashAlgorithm, 3, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, X509GetTbsCertHash, 5, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, GetTrustAnchorX509FromAuthData, 7, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, FreeTrustAnchorX509Cache, 1, EFIAPI); +MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, GetX509Hash, 5, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, ImageTimestampVerify, 5, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, X509GetVersion, 3, EFIAPI); MOCK_FUNCTION_DEFINITION (MockBaseCryptLib, X509GetSerialNumber, 4, EFIAPI); diff --git a/MdePkg/Include/Library/PeCoffLib.h b/MdePkg/Include/Library/PeCoffLib.h index 7be587f2fca..bbe82e46647 100644 --- a/MdePkg/Include/Library/PeCoffLib.h +++ b/MdePkg/Include/Library/PeCoffLib.h @@ -204,6 +204,16 @@ typedef struct { /// Private storage for implementation specific data. /// UINT64 Context; + /// + /// Set by PeCoffLoaderGetImageInfo() to a copy of the image's + /// EFI_IMAGE_DIRECTORY_ENTRY_SECURITY data directory entry. The entry is + /// populated only after PeCoffLoaderGetImageInfo() has validated that the + /// security data directory is non-empty and lies within the image bounds. + /// If the image declares no security directory, this field is zeroed. This + /// field is always written by PeCoffLoaderGetImageInfo(), so callers do not + /// need to zero-initialize the image context to consume it. + /// + EFI_IMAGE_DATA_DIRECTORY SecurityDataDirectory; } PE_COFF_LOADER_IMAGE_CONTEXT; /** diff --git a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c index 6dae14352f8..99ee6e2a71d 100644 --- a/MdePkg/Library/BasePeCoffLib/BasePeCoff.c +++ b/MdePkg/Library/BasePeCoffLib/BasePeCoff.c @@ -75,6 +75,15 @@ PeCoffLoaderGetPeHeader ( UINTN NumberOfSections; EFI_IMAGE_SECTION_HEADER SectionHeader; + // + // Zero the security data directory. It is populated below only if the image + // declares a non-empty EFI_IMAGE_DIRECTORY_ENTRY_SECURITY entry that passes + // bounds checking. Callers are not required to zero-initialize the image + // context, so this field must always be explicitly initialized here. + // + ImageContext->SecurityDataDirectory.VirtualAddress = 0; + ImageContext->SecurityDataDirectory.Size = 0; + // // Read the DOS image header to check for its existence // @@ -303,6 +312,13 @@ PeCoffLoaderGetPeHeader ( return Status; } + + // + // The security data directory has been validated to lie within the + // image bounds. Record a copy of it in the image context so callers + // can locate the certificate data without re-parsing the headers. + // + ImageContext->SecurityDataDirectory = Hdr.Pe32->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY]; } } @@ -425,6 +441,13 @@ PeCoffLoaderGetPeHeader ( return Status; } + + // + // The security data directory has been validated to lie within the + // image bounds. Record a copy of it in the image context so callers + // can locate the certificate data without re-parsing the headers. + // + ImageContext->SecurityDataDirectory = Hdr.Pe32Plus->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY]; } } diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/Database.c b/SecurityPkg/Library/DxeImageVerificationLib2/Database.c new file mode 100644 index 00000000000..6ead8556e93 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/Database.c @@ -0,0 +1,956 @@ +/** @file + Secureboot DB/DBX/DBT (EFI_SIGNATURE_LIST) helpers, including signed-image + (certificate / Authenticode) validation, for the DXE Image Verification Library. + + Caution: This file consumes external input (the PE/COFF image and the + Secure Boot signature databases). All inputs must be treated as + attacker-controlled. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "Database.h" + +/** + Load a Secure Boot Signature Database into a pool-allocated buffer. + + The returned buffer is allocated using AllocatePool(). The caller is responsible for freeing + this buffer with FreePool(). + + @param[in] DatabaseName Variable name (e.g. EFI_IMAGE_SECURITY_DATABASE, + EFI_IMAGE_SECURITY_DATABASE1). + @param[out] Buffer Pool-allocated copy of the variable contents, + or NULL if the variable does not exist. + Caller is responsible for freeing this buffer with + FreePool when non-NULL. + @param[out] BufferSize BufferSize of *Buffer in bytes, or 0 if the + variable does not exist. + + @retval EFI_SUCCESS The variable was loaded successfully, or it was absent. + @retval EFI_INVALID_PARAMETER A required pointer is NULL. + @retval Other Status from gRT->GetVariable. +**/ +EFI_STATUS +LoadSignatureDatabase ( + IN CONST CHAR16 *DatabaseName, + OUT VOID **Buffer, + OUT UINTN *BufferSize + ) +{ + EFI_STATUS Status; + + if ((DatabaseName == NULL) || (Buffer == NULL) || (BufferSize == NULL)) { + return EFI_INVALID_PARAMETER; + } + + *Buffer = NULL; + *BufferSize = 0; + + Status = GetVariable2 (DatabaseName, &gEfiImageSecurityDatabaseGuid, Buffer, BufferSize); + if (Status == EFI_NOT_FOUND) { + return EFI_SUCCESS; + } + + return Status; +} + +/** + Load the platform's db and dbx signature databases. + + The Db / Dbx buffers in the returned structure are allocated using AllocatePool(). The caller is + responsible for freeing them with FreePool(). + + @param[out] Databases On success, receives pool-allocated copies of the `db` and `dbx` + variable contents. Either Db or Dbx may be NULL (with a 0 size) if the + corresponding variable is absent. + + @retval EFI_SUCCESS Databases loaded. Db / Dbx may still be NULL if the + corresponding variable was absent. + @retval EFI_INVALID_PARAMETER Databases is NULL. + @retval Other Failure status from gRT->GetVariable. +**/ +EFI_STATUS +LoadSignatureDatabases ( + OUT SIGNATURE_DATABASES *Databases + ) +{ + EFI_STATUS Status; + + if (Databases == NULL) { + return EFI_INVALID_PARAMETER; + } + + Databases->Db = NULL; + Databases->DbSize = 0; + Databases->Dbx = NULL; + Databases->DbxSize = 0; + + Status = LoadSignatureDatabase (EFI_IMAGE_SECURITY_DATABASE, &Databases->Db, &Databases->DbSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "DxeImageVerificationLib: failed to load db - %r\n", Status)); + goto Error; + } + + Status = LoadSignatureDatabase (EFI_IMAGE_SECURITY_DATABASE1, &Databases->Dbx, &Databases->DbxSize); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "DxeImageVerificationLib: failed to load dbx - %r\n", Status)); + goto Error; + } + + return EFI_SUCCESS; + +Error: + if (Databases->Db != NULL) { + FreePool (Databases->Db); + Databases->Db = NULL; + Databases->DbSize = 0; + } + + if (Databases->Dbx != NULL) { + FreePool (Databases->Dbx); + Databases->Dbx = NULL; + Databases->DbxSize = 0; + } + + return Status; +} + +/** + Search the database for a digest authority that matches the image. + + A match is defined as a hash in the database that matches the hash of the image being searched. + The hash algorithm used is determined by the SignatureType of each EFI_SIGNATURE_LIST in the + database. + + @param[in] Database The raw database contents. + @param[in] DatabaseSize The size of the Database in bytes. + @param[in, out] Cache DIGEST_CACHE pointer bound to the image being searched. The cache + may be updated during the search. + @param[out] Authority Only valid on EFI_SUCCESS; reflects if a matching entry was found. + NULL if no match; otherwise, it contains the matching entry. + + @retval EFI_SUCCESS Search completed; Authority reflects if a matching entry was found. + @retval EFI_INVALID_PARAMETER A required pointer is NULL, or Cache is not bound to an image. + @retval EFI_VOLUME_CORRUPTED Database is structurally malformed. + @retval other Propagated from GetHash. +**/ +EFI_STATUS +GetImageDigestAuthority ( + IN CONST VOID *Database, + IN UINTN DatabaseSize, + IN OUT DIGEST_CACHE *Cache, + OUT IMAGE_AUTHORITY *Authority + ) +{ + EFI_STATUS Status; + SIG_DATABASE_ITER DbIter; + SIG_LIST_ITER ListIter; + CONST EFI_SIGNATURE_LIST *List; + CONST EFI_SIGNATURE_DATA *Entry; + CONST UINT8 *Digest; + UINTN DigestSize; + + if ((Cache == NULL) || (Authority == NULL) || + (Cache->Buffer == NULL) || (Cache->BufferSize == 0) || + (Cache->Type != DigestCacheTypeImage)) + { + return EFI_INVALID_PARAMETER; + } + + Authority->Data = NULL; + Authority->Size = 0; + ZeroMem (&Authority->SignatureType, sizeof (EFI_GUID)); + + if ((DatabaseSize == 0) || (Database == NULL)) { + return EFI_SUCCESS; + } + + Status = DatabaseIterInit (&DbIter, Database, DatabaseSize); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Iterate over each EFI_SIGNATURE_LIST in the database. + // + while ((List = DatabaseIterNext (&DbIter)) != NULL) { + Status = GetHash ( + &List->SignatureType, + Cache, + &Digest, + &DigestSize + ); + + // + // Unsupported hash type; skip this list. + // + if (Status == EFI_UNSUPPORTED) { + continue; + } + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "DxeImageVerificationLib: failed to get image hash - %r\n", Status)); + return Status; + } + + if (EFI_ERROR (SigListIterInit (&ListIter, List))) { + continue; + } + + // + // Iterate over each Entry in the current EFI_SIGNATURE_LIST. + // + while ((Entry = SigListIterNext (&ListIter)) != NULL) { + if (CompareMem (Entry->SignatureData, Digest, DigestSize) == 0) { + Authority->Data = Entry; + Authority->Size = List->SignatureSize; + CopyGuid (&Authority->SignatureType, &List->SignatureType); + return EFI_SUCCESS; + } + } + } + + return EFI_SUCCESS; +} + +/** + Determine whether a TBS Certificate hash is present in the `dbx`. + + Iterates over the EFI_SIGNATURE_LISTs in the `dbx` database and checks if any of them contain + the hash of the TBS Certificate. Any failure to iterate will assume the certificate is in the DBX. + + @param[in] Cert DER-encoded X.509 certificate. + @param[in] CertSize BufferSize of Cert in bytes. + @param[in] Dbx Raw dbx contents, or NULL. + @param[in] DbxSize BufferSize of Dbx in bytes; 0 when Dbx is NULL. + + @retval TRUE The certificate hash was located in dbx, or an error + prevented a definitive answer. + @retval FALSE The certificate hash is not present in dbx. +**/ +BOOLEAN +IsTBSCertHashInDbx ( + IN CONST UINT8 *Cert, + IN UINTN CertSize, + IN CONST VOID *Dbx, + IN UINTN DbxSize + ) +{ + EFI_STATUS Status; + UINTN DigestSize; + DIGEST_CACHE HashCache; + SIG_DATABASE_ITER Iter; + SIG_LIST_ITER ListIter; + CONST EFI_SIGNATURE_LIST *List; + CONST EFI_SIGNATURE_DATA *Entry; + CONST UINT8 *CertDigest; + + // + // There is no DBX, so it's definitely not in the DBX. + // + if ((Dbx == NULL) || (DbxSize == 0)) { + return FALSE; + } + + if (EFI_ERROR (DatabaseIterInit (&Iter, Dbx, DbxSize))) { + DEBUG ((DEBUG_WARN, "DxeImageVerificationLib: dbx is malformed; treating cert as revoked.\n")); + return TRUE; + } + + ZeroMem (&HashCache, sizeof (HashCache)); + HashCache.Type = DigestCacheTypeX509; + HashCache.Buffer = Cert; + HashCache.BufferSize = CertSize; + + while ((List = DatabaseIterNext (&Iter)) != NULL) { + Status = GetHash (&List->SignatureType, &HashCache, &CertDigest, &DigestSize); + + // + // This EFI_SIGNATURE_LIST in the DBX is not applicable to X509 certicicates. + // + if (Status == EFI_UNSUPPORTED) { + continue; + } + + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "DxeImageVerificationLib: failed to compute X509 hash (%r).\n", Status)); + return TRUE; + } + + if (List->SignatureSize < sizeof (EFI_GUID) + DigestSize) { + DEBUG ((DEBUG_WARN, "DxeImageVerificationLib: malformed dbx signature list size.\n")); + return TRUE; + } + + if (EFI_ERROR (SigListIterInit (&ListIter, List))) { + DEBUG ((DEBUG_WARN, "DxeImageVerificationLib: malformed dbx signature list.\n")); + return TRUE; + } + + while ((Entry = SigListIterNext (&ListIter)) != NULL) { + if (CompareMem (Entry->SignatureData, CertDigest, DigestSize) == 0) { + return TRUE; + } + } + } + + return FALSE; +} + +/** + Extract the DER-encoded PKCS#7 SignedData payload from a single WIN_CERTIFICATE entry. + + @param[in] Cert The certificate to inspect. + @param[out] AuthData On success, set to point at the PKCS#7 payload inside Cert. + @param[out] AuthDataSize On success, set to the PKCS#7 payload length in bytes. + + @retval EFI_SUCCESS AuthData/AuthDataSize were populated. + @retval EFI_INVALID_PARAMETER A required pointer is NULL. + @retval EFI_UNSUPPORTED Unsupported WIN_CERTIFICATE type. + @retval EFI_VOLUME_CORRUPTED dwLength is too small to contain the required header for the + declared type. +**/ +EFI_STATUS +GetWinCertificatePkcs7AuthData ( + IN CONST WIN_CERTIFICATE *Cert, + OUT CONST UINT8 **AuthData, + OUT UINTN *AuthDataSize + ) +{ + CONST WIN_CERTIFICATE_UEFI_GUID *UefiGuidCert; + + if ((Cert == NULL) || (AuthData == NULL) || (AuthDataSize == NULL)) { + return EFI_INVALID_PARAMETER; + } + + switch (Cert->wCertificateType) { + case WIN_CERT_TYPE_PKCS_SIGNED_DATA: + // + // The certificate is a bare DER-encoded PKCS#7 SignedData prefixed + // by the WIN_CERTIFICATE header. + // + if (Cert->dwLength <= sizeof (WIN_CERTIFICATE)) { + return EFI_VOLUME_CORRUPTED; + } + + *AuthData = (CONST UINT8 *)Cert + sizeof (WIN_CERTIFICATE); + *AuthDataSize = Cert->dwLength - sizeof (WIN_CERTIFICATE); + return EFI_SUCCESS; + + case WIN_CERT_TYPE_EFI_GUID: + // + // The certificate is a WIN_CERTIFICATE_UEFI_GUID; the embedded + // payload format is identified by CertType. Only the PKCS#7 + // SignedData GUID is supported. + // + if (Cert->dwLength <= OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData)) { + return EFI_VOLUME_CORRUPTED; + } + + UefiGuidCert = (CONST WIN_CERTIFICATE_UEFI_GUID *)Cert; + if (!CompareGuid (&UefiGuidCert->CertType, &gEfiCertPkcs7Guid)) { + return EFI_UNSUPPORTED; + } + + *AuthData = UefiGuidCert->CertData; + *AuthDataSize = Cert->dwLength - OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData); + return EFI_SUCCESS; + + default: + return EFI_UNSUPPORTED; + } +} + +/** + Determine whether a PKCS#7 signature is authorized by an `EFI_CERT_X509_GUID` + `EFI_SIGNATURE_LIST`. + + Iterates over the X.509 trust anchors carried in `List`, asks `AuthenticodeVerify` whether any + one of them verifies the signature, and rejects an otherwise verifying anchor whose TBS hash is + enrolled in `dbx`. + + The caller is responsible for confirming `List->SignatureType == gEfiCertX509Guid` before + invocation. + + @param[in] List Candidate list of X.509 certificates (an EFI_SIGNATURE_LIST). + @param[in] AuthData DER-encoded PKCS#7 SignedData. + @param[in] AuthDataSize BufferSize of AuthData in bytes. + @param[in] ImageHash Authenticode digest of the image. + @param[in] ImageHashSize BufferSize of ImageHash in bytes. + @param[in] Dbx Raw dbx contents, or NULL. + @param[in] DbxSize BufferSize of Dbx in bytes; 0 when Dbx is NULL. + @param[out] Authority On a match, Authority->Data is the verifying EFI_SIGNATURE_DATA entry + and Authority->Size is List->SignatureSize. + + @retval TRUE At least one entry verifies AuthData and is not revoked. + @retval FALSE No entry verifies AuthData (or all that do are revoked). +**/ +STATIC +BOOLEAN +IsPkcs7AuthDataAuthorizedByX509List ( + IN CONST EFI_SIGNATURE_LIST *List, + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + IN CONST UINT8 *ImageHash, + IN UINTN ImageHashSize, + IN CONST VOID *Dbx, + IN UINTN DbxSize, + OUT IMAGE_AUTHORITY *Authority + ) +{ + SIG_LIST_ITER Iter; + CONST EFI_SIGNATURE_DATA *Entry; + CONST UINT8 *TrustedCert; + UINTN TrustedCertSize; + UINT8 *TBSCert; + UINTN TBSCertSize; + + // + // If the signature size is less than or equal to an EFI_GUID there + // is no cert payload to inspect. + // + if (List->SignatureSize <= sizeof (EFI_GUID)) { + return FALSE; + } + + if (EFI_ERROR (SigListIterInit (&Iter, List))) { + return FALSE; + } + + TrustedCertSize = List->SignatureSize - sizeof (EFI_GUID); + + while ((Entry = SigListIterNext (&Iter)) != NULL) { + TrustedCert = Entry->SignatureData; + + if (!AuthenticodeVerify ( + AuthData, + AuthDataSize, + TrustedCert, + TrustedCertSize, + ImageHash, + ImageHashSize + )) + { + continue; + } + + if (!X509GetTBSCert (TrustedCert, TrustedCertSize, &TBSCert, &TBSCertSize)) { + DEBUG ((DEBUG_WARN, "DxeImageVerificationLib: X509GetTBSCert failed; treating cert as revoked.\n")); + return FALSE; + } + + // + // The Authenticode signature is a valid trust anchor; make sure its not revoked + // + if (IsTBSCertHashInDbx (TrustedCert, TrustedCertSize, Dbx, DbxSize)) { + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: signing cert hash present in dbx; rejected.\n")); + continue; + } + + Authority->Data = Entry; + Authority->Size = List->SignatureSize; + + return TRUE; + } + + return FALSE; +} + +/** + Determine whether a PKCS#7 signature is authorized by an `EFI_CERT_X509__GUID` + `EFI_SIGNATURE_LIST`. + + Each entry in `List` is a precomputed TBS-cert hash. For each entry, attempt to locate a signer + in `AuthData` whose TBS hash (under the algorithm identified by `List->SignatureType`) matches + the entry, then confirm the matched TBS hash is not enrolled in `dbx`. + + The caller is responsible for confirming `List->SignatureType` is one of the + `EFI_CERT_X509_SHA{256,384,512}_GUID` values (see `IsX509CertHashGuid`) before invocation. + + @param[in] List Candidate list of TBS-cert hashes (an EFI_SIGNATURE_LIST). + @param[in] AuthData DER-encoded PKCS#7 SignedData. + @param[in] AuthDataSize BufferSize of AuthData in bytes. + @param[in] ImageHash Authenticode digest of the image. + @param[in] ImageHashSize BufferSize of ImageHash in bytes. + @param[in] Dbx Raw dbx contents, or NULL. + @param[in] DbxSize BufferSize of Dbx in bytes; 0 when Dbx is NULL. + @param[out] Authority On a match, Authority->Data is the matching EFI_SIGNATURE_DATA entry + and Authority->Size is List->SignatureSize. + @param[in,out] TrustAnchorCacheHandle Caller-owned cache handle pointer passed through to + GetTrustAnchorX509FromAuthData for reuse across list entries. + + @retval TRUE At least one entry matches a non-revoked signer TBS hash. + @retval FALSE No entry matches, all matches are revoked, or the list could not be parsed. +**/ +STATIC +BOOLEAN +IsPkcs7AuthDataAuthorizedByX509HashList ( + IN CONST EFI_SIGNATURE_LIST *List, + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + IN CONST UINT8 *ImageHash, + IN UINTN ImageHashSize, + IN CONST VOID *Dbx, + IN UINTN DbxSize, + OUT IMAGE_AUTHORITY *Authority, + IN OUT VOID **TrustAnchorCacheHandle + ) +{ + EFI_STATUS Status; + SIG_LIST_ITER Iter; + CONST EFI_SIGNATURE_DATA *Entry; + UINTN TbsCertHashSize; + UINT8 *TrustAnchorX509; + UINTN TrustAnchorX509Size; + BOOLEAN Authorized; + + (VOID)ImageHash; + (VOID)ImageHashSize; + + if ((List == NULL) || (AuthData == NULL) || (AuthDataSize == 0) || + (Authority == NULL) || (TrustAnchorCacheHandle == NULL)) + { + return FALSE; + } + + if (!IsX509CertHashGuid (&List->SignatureType)) { + return FALSE; + } + + if (List->SignatureSize <= sizeof (EFI_GUID)) { + return FALSE; + } + + if (EFI_ERROR (SigListIterInit (&Iter, List))) { + return FALSE; + } + + TbsCertHashSize = List->SignatureSize - sizeof (EFI_GUID); + TrustAnchorX509 = NULL; + Authorized = FALSE; + + while ((Entry = SigListIterNext (&Iter)) != NULL) { + TrustAnchorX509Size = 0; + + Status = GetTrustAnchorX509FromAuthData ( + TrustAnchorCacheHandle, + Entry->SignatureData, + TbsCertHashSize, + AuthData, + AuthDataSize, + &TrustAnchorX509, + &TrustAnchorX509Size + ); + + if (Status == EFI_NOT_FOUND) { + continue; + } + + if (EFI_ERROR (Status)) { + goto Done; + } + + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Trust Anchor found, checking TBS cert hash in dbx.\n")); + if (IsTBSCertHashInDbx (TrustAnchorX509, TrustAnchorX509Size, Dbx, DbxSize)) { + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Trust Anchor TBS cert hash found in dbx, skipping.\n")); + FreePool (TrustAnchorX509); + TrustAnchorX509 = NULL; + continue; + } + + Authority->Data = Entry; + Authority->Size = List->SignatureSize; + Authorized = TRUE; + goto Done; + } + +Done: + if (TrustAnchorX509 != NULL) { + FreePool (TrustAnchorX509); + } + + return Authorized; +} + +/** + Determine whether the auth data (PKCS#7 SignedData) is revoked by the `dbx`. + + Runs two checks against the auth data (PKCS#7 SignedData): + 1. If a X.509 trust anchor enrolled in the `dbx` authenticates the signature, the certificate is + revoked. + 2. if a signer in the signing chain (as reported by `Pkcs7GetSigners`) has a TBS hash that is + enrolled in the `dbx`, the certificate is revoked. + + @param[in] AuthData DER-encoded PKCS#7 SignedData payload. + @param[in] AuthDataSize Size of AuthData in bytes; must be non-zero. + @param[in] ImageHash Authenticode digest of the image under the algorithm + AuthData uses. + @param[in] ImageHashSize Size of ImageHash in bytes; must be non-zero. + @param[in] Dbx Raw `dbx` contents, or NULL. + @param[in] DbxSize Size of Dbx in bytes; 0 when Dbx is NULL. + + @retval TRUE The signature is revoked by `dbx`, or a missing/empty `AuthData` + or `ImageHash` prevented a safe determination (fail closed). + @retval FALSE The signature is not revoked by `dbx`, including when `dbx` is + absent or empty. +**/ +BOOLEAN +IsCertRevoked ( + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + IN CONST UINT8 *ImageHash, + IN UINTN ImageHashSize, + IN CONST VOID *Dbx, + IN UINTN DbxSize + ) +{ + SIG_DATABASE_ITER DbIter; + CONST EFI_SIGNATURE_LIST *List; + SIG_LIST_ITER ListIter; + CONST EFI_SIGNATURE_DATA *Entry; + UINTN TrustedCertSize; + UINT8 *CertStack; + UINTN CertStackSize; + UINT8 *TrustedCert; + UINTN TrustedCertOutSize; + UINT8 CertNumber; + CONST UINT8 *Walker; + CONST UINT8 *StackEnd; + UINTN Index; + UINT32 CertLen; + UINT8 *TBSCert; + UINTN TBSCertSize; + BOOLEAN Revoked; + + if ((AuthData == NULL) || (AuthDataSize == 0) || + (ImageHash == NULL) || (ImageHashSize == 0)) + { + return TRUE; + } + + if ((Dbx == NULL) || (DbxSize == 0)) { + return FALSE; + } + + // + // Step 1: walk dbx and try AuthenticodeVerify against each X.509 trust anchor. Failure to walk + // the `dbx` is fail-closed since we cannot make a safe determination. + // + if (EFI_ERROR (DatabaseIterInit (&DbIter, Dbx, DbxSize))) { + DEBUG ((DEBUG_WARN, "DxeImageVerificationLib: `dbx` malformed.\n")); + return TRUE; + } + + while ((List = DatabaseIterNext (&DbIter)) != NULL) { + if (!CompareGuid (&List->SignatureType, &gEfiCertX509Guid)) { + continue; + } + + if (List->SignatureSize <= sizeof (EFI_GUID)) { + continue; + } + + if (EFI_ERROR (SigListIterInit (&ListIter, List))) { + continue; + } + + TrustedCertSize = List->SignatureSize - sizeof (EFI_GUID); + + while ((Entry = SigListIterNext (&ListIter)) != NULL) { + if (AuthenticodeVerify ( + AuthData, + AuthDataSize, + Entry->SignatureData, + TrustedCertSize, + ImageHash, + ImageHashSize + )) + { + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: image verifies against `dbx` X.509 entry.\n")); + return TRUE; + } + } + } + + // + // Step 2: walk the PKCS#7 signer chain. If any signer's TBS hash is in the `dbx`, the certificate + // is revoked. + // + CertStack = NULL; + CertStackSize = 0; + TrustedCert = NULL; + TrustedCertOutSize = 0; + + if (!Pkcs7GetSigners ( + AuthData, + AuthDataSize, + &CertStack, + &CertStackSize, + &TrustedCert, + &TrustedCertOutSize + )) + { + return FALSE; + } + + Revoked = FALSE; + + if ((CertStack != NULL) && (CertStackSize > 0)) { + StackEnd = CertStack + CertStackSize; + CertNumber = *CertStack; + Walker = CertStack + 1; + + // + // Fail-closed for malformed signer stacks. + // + for (Index = 0; Index < CertNumber; Index++) { + if ((UINTN)(StackEnd - Walker) < sizeof (UINT32)) { + DEBUG ((DEBUG_WARN, "DxeImageVerificationLib: IsCertRevoked: malformed signer stack length prefix.\n")); + Revoked = TRUE; + break; + } + + CertLen = ReadUnaligned32 ((CONST UINT32 *)Walker); + Walker += sizeof (UINT32); + + if ((CertLen == 0) || ((UINTN)(StackEnd - Walker) < CertLen)) { + DEBUG ((DEBUG_WARN, "DxeImageVerificationLib: IsCertRevoked: malformed signer cert payload.\n")); + Revoked = TRUE; + break; + } + + if (!X509GetTBSCert (Walker, CertLen, &TBSCert, &TBSCertSize)) { + DEBUG ((DEBUG_WARN, "DxeImageVerificationLib: IsCertRevoked: Failed to get TBS certificate.\n")); + Revoked = TRUE; + break; + } + + if (IsTBSCertHashInDbx (Walker, CertLen, Dbx, DbxSize)) { + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: IsCertRevoked: signer TBS hash present in dbx.\n")); + Revoked = TRUE; + break; + } + + Walker += CertLen; + } + } + + if (CertStack != NULL) { + Pkcs7FreeSigners (CertStack); + } + + if (TrustedCert != NULL) { + Pkcs7FreeSigners (TrustedCert); + } + + return Revoked; +} + +/** + Determine whether the auth data (PKCS#7 SignedData) is allowed by the `db`. + + Iterates over the the EFI_SIGNATURE_LISTs in the `db` and validates the auth data one of two ways + depending on the associated GUID of the list: + + 1. `EFI_CERT_X509_GUID`: Checks each X.509 trust anchor in the list to see if it verifies the + auth data with `AuthenticodeVerify`. If it does verify, The TBS certificate is extracted, hashed + and checked against the `dbx`. + 2. EFI_CERT_X509__GUID: Uses each TBS cert hash in the list to attempt to extract + the TBS certificate from the auth data. If found, the TBS certificate is hashed and checked + against the `dbx`. + + @param[in] AuthData DER-encoded PKCS#7 SignedData payload. + @param[in] AuthDataSize Size of AuthData in bytes; must be non-zero. + @param[in] ImageHash Authenticode digest of the image under the algorithm + AuthData uses. + @param[in] ImageHashSize Size of ImageHash in bytes; must be non-zero. + @param[in] Databases The `db` / `dbx` signature databases to evaluate against. + @param[out] Authority On authorization, Authority->Data is the EFI_SIGNATURE_DATA trust + anchor in `db` that authorized the image and Authority->Size is its + SignatureSize. On no authorization, Authority->Data is NULL and + Authority->Size is 0. + + @retval TRUE The signature authorizes the image. + @retval FALSE The signature does not authorize the image, a required pointer was NULL, or an + error prevented a definitive answer. +**/ +BOOLEAN +IsCertAuthorized ( + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + IN CONST UINT8 *ImageHash, + IN UINTN ImageHashSize, + IN CONST SIGNATURE_DATABASES *Databases, + OUT IMAGE_AUTHORITY *Authority + ) +{ + SIG_DATABASE_ITER Iter; + CONST EFI_SIGNATURE_LIST *List; + VOID *TrustAnchorCacheHandle; + BOOLEAN Authorized; + + if ((AuthData == NULL) || (AuthDataSize == 0) || + (ImageHash == NULL) || (ImageHashSize == 0) || + (Databases == NULL) || (Authority == NULL)) + { + return FALSE; + } + + Authority->Data = NULL; + Authority->Size = 0; + TrustAnchorCacheHandle = NULL; + Authorized = FALSE; + + if (EFI_ERROR (DatabaseIterInit (&Iter, Databases->Db, Databases->DbSize))) { + return FALSE; + } + + // + // Iterate over each signature list in the database, dispatching to the helper + // that matches the list's signature-type GUID. + // + while ((List = DatabaseIterNext (&Iter)) != NULL) { + if (CompareGuid (&List->SignatureType, &gEfiCertX509Guid) && + IsPkcs7AuthDataAuthorizedByX509List ( + List, + AuthData, + AuthDataSize, + ImageHash, + ImageHashSize, + Databases->Dbx, + Databases->DbxSize, + Authority + )) + { + Authorized = TRUE; + break; + } + + if (IsX509CertHashGuid (&List->SignatureType) && + IsPkcs7AuthDataAuthorizedByX509HashList ( + List, + AuthData, + AuthDataSize, + ImageHash, + ImageHashSize, + Databases->Dbx, + Databases->DbxSize, + Authority, + &TrustAnchorCacheHandle + )) + { + Authorized = TRUE; + break; + } + } + + if (TrustAnchorCacheHandle != NULL) { + FreeTrustAnchorX509Cache (TrustAnchorCacheHandle); + } + + return Authorized; +} + +/** + Search the `db` for a trust anchor that authorizes the image via a single WIN_CERTIFICATE. + + A match is defined as a X.509 certificate in the `db` which: + 1. Verifies the auth data found in the WIN_CERTIFICATE against the hashed image digest. + 2. Whose TBS (To Be Signed) hash is not present in the `dbx`. + + @param[in] Cert The certificate to evaluate. + @param[in,out] Cache Image digest cache bound to the image buffer; the cache may + memoize one digest per algorithm across calls. + @param[in] Databases The `db` / `dbx` signature databases to evaluate against. + @param[out] Authority Authority->SignatureType is the authenticode hash algorithm. On + EFI_SUCCESS, Authority->Data references the EFI_SIGNATURE_DATA + trust anchor in the `db` that authorized the image. + + @retval EFI_SUCCESS The certificate authorizes the image; inspect Authority. + @retval EFI_NOT_FOUND The certificate is valid but no `db` trust anchor authorizes it. + @retval EFI_ACCESS_DENIED The certificate is revoked by `dbx`, or a prelude failure + (PKCS#7 extraction, hash-algorithm lookup, or image-hash + computation) prevented evaluation. + @retval EFI_INVALID_PARAMETER A required pointer is NULL. +**/ +EFI_STATUS +GetImageCertAuthority ( + IN CONST WIN_CERTIFICATE *Cert, + IN OUT DIGEST_CACHE *Cache, + IN CONST SIGNATURE_DATABASES *Databases, + OUT IMAGE_AUTHORITY *Authority + ) +{ + EFI_STATUS Status; + CONST UINT8 *AuthData; + UINTN AuthDataSize; + EFI_GUID HashType; + CONST UINT8 *ImageHash; + UINTN ImageHashSize; + + if ((Cert == NULL) || (Cache == NULL) || (Databases == NULL) || (Authority == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Authority->Data = NULL; + Authority->Size = 0; + ZeroMem (&Authority->SignatureType, sizeof (EFI_GUID)); + + Status = GetWinCertificatePkcs7AuthData (Cert, &AuthData, &AuthDataSize); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_WARN, + "DxeImageVerificationLib: Unable to extract PKCS#7 authentication data from WIN_CERTIFICATE (type=0x%04x, status=%r).\n", + Cert->wCertificateType, + Status + )); + return EFI_ACCESS_DENIED; + } + + Status = GetAuthenticodeHashAlgorithm (AuthData, AuthDataSize, &HashType); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_WARN, + "DxeImageVerificationLib: Unable to determine the hash algorithm from the PKCS#7 authentication data (%r).\n", + Status + )); + return EFI_ACCESS_DENIED; + } + + Status = GetHash (&HashType, Cache, &ImageHash, &ImageHashSize); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_WARN, + "DxeImageVerificationLib: Unable to compute the image hash (type=%g, status=%r).\n", + &HashType, + Status + )); + return EFI_ACCESS_DENIED; + } + + CopyGuid (&Authority->SignatureType, &HashType); + + if (IsCertRevoked (AuthData, AuthDataSize, ImageHash, ImageHashSize, Databases->Dbx, Databases->DbxSize)) { + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: certificate revoked by dbx.\n")); + return EFI_ACCESS_DENIED; + } + + // + // IsCertAuthorized populates Authority->Data only when it authorizes the image; on a + // non-authorizing result it leaves Data NULL while preserving SignatureType set above. + // + if (!IsCertAuthorized ( + AuthData, + AuthDataSize, + ImageHash, + ImageHashSize, + Databases, + Authority + )) + { + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/Database.h b/SecurityPkg/Library/DxeImageVerificationLib2/Database.h new file mode 100644 index 00000000000..2895a7d95e6 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/Database.h @@ -0,0 +1,130 @@ +/** @file + Secureboot DB/DBX/DBT (EFI_SIGNATURE_LIST) helpers, including signed-image + (certificate / Authenticode) validation, for the DXE Image Verification Library. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef DXE_IMAGE_VERIFICATION_LIB_DATABASE_H_ +#define DXE_IMAGE_VERIFICATION_LIB_DATABASE_H_ + +#include "DxeImageVerificationLib.h" +#include "Iterator.h" +#include "Support.h" +#include +#include + +// +// The platform's Secure Boot signature databases (`db` and `dbx`). Db / Dbx +// are pool-allocated copies owned by the caller; either may be NULL when the +// corresponding variable is absent, in which case its size is 0. +// +typedef struct { + VOID *Db; + UINTN DbSize; + VOID *Dbx; + UINTN DbxSize; +} SIGNATURE_DATABASES; + +/** + Load the platform's db and dbx signature databases. + + The Db / Dbx buffers in the returned structure are allocated using AllocatePool(). The caller is + responsible for freeing them with FreePool(). + + @param[out] Databases On success, receives pool-allocated copies of the `db` and `dbx` + variable contents. Either Db or Dbx may be NULL (with a 0 size) if the + corresponding variable is absent. + + @retval EFI_SUCCESS Databases loaded. Db / Dbx may still be NULL if the + corresponding variable was absent. + @retval EFI_INVALID_PARAMETER Databases is NULL. + @retval Other Failure status from gRT->GetVariable. +**/ +EFI_STATUS +LoadSignatureDatabases ( + OUT SIGNATURE_DATABASES *Databases + ); + +/** + Search the database for a digest authority that matches the image. + + A match is defined as a hash in the database that matches the hash of the image being searched. + The hash algorithm used is determined by the SignatureType of each EFI_SIGNATURE_LIST in the + database. + + @param[in] Database The raw database contents. + @param[in] DatabaseSize The size of the Database in bytes. + @param[in, out] Cache DIGEST_CACHE pointer bound to the image being searched. The cache + may be updated during the search. + @param[out] Authority Only valid on EFI_SUCCESS; reflects if a matching entry was found. + NULL if no match; otherwise, it contains the matching entry. + + @retval EFI_SUCCESS Search completed; Authority reflects if a matching entry was found. + @retval EFI_INVALID_PARAMETER A required pointer is NULL, or Cache is not bound to an image. + @retval EFI_VOLUME_CORRUPTED Database is structurally malformed. + @retval other Propagated from GetHash. +**/ +EFI_STATUS +GetImageDigestAuthority ( + IN CONST VOID *Database, + IN UINTN DatabaseSize, + IN OUT DIGEST_CACHE *Cache, + OUT IMAGE_AUTHORITY *Authority + ); + +/** + Determine whether a TBS Certificate hash is present in the `dbx`. + + Iterates over the EFI_SIGNATURE_LISTs in the `dbx` database and checks if any of them contain + the hash of the TBS Certificate. + + @param[in] Cert DER-encoded X.509 certificate. + @param[in] CertSize BufferSize of Cert in bytes. + @param[in] Dbx Raw dbx contents, or NULL. + @param[in] DbxSize BufferSize of Dbx in bytes; 0 when Dbx is NULL. + + @retval TRUE The certificate hash was located in dbx, or an error + prevented a definitive answer. + @retval FALSE The certificate hash is not present in dbx. +**/ +BOOLEAN +IsTBSCertHashInDbx ( + IN CONST UINT8 *Cert, + IN UINTN CertSize, + IN CONST VOID *Dbx, + IN UINTN DbxSize + ); + +/** + Search the `db` for a trust anchor that authorizes the image via a single WIN_CERTIFICATE. + + A match is defined as a X.509 certificate in the `db` which: + 1. Verifies the auth data found in the WIN_CERTIFICATE against the hashed image digest. + 2. Whose TBS (To Be Signed) hash is not present in the `dbx`. + + @param[in] Cert The certificate to evaluate. + @param[in,out] Cache Image digest cache bound to the image buffer; the cache may + memoize one digest per algorithm across calls. + @param[in] Databases The `db` / `dbx` signature databases to evaluate against. + @param[out] Authority Authority->SignatureType is the authenticode hash algorithm. On + EFI_SUCCESS, Authority->Data references the EFI_SIGNATURE_DATA + trust anchor in the `db` that authorized the image. + + @retval EFI_SUCCESS The certificate authorizes the image; inspect Authority. + @retval EFI_NOT_FOUND The certificate is valid but no `db` trust anchor authorizes it. + @retval EFI_ACCESS_DENIED The certificate is revoked by `dbx`, or a prelude failure + (PKCS#7 extraction, hash-algorithm lookup, or image-hash + computation) prevented evaluation. + @retval EFI_INVALID_PARAMETER A required pointer is NULL. +**/ +EFI_STATUS +GetImageCertAuthority ( + IN CONST WIN_CERTIFICATE *Cert, + IN OUT DIGEST_CACHE *Cache, + IN CONST SIGNATURE_DATABASES *Databases, + OUT IMAGE_AUTHORITY *Authority + ); + +#endif // DXE_IMAGE_VERIFICATION_LIB_DATABASE_H_ diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.c b/SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.c new file mode 100644 index 00000000000..81229db4f25 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.c @@ -0,0 +1,335 @@ +/** @file + Implement image verification services for secure boot service + + Caution: This file requires additional review when modified. + This library will have external input - PE/COFF image. + This external input must be validated carefully to avoid security issue like + buffer overflow, integer overflow. + + DxeImageVerificationLibImageRead() function will make sure the PE/COFF image content + read is within the image buffer. + + DxeImageVerificationHandler(), HashPeImageByType(), HashPeImage() function will accept + untrusted PE/COFF image and validate its data structure within this image buffer before use. + +Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
+(C) Copyright 2016 Hewlett Packard Enterprise Development LP
+Copyright (c) Microsoft Corporation. +SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "DxeImageVerificationLib.h" +#include "Database.h" +#include "Iterator.h" +#include "Support.h" + +/** + Validate a PE/COFF image against the platform signature databases. + + 1. Reject immediately if the image's Authenticode hash is enrolled in the `dbx`. + 2. Walk each WIN_CERTIFICATE in the image's security data directory to determine if the + Auth Data from it is not revoked by the `dbx` and is authorized by the `db`. Only one + WIN_CERTIFICATE needs to authorize the image for it to be validated. + 3. Authorize the image if the image's Authenticode hash is enrolled in the `db`. + + When the image is rejected for any reason, an entry describing the rejection is appended to the + Image Execution Information Table. The recorded EFI_IMAGE_EXECUTION_ACTION is: + - EFI_IMAGE_EXECUTION_AUTH_UNTESTED Unsigned image rejected (digest in `dbx`, or digest + not in `db`). + - EFI_IMAGE_EXECUTION_AUTH_SIG_FOUND Signed image rejected because its digest is in `dbx`. + - EFI_IMAGE_EXECUTION_AUTH_SIG_FAILED Signed image rejected and at least one certificate was + revoked by `dbx` (or could not be evaluated). + - EFI_IMAGE_EXECUTION_AUTH_SIG_NOT_FOUND Signed image rejected because no certificate is in `db` + and the digest is not in `db`. + + @param[in] File Device path of the image being verified. Used to record rejections. + @param[in] FileBuffer Pointer to the in-memory PE/COFF image. + @param[in] FileSize Size of FileBuffer in bytes. + @param[in] SecDataDir Security data directory describing the embedded WIN_CERTIFICATE table. + A Size of 0 indicates an unsigned image. + @param[in,out] Measured Authority measurement state used to record the `db` entry that + authorized the image into PCR 7 (de-duplicated across images). + + @retval EFI_SUCCESS The image is authorized. + @retval EFI_ACCESS_DENIED The image is revoked, not authorized, or the + databases could not be loaded. +**/ +EFI_STATUS +ValidateImage ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File, + IN VOID *FileBuffer, + IN UINTN FileSize, + IN CONST EFI_IMAGE_DATA_DIRECTORY *SecDataDir, + IN OUT MEASURED_AUTHORITIES *Measured + ) +{ + EFI_STATUS Status; + DIGEST_CACHE Cache; + SIGNATURE_DATABASES Databases; + WIN_CERT_ITER CertIter; + CONST WIN_CERTIFICATE *Cert; + IMAGE_AUTHORITY Authority; + EFI_IMAGE_EXECUTION_ACTION Action; + EFI_GUID RejectHashType; + CONST UINT8 *RejectDigest; + UINTN RejectDigestSize; + + Action = EFI_IMAGE_EXECUTION_AUTH_SIG_NOT_FOUND; + ZeroMem (&RejectHashType, sizeof (EFI_GUID)); + + // + // Setup digest cache for the image. This prevents redundant authenticode hash computations + // across the image-hash revocation check, per-cert authorization, and the image-hash fallback. + // + ZeroMem (&Cache, sizeof (Cache)); + Cache.Type = DigestCacheTypeImage; + Cache.Buffer = FileBuffer; + Cache.BufferSize = FileSize; + + Status = LoadSignatureDatabases (&Databases); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "DxeImageVerificationLib: Failed to load signature databases (%r).\n", Status)); + goto Reject; + } + + // + // Step 1: Reject the image if its Authenticode hash is found in the `dbx`. A failure to search + // the `dbx` rejects the image. + // + Status = GetImageDigestAuthority (Databases.Dbx, Databases.DbxSize, &Cache, &Authority); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "DxeImageVerificationLib: Failed to search DBX for image hash (%r).\n", Status)); + Action = EFI_IMAGE_EXECUTION_AUTH_SIG_FOUND; + goto Reject; + } + + if (Authority.Data != NULL) { + DEBUG ((DEBUG_ERROR, "DxeImageVerificationLib: Image hash is forbidden by DBX.\n")); + Action = EFI_IMAGE_EXECUTION_AUTH_SIG_FOUND; + CopyGuid (&RejectHashType, &Authority.SignatureType); + goto Reject; + } + + // + // Step 2: For each WIN_CERTIFICATE in the image's security data directory, extract the auth data + // and check if it authorizes the image per the `db` and `dbx`. Exit on the first authorization. + // + // Note: If the image is unsigned, the iterator is empty and this step is a no-op. + // + Status = WinCertIterInit (&CertIter, FileBuffer, FileSize, SecDataDir); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "DxeImageVerificationLib: Failed to walk security data directory (%r).\n", Status)); + Action = EFI_IMAGE_EXECUTION_AUTH_SIG_FAILED; + goto Reject; + } + + while ((Cert = WinCertIterNext (&CertIter)) != NULL) { + Status = GetImageCertAuthority (Cert, &Cache, &Databases, &Authority); + if ((Status == EFI_SUCCESS) && (Authority.Data != NULL)) { + // + // Measure the `db` trust anchor that authorized the image into PCR 7. + // + SecureBootHook ( + Measured, + EFI_IMAGE_SECURITY_DATABASE, + &gEfiImageSecurityDatabaseGuid, + &Authority + ); + Status = EFI_SUCCESS; + goto Exit; + } + + // + // This auth data is rejected by the `dbx`; update the rejection information so that we can + // properly record a rejection record if we end up rejecting the image. + // + if (Status == EFI_ACCESS_DENIED) { + CopyGuid (&RejectHashType, &Authority.SignatureType); + Action = EFI_IMAGE_EXECUTION_AUTH_SIG_FAILED; + } + } + + // + // Step 3: Authorize the image if the image authenticode hash is in the `db`. + // + Status = GetImageDigestAuthority (Databases.Db, Databases.DbSize, &Cache, &Authority); + if (!EFI_ERROR (Status) && (Authority.Data != NULL)) { + // + // Measure the `db` image-hash entry that authorized the image into PCR 7. + // + SecureBootHook ( + Measured, + EFI_IMAGE_SECURITY_DATABASE, + &gEfiImageSecurityDatabaseGuid, + &Authority + ); + Status = EFI_SUCCESS; + goto Exit; + } + + DEBUG ((DEBUG_ERROR, "DxeImageVerificationLib: Image is not authorized by DB.\n")); + +Reject: + // + // Above logic assumed signed images. If the image is unsigned, it's rejection reason is always + // EFI_IMAGE_EXECUTION_AUTH_UNTESTED and the table record does not contain any signature + // information. + // + if (SecDataDir->Size == 0) { + Action = EFI_IMAGE_EXECUTION_AUTH_UNTESTED; + ZeroMem (&RejectHashType, sizeof (EFI_GUID)); + } + + // + // Recover the memoized image digest for the rejection signature when a hash + // algorithm was established (SIG_FOUND / SIG_FAILED). A failure simply records + // no signature. + // + RejectDigest = NULL; + RejectDigestSize = 0; + if (!IsZeroGuid (&RejectHashType)) { + GetHash (&RejectHashType, &Cache, &RejectDigest, &RejectDigestSize); + } + + RecordRejectedImage (File, Action, &RejectHashType, RejectDigest, RejectDigestSize); + Status = EFI_ACCESS_DENIED; + +Exit: + if (Databases.Db != NULL) { + FreePool (Databases.Db); + } + + if (Databases.Dbx != NULL) { + FreePool (Databases.Dbx); + } + + return Status; +} + +/** + Provide verification service for signed images, which include both signature validation + and platform policy control. For signature types, both UEFI WIN_CERTIFICATE_UEFI_GUID and + MSFT Authenticode type signatures are supported. + + In this implementation, only verify external executables when in USER MODE. + Executables from FV is bypass, so pass in AuthenticationStatus is ignored. + + The image verification policy is: + If the image is signed, + At least one valid signature or at least one hash value of the image must match a record + in the security database "db", and no valid signature nor any hash value of the image may + be reflected in the security database "dbx". + Otherwise, the image is not signed, + The hash value of the image must match a record in the security database "db", and + not be reflected in the security data base "dbx". + + Caution: This function may receive untrusted input. + PE/COFF image is external input, so this function will validate its data structure + within this image buffer before use. + + @param[in] AuthenticationStatus + This is the authentication status returned from the security + measurement services for the input file. + @param[in] File This is a pointer to the device path of the file that is + being dispatched. This will optionally be used for logging. + @param[in] FileBuffer File buffer matches the input file device path. + @param[in] FileSize Size of File buffer matches the input file device path. + @param[in] BootPolicy A boot policy that was used to call LoadImage() UEFI service. + + @retval EFI_SUCCESS The file specified by DevicePath and non-NULL + FileBuffer did authenticate, and the platform policy dictates + that the DXE Foundation may use the file. + @retval EFI_SUCCESS The device path specified by NULL device path DevicePath + and non-NULL FileBuffer did authenticate, and the platform + policy dictates that the DXE Foundation may execute the image in + FileBuffer. + @retval EFI_ACCESS_DENIED The file specified by File and FileBuffer did not + authenticate, and the DXE Foundation may not use File. The + image has been added to the file execution table. + +**/ +EFI_STATUS +EFIAPI +DxeImageVerificationHandler ( + IN UINT32 AuthenticationStatus, + IN CONST EFI_DEVICE_PATH_PROTOCOL *File OPTIONAL, + IN VOID *FileBuffer, + IN UINTN FileSize, + IN BOOLEAN BootPolicy + ) +{ + EFI_STATUS Status; + UINT32 Policy; + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + // + // Sanity check. + // + if (File == NULL) { + return EFI_INVALID_PARAMETER; + } + + // + // Resolve the platform authorization policy from the image's origin. + // This runs before the Secure Boot variable check because it is much + // cheaper, and the common case (FV-dispatched drivers) short-circuits + // if the policy is ALWAYS_EXECUTE. + // + Status = GetExecutionPolicy (File, &Policy); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Policy unconditionally permits execution; no further checks needed. + // + if (Policy == ALWAYS_EXECUTE) { + return EFI_SUCCESS; + } + + // + // Secure Boot is the gate for all remaining checks. When it is not + // enabled, the platform has opted out of image authorization. + // + if (!IsSecureBootEnabled ()) { + return EFI_SUCCESS; + } + + // + // Inspect the image to locate its security data directory. Any failure + // to parse the PE/COFF headers is treated as a verification failure. + // + Status = GetImageSecurityDataDirectory (FileBuffer, FileSize, &SecDataDir); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Run image verification. The unified path handles both signed and + // unsigned images; SecDataDir->Size == 0 simply produces an empty + // WIN_CERTIFICATE iteration inside ValidateImage. + // + return ValidateImage (File, FileBuffer, FileSize, &SecDataDir, GetMeasuredAuthorities ()); +} + +/** + Register security measurement handler. + + @param ImageHandle ImageHandle of the loaded driver. + @param SystemTable Pointer to the EFI System Table. + + @retval EFI_SUCCESS The handlers were registered successfully. +**/ +EFI_STATUS +EFIAPI +DxeImageVerificationLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return RegisterSecurity2Handler ( + DxeImageVerificationHandler, + EFI_AUTH_OPERATION_VERIFY_IMAGE | EFI_AUTH_OPERATION_IMAGE_REQUIRED + ); +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.h b/SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.h new file mode 100644 index 00000000000..f7c570d1609 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.h @@ -0,0 +1,255 @@ +/** @file + Internal declarations for the DXE Image Verification Library. + + This header is consumed by the library's source files (and its unit + tests) to share prototypes for the constructor and the Security2 + verification handler. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef DXE_IMAGE_VERIFICATION_LIB_H_ +#define DXE_IMAGE_VERIFICATION_LIB_H_ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// +// Authorization policy bit definition +// +#define ALWAYS_EXECUTE 0x00000000 +#define DENY_EXECUTE_ON_SECURITY_VIOLATION 0x00000001 + +// +// Image type definitions +// +#define IMAGE_UNKNOWN 0x00000000 +#define IMAGE_FROM_FV 0x00000001 + +#define MAX_DIGEST_SIZE SHA512_DIGEST_SIZE + +// +// Type definition for all information necessary to describe hash algorithm usage in this library. +// +typedef struct { + CONST CHAR8 *Name; + CONST EFI_GUID *ImageHashGuid; + CONST EFI_GUID *X509CertHashGuid; +} HASH_ALGORITHM; + +// +// All supported hash algorithms for secureboot validation. Adding a new algorithm to this list +// will add support for that algorithm across the entire library. +// +STATIC CONST HASH_ALGORITHM mHashAlgorithms[] = { + { "SHA256", &gEfiCertSha256Guid, &gEfiCertX509Sha256Guid }, + { "SHA384", &gEfiCertSha384Guid, &gEfiCertX509Sha384Guid }, + { "SHA512", &gEfiCertSha512Guid, &gEfiCertX509Sha512Guid }, +}; + +// +// The result of evaluating an image against a signature database. +// +// Data / Size describe the `db` authority that authorized the image: Data +// references the EFI_SIGNATURE_DATA entry inside the signature database that +// authorized the image, and Size is that entry's SignatureSize. Data is NULL +// and Size is 0 when no authority authorized the image. +// +// SignatureType is the image-hash algorithm GUID under which the image was +// evaluated. +// +typedef struct { + CONST EFI_SIGNATURE_DATA *Data; + UINTN Size; + EFI_GUID SignatureType; +} IMAGE_AUTHORITY; + +// +// A single Secure Boot authority entry that has been measured into PCR 7. +// VariableName / VendorGuid reference canonical storage owned by the library; +// Data is a pool-allocated copy of the EFI_SIGNATURE_DATA that authorized an +// image. +// +typedef struct { + CHAR16 *VariableName; + EFI_GUID *VendorGuid; + VOID *Data; + UINTN Size; +} MEASURED_VARIABLE; + +// +// Tracks the set of authority entries that have been measured into PCR 7 +// during this boot so that no single entry is measured more than once. The +// only instance of this structure is the module global owned by Measurement.c +// and obtained through GetMeasuredAuthorities (). +// +typedef struct { + MEASURED_VARIABLE *List; + UINTN Count; + UINTN Max; +} MEASURED_AUTHORITIES; + +/** + Return the module-global authority measurement state. + + The returned pointer references storage that persists for the lifetime of + the module so that measurement de-duplication is maintained across every + image the verification handler processes. + + @return Pointer to the module-global MEASURED_AUTHORITIES instance. +**/ +MEASURED_AUTHORITIES * +GetMeasuredAuthorities ( + VOID + ); + +/** + Record a rejected image into the Image Execution Information Table. + + Appends a single EFI_IMAGE_EXECUTION_INFO entry describing the rejection. The + image name is derived from File via ConvertDevicePathToText. When Digest is + non-NULL it is wrapped as an EFI_SIGNATURE_LIST typed by HashType and recorded + as the entry's signature (matching the legacy SIG_FOUND / SIG_FAILED + behavior); otherwise no signature is recorded. All transient allocations are + freed before return. + + @param[in] File Device path of the rejected image. Must be non-NULL. + @param[in] Action The EFI_IMAGE_EXECUTION_ACTION describing why the image + was rejected. + @param[in] HashType Image-hash algorithm GUID describing Digest. Ignored + when Digest is NULL. + @param[in] Digest Optional image digest to record, or NULL to record no + signature. + @param[in] DigestSize Size of Digest in bytes; must be non-zero when Digest + is non-NULL. +**/ +VOID +RecordRejectedImage ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File, + IN EFI_IMAGE_EXECUTION_ACTION Action, + IN CONST EFI_GUID *HashType, + IN CONST UINT8 *Digest OPTIONAL, + IN UINTN DigestSize + ); + +/** + Resolve an image's authorization policy. + + @param[in] File Device path describing the image origin. + @param[out] Policy On success, filled with the resolved policy value. + + @retval EFI_SUCCESS Policy contains a valid policy value. + @retval EFI_INVALID_PARAMETER File or Policy is NULL. +**/ +EFI_STATUS +GetExecutionPolicy ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File, + OUT UINT32 *Policy + ); + +/** + Measure a Secure Boot authority entry into PCR 7, skipping entries that have + already been measured this boot. + + If VariableName / VendorGuid do not identify a Secure Boot authority + variable, or the supplied data has already been measured, the call is a + no-op. Otherwise the data is measured via TpmMeasureAndLogData and recorded + in Measured so subsequent identical entries are not measured again. + + @param[in,out] Measured Authority measurement state to consult and update. + @param[in] VariableName Name of the variable that authorized the image. + @param[in] VendorGuid Vendor GUID of the variable that authorized the image. + @param[in] Authority The `db` authority that authorized the image, whose Data / Size + identify the EFI_SIGNATURE_DATA entry to measure. +**/ +VOID +SecureBootHook ( + IN OUT MEASURED_AUTHORITIES *Measured, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN CONST IMAGE_AUTHORITY *Authority + ); + +/** + Provide verification service for signed images, which include both signature validation + and platform policy control. For signature types, both UEFI WIN_CERTIFICATE_UEFI_GUID and + MSFT Authenticode type signatures are supported. + + In this implementation, only verify external executables when in USER MODE. + Executables from FV is bypass, so pass in AuthenticationStatus is ignored. + + The image verification policy is: + If the image is signed, + At least one valid signature or at least one hash value of the image must match a record + in the security database "db", and no valid signature nor any hash value of the image may + be reflected in the security database "dbx". + Otherwise, the image is not signed, + The hash value of the image must match a record in the security database "db", and + not be reflected in the security data base "dbx". + + Caution: This function may receive untrusted input. + PE/COFF image is external input, so this function will validate its data structure + within this image buffer before use. + + @param[in] AuthenticationStatus + This is the authentication status returned from the security + measurement services for the input file. + @param[in] File This is a pointer to the device path of the file that is + being dispatched. This will optionally be used for logging. + @param[in] FileBuffer File buffer matches the input file device path. + @param[in] FileSize Size of File buffer matches the input file device path. + @param[in] BootPolicy A boot policy that was used to call LoadImage() UEFI service. + + @retval EFI_SUCCESS The file specified by DevicePath and non-NULL + FileBuffer did authenticate, and the platform policy dictates + that the DXE Foundation may use the file. + @retval EFI_SUCCESS The device path specified by NULL device path DevicePath + and non-NULL FileBuffer did authenticate, and the platform + policy dictates that the DXE Foundation may execute the image in + FileBuffer. + @retval EFI_ACCESS_DENIED The file specified by File and FileBuffer did not + authenticate, and the DXE Foundation may not use File. The + image has been added to the file execution table. + +**/ +EFI_STATUS +EFIAPI +DxeImageVerificationHandler ( + IN UINT32 AuthenticationStatus, + IN CONST EFI_DEVICE_PATH_PROTOCOL *File OPTIONAL, + IN VOID *FileBuffer, + IN UINTN FileSize, + IN BOOLEAN BootPolicy + ); + +/** + Register security measurement handler. + + @param ImageHandle ImageHandle of the loaded driver. + @param SystemTable Pointer to the EFI System Table. + + @retval EFI_SUCCESS The handlers were registered successfully. +**/ +EFI_STATUS +EFIAPI +DxeImageVerificationLibConstructor ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ); + +#endif // DXE_IMAGE_VERIFICATION_LIB_H_ diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.inf b/SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.inf new file mode 100644 index 00000000000..0d8ebfaa046 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.inf @@ -0,0 +1,95 @@ +## @file +# Provides security service of image verification +# +# This library hooks LoadImage() API to verify every image by the verification policy. +# +# Caution: This module requires additional review when modified. +# This library will have external input - PE/COFF image. +# This external input must be validated carefully to avoid security issues such as +# buffer overflow or integer overflow. +# +# Copyright (C) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeImageVerificationLib + MODULE_UNI_FILE = DxeImageVerificationLib.uni + FILE_GUID = CFEF751D-B633-489D-8DB4-BE39262D1599 + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = NULL|DXE_DRIVER DXE_RUNTIME_DRIVER DXE_SMM_DRIVER UEFI_APPLICATION UEFI_DRIVER + CONSTRUCTOR = DxeImageVerificationLibConstructor + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 EBC +# + +[Sources] + Database.c + Database.h + DxeImageVerificationLib.c + DxeImageVerificationLib.h + ImageExecution.c + Iterator.c + Iterator.h + Measurement.c + Policy.c + Support.c + Support.h + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + CryptoPkg/CryptoPkg.dec + SecurityPkg/SecurityPkg.dec + +[LibraryClasses] + MemoryAllocationLib + BaseLib + UefiLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + BaseCryptLib + BaseMemoryLib + DebugLib + DevicePathLib + PeCoffLib + SecureBootVariableLib + SecurityManagementLib + TpmMeasurementLib + +[Protocols] + +[Guids] + ## SOMETIMES_CONSUMES ## Variable:L"DB" + ## SOMETIMES_CONSUMES ## Variable:L"DBX" + ## PRODUCES ## SystemTable + ## CONSUMES ## SystemTable + gEfiImageSecurityDatabaseGuid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha1Guid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha256Guid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha384Guid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha512Guid + + gEfiCertX509Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertX509Sha256Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertX509Sha384Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertX509Sha512Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertPkcs7Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the certificate. diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DatabaseGoogleTest.cpp b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DatabaseGoogleTest.cpp new file mode 100644 index 00000000000..b2e27cbe865 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DatabaseGoogleTest.cpp @@ -0,0 +1,2905 @@ +/** @file + Unit tests for the signature-database helpers in + DxeImageVerificationLib (Database.c): GetImageDigestAuthority, + LoadSignatureDatabase, LoadSignatureDatabases, IsCertRevoked, + IsCertAuthorized, GetWinCertificatePkcs7AuthData, and + GetImageCertAuthority. The database helpers are exercised against + synthetic in-memory EFI_SIGNATURE_LIST buffers built by helpers in + this file; the variable loaders against a mocked GetVariable2; and the + certificate helpers against a mocked BaseCryptLib. + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include +#include + +#include +#include + +extern "C" { + #include + #include + #include + #include + #include + #include "../Database.h" + #include "../Support.h" + + EFI_STATUS + LoadSignatureDatabase ( + IN CONST CHAR16 *DatabaseName, + OUT VOID **Buffer, + OUT UINTN *BufferSize + ); + + BOOLEAN + IsCertRevoked ( + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + IN CONST UINT8 *ImageHash, + IN UINTN ImageHashSize, + IN CONST VOID *Dbx, + IN UINTN DbxSize + ); + + BOOLEAN + IsCertAuthorized ( + IN CONST UINT8 *AuthData, + IN UINTN AuthDataSize, + IN CONST UINT8 *ImageHash, + IN UINTN ImageHashSize, + IN CONST SIGNATURE_DATABASES *Databases, + OUT IMAGE_AUTHORITY *Authority + ); + + EFI_STATUS + GetWinCertificatePkcs7AuthData ( + IN CONST WIN_CERTIFICATE *Cert, + OUT CONST UINT8 **AuthData, + OUT UINTN *AuthDataSize + ); +} + +using ::testing::_; +using ::testing::DoAll; +using ::testing::Invoke; +using ::testing::Return; +using ::testing::SetArgPointee; + +static bool +GetImageHashIndexForTest ( + const EFI_GUID *Guid, + UINTN *Index + ) +{ + UINTN I; + + if ((Guid == nullptr) || (Index == nullptr)) { + return false; + } + + for (I = 0; I < ARRAY_SIZE (mHashAlgorithms); I++) { + if (CompareGuid (Guid, mHashAlgorithms[I].ImageHashGuid)) { + *Index = I; + return true; + } + } + + return false; +} + +// --------------------------------------------------------------------------- +// Helpers for constructing signature-list buffers. +// --------------------------------------------------------------------------- + +// +// Append one EFI_SIGNATURE_LIST containing SignatureCount entries of +// EntrySize bytes each (entry payloads are zero-initialized) to Buffer. +// Returns the offset of the new list within Buffer. +// +static size_t +AppendSignatureList ( + std::vector &Buffer, + const EFI_GUID &SignatureType, + UINT32 SignatureHeaderSize, + UINT32 EntrySize, + UINT32 SignatureCount + ) +{ + const size_t PayloadBytes = (size_t)EntrySize * (size_t)SignatureCount; + const size_t ListBytes = sizeof (EFI_SIGNATURE_LIST) + SignatureHeaderSize + PayloadBytes; + const size_t Offset = Buffer.size (); + + Buffer.resize (Offset + ListBytes, 0); + + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)(Buffer.data () + Offset); + + CopyMem (&List->SignatureType, &SignatureType, sizeof (EFI_GUID)); + List->SignatureListSize = (UINT32)ListBytes; + List->SignatureHeaderSize = SignatureHeaderSize; + List->SignatureSize = EntrySize; + + return Offset; +} + +// +// Walk callback that simply counts invocations and records the +// per-list SignatureType GUIDs in visit order. +// +// SHA-256 entry size: 16-byte owner GUID + 32-byte digest. +static constexpr UINT32 kSha256EntrySize = sizeof (EFI_GUID) + 32; +static constexpr UINT32 kSha384EntrySize = sizeof (EFI_GUID) + 48; + +// --------------------------------------------------------------------------- +// GetImageDigestAuthority +// --------------------------------------------------------------------------- + +// +// Write Bytes into the entry payload (the part after the owner GUID) of +// signature index EntryIndex inside the EFI_SIGNATURE_LIST that begins +// at ListOffset within Buffer. +// +static void +SetEntryPayload ( + std::vector &Buffer, + size_t ListOffset, + UINTN EntryIndex, + const std::vector &Bytes + ) +{ + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)(Buffer.data () + ListOffset); + const size_t FirstEntry = ListOffset + sizeof (EFI_SIGNATURE_LIST) + List->SignatureHeaderSize; + const size_t EntryStart = FirstEntry + (size_t)EntryIndex * (size_t)List->SignatureSize; + const size_t PayloadOff = EntryStart + sizeof (EFI_GUID); + + ASSERT_LE (PayloadOff + Bytes.size (), Buffer.size ()); + std::memcpy (Buffer.data () + PayloadOff, Bytes.data (), Bytes.size ()); +} + +// SHA-256 digest payload size (no owner GUID). +static constexpr UINTN kSha256DigestSize = 32; +static constexpr UINTN kSha384DigestSize = 48; + +static DIGEST_CACHE +MakeBoundCache ( + const EFI_GUID *HashType, + const std::vector &Digest + ) +{ + DIGEST_CACHE Cache; + UINTN Index; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (const VOID *)(UINTN)1; + Cache.BufferSize = 1; + + EXPECT_TRUE (GetImageHashIndexForTest (HashType, &Index)); + EXPECT_LE (Digest.size (), (size_t)MAX_DIGEST_SIZE); + + std::memcpy (Cache.Entries[Index].Bytes, Digest.data (), Digest.size ()); + Cache.Entries[Index].BufferSize = Digest.size (); + return Cache; +} + +TEST (GetImageDigestAuthorityTest, NullDatabaseWithNonZeroSize_ReturnsSuccess) { + DIGEST_CACHE Cache; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (const VOID *)(UINTN)1; + Cache.BufferSize = 1; + + EXPECT_EQ (GetImageDigestAuthority (NULL, 1, &Cache, &Authority), EFI_SUCCESS); + EXPECT_EQ (Authority.Data, nullptr); + // Validate that Cache remains consistent + EXPECT_EQ (Cache.Buffer, (const VOID *)(UINTN)1); + EXPECT_EQ (Cache.BufferSize, (UINTN)1); +} + +TEST (GetImageDigestAuthorityTest, NullDatabaseWithZeroSize_EmptyDatabaseNotFound) { + DIGEST_CACHE Cache; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (const VOID *)(UINTN)1; + Cache.BufferSize = 1; + + EXPECT_EQ (GetImageDigestAuthority (NULL, 0, &Cache, &Authority), EFI_SUCCESS); + EXPECT_EQ (Authority.Data, nullptr); + // Validate that Cache remains consistent + EXPECT_EQ (Cache.Buffer, (const VOID *)(UINTN)1); + EXPECT_EQ (Cache.BufferSize, (UINTN)1); +} + +TEST (GetImageDigestAuthorityTest, NullCache_ReturnsInvalidParameter) { + UINT8 Dummy = 0; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ (GetImageDigestAuthority (&Dummy, 1, NULL, &Authority), EFI_INVALID_PARAMETER); +} + +TEST (GetImageDigestAuthorityTest, NullAuthority_ReturnsInvalidParameter) { + UINT8 Dummy = 0; + DIGEST_CACHE Cache; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (const VOID *)(UINTN)1; + Cache.BufferSize = 1; + + EXPECT_EQ (GetImageDigestAuthority (&Dummy, 1, &Cache, NULL), EFI_INVALID_PARAMETER); +} + +TEST (GetImageDigestAuthorityTest, CacheWithoutImageBinding_ReturnsInvalidParameter) { + UINT8 Dummy = 0; + DIGEST_CACHE Cache; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + ZeroMem (&Cache, sizeof (Cache)); + EXPECT_EQ (GetImageDigestAuthority (&Dummy, 1, &Cache, &Authority), EFI_INVALID_PARAMETER); +} + +TEST (GetImageDigestAuthorityTest, CacheWithZeroFileSize_ReturnsInvalidParameter) { + UINT8 Dummy = 0; + DIGEST_CACHE Cache; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (const VOID *)(UINTN)1; + Cache.BufferSize = 0; + + EXPECT_EQ (GetImageDigestAuthority (&Dummy, 1, &Cache, &Authority), EFI_INVALID_PARAMETER); +} + +TEST (GetImageDigestAuthorityTest, HashComputationFailure_ReturnsSecurityViolation) { + MockBaseCryptLib BaseCryptLibMock; + std::vector Db; + + AppendSignatureList (Db, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + DIGEST_CACHE Cache; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (const VOID *)(UINTN)1; + Cache.BufferSize = 1; + + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHash (_, _, _, _, _)) + .WillOnce (Return (EFI_DEVICE_ERROR)); + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_SECURITY_VIOLATION); + EXPECT_EQ (Authority.Data, nullptr); +} + +TEST (GetImageDigestAuthorityTest, ExactMatch_Found) { + std::vector Db; + size_t Off = AppendSignatureList (Db, gEfiCertSha256Guid, 0, kSha256EntrySize, 2); + std::vector Target (kSha256DigestSize, 0xAA); + + SetEntryPayload (Db, Off, 1, Target); + + DIGEST_CACHE Cache = MakeBoundCache (&gEfiCertSha256Guid, Target); + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_SUCCESS); + EXPECT_NE (Authority.Data, nullptr); +} + +TEST (GetImageDigestAuthorityTest, NoMatchingEntry_NotFound) { + std::vector Db; + size_t Off = AppendSignatureList (Db, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + std::vector Stored (kSha256DigestSize, 0xAA); + + SetEntryPayload (Db, Off, 0, Stored); + + std::vector Digest (kSha256DigestSize, 0xBB); + DIGEST_CACHE Cache = MakeBoundCache (&gEfiCertSha256Guid, Digest); + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_SUCCESS); + EXPECT_EQ (Authority.Data, nullptr); +} + +TEST (GetImageDigestAuthorityTest, UnknownSignatureTypeList_Skipped) { + std::vector Db; + + AppendSignatureList (Db, gEfiCertX509Guid, 0, sizeof (EFI_GUID) + 16, 1); + + std::vector Digest (kSha256DigestSize, 0xAA); + DIGEST_CACHE Cache = MakeBoundCache (&gEfiCertSha256Guid, Digest); + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_SUCCESS); + EXPECT_EQ (Authority.Data, nullptr); +} + +TEST (GetImageDigestAuthorityTest, MismatchedSignatureSize_Skipped) { + // List type matches but per-entry size doesn't, so the list describes + // a different algorithm and must be skipped. + std::vector Db; + + AppendSignatureList (Db, gEfiCertSha256Guid, 0, kSha384EntrySize, 1); + + std::vector Digest (kSha256DigestSize, 0xCC); + DIGEST_CACHE Cache = MakeBoundCache (&gEfiCertSha256Guid, Digest); + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_SUCCESS); + EXPECT_EQ (Authority.Data, nullptr); +} + +TEST (GetImageDigestAuthorityTest, MatchInSecondList_Found) { + // First list is the wrong algorithm, second list contains the target. + std::vector Db; + + AppendSignatureList (Db, gEfiCertX509Guid, 0, sizeof (EFI_GUID) + 16, 1); + size_t SecondOff = AppendSignatureList (Db, gEfiCertSha256Guid, 0, kSha256EntrySize, 2); + + std::vector Target (kSha256DigestSize, 0x77); + + SetEntryPayload (Db, SecondOff, 1, Target); + + DIGEST_CACHE Cache = MakeBoundCache (&gEfiCertSha256Guid, Target); + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_SUCCESS); + EXPECT_NE (Authority.Data, nullptr); +} + +TEST (GetImageDigestAuthorityTest, NonZeroSignatureHeaderSize_EntryMathCorrect) { + // SignatureHeaderSize is non-zero: the per-list header occupies + // additional bytes between EFI_SIGNATURE_LIST and the first entry. + // A naive cursor that forgets to skip it would either miss the + // payload entirely or read the header bytes as a fake entry. + constexpr UINT32 kHeader = 8; + std::vector Db; + size_t Off = AppendSignatureList (Db, gEfiCertSha256Guid, kHeader, kSha256EntrySize, 2); + + // Fill the per-list header with a recognizable pattern so a math + // bug that read it as an entry would compare against this, not the + // real digest. The search target intentionally differs from it. + std::memset (Db.data () + Off + sizeof (EFI_SIGNATURE_LIST), 0xEE, kHeader); + + std::vector Target (kSha256DigestSize, 0x55); + + SetEntryPayload (Db, Off, 1, Target); + + DIGEST_CACHE Cache = MakeBoundCache (&gEfiCertSha256Guid, Target); + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_SUCCESS); + EXPECT_NE (Authority.Data, nullptr); +} + +TEST (GetImageDigestAuthorityTest, ZeroEntryList_NotFound) { + // A well-formed list with zero entries must be skipped without a + // false positive (EntryCount == 0 means the inner loop never runs). + std::vector Db; + + AppendSignatureList (Db, gEfiCertSha256Guid, 0, kSha256EntrySize, 0); + + std::vector Digest (kSha256DigestSize, 0x00); + DIGEST_CACHE Cache = MakeBoundCache (&gEfiCertSha256Guid, Digest); + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_SUCCESS); + EXPECT_EQ (Authority.Data, nullptr); +} + +TEST (GetImageDigestAuthorityTest, MalformedDb_ReturnsCorrupted) { + std::vector Db; + + AppendSignatureList (Db, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + ((EFI_SIGNATURE_LIST *)Db.data ())->SignatureListSize = (UINT32)(Db.size () + 1); + + std::vector Digest (kSha256DigestSize, 0x00); + DIGEST_CACHE Cache = MakeBoundCache (&gEfiCertSha256Guid, Digest); + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_VOLUME_CORRUPTED); +} + +TEST (GetImageDigestAuthorityTest, ZeroSizeNonNullDatabase_EmptyDatabaseNotFound) { + UINT8 Dummy = 0; + DIGEST_CACHE Cache; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (const VOID *)(UINTN)1; + Cache.BufferSize = 1; + + EXPECT_EQ (GetImageDigestAuthority (&Dummy, 0, &Cache, &Authority), EFI_SUCCESS); + EXPECT_EQ (Authority.Data, nullptr); +} + +// +// A db list whose SignatureType is a supported image-hash GUID (so GetHash +// succeeds against the bound cache) but whose SignatureHeaderSize is +// inflated so SigListIterInit rejects it. The list must be skipped and no +// authority returned. +// +TEST (GetImageDigestAuthorityTest, MalformedListHeader_Skipped) { + std::vector Digest (kSha256DigestSize, 0xAB); + DIGEST_CACHE Cache = MakeBoundCache (&gEfiCertSha256Guid, Digest); + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + // One image-hash list sized for a single SHA-256 entry, but with an + // inflated SignatureHeaderSize that overflows the list payload area. + const UINT32 EntrySize = kSha256EntrySize; + const UINT32 ListSize = (UINT32)(sizeof (EFI_SIGNATURE_LIST) + EntrySize); + std::vector Db (ListSize, 0); + + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)Db.data (); + + CopyMem (&List->SignatureType, &gEfiCertSha256Guid, sizeof (EFI_GUID)); + List->SignatureListSize = ListSize; + List->SignatureHeaderSize = ListSize; // > ListSize - sizeof (EFI_SIGNATURE_LIST) + List->SignatureSize = EntrySize; + + EXPECT_EQ (GetImageDigestAuthority (Db.data (), Db.size (), &Cache, &Authority), EFI_SUCCESS); + EXPECT_EQ (Authority.Data, nullptr); +} + +// --------------------------------------------------------------------------- +// LoadSignatureDatabase (uses MockUefiLib::GetVariable2) +// --------------------------------------------------------------------------- + +class LoadSignatureDatabaseTest : public ::testing::Test { +protected: + MockUefiLib UefiLibMock; +}; + +TEST_F (LoadSignatureDatabaseTest, NullDatabaseName_ReturnsInvalidParameter) { + VOID *Buffer = NULL; + UINTN BufferSize = 0; + + EXPECT_EQ ( + LoadSignatureDatabase (NULL, &Buffer, &BufferSize), + EFI_INVALID_PARAMETER + ); +} + +TEST_F (LoadSignatureDatabaseTest, NullBuffer_ReturnsInvalidParameter) { + UINTN BufferSize = 0; + + EXPECT_EQ ( + LoadSignatureDatabase ((const CHAR16 *)u"db", NULL, &BufferSize), + EFI_INVALID_PARAMETER + ); +} + +TEST_F (LoadSignatureDatabaseTest, NullSize_ReturnsInvalidParameter) { + VOID *Buffer = NULL; + + EXPECT_EQ ( + LoadSignatureDatabase ((const CHAR16 *)u"db", &Buffer, NULL), + EFI_INVALID_PARAMETER + ); +} + +TEST_F (LoadSignatureDatabaseTest, VariableMissing_SuccessWithNullBuffer) { + // EFI_NOT_FOUND is normalized to EFI_SUCCESS with *Buffer == NULL. + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce (Return (EFI_NOT_FOUND)); + + VOID *Buffer = (VOID *)(UINTN)0xDEADBEEF; // pre-set: must be cleared + UINTN BufferSize = 0xAA; + + EXPECT_EQ ( + LoadSignatureDatabase ((const CHAR16 *)u"db", &Buffer, &BufferSize), + EFI_SUCCESS + ); + EXPECT_EQ (Buffer, (VOID *)NULL); + EXPECT_EQ (BufferSize, 0u); +} + +TEST_F (LoadSignatureDatabaseTest, VariablePresent_BufferAndSizePopulated) { + static const UINT8 kPayload[] = { 0xAA, 0xBB, 0xCC, 0xDD }; + + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce ( + Invoke ( + [] ( + IN CONST CHAR16 *Name, + IN CONST EFI_GUID *Guid, + OUT VOID **Value, + OUT UINTN *BufferSize + ) -> EFI_STATUS { + (VOID)Name; + (VOID)Guid; + *Value = AllocateCopyPool (sizeof (kPayload), kPayload); + *BufferSize = sizeof (kPayload); + return EFI_SUCCESS; + } + ) + ); + + VOID *Buffer = NULL; + UINTN BufferSize = 0; + + EXPECT_EQ ( + LoadSignatureDatabase ((const CHAR16 *)u"db", &Buffer, &BufferSize), + EFI_SUCCESS + ); + ASSERT_NE (Buffer, (VOID *)NULL); + EXPECT_EQ (BufferSize, sizeof (kPayload)); + EXPECT_EQ (CompareMem (Buffer, kPayload, sizeof (kPayload)), 0); + + FreePool (Buffer); +} + +TEST_F (LoadSignatureDatabaseTest, GetVariableUnexpectedError_PropagatedVerbatim) { + // Errors other than EFI_NOT_FOUND must be reported unchanged. + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce (Return (EFI_DEVICE_ERROR)); + + VOID *Buffer = NULL; + UINTN BufferSize = 0; + + EXPECT_EQ ( + LoadSignatureDatabase ((const CHAR16 *)u"db", &Buffer, &BufferSize), + EFI_DEVICE_ERROR + ); +} + +// --------------------------------------------------------------------------- +// LoadSignatureDatabases (db + dbx) +// --------------------------------------------------------------------------- + +class LoadSignatureDatabasesTest : public ::testing::Test { +protected: + MockUefiLib UefiLibMock; +}; + +// +// Lambda factory: a GetVariable2 action that allocates a copy of the +// supplied payload and returns EFI_SUCCESS. Used to feed synthetic +// db/dbx buffers into LoadSignatureDatabases through the mock. +// +static auto +ReturnVariablePayload ( + const UINT8 *Payload, + size_t PayloadSize + ) +{ + return Invoke ( + [Payload, PayloadSize] ( + IN CONST CHAR16 *Name, + IN CONST EFI_GUID *Guid, + OUT VOID **Value, + OUT UINTN *BufferSize + ) -> EFI_STATUS { + (VOID)Name; + (VOID)Guid; + *Value = AllocateCopyPool (PayloadSize, Payload); + *BufferSize = PayloadSize; + return EFI_SUCCESS; + } + ); +} + +TEST_F (LoadSignatureDatabasesTest, NullDatabases_ReturnsInvalidParameter) { + EXPECT_EQ ( + LoadSignatureDatabases (NULL), + EFI_INVALID_PARAMETER + ); +} + +TEST_F (LoadSignatureDatabasesTest, BothVariablesMissing_Success) { + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce (Return (EFI_NOT_FOUND)) // db + .WillOnce (Return (EFI_NOT_FOUND)); // dbx + + // Pre-set to bogus values: must be cleared. + SIGNATURE_DATABASES Databases = { + (VOID *)(UINTN)0xDEADBEEF, 0xAA, + (VOID *)(UINTN)0xCAFEF00D, 0xBB + }; + + EXPECT_EQ ( + LoadSignatureDatabases (&Databases), + EFI_SUCCESS + ); + EXPECT_EQ (Databases.Db, (VOID *)NULL); + EXPECT_EQ (Databases.DbSize, 0u); + EXPECT_EQ (Databases.Dbx, (VOID *)NULL); + EXPECT_EQ (Databases.DbxSize, 0u); +} + +TEST_F (LoadSignatureDatabasesTest, OnlyDbPresent_DbAllocated) { + std::vector DbBuf; + + AppendSignatureList (DbBuf, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce (ReturnVariablePayload (DbBuf.data (), DbBuf.size ())) // db + .WillOnce (Return (EFI_NOT_FOUND)); // dbx + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + + EXPECT_EQ ( + LoadSignatureDatabases (&Databases), + EFI_SUCCESS + ); + ASSERT_NE (Databases.Db, (VOID *)NULL); + EXPECT_EQ (Databases.DbSize, DbBuf.size ()); + EXPECT_EQ (Databases.Dbx, (VOID *)NULL); + EXPECT_EQ (Databases.DbxSize, 0u); + FreePool (Databases.Db); +} + +TEST_F (LoadSignatureDatabasesTest, OnlyDbxPresent_DbxAllocated) { + std::vector DbxBuf; + + AppendSignatureList (DbxBuf, gEfiCertSha384Guid, 0, kSha384EntrySize, 1); + + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce (Return (EFI_NOT_FOUND)) // db + .WillOnce (ReturnVariablePayload (DbxBuf.data (), DbxBuf.size ())); // dbx + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + + EXPECT_EQ ( + LoadSignatureDatabases (&Databases), + EFI_SUCCESS + ); + EXPECT_EQ (Databases.Db, (VOID *)NULL); + EXPECT_EQ (Databases.DbSize, 0u); + ASSERT_NE (Databases.Dbx, (VOID *)NULL); + EXPECT_EQ (Databases.DbxSize, DbxBuf.size ()); + FreePool (Databases.Dbx); +} + +TEST_F (LoadSignatureDatabasesTest, BothPresent_BuffersAllocated) { + std::vector DbBuf; + std::vector DbxBuf; + + AppendSignatureList (DbBuf, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + AppendSignatureList (DbxBuf, gEfiCertSha384Guid, 0, kSha384EntrySize, 1); + + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce (ReturnVariablePayload (DbBuf.data (), DbBuf.size ())) // db + .WillOnce (ReturnVariablePayload (DbxBuf.data (), DbxBuf.size ())); // dbx + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + + EXPECT_EQ ( + LoadSignatureDatabases (&Databases), + EFI_SUCCESS + ); + ASSERT_NE (Databases.Db, (VOID *)NULL); + EXPECT_EQ (Databases.DbSize, DbBuf.size ()); + ASSERT_NE (Databases.Dbx, (VOID *)NULL); + EXPECT_EQ (Databases.DbxSize, DbxBuf.size ()); + FreePool (Databases.Db); + FreePool (Databases.Dbx); +} + +TEST_F (LoadSignatureDatabasesTest, DbLoadFails_ErrorPropagatedNothingAllocated) { + // The db lookup fails with a non-NOT_FOUND status; dbx must not even + // be attempted, and both out-pointers must be NULL. + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce (Return (EFI_DEVICE_ERROR)); + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + + EXPECT_EQ ( + LoadSignatureDatabases (&Databases), + EFI_DEVICE_ERROR + ); + EXPECT_EQ (Databases.Db, (VOID *)NULL); + EXPECT_EQ (Databases.DbSize, 0u); + EXPECT_EQ (Databases.Dbx, (VOID *)NULL); + EXPECT_EQ (Databases.DbxSize, 0u); +} + +TEST_F (LoadSignatureDatabasesTest, DbxLoadFails_DbFreedAndErrorPropagated) { + std::vector DbBuf; + + AppendSignatureList (DbBuf, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + // db succeeds (allocation must be cleaned up internally); dbx fails. + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce (ReturnVariablePayload (DbBuf.data (), DbBuf.size ())) // db + .WillOnce (Return (EFI_DEVICE_ERROR)); // dbx + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + + EXPECT_EQ ( + LoadSignatureDatabases (&Databases), + EFI_DEVICE_ERROR + ); + EXPECT_EQ (Databases.Db, (VOID *)NULL); // freed and nulled + EXPECT_EQ (Databases.DbSize, 0u); + EXPECT_EQ (Databases.Dbx, (VOID *)NULL); + EXPECT_EQ (Databases.DbxSize, 0u); +} + +TEST_F (LoadSignatureDatabasesTest, DbxLoadFailsWithAllocatedBuffer_DbxFreedAndNulled) { + std::vector DbBuf; + + AppendSignatureList (DbBuf, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + EXPECT_CALL (UefiLibMock, GetVariable2 (_, _, _, _)) + .WillOnce (ReturnVariablePayload (DbBuf.data (), DbBuf.size ())) + .WillOnce ( + Invoke ( + [] ( + IN CONST CHAR16 *Name, + IN CONST EFI_GUID *Guid, + OUT VOID **Value, + OUT UINTN *BufferSize + ) -> EFI_STATUS { + (VOID)Name; + (VOID)Guid; + *Value = AllocatePool (8); + *BufferSize = 8; + return EFI_DEVICE_ERROR; + } + ) + ); + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + + EXPECT_EQ ( + LoadSignatureDatabases (&Databases), + EFI_DEVICE_ERROR + ); + EXPECT_EQ (Databases.Db, (VOID *)NULL); + EXPECT_EQ (Databases.DbSize, 0u); + EXPECT_EQ (Databases.Dbx, (VOID *)NULL); + EXPECT_EQ (Databases.DbxSize, 0u); +} + +// --------------------------------------------------------------------------- +// IsTBSCertHashInDbx -- additional list-handling coverage +// --------------------------------------------------------------------------- + +// +// Dbx is too small to even contain one EFI_SIGNATURE_LIST header. +// DatabaseIterInit must reject it and the helper must fail closed +// (return TRUE). +// +TEST (IsTBSCertHashInDbxTest, MalformedDbx_ReturnsTrue) { + UINT8 TBSCert[] = { 0xDE, 0xAD }; + // Less than sizeof(EFI_SIGNATURE_LIST) -> DatabaseIterInit returns corrupted. + std::vector Dbx (4, 0); + + EXPECT_TRUE (IsTBSCertHashInDbx (TBSCert, sizeof (TBSCert), Dbx.data (), Dbx.size ())); +} + +// +// Dbx contains exactly one list whose SignatureType is not any of the +// supported gEfiCertX509ShaXXXGuid values. The helper must skip it +// and return FALSE. +// +TEST (IsTBSCertHashInDbxTest, UnsupportedShaList_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + UINT8 TBSCert[] = { 0xDE }; + std::vector Dbx; + + // gEfiCertSha256Guid is an image-hash list type, not a cert-hash list type. + AppendSignatureList (Dbx, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + // X509GetTbsCertHash should not be invoked for an unsupported list type. + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)).Times (0); + + EXPECT_FALSE (IsTBSCertHashInDbx (TBSCert, sizeof (TBSCert), Dbx.data (), Dbx.size ())); +} + +// +// Dbx is an X509-SHA384 list with no matching entry. The helper must +// take the SHA-384 branch and return FALSE. +// +TEST (IsTBSCertHashInDbxTest, Sha384List_NoMatch_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + UINT8 TBSCert[] = { 0xDE }; + const UINT32 EntrySize = (UINT32)(sizeof (EFI_GUID) + SHA384_DIGEST_SIZE); + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertX509Sha384Guid, 0, EntrySize, 1); + + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Digest, UINTN *DigestSize) -> EFI_STATUS { + std::memset (Digest, 0x11, SHA384_DIGEST_SIZE); + *DigestSize = SHA384_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + + EXPECT_FALSE (IsTBSCertHashInDbx (TBSCert, sizeof (TBSCert), Dbx.data (), Dbx.size ())); +} + +// +// Dbx is an X509-SHA512 list that contains the matching cert hash. +// The helper must take the SHA-512 branch and return TRUE. +// +TEST (IsTBSCertHashInDbxTest, Sha512List_Match_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + UINT8 TBSCert[] = { 0xDE }; + const UINT32 EntrySize = (UINT32)(sizeof (EFI_GUID) + SHA512_DIGEST_SIZE); + std::vector Dbx; + + size_t Off = AppendSignatureList (Dbx, gEfiCertX509Sha512Guid, 0, EntrySize, 1); + + SetEntryPayload (Dbx, Off, 0, std::vector(SHA512_DIGEST_SIZE, 0x99)); + + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Digest, UINTN *DigestSize) -> EFI_STATUS { + std::memset (Digest, 0x99, SHA512_DIGEST_SIZE); + *DigestSize = SHA512_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + + EXPECT_TRUE (IsTBSCertHashInDbx (TBSCert, sizeof (TBSCert), Dbx.data (), Dbx.size ())); +} + +// +// The hash routine itself fails (X509GetTbsCertHash returns an error). +// The helper must fail closed and return TRUE. +// +TEST (IsTBSCertHashInDbxTest, HashFails_FailsClosed_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + UINT8 TBSCert[] = { 0xDE }; + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertX509Sha256Guid, 0, kSha256EntrySize, 1); + + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce (Return (EFI_DEVICE_ERROR)); + + EXPECT_TRUE (IsTBSCertHashInDbx (TBSCert, sizeof (TBSCert), Dbx.data (), Dbx.size ())); +} + +// +// Dbx X509-SHA256 list whose SignatureSize is too small to contain a +// 32-byte digest. The helper must fail closed and return TRUE. +// +TEST (IsTBSCertHashInDbxTest, SignatureSizeTooSmall_FailsClosed_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + UINT8 TBSCert[] = { 0xDE }; + // EntrySize = GUID + 16 bytes -- smaller than required for a SHA-256 digest. + const UINT32 EntrySize = (UINT32)(sizeof (EFI_GUID) + 16); + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertX509Sha256Guid, 0, EntrySize, 1); + + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Digest, UINTN *DigestSize) -> EFI_STATUS { + std::memset (Digest, 0x00, SHA256_DIGEST_SIZE); + *DigestSize = SHA256_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + + EXPECT_TRUE (IsTBSCertHashInDbx (TBSCert, sizeof (TBSCert), Dbx.data (), Dbx.size ())); +} + +// +// Dbx X509-SHA256 list that passes the size check but whose +// SignatureHeaderSize is inconsistent with SignatureListSize, causing +// SigListIterInit to fail. The helper must fail closed and return +// TRUE. +// +TEST (IsTBSCertHashInDbxTest, SigListIterInitFails_FailsClosed_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + UINT8 TBSCert[] = { 0xDE }; + std::vector Dbx; + + // Build a list with a SignatureHeaderSize larger than the list itself + // allows. We size the list to contain a single SHA-256 cert-hash entry + // (so the size check at the top of IsX509HashInList passes), but + // the inflated SignatureHeaderSize makes SigListIterInit reject it. + const UINT32 EntrySize = kSha256EntrySize; + const UINT32 ListSize = (UINT32)(sizeof (EFI_SIGNATURE_LIST) + EntrySize); + + Dbx.resize (ListSize, 0); + + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)Dbx.data (); + + CopyMem (&List->SignatureType, &gEfiCertX509Sha256Guid, sizeof (EFI_GUID)); + List->SignatureListSize = ListSize; + // SignatureHeaderSize > SignatureListSize - sizeof (EFI_SIGNATURE_LIST). + List->SignatureHeaderSize = ListSize; + List->SignatureSize = EntrySize; + + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Digest, UINTN *DigestSize) -> EFI_STATUS { + std::memset (Digest, 0x00, SHA256_DIGEST_SIZE); + *DigestSize = SHA256_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + + EXPECT_TRUE (IsTBSCertHashInDbx (TBSCert, sizeof (TBSCert), Dbx.data (), Dbx.size ())); +} + +// +// Dbx contains two X509-SHA256 lists for the same certificate. The +// TBS digest should be computed once and reused for the second list. +// +TEST (IsTBSCertHashInDbxTest, RepeatedSha256Lists_UsesCachedDigest_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + UINT8 TBSCert[] = { 0xDE }; + std::vector Dbx; + + size_t Off0 = AppendSignatureList (Dbx, gEfiCertX509Sha256Guid, 0, kSha256EntrySize, 1); + size_t Off1 = AppendSignatureList (Dbx, gEfiCertX509Sha256Guid, 0, kSha256EntrySize, 1); + + SetEntryPayload (Dbx, Off0, 0, std::vector(SHA256_DIGEST_SIZE, 0x11)); + SetEntryPayload (Dbx, Off1, 0, std::vector(SHA256_DIGEST_SIZE, 0x22)); + + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .Times (1) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Digest, UINTN *DigestSize) -> EFI_STATUS { + std::memset (Digest, 0xAA, SHA256_DIGEST_SIZE); + *DigestSize = SHA256_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + + EXPECT_FALSE (IsTBSCertHashInDbx (TBSCert, sizeof (TBSCert), Dbx.data (), Dbx.size ())); +} + +static const std::vector kAuthDataDefault = std::vector(16, 0xA1); +static const std::vector kImageHashDefault = std::vector(SHA256_DIGEST_SIZE, 0x55); + +// --------------------------------------------------------------------------- +// IsCertRevoked -- parameter validation +// --------------------------------------------------------------------------- + +TEST (IsCertRevokedTest, NullAuthData_ReturnsTrue) { + std::vector Dbx (16, 0); + + EXPECT_TRUE ( + IsCertRevoked ( + NULL, + 0, + kImageHashDefault.data (), + kImageHashDefault.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +TEST (IsCertRevokedTest, ZeroAuthDataSize_ReturnsTrue) { + std::vector Dbx (16, 0); + + EXPECT_TRUE ( + IsCertRevoked ( + kAuthDataDefault.data (), + 0, + kImageHashDefault.data (), + kImageHashDefault.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +TEST (IsCertRevokedTest, NullImageHash_ReturnsTrue) { + std::vector Dbx (16, 0); + + EXPECT_TRUE ( + IsCertRevoked ( + kAuthDataDefault.data (), + kAuthDataDefault.size (), + NULL, + 0, + Dbx.data (), + Dbx.size () + ) + ); +} + +TEST (IsCertRevokedTest, ZeroImageHashSize_ReturnsTrue) { + std::vector Dbx (16, 0); + + EXPECT_TRUE ( + IsCertRevoked ( + kAuthDataDefault.data (), + kAuthDataDefault.size (), + kImageHashDefault.data (), + 0, + Dbx.data (), + Dbx.size () + ) + ); +} + +TEST (IsCertRevokedTest, NullDbx_ReturnsFalse) { + EXPECT_FALSE ( + IsCertRevoked ( + kAuthDataDefault.data (), + kAuthDataDefault.size (), + kImageHashDefault.data (), + kImageHashDefault.size (), + NULL, + 0 + ) + ); +} + +TEST (IsCertRevokedTest, EmptyDbx_ReturnsFalse) { + std::vector Dbx; + + EXPECT_FALSE ( + IsCertRevoked ( + kAuthDataDefault.data (), + kAuthDataDefault.size (), + kImageHashDefault.data (), + kImageHashDefault.size (), + Dbx.data (), + 0 + ) + ); +} + +// --------------------------------------------------------------------------- +// IsCertAuthorized -- parameter validation +// --------------------------------------------------------------------------- + +TEST (IsCertAuthorizedTest, NullAuthData_ReturnsFalse) { + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + NULL, + 0, + kImageHashDefault.data (), + kImageHashDefault.size (), + &Databases, + &Authority + ) + ); +} + +TEST (IsCertAuthorizedTest, ZeroAuthDataSize_ReturnsFalse) { + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + kAuthDataDefault.data (), + 0, + kImageHashDefault.data (), + kImageHashDefault.size (), + &Databases, + &Authority + ) + ); +} + +TEST (IsCertAuthorizedTest, NullImageHash_ReturnsFalse) { + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + kAuthDataDefault.data (), + kAuthDataDefault.size (), + NULL, + 0, + &Databases, + &Authority + ) + ); +} + +TEST (IsCertAuthorizedTest, NullDatabases_ReturnsFalse) { + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + kAuthDataDefault.data (), + kAuthDataDefault.size (), + kImageHashDefault.data (), + kImageHashDefault.size (), + NULL, + &Authority + ) + ); +} + +TEST (IsCertAuthorizedTest, NullAuthority_ReturnsFalse) { + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + kAuthDataDefault.data (), + kAuthDataDefault.size (), + kImageHashDefault.data (), + kImageHashDefault.size (), + &Databases, + NULL + ) + ); +} + +TEST (IsCertAuthorizedTest, ZeroImageHashSize_ReturnsFalse) { + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + kAuthDataDefault.data (), + kAuthDataDefault.size (), + kImageHashDefault.data (), + 0, + &Databases, + &Authority + ) + ); +} + +// --------------------------------------------------------------------------- +// GetWinCertificatePkcs7AuthData +// --------------------------------------------------------------------------- + +TEST (GetWinCertificatePkcs7AuthDataTest, NullCert_ReturnsInvalidParameter) { + const UINT8 *AuthData = NULL; + UINTN AuthDataSize = 0; + + EXPECT_EQ ( + GetWinCertificatePkcs7AuthData (NULL, &AuthData, &AuthDataSize), + EFI_INVALID_PARAMETER + ); +} + +TEST (GetWinCertificatePkcs7AuthDataTest, NullOutputs_ReturnsInvalidParameter) { + WIN_CERTIFICATE Cert = { sizeof (WIN_CERTIFICATE) + 1, 0x0200, WIN_CERT_TYPE_PKCS_SIGNED_DATA }; + const UINT8 *AuthData = NULL; + UINTN AuthDataSize = 0; + + EXPECT_EQ ( + GetWinCertificatePkcs7AuthData (&Cert, NULL, &AuthDataSize), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ ( + GetWinCertificatePkcs7AuthData (&Cert, &AuthData, NULL), + EFI_INVALID_PARAMETER + ); +} + +TEST (GetWinCertificatePkcs7AuthDataTest, PkcsSignedData_ExtractsPayload) { + // Build a WIN_CERTIFICATE followed by 4 bytes of payload. + const UINT8 Payload[] = { 0xAA, 0xBB, 0xCC, 0xDD }; + std::vector Buffer (sizeof (WIN_CERTIFICATE) + sizeof (Payload), 0); + WIN_CERTIFICATE *Cert = (WIN_CERTIFICATE *)Buffer.data (); + + Cert->dwLength = (UINT32)Buffer.size (); + Cert->wRevision = 0x0200; + Cert->wCertificateType = WIN_CERT_TYPE_PKCS_SIGNED_DATA; + std::memcpy (Buffer.data () + sizeof (WIN_CERTIFICATE), Payload, sizeof (Payload)); + + const UINT8 *AuthData = NULL; + UINTN AuthDataSize = 0; + + EXPECT_EQ ( + GetWinCertificatePkcs7AuthData (Cert, &AuthData, &AuthDataSize), + EFI_SUCCESS + ); + ASSERT_EQ (AuthDataSize, sizeof (Payload)); + EXPECT_EQ (0, std::memcmp (AuthData, Payload, sizeof (Payload))); +} + +TEST (GetWinCertificatePkcs7AuthDataTest, PkcsSignedData_HeaderOnly_ReturnsCorrupted) { + WIN_CERTIFICATE Cert = { sizeof (WIN_CERTIFICATE), 0x0200, WIN_CERT_TYPE_PKCS_SIGNED_DATA }; + const UINT8 *AuthData = NULL; + UINTN AuthDataSize = 0; + + EXPECT_EQ ( + GetWinCertificatePkcs7AuthData (&Cert, &AuthData, &AuthDataSize), + EFI_VOLUME_CORRUPTED + ); +} + +TEST (GetWinCertificatePkcs7AuthDataTest, EfiGuidPkcs7_ExtractsPayload) { + const UINT8 Payload[] = { 0x11, 0x22, 0x33 }; + const size_t HeaderSize = OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData); + std::vector Buffer (HeaderSize + sizeof (Payload), 0); + WIN_CERTIFICATE_UEFI_GUID *UefiCert = (WIN_CERTIFICATE_UEFI_GUID *)Buffer.data (); + + UefiCert->Hdr.dwLength = (UINT32)Buffer.size (); + UefiCert->Hdr.wRevision = 0x0200; + UefiCert->Hdr.wCertificateType = WIN_CERT_TYPE_EFI_GUID; + CopyMem (&UefiCert->CertType, &gEfiCertPkcs7Guid, sizeof (EFI_GUID)); + std::memcpy (Buffer.data () + HeaderSize, Payload, sizeof (Payload)); + + const UINT8 *AuthData = NULL; + UINTN AuthDataSize = 0; + + EXPECT_EQ ( + GetWinCertificatePkcs7AuthData (&UefiCert->Hdr, &AuthData, &AuthDataSize), + EFI_SUCCESS + ); + ASSERT_EQ (AuthDataSize, sizeof (Payload)); + EXPECT_EQ (0, std::memcmp (AuthData, Payload, sizeof (Payload))); +} + +TEST (GetWinCertificatePkcs7AuthDataTest, EfiGuidNonPkcs7_ReturnsUnsupported) { + const size_t HeaderSize = OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData); + std::vector Buffer (HeaderSize + 4, 0); + WIN_CERTIFICATE_UEFI_GUID *UefiCert = (WIN_CERTIFICATE_UEFI_GUID *)Buffer.data (); + const EFI_GUID OtherGuid = { 0x12345678, 0x1234, 0x1234, { 1, 2, 3, 4, 5, 6, 7, 8 } + }; + + UefiCert->Hdr.dwLength = (UINT32)Buffer.size (); + UefiCert->Hdr.wRevision = 0x0200; + UefiCert->Hdr.wCertificateType = WIN_CERT_TYPE_EFI_GUID; + CopyMem (&UefiCert->CertType, &OtherGuid, sizeof (EFI_GUID)); + + const UINT8 *AuthData = NULL; + UINTN AuthDataSize = 0; + + EXPECT_EQ ( + GetWinCertificatePkcs7AuthData (&UefiCert->Hdr, &AuthData, &AuthDataSize), + EFI_UNSUPPORTED + ); +} + +TEST (GetWinCertificatePkcs7AuthDataTest, EfiGuid_HeaderOnly_ReturnsCorrupted) { + WIN_CERTIFICATE_UEFI_GUID UefiCert; + + ZeroMem (&UefiCert, sizeof (UefiCert)); + UefiCert.Hdr.dwLength = (UINT32)OFFSET_OF (WIN_CERTIFICATE_UEFI_GUID, CertData); + UefiCert.Hdr.wRevision = 0x0200; + UefiCert.Hdr.wCertificateType = WIN_CERT_TYPE_EFI_GUID; + + const UINT8 *AuthData = NULL; + UINTN AuthDataSize = 0; + + EXPECT_EQ ( + GetWinCertificatePkcs7AuthData (&UefiCert.Hdr, &AuthData, &AuthDataSize), + EFI_VOLUME_CORRUPTED + ); +} + +TEST (GetWinCertificatePkcs7AuthDataTest, UnknownCertType_ReturnsUnsupported) { + WIN_CERTIFICATE Cert = { sizeof (WIN_CERTIFICATE) + 8, 0x0200, WIN_CERT_TYPE_EFI_PKCS115 }; + const UINT8 *AuthData = NULL; + UINTN AuthDataSize = 0; + + EXPECT_EQ ( + GetWinCertificatePkcs7AuthData (&Cert, &AuthData, &AuthDataSize), + EFI_UNSUPPORTED + ); +} + +// --------------------------------------------------------------------------- +// IsCertAuthorized -- end-to-end PKCS#7 + dbx scenarios +// --------------------------------------------------------------------------- + +// +// One PKCS#7 signature whose only valid trust anchor in db has its +// hash listed in dbx. The cert must not be authorized. +// +TEST (IsCertAuthorizedTest, SignatureCertInDbAndDbx_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + // db: one X509 list with one cert (payload byte == 0x11). + std::vector Db; + size_t DbOff = AppendSignatureList ( + Db, + gEfiCertX509Guid, + 0, + sizeof (EFI_GUID) + 16, + 1 + ); + + SetEntryPayload (Db, DbOff, 0, std::vector(16, 0x11)); + + // dbx: one X509-SHA256 list with the digest the mocked X509GetTbsCertHash + // will produce for the cert's TBS bytes (0xE1 * 32). + std::vector Dbx; + size_t DbxOff = AppendSignatureList ( + Dbx, + gEfiCertX509Sha256Guid, + 0, + kSha256EntrySize, + 1 + ); + + SetEntryPayload (Dbx, DbxOff, 0, std::vector(kSha256DigestSize, 0xE1)); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)) + .WillOnce (Return (TRUE)); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutTbs, UINTN *OutTbsSize) -> BOOLEAN { + static UINT8 TbsBytes[] = { 0x11 }; + *OutTbs = TbsBytes; + *OutTbsSize = sizeof (TbsBytes); + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Digest, UINTN *DigestSize) -> EFI_STATUS { + std::memset (Digest, 0xE1, SHA256_DIGEST_SIZE); + *DigestSize = SHA256_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), Dbx.data (), Dbx.size () }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// +// Happy path: a single PKCS#7 signature, db contains an X509 trust +// anchor that AuthenticodeVerify accepts, and no dbx. IsCertAuthorized +// must return TRUE. X509GetTBSCert is still called for the verifying +// trust anchor, but dbx hashing is skipped because dbx is empty. +// +TEST (IsCertAuthorizedTest, SingleSignatureVerifies_NoDbx_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + std::vector Db; + size_t DbOff = AppendSignatureList ( + Db, + gEfiCertX509Guid, + 0, + sizeof (EFI_GUID) + 16, + 1 + ); + + SetEntryPayload (Db, DbOff, 0, std::vector(16, 0x11)); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)) + .WillOnce (Return (TRUE)); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutTbs, UINTN *OutTbsSize) -> BOOLEAN { + static UINT8 TbsBytes[] = { 0x11 }; + *OutTbs = TbsBytes; + *OutTbsSize = sizeof (TbsBytes); + return TRUE; + } + ) + ); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_TRUE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// +// A PKCS#7 signature exists but no db cert verifies it. IsCertAuthorized +// must return FALSE. +// +TEST (IsCertAuthorizedTest, SignatureDoesNotVerifyAnyDbCert_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + std::vector Db; + size_t DbOff = AppendSignatureList ( + Db, + gEfiCertX509Guid, + 0, + sizeof (EFI_GUID) + 16, + 2 + ); + + SetEntryPayload (Db, DbOff, 0, std::vector(16, 0x11)); + SetEntryPayload (Db, DbOff, 1, std::vector(16, 0x22)); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)) + .Times (2) + .WillRepeatedly (Return (FALSE)); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// +// db is absent (NULL/0) but the cert carries a valid-looking PKCS#7 +// signature. With no trust anchors at all IsCertAuthorized must return +// FALSE, and no crypto must be invoked. +// +TEST (IsCertAuthorizedTest, NoDbButValidSignature_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + // No db => the db walk visits nothing => AuthenticodeVerify is never called. + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// --------------------------------------------------------------------------- +// IsCertAuthorized -- additional signature-list handling coverage +// --------------------------------------------------------------------------- + +// +// db contains only a non-X.509 list (image-hash list). The db walk +// inspects it but skips it; with no trust anchors available the cert +// must not be authorized. +// +TEST (IsCertAuthorizedTest, DbHasOnlyNonX509List_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + // db: one image-hash list (gEfiCertSha256Guid) with a non-matching digest. + std::vector Db; + + AppendSignatureList (Db, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + // No X.509 list => AuthenticodeVerify is never called. + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// +// db contains an X.509 list whose SignatureSize equals sizeof(EFI_GUID), +// i.e. no cert payload at all. The list must be skipped and the cert +// must not be authorized. +// +TEST (IsCertAuthorizedTest, DbX509ListNoCertPayload_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + // X.509 list with SignatureSize = sizeof(EFI_GUID) (no cert payload). + std::vector Db; + + AppendSignatureList (Db, gEfiCertX509Guid, 0, (UINT32)sizeof (EFI_GUID), 1); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// +// db contains an X.509 list whose SignatureHeaderSize is inflated past +// SignatureListSize - sizeof(EFI_SIGNATURE_LIST). DatabaseIterInit +// accepts the list (it only validates SignatureListSize), but +// SigListIterInit inside IsPkcs7AuthDataVerifiedByX509 rejects it. +// The list must be skipped and the cert must not be authorized. +// +TEST (IsCertAuthorizedTest, DbX509ListMalformedHeader_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + // Build a single X.509 list with SignatureSize > sizeof(EFI_GUID) (so + // the early-return check in IsPkcs7AuthDataVerifiedByX509 is passed) + // but a SignatureHeaderSize that overflows the list payload area. + const UINT32 EntrySize = (UINT32)(sizeof (EFI_GUID) + 16); + const UINT32 ListSize = (UINT32)(sizeof (EFI_SIGNATURE_LIST) + EntrySize); + std::vector Db (ListSize, 0); + + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)Db.data (); + + CopyMem (&List->SignatureType, &gEfiCertX509Guid, sizeof (EFI_GUID)); + List->SignatureListSize = ListSize; + List->SignatureHeaderSize = ListSize; // > ListSize - sizeof(EFI_SIGNATURE_LIST) + List->SignatureSize = EntrySize; + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// +// db is malformed (less than one EFI_SIGNATURE_LIST header). The +// per-signature DatabaseIterInit call fails and IsCertAuthorized must +// return FALSE. +// +TEST (IsCertAuthorizedTest, MalformedDb_RejectsImage) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + // Less than sizeof(EFI_SIGNATURE_LIST) -> DatabaseIterInit fails. + std::vector Db (4, 0); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// +// db contains an X.509 (full-cert) list whose entry AuthenticodeVerify +// accepts, but X509GetTBSCert fails to extract the TBSCertificate. The +// helper must fail closed and the image must not be authorized. +// +TEST (IsCertAuthorizedTest, DbX509AuthenticodeVerifiesButTbsCertFails_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + std::vector Db; + size_t DbOff = AppendSignatureList (Db, gEfiCertX509Guid, 0, (UINT32)(sizeof (EFI_GUID) + 16), 1); + + SetEntryPayload (Db, DbOff, 0, std::vector(16, 0x11)); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)) + .WillOnce (Return (TRUE)); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)) + .WillOnce (Return (FALSE)); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); + EXPECT_EQ (Authority.Data, nullptr); +} + +// --------------------------------------------------------------------------- +// IsCertAuthorized -- X.509 TBS-cert-hash (trust anchor) list handling +// --------------------------------------------------------------------------- + +// +// db contains an EFI_CERT_X509_SHA256 (TBS-cert-hash) list. A trust +// anchor is recovered from the PKCS#7 auth data via +// GetTrustAnchorX509FromAuthData, and its TBS hash is not present in an +// (empty) dbx. The image must be authorized and Authority must point at +// the matching db entry. The non-NULL cache handle produced by the +// lookup must be released via FreeTrustAnchorX509Cache. +// +TEST (IsCertAuthorizedTest, X509HashListTrustAnchorNotRevoked_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + std::vector Db; + + AppendSignatureList (Db, gEfiCertX509Sha256Guid, 0, kSha256EntrySize, 1); + + // The returned trust anchor is freed by the library, so it must be + // pool-allocated. A non-NULL cache handle is also produced. + EXPECT_CALL (BaseCryptLibMock, GetTrustAnchorX509FromAuthData (_, _, _, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID **CacheHandle, CONST UINT8 *, UINTN, CONST UINT8 *, UINTN, UINT8 **TrustAnchor, UINTN *TrustAnchorSize) -> EFI_STATUS { + static const UINT8 CertBytes[] = { 0x30, 0x82, 0x01, 0x02 }; + *TrustAnchor = (UINT8 *)AllocateCopyPool (sizeof (CertBytes), CertBytes); + *TrustAnchorSize = sizeof (CertBytes); + if (CacheHandle != NULL) { + *CacheHandle = (VOID *)(UINTN)1; + } + + return EFI_SUCCESS; + } + ) + ); + + EXPECT_CALL (BaseCryptLibMock, FreeTrustAnchorX509Cache (_)).Times (1); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_TRUE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); + EXPECT_NE (Authority.Data, nullptr); +} + +// +// db contains an EFI_CERT_X509_SHA256 list with two entries, but neither +// entry recovers a trust anchor from the auth data (EFI_NOT_FOUND). The +// helper must walk both entries and the image must not be authorized. +// +TEST (IsCertAuthorizedTest, X509HashListNoTrustAnchor_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + std::vector Db; + + AppendSignatureList (Db, gEfiCertX509Sha256Guid, 0, kSha256EntrySize, 2); + + EXPECT_CALL (BaseCryptLibMock, GetTrustAnchorX509FromAuthData (_, _, _, _, _, _, _)) + .Times (2) + .WillRepeatedly (Return (EFI_NOT_FOUND)); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); + EXPECT_EQ (Authority.Data, nullptr); +} + +// +// db contains an EFI_CERT_X509_SHA256 list; the trust-anchor lookup +// fails with a hard error (not EFI_NOT_FOUND). The helper must fail +// closed and the image must not be authorized. +// +TEST (IsCertAuthorizedTest, X509HashListTrustAnchorLookupError_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + std::vector Db; + + AppendSignatureList (Db, gEfiCertX509Sha256Guid, 0, kSha256EntrySize, 1); + + EXPECT_CALL (BaseCryptLibMock, GetTrustAnchorX509FromAuthData (_, _, _, _, _, _, _)) + .WillOnce (Return (EFI_DEVICE_ERROR)); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); + EXPECT_EQ (Authority.Data, nullptr); +} + +// +// db contains an EFI_CERT_X509_SHA256 list; a trust anchor is recovered +// from the auth data, but its TBS hash is enrolled in dbx. The anchor +// must be skipped and, with no other entries, the image is not +// authorized. +// +TEST (IsCertAuthorizedTest, X509HashListTrustAnchorRevoked_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + std::vector Db; + + AppendSignatureList (Db, gEfiCertX509Sha256Guid, 0, kSha256EntrySize, 1); + + // dbx: one X509-SHA256 list holding the digest the mocked + // X509GetTbsCertHash produces for the recovered anchor (0xC3 * 32). + std::vector Dbx; + size_t DbxOff = AppendSignatureList (Dbx, gEfiCertX509Sha256Guid, 0, kSha256EntrySize, 1); + + SetEntryPayload (Dbx, DbxOff, 0, std::vector(kSha256DigestSize, 0xC3)); + + EXPECT_CALL (BaseCryptLibMock, GetTrustAnchorX509FromAuthData (_, _, _, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID **, CONST UINT8 *, UINTN, CONST UINT8 *, UINTN, UINT8 **TrustAnchor, UINTN *TrustAnchorSize) -> EFI_STATUS { + static const UINT8 CertBytes[] = { 0x30, 0x82, 0x01, 0x02 }; + *TrustAnchor = (UINT8 *)AllocateCopyPool (sizeof (CertBytes), CertBytes); + *TrustAnchorSize = sizeof (CertBytes); + return EFI_SUCCESS; + } + ) + ); + + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Digest, UINTN *DigestSize) -> EFI_STATUS { + std::memset (Digest, 0xC3, SHA256_DIGEST_SIZE); + *DigestSize = SHA256_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), Dbx.data (), Dbx.size () }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); + EXPECT_EQ (Authority.Data, nullptr); +} + +// +// db contains an EFI_CERT_X509_SHA256 list whose SignatureSize is only +// sizeof(EFI_GUID) -- no TBS-hash payload. The list must be skipped (no +// trust-anchor lookup attempted) and the image must not be authorized. +// +TEST (IsCertAuthorizedTest, X509HashListNoCertPayload_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + std::vector Db; + + AppendSignatureList (Db, gEfiCertX509Sha256Guid, 0, (UINT32)sizeof (EFI_GUID), 1); + + EXPECT_CALL (BaseCryptLibMock, GetTrustAnchorX509FromAuthData (_, _, _, _, _, _, _)).Times (0); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// +// db contains an EFI_CERT_X509_SHA256 list whose SignatureHeaderSize is +// inflated past the list payload, so SigListIterInit rejects it. The list +// must be skipped and the image must not be authorized. +// +TEST (IsCertAuthorizedTest, X509HashListMalformedHeader_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + const UINT32 EntrySize = kSha256EntrySize; + const UINT32 ListSize = (UINT32)(sizeof (EFI_SIGNATURE_LIST) + EntrySize); + std::vector Db (ListSize, 0); + + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)Db.data (); + + CopyMem (&List->SignatureType, &gEfiCertX509Sha256Guid, sizeof (EFI_GUID)); + List->SignatureListSize = ListSize; + List->SignatureHeaderSize = ListSize; // > ListSize - sizeof (EFI_SIGNATURE_LIST) + List->SignatureSize = EntrySize; + + EXPECT_CALL (BaseCryptLibMock, GetTrustAnchorX509FromAuthData (_, _, _, _, _, _, _)).Times (0); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_FALSE ( + IsCertAuthorized ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + &Databases, + &Authority + ) + ); +} + +// --------------------------------------------------------------------------- +// IsCertRevoked -- end-to-end PKCS#7 + dbx scenarios +// --------------------------------------------------------------------------- + +// +// Build a buffer in EFI_CERT_STACK format: +// UINT8 CertNumber; { UINT32 CertLen (LE); UINT8 CertData[CertLen]; } * N +// +static std::vector +MakeCertStack ( + const std::vector > &Certs + ) +{ + std::vector Buf; + + Buf.push_back ((UINT8)Certs.size ()); + for (const auto &Cert : Certs) { + UINT32 Len = (UINT32)Cert.size (); + Buf.push_back ((UINT8)(Len & 0xFF)); + Buf.push_back ((UINT8)((Len >> 8) & 0xFF)); + Buf.push_back ((UINT8)((Len >> 16) & 0xFF)); + Buf.push_back ((UINT8)((Len >> 24) & 0xFF)); + Buf.insert (Buf.end (), Cert.begin (), Cert.end ()); + } + + return Buf; +} + +// +// dbx contains an X.509 list whose entry AuthenticodeVerify accepts as +// a trust anchor for the cert's signature. Step 1 short-circuits and +// the cert is revoked. Pkcs7GetSigners must not be reached. +// +TEST (IsCertRevokedTest, DbxX509VerifiesSignature_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + size_t DbxOff = AppendSignatureList ( + Dbx, + gEfiCertX509Guid, + 0, + sizeof (EFI_GUID) + 16, + 1 + ); + + SetEntryPayload (Dbx, DbxOff, 0, std::vector(16, 0x11)); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)) + .WillOnce (Return (TRUE)); + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)).Times (0); + + EXPECT_TRUE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// dbx X.509 list does not verify the signature, and Pkcs7GetSigners +// reports no recoverable signer chain. The cert is not revoked. +// +TEST (IsCertRevokedTest, DbxX509DoesNotVerify_PkcsSignersFails_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + size_t DbxOff = AppendSignatureList ( + Dbx, + gEfiCertX509Guid, + 0, + sizeof (EFI_GUID) + 16, + 1 + ); + + SetEntryPayload (Dbx, DbxOff, 0, std::vector(16, 0x22)); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)) + .WillOnce (Return (FALSE)); + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce (Return (FALSE)); + + EXPECT_FALSE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// dbx has only hash-typed lists (no X.509 entries). Step 1 calls +// AuthenticodeVerify zero times; step 2 attempts the signer chain. +// +TEST (IsCertRevokedTest, DbxOnlyHashLists_PkcsSignersFails_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce (Return (FALSE)); + + EXPECT_FALSE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// dbx X.509 list whose SignatureSize equals sizeof(EFI_GUID) carries +// no cert payload; step 1 must skip the list rather than treating +// it as a verifying anchor. +// +TEST (IsCertRevokedTest, DbxX509ListNoCertPayload_StepOneSkipped_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertX509Guid, 0, sizeof (EFI_GUID), 1); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce (Return (FALSE)); + + EXPECT_FALSE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// dbx contains an X509-SHA256 list whose digest matches the TBS hash +// of the signer reported by Pkcs7GetSigners. Step 1 finds no verifying +// anchor; step 2 hashes the signer's TBS and IsTBSCertHashInDbx fires. +// +TEST (IsCertRevokedTest, SignerTBSHashInDbx_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + size_t DbxOff = AppendSignatureList ( + Dbx, + gEfiCertX509Sha256Guid, + 0, + kSha256EntrySize, + 1 + ); + + SetEntryPayload (Dbx, DbxOff, 0, std::vector(kSha256DigestSize, 0xE1)); + + static std::vector Stack = + MakeCertStack ( + { std::vector{ 0x11, 0x22, 0x33 } + } + ); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutStack, UINTN *OutStackLen, UINT8 **OutTrusted, UINTN *OutTrustedLen) -> BOOLEAN { + *OutStack = Stack.data (); + *OutStackLen = Stack.size (); + *OutTrusted = NULL; + *OutTrustedLen = 0; + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutTbs, UINTN *OutTbsSize) -> BOOLEAN { + static UINT8 Tbs[] = { 0x11 }; + *OutTbs = Tbs; + *OutTbsSize = sizeof (Tbs); + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Digest, UINTN *DigestSize) -> EFI_STATUS { + std::memset (Digest, 0xE1, SHA256_DIGEST_SIZE); + *DigestSize = SHA256_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, Pkcs7FreeSigners (_)).Times (1); + + EXPECT_TRUE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// Pkcs7GetSigners reports a single signer whose TBS hash is not in +// dbx. The cert is not revoked. +// +TEST (IsCertRevokedTest, SignerTBSHashNotInDbx_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + size_t DbxOff = AppendSignatureList ( + Dbx, + gEfiCertX509Sha256Guid, + 0, + kSha256EntrySize, + 1 + ); + + // Plant a digest that the mocked X509GetTbsCertHash will never produce. + SetEntryPayload (Dbx, DbxOff, 0, std::vector(kSha256DigestSize, 0xAA)); + + static std::vector Stack = + MakeCertStack ( + { std::vector{ 0x11, 0x22, 0x33 } + } + ); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutStack, UINTN *OutStackLen, UINT8 **OutTrusted, UINTN *OutTrustedLen) -> BOOLEAN { + *OutStack = Stack.data (); + *OutStackLen = Stack.size (); + *OutTrusted = NULL; + *OutTrustedLen = 0; + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutTbs, UINTN *OutTbsSize) -> BOOLEAN { + static UINT8 Tbs[] = { 0x11 }; + *OutTbs = Tbs; + *OutTbsSize = sizeof (Tbs); + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Digest, UINTN *DigestSize) -> EFI_STATUS { + std::memset (Digest, 0x77, SHA256_DIGEST_SIZE); + *DigestSize = SHA256_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, Pkcs7FreeSigners (_)).Times (1); + + EXPECT_FALSE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// Pkcs7GetSigners reports a non-NULL stack with CertNumber == 0. +// Step 2 has nothing to walk and the cert is not revoked. +// +TEST (IsCertRevokedTest, PkcsSignersEmptyStack_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + static std::vector EmptyStack = MakeCertStack ({ }); + + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutStack, UINTN *OutStackLen, UINT8 **OutTrusted, UINTN *OutTrustedLen) -> BOOLEAN { + *OutStack = EmptyStack.data (); + *OutStackLen = EmptyStack.size (); + *OutTrusted = NULL; + *OutTrustedLen = 0; + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, Pkcs7FreeSigners (_)).Times (1); + + EXPECT_FALSE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// X509GetTBSCert fails on the signer; treat the chain as poisoned. +// +TEST (IsCertRevokedTest, X509GetTBSCertFails_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + static std::vector Stack = + MakeCertStack ( + { std::vector{ 0x11, 0x22, 0x33 } + } + ); + + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutStack, UINTN *OutStackLen, UINT8 **OutTrusted, UINTN *OutTrustedLen) -> BOOLEAN { + *OutStack = Stack.data (); + *OutStackLen = Stack.size (); + *OutTrusted = NULL; + *OutTrustedLen = 0; + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)) + .WillOnce (Return (FALSE)); + EXPECT_CALL (BaseCryptLibMock, Pkcs7FreeSigners (_)).Times (1); + + EXPECT_TRUE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// Pkcs7GetSigners returns a stack whose CertNumber claims one cert +// but whose length field would run past the end of the buffer. Step 2 +// detects the malformed payload and treats the chain as poisoned. +// +TEST (IsCertRevokedTest, MalformedSignerStack_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + // CertNumber=1, length=0x10, but only 4 payload bytes follow. + static std::vector BadStack = { + 0x01, 0x10, 0x00, 0x00, 0x00, 0xAA, 0xBB, 0xCC, 0xDD + }; + + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutStack, UINTN *OutStackLen, UINT8 **OutTrusted, UINTN *OutTrustedLen) -> BOOLEAN { + *OutStack = BadStack.data (); + *OutStackLen = BadStack.size (); + *OutTrusted = NULL; + *OutTrustedLen = 0; + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, Pkcs7FreeSigners (_)).Times (1); + + EXPECT_TRUE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// Pkcs7GetSigners returns a stack that claims a signer but truncates the +// per-cert length prefix (fewer than 4 bytes remain). IsCertRevoked must +// fail closed and report the cert as revoked. +// +TEST (IsCertRevokedTest, MalformedSignerStackLengthPrefix_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + // CertNumber=1, but only 2 bytes follow -- fewer than the 4-byte length + // prefix the parser expects. + static std::vector BadStack = { 0x01, 0xAA, 0xBB }; + + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutStack, UINTN *OutStackLen, UINT8 **OutTrusted, UINTN *OutTrustedLen) -> BOOLEAN { + *OutStack = BadStack.data (); + *OutStackLen = BadStack.size (); + *OutTrusted = NULL; + *OutTrustedLen = 0; + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, Pkcs7FreeSigners (_)).Times (1); + + EXPECT_TRUE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// Both CertStack and TrustedCert are returned by Pkcs7GetSigners. +// Both must be freed exactly once via Pkcs7FreeSigners. +// +TEST (IsCertRevokedTest, BothPkcsBuffersFreed_ReturnsFalse) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + std::vector Dbx; + + AppendSignatureList (Dbx, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + static std::vector Stack = MakeCertStack ({ }); + static UINT8 TrustedCertBuf[] = { 0xDE, 0xAD, 0xBE, 0xEF }; + + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutStack, UINTN *OutStackLen, UINT8 **OutTrusted, UINTN *OutTrustedLen) -> BOOLEAN { + *OutStack = Stack.data (); + *OutStackLen = Stack.size (); + *OutTrusted = TrustedCertBuf; + *OutTrustedLen = sizeof (TrustedCertBuf); + return TRUE; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, Pkcs7FreeSigners (_)).Times (2); + + EXPECT_FALSE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// +// dbx is too small to contain even one EFI_SIGNATURE_LIST header, +// so DatabaseIterInit fails. Step 1 fails closed. +// +TEST (IsCertRevokedTest, MalformedDbx_ReturnsTrue) { + MockBaseCryptLib BaseCryptLibMock; + + std::vector AuthData (16, 0xA1); + std::vector ImageHash (SHA256_DIGEST_SIZE, 0x55); + + // Less than sizeof(EFI_SIGNATURE_LIST) -> DatabaseIterInit fails. + std::vector Dbx (4, 0); + + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)).Times (0); + + EXPECT_TRUE ( + IsCertRevoked ( + AuthData.data (), + AuthData.size (), + ImageHash.data (), + ImageHash.size (), + Dbx.data (), + Dbx.size () + ) + ); +} + +// --------------------------------------------------------------------------- +// GetImageCertAuthority -- prelude (GetWinCertificatePkcs7AuthData, +// GetAuthenticodeHashAlgorithm, GetHash) plus IsCertRevoked / IsCertAuthorized +// dispatch. +// --------------------------------------------------------------------------- + +// Build a PKCS_SIGNED_DATA WIN_CERTIFICATE wrapping `Payload`. +static std::vector +MakePkcsSignedDataCert ( + const std::vector &Payload + ) +{ + std::vector Buffer (sizeof (WIN_CERTIFICATE) + Payload.size (), 0); + WIN_CERTIFICATE *Cert = (WIN_CERTIFICATE *)Buffer.data (); + + Cert->dwLength = (UINT32)Buffer.size (); + Cert->wRevision = 0x0200; + Cert->wCertificateType = WIN_CERT_TYPE_PKCS_SIGNED_DATA; + std::memcpy (Buffer.data () + sizeof (WIN_CERTIFICATE), Payload.data (), Payload.size ()); + return Buffer; +} + +// Tiny throwaway "image" buffer for the digest cache; mocks of +// GetAuthenticodeHash never dereference it. +static UINT8 kFakeImage[16] = { 0 }; + +static void +InitImageCache ( + DIGEST_CACHE &Cache + ) +{ + ZeroMem (&Cache, sizeof (Cache)); + Cache.Type = DigestCacheTypeImage; + Cache.Buffer = kFakeImage; + Cache.BufferSize = sizeof (kFakeImage); +} + +TEST (GetImageCertAuthorityTest, NullCert_ReturnsInvalidParameter) { + DIGEST_CACHE Cache; + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + InitImageCache (Cache); + EXPECT_EQ (GetImageCertAuthority (NULL, &Cache, &Databases, &Authority), EFI_INVALID_PARAMETER); + EXPECT_EQ (Authority.Data, nullptr); +} + +TEST (GetImageCertAuthorityTest, NullCache_ReturnsInvalidParameter) { + std::vector CertBuf = MakePkcsSignedDataCert (std::vector(16, 0xA1)); + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + EXPECT_EQ ( + GetImageCertAuthority ( + (CONST WIN_CERTIFICATE *)CertBuf.data (), + NULL, + &Databases, + &Authority + ), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ (Authority.Data, nullptr); +} + +TEST (GetImageCertAuthorityTest, NullDatabases_ReturnsInvalidParameter) { + std::vector CertBuf = MakePkcsSignedDataCert (std::vector(16, 0xA1)); + DIGEST_CACHE Cache; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + InitImageCache (Cache); + EXPECT_EQ ( + GetImageCertAuthority ( + (CONST WIN_CERTIFICATE *)CertBuf.data (), + &Cache, + NULL, + &Authority + ), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ (Authority.Data, nullptr); +} + +// +// GetWinCertificatePkcs7AuthData fails (unsupported WIN_CERTIFICATE type) so +// the prelude bails before touching crypto. +// +TEST (GetImageCertAuthorityTest, UnsupportedCertType_ReturnsError) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + + WIN_CERTIFICATE Cert = { sizeof (WIN_CERTIFICATE) + 8, 0x0200, WIN_CERT_TYPE_EFI_PKCS115 }; + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + InitImageCache (Cache); + + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHashAlgorithm (_, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHash (_, _, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + + // A prelude failure is folded into EFI_ACCESS_DENIED; no hash algorithm was + // established so SignatureType is left as the zero GUID. + EXPECT_EQ (GetImageCertAuthority (&Cert, &Cache, &Databases, &Authority), EFI_ACCESS_DENIED); + EXPECT_EQ (Authority.Data, nullptr); + EXPECT_TRUE (IsZeroBuffer (&Authority.SignatureType, sizeof (EFI_GUID))); +} + +// +// GetAuthenticodeHashAlgorithm fails -> prelude bails, hash and verify are +// never invoked. +// +TEST (GetImageCertAuthorityTest, HashAlgorithmFails_ReturnsError) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + std::vector CertBuf = MakePkcsSignedDataCert (std::vector(16, 0xA1)); + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + InitImageCache (Cache); + + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHashAlgorithm (_, _, _)) + .WillOnce (Return (EFI_UNSUPPORTED)); + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHash (_, _, _, _, _)).Times (0); + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + + // A prelude failure is folded into EFI_ACCESS_DENIED with a zero SignatureType. + EXPECT_EQ ( + GetImageCertAuthority ( + (CONST WIN_CERTIFICATE *)CertBuf.data (), + &Cache, + &Databases, + &Authority + ), + EFI_ACCESS_DENIED + ); + EXPECT_EQ (Authority.Data, nullptr); + EXPECT_TRUE (IsZeroBuffer (&Authority.SignatureType, sizeof (EFI_GUID))); +} + +// +// GetAuthenticodeHash fails -> GetHash returns SECURITY_VIOLATION and the +// prelude bails before any revocation / authorization decision. +// +TEST (GetImageCertAuthorityTest, GetHashFails_ReturnsError) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + std::vector CertBuf = MakePkcsSignedDataCert (std::vector(16, 0xA1)); + + SIGNATURE_DATABASES Databases = { NULL, 0, NULL, 0 }; + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + InitImageCache (Cache); + + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHashAlgorithm (_, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, EFI_GUID *Out) -> EFI_STATUS { + CopyMem (Out, &gEfiCertSha256Guid, sizeof (EFI_GUID)); + return EFI_SUCCESS; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHash (_, _, _, _, _)) + .WillOnce (Return (EFI_DEVICE_ERROR)); + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)).Times (0); + + // GetHash failure is a prelude failure -> EFI_ACCESS_DENIED, zero SignatureType. + EXPECT_EQ ( + GetImageCertAuthority ( + (CONST WIN_CERTIFICATE *)CertBuf.data (), + &Cache, + &Databases, + &Authority + ), + EFI_ACCESS_DENIED + ); + EXPECT_EQ (Authority.Data, nullptr); + EXPECT_TRUE (IsZeroBuffer (&Authority.SignatureType, sizeof (EFI_GUID))); +} + +// +// Happy path: prelude succeeds, dbx is empty so IsCertRevoked returns FALSE, +// the first db trust anchor verifies via AuthenticodeVerify, and X509GetTBSCert +// succeeds. GetImageCertAuthority returns EFI_SUCCESS with a non-NULL authority. +// +TEST (GetImageCertAuthorityTest, AuthorizedByDb_ReturnsAuthority) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + std::vector CertBuf = MakePkcsSignedDataCert (std::vector(16, 0xA1)); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + InitImageCache (Cache); + + std::vector Db; + size_t DbOff = AppendSignatureList ( + Db, + gEfiCertX509Guid, + 0, + sizeof (EFI_GUID) + 16, + 1 + ); + + SetEntryPayload (Db, DbOff, 0, std::vector(16, 0x11)); + + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHashAlgorithm (_, _, _)) + .WillRepeatedly ( + Invoke ( + [] (CONST UINT8 *, UINTN, EFI_GUID *Out) -> EFI_STATUS { + CopyMem (Out, &gEfiCertSha256Guid, sizeof (EFI_GUID)); + return EFI_SUCCESS; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Out, UINTN *OutSize) -> EFI_STATUS { + SetMem (Out, kSha256DigestSize, 0x55); + *OutSize = kSha256DigestSize; + return EFI_SUCCESS; + } + ) + ); + + // dbx is empty so phase 1 of IsCertRevoked never calls AuthenticodeVerify; + // Pkcs7GetSigners returning FALSE skips phase 2. + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillRepeatedly (Return (FALSE)); + + // The single db anchor verifies the signature. + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)) + .WillOnce (Return (TRUE)); + EXPECT_CALL (BaseCryptLibMock, X509GetTBSCert (_, _, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, UINT8 **OutTbs, UINTN *OutTbsSize) -> BOOLEAN { + static UINT8 TbsBytes[] = { 0x11 }; + *OutTbs = TbsBytes; + *OutTbsSize = sizeof (TbsBytes); + return TRUE; + } + ) + ); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + EXPECT_EQ ( + GetImageCertAuthority ( + (CONST WIN_CERTIFICATE *)CertBuf.data (), + &Cache, + &Databases, + &Authority + ), + EFI_SUCCESS + ); + EXPECT_NE (Authority.Data, nullptr); +} + +// +// A dbx X.509 anchor verifies the signature: IsCertRevoked returns TRUE so +// the cert is skipped before IsCertAuthorized is consulted. +// +TEST (GetImageCertAuthorityTest, RevokedByDbx_ReturnsNoAuthority) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + std::vector CertBuf = MakePkcsSignedDataCert (std::vector(16, 0xA1)); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + InitImageCache (Cache); + + // dbx with a single X.509 anchor that AuthenticodeVerify accepts. + std::vector Dbx; + size_t DbxOff = AppendSignatureList ( + Dbx, + gEfiCertX509Guid, + 0, + sizeof (EFI_GUID) + 16, + 1 + ); + + SetEntryPayload (Dbx, DbxOff, 0, std::vector(16, 0xCC)); + + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHashAlgorithm (_, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, EFI_GUID *Out) -> EFI_STATUS { + CopyMem (Out, &gEfiCertSha256Guid, sizeof (EFI_GUID)); + return EFI_SUCCESS; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Out, UINTN *OutSize) -> EFI_STATUS { + SetMem (Out, kSha256DigestSize, 0x55); + *OutSize = kSha256DigestSize; + return EFI_SUCCESS; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)) + .WillOnce (Return (TRUE)); + + SIGNATURE_DATABASES Databases = { NULL, 0, Dbx.data (), Dbx.size () }; + + // Revocation by dbx -> EFI_ACCESS_DENIED. The hash algorithm was established + // before revocation, so SignatureType carries it for the rejection record. + EXPECT_EQ ( + GetImageCertAuthority ( + (CONST WIN_CERTIFICATE *)CertBuf.data (), + &Cache, + &Databases, + &Authority + ), + EFI_ACCESS_DENIED + ); + EXPECT_EQ (Authority.Data, nullptr); + EXPECT_TRUE (CompareGuid (&Authority.SignatureType, &gEfiCertSha256Guid)); +} + +// +// Prelude succeeds, dbx is empty (not revoked), but db has no trust anchor +// that verifies the signature, so IsCertAuthorized returns FALSE. +// +TEST (GetImageCertAuthorityTest, NotRevokedNotAuthorized_ReturnsNoAuthority) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + std::vector CertBuf = MakePkcsSignedDataCert (std::vector(16, 0xA1)); + + IMAGE_AUTHORITY Authority = { NULL, 0 }; + + InitImageCache (Cache); + + std::vector Db; + size_t DbOff = AppendSignatureList ( + Db, + gEfiCertX509Guid, + 0, + sizeof (EFI_GUID) + 16, + 2 + ); + + SetEntryPayload (Db, DbOff, 0, std::vector(16, 0x11)); + SetEntryPayload (Db, DbOff, 1, std::vector(16, 0x22)); + + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHashAlgorithm (_, _, _)) + .WillOnce ( + Invoke ( + [] (CONST UINT8 *, UINTN, EFI_GUID *Out) -> EFI_STATUS { + CopyMem (Out, &gEfiCertSha256Guid, sizeof (EFI_GUID)); + return EFI_SUCCESS; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] (VOID *, UINTN, CONST EFI_GUID *, UINT8 *Out, UINTN *OutSize) -> EFI_STATUS { + SetMem (Out, kSha256DigestSize, 0x55); + *OutSize = kSha256DigestSize; + return EFI_SUCCESS; + } + ) + ); + EXPECT_CALL (BaseCryptLibMock, Pkcs7GetSigners (_, _, _, _, _, _)) + .WillRepeatedly (Return (FALSE)); + EXPECT_CALL (BaseCryptLibMock, AuthenticodeVerify (_, _, _, _, _, _)) + .Times (2) + .WillRepeatedly (Return (FALSE)); + + SIGNATURE_DATABASES Databases = { Db.data (), Db.size (), NULL, 0 }; + + // Not revoked, but no db anchor authorizes -> EFI_NOT_FOUND. + EXPECT_EQ ( + GetImageCertAuthority ( + (CONST WIN_CERTIFICATE *)CertBuf.data (), + &Cache, + &Databases, + &Authority + ), + EFI_NOT_FOUND + ); + EXPECT_EQ (Authority.Data, nullptr); +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DxeImageVerificationLibGoogleTest.cpp b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DxeImageVerificationLibGoogleTest.cpp new file mode 100644 index 00000000000..b5e41cd9915 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DxeImageVerificationLibGoogleTest.cpp @@ -0,0 +1,24 @@ +/** @file + Integration tests for DxeImageVerificationHandler. + + Test cases in this file dispatch through RunVerificationScenario + declared in ScenarioHarness.h. The harness implementation, including + every mock and input builder, lives in ScenarioHarness.cpp so this + file stays limited to test bodies and the gtest entry point. + + Copyright (c) 2025, Yandex. All rights reserved. + Copyright (C) Microsoft Corporation. All rights reserved. + SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +int +main ( + int argc, + char *argv[] + ) +{ + testing::InitGoogleTest (&argc, argv); + return RUN_ALL_TESTS (); +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DxeImageVerificationLibGoogleTest.inf b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DxeImageVerificationLibGoogleTest.inf new file mode 100644 index 00000000000..1357c7662f7 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DxeImageVerificationLibGoogleTest.inf @@ -0,0 +1,78 @@ +## @file +# Unit test suite for the DxeImageVerificationLib using Google Test +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = DxeImageVerificationLibGoogleTest + FILE_GUID = 30170C3A-E353-4C8E-B20A-7D0E5E821FD8 + MODULE_TYPE = HOST_APPLICATION + VERSION_STRING = 1.0 + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = IA32 X64 +# + +[Sources] + DatabaseGoogleTest.cpp + DxeImageVerificationLibGoogleTest.cpp + IteratorGoogleTest.cpp + MeasurementGoogleTest.cpp + PolicyGoogleTest.cpp + SupportGoogleTest.cpp + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + SecurityPkg/SecurityPkg.dec + UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec + CryptoPkg/CryptoPkg.dec + +[LibraryClasses] + DxeImageVerificationLib + GoogleTestLib + BaseCryptLib + DebugLib + SecureBootVariableLib + +[Guids] + ## SOMETIMES_CONSUMES ## Variable:L"SecureBoot" + gEfiGlobalVariableGuid + + ## SOMETIMES_CONSUMES ## Variable:L"DB" + ## SOMETIMES_CONSUMES ## Variable:L"DBX" + ## PRODUCES ## SystemTable + ## CONSUMES ## SystemTable + gEfiImageSecurityDatabaseGuid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha1Guid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha256Guid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha384Guid + + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of the signature. + gEfiCertSha512Guid + + gEfiCertX509Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertX509Sha256Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertX509Sha384Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertX509Sha512Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the signature. + gEfiCertPkcs7Guid ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of the certificate. + +[Protocols] + gEfiFirmwareVolume2ProtocolGuid ## SOMETIMES_CONSUMES + gEfiBlockIoProtocolGuid ## SOMETIMES_CONSUMES + gEfiSimpleFileSystemProtocolGuid ## SOMETIMES_CONSUMES diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/IteratorGoogleTest.cpp b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/IteratorGoogleTest.cpp new file mode 100644 index 00000000000..23765fb5399 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/IteratorGoogleTest.cpp @@ -0,0 +1,590 @@ +/** @file + Unit tests for the iterators in Iterator.c: + DatabaseIterInit/Next, SigListIterInit/Next, and WinCertIterInit/Next. + + All three iterators follow the same contract: Init performs full + structural validation of the container, and Next is infallible after + a successful Init. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include + +#include +#include + +extern "C" { + #include + #include + #include + #include + #include "../Iterator.h" +} + +// --------------------------------------------------------------------------- +// Helpers for constructing synthetic signature-list buffers. +// --------------------------------------------------------------------------- + +// SHA-256 entry size: 16-byte owner GUID + 32-byte digest. +static constexpr UINT32 kSha256EntrySize = sizeof (EFI_GUID) + 32; + +// +// Append one EFI_SIGNATURE_LIST containing SignatureCount entries of +// EntrySize bytes each (entry payloads are zero-initialized) to Buffer. +// Returns the offset of the new list within Buffer. +// +static size_t +AppendSignatureList ( + std::vector &Buffer, + const EFI_GUID &SignatureType, + UINT32 SignatureHeaderSize, + UINT32 EntrySize, + UINT32 SignatureCount + ) +{ + const size_t PayloadBytes = (size_t)EntrySize * (size_t)SignatureCount; + const size_t ListBytes = sizeof (EFI_SIGNATURE_LIST) + SignatureHeaderSize + PayloadBytes; + const size_t Offset = Buffer.size (); + + Buffer.resize (Offset + ListBytes, 0); + + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)(Buffer.data () + Offset); + + CopyMem (&List->SignatureType, &SignatureType, sizeof (EFI_GUID)); + List->SignatureListSize = (UINT32)ListBytes; + List->SignatureHeaderSize = SignatureHeaderSize; + List->SignatureSize = EntrySize; + + return Offset; +} + +// --------------------------------------------------------------------------- +// DatabaseIterInit +// --------------------------------------------------------------------------- + +TEST (DatabaseIterInitTest, NullIter_ReturnsInvalidParameter) { + std::vector Buffer (16, 0); + + EXPECT_EQ (DatabaseIterInit (NULL, Buffer.data (), Buffer.size ()), EFI_INVALID_PARAMETER); +} + +TEST (DatabaseIterInitTest, NullBufferWithNonZeroSize_ReturnsInvalidParameter) { + SIG_DATABASE_ITER Iter; + + EXPECT_EQ (DatabaseIterInit (&Iter, NULL, 16), EFI_INVALID_PARAMETER); +} + +TEST (DatabaseIterInitTest, NullBufferWithZeroSize_Succeeds) { + SIG_DATABASE_ITER Iter; + + EXPECT_EQ (DatabaseIterInit (&Iter, NULL, 0), EFI_SUCCESS); + EXPECT_EQ (Iter.Remaining, (UINTN)0); + EXPECT_EQ (DatabaseIterNext (&Iter), nullptr); +} + +TEST (DatabaseIterInitTest, EmptyBuffer_Succeeds) { + std::vector Buffer; + SIG_DATABASE_ITER Iter; + + EXPECT_EQ (DatabaseIterInit (&Iter, Buffer.data (), 0), EFI_SUCCESS); + EXPECT_EQ (DatabaseIterNext (&Iter), nullptr); +} + +TEST (DatabaseIterInitTest, SingleWellFormedList_Succeeds) { + std::vector Buffer; + SIG_DATABASE_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 2); + + EXPECT_EQ (DatabaseIterInit (&Iter, Buffer.data (), Buffer.size ()), EFI_SUCCESS); +} + +TEST (DatabaseIterInitTest, TrailingBytesBelowHeader_ReturnsCorrupted) { + std::vector Buffer; + SIG_DATABASE_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + // Append a few stray bytes too small to be even a list header. + Buffer.resize (Buffer.size () + sizeof (EFI_SIGNATURE_LIST) - 1, 0); + + EXPECT_EQ (DatabaseIterInit (&Iter, Buffer.data (), Buffer.size ()), EFI_VOLUME_CORRUPTED); +} + +TEST (DatabaseIterInitTest, ListSizeBelowHeaderSize_ReturnsCorrupted) { + std::vector Buffer; + SIG_DATABASE_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + ((EFI_SIGNATURE_LIST *)Buffer.data ())->SignatureListSize = sizeof (EFI_SIGNATURE_LIST) - 1; + + EXPECT_EQ (DatabaseIterInit (&Iter, Buffer.data (), Buffer.size ()), EFI_VOLUME_CORRUPTED); +} + +TEST (DatabaseIterInitTest, ListSizeOverrunsBuffer_ReturnsCorrupted) { + std::vector Buffer; + SIG_DATABASE_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + ((EFI_SIGNATURE_LIST *)Buffer.data ())->SignatureListSize = (UINT32)(Buffer.size () + 1); + + EXPECT_EQ (DatabaseIterInit (&Iter, Buffer.data (), Buffer.size ()), EFI_VOLUME_CORRUPTED); +} + +// Init only checks the outer tiling; bad internals belong to SigListIterInit. +TEST (DatabaseIterInitTest, MalformedInternalsButValidTiling_Succeeds) { + std::vector Buffer; + SIG_DATABASE_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + // SignatureSize < sizeof(EFI_GUID) is internal corruption that + // DatabaseIterInit deliberately ignores. + ((EFI_SIGNATURE_LIST *)Buffer.data ())->SignatureSize = 1; + + EXPECT_EQ (DatabaseIterInit (&Iter, Buffer.data (), Buffer.size ()), EFI_SUCCESS); +} + +// --------------------------------------------------------------------------- +// DatabaseIterNext +// --------------------------------------------------------------------------- + +TEST (DatabaseIterNextTest, NullIter_ReturnsNull) { + EXPECT_EQ (DatabaseIterNext (NULL), nullptr); +} + +TEST (DatabaseIterNextTest, EmptyDatabase_ReturnsNull) { + SIG_DATABASE_ITER Iter; + + ASSERT_EQ (DatabaseIterInit (&Iter, NULL, 0), EFI_SUCCESS); + EXPECT_EQ (DatabaseIterNext (&Iter), nullptr); +} + +TEST (DatabaseIterNextTest, IteratesAllListsInOrder) { + std::vector Buffer; + SIG_DATABASE_ITER Iter; + size_t Off1, Off2, Off3; + + Off1 = AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + Off2 = AppendSignatureList (Buffer, gEfiCertX509Guid, 0, sizeof (EFI_GUID) + 8, 2); + Off3 = AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 3); + + ASSERT_EQ (DatabaseIterInit (&Iter, Buffer.data (), Buffer.size ()), EFI_SUCCESS); + + CONST EFI_SIGNATURE_LIST *L1 = DatabaseIterNext (&Iter); + CONST EFI_SIGNATURE_LIST *L2 = DatabaseIterNext (&Iter); + CONST EFI_SIGNATURE_LIST *L3 = DatabaseIterNext (&Iter); + CONST EFI_SIGNATURE_LIST *L4 = DatabaseIterNext (&Iter); + + EXPECT_EQ ((CONST UINT8 *)L1, Buffer.data () + Off1); + EXPECT_EQ ((CONST UINT8 *)L2, Buffer.data () + Off2); + EXPECT_EQ ((CONST UINT8 *)L3, Buffer.data () + Off3); + EXPECT_EQ (L4, nullptr); + + // Drained iterator stays drained. + EXPECT_EQ (DatabaseIterNext (&Iter), nullptr); +} + +// --------------------------------------------------------------------------- +// SigListIterInit +// --------------------------------------------------------------------------- + +TEST (SigListIterInitTest, NullIter_ReturnsInvalidParameter) { + std::vector Buffer; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + + EXPECT_EQ ( + SigListIterInit (NULL, (EFI_SIGNATURE_LIST *)Buffer.data ()), + EFI_INVALID_PARAMETER + ); +} + +TEST (SigListIterInitTest, NullList_ReturnsInvalidParameter) { + SIG_LIST_ITER Iter; + + EXPECT_EQ (SigListIterInit (&Iter, NULL), EFI_INVALID_PARAMETER); +} + +TEST (SigListIterInitTest, ListSizeBelowHeader_ReturnsCorrupted) { + std::vector Buffer; + SIG_LIST_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + ((EFI_SIGNATURE_LIST *)Buffer.data ())->SignatureListSize = sizeof (EFI_SIGNATURE_LIST) - 1; + + EXPECT_EQ ( + SigListIterInit (&Iter, (EFI_SIGNATURE_LIST *)Buffer.data ()), + EFI_VOLUME_CORRUPTED + ); +} + +TEST (SigListIterInitTest, SignatureSizeBelowGuid_ReturnsCorrupted) { + std::vector Buffer; + SIG_LIST_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + ((EFI_SIGNATURE_LIST *)Buffer.data ())->SignatureSize = sizeof (EFI_GUID) - 1; + + EXPECT_EQ ( + SigListIterInit (&Iter, (EFI_SIGNATURE_LIST *)Buffer.data ()), + EFI_VOLUME_CORRUPTED + ); +} + +TEST (SigListIterInitTest, HeaderSizeExceedsList_ReturnsCorrupted) { + std::vector Buffer; + SIG_LIST_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 1); + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)Buffer.data (); + + List->SignatureHeaderSize = List->SignatureListSize; // leaves no room + + EXPECT_EQ (SigListIterInit (&Iter, List), EFI_VOLUME_CORRUPTED); +} + +TEST (SigListIterInitTest, PayloadNotMultipleOfSignatureSize_ReturnsCorrupted) { + std::vector Buffer; + SIG_LIST_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 2); + // Trim one byte off SignatureListSize so payload no longer divides + // evenly into SignatureSize chunks. + ((EFI_SIGNATURE_LIST *)Buffer.data ())->SignatureListSize -= 1; + + EXPECT_EQ ( + SigListIterInit (&Iter, (EFI_SIGNATURE_LIST *)Buffer.data ()), + EFI_VOLUME_CORRUPTED + ); +} + +TEST (SigListIterInitTest, WellFormed_Succeeds) { + std::vector Buffer; + SIG_LIST_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 3); + + EXPECT_EQ ( + SigListIterInit (&Iter, (EFI_SIGNATURE_LIST *)Buffer.data ()), + EFI_SUCCESS + ); + EXPECT_EQ (Iter.Stride, (UINTN)kSha256EntrySize); + EXPECT_EQ (Iter.Remaining, (UINTN)3); +} + +// --------------------------------------------------------------------------- +// SigListIterNext +// --------------------------------------------------------------------------- + +TEST (SigListIterNextTest, NullIter_ReturnsNull) { + EXPECT_EQ (SigListIterNext (NULL), nullptr); +} + +TEST (SigListIterNextTest, EmptyList_ReturnsNull) { + std::vector Buffer; + SIG_LIST_ITER Iter; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, 0); + ASSERT_EQ ( + SigListIterInit (&Iter, (EFI_SIGNATURE_LIST *)Buffer.data ()), + EFI_SUCCESS + ); + + EXPECT_EQ (SigListIterNext (&Iter), nullptr); +} + +TEST (SigListIterNextTest, IteratesEntriesWithCorrectStride) { + std::vector Buffer; + SIG_LIST_ITER Iter; + const UINT32 EntryCount = 4; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, 0, kSha256EntrySize, EntryCount); + + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)Buffer.data (); + UINT8 *FirstEntry = + (UINT8 *)List + sizeof (EFI_SIGNATURE_LIST) + List->SignatureHeaderSize; + + ASSERT_EQ (SigListIterInit (&Iter, List), EFI_SUCCESS); + + for (UINT32 i = 0; i < EntryCount; i++) { + CONST EFI_SIGNATURE_DATA *Entry = SigListIterNext (&Iter); + ASSERT_NE (Entry, nullptr) << "entry " << i; + EXPECT_EQ ((CONST UINT8 *)Entry, FirstEntry + (size_t)i * kSha256EntrySize); + } + + EXPECT_EQ (SigListIterNext (&Iter), nullptr); + EXPECT_EQ (SigListIterNext (&Iter), nullptr); +} + +TEST (SigListIterNextTest, RespectsSignatureHeaderSize) { + std::vector Buffer; + SIG_LIST_ITER Iter; + const UINT32 HeaderSize = 12; + + AppendSignatureList (Buffer, gEfiCertSha256Guid, HeaderSize, kSha256EntrySize, 2); + + EFI_SIGNATURE_LIST *List = (EFI_SIGNATURE_LIST *)Buffer.data (); + + ASSERT_EQ (SigListIterInit (&Iter, List), EFI_SUCCESS); + + CONST EFI_SIGNATURE_DATA *Entry = SigListIterNext (&Iter); + + ASSERT_NE (Entry, nullptr); + EXPECT_EQ ( + (CONST UINT8 *)Entry, + (CONST UINT8 *)List + sizeof (EFI_SIGNATURE_LIST) + HeaderSize + ); +} + +// --------------------------------------------------------------------------- +// WinCertIter helpers +// --------------------------------------------------------------------------- + +// +// Build a synthetic PE/COFF "file" whose security directory immediately +// follows a header area. The returned dir VA/Size point into FileBuffer. +// +struct SyntheticImage { + std::vector FileBuffer; + EFI_IMAGE_DATA_DIRECTORY Dir; +}; + +// +// Append a single WIN_CERTIFICATE entry of total length dwLength +// (including the header) to Dir. dwLength is written as-is, so callers +// may inject malformed values for negative tests. +// +static void +AppendWinCert ( + std::vector &Dir, + UINT32 dwLength, + UINT16 wRevision, + UINT16 wCertificateType + ) +{ + const UINT32 Padded = (UINT32)ALIGN_VALUE (dwLength, 8); + const size_t Offset = Dir.size (); + + // Reserve the padded size so the next entry starts on an 8-byte boundary. + Dir.resize (Offset + Padded, 0); + + WIN_CERTIFICATE *Cert = (WIN_CERTIFICATE *)(Dir.data () + Offset); + + Cert->dwLength = dwLength; + Cert->wRevision = wRevision; + Cert->wCertificateType = wCertificateType; +} + +static SyntheticImage +BuildImageWithDir ( + const std::vector &DirContents + ) +{ + SyntheticImage Img; + + // 64 bytes of leading "header" so the dir VA is non-zero. + Img.FileBuffer.assign (64, 0); + Img.Dir.VirtualAddress = (UINT32)Img.FileBuffer.size (); + Img.Dir.Size = (UINT32)DirContents.size (); + Img.FileBuffer.insert ( + Img.FileBuffer.end (), + DirContents.begin (), + DirContents.end () + ); + + return Img; +} + +// --------------------------------------------------------------------------- +// WinCertIterInit +// --------------------------------------------------------------------------- + +TEST (WinCertIterInitTest, NullParams_ReturnInvalidParameter) { + WIN_CERT_ITER Iter; + std::vector File (64, 0); + EFI_IMAGE_DATA_DIRECTORY Dir = { 0, 0 }; + + EXPECT_EQ (WinCertIterInit (NULL, File.data (), File.size (), &Dir), EFI_INVALID_PARAMETER); + EXPECT_EQ (WinCertIterInit (&Iter, NULL, File.size (), &Dir), EFI_INVALID_PARAMETER); + EXPECT_EQ (WinCertIterInit (&Iter, File.data (), File.size (), NULL), EFI_INVALID_PARAMETER); +} + +TEST (WinCertIterInitTest, EmptyDirectory_Succeeds) { + WIN_CERT_ITER Iter; + std::vector File (64, 0); + EFI_IMAGE_DATA_DIRECTORY Dir = { 0, 0 }; + + EXPECT_EQ (WinCertIterInit (&Iter, File.data (), File.size (), &Dir), EFI_SUCCESS); + EXPECT_EQ (WinCertIterNext (&Iter), nullptr); +} + +TEST (WinCertIterInitTest, DirVirtualAddressPastEnd_ReturnsCorrupted) { + WIN_CERT_ITER Iter; + std::vector File (64, 0); + EFI_IMAGE_DATA_DIRECTORY Dir; + + Dir.VirtualAddress = (UINT32)(File.size () + 1); + Dir.Size = 0; + + EXPECT_EQ ( + WinCertIterInit (&Iter, File.data (), File.size (), &Dir), + EFI_VOLUME_CORRUPTED + ); +} + +TEST (WinCertIterInitTest, DirSizeOverrunsFile_ReturnsCorrupted) { + WIN_CERT_ITER Iter; + std::vector File (128, 0); + EFI_IMAGE_DATA_DIRECTORY Dir; + + Dir.VirtualAddress = 64; + Dir.Size = (UINT32)(File.size () - 64 + 1); + + EXPECT_EQ ( + WinCertIterInit (&Iter, File.data (), File.size (), &Dir), + EFI_VOLUME_CORRUPTED + ); +} + +TEST (WinCertIterInitTest, EntryDwLengthBelowHeader_ReturnsCorrupted) { + std::vector Dir; + + AppendWinCert (Dir, sizeof (WIN_CERTIFICATE), 0x0200, WIN_CERT_TYPE_PKCS_SIGNED_DATA); + // Corrupt dwLength after the fact. + ((WIN_CERTIFICATE *)Dir.data ())->dwLength = sizeof (WIN_CERTIFICATE) - 1; + + SyntheticImage Img = BuildImageWithDir (Dir); + WIN_CERT_ITER Iter; + + EXPECT_EQ ( + WinCertIterInit (&Iter, Img.FileBuffer.data (), Img.FileBuffer.size (), &Img.Dir), + EFI_VOLUME_CORRUPTED + ); +} + +TEST (WinCertIterInitTest, EntryDwLengthOverrunsRemaining_ReturnsCorrupted) { + std::vector Dir; + + AppendWinCert (Dir, sizeof (WIN_CERTIFICATE) + 8, 0x0200, WIN_CERT_TYPE_PKCS_SIGNED_DATA); + ((WIN_CERTIFICATE *)Dir.data ())->dwLength = (UINT32)Dir.size () + 1; + + SyntheticImage Img = BuildImageWithDir (Dir); + WIN_CERT_ITER Iter; + + EXPECT_EQ ( + WinCertIterInit (&Iter, Img.FileBuffer.data (), Img.FileBuffer.size (), &Img.Dir), + EFI_VOLUME_CORRUPTED + ); +} + +TEST (WinCertIterInitTest, WellFormedEntries_Succeeds) { + std::vector Dir; + + AppendWinCert (Dir, sizeof (WIN_CERTIFICATE) + 16, 0x0200, WIN_CERT_TYPE_PKCS_SIGNED_DATA); + AppendWinCert (Dir, sizeof (WIN_CERTIFICATE) + 32, 0x0200, WIN_CERT_TYPE_EFI_GUID); + + SyntheticImage Img = BuildImageWithDir (Dir); + WIN_CERT_ITER Iter; + + EXPECT_EQ ( + WinCertIterInit (&Iter, Img.FileBuffer.data (), Img.FileBuffer.size (), &Img.Dir), + EFI_SUCCESS + ); +} + +// +// A directory smaller than a WIN_CERTIFICATE header: the walk sees a +// non-zero Remaining that cannot hold another header and fails closed. +// +TEST (WinCertIterInitTest, TrailingBytesBelowHeader_ReturnsCorrupted) { + std::vector Dir (sizeof (WIN_CERTIFICATE) - 1, 0); + + SyntheticImage Img = BuildImageWithDir (Dir); + WIN_CERT_ITER Iter; + + EXPECT_EQ ( + WinCertIterInit (&Iter, Img.FileBuffer.data (), Img.FileBuffer.size (), &Img.Dir), + EFI_VOLUME_CORRUPTED + ); +} + +// --------------------------------------------------------------------------- +// WinCertIterNext +// --------------------------------------------------------------------------- + +TEST (WinCertIterNextTest, NullIter_ReturnsNull) { + EXPECT_EQ (WinCertIterNext (NULL), nullptr); +} + +TEST (WinCertIterNextTest, IteratesAllEntriesWithAlignment) { + std::vector Dir; + + // Three entries with different dwLength values (some not multiples of 8) + // to exercise the ALIGN_VALUE advance. + const UINT32 Len1 = sizeof (WIN_CERTIFICATE) + 5; // 13 -> aligned to 16 + const UINT32 Len2 = sizeof (WIN_CERTIFICATE) + 16; // 24 + const UINT32 Len3 = sizeof (WIN_CERTIFICATE) + 1; // 9 -> aligned to 16 + + AppendWinCert (Dir, Len1, 0x0200, WIN_CERT_TYPE_PKCS_SIGNED_DATA); + AppendWinCert (Dir, Len2, 0x0200, WIN_CERT_TYPE_PKCS_SIGNED_DATA); + AppendWinCert (Dir, Len3, 0x0200, WIN_CERT_TYPE_EFI_GUID); + + SyntheticImage Img = BuildImageWithDir (Dir); + WIN_CERT_ITER Iter; + + ASSERT_EQ ( + WinCertIterInit (&Iter, Img.FileBuffer.data (), Img.FileBuffer.size (), &Img.Dir), + EFI_SUCCESS + ); + + CONST UINT8 *Base = Img.FileBuffer.data () + Img.Dir.VirtualAddress; + CONST WIN_CERTIFICATE *C1 = WinCertIterNext (&Iter); + CONST WIN_CERTIFICATE *C2 = WinCertIterNext (&Iter); + CONST WIN_CERTIFICATE *C3 = WinCertIterNext (&Iter); + CONST WIN_CERTIFICATE *C4 = WinCertIterNext (&Iter); + + ASSERT_NE (C1, nullptr); + ASSERT_NE (C2, nullptr); + ASSERT_NE (C3, nullptr); + EXPECT_EQ ((CONST UINT8 *)C1, Base); + EXPECT_EQ ((CONST UINT8 *)C2, Base + ALIGN_VALUE (Len1, 8)); + EXPECT_EQ ((CONST UINT8 *)C3, Base + ALIGN_VALUE (Len1, 8) + ALIGN_VALUE (Len2, 8)); + EXPECT_EQ (C1->dwLength, Len1); + EXPECT_EQ (C2->dwLength, Len2); + EXPECT_EQ (C3->dwLength, Len3); + EXPECT_EQ (C4, nullptr); + + // Drained iterator stays drained. + EXPECT_EQ (WinCertIterNext (&Iter), nullptr); +} + +// +// A single entry whose dwLength consumes the entire (unpadded) directory: +// ALIGN_VALUE(dwLength, 8) exceeds the remaining bytes, exercising the +// clamp in both WinCertIterInit and WinCertIterNext. +// +TEST (WinCertIterNextTest, LastEntryUnpaddedClampsToRemaining) { + const UINT32 Len = sizeof (WIN_CERTIFICATE) + 4; // 12; ALIGN(12,8)=16 > 12 + std::vector Dir (Len, 0); + + WIN_CERTIFICATE *Cert = (WIN_CERTIFICATE *)Dir.data (); + + Cert->dwLength = Len; + Cert->wRevision = 0x0200; + Cert->wCertificateType = WIN_CERT_TYPE_PKCS_SIGNED_DATA; + + SyntheticImage Img = BuildImageWithDir (Dir); + WIN_CERT_ITER Iter; + + ASSERT_EQ ( + WinCertIterInit (&Iter, Img.FileBuffer.data (), Img.FileBuffer.size (), &Img.Dir), + EFI_SUCCESS + ); + + CONST WIN_CERTIFICATE *C = WinCertIterNext (&Iter); + + ASSERT_NE (C, nullptr); + EXPECT_EQ (C->dwLength, Len); + EXPECT_EQ (WinCertIterNext (&Iter), nullptr); +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/MeasurementGoogleTest.cpp b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/MeasurementGoogleTest.cpp new file mode 100644 index 00000000000..207f2c1a538 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/MeasurementGoogleTest.cpp @@ -0,0 +1,608 @@ +/** @file + Unit tests for the Secure Boot authority measurement helpers in + DxeImageVerificationLib (Measurement.c): GetMeasuredAuthorities, + AssignVariableName, AssignVendorGuid, IsSecureAuthorityVariable, + IsDataMeasured, AddDataMeasured, MeasureVariable, and SecureBootHook. + + The de-duplication helpers are exercised against a caller-supplied + MEASURED_AUTHORITIES instance so no module-global state is relied upon, + and the PCR 7 extend path is exercised against a mocked + TpmMeasureAndLogData. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include + +#include + +extern "C" { + #include + #include + #include + #include + #include + #include + #include "../DxeImageVerificationLib.h" + + CHAR16 * + AssignVariableName ( + IN CHAR16 *VariableName + ); + + EFI_GUID * + AssignVendorGuid ( + IN EFI_GUID *VendorGuid + ); + + BOOLEAN + IsSecureAuthorityVariable ( + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid + ); + + BOOLEAN + IsDataMeasured ( + IN CONST MEASURED_AUTHORITIES *Measured, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN VOID *Data, + IN UINTN Size + ); + + EFI_STATUS + AddDataMeasured ( + IN OUT MEASURED_AUTHORITIES *Measured, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN VOID *Data, + IN UINTN Size + ); + + EFI_STATUS + MeasureVariable ( + IN CHAR16 *VarName, + IN EFI_GUID *VendorGuid, + IN VOID *VarData, + IN UINTN VarSize + ); + + VOID + SecureBootHook ( + IN OUT MEASURED_AUTHORITIES *Measured, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN CONST IMAGE_AUTHORITY *Authority + ); +} + +using ::testing::_; +using ::testing::Return; + +// +// The growth increment from Measurement.c. Kept in sync here so the list +// growth path can be exercised without exposing the module constant. +// +#define TEST_AUTHORITY_COUNT_INCREMENT 0x100 + +// +// A known Secure Boot authority variable name. The cast drops the char16_t +// literal's const qualifier so it matches the non-const parameter type of the +// helpers under test. +// +static CHAR16 *mDbName = (CHAR16 *)u"db"; + +// +// A vendor GUID that is not a Secure Boot authority vendor GUID. +// +static EFI_GUID mNonAuthorityGuid = { + 0x12345678, 0x1234, 0x1234, { 0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0 } +}; + +// +// A variable name that is not a Secure Boot authority variable name. +// +static CHAR16 *mNonAuthorityName = (CHAR16 *)u"NotADb"; + +// +// Free every Data copy and the backing list of a MEASURED_AUTHORITIES that was +// populated through AddDataMeasured, and reset it to the empty state. +// +static void +FreeMeasured ( + MEASURED_AUTHORITIES &Measured + ) +{ + if (Measured.List != NULL) { + for (UINTN Index = 0; Index < Measured.Count; Index++) { + if (Measured.List[Index].Data != NULL) { + FreePool (Measured.List[Index].Data); + } + } + + FreePool (Measured.List); + } + + Measured.List = NULL; + Measured.Count = 0; + Measured.Max = 0; +} + +// --------------------------------------------------------------------------- +// GetMeasuredAuthorities +// --------------------------------------------------------------------------- + +class GetMeasuredAuthoritiesTest : public ::testing::Test { +protected: + MockTpmMeasurementLib TpmMock; +}; + +TEST_F (GetMeasuredAuthoritiesTest, ReflectsSecureBootHookUpdates) { + UINT8 Data[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + IMAGE_AUTHORITY Authority; + + Authority.Data = (EFI_SIGNATURE_DATA *)Data; + Authority.Size = sizeof (Data); + + // + // The module-global state starts empty: no list is allocated and nothing + // has been measured yet. + // + MEASURED_AUTHORITIES *Measured = GetMeasuredAuthorities (); + + ASSERT_NE (Measured, nullptr); + EXPECT_EQ (Measured->List, nullptr); + EXPECT_EQ (Measured->Count, (UINTN)0); + + EXPECT_CALL ( + TpmMock, + TpmMeasureAndLogData ((UINT32)7, (UINT32)EV_EFI_VARIABLE_AUTHORITY, _, _, _, _) + ) + .WillOnce (Return (EFI_SUCCESS)); + + SecureBootHook (Measured, mDbName, &gEfiImageSecurityDatabaseGuid, &Authority); + + // + // The same global instance is returned and now reflects the measured + // authority recorded by SecureBootHook. + // + MEASURED_AUTHORITIES *Updated = GetMeasuredAuthorities (); + + EXPECT_EQ (Updated, Measured); + EXPECT_NE (Updated->List, nullptr); + EXPECT_EQ (Updated->Count, (UINTN)1); + EXPECT_TRUE ( + IsDataMeasured (Updated, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)) + ); + + FreeMeasured (*Updated); +} + +// --------------------------------------------------------------------------- +// AssignVariableName +// --------------------------------------------------------------------------- + +class AssignVariableNameTest : public ::testing::Test { +}; + +TEST_F (AssignVariableNameTest, NullName_ReturnsNull) { + EXPECT_EQ (AssignVariableName (NULL), nullptr); +} + +TEST_F (AssignVariableNameTest, UnknownName_ReturnsNull) { + EXPECT_EQ (AssignVariableName (mNonAuthorityName), nullptr); +} + +TEST_F (AssignVariableNameTest, KnownName_ReturnsCanonicalStorage) { + CHAR16 Local[] = { u'd', u'b', u'\0' }; + + CHAR16 *First = AssignVariableName (Local); + CHAR16 *Second = AssignVariableName (mDbName); + + // + // A known name resolves to canonical storage owned by the module, so the + // returned pointer must be independent of the caller's buffer and stable. + // + EXPECT_NE (First, nullptr); + EXPECT_NE (First, Local); + EXPECT_EQ (First, Second); + EXPECT_EQ (StrCmp (First, mDbName), 0); +} + +// --------------------------------------------------------------------------- +// AssignVendorGuid +// --------------------------------------------------------------------------- + +class AssignVendorGuidTest : public ::testing::Test { +}; + +TEST_F (AssignVendorGuidTest, NullGuid_ReturnsNull) { + EXPECT_EQ (AssignVendorGuid (NULL), nullptr); +} + +TEST_F (AssignVendorGuidTest, UnknownGuid_ReturnsNull) { + EXPECT_EQ (AssignVendorGuid (&mNonAuthorityGuid), nullptr); +} + +TEST_F (AssignVendorGuidTest, KnownGuid_ReturnsCanonicalStorage) { + EFI_GUID Local; + + CopyGuid (&Local, &gEfiImageSecurityDatabaseGuid); + + EFI_GUID *First = AssignVendorGuid (&Local); + EFI_GUID *Second = AssignVendorGuid (&gEfiImageSecurityDatabaseGuid); + + EXPECT_NE (First, nullptr); + EXPECT_NE (First, &Local); + EXPECT_EQ (First, Second); + EXPECT_TRUE (CompareGuid (First, &gEfiImageSecurityDatabaseGuid)); +} + +// --------------------------------------------------------------------------- +// IsSecureAuthorityVariable +// --------------------------------------------------------------------------- + +class IsSecureAuthorityVariableTest : public ::testing::Test { +}; + +TEST_F (IsSecureAuthorityVariableTest, NullArgs_ReturnFalse) { + EXPECT_FALSE (IsSecureAuthorityVariable (NULL, &gEfiImageSecurityDatabaseGuid)); + EXPECT_FALSE (IsSecureAuthorityVariable (mDbName, NULL)); +} + +TEST_F (IsSecureAuthorityVariableTest, KnownNameAndGuid_ReturnsTrue) { + EXPECT_TRUE (IsSecureAuthorityVariable (mDbName, &gEfiImageSecurityDatabaseGuid)); +} + +TEST_F (IsSecureAuthorityVariableTest, KnownNameWrongGuid_ReturnsFalse) { + EXPECT_FALSE (IsSecureAuthorityVariable (mDbName, &mNonAuthorityGuid)); +} + +TEST_F (IsSecureAuthorityVariableTest, WrongNameKnownGuid_ReturnsFalse) { + EXPECT_FALSE (IsSecureAuthorityVariable (mNonAuthorityName, &gEfiImageSecurityDatabaseGuid)); +} + +// --------------------------------------------------------------------------- +// IsDataMeasured / AddDataMeasured +// --------------------------------------------------------------------------- + +class MeasuredListTest : public ::testing::Test { +protected: + MEASURED_AUTHORITIES Measured = { NULL, 0, 0 }; + + void + TearDown ( + ) override + { + FreeMeasured (Measured); + } +}; + +TEST_F (MeasuredListTest, IsDataMeasured_NullArgs_ReturnFalse) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + EXPECT_FALSE (IsDataMeasured (NULL, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data))); + EXPECT_FALSE (IsDataMeasured (&Measured, NULL, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data))); + EXPECT_FALSE (IsDataMeasured (&Measured, mDbName, NULL, Data, sizeof (Data))); + EXPECT_FALSE (IsDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, NULL, sizeof (Data))); +} + +TEST_F (MeasuredListTest, IsDataMeasured_EmptyList_ReturnsFalse) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + EXPECT_FALSE ( + IsDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)) + ); +} + +TEST_F (MeasuredListTest, AddDataMeasured_NullOrZeroArgs_ReturnInvalidParameter) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + EXPECT_EQ ( + AddDataMeasured (NULL, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ ( + AddDataMeasured (&Measured, NULL, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ ( + AddDataMeasured (&Measured, mDbName, NULL, Data, sizeof (Data)), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ ( + AddDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, NULL, sizeof (Data)), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ ( + AddDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, 0), + EFI_INVALID_PARAMETER + ); + + EXPECT_EQ (Measured.Count, (UINTN)0); +} + +TEST_F (MeasuredListTest, AddDataMeasured_RecordsEntry) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + EXPECT_EQ ( + AddDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_SUCCESS + ); + + ASSERT_EQ (Measured.Count, (UINTN)1); + EXPECT_EQ (Measured.List[0].Size, (UINTN)sizeof (Data)); + + // + // A private copy of the data is stored, and the name / GUID are canonicalized + // to module-owned storage. + // + EXPECT_NE (Measured.List[0].Data, (VOID *)Data); + EXPECT_EQ (CompareMem (Measured.List[0].Data, Data, sizeof (Data)), 0); + EXPECT_EQ (Measured.List[0].VariableName, AssignVariableName (mDbName)); + EXPECT_EQ (Measured.List[0].VendorGuid, AssignVendorGuid (&gEfiImageSecurityDatabaseGuid)); +} + +TEST_F (MeasuredListTest, IsDataMeasured_MatchingEntry_ReturnsTrue) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + ASSERT_EQ ( + AddDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_SUCCESS + ); + + EXPECT_TRUE ( + IsDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)) + ); +} + +TEST_F (MeasuredListTest, IsDataMeasured_DifferentSize_ReturnsFalse) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + ASSERT_EQ ( + AddDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_SUCCESS + ); + + EXPECT_FALSE ( + IsDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data) - 1) + ); +} + +TEST_F (MeasuredListTest, IsDataMeasured_DifferentData_ReturnsFalse) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + UINT8 Other[4] = { 1, 2, 3, 5 }; + + ASSERT_EQ ( + AddDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_SUCCESS + ); + + EXPECT_FALSE ( + IsDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Other, sizeof (Other)) + ); +} + +TEST_F (MeasuredListTest, IsDataMeasured_DifferentGuid_ReturnsFalse) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + ASSERT_EQ ( + AddDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_SUCCESS + ); + + EXPECT_FALSE ( + IsDataMeasured (&Measured, mDbName, &mNonAuthorityGuid, Data, sizeof (Data)) + ); +} + +TEST_F (MeasuredListTest, AddDataMeasured_GrowsListAcrossIncrement) { + // + // Add one more than the growth increment so the backing list must be + // reallocated at least once, and confirm every entry remains tracked. + // + const UINTN Total = TEST_AUTHORITY_COUNT_INCREMENT + 1; + + for (UINTN Index = 0; Index < Total; Index++) { + UINT32 Data = (UINT32)Index; + + ASSERT_EQ ( + AddDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, &Data, sizeof (Data)), + EFI_SUCCESS + ); + } + + EXPECT_EQ (Measured.Count, Total); + EXPECT_GE (Measured.Max, Total); + + for (UINTN Index = 0; Index < Total; Index++) { + UINT32 Data = (UINT32)Index; + + EXPECT_TRUE ( + IsDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, &Data, sizeof (Data)) + ); + } +} + +// --------------------------------------------------------------------------- +// MeasureVariable +// --------------------------------------------------------------------------- + +class MeasureVariableTest : public ::testing::Test { +protected: + MockTpmMeasurementLib TpmMock; +}; + +TEST_F (MeasureVariableTest, NullArgs_ReturnInvalidParameter) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + EXPECT_EQ ( + MeasureVariable (NULL, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ ( + MeasureVariable (mDbName, NULL, Data, sizeof (Data)), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ ( + MeasureVariable (mDbName, &gEfiImageSecurityDatabaseGuid, NULL, sizeof (Data)), + EFI_INVALID_PARAMETER + ); +} + +TEST_F (MeasureVariableTest, Success_ExtendsPcr7AsVariableAuthority) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + EXPECT_CALL ( + TpmMock, + TpmMeasureAndLogData ( + (UINT32)7, + (UINT32)EV_EFI_VARIABLE_AUTHORITY, + _, + _, + _, + _ + ) + ) + .WillOnce (Return (EFI_SUCCESS)); + + EXPECT_EQ ( + MeasureVariable (mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_SUCCESS + ); +} + +TEST_F (MeasureVariableTest, MeasureFails_PropagatesError) { + UINT8 Data[4] = { 1, 2, 3, 4 }; + + EXPECT_CALL (TpmMock, TpmMeasureAndLogData (_, _, _, _, _, _)) + .WillOnce (Return (EFI_DEVICE_ERROR)); + + EXPECT_EQ ( + MeasureVariable (mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)), + EFI_DEVICE_ERROR + ); +} + +// --------------------------------------------------------------------------- +// SecureBootHook +// --------------------------------------------------------------------------- + +class SecureBootHookTest : public ::testing::Test { +protected: + MockTpmMeasurementLib TpmMock; + MEASURED_AUTHORITIES Measured = { NULL, 0, 0 }; + + void + TearDown ( + ) override + { + FreeMeasured (Measured); + } + + static IMAGE_AUTHORITY + MakeAuthority ( + const EFI_SIGNATURE_DATA *Data, + UINTN Size + ) + { + IMAGE_AUTHORITY Authority; + + Authority.Data = Data; + Authority.Size = Size; + return Authority; + } +}; + +TEST_F (SecureBootHookTest, NullMeasured_NoOp) { + UINT8 Data[8] = { 0 }; + IMAGE_AUTHORITY Authority = MakeAuthority ((EFI_SIGNATURE_DATA *)Data, sizeof (Data)); + + EXPECT_CALL (TpmMock, TpmMeasureAndLogData (_, _, _, _, _, _)).Times (0); + + SecureBootHook (NULL, mDbName, &gEfiImageSecurityDatabaseGuid, &Authority); +} + +TEST_F (SecureBootHookTest, NullAuthority_NoOp) { + EXPECT_CALL (TpmMock, TpmMeasureAndLogData (_, _, _, _, _, _)).Times (0); + + SecureBootHook (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, NULL); + EXPECT_EQ (Measured.Count, (UINTN)0); +} + +TEST_F (SecureBootHookTest, AuthorityWithNullDataOrZeroSize_NoOp) { + UINT8 Data[8] = { 0 }; + IMAGE_AUTHORITY NullData = MakeAuthority (NULL, sizeof (Data)); + IMAGE_AUTHORITY ZeroSize = MakeAuthority ((EFI_SIGNATURE_DATA *)Data, 0); + + EXPECT_CALL (TpmMock, TpmMeasureAndLogData (_, _, _, _, _, _)).Times (0); + + SecureBootHook (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, &NullData); + SecureBootHook (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, &ZeroSize); + EXPECT_EQ (Measured.Count, (UINTN)0); +} + +TEST_F (SecureBootHookTest, NonAuthorityVariable_NoOp) { + UINT8 Data[8] = { 0 }; + IMAGE_AUTHORITY Authority = MakeAuthority ((EFI_SIGNATURE_DATA *)Data, sizeof (Data)); + + EXPECT_CALL (TpmMock, TpmMeasureAndLogData (_, _, _, _, _, _)).Times (0); + + SecureBootHook (&Measured, mNonAuthorityName, &gEfiImageSecurityDatabaseGuid, &Authority); + EXPECT_EQ (Measured.Count, (UINTN)0); +} + +TEST_F (SecureBootHookTest, FirstMeasure_RecordsAndExtends) { + UINT8 Data[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + IMAGE_AUTHORITY Authority = MakeAuthority ((EFI_SIGNATURE_DATA *)Data, sizeof (Data)); + + EXPECT_CALL ( + TpmMock, + TpmMeasureAndLogData ((UINT32)7, (UINT32)EV_EFI_VARIABLE_AUTHORITY, _, _, _, _) + ) + .WillOnce (Return (EFI_SUCCESS)); + + SecureBootHook (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, &Authority); + + EXPECT_EQ (Measured.Count, (UINTN)1); + EXPECT_TRUE ( + IsDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)) + ); +} + +TEST_F (SecureBootHookTest, DuplicateMeasure_ExtendsOnce) { + UINT8 Data[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + IMAGE_AUTHORITY Authority = MakeAuthority ((EFI_SIGNATURE_DATA *)Data, sizeof (Data)); + + // + // An already-measured authority must not be extended a second time. + // + EXPECT_CALL ( + TpmMock, + TpmMeasureAndLogData ((UINT32)7, (UINT32)EV_EFI_VARIABLE_AUTHORITY, _, _, _, _) + ) + .Times (1) + .WillOnce (Return (EFI_SUCCESS)); + + SecureBootHook (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, &Authority); + SecureBootHook (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, &Authority); + + EXPECT_EQ (Measured.Count, (UINTN)1); +} + +TEST_F (SecureBootHookTest, MeasureFails_NotRecorded) { + UINT8 Data[8] = { 1, 2, 3, 4, 5, 6, 7, 8 }; + IMAGE_AUTHORITY Authority = MakeAuthority ((EFI_SIGNATURE_DATA *)Data, sizeof (Data)); + + EXPECT_CALL (TpmMock, TpmMeasureAndLogData (_, _, _, _, _, _)) + .WillOnce (Return (EFI_DEVICE_ERROR)); + + SecureBootHook (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, &Authority); + + EXPECT_EQ (Measured.Count, (UINTN)0); + EXPECT_FALSE ( + IsDataMeasured (&Measured, mDbName, &gEfiImageSecurityDatabaseGuid, Data, sizeof (Data)) + ); +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/PolicyGoogleTest.cpp b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/PolicyGoogleTest.cpp new file mode 100644 index 00000000000..182e286ed7e --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/PolicyGoogleTest.cpp @@ -0,0 +1,215 @@ +/** @file + Unit tests for the Image Verification Library policy resolution helpers. + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include + +extern "C" { + #include + #include + #include + #include + #include + + // + // Authorization policy bit definition + // + #define ALWAYS_EXECUTE 0x00000000 + #define DENY_EXECUTE_ON_SECURITY_VIOLATION 0x00000001 + + // + // Image type definitions + // + #define IMAGE_UNKNOWN 0x00000000 + #define IMAGE_FROM_FV 0x00000001 + + EFI_STATUS + IsFromFv ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File + ); + + EFI_STATUS + GetImageType ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File, + OUT UINT32 *ImageType + ); + + UINT32 + GetPolicyForImageType ( + IN UINT32 ImageType + ); + + EFI_STATUS + GetExecutionPolicy ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File, + OUT UINT32 *Policy + ); +} + +using ::testing::_; +using ::testing::Return; + +// +// A minimal stand-in for an EFI_DEVICE_PATH_PROTOCOL. The address is the +// only thing the helpers care about because LocateDevicePath / +// OpenProtocol are fully mocked. +// +static EFI_DEVICE_PATH_PROTOCOL mDevicePath; + +class PolicyTest : public ::testing::Test { +protected: + MockUefiBootServicesTableLib BsMock; +}; + +// --------------------------------------------------------------------------- +// IsFromFv +// --------------------------------------------------------------------------- + +TEST_F (PolicyTest, IsFromFv_NullArg_ReturnsInvalidParameter) { + EXPECT_EQ (IsFromFv (NULL), EFI_INVALID_PARAMETER); +} + +TEST_F (PolicyTest, IsFromFv_LocateFails_ReturnsNotFound) { + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (Return (EFI_NOT_FOUND)); + + EXPECT_EQ (IsFromFv (&mDevicePath), EFI_NOT_FOUND); +} + +TEST_F (PolicyTest, IsFromFv_OpenFails_ReturnsNotFound) { + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (Return (EFI_SUCCESS)); + EXPECT_CALL (BsMock, gBS_OpenProtocol) + .WillOnce (Return (EFI_UNSUPPORTED)); + + EXPECT_EQ (IsFromFv (&mDevicePath), EFI_NOT_FOUND); +} + +TEST_F (PolicyTest, IsFromFv_Success_ReturnsSuccess) { + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (Return (EFI_SUCCESS)); + EXPECT_CALL (BsMock, gBS_OpenProtocol) + .WillOnce (Return (EFI_SUCCESS)); + + EXPECT_EQ (IsFromFv (&mDevicePath), EFI_SUCCESS); +} + +// --------------------------------------------------------------------------- +// GetImageType +// --------------------------------------------------------------------------- + +TEST_F (PolicyTest, GetImageType_NullArgs_ReturnsInvalidParameter) { + UINT32 ImageType = IMAGE_UNKNOWN; + + EXPECT_EQ (GetImageType (NULL, &ImageType), EFI_INVALID_PARAMETER); + EXPECT_EQ (GetImageType (&mDevicePath, NULL), EFI_INVALID_PARAMETER); +} + +TEST_F (PolicyTest, GetImageType_FirmwareVolume_ReturnsFv) { + UINT32 ImageType = IMAGE_UNKNOWN; + + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (Return (EFI_SUCCESS)); + EXPECT_CALL (BsMock, gBS_OpenProtocol) + .WillOnce (Return (EFI_SUCCESS)); + + EXPECT_EQ (GetImageType (&mDevicePath, &ImageType), EFI_SUCCESS); + EXPECT_EQ (ImageType, (UINT32)IMAGE_FROM_FV); +} + +TEST_F (PolicyTest, GetImageType_NotFv_ReturnsUnknown) { + UINT32 ImageType = IMAGE_FROM_FV; // Pre-populate to confirm reset. + + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (Return (EFI_NOT_FOUND)); + + EXPECT_EQ (GetImageType (&mDevicePath, &ImageType), EFI_SUCCESS); + EXPECT_EQ (ImageType, (UINT32)IMAGE_UNKNOWN); +} + +TEST_F (PolicyTest, GetImageType_LocateSucceedsOpenFails_ReturnsUnknown) { + // + // Exercises the OpenProtocol-failure branch of IsFromFv via the + // GetImageType orchestrator: LocateDevicePath resolves a handle but + // the protocol is not actually present. + // + UINT32 ImageType = IMAGE_FROM_FV; + + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (Return (EFI_SUCCESS)); + EXPECT_CALL (BsMock, gBS_OpenProtocol) + .WillOnce (Return (EFI_UNSUPPORTED)); + + EXPECT_EQ (GetImageType (&mDevicePath, &ImageType), EFI_SUCCESS); + EXPECT_EQ (ImageType, (UINT32)IMAGE_UNKNOWN); +} + +// --------------------------------------------------------------------------- +// GetPolicyForImageType +// --------------------------------------------------------------------------- + +TEST_F (PolicyTest, GetPolicyForImageType_Fv_ReturnsAlwaysExecute) { + EXPECT_EQ (GetPolicyForImageType (IMAGE_FROM_FV), (UINT32)ALWAYS_EXECUTE); +} + +TEST_F (PolicyTest, GetPolicyForImageType_Unknown_FailsClosed) { + EXPECT_EQ ( + GetPolicyForImageType (IMAGE_UNKNOWN), + (UINT32)DENY_EXECUTE_ON_SECURITY_VIOLATION + ); +} + +TEST_F (PolicyTest, GetPolicyForImageType_OtherValue_FailsClosed) { + EXPECT_EQ ( + GetPolicyForImageType (0xDEADBEEF), + (UINT32)DENY_EXECUTE_ON_SECURITY_VIOLATION + ); +} + +// --------------------------------------------------------------------------- +// GetExecutionPolicy +// --------------------------------------------------------------------------- + +TEST_F (PolicyTest, GetExecutionPolicy_NullArgs_ReturnsInvalidParameter) { + UINT32 Policy = ALWAYS_EXECUTE; + + EXPECT_EQ (GetExecutionPolicy (NULL, &Policy), EFI_INVALID_PARAMETER); + EXPECT_EQ (GetExecutionPolicy (&mDevicePath, NULL), EFI_INVALID_PARAMETER); +} + +TEST_F (PolicyTest, GetExecutionPolicy_FirmwareVolume_ReturnsAlwaysExecute) { + UINT32 Policy = DENY_EXECUTE_ON_SECURITY_VIOLATION; + + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (Return (EFI_SUCCESS)); + EXPECT_CALL (BsMock, gBS_OpenProtocol) + .WillOnce (Return (EFI_SUCCESS)); + + EXPECT_EQ (GetExecutionPolicy (&mDevicePath, &Policy), EFI_SUCCESS); + EXPECT_EQ (Policy, (UINT32)ALWAYS_EXECUTE); +} + +TEST_F (PolicyTest, GetExecutionPolicy_NonFv_FailsClosed) { + UINT32 Policy = ALWAYS_EXECUTE; + + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (Return (EFI_NOT_FOUND)); + + EXPECT_EQ (GetExecutionPolicy (&mDevicePath, &Policy), EFI_SUCCESS); + EXPECT_EQ (Policy, (UINT32)DENY_EXECUTE_ON_SECURITY_VIOLATION); +} + +TEST_F (PolicyTest, GetExecutionPolicy_LocateSucceedsOpenFails_FailsClosed) { + UINT32 Policy = ALWAYS_EXECUTE; + + EXPECT_CALL (BsMock, gBS_LocateDevicePath) + .WillOnce (Return (EFI_SUCCESS)); + EXPECT_CALL (BsMock, gBS_OpenProtocol) + .WillOnce (Return (EFI_ACCESS_DENIED)); + + EXPECT_EQ (GetExecutionPolicy (&mDevicePath, &Policy), EFI_SUCCESS); + EXPECT_EQ (Policy, (UINT32)DENY_EXECUTE_ON_SECURITY_VIOLATION); +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/SupportGoogleTest.cpp b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/SupportGoogleTest.cpp new file mode 100644 index 00000000000..790bfa0d302 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/SupportGoogleTest.cpp @@ -0,0 +1,592 @@ +/** @file + Unit tests for GetImageSecurityDataDirectory in the + DxeImageVerificationLib. + These tests construct minimal-but-valid PE/COFF images in memory and + exercise the real PeCoffLib through GetImageSecurityDataDirectory so + that the security-data-directory capture path is covered end-to-end. + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include +#include + +#include +#include + +extern "C" { + #include + #include + #include + #include "../Support.h" +} + +using ::testing::_; +using ::testing::Invoke; +using ::testing::Return; + +static bool +GetImageHashIndexForTest ( + const EFI_GUID *Guid, + UINTN *Index + ) +{ + UINTN I; + + if ((Guid == nullptr) || (Index == nullptr)) { + return false; + } + + for (I = 0; I < ARRAY_SIZE (mHashAlgorithms); I++) { + if (CompareGuid (Guid, mHashAlgorithms[I].ImageHashGuid)) { + *Index = I; + return true; + } + } + + return false; +} + +static bool +GetX509HashIndexForTest ( + const EFI_GUID *Guid, + UINTN *Index + ) +{ + UINTN I; + + if ((Guid == nullptr) || (Index == nullptr)) { + return false; + } + + for (I = 0; I < ARRAY_SIZE (mHashAlgorithms); I++) { + if (CompareGuid (Guid, mHashAlgorithms[I].X509CertHashGuid)) { + *Index = I; + return true; + } + } + + return false; +} + +// +// Layout constants for the synthetic PE32+ image. +// +// The buffer is a single contiguous blob laid out as: +// [DOS hdr][NT64 hdrs][1 section hdr][padding to SizeOfHeaders][image body] +// +// All sizes are picked to satisfy PeCoffLoaderGetImageInfo's +// consistency checks (NumberOfRvaAndSizes, SizeOfOptionalHeader, +// SectionHeaderOffset, SizeOfHeaders < SizeOfImage, last-byte reads of +// SizeOfHeaders and the security directory). +// +static constexpr UINT32 kDosHdrSize = sizeof (EFI_IMAGE_DOS_HEADER); +static constexpr UINT32 kNt64Size = sizeof (EFI_IMAGE_NT_HEADERS64); +static constexpr UINT32 kPeCoffOffset = kDosHdrSize; +static constexpr UINT32 kSizeOfHeaders = 0x200; +static constexpr UINT32 kSizeOfImage = 0x400; +static constexpr UINT32 kSecDirVa = 0x300; +static constexpr UINT32 kSecDirSize = 0x100; + +/** + Build a minimal valid PE32+ image in heap-backed storage. + When IncludeSecurityDir is true, the returned image's + EFI_IMAGE_DIRECTORY_ENTRY_SECURITY entry points at [kSecDirVa, + kSecDirVa + kSecDirSize). Otherwise that entry is left zero. +**/ +static std::vector +BuildPe32PlusImage ( + bool IncludeSecurityDir + ) +{ + std::vector Image (kSizeOfImage, 0); + + EFI_IMAGE_DOS_HEADER *Dos = (EFI_IMAGE_DOS_HEADER *)Image.data (); + EFI_IMAGE_NT_HEADERS64 *Nt = (EFI_IMAGE_NT_HEADERS64 *)(Image.data () + kPeCoffOffset); + + Dos->e_magic = EFI_IMAGE_DOS_SIGNATURE; + Dos->e_lfanew = kPeCoffOffset; + + Nt->Signature = EFI_IMAGE_NT_SIGNATURE; + Nt->FileHeader.Machine = IMAGE_FILE_MACHINE_X64; + Nt->FileHeader.NumberOfSections = 1; + Nt->FileHeader.SizeOfOptionalHeader = sizeof (EFI_IMAGE_OPTIONAL_HEADER64); + Nt->OptionalHeader.Magic = EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC; + Nt->OptionalHeader.SizeOfImage = kSizeOfImage; + Nt->OptionalHeader.SizeOfHeaders = kSizeOfHeaders; + Nt->OptionalHeader.SectionAlignment = 0x200; + Nt->OptionalHeader.NumberOfRvaAndSizes = EFI_IMAGE_NUMBER_OF_DIRECTORY_ENTRIES; + + if (IncludeSecurityDir) { + Nt->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].VirtualAddress = kSecDirVa; + Nt->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_SECURITY].Size = kSecDirSize; + } + + return Image; +} + +class GetImageSecurityDataDirectoryTest : public ::testing::Test { +}; + +// --------------------------------------------------------------------------- +// Argument validation +// --------------------------------------------------------------------------- + +TEST_F (GetImageSecurityDataDirectoryTest, NullFileBuffer_ReturnsInvalidParameter) { + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + EXPECT_EQ ( + GetImageSecurityDataDirectory (NULL, 0x100, &SecDataDir), + EFI_INVALID_PARAMETER + ); +} + +TEST_F (GetImageSecurityDataDirectoryTest, NullSecDataDir_ReturnsInvalidParameter) { + std::vector Image = BuildPe32PlusImage (false); + + EXPECT_EQ ( + GetImageSecurityDataDirectory (Image.data (), Image.size (), NULL), + EFI_INVALID_PARAMETER + ); +} + +TEST_F (GetImageSecurityDataDirectoryTest, NullFileBuffer_DoesNotTouchSecDataDir) { + // + // Caller-supplied SecDataDir must be untouched on the early + // invalid-parameter return; only the success path is allowed to + // overwrite it. + // + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + SetMem (&SecDataDir, sizeof (SecDataDir), 0xAA); + + EXPECT_EQ ( + GetImageSecurityDataDirectory (NULL, 0x100, &SecDataDir), + EFI_INVALID_PARAMETER + ); + EXPECT_EQ (SecDataDir.VirtualAddress, 0xAAAAAAAAu); + EXPECT_EQ (SecDataDir.Size, 0xAAAAAAAAu); +} + +// --------------------------------------------------------------------------- +// Malformed images +// --------------------------------------------------------------------------- + +TEST_F (GetImageSecurityDataDirectoryTest, GarbageBuffer_ReturnsLoadError) { + // + // A buffer that is large enough to attempt header parsing but does + // not actually carry valid DOS/NT signatures must be rejected. + // + std::vector Buffer (kSizeOfImage, 0xAB); + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + EXPECT_EQ ( + GetImageSecurityDataDirectory (Buffer.data (), Buffer.size (), &SecDataDir), + EFI_LOAD_ERROR + ); +} + +TEST_F (GetImageSecurityDataDirectoryTest, TinyBuffer_ReturnsLoadError) { + // + // A buffer too small to contain a DOS header must be rejected + // without dereferencing any of the bytes. + // + UINT8 TinyBuffer[4] = { 0 }; + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + EXPECT_EQ ( + GetImageSecurityDataDirectory (TinyBuffer, sizeof (TinyBuffer), &SecDataDir), + EFI_LOAD_ERROR + ); +} + +TEST_F (GetImageSecurityDataDirectoryTest, ZeroFileSize_ReturnsLoadError) { + UINT8 Byte = 0; + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + EXPECT_EQ ( + GetImageSecurityDataDirectory (&Byte, 0, &SecDataDir), + EFI_LOAD_ERROR + ); +} + +TEST_F (GetImageSecurityDataDirectoryTest, ElfanewPastEof_ReturnsLoadError) { + // + // Valid DOS signature but e_lfanew points well past the end of the + // buffer. The bounded reader must refuse to fetch the NT headers. + // + std::vector Image = BuildPe32PlusImage (false); + EFI_IMAGE_DOS_HEADER *Dos = (EFI_IMAGE_DOS_HEADER *)Image.data (); + + Dos->e_lfanew = (UINT32)(Image.size () + 0x1000); + + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + EXPECT_EQ ( + GetImageSecurityDataDirectory (Image.data (), Image.size (), &SecDataDir), + EFI_LOAD_ERROR + ); +} + +TEST_F (GetImageSecurityDataDirectoryTest, TruncatedAtNtHeaders_ReturnsLoadError) { + // + // Buffer is truncated to the DOS header only, so the read of the NT + // headers at e_lfanew straddles EOF. + // + std::vector Image = BuildPe32PlusImage (false); + + Image.resize (sizeof (EFI_IMAGE_DOS_HEADER)); + + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + EXPECT_EQ ( + GetImageSecurityDataDirectory (Image.data (), Image.size (), &SecDataDir), + EFI_LOAD_ERROR + ); +} + +TEST_F (GetImageSecurityDataDirectoryTest, ValidDosBadNtSignature_ReturnsLoadError) { + // + // Valid DOS header but corrupted NT signature -- exercises the NT + // signature validation path inside PeCoffLib. + // + std::vector Image = BuildPe32PlusImage (false); + EFI_IMAGE_NT_HEADERS64 *Nt = (EFI_IMAGE_NT_HEADERS64 *)(Image.data () + kPeCoffOffset); + + Nt->Signature = 0xDEADBEEF; + + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + EXPECT_EQ ( + GetImageSecurityDataDirectory (Image.data (), Image.size (), &SecDataDir), + EFI_LOAD_ERROR + ); +} + +// --------------------------------------------------------------------------- +// Happy paths exercised through real PeCoffLib security-directory capture +// --------------------------------------------------------------------------- + +TEST_F (GetImageSecurityDataDirectoryTest, ValidImageWithoutSecurityDir_ReturnsZeroedDir) { + std::vector Image = BuildPe32PlusImage (false); + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + // + // Pre-poison SecDataDir so we can prove the function actually wrote + // back zeros (rather than leaving stale caller-supplied bytes). + // + SetMem (&SecDataDir, sizeof (SecDataDir), 0xCD); + + EXPECT_EQ ( + GetImageSecurityDataDirectory (Image.data (), Image.size (), &SecDataDir), + EFI_SUCCESS + ); + EXPECT_EQ (SecDataDir.VirtualAddress, 0u); + EXPECT_EQ (SecDataDir.Size, 0u); +} + +TEST_F (GetImageSecurityDataDirectoryTest, ValidImageWithSecurityDir_ReturnsCapturedDir) { + std::vector Image = BuildPe32PlusImage (true); + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + EXPECT_EQ ( + GetImageSecurityDataDirectory (Image.data (), Image.size (), &SecDataDir), + EFI_SUCCESS + ); + EXPECT_EQ (SecDataDir.VirtualAddress, kSecDirVa); + EXPECT_EQ (SecDataDir.Size, kSecDirSize); +} + +TEST_F (GetImageSecurityDataDirectoryTest, OtherDataDirectoriesDoNotLeak) { + // + // Populate a non-SECURITY data directory entry (export table) with + // a recognizable value to prove PeCoffLib only records the SECURITY + // entry and ignores every other directory it walks. + // + std::vector Image = BuildPe32PlusImage (true); + EFI_IMAGE_NT_HEADERS64 *Nt = (EFI_IMAGE_NT_HEADERS64 *)(Image.data () + kPeCoffOffset); + + Nt->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress = 0xCAFEBABE; + Nt->OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_EXPORT].Size = 0xBEEFu; + + EFI_IMAGE_DATA_DIRECTORY SecDataDir; + + EXPECT_EQ ( + GetImageSecurityDataDirectory (Image.data (), Image.size (), &SecDataDir), + EFI_SUCCESS + ); + EXPECT_EQ (SecDataDir.VirtualAddress, kSecDirVa); + EXPECT_EQ (SecDataDir.Size, kSecDirSize); +} + +// --------------------------------------------------------------------------- +// GetHash +// --------------------------------------------------------------------------- + +TEST (GetHashTest, NullParameters_ReturnsInvalidParameter) { + DIGEST_CACHE Cache; + CONST UINT8 *Digest = NULL; + UINTN DigestSize = 0; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (CONST VOID *)(UINTN)1; + Cache.BufferSize = 1; + + EXPECT_EQ (GetHash (NULL, &Cache, &Digest, &DigestSize), EFI_INVALID_PARAMETER); + EXPECT_EQ (GetHash (&gEfiCertSha256Guid, NULL, &Digest, &DigestSize), EFI_INVALID_PARAMETER); + EXPECT_EQ (GetHash (&gEfiCertSha256Guid, &Cache, NULL, &DigestSize), EFI_INVALID_PARAMETER); + EXPECT_EQ (GetHash (&gEfiCertSha256Guid, &Cache, &Digest, NULL), EFI_INVALID_PARAMETER); +} + +TEST (GetHashTest, CacheWithoutFileBuffer_ReturnsInvalidParameter) { + DIGEST_CACHE Cache; + CONST UINT8 *Digest = NULL; + UINTN DigestSize = 0; + + ZeroMem (&Cache, sizeof (Cache)); + + EXPECT_EQ (GetHash (&gEfiCertSha256Guid, &Cache, &Digest, &DigestSize), EFI_INVALID_PARAMETER); +} + +TEST (GetHashTest, UnsupportedHashGuid_ReturnsUnsupported) { + EFI_GUID UnknownGuid = { + 0xA1B2C3D4, + 0x9999, + 0x8888, + { 0x10, 0x20,0x30, 0x40, 0x50, 0x60, 0x70, 0x80 } + }; + DIGEST_CACHE Cache; + CONST UINT8 *Digest = NULL; + UINTN DigestSize = 0; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (CONST VOID *)(UINTN)1; + Cache.BufferSize = 1; + + EXPECT_EQ (GetHash (&UnknownGuid, &Cache, &Digest, &DigestSize), EFI_UNSUPPORTED); +} + +TEST (GetHashTest, CacheHit_ReturnsExistingDigestBytes) { + DIGEST_CACHE Cache; + CONST UINT8 *Digest = NULL; + UINTN DigestSize = 0; + UINTN SlotIndex; + CONST UINT8 ExpectedDigest[] = { 0x10, 0x20, 0x30, 0x40 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (CONST VOID *)(UINTN)1; + Cache.BufferSize = 1; + + ASSERT_TRUE (GetImageHashIndexForTest (&gEfiCertSha256Guid, &SlotIndex)); + CopyMem (Cache.Entries[SlotIndex].Bytes, ExpectedDigest, sizeof (ExpectedDigest)); + Cache.Entries[SlotIndex].BufferSize = sizeof (ExpectedDigest); + + EXPECT_EQ (GetHash (&gEfiCertSha256Guid, &Cache, &Digest, &DigestSize), EFI_SUCCESS); + ASSERT_NE (Digest, (CONST UINT8 *)NULL); + EXPECT_EQ (DigestSize, sizeof (ExpectedDigest)); + EXPECT_EQ (CompareMem (Digest, ExpectedDigest, sizeof (ExpectedDigest)), 0); +} + +TEST (GetHashTest, CacheMiss_ComputesAndCachesDigest) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + CONST UINT8 *Digest = NULL; + UINTN DigestSize = 0; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (CONST VOID *)(UINTN)1; + Cache.BufferSize = 1; + + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] ( + IN VOID *FileBuffer, + IN UINTN FileSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *OutDigest, + OUT UINTN *OutDigestSize + ) -> EFI_STATUS { + (VOID)FileBuffer; + (VOID)FileSize; + (VOID)HashType; + OutDigest[0] = 0x11; + OutDigest[1] = 0x22; + OutDigest[2] = 0x33; + *OutDigestSize = 3; + return EFI_SUCCESS; + } + ) + ); + + EXPECT_EQ (GetHash (&gEfiCertSha256Guid, &Cache, &Digest, &DigestSize), EFI_SUCCESS); + ASSERT_NE (Digest, (CONST UINT8 *)NULL); + EXPECT_EQ (DigestSize, (UINTN)3); + EXPECT_EQ (Digest[0], 0x11); + EXPECT_EQ (Digest[1], 0x22); + EXPECT_EQ (Digest[2], 0x33); +} + +TEST (GetHashTest, CacheMiss_HashFailure_ClearsSlotAndReturnsSecurityViolation) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + CONST UINT8 *Digest = (CONST UINT8 *)(UINTN)1; + UINTN DigestSize = 9; + UINTN SlotIndex; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Buffer = (CONST VOID *)(UINTN)1; + Cache.BufferSize = 1; + + ASSERT_TRUE (GetImageHashIndexForTest (&gEfiCertSha256Guid, &SlotIndex)); + + EXPECT_CALL (BaseCryptLibMock, GetAuthenticodeHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] ( + IN VOID *FileBuffer, + IN UINTN FileSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *OutDigest, + OUT UINTN *OutDigestSize + ) -> EFI_STATUS { + (VOID)FileBuffer; + (VOID)FileSize; + (VOID)HashType; + (VOID)OutDigest; + *OutDigestSize = 64; + return EFI_DEVICE_ERROR; + } + ) + ); + + EXPECT_EQ (GetHash (&gEfiCertSha256Guid, &Cache, &Digest, &DigestSize), EFI_SECURITY_VIOLATION); + EXPECT_EQ (Cache.Entries[SlotIndex].BufferSize, (UINTN)0); +} + +TEST (GetHashTest, X509CacheMiss_ComputesAndCachesDigest) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + CONST UINT8 *Digest = NULL; + UINTN DigestSize = 0; + UINTN SlotIndex; + UINT8 Data[3] = { 0xA1, 0xB2, 0xC3 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Type = DigestCacheTypeX509; + Cache.Buffer = Data; + Cache.BufferSize = sizeof (Data); + + ASSERT_TRUE (GetX509HashIndexForTest (&gEfiCertX509Sha256Guid, &SlotIndex)); + + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce ( + Invoke ( + [] ( + IN VOID *CertBuffer, + IN UINTN CertSize, + IN CONST EFI_GUID *HashType, + OUT UINT8 *OutDigest, + OUT UINTN *OutDigestSize + ) -> EFI_STATUS { + (VOID)CertBuffer; + (VOID)CertSize; + (VOID)HashType; + SetMem (OutDigest, SHA256_DIGEST_SIZE, 0x5A); + *OutDigestSize = SHA256_DIGEST_SIZE; + return EFI_SUCCESS; + } + ) + ); + + EXPECT_EQ (GetHash (&gEfiCertX509Sha256Guid, &Cache, &Digest, &DigestSize), EFI_SUCCESS); + ASSERT_NE (Digest, (CONST UINT8 *)NULL); + EXPECT_EQ (DigestSize, (UINTN)SHA256_DIGEST_SIZE); + EXPECT_EQ (Cache.Entries[SlotIndex].BufferSize, (UINTN)SHA256_DIGEST_SIZE); + EXPECT_EQ (Digest[0], (UINT8)0x5A); +} + +TEST (GetHashTest, X509CacheMiss_HashFailure_ClearsSlotAndReturnsSecurityViolation) { + MockBaseCryptLib BaseCryptLibMock; + DIGEST_CACHE Cache; + CONST UINT8 *Digest = (CONST UINT8 *)(UINTN)1; + UINTN DigestSize = 17; + UINTN SlotIndex; + UINT8 Data[3] = { 0xA1, 0xB2, 0xC3 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Type = DigestCacheTypeX509; + Cache.Buffer = Data; + Cache.BufferSize = sizeof (Data); + + ASSERT_TRUE (GetX509HashIndexForTest (&gEfiCertX509Sha256Guid, &SlotIndex)); + + EXPECT_CALL (BaseCryptLibMock, X509GetTbsCertHash (_, _, _, _, _)) + .WillOnce (Return (EFI_DEVICE_ERROR)); + + EXPECT_EQ (GetHash (&gEfiCertX509Sha256Guid, &Cache, &Digest, &DigestSize), EFI_SECURITY_VIOLATION); + EXPECT_EQ (Cache.Entries[SlotIndex].BufferSize, (UINTN)0); +} + +TEST (GetHashTest, X509CacheWithImageGuid_ReturnsUnsupported) { + DIGEST_CACHE Cache; + CONST UINT8 *Digest = NULL; + UINTN DigestSize = 0; + UINT8 Data[1] = { 0x11 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Type = DigestCacheTypeX509; + Cache.Buffer = Data; + Cache.BufferSize = sizeof (Data); + + EXPECT_EQ (GetHash (&gEfiCertSha256Guid, &Cache, &Digest, &DigestSize), EFI_UNSUPPORTED); +} + +TEST (GetHashTest, ImageCacheWithX509Guid_ReturnsUnsupported) { + DIGEST_CACHE Cache; + CONST UINT8 *Digest = NULL; + UINTN DigestSize = 0; + UINT8 Data[1] = { 0x22 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Type = DigestCacheTypeImage; + Cache.Buffer = Data; + Cache.BufferSize = sizeof (Data); + + EXPECT_EQ (GetHash (&gEfiCertX509Sha256Guid, &Cache, &Digest, &DigestSize), EFI_UNSUPPORTED); +} + +TEST (GetHashTest, InvalidCacheType_ReturnsUnsupported) { + DIGEST_CACHE Cache; + CONST UINT8 *Digest = NULL; + UINTN DigestSize = 0; + UINT8 Data[1] = { 0x33 }; + + ZeroMem (&Cache, sizeof (Cache)); + Cache.Type = (DIGEST_CACHE_TYPE)0xFF; + Cache.Buffer = Data; + Cache.BufferSize = sizeof (Data); + + EXPECT_EQ (GetHash (&gEfiCertSha256Guid, &Cache, &Digest, &DigestSize), EFI_UNSUPPORTED); +} + +// --------------------------------------------------------------------------- +// IsX509CertHashGuid +// --------------------------------------------------------------------------- + +TEST (IsX509CertHashGuidTest, NullGuid_ReturnsFalse) { + EXPECT_FALSE (IsX509CertHashGuid (NULL)); +} + +TEST (IsX509CertHashGuidTest, X509CertHashGuid_ReturnsTrue) { + EXPECT_TRUE (IsX509CertHashGuid (&gEfiCertX509Sha256Guid)); +} + +TEST (IsX509CertHashGuidTest, NonX509CertHashGuid_ReturnsFalse) { + // A GUID that is not present in the mHashAlgorithms X509CertHashGuid column. + const EFI_GUID OtherGuid = { + 0x11111111, 0x2222, 0x3333, { 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB } + }; + + EXPECT_FALSE (IsX509CertHashGuid (&OtherGuid)); +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/ImageExecution.c b/SecurityPkg/Library/DxeImageVerificationLib2/ImageExecution.c new file mode 100644 index 00000000000..e49fbdf74ea --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/ImageExecution.c @@ -0,0 +1,332 @@ +/** @file + Image Execution Information Table helpers for the DXE Image Verification + Library. + + Every time the verification handler rejects an image it records the outcome + in the EFI_IMAGE_EXECUTION_INFO_TABLE published under + gEfiImageSecurityDatabaseGuid. This file owns the (re)allocation, + serialization, and installation of that configuration table. + + Caution: This file consumes external input (the device path of the rejected + image and the signature data describing it). All inputs must be treated as + attacker-controlled. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "DxeImageVerificationLib.h" + +#include +#include + +/** + Compute the size, in bytes, of an EFI_IMAGE_EXECUTION_INFO_TABLE. + + The size is the fixed table header plus the InfoSize of every + EFI_IMAGE_EXECUTION_INFO entry that follows it. The InfoSize fields are read + with ReadUnaligned32 because table entries are not guaranteed to be naturally + aligned. + + @param[in] ImageExeInfoTable Table to measure, or NULL. + + @retval 0 ImageExeInfoTable is NULL. + @retval Others Size of the table in bytes. +**/ +UINTN +GetImageExeInfoTableSize ( + IN EFI_IMAGE_EXECUTION_INFO_TABLE *ImageExeInfoTable + ) +{ + UINTN Index; + EFI_IMAGE_EXECUTION_INFO *ImageExeInfoItem; + UINTN TotalSize; + + if (ImageExeInfoTable == NULL) { + return 0; + } + + ImageExeInfoItem = (EFI_IMAGE_EXECUTION_INFO *)((UINT8 *)ImageExeInfoTable + sizeof (EFI_IMAGE_EXECUTION_INFO_TABLE)); + TotalSize = sizeof (EFI_IMAGE_EXECUTION_INFO_TABLE); + + for (Index = 0; Index < ImageExeInfoTable->NumberOfImages; Index++) { + TotalSize += ReadUnaligned32 ((UINT32 *)&ImageExeInfoItem->InfoSize); + ImageExeInfoItem = (EFI_IMAGE_EXECUTION_INFO *)((UINT8 *)ImageExeInfoItem + ReadUnaligned32 ((UINT32 *)&ImageExeInfoItem->InfoSize)); + } + + return TotalSize; +} + +/** + Build an EFI_SIGNATURE_LIST that records a single image digest. + + The resulting list has one EFI_SIGNATURE_DATA entry whose SignatureData is a + copy of Digest and whose SignatureOwner is the zero GUID. The list's + SignatureType is HashType (the image-hash algorithm GUID). This matches the + layout the UEFI specification expects for an unsigned-style image-hash + signature recorded into the Image Execution Information Table. + + @param[in] HashType Image-hash algorithm GUID (e.g. gEfiCertSha256Guid). + @param[in] Digest Image digest bytes. + @param[in] DigestSize Size of Digest in bytes; must be non-zero. + @param[out] SignatureList On success, receives a pool-allocated + EFI_SIGNATURE_LIST. Caller frees with FreePool. + @param[out] SignatureListSize On success, receives the size of *SignatureList. + + @retval EFI_SUCCESS The signature list was built. + @retval EFI_INVALID_PARAMETER A required pointer is NULL or DigestSize is 0. + @retval EFI_OUT_OF_RESOURCES The allocation failed. +**/ +EFI_STATUS +BuildImageDigestSignatureList ( + IN CONST EFI_GUID *HashType, + IN CONST UINT8 *Digest, + IN UINTN DigestSize, + OUT EFI_SIGNATURE_LIST **SignatureList, + OUT UINTN *SignatureListSize + ) +{ + EFI_SIGNATURE_LIST *List; + EFI_SIGNATURE_DATA *Data; + UINTN ListSize; + + if ((HashType == NULL) || (Digest == NULL) || (DigestSize == 0) || + (SignatureList == NULL) || (SignatureListSize == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + *SignatureList = NULL; + *SignatureListSize = 0; + + // + // EFI_SIGNATURE_DATA is a flexible structure ending in SignatureData[1]; + // subtract that one byte already accounted for in the struct size. + // + ListSize = sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_SIGNATURE_DATA) - 1 + DigestSize; + + List = (EFI_SIGNATURE_LIST *)AllocateZeroPool (ListSize); + if (List == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + CopyGuid (&List->SignatureType, HashType); + List->SignatureListSize = (UINT32)ListSize; + List->SignatureHeaderSize = 0; + List->SignatureSize = (UINT32)(sizeof (EFI_SIGNATURE_DATA) - 1 + DigestSize); + + Data = (EFI_SIGNATURE_DATA *)((UINT8 *)List + sizeof (EFI_SIGNATURE_LIST)); + CopyMem (Data->SignatureData, Digest, DigestSize); + + *SignatureList = List; + *SignatureListSize = ListSize; + + return EFI_SUCCESS; +} + +/** + Create or update the Image Execution Information Table with a new entry. + + Locates the existing EFI_IMAGE_EXECUTION_INFO_TABLE in the EFI System + Configuration Table (creating a new one if absent), appends a single + EFI_IMAGE_EXECUTION_INFO entry describing Action / Name / DevicePath / + Signature, and re-installs the (re)allocated table under + gEfiImageSecurityDatabaseGuid. The previous table allocation, if any, is + freed after the new one is installed. + + The table is allocated from EfiRuntimeServicesData so it remains valid for + consumption after ExitBootServices. + + @param[in] Action Action taken by the firmware regarding the image. + @param[in] Name Optional NULL-terminated, user-friendly image name. + When NULL, a single NULL CHAR16 is recorded. + @param[in] DevicePath Device path of the image being recorded. + @param[in] Signature Optional EFI_SIGNATURE_LIST describing the image + signature(s). May be NULL. + @param[in] SignatureSize Size of Signature in bytes. Must be 0 when + Signature is NULL. + + @retval EFI_SUCCESS The entry was recorded and the table installed. + @retval EFI_INVALID_PARAMETER DevicePath is NULL, or Signature is NULL while + SignatureSize is non-zero (or vice versa). + @retval EFI_OUT_OF_RESOURCES A required allocation failed. + @retval Other Status from gBS->InstallConfigurationTable. +**/ +EFI_STATUS +AddImageExeInfo ( + IN EFI_IMAGE_EXECUTION_ACTION Action, + IN CHAR16 *Name OPTIONAL, + IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, + IN EFI_SIGNATURE_LIST *Signature OPTIONAL, + IN UINTN SignatureSize + ) +{ + EFI_STATUS Status; + EFI_IMAGE_EXECUTION_INFO_TABLE *ImageExeInfoTable; + EFI_IMAGE_EXECUTION_INFO_TABLE *NewImageExeInfoTable; + EFI_IMAGE_EXECUTION_INFO *ImageExeInfoEntry; + UINTN ImageExeInfoTableSize; + UINTN NewImageExeInfoEntrySize; + UINTN NameStringLen; + UINTN DevicePathSize; + CHAR16 *NameStr; + + // + // A device path is mandatory; the signature pointer and size must agree. + // + if ((DevicePath == NULL) || + ((Signature == NULL) && (SignatureSize != 0)) || + ((Signature != NULL) && (SignatureSize == 0))) + { + return EFI_INVALID_PARAMETER; + } + + if (Name != NULL) { + NameStringLen = StrSize (Name); + } else { + NameStringLen = sizeof (CHAR16); + } + + // + // Locate the existing table (if any) to size the new allocation. When no + // table exists yet, the base size is just the fixed header. + // + ImageExeInfoTable = NULL; + EfiGetSystemConfigurationTable (&gEfiImageSecurityDatabaseGuid, (VOID **)&ImageExeInfoTable); + if (ImageExeInfoTable != NULL) { + ImageExeInfoTableSize = GetImageExeInfoTableSize (ImageExeInfoTable); + } else { + ImageExeInfoTableSize = sizeof (EFI_IMAGE_EXECUTION_INFO_TABLE); + } + + DevicePathSize = GetDevicePathSize (DevicePath); + NewImageExeInfoEntrySize = sizeof (EFI_IMAGE_EXECUTION_INFO) + NameStringLen + DevicePathSize + SignatureSize; + + NewImageExeInfoTable = (EFI_IMAGE_EXECUTION_INFO_TABLE *)AllocateRuntimePool (ImageExeInfoTableSize + NewImageExeInfoEntrySize); + if (NewImageExeInfoTable == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + // + // Copy the existing table contents, or start a fresh, empty table. + // + if (ImageExeInfoTable != NULL) { + CopyMem (NewImageExeInfoTable, ImageExeInfoTable, ImageExeInfoTableSize); + } else { + NewImageExeInfoTable->NumberOfImages = 0; + } + + NewImageExeInfoTable->NumberOfImages++; + + // + // The new entry begins immediately after the previously serialized data. + // Action and InfoSize are written unaligned because the entry start is not + // guaranteed to be naturally aligned. + // + ImageExeInfoEntry = (EFI_IMAGE_EXECUTION_INFO *)((UINT8 *)NewImageExeInfoTable + ImageExeInfoTableSize); + WriteUnaligned32 ((UINT32 *)ImageExeInfoEntry, Action); + WriteUnaligned32 ((UINT32 *)((UINT8 *)ImageExeInfoEntry + sizeof (EFI_IMAGE_EXECUTION_ACTION)), (UINT32)NewImageExeInfoEntrySize); + + // + // Name immediately follows the fixed entry header, then the device path, + // then any signature data. + // + NameStr = (CHAR16 *)(ImageExeInfoEntry + 1); + if (Name != NULL) { + CopyMem ((UINT8 *)NameStr, Name, NameStringLen); + } else { + ZeroMem ((UINT8 *)NameStr, sizeof (CHAR16)); + } + + CopyMem ( + (UINT8 *)NameStr + NameStringLen, + DevicePath, + DevicePathSize + ); + + if (Signature != NULL) { + CopyMem ( + (UINT8 *)NameStr + NameStringLen + DevicePathSize, + Signature, + SignatureSize + ); + } + + // + // Install/replace the table, then free the previous allocation. + // + Status = gBS->InstallConfigurationTable (&gEfiImageSecurityDatabaseGuid, (VOID *)NewImageExeInfoTable); + if (EFI_ERROR (Status)) { + FreePool (NewImageExeInfoTable); + return Status; + } + + if (ImageExeInfoTable != NULL) { + FreePool (ImageExeInfoTable); + } + + return EFI_SUCCESS; +} + +/** + Record a rejected image into the Image Execution Information Table. + + Appends a single EFI_IMAGE_EXECUTION_INFO entry describing the rejection. The + image name is derived from File via ConvertDevicePathToText. When Digest is + non-NULL it is wrapped as an EFI_SIGNATURE_LIST typed by HashType and recorded + as the entry's signature (matching the legacy SIG_FOUND / SIG_FAILED + behavior); otherwise no signature is recorded. All transient allocations are + freed before return. + + @param[in] File Device path of the rejected image. Must be non-NULL. + @param[in] Action The EFI_IMAGE_EXECUTION_ACTION describing why the image + was rejected. + @param[in] HashType Image-hash algorithm GUID describing Digest. Ignored + when Digest is NULL. + @param[in] Digest Optional image digest to record, or NULL to record no + signature. + @param[in] DigestSize Size of Digest in bytes; must be non-zero when Digest + is non-NULL. +**/ +VOID +RecordRejectedImage ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File, + IN EFI_IMAGE_EXECUTION_ACTION Action, + IN CONST EFI_GUID *HashType, + IN CONST UINT8 *Digest OPTIONAL, + IN UINTN DigestSize + ) +{ + EFI_STATUS Status; + CHAR16 *NameStr; + EFI_SIGNATURE_LIST *SignatureList; + UINTN SignatureListSize; + + SignatureList = NULL; + SignatureListSize = 0; + + // + // Only signed-image rejections that the legacy implementation recorded with a + // digest (SIG_FOUND / SIG_FAILED) supply one. When present, wrap it as a + // signature list typed by the image-hash algorithm. + // + if ((Digest != NULL) && (DigestSize != 0) && (HashType != NULL)) { + Status = BuildImageDigestSignatureList (HashType, Digest, DigestSize, &SignatureList, &SignatureListSize); + if (EFI_ERROR (Status)) { + SignatureList = NULL; + SignatureListSize = 0; + } + } + + NameStr = ConvertDevicePathToText (File, FALSE, TRUE); + + AddImageExeInfo (Action, NameStr, File, SignatureList, SignatureListSize); + + if (NameStr != NULL) { + FreePool (NameStr); + } + + if (SignatureList != NULL) { + FreePool (SignatureList); + } +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/ImageExecution.h b/SecurityPkg/Library/DxeImageVerificationLib2/ImageExecution.h new file mode 100644 index 00000000000..3fa9ba4964e --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/ImageExecution.h @@ -0,0 +1,131 @@ +/** @file + Image Execution Information Table helpers for the DXE Image Verification + Library. + + The UEFI specification defines an EFI_IMAGE_EXECUTION_INFO_TABLE that is + published in the EFI System Configuration Table under + gEfiImageSecurityDatabaseGuid. The DXE Image Verification Library appends an + entry to this table every time it rejects an image so that the OS (or other + consumers) can discover which images failed authentication and why. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef DXE_IMAGE_VERIFICATION_LIB_IMAGE_EXECUTION_H_ +#define DXE_IMAGE_VERIFICATION_LIB_IMAGE_EXECUTION_H_ + +#include "DxeImageVerificationLib.h" +#include "Support.h" + +/** + Compute the size, in bytes, of an EFI_IMAGE_EXECUTION_INFO_TABLE. + + The size is the fixed table header plus the InfoSize of every + EFI_IMAGE_EXECUTION_INFO entry that follows it. The InfoSize fields are read + with ReadUnaligned32 because table entries are not guaranteed to be naturally + aligned. + + @param[in] ImageExeInfoTable Table to measure, or NULL. + + @retval 0 ImageExeInfoTable is NULL. + @retval Others Size of the table in bytes. +**/ +UINTN +GetImageExeInfoTableSize ( + IN EFI_IMAGE_EXECUTION_INFO_TABLE *ImageExeInfoTable + ); + +/** + Build an EFI_SIGNATURE_LIST that records a single image digest. + + The resulting list has one EFI_SIGNATURE_DATA entry whose SignatureData is a + copy of Digest and whose SignatureOwner is the zero GUID. The list's + SignatureType is HashType (the image-hash algorithm GUID). This matches the + layout the UEFI specification expects for an unsigned-style image-hash + signature recorded into the Image Execution Information Table. + + @param[in] HashType Image-hash algorithm GUID (e.g. gEfiCertSha256Guid). + @param[in] Digest Image digest bytes. + @param[in] DigestSize Size of Digest in bytes; must be non-zero. + @param[out] SignatureList On success, receives a pool-allocated + EFI_SIGNATURE_LIST. Caller frees with FreePool. + @param[out] SignatureListSize On success, receives the size of *SignatureList. + + @retval EFI_SUCCESS The signature list was built. + @retval EFI_INVALID_PARAMETER A required pointer is NULL or DigestSize is 0. + @retval EFI_OUT_OF_RESOURCES The allocation failed. +**/ +EFI_STATUS +BuildImageDigestSignatureList ( + IN CONST EFI_GUID *HashType, + IN CONST UINT8 *Digest, + IN UINTN DigestSize, + OUT EFI_SIGNATURE_LIST **SignatureList, + OUT UINTN *SignatureListSize + ); + +/** + Create or update the Image Execution Information Table with a new entry. + + Locates the existing EFI_IMAGE_EXECUTION_INFO_TABLE in the EFI System + Configuration Table (creating a new one if absent), appends a single + EFI_IMAGE_EXECUTION_INFO entry describing Action / Name / DevicePath / + Signature, and re-installs the (re)allocated table under + gEfiImageSecurityDatabaseGuid. The previous table allocation, if any, is + freed after the new one is installed. + + The table is allocated from EfiRuntimeServicesData so it remains valid for + consumption after ExitBootServices. + + @param[in] Action Action taken by the firmware regarding the image. + @param[in] Name Optional NULL-terminated, user-friendly image name. + When NULL, a single NULL CHAR16 is recorded. + @param[in] DevicePath Device path of the image being recorded. + @param[in] Signature Optional EFI_SIGNATURE_LIST describing the image + signature(s). May be NULL. + @param[in] SignatureSize Size of Signature in bytes. Must be 0 when + Signature is NULL. + + @retval EFI_SUCCESS The entry was recorded and the table installed. + @retval EFI_INVALID_PARAMETER DevicePath is NULL, or Signature is NULL while + SignatureSize is non-zero (or vice versa). + @retval EFI_OUT_OF_RESOURCES A required allocation failed. + @retval Other Status from gBS->InstallConfigurationTable. +**/ +EFI_STATUS +AddImageExeInfo ( + IN EFI_IMAGE_EXECUTION_ACTION Action, + IN CHAR16 *Name OPTIONAL, + IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, + IN EFI_SIGNATURE_LIST *Signature OPTIONAL, + IN UINTN SignatureSize + ); + +/** + Record a rejected image into the Image Execution Information Table. + + Builds the table entry describing the rejection. When HashType is a non-zero + GUID, the memoized image digest for that algorithm is retrieved from Cache and + recorded as the entry's signature (matching the legacy SIG_FOUND / SIG_FAILED + behavior); otherwise no signature is recorded. The image name is derived from + File via ConvertDevicePathToText. All transient allocations are freed before + return. + + @param[in] File Device path of the rejected image. Must be non-NULL. + @param[in] Action The EFI_IMAGE_EXECUTION_ACTION describing why the + image was rejected. + @param[in,out] Cache Image digest cache bound to the image buffer; used to + recover the memoized digest when HashType is non-zero. + @param[in] HashType Image-hash algorithm GUID to record the digest under, + or the zero GUID to record no signature. +**/ +VOID +RecordRejectedImage ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File, + IN EFI_IMAGE_EXECUTION_ACTION Action, + IN OUT DIGEST_CACHE *Cache, + IN CONST EFI_GUID *HashType + ); + +#endif // DXE_IMAGE_VERIFICATION_LIB_IMAGE_EXECUTION_H_ diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/Iterator.c b/SecurityPkg/Library/DxeImageVerificationLib2/Iterator.c new file mode 100644 index 00000000000..14d91759b7a --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/Iterator.c @@ -0,0 +1,317 @@ +/** @file + Forward-only iterators for walking different data structures. + + Iterators perform data validation during initialization. If initialization succeeds, the + iterator is guaranteed to produce valid results during iteration. This does mean that certain + iterator implemenations walk the data structures twice. Once during initialization to validate + the data, and again during iteration to produce the results. + + All iterators use the same Init / Next contract. `Init(..)` initializes the iterator + and validates the structure while `Next(..)` returns the next item or NULL once + initialized. + + Three iterators are provided: + + * SIG_DATABASE_ITER - walks every EFI_SIGNATURE_LIST in a signature + database buffer (db / dbx / dbt contents). + * SIG_LIST_ITER - walks every EFI_SIGNATURE_DATA entry inside a + single EFI_SIGNATURE_LIST. + * WIN_CERT_ITER - walks every WIN_CERTIFICATE in a PE/COFF + image's security data directory. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "Iterator.h" + +/** + Initialize an iterator over the EFI_SIGNATURE_LIST records contained in a signature database + buffer. + + Init validates every list header in the buffer end-to-end. After a successful return, + DatabaseIterNext is infallible. + + @param[out] Iter Iterator state to initialize. + @param[in] Buffer Raw database contents, or NULL for an empty database. + @param[in] BufferSize Size of Buffer in bytes; 0 when Buffer is NULL. + + @retval EFI_SUCCESS Iterator is ready for use. + @retval EFI_INVALID_PARAMETER Iter is NULL, or Buffer is NULL with a non-zero BufferSize. + @retval EFI_VOLUME_CORRUPTED The buffer contains a malformed EFI_SIGNATURE_LIST (bad size + fields, trailing bytes, or payload not a multiple of + SignatureSize). +**/ +EFI_STATUS +DatabaseIterInit ( + OUT SIG_DATABASE_ITER *Iter, + IN CONST VOID *Buffer, + IN UINTN BufferSize + ) +{ + CONST UINT8 *Cursor; + UINTN Remaining; + CONST EFI_SIGNATURE_LIST *List; + + if (Iter == NULL) { + return EFI_INVALID_PARAMETER; + } + + if ((Buffer == NULL) && (BufferSize != 0)) { + return EFI_INVALID_PARAMETER; + } + + // + // Walk the buffer using SignatureListSize. The only thing this iter + // needs to guarantee is that the lists tile the buffer cleanly. + // + Cursor = (CONST UINT8 *)Buffer; + Remaining = (Buffer == NULL) ? 0 : BufferSize; + + while (Remaining > 0) { + if (Remaining < sizeof (EFI_SIGNATURE_LIST)) { + DEBUG ((DEBUG_ERROR, "DatabaseIter: trailing bytes in signature database.\n")); + return EFI_VOLUME_CORRUPTED; + } + + List = (CONST EFI_SIGNATURE_LIST *)(CONST VOID *)Cursor; + if ((List->SignatureListSize < sizeof (EFI_SIGNATURE_LIST)) || + (List->SignatureListSize > Remaining)) + { + DEBUG ((DEBUG_ERROR, "DatabaseIter: malformed SignatureListSize.\n")); + return EFI_VOLUME_CORRUPTED; + } + + Cursor += List->SignatureListSize; + Remaining -= List->SignatureListSize; + } + + Iter->Cursor = (CONST UINT8 *)Buffer; + Iter->Remaining = (Buffer == NULL) ? 0 : BufferSize; + return EFI_SUCCESS; +} + +/** + Return the next EFI_SIGNATURE_LIST from the buffer being iterated. + + Cannot fail after a successful DatabaseIterInit. + + @param[in,out] Iter Iterator initialized by DatabaseIterInit. + + @retval non-NULL Pointer to the next EFI_SIGNATURE_LIST. + @retval NULL Iteration is complete. +**/ +CONST EFI_SIGNATURE_LIST * +DatabaseIterNext ( + IN OUT SIG_DATABASE_ITER *Iter + ) +{ + CONST EFI_SIGNATURE_LIST *List; + + if ((Iter == NULL) || (Iter->Remaining == 0)) { + return NULL; + } + + List = (CONST EFI_SIGNATURE_LIST *)(CONST VOID *)Iter->Cursor; + Iter->Cursor += List->SignatureListSize; + Iter->Remaining -= List->SignatureListSize; + return List; +} + +/** + Initialize an iterator over the EFI_SIGNATURE_DATA entries contained in a single + EFI_SIGNATURE_LIST. + + Init validates the list's size fields. After a successful return, SigListIterNext is infallible. + + @param[out] Iter Iterator state to initialize. + @param[in] List The signature list to walk. + + @retval EFI_SUCCESS Iterator is ready for use. + @retval EFI_INVALID_PARAMETER Iter or List is NULL. + @retval EFI_VOLUME_CORRUPTED List has internally inconsistent size fields. +**/ +EFI_STATUS +SigListIterInit ( + OUT SIG_LIST_ITER *Iter, + IN CONST EFI_SIGNATURE_LIST *List + ) +{ + UINTN PayloadSize; + + if ((Iter == NULL) || (List == NULL)) { + return EFI_INVALID_PARAMETER; + } + + if (List->SignatureListSize < sizeof (EFI_SIGNATURE_LIST)) { + DEBUG ((DEBUG_ERROR, "SigListIter: malformed SignatureListSize.\n")); + return EFI_VOLUME_CORRUPTED; + } + + if (List->SignatureSize < sizeof (EFI_GUID)) { + DEBUG ((DEBUG_ERROR, "SigListIter: malformed SignatureSize.\n")); + return EFI_VOLUME_CORRUPTED; + } + + if (List->SignatureHeaderSize > List->SignatureListSize - sizeof (EFI_SIGNATURE_LIST)) { + DEBUG ((DEBUG_ERROR, "SigListIter: malformed SignatureHeaderSize.\n")); + return EFI_VOLUME_CORRUPTED; + } + + PayloadSize = List->SignatureListSize + - sizeof (EFI_SIGNATURE_LIST) + - List->SignatureHeaderSize; + if ((PayloadSize % List->SignatureSize) != 0) { + DEBUG ((DEBUG_ERROR, "SigListIter: payload size is not a multiple of signature size.\n")); + return EFI_VOLUME_CORRUPTED; + } + + Iter->Stride = List->SignatureSize; + Iter->Remaining = PayloadSize / List->SignatureSize; + Iter->Cursor = (CONST UINT8 *)List + + sizeof (EFI_SIGNATURE_LIST) + + List->SignatureHeaderSize; + return EFI_SUCCESS; +} + +/** + Return the next EFI_SIGNATURE_DATA entry from the list being iterated. + + Cannot fail after a successful SigListIterInit. + + @param[in,out] Iter Iterator initialized by SigListIterInit. + + @retval non-NULL Pointer to the next EFI_SIGNATURE_DATA entry. + @retval NULL Iteration is complete. +**/ +CONST EFI_SIGNATURE_DATA * +SigListIterNext ( + IN OUT SIG_LIST_ITER *Iter + ) +{ + CONST EFI_SIGNATURE_DATA *Entry; + + if ((Iter == NULL) || (Iter->Remaining == 0)) { + return NULL; + } + + Entry = (CONST EFI_SIGNATURE_DATA *)(CONST VOID *)Iter->Cursor; + Iter->Cursor += Iter->Stride; + Iter->Remaining--; + return Entry; +} + +/** + Initialize an iterator over the WIN_CERTIFICATE records contained in a PE/COFF image's security + data directory. + + Init validates that the directory described by SecDataDir lies entirely within the supplied file + buffer and walks every WIN_CERTIFICATE header to verify its dwLength fits the remaining table. + After a successful return, WinCertIterNext is infallible. + + @param[out] Iter Iterator state to initialize. + @param[in] FileBuffer Pointer to the in-memory PE/COFF image. + @param[in] FileSize Size of FileBuffer in bytes. + @param[in] SecDataDir Security data directory describing the embedded WIN_CERTIFICATE table. + + @retval EFI_SUCCESS Iterator is ready for use. + @retval EFI_INVALID_PARAMETER Iter, FileBuffer, or SecDataDir is NULL. + @retval EFI_VOLUME_CORRUPTED SecDataDir is out of bounds of the file, or an entry has a + malformed dwLength. +**/ +EFI_STATUS +WinCertIterInit ( + OUT WIN_CERT_ITER *Iter, + IN CONST VOID *FileBuffer, + IN UINTN FileSize, + IN CONST EFI_IMAGE_DATA_DIRECTORY *SecDataDir + ) +{ + CONST UINT8 *Cursor; + UINTN Remaining; + CONST WIN_CERTIFICATE *Cert; + UINTN EntrySize; + + if ((Iter == NULL) || (FileBuffer == NULL) || (SecDataDir == NULL)) { + return EFI_INVALID_PARAMETER; + } + + if ((SecDataDir->VirtualAddress > FileSize) || + (SecDataDir->Size > FileSize - SecDataDir->VirtualAddress)) + { + DEBUG ((DEBUG_ERROR, "WinCertIter: security data directory is out of bounds of the file.\n")); + return EFI_VOLUME_CORRUPTED; + } + + // + // Validate the entire certificate table up front. + // + Cursor = (CONST UINT8 *)FileBuffer + SecDataDir->VirtualAddress; + Remaining = SecDataDir->Size; + + while (Remaining > 0) { + if (Remaining < sizeof (WIN_CERTIFICATE)) { + DEBUG ((DEBUG_ERROR, "Iterator: trailing bytes in certificate table.\n")); + return EFI_VOLUME_CORRUPTED; + } + + Cert = (CONST WIN_CERTIFICATE *)(CONST VOID *)Cursor; + + if ((Cert->dwLength < sizeof (WIN_CERTIFICATE)) || + (Cert->dwLength > Remaining)) + { + DEBUG ((DEBUG_ERROR, "Iterator: malformed WIN_CERTIFICATE dwLength.\n")); + return EFI_VOLUME_CORRUPTED; + } + + // + // Each entry is padded to an 8-byte boundary. The rounded-up size + // may exceed Remaining if the final entry uses up the rest of the + // table without padding; clamp to Remaining in that case. + // + EntrySize = ALIGN_VALUE (Cert->dwLength, 8); + if (EntrySize > Remaining) { + EntrySize = Remaining; + } + + Cursor += EntrySize; + Remaining -= EntrySize; + } + + Iter->Cursor = (CONST UINT8 *)FileBuffer + SecDataDir->VirtualAddress; + Iter->Remaining = SecDataDir->Size; + return EFI_SUCCESS; +} + +/** + Return the next WIN_CERTIFICATE from the directory being iterated. + + Cannot fail after a successful WinCertIterInit. + + @param[in,out] Iter Iterator initialized by WinCertIterInit. + + @retval non-NULL Pointer to the next WIN_CERTIFICATE. + @retval NULL Iteration is complete. +**/ +CONST WIN_CERTIFICATE * +WinCertIterNext ( + IN OUT WIN_CERT_ITER *Iter + ) +{ + CONST WIN_CERTIFICATE *Cert; + UINTN EntrySize; + + if ((Iter == NULL) || (Iter->Remaining == 0)) { + return NULL; + } + + Cert = (CONST WIN_CERTIFICATE *)(CONST VOID *)Iter->Cursor; + EntrySize = ALIGN_VALUE (Cert->dwLength, 8); + if (EntrySize > Iter->Remaining) { + EntrySize = Iter->Remaining; + } + + Iter->Cursor += EntrySize; + Iter->Remaining -= EntrySize; + return Cert; +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/Iterator.h b/SecurityPkg/Library/DxeImageVerificationLib2/Iterator.h new file mode 100644 index 00000000000..5050461a90a --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/Iterator.h @@ -0,0 +1,182 @@ +/** @file + Forward-only iterators for walking different data structures. + + Iterators perform data validation during initialization. If initialization succeeds, the + iterator is guaranteed to produce valid results during iteration. This does mean that certain + iterator implemenations walk the data structures twice. Once during initialization to validate + the data, and again during iteration to produce the results. + + All iterators use the same Init / Next contract. `Init(..)` initializes the iterator + and validates the structure while `Next(..)` returns the next item or NULL once + initialized. + + Three iterators are provided: + + * SIG_DATABASE_ITER - walks every EFI_SIGNATURE_LIST in a signature + database buffer (db / dbx / dbt contents). + * SIG_LIST_ITER - walks every EFI_SIGNATURE_DATA entry inside a + single EFI_SIGNATURE_LIST. + * WIN_CERT_ITER - walks every WIN_CERTIFICATE in a PE/COFF + image's security data directory. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef DXE_IMAGE_VERIFICATION_LIB_ITERATOR_H_ +#define DXE_IMAGE_VERIFICATION_LIB_ITERATOR_H_ + +#include +#include +#include +#include +#include + +/** + Iterator state for walking EFI_SIGNATURE_LIST records inside a + signature-database buffer. + + Fields are owned by the iterator implementation; callers should treat them as opaque. +**/ +typedef struct { + CONST UINT8 *Cursor; // Next byte to consume. + UINTN Remaining; // Bytes left in the buffer. +} SIG_DATABASE_ITER; + +/** + Iterator state for walking EFI_SIGNATURE_DATA entries inside a single EFI_SIGNATURE_LIST. + + Fields are owned by the iterator implementation; callers should treat them as opaque. +**/ +typedef struct { + CONST UINT8 *Cursor; // Next entry pointer. + UINTN Stride; // SignatureSize from the parent list. + UINTN Remaining; // Entries left to produce. +} SIG_LIST_ITER; + +/** + Iterator state for walking WIN_CERTIFICATE records inside a PE/COFF image's security data + directory. + + Fields are owned by the iterator implementation; callers should treat them as opaque. +**/ +typedef struct { + CONST UINT8 *Cursor; // Next byte to consume. + UINTN Remaining; // Bytes left in the certificate table. +} WIN_CERT_ITER; + +/** + Initialize an iterator over the EFI_SIGNATURE_LIST records contained in a signature database + buffer. + + Init validates every list header in the buffer end-to-end. After a successful return, + DatabaseIterNext is infallible. + + @param[out] Iter Iterator state to initialize. + @param[in] Buffer Raw database contents, or NULL for an empty database. + @param[in] BufferSize Size of Buffer in bytes; 0 when Buffer is NULL. + + @retval EFI_SUCCESS Iterator is ready for use. + @retval EFI_INVALID_PARAMETER Iter is NULL, or Buffer is NULL with a non-zero BufferSize. + @retval EFI_VOLUME_CORRUPTED The buffer contains a malformed EFI_SIGNATURE_LIST (bad size + fields, trailing bytes, or payload not a multiple of + SignatureSize). +**/ +EFI_STATUS +DatabaseIterInit ( + OUT SIG_DATABASE_ITER *Iter, + IN CONST VOID *Buffer, + IN UINTN BufferSize + ); + +/** + Return the next EFI_SIGNATURE_LIST from the buffer being iterated. + + Cannot fail after a successful DatabaseIterInit. + + @param[in,out] Iter Iterator initialized by DatabaseIterInit. + + @retval non-NULL Pointer to the next EFI_SIGNATURE_LIST. + @retval NULL Iteration is complete. +**/ +CONST EFI_SIGNATURE_LIST * +DatabaseIterNext ( + IN OUT SIG_DATABASE_ITER *Iter + ); + +/** + Initialize an iterator over the EFI_SIGNATURE_DATA entries contained in a single + EFI_SIGNATURE_LIST. + + Init validates the list's size fields. After a successful return, SigListIterNext is infallible. + + @param[out] Iter Iterator state to initialize. + @param[in] List The signature list to walk. + + @retval EFI_SUCCESS Iterator is ready for use. + @retval EFI_INVALID_PARAMETER Iter or List is NULL. + @retval EFI_VOLUME_CORRUPTED List has internally inconsistent size fields. +**/ +EFI_STATUS +SigListIterInit ( + OUT SIG_LIST_ITER *Iter, + IN CONST EFI_SIGNATURE_LIST *List + ); + +/** + Return the next EFI_SIGNATURE_DATA entry from the list being iterated. + + Cannot fail after a successful SigListIterInit. + + @param[in,out] Iter Iterator initialized by SigListIterInit. + + @retval non-NULL Pointer to the next EFI_SIGNATURE_DATA entry. + @retval NULL Iteration is complete. +**/ +CONST EFI_SIGNATURE_DATA * +SigListIterNext ( + IN OUT SIG_LIST_ITER *Iter + ); + +/** + Initialize an iterator over the WIN_CERTIFICATE records contained in a PE/COFF image's security + data directory. + + Init validates that the directory described by SecDataDir lies entirely within the supplied file + buffer and walks every WIN_CERTIFICATE header to verify its dwLength fits the remaining table. + After a successful return, WinCertIterNext is infallible. + + @param[out] Iter Iterator state to initialize. + @param[in] FileBuffer Pointer to the in-memory PE/COFF image. + @param[in] FileSize Size of FileBuffer in bytes. + @param[in] SecDataDir Security data directory describing the embedded WIN_CERTIFICATE table. + + @retval EFI_SUCCESS Iterator is ready for use. + @retval EFI_INVALID_PARAMETER Iter, FileBuffer, or SecDataDir is NULL. + @retval EFI_VOLUME_CORRUPTED SecDataDir is out of bounds of the file, or an entry has a + malformed dwLength. +**/ +EFI_STATUS +WinCertIterInit ( + OUT WIN_CERT_ITER *Iter, + IN CONST VOID *FileBuffer, + IN UINTN FileSize, + IN CONST EFI_IMAGE_DATA_DIRECTORY *SecDataDir + ); + +/** + Return the next WIN_CERTIFICATE from the directory being iterated. + + Cannot fail after a successful WinCertIterInit. + + @param[in,out] Iter Iterator initialized by WinCertIterInit. + + @retval non-NULL Pointer to the next WIN_CERTIFICATE. + @retval NULL Iteration is complete. +**/ +CONST WIN_CERTIFICATE * +WinCertIterNext ( + IN OUT WIN_CERT_ITER *Iter + ); + +#endif // DXE_IMAGE_VERIFICATION_LIB_ITERATOR_H_ diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/Measurement.c b/SecurityPkg/Library/DxeImageVerificationLib2/Measurement.c new file mode 100644 index 00000000000..3ae9f34d0e1 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/Measurement.c @@ -0,0 +1,400 @@ +/** @file + Secure Boot authority measurement for the DXE Image Verification Library. + + When an image is authorized by an entry in the `db` signature database, the + EFI_SIGNATURE_DATA entry that authorized it is measured into PCR 7 as an + EV_EFI_VARIABLE_AUTHORITY event. This records which trust anchor authorized + the image (not the image content). Each unique authority entry is measured + at most once per boot; the module-global MEASURED_AUTHORITIES state, obtained + through GetMeasuredAuthorities (), provides the de-duplication. + + Caution: This file consumes external input (the signature databases that the + authority entries are copied from). All inputs must be treated as + attacker-controlled. + + Copyright (c) 2013 - 2018, Intel Corporation. All rights reserved.
+ Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "DxeImageVerificationLib.h" + +#include +#include +#include +#include + +// +// Number of MEASURED_VARIABLE slots to grow the tracking list by each time it +// fills up. +// +#define MEASURED_AUTHORITY_COUNT_INCREMENT 0x100 + +// +// Mapping of (VariableName, VendorGuid) pairs that are treated as Secure Boot +// authority variables. Only entries authorized by these variables are measured +// into PCR 7. +// +typedef struct { + CHAR16 *VariableName; + EFI_GUID *VendorGuid; +} AUTHORITY_VARIABLE; + +STATIC AUTHORITY_VARIABLE mAuthorityVariables[] = { + { EFI_IMAGE_SECURITY_DATABASE, &gEfiImageSecurityDatabaseGuid }, +}; + +// +// Module-global authority measurement state. The only consumer that touches +// this global directly is GetMeasuredAuthorities (); every other function +// operates on a caller-supplied MEASURED_AUTHORITIES pointer so it can be unit +// tested without global state. +// +STATIC MEASURED_AUTHORITIES mMeasuredAuthorities = { NULL, 0, 0 }; + +/** + Return the module-global authority measurement state. + + The returned pointer references storage that persists for the lifetime of + the module so that measurement de-duplication is maintained across every + image the verification handler processes. + + @return Pointer to the module-global MEASURED_AUTHORITIES instance. +**/ +MEASURED_AUTHORITIES * +GetMeasuredAuthorities ( + VOID + ) +{ + return &mMeasuredAuthorities; +} + +/** + Return the canonical storage for a Secure Boot authority variable name. + + Measured records reference canonical name storage owned by this module so + that the records remain valid independent of the caller's buffers. + + @param[in] VariableName A Null-terminated authority variable name. + + @return The canonical pointer for VariableName, or NULL if VariableName is + not a known authority variable. +**/ +CHAR16 * +AssignVariableName ( + IN CHAR16 *VariableName + ) +{ + UINTN Index; + + if (VariableName == NULL) { + return NULL; + } + + for (Index = 0; Index < ARRAY_SIZE (mAuthorityVariables); Index++) { + if (StrCmp (VariableName, mAuthorityVariables[Index].VariableName) == 0) { + return mAuthorityVariables[Index].VariableName; + } + } + + return NULL; +} + +/** + Return the canonical storage for a Secure Boot authority vendor GUID. + + Measured records reference canonical GUID storage owned by this module so + that the records remain valid independent of the caller's buffers. + + @param[in] VendorGuid A vendor GUID to canonicalize. + + @return The canonical pointer for VendorGuid, or NULL if VendorGuid is not a + known authority vendor GUID. +**/ +EFI_GUID * +AssignVendorGuid ( + IN EFI_GUID *VendorGuid + ) +{ + UINTN Index; + + if (VendorGuid == NULL) { + return NULL; + } + + for (Index = 0; Index < ARRAY_SIZE (mAuthorityVariables); Index++) { + if (CompareGuid (VendorGuid, mAuthorityVariables[Index].VendorGuid)) { + return mAuthorityVariables[Index].VendorGuid; + } + } + + return NULL; +} + +/** + Determine whether a variable is a Secure Boot authority variable. + + @param[in] VariableName A Null-terminated variable name. + @param[in] VendorGuid The variable's vendor GUID. + + @retval TRUE The variable is a Secure Boot authority variable. + @retval FALSE The variable is not a Secure Boot authority variable, or a + required pointer was NULL. +**/ +BOOLEAN +IsSecureAuthorityVariable ( + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid + ) +{ + UINTN Index; + + if ((VariableName == NULL) || (VendorGuid == NULL)) { + return FALSE; + } + + for (Index = 0; Index < ARRAY_SIZE (mAuthorityVariables); Index++) { + if ((StrCmp (VariableName, mAuthorityVariables[Index].VariableName) == 0) && + CompareGuid (VendorGuid, mAuthorityVariables[Index].VendorGuid)) + { + return TRUE; + } + } + + return FALSE; +} + +/** + Determine whether an authority entry has already been measured this boot. + + @param[in] Measured Authority measurement state to consult. + @param[in] VariableName Name of the variable that authorized the image. + @param[in] VendorGuid Vendor GUID of the variable that authorized the image. + @param[in] Data The EFI_SIGNATURE_DATA entry that authorized the image. + @param[in] Size Size, in bytes, of Data. + + @retval TRUE The entry has already been measured. + @retval FALSE The entry has not been measured, or a required pointer was NULL. +**/ +BOOLEAN +IsDataMeasured ( + IN CONST MEASURED_AUTHORITIES *Measured, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN VOID *Data, + IN UINTN Size + ) +{ + UINTN Index; + + if ((Measured == NULL) || (VariableName == NULL) || (VendorGuid == NULL) || (Data == NULL)) { + return FALSE; + } + + for (Index = 0; Index < Measured->Count; Index++) { + if ((Measured->List[Index].VariableName != NULL) && + (Measured->List[Index].VendorGuid != NULL) && + (Measured->List[Index].Data != NULL) && + (Size == Measured->List[Index].Size) && + (StrCmp (VariableName, Measured->List[Index].VariableName) == 0) && + CompareGuid (VendorGuid, Measured->List[Index].VendorGuid) && + (CompareMem (Data, Measured->List[Index].Data, Size) == 0)) + { + return TRUE; + } + } + + return FALSE; +} + +/** + Record an authority entry as measured, growing the tracking list as needed. + + A private copy of Data is allocated so the record remains valid independent + of the caller's buffer. + + @param[in,out] Measured Authority measurement state to update. + @param[in] VariableName Name of the variable that authorized the image. + @param[in] VendorGuid Vendor GUID of the variable that authorized the image. + @param[in] Data The EFI_SIGNATURE_DATA entry that authorized the image. + @param[in] Size Size, in bytes, of Data. + + @retval EFI_SUCCESS The entry was recorded. + @retval EFI_INVALID_PARAMETER A required pointer was NULL or Size was 0. + @retval EFI_OUT_OF_RESOURCES A required allocation failed. +**/ +EFI_STATUS +AddDataMeasured ( + IN OUT MEASURED_AUTHORITIES *Measured, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN VOID *Data, + IN UINTN Size + ) +{ + MEASURED_VARIABLE *NewList; + + if ((Measured == NULL) || (VariableName == NULL) || (VendorGuid == NULL) || + (Data == NULL) || (Size == 0)) + { + return EFI_INVALID_PARAMETER; + } + + ASSERT (Measured->Count <= Measured->Max); + + if (Measured->Count == Measured->Max) { + NewList = AllocateZeroPool ( + sizeof (MEASURED_VARIABLE) * (Measured->Max + MEASURED_AUTHORITY_COUNT_INCREMENT) + ); + if (NewList == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + if (Measured->List != NULL) { + CopyMem (NewList, Measured->List, sizeof (MEASURED_VARIABLE) * Measured->Count); + FreePool (Measured->List); + } + + Measured->List = NewList; + Measured->Max += MEASURED_AUTHORITY_COUNT_INCREMENT; + } + + Measured->List[Measured->Count].Data = AllocateCopyPool (Size, Data); + if (Measured->List[Measured->Count].Data == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Measured->List[Measured->Count].VariableName = AssignVariableName (VariableName); + Measured->List[Measured->Count].VendorGuid = AssignVendorGuid (VendorGuid); + Measured->List[Measured->Count].Size = Size; + Measured->Count++; + + return EFI_SUCCESS; +} + +/** + Measure and log an EFI variable, and extend the measurement into PCR 7. + + @param[in] VarName A Null-terminated authority variable name. + @param[in] VendorGuid The variable's vendor GUID. + @param[in] VarData The EFI_SIGNATURE_DATA entry that authorized the image. + @param[in] VarSize Size, in bytes, of VarData. + + @retval EFI_SUCCESS The measurement completed successfully. + @retval EFI_INVALID_PARAMETER A required pointer was NULL. + @retval EFI_OUT_OF_RESOURCES A required allocation failed. + @retval EFI_DEVICE_ERROR The measurement was unsuccessful. +**/ +EFI_STATUS +MeasureVariable ( + IN CHAR16 *VarName, + IN EFI_GUID *VendorGuid, + IN VOID *VarData, + IN UINTN VarSize + ) +{ + EFI_STATUS Status; + UINTN VarNameLength; + UEFI_VARIABLE_DATA *VarLog; + UINT32 VarLogSize; + + if ((VarName == NULL) || (VendorGuid == NULL) || (VarData == NULL)) { + return EFI_INVALID_PARAMETER; + } + + // + // The UEFI_VARIABLE_DATA.VariableData value shall be the EFI_SIGNATURE_DATA + // value from the EFI_SIGNATURE_LIST that contained the authority that was + // used to validate the image. + // + VarNameLength = StrLen (VarName); + VarLogSize = (UINT32)(sizeof (*VarLog) + VarNameLength * sizeof (*VarName) + VarSize + - sizeof (VarLog->UnicodeName) - sizeof (VarLog->VariableData)); + + VarLog = (UEFI_VARIABLE_DATA *)AllocateZeroPool (VarLogSize); + if (VarLog == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (&VarLog->VariableName, VendorGuid, sizeof (VarLog->VariableName)); + VarLog->UnicodeNameLength = VarNameLength; + VarLog->VariableDataLength = VarSize; + CopyMem ( + VarLog->UnicodeName, + VarName, + VarNameLength * sizeof (*VarName) + ); + CopyMem ( + (CHAR16 *)VarLog->UnicodeName + VarNameLength, + VarData, + VarSize + ); + + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: MeasureVariable (Pcr - %x, EventType - %x, ", (UINTN)7, (UINTN)EV_EFI_VARIABLE_AUTHORITY)); + DEBUG ((DEBUG_INFO, "VariableName - %s, VendorGuid - %g)\n", VarName, VendorGuid)); + + Status = TpmMeasureAndLogData ( + 7, + EV_EFI_VARIABLE_AUTHORITY, + VarLog, + VarLogSize, + VarLog, + VarLogSize + ); + FreePool (VarLog); + + return Status; +} + +/** + Measure a Secure Boot authority entry into PCR 7, skipping entries that have + already been measured this boot. + + If VariableName / VendorGuid do not identify a Secure Boot authority + variable, or the supplied data has already been measured, the call is a + no-op. Otherwise the data is measured via TpmMeasureAndLogData and recorded + in Measured so subsequent identical entries are not measured again. + + @param[in,out] Measured Authority measurement state to consult and update. + @param[in] VariableName Name of the variable that authorized the image. + @param[in] VendorGuid Vendor GUID of the variable that authorized the image. + @param[in] Authority The `db` authority that authorized the image, whose Data / Size + identify the EFI_SIGNATURE_DATA entry to measure. +**/ +VOID +SecureBootHook ( + IN OUT MEASURED_AUTHORITIES *Measured, + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + IN CONST IMAGE_AUTHORITY *Authority + ) +{ + EFI_STATUS Status; + VOID *Data; + UINTN DataSize; + + if ((Measured == NULL) || (Authority == NULL) || + (Authority->Data == NULL) || (Authority->Size == 0)) + { + return; + } + + Data = (VOID *)Authority->Data; + DataSize = Authority->Size; + + if (!IsSecureAuthorityVariable (VariableName, VendorGuid)) { + return; + } + + if (IsDataMeasured (Measured, VariableName, VendorGuid, Data, DataSize)) { + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: authority already measured.\n")); + return; + } + + Status = MeasureVariable (VariableName, VendorGuid, Data, DataSize); + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: MeasureVariable - %r\n", Status)); + + if (!EFI_ERROR (Status)) { + AddDataMeasured (Measured, VariableName, VendorGuid, Data, DataSize); + } +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/Policy.c b/SecurityPkg/Library/DxeImageVerificationLib2/Policy.c new file mode 100644 index 00000000000..01d75384800 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/Policy.c @@ -0,0 +1,141 @@ +/** @file + Image verification policy helpers for the DXE Image Verification Library. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "DxeImageVerificationLib.h" + +/** + Determine whether the given device path resolves to a Firmware Volume. + + @param[in] File Device path describing the image origin. + + @retval EFI_SUCCESS The image is from a Firmware Volume. + @retval EFI_NOT_FOUND The image is not from a Firmware Volume. + @retval EFI_INVALID_PARAMETER File is NULL. +**/ +EFI_STATUS +IsFromFv ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File + ) +{ + EFI_STATUS Status; + EFI_HANDLE DeviceHandle; + EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; + + if (File == NULL) { + return EFI_INVALID_PARAMETER; + } + + DeviceHandle = NULL; + TempDevicePath = (EFI_DEVICE_PATH_PROTOCOL *)File; + Status = gBS->LocateDevicePath ( + &gEfiFirmwareVolume2ProtocolGuid, + &TempDevicePath, + &DeviceHandle + ); + if (EFI_ERROR (Status)) { + return EFI_NOT_FOUND; + } + + // + // Confirm the protocol is actually present on the resolved handle. + // + Status = gBS->OpenProtocol ( + DeviceHandle, + &gEfiFirmwareVolume2ProtocolGuid, + NULL, + NULL, + NULL, + EFI_OPEN_PROTOCOL_TEST_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return EFI_NOT_FOUND; + } + + return EFI_SUCCESS; +} + +/** + Determines the Image type classification. + + @param[in] File Device path describing the image origin. + @param[out] ImageType The classification of the image source. + + @retval EFI_SUCCESS ImageType contains a valid value. + @retval EFI_INVALID_PARAMETER File or ImageType is NULL. +**/ +EFI_STATUS +GetImageType ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File, + OUT UINT32 *ImageType + ) +{ + if ((File == NULL) || (ImageType == NULL)) { + return EFI_INVALID_PARAMETER; + } + + if (!EFI_ERROR (IsFromFv (File))) { + *ImageType = IMAGE_FROM_FV; + return EFI_SUCCESS; + } + + *ImageType = IMAGE_UNKNOWN; + return EFI_SUCCESS; +} + +/** + Look up the configured authorization policy for the given image source. + + IMAGE_FROM_FV is mapped to ALWAYS_EXECUTE; all other image types map to + DENY_EXECUTE_ON_SECURITY_VIOLATION. + + @param[in] ImageType An IMAGE_* image source classification value. + + @return ALWAYS_EXECUTE or DENY_EXECUTE_ON_SECURITY_VIOLATION. +**/ +UINT32 +GetPolicyForImageType ( + IN UINT32 ImageType + ) +{ + if (ImageType == IMAGE_FROM_FV) { + return ALWAYS_EXECUTE; + } + + return DENY_EXECUTE_ON_SECURITY_VIOLATION; +} + +/** + Resolve an image's authorization policy. + + @param[in] File Device path describing the image origin. + @param[out] Policy On success, filled with the resolved policy value. + + @retval EFI_SUCCESS Policy contains a valid policy value. + @retval EFI_INVALID_PARAMETER File or Policy is NULL. +**/ +EFI_STATUS +GetExecutionPolicy ( + IN CONST EFI_DEVICE_PATH_PROTOCOL *File, + OUT UINT32 *Policy + ) +{ + EFI_STATUS Status; + UINT32 ImageType; + + if ((File == NULL) || (Policy == NULL)) { + return EFI_INVALID_PARAMETER; + } + + Status = GetImageType (File, &ImageType); + if (EFI_ERROR (Status)) { + return Status; + } + + *Policy = GetPolicyForImageType (ImageType); + + return EFI_SUCCESS; +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/README.md b/SecurityPkg/Library/DxeImageVerificationLib2/README.md new file mode 100644 index 00000000000..dfe29da7a3a --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/README.md @@ -0,0 +1,392 @@ +# DxeImageVerificationHandler Flow + +This document describes the runtime flow of +`DxeImageVerificationHandler` in `SecurityPkg/Library/DxeImageVerificationLib2`. +It focuses on the following phases: + +1. **Policy validation** (entry-point gating) +2. **`ValidateImage`** (the single, unified validator for both signed + and unsigned images) +3. The helpers `ValidateImage` drives — `GetImageDigestAuthority` + (image-hash lookup) and `GetImageCertAuthority` (per-certificate + evaluation, which in turn drives `IsCertRevoked` / `IsCertAuthorized`) + +`ValidateImage` builds a single `DIGEST_CACHE` bound to the image and +threads it through every step, so each Authenticode digest is computed +at most once per algorithm regardless of how many `db` / `dbx` lists or +signatures are visited. + +## About this library + +`DxeImageVerificationLib` is a `NULL` library: it has no public class +interface. Linking it into a module runs its constructor, which +registers `DxeImageVerificationHandler` with the platform's Security2 +architectural protocol. From then on, every image the DXE core loads is +routed through that handler, which returns `EFI_SUCCESS` to permit +execution or `EFI_ACCESS_DENIED` to block it. + +### Recording the outcome + +Each rejection is also reported to the OS through the +`EFI_IMAGE_EXECUTION_INFO_TABLE`, a UEFI configuration table published +under `gEfiImageSecurityDatabaseGuid`. Every rejected image appends one +entry whose `EFI_IMAGE_EXECUTION_ACTION` records *why* it was rejected: + +| Action | Meaning | +| --- | --- | +| `EFI_IMAGE_EXECUTION_AUTH_UNTESTED` | Unsigned image that was not authorized. | +| `EFI_IMAGE_EXECUTION_AUTH_SIG_FOUND` | Signed image whose Authenticode hash is enrolled in `dbx`. | +| `EFI_IMAGE_EXECUTION_AUTH_SIG_FAILED` | Signed image with at least one certificate revoked by `dbx` (or otherwise un-evaluable). | +| `EFI_IMAGE_EXECUTION_AUTH_SIG_NOT_FOUND` | Signed image with no certificate in `db` and whose hash is not in `db`. | + +The `SIG_*` actions apply to **signed** images (those carrying a +`WIN_CERTIFICATE`). An **unsigned** image (`SecDataDir.Size == 0`) that +is rejected is *always* recorded as `EFI_IMAGE_EXECUTION_AUTH_UNTESTED`, +regardless of which step denied it — the signed-image reasoning above is +overridden for the unsigned case. The table is written **only on +rejection**; an authorized image produces no entry. + +For the `SIG_FOUND` and `SIG_FAILED` cases the recorded entry also +carries the image digest (wrapped as an `EFI_SIGNATURE_LIST`) so the OS +can identify the offending image; the other cases record no signature. + +### Measuring the outcome + +When an image *is* authorized, the `db` entry that authorized it is +measured into **PCR 7** via `SecureBootHook`. To keep the PCR +measurement faithful to UEFI Secure Boot semantics, each distinct +authority is measured **at most once per boot**: the handler tracks the +set of already-measured authorities and skips any it has seen before, so +loading many images authorized by the same `db` entry extends PCR 7 only +once for that entry. Authorization (and therefore measurement) never +writes the Image Execution Information Table. + +> **Diagram conventions** +> +> - **Yellow** nodes are functions provided by external **library +> classes** (e.g. `BaseCryptLib`, `SecureBootVariableLib`). +> - **Blue** nodes are functions owned by this library that are +> **expanded in a later section**. +> - For simplicity the diagrams assume infallible setup calls (iterator +> init, database load, etc.); the early-abort-on-error branches are +> omitted. + +## 1. Top-level flow + +```mermaid +flowchart TD + A[DxeImageVerificationHandler] --> C[GetExecutionPolicy] + C --> D{{Policy == ALWAYS_EXECUTE?}} + D -- yes --> D1[return EFI_SUCCESS] + D -- no --> E{{IsSecureBootEnabled?}} + E -- no --> E1[return EFI_SUCCESS] + E -- yes --> F[GetImageSecurityDataDirectory] + F --> I[ValidateImage] + + classDef drill fill:#d9ecff,stroke:#2f6fb2,color:#000; + class I drill; + classDef libclass fill:#ffe6a7,stroke:#d9822b,color:#000; + class E libclass; +``` + +Key observations: + +- `GetExecutionPolicy` runs **before** the Secure Boot check because + it is cheap *and* the FV-dispatched-driver fast path (policy = + `ALWAYS_EXECUTE`) is by far the most common path - so short-circuiting + there avoids the Secure Boot variable read and PE/COFF parse for the + overwhelming majority of invocations. +- If Secure Boot is disabled the handler returns `EFI_SUCCESS` without + inspecting the image. (Audit mode has been removed, so there is no + longer a code path that inspects the image when Secure Boot is off.) +- A PE/COFF parse failure in `GetImageSecurityDataDirectory` is treated + as a verification failure (its status is returned). +- There is **one** validator. `ValidateImage` handles both signed and + unsigned images; a `SecDataDir.Size == 0` simply yields an empty + `WIN_CERTIFICATE` walk in step 2. + +## 2. `ValidateImage` + +`ValidateImage` orchestrates three steps against a shared +`DIGEST_CACHE`: + +1. **Image-hash revocation.** Look up the image's Authenticode digest + in `dbx` via `GetImageDigestAuthority`. A hit rejects the image. +2. **Per-`WIN_CERTIFICATE` walk.** For each embedded `WIN_CERTIFICATE`, + ask `GetImageCertAuthority` whether that certificate authorizes the + image. The first certificate that authorizes wins. +3. **Image-hash fallback.** If no embedded signature authorizes the + image, look up the image's digest in `db`. A hit authorizes on the + image-hash path. + +When the image is authorized, the authorizing `db` entry is measured +into PCR 7 via `SecureBootHook` and the function returns `EFI_SUCCESS` +**without** writing the Image Execution Information Table. + +When the image is rejected, `RecordRejectedImage` appends an entry to +the Image Execution Information Table and the function returns +`EFI_ACCESS_DENIED`. + +```mermaid +flowchart TD + A[ValidateImage] --> B[LoadSignatureDatabases db, dbx] + B --> S1[GetImageDigestAuthority dbx] + S1 --> S1Q{{Authority found?}} + S1Q -- yes --> R[Reject] + S1Q -- no --> D1[WinCertIterNext: next WIN_CERTIFICATE] + D1 --> D2{{Entry?}} + D2 -- yes --> IA[GetImageCertAuthority Cert, Cache, Databases] + IA --> IA1{{Authorized?}} + IA1 -- yes --> G[SecureBootHook] + IA1 -- no --> D1 + D2 -- no --> H[GetImageDigestAuthority db] + H --> H1{{Authority found?}} + H1 -- yes --> G + H1 -- no --> R + G --> S[return EFI_SUCCESS] + R --> RR[RecordRejectedImage] + RR --> X[return EFI_ACCESS_DENIED] + + classDef drill fill:#d9ecff,stroke:#2f6fb2,color:#000; + class IA,S1,H drill; +``` + +Rules of thumb: + +- `dbx` is consulted **before** the certificate walk and the `db` + hash fallback. A revoked image hash is denied regardless of `db`. +- The first `WIN_CERTIFICATE` that authorizes wins; the walk is empty + for an unsigned image (`SecDataDir.Size == 0`), so such an image can + only be authorized by the `db` image-hash fallback. + +> The classification of *why* an image was rejected (the +> `EFI_IMAGE_EXECUTION_ACTION` recorded into the Image Execution +> Information Table) is intentionally omitted from this overview. See +> the `ValidateImage` implementation for those details. + +## 3. `GetImageDigestAuthority` + +Image-hash lookup against a single database buffer (used for both the +`dbx` revocation check and the `db` fallback). It walks every +`EFI_SIGNATURE_LIST` in the buffer; for each list it asks `GetHash` for +the image digest under that list's `SignatureType` (memoized in +`Cache`), then byte-compares that digest against every entry in the +list. The first matching entry is reported on `Authority` (including the +list's `SignatureType`). + +An empty database (`Database == NULL` / `DatabaseSize == 0`) is treated +as a successful no-match, not an error. A list whose `SignatureType` is +not a supported image-hash algorithm (`GetHash` returns +`EFI_UNSUPPORTED`) is skipped. + +The diagram below assumes `DatabaseIterInit` / `SigListIterInit` +succeed; on a `GetHash` failure other than `EFI_UNSUPPORTED` the +function returns that error. + +```mermaid +flowchart TD + A[GetImageDigestAuthority Database, Cache] --> E[DatabaseIterNext: next EFI_SIGNATURE_LIST] + E --> E1{{List?}} + E1 -- no --> RNF[return EFI_SUCCESS, no authority] + E1 -- yes --> GH[GetHash Cache → image digest for SignatureType] + GH --> GHU{{Supported hash type?}} + GHU -- no --> E + GHU -- yes --> G[SigListIterNext: next entry] + G --> G1{{Entry?}} + G1 -- no --> E + G1 -- yes --> CM{{Digest matches entry?}} + CM -- no --> G + CM -- yes --> RT[set Authority, return EFI_SUCCESS] +``` + +## 4. `GetImageCertAuthority` + +Evaluates a single `WIN_CERTIFICATE`. It extracts the PKCS#7 `AuthData` +from `Cert` via `GetWinCertificatePkcs7AuthData`, identifies the +Authenticode hash algorithm declared by that signature via +`GetAuthenticodeHashAlgorithm`, computes (or retrieves from `Cache`) +the image digest under that algorithm via `GetHash`, records that +algorithm on `Authority.SignatureType`, then dispatches the resulting +`AuthData` / `ImageHash` pair into `IsCertRevoked` and +`IsCertAuthorized`. + +It returns a three-way status: + +- `EFI_SUCCESS` (with `Authority.Data` set) — a `db` trust anchor + authorized the image. +- `EFI_ACCESS_DENIED` — the certificate is revoked by `dbx`, **or** a + prelude failure prevented evaluation. +- `EFI_NOT_FOUND` — the signature is valid but no `db` trust anchor + authorizes it. + +The diagram below assumes the three prelude calls +(`GetWinCertificatePkcs7AuthData`, `GetAuthenticodeHashAlgorithm`, +`GetHash`) succeed; on any prelude failure the function returns +`EFI_ACCESS_DENIED` with a zero `SignatureType`. + +```mermaid +flowchart TD + A[GetImageCertAuthority Cert, Cache, Databases] --> P[GetWinCertificatePkcs7AuthData] + P --> HA[GetAuthenticodeHashAlgorithm AuthData] + HA --> GH[GetHash Cache → image hash] + GH --> DR[IsCertRevoked AuthData, ImageHash, dbx] + DR --> DR1{{Revoked?}} + DR1 -- yes --> RA[return EFI_ACCESS_DENIED] + DR1 -- no --> DA[IsCertAuthorized AuthData, ImageHash, Databases] + DA --> DA1{{Authorized?}} + DA1 -- yes --> RT[return EFI_SUCCESS, Authority set] + DA1 -- no --> RN[return EFI_NOT_FOUND] + + classDef drill fill:#d9ecff,stroke:#2f6fb2,color:#000; + classDef libclass fill:#ffe6a7,stroke:#d9822b,color:#000; + class DR,DA drill; + class HA libclass; +``` + +### 4a. `IsCertRevoked` + +Per-certificate revocation check against `dbx`. The caller supplies +the PKCS#7 `AuthData` payload (extracted from a `WIN_CERTIFICATE` via +`GetWinCertificatePkcs7AuthData`) and the precomputed Authenticode +image hash for the algorithm declared by that signature. Runs in two +phases against the same `AuthData`. The first phase walks every X.509 +entry in every `EFI_CERT_X509_GUID` signature list in `dbx` and asks +`AuthenticodeVerify` whether the image was signed by that +revoked anchor. The second phase walks the signer chain returned by +`Pkcs7GetSigners` and, for each signer, asks `IsTBSCertHashInDbx` +whether the signer's TBS hash appears in `dbx`. Any hit in either +phase revokes the certificate. + +`Pkcs7GetSigners` returning FALSE means the signer chain is +unavailable, so phase 2 is skipped and only phase 1's result counts. +Missing parameters and an empty `dbx` fail open (return FALSE — let +`IsCertAuthorized` make the final decision). + +The diagram below assumes `DatabaseIterInit` and `X509GetTBSCert` +succeed; on failure the function fails closed and returns TRUE. + +```mermaid +flowchart TD + A[IsCertRevoked AuthData, ImageHash, dbx] --> E[DatabaseIterNext: next EFI_SIGNATURE_LIST] + E --> E1{{X509 list with payload?}} + E1 -- no, more lists --> E + E1 -- no, end --> S[Pkcs7GetSigners AuthData] + E1 -- yes --> G[SigListIterNext: next entry] + G --> G1{{Entry?}} + G1 -- no --> E + G1 -- yes --> AV[AuthenticodeVerify entry, ImageHash] + AV --> AV1{{Verifies?}} + AV1 -- yes --> RT[return TRUE] + AV1 -- no --> G + + S --> S1{{Signers?}} + S1 -- no --> RF[return FALSE] + S1 -- yes --> W[walk EFI_CERT_STACK entries] + W --> TBS[X509GetTBSCert signer] + TBS --> ID[IsTBSCertHashInDbx TBS, dbx] + ID --> ID1{{In dbx?}} + ID1 -- yes --> FC[return TRUE] + ID1 -- no, more signers --> W + ID1 -- no, end --> FF[return FALSE] + + classDef drill fill:#d9ecff,stroke:#2f6fb2,color:#000; + class ID drill; + classDef libclass fill:#ffe6a7,stroke:#d9822b,color:#000; + class AV,S,TBS libclass; +``` + +Phase 2's per-signer revocation check (`IsTBSCertHashInDbx`) is detailed +in section 4c. + +### 4b. `IsCertAuthorized` + +Given a PKCS#7 `AuthData` payload and the precomputed Authenticode +image hash (both supplied by the caller), asks `db` to authorize the +signature. For each `EFI_SIGNATURE_LIST` in `db`, dispatches by +`SignatureType` GUID: + +- `EFI_CERT_X509_GUID` → `IsPkcs7AuthDataAuthorizedByX509List`: walk + each X.509 trust anchor, verify with `AuthenticodeVerify`, extract + TBS, reject if the TBS hash is enrolled in `dbx`. +- Any X.509-cert-hash list GUID (matched via `IsX509CertHashGuid`, + e.g. `EFI_CERT_X509_SHA256_GUID`, future digests such as SM3, etc.) + → `IsPkcs7AuthDataAuthorizedByX509HashList`: TODO — match each entry + against the TBS hashes of signers carried in `AuthData`, then check + `dbx`. + +Returns TRUE on the first trust anchor in `db` that both verifies the +signature **and** is not revoked by `dbx`. + +The diagram below assumes `DatabaseIterInit` on `db` succeeds; on +failure the function simply returns FALSE. + +```mermaid +flowchart TD + A[IsCertAuthorized AuthData, ImageHash, Databases] --> E[DatabaseIterNext: next EFI_SIGNATURE_LIST] + E --> E1{{List?}} + E1 -- no --> R[return FALSE] + E1 -- yes --> DG{{SignatureType?}} + DG -- EFI_CERT_X509_GUID --> G + DG -- X.509-cert-hash GUID --> HL[IsPkcs7AuthDataAuthorizedByX509HashList TODO] + DG -- other --> E + HL --> E + + subgraph SUB[IsPkcs7AuthDataAuthorizedByX509List List] + direction TB + G[SigListIterNext: next entry] + G --> G1{{Entry?}} + G1 -- yes --> H[AuthenticodeVerify AuthData, ImageHash] + H --> H1{{Verifies?}} + H1 -- no --> G + H1 -- yes --> I[X509GetTBSCert entry] + I --> J{{IsTBSCertHashInDbx?}} + J -- yes --> G + end + + G1 -- no --> E + J -- no --> T[return TRUE] + + classDef drill fill:#d9ecff,stroke:#2f6fb2,color:#000; + class J drill; + classDef libclass fill:#ffe6a7,stroke:#d9822b,color:#000; + class H,I libclass; +``` + +For each verifying trust anchor, `X509GetTBSCert` extracts the TBS bytes +and `IsTBSCertHashInDbx` (section 4c) performs the trust-anchor +revocation check (distinct from the per-certificate signer-chain +revocation in section 4a above, which targets the signing certificates +carried in the image). + +### 4c. `IsTBSCertHashInDbx` + +Shared revocation primitive used by both `IsCertRevoked` (4a, against +the image's signer chain) and `IsCertAuthorized` (4b, against a +verifying `db` trust anchor). Given the DER TBS-certificate bytes, it +asks whether that certificate's hash is enrolled in `dbx`. + +It walks every `EFI_SIGNATURE_LIST` in `dbx`; for each list it computes +the TBS hash under the list's `SignatureType` (skipping lists whose type +is not a supported hash algorithm) and byte-compares that hash against +every entry. A match means the certificate is revoked. + +It fails **closed**: an empty `dbx` returns FALSE (nothing revoked), but +a malformed `dbx`, a hash-computation failure, or a malformed list is +treated as a revocation hit (returns TRUE). It reports "not present" +(FALSE) only after cleanly walking the entire `dbx` with no match. + +```mermaid +flowchart TD + A[IsTBSCertHashInDbx TBSCert, dbx] --> E[DatabaseIterNext: next EFI_SIGNATURE_LIST] + E --> E1{{List?}} + E1 -- no --> RF[return FALSE] + E1 -- yes --> GH[GetHash → TBS hash for SignatureType] + GH --> GHU{{Supported hash type?}} + GHU -- no --> E + GHU -- yes --> G[SigListIterNext: next entry] + G --> G1{{Entry?}} + G1 -- no --> E + G1 -- yes --> CM{{Hash matches entry?}} + CM -- no --> G + CM -- yes --> RT[return TRUE] +``` diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/Support.c b/SecurityPkg/Library/DxeImageVerificationLib2/Support.c new file mode 100644 index 00000000000..38f1640d059 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/Support.c @@ -0,0 +1,307 @@ +/** @file + Utility functions for DxeImageVerificationLib. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#include "Support.h" + +/** + Resolve the hash-algorithm table index for Guid according to cache type. + + @param[in] CacheType Digest cache type selecting the compatible GUID namespace. + @param[in] Guid Candidate signature-type GUID. + @param[out] Index On TRUE return, receives Guid's position in mHashAlgorithms. + + @retval TRUE Guid matched an entry compatible with CacheType. + @retval FALSE CacheType is unsupported, Guid is NULL, Index is NULL, or Guid is not compatible + with CacheType. +**/ +STATIC +BOOLEAN +GetIndex ( + IN DIGEST_CACHE_TYPE CacheType, + IN CONST EFI_GUID *Guid, + OUT UINTN *Index + ) +{ + UINTN I; + + if ((Guid == NULL) || (Index == NULL)) { + return FALSE; + } + + for (I = 0; I < ARRAY_SIZE (mHashAlgorithms); I++) { + switch (CacheType) { + case DigestCacheTypeImage: + if ((mHashAlgorithms[I].ImageHashGuid != NULL) && + CompareGuid (Guid, mHashAlgorithms[I].ImageHashGuid)) + { + *Index = I; + return TRUE; + } + + break; + + case DigestCacheTypeX509: + if ((mHashAlgorithms[I].X509CertHashGuid != NULL) && + CompareGuid (Guid, mHashAlgorithms[I].X509CertHashGuid)) + { + *Index = I; + return TRUE; + } + + break; + + default: + return FALSE; + } + } + + return FALSE; +} + +/** + Get or compute a cached digest for HashType. + + `Cache->Buffer` is the data to be hashed for cache miss while `Cache->Type` indicates how to + compute the digest. + + Digest calculations are as follows: + - DigestCacheTypeImage: compute using GetAuthenticodeHash() with the specified HashType. + - DigestCacheTypeX509: compute using X509GetTbsCertHash() with the specified HashType. + + @param[in] HashType Signature-type GUID identifying the hash algorithm to use. + @param[in,out] Cache Caller-owned digest cache bound to one buffer via Cache->Buffer / + Cache->BufferSize. + @param[out] Digest On success, receives a pointer to the cached digest bytes. The + pointer is valid for the lifetime of Cache. + @param[out] DigestSize On success, receives the digest length in bytes. + + @retval EFI_SUCCESS Digest / DigestSize describe a valid cached digest. + @retval EFI_INVALID_PARAMETER A required pointer is NULL. + @retval EFI_UNSUPPORTED HashType does not map to an entry in mHashAlgorithms compatible + with Cache->Type. + @retval EFI_COMPROMISED_DATA Cache already holds a digest for this slot but the stored size is invalid. + @retval EFI_SECURITY_VIOLATION The hash operation failed. + @retval other Forwarded from GetAuthenticodeHash or X509GetTbsCertHash. +**/ +EFI_STATUS +GetHash ( + IN CONST EFI_GUID *HashType, + IN OUT DIGEST_CACHE *Cache, + OUT CONST UINT8 **Digest, + OUT UINTN *DigestSize + ) +{ + EFI_STATUS Status; + UINTN SlotIndex; + DIGEST_CACHE_ENTRY *Slot; + + if ((HashType == NULL) || (Cache == NULL) || (Cache->Buffer == NULL) || + (Digest == NULL) || (DigestSize == NULL)) + { + return EFI_INVALID_PARAMETER; + } + + if (!GetIndex (Cache->Type, HashType, &SlotIndex)) { + return EFI_UNSUPPORTED; + } + + Slot = &Cache->Entries[SlotIndex]; + + // + // Populate the cache entry if it is not already populated. + // + if (Slot->BufferSize == 0) { + switch (Cache->Type) { + case DigestCacheTypeImage: + Status = GetAuthenticodeHash ((VOID *)Cache->Buffer, Cache->BufferSize, HashType, Slot->Bytes, &Slot->BufferSize); + if (EFI_ERROR (Status)) { + Slot->BufferSize = 0; + return EFI_SECURITY_VIOLATION; + } + + break; + + case DigestCacheTypeX509: + Status = X509GetTbsCertHash ( + (VOID *)Cache->Buffer, + Cache->BufferSize, + mHashAlgorithms[SlotIndex].ImageHashGuid, // Map the X509 hash type GUID to the base hash type GUID + Slot->Bytes, + &Slot->BufferSize + ); + if (EFI_ERROR (Status)) { + Slot->BufferSize = 0; + return EFI_SECURITY_VIOLATION; + } + + break; + + default: + Slot->BufferSize = 0; + return EFI_UNSUPPORTED; + } + } + + *Digest = Slot->Bytes; + *DigestSize = Slot->BufferSize; + return EFI_SUCCESS; +} + +// +// Image Handle that contains the image bytes and size. +// +typedef struct { + CONST UINT8 *Base; + UINTN BufferSize; +} PE_COFF_IMAGE_HANDLE; + +/** + Buffer size aware implementation of PE_COFF_LOADER_READ_FILE. + + Truncates reads for requests that start within the image bounds, but extends beyond the image + bounds. Sets read size to 0 for requests that start beyond the image bounds. + + @param[in] FileHandle Pointer to a PE_COFF_IMAGE_HANDLE describing + the image bytes available to PeCoffLib. + @param[in] FileOffset Byte offset within the image to read from. + @param[in,out] ReadSize On input, bytes requested. On output, bytes + actually copied (may be 0 or less than + requested if the range extends past EOF). + @param[out] Buffer Destination buffer of at least the input + *ReadSize bytes. + + @retval RETURN_SUCCESS Read succeeded; *ReadSize is the + number of bytes copied. + @retval RETURN_INVALID_PARAMETER FileHandle, ReadSize, or Buffer was + NULL. +**/ +STATIC +RETURN_STATUS +EFIAPI +BoundedImageRead ( + IN VOID *FileHandle, + IN UINTN FileOffset, + IN OUT UINTN *ReadSize, + OUT VOID *Buffer + ) +{ + CONST PE_COFF_IMAGE_HANDLE *Handle; + UINTN Available; + + if ((FileHandle == NULL) || (ReadSize == NULL) || (Buffer == NULL)) { + return RETURN_INVALID_PARAMETER; + } + + Handle = (CONST PE_COFF_IMAGE_HANDLE *)FileHandle; + + if (FileOffset >= Handle->BufferSize) { + *ReadSize = 0; + return RETURN_SUCCESS; + } + + Available = Handle->BufferSize - FileOffset; + if (*ReadSize > Available) { + *ReadSize = Available; + } + + CopyMem (Buffer, Handle->Base + FileOffset, *ReadSize); + return RETURN_SUCCESS; +} + +/** + Locate the EFI_IMAGE_DIRECTORY_ENTRY_SECURITY data directory in the + PE/COFF image contained in FileBuffer. + + Caution: This function may receive untrusted input. The PE/COFF image + is external input and is bounds-checked by PeCoffLib before any field + is dereferenced. + + @param[in] FileBuffer Pointer to the in-memory PE/COFF image. + @param[in] FileSize BufferSize of FileBuffer in bytes. + @param[out] SecDataDir On success, filled with a copy of the image's + security data directory entry. Zeroed when + the image declares no security directory. + + @retval EFI_SUCCESS SecDataDir has been populated. + @retval EFI_INVALID_PARAMETER FileBuffer or SecDataDir is NULL. + @retval EFI_LOAD_ERROR FileBuffer does not contain a valid + PE/COFF image, or PeCoffLib otherwise + rejected the headers. +**/ +EFI_STATUS +GetImageSecurityDataDirectory ( + IN VOID *FileBuffer, + IN UINTN FileSize, + OUT EFI_IMAGE_DATA_DIRECTORY *SecDataDir + ) +{ + RETURN_STATUS PeCoffStatus; + PE_COFF_LOADER_IMAGE_CONTEXT ImageContext; + PE_COFF_IMAGE_HANDLE Handle; + + if ((FileBuffer == NULL) || (SecDataDir == NULL)) { + return EFI_INVALID_PARAMETER; + } + + ZeroMem (SecDataDir, sizeof (*SecDataDir)); + + Handle.Base = (CONST UINT8 *)FileBuffer; + Handle.BufferSize = FileSize; + + // + // Delegate header parsing, signature validation, optional-header + // magic checks, and security-directory bounds checking to PeCoffLib. + // PeCoffLib records the validated security data directory entry in the + // image context, leaving it zeroed when the image declares no security + // directory. + // + ZeroMem (&ImageContext, sizeof (ImageContext)); + ImageContext.Handle = &Handle; + ImageContext.ImageRead = BoundedImageRead; + + PeCoffStatus = PeCoffLoaderGetImageInfo (&ImageContext); + if (RETURN_ERROR (PeCoffStatus)) { + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: PeImage invalid (0x%lx).\n", (UINT64)PeCoffStatus)); + return EFI_LOAD_ERROR; + } + + *SecDataDir = ImageContext.SecurityDataDirectory; + return EFI_SUCCESS; +} + +/** + Determine whether Guid matches any X509CertHashGuid entry in mHashAlgorithms. + + This identifies an `EFI_SIGNATURE_LIST` whose entries are TBS-cert hashes (any + digest-flavored X.509-cert-hash list GUID) rather than full X.509 certificates. + + @param[in] Guid Candidate signature-list type GUID; may be NULL. + + @retval TRUE Guid matches one of the X509CertHashGuid entries in mHashAlgorithms. + @retval FALSE Guid is NULL or does not match any X509CertHashGuid entry. +**/ +BOOLEAN +IsX509CertHashGuid ( + IN CONST EFI_GUID *Guid + ) +{ + UINTN Index; + + if (Guid == NULL) { + return FALSE; + } + + for (Index = 0; Index < ARRAY_SIZE (mHashAlgorithms); Index++) { + if ((mHashAlgorithms[Index].X509CertHashGuid != NULL) && + CompareGuid (Guid, mHashAlgorithms[Index].X509CertHashGuid)) + { + return TRUE; + } + } + + return FALSE; +} diff --git a/SecurityPkg/Library/DxeImageVerificationLib2/Support.h b/SecurityPkg/Library/DxeImageVerificationLib2/Support.h new file mode 100644 index 00000000000..7d799ee6943 --- /dev/null +++ b/SecurityPkg/Library/DxeImageVerificationLib2/Support.h @@ -0,0 +1,126 @@ +/** @file + Utility functions for DxeImageVerificationLib. + + Copyright (C) Microsoft Corporation. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent +**/ + +#ifndef DXE_IMAGE_VERIFICATION_LIB_SUPPORT_H_ +#define DXE_IMAGE_VERIFICATION_LIB_SUPPORT_H_ + +#include "DxeImageVerificationLib.h" + +#include + +// +// An enum to specify the type of data being cached in an instance of `DIGEST_CACHE`. +// +typedef enum { + DigestCacheTypeImage, + DigestCacheTypeX509 +} DIGEST_CACHE_TYPE; + +// +// A cached digest slot in `DIGEST_CACHE`. The slot's position within `DIGEST_CACHE::Entries` +// identifies the hash algorithm (ordering matches `mHashAlgorithms`). +// +// BufferSize == 0 marks an empty slot; any non-zero BufferSize identifies a valid cached digest +// for that particular hash algorithm (based on index compared to `mHashAlgorithms`). +// +typedef struct { + UINT8 Bytes[MAX_DIGEST_SIZE]; + UINTN BufferSize; +} DIGEST_CACHE_ENTRY; + +// +// Caller-owned digest cache, one fixed slot per supported hash algorithm based on +// `mHashAlgorithms` order. +// +// The structure should be zero-initialized before use as the DigestSize in each entry is used to +// determine whether the slot contains a valid cached digest. +// +typedef struct { + DIGEST_CACHE_TYPE Type; + CONST VOID *Buffer; + UINTN BufferSize; + DIGEST_CACHE_ENTRY Entries[ARRAY_SIZE (mHashAlgorithms)]; +} DIGEST_CACHE; + +/** + Get or compute a cached digest for HashType. + + `Cache->Buffer` is the data to be hashed for cache miss while `Cache->Type` indicates how to + compute the digest. + + Digest calculations are as follows: + - DigestCacheTypeImage: compute using GetAuthenticodeHash() with the specified HashType. + - DigestCacheTypeX509: compute using X509GetTbsCertHash() with the specified HashType. + + @param[in] HashType Signature-type GUID identifying the hash algorithm to use. + @param[in,out] Cache Caller-owned digest cache bound to one buffer via Cache->Buffer / + Cache->BufferSize. + @param[out] Digest On success, receives a pointer to the cached digest bytes. The + pointer is valid for the lifetime of Cache. + @param[out] DigestSize On success, receives the digest length in bytes. + + @retval EFI_SUCCESS Digest / DigestSize describe a valid cached digest. + @retval EFI_INVALID_PARAMETER A required pointer is NULL. + @retval EFI_UNSUPPORTED HashType does not map to an entry in mHashAlgorithms compatible + with Cache->Type. + @retval EFI_COMPROMISED_DATA Cache already holds a digest for this slot but the stored size is invalid. + @retval EFI_SECURITY_VIOLATION The hash operation failed. + @retval other Forwarded from GetAuthenticodeHash or X509GetTbsCertHash. +**/ +EFI_STATUS +GetHash ( + IN CONST EFI_GUID *HashType, + IN OUT DIGEST_CACHE *Cache, + OUT CONST UINT8 **Digest, + OUT UINTN *DigestSize + ); + +/** + Locate the EFI_IMAGE_DIRECTORY_ENTRY_SECURITY data directory in the + PE/COFF image contained in FileBuffer. + + Caution: This function may receive untrusted input. The PE/COFF image + is external input and is bounds-checked by PeCoffLib before any field + is dereferenced. + + @param[in] FileBuffer Pointer to the in-memory PE/COFF image. + @param[in] FileSize BufferSize of FileBuffer in bytes. + @param[out] SecDataDir On success, filled with a copy of the image's + security data directory entry. Zeroed when + the image declares no security directory. + + @retval EFI_SUCCESS SecDataDir has been populated. + @retval EFI_INVALID_PARAMETER FileBuffer or SecDataDir is NULL. + @retval EFI_LOAD_ERROR FileBuffer does not contain a valid + PE/COFF image, or PeCoffLib otherwise + rejected the headers. +**/ +EFI_STATUS +GetImageSecurityDataDirectory ( + IN VOID *FileBuffer, + IN UINTN FileSize, + OUT EFI_IMAGE_DATA_DIRECTORY *SecDataDir + ); + +/** + Determine whether Guid matches any X509CertHashGuid entry in mHashAlgorithms. + + This identifies an `EFI_SIGNATURE_LIST` whose entries are TBS-cert hashes (any + digest-flavored X.509-cert-hash list GUID, e.g. `EFI_CERT_X509_SHA256_GUID` or + future digests such as SM3) rather than full X.509 certificates. + + @param[in] Guid Candidate signature-list type GUID; may be NULL. + + @retval TRUE Guid matches one of the X509CertHashGuid entries in mHashAlgorithms. + @retval FALSE Guid is NULL or does not match any X509CertHashGuid entry. +**/ +BOOLEAN +IsX509CertHashGuid ( + IN CONST EFI_GUID *Guid + ); + +#endif // DXE_IMAGE_VERIFICATION_LIB_SUPPORT_H_ diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index 9029fa7a821..caac5a35275 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -206,6 +206,7 @@ [Components] SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib.inf + SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.inf SecurityPkg/Library/DxeImageAuthenticationStatusLib/DxeImageAuthenticationStatusLib.inf # @@ -441,6 +442,15 @@ # SecurityPkg/FvReportPei/FvReportPei.inf +[Components.AARCH64, Components.X64] + SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.inf { + + BaseCryptLib|CryptoPkg/Library/BaseCryptLibOnOneCrypto/DxeCryptLib.inf + UnitTestLib|UnitTestFrameworkPkg/Library/UnitTestLib/UnitTestLib.inf + UnitTestPersistenceLib|UnitTestFrameworkPkg/Library/UnitTestPersistenceLibNull/UnitTestPersistenceLibNull.inf + UnitTestResultReportLib|UnitTestFrameworkPkg/Library/UnitTestResultReportLib/UnitTestResultReportLibConOut.inf + } + [Components.AARCH64] SecurityPkg/Tcg/Tcg2StandaloneMmArm/Tcg2StandaloneMmArm.inf SecurityPkg/Tcg/Tcg2AcpiFfa/Tcg2AcpiFfa.inf diff --git a/SecurityPkg/Test/SecurityPkgHostTest.dsc b/SecurityPkg/Test/SecurityPkgHostTest.dsc index 38221575e76..536b4189d41 100644 --- a/SecurityPkg/Test/SecurityPkgHostTest.dsc +++ b/SecurityPkg/Test/SecurityPkgHostTest.dsc @@ -64,6 +64,20 @@ # } # MU_CHANGE - Problems with Consuming OpensslLibFull and UnitTestHostBaseCryptLib from CryptoPkg +SecurityPkg/Library/DxeImageVerificationLib2/GoogleTest/DxeImageVerificationLibGoogleTest.inf { + + UefiRuntimeServicesTableLib|MdePkg/Test/Mock/Library/GoogleTest/MockUefiRuntimeServicesTableLib/MockUefiRuntimeServicesTableLib.inf + UefiBootServicesTableLib|MdePkg/Test/Mock/Library/GoogleTest/MockUefiBootServicesTableLib/MockUefiBootServicesTableLib.inf + DevicePathLib|MdePkg/Test/Mock/Library/GoogleTest/MockDevicePathLib/MockDevicePathLib.inf + DxeImageVerificationLib|SecurityPkg/Library/DxeImageVerificationLib2/DxeImageVerificationLib.inf + BaseCryptLib|CryptoPkg/Test/Mock/Library/GoogleTest/MockBaseCryptLib/MockBaseCryptLib.inf + UefiLib|MdePkg/Test/Mock/Library/GoogleTest/MockUefiLib/MockUefiLib.inf + SecureBootVariableLib|SecurityPkg/Test/Mock/Library/GoogleTest/MockSecureBootVariableLib/MockSecureBootVariableLib.inf + SecurityManagementLib|MdeModulePkg/Test/Mock/Library/GoogleTest/MockSecurityManagementLib/MockSecurityManagementLib.inf + PeCoffLib|MdePkg/Library/BasePeCoffLib/BasePeCoffLib.inf + PeCoffExtraActionLib|MdePkg/Library/BasePeCoffExtraActionLibNull/BasePeCoffExtraActionLibNull.inf + TpmMeasurementLib|MdeModulePkg/Test/Mock/Library/GoogleTest/MockTpmMeasurementLib/MockTpmMeasurementLib.inf + } [PcdsPatchableInModule] gEfiSecurityPkgTokenSpaceGuid.PcdOptionRomImageVerificationPolicy|0x04 diff --git a/SecurityPkg/Test/ShellTest/ImageValidationTestApp/Aarch64/TestData.c b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/Aarch64/TestData.c new file mode 100644 index 00000000000..3d7563332ae --- /dev/null +++ b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/Aarch64/TestData.c @@ -0,0 +1,4801 @@ +/** @file + Test data for the Image Verification unit test application. + + This file is GENERATED by GenTestData.py. Do not edit by hand; rerun the script against + the desired binaries to regenerate it. + + Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "TestData.h" + +// +// unsigned AArch64 PE/COFF image +// +CONST UINT8 mUnsignedImage[] = { + 0x4d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x45, 0x00, 0x00, 0x64, 0xaa, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x22, 0x20, + 0x0b, 0x02, 0x0e, 0x2c, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x4b, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5f, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x68, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, + 0x34, 0x16, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x00, 0x00, 0x00, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc8, + 0x2e, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x42, 0x2e, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x2e, 0x72, 0x73, 0x72, + 0x63, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xd4, 0xc0, 0x03, 0x5f, 0xd6, + 0x1d, 0x00, 0x80, 0xd2, 0xfe, 0x03, 0x00, 0xaa, 0x7f, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x01, 0xaa, 0xe1, 0x03, 0x02, 0xaa, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf3, 0x53, 0xbe, 0xa9, 0xf5, 0x7b, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, + 0x08, 0x00, 0x00, 0xd0, 0x14, 0xb9, 0x05, 0xf9, 0x88, 0x32, 0x40, 0xf9, + 0x13, 0x00, 0x00, 0xd0, 0x64, 0x22, 0x2d, 0x91, 0xf5, 0x03, 0x00, 0xaa, + 0x09, 0x29, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, 0x02, 0xc1, 0x08, 0x91, + 0x03, 0x00, 0x80, 0xd2, 0x01, 0x02, 0x80, 0xd2, 0x20, 0x40, 0x80, 0x52, + 0x20, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0xd0, 0x15, 0xad, 0x05, 0xf9, + 0xbf, 0x02, 0x00, 0xf1, 0x15, 0x00, 0x00, 0xd0, 0xc1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x81, 0x04, 0x91, 0x81, 0x05, 0x80, 0xd2, + 0xa0, 0x02, 0x05, 0x91, 0x59, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0xd0, + 0x14, 0xa9, 0x05, 0xf9, 0x89, 0x32, 0x40, 0xf9, 0x08, 0x00, 0x00, 0xd0, + 0x09, 0xb1, 0x05, 0xf9, 0xc9, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0x61, 0x06, 0x91, 0x01, 0x07, 0x80, 0xd2, 0xa0, 0x02, 0x05, 0x91, + 0x4e, 0x00, 0x00, 0x94, 0x89, 0x2e, 0x40, 0xf9, 0x08, 0x00, 0x00, 0xd0, + 0x09, 0xb5, 0x05, 0xf9, 0xe9, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xc1, 0x06, 0x91, 0x08, 0x00, 0x00, 0xd0, 0x00, 0x41, 0x07, 0x91, + 0x21, 0x05, 0x80, 0xd2, 0x44, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0xd0, + 0x00, 0xc1, 0x01, 0x91, 0x9b, 0x00, 0x00, 0x94, 0x60, 0xa6, 0x45, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0x88, 0x32, 0x40, 0xf9, 0x08, 0x39, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x00, 0x00, 0x80, 0xd2, 0xf5, 0x7b, 0x41, 0xa9, + 0xf3, 0x53, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x0f, 0x1c, 0xf8, 0xe2, 0x0f, 0x01, 0xa9, 0xe4, 0x17, 0x02, 0xa9, + 0xe6, 0x1f, 0x03, 0xa9, 0xff, 0x83, 0x00, 0xd1, 0xe2, 0x03, 0x00, 0x91, + 0x10, 0xe4, 0x00, 0x6f, 0xe8, 0xc3, 0x00, 0x91, 0x11, 0x0d, 0x08, 0x4e, + 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, 0x30, 0x1d, 0x18, 0x4e, + 0x51, 0x1d, 0x18, 0x4e, 0xf1, 0x43, 0x00, 0xad, 0x04, 0x00, 0x00, 0x94, + 0xff, 0x83, 0x00, 0x91, 0xfe, 0x07, 0x44, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0xbe, 0xa9, 0xf5, 0x7b, 0x01, 0xa9, 0xff, 0x83, 0x08, 0xd1, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0x01, 0x6d, 0x39, 0xf5, 0x03, 0x00, 0xaa, + 0xf4, 0x03, 0x01, 0xaa, 0xf3, 0x03, 0x02, 0xaa, 0x08, 0x03, 0x00, 0x35, + 0xf4, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x61, 0x02, 0x91, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0xc1, 0x02, 0x91, 0xa1, 0x0b, 0x80, 0xd2, + 0x15, 0x00, 0x00, 0x94, 0x15, 0x02, 0xf8, 0x36, 0x71, 0x42, 0x40, 0xad, + 0xe3, 0x03, 0x00, 0x91, 0xe2, 0x03, 0x14, 0xaa, 0x01, 0x40, 0x80, 0xd2, + 0xe0, 0x83, 0x00, 0x91, 0xf1, 0x43, 0x00, 0xad, 0xfb, 0x00, 0x00, 0x94, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0xb9, 0x45, 0xf9, 0xc8, 0x00, 0x00, 0xb4, + 0x00, 0x29, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, 0x08, 0x04, 0x40, 0xf9, + 0xe1, 0x83, 0x00, 0x91, 0x00, 0x01, 0x3f, 0xd6, 0xff, 0x83, 0x08, 0x91, + 0xf5, 0x7b, 0x41, 0xa9, 0xf3, 0x53, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfe, 0x0f, 0x1f, 0xf8, 0xff, 0x03, 0x08, 0xd1, 0x08, 0x00, 0x00, 0xd0, + 0x08, 0x01, 0x6d, 0x39, 0x68, 0x02, 0x00, 0x35, 0x08, 0x00, 0x00, 0xd0, + 0x03, 0x01, 0x00, 0x91, 0xe6, 0x03, 0x02, 0xaa, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xc1, 0x03, 0x91, 0xe5, 0x03, 0x01, 0xaa, 0xe4, 0x03, 0x00, 0xaa, + 0x01, 0x40, 0x80, 0xd2, 0xe0, 0x03, 0x00, 0x91, 0xfe, 0x00, 0x00, 0x94, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0xb9, 0x45, 0xf9, 0xc8, 0x00, 0x00, 0xb4, + 0x00, 0x29, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, 0x08, 0x04, 0x40, 0xf9, + 0xe1, 0x03, 0x00, 0x91, 0x00, 0x01, 0x3f, 0xd6, 0xff, 0x03, 0x08, 0x91, + 0xfe, 0x07, 0x41, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0x28, 0x00, 0x80, 0x52, + 0x09, 0x00, 0x00, 0xd0, 0x28, 0x01, 0x2d, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0xbd, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, 0xf7, 0x7b, 0x02, 0xa9, + 0xff, 0x83, 0x00, 0xd1, 0xf7, 0x03, 0x00, 0xaa, 0xf6, 0x03, 0x01, 0xaa, + 0xf5, 0x03, 0x02, 0xaa, 0x13, 0x00, 0x00, 0xd0, 0xb7, 0x00, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x61, 0x02, 0x91, 0xa1, 0x07, 0x80, 0xd2, + 0x05, 0x00, 0x00, 0x14, 0xd7, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xc1, 0x09, 0x91, 0xc1, 0x07, 0x80, 0xd2, 0x60, 0xc2, 0x08, 0x91, + 0xd0, 0xff, 0xff, 0x97, 0xd6, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0x61, 0x0a, 0x91, 0xe1, 0x07, 0x80, 0xd2, 0x60, 0xc2, 0x08, 0x91, + 0xca, 0xff, 0xff, 0x97, 0xbd, 0x04, 0x00, 0x94, 0xf4, 0x03, 0x00, 0xaa, + 0x14, 0x01, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x21, 0x04, 0x91, + 0xc1, 0x08, 0x80, 0xd2, 0x60, 0xc2, 0x08, 0x91, 0xc2, 0xff, 0xff, 0x97, + 0x00, 0x00, 0x80, 0xd2, 0x15, 0x00, 0x00, 0x14, 0xb1, 0x42, 0x40, 0xad, + 0xe3, 0x03, 0x00, 0x91, 0xe2, 0x03, 0x17, 0xaa, 0xe0, 0x03, 0x14, 0xaa, + 0xf1, 0x43, 0x00, 0xad, 0x86, 0x00, 0x00, 0x94, 0xdf, 0x02, 0x00, 0xf1, + 0xf3, 0x03, 0x00, 0xaa, 0x64, 0x1a, 0x40, 0xfa, 0x09, 0x01, 0x00, 0x54, + 0xc8, 0x06, 0x40, 0xf9, 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0xf0, 0xd2, 0x1f, 0x00, 0x08, 0xeb, + 0xf3, 0x23, 0x93, 0x9a, 0xe0, 0x03, 0x14, 0xaa, 0xb3, 0x04, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0xaa, 0xff, 0x83, 0x00, 0x91, 0xf7, 0x7b, 0x42, 0xa9, + 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfe, 0x0f, 0x1c, 0xf8, 0xe1, 0x8b, 0x00, 0xa9, 0xe3, 0x93, 0x01, 0xa9, + 0xe5, 0x9b, 0x02, 0xa9, 0xe7, 0x1f, 0x00, 0xf9, 0xff, 0x83, 0x00, 0xd1, + 0xe2, 0x03, 0x00, 0x91, 0x10, 0xe4, 0x00, 0x6f, 0xe8, 0xa3, 0x00, 0x91, + 0x11, 0x0d, 0x08, 0x4e, 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0xa9, 0x45, 0xf9, 0x30, 0x1d, 0x18, 0x4e, + 0x01, 0x21, 0x40, 0xf9, 0x51, 0x1d, 0x18, 0x4e, 0xf1, 0x43, 0x00, 0xad, + 0xb2, 0xff, 0xff, 0x97, 0xff, 0x83, 0x00, 0x91, 0xfe, 0x07, 0x44, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0xff, 0x43, 0x00, 0xd1, 0xf3, 0x7b, 0x00, 0xa9, + 0xff, 0x43, 0x00, 0xd1, 0xf3, 0x03, 0x00, 0xaa, 0xf3, 0x00, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x21, 0x04, 0x91, 0x08, 0x00, 0x00, 0xd0, + 0x00, 0x61, 0x0b, 0x91, 0x81, 0x04, 0x80, 0xd2, 0x86, 0xff, 0xff, 0x97, + 0x68, 0x02, 0x40, 0x39, 0xe8, 0x07, 0x00, 0x39, 0x68, 0x06, 0x40, 0x39, + 0xe8, 0x03, 0x00, 0x39, 0xe9, 0x03, 0x40, 0x39, 0xe8, 0x07, 0x40, 0x39, + 0x00, 0x21, 0x09, 0x2a, 0xff, 0x43, 0x00, 0x91, 0xf3, 0x7b, 0x40, 0xa9, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0xbe, 0xa9, + 0xfe, 0x0b, 0x00, 0xf9, 0xf4, 0x03, 0x00, 0xaa, 0xf4, 0x00, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x21, 0x04, 0x91, 0x08, 0x00, 0x00, 0xd0, + 0x00, 0x61, 0x0b, 0x91, 0x01, 0x13, 0x80, 0xd2, 0x71, 0xff, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0xaa, 0xdf, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0x0a, 0x00, 0x91, 0xdc, 0xff, 0xff, 0x97, 0xe8, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0x00, 0x3d, 0x10, 0x33, 0xfe, 0x0b, 0x40, 0xf9, + 0xf3, 0x53, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x00, 0xd1, 0xf3, 0x7b, 0x00, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf3, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0xd0, 0x02, 0xc1, 0x0a, 0x91, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0x61, 0x0c, 0x91, 0xc1, 0x0f, 0x80, 0xd2, + 0x5b, 0xff, 0xff, 0x97, 0x00, 0x00, 0x80, 0xd2, 0x73, 0x01, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0x79, 0x28, 0x01, 0x00, 0x34, 0x88, 0x01, 0x00, 0x58, + 0x1f, 0x00, 0x08, 0xeb, 0xa2, 0x00, 0x00, 0x54, 0x69, 0x2e, 0x40, 0x78, + 0x00, 0x04, 0x00, 0x91, 0x89, 0xff, 0xff, 0x35, 0x02, 0x00, 0x00, 0x14, + 0xe0, 0x00, 0x00, 0x58, 0xf3, 0x7b, 0x40, 0xa9, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x20, 0x03, 0xd5, 0x40, 0x42, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x80, 0xd2, 0x68, 0x01, 0x00, 0xb4, + 0x09, 0x01, 0xc0, 0x39, 0x29, 0x01, 0x00, 0x34, 0x29, 0x01, 0x00, 0x58, + 0x1f, 0x00, 0x09, 0xeb, 0xa2, 0x00, 0x00, 0x54, 0x00, 0x04, 0x00, 0x91, + 0x0a, 0x69, 0xe0, 0x38, 0x8a, 0xff, 0xff, 0x35, 0x02, 0x00, 0x00, 0x14, + 0x80, 0x00, 0x00, 0x58, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x42, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf3, 0x53, 0xbd, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, 0xfe, 0x13, 0x00, 0xf9, + 0xff, 0x83, 0x00, 0xd1, 0xf6, 0x03, 0x00, 0xaa, 0xf5, 0x03, 0x02, 0xaa, + 0xf4, 0x03, 0x03, 0xaa, 0x13, 0x00, 0x00, 0xd0, 0xd6, 0x00, 0x00, 0x36, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x01, 0x0e, 0x91, 0xe1, 0x08, 0x80, 0xd2, + 0x60, 0xa2, 0x0e, 0x91, 0x27, 0xff, 0xff, 0x97, 0xd5, 0x00, 0x00, 0x36, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0xa1, 0x0f, 0x91, 0x01, 0x09, 0x80, 0xd2, + 0x60, 0xa2, 0x0e, 0x91, 0x21, 0xff, 0xff, 0x97, 0x05, 0x00, 0x80, 0xd2, + 0x91, 0x42, 0x40, 0xad, 0xe4, 0x03, 0x00, 0x91, 0xe3, 0x03, 0x15, 0xaa, + 0x02, 0x28, 0x80, 0xd2, 0x21, 0x28, 0x80, 0xd2, 0xf1, 0x43, 0x00, 0xad, + 0xe0, 0x03, 0x16, 0xaa, 0x66, 0x00, 0x00, 0x94, 0xff, 0x83, 0x00, 0x91, + 0xfe, 0x13, 0x40, 0xf9, 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0xbd, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, + 0xfe, 0x13, 0x00, 0xf9, 0xff, 0x83, 0x00, 0xd1, 0xf6, 0x03, 0x00, 0xaa, + 0xf5, 0x03, 0x01, 0xaa, 0xf4, 0x03, 0x02, 0xaa, 0xf3, 0x03, 0x03, 0xaa, + 0xf6, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x01, 0x0e, 0x91, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0xa1, 0x0e, 0x91, 0x41, 0x1d, 0x80, 0xd2, + 0x04, 0xff, 0xff, 0x97, 0x05, 0x00, 0x80, 0xd2, 0x71, 0x42, 0x40, 0xad, + 0xe4, 0x03, 0x00, 0x91, 0xe3, 0x03, 0x14, 0xaa, 0x02, 0x08, 0x80, 0xd2, + 0xa1, 0xfe, 0x41, 0xd3, 0xf1, 0x43, 0x00, 0xad, 0xe0, 0x03, 0x16, 0xaa, + 0x49, 0x00, 0x00, 0x94, 0xff, 0x83, 0x00, 0x91, 0xfe, 0x13, 0x40, 0xf9, + 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x1d, 0xf8, 0xe3, 0x93, 0x00, 0xa9, + 0xe5, 0x9b, 0x01, 0xa9, 0xe7, 0x17, 0x00, 0xf9, 0xff, 0x83, 0x00, 0xd1, + 0xe3, 0x03, 0x00, 0x91, 0x10, 0xe4, 0x00, 0x6f, 0xe8, 0xa3, 0x00, 0x91, + 0x11, 0x0d, 0x08, 0x4e, 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, + 0x30, 0x1d, 0x18, 0x4e, 0x51, 0x1d, 0x18, 0x4e, 0xf1, 0x43, 0x00, 0xad, + 0xd4, 0xff, 0xff, 0x97, 0xff, 0x83, 0x00, 0x91, 0xfe, 0x07, 0x43, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0x08, 0x00, 0x80, 0xd2, 0x5f, 0x00, 0x00, 0xf1, + 0x8d, 0x01, 0x00, 0x54, 0x69, 0x3c, 0x08, 0x13, 0x1f, 0x00, 0x01, 0xeb, + 0x22, 0x01, 0x00, 0x54, 0x03, 0x00, 0x00, 0x39, 0x9f, 0x04, 0x00, 0xf1, + 0x40, 0x00, 0x00, 0x54, 0x09, 0x04, 0x00, 0x39, 0x08, 0x05, 0x00, 0x91, + 0x1f, 0x01, 0x02, 0xeb, 0x00, 0x00, 0x04, 0x8b, 0xeb, 0xfe, 0xff, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x53, 0xbc, 0xa9, + 0xf5, 0x5b, 0x01, 0xa9, 0xf7, 0x63, 0x02, 0xa9, 0xf9, 0x7b, 0x03, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x03, 0x02, 0xaa, 0x9f, 0x02, 0x00, 0x39, + 0x08, 0x00, 0x00, 0xd0, 0x17, 0x01, 0x2a, 0x91, 0xb6, 0x7e, 0x40, 0xd3, + 0xf3, 0x03, 0x01, 0xaa, 0x19, 0x00, 0x00, 0xd0, 0x18, 0x00, 0x00, 0xd0, + 0xb5, 0x00, 0x00, 0x35, 0x02, 0xc3, 0x0d, 0x91, 0xc1, 0x04, 0x80, 0xd2, + 0x20, 0x83, 0x2b, 0x91, 0xc1, 0xfe, 0xff, 0x97, 0x56, 0x00, 0x00, 0xb5, + 0x80, 0x00, 0x3e, 0xd4, 0x69, 0x0a, 0xd6, 0x9a, 0x28, 0xcd, 0x16, 0x9b, + 0xf3, 0x03, 0x09, 0xaa, 0xe8, 0x4a, 0xe8, 0x38, 0x88, 0x1e, 0x00, 0x38, + 0x93, 0xfe, 0xff, 0xb5, 0xe0, 0x03, 0x14, 0xaa, 0xf9, 0x7b, 0x43, 0xa9, + 0xf7, 0x63, 0x42, 0xa9, 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0xba, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, + 0xf7, 0x63, 0x02, 0xa9, 0xf9, 0x6b, 0x03, 0xa9, 0xfb, 0x73, 0x04, 0xa9, + 0xfe, 0x2b, 0x00, 0xf9, 0xff, 0x43, 0x03, 0xd1, 0xf3, 0x03, 0x02, 0xaa, + 0xe4, 0x33, 0x00, 0xf9, 0x78, 0x02, 0x73, 0x92, 0xff, 0x27, 0x00, 0xf9, + 0xf7, 0x03, 0x00, 0xaa, 0xf9, 0x03, 0x01, 0xaa, 0xf5, 0x03, 0x03, 0xaa, + 0x59, 0x02, 0x00, 0xb4, 0x58, 0x02, 0x00, 0xb5, 0x37, 0x02, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x41, 0x0d, 0x91, 0xe1, 0x49, 0x80, 0xd2, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0x41, 0x10, 0x91, 0x9c, 0xfe, 0xff, 0x97, + 0x00, 0x00, 0x80, 0xd2, 0xff, 0x43, 0x03, 0x91, 0xfe, 0x2b, 0x40, 0xf9, + 0xfb, 0x73, 0x44, 0xa9, 0xf9, 0x6b, 0x43, 0xa9, 0xf7, 0x63, 0x42, 0xa9, + 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xd8, 0x00, 0x00, 0xb4, 0xb5, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xa1, 0x12, 0x91, 0xe1, 0x4a, 0x80, 0xd2, 0xef, 0xff, 0xff, 0x17, + 0x56, 0x6d, 0x00, 0x58, 0x3f, 0x03, 0x16, 0xeb, 0x13, 0x01, 0x30, 0x36, + 0xa9, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x41, 0x13, 0x91, + 0x01, 0x4c, 0x80, 0xd2, 0xe7, 0xff, 0xff, 0x17, 0x54, 0x00, 0x80, 0xd2, + 0x07, 0x00, 0x00, 0x14, 0xa9, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0x81, 0x11, 0x91, 0xc1, 0x4c, 0x80, 0xd2, 0xe0, 0xff, 0xff, 0x17, + 0x34, 0x00, 0x80, 0xd2, 0xe0, 0x03, 0x15, 0xaa, 0x33, 0x02, 0x40, 0x36, + 0x16, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x16, 0xeb, 0xe9, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x81, 0x14, 0x91, 0x00, 0x00, 0x00, 0xd0, + 0x00, 0x40, 0x10, 0x91, 0x41, 0x4e, 0x80, 0xd2, 0x72, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0xaa, 0x0c, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x16, 0xeb, + 0x68, 0xfa, 0xff, 0x54, 0x5b, 0x00, 0x80, 0xd2, 0xfc, 0xff, 0x9f, 0xd2, + 0x10, 0x00, 0x00, 0x14, 0x24, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x16, 0xeb, + 0xe9, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, 0x02, 0xc1, 0x16, 0x91, + 0x00, 0x00, 0x00, 0xd0, 0x00, 0x40, 0x10, 0x91, 0x21, 0x4f, 0x80, 0xd2, + 0x62, 0xfe, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, 0x1a, 0xff, 0xff, 0x97, + 0x1f, 0x00, 0x16, 0xeb, 0x68, 0xf8, 0xff, 0x54, 0x3b, 0x00, 0x80, 0xd2, + 0xfc, 0x1f, 0x80, 0xd2, 0x98, 0x00, 0x00, 0xb4, 0x3f, 0x03, 0x00, 0xf1, + 0xf7, 0x12, 0x9f, 0x9a, 0x02, 0x00, 0x00, 0x14, 0x99, 0xf7, 0xff, 0xb4, + 0x1a, 0x00, 0x80, 0xd2, 0x16, 0x00, 0x80, 0xd2, 0x18, 0x00, 0x80, 0xd2, + 0x97, 0x00, 0x00, 0xb4, 0x28, 0x07, 0x00, 0xd1, 0x16, 0x5d, 0x14, 0x9b, + 0xf8, 0x03, 0x17, 0xaa, 0x7f, 0x07, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, + 0x09, 0x5d, 0x18, 0x53, 0xa8, 0x02, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, + 0x09, 0x1d, 0x40, 0xb3, 0x28, 0x01, 0x1c, 0xea, 0xe8, 0x37, 0x00, 0xf9, + 0x60, 0x61, 0x00, 0x54, 0xf6, 0x53, 0x05, 0xa9, 0xf6, 0x27, 0x40, 0xf9, + 0xe9, 0x03, 0x08, 0xaa, 0xf8, 0x4b, 0x00, 0xf9, 0xfb, 0xf3, 0x07, 0xa9, + 0xea, 0x2b, 0x40, 0xf9, 0xff, 0x02, 0x00, 0xf1, 0xe0, 0x12, 0x4a, 0xfa, + 0x02, 0x60, 0x00, 0x54, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x27, 0x00, 0xf9, + 0x29, 0x01, 0x88, 0x9a, 0xff, 0x03, 0x01, 0x39, 0x08, 0x28, 0x84, 0xd2, + 0xff, 0x07, 0x01, 0x39, 0x73, 0x02, 0x08, 0x8a, 0x39, 0x00, 0x80, 0xd2, + 0x1b, 0x00, 0x80, 0x52, 0x18, 0x00, 0x80, 0xd2, 0x1c, 0x00, 0x80, 0xd2, + 0x3f, 0x29, 0x00, 0xf1, 0x60, 0x47, 0x00, 0x54, 0x3f, 0x35, 0x00, 0xf1, + 0x80, 0x44, 0x00, 0x54, 0x3f, 0x95, 0x00, 0xf1, 0x80, 0x00, 0x00, 0x54, + 0xf4, 0xa3, 0x01, 0x91, 0x73, 0x02, 0x76, 0xb2, 0x46, 0x02, 0x00, 0x14, + 0xec, 0x33, 0x40, 0xf9, 0xee, 0xd3, 0x47, 0xa9, 0xea, 0x27, 0x40, 0xf9, + 0xe9, 0x03, 0x15, 0xaa, 0xd5, 0x01, 0x15, 0x8b, 0xeb, 0x03, 0x16, 0xaa, + 0xdf, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x08, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, 0x08, 0x5d, 0x18, 0x53, + 0xad, 0x02, 0xc0, 0x39, 0x08, 0x7d, 0x40, 0x93, 0xa8, 0x1d, 0x40, 0xb3, + 0x08, 0x01, 0x14, 0x8a, 0xe8, 0x37, 0x00, 0xf9, 0x1f, 0xc9, 0x00, 0xf1, + 0xc8, 0x09, 0x00, 0x54, 0x80, 0x08, 0x00, 0x54, 0x1f, 0xb1, 0x00, 0xf1, + 0x48, 0x07, 0x00, 0x54, 0xe0, 0x06, 0x00, 0x54, 0x08, 0x0e, 0x00, 0xb4, + 0x1f, 0x81, 0x00, 0xf1, 0x40, 0x06, 0x00, 0x54, 0x1f, 0xa9, 0x00, 0xf1, + 0xa0, 0x00, 0x00, 0x54, 0x1f, 0xad, 0x00, 0xf1, 0x81, 0x0d, 0x00, 0x54, + 0x73, 0x02, 0x7f, 0xb2, 0xe4, 0xff, 0xff, 0x17, 0xd3, 0x02, 0x58, 0x37, + 0x73, 0x02, 0x77, 0xb2, 0x36, 0x02, 0x00, 0xb5, 0x8a, 0x19, 0x40, 0xb9, + 0x49, 0x21, 0x00, 0x11, 0x89, 0x19, 0x00, 0xb9, 0x3f, 0x01, 0x00, 0x71, + 0xac, 0x00, 0x00, 0x54, 0x8a, 0x05, 0x40, 0xf9, 0x4a, 0xc1, 0x29, 0x8b, + 0x4b, 0x21, 0x00, 0xd1, 0x09, 0x00, 0x00, 0x14, 0x89, 0x01, 0x40, 0xf9, + 0xea, 0x03, 0x09, 0xcb, 0x4a, 0x09, 0x40, 0x92, 0x4b, 0x01, 0x09, 0x8b, + 0x6a, 0x21, 0x00, 0x91, 0x8a, 0x01, 0x00, 0xf9, 0x02, 0x00, 0x00, 0x14, + 0xd6, 0x22, 0x00, 0x91, 0x6a, 0x01, 0x40, 0xf9, 0xce, 0xff, 0xff, 0x17, + 0x56, 0x02, 0x00, 0xb5, 0x89, 0x19, 0x40, 0xb9, 0x28, 0x21, 0x00, 0x11, + 0x88, 0x19, 0x00, 0xb9, 0x1f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, + 0x89, 0x05, 0x40, 0xf9, 0x29, 0xc1, 0x28, 0x8b, 0x29, 0x21, 0x00, 0xd1, + 0x07, 0x00, 0x00, 0x14, 0x88, 0x01, 0x40, 0xf9, 0xe9, 0x03, 0x08, 0xcb, + 0x29, 0x09, 0x40, 0x92, 0x29, 0x01, 0x08, 0x8b, 0x28, 0x21, 0x00, 0x91, + 0x88, 0x01, 0x00, 0xf9, 0x39, 0x01, 0x40, 0xf9, 0xbc, 0xff, 0xff, 0x17, + 0x79, 0x01, 0x40, 0xf9, 0xd6, 0x22, 0x00, 0x91, 0xb9, 0xff, 0xff, 0x17, + 0x73, 0x02, 0x7e, 0xb2, 0xb7, 0xff, 0xff, 0x17, 0x73, 0x02, 0x7d, 0xb2, + 0xb5, 0xff, 0xff, 0x17, 0x1f, 0xb5, 0x00, 0xf1, 0xc0, 0x01, 0x00, 0x54, + 0x1f, 0xb9, 0x00, 0xf1, 0x40, 0x01, 0x00, 0x54, 0x1f, 0xc1, 0x00, 0xf1, + 0xa0, 0x00, 0x00, 0x54, 0x1f, 0xc5, 0x00, 0xf1, 0x61, 0x06, 0x00, 0x54, + 0x18, 0x00, 0x80, 0xd2, 0x26, 0x00, 0x00, 0x14, 0xd3, 0xff, 0x5f, 0x37, + 0x73, 0x02, 0x7b, 0xb2, 0xfc, 0xff, 0xff, 0x17, 0x73, 0x02, 0x75, 0xb2, + 0xa6, 0xff, 0xff, 0x17, 0x73, 0x02, 0x40, 0xb2, 0xa4, 0xff, 0xff, 0x17, + 0x1f, 0xdd, 0x00, 0xf1, 0xa8, 0x00, 0x00, 0x54, 0x09, 0xcd, 0x00, 0xd1, + 0x3f, 0x11, 0x00, 0xf1, 0xa8, 0x04, 0x00, 0x54, 0xf2, 0xff, 0xff, 0x17, + 0x09, 0xe1, 0x00, 0xd1, 0x3f, 0x05, 0x00, 0xf1, 0xe9, 0xfd, 0xff, 0x54, + 0x09, 0x31, 0x01, 0xd1, 0x3f, 0xf9, 0x7a, 0xf2, 0xc1, 0x03, 0x00, 0x54, + 0x73, 0x02, 0x7c, 0xb2, 0x96, 0xff, 0xff, 0x17, 0x1f, 0xe5, 0x00, 0xf1, + 0x28, 0x02, 0x00, 0x54, 0x09, 0x0b, 0x18, 0x8b, 0xd5, 0x01, 0x15, 0x8b, + 0xdf, 0x05, 0x00, 0xf1, 0x08, 0x05, 0x09, 0x8b, 0x18, 0xc1, 0x00, 0xd1, + 0x61, 0x00, 0x00, 0x54, 0x08, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, + 0xa8, 0x06, 0xc0, 0x39, 0x08, 0x5d, 0x18, 0x53, 0xa9, 0x02, 0xc0, 0x39, + 0x08, 0x7d, 0x40, 0x93, 0x28, 0x1d, 0x40, 0xb3, 0x08, 0x01, 0x14, 0x8a, + 0x1f, 0xc1, 0x00, 0xf1, 0xe2, 0xfd, 0xff, 0x54, 0xb5, 0x02, 0x0e, 0xcb, + 0x93, 0x00, 0x58, 0x37, 0x73, 0x02, 0x77, 0xb2, 0xea, 0x03, 0x18, 0xaa, + 0x7f, 0xff, 0xff, 0x17, 0xf9, 0x03, 0x18, 0xaa, 0x7d, 0xff, 0xff, 0x17, + 0xf5, 0x03, 0x09, 0xaa, 0x19, 0x00, 0x80, 0xd2, 0xea, 0x27, 0x00, 0xf9, + 0xe9, 0x03, 0x15, 0xaa, 0xea, 0x03, 0x16, 0xaa, 0x1f, 0x91, 0x01, 0xf1, + 0x48, 0x0a, 0x00, 0x54, 0x20, 0x1c, 0x00, 0x54, 0x1f, 0x29, 0x00, 0xf1, + 0x60, 0x07, 0x00, 0x54, 0x1f, 0x35, 0x00, 0xf1, 0x60, 0x04, 0x00, 0x54, + 0x1f, 0x95, 0x00, 0xf1, 0x20, 0xed, 0xff, 0x54, 0x1f, 0x4d, 0x01, 0xf1, + 0xc0, 0x0f, 0x00, 0x54, 0x1f, 0x61, 0x01, 0xf1, 0x40, 0x1a, 0x00, 0x54, + 0x1f, 0x85, 0x01, 0xf1, 0x60, 0x0f, 0x00, 0x54, 0x1f, 0x8d, 0x01, 0xf1, + 0x21, 0xec, 0xff, 0x54, 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, + 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, + 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, + 0x08, 0x01, 0x40, 0x79, 0xf4, 0x03, 0x03, 0x91, 0xe8, 0x63, 0x00, 0xf9, + 0x4a, 0xff, 0xff, 0x17, 0xe8, 0x3f, 0x40, 0xf9, 0x0b, 0x01, 0x15, 0x8b, + 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0x68, 0x05, 0xc0, 0x39, 0x0a, 0x5d, 0x18, 0x53, + 0x68, 0x01, 0xc0, 0x39, 0x4a, 0x7d, 0x40, 0x93, 0x0a, 0x1d, 0x40, 0xb3, + 0xe8, 0x43, 0x40, 0xf9, 0x48, 0x01, 0x08, 0x8a, 0x1f, 0x29, 0x00, 0xf1, + 0xe8, 0x37, 0x00, 0xf9, 0x35, 0x11, 0x8b, 0x9a, 0x09, 0x00, 0x00, 0xd0, + 0x29, 0x21, 0x1b, 0x91, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x11, 0x1b, 0x91, + 0x34, 0x11, 0x88, 0x9a, 0x7b, 0x01, 0x00, 0x14, 0xe8, 0x3f, 0x40, 0xf9, + 0x14, 0x00, 0x00, 0xd0, 0x94, 0x12, 0x1b, 0x91, 0x15, 0x01, 0x15, 0x8b, + 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, 0x0a, 0x5d, 0x18, 0x53, + 0xa8, 0x02, 0xc0, 0x39, 0x4a, 0x7d, 0x40, 0x93, 0x0a, 0x1d, 0x40, 0xb3, + 0xe8, 0x43, 0x40, 0xf9, 0x48, 0x01, 0x08, 0x8a, 0xe8, 0x37, 0x00, 0xf9, + 0x1f, 0x35, 0x00, 0xf1, 0x20, 0x2d, 0x00, 0x54, 0xf5, 0x03, 0x09, 0xaa, + 0x67, 0x01, 0x00, 0x14, 0x1f, 0x9d, 0x01, 0xf1, 0x60, 0x20, 0x00, 0x54, + 0x1f, 0xc1, 0x01, 0xf1, 0xa0, 0x10, 0x00, 0x54, 0x1f, 0xc9, 0x01, 0xf1, + 0xa0, 0x09, 0x00, 0x54, 0x1f, 0xcd, 0x01, 0xf1, 0xc0, 0x05, 0x00, 0x54, + 0x1f, 0xd1, 0x01, 0xf1, 0xc0, 0x00, 0x00, 0x54, 0x1f, 0xd5, 0x01, 0xf1, + 0x40, 0x10, 0x00, 0x54, 0x1f, 0xe1, 0x01, 0xf1, 0xe0, 0x0f, 0x00, 0x54, + 0x10, 0xff, 0xff, 0x17, 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, + 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, + 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, + 0x09, 0x01, 0x40, 0xf9, 0x89, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x14, 0x41, 0x1a, 0x91, 0x3f, 0x01, 0x00, 0x14, 0x28, 0x15, 0x40, 0x39, + 0x02, 0x00, 0x80, 0xd2, 0x27, 0x11, 0x40, 0x39, 0xc1, 0x04, 0x80, 0xd2, + 0x26, 0x01, 0x40, 0x79, 0xe0, 0x63, 0x02, 0x91, 0x25, 0x0d, 0x40, 0x39, + 0xe8, 0x03, 0x00, 0xb9, 0x24, 0x09, 0x40, 0x39, 0x08, 0x00, 0x00, 0xd0, + 0x03, 0x81, 0x1a, 0x91, 0xf6, 0x01, 0x00, 0x94, 0x09, 0x01, 0x00, 0x14, + 0x73, 0x02, 0x76, 0xb2, 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, + 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, + 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, + 0x14, 0x01, 0x40, 0xf9, 0x94, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x14, 0xe1, 0x18, 0x91, 0x73, 0xfa, 0x75, 0x92, 0xf3, 0x22, 0x58, 0x37, + 0x19, 0x00, 0x80, 0xd2, 0x15, 0x01, 0x00, 0x14, 0x56, 0x02, 0x00, 0xb5, + 0xea, 0x33, 0x40, 0xf9, 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, + 0x49, 0x19, 0x00, 0xb9, 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, + 0x48, 0x05, 0x40, 0xf9, 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, + 0x0a, 0x00, 0x00, 0x14, 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, + 0x08, 0x09, 0x40, 0x92, 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, + 0x49, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, + 0xe8, 0x03, 0x0a, 0xaa, 0x04, 0x01, 0x40, 0xf9, 0x08, 0x00, 0xf0, 0xd2, + 0xf4, 0x63, 0x02, 0x91, 0x9f, 0x00, 0x08, 0xeb, 0xa3, 0x01, 0x00, 0x54, + 0x89, 0xf8, 0x40, 0x92, 0x28, 0x05, 0x00, 0xd1, 0x1f, 0x89, 0x00, 0xf1, + 0x68, 0x02, 0x00, 0x54, 0x28, 0xf1, 0x7d, 0xd3, 0x08, 0x01, 0x09, 0xcb, + 0x09, 0x05, 0x08, 0x8b, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x81, 0x1e, 0x91, + 0x28, 0x01, 0x08, 0x8b, 0x14, 0x55, 0x00, 0xd1, 0x08, 0x00, 0x00, 0x14, + 0x9f, 0x1c, 0x00, 0xf1, 0x28, 0x01, 0x00, 0x54, 0x88, 0x08, 0x04, 0x8b, + 0x09, 0x09, 0x08, 0x8b, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x41, 0x1b, 0x91, + 0x34, 0x01, 0x08, 0x8b, 0xe8, 0x63, 0x02, 0x91, 0x9f, 0x02, 0x08, 0xeb, + 0xc1, 0x1c, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, 0x03, 0xf1, 0x1a, 0x91, + 0x02, 0x00, 0x80, 0xd2, 0xc1, 0x04, 0x80, 0xd2, 0xe0, 0x63, 0x02, 0x91, + 0xa3, 0x01, 0x00, 0x94, 0xdf, 0x00, 0x00, 0x14, 0xc8, 0x04, 0x80, 0x92, + 0x68, 0x02, 0x08, 0x8a, 0x13, 0x01, 0x7c, 0xb2, 0x73, 0x02, 0x7b, 0xb2, + 0x73, 0x02, 0x79, 0xb2, 0x73, 0x00, 0x38, 0x37, 0x68, 0xfa, 0x7e, 0x92, + 0x13, 0x01, 0x72, 0xb2, 0x69, 0x02, 0x7c, 0xf2, 0xe1, 0x02, 0x00, 0x54, + 0x56, 0x02, 0x00, 0xb5, 0xeb, 0x33, 0x40, 0xf9, 0x68, 0x19, 0x40, 0xb9, + 0x0a, 0x21, 0x00, 0x11, 0x6a, 0x19, 0x00, 0xb9, 0x5f, 0x01, 0x00, 0x71, + 0xac, 0x00, 0x00, 0x54, 0x68, 0x05, 0x40, 0xf9, 0x08, 0xc1, 0x2a, 0x8b, + 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, 0x6a, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x0a, 0xcb, 0x08, 0x05, 0x40, 0x92, 0x08, 0x01, 0x0a, 0x8b, + 0x0a, 0x21, 0x00, 0x91, 0x6a, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x14, + 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, 0x14, 0x01, 0x80, 0xb9, + 0x16, 0x00, 0x00, 0x14, 0x76, 0x02, 0x00, 0xb5, 0xeb, 0x33, 0x40, 0xf9, + 0x68, 0x19, 0x40, 0xb9, 0x0a, 0x21, 0x00, 0x11, 0x6a, 0x19, 0x00, 0xb9, + 0x5f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x68, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x2a, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x07, 0x00, 0x00, 0x14, + 0x6a, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x0a, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x0a, 0x8b, 0x0a, 0x21, 0x00, 0x91, 0x6a, 0x01, 0x00, 0xf9, + 0x14, 0x01, 0x40, 0xf9, 0x03, 0x00, 0x00, 0x14, 0x54, 0x01, 0x40, 0xf9, + 0xd6, 0x22, 0x00, 0x91, 0x68, 0xf2, 0x7d, 0xd3, 0x0a, 0x01, 0x1b, 0x12, + 0x68, 0x05, 0x80, 0x52, 0x7f, 0x02, 0x7f, 0xf2, 0x1b, 0x11, 0x8a, 0x1a, + 0x6a, 0x02, 0x7d, 0xf2, 0xe8, 0x07, 0x9f, 0x1a, 0x33, 0x02, 0x38, 0x37, + 0x42, 0x01, 0x80, 0xd2, 0x6a, 0x00, 0x00, 0xb4, 0x73, 0xfa, 0x7a, 0x92, + 0x39, 0x00, 0x80, 0xd2, 0x69, 0x02, 0x72, 0x92, 0xd4, 0x00, 0xf8, 0xb6, + 0xa9, 0x00, 0x00, 0xb5, 0x73, 0x02, 0x7f, 0xb2, 0xbb, 0x05, 0x80, 0x52, + 0xf4, 0x03, 0x14, 0xcb, 0x04, 0x00, 0x00, 0x14, 0x69, 0x00, 0x00, 0xb4, + 0x53, 0x00, 0x20, 0x37, 0x94, 0x7e, 0x40, 0xd3, 0xe8, 0x03, 0x01, 0x39, + 0x06, 0x00, 0x00, 0x14, 0x02, 0x02, 0x80, 0xd2, 0xff, 0x03, 0x01, 0x39, + 0x69, 0x00, 0x00, 0xb5, 0x54, 0x00, 0xf8, 0xb6, 0x94, 0x7e, 0x40, 0xd3, + 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x63, 0x02, 0x91, 0x99, 0xfd, 0xff, 0x97, + 0xe8, 0x63, 0x02, 0x91, 0x08, 0x00, 0x08, 0xcb, 0xd4, 0x00, 0x00, 0xb5, + 0xb9, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x80, 0xd2, 0xf4, 0x63, 0x02, 0x91, + 0x1c, 0x00, 0x80, 0xd2, 0x0a, 0x00, 0x00, 0x14, 0x49, 0x28, 0x00, 0x58, + 0x09, 0x7d, 0xc9, 0x9b, 0xf4, 0x03, 0x00, 0xaa, 0x29, 0xfd, 0x41, 0xd3, + 0x29, 0x05, 0x09, 0x8b, 0x1c, 0x01, 0x09, 0xcb, 0x7c, 0x00, 0x00, 0xb4, + 0x29, 0x01, 0x08, 0xcb, 0x3c, 0x0d, 0x00, 0x91, 0xe9, 0x03, 0x41, 0x39, + 0xc9, 0x00, 0x00, 0x34, 0xa8, 0x00, 0x00, 0xb4, 0x0a, 0x05, 0x00, 0xd1, + 0xa9, 0x26, 0x00, 0x58, 0x49, 0x7d, 0xc9, 0x9b, 0x08, 0x05, 0x49, 0x8b, + 0x69, 0x1f, 0x00, 0x53, 0x49, 0x00, 0x00, 0x34, 0x39, 0x07, 0x00, 0x91, + 0x7f, 0x1f, 0x00, 0x72, 0x18, 0x05, 0x88, 0x9a, 0x28, 0x00, 0x80, 0x52, + 0xe8, 0x07, 0x01, 0x39, 0x73, 0x02, 0x74, 0xb2, 0x33, 0x0d, 0x28, 0x36, + 0x13, 0x0d, 0x00, 0x37, 0xf3, 0x0c, 0x48, 0x36, 0xe8, 0x27, 0x40, 0xf9, + 0x7f, 0x02, 0x75, 0xf2, 0x19, 0x01, 0x99, 0x9a, 0x63, 0x00, 0x00, 0x14, + 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, 0x48, 0x19, 0x40, 0xb9, + 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, 0x3f, 0x01, 0x00, 0x71, + 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, 0x08, 0xc1, 0x29, 0x8b, + 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, 0x49, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, 0x08, 0x01, 0x09, 0x8b, + 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x14, + 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, 0x14, 0x01, 0x40, 0xf9, + 0x94, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb0, 0x14, 0x21, 0x19, 0x91, + 0x4a, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x14, 0xaa, 0xaf, 0xfc, 0xff, 0x97, + 0xe0, 0x8b, 0x00, 0xb9, 0x80, 0x12, 0x00, 0x91, 0x96, 0xfc, 0xff, 0x97, + 0xe0, 0xe3, 0x00, 0x79, 0x80, 0x1a, 0x00, 0x91, 0x93, 0xfc, 0xff, 0x97, + 0x88, 0x36, 0x40, 0x39, 0x02, 0x00, 0x80, 0xd2, 0x8a, 0x3e, 0x40, 0x39, + 0x06, 0x3c, 0x00, 0x53, 0x89, 0x3a, 0x40, 0x39, 0xc1, 0x04, 0x80, 0xd2, + 0x8e, 0x32, 0x40, 0x39, 0xe0, 0x63, 0x02, 0x91, 0x8d, 0x2e, 0x40, 0x39, + 0xe8, 0x23, 0x00, 0xb9, 0x08, 0x00, 0x00, 0xb0, 0x8c, 0x2a, 0x40, 0x39, + 0x03, 0x61, 0x19, 0x91, 0xea, 0x33, 0x00, 0xb9, 0x8b, 0x26, 0x40, 0x39, + 0xe9, 0x2b, 0x00, 0xb9, 0x87, 0x22, 0x40, 0x39, 0xee, 0x1b, 0x00, 0xb9, + 0xe5, 0xe3, 0x40, 0x79, 0xed, 0x13, 0x00, 0xb9, 0xe4, 0x8b, 0x40, 0xb9, + 0xec, 0x0b, 0x00, 0xb9, 0xeb, 0x03, 0x00, 0xb9, 0xed, 0x00, 0x00, 0x94, + 0xf4, 0x63, 0x02, 0x91, 0x28, 0x00, 0x00, 0x14, 0xe8, 0x3f, 0x40, 0xf9, + 0x0a, 0x01, 0x15, 0x8b, 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0x48, 0x05, 0xc0, 0x39, + 0x09, 0x5d, 0x18, 0x53, 0x48, 0x01, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, + 0x09, 0x1d, 0x40, 0xb3, 0xe8, 0x43, 0x40, 0xf9, 0x28, 0x01, 0x08, 0x8a, + 0x1f, 0x29, 0x00, 0xf1, 0xe8, 0x37, 0x00, 0xf9, 0x08, 0x00, 0x00, 0xb0, + 0x08, 0x11, 0x1b, 0x91, 0x09, 0x00, 0x00, 0xb0, 0x29, 0x21, 0x1b, 0x91, + 0x34, 0x11, 0x88, 0x9a, 0x12, 0x00, 0x00, 0x14, 0xe8, 0x3f, 0x40, 0xf9, + 0x14, 0x00, 0x00, 0xb0, 0x94, 0x12, 0x1b, 0x91, 0x0a, 0x01, 0x15, 0x8b, + 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x09, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0x48, 0x05, 0xc0, 0x39, 0x09, 0x5d, 0x18, 0x53, + 0x48, 0x01, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, 0x09, 0x1d, 0x40, 0xb3, + 0xe8, 0x43, 0x40, 0xf9, 0x28, 0x01, 0x08, 0x8a, 0xe8, 0x37, 0x00, 0xf9, + 0x1f, 0x35, 0x00, 0xf1, 0xb5, 0x12, 0x8a, 0x9a, 0x69, 0x02, 0x76, 0xf2, + 0x28, 0x00, 0x80, 0xd2, 0x05, 0x05, 0x88, 0x9a, 0xe8, 0xff, 0x9f, 0xd2, + 0xea, 0x1f, 0x80, 0xd2, 0x46, 0x01, 0x88, 0x9a, 0x53, 0x05, 0x60, 0x36, + 0xe5, 0x03, 0x05, 0xcb, 0x3f, 0x03, 0x18, 0xeb, 0x28, 0x40, 0x80, 0xd2, + 0x09, 0x33, 0x99, 0x9a, 0x68, 0x02, 0x08, 0x8a, 0xe9, 0x47, 0x00, 0xf9, + 0x1f, 0x01, 0x08, 0xf1, 0x81, 0x01, 0x00, 0x54, 0xe8, 0x27, 0x40, 0xf9, + 0xe4, 0x2f, 0x40, 0xf9, 0x02, 0x01, 0x09, 0xcb, 0x9a, 0x68, 0x02, 0x9b, + 0xf3, 0x00, 0x68, 0x37, 0xd7, 0x00, 0x00, 0xb4, 0xe1, 0x2b, 0x40, 0xf9, + 0x03, 0x04, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0xaa, 0xe7, 0xfc, 0xff, 0x97, + 0xf7, 0x03, 0x00, 0xaa, 0xe8, 0x07, 0x41, 0x39, 0xe8, 0x04, 0x00, 0x34, + 0x68, 0x1f, 0x00, 0x53, 0x68, 0x01, 0x00, 0x34, 0xe4, 0x2f, 0x40, 0xf9, + 0x9a, 0x00, 0x1a, 0x8b, 0x13, 0x01, 0x68, 0x37, 0xf7, 0x00, 0x00, 0xb4, + 0xe1, 0x2b, 0x40, 0xf9, 0x63, 0x1f, 0x00, 0x53, 0x22, 0x00, 0x80, 0xd2, + 0xe0, 0x03, 0x17, 0xaa, 0xd9, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, + 0xe8, 0x47, 0x40, 0xf9, 0xe4, 0x2f, 0x40, 0xf9, 0x02, 0x01, 0x18, 0xcb, + 0x9a, 0x68, 0x02, 0x9b, 0xd3, 0x05, 0x68, 0x37, 0xb7, 0x05, 0x00, 0xb4, + 0x03, 0x06, 0x80, 0xd2, 0x27, 0x00, 0x00, 0x14, 0x18, 0x00, 0x80, 0xd2, + 0x88, 0x06, 0x00, 0x91, 0x0b, 0xf1, 0xdf, 0x38, 0x8b, 0x00, 0x00, 0x35, + 0x89, 0xfa, 0xff, 0xb4, 0x0a, 0x01, 0xc0, 0x39, 0x4a, 0xfa, 0xff, 0x34, + 0x1f, 0x03, 0x19, 0xeb, 0x43, 0x00, 0x00, 0x54, 0xf3, 0xf9, 0x5f, 0x37, + 0x0a, 0x01, 0xc0, 0x39, 0x4a, 0x5d, 0x78, 0x93, 0x6a, 0x1d, 0x40, 0xb3, + 0x5f, 0x01, 0x06, 0xea, 0x40, 0xf9, 0xff, 0x54, 0x18, 0x07, 0x00, 0x91, + 0x08, 0x01, 0x05, 0x8b, 0xf1, 0xff, 0xff, 0x17, 0xe8, 0x47, 0x40, 0xf9, + 0x6a, 0x02, 0x73, 0xf2, 0xe4, 0x2f, 0x40, 0xf9, 0x02, 0x01, 0x18, 0xcb, + 0x9a, 0x68, 0x02, 0x9b, 0xe1, 0x00, 0x00, 0x54, 0xd7, 0x00, 0x00, 0xb4, + 0xe1, 0x2b, 0x40, 0xf9, 0x03, 0x04, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0xaa, + 0xb3, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, 0x68, 0x1f, 0x00, 0x53, + 0x68, 0x01, 0x00, 0x34, 0xe4, 0x2f, 0x40, 0xf9, 0x9a, 0x00, 0x1a, 0x8b, + 0x0a, 0x01, 0x00, 0xb5, 0xf7, 0x00, 0x00, 0xb4, 0x63, 0x1f, 0x00, 0x53, + 0x22, 0x00, 0x80, 0xd2, 0xe1, 0x2b, 0x40, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0xa7, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, 0x7f, 0x1f, 0x00, 0x72, + 0xe7, 0x07, 0x9f, 0x9a, 0xff, 0x00, 0x18, 0xeb, 0x22, 0x05, 0x00, 0x54, + 0xe1, 0x13, 0x45, 0xa9, 0x6a, 0x02, 0x73, 0x92, 0xfb, 0x03, 0x41, 0x39, + 0xe0, 0x03, 0x17, 0xaa, 0x89, 0x02, 0xc0, 0x39, 0xa9, 0x00, 0x00, 0x35, + 0xbf, 0x04, 0x00, 0xf1, 0x0d, 0x04, 0x00, 0x54, 0x88, 0x06, 0xc0, 0x39, + 0xc8, 0x03, 0x00, 0x34, 0x88, 0x06, 0x00, 0x91, 0x08, 0x01, 0xc0, 0x39, + 0x29, 0x1d, 0x40, 0xd3, 0x9a, 0x00, 0x1a, 0x8b, 0x09, 0x1d, 0x78, 0xb3, + 0x23, 0x01, 0x06, 0x8a, 0x8a, 0x00, 0x00, 0xb5, 0x60, 0x00, 0x00, 0xb4, + 0x22, 0x00, 0x80, 0xd2, 0x8e, 0xfc, 0xff, 0x97, 0xb4, 0x00, 0x14, 0x8b, + 0xe7, 0x04, 0x00, 0x91, 0xfb, 0x01, 0x00, 0x34, 0x9c, 0x07, 0x00, 0x91, + 0x9f, 0x0f, 0x00, 0xf1, 0x81, 0x01, 0x00, 0x54, 0xe7, 0x04, 0x00, 0x91, + 0xff, 0x00, 0x18, 0xeb, 0x1c, 0x00, 0x80, 0xd2, 0x42, 0x01, 0x00, 0x54, + 0x9a, 0x00, 0x1a, 0x8b, 0xaa, 0xfc, 0xff, 0xb5, 0x80, 0xfc, 0xff, 0xb4, + 0x83, 0x05, 0x80, 0xd2, 0x22, 0x00, 0x80, 0xd2, 0x7e, 0xfc, 0xff, 0x97, + 0xe0, 0xff, 0xff, 0x17, 0xff, 0x00, 0x18, 0xeb, 0xc3, 0xfb, 0xff, 0x54, + 0xf7, 0x03, 0x00, 0xaa, 0x28, 0x40, 0x80, 0xd2, 0x68, 0x02, 0x08, 0x8a, + 0x1f, 0x05, 0x08, 0xf1, 0xa1, 0x01, 0x00, 0x54, 0xe9, 0x27, 0x40, 0xf9, + 0xe8, 0x47, 0x40, 0xf9, 0xe4, 0x2f, 0x40, 0xf9, 0x22, 0x01, 0x08, 0xcb, + 0x9a, 0x68, 0x02, 0x9b, 0xf3, 0x00, 0x68, 0x37, 0xd7, 0x00, 0x00, 0xb4, + 0xe1, 0x2b, 0x40, 0xf9, 0x03, 0x04, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0xaa, + 0x6b, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, 0xe8, 0x3f, 0x40, 0xf9, + 0x15, 0x01, 0x15, 0x8b, 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, + 0x09, 0x5d, 0x18, 0x53, 0xa8, 0x02, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, + 0x09, 0x1d, 0x40, 0xb3, 0xe8, 0x43, 0x40, 0xf9, 0x28, 0x01, 0x08, 0xea, + 0xe8, 0x37, 0x00, 0xf9, 0xe9, 0x03, 0x08, 0xaa, 0xc1, 0x9f, 0xff, 0x54, + 0xf8, 0x4b, 0x40, 0xf9, 0xf6, 0x53, 0x45, 0xa9, 0xb3, 0x00, 0x68, 0x36, + 0x54, 0x00, 0x00, 0xb5, 0x80, 0x00, 0x3e, 0xd4, 0x40, 0x0b, 0xd4, 0x9a, + 0x9b, 0xfc, 0xff, 0x17, 0xf7, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb0, + 0x02, 0x21, 0x04, 0x91, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x40, 0x10, 0x91, + 0x01, 0xa0, 0x80, 0xd2, 0x2e, 0xfb, 0xff, 0x97, 0xe4, 0x03, 0x14, 0xaa, + 0x03, 0x00, 0x80, 0xd2, 0x22, 0x00, 0x80, 0xd2, 0x81, 0x02, 0x16, 0x8b, + 0xe0, 0x03, 0x17, 0xaa, 0x46, 0xfc, 0xff, 0x97, 0xe8, 0x02, 0x18, 0xcb, + 0x54, 0x00, 0x00, 0xb5, 0x80, 0x00, 0x3e, 0xd4, 0x00, 0x0d, 0xd4, 0x9a, + 0x89, 0xfc, 0xff, 0x17, 0x40, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xfe, 0x0f, 0x1d, 0xf8, + 0xe4, 0x17, 0x01, 0xa9, 0xe6, 0x1f, 0x02, 0xa9, 0xff, 0x83, 0x00, 0xd1, + 0x05, 0x00, 0x80, 0xd2, 0x10, 0xe4, 0x00, 0x6f, 0xe4, 0x03, 0x00, 0x91, + 0xe8, 0xc3, 0x00, 0x91, 0x11, 0x0d, 0x08, 0x4e, 0x0a, 0x00, 0x80, 0xd2, + 0x09, 0x00, 0x80, 0xd2, 0x30, 0x1d, 0x18, 0x4e, 0x51, 0x1d, 0x18, 0x4e, + 0xf1, 0x43, 0x00, 0xad, 0x5e, 0xfc, 0xff, 0x97, 0xff, 0x83, 0x00, 0x91, + 0xfe, 0x07, 0x43, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0xfe, 0x0f, 0x1f, 0xf8, + 0xff, 0x43, 0x00, 0xd1, 0x08, 0x00, 0x00, 0xb0, 0x08, 0xb1, 0x45, 0xf9, + 0xe2, 0x03, 0x00, 0x91, 0x41, 0x50, 0x80, 0xd2, 0x80, 0x00, 0x80, 0x52, + 0x08, 0x21, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0xf0, 0xd2, + 0x1f, 0x00, 0x08, 0xeb, 0x00, 0x00, 0x80, 0xd2, 0x42, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x40, 0xf9, 0xff, 0x43, 0x00, 0x91, 0xfe, 0x07, 0x41, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x1f, 0xf8, + 0x08, 0x00, 0x00, 0xb0, 0x08, 0xb1, 0x45, 0xf9, 0x08, 0x25, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0xf0, 0xd2, 0x1f, 0x00, 0x08, 0xeb, + 0x83, 0x01, 0x00, 0x54, 0x08, 0x00, 0x00, 0xb0, 0x01, 0x41, 0x00, 0x91, + 0xe2, 0x03, 0x00, 0xaa, 0x00, 0x00, 0xb0, 0xd2, 0xb8, 0xfa, 0xff, 0x97, + 0x08, 0x00, 0x00, 0xb0, 0x02, 0xe1, 0x00, 0x91, 0x08, 0x00, 0x00, 0xb0, + 0x00, 0x41, 0x2a, 0x91, 0xa1, 0x66, 0x80, 0xd2, 0xe8, 0xfa, 0xff, 0x97, + 0xfe, 0x07, 0x41, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x5f, + 0x45, 0x46, 0x49, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x28, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x72, 0x29, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0x28, 0x28, + 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x29, 0x28, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x29, 0x20, + 0x3e, 0x3d, 0x20, 0x30, 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x55, 0x4c, 0x4c, + 0x29, 0x00, 0x00, 0x00, 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, + 0x20, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, + 0x20, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, + 0x21, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x4c, 0x69, 0x62, 0x53, 0x74, 0x64, 0x45, 0x72, 0x72, + 0x5c, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, + 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x20, 0x5b, 0x25, 0x61, 0x5d, 0x20, + 0x25, 0x61, 0x28, 0x25, 0x64, 0x29, 0x3a, 0x20, 0x25, 0x61, 0x0a, 0x00, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, + 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, + 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, 0x6f, + 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, + 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x67, 0x42, 0x53, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x67, 0x52, 0x54, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, + 0x66, 0x69, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, + 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4c, 0x69, + 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4c, 0x69, 0x62, 0x50, 0x72, 0x69, + 0x6e, 0x74, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x00, 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, 0x29, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x62, 0x5c, 0x41, 0x41, 0x72, 0x63, 0x68, 0x36, 0x34, 0x5c, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x53, 0x61, 0x66, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x69, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, + 0x21, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, + 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x5c, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, + 0x29, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x50, 0x72, + 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x5c, 0x50, 0x72, 0x69, 0x6e, 0x74, + 0x4c, 0x69, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, + 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x28, + 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, + 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x53, 0x74, 0x72, 0x6e, 0x4c, 0x65, 0x6e, + 0x53, 0x20, 0x28, 0x28, 0x43, 0x48, 0x41, 0x52, 0x31, 0x36, 0x20, 0x2a, + 0x29, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x28, 0x5f, 0x67, + 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, + 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, + 0x72, 0x6e, 0x4c, 0x65, 0x6e, 0x53, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x2c, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, + 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x3d, + 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, + 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, + 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, + 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x00, 0x00, 0x00, + 0x3c, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x67, 0x75, 0x69, 0x64, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, 0x78, 0x2d, 0x25, 0x30, 0x34, + 0x78, 0x2d, 0x25, 0x30, 0x34, 0x78, 0x2d, 0x25, 0x30, 0x32, 0x78, 0x25, + 0x30, 0x32, 0x78, 0x2d, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x25, 0x30, 0x32, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x32, 0x64, 0x2f, 0x25, 0x30, 0x32, + 0x64, 0x2f, 0x25, 0x30, 0x34, 0x64, 0x20, 0x20, 0x25, 0x30, 0x32, 0x64, + 0x3a, 0x25, 0x30, 0x32, 0x64, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, 0x58, + 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x47, 0x6c, 0x79, + 0x70, 0x68, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x54, + 0x6f, 0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x57, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x20, 0x44, + 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6f, 0x61, 0x64, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x61, 0x64, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x53, 0x69, + 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x75, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, + 0x43, 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x46, 0x75, 0x6c, + 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, + 0x6f, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x64, 0x69, + 0x61, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, + 0x6e, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x44, 0x65, 0x6e, + 0x69, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, + 0x6f, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x6d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x75, + 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x62, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x43, 0x4d, 0x50, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x54, 0x46, 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x20, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, + 0x00, 0x00, 0x43, 0x52, 0x43, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x20, 0x28, 0x32, 0x39, 0x29, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x20, 0x28, 0x33, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x45, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x46, 0x69, 0x6c, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x70, + 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x64, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x00, 0x00, 0x48, 0x54, 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x62, 0x5c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x44, 0x69, 0x76, 0x55, 0x36, 0x34, + 0x78, 0x33, 0x32, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0xed, 0x00, 0x23, 0x01, 0xf0, 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x38, 0x21, 0x00, 0x00, 0x91, 0x00, 0x23, 0x12, 0xc8, 0x21, 0x00, 0x00, + 0x69, 0x00, 0xa0, 0x10, 0x40, 0x22, 0x00, 0x00, 0xf1, 0x00, 0xa5, 0x02, + 0x30, 0x23, 0x00, 0x00, 0x10, 0x60, 0x00, 0x00, 0x88, 0x23, 0x00, 0x00, + 0x59, 0x00, 0x21, 0x01, 0xe0, 0x23, 0x00, 0x00, 0x55, 0x00, 0x22, 0x01, + 0x38, 0x24, 0x00, 0x00, 0x65, 0x00, 0xa1, 0x00, 0xf8, 0x24, 0x00, 0x00, + 0x89, 0x00, 0xa4, 0x02, 0x80, 0x25, 0x00, 0x00, 0x75, 0x00, 0xa4, 0x02, + 0xf8, 0x25, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x80, 0x26, 0x00, 0x00, + 0x81, 0x00, 0x27, 0x02, 0x00, 0x27, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, + 0x50, 0x35, 0x00, 0x00, 0x48, 0x60, 0x00, 0x00, 0x98, 0x35, 0x00, 0x00, + 0x45, 0x00, 0x20, 0x01, 0xe0, 0x35, 0x00, 0x00, 0x55, 0x00, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x80, 0x18, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x09, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x60, 0x70, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x48, 0x00, 0x49, 0x00, 0x49, 0x00, + 0x6e, 0x93, 0x87, 0x69, 0x34, 0xed, 0xdb, 0x44, 0xae, 0x97, 0x1f, 0xa5, + 0xe4, 0xed, 0x21, 0x16, 0x1d, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x04, + 0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x00, + 0x14, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, + 0x00, 0x68, 0x00, 0x00, 0x00, 0x14, 0x2e, 0x00, 0x54, 0x00, 0x48, 0x00, + 0x20, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, + 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, + 0x30, 0x00, 0x20, 0x00, 0x22, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, + 0x70, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x79, 0x00, 0x73, 0x00, 0x20, 0x00, + 0x61, 0x00, 0x20, 0x00, 0x22, 0x00, 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, + 0x49, 0x00, 0x20, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, + 0x6f, 0x00, 0x20, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, + 0x64, 0x00, 0x21, 0x00, 0x22, 0x00, 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, + 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x22, 0x00, + 0x0d, 0x00, 0x0a, 0x00, 0x2e, 0x00, 0x53, 0x00, 0x48, 0x00, 0x20, 0x00, + 0x4e, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x0d, 0x00, 0x0a, 0x00, + 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x57, 0x00, + 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, + 0x70, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, + 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x0d, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +}; +CONST UINTN mUnsignedImageSize = sizeof (mUnsignedImage); + +// +// AArch64 PE/COFF image signed by the leaf cert (chain embedded) +// +CONST UINT8 mSignedImage[] = { + 0x4d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x45, 0x00, 0x00, 0x64, 0xaa, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x22, 0x20, + 0x0b, 0x02, 0x0e, 0x2c, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0xd1, 0x0e, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x00, 0x32, 0x00, 0x00, 0xb0, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x4b, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5f, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x68, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, + 0x34, 0x16, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x00, 0x00, 0x00, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc8, + 0x2e, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x42, 0x2e, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x2e, 0x72, 0x73, 0x72, + 0x63, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xd4, 0xc0, 0x03, 0x5f, 0xd6, + 0x1d, 0x00, 0x80, 0xd2, 0xfe, 0x03, 0x00, 0xaa, 0x7f, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x01, 0xaa, 0xe1, 0x03, 0x02, 0xaa, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf3, 0x53, 0xbe, 0xa9, 0xf5, 0x7b, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, + 0x08, 0x00, 0x00, 0xd0, 0x14, 0xb9, 0x05, 0xf9, 0x88, 0x32, 0x40, 0xf9, + 0x13, 0x00, 0x00, 0xd0, 0x64, 0x22, 0x2d, 0x91, 0xf5, 0x03, 0x00, 0xaa, + 0x09, 0x29, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, 0x02, 0xc1, 0x08, 0x91, + 0x03, 0x00, 0x80, 0xd2, 0x01, 0x02, 0x80, 0xd2, 0x20, 0x40, 0x80, 0x52, + 0x20, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0xd0, 0x15, 0xad, 0x05, 0xf9, + 0xbf, 0x02, 0x00, 0xf1, 0x15, 0x00, 0x00, 0xd0, 0xc1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x81, 0x04, 0x91, 0x81, 0x05, 0x80, 0xd2, + 0xa0, 0x02, 0x05, 0x91, 0x59, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0xd0, + 0x14, 0xa9, 0x05, 0xf9, 0x89, 0x32, 0x40, 0xf9, 0x08, 0x00, 0x00, 0xd0, + 0x09, 0xb1, 0x05, 0xf9, 0xc9, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0x61, 0x06, 0x91, 0x01, 0x07, 0x80, 0xd2, 0xa0, 0x02, 0x05, 0x91, + 0x4e, 0x00, 0x00, 0x94, 0x89, 0x2e, 0x40, 0xf9, 0x08, 0x00, 0x00, 0xd0, + 0x09, 0xb5, 0x05, 0xf9, 0xe9, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xc1, 0x06, 0x91, 0x08, 0x00, 0x00, 0xd0, 0x00, 0x41, 0x07, 0x91, + 0x21, 0x05, 0x80, 0xd2, 0x44, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0xd0, + 0x00, 0xc1, 0x01, 0x91, 0x9b, 0x00, 0x00, 0x94, 0x60, 0xa6, 0x45, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0x88, 0x32, 0x40, 0xf9, 0x08, 0x39, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x00, 0x00, 0x80, 0xd2, 0xf5, 0x7b, 0x41, 0xa9, + 0xf3, 0x53, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x0f, 0x1c, 0xf8, 0xe2, 0x0f, 0x01, 0xa9, 0xe4, 0x17, 0x02, 0xa9, + 0xe6, 0x1f, 0x03, 0xa9, 0xff, 0x83, 0x00, 0xd1, 0xe2, 0x03, 0x00, 0x91, + 0x10, 0xe4, 0x00, 0x6f, 0xe8, 0xc3, 0x00, 0x91, 0x11, 0x0d, 0x08, 0x4e, + 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, 0x30, 0x1d, 0x18, 0x4e, + 0x51, 0x1d, 0x18, 0x4e, 0xf1, 0x43, 0x00, 0xad, 0x04, 0x00, 0x00, 0x94, + 0xff, 0x83, 0x00, 0x91, 0xfe, 0x07, 0x44, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0xbe, 0xa9, 0xf5, 0x7b, 0x01, 0xa9, 0xff, 0x83, 0x08, 0xd1, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0x01, 0x6d, 0x39, 0xf5, 0x03, 0x00, 0xaa, + 0xf4, 0x03, 0x01, 0xaa, 0xf3, 0x03, 0x02, 0xaa, 0x08, 0x03, 0x00, 0x35, + 0xf4, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x61, 0x02, 0x91, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0xc1, 0x02, 0x91, 0xa1, 0x0b, 0x80, 0xd2, + 0x15, 0x00, 0x00, 0x94, 0x15, 0x02, 0xf8, 0x36, 0x71, 0x42, 0x40, 0xad, + 0xe3, 0x03, 0x00, 0x91, 0xe2, 0x03, 0x14, 0xaa, 0x01, 0x40, 0x80, 0xd2, + 0xe0, 0x83, 0x00, 0x91, 0xf1, 0x43, 0x00, 0xad, 0xfb, 0x00, 0x00, 0x94, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0xb9, 0x45, 0xf9, 0xc8, 0x00, 0x00, 0xb4, + 0x00, 0x29, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, 0x08, 0x04, 0x40, 0xf9, + 0xe1, 0x83, 0x00, 0x91, 0x00, 0x01, 0x3f, 0xd6, 0xff, 0x83, 0x08, 0x91, + 0xf5, 0x7b, 0x41, 0xa9, 0xf3, 0x53, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfe, 0x0f, 0x1f, 0xf8, 0xff, 0x03, 0x08, 0xd1, 0x08, 0x00, 0x00, 0xd0, + 0x08, 0x01, 0x6d, 0x39, 0x68, 0x02, 0x00, 0x35, 0x08, 0x00, 0x00, 0xd0, + 0x03, 0x01, 0x00, 0x91, 0xe6, 0x03, 0x02, 0xaa, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xc1, 0x03, 0x91, 0xe5, 0x03, 0x01, 0xaa, 0xe4, 0x03, 0x00, 0xaa, + 0x01, 0x40, 0x80, 0xd2, 0xe0, 0x03, 0x00, 0x91, 0xfe, 0x00, 0x00, 0x94, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0xb9, 0x45, 0xf9, 0xc8, 0x00, 0x00, 0xb4, + 0x00, 0x29, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, 0x08, 0x04, 0x40, 0xf9, + 0xe1, 0x03, 0x00, 0x91, 0x00, 0x01, 0x3f, 0xd6, 0xff, 0x03, 0x08, 0x91, + 0xfe, 0x07, 0x41, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0x28, 0x00, 0x80, 0x52, + 0x09, 0x00, 0x00, 0xd0, 0x28, 0x01, 0x2d, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0xbd, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, 0xf7, 0x7b, 0x02, 0xa9, + 0xff, 0x83, 0x00, 0xd1, 0xf7, 0x03, 0x00, 0xaa, 0xf6, 0x03, 0x01, 0xaa, + 0xf5, 0x03, 0x02, 0xaa, 0x13, 0x00, 0x00, 0xd0, 0xb7, 0x00, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x61, 0x02, 0x91, 0xa1, 0x07, 0x80, 0xd2, + 0x05, 0x00, 0x00, 0x14, 0xd7, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xc1, 0x09, 0x91, 0xc1, 0x07, 0x80, 0xd2, 0x60, 0xc2, 0x08, 0x91, + 0xd0, 0xff, 0xff, 0x97, 0xd6, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0x61, 0x0a, 0x91, 0xe1, 0x07, 0x80, 0xd2, 0x60, 0xc2, 0x08, 0x91, + 0xca, 0xff, 0xff, 0x97, 0xbd, 0x04, 0x00, 0x94, 0xf4, 0x03, 0x00, 0xaa, + 0x14, 0x01, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x21, 0x04, 0x91, + 0xc1, 0x08, 0x80, 0xd2, 0x60, 0xc2, 0x08, 0x91, 0xc2, 0xff, 0xff, 0x97, + 0x00, 0x00, 0x80, 0xd2, 0x15, 0x00, 0x00, 0x14, 0xb1, 0x42, 0x40, 0xad, + 0xe3, 0x03, 0x00, 0x91, 0xe2, 0x03, 0x17, 0xaa, 0xe0, 0x03, 0x14, 0xaa, + 0xf1, 0x43, 0x00, 0xad, 0x86, 0x00, 0x00, 0x94, 0xdf, 0x02, 0x00, 0xf1, + 0xf3, 0x03, 0x00, 0xaa, 0x64, 0x1a, 0x40, 0xfa, 0x09, 0x01, 0x00, 0x54, + 0xc8, 0x06, 0x40, 0xf9, 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0xf0, 0xd2, 0x1f, 0x00, 0x08, 0xeb, + 0xf3, 0x23, 0x93, 0x9a, 0xe0, 0x03, 0x14, 0xaa, 0xb3, 0x04, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0xaa, 0xff, 0x83, 0x00, 0x91, 0xf7, 0x7b, 0x42, 0xa9, + 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfe, 0x0f, 0x1c, 0xf8, 0xe1, 0x8b, 0x00, 0xa9, 0xe3, 0x93, 0x01, 0xa9, + 0xe5, 0x9b, 0x02, 0xa9, 0xe7, 0x1f, 0x00, 0xf9, 0xff, 0x83, 0x00, 0xd1, + 0xe2, 0x03, 0x00, 0x91, 0x10, 0xe4, 0x00, 0x6f, 0xe8, 0xa3, 0x00, 0x91, + 0x11, 0x0d, 0x08, 0x4e, 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0xa9, 0x45, 0xf9, 0x30, 0x1d, 0x18, 0x4e, + 0x01, 0x21, 0x40, 0xf9, 0x51, 0x1d, 0x18, 0x4e, 0xf1, 0x43, 0x00, 0xad, + 0xb2, 0xff, 0xff, 0x97, 0xff, 0x83, 0x00, 0x91, 0xfe, 0x07, 0x44, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0xff, 0x43, 0x00, 0xd1, 0xf3, 0x7b, 0x00, 0xa9, + 0xff, 0x43, 0x00, 0xd1, 0xf3, 0x03, 0x00, 0xaa, 0xf3, 0x00, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x21, 0x04, 0x91, 0x08, 0x00, 0x00, 0xd0, + 0x00, 0x61, 0x0b, 0x91, 0x81, 0x04, 0x80, 0xd2, 0x86, 0xff, 0xff, 0x97, + 0x68, 0x02, 0x40, 0x39, 0xe8, 0x07, 0x00, 0x39, 0x68, 0x06, 0x40, 0x39, + 0xe8, 0x03, 0x00, 0x39, 0xe9, 0x03, 0x40, 0x39, 0xe8, 0x07, 0x40, 0x39, + 0x00, 0x21, 0x09, 0x2a, 0xff, 0x43, 0x00, 0x91, 0xf3, 0x7b, 0x40, 0xa9, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0xbe, 0xa9, + 0xfe, 0x0b, 0x00, 0xf9, 0xf4, 0x03, 0x00, 0xaa, 0xf4, 0x00, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x21, 0x04, 0x91, 0x08, 0x00, 0x00, 0xd0, + 0x00, 0x61, 0x0b, 0x91, 0x01, 0x13, 0x80, 0xd2, 0x71, 0xff, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0xaa, 0xdf, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0x0a, 0x00, 0x91, 0xdc, 0xff, 0xff, 0x97, 0xe8, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0x00, 0x3d, 0x10, 0x33, 0xfe, 0x0b, 0x40, 0xf9, + 0xf3, 0x53, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x00, 0xd1, 0xf3, 0x7b, 0x00, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf3, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0xd0, 0x02, 0xc1, 0x0a, 0x91, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0x61, 0x0c, 0x91, 0xc1, 0x0f, 0x80, 0xd2, + 0x5b, 0xff, 0xff, 0x97, 0x00, 0x00, 0x80, 0xd2, 0x73, 0x01, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0x79, 0x28, 0x01, 0x00, 0x34, 0x88, 0x01, 0x00, 0x58, + 0x1f, 0x00, 0x08, 0xeb, 0xa2, 0x00, 0x00, 0x54, 0x69, 0x2e, 0x40, 0x78, + 0x00, 0x04, 0x00, 0x91, 0x89, 0xff, 0xff, 0x35, 0x02, 0x00, 0x00, 0x14, + 0xe0, 0x00, 0x00, 0x58, 0xf3, 0x7b, 0x40, 0xa9, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x20, 0x03, 0xd5, 0x40, 0x42, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x80, 0xd2, 0x68, 0x01, 0x00, 0xb4, + 0x09, 0x01, 0xc0, 0x39, 0x29, 0x01, 0x00, 0x34, 0x29, 0x01, 0x00, 0x58, + 0x1f, 0x00, 0x09, 0xeb, 0xa2, 0x00, 0x00, 0x54, 0x00, 0x04, 0x00, 0x91, + 0x0a, 0x69, 0xe0, 0x38, 0x8a, 0xff, 0xff, 0x35, 0x02, 0x00, 0x00, 0x14, + 0x80, 0x00, 0x00, 0x58, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x42, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf3, 0x53, 0xbd, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, 0xfe, 0x13, 0x00, 0xf9, + 0xff, 0x83, 0x00, 0xd1, 0xf6, 0x03, 0x00, 0xaa, 0xf5, 0x03, 0x02, 0xaa, + 0xf4, 0x03, 0x03, 0xaa, 0x13, 0x00, 0x00, 0xd0, 0xd6, 0x00, 0x00, 0x36, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x01, 0x0e, 0x91, 0xe1, 0x08, 0x80, 0xd2, + 0x60, 0xa2, 0x0e, 0x91, 0x27, 0xff, 0xff, 0x97, 0xd5, 0x00, 0x00, 0x36, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0xa1, 0x0f, 0x91, 0x01, 0x09, 0x80, 0xd2, + 0x60, 0xa2, 0x0e, 0x91, 0x21, 0xff, 0xff, 0x97, 0x05, 0x00, 0x80, 0xd2, + 0x91, 0x42, 0x40, 0xad, 0xe4, 0x03, 0x00, 0x91, 0xe3, 0x03, 0x15, 0xaa, + 0x02, 0x28, 0x80, 0xd2, 0x21, 0x28, 0x80, 0xd2, 0xf1, 0x43, 0x00, 0xad, + 0xe0, 0x03, 0x16, 0xaa, 0x66, 0x00, 0x00, 0x94, 0xff, 0x83, 0x00, 0x91, + 0xfe, 0x13, 0x40, 0xf9, 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0xbd, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, + 0xfe, 0x13, 0x00, 0xf9, 0xff, 0x83, 0x00, 0xd1, 0xf6, 0x03, 0x00, 0xaa, + 0xf5, 0x03, 0x01, 0xaa, 0xf4, 0x03, 0x02, 0xaa, 0xf3, 0x03, 0x03, 0xaa, + 0xf6, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x01, 0x0e, 0x91, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0xa1, 0x0e, 0x91, 0x41, 0x1d, 0x80, 0xd2, + 0x04, 0xff, 0xff, 0x97, 0x05, 0x00, 0x80, 0xd2, 0x71, 0x42, 0x40, 0xad, + 0xe4, 0x03, 0x00, 0x91, 0xe3, 0x03, 0x14, 0xaa, 0x02, 0x08, 0x80, 0xd2, + 0xa1, 0xfe, 0x41, 0xd3, 0xf1, 0x43, 0x00, 0xad, 0xe0, 0x03, 0x16, 0xaa, + 0x49, 0x00, 0x00, 0x94, 0xff, 0x83, 0x00, 0x91, 0xfe, 0x13, 0x40, 0xf9, + 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x1d, 0xf8, 0xe3, 0x93, 0x00, 0xa9, + 0xe5, 0x9b, 0x01, 0xa9, 0xe7, 0x17, 0x00, 0xf9, 0xff, 0x83, 0x00, 0xd1, + 0xe3, 0x03, 0x00, 0x91, 0x10, 0xe4, 0x00, 0x6f, 0xe8, 0xa3, 0x00, 0x91, + 0x11, 0x0d, 0x08, 0x4e, 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, + 0x30, 0x1d, 0x18, 0x4e, 0x51, 0x1d, 0x18, 0x4e, 0xf1, 0x43, 0x00, 0xad, + 0xd4, 0xff, 0xff, 0x97, 0xff, 0x83, 0x00, 0x91, 0xfe, 0x07, 0x43, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0x08, 0x00, 0x80, 0xd2, 0x5f, 0x00, 0x00, 0xf1, + 0x8d, 0x01, 0x00, 0x54, 0x69, 0x3c, 0x08, 0x13, 0x1f, 0x00, 0x01, 0xeb, + 0x22, 0x01, 0x00, 0x54, 0x03, 0x00, 0x00, 0x39, 0x9f, 0x04, 0x00, 0xf1, + 0x40, 0x00, 0x00, 0x54, 0x09, 0x04, 0x00, 0x39, 0x08, 0x05, 0x00, 0x91, + 0x1f, 0x01, 0x02, 0xeb, 0x00, 0x00, 0x04, 0x8b, 0xeb, 0xfe, 0xff, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x53, 0xbc, 0xa9, + 0xf5, 0x5b, 0x01, 0xa9, 0xf7, 0x63, 0x02, 0xa9, 0xf9, 0x7b, 0x03, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x03, 0x02, 0xaa, 0x9f, 0x02, 0x00, 0x39, + 0x08, 0x00, 0x00, 0xd0, 0x17, 0x01, 0x2a, 0x91, 0xb6, 0x7e, 0x40, 0xd3, + 0xf3, 0x03, 0x01, 0xaa, 0x19, 0x00, 0x00, 0xd0, 0x18, 0x00, 0x00, 0xd0, + 0xb5, 0x00, 0x00, 0x35, 0x02, 0xc3, 0x0d, 0x91, 0xc1, 0x04, 0x80, 0xd2, + 0x20, 0x83, 0x2b, 0x91, 0xc1, 0xfe, 0xff, 0x97, 0x56, 0x00, 0x00, 0xb5, + 0x80, 0x00, 0x3e, 0xd4, 0x69, 0x0a, 0xd6, 0x9a, 0x28, 0xcd, 0x16, 0x9b, + 0xf3, 0x03, 0x09, 0xaa, 0xe8, 0x4a, 0xe8, 0x38, 0x88, 0x1e, 0x00, 0x38, + 0x93, 0xfe, 0xff, 0xb5, 0xe0, 0x03, 0x14, 0xaa, 0xf9, 0x7b, 0x43, 0xa9, + 0xf7, 0x63, 0x42, 0xa9, 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0xba, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, + 0xf7, 0x63, 0x02, 0xa9, 0xf9, 0x6b, 0x03, 0xa9, 0xfb, 0x73, 0x04, 0xa9, + 0xfe, 0x2b, 0x00, 0xf9, 0xff, 0x43, 0x03, 0xd1, 0xf3, 0x03, 0x02, 0xaa, + 0xe4, 0x33, 0x00, 0xf9, 0x78, 0x02, 0x73, 0x92, 0xff, 0x27, 0x00, 0xf9, + 0xf7, 0x03, 0x00, 0xaa, 0xf9, 0x03, 0x01, 0xaa, 0xf5, 0x03, 0x03, 0xaa, + 0x59, 0x02, 0x00, 0xb4, 0x58, 0x02, 0x00, 0xb5, 0x37, 0x02, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x41, 0x0d, 0x91, 0xe1, 0x49, 0x80, 0xd2, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0x41, 0x10, 0x91, 0x9c, 0xfe, 0xff, 0x97, + 0x00, 0x00, 0x80, 0xd2, 0xff, 0x43, 0x03, 0x91, 0xfe, 0x2b, 0x40, 0xf9, + 0xfb, 0x73, 0x44, 0xa9, 0xf9, 0x6b, 0x43, 0xa9, 0xf7, 0x63, 0x42, 0xa9, + 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xd8, 0x00, 0x00, 0xb4, 0xb5, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xa1, 0x12, 0x91, 0xe1, 0x4a, 0x80, 0xd2, 0xef, 0xff, 0xff, 0x17, + 0x56, 0x6d, 0x00, 0x58, 0x3f, 0x03, 0x16, 0xeb, 0x13, 0x01, 0x30, 0x36, + 0xa9, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x41, 0x13, 0x91, + 0x01, 0x4c, 0x80, 0xd2, 0xe7, 0xff, 0xff, 0x17, 0x54, 0x00, 0x80, 0xd2, + 0x07, 0x00, 0x00, 0x14, 0xa9, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0x81, 0x11, 0x91, 0xc1, 0x4c, 0x80, 0xd2, 0xe0, 0xff, 0xff, 0x17, + 0x34, 0x00, 0x80, 0xd2, 0xe0, 0x03, 0x15, 0xaa, 0x33, 0x02, 0x40, 0x36, + 0x16, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x16, 0xeb, 0xe9, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x81, 0x14, 0x91, 0x00, 0x00, 0x00, 0xd0, + 0x00, 0x40, 0x10, 0x91, 0x41, 0x4e, 0x80, 0xd2, 0x72, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0xaa, 0x0c, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x16, 0xeb, + 0x68, 0xfa, 0xff, 0x54, 0x5b, 0x00, 0x80, 0xd2, 0xfc, 0xff, 0x9f, 0xd2, + 0x10, 0x00, 0x00, 0x14, 0x24, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x16, 0xeb, + 0xe9, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, 0x02, 0xc1, 0x16, 0x91, + 0x00, 0x00, 0x00, 0xd0, 0x00, 0x40, 0x10, 0x91, 0x21, 0x4f, 0x80, 0xd2, + 0x62, 0xfe, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, 0x1a, 0xff, 0xff, 0x97, + 0x1f, 0x00, 0x16, 0xeb, 0x68, 0xf8, 0xff, 0x54, 0x3b, 0x00, 0x80, 0xd2, + 0xfc, 0x1f, 0x80, 0xd2, 0x98, 0x00, 0x00, 0xb4, 0x3f, 0x03, 0x00, 0xf1, + 0xf7, 0x12, 0x9f, 0x9a, 0x02, 0x00, 0x00, 0x14, 0x99, 0xf7, 0xff, 0xb4, + 0x1a, 0x00, 0x80, 0xd2, 0x16, 0x00, 0x80, 0xd2, 0x18, 0x00, 0x80, 0xd2, + 0x97, 0x00, 0x00, 0xb4, 0x28, 0x07, 0x00, 0xd1, 0x16, 0x5d, 0x14, 0x9b, + 0xf8, 0x03, 0x17, 0xaa, 0x7f, 0x07, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, + 0x09, 0x5d, 0x18, 0x53, 0xa8, 0x02, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, + 0x09, 0x1d, 0x40, 0xb3, 0x28, 0x01, 0x1c, 0xea, 0xe8, 0x37, 0x00, 0xf9, + 0x60, 0x61, 0x00, 0x54, 0xf6, 0x53, 0x05, 0xa9, 0xf6, 0x27, 0x40, 0xf9, + 0xe9, 0x03, 0x08, 0xaa, 0xf8, 0x4b, 0x00, 0xf9, 0xfb, 0xf3, 0x07, 0xa9, + 0xea, 0x2b, 0x40, 0xf9, 0xff, 0x02, 0x00, 0xf1, 0xe0, 0x12, 0x4a, 0xfa, + 0x02, 0x60, 0x00, 0x54, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x27, 0x00, 0xf9, + 0x29, 0x01, 0x88, 0x9a, 0xff, 0x03, 0x01, 0x39, 0x08, 0x28, 0x84, 0xd2, + 0xff, 0x07, 0x01, 0x39, 0x73, 0x02, 0x08, 0x8a, 0x39, 0x00, 0x80, 0xd2, + 0x1b, 0x00, 0x80, 0x52, 0x18, 0x00, 0x80, 0xd2, 0x1c, 0x00, 0x80, 0xd2, + 0x3f, 0x29, 0x00, 0xf1, 0x60, 0x47, 0x00, 0x54, 0x3f, 0x35, 0x00, 0xf1, + 0x80, 0x44, 0x00, 0x54, 0x3f, 0x95, 0x00, 0xf1, 0x80, 0x00, 0x00, 0x54, + 0xf4, 0xa3, 0x01, 0x91, 0x73, 0x02, 0x76, 0xb2, 0x46, 0x02, 0x00, 0x14, + 0xec, 0x33, 0x40, 0xf9, 0xee, 0xd3, 0x47, 0xa9, 0xea, 0x27, 0x40, 0xf9, + 0xe9, 0x03, 0x15, 0xaa, 0xd5, 0x01, 0x15, 0x8b, 0xeb, 0x03, 0x16, 0xaa, + 0xdf, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x08, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, 0x08, 0x5d, 0x18, 0x53, + 0xad, 0x02, 0xc0, 0x39, 0x08, 0x7d, 0x40, 0x93, 0xa8, 0x1d, 0x40, 0xb3, + 0x08, 0x01, 0x14, 0x8a, 0xe8, 0x37, 0x00, 0xf9, 0x1f, 0xc9, 0x00, 0xf1, + 0xc8, 0x09, 0x00, 0x54, 0x80, 0x08, 0x00, 0x54, 0x1f, 0xb1, 0x00, 0xf1, + 0x48, 0x07, 0x00, 0x54, 0xe0, 0x06, 0x00, 0x54, 0x08, 0x0e, 0x00, 0xb4, + 0x1f, 0x81, 0x00, 0xf1, 0x40, 0x06, 0x00, 0x54, 0x1f, 0xa9, 0x00, 0xf1, + 0xa0, 0x00, 0x00, 0x54, 0x1f, 0xad, 0x00, 0xf1, 0x81, 0x0d, 0x00, 0x54, + 0x73, 0x02, 0x7f, 0xb2, 0xe4, 0xff, 0xff, 0x17, 0xd3, 0x02, 0x58, 0x37, + 0x73, 0x02, 0x77, 0xb2, 0x36, 0x02, 0x00, 0xb5, 0x8a, 0x19, 0x40, 0xb9, + 0x49, 0x21, 0x00, 0x11, 0x89, 0x19, 0x00, 0xb9, 0x3f, 0x01, 0x00, 0x71, + 0xac, 0x00, 0x00, 0x54, 0x8a, 0x05, 0x40, 0xf9, 0x4a, 0xc1, 0x29, 0x8b, + 0x4b, 0x21, 0x00, 0xd1, 0x09, 0x00, 0x00, 0x14, 0x89, 0x01, 0x40, 0xf9, + 0xea, 0x03, 0x09, 0xcb, 0x4a, 0x09, 0x40, 0x92, 0x4b, 0x01, 0x09, 0x8b, + 0x6a, 0x21, 0x00, 0x91, 0x8a, 0x01, 0x00, 0xf9, 0x02, 0x00, 0x00, 0x14, + 0xd6, 0x22, 0x00, 0x91, 0x6a, 0x01, 0x40, 0xf9, 0xce, 0xff, 0xff, 0x17, + 0x56, 0x02, 0x00, 0xb5, 0x89, 0x19, 0x40, 0xb9, 0x28, 0x21, 0x00, 0x11, + 0x88, 0x19, 0x00, 0xb9, 0x1f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, + 0x89, 0x05, 0x40, 0xf9, 0x29, 0xc1, 0x28, 0x8b, 0x29, 0x21, 0x00, 0xd1, + 0x07, 0x00, 0x00, 0x14, 0x88, 0x01, 0x40, 0xf9, 0xe9, 0x03, 0x08, 0xcb, + 0x29, 0x09, 0x40, 0x92, 0x29, 0x01, 0x08, 0x8b, 0x28, 0x21, 0x00, 0x91, + 0x88, 0x01, 0x00, 0xf9, 0x39, 0x01, 0x40, 0xf9, 0xbc, 0xff, 0xff, 0x17, + 0x79, 0x01, 0x40, 0xf9, 0xd6, 0x22, 0x00, 0x91, 0xb9, 0xff, 0xff, 0x17, + 0x73, 0x02, 0x7e, 0xb2, 0xb7, 0xff, 0xff, 0x17, 0x73, 0x02, 0x7d, 0xb2, + 0xb5, 0xff, 0xff, 0x17, 0x1f, 0xb5, 0x00, 0xf1, 0xc0, 0x01, 0x00, 0x54, + 0x1f, 0xb9, 0x00, 0xf1, 0x40, 0x01, 0x00, 0x54, 0x1f, 0xc1, 0x00, 0xf1, + 0xa0, 0x00, 0x00, 0x54, 0x1f, 0xc5, 0x00, 0xf1, 0x61, 0x06, 0x00, 0x54, + 0x18, 0x00, 0x80, 0xd2, 0x26, 0x00, 0x00, 0x14, 0xd3, 0xff, 0x5f, 0x37, + 0x73, 0x02, 0x7b, 0xb2, 0xfc, 0xff, 0xff, 0x17, 0x73, 0x02, 0x75, 0xb2, + 0xa6, 0xff, 0xff, 0x17, 0x73, 0x02, 0x40, 0xb2, 0xa4, 0xff, 0xff, 0x17, + 0x1f, 0xdd, 0x00, 0xf1, 0xa8, 0x00, 0x00, 0x54, 0x09, 0xcd, 0x00, 0xd1, + 0x3f, 0x11, 0x00, 0xf1, 0xa8, 0x04, 0x00, 0x54, 0xf2, 0xff, 0xff, 0x17, + 0x09, 0xe1, 0x00, 0xd1, 0x3f, 0x05, 0x00, 0xf1, 0xe9, 0xfd, 0xff, 0x54, + 0x09, 0x31, 0x01, 0xd1, 0x3f, 0xf9, 0x7a, 0xf2, 0xc1, 0x03, 0x00, 0x54, + 0x73, 0x02, 0x7c, 0xb2, 0x96, 0xff, 0xff, 0x17, 0x1f, 0xe5, 0x00, 0xf1, + 0x28, 0x02, 0x00, 0x54, 0x09, 0x0b, 0x18, 0x8b, 0xd5, 0x01, 0x15, 0x8b, + 0xdf, 0x05, 0x00, 0xf1, 0x08, 0x05, 0x09, 0x8b, 0x18, 0xc1, 0x00, 0xd1, + 0x61, 0x00, 0x00, 0x54, 0x08, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, + 0xa8, 0x06, 0xc0, 0x39, 0x08, 0x5d, 0x18, 0x53, 0xa9, 0x02, 0xc0, 0x39, + 0x08, 0x7d, 0x40, 0x93, 0x28, 0x1d, 0x40, 0xb3, 0x08, 0x01, 0x14, 0x8a, + 0x1f, 0xc1, 0x00, 0xf1, 0xe2, 0xfd, 0xff, 0x54, 0xb5, 0x02, 0x0e, 0xcb, + 0x93, 0x00, 0x58, 0x37, 0x73, 0x02, 0x77, 0xb2, 0xea, 0x03, 0x18, 0xaa, + 0x7f, 0xff, 0xff, 0x17, 0xf9, 0x03, 0x18, 0xaa, 0x7d, 0xff, 0xff, 0x17, + 0xf5, 0x03, 0x09, 0xaa, 0x19, 0x00, 0x80, 0xd2, 0xea, 0x27, 0x00, 0xf9, + 0xe9, 0x03, 0x15, 0xaa, 0xea, 0x03, 0x16, 0xaa, 0x1f, 0x91, 0x01, 0xf1, + 0x48, 0x0a, 0x00, 0x54, 0x20, 0x1c, 0x00, 0x54, 0x1f, 0x29, 0x00, 0xf1, + 0x60, 0x07, 0x00, 0x54, 0x1f, 0x35, 0x00, 0xf1, 0x60, 0x04, 0x00, 0x54, + 0x1f, 0x95, 0x00, 0xf1, 0x20, 0xed, 0xff, 0x54, 0x1f, 0x4d, 0x01, 0xf1, + 0xc0, 0x0f, 0x00, 0x54, 0x1f, 0x61, 0x01, 0xf1, 0x40, 0x1a, 0x00, 0x54, + 0x1f, 0x85, 0x01, 0xf1, 0x60, 0x0f, 0x00, 0x54, 0x1f, 0x8d, 0x01, 0xf1, + 0x21, 0xec, 0xff, 0x54, 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, + 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, + 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, + 0x08, 0x01, 0x40, 0x79, 0xf4, 0x03, 0x03, 0x91, 0xe8, 0x63, 0x00, 0xf9, + 0x4a, 0xff, 0xff, 0x17, 0xe8, 0x3f, 0x40, 0xf9, 0x0b, 0x01, 0x15, 0x8b, + 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0x68, 0x05, 0xc0, 0x39, 0x0a, 0x5d, 0x18, 0x53, + 0x68, 0x01, 0xc0, 0x39, 0x4a, 0x7d, 0x40, 0x93, 0x0a, 0x1d, 0x40, 0xb3, + 0xe8, 0x43, 0x40, 0xf9, 0x48, 0x01, 0x08, 0x8a, 0x1f, 0x29, 0x00, 0xf1, + 0xe8, 0x37, 0x00, 0xf9, 0x35, 0x11, 0x8b, 0x9a, 0x09, 0x00, 0x00, 0xd0, + 0x29, 0x21, 0x1b, 0x91, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x11, 0x1b, 0x91, + 0x34, 0x11, 0x88, 0x9a, 0x7b, 0x01, 0x00, 0x14, 0xe8, 0x3f, 0x40, 0xf9, + 0x14, 0x00, 0x00, 0xd0, 0x94, 0x12, 0x1b, 0x91, 0x15, 0x01, 0x15, 0x8b, + 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, 0x0a, 0x5d, 0x18, 0x53, + 0xa8, 0x02, 0xc0, 0x39, 0x4a, 0x7d, 0x40, 0x93, 0x0a, 0x1d, 0x40, 0xb3, + 0xe8, 0x43, 0x40, 0xf9, 0x48, 0x01, 0x08, 0x8a, 0xe8, 0x37, 0x00, 0xf9, + 0x1f, 0x35, 0x00, 0xf1, 0x20, 0x2d, 0x00, 0x54, 0xf5, 0x03, 0x09, 0xaa, + 0x67, 0x01, 0x00, 0x14, 0x1f, 0x9d, 0x01, 0xf1, 0x60, 0x20, 0x00, 0x54, + 0x1f, 0xc1, 0x01, 0xf1, 0xa0, 0x10, 0x00, 0x54, 0x1f, 0xc9, 0x01, 0xf1, + 0xa0, 0x09, 0x00, 0x54, 0x1f, 0xcd, 0x01, 0xf1, 0xc0, 0x05, 0x00, 0x54, + 0x1f, 0xd1, 0x01, 0xf1, 0xc0, 0x00, 0x00, 0x54, 0x1f, 0xd5, 0x01, 0xf1, + 0x40, 0x10, 0x00, 0x54, 0x1f, 0xe1, 0x01, 0xf1, 0xe0, 0x0f, 0x00, 0x54, + 0x10, 0xff, 0xff, 0x17, 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, + 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, + 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, + 0x09, 0x01, 0x40, 0xf9, 0x89, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x14, 0x41, 0x1a, 0x91, 0x3f, 0x01, 0x00, 0x14, 0x28, 0x15, 0x40, 0x39, + 0x02, 0x00, 0x80, 0xd2, 0x27, 0x11, 0x40, 0x39, 0xc1, 0x04, 0x80, 0xd2, + 0x26, 0x01, 0x40, 0x79, 0xe0, 0x63, 0x02, 0x91, 0x25, 0x0d, 0x40, 0x39, + 0xe8, 0x03, 0x00, 0xb9, 0x24, 0x09, 0x40, 0x39, 0x08, 0x00, 0x00, 0xd0, + 0x03, 0x81, 0x1a, 0x91, 0xf6, 0x01, 0x00, 0x94, 0x09, 0x01, 0x00, 0x14, + 0x73, 0x02, 0x76, 0xb2, 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, + 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, + 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, + 0x14, 0x01, 0x40, 0xf9, 0x94, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x14, 0xe1, 0x18, 0x91, 0x73, 0xfa, 0x75, 0x92, 0xf3, 0x22, 0x58, 0x37, + 0x19, 0x00, 0x80, 0xd2, 0x15, 0x01, 0x00, 0x14, 0x56, 0x02, 0x00, 0xb5, + 0xea, 0x33, 0x40, 0xf9, 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, + 0x49, 0x19, 0x00, 0xb9, 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, + 0x48, 0x05, 0x40, 0xf9, 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, + 0x0a, 0x00, 0x00, 0x14, 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, + 0x08, 0x09, 0x40, 0x92, 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, + 0x49, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, + 0xe8, 0x03, 0x0a, 0xaa, 0x04, 0x01, 0x40, 0xf9, 0x08, 0x00, 0xf0, 0xd2, + 0xf4, 0x63, 0x02, 0x91, 0x9f, 0x00, 0x08, 0xeb, 0xa3, 0x01, 0x00, 0x54, + 0x89, 0xf8, 0x40, 0x92, 0x28, 0x05, 0x00, 0xd1, 0x1f, 0x89, 0x00, 0xf1, + 0x68, 0x02, 0x00, 0x54, 0x28, 0xf1, 0x7d, 0xd3, 0x08, 0x01, 0x09, 0xcb, + 0x09, 0x05, 0x08, 0x8b, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x81, 0x1e, 0x91, + 0x28, 0x01, 0x08, 0x8b, 0x14, 0x55, 0x00, 0xd1, 0x08, 0x00, 0x00, 0x14, + 0x9f, 0x1c, 0x00, 0xf1, 0x28, 0x01, 0x00, 0x54, 0x88, 0x08, 0x04, 0x8b, + 0x09, 0x09, 0x08, 0x8b, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x41, 0x1b, 0x91, + 0x34, 0x01, 0x08, 0x8b, 0xe8, 0x63, 0x02, 0x91, 0x9f, 0x02, 0x08, 0xeb, + 0xc1, 0x1c, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, 0x03, 0xf1, 0x1a, 0x91, + 0x02, 0x00, 0x80, 0xd2, 0xc1, 0x04, 0x80, 0xd2, 0xe0, 0x63, 0x02, 0x91, + 0xa3, 0x01, 0x00, 0x94, 0xdf, 0x00, 0x00, 0x14, 0xc8, 0x04, 0x80, 0x92, + 0x68, 0x02, 0x08, 0x8a, 0x13, 0x01, 0x7c, 0xb2, 0x73, 0x02, 0x7b, 0xb2, + 0x73, 0x02, 0x79, 0xb2, 0x73, 0x00, 0x38, 0x37, 0x68, 0xfa, 0x7e, 0x92, + 0x13, 0x01, 0x72, 0xb2, 0x69, 0x02, 0x7c, 0xf2, 0xe1, 0x02, 0x00, 0x54, + 0x56, 0x02, 0x00, 0xb5, 0xeb, 0x33, 0x40, 0xf9, 0x68, 0x19, 0x40, 0xb9, + 0x0a, 0x21, 0x00, 0x11, 0x6a, 0x19, 0x00, 0xb9, 0x5f, 0x01, 0x00, 0x71, + 0xac, 0x00, 0x00, 0x54, 0x68, 0x05, 0x40, 0xf9, 0x08, 0xc1, 0x2a, 0x8b, + 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, 0x6a, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x0a, 0xcb, 0x08, 0x05, 0x40, 0x92, 0x08, 0x01, 0x0a, 0x8b, + 0x0a, 0x21, 0x00, 0x91, 0x6a, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x14, + 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, 0x14, 0x01, 0x80, 0xb9, + 0x16, 0x00, 0x00, 0x14, 0x76, 0x02, 0x00, 0xb5, 0xeb, 0x33, 0x40, 0xf9, + 0x68, 0x19, 0x40, 0xb9, 0x0a, 0x21, 0x00, 0x11, 0x6a, 0x19, 0x00, 0xb9, + 0x5f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x68, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x2a, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x07, 0x00, 0x00, 0x14, + 0x6a, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x0a, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x0a, 0x8b, 0x0a, 0x21, 0x00, 0x91, 0x6a, 0x01, 0x00, 0xf9, + 0x14, 0x01, 0x40, 0xf9, 0x03, 0x00, 0x00, 0x14, 0x54, 0x01, 0x40, 0xf9, + 0xd6, 0x22, 0x00, 0x91, 0x68, 0xf2, 0x7d, 0xd3, 0x0a, 0x01, 0x1b, 0x12, + 0x68, 0x05, 0x80, 0x52, 0x7f, 0x02, 0x7f, 0xf2, 0x1b, 0x11, 0x8a, 0x1a, + 0x6a, 0x02, 0x7d, 0xf2, 0xe8, 0x07, 0x9f, 0x1a, 0x33, 0x02, 0x38, 0x37, + 0x42, 0x01, 0x80, 0xd2, 0x6a, 0x00, 0x00, 0xb4, 0x73, 0xfa, 0x7a, 0x92, + 0x39, 0x00, 0x80, 0xd2, 0x69, 0x02, 0x72, 0x92, 0xd4, 0x00, 0xf8, 0xb6, + 0xa9, 0x00, 0x00, 0xb5, 0x73, 0x02, 0x7f, 0xb2, 0xbb, 0x05, 0x80, 0x52, + 0xf4, 0x03, 0x14, 0xcb, 0x04, 0x00, 0x00, 0x14, 0x69, 0x00, 0x00, 0xb4, + 0x53, 0x00, 0x20, 0x37, 0x94, 0x7e, 0x40, 0xd3, 0xe8, 0x03, 0x01, 0x39, + 0x06, 0x00, 0x00, 0x14, 0x02, 0x02, 0x80, 0xd2, 0xff, 0x03, 0x01, 0x39, + 0x69, 0x00, 0x00, 0xb5, 0x54, 0x00, 0xf8, 0xb6, 0x94, 0x7e, 0x40, 0xd3, + 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x63, 0x02, 0x91, 0x99, 0xfd, 0xff, 0x97, + 0xe8, 0x63, 0x02, 0x91, 0x08, 0x00, 0x08, 0xcb, 0xd4, 0x00, 0x00, 0xb5, + 0xb9, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x80, 0xd2, 0xf4, 0x63, 0x02, 0x91, + 0x1c, 0x00, 0x80, 0xd2, 0x0a, 0x00, 0x00, 0x14, 0x49, 0x28, 0x00, 0x58, + 0x09, 0x7d, 0xc9, 0x9b, 0xf4, 0x03, 0x00, 0xaa, 0x29, 0xfd, 0x41, 0xd3, + 0x29, 0x05, 0x09, 0x8b, 0x1c, 0x01, 0x09, 0xcb, 0x7c, 0x00, 0x00, 0xb4, + 0x29, 0x01, 0x08, 0xcb, 0x3c, 0x0d, 0x00, 0x91, 0xe9, 0x03, 0x41, 0x39, + 0xc9, 0x00, 0x00, 0x34, 0xa8, 0x00, 0x00, 0xb4, 0x0a, 0x05, 0x00, 0xd1, + 0xa9, 0x26, 0x00, 0x58, 0x49, 0x7d, 0xc9, 0x9b, 0x08, 0x05, 0x49, 0x8b, + 0x69, 0x1f, 0x00, 0x53, 0x49, 0x00, 0x00, 0x34, 0x39, 0x07, 0x00, 0x91, + 0x7f, 0x1f, 0x00, 0x72, 0x18, 0x05, 0x88, 0x9a, 0x28, 0x00, 0x80, 0x52, + 0xe8, 0x07, 0x01, 0x39, 0x73, 0x02, 0x74, 0xb2, 0x33, 0x0d, 0x28, 0x36, + 0x13, 0x0d, 0x00, 0x37, 0xf3, 0x0c, 0x48, 0x36, 0xe8, 0x27, 0x40, 0xf9, + 0x7f, 0x02, 0x75, 0xf2, 0x19, 0x01, 0x99, 0x9a, 0x63, 0x00, 0x00, 0x14, + 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, 0x48, 0x19, 0x40, 0xb9, + 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, 0x3f, 0x01, 0x00, 0x71, + 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, 0x08, 0xc1, 0x29, 0x8b, + 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, 0x49, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, 0x08, 0x01, 0x09, 0x8b, + 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x14, + 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, 0x14, 0x01, 0x40, 0xf9, + 0x94, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb0, 0x14, 0x21, 0x19, 0x91, + 0x4a, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x14, 0xaa, 0xaf, 0xfc, 0xff, 0x97, + 0xe0, 0x8b, 0x00, 0xb9, 0x80, 0x12, 0x00, 0x91, 0x96, 0xfc, 0xff, 0x97, + 0xe0, 0xe3, 0x00, 0x79, 0x80, 0x1a, 0x00, 0x91, 0x93, 0xfc, 0xff, 0x97, + 0x88, 0x36, 0x40, 0x39, 0x02, 0x00, 0x80, 0xd2, 0x8a, 0x3e, 0x40, 0x39, + 0x06, 0x3c, 0x00, 0x53, 0x89, 0x3a, 0x40, 0x39, 0xc1, 0x04, 0x80, 0xd2, + 0x8e, 0x32, 0x40, 0x39, 0xe0, 0x63, 0x02, 0x91, 0x8d, 0x2e, 0x40, 0x39, + 0xe8, 0x23, 0x00, 0xb9, 0x08, 0x00, 0x00, 0xb0, 0x8c, 0x2a, 0x40, 0x39, + 0x03, 0x61, 0x19, 0x91, 0xea, 0x33, 0x00, 0xb9, 0x8b, 0x26, 0x40, 0x39, + 0xe9, 0x2b, 0x00, 0xb9, 0x87, 0x22, 0x40, 0x39, 0xee, 0x1b, 0x00, 0xb9, + 0xe5, 0xe3, 0x40, 0x79, 0xed, 0x13, 0x00, 0xb9, 0xe4, 0x8b, 0x40, 0xb9, + 0xec, 0x0b, 0x00, 0xb9, 0xeb, 0x03, 0x00, 0xb9, 0xed, 0x00, 0x00, 0x94, + 0xf4, 0x63, 0x02, 0x91, 0x28, 0x00, 0x00, 0x14, 0xe8, 0x3f, 0x40, 0xf9, + 0x0a, 0x01, 0x15, 0x8b, 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0x48, 0x05, 0xc0, 0x39, + 0x09, 0x5d, 0x18, 0x53, 0x48, 0x01, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, + 0x09, 0x1d, 0x40, 0xb3, 0xe8, 0x43, 0x40, 0xf9, 0x28, 0x01, 0x08, 0x8a, + 0x1f, 0x29, 0x00, 0xf1, 0xe8, 0x37, 0x00, 0xf9, 0x08, 0x00, 0x00, 0xb0, + 0x08, 0x11, 0x1b, 0x91, 0x09, 0x00, 0x00, 0xb0, 0x29, 0x21, 0x1b, 0x91, + 0x34, 0x11, 0x88, 0x9a, 0x12, 0x00, 0x00, 0x14, 0xe8, 0x3f, 0x40, 0xf9, + 0x14, 0x00, 0x00, 0xb0, 0x94, 0x12, 0x1b, 0x91, 0x0a, 0x01, 0x15, 0x8b, + 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x09, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0x48, 0x05, 0xc0, 0x39, 0x09, 0x5d, 0x18, 0x53, + 0x48, 0x01, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, 0x09, 0x1d, 0x40, 0xb3, + 0xe8, 0x43, 0x40, 0xf9, 0x28, 0x01, 0x08, 0x8a, 0xe8, 0x37, 0x00, 0xf9, + 0x1f, 0x35, 0x00, 0xf1, 0xb5, 0x12, 0x8a, 0x9a, 0x69, 0x02, 0x76, 0xf2, + 0x28, 0x00, 0x80, 0xd2, 0x05, 0x05, 0x88, 0x9a, 0xe8, 0xff, 0x9f, 0xd2, + 0xea, 0x1f, 0x80, 0xd2, 0x46, 0x01, 0x88, 0x9a, 0x53, 0x05, 0x60, 0x36, + 0xe5, 0x03, 0x05, 0xcb, 0x3f, 0x03, 0x18, 0xeb, 0x28, 0x40, 0x80, 0xd2, + 0x09, 0x33, 0x99, 0x9a, 0x68, 0x02, 0x08, 0x8a, 0xe9, 0x47, 0x00, 0xf9, + 0x1f, 0x01, 0x08, 0xf1, 0x81, 0x01, 0x00, 0x54, 0xe8, 0x27, 0x40, 0xf9, + 0xe4, 0x2f, 0x40, 0xf9, 0x02, 0x01, 0x09, 0xcb, 0x9a, 0x68, 0x02, 0x9b, + 0xf3, 0x00, 0x68, 0x37, 0xd7, 0x00, 0x00, 0xb4, 0xe1, 0x2b, 0x40, 0xf9, + 0x03, 0x04, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0xaa, 0xe7, 0xfc, 0xff, 0x97, + 0xf7, 0x03, 0x00, 0xaa, 0xe8, 0x07, 0x41, 0x39, 0xe8, 0x04, 0x00, 0x34, + 0x68, 0x1f, 0x00, 0x53, 0x68, 0x01, 0x00, 0x34, 0xe4, 0x2f, 0x40, 0xf9, + 0x9a, 0x00, 0x1a, 0x8b, 0x13, 0x01, 0x68, 0x37, 0xf7, 0x00, 0x00, 0xb4, + 0xe1, 0x2b, 0x40, 0xf9, 0x63, 0x1f, 0x00, 0x53, 0x22, 0x00, 0x80, 0xd2, + 0xe0, 0x03, 0x17, 0xaa, 0xd9, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, + 0xe8, 0x47, 0x40, 0xf9, 0xe4, 0x2f, 0x40, 0xf9, 0x02, 0x01, 0x18, 0xcb, + 0x9a, 0x68, 0x02, 0x9b, 0xd3, 0x05, 0x68, 0x37, 0xb7, 0x05, 0x00, 0xb4, + 0x03, 0x06, 0x80, 0xd2, 0x27, 0x00, 0x00, 0x14, 0x18, 0x00, 0x80, 0xd2, + 0x88, 0x06, 0x00, 0x91, 0x0b, 0xf1, 0xdf, 0x38, 0x8b, 0x00, 0x00, 0x35, + 0x89, 0xfa, 0xff, 0xb4, 0x0a, 0x01, 0xc0, 0x39, 0x4a, 0xfa, 0xff, 0x34, + 0x1f, 0x03, 0x19, 0xeb, 0x43, 0x00, 0x00, 0x54, 0xf3, 0xf9, 0x5f, 0x37, + 0x0a, 0x01, 0xc0, 0x39, 0x4a, 0x5d, 0x78, 0x93, 0x6a, 0x1d, 0x40, 0xb3, + 0x5f, 0x01, 0x06, 0xea, 0x40, 0xf9, 0xff, 0x54, 0x18, 0x07, 0x00, 0x91, + 0x08, 0x01, 0x05, 0x8b, 0xf1, 0xff, 0xff, 0x17, 0xe8, 0x47, 0x40, 0xf9, + 0x6a, 0x02, 0x73, 0xf2, 0xe4, 0x2f, 0x40, 0xf9, 0x02, 0x01, 0x18, 0xcb, + 0x9a, 0x68, 0x02, 0x9b, 0xe1, 0x00, 0x00, 0x54, 0xd7, 0x00, 0x00, 0xb4, + 0xe1, 0x2b, 0x40, 0xf9, 0x03, 0x04, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0xaa, + 0xb3, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, 0x68, 0x1f, 0x00, 0x53, + 0x68, 0x01, 0x00, 0x34, 0xe4, 0x2f, 0x40, 0xf9, 0x9a, 0x00, 0x1a, 0x8b, + 0x0a, 0x01, 0x00, 0xb5, 0xf7, 0x00, 0x00, 0xb4, 0x63, 0x1f, 0x00, 0x53, + 0x22, 0x00, 0x80, 0xd2, 0xe1, 0x2b, 0x40, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0xa7, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, 0x7f, 0x1f, 0x00, 0x72, + 0xe7, 0x07, 0x9f, 0x9a, 0xff, 0x00, 0x18, 0xeb, 0x22, 0x05, 0x00, 0x54, + 0xe1, 0x13, 0x45, 0xa9, 0x6a, 0x02, 0x73, 0x92, 0xfb, 0x03, 0x41, 0x39, + 0xe0, 0x03, 0x17, 0xaa, 0x89, 0x02, 0xc0, 0x39, 0xa9, 0x00, 0x00, 0x35, + 0xbf, 0x04, 0x00, 0xf1, 0x0d, 0x04, 0x00, 0x54, 0x88, 0x06, 0xc0, 0x39, + 0xc8, 0x03, 0x00, 0x34, 0x88, 0x06, 0x00, 0x91, 0x08, 0x01, 0xc0, 0x39, + 0x29, 0x1d, 0x40, 0xd3, 0x9a, 0x00, 0x1a, 0x8b, 0x09, 0x1d, 0x78, 0xb3, + 0x23, 0x01, 0x06, 0x8a, 0x8a, 0x00, 0x00, 0xb5, 0x60, 0x00, 0x00, 0xb4, + 0x22, 0x00, 0x80, 0xd2, 0x8e, 0xfc, 0xff, 0x97, 0xb4, 0x00, 0x14, 0x8b, + 0xe7, 0x04, 0x00, 0x91, 0xfb, 0x01, 0x00, 0x34, 0x9c, 0x07, 0x00, 0x91, + 0x9f, 0x0f, 0x00, 0xf1, 0x81, 0x01, 0x00, 0x54, 0xe7, 0x04, 0x00, 0x91, + 0xff, 0x00, 0x18, 0xeb, 0x1c, 0x00, 0x80, 0xd2, 0x42, 0x01, 0x00, 0x54, + 0x9a, 0x00, 0x1a, 0x8b, 0xaa, 0xfc, 0xff, 0xb5, 0x80, 0xfc, 0xff, 0xb4, + 0x83, 0x05, 0x80, 0xd2, 0x22, 0x00, 0x80, 0xd2, 0x7e, 0xfc, 0xff, 0x97, + 0xe0, 0xff, 0xff, 0x17, 0xff, 0x00, 0x18, 0xeb, 0xc3, 0xfb, 0xff, 0x54, + 0xf7, 0x03, 0x00, 0xaa, 0x28, 0x40, 0x80, 0xd2, 0x68, 0x02, 0x08, 0x8a, + 0x1f, 0x05, 0x08, 0xf1, 0xa1, 0x01, 0x00, 0x54, 0xe9, 0x27, 0x40, 0xf9, + 0xe8, 0x47, 0x40, 0xf9, 0xe4, 0x2f, 0x40, 0xf9, 0x22, 0x01, 0x08, 0xcb, + 0x9a, 0x68, 0x02, 0x9b, 0xf3, 0x00, 0x68, 0x37, 0xd7, 0x00, 0x00, 0xb4, + 0xe1, 0x2b, 0x40, 0xf9, 0x03, 0x04, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0xaa, + 0x6b, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, 0xe8, 0x3f, 0x40, 0xf9, + 0x15, 0x01, 0x15, 0x8b, 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, + 0x09, 0x5d, 0x18, 0x53, 0xa8, 0x02, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, + 0x09, 0x1d, 0x40, 0xb3, 0xe8, 0x43, 0x40, 0xf9, 0x28, 0x01, 0x08, 0xea, + 0xe8, 0x37, 0x00, 0xf9, 0xe9, 0x03, 0x08, 0xaa, 0xc1, 0x9f, 0xff, 0x54, + 0xf8, 0x4b, 0x40, 0xf9, 0xf6, 0x53, 0x45, 0xa9, 0xb3, 0x00, 0x68, 0x36, + 0x54, 0x00, 0x00, 0xb5, 0x80, 0x00, 0x3e, 0xd4, 0x40, 0x0b, 0xd4, 0x9a, + 0x9b, 0xfc, 0xff, 0x17, 0xf7, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb0, + 0x02, 0x21, 0x04, 0x91, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x40, 0x10, 0x91, + 0x01, 0xa0, 0x80, 0xd2, 0x2e, 0xfb, 0xff, 0x97, 0xe4, 0x03, 0x14, 0xaa, + 0x03, 0x00, 0x80, 0xd2, 0x22, 0x00, 0x80, 0xd2, 0x81, 0x02, 0x16, 0x8b, + 0xe0, 0x03, 0x17, 0xaa, 0x46, 0xfc, 0xff, 0x97, 0xe8, 0x02, 0x18, 0xcb, + 0x54, 0x00, 0x00, 0xb5, 0x80, 0x00, 0x3e, 0xd4, 0x00, 0x0d, 0xd4, 0x9a, + 0x89, 0xfc, 0xff, 0x17, 0x40, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xfe, 0x0f, 0x1d, 0xf8, + 0xe4, 0x17, 0x01, 0xa9, 0xe6, 0x1f, 0x02, 0xa9, 0xff, 0x83, 0x00, 0xd1, + 0x05, 0x00, 0x80, 0xd2, 0x10, 0xe4, 0x00, 0x6f, 0xe4, 0x03, 0x00, 0x91, + 0xe8, 0xc3, 0x00, 0x91, 0x11, 0x0d, 0x08, 0x4e, 0x0a, 0x00, 0x80, 0xd2, + 0x09, 0x00, 0x80, 0xd2, 0x30, 0x1d, 0x18, 0x4e, 0x51, 0x1d, 0x18, 0x4e, + 0xf1, 0x43, 0x00, 0xad, 0x5e, 0xfc, 0xff, 0x97, 0xff, 0x83, 0x00, 0x91, + 0xfe, 0x07, 0x43, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0xfe, 0x0f, 0x1f, 0xf8, + 0xff, 0x43, 0x00, 0xd1, 0x08, 0x00, 0x00, 0xb0, 0x08, 0xb1, 0x45, 0xf9, + 0xe2, 0x03, 0x00, 0x91, 0x41, 0x50, 0x80, 0xd2, 0x80, 0x00, 0x80, 0x52, + 0x08, 0x21, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0xf0, 0xd2, + 0x1f, 0x00, 0x08, 0xeb, 0x00, 0x00, 0x80, 0xd2, 0x42, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x40, 0xf9, 0xff, 0x43, 0x00, 0x91, 0xfe, 0x07, 0x41, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x1f, 0xf8, + 0x08, 0x00, 0x00, 0xb0, 0x08, 0xb1, 0x45, 0xf9, 0x08, 0x25, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0xf0, 0xd2, 0x1f, 0x00, 0x08, 0xeb, + 0x83, 0x01, 0x00, 0x54, 0x08, 0x00, 0x00, 0xb0, 0x01, 0x41, 0x00, 0x91, + 0xe2, 0x03, 0x00, 0xaa, 0x00, 0x00, 0xb0, 0xd2, 0xb8, 0xfa, 0xff, 0x97, + 0x08, 0x00, 0x00, 0xb0, 0x02, 0xe1, 0x00, 0x91, 0x08, 0x00, 0x00, 0xb0, + 0x00, 0x41, 0x2a, 0x91, 0xa1, 0x66, 0x80, 0xd2, 0xe8, 0xfa, 0xff, 0x97, + 0xfe, 0x07, 0x41, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x5f, + 0x45, 0x46, 0x49, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x28, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x72, 0x29, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0x28, 0x28, + 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x29, 0x28, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x29, 0x20, + 0x3e, 0x3d, 0x20, 0x30, 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x55, 0x4c, 0x4c, + 0x29, 0x00, 0x00, 0x00, 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, + 0x20, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, + 0x20, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, + 0x21, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x4c, 0x69, 0x62, 0x53, 0x74, 0x64, 0x45, 0x72, 0x72, + 0x5c, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, + 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x20, 0x5b, 0x25, 0x61, 0x5d, 0x20, + 0x25, 0x61, 0x28, 0x25, 0x64, 0x29, 0x3a, 0x20, 0x25, 0x61, 0x0a, 0x00, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, + 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, + 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, 0x6f, + 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, + 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x67, 0x42, 0x53, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x67, 0x52, 0x54, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, + 0x66, 0x69, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, + 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4c, 0x69, + 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4c, 0x69, 0x62, 0x50, 0x72, 0x69, + 0x6e, 0x74, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x00, 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, 0x29, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x62, 0x5c, 0x41, 0x41, 0x72, 0x63, 0x68, 0x36, 0x34, 0x5c, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x53, 0x61, 0x66, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x69, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, + 0x21, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, + 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x5c, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, + 0x29, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x50, 0x72, + 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x5c, 0x50, 0x72, 0x69, 0x6e, 0x74, + 0x4c, 0x69, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, + 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x28, + 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, + 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x53, 0x74, 0x72, 0x6e, 0x4c, 0x65, 0x6e, + 0x53, 0x20, 0x28, 0x28, 0x43, 0x48, 0x41, 0x52, 0x31, 0x36, 0x20, 0x2a, + 0x29, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x28, 0x5f, 0x67, + 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, + 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, + 0x72, 0x6e, 0x4c, 0x65, 0x6e, 0x53, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x2c, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, + 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x3d, + 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, + 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, + 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, + 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x00, 0x00, 0x00, + 0x3c, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x67, 0x75, 0x69, 0x64, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, 0x78, 0x2d, 0x25, 0x30, 0x34, + 0x78, 0x2d, 0x25, 0x30, 0x34, 0x78, 0x2d, 0x25, 0x30, 0x32, 0x78, 0x25, + 0x30, 0x32, 0x78, 0x2d, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x25, 0x30, 0x32, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x32, 0x64, 0x2f, 0x25, 0x30, 0x32, + 0x64, 0x2f, 0x25, 0x30, 0x34, 0x64, 0x20, 0x20, 0x25, 0x30, 0x32, 0x64, + 0x3a, 0x25, 0x30, 0x32, 0x64, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, 0x58, + 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x47, 0x6c, 0x79, + 0x70, 0x68, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x54, + 0x6f, 0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x57, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x20, 0x44, + 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6f, 0x61, 0x64, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x61, 0x64, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x53, 0x69, + 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x75, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, + 0x43, 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x46, 0x75, 0x6c, + 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, + 0x6f, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x64, 0x69, + 0x61, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, + 0x6e, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x44, 0x65, 0x6e, + 0x69, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, + 0x6f, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x6d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x75, + 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x62, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x43, 0x4d, 0x50, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x54, 0x46, 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x20, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, + 0x00, 0x00, 0x43, 0x52, 0x43, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x20, 0x28, 0x32, 0x39, 0x29, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x20, 0x28, 0x33, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x45, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x46, 0x69, 0x6c, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x70, + 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x64, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x00, 0x00, 0x48, 0x54, 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x62, 0x5c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x44, 0x69, 0x76, 0x55, 0x36, 0x34, + 0x78, 0x33, 0x32, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0xed, 0x00, 0x23, 0x01, 0xf0, 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x38, 0x21, 0x00, 0x00, 0x91, 0x00, 0x23, 0x12, 0xc8, 0x21, 0x00, 0x00, + 0x69, 0x00, 0xa0, 0x10, 0x40, 0x22, 0x00, 0x00, 0xf1, 0x00, 0xa5, 0x02, + 0x30, 0x23, 0x00, 0x00, 0x10, 0x60, 0x00, 0x00, 0x88, 0x23, 0x00, 0x00, + 0x59, 0x00, 0x21, 0x01, 0xe0, 0x23, 0x00, 0x00, 0x55, 0x00, 0x22, 0x01, + 0x38, 0x24, 0x00, 0x00, 0x65, 0x00, 0xa1, 0x00, 0xf8, 0x24, 0x00, 0x00, + 0x89, 0x00, 0xa4, 0x02, 0x80, 0x25, 0x00, 0x00, 0x75, 0x00, 0xa4, 0x02, + 0xf8, 0x25, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x80, 0x26, 0x00, 0x00, + 0x81, 0x00, 0x27, 0x02, 0x00, 0x27, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, + 0x50, 0x35, 0x00, 0x00, 0x48, 0x60, 0x00, 0x00, 0x98, 0x35, 0x00, 0x00, + 0x45, 0x00, 0x20, 0x01, 0xe0, 0x35, 0x00, 0x00, 0x55, 0x00, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x80, 0x18, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x09, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x60, 0x70, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x48, 0x00, 0x49, 0x00, 0x49, 0x00, + 0x6e, 0x93, 0x87, 0x69, 0x34, 0xed, 0xdb, 0x44, 0xae, 0x97, 0x1f, 0xa5, + 0xe4, 0xed, 0x21, 0x16, 0x1d, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x04, + 0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x00, + 0x14, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, + 0x00, 0x68, 0x00, 0x00, 0x00, 0x14, 0x2e, 0x00, 0x54, 0x00, 0x48, 0x00, + 0x20, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, + 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, + 0x30, 0x00, 0x20, 0x00, 0x22, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, + 0x70, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x79, 0x00, 0x73, 0x00, 0x20, 0x00, + 0x61, 0x00, 0x20, 0x00, 0x22, 0x00, 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, + 0x49, 0x00, 0x20, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, + 0x6f, 0x00, 0x20, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, + 0x64, 0x00, 0x21, 0x00, 0x22, 0x00, 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, + 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x22, 0x00, + 0x0d, 0x00, 0x0a, 0x00, 0x2e, 0x00, 0x53, 0x00, 0x48, 0x00, 0x20, 0x00, + 0x4e, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x0d, 0x00, 0x0a, 0x00, + 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x57, 0x00, + 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, + 0x70, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, + 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x0d, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x10, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x00, 0x30, 0x82, 0x10, 0xa0, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x10, 0x91, 0x30, + 0x82, 0x10, 0x8d, 0x02, 0x01, 0x01, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, + 0x78, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, + 0x04, 0xa0, 0x6a, 0x30, 0x68, 0x30, 0x33, 0x06, 0x0a, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0f, 0x30, 0x25, 0x03, 0x01, 0x00, + 0xa0, 0x20, 0xa2, 0x1e, 0x80, 0x1c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, + 0x00, 0x4f, 0x00, 0x62, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x65, + 0x00, 0x74, 0x00, 0x65, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x30, 0x31, + 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, + 0x01, 0x05, 0x00, 0x04, 0x20, 0xf6, 0xf0, 0xe0, 0x42, 0xf3, 0x86, 0xca, + 0x95, 0x65, 0x2c, 0x9e, 0x10, 0x4e, 0xaa, 0xe1, 0x69, 0xd9, 0x52, 0x07, + 0x8e, 0x7e, 0x01, 0x4c, 0xd5, 0x3e, 0x47, 0xf9, 0xc4, 0x61, 0xb3, 0xc2, + 0x8a, 0xa0, 0x82, 0x0d, 0x92, 0x30, 0x82, 0x03, 0x71, 0x30, 0x82, 0x02, + 0x59, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x71, 0xb5, 0x0a, 0x74, + 0x69, 0x1a, 0x2e, 0xf8, 0x57, 0xff, 0xaa, 0x62, 0x03, 0x18, 0x11, 0xc2, + 0x0d, 0x63, 0x88, 0xb4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, + 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, + 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, + 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, + 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, + 0x30, 0x37, 0x5a, 0x30, 0x34, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x29, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, + 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x4c, 0x65, + 0x61, 0x66, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa1, 0x3b, 0xcf, 0x40, 0x63, 0x36, + 0x7e, 0xb4, 0x40, 0x53, 0x74, 0x5a, 0xc0, 0x02, 0xea, 0xef, 0x3e, 0xe0, + 0x4c, 0x12, 0xf3, 0x28, 0x53, 0x99, 0xa6, 0x48, 0x13, 0xee, 0xc7, 0x00, + 0xb8, 0x23, 0x74, 0xf3, 0xf4, 0x03, 0xc5, 0xed, 0xfb, 0x5a, 0x1a, 0xae, + 0x73, 0x6a, 0xfd, 0xee, 0x08, 0x37, 0x18, 0x2c, 0xe3, 0x5a, 0x98, 0x6f, + 0xb3, 0x00, 0x4e, 0x4f, 0xbe, 0x06, 0xe4, 0xe4, 0xee, 0x24, 0x53, 0xcb, + 0xe3, 0xb3, 0x88, 0x6c, 0xeb, 0xe2, 0x84, 0xd9, 0x1b, 0xd7, 0x06, 0x8d, + 0x6d, 0xbc, 0x60, 0xe2, 0xbf, 0xff, 0x50, 0xd1, 0x92, 0xcc, 0x1d, 0xbb, + 0x91, 0x1e, 0x72, 0x39, 0x48, 0x6c, 0x4f, 0x02, 0x7c, 0x86, 0x34, 0x53, + 0xfe, 0xeb, 0x31, 0x10, 0x9d, 0xa7, 0xa2, 0x12, 0x3e, 0x6b, 0x7b, 0xa3, + 0xba, 0xaa, 0x42, 0x18, 0xa3, 0x0d, 0xb9, 0x2a, 0x56, 0x0b, 0xdc, 0x0f, + 0x78, 0x41, 0xd1, 0xe4, 0x12, 0x2e, 0x26, 0x01, 0x37, 0x32, 0xbf, 0x17, + 0x2e, 0x3f, 0x70, 0xdc, 0xac, 0x26, 0x2c, 0x3f, 0x99, 0xdd, 0xf0, 0xb2, + 0x81, 0x92, 0xd8, 0x88, 0xb6, 0x1c, 0x6e, 0x5b, 0x8a, 0x3d, 0x5a, 0x66, + 0x28, 0x1a, 0x6c, 0xf3, 0x7a, 0x4a, 0x7f, 0x1f, 0x8b, 0x2b, 0x57, 0x94, + 0x92, 0xe7, 0x1f, 0x0e, 0x70, 0x07, 0x6f, 0x0e, 0x48, 0x30, 0xc5, 0x76, + 0x11, 0x27, 0x1f, 0x43, 0x17, 0x4d, 0x8a, 0x2f, 0x65, 0x2e, 0xfb, 0xb6, + 0x7c, 0x17, 0x83, 0x77, 0xb2, 0xa2, 0x7c, 0xb5, 0x54, 0x95, 0x23, 0xbe, + 0x3a, 0x40, 0x9b, 0x8a, 0xe2, 0xa3, 0x94, 0x0c, 0xb1, 0xff, 0x62, 0x4b, + 0x74, 0xfc, 0xc1, 0xc4, 0x63, 0x2e, 0x61, 0xee, 0x09, 0xc5, 0xf6, 0xe4, + 0x8f, 0x6a, 0x33, 0x41, 0x3d, 0x7f, 0x5a, 0x4f, 0xd6, 0x66, 0x33, 0x30, + 0x9a, 0x80, 0x4d, 0xf3, 0xbe, 0x72, 0x3f, 0x86, 0x52, 0x1f, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x75, 0x30, 0x73, 0x30, 0x0c, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x07, + 0x80, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x72, 0x8a, 0xd7, + 0xd4, 0xaf, 0x15, 0x1e, 0x35, 0xcf, 0x72, 0x14, 0x49, 0x8b, 0x01, 0xd0, + 0xb6, 0x4b, 0x48, 0x1d, 0x23, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, + 0xe4, 0x50, 0xed, 0x2f, 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, + 0x5c, 0x76, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x32, 0xcc, + 0x95, 0xe4, 0xe2, 0x7e, 0x2c, 0x74, 0x33, 0x45, 0x7e, 0xd3, 0xcd, 0x0b, + 0xda, 0x0e, 0xe7, 0x16, 0x8f, 0x60, 0xb1, 0x4c, 0x6f, 0x3e, 0xb9, 0xa1, + 0xe5, 0x00, 0x2c, 0x9f, 0x5b, 0x65, 0x8d, 0x4e, 0xc1, 0x74, 0x03, 0x30, + 0xf0, 0xc1, 0xbd, 0x33, 0x81, 0xf1, 0x3b, 0x0d, 0x63, 0x86, 0x7f, 0x0d, + 0x68, 0x1c, 0xaf, 0x22, 0xa4, 0xf1, 0xf2, 0xb7, 0x35, 0x2d, 0x3d, 0xa5, + 0xc4, 0x54, 0x0d, 0x16, 0xc8, 0x7f, 0xc7, 0xe2, 0x5d, 0xba, 0x1c, 0x52, + 0xcb, 0x6e, 0x81, 0xe8, 0xb9, 0x4a, 0x11, 0xb4, 0xf7, 0x70, 0x0b, 0x70, + 0xf3, 0xfe, 0x0c, 0xb1, 0x15, 0x31, 0x57, 0x63, 0x9a, 0xbc, 0xbc, 0x9a, + 0xc5, 0x40, 0xab, 0xdd, 0xc3, 0xc5, 0xc0, 0xfd, 0x47, 0x79, 0x85, 0x96, + 0x4c, 0x3d, 0xa4, 0x3e, 0x6e, 0xaf, 0x30, 0xd2, 0x20, 0x30, 0x6b, 0x32, + 0xa3, 0x8d, 0x6c, 0xb7, 0x5e, 0xa9, 0x9b, 0x31, 0x98, 0x25, 0xed, 0x1f, + 0xf6, 0x3c, 0x59, 0xc3, 0x77, 0xca, 0x83, 0x49, 0x28, 0xe6, 0x20, 0xc4, + 0x32, 0xc4, 0x15, 0x15, 0xac, 0xa7, 0x54, 0xd1, 0xa5, 0xc6, 0xe8, 0xc5, + 0x7c, 0x0f, 0x23, 0x31, 0xe3, 0x06, 0xad, 0x48, 0x9c, 0xf6, 0xb1, 0xd5, + 0x9f, 0xed, 0xee, 0xf4, 0x1c, 0xe3, 0xce, 0x3e, 0xf3, 0x27, 0x28, 0x19, + 0x20, 0xb9, 0xcb, 0x4d, 0x85, 0xdd, 0xf9, 0xc8, 0xec, 0x2e, 0x60, 0xd1, + 0xf7, 0x48, 0xba, 0x25, 0xf7, 0x4f, 0x0e, 0x47, 0x9e, 0xc8, 0xc8, 0xaa, + 0x74, 0xb5, 0x5f, 0x90, 0xc6, 0xfa, 0xb9, 0xdf, 0x95, 0x88, 0xe8, 0x00, + 0xc3, 0x90, 0xa6, 0x9f, 0x06, 0xda, 0xf5, 0x9e, 0x04, 0x55, 0xd7, 0x68, + 0xe0, 0x1f, 0x37, 0xbe, 0x4f, 0xe9, 0x7a, 0x0f, 0x3e, 0xc8, 0x60, 0x84, + 0xc3, 0x78, 0x0b, 0xd9, 0xc8, 0xd9, 0xe9, 0x66, 0xea, 0xd7, 0x5b, 0x83, + 0x63, 0x3e, 0x30, 0x82, 0x03, 0x65, 0x30, 0x82, 0x02, 0x4d, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x2c, 0xcc, 0x3e, 0x1f, 0x6c, 0x46, 0x86, + 0x7a, 0x93, 0x05, 0x4f, 0x73, 0x7b, 0xc5, 0x14, 0x61, 0x37, 0xaa, 0x40, + 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, + 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, + 0x31, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, + 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, + 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, + 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb, 0x80, 0xcb, + 0x94, 0xf5, 0x0d, 0xbf, 0xbf, 0xe4, 0xfc, 0xd2, 0x21, 0x71, 0x5f, 0x1d, + 0x25, 0x78, 0x3c, 0xd2, 0x3a, 0x62, 0x35, 0x1a, 0xa9, 0xa2, 0x13, 0x54, + 0x33, 0x73, 0x6c, 0x39, 0x18, 0x96, 0x8f, 0x0a, 0xe2, 0x01, 0x2c, 0x54, + 0x85, 0x3e, 0xeb, 0xd5, 0xc8, 0xa3, 0xdf, 0xd8, 0x3f, 0x6c, 0x96, 0x4a, + 0xc6, 0x19, 0xbc, 0xfd, 0x7a, 0x9b, 0x28, 0xd0, 0xe9, 0x07, 0x82, 0xeb, + 0xdb, 0x42, 0x6d, 0x9f, 0xb6, 0xac, 0xa3, 0xc1, 0x0a, 0xff, 0x58, 0x85, + 0x10, 0x31, 0x0e, 0xf4, 0xb2, 0xb2, 0x49, 0xb0, 0x72, 0x4a, 0x81, 0x93, + 0x60, 0x11, 0x40, 0xde, 0xc4, 0x91, 0xfb, 0xcc, 0x45, 0x21, 0xfa, 0x4c, + 0x81, 0x2a, 0xf4, 0xc5, 0x27, 0x70, 0x74, 0x50, 0x82, 0x6f, 0x5f, 0xda, + 0x94, 0xf1, 0xda, 0xbc, 0x74, 0x98, 0x56, 0xcd, 0xe5, 0x82, 0xa7, 0x17, + 0xd3, 0x45, 0x36, 0x05, 0x6a, 0x3d, 0xc5, 0x35, 0x61, 0xda, 0x44, 0xbb, + 0x87, 0x25, 0xc9, 0xcd, 0x52, 0x55, 0xd9, 0x43, 0x24, 0xa6, 0xeb, 0x13, + 0x29, 0xec, 0x9b, 0x4a, 0xb2, 0x21, 0x99, 0xd3, 0xec, 0x9f, 0xf6, 0x1a, + 0x2e, 0x4f, 0x6c, 0x51, 0x96, 0xc0, 0x6a, 0xb8, 0x10, 0x6e, 0x75, 0x2d, + 0x0f, 0x09, 0x53, 0x92, 0x28, 0xd8, 0x8f, 0xe7, 0x4a, 0x92, 0x40, 0x1b, + 0xdb, 0x93, 0x30, 0xc7, 0x6e, 0x42, 0x60, 0x6a, 0xe2, 0x2b, 0x29, 0x94, + 0x70, 0x3f, 0xb3, 0xf0, 0xf1, 0x18, 0x84, 0xb7, 0x6d, 0xb8, 0x29, 0xcb, + 0x72, 0x08, 0xcb, 0x27, 0x18, 0xe1, 0x0a, 0x9c, 0xc3, 0x0b, 0x62, 0x77, + 0xbc, 0x1f, 0xb4, 0x56, 0x48, 0xa7, 0xdb, 0xf3, 0x29, 0x33, 0xe6, 0x97, + 0xb8, 0x2f, 0x6c, 0x52, 0xa8, 0xdd, 0xf2, 0x82, 0xfa, 0xcc, 0xf1, 0xcc, + 0x0d, 0x0b, 0xaa, 0xf9, 0x34, 0x6e, 0x9a, 0x48, 0x9b, 0x44, 0x43, 0x70, + 0xe3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, + 0xe4, 0x50, 0xed, 0x2f, 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, + 0x5c, 0x76, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, 0x88, 0x60, + 0x2e, 0x36, 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, 0xa1, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x68, 0x6c, 0x45, 0xf9, 0xea, + 0x75, 0xac, 0xbf, 0xfc, 0x1b, 0xcc, 0x42, 0xa1, 0x55, 0xb7, 0x19, 0xb9, + 0x67, 0x83, 0x0c, 0x15, 0x94, 0xdb, 0x1b, 0x31, 0x33, 0xf5, 0xff, 0x6b, + 0xae, 0xb9, 0x06, 0x7e, 0xd1, 0x19, 0x2e, 0x97, 0x84, 0xd7, 0xd7, 0xc5, + 0x23, 0xac, 0x21, 0xb8, 0x70, 0xd4, 0xa7, 0x5e, 0x3c, 0xf9, 0x83, 0x68, + 0xc4, 0xc1, 0x7b, 0xb7, 0x86, 0xc1, 0x11, 0xd7, 0xd7, 0xa1, 0x63, 0x8a, + 0x04, 0x10, 0x03, 0x34, 0x5f, 0x04, 0x6c, 0x18, 0x37, 0xb1, 0x9c, 0xe9, + 0x2e, 0x24, 0xd1, 0x10, 0xb8, 0x69, 0x05, 0x96, 0x2a, 0x30, 0xd9, 0x12, + 0x9e, 0xdb, 0xfb, 0x12, 0x5e, 0x2b, 0x7b, 0xc7, 0x55, 0x32, 0xa0, 0x87, + 0x16, 0xdb, 0x2f, 0x5f, 0x12, 0x70, 0xff, 0x76, 0xe9, 0x05, 0x62, 0xfb, + 0xe1, 0x03, 0x51, 0xe7, 0x87, 0xa0, 0x50, 0x63, 0xbc, 0xe9, 0x6a, 0x4f, + 0x47, 0xd9, 0xde, 0xe8, 0x28, 0xd0, 0x69, 0xcf, 0x29, 0x35, 0x7c, 0x3c, + 0x7f, 0x29, 0x65, 0xb0, 0x2f, 0x69, 0xba, 0xa2, 0x20, 0x90, 0xf0, 0x75, + 0xd1, 0x02, 0xf6, 0xae, 0xd0, 0x5f, 0xbe, 0x5d, 0xce, 0x6d, 0xce, 0x76, + 0xc6, 0x61, 0x0f, 0x75, 0xdb, 0x3f, 0x08, 0xaf, 0x96, 0x15, 0x95, 0x57, + 0x7d, 0xa1, 0x80, 0x59, 0x4c, 0xba, 0x3b, 0x95, 0x6b, 0x78, 0xee, 0xc1, + 0xad, 0x5a, 0x68, 0xa0, 0x6e, 0x25, 0x86, 0x58, 0xa2, 0x46, 0xee, 0x62, + 0xf7, 0x88, 0x28, 0xbb, 0x60, 0x33, 0x32, 0xf4, 0xce, 0x5f, 0x86, 0x3a, + 0xd3, 0x2a, 0xe3, 0x3e, 0x2d, 0xda, 0x59, 0xc1, 0xab, 0x90, 0x8c, 0xc9, + 0xa9, 0x78, 0x8b, 0xb7, 0x4c, 0x43, 0xc2, 0x53, 0x3d, 0x92, 0x20, 0xdf, + 0xf2, 0x55, 0xb0, 0x2b, 0xc9, 0x2b, 0x36, 0xf3, 0xbe, 0xd2, 0x3f, 0x9d, + 0x8c, 0x32, 0x99, 0x38, 0xf7, 0x15, 0x20, 0xb9, 0xf3, 0x4b, 0x03, 0x30, + 0x82, 0x03, 0x5b, 0x30, 0x82, 0x02, 0x43, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x14, 0x29, 0xe7, 0xee, 0xbe, 0xd0, 0xf2, 0x0a, 0x30, 0xc2, 0xd1, + 0x41, 0xc9, 0x4d, 0x24, 0xd9, 0x8a, 0xfe, 0x42, 0x3d, 0x85, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, + 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, + 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, + 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, + 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x31, 0x20, 0x43, 0x41, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0x99, 0x93, 0xd5, + 0xe0, 0x9e, 0xc7, 0x39, 0xd2, 0x44, 0x31, 0x5f, 0x1c, 0xd3, 0x87, 0x2c, + 0xcf, 0x36, 0xc4, 0xe5, 0x0d, 0xda, 0x60, 0x66, 0x88, 0x05, 0x15, 0xf6, + 0x12, 0xe3, 0x61, 0x73, 0xec, 0xcf, 0x2e, 0xd9, 0xf6, 0x81, 0x1a, 0xe9, + 0x52, 0xa8, 0x37, 0x94, 0x5a, 0xb8, 0x30, 0xb8, 0x10, 0x2e, 0x23, 0xfe, + 0xfd, 0x9e, 0x36, 0x1f, 0x45, 0xe2, 0x8c, 0x87, 0x8e, 0xa2, 0x42, 0xb2, + 0x88, 0xcc, 0xad, 0x79, 0xc6, 0xb7, 0xa2, 0x6f, 0x74, 0x28, 0x6e, 0x76, + 0x62, 0xc4, 0x13, 0xcc, 0x05, 0xac, 0xfe, 0xd4, 0x5e, 0x6c, 0x4d, 0x19, + 0x3f, 0x41, 0xb9, 0x5f, 0x5f, 0xef, 0xeb, 0x0d, 0xf9, 0xaa, 0x65, 0x62, + 0x64, 0x8d, 0x84, 0xc6, 0xd1, 0xf5, 0x24, 0x37, 0x97, 0xf1, 0x52, 0x9b, + 0x98, 0x28, 0x6b, 0x3d, 0xda, 0x2b, 0xdd, 0x68, 0x98, 0x4a, 0x8c, 0x99, + 0xe1, 0xec, 0xf0, 0x22, 0x43, 0x8a, 0x01, 0xeb, 0xa9, 0xf9, 0x3d, 0x2f, + 0x58, 0x62, 0x36, 0x7e, 0xc8, 0x62, 0x01, 0x3f, 0x38, 0xcb, 0x09, 0x91, + 0x52, 0x2b, 0x8a, 0xde, 0x93, 0x44, 0xaa, 0x31, 0x6c, 0x0c, 0x86, 0x31, + 0x4a, 0x89, 0xed, 0x3f, 0x01, 0xc4, 0x88, 0xb2, 0x00, 0x05, 0x25, 0xeb, + 0xa2, 0xa7, 0xe7, 0x98, 0x01, 0xb6, 0x0f, 0x2f, 0x12, 0xbf, 0x32, 0xe4, + 0x95, 0x40, 0x94, 0x12, 0x82, 0xf5, 0xc4, 0x48, 0x35, 0x38, 0x8f, 0x10, + 0xfb, 0xf8, 0x55, 0x23, 0x1c, 0x88, 0x56, 0xa1, 0xa9, 0x84, 0x89, 0x5b, + 0xb9, 0x20, 0xab, 0xd8, 0x46, 0x06, 0xa3, 0x49, 0x0b, 0xfa, 0x95, 0x5a, + 0x80, 0x46, 0x19, 0xe4, 0x46, 0x5a, 0x22, 0xdc, 0x09, 0xb0, 0xa8, 0xbb, + 0xac, 0x2b, 0xb1, 0x39, 0xbd, 0xa1, 0x1e, 0x73, 0xde, 0x87, 0x8f, 0x87, + 0x16, 0xe8, 0x78, 0xcd, 0x04, 0xa8, 0x21, 0xd3, 0x5f, 0x57, 0xcb, 0x47, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, + 0x88, 0x60, 0x2e, 0x36, 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, + 0xa1, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, + 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x07, 0x3d, 0x41, 0xe5, 0x4e, 0xb5, + 0x79, 0x2e, 0xaf, 0x85, 0xa4, 0xd2, 0x86, 0xcc, 0x21, 0x61, 0xc1, 0x68, + 0x0d, 0x6e, 0xac, 0xd9, 0x13, 0x38, 0xed, 0x12, 0x25, 0x96, 0x31, 0xd7, + 0x43, 0xa3, 0xac, 0x49, 0x5d, 0x4b, 0x18, 0x94, 0x39, 0x58, 0x22, 0x10, + 0x6b, 0x49, 0x02, 0xd9, 0x3e, 0x86, 0x75, 0x21, 0xe5, 0x19, 0x95, 0x28, + 0x16, 0x81, 0xf6, 0x42, 0x43, 0x26, 0x16, 0x3c, 0xcd, 0xbd, 0xed, 0xb4, + 0x0c, 0x26, 0xdf, 0xb4, 0x72, 0x53, 0x6b, 0xbc, 0x2c, 0x25, 0x59, 0x6f, + 0xb0, 0x5b, 0x1a, 0x9b, 0x8b, 0xd5, 0xc0, 0xf1, 0x70, 0x7c, 0xae, 0xdc, + 0xfe, 0xa6, 0x3e, 0xe0, 0x2a, 0xc6, 0x87, 0x5a, 0x5f, 0x4f, 0xa2, 0x47, + 0x4e, 0x0c, 0xbf, 0x25, 0xfb, 0x51, 0xdf, 0xda, 0x1f, 0xbb, 0x28, 0xdf, + 0x52, 0x5c, 0x1e, 0xc5, 0x6d, 0x38, 0x37, 0x7f, 0x86, 0xf5, 0xc0, 0x81, + 0xc2, 0x80, 0xab, 0x70, 0xf4, 0x12, 0x83, 0x50, 0x56, 0x19, 0x2a, 0x06, + 0x8b, 0xb2, 0x7e, 0xd8, 0x3b, 0x56, 0xe3, 0xbd, 0x56, 0x1b, 0x3b, 0x60, + 0x90, 0xb6, 0x2c, 0xdb, 0x5b, 0x9a, 0xb0, 0xd8, 0x7a, 0xaa, 0xcc, 0x02, + 0x99, 0x0c, 0xb2, 0x21, 0xc3, 0x02, 0x1c, 0x23, 0xc5, 0x46, 0x93, 0x2e, + 0xc9, 0xf1, 0x3e, 0xec, 0xcd, 0x15, 0x11, 0xc3, 0x94, 0xb1, 0x6a, 0x10, + 0x6f, 0x35, 0x42, 0x91, 0x2a, 0x78, 0xcf, 0x8f, 0x16, 0x1a, 0x82, 0x8f, + 0xae, 0xa8, 0x53, 0x56, 0xb2, 0x7e, 0x3a, 0x2d, 0x52, 0x04, 0x65, 0xfa, + 0xbb, 0xb0, 0xac, 0x6c, 0xb5, 0xf6, 0xbd, 0x05, 0xd4, 0x9f, 0xc3, 0x8b, + 0xca, 0xb0, 0x4f, 0x9f, 0x15, 0x21, 0xba, 0x8a, 0x94, 0x17, 0x53, 0x13, + 0x8b, 0xb7, 0x4d, 0xe9, 0xdc, 0xc7, 0x26, 0x47, 0x02, 0xf0, 0x4b, 0x75, + 0xbe, 0x84, 0x73, 0x02, 0x1e, 0x14, 0x97, 0x99, 0x91, 0x5b, 0x30, 0x82, + 0x03, 0x51, 0x30, 0x82, 0x02, 0x39, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x14, 0x15, 0x68, 0xb3, 0x37, 0x3a, 0x6a, 0x85, 0x56, 0xc8, 0x38, 0x5a, + 0xcc, 0xcc, 0x2c, 0xda, 0xac, 0x35, 0x6a, 0x40, 0x9e, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, + 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, + 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x30, + 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x25, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, + 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbe, 0x63, 0xe7, + 0x31, 0xf6, 0xc3, 0x1d, 0x9d, 0xd3, 0x47, 0x42, 0x28, 0x5c, 0x1c, 0xf0, + 0xc6, 0x00, 0xfa, 0x70, 0x23, 0x7a, 0xe5, 0x8b, 0x32, 0xb3, 0xd7, 0x09, + 0x80, 0xde, 0xb4, 0x6b, 0x02, 0x0e, 0x20, 0x42, 0x34, 0x74, 0x94, 0x66, + 0xeb, 0x32, 0xeb, 0x95, 0xb6, 0x95, 0xe4, 0x6a, 0xb9, 0x85, 0x08, 0xee, + 0xd6, 0x8f, 0x61, 0xd6, 0x23, 0x3c, 0xb2, 0xa0, 0x38, 0xfb, 0x48, 0x26, + 0xc9, 0x4a, 0x4f, 0x68, 0x4c, 0x9a, 0x93, 0x84, 0x75, 0x72, 0x7d, 0xa5, + 0xac, 0xed, 0xab, 0x21, 0x71, 0x1c, 0x34, 0x64, 0x07, 0x2f, 0xe5, 0x1f, + 0xb4, 0xeb, 0x31, 0x6d, 0xc9, 0x9b, 0x7c, 0xe8, 0xcc, 0x49, 0xdc, 0x7d, + 0x27, 0x08, 0x9d, 0xa2, 0x91, 0xf3, 0x9d, 0xad, 0xa0, 0xaa, 0x21, 0x53, + 0x76, 0xa7, 0x81, 0x04, 0x1a, 0x74, 0x89, 0xd6, 0x45, 0x72, 0x7c, 0x37, + 0x22, 0xa4, 0xf7, 0x36, 0x5b, 0x80, 0xce, 0xe2, 0x91, 0x60, 0xee, 0x91, + 0xef, 0xc0, 0x25, 0x92, 0x05, 0xa3, 0x24, 0xa2, 0x4c, 0xa2, 0x93, 0xd0, + 0x80, 0x61, 0xc0, 0x9c, 0xdf, 0xc1, 0xeb, 0xed, 0x2e, 0x23, 0x30, 0xe8, + 0xd8, 0xea, 0xc4, 0x5b, 0x2a, 0x4c, 0x00, 0xa4, 0xdf, 0xa2, 0xa3, 0x39, + 0x32, 0x80, 0xb2, 0x1d, 0x81, 0xa9, 0x26, 0x43, 0x07, 0xc5, 0xf0, 0x8d, + 0x2c, 0x61, 0x70, 0xbf, 0xfd, 0xa1, 0x33, 0xd1, 0x47, 0x59, 0x41, 0xc7, + 0x17, 0xe6, 0xdd, 0x4b, 0x99, 0x97, 0xb6, 0xc3, 0x39, 0x80, 0xfa, 0x78, + 0x61, 0x6f, 0xc7, 0xbf, 0x6c, 0x88, 0xd9, 0xd6, 0xc2, 0x60, 0xbe, 0x83, + 0x67, 0xd3, 0x38, 0xf9, 0x73, 0xc5, 0x64, 0x4e, 0xc2, 0xbb, 0x0f, 0xb8, + 0x24, 0xf5, 0x29, 0x86, 0xb2, 0x35, 0x9a, 0x74, 0x14, 0xdf, 0xef, 0x92, + 0xcc, 0xec, 0x5e, 0x46, 0x80, 0xe8, 0xf2, 0xc3, 0x4a, 0xbd, 0xb7, 0x78, + 0xad, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa6, 0x9c, 0x4e, + 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, + 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, + 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, + 0xef, 0x16, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x9b, 0x0d, 0xd9, 0x6c, 0xf4, + 0x0b, 0x08, 0xea, 0xfd, 0x75, 0xac, 0x4a, 0xcc, 0xf6, 0xdf, 0x33, 0x62, + 0x6b, 0x0c, 0x93, 0x50, 0x73, 0x4a, 0x60, 0x67, 0xde, 0x0d, 0x24, 0x95, + 0x4c, 0x4b, 0x75, 0xb3, 0xec, 0x0e, 0xe3, 0x3a, 0xc6, 0x4c, 0xe3, 0x93, + 0xf0, 0x9c, 0xa4, 0xfe, 0x2c, 0x87, 0x9c, 0x7c, 0x4d, 0x7b, 0x18, 0x1b, + 0x93, 0x5f, 0x2e, 0xda, 0x88, 0xef, 0x11, 0x8b, 0x2a, 0xa3, 0x20, 0xbb, + 0x22, 0xc0, 0x73, 0x59, 0xd9, 0x13, 0x35, 0xac, 0x40, 0x21, 0x1e, 0xd2, + 0xab, 0x5a, 0xcd, 0x80, 0x82, 0x36, 0x64, 0x11, 0x84, 0x11, 0x4f, 0xf0, + 0x60, 0x52, 0x3f, 0x2c, 0xe4, 0xc8, 0x47, 0xd8, 0x36, 0xc5, 0x50, 0x8a, + 0x8f, 0x8f, 0x13, 0x40, 0x3b, 0xda, 0x2b, 0x05, 0x17, 0x7c, 0x44, 0x5f, + 0x05, 0xde, 0x67, 0xcc, 0x17, 0x04, 0xdb, 0xcc, 0xee, 0x6e, 0x1c, 0xaf, + 0xf4, 0x66, 0x9c, 0x7d, 0x72, 0x91, 0x9f, 0x6f, 0x42, 0x78, 0x10, 0x90, + 0xd5, 0xfa, 0xd4, 0x1b, 0xac, 0x56, 0x02, 0xf4, 0x00, 0x48, 0x6b, 0x56, + 0x05, 0x32, 0xb5, 0x0a, 0x16, 0x14, 0x56, 0x14, 0xfa, 0x49, 0x99, 0x59, + 0x62, 0xed, 0xda, 0x99, 0x48, 0x88, 0x18, 0x20, 0x77, 0xfe, 0xbf, 0x6c, + 0xcc, 0x5b, 0x53, 0xab, 0x2b, 0x93, 0x6a, 0x5d, 0xce, 0xf8, 0x5e, 0xfa, + 0x71, 0xc5, 0x79, 0x6a, 0xba, 0x49, 0x00, 0x6a, 0x0f, 0x0e, 0x40, 0xb5, + 0x79, 0xa4, 0x93, 0x14, 0xa5, 0x2c, 0x24, 0x2d, 0x76, 0xa4, 0x05, 0x60, + 0x93, 0x8d, 0x50, 0xe8, 0x2b, 0xcf, 0x51, 0xe3, 0xdc, 0x8d, 0x72, 0xa2, + 0xae, 0xf1, 0x76, 0x5e, 0xba, 0xb2, 0xa9, 0x48, 0x20, 0x53, 0xbc, 0x80, + 0xf7, 0x35, 0xae, 0x41, 0x77, 0xef, 0x6a, 0x74, 0xeb, 0xa1, 0x68, 0xc5, + 0x83, 0x13, 0x50, 0xd8, 0xfc, 0x52, 0x18, 0xa3, 0x76, 0x1d, 0x50, 0x31, + 0x82, 0x02, 0x65, 0x30, 0x82, 0x02, 0x61, 0x02, 0x01, 0x01, 0x30, 0x52, + 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, + 0x02, 0x14, 0x71, 0xb5, 0x0a, 0x74, 0x69, 0x1a, 0x2e, 0xf8, 0x57, 0xff, + 0xaa, 0x62, 0x03, 0x18, 0x11, 0xc2, 0x0d, 0x63, 0x88, 0xb4, 0x30, 0x0d, + 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, + 0x00, 0xa0, 0x81, 0xe5, 0x30, 0x19, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x09, 0x03, 0x31, 0x0c, 0x06, 0x0a, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1c, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, 0x0d, + 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, + 0x5a, 0x30, 0x2f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0xfc, 0x43, 0xcf, 0xb7, 0x66, 0x6d, + 0x47, 0x06, 0xd6, 0x9d, 0x7d, 0x2c, 0xff, 0x15, 0x5d, 0xb4, 0x38, 0x2f, + 0xa8, 0x3a, 0x66, 0x99, 0xf2, 0xe5, 0xc7, 0x20, 0x52, 0xcd, 0x8b, 0xe6, + 0x6d, 0xf9, 0x30, 0x79, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x09, 0x0f, 0x31, 0x6c, 0x30, 0x6a, 0x30, 0x0b, 0x06, 0x09, 0x60, + 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2a, 0x30, 0x0b, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x16, 0x30, 0x0b, 0x06, + 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x02, 0x30, 0x0a, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x07, 0x30, 0x0e, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x02, + 0x00, 0x80, 0x30, 0x0d, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x03, 0x02, 0x02, 0x01, 0x40, 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, + 0x02, 0x07, 0x30, 0x0d, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x03, 0x02, 0x02, 0x01, 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, + 0x6a, 0x6f, 0xdd, 0xd8, 0x3c, 0xfa, 0x84, 0xfd, 0xe1, 0xda, 0xc5, 0x7e, + 0xe7, 0xd3, 0xcd, 0x1a, 0xfa, 0x53, 0x2a, 0x1c, 0x42, 0x91, 0xc4, 0xa9, + 0xdb, 0x0a, 0xce, 0xcc, 0xea, 0x53, 0x0d, 0x81, 0x26, 0xb5, 0x9a, 0x06, + 0x49, 0xfd, 0x44, 0x44, 0x17, 0x46, 0x41, 0xea, 0xee, 0x75, 0xad, 0x72, + 0x26, 0x25, 0x02, 0xac, 0x5c, 0xc0, 0xc2, 0x69, 0xb6, 0xf9, 0x46, 0x37, + 0x6e, 0x42, 0xcc, 0xf2, 0x35, 0x26, 0xad, 0x27, 0x33, 0x79, 0x79, 0x40, + 0x63, 0xce, 0x4d, 0x97, 0x00, 0xcc, 0xa6, 0xaf, 0x0d, 0xd2, 0x72, 0x07, + 0xbf, 0x8b, 0xd9, 0x9b, 0x00, 0x37, 0xfa, 0x9a, 0x67, 0x8a, 0x9e, 0x46, + 0x30, 0xce, 0xbd, 0x52, 0xa5, 0x82, 0xfa, 0xcd, 0x36, 0xe4, 0xa4, 0x90, + 0xa4, 0xda, 0x17, 0x4f, 0x95, 0xab, 0xf7, 0x7c, 0x5e, 0xb1, 0x3b, 0xf6, + 0xa0, 0xe1, 0x90, 0x47, 0x25, 0xc3, 0xb5, 0x56, 0xae, 0xbe, 0xba, 0x63, + 0xe5, 0x07, 0x40, 0xf0, 0x8a, 0x8e, 0xf6, 0x4c, 0xfa, 0xa5, 0x32, 0xe0, + 0x6e, 0xec, 0x53, 0x21, 0xf9, 0xa5, 0xc4, 0xe1, 0x59, 0x45, 0xa6, 0xb2, + 0x83, 0x32, 0xf5, 0x86, 0xaf, 0x80, 0x78, 0x91, 0xe9, 0x20, 0xca, 0x88, + 0x84, 0x3e, 0xec, 0xa4, 0x8a, 0x5e, 0xd7, 0x09, 0xb2, 0x2c, 0x6f, 0x40, + 0x61, 0x62, 0xa9, 0xc8, 0xd7, 0xf0, 0x30, 0x0f, 0xb6, 0x99, 0xa2, 0x6a, + 0x07, 0x3d, 0x52, 0xe0, 0x13, 0x15, 0x96, 0x85, 0x89, 0xcc, 0x33, 0x4d, + 0x4f, 0x15, 0xc8, 0xad, 0x86, 0x8b, 0x26, 0x1b, 0xa2, 0xf3, 0x17, 0xf0, + 0x87, 0x3a, 0x12, 0x9e, 0xc2, 0x10, 0x93, 0xae, 0xfa, 0x6c, 0x36, 0x4c, + 0x04, 0x91, 0x19, 0x3a, 0x52, 0x3c, 0x0a, 0x49, 0xb7, 0x12, 0xf9, 0xf9, + 0x49, 0x50, 0x71, 0x2f, 0xc5, 0x58, 0x4c, 0x35, 0xae, 0x26, 0x72, 0x99, + 0x5c, 0xfd, 0x08, 0xe4, 0x00, 0x00, 0x00, 0x00, +}; +CONST UINTN mSignedImageSize = sizeof (mSignedImage); + +// +// AArch64 PE/COFF image signed by the leaf cert and signer 2 +// +CONST UINT8 mMultiSignedImage[] = { + 0x4d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x45, 0x00, 0x00, 0x64, 0xaa, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x22, 0x20, + 0x0b, 0x02, 0x0e, 0x2c, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x42, 0x18, 0x01, 0x00, 0x0a, 0x00, 0x00, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x80, 0x01, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x00, 0x32, 0x00, 0x00, 0xb8, 0x1d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x4b, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5f, 0x38, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x68, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, + 0x34, 0x16, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, + 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x00, 0x00, 0x00, 0x2c, 0x0c, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc8, + 0x2e, 0x70, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, 0x88, 0x00, 0x00, 0x00, + 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x42, 0x2e, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x2e, 0x72, 0x73, 0x72, + 0x63, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0xd4, 0xc0, 0x03, 0x5f, 0xd6, + 0x1d, 0x00, 0x80, 0xd2, 0xfe, 0x03, 0x00, 0xaa, 0x7f, 0x00, 0x00, 0x91, + 0xe0, 0x03, 0x01, 0xaa, 0xe1, 0x03, 0x02, 0xaa, 0xc0, 0x03, 0x5f, 0xd6, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, + 0x1f, 0x20, 0x03, 0xd5, 0x1f, 0x20, 0x03, 0xd5, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf3, 0x53, 0xbe, 0xa9, 0xf5, 0x7b, 0x01, 0xa9, 0xf4, 0x03, 0x01, 0xaa, + 0x08, 0x00, 0x00, 0xd0, 0x14, 0xb9, 0x05, 0xf9, 0x88, 0x32, 0x40, 0xf9, + 0x13, 0x00, 0x00, 0xd0, 0x64, 0x22, 0x2d, 0x91, 0xf5, 0x03, 0x00, 0xaa, + 0x09, 0x29, 0x40, 0xf9, 0x08, 0x00, 0x00, 0x90, 0x02, 0xc1, 0x08, 0x91, + 0x03, 0x00, 0x80, 0xd2, 0x01, 0x02, 0x80, 0xd2, 0x20, 0x40, 0x80, 0x52, + 0x20, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0x00, 0xd0, 0x15, 0xad, 0x05, 0xf9, + 0xbf, 0x02, 0x00, 0xf1, 0x15, 0x00, 0x00, 0xd0, 0xc1, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x81, 0x04, 0x91, 0x81, 0x05, 0x80, 0xd2, + 0xa0, 0x02, 0x05, 0x91, 0x59, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0xd0, + 0x14, 0xa9, 0x05, 0xf9, 0x89, 0x32, 0x40, 0xf9, 0x08, 0x00, 0x00, 0xd0, + 0x09, 0xb1, 0x05, 0xf9, 0xc9, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0x61, 0x06, 0x91, 0x01, 0x07, 0x80, 0xd2, 0xa0, 0x02, 0x05, 0x91, + 0x4e, 0x00, 0x00, 0x94, 0x89, 0x2e, 0x40, 0xf9, 0x08, 0x00, 0x00, 0xd0, + 0x09, 0xb5, 0x05, 0xf9, 0xe9, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xc1, 0x06, 0x91, 0x08, 0x00, 0x00, 0xd0, 0x00, 0x41, 0x07, 0x91, + 0x21, 0x05, 0x80, 0xd2, 0x44, 0x00, 0x00, 0x94, 0x08, 0x00, 0x00, 0xd0, + 0x00, 0xc1, 0x01, 0x91, 0x9b, 0x00, 0x00, 0x94, 0x60, 0xa6, 0x45, 0xf9, + 0x80, 0x00, 0x00, 0xb4, 0x88, 0x32, 0x40, 0xf9, 0x08, 0x39, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x00, 0x00, 0x80, 0xd2, 0xf5, 0x7b, 0x41, 0xa9, + 0xf3, 0x53, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xfe, 0x0f, 0x1c, 0xf8, 0xe2, 0x0f, 0x01, 0xa9, 0xe4, 0x17, 0x02, 0xa9, + 0xe6, 0x1f, 0x03, 0xa9, 0xff, 0x83, 0x00, 0xd1, 0xe2, 0x03, 0x00, 0x91, + 0x10, 0xe4, 0x00, 0x6f, 0xe8, 0xc3, 0x00, 0x91, 0x11, 0x0d, 0x08, 0x4e, + 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, 0x30, 0x1d, 0x18, 0x4e, + 0x51, 0x1d, 0x18, 0x4e, 0xf1, 0x43, 0x00, 0xad, 0x04, 0x00, 0x00, 0x94, + 0xff, 0x83, 0x00, 0x91, 0xfe, 0x07, 0x44, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0xbe, 0xa9, 0xf5, 0x7b, 0x01, 0xa9, 0xff, 0x83, 0x08, 0xd1, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0x01, 0x6d, 0x39, 0xf5, 0x03, 0x00, 0xaa, + 0xf4, 0x03, 0x01, 0xaa, 0xf3, 0x03, 0x02, 0xaa, 0x08, 0x03, 0x00, 0x35, + 0xf4, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x61, 0x02, 0x91, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0xc1, 0x02, 0x91, 0xa1, 0x0b, 0x80, 0xd2, + 0x15, 0x00, 0x00, 0x94, 0x15, 0x02, 0xf8, 0x36, 0x71, 0x42, 0x40, 0xad, + 0xe3, 0x03, 0x00, 0x91, 0xe2, 0x03, 0x14, 0xaa, 0x01, 0x40, 0x80, 0xd2, + 0xe0, 0x83, 0x00, 0x91, 0xf1, 0x43, 0x00, 0xad, 0xfb, 0x00, 0x00, 0x94, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0xb9, 0x45, 0xf9, 0xc8, 0x00, 0x00, 0xb4, + 0x00, 0x29, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, 0x08, 0x04, 0x40, 0xf9, + 0xe1, 0x83, 0x00, 0x91, 0x00, 0x01, 0x3f, 0xd6, 0xff, 0x83, 0x08, 0x91, + 0xf5, 0x7b, 0x41, 0xa9, 0xf3, 0x53, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfe, 0x0f, 0x1f, 0xf8, 0xff, 0x03, 0x08, 0xd1, 0x08, 0x00, 0x00, 0xd0, + 0x08, 0x01, 0x6d, 0x39, 0x68, 0x02, 0x00, 0x35, 0x08, 0x00, 0x00, 0xd0, + 0x03, 0x01, 0x00, 0x91, 0xe6, 0x03, 0x02, 0xaa, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xc1, 0x03, 0x91, 0xe5, 0x03, 0x01, 0xaa, 0xe4, 0x03, 0x00, 0xaa, + 0x01, 0x40, 0x80, 0xd2, 0xe0, 0x03, 0x00, 0x91, 0xfe, 0x00, 0x00, 0x94, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0xb9, 0x45, 0xf9, 0xc8, 0x00, 0x00, 0xb4, + 0x00, 0x29, 0x40, 0xf9, 0x80, 0x00, 0x00, 0xb4, 0x08, 0x04, 0x40, 0xf9, + 0xe1, 0x03, 0x00, 0x91, 0x00, 0x01, 0x3f, 0xd6, 0xff, 0x03, 0x08, 0x91, + 0xfe, 0x07, 0x41, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0x28, 0x00, 0x80, 0x52, + 0x09, 0x00, 0x00, 0xd0, 0x28, 0x01, 0x2d, 0x39, 0xc0, 0x03, 0x5f, 0xd6, + 0xf3, 0x53, 0xbd, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, 0xf7, 0x7b, 0x02, 0xa9, + 0xff, 0x83, 0x00, 0xd1, 0xf7, 0x03, 0x00, 0xaa, 0xf6, 0x03, 0x01, 0xaa, + 0xf5, 0x03, 0x02, 0xaa, 0x13, 0x00, 0x00, 0xd0, 0xb7, 0x00, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x61, 0x02, 0x91, 0xa1, 0x07, 0x80, 0xd2, + 0x05, 0x00, 0x00, 0x14, 0xd7, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xc1, 0x09, 0x91, 0xc1, 0x07, 0x80, 0xd2, 0x60, 0xc2, 0x08, 0x91, + 0xd0, 0xff, 0xff, 0x97, 0xd6, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0x61, 0x0a, 0x91, 0xe1, 0x07, 0x80, 0xd2, 0x60, 0xc2, 0x08, 0x91, + 0xca, 0xff, 0xff, 0x97, 0xbd, 0x04, 0x00, 0x94, 0xf4, 0x03, 0x00, 0xaa, + 0x14, 0x01, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x21, 0x04, 0x91, + 0xc1, 0x08, 0x80, 0xd2, 0x60, 0xc2, 0x08, 0x91, 0xc2, 0xff, 0xff, 0x97, + 0x00, 0x00, 0x80, 0xd2, 0x15, 0x00, 0x00, 0x14, 0xb1, 0x42, 0x40, 0xad, + 0xe3, 0x03, 0x00, 0x91, 0xe2, 0x03, 0x17, 0xaa, 0xe0, 0x03, 0x14, 0xaa, + 0xf1, 0x43, 0x00, 0xad, 0x86, 0x00, 0x00, 0x94, 0xdf, 0x02, 0x00, 0xf1, + 0xf3, 0x03, 0x00, 0xaa, 0x64, 0x1a, 0x40, 0xfa, 0x09, 0x01, 0x00, 0x54, + 0xc8, 0x06, 0x40, 0xf9, 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x03, 0x16, 0xaa, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0xf0, 0xd2, 0x1f, 0x00, 0x08, 0xeb, + 0xf3, 0x23, 0x93, 0x9a, 0xe0, 0x03, 0x14, 0xaa, 0xb3, 0x04, 0x00, 0x94, + 0xe0, 0x03, 0x13, 0xaa, 0xff, 0x83, 0x00, 0x91, 0xf7, 0x7b, 0x42, 0xa9, + 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xfe, 0x0f, 0x1c, 0xf8, 0xe1, 0x8b, 0x00, 0xa9, 0xe3, 0x93, 0x01, 0xa9, + 0xe5, 0x9b, 0x02, 0xa9, 0xe7, 0x1f, 0x00, 0xf9, 0xff, 0x83, 0x00, 0xd1, + 0xe2, 0x03, 0x00, 0x91, 0x10, 0xe4, 0x00, 0x6f, 0xe8, 0xa3, 0x00, 0x91, + 0x11, 0x0d, 0x08, 0x4e, 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, + 0x08, 0x00, 0x00, 0xd0, 0x08, 0xa9, 0x45, 0xf9, 0x30, 0x1d, 0x18, 0x4e, + 0x01, 0x21, 0x40, 0xf9, 0x51, 0x1d, 0x18, 0x4e, 0xf1, 0x43, 0x00, 0xad, + 0xb2, 0xff, 0xff, 0x97, 0xff, 0x83, 0x00, 0x91, 0xfe, 0x07, 0x44, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0xff, 0x43, 0x00, 0xd1, 0xf3, 0x7b, 0x00, 0xa9, + 0xff, 0x43, 0x00, 0xd1, 0xf3, 0x03, 0x00, 0xaa, 0xf3, 0x00, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x21, 0x04, 0x91, 0x08, 0x00, 0x00, 0xd0, + 0x00, 0x61, 0x0b, 0x91, 0x81, 0x04, 0x80, 0xd2, 0x86, 0xff, 0xff, 0x97, + 0x68, 0x02, 0x40, 0x39, 0xe8, 0x07, 0x00, 0x39, 0x68, 0x06, 0x40, 0x39, + 0xe8, 0x03, 0x00, 0x39, 0xe9, 0x03, 0x40, 0x39, 0xe8, 0x07, 0x40, 0x39, + 0x00, 0x21, 0x09, 0x2a, 0xff, 0x43, 0x00, 0x91, 0xf3, 0x7b, 0x40, 0xa9, + 0xff, 0x43, 0x00, 0x91, 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0xbe, 0xa9, + 0xfe, 0x0b, 0x00, 0xf9, 0xf4, 0x03, 0x00, 0xaa, 0xf4, 0x00, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x21, 0x04, 0x91, 0x08, 0x00, 0x00, 0xd0, + 0x00, 0x61, 0x0b, 0x91, 0x01, 0x13, 0x80, 0xd2, 0x71, 0xff, 0xff, 0x97, + 0xe0, 0x03, 0x14, 0xaa, 0xdf, 0xff, 0xff, 0x97, 0xf3, 0x03, 0x00, 0x2a, + 0x80, 0x0a, 0x00, 0x91, 0xdc, 0xff, 0xff, 0x97, 0xe8, 0x03, 0x00, 0x2a, + 0xe0, 0x03, 0x13, 0x2a, 0x00, 0x3d, 0x10, 0x33, 0xfe, 0x0b, 0x40, 0xf9, + 0xf3, 0x53, 0xc2, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0xff, 0x43, 0x00, 0xd1, 0xf3, 0x7b, 0x00, 0xa9, 0xf3, 0x03, 0x00, 0xaa, + 0xf3, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0xd0, 0x02, 0xc1, 0x0a, 0x91, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0x61, 0x0c, 0x91, 0xc1, 0x0f, 0x80, 0xd2, + 0x5b, 0xff, 0xff, 0x97, 0x00, 0x00, 0x80, 0xd2, 0x73, 0x01, 0x00, 0xb4, + 0x68, 0x02, 0x40, 0x79, 0x28, 0x01, 0x00, 0x34, 0x88, 0x01, 0x00, 0x58, + 0x1f, 0x00, 0x08, 0xeb, 0xa2, 0x00, 0x00, 0x54, 0x69, 0x2e, 0x40, 0x78, + 0x00, 0x04, 0x00, 0x91, 0x89, 0xff, 0xff, 0x35, 0x02, 0x00, 0x00, 0x14, + 0xe0, 0x00, 0x00, 0x58, 0xf3, 0x7b, 0x40, 0xa9, 0xff, 0x43, 0x00, 0x91, + 0xc0, 0x03, 0x5f, 0xd6, 0x1f, 0x20, 0x03, 0xd5, 0x40, 0x42, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe8, 0x03, 0x00, 0xaa, 0x00, 0x00, 0x80, 0xd2, 0x68, 0x01, 0x00, 0xb4, + 0x09, 0x01, 0xc0, 0x39, 0x29, 0x01, 0x00, 0x34, 0x29, 0x01, 0x00, 0x58, + 0x1f, 0x00, 0x09, 0xeb, 0xa2, 0x00, 0x00, 0x54, 0x00, 0x04, 0x00, 0x91, + 0x0a, 0x69, 0xe0, 0x38, 0x8a, 0xff, 0xff, 0x35, 0x02, 0x00, 0x00, 0x14, + 0x80, 0x00, 0x00, 0x58, 0xc0, 0x03, 0x5f, 0xd6, 0x40, 0x42, 0x0f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf3, 0x53, 0xbd, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, 0xfe, 0x13, 0x00, 0xf9, + 0xff, 0x83, 0x00, 0xd1, 0xf6, 0x03, 0x00, 0xaa, 0xf5, 0x03, 0x02, 0xaa, + 0xf4, 0x03, 0x03, 0xaa, 0x13, 0x00, 0x00, 0xd0, 0xd6, 0x00, 0x00, 0x36, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x01, 0x0e, 0x91, 0xe1, 0x08, 0x80, 0xd2, + 0x60, 0xa2, 0x0e, 0x91, 0x27, 0xff, 0xff, 0x97, 0xd5, 0x00, 0x00, 0x36, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0xa1, 0x0f, 0x91, 0x01, 0x09, 0x80, 0xd2, + 0x60, 0xa2, 0x0e, 0x91, 0x21, 0xff, 0xff, 0x97, 0x05, 0x00, 0x80, 0xd2, + 0x91, 0x42, 0x40, 0xad, 0xe4, 0x03, 0x00, 0x91, 0xe3, 0x03, 0x15, 0xaa, + 0x02, 0x28, 0x80, 0xd2, 0x21, 0x28, 0x80, 0xd2, 0xf1, 0x43, 0x00, 0xad, + 0xe0, 0x03, 0x16, 0xaa, 0x66, 0x00, 0x00, 0x94, 0xff, 0x83, 0x00, 0x91, + 0xfe, 0x13, 0x40, 0xf9, 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc3, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0xbd, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, + 0xfe, 0x13, 0x00, 0xf9, 0xff, 0x83, 0x00, 0xd1, 0xf6, 0x03, 0x00, 0xaa, + 0xf5, 0x03, 0x01, 0xaa, 0xf4, 0x03, 0x02, 0xaa, 0xf3, 0x03, 0x03, 0xaa, + 0xf6, 0x00, 0x00, 0x36, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x01, 0x0e, 0x91, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0xa1, 0x0e, 0x91, 0x41, 0x1d, 0x80, 0xd2, + 0x04, 0xff, 0xff, 0x97, 0x05, 0x00, 0x80, 0xd2, 0x71, 0x42, 0x40, 0xad, + 0xe4, 0x03, 0x00, 0x91, 0xe3, 0x03, 0x14, 0xaa, 0x02, 0x08, 0x80, 0xd2, + 0xa1, 0xfe, 0x41, 0xd3, 0xf1, 0x43, 0x00, 0xad, 0xe0, 0x03, 0x16, 0xaa, + 0x49, 0x00, 0x00, 0x94, 0xff, 0x83, 0x00, 0x91, 0xfe, 0x13, 0x40, 0xf9, + 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc3, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x1d, 0xf8, 0xe3, 0x93, 0x00, 0xa9, + 0xe5, 0x9b, 0x01, 0xa9, 0xe7, 0x17, 0x00, 0xf9, 0xff, 0x83, 0x00, 0xd1, + 0xe3, 0x03, 0x00, 0x91, 0x10, 0xe4, 0x00, 0x6f, 0xe8, 0xa3, 0x00, 0x91, + 0x11, 0x0d, 0x08, 0x4e, 0x0a, 0x00, 0x80, 0xd2, 0x09, 0x00, 0x80, 0xd2, + 0x30, 0x1d, 0x18, 0x4e, 0x51, 0x1d, 0x18, 0x4e, 0xf1, 0x43, 0x00, 0xad, + 0xd4, 0xff, 0xff, 0x97, 0xff, 0x83, 0x00, 0x91, 0xfe, 0x07, 0x43, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0x08, 0x00, 0x80, 0xd2, 0x5f, 0x00, 0x00, 0xf1, + 0x8d, 0x01, 0x00, 0x54, 0x69, 0x3c, 0x08, 0x13, 0x1f, 0x00, 0x01, 0xeb, + 0x22, 0x01, 0x00, 0x54, 0x03, 0x00, 0x00, 0x39, 0x9f, 0x04, 0x00, 0xf1, + 0x40, 0x00, 0x00, 0x54, 0x09, 0x04, 0x00, 0x39, 0x08, 0x05, 0x00, 0x91, + 0x1f, 0x01, 0x02, 0xeb, 0x00, 0x00, 0x04, 0x8b, 0xeb, 0xfe, 0xff, 0x54, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x53, 0xbc, 0xa9, + 0xf5, 0x5b, 0x01, 0xa9, 0xf7, 0x63, 0x02, 0xa9, 0xf9, 0x7b, 0x03, 0xa9, + 0xf4, 0x03, 0x00, 0xaa, 0xf5, 0x03, 0x02, 0xaa, 0x9f, 0x02, 0x00, 0x39, + 0x08, 0x00, 0x00, 0xd0, 0x17, 0x01, 0x2a, 0x91, 0xb6, 0x7e, 0x40, 0xd3, + 0xf3, 0x03, 0x01, 0xaa, 0x19, 0x00, 0x00, 0xd0, 0x18, 0x00, 0x00, 0xd0, + 0xb5, 0x00, 0x00, 0x35, 0x02, 0xc3, 0x0d, 0x91, 0xc1, 0x04, 0x80, 0xd2, + 0x20, 0x83, 0x2b, 0x91, 0xc1, 0xfe, 0xff, 0x97, 0x56, 0x00, 0x00, 0xb5, + 0x80, 0x00, 0x3e, 0xd4, 0x69, 0x0a, 0xd6, 0x9a, 0x28, 0xcd, 0x16, 0x9b, + 0xf3, 0x03, 0x09, 0xaa, 0xe8, 0x4a, 0xe8, 0x38, 0x88, 0x1e, 0x00, 0x38, + 0x93, 0xfe, 0xff, 0xb5, 0xe0, 0x03, 0x14, 0xaa, 0xf9, 0x7b, 0x43, 0xa9, + 0xf7, 0x63, 0x42, 0xa9, 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc4, 0xa8, + 0xc0, 0x03, 0x5f, 0xd6, 0xf3, 0x53, 0xba, 0xa9, 0xf5, 0x5b, 0x01, 0xa9, + 0xf7, 0x63, 0x02, 0xa9, 0xf9, 0x6b, 0x03, 0xa9, 0xfb, 0x73, 0x04, 0xa9, + 0xfe, 0x2b, 0x00, 0xf9, 0xff, 0x43, 0x03, 0xd1, 0xf3, 0x03, 0x02, 0xaa, + 0xe4, 0x33, 0x00, 0xf9, 0x78, 0x02, 0x73, 0x92, 0xff, 0x27, 0x00, 0xf9, + 0xf7, 0x03, 0x00, 0xaa, 0xf9, 0x03, 0x01, 0xaa, 0xf5, 0x03, 0x03, 0xaa, + 0x59, 0x02, 0x00, 0xb4, 0x58, 0x02, 0x00, 0xb5, 0x37, 0x02, 0x00, 0xb5, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x41, 0x0d, 0x91, 0xe1, 0x49, 0x80, 0xd2, + 0x08, 0x00, 0x00, 0xd0, 0x00, 0x41, 0x10, 0x91, 0x9c, 0xfe, 0xff, 0x97, + 0x00, 0x00, 0x80, 0xd2, 0xff, 0x43, 0x03, 0x91, 0xfe, 0x2b, 0x40, 0xf9, + 0xfb, 0x73, 0x44, 0xa9, 0xf9, 0x6b, 0x43, 0xa9, 0xf7, 0x63, 0x42, 0xa9, + 0xf5, 0x5b, 0x41, 0xa9, 0xf3, 0x53, 0xc6, 0xa8, 0xc0, 0x03, 0x5f, 0xd6, + 0xd8, 0x00, 0x00, 0xb4, 0xb5, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0xa1, 0x12, 0x91, 0xe1, 0x4a, 0x80, 0xd2, 0xef, 0xff, 0xff, 0x17, + 0x56, 0x6d, 0x00, 0x58, 0x3f, 0x03, 0x16, 0xeb, 0x13, 0x01, 0x30, 0x36, + 0xa9, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, 0x02, 0x41, 0x13, 0x91, + 0x01, 0x4c, 0x80, 0xd2, 0xe7, 0xff, 0xff, 0x17, 0x54, 0x00, 0x80, 0xd2, + 0x07, 0x00, 0x00, 0x14, 0xa9, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, + 0x02, 0x81, 0x11, 0x91, 0xc1, 0x4c, 0x80, 0xd2, 0xe0, 0xff, 0xff, 0x17, + 0x34, 0x00, 0x80, 0xd2, 0xe0, 0x03, 0x15, 0xaa, 0x33, 0x02, 0x40, 0x36, + 0x16, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x16, 0xeb, 0xe9, 0x00, 0x00, 0x54, + 0x08, 0x00, 0x00, 0xd0, 0x02, 0x81, 0x14, 0x91, 0x00, 0x00, 0x00, 0xd0, + 0x00, 0x40, 0x10, 0x91, 0x41, 0x4e, 0x80, 0xd2, 0x72, 0xfe, 0xff, 0x97, + 0xe0, 0x03, 0x15, 0xaa, 0x0c, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x16, 0xeb, + 0x68, 0xfa, 0xff, 0x54, 0x5b, 0x00, 0x80, 0xd2, 0xfc, 0xff, 0x9f, 0xd2, + 0x10, 0x00, 0x00, 0x14, 0x24, 0xff, 0xff, 0x97, 0x1f, 0x00, 0x16, 0xeb, + 0xe9, 0x00, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, 0x02, 0xc1, 0x16, 0x91, + 0x00, 0x00, 0x00, 0xd0, 0x00, 0x40, 0x10, 0x91, 0x21, 0x4f, 0x80, 0xd2, + 0x62, 0xfe, 0xff, 0x97, 0xe0, 0x03, 0x15, 0xaa, 0x1a, 0xff, 0xff, 0x97, + 0x1f, 0x00, 0x16, 0xeb, 0x68, 0xf8, 0xff, 0x54, 0x3b, 0x00, 0x80, 0xd2, + 0xfc, 0x1f, 0x80, 0xd2, 0x98, 0x00, 0x00, 0xb4, 0x3f, 0x03, 0x00, 0xf1, + 0xf7, 0x12, 0x9f, 0x9a, 0x02, 0x00, 0x00, 0x14, 0x99, 0xf7, 0xff, 0xb4, + 0x1a, 0x00, 0x80, 0xd2, 0x16, 0x00, 0x80, 0xd2, 0x18, 0x00, 0x80, 0xd2, + 0x97, 0x00, 0x00, 0xb4, 0x28, 0x07, 0x00, 0xd1, 0x16, 0x5d, 0x14, 0x9b, + 0xf8, 0x03, 0x17, 0xaa, 0x7f, 0x07, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, + 0x09, 0x5d, 0x18, 0x53, 0xa8, 0x02, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, + 0x09, 0x1d, 0x40, 0xb3, 0x28, 0x01, 0x1c, 0xea, 0xe8, 0x37, 0x00, 0xf9, + 0x60, 0x61, 0x00, 0x54, 0xf6, 0x53, 0x05, 0xa9, 0xf6, 0x27, 0x40, 0xf9, + 0xe9, 0x03, 0x08, 0xaa, 0xf8, 0x4b, 0x00, 0xf9, 0xfb, 0xf3, 0x07, 0xa9, + 0xea, 0x2b, 0x40, 0xf9, 0xff, 0x02, 0x00, 0xf1, 0xe0, 0x12, 0x4a, 0xfa, + 0x02, 0x60, 0x00, 0x54, 0xff, 0x02, 0x00, 0xf1, 0xff, 0x27, 0x00, 0xf9, + 0x29, 0x01, 0x88, 0x9a, 0xff, 0x03, 0x01, 0x39, 0x08, 0x28, 0x84, 0xd2, + 0xff, 0x07, 0x01, 0x39, 0x73, 0x02, 0x08, 0x8a, 0x39, 0x00, 0x80, 0xd2, + 0x1b, 0x00, 0x80, 0x52, 0x18, 0x00, 0x80, 0xd2, 0x1c, 0x00, 0x80, 0xd2, + 0x3f, 0x29, 0x00, 0xf1, 0x60, 0x47, 0x00, 0x54, 0x3f, 0x35, 0x00, 0xf1, + 0x80, 0x44, 0x00, 0x54, 0x3f, 0x95, 0x00, 0xf1, 0x80, 0x00, 0x00, 0x54, + 0xf4, 0xa3, 0x01, 0x91, 0x73, 0x02, 0x76, 0xb2, 0x46, 0x02, 0x00, 0x14, + 0xec, 0x33, 0x40, 0xf9, 0xee, 0xd3, 0x47, 0xa9, 0xea, 0x27, 0x40, 0xf9, + 0xe9, 0x03, 0x15, 0xaa, 0xd5, 0x01, 0x15, 0x8b, 0xeb, 0x03, 0x16, 0xaa, + 0xdf, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x08, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, 0x08, 0x5d, 0x18, 0x53, + 0xad, 0x02, 0xc0, 0x39, 0x08, 0x7d, 0x40, 0x93, 0xa8, 0x1d, 0x40, 0xb3, + 0x08, 0x01, 0x14, 0x8a, 0xe8, 0x37, 0x00, 0xf9, 0x1f, 0xc9, 0x00, 0xf1, + 0xc8, 0x09, 0x00, 0x54, 0x80, 0x08, 0x00, 0x54, 0x1f, 0xb1, 0x00, 0xf1, + 0x48, 0x07, 0x00, 0x54, 0xe0, 0x06, 0x00, 0x54, 0x08, 0x0e, 0x00, 0xb4, + 0x1f, 0x81, 0x00, 0xf1, 0x40, 0x06, 0x00, 0x54, 0x1f, 0xa9, 0x00, 0xf1, + 0xa0, 0x00, 0x00, 0x54, 0x1f, 0xad, 0x00, 0xf1, 0x81, 0x0d, 0x00, 0x54, + 0x73, 0x02, 0x7f, 0xb2, 0xe4, 0xff, 0xff, 0x17, 0xd3, 0x02, 0x58, 0x37, + 0x73, 0x02, 0x77, 0xb2, 0x36, 0x02, 0x00, 0xb5, 0x8a, 0x19, 0x40, 0xb9, + 0x49, 0x21, 0x00, 0x11, 0x89, 0x19, 0x00, 0xb9, 0x3f, 0x01, 0x00, 0x71, + 0xac, 0x00, 0x00, 0x54, 0x8a, 0x05, 0x40, 0xf9, 0x4a, 0xc1, 0x29, 0x8b, + 0x4b, 0x21, 0x00, 0xd1, 0x09, 0x00, 0x00, 0x14, 0x89, 0x01, 0x40, 0xf9, + 0xea, 0x03, 0x09, 0xcb, 0x4a, 0x09, 0x40, 0x92, 0x4b, 0x01, 0x09, 0x8b, + 0x6a, 0x21, 0x00, 0x91, 0x8a, 0x01, 0x00, 0xf9, 0x02, 0x00, 0x00, 0x14, + 0xd6, 0x22, 0x00, 0x91, 0x6a, 0x01, 0x40, 0xf9, 0xce, 0xff, 0xff, 0x17, + 0x56, 0x02, 0x00, 0xb5, 0x89, 0x19, 0x40, 0xb9, 0x28, 0x21, 0x00, 0x11, + 0x88, 0x19, 0x00, 0xb9, 0x1f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, + 0x89, 0x05, 0x40, 0xf9, 0x29, 0xc1, 0x28, 0x8b, 0x29, 0x21, 0x00, 0xd1, + 0x07, 0x00, 0x00, 0x14, 0x88, 0x01, 0x40, 0xf9, 0xe9, 0x03, 0x08, 0xcb, + 0x29, 0x09, 0x40, 0x92, 0x29, 0x01, 0x08, 0x8b, 0x28, 0x21, 0x00, 0x91, + 0x88, 0x01, 0x00, 0xf9, 0x39, 0x01, 0x40, 0xf9, 0xbc, 0xff, 0xff, 0x17, + 0x79, 0x01, 0x40, 0xf9, 0xd6, 0x22, 0x00, 0x91, 0xb9, 0xff, 0xff, 0x17, + 0x73, 0x02, 0x7e, 0xb2, 0xb7, 0xff, 0xff, 0x17, 0x73, 0x02, 0x7d, 0xb2, + 0xb5, 0xff, 0xff, 0x17, 0x1f, 0xb5, 0x00, 0xf1, 0xc0, 0x01, 0x00, 0x54, + 0x1f, 0xb9, 0x00, 0xf1, 0x40, 0x01, 0x00, 0x54, 0x1f, 0xc1, 0x00, 0xf1, + 0xa0, 0x00, 0x00, 0x54, 0x1f, 0xc5, 0x00, 0xf1, 0x61, 0x06, 0x00, 0x54, + 0x18, 0x00, 0x80, 0xd2, 0x26, 0x00, 0x00, 0x14, 0xd3, 0xff, 0x5f, 0x37, + 0x73, 0x02, 0x7b, 0xb2, 0xfc, 0xff, 0xff, 0x17, 0x73, 0x02, 0x75, 0xb2, + 0xa6, 0xff, 0xff, 0x17, 0x73, 0x02, 0x40, 0xb2, 0xa4, 0xff, 0xff, 0x17, + 0x1f, 0xdd, 0x00, 0xf1, 0xa8, 0x00, 0x00, 0x54, 0x09, 0xcd, 0x00, 0xd1, + 0x3f, 0x11, 0x00, 0xf1, 0xa8, 0x04, 0x00, 0x54, 0xf2, 0xff, 0xff, 0x17, + 0x09, 0xe1, 0x00, 0xd1, 0x3f, 0x05, 0x00, 0xf1, 0xe9, 0xfd, 0xff, 0x54, + 0x09, 0x31, 0x01, 0xd1, 0x3f, 0xf9, 0x7a, 0xf2, 0xc1, 0x03, 0x00, 0x54, + 0x73, 0x02, 0x7c, 0xb2, 0x96, 0xff, 0xff, 0x17, 0x1f, 0xe5, 0x00, 0xf1, + 0x28, 0x02, 0x00, 0x54, 0x09, 0x0b, 0x18, 0x8b, 0xd5, 0x01, 0x15, 0x8b, + 0xdf, 0x05, 0x00, 0xf1, 0x08, 0x05, 0x09, 0x8b, 0x18, 0xc1, 0x00, 0xd1, + 0x61, 0x00, 0x00, 0x54, 0x08, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, + 0xa8, 0x06, 0xc0, 0x39, 0x08, 0x5d, 0x18, 0x53, 0xa9, 0x02, 0xc0, 0x39, + 0x08, 0x7d, 0x40, 0x93, 0x28, 0x1d, 0x40, 0xb3, 0x08, 0x01, 0x14, 0x8a, + 0x1f, 0xc1, 0x00, 0xf1, 0xe2, 0xfd, 0xff, 0x54, 0xb5, 0x02, 0x0e, 0xcb, + 0x93, 0x00, 0x58, 0x37, 0x73, 0x02, 0x77, 0xb2, 0xea, 0x03, 0x18, 0xaa, + 0x7f, 0xff, 0xff, 0x17, 0xf9, 0x03, 0x18, 0xaa, 0x7d, 0xff, 0xff, 0x17, + 0xf5, 0x03, 0x09, 0xaa, 0x19, 0x00, 0x80, 0xd2, 0xea, 0x27, 0x00, 0xf9, + 0xe9, 0x03, 0x15, 0xaa, 0xea, 0x03, 0x16, 0xaa, 0x1f, 0x91, 0x01, 0xf1, + 0x48, 0x0a, 0x00, 0x54, 0x20, 0x1c, 0x00, 0x54, 0x1f, 0x29, 0x00, 0xf1, + 0x60, 0x07, 0x00, 0x54, 0x1f, 0x35, 0x00, 0xf1, 0x60, 0x04, 0x00, 0x54, + 0x1f, 0x95, 0x00, 0xf1, 0x20, 0xed, 0xff, 0x54, 0x1f, 0x4d, 0x01, 0xf1, + 0xc0, 0x0f, 0x00, 0x54, 0x1f, 0x61, 0x01, 0xf1, 0x40, 0x1a, 0x00, 0x54, + 0x1f, 0x85, 0x01, 0xf1, 0x60, 0x0f, 0x00, 0x54, 0x1f, 0x8d, 0x01, 0xf1, + 0x21, 0xec, 0xff, 0x54, 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, + 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, + 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, + 0x08, 0x01, 0x40, 0x79, 0xf4, 0x03, 0x03, 0x91, 0xe8, 0x63, 0x00, 0xf9, + 0x4a, 0xff, 0xff, 0x17, 0xe8, 0x3f, 0x40, 0xf9, 0x0b, 0x01, 0x15, 0x8b, + 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0x68, 0x05, 0xc0, 0x39, 0x0a, 0x5d, 0x18, 0x53, + 0x68, 0x01, 0xc0, 0x39, 0x4a, 0x7d, 0x40, 0x93, 0x0a, 0x1d, 0x40, 0xb3, + 0xe8, 0x43, 0x40, 0xf9, 0x48, 0x01, 0x08, 0x8a, 0x1f, 0x29, 0x00, 0xf1, + 0xe8, 0x37, 0x00, 0xf9, 0x35, 0x11, 0x8b, 0x9a, 0x09, 0x00, 0x00, 0xd0, + 0x29, 0x21, 0x1b, 0x91, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x11, 0x1b, 0x91, + 0x34, 0x11, 0x88, 0x9a, 0x7b, 0x01, 0x00, 0x14, 0xe8, 0x3f, 0x40, 0xf9, + 0x14, 0x00, 0x00, 0xd0, 0x94, 0x12, 0x1b, 0x91, 0x15, 0x01, 0x15, 0x8b, + 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x0a, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, 0x0a, 0x5d, 0x18, 0x53, + 0xa8, 0x02, 0xc0, 0x39, 0x4a, 0x7d, 0x40, 0x93, 0x0a, 0x1d, 0x40, 0xb3, + 0xe8, 0x43, 0x40, 0xf9, 0x48, 0x01, 0x08, 0x8a, 0xe8, 0x37, 0x00, 0xf9, + 0x1f, 0x35, 0x00, 0xf1, 0x20, 0x2d, 0x00, 0x54, 0xf5, 0x03, 0x09, 0xaa, + 0x67, 0x01, 0x00, 0x14, 0x1f, 0x9d, 0x01, 0xf1, 0x60, 0x20, 0x00, 0x54, + 0x1f, 0xc1, 0x01, 0xf1, 0xa0, 0x10, 0x00, 0x54, 0x1f, 0xc9, 0x01, 0xf1, + 0xa0, 0x09, 0x00, 0x54, 0x1f, 0xcd, 0x01, 0xf1, 0xc0, 0x05, 0x00, 0x54, + 0x1f, 0xd1, 0x01, 0xf1, 0xc0, 0x00, 0x00, 0x54, 0x1f, 0xd5, 0x01, 0xf1, + 0x40, 0x10, 0x00, 0x54, 0x1f, 0xe1, 0x01, 0xf1, 0xe0, 0x0f, 0x00, 0x54, + 0x10, 0xff, 0xff, 0x17, 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, + 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, + 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, + 0x09, 0x01, 0x40, 0xf9, 0x89, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x14, 0x41, 0x1a, 0x91, 0x3f, 0x01, 0x00, 0x14, 0x28, 0x15, 0x40, 0x39, + 0x02, 0x00, 0x80, 0xd2, 0x27, 0x11, 0x40, 0x39, 0xc1, 0x04, 0x80, 0xd2, + 0x26, 0x01, 0x40, 0x79, 0xe0, 0x63, 0x02, 0x91, 0x25, 0x0d, 0x40, 0x39, + 0xe8, 0x03, 0x00, 0xb9, 0x24, 0x09, 0x40, 0x39, 0x08, 0x00, 0x00, 0xd0, + 0x03, 0x81, 0x1a, 0x91, 0xf6, 0x01, 0x00, 0x94, 0x09, 0x01, 0x00, 0x14, + 0x73, 0x02, 0x76, 0xb2, 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, + 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, + 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, + 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, + 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, + 0x14, 0x01, 0x40, 0xf9, 0x94, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xd0, + 0x14, 0xe1, 0x18, 0x91, 0x73, 0xfa, 0x75, 0x92, 0xf3, 0x22, 0x58, 0x37, + 0x19, 0x00, 0x80, 0xd2, 0x15, 0x01, 0x00, 0x14, 0x56, 0x02, 0x00, 0xb5, + 0xea, 0x33, 0x40, 0xf9, 0x48, 0x19, 0x40, 0xb9, 0x09, 0x21, 0x00, 0x11, + 0x49, 0x19, 0x00, 0xb9, 0x3f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, + 0x48, 0x05, 0x40, 0xf9, 0x08, 0xc1, 0x29, 0x8b, 0x08, 0x21, 0x00, 0xd1, + 0x0a, 0x00, 0x00, 0x14, 0x49, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x09, 0xcb, + 0x08, 0x09, 0x40, 0x92, 0x08, 0x01, 0x09, 0x8b, 0x09, 0x21, 0x00, 0x91, + 0x49, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x14, 0xd6, 0x22, 0x00, 0x91, + 0xe8, 0x03, 0x0a, 0xaa, 0x04, 0x01, 0x40, 0xf9, 0x08, 0x00, 0xf0, 0xd2, + 0xf4, 0x63, 0x02, 0x91, 0x9f, 0x00, 0x08, 0xeb, 0xa3, 0x01, 0x00, 0x54, + 0x89, 0xf8, 0x40, 0x92, 0x28, 0x05, 0x00, 0xd1, 0x1f, 0x89, 0x00, 0xf1, + 0x68, 0x02, 0x00, 0x54, 0x28, 0xf1, 0x7d, 0xd3, 0x08, 0x01, 0x09, 0xcb, + 0x09, 0x05, 0x08, 0x8b, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x81, 0x1e, 0x91, + 0x28, 0x01, 0x08, 0x8b, 0x14, 0x55, 0x00, 0xd1, 0x08, 0x00, 0x00, 0x14, + 0x9f, 0x1c, 0x00, 0xf1, 0x28, 0x01, 0x00, 0x54, 0x88, 0x08, 0x04, 0x8b, + 0x09, 0x09, 0x08, 0x8b, 0x08, 0x00, 0x00, 0xd0, 0x08, 0x41, 0x1b, 0x91, + 0x34, 0x01, 0x08, 0x8b, 0xe8, 0x63, 0x02, 0x91, 0x9f, 0x02, 0x08, 0xeb, + 0xc1, 0x1c, 0x00, 0x54, 0x08, 0x00, 0x00, 0xd0, 0x03, 0xf1, 0x1a, 0x91, + 0x02, 0x00, 0x80, 0xd2, 0xc1, 0x04, 0x80, 0xd2, 0xe0, 0x63, 0x02, 0x91, + 0xa3, 0x01, 0x00, 0x94, 0xdf, 0x00, 0x00, 0x14, 0xc8, 0x04, 0x80, 0x92, + 0x68, 0x02, 0x08, 0x8a, 0x13, 0x01, 0x7c, 0xb2, 0x73, 0x02, 0x7b, 0xb2, + 0x73, 0x02, 0x79, 0xb2, 0x73, 0x00, 0x38, 0x37, 0x68, 0xfa, 0x7e, 0x92, + 0x13, 0x01, 0x72, 0xb2, 0x69, 0x02, 0x7c, 0xf2, 0xe1, 0x02, 0x00, 0x54, + 0x56, 0x02, 0x00, 0xb5, 0xeb, 0x33, 0x40, 0xf9, 0x68, 0x19, 0x40, 0xb9, + 0x0a, 0x21, 0x00, 0x11, 0x6a, 0x19, 0x00, 0xb9, 0x5f, 0x01, 0x00, 0x71, + 0xac, 0x00, 0x00, 0x54, 0x68, 0x05, 0x40, 0xf9, 0x08, 0xc1, 0x2a, 0x8b, + 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, 0x6a, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x0a, 0xcb, 0x08, 0x05, 0x40, 0x92, 0x08, 0x01, 0x0a, 0x8b, + 0x0a, 0x21, 0x00, 0x91, 0x6a, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x14, + 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, 0x14, 0x01, 0x80, 0xb9, + 0x16, 0x00, 0x00, 0x14, 0x76, 0x02, 0x00, 0xb5, 0xeb, 0x33, 0x40, 0xf9, + 0x68, 0x19, 0x40, 0xb9, 0x0a, 0x21, 0x00, 0x11, 0x6a, 0x19, 0x00, 0xb9, + 0x5f, 0x01, 0x00, 0x71, 0xac, 0x00, 0x00, 0x54, 0x68, 0x05, 0x40, 0xf9, + 0x08, 0xc1, 0x2a, 0x8b, 0x08, 0x21, 0x00, 0xd1, 0x07, 0x00, 0x00, 0x14, + 0x6a, 0x01, 0x40, 0xf9, 0xe8, 0x03, 0x0a, 0xcb, 0x08, 0x09, 0x40, 0x92, + 0x08, 0x01, 0x0a, 0x8b, 0x0a, 0x21, 0x00, 0x91, 0x6a, 0x01, 0x00, 0xf9, + 0x14, 0x01, 0x40, 0xf9, 0x03, 0x00, 0x00, 0x14, 0x54, 0x01, 0x40, 0xf9, + 0xd6, 0x22, 0x00, 0x91, 0x68, 0xf2, 0x7d, 0xd3, 0x0a, 0x01, 0x1b, 0x12, + 0x68, 0x05, 0x80, 0x52, 0x7f, 0x02, 0x7f, 0xf2, 0x1b, 0x11, 0x8a, 0x1a, + 0x6a, 0x02, 0x7d, 0xf2, 0xe8, 0x07, 0x9f, 0x1a, 0x33, 0x02, 0x38, 0x37, + 0x42, 0x01, 0x80, 0xd2, 0x6a, 0x00, 0x00, 0xb4, 0x73, 0xfa, 0x7a, 0x92, + 0x39, 0x00, 0x80, 0xd2, 0x69, 0x02, 0x72, 0x92, 0xd4, 0x00, 0xf8, 0xb6, + 0xa9, 0x00, 0x00, 0xb5, 0x73, 0x02, 0x7f, 0xb2, 0xbb, 0x05, 0x80, 0x52, + 0xf4, 0x03, 0x14, 0xcb, 0x04, 0x00, 0x00, 0x14, 0x69, 0x00, 0x00, 0xb4, + 0x53, 0x00, 0x20, 0x37, 0x94, 0x7e, 0x40, 0xd3, 0xe8, 0x03, 0x01, 0x39, + 0x06, 0x00, 0x00, 0x14, 0x02, 0x02, 0x80, 0xd2, 0xff, 0x03, 0x01, 0x39, + 0x69, 0x00, 0x00, 0xb5, 0x54, 0x00, 0xf8, 0xb6, 0x94, 0x7e, 0x40, 0xd3, + 0xe1, 0x03, 0x14, 0xaa, 0xe0, 0x63, 0x02, 0x91, 0x99, 0xfd, 0xff, 0x97, + 0xe8, 0x63, 0x02, 0x91, 0x08, 0x00, 0x08, 0xcb, 0xd4, 0x00, 0x00, 0xb5, + 0xb9, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x80, 0xd2, 0xf4, 0x63, 0x02, 0x91, + 0x1c, 0x00, 0x80, 0xd2, 0x0a, 0x00, 0x00, 0x14, 0x49, 0x28, 0x00, 0x58, + 0x09, 0x7d, 0xc9, 0x9b, 0xf4, 0x03, 0x00, 0xaa, 0x29, 0xfd, 0x41, 0xd3, + 0x29, 0x05, 0x09, 0x8b, 0x1c, 0x01, 0x09, 0xcb, 0x7c, 0x00, 0x00, 0xb4, + 0x29, 0x01, 0x08, 0xcb, 0x3c, 0x0d, 0x00, 0x91, 0xe9, 0x03, 0x41, 0x39, + 0xc9, 0x00, 0x00, 0x34, 0xa8, 0x00, 0x00, 0xb4, 0x0a, 0x05, 0x00, 0xd1, + 0xa9, 0x26, 0x00, 0x58, 0x49, 0x7d, 0xc9, 0x9b, 0x08, 0x05, 0x49, 0x8b, + 0x69, 0x1f, 0x00, 0x53, 0x49, 0x00, 0x00, 0x34, 0x39, 0x07, 0x00, 0x91, + 0x7f, 0x1f, 0x00, 0x72, 0x18, 0x05, 0x88, 0x9a, 0x28, 0x00, 0x80, 0x52, + 0xe8, 0x07, 0x01, 0x39, 0x73, 0x02, 0x74, 0xb2, 0x33, 0x0d, 0x28, 0x36, + 0x13, 0x0d, 0x00, 0x37, 0xf3, 0x0c, 0x48, 0x36, 0xe8, 0x27, 0x40, 0xf9, + 0x7f, 0x02, 0x75, 0xf2, 0x19, 0x01, 0x99, 0x9a, 0x63, 0x00, 0x00, 0x14, + 0x56, 0x02, 0x00, 0xb5, 0xea, 0x33, 0x40, 0xf9, 0x48, 0x19, 0x40, 0xb9, + 0x09, 0x21, 0x00, 0x11, 0x49, 0x19, 0x00, 0xb9, 0x3f, 0x01, 0x00, 0x71, + 0xac, 0x00, 0x00, 0x54, 0x48, 0x05, 0x40, 0xf9, 0x08, 0xc1, 0x29, 0x8b, + 0x08, 0x21, 0x00, 0xd1, 0x0a, 0x00, 0x00, 0x14, 0x49, 0x01, 0x40, 0xf9, + 0xe8, 0x03, 0x09, 0xcb, 0x08, 0x09, 0x40, 0x92, 0x08, 0x01, 0x09, 0x8b, + 0x09, 0x21, 0x00, 0x91, 0x49, 0x01, 0x00, 0xf9, 0x03, 0x00, 0x00, 0x14, + 0xd6, 0x22, 0x00, 0x91, 0xe8, 0x03, 0x0a, 0xaa, 0x14, 0x01, 0x40, 0xf9, + 0x94, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb0, 0x14, 0x21, 0x19, 0x91, + 0x4a, 0x00, 0x00, 0x14, 0xe0, 0x03, 0x14, 0xaa, 0xaf, 0xfc, 0xff, 0x97, + 0xe0, 0x8b, 0x00, 0xb9, 0x80, 0x12, 0x00, 0x91, 0x96, 0xfc, 0xff, 0x97, + 0xe0, 0xe3, 0x00, 0x79, 0x80, 0x1a, 0x00, 0x91, 0x93, 0xfc, 0xff, 0x97, + 0x88, 0x36, 0x40, 0x39, 0x02, 0x00, 0x80, 0xd2, 0x8a, 0x3e, 0x40, 0x39, + 0x06, 0x3c, 0x00, 0x53, 0x89, 0x3a, 0x40, 0x39, 0xc1, 0x04, 0x80, 0xd2, + 0x8e, 0x32, 0x40, 0x39, 0xe0, 0x63, 0x02, 0x91, 0x8d, 0x2e, 0x40, 0x39, + 0xe8, 0x23, 0x00, 0xb9, 0x08, 0x00, 0x00, 0xb0, 0x8c, 0x2a, 0x40, 0x39, + 0x03, 0x61, 0x19, 0x91, 0xea, 0x33, 0x00, 0xb9, 0x8b, 0x26, 0x40, 0x39, + 0xe9, 0x2b, 0x00, 0xb9, 0x87, 0x22, 0x40, 0x39, 0xee, 0x1b, 0x00, 0xb9, + 0xe5, 0xe3, 0x40, 0x79, 0xed, 0x13, 0x00, 0xb9, 0xe4, 0x8b, 0x40, 0xb9, + 0xec, 0x0b, 0x00, 0xb9, 0xeb, 0x03, 0x00, 0xb9, 0xed, 0x00, 0x00, 0x94, + 0xf4, 0x63, 0x02, 0x91, 0x28, 0x00, 0x00, 0x14, 0xe8, 0x3f, 0x40, 0xf9, + 0x0a, 0x01, 0x15, 0x8b, 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0x48, 0x05, 0xc0, 0x39, + 0x09, 0x5d, 0x18, 0x53, 0x48, 0x01, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, + 0x09, 0x1d, 0x40, 0xb3, 0xe8, 0x43, 0x40, 0xf9, 0x28, 0x01, 0x08, 0x8a, + 0x1f, 0x29, 0x00, 0xf1, 0xe8, 0x37, 0x00, 0xf9, 0x08, 0x00, 0x00, 0xb0, + 0x08, 0x11, 0x1b, 0x91, 0x09, 0x00, 0x00, 0xb0, 0x29, 0x21, 0x1b, 0x91, + 0x34, 0x11, 0x88, 0x9a, 0x12, 0x00, 0x00, 0x14, 0xe8, 0x3f, 0x40, 0xf9, + 0x14, 0x00, 0x00, 0xb0, 0x94, 0x12, 0x1b, 0x91, 0x0a, 0x01, 0x15, 0x8b, + 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, 0x09, 0x00, 0x80, 0x52, + 0x03, 0x00, 0x00, 0x14, 0x48, 0x05, 0xc0, 0x39, 0x09, 0x5d, 0x18, 0x53, + 0x48, 0x01, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, 0x09, 0x1d, 0x40, 0xb3, + 0xe8, 0x43, 0x40, 0xf9, 0x28, 0x01, 0x08, 0x8a, 0xe8, 0x37, 0x00, 0xf9, + 0x1f, 0x35, 0x00, 0xf1, 0xb5, 0x12, 0x8a, 0x9a, 0x69, 0x02, 0x76, 0xf2, + 0x28, 0x00, 0x80, 0xd2, 0x05, 0x05, 0x88, 0x9a, 0xe8, 0xff, 0x9f, 0xd2, + 0xea, 0x1f, 0x80, 0xd2, 0x46, 0x01, 0x88, 0x9a, 0x53, 0x05, 0x60, 0x36, + 0xe5, 0x03, 0x05, 0xcb, 0x3f, 0x03, 0x18, 0xeb, 0x28, 0x40, 0x80, 0xd2, + 0x09, 0x33, 0x99, 0x9a, 0x68, 0x02, 0x08, 0x8a, 0xe9, 0x47, 0x00, 0xf9, + 0x1f, 0x01, 0x08, 0xf1, 0x81, 0x01, 0x00, 0x54, 0xe8, 0x27, 0x40, 0xf9, + 0xe4, 0x2f, 0x40, 0xf9, 0x02, 0x01, 0x09, 0xcb, 0x9a, 0x68, 0x02, 0x9b, + 0xf3, 0x00, 0x68, 0x37, 0xd7, 0x00, 0x00, 0xb4, 0xe1, 0x2b, 0x40, 0xf9, + 0x03, 0x04, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0xaa, 0xe7, 0xfc, 0xff, 0x97, + 0xf7, 0x03, 0x00, 0xaa, 0xe8, 0x07, 0x41, 0x39, 0xe8, 0x04, 0x00, 0x34, + 0x68, 0x1f, 0x00, 0x53, 0x68, 0x01, 0x00, 0x34, 0xe4, 0x2f, 0x40, 0xf9, + 0x9a, 0x00, 0x1a, 0x8b, 0x13, 0x01, 0x68, 0x37, 0xf7, 0x00, 0x00, 0xb4, + 0xe1, 0x2b, 0x40, 0xf9, 0x63, 0x1f, 0x00, 0x53, 0x22, 0x00, 0x80, 0xd2, + 0xe0, 0x03, 0x17, 0xaa, 0xd9, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, + 0xe8, 0x47, 0x40, 0xf9, 0xe4, 0x2f, 0x40, 0xf9, 0x02, 0x01, 0x18, 0xcb, + 0x9a, 0x68, 0x02, 0x9b, 0xd3, 0x05, 0x68, 0x37, 0xb7, 0x05, 0x00, 0xb4, + 0x03, 0x06, 0x80, 0xd2, 0x27, 0x00, 0x00, 0x14, 0x18, 0x00, 0x80, 0xd2, + 0x88, 0x06, 0x00, 0x91, 0x0b, 0xf1, 0xdf, 0x38, 0x8b, 0x00, 0x00, 0x35, + 0x89, 0xfa, 0xff, 0xb4, 0x0a, 0x01, 0xc0, 0x39, 0x4a, 0xfa, 0xff, 0x34, + 0x1f, 0x03, 0x19, 0xeb, 0x43, 0x00, 0x00, 0x54, 0xf3, 0xf9, 0x5f, 0x37, + 0x0a, 0x01, 0xc0, 0x39, 0x4a, 0x5d, 0x78, 0x93, 0x6a, 0x1d, 0x40, 0xb3, + 0x5f, 0x01, 0x06, 0xea, 0x40, 0xf9, 0xff, 0x54, 0x18, 0x07, 0x00, 0x91, + 0x08, 0x01, 0x05, 0x8b, 0xf1, 0xff, 0xff, 0x17, 0xe8, 0x47, 0x40, 0xf9, + 0x6a, 0x02, 0x73, 0xf2, 0xe4, 0x2f, 0x40, 0xf9, 0x02, 0x01, 0x18, 0xcb, + 0x9a, 0x68, 0x02, 0x9b, 0xe1, 0x00, 0x00, 0x54, 0xd7, 0x00, 0x00, 0xb4, + 0xe1, 0x2b, 0x40, 0xf9, 0x03, 0x04, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0xaa, + 0xb3, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, 0x68, 0x1f, 0x00, 0x53, + 0x68, 0x01, 0x00, 0x34, 0xe4, 0x2f, 0x40, 0xf9, 0x9a, 0x00, 0x1a, 0x8b, + 0x0a, 0x01, 0x00, 0xb5, 0xf7, 0x00, 0x00, 0xb4, 0x63, 0x1f, 0x00, 0x53, + 0x22, 0x00, 0x80, 0xd2, 0xe1, 0x2b, 0x40, 0xf9, 0xe0, 0x03, 0x17, 0xaa, + 0xa7, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, 0x7f, 0x1f, 0x00, 0x72, + 0xe7, 0x07, 0x9f, 0x9a, 0xff, 0x00, 0x18, 0xeb, 0x22, 0x05, 0x00, 0x54, + 0xe1, 0x13, 0x45, 0xa9, 0x6a, 0x02, 0x73, 0x92, 0xfb, 0x03, 0x41, 0x39, + 0xe0, 0x03, 0x17, 0xaa, 0x89, 0x02, 0xc0, 0x39, 0xa9, 0x00, 0x00, 0x35, + 0xbf, 0x04, 0x00, 0xf1, 0x0d, 0x04, 0x00, 0x54, 0x88, 0x06, 0xc0, 0x39, + 0xc8, 0x03, 0x00, 0x34, 0x88, 0x06, 0x00, 0x91, 0x08, 0x01, 0xc0, 0x39, + 0x29, 0x1d, 0x40, 0xd3, 0x9a, 0x00, 0x1a, 0x8b, 0x09, 0x1d, 0x78, 0xb3, + 0x23, 0x01, 0x06, 0x8a, 0x8a, 0x00, 0x00, 0xb5, 0x60, 0x00, 0x00, 0xb4, + 0x22, 0x00, 0x80, 0xd2, 0x8e, 0xfc, 0xff, 0x97, 0xb4, 0x00, 0x14, 0x8b, + 0xe7, 0x04, 0x00, 0x91, 0xfb, 0x01, 0x00, 0x34, 0x9c, 0x07, 0x00, 0x91, + 0x9f, 0x0f, 0x00, 0xf1, 0x81, 0x01, 0x00, 0x54, 0xe7, 0x04, 0x00, 0x91, + 0xff, 0x00, 0x18, 0xeb, 0x1c, 0x00, 0x80, 0xd2, 0x42, 0x01, 0x00, 0x54, + 0x9a, 0x00, 0x1a, 0x8b, 0xaa, 0xfc, 0xff, 0xb5, 0x80, 0xfc, 0xff, 0xb4, + 0x83, 0x05, 0x80, 0xd2, 0x22, 0x00, 0x80, 0xd2, 0x7e, 0xfc, 0xff, 0x97, + 0xe0, 0xff, 0xff, 0x17, 0xff, 0x00, 0x18, 0xeb, 0xc3, 0xfb, 0xff, 0x54, + 0xf7, 0x03, 0x00, 0xaa, 0x28, 0x40, 0x80, 0xd2, 0x68, 0x02, 0x08, 0x8a, + 0x1f, 0x05, 0x08, 0xf1, 0xa1, 0x01, 0x00, 0x54, 0xe9, 0x27, 0x40, 0xf9, + 0xe8, 0x47, 0x40, 0xf9, 0xe4, 0x2f, 0x40, 0xf9, 0x22, 0x01, 0x08, 0xcb, + 0x9a, 0x68, 0x02, 0x9b, 0xf3, 0x00, 0x68, 0x37, 0xd7, 0x00, 0x00, 0xb4, + 0xe1, 0x2b, 0x40, 0xf9, 0x03, 0x04, 0x80, 0xd2, 0xe0, 0x03, 0x17, 0xaa, + 0x6b, 0xfc, 0xff, 0x97, 0xf7, 0x03, 0x00, 0xaa, 0xe8, 0x3f, 0x40, 0xf9, + 0x15, 0x01, 0x15, 0x8b, 0x1f, 0x05, 0x00, 0xf1, 0x61, 0x00, 0x00, 0x54, + 0x09, 0x00, 0x80, 0x52, 0x03, 0x00, 0x00, 0x14, 0xa8, 0x06, 0xc0, 0x39, + 0x09, 0x5d, 0x18, 0x53, 0xa8, 0x02, 0xc0, 0x39, 0x29, 0x7d, 0x40, 0x93, + 0x09, 0x1d, 0x40, 0xb3, 0xe8, 0x43, 0x40, 0xf9, 0x28, 0x01, 0x08, 0xea, + 0xe8, 0x37, 0x00, 0xf9, 0xe9, 0x03, 0x08, 0xaa, 0xc1, 0x9f, 0xff, 0x54, + 0xf8, 0x4b, 0x40, 0xf9, 0xf6, 0x53, 0x45, 0xa9, 0xb3, 0x00, 0x68, 0x36, + 0x54, 0x00, 0x00, 0xb5, 0x80, 0x00, 0x3e, 0xd4, 0x40, 0x0b, 0xd4, 0x9a, + 0x9b, 0xfc, 0xff, 0x17, 0xf7, 0x00, 0x00, 0xb5, 0x08, 0x00, 0x00, 0xb0, + 0x02, 0x21, 0x04, 0x91, 0x00, 0x00, 0x00, 0xb0, 0x00, 0x40, 0x10, 0x91, + 0x01, 0xa0, 0x80, 0xd2, 0x2e, 0xfb, 0xff, 0x97, 0xe4, 0x03, 0x14, 0xaa, + 0x03, 0x00, 0x80, 0xd2, 0x22, 0x00, 0x80, 0xd2, 0x81, 0x02, 0x16, 0x8b, + 0xe0, 0x03, 0x17, 0xaa, 0x46, 0xfc, 0xff, 0x97, 0xe8, 0x02, 0x18, 0xcb, + 0x54, 0x00, 0x00, 0xb5, 0x80, 0x00, 0x3e, 0xd4, 0x00, 0x0d, 0xd4, 0x9a, + 0x89, 0xfc, 0xff, 0x17, 0x40, 0x42, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xfe, 0x0f, 0x1d, 0xf8, + 0xe4, 0x17, 0x01, 0xa9, 0xe6, 0x1f, 0x02, 0xa9, 0xff, 0x83, 0x00, 0xd1, + 0x05, 0x00, 0x80, 0xd2, 0x10, 0xe4, 0x00, 0x6f, 0xe4, 0x03, 0x00, 0x91, + 0xe8, 0xc3, 0x00, 0x91, 0x11, 0x0d, 0x08, 0x4e, 0x0a, 0x00, 0x80, 0xd2, + 0x09, 0x00, 0x80, 0xd2, 0x30, 0x1d, 0x18, 0x4e, 0x51, 0x1d, 0x18, 0x4e, + 0xf1, 0x43, 0x00, 0xad, 0x5e, 0xfc, 0xff, 0x97, 0xff, 0x83, 0x00, 0x91, + 0xfe, 0x07, 0x43, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0xfe, 0x0f, 0x1f, 0xf8, + 0xff, 0x43, 0x00, 0xd1, 0x08, 0x00, 0x00, 0xb0, 0x08, 0xb1, 0x45, 0xf9, + 0xe2, 0x03, 0x00, 0x91, 0x41, 0x50, 0x80, 0xd2, 0x80, 0x00, 0x80, 0x52, + 0x08, 0x21, 0x40, 0xf9, 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0xf0, 0xd2, + 0x1f, 0x00, 0x08, 0xeb, 0x00, 0x00, 0x80, 0xd2, 0x42, 0x00, 0x00, 0x54, + 0xe0, 0x03, 0x40, 0xf9, 0xff, 0x43, 0x00, 0x91, 0xfe, 0x07, 0x41, 0xf8, + 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x0f, 0x1f, 0xf8, + 0x08, 0x00, 0x00, 0xb0, 0x08, 0xb1, 0x45, 0xf9, 0x08, 0x25, 0x40, 0xf9, + 0x00, 0x01, 0x3f, 0xd6, 0x08, 0x00, 0xf0, 0xd2, 0x1f, 0x00, 0x08, 0xeb, + 0x83, 0x01, 0x00, 0x54, 0x08, 0x00, 0x00, 0xb0, 0x01, 0x41, 0x00, 0x91, + 0xe2, 0x03, 0x00, 0xaa, 0x00, 0x00, 0xb0, 0xd2, 0xb8, 0xfa, 0xff, 0x97, + 0x08, 0x00, 0x00, 0xb0, 0x02, 0xe1, 0x00, 0x91, 0x08, 0x00, 0x00, 0xb0, + 0x00, 0x41, 0x2a, 0x91, 0xa1, 0x66, 0x80, 0xd2, 0xe8, 0xfa, 0xff, 0x97, + 0xfe, 0x07, 0x41, 0xf8, 0xc0, 0x03, 0x5f, 0xd6, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0a, 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x5f, + 0x45, 0x46, 0x49, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x28, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x20, 0x3d, 0x20, 0x25, 0x72, 0x29, 0x0a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0x28, 0x28, + 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x29, 0x28, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x29, 0x20, + 0x3e, 0x3d, 0x20, 0x30, 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x55, 0x4c, 0x4c, + 0x29, 0x00, 0x00, 0x00, 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, + 0x20, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, + 0x20, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, + 0x21, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x4c, 0x69, 0x62, 0x53, 0x74, 0x64, 0x45, 0x72, 0x72, + 0x5c, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, + 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x20, 0x5b, 0x25, 0x61, 0x5d, 0x20, + 0x25, 0x61, 0x28, 0x25, 0x64, 0x29, 0x3a, 0x20, 0x25, 0x61, 0x0a, 0x00, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, + 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, + 0x67, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, + 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, 0x6f, + 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, + 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, + 0x6f, 0x6f, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x67, 0x42, 0x53, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x67, 0x52, 0x54, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, + 0x66, 0x69, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, + 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4c, 0x69, + 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4c, 0x69, 0x62, 0x50, 0x72, 0x69, + 0x6e, 0x74, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x00, 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, 0x29, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, + 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x62, 0x5c, 0x41, 0x41, 0x72, 0x63, 0x68, 0x36, 0x34, 0x5c, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x53, 0x61, 0x66, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x69, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, + 0x21, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, + 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x5c, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, + 0x29, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x50, 0x72, + 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x5c, 0x50, 0x72, 0x69, 0x6e, 0x74, + 0x4c, 0x69, 0x62, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, + 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, + 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x28, + 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, + 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x53, 0x74, 0x72, 0x6e, 0x4c, 0x65, 0x6e, + 0x53, 0x20, 0x28, 0x28, 0x43, 0x48, 0x41, 0x52, 0x31, 0x36, 0x20, 0x2a, + 0x29, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x28, 0x5f, 0x67, + 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, + 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, + 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, + 0x72, 0x6e, 0x4c, 0x65, 0x6e, 0x53, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x2c, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, + 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x3d, + 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, + 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, + 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, + 0x6c, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x00, 0x00, 0x00, + 0x3c, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x67, 0x75, 0x69, 0x64, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, 0x78, 0x2d, 0x25, 0x30, 0x34, + 0x78, 0x2d, 0x25, 0x30, 0x34, 0x78, 0x2d, 0x25, 0x30, 0x32, 0x78, 0x25, + 0x30, 0x32, 0x78, 0x2d, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x25, 0x30, 0x32, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3c, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3e, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x25, 0x30, 0x32, 0x64, 0x2f, 0x25, 0x30, 0x32, + 0x64, 0x2f, 0x25, 0x30, 0x34, 0x64, 0x20, 0x20, 0x25, 0x30, 0x32, 0x64, + 0x3a, 0x25, 0x30, 0x32, 0x64, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, 0x58, + 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x47, 0x6c, 0x79, + 0x70, 0x68, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, + 0x69, 0x6e, 0x67, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x54, + 0x6f, 0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x57, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x20, 0x44, + 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x53, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x52, 0x65, 0x73, 0x65, 0x74, + 0x20, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6f, 0x61, 0x64, + 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x20, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x00, 0x00, + 0x00, 0x00, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, + 0x61, 0x64, 0x20, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x53, 0x69, + 0x7a, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x52, 0x65, 0x61, + 0x64, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4f, 0x75, 0x74, 0x20, + 0x6f, 0x66, 0x20, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, + 0x43, 0x6f, 0x72, 0x72, 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x46, 0x75, 0x6c, + 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, + 0x6f, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x64, 0x69, + 0x61, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, + 0x6e, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x44, 0x65, 0x6e, + 0x69, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, + 0x6f, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x6d, + 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x75, + 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, + 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, + 0x6c, 0x72, 0x65, 0x61, 0x64, 0x79, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x62, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x43, 0x4d, 0x50, 0x20, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x54, 0x46, 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x63, 0x6f, + 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x6c, 0x65, 0x20, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x20, 0x56, 0x69, 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, + 0x00, 0x00, 0x43, 0x52, 0x43, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, + 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x64, 0x20, 0x28, 0x32, 0x39, 0x29, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x20, 0x28, 0x33, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x45, 0x6e, 0x64, 0x20, 0x6f, 0x66, 0x20, 0x46, 0x69, 0x6c, + 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, + 0x61, 0x67, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x70, + 0x72, 0x6f, 0x6d, 0x69, 0x73, 0x65, 0x64, 0x20, 0x44, 0x61, 0x74, 0x61, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x20, 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, + 0x00, 0x00, 0x48, 0x54, 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x62, 0x5c, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x44, 0x69, 0x76, 0x55, 0x36, 0x34, + 0x78, 0x33, 0x32, 0x52, 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, 0x65, 0x72, + 0x2e, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, + 0xed, 0x00, 0x23, 0x01, 0xf0, 0x20, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x38, 0x21, 0x00, 0x00, 0x91, 0x00, 0x23, 0x12, 0xc8, 0x21, 0x00, 0x00, + 0x69, 0x00, 0xa0, 0x10, 0x40, 0x22, 0x00, 0x00, 0xf1, 0x00, 0xa5, 0x02, + 0x30, 0x23, 0x00, 0x00, 0x10, 0x60, 0x00, 0x00, 0x88, 0x23, 0x00, 0x00, + 0x59, 0x00, 0x21, 0x01, 0xe0, 0x23, 0x00, 0x00, 0x55, 0x00, 0x22, 0x01, + 0x38, 0x24, 0x00, 0x00, 0x65, 0x00, 0xa1, 0x00, 0xf8, 0x24, 0x00, 0x00, + 0x89, 0x00, 0xa4, 0x02, 0x80, 0x25, 0x00, 0x00, 0x75, 0x00, 0xa4, 0x02, + 0xf8, 0x25, 0x00, 0x00, 0x20, 0x60, 0x00, 0x00, 0x80, 0x26, 0x00, 0x00, + 0x81, 0x00, 0x27, 0x02, 0x00, 0x27, 0x00, 0x00, 0x30, 0x60, 0x00, 0x00, + 0x50, 0x35, 0x00, 0x00, 0x48, 0x60, 0x00, 0x00, 0x98, 0x35, 0x00, 0x00, + 0x45, 0x00, 0x20, 0x01, 0xe0, 0x35, 0x00, 0x00, 0x55, 0x00, 0xa0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x58, 0x00, 0x00, 0x80, 0x18, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x00, 0x09, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, + 0x60, 0x70, 0x00, 0x00, 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x48, 0x00, 0x49, 0x00, 0x49, 0x00, + 0x6e, 0x93, 0x87, 0x69, 0x34, 0xed, 0xdb, 0x44, 0xae, 0x97, 0x1f, 0xa5, + 0xe4, 0xed, 0x21, 0x16, 0x1d, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x04, + 0x34, 0x00, 0x00, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x00, + 0x14, 0x45, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, + 0x00, 0x68, 0x00, 0x00, 0x00, 0x14, 0x2e, 0x00, 0x54, 0x00, 0x48, 0x00, + 0x20, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, + 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, + 0x30, 0x00, 0x20, 0x00, 0x22, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, + 0x70, 0x00, 0x6c, 0x00, 0x61, 0x00, 0x79, 0x00, 0x73, 0x00, 0x20, 0x00, + 0x61, 0x00, 0x20, 0x00, 0x22, 0x00, 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, + 0x49, 0x00, 0x20, 0x00, 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, + 0x6f, 0x00, 0x20, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, + 0x64, 0x00, 0x21, 0x00, 0x22, 0x00, 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, + 0x72, 0x00, 0x69, 0x00, 0x6e, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x22, 0x00, + 0x0d, 0x00, 0x0a, 0x00, 0x2e, 0x00, 0x53, 0x00, 0x48, 0x00, 0x20, 0x00, + 0x4e, 0x00, 0x41, 0x00, 0x4d, 0x00, 0x45, 0x00, 0x0d, 0x00, 0x0a, 0x00, + 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x57, 0x00, + 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, + 0x70, 0x00, 0x70, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, + 0x74, 0x00, 0x69, 0x00, 0x6f, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x0d, 0x00, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xac, 0x10, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x00, 0x30, 0x82, 0x10, 0xa0, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x10, 0x91, 0x30, + 0x82, 0x10, 0x8d, 0x02, 0x01, 0x01, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, + 0x78, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, + 0x04, 0xa0, 0x6a, 0x30, 0x68, 0x30, 0x33, 0x06, 0x0a, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0f, 0x30, 0x25, 0x03, 0x01, 0x00, + 0xa0, 0x20, 0xa2, 0x1e, 0x80, 0x1c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, + 0x00, 0x4f, 0x00, 0x62, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x65, + 0x00, 0x74, 0x00, 0x65, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x30, 0x31, + 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, + 0x01, 0x05, 0x00, 0x04, 0x20, 0xf6, 0xf0, 0xe0, 0x42, 0xf3, 0x86, 0xca, + 0x95, 0x65, 0x2c, 0x9e, 0x10, 0x4e, 0xaa, 0xe1, 0x69, 0xd9, 0x52, 0x07, + 0x8e, 0x7e, 0x01, 0x4c, 0xd5, 0x3e, 0x47, 0xf9, 0xc4, 0x61, 0xb3, 0xc2, + 0x8a, 0xa0, 0x82, 0x0d, 0x92, 0x30, 0x82, 0x03, 0x71, 0x30, 0x82, 0x02, + 0x59, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x71, 0xb5, 0x0a, 0x74, + 0x69, 0x1a, 0x2e, 0xf8, 0x57, 0xff, 0xaa, 0x62, 0x03, 0x18, 0x11, 0xc2, + 0x0d, 0x63, 0x88, 0xb4, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, + 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, + 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, + 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, + 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, + 0x30, 0x37, 0x5a, 0x30, 0x34, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x29, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, + 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x4c, 0x65, + 0x61, 0x66, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa1, 0x3b, 0xcf, 0x40, 0x63, 0x36, + 0x7e, 0xb4, 0x40, 0x53, 0x74, 0x5a, 0xc0, 0x02, 0xea, 0xef, 0x3e, 0xe0, + 0x4c, 0x12, 0xf3, 0x28, 0x53, 0x99, 0xa6, 0x48, 0x13, 0xee, 0xc7, 0x00, + 0xb8, 0x23, 0x74, 0xf3, 0xf4, 0x03, 0xc5, 0xed, 0xfb, 0x5a, 0x1a, 0xae, + 0x73, 0x6a, 0xfd, 0xee, 0x08, 0x37, 0x18, 0x2c, 0xe3, 0x5a, 0x98, 0x6f, + 0xb3, 0x00, 0x4e, 0x4f, 0xbe, 0x06, 0xe4, 0xe4, 0xee, 0x24, 0x53, 0xcb, + 0xe3, 0xb3, 0x88, 0x6c, 0xeb, 0xe2, 0x84, 0xd9, 0x1b, 0xd7, 0x06, 0x8d, + 0x6d, 0xbc, 0x60, 0xe2, 0xbf, 0xff, 0x50, 0xd1, 0x92, 0xcc, 0x1d, 0xbb, + 0x91, 0x1e, 0x72, 0x39, 0x48, 0x6c, 0x4f, 0x02, 0x7c, 0x86, 0x34, 0x53, + 0xfe, 0xeb, 0x31, 0x10, 0x9d, 0xa7, 0xa2, 0x12, 0x3e, 0x6b, 0x7b, 0xa3, + 0xba, 0xaa, 0x42, 0x18, 0xa3, 0x0d, 0xb9, 0x2a, 0x56, 0x0b, 0xdc, 0x0f, + 0x78, 0x41, 0xd1, 0xe4, 0x12, 0x2e, 0x26, 0x01, 0x37, 0x32, 0xbf, 0x17, + 0x2e, 0x3f, 0x70, 0xdc, 0xac, 0x26, 0x2c, 0x3f, 0x99, 0xdd, 0xf0, 0xb2, + 0x81, 0x92, 0xd8, 0x88, 0xb6, 0x1c, 0x6e, 0x5b, 0x8a, 0x3d, 0x5a, 0x66, + 0x28, 0x1a, 0x6c, 0xf3, 0x7a, 0x4a, 0x7f, 0x1f, 0x8b, 0x2b, 0x57, 0x94, + 0x92, 0xe7, 0x1f, 0x0e, 0x70, 0x07, 0x6f, 0x0e, 0x48, 0x30, 0xc5, 0x76, + 0x11, 0x27, 0x1f, 0x43, 0x17, 0x4d, 0x8a, 0x2f, 0x65, 0x2e, 0xfb, 0xb6, + 0x7c, 0x17, 0x83, 0x77, 0xb2, 0xa2, 0x7c, 0xb5, 0x54, 0x95, 0x23, 0xbe, + 0x3a, 0x40, 0x9b, 0x8a, 0xe2, 0xa3, 0x94, 0x0c, 0xb1, 0xff, 0x62, 0x4b, + 0x74, 0xfc, 0xc1, 0xc4, 0x63, 0x2e, 0x61, 0xee, 0x09, 0xc5, 0xf6, 0xe4, + 0x8f, 0x6a, 0x33, 0x41, 0x3d, 0x7f, 0x5a, 0x4f, 0xd6, 0x66, 0x33, 0x30, + 0x9a, 0x80, 0x4d, 0xf3, 0xbe, 0x72, 0x3f, 0x86, 0x52, 0x1f, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x75, 0x30, 0x73, 0x30, 0x0c, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x07, + 0x80, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, + 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x72, 0x8a, 0xd7, + 0xd4, 0xaf, 0x15, 0x1e, 0x35, 0xcf, 0x72, 0x14, 0x49, 0x8b, 0x01, 0xd0, + 0xb6, 0x4b, 0x48, 0x1d, 0x23, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, + 0xe4, 0x50, 0xed, 0x2f, 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, + 0x5c, 0x76, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x32, 0xcc, + 0x95, 0xe4, 0xe2, 0x7e, 0x2c, 0x74, 0x33, 0x45, 0x7e, 0xd3, 0xcd, 0x0b, + 0xda, 0x0e, 0xe7, 0x16, 0x8f, 0x60, 0xb1, 0x4c, 0x6f, 0x3e, 0xb9, 0xa1, + 0xe5, 0x00, 0x2c, 0x9f, 0x5b, 0x65, 0x8d, 0x4e, 0xc1, 0x74, 0x03, 0x30, + 0xf0, 0xc1, 0xbd, 0x33, 0x81, 0xf1, 0x3b, 0x0d, 0x63, 0x86, 0x7f, 0x0d, + 0x68, 0x1c, 0xaf, 0x22, 0xa4, 0xf1, 0xf2, 0xb7, 0x35, 0x2d, 0x3d, 0xa5, + 0xc4, 0x54, 0x0d, 0x16, 0xc8, 0x7f, 0xc7, 0xe2, 0x5d, 0xba, 0x1c, 0x52, + 0xcb, 0x6e, 0x81, 0xe8, 0xb9, 0x4a, 0x11, 0xb4, 0xf7, 0x70, 0x0b, 0x70, + 0xf3, 0xfe, 0x0c, 0xb1, 0x15, 0x31, 0x57, 0x63, 0x9a, 0xbc, 0xbc, 0x9a, + 0xc5, 0x40, 0xab, 0xdd, 0xc3, 0xc5, 0xc0, 0xfd, 0x47, 0x79, 0x85, 0x96, + 0x4c, 0x3d, 0xa4, 0x3e, 0x6e, 0xaf, 0x30, 0xd2, 0x20, 0x30, 0x6b, 0x32, + 0xa3, 0x8d, 0x6c, 0xb7, 0x5e, 0xa9, 0x9b, 0x31, 0x98, 0x25, 0xed, 0x1f, + 0xf6, 0x3c, 0x59, 0xc3, 0x77, 0xca, 0x83, 0x49, 0x28, 0xe6, 0x20, 0xc4, + 0x32, 0xc4, 0x15, 0x15, 0xac, 0xa7, 0x54, 0xd1, 0xa5, 0xc6, 0xe8, 0xc5, + 0x7c, 0x0f, 0x23, 0x31, 0xe3, 0x06, 0xad, 0x48, 0x9c, 0xf6, 0xb1, 0xd5, + 0x9f, 0xed, 0xee, 0xf4, 0x1c, 0xe3, 0xce, 0x3e, 0xf3, 0x27, 0x28, 0x19, + 0x20, 0xb9, 0xcb, 0x4d, 0x85, 0xdd, 0xf9, 0xc8, 0xec, 0x2e, 0x60, 0xd1, + 0xf7, 0x48, 0xba, 0x25, 0xf7, 0x4f, 0x0e, 0x47, 0x9e, 0xc8, 0xc8, 0xaa, + 0x74, 0xb5, 0x5f, 0x90, 0xc6, 0xfa, 0xb9, 0xdf, 0x95, 0x88, 0xe8, 0x00, + 0xc3, 0x90, 0xa6, 0x9f, 0x06, 0xda, 0xf5, 0x9e, 0x04, 0x55, 0xd7, 0x68, + 0xe0, 0x1f, 0x37, 0xbe, 0x4f, 0xe9, 0x7a, 0x0f, 0x3e, 0xc8, 0x60, 0x84, + 0xc3, 0x78, 0x0b, 0xd9, 0xc8, 0xd9, 0xe9, 0x66, 0xea, 0xd7, 0x5b, 0x83, + 0x63, 0x3e, 0x30, 0x82, 0x03, 0x65, 0x30, 0x82, 0x02, 0x4d, 0xa0, 0x03, + 0x02, 0x01, 0x02, 0x02, 0x14, 0x2c, 0xcc, 0x3e, 0x1f, 0x6c, 0x46, 0x86, + 0x7a, 0x93, 0x05, 0x4f, 0x73, 0x7b, 0xc5, 0x14, 0x61, 0x37, 0xaa, 0x40, + 0x10, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x0b, 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, + 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, + 0x31, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, + 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, + 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, + 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb, 0x80, 0xcb, + 0x94, 0xf5, 0x0d, 0xbf, 0xbf, 0xe4, 0xfc, 0xd2, 0x21, 0x71, 0x5f, 0x1d, + 0x25, 0x78, 0x3c, 0xd2, 0x3a, 0x62, 0x35, 0x1a, 0xa9, 0xa2, 0x13, 0x54, + 0x33, 0x73, 0x6c, 0x39, 0x18, 0x96, 0x8f, 0x0a, 0xe2, 0x01, 0x2c, 0x54, + 0x85, 0x3e, 0xeb, 0xd5, 0xc8, 0xa3, 0xdf, 0xd8, 0x3f, 0x6c, 0x96, 0x4a, + 0xc6, 0x19, 0xbc, 0xfd, 0x7a, 0x9b, 0x28, 0xd0, 0xe9, 0x07, 0x82, 0xeb, + 0xdb, 0x42, 0x6d, 0x9f, 0xb6, 0xac, 0xa3, 0xc1, 0x0a, 0xff, 0x58, 0x85, + 0x10, 0x31, 0x0e, 0xf4, 0xb2, 0xb2, 0x49, 0xb0, 0x72, 0x4a, 0x81, 0x93, + 0x60, 0x11, 0x40, 0xde, 0xc4, 0x91, 0xfb, 0xcc, 0x45, 0x21, 0xfa, 0x4c, + 0x81, 0x2a, 0xf4, 0xc5, 0x27, 0x70, 0x74, 0x50, 0x82, 0x6f, 0x5f, 0xda, + 0x94, 0xf1, 0xda, 0xbc, 0x74, 0x98, 0x56, 0xcd, 0xe5, 0x82, 0xa7, 0x17, + 0xd3, 0x45, 0x36, 0x05, 0x6a, 0x3d, 0xc5, 0x35, 0x61, 0xda, 0x44, 0xbb, + 0x87, 0x25, 0xc9, 0xcd, 0x52, 0x55, 0xd9, 0x43, 0x24, 0xa6, 0xeb, 0x13, + 0x29, 0xec, 0x9b, 0x4a, 0xb2, 0x21, 0x99, 0xd3, 0xec, 0x9f, 0xf6, 0x1a, + 0x2e, 0x4f, 0x6c, 0x51, 0x96, 0xc0, 0x6a, 0xb8, 0x10, 0x6e, 0x75, 0x2d, + 0x0f, 0x09, 0x53, 0x92, 0x28, 0xd8, 0x8f, 0xe7, 0x4a, 0x92, 0x40, 0x1b, + 0xdb, 0x93, 0x30, 0xc7, 0x6e, 0x42, 0x60, 0x6a, 0xe2, 0x2b, 0x29, 0x94, + 0x70, 0x3f, 0xb3, 0xf0, 0xf1, 0x18, 0x84, 0xb7, 0x6d, 0xb8, 0x29, 0xcb, + 0x72, 0x08, 0xcb, 0x27, 0x18, 0xe1, 0x0a, 0x9c, 0xc3, 0x0b, 0x62, 0x77, + 0xbc, 0x1f, 0xb4, 0x56, 0x48, 0xa7, 0xdb, 0xf3, 0x29, 0x33, 0xe6, 0x97, + 0xb8, 0x2f, 0x6c, 0x52, 0xa8, 0xdd, 0xf2, 0x82, 0xfa, 0xcc, 0xf1, 0xcc, + 0x0d, 0x0b, 0xaa, 0xf9, 0x34, 0x6e, 0x9a, 0x48, 0x9b, 0x44, 0x43, 0x70, + 0xe3, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, + 0xe4, 0x50, 0xed, 0x2f, 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, + 0x5c, 0x76, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, 0x88, 0x60, + 0x2e, 0x36, 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, 0xa1, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x68, 0x6c, 0x45, 0xf9, 0xea, + 0x75, 0xac, 0xbf, 0xfc, 0x1b, 0xcc, 0x42, 0xa1, 0x55, 0xb7, 0x19, 0xb9, + 0x67, 0x83, 0x0c, 0x15, 0x94, 0xdb, 0x1b, 0x31, 0x33, 0xf5, 0xff, 0x6b, + 0xae, 0xb9, 0x06, 0x7e, 0xd1, 0x19, 0x2e, 0x97, 0x84, 0xd7, 0xd7, 0xc5, + 0x23, 0xac, 0x21, 0xb8, 0x70, 0xd4, 0xa7, 0x5e, 0x3c, 0xf9, 0x83, 0x68, + 0xc4, 0xc1, 0x7b, 0xb7, 0x86, 0xc1, 0x11, 0xd7, 0xd7, 0xa1, 0x63, 0x8a, + 0x04, 0x10, 0x03, 0x34, 0x5f, 0x04, 0x6c, 0x18, 0x37, 0xb1, 0x9c, 0xe9, + 0x2e, 0x24, 0xd1, 0x10, 0xb8, 0x69, 0x05, 0x96, 0x2a, 0x30, 0xd9, 0x12, + 0x9e, 0xdb, 0xfb, 0x12, 0x5e, 0x2b, 0x7b, 0xc7, 0x55, 0x32, 0xa0, 0x87, + 0x16, 0xdb, 0x2f, 0x5f, 0x12, 0x70, 0xff, 0x76, 0xe9, 0x05, 0x62, 0xfb, + 0xe1, 0x03, 0x51, 0xe7, 0x87, 0xa0, 0x50, 0x63, 0xbc, 0xe9, 0x6a, 0x4f, + 0x47, 0xd9, 0xde, 0xe8, 0x28, 0xd0, 0x69, 0xcf, 0x29, 0x35, 0x7c, 0x3c, + 0x7f, 0x29, 0x65, 0xb0, 0x2f, 0x69, 0xba, 0xa2, 0x20, 0x90, 0xf0, 0x75, + 0xd1, 0x02, 0xf6, 0xae, 0xd0, 0x5f, 0xbe, 0x5d, 0xce, 0x6d, 0xce, 0x76, + 0xc6, 0x61, 0x0f, 0x75, 0xdb, 0x3f, 0x08, 0xaf, 0x96, 0x15, 0x95, 0x57, + 0x7d, 0xa1, 0x80, 0x59, 0x4c, 0xba, 0x3b, 0x95, 0x6b, 0x78, 0xee, 0xc1, + 0xad, 0x5a, 0x68, 0xa0, 0x6e, 0x25, 0x86, 0x58, 0xa2, 0x46, 0xee, 0x62, + 0xf7, 0x88, 0x28, 0xbb, 0x60, 0x33, 0x32, 0xf4, 0xce, 0x5f, 0x86, 0x3a, + 0xd3, 0x2a, 0xe3, 0x3e, 0x2d, 0xda, 0x59, 0xc1, 0xab, 0x90, 0x8c, 0xc9, + 0xa9, 0x78, 0x8b, 0xb7, 0x4c, 0x43, 0xc2, 0x53, 0x3d, 0x92, 0x20, 0xdf, + 0xf2, 0x55, 0xb0, 0x2b, 0xc9, 0x2b, 0x36, 0xf3, 0xbe, 0xd2, 0x3f, 0x9d, + 0x8c, 0x32, 0x99, 0x38, 0xf7, 0x15, 0x20, 0xb9, 0xf3, 0x4b, 0x03, 0x30, + 0x82, 0x03, 0x5b, 0x30, 0x82, 0x02, 0x43, 0xa0, 0x03, 0x02, 0x01, 0x02, + 0x02, 0x14, 0x29, 0xe7, 0xee, 0xbe, 0xd0, 0xf2, 0x0a, 0x30, 0xc2, 0xd1, + 0x41, 0xc9, 0x4d, 0x24, 0xd9, 0x8a, 0xfe, 0x42, 0x3d, 0x85, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, + 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, + 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, + 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, + 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, + 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, + 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x31, 0x20, 0x43, 0x41, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0x99, 0x93, 0xd5, + 0xe0, 0x9e, 0xc7, 0x39, 0xd2, 0x44, 0x31, 0x5f, 0x1c, 0xd3, 0x87, 0x2c, + 0xcf, 0x36, 0xc4, 0xe5, 0x0d, 0xda, 0x60, 0x66, 0x88, 0x05, 0x15, 0xf6, + 0x12, 0xe3, 0x61, 0x73, 0xec, 0xcf, 0x2e, 0xd9, 0xf6, 0x81, 0x1a, 0xe9, + 0x52, 0xa8, 0x37, 0x94, 0x5a, 0xb8, 0x30, 0xb8, 0x10, 0x2e, 0x23, 0xfe, + 0xfd, 0x9e, 0x36, 0x1f, 0x45, 0xe2, 0x8c, 0x87, 0x8e, 0xa2, 0x42, 0xb2, + 0x88, 0xcc, 0xad, 0x79, 0xc6, 0xb7, 0xa2, 0x6f, 0x74, 0x28, 0x6e, 0x76, + 0x62, 0xc4, 0x13, 0xcc, 0x05, 0xac, 0xfe, 0xd4, 0x5e, 0x6c, 0x4d, 0x19, + 0x3f, 0x41, 0xb9, 0x5f, 0x5f, 0xef, 0xeb, 0x0d, 0xf9, 0xaa, 0x65, 0x62, + 0x64, 0x8d, 0x84, 0xc6, 0xd1, 0xf5, 0x24, 0x37, 0x97, 0xf1, 0x52, 0x9b, + 0x98, 0x28, 0x6b, 0x3d, 0xda, 0x2b, 0xdd, 0x68, 0x98, 0x4a, 0x8c, 0x99, + 0xe1, 0xec, 0xf0, 0x22, 0x43, 0x8a, 0x01, 0xeb, 0xa9, 0xf9, 0x3d, 0x2f, + 0x58, 0x62, 0x36, 0x7e, 0xc8, 0x62, 0x01, 0x3f, 0x38, 0xcb, 0x09, 0x91, + 0x52, 0x2b, 0x8a, 0xde, 0x93, 0x44, 0xaa, 0x31, 0x6c, 0x0c, 0x86, 0x31, + 0x4a, 0x89, 0xed, 0x3f, 0x01, 0xc4, 0x88, 0xb2, 0x00, 0x05, 0x25, 0xeb, + 0xa2, 0xa7, 0xe7, 0x98, 0x01, 0xb6, 0x0f, 0x2f, 0x12, 0xbf, 0x32, 0xe4, + 0x95, 0x40, 0x94, 0x12, 0x82, 0xf5, 0xc4, 0x48, 0x35, 0x38, 0x8f, 0x10, + 0xfb, 0xf8, 0x55, 0x23, 0x1c, 0x88, 0x56, 0xa1, 0xa9, 0x84, 0x89, 0x5b, + 0xb9, 0x20, 0xab, 0xd8, 0x46, 0x06, 0xa3, 0x49, 0x0b, 0xfa, 0x95, 0x5a, + 0x80, 0x46, 0x19, 0xe4, 0x46, 0x5a, 0x22, 0xdc, 0x09, 0xb0, 0xa8, 0xbb, + 0xac, 0x2b, 0xb1, 0x39, 0xbd, 0xa1, 0x1e, 0x73, 0xde, 0x87, 0x8f, 0x87, + 0x16, 0xe8, 0x78, 0xcd, 0x04, 0xa8, 0x21, 0xd3, 0x5f, 0x57, 0xcb, 0x47, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, + 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, + 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, + 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, + 0x88, 0x60, 0x2e, 0x36, 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, + 0xa1, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, + 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x07, 0x3d, 0x41, 0xe5, 0x4e, 0xb5, + 0x79, 0x2e, 0xaf, 0x85, 0xa4, 0xd2, 0x86, 0xcc, 0x21, 0x61, 0xc1, 0x68, + 0x0d, 0x6e, 0xac, 0xd9, 0x13, 0x38, 0xed, 0x12, 0x25, 0x96, 0x31, 0xd7, + 0x43, 0xa3, 0xac, 0x49, 0x5d, 0x4b, 0x18, 0x94, 0x39, 0x58, 0x22, 0x10, + 0x6b, 0x49, 0x02, 0xd9, 0x3e, 0x86, 0x75, 0x21, 0xe5, 0x19, 0x95, 0x28, + 0x16, 0x81, 0xf6, 0x42, 0x43, 0x26, 0x16, 0x3c, 0xcd, 0xbd, 0xed, 0xb4, + 0x0c, 0x26, 0xdf, 0xb4, 0x72, 0x53, 0x6b, 0xbc, 0x2c, 0x25, 0x59, 0x6f, + 0xb0, 0x5b, 0x1a, 0x9b, 0x8b, 0xd5, 0xc0, 0xf1, 0x70, 0x7c, 0xae, 0xdc, + 0xfe, 0xa6, 0x3e, 0xe0, 0x2a, 0xc6, 0x87, 0x5a, 0x5f, 0x4f, 0xa2, 0x47, + 0x4e, 0x0c, 0xbf, 0x25, 0xfb, 0x51, 0xdf, 0xda, 0x1f, 0xbb, 0x28, 0xdf, + 0x52, 0x5c, 0x1e, 0xc5, 0x6d, 0x38, 0x37, 0x7f, 0x86, 0xf5, 0xc0, 0x81, + 0xc2, 0x80, 0xab, 0x70, 0xf4, 0x12, 0x83, 0x50, 0x56, 0x19, 0x2a, 0x06, + 0x8b, 0xb2, 0x7e, 0xd8, 0x3b, 0x56, 0xe3, 0xbd, 0x56, 0x1b, 0x3b, 0x60, + 0x90, 0xb6, 0x2c, 0xdb, 0x5b, 0x9a, 0xb0, 0xd8, 0x7a, 0xaa, 0xcc, 0x02, + 0x99, 0x0c, 0xb2, 0x21, 0xc3, 0x02, 0x1c, 0x23, 0xc5, 0x46, 0x93, 0x2e, + 0xc9, 0xf1, 0x3e, 0xec, 0xcd, 0x15, 0x11, 0xc3, 0x94, 0xb1, 0x6a, 0x10, + 0x6f, 0x35, 0x42, 0x91, 0x2a, 0x78, 0xcf, 0x8f, 0x16, 0x1a, 0x82, 0x8f, + 0xae, 0xa8, 0x53, 0x56, 0xb2, 0x7e, 0x3a, 0x2d, 0x52, 0x04, 0x65, 0xfa, + 0xbb, 0xb0, 0xac, 0x6c, 0xb5, 0xf6, 0xbd, 0x05, 0xd4, 0x9f, 0xc3, 0x8b, + 0xca, 0xb0, 0x4f, 0x9f, 0x15, 0x21, 0xba, 0x8a, 0x94, 0x17, 0x53, 0x13, + 0x8b, 0xb7, 0x4d, 0xe9, 0xdc, 0xc7, 0x26, 0x47, 0x02, 0xf0, 0x4b, 0x75, + 0xbe, 0x84, 0x73, 0x02, 0x1e, 0x14, 0x97, 0x99, 0x91, 0x5b, 0x30, 0x82, + 0x03, 0x51, 0x30, 0x82, 0x02, 0x39, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x14, 0x15, 0x68, 0xb3, 0x37, 0x3a, 0x6a, 0x85, 0x56, 0xc8, 0x38, 0x5a, + 0xcc, 0xcc, 0x2c, 0xda, 0xac, 0x35, 0x6a, 0x40, 0x9e, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, + 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, + 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x30, + 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x25, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, + 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbe, 0x63, 0xe7, + 0x31, 0xf6, 0xc3, 0x1d, 0x9d, 0xd3, 0x47, 0x42, 0x28, 0x5c, 0x1c, 0xf0, + 0xc6, 0x00, 0xfa, 0x70, 0x23, 0x7a, 0xe5, 0x8b, 0x32, 0xb3, 0xd7, 0x09, + 0x80, 0xde, 0xb4, 0x6b, 0x02, 0x0e, 0x20, 0x42, 0x34, 0x74, 0x94, 0x66, + 0xeb, 0x32, 0xeb, 0x95, 0xb6, 0x95, 0xe4, 0x6a, 0xb9, 0x85, 0x08, 0xee, + 0xd6, 0x8f, 0x61, 0xd6, 0x23, 0x3c, 0xb2, 0xa0, 0x38, 0xfb, 0x48, 0x26, + 0xc9, 0x4a, 0x4f, 0x68, 0x4c, 0x9a, 0x93, 0x84, 0x75, 0x72, 0x7d, 0xa5, + 0xac, 0xed, 0xab, 0x21, 0x71, 0x1c, 0x34, 0x64, 0x07, 0x2f, 0xe5, 0x1f, + 0xb4, 0xeb, 0x31, 0x6d, 0xc9, 0x9b, 0x7c, 0xe8, 0xcc, 0x49, 0xdc, 0x7d, + 0x27, 0x08, 0x9d, 0xa2, 0x91, 0xf3, 0x9d, 0xad, 0xa0, 0xaa, 0x21, 0x53, + 0x76, 0xa7, 0x81, 0x04, 0x1a, 0x74, 0x89, 0xd6, 0x45, 0x72, 0x7c, 0x37, + 0x22, 0xa4, 0xf7, 0x36, 0x5b, 0x80, 0xce, 0xe2, 0x91, 0x60, 0xee, 0x91, + 0xef, 0xc0, 0x25, 0x92, 0x05, 0xa3, 0x24, 0xa2, 0x4c, 0xa2, 0x93, 0xd0, + 0x80, 0x61, 0xc0, 0x9c, 0xdf, 0xc1, 0xeb, 0xed, 0x2e, 0x23, 0x30, 0xe8, + 0xd8, 0xea, 0xc4, 0x5b, 0x2a, 0x4c, 0x00, 0xa4, 0xdf, 0xa2, 0xa3, 0x39, + 0x32, 0x80, 0xb2, 0x1d, 0x81, 0xa9, 0x26, 0x43, 0x07, 0xc5, 0xf0, 0x8d, + 0x2c, 0x61, 0x70, 0xbf, 0xfd, 0xa1, 0x33, 0xd1, 0x47, 0x59, 0x41, 0xc7, + 0x17, 0xe6, 0xdd, 0x4b, 0x99, 0x97, 0xb6, 0xc3, 0x39, 0x80, 0xfa, 0x78, + 0x61, 0x6f, 0xc7, 0xbf, 0x6c, 0x88, 0xd9, 0xd6, 0xc2, 0x60, 0xbe, 0x83, + 0x67, 0xd3, 0x38, 0xf9, 0x73, 0xc5, 0x64, 0x4e, 0xc2, 0xbb, 0x0f, 0xb8, + 0x24, 0xf5, 0x29, 0x86, 0xb2, 0x35, 0x9a, 0x74, 0x14, 0xdf, 0xef, 0x92, + 0xcc, 0xec, 0x5e, 0x46, 0x80, 0xe8, 0xf2, 0xc3, 0x4a, 0xbd, 0xb7, 0x78, + 0xad, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa6, 0x9c, 0x4e, + 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, + 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, + 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, + 0xef, 0x16, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, + 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x9b, 0x0d, 0xd9, 0x6c, 0xf4, + 0x0b, 0x08, 0xea, 0xfd, 0x75, 0xac, 0x4a, 0xcc, 0xf6, 0xdf, 0x33, 0x62, + 0x6b, 0x0c, 0x93, 0x50, 0x73, 0x4a, 0x60, 0x67, 0xde, 0x0d, 0x24, 0x95, + 0x4c, 0x4b, 0x75, 0xb3, 0xec, 0x0e, 0xe3, 0x3a, 0xc6, 0x4c, 0xe3, 0x93, + 0xf0, 0x9c, 0xa4, 0xfe, 0x2c, 0x87, 0x9c, 0x7c, 0x4d, 0x7b, 0x18, 0x1b, + 0x93, 0x5f, 0x2e, 0xda, 0x88, 0xef, 0x11, 0x8b, 0x2a, 0xa3, 0x20, 0xbb, + 0x22, 0xc0, 0x73, 0x59, 0xd9, 0x13, 0x35, 0xac, 0x40, 0x21, 0x1e, 0xd2, + 0xab, 0x5a, 0xcd, 0x80, 0x82, 0x36, 0x64, 0x11, 0x84, 0x11, 0x4f, 0xf0, + 0x60, 0x52, 0x3f, 0x2c, 0xe4, 0xc8, 0x47, 0xd8, 0x36, 0xc5, 0x50, 0x8a, + 0x8f, 0x8f, 0x13, 0x40, 0x3b, 0xda, 0x2b, 0x05, 0x17, 0x7c, 0x44, 0x5f, + 0x05, 0xde, 0x67, 0xcc, 0x17, 0x04, 0xdb, 0xcc, 0xee, 0x6e, 0x1c, 0xaf, + 0xf4, 0x66, 0x9c, 0x7d, 0x72, 0x91, 0x9f, 0x6f, 0x42, 0x78, 0x10, 0x90, + 0xd5, 0xfa, 0xd4, 0x1b, 0xac, 0x56, 0x02, 0xf4, 0x00, 0x48, 0x6b, 0x56, + 0x05, 0x32, 0xb5, 0x0a, 0x16, 0x14, 0x56, 0x14, 0xfa, 0x49, 0x99, 0x59, + 0x62, 0xed, 0xda, 0x99, 0x48, 0x88, 0x18, 0x20, 0x77, 0xfe, 0xbf, 0x6c, + 0xcc, 0x5b, 0x53, 0xab, 0x2b, 0x93, 0x6a, 0x5d, 0xce, 0xf8, 0x5e, 0xfa, + 0x71, 0xc5, 0x79, 0x6a, 0xba, 0x49, 0x00, 0x6a, 0x0f, 0x0e, 0x40, 0xb5, + 0x79, 0xa4, 0x93, 0x14, 0xa5, 0x2c, 0x24, 0x2d, 0x76, 0xa4, 0x05, 0x60, + 0x93, 0x8d, 0x50, 0xe8, 0x2b, 0xcf, 0x51, 0xe3, 0xdc, 0x8d, 0x72, 0xa2, + 0xae, 0xf1, 0x76, 0x5e, 0xba, 0xb2, 0xa9, 0x48, 0x20, 0x53, 0xbc, 0x80, + 0xf7, 0x35, 0xae, 0x41, 0x77, 0xef, 0x6a, 0x74, 0xeb, 0xa1, 0x68, 0xc5, + 0x83, 0x13, 0x50, 0xd8, 0xfc, 0x52, 0x18, 0xa3, 0x76, 0x1d, 0x50, 0x31, + 0x82, 0x02, 0x65, 0x30, 0x82, 0x02, 0x61, 0x02, 0x01, 0x01, 0x30, 0x52, + 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, + 0x02, 0x14, 0x71, 0xb5, 0x0a, 0x74, 0x69, 0x1a, 0x2e, 0xf8, 0x57, 0xff, + 0xaa, 0x62, 0x03, 0x18, 0x11, 0xc2, 0x0d, 0x63, 0x88, 0xb4, 0x30, 0x0d, + 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, + 0x00, 0xa0, 0x81, 0xe5, 0x30, 0x19, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x09, 0x03, 0x31, 0x0c, 0x06, 0x0a, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1c, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, 0x0d, + 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, + 0x5a, 0x30, 0x2f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0xfc, 0x43, 0xcf, 0xb7, 0x66, 0x6d, + 0x47, 0x06, 0xd6, 0x9d, 0x7d, 0x2c, 0xff, 0x15, 0x5d, 0xb4, 0x38, 0x2f, + 0xa8, 0x3a, 0x66, 0x99, 0xf2, 0xe5, 0xc7, 0x20, 0x52, 0xcd, 0x8b, 0xe6, + 0x6d, 0xf9, 0x30, 0x79, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x09, 0x0f, 0x31, 0x6c, 0x30, 0x6a, 0x30, 0x0b, 0x06, 0x09, 0x60, + 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2a, 0x30, 0x0b, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x16, 0x30, 0x0b, 0x06, + 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x02, 0x30, 0x0a, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x07, 0x30, 0x0e, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x02, + 0x00, 0x80, 0x30, 0x0d, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x03, 0x02, 0x02, 0x01, 0x40, 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, + 0x02, 0x07, 0x30, 0x0d, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x03, 0x02, 0x02, 0x01, 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, + 0x6a, 0x6f, 0xdd, 0xd8, 0x3c, 0xfa, 0x84, 0xfd, 0xe1, 0xda, 0xc5, 0x7e, + 0xe7, 0xd3, 0xcd, 0x1a, 0xfa, 0x53, 0x2a, 0x1c, 0x42, 0x91, 0xc4, 0xa9, + 0xdb, 0x0a, 0xce, 0xcc, 0xea, 0x53, 0x0d, 0x81, 0x26, 0xb5, 0x9a, 0x06, + 0x49, 0xfd, 0x44, 0x44, 0x17, 0x46, 0x41, 0xea, 0xee, 0x75, 0xad, 0x72, + 0x26, 0x25, 0x02, 0xac, 0x5c, 0xc0, 0xc2, 0x69, 0xb6, 0xf9, 0x46, 0x37, + 0x6e, 0x42, 0xcc, 0xf2, 0x35, 0x26, 0xad, 0x27, 0x33, 0x79, 0x79, 0x40, + 0x63, 0xce, 0x4d, 0x97, 0x00, 0xcc, 0xa6, 0xaf, 0x0d, 0xd2, 0x72, 0x07, + 0xbf, 0x8b, 0xd9, 0x9b, 0x00, 0x37, 0xfa, 0x9a, 0x67, 0x8a, 0x9e, 0x46, + 0x30, 0xce, 0xbd, 0x52, 0xa5, 0x82, 0xfa, 0xcd, 0x36, 0xe4, 0xa4, 0x90, + 0xa4, 0xda, 0x17, 0x4f, 0x95, 0xab, 0xf7, 0x7c, 0x5e, 0xb1, 0x3b, 0xf6, + 0xa0, 0xe1, 0x90, 0x47, 0x25, 0xc3, 0xb5, 0x56, 0xae, 0xbe, 0xba, 0x63, + 0xe5, 0x07, 0x40, 0xf0, 0x8a, 0x8e, 0xf6, 0x4c, 0xfa, 0xa5, 0x32, 0xe0, + 0x6e, 0xec, 0x53, 0x21, 0xf9, 0xa5, 0xc4, 0xe1, 0x59, 0x45, 0xa6, 0xb2, + 0x83, 0x32, 0xf5, 0x86, 0xaf, 0x80, 0x78, 0x91, 0xe9, 0x20, 0xca, 0x88, + 0x84, 0x3e, 0xec, 0xa4, 0x8a, 0x5e, 0xd7, 0x09, 0xb2, 0x2c, 0x6f, 0x40, + 0x61, 0x62, 0xa9, 0xc8, 0xd7, 0xf0, 0x30, 0x0f, 0xb6, 0x99, 0xa2, 0x6a, + 0x07, 0x3d, 0x52, 0xe0, 0x13, 0x15, 0x96, 0x85, 0x89, 0xcc, 0x33, 0x4d, + 0x4f, 0x15, 0xc8, 0xad, 0x86, 0x8b, 0x26, 0x1b, 0xa2, 0xf3, 0x17, 0xf0, + 0x87, 0x3a, 0x12, 0x9e, 0xc2, 0x10, 0x93, 0xae, 0xfa, 0x6c, 0x36, 0x4c, + 0x04, 0x91, 0x19, 0x3a, 0x52, 0x3c, 0x0a, 0x49, 0xb7, 0x12, 0xf9, 0xf9, + 0x49, 0x50, 0x71, 0x2f, 0xc5, 0x58, 0x4c, 0x35, 0xae, 0x26, 0x72, 0x99, + 0x5c, 0xfd, 0x08, 0xe4, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0d, 0x00, 0x00, + 0x00, 0x02, 0x02, 0x00, 0x30, 0x82, 0x0c, 0xfa, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x0c, 0xeb, 0x30, + 0x82, 0x0c, 0xe7, 0x02, 0x01, 0x01, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, + 0x78, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, + 0x04, 0xa0, 0x6a, 0x30, 0x68, 0x30, 0x33, 0x06, 0x0a, 0x2b, 0x06, 0x01, + 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x0f, 0x30, 0x25, 0x03, 0x01, 0x00, + 0xa0, 0x20, 0xa2, 0x1e, 0x80, 0x1c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, + 0x00, 0x4f, 0x00, 0x62, 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x65, + 0x00, 0x74, 0x00, 0x65, 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x30, 0x31, + 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, + 0x01, 0x05, 0x00, 0x04, 0x20, 0xf6, 0xf0, 0xe0, 0x42, 0xf3, 0x86, 0xca, + 0x95, 0x65, 0x2c, 0x9e, 0x10, 0x4e, 0xaa, 0xe1, 0x69, 0xd9, 0x52, 0x07, + 0x8e, 0x7e, 0x01, 0x4c, 0xd5, 0x3e, 0x47, 0xf9, 0xc4, 0x61, 0xb3, 0xc2, + 0x8a, 0xa0, 0x82, 0x09, 0xf5, 0x30, 0x82, 0x03, 0x43, 0x30, 0x82, 0x02, + 0x2b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x6d, 0x0c, 0xf0, 0x2d, + 0x05, 0x1d, 0xa2, 0xa3, 0xa4, 0x71, 0x77, 0xf8, 0xce, 0xcd, 0xaa, 0xc1, + 0xcc, 0xa9, 0xd0, 0x16, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x31, 0x31, 0x2f, 0x30, + 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x26, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, + 0x74, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x20, 0x32, 0x30, 0x1e, + 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, + 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, + 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x26, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, + 0x20, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x20, 0x32, 0x30, 0x82, 0x01, + 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, + 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xde, 0xab, 0x0d, 0xae, 0x9a, 0x98, + 0x07, 0x9e, 0xa0, 0xb4, 0x9b, 0x95, 0xa8, 0x74, 0x7c, 0x13, 0x03, 0xf9, + 0x53, 0xb1, 0x4a, 0xc4, 0x35, 0xa3, 0xc1, 0xf8, 0xce, 0xcd, 0x42, 0x59, + 0x88, 0xe7, 0x91, 0xb7, 0xf2, 0xd3, 0x6d, 0xb3, 0x29, 0x34, 0x3d, 0x8f, + 0x0e, 0xfc, 0x53, 0x73, 0x3a, 0x8b, 0x55, 0x72, 0xb2, 0x9c, 0x7b, 0xe1, + 0x88, 0xc9, 0xb8, 0x0d, 0x7b, 0x90, 0xf8, 0x31, 0x3a, 0x87, 0x98, 0x12, + 0x43, 0xc7, 0xed, 0xc0, 0x69, 0x87, 0x2f, 0xfa, 0xa2, 0xbc, 0x6f, 0x32, + 0x22, 0xfe, 0x83, 0x71, 0xcd, 0x23, 0x23, 0x91, 0x98, 0xc2, 0xb1, 0xdf, + 0xf3, 0x29, 0x1b, 0xfd, 0x11, 0x97, 0x9e, 0x1d, 0xfe, 0x30, 0xb5, 0x5a, + 0x41, 0x3c, 0x40, 0x30, 0x0a, 0xed, 0x0b, 0xec, 0xca, 0x9d, 0xd6, 0xf0, + 0x0b, 0xba, 0x6b, 0x98, 0xef, 0x65, 0xb8, 0x0e, 0x08, 0x40, 0x70, 0xec, + 0xee, 0x83, 0x21, 0x38, 0x82, 0x20, 0xba, 0x6b, 0xeb, 0xa6, 0xcc, 0xb2, + 0xa3, 0x35, 0x48, 0x3b, 0x72, 0xc0, 0x89, 0xee, 0x3a, 0x9f, 0x14, 0x87, + 0x96, 0x13, 0x05, 0x1a, 0x03, 0xcb, 0xd6, 0x1b, 0xad, 0x0b, 0x27, 0x73, + 0xb0, 0xe7, 0x5d, 0x0c, 0x0b, 0x0d, 0x60, 0xe0, 0x25, 0xfa, 0xf0, 0xe9, + 0x7a, 0x44, 0xf1, 0x5d, 0x51, 0x09, 0x3e, 0x40, 0x99, 0x3a, 0xe3, 0xe8, + 0x53, 0x30, 0xad, 0xe0, 0x70, 0x66, 0x38, 0x3d, 0xf1, 0x7e, 0x0e, 0xd4, + 0xce, 0x8f, 0x07, 0xf4, 0x17, 0x2a, 0x5f, 0xca, 0xc8, 0xd0, 0x29, 0xea, + 0x4e, 0x1c, 0x8d, 0xd0, 0x67, 0x5b, 0x0b, 0x63, 0x31, 0xdc, 0xd5, 0xc8, + 0x00, 0x8e, 0x87, 0xcc, 0x29, 0xb6, 0x2a, 0xc0, 0x90, 0xea, 0x02, 0x53, + 0x9e, 0x9d, 0x37, 0x49, 0x52, 0xc5, 0xc3, 0xed, 0x75, 0xac, 0x05, 0x01, + 0x52, 0x30, 0xf0, 0x86, 0x4e, 0x1a, 0xc1, 0x83, 0x79, 0xf9, 0x02, 0x03, + 0x01, 0x00, 0x01, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x07, 0x9f, 0xc5, 0xe7, 0x69, 0x95, + 0x88, 0xf0, 0xd2, 0xfd, 0x64, 0xbd, 0xe1, 0x7e, 0x9b, 0xac, 0xff, 0x11, + 0x13, 0x65, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0x07, 0x9f, 0xc5, 0xe7, 0x69, 0x95, 0x88, 0xf0, 0xd2, + 0xfd, 0x64, 0xbd, 0xe1, 0x7e, 0x9b, 0xac, 0xff, 0x11, 0x13, 0x65, 0x30, + 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, + 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, + 0x2d, 0x5c, 0x25, 0x72, 0x40, 0xc6, 0xa5, 0xd3, 0x43, 0xaa, 0x55, 0x97, + 0xa5, 0x7d, 0xc7, 0x3d, 0x6b, 0x77, 0xf2, 0xa3, 0xec, 0x14, 0xdd, 0xa4, + 0x82, 0x61, 0x98, 0x7d, 0xce, 0x4f, 0x4a, 0x68, 0x08, 0x9d, 0xe7, 0x4e, + 0x8e, 0xab, 0x76, 0x5f, 0x52, 0xae, 0xd5, 0x45, 0xb0, 0x14, 0x98, 0x8e, + 0x0f, 0xdc, 0xd9, 0xe8, 0x5d, 0xc3, 0xa3, 0x8c, 0x7d, 0xcf, 0x3c, 0x84, + 0x50, 0x41, 0xef, 0xa6, 0x95, 0x77, 0xc9, 0x46, 0x61, 0x67, 0xa4, 0x1b, + 0xdc, 0xe2, 0x6d, 0xef, 0x0f, 0x1a, 0x0e, 0xd7, 0x3b, 0xdf, 0x10, 0xe5, + 0xd4, 0x42, 0x0d, 0x14, 0x42, 0xed, 0xce, 0xfa, 0xa9, 0x5a, 0x1c, 0x10, + 0xc2, 0xc7, 0x34, 0xd2, 0xc1, 0x7c, 0xff, 0x33, 0x08, 0x71, 0x3c, 0x6d, + 0x23, 0x03, 0x62, 0xae, 0x63, 0x93, 0xea, 0x44, 0xa9, 0x06, 0x28, 0x7b, + 0x72, 0x01, 0xaf, 0x9a, 0xb6, 0xd2, 0x48, 0xa6, 0x7b, 0x3a, 0xf2, 0xf8, + 0x6e, 0xb6, 0xa1, 0xb7, 0xd5, 0xa9, 0x3e, 0x8a, 0x04, 0x7f, 0x1f, 0x6e, + 0x37, 0xfa, 0x1e, 0xfc, 0x79, 0x18, 0x29, 0x73, 0x59, 0xfa, 0xc3, 0xb9, + 0x44, 0x8a, 0x43, 0xf0, 0x4a, 0x4a, 0x8e, 0xb5, 0x17, 0xee, 0x4c, 0x5c, + 0xbd, 0x7d, 0x25, 0x8b, 0x30, 0x29, 0x23, 0x68, 0xbb, 0x44, 0xed, 0x45, + 0xb7, 0xf2, 0x6a, 0x95, 0x79, 0x64, 0x95, 0x45, 0x8a, 0x81, 0xbb, 0xf5, + 0x39, 0xb6, 0xde, 0xdb, 0x18, 0x0d, 0x05, 0x1b, 0x83, 0x7e, 0xce, 0x93, + 0xc8, 0x8c, 0xeb, 0x13, 0x22, 0x4b, 0xc6, 0x54, 0x8c, 0x23, 0x8e, 0x7c, + 0x99, 0x8b, 0xae, 0xb3, 0xb1, 0x1f, 0x00, 0xfd, 0x1f, 0x92, 0x2d, 0xa5, + 0x3a, 0xe1, 0x78, 0x76, 0x78, 0x05, 0x8a, 0x61, 0x62, 0x5d, 0x99, 0x73, + 0x8b, 0x22, 0x6f, 0x07, 0x7a, 0xb3, 0x5d, 0xd3, 0x4c, 0xe4, 0xfc, 0xa9, + 0x97, 0xe6, 0xb0, 0x66, 0x30, 0x82, 0x03, 0x53, 0x30, 0x82, 0x02, 0x3b, + 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x6c, 0x76, 0x71, 0x78, 0x96, + 0x78, 0x58, 0x91, 0x7a, 0x6e, 0x6d, 0x0d, 0xe4, 0x80, 0x55, 0xfc, 0x4f, + 0x51, 0xca, 0x61, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x39, 0x31, 0x37, 0x30, 0x35, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, + 0x20, 0x55, 0x6e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, + 0x65, 0x72, 0x74, 0x20, 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, + 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, + 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, + 0x5a, 0x30, 0x39, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, + 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x20, 0x31, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbc, 0x34, 0x39, + 0x35, 0x9d, 0xb6, 0x0f, 0x82, 0xec, 0x8a, 0xa5, 0x1a, 0x7d, 0xd8, 0x0f, + 0xdc, 0x0b, 0xb6, 0xd6, 0xb8, 0x7f, 0xe4, 0x4c, 0xf0, 0x7b, 0x5c, 0x5e, + 0x1d, 0xa0, 0xbb, 0x68, 0x77, 0x7a, 0x59, 0x62, 0xdb, 0xa9, 0xbc, 0xde, + 0x59, 0xa3, 0x06, 0x32, 0x4e, 0xe2, 0x2d, 0x04, 0x45, 0x01, 0xd0, 0x5b, + 0x2f, 0x3b, 0x2d, 0xa7, 0x58, 0x98, 0x89, 0xc1, 0x31, 0xbc, 0x17, 0x05, + 0x5c, 0x17, 0x16, 0xdb, 0x06, 0xe0, 0x36, 0x47, 0x62, 0x30, 0x4c, 0x17, + 0x9e, 0x2e, 0xc2, 0x7b, 0x60, 0x70, 0x01, 0x15, 0x49, 0x9f, 0x26, 0xf7, + 0x96, 0xd3, 0x48, 0xc3, 0x9d, 0xdb, 0x81, 0x50, 0x1e, 0x68, 0x1d, 0x2a, + 0x3f, 0xb2, 0xad, 0x54, 0x64, 0xee, 0x93, 0x93, 0x37, 0xd7, 0x8c, 0xa5, + 0xb9, 0x02, 0xaa, 0x72, 0xee, 0x57, 0x41, 0x35, 0x44, 0x78, 0xa8, 0x5c, + 0x2a, 0xb1, 0x05, 0x41, 0xab, 0x3a, 0xcc, 0xa2, 0xfd, 0xff, 0x9d, 0x7b, + 0xd6, 0xb3, 0x70, 0x6a, 0xdd, 0x06, 0x36, 0x0b, 0x0a, 0x9b, 0x1f, 0x32, + 0xe8, 0x70, 0xe9, 0x73, 0x75, 0x8f, 0xd4, 0xa4, 0xd5, 0xb2, 0x3b, 0xfc, + 0x31, 0x9a, 0x70, 0x63, 0x53, 0xe6, 0xc5, 0x9a, 0x34, 0x3d, 0x24, 0x6f, + 0x95, 0x94, 0xb3, 0x6a, 0x32, 0xfe, 0x0e, 0x83, 0x94, 0x40, 0x1f, 0x43, + 0x0e, 0xf4, 0xdb, 0x2d, 0x91, 0x47, 0x09, 0x4b, 0xe6, 0xfc, 0x02, 0x29, + 0x89, 0xa2, 0xe3, 0xb8, 0xc6, 0xed, 0x63, 0x67, 0x7d, 0xdf, 0x53, 0x5a, + 0x39, 0x13, 0x7c, 0x0f, 0xd3, 0x92, 0xea, 0x5b, 0xed, 0xc3, 0x20, 0x52, + 0x1b, 0x70, 0x63, 0xae, 0xb8, 0xe9, 0x50, 0x28, 0xc8, 0x20, 0x99, 0x4e, + 0x72, 0xd8, 0x00, 0xbe, 0x6b, 0xd9, 0x8e, 0x17, 0xa1, 0x8a, 0xcc, 0xf8, + 0xcb, 0x04, 0x7d, 0x05, 0x59, 0x1c, 0x1b, 0xe2, 0x1c, 0x8c, 0x3b, 0x16, + 0xbd, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, + 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x53, 0x20, 0xdd, + 0x71, 0xbb, 0xdc, 0x1d, 0xf6, 0xb3, 0xd6, 0x20, 0xcb, 0x13, 0x5a, 0x14, + 0x59, 0x50, 0xdc, 0x89, 0xe4, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, + 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x53, 0x20, 0xdd, 0x71, 0xbb, 0xdc, + 0x1d, 0xf6, 0xb3, 0xd6, 0x20, 0xcb, 0x13, 0x5a, 0x14, 0x59, 0x50, 0xdc, + 0x89, 0xe4, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x33, 0xc2, 0x25, 0x24, 0xbc, 0x09, 0xba, 0x02, 0xc6, + 0xa5, 0x2f, 0xf9, 0x93, 0x30, 0x9c, 0x70, 0x65, 0x79, 0x95, 0x29, 0xc4, + 0x2f, 0xb8, 0x2a, 0x9a, 0xa2, 0x81, 0x22, 0x67, 0xfd, 0x94, 0xb1, 0x94, + 0x32, 0x35, 0xa6, 0xec, 0xce, 0x05, 0x78, 0x45, 0x31, 0x02, 0xd2, 0x89, + 0xd3, 0x22, 0x17, 0xe5, 0x2c, 0xf9, 0xa1, 0x86, 0xe7, 0x86, 0x84, 0x1a, + 0x55, 0xc0, 0x4a, 0xbd, 0xd2, 0x58, 0x5f, 0x56, 0x56, 0xb0, 0x96, 0x5e, + 0x08, 0x9b, 0x0f, 0xf9, 0xde, 0x1a, 0x49, 0x9e, 0x6c, 0xa1, 0xa6, 0xc7, + 0x50, 0x2b, 0x15, 0x56, 0x9a, 0xe8, 0x2a, 0x6e, 0x2c, 0x47, 0x9e, 0x93, + 0x89, 0x72, 0x8a, 0x44, 0x6f, 0x2e, 0xfc, 0xdf, 0x5c, 0xf8, 0xfb, 0xe5, + 0xb9, 0xf9, 0x0a, 0x44, 0xf0, 0x5b, 0x97, 0xd5, 0x18, 0x54, 0x08, 0xbd, + 0xd8, 0xc5, 0x69, 0x4f, 0x19, 0x0c, 0x1e, 0xe5, 0xd6, 0x65, 0xe6, 0xf2, + 0x37, 0xdc, 0xf5, 0x8d, 0x01, 0x2a, 0x4b, 0x5c, 0x47, 0xa1, 0xf5, 0xfa, + 0x9a, 0xc7, 0xa4, 0x5b, 0xc4, 0xa5, 0x3c, 0xc1, 0x3a, 0xae, 0xf7, 0x06, + 0xe1, 0x32, 0xc3, 0xde, 0x75, 0x76, 0xec, 0x08, 0x9c, 0x22, 0xfa, 0xc6, + 0x3f, 0x60, 0x68, 0x02, 0xaf, 0x49, 0x7e, 0x3f, 0xd4, 0x29, 0xca, 0x1a, + 0x68, 0x95, 0x72, 0x0e, 0x9b, 0x16, 0xd3, 0x95, 0xe7, 0xb7, 0x54, 0x57, + 0x51, 0xdf, 0x14, 0x95, 0x63, 0xf9, 0xa3, 0xa2, 0xa1, 0x8c, 0xeb, 0x96, + 0x38, 0xe2, 0xf5, 0x3f, 0x9f, 0x86, 0x2f, 0x52, 0x96, 0xe0, 0x0f, 0xbf, + 0x06, 0xd5, 0x64, 0x25, 0x2e, 0xd8, 0x7e, 0x34, 0xf7, 0x55, 0xd1, 0xb8, + 0x4b, 0x3b, 0x15, 0xc1, 0x7a, 0x3e, 0xc7, 0x3b, 0xab, 0x68, 0xb3, 0x43, + 0xa2, 0xdb, 0xda, 0x94, 0x45, 0x91, 0xb5, 0x64, 0x7f, 0x0f, 0xad, 0x16, + 0x52, 0xca, 0x8e, 0xf0, 0xdb, 0x44, 0xf7, 0x30, 0x82, 0x03, 0x53, 0x30, + 0x82, 0x02, 0x3b, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x64, 0x8a, + 0x35, 0x01, 0xdc, 0x0a, 0x0e, 0x44, 0x87, 0x7f, 0xc3, 0xc6, 0x07, 0x1d, + 0x68, 0xc1, 0x50, 0xaa, 0x07, 0x1f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x39, 0x31, + 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, + 0x65, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, + 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, + 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, + 0x32, 0x30, 0x37, 0x5a, 0x30, 0x39, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, + 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, + 0x6e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, 0x72, + 0x74, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, + 0xa4, 0x35, 0xc3, 0x82, 0x3a, 0x37, 0x69, 0xcb, 0x8f, 0x6a, 0x3c, 0x53, + 0x64, 0xda, 0x11, 0x79, 0x90, 0x1f, 0x80, 0x44, 0x16, 0xcb, 0x25, 0x11, + 0x12, 0x23, 0x6d, 0x82, 0xb7, 0x5f, 0x00, 0x83, 0xdc, 0x13, 0x20, 0x10, + 0x8e, 0x6d, 0x7d, 0xa7, 0x57, 0x31, 0xe2, 0x2b, 0x49, 0x96, 0x4a, 0x5c, + 0x0e, 0x6b, 0x1b, 0xa7, 0x96, 0x31, 0x09, 0xfa, 0xd1, 0x68, 0xa6, 0x81, + 0x23, 0x11, 0x9e, 0x26, 0xb3, 0x08, 0xbd, 0x4f, 0x8a, 0x22, 0x02, 0xc6, + 0xbc, 0x09, 0x34, 0xb6, 0x6f, 0xbd, 0x51, 0x6f, 0x11, 0xd8, 0x84, 0x94, + 0xae, 0x73, 0x13, 0xe9, 0xac, 0x49, 0xa2, 0x81, 0xac, 0xa0, 0x21, 0xca, + 0x11, 0x66, 0x41, 0x14, 0x3b, 0x8a, 0x71, 0x14, 0x80, 0x74, 0x52, 0x2d, + 0xda, 0x6c, 0x3e, 0xf0, 0x89, 0xd0, 0xe5, 0x64, 0xae, 0x4a, 0xe1, 0x96, + 0x82, 0x89, 0x86, 0x5e, 0xfc, 0x2a, 0x2b, 0x59, 0x74, 0x20, 0x8a, 0x7d, + 0x50, 0xf7, 0x77, 0x5b, 0x3e, 0xd4, 0xda, 0x9d, 0xc6, 0xd1, 0xd5, 0xfc, + 0x91, 0x63, 0x6d, 0xda, 0x19, 0x1b, 0xc3, 0xb2, 0x60, 0x0a, 0x26, 0xc2, + 0xf5, 0xc9, 0xdb, 0x27, 0x6c, 0x40, 0xdd, 0x87, 0x1e, 0x30, 0xfd, 0x9d, + 0xad, 0xb7, 0x49, 0x89, 0xa0, 0x59, 0xcf, 0xc6, 0x07, 0x9d, 0x6f, 0x47, + 0x37, 0xbb, 0xfd, 0x8b, 0xb0, 0xde, 0x1a, 0xdb, 0x79, 0x58, 0x10, 0x11, + 0x2c, 0x29, 0xd2, 0xbc, 0xd1, 0x3b, 0x52, 0x3e, 0xb3, 0x91, 0xd7, 0xcc, + 0x4e, 0x97, 0xc0, 0xde, 0x50, 0x7f, 0x7e, 0xe6, 0x59, 0xab, 0x3b, 0x4c, + 0x84, 0xe2, 0x97, 0x2c, 0x73, 0xd3, 0xfb, 0xef, 0xc6, 0x16, 0x08, 0xff, + 0xf7, 0xfd, 0x45, 0x11, 0x49, 0xe3, 0x69, 0x36, 0x17, 0xcf, 0x4a, 0xa0, + 0xf9, 0x66, 0x9b, 0xc9, 0x51, 0xf0, 0x1b, 0x26, 0x92, 0x07, 0x8c, 0x2e, + 0xf9, 0x1b, 0x01, 0x79, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x53, 0x30, + 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x9e, 0x10, 0x0a, 0x18, 0xa0, 0xe1, 0xdb, 0x4f, 0x50, 0x6e, 0xb3, 0xa8, + 0x1e, 0xf7, 0x03, 0x8b, 0x81, 0xf2, 0xa7, 0x1d, 0x30, 0x1f, 0x06, 0x03, + 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x9e, 0x10, 0x0a, + 0x18, 0xa0, 0xe1, 0xdb, 0x4f, 0x50, 0x6e, 0xb3, 0xa8, 0x1e, 0xf7, 0x03, + 0x8b, 0x81, 0xf2, 0xa7, 0x1d, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x60, 0x89, 0x47, 0xb0, 0x88, 0xac, + 0xe0, 0x25, 0x57, 0xe9, 0x5f, 0x8d, 0x51, 0x8e, 0xb8, 0x93, 0x97, 0xab, + 0xbf, 0xd4, 0x90, 0x0a, 0x98, 0x3c, 0x6b, 0x12, 0x35, 0x16, 0x59, 0x60, + 0x8d, 0x33, 0x55, 0x8d, 0xaf, 0xea, 0x7a, 0x92, 0xc8, 0x7a, 0x10, 0x17, + 0xe0, 0x9c, 0xa4, 0x35, 0x49, 0xb3, 0x36, 0xe6, 0x32, 0xa8, 0xf4, 0xab, + 0x6e, 0x4b, 0xbd, 0x05, 0x52, 0x59, 0x2a, 0x99, 0xbc, 0x87, 0x57, 0x0a, + 0xd3, 0x97, 0xf5, 0x99, 0x7f, 0xc1, 0x4f, 0x9d, 0x6a, 0xbd, 0x19, 0x44, + 0xd1, 0xf0, 0x1a, 0xf7, 0xf3, 0x9d, 0x20, 0x09, 0x04, 0x34, 0x93, 0xe2, + 0x44, 0x31, 0x30, 0x14, 0x3d, 0x25, 0x4d, 0x93, 0x0d, 0xcc, 0xa3, 0x5b, + 0x8f, 0x9f, 0xde, 0xfa, 0x85, 0x74, 0x6f, 0x6d, 0xd6, 0x7a, 0xc9, 0x7d, + 0x93, 0x14, 0x41, 0xce, 0xd0, 0x07, 0x5d, 0xf4, 0x2c, 0x3d, 0x3c, 0xe3, + 0x8b, 0xad, 0x57, 0x5a, 0x60, 0x11, 0xe7, 0x41, 0xd7, 0xba, 0x84, 0x22, + 0xe2, 0x59, 0x43, 0xbf, 0xbb, 0x20, 0xac, 0x10, 0x66, 0xd3, 0x45, 0x37, + 0xcc, 0xc4, 0x3d, 0xf6, 0x1f, 0x6c, 0x0c, 0x3f, 0x60, 0x03, 0x9a, 0x6b, + 0xd9, 0xd6, 0x84, 0xbc, 0x20, 0x9b, 0xc5, 0xee, 0xe3, 0x8e, 0x96, 0xba, + 0xf4, 0x28, 0x5a, 0xb2, 0x82, 0xef, 0xb4, 0x41, 0x99, 0xf3, 0xa6, 0x1c, + 0xbd, 0xfa, 0xa4, 0x79, 0x0b, 0x05, 0x25, 0xa7, 0xd0, 0x45, 0xd6, 0x97, + 0xe1, 0xc4, 0x3f, 0x80, 0xa2, 0x88, 0x51, 0xcd, 0x9d, 0xbe, 0xf2, 0x32, + 0x0e, 0x93, 0x0a, 0x06, 0x31, 0x45, 0x6a, 0x95, 0x94, 0xe4, 0x77, 0xce, + 0x2b, 0x07, 0x57, 0xe8, 0xd5, 0x60, 0x4d, 0x64, 0x5e, 0xac, 0x0b, 0xc3, + 0xf5, 0x00, 0xf0, 0xc5, 0x40, 0x27, 0xd0, 0x80, 0x69, 0x7e, 0xde, 0xaa, + 0x57, 0x1b, 0xd2, 0xc6, 0x87, 0x52, 0x2b, 0x0e, 0x89, 0xeb, 0x31, 0x82, + 0x02, 0x5c, 0x30, 0x82, 0x02, 0x58, 0x02, 0x01, 0x01, 0x30, 0x49, 0x30, + 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x26, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, + 0x20, 0x32, 0x02, 0x14, 0x6d, 0x0c, 0xf0, 0x2d, 0x05, 0x1d, 0xa2, 0xa3, + 0xa4, 0x71, 0x77, 0xf8, 0xce, 0xcd, 0xaa, 0xc1, 0xcc, 0xa9, 0xd0, 0x16, + 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, + 0x01, 0x05, 0x00, 0xa0, 0x81, 0xe5, 0x30, 0x19, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x03, 0x31, 0x0c, 0x06, 0x0a, 0x2b, + 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1c, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, + 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, + 0x30, 0x37, 0x5a, 0x30, 0x2f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x09, 0x04, 0x31, 0x22, 0x04, 0x20, 0xfc, 0x43, 0xcf, 0xb7, + 0x66, 0x6d, 0x47, 0x06, 0xd6, 0x9d, 0x7d, 0x2c, 0xff, 0x15, 0x5d, 0xb4, + 0x38, 0x2f, 0xa8, 0x3a, 0x66, 0x99, 0xf2, 0xe5, 0xc7, 0x20, 0x52, 0xcd, + 0x8b, 0xe6, 0x6d, 0xf9, 0x30, 0x79, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x09, 0x0f, 0x31, 0x6c, 0x30, 0x6a, 0x30, 0x0b, 0x06, + 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x2a, 0x30, 0x0b, + 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x16, 0x30, + 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x02, + 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x07, + 0x30, 0x0e, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, + 0x02, 0x02, 0x00, 0x80, 0x30, 0x0d, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x01, 0x40, 0x30, 0x07, 0x06, 0x05, 0x2b, + 0x0e, 0x03, 0x02, 0x07, 0x30, 0x0d, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x01, 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, + 0x01, 0x00, 0x7a, 0xdb, 0x8e, 0x3c, 0x86, 0x43, 0x61, 0x45, 0x3c, 0xc7, + 0x7a, 0xbc, 0x61, 0x75, 0xc4, 0x4a, 0x44, 0xec, 0x2f, 0x28, 0x1a, 0xb9, + 0x41, 0x37, 0x79, 0xfa, 0xd9, 0x20, 0x84, 0x1b, 0x26, 0x9c, 0x5d, 0xa5, + 0x14, 0x28, 0x46, 0x58, 0x24, 0xca, 0xbd, 0x9c, 0x88, 0x20, 0x5a, 0xa1, + 0x4d, 0xfa, 0x0b, 0xd7, 0xa5, 0x9d, 0xbd, 0x6a, 0x5f, 0x93, 0x3d, 0x91, + 0xd2, 0x4d, 0x49, 0x0f, 0x1b, 0x39, 0x29, 0x47, 0x87, 0xf1, 0x68, 0xb4, + 0x4e, 0xec, 0xbf, 0x8e, 0x41, 0xed, 0xb2, 0x52, 0xf3, 0x01, 0x01, 0x38, + 0x25, 0x27, 0x74, 0x94, 0xc3, 0xd7, 0x32, 0x30, 0xd7, 0x59, 0x1f, 0x17, + 0x8d, 0x93, 0x4d, 0x09, 0x6e, 0x5b, 0xa8, 0x19, 0x7f, 0x5d, 0xc9, 0x95, + 0x08, 0xd3, 0xa3, 0xdc, 0xf5, 0x83, 0x3e, 0x5c, 0x46, 0x17, 0x9f, 0x78, + 0x46, 0x9a, 0x73, 0xc8, 0xd2, 0xdc, 0xc9, 0x68, 0x00, 0x0b, 0x3d, 0xfa, + 0x1f, 0x1b, 0x9e, 0x2c, 0xcc, 0x34, 0x99, 0x2f, 0xb1, 0x7e, 0xfa, 0x17, + 0x74, 0x5a, 0x32, 0x4b, 0x04, 0x2f, 0xa0, 0x63, 0xb3, 0x82, 0x0f, 0x72, + 0xdf, 0x10, 0x7e, 0x3e, 0xde, 0xf1, 0x82, 0x5a, 0x33, 0xa5, 0xee, 0xdc, + 0xac, 0x01, 0xb6, 0x48, 0xab, 0x73, 0xd7, 0x29, 0x78, 0x80, 0xd3, 0x5a, + 0x8e, 0x62, 0x88, 0x63, 0x35, 0x7f, 0x1a, 0xa0, 0x8e, 0xc3, 0x0c, 0x9f, + 0x31, 0x03, 0xeb, 0x0c, 0xec, 0xe6, 0xd0, 0x23, 0x2c, 0x08, 0x71, 0x7c, + 0xc6, 0x65, 0x0a, 0xf1, 0xf6, 0x75, 0x47, 0x86, 0x7f, 0xd3, 0xe1, 0xd8, + 0x01, 0xc3, 0xaa, 0x5e, 0xa6, 0x6c, 0x93, 0x13, 0x27, 0x68, 0xd7, 0x45, + 0xf6, 0x31, 0xbe, 0x9d, 0x15, 0x0e, 0xce, 0xaa, 0x00, 0xf9, 0x41, 0x88, + 0x43, 0x7e, 0x60, 0xe0, 0x6d, 0xb9, 0x70, 0x6a, 0x76, 0xce, 0x93, 0x18, + 0x89, 0xcb, 0x4f, 0xd2, 0x01, 0xd4, 0x00, 0x00, +}; +CONST UINTN mMultiSignedImageSize = sizeof (mMultiSignedImage); + +// +// Authenticode SHA-256 digest of the unsigned image +// +CONST UINT8 mUnsignedImageDigestSha256[] = { + 0xf6, 0xf0, 0xe0, 0x42, 0xf3, 0x86, 0xca, 0x95, 0x65, 0x2c, 0x9e, 0x10, + 0x4e, 0xaa, 0xe1, 0x69, 0xd9, 0x52, 0x07, 0x8e, 0x7e, 0x01, 0x4c, 0xd5, + 0x3e, 0x47, 0xf9, 0xc4, 0x61, 0xb3, 0xc2, 0x8a, +}; +CONST UINTN mUnsignedImageDigestSha256Size = sizeof (mUnsignedImageDigestSha256); + +// +// Authenticode SHA-384 digest of the unsigned image +// +CONST UINT8 mUnsignedImageDigestSha384[] = { + 0x94, 0x90, 0x47, 0x1e, 0xbf, 0x49, 0x4f, 0xc1, 0xa7, 0x15, 0xd6, 0xb4, + 0xe0, 0xc6, 0xc1, 0x61, 0xc3, 0x16, 0x65, 0x5a, 0xaf, 0x3c, 0x7e, 0xc3, + 0x95, 0x8f, 0xb4, 0xad, 0x75, 0xdf, 0x30, 0x16, 0x21, 0x64, 0x97, 0x3c, + 0x5a, 0xe7, 0x37, 0xd6, 0x0a, 0x9b, 0x8f, 0xec, 0x1a, 0xa2, 0x3e, 0xf7, +}; +CONST UINTN mUnsignedImageDigestSha384Size = sizeof (mUnsignedImageDigestSha384); + +// +// Authenticode SHA-512 digest of the unsigned image +// +CONST UINT8 mUnsignedImageDigestSha512[] = { + 0x2b, 0xe2, 0x69, 0xc6, 0xdd, 0xec, 0xc5, 0xc6, 0x97, 0xf5, 0x49, 0xfb, + 0x56, 0x31, 0x4d, 0xf7, 0xb0, 0x2a, 0x75, 0x07, 0x5b, 0x14, 0xa4, 0x54, + 0x01, 0x30, 0x94, 0x38, 0xfa, 0x98, 0x95, 0x8c, 0xa1, 0x72, 0xcf, 0x29, + 0x67, 0x4c, 0xe3, 0x7c, 0xe7, 0xc4, 0x68, 0xb1, 0x38, 0x0c, 0x1d, 0xac, + 0x3e, 0x7e, 0xa8, 0x25, 0x03, 0x90, 0xaf, 0x0c, 0x1a, 0x4f, 0x1a, 0x24, + 0xd2, 0xd1, 0x22, 0xe1, +}; +CONST UINTN mUnsignedImageDigestSha512Size = sizeof (mUnsignedImageDigestSha512); + +// +// Authenticode SHA-256 digest of the signed image +// +CONST UINT8 mSignedImageDigestSha256[] = { + 0xf6, 0xf0, 0xe0, 0x42, 0xf3, 0x86, 0xca, 0x95, 0x65, 0x2c, 0x9e, 0x10, + 0x4e, 0xaa, 0xe1, 0x69, 0xd9, 0x52, 0x07, 0x8e, 0x7e, 0x01, 0x4c, 0xd5, + 0x3e, 0x47, 0xf9, 0xc4, 0x61, 0xb3, 0xc2, 0x8a, +}; +CONST UINTN mSignedImageDigestSha256Size = sizeof (mSignedImageDigestSha256); + +// +// Authenticode SHA-384 digest of the signed image +// +CONST UINT8 mSignedImageDigestSha384[] = { + 0x94, 0x90, 0x47, 0x1e, 0xbf, 0x49, 0x4f, 0xc1, 0xa7, 0x15, 0xd6, 0xb4, + 0xe0, 0xc6, 0xc1, 0x61, 0xc3, 0x16, 0x65, 0x5a, 0xaf, 0x3c, 0x7e, 0xc3, + 0x95, 0x8f, 0xb4, 0xad, 0x75, 0xdf, 0x30, 0x16, 0x21, 0x64, 0x97, 0x3c, + 0x5a, 0xe7, 0x37, 0xd6, 0x0a, 0x9b, 0x8f, 0xec, 0x1a, 0xa2, 0x3e, 0xf7, +}; +CONST UINTN mSignedImageDigestSha384Size = sizeof (mSignedImageDigestSha384); + +// +// Authenticode SHA-512 digest of the signed image +// +CONST UINT8 mSignedImageDigestSha512[] = { + 0x2b, 0xe2, 0x69, 0xc6, 0xdd, 0xec, 0xc5, 0xc6, 0x97, 0xf5, 0x49, 0xfb, + 0x56, 0x31, 0x4d, 0xf7, 0xb0, 0x2a, 0x75, 0x07, 0x5b, 0x14, 0xa4, 0x54, + 0x01, 0x30, 0x94, 0x38, 0xfa, 0x98, 0x95, 0x8c, 0xa1, 0x72, 0xcf, 0x29, + 0x67, 0x4c, 0xe3, 0x7c, 0xe7, 0xc4, 0x68, 0xb1, 0x38, 0x0c, 0x1d, 0xac, + 0x3e, 0x7e, 0xa8, 0x25, 0x03, 0x90, 0xaf, 0x0c, 0x1a, 0x4f, 0x1a, 0x24, + 0xd2, 0xd1, 0x22, 0xe1, +}; +CONST UINTN mSignedImageDigestSha512Size = sizeof (mSignedImageDigestSha512); + +// +// Authenticode SHA-256 digest of the multi-signed image +// +CONST UINT8 mMultiSignedImageDigestSha256[] = { + 0xf6, 0xf0, 0xe0, 0x42, 0xf3, 0x86, 0xca, 0x95, 0x65, 0x2c, 0x9e, 0x10, + 0x4e, 0xaa, 0xe1, 0x69, 0xd9, 0x52, 0x07, 0x8e, 0x7e, 0x01, 0x4c, 0xd5, + 0x3e, 0x47, 0xf9, 0xc4, 0x61, 0xb3, 0xc2, 0x8a, +}; +CONST UINTN mMultiSignedImageDigestSha256Size = sizeof (mMultiSignedImageDigestSha256); + +// +// Authenticode SHA-384 digest of the multi-signed image +// +CONST UINT8 mMultiSignedImageDigestSha384[] = { + 0x94, 0x90, 0x47, 0x1e, 0xbf, 0x49, 0x4f, 0xc1, 0xa7, 0x15, 0xd6, 0xb4, + 0xe0, 0xc6, 0xc1, 0x61, 0xc3, 0x16, 0x65, 0x5a, 0xaf, 0x3c, 0x7e, 0xc3, + 0x95, 0x8f, 0xb4, 0xad, 0x75, 0xdf, 0x30, 0x16, 0x21, 0x64, 0x97, 0x3c, + 0x5a, 0xe7, 0x37, 0xd6, 0x0a, 0x9b, 0x8f, 0xec, 0x1a, 0xa2, 0x3e, 0xf7, +}; +CONST UINTN mMultiSignedImageDigestSha384Size = sizeof (mMultiSignedImageDigestSha384); + +// +// Authenticode SHA-512 digest of the multi-signed image +// +CONST UINT8 mMultiSignedImageDigestSha512[] = { + 0x2b, 0xe2, 0x69, 0xc6, 0xdd, 0xec, 0xc5, 0xc6, 0x97, 0xf5, 0x49, 0xfb, + 0x56, 0x31, 0x4d, 0xf7, 0xb0, 0x2a, 0x75, 0x07, 0x5b, 0x14, 0xa4, 0x54, + 0x01, 0x30, 0x94, 0x38, 0xfa, 0x98, 0x95, 0x8c, 0xa1, 0x72, 0xcf, 0x29, + 0x67, 0x4c, 0xe3, 0x7c, 0xe7, 0xc4, 0x68, 0xb1, 0x38, 0x0c, 0x1d, 0xac, + 0x3e, 0x7e, 0xa8, 0x25, 0x03, 0x90, 0xaf, 0x0c, 0x1a, 0x4f, 0x1a, 0x24, + 0xd2, 0xd1, 0x22, 0xe1, +}; +CONST UINTN mMultiSignedImageDigestSha512Size = sizeof (mMultiSignedImageDigestSha512); + +// +// DER-encoded X.509 signer 1 leaf signing certificate +// +CONST UINT8 mLeafCert[] = { + 0x30, 0x82, 0x03, 0x71, 0x30, 0x82, 0x02, 0x59, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x71, 0xb5, 0x0a, 0x74, 0x69, 0x1a, 0x2e, 0xf8, 0x57, + 0xff, 0xaa, 0x62, 0x03, 0x18, 0x11, 0xc2, 0x0d, 0x63, 0x88, 0xb4, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, + 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, + 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, + 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, 0x34, + 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x29, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, + 0x54, 0x65, 0x73, 0x74, 0x20, 0x4c, 0x65, 0x61, 0x66, 0x20, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xa1, 0x3b, 0xcf, 0x40, 0x63, 0x36, 0x7e, 0xb4, 0x40, 0x53, 0x74, + 0x5a, 0xc0, 0x02, 0xea, 0xef, 0x3e, 0xe0, 0x4c, 0x12, 0xf3, 0x28, 0x53, + 0x99, 0xa6, 0x48, 0x13, 0xee, 0xc7, 0x00, 0xb8, 0x23, 0x74, 0xf3, 0xf4, + 0x03, 0xc5, 0xed, 0xfb, 0x5a, 0x1a, 0xae, 0x73, 0x6a, 0xfd, 0xee, 0x08, + 0x37, 0x18, 0x2c, 0xe3, 0x5a, 0x98, 0x6f, 0xb3, 0x00, 0x4e, 0x4f, 0xbe, + 0x06, 0xe4, 0xe4, 0xee, 0x24, 0x53, 0xcb, 0xe3, 0xb3, 0x88, 0x6c, 0xeb, + 0xe2, 0x84, 0xd9, 0x1b, 0xd7, 0x06, 0x8d, 0x6d, 0xbc, 0x60, 0xe2, 0xbf, + 0xff, 0x50, 0xd1, 0x92, 0xcc, 0x1d, 0xbb, 0x91, 0x1e, 0x72, 0x39, 0x48, + 0x6c, 0x4f, 0x02, 0x7c, 0x86, 0x34, 0x53, 0xfe, 0xeb, 0x31, 0x10, 0x9d, + 0xa7, 0xa2, 0x12, 0x3e, 0x6b, 0x7b, 0xa3, 0xba, 0xaa, 0x42, 0x18, 0xa3, + 0x0d, 0xb9, 0x2a, 0x56, 0x0b, 0xdc, 0x0f, 0x78, 0x41, 0xd1, 0xe4, 0x12, + 0x2e, 0x26, 0x01, 0x37, 0x32, 0xbf, 0x17, 0x2e, 0x3f, 0x70, 0xdc, 0xac, + 0x26, 0x2c, 0x3f, 0x99, 0xdd, 0xf0, 0xb2, 0x81, 0x92, 0xd8, 0x88, 0xb6, + 0x1c, 0x6e, 0x5b, 0x8a, 0x3d, 0x5a, 0x66, 0x28, 0x1a, 0x6c, 0xf3, 0x7a, + 0x4a, 0x7f, 0x1f, 0x8b, 0x2b, 0x57, 0x94, 0x92, 0xe7, 0x1f, 0x0e, 0x70, + 0x07, 0x6f, 0x0e, 0x48, 0x30, 0xc5, 0x76, 0x11, 0x27, 0x1f, 0x43, 0x17, + 0x4d, 0x8a, 0x2f, 0x65, 0x2e, 0xfb, 0xb6, 0x7c, 0x17, 0x83, 0x77, 0xb2, + 0xa2, 0x7c, 0xb5, 0x54, 0x95, 0x23, 0xbe, 0x3a, 0x40, 0x9b, 0x8a, 0xe2, + 0xa3, 0x94, 0x0c, 0xb1, 0xff, 0x62, 0x4b, 0x74, 0xfc, 0xc1, 0xc4, 0x63, + 0x2e, 0x61, 0xee, 0x09, 0xc5, 0xf6, 0xe4, 0x8f, 0x6a, 0x33, 0x41, 0x3d, + 0x7f, 0x5a, 0x4f, 0xd6, 0x66, 0x33, 0x30, 0x9a, 0x80, 0x4d, 0xf3, 0xbe, + 0x72, 0x3f, 0x86, 0x52, 0x1f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x75, + 0x30, 0x73, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x02, 0x30, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x13, 0x06, 0x03, + 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, + 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x72, 0x8a, 0xd7, 0xd4, 0xaf, 0x15, 0x1e, 0x35, + 0xcf, 0x72, 0x14, 0x49, 0x8b, 0x01, 0xd0, 0xb6, 0x4b, 0x48, 0x1d, 0x23, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, 0xe4, 0x50, 0xed, 0x2f, 0x6f, + 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, 0x5c, 0x76, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x32, 0xcc, 0x95, 0xe4, 0xe2, 0x7e, 0x2c, + 0x74, 0x33, 0x45, 0x7e, 0xd3, 0xcd, 0x0b, 0xda, 0x0e, 0xe7, 0x16, 0x8f, + 0x60, 0xb1, 0x4c, 0x6f, 0x3e, 0xb9, 0xa1, 0xe5, 0x00, 0x2c, 0x9f, 0x5b, + 0x65, 0x8d, 0x4e, 0xc1, 0x74, 0x03, 0x30, 0xf0, 0xc1, 0xbd, 0x33, 0x81, + 0xf1, 0x3b, 0x0d, 0x63, 0x86, 0x7f, 0x0d, 0x68, 0x1c, 0xaf, 0x22, 0xa4, + 0xf1, 0xf2, 0xb7, 0x35, 0x2d, 0x3d, 0xa5, 0xc4, 0x54, 0x0d, 0x16, 0xc8, + 0x7f, 0xc7, 0xe2, 0x5d, 0xba, 0x1c, 0x52, 0xcb, 0x6e, 0x81, 0xe8, 0xb9, + 0x4a, 0x11, 0xb4, 0xf7, 0x70, 0x0b, 0x70, 0xf3, 0xfe, 0x0c, 0xb1, 0x15, + 0x31, 0x57, 0x63, 0x9a, 0xbc, 0xbc, 0x9a, 0xc5, 0x40, 0xab, 0xdd, 0xc3, + 0xc5, 0xc0, 0xfd, 0x47, 0x79, 0x85, 0x96, 0x4c, 0x3d, 0xa4, 0x3e, 0x6e, + 0xaf, 0x30, 0xd2, 0x20, 0x30, 0x6b, 0x32, 0xa3, 0x8d, 0x6c, 0xb7, 0x5e, + 0xa9, 0x9b, 0x31, 0x98, 0x25, 0xed, 0x1f, 0xf6, 0x3c, 0x59, 0xc3, 0x77, + 0xca, 0x83, 0x49, 0x28, 0xe6, 0x20, 0xc4, 0x32, 0xc4, 0x15, 0x15, 0xac, + 0xa7, 0x54, 0xd1, 0xa5, 0xc6, 0xe8, 0xc5, 0x7c, 0x0f, 0x23, 0x31, 0xe3, + 0x06, 0xad, 0x48, 0x9c, 0xf6, 0xb1, 0xd5, 0x9f, 0xed, 0xee, 0xf4, 0x1c, + 0xe3, 0xce, 0x3e, 0xf3, 0x27, 0x28, 0x19, 0x20, 0xb9, 0xcb, 0x4d, 0x85, + 0xdd, 0xf9, 0xc8, 0xec, 0x2e, 0x60, 0xd1, 0xf7, 0x48, 0xba, 0x25, 0xf7, + 0x4f, 0x0e, 0x47, 0x9e, 0xc8, 0xc8, 0xaa, 0x74, 0xb5, 0x5f, 0x90, 0xc6, + 0xfa, 0xb9, 0xdf, 0x95, 0x88, 0xe8, 0x00, 0xc3, 0x90, 0xa6, 0x9f, 0x06, + 0xda, 0xf5, 0x9e, 0x04, 0x55, 0xd7, 0x68, 0xe0, 0x1f, 0x37, 0xbe, 0x4f, + 0xe9, 0x7a, 0x0f, 0x3e, 0xc8, 0x60, 0x84, 0xc3, 0x78, 0x0b, 0xd9, 0xc8, + 0xd9, 0xe9, 0x66, 0xea, 0xd7, 0x5b, 0x83, 0x63, 0x3e, +}; +CONST UINTN mLeafCertSize = sizeof (mLeafCert); + +// +// DER-encoded X.509 signer 1 intermediate 1 CA certificate +// +CONST UINT8 mIntermediate1Cert[] = { + 0x30, 0x82, 0x03, 0x5b, 0x30, 0x82, 0x02, 0x43, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x29, 0xe7, 0xee, 0xbe, 0xd0, 0xf2, 0x0a, 0x30, 0xc2, + 0xd1, 0x41, 0xc9, 0x4d, 0x24, 0xd9, 0x8a, 0xfe, 0x42, 0x3d, 0x85, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, + 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, + 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, + 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x31, 0x20, 0x43, 0x41, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0x99, 0x93, + 0xd5, 0xe0, 0x9e, 0xc7, 0x39, 0xd2, 0x44, 0x31, 0x5f, 0x1c, 0xd3, 0x87, + 0x2c, 0xcf, 0x36, 0xc4, 0xe5, 0x0d, 0xda, 0x60, 0x66, 0x88, 0x05, 0x15, + 0xf6, 0x12, 0xe3, 0x61, 0x73, 0xec, 0xcf, 0x2e, 0xd9, 0xf6, 0x81, 0x1a, + 0xe9, 0x52, 0xa8, 0x37, 0x94, 0x5a, 0xb8, 0x30, 0xb8, 0x10, 0x2e, 0x23, + 0xfe, 0xfd, 0x9e, 0x36, 0x1f, 0x45, 0xe2, 0x8c, 0x87, 0x8e, 0xa2, 0x42, + 0xb2, 0x88, 0xcc, 0xad, 0x79, 0xc6, 0xb7, 0xa2, 0x6f, 0x74, 0x28, 0x6e, + 0x76, 0x62, 0xc4, 0x13, 0xcc, 0x05, 0xac, 0xfe, 0xd4, 0x5e, 0x6c, 0x4d, + 0x19, 0x3f, 0x41, 0xb9, 0x5f, 0x5f, 0xef, 0xeb, 0x0d, 0xf9, 0xaa, 0x65, + 0x62, 0x64, 0x8d, 0x84, 0xc6, 0xd1, 0xf5, 0x24, 0x37, 0x97, 0xf1, 0x52, + 0x9b, 0x98, 0x28, 0x6b, 0x3d, 0xda, 0x2b, 0xdd, 0x68, 0x98, 0x4a, 0x8c, + 0x99, 0xe1, 0xec, 0xf0, 0x22, 0x43, 0x8a, 0x01, 0xeb, 0xa9, 0xf9, 0x3d, + 0x2f, 0x58, 0x62, 0x36, 0x7e, 0xc8, 0x62, 0x01, 0x3f, 0x38, 0xcb, 0x09, + 0x91, 0x52, 0x2b, 0x8a, 0xde, 0x93, 0x44, 0xaa, 0x31, 0x6c, 0x0c, 0x86, + 0x31, 0x4a, 0x89, 0xed, 0x3f, 0x01, 0xc4, 0x88, 0xb2, 0x00, 0x05, 0x25, + 0xeb, 0xa2, 0xa7, 0xe7, 0x98, 0x01, 0xb6, 0x0f, 0x2f, 0x12, 0xbf, 0x32, + 0xe4, 0x95, 0x40, 0x94, 0x12, 0x82, 0xf5, 0xc4, 0x48, 0x35, 0x38, 0x8f, + 0x10, 0xfb, 0xf8, 0x55, 0x23, 0x1c, 0x88, 0x56, 0xa1, 0xa9, 0x84, 0x89, + 0x5b, 0xb9, 0x20, 0xab, 0xd8, 0x46, 0x06, 0xa3, 0x49, 0x0b, 0xfa, 0x95, + 0x5a, 0x80, 0x46, 0x19, 0xe4, 0x46, 0x5a, 0x22, 0xdc, 0x09, 0xb0, 0xa8, + 0xbb, 0xac, 0x2b, 0xb1, 0x39, 0xbd, 0xa1, 0x1e, 0x73, 0xde, 0x87, 0x8f, + 0x87, 0x16, 0xe8, 0x78, 0xcd, 0x04, 0xa8, 0x21, 0xd3, 0x5f, 0x57, 0xcb, + 0x47, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, + 0xe0, 0x88, 0x60, 0x2e, 0x36, 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, + 0x80, 0xa1, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, + 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x07, 0x3d, 0x41, 0xe5, 0x4e, + 0xb5, 0x79, 0x2e, 0xaf, 0x85, 0xa4, 0xd2, 0x86, 0xcc, 0x21, 0x61, 0xc1, + 0x68, 0x0d, 0x6e, 0xac, 0xd9, 0x13, 0x38, 0xed, 0x12, 0x25, 0x96, 0x31, + 0xd7, 0x43, 0xa3, 0xac, 0x49, 0x5d, 0x4b, 0x18, 0x94, 0x39, 0x58, 0x22, + 0x10, 0x6b, 0x49, 0x02, 0xd9, 0x3e, 0x86, 0x75, 0x21, 0xe5, 0x19, 0x95, + 0x28, 0x16, 0x81, 0xf6, 0x42, 0x43, 0x26, 0x16, 0x3c, 0xcd, 0xbd, 0xed, + 0xb4, 0x0c, 0x26, 0xdf, 0xb4, 0x72, 0x53, 0x6b, 0xbc, 0x2c, 0x25, 0x59, + 0x6f, 0xb0, 0x5b, 0x1a, 0x9b, 0x8b, 0xd5, 0xc0, 0xf1, 0x70, 0x7c, 0xae, + 0xdc, 0xfe, 0xa6, 0x3e, 0xe0, 0x2a, 0xc6, 0x87, 0x5a, 0x5f, 0x4f, 0xa2, + 0x47, 0x4e, 0x0c, 0xbf, 0x25, 0xfb, 0x51, 0xdf, 0xda, 0x1f, 0xbb, 0x28, + 0xdf, 0x52, 0x5c, 0x1e, 0xc5, 0x6d, 0x38, 0x37, 0x7f, 0x86, 0xf5, 0xc0, + 0x81, 0xc2, 0x80, 0xab, 0x70, 0xf4, 0x12, 0x83, 0x50, 0x56, 0x19, 0x2a, + 0x06, 0x8b, 0xb2, 0x7e, 0xd8, 0x3b, 0x56, 0xe3, 0xbd, 0x56, 0x1b, 0x3b, + 0x60, 0x90, 0xb6, 0x2c, 0xdb, 0x5b, 0x9a, 0xb0, 0xd8, 0x7a, 0xaa, 0xcc, + 0x02, 0x99, 0x0c, 0xb2, 0x21, 0xc3, 0x02, 0x1c, 0x23, 0xc5, 0x46, 0x93, + 0x2e, 0xc9, 0xf1, 0x3e, 0xec, 0xcd, 0x15, 0x11, 0xc3, 0x94, 0xb1, 0x6a, + 0x10, 0x6f, 0x35, 0x42, 0x91, 0x2a, 0x78, 0xcf, 0x8f, 0x16, 0x1a, 0x82, + 0x8f, 0xae, 0xa8, 0x53, 0x56, 0xb2, 0x7e, 0x3a, 0x2d, 0x52, 0x04, 0x65, + 0xfa, 0xbb, 0xb0, 0xac, 0x6c, 0xb5, 0xf6, 0xbd, 0x05, 0xd4, 0x9f, 0xc3, + 0x8b, 0xca, 0xb0, 0x4f, 0x9f, 0x15, 0x21, 0xba, 0x8a, 0x94, 0x17, 0x53, + 0x13, 0x8b, 0xb7, 0x4d, 0xe9, 0xdc, 0xc7, 0x26, 0x47, 0x02, 0xf0, 0x4b, + 0x75, 0xbe, 0x84, 0x73, 0x02, 0x1e, 0x14, 0x97, 0x99, 0x91, 0x5b, +}; +CONST UINTN mIntermediate1CertSize = sizeof (mIntermediate1Cert); + +// +// DER-encoded X.509 signer 1 intermediate 2 CA certificate +// +CONST UINT8 mIntermediate2Cert[] = { + 0x30, 0x82, 0x03, 0x65, 0x30, 0x82, 0x02, 0x4d, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x2c, 0xcc, 0x3e, 0x1f, 0x6c, 0x46, 0x86, 0x7a, 0x93, + 0x05, 0x4f, 0x73, 0x7b, 0xc5, 0x14, 0x61, 0x37, 0xaa, 0x40, 0x10, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x31, 0x20, + 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, + 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, + 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x3a, + 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, + 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb, 0x80, 0xcb, 0x94, 0xf5, + 0x0d, 0xbf, 0xbf, 0xe4, 0xfc, 0xd2, 0x21, 0x71, 0x5f, 0x1d, 0x25, 0x78, + 0x3c, 0xd2, 0x3a, 0x62, 0x35, 0x1a, 0xa9, 0xa2, 0x13, 0x54, 0x33, 0x73, + 0x6c, 0x39, 0x18, 0x96, 0x8f, 0x0a, 0xe2, 0x01, 0x2c, 0x54, 0x85, 0x3e, + 0xeb, 0xd5, 0xc8, 0xa3, 0xdf, 0xd8, 0x3f, 0x6c, 0x96, 0x4a, 0xc6, 0x19, + 0xbc, 0xfd, 0x7a, 0x9b, 0x28, 0xd0, 0xe9, 0x07, 0x82, 0xeb, 0xdb, 0x42, + 0x6d, 0x9f, 0xb6, 0xac, 0xa3, 0xc1, 0x0a, 0xff, 0x58, 0x85, 0x10, 0x31, + 0x0e, 0xf4, 0xb2, 0xb2, 0x49, 0xb0, 0x72, 0x4a, 0x81, 0x93, 0x60, 0x11, + 0x40, 0xde, 0xc4, 0x91, 0xfb, 0xcc, 0x45, 0x21, 0xfa, 0x4c, 0x81, 0x2a, + 0xf4, 0xc5, 0x27, 0x70, 0x74, 0x50, 0x82, 0x6f, 0x5f, 0xda, 0x94, 0xf1, + 0xda, 0xbc, 0x74, 0x98, 0x56, 0xcd, 0xe5, 0x82, 0xa7, 0x17, 0xd3, 0x45, + 0x36, 0x05, 0x6a, 0x3d, 0xc5, 0x35, 0x61, 0xda, 0x44, 0xbb, 0x87, 0x25, + 0xc9, 0xcd, 0x52, 0x55, 0xd9, 0x43, 0x24, 0xa6, 0xeb, 0x13, 0x29, 0xec, + 0x9b, 0x4a, 0xb2, 0x21, 0x99, 0xd3, 0xec, 0x9f, 0xf6, 0x1a, 0x2e, 0x4f, + 0x6c, 0x51, 0x96, 0xc0, 0x6a, 0xb8, 0x10, 0x6e, 0x75, 0x2d, 0x0f, 0x09, + 0x53, 0x92, 0x28, 0xd8, 0x8f, 0xe7, 0x4a, 0x92, 0x40, 0x1b, 0xdb, 0x93, + 0x30, 0xc7, 0x6e, 0x42, 0x60, 0x6a, 0xe2, 0x2b, 0x29, 0x94, 0x70, 0x3f, + 0xb3, 0xf0, 0xf1, 0x18, 0x84, 0xb7, 0x6d, 0xb8, 0x29, 0xcb, 0x72, 0x08, + 0xcb, 0x27, 0x18, 0xe1, 0x0a, 0x9c, 0xc3, 0x0b, 0x62, 0x77, 0xbc, 0x1f, + 0xb4, 0x56, 0x48, 0xa7, 0xdb, 0xf3, 0x29, 0x33, 0xe6, 0x97, 0xb8, 0x2f, + 0x6c, 0x52, 0xa8, 0xdd, 0xf2, 0x82, 0xfa, 0xcc, 0xf1, 0xcc, 0x0d, 0x0b, + 0xaa, 0xf9, 0x34, 0x6e, 0x9a, 0x48, 0x9b, 0x44, 0x43, 0x70, 0xe3, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, + 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, 0xe4, 0x50, + 0xed, 0x2f, 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, 0x5c, 0x76, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, 0x88, 0x60, 0x2e, 0x36, + 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, 0xa1, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x68, 0x6c, 0x45, 0xf9, 0xea, 0x75, 0xac, + 0xbf, 0xfc, 0x1b, 0xcc, 0x42, 0xa1, 0x55, 0xb7, 0x19, 0xb9, 0x67, 0x83, + 0x0c, 0x15, 0x94, 0xdb, 0x1b, 0x31, 0x33, 0xf5, 0xff, 0x6b, 0xae, 0xb9, + 0x06, 0x7e, 0xd1, 0x19, 0x2e, 0x97, 0x84, 0xd7, 0xd7, 0xc5, 0x23, 0xac, + 0x21, 0xb8, 0x70, 0xd4, 0xa7, 0x5e, 0x3c, 0xf9, 0x83, 0x68, 0xc4, 0xc1, + 0x7b, 0xb7, 0x86, 0xc1, 0x11, 0xd7, 0xd7, 0xa1, 0x63, 0x8a, 0x04, 0x10, + 0x03, 0x34, 0x5f, 0x04, 0x6c, 0x18, 0x37, 0xb1, 0x9c, 0xe9, 0x2e, 0x24, + 0xd1, 0x10, 0xb8, 0x69, 0x05, 0x96, 0x2a, 0x30, 0xd9, 0x12, 0x9e, 0xdb, + 0xfb, 0x12, 0x5e, 0x2b, 0x7b, 0xc7, 0x55, 0x32, 0xa0, 0x87, 0x16, 0xdb, + 0x2f, 0x5f, 0x12, 0x70, 0xff, 0x76, 0xe9, 0x05, 0x62, 0xfb, 0xe1, 0x03, + 0x51, 0xe7, 0x87, 0xa0, 0x50, 0x63, 0xbc, 0xe9, 0x6a, 0x4f, 0x47, 0xd9, + 0xde, 0xe8, 0x28, 0xd0, 0x69, 0xcf, 0x29, 0x35, 0x7c, 0x3c, 0x7f, 0x29, + 0x65, 0xb0, 0x2f, 0x69, 0xba, 0xa2, 0x20, 0x90, 0xf0, 0x75, 0xd1, 0x02, + 0xf6, 0xae, 0xd0, 0x5f, 0xbe, 0x5d, 0xce, 0x6d, 0xce, 0x76, 0xc6, 0x61, + 0x0f, 0x75, 0xdb, 0x3f, 0x08, 0xaf, 0x96, 0x15, 0x95, 0x57, 0x7d, 0xa1, + 0x80, 0x59, 0x4c, 0xba, 0x3b, 0x95, 0x6b, 0x78, 0xee, 0xc1, 0xad, 0x5a, + 0x68, 0xa0, 0x6e, 0x25, 0x86, 0x58, 0xa2, 0x46, 0xee, 0x62, 0xf7, 0x88, + 0x28, 0xbb, 0x60, 0x33, 0x32, 0xf4, 0xce, 0x5f, 0x86, 0x3a, 0xd3, 0x2a, + 0xe3, 0x3e, 0x2d, 0xda, 0x59, 0xc1, 0xab, 0x90, 0x8c, 0xc9, 0xa9, 0x78, + 0x8b, 0xb7, 0x4c, 0x43, 0xc2, 0x53, 0x3d, 0x92, 0x20, 0xdf, 0xf2, 0x55, + 0xb0, 0x2b, 0xc9, 0x2b, 0x36, 0xf3, 0xbe, 0xd2, 0x3f, 0x9d, 0x8c, 0x32, + 0x99, 0x38, 0xf7, 0x15, 0x20, 0xb9, 0xf3, 0x4b, 0x03, +}; +CONST UINTN mIntermediate2CertSize = sizeof (mIntermediate2Cert); + +// +// DER-encoded X.509 signer 1 root CA certificate +// +CONST UINT8 mRootCert[] = { + 0x30, 0x82, 0x03, 0x51, 0x30, 0x82, 0x02, 0x39, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x15, 0x68, 0xb3, 0x37, 0x3a, 0x6a, 0x85, 0x56, 0xc8, + 0x38, 0x5a, 0xcc, 0xcc, 0x2c, 0xda, 0xac, 0x35, 0x6a, 0x40, 0x9e, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, + 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, + 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, + 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbe, + 0x63, 0xe7, 0x31, 0xf6, 0xc3, 0x1d, 0x9d, 0xd3, 0x47, 0x42, 0x28, 0x5c, + 0x1c, 0xf0, 0xc6, 0x00, 0xfa, 0x70, 0x23, 0x7a, 0xe5, 0x8b, 0x32, 0xb3, + 0xd7, 0x09, 0x80, 0xde, 0xb4, 0x6b, 0x02, 0x0e, 0x20, 0x42, 0x34, 0x74, + 0x94, 0x66, 0xeb, 0x32, 0xeb, 0x95, 0xb6, 0x95, 0xe4, 0x6a, 0xb9, 0x85, + 0x08, 0xee, 0xd6, 0x8f, 0x61, 0xd6, 0x23, 0x3c, 0xb2, 0xa0, 0x38, 0xfb, + 0x48, 0x26, 0xc9, 0x4a, 0x4f, 0x68, 0x4c, 0x9a, 0x93, 0x84, 0x75, 0x72, + 0x7d, 0xa5, 0xac, 0xed, 0xab, 0x21, 0x71, 0x1c, 0x34, 0x64, 0x07, 0x2f, + 0xe5, 0x1f, 0xb4, 0xeb, 0x31, 0x6d, 0xc9, 0x9b, 0x7c, 0xe8, 0xcc, 0x49, + 0xdc, 0x7d, 0x27, 0x08, 0x9d, 0xa2, 0x91, 0xf3, 0x9d, 0xad, 0xa0, 0xaa, + 0x21, 0x53, 0x76, 0xa7, 0x81, 0x04, 0x1a, 0x74, 0x89, 0xd6, 0x45, 0x72, + 0x7c, 0x37, 0x22, 0xa4, 0xf7, 0x36, 0x5b, 0x80, 0xce, 0xe2, 0x91, 0x60, + 0xee, 0x91, 0xef, 0xc0, 0x25, 0x92, 0x05, 0xa3, 0x24, 0xa2, 0x4c, 0xa2, + 0x93, 0xd0, 0x80, 0x61, 0xc0, 0x9c, 0xdf, 0xc1, 0xeb, 0xed, 0x2e, 0x23, + 0x30, 0xe8, 0xd8, 0xea, 0xc4, 0x5b, 0x2a, 0x4c, 0x00, 0xa4, 0xdf, 0xa2, + 0xa3, 0x39, 0x32, 0x80, 0xb2, 0x1d, 0x81, 0xa9, 0x26, 0x43, 0x07, 0xc5, + 0xf0, 0x8d, 0x2c, 0x61, 0x70, 0xbf, 0xfd, 0xa1, 0x33, 0xd1, 0x47, 0x59, + 0x41, 0xc7, 0x17, 0xe6, 0xdd, 0x4b, 0x99, 0x97, 0xb6, 0xc3, 0x39, 0x80, + 0xfa, 0x78, 0x61, 0x6f, 0xc7, 0xbf, 0x6c, 0x88, 0xd9, 0xd6, 0xc2, 0x60, + 0xbe, 0x83, 0x67, 0xd3, 0x38, 0xf9, 0x73, 0xc5, 0x64, 0x4e, 0xc2, 0xbb, + 0x0f, 0xb8, 0x24, 0xf5, 0x29, 0x86, 0xb2, 0x35, 0x9a, 0x74, 0x14, 0xdf, + 0xef, 0x92, 0xcc, 0xec, 0x5e, 0x46, 0x80, 0xe8, 0xf2, 0xc3, 0x4a, 0xbd, + 0xb7, 0x78, 0xad, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa6, + 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, + 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x1f, 0x06, 0x03, 0x55, + 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, + 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, + 0xe7, 0x86, 0xef, 0x16, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x9b, 0x0d, 0xd9, + 0x6c, 0xf4, 0x0b, 0x08, 0xea, 0xfd, 0x75, 0xac, 0x4a, 0xcc, 0xf6, 0xdf, + 0x33, 0x62, 0x6b, 0x0c, 0x93, 0x50, 0x73, 0x4a, 0x60, 0x67, 0xde, 0x0d, + 0x24, 0x95, 0x4c, 0x4b, 0x75, 0xb3, 0xec, 0x0e, 0xe3, 0x3a, 0xc6, 0x4c, + 0xe3, 0x93, 0xf0, 0x9c, 0xa4, 0xfe, 0x2c, 0x87, 0x9c, 0x7c, 0x4d, 0x7b, + 0x18, 0x1b, 0x93, 0x5f, 0x2e, 0xda, 0x88, 0xef, 0x11, 0x8b, 0x2a, 0xa3, + 0x20, 0xbb, 0x22, 0xc0, 0x73, 0x59, 0xd9, 0x13, 0x35, 0xac, 0x40, 0x21, + 0x1e, 0xd2, 0xab, 0x5a, 0xcd, 0x80, 0x82, 0x36, 0x64, 0x11, 0x84, 0x11, + 0x4f, 0xf0, 0x60, 0x52, 0x3f, 0x2c, 0xe4, 0xc8, 0x47, 0xd8, 0x36, 0xc5, + 0x50, 0x8a, 0x8f, 0x8f, 0x13, 0x40, 0x3b, 0xda, 0x2b, 0x05, 0x17, 0x7c, + 0x44, 0x5f, 0x05, 0xde, 0x67, 0xcc, 0x17, 0x04, 0xdb, 0xcc, 0xee, 0x6e, + 0x1c, 0xaf, 0xf4, 0x66, 0x9c, 0x7d, 0x72, 0x91, 0x9f, 0x6f, 0x42, 0x78, + 0x10, 0x90, 0xd5, 0xfa, 0xd4, 0x1b, 0xac, 0x56, 0x02, 0xf4, 0x00, 0x48, + 0x6b, 0x56, 0x05, 0x32, 0xb5, 0x0a, 0x16, 0x14, 0x56, 0x14, 0xfa, 0x49, + 0x99, 0x59, 0x62, 0xed, 0xda, 0x99, 0x48, 0x88, 0x18, 0x20, 0x77, 0xfe, + 0xbf, 0x6c, 0xcc, 0x5b, 0x53, 0xab, 0x2b, 0x93, 0x6a, 0x5d, 0xce, 0xf8, + 0x5e, 0xfa, 0x71, 0xc5, 0x79, 0x6a, 0xba, 0x49, 0x00, 0x6a, 0x0f, 0x0e, + 0x40, 0xb5, 0x79, 0xa4, 0x93, 0x14, 0xa5, 0x2c, 0x24, 0x2d, 0x76, 0xa4, + 0x05, 0x60, 0x93, 0x8d, 0x50, 0xe8, 0x2b, 0xcf, 0x51, 0xe3, 0xdc, 0x8d, + 0x72, 0xa2, 0xae, 0xf1, 0x76, 0x5e, 0xba, 0xb2, 0xa9, 0x48, 0x20, 0x53, + 0xbc, 0x80, 0xf7, 0x35, 0xae, 0x41, 0x77, 0xef, 0x6a, 0x74, 0xeb, 0xa1, + 0x68, 0xc5, 0x83, 0x13, 0x50, 0xd8, 0xfc, 0x52, 0x18, 0xa3, 0x76, 0x1d, + 0x50, +}; +CONST UINTN mRootCertSize = sizeof (mRootCert); + +// +// DER-encoded X.509 certificate for signer 2 +// +CONST UINT8 mSigner2Cert[] = { + 0x30, 0x82, 0x03, 0x43, 0x30, 0x82, 0x02, 0x2b, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x6d, 0x0c, 0xf0, 0x2d, 0x05, 0x1d, 0xa2, 0xa3, 0xa4, + 0x71, 0x77, 0xf8, 0xce, 0xcd, 0xaa, 0xc1, 0xcc, 0xa9, 0xd0, 0x16, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x26, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, + 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, + 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, + 0x5a, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x26, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, + 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x69, 0x67, 0x6e, + 0x65, 0x72, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xde, 0xab, 0x0d, 0xae, 0x9a, 0x98, 0x07, 0x9e, 0xa0, 0xb4, 0x9b, + 0x95, 0xa8, 0x74, 0x7c, 0x13, 0x03, 0xf9, 0x53, 0xb1, 0x4a, 0xc4, 0x35, + 0xa3, 0xc1, 0xf8, 0xce, 0xcd, 0x42, 0x59, 0x88, 0xe7, 0x91, 0xb7, 0xf2, + 0xd3, 0x6d, 0xb3, 0x29, 0x34, 0x3d, 0x8f, 0x0e, 0xfc, 0x53, 0x73, 0x3a, + 0x8b, 0x55, 0x72, 0xb2, 0x9c, 0x7b, 0xe1, 0x88, 0xc9, 0xb8, 0x0d, 0x7b, + 0x90, 0xf8, 0x31, 0x3a, 0x87, 0x98, 0x12, 0x43, 0xc7, 0xed, 0xc0, 0x69, + 0x87, 0x2f, 0xfa, 0xa2, 0xbc, 0x6f, 0x32, 0x22, 0xfe, 0x83, 0x71, 0xcd, + 0x23, 0x23, 0x91, 0x98, 0xc2, 0xb1, 0xdf, 0xf3, 0x29, 0x1b, 0xfd, 0x11, + 0x97, 0x9e, 0x1d, 0xfe, 0x30, 0xb5, 0x5a, 0x41, 0x3c, 0x40, 0x30, 0x0a, + 0xed, 0x0b, 0xec, 0xca, 0x9d, 0xd6, 0xf0, 0x0b, 0xba, 0x6b, 0x98, 0xef, + 0x65, 0xb8, 0x0e, 0x08, 0x40, 0x70, 0xec, 0xee, 0x83, 0x21, 0x38, 0x82, + 0x20, 0xba, 0x6b, 0xeb, 0xa6, 0xcc, 0xb2, 0xa3, 0x35, 0x48, 0x3b, 0x72, + 0xc0, 0x89, 0xee, 0x3a, 0x9f, 0x14, 0x87, 0x96, 0x13, 0x05, 0x1a, 0x03, + 0xcb, 0xd6, 0x1b, 0xad, 0x0b, 0x27, 0x73, 0xb0, 0xe7, 0x5d, 0x0c, 0x0b, + 0x0d, 0x60, 0xe0, 0x25, 0xfa, 0xf0, 0xe9, 0x7a, 0x44, 0xf1, 0x5d, 0x51, + 0x09, 0x3e, 0x40, 0x99, 0x3a, 0xe3, 0xe8, 0x53, 0x30, 0xad, 0xe0, 0x70, + 0x66, 0x38, 0x3d, 0xf1, 0x7e, 0x0e, 0xd4, 0xce, 0x8f, 0x07, 0xf4, 0x17, + 0x2a, 0x5f, 0xca, 0xc8, 0xd0, 0x29, 0xea, 0x4e, 0x1c, 0x8d, 0xd0, 0x67, + 0x5b, 0x0b, 0x63, 0x31, 0xdc, 0xd5, 0xc8, 0x00, 0x8e, 0x87, 0xcc, 0x29, + 0xb6, 0x2a, 0xc0, 0x90, 0xea, 0x02, 0x53, 0x9e, 0x9d, 0x37, 0x49, 0x52, + 0xc5, 0xc3, 0xed, 0x75, 0xac, 0x05, 0x01, 0x52, 0x30, 0xf0, 0x86, 0x4e, + 0x1a, 0xc1, 0x83, 0x79, 0xf9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x53, + 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x07, 0x9f, 0xc5, 0xe7, 0x69, 0x95, 0x88, 0xf0, 0xd2, 0xfd, 0x64, + 0xbd, 0xe1, 0x7e, 0x9b, 0xac, 0xff, 0x11, 0x13, 0x65, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x07, 0x9f, + 0xc5, 0xe7, 0x69, 0x95, 0x88, 0xf0, 0xd2, 0xfd, 0x64, 0xbd, 0xe1, 0x7e, + 0x9b, 0xac, 0xff, 0x11, 0x13, 0x65, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x2d, 0x5c, 0x25, 0x72, 0x40, + 0xc6, 0xa5, 0xd3, 0x43, 0xaa, 0x55, 0x97, 0xa5, 0x7d, 0xc7, 0x3d, 0x6b, + 0x77, 0xf2, 0xa3, 0xec, 0x14, 0xdd, 0xa4, 0x82, 0x61, 0x98, 0x7d, 0xce, + 0x4f, 0x4a, 0x68, 0x08, 0x9d, 0xe7, 0x4e, 0x8e, 0xab, 0x76, 0x5f, 0x52, + 0xae, 0xd5, 0x45, 0xb0, 0x14, 0x98, 0x8e, 0x0f, 0xdc, 0xd9, 0xe8, 0x5d, + 0xc3, 0xa3, 0x8c, 0x7d, 0xcf, 0x3c, 0x84, 0x50, 0x41, 0xef, 0xa6, 0x95, + 0x77, 0xc9, 0x46, 0x61, 0x67, 0xa4, 0x1b, 0xdc, 0xe2, 0x6d, 0xef, 0x0f, + 0x1a, 0x0e, 0xd7, 0x3b, 0xdf, 0x10, 0xe5, 0xd4, 0x42, 0x0d, 0x14, 0x42, + 0xed, 0xce, 0xfa, 0xa9, 0x5a, 0x1c, 0x10, 0xc2, 0xc7, 0x34, 0xd2, 0xc1, + 0x7c, 0xff, 0x33, 0x08, 0x71, 0x3c, 0x6d, 0x23, 0x03, 0x62, 0xae, 0x63, + 0x93, 0xea, 0x44, 0xa9, 0x06, 0x28, 0x7b, 0x72, 0x01, 0xaf, 0x9a, 0xb6, + 0xd2, 0x48, 0xa6, 0x7b, 0x3a, 0xf2, 0xf8, 0x6e, 0xb6, 0xa1, 0xb7, 0xd5, + 0xa9, 0x3e, 0x8a, 0x04, 0x7f, 0x1f, 0x6e, 0x37, 0xfa, 0x1e, 0xfc, 0x79, + 0x18, 0x29, 0x73, 0x59, 0xfa, 0xc3, 0xb9, 0x44, 0x8a, 0x43, 0xf0, 0x4a, + 0x4a, 0x8e, 0xb5, 0x17, 0xee, 0x4c, 0x5c, 0xbd, 0x7d, 0x25, 0x8b, 0x30, + 0x29, 0x23, 0x68, 0xbb, 0x44, 0xed, 0x45, 0xb7, 0xf2, 0x6a, 0x95, 0x79, + 0x64, 0x95, 0x45, 0x8a, 0x81, 0xbb, 0xf5, 0x39, 0xb6, 0xde, 0xdb, 0x18, + 0x0d, 0x05, 0x1b, 0x83, 0x7e, 0xce, 0x93, 0xc8, 0x8c, 0xeb, 0x13, 0x22, + 0x4b, 0xc6, 0x54, 0x8c, 0x23, 0x8e, 0x7c, 0x99, 0x8b, 0xae, 0xb3, 0xb1, + 0x1f, 0x00, 0xfd, 0x1f, 0x92, 0x2d, 0xa5, 0x3a, 0xe1, 0x78, 0x76, 0x78, + 0x05, 0x8a, 0x61, 0x62, 0x5d, 0x99, 0x73, 0x8b, 0x22, 0x6f, 0x07, 0x7a, + 0xb3, 0x5d, 0xd3, 0x4c, 0xe4, 0xfc, 0xa9, 0x97, 0xe6, 0xb0, 0x66, +}; +CONST UINTN mSigner2CertSize = sizeof (mSigner2Cert); + +// +// DER-encoded X.509 certificate embedded in signer 2's signature but unrelated to its chain +// +CONST UINT8 mSigner2UnrelatedCert[] = { + 0x30, 0x82, 0x03, 0x53, 0x30, 0x82, 0x02, 0x3b, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x6c, 0x76, 0x71, 0x78, 0x96, 0x78, 0x58, 0x91, 0x7a, + 0x6e, 0x6d, 0x0d, 0xe4, 0x80, 0x55, 0xfc, 0x4f, 0x51, 0xca, 0x61, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x39, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x20, + 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, + 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, + 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, 0x39, 0x31, + 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, + 0x65, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xbc, 0x34, 0x39, 0x35, 0x9d, 0xb6, 0x0f, + 0x82, 0xec, 0x8a, 0xa5, 0x1a, 0x7d, 0xd8, 0x0f, 0xdc, 0x0b, 0xb6, 0xd6, + 0xb8, 0x7f, 0xe4, 0x4c, 0xf0, 0x7b, 0x5c, 0x5e, 0x1d, 0xa0, 0xbb, 0x68, + 0x77, 0x7a, 0x59, 0x62, 0xdb, 0xa9, 0xbc, 0xde, 0x59, 0xa3, 0x06, 0x32, + 0x4e, 0xe2, 0x2d, 0x04, 0x45, 0x01, 0xd0, 0x5b, 0x2f, 0x3b, 0x2d, 0xa7, + 0x58, 0x98, 0x89, 0xc1, 0x31, 0xbc, 0x17, 0x05, 0x5c, 0x17, 0x16, 0xdb, + 0x06, 0xe0, 0x36, 0x47, 0x62, 0x30, 0x4c, 0x17, 0x9e, 0x2e, 0xc2, 0x7b, + 0x60, 0x70, 0x01, 0x15, 0x49, 0x9f, 0x26, 0xf7, 0x96, 0xd3, 0x48, 0xc3, + 0x9d, 0xdb, 0x81, 0x50, 0x1e, 0x68, 0x1d, 0x2a, 0x3f, 0xb2, 0xad, 0x54, + 0x64, 0xee, 0x93, 0x93, 0x37, 0xd7, 0x8c, 0xa5, 0xb9, 0x02, 0xaa, 0x72, + 0xee, 0x57, 0x41, 0x35, 0x44, 0x78, 0xa8, 0x5c, 0x2a, 0xb1, 0x05, 0x41, + 0xab, 0x3a, 0xcc, 0xa2, 0xfd, 0xff, 0x9d, 0x7b, 0xd6, 0xb3, 0x70, 0x6a, + 0xdd, 0x06, 0x36, 0x0b, 0x0a, 0x9b, 0x1f, 0x32, 0xe8, 0x70, 0xe9, 0x73, + 0x75, 0x8f, 0xd4, 0xa4, 0xd5, 0xb2, 0x3b, 0xfc, 0x31, 0x9a, 0x70, 0x63, + 0x53, 0xe6, 0xc5, 0x9a, 0x34, 0x3d, 0x24, 0x6f, 0x95, 0x94, 0xb3, 0x6a, + 0x32, 0xfe, 0x0e, 0x83, 0x94, 0x40, 0x1f, 0x43, 0x0e, 0xf4, 0xdb, 0x2d, + 0x91, 0x47, 0x09, 0x4b, 0xe6, 0xfc, 0x02, 0x29, 0x89, 0xa2, 0xe3, 0xb8, + 0xc6, 0xed, 0x63, 0x67, 0x7d, 0xdf, 0x53, 0x5a, 0x39, 0x13, 0x7c, 0x0f, + 0xd3, 0x92, 0xea, 0x5b, 0xed, 0xc3, 0x20, 0x52, 0x1b, 0x70, 0x63, 0xae, + 0xb8, 0xe9, 0x50, 0x28, 0xc8, 0x20, 0x99, 0x4e, 0x72, 0xd8, 0x00, 0xbe, + 0x6b, 0xd9, 0x8e, 0x17, 0xa1, 0x8a, 0xcc, 0xf8, 0xcb, 0x04, 0x7d, 0x05, + 0x59, 0x1c, 0x1b, 0xe2, 0x1c, 0x8c, 0x3b, 0x16, 0xbd, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x53, 0x20, 0xdd, 0x71, 0xbb, 0xdc, 0x1d, + 0xf6, 0xb3, 0xd6, 0x20, 0xcb, 0x13, 0x5a, 0x14, 0x59, 0x50, 0xdc, 0x89, + 0xe4, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0x53, 0x20, 0xdd, 0x71, 0xbb, 0xdc, 0x1d, 0xf6, 0xb3, 0xd6, + 0x20, 0xcb, 0x13, 0x5a, 0x14, 0x59, 0x50, 0xdc, 0x89, 0xe4, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x33, + 0xc2, 0x25, 0x24, 0xbc, 0x09, 0xba, 0x02, 0xc6, 0xa5, 0x2f, 0xf9, 0x93, + 0x30, 0x9c, 0x70, 0x65, 0x79, 0x95, 0x29, 0xc4, 0x2f, 0xb8, 0x2a, 0x9a, + 0xa2, 0x81, 0x22, 0x67, 0xfd, 0x94, 0xb1, 0x94, 0x32, 0x35, 0xa6, 0xec, + 0xce, 0x05, 0x78, 0x45, 0x31, 0x02, 0xd2, 0x89, 0xd3, 0x22, 0x17, 0xe5, + 0x2c, 0xf9, 0xa1, 0x86, 0xe7, 0x86, 0x84, 0x1a, 0x55, 0xc0, 0x4a, 0xbd, + 0xd2, 0x58, 0x5f, 0x56, 0x56, 0xb0, 0x96, 0x5e, 0x08, 0x9b, 0x0f, 0xf9, + 0xde, 0x1a, 0x49, 0x9e, 0x6c, 0xa1, 0xa6, 0xc7, 0x50, 0x2b, 0x15, 0x56, + 0x9a, 0xe8, 0x2a, 0x6e, 0x2c, 0x47, 0x9e, 0x93, 0x89, 0x72, 0x8a, 0x44, + 0x6f, 0x2e, 0xfc, 0xdf, 0x5c, 0xf8, 0xfb, 0xe5, 0xb9, 0xf9, 0x0a, 0x44, + 0xf0, 0x5b, 0x97, 0xd5, 0x18, 0x54, 0x08, 0xbd, 0xd8, 0xc5, 0x69, 0x4f, + 0x19, 0x0c, 0x1e, 0xe5, 0xd6, 0x65, 0xe6, 0xf2, 0x37, 0xdc, 0xf5, 0x8d, + 0x01, 0x2a, 0x4b, 0x5c, 0x47, 0xa1, 0xf5, 0xfa, 0x9a, 0xc7, 0xa4, 0x5b, + 0xc4, 0xa5, 0x3c, 0xc1, 0x3a, 0xae, 0xf7, 0x06, 0xe1, 0x32, 0xc3, 0xde, + 0x75, 0x76, 0xec, 0x08, 0x9c, 0x22, 0xfa, 0xc6, 0x3f, 0x60, 0x68, 0x02, + 0xaf, 0x49, 0x7e, 0x3f, 0xd4, 0x29, 0xca, 0x1a, 0x68, 0x95, 0x72, 0x0e, + 0x9b, 0x16, 0xd3, 0x95, 0xe7, 0xb7, 0x54, 0x57, 0x51, 0xdf, 0x14, 0x95, + 0x63, 0xf9, 0xa3, 0xa2, 0xa1, 0x8c, 0xeb, 0x96, 0x38, 0xe2, 0xf5, 0x3f, + 0x9f, 0x86, 0x2f, 0x52, 0x96, 0xe0, 0x0f, 0xbf, 0x06, 0xd5, 0x64, 0x25, + 0x2e, 0xd8, 0x7e, 0x34, 0xf7, 0x55, 0xd1, 0xb8, 0x4b, 0x3b, 0x15, 0xc1, + 0x7a, 0x3e, 0xc7, 0x3b, 0xab, 0x68, 0xb3, 0x43, 0xa2, 0xdb, 0xda, 0x94, + 0x45, 0x91, 0xb5, 0x64, 0x7f, 0x0f, 0xad, 0x16, 0x52, 0xca, 0x8e, 0xf0, + 0xdb, 0x44, 0xf7, +}; +CONST UINTN mSigner2UnrelatedCertSize = sizeof (mSigner2UnrelatedCert); diff --git a/SecurityPkg/Test/ShellTest/ImageValidationTestApp/GenTestData.py b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/GenTestData.py new file mode 100644 index 00000000000..f7c93b0c050 --- /dev/null +++ b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/GenTestData.py @@ -0,0 +1,552 @@ +# @file +# Sign EFI images and generate the per-architecture test-data C files consumed by +# ImageValidationTestApp. +# +# Rerun this script whenever the input images or the desired signing topology change. +# Every generated file carries a header pointing back here, so this module docstring +# (and `--help`) is the only place the workflow is documented. +# +# Given one unsigned EFI image per architecture, this script: +# 1. Generates signer 1's four-certificate chain (root CA -> intermediate 1 CA -> +# intermediate 2 CA -> leaf) plus signer 2 (a single self-signed signer) and a couple +# of unrelated decoy certificates with openssl. +# 2. Signs each image with the leaf certificate, embedding the intermediate 2 + +# intermediate 1 + root chain, and additionally with signer 2 for the multi-signed +# image (appending a second WIN_CERTIFICATE that also embeds the unrelated decoy +# certificates) using sbsign. +# 3. Computes the Authenticode SHA-256, SHA-384, and SHA-512 digests of each image, +# matching the hashes that SecurityPkg's DxeImageVerificationLib (HashPeImage) computes. +# Each digest is identical for the unsigned, signed, and multi-signed forms of the same +# image. +# 4. Emits the per-architecture C files X64/TestData.c and Aarch64/TestData.c, each +# containing that architecture's images, digests, signer 1's leaf / intermediate 1 / +# intermediate 2 / root certificates, signer 2's certificate, and one unrelated +# certificate. +# +# Inputs +# ------ +# --x64-image Unsigned X64 PE/COFF EFI image to sign. +# --aarch64-image Unsigned AARCH64 PE/COFF EFI image to sign. +# See `--help` for the remaining options (--output-dir, --openssl, --sbsign, --workdir, --keep). +# +# Outputs +# ------- +# X64/TestData.c X64 image bytes, digests, and certificates. +# Aarch64/TestData.c AARCH64 image bytes, digests, and certificates. +# +# Tool requirements +# ----------------- +# - python3 +# - openssl +# - sbsign ( Linux-native, use WSL on Windows) +# openssl and sbsign must be on PATH unless overridden with --openssl / --sbsign. +# Ubuntu/Debian: sudo apt update && sudo apt install -y python3 openssl sbsigntool +# +# Usage +# ----- +# Run from this directory (SecurityPkg/Test/ShellTest/ImageValidationTestApp). +# +# # Both architectures. +# python3 GenTestData.py --x64-image X64/HelloWorld.efi --aarch64-image Aarch64/HelloWorld.efi +# +# # A single architecture. +# python3 GenTestData.py --x64-image X64/HelloWorld.efi +# python3 GenTestData.py --aarch64-image Aarch64/HelloWorld.efi +# +# # Windows: run through WSL because the signing tools are Linux-native. +# wsl bash -lc "python3 GenTestData.py --x64-image X64/HelloWorld.efi --aarch64-image Aarch64/HelloWorld.efi" +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +## + +import argparse +import hashlib +import os +import shutil +import struct +import subprocess +import sys +import tempfile + +FILE_HEADER = """\ +/** @file + Test data for the Image Verification unit test application. + + This file is GENERATED by GenTestData.py. Do not edit by hand; rerun the script against + the desired binaries to regenerate it. + + Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "TestData.h" +""" + + +def emit_array(symbol, description, data): + """Render one byte array and its size symbol as C source text. + + The returned text contains a short comment block, a CONST UINT8 array, and + a matching CONST UINTN size definition. + """ + lines = [] + lines.append("") + lines.append("//") + lines.append(f"// {description}") + lines.append("//") + lines.append(f"CONST UINT8 {symbol}[] = {{") + if len(data) == 0: + # An empty array is not valid C; keep a single zero byte placeholder. + data = b"\x00" + for offset in range(0, len(data), 12): + chunk = data[offset:offset + 12] + lines.append(" " + "".join(f"0x{b:02x}, " for b in chunk).rstrip()) + lines.append("};") + lines.append(f"CONST UINTN {symbol}Size = sizeof ({symbol});") + return "\n".join(lines) + "\n" + + +def read_file(path): + """Read a file as bytes and return its contents.""" + with open(path, "rb") as handle: + return handle.read() + + +def write_c_file(path, arrays): + """Write a generated C file for the provided arrays. + + Each array entry is a tuple of (symbol, description, data). The file is + emitted with CRLF line endings to match EDK2 source formatting. + """ + body = FILE_HEADER + for symbol, description, data in arrays: + body += emit_array(symbol, description, data) + + # Normalize to CRLF line endings per EDK2 coding standards, then write in + # binary mode so newlines are not translated again by the platform. + body = body.replace("\r\n", "\n").replace("\n", "\r\n") + + output_dir = os.path.dirname(path) + if output_dir: + os.makedirs(output_dir, exist_ok=True) + + with open(path, "wb") as handle: + handle.write(body.encode("ascii")) + + print(f"Wrote {path}") + + +def run(cmd): + """Run a subprocess command and require a zero exit status.""" + subprocess.run(cmd, check=True) + + +def tool_path(name, override): + """Resolve the path to a required external tool. + + An explicit override wins. Otherwise PATH is searched. The process exits + with a descriptive error if the tool cannot be found. + """ + path = override or shutil.which(name) + if path is None: + sys.exit(f"error: required tool '{name}' was not found on PATH; install it or pass --{name} PATH") + return path + + +def generate_signer(openssl, workdir, stem, common_name): + """Create a self-signed RSA test signer. + + Returns a tuple of (key_pem_path, cert_pem_path, cert_der_bytes). + """ + key_pem = os.path.join(workdir, stem + ".key.pem") + cert_pem = os.path.join(workdir, stem + ".cert.pem") + cert_der = os.path.join(workdir, stem + ".cert.der") + run([ + openssl, "req", "-x509", "-newkey", "rsa:2048", "-sha256", + "-keyout", key_pem, "-out", cert_pem, "-days", "3650", + "-nodes", "-subj", "/CN=" + common_name, + ]) + run([openssl, "x509", "-in", cert_pem, "-outform", "DER", "-out", cert_der]) + return key_pem, cert_pem, read_file(cert_der) + + +def read_text(path): + """Read a text file and return its contents as a string.""" + with open(path, "r") as handle: + return handle.read() + + +def write_text(path, text): + """Write the provided string to a text file.""" + with open(path, "w") as handle: + handle.write(text) + + +def generate_root_ca(openssl, workdir, stem, common_name): + """Create a self-signed RSA root CA certificate. + + Returns a tuple of (key_pem_path, cert_pem_path, cert_der_bytes). + """ + key_pem = os.path.join(workdir, stem + ".key.pem") + cert_pem = os.path.join(workdir, stem + ".cert.pem") + cert_der = os.path.join(workdir, stem + ".cert.der") + run([ + openssl, "req", "-x509", "-newkey", "rsa:2048", "-sha256", + "-keyout", key_pem, "-out", cert_pem, "-days", "3650", "-nodes", + "-subj", "/CN=" + common_name, + "-addext", "basicConstraints=critical,CA:TRUE", + "-addext", "keyUsage=critical,keyCertSign,cRLSign", + ]) + run([openssl, "x509", "-in", cert_pem, "-outform", "DER", "-out", cert_der]) + return key_pem, cert_pem, read_file(cert_der) + + +def generate_signed_cert(openssl, workdir, stem, common_name, ca_key, ca_cert, is_ca): + """Create an RSA certificate signed by the given CA. + + is_ca selects whether the new certificate is itself a CA (an intermediate) + or a leaf code-signing certificate. Returns + (key_pem_path, cert_pem_path, cert_der_bytes). + """ + key_pem = os.path.join(workdir, stem + ".key.pem") + csr_pem = os.path.join(workdir, stem + ".csr.pem") + cert_pem = os.path.join(workdir, stem + ".cert.pem") + cert_der = os.path.join(workdir, stem + ".cert.der") + ext_file = os.path.join(workdir, stem + ".ext") + + if is_ca: + write_text(ext_file, + "basicConstraints=critical,CA:TRUE\n" + "keyUsage=critical,keyCertSign,cRLSign\n") + else: + write_text(ext_file, + "basicConstraints=critical,CA:FALSE\n" + "keyUsage=critical,digitalSignature\n" + "extendedKeyUsage=codeSigning\n") + + run([ + openssl, "req", "-newkey", "rsa:2048", "-sha256", "-nodes", + "-keyout", key_pem, "-out", csr_pem, "-subj", "/CN=" + common_name, + ]) + run([ + openssl, "x509", "-req", "-in", csr_pem, "-sha256", "-days", "3650", + "-CA", ca_cert, "-CAkey", ca_key, "-CAcreateserial", + "-extfile", ext_file, "-out", cert_pem, + ]) + run([openssl, "x509", "-in", cert_pem, "-outform", "DER", "-out", cert_der]) + return key_pem, cert_pem, read_file(cert_der) + + +def sbsign_image(sbsign, key_pem, cert_pem, in_path, out_path, addcert=None): + """Append a WIN_CERTIFICATE signature to in_path, writing the result to out_path. + + If addcert is given (a PEM file of extra certificates), those certificates + are embedded in the signature so a verifier can build the full chain. + """ + cmd = [sbsign, "--key", key_pem, "--cert", cert_pem] + if addcert is not None: + cmd += ["--addcert", addcert] + cmd += ["--output", out_path, in_path] + run(cmd) + + +def authenticode_digest(data, hash_name): + """Compute the Authenticode digest of a PE/COFF image with the named hash. + + hash_name is any algorithm accepted by hashlib.new (for example "sha256", + "sha384", or "sha512"). This mirrors the hashing performed by SecurityPkg's + DxeImageVerificationLib (HashPeImage): the optional-header checksum field and + the Certificate Table data directory entry are skipped, the sections are + hashed in PointerToRawData order, and the attribute certificate table at the + end of the file is excluded. The digest is therefore identical for the + unsigned, signed, and multi-signed forms of the same image. + """ + if data[0:2] != b"MZ": + raise ValueError("not a PE image (missing MZ header)") + pe = struct.unpack_from(" hashed: + sha.update(data[hashed:trailing_end]) + + return sha.digest() + + +def build_arch_file(output_dir, file_name, arch_label, image_path, + leaf_key, leaf_cert, chain_pem, + signer2_key, signer2_cert, signer2_addcert, + certs, sbsign, workdir): + """Sign one architecture's image and emit its test-data C file. + + The signed image is signed by signer 1's leaf certificate with the intermediate 2 + + intermediate 1 + root chain embedded; the multi-signed image additionally carries + signer 2's signature, which embeds unrelated decoy certificates. The + architecture-independent certificates are emitted alongside the images/digests so each + arch file is fully self-contained; only one arch file is compiled per build, so there + is no duplicate-definition conflict. + + The generated file is written beneath output_dir using the provided file + name relative path. + """ + unsigned = read_file(image_path) + signed_path = os.path.join(workdir, arch_label + ".signed.efi") + multi_path = os.path.join(workdir, arch_label + ".multi.efi") + + sbsign_image(sbsign, leaf_key, leaf_cert, image_path, signed_path, addcert=chain_pem) + sbsign_image(sbsign, signer2_key, signer2_cert, signed_path, multi_path, + addcert=signer2_addcert) + + signed = read_file(signed_path) + multi = read_file(multi_path) + + arrays = [ + ("mUnsignedImage", f"unsigned {arch_label} PE/COFF image", unsigned), + ( + "mSignedImage", + f"{arch_label} PE/COFF image signed by the leaf cert (chain embedded)", + signed, + ), + ( + "mMultiSignedImage", + f"{arch_label} PE/COFF image signed by the leaf cert and signer 2", + multi, + ), + ( + "mUnsignedImageDigestSha256", + "Authenticode SHA-256 digest of the unsigned image", + authenticode_digest(unsigned, "sha256"), + ), + ( + "mUnsignedImageDigestSha384", + "Authenticode SHA-384 digest of the unsigned image", + authenticode_digest(unsigned, "sha384"), + ), + ( + "mUnsignedImageDigestSha512", + "Authenticode SHA-512 digest of the unsigned image", + authenticode_digest(unsigned, "sha512"), + ), + ( + "mSignedImageDigestSha256", + "Authenticode SHA-256 digest of the signed image", + authenticode_digest(signed, "sha256"), + ), + ( + "mSignedImageDigestSha384", + "Authenticode SHA-384 digest of the signed image", + authenticode_digest(signed, "sha384"), + ), + ( + "mSignedImageDigestSha512", + "Authenticode SHA-512 digest of the signed image", + authenticode_digest(signed, "sha512"), + ), + ( + "mMultiSignedImageDigestSha256", + "Authenticode SHA-256 digest of the multi-signed image", + authenticode_digest(multi, "sha256"), + ), + ( + "mMultiSignedImageDigestSha384", + "Authenticode SHA-384 digest of the multi-signed image", + authenticode_digest(multi, "sha384"), + ), + ( + "mMultiSignedImageDigestSha512", + "Authenticode SHA-512 digest of the multi-signed image", + authenticode_digest(multi, "sha512"), + ), + ] + arrays += certs + write_c_file(os.path.join(output_dir, file_name), arrays) + + +def main(): + """Parse arguments, generate signed image artifacts, and emit test data C files.""" + script_dir = os.path.dirname(os.path.abspath(__file__)) + arch_files = { + "X64": os.path.join("X64", "TestData.c"), + "AArch64": os.path.join("Aarch64", "TestData.c"), + } + + parser = argparse.ArgumentParser( + formatter_class=argparse.RawDescriptionHelpFormatter, + description=( + "Sign unsigned EFI images, generate signed and multi-signed test variants,\n" + "compute their Authenticode SHA-256 digests, and emit the per-architecture\n" + "C files X64/TestData.c and/or Aarch64/TestData.c consumed by\n" + "ImageValidationTestApp. Provide at least one of --x64-image / --aarch64-image." + ), + epilog=( + "requirements:\n" + " Requires python3, openssl, and sbsign. openssl and sbsign must be on\n" + " PATH unless overridden with --openssl / --sbsign. sbsign ships with the\n" + " sbsigntool / sbsigntools package (Linux-native; use WSL on Windows).\n" + " Ubuntu/Debian: sudo apt install -y python3 openssl sbsigntool\n" + "\n" + "examples:\n" + " # Generate test data for both architectures.\n" + " python3 GenTestData.py --x64-image X64/HelloWorld.efi \\\n" + " --aarch64-image Aarch64/HelloWorld.efi\n" + "\n" + " # Generate test data for a single architecture.\n" + " python3 GenTestData.py --x64-image X64/HelloWorld.efi\n" + "\n" + " # On Windows, run through WSL because the signing tools are Linux-native.\n" + " wsl bash -lc \"python3 GenTestData.py --x64-image X64/HelloWorld.efi\"\n" + ), + ) + parser.add_argument("--x64-image", help="Unsigned X64 PE/COFF EFI image to sign.") + parser.add_argument("--aarch64-image", help="Unsigned AARCH64 PE/COFF EFI image to sign.") + parser.add_argument("--output-dir", default=script_dir, + help="Directory to write the generated C files (default: this directory).") + parser.add_argument("--openssl", help="Path to the openssl executable (default: search PATH).") + parser.add_argument("--sbsign", help="Path to the sbsign executable (default: search PATH).") + parser.add_argument("--workdir", + help=( + "Directory for intermediate keys / signed images " + "(default: a temporary directory)." + )) + parser.add_argument("--keep", action="store_true", + help=( + "Keep the intermediate artifacts instead of deleting " + "the temporary work directory." + )) + args = parser.parse_args() + + images = [] + if args.x64_image: + images.append(("X64", args.x64_image)) + if args.aarch64_image: + images.append(("AArch64", args.aarch64_image)) + if not images: + sys.exit("error: provide at least one of --x64-image / --aarch64-image") + + openssl = tool_path("openssl", args.openssl) + sbsign = tool_path("sbsign", args.sbsign) + + created_workdir = args.workdir is None + workdir = args.workdir or tempfile.mkdtemp(prefix="gentestdata_") + os.makedirs(workdir, exist_ok=True) + + try: + # + # Build signer 1's four-certificate chain + # (root CA -> intermediate 1 CA -> intermediate 2 CA -> leaf) used to sign the + # images, plus signer 2 (a single self-signed signer) and unrelated decoy + # certificates used for multi-signing. + # + root_key, root_cert, root_der = generate_root_ca( + openssl, workdir, "root", "ImageVerificationTestApp Test Root CA" + ) + int1_key, int1_cert, int1_der = generate_signed_cert( + openssl, workdir, "intermediate1", + "ImageVerificationTestApp Test Intermediate 1 CA", + root_key, root_cert, is_ca=True + ) + int2_key, int2_cert, int2_der = generate_signed_cert( + openssl, workdir, "intermediate2", + "ImageVerificationTestApp Test Intermediate 2 CA", + int1_key, int1_cert, is_ca=True + ) + leaf_key, leaf_cert, leaf_der = generate_signed_cert( + openssl, workdir, "leaf", + "ImageVerificationTestApp Test Leaf Signer", + int2_key, int2_cert, is_ca=False + ) + signer2_key, signer2_cert, signer2_der = generate_signer( + openssl, workdir, "signer2", "ImageVerificationTestApp Test Signer 2" + ) + + # + # Unrelated decoy certificates embedded in signer 2's signature. They are not part + # of signer 2's (single-certificate) chain; they let tests confirm an image is not + # authorized by an irrelevant certificate that merely rides along in the signature. + # decoy 1 is exported as mSigner2UnrelatedCert for that purpose. + # + decoy1_key, decoy1_cert, decoy1_der = generate_signer( + openssl, workdir, "decoy1", "ImageVerificationTestApp Test Unrelated Cert 1" + ) + decoy2_key, decoy2_cert, decoy2_der = generate_signer( + openssl, workdir, "decoy2", "ImageVerificationTestApp Test Unrelated Cert 2" + ) + + # + # Chain PEM (intermediate 2 + intermediate 1 + root) embedded in the leaf signature + # so a verifier can build leaf -> intermediate 2 -> intermediate 1 -> root and match + # any of them enrolled in db / dbx. + # + chain_pem = os.path.join(workdir, "chain.pem") + write_text(chain_pem, + read_text(int2_cert) + read_text(int1_cert) + read_text(root_cert)) + + # + # Decoy PEM embedded in signer 2's signature (unrelated to signer 2's chain). + # + signer2_addcert = os.path.join(workdir, "signer2_decoys.pem") + write_text(signer2_addcert, read_text(decoy1_cert) + read_text(decoy2_cert)) + + certs = [ + ("mLeafCert", "DER-encoded X.509 signer 1 leaf signing certificate", leaf_der), + ("mIntermediate1Cert", "DER-encoded X.509 signer 1 intermediate 1 CA certificate", int1_der), + ("mIntermediate2Cert", "DER-encoded X.509 signer 1 intermediate 2 CA certificate", int2_der), + ("mRootCert", "DER-encoded X.509 signer 1 root CA certificate", root_der), + ("mSigner2Cert", "DER-encoded X.509 certificate for signer 2", signer2_der), + ("mSigner2UnrelatedCert", + "DER-encoded X.509 certificate embedded in signer 2's signature but unrelated to its chain", + decoy1_der), + ] + + for arch_label, image_path in images: + build_arch_file(args.output_dir, arch_files[arch_label], arch_label, + image_path, leaf_key, leaf_cert, chain_pem, + signer2_key, signer2_cert, signer2_addcert, + certs, sbsign, workdir) + finally: + if created_workdir and not args.keep: + shutil.rmtree(workdir, ignore_errors=True) + + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.c b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.c new file mode 100644 index 00000000000..33719d9c80f --- /dev/null +++ b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.c @@ -0,0 +1,1211 @@ +/** @file + Image Validation unit test application. + + This UEFI application exercises the platform's secure boot image Validation at a high + level. For each scenario it: + 1. Installs a GetVariable() hook that returns scenario-specific `db` and `dbx` + signature databases and reports `SecureBoot` as enabled (so the handler enforces + Validation), falling back to the real GetVariable() for all other variables. + 2. Calls gBS->LoadImage() on a built-in PE/COFF image. On a platform with Secure Boot + enabled, the DXE core invokes the registered image Validation handler, which reads + the `db` / `dbx` served by the hook. + 3. Asserts that LoadImage() returns the expected EFI_STATUS. + + Because Validation is performed by the platform's already-registered handler (reached + through gBS->LoadImage()), the application itself needs no security or cryptography + libraries. + + Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ImageValidationTestApp.h" +#include "TestData.h" + +#define UNIT_TEST_NAME "Image Validation Test App" +#define UNIT_TEST_VERSION "0.1" + +// +// SignatureOwner GUID stamped into every EFI_SIGNATURE_DATA this test builds. +// +STATIC CONST EFI_GUID mTestSignatureOwner = { + 0x6f9a1c44, 0x2d8b, 0x4e3a, { 0x9b, 0x21, 0x0c, 0x7d, 0x5e, 0x14, 0xa8, 0x3f } +}; + +// +// Filler payload for the deliberately-malformed signature list built for the +// DB_STATE_CORRUPT_SIGNATURE_LIST_* flags; its size fields (not its contents) are what make it +// corrupt. +// +STATIC CONST UINT8 mCorruptSignaturePayload[SHA256_DIGEST_SIZE] = { 0 }; + +// +// A fake device path to result in an unknown image source allowing the Image Validation handler +// to be fully invoked. +// +#pragma pack (1) +typedef struct { + MEMMAP_DEVICE_PATH MemMap; + EFI_DEVICE_PATH_PROTOCOL End; +} TEST_IMAGE_DEVICE_PATH; +#pragma pack () + +STATIC TEST_IMAGE_DEVICE_PATH mTestImageDevicePath = { + { + { + HARDWARE_DEVICE_PATH, + HW_MEMMAP_DP, + { (UINT8)sizeof (MEMMAP_DEVICE_PATH), (UINT8)(sizeof (MEMMAP_DEVICE_PATH) >> 8) } + }, + EfiBootServicesData, + 0, + 0 + }, + { + END_DEVICE_PATH_TYPE, + END_ENTIRE_DEVICE_PATH_SUBTYPE, + { (UINT8)sizeof (EFI_DEVICE_PATH_PROTOCOL), 0 } + } +}; + +// +// GetVariable() hook state. +// +// mOriginalGetVariable holds the runtime services GetVariable() that was present before the +// hook was installed; the hook chains to it for every variable it does not synthesize. +// mActiveDb / mActiveDbx point at the `db` / `dbx` databases the scenario runner built for +// the test currently executing, so the hook knows what to return for those two variables. +// +STATIC EFI_GET_VARIABLE mOriginalGetVariable = NULL; +STATIC CONST UINT8 *mActiveDb = NULL; +STATIC UINTN mActiveDbSize = 0; +STATIC CONST UINT8 *mActiveDbx = NULL; +STATIC UINTN mActiveDbxSize = 0; + +// +// Value served for the `SecureBoot` variable. The Validation handler skips Validation +// (returns EFI_SUCCESS) when `SecureBoot` is absent or disabled, so the hook always reports +// it enabled to force the handler down the real signature/hash validation path regardless +// of the platform's actual state. +// +STATIC CONST UINT8 mSecureBootEnabled = SECURE_BOOT_MODE_ENABLE; + +/** + Copy the source buffer holding a variable value into the caller's buffer. + + Update the attributes and data size as needed. + + @param[in] Source Buffer holding the variable value, or NULL if the + variable does not exist. + @param[in] SourceSize Size, in bytes, of Source. + @param[in] SourceAttributes Attributes to report for the variable. + @param[out] Attributes Optional. Receives SourceAttributes. + @param[in, out] DataSize On input, the size of Data. On output, the size of the + variable value. + @param[out] Data Optional. Receives the variable value. + + @retval EFI_SUCCESS The value was returned in Data. + @retval EFI_NOT_FOUND Source is NULL or SourceSize is 0. + @retval EFI_BUFFER_TOO_SMALL Data was too small; DataSize has been updated. + @retval EFI_INVALID_PARAMETER Data was NULL but the buffer was large enough. +**/ +STATIC +EFI_STATUS +ServeVariable ( + IN CONST UINT8 *Source, + IN UINTN SourceSize, + IN UINT32 SourceAttributes, + OUT UINT32 *Attributes OPTIONAL, + IN OUT UINTN *DataSize, + OUT VOID *Data OPTIONAL + ) +{ + if ((Source == NULL) || (SourceSize == 0)) { + return EFI_NOT_FOUND; + } + + if (Attributes != NULL) { + *Attributes = SourceAttributes; + } + + if (*DataSize < SourceSize) { + *DataSize = SourceSize; + return EFI_BUFFER_TOO_SMALL; + } + + if (Data == NULL) { + return EFI_INVALID_PARAMETER; + } + + CopyMem (Data, Source, SourceSize); + *DataSize = SourceSize; + return EFI_SUCCESS; +} + +/** + GetVariable() hook that returns scenario-specific secure boot databases instead of the real ones. + + Falls back to the original GetVariable() implementation for all other variables. + + @param[in] VariableName The name of the variable to read. + @param[in] VendorGuid The vendor GUID of the variable. + @param[out] Attributes Optional. Receives the variable attributes. + @param[in, out] DataSize On input, the size of Data; on output, the size of the + variable value. + @param[out] Data Optional. Receives the variable value. + + @return The status of the synthesized or forwarded GetVariable() call. +**/ +STATIC +EFI_STATUS +EFIAPI +HookedGetVariable ( + IN CHAR16 *VariableName, + IN EFI_GUID *VendorGuid, + OUT UINT32 *Attributes OPTIONAL, + IN OUT UINTN *DataSize, + OUT VOID *Data OPTIONAL + ) +{ + if ((VariableName == NULL) || (VendorGuid == NULL) || (DataSize == NULL)) { + return EFI_INVALID_PARAMETER; + } + + if ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0) && + CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid)) + { + return ServeVariable ( + mActiveDb, + mActiveDbSize, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + Attributes, + DataSize, + Data + ); + } + + if ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0) && + CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid)) + { + return ServeVariable ( + mActiveDbx, + mActiveDbxSize, + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + Attributes, + DataSize, + Data + ); + } + + if ((StrCmp (VariableName, EFI_SECURE_BOOT_MODE_NAME) == 0) && + CompareGuid (VendorGuid, &gEfiGlobalVariableGuid)) + { + // + // Force Secure Boot to appear enabled so the Validation handler enforces + // Validation instead of short-circuiting to EFI_SUCCESS. + // + return ServeVariable ( + &mSecureBootEnabled, + sizeof (mSecureBootEnabled), + EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + Attributes, + DataSize, + Data + ); + } + + return mOriginalGetVariable (VariableName, VendorGuid, Attributes, DataSize, Data); +} + +/** + Install the GetVariable() hook. +**/ +STATIC +VOID +InstallGetVariableHook ( + VOID + ) +{ + if (mOriginalGetVariable == NULL) { + mOriginalGetVariable = gRT->GetVariable; + gRT->GetVariable = HookedGetVariable; + } +} + +/** + Restore the original GetVariable() implementation. +**/ +STATIC +VOID +RestoreGetVariableHook ( + VOID + ) +{ + if (mOriginalGetVariable != NULL) { + gRT->GetVariable = mOriginalGetVariable; + mOriginalGetVariable = NULL; + } + + mActiveDb = NULL; + mActiveDbSize = 0; + mActiveDbx = NULL; + mActiveDbxSize = 0; +} + +/** + Convert a DB_STATE combination to a human-readable string. + + This function builds a comma-separated list of the individual state names (e.g., + "Image Digest, Leaf, Root"). An empty state (DB_STATE_EMPTY) returns "Empty". + + @param[in] DbState A combination of DB_STATE_* flags. + @param[out] Buffer A caller-allocated string buffer to receive the result. + @param[in] BufSize The size, in bytes, of Buffer. + + @retval EFI_SUCCESS The description was written to Buffer. + @retval EFI_BUFFER_TOO_SMALL Buffer was too small for the description. +**/ +STATIC +EFI_STATUS +DbStateToString ( + IN UINT32 DbState, + OUT CHAR8 *Buffer, + IN UINTN BufSize + ) +{ + typedef struct { + UINT32 Flag; + CONST CHAR8 *Name; + } DB_STATE_NAME_ENTRY; + + CONST DB_STATE_NAME_ENTRY StateNames[] = { + { DB_STATE_IMAGE_DIGEST_SHA256, "Image Digest (SHA-256)" }, + { DB_STATE_IMAGE_DIGEST_SHA384, "Image Digest (SHA-384)" }, + { DB_STATE_IMAGE_DIGEST_SHA512, "Image Digest (SHA-512)" }, + { DB_STATE_SIGNER1_LEAF_CERT, "Signer 1 Leaf Cert" }, + { DB_STATE_SIGNER1_INTERMEDIATE1_CERT, "Signer 1 Intermediate 1 Cert" }, + { DB_STATE_SIGNER1_INTERMEDIATE2_CERT, "Signer 1 Intermediate 2 Cert" }, + { DB_STATE_SIGNER1_ROOT_CERT, "Signer 1 Root Cert" }, + { DB_STATE_SIGNER2_CERT, "Signer 2 Cert" }, + { DB_STATE_SIGNER2_UNRELATED_CERT, "Signer 2 Unrelated Cert" }, + { DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, "Signer 1 Leaf TBS Hash (SHA-256)" }, + { DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA384, "Signer 1 Leaf TBS Hash (SHA-384)" }, + { DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA512, "Signer 1 Leaf TBS Hash (SHA-512)" }, + { DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, "Signer 1 Intermediate 1 TBS Hash (SHA-256)" }, + { DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA384, "Signer 1 Intermediate 1 TBS Hash (SHA-384)" }, + { DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA512, "Signer 1 Intermediate 1 TBS Hash (SHA-512)" }, + { DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, "Signer 1 Intermediate 2 TBS Hash (SHA-256)" }, + { DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA384, "Signer 1 Intermediate 2 TBS Hash (SHA-384)" }, + { DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA512, "Signer 1 Intermediate 2 TBS Hash (SHA-512)" }, + { DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, "Signer 1 Root TBS Hash (SHA-256)" }, + { DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA384, "Signer 1 Root TBS Hash (SHA-384)" }, + { DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA512, "Signer 1 Root TBS Hash (SHA-512)" }, + { DB_STATE_SIGNER2_TBS_HASH_SHA256, "Signer 2 TBS Hash (SHA-256)" }, + { DB_STATE_SIGNER2_TBS_HASH_SHA384, "Signer 2 TBS Hash (SHA-384)" }, + { DB_STATE_SIGNER2_TBS_HASH_SHA512, "Signer 2 TBS Hash (SHA-512)" }, + { DB_STATE_CORRUPT_SIGNATURE_LIST_FIRST, "Corrupt Signature List (First)" }, + { DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, "Corrupt Signature List (Last)" }, + { DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA256, "Signer 2 Unrelated TBS Hash (SHA-256)" }, + { DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA384, "Signer 2 Unrelated TBS Hash (SHA-384)" }, + { DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA512, "Signer 2 Unrelated TBS Hash (SHA-512)" } + }; + + UINTN Index; + UINTN Offset; + UINTN NameLen; + BOOLEAN FirstFlag; + + if ((Buffer == NULL) || (BufSize == 0)) { + return EFI_INVALID_PARAMETER; + } + + if (DbState == DB_STATE_EMPTY) { + if (BufSize < 6) { + return EFI_BUFFER_TOO_SMALL; + } + + AsciiStrCpyS (Buffer, BufSize, "Empty"); + return EFI_SUCCESS; + } + + Offset = 0; + FirstFlag = TRUE; + + for (Index = 0; Index < ARRAY_SIZE (StateNames); Index++) { + if ((DbState & StateNames[Index].Flag) != 0) { + NameLen = AsciiStrLen (StateNames[Index].Name); + + // Account for separator (", ") if not the first flag + if (!FirstFlag) { + NameLen += 2; // for ", " + } + + if (Offset + NameLen >= BufSize) { + return EFI_BUFFER_TOO_SMALL; + } + + if (FirstFlag) { + // + // For the first flag, copy the name directly (initializes buffer). + // + AsciiStrCpyS (Buffer, BufSize, StateNames[Index].Name); + FirstFlag = FALSE; + } else { + // + // For subsequent flags, append with a separator. + // + AsciiStrCatS (Buffer, BufSize, ", "); + AsciiStrCatS (Buffer, BufSize, StateNames[Index].Name); + } + + Offset += NameLen; + } + } + + return EFI_SUCCESS; +} + +/** + Convert an EFI_STATUS value to a human-readable string for test reporting. + + @param[in] Status The EFI_STATUS to convert. + + @return A pointer to a constant string describing the status. +**/ +STATIC +CONST CHAR8 * +StatusToString ( + IN EFI_STATUS Status + ) +{ + switch (Status) { + case EFI_SUCCESS: + return "Approved"; + case EFI_ACCESS_DENIED: + return "Denied"; + case EFI_SECURITY_VIOLATION: + return "Security Violation"; + default: + return "Unknown"; + } +} + +/** + Generate a scenario description from the database states and expected result. + + This function builds a concise scenario name in the format: + "DB: [], DBX: [], Expected: " + + @param[in] DbState The DB_STATE_* flags for the `db` database. + @param[in] DbxState The DB_STATE_* flags for the `dbx` database. + @param[in] ExpectedStatus The expected EFI_STATUS from LoadImage(). + @param[out] Buffer A caller-allocated string buffer to receive the result. + @param[in] BufSize The size, in bytes, of Buffer. + + @retval EFI_SUCCESS The description was written to Buffer. + @retval EFI_BUFFER_TOO_SMALL Buffer was too small for the description. +**/ +STATIC +EFI_STATUS +GenerateScenarioDescription ( + IN UINT32 DbState, + IN UINT32 DbxState, + IN EFI_STATUS ExpectedStatus, + OUT CHAR8 *Buffer, + IN UINTN BufSize + ) +{ + CHAR8 DbString[128]; + CHAR8 DbxString[128]; + CONST CHAR8 *StatusString; + EFI_STATUS Status; + + if ((Buffer == NULL) || (BufSize == 0)) { + return EFI_INVALID_PARAMETER; + } + + // Convert DB state to string + Status = DbStateToString (DbState, DbString, sizeof (DbString)); + if (EFI_ERROR (Status)) { + return Status; + } + + // Convert DBX state to string + Status = DbStateToString (DbxState, DbxString, sizeof (DbxString)); + if (EFI_ERROR (Status)) { + return Status; + } + + // Get status string + StatusString = StatusToString (ExpectedStatus); + + // Build the final description with labeled DB/DBX/Expected fields. + Status = AsciiSPrint ( + Buffer, + BufSize, + "DB: [%a], DBX: [%a], Expected: %a", + DbString, + DbxString, + StatusString + ); + + return Status; +} + +/** + Corrupt a WIN_CERTIFICATE in a signed image so the platform aborts when it parses that entry. + + The certificate table is located from the Security data directory that + PeCoffLoaderGetImageInfo() copies into the loader image context. The requested entry's + dwLength is overwritten with an out-of-range value; the data directory that locates the + table is left untouched. + + @param[in,out] Image The image buffer to mutate in place. + @param[in] ImageSize Size, in bytes, of Image. + @param[in] CertIndex Zero-based index of the WIN_CERTIFICATE to corrupt. +**/ +STATIC +VOID +CorruptImageWinCertificate ( + IN OUT UINT8 *Image, + IN UINTN ImageSize, + IN UINTN CertIndex + ) +{ + PE_COFF_LOADER_IMAGE_CONTEXT Context; + WIN_CERTIFICATE *WinCert; + UINTN TableStart; + UINTN TableEnd; + UINTN Offset; + UINTN Index; + + ZeroMem (&Context, sizeof (Context)); + Context.Handle = Image; + Context.ImageRead = PeCoffLoaderImageReadFromMemory; + + if (RETURN_ERROR (PeCoffLoaderGetImageInfo (&Context))) { + return; + } + + TableStart = Context.SecurityDataDirectory.VirtualAddress; + TableEnd = TableStart + Context.SecurityDataDirectory.Size; + + // + // The certificate table must lie fully within the image. + // + if ((TableStart == 0) || (TableEnd < TableStart) || (TableEnd > ImageSize)) { + return; + } + + // + // Walk the 8-byte-aligned WIN_CERTIFICATE list to the requested entry. + // + Offset = TableStart; + WinCert = NULL; + for (Index = 0; Index <= CertIndex; Index++) { + if ((Offset >= TableEnd) || ((TableEnd - Offset) < sizeof (WIN_CERTIFICATE))) { + return; + } + + WinCert = (WIN_CERTIFICATE *)(Image + Offset); + if (Index == CertIndex) { + break; + } + + if ((WinCert->dwLength < sizeof (WIN_CERTIFICATE)) || + (WinCert->dwLength > (TableEnd - Offset))) + { + return; + } + + Offset = ALIGN_VALUE (Offset + WinCert->dwLength, 8); + } + + // + // Overwrite the target entry's length with an out-of-range value so the platform aborts + // when it validates this WIN_CERTIFICATE. + // + WinCert->dwLength = MAX_UINT32; +} + +/** + Tamper a signed image's body so its Authenticode hash no longer matches its signature. + + A single byte at the first offset past the image headers is flipped. That region is covered by + the Authenticode hash but is neither a structural header field nor part of the WIN_CERTIFICATE + table, so the image still parses and reaches signature validation while its recomputed + Authenticode digest differs from both the embedded signature and any enrolled image digest. + + @param[in,out] Image The image buffer to mutate in place. + @param[in] ImageSize Size, in bytes, of Image. +**/ +STATIC +VOID +TamperImageBody ( + IN OUT UINT8 *Image, + IN UINTN ImageSize + ) +{ + PE_COFF_LOADER_IMAGE_CONTEXT Context; + UINTN Offset; + + ZeroMem (&Context, sizeof (Context)); + Context.Handle = Image; + Context.ImageRead = PeCoffLoaderImageReadFromMemory; + + if (RETURN_ERROR (PeCoffLoaderGetImageInfo (&Context))) { + return; + } + + // + // The first byte past the headers is section content: hashed by Authenticode, but not a header + // field or part of the certificate table, so the image remains parseable after the flip. + // + Offset = Context.SizeOfHeaders; + if ((Offset == 0) || (Offset >= ImageSize)) { + return; + } + + Image[Offset] ^= 0xFF; +} + +/** + Resolve a scenario's IMAGE_TYPE into a freshly allocated, writable image buffer. + + A copy is always returned so corrupt variants can be mutated in place. The caller owns the + buffer and must release it with FreePool(). + + @param[in] ImageType The image selector from the scenario. + @param[out] Image Receives a pointer to the allocated image buffer. + @param[out] ImageSize Receives the size, in bytes, of the image buffer. + + @retval EFI_SUCCESS The image was resolved and copied. + @retval EFI_INVALID_PARAMETER ImageType was not a recognized value. + @retval EFI_OUT_OF_RESOURCES The image copy could not be allocated. +**/ +STATIC +EFI_STATUS +GetImageForType ( + IN IMAGE_TYPE ImageType, + OUT UINT8 **Image, + OUT UINTN *ImageSize + ) +{ + CONST UINT8 *Base; + UINTN BaseSize; + UINT8 *Copy; + + switch (ImageType) { + case IMAGE_TYPE_UNSIGNED: + Base = mUnsignedImage; + BaseSize = mUnsignedImageSize; + break; + case IMAGE_TYPE_SIGNED: + case IMAGE_TYPE_SIGNED_CORRUPT_CERT: + case IMAGE_TYPE_SIGNED_TAMPERED: + Base = mSignedImage; + BaseSize = mSignedImageSize; + break; + case IMAGE_TYPE_MULTI_SIGNED: + case IMAGE_TYPE_MULTI_SIGNED_CORRUPT_FIRST_CERT: + case IMAGE_TYPE_MULTI_SIGNED_CORRUPT_SECOND_CERT: + Base = mMultiSignedImage; + BaseSize = mMultiSignedImageSize; + break; + default: + return EFI_INVALID_PARAMETER; + } + + Copy = AllocateCopyPool (BaseSize, Base); + if (Copy == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + if ((ImageType == IMAGE_TYPE_SIGNED_CORRUPT_CERT) || + (ImageType == IMAGE_TYPE_MULTI_SIGNED_CORRUPT_FIRST_CERT)) + { + // + // Corrupt the first WIN_CERTIFICATE (index 0): the signed image's only certificate, or the + // multi-signed image's signer 1 certificate. + // + CorruptImageWinCertificate (Copy, BaseSize, 0); + } else if (ImageType == IMAGE_TYPE_MULTI_SIGNED_CORRUPT_SECOND_CERT) { + // + // Corrupt the second WIN_CERTIFICATE (index 1): the multi-signed image's signer 2 certificate. + // + CorruptImageWinCertificate (Copy, BaseSize, 1); + } else if (ImageType == IMAGE_TYPE_SIGNED_TAMPERED) { + // + // Tamper the image body so its Authenticode hash no longer matches the signature or any + // enrolled image digest, while leaving the WIN_CERTIFICATE intact so validation still runs. + // + TamperImageBody (Copy, BaseSize); + } + + *Image = Copy; + *ImageSize = BaseSize; + return EFI_SUCCESS; +} + +/// +/// One signature list to emit while building a signature database. +/// +typedef struct { + CONST EFI_GUID *Type; ///< Signature type GUID (image digest or X.509 / TBS hash). + CONST UINT8 *Data; ///< Signature payload (digest bytes or certificate). + UINTN DataSize; ///< Size, in bytes, of Data. + BOOLEAN Malformed; ///< When TRUE, emit a deliberately corrupt EFI_SIGNATURE_LIST. +} SIG_LIST_SPEC; + +/** + A BaseCryptLib one-shot hash routine (Sha256HashAll / Sha384HashAll / Sha512HashAll). +**/ +typedef +BOOLEAN +(EFIAPI *HASH_ALL_FUNC)( + IN CONST VOID *Data, + IN UINTN DataSize, + OUT UINT8 *HashValue + ); + +/** + Compute the hash of a certificate's TBSCertificate using the given hash routine. + + @param[in] Cert DER-encoded X.509 certificate. + @param[in] CertSize Size, in bytes, of Cert. + @param[in] HashAll BaseCryptLib ...HashAll routine that selects the algorithm. + @param[out] Hash Receives the digest; the caller's buffer must be large enough for the + chosen algorithm (up to SHA512_DIGEST_SIZE bytes). + + @retval EFI_SUCCESS The digest was computed. + @retval EFI_ABORTED TBSCertificate extraction or hashing failed. +**/ +STATIC +EFI_STATUS +ComputeTbsHash ( + IN CONST UINT8 *Cert, + IN UINTN CertSize, + IN HASH_ALL_FUNC HashAll, + OUT UINT8 *Hash + ) +{ + UINT8 *TbsCert; + UINTN TbsCertSize; + + if (!X509GetTBSCert (Cert, CertSize, &TbsCert, &TbsCertSize)) { + return EFI_ABORTED; + } + + if (!HashAll (TbsCert, TbsCertSize, Hash)) { + return EFI_ABORTED; + } + + return EFI_SUCCESS; +} + +/** + Build a serialized set of EFI_SIGNATURE_LISTs from DB_STATE_* flags. + + Each set flag contributes one EFI_SIGNATURE_LIST holding a single EFI_SIGNATURE_DATA entry. + + The caller owns the returned buffer and must release it with FreeSignatureDatabase(). + + @param[in] StateFlags Bitwise-OR of DB_STATE_* values. + @param[in] ImageType The image whose digest to use for + DB_STATE_IMAGE_DIGEST. + @param[out] Database Receives the allocated database buffer, or NULL when + StateFlags is DB_STATE_EMPTY. + @param[out] DatabaseSize Receives the size, in bytes, of the database. + + @retval EFI_SUCCESS The database was built (possibly empty). + @retval EFI_INVALID_PARAMETER ImageType was invalid. + @retval EFI_OUT_OF_RESOURCES The database buffer could not be allocated. +**/ +STATIC +EFI_STATUS +BuildSignatureDatabase ( + IN UINT32 StateFlags, + IN IMAGE_TYPE ImageType, + OUT UINT8 **Database, + OUT UINTN *DatabaseSize + ) +{ + // + // Precomputed image digests, keyed by base image type (IMAGE_TYPE_UNSIGNED / _SIGNED / + // _MULTI_SIGNED) then hash algorithm (SHA-256 / 384 / 512). Corrupt image variants are + // normalized to their base type before indexing, so only the base types need rows; sizing to + // exactly those rows also keeps the tables fully initialized (no implicit memset). + // + CONST UINT8 *DigestData[IMAGE_TYPE_MULTI_SIGNED + 1][3] = { + { mUnsignedImageDigestSha256, mUnsignedImageDigestSha384, mUnsignedImageDigestSha512 }, + { mSignedImageDigestSha256, mSignedImageDigestSha384, mSignedImageDigestSha512 }, + { mMultiSignedImageDigestSha256, mMultiSignedImageDigestSha384, mMultiSignedImageDigestSha512 } + }; + CONST UINTN DigestDataSize[IMAGE_TYPE_MULTI_SIGNED + 1][3] = { + { mUnsignedImageDigestSha256Size, mUnsignedImageDigestSha384Size, mUnsignedImageDigestSha512Size }, + { mSignedImageDigestSha256Size, mSignedImageDigestSha384Size, mSignedImageDigestSha512Size }, + { mMultiSignedImageDigestSha256Size, mMultiSignedImageDigestSha384Size, mMultiSignedImageDigestSha512Size } + }; + CONST struct { + UINT32 Flag; + UINTN HashIndex; + CONST EFI_GUID *Type; + } DigestFlags[] = { + { DB_STATE_IMAGE_DIGEST_SHA256, 0, &gEfiCertSha256Guid }, + { DB_STATE_IMAGE_DIGEST_SHA384, 1, &gEfiCertSha384Guid }, + { DB_STATE_IMAGE_DIGEST_SHA512, 2, &gEfiCertSha512Guid } + }; + CONST struct { + UINT32 Flag; + CONST UINT8 *Cert; + UINTN CertSize; + } CertFlags[] = { + { DB_STATE_SIGNER1_LEAF_CERT, mLeafCert, mLeafCertSize }, + { DB_STATE_SIGNER1_INTERMEDIATE1_CERT, mIntermediate1Cert, mIntermediate1CertSize }, + { DB_STATE_SIGNER1_INTERMEDIATE2_CERT, mIntermediate2Cert, mIntermediate2CertSize }, + { DB_STATE_SIGNER1_ROOT_CERT, mRootCert, mRootCertSize }, + { DB_STATE_SIGNER2_CERT, mSigner2Cert, mSigner2CertSize }, + { DB_STATE_SIGNER2_UNRELATED_CERT, mSigner2UnrelatedCert, mSigner2UnrelatedCertSize } + }; + CONST struct { + UINT32 Flag; + CONST UINT8 *Cert; + UINTN CertSize; + HASH_ALL_FUNC HashAll; + CONST EFI_GUID *Type; + UINTN HashSize; + } TbsFlags[] = { + { DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, mLeafCert, mLeafCertSize, Sha256HashAll, &gEfiCertX509Sha256Guid, SHA256_DIGEST_SIZE }, + { DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA384, mLeafCert, mLeafCertSize, Sha384HashAll, &gEfiCertX509Sha384Guid, SHA384_DIGEST_SIZE }, + { DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA512, mLeafCert, mLeafCertSize, Sha512HashAll, &gEfiCertX509Sha512Guid, SHA512_DIGEST_SIZE }, + { DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, mIntermediate1Cert, mIntermediate1CertSize, Sha256HashAll, &gEfiCertX509Sha256Guid, SHA256_DIGEST_SIZE }, + { DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA384, mIntermediate1Cert, mIntermediate1CertSize, Sha384HashAll, &gEfiCertX509Sha384Guid, SHA384_DIGEST_SIZE }, + { DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA512, mIntermediate1Cert, mIntermediate1CertSize, Sha512HashAll, &gEfiCertX509Sha512Guid, SHA512_DIGEST_SIZE }, + { DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, mIntermediate2Cert, mIntermediate2CertSize, Sha256HashAll, &gEfiCertX509Sha256Guid, SHA256_DIGEST_SIZE }, + { DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA384, mIntermediate2Cert, mIntermediate2CertSize, Sha384HashAll, &gEfiCertX509Sha384Guid, SHA384_DIGEST_SIZE }, + { DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA512, mIntermediate2Cert, mIntermediate2CertSize, Sha512HashAll, &gEfiCertX509Sha512Guid, SHA512_DIGEST_SIZE }, + { DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, mRootCert, mRootCertSize, Sha256HashAll, &gEfiCertX509Sha256Guid, SHA256_DIGEST_SIZE }, + { DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA384, mRootCert, mRootCertSize, Sha384HashAll, &gEfiCertX509Sha384Guid, SHA384_DIGEST_SIZE }, + { DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA512, mRootCert, mRootCertSize, Sha512HashAll, &gEfiCertX509Sha512Guid, SHA512_DIGEST_SIZE }, + { DB_STATE_SIGNER2_TBS_HASH_SHA256, mSigner2Cert, mSigner2CertSize, Sha256HashAll, &gEfiCertX509Sha256Guid, SHA256_DIGEST_SIZE }, + { DB_STATE_SIGNER2_TBS_HASH_SHA384, mSigner2Cert, mSigner2CertSize, Sha384HashAll, &gEfiCertX509Sha384Guid, SHA384_DIGEST_SIZE }, + { DB_STATE_SIGNER2_TBS_HASH_SHA512, mSigner2Cert, mSigner2CertSize, Sha512HashAll, &gEfiCertX509Sha512Guid, SHA512_DIGEST_SIZE }, + { DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA256, mSigner2UnrelatedCert, mSigner2UnrelatedCertSize, Sha256HashAll, &gEfiCertX509Sha256Guid, SHA256_DIGEST_SIZE }, + { DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA384, mSigner2UnrelatedCert, mSigner2UnrelatedCertSize, Sha384HashAll, &gEfiCertX509Sha384Guid, SHA384_DIGEST_SIZE }, + { DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA512, mSigner2UnrelatedCert, mSigner2UnrelatedCertSize, Sha512HashAll, &gEfiCertX509Sha512Guid, SHA512_DIGEST_SIZE } + }; + SIG_LIST_SPEC Specs[ARRAY_SIZE (DigestFlags) + ARRAY_SIZE (CertFlags) + ARRAY_SIZE (TbsFlags) + 2]; + UINT8 HashPool[ARRAY_SIZE (TbsFlags)][SHA512_DIGEST_SIZE]; + UINTN HashCount; + UINTN Count; + UINTN Index; + UINTN TotalSize; + UINTN RealListSize; + UINT8 *Buffer; + UINT8 *Cursor; + EFI_STATUS Status; + EFI_SIGNATURE_LIST *List; + EFI_SIGNATURE_DATA *SigData; + + *Database = NULL; + *DatabaseSize = 0; + Count = 0; + HashCount = 0; + + if (StateFlags == DB_STATE_EMPTY) { + return EFI_SUCCESS; + } + + if (ImageType >= IMAGE_TYPE_MAX) { + return EFI_INVALID_PARAMETER; + } + + // + // Corrupt-certificate variants reuse their base image's precomputed digests because corrupting a + // WIN_CERTIFICATE does not change the Authenticode digest. The tampered variant also maps to the + // base type so an enrolled image digest is the *original* one, which the tampered image's + // recomputed digest no longer matches. + // + if ((ImageType == IMAGE_TYPE_SIGNED_CORRUPT_CERT) || + (ImageType == IMAGE_TYPE_SIGNED_TAMPERED)) + { + ImageType = IMAGE_TYPE_SIGNED; + } else if ((ImageType == IMAGE_TYPE_MULTI_SIGNED_CORRUPT_FIRST_CERT) || + (ImageType == IMAGE_TYPE_MULTI_SIGNED_CORRUPT_SECOND_CERT)) + { + ImageType = IMAGE_TYPE_MULTI_SIGNED; + } + + // + // Zero every spec so the Malformed flag defaults to FALSE. + // + ZeroMem (Specs, sizeof (Specs)); + + // + // A deliberately-malformed signature list placed at the FRONT of the database, before every + // otherwise-authorizing entry, so a parser that aborts on the corruption never reaches them. + // + if ((StateFlags & DB_STATE_CORRUPT_SIGNATURE_LIST_FIRST) != 0) { + Specs[Count].Type = &gEfiCertSha256Guid; + Specs[Count].Data = mCorruptSignaturePayload; + Specs[Count].DataSize = SHA256_DIGEST_SIZE; + Specs[Count].Malformed = TRUE; + Count++; + } + + // + // Image Authenticode digests (precomputed per algorithm; selected by ImageType). + // + for (Index = 0; Index < ARRAY_SIZE (DigestFlags); Index++) { + if ((StateFlags & DigestFlags[Index].Flag) != 0) { + Specs[Count].Type = DigestFlags[Index].Type; + Specs[Count].Data = DigestData[ImageType][DigestFlags[Index].HashIndex]; + Specs[Count].DataSize = DigestDataSize[ImageType][DigestFlags[Index].HashIndex]; + Count++; + } + } + + // + // X.509 certificates (algorithm-independent). + // + for (Index = 0; Index < ARRAY_SIZE (CertFlags); Index++) { + if ((StateFlags & CertFlags[Index].Flag) != 0) { + Specs[Count].Type = &gEfiCertX509Guid; + Specs[Count].Data = CertFlags[Index].Cert; + Specs[Count].DataSize = CertFlags[Index].CertSize; + Count++; + } + } + + // + // Certificate TBSCertificate hashes, computed at runtime for the selected algorithm. + // + for (Index = 0; Index < ARRAY_SIZE (TbsFlags); Index++) { + if ((StateFlags & TbsFlags[Index].Flag) != 0) { + Status = ComputeTbsHash ( + TbsFlags[Index].Cert, + TbsFlags[Index].CertSize, + TbsFlags[Index].HashAll, + HashPool[HashCount] + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Specs[Count].Type = TbsFlags[Index].Type; + Specs[Count].Data = HashPool[HashCount]; + Specs[Count].DataSize = TbsFlags[Index].HashSize; + HashCount++; + Count++; + } + } + + // + // A deliberately-malformed signature list placed at the END of the database, after every + // otherwise-authorizing entry, so a parser reaches (and may honor) those entries before it + // aborts on the corruption. + // + if ((StateFlags & DB_STATE_CORRUPT_SIGNATURE_LIST_LAST) != 0) { + Specs[Count].Type = &gEfiCertSha256Guid; + Specs[Count].Data = mCorruptSignaturePayload; + Specs[Count].DataSize = SHA256_DIGEST_SIZE; + Specs[Count].Malformed = TRUE; + Count++; + } + + TotalSize = 0; + for (Index = 0; Index < Count; Index++) { + TotalSize += sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_GUID) + Specs[Index].DataSize; + } + + Buffer = AllocateZeroPool (TotalSize); + if (Buffer == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + Cursor = Buffer; + for (Index = 0; Index < Count; Index++) { + RealListSize = sizeof (EFI_SIGNATURE_LIST) + sizeof (EFI_GUID) + Specs[Index].DataSize; + + List = (EFI_SIGNATURE_LIST *)Cursor; + CopyGuid (&List->SignatureType, Specs[Index].Type); + List->SignatureHeaderSize = 0; + List->SignatureSize = (UINT32)(sizeof (EFI_GUID) + Specs[Index].DataSize); + List->SignatureListSize = (UINT32)RealListSize; + + SigData = (EFI_SIGNATURE_DATA *)(List + 1); + CopyGuid (&SigData->SignatureOwner, &mTestSignatureOwner); + CopyMem (SigData->SignatureData, Specs[Index].Data, Specs[Index].DataSize); + + if (Specs[Index].Malformed) { + // + // Corrupt the size fields so the emitted list is internally inconsistent and claims to + // run past the variable. The real bytes written above keep our cursor math correct. + // + List->SignatureSize = 0; + List->SignatureListSize = MAX_UINT32; + } + + Cursor += RealListSize; + } + + *Database = Buffer; + *DatabaseSize = TotalSize; + return EFI_SUCCESS; +} + +/** + Release a database allocated by BuildSignatureDatabase(). + + @param[in] Database The database buffer, which may be NULL. +**/ +STATIC +VOID +FreeSignatureDatabase ( + IN UINT8 *Database + ) +{ + if (Database != NULL) { + FreePool (Database); + } +} + +/** + Unit test body that drives a single secure boot image validation scenario. + + See ImageValidationTestApp.h for the full contract. + + @param[in] Context A pointer to the SECURE_BOOT_IMAGE_TEST_SCENARIO that describes the + inputs and expected result. + + @retval UNIT_TEST_PASSED LoadImage() returned the expected status. + @retval UNIT_TEST_ERROR_TEST_FAILED LoadImage() returned an unexpected status. +**/ +UNIT_TEST_STATUS +EFIAPI +RunImageValidationScenario ( + IN UNIT_TEST_CONTEXT Context + ) +{ + SECURE_BOOT_IMAGE_TEST_SCENARIO *Scenario; + EFI_STATUS Status; + EFI_HANDLE LoadedImageHandle; + UINT8 *Image; + UINTN ImageSize; + UINT8 *Db; + UINTN DbSize; + UINT8 *Dbx; + UINTN DbxSize; + + Scenario = (SECURE_BOOT_IMAGE_TEST_SCENARIO *)Context; + LoadedImageHandle = NULL; + Image = NULL; + Db = NULL; + Dbx = NULL; + UT_ASSERT_NOT_NULL (Scenario); + + // + // Resolve the image to load and build the db / dbx databases this scenario describes. + // + UT_ASSERT_NOT_EFI_ERROR (GetImageForType (Scenario->ImageType, &Image, &ImageSize)); + UT_ASSERT_NOT_EFI_ERROR (BuildSignatureDatabase (Scenario->DbState, Scenario->ImageType, &Db, &DbSize)); + UT_ASSERT_NOT_EFI_ERROR (BuildSignatureDatabase (Scenario->DbxState, Scenario->ImageType, &Dbx, &DbxSize)); + + // + // Point the GetVariable() hook at the databases just built so the platform's Validation + // handler sees the db / dbx this scenario wants. + // + mActiveDb = Db; + mActiveDbSize = DbSize; + mActiveDbx = Dbx; + mActiveDbxSize = DbxSize; + + // + // Load the built-in image from memory. On a Secure Boot enabled platform the DXE core + // invokes the registered image Validation handler, which consults the db / dbx served by + // our GetVariable() hook. The status returned here is the result of that Validation. + // + Status = gBS->LoadImage ( + FALSE, + gImageHandle, + (EFI_DEVICE_PATH_PROTOCOL *)&mTestImageDevicePath, + (VOID *)Image, + ImageSize, + &LoadedImageHandle + ); + + // + // Detach the databases from the hook before freeing them so a stray GetVariable() call + // can never observe a dangling pointer. + // + mActiveDb = NULL; + mActiveDbSize = 0; + mActiveDbx = NULL; + mActiveDbxSize = 0; + + FreeSignatureDatabase (Db); + FreeSignatureDatabase (Dbx); + + if (Image != NULL) { + FreePool (Image); + } + + // + // LoadImage() may load an image yet still report EFI_SECURITY_VIOLATION (untrusted). In + // every case where a handle was produced, unload it so the test leaves no image resident. + // + if (LoadedImageHandle != NULL) { + gBS->UnloadImage (LoadedImageHandle); + } + + UT_ASSERT_STATUS_EQUAL (Status, Scenario->ExpectedStatus); + + return UNIT_TEST_PASSED; +} + +/** + Initialize the unit test framework, register every image validation scenario into a single + unit test suite, and run them. + + @retval EFI_SUCCESS All test cases were dispatched. + @retval EFI_OUT_OF_RESOURCES Resources were unavailable to initialize the unit tests. +**/ +EFI_STATUS +EFIAPI +UefiTestMain ( + VOID + ) +{ + EFI_STATUS Status; + UNIT_TEST_FRAMEWORK_HANDLE Framework; + UNIT_TEST_SUITE_HANDLE SuiteHandle; + UINTN ScenarioIndex; + + Framework = NULL; + + DEBUG ((DEBUG_INFO, "%a v%a\n", UNIT_TEST_NAME, UNIT_TEST_VERSION)); + + Status = InitUnitTestFramework (&Framework, UNIT_TEST_NAME, gEfiCallerBaseName, UNIT_TEST_VERSION); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed in InitUnitTestFramework. Status = %r\n", Status)); + goto EXIT; + } + + // + // Register every image validation scenario into a single unit test suite. Each scenario + // carries its own full, self-describing hierarchical ID (see README.md "Test Catalog"). + // + Status = CreateUnitTestSuite ( + &SuiteHandle, + Framework, + "Image Validation Scenarios", + "SecurityPkg.ImageValidation", + NULL, + NULL + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed in CreateUnitTestSuite\n")); + Status = EFI_OUT_OF_RESOURCES; + goto EXIT; + } + + for (ScenarioIndex = 0; ScenarioIndex < mScenarioCount; ScenarioIndex++) { + CHAR8 ScenarioDescription[256]; + CHAR8 TestDescription[300]; + CONST CHAR8 *TestId; + EFI_STATUS GenerateStatus; + + // + // Auto-generate the human-readable scenario description from DB state, DBX state, and + // expected status. + // + GenerateStatus = GenerateScenarioDescription ( + mScenarios[ScenarioIndex].DbState, + mScenarios[ScenarioIndex].DbxState, + mScenarios[ScenarioIndex].ExpectedStatus, + ScenarioDescription, + sizeof (ScenarioDescription) + ); + + if (EFI_ERROR (GenerateStatus)) { + DEBUG (( + DEBUG_ERROR, + "Failed to generate scenario description for scenario %u. Status=%r\n", + (UINT32)ScenarioIndex, + GenerateStatus + )); + Status = GenerateStatus; + goto EXIT; + } + + // + // Prefix the description with the scenario's full ID so a failing test reported on the + // console points straight back to its README entry. The ID is also used as the test + // case name in the machine-readable (xUnit) results. + // + TestId = mScenarios[ScenarioIndex].Id; + AsciiSPrint (TestDescription, sizeof (TestDescription), "%a: %a", TestId, ScenarioDescription); + + AddTestCase ( + SuiteHandle, + TestDescription, + (CHAR8 *)TestId, + RunImageValidationScenario, + NULL, + NULL, + (UNIT_TEST_CONTEXT)&mScenarios[ScenarioIndex] + ); + } + + // + // Install the GetVariable() hook for the duration of the run, then restore it so the + // application leaves the platform exactly as it found it. + // + InstallGetVariableHook (); + Status = RunAllTestSuites (Framework); + RestoreGetVariableHook (); + +EXIT: + if (Framework != NULL) { + FreeUnitTestFramework (Framework); + } + + return Status; +} + +/** + Standard UEFI entry point for the image Validation unit test application. + + @param[in] ImageHandle The firmware allocated handle for the EFI image. + @param[in] SystemTable A pointer to the EFI System Table. + + @retval EFI_SUCCESS The entry point executed successfully. + @retval other An error occurred while running the unit tests. +**/ +EFI_STATUS +EFIAPI +DxeEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return UefiTestMain (); +} diff --git a/SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.h b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.h new file mode 100644 index 00000000000..727ffb71f8d --- /dev/null +++ b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.h @@ -0,0 +1,160 @@ +/** @file + Header for the Image Validation unit test application. + + Defines the data structures and helpers used to drive high level secure boot image + validation scenarios. Each scenario points the GetVariable() hook at a `db` / `dbx` + signature database, selects one of the built-in PE/COFF images, calls gBS->LoadImage(), + and asserts the EFI_STATUS LoadImage() returns. + + Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef IMAGE_VALIDATION_TEST_APP_H_ +#define IMAGE_VALIDATION_TEST_APP_H_ + +#include +#include + +/// +/// Selects which built-in PE/COFF image a scenario loads. The scenario runner converts this +/// into the corresponding image buffer and size. +/// +typedef enum { + IMAGE_TYPE_UNSIGNED, ///< A valid but unsigned PE/COFF image. + IMAGE_TYPE_SIGNED, ///< An Authenticode-signed image (one signature) PE/COFF image. + IMAGE_TYPE_MULTI_SIGNED, ///< A PE/COFF image with two Authenticode signatures (multi-signed). + IMAGE_TYPE_SIGNED_CORRUPT_CERT, ///< Signed image with its single WIN_CERTIFICATE corrupted. + IMAGE_TYPE_MULTI_SIGNED_CORRUPT_FIRST_CERT, ///< Multi-signed image with its first (signer 1) WIN_CERTIFICATE corrupted. + IMAGE_TYPE_MULTI_SIGNED_CORRUPT_SECOND_CERT, ///< Multi-signed image with its second (signer 2) WIN_CERTIFICATE corrupted. + IMAGE_TYPE_SIGNED_TAMPERED, ///< Signed image whose body was modified after signing, so its Authenticode hash no longer matches. + IMAGE_TYPE_MAX +} IMAGE_TYPE; + +/// +/// Bit flags describing the contents of a `db` or `dbx` signature database. The scenario +/// runner builds a serialized set of EFI_SIGNATURE_LISTs from these flags. Flags may be +/// OR-combined, including mixing hash algorithms, so one database can hold (for example) +/// both a SHA-256 and a SHA-512 entry. +/// +#define DB_STATE_EMPTY 0x00000000 ///< No signature lists (absent variable). + +// +// Image Authenticode digest (EFI_CERT_SHA{256,384,512}_GUID). +// +#define DB_STATE_IMAGE_DIGEST_SHA256 0x00000001 ///< Loaded image's SHA-256 Authenticode digest. +#define DB_STATE_IMAGE_DIGEST_SHA384 0x00000002 ///< Loaded image's SHA-384 Authenticode digest. +#define DB_STATE_IMAGE_DIGEST_SHA512 0x00000004 ///< Loaded image's SHA-512 Authenticode digest. + +// +// X.509 certificates (EFI_CERT_X509_GUID); algorithm-independent. +// +#define DB_STATE_SIGNER1_LEAF_CERT 0x00000008 ///< Signer 1 leaf certificate. +#define DB_STATE_SIGNER1_INTERMEDIATE1_CERT 0x00000010 ///< Signer 1 intermediate 1 (root-signed) CA certificate. +#define DB_STATE_SIGNER1_INTERMEDIATE2_CERT 0x00000020 ///< Signer 1 intermediate 2 (leaf-signing) CA certificate. +#define DB_STATE_SIGNER1_ROOT_CERT 0x00000040 ///< Signer 1 root CA certificate. +#define DB_STATE_SIGNER2_CERT 0x00000080 ///< Signer 2 certificate (multi-signed only). +#define DB_STATE_SIGNER2_UNRELATED_CERT 0x00000100 ///< Cert embedded in signer 2's signature but unrelated to its chain (multi-signed only). + +// +// Certificate TBSCertificate hashes (EFI_CERT_X509_SHA{256,384,512}_GUID). +// +#define DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256 0x00000200 ///< Signer 1 leaf TBS SHA-256 hash. +#define DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA384 0x00000400 ///< Signer 1 leaf TBS SHA-384 hash. +#define DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA512 0x00000800 ///< Signer 1 leaf TBS SHA-512 hash. +#define DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256 0x00001000 ///< Signer 1 intermediate 1 TBS SHA-256 hash. +#define DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA384 0x00002000 ///< Signer 1 intermediate 1 TBS SHA-384 hash. +#define DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA512 0x00004000 ///< Signer 1 intermediate 1 TBS SHA-512 hash. +#define DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256 0x00008000 ///< Signer 1 intermediate 2 TBS SHA-256 hash. +#define DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA384 0x00010000 ///< Signer 1 intermediate 2 TBS SHA-384 hash. +#define DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA512 0x00020000 ///< Signer 1 intermediate 2 TBS SHA-512 hash. +#define DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256 0x00040000 ///< Signer 1 root TBS SHA-256 hash. +#define DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA384 0x00080000 ///< Signer 1 root TBS SHA-384 hash. +#define DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA512 0x00100000 ///< Signer 1 root TBS SHA-512 hash. +#define DB_STATE_SIGNER2_TBS_HASH_SHA256 0x00200000 ///< Signer 2 TBS SHA-256 hash (multi-signed only). +#define DB_STATE_SIGNER2_TBS_HASH_SHA384 0x00400000 ///< Signer 2 TBS SHA-384 hash (multi-signed only). +#define DB_STATE_SIGNER2_TBS_HASH_SHA512 0x00800000 ///< Signer 2 TBS SHA-512 hash (multi-signed only). + +// +// Deliberately malformed database entries (negative / robustness testing). The placement flag +// controls where the malformed EFI_SIGNATURE_LIST is emitted relative to the other entries, so +// a scenario can put a valid approver either before or after the corruption. +// +#define DB_STATE_CORRUPT_SIGNATURE_LIST_FIRST 0x01000000 ///< Malformed EFI_SIGNATURE_LIST placed before all other entries. +#define DB_STATE_CORRUPT_SIGNATURE_LIST_LAST 0x02000000 ///< Malformed EFI_SIGNATURE_LIST placed after all other entries. + +// +// TBSCertificate hashes of a certificate embedded in signer 2's signature but not part of its +// chain (EFI_CERT_X509_SHA{256,384,512}_GUID); the counterpart to DB_STATE_SIGNER2_UNRELATED_CERT. +// +#define DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA256 0x04000000 ///< Signer 2 unrelated cert TBS SHA-256 hash (multi-signed only). +#define DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA384 0x08000000 ///< Signer 2 unrelated cert TBS SHA-384 hash (multi-signed only). +#define DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA512 0x10000000 ///< Signer 2 unrelated cert TBS SHA-512 hash (multi-signed only). + +/// +/// Describes a single secure boot image validation scenario. +/// +typedef struct { + /// + /// The scenario's test ID; used to reference detailed test information in the test app's README. + /// + CONST CHAR8 *Id; + /// + /// Which built-in image to load (see IMAGE_TYPE). + /// + IMAGE_TYPE ImageType; + /// + /// DB_STATE_* flags describing the contents of the `db` database to build. + /// + UINT32 DbState; + /// + /// DB_STATE_* flags describing the contents of the `dbx` database to build. + /// + UINT32 DbxState; + /// + /// EFI_STATUS gBS->LoadImage() is expected to return for this scenario. + /// + EFI_STATUS ExpectedStatus; +} SECURE_BOOT_IMAGE_TEST_SCENARIO; + +/** + Convenience initializer for a SECURE_BOOT_IMAGE_TEST_SCENARIO. +**/ +#define TEST_SCENARIO(Id, ImageType, DbState, DbxState, ExpectedStatus) \ + { \ + (Id), \ + (ImageType), \ + (DbState), \ + (DbxState), \ + (ExpectedStatus) \ + } + +// +// All image validation scenarios. +// +extern CONST SECURE_BOOT_IMAGE_TEST_SCENARIO mScenarios[]; +extern CONST UINTN mScenarioCount; + +/** + Unit test body that drives a single secure boot image validation scenario. + + This function is registered as the test case routine for every scenario. It reads the + SECURE_BOOT_IMAGE_TEST_SCENARIO passed through Context, resolves the image from ImageType, + builds `db` / `dbx` from the DbState / DbxState flags, points the GetVariable() hook at + those databases, calls gBS->LoadImage() on the image, unloads the image if it loaded, and + asserts that the returned EFI_STATUS matches SECURE_BOOT_IMAGE_TEST_SCENARIO.ExpectedStatus. + + @param[in] Context A pointer to the SECURE_BOOT_IMAGE_TEST_SCENARIO that describes the + inputs and expected result. + + @retval UNIT_TEST_PASSED LoadImage() returned the expected status. + @retval UNIT_TEST_ERROR_TEST_FAILED LoadImage() returned an unexpected status. +**/ +UNIT_TEST_STATUS +EFIAPI +RunImageValidationScenario ( + IN UNIT_TEST_CONTEXT Context + ); + +#endif // IMAGE_VALIDATION_TEST_APP_H_ diff --git a/SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.inf b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.inf new file mode 100644 index 00000000000..02b619bb6a9 --- /dev/null +++ b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/ImageValidationTestApp.inf @@ -0,0 +1,67 @@ +## @file +# Unit test application for high level secure boot image Validation. +# +# Drives the platform image Validation handler through a series of secure boot +# scenarios by injecting per-test `db` / `dbx` signature databases via a +# GetVariable() hook and presenting built-in PE/COFF images for Validation. +# +# Copyright (c) Microsoft Corporation. +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010006 + BASE_NAME = ImageValidationTestApp + FILE_GUID = 7B1A6E2C-3C4D-4F5A-9E2B-1D6F0C8A4E11 + MODULE_TYPE = UEFI_APPLICATION + VERSION_STRING = 1.0 + ENTRY_POINT = DxeEntryPoint + +# +# The following information is for reference only and not required by the build tools. +# +# VALID_ARCHITECTURES = X64 AARCH64 +# + +[Sources] + ImageValidationTestApp.c + ImageValidationTestApp.h + Scenarios.c + TestData.h + +[Sources.X64] + X64/TestData.c + +[Sources.AARCH64] + Aarch64/TestData.c + +[Packages] + CryptoPkg/CryptoPkg.dec + MdePkg/MdePkg.dec + SecurityPkg/SecurityPkg.dec + UnitTestFrameworkPkg/UnitTestFrameworkPkg.dec + +[LibraryClasses] + UefiApplicationEntryPoint + BaseLib + BaseCryptLib + BaseMemoryLib + MemoryAllocationLib + DebugLib + UefiLib + UefiBootServicesTableLib + UefiRuntimeServicesTableLib + UnitTestLib + PeCoffLib + +[Guids] + gEfiImageSecurityDatabaseGuid ## CONSUMES + gEfiGlobalVariableGuid ## CONSUMES + gEfiCertSha256Guid ## CONSUMES + gEfiCertSha384Guid ## CONSUMES + gEfiCertSha512Guid ## CONSUMES + gEfiCertX509Guid ## CONSUMES + gEfiCertX509Sha256Guid ## CONSUMES + gEfiCertX509Sha384Guid ## CONSUMES + gEfiCertX509Sha512Guid ## CONSUMES diff --git a/SecurityPkg/Test/ShellTest/ImageValidationTestApp/README.md b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/README.md new file mode 100644 index 00000000000..6fe782c365a --- /dev/null +++ b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/README.md @@ -0,0 +1,930 @@ +# ImageValidationTestApp + +## Overview + +`ImageValidationTestApp` is a UEFI shell test application that validates image authentication +behavior before loading an image. Its purpose is to ensure the platform image validation handler +(invoked by `LoadImage`) meets UEFI specification Secure Boot requirements based on the provided +inputs: + +- Image type (unsigned, signed, multi-signed) +- `db` (allowed signatures/hashes) +- `dbx` (revoked signatures/hashes) + +## Test Framework + +A simple framework was created so that each test scenario specifies the image type, `db`/`dbx` +contents, and the expected output. The framework itself follows the same flow for each test +scenario: + +1. Build synthetic `db` and `dbx` databases from scenario bit flags. +2. Hook `GetVariable` so reads the following variables return scenario controlled values: + - `db` + - `dbx` + - `SecureBoot` +3. Call `LoadImage` on the scenario-selected built-in image buffer. +4. Compare the returned `EFI_STATUS` to the scenario's expected result. + +The `GetVariable` hook exists only for the duration of test execution and is +restored afterward. + +## Supported Image Types + +The test supports three image classes: + +1. `IMAGE_TYPE_UNSIGNED` + - Unsigned PE/COFF image. + +2. `IMAGE_TYPE_SIGNED` + - Single PKCS#7 Authenticode signature (`WIN_CERTIFICATE`). + - Signature chain is four signer 1 certificates deep: + - `SIGNER1_ROOT` + - `SIGNER1_INTERMEDIATE1` + - `SIGNER1_INTERMEDIATE2` + - `SIGNER1_LEAF` + +3. `IMAGE_TYPE_MULTI_SIGNED` + - Two PKCS#7 Authenticode signatures. + - Signature 1 is the same signer 1 chain as `IMAGE_TYPE_SIGNED`. + - Signature 2 is `SIGNER2` alone (a single self-signed certificate), plus a few + unrelated certificates embedded in the signature that are not part of its chain. + +The following variants reuse the images above but are modified on a private copy at load time. +Items 4–6 damage a `WIN_CERTIFICATE` to exercise malformed-input handling; item 7 tampers the +image body to exercise content-integrity enforcement: + +4. `IMAGE_TYPE_SIGNED_CORRUPT_CERT` + - The signed image with its single `WIN_CERTIFICATE` damaged — its `dwLength` set out of + range — so the platform aborts when it parses that entry. The Security data directory + that locates the table is left intact. + +5. `IMAGE_TYPE_MULTI_SIGNED_CORRUPT_FIRST_CERT` + - The multi-signed image with its first (signer 1) `WIN_CERTIFICATE` damaged the same way, + so the platform aborts before it can reach the second signature. + +6. `IMAGE_TYPE_MULTI_SIGNED_CORRUPT_SECOND_CERT` + - The multi-signed image with its second (signer 2) `WIN_CERTIFICATE` damaged the same way, + so the platform aborts only after it has already parsed the intact first signature. + +7. `IMAGE_TYPE_SIGNED_TAMPERED` + - The signed image with a single body byte flipped after signing, so its Authenticode hash no + longer matches the embedded signature or the original image digest. The `WIN_CERTIFICATE` is + left intact, so the image still parses and reaches signature validation. + +## DB / DBX Scenario Flags + +Scenario inputs use `DB_STATE_*` bit flags. These flags describe what is added +to the generated `db` or `dbx` EFI signature database for that scenario. + +`db` and `dbx` use the same flags. The meaning of a flag is identical in both; +only whether it allows (`db`) or revokes (`dbx`) changes behavior. + +### Flag Definitions + +Flags can be OR-combined to place multiple signature lists into one database, and hash +algorithms can be mixed freely (for example a SHA-256 digest alongside a SHA-512 TBS hash). + +1. `DB_STATE_EMPTY` + - `GetVariable` returns `EFI_NOT_FOUND` + +2. `DB_STATE_IMAGE_DIGEST_SHA256` / `_SHA384` / `_SHA512` + - Add the image's Authenticode digest for that algorithm + +3. `DB_STATE_SIGNER1_LEAF_CERT` + - Add signer 1 leaf X.509 certificate (`EFI_CERT_X509_GUID`). + +4. `DB_STATE_SIGNER1_INTERMEDIATE1_CERT` + - Add signer 1 intermediate 1 (root-signed) X.509 certificate. + +5. `DB_STATE_SIGNER1_INTERMEDIATE2_CERT` + - Add signer 1 intermediate 2 (leaf-signing) X.509 certificate. + +6. `DB_STATE_SIGNER1_ROOT_CERT` + - Add signer 1 root X.509 certificate. + +7. `DB_STATE_SIGNER2_CERT` + - Add signer 2 X.509 certificate (used by multi-signed image scenarios). + +8. `DB_STATE_SIGNER2_UNRELATED_CERT` + - Add the X.509 certificate embedded in signer 2's signature but not part of its chain + (multi-signed scenarios). + +9. `DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256` / `_SHA384` / `_SHA512` + - Add the signer 1 leaf certificate's TBSCertificate hash for that algorithm + +10. `DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256` / `_SHA384` / `_SHA512` + - Add the signer 1 intermediate 1 certificate's TBSCertificate hash for that algorithm. + +11. `DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256` / `_SHA384` / `_SHA512` + - Add the signer 1 intermediate 2 certificate's TBSCertificate hash for that algorithm. + +12. `DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256` / `_SHA384` / `_SHA512` + - Add the signer 1 root certificate's TBSCertificate hash for that algorithm. + +13. `DB_STATE_SIGNER2_TBS_HASH_SHA256` / `_SHA384` / `_SHA512` + - Add the signer 2 certificate's TBSCertificate hash for that algorithm + (multi-signed scenarios). + +14. `DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA256` / `_SHA384` / `_SHA512` + - Add the TBSCertificate hash (for that algorithm) of a certificate embedded in + signer 2's signature but not part of its chain (multi-signed scenarios). + +15. `DB_STATE_CORRUPT_SIGNATURE_LIST_FIRST` / `DB_STATE_CORRUPT_SIGNATURE_LIST_LAST` + - Add a deliberately malformed `EFI_SIGNATURE_LIST` (invalid size fields) to the database + to exercise handling of a corrupt `db` / `dbx`. `_FIRST` places it before all other + entries; `_LAST` places it after all other entries. + +## Test Catalog + +This catalog is the human-readable companion to the tests defined in `Scenarios.c`. The +**[Top-Level Groups](#top-level-groups)** table gives the high-level test groups, and each +group's section below opens with a table of its second-level behaviors. The full per-ID index is +the **[All Tests](#all-tests)** table at the bottom of this document. To look up a test, find its +ID and follow the link to the section that documents it, which covers the specifics such as the +exact `db` / `dbx` contents. In VS Code you can also use the Markdown outline (Ctrl+Shift+O) to +jump between sections. + +Test IDs follow the format `..` with an optional trailing run letter — +for example `2.4.1` or `2.4.1a`: + +- **First value — top-level group** (`1`–`7`): the broad category under test, listed in the + [Top-Level Groups](#top-level-groups) table (for example `2` is Signed Image Validation). +- **Second value — second-level behavior**: a specific behavior within that group, listed in the + group's own table (for example `2.4` is Chain Revocation Relativeness). +- **Third value — scenario**: one concrete case of that behavior (for example `2.4.1` is a root + anchor in `db` revoked by a root revoker in `dbx`). +- **Trailing letter — run** (`a`, `b`, `c`, ...): one run of a scenario that repeats over several + variations, such as the hash algorithm or the certificate / TBS-hash form (for example + `2.4.1a`–`2.4.1d`). A scenario with only one run has no letter. + +To skip straight to a flat index of every test with its expected result, jump to +[All Tests](#all-tests). + +### Top-Level Groups + +| ID | Group | Description | +| -- | ----- | ----------- | +| [`1`](#1-unsigned-image-validation) | Unsigned Image Validation | Tests for images with no Authenticode signature. | +| [`2`](#2-signed-image-validation) | Signed Image Validation | Tests for images with a single Authenticode signature (signer 1 chain: root → intermediate 1 → intermediate 2 → leaf). | +| [`3`](#3-multi-signed-image-validation) | Multi-Signed Image Validation | Tests for images carrying two signatures (the signer 1 chain plus signer 2). | +| [`4`](#4-unrelated-certificate-handling) | Unrelated Certificate Handling | Tests that a certificate riding along in a signature but not part of its chain neither authorizes (`db`) nor revokes (`dbx`) the image. | +| [`5`](#5-database-parsing-errors) | Database Parsing Errors | Tests that `db` / `dbx` parsing aborts at a malformed entry: entries before it are honored, entries after are unreachable, and a corrupt `dbx` denies. | +| [`6`](#6-image-certificate-parsing-errors) | Image Certificate Parsing Errors | Tests that image `WIN_CERTIFICATE` parsing aborts at a malformed entry, while an image digest in `db` still authorizes independently. | +| [`7`](#7-tampered-image-rejection) | Tampered Image Rejection | Tests that an image whose body was modified after signing is always denied, regardless of `db` / `dbx` contents. | + +### 1. Unsigned Image Validation + +**Image type:** `IMAGE_TYPE_UNSIGNED`. + +An unsigned image carries no signature. + +| ID | Group | Description | +| -- | ----- | ----------- | +| [`1.1`](#11-empty-database-denial) | Empty Database Denial | An unsigned image with an empty `db` is always denied. | +| [`1.2`](#12-revoked-digest-denial) | Revoked-Digest Denial | An unsigned image is denied by its digest in `dbx` even when `db` would authorize it. | +| [`1.3`](#13-digest-approval) | Digest Approval | An unsigned image is authorized by its digest in `db` and `dbx` is empty. | + +#### 1.1 Empty Database Denial + +- **Purpose:** An unsigned image with an empty `db` is always denied. +- **Image type:** Unsigned (`IMAGE_TYPE_UNSIGNED`). +- **db:** Empty (`DB_STATE_EMPTY`). +- **dbx:** Empty (`DB_STATE_EMPTY`). +- **Expected result:** `EFI_ACCESS_DENIED`. +- **Rationale:** With nothing in `db` to authorize the image, it must be denied; an empty `dbx` + does not imply approval. + +#### 1.2 Revoked-Digest Denial + +- **Purpose:** An unsigned image is denied when its digest is listed in `dbx`, even though an + authorizing digest in `db` approves the same image. +- **Image type:** Unsigned (`IMAGE_TYPE_UNSIGNED`). +- **db:** The image's Authenticode digest, which authorizes the image (`DB_STATE_IMAGE_DIGEST_*`). +- **dbx:** The same image Authenticode digest, which revokes it (`DB_STATE_IMAGE_DIGEST_*`). +- **Expected result:** `EFI_ACCESS_DENIED` for every run. +- **Rationale:** `dbx` revocation takes precedence over `db` authority, so when the image's + digest is present in both, the `dbx` match denies the image even though the `db` match would + approve it. + +Each run places the image digest for one hash algorithm in both `db` and `dbx`: + +| Run | Hash algorithm | +| --- | -------------- | +| `1.2.1a` | SHA-256 | +| `1.2.1b` | SHA-384 | +| `1.2.1c` | SHA-512 | + +#### 1.3 Digest Approval + +- **Purpose:** An unsigned image is approved when its digest is listed in `db` and the `dbx` is + empty, for each hash algorithm. +- **Image type:** Unsigned (`IMAGE_TYPE_UNSIGNED`). +- **db:** The image's Authenticode digest, which authorizes the image (`DB_STATE_IMAGE_DIGEST_*`). +- **dbx:** Empty (`DB_STATE_EMPTY`). +- **Expected result:** `EFI_SUCCESS` for every run. +- **Rationale:** With the image's digest present in `db` and no revocation in `dbx`, the image + is authorized; this is the positive counterpart to 1.2's revocation test. + +Each run places the image digest for one hash algorithm in `db` (with an empty `dbx`): + +| Run | Hash algorithm | +| --- | -------------- | +| `1.3.1a` | SHA-256 | +| `1.3.1b` | SHA-384 | +| `1.3.1c` | SHA-512 | + +### 2. Signed Image Validation + +**Image type:** `IMAGE_TYPE_SIGNED`. + +A singly-signed image carries one Authenticode signature whose chain is four certificates +deep: root CA → intermediate 1 CA → intermediate 2 CA → leaf. + +| ID | Group | Description | +| -- | ----- | ----------- | +| [`2.1`](#21-empty-database-denial) | Empty Database Denial | A signed image with an empty `db` is always denied. | +| [`2.2`](#22-revoked-digest-denial) | Revoked-Digest Denial | A signed image is denied by its image digest in `dbx`, however `db` would authorize it. | +| [`2.3`](#23-database-approval) | Database Approval | A signed image is approved by an image digest, chain certificate, or certificate TBS hash in `db` (empty `dbx`). | +| [`2.4`](#24-chain-revocation-relativeness) | Chain Revocation Relativeness | A `dbx` chain entry revokes only when at the `db` anchor's position or closer to the signer. | +| [`2.5`](#25-image-digest-overrides-signature-revocation) | Image-Digest Overrides Signature Revocation | A revoked signature is still approved when the image digest is in `db`. | + +#### 2.1 Empty Database Denial + +- **Purpose:** A signed image with an empty `db` is always denied. +- **Image type:** Signed (`IMAGE_TYPE_SIGNED`). +- **db:** Empty (`DB_STATE_EMPTY`). +- **dbx:** Empty (`DB_STATE_EMPTY`). +- **Expected result:** `EFI_ACCESS_DENIED`. +- **Rationale:** An empty `db` provides no trust anchor for the signature, so the image is + denied; an empty `dbx` does not imply approval. + +#### 2.2 Revoked-Digest Denial + +- **Purpose:** A signed image is denied whenever its Authenticode digest is listed in `dbx`, no + matter how `db` would otherwise authorize the image (image digest, chain certificate, or + certificate TBS hash). +- **Image type:** Signed (`IMAGE_TYPE_SIGNED`). +- **db:** An authorizing entry — image digest, chain certificate, or certificate TBS hash. +- **dbx:** The image's Authenticode digest, which revokes the image. +- **Expected result:** `EFI_ACCESS_DENIED` for every run. +- **Rationale:** `dbx` revocation of the image digest takes precedence over any `db` + authorization, so the image is denied regardless of what authorizes it in `db`. + +The third ID segment selects the authorizing entry placed in `db`; the image digest is always +present in `dbx`: + +| ID | `db` authorizing entry | +| -- | ---------------------- | +| `2.2.1` | Image Authenticode digest | +| `2.2.2` | Signer 1 chain certificate | +| `2.2.3` | Signer 1 certificate TBS hash | + +`2.2.1` places the image digest in both `db` and `dbx`, one case per hash algorithm: + +| Run | Image digest (`db` and `dbx`) | +| --- | ----------------------------- | +| `2.2.1a` | SHA-256 | +| `2.2.1b` | SHA-384 | +| `2.2.1c` | SHA-512 | + +`2.2.2` places a chain certificate in `db` and the SHA-256 image digest in `dbx` +(certificates are algorithm-independent): + +| Run | `db` certificate | +| --- | ---------------- | +| `2.2.2a` | Leaf | +| `2.2.2b` | Intermediate 1 | +| `2.2.2c` | Root | + +`2.2.3` places a certificate TBS hash in `db` and the SHA-256 image digest in `dbx`: + +| Run | `db` certificate | `db` TBS hash algorithm | +| --- | ---------------- | ----------------------- | +| `2.2.3a` | Leaf | SHA-256 | +| `2.2.3b` | Leaf | SHA-384 | +| `2.2.3c` | Leaf | SHA-512 | +| `2.2.3d` | Intermediate 1 | SHA-256 | +| `2.2.3e` | Intermediate 1 | SHA-384 | +| `2.2.3f` | Intermediate 1 | SHA-512 | +| `2.2.3g` | Root | SHA-256 | +| `2.2.3h` | Root | SHA-384 | +| `2.2.3i` | Root | SHA-512 | + +#### 2.3 Database Approval + +- **Purpose:** A signed image is approved whenever `db` holds an authority that covers it — its + image digest, a certificate in its signing chain, or a chain certificate's TBS hash — and the + `dbx` is empty. +- **Image type:** Signed (`IMAGE_TYPE_SIGNED`). +- **dbx:** Empty (`DB_STATE_EMPTY`). +- **Expected result:** `EFI_SUCCESS` for every run. +- **Rationale:** With no revocation in `dbx`, a single authorizing entry in `db` is sufficient to + approve the image, across every authority type and hash algorithm. + +The third ID segment selects the authority type placed in `db`: + +| ID | `db` authorizing entry | +| -- | ---------------------- | +| `2.3.1` | Image Authenticode digest | +| `2.3.2` | Signer 1 chain certificate | +| `2.3.3` | Signer 1 certificate TBS hash | + +`2.3.1` places the image digest in `db`, one run per hash algorithm: + +| Run | Image digest | +| --- | ------------ | +| `2.3.1a` | SHA-256 | +| `2.3.1b` | SHA-384 | +| `2.3.1c` | SHA-512 | + +`2.3.2` places one signer 1 chain certificate in `db` (certificates are algorithm-independent): + +| Run | `db` certificate | +| --- | ---------------- | +| `2.3.2a` | Leaf | +| `2.3.2b` | Intermediate 1 | +| `2.3.2c` | Intermediate 2 | +| `2.3.2d` | Root | + +`2.3.3` places one signer 1 chain certificate's TBS hash in `db`, for each certificate and hash +algorithm: + +| Run | `db` certificate | TBS hash algorithm | +| --- | ---------------- | ------------------ | +| `2.3.3a` | Leaf | SHA-256 | +| `2.3.3b` | Leaf | SHA-384 | +| `2.3.3c` | Leaf | SHA-512 | +| `2.3.3d` | Intermediate 1 | SHA-256 | +| `2.3.3e` | Intermediate 1 | SHA-384 | +| `2.3.3f` | Intermediate 1 | SHA-512 | +| `2.3.3g` | Intermediate 2 | SHA-256 | +| `2.3.3h` | Intermediate 2 | SHA-384 | +| `2.3.3i` | Intermediate 2 | SHA-512 | +| `2.3.3j` | Root | SHA-256 | +| `2.3.3k` | Root | SHA-384 | +| `2.3.3l` | Root | SHA-512 | + +#### 2.4 Chain Revocation Relativeness + +- **Purpose:** When `db` authorizes a signed image through a certificate in the signer chain + (as an X.509 certificate or as a TBS hash), a `dbx` entry revokes the image only when it names + a certificate at the same chain position as the `db` anchor or closer to the signer. A `dbx` + entry naming a certificate closer to the root than the `db` anchor does not revoke, because it + sits above the trust anchor and is not part of the trusted path. +- **Image type:** Signed (`IMAGE_TYPE_SIGNED`). +- **Expected result:** per the matrix below. (A revoking image digest in `dbx` always denies and + is covered by 2.2, so `dbx` here holds only a chain certificate or chain TBS hash.) +- **Rationale:** Authorizing through a chain certificate anchors trust at that certificate, so + the trusted path runs from the anchor down to the leaf. Revoking any certificate on that path + (the anchor itself or one closer to the signer) breaks it; revoking a certificate above the + anchor does not, because that certificate is no longer relied upon once trust is anchored + lower. + +The signer 1 chain, ordered from the root toward the signer, is root → intermediate 1 → +intermediate 2 → leaf. With the `db` anchor as the row and the `dbx` certificate as the column, +`D` denotes `EFI_ACCESS_DENIED` (revoked) and `A` denotes `EFI_SUCCESS` (approved): + +| `db` anchor ↓ / `dbx` → | Root | Intermediate 1 | Intermediate 2 | Leaf | +| ----------------------- | ---- | -------------- | -------------- | ---- | +| Root | D | D | D | D | +| Intermediate 1 | A | D | D | D | +| Intermediate 2 | A | A | D | D | +| Leaf | A | A | A | D | + +Each numbered scenario `2.4.1`–`2.4.16` fixes one (`db` anchor, `dbx` revoker) position pair +from the matrix above, and its four runs `a`–`d` cover every combination of the two +representation forms — full X.509 certificate and SHA-256 TBS hash — for the anchor and the +revoker. All four runs of a scenario share the same expected result, because revocation +depends only on chain position, not on the form used to express the anchor or the revoker: + +| Run | `db` anchor form | `dbx` revoker form | +| --- | ---------------- | ------------------ | +| `a` | X.509 certificate | X.509 certificate | +| `b` | X.509 certificate | SHA-256 TBS hash | +| `c` | SHA-256 TBS hash | X.509 certificate | +| `d` | SHA-256 TBS hash | SHA-256 TBS hash | + +The position pair fixed by each scenario, and the expected result shared by its four runs: + +| ID | `db` anchor | `dbx` revoker | Expected (all runs) | +| -- | ----------- | ------------- | ------------------- | +| `2.4.1` | Root | Root | `EFI_ACCESS_DENIED` | +| `2.4.2` | Root | Intermediate 1 | `EFI_ACCESS_DENIED` | +| `2.4.3` | Root | Intermediate 2 | `EFI_ACCESS_DENIED` | +| `2.4.4` | Root | Leaf | `EFI_ACCESS_DENIED` | +| `2.4.5` | Intermediate 1 | Root | `EFI_SUCCESS` | +| `2.4.6` | Intermediate 1 | Intermediate 1 | `EFI_ACCESS_DENIED` | +| `2.4.7` | Intermediate 1 | Intermediate 2 | `EFI_ACCESS_DENIED` | +| `2.4.8` | Intermediate 1 | Leaf | `EFI_ACCESS_DENIED` | +| `2.4.9` | Intermediate 2 | Root | `EFI_SUCCESS` | +| `2.4.10` | Intermediate 2 | Intermediate 1 | `EFI_SUCCESS` | +| `2.4.11` | Intermediate 2 | Intermediate 2 | `EFI_ACCESS_DENIED` | +| `2.4.12` | Intermediate 2 | Leaf | `EFI_ACCESS_DENIED` | +| `2.4.13` | Leaf | Root | `EFI_SUCCESS` | +| `2.4.14` | Leaf | Intermediate 1 | `EFI_SUCCESS` | +| `2.4.15` | Leaf | Intermediate 2 | `EFI_SUCCESS` | +| `2.4.16` | Leaf | Leaf | `EFI_ACCESS_DENIED` | + +`2.4.17` places two chain anchors in `db` at once — intermediate 1 and intermediate 2 — while +`dbx` revokes only intermediate 1. Certificates are written into `db` in chain order (leaf, +intermediate 1, intermediate 2, root), so the revoked intermediate 1 anchor is evaluated first; +authorization must not stop at that revoked anchor but continue to the intermediate 2 anchor, +which the intermediate 1 entry in `dbx` (above it) does not revoke, so the image is approved. The +four runs cover both representation forms for the `db` anchors and the `dbx` revoker: + +| ID | `db` anchors | `dbx` revoker | Expected | +| -- | ------------ | ------------- | -------- | +| `2.4.17a` | Intermediate 1 + intermediate 2 certificates | Intermediate 1 certificate | `EFI_SUCCESS` | +| `2.4.17b` | Intermediate 1 + intermediate 2 certificates | Intermediate 1 TBS hash | `EFI_SUCCESS` | +| `2.4.17c` | Intermediate 1 + intermediate 2 TBS hashes | Intermediate 1 certificate | `EFI_SUCCESS` | +| `2.4.17d` | Intermediate 1 + intermediate 2 TBS hashes | Intermediate 1 TBS hash | `EFI_SUCCESS` | + +#### 2.5 Image-Digest Overrides Signature Revocation + +- **Purpose:** A signed image whose signing certificate is revoked by `dbx` is still approved + when the image's own Authenticode digest is enrolled in `db`. The image-digest authority is + evaluated after the per-signature step and is independent of the revoked signature. +- **Image type:** Signed (`IMAGE_TYPE_SIGNED`). +- **db:** The image's SHA-256 Authenticode digest (`DB_STATE_IMAGE_DIGEST_SHA256`). +- **dbx:** The signer 1 leaf certificate (`DB_STATE_SIGNER1_LEAF_CERT`), which revokes the + signature. +- **Expected result:** `EFI_SUCCESS`. +- **Rationale:** Validation rejects the revoked *signature* but continues to the image-digest + check, where a digest match in `db` authorizes the image on its own. This is the counterpart to + an image digest in `dbx` (2.2), which is always fatal: a revoked certificate is survivable + through a `db` image digest, whereas a revoked image digest is not. + +### 3. Multi-Signed Image Validation + +**Image type:** `IMAGE_TYPE_MULTI_SIGNED`. + +A multi-signed image carries two signatures: the signer 1 chain +(root → intermediate 1 → intermediate 2 → leaf) and signer 2. Signer 2's signature also +embeds unrelated certificates that are not part of its chain. + +| ID | Group | Description | +| -- | ----- | ----------- | +| [`3.1`](#31-empty-database-denial) | Empty Database Denial | A multi-signed image with an empty `db` is always denied. | +| [`3.2`](#32-revoked-digest-denial) | Revoked-Digest Denial | A multi-signed image is denied by its image digest in `dbx`, however `db` would authorize it. | +| [`3.3`](#33-two-signature-evaluation) | Two-Signature Evaluation | How the two signatures' per-signature results combine into a single image decision. | + +#### 3.1 Empty Database Denial + +- **Purpose:** A multi-signed image with an empty `db` is always denied. +- **Image type:** Multi-Signed (`IMAGE_TYPE_MULTI_SIGNED`). +- **db:** Empty (`DB_STATE_EMPTY`). +- **dbx:** Empty (`DB_STATE_EMPTY`). +- **Expected result:** `EFI_ACCESS_DENIED`. +- **Rationale:** An empty `db` provides no trust anchor for either signature, so the image is + denied; an empty `dbx` does not imply approval. + +#### 3.2 Revoked-Digest Denial + +- **Purpose:** A multi-signed image is denied whenever its Authenticode digest is listed in + `dbx`, no matter how `db` would otherwise authorize the image (image digest, signer 2 + certificate, or signer 2 certificate TBS hash). +- **Image type:** Multi-Signed (`IMAGE_TYPE_MULTI_SIGNED`). +- **db:** An authorizing entry — image digest, signer 2 certificate, or signer 2 certificate + TBS hash. +- **dbx:** The image's Authenticode digest, which revokes the image. +- **Expected result:** `EFI_ACCESS_DENIED` for every run. +- **Rationale:** `dbx` revocation of the image digest takes precedence over any `db` + authorization, so the image is denied regardless of what authorizes it in `db`. + +The third ID segment selects the authorizing entry placed in `db`; the image digest is always +present in `dbx`: + +| ID | `db` authorizing entry | +| -- | ---------------------- | +| `3.2.1` | Image Authenticode digest | +| `3.2.2` | Signer 2 certificate | +| `3.2.3` | Signer 2 certificate TBS hash | + +`3.2.1` places the image digest in both `db` and `dbx`, one case per hash algorithm: + +| Run | Image digest (`db` and `dbx`) | +| --- | ----------------------------- | +| `3.2.1a` | SHA-256 | +| `3.2.1b` | SHA-384 | +| `3.2.1c` | SHA-512 | + +`3.2.2` places the signer 2 certificate in `db` and the SHA-256 image digest in `dbx`. Signer 2 +is a single self-signed certificate, so this test has one case. + +`3.2.3` places a signer 2 certificate TBS hash in `db` and the SHA-256 image digest in `dbx`, +one case per hash algorithm: + +| Run | Signer 2 TBS hash algorithm | +| --- | --------------------------- | +| `3.2.3a` | SHA-256 | +| `3.2.3b` | SHA-384 | +| `3.2.3c` | SHA-512 | + +#### 3.3 Two-Signature Evaluation + +- **Purpose:** Exercise the behavior that only exists with two `WIN_CERTIFICATE`s: how the + per-signature results combine into a single image decision. Validation returns on the first + authorizing signature, records-and-continues past a revoked one, and denies only once no + signature authorizes. Authorizing or revoking a single signature is itself covered by Group 2. +- **Image type:** Multi-Signed (`IMAGE_TYPE_MULTI_SIGNED`). +- **db / dbx:** Only signer entries (no image digests), so the two-signature loop alone decides. + Signer 1 authority is its leaf certificate (`DB_STATE_SIGNER1_LEAF_CERT`); signer 2 authority is + its certificate (`DB_STATE_SIGNER2_CERT`); a revoker is the same certificate placed in `dbx`. +- **Expected result:** per the table below. +- **Rationale:** A multi-signed image is authorized when any one of its signatures is authorized + by `db` and that signature is not revoked by `dbx`; a *different* signature being revoked does + not by itself deny the image. + +Signer 1 is the first certificate (its chain), signer 2 is the second. "Authorized" means the +signer is in `db`; "revoked" means it is in `dbx`; "absent" means it is in neither: + +| ID | Signer 1 | Signer 2 | Expected | Behavior exercised | +| -- | -------- | -------- | -------- | ------------------ | +| `3.3.1` | Authorized | absent | `EFI_SUCCESS` | the first signature authorizes; a second signature does not interfere | +| `3.3.2` | absent | Authorized | `EFI_SUCCESS` | the loop advances and authorizes via the second signature | +| `3.3.3` | Revoked | Authorized | `EFI_SUCCESS` | a revoked signature does not stop evaluation of the next one | +| `3.3.4` | Authorized | Revoked | `EFI_SUCCESS` | the first authorization returns before the second (revoked) signature is consulted | +| `3.3.5` | Revoked | absent | `EFI_ACCESS_DENIED` | a revoked signature with no authorization denies | +| `3.3.6` | absent | Revoked | `EFI_ACCESS_DENIED` | no authorization with a revoked signature denies | +| `3.3.7` | Revoked | Revoked | `EFI_ACCESS_DENIED` | both signatures revoked denies | + +### 4. Unrelated Certificate Handling + +These tests confirm that a certificate that merely rides along inside a signature — embedded in +the PKCS#7 but not part of the signer's chain, so it signs nothing — is neither a valid +authority in `db` nor a valid revocation in `dbx`. Only a certificate that actually anchors a +signature's chain may authorize or revoke the image. + +| ID | Group | Description | +| -- | ----- | ----------- | +| [`4.1`](#41-unrelated-certificate-non-authorization) | Unrelated Certificate Non-Authorization | A certificate outside the signer's chain in `db` does not authorize the image. | +| [`4.2`](#42-unrelated-certificate-non-revocation) | Unrelated Certificate Non-Revocation | A certificate outside the signer's chain in `dbx` does not revoke an image that `db` authorizes. | + +#### 4.1 Unrelated Certificate Non-Authorization + +- **Purpose:** A certificate embedded in a signature but not part of its signing chain + does not authorize the image, whether it is listed in `db` as a certificate or as a TBS hash. +- **dbx:** Empty (`DB_STATE_EMPTY`). +- **Expected result:** `EFI_ACCESS_DENIED` for every run. +- **Rationale:** Trust in `db` must anchor only a certificate that actually validates a + signature's chain. A certificate outside that chain is carried inside the signature but signs + nothing, so trusting it — by certificate or by TBS hash — must not approve the image; with no + other authority in `db`, the image is denied. + +`4.1.1` places the unrelated certificate itself in `db` (a single case): + +| ID | `db` authorizing entry | Expected | +| -- | ---------------------- | -------- | +| `4.1.1` | Certificate outside the signer's chain | `EFI_ACCESS_DENIED` | + +`4.1.2` places the unrelated certificate's TBS hash in `db`, one run per hash algorithm: + +| Run | Unrelated-cert TBS hash algorithm | +| --- | --------------------------------- | +| `4.1.2a` | SHA-256 | +| `4.1.2b` | SHA-384 | +| `4.1.2c` | SHA-512 | + +#### 4.2 Unrelated Certificate Non-Revocation + +- **Purpose:** A certificate embedded in a signature but not part of its signing chain + does not *revoke* an image that `db` authorizes, whether it is listed in `dbx` as a + certificate or as a TBS hash. +- **db:** A certificate that actually authorizes the image (`DB_STATE_SIGNER2_CERT`). +- **Expected result:** `EFI_SUCCESS` for every run. +- **Rationale:** A `dbx` revocation must target a certificate that actually anchors a signature's + chain. A certificate outside that chain merely rides along inside the signature and signs + nothing, so its presence in `dbx` — by certificate or by TBS hash — must not revoke an image + that a real authority in `db` approves. This is the `dbx` counterpart to 4.1. + +`4.2.1` places the unrelated certificate itself in `dbx` (a single case): + +| ID | `db` (authorizes) | `dbx` (must not revoke) | Expected | +| -- | ----------------- | ----------------------- | -------- | +| `4.2.1` | Authorizing certificate | Certificate outside the signer's chain | `EFI_SUCCESS` | + +`4.2.2` places the unrelated certificate's TBS hash in `dbx`, one run per hash algorithm: + +| Run | Unrelated-cert TBS hash algorithm (in `dbx`) | +| --- | -------------------------------------------- | +| `4.2.2a` | SHA-256 | +| `4.2.2b` | SHA-384 | +| `4.2.2c` | SHA-512 | + +### 5. Database Parsing Errors + +These tests exercise a `db` / `dbx` that carries a deliberately malformed `EFI_SIGNATURE_LIST`. +The model under test is that database parsing *aborts at the malformed entry*: entries that +appear before it are parsed and honored, while the malformed entry and anything after it are +unreachable. Two placement flags control where the malformed list sits relative to an +otherwise-authorizing entry — `DB_STATE_CORRUPT_SIGNATURE_LIST_FIRST` (before) and +`DB_STATE_CORRUPT_SIGNATURE_LIST_LAST` (after). + +This yields three behaviors, tested for every image type: + +- **Approver before the corruption (`db`)** — the authorizing entry is parsed before the + malformed list is reached, so the image is *approved*. +- **Approver after the corruption (`db`)** — parsing aborts at the malformed list before the + authorizing entry is reached, so the image is *denied*. +- **Corrupt `dbx`** — a revocation cannot be ruled out when the `dbx` cannot be fully parsed, + so the image is *denied* even though `db` would approve it. + +| ID | Group | Description | +| -- | ----- | ----------- | +| [`5.1`](#51-unsigned-database-corruption) | Unsigned Database Corruption | Malformed `db` / `dbx` handling for an unsigned image. | +| [`5.2`](#52-signed-database-corruption) | Signed Database Corruption | Malformed `db` / `dbx` handling for a signed image. | +| [`5.3`](#53-multi-signed-database-corruption) | Multi-Signed Database Corruption | Malformed `db` / `dbx` handling for a multi-signed image. | + +#### 5.1 Unsigned Database Corruption + +- **Image type:** Unsigned (`IMAGE_TYPE_UNSIGNED`); authorized in `db` by its image digest. + +| ID | `db` | `dbx` | Expected | +| -- | ---- | ----- | -------- | +| `5.1.1` | Authorizing digest, then malformed list (`_LAST`) | Empty | `EFI_SUCCESS` | +| `5.1.2` | Malformed list (`_FIRST`), then authorizing digest | Empty | `EFI_ACCESS_DENIED` | +| `5.1.3` | Authorizing digest | Malformed list | `EFI_ACCESS_DENIED` | + +- `5.1.1` — the authorizing digest is parsed before the malformed list, so the image is + approved before parsing would abort. +- `5.1.2` — the malformed list comes first, so parsing aborts before the digest is reached and + the image is denied. +- `5.1.3` — the `db` would authorize the image, but the `dbx` is malformed; a revocation cannot + be ruled out, so the image is denied. + +#### 5.2 Signed Database Corruption + +- **Image type:** Signed (`IMAGE_TYPE_SIGNED`). A signed image can be authorized by an image + digest, a signing certificate, or a certificate TBS hash, so the "approver before corruption" + case exercises each authority type. + +`5.2.1` places an authorizing entry before the malformed list (`_LAST`) with an empty `dbx`; +each run is approved because the authority is parsed first: + +| Run | `db` authorizing entry (before the malformed list) | Expected | +| --- | -------------------------------------------------- | -------- | +| `5.2.1a` | Image digest | `EFI_SUCCESS` | +| `5.2.1b` | Signer 1 leaf certificate | `EFI_SUCCESS` | +| `5.2.1c` | Signer 1 leaf TBS hash | `EFI_SUCCESS` | + +| ID | `db` | `dbx` | Expected | +| -- | ---- | ----- | -------- | +| `5.2.2` | Malformed list (`_FIRST`), then authorizing digest | Empty | `EFI_ACCESS_DENIED` | +| `5.2.3` | Authorizing digest | Malformed list | `EFI_ACCESS_DENIED` | + +- `5.2.2` — the malformed list comes first, so parsing aborts before any authority is reached + and the image is denied. +- `5.2.3` — `db` would authorize the image, but the malformed `dbx` means a revocation cannot + be ruled out, so the image is denied. + +#### 5.3 Multi-Signed Database Corruption + +- **Image type:** Multi-Signed (`IMAGE_TYPE_MULTI_SIGNED`). Either of the two signatures alone + would authorize the image, so each signature's authority is tested independently — signer 1's + leaf certificate (first signature) and signer 2's certificate (second signature) — placed + before or after the malformed list. + +`5.3.1` places a single signature's authority *before* the malformed list (`_LAST`); `5.3.2` +places it *after* the malformed list (`_FIRST`). The `dbx` is empty in both: + +| ID | `db` authorizing entry | Placement | Expected | +| -- | ---------------------- | --------- | -------- | +| `5.3.1a` | Signer 1 leaf certificate | Before corruption | `EFI_SUCCESS` | +| `5.3.1b` | Signer 2 certificate | Before corruption | `EFI_SUCCESS` | +| `5.3.2a` | Signer 1 leaf certificate | After corruption | `EFI_ACCESS_DENIED` | +| `5.3.2b` | Signer 2 certificate | After corruption | `EFI_ACCESS_DENIED` | + +`5.3.3` keeps both signatures' approvals in a valid `db` but corrupts the `dbx`: + +| ID | `db` | `dbx` | Expected | +| -- | ---- | ----- | -------- | +| `5.3.3` | Both-signature approvals | Malformed list | `EFI_ACCESS_DENIED` | + +- `5.3.1a` / `5.3.1b` — either signature's authority, parsed before the malformed list, + approves the image on its own. +- `5.3.2a` / `5.3.2b` — the malformed list comes first, so parsing aborts before either + authority is reached and the image is denied. +- `5.3.3` — `db` approves both signatures, but the malformed `dbx` means a revocation cannot be + ruled out, so the image is denied. + +### 6. Image Certificate Parsing Errors + +These tests exercise an image whose embedded `WIN_CERTIFICATE` (Authenticode signature) table +carries a malformed entry. The model under test is that certificate-table parsing *aborts at +the malformed entry*: signatures before it can still be parsed and honored, while the malformed +entry and any signature after it are unreachable. Independently, an image digest in `db` +authorizes the image without parsing any signature at all. + +The malformed image variants damage a private copy of the image at load time by setting a +`WIN_CERTIFICATE.dwLength` out of range; the Security data directory that locates the table is +left intact, so the table is still found but cannot be walked past the damaged entry. The +variant selects which certificate is damaged: `IMAGE_TYPE_SIGNED_CORRUPT_CERT` (the signed +image's only certificate), `IMAGE_TYPE_MULTI_SIGNED_CORRUPT_FIRST_CERT` (the multi-signed +image's first / signer 1 certificate), or `IMAGE_TYPE_MULTI_SIGNED_CORRUPT_SECOND_CERT` (its +second / signer 2 certificate). + +| ID | Group | Description | +| -- | ----- | ----------- | +| [`6.1`](#61-signed-image-certificate-corruption) | Signed Image Certificate Corruption | Malformed `WIN_CERTIFICATE` in a signed image; an image digest in `db` still authorizes. | +| [`6.2`](#62-multi-signed-first-certificate-corruption) | Multi-Signed First-Certificate Corruption | A malformed first signature aborts parsing before the intact second is reached. | +| [`6.3`](#63-multi-signed-second-certificate-corruption) | Multi-Signed Second-Certificate Corruption | The intact first signature is parsed before the malformed second. | + +#### 6.1 Signed Image Certificate Corruption + +- **Image type:** Signed, corrupt certificate (`IMAGE_TYPE_SIGNED_CORRUPT_CERT`); empty `dbx`. +- **Behavior:** The image's only signature cannot be parsed. An image digest in `db` still + authorizes it (the hash path never parses the signature), but a signature-path authority — a + certificate or a certificate TBS hash — cannot be matched, so the image is denied. + +| ID | `db` authorizing entry | Expected | +| -- | ---------------------- | -------- | +| `6.1.1` | Image digest (SHA-256) | `EFI_SUCCESS` | +| `6.1.2a` | Signer 1 leaf certificate | `EFI_ACCESS_DENIED` | +| `6.1.2b` | Signer 1 leaf TBS hash (SHA-256) | `EFI_ACCESS_DENIED` | + +- `6.1.1` — the image digest in `db` authorizes the image without ever parsing the malformed + signature, so it is approved. +- `6.1.2a` / `6.1.2b` — the only authority in `db` requires parsing the signature to match the + signing certificate (or its TBS hash); because the certificate cannot be parsed, no match is + possible and the image is denied. + +#### 6.2 Multi-Signed First-Certificate Corruption + +- **Image type:** Multi-signed, first certificate corrupt + (`IMAGE_TYPE_MULTI_SIGNED_CORRUPT_FIRST_CERT`); empty `dbx`. +- **Behavior:** The first (signer 1) `WIN_CERTIFICATE` is malformed, so parsing aborts before + the intact second (signer 2) signature can be reached. + +| ID | `db` authorizing entry | Expected | +| -- | ---------------------- | -------- | +| `6.2.1` | Signer 2 certificate | `EFI_ACCESS_DENIED` | + +- `6.2.1` — `db` authorizes signer 2, whose signature is intact, but the malformed first + certificate stops parsing before signer 2's signature is reached, so the image is denied. + +#### 6.3 Multi-Signed Second-Certificate Corruption + +- **Image type:** Multi-signed, second certificate corrupt + (`IMAGE_TYPE_MULTI_SIGNED_CORRUPT_SECOND_CERT`); empty `dbx`. +- **Behavior:** The first (signer 1) `WIN_CERTIFICATE` is intact and is parsed first; the second + (signer 2) certificate is malformed. Whether the image is approved depends on which signature + `db` authorizes. + +| ID | `db` authorizing entry | Expected | +| -- | ---------------------- | -------- | +| `6.3.1` | Signer 1 leaf certificate | `EFI_SUCCESS` | +| `6.3.2` | Signer 2 certificate | `EFI_ACCESS_DENIED` | + +- `6.3.1` — `db` authorizes signer 1, whose signature is intact and parsed before the malformed + second certificate, so the image is approved. +- `6.3.2` — `db` authorizes only signer 2, but its certificate is the malformed one; parsing + aborts there without an approval, so the image is denied. + +### 7. Tampered Image Rejection + +**Image type:** `IMAGE_TYPE_SIGNED_TAMPERED`. + +A tampered image is a signed image whose body was modified after signing, so its Authenticode +hash no longer matches the embedded signature or the digest enrolled from the original image. The +`WIN_CERTIFICATE` is left intact, so the image still parses and reaches signature validation. + +| ID | Group | Description | +| -- | ----- | ----------- | +| [`7.1`](#71-tampered-signed-image) | Tampered Signed Image | A tampered image is denied regardless of how `db` would authorize the original. | + +#### 7.1 Tampered Signed Image + +- **Purpose:** A tampered image is denied no matter how `db` would try to authorize the original + image — by a signer certificate, a signer certificate TBS hash, the original image digest, or + nothing at all. +- **Image type:** Tampered signed (`IMAGE_TYPE_SIGNED_TAMPERED`). +- **db:** One authority per run (see the table); `dbx` is empty. +- **Expected result:** `EFI_ACCESS_DENIED` for every run. +- **Rationale:** Tampering changes the image's Authenticode hash, so the signature no longer + verifies and the recomputed image digest no longer matches the enrolled one. No `db` authority + should approve it. + +| ID | `db` authority | Expected | Notes | +| -- | -------------- | -------- | ----- | +| `7.1.1` | Signer 1 leaf certificate | `EFI_ACCESS_DENIED` | `AuthenticodeVerify` fails against the changed hash | +| `7.1.2` | Signer 1 leaf certificate TBS hash | `EFI_ACCESS_DENIED` | **fails today** — the TBS-hash authorization path matches an embedded certificate without verifying the signature, so it wrongly approves the tampered image | +| `7.1.3` | Original image SHA-256 digest | `EFI_ACCESS_DENIED` | the tampered image hashes to a different digest, so `db` does not match | +| `7.1.4` | Empty | `EFI_ACCESS_DENIED` | nothing authorizes the image | + +### Adding or Documenting a Test + +To add or document a test, keep the code and this catalog in sync: + +1. **Pick the ID.** Choose the group (`1`/`2`/`3`/`4`/`5`/`6`/`7`), the behavior, and the variant — for + example `2.4.1`. When a test runs several cases, append a run letter to each case + (`2.4.1a`, `2.4.1b`, ...); a single-case test uses no letter. +2. **Define the scenario in `Scenarios.c`.** Use `TEST_SCENARIO` and pass the full ID as the + first argument: + + ```c + TEST_SCENARIO ( + "2.4.1", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER1_ROOT_CERT, + EFI_ACCESS_DENIED + ), + ``` + +3. **Add it to the test table.** In the [All Tests](#all-tests) table in the + [Test Catalog](#test-catalog), add a row for the test's `..` ID + (linked to the section that documents it) with a short behavior description. Individual run + letters are documented in the test's section, not the catalog. +4. **Document the behavior.** Add or update the section that the test ID links to, describing + what the test proves and the inputs it uses. Use this template: + + ```markdown + #### + + - **Purpose:** + - **Image type:** (`IMAGE_TYPE_*`) + - **db:** + - **dbx:** + - **Expected result:** `` + - **Rationale:** + ``` + +5. **Keep IDs stable.** Once published, do not renumber a test; failures and reports + reference its ID. + +## Notes + +- Scenario definitions live in `Scenarios.c`. +- Test data blobs (images, digests, certificates) are generated by `GenTestData.py`; see + that script's header comment or run `python3 GenTestData.py --help` to regenerate them. + Each generated `TestData.c` also points back to the script. +- Scenario data structures, `DB_STATE_*` definitions, and the `TEST_SCENARIO` macro are in + `ImageValidationTestApp.h`. +- Runtime test behavior, database synthesis, and test-ID composition are in + `ImageValidationTestApp.c`. + +## All Tests + +| Test ID | Expected | Description | +| ------- | -------- | ----------- | +| [`1.1.1`](#11-empty-database-denial) | `EFI_ACCESS_DENIED` | Unsigned image with empty `db` is always denied | +| [`1.2.1`](#12-revoked-digest-denial) | `EFI_ACCESS_DENIED` | Unsigned image denied by a `dbx` digest even when an authorizing `db` digest approves it | +| [`1.3.1`](#13-digest-approval) | `EFI_SUCCESS` | Unsigned image approved by a `db` digest when the `dbx` is empty | +| [`2.1.1`](#21-empty-database-denial) | `EFI_ACCESS_DENIED` | Signed image with empty `db` is always denied | +| [`2.2.1`](#22-revoked-digest-denial) | `EFI_ACCESS_DENIED` | Signed image denied by a `dbx` image digest even when an authorizing `db` digest approves it | +| [`2.2.2`](#22-revoked-digest-denial) | `EFI_ACCESS_DENIED` | Signed image denied by a `dbx` image digest even when an authorizing `db` certificate approves it | +| [`2.2.3`](#22-revoked-digest-denial) | `EFI_ACCESS_DENIED` | Signed image denied by a `dbx` image digest even when an authorizing `db` TBS hash approves it | +| [`2.3.1`](#23-database-approval) | `EFI_SUCCESS` | Signed image approved by its image digest in `db` (empty `dbx`) | +| [`2.3.2`](#23-database-approval) | `EFI_SUCCESS` | Signed image approved by a signer 1 chain certificate in `db` (empty `dbx`) | +| [`2.3.3`](#23-database-approval) | `EFI_SUCCESS` | Signed image approved by a signer 1 certificate TBS hash in `db` (empty `dbx`) | +| [`2.4.1`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with a root anchor in `db` revoked by a root revoker in `dbx` | +| [`2.4.2`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with a root anchor in `db` revoked by an intermediate 1 revoker in `dbx` | +| [`2.4.3`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with a root anchor in `db` revoked by an intermediate 2 revoker in `dbx` | +| [`2.4.4`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with a root anchor in `db` revoked by a leaf revoker in `dbx` | +| [`2.4.5`](#24-chain-revocation-relativeness) | `EFI_SUCCESS` | Signed image with an intermediate 1 anchor in `db` not revoked by a root revoker in `dbx` (revoker above anchor) | +| [`2.4.6`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with an intermediate 1 anchor in `db` revoked by an intermediate 1 revoker in `dbx` | +| [`2.4.7`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with an intermediate 1 anchor in `db` revoked by an intermediate 2 revoker in `dbx` | +| [`2.4.8`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with an intermediate 1 anchor in `db` revoked by a leaf revoker in `dbx` | +| [`2.4.9`](#24-chain-revocation-relativeness) | `EFI_SUCCESS` | Signed image with an intermediate 2 anchor in `db` not revoked by a root revoker in `dbx` (revoker above anchor) | +| [`2.4.10`](#24-chain-revocation-relativeness) | `EFI_SUCCESS` | Signed image with an intermediate 2 anchor in `db` not revoked by an intermediate 1 revoker in `dbx` (revoker above anchor) | +| [`2.4.11`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with an intermediate 2 anchor in `db` revoked by an intermediate 2 revoker in `dbx` | +| [`2.4.12`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with an intermediate 2 anchor in `db` revoked by a leaf revoker in `dbx` | +| [`2.4.13`](#24-chain-revocation-relativeness) | `EFI_SUCCESS` | Signed image with a leaf anchor in `db` not revoked by a root revoker in `dbx` (revoker above anchor) | +| [`2.4.14`](#24-chain-revocation-relativeness) | `EFI_SUCCESS` | Signed image with a leaf anchor in `db` not revoked by an intermediate 1 revoker in `dbx` (revoker above anchor) | +| [`2.4.15`](#24-chain-revocation-relativeness) | `EFI_SUCCESS` | Signed image with a leaf anchor in `db` not revoked by an intermediate 2 revoker in `dbx` (revoker above anchor) | +| [`2.4.16`](#24-chain-revocation-relativeness) | `EFI_ACCESS_DENIED` | Signed image with a leaf anchor in `db` revoked by a leaf revoker in `dbx` | +| [`2.4.17`](#24-chain-revocation-relativeness) | `EFI_SUCCESS` | Signed image with two `db` chain anchors (intermediate 1 and 2) approved via intermediate 2 when only intermediate 1 is revoked in `dbx` | +| [`2.5.1`](#25-image-digest-overrides-signature-revocation) | `EFI_SUCCESS` | Signed image whose signer is revoked in `dbx` is still approved by its image digest in `db` | +| [`3.1.1`](#31-empty-database-denial) | `EFI_ACCESS_DENIED` | Multi-signed image with empty `db` is always denied | +| [`3.2.1`](#32-revoked-digest-denial) | `EFI_ACCESS_DENIED` | Multi-signed image denied by a `dbx` image digest even when an authorizing `db` digest approves it | +| [`3.2.2`](#32-revoked-digest-denial) | `EFI_ACCESS_DENIED` | Multi-signed image denied by a `dbx` image digest even when an authorizing `db` certificate approves it | +| [`3.2.3`](#32-revoked-digest-denial) | `EFI_ACCESS_DENIED` | Multi-signed image denied by a `dbx` image digest even when an authorizing `db` TBS hash approves it | +| [`3.3.1`](#33-two-signature-evaluation) | `EFI_SUCCESS` | Multi-signed image authorized by its first signature; a second signature present in the image does not interfere | +| [`3.3.2`](#33-two-signature-evaluation) | `EFI_SUCCESS` | Multi-signed image authorized by its second signature when the first is not found in `db` | +| [`3.3.3`](#33-two-signature-evaluation) | `EFI_SUCCESS` | Multi-signed image approved when its first signature is revoked but its second is authorized | +| [`3.3.4`](#33-two-signature-evaluation) | `EFI_SUCCESS` | Multi-signed image approved by its first signature even though its second would be revoked (never consulted) | +| [`3.3.5`](#33-two-signature-evaluation) | `EFI_ACCESS_DENIED` | Multi-signed image denied when its first signature is revoked and its second is not authorized | +| [`3.3.6`](#33-two-signature-evaluation) | `EFI_ACCESS_DENIED` | Multi-signed image denied when its first signature is not authorized and its second is revoked | +| [`3.3.7`](#33-two-signature-evaluation) | `EFI_ACCESS_DENIED` | Multi-signed image denied when both signatures are revoked | +| [`4.1.1`](#41-unrelated-certificate-non-authorization) | `EFI_ACCESS_DENIED` | Image denied when only a certificate outside the signer's chain is in `db` | +| [`4.1.2`](#41-unrelated-certificate-non-authorization) | `EFI_ACCESS_DENIED` | Image denied when only the TBS hash of a certificate outside the signer's chain is in `db` | +| [`4.2.1`](#42-unrelated-certificate-non-revocation) | `EFI_SUCCESS` | Image (authorized by `db`) not revoked when a certificate outside the signer's chain is in `dbx` | +| [`4.2.2`](#42-unrelated-certificate-non-revocation) | `EFI_SUCCESS` | Image (authorized by `db`) not revoked when the TBS hash of a certificate outside the signer's chain is in `dbx` | +| [`5.1.1`](#51-unsigned-database-corruption) | `EFI_SUCCESS` | Unsigned image approved when an authorizing `db` digest precedes a malformed signature list | +| [`5.1.2`](#51-unsigned-database-corruption) | `EFI_ACCESS_DENIED` | Unsigned image denied when a malformed `db` signature list precedes the authorizing digest | +| [`5.1.3`](#51-unsigned-database-corruption) | `EFI_ACCESS_DENIED` | Unsigned image denied when the `dbx` is corrupt, so revocation cannot be ruled out | +| [`5.2.1`](#52-signed-database-corruption) | `EFI_SUCCESS` | Signed image approved when an authorizing `db` entry precedes a malformed signature list | +| [`5.2.2`](#52-signed-database-corruption) | `EFI_ACCESS_DENIED` | Signed image denied when a malformed `db` signature list precedes the authorizing entry | +| [`5.2.3`](#52-signed-database-corruption) | `EFI_ACCESS_DENIED` | Signed image denied when the `dbx` is corrupt, so revocation cannot be ruled out | +| [`5.3.1`](#53-multi-signed-database-corruption) | `EFI_SUCCESS` | Multi-signed image approved when either signature's authority precedes a malformed `db` signature list | +| [`5.3.2`](#53-multi-signed-database-corruption) | `EFI_ACCESS_DENIED` | Multi-signed image denied when a malformed `db` signature list precedes either signature's authority | +| [`5.3.3`](#53-multi-signed-database-corruption) | `EFI_ACCESS_DENIED` | Multi-signed image denied when the `dbx` is corrupt, even though `db` approves both signatures | +| [`6.1.1`](#61-signed-image-certificate-corruption) | `EFI_SUCCESS` | Signed image with a malformed `WIN_CERTIFICATE` approved by an image digest in `db` | +| [`6.1.2`](#61-signed-image-certificate-corruption) | `EFI_ACCESS_DENIED` | Signed image with a malformed `WIN_CERTIFICATE` denied when only a signature-path authority is in `db` | +| [`6.2.1`](#62-multi-signed-first-certificate-corruption) | `EFI_ACCESS_DENIED` | Multi-signed image with a malformed first `WIN_CERTIFICATE` denied even though `db` authorizes the unreachable second signature | +| [`6.3.1`](#63-multi-signed-second-certificate-corruption) | `EFI_SUCCESS` | Multi-signed image with a malformed second `WIN_CERTIFICATE` approved because `db` authorizes the intact first signature | +| [`6.3.2`](#63-multi-signed-second-certificate-corruption) | `EFI_ACCESS_DENIED` | Multi-signed image with a malformed second `WIN_CERTIFICATE` denied when only the unreachable second signature's authority is in `db` | +| [`7.1.1`](#71-tampered-signed-image) | `EFI_ACCESS_DENIED` | Tampered signed image denied when a signer certificate is in `db` | +| [`7.1.2`](#71-tampered-signed-image) | `EFI_ACCESS_DENIED` | Tampered signed image denied when a signer certificate TBS hash is in `db` | +| [`7.1.3`](#71-tampered-signed-image) | `EFI_ACCESS_DENIED` | Tampered signed image denied when the original image digest is in `db` | +| [`7.1.4`](#71-tampered-signed-image) | `EFI_ACCESS_DENIED` | Tampered signed image denied when `db` is empty | diff --git a/SecurityPkg/Test/ShellTest/ImageValidationTestApp/Scenarios.c b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/Scenarios.c new file mode 100644 index 00000000000..16c186b0bb8 --- /dev/null +++ b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/Scenarios.c @@ -0,0 +1,1124 @@ +/** @file + Secure boot image validation test scenarios, registered as a single unit test suite. + + Each entry selects an image (IMAGE_TYPE_*) and the `db` / `dbx` contents to build + (DB_STATE_* flags), then gives the EFI_STATUS that gBS->LoadImage() is expected to return. + Refer to README.md ("Test Catalog") for the purpose, inputs, and expected result of every + scenario, keyed by its test ID (the first TEST_SCENARIO argument). + + Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "ImageValidationTestApp.h" + +CONST SECURE_BOOT_IMAGE_TEST_SCENARIO mScenarios[] = { + TEST_SCENARIO ( + "1.1.1", + IMAGE_TYPE_UNSIGNED, + DB_STATE_EMPTY, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "1.2.1a", + IMAGE_TYPE_UNSIGNED, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "1.2.1b", + IMAGE_TYPE_UNSIGNED, + DB_STATE_IMAGE_DIGEST_SHA384, + DB_STATE_IMAGE_DIGEST_SHA384, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "1.2.1c", + IMAGE_TYPE_UNSIGNED, + DB_STATE_IMAGE_DIGEST_SHA512, + DB_STATE_IMAGE_DIGEST_SHA512, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "1.3.1a", + IMAGE_TYPE_UNSIGNED, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "1.3.1b", + IMAGE_TYPE_UNSIGNED, + DB_STATE_IMAGE_DIGEST_SHA384, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "1.3.1c", + IMAGE_TYPE_UNSIGNED, + DB_STATE_IMAGE_DIGEST_SHA512, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + + TEST_SCENARIO ( + "2.1.1", + IMAGE_TYPE_SIGNED, + DB_STATE_EMPTY, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.1a", + IMAGE_TYPE_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.1b", + IMAGE_TYPE_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA384, + DB_STATE_IMAGE_DIGEST_SHA384, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.1c", + IMAGE_TYPE_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA512, + DB_STATE_IMAGE_DIGEST_SHA512, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.2a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.2b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.2c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.3a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.3b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA384, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.3c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA512, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.3d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.3e", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA384, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.3f", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA512, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.3g", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.3h", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA384, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.2.3i", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA512, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.3.1a", + IMAGE_TYPE_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.1b", + IMAGE_TYPE_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA384, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.1c", + IMAGE_TYPE_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA512, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.2a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.2b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.2c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.2d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA384, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA512, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3e", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA384, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3f", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA512, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3g", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3h", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA384, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3i", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA512, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3j", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3k", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA384, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.3.3l", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA512, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.1a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_SIGNER1_ROOT_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.1b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.1c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_SIGNER1_ROOT_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.1d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.2a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.2b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.2c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.2d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.3a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.3b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.3c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.3d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.4a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.4b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_CERT, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.4c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.4d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.5a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_SIGNER1_ROOT_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.5b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.5c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_SIGNER1_ROOT_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.5d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.6a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.6b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.6c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.6d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.7a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.7b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.7c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.7d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.8a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.8b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.8c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.8d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.9a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_ROOT_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.9b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.9c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_ROOT_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.9d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.10a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.10b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.10c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.10d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.11a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.11b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.11c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.11d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.12a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.12b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.12c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.12d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.13a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER1_ROOT_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.13b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.13c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_SIGNER1_ROOT_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.13d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_SIGNER1_ROOT_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.14a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.14b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.14c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.14d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.15a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.15b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.15c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.15d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.16a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.16b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.16c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.16d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "2.4.17a", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT | DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.17b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT | DB_STATE_SIGNER1_INTERMEDIATE2_CERT, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.17c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256 | DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.4.17d", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256 | DB_STATE_SIGNER1_INTERMEDIATE2_TBS_HASH_SHA256, + DB_STATE_SIGNER1_INTERMEDIATE1_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "2.5.1", + IMAGE_TYPE_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_SUCCESS + ), + + TEST_SCENARIO ( + "3.1.1", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_EMPTY, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.2.1a", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.2.1b", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA384, + DB_STATE_IMAGE_DIGEST_SHA384, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.2.1c", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA512, + DB_STATE_IMAGE_DIGEST_SHA512, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.2.2", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_CERT, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.2.3a", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_TBS_HASH_SHA256, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.2.3b", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_TBS_HASH_SHA384, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.2.3c", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_TBS_HASH_SHA512, + DB_STATE_IMAGE_DIGEST_SHA256, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.3.1", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "3.3.2", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_CERT, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "3.3.3", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_CERT, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "3.3.4", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_SIGNER2_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "3.3.5", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_EMPTY, + DB_STATE_SIGNER1_LEAF_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.3.6", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_EMPTY, + DB_STATE_SIGNER2_CERT, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "3.3.7", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_EMPTY, + DB_STATE_SIGNER1_LEAF_CERT | DB_STATE_SIGNER2_CERT, + EFI_ACCESS_DENIED + ), + + TEST_SCENARIO ( + "4.1.1", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_UNRELATED_CERT, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "4.1.2a", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA256, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "4.1.2b", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA384, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "4.1.2c", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA512, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "4.2.1", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_CERT, + DB_STATE_SIGNER2_UNRELATED_CERT, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "4.2.2a", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_CERT, + DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA256, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "4.2.2b", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_CERT, + DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA384, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "4.2.2c", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_CERT, + DB_STATE_SIGNER2_UNRELATED_TBS_HASH_SHA512, + EFI_SUCCESS + ), + + TEST_SCENARIO ( + "5.1.1", + IMAGE_TYPE_UNSIGNED, + DB_STATE_IMAGE_DIGEST_SHA256 | DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "5.1.2", + IMAGE_TYPE_UNSIGNED, + DB_STATE_CORRUPT_SIGNATURE_LIST_FIRST | DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "5.1.3", + IMAGE_TYPE_UNSIGNED, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "5.2.1a", + IMAGE_TYPE_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA256 | DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "5.2.1b", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT | DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "5.2.1c", + IMAGE_TYPE_SIGNED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256 | DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "5.2.2", + IMAGE_TYPE_SIGNED, + DB_STATE_CORRUPT_SIGNATURE_LIST_FIRST | DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "5.2.3", + IMAGE_TYPE_SIGNED, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "5.3.1a", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT | DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "5.3.1b", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER2_CERT | DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "5.3.2a", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_CORRUPT_SIGNATURE_LIST_FIRST | DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "5.3.2b", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_CORRUPT_SIGNATURE_LIST_FIRST | DB_STATE_SIGNER2_CERT, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "5.3.3", + IMAGE_TYPE_MULTI_SIGNED, + DB_STATE_SIGNER1_LEAF_CERT | DB_STATE_SIGNER2_CERT, + DB_STATE_CORRUPT_SIGNATURE_LIST_LAST, + EFI_ACCESS_DENIED + ), + + TEST_SCENARIO ( + "6.1.1", + IMAGE_TYPE_SIGNED_CORRUPT_CERT, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "6.1.2a", + IMAGE_TYPE_SIGNED_CORRUPT_CERT, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "6.1.2b", + IMAGE_TYPE_SIGNED_CORRUPT_CERT, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "6.2.1", + IMAGE_TYPE_MULTI_SIGNED_CORRUPT_FIRST_CERT, + DB_STATE_SIGNER2_CERT, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "6.3.1", + IMAGE_TYPE_MULTI_SIGNED_CORRUPT_SECOND_CERT, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_EMPTY, + EFI_SUCCESS + ), + TEST_SCENARIO ( + "6.3.2", + IMAGE_TYPE_MULTI_SIGNED_CORRUPT_SECOND_CERT, + DB_STATE_SIGNER2_CERT, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + + TEST_SCENARIO ( + "7.1.1", + IMAGE_TYPE_SIGNED_TAMPERED, + DB_STATE_SIGNER1_LEAF_CERT, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "7.1.2", + IMAGE_TYPE_SIGNED_TAMPERED, + DB_STATE_SIGNER1_LEAF_TBS_HASH_SHA256, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "7.1.3", + IMAGE_TYPE_SIGNED_TAMPERED, + DB_STATE_IMAGE_DIGEST_SHA256, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), + TEST_SCENARIO ( + "7.1.4", + IMAGE_TYPE_SIGNED_TAMPERED, + DB_STATE_EMPTY, + DB_STATE_EMPTY, + EFI_ACCESS_DENIED + ), +}; + +CONST UINTN mScenarioCount = ARRAY_SIZE (mScenarios); diff --git a/SecurityPkg/Test/ShellTest/ImageValidationTestApp/TestData.h b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/TestData.h new file mode 100644 index 00000000000..65fa2141220 --- /dev/null +++ b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/TestData.h @@ -0,0 +1,93 @@ +/** @file + Declarations for the built-in test images and signature data consumed by the Image + Validation unit test application. + + The definitions live in the per-architecture generated files, exactly one of which is + compiled per build (selected by the INF [Sources.] sections). + + The images are architecture-specific because a PE/COFF header declares a machine type; + LoadImage() rejects an image whose architecture does not match the running application. + The signer certificates are architecture-independent but are emitted into each arch file + so each file is self-contained. The blobs are generated by GenTestData.py and checked in + so the tests remain self-contained and deterministic. + + Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#ifndef TEST_DATA_H_ +#define TEST_DATA_H_ + +#include + +// +// Built-in PE/COFF images. +// +extern CONST UINT8 mUnsignedImage[]; +extern CONST UINTN mUnsignedImageSize; + +extern CONST UINT8 mSignedImage[]; +extern CONST UINTN mSignedImageSize; + +extern CONST UINT8 mMultiSignedImage[]; +extern CONST UINTN mMultiSignedImageSize; + +// +// Authenticode digests of each image, one per supported hash algorithm. +// +extern CONST UINT8 mUnsignedImageDigestSha256[]; +extern CONST UINTN mUnsignedImageDigestSha256Size; + +extern CONST UINT8 mUnsignedImageDigestSha384[]; +extern CONST UINTN mUnsignedImageDigestSha384Size; + +extern CONST UINT8 mUnsignedImageDigestSha512[]; +extern CONST UINTN mUnsignedImageDigestSha512Size; + +extern CONST UINT8 mSignedImageDigestSha256[]; +extern CONST UINTN mSignedImageDigestSha256Size; + +extern CONST UINT8 mSignedImageDigestSha384[]; +extern CONST UINTN mSignedImageDigestSha384Size; + +extern CONST UINT8 mSignedImageDigestSha512[]; +extern CONST UINTN mSignedImageDigestSha512Size; + +extern CONST UINT8 mMultiSignedImageDigestSha256[]; +extern CONST UINTN mMultiSignedImageDigestSha256Size; + +extern CONST UINT8 mMultiSignedImageDigestSha384[]; +extern CONST UINTN mMultiSignedImageDigestSha384Size; + +extern CONST UINT8 mMultiSignedImageDigestSha512[]; +extern CONST UINTN mMultiSignedImageDigestSha512Size; + +// +// Certificates for the signed and multi-signed images: +// +// Signer 1: The four-certificate chain for the signed image +// (root CA -> intermediate 1 CA -> intermediate 2 CA -> leaf). +// Signer 2: The single self-signed certificate for the second signer, used for the +// multi-signed image, plus one unrelated certificate that is embedded in signer +// 2's signature but is not part of its chain. +// +extern CONST UINT8 mLeafCert[]; +extern CONST UINTN mLeafCertSize; + +extern CONST UINT8 mIntermediate1Cert[]; +extern CONST UINTN mIntermediate1CertSize; + +extern CONST UINT8 mIntermediate2Cert[]; +extern CONST UINTN mIntermediate2CertSize; + +extern CONST UINT8 mRootCert[]; +extern CONST UINTN mRootCertSize; + +extern CONST UINT8 mSigner2Cert[]; +extern CONST UINTN mSigner2CertSize; + +extern CONST UINT8 mSigner2UnrelatedCert[]; +extern CONST UINTN mSigner2UnrelatedCertSize; + +#endif // TEST_DATA_H_ diff --git a/SecurityPkg/Test/ShellTest/ImageValidationTestApp/X64/TestData.c b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/X64/TestData.c new file mode 100644 index 00000000000..48c9e71cf2f --- /dev/null +++ b/SecurityPkg/Test/ShellTest/ImageValidationTestApp/X64/TestData.c @@ -0,0 +1,4546 @@ +/** @file + Test data for the Image Verification unit test application. + + This file is GENERATED by GenTestData.py. Do not edit by hand; rerun the script against + the desired binaries to regenerate it. + + Copyright (c) Microsoft Corporation. + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + +#include "TestData.h" + +// +// unsigned X64 PE/COFF image +// +CONST UINT8 mUnsignedImage[] = { + 0x4d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x45, 0x00, 0x00, 0x64, 0x86, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x22, 0x20, 0x0b, 0x02, 0x0e, 0x2c, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3b, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, + 0xb9, 0x15, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x00, 0x00, 0x00, 0x58, 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x42, 0x2e, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, + 0xdc, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x2e, 0x72, 0x73, 0x72, + 0x63, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf3, 0x90, 0xc3, 0xcc, + 0x48, 0x89, 0x5c, 0x24, 0x08, 0x57, 0x48, 0x83, 0xec, 0x30, 0x48, 0x8b, + 0x42, 0x60, 0x4c, 0x8d, 0x05, 0x33, 0x02, 0x00, 0x00, 0x45, 0x33, 0xc9, + 0x48, 0x89, 0x15, 0x45, 0x2b, 0x00, 0x00, 0x48, 0x8b, 0xfa, 0x48, 0x8b, + 0xd9, 0xb9, 0x01, 0x02, 0x00, 0x00, 0x4c, 0x8b, 0x50, 0x50, 0x48, 0x8d, + 0x05, 0x1f, 0x2b, 0x00, 0x00, 0x41, 0x8d, 0x51, 0x10, 0x48, 0x89, 0x44, + 0x24, 0x20, 0x41, 0xff, 0xd2, 0x48, 0x89, 0x1d, 0xf4, 0x2a, 0x00, 0x00, + 0x48, 0x85, 0xdb, 0x75, 0x16, 0x4c, 0x8d, 0x05, 0xb8, 0x20, 0x00, 0x00, + 0x8d, 0x53, 0x2c, 0x48, 0x8d, 0x0d, 0xce, 0x20, 0x00, 0x00, 0xe8, 0x5d, + 0x01, 0x00, 0x00, 0x48, 0x8b, 0x47, 0x60, 0x48, 0x89, 0x3d, 0xc6, 0x2a, + 0x00, 0x00, 0x48, 0x89, 0x05, 0xcf, 0x2a, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x75, 0x16, 0x4c, 0x8d, 0x05, 0x03, 0x21, 0x00, 0x00, 0x8d, 0x50, 0x38, + 0x48, 0x8d, 0x0d, 0xa1, 0x20, 0x00, 0x00, 0xe8, 0x30, 0x01, 0x00, 0x00, + 0x48, 0x8b, 0x47, 0x58, 0x48, 0x89, 0x05, 0xb1, 0x2a, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x75, 0x16, 0x4c, 0x8d, 0x05, 0xf5, 0x20, 0x00, 0x00, 0x8d, + 0x50, 0x29, 0x48, 0x8d, 0x0d, 0x0b, 0x21, 0x00, 0x00, 0xe8, 0x0a, 0x01, + 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x9f, 0x1f, 0x00, 0x00, 0xe8, 0x7a, 0x02, + 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x8b, 0x2a, 0x00, 0x00, 0x48, 0x85, 0xc9, + 0x74, 0x0a, 0x48, 0x8b, 0x47, 0x60, 0x48, 0x8b, 0x50, 0x70, 0xff, 0xd2, + 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x33, 0xc0, 0x48, 0x83, 0xc4, 0x30, 0x5f, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x8b, 0xc4, 0x48, 0x89, 0x50, 0x10, 0x4c, + 0x89, 0x40, 0x18, 0x4c, 0x89, 0x48, 0x20, 0x48, 0x83, 0xec, 0x28, 0x4c, + 0x8d, 0x40, 0x18, 0xe8, 0x08, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x74, + 0x24, 0x20, 0x57, 0x48, 0x81, 0xec, 0x30, 0x02, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x37, 0x2a, 0x00, 0x00, 0x48, 0x33, 0xc4, 0x48, 0x89, 0x84, 0x24, + 0x20, 0x02, 0x00, 0x00, 0x80, 0x3d, 0xf5, 0x29, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0xf0, 0x48, 0x8b, 0xda, 0x48, 0x8b, 0xf9, 0x75, 0x57, 0x48, 0x85, + 0xd2, 0x75, 0x16, 0x4c, 0x8d, 0x05, 0x36, 0x1f, 0x00, 0x00, 0x8d, 0x53, + 0x5d, 0x48, 0x8d, 0x0d, 0x44, 0x1f, 0x00, 0x00, 0xe8, 0x63, 0x00, 0x00, + 0x00, 0x48, 0x0f, 0xba, 0xe7, 0x1f, 0x73, 0x35, 0x4c, 0x8b, 0xce, 0x48, + 0x8d, 0x4c, 0x24, 0x20, 0x4c, 0x8b, 0xc3, 0xba, 0x00, 0x02, 0x00, 0x00, + 0xe8, 0xcf, 0x02, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0xe4, 0x29, 0x00, 0x00, + 0x48, 0x85, 0xc9, 0x74, 0x14, 0x48, 0x8b, 0x49, 0x50, 0x48, 0x85, 0xc9, + 0x74, 0x0b, 0x48, 0x8b, 0x41, 0x08, 0x48, 0x8d, 0x54, 0x24, 0x20, 0xff, + 0xd0, 0x48, 0x8b, 0x8c, 0x24, 0x20, 0x02, 0x00, 0x00, 0x48, 0x33, 0xcc, + 0xe8, 0x45, 0xfe, 0xff, 0xff, 0x4c, 0x8d, 0x9c, 0x24, 0x30, 0x02, 0x00, + 0x00, 0x49, 0x8b, 0x5b, 0x10, 0x49, 0x8b, 0x73, 0x28, 0x49, 0x8b, 0xe3, + 0x5f, 0xc3, 0xcc, 0xcc, 0x48, 0x81, 0xec, 0x58, 0x02, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x8e, 0x29, 0x00, 0x00, 0x48, 0x33, 0xc4, 0x48, 0x89, 0x84, + 0x24, 0x40, 0x02, 0x00, 0x00, 0x80, 0x3d, 0x4c, 0x29, 0x00, 0x00, 0x00, + 0x75, 0x4c, 0x4c, 0x89, 0x44, 0x24, 0x30, 0x4c, 0x8d, 0x0d, 0xfe, 0x1d, + 0x00, 0x00, 0x48, 0x89, 0x54, 0x24, 0x28, 0x4c, 0x8d, 0x05, 0xe2, 0x1e, + 0x00, 0x00, 0x48, 0x89, 0x4c, 0x24, 0x20, 0xba, 0x00, 0x02, 0x00, 0x00, + 0x48, 0x8d, 0x4c, 0x24, 0x40, 0xe8, 0xb2, 0x02, 0x00, 0x00, 0x48, 0x8b, + 0x0d, 0x4f, 0x29, 0x00, 0x00, 0x48, 0x85, 0xc9, 0x74, 0x14, 0x48, 0x8b, + 0x49, 0x50, 0x48, 0x85, 0xc9, 0x74, 0x0b, 0x48, 0x8b, 0x41, 0x08, 0x48, + 0x8d, 0x54, 0x24, 0x40, 0xff, 0xd0, 0x48, 0x8b, 0x8c, 0x24, 0x40, 0x02, + 0x00, 0x00, 0x48, 0x33, 0xcc, 0xe8, 0xb0, 0xfd, 0xff, 0xff, 0x48, 0x81, + 0xc4, 0x58, 0x02, 0x00, 0x00, 0xc3, 0xcc, 0xcc, 0xc6, 0x05, 0xdd, 0x28, + 0x00, 0x00, 0x01, 0xc3, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, + 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xec, 0x20, + 0x49, 0x8b, 0xe8, 0x48, 0x8b, 0xf2, 0x48, 0x8b, 0xf9, 0x48, 0x85, 0xc9, + 0x75, 0x0c, 0x4c, 0x8d, 0x05, 0x0b, 0x1e, 0x00, 0x00, 0x8d, 0x51, 0x3d, + 0xeb, 0x12, 0x40, 0xf6, 0xc7, 0x01, 0x74, 0x18, 0x4c, 0x8d, 0x05, 0xd1, + 0x1f, 0x00, 0x00, 0xba, 0x3e, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x85, + 0x1f, 0x00, 0x00, 0xe8, 0x24, 0xff, 0xff, 0xff, 0x48, 0x85, 0xf6, 0x75, + 0x16, 0x4c, 0x8d, 0x05, 0xdc, 0x1f, 0x00, 0x00, 0x8d, 0x56, 0x3f, 0x48, + 0x8d, 0x0d, 0x6a, 0x1f, 0x00, 0x00, 0xe8, 0x09, 0xff, 0xff, 0xff, 0xe8, + 0x54, 0x12, 0x00, 0x00, 0x48, 0x8b, 0xd8, 0x48, 0x85, 0xc0, 0x75, 0x1a, + 0x4c, 0x8d, 0x05, 0x29, 0x1e, 0x00, 0x00, 0x8d, 0x50, 0x46, 0x48, 0x8d, + 0x0d, 0x47, 0x1f, 0x00, 0x00, 0xe8, 0xe6, 0xfe, 0xff, 0xff, 0x33, 0xc0, + 0xeb, 0x46, 0x4c, 0x8b, 0xcd, 0x4c, 0x8b, 0xc7, 0x48, 0x8b, 0xcb, 0xe8, + 0xd8, 0x00, 0x00, 0x00, 0x48, 0x8b, 0xf8, 0x48, 0x85, 0xf6, 0x74, 0x25, + 0x48, 0x85, 0xc0, 0x74, 0x20, 0x4c, 0x8b, 0x46, 0x08, 0x48, 0x8b, 0xd3, + 0x48, 0x8b, 0xce, 0x41, 0xff, 0xd0, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc1, 0x48, 0x1b, 0xc9, 0x48, 0x23, + 0xf9, 0x48, 0x8b, 0xcb, 0xe8, 0x33, 0x12, 0x00, 0x00, 0x48, 0x8b, 0xc7, + 0x48, 0x8b, 0x5c, 0x24, 0x30, 0x48, 0x8b, 0x6c, 0x24, 0x38, 0x48, 0x8b, + 0x74, 0x24, 0x40, 0x48, 0x83, 0xc4, 0x20, 0x5f, 0xc3, 0xcc, 0xcc, 0xcc, + 0x48, 0x8b, 0xc4, 0x48, 0x89, 0x48, 0x08, 0x48, 0x89, 0x50, 0x10, 0x4c, + 0x89, 0x40, 0x18, 0x4c, 0x89, 0x48, 0x20, 0x48, 0x83, 0xec, 0x28, 0x48, + 0x8b, 0x15, 0xda, 0x27, 0x00, 0x00, 0x4c, 0x8d, 0x40, 0x10, 0x48, 0x8b, + 0x52, 0x40, 0xe8, 0xe9, 0xfe, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x28, 0xc3, + 0x40, 0x53, 0x48, 0x83, 0xec, 0x20, 0x48, 0x8b, 0xd9, 0xf6, 0xc1, 0x01, + 0x74, 0x18, 0x4c, 0x8d, 0x05, 0x1b, 0x1f, 0x00, 0x00, 0xba, 0x7e, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x6f, 0x1f, 0x00, 0x00, 0xe8, 0x2e, 0xfe, + 0xff, 0xff, 0x33, 0xc9, 0x48, 0x85, 0xdb, 0x74, 0x21, 0x8b, 0xc1, 0x66, + 0x39, 0x0b, 0x74, 0x1c, 0x48, 0x3d, 0x40, 0x42, 0x0f, 0x00, 0x73, 0x0b, + 0x48, 0xff, 0xc0, 0x66, 0x39, 0x0c, 0x43, 0x75, 0xef, 0xeb, 0x09, 0xb8, + 0x41, 0x42, 0x0f, 0x00, 0xeb, 0x02, 0x33, 0xc0, 0x48, 0x83, 0xc4, 0x20, + 0x5b, 0xc3, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x74, + 0x24, 0x10, 0x57, 0x48, 0x83, 0xec, 0x30, 0x49, 0x8b, 0xf1, 0x49, 0x8b, + 0xd8, 0x48, 0x8b, 0xf9, 0xf6, 0xc1, 0x01, 0x74, 0x18, 0x4c, 0x8d, 0x05, + 0x7c, 0x1f, 0x00, 0x00, 0xba, 0x47, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, + 0x98, 0x1f, 0x00, 0x00, 0xe8, 0xc7, 0xfd, 0xff, 0xff, 0xf6, 0xc3, 0x01, + 0x74, 0x18, 0x4c, 0x8d, 0x05, 0xc7, 0x1f, 0x00, 0x00, 0xba, 0x48, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x7b, 0x1f, 0x00, 0x00, 0xe8, 0xaa, 0xfd, + 0xff, 0xff, 0xba, 0x41, 0x01, 0x00, 0x00, 0x48, 0xc7, 0x44, 0x24, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, 0xcb, 0x48, 0x89, 0x74, 0x24, 0x20, + 0x48, 0x8b, 0xcf, 0x44, 0x8d, 0x42, 0xff, 0xe8, 0x48, 0x01, 0x00, 0x00, + 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x48, 0x8b, 0x74, 0x24, 0x48, 0x48, 0x83, + 0xc4, 0x30, 0x5f, 0xc3, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, + 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xec, 0x30, + 0x49, 0x8b, 0xf1, 0x49, 0x8b, 0xe8, 0x48, 0x8b, 0xda, 0x48, 0x8b, 0xf9, + 0xf6, 0xc1, 0x01, 0x74, 0x18, 0x4c, 0x8d, 0x05, 0xf0, 0x1e, 0x00, 0x00, + 0xba, 0xea, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x0c, 0x1f, 0x00, 0x00, + 0xe8, 0x3b, 0xfd, 0xff, 0xff, 0x48, 0xd1, 0xeb, 0x4c, 0x8b, 0xcd, 0x48, + 0x8b, 0xd3, 0x48, 0xc7, 0x44, 0x24, 0x28, 0x00, 0x00, 0x00, 0x00, 0x41, + 0xb8, 0x40, 0x00, 0x00, 0x00, 0x48, 0x89, 0x74, 0x24, 0x20, 0x48, 0x8b, + 0xcf, 0xe8, 0xd6, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x48, + 0x8b, 0x6c, 0x24, 0x48, 0x48, 0x8b, 0x74, 0x24, 0x50, 0x48, 0x83, 0xc4, + 0x30, 0x5f, 0xc3, 0xcc, 0x4c, 0x89, 0x44, 0x24, 0x18, 0x4c, 0x89, 0x4c, + 0x24, 0x20, 0x48, 0x83, 0xec, 0x28, 0x4c, 0x8d, 0x4c, 0x24, 0x48, 0xe8, + 0x70, 0xff, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0xcc, 0xcc, 0xcc, + 0x45, 0x33, 0xd2, 0x4d, 0x85, 0xc0, 0x7e, 0x27, 0x48, 0x3b, 0xca, 0x73, + 0x22, 0x48, 0x83, 0x7c, 0x24, 0x28, 0x01, 0x44, 0x88, 0x09, 0x74, 0x0a, + 0x49, 0x8b, 0xc1, 0x48, 0xc1, 0xe8, 0x08, 0x88, 0x41, 0x01, 0x48, 0x03, + 0x4c, 0x24, 0x28, 0x49, 0xff, 0xc2, 0x4d, 0x3b, 0xd0, 0x7c, 0xd9, 0x48, + 0x8b, 0xc1, 0xc3, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x74, + 0x24, 0x10, 0x57, 0x48, 0x83, 0xec, 0x20, 0x48, 0x8b, 0xf2, 0xc6, 0x01, + 0x00, 0x48, 0x8b, 0xd9, 0x41, 0x8b, 0xf8, 0x85, 0xff, 0x75, 0x16, 0x4c, + 0x8d, 0x05, 0x1a, 0x1e, 0x00, 0x00, 0x8d, 0x57, 0x26, 0x48, 0x8d, 0x0d, + 0x88, 0x25, 0x00, 0x00, 0xe8, 0x77, 0xfc, 0xff, 0xff, 0x33, 0xd2, 0x48, + 0x8d, 0x0d, 0x1a, 0x25, 0x00, 0x00, 0x48, 0x8b, 0xc6, 0x48, 0xff, 0xc3, + 0x48, 0xf7, 0xf7, 0x48, 0x8b, 0xf0, 0x8b, 0xc2, 0x8a, 0x04, 0x08, 0x88, + 0x03, 0x48, 0x85, 0xf6, 0x75, 0xc5, 0x48, 0x8b, 0x74, 0x24, 0x38, 0x48, + 0x8b, 0xc3, 0x48, 0x8b, 0x5c, 0x24, 0x30, 0x48, 0x83, 0xc4, 0x20, 0x5f, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x18, 0x55, 0x56, 0x57, + 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x48, 0x8d, 0x6c, 0x24, + 0xa0, 0x48, 0x81, 0xec, 0x60, 0x01, 0x00, 0x00, 0x48, 0x8b, 0x05, 0xb9, + 0x25, 0x00, 0x00, 0x48, 0x33, 0xc4, 0x48, 0x89, 0x45, 0x50, 0x4c, 0x8b, + 0x9d, 0xc0, 0x00, 0x00, 0x00, 0x49, 0x8b, 0xf0, 0x4c, 0x8b, 0xf9, 0x48, + 0x89, 0x4d, 0x88, 0x33, 0xc9, 0x4c, 0x89, 0x4d, 0x90, 0x81, 0xe6, 0x00, + 0x20, 0x00, 0x00, 0x4c, 0x89, 0x5d, 0xa8, 0x48, 0x89, 0x4d, 0xb0, 0x4d, + 0x8b, 0xe1, 0x4d, 0x8b, 0xf0, 0x48, 0x8b, 0xfa, 0x48, 0x85, 0xd2, 0x74, + 0x29, 0x48, 0x85, 0xf6, 0x75, 0x29, 0x4d, 0x85, 0xff, 0x75, 0x24, 0x4c, + 0x8d, 0x05, 0x46, 0x1d, 0x00, 0x00, 0xba, 0x4f, 0x02, 0x00, 0x00, 0x48, + 0x8d, 0x0d, 0x02, 0x1e, 0x00, 0x00, 0xe8, 0xc1, 0xfb, 0xff, 0xff, 0x33, + 0xc0, 0xe9, 0xb8, 0x0e, 0x00, 0x00, 0x48, 0x85, 0xf6, 0x74, 0x13, 0x4d, + 0x85, 0xe4, 0x75, 0x0e, 0x4c, 0x8d, 0x05, 0x7d, 0x1e, 0x00, 0x00, 0xba, + 0x57, 0x02, 0x00, 0x00, 0xeb, 0xd5, 0xbb, 0x40, 0x42, 0x0f, 0x00, 0x41, + 0xf6, 0xc6, 0x40, 0x74, 0x1b, 0x48, 0x3b, 0xfb, 0x76, 0x0e, 0x4c, 0x8d, + 0x05, 0x87, 0x1e, 0x00, 0x00, 0xba, 0x60, 0x02, 0x00, 0x00, 0xeb, 0xb7, + 0x41, 0xbd, 0x02, 0x00, 0x00, 0x00, 0xeb, 0x19, 0x48, 0x3b, 0xfb, 0x76, + 0x0e, 0x4c, 0x8d, 0x05, 0xfc, 0x1d, 0x00, 0x00, 0xba, 0x66, 0x02, 0x00, + 0x00, 0xeb, 0x9c, 0x41, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x6d, + 0xf8, 0x49, 0x0f, 0xba, 0xe6, 0x08, 0x73, 0x43, 0x49, 0x8b, 0xcc, 0xe8, + 0xfc, 0xfc, 0xff, 0xff, 0x48, 0x3b, 0xc3, 0x76, 0x18, 0x4c, 0x8d, 0x05, + 0x90, 0x1e, 0x00, 0x00, 0xba, 0x72, 0x02, 0x00, 0x00, 0x48, 0x8d, 0x0d, + 0x74, 0x1d, 0x00, 0x00, 0xe8, 0x33, 0xfb, 0xff, 0xff, 0x49, 0x8b, 0xcc, + 0xe8, 0xd7, 0xfc, 0xff, 0xff, 0x48, 0x3b, 0xc3, 0x0f, 0x87, 0x61, 0xff, + 0xff, 0xff, 0xbb, 0x02, 0x00, 0x00, 0x00, 0x41, 0xb8, 0xff, 0xff, 0x00, + 0x00, 0xeb, 0x66, 0x4d, 0x85, 0xe4, 0x74, 0x56, 0x33, 0xc0, 0x41, 0x38, + 0x01, 0x74, 0x0e, 0x48, 0x3b, 0xc3, 0x73, 0x0e, 0x48, 0xff, 0xc0, 0x41, + 0x38, 0x0c, 0x01, 0x75, 0xf2, 0x48, 0x3b, 0xc3, 0x76, 0x18, 0x4c, 0x8d, + 0x05, 0xcb, 0x1e, 0x00, 0x00, 0xba, 0x79, 0x02, 0x00, 0x00, 0x48, 0x8d, + 0x0d, 0x1f, 0x1d, 0x00, 0x00, 0xe8, 0xde, 0xfa, 0xff, 0xff, 0x33, 0xc0, + 0x41, 0x38, 0x04, 0x24, 0x74, 0x13, 0x48, 0x3b, 0xc3, 0x0f, 0x83, 0x0c, + 0xff, 0xff, 0xff, 0x48, 0xff, 0xc0, 0x42, 0x80, 0x3c, 0x20, 0x00, 0x75, + 0xed, 0x48, 0x3b, 0xc3, 0x0f, 0x87, 0xf9, 0xfe, 0xff, 0xff, 0xbb, 0x01, + 0x00, 0x00, 0x00, 0x41, 0xb8, 0xff, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x45, + 0xe0, 0x48, 0x89, 0x5d, 0xf0, 0x48, 0x85, 0xf6, 0x74, 0x15, 0x48, 0x8b, + 0xc7, 0x48, 0xf7, 0xd8, 0x48, 0x1b, 0xc9, 0x49, 0x23, 0xcf, 0x4c, 0x8b, + 0xf9, 0x48, 0x89, 0x4d, 0x88, 0xeb, 0x09, 0x48, 0x85, 0xff, 0x0f, 0x84, + 0xc3, 0xfe, 0xff, 0xff, 0x33, 0xf6, 0x45, 0x33, 0xdb, 0x48, 0x89, 0x75, + 0xc8, 0x4c, 0x89, 0x5d, 0xb8, 0x48, 0x89, 0x75, 0x00, 0x4d, 0x85, 0xff, + 0x74, 0x13, 0x4c, 0x8d, 0x5f, 0xff, 0x4c, 0x89, 0x7d, 0x00, 0x4d, 0x0f, + 0xaf, 0xdd, 0x4d, 0x03, 0xdf, 0x4c, 0x89, 0x5d, 0xb8, 0x48, 0x83, 0xfb, + 0x01, 0x75, 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, + 0x01, 0xc1, 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, + 0x0b, 0xc8, 0x49, 0x23, 0xc8, 0x48, 0x89, 0x4d, 0xd0, 0x0f, 0x84, 0xcb, + 0x0c, 0x00, 0x00, 0x48, 0x8b, 0xc1, 0x48, 0x8d, 0x3d, 0x1b, 0x1f, 0x00, + 0x00, 0x49, 0x8b, 0xd4, 0x4d, 0x85, 0xff, 0x74, 0x0c, 0x4d, 0x3b, 0xfb, + 0x0f, 0x83, 0xb0, 0x0c, 0x00, 0x00, 0x4d, 0x85, 0xff, 0x48, 0x0f, 0x44, + 0xc1, 0x48, 0xc7, 0x45, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x32, 0xc9, 0x45, + 0x32, 0xdb, 0x45, 0x33, 0xed, 0x89, 0x4d, 0xc0, 0x88, 0x4d, 0x81, 0x41, + 0x81, 0xe6, 0x40, 0x21, 0x00, 0x00, 0x33, 0xc9, 0x44, 0x88, 0x5d, 0x80, + 0x4c, 0x89, 0x6d, 0x98, 0x41, 0xba, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x55, 0xa0, 0x48, 0x89, 0x4d, 0xe8, 0x48, 0x83, 0xf8, 0x0a, 0x0f, 0x84, + 0x76, 0x08, 0x00, 0x00, 0x48, 0x83, 0xf8, 0x0d, 0x0f, 0x84, 0x2a, 0x08, + 0x00, 0x00, 0x48, 0x83, 0xf8, 0x25, 0x74, 0x0e, 0x48, 0x8d, 0x75, 0xd0, + 0x49, 0x0f, 0xba, 0xee, 0x0a, 0xe9, 0xcb, 0x02, 0x00, 0x00, 0x48, 0x8b, + 0x75, 0xb0, 0x4c, 0x8b, 0x7d, 0xa8, 0x48, 0x8b, 0x7d, 0xe0, 0x49, 0x8b, + 0xd4, 0x4c, 0x8b, 0xce, 0x4c, 0x03, 0xe3, 0x4d, 0x8b, 0xd7, 0x4c, 0x89, + 0x65, 0x90, 0x4c, 0x8b, 0xde, 0x4d, 0x8b, 0xc7, 0x48, 0x83, 0xfb, 0x01, + 0x75, 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, + 0xc1, 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, 0x0b, + 0xc8, 0x48, 0x23, 0xcf, 0x48, 0x89, 0x4d, 0xd0, 0x48, 0x83, 0xf9, 0x32, + 0x0f, 0x87, 0x20, 0x01, 0x00, 0x00, 0x74, 0x4c, 0x48, 0x8b, 0xc1, 0x48, + 0x85, 0xc9, 0x0f, 0x84, 0xb5, 0x01, 0x00, 0x00, 0x48, 0x83, 0xe8, 0x20, + 0x0f, 0x84, 0xff, 0x00, 0x00, 0x00, 0x48, 0x83, 0xe8, 0x0a, 0x0f, 0x84, + 0x9d, 0x00, 0x00, 0x00, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0x8a, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xe8, 0x01, 0x74, 0x7b, 0x48, 0x83, 0xe8, 0x01, + 0x74, 0x6c, 0x48, 0x83, 0xe8, 0x01, 0x74, 0x5c, 0x48, 0x83, 0xe8, 0x02, + 0x74, 0x46, 0x48, 0x83, 0xf8, 0x01, 0x0f, 0x85, 0x84, 0x01, 0x00, 0x00, + 0x45, 0x33, 0xed, 0x4c, 0x89, 0x6d, 0x98, 0x48, 0x83, 0xf9, 0x30, 0x0f, + 0x82, 0x43, 0x01, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x39, 0x0f, 0x87, 0x35, + 0x01, 0x00, 0x00, 0x4f, 0x8d, 0x6c, 0xad, 0x00, 0x4c, 0x03, 0xe3, 0x4d, + 0x8d, 0x6d, 0xe8, 0x4e, 0x8d, 0x2c, 0x69, 0x48, 0x83, 0xfb, 0x01, 0x0f, + 0x85, 0xfb, 0x00, 0x00, 0x00, 0x33, 0xc0, 0xe9, 0xfd, 0x00, 0x00, 0x00, + 0x49, 0x0f, 0xba, 0xe6, 0x0b, 0x72, 0xbd, 0x49, 0x83, 0xce, 0x20, 0x45, + 0x33, 0xed, 0xeb, 0xc5, 0x49, 0x0f, 0xba, 0xee, 0x0b, 0xe9, 0x18, 0xff, + 0xff, 0xff, 0x49, 0x83, 0xce, 0x01, 0xe9, 0x0f, 0xff, 0xff, 0xff, 0x49, + 0x83, 0xce, 0x08, 0xe9, 0x06, 0xff, 0xff, 0xff, 0x49, 0x83, 0xce, 0x02, + 0xe9, 0xfd, 0xfe, 0xff, 0xff, 0x49, 0x0f, 0xba, 0xe6, 0x0b, 0x72, 0x2b, + 0x49, 0x0f, 0xba, 0xee, 0x09, 0x48, 0x85, 0xf6, 0x75, 0x0a, 0x49, 0x83, + 0xc7, 0x08, 0x4c, 0x89, 0x7d, 0xa8, 0xeb, 0x0b, 0x48, 0x83, 0xc6, 0x08, + 0x4d, 0x8b, 0xc3, 0x48, 0x89, 0x75, 0xb0, 0x49, 0x8b, 0x00, 0x48, 0x89, + 0x45, 0xd8, 0xe9, 0xcb, 0xfe, 0xff, 0xff, 0x48, 0x85, 0xf6, 0x75, 0x0d, + 0x49, 0x8b, 0x02, 0x49, 0x83, 0xc7, 0x08, 0x4c, 0x89, 0x7d, 0xa8, 0xeb, + 0x0b, 0x49, 0x8b, 0x01, 0x48, 0x83, 0xc6, 0x08, 0x48, 0x89, 0x75, 0xb0, + 0x48, 0x89, 0x45, 0xa0, 0xe9, 0xa5, 0xfe, 0xff, 0xff, 0x49, 0x83, 0xce, + 0x04, 0xe9, 0x9c, 0xfe, 0xff, 0xff, 0x48, 0x8b, 0xc1, 0x48, 0x83, 0xe8, + 0x33, 0x0f, 0x84, 0x21, 0xff, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, + 0x84, 0x17, 0xff, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0x0d, + 0xff, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0x03, 0xff, 0xff, + 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0xf9, 0xfe, 0xff, 0xff, 0x48, + 0x83, 0xe8, 0x01, 0x0f, 0x84, 0xef, 0xfe, 0xff, 0xff, 0x48, 0x83, 0xe8, + 0x01, 0x0f, 0x84, 0xe5, 0xfe, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x13, 0x74, + 0x06, 0x48, 0x83, 0xf8, 0x20, 0x75, 0x5d, 0x49, 0x83, 0xce, 0x10, 0xe9, + 0x3e, 0xfe, 0xff, 0xff, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, 0xe0, + 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, 0x0b, 0xc8, 0x48, + 0x23, 0xcf, 0x48, 0x83, 0xf9, 0x30, 0x0f, 0x83, 0xc1, 0xfe, 0xff, 0xff, + 0x4c, 0x89, 0x6d, 0x98, 0x4c, 0x2b, 0xe3, 0x49, 0x0f, 0xba, 0xe6, 0x0b, + 0x72, 0x0e, 0x49, 0x0f, 0xba, 0xee, 0x09, 0x4c, 0x89, 0x6d, 0xd8, 0xe9, + 0x02, 0xfe, 0xff, 0xff, 0x4c, 0x89, 0x6d, 0xa0, 0xe9, 0xf9, 0xfd, 0xff, + 0xff, 0x33, 0xc0, 0x48, 0x89, 0x55, 0x90, 0x48, 0x89, 0x45, 0xa0, 0x48, + 0x8b, 0xfa, 0xeb, 0x03, 0x49, 0x8b, 0xfc, 0x4c, 0x8b, 0x5d, 0xa8, 0x49, + 0x8b, 0xdf, 0x4d, 0x8b, 0xcb, 0x4d, 0x8b, 0xef, 0x49, 0x8b, 0xd7, 0x48, + 0x83, 0xf9, 0x64, 0x0f, 0x87, 0x81, 0x01, 0x00, 0x00, 0x0f, 0x84, 0x56, + 0x03, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x0a, 0x0f, 0x84, 0x12, 0x01, 0x00, + 0x00, 0x48, 0x83, 0xf9, 0x0d, 0x0f, 0x84, 0xb7, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xf9, 0x25, 0x0f, 0x84, 0x9f, 0x01, 0x00, 0x00, 0x48, 0x83, 0xf9, + 0x53, 0x0f, 0x84, 0x1b, 0x02, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x58, 0x0f, + 0x84, 0x0d, 0x03, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x61, 0x0f, 0x84, 0x0c, + 0x02, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x63, 0x0f, 0x85, 0x77, 0x01, 0x00, + 0x00, 0x48, 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x4c, 0x8b, 0xde, + 0x48, 0x89, 0x4d, 0xb0, 0x41, 0x0f, 0xb7, 0x03, 0x48, 0x8d, 0x75, 0x08, + 0x48, 0x89, 0x45, 0x08, 0x49, 0x0f, 0xba, 0xee, 0x0a, 0x4c, 0x8b, 0x65, + 0x90, 0x4c, 0x8b, 0x6d, 0x98, 0x44, 0x8a, 0x5d, 0x80, 0x4c, 0x8b, 0x55, + 0xa0, 0x4c, 0x8b, 0x7d, 0x88, 0x4d, 0x8b, 0xce, 0x41, 0x81, 0xe1, 0x00, + 0x04, 0x00, 0x00, 0x41, 0x8b, 0xc1, 0x48, 0xf7, 0xd8, 0x41, 0x8b, 0xc1, + 0x48, 0x1b, 0xd2, 0x48, 0xf7, 0xda, 0x48, 0xff, 0xc2, 0x48, 0xf7, 0xd8, + 0x48, 0x1b, 0xff, 0x81, 0xe7, 0x00, 0xff, 0x00, 0x00, 0x48, 0x81, 0xc7, + 0xff, 0x00, 0x00, 0x00, 0x49, 0x0f, 0xba, 0xe6, 0x0c, 0x0f, 0x83, 0x9e, + 0x05, 0x00, 0x00, 0x48, 0xf7, 0xda, 0x48, 0x8b, 0xda, 0xe9, 0xe4, 0x05, + 0x00, 0x00, 0x4c, 0x8b, 0x65, 0x90, 0x4c, 0x03, 0x65, 0xf0, 0x48, 0x83, + 0x7d, 0xf0, 0x01, 0x75, 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, + 0x44, 0x24, 0x01, 0xc1, 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, + 0x8d, 0x35, 0x6a, 0x1b, 0x00, 0x00, 0x48, 0x98, 0x48, 0x0b, 0xc8, 0x48, + 0x8d, 0x05, 0x62, 0x1b, 0x00, 0x00, 0x48, 0x23, 0x4d, 0xe0, 0x48, 0x83, + 0xf9, 0x0a, 0x48, 0x89, 0x4d, 0xd0, 0x4c, 0x0f, 0x45, 0xe7, 0x48, 0x0f, + 0x45, 0xf0, 0x4c, 0x89, 0x65, 0x90, 0xe9, 0x5a, 0xff, 0xff, 0xff, 0x4c, + 0x8b, 0x65, 0x90, 0x48, 0x8d, 0x35, 0x36, 0x1b, 0x00, 0x00, 0x4c, 0x03, + 0x65, 0xf0, 0x48, 0x83, 0x7d, 0xf0, 0x01, 0x4c, 0x89, 0x65, 0x90, 0x75, + 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, + 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x4c, 0x8b, 0x7d, 0x88, 0x4c, + 0x8b, 0x6d, 0x98, 0x44, 0x8a, 0x5d, 0x80, 0x4c, 0x8b, 0x55, 0xa0, 0x48, + 0x98, 0x48, 0x0b, 0xc8, 0x48, 0x23, 0x4d, 0xe0, 0x48, 0x89, 0x4d, 0xd0, + 0x48, 0x83, 0xf9, 0x0d, 0x0f, 0x84, 0x17, 0xff, 0xff, 0xff, 0x4c, 0x8b, + 0xe7, 0x48, 0x89, 0x7d, 0x90, 0xe9, 0x0b, 0xff, 0xff, 0xff, 0x48, 0x83, + 0xe9, 0x67, 0x0f, 0x84, 0x65, 0x03, 0x00, 0x00, 0x48, 0x83, 0xe9, 0x09, + 0x0f, 0x84, 0xa8, 0x01, 0x00, 0x00, 0x48, 0x83, 0xe9, 0x02, 0x0f, 0x84, + 0x00, 0x01, 0x00, 0x00, 0x48, 0x83, 0xe9, 0x01, 0x0f, 0x84, 0xa0, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xe9, 0x01, 0x74, 0x1d, 0x48, 0x83, 0xe9, 0x01, + 0x0f, 0x84, 0x95, 0x01, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x03, 0x0f, 0x84, + 0x86, 0x01, 0x00, 0x00, 0x48, 0x8d, 0x75, 0xd0, 0xe9, 0xa7, 0xfe, 0xff, + 0xff, 0x48, 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x4c, 0x8b, 0xce, + 0x48, 0x89, 0x4d, 0xb0, 0x4d, 0x8b, 0x09, 0x4d, 0x85, 0xc9, 0x75, 0x0c, + 0x48, 0x8d, 0x35, 0x39, 0x1a, 0x00, 0x00, 0xe9, 0x7d, 0xfe, 0xff, 0xff, + 0x41, 0x0f, 0xb6, 0x49, 0x04, 0x41, 0x0f, 0xb7, 0x11, 0x45, 0x0f, 0xb6, + 0x41, 0x03, 0x41, 0x0f, 0xb6, 0x41, 0x05, 0x45, 0x0f, 0xb6, 0x49, 0x02, + 0x89, 0x44, 0x24, 0x40, 0x89, 0x4c, 0x24, 0x38, 0x48, 0x8d, 0x4d, 0x28, + 0x89, 0x54, 0x24, 0x30, 0x44, 0x89, 0x44, 0x24, 0x28, 0x45, 0x33, 0xc0, + 0x44, 0x89, 0x4c, 0x24, 0x20, 0x4c, 0x8d, 0x0d, 0x08, 0x1a, 0x00, 0x00, + 0x41, 0x8d, 0x50, 0x26, 0xe8, 0x5b, 0x08, 0x00, 0x00, 0x48, 0x8d, 0x75, + 0x28, 0xe9, 0x2f, 0xfe, 0xff, 0xff, 0x49, 0x0f, 0xba, 0xee, 0x0a, 0x48, + 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, 0x45, 0xa8, + 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x4c, 0x8b, 0xfe, 0x48, 0x89, + 0x4d, 0xb0, 0x49, 0x8b, 0x37, 0x48, 0x85, 0xf6, 0x75, 0x0c, 0x49, 0x0f, + 0xba, 0xf6, 0x0a, 0x48, 0x8d, 0x35, 0x5a, 0x19, 0x00, 0x00, 0x4c, 0x8b, + 0x7d, 0x88, 0x4c, 0x8b, 0x65, 0x90, 0x4c, 0x8b, 0x6d, 0x98, 0x49, 0x0f, + 0xba, 0xe6, 0x0b, 0x0f, 0x82, 0xc3, 0x03, 0x00, 0x00, 0x45, 0x33, 0xd2, + 0x45, 0x8a, 0xda, 0xe9, 0xed, 0xfd, 0xff, 0xff, 0x48, 0x8b, 0x4d, 0xb0, + 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, 0x45, 0xa8, 0x08, 0xeb, 0x0b, + 0x48, 0x83, 0xc1, 0x08, 0x48, 0x8b, 0xd6, 0x48, 0x89, 0x4d, 0xb0, 0x48, + 0x8b, 0x0a, 0x48, 0x8d, 0x75, 0x28, 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc8, 0x72, 0x2b, 0x48, 0xb8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x48, 0x8b, 0xd1, 0x48, 0x23, + 0xd0, 0x48, 0x8d, 0x42, 0xff, 0x48, 0x83, 0xf8, 0x22, 0x77, 0x32, 0x48, + 0x6b, 0xc2, 0x15, 0x48, 0x8d, 0x35, 0x4a, 0x1a, 0x00, 0x00, 0x48, 0x83, + 0xc6, 0xeb, 0xeb, 0x11, 0x48, 0x83, 0xf9, 0x07, 0x77, 0x1b, 0x48, 0x6b, + 0xf1, 0x19, 0x48, 0x8d, 0x05, 0x63, 0x19, 0x00, 0x00, 0x48, 0x03, 0xf0, + 0x48, 0x8d, 0x45, 0x28, 0x48, 0x3b, 0xf0, 0x0f, 0x85, 0x5c, 0xfd, 0xff, + 0xff, 0x45, 0x33, 0xc0, 0x48, 0x89, 0x4c, 0x24, 0x20, 0x4c, 0x8d, 0x0d, + 0x30, 0x19, 0x00, 0x00, 0x48, 0x8d, 0x4d, 0x28, 0x41, 0x8d, 0x50, 0x26, + 0xe8, 0x63, 0x07, 0x00, 0x00, 0xe9, 0x3b, 0xfd, 0xff, 0xff, 0x49, 0x83, + 0xe6, 0xd9, 0x49, 0x83, 0xce, 0x10, 0x49, 0x83, 0xce, 0x20, 0x49, 0x0f, + 0xba, 0xee, 0x07, 0x45, 0x84, 0xf6, 0x78, 0x09, 0x49, 0x83, 0xe6, 0xfd, + 0x49, 0x0f, 0xba, 0xee, 0x0e, 0x48, 0x8b, 0x45, 0xb0, 0x49, 0x8b, 0xce, + 0x83, 0xe1, 0x10, 0x75, 0x1d, 0x48, 0x85, 0xc0, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc0, 0x08, 0x4c, 0x8b, 0xee, + 0x48, 0x89, 0x45, 0xb0, 0x49, 0x63, 0x5d, 0x00, 0xeb, 0x1a, 0x48, 0x85, + 0xc0, 0x75, 0x0a, 0x48, 0x83, 0x45, 0xa8, 0x08, 0x49, 0x8b, 0x1f, 0xeb, + 0x0b, 0x48, 0x8b, 0x1e, 0x48, 0x83, 0xc0, 0x08, 0x48, 0x89, 0x45, 0xb0, + 0x41, 0x8a, 0xc6, 0xc0, 0xe0, 0x03, 0x24, 0x20, 0x0f, 0xb6, 0xf8, 0x41, + 0xf6, 0xc6, 0x02, 0xb8, 0x2b, 0x00, 0x00, 0x00, 0x0f, 0x45, 0xf8, 0x49, + 0x8b, 0xc6, 0x83, 0xe0, 0x08, 0x89, 0x7d, 0xc0, 0x41, 0x0f, 0x95, 0xc7, + 0x44, 0x88, 0x7d, 0x81, 0x45, 0x84, 0xf6, 0x78, 0x45, 0x41, 0xb8, 0x0a, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x0c, 0x49, 0x83, 0xe6, 0xdf, + 0x48, 0xc7, 0x45, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x49, 0x8b, 0xc6, 0x25, + 0x00, 0x40, 0x00, 0x00, 0x48, 0x85, 0xdb, 0x79, 0x14, 0x48, 0x85, 0xc0, + 0x75, 0x14, 0x49, 0x83, 0xce, 0x02, 0x40, 0xb7, 0x2d, 0x89, 0x7d, 0xc0, + 0x48, 0xf7, 0xdb, 0xeb, 0x26, 0x48, 0x85, 0xc0, 0x74, 0x21, 0x41, 0xf6, + 0xc6, 0x10, 0x75, 0x1b, 0xeb, 0x17, 0x45, 0x32, 0xff, 0x41, 0xb8, 0x10, + 0x00, 0x00, 0x00, 0x44, 0x88, 0x7d, 0x81, 0x48, 0x85, 0xc9, 0x75, 0x07, + 0x48, 0x85, 0xdb, 0x79, 0x02, 0x8b, 0xdb, 0x48, 0x8b, 0xd3, 0x48, 0x8d, + 0x4d, 0x28, 0xe8, 0x91, 0xf6, 0xff, 0xff, 0x4c, 0x8b, 0x55, 0xa0, 0x48, + 0x8b, 0xf0, 0x4c, 0x8b, 0xc6, 0x48, 0x8d, 0x45, 0x28, 0x4c, 0x2b, 0xc0, + 0x48, 0x85, 0xdb, 0x75, 0x1e, 0x4d, 0x85, 0xd2, 0x75, 0x19, 0x45, 0x33, + 0xc0, 0x48, 0x8d, 0x75, 0x28, 0x33, 0xc9, 0x49, 0xb9, 0xab, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x48, 0x89, 0x4d, 0xe8, 0xeb, 0x31, 0x49, + 0xb9, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x49, 0x8b, 0xd8, + 0x49, 0x8b, 0xc1, 0x49, 0xf7, 0xe0, 0x48, 0xd1, 0xea, 0x48, 0x8d, 0x04, + 0x52, 0x48, 0x2b, 0xd8, 0x48, 0x89, 0x5d, 0xe8, 0x74, 0x0e, 0x48, 0x8b, + 0xd8, 0x49, 0x2b, 0xd8, 0x48, 0x83, 0xc3, 0x03, 0x48, 0x89, 0x5d, 0xe8, + 0x45, 0x84, 0xff, 0x74, 0x15, 0x4d, 0x85, 0xc0, 0x74, 0x10, 0x49, 0x8d, + 0x48, 0xff, 0x49, 0x8b, 0xc1, 0x48, 0xf7, 0xe1, 0x48, 0xd1, 0xea, 0x4c, + 0x03, 0xc2, 0x40, 0x84, 0xff, 0x74, 0x03, 0x49, 0xff, 0xc2, 0x4c, 0x8b, + 0x65, 0x90, 0x4d, 0x8d, 0x68, 0x01, 0x40, 0x84, 0xff, 0x41, 0xb3, 0x01, + 0x4d, 0x0f, 0x44, 0xe8, 0x49, 0x0f, 0xba, 0xee, 0x0c, 0x49, 0x8b, 0xc6, + 0x4c, 0x89, 0x6d, 0x98, 0x25, 0x21, 0x0a, 0x00, 0x00, 0x48, 0x3d, 0x20, + 0x02, 0x00, 0x00, 0x4c, 0x0f, 0x44, 0x55, 0xd8, 0xe9, 0x98, 0xfb, 0xff, + 0xff, 0x48, 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x48, 0x8b, 0xde, + 0x48, 0x89, 0x4d, 0xb0, 0x48, 0x8b, 0x1b, 0x48, 0x85, 0xdb, 0x75, 0x0c, + 0x48, 0x8d, 0x35, 0xcd, 0x16, 0x00, 0x00, 0xe9, 0x59, 0xfb, 0xff, 0xff, + 0x44, 0x8b, 0x3b, 0x48, 0x8d, 0x7b, 0x04, 0x48, 0x85, 0xff, 0x75, 0x16, + 0x4c, 0x8d, 0x05, 0x75, 0x11, 0x00, 0x00, 0x8d, 0x57, 0x1e, 0x48, 0x8d, + 0x0d, 0x3b, 0x13, 0x00, 0x00, 0xe8, 0x32, 0xf2, 0xff, 0xff, 0x0f, 0xb7, + 0x37, 0x48, 0x8d, 0x7b, 0x06, 0x48, 0x85, 0xff, 0x75, 0x16, 0x4c, 0x8d, + 0x05, 0x53, 0x11, 0x00, 0x00, 0x8d, 0x57, 0x1e, 0x48, 0x8d, 0x0d, 0x19, + 0x13, 0x00, 0x00, 0xe8, 0x10, 0xf2, 0xff, 0xff, 0x0f, 0xb6, 0x4b, 0x0e, + 0x0f, 0xb6, 0x53, 0x0d, 0x44, 0x0f, 0xb6, 0x43, 0x0c, 0x44, 0x0f, 0xb6, + 0x4b, 0x0b, 0x0f, 0xb6, 0x43, 0x0f, 0x44, 0x0f, 0xb6, 0x53, 0x0a, 0x44, + 0x0f, 0xb6, 0x5b, 0x09, 0x0f, 0xb6, 0x5b, 0x08, 0x0f, 0xb7, 0x3f, 0x89, + 0x44, 0x24, 0x70, 0x89, 0x4c, 0x24, 0x68, 0x48, 0x8d, 0x4d, 0x28, 0x89, + 0x54, 0x24, 0x60, 0x44, 0x89, 0x44, 0x24, 0x58, 0x45, 0x33, 0xc0, 0x44, + 0x89, 0x4c, 0x24, 0x50, 0x4c, 0x8d, 0x0d, 0x49, 0x16, 0x00, 0x00, 0x44, + 0x89, 0x54, 0x24, 0x48, 0x44, 0x89, 0x5c, 0x24, 0x40, 0x89, 0x5c, 0x24, + 0x38, 0x41, 0x8d, 0x50, 0x26, 0x89, 0x7c, 0x24, 0x30, 0x89, 0x74, 0x24, + 0x28, 0x44, 0x89, 0x7c, 0x24, 0x20, 0xe8, 0xc9, 0x04, 0x00, 0x00, 0xe9, + 0x69, 0xfc, 0xff, 0xff, 0x4c, 0x03, 0xe3, 0x49, 0x3b, 0xda, 0x75, 0x04, + 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, 0xe0, + 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x8d, 0x35, 0x6b, 0x16, 0x00, + 0x00, 0x48, 0x98, 0x48, 0x0b, 0xc8, 0x49, 0x23, 0xc8, 0x48, 0x83, 0xf9, + 0x0a, 0x48, 0x89, 0x4d, 0xd0, 0x4c, 0x0f, 0x45, 0xe2, 0x48, 0x0f, 0x45, + 0xf7, 0x4c, 0x89, 0x65, 0x90, 0xe9, 0x73, 0xfa, 0xff, 0xff, 0x4c, 0x03, + 0xe3, 0x48, 0x8d, 0x35, 0x40, 0x16, 0x00, 0x00, 0x49, 0x3b, 0xda, 0x75, + 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, + 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, 0x0b, 0xc8, + 0x49, 0x23, 0xc8, 0x48, 0x83, 0xf9, 0x0d, 0x48, 0x89, 0x4d, 0xd0, 0x4c, + 0x0f, 0x45, 0xe2, 0x4c, 0x89, 0x65, 0x90, 0xe9, 0x35, 0xfa, 0xff, 0xff, + 0x44, 0x8a, 0x5d, 0x80, 0x4c, 0x8b, 0x55, 0xa0, 0xe9, 0x28, 0xfa, 0xff, + 0xff, 0x45, 0x33, 0xed, 0x4c, 0x8d, 0x46, 0x01, 0x41, 0x80, 0x78, 0xff, + 0x00, 0x75, 0x0e, 0x48, 0x8b, 0xda, 0x4d, 0x85, 0xc9, 0x74, 0x37, 0x41, + 0x80, 0x38, 0x00, 0x74, 0x31, 0x4d, 0x3b, 0xea, 0x72, 0x0a, 0x48, 0x8b, + 0xda, 0x49, 0x0f, 0xba, 0xe6, 0x0b, 0x72, 0x22, 0x41, 0x0f, 0xbe, 0x00, + 0x48, 0x8b, 0xda, 0xc1, 0xe0, 0x08, 0x48, 0x63, 0xc8, 0x41, 0x0f, 0xb6, + 0x40, 0xff, 0x48, 0x0b, 0xc8, 0x48, 0x85, 0xcf, 0x74, 0x08, 0x49, 0xff, + 0xc5, 0x4c, 0x03, 0xc2, 0xeb, 0xba, 0x4c, 0x89, 0x6d, 0x98, 0x4c, 0x8b, + 0x4d, 0xc8, 0x4d, 0x3b, 0xd5, 0x49, 0x8b, 0xc6, 0x4d, 0x0f, 0x42, 0xd5, + 0x4c, 0x8b, 0x6d, 0xf8, 0x25, 0x01, 0x02, 0x00, 0x00, 0x4c, 0x89, 0x55, + 0xa0, 0x48, 0x3d, 0x00, 0x02, 0x00, 0x00, 0x75, 0x49, 0x4c, 0x8b, 0x45, + 0xd8, 0x4d, 0x2b, 0xc2, 0x49, 0x8b, 0xc0, 0x49, 0x0f, 0xaf, 0xc5, 0x4c, + 0x03, 0xc8, 0x4c, 0x89, 0x4d, 0xc8, 0x49, 0x0f, 0xba, 0xe6, 0x0d, 0x72, + 0x2d, 0x48, 0x8b, 0x55, 0xb8, 0x4d, 0x85, 0xff, 0x74, 0x28, 0x41, 0xb9, + 0x20, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xcf, + 0xe8, 0x83, 0xf3, 0xff, 0xff, 0x4c, 0x8b, 0x55, 0xa0, 0x4c, 0x8b, 0xf8, + 0x4c, 0x8b, 0x4d, 0xc8, 0x48, 0x89, 0x45, 0x88, 0xeb, 0x04, 0x48, 0x8b, + 0x55, 0xb8, 0x45, 0x84, 0xdb, 0x0f, 0x84, 0x93, 0x01, 0x00, 0x00, 0x8b, + 0x45, 0xc0, 0x84, 0xc0, 0x74, 0x46, 0x4d, 0x03, 0xcd, 0x49, 0x0f, 0xba, + 0xe6, 0x0d, 0x72, 0x3c, 0x4c, 0x8b, 0x5d, 0xb8, 0x4d, 0x85, 0xff, 0x74, + 0x37, 0x0f, 0xb6, 0xd0, 0x33, 0xc9, 0x4d, 0x3b, 0xfb, 0x73, 0x23, 0x41, + 0x88, 0x07, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x0e, 0x48, 0x8b, 0xc2, 0x48, + 0xc1, 0xe8, 0x08, 0x41, 0x88, 0x47, 0x01, 0x8b, 0x45, 0xc0, 0x4d, 0x03, + 0xfd, 0x48, 0xff, 0xc1, 0x48, 0x83, 0xf9, 0x01, 0x7c, 0xd8, 0x4c, 0x89, + 0x7d, 0x88, 0xeb, 0x04, 0x4c, 0x8b, 0x5d, 0xb8, 0x4d, 0x8b, 0xc2, 0x4c, + 0x2b, 0x45, 0x98, 0x49, 0x8b, 0xc0, 0x49, 0x0f, 0xaf, 0xc5, 0x4c, 0x03, + 0xc8, 0x4c, 0x89, 0x4d, 0xc8, 0x49, 0x0f, 0xba, 0xe6, 0x0d, 0x72, 0x22, + 0x4d, 0x85, 0xff, 0x74, 0x1d, 0x41, 0xb9, 0x30, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xd3, 0x49, 0x8b, 0xcf, 0xe8, 0xdd, + 0xf2, 0xff, 0xff, 0x4c, 0x8b, 0xf8, 0x48, 0x89, 0x45, 0x88, 0x4c, 0x8b, + 0x5d, 0xb8, 0x45, 0x33, 0xc0, 0x44, 0x38, 0x45, 0xc0, 0x41, 0x0f, 0x95, + 0xc0, 0x4c, 0x3b, 0x45, 0x98, 0x0f, 0x83, 0x9c, 0x01, 0x00, 0x00, 0x4c, + 0x8b, 0x55, 0x98, 0x4d, 0x8b, 0xce, 0x4c, 0x8b, 0x65, 0xe8, 0x41, 0x81, + 0xe1, 0x00, 0x20, 0x00, 0x00, 0x80, 0x3e, 0x00, 0x75, 0x14, 0x48, 0x83, + 0xfb, 0x01, 0x0f, 0x8e, 0x73, 0x01, 0x00, 0x00, 0x80, 0x7e, 0x01, 0x00, + 0x0f, 0x84, 0x69, 0x01, 0x00, 0x00, 0x0f, 0xb6, 0x06, 0x0f, 0xb6, 0x4e, + 0x01, 0x48, 0xc1, 0xe1, 0x08, 0x48, 0x0b, 0xc8, 0x48, 0x8b, 0x45, 0xc8, + 0x49, 0x03, 0xc5, 0x48, 0x23, 0xcf, 0x48, 0x89, 0x45, 0xc8, 0x4d, 0x85, + 0xc9, 0x75, 0x30, 0x4d, 0x85, 0xff, 0x74, 0x2b, 0x33, 0xd2, 0x4d, 0x3b, + 0xfb, 0x73, 0x20, 0x41, 0x88, 0x0f, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x0b, + 0x48, 0x8b, 0xc1, 0x48, 0xc1, 0xe8, 0x08, 0x41, 0x88, 0x47, 0x01, 0x4d, + 0x03, 0xfd, 0x48, 0xff, 0xc2, 0x48, 0x83, 0xfa, 0x01, 0x7c, 0xdb, 0x48, + 0x8b, 0x45, 0xc8, 0x48, 0x03, 0xf3, 0x49, 0xff, 0xc0, 0x80, 0x7d, 0x81, + 0x00, 0x0f, 0x84, 0xff, 0x00, 0x00, 0x00, 0x49, 0xff, 0xc4, 0x49, 0x83, + 0xfc, 0x03, 0x0f, 0x85, 0xf2, 0x00, 0x00, 0x00, 0x45, 0x33, 0xe4, 0x49, + 0xff, 0xc0, 0x4d, 0x3b, 0xc2, 0x0f, 0x83, 0xec, 0x00, 0x00, 0x00, 0x49, + 0x03, 0xc5, 0x48, 0x89, 0x45, 0xc8, 0x4d, 0x85, 0xc9, 0x0f, 0x85, 0x5a, + 0xff, 0xff, 0xff, 0x4d, 0x85, 0xff, 0x0f, 0x84, 0x51, 0xff, 0xff, 0xff, + 0x33, 0xc0, 0x4d, 0x3b, 0xfb, 0x0f, 0x83, 0x46, 0xff, 0xff, 0xff, 0x41, + 0xc6, 0x07, 0x2c, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x04, 0x45, 0x88, 0x67, + 0x01, 0x4d, 0x03, 0xfd, 0x48, 0xff, 0xc0, 0x48, 0x83, 0xf8, 0x01, 0x7c, + 0xdd, 0xe9, 0x27, 0xff, 0xff, 0xff, 0x4d, 0x8b, 0xc2, 0x4d, 0x8b, 0xde, + 0x4c, 0x2b, 0x45, 0x98, 0x49, 0x8b, 0xc0, 0x49, 0x0f, 0xaf, 0xc5, 0x4c, + 0x03, 0xc8, 0x4c, 0x89, 0x4d, 0xc8, 0x41, 0x81, 0xe3, 0x00, 0x20, 0x00, + 0x00, 0x75, 0x21, 0x4d, 0x85, 0xff, 0x74, 0x1c, 0x45, 0x8d, 0x4b, 0x20, + 0x4c, 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xcf, 0xe8, 0x9b, 0xf1, 0xff, + 0xff, 0x4c, 0x8b, 0x4d, 0xc8, 0x4c, 0x8b, 0xf8, 0x48, 0x89, 0x45, 0x88, + 0x8b, 0x45, 0xc0, 0x84, 0xc0, 0x0f, 0x84, 0xaf, 0xfe, 0xff, 0xff, 0x4d, + 0x03, 0xcd, 0x4c, 0x89, 0x4d, 0xc8, 0x4d, 0x85, 0xdb, 0x0f, 0x85, 0x9f, + 0xfe, 0xff, 0xff, 0x4c, 0x8b, 0x5d, 0xb8, 0x4d, 0x85, 0xff, 0x0f, 0x84, + 0x96, 0xfe, 0xff, 0xff, 0x0f, 0xb6, 0xd0, 0x33, 0xc9, 0x4d, 0x3b, 0xfb, + 0x73, 0x23, 0x41, 0x88, 0x07, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x0e, 0x48, + 0x8b, 0xc2, 0x48, 0xc1, 0xe8, 0x08, 0x41, 0x88, 0x47, 0x01, 0x8b, 0x45, + 0xc0, 0x4d, 0x03, 0xfd, 0x48, 0xff, 0xc1, 0x48, 0x83, 0xf9, 0x01, 0x7c, + 0xd8, 0x4c, 0x89, 0x7d, 0x88, 0xe9, 0x60, 0xfe, 0xff, 0xff, 0x4d, 0x3b, + 0xc2, 0x0f, 0x82, 0x7e, 0xfe, 0xff, 0xff, 0x4c, 0x8b, 0x65, 0x90, 0x4c, + 0x89, 0x7d, 0x88, 0x48, 0x8b, 0x75, 0xc8, 0x41, 0xb9, 0x01, 0x02, 0x00, + 0x00, 0x49, 0x8b, 0xc6, 0x49, 0x23, 0xc1, 0x49, 0x3b, 0xc1, 0x75, 0x42, + 0x48, 0x8b, 0x4d, 0xd8, 0x48, 0x2b, 0x4d, 0xa0, 0x48, 0x8b, 0xc1, 0x49, + 0x0f, 0xaf, 0xc5, 0x48, 0x03, 0xf0, 0x48, 0x89, 0x75, 0xc8, 0x49, 0x0f, + 0xba, 0xe6, 0x0d, 0x72, 0x25, 0x4d, 0x85, 0xff, 0x74, 0x20, 0x4c, 0x8b, + 0xc1, 0x4c, 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xcf, 0x41, 0xb9, 0x20, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0xd3, 0xe8, 0xd1, 0xf0, 0xff, 0xff, 0x4c, + 0x8b, 0xf8, 0x48, 0x89, 0x45, 0x88, 0x48, 0x8b, 0x5d, 0xf0, 0x4c, 0x03, + 0xe3, 0x4c, 0x89, 0x65, 0x90, 0x48, 0x83, 0xfb, 0x01, 0x75, 0x04, 0x33, + 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, 0xe0, 0x08, + 0x4c, 0x8b, 0x45, 0xe0, 0x48, 0x8d, 0x3d, 0x75, 0x12, 0x00, 0x00, 0x48, + 0x63, 0xc8, 0x41, 0x0f, 0xb6, 0x04, 0x24, 0x48, 0x0b, 0xc8, 0x49, 0x23, + 0xc8, 0x48, 0x89, 0x4d, 0xd0, 0x48, 0x8b, 0xc1, 0x0f, 0x85, 0x3f, 0xf3, + 0xff, 0xff, 0x49, 0x0f, 0xba, 0xe6, 0x0d, 0x73, 0x0a, 0x33, 0xd2, 0x48, + 0x8b, 0xc6, 0x49, 0xf7, 0xf5, 0xeb, 0x53, 0x4d, 0x85, 0xff, 0x75, 0x18, + 0x4c, 0x8d, 0x05, 0x7d, 0x0c, 0x00, 0x00, 0xba, 0x00, 0x05, 0x00, 0x00, + 0x48, 0x8d, 0x0d, 0x79, 0x0f, 0x00, 0x00, 0xe8, 0x38, 0xed, 0xff, 0xff, + 0x48, 0x8b, 0x55, 0xb8, 0x33, 0xc9, 0x49, 0x03, 0xd5, 0x49, 0x8b, 0xc7, + 0x48, 0x3b, 0xc2, 0x73, 0x19, 0xc6, 0x00, 0x00, 0x49, 0x83, 0xfd, 0x01, + 0x74, 0x04, 0xc6, 0x40, 0x01, 0x00, 0x49, 0x03, 0xc5, 0x48, 0xff, 0xc1, + 0x48, 0x83, 0xf9, 0x01, 0x7c, 0xe2, 0x4c, 0x2b, 0x7d, 0x00, 0x49, 0x8b, + 0xc7, 0x48, 0x99, 0x49, 0xf7, 0xfd, 0x48, 0x8b, 0x4d, 0x50, 0x48, 0x33, + 0xcc, 0xe8, 0x24, 0xeb, 0xff, 0xff, 0x48, 0x8b, 0x9c, 0x24, 0xb0, 0x01, + 0x00, 0x00, 0x48, 0x81, 0xc4, 0x60, 0x01, 0x00, 0x00, 0x41, 0x5f, 0x41, + 0x5e, 0x41, 0x5d, 0x41, 0x5c, 0x5f, 0x5e, 0x5d, 0xc3, 0xcc, 0xcc, 0xcc, + 0x4c, 0x8b, 0xdc, 0x4d, 0x89, 0x4b, 0x20, 0x48, 0x83, 0xec, 0x38, 0x49, + 0x8d, 0x43, 0x28, 0x49, 0xc7, 0x43, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x43, 0xe8, 0xe8, 0x78, 0xf0, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x38, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x54, 0x24, 0x10, 0x48, 0x83, 0xec, + 0x28, 0x48, 0x8b, 0x05, 0x24, 0x16, 0x00, 0x00, 0x4c, 0x8d, 0x44, 0x24, + 0x38, 0xba, 0x82, 0x02, 0x00, 0x00, 0xb9, 0x04, 0x00, 0x00, 0x00, 0x4c, + 0x8b, 0x48, 0x40, 0x41, 0xff, 0xd1, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc1, 0x72, 0x04, 0x33, 0xc0, 0xeb, + 0x05, 0x48, 0x8b, 0x44, 0x24, 0x38, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0xcc, + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x05, 0xe5, 0x15, 0x00, 0x00, 0x48, + 0x8b, 0x50, 0x48, 0xff, 0xd2, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc1, 0x72, 0x2c, 0x4c, 0x8b, 0xc0, 0x48, + 0x8d, 0x15, 0x7e, 0x0a, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x80, 0xe8, + 0x60, 0xeb, 0xff, 0xff, 0x4c, 0x8d, 0x05, 0x95, 0x0a, 0x00, 0x00, 0xba, + 0x35, 0x03, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0xe1, 0x14, 0x00, 0x00, 0xe8, + 0x20, 0xec, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x65, 0x6c, 0x6c, + 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x5f, 0x45, 0x46, 0x49, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x28, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x20, 0x3d, 0x20, 0x25, 0x72, 0x29, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0x28, 0x28, 0x52, 0x45, 0x54, 0x55, + 0x52, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x29, 0x28, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, + 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x55, 0x4c, 0x4c, 0x29, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, 0x20, 0x00, 0x48, 0x00, + 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x57, 0x00, + 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x21, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x21, + 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, + 0x30, 0x29, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, + 0x69, 0x62, 0x53, 0x74, 0x64, 0x45, 0x72, 0x72, 0x5c, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x41, 0x53, 0x53, 0x45, + 0x52, 0x54, 0x20, 0x5b, 0x25, 0x61, 0x5d, 0x20, 0x25, 0x61, 0x28, 0x25, + 0x64, 0x29, 0x3a, 0x20, 0x25, 0x61, 0x0a, 0x00, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x67, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x21, 0x3d, 0x20, + 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, + 0x69, 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, 0x6f, 0x6f, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x67, 0x42, 0x53, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x52, 0x54, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, + 0x66, 0x69, 0x4c, 0x69, 0x62, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x63, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x55, 0x49, + 0x4e, 0x54, 0x4e, 0x29, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x21, 0x3d, 0x20, 0x28, + 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, + 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x53, 0x61, 0x66, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x69, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, + 0x21, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, + 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x5c, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, + 0x29, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, + 0x69, 0x62, 0x5c, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x20, + 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, + 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, + 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x21, 0x3d, 0x20, 0x28, + 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, + 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x53, 0x74, 0x72, 0x6e, 0x4c, 0x65, 0x6e, 0x53, 0x20, 0x28, 0x28, + 0x43, 0x48, 0x41, 0x52, 0x31, 0x36, 0x20, 0x2a, 0x29, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x55, + 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x55, 0x6e, + 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x6e, 0x4c, 0x65, + 0x6e, 0x53, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, + 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, + 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, + 0x6c, 0x20, 0x67, 0x75, 0x69, 0x64, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x30, 0x38, 0x78, 0x2d, 0x25, 0x30, 0x34, 0x78, 0x2d, 0x25, 0x30, + 0x34, 0x78, 0x2d, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x2d, + 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, + 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x30, 0x32, 0x64, 0x2f, 0x25, 0x30, 0x32, 0x64, 0x2f, 0x25, 0x30, + 0x34, 0x64, 0x20, 0x20, 0x25, 0x30, 0x32, 0x64, 0x3a, 0x25, 0x30, 0x32, + 0x64, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x0d, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x47, 0x6c, 0x79, 0x70, 0x68, 0x00, 0x00, + 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x53, + 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x20, 0x44, 0x61, 0x74, 0x61, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x52, 0x65, 0x73, 0x65, 0x74, 0x20, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x61, 0x64, 0x20, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x54, + 0x6f, 0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x52, 0x65, 0x61, 0x64, 0x79, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x46, 0x75, 0x6c, 0x6c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x4d, 0x65, + 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x44, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, + 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x6c, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x43, 0x4d, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x46, + 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, + 0x69, 0x62, 0x6c, 0x65, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x00, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x56, 0x69, + 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x43, 0x52, + 0x43, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x6e, 0x64, 0x20, 0x6f, + 0x66, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x20, 0x28, 0x32, 0x39, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x28, 0x33, + 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x6e, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x6f, 0x6d, 0x69, + 0x73, 0x65, 0x64, 0x20, 0x44, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x00, 0x00, 0x48, 0x54, + 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, + 0x66, 0x69, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x5c, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x62, 0x5c, 0x44, 0x69, 0x76, 0x55, 0x36, 0x34, 0x78, 0x33, 0x32, 0x52, + 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x63, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x80, 0x18, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x09, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, + 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x48, 0x00, 0x49, 0x00, 0x49, 0x00, 0x6e, 0x93, 0x87, 0x69, + 0x34, 0xed, 0xdb, 0x44, 0xae, 0x97, 0x1f, 0xa5, 0xe4, 0xed, 0x21, 0x16, + 0x1d, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x04, 0x34, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x00, 0x14, 0x45, 0x00, 0x6e, + 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x00, + 0x00, 0x14, 0x2e, 0x00, 0x54, 0x00, 0x48, 0x00, 0x20, 0x00, 0x48, 0x00, + 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x57, 0x00, 0x6f, 0x00, + 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x30, 0x00, 0x20, 0x00, + 0x22, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6c, 0x00, + 0x61, 0x00, 0x79, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, + 0x22, 0x00, 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, 0x20, 0x00, + 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x20, 0x00, + 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x21, 0x00, + 0x22, 0x00, 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, + 0x6e, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x22, 0x00, 0x0d, 0x00, 0x0a, 0x00, + 0x2e, 0x00, 0x53, 0x00, 0x48, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x41, 0x00, + 0x4d, 0x00, 0x45, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x48, 0x00, 0x65, 0x00, + 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, + 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, + 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; +CONST UINTN mUnsignedImageSize = sizeof (mUnsignedImage); + +// +// X64 PE/COFF image signed by the leaf cert (chain embedded) +// +CONST UINT8 mSignedImage[] = { + 0x4d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x45, 0x00, 0x00, 0x64, 0x86, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x22, 0x20, 0x0b, 0x02, 0x0e, 0x2c, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x92, 0x1e, 0x01, 0x00, + 0x0a, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0xb0, 0x10, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3b, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, + 0xb9, 0x15, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x00, 0x00, 0x00, 0x58, 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x42, 0x2e, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, + 0xdc, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x2e, 0x72, 0x73, 0x72, + 0x63, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf3, 0x90, 0xc3, 0xcc, + 0x48, 0x89, 0x5c, 0x24, 0x08, 0x57, 0x48, 0x83, 0xec, 0x30, 0x48, 0x8b, + 0x42, 0x60, 0x4c, 0x8d, 0x05, 0x33, 0x02, 0x00, 0x00, 0x45, 0x33, 0xc9, + 0x48, 0x89, 0x15, 0x45, 0x2b, 0x00, 0x00, 0x48, 0x8b, 0xfa, 0x48, 0x8b, + 0xd9, 0xb9, 0x01, 0x02, 0x00, 0x00, 0x4c, 0x8b, 0x50, 0x50, 0x48, 0x8d, + 0x05, 0x1f, 0x2b, 0x00, 0x00, 0x41, 0x8d, 0x51, 0x10, 0x48, 0x89, 0x44, + 0x24, 0x20, 0x41, 0xff, 0xd2, 0x48, 0x89, 0x1d, 0xf4, 0x2a, 0x00, 0x00, + 0x48, 0x85, 0xdb, 0x75, 0x16, 0x4c, 0x8d, 0x05, 0xb8, 0x20, 0x00, 0x00, + 0x8d, 0x53, 0x2c, 0x48, 0x8d, 0x0d, 0xce, 0x20, 0x00, 0x00, 0xe8, 0x5d, + 0x01, 0x00, 0x00, 0x48, 0x8b, 0x47, 0x60, 0x48, 0x89, 0x3d, 0xc6, 0x2a, + 0x00, 0x00, 0x48, 0x89, 0x05, 0xcf, 0x2a, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x75, 0x16, 0x4c, 0x8d, 0x05, 0x03, 0x21, 0x00, 0x00, 0x8d, 0x50, 0x38, + 0x48, 0x8d, 0x0d, 0xa1, 0x20, 0x00, 0x00, 0xe8, 0x30, 0x01, 0x00, 0x00, + 0x48, 0x8b, 0x47, 0x58, 0x48, 0x89, 0x05, 0xb1, 0x2a, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x75, 0x16, 0x4c, 0x8d, 0x05, 0xf5, 0x20, 0x00, 0x00, 0x8d, + 0x50, 0x29, 0x48, 0x8d, 0x0d, 0x0b, 0x21, 0x00, 0x00, 0xe8, 0x0a, 0x01, + 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x9f, 0x1f, 0x00, 0x00, 0xe8, 0x7a, 0x02, + 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x8b, 0x2a, 0x00, 0x00, 0x48, 0x85, 0xc9, + 0x74, 0x0a, 0x48, 0x8b, 0x47, 0x60, 0x48, 0x8b, 0x50, 0x70, 0xff, 0xd2, + 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x33, 0xc0, 0x48, 0x83, 0xc4, 0x30, 0x5f, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x8b, 0xc4, 0x48, 0x89, 0x50, 0x10, 0x4c, + 0x89, 0x40, 0x18, 0x4c, 0x89, 0x48, 0x20, 0x48, 0x83, 0xec, 0x28, 0x4c, + 0x8d, 0x40, 0x18, 0xe8, 0x08, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x74, + 0x24, 0x20, 0x57, 0x48, 0x81, 0xec, 0x30, 0x02, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x37, 0x2a, 0x00, 0x00, 0x48, 0x33, 0xc4, 0x48, 0x89, 0x84, 0x24, + 0x20, 0x02, 0x00, 0x00, 0x80, 0x3d, 0xf5, 0x29, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0xf0, 0x48, 0x8b, 0xda, 0x48, 0x8b, 0xf9, 0x75, 0x57, 0x48, 0x85, + 0xd2, 0x75, 0x16, 0x4c, 0x8d, 0x05, 0x36, 0x1f, 0x00, 0x00, 0x8d, 0x53, + 0x5d, 0x48, 0x8d, 0x0d, 0x44, 0x1f, 0x00, 0x00, 0xe8, 0x63, 0x00, 0x00, + 0x00, 0x48, 0x0f, 0xba, 0xe7, 0x1f, 0x73, 0x35, 0x4c, 0x8b, 0xce, 0x48, + 0x8d, 0x4c, 0x24, 0x20, 0x4c, 0x8b, 0xc3, 0xba, 0x00, 0x02, 0x00, 0x00, + 0xe8, 0xcf, 0x02, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0xe4, 0x29, 0x00, 0x00, + 0x48, 0x85, 0xc9, 0x74, 0x14, 0x48, 0x8b, 0x49, 0x50, 0x48, 0x85, 0xc9, + 0x74, 0x0b, 0x48, 0x8b, 0x41, 0x08, 0x48, 0x8d, 0x54, 0x24, 0x20, 0xff, + 0xd0, 0x48, 0x8b, 0x8c, 0x24, 0x20, 0x02, 0x00, 0x00, 0x48, 0x33, 0xcc, + 0xe8, 0x45, 0xfe, 0xff, 0xff, 0x4c, 0x8d, 0x9c, 0x24, 0x30, 0x02, 0x00, + 0x00, 0x49, 0x8b, 0x5b, 0x10, 0x49, 0x8b, 0x73, 0x28, 0x49, 0x8b, 0xe3, + 0x5f, 0xc3, 0xcc, 0xcc, 0x48, 0x81, 0xec, 0x58, 0x02, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x8e, 0x29, 0x00, 0x00, 0x48, 0x33, 0xc4, 0x48, 0x89, 0x84, + 0x24, 0x40, 0x02, 0x00, 0x00, 0x80, 0x3d, 0x4c, 0x29, 0x00, 0x00, 0x00, + 0x75, 0x4c, 0x4c, 0x89, 0x44, 0x24, 0x30, 0x4c, 0x8d, 0x0d, 0xfe, 0x1d, + 0x00, 0x00, 0x48, 0x89, 0x54, 0x24, 0x28, 0x4c, 0x8d, 0x05, 0xe2, 0x1e, + 0x00, 0x00, 0x48, 0x89, 0x4c, 0x24, 0x20, 0xba, 0x00, 0x02, 0x00, 0x00, + 0x48, 0x8d, 0x4c, 0x24, 0x40, 0xe8, 0xb2, 0x02, 0x00, 0x00, 0x48, 0x8b, + 0x0d, 0x4f, 0x29, 0x00, 0x00, 0x48, 0x85, 0xc9, 0x74, 0x14, 0x48, 0x8b, + 0x49, 0x50, 0x48, 0x85, 0xc9, 0x74, 0x0b, 0x48, 0x8b, 0x41, 0x08, 0x48, + 0x8d, 0x54, 0x24, 0x40, 0xff, 0xd0, 0x48, 0x8b, 0x8c, 0x24, 0x40, 0x02, + 0x00, 0x00, 0x48, 0x33, 0xcc, 0xe8, 0xb0, 0xfd, 0xff, 0xff, 0x48, 0x81, + 0xc4, 0x58, 0x02, 0x00, 0x00, 0xc3, 0xcc, 0xcc, 0xc6, 0x05, 0xdd, 0x28, + 0x00, 0x00, 0x01, 0xc3, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, + 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xec, 0x20, + 0x49, 0x8b, 0xe8, 0x48, 0x8b, 0xf2, 0x48, 0x8b, 0xf9, 0x48, 0x85, 0xc9, + 0x75, 0x0c, 0x4c, 0x8d, 0x05, 0x0b, 0x1e, 0x00, 0x00, 0x8d, 0x51, 0x3d, + 0xeb, 0x12, 0x40, 0xf6, 0xc7, 0x01, 0x74, 0x18, 0x4c, 0x8d, 0x05, 0xd1, + 0x1f, 0x00, 0x00, 0xba, 0x3e, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x85, + 0x1f, 0x00, 0x00, 0xe8, 0x24, 0xff, 0xff, 0xff, 0x48, 0x85, 0xf6, 0x75, + 0x16, 0x4c, 0x8d, 0x05, 0xdc, 0x1f, 0x00, 0x00, 0x8d, 0x56, 0x3f, 0x48, + 0x8d, 0x0d, 0x6a, 0x1f, 0x00, 0x00, 0xe8, 0x09, 0xff, 0xff, 0xff, 0xe8, + 0x54, 0x12, 0x00, 0x00, 0x48, 0x8b, 0xd8, 0x48, 0x85, 0xc0, 0x75, 0x1a, + 0x4c, 0x8d, 0x05, 0x29, 0x1e, 0x00, 0x00, 0x8d, 0x50, 0x46, 0x48, 0x8d, + 0x0d, 0x47, 0x1f, 0x00, 0x00, 0xe8, 0xe6, 0xfe, 0xff, 0xff, 0x33, 0xc0, + 0xeb, 0x46, 0x4c, 0x8b, 0xcd, 0x4c, 0x8b, 0xc7, 0x48, 0x8b, 0xcb, 0xe8, + 0xd8, 0x00, 0x00, 0x00, 0x48, 0x8b, 0xf8, 0x48, 0x85, 0xf6, 0x74, 0x25, + 0x48, 0x85, 0xc0, 0x74, 0x20, 0x4c, 0x8b, 0x46, 0x08, 0x48, 0x8b, 0xd3, + 0x48, 0x8b, 0xce, 0x41, 0xff, 0xd0, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc1, 0x48, 0x1b, 0xc9, 0x48, 0x23, + 0xf9, 0x48, 0x8b, 0xcb, 0xe8, 0x33, 0x12, 0x00, 0x00, 0x48, 0x8b, 0xc7, + 0x48, 0x8b, 0x5c, 0x24, 0x30, 0x48, 0x8b, 0x6c, 0x24, 0x38, 0x48, 0x8b, + 0x74, 0x24, 0x40, 0x48, 0x83, 0xc4, 0x20, 0x5f, 0xc3, 0xcc, 0xcc, 0xcc, + 0x48, 0x8b, 0xc4, 0x48, 0x89, 0x48, 0x08, 0x48, 0x89, 0x50, 0x10, 0x4c, + 0x89, 0x40, 0x18, 0x4c, 0x89, 0x48, 0x20, 0x48, 0x83, 0xec, 0x28, 0x48, + 0x8b, 0x15, 0xda, 0x27, 0x00, 0x00, 0x4c, 0x8d, 0x40, 0x10, 0x48, 0x8b, + 0x52, 0x40, 0xe8, 0xe9, 0xfe, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x28, 0xc3, + 0x40, 0x53, 0x48, 0x83, 0xec, 0x20, 0x48, 0x8b, 0xd9, 0xf6, 0xc1, 0x01, + 0x74, 0x18, 0x4c, 0x8d, 0x05, 0x1b, 0x1f, 0x00, 0x00, 0xba, 0x7e, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x6f, 0x1f, 0x00, 0x00, 0xe8, 0x2e, 0xfe, + 0xff, 0xff, 0x33, 0xc9, 0x48, 0x85, 0xdb, 0x74, 0x21, 0x8b, 0xc1, 0x66, + 0x39, 0x0b, 0x74, 0x1c, 0x48, 0x3d, 0x40, 0x42, 0x0f, 0x00, 0x73, 0x0b, + 0x48, 0xff, 0xc0, 0x66, 0x39, 0x0c, 0x43, 0x75, 0xef, 0xeb, 0x09, 0xb8, + 0x41, 0x42, 0x0f, 0x00, 0xeb, 0x02, 0x33, 0xc0, 0x48, 0x83, 0xc4, 0x20, + 0x5b, 0xc3, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x74, + 0x24, 0x10, 0x57, 0x48, 0x83, 0xec, 0x30, 0x49, 0x8b, 0xf1, 0x49, 0x8b, + 0xd8, 0x48, 0x8b, 0xf9, 0xf6, 0xc1, 0x01, 0x74, 0x18, 0x4c, 0x8d, 0x05, + 0x7c, 0x1f, 0x00, 0x00, 0xba, 0x47, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, + 0x98, 0x1f, 0x00, 0x00, 0xe8, 0xc7, 0xfd, 0xff, 0xff, 0xf6, 0xc3, 0x01, + 0x74, 0x18, 0x4c, 0x8d, 0x05, 0xc7, 0x1f, 0x00, 0x00, 0xba, 0x48, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x7b, 0x1f, 0x00, 0x00, 0xe8, 0xaa, 0xfd, + 0xff, 0xff, 0xba, 0x41, 0x01, 0x00, 0x00, 0x48, 0xc7, 0x44, 0x24, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, 0xcb, 0x48, 0x89, 0x74, 0x24, 0x20, + 0x48, 0x8b, 0xcf, 0x44, 0x8d, 0x42, 0xff, 0xe8, 0x48, 0x01, 0x00, 0x00, + 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x48, 0x8b, 0x74, 0x24, 0x48, 0x48, 0x83, + 0xc4, 0x30, 0x5f, 0xc3, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, + 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xec, 0x30, + 0x49, 0x8b, 0xf1, 0x49, 0x8b, 0xe8, 0x48, 0x8b, 0xda, 0x48, 0x8b, 0xf9, + 0xf6, 0xc1, 0x01, 0x74, 0x18, 0x4c, 0x8d, 0x05, 0xf0, 0x1e, 0x00, 0x00, + 0xba, 0xea, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x0c, 0x1f, 0x00, 0x00, + 0xe8, 0x3b, 0xfd, 0xff, 0xff, 0x48, 0xd1, 0xeb, 0x4c, 0x8b, 0xcd, 0x48, + 0x8b, 0xd3, 0x48, 0xc7, 0x44, 0x24, 0x28, 0x00, 0x00, 0x00, 0x00, 0x41, + 0xb8, 0x40, 0x00, 0x00, 0x00, 0x48, 0x89, 0x74, 0x24, 0x20, 0x48, 0x8b, + 0xcf, 0xe8, 0xd6, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x48, + 0x8b, 0x6c, 0x24, 0x48, 0x48, 0x8b, 0x74, 0x24, 0x50, 0x48, 0x83, 0xc4, + 0x30, 0x5f, 0xc3, 0xcc, 0x4c, 0x89, 0x44, 0x24, 0x18, 0x4c, 0x89, 0x4c, + 0x24, 0x20, 0x48, 0x83, 0xec, 0x28, 0x4c, 0x8d, 0x4c, 0x24, 0x48, 0xe8, + 0x70, 0xff, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0xcc, 0xcc, 0xcc, + 0x45, 0x33, 0xd2, 0x4d, 0x85, 0xc0, 0x7e, 0x27, 0x48, 0x3b, 0xca, 0x73, + 0x22, 0x48, 0x83, 0x7c, 0x24, 0x28, 0x01, 0x44, 0x88, 0x09, 0x74, 0x0a, + 0x49, 0x8b, 0xc1, 0x48, 0xc1, 0xe8, 0x08, 0x88, 0x41, 0x01, 0x48, 0x03, + 0x4c, 0x24, 0x28, 0x49, 0xff, 0xc2, 0x4d, 0x3b, 0xd0, 0x7c, 0xd9, 0x48, + 0x8b, 0xc1, 0xc3, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x74, + 0x24, 0x10, 0x57, 0x48, 0x83, 0xec, 0x20, 0x48, 0x8b, 0xf2, 0xc6, 0x01, + 0x00, 0x48, 0x8b, 0xd9, 0x41, 0x8b, 0xf8, 0x85, 0xff, 0x75, 0x16, 0x4c, + 0x8d, 0x05, 0x1a, 0x1e, 0x00, 0x00, 0x8d, 0x57, 0x26, 0x48, 0x8d, 0x0d, + 0x88, 0x25, 0x00, 0x00, 0xe8, 0x77, 0xfc, 0xff, 0xff, 0x33, 0xd2, 0x48, + 0x8d, 0x0d, 0x1a, 0x25, 0x00, 0x00, 0x48, 0x8b, 0xc6, 0x48, 0xff, 0xc3, + 0x48, 0xf7, 0xf7, 0x48, 0x8b, 0xf0, 0x8b, 0xc2, 0x8a, 0x04, 0x08, 0x88, + 0x03, 0x48, 0x85, 0xf6, 0x75, 0xc5, 0x48, 0x8b, 0x74, 0x24, 0x38, 0x48, + 0x8b, 0xc3, 0x48, 0x8b, 0x5c, 0x24, 0x30, 0x48, 0x83, 0xc4, 0x20, 0x5f, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x18, 0x55, 0x56, 0x57, + 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x48, 0x8d, 0x6c, 0x24, + 0xa0, 0x48, 0x81, 0xec, 0x60, 0x01, 0x00, 0x00, 0x48, 0x8b, 0x05, 0xb9, + 0x25, 0x00, 0x00, 0x48, 0x33, 0xc4, 0x48, 0x89, 0x45, 0x50, 0x4c, 0x8b, + 0x9d, 0xc0, 0x00, 0x00, 0x00, 0x49, 0x8b, 0xf0, 0x4c, 0x8b, 0xf9, 0x48, + 0x89, 0x4d, 0x88, 0x33, 0xc9, 0x4c, 0x89, 0x4d, 0x90, 0x81, 0xe6, 0x00, + 0x20, 0x00, 0x00, 0x4c, 0x89, 0x5d, 0xa8, 0x48, 0x89, 0x4d, 0xb0, 0x4d, + 0x8b, 0xe1, 0x4d, 0x8b, 0xf0, 0x48, 0x8b, 0xfa, 0x48, 0x85, 0xd2, 0x74, + 0x29, 0x48, 0x85, 0xf6, 0x75, 0x29, 0x4d, 0x85, 0xff, 0x75, 0x24, 0x4c, + 0x8d, 0x05, 0x46, 0x1d, 0x00, 0x00, 0xba, 0x4f, 0x02, 0x00, 0x00, 0x48, + 0x8d, 0x0d, 0x02, 0x1e, 0x00, 0x00, 0xe8, 0xc1, 0xfb, 0xff, 0xff, 0x33, + 0xc0, 0xe9, 0xb8, 0x0e, 0x00, 0x00, 0x48, 0x85, 0xf6, 0x74, 0x13, 0x4d, + 0x85, 0xe4, 0x75, 0x0e, 0x4c, 0x8d, 0x05, 0x7d, 0x1e, 0x00, 0x00, 0xba, + 0x57, 0x02, 0x00, 0x00, 0xeb, 0xd5, 0xbb, 0x40, 0x42, 0x0f, 0x00, 0x41, + 0xf6, 0xc6, 0x40, 0x74, 0x1b, 0x48, 0x3b, 0xfb, 0x76, 0x0e, 0x4c, 0x8d, + 0x05, 0x87, 0x1e, 0x00, 0x00, 0xba, 0x60, 0x02, 0x00, 0x00, 0xeb, 0xb7, + 0x41, 0xbd, 0x02, 0x00, 0x00, 0x00, 0xeb, 0x19, 0x48, 0x3b, 0xfb, 0x76, + 0x0e, 0x4c, 0x8d, 0x05, 0xfc, 0x1d, 0x00, 0x00, 0xba, 0x66, 0x02, 0x00, + 0x00, 0xeb, 0x9c, 0x41, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x6d, + 0xf8, 0x49, 0x0f, 0xba, 0xe6, 0x08, 0x73, 0x43, 0x49, 0x8b, 0xcc, 0xe8, + 0xfc, 0xfc, 0xff, 0xff, 0x48, 0x3b, 0xc3, 0x76, 0x18, 0x4c, 0x8d, 0x05, + 0x90, 0x1e, 0x00, 0x00, 0xba, 0x72, 0x02, 0x00, 0x00, 0x48, 0x8d, 0x0d, + 0x74, 0x1d, 0x00, 0x00, 0xe8, 0x33, 0xfb, 0xff, 0xff, 0x49, 0x8b, 0xcc, + 0xe8, 0xd7, 0xfc, 0xff, 0xff, 0x48, 0x3b, 0xc3, 0x0f, 0x87, 0x61, 0xff, + 0xff, 0xff, 0xbb, 0x02, 0x00, 0x00, 0x00, 0x41, 0xb8, 0xff, 0xff, 0x00, + 0x00, 0xeb, 0x66, 0x4d, 0x85, 0xe4, 0x74, 0x56, 0x33, 0xc0, 0x41, 0x38, + 0x01, 0x74, 0x0e, 0x48, 0x3b, 0xc3, 0x73, 0x0e, 0x48, 0xff, 0xc0, 0x41, + 0x38, 0x0c, 0x01, 0x75, 0xf2, 0x48, 0x3b, 0xc3, 0x76, 0x18, 0x4c, 0x8d, + 0x05, 0xcb, 0x1e, 0x00, 0x00, 0xba, 0x79, 0x02, 0x00, 0x00, 0x48, 0x8d, + 0x0d, 0x1f, 0x1d, 0x00, 0x00, 0xe8, 0xde, 0xfa, 0xff, 0xff, 0x33, 0xc0, + 0x41, 0x38, 0x04, 0x24, 0x74, 0x13, 0x48, 0x3b, 0xc3, 0x0f, 0x83, 0x0c, + 0xff, 0xff, 0xff, 0x48, 0xff, 0xc0, 0x42, 0x80, 0x3c, 0x20, 0x00, 0x75, + 0xed, 0x48, 0x3b, 0xc3, 0x0f, 0x87, 0xf9, 0xfe, 0xff, 0xff, 0xbb, 0x01, + 0x00, 0x00, 0x00, 0x41, 0xb8, 0xff, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x45, + 0xe0, 0x48, 0x89, 0x5d, 0xf0, 0x48, 0x85, 0xf6, 0x74, 0x15, 0x48, 0x8b, + 0xc7, 0x48, 0xf7, 0xd8, 0x48, 0x1b, 0xc9, 0x49, 0x23, 0xcf, 0x4c, 0x8b, + 0xf9, 0x48, 0x89, 0x4d, 0x88, 0xeb, 0x09, 0x48, 0x85, 0xff, 0x0f, 0x84, + 0xc3, 0xfe, 0xff, 0xff, 0x33, 0xf6, 0x45, 0x33, 0xdb, 0x48, 0x89, 0x75, + 0xc8, 0x4c, 0x89, 0x5d, 0xb8, 0x48, 0x89, 0x75, 0x00, 0x4d, 0x85, 0xff, + 0x74, 0x13, 0x4c, 0x8d, 0x5f, 0xff, 0x4c, 0x89, 0x7d, 0x00, 0x4d, 0x0f, + 0xaf, 0xdd, 0x4d, 0x03, 0xdf, 0x4c, 0x89, 0x5d, 0xb8, 0x48, 0x83, 0xfb, + 0x01, 0x75, 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, + 0x01, 0xc1, 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, + 0x0b, 0xc8, 0x49, 0x23, 0xc8, 0x48, 0x89, 0x4d, 0xd0, 0x0f, 0x84, 0xcb, + 0x0c, 0x00, 0x00, 0x48, 0x8b, 0xc1, 0x48, 0x8d, 0x3d, 0x1b, 0x1f, 0x00, + 0x00, 0x49, 0x8b, 0xd4, 0x4d, 0x85, 0xff, 0x74, 0x0c, 0x4d, 0x3b, 0xfb, + 0x0f, 0x83, 0xb0, 0x0c, 0x00, 0x00, 0x4d, 0x85, 0xff, 0x48, 0x0f, 0x44, + 0xc1, 0x48, 0xc7, 0x45, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x32, 0xc9, 0x45, + 0x32, 0xdb, 0x45, 0x33, 0xed, 0x89, 0x4d, 0xc0, 0x88, 0x4d, 0x81, 0x41, + 0x81, 0xe6, 0x40, 0x21, 0x00, 0x00, 0x33, 0xc9, 0x44, 0x88, 0x5d, 0x80, + 0x4c, 0x89, 0x6d, 0x98, 0x41, 0xba, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x55, 0xa0, 0x48, 0x89, 0x4d, 0xe8, 0x48, 0x83, 0xf8, 0x0a, 0x0f, 0x84, + 0x76, 0x08, 0x00, 0x00, 0x48, 0x83, 0xf8, 0x0d, 0x0f, 0x84, 0x2a, 0x08, + 0x00, 0x00, 0x48, 0x83, 0xf8, 0x25, 0x74, 0x0e, 0x48, 0x8d, 0x75, 0xd0, + 0x49, 0x0f, 0xba, 0xee, 0x0a, 0xe9, 0xcb, 0x02, 0x00, 0x00, 0x48, 0x8b, + 0x75, 0xb0, 0x4c, 0x8b, 0x7d, 0xa8, 0x48, 0x8b, 0x7d, 0xe0, 0x49, 0x8b, + 0xd4, 0x4c, 0x8b, 0xce, 0x4c, 0x03, 0xe3, 0x4d, 0x8b, 0xd7, 0x4c, 0x89, + 0x65, 0x90, 0x4c, 0x8b, 0xde, 0x4d, 0x8b, 0xc7, 0x48, 0x83, 0xfb, 0x01, + 0x75, 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, + 0xc1, 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, 0x0b, + 0xc8, 0x48, 0x23, 0xcf, 0x48, 0x89, 0x4d, 0xd0, 0x48, 0x83, 0xf9, 0x32, + 0x0f, 0x87, 0x20, 0x01, 0x00, 0x00, 0x74, 0x4c, 0x48, 0x8b, 0xc1, 0x48, + 0x85, 0xc9, 0x0f, 0x84, 0xb5, 0x01, 0x00, 0x00, 0x48, 0x83, 0xe8, 0x20, + 0x0f, 0x84, 0xff, 0x00, 0x00, 0x00, 0x48, 0x83, 0xe8, 0x0a, 0x0f, 0x84, + 0x9d, 0x00, 0x00, 0x00, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0x8a, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xe8, 0x01, 0x74, 0x7b, 0x48, 0x83, 0xe8, 0x01, + 0x74, 0x6c, 0x48, 0x83, 0xe8, 0x01, 0x74, 0x5c, 0x48, 0x83, 0xe8, 0x02, + 0x74, 0x46, 0x48, 0x83, 0xf8, 0x01, 0x0f, 0x85, 0x84, 0x01, 0x00, 0x00, + 0x45, 0x33, 0xed, 0x4c, 0x89, 0x6d, 0x98, 0x48, 0x83, 0xf9, 0x30, 0x0f, + 0x82, 0x43, 0x01, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x39, 0x0f, 0x87, 0x35, + 0x01, 0x00, 0x00, 0x4f, 0x8d, 0x6c, 0xad, 0x00, 0x4c, 0x03, 0xe3, 0x4d, + 0x8d, 0x6d, 0xe8, 0x4e, 0x8d, 0x2c, 0x69, 0x48, 0x83, 0xfb, 0x01, 0x0f, + 0x85, 0xfb, 0x00, 0x00, 0x00, 0x33, 0xc0, 0xe9, 0xfd, 0x00, 0x00, 0x00, + 0x49, 0x0f, 0xba, 0xe6, 0x0b, 0x72, 0xbd, 0x49, 0x83, 0xce, 0x20, 0x45, + 0x33, 0xed, 0xeb, 0xc5, 0x49, 0x0f, 0xba, 0xee, 0x0b, 0xe9, 0x18, 0xff, + 0xff, 0xff, 0x49, 0x83, 0xce, 0x01, 0xe9, 0x0f, 0xff, 0xff, 0xff, 0x49, + 0x83, 0xce, 0x08, 0xe9, 0x06, 0xff, 0xff, 0xff, 0x49, 0x83, 0xce, 0x02, + 0xe9, 0xfd, 0xfe, 0xff, 0xff, 0x49, 0x0f, 0xba, 0xe6, 0x0b, 0x72, 0x2b, + 0x49, 0x0f, 0xba, 0xee, 0x09, 0x48, 0x85, 0xf6, 0x75, 0x0a, 0x49, 0x83, + 0xc7, 0x08, 0x4c, 0x89, 0x7d, 0xa8, 0xeb, 0x0b, 0x48, 0x83, 0xc6, 0x08, + 0x4d, 0x8b, 0xc3, 0x48, 0x89, 0x75, 0xb0, 0x49, 0x8b, 0x00, 0x48, 0x89, + 0x45, 0xd8, 0xe9, 0xcb, 0xfe, 0xff, 0xff, 0x48, 0x85, 0xf6, 0x75, 0x0d, + 0x49, 0x8b, 0x02, 0x49, 0x83, 0xc7, 0x08, 0x4c, 0x89, 0x7d, 0xa8, 0xeb, + 0x0b, 0x49, 0x8b, 0x01, 0x48, 0x83, 0xc6, 0x08, 0x48, 0x89, 0x75, 0xb0, + 0x48, 0x89, 0x45, 0xa0, 0xe9, 0xa5, 0xfe, 0xff, 0xff, 0x49, 0x83, 0xce, + 0x04, 0xe9, 0x9c, 0xfe, 0xff, 0xff, 0x48, 0x8b, 0xc1, 0x48, 0x83, 0xe8, + 0x33, 0x0f, 0x84, 0x21, 0xff, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, + 0x84, 0x17, 0xff, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0x0d, + 0xff, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0x03, 0xff, 0xff, + 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0xf9, 0xfe, 0xff, 0xff, 0x48, + 0x83, 0xe8, 0x01, 0x0f, 0x84, 0xef, 0xfe, 0xff, 0xff, 0x48, 0x83, 0xe8, + 0x01, 0x0f, 0x84, 0xe5, 0xfe, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x13, 0x74, + 0x06, 0x48, 0x83, 0xf8, 0x20, 0x75, 0x5d, 0x49, 0x83, 0xce, 0x10, 0xe9, + 0x3e, 0xfe, 0xff, 0xff, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, 0xe0, + 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, 0x0b, 0xc8, 0x48, + 0x23, 0xcf, 0x48, 0x83, 0xf9, 0x30, 0x0f, 0x83, 0xc1, 0xfe, 0xff, 0xff, + 0x4c, 0x89, 0x6d, 0x98, 0x4c, 0x2b, 0xe3, 0x49, 0x0f, 0xba, 0xe6, 0x0b, + 0x72, 0x0e, 0x49, 0x0f, 0xba, 0xee, 0x09, 0x4c, 0x89, 0x6d, 0xd8, 0xe9, + 0x02, 0xfe, 0xff, 0xff, 0x4c, 0x89, 0x6d, 0xa0, 0xe9, 0xf9, 0xfd, 0xff, + 0xff, 0x33, 0xc0, 0x48, 0x89, 0x55, 0x90, 0x48, 0x89, 0x45, 0xa0, 0x48, + 0x8b, 0xfa, 0xeb, 0x03, 0x49, 0x8b, 0xfc, 0x4c, 0x8b, 0x5d, 0xa8, 0x49, + 0x8b, 0xdf, 0x4d, 0x8b, 0xcb, 0x4d, 0x8b, 0xef, 0x49, 0x8b, 0xd7, 0x48, + 0x83, 0xf9, 0x64, 0x0f, 0x87, 0x81, 0x01, 0x00, 0x00, 0x0f, 0x84, 0x56, + 0x03, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x0a, 0x0f, 0x84, 0x12, 0x01, 0x00, + 0x00, 0x48, 0x83, 0xf9, 0x0d, 0x0f, 0x84, 0xb7, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xf9, 0x25, 0x0f, 0x84, 0x9f, 0x01, 0x00, 0x00, 0x48, 0x83, 0xf9, + 0x53, 0x0f, 0x84, 0x1b, 0x02, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x58, 0x0f, + 0x84, 0x0d, 0x03, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x61, 0x0f, 0x84, 0x0c, + 0x02, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x63, 0x0f, 0x85, 0x77, 0x01, 0x00, + 0x00, 0x48, 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x4c, 0x8b, 0xde, + 0x48, 0x89, 0x4d, 0xb0, 0x41, 0x0f, 0xb7, 0x03, 0x48, 0x8d, 0x75, 0x08, + 0x48, 0x89, 0x45, 0x08, 0x49, 0x0f, 0xba, 0xee, 0x0a, 0x4c, 0x8b, 0x65, + 0x90, 0x4c, 0x8b, 0x6d, 0x98, 0x44, 0x8a, 0x5d, 0x80, 0x4c, 0x8b, 0x55, + 0xa0, 0x4c, 0x8b, 0x7d, 0x88, 0x4d, 0x8b, 0xce, 0x41, 0x81, 0xe1, 0x00, + 0x04, 0x00, 0x00, 0x41, 0x8b, 0xc1, 0x48, 0xf7, 0xd8, 0x41, 0x8b, 0xc1, + 0x48, 0x1b, 0xd2, 0x48, 0xf7, 0xda, 0x48, 0xff, 0xc2, 0x48, 0xf7, 0xd8, + 0x48, 0x1b, 0xff, 0x81, 0xe7, 0x00, 0xff, 0x00, 0x00, 0x48, 0x81, 0xc7, + 0xff, 0x00, 0x00, 0x00, 0x49, 0x0f, 0xba, 0xe6, 0x0c, 0x0f, 0x83, 0x9e, + 0x05, 0x00, 0x00, 0x48, 0xf7, 0xda, 0x48, 0x8b, 0xda, 0xe9, 0xe4, 0x05, + 0x00, 0x00, 0x4c, 0x8b, 0x65, 0x90, 0x4c, 0x03, 0x65, 0xf0, 0x48, 0x83, + 0x7d, 0xf0, 0x01, 0x75, 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, + 0x44, 0x24, 0x01, 0xc1, 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, + 0x8d, 0x35, 0x6a, 0x1b, 0x00, 0x00, 0x48, 0x98, 0x48, 0x0b, 0xc8, 0x48, + 0x8d, 0x05, 0x62, 0x1b, 0x00, 0x00, 0x48, 0x23, 0x4d, 0xe0, 0x48, 0x83, + 0xf9, 0x0a, 0x48, 0x89, 0x4d, 0xd0, 0x4c, 0x0f, 0x45, 0xe7, 0x48, 0x0f, + 0x45, 0xf0, 0x4c, 0x89, 0x65, 0x90, 0xe9, 0x5a, 0xff, 0xff, 0xff, 0x4c, + 0x8b, 0x65, 0x90, 0x48, 0x8d, 0x35, 0x36, 0x1b, 0x00, 0x00, 0x4c, 0x03, + 0x65, 0xf0, 0x48, 0x83, 0x7d, 0xf0, 0x01, 0x4c, 0x89, 0x65, 0x90, 0x75, + 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, + 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x4c, 0x8b, 0x7d, 0x88, 0x4c, + 0x8b, 0x6d, 0x98, 0x44, 0x8a, 0x5d, 0x80, 0x4c, 0x8b, 0x55, 0xa0, 0x48, + 0x98, 0x48, 0x0b, 0xc8, 0x48, 0x23, 0x4d, 0xe0, 0x48, 0x89, 0x4d, 0xd0, + 0x48, 0x83, 0xf9, 0x0d, 0x0f, 0x84, 0x17, 0xff, 0xff, 0xff, 0x4c, 0x8b, + 0xe7, 0x48, 0x89, 0x7d, 0x90, 0xe9, 0x0b, 0xff, 0xff, 0xff, 0x48, 0x83, + 0xe9, 0x67, 0x0f, 0x84, 0x65, 0x03, 0x00, 0x00, 0x48, 0x83, 0xe9, 0x09, + 0x0f, 0x84, 0xa8, 0x01, 0x00, 0x00, 0x48, 0x83, 0xe9, 0x02, 0x0f, 0x84, + 0x00, 0x01, 0x00, 0x00, 0x48, 0x83, 0xe9, 0x01, 0x0f, 0x84, 0xa0, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xe9, 0x01, 0x74, 0x1d, 0x48, 0x83, 0xe9, 0x01, + 0x0f, 0x84, 0x95, 0x01, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x03, 0x0f, 0x84, + 0x86, 0x01, 0x00, 0x00, 0x48, 0x8d, 0x75, 0xd0, 0xe9, 0xa7, 0xfe, 0xff, + 0xff, 0x48, 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x4c, 0x8b, 0xce, + 0x48, 0x89, 0x4d, 0xb0, 0x4d, 0x8b, 0x09, 0x4d, 0x85, 0xc9, 0x75, 0x0c, + 0x48, 0x8d, 0x35, 0x39, 0x1a, 0x00, 0x00, 0xe9, 0x7d, 0xfe, 0xff, 0xff, + 0x41, 0x0f, 0xb6, 0x49, 0x04, 0x41, 0x0f, 0xb7, 0x11, 0x45, 0x0f, 0xb6, + 0x41, 0x03, 0x41, 0x0f, 0xb6, 0x41, 0x05, 0x45, 0x0f, 0xb6, 0x49, 0x02, + 0x89, 0x44, 0x24, 0x40, 0x89, 0x4c, 0x24, 0x38, 0x48, 0x8d, 0x4d, 0x28, + 0x89, 0x54, 0x24, 0x30, 0x44, 0x89, 0x44, 0x24, 0x28, 0x45, 0x33, 0xc0, + 0x44, 0x89, 0x4c, 0x24, 0x20, 0x4c, 0x8d, 0x0d, 0x08, 0x1a, 0x00, 0x00, + 0x41, 0x8d, 0x50, 0x26, 0xe8, 0x5b, 0x08, 0x00, 0x00, 0x48, 0x8d, 0x75, + 0x28, 0xe9, 0x2f, 0xfe, 0xff, 0xff, 0x49, 0x0f, 0xba, 0xee, 0x0a, 0x48, + 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, 0x45, 0xa8, + 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x4c, 0x8b, 0xfe, 0x48, 0x89, + 0x4d, 0xb0, 0x49, 0x8b, 0x37, 0x48, 0x85, 0xf6, 0x75, 0x0c, 0x49, 0x0f, + 0xba, 0xf6, 0x0a, 0x48, 0x8d, 0x35, 0x5a, 0x19, 0x00, 0x00, 0x4c, 0x8b, + 0x7d, 0x88, 0x4c, 0x8b, 0x65, 0x90, 0x4c, 0x8b, 0x6d, 0x98, 0x49, 0x0f, + 0xba, 0xe6, 0x0b, 0x0f, 0x82, 0xc3, 0x03, 0x00, 0x00, 0x45, 0x33, 0xd2, + 0x45, 0x8a, 0xda, 0xe9, 0xed, 0xfd, 0xff, 0xff, 0x48, 0x8b, 0x4d, 0xb0, + 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, 0x45, 0xa8, 0x08, 0xeb, 0x0b, + 0x48, 0x83, 0xc1, 0x08, 0x48, 0x8b, 0xd6, 0x48, 0x89, 0x4d, 0xb0, 0x48, + 0x8b, 0x0a, 0x48, 0x8d, 0x75, 0x28, 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc8, 0x72, 0x2b, 0x48, 0xb8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x48, 0x8b, 0xd1, 0x48, 0x23, + 0xd0, 0x48, 0x8d, 0x42, 0xff, 0x48, 0x83, 0xf8, 0x22, 0x77, 0x32, 0x48, + 0x6b, 0xc2, 0x15, 0x48, 0x8d, 0x35, 0x4a, 0x1a, 0x00, 0x00, 0x48, 0x83, + 0xc6, 0xeb, 0xeb, 0x11, 0x48, 0x83, 0xf9, 0x07, 0x77, 0x1b, 0x48, 0x6b, + 0xf1, 0x19, 0x48, 0x8d, 0x05, 0x63, 0x19, 0x00, 0x00, 0x48, 0x03, 0xf0, + 0x48, 0x8d, 0x45, 0x28, 0x48, 0x3b, 0xf0, 0x0f, 0x85, 0x5c, 0xfd, 0xff, + 0xff, 0x45, 0x33, 0xc0, 0x48, 0x89, 0x4c, 0x24, 0x20, 0x4c, 0x8d, 0x0d, + 0x30, 0x19, 0x00, 0x00, 0x48, 0x8d, 0x4d, 0x28, 0x41, 0x8d, 0x50, 0x26, + 0xe8, 0x63, 0x07, 0x00, 0x00, 0xe9, 0x3b, 0xfd, 0xff, 0xff, 0x49, 0x83, + 0xe6, 0xd9, 0x49, 0x83, 0xce, 0x10, 0x49, 0x83, 0xce, 0x20, 0x49, 0x0f, + 0xba, 0xee, 0x07, 0x45, 0x84, 0xf6, 0x78, 0x09, 0x49, 0x83, 0xe6, 0xfd, + 0x49, 0x0f, 0xba, 0xee, 0x0e, 0x48, 0x8b, 0x45, 0xb0, 0x49, 0x8b, 0xce, + 0x83, 0xe1, 0x10, 0x75, 0x1d, 0x48, 0x85, 0xc0, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc0, 0x08, 0x4c, 0x8b, 0xee, + 0x48, 0x89, 0x45, 0xb0, 0x49, 0x63, 0x5d, 0x00, 0xeb, 0x1a, 0x48, 0x85, + 0xc0, 0x75, 0x0a, 0x48, 0x83, 0x45, 0xa8, 0x08, 0x49, 0x8b, 0x1f, 0xeb, + 0x0b, 0x48, 0x8b, 0x1e, 0x48, 0x83, 0xc0, 0x08, 0x48, 0x89, 0x45, 0xb0, + 0x41, 0x8a, 0xc6, 0xc0, 0xe0, 0x03, 0x24, 0x20, 0x0f, 0xb6, 0xf8, 0x41, + 0xf6, 0xc6, 0x02, 0xb8, 0x2b, 0x00, 0x00, 0x00, 0x0f, 0x45, 0xf8, 0x49, + 0x8b, 0xc6, 0x83, 0xe0, 0x08, 0x89, 0x7d, 0xc0, 0x41, 0x0f, 0x95, 0xc7, + 0x44, 0x88, 0x7d, 0x81, 0x45, 0x84, 0xf6, 0x78, 0x45, 0x41, 0xb8, 0x0a, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x0c, 0x49, 0x83, 0xe6, 0xdf, + 0x48, 0xc7, 0x45, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x49, 0x8b, 0xc6, 0x25, + 0x00, 0x40, 0x00, 0x00, 0x48, 0x85, 0xdb, 0x79, 0x14, 0x48, 0x85, 0xc0, + 0x75, 0x14, 0x49, 0x83, 0xce, 0x02, 0x40, 0xb7, 0x2d, 0x89, 0x7d, 0xc0, + 0x48, 0xf7, 0xdb, 0xeb, 0x26, 0x48, 0x85, 0xc0, 0x74, 0x21, 0x41, 0xf6, + 0xc6, 0x10, 0x75, 0x1b, 0xeb, 0x17, 0x45, 0x32, 0xff, 0x41, 0xb8, 0x10, + 0x00, 0x00, 0x00, 0x44, 0x88, 0x7d, 0x81, 0x48, 0x85, 0xc9, 0x75, 0x07, + 0x48, 0x85, 0xdb, 0x79, 0x02, 0x8b, 0xdb, 0x48, 0x8b, 0xd3, 0x48, 0x8d, + 0x4d, 0x28, 0xe8, 0x91, 0xf6, 0xff, 0xff, 0x4c, 0x8b, 0x55, 0xa0, 0x48, + 0x8b, 0xf0, 0x4c, 0x8b, 0xc6, 0x48, 0x8d, 0x45, 0x28, 0x4c, 0x2b, 0xc0, + 0x48, 0x85, 0xdb, 0x75, 0x1e, 0x4d, 0x85, 0xd2, 0x75, 0x19, 0x45, 0x33, + 0xc0, 0x48, 0x8d, 0x75, 0x28, 0x33, 0xc9, 0x49, 0xb9, 0xab, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x48, 0x89, 0x4d, 0xe8, 0xeb, 0x31, 0x49, + 0xb9, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x49, 0x8b, 0xd8, + 0x49, 0x8b, 0xc1, 0x49, 0xf7, 0xe0, 0x48, 0xd1, 0xea, 0x48, 0x8d, 0x04, + 0x52, 0x48, 0x2b, 0xd8, 0x48, 0x89, 0x5d, 0xe8, 0x74, 0x0e, 0x48, 0x8b, + 0xd8, 0x49, 0x2b, 0xd8, 0x48, 0x83, 0xc3, 0x03, 0x48, 0x89, 0x5d, 0xe8, + 0x45, 0x84, 0xff, 0x74, 0x15, 0x4d, 0x85, 0xc0, 0x74, 0x10, 0x49, 0x8d, + 0x48, 0xff, 0x49, 0x8b, 0xc1, 0x48, 0xf7, 0xe1, 0x48, 0xd1, 0xea, 0x4c, + 0x03, 0xc2, 0x40, 0x84, 0xff, 0x74, 0x03, 0x49, 0xff, 0xc2, 0x4c, 0x8b, + 0x65, 0x90, 0x4d, 0x8d, 0x68, 0x01, 0x40, 0x84, 0xff, 0x41, 0xb3, 0x01, + 0x4d, 0x0f, 0x44, 0xe8, 0x49, 0x0f, 0xba, 0xee, 0x0c, 0x49, 0x8b, 0xc6, + 0x4c, 0x89, 0x6d, 0x98, 0x25, 0x21, 0x0a, 0x00, 0x00, 0x48, 0x3d, 0x20, + 0x02, 0x00, 0x00, 0x4c, 0x0f, 0x44, 0x55, 0xd8, 0xe9, 0x98, 0xfb, 0xff, + 0xff, 0x48, 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x48, 0x8b, 0xde, + 0x48, 0x89, 0x4d, 0xb0, 0x48, 0x8b, 0x1b, 0x48, 0x85, 0xdb, 0x75, 0x0c, + 0x48, 0x8d, 0x35, 0xcd, 0x16, 0x00, 0x00, 0xe9, 0x59, 0xfb, 0xff, 0xff, + 0x44, 0x8b, 0x3b, 0x48, 0x8d, 0x7b, 0x04, 0x48, 0x85, 0xff, 0x75, 0x16, + 0x4c, 0x8d, 0x05, 0x75, 0x11, 0x00, 0x00, 0x8d, 0x57, 0x1e, 0x48, 0x8d, + 0x0d, 0x3b, 0x13, 0x00, 0x00, 0xe8, 0x32, 0xf2, 0xff, 0xff, 0x0f, 0xb7, + 0x37, 0x48, 0x8d, 0x7b, 0x06, 0x48, 0x85, 0xff, 0x75, 0x16, 0x4c, 0x8d, + 0x05, 0x53, 0x11, 0x00, 0x00, 0x8d, 0x57, 0x1e, 0x48, 0x8d, 0x0d, 0x19, + 0x13, 0x00, 0x00, 0xe8, 0x10, 0xf2, 0xff, 0xff, 0x0f, 0xb6, 0x4b, 0x0e, + 0x0f, 0xb6, 0x53, 0x0d, 0x44, 0x0f, 0xb6, 0x43, 0x0c, 0x44, 0x0f, 0xb6, + 0x4b, 0x0b, 0x0f, 0xb6, 0x43, 0x0f, 0x44, 0x0f, 0xb6, 0x53, 0x0a, 0x44, + 0x0f, 0xb6, 0x5b, 0x09, 0x0f, 0xb6, 0x5b, 0x08, 0x0f, 0xb7, 0x3f, 0x89, + 0x44, 0x24, 0x70, 0x89, 0x4c, 0x24, 0x68, 0x48, 0x8d, 0x4d, 0x28, 0x89, + 0x54, 0x24, 0x60, 0x44, 0x89, 0x44, 0x24, 0x58, 0x45, 0x33, 0xc0, 0x44, + 0x89, 0x4c, 0x24, 0x50, 0x4c, 0x8d, 0x0d, 0x49, 0x16, 0x00, 0x00, 0x44, + 0x89, 0x54, 0x24, 0x48, 0x44, 0x89, 0x5c, 0x24, 0x40, 0x89, 0x5c, 0x24, + 0x38, 0x41, 0x8d, 0x50, 0x26, 0x89, 0x7c, 0x24, 0x30, 0x89, 0x74, 0x24, + 0x28, 0x44, 0x89, 0x7c, 0x24, 0x20, 0xe8, 0xc9, 0x04, 0x00, 0x00, 0xe9, + 0x69, 0xfc, 0xff, 0xff, 0x4c, 0x03, 0xe3, 0x49, 0x3b, 0xda, 0x75, 0x04, + 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, 0xe0, + 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x8d, 0x35, 0x6b, 0x16, 0x00, + 0x00, 0x48, 0x98, 0x48, 0x0b, 0xc8, 0x49, 0x23, 0xc8, 0x48, 0x83, 0xf9, + 0x0a, 0x48, 0x89, 0x4d, 0xd0, 0x4c, 0x0f, 0x45, 0xe2, 0x48, 0x0f, 0x45, + 0xf7, 0x4c, 0x89, 0x65, 0x90, 0xe9, 0x73, 0xfa, 0xff, 0xff, 0x4c, 0x03, + 0xe3, 0x48, 0x8d, 0x35, 0x40, 0x16, 0x00, 0x00, 0x49, 0x3b, 0xda, 0x75, + 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, + 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, 0x0b, 0xc8, + 0x49, 0x23, 0xc8, 0x48, 0x83, 0xf9, 0x0d, 0x48, 0x89, 0x4d, 0xd0, 0x4c, + 0x0f, 0x45, 0xe2, 0x4c, 0x89, 0x65, 0x90, 0xe9, 0x35, 0xfa, 0xff, 0xff, + 0x44, 0x8a, 0x5d, 0x80, 0x4c, 0x8b, 0x55, 0xa0, 0xe9, 0x28, 0xfa, 0xff, + 0xff, 0x45, 0x33, 0xed, 0x4c, 0x8d, 0x46, 0x01, 0x41, 0x80, 0x78, 0xff, + 0x00, 0x75, 0x0e, 0x48, 0x8b, 0xda, 0x4d, 0x85, 0xc9, 0x74, 0x37, 0x41, + 0x80, 0x38, 0x00, 0x74, 0x31, 0x4d, 0x3b, 0xea, 0x72, 0x0a, 0x48, 0x8b, + 0xda, 0x49, 0x0f, 0xba, 0xe6, 0x0b, 0x72, 0x22, 0x41, 0x0f, 0xbe, 0x00, + 0x48, 0x8b, 0xda, 0xc1, 0xe0, 0x08, 0x48, 0x63, 0xc8, 0x41, 0x0f, 0xb6, + 0x40, 0xff, 0x48, 0x0b, 0xc8, 0x48, 0x85, 0xcf, 0x74, 0x08, 0x49, 0xff, + 0xc5, 0x4c, 0x03, 0xc2, 0xeb, 0xba, 0x4c, 0x89, 0x6d, 0x98, 0x4c, 0x8b, + 0x4d, 0xc8, 0x4d, 0x3b, 0xd5, 0x49, 0x8b, 0xc6, 0x4d, 0x0f, 0x42, 0xd5, + 0x4c, 0x8b, 0x6d, 0xf8, 0x25, 0x01, 0x02, 0x00, 0x00, 0x4c, 0x89, 0x55, + 0xa0, 0x48, 0x3d, 0x00, 0x02, 0x00, 0x00, 0x75, 0x49, 0x4c, 0x8b, 0x45, + 0xd8, 0x4d, 0x2b, 0xc2, 0x49, 0x8b, 0xc0, 0x49, 0x0f, 0xaf, 0xc5, 0x4c, + 0x03, 0xc8, 0x4c, 0x89, 0x4d, 0xc8, 0x49, 0x0f, 0xba, 0xe6, 0x0d, 0x72, + 0x2d, 0x48, 0x8b, 0x55, 0xb8, 0x4d, 0x85, 0xff, 0x74, 0x28, 0x41, 0xb9, + 0x20, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xcf, + 0xe8, 0x83, 0xf3, 0xff, 0xff, 0x4c, 0x8b, 0x55, 0xa0, 0x4c, 0x8b, 0xf8, + 0x4c, 0x8b, 0x4d, 0xc8, 0x48, 0x89, 0x45, 0x88, 0xeb, 0x04, 0x48, 0x8b, + 0x55, 0xb8, 0x45, 0x84, 0xdb, 0x0f, 0x84, 0x93, 0x01, 0x00, 0x00, 0x8b, + 0x45, 0xc0, 0x84, 0xc0, 0x74, 0x46, 0x4d, 0x03, 0xcd, 0x49, 0x0f, 0xba, + 0xe6, 0x0d, 0x72, 0x3c, 0x4c, 0x8b, 0x5d, 0xb8, 0x4d, 0x85, 0xff, 0x74, + 0x37, 0x0f, 0xb6, 0xd0, 0x33, 0xc9, 0x4d, 0x3b, 0xfb, 0x73, 0x23, 0x41, + 0x88, 0x07, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x0e, 0x48, 0x8b, 0xc2, 0x48, + 0xc1, 0xe8, 0x08, 0x41, 0x88, 0x47, 0x01, 0x8b, 0x45, 0xc0, 0x4d, 0x03, + 0xfd, 0x48, 0xff, 0xc1, 0x48, 0x83, 0xf9, 0x01, 0x7c, 0xd8, 0x4c, 0x89, + 0x7d, 0x88, 0xeb, 0x04, 0x4c, 0x8b, 0x5d, 0xb8, 0x4d, 0x8b, 0xc2, 0x4c, + 0x2b, 0x45, 0x98, 0x49, 0x8b, 0xc0, 0x49, 0x0f, 0xaf, 0xc5, 0x4c, 0x03, + 0xc8, 0x4c, 0x89, 0x4d, 0xc8, 0x49, 0x0f, 0xba, 0xe6, 0x0d, 0x72, 0x22, + 0x4d, 0x85, 0xff, 0x74, 0x1d, 0x41, 0xb9, 0x30, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xd3, 0x49, 0x8b, 0xcf, 0xe8, 0xdd, + 0xf2, 0xff, 0xff, 0x4c, 0x8b, 0xf8, 0x48, 0x89, 0x45, 0x88, 0x4c, 0x8b, + 0x5d, 0xb8, 0x45, 0x33, 0xc0, 0x44, 0x38, 0x45, 0xc0, 0x41, 0x0f, 0x95, + 0xc0, 0x4c, 0x3b, 0x45, 0x98, 0x0f, 0x83, 0x9c, 0x01, 0x00, 0x00, 0x4c, + 0x8b, 0x55, 0x98, 0x4d, 0x8b, 0xce, 0x4c, 0x8b, 0x65, 0xe8, 0x41, 0x81, + 0xe1, 0x00, 0x20, 0x00, 0x00, 0x80, 0x3e, 0x00, 0x75, 0x14, 0x48, 0x83, + 0xfb, 0x01, 0x0f, 0x8e, 0x73, 0x01, 0x00, 0x00, 0x80, 0x7e, 0x01, 0x00, + 0x0f, 0x84, 0x69, 0x01, 0x00, 0x00, 0x0f, 0xb6, 0x06, 0x0f, 0xb6, 0x4e, + 0x01, 0x48, 0xc1, 0xe1, 0x08, 0x48, 0x0b, 0xc8, 0x48, 0x8b, 0x45, 0xc8, + 0x49, 0x03, 0xc5, 0x48, 0x23, 0xcf, 0x48, 0x89, 0x45, 0xc8, 0x4d, 0x85, + 0xc9, 0x75, 0x30, 0x4d, 0x85, 0xff, 0x74, 0x2b, 0x33, 0xd2, 0x4d, 0x3b, + 0xfb, 0x73, 0x20, 0x41, 0x88, 0x0f, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x0b, + 0x48, 0x8b, 0xc1, 0x48, 0xc1, 0xe8, 0x08, 0x41, 0x88, 0x47, 0x01, 0x4d, + 0x03, 0xfd, 0x48, 0xff, 0xc2, 0x48, 0x83, 0xfa, 0x01, 0x7c, 0xdb, 0x48, + 0x8b, 0x45, 0xc8, 0x48, 0x03, 0xf3, 0x49, 0xff, 0xc0, 0x80, 0x7d, 0x81, + 0x00, 0x0f, 0x84, 0xff, 0x00, 0x00, 0x00, 0x49, 0xff, 0xc4, 0x49, 0x83, + 0xfc, 0x03, 0x0f, 0x85, 0xf2, 0x00, 0x00, 0x00, 0x45, 0x33, 0xe4, 0x49, + 0xff, 0xc0, 0x4d, 0x3b, 0xc2, 0x0f, 0x83, 0xec, 0x00, 0x00, 0x00, 0x49, + 0x03, 0xc5, 0x48, 0x89, 0x45, 0xc8, 0x4d, 0x85, 0xc9, 0x0f, 0x85, 0x5a, + 0xff, 0xff, 0xff, 0x4d, 0x85, 0xff, 0x0f, 0x84, 0x51, 0xff, 0xff, 0xff, + 0x33, 0xc0, 0x4d, 0x3b, 0xfb, 0x0f, 0x83, 0x46, 0xff, 0xff, 0xff, 0x41, + 0xc6, 0x07, 0x2c, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x04, 0x45, 0x88, 0x67, + 0x01, 0x4d, 0x03, 0xfd, 0x48, 0xff, 0xc0, 0x48, 0x83, 0xf8, 0x01, 0x7c, + 0xdd, 0xe9, 0x27, 0xff, 0xff, 0xff, 0x4d, 0x8b, 0xc2, 0x4d, 0x8b, 0xde, + 0x4c, 0x2b, 0x45, 0x98, 0x49, 0x8b, 0xc0, 0x49, 0x0f, 0xaf, 0xc5, 0x4c, + 0x03, 0xc8, 0x4c, 0x89, 0x4d, 0xc8, 0x41, 0x81, 0xe3, 0x00, 0x20, 0x00, + 0x00, 0x75, 0x21, 0x4d, 0x85, 0xff, 0x74, 0x1c, 0x45, 0x8d, 0x4b, 0x20, + 0x4c, 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xcf, 0xe8, 0x9b, 0xf1, 0xff, + 0xff, 0x4c, 0x8b, 0x4d, 0xc8, 0x4c, 0x8b, 0xf8, 0x48, 0x89, 0x45, 0x88, + 0x8b, 0x45, 0xc0, 0x84, 0xc0, 0x0f, 0x84, 0xaf, 0xfe, 0xff, 0xff, 0x4d, + 0x03, 0xcd, 0x4c, 0x89, 0x4d, 0xc8, 0x4d, 0x85, 0xdb, 0x0f, 0x85, 0x9f, + 0xfe, 0xff, 0xff, 0x4c, 0x8b, 0x5d, 0xb8, 0x4d, 0x85, 0xff, 0x0f, 0x84, + 0x96, 0xfe, 0xff, 0xff, 0x0f, 0xb6, 0xd0, 0x33, 0xc9, 0x4d, 0x3b, 0xfb, + 0x73, 0x23, 0x41, 0x88, 0x07, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x0e, 0x48, + 0x8b, 0xc2, 0x48, 0xc1, 0xe8, 0x08, 0x41, 0x88, 0x47, 0x01, 0x8b, 0x45, + 0xc0, 0x4d, 0x03, 0xfd, 0x48, 0xff, 0xc1, 0x48, 0x83, 0xf9, 0x01, 0x7c, + 0xd8, 0x4c, 0x89, 0x7d, 0x88, 0xe9, 0x60, 0xfe, 0xff, 0xff, 0x4d, 0x3b, + 0xc2, 0x0f, 0x82, 0x7e, 0xfe, 0xff, 0xff, 0x4c, 0x8b, 0x65, 0x90, 0x4c, + 0x89, 0x7d, 0x88, 0x48, 0x8b, 0x75, 0xc8, 0x41, 0xb9, 0x01, 0x02, 0x00, + 0x00, 0x49, 0x8b, 0xc6, 0x49, 0x23, 0xc1, 0x49, 0x3b, 0xc1, 0x75, 0x42, + 0x48, 0x8b, 0x4d, 0xd8, 0x48, 0x2b, 0x4d, 0xa0, 0x48, 0x8b, 0xc1, 0x49, + 0x0f, 0xaf, 0xc5, 0x48, 0x03, 0xf0, 0x48, 0x89, 0x75, 0xc8, 0x49, 0x0f, + 0xba, 0xe6, 0x0d, 0x72, 0x25, 0x4d, 0x85, 0xff, 0x74, 0x20, 0x4c, 0x8b, + 0xc1, 0x4c, 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xcf, 0x41, 0xb9, 0x20, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0xd3, 0xe8, 0xd1, 0xf0, 0xff, 0xff, 0x4c, + 0x8b, 0xf8, 0x48, 0x89, 0x45, 0x88, 0x48, 0x8b, 0x5d, 0xf0, 0x4c, 0x03, + 0xe3, 0x4c, 0x89, 0x65, 0x90, 0x48, 0x83, 0xfb, 0x01, 0x75, 0x04, 0x33, + 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, 0xe0, 0x08, + 0x4c, 0x8b, 0x45, 0xe0, 0x48, 0x8d, 0x3d, 0x75, 0x12, 0x00, 0x00, 0x48, + 0x63, 0xc8, 0x41, 0x0f, 0xb6, 0x04, 0x24, 0x48, 0x0b, 0xc8, 0x49, 0x23, + 0xc8, 0x48, 0x89, 0x4d, 0xd0, 0x48, 0x8b, 0xc1, 0x0f, 0x85, 0x3f, 0xf3, + 0xff, 0xff, 0x49, 0x0f, 0xba, 0xe6, 0x0d, 0x73, 0x0a, 0x33, 0xd2, 0x48, + 0x8b, 0xc6, 0x49, 0xf7, 0xf5, 0xeb, 0x53, 0x4d, 0x85, 0xff, 0x75, 0x18, + 0x4c, 0x8d, 0x05, 0x7d, 0x0c, 0x00, 0x00, 0xba, 0x00, 0x05, 0x00, 0x00, + 0x48, 0x8d, 0x0d, 0x79, 0x0f, 0x00, 0x00, 0xe8, 0x38, 0xed, 0xff, 0xff, + 0x48, 0x8b, 0x55, 0xb8, 0x33, 0xc9, 0x49, 0x03, 0xd5, 0x49, 0x8b, 0xc7, + 0x48, 0x3b, 0xc2, 0x73, 0x19, 0xc6, 0x00, 0x00, 0x49, 0x83, 0xfd, 0x01, + 0x74, 0x04, 0xc6, 0x40, 0x01, 0x00, 0x49, 0x03, 0xc5, 0x48, 0xff, 0xc1, + 0x48, 0x83, 0xf9, 0x01, 0x7c, 0xe2, 0x4c, 0x2b, 0x7d, 0x00, 0x49, 0x8b, + 0xc7, 0x48, 0x99, 0x49, 0xf7, 0xfd, 0x48, 0x8b, 0x4d, 0x50, 0x48, 0x33, + 0xcc, 0xe8, 0x24, 0xeb, 0xff, 0xff, 0x48, 0x8b, 0x9c, 0x24, 0xb0, 0x01, + 0x00, 0x00, 0x48, 0x81, 0xc4, 0x60, 0x01, 0x00, 0x00, 0x41, 0x5f, 0x41, + 0x5e, 0x41, 0x5d, 0x41, 0x5c, 0x5f, 0x5e, 0x5d, 0xc3, 0xcc, 0xcc, 0xcc, + 0x4c, 0x8b, 0xdc, 0x4d, 0x89, 0x4b, 0x20, 0x48, 0x83, 0xec, 0x38, 0x49, + 0x8d, 0x43, 0x28, 0x49, 0xc7, 0x43, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x43, 0xe8, 0xe8, 0x78, 0xf0, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x38, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x54, 0x24, 0x10, 0x48, 0x83, 0xec, + 0x28, 0x48, 0x8b, 0x05, 0x24, 0x16, 0x00, 0x00, 0x4c, 0x8d, 0x44, 0x24, + 0x38, 0xba, 0x82, 0x02, 0x00, 0x00, 0xb9, 0x04, 0x00, 0x00, 0x00, 0x4c, + 0x8b, 0x48, 0x40, 0x41, 0xff, 0xd1, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc1, 0x72, 0x04, 0x33, 0xc0, 0xeb, + 0x05, 0x48, 0x8b, 0x44, 0x24, 0x38, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0xcc, + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x05, 0xe5, 0x15, 0x00, 0x00, 0x48, + 0x8b, 0x50, 0x48, 0xff, 0xd2, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc1, 0x72, 0x2c, 0x4c, 0x8b, 0xc0, 0x48, + 0x8d, 0x15, 0x7e, 0x0a, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x80, 0xe8, + 0x60, 0xeb, 0xff, 0xff, 0x4c, 0x8d, 0x05, 0x95, 0x0a, 0x00, 0x00, 0xba, + 0x35, 0x03, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0xe1, 0x14, 0x00, 0x00, 0xe8, + 0x20, 0xec, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x65, 0x6c, 0x6c, + 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x5f, 0x45, 0x46, 0x49, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x28, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x20, 0x3d, 0x20, 0x25, 0x72, 0x29, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0x28, 0x28, 0x52, 0x45, 0x54, 0x55, + 0x52, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x29, 0x28, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, + 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x55, 0x4c, 0x4c, 0x29, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, 0x20, 0x00, 0x48, 0x00, + 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x57, 0x00, + 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x21, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x21, + 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, + 0x30, 0x29, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, + 0x69, 0x62, 0x53, 0x74, 0x64, 0x45, 0x72, 0x72, 0x5c, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x41, 0x53, 0x53, 0x45, + 0x52, 0x54, 0x20, 0x5b, 0x25, 0x61, 0x5d, 0x20, 0x25, 0x61, 0x28, 0x25, + 0x64, 0x29, 0x3a, 0x20, 0x25, 0x61, 0x0a, 0x00, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x67, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x21, 0x3d, 0x20, + 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, + 0x69, 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, 0x6f, 0x6f, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x67, 0x42, 0x53, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x52, 0x54, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, + 0x66, 0x69, 0x4c, 0x69, 0x62, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x63, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x55, 0x49, + 0x4e, 0x54, 0x4e, 0x29, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x21, 0x3d, 0x20, 0x28, + 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, + 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x53, 0x61, 0x66, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x69, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, + 0x21, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, + 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x5c, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, + 0x29, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, + 0x69, 0x62, 0x5c, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x20, + 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, + 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, + 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x21, 0x3d, 0x20, 0x28, + 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, + 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x53, 0x74, 0x72, 0x6e, 0x4c, 0x65, 0x6e, 0x53, 0x20, 0x28, 0x28, + 0x43, 0x48, 0x41, 0x52, 0x31, 0x36, 0x20, 0x2a, 0x29, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x55, + 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x55, 0x6e, + 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x6e, 0x4c, 0x65, + 0x6e, 0x53, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, + 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, + 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, + 0x6c, 0x20, 0x67, 0x75, 0x69, 0x64, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x30, 0x38, 0x78, 0x2d, 0x25, 0x30, 0x34, 0x78, 0x2d, 0x25, 0x30, + 0x34, 0x78, 0x2d, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x2d, + 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, + 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x30, 0x32, 0x64, 0x2f, 0x25, 0x30, 0x32, 0x64, 0x2f, 0x25, 0x30, + 0x34, 0x64, 0x20, 0x20, 0x25, 0x30, 0x32, 0x64, 0x3a, 0x25, 0x30, 0x32, + 0x64, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x0d, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x47, 0x6c, 0x79, 0x70, 0x68, 0x00, 0x00, + 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x53, + 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x20, 0x44, 0x61, 0x74, 0x61, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x52, 0x65, 0x73, 0x65, 0x74, 0x20, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x61, 0x64, 0x20, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x54, + 0x6f, 0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x52, 0x65, 0x61, 0x64, 0x79, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x46, 0x75, 0x6c, 0x6c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x4d, 0x65, + 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x44, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, + 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x6c, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x43, 0x4d, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x46, + 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, + 0x69, 0x62, 0x6c, 0x65, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x00, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x56, 0x69, + 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x43, 0x52, + 0x43, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x6e, 0x64, 0x20, 0x6f, + 0x66, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x20, 0x28, 0x32, 0x39, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x28, 0x33, + 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x6e, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x6f, 0x6d, 0x69, + 0x73, 0x65, 0x64, 0x20, 0x44, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x00, 0x00, 0x48, 0x54, + 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, + 0x66, 0x69, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x5c, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x62, 0x5c, 0x44, 0x69, 0x76, 0x55, 0x36, 0x34, 0x78, 0x33, 0x32, 0x52, + 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x63, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x80, 0x18, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x09, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, + 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x48, 0x00, 0x49, 0x00, 0x49, 0x00, 0x6e, 0x93, 0x87, 0x69, + 0x34, 0xed, 0xdb, 0x44, 0xae, 0x97, 0x1f, 0xa5, 0xe4, 0xed, 0x21, 0x16, + 0x1d, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x04, 0x34, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x00, 0x14, 0x45, 0x00, 0x6e, + 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x00, + 0x00, 0x14, 0x2e, 0x00, 0x54, 0x00, 0x48, 0x00, 0x20, 0x00, 0x48, 0x00, + 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x57, 0x00, 0x6f, 0x00, + 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x30, 0x00, 0x20, 0x00, + 0x22, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6c, 0x00, + 0x61, 0x00, 0x79, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, + 0x22, 0x00, 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, 0x20, 0x00, + 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x20, 0x00, + 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x21, 0x00, + 0x22, 0x00, 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, + 0x6e, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x22, 0x00, 0x0d, 0x00, 0x0a, 0x00, + 0x2e, 0x00, 0x53, 0x00, 0x48, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x41, 0x00, + 0x4d, 0x00, 0x45, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x48, 0x00, 0x65, 0x00, + 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, + 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, + 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, + 0x30, 0x82, 0x10, 0xa0, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x07, 0x02, 0xa0, 0x82, 0x10, 0x91, 0x30, 0x82, 0x10, 0x8d, 0x02, + 0x01, 0x01, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, + 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, 0x78, 0x06, 0x0a, 0x2b, + 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0xa0, 0x6a, 0x30, + 0x68, 0x30, 0x33, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, + 0x02, 0x01, 0x0f, 0x30, 0x25, 0x03, 0x01, 0x00, 0xa0, 0x20, 0xa2, 0x1e, + 0x80, 0x1c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x4f, 0x00, 0x62, + 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x74, 0x00, 0x65, + 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, + 0x20, 0x96, 0x8a, 0xd8, 0x5d, 0x87, 0x66, 0xa3, 0x72, 0x26, 0xcd, 0x08, + 0xe4, 0x9c, 0x7e, 0x13, 0x24, 0x75, 0x30, 0x8e, 0xb2, 0xc1, 0x1b, 0x7d, + 0x4b, 0xec, 0xf6, 0x90, 0x96, 0x61, 0x70, 0xbc, 0x32, 0xa0, 0x82, 0x0d, + 0x92, 0x30, 0x82, 0x03, 0x71, 0x30, 0x82, 0x02, 0x59, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x14, 0x71, 0xb5, 0x0a, 0x74, 0x69, 0x1a, 0x2e, 0xf8, + 0x57, 0xff, 0xaa, 0x62, 0x03, 0x18, 0x11, 0xc2, 0x0d, 0x63, 0x88, 0xb4, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, + 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, + 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, + 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x36, + 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, + 0x34, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x29, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x4c, 0x65, 0x61, 0x66, 0x20, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xa1, 0x3b, 0xcf, 0x40, 0x63, 0x36, 0x7e, 0xb4, 0x40, 0x53, + 0x74, 0x5a, 0xc0, 0x02, 0xea, 0xef, 0x3e, 0xe0, 0x4c, 0x12, 0xf3, 0x28, + 0x53, 0x99, 0xa6, 0x48, 0x13, 0xee, 0xc7, 0x00, 0xb8, 0x23, 0x74, 0xf3, + 0xf4, 0x03, 0xc5, 0xed, 0xfb, 0x5a, 0x1a, 0xae, 0x73, 0x6a, 0xfd, 0xee, + 0x08, 0x37, 0x18, 0x2c, 0xe3, 0x5a, 0x98, 0x6f, 0xb3, 0x00, 0x4e, 0x4f, + 0xbe, 0x06, 0xe4, 0xe4, 0xee, 0x24, 0x53, 0xcb, 0xe3, 0xb3, 0x88, 0x6c, + 0xeb, 0xe2, 0x84, 0xd9, 0x1b, 0xd7, 0x06, 0x8d, 0x6d, 0xbc, 0x60, 0xe2, + 0xbf, 0xff, 0x50, 0xd1, 0x92, 0xcc, 0x1d, 0xbb, 0x91, 0x1e, 0x72, 0x39, + 0x48, 0x6c, 0x4f, 0x02, 0x7c, 0x86, 0x34, 0x53, 0xfe, 0xeb, 0x31, 0x10, + 0x9d, 0xa7, 0xa2, 0x12, 0x3e, 0x6b, 0x7b, 0xa3, 0xba, 0xaa, 0x42, 0x18, + 0xa3, 0x0d, 0xb9, 0x2a, 0x56, 0x0b, 0xdc, 0x0f, 0x78, 0x41, 0xd1, 0xe4, + 0x12, 0x2e, 0x26, 0x01, 0x37, 0x32, 0xbf, 0x17, 0x2e, 0x3f, 0x70, 0xdc, + 0xac, 0x26, 0x2c, 0x3f, 0x99, 0xdd, 0xf0, 0xb2, 0x81, 0x92, 0xd8, 0x88, + 0xb6, 0x1c, 0x6e, 0x5b, 0x8a, 0x3d, 0x5a, 0x66, 0x28, 0x1a, 0x6c, 0xf3, + 0x7a, 0x4a, 0x7f, 0x1f, 0x8b, 0x2b, 0x57, 0x94, 0x92, 0xe7, 0x1f, 0x0e, + 0x70, 0x07, 0x6f, 0x0e, 0x48, 0x30, 0xc5, 0x76, 0x11, 0x27, 0x1f, 0x43, + 0x17, 0x4d, 0x8a, 0x2f, 0x65, 0x2e, 0xfb, 0xb6, 0x7c, 0x17, 0x83, 0x77, + 0xb2, 0xa2, 0x7c, 0xb5, 0x54, 0x95, 0x23, 0xbe, 0x3a, 0x40, 0x9b, 0x8a, + 0xe2, 0xa3, 0x94, 0x0c, 0xb1, 0xff, 0x62, 0x4b, 0x74, 0xfc, 0xc1, 0xc4, + 0x63, 0x2e, 0x61, 0xee, 0x09, 0xc5, 0xf6, 0xe4, 0x8f, 0x6a, 0x33, 0x41, + 0x3d, 0x7f, 0x5a, 0x4f, 0xd6, 0x66, 0x33, 0x30, 0x9a, 0x80, 0x4d, 0xf3, + 0xbe, 0x72, 0x3f, 0x86, 0x52, 0x1f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x75, 0x30, 0x73, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x13, 0x06, + 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x72, 0x8a, 0xd7, 0xd4, 0xaf, 0x15, 0x1e, + 0x35, 0xcf, 0x72, 0x14, 0x49, 0x8b, 0x01, 0xd0, 0xb6, 0x4b, 0x48, 0x1d, + 0x23, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, 0xe4, 0x50, 0xed, 0x2f, + 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, 0x5c, 0x76, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x32, 0xcc, 0x95, 0xe4, 0xe2, 0x7e, + 0x2c, 0x74, 0x33, 0x45, 0x7e, 0xd3, 0xcd, 0x0b, 0xda, 0x0e, 0xe7, 0x16, + 0x8f, 0x60, 0xb1, 0x4c, 0x6f, 0x3e, 0xb9, 0xa1, 0xe5, 0x00, 0x2c, 0x9f, + 0x5b, 0x65, 0x8d, 0x4e, 0xc1, 0x74, 0x03, 0x30, 0xf0, 0xc1, 0xbd, 0x33, + 0x81, 0xf1, 0x3b, 0x0d, 0x63, 0x86, 0x7f, 0x0d, 0x68, 0x1c, 0xaf, 0x22, + 0xa4, 0xf1, 0xf2, 0xb7, 0x35, 0x2d, 0x3d, 0xa5, 0xc4, 0x54, 0x0d, 0x16, + 0xc8, 0x7f, 0xc7, 0xe2, 0x5d, 0xba, 0x1c, 0x52, 0xcb, 0x6e, 0x81, 0xe8, + 0xb9, 0x4a, 0x11, 0xb4, 0xf7, 0x70, 0x0b, 0x70, 0xf3, 0xfe, 0x0c, 0xb1, + 0x15, 0x31, 0x57, 0x63, 0x9a, 0xbc, 0xbc, 0x9a, 0xc5, 0x40, 0xab, 0xdd, + 0xc3, 0xc5, 0xc0, 0xfd, 0x47, 0x79, 0x85, 0x96, 0x4c, 0x3d, 0xa4, 0x3e, + 0x6e, 0xaf, 0x30, 0xd2, 0x20, 0x30, 0x6b, 0x32, 0xa3, 0x8d, 0x6c, 0xb7, + 0x5e, 0xa9, 0x9b, 0x31, 0x98, 0x25, 0xed, 0x1f, 0xf6, 0x3c, 0x59, 0xc3, + 0x77, 0xca, 0x83, 0x49, 0x28, 0xe6, 0x20, 0xc4, 0x32, 0xc4, 0x15, 0x15, + 0xac, 0xa7, 0x54, 0xd1, 0xa5, 0xc6, 0xe8, 0xc5, 0x7c, 0x0f, 0x23, 0x31, + 0xe3, 0x06, 0xad, 0x48, 0x9c, 0xf6, 0xb1, 0xd5, 0x9f, 0xed, 0xee, 0xf4, + 0x1c, 0xe3, 0xce, 0x3e, 0xf3, 0x27, 0x28, 0x19, 0x20, 0xb9, 0xcb, 0x4d, + 0x85, 0xdd, 0xf9, 0xc8, 0xec, 0x2e, 0x60, 0xd1, 0xf7, 0x48, 0xba, 0x25, + 0xf7, 0x4f, 0x0e, 0x47, 0x9e, 0xc8, 0xc8, 0xaa, 0x74, 0xb5, 0x5f, 0x90, + 0xc6, 0xfa, 0xb9, 0xdf, 0x95, 0x88, 0xe8, 0x00, 0xc3, 0x90, 0xa6, 0x9f, + 0x06, 0xda, 0xf5, 0x9e, 0x04, 0x55, 0xd7, 0x68, 0xe0, 0x1f, 0x37, 0xbe, + 0x4f, 0xe9, 0x7a, 0x0f, 0x3e, 0xc8, 0x60, 0x84, 0xc3, 0x78, 0x0b, 0xd9, + 0xc8, 0xd9, 0xe9, 0x66, 0xea, 0xd7, 0x5b, 0x83, 0x63, 0x3e, 0x30, 0x82, + 0x03, 0x65, 0x30, 0x82, 0x02, 0x4d, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x14, 0x2c, 0xcc, 0x3e, 0x1f, 0x6c, 0x46, 0x86, 0x7a, 0x93, 0x05, 0x4f, + 0x73, 0x7b, 0xc5, 0x14, 0x61, 0x37, 0xaa, 0x40, 0x10, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x31, 0x20, 0x43, 0x41, + 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, + 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, + 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x3a, 0x31, 0x38, + 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, + 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb, 0x80, 0xcb, 0x94, 0xf5, 0x0d, 0xbf, + 0xbf, 0xe4, 0xfc, 0xd2, 0x21, 0x71, 0x5f, 0x1d, 0x25, 0x78, 0x3c, 0xd2, + 0x3a, 0x62, 0x35, 0x1a, 0xa9, 0xa2, 0x13, 0x54, 0x33, 0x73, 0x6c, 0x39, + 0x18, 0x96, 0x8f, 0x0a, 0xe2, 0x01, 0x2c, 0x54, 0x85, 0x3e, 0xeb, 0xd5, + 0xc8, 0xa3, 0xdf, 0xd8, 0x3f, 0x6c, 0x96, 0x4a, 0xc6, 0x19, 0xbc, 0xfd, + 0x7a, 0x9b, 0x28, 0xd0, 0xe9, 0x07, 0x82, 0xeb, 0xdb, 0x42, 0x6d, 0x9f, + 0xb6, 0xac, 0xa3, 0xc1, 0x0a, 0xff, 0x58, 0x85, 0x10, 0x31, 0x0e, 0xf4, + 0xb2, 0xb2, 0x49, 0xb0, 0x72, 0x4a, 0x81, 0x93, 0x60, 0x11, 0x40, 0xde, + 0xc4, 0x91, 0xfb, 0xcc, 0x45, 0x21, 0xfa, 0x4c, 0x81, 0x2a, 0xf4, 0xc5, + 0x27, 0x70, 0x74, 0x50, 0x82, 0x6f, 0x5f, 0xda, 0x94, 0xf1, 0xda, 0xbc, + 0x74, 0x98, 0x56, 0xcd, 0xe5, 0x82, 0xa7, 0x17, 0xd3, 0x45, 0x36, 0x05, + 0x6a, 0x3d, 0xc5, 0x35, 0x61, 0xda, 0x44, 0xbb, 0x87, 0x25, 0xc9, 0xcd, + 0x52, 0x55, 0xd9, 0x43, 0x24, 0xa6, 0xeb, 0x13, 0x29, 0xec, 0x9b, 0x4a, + 0xb2, 0x21, 0x99, 0xd3, 0xec, 0x9f, 0xf6, 0x1a, 0x2e, 0x4f, 0x6c, 0x51, + 0x96, 0xc0, 0x6a, 0xb8, 0x10, 0x6e, 0x75, 0x2d, 0x0f, 0x09, 0x53, 0x92, + 0x28, 0xd8, 0x8f, 0xe7, 0x4a, 0x92, 0x40, 0x1b, 0xdb, 0x93, 0x30, 0xc7, + 0x6e, 0x42, 0x60, 0x6a, 0xe2, 0x2b, 0x29, 0x94, 0x70, 0x3f, 0xb3, 0xf0, + 0xf1, 0x18, 0x84, 0xb7, 0x6d, 0xb8, 0x29, 0xcb, 0x72, 0x08, 0xcb, 0x27, + 0x18, 0xe1, 0x0a, 0x9c, 0xc3, 0x0b, 0x62, 0x77, 0xbc, 0x1f, 0xb4, 0x56, + 0x48, 0xa7, 0xdb, 0xf3, 0x29, 0x33, 0xe6, 0x97, 0xb8, 0x2f, 0x6c, 0x52, + 0xa8, 0xdd, 0xf2, 0x82, 0xfa, 0xcc, 0xf1, 0xcc, 0x0d, 0x0b, 0xaa, 0xf9, + 0x34, 0x6e, 0x9a, 0x48, 0x9b, 0x44, 0x43, 0x70, 0xe3, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, 0xe4, 0x50, 0xed, 0x2f, + 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, 0x5c, 0x76, 0x30, 0x1f, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x4d, + 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, 0x88, 0x60, 0x2e, 0x36, 0x47, 0x05, + 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, 0xa1, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x68, 0x6c, 0x45, 0xf9, 0xea, 0x75, 0xac, 0xbf, 0xfc, + 0x1b, 0xcc, 0x42, 0xa1, 0x55, 0xb7, 0x19, 0xb9, 0x67, 0x83, 0x0c, 0x15, + 0x94, 0xdb, 0x1b, 0x31, 0x33, 0xf5, 0xff, 0x6b, 0xae, 0xb9, 0x06, 0x7e, + 0xd1, 0x19, 0x2e, 0x97, 0x84, 0xd7, 0xd7, 0xc5, 0x23, 0xac, 0x21, 0xb8, + 0x70, 0xd4, 0xa7, 0x5e, 0x3c, 0xf9, 0x83, 0x68, 0xc4, 0xc1, 0x7b, 0xb7, + 0x86, 0xc1, 0x11, 0xd7, 0xd7, 0xa1, 0x63, 0x8a, 0x04, 0x10, 0x03, 0x34, + 0x5f, 0x04, 0x6c, 0x18, 0x37, 0xb1, 0x9c, 0xe9, 0x2e, 0x24, 0xd1, 0x10, + 0xb8, 0x69, 0x05, 0x96, 0x2a, 0x30, 0xd9, 0x12, 0x9e, 0xdb, 0xfb, 0x12, + 0x5e, 0x2b, 0x7b, 0xc7, 0x55, 0x32, 0xa0, 0x87, 0x16, 0xdb, 0x2f, 0x5f, + 0x12, 0x70, 0xff, 0x76, 0xe9, 0x05, 0x62, 0xfb, 0xe1, 0x03, 0x51, 0xe7, + 0x87, 0xa0, 0x50, 0x63, 0xbc, 0xe9, 0x6a, 0x4f, 0x47, 0xd9, 0xde, 0xe8, + 0x28, 0xd0, 0x69, 0xcf, 0x29, 0x35, 0x7c, 0x3c, 0x7f, 0x29, 0x65, 0xb0, + 0x2f, 0x69, 0xba, 0xa2, 0x20, 0x90, 0xf0, 0x75, 0xd1, 0x02, 0xf6, 0xae, + 0xd0, 0x5f, 0xbe, 0x5d, 0xce, 0x6d, 0xce, 0x76, 0xc6, 0x61, 0x0f, 0x75, + 0xdb, 0x3f, 0x08, 0xaf, 0x96, 0x15, 0x95, 0x57, 0x7d, 0xa1, 0x80, 0x59, + 0x4c, 0xba, 0x3b, 0x95, 0x6b, 0x78, 0xee, 0xc1, 0xad, 0x5a, 0x68, 0xa0, + 0x6e, 0x25, 0x86, 0x58, 0xa2, 0x46, 0xee, 0x62, 0xf7, 0x88, 0x28, 0xbb, + 0x60, 0x33, 0x32, 0xf4, 0xce, 0x5f, 0x86, 0x3a, 0xd3, 0x2a, 0xe3, 0x3e, + 0x2d, 0xda, 0x59, 0xc1, 0xab, 0x90, 0x8c, 0xc9, 0xa9, 0x78, 0x8b, 0xb7, + 0x4c, 0x43, 0xc2, 0x53, 0x3d, 0x92, 0x20, 0xdf, 0xf2, 0x55, 0xb0, 0x2b, + 0xc9, 0x2b, 0x36, 0xf3, 0xbe, 0xd2, 0x3f, 0x9d, 0x8c, 0x32, 0x99, 0x38, + 0xf7, 0x15, 0x20, 0xb9, 0xf3, 0x4b, 0x03, 0x30, 0x82, 0x03, 0x5b, 0x30, + 0x82, 0x02, 0x43, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x29, 0xe7, + 0xee, 0xbe, 0xd0, 0xf2, 0x0a, 0x30, 0xc2, 0xd1, 0x41, 0xc9, 0x4d, 0x24, + 0xd9, 0x8a, 0xfe, 0x42, 0x3d, 0x85, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x30, 0x31, + 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x25, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, + 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, + 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, + 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, + 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x3a, 0x31, 0x38, 0x30, + 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, + 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x20, 0x31, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, + 0x82, 0x01, 0x01, 0x00, 0xb0, 0x99, 0x93, 0xd5, 0xe0, 0x9e, 0xc7, 0x39, + 0xd2, 0x44, 0x31, 0x5f, 0x1c, 0xd3, 0x87, 0x2c, 0xcf, 0x36, 0xc4, 0xe5, + 0x0d, 0xda, 0x60, 0x66, 0x88, 0x05, 0x15, 0xf6, 0x12, 0xe3, 0x61, 0x73, + 0xec, 0xcf, 0x2e, 0xd9, 0xf6, 0x81, 0x1a, 0xe9, 0x52, 0xa8, 0x37, 0x94, + 0x5a, 0xb8, 0x30, 0xb8, 0x10, 0x2e, 0x23, 0xfe, 0xfd, 0x9e, 0x36, 0x1f, + 0x45, 0xe2, 0x8c, 0x87, 0x8e, 0xa2, 0x42, 0xb2, 0x88, 0xcc, 0xad, 0x79, + 0xc6, 0xb7, 0xa2, 0x6f, 0x74, 0x28, 0x6e, 0x76, 0x62, 0xc4, 0x13, 0xcc, + 0x05, 0xac, 0xfe, 0xd4, 0x5e, 0x6c, 0x4d, 0x19, 0x3f, 0x41, 0xb9, 0x5f, + 0x5f, 0xef, 0xeb, 0x0d, 0xf9, 0xaa, 0x65, 0x62, 0x64, 0x8d, 0x84, 0xc6, + 0xd1, 0xf5, 0x24, 0x37, 0x97, 0xf1, 0x52, 0x9b, 0x98, 0x28, 0x6b, 0x3d, + 0xda, 0x2b, 0xdd, 0x68, 0x98, 0x4a, 0x8c, 0x99, 0xe1, 0xec, 0xf0, 0x22, + 0x43, 0x8a, 0x01, 0xeb, 0xa9, 0xf9, 0x3d, 0x2f, 0x58, 0x62, 0x36, 0x7e, + 0xc8, 0x62, 0x01, 0x3f, 0x38, 0xcb, 0x09, 0x91, 0x52, 0x2b, 0x8a, 0xde, + 0x93, 0x44, 0xaa, 0x31, 0x6c, 0x0c, 0x86, 0x31, 0x4a, 0x89, 0xed, 0x3f, + 0x01, 0xc4, 0x88, 0xb2, 0x00, 0x05, 0x25, 0xeb, 0xa2, 0xa7, 0xe7, 0x98, + 0x01, 0xb6, 0x0f, 0x2f, 0x12, 0xbf, 0x32, 0xe4, 0x95, 0x40, 0x94, 0x12, + 0x82, 0xf5, 0xc4, 0x48, 0x35, 0x38, 0x8f, 0x10, 0xfb, 0xf8, 0x55, 0x23, + 0x1c, 0x88, 0x56, 0xa1, 0xa9, 0x84, 0x89, 0x5b, 0xb9, 0x20, 0xab, 0xd8, + 0x46, 0x06, 0xa3, 0x49, 0x0b, 0xfa, 0x95, 0x5a, 0x80, 0x46, 0x19, 0xe4, + 0x46, 0x5a, 0x22, 0xdc, 0x09, 0xb0, 0xa8, 0xbb, 0xac, 0x2b, 0xb1, 0x39, + 0xbd, 0xa1, 0x1e, 0x73, 0xde, 0x87, 0x8f, 0x87, 0x16, 0xe8, 0x78, 0xcd, + 0x04, 0xa8, 0x21, 0xd3, 0x5f, 0x57, 0xcb, 0x47, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, 0x88, 0x60, 0x2e, 0x36, + 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, 0xa1, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa6, 0x9c, + 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, + 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x07, 0x3d, 0x41, 0xe5, 0x4e, 0xb5, 0x79, 0x2e, 0xaf, 0x85, + 0xa4, 0xd2, 0x86, 0xcc, 0x21, 0x61, 0xc1, 0x68, 0x0d, 0x6e, 0xac, 0xd9, + 0x13, 0x38, 0xed, 0x12, 0x25, 0x96, 0x31, 0xd7, 0x43, 0xa3, 0xac, 0x49, + 0x5d, 0x4b, 0x18, 0x94, 0x39, 0x58, 0x22, 0x10, 0x6b, 0x49, 0x02, 0xd9, + 0x3e, 0x86, 0x75, 0x21, 0xe5, 0x19, 0x95, 0x28, 0x16, 0x81, 0xf6, 0x42, + 0x43, 0x26, 0x16, 0x3c, 0xcd, 0xbd, 0xed, 0xb4, 0x0c, 0x26, 0xdf, 0xb4, + 0x72, 0x53, 0x6b, 0xbc, 0x2c, 0x25, 0x59, 0x6f, 0xb0, 0x5b, 0x1a, 0x9b, + 0x8b, 0xd5, 0xc0, 0xf1, 0x70, 0x7c, 0xae, 0xdc, 0xfe, 0xa6, 0x3e, 0xe0, + 0x2a, 0xc6, 0x87, 0x5a, 0x5f, 0x4f, 0xa2, 0x47, 0x4e, 0x0c, 0xbf, 0x25, + 0xfb, 0x51, 0xdf, 0xda, 0x1f, 0xbb, 0x28, 0xdf, 0x52, 0x5c, 0x1e, 0xc5, + 0x6d, 0x38, 0x37, 0x7f, 0x86, 0xf5, 0xc0, 0x81, 0xc2, 0x80, 0xab, 0x70, + 0xf4, 0x12, 0x83, 0x50, 0x56, 0x19, 0x2a, 0x06, 0x8b, 0xb2, 0x7e, 0xd8, + 0x3b, 0x56, 0xe3, 0xbd, 0x56, 0x1b, 0x3b, 0x60, 0x90, 0xb6, 0x2c, 0xdb, + 0x5b, 0x9a, 0xb0, 0xd8, 0x7a, 0xaa, 0xcc, 0x02, 0x99, 0x0c, 0xb2, 0x21, + 0xc3, 0x02, 0x1c, 0x23, 0xc5, 0x46, 0x93, 0x2e, 0xc9, 0xf1, 0x3e, 0xec, + 0xcd, 0x15, 0x11, 0xc3, 0x94, 0xb1, 0x6a, 0x10, 0x6f, 0x35, 0x42, 0x91, + 0x2a, 0x78, 0xcf, 0x8f, 0x16, 0x1a, 0x82, 0x8f, 0xae, 0xa8, 0x53, 0x56, + 0xb2, 0x7e, 0x3a, 0x2d, 0x52, 0x04, 0x65, 0xfa, 0xbb, 0xb0, 0xac, 0x6c, + 0xb5, 0xf6, 0xbd, 0x05, 0xd4, 0x9f, 0xc3, 0x8b, 0xca, 0xb0, 0x4f, 0x9f, + 0x15, 0x21, 0xba, 0x8a, 0x94, 0x17, 0x53, 0x13, 0x8b, 0xb7, 0x4d, 0xe9, + 0xdc, 0xc7, 0x26, 0x47, 0x02, 0xf0, 0x4b, 0x75, 0xbe, 0x84, 0x73, 0x02, + 0x1e, 0x14, 0x97, 0x99, 0x91, 0x5b, 0x30, 0x82, 0x03, 0x51, 0x30, 0x82, + 0x02, 0x39, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x15, 0x68, 0xb3, + 0x37, 0x3a, 0x6a, 0x85, 0x56, 0xc8, 0x38, 0x5a, 0xcc, 0xcc, 0x2c, 0xda, + 0xac, 0x35, 0x6a, 0x40, 0x9e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x30, 0x31, 0x2e, + 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x25, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, + 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, + 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, + 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, + 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xbe, 0x63, 0xe7, 0x31, 0xf6, 0xc3, 0x1d, + 0x9d, 0xd3, 0x47, 0x42, 0x28, 0x5c, 0x1c, 0xf0, 0xc6, 0x00, 0xfa, 0x70, + 0x23, 0x7a, 0xe5, 0x8b, 0x32, 0xb3, 0xd7, 0x09, 0x80, 0xde, 0xb4, 0x6b, + 0x02, 0x0e, 0x20, 0x42, 0x34, 0x74, 0x94, 0x66, 0xeb, 0x32, 0xeb, 0x95, + 0xb6, 0x95, 0xe4, 0x6a, 0xb9, 0x85, 0x08, 0xee, 0xd6, 0x8f, 0x61, 0xd6, + 0x23, 0x3c, 0xb2, 0xa0, 0x38, 0xfb, 0x48, 0x26, 0xc9, 0x4a, 0x4f, 0x68, + 0x4c, 0x9a, 0x93, 0x84, 0x75, 0x72, 0x7d, 0xa5, 0xac, 0xed, 0xab, 0x21, + 0x71, 0x1c, 0x34, 0x64, 0x07, 0x2f, 0xe5, 0x1f, 0xb4, 0xeb, 0x31, 0x6d, + 0xc9, 0x9b, 0x7c, 0xe8, 0xcc, 0x49, 0xdc, 0x7d, 0x27, 0x08, 0x9d, 0xa2, + 0x91, 0xf3, 0x9d, 0xad, 0xa0, 0xaa, 0x21, 0x53, 0x76, 0xa7, 0x81, 0x04, + 0x1a, 0x74, 0x89, 0xd6, 0x45, 0x72, 0x7c, 0x37, 0x22, 0xa4, 0xf7, 0x36, + 0x5b, 0x80, 0xce, 0xe2, 0x91, 0x60, 0xee, 0x91, 0xef, 0xc0, 0x25, 0x92, + 0x05, 0xa3, 0x24, 0xa2, 0x4c, 0xa2, 0x93, 0xd0, 0x80, 0x61, 0xc0, 0x9c, + 0xdf, 0xc1, 0xeb, 0xed, 0x2e, 0x23, 0x30, 0xe8, 0xd8, 0xea, 0xc4, 0x5b, + 0x2a, 0x4c, 0x00, 0xa4, 0xdf, 0xa2, 0xa3, 0x39, 0x32, 0x80, 0xb2, 0x1d, + 0x81, 0xa9, 0x26, 0x43, 0x07, 0xc5, 0xf0, 0x8d, 0x2c, 0x61, 0x70, 0xbf, + 0xfd, 0xa1, 0x33, 0xd1, 0x47, 0x59, 0x41, 0xc7, 0x17, 0xe6, 0xdd, 0x4b, + 0x99, 0x97, 0xb6, 0xc3, 0x39, 0x80, 0xfa, 0x78, 0x61, 0x6f, 0xc7, 0xbf, + 0x6c, 0x88, 0xd9, 0xd6, 0xc2, 0x60, 0xbe, 0x83, 0x67, 0xd3, 0x38, 0xf9, + 0x73, 0xc5, 0x64, 0x4e, 0xc2, 0xbb, 0x0f, 0xb8, 0x24, 0xf5, 0x29, 0x86, + 0xb2, 0x35, 0x9a, 0x74, 0x14, 0xdf, 0xef, 0x92, 0xcc, 0xec, 0x5e, 0x46, + 0x80, 0xe8, 0xf2, 0xc3, 0x4a, 0xbd, 0xb7, 0x78, 0xad, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, + 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, + 0x16, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, + 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x9b, 0x0d, 0xd9, 0x6c, 0xf4, 0x0b, 0x08, 0xea, 0xfd, + 0x75, 0xac, 0x4a, 0xcc, 0xf6, 0xdf, 0x33, 0x62, 0x6b, 0x0c, 0x93, 0x50, + 0x73, 0x4a, 0x60, 0x67, 0xde, 0x0d, 0x24, 0x95, 0x4c, 0x4b, 0x75, 0xb3, + 0xec, 0x0e, 0xe3, 0x3a, 0xc6, 0x4c, 0xe3, 0x93, 0xf0, 0x9c, 0xa4, 0xfe, + 0x2c, 0x87, 0x9c, 0x7c, 0x4d, 0x7b, 0x18, 0x1b, 0x93, 0x5f, 0x2e, 0xda, + 0x88, 0xef, 0x11, 0x8b, 0x2a, 0xa3, 0x20, 0xbb, 0x22, 0xc0, 0x73, 0x59, + 0xd9, 0x13, 0x35, 0xac, 0x40, 0x21, 0x1e, 0xd2, 0xab, 0x5a, 0xcd, 0x80, + 0x82, 0x36, 0x64, 0x11, 0x84, 0x11, 0x4f, 0xf0, 0x60, 0x52, 0x3f, 0x2c, + 0xe4, 0xc8, 0x47, 0xd8, 0x36, 0xc5, 0x50, 0x8a, 0x8f, 0x8f, 0x13, 0x40, + 0x3b, 0xda, 0x2b, 0x05, 0x17, 0x7c, 0x44, 0x5f, 0x05, 0xde, 0x67, 0xcc, + 0x17, 0x04, 0xdb, 0xcc, 0xee, 0x6e, 0x1c, 0xaf, 0xf4, 0x66, 0x9c, 0x7d, + 0x72, 0x91, 0x9f, 0x6f, 0x42, 0x78, 0x10, 0x90, 0xd5, 0xfa, 0xd4, 0x1b, + 0xac, 0x56, 0x02, 0xf4, 0x00, 0x48, 0x6b, 0x56, 0x05, 0x32, 0xb5, 0x0a, + 0x16, 0x14, 0x56, 0x14, 0xfa, 0x49, 0x99, 0x59, 0x62, 0xed, 0xda, 0x99, + 0x48, 0x88, 0x18, 0x20, 0x77, 0xfe, 0xbf, 0x6c, 0xcc, 0x5b, 0x53, 0xab, + 0x2b, 0x93, 0x6a, 0x5d, 0xce, 0xf8, 0x5e, 0xfa, 0x71, 0xc5, 0x79, 0x6a, + 0xba, 0x49, 0x00, 0x6a, 0x0f, 0x0e, 0x40, 0xb5, 0x79, 0xa4, 0x93, 0x14, + 0xa5, 0x2c, 0x24, 0x2d, 0x76, 0xa4, 0x05, 0x60, 0x93, 0x8d, 0x50, 0xe8, + 0x2b, 0xcf, 0x51, 0xe3, 0xdc, 0x8d, 0x72, 0xa2, 0xae, 0xf1, 0x76, 0x5e, + 0xba, 0xb2, 0xa9, 0x48, 0x20, 0x53, 0xbc, 0x80, 0xf7, 0x35, 0xae, 0x41, + 0x77, 0xef, 0x6a, 0x74, 0xeb, 0xa1, 0x68, 0xc5, 0x83, 0x13, 0x50, 0xd8, + 0xfc, 0x52, 0x18, 0xa3, 0x76, 0x1d, 0x50, 0x31, 0x82, 0x02, 0x65, 0x30, + 0x82, 0x02, 0x61, 0x02, 0x01, 0x01, 0x30, 0x52, 0x30, 0x3a, 0x31, 0x38, + 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, + 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, 0x02, 0x14, 0x71, 0xb5, + 0x0a, 0x74, 0x69, 0x1a, 0x2e, 0xf8, 0x57, 0xff, 0xaa, 0x62, 0x03, 0x18, + 0x11, 0xc2, 0x0d, 0x63, 0x88, 0xb4, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, + 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xa0, 0x81, 0xe5, + 0x30, 0x19, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, + 0x03, 0x31, 0x0c, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, + 0x02, 0x01, 0x04, 0x30, 0x1c, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, + 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, 0x2f, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x04, 0x31, 0x22, + 0x04, 0x20, 0xcf, 0xb9, 0x17, 0xc7, 0x5e, 0x8f, 0x0b, 0x6c, 0xf8, 0x20, + 0x2a, 0x91, 0x74, 0xf6, 0x8e, 0x87, 0x64, 0x4b, 0xe4, 0x98, 0x17, 0x14, + 0x41, 0xb7, 0x97, 0xf5, 0xcf, 0xf0, 0xad, 0xf9, 0xa0, 0x98, 0x30, 0x79, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x0f, 0x31, + 0x6c, 0x30, 0x6a, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, + 0x03, 0x04, 0x01, 0x2a, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, + 0x65, 0x03, 0x04, 0x01, 0x16, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x01, 0x02, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x07, 0x30, 0x0e, 0x06, 0x08, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x02, 0x00, 0x80, 0x30, 0x0d, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x01, + 0x40, 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x07, 0x30, 0x0d, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x01, + 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x39, 0x86, 0xc5, 0x8a, + 0xba, 0x32, 0x23, 0x27, 0x5a, 0x59, 0xf8, 0x09, 0xe2, 0xa9, 0x5c, 0x0a, + 0x23, 0xbf, 0x46, 0x26, 0xd9, 0xd5, 0x77, 0x1e, 0x42, 0x10, 0x0c, 0x72, + 0xf6, 0x1c, 0xe6, 0xc4, 0x82, 0x3d, 0xa0, 0xeb, 0x37, 0x36, 0xef, 0x2f, + 0x7a, 0xdc, 0x21, 0x6b, 0x00, 0x28, 0xb9, 0x64, 0x0a, 0x5f, 0xca, 0xbe, + 0xce, 0xb7, 0x14, 0x2b, 0xa5, 0x36, 0xe7, 0x56, 0x74, 0xbe, 0xda, 0x9a, + 0xc6, 0x5c, 0x4f, 0x55, 0x14, 0x85, 0x7c, 0xbc, 0x63, 0x73, 0x86, 0xa5, + 0x31, 0x14, 0x32, 0xf6, 0xa1, 0x5e, 0xe8, 0x6c, 0x5e, 0xd3, 0xa9, 0x0e, + 0xe5, 0x52, 0x2f, 0xef, 0xd0, 0x16, 0xe3, 0x0c, 0x9d, 0x29, 0x8d, 0xbd, + 0xe0, 0x0a, 0x52, 0x30, 0x8b, 0xe2, 0xad, 0x63, 0xf0, 0xb8, 0x40, 0x31, + 0x75, 0xc8, 0x9f, 0xde, 0x33, 0x0a, 0x18, 0xe5, 0x41, 0xd1, 0x1a, 0x19, + 0xe1, 0xf2, 0xa4, 0x12, 0x21, 0xde, 0x2f, 0xf6, 0xb8, 0xb4, 0x6e, 0x12, + 0x94, 0x37, 0x38, 0xb6, 0xe3, 0x52, 0x91, 0x24, 0x2f, 0x46, 0x3f, 0x72, + 0xa0, 0xa4, 0xde, 0x44, 0x5d, 0xaa, 0xac, 0x55, 0xeb, 0x96, 0x55, 0x72, + 0x52, 0x7f, 0x3c, 0xe9, 0xf4, 0x12, 0x47, 0xbe, 0x9e, 0x6c, 0xb2, 0x72, + 0xd6, 0x66, 0x6a, 0xff, 0x05, 0xc6, 0xaf, 0xdb, 0x35, 0x8a, 0xff, 0x62, + 0x6d, 0x2b, 0xa1, 0xb2, 0x82, 0xbe, 0xe7, 0x02, 0xeb, 0xf1, 0xd2, 0x67, + 0xdc, 0x3a, 0xf6, 0x77, 0xf4, 0xf1, 0xc2, 0x30, 0xeb, 0xdb, 0xcf, 0x9e, + 0xe4, 0x03, 0x34, 0x83, 0x53, 0x5a, 0xb3, 0x89, 0xc3, 0x60, 0x50, 0x76, + 0x3f, 0x34, 0xa7, 0x0f, 0x03, 0x9a, 0xc3, 0x4a, 0x45, 0x57, 0x2a, 0x19, + 0xf5, 0xbb, 0xb2, 0x80, 0x32, 0x56, 0x24, 0x68, 0x5a, 0xd5, 0xc4, 0xe3, + 0x08, 0xc9, 0xb2, 0x69, 0xfa, 0x2c, 0x56, 0x7d, 0xd5, 0xd6, 0x20, 0xa3, + 0x00, 0x00, 0x00, 0x00, +}; +CONST UINTN mSignedImageSize = sizeof (mSignedImage); + +// +// X64 PE/COFF image signed by the leaf cert and signer 2 +// +CONST UINT8 mMultiSignedImage[] = { + 0x4d, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x50, 0x45, 0x00, 0x00, 0x64, 0x86, 0x05, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0x00, 0x22, 0x20, 0x0b, 0x02, 0x0e, 0x2c, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x10, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x10, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x70, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x9e, 0x84, 0x00, 0x00, + 0x0a, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x00, 0x00, 0xb8, 0x1d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3b, 0x00, 0x00, + 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x2e, 0x74, 0x65, 0x78, 0x74, 0x00, 0x00, 0x00, + 0xb9, 0x15, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x68, 0x2e, 0x64, 0x61, 0x74, + 0x61, 0x00, 0x00, 0x00, 0x58, 0x0c, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, + 0x00, 0x0e, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc8, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x00, 0x00, 0x42, 0x2e, 0x78, 0x64, 0x61, 0x74, 0x61, 0x00, 0x00, + 0xdc, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, + 0x00, 0x2a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x42, 0x2e, 0x72, 0x73, 0x72, + 0x63, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x48, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xc3, 0xc3, 0xc3, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, + 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xf3, 0x90, 0xc3, 0xcc, + 0x48, 0x89, 0x5c, 0x24, 0x08, 0x57, 0x48, 0x83, 0xec, 0x30, 0x48, 0x8b, + 0x42, 0x60, 0x4c, 0x8d, 0x05, 0x33, 0x02, 0x00, 0x00, 0x45, 0x33, 0xc9, + 0x48, 0x89, 0x15, 0x45, 0x2b, 0x00, 0x00, 0x48, 0x8b, 0xfa, 0x48, 0x8b, + 0xd9, 0xb9, 0x01, 0x02, 0x00, 0x00, 0x4c, 0x8b, 0x50, 0x50, 0x48, 0x8d, + 0x05, 0x1f, 0x2b, 0x00, 0x00, 0x41, 0x8d, 0x51, 0x10, 0x48, 0x89, 0x44, + 0x24, 0x20, 0x41, 0xff, 0xd2, 0x48, 0x89, 0x1d, 0xf4, 0x2a, 0x00, 0x00, + 0x48, 0x85, 0xdb, 0x75, 0x16, 0x4c, 0x8d, 0x05, 0xb8, 0x20, 0x00, 0x00, + 0x8d, 0x53, 0x2c, 0x48, 0x8d, 0x0d, 0xce, 0x20, 0x00, 0x00, 0xe8, 0x5d, + 0x01, 0x00, 0x00, 0x48, 0x8b, 0x47, 0x60, 0x48, 0x89, 0x3d, 0xc6, 0x2a, + 0x00, 0x00, 0x48, 0x89, 0x05, 0xcf, 0x2a, 0x00, 0x00, 0x48, 0x85, 0xc0, + 0x75, 0x16, 0x4c, 0x8d, 0x05, 0x03, 0x21, 0x00, 0x00, 0x8d, 0x50, 0x38, + 0x48, 0x8d, 0x0d, 0xa1, 0x20, 0x00, 0x00, 0xe8, 0x30, 0x01, 0x00, 0x00, + 0x48, 0x8b, 0x47, 0x58, 0x48, 0x89, 0x05, 0xb1, 0x2a, 0x00, 0x00, 0x48, + 0x85, 0xc0, 0x75, 0x16, 0x4c, 0x8d, 0x05, 0xf5, 0x20, 0x00, 0x00, 0x8d, + 0x50, 0x29, 0x48, 0x8d, 0x0d, 0x0b, 0x21, 0x00, 0x00, 0xe8, 0x0a, 0x01, + 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x9f, 0x1f, 0x00, 0x00, 0xe8, 0x7a, 0x02, + 0x00, 0x00, 0x48, 0x8b, 0x0d, 0x8b, 0x2a, 0x00, 0x00, 0x48, 0x85, 0xc9, + 0x74, 0x0a, 0x48, 0x8b, 0x47, 0x60, 0x48, 0x8b, 0x50, 0x70, 0xff, 0xd2, + 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x33, 0xc0, 0x48, 0x83, 0xc4, 0x30, 0x5f, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x8b, 0xc4, 0x48, 0x89, 0x50, 0x10, 0x4c, + 0x89, 0x40, 0x18, 0x4c, 0x89, 0x48, 0x20, 0x48, 0x83, 0xec, 0x28, 0x4c, + 0x8d, 0x40, 0x18, 0xe8, 0x08, 0x00, 0x00, 0x00, 0x48, 0x83, 0xc4, 0x28, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x74, + 0x24, 0x20, 0x57, 0x48, 0x81, 0xec, 0x30, 0x02, 0x00, 0x00, 0x48, 0x8b, + 0x05, 0x37, 0x2a, 0x00, 0x00, 0x48, 0x33, 0xc4, 0x48, 0x89, 0x84, 0x24, + 0x20, 0x02, 0x00, 0x00, 0x80, 0x3d, 0xf5, 0x29, 0x00, 0x00, 0x00, 0x49, + 0x8b, 0xf0, 0x48, 0x8b, 0xda, 0x48, 0x8b, 0xf9, 0x75, 0x57, 0x48, 0x85, + 0xd2, 0x75, 0x16, 0x4c, 0x8d, 0x05, 0x36, 0x1f, 0x00, 0x00, 0x8d, 0x53, + 0x5d, 0x48, 0x8d, 0x0d, 0x44, 0x1f, 0x00, 0x00, 0xe8, 0x63, 0x00, 0x00, + 0x00, 0x48, 0x0f, 0xba, 0xe7, 0x1f, 0x73, 0x35, 0x4c, 0x8b, 0xce, 0x48, + 0x8d, 0x4c, 0x24, 0x20, 0x4c, 0x8b, 0xc3, 0xba, 0x00, 0x02, 0x00, 0x00, + 0xe8, 0xcf, 0x02, 0x00, 0x00, 0x48, 0x8b, 0x0d, 0xe4, 0x29, 0x00, 0x00, + 0x48, 0x85, 0xc9, 0x74, 0x14, 0x48, 0x8b, 0x49, 0x50, 0x48, 0x85, 0xc9, + 0x74, 0x0b, 0x48, 0x8b, 0x41, 0x08, 0x48, 0x8d, 0x54, 0x24, 0x20, 0xff, + 0xd0, 0x48, 0x8b, 0x8c, 0x24, 0x20, 0x02, 0x00, 0x00, 0x48, 0x33, 0xcc, + 0xe8, 0x45, 0xfe, 0xff, 0xff, 0x4c, 0x8d, 0x9c, 0x24, 0x30, 0x02, 0x00, + 0x00, 0x49, 0x8b, 0x5b, 0x10, 0x49, 0x8b, 0x73, 0x28, 0x49, 0x8b, 0xe3, + 0x5f, 0xc3, 0xcc, 0xcc, 0x48, 0x81, 0xec, 0x58, 0x02, 0x00, 0x00, 0x48, + 0x8b, 0x05, 0x8e, 0x29, 0x00, 0x00, 0x48, 0x33, 0xc4, 0x48, 0x89, 0x84, + 0x24, 0x40, 0x02, 0x00, 0x00, 0x80, 0x3d, 0x4c, 0x29, 0x00, 0x00, 0x00, + 0x75, 0x4c, 0x4c, 0x89, 0x44, 0x24, 0x30, 0x4c, 0x8d, 0x0d, 0xfe, 0x1d, + 0x00, 0x00, 0x48, 0x89, 0x54, 0x24, 0x28, 0x4c, 0x8d, 0x05, 0xe2, 0x1e, + 0x00, 0x00, 0x48, 0x89, 0x4c, 0x24, 0x20, 0xba, 0x00, 0x02, 0x00, 0x00, + 0x48, 0x8d, 0x4c, 0x24, 0x40, 0xe8, 0xb2, 0x02, 0x00, 0x00, 0x48, 0x8b, + 0x0d, 0x4f, 0x29, 0x00, 0x00, 0x48, 0x85, 0xc9, 0x74, 0x14, 0x48, 0x8b, + 0x49, 0x50, 0x48, 0x85, 0xc9, 0x74, 0x0b, 0x48, 0x8b, 0x41, 0x08, 0x48, + 0x8d, 0x54, 0x24, 0x40, 0xff, 0xd0, 0x48, 0x8b, 0x8c, 0x24, 0x40, 0x02, + 0x00, 0x00, 0x48, 0x33, 0xcc, 0xe8, 0xb0, 0xfd, 0xff, 0xff, 0x48, 0x81, + 0xc4, 0x58, 0x02, 0x00, 0x00, 0xc3, 0xcc, 0xcc, 0xc6, 0x05, 0xdd, 0x28, + 0x00, 0x00, 0x01, 0xc3, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, + 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xec, 0x20, + 0x49, 0x8b, 0xe8, 0x48, 0x8b, 0xf2, 0x48, 0x8b, 0xf9, 0x48, 0x85, 0xc9, + 0x75, 0x0c, 0x4c, 0x8d, 0x05, 0x0b, 0x1e, 0x00, 0x00, 0x8d, 0x51, 0x3d, + 0xeb, 0x12, 0x40, 0xf6, 0xc7, 0x01, 0x74, 0x18, 0x4c, 0x8d, 0x05, 0xd1, + 0x1f, 0x00, 0x00, 0xba, 0x3e, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x85, + 0x1f, 0x00, 0x00, 0xe8, 0x24, 0xff, 0xff, 0xff, 0x48, 0x85, 0xf6, 0x75, + 0x16, 0x4c, 0x8d, 0x05, 0xdc, 0x1f, 0x00, 0x00, 0x8d, 0x56, 0x3f, 0x48, + 0x8d, 0x0d, 0x6a, 0x1f, 0x00, 0x00, 0xe8, 0x09, 0xff, 0xff, 0xff, 0xe8, + 0x54, 0x12, 0x00, 0x00, 0x48, 0x8b, 0xd8, 0x48, 0x85, 0xc0, 0x75, 0x1a, + 0x4c, 0x8d, 0x05, 0x29, 0x1e, 0x00, 0x00, 0x8d, 0x50, 0x46, 0x48, 0x8d, + 0x0d, 0x47, 0x1f, 0x00, 0x00, 0xe8, 0xe6, 0xfe, 0xff, 0xff, 0x33, 0xc0, + 0xeb, 0x46, 0x4c, 0x8b, 0xcd, 0x4c, 0x8b, 0xc7, 0x48, 0x8b, 0xcb, 0xe8, + 0xd8, 0x00, 0x00, 0x00, 0x48, 0x8b, 0xf8, 0x48, 0x85, 0xf6, 0x74, 0x25, + 0x48, 0x85, 0xc0, 0x74, 0x20, 0x4c, 0x8b, 0x46, 0x08, 0x48, 0x8b, 0xd3, + 0x48, 0x8b, 0xce, 0x41, 0xff, 0xd0, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc1, 0x48, 0x1b, 0xc9, 0x48, 0x23, + 0xf9, 0x48, 0x8b, 0xcb, 0xe8, 0x33, 0x12, 0x00, 0x00, 0x48, 0x8b, 0xc7, + 0x48, 0x8b, 0x5c, 0x24, 0x30, 0x48, 0x8b, 0x6c, 0x24, 0x38, 0x48, 0x8b, + 0x74, 0x24, 0x40, 0x48, 0x83, 0xc4, 0x20, 0x5f, 0xc3, 0xcc, 0xcc, 0xcc, + 0x48, 0x8b, 0xc4, 0x48, 0x89, 0x48, 0x08, 0x48, 0x89, 0x50, 0x10, 0x4c, + 0x89, 0x40, 0x18, 0x4c, 0x89, 0x48, 0x20, 0x48, 0x83, 0xec, 0x28, 0x48, + 0x8b, 0x15, 0xda, 0x27, 0x00, 0x00, 0x4c, 0x8d, 0x40, 0x10, 0x48, 0x8b, + 0x52, 0x40, 0xe8, 0xe9, 0xfe, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x28, 0xc3, + 0x40, 0x53, 0x48, 0x83, 0xec, 0x20, 0x48, 0x8b, 0xd9, 0xf6, 0xc1, 0x01, + 0x74, 0x18, 0x4c, 0x8d, 0x05, 0x1b, 0x1f, 0x00, 0x00, 0xba, 0x7e, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x6f, 0x1f, 0x00, 0x00, 0xe8, 0x2e, 0xfe, + 0xff, 0xff, 0x33, 0xc9, 0x48, 0x85, 0xdb, 0x74, 0x21, 0x8b, 0xc1, 0x66, + 0x39, 0x0b, 0x74, 0x1c, 0x48, 0x3d, 0x40, 0x42, 0x0f, 0x00, 0x73, 0x0b, + 0x48, 0xff, 0xc0, 0x66, 0x39, 0x0c, 0x43, 0x75, 0xef, 0xeb, 0x09, 0xb8, + 0x41, 0x42, 0x0f, 0x00, 0xeb, 0x02, 0x33, 0xc0, 0x48, 0x83, 0xc4, 0x20, + 0x5b, 0xc3, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x74, + 0x24, 0x10, 0x57, 0x48, 0x83, 0xec, 0x30, 0x49, 0x8b, 0xf1, 0x49, 0x8b, + 0xd8, 0x48, 0x8b, 0xf9, 0xf6, 0xc1, 0x01, 0x74, 0x18, 0x4c, 0x8d, 0x05, + 0x7c, 0x1f, 0x00, 0x00, 0xba, 0x47, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, + 0x98, 0x1f, 0x00, 0x00, 0xe8, 0xc7, 0xfd, 0xff, 0xff, 0xf6, 0xc3, 0x01, + 0x74, 0x18, 0x4c, 0x8d, 0x05, 0xc7, 0x1f, 0x00, 0x00, 0xba, 0x48, 0x00, + 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x7b, 0x1f, 0x00, 0x00, 0xe8, 0xaa, 0xfd, + 0xff, 0xff, 0xba, 0x41, 0x01, 0x00, 0x00, 0x48, 0xc7, 0x44, 0x24, 0x28, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x8b, 0xcb, 0x48, 0x89, 0x74, 0x24, 0x20, + 0x48, 0x8b, 0xcf, 0x44, 0x8d, 0x42, 0xff, 0xe8, 0x48, 0x01, 0x00, 0x00, + 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x48, 0x8b, 0x74, 0x24, 0x48, 0x48, 0x83, + 0xc4, 0x30, 0x5f, 0xc3, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x6c, + 0x24, 0x10, 0x48, 0x89, 0x74, 0x24, 0x18, 0x57, 0x48, 0x83, 0xec, 0x30, + 0x49, 0x8b, 0xf1, 0x49, 0x8b, 0xe8, 0x48, 0x8b, 0xda, 0x48, 0x8b, 0xf9, + 0xf6, 0xc1, 0x01, 0x74, 0x18, 0x4c, 0x8d, 0x05, 0xf0, 0x1e, 0x00, 0x00, + 0xba, 0xea, 0x00, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0x0c, 0x1f, 0x00, 0x00, + 0xe8, 0x3b, 0xfd, 0xff, 0xff, 0x48, 0xd1, 0xeb, 0x4c, 0x8b, 0xcd, 0x48, + 0x8b, 0xd3, 0x48, 0xc7, 0x44, 0x24, 0x28, 0x00, 0x00, 0x00, 0x00, 0x41, + 0xb8, 0x40, 0x00, 0x00, 0x00, 0x48, 0x89, 0x74, 0x24, 0x20, 0x48, 0x8b, + 0xcf, 0xe8, 0xd6, 0x00, 0x00, 0x00, 0x48, 0x8b, 0x5c, 0x24, 0x40, 0x48, + 0x8b, 0x6c, 0x24, 0x48, 0x48, 0x8b, 0x74, 0x24, 0x50, 0x48, 0x83, 0xc4, + 0x30, 0x5f, 0xc3, 0xcc, 0x4c, 0x89, 0x44, 0x24, 0x18, 0x4c, 0x89, 0x4c, + 0x24, 0x20, 0x48, 0x83, 0xec, 0x28, 0x4c, 0x8d, 0x4c, 0x24, 0x48, 0xe8, + 0x70, 0xff, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0xcc, 0xcc, 0xcc, + 0x45, 0x33, 0xd2, 0x4d, 0x85, 0xc0, 0x7e, 0x27, 0x48, 0x3b, 0xca, 0x73, + 0x22, 0x48, 0x83, 0x7c, 0x24, 0x28, 0x01, 0x44, 0x88, 0x09, 0x74, 0x0a, + 0x49, 0x8b, 0xc1, 0x48, 0xc1, 0xe8, 0x08, 0x88, 0x41, 0x01, 0x48, 0x03, + 0x4c, 0x24, 0x28, 0x49, 0xff, 0xc2, 0x4d, 0x3b, 0xd0, 0x7c, 0xd9, 0x48, + 0x8b, 0xc1, 0xc3, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x08, 0x48, 0x89, 0x74, + 0x24, 0x10, 0x57, 0x48, 0x83, 0xec, 0x20, 0x48, 0x8b, 0xf2, 0xc6, 0x01, + 0x00, 0x48, 0x8b, 0xd9, 0x41, 0x8b, 0xf8, 0x85, 0xff, 0x75, 0x16, 0x4c, + 0x8d, 0x05, 0x1a, 0x1e, 0x00, 0x00, 0x8d, 0x57, 0x26, 0x48, 0x8d, 0x0d, + 0x88, 0x25, 0x00, 0x00, 0xe8, 0x77, 0xfc, 0xff, 0xff, 0x33, 0xd2, 0x48, + 0x8d, 0x0d, 0x1a, 0x25, 0x00, 0x00, 0x48, 0x8b, 0xc6, 0x48, 0xff, 0xc3, + 0x48, 0xf7, 0xf7, 0x48, 0x8b, 0xf0, 0x8b, 0xc2, 0x8a, 0x04, 0x08, 0x88, + 0x03, 0x48, 0x85, 0xf6, 0x75, 0xc5, 0x48, 0x8b, 0x74, 0x24, 0x38, 0x48, + 0x8b, 0xc3, 0x48, 0x8b, 0x5c, 0x24, 0x30, 0x48, 0x83, 0xc4, 0x20, 0x5f, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x5c, 0x24, 0x18, 0x55, 0x56, 0x57, + 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, 0x57, 0x48, 0x8d, 0x6c, 0x24, + 0xa0, 0x48, 0x81, 0xec, 0x60, 0x01, 0x00, 0x00, 0x48, 0x8b, 0x05, 0xb9, + 0x25, 0x00, 0x00, 0x48, 0x33, 0xc4, 0x48, 0x89, 0x45, 0x50, 0x4c, 0x8b, + 0x9d, 0xc0, 0x00, 0x00, 0x00, 0x49, 0x8b, 0xf0, 0x4c, 0x8b, 0xf9, 0x48, + 0x89, 0x4d, 0x88, 0x33, 0xc9, 0x4c, 0x89, 0x4d, 0x90, 0x81, 0xe6, 0x00, + 0x20, 0x00, 0x00, 0x4c, 0x89, 0x5d, 0xa8, 0x48, 0x89, 0x4d, 0xb0, 0x4d, + 0x8b, 0xe1, 0x4d, 0x8b, 0xf0, 0x48, 0x8b, 0xfa, 0x48, 0x85, 0xd2, 0x74, + 0x29, 0x48, 0x85, 0xf6, 0x75, 0x29, 0x4d, 0x85, 0xff, 0x75, 0x24, 0x4c, + 0x8d, 0x05, 0x46, 0x1d, 0x00, 0x00, 0xba, 0x4f, 0x02, 0x00, 0x00, 0x48, + 0x8d, 0x0d, 0x02, 0x1e, 0x00, 0x00, 0xe8, 0xc1, 0xfb, 0xff, 0xff, 0x33, + 0xc0, 0xe9, 0xb8, 0x0e, 0x00, 0x00, 0x48, 0x85, 0xf6, 0x74, 0x13, 0x4d, + 0x85, 0xe4, 0x75, 0x0e, 0x4c, 0x8d, 0x05, 0x7d, 0x1e, 0x00, 0x00, 0xba, + 0x57, 0x02, 0x00, 0x00, 0xeb, 0xd5, 0xbb, 0x40, 0x42, 0x0f, 0x00, 0x41, + 0xf6, 0xc6, 0x40, 0x74, 0x1b, 0x48, 0x3b, 0xfb, 0x76, 0x0e, 0x4c, 0x8d, + 0x05, 0x87, 0x1e, 0x00, 0x00, 0xba, 0x60, 0x02, 0x00, 0x00, 0xeb, 0xb7, + 0x41, 0xbd, 0x02, 0x00, 0x00, 0x00, 0xeb, 0x19, 0x48, 0x3b, 0xfb, 0x76, + 0x0e, 0x4c, 0x8d, 0x05, 0xfc, 0x1d, 0x00, 0x00, 0xba, 0x66, 0x02, 0x00, + 0x00, 0xeb, 0x9c, 0x41, 0xbd, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x6d, + 0xf8, 0x49, 0x0f, 0xba, 0xe6, 0x08, 0x73, 0x43, 0x49, 0x8b, 0xcc, 0xe8, + 0xfc, 0xfc, 0xff, 0xff, 0x48, 0x3b, 0xc3, 0x76, 0x18, 0x4c, 0x8d, 0x05, + 0x90, 0x1e, 0x00, 0x00, 0xba, 0x72, 0x02, 0x00, 0x00, 0x48, 0x8d, 0x0d, + 0x74, 0x1d, 0x00, 0x00, 0xe8, 0x33, 0xfb, 0xff, 0xff, 0x49, 0x8b, 0xcc, + 0xe8, 0xd7, 0xfc, 0xff, 0xff, 0x48, 0x3b, 0xc3, 0x0f, 0x87, 0x61, 0xff, + 0xff, 0xff, 0xbb, 0x02, 0x00, 0x00, 0x00, 0x41, 0xb8, 0xff, 0xff, 0x00, + 0x00, 0xeb, 0x66, 0x4d, 0x85, 0xe4, 0x74, 0x56, 0x33, 0xc0, 0x41, 0x38, + 0x01, 0x74, 0x0e, 0x48, 0x3b, 0xc3, 0x73, 0x0e, 0x48, 0xff, 0xc0, 0x41, + 0x38, 0x0c, 0x01, 0x75, 0xf2, 0x48, 0x3b, 0xc3, 0x76, 0x18, 0x4c, 0x8d, + 0x05, 0xcb, 0x1e, 0x00, 0x00, 0xba, 0x79, 0x02, 0x00, 0x00, 0x48, 0x8d, + 0x0d, 0x1f, 0x1d, 0x00, 0x00, 0xe8, 0xde, 0xfa, 0xff, 0xff, 0x33, 0xc0, + 0x41, 0x38, 0x04, 0x24, 0x74, 0x13, 0x48, 0x3b, 0xc3, 0x0f, 0x83, 0x0c, + 0xff, 0xff, 0xff, 0x48, 0xff, 0xc0, 0x42, 0x80, 0x3c, 0x20, 0x00, 0x75, + 0xed, 0x48, 0x3b, 0xc3, 0x0f, 0x87, 0xf9, 0xfe, 0xff, 0xff, 0xbb, 0x01, + 0x00, 0x00, 0x00, 0x41, 0xb8, 0xff, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x45, + 0xe0, 0x48, 0x89, 0x5d, 0xf0, 0x48, 0x85, 0xf6, 0x74, 0x15, 0x48, 0x8b, + 0xc7, 0x48, 0xf7, 0xd8, 0x48, 0x1b, 0xc9, 0x49, 0x23, 0xcf, 0x4c, 0x8b, + 0xf9, 0x48, 0x89, 0x4d, 0x88, 0xeb, 0x09, 0x48, 0x85, 0xff, 0x0f, 0x84, + 0xc3, 0xfe, 0xff, 0xff, 0x33, 0xf6, 0x45, 0x33, 0xdb, 0x48, 0x89, 0x75, + 0xc8, 0x4c, 0x89, 0x5d, 0xb8, 0x48, 0x89, 0x75, 0x00, 0x4d, 0x85, 0xff, + 0x74, 0x13, 0x4c, 0x8d, 0x5f, 0xff, 0x4c, 0x89, 0x7d, 0x00, 0x4d, 0x0f, + 0xaf, 0xdd, 0x4d, 0x03, 0xdf, 0x4c, 0x89, 0x5d, 0xb8, 0x48, 0x83, 0xfb, + 0x01, 0x75, 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, + 0x01, 0xc1, 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, + 0x0b, 0xc8, 0x49, 0x23, 0xc8, 0x48, 0x89, 0x4d, 0xd0, 0x0f, 0x84, 0xcb, + 0x0c, 0x00, 0x00, 0x48, 0x8b, 0xc1, 0x48, 0x8d, 0x3d, 0x1b, 0x1f, 0x00, + 0x00, 0x49, 0x8b, 0xd4, 0x4d, 0x85, 0xff, 0x74, 0x0c, 0x4d, 0x3b, 0xfb, + 0x0f, 0x83, 0xb0, 0x0c, 0x00, 0x00, 0x4d, 0x85, 0xff, 0x48, 0x0f, 0x44, + 0xc1, 0x48, 0xc7, 0x45, 0xd8, 0x00, 0x00, 0x00, 0x00, 0x32, 0xc9, 0x45, + 0x32, 0xdb, 0x45, 0x33, 0xed, 0x89, 0x4d, 0xc0, 0x88, 0x4d, 0x81, 0x41, + 0x81, 0xe6, 0x40, 0x21, 0x00, 0x00, 0x33, 0xc9, 0x44, 0x88, 0x5d, 0x80, + 0x4c, 0x89, 0x6d, 0x98, 0x41, 0xba, 0x01, 0x00, 0x00, 0x00, 0x4c, 0x89, + 0x55, 0xa0, 0x48, 0x89, 0x4d, 0xe8, 0x48, 0x83, 0xf8, 0x0a, 0x0f, 0x84, + 0x76, 0x08, 0x00, 0x00, 0x48, 0x83, 0xf8, 0x0d, 0x0f, 0x84, 0x2a, 0x08, + 0x00, 0x00, 0x48, 0x83, 0xf8, 0x25, 0x74, 0x0e, 0x48, 0x8d, 0x75, 0xd0, + 0x49, 0x0f, 0xba, 0xee, 0x0a, 0xe9, 0xcb, 0x02, 0x00, 0x00, 0x48, 0x8b, + 0x75, 0xb0, 0x4c, 0x8b, 0x7d, 0xa8, 0x48, 0x8b, 0x7d, 0xe0, 0x49, 0x8b, + 0xd4, 0x4c, 0x8b, 0xce, 0x4c, 0x03, 0xe3, 0x4d, 0x8b, 0xd7, 0x4c, 0x89, + 0x65, 0x90, 0x4c, 0x8b, 0xde, 0x4d, 0x8b, 0xc7, 0x48, 0x83, 0xfb, 0x01, + 0x75, 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, + 0xc1, 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, 0x0b, + 0xc8, 0x48, 0x23, 0xcf, 0x48, 0x89, 0x4d, 0xd0, 0x48, 0x83, 0xf9, 0x32, + 0x0f, 0x87, 0x20, 0x01, 0x00, 0x00, 0x74, 0x4c, 0x48, 0x8b, 0xc1, 0x48, + 0x85, 0xc9, 0x0f, 0x84, 0xb5, 0x01, 0x00, 0x00, 0x48, 0x83, 0xe8, 0x20, + 0x0f, 0x84, 0xff, 0x00, 0x00, 0x00, 0x48, 0x83, 0xe8, 0x0a, 0x0f, 0x84, + 0x9d, 0x00, 0x00, 0x00, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0x8a, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xe8, 0x01, 0x74, 0x7b, 0x48, 0x83, 0xe8, 0x01, + 0x74, 0x6c, 0x48, 0x83, 0xe8, 0x01, 0x74, 0x5c, 0x48, 0x83, 0xe8, 0x02, + 0x74, 0x46, 0x48, 0x83, 0xf8, 0x01, 0x0f, 0x85, 0x84, 0x01, 0x00, 0x00, + 0x45, 0x33, 0xed, 0x4c, 0x89, 0x6d, 0x98, 0x48, 0x83, 0xf9, 0x30, 0x0f, + 0x82, 0x43, 0x01, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x39, 0x0f, 0x87, 0x35, + 0x01, 0x00, 0x00, 0x4f, 0x8d, 0x6c, 0xad, 0x00, 0x4c, 0x03, 0xe3, 0x4d, + 0x8d, 0x6d, 0xe8, 0x4e, 0x8d, 0x2c, 0x69, 0x48, 0x83, 0xfb, 0x01, 0x0f, + 0x85, 0xfb, 0x00, 0x00, 0x00, 0x33, 0xc0, 0xe9, 0xfd, 0x00, 0x00, 0x00, + 0x49, 0x0f, 0xba, 0xe6, 0x0b, 0x72, 0xbd, 0x49, 0x83, 0xce, 0x20, 0x45, + 0x33, 0xed, 0xeb, 0xc5, 0x49, 0x0f, 0xba, 0xee, 0x0b, 0xe9, 0x18, 0xff, + 0xff, 0xff, 0x49, 0x83, 0xce, 0x01, 0xe9, 0x0f, 0xff, 0xff, 0xff, 0x49, + 0x83, 0xce, 0x08, 0xe9, 0x06, 0xff, 0xff, 0xff, 0x49, 0x83, 0xce, 0x02, + 0xe9, 0xfd, 0xfe, 0xff, 0xff, 0x49, 0x0f, 0xba, 0xe6, 0x0b, 0x72, 0x2b, + 0x49, 0x0f, 0xba, 0xee, 0x09, 0x48, 0x85, 0xf6, 0x75, 0x0a, 0x49, 0x83, + 0xc7, 0x08, 0x4c, 0x89, 0x7d, 0xa8, 0xeb, 0x0b, 0x48, 0x83, 0xc6, 0x08, + 0x4d, 0x8b, 0xc3, 0x48, 0x89, 0x75, 0xb0, 0x49, 0x8b, 0x00, 0x48, 0x89, + 0x45, 0xd8, 0xe9, 0xcb, 0xfe, 0xff, 0xff, 0x48, 0x85, 0xf6, 0x75, 0x0d, + 0x49, 0x8b, 0x02, 0x49, 0x83, 0xc7, 0x08, 0x4c, 0x89, 0x7d, 0xa8, 0xeb, + 0x0b, 0x49, 0x8b, 0x01, 0x48, 0x83, 0xc6, 0x08, 0x48, 0x89, 0x75, 0xb0, + 0x48, 0x89, 0x45, 0xa0, 0xe9, 0xa5, 0xfe, 0xff, 0xff, 0x49, 0x83, 0xce, + 0x04, 0xe9, 0x9c, 0xfe, 0xff, 0xff, 0x48, 0x8b, 0xc1, 0x48, 0x83, 0xe8, + 0x33, 0x0f, 0x84, 0x21, 0xff, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, + 0x84, 0x17, 0xff, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0x0d, + 0xff, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0x03, 0xff, 0xff, + 0xff, 0x48, 0x83, 0xe8, 0x01, 0x0f, 0x84, 0xf9, 0xfe, 0xff, 0xff, 0x48, + 0x83, 0xe8, 0x01, 0x0f, 0x84, 0xef, 0xfe, 0xff, 0xff, 0x48, 0x83, 0xe8, + 0x01, 0x0f, 0x84, 0xe5, 0xfe, 0xff, 0xff, 0x48, 0x83, 0xe8, 0x13, 0x74, + 0x06, 0x48, 0x83, 0xf8, 0x20, 0x75, 0x5d, 0x49, 0x83, 0xce, 0x10, 0xe9, + 0x3e, 0xfe, 0xff, 0xff, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, 0xe0, + 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, 0x0b, 0xc8, 0x48, + 0x23, 0xcf, 0x48, 0x83, 0xf9, 0x30, 0x0f, 0x83, 0xc1, 0xfe, 0xff, 0xff, + 0x4c, 0x89, 0x6d, 0x98, 0x4c, 0x2b, 0xe3, 0x49, 0x0f, 0xba, 0xe6, 0x0b, + 0x72, 0x0e, 0x49, 0x0f, 0xba, 0xee, 0x09, 0x4c, 0x89, 0x6d, 0xd8, 0xe9, + 0x02, 0xfe, 0xff, 0xff, 0x4c, 0x89, 0x6d, 0xa0, 0xe9, 0xf9, 0xfd, 0xff, + 0xff, 0x33, 0xc0, 0x48, 0x89, 0x55, 0x90, 0x48, 0x89, 0x45, 0xa0, 0x48, + 0x8b, 0xfa, 0xeb, 0x03, 0x49, 0x8b, 0xfc, 0x4c, 0x8b, 0x5d, 0xa8, 0x49, + 0x8b, 0xdf, 0x4d, 0x8b, 0xcb, 0x4d, 0x8b, 0xef, 0x49, 0x8b, 0xd7, 0x48, + 0x83, 0xf9, 0x64, 0x0f, 0x87, 0x81, 0x01, 0x00, 0x00, 0x0f, 0x84, 0x56, + 0x03, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x0a, 0x0f, 0x84, 0x12, 0x01, 0x00, + 0x00, 0x48, 0x83, 0xf9, 0x0d, 0x0f, 0x84, 0xb7, 0x00, 0x00, 0x00, 0x48, + 0x83, 0xf9, 0x25, 0x0f, 0x84, 0x9f, 0x01, 0x00, 0x00, 0x48, 0x83, 0xf9, + 0x53, 0x0f, 0x84, 0x1b, 0x02, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x58, 0x0f, + 0x84, 0x0d, 0x03, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x61, 0x0f, 0x84, 0x0c, + 0x02, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x63, 0x0f, 0x85, 0x77, 0x01, 0x00, + 0x00, 0x48, 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x4c, 0x8b, 0xde, + 0x48, 0x89, 0x4d, 0xb0, 0x41, 0x0f, 0xb7, 0x03, 0x48, 0x8d, 0x75, 0x08, + 0x48, 0x89, 0x45, 0x08, 0x49, 0x0f, 0xba, 0xee, 0x0a, 0x4c, 0x8b, 0x65, + 0x90, 0x4c, 0x8b, 0x6d, 0x98, 0x44, 0x8a, 0x5d, 0x80, 0x4c, 0x8b, 0x55, + 0xa0, 0x4c, 0x8b, 0x7d, 0x88, 0x4d, 0x8b, 0xce, 0x41, 0x81, 0xe1, 0x00, + 0x04, 0x00, 0x00, 0x41, 0x8b, 0xc1, 0x48, 0xf7, 0xd8, 0x41, 0x8b, 0xc1, + 0x48, 0x1b, 0xd2, 0x48, 0xf7, 0xda, 0x48, 0xff, 0xc2, 0x48, 0xf7, 0xd8, + 0x48, 0x1b, 0xff, 0x81, 0xe7, 0x00, 0xff, 0x00, 0x00, 0x48, 0x81, 0xc7, + 0xff, 0x00, 0x00, 0x00, 0x49, 0x0f, 0xba, 0xe6, 0x0c, 0x0f, 0x83, 0x9e, + 0x05, 0x00, 0x00, 0x48, 0xf7, 0xda, 0x48, 0x8b, 0xda, 0xe9, 0xe4, 0x05, + 0x00, 0x00, 0x4c, 0x8b, 0x65, 0x90, 0x4c, 0x03, 0x65, 0xf0, 0x48, 0x83, + 0x7d, 0xf0, 0x01, 0x75, 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, + 0x44, 0x24, 0x01, 0xc1, 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, + 0x8d, 0x35, 0x6a, 0x1b, 0x00, 0x00, 0x48, 0x98, 0x48, 0x0b, 0xc8, 0x48, + 0x8d, 0x05, 0x62, 0x1b, 0x00, 0x00, 0x48, 0x23, 0x4d, 0xe0, 0x48, 0x83, + 0xf9, 0x0a, 0x48, 0x89, 0x4d, 0xd0, 0x4c, 0x0f, 0x45, 0xe7, 0x48, 0x0f, + 0x45, 0xf0, 0x4c, 0x89, 0x65, 0x90, 0xe9, 0x5a, 0xff, 0xff, 0xff, 0x4c, + 0x8b, 0x65, 0x90, 0x48, 0x8d, 0x35, 0x36, 0x1b, 0x00, 0x00, 0x4c, 0x03, + 0x65, 0xf0, 0x48, 0x83, 0x7d, 0xf0, 0x01, 0x4c, 0x89, 0x65, 0x90, 0x75, + 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, + 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x4c, 0x8b, 0x7d, 0x88, 0x4c, + 0x8b, 0x6d, 0x98, 0x44, 0x8a, 0x5d, 0x80, 0x4c, 0x8b, 0x55, 0xa0, 0x48, + 0x98, 0x48, 0x0b, 0xc8, 0x48, 0x23, 0x4d, 0xe0, 0x48, 0x89, 0x4d, 0xd0, + 0x48, 0x83, 0xf9, 0x0d, 0x0f, 0x84, 0x17, 0xff, 0xff, 0xff, 0x4c, 0x8b, + 0xe7, 0x48, 0x89, 0x7d, 0x90, 0xe9, 0x0b, 0xff, 0xff, 0xff, 0x48, 0x83, + 0xe9, 0x67, 0x0f, 0x84, 0x65, 0x03, 0x00, 0x00, 0x48, 0x83, 0xe9, 0x09, + 0x0f, 0x84, 0xa8, 0x01, 0x00, 0x00, 0x48, 0x83, 0xe9, 0x02, 0x0f, 0x84, + 0x00, 0x01, 0x00, 0x00, 0x48, 0x83, 0xe9, 0x01, 0x0f, 0x84, 0xa0, 0x00, + 0x00, 0x00, 0x48, 0x83, 0xe9, 0x01, 0x74, 0x1d, 0x48, 0x83, 0xe9, 0x01, + 0x0f, 0x84, 0x95, 0x01, 0x00, 0x00, 0x48, 0x83, 0xf9, 0x03, 0x0f, 0x84, + 0x86, 0x01, 0x00, 0x00, 0x48, 0x8d, 0x75, 0xd0, 0xe9, 0xa7, 0xfe, 0xff, + 0xff, 0x48, 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x4c, 0x8b, 0xce, + 0x48, 0x89, 0x4d, 0xb0, 0x4d, 0x8b, 0x09, 0x4d, 0x85, 0xc9, 0x75, 0x0c, + 0x48, 0x8d, 0x35, 0x39, 0x1a, 0x00, 0x00, 0xe9, 0x7d, 0xfe, 0xff, 0xff, + 0x41, 0x0f, 0xb6, 0x49, 0x04, 0x41, 0x0f, 0xb7, 0x11, 0x45, 0x0f, 0xb6, + 0x41, 0x03, 0x41, 0x0f, 0xb6, 0x41, 0x05, 0x45, 0x0f, 0xb6, 0x49, 0x02, + 0x89, 0x44, 0x24, 0x40, 0x89, 0x4c, 0x24, 0x38, 0x48, 0x8d, 0x4d, 0x28, + 0x89, 0x54, 0x24, 0x30, 0x44, 0x89, 0x44, 0x24, 0x28, 0x45, 0x33, 0xc0, + 0x44, 0x89, 0x4c, 0x24, 0x20, 0x4c, 0x8d, 0x0d, 0x08, 0x1a, 0x00, 0x00, + 0x41, 0x8d, 0x50, 0x26, 0xe8, 0x5b, 0x08, 0x00, 0x00, 0x48, 0x8d, 0x75, + 0x28, 0xe9, 0x2f, 0xfe, 0xff, 0xff, 0x49, 0x0f, 0xba, 0xee, 0x0a, 0x48, + 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, 0x45, 0xa8, + 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x4c, 0x8b, 0xfe, 0x48, 0x89, + 0x4d, 0xb0, 0x49, 0x8b, 0x37, 0x48, 0x85, 0xf6, 0x75, 0x0c, 0x49, 0x0f, + 0xba, 0xf6, 0x0a, 0x48, 0x8d, 0x35, 0x5a, 0x19, 0x00, 0x00, 0x4c, 0x8b, + 0x7d, 0x88, 0x4c, 0x8b, 0x65, 0x90, 0x4c, 0x8b, 0x6d, 0x98, 0x49, 0x0f, + 0xba, 0xe6, 0x0b, 0x0f, 0x82, 0xc3, 0x03, 0x00, 0x00, 0x45, 0x33, 0xd2, + 0x45, 0x8a, 0xda, 0xe9, 0xed, 0xfd, 0xff, 0xff, 0x48, 0x8b, 0x4d, 0xb0, + 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, 0x45, 0xa8, 0x08, 0xeb, 0x0b, + 0x48, 0x83, 0xc1, 0x08, 0x48, 0x8b, 0xd6, 0x48, 0x89, 0x4d, 0xb0, 0x48, + 0x8b, 0x0a, 0x48, 0x8d, 0x75, 0x28, 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc8, 0x72, 0x2b, 0x48, 0xb8, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x48, 0x8b, 0xd1, 0x48, 0x23, + 0xd0, 0x48, 0x8d, 0x42, 0xff, 0x48, 0x83, 0xf8, 0x22, 0x77, 0x32, 0x48, + 0x6b, 0xc2, 0x15, 0x48, 0x8d, 0x35, 0x4a, 0x1a, 0x00, 0x00, 0x48, 0x83, + 0xc6, 0xeb, 0xeb, 0x11, 0x48, 0x83, 0xf9, 0x07, 0x77, 0x1b, 0x48, 0x6b, + 0xf1, 0x19, 0x48, 0x8d, 0x05, 0x63, 0x19, 0x00, 0x00, 0x48, 0x03, 0xf0, + 0x48, 0x8d, 0x45, 0x28, 0x48, 0x3b, 0xf0, 0x0f, 0x85, 0x5c, 0xfd, 0xff, + 0xff, 0x45, 0x33, 0xc0, 0x48, 0x89, 0x4c, 0x24, 0x20, 0x4c, 0x8d, 0x0d, + 0x30, 0x19, 0x00, 0x00, 0x48, 0x8d, 0x4d, 0x28, 0x41, 0x8d, 0x50, 0x26, + 0xe8, 0x63, 0x07, 0x00, 0x00, 0xe9, 0x3b, 0xfd, 0xff, 0xff, 0x49, 0x83, + 0xe6, 0xd9, 0x49, 0x83, 0xce, 0x10, 0x49, 0x83, 0xce, 0x20, 0x49, 0x0f, + 0xba, 0xee, 0x07, 0x45, 0x84, 0xf6, 0x78, 0x09, 0x49, 0x83, 0xe6, 0xfd, + 0x49, 0x0f, 0xba, 0xee, 0x0e, 0x48, 0x8b, 0x45, 0xb0, 0x49, 0x8b, 0xce, + 0x83, 0xe1, 0x10, 0x75, 0x1d, 0x48, 0x85, 0xc0, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc0, 0x08, 0x4c, 0x8b, 0xee, + 0x48, 0x89, 0x45, 0xb0, 0x49, 0x63, 0x5d, 0x00, 0xeb, 0x1a, 0x48, 0x85, + 0xc0, 0x75, 0x0a, 0x48, 0x83, 0x45, 0xa8, 0x08, 0x49, 0x8b, 0x1f, 0xeb, + 0x0b, 0x48, 0x8b, 0x1e, 0x48, 0x83, 0xc0, 0x08, 0x48, 0x89, 0x45, 0xb0, + 0x41, 0x8a, 0xc6, 0xc0, 0xe0, 0x03, 0x24, 0x20, 0x0f, 0xb6, 0xf8, 0x41, + 0xf6, 0xc6, 0x02, 0xb8, 0x2b, 0x00, 0x00, 0x00, 0x0f, 0x45, 0xf8, 0x49, + 0x8b, 0xc6, 0x83, 0xe0, 0x08, 0x89, 0x7d, 0xc0, 0x41, 0x0f, 0x95, 0xc7, + 0x44, 0x88, 0x7d, 0x81, 0x45, 0x84, 0xf6, 0x78, 0x45, 0x41, 0xb8, 0x0a, + 0x00, 0x00, 0x00, 0x48, 0x85, 0xc0, 0x74, 0x0c, 0x49, 0x83, 0xe6, 0xdf, + 0x48, 0xc7, 0x45, 0xa0, 0x01, 0x00, 0x00, 0x00, 0x49, 0x8b, 0xc6, 0x25, + 0x00, 0x40, 0x00, 0x00, 0x48, 0x85, 0xdb, 0x79, 0x14, 0x48, 0x85, 0xc0, + 0x75, 0x14, 0x49, 0x83, 0xce, 0x02, 0x40, 0xb7, 0x2d, 0x89, 0x7d, 0xc0, + 0x48, 0xf7, 0xdb, 0xeb, 0x26, 0x48, 0x85, 0xc0, 0x74, 0x21, 0x41, 0xf6, + 0xc6, 0x10, 0x75, 0x1b, 0xeb, 0x17, 0x45, 0x32, 0xff, 0x41, 0xb8, 0x10, + 0x00, 0x00, 0x00, 0x44, 0x88, 0x7d, 0x81, 0x48, 0x85, 0xc9, 0x75, 0x07, + 0x48, 0x85, 0xdb, 0x79, 0x02, 0x8b, 0xdb, 0x48, 0x8b, 0xd3, 0x48, 0x8d, + 0x4d, 0x28, 0xe8, 0x91, 0xf6, 0xff, 0xff, 0x4c, 0x8b, 0x55, 0xa0, 0x48, + 0x8b, 0xf0, 0x4c, 0x8b, 0xc6, 0x48, 0x8d, 0x45, 0x28, 0x4c, 0x2b, 0xc0, + 0x48, 0x85, 0xdb, 0x75, 0x1e, 0x4d, 0x85, 0xd2, 0x75, 0x19, 0x45, 0x33, + 0xc0, 0x48, 0x8d, 0x75, 0x28, 0x33, 0xc9, 0x49, 0xb9, 0xab, 0xaa, 0xaa, + 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x48, 0x89, 0x4d, 0xe8, 0xeb, 0x31, 0x49, + 0xb9, 0xab, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x49, 0x8b, 0xd8, + 0x49, 0x8b, 0xc1, 0x49, 0xf7, 0xe0, 0x48, 0xd1, 0xea, 0x48, 0x8d, 0x04, + 0x52, 0x48, 0x2b, 0xd8, 0x48, 0x89, 0x5d, 0xe8, 0x74, 0x0e, 0x48, 0x8b, + 0xd8, 0x49, 0x2b, 0xd8, 0x48, 0x83, 0xc3, 0x03, 0x48, 0x89, 0x5d, 0xe8, + 0x45, 0x84, 0xff, 0x74, 0x15, 0x4d, 0x85, 0xc0, 0x74, 0x10, 0x49, 0x8d, + 0x48, 0xff, 0x49, 0x8b, 0xc1, 0x48, 0xf7, 0xe1, 0x48, 0xd1, 0xea, 0x4c, + 0x03, 0xc2, 0x40, 0x84, 0xff, 0x74, 0x03, 0x49, 0xff, 0xc2, 0x4c, 0x8b, + 0x65, 0x90, 0x4d, 0x8d, 0x68, 0x01, 0x40, 0x84, 0xff, 0x41, 0xb3, 0x01, + 0x4d, 0x0f, 0x44, 0xe8, 0x49, 0x0f, 0xba, 0xee, 0x0c, 0x49, 0x8b, 0xc6, + 0x4c, 0x89, 0x6d, 0x98, 0x25, 0x21, 0x0a, 0x00, 0x00, 0x48, 0x3d, 0x20, + 0x02, 0x00, 0x00, 0x4c, 0x0f, 0x44, 0x55, 0xd8, 0xe9, 0x98, 0xfb, 0xff, + 0xff, 0x48, 0x8b, 0x4d, 0xb0, 0x48, 0x85, 0xc9, 0x75, 0x07, 0x48, 0x83, + 0x45, 0xa8, 0x08, 0xeb, 0x0b, 0x48, 0x83, 0xc1, 0x08, 0x48, 0x8b, 0xde, + 0x48, 0x89, 0x4d, 0xb0, 0x48, 0x8b, 0x1b, 0x48, 0x85, 0xdb, 0x75, 0x0c, + 0x48, 0x8d, 0x35, 0xcd, 0x16, 0x00, 0x00, 0xe9, 0x59, 0xfb, 0xff, 0xff, + 0x44, 0x8b, 0x3b, 0x48, 0x8d, 0x7b, 0x04, 0x48, 0x85, 0xff, 0x75, 0x16, + 0x4c, 0x8d, 0x05, 0x75, 0x11, 0x00, 0x00, 0x8d, 0x57, 0x1e, 0x48, 0x8d, + 0x0d, 0x3b, 0x13, 0x00, 0x00, 0xe8, 0x32, 0xf2, 0xff, 0xff, 0x0f, 0xb7, + 0x37, 0x48, 0x8d, 0x7b, 0x06, 0x48, 0x85, 0xff, 0x75, 0x16, 0x4c, 0x8d, + 0x05, 0x53, 0x11, 0x00, 0x00, 0x8d, 0x57, 0x1e, 0x48, 0x8d, 0x0d, 0x19, + 0x13, 0x00, 0x00, 0xe8, 0x10, 0xf2, 0xff, 0xff, 0x0f, 0xb6, 0x4b, 0x0e, + 0x0f, 0xb6, 0x53, 0x0d, 0x44, 0x0f, 0xb6, 0x43, 0x0c, 0x44, 0x0f, 0xb6, + 0x4b, 0x0b, 0x0f, 0xb6, 0x43, 0x0f, 0x44, 0x0f, 0xb6, 0x53, 0x0a, 0x44, + 0x0f, 0xb6, 0x5b, 0x09, 0x0f, 0xb6, 0x5b, 0x08, 0x0f, 0xb7, 0x3f, 0x89, + 0x44, 0x24, 0x70, 0x89, 0x4c, 0x24, 0x68, 0x48, 0x8d, 0x4d, 0x28, 0x89, + 0x54, 0x24, 0x60, 0x44, 0x89, 0x44, 0x24, 0x58, 0x45, 0x33, 0xc0, 0x44, + 0x89, 0x4c, 0x24, 0x50, 0x4c, 0x8d, 0x0d, 0x49, 0x16, 0x00, 0x00, 0x44, + 0x89, 0x54, 0x24, 0x48, 0x44, 0x89, 0x5c, 0x24, 0x40, 0x89, 0x5c, 0x24, + 0x38, 0x41, 0x8d, 0x50, 0x26, 0x89, 0x7c, 0x24, 0x30, 0x89, 0x74, 0x24, + 0x28, 0x44, 0x89, 0x7c, 0x24, 0x20, 0xe8, 0xc9, 0x04, 0x00, 0x00, 0xe9, + 0x69, 0xfc, 0xff, 0xff, 0x4c, 0x03, 0xe3, 0x49, 0x3b, 0xda, 0x75, 0x04, + 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, 0xe0, + 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x8d, 0x35, 0x6b, 0x16, 0x00, + 0x00, 0x48, 0x98, 0x48, 0x0b, 0xc8, 0x49, 0x23, 0xc8, 0x48, 0x83, 0xf9, + 0x0a, 0x48, 0x89, 0x4d, 0xd0, 0x4c, 0x0f, 0x45, 0xe2, 0x48, 0x0f, 0x45, + 0xf7, 0x4c, 0x89, 0x65, 0x90, 0xe9, 0x73, 0xfa, 0xff, 0xff, 0x4c, 0x03, + 0xe3, 0x48, 0x8d, 0x35, 0x40, 0x16, 0x00, 0x00, 0x49, 0x3b, 0xda, 0x75, + 0x04, 0x33, 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, + 0xe0, 0x08, 0x41, 0x0f, 0xb6, 0x0c, 0x24, 0x48, 0x98, 0x48, 0x0b, 0xc8, + 0x49, 0x23, 0xc8, 0x48, 0x83, 0xf9, 0x0d, 0x48, 0x89, 0x4d, 0xd0, 0x4c, + 0x0f, 0x45, 0xe2, 0x4c, 0x89, 0x65, 0x90, 0xe9, 0x35, 0xfa, 0xff, 0xff, + 0x44, 0x8a, 0x5d, 0x80, 0x4c, 0x8b, 0x55, 0xa0, 0xe9, 0x28, 0xfa, 0xff, + 0xff, 0x45, 0x33, 0xed, 0x4c, 0x8d, 0x46, 0x01, 0x41, 0x80, 0x78, 0xff, + 0x00, 0x75, 0x0e, 0x48, 0x8b, 0xda, 0x4d, 0x85, 0xc9, 0x74, 0x37, 0x41, + 0x80, 0x38, 0x00, 0x74, 0x31, 0x4d, 0x3b, 0xea, 0x72, 0x0a, 0x48, 0x8b, + 0xda, 0x49, 0x0f, 0xba, 0xe6, 0x0b, 0x72, 0x22, 0x41, 0x0f, 0xbe, 0x00, + 0x48, 0x8b, 0xda, 0xc1, 0xe0, 0x08, 0x48, 0x63, 0xc8, 0x41, 0x0f, 0xb6, + 0x40, 0xff, 0x48, 0x0b, 0xc8, 0x48, 0x85, 0xcf, 0x74, 0x08, 0x49, 0xff, + 0xc5, 0x4c, 0x03, 0xc2, 0xeb, 0xba, 0x4c, 0x89, 0x6d, 0x98, 0x4c, 0x8b, + 0x4d, 0xc8, 0x4d, 0x3b, 0xd5, 0x49, 0x8b, 0xc6, 0x4d, 0x0f, 0x42, 0xd5, + 0x4c, 0x8b, 0x6d, 0xf8, 0x25, 0x01, 0x02, 0x00, 0x00, 0x4c, 0x89, 0x55, + 0xa0, 0x48, 0x3d, 0x00, 0x02, 0x00, 0x00, 0x75, 0x49, 0x4c, 0x8b, 0x45, + 0xd8, 0x4d, 0x2b, 0xc2, 0x49, 0x8b, 0xc0, 0x49, 0x0f, 0xaf, 0xc5, 0x4c, + 0x03, 0xc8, 0x4c, 0x89, 0x4d, 0xc8, 0x49, 0x0f, 0xba, 0xe6, 0x0d, 0x72, + 0x2d, 0x48, 0x8b, 0x55, 0xb8, 0x4d, 0x85, 0xff, 0x74, 0x28, 0x41, 0xb9, + 0x20, 0x00, 0x00, 0x00, 0x4c, 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xcf, + 0xe8, 0x83, 0xf3, 0xff, 0xff, 0x4c, 0x8b, 0x55, 0xa0, 0x4c, 0x8b, 0xf8, + 0x4c, 0x8b, 0x4d, 0xc8, 0x48, 0x89, 0x45, 0x88, 0xeb, 0x04, 0x48, 0x8b, + 0x55, 0xb8, 0x45, 0x84, 0xdb, 0x0f, 0x84, 0x93, 0x01, 0x00, 0x00, 0x8b, + 0x45, 0xc0, 0x84, 0xc0, 0x74, 0x46, 0x4d, 0x03, 0xcd, 0x49, 0x0f, 0xba, + 0xe6, 0x0d, 0x72, 0x3c, 0x4c, 0x8b, 0x5d, 0xb8, 0x4d, 0x85, 0xff, 0x74, + 0x37, 0x0f, 0xb6, 0xd0, 0x33, 0xc9, 0x4d, 0x3b, 0xfb, 0x73, 0x23, 0x41, + 0x88, 0x07, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x0e, 0x48, 0x8b, 0xc2, 0x48, + 0xc1, 0xe8, 0x08, 0x41, 0x88, 0x47, 0x01, 0x8b, 0x45, 0xc0, 0x4d, 0x03, + 0xfd, 0x48, 0xff, 0xc1, 0x48, 0x83, 0xf9, 0x01, 0x7c, 0xd8, 0x4c, 0x89, + 0x7d, 0x88, 0xeb, 0x04, 0x4c, 0x8b, 0x5d, 0xb8, 0x4d, 0x8b, 0xc2, 0x4c, + 0x2b, 0x45, 0x98, 0x49, 0x8b, 0xc0, 0x49, 0x0f, 0xaf, 0xc5, 0x4c, 0x03, + 0xc8, 0x4c, 0x89, 0x4d, 0xc8, 0x49, 0x0f, 0xba, 0xe6, 0x0d, 0x72, 0x22, + 0x4d, 0x85, 0xff, 0x74, 0x1d, 0x41, 0xb9, 0x30, 0x00, 0x00, 0x00, 0x4c, + 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xd3, 0x49, 0x8b, 0xcf, 0xe8, 0xdd, + 0xf2, 0xff, 0xff, 0x4c, 0x8b, 0xf8, 0x48, 0x89, 0x45, 0x88, 0x4c, 0x8b, + 0x5d, 0xb8, 0x45, 0x33, 0xc0, 0x44, 0x38, 0x45, 0xc0, 0x41, 0x0f, 0x95, + 0xc0, 0x4c, 0x3b, 0x45, 0x98, 0x0f, 0x83, 0x9c, 0x01, 0x00, 0x00, 0x4c, + 0x8b, 0x55, 0x98, 0x4d, 0x8b, 0xce, 0x4c, 0x8b, 0x65, 0xe8, 0x41, 0x81, + 0xe1, 0x00, 0x20, 0x00, 0x00, 0x80, 0x3e, 0x00, 0x75, 0x14, 0x48, 0x83, + 0xfb, 0x01, 0x0f, 0x8e, 0x73, 0x01, 0x00, 0x00, 0x80, 0x7e, 0x01, 0x00, + 0x0f, 0x84, 0x69, 0x01, 0x00, 0x00, 0x0f, 0xb6, 0x06, 0x0f, 0xb6, 0x4e, + 0x01, 0x48, 0xc1, 0xe1, 0x08, 0x48, 0x0b, 0xc8, 0x48, 0x8b, 0x45, 0xc8, + 0x49, 0x03, 0xc5, 0x48, 0x23, 0xcf, 0x48, 0x89, 0x45, 0xc8, 0x4d, 0x85, + 0xc9, 0x75, 0x30, 0x4d, 0x85, 0xff, 0x74, 0x2b, 0x33, 0xd2, 0x4d, 0x3b, + 0xfb, 0x73, 0x20, 0x41, 0x88, 0x0f, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x0b, + 0x48, 0x8b, 0xc1, 0x48, 0xc1, 0xe8, 0x08, 0x41, 0x88, 0x47, 0x01, 0x4d, + 0x03, 0xfd, 0x48, 0xff, 0xc2, 0x48, 0x83, 0xfa, 0x01, 0x7c, 0xdb, 0x48, + 0x8b, 0x45, 0xc8, 0x48, 0x03, 0xf3, 0x49, 0xff, 0xc0, 0x80, 0x7d, 0x81, + 0x00, 0x0f, 0x84, 0xff, 0x00, 0x00, 0x00, 0x49, 0xff, 0xc4, 0x49, 0x83, + 0xfc, 0x03, 0x0f, 0x85, 0xf2, 0x00, 0x00, 0x00, 0x45, 0x33, 0xe4, 0x49, + 0xff, 0xc0, 0x4d, 0x3b, 0xc2, 0x0f, 0x83, 0xec, 0x00, 0x00, 0x00, 0x49, + 0x03, 0xc5, 0x48, 0x89, 0x45, 0xc8, 0x4d, 0x85, 0xc9, 0x0f, 0x85, 0x5a, + 0xff, 0xff, 0xff, 0x4d, 0x85, 0xff, 0x0f, 0x84, 0x51, 0xff, 0xff, 0xff, + 0x33, 0xc0, 0x4d, 0x3b, 0xfb, 0x0f, 0x83, 0x46, 0xff, 0xff, 0xff, 0x41, + 0xc6, 0x07, 0x2c, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x04, 0x45, 0x88, 0x67, + 0x01, 0x4d, 0x03, 0xfd, 0x48, 0xff, 0xc0, 0x48, 0x83, 0xf8, 0x01, 0x7c, + 0xdd, 0xe9, 0x27, 0xff, 0xff, 0xff, 0x4d, 0x8b, 0xc2, 0x4d, 0x8b, 0xde, + 0x4c, 0x2b, 0x45, 0x98, 0x49, 0x8b, 0xc0, 0x49, 0x0f, 0xaf, 0xc5, 0x4c, + 0x03, 0xc8, 0x4c, 0x89, 0x4d, 0xc8, 0x41, 0x81, 0xe3, 0x00, 0x20, 0x00, + 0x00, 0x75, 0x21, 0x4d, 0x85, 0xff, 0x74, 0x1c, 0x45, 0x8d, 0x4b, 0x20, + 0x4c, 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xcf, 0xe8, 0x9b, 0xf1, 0xff, + 0xff, 0x4c, 0x8b, 0x4d, 0xc8, 0x4c, 0x8b, 0xf8, 0x48, 0x89, 0x45, 0x88, + 0x8b, 0x45, 0xc0, 0x84, 0xc0, 0x0f, 0x84, 0xaf, 0xfe, 0xff, 0xff, 0x4d, + 0x03, 0xcd, 0x4c, 0x89, 0x4d, 0xc8, 0x4d, 0x85, 0xdb, 0x0f, 0x85, 0x9f, + 0xfe, 0xff, 0xff, 0x4c, 0x8b, 0x5d, 0xb8, 0x4d, 0x85, 0xff, 0x0f, 0x84, + 0x96, 0xfe, 0xff, 0xff, 0x0f, 0xb6, 0xd0, 0x33, 0xc9, 0x4d, 0x3b, 0xfb, + 0x73, 0x23, 0x41, 0x88, 0x07, 0x49, 0x83, 0xfd, 0x01, 0x74, 0x0e, 0x48, + 0x8b, 0xc2, 0x48, 0xc1, 0xe8, 0x08, 0x41, 0x88, 0x47, 0x01, 0x8b, 0x45, + 0xc0, 0x4d, 0x03, 0xfd, 0x48, 0xff, 0xc1, 0x48, 0x83, 0xf9, 0x01, 0x7c, + 0xd8, 0x4c, 0x89, 0x7d, 0x88, 0xe9, 0x60, 0xfe, 0xff, 0xff, 0x4d, 0x3b, + 0xc2, 0x0f, 0x82, 0x7e, 0xfe, 0xff, 0xff, 0x4c, 0x8b, 0x65, 0x90, 0x4c, + 0x89, 0x7d, 0x88, 0x48, 0x8b, 0x75, 0xc8, 0x41, 0xb9, 0x01, 0x02, 0x00, + 0x00, 0x49, 0x8b, 0xc6, 0x49, 0x23, 0xc1, 0x49, 0x3b, 0xc1, 0x75, 0x42, + 0x48, 0x8b, 0x4d, 0xd8, 0x48, 0x2b, 0x4d, 0xa0, 0x48, 0x8b, 0xc1, 0x49, + 0x0f, 0xaf, 0xc5, 0x48, 0x03, 0xf0, 0x48, 0x89, 0x75, 0xc8, 0x49, 0x0f, + 0xba, 0xe6, 0x0d, 0x72, 0x25, 0x4d, 0x85, 0xff, 0x74, 0x20, 0x4c, 0x8b, + 0xc1, 0x4c, 0x89, 0x6c, 0x24, 0x20, 0x49, 0x8b, 0xcf, 0x41, 0xb9, 0x20, + 0x00, 0x00, 0x00, 0x49, 0x8b, 0xd3, 0xe8, 0xd1, 0xf0, 0xff, 0xff, 0x4c, + 0x8b, 0xf8, 0x48, 0x89, 0x45, 0x88, 0x48, 0x8b, 0x5d, 0xf0, 0x4c, 0x03, + 0xe3, 0x4c, 0x89, 0x65, 0x90, 0x48, 0x83, 0xfb, 0x01, 0x75, 0x04, 0x33, + 0xc0, 0xeb, 0x09, 0x41, 0x0f, 0xbe, 0x44, 0x24, 0x01, 0xc1, 0xe0, 0x08, + 0x4c, 0x8b, 0x45, 0xe0, 0x48, 0x8d, 0x3d, 0x75, 0x12, 0x00, 0x00, 0x48, + 0x63, 0xc8, 0x41, 0x0f, 0xb6, 0x04, 0x24, 0x48, 0x0b, 0xc8, 0x49, 0x23, + 0xc8, 0x48, 0x89, 0x4d, 0xd0, 0x48, 0x8b, 0xc1, 0x0f, 0x85, 0x3f, 0xf3, + 0xff, 0xff, 0x49, 0x0f, 0xba, 0xe6, 0x0d, 0x73, 0x0a, 0x33, 0xd2, 0x48, + 0x8b, 0xc6, 0x49, 0xf7, 0xf5, 0xeb, 0x53, 0x4d, 0x85, 0xff, 0x75, 0x18, + 0x4c, 0x8d, 0x05, 0x7d, 0x0c, 0x00, 0x00, 0xba, 0x00, 0x05, 0x00, 0x00, + 0x48, 0x8d, 0x0d, 0x79, 0x0f, 0x00, 0x00, 0xe8, 0x38, 0xed, 0xff, 0xff, + 0x48, 0x8b, 0x55, 0xb8, 0x33, 0xc9, 0x49, 0x03, 0xd5, 0x49, 0x8b, 0xc7, + 0x48, 0x3b, 0xc2, 0x73, 0x19, 0xc6, 0x00, 0x00, 0x49, 0x83, 0xfd, 0x01, + 0x74, 0x04, 0xc6, 0x40, 0x01, 0x00, 0x49, 0x03, 0xc5, 0x48, 0xff, 0xc1, + 0x48, 0x83, 0xf9, 0x01, 0x7c, 0xe2, 0x4c, 0x2b, 0x7d, 0x00, 0x49, 0x8b, + 0xc7, 0x48, 0x99, 0x49, 0xf7, 0xfd, 0x48, 0x8b, 0x4d, 0x50, 0x48, 0x33, + 0xcc, 0xe8, 0x24, 0xeb, 0xff, 0xff, 0x48, 0x8b, 0x9c, 0x24, 0xb0, 0x01, + 0x00, 0x00, 0x48, 0x81, 0xc4, 0x60, 0x01, 0x00, 0x00, 0x41, 0x5f, 0x41, + 0x5e, 0x41, 0x5d, 0x41, 0x5c, 0x5f, 0x5e, 0x5d, 0xc3, 0xcc, 0xcc, 0xcc, + 0x4c, 0x8b, 0xdc, 0x4d, 0x89, 0x4b, 0x20, 0x48, 0x83, 0xec, 0x38, 0x49, + 0x8d, 0x43, 0x28, 0x49, 0xc7, 0x43, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x89, 0x43, 0xe8, 0xe8, 0x78, 0xf0, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x38, + 0xc3, 0xcc, 0xcc, 0xcc, 0x48, 0x89, 0x54, 0x24, 0x10, 0x48, 0x83, 0xec, + 0x28, 0x48, 0x8b, 0x05, 0x24, 0x16, 0x00, 0x00, 0x4c, 0x8d, 0x44, 0x24, + 0x38, 0xba, 0x82, 0x02, 0x00, 0x00, 0xb9, 0x04, 0x00, 0x00, 0x00, 0x4c, + 0x8b, 0x48, 0x40, 0x41, 0xff, 0xd1, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc1, 0x72, 0x04, 0x33, 0xc0, 0xeb, + 0x05, 0x48, 0x8b, 0x44, 0x24, 0x38, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0xcc, + 0x48, 0x83, 0xec, 0x28, 0x48, 0x8b, 0x05, 0xe5, 0x15, 0x00, 0x00, 0x48, + 0x8b, 0x50, 0x48, 0xff, 0xd2, 0x48, 0xb9, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0x48, 0x3b, 0xc1, 0x72, 0x2c, 0x4c, 0x8b, 0xc0, 0x48, + 0x8d, 0x15, 0x7e, 0x0a, 0x00, 0x00, 0xb9, 0x00, 0x00, 0x00, 0x80, 0xe8, + 0x60, 0xeb, 0xff, 0xff, 0x4c, 0x8d, 0x05, 0x95, 0x0a, 0x00, 0x00, 0xba, + 0x35, 0x03, 0x00, 0x00, 0x48, 0x8d, 0x0d, 0xe1, 0x14, 0x00, 0x00, 0xe8, + 0x20, 0xec, 0xff, 0xff, 0x48, 0x83, 0xc4, 0x28, 0xc3, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x65, 0x6c, 0x6c, + 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0a, 0x41, 0x53, 0x53, 0x45, 0x52, 0x54, 0x5f, 0x45, 0x46, 0x49, 0x5f, + 0x45, 0x52, 0x52, 0x4f, 0x52, 0x20, 0x28, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x20, 0x3d, 0x20, 0x25, 0x72, 0x29, 0x0a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x21, 0x28, 0x28, 0x28, 0x52, 0x45, 0x54, 0x55, + 0x52, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x29, 0x28, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x29, 0x29, 0x20, 0x3e, 0x3d, 0x20, 0x30, + 0x78, 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x30, 0x30, 0x30, 0x55, 0x4c, 0x4c, 0x29, 0x00, 0x00, 0x00, + 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, 0x20, 0x00, 0x48, 0x00, + 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x20, 0x00, 0x57, 0x00, + 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x21, 0x00, 0x0a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x21, + 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, + 0x30, 0x29, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4c, + 0x69, 0x62, 0x53, 0x74, 0x64, 0x45, 0x72, 0x72, 0x5c, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x41, 0x53, 0x53, 0x45, + 0x52, 0x54, 0x20, 0x5b, 0x25, 0x61, 0x5d, 0x20, 0x25, 0x61, 0x28, 0x25, + 0x64, 0x29, 0x3a, 0x20, 0x25, 0x61, 0x0a, 0x00, 0x42, 0x75, 0x66, 0x66, + 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, 0x00, 0x67, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x20, 0x21, 0x3d, 0x20, + 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, 0x6f, 0x6f, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, + 0x69, 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x42, 0x6f, 0x6f, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, 0x67, 0x42, 0x53, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x52, 0x54, 0x20, + 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, + 0x20, 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x55, 0x65, 0x66, 0x69, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x65, + 0x66, 0x69, 0x4c, 0x69, 0x62, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x2e, 0x63, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x55, 0x49, + 0x4e, 0x54, 0x4e, 0x29, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x29, + 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x43, 0x6f, 0x6e, 0x73, 0x6f, 0x6c, 0x65, 0x20, 0x21, 0x3d, 0x20, 0x28, + 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x00, + 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x30, 0x30, 0x30, 0x30, + 0x30, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x55, 0x6e, + 0x61, 0x6c, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x4c, 0x69, 0x62, 0x5c, 0x53, 0x61, 0x66, 0x65, 0x53, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x63, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x20, 0x21, 0x3d, 0x20, 0x28, 0x28, 0x76, 0x6f, 0x69, + 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x44, 0x69, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, + 0x21, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, + 0x49, 0x4e, 0x54, 0x4e, 0x29, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4f, 0x66, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x29, 0x29, 0x20, 0x26, + 0x20, 0x30, 0x78, 0x30, 0x31, 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, + 0x73, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x5c, 0x50, + 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x28, 0x28, 0x55, 0x49, 0x4e, 0x54, 0x4e, + 0x29, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x29, 0x29, 0x20, 0x26, 0x20, 0x30, 0x78, 0x30, 0x31, + 0x29, 0x20, 0x3d, 0x3d, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, + 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, + 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, + 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, + 0x69, 0x62, 0x5c, 0x50, 0x72, 0x69, 0x6e, 0x74, 0x4c, 0x69, 0x62, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x2e, 0x63, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x20, + 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, + 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, + 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, + 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x21, 0x3d, 0x20, 0x28, + 0x28, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x2a, 0x29, 0x20, 0x30, 0x29, 0x29, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x28, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, + 0x69, 0x7a, 0x65, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, + 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x55, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x53, 0x74, 0x72, 0x6e, 0x4c, 0x65, 0x6e, 0x53, 0x20, 0x28, 0x28, + 0x43, 0x48, 0x41, 0x52, 0x31, 0x36, 0x20, 0x2a, 0x29, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, + 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x55, + 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x20, 0x2b, 0x20, 0x31, 0x29, + 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, + 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, + 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x55, 0x6e, + 0x69, 0x63, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x6e, 0x4c, 0x65, + 0x6e, 0x53, 0x20, 0x28, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, + 0x28, 0x5f, 0x67, 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, + 0x41, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, + 0x74, 0x72, 0x69, 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, + 0x20, 0x2b, 0x20, 0x31, 0x29, 0x20, 0x3c, 0x3d, 0x20, 0x28, 0x5f, 0x67, + 0x50, 0x63, 0x64, 0x5f, 0x46, 0x69, 0x78, 0x65, 0x64, 0x41, 0x74, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x50, 0x63, 0x64, 0x4d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x41, 0x73, 0x63, 0x69, 0x69, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x29, 0x29, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, 0x6c, 0x20, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x3e, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, + 0x6c, 0x20, 0x67, 0x75, 0x69, 0x64, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x30, 0x38, 0x78, 0x2d, 0x25, 0x30, 0x34, 0x78, 0x2d, 0x25, 0x30, + 0x34, 0x78, 0x2d, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x2d, + 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, 0x25, 0x30, 0x32, 0x78, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x6e, 0x75, 0x6c, + 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x30, 0x32, 0x64, 0x2f, 0x25, 0x30, 0x32, 0x64, 0x2f, 0x25, 0x30, + 0x34, 0x64, 0x20, 0x20, 0x25, 0x30, 0x32, 0x64, 0x3a, 0x25, 0x30, 0x32, + 0x64, 0x00, 0x00, 0x00, 0x25, 0x30, 0x38, 0x58, 0x00, 0x00, 0x00, 0x00, + 0x0d, 0x0a, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x20, 0x47, 0x6c, 0x79, 0x70, 0x68, 0x00, 0x00, + 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, + 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x54, 0x6f, 0x6f, 0x20, 0x53, + 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x53, 0x74, 0x61, 0x6c, 0x65, 0x20, 0x44, 0x61, 0x74, 0x61, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x20, 0x52, 0x65, 0x73, 0x65, 0x74, 0x20, 0x52, 0x65, 0x71, + 0x75, 0x69, 0x72, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4c, 0x6f, 0x61, 0x64, 0x20, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x00, 0x00, 0x00, 0x00, 0x55, 0x6e, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x61, 0x64, 0x20, 0x42, + 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x53, 0x69, 0x7a, 0x65, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x20, 0x54, + 0x6f, 0x6f, 0x20, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x52, 0x65, 0x61, 0x64, 0x79, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x65, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x20, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4f, 0x75, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x43, 0x6f, 0x72, 0x72, + 0x75, 0x70, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x20, 0x46, 0x75, 0x6c, 0x6c, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x4d, 0x65, + 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x4e, 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x20, 0x44, 0x65, 0x6e, 0x69, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x20, 0x6d, 0x61, 0x70, 0x70, 0x69, + 0x6e, 0x67, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x54, 0x69, 0x6d, 0x65, 0x20, 0x6f, 0x75, 0x74, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, + 0x74, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x6c, 0x72, 0x65, 0x61, + 0x64, 0x79, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x43, 0x4d, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x46, + 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, + 0x69, 0x62, 0x6c, 0x65, 0x20, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x00, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x56, 0x69, + 0x6f, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x43, 0x52, + 0x43, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x6e, 0x64, 0x20, 0x6f, + 0x66, 0x20, 0x4d, 0x65, 0x64, 0x69, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, + 0x20, 0x28, 0x32, 0x39, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x28, 0x33, + 0x30, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x6e, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x46, 0x69, 0x6c, 0x65, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x20, 0x4c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x6f, 0x6d, 0x69, + 0x73, 0x65, 0x64, 0x20, 0x44, 0x61, 0x74, 0x61, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x49, 0x50, 0x20, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x20, + 0x43, 0x6f, 0x6e, 0x66, 0x6c, 0x69, 0x63, 0x74, 0x00, 0x00, 0x48, 0x54, + 0x54, 0x50, 0x20, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x51, 0x3a, 0x5c, 0x73, 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, + 0x73, 0x65, 0x63, 0x6f, 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, + 0x67, 0x5c, 0x4c, 0x69, 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x55, 0x65, + 0x66, 0x69, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x5c, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x62, 0x2e, 0x63, 0x00, 0x51, 0x3a, 0x5c, 0x73, + 0x72, 0x63, 0x5c, 0x6d, 0x75, 0x5f, 0x62, 0x61, 0x73, 0x65, 0x63, 0x6f, + 0x72, 0x65, 0x5c, 0x4d, 0x64, 0x65, 0x50, 0x6b, 0x67, 0x5c, 0x4c, 0x69, + 0x62, 0x72, 0x61, 0x72, 0x79, 0x5c, 0x42, 0x61, 0x73, 0x65, 0x4c, 0x69, + 0x62, 0x5c, 0x44, 0x69, 0x76, 0x55, 0x36, 0x34, 0x78, 0x33, 0x32, 0x52, + 0x65, 0x6d, 0x61, 0x69, 0x6e, 0x64, 0x65, 0x72, 0x2e, 0x63, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x80, 0x18, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x01, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x09, 0x04, 0x00, 0x00, 0x48, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, + 0x1e, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x03, 0x00, 0x48, 0x00, 0x49, 0x00, 0x49, 0x00, 0x6e, 0x93, 0x87, 0x69, + 0x34, 0xed, 0xdb, 0x44, 0xae, 0x97, 0x1f, 0xa5, 0xe4, 0xed, 0x21, 0x16, + 0x1d, 0x01, 0x00, 0x00, 0x05, 0x01, 0x00, 0x04, 0x34, 0x00, 0x00, 0x00, + 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x00, 0x65, 0x6e, 0x2d, 0x55, 0x53, 0x00, 0x14, 0x45, 0x00, 0x6e, + 0x00, 0x67, 0x00, 0x6c, 0x00, 0x69, 0x00, 0x73, 0x00, 0x68, 0x00, 0x00, + 0x00, 0x14, 0x2e, 0x00, 0x54, 0x00, 0x48, 0x00, 0x20, 0x00, 0x48, 0x00, + 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x57, 0x00, 0x6f, 0x00, + 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x30, 0x00, 0x20, 0x00, + 0x22, 0x00, 0x44, 0x00, 0x69, 0x00, 0x73, 0x00, 0x70, 0x00, 0x6c, 0x00, + 0x61, 0x00, 0x79, 0x00, 0x73, 0x00, 0x20, 0x00, 0x61, 0x00, 0x20, 0x00, + 0x22, 0x00, 0x55, 0x00, 0x45, 0x00, 0x46, 0x00, 0x49, 0x00, 0x20, 0x00, + 0x48, 0x00, 0x65, 0x00, 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x20, 0x00, + 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, 0x6c, 0x00, 0x64, 0x00, 0x21, 0x00, + 0x22, 0x00, 0x20, 0x00, 0x73, 0x00, 0x74, 0x00, 0x72, 0x00, 0x69, 0x00, + 0x6e, 0x00, 0x67, 0x00, 0x2e, 0x00, 0x22, 0x00, 0x0d, 0x00, 0x0a, 0x00, + 0x2e, 0x00, 0x53, 0x00, 0x48, 0x00, 0x20, 0x00, 0x4e, 0x00, 0x41, 0x00, + 0x4d, 0x00, 0x45, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x48, 0x00, 0x65, 0x00, + 0x6c, 0x00, 0x6c, 0x00, 0x6f, 0x00, 0x57, 0x00, 0x6f, 0x00, 0x72, 0x00, + 0x6c, 0x00, 0x64, 0x00, 0x20, 0x00, 0x61, 0x00, 0x70, 0x00, 0x70, 0x00, + 0x6c, 0x00, 0x69, 0x00, 0x63, 0x00, 0x61, 0x00, 0x74, 0x00, 0x69, 0x00, + 0x6f, 0x00, 0x6e, 0x00, 0x2e, 0x00, 0x0d, 0x00, 0x0a, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0xdf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xac, 0x10, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, + 0x30, 0x82, 0x10, 0xa0, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x07, 0x02, 0xa0, 0x82, 0x10, 0x91, 0x30, 0x82, 0x10, 0x8d, 0x02, + 0x01, 0x01, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, + 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, 0x78, 0x06, 0x0a, 0x2b, + 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0xa0, 0x6a, 0x30, + 0x68, 0x30, 0x33, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, + 0x02, 0x01, 0x0f, 0x30, 0x25, 0x03, 0x01, 0x00, 0xa0, 0x20, 0xa2, 0x1e, + 0x80, 0x1c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x4f, 0x00, 0x62, + 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x74, 0x00, 0x65, + 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, + 0x20, 0x96, 0x8a, 0xd8, 0x5d, 0x87, 0x66, 0xa3, 0x72, 0x26, 0xcd, 0x08, + 0xe4, 0x9c, 0x7e, 0x13, 0x24, 0x75, 0x30, 0x8e, 0xb2, 0xc1, 0x1b, 0x7d, + 0x4b, 0xec, 0xf6, 0x90, 0x96, 0x61, 0x70, 0xbc, 0x32, 0xa0, 0x82, 0x0d, + 0x92, 0x30, 0x82, 0x03, 0x71, 0x30, 0x82, 0x02, 0x59, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x14, 0x71, 0xb5, 0x0a, 0x74, 0x69, 0x1a, 0x2e, 0xf8, + 0x57, 0xff, 0xaa, 0x62, 0x03, 0x18, 0x11, 0xc2, 0x0d, 0x63, 0x88, 0xb4, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, + 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, + 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, + 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x36, + 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, + 0x34, 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x29, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, + 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x4c, 0x65, 0x61, 0x66, 0x20, 0x53, + 0x69, 0x67, 0x6e, 0x65, 0x72, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xa1, 0x3b, 0xcf, 0x40, 0x63, 0x36, 0x7e, 0xb4, 0x40, 0x53, + 0x74, 0x5a, 0xc0, 0x02, 0xea, 0xef, 0x3e, 0xe0, 0x4c, 0x12, 0xf3, 0x28, + 0x53, 0x99, 0xa6, 0x48, 0x13, 0xee, 0xc7, 0x00, 0xb8, 0x23, 0x74, 0xf3, + 0xf4, 0x03, 0xc5, 0xed, 0xfb, 0x5a, 0x1a, 0xae, 0x73, 0x6a, 0xfd, 0xee, + 0x08, 0x37, 0x18, 0x2c, 0xe3, 0x5a, 0x98, 0x6f, 0xb3, 0x00, 0x4e, 0x4f, + 0xbe, 0x06, 0xe4, 0xe4, 0xee, 0x24, 0x53, 0xcb, 0xe3, 0xb3, 0x88, 0x6c, + 0xeb, 0xe2, 0x84, 0xd9, 0x1b, 0xd7, 0x06, 0x8d, 0x6d, 0xbc, 0x60, 0xe2, + 0xbf, 0xff, 0x50, 0xd1, 0x92, 0xcc, 0x1d, 0xbb, 0x91, 0x1e, 0x72, 0x39, + 0x48, 0x6c, 0x4f, 0x02, 0x7c, 0x86, 0x34, 0x53, 0xfe, 0xeb, 0x31, 0x10, + 0x9d, 0xa7, 0xa2, 0x12, 0x3e, 0x6b, 0x7b, 0xa3, 0xba, 0xaa, 0x42, 0x18, + 0xa3, 0x0d, 0xb9, 0x2a, 0x56, 0x0b, 0xdc, 0x0f, 0x78, 0x41, 0xd1, 0xe4, + 0x12, 0x2e, 0x26, 0x01, 0x37, 0x32, 0xbf, 0x17, 0x2e, 0x3f, 0x70, 0xdc, + 0xac, 0x26, 0x2c, 0x3f, 0x99, 0xdd, 0xf0, 0xb2, 0x81, 0x92, 0xd8, 0x88, + 0xb6, 0x1c, 0x6e, 0x5b, 0x8a, 0x3d, 0x5a, 0x66, 0x28, 0x1a, 0x6c, 0xf3, + 0x7a, 0x4a, 0x7f, 0x1f, 0x8b, 0x2b, 0x57, 0x94, 0x92, 0xe7, 0x1f, 0x0e, + 0x70, 0x07, 0x6f, 0x0e, 0x48, 0x30, 0xc5, 0x76, 0x11, 0x27, 0x1f, 0x43, + 0x17, 0x4d, 0x8a, 0x2f, 0x65, 0x2e, 0xfb, 0xb6, 0x7c, 0x17, 0x83, 0x77, + 0xb2, 0xa2, 0x7c, 0xb5, 0x54, 0x95, 0x23, 0xbe, 0x3a, 0x40, 0x9b, 0x8a, + 0xe2, 0xa3, 0x94, 0x0c, 0xb1, 0xff, 0x62, 0x4b, 0x74, 0xfc, 0xc1, 0xc4, + 0x63, 0x2e, 0x61, 0xee, 0x09, 0xc5, 0xf6, 0xe4, 0x8f, 0x6a, 0x33, 0x41, + 0x3d, 0x7f, 0x5a, 0x4f, 0xd6, 0x66, 0x33, 0x30, 0x9a, 0x80, 0x4d, 0xf3, + 0xbe, 0x72, 0x3f, 0x86, 0x52, 0x1f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x75, 0x30, 0x73, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, + 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x13, 0x06, + 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, + 0x01, 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x72, 0x8a, 0xd7, 0xd4, 0xaf, 0x15, 0x1e, + 0x35, 0xcf, 0x72, 0x14, 0x49, 0x8b, 0x01, 0xd0, 0xb6, 0x4b, 0x48, 0x1d, + 0x23, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, 0xe4, 0x50, 0xed, 0x2f, + 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, 0x5c, 0x76, 0x30, 0x0d, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, + 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x32, 0xcc, 0x95, 0xe4, 0xe2, 0x7e, + 0x2c, 0x74, 0x33, 0x45, 0x7e, 0xd3, 0xcd, 0x0b, 0xda, 0x0e, 0xe7, 0x16, + 0x8f, 0x60, 0xb1, 0x4c, 0x6f, 0x3e, 0xb9, 0xa1, 0xe5, 0x00, 0x2c, 0x9f, + 0x5b, 0x65, 0x8d, 0x4e, 0xc1, 0x74, 0x03, 0x30, 0xf0, 0xc1, 0xbd, 0x33, + 0x81, 0xf1, 0x3b, 0x0d, 0x63, 0x86, 0x7f, 0x0d, 0x68, 0x1c, 0xaf, 0x22, + 0xa4, 0xf1, 0xf2, 0xb7, 0x35, 0x2d, 0x3d, 0xa5, 0xc4, 0x54, 0x0d, 0x16, + 0xc8, 0x7f, 0xc7, 0xe2, 0x5d, 0xba, 0x1c, 0x52, 0xcb, 0x6e, 0x81, 0xe8, + 0xb9, 0x4a, 0x11, 0xb4, 0xf7, 0x70, 0x0b, 0x70, 0xf3, 0xfe, 0x0c, 0xb1, + 0x15, 0x31, 0x57, 0x63, 0x9a, 0xbc, 0xbc, 0x9a, 0xc5, 0x40, 0xab, 0xdd, + 0xc3, 0xc5, 0xc0, 0xfd, 0x47, 0x79, 0x85, 0x96, 0x4c, 0x3d, 0xa4, 0x3e, + 0x6e, 0xaf, 0x30, 0xd2, 0x20, 0x30, 0x6b, 0x32, 0xa3, 0x8d, 0x6c, 0xb7, + 0x5e, 0xa9, 0x9b, 0x31, 0x98, 0x25, 0xed, 0x1f, 0xf6, 0x3c, 0x59, 0xc3, + 0x77, 0xca, 0x83, 0x49, 0x28, 0xe6, 0x20, 0xc4, 0x32, 0xc4, 0x15, 0x15, + 0xac, 0xa7, 0x54, 0xd1, 0xa5, 0xc6, 0xe8, 0xc5, 0x7c, 0x0f, 0x23, 0x31, + 0xe3, 0x06, 0xad, 0x48, 0x9c, 0xf6, 0xb1, 0xd5, 0x9f, 0xed, 0xee, 0xf4, + 0x1c, 0xe3, 0xce, 0x3e, 0xf3, 0x27, 0x28, 0x19, 0x20, 0xb9, 0xcb, 0x4d, + 0x85, 0xdd, 0xf9, 0xc8, 0xec, 0x2e, 0x60, 0xd1, 0xf7, 0x48, 0xba, 0x25, + 0xf7, 0x4f, 0x0e, 0x47, 0x9e, 0xc8, 0xc8, 0xaa, 0x74, 0xb5, 0x5f, 0x90, + 0xc6, 0xfa, 0xb9, 0xdf, 0x95, 0x88, 0xe8, 0x00, 0xc3, 0x90, 0xa6, 0x9f, + 0x06, 0xda, 0xf5, 0x9e, 0x04, 0x55, 0xd7, 0x68, 0xe0, 0x1f, 0x37, 0xbe, + 0x4f, 0xe9, 0x7a, 0x0f, 0x3e, 0xc8, 0x60, 0x84, 0xc3, 0x78, 0x0b, 0xd9, + 0xc8, 0xd9, 0xe9, 0x66, 0xea, 0xd7, 0x5b, 0x83, 0x63, 0x3e, 0x30, 0x82, + 0x03, 0x65, 0x30, 0x82, 0x02, 0x4d, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, + 0x14, 0x2c, 0xcc, 0x3e, 0x1f, 0x6c, 0x46, 0x86, 0x7a, 0x93, 0x05, 0x4f, + 0x73, 0x7b, 0xc5, 0x14, 0x61, 0x37, 0xaa, 0x40, 0x10, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x31, 0x20, 0x43, 0x41, + 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, + 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, + 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x3a, 0x31, 0x38, + 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, + 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb, 0x80, 0xcb, 0x94, 0xf5, 0x0d, 0xbf, + 0xbf, 0xe4, 0xfc, 0xd2, 0x21, 0x71, 0x5f, 0x1d, 0x25, 0x78, 0x3c, 0xd2, + 0x3a, 0x62, 0x35, 0x1a, 0xa9, 0xa2, 0x13, 0x54, 0x33, 0x73, 0x6c, 0x39, + 0x18, 0x96, 0x8f, 0x0a, 0xe2, 0x01, 0x2c, 0x54, 0x85, 0x3e, 0xeb, 0xd5, + 0xc8, 0xa3, 0xdf, 0xd8, 0x3f, 0x6c, 0x96, 0x4a, 0xc6, 0x19, 0xbc, 0xfd, + 0x7a, 0x9b, 0x28, 0xd0, 0xe9, 0x07, 0x82, 0xeb, 0xdb, 0x42, 0x6d, 0x9f, + 0xb6, 0xac, 0xa3, 0xc1, 0x0a, 0xff, 0x58, 0x85, 0x10, 0x31, 0x0e, 0xf4, + 0xb2, 0xb2, 0x49, 0xb0, 0x72, 0x4a, 0x81, 0x93, 0x60, 0x11, 0x40, 0xde, + 0xc4, 0x91, 0xfb, 0xcc, 0x45, 0x21, 0xfa, 0x4c, 0x81, 0x2a, 0xf4, 0xc5, + 0x27, 0x70, 0x74, 0x50, 0x82, 0x6f, 0x5f, 0xda, 0x94, 0xf1, 0xda, 0xbc, + 0x74, 0x98, 0x56, 0xcd, 0xe5, 0x82, 0xa7, 0x17, 0xd3, 0x45, 0x36, 0x05, + 0x6a, 0x3d, 0xc5, 0x35, 0x61, 0xda, 0x44, 0xbb, 0x87, 0x25, 0xc9, 0xcd, + 0x52, 0x55, 0xd9, 0x43, 0x24, 0xa6, 0xeb, 0x13, 0x29, 0xec, 0x9b, 0x4a, + 0xb2, 0x21, 0x99, 0xd3, 0xec, 0x9f, 0xf6, 0x1a, 0x2e, 0x4f, 0x6c, 0x51, + 0x96, 0xc0, 0x6a, 0xb8, 0x10, 0x6e, 0x75, 0x2d, 0x0f, 0x09, 0x53, 0x92, + 0x28, 0xd8, 0x8f, 0xe7, 0x4a, 0x92, 0x40, 0x1b, 0xdb, 0x93, 0x30, 0xc7, + 0x6e, 0x42, 0x60, 0x6a, 0xe2, 0x2b, 0x29, 0x94, 0x70, 0x3f, 0xb3, 0xf0, + 0xf1, 0x18, 0x84, 0xb7, 0x6d, 0xb8, 0x29, 0xcb, 0x72, 0x08, 0xcb, 0x27, + 0x18, 0xe1, 0x0a, 0x9c, 0xc3, 0x0b, 0x62, 0x77, 0xbc, 0x1f, 0xb4, 0x56, + 0x48, 0xa7, 0xdb, 0xf3, 0x29, 0x33, 0xe6, 0x97, 0xb8, 0x2f, 0x6c, 0x52, + 0xa8, 0xdd, 0xf2, 0x82, 0xfa, 0xcc, 0xf1, 0xcc, 0x0d, 0x0b, 0xaa, 0xf9, + 0x34, 0x6e, 0x9a, 0x48, 0x9b, 0x44, 0x43, 0x70, 0xe3, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, + 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, 0xe4, 0x50, 0xed, 0x2f, + 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, 0x5c, 0x76, 0x30, 0x1f, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x4d, + 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, 0x88, 0x60, 0x2e, 0x36, 0x47, 0x05, + 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, 0xa1, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x68, 0x6c, 0x45, 0xf9, 0xea, 0x75, 0xac, 0xbf, 0xfc, + 0x1b, 0xcc, 0x42, 0xa1, 0x55, 0xb7, 0x19, 0xb9, 0x67, 0x83, 0x0c, 0x15, + 0x94, 0xdb, 0x1b, 0x31, 0x33, 0xf5, 0xff, 0x6b, 0xae, 0xb9, 0x06, 0x7e, + 0xd1, 0x19, 0x2e, 0x97, 0x84, 0xd7, 0xd7, 0xc5, 0x23, 0xac, 0x21, 0xb8, + 0x70, 0xd4, 0xa7, 0x5e, 0x3c, 0xf9, 0x83, 0x68, 0xc4, 0xc1, 0x7b, 0xb7, + 0x86, 0xc1, 0x11, 0xd7, 0xd7, 0xa1, 0x63, 0x8a, 0x04, 0x10, 0x03, 0x34, + 0x5f, 0x04, 0x6c, 0x18, 0x37, 0xb1, 0x9c, 0xe9, 0x2e, 0x24, 0xd1, 0x10, + 0xb8, 0x69, 0x05, 0x96, 0x2a, 0x30, 0xd9, 0x12, 0x9e, 0xdb, 0xfb, 0x12, + 0x5e, 0x2b, 0x7b, 0xc7, 0x55, 0x32, 0xa0, 0x87, 0x16, 0xdb, 0x2f, 0x5f, + 0x12, 0x70, 0xff, 0x76, 0xe9, 0x05, 0x62, 0xfb, 0xe1, 0x03, 0x51, 0xe7, + 0x87, 0xa0, 0x50, 0x63, 0xbc, 0xe9, 0x6a, 0x4f, 0x47, 0xd9, 0xde, 0xe8, + 0x28, 0xd0, 0x69, 0xcf, 0x29, 0x35, 0x7c, 0x3c, 0x7f, 0x29, 0x65, 0xb0, + 0x2f, 0x69, 0xba, 0xa2, 0x20, 0x90, 0xf0, 0x75, 0xd1, 0x02, 0xf6, 0xae, + 0xd0, 0x5f, 0xbe, 0x5d, 0xce, 0x6d, 0xce, 0x76, 0xc6, 0x61, 0x0f, 0x75, + 0xdb, 0x3f, 0x08, 0xaf, 0x96, 0x15, 0x95, 0x57, 0x7d, 0xa1, 0x80, 0x59, + 0x4c, 0xba, 0x3b, 0x95, 0x6b, 0x78, 0xee, 0xc1, 0xad, 0x5a, 0x68, 0xa0, + 0x6e, 0x25, 0x86, 0x58, 0xa2, 0x46, 0xee, 0x62, 0xf7, 0x88, 0x28, 0xbb, + 0x60, 0x33, 0x32, 0xf4, 0xce, 0x5f, 0x86, 0x3a, 0xd3, 0x2a, 0xe3, 0x3e, + 0x2d, 0xda, 0x59, 0xc1, 0xab, 0x90, 0x8c, 0xc9, 0xa9, 0x78, 0x8b, 0xb7, + 0x4c, 0x43, 0xc2, 0x53, 0x3d, 0x92, 0x20, 0xdf, 0xf2, 0x55, 0xb0, 0x2b, + 0xc9, 0x2b, 0x36, 0xf3, 0xbe, 0xd2, 0x3f, 0x9d, 0x8c, 0x32, 0x99, 0x38, + 0xf7, 0x15, 0x20, 0xb9, 0xf3, 0x4b, 0x03, 0x30, 0x82, 0x03, 0x5b, 0x30, + 0x82, 0x02, 0x43, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x29, 0xe7, + 0xee, 0xbe, 0xd0, 0xf2, 0x0a, 0x30, 0xc2, 0xd1, 0x41, 0xc9, 0x4d, 0x24, + 0xd9, 0x8a, 0xfe, 0x42, 0x3d, 0x85, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x30, 0x31, + 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x25, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, + 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, + 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, + 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, + 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x3a, 0x31, 0x38, 0x30, + 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, + 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, + 0x74, 0x65, 0x20, 0x31, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, + 0x82, 0x01, 0x01, 0x00, 0xb0, 0x99, 0x93, 0xd5, 0xe0, 0x9e, 0xc7, 0x39, + 0xd2, 0x44, 0x31, 0x5f, 0x1c, 0xd3, 0x87, 0x2c, 0xcf, 0x36, 0xc4, 0xe5, + 0x0d, 0xda, 0x60, 0x66, 0x88, 0x05, 0x15, 0xf6, 0x12, 0xe3, 0x61, 0x73, + 0xec, 0xcf, 0x2e, 0xd9, 0xf6, 0x81, 0x1a, 0xe9, 0x52, 0xa8, 0x37, 0x94, + 0x5a, 0xb8, 0x30, 0xb8, 0x10, 0x2e, 0x23, 0xfe, 0xfd, 0x9e, 0x36, 0x1f, + 0x45, 0xe2, 0x8c, 0x87, 0x8e, 0xa2, 0x42, 0xb2, 0x88, 0xcc, 0xad, 0x79, + 0xc6, 0xb7, 0xa2, 0x6f, 0x74, 0x28, 0x6e, 0x76, 0x62, 0xc4, 0x13, 0xcc, + 0x05, 0xac, 0xfe, 0xd4, 0x5e, 0x6c, 0x4d, 0x19, 0x3f, 0x41, 0xb9, 0x5f, + 0x5f, 0xef, 0xeb, 0x0d, 0xf9, 0xaa, 0x65, 0x62, 0x64, 0x8d, 0x84, 0xc6, + 0xd1, 0xf5, 0x24, 0x37, 0x97, 0xf1, 0x52, 0x9b, 0x98, 0x28, 0x6b, 0x3d, + 0xda, 0x2b, 0xdd, 0x68, 0x98, 0x4a, 0x8c, 0x99, 0xe1, 0xec, 0xf0, 0x22, + 0x43, 0x8a, 0x01, 0xeb, 0xa9, 0xf9, 0x3d, 0x2f, 0x58, 0x62, 0x36, 0x7e, + 0xc8, 0x62, 0x01, 0x3f, 0x38, 0xcb, 0x09, 0x91, 0x52, 0x2b, 0x8a, 0xde, + 0x93, 0x44, 0xaa, 0x31, 0x6c, 0x0c, 0x86, 0x31, 0x4a, 0x89, 0xed, 0x3f, + 0x01, 0xc4, 0x88, 0xb2, 0x00, 0x05, 0x25, 0xeb, 0xa2, 0xa7, 0xe7, 0x98, + 0x01, 0xb6, 0x0f, 0x2f, 0x12, 0xbf, 0x32, 0xe4, 0x95, 0x40, 0x94, 0x12, + 0x82, 0xf5, 0xc4, 0x48, 0x35, 0x38, 0x8f, 0x10, 0xfb, 0xf8, 0x55, 0x23, + 0x1c, 0x88, 0x56, 0xa1, 0xa9, 0x84, 0x89, 0x5b, 0xb9, 0x20, 0xab, 0xd8, + 0x46, 0x06, 0xa3, 0x49, 0x0b, 0xfa, 0x95, 0x5a, 0x80, 0x46, 0x19, 0xe4, + 0x46, 0x5a, 0x22, 0xdc, 0x09, 0xb0, 0xa8, 0xbb, 0xac, 0x2b, 0xb1, 0x39, + 0xbd, 0xa1, 0x1e, 0x73, 0xde, 0x87, 0x8f, 0x87, 0x16, 0xe8, 0x78, 0xcd, + 0x04, 0xa8, 0x21, 0xd3, 0x5f, 0x57, 0xcb, 0x47, 0x02, 0x03, 0x01, 0x00, + 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, + 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, + 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, 0x88, 0x60, 0x2e, 0x36, + 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, 0xa1, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa6, 0x9c, + 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, + 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x07, 0x3d, 0x41, 0xe5, 0x4e, 0xb5, 0x79, 0x2e, 0xaf, 0x85, + 0xa4, 0xd2, 0x86, 0xcc, 0x21, 0x61, 0xc1, 0x68, 0x0d, 0x6e, 0xac, 0xd9, + 0x13, 0x38, 0xed, 0x12, 0x25, 0x96, 0x31, 0xd7, 0x43, 0xa3, 0xac, 0x49, + 0x5d, 0x4b, 0x18, 0x94, 0x39, 0x58, 0x22, 0x10, 0x6b, 0x49, 0x02, 0xd9, + 0x3e, 0x86, 0x75, 0x21, 0xe5, 0x19, 0x95, 0x28, 0x16, 0x81, 0xf6, 0x42, + 0x43, 0x26, 0x16, 0x3c, 0xcd, 0xbd, 0xed, 0xb4, 0x0c, 0x26, 0xdf, 0xb4, + 0x72, 0x53, 0x6b, 0xbc, 0x2c, 0x25, 0x59, 0x6f, 0xb0, 0x5b, 0x1a, 0x9b, + 0x8b, 0xd5, 0xc0, 0xf1, 0x70, 0x7c, 0xae, 0xdc, 0xfe, 0xa6, 0x3e, 0xe0, + 0x2a, 0xc6, 0x87, 0x5a, 0x5f, 0x4f, 0xa2, 0x47, 0x4e, 0x0c, 0xbf, 0x25, + 0xfb, 0x51, 0xdf, 0xda, 0x1f, 0xbb, 0x28, 0xdf, 0x52, 0x5c, 0x1e, 0xc5, + 0x6d, 0x38, 0x37, 0x7f, 0x86, 0xf5, 0xc0, 0x81, 0xc2, 0x80, 0xab, 0x70, + 0xf4, 0x12, 0x83, 0x50, 0x56, 0x19, 0x2a, 0x06, 0x8b, 0xb2, 0x7e, 0xd8, + 0x3b, 0x56, 0xe3, 0xbd, 0x56, 0x1b, 0x3b, 0x60, 0x90, 0xb6, 0x2c, 0xdb, + 0x5b, 0x9a, 0xb0, 0xd8, 0x7a, 0xaa, 0xcc, 0x02, 0x99, 0x0c, 0xb2, 0x21, + 0xc3, 0x02, 0x1c, 0x23, 0xc5, 0x46, 0x93, 0x2e, 0xc9, 0xf1, 0x3e, 0xec, + 0xcd, 0x15, 0x11, 0xc3, 0x94, 0xb1, 0x6a, 0x10, 0x6f, 0x35, 0x42, 0x91, + 0x2a, 0x78, 0xcf, 0x8f, 0x16, 0x1a, 0x82, 0x8f, 0xae, 0xa8, 0x53, 0x56, + 0xb2, 0x7e, 0x3a, 0x2d, 0x52, 0x04, 0x65, 0xfa, 0xbb, 0xb0, 0xac, 0x6c, + 0xb5, 0xf6, 0xbd, 0x05, 0xd4, 0x9f, 0xc3, 0x8b, 0xca, 0xb0, 0x4f, 0x9f, + 0x15, 0x21, 0xba, 0x8a, 0x94, 0x17, 0x53, 0x13, 0x8b, 0xb7, 0x4d, 0xe9, + 0xdc, 0xc7, 0x26, 0x47, 0x02, 0xf0, 0x4b, 0x75, 0xbe, 0x84, 0x73, 0x02, + 0x1e, 0x14, 0x97, 0x99, 0x91, 0x5b, 0x30, 0x82, 0x03, 0x51, 0x30, 0x82, + 0x02, 0x39, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x15, 0x68, 0xb3, + 0x37, 0x3a, 0x6a, 0x85, 0x56, 0xc8, 0x38, 0x5a, 0xcc, 0xcc, 0x2c, 0xda, + 0xac, 0x35, 0x6a, 0x40, 0x9e, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x30, 0x31, 0x2e, + 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x25, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, + 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, + 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, + 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, + 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, + 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, + 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xbe, 0x63, 0xe7, 0x31, 0xf6, 0xc3, 0x1d, + 0x9d, 0xd3, 0x47, 0x42, 0x28, 0x5c, 0x1c, 0xf0, 0xc6, 0x00, 0xfa, 0x70, + 0x23, 0x7a, 0xe5, 0x8b, 0x32, 0xb3, 0xd7, 0x09, 0x80, 0xde, 0xb4, 0x6b, + 0x02, 0x0e, 0x20, 0x42, 0x34, 0x74, 0x94, 0x66, 0xeb, 0x32, 0xeb, 0x95, + 0xb6, 0x95, 0xe4, 0x6a, 0xb9, 0x85, 0x08, 0xee, 0xd6, 0x8f, 0x61, 0xd6, + 0x23, 0x3c, 0xb2, 0xa0, 0x38, 0xfb, 0x48, 0x26, 0xc9, 0x4a, 0x4f, 0x68, + 0x4c, 0x9a, 0x93, 0x84, 0x75, 0x72, 0x7d, 0xa5, 0xac, 0xed, 0xab, 0x21, + 0x71, 0x1c, 0x34, 0x64, 0x07, 0x2f, 0xe5, 0x1f, 0xb4, 0xeb, 0x31, 0x6d, + 0xc9, 0x9b, 0x7c, 0xe8, 0xcc, 0x49, 0xdc, 0x7d, 0x27, 0x08, 0x9d, 0xa2, + 0x91, 0xf3, 0x9d, 0xad, 0xa0, 0xaa, 0x21, 0x53, 0x76, 0xa7, 0x81, 0x04, + 0x1a, 0x74, 0x89, 0xd6, 0x45, 0x72, 0x7c, 0x37, 0x22, 0xa4, 0xf7, 0x36, + 0x5b, 0x80, 0xce, 0xe2, 0x91, 0x60, 0xee, 0x91, 0xef, 0xc0, 0x25, 0x92, + 0x05, 0xa3, 0x24, 0xa2, 0x4c, 0xa2, 0x93, 0xd0, 0x80, 0x61, 0xc0, 0x9c, + 0xdf, 0xc1, 0xeb, 0xed, 0x2e, 0x23, 0x30, 0xe8, 0xd8, 0xea, 0xc4, 0x5b, + 0x2a, 0x4c, 0x00, 0xa4, 0xdf, 0xa2, 0xa3, 0x39, 0x32, 0x80, 0xb2, 0x1d, + 0x81, 0xa9, 0x26, 0x43, 0x07, 0xc5, 0xf0, 0x8d, 0x2c, 0x61, 0x70, 0xbf, + 0xfd, 0xa1, 0x33, 0xd1, 0x47, 0x59, 0x41, 0xc7, 0x17, 0xe6, 0xdd, 0x4b, + 0x99, 0x97, 0xb6, 0xc3, 0x39, 0x80, 0xfa, 0x78, 0x61, 0x6f, 0xc7, 0xbf, + 0x6c, 0x88, 0xd9, 0xd6, 0xc2, 0x60, 0xbe, 0x83, 0x67, 0xd3, 0x38, 0xf9, + 0x73, 0xc5, 0x64, 0x4e, 0xc2, 0xbb, 0x0f, 0xb8, 0x24, 0xf5, 0x29, 0x86, + 0xb2, 0x35, 0x9a, 0x74, 0x14, 0xdf, 0xef, 0x92, 0xcc, 0xec, 0x5e, 0x46, + 0x80, 0xe8, 0xf2, 0xc3, 0x4a, 0xbd, 0xb7, 0x78, 0xad, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, + 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, + 0x16, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, + 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, + 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, + 0x01, 0x01, 0x00, 0x9b, 0x0d, 0xd9, 0x6c, 0xf4, 0x0b, 0x08, 0xea, 0xfd, + 0x75, 0xac, 0x4a, 0xcc, 0xf6, 0xdf, 0x33, 0x62, 0x6b, 0x0c, 0x93, 0x50, + 0x73, 0x4a, 0x60, 0x67, 0xde, 0x0d, 0x24, 0x95, 0x4c, 0x4b, 0x75, 0xb3, + 0xec, 0x0e, 0xe3, 0x3a, 0xc6, 0x4c, 0xe3, 0x93, 0xf0, 0x9c, 0xa4, 0xfe, + 0x2c, 0x87, 0x9c, 0x7c, 0x4d, 0x7b, 0x18, 0x1b, 0x93, 0x5f, 0x2e, 0xda, + 0x88, 0xef, 0x11, 0x8b, 0x2a, 0xa3, 0x20, 0xbb, 0x22, 0xc0, 0x73, 0x59, + 0xd9, 0x13, 0x35, 0xac, 0x40, 0x21, 0x1e, 0xd2, 0xab, 0x5a, 0xcd, 0x80, + 0x82, 0x36, 0x64, 0x11, 0x84, 0x11, 0x4f, 0xf0, 0x60, 0x52, 0x3f, 0x2c, + 0xe4, 0xc8, 0x47, 0xd8, 0x36, 0xc5, 0x50, 0x8a, 0x8f, 0x8f, 0x13, 0x40, + 0x3b, 0xda, 0x2b, 0x05, 0x17, 0x7c, 0x44, 0x5f, 0x05, 0xde, 0x67, 0xcc, + 0x17, 0x04, 0xdb, 0xcc, 0xee, 0x6e, 0x1c, 0xaf, 0xf4, 0x66, 0x9c, 0x7d, + 0x72, 0x91, 0x9f, 0x6f, 0x42, 0x78, 0x10, 0x90, 0xd5, 0xfa, 0xd4, 0x1b, + 0xac, 0x56, 0x02, 0xf4, 0x00, 0x48, 0x6b, 0x56, 0x05, 0x32, 0xb5, 0x0a, + 0x16, 0x14, 0x56, 0x14, 0xfa, 0x49, 0x99, 0x59, 0x62, 0xed, 0xda, 0x99, + 0x48, 0x88, 0x18, 0x20, 0x77, 0xfe, 0xbf, 0x6c, 0xcc, 0x5b, 0x53, 0xab, + 0x2b, 0x93, 0x6a, 0x5d, 0xce, 0xf8, 0x5e, 0xfa, 0x71, 0xc5, 0x79, 0x6a, + 0xba, 0x49, 0x00, 0x6a, 0x0f, 0x0e, 0x40, 0xb5, 0x79, 0xa4, 0x93, 0x14, + 0xa5, 0x2c, 0x24, 0x2d, 0x76, 0xa4, 0x05, 0x60, 0x93, 0x8d, 0x50, 0xe8, + 0x2b, 0xcf, 0x51, 0xe3, 0xdc, 0x8d, 0x72, 0xa2, 0xae, 0xf1, 0x76, 0x5e, + 0xba, 0xb2, 0xa9, 0x48, 0x20, 0x53, 0xbc, 0x80, 0xf7, 0x35, 0xae, 0x41, + 0x77, 0xef, 0x6a, 0x74, 0xeb, 0xa1, 0x68, 0xc5, 0x83, 0x13, 0x50, 0xd8, + 0xfc, 0x52, 0x18, 0xa3, 0x76, 0x1d, 0x50, 0x31, 0x82, 0x02, 0x65, 0x30, + 0x82, 0x02, 0x61, 0x02, 0x01, 0x01, 0x30, 0x52, 0x30, 0x3a, 0x31, 0x38, + 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, + 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, + 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, 0x02, 0x14, 0x71, 0xb5, + 0x0a, 0x74, 0x69, 0x1a, 0x2e, 0xf8, 0x57, 0xff, 0xaa, 0x62, 0x03, 0x18, + 0x11, 0xc2, 0x0d, 0x63, 0x88, 0xb4, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, + 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xa0, 0x81, 0xe5, + 0x30, 0x19, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, + 0x03, 0x31, 0x0c, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, + 0x02, 0x01, 0x04, 0x30, 0x1c, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, + 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, 0x2f, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x04, 0x31, 0x22, + 0x04, 0x20, 0xcf, 0xb9, 0x17, 0xc7, 0x5e, 0x8f, 0x0b, 0x6c, 0xf8, 0x20, + 0x2a, 0x91, 0x74, 0xf6, 0x8e, 0x87, 0x64, 0x4b, 0xe4, 0x98, 0x17, 0x14, + 0x41, 0xb7, 0x97, 0xf5, 0xcf, 0xf0, 0xad, 0xf9, 0xa0, 0x98, 0x30, 0x79, + 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x0f, 0x31, + 0x6c, 0x30, 0x6a, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x65, + 0x03, 0x04, 0x01, 0x2a, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, + 0x65, 0x03, 0x04, 0x01, 0x16, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x01, 0x02, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x07, 0x30, 0x0e, 0x06, 0x08, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x02, 0x00, 0x80, 0x30, 0x0d, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x01, + 0x40, 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x07, 0x30, 0x0d, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x01, + 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x39, 0x86, 0xc5, 0x8a, + 0xba, 0x32, 0x23, 0x27, 0x5a, 0x59, 0xf8, 0x09, 0xe2, 0xa9, 0x5c, 0x0a, + 0x23, 0xbf, 0x46, 0x26, 0xd9, 0xd5, 0x77, 0x1e, 0x42, 0x10, 0x0c, 0x72, + 0xf6, 0x1c, 0xe6, 0xc4, 0x82, 0x3d, 0xa0, 0xeb, 0x37, 0x36, 0xef, 0x2f, + 0x7a, 0xdc, 0x21, 0x6b, 0x00, 0x28, 0xb9, 0x64, 0x0a, 0x5f, 0xca, 0xbe, + 0xce, 0xb7, 0x14, 0x2b, 0xa5, 0x36, 0xe7, 0x56, 0x74, 0xbe, 0xda, 0x9a, + 0xc6, 0x5c, 0x4f, 0x55, 0x14, 0x85, 0x7c, 0xbc, 0x63, 0x73, 0x86, 0xa5, + 0x31, 0x14, 0x32, 0xf6, 0xa1, 0x5e, 0xe8, 0x6c, 0x5e, 0xd3, 0xa9, 0x0e, + 0xe5, 0x52, 0x2f, 0xef, 0xd0, 0x16, 0xe3, 0x0c, 0x9d, 0x29, 0x8d, 0xbd, + 0xe0, 0x0a, 0x52, 0x30, 0x8b, 0xe2, 0xad, 0x63, 0xf0, 0xb8, 0x40, 0x31, + 0x75, 0xc8, 0x9f, 0xde, 0x33, 0x0a, 0x18, 0xe5, 0x41, 0xd1, 0x1a, 0x19, + 0xe1, 0xf2, 0xa4, 0x12, 0x21, 0xde, 0x2f, 0xf6, 0xb8, 0xb4, 0x6e, 0x12, + 0x94, 0x37, 0x38, 0xb6, 0xe3, 0x52, 0x91, 0x24, 0x2f, 0x46, 0x3f, 0x72, + 0xa0, 0xa4, 0xde, 0x44, 0x5d, 0xaa, 0xac, 0x55, 0xeb, 0x96, 0x55, 0x72, + 0x52, 0x7f, 0x3c, 0xe9, 0xf4, 0x12, 0x47, 0xbe, 0x9e, 0x6c, 0xb2, 0x72, + 0xd6, 0x66, 0x6a, 0xff, 0x05, 0xc6, 0xaf, 0xdb, 0x35, 0x8a, 0xff, 0x62, + 0x6d, 0x2b, 0xa1, 0xb2, 0x82, 0xbe, 0xe7, 0x02, 0xeb, 0xf1, 0xd2, 0x67, + 0xdc, 0x3a, 0xf6, 0x77, 0xf4, 0xf1, 0xc2, 0x30, 0xeb, 0xdb, 0xcf, 0x9e, + 0xe4, 0x03, 0x34, 0x83, 0x53, 0x5a, 0xb3, 0x89, 0xc3, 0x60, 0x50, 0x76, + 0x3f, 0x34, 0xa7, 0x0f, 0x03, 0x9a, 0xc3, 0x4a, 0x45, 0x57, 0x2a, 0x19, + 0xf5, 0xbb, 0xb2, 0x80, 0x32, 0x56, 0x24, 0x68, 0x5a, 0xd5, 0xc4, 0xe3, + 0x08, 0xc9, 0xb2, 0x69, 0xfa, 0x2c, 0x56, 0x7d, 0xd5, 0xd6, 0x20, 0xa3, + 0x00, 0x00, 0x00, 0x00, 0x06, 0x0d, 0x00, 0x00, 0x00, 0x02, 0x02, 0x00, + 0x30, 0x82, 0x0c, 0xfa, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x07, 0x02, 0xa0, 0x82, 0x0c, 0xeb, 0x30, 0x82, 0x0c, 0xe7, 0x02, + 0x01, 0x01, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, + 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x30, 0x78, 0x06, 0x0a, 0x2b, + 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, 0x02, 0x01, 0x04, 0xa0, 0x6a, 0x30, + 0x68, 0x30, 0x33, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, 0x82, 0x37, + 0x02, 0x01, 0x0f, 0x30, 0x25, 0x03, 0x01, 0x00, 0xa0, 0x20, 0xa2, 0x1e, + 0x80, 0x1c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x4f, 0x00, 0x62, + 0x00, 0x73, 0x00, 0x6f, 0x00, 0x6c, 0x00, 0x65, 0x00, 0x74, 0x00, 0x65, + 0x00, 0x3e, 0x00, 0x3e, 0x00, 0x3e, 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0x04, + 0x20, 0x96, 0x8a, 0xd8, 0x5d, 0x87, 0x66, 0xa3, 0x72, 0x26, 0xcd, 0x08, + 0xe4, 0x9c, 0x7e, 0x13, 0x24, 0x75, 0x30, 0x8e, 0xb2, 0xc1, 0x1b, 0x7d, + 0x4b, 0xec, 0xf6, 0x90, 0x96, 0x61, 0x70, 0xbc, 0x32, 0xa0, 0x82, 0x09, + 0xf5, 0x30, 0x82, 0x03, 0x43, 0x30, 0x82, 0x02, 0x2b, 0xa0, 0x03, 0x02, + 0x01, 0x02, 0x02, 0x14, 0x6d, 0x0c, 0xf0, 0x2d, 0x05, 0x1d, 0xa2, 0xa3, + 0xa4, 0x71, 0x77, 0xf8, 0xce, 0xcd, 0xaa, 0xc1, 0xcc, 0xa9, 0xd0, 0x16, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, + 0x04, 0x03, 0x0c, 0x26, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, + 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, + 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, + 0x0d, 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, + 0x37, 0x5a, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x26, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, + 0x01, 0x00, 0xde, 0xab, 0x0d, 0xae, 0x9a, 0x98, 0x07, 0x9e, 0xa0, 0xb4, + 0x9b, 0x95, 0xa8, 0x74, 0x7c, 0x13, 0x03, 0xf9, 0x53, 0xb1, 0x4a, 0xc4, + 0x35, 0xa3, 0xc1, 0xf8, 0xce, 0xcd, 0x42, 0x59, 0x88, 0xe7, 0x91, 0xb7, + 0xf2, 0xd3, 0x6d, 0xb3, 0x29, 0x34, 0x3d, 0x8f, 0x0e, 0xfc, 0x53, 0x73, + 0x3a, 0x8b, 0x55, 0x72, 0xb2, 0x9c, 0x7b, 0xe1, 0x88, 0xc9, 0xb8, 0x0d, + 0x7b, 0x90, 0xf8, 0x31, 0x3a, 0x87, 0x98, 0x12, 0x43, 0xc7, 0xed, 0xc0, + 0x69, 0x87, 0x2f, 0xfa, 0xa2, 0xbc, 0x6f, 0x32, 0x22, 0xfe, 0x83, 0x71, + 0xcd, 0x23, 0x23, 0x91, 0x98, 0xc2, 0xb1, 0xdf, 0xf3, 0x29, 0x1b, 0xfd, + 0x11, 0x97, 0x9e, 0x1d, 0xfe, 0x30, 0xb5, 0x5a, 0x41, 0x3c, 0x40, 0x30, + 0x0a, 0xed, 0x0b, 0xec, 0xca, 0x9d, 0xd6, 0xf0, 0x0b, 0xba, 0x6b, 0x98, + 0xef, 0x65, 0xb8, 0x0e, 0x08, 0x40, 0x70, 0xec, 0xee, 0x83, 0x21, 0x38, + 0x82, 0x20, 0xba, 0x6b, 0xeb, 0xa6, 0xcc, 0xb2, 0xa3, 0x35, 0x48, 0x3b, + 0x72, 0xc0, 0x89, 0xee, 0x3a, 0x9f, 0x14, 0x87, 0x96, 0x13, 0x05, 0x1a, + 0x03, 0xcb, 0xd6, 0x1b, 0xad, 0x0b, 0x27, 0x73, 0xb0, 0xe7, 0x5d, 0x0c, + 0x0b, 0x0d, 0x60, 0xe0, 0x25, 0xfa, 0xf0, 0xe9, 0x7a, 0x44, 0xf1, 0x5d, + 0x51, 0x09, 0x3e, 0x40, 0x99, 0x3a, 0xe3, 0xe8, 0x53, 0x30, 0xad, 0xe0, + 0x70, 0x66, 0x38, 0x3d, 0xf1, 0x7e, 0x0e, 0xd4, 0xce, 0x8f, 0x07, 0xf4, + 0x17, 0x2a, 0x5f, 0xca, 0xc8, 0xd0, 0x29, 0xea, 0x4e, 0x1c, 0x8d, 0xd0, + 0x67, 0x5b, 0x0b, 0x63, 0x31, 0xdc, 0xd5, 0xc8, 0x00, 0x8e, 0x87, 0xcc, + 0x29, 0xb6, 0x2a, 0xc0, 0x90, 0xea, 0x02, 0x53, 0x9e, 0x9d, 0x37, 0x49, + 0x52, 0xc5, 0xc3, 0xed, 0x75, 0xac, 0x05, 0x01, 0x52, 0x30, 0xf0, 0x86, + 0x4e, 0x1a, 0xc1, 0x83, 0x79, 0xf9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, + 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, + 0x04, 0x14, 0x07, 0x9f, 0xc5, 0xe7, 0x69, 0x95, 0x88, 0xf0, 0xd2, 0xfd, + 0x64, 0xbd, 0xe1, 0x7e, 0x9b, 0xac, 0xff, 0x11, 0x13, 0x65, 0x30, 0x1f, + 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x07, + 0x9f, 0xc5, 0xe7, 0x69, 0x95, 0x88, 0xf0, 0xd2, 0xfd, 0x64, 0xbd, 0xe1, + 0x7e, 0x9b, 0xac, 0xff, 0x11, 0x13, 0x65, 0x30, 0x0f, 0x06, 0x03, 0x55, + 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x2d, 0x5c, 0x25, 0x72, + 0x40, 0xc6, 0xa5, 0xd3, 0x43, 0xaa, 0x55, 0x97, 0xa5, 0x7d, 0xc7, 0x3d, + 0x6b, 0x77, 0xf2, 0xa3, 0xec, 0x14, 0xdd, 0xa4, 0x82, 0x61, 0x98, 0x7d, + 0xce, 0x4f, 0x4a, 0x68, 0x08, 0x9d, 0xe7, 0x4e, 0x8e, 0xab, 0x76, 0x5f, + 0x52, 0xae, 0xd5, 0x45, 0xb0, 0x14, 0x98, 0x8e, 0x0f, 0xdc, 0xd9, 0xe8, + 0x5d, 0xc3, 0xa3, 0x8c, 0x7d, 0xcf, 0x3c, 0x84, 0x50, 0x41, 0xef, 0xa6, + 0x95, 0x77, 0xc9, 0x46, 0x61, 0x67, 0xa4, 0x1b, 0xdc, 0xe2, 0x6d, 0xef, + 0x0f, 0x1a, 0x0e, 0xd7, 0x3b, 0xdf, 0x10, 0xe5, 0xd4, 0x42, 0x0d, 0x14, + 0x42, 0xed, 0xce, 0xfa, 0xa9, 0x5a, 0x1c, 0x10, 0xc2, 0xc7, 0x34, 0xd2, + 0xc1, 0x7c, 0xff, 0x33, 0x08, 0x71, 0x3c, 0x6d, 0x23, 0x03, 0x62, 0xae, + 0x63, 0x93, 0xea, 0x44, 0xa9, 0x06, 0x28, 0x7b, 0x72, 0x01, 0xaf, 0x9a, + 0xb6, 0xd2, 0x48, 0xa6, 0x7b, 0x3a, 0xf2, 0xf8, 0x6e, 0xb6, 0xa1, 0xb7, + 0xd5, 0xa9, 0x3e, 0x8a, 0x04, 0x7f, 0x1f, 0x6e, 0x37, 0xfa, 0x1e, 0xfc, + 0x79, 0x18, 0x29, 0x73, 0x59, 0xfa, 0xc3, 0xb9, 0x44, 0x8a, 0x43, 0xf0, + 0x4a, 0x4a, 0x8e, 0xb5, 0x17, 0xee, 0x4c, 0x5c, 0xbd, 0x7d, 0x25, 0x8b, + 0x30, 0x29, 0x23, 0x68, 0xbb, 0x44, 0xed, 0x45, 0xb7, 0xf2, 0x6a, 0x95, + 0x79, 0x64, 0x95, 0x45, 0x8a, 0x81, 0xbb, 0xf5, 0x39, 0xb6, 0xde, 0xdb, + 0x18, 0x0d, 0x05, 0x1b, 0x83, 0x7e, 0xce, 0x93, 0xc8, 0x8c, 0xeb, 0x13, + 0x22, 0x4b, 0xc6, 0x54, 0x8c, 0x23, 0x8e, 0x7c, 0x99, 0x8b, 0xae, 0xb3, + 0xb1, 0x1f, 0x00, 0xfd, 0x1f, 0x92, 0x2d, 0xa5, 0x3a, 0xe1, 0x78, 0x76, + 0x78, 0x05, 0x8a, 0x61, 0x62, 0x5d, 0x99, 0x73, 0x8b, 0x22, 0x6f, 0x07, + 0x7a, 0xb3, 0x5d, 0xd3, 0x4c, 0xe4, 0xfc, 0xa9, 0x97, 0xe6, 0xb0, 0x66, + 0x30, 0x82, 0x03, 0x53, 0x30, 0x82, 0x02, 0x3b, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x6c, 0x76, 0x71, 0x78, 0x96, 0x78, 0x58, 0x91, 0x7a, + 0x6e, 0x6d, 0x0d, 0xe4, 0x80, 0x55, 0xfc, 0x4f, 0x51, 0xca, 0x61, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x39, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x20, + 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, + 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, + 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, 0x39, 0x31, + 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, + 0x65, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xbc, 0x34, 0x39, 0x35, 0x9d, 0xb6, 0x0f, + 0x82, 0xec, 0x8a, 0xa5, 0x1a, 0x7d, 0xd8, 0x0f, 0xdc, 0x0b, 0xb6, 0xd6, + 0xb8, 0x7f, 0xe4, 0x4c, 0xf0, 0x7b, 0x5c, 0x5e, 0x1d, 0xa0, 0xbb, 0x68, + 0x77, 0x7a, 0x59, 0x62, 0xdb, 0xa9, 0xbc, 0xde, 0x59, 0xa3, 0x06, 0x32, + 0x4e, 0xe2, 0x2d, 0x04, 0x45, 0x01, 0xd0, 0x5b, 0x2f, 0x3b, 0x2d, 0xa7, + 0x58, 0x98, 0x89, 0xc1, 0x31, 0xbc, 0x17, 0x05, 0x5c, 0x17, 0x16, 0xdb, + 0x06, 0xe0, 0x36, 0x47, 0x62, 0x30, 0x4c, 0x17, 0x9e, 0x2e, 0xc2, 0x7b, + 0x60, 0x70, 0x01, 0x15, 0x49, 0x9f, 0x26, 0xf7, 0x96, 0xd3, 0x48, 0xc3, + 0x9d, 0xdb, 0x81, 0x50, 0x1e, 0x68, 0x1d, 0x2a, 0x3f, 0xb2, 0xad, 0x54, + 0x64, 0xee, 0x93, 0x93, 0x37, 0xd7, 0x8c, 0xa5, 0xb9, 0x02, 0xaa, 0x72, + 0xee, 0x57, 0x41, 0x35, 0x44, 0x78, 0xa8, 0x5c, 0x2a, 0xb1, 0x05, 0x41, + 0xab, 0x3a, 0xcc, 0xa2, 0xfd, 0xff, 0x9d, 0x7b, 0xd6, 0xb3, 0x70, 0x6a, + 0xdd, 0x06, 0x36, 0x0b, 0x0a, 0x9b, 0x1f, 0x32, 0xe8, 0x70, 0xe9, 0x73, + 0x75, 0x8f, 0xd4, 0xa4, 0xd5, 0xb2, 0x3b, 0xfc, 0x31, 0x9a, 0x70, 0x63, + 0x53, 0xe6, 0xc5, 0x9a, 0x34, 0x3d, 0x24, 0x6f, 0x95, 0x94, 0xb3, 0x6a, + 0x32, 0xfe, 0x0e, 0x83, 0x94, 0x40, 0x1f, 0x43, 0x0e, 0xf4, 0xdb, 0x2d, + 0x91, 0x47, 0x09, 0x4b, 0xe6, 0xfc, 0x02, 0x29, 0x89, 0xa2, 0xe3, 0xb8, + 0xc6, 0xed, 0x63, 0x67, 0x7d, 0xdf, 0x53, 0x5a, 0x39, 0x13, 0x7c, 0x0f, + 0xd3, 0x92, 0xea, 0x5b, 0xed, 0xc3, 0x20, 0x52, 0x1b, 0x70, 0x63, 0xae, + 0xb8, 0xe9, 0x50, 0x28, 0xc8, 0x20, 0x99, 0x4e, 0x72, 0xd8, 0x00, 0xbe, + 0x6b, 0xd9, 0x8e, 0x17, 0xa1, 0x8a, 0xcc, 0xf8, 0xcb, 0x04, 0x7d, 0x05, + 0x59, 0x1c, 0x1b, 0xe2, 0x1c, 0x8c, 0x3b, 0x16, 0xbd, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x53, 0x20, 0xdd, 0x71, 0xbb, 0xdc, 0x1d, + 0xf6, 0xb3, 0xd6, 0x20, 0xcb, 0x13, 0x5a, 0x14, 0x59, 0x50, 0xdc, 0x89, + 0xe4, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0x53, 0x20, 0xdd, 0x71, 0xbb, 0xdc, 0x1d, 0xf6, 0xb3, 0xd6, + 0x20, 0xcb, 0x13, 0x5a, 0x14, 0x59, 0x50, 0xdc, 0x89, 0xe4, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x33, + 0xc2, 0x25, 0x24, 0xbc, 0x09, 0xba, 0x02, 0xc6, 0xa5, 0x2f, 0xf9, 0x93, + 0x30, 0x9c, 0x70, 0x65, 0x79, 0x95, 0x29, 0xc4, 0x2f, 0xb8, 0x2a, 0x9a, + 0xa2, 0x81, 0x22, 0x67, 0xfd, 0x94, 0xb1, 0x94, 0x32, 0x35, 0xa6, 0xec, + 0xce, 0x05, 0x78, 0x45, 0x31, 0x02, 0xd2, 0x89, 0xd3, 0x22, 0x17, 0xe5, + 0x2c, 0xf9, 0xa1, 0x86, 0xe7, 0x86, 0x84, 0x1a, 0x55, 0xc0, 0x4a, 0xbd, + 0xd2, 0x58, 0x5f, 0x56, 0x56, 0xb0, 0x96, 0x5e, 0x08, 0x9b, 0x0f, 0xf9, + 0xde, 0x1a, 0x49, 0x9e, 0x6c, 0xa1, 0xa6, 0xc7, 0x50, 0x2b, 0x15, 0x56, + 0x9a, 0xe8, 0x2a, 0x6e, 0x2c, 0x47, 0x9e, 0x93, 0x89, 0x72, 0x8a, 0x44, + 0x6f, 0x2e, 0xfc, 0xdf, 0x5c, 0xf8, 0xfb, 0xe5, 0xb9, 0xf9, 0x0a, 0x44, + 0xf0, 0x5b, 0x97, 0xd5, 0x18, 0x54, 0x08, 0xbd, 0xd8, 0xc5, 0x69, 0x4f, + 0x19, 0x0c, 0x1e, 0xe5, 0xd6, 0x65, 0xe6, 0xf2, 0x37, 0xdc, 0xf5, 0x8d, + 0x01, 0x2a, 0x4b, 0x5c, 0x47, 0xa1, 0xf5, 0xfa, 0x9a, 0xc7, 0xa4, 0x5b, + 0xc4, 0xa5, 0x3c, 0xc1, 0x3a, 0xae, 0xf7, 0x06, 0xe1, 0x32, 0xc3, 0xde, + 0x75, 0x76, 0xec, 0x08, 0x9c, 0x22, 0xfa, 0xc6, 0x3f, 0x60, 0x68, 0x02, + 0xaf, 0x49, 0x7e, 0x3f, 0xd4, 0x29, 0xca, 0x1a, 0x68, 0x95, 0x72, 0x0e, + 0x9b, 0x16, 0xd3, 0x95, 0xe7, 0xb7, 0x54, 0x57, 0x51, 0xdf, 0x14, 0x95, + 0x63, 0xf9, 0xa3, 0xa2, 0xa1, 0x8c, 0xeb, 0x96, 0x38, 0xe2, 0xf5, 0x3f, + 0x9f, 0x86, 0x2f, 0x52, 0x96, 0xe0, 0x0f, 0xbf, 0x06, 0xd5, 0x64, 0x25, + 0x2e, 0xd8, 0x7e, 0x34, 0xf7, 0x55, 0xd1, 0xb8, 0x4b, 0x3b, 0x15, 0xc1, + 0x7a, 0x3e, 0xc7, 0x3b, 0xab, 0x68, 0xb3, 0x43, 0xa2, 0xdb, 0xda, 0x94, + 0x45, 0x91, 0xb5, 0x64, 0x7f, 0x0f, 0xad, 0x16, 0x52, 0xca, 0x8e, 0xf0, + 0xdb, 0x44, 0xf7, 0x30, 0x82, 0x03, 0x53, 0x30, 0x82, 0x02, 0x3b, 0xa0, + 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x64, 0x8a, 0x35, 0x01, 0xdc, 0x0a, + 0x0e, 0x44, 0x87, 0x7f, 0xc3, 0xc6, 0x07, 0x1d, 0x68, 0xc1, 0x50, 0xaa, + 0x07, 0x1f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x39, 0x31, 0x37, 0x30, 0x35, 0x06, + 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, + 0x55, 0x6e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, + 0x72, 0x74, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, + 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x33, + 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, + 0x30, 0x39, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x20, 0x32, 0x30, + 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, + 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xa4, 0x35, 0xc3, 0x82, + 0x3a, 0x37, 0x69, 0xcb, 0x8f, 0x6a, 0x3c, 0x53, 0x64, 0xda, 0x11, 0x79, + 0x90, 0x1f, 0x80, 0x44, 0x16, 0xcb, 0x25, 0x11, 0x12, 0x23, 0x6d, 0x82, + 0xb7, 0x5f, 0x00, 0x83, 0xdc, 0x13, 0x20, 0x10, 0x8e, 0x6d, 0x7d, 0xa7, + 0x57, 0x31, 0xe2, 0x2b, 0x49, 0x96, 0x4a, 0x5c, 0x0e, 0x6b, 0x1b, 0xa7, + 0x96, 0x31, 0x09, 0xfa, 0xd1, 0x68, 0xa6, 0x81, 0x23, 0x11, 0x9e, 0x26, + 0xb3, 0x08, 0xbd, 0x4f, 0x8a, 0x22, 0x02, 0xc6, 0xbc, 0x09, 0x34, 0xb6, + 0x6f, 0xbd, 0x51, 0x6f, 0x11, 0xd8, 0x84, 0x94, 0xae, 0x73, 0x13, 0xe9, + 0xac, 0x49, 0xa2, 0x81, 0xac, 0xa0, 0x21, 0xca, 0x11, 0x66, 0x41, 0x14, + 0x3b, 0x8a, 0x71, 0x14, 0x80, 0x74, 0x52, 0x2d, 0xda, 0x6c, 0x3e, 0xf0, + 0x89, 0xd0, 0xe5, 0x64, 0xae, 0x4a, 0xe1, 0x96, 0x82, 0x89, 0x86, 0x5e, + 0xfc, 0x2a, 0x2b, 0x59, 0x74, 0x20, 0x8a, 0x7d, 0x50, 0xf7, 0x77, 0x5b, + 0x3e, 0xd4, 0xda, 0x9d, 0xc6, 0xd1, 0xd5, 0xfc, 0x91, 0x63, 0x6d, 0xda, + 0x19, 0x1b, 0xc3, 0xb2, 0x60, 0x0a, 0x26, 0xc2, 0xf5, 0xc9, 0xdb, 0x27, + 0x6c, 0x40, 0xdd, 0x87, 0x1e, 0x30, 0xfd, 0x9d, 0xad, 0xb7, 0x49, 0x89, + 0xa0, 0x59, 0xcf, 0xc6, 0x07, 0x9d, 0x6f, 0x47, 0x37, 0xbb, 0xfd, 0x8b, + 0xb0, 0xde, 0x1a, 0xdb, 0x79, 0x58, 0x10, 0x11, 0x2c, 0x29, 0xd2, 0xbc, + 0xd1, 0x3b, 0x52, 0x3e, 0xb3, 0x91, 0xd7, 0xcc, 0x4e, 0x97, 0xc0, 0xde, + 0x50, 0x7f, 0x7e, 0xe6, 0x59, 0xab, 0x3b, 0x4c, 0x84, 0xe2, 0x97, 0x2c, + 0x73, 0xd3, 0xfb, 0xef, 0xc6, 0x16, 0x08, 0xff, 0xf7, 0xfd, 0x45, 0x11, + 0x49, 0xe3, 0x69, 0x36, 0x17, 0xcf, 0x4a, 0xa0, 0xf9, 0x66, 0x9b, 0xc9, + 0x51, 0xf0, 0x1b, 0x26, 0x92, 0x07, 0x8c, 0x2e, 0xf9, 0x1b, 0x01, 0x79, + 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06, + 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x9e, 0x10, 0x0a, 0x18, + 0xa0, 0xe1, 0xdb, 0x4f, 0x50, 0x6e, 0xb3, 0xa8, 0x1e, 0xf7, 0x03, 0x8b, + 0x81, 0xf2, 0xa7, 0x1d, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, + 0x18, 0x30, 0x16, 0x80, 0x14, 0x9e, 0x10, 0x0a, 0x18, 0xa0, 0xe1, 0xdb, + 0x4f, 0x50, 0x6e, 0xb3, 0xa8, 0x1e, 0xf7, 0x03, 0x8b, 0x81, 0xf2, 0xa7, + 0x1d, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, + 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x01, 0x00, 0x60, 0x89, 0x47, 0xb0, 0x88, 0xac, 0xe0, 0x25, 0x57, 0xe9, + 0x5f, 0x8d, 0x51, 0x8e, 0xb8, 0x93, 0x97, 0xab, 0xbf, 0xd4, 0x90, 0x0a, + 0x98, 0x3c, 0x6b, 0x12, 0x35, 0x16, 0x59, 0x60, 0x8d, 0x33, 0x55, 0x8d, + 0xaf, 0xea, 0x7a, 0x92, 0xc8, 0x7a, 0x10, 0x17, 0xe0, 0x9c, 0xa4, 0x35, + 0x49, 0xb3, 0x36, 0xe6, 0x32, 0xa8, 0xf4, 0xab, 0x6e, 0x4b, 0xbd, 0x05, + 0x52, 0x59, 0x2a, 0x99, 0xbc, 0x87, 0x57, 0x0a, 0xd3, 0x97, 0xf5, 0x99, + 0x7f, 0xc1, 0x4f, 0x9d, 0x6a, 0xbd, 0x19, 0x44, 0xd1, 0xf0, 0x1a, 0xf7, + 0xf3, 0x9d, 0x20, 0x09, 0x04, 0x34, 0x93, 0xe2, 0x44, 0x31, 0x30, 0x14, + 0x3d, 0x25, 0x4d, 0x93, 0x0d, 0xcc, 0xa3, 0x5b, 0x8f, 0x9f, 0xde, 0xfa, + 0x85, 0x74, 0x6f, 0x6d, 0xd6, 0x7a, 0xc9, 0x7d, 0x93, 0x14, 0x41, 0xce, + 0xd0, 0x07, 0x5d, 0xf4, 0x2c, 0x3d, 0x3c, 0xe3, 0x8b, 0xad, 0x57, 0x5a, + 0x60, 0x11, 0xe7, 0x41, 0xd7, 0xba, 0x84, 0x22, 0xe2, 0x59, 0x43, 0xbf, + 0xbb, 0x20, 0xac, 0x10, 0x66, 0xd3, 0x45, 0x37, 0xcc, 0xc4, 0x3d, 0xf6, + 0x1f, 0x6c, 0x0c, 0x3f, 0x60, 0x03, 0x9a, 0x6b, 0xd9, 0xd6, 0x84, 0xbc, + 0x20, 0x9b, 0xc5, 0xee, 0xe3, 0x8e, 0x96, 0xba, 0xf4, 0x28, 0x5a, 0xb2, + 0x82, 0xef, 0xb4, 0x41, 0x99, 0xf3, 0xa6, 0x1c, 0xbd, 0xfa, 0xa4, 0x79, + 0x0b, 0x05, 0x25, 0xa7, 0xd0, 0x45, 0xd6, 0x97, 0xe1, 0xc4, 0x3f, 0x80, + 0xa2, 0x88, 0x51, 0xcd, 0x9d, 0xbe, 0xf2, 0x32, 0x0e, 0x93, 0x0a, 0x06, + 0x31, 0x45, 0x6a, 0x95, 0x94, 0xe4, 0x77, 0xce, 0x2b, 0x07, 0x57, 0xe8, + 0xd5, 0x60, 0x4d, 0x64, 0x5e, 0xac, 0x0b, 0xc3, 0xf5, 0x00, 0xf0, 0xc5, + 0x40, 0x27, 0xd0, 0x80, 0x69, 0x7e, 0xde, 0xaa, 0x57, 0x1b, 0xd2, 0xc6, + 0x87, 0x52, 0x2b, 0x0e, 0x89, 0xeb, 0x31, 0x82, 0x02, 0x5c, 0x30, 0x82, + 0x02, 0x58, 0x02, 0x01, 0x01, 0x30, 0x49, 0x30, 0x31, 0x31, 0x2f, 0x30, + 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x26, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, + 0x74, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x20, 0x32, 0x02, 0x14, + 0x6d, 0x0c, 0xf0, 0x2d, 0x05, 0x1d, 0xa2, 0xa3, 0xa4, 0x71, 0x77, 0xf8, + 0xce, 0xcd, 0xaa, 0xc1, 0xcc, 0xa9, 0xd0, 0x16, 0x30, 0x0d, 0x06, 0x09, + 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05, 0x00, 0xa0, + 0x81, 0xe5, 0x30, 0x19, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x09, 0x03, 0x31, 0x0c, 0x06, 0x0a, 0x2b, 0x06, 0x01, 0x04, 0x01, + 0x82, 0x37, 0x02, 0x01, 0x04, 0x30, 0x1c, 0x06, 0x09, 0x2a, 0x86, 0x48, + 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x05, 0x31, 0x0f, 0x17, 0x0d, 0x32, 0x36, + 0x30, 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, + 0x2f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x04, + 0x31, 0x22, 0x04, 0x20, 0xcf, 0xb9, 0x17, 0xc7, 0x5e, 0x8f, 0x0b, 0x6c, + 0xf8, 0x20, 0x2a, 0x91, 0x74, 0xf6, 0x8e, 0x87, 0x64, 0x4b, 0xe4, 0x98, + 0x17, 0x14, 0x41, 0xb7, 0x97, 0xf5, 0xcf, 0xf0, 0xad, 0xf9, 0xa0, 0x98, + 0x30, 0x79, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, + 0x0f, 0x31, 0x6c, 0x30, 0x6a, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, 0x48, + 0x01, 0x65, 0x03, 0x04, 0x01, 0x2a, 0x30, 0x0b, 0x06, 0x09, 0x60, 0x86, + 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x16, 0x30, 0x0b, 0x06, 0x09, 0x60, + 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x01, 0x02, 0x30, 0x0a, 0x06, 0x08, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x07, 0x30, 0x0e, 0x06, 0x08, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, 0x02, 0x02, 0x00, 0x80, + 0x30, 0x0d, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, + 0x02, 0x01, 0x40, 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x07, + 0x30, 0x0d, 0x06, 0x08, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x03, 0x02, + 0x02, 0x01, 0x28, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82, 0x01, 0x00, 0x2c, 0x03, + 0x5d, 0x59, 0xfc, 0xd9, 0x3e, 0x54, 0x67, 0xce, 0x59, 0x4f, 0xd6, 0xc9, + 0x34, 0x97, 0x3f, 0xb5, 0xa3, 0xa1, 0xf2, 0x42, 0x0e, 0x8f, 0xeb, 0xc3, + 0xd5, 0x87, 0x31, 0x79, 0xbc, 0x79, 0xfc, 0x2a, 0x99, 0x0b, 0x85, 0x68, + 0xfb, 0xaf, 0xe0, 0xdb, 0x3d, 0x42, 0x0c, 0xbd, 0x67, 0x3c, 0xfa, 0xcf, + 0x9a, 0x85, 0x53, 0x7f, 0x49, 0xd1, 0x33, 0x27, 0x50, 0x86, 0xc9, 0x55, + 0x84, 0x6c, 0xfa, 0x16, 0x7c, 0x64, 0xfe, 0x16, 0x8e, 0x6f, 0xb9, 0xf3, + 0x80, 0x37, 0x8f, 0x81, 0xc9, 0xe4, 0x53, 0xa2, 0xcd, 0xe4, 0x5f, 0x79, + 0x86, 0xd9, 0x0a, 0x77, 0x17, 0xc4, 0x92, 0x95, 0x38, 0xdb, 0x40, 0x8e, + 0x5f, 0xd7, 0x91, 0xca, 0xf0, 0x1f, 0x57, 0x91, 0x91, 0xf8, 0x3c, 0x10, + 0x45, 0x1b, 0x2a, 0x06, 0x05, 0xa2, 0xd8, 0x9d, 0xc1, 0x9e, 0x3b, 0xde, + 0x69, 0x32, 0x1a, 0x2d, 0xa5, 0xf2, 0x90, 0x31, 0x6b, 0x9a, 0x93, 0x50, + 0x8d, 0xbb, 0x3c, 0x20, 0x22, 0x7c, 0x33, 0xe5, 0xe4, 0x73, 0xa9, 0xee, + 0xfa, 0x3e, 0x53, 0xef, 0x7d, 0x25, 0x39, 0x8f, 0x94, 0x4c, 0x72, 0xa7, + 0x8e, 0xe6, 0x3c, 0xb2, 0x88, 0x08, 0x65, 0xdf, 0x2d, 0x73, 0x29, 0x41, + 0x2e, 0xbb, 0xb9, 0x30, 0xd0, 0xd0, 0xe2, 0x9e, 0x0e, 0x54, 0x98, 0x89, + 0xbb, 0x68, 0x65, 0xa0, 0x8e, 0xd8, 0x31, 0x0c, 0x2f, 0x5f, 0x4b, 0x51, + 0xad, 0x26, 0x45, 0xa7, 0xde, 0xc0, 0xf4, 0x7a, 0xb3, 0x1d, 0xc4, 0xfc, + 0xe8, 0x68, 0xa4, 0x8c, 0xec, 0xe0, 0x39, 0x72, 0x83, 0x04, 0xb3, 0xc5, + 0xf6, 0x33, 0xa2, 0xa0, 0x22, 0x3a, 0x7e, 0x2e, 0x9d, 0x9f, 0x00, 0x53, + 0x2e, 0x49, 0x33, 0x42, 0xe6, 0x80, 0xa8, 0x1f, 0x44, 0xc2, 0xbd, 0xb6, + 0x7c, 0x5e, 0xc8, 0xb1, 0x23, 0x3b, 0x89, 0xa2, 0x4e, 0xec, 0x6d, 0x13, + 0x79, 0xf7, 0x00, 0x00, +}; +CONST UINTN mMultiSignedImageSize = sizeof (mMultiSignedImage); + +// +// Authenticode SHA-256 digest of the unsigned image +// +CONST UINT8 mUnsignedImageDigestSha256[] = { + 0x96, 0x8a, 0xd8, 0x5d, 0x87, 0x66, 0xa3, 0x72, 0x26, 0xcd, 0x08, 0xe4, + 0x9c, 0x7e, 0x13, 0x24, 0x75, 0x30, 0x8e, 0xb2, 0xc1, 0x1b, 0x7d, 0x4b, + 0xec, 0xf6, 0x90, 0x96, 0x61, 0x70, 0xbc, 0x32, +}; +CONST UINTN mUnsignedImageDigestSha256Size = sizeof (mUnsignedImageDigestSha256); + +// +// Authenticode SHA-384 digest of the unsigned image +// +CONST UINT8 mUnsignedImageDigestSha384[] = { + 0xf3, 0xde, 0x18, 0x1b, 0x62, 0x52, 0xcb, 0xa9, 0x8d, 0x8e, 0x8a, 0xe1, + 0x8e, 0xab, 0x7e, 0xc6, 0x55, 0x85, 0x46, 0x6d, 0x28, 0xe0, 0xf1, 0xf5, + 0x4a, 0xd9, 0x32, 0x78, 0x4f, 0xf8, 0x3e, 0x9f, 0xf8, 0x05, 0x4a, 0xf8, + 0x21, 0xa3, 0x20, 0x9c, 0x51, 0x28, 0x54, 0xc3, 0x7c, 0xd7, 0x56, 0x31, +}; +CONST UINTN mUnsignedImageDigestSha384Size = sizeof (mUnsignedImageDigestSha384); + +// +// Authenticode SHA-512 digest of the unsigned image +// +CONST UINT8 mUnsignedImageDigestSha512[] = { + 0x3d, 0x95, 0x94, 0x51, 0x91, 0xda, 0x03, 0xbc, 0x25, 0x93, 0xfd, 0xf4, + 0x9a, 0x40, 0x22, 0xa1, 0x13, 0xec, 0x9e, 0xb0, 0x93, 0xbc, 0x38, 0x56, + 0x00, 0xe8, 0xe9, 0x3d, 0xea, 0xd0, 0xa3, 0xb2, 0x73, 0x8a, 0xfc, 0x6b, + 0xd5, 0x48, 0x9d, 0xff, 0xc2, 0x06, 0x48, 0x57, 0xaf, 0xbf, 0xf9, 0x2a, + 0x2b, 0x0c, 0x68, 0x97, 0xa0, 0x84, 0x54, 0x3e, 0x08, 0xdb, 0x15, 0xf3, + 0x89, 0xe0, 0xf9, 0xef, +}; +CONST UINTN mUnsignedImageDigestSha512Size = sizeof (mUnsignedImageDigestSha512); + +// +// Authenticode SHA-256 digest of the signed image +// +CONST UINT8 mSignedImageDigestSha256[] = { + 0x96, 0x8a, 0xd8, 0x5d, 0x87, 0x66, 0xa3, 0x72, 0x26, 0xcd, 0x08, 0xe4, + 0x9c, 0x7e, 0x13, 0x24, 0x75, 0x30, 0x8e, 0xb2, 0xc1, 0x1b, 0x7d, 0x4b, + 0xec, 0xf6, 0x90, 0x96, 0x61, 0x70, 0xbc, 0x32, +}; +CONST UINTN mSignedImageDigestSha256Size = sizeof (mSignedImageDigestSha256); + +// +// Authenticode SHA-384 digest of the signed image +// +CONST UINT8 mSignedImageDigestSha384[] = { + 0xf3, 0xde, 0x18, 0x1b, 0x62, 0x52, 0xcb, 0xa9, 0x8d, 0x8e, 0x8a, 0xe1, + 0x8e, 0xab, 0x7e, 0xc6, 0x55, 0x85, 0x46, 0x6d, 0x28, 0xe0, 0xf1, 0xf5, + 0x4a, 0xd9, 0x32, 0x78, 0x4f, 0xf8, 0x3e, 0x9f, 0xf8, 0x05, 0x4a, 0xf8, + 0x21, 0xa3, 0x20, 0x9c, 0x51, 0x28, 0x54, 0xc3, 0x7c, 0xd7, 0x56, 0x31, +}; +CONST UINTN mSignedImageDigestSha384Size = sizeof (mSignedImageDigestSha384); + +// +// Authenticode SHA-512 digest of the signed image +// +CONST UINT8 mSignedImageDigestSha512[] = { + 0x3d, 0x95, 0x94, 0x51, 0x91, 0xda, 0x03, 0xbc, 0x25, 0x93, 0xfd, 0xf4, + 0x9a, 0x40, 0x22, 0xa1, 0x13, 0xec, 0x9e, 0xb0, 0x93, 0xbc, 0x38, 0x56, + 0x00, 0xe8, 0xe9, 0x3d, 0xea, 0xd0, 0xa3, 0xb2, 0x73, 0x8a, 0xfc, 0x6b, + 0xd5, 0x48, 0x9d, 0xff, 0xc2, 0x06, 0x48, 0x57, 0xaf, 0xbf, 0xf9, 0x2a, + 0x2b, 0x0c, 0x68, 0x97, 0xa0, 0x84, 0x54, 0x3e, 0x08, 0xdb, 0x15, 0xf3, + 0x89, 0xe0, 0xf9, 0xef, +}; +CONST UINTN mSignedImageDigestSha512Size = sizeof (mSignedImageDigestSha512); + +// +// Authenticode SHA-256 digest of the multi-signed image +// +CONST UINT8 mMultiSignedImageDigestSha256[] = { + 0x96, 0x8a, 0xd8, 0x5d, 0x87, 0x66, 0xa3, 0x72, 0x26, 0xcd, 0x08, 0xe4, + 0x9c, 0x7e, 0x13, 0x24, 0x75, 0x30, 0x8e, 0xb2, 0xc1, 0x1b, 0x7d, 0x4b, + 0xec, 0xf6, 0x90, 0x96, 0x61, 0x70, 0xbc, 0x32, +}; +CONST UINTN mMultiSignedImageDigestSha256Size = sizeof (mMultiSignedImageDigestSha256); + +// +// Authenticode SHA-384 digest of the multi-signed image +// +CONST UINT8 mMultiSignedImageDigestSha384[] = { + 0xf3, 0xde, 0x18, 0x1b, 0x62, 0x52, 0xcb, 0xa9, 0x8d, 0x8e, 0x8a, 0xe1, + 0x8e, 0xab, 0x7e, 0xc6, 0x55, 0x85, 0x46, 0x6d, 0x28, 0xe0, 0xf1, 0xf5, + 0x4a, 0xd9, 0x32, 0x78, 0x4f, 0xf8, 0x3e, 0x9f, 0xf8, 0x05, 0x4a, 0xf8, + 0x21, 0xa3, 0x20, 0x9c, 0x51, 0x28, 0x54, 0xc3, 0x7c, 0xd7, 0x56, 0x31, +}; +CONST UINTN mMultiSignedImageDigestSha384Size = sizeof (mMultiSignedImageDigestSha384); + +// +// Authenticode SHA-512 digest of the multi-signed image +// +CONST UINT8 mMultiSignedImageDigestSha512[] = { + 0x3d, 0x95, 0x94, 0x51, 0x91, 0xda, 0x03, 0xbc, 0x25, 0x93, 0xfd, 0xf4, + 0x9a, 0x40, 0x22, 0xa1, 0x13, 0xec, 0x9e, 0xb0, 0x93, 0xbc, 0x38, 0x56, + 0x00, 0xe8, 0xe9, 0x3d, 0xea, 0xd0, 0xa3, 0xb2, 0x73, 0x8a, 0xfc, 0x6b, + 0xd5, 0x48, 0x9d, 0xff, 0xc2, 0x06, 0x48, 0x57, 0xaf, 0xbf, 0xf9, 0x2a, + 0x2b, 0x0c, 0x68, 0x97, 0xa0, 0x84, 0x54, 0x3e, 0x08, 0xdb, 0x15, 0xf3, + 0x89, 0xe0, 0xf9, 0xef, +}; +CONST UINTN mMultiSignedImageDigestSha512Size = sizeof (mMultiSignedImageDigestSha512); + +// +// DER-encoded X.509 signer 1 leaf signing certificate +// +CONST UINT8 mLeafCert[] = { + 0x30, 0x82, 0x03, 0x71, 0x30, 0x82, 0x02, 0x59, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x71, 0xb5, 0x0a, 0x74, 0x69, 0x1a, 0x2e, 0xf8, 0x57, + 0xff, 0xaa, 0x62, 0x03, 0x18, 0x11, 0xc2, 0x0d, 0x63, 0x88, 0xb4, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, + 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, + 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, + 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, 0x34, + 0x31, 0x32, 0x30, 0x30, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x29, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, + 0x54, 0x65, 0x73, 0x74, 0x20, 0x4c, 0x65, 0x61, 0x66, 0x20, 0x53, 0x69, + 0x67, 0x6e, 0x65, 0x72, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xa1, 0x3b, 0xcf, 0x40, 0x63, 0x36, 0x7e, 0xb4, 0x40, 0x53, 0x74, + 0x5a, 0xc0, 0x02, 0xea, 0xef, 0x3e, 0xe0, 0x4c, 0x12, 0xf3, 0x28, 0x53, + 0x99, 0xa6, 0x48, 0x13, 0xee, 0xc7, 0x00, 0xb8, 0x23, 0x74, 0xf3, 0xf4, + 0x03, 0xc5, 0xed, 0xfb, 0x5a, 0x1a, 0xae, 0x73, 0x6a, 0xfd, 0xee, 0x08, + 0x37, 0x18, 0x2c, 0xe3, 0x5a, 0x98, 0x6f, 0xb3, 0x00, 0x4e, 0x4f, 0xbe, + 0x06, 0xe4, 0xe4, 0xee, 0x24, 0x53, 0xcb, 0xe3, 0xb3, 0x88, 0x6c, 0xeb, + 0xe2, 0x84, 0xd9, 0x1b, 0xd7, 0x06, 0x8d, 0x6d, 0xbc, 0x60, 0xe2, 0xbf, + 0xff, 0x50, 0xd1, 0x92, 0xcc, 0x1d, 0xbb, 0x91, 0x1e, 0x72, 0x39, 0x48, + 0x6c, 0x4f, 0x02, 0x7c, 0x86, 0x34, 0x53, 0xfe, 0xeb, 0x31, 0x10, 0x9d, + 0xa7, 0xa2, 0x12, 0x3e, 0x6b, 0x7b, 0xa3, 0xba, 0xaa, 0x42, 0x18, 0xa3, + 0x0d, 0xb9, 0x2a, 0x56, 0x0b, 0xdc, 0x0f, 0x78, 0x41, 0xd1, 0xe4, 0x12, + 0x2e, 0x26, 0x01, 0x37, 0x32, 0xbf, 0x17, 0x2e, 0x3f, 0x70, 0xdc, 0xac, + 0x26, 0x2c, 0x3f, 0x99, 0xdd, 0xf0, 0xb2, 0x81, 0x92, 0xd8, 0x88, 0xb6, + 0x1c, 0x6e, 0x5b, 0x8a, 0x3d, 0x5a, 0x66, 0x28, 0x1a, 0x6c, 0xf3, 0x7a, + 0x4a, 0x7f, 0x1f, 0x8b, 0x2b, 0x57, 0x94, 0x92, 0xe7, 0x1f, 0x0e, 0x70, + 0x07, 0x6f, 0x0e, 0x48, 0x30, 0xc5, 0x76, 0x11, 0x27, 0x1f, 0x43, 0x17, + 0x4d, 0x8a, 0x2f, 0x65, 0x2e, 0xfb, 0xb6, 0x7c, 0x17, 0x83, 0x77, 0xb2, + 0xa2, 0x7c, 0xb5, 0x54, 0x95, 0x23, 0xbe, 0x3a, 0x40, 0x9b, 0x8a, 0xe2, + 0xa3, 0x94, 0x0c, 0xb1, 0xff, 0x62, 0x4b, 0x74, 0xfc, 0xc1, 0xc4, 0x63, + 0x2e, 0x61, 0xee, 0x09, 0xc5, 0xf6, 0xe4, 0x8f, 0x6a, 0x33, 0x41, 0x3d, + 0x7f, 0x5a, 0x4f, 0xd6, 0x66, 0x33, 0x30, 0x9a, 0x80, 0x4d, 0xf3, 0xbe, + 0x72, 0x3f, 0x86, 0x52, 0x1f, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x75, + 0x30, 0x73, 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, + 0x04, 0x02, 0x30, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, + 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x13, 0x06, 0x03, + 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, + 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x72, 0x8a, 0xd7, 0xd4, 0xaf, 0x15, 0x1e, 0x35, + 0xcf, 0x72, 0x14, 0x49, 0x8b, 0x01, 0xd0, 0xb6, 0x4b, 0x48, 0x1d, 0x23, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, 0xe4, 0x50, 0xed, 0x2f, 0x6f, + 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, 0x5c, 0x76, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x32, 0xcc, 0x95, 0xe4, 0xe2, 0x7e, 0x2c, + 0x74, 0x33, 0x45, 0x7e, 0xd3, 0xcd, 0x0b, 0xda, 0x0e, 0xe7, 0x16, 0x8f, + 0x60, 0xb1, 0x4c, 0x6f, 0x3e, 0xb9, 0xa1, 0xe5, 0x00, 0x2c, 0x9f, 0x5b, + 0x65, 0x8d, 0x4e, 0xc1, 0x74, 0x03, 0x30, 0xf0, 0xc1, 0xbd, 0x33, 0x81, + 0xf1, 0x3b, 0x0d, 0x63, 0x86, 0x7f, 0x0d, 0x68, 0x1c, 0xaf, 0x22, 0xa4, + 0xf1, 0xf2, 0xb7, 0x35, 0x2d, 0x3d, 0xa5, 0xc4, 0x54, 0x0d, 0x16, 0xc8, + 0x7f, 0xc7, 0xe2, 0x5d, 0xba, 0x1c, 0x52, 0xcb, 0x6e, 0x81, 0xe8, 0xb9, + 0x4a, 0x11, 0xb4, 0xf7, 0x70, 0x0b, 0x70, 0xf3, 0xfe, 0x0c, 0xb1, 0x15, + 0x31, 0x57, 0x63, 0x9a, 0xbc, 0xbc, 0x9a, 0xc5, 0x40, 0xab, 0xdd, 0xc3, + 0xc5, 0xc0, 0xfd, 0x47, 0x79, 0x85, 0x96, 0x4c, 0x3d, 0xa4, 0x3e, 0x6e, + 0xaf, 0x30, 0xd2, 0x20, 0x30, 0x6b, 0x32, 0xa3, 0x8d, 0x6c, 0xb7, 0x5e, + 0xa9, 0x9b, 0x31, 0x98, 0x25, 0xed, 0x1f, 0xf6, 0x3c, 0x59, 0xc3, 0x77, + 0xca, 0x83, 0x49, 0x28, 0xe6, 0x20, 0xc4, 0x32, 0xc4, 0x15, 0x15, 0xac, + 0xa7, 0x54, 0xd1, 0xa5, 0xc6, 0xe8, 0xc5, 0x7c, 0x0f, 0x23, 0x31, 0xe3, + 0x06, 0xad, 0x48, 0x9c, 0xf6, 0xb1, 0xd5, 0x9f, 0xed, 0xee, 0xf4, 0x1c, + 0xe3, 0xce, 0x3e, 0xf3, 0x27, 0x28, 0x19, 0x20, 0xb9, 0xcb, 0x4d, 0x85, + 0xdd, 0xf9, 0xc8, 0xec, 0x2e, 0x60, 0xd1, 0xf7, 0x48, 0xba, 0x25, 0xf7, + 0x4f, 0x0e, 0x47, 0x9e, 0xc8, 0xc8, 0xaa, 0x74, 0xb5, 0x5f, 0x90, 0xc6, + 0xfa, 0xb9, 0xdf, 0x95, 0x88, 0xe8, 0x00, 0xc3, 0x90, 0xa6, 0x9f, 0x06, + 0xda, 0xf5, 0x9e, 0x04, 0x55, 0xd7, 0x68, 0xe0, 0x1f, 0x37, 0xbe, 0x4f, + 0xe9, 0x7a, 0x0f, 0x3e, 0xc8, 0x60, 0x84, 0xc3, 0x78, 0x0b, 0xd9, 0xc8, + 0xd9, 0xe9, 0x66, 0xea, 0xd7, 0x5b, 0x83, 0x63, 0x3e, +}; +CONST UINTN mLeafCertSize = sizeof (mLeafCert); + +// +// DER-encoded X.509 signer 1 intermediate 1 CA certificate +// +CONST UINT8 mIntermediate1Cert[] = { + 0x30, 0x82, 0x03, 0x5b, 0x30, 0x82, 0x02, 0x43, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x29, 0xe7, 0xee, 0xbe, 0xd0, 0xf2, 0x0a, 0x30, 0xc2, + 0xd1, 0x41, 0xc9, 0x4d, 0x24, 0xd9, 0x8a, 0xfe, 0x42, 0x3d, 0x85, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, + 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, + 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, + 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x31, 0x20, 0x43, 0x41, + 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, + 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, + 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xb0, 0x99, 0x93, + 0xd5, 0xe0, 0x9e, 0xc7, 0x39, 0xd2, 0x44, 0x31, 0x5f, 0x1c, 0xd3, 0x87, + 0x2c, 0xcf, 0x36, 0xc4, 0xe5, 0x0d, 0xda, 0x60, 0x66, 0x88, 0x05, 0x15, + 0xf6, 0x12, 0xe3, 0x61, 0x73, 0xec, 0xcf, 0x2e, 0xd9, 0xf6, 0x81, 0x1a, + 0xe9, 0x52, 0xa8, 0x37, 0x94, 0x5a, 0xb8, 0x30, 0xb8, 0x10, 0x2e, 0x23, + 0xfe, 0xfd, 0x9e, 0x36, 0x1f, 0x45, 0xe2, 0x8c, 0x87, 0x8e, 0xa2, 0x42, + 0xb2, 0x88, 0xcc, 0xad, 0x79, 0xc6, 0xb7, 0xa2, 0x6f, 0x74, 0x28, 0x6e, + 0x76, 0x62, 0xc4, 0x13, 0xcc, 0x05, 0xac, 0xfe, 0xd4, 0x5e, 0x6c, 0x4d, + 0x19, 0x3f, 0x41, 0xb9, 0x5f, 0x5f, 0xef, 0xeb, 0x0d, 0xf9, 0xaa, 0x65, + 0x62, 0x64, 0x8d, 0x84, 0xc6, 0xd1, 0xf5, 0x24, 0x37, 0x97, 0xf1, 0x52, + 0x9b, 0x98, 0x28, 0x6b, 0x3d, 0xda, 0x2b, 0xdd, 0x68, 0x98, 0x4a, 0x8c, + 0x99, 0xe1, 0xec, 0xf0, 0x22, 0x43, 0x8a, 0x01, 0xeb, 0xa9, 0xf9, 0x3d, + 0x2f, 0x58, 0x62, 0x36, 0x7e, 0xc8, 0x62, 0x01, 0x3f, 0x38, 0xcb, 0x09, + 0x91, 0x52, 0x2b, 0x8a, 0xde, 0x93, 0x44, 0xaa, 0x31, 0x6c, 0x0c, 0x86, + 0x31, 0x4a, 0x89, 0xed, 0x3f, 0x01, 0xc4, 0x88, 0xb2, 0x00, 0x05, 0x25, + 0xeb, 0xa2, 0xa7, 0xe7, 0x98, 0x01, 0xb6, 0x0f, 0x2f, 0x12, 0xbf, 0x32, + 0xe4, 0x95, 0x40, 0x94, 0x12, 0x82, 0xf5, 0xc4, 0x48, 0x35, 0x38, 0x8f, + 0x10, 0xfb, 0xf8, 0x55, 0x23, 0x1c, 0x88, 0x56, 0xa1, 0xa9, 0x84, 0x89, + 0x5b, 0xb9, 0x20, 0xab, 0xd8, 0x46, 0x06, 0xa3, 0x49, 0x0b, 0xfa, 0x95, + 0x5a, 0x80, 0x46, 0x19, 0xe4, 0x46, 0x5a, 0x22, 0xdc, 0x09, 0xb0, 0xa8, + 0xbb, 0xac, 0x2b, 0xb1, 0x39, 0xbd, 0xa1, 0x1e, 0x73, 0xde, 0x87, 0x8f, + 0x87, 0x16, 0xe8, 0x78, 0xcd, 0x04, 0xa8, 0x21, 0xd3, 0x5f, 0x57, 0xcb, + 0x47, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, + 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, + 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, + 0xe0, 0x88, 0x60, 0x2e, 0x36, 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, + 0x80, 0xa1, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, + 0x16, 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, + 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x07, 0x3d, 0x41, 0xe5, 0x4e, + 0xb5, 0x79, 0x2e, 0xaf, 0x85, 0xa4, 0xd2, 0x86, 0xcc, 0x21, 0x61, 0xc1, + 0x68, 0x0d, 0x6e, 0xac, 0xd9, 0x13, 0x38, 0xed, 0x12, 0x25, 0x96, 0x31, + 0xd7, 0x43, 0xa3, 0xac, 0x49, 0x5d, 0x4b, 0x18, 0x94, 0x39, 0x58, 0x22, + 0x10, 0x6b, 0x49, 0x02, 0xd9, 0x3e, 0x86, 0x75, 0x21, 0xe5, 0x19, 0x95, + 0x28, 0x16, 0x81, 0xf6, 0x42, 0x43, 0x26, 0x16, 0x3c, 0xcd, 0xbd, 0xed, + 0xb4, 0x0c, 0x26, 0xdf, 0xb4, 0x72, 0x53, 0x6b, 0xbc, 0x2c, 0x25, 0x59, + 0x6f, 0xb0, 0x5b, 0x1a, 0x9b, 0x8b, 0xd5, 0xc0, 0xf1, 0x70, 0x7c, 0xae, + 0xdc, 0xfe, 0xa6, 0x3e, 0xe0, 0x2a, 0xc6, 0x87, 0x5a, 0x5f, 0x4f, 0xa2, + 0x47, 0x4e, 0x0c, 0xbf, 0x25, 0xfb, 0x51, 0xdf, 0xda, 0x1f, 0xbb, 0x28, + 0xdf, 0x52, 0x5c, 0x1e, 0xc5, 0x6d, 0x38, 0x37, 0x7f, 0x86, 0xf5, 0xc0, + 0x81, 0xc2, 0x80, 0xab, 0x70, 0xf4, 0x12, 0x83, 0x50, 0x56, 0x19, 0x2a, + 0x06, 0x8b, 0xb2, 0x7e, 0xd8, 0x3b, 0x56, 0xe3, 0xbd, 0x56, 0x1b, 0x3b, + 0x60, 0x90, 0xb6, 0x2c, 0xdb, 0x5b, 0x9a, 0xb0, 0xd8, 0x7a, 0xaa, 0xcc, + 0x02, 0x99, 0x0c, 0xb2, 0x21, 0xc3, 0x02, 0x1c, 0x23, 0xc5, 0x46, 0x93, + 0x2e, 0xc9, 0xf1, 0x3e, 0xec, 0xcd, 0x15, 0x11, 0xc3, 0x94, 0xb1, 0x6a, + 0x10, 0x6f, 0x35, 0x42, 0x91, 0x2a, 0x78, 0xcf, 0x8f, 0x16, 0x1a, 0x82, + 0x8f, 0xae, 0xa8, 0x53, 0x56, 0xb2, 0x7e, 0x3a, 0x2d, 0x52, 0x04, 0x65, + 0xfa, 0xbb, 0xb0, 0xac, 0x6c, 0xb5, 0xf6, 0xbd, 0x05, 0xd4, 0x9f, 0xc3, + 0x8b, 0xca, 0xb0, 0x4f, 0x9f, 0x15, 0x21, 0xba, 0x8a, 0x94, 0x17, 0x53, + 0x13, 0x8b, 0xb7, 0x4d, 0xe9, 0xdc, 0xc7, 0x26, 0x47, 0x02, 0xf0, 0x4b, + 0x75, 0xbe, 0x84, 0x73, 0x02, 0x1e, 0x14, 0x97, 0x99, 0x91, 0x5b, +}; +CONST UINTN mIntermediate1CertSize = sizeof (mIntermediate1Cert); + +// +// DER-encoded X.509 signer 1 intermediate 2 CA certificate +// +CONST UINT8 mIntermediate2Cert[] = { + 0x30, 0x82, 0x03, 0x65, 0x30, 0x82, 0x02, 0x4d, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x2c, 0xcc, 0x3e, 0x1f, 0x6c, 0x46, 0x86, 0x7a, 0x93, + 0x05, 0x4f, 0x73, 0x7b, 0xc5, 0x14, 0x61, 0x37, 0xaa, 0x40, 0x10, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x3a, 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x2f, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x31, 0x20, + 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, + 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, + 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x30, 0x3a, + 0x31, 0x38, 0x30, 0x36, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2f, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, + 0x54, 0x65, 0x73, 0x74, 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, + 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x32, 0x20, 0x43, 0x41, 0x30, 0x82, + 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, + 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, + 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbb, 0x80, 0xcb, 0x94, 0xf5, + 0x0d, 0xbf, 0xbf, 0xe4, 0xfc, 0xd2, 0x21, 0x71, 0x5f, 0x1d, 0x25, 0x78, + 0x3c, 0xd2, 0x3a, 0x62, 0x35, 0x1a, 0xa9, 0xa2, 0x13, 0x54, 0x33, 0x73, + 0x6c, 0x39, 0x18, 0x96, 0x8f, 0x0a, 0xe2, 0x01, 0x2c, 0x54, 0x85, 0x3e, + 0xeb, 0xd5, 0xc8, 0xa3, 0xdf, 0xd8, 0x3f, 0x6c, 0x96, 0x4a, 0xc6, 0x19, + 0xbc, 0xfd, 0x7a, 0x9b, 0x28, 0xd0, 0xe9, 0x07, 0x82, 0xeb, 0xdb, 0x42, + 0x6d, 0x9f, 0xb6, 0xac, 0xa3, 0xc1, 0x0a, 0xff, 0x58, 0x85, 0x10, 0x31, + 0x0e, 0xf4, 0xb2, 0xb2, 0x49, 0xb0, 0x72, 0x4a, 0x81, 0x93, 0x60, 0x11, + 0x40, 0xde, 0xc4, 0x91, 0xfb, 0xcc, 0x45, 0x21, 0xfa, 0x4c, 0x81, 0x2a, + 0xf4, 0xc5, 0x27, 0x70, 0x74, 0x50, 0x82, 0x6f, 0x5f, 0xda, 0x94, 0xf1, + 0xda, 0xbc, 0x74, 0x98, 0x56, 0xcd, 0xe5, 0x82, 0xa7, 0x17, 0xd3, 0x45, + 0x36, 0x05, 0x6a, 0x3d, 0xc5, 0x35, 0x61, 0xda, 0x44, 0xbb, 0x87, 0x25, + 0xc9, 0xcd, 0x52, 0x55, 0xd9, 0x43, 0x24, 0xa6, 0xeb, 0x13, 0x29, 0xec, + 0x9b, 0x4a, 0xb2, 0x21, 0x99, 0xd3, 0xec, 0x9f, 0xf6, 0x1a, 0x2e, 0x4f, + 0x6c, 0x51, 0x96, 0xc0, 0x6a, 0xb8, 0x10, 0x6e, 0x75, 0x2d, 0x0f, 0x09, + 0x53, 0x92, 0x28, 0xd8, 0x8f, 0xe7, 0x4a, 0x92, 0x40, 0x1b, 0xdb, 0x93, + 0x30, 0xc7, 0x6e, 0x42, 0x60, 0x6a, 0xe2, 0x2b, 0x29, 0x94, 0x70, 0x3f, + 0xb3, 0xf0, 0xf1, 0x18, 0x84, 0xb7, 0x6d, 0xb8, 0x29, 0xcb, 0x72, 0x08, + 0xcb, 0x27, 0x18, 0xe1, 0x0a, 0x9c, 0xc3, 0x0b, 0x62, 0x77, 0xbc, 0x1f, + 0xb4, 0x56, 0x48, 0xa7, 0xdb, 0xf3, 0x29, 0x33, 0xe6, 0x97, 0xb8, 0x2f, + 0x6c, 0x52, 0xa8, 0xdd, 0xf2, 0x82, 0xfa, 0xcc, 0xf1, 0xcc, 0x0d, 0x0b, + 0xaa, 0xf9, 0x34, 0x6e, 0x9a, 0x48, 0x9b, 0x44, 0x43, 0x70, 0xe3, 0x02, + 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, 0x30, 0x0f, 0x06, 0x03, + 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, + 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, + 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, + 0x04, 0x16, 0x04, 0x14, 0x14, 0x7f, 0x49, 0x46, 0x1c, 0x3a, 0xe4, 0x50, + 0xed, 0x2f, 0x6f, 0x06, 0x8f, 0x9a, 0x17, 0x23, 0x47, 0x78, 0x5c, 0x76, + 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, + 0x14, 0x4d, 0xdb, 0x41, 0x84, 0xf5, 0xd4, 0xe0, 0x88, 0x60, 0x2e, 0x36, + 0x47, 0x05, 0x35, 0xae, 0x89, 0x83, 0xa6, 0x80, 0xa1, 0x30, 0x0d, 0x06, + 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, + 0x03, 0x82, 0x01, 0x01, 0x00, 0x68, 0x6c, 0x45, 0xf9, 0xea, 0x75, 0xac, + 0xbf, 0xfc, 0x1b, 0xcc, 0x42, 0xa1, 0x55, 0xb7, 0x19, 0xb9, 0x67, 0x83, + 0x0c, 0x15, 0x94, 0xdb, 0x1b, 0x31, 0x33, 0xf5, 0xff, 0x6b, 0xae, 0xb9, + 0x06, 0x7e, 0xd1, 0x19, 0x2e, 0x97, 0x84, 0xd7, 0xd7, 0xc5, 0x23, 0xac, + 0x21, 0xb8, 0x70, 0xd4, 0xa7, 0x5e, 0x3c, 0xf9, 0x83, 0x68, 0xc4, 0xc1, + 0x7b, 0xb7, 0x86, 0xc1, 0x11, 0xd7, 0xd7, 0xa1, 0x63, 0x8a, 0x04, 0x10, + 0x03, 0x34, 0x5f, 0x04, 0x6c, 0x18, 0x37, 0xb1, 0x9c, 0xe9, 0x2e, 0x24, + 0xd1, 0x10, 0xb8, 0x69, 0x05, 0x96, 0x2a, 0x30, 0xd9, 0x12, 0x9e, 0xdb, + 0xfb, 0x12, 0x5e, 0x2b, 0x7b, 0xc7, 0x55, 0x32, 0xa0, 0x87, 0x16, 0xdb, + 0x2f, 0x5f, 0x12, 0x70, 0xff, 0x76, 0xe9, 0x05, 0x62, 0xfb, 0xe1, 0x03, + 0x51, 0xe7, 0x87, 0xa0, 0x50, 0x63, 0xbc, 0xe9, 0x6a, 0x4f, 0x47, 0xd9, + 0xde, 0xe8, 0x28, 0xd0, 0x69, 0xcf, 0x29, 0x35, 0x7c, 0x3c, 0x7f, 0x29, + 0x65, 0xb0, 0x2f, 0x69, 0xba, 0xa2, 0x20, 0x90, 0xf0, 0x75, 0xd1, 0x02, + 0xf6, 0xae, 0xd0, 0x5f, 0xbe, 0x5d, 0xce, 0x6d, 0xce, 0x76, 0xc6, 0x61, + 0x0f, 0x75, 0xdb, 0x3f, 0x08, 0xaf, 0x96, 0x15, 0x95, 0x57, 0x7d, 0xa1, + 0x80, 0x59, 0x4c, 0xba, 0x3b, 0x95, 0x6b, 0x78, 0xee, 0xc1, 0xad, 0x5a, + 0x68, 0xa0, 0x6e, 0x25, 0x86, 0x58, 0xa2, 0x46, 0xee, 0x62, 0xf7, 0x88, + 0x28, 0xbb, 0x60, 0x33, 0x32, 0xf4, 0xce, 0x5f, 0x86, 0x3a, 0xd3, 0x2a, + 0xe3, 0x3e, 0x2d, 0xda, 0x59, 0xc1, 0xab, 0x90, 0x8c, 0xc9, 0xa9, 0x78, + 0x8b, 0xb7, 0x4c, 0x43, 0xc2, 0x53, 0x3d, 0x92, 0x20, 0xdf, 0xf2, 0x55, + 0xb0, 0x2b, 0xc9, 0x2b, 0x36, 0xf3, 0xbe, 0xd2, 0x3f, 0x9d, 0x8c, 0x32, + 0x99, 0x38, 0xf7, 0x15, 0x20, 0xb9, 0xf3, 0x4b, 0x03, +}; +CONST UINTN mIntermediate2CertSize = sizeof (mIntermediate2Cert); + +// +// DER-encoded X.509 signer 1 root CA certificate +// +CONST UINT8 mRootCert[] = { + 0x30, 0x82, 0x03, 0x51, 0x30, 0x82, 0x02, 0x39, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x15, 0x68, 0xb3, 0x37, 0x3a, 0x6a, 0x85, 0x56, 0xc8, + 0x38, 0x5a, 0xcc, 0xcc, 0x2c, 0xda, 0xac, 0x35, 0x6a, 0x40, 0x9e, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, + 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, + 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, 0x17, 0x0d, 0x33, + 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x36, 0x5a, + 0x30, 0x30, 0x31, 0x2e, 0x30, 0x2c, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, + 0x25, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, + 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x52, 0x6f, 0x6f, 0x74, 0x20, + 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, + 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, + 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xbe, + 0x63, 0xe7, 0x31, 0xf6, 0xc3, 0x1d, 0x9d, 0xd3, 0x47, 0x42, 0x28, 0x5c, + 0x1c, 0xf0, 0xc6, 0x00, 0xfa, 0x70, 0x23, 0x7a, 0xe5, 0x8b, 0x32, 0xb3, + 0xd7, 0x09, 0x80, 0xde, 0xb4, 0x6b, 0x02, 0x0e, 0x20, 0x42, 0x34, 0x74, + 0x94, 0x66, 0xeb, 0x32, 0xeb, 0x95, 0xb6, 0x95, 0xe4, 0x6a, 0xb9, 0x85, + 0x08, 0xee, 0xd6, 0x8f, 0x61, 0xd6, 0x23, 0x3c, 0xb2, 0xa0, 0x38, 0xfb, + 0x48, 0x26, 0xc9, 0x4a, 0x4f, 0x68, 0x4c, 0x9a, 0x93, 0x84, 0x75, 0x72, + 0x7d, 0xa5, 0xac, 0xed, 0xab, 0x21, 0x71, 0x1c, 0x34, 0x64, 0x07, 0x2f, + 0xe5, 0x1f, 0xb4, 0xeb, 0x31, 0x6d, 0xc9, 0x9b, 0x7c, 0xe8, 0xcc, 0x49, + 0xdc, 0x7d, 0x27, 0x08, 0x9d, 0xa2, 0x91, 0xf3, 0x9d, 0xad, 0xa0, 0xaa, + 0x21, 0x53, 0x76, 0xa7, 0x81, 0x04, 0x1a, 0x74, 0x89, 0xd6, 0x45, 0x72, + 0x7c, 0x37, 0x22, 0xa4, 0xf7, 0x36, 0x5b, 0x80, 0xce, 0xe2, 0x91, 0x60, + 0xee, 0x91, 0xef, 0xc0, 0x25, 0x92, 0x05, 0xa3, 0x24, 0xa2, 0x4c, 0xa2, + 0x93, 0xd0, 0x80, 0x61, 0xc0, 0x9c, 0xdf, 0xc1, 0xeb, 0xed, 0x2e, 0x23, + 0x30, 0xe8, 0xd8, 0xea, 0xc4, 0x5b, 0x2a, 0x4c, 0x00, 0xa4, 0xdf, 0xa2, + 0xa3, 0x39, 0x32, 0x80, 0xb2, 0x1d, 0x81, 0xa9, 0x26, 0x43, 0x07, 0xc5, + 0xf0, 0x8d, 0x2c, 0x61, 0x70, 0xbf, 0xfd, 0xa1, 0x33, 0xd1, 0x47, 0x59, + 0x41, 0xc7, 0x17, 0xe6, 0xdd, 0x4b, 0x99, 0x97, 0xb6, 0xc3, 0x39, 0x80, + 0xfa, 0x78, 0x61, 0x6f, 0xc7, 0xbf, 0x6c, 0x88, 0xd9, 0xd6, 0xc2, 0x60, + 0xbe, 0x83, 0x67, 0xd3, 0x38, 0xf9, 0x73, 0xc5, 0x64, 0x4e, 0xc2, 0xbb, + 0x0f, 0xb8, 0x24, 0xf5, 0x29, 0x86, 0xb2, 0x35, 0x9a, 0x74, 0x14, 0xdf, + 0xef, 0x92, 0xcc, 0xec, 0x5e, 0x46, 0x80, 0xe8, 0xf2, 0xc3, 0x4a, 0xbd, + 0xb7, 0x78, 0xad, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x63, 0x30, 0x61, + 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0xa6, + 0x9c, 0x4e, 0x80, 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, + 0x4f, 0x2c, 0x1d, 0xe7, 0x86, 0xef, 0x16, 0x30, 0x1f, 0x06, 0x03, 0x55, + 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xa6, 0x9c, 0x4e, 0x80, + 0xa0, 0x7b, 0x73, 0x64, 0xb9, 0x38, 0xe3, 0xea, 0x12, 0x4f, 0x2c, 0x1d, + 0xe7, 0x86, 0xef, 0x16, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, + 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, + 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, + 0x06, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, + 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x9b, 0x0d, 0xd9, + 0x6c, 0xf4, 0x0b, 0x08, 0xea, 0xfd, 0x75, 0xac, 0x4a, 0xcc, 0xf6, 0xdf, + 0x33, 0x62, 0x6b, 0x0c, 0x93, 0x50, 0x73, 0x4a, 0x60, 0x67, 0xde, 0x0d, + 0x24, 0x95, 0x4c, 0x4b, 0x75, 0xb3, 0xec, 0x0e, 0xe3, 0x3a, 0xc6, 0x4c, + 0xe3, 0x93, 0xf0, 0x9c, 0xa4, 0xfe, 0x2c, 0x87, 0x9c, 0x7c, 0x4d, 0x7b, + 0x18, 0x1b, 0x93, 0x5f, 0x2e, 0xda, 0x88, 0xef, 0x11, 0x8b, 0x2a, 0xa3, + 0x20, 0xbb, 0x22, 0xc0, 0x73, 0x59, 0xd9, 0x13, 0x35, 0xac, 0x40, 0x21, + 0x1e, 0xd2, 0xab, 0x5a, 0xcd, 0x80, 0x82, 0x36, 0x64, 0x11, 0x84, 0x11, + 0x4f, 0xf0, 0x60, 0x52, 0x3f, 0x2c, 0xe4, 0xc8, 0x47, 0xd8, 0x36, 0xc5, + 0x50, 0x8a, 0x8f, 0x8f, 0x13, 0x40, 0x3b, 0xda, 0x2b, 0x05, 0x17, 0x7c, + 0x44, 0x5f, 0x05, 0xde, 0x67, 0xcc, 0x17, 0x04, 0xdb, 0xcc, 0xee, 0x6e, + 0x1c, 0xaf, 0xf4, 0x66, 0x9c, 0x7d, 0x72, 0x91, 0x9f, 0x6f, 0x42, 0x78, + 0x10, 0x90, 0xd5, 0xfa, 0xd4, 0x1b, 0xac, 0x56, 0x02, 0xf4, 0x00, 0x48, + 0x6b, 0x56, 0x05, 0x32, 0xb5, 0x0a, 0x16, 0x14, 0x56, 0x14, 0xfa, 0x49, + 0x99, 0x59, 0x62, 0xed, 0xda, 0x99, 0x48, 0x88, 0x18, 0x20, 0x77, 0xfe, + 0xbf, 0x6c, 0xcc, 0x5b, 0x53, 0xab, 0x2b, 0x93, 0x6a, 0x5d, 0xce, 0xf8, + 0x5e, 0xfa, 0x71, 0xc5, 0x79, 0x6a, 0xba, 0x49, 0x00, 0x6a, 0x0f, 0x0e, + 0x40, 0xb5, 0x79, 0xa4, 0x93, 0x14, 0xa5, 0x2c, 0x24, 0x2d, 0x76, 0xa4, + 0x05, 0x60, 0x93, 0x8d, 0x50, 0xe8, 0x2b, 0xcf, 0x51, 0xe3, 0xdc, 0x8d, + 0x72, 0xa2, 0xae, 0xf1, 0x76, 0x5e, 0xba, 0xb2, 0xa9, 0x48, 0x20, 0x53, + 0xbc, 0x80, 0xf7, 0x35, 0xae, 0x41, 0x77, 0xef, 0x6a, 0x74, 0xeb, 0xa1, + 0x68, 0xc5, 0x83, 0x13, 0x50, 0xd8, 0xfc, 0x52, 0x18, 0xa3, 0x76, 0x1d, + 0x50, +}; +CONST UINTN mRootCertSize = sizeof (mRootCert); + +// +// DER-encoded X.509 certificate for signer 2 +// +CONST UINT8 mSigner2Cert[] = { + 0x30, 0x82, 0x03, 0x43, 0x30, 0x82, 0x02, 0x2b, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x6d, 0x0c, 0xf0, 0x2d, 0x05, 0x1d, 0xa2, 0xa3, 0xa4, + 0x71, 0x77, 0xf8, 0xce, 0xcd, 0xaa, 0xc1, 0xcc, 0xa9, 0xd0, 0x16, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x26, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x69, 0x67, + 0x6e, 0x65, 0x72, 0x20, 0x32, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, + 0x37, 0x31, 0x37, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, + 0x33, 0x36, 0x30, 0x37, 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, + 0x5a, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x26, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, + 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x53, 0x69, 0x67, 0x6e, + 0x65, 0x72, 0x20, 0x32, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, + 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, + 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, + 0x00, 0xde, 0xab, 0x0d, 0xae, 0x9a, 0x98, 0x07, 0x9e, 0xa0, 0xb4, 0x9b, + 0x95, 0xa8, 0x74, 0x7c, 0x13, 0x03, 0xf9, 0x53, 0xb1, 0x4a, 0xc4, 0x35, + 0xa3, 0xc1, 0xf8, 0xce, 0xcd, 0x42, 0x59, 0x88, 0xe7, 0x91, 0xb7, 0xf2, + 0xd3, 0x6d, 0xb3, 0x29, 0x34, 0x3d, 0x8f, 0x0e, 0xfc, 0x53, 0x73, 0x3a, + 0x8b, 0x55, 0x72, 0xb2, 0x9c, 0x7b, 0xe1, 0x88, 0xc9, 0xb8, 0x0d, 0x7b, + 0x90, 0xf8, 0x31, 0x3a, 0x87, 0x98, 0x12, 0x43, 0xc7, 0xed, 0xc0, 0x69, + 0x87, 0x2f, 0xfa, 0xa2, 0xbc, 0x6f, 0x32, 0x22, 0xfe, 0x83, 0x71, 0xcd, + 0x23, 0x23, 0x91, 0x98, 0xc2, 0xb1, 0xdf, 0xf3, 0x29, 0x1b, 0xfd, 0x11, + 0x97, 0x9e, 0x1d, 0xfe, 0x30, 0xb5, 0x5a, 0x41, 0x3c, 0x40, 0x30, 0x0a, + 0xed, 0x0b, 0xec, 0xca, 0x9d, 0xd6, 0xf0, 0x0b, 0xba, 0x6b, 0x98, 0xef, + 0x65, 0xb8, 0x0e, 0x08, 0x40, 0x70, 0xec, 0xee, 0x83, 0x21, 0x38, 0x82, + 0x20, 0xba, 0x6b, 0xeb, 0xa6, 0xcc, 0xb2, 0xa3, 0x35, 0x48, 0x3b, 0x72, + 0xc0, 0x89, 0xee, 0x3a, 0x9f, 0x14, 0x87, 0x96, 0x13, 0x05, 0x1a, 0x03, + 0xcb, 0xd6, 0x1b, 0xad, 0x0b, 0x27, 0x73, 0xb0, 0xe7, 0x5d, 0x0c, 0x0b, + 0x0d, 0x60, 0xe0, 0x25, 0xfa, 0xf0, 0xe9, 0x7a, 0x44, 0xf1, 0x5d, 0x51, + 0x09, 0x3e, 0x40, 0x99, 0x3a, 0xe3, 0xe8, 0x53, 0x30, 0xad, 0xe0, 0x70, + 0x66, 0x38, 0x3d, 0xf1, 0x7e, 0x0e, 0xd4, 0xce, 0x8f, 0x07, 0xf4, 0x17, + 0x2a, 0x5f, 0xca, 0xc8, 0xd0, 0x29, 0xea, 0x4e, 0x1c, 0x8d, 0xd0, 0x67, + 0x5b, 0x0b, 0x63, 0x31, 0xdc, 0xd5, 0xc8, 0x00, 0x8e, 0x87, 0xcc, 0x29, + 0xb6, 0x2a, 0xc0, 0x90, 0xea, 0x02, 0x53, 0x9e, 0x9d, 0x37, 0x49, 0x52, + 0xc5, 0xc3, 0xed, 0x75, 0xac, 0x05, 0x01, 0x52, 0x30, 0xf0, 0x86, 0x4e, + 0x1a, 0xc1, 0x83, 0x79, 0xf9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x53, + 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, + 0x14, 0x07, 0x9f, 0xc5, 0xe7, 0x69, 0x95, 0x88, 0xf0, 0xd2, 0xfd, 0x64, + 0xbd, 0xe1, 0x7e, 0x9b, 0xac, 0xff, 0x11, 0x13, 0x65, 0x30, 0x1f, 0x06, + 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x07, 0x9f, + 0xc5, 0xe7, 0x69, 0x95, 0x88, 0xf0, 0xd2, 0xfd, 0x64, 0xbd, 0xe1, 0x7e, + 0x9b, 0xac, 0xff, 0x11, 0x13, 0x65, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, + 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x2d, 0x5c, 0x25, 0x72, 0x40, + 0xc6, 0xa5, 0xd3, 0x43, 0xaa, 0x55, 0x97, 0xa5, 0x7d, 0xc7, 0x3d, 0x6b, + 0x77, 0xf2, 0xa3, 0xec, 0x14, 0xdd, 0xa4, 0x82, 0x61, 0x98, 0x7d, 0xce, + 0x4f, 0x4a, 0x68, 0x08, 0x9d, 0xe7, 0x4e, 0x8e, 0xab, 0x76, 0x5f, 0x52, + 0xae, 0xd5, 0x45, 0xb0, 0x14, 0x98, 0x8e, 0x0f, 0xdc, 0xd9, 0xe8, 0x5d, + 0xc3, 0xa3, 0x8c, 0x7d, 0xcf, 0x3c, 0x84, 0x50, 0x41, 0xef, 0xa6, 0x95, + 0x77, 0xc9, 0x46, 0x61, 0x67, 0xa4, 0x1b, 0xdc, 0xe2, 0x6d, 0xef, 0x0f, + 0x1a, 0x0e, 0xd7, 0x3b, 0xdf, 0x10, 0xe5, 0xd4, 0x42, 0x0d, 0x14, 0x42, + 0xed, 0xce, 0xfa, 0xa9, 0x5a, 0x1c, 0x10, 0xc2, 0xc7, 0x34, 0xd2, 0xc1, + 0x7c, 0xff, 0x33, 0x08, 0x71, 0x3c, 0x6d, 0x23, 0x03, 0x62, 0xae, 0x63, + 0x93, 0xea, 0x44, 0xa9, 0x06, 0x28, 0x7b, 0x72, 0x01, 0xaf, 0x9a, 0xb6, + 0xd2, 0x48, 0xa6, 0x7b, 0x3a, 0xf2, 0xf8, 0x6e, 0xb6, 0xa1, 0xb7, 0xd5, + 0xa9, 0x3e, 0x8a, 0x04, 0x7f, 0x1f, 0x6e, 0x37, 0xfa, 0x1e, 0xfc, 0x79, + 0x18, 0x29, 0x73, 0x59, 0xfa, 0xc3, 0xb9, 0x44, 0x8a, 0x43, 0xf0, 0x4a, + 0x4a, 0x8e, 0xb5, 0x17, 0xee, 0x4c, 0x5c, 0xbd, 0x7d, 0x25, 0x8b, 0x30, + 0x29, 0x23, 0x68, 0xbb, 0x44, 0xed, 0x45, 0xb7, 0xf2, 0x6a, 0x95, 0x79, + 0x64, 0x95, 0x45, 0x8a, 0x81, 0xbb, 0xf5, 0x39, 0xb6, 0xde, 0xdb, 0x18, + 0x0d, 0x05, 0x1b, 0x83, 0x7e, 0xce, 0x93, 0xc8, 0x8c, 0xeb, 0x13, 0x22, + 0x4b, 0xc6, 0x54, 0x8c, 0x23, 0x8e, 0x7c, 0x99, 0x8b, 0xae, 0xb3, 0xb1, + 0x1f, 0x00, 0xfd, 0x1f, 0x92, 0x2d, 0xa5, 0x3a, 0xe1, 0x78, 0x76, 0x78, + 0x05, 0x8a, 0x61, 0x62, 0x5d, 0x99, 0x73, 0x8b, 0x22, 0x6f, 0x07, 0x7a, + 0xb3, 0x5d, 0xd3, 0x4c, 0xe4, 0xfc, 0xa9, 0x97, 0xe6, 0xb0, 0x66, +}; +CONST UINTN mSigner2CertSize = sizeof (mSigner2Cert); + +// +// DER-encoded X.509 certificate embedded in signer 2's signature but unrelated to its chain +// +CONST UINT8 mSigner2UnrelatedCert[] = { + 0x30, 0x82, 0x03, 0x53, 0x30, 0x82, 0x02, 0x3b, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x6c, 0x76, 0x71, 0x78, 0x96, 0x78, 0x58, 0x91, 0x7a, + 0x6e, 0x6d, 0x0d, 0xe4, 0x80, 0x55, 0xfc, 0x4f, 0x51, 0xca, 0x61, 0x30, + 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b, + 0x05, 0x00, 0x30, 0x39, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, + 0x41, 0x70, 0x70, 0x20, 0x54, 0x65, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x20, + 0x31, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x36, 0x30, 0x37, 0x31, 0x37, 0x31, + 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x17, 0x0d, 0x33, 0x36, 0x30, 0x37, + 0x31, 0x34, 0x31, 0x39, 0x30, 0x32, 0x30, 0x37, 0x5a, 0x30, 0x39, 0x31, + 0x37, 0x30, 0x35, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x56, 0x65, 0x72, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x73, 0x74, 0x41, 0x70, 0x70, 0x20, 0x54, + 0x65, 0x73, 0x74, 0x20, 0x55, 0x6e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x43, 0x65, 0x72, 0x74, 0x20, 0x31, 0x30, 0x82, 0x01, 0x22, + 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, + 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, + 0x02, 0x82, 0x01, 0x01, 0x00, 0xbc, 0x34, 0x39, 0x35, 0x9d, 0xb6, 0x0f, + 0x82, 0xec, 0x8a, 0xa5, 0x1a, 0x7d, 0xd8, 0x0f, 0xdc, 0x0b, 0xb6, 0xd6, + 0xb8, 0x7f, 0xe4, 0x4c, 0xf0, 0x7b, 0x5c, 0x5e, 0x1d, 0xa0, 0xbb, 0x68, + 0x77, 0x7a, 0x59, 0x62, 0xdb, 0xa9, 0xbc, 0xde, 0x59, 0xa3, 0x06, 0x32, + 0x4e, 0xe2, 0x2d, 0x04, 0x45, 0x01, 0xd0, 0x5b, 0x2f, 0x3b, 0x2d, 0xa7, + 0x58, 0x98, 0x89, 0xc1, 0x31, 0xbc, 0x17, 0x05, 0x5c, 0x17, 0x16, 0xdb, + 0x06, 0xe0, 0x36, 0x47, 0x62, 0x30, 0x4c, 0x17, 0x9e, 0x2e, 0xc2, 0x7b, + 0x60, 0x70, 0x01, 0x15, 0x49, 0x9f, 0x26, 0xf7, 0x96, 0xd3, 0x48, 0xc3, + 0x9d, 0xdb, 0x81, 0x50, 0x1e, 0x68, 0x1d, 0x2a, 0x3f, 0xb2, 0xad, 0x54, + 0x64, 0xee, 0x93, 0x93, 0x37, 0xd7, 0x8c, 0xa5, 0xb9, 0x02, 0xaa, 0x72, + 0xee, 0x57, 0x41, 0x35, 0x44, 0x78, 0xa8, 0x5c, 0x2a, 0xb1, 0x05, 0x41, + 0xab, 0x3a, 0xcc, 0xa2, 0xfd, 0xff, 0x9d, 0x7b, 0xd6, 0xb3, 0x70, 0x6a, + 0xdd, 0x06, 0x36, 0x0b, 0x0a, 0x9b, 0x1f, 0x32, 0xe8, 0x70, 0xe9, 0x73, + 0x75, 0x8f, 0xd4, 0xa4, 0xd5, 0xb2, 0x3b, 0xfc, 0x31, 0x9a, 0x70, 0x63, + 0x53, 0xe6, 0xc5, 0x9a, 0x34, 0x3d, 0x24, 0x6f, 0x95, 0x94, 0xb3, 0x6a, + 0x32, 0xfe, 0x0e, 0x83, 0x94, 0x40, 0x1f, 0x43, 0x0e, 0xf4, 0xdb, 0x2d, + 0x91, 0x47, 0x09, 0x4b, 0xe6, 0xfc, 0x02, 0x29, 0x89, 0xa2, 0xe3, 0xb8, + 0xc6, 0xed, 0x63, 0x67, 0x7d, 0xdf, 0x53, 0x5a, 0x39, 0x13, 0x7c, 0x0f, + 0xd3, 0x92, 0xea, 0x5b, 0xed, 0xc3, 0x20, 0x52, 0x1b, 0x70, 0x63, 0xae, + 0xb8, 0xe9, 0x50, 0x28, 0xc8, 0x20, 0x99, 0x4e, 0x72, 0xd8, 0x00, 0xbe, + 0x6b, 0xd9, 0x8e, 0x17, 0xa1, 0x8a, 0xcc, 0xf8, 0xcb, 0x04, 0x7d, 0x05, + 0x59, 0x1c, 0x1b, 0xe2, 0x1c, 0x8c, 0x3b, 0x16, 0xbd, 0x02, 0x03, 0x01, + 0x00, 0x01, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, + 0x0e, 0x04, 0x16, 0x04, 0x14, 0x53, 0x20, 0xdd, 0x71, 0xbb, 0xdc, 0x1d, + 0xf6, 0xb3, 0xd6, 0x20, 0xcb, 0x13, 0x5a, 0x14, 0x59, 0x50, 0xdc, 0x89, + 0xe4, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, + 0x80, 0x14, 0x53, 0x20, 0xdd, 0x71, 0xbb, 0xdc, 0x1d, 0xf6, 0xb3, 0xd6, + 0x20, 0xcb, 0x13, 0x5a, 0x14, 0x59, 0x50, 0xdc, 0x89, 0xe4, 0x30, 0x0f, + 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, + 0x01, 0x01, 0xff, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, + 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x33, + 0xc2, 0x25, 0x24, 0xbc, 0x09, 0xba, 0x02, 0xc6, 0xa5, 0x2f, 0xf9, 0x93, + 0x30, 0x9c, 0x70, 0x65, 0x79, 0x95, 0x29, 0xc4, 0x2f, 0xb8, 0x2a, 0x9a, + 0xa2, 0x81, 0x22, 0x67, 0xfd, 0x94, 0xb1, 0x94, 0x32, 0x35, 0xa6, 0xec, + 0xce, 0x05, 0x78, 0x45, 0x31, 0x02, 0xd2, 0x89, 0xd3, 0x22, 0x17, 0xe5, + 0x2c, 0xf9, 0xa1, 0x86, 0xe7, 0x86, 0x84, 0x1a, 0x55, 0xc0, 0x4a, 0xbd, + 0xd2, 0x58, 0x5f, 0x56, 0x56, 0xb0, 0x96, 0x5e, 0x08, 0x9b, 0x0f, 0xf9, + 0xde, 0x1a, 0x49, 0x9e, 0x6c, 0xa1, 0xa6, 0xc7, 0x50, 0x2b, 0x15, 0x56, + 0x9a, 0xe8, 0x2a, 0x6e, 0x2c, 0x47, 0x9e, 0x93, 0x89, 0x72, 0x8a, 0x44, + 0x6f, 0x2e, 0xfc, 0xdf, 0x5c, 0xf8, 0xfb, 0xe5, 0xb9, 0xf9, 0x0a, 0x44, + 0xf0, 0x5b, 0x97, 0xd5, 0x18, 0x54, 0x08, 0xbd, 0xd8, 0xc5, 0x69, 0x4f, + 0x19, 0x0c, 0x1e, 0xe5, 0xd6, 0x65, 0xe6, 0xf2, 0x37, 0xdc, 0xf5, 0x8d, + 0x01, 0x2a, 0x4b, 0x5c, 0x47, 0xa1, 0xf5, 0xfa, 0x9a, 0xc7, 0xa4, 0x5b, + 0xc4, 0xa5, 0x3c, 0xc1, 0x3a, 0xae, 0xf7, 0x06, 0xe1, 0x32, 0xc3, 0xde, + 0x75, 0x76, 0xec, 0x08, 0x9c, 0x22, 0xfa, 0xc6, 0x3f, 0x60, 0x68, 0x02, + 0xaf, 0x49, 0x7e, 0x3f, 0xd4, 0x29, 0xca, 0x1a, 0x68, 0x95, 0x72, 0x0e, + 0x9b, 0x16, 0xd3, 0x95, 0xe7, 0xb7, 0x54, 0x57, 0x51, 0xdf, 0x14, 0x95, + 0x63, 0xf9, 0xa3, 0xa2, 0xa1, 0x8c, 0xeb, 0x96, 0x38, 0xe2, 0xf5, 0x3f, + 0x9f, 0x86, 0x2f, 0x52, 0x96, 0xe0, 0x0f, 0xbf, 0x06, 0xd5, 0x64, 0x25, + 0x2e, 0xd8, 0x7e, 0x34, 0xf7, 0x55, 0xd1, 0xb8, 0x4b, 0x3b, 0x15, 0xc1, + 0x7a, 0x3e, 0xc7, 0x3b, 0xab, 0x68, 0xb3, 0x43, 0xa2, 0xdb, 0xda, 0x94, + 0x45, 0x91, 0xb5, 0x64, 0x7f, 0x0f, 0xad, 0x16, 0x52, 0xca, 0x8e, 0xf0, + 0xdb, 0x44, 0xf7, +}; +CONST UINTN mSigner2UnrelatedCertSize = sizeof (mSigner2UnrelatedCert);