Merge in tests for Engine655 sync
authorKrista 'DarthMama' Bennett <krista@pep.foundation>
Tue, 26 Nov 2019 14:31:54 +0100
branchsync
changeset 42254aee2e82153d
parent 4222 3247a7e15516
parent 4224 53e416ab5688
child 4227 7131be89c995
Merge in tests for Engine655
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/test/src/Engine655Test.cc	Tue Nov 26 14:31:54 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 Binary file test/test_files/655_keys.db has changed
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/test/test_mails/655_msg_huss.eml	Tue Nov 26 14:31:54 2019 +0100
     3.3 @@ -0,0 +1,198 @@
     3.4 +Return-Path: <hk@pep.security>
     3.5 +X-Original-To: patrick.o@peptest.ch
     3.6 +Delivered-To: patrick.o@peptest.ch
     3.7 +Received: from mail.pep.security (unknown [192.168.4.40])
     3.8 +	by peptest.ch (Postfix) with ESMTPS id 42ABB1A1BDC
     3.9 +	for <patrick.o@peptest.ch>; Fri, 11 Oct 2019 16:00:49 +0200 (CEST)
    3.10 +Authentication-Results: plesk.peptest.ch;
    3.11 +	spf=fail (sender IP is 192.168.4.40) smtp.mailfrom=hk@pep.security smtp.helo=mail.pep.security
    3.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;
    3.13 +Content-Language: en-US
    3.14 +Content-Type: multipart/mixed;
    3.15 +	boundary="_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_"
    3.16 +DKIM-Signature: v=1; a=rsa-sha256; d=pep.security; s=1519399626.pep;
    3.17 +	c=simple/simple; t=1570802449; h=from:subject:to:date:message-id;
    3.18 +	bh=gBLmMSULKRjR+HZlBgwqzwqhGwLG+O4T+T3q/nimXuk=;
    3.19 +	b=VV+LTu6mowFffgoZX+gk8udjVgCyD7MB/JVSJhbJfX3D2GRmcDCC3Q/54uhX1qJc9HZB3wI+vfL
    3.20 +	mKIcx3+uLJWEYG36N6W9IRxY5bOs9nFRonJTes/93ususMdu3RwKCCx/6rijyo6uqKJlQ6Kk/xHgD
    3.21 +	Ba34/6MLvUpkVJbfOSz+sdVkQKgMr0zAqh4TN1qzdhvRIIFLibKbwHYzCxzBm4W5Bk6MgyHTvngjG
    3.22 +	SrPvYSZPRd2OXH4zL48H5KP6NmPUZK9IhrYrs12fEV//PSFjUJbPLTwGBJRBn8H1TW5+c54RSrzIh
    3.23 +	cGN8CU5I5/AT3nEMdbN0bJ5LTpwSndHFv0JQ==
    3.24 +From: Hussein Kasem <hk@pep.security>
    3.25 +To: Patrick Meier <pm@pep.security>, "patrick.o@peptest.ch"
    3.26 +	<patrick.o@peptest.ch>
    3.27 +Subject: Re: New test version with the first menu approach.
    3.28 +Thread-Topic: New test version with the first menu approach.
    3.29 +Thread-Index: AQHVgDxFdXuWCILfaUOMFUf0CL7Z9Q==
    3.30 +Date: Fri, 11 Oct 2019 14:00:48 +0000
    3.31 +Message-ID: <0CFFA95A-A42D-4DD5-9FF0-D52F3A5ED193@pep.security>
    3.32 +References: <5cc4f0e18f754d30b40049e71e24a2b8@pep.security>
    3.33 +In-Reply-To: <5cc4f0e18f754d30b40049e71e24a2b8@pep.security>
    3.34 +Accept-Language: es-ES, en-US
    3.35 +X-MS-Has-Attach: yes
    3.36 +X-MS-TNEF-Correlator:
    3.37 +MIME-Version: 1.0
    3.38 +X-CrossPremisesHeadersFilteredBySendConnector: ex02.intranet.pep.security
    3.39 +X-OrganizationHeadersPreserved: ex02.intranet.pep.security
    3.40 +
    3.41 +--_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_
    3.42 +Content-Type: text/plain; charset="us-ascii"
    3.43 +Content-Transfer-Encoding: quoted-printable
    3.44 +
    3.45 +
    3.46 +--_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_
    3.47 +Content-Type: application/pgp-encrypted;
    3.48 +	name="PGPMIME Versions Identification"
    3.49 +Content-Description: PGP/MIME Versions Identification
    3.50 +Content-Disposition: attachment; filename="PGPMIME Versions Identification";
    3.51 +	size=13; creation-date="Fri, 11 Oct 2019 14:00:42 GMT";
    3.52 +	modification-date="Fri, 11 Oct 2019 14:00:42 GMT"
    3.53 +Content-ID: <F8984A127C355A43AB614B9ED07AA933@pep.security>
    3.54 +Content-Transfer-Encoding: base64
    3.55 +
    3.56 +VmVyc2lvbjogMQ0NCg==
    3.57 +
    3.58 +--_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_
    3.59 +Content-Type: application/octet-stream; name="encrypted.asc"
    3.60 +Content-Description: OpenPGP encrypted message.asc
    3.61 +Content-Disposition: attachment; filename="encrypted.asc"; size=7577;
    3.62 +	creation-date="Fri, 11 Oct 2019 14:00:42 GMT";
    3.63 +	modification-date="Fri, 11 Oct 2019 14:00:42 GMT"
    3.64 +Content-ID: <4D6407EB572B8242A37696829FC758F7@pep.security>
    3.65 +Content-Transfer-Encoding: base64
    3.66 +
    3.67 +LS0tLS1CRUdJTiBQR1AgTUVTU0FHRS0tLS0tDQoNCmhRRU1BMjNkcENZVVFBUXhBUWYvV1F6KzZh
    3.68 +OG5QVVZ4ODZndlBzTkZQUXNNZ1NvR09GbWdkVW1mRFc0MXpBSXENCnppQURPdTRqZ0hKV09jVDBr
    3.69 +ZlhtRzQwUXd1K0Y3NlV3akptb0dMbnhIZW5JV1JOQ3hDTEQvMzZmZGpOWkwxKzkNCjZXSGVNM0Y2
    3.70 +S3pKS0ZIQ0t2VDRicXA4NnVXYkI1L3doaW80RWpaU0wrRXh6cGdtNzk2YktJcHF1U3U5bWVLU0IN
    3.71 +Cm1ZTnUwUVRWVmdqOUlPc1MyN2d1aVovNEs0OW5NdkhWRHFiMktaalkvR3hVSTJWMEV2aUtGYnNi
    3.72 +UWphWEVZNG0NClVQblFLdzV5ajQ1TVdubXAzMFI0Y3lPUXhGN1JaemhJaG12dk8rVUhjbWQ2azg2
    3.73 +MnQzeXpDcXptTVUvWFhGQ1ENCmZUNGIraFliNzhxYTQvanFSZXBkejFoUnNxT3hOd1ZGaGlCQWVl
    3.74 +T1h1SVVDREFNazUzeGtOYUdhVFFFUC8zeW8NCk1TRm1yemVTRDlMbHQrMjBlbGhzT05xNFA4anM3
    3.75 +MVV2UDBmTEFGbitNVmZyZEhDODRmbnlveFpaS2M3Q21SNW4NCkd0Y3AyTVdSdTBFc0tZNWhJM0Jq
    3.76 +d0lJMGNteFVBdk1zMVVxUHRCbXdHNEVDd1NIWC9sczRicXZxYzN1MUhOZmENCmN4MC9MN1hKcVE1
    3.77 +SENnMzhTdHhBMzIveXpNS0JBWENCY01QRGd4WHNGeVJvTUdmQkhvd3ppYzA1MzlnMHFOSkgNCjdE
    3.78 +Smh6SHZUdG50Q1hLazBhU2FDSTFUOW9ZNlpnRTNta2UydS82VkVCL3RIY0VyNGFoL29hRWE4WWZW
    3.79 +Vk42bG0NClhVbUZZeGpjQnR6Umd1VVhrZzFUWFpwY3Jkc3hpWTkwRkluU1pEcmsxWmE5cUJnbjlt
    3.80 +eVFibnRYWmd0MytVZHINCksrd2syYWVodFVuSFhROWpmT294TVg2MmxqenhaVTg0a2xzNTBjUDl5
    3.81 +QTJLMXdMTFRyZmRnc0dpdW5LL0I4ek0NClBDRUU4UURpSDAyU1NYK2ozNURLZW5TYkoxdTBqY0d2
    3.82 +bWtvVEFiN1VwUVlObjlscXJ1UDFOUHBhdkR0MWM5NmkNCkNWKzRqbU1mRkpub0tvRGMrSENSUFhl
    3.83 +WWt1dXYvQnFHYngzc2ZWdzZZRVhaQytNL09qUGRXSGs0Wm5oNG5DdEkNCkthTFlnKzU2ZE9kTHlZ
    3.84 +Nm0zNlZCcC9mSEpVWk5vaitTNjRmYWpVUDl2eFpMS08yV2Y2R3pGMlNBTVVSQmhFZC8NCkp5N2Fh
    3.85 +RGZnd21NK2t6emQraWpnVnpENnhKU1Y5TnZBMFhhaXNGN04veVhET1RWR2Z3U2ZFMDlkMW4xL0hi
    3.86 +Qk8NCkFNNjhVbXV3SXhIZ2tqaUxiRzVPaDZOZ21lQXkxeHFJU2o3NHhseFNoUUVNQTVpc3B3WC94
    3.87 +aXEwQVFmK0l4VlcNCnM5dVFIS045YnhoMU53ZDYxUzJRRWlSRERNcHBTZjlpTmZhMmcvLzBtemJ5
    3.88 +T3dXN1ZzSDY4MThvOXp2UW85R3YNCmoxZFBnWFFCSW16YzJGdmJjOWFlenovVzZNaWVVdFg1WkEw
    3.89 +ak9BNVp3N2t0cFUzUHdUTUhEeGI0NHVDZlBnZE0NCnlFQ20zT3RKRzMxUjRCVWVWYndRdmpTRERE
    3.90 +VkJaM3hXOEZFSlRic1pKV1ovcHlDV29DeGVDRTVDWDB2cWozRzgNCm1NSWFnUVdSVFlOZ0xGNVgv
    3.91 +RVA1ZTArNXFPL1BEaWp3cFQwU2FtVEM5MHRaVHNYY0hIemhRVFFORGlNN2p3Z2YNCnpXRXhobHVj
    3.92 +THFWS2x0c2ZOeXF2c1lKR3djNTh6akNIWmdjOE52QmZjRnVqZGdTM1V5YkdDbHpaVVU0bElMUVMN
    3.93 +CnE1SHl6MkZyckNpbjMyUUNrOUxzQWV1U2NFbEtDNGlLeHphU2pScmpBNlF6MlEwYmhmRWlHVit0
    3.94 +djc3dXhTSVANClZlb2lWbDZab1k1ZCtiaU0wZW1EdjY5Y0VPbVRrVG0wMzRacWZOUGNyOEUrV2tH
    3.95 +dzQyR3pDL1pBZG9hOVpVdGYNCmVRZUFpVHE2bFQra0E0SkJvRUF4T0Q4YXh4ZGR2U291cExzU1ZC
    3.96 +cUJEWUd3VFpIQitQQmFxYzFpWnQvdndWbFoNCjhYZnVPNzJxT2pwU2tWUzdIMnBjSXV2TlpMRFd0
    3.97 +QTV2L0szNmxFUGxpL0IxSjkzd3h6VGNEM3IvS2QvZXkxYlMNCmZMd3dEQ1VldFd4VUNQUEFBU2dH
    3.98 +WGx6Nkhwa2NHZzMxd1hWU1JJaTA0ZVhJaDFBWm9xTlBZTEdDNmdBenA4bEcNCkVoaDZaVnZGZDVH
    3.99 +OWFsaHlZNERIZjhuckZKU3E3WDlhRkRZZHF2VzdyRWNLNGh2ZUNMZk9pYVdDam9LOUdkTkkNClJp
   3.100 +Q2hOQkllUG1pdG1SNWVheDdXaTc5bnhDdldINVJLa3UzMlVaVU5NaGMrSFJlYWN2NEZvTmVOeEIr
   3.101 +bGNnemgNCmF3L3l4eEVXTGNPaDJsUng2R0k1cGQ1cUdEZVhicGRKNitvSUxNQ2ZPeDJuMlBZWFJx
   3.102 +TEVLZlpTSTc2QkE1VFUNCmxkOHhhU3p0bE1CNFBORldaQ0krS1Q2MHYrWkc5VERHTDBnT2xlSDE2
   3.103 +aEMvNmFaZVdpeXJ2T1k4L3hobzRXcUMNCnJwaGNjYUNKSXVoT1RBYzU2cGRJdHdzRDFiTzNWempl
   3.104 +cS9DeTlqQUtUUC9laEJPdjFBVFNBV1ErR0ZuTTMyOEcNCldXN2JLbVdybVU0RlBiS2F1UHdlRm85
   3.105 +ZzlXZ2x0REcrcVh3NWlBenoycGl3THJSb0F0L1l4NEZ4eEk0aDNhQVANCkx4ZVFxS3dIUDhVWGU3
   3.106 +b3Zsc2x4dFc5S21UMXJyUUt1WXlyNm9aMlFUc2NCdTIzaHNJVVNRSGM3VDEzcXBIM1UNCkhtSTVU
   3.107 +MTlydTJRbjZ1Z0JFSDZteXRoSVE4N1lpVGJEREticWRSZ0wrTXlFeWhPYWk5NmxwdGdON1NjREQr
   3.108 +bHgNCnZ2RHdGSGRPTVlpaCt6YUVQSTRtY2pPWnN2dDN2WkwxMzNGK1dkUkxYcWV6ZTdhNUdmOEwy
   3.109 +SjZRNzBOWTdIc1ENCmx0Mk1OSDQvY3Bvc28wTWRuRWxDZ1Zuam1SR3NlRFg5ZERyV0lFWDB1MnFV
   3.110 +SER2YXhGZWMvMEo2eVlSRmRHakMNCldOQzlFL3VuMm1IUFBudkpSbjdRUzBvRkNNYU5CZUFZUmph
   3.111 +aVBiV1VuRHFlK1VhUW9mamFIOGdCa3RjYWNxL2oNCnBXbjBPbVUxdHhiUUNDWWVHZTJIcXFrRmt0
   3.112 +cy9hdVhGL3pob09rUGpYamR6ZWxIanVCNUhpS2Y0UGp6TjU2dEkNCjIrWkp5SHNPaDVrZ01jZ296
   3.113 +TXJIYkNvOS91NmFicldGc1VKUGU4MHA1dDhsZFB1a3FnNW1EUDZoZUN2bDdLQm8NCk9vY3pEMlFX
   3.114 +QUFFdStqeHIzVmxkZGtqVW9YRE5GT0ZrZXlTTDNZWjY2VFRGRDB0OFhuaTh1Qk9GSGFIM3Ztc0UN
   3.115 +CmhSYVVqTzREZ1UxQnZzc2lwNEhURkFleW9FZnpJVlBTSFdmeENNd0tLTHlzU1ZQRTgrVlFLWkVX
   3.116 +WHp5bHc2aUoNCnVnMWFnRWtmbUIrK2tkaEo3TUdyWXRGWnlBSVB2Rm9sZWZUU24zeSt3UTRjbHcv
   3.117 +MkhIZXdWWFJKdVFEbnhpM0wNCmZnVmszRkdrMTFBZGMxdjJVRkRLOHBDWjU0NlRpclI4eEtNdHNQ
   3.118 +b284K2RtajFqY3pGelpFdHNIV3gxR2NvZWwNClBzandjNUs0b2M0SzNTKzJrMWcxYXU3YkRPRGcv
   3.119 +Y0kvcGdnYVViaEJxSGpYc1hoZmhQcWNQU3o2dWFvMkN0S3ANCk44dUxjZjAyQk9DZWNPYTI5WCto
   3.120 +V0ZyZi9nR0RiYmFORHU4ckM3WkhJYmk3VnJWOGEzWmxHN1RQSzh0dWhyRjMNCnIxVTFFd2FjZ0lj
   3.121 +Y2FqSWwvazBJTDl6U1hIZmd4RThDZDBzUG1wU0F4VTR6Ulp2UVlOSUhLc1NFVkk3ZGgyd0QNCk9R
   3.122 +bVRXYVp5bVlNRllNTzdqSjVSck9ncUlDcDU4clEwQVVwdllmc1p1ZmlpSnlVZDR0cnRDMXMzcm9u
   3.123 +ZDAwanoNCmRhblkrclA0a2ZJeXdKM0VoTURJSk1pUUxkcndPRW9vMG9tS2hQSEIvSzdpR3Rwc2Nt
   3.124 +d2c0VVNmL2s5SGJuZE0NCk9OKzJMRjg0QjZGa0lLZGdqZGpSdzBENXdabTBRVlVEbkp1c3V0UytP
   3.125 +V1M4SFJaNEIwdDJwMTh3UncxeXpabWENClRqYUY5d1hVeG9Rb0h2TDdwekt4c0psOWp0STVaNS9j
   3.126 +UjZLTVY1VmR2bE9mM1JzTjh0WmFOYkp2TGorN0lZTTANCmRLUDJabDRrQjdFL2hCaWZGMllwVUxZ
   3.127 +VVZYVDFXNGFuV2VLT3dCSjdiTEhCN2FTT3ZuOGtyQXo4eW81YWhsSjgNCnVjdTl2MDJQWjRML3BD
   3.128 +NmZGcWloUEducGVyOEd0WEhZNVJzUVFkTUJnTmNMdEZkdEViSkU4K0lwUklpRkt6NTANCkJBdG5K
   3.129 +V1QrT09DYUhCeVNyWm5NRVN6U3JTMVRrNTFxMlhKSGR2WE9ld0JCQzNUWWVWTFhPV09lVmFFZU5P
   3.130 +UmINClJiZWF4bEllT0VmY0k2STZqWG9qelZhZm0wZ0xWQnduRUNtZUlFUDBXYWhWOFhoSDZYTDly
   3.131 +SGtkWWIrVVNNckoNCkx3UHpCTi9oWmhncHQ3TXZEVUd4aW5FWHZMWnowYnI0YTk5MDI4SVVNTEFo
   3.132 +dDlacVFJNXdSVDBHY3VCd1dWdjcNCnc1bVk1OXRDU0h0emZGQmxvVkpYS096eWh3T3VzdWk2bTVR
   3.133 +WkRIWDhPVk5pVDFHeksrZzEwclZkZVRnVmxkZGMNClYwY3k2aDduMk1qdVp4b3IzQzFDZXBIMXpi
   3.134 +dS8xY2ZXUkt2ZlNySFBVYTdsaC9OT2RMSkttZjZ6ajAwUENYYnoNCnRWTnlLYmszNWJtVG9MeG81
   3.135 +MVJsaGRSM2E5QmNPSmZHNFg1eU8rTUJJQlRlOGgyWml6STlHbkQ1eTdkQ2VKVFMNCm5TMVIrVjlW
   3.136 +RGEyQTk0VDBaSU1Jc1A5Q2RkcGFVRnV5TExrcDJYQnRpU1k1MDZHVXdoTjF4TEVwWnZwbTVwRE8N
   3.137 +CnkxakhDWEhUVk05WUQyUEpEbXFrT0R2WW1oK0tncm1DUUliSnl0TlFPR1hmajdLRHhqdGordlhU
   3.138 +MzVza3ZPZW4NCmlDcXdzcTFVOWZlckdFUTJCSVFaVWFleXpFL2NQUThncFB5SkpodE9KdmVkcW5P
   3.139 +RjNuREJaWnp5aWlCK1BhSGoNCjhIdHpKbkxPN1R3WUZqVDVWZFVPNnJPc0oyL0Z0Zm4xcS9LQXFx
   3.140 +eDBrenZBc25WL25aMFdOZTltN1k2NlVydnQNCkIxV0pObURzdDFwRXgwWVU4UXdLMnI0TDNUc0pQ
   3.141 +NmJxNDQzTTdsQXREQ1ZiM0NFNWd3WWJPR05TZXZEQnAwazANCmlRSTNCVUMweExyS2d1dFBTZHNq
   3.142 +R1pCVUhsbVFkZXpZb1hDM2dsaTBUQUhuZ2ZpcHU0N21XbkZkeHpvdk1tRkENCkk5SVF3ZkxSRXda
   3.143 +SFlTbERRLzB1ak1zZVQzbHdDWWNoNUx0Z2lyNnQzaDRETkVzQXl6dmNWOGRoUkpRQ2FHUjUNCkww
   3.144 +VWlYRDVUdElMbkVtSTNpQlhOMU5RZjlrWmV5VWNuYWNucXpFa0FQNUhUS1V0cVVna1psVXMrK0h4
   3.145 +cytnVVkNClRBdW1JeDhXM2dHa1kya2ZuNmpJZUI4enVndytML2p0TTBsYlptR2JGRkhIdmVrWEIr
   3.146 +MXpWRCtQVm4yUlhyalkNCkFYTWw5MlhMMlkybytlb2d4SmJFb21QcDhuRUpkRjdHaWNFRjVFL0FW
   3.147 +RjU4WWZTTDJXMk8rakhFZXo1TnZ0NFANCk5RcWNJR3d4K0V5VFYrZGxXaHFKdHZDeW9qNlROY2hO
   3.148 +Y1ZZYUVmM2ROOW9uSm1jejlweUcxbDN5eEUrRGVPV2QNCmtxZXVZdkRNOTc5T3JwS1ptK2k2S0ow
   3.149 +TmJpenh0UjVlMy9uQkI2TFNKTmNnMnFuVVhmMmxnUDVEa3JvRmtlZ2gNClVqL3dwRTVCRkUwa2JE
   3.150 +blZQdHdZWVpLeTI0VytST011MmxtNG1CUU5Ra0N5TnYzSWpwMUZod3FlM21LVmtJNXgNCjU3enhF
   3.151 +Z21zbkdveE1jSmt5UFVWMGhjb01QYnhwTmVOVC96SkozcGVCc3ZQMDBRbmtaVGhhZGV1ZWpDdUgr
   3.152 +SzINCkROaFdpTDFuSW01MU9TZXY3elNMNktTVHV0SGFSVDgrTnNpWkxwSGV5VGVpN1JITDhFTHpQ
   3.153 +d2hDYkd2SHN3VWINCjZ3akQyME82SHNkOW5GeGhLYmRRVmNtVVBnVEJkSkNBNGZtTnhCK05xQisy
   3.154 +TlYxNFpVUEtSL3Y2T25xNno0a3YNCmljSGtLa2xrQnF4THNXMkZvRVZVekhEc2VzUWlIMTNwQTZ1
   3.155 +QWh0K282eE90YzlGSTFrQ0FOaEJGT3lmOFpLb0kNCmpjdnlyRGUyNThNTURXdHFlc1NsUS91R0ts
   3.156 +VHY4elVpclRuOVpMbGlNalhJck5CSXlwN0U0dk81TUt4VEJySEUNCmpVeWNnQnhZNUQ4Ry9qYVNt
   3.157 +b0Z0QVBSblBZdmZnU2U2YUxndkNpcElZenc0Rk5pQ2NVc0RCVXIzSUFZbXlIVncNCitSeWFJUEt6
   3.158 +YkloK21TVTM1MFpvRXBPYTdpRWFyQlZ2YVowWGFqRklLL3ZKQi9kRitVeVZYM0w3SXhqVytvYWwN
   3.159 +CjZwelZ6c3pQNTY2YU00MlVzWXFTVmtIcUNVeldTam5SWjRFVWZQK1R6dXVyOWNCZHdWSXFzKzU2
   3.160 +VVpyd1NIYlkNCmJmQy9jbHNIWCtBdXQ0anAvODFFcUJKamZuS2ZYZ0VIbVJlM2RKeHoxWm5MbmVx
   3.161 +dXZtZGJyK0Z2bXRVQXN6T3INCjNQSGpyVE9JS29QYWlHTzhkTlNJZ3kzYUdtdStTWlBGS3BEb0cy
   3.162 +ZG9ybFJOcjkyUXlxU3NadzlBOHpRY1BEUmUNCmxYM29kdWhrc0dCQkpQd2NMNHU5RVprRTNJN2Fo
   3.163 +dDM3SGVwR1hhRStieE5PQTJaNWFCMnFKcS9PV1J2MmRnVFkNCnZadmMyRDZ3MmJYQmhOaE9NU3JL
   3.164 +bTgxVlQ0ZlVwa3o1NWlGUFhkUC9rY2tvZHRnLzdUcU9CcTQyNVNQaEdTYUQNClRYQ2RXL1pTRW1Q
   3.165 +bkYwNmNaVlFXRmxmbVlEdG9BTVJ1Z1hBbnBTeDZoY1A5dTd6RTZhY3J4Z1BzQTZJdFJKMjINCi9K
   3.166 +U3hTQkx5eVB0UHVXcXRFVm1MNGxrZ09JZmFyZm9FUnRvVXE3ZmZLS3VEME1qb092Y2JZOStQemJn
   3.167 +b09KanoNCndPRWN1c21IbWtvZDhFTkdyekVMWXVGSTdyazQrdTN3ZURXWVdlc1AzcWZBSTNvU1NB
   3.168 +Nlhrdko5WTdzSG9SVUoNCmdwbWRqeXA1TWxkRDFXQVdTUUN6ZnRxWWJCNzNUbVkrOVVlbE5TYWtp
   3.169 +RUtjVmpnTnUvM3JDblVpaVpvTitSdkINCkZYMVQxSkdsUmtZT1pXUkRyeWxiNklHRHpRVW5uVFl4
   3.170 +T2NaUmQ3aG5Rb3o1dXVWczNxZDh4S2VkWkhWU0xWYUcNCnhsRlRJUzJEdTh5VzQ2Q0lNeUhRd2hI
   3.171 +cmxnM0tEbVhxUEQyZG1Sb2Q1WktYK3prUUIySVB5S0dmS2F5dDlCTmQNCitmcExkSjA5eVNwTDBa
   3.172 +Nkt0ME53VmZaeVo1ZzlacW54RWxFQ3ZydCt5LzRKcWw5aEZaMzZ6a001YmdPcy9xUi8NCjdTeW9R
   3.173 +RTNtd28xQ09wdUhKdVVVS1N0R3JxYkdKSWxHdzlOaVV6UFozRFkxc3hPTVR1ejB6U3Y1cWFUWTlH
   3.174 +VkYNCm41U3FFZWZUbmlCNDNoQUVYWGZSSFlpakhNeXk3aFFvdEQ0SHZDVmlscmFhdlFkekZSRTdS
   3.175 +aWRlMVB1M2JuZncNCmZ0S1ZmQXBqMG5XMnQxVkI4emNmaWRIbWVsYm1LdFVzQ0I2WHRReE9DOGUr
   3.176 +NnZxQVFTZWxzMmdBNm5na01NR3UNCnVERWFKTUVDK3cyK3dYS1R2SnFiRzFkT1FEK3VySTA1WjdD
   3.177 +MWhWamg5WldNRCtXUmo5QUw2S2kyUlJsR1BDckUNCkQxSFdzdzN5NmlFbXFlSVd6R0Y1UWR2dmI5
   3.178 +TDZYa3dFZE5ZZStkVng5MjJHdVhxWDhkMXY0bm5ZanNONjF5cnUNCkg0RWMzTXJQd2RVT1FwUmFQ
   3.179 +L3ZocEJUQnplbUcreUg1dWU2WnRBOTBZRjNvSXFpTHRXd2lUMHp0azRzWjR0am0NCmlJUXFvdFN3
   3.180 +R1NCSXJwaVM5dWhiUGtsWHB0ODNwbGNyNVZKYVgvcCtDTVlVM1Q2dHdrZ0ljd1lVNTZKeXBrSTUN
   3.181 +CmxUUnR2VE8xYWg3T1ZhWTA2SkxyV2F3SzdlSDNZd3VQdE1vcHpTblZacUVnTDQydUNrUlRBWlJZ
   3.182 +d3NtREoxWUYNCnRhT1JwdytOZ0REVk9CaUwzbVNvYzNwaDd2RXJ5d3pXamlrNnB3ekFxS3ZGWU9P
   3.183 +c2czYXdnRkJFOUV2NXU3dHQNCkJlZk9oM051T1JQazUzSUwrWXp4bjl6WDJkYlNhSkpBL0ZXejBN
   3.184 +cGxEc0diRzJjNlhaS2pDVjVjRi9CWkJ4M1YNCklBNjhKWm9qWXFqV211SURaR25sZ1hJOXh4MUdW
   3.185 +dENOVnRFbkR5QjJ4VW56bVVqMEc0UW5MaG5sSkVNQ3cwZDENCjJWUDdmUlduQ1p4bkFLZEs0WlJv
   3.186 +V2ppWDFWM2Y5Wm9GeEJKYlFLRGtVTWx3NHJkclZYQlZTbHNHRGlaamdjQTcNCld3OG0yZ3BYVE1p
   3.187 +VnV0UVh6VXVKVXBBRVA1SC9oaWJTSEZLVExlWi9vYm1JYTNKUEo3NzkrZFBhWXlUYXJ4K08NCnFl
   3.188 +dk1WaVhNZG5EVEVwYngzUEoveVp0dUZrQ0g1R2s5bjc1MXAzYUdJdEhkOFJMVThxYUVmVHc3ZEtO
   3.189 +bk9sbm0NCnFRb0xwOUdzeSs3eHZZSmUxQmF0UUIrYmpjRnR4YmZrSWRkeFRqbWcvMTkyMml5K0hI
   3.190 +VHhxdEdwMFFVQmFPYW4NCmNPWVdYVlR0YWRJMFRsUjZjcjJ2Q2RCcW5aSXUxcDdNZ2pDNDFFQ3lR
   3.191 +Q0N2WHlxdFNyMXVzbCtCbDdwTy96TEQNCmhSUWRGREhDczhlUEZhdmwxaHhMdUsyVkZWZXpMV1Mr
   3.192 +VGJkMW1GZlRBc0JtSmpGb3RyUkxQSTM2b2VmbEMyWkINCnlMbDdKMjJ6dy93alpIbENXc0dsU2hD
   3.193 +c2xpSlZCU0JWcDhIQU94K3NHbm0vMlkwM3VpNDB4ZUJTc2gwenV1Q1ENCm80L3RRUzVZbGRIdUdl
   3.194 +YjM3ckNESXBsTGphWmR0SDQ1UEg2RG8vNVpxcU1LNzByNnBYeWx2VUF0RXNPaGpIYnANCnVHM0ha
   3.195 +Qk9tdjJqaktZaFRlUEgvbzJwL0VabUlGTU02Z2s1eXlVTmQwTlhyRWFoMFpQNTBRSTQ5S29hRFFa
   3.196 +d3YNCnY0d2hadC95KzhGZXliN0lJMTFwZGRNT0hGcEtucU80QW1xUldIeXphRnBZT3JualRaTjUw
   3.197 +Nm9TRWZDNFdDRFUNCnNjRjhUem9Ebzc2RVNUL3pYaW01KzhVRmVXL0VFVEFMbUpjdEFrdmhISjh5
   3.198 +VTVQOVdubExEYzZOSEtPdnYzcjUNCmZodllXQXBYbDk2QjRDUWNiQTIrV2txckNMektsOWx4bCtF
   3.199 +bE0yVjNtV3JwUDNVSzg3a2wNCj1Bblk0DQotLS0tLUVORCBQR1AgTUVTU0FHRS0tLS0tDQo=
   3.200 +
   3.201 +--_003_0CFFA95AA42D4DD59FF0D52F3A5ED193pepsecurity_--