tests for ENGINE-655 ENGINE-655
authorKrista 'DarthMama' Bennett <krista@pep.foundation>
Mon, 25 Nov 2019 12:14:24 +0100
branchENGINE-655
changeset 4223ae65683993a7
parent 4222 3247a7e15516
child 4224 53e416ab5688
tests for ENGINE-655
test/src/Engine655Test.cc
test/test_mails/655_msg_huss.eml
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/test/src/Engine655Test.cc	Mon Nov 25 12:14:24 2019 +0100
     1.3 @@ -0,0 +1,155 @@
     1.4 +#include <stdlib.h>
     1.5 +#include <string>
     1.6 +#include <cstring>
     1.7 +#include <iostream>
     1.8 +#include <fstream>
     1.9 +
    1.10 +#include "pEpEngine.h"
    1.11 +#include "test_util.h"
    1.12 +#include "TestConstants.h"
    1.13 +#include "Engine.h"
    1.14 +#include "mime.h"
    1.15 +
    1.16 +#include <gtest/gtest.h>
    1.17 +
    1.18 +
    1.19 +namespace {
    1.20 +
    1.21 +	//The fixture for Engine655Test
    1.22 +    class Engine655Test : public ::testing::Test {
    1.23 +        public:
    1.24 +            Engine* engine;
    1.25 +            PEP_SESSION session;
    1.26 +
    1.27 +        protected:
    1.28 +            // You can remove any or all of the following functions if its body
    1.29 +            // is empty.
    1.30 +            Engine655Test() {
    1.31 +                // You can do set-up work for each test here.
    1.32 +                test_suite_name = ::testing::UnitTest::GetInstance()->current_test_info()->GTEST_SUITE_SYM();
    1.33 +                test_name = ::testing::UnitTest::GetInstance()->current_test_info()->name();
    1.34 +                test_path = get_main_test_home_dir() + "/" + test_suite_name + "/" + test_name;
    1.35 +            }
    1.36 +
    1.37 +            ~Engine655Test() override {
    1.38 +                // You can do clean-up work that doesn't throw exceptions here.
    1.39 +            }
    1.40 +
    1.41 +            // If the constructor and destructor are not enough for setting up
    1.42 +            // and cleaning up each test, you can define the following methods:
    1.43 +
    1.44 +            void SetUp() override {
    1.45 +                // Code here will be called immediately after the constructor (right
    1.46 +                // before each test).
    1.47 +
    1.48 +                // Leave this empty if there are no files to copy to the home directory path
    1.49 +                std::vector<std::pair<std::string, std::string>> init_files = std::vector<std::pair<std::string, std::string>>();
    1.50 +
    1.51 +                init_files.push_back(std::pair<std::string, std::string>(std::string("test_files/655_keys.db"), std::string("keys.db")));
    1.52 +                // Get a new test Engine.
    1.53 +                engine = new Engine(test_path);
    1.54 +                ASSERT_NE(engine, nullptr);
    1.55 +
    1.56 +                // Ok, let's initialize test directories etc.
    1.57 +                engine->prep(NULL, NULL, init_files);
    1.58 +
    1.59 +                // Ok, try to start this bugger.
    1.60 +                engine->start();
    1.61 +                ASSERT_NE(engine->session, nullptr);
    1.62 +                session = engine->session;
    1.63 +
    1.64 +                // Engine is up. Keep on truckin'
    1.65 +            }
    1.66 +
    1.67 +            void TearDown() override {
    1.68 +                // Code here will be called immediately after each test (right
    1.69 +                // before the destructor).
    1.70 +                engine->shut_down();
    1.71 +                delete engine;
    1.72 +                engine = NULL;
    1.73 +                session = NULL;
    1.74 +            }
    1.75 +
    1.76 +        private:
    1.77 +            const char* test_suite_name;
    1.78 +            const char* test_name;
    1.79 +            string test_path;
    1.80 +            // Objects declared here can be used by all tests in the Engine655Test suite.
    1.81 +
    1.82 +    };
    1.83 +
    1.84 +}  // namespace
    1.85 +
    1.86 +
    1.87 +TEST_F(Engine655Test, check_engine655) {
    1.88 +    string msg_block = slurp("test_mails/655_msg_huss.eml"); 
    1.89 +    message* msg = NULL;
    1.90 +    PEP_STATUS status = mime_decode_message(msg_block.c_str(), msg_block.size(), &msg);
    1.91 +        
    1.92 +    for (int i = 0; i < 1; i++) {
    1.93 +        char* ptext = NULL;
    1.94 +        size_t psize = 0;
    1.95 +        stringlist_t* keylist = NULL;        
    1.96 +//        PEP_STATUS tmp = find_keys(session, "6E046FF9A390C79BA4D195368430B7E4E086F04B", &keylist);
    1.97 +//        ASSERT_NE(tmp, PEP_KEY_NOT_FOUND);
    1.98 +//        ASSERT_NE(keylist, nullptr);
    1.99 +        
   1.100 +        keylist = new_stringlist(strdup("16F07F382FB3CF5DF977005D1069C7CACF9C23C6"));
   1.101 +        stringlist_add(keylist, strdup("ECBA9555D9ADB1B68861B508032CCA777FFDBA14"));
   1.102 +        stringlist_add(keylist, strdup("EB4308E2D5B9FEEF7488D14CFEE4AE51914D566D"));
   1.103 +        stringlist_add(keylist, strdup("5FBDE3C9E10552B1DD6D9763E89759391DE04053")); // public only
   1.104 +        
   1.105 +        string keyfile_655_prefix = "655_";
   1.106 +        ofstream outfile;
   1.107 +        stringlist_t* curr_string = keylist;
   1.108 +        int j = 0;
   1.109 +        while (curr_string && curr_string->value) {
   1.110 +            PEP_STATUS keystatus = PEP_STATUS_OK;
   1.111 +            ASSERT_STRNE(curr_string->value, "");
   1.112 +            char* keyval = NULL;
   1.113 +            size_t keysize = 0;
   1.114 +            outfile.open(keyfile_655_prefix + curr_string->value + ".asc");
   1.115 +            keystatus = export_key(session, curr_string->value, &keyval, &keysize);
   1.116 +            EXPECT_EQ(keystatus, PEP_STATUS_OK);
   1.117 +            ASSERT_NE(keyval, nullptr);
   1.118 +            ASSERT_NE(keysize, 0);
   1.119 +            outfile << keyval;
   1.120 +            if (j != 3) {
   1.121 +                free(keyval);
   1.122 +                keyval = NULL;
   1.123 +                keystatus = export_secret_key(session, curr_string->value, &keyval, &keysize);
   1.124 +                ASSERT_NE(keyval, nullptr);                
   1.125 +                ASSERT_NE(keysize, 0);                
   1.126 +                outfile << endl << keyval;
   1.127 +            }    
   1.128 +            outfile.close();
   1.129 +            curr_string = curr_string->next; 
   1.130 +            j++;
   1.131 +            free(keyval);
   1.132 +        }
   1.133 +        free_stringlist(keylist);
   1.134 +        // won't verify, that's fine.
   1.135 +        string msg_block2 = msg->attachments->next->value;
   1.136 +        status = decrypt_and_verify(session, msg_block2.c_str(), msg_block2.size(), NULL, 0, &ptext, &psize, &keylist, NULL);
   1.137 +        ASSERT_EQ(status, PEP_DECRYPTED); // really, expect PEP_STATUS_OK, but it doesn't verify and msg may be broken
   1.138 +        outfile.open(keyfile_655_prefix + "decrypted_only.eml");
   1.139 +        outfile << ptext;
   1.140 +        outfile.close();
   1.141 +        
   1.142 +        // // Let's see what this does...
   1.143 +        // message* parse_verify;
   1.144 +        // status = mime_decode_message(ptext, psize, &parse_verify);    
   1.145 +        // 
   1.146 +        keylist = NULL;
   1.147 +        message* dec_msg = NULL;
   1.148 +        PEP_rating rating;
   1.149 +        PEP_decrypt_flags_t flags = 0;
   1.150 +        status = decrypt_message(session, msg, &dec_msg, &keylist, &rating, &flags);
   1.151 +        EXPECT_EQ(status, PEP_DECRYPTED);  // really, expect PEP_STATUS_OK, but it doesn't verify and msg may be broken
   1.152 +        // EXPECT_NE(ptext, nullptr);
   1.153 +        // EXPECT_NE(keylist, nullptr);
   1.154 +        // EXPECT_NE(psize, 0);
   1.155 +        free_stringlist(keylist);
   1.156 +        free(ptext);
   1.157 +    }
   1.158 +}
     2.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     2.2 +++ b/test/test_mails/655_msg_huss.eml	Mon Nov 25 12:14:24 2019 +0100
     2.3 @@ -0,0 +1,198 @@
     2.4 +Return-Path: <hk@pep.security>
     2.5 +X-Original-To: patrick.o@peptest.ch
     2.6 +Delivered-To: patrick.o@peptest.ch
     2.7 +Received: from mail.pep.security (unknown [192.168.4.40])
     2.8 +	by peptest.ch (Postfix) with ESMTPS id 42ABB1A1BDC
     2.9 +	for <patrick.o@peptest.ch>; Fri, 11 Oct 2019 16:00:49 +0200 (CEST)
    2.10 +Authentication-Results: plesk.peptest.ch;
    2.11 +	spf=fail (sender IP is 192.168.4.40) smtp.mailfrom=hk@pep.security smtp.helo=mail.pep.security
    2.12 +Received-SPF: fail (plesk.peptest.ch: domain of pep.security does not designate 192.168.4.40 as permitted sender) client-ip=192.168.4.40; envelope-from=hk@pep.security; helo=mail.pep.security;
    2.13 +Content-Language: en-US
    2.14 +Content-Type: multipart/mixed;
    2.15 +	boundary="_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_"
    2.16 +DKIM-Signature: v=1; a=rsa-sha256; d=pep.security; s=1519399626.pep;
    2.17 +	c=simple/simple; t=1570802449; h=from:subject:to:date:message-id;
    2.18 +	bh=gBLmMSULKRjR+HZlBgwqzwqhGwLG+O4T+T3q/nimXuk=;
    2.19 +	b=VV+LTu6mowFffgoZX+gk8udjVgCyD7MB/JVSJhbJfX3D2GRmcDCC3Q/54uhX1qJc9HZB3wI+vfL
    2.20 +	mKIcx3+uLJWEYG36N6W9IRxY5bOs9nFRonJTes/93ususMdu3RwKCCx/6rijyo6uqKJlQ6Kk/xHgD
    2.21 +	Ba34/6MLvUpkVJbfOSz+sdVkQKgMr0zAqh4TN1qzdhvRIIFLibKbwHYzCxzBm4W5Bk6MgyHTvngjG
    2.22 +	SrPvYSZPRd2OXH4zL48H5KP6NmPUZK9IhrYrs12fEV//PSFjUJbPLTwGBJRBn8H1TW5+c54RSrzIh
    2.23 +	cGN8CU5I5/AT3nEMdbN0bJ5LTpwSndHFv0JQ==
    2.24 +From: Hussein Kasem <hk@pep.security>
    2.25 +To: Patrick Meier <pm@pep.security>, "patrick.o@peptest.ch"
    2.26 +	<patrick.o@peptest.ch>
    2.27 +Subject: Re: New test version with the first menu approach.
    2.28 +Thread-Topic: New test version with the first menu approach.
    2.29 +Thread-Index: AQHVgDxFdXuWCILfaUOMFUf0CL7Z9Q==
    2.30 +Date: Fri, 11 Oct 2019 14:00:48 +0000
    2.31 +Message-ID: <0CFFA95A-A42D-4DD5-9FF0-D52F3A5ED193@pep.security>
    2.32 +References: <5cc4f0e18f754d30b40049e71e24a2b8@pep.security>
    2.33 +In-Reply-To: <5cc4f0e18f754d30b40049e71e24a2b8@pep.security>
    2.34 +Accept-Language: es-ES, en-US
    2.35 +X-MS-Has-Attach: yes
    2.36 +X-MS-TNEF-Correlator:
    2.37 +MIME-Version: 1.0
    2.38 +X-CrossPremisesHeadersFilteredBySendConnector: ex02.intranet.pep.security
    2.39 +X-OrganizationHeadersPreserved: ex02.intranet.pep.security
    2.40 +
    2.41 +--_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_
    2.42 +Content-Type: text/plain; charset="us-ascii"
    2.43 +Content-Transfer-Encoding: quoted-printable
    2.44 +
    2.45 +
    2.46 +--_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_
    2.47 +Content-Type: application/pgp-encrypted;
    2.48 +	name="PGPMIME Versions Identification"
    2.49 +Content-Description: PGP/MIME Versions Identification
    2.50 +Content-Disposition: attachment; filename="PGPMIME Versions Identification";
    2.51 +	size=13; creation-date="Fri, 11 Oct 2019 14:00:42 GMT";
    2.52 +	modification-date="Fri, 11 Oct 2019 14:00:42 GMT"
    2.53 +Content-ID: <F8984A127C355A43AB614B9ED07AA933@pep.security>
    2.54 +Content-Transfer-Encoding: base64
    2.55 +
    2.56 +VmVyc2lvbjogMQ0NCg==
    2.57 +
    2.58 +--_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_
    2.59 +Content-Type: application/octet-stream; name="encrypted.asc"
    2.60 +Content-Description: OpenPGP encrypted message.asc
    2.61 +Content-Disposition: attachment; filename="encrypted.asc"; size=7577;
    2.62 +	creation-date="Fri, 11 Oct 2019 14:00:42 GMT";
    2.63 +	modification-date="Fri, 11 Oct 2019 14:00:42 GMT"
    2.64 +Content-ID: <4D6407EB572B8242A37696829FC758F7@pep.security>
    2.65 +Content-Transfer-Encoding: base64
    2.66 +
    2.67 +LS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tDQoNCmhRRU1BMjNkcENZVVFBUXhBUWYvV1F6KzZh
    2.68 +OG5QVVZ4ODZndlBzTkZQUXNNZ1NvR09GbWdkVW1mRFc0MXpBSXENCnppQURPdTRqZ0hKV09jVDBr
    2.69 +ZlhtRzQwUXd1K0Y3NlV3akptb0dMbnhIZW5JV1JOQ3hDTEQvMzZmZGpOWkwxKzkNCjZXSGVNM0Y2
    2.70 +S3pKS0ZIQ0t2VDRicXA4NnVXYkI1L3doaW80RWpaU0wrRXh6cGdtNzk2YktJcHF1U3U5bWVLU0IN
    2.71 +Cm1ZTnUwUVRWVmdqOUlPc1MyN2d1aVovNEs0OW5NdkhWRHFiMktaalkvR3hVSTJWMEV2aUtGYnNi
    2.72 +UWphWEVZNG0NClVQblFLdzV5ajQ1TVdubXAzMFI0Y3lPUXhGN1JaemhJaG12dk8rVUhjbWQ2azg2
    2.73 +MnQzeXpDcXptTVUvWFhGQ1ENCmZUNGIraFliNzhxYTQvanFSZXBkejFoUnNxT3hOd1ZGaGlCQWVl
    2.74 +T1h1SVVDREFNazUzeGtOYUdhVFFFUC8zeW8NCk1TRm1yemVTRDlMbHQrMjBlbGhzT05xNFA4anM3
    2.75 +MVV2UDBmTEFGbitNVmZyZEhDODRmbnlveFpaS2M3Q21SNW4NCkd0Y3AyTVdSdTBFc0tZNWhJM0Jq
    2.76 +d0lJMGNteFVBdk1zMVVxUHRCbXdHNEVDd1NIWC9sczRicXZxYzN1MUhOZmENCmN4MC9MN1hKcVE1
    2.77 +SENnMzhTdHhBMzIveXpNS0JBWENCY01QRGd4WHNGeVJvTUdmQkhvd3ppYzA1MzlnMHFOSkgNCjdE
    2.78 +Smh6SHZUdG50Q1hLazBhU2FDSTFUOW9ZNlpnRTNta2UydS82VkVCL3RIY0VyNGFoL29hRWE4WWZW
    2.79 +Vk42bG0NClhVbUZZeGpjQnR6Umd1VVhrZzFUWFpwY3Jkc3hpWTkwRkluU1pEcmsxWmE5cUJnbjlt
    2.80 +eVFibnRYWmd0MytVZHINCksrd2syYWVodFVuSFhROWpmT294TVg2MmxqenhaVTg0a2xzNTBjUDl5
    2.81 +QTJLMXdMTFRyZmRnc0dpdW5LL0I4ek0NClBDRUU4UURpSDAyU1NYK2ozNURLZW5TYkoxdTBqY0d2
    2.82 +bWtvVEFiN1VwUVlObjlscXJ1UDFOUHBhdkR0MWM5NmkNCkNWKzRqbU1mRkpub0tvRGMrSENSUFhl
    2.83 +WWt1dXYvQnFHYngzc2ZWdzZZRVhaQytNL09qUGRXSGs0Wm5oNG5DdEkNCkthTFlnKzU2ZE9kTHlZ
    2.84 +Nm0zNlZCcC9mSEpVWk5vaitTNjRmYWpVUDl2eFpMS08yV2Y2R3pGMlNBTVVSQmhFZC8NCkp5N2Fh
    2.85 +RGZnd21NK2t6emQraWpnVnpENnhKU1Y5TnZBMFhhaXNGN04veVhET1RWR2Z3U2ZFMDlkMW4xL0hi
    2.86 +Qk8NCkFNNjhVbXV3SXhIZ2tqaUxiRzVPaDZOZ21lQXkxeHFJU2o3NHhseFNoUUVNQTVpc3B3WC94
    2.87 +aXEwQVFmK0l4VlcNCnM5dVFIS045YnhoMU53ZDYxUzJRRWlSRERNcHBTZjlpTmZhMmcvLzBtemJ5
    2.88 +T3dXN1ZzSDY4MThvOXp2UW85R3YNCmoxZFBnWFFCSW16YzJGdmJjOWFlenovVzZNaWVVdFg1WkEw
    2.89 +ak9BNVp3N2t0cFUzUHdUTUhEeGI0NHVDZlBnZE0NCnlFQ20zT3RKRzMxUjRCVWVWYndRdmpTRERE
    2.90 +VkJaM3hXOEZFSlRic1pKV1ovcHlDV29DeGVDRTVDWDB2cWozRzgNCm1NSWFnUVdSVFlOZ0xGNVgv
    2.91 +RVA1ZTArNXFPL1BEaWp3cFQwU2FtVEM5MHRaVHNYY0hIemhRVFFORGlNN2p3Z2YNCnpXRXhobHVj
    2.92 +THFWS2x0c2ZOeXF2c1lKR3djNTh6akNIWmdjOE52QmZjRnVqZGdTM1V5YkdDbHpaVVU0bElMUVMN
    2.93 +CnE1SHl6MkZyckNpbjMyUUNrOUxzQWV1U2NFbEtDNGlLeHphU2pScmpBNlF6MlEwYmhmRWlHVit0
    2.94 +djc3dXhTSVANClZlb2lWbDZab1k1ZCtiaU0wZW1EdjY5Y0VPbVRrVG0wMzRacWZOUGNyOEUrV2tH
    2.95 +dzQyR3pDL1pBZG9hOVpVdGYNCmVRZUFpVHE2bFQra0E0SkJvRUF4T0Q4YXh4ZGR2U291cExzU1ZC
    2.96 +cUJEWUd3VFpIQitQQmFxYzFpWnQvdndWbFoNCjhYZnVPNzJxT2pwU2tWUzdIMnBjSXV2TlpMRFd0
    2.97 +QTV2L0szNmxFUGxpL0IxSjkzd3h6VGNEM3IvS2QvZXkxYlMNCmZMd3dEQ1VldFd4VUNQUEFBU2dH
    2.98 +WGx6Nkhwa2NHZzMxd1hWU1JJaTA0ZVhJaDFBWm9xTlBZTEdDNmdBenA4bEcNCkVoaDZaVnZGZDVH
    2.99 +OWFsaHlZNERIZjhuckZKU3E3WDlhRkRZZHF2VzdyRWNLNGh2ZUNMZk9pYVdDam9LOUdkTkkNClJp
   2.100 +Q2hOQkllUG1pdG1SNWVheDdXaTc5bnhDdldINVJLa3UzMlVaVU5NaGMrSFJlYWN2NEZvTmVOeEIr
   2.101 +bGNnemgNCmF3L3l4eEVXTGNPaDJsUng2R0k1cGQ1cUdEZVhicGRKNitvSUxNQ2ZPeDJuMlBZWFJx
   2.102 +TEVLZlpTSTc2QkE1VFUNCmxkOHhhU3p0bE1CNFBORldaQ0krS1Q2MHYrWkc5VERHTDBnT2xlSDE2
   2.103 +aEMvNmFaZVdpeXJ2T1k4L3hobzRXcUMNCnJwaGNjYUNKSXVoT1RBYzU2cGRJdHdzRDFiTzNWempl
   2.104 +cS9DeTlqQUtUUC9laEJPdjFBVFNBV1ErR0ZuTTMyOEcNCldXN2JLbVdybVU0RlBiS2F1UHdlRm85
   2.105 +ZzlXZ2x0REcrcVh3NWlBenoycGl3THJSb0F0L1l4NEZ4eEk0aDNhQVANCkx4ZVFxS3dIUDhVWGU3
   2.106 +b3Zsc2x4dFc5S21UMXJyUUt1WXlyNm9aMlFUc2NCdTIzaHNJVVNRSGM3VDEzcXBIM1UNCkhtSTVU
   2.107 +MTlydTJRbjZ1Z0JFSDZteXRoSVE4N1lpVGJEREticWRSZ0wrTXlFeWhPYWk5NmxwdGdON1NjREQr
   2.108 +bHgNCnZ2RHdGSGRPTVlpaCt6YUVQSTRtY2pPWnN2dDN2WkwxMzNGK1dkUkxYcWV6ZTdhNUdmOEwy
   2.109 +SjZRNzBOWTdIc1ENCmx0Mk1OSDQvY3Bvc28wTWRuRWxDZ1Zuam1SR3NlRFg5ZERyV0lFWDB1MnFV
   2.110 +SER2YXhGZWMvMEo2eVlSRmRHakMNCldOQzlFL3VuMm1IUFBudkpSbjdRUzBvRkNNYU5CZUFZUmph
   2.111 +aVBiV1VuRHFlK1VhUW9mamFIOGdCa3RjYWNxL2oNCnBXbjBPbVUxdHhiUUNDWWVHZTJIcXFrRmt0
   2.112 +cy9hdVhGL3pob09rUGpYamR6ZWxIanVCNUhpS2Y0UGp6TjU2dEkNCjIrWkp5SHNPaDVrZ01jZ296
   2.113 +TXJIYkNvOS91NmFicldGc1VKUGU4MHA1dDhsZFB1a3FnNW1EUDZoZUN2bDdLQm8NCk9vY3pEMlFX
   2.114 +QUFFdStqeHIzVmxkZGtqVW9YRE5GT0ZrZXlTTDNZWjY2VFRGRDB0OFhuaTh1Qk9GSGFIM3Ztc0UN
   2.115 +CmhSYVVqTzREZ1UxQnZzc2lwNEhURkFleW9FZnpJVlBTSFdmeENNd0tLTHlzU1ZQRTgrVlFLWkVX
   2.116 +WHp5bHc2aUoNCnVnMWFnRWtmbUIrK2tkaEo3TUdyWXRGWnlBSVB2Rm9sZWZUU24zeSt3UTRjbHcv
   2.117 +MkhIZXdWWFJKdVFEbnhpM0wNCmZnVmszRkdrMTFBZGMxdjJVRkRLOHBDWjU0NlRpclI4eEtNdHNQ
   2.118 +b284K2RtajFqY3pGelpFdHNIV3gxR2NvZWwNClBzandjNUs0b2M0SzNTKzJrMWcxYXU3YkRPRGcv
   2.119 +Y0kvcGdnYVViaEJxSGpYc1hoZmhQcWNQU3o2dWFvMkN0S3ANCk44dUxjZjAyQk9DZWNPYTI5WCto
   2.120 +V0ZyZi9nR0RiYmFORHU4ckM3WkhJYmk3VnJWOGEzWmxHN1RQSzh0dWhyRjMNCnIxVTFFd2FjZ0lj
   2.121 +Y2FqSWwvazBJTDl6U1hIZmd4RThDZDBzUG1wU0F4VTR6Ulp2UVlOSUhLc1NFVkk3ZGgyd0QNCk9R
   2.122 +bVRXYVp5bVlNRllNTzdqSjVSck9ncUlDcDU4clEwQVVwdllmc1p1ZmlpSnlVZDR0cnRDMXMzcm9u
   2.123 +ZDAwanoNCmRhblkrclA0a2ZJeXdKM0VoTURJSk1pUUxkcndPRW9vMG9tS2hQSEIvSzdpR3Rwc2Nt
   2.124 +d2c0VVNmL2s5SGJuZE0NCk9OKzJMRjg0QjZGa0lLZGdqZGpSdzBENXdabTBRVlVEbkp1c3V0UytP
   2.125 +V1M4SFJaNEIwdDJwMTh3UncxeXpabWENClRqYUY5d1hVeG9Rb0h2TDdwekt4c0psOWp0STVaNS9j
   2.126 +UjZLTVY1VmR2bE9mM1JzTjh0WmFOYkp2TGorN0lZTTANCmRLUDJabDRrQjdFL2hCaWZGMllwVUxZ
   2.127 +VVZYVDFXNGFuV2VLT3dCSjdiTEhCN2FTT3ZuOGtyQXo4eW81YWhsSjgNCnVjdTl2MDJQWjRML3BD
   2.128 +NmZGcWloUEducGVyOEd0WEhZNVJzUVFkTUJnTmNMdEZkdEViSkU4K0lwUklpRkt6NTANCkJBdG5K
   2.129 +V1QrT09DYUhCeVNyWm5NRVN6U3JTMVRrNTFxMlhKSGR2WE9ld0JCQzNUWWVWTFhPV09lVmFFZU5P
   2.130 +UmINClJiZWF4bEllT0VmY0k2STZqWG9qelZhZm0wZ0xWQnduRUNtZUlFUDBXYWhWOFhoSDZYTDly
   2.131 +SGtkWWIrVVNNckoNCkx3UHpCTi9oWmhncHQ3TXZEVUd4aW5FWHZMWnowYnI0YTk5MDI4SVVNTEFo
   2.132 +dDlacVFJNXdSVDBHY3VCd1dWdjcNCnc1bVk1OXRDU0h0emZGQmxvVkpYS096eWh3T3VzdWk2bTVR
   2.133 +WkRIWDhPVk5pVDFHeksrZzEwclZkZVRnVmxkZGMNClYwY3k2aDduMk1qdVp4b3IzQzFDZXBIMXpi
   2.134 +dS8xY2ZXUkt2ZlNySFBVYTdsaC9OT2RMSkttZjZ6ajAwUENYYnoNCnRWTnlLYmszNWJtVG9MeG81
   2.135 +MVJsaGRSM2E5QmNPSmZHNFg1eU8rTUJJQlRlOGgyWml6STlHbkQ1eTdkQ2VKVFMNCm5TMVIrVjlW
   2.136 +RGEyQTk0VDBaSU1Jc1A5Q2RkcGFVRnV5TExrcDJYQnRpU1k1MDZHVXdoTjF4TEVwWnZwbTVwRE8N
   2.137 +CnkxakhDWEhUVk05WUQyUEpEbXFrT0R2WW1oK0tncm1DUUliSnl0TlFPR1hmajdLRHhqdGordlhU
   2.138 +MzVza3ZPZW4NCmlDcXdzcTFVOWZlckdFUTJCSVFaVWFleXpFL2NQUThncFB5SkpodE9KdmVkcW5P
   2.139 +RjNuREJaWnp5aWlCK1BhSGoNCjhIdHpKbkxPN1R3WUZqVDVWZFVPNnJPc0oyL0Z0Zm4xcS9LQXFx
   2.140 +eDBrenZBc25WL25aMFdOZTltN1k2NlVydnQNCkIxV0pObURzdDFwRXgwWVU4UXdLMnI0TDNUc0pQ
   2.141 +NmJxNDQzTTdsQXREQ1ZiM0NFNWd3WWJPR05TZXZEQnAwazANCmlRSTNCVUMweExyS2d1dFBTZHNq
   2.142 +R1pCVUhsbVFkZXpZb1hDM2dsaTBUQUhuZ2ZpcHU0N21XbkZkeHpvdk1tRkENCkk5SVF3ZkxSRXda
   2.143 +SFlTbERRLzB1ak1zZVQzbHdDWWNoNUx0Z2lyNnQzaDRETkVzQXl6dmNWOGRoUkpRQ2FHUjUNCkww
   2.144 +VWlYRDVUdElMbkVtSTNpQlhOMU5RZjlrWmV5VWNuYWNucXpFa0FQNUhUS1V0cVVna1psVXMrK0h4
   2.145 +cytnVVkNClRBdW1JeDhXM2dHa1kya2ZuNmpJZUI4enVndytML2p0TTBsYlptR2JGRkhIdmVrWEIr
   2.146 +MXpWRCtQVm4yUlhyalkNCkFYTWw5MlhMMlkybytlb2d4SmJFb21QcDhuRUpkRjdHaWNFRjVFL0FW
   2.147 +RjU4WWZTTDJXMk8rakhFZXo1TnZ0NFANCk5RcWNJR3d4K0V5VFYrZGxXaHFKdHZDeW9qNlROY2hO
   2.148 +Y1ZZYUVmM2ROOW9uSm1jejlweUcxbDN5eEUrRGVPV2QNCmtxZXVZdkRNOTc5T3JwS1ptK2k2S0ow
   2.149 +TmJpenh0UjVlMy9uQkI2TFNKTmNnMnFuVVhmMmxnUDVEa3JvRmtlZ2gNClVqL3dwRTVCRkUwa2JE
   2.150 +blZQdHdZWVpLeTI0VytST011MmxtNG1CUU5Ra0N5TnYzSWpwMUZod3FlM21LVmtJNXgNCjU3enhF
   2.151 +Z21zbkdveE1jSmt5UFVWMGhjb01QYnhwTmVOVC96SkozcGVCc3ZQMDBRbmtaVGhhZGV1ZWpDdUgr
   2.152 +SzINCkROaFdpTDFuSW01MU9TZXY3elNMNktTVHV0SGFSVDgrTnNpWkxwSGV5VGVpN1JITDhFTHpQ
   2.153 +d2hDYkd2SHN3VWINCjZ3akQyME82SHNkOW5GeGhLYmRRVmNtVVBnVEJkSkNBNGZtTnhCK05xQisy
   2.154 +TlYxNFpVUEtSL3Y2T25xNno0a3YNCmljSGtLa2xrQnF4THNXMkZvRVZVekhEc2VzUWlIMTNwQTZ1
   2.155 +QWh0K282eE90YzlGSTFrQ0FOaEJGT3lmOFpLb0kNCmpjdnlyRGUyNThNTURXdHFlc1NsUS91R0ts
   2.156 +VHY4elVpclRuOVpMbGlNalhJck5CSXlwN0U0dk81TUt4VEJySEUNCmpVeWNnQnhZNUQ4Ry9qYVNt
   2.157 +b0Z0QVBSblBZdmZnU2U2YUxndkNpcElZenc0Rk5pQ2NVc0RCVXIzSUFZbXlIVncNCitSeWFJUEt6
   2.158 +YkloK21TVTM1MFpvRXBPYTdpRWFyQlZ2YVowWGFqRklLL3ZKQi9kRitVeVZYM0w3SXhqVytvYWwN
   2.159 +CjZwelZ6c3pQNTY2YU00MlVzWXFTVmtIcUNVeldTam5SWjRFVWZQK1R6dXVyOWNCZHdWSXFzKzU2
   2.160 +VVpyd1NIYlkNCmJmQy9jbHNIWCtBdXQ0anAvODFFcUJKamZuS2ZYZ0VIbVJlM2RKeHoxWm5MbmVx
   2.161 +dXZtZGJyK0Z2bXRVQXN6T3INCjNQSGpyVE9JS29QYWlHTzhkTlNJZ3kzYUdtdStTWlBGS3BEb0cy
   2.162 +ZG9ybFJOcjkyUXlxU3NadzlBOHpRY1BEUmUNCmxYM29kdWhrc0dCQkpQd2NMNHU5RVprRTNJN2Fo
   2.163 +dDM3SGVwR1hhRStieE5PQTJaNWFCMnFKcS9PV1J2MmRnVFkNCnZadmMyRDZ3MmJYQmhOaE9NU3JL
   2.164 +bTgxVlQ0ZlVwa3o1NWlGUFhkUC9rY2tvZHRnLzdUcU9CcTQyNVNQaEdTYUQNClRYQ2RXL1pTRW1Q
   2.165 +bkYwNmNaVlFXRmxmbVlEdG9BTVJ1Z1hBbnBTeDZoY1A5dTd6RTZhY3J4Z1BzQTZJdFJKMjINCi9K
   2.166 +U3hTQkx5eVB0UHVXcXRFVm1MNGxrZ09JZmFyZm9FUnRvVXE3ZmZLS3VEME1qb092Y2JZOStQemJn
   2.167 +b09KanoNCndPRWN1c21IbWtvZDhFTkdyekVMWXVGSTdyazQrdTN3ZURXWVdlc1AzcWZBSTNvU1NB
   2.168 +Nlhrdko5WTdzSG9SVUoNCmdwbWRqeXA1TWxkRDFXQVdTUUN6ZnRxWWJCNzNUbVkrOVVlbE5TYWtp
   2.169 +RUtjVmpnTnUvM3JDblVpaVpvTitSdkINCkZYMVQxSkdsUmtZT1pXUkRyeWxiNklHRHpRVW5uVFl4
   2.170 +T2NaUmQ3aG5Rb3o1dXVWczNxZDh4S2VkWkhWU0xWYUcNCnhsRlRJUzJEdTh5VzQ2Q0lNeUhRd2hI
   2.171 +cmxnM0tEbVhxUEQyZG1Sb2Q1WktYK3prUUIySVB5S0dmS2F5dDlCTmQNCitmcExkSjA5eVNwTDBa
   2.172 +Nkt0ME53VmZaeVo1ZzlacW54RWxFQ3ZydCt5LzRKcWw5aEZaMzZ6a001YmdPcy9xUi8NCjdTeW9R
   2.173 +RTNtd28xQ09wdUhKdVVVS1N0R3JxYkdKSWxHdzlOaVV6UFozRFkxc3hPTVR1ejB6U3Y1cWFUWTlH
   2.174 +VkYNCm41U3FFZWZUbmlCNDNoQUVYWGZSSFlpakhNeXk3aFFvdEQ0SHZDVmlscmFhdlFkekZSRTdS
   2.175 +aWRlMVB1M2JuZncNCmZ0S1ZmQXBqMG5XMnQxVkI4emNmaWRIbWVsYm1LdFVzQ0I2WHRReE9DOGUr
   2.176 +NnZxQVFTZWxzMmdBNm5na01NR3UNCnVERWFKTUVDK3cyK3dYS1R2SnFiRzFkT1FEK3VySTA1WjdD
   2.177 +MWhWamg5WldNRCtXUmo5QUw2S2kyUlJsR1BDckUNCkQxSFdzdzN5NmlFbXFlSVd6R0Y1UWR2dmI5
   2.178 +TDZYa3dFZE5ZZStkVng5MjJHdVhxWDhkMXY0bm5ZanNONjF5cnUNCkg0RWMzTXJQd2RVT1FwUmFQ
   2.179 +L3ZocEJUQnplbUcreUg1dWU2WnRBOTBZRjNvSXFpTHRXd2lUMHp0azRzWjR0am0NCmlJUXFvdFN3
   2.180 +R1NCSXJwaVM5dWhiUGtsWHB0ODNwbGNyNVZKYVgvcCtDTVlVM1Q2dHdrZ0ljd1lVNTZKeXBrSTUN
   2.181 +CmxUUnR2VE8xYWg3T1ZhWTA2SkxyV2F3SzdlSDNZd3VQdE1vcHpTblZacUVnTDQydUNrUlRBWlJZ
   2.182 +d3NtREoxWUYNCnRhT1JwdytOZ0REVk9CaUwzbVNvYzNwaDd2RXJ5d3pXamlrNnB3ekFxS3ZGWU9P
   2.183 +c2czYXdnRkJFOUV2NXU3dHQNCkJlZk9oM051T1JQazUzSUwrWXp4bjl6WDJkYlNhSkpBL0ZXejBN
   2.184 +cGxEc0diRzJjNlhaS2pDVjVjRi9CWkJ4M1YNCklBNjhKWm9qWXFqV211SURaR25sZ1hJOXh4MUdW
   2.185 +dENOVnRFbkR5QjJ4VW56bVVqMEc0UW5MaG5sSkVNQ3cwZDENCjJWUDdmUlduQ1p4bkFLZEs0WlJv
   2.186 +V2ppWDFWM2Y5Wm9GeEJKYlFLRGtVTWx3NHJkclZYQlZTbHNHRGlaamdjQTcNCld3OG0yZ3BYVE1p
   2.187 +VnV0UVh6VXVKVXBBRVA1SC9oaWJTSEZLVExlWi9vYm1JYTNKUEo3NzkrZFBhWXlUYXJ4K08NCnFl
   2.188 +dk1WaVhNZG5EVEVwYngzUEoveVp0dUZrQ0g1R2s5bjc1MXAzYUdJdEhkOFJMVThxYUVmVHc3ZEtO
   2.189 +bk9sbm0NCnFRb0xwOUdzeSs3eHZZSmUxQmF0UUIrYmpjRnR4YmZrSWRkeFRqbWcvMTkyMml5K0hI
   2.190 +VHhxdEdwMFFVQmFPYW4NCmNPWVdYVlR0YWRJMFRsUjZjcjJ2Q2RCcW5aSXUxcDdNZ2pDNDFFQ3lR
   2.191 +Q0N2WHlxdFNyMXVzbCtCbDdwTy96TEQNCmhSUWRGREhDczhlUEZhdmwxaHhMdUsyVkZWZXpMV1Mr
   2.192 +VGJkMW1GZlRBc0JtSmpGb3RyUkxQSTM2b2VmbEMyWkINCnlMbDdKMjJ6dy93alpIbENXc0dsU2hD
   2.193 +c2xpSlZCU0JWcDhIQU94K3NHbm0vMlkwM3VpNDB4ZUJTc2gwenV1Q1ENCm80L3RRUzVZbGRIdUdl
   2.194 +YjM3ckNESXBsTGphWmR0SDQ1UEg2RG8vNVpxcU1LNzByNnBYeWx2VUF0RXNPaGpIYnANCnVHM0ha
   2.195 +Qk9tdjJqaktZaFRlUEgvbzJwL0VabUlGTU02Z2s1eXlVTmQwTlhyRWFoMFpQNTBRSTQ5S29hRFFa
   2.196 +d3YNCnY0d2hadC95KzhGZXliN0lJMTFwZGRNT0hGcEtucU80QW1xUldIeXphRnBZT3JualRaTjUw
   2.197 +Nm9TRWZDNFdDRFUNCnNjRjhUem9Ebzc2RVNUL3pYaW01KzhVRmVXL0VFVEFMbUpjdEFrdmhISjh5
   2.198 +VTVQOVdubExEYzZOSEtPdnYzcjUNCmZodllXQXBYbDk2QjRDUWNiQTIrV2txckNMektsOWx4bCtF
   2.199 +bE0yVjNtV3JwUDNVSzg3a2wNCj1Bblk0DQotLS0tLUVORCBQR1AgTUVTU0FHRS0tLS0tDQo=
   2.200 +
   2.201 +--_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_--