From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16622 invoked by alias); 21 Jun 2014 00:17:22 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 16612 invoked by uid 89); 21 Jun 2014 00:17:21 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.1 required=5.0 tests=AWL,BAYES_00,KAM_STOCKGEN,RCVD_IN_DNSWL_LOW,SPF_PASS,T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mail-vc0-f182.google.com Received: from mail-vc0-f182.google.com (HELO mail-vc0-f182.google.com) (209.85.220.182) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Sat, 21 Jun 2014 00:17:19 +0000 Received: by mail-vc0-f182.google.com with SMTP id il7so4142737vcb.27 for ; Fri, 20 Jun 2014 17:17:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:content-type; bh=9mj0mtl6UpWgXKADPzY4BdHIcsYmZIOjlnaplP1ifMM=; b=Yr8UZ1cPTxaoUhlmU3GkUSRiEr4N9J+RHKwPb4KbX5t2bUfJzorocWH6hU4MftFHTe E78nzebEHyoezbhDVkCCPBXYDg3gyRN6S1HiTS8r/RCC6DGpqzDAFn0Ds202dAuJNyfB HvoXS/VioFu2t4k0R5OG5FgL8veAvQn4Pk1SR2rYq6ZCZlv9JW8f7iC+7Y8GL1VkqqU5 Bdplfs/vEeEL3qXY85ojQdRR77x8KJ80+KPm3hUrnVexynMMJnfYEqn0nB43Q307Ceg1 BhKj4xBJFQQGBUDot0wBqGOf3bGpXF4eF7nt016oSrJqOzwUym/CQoj0U3oWmaoDvojU HVMw== X-Gm-Message-State: ALoCoQljXf8gA8hql0ABg+aBoZmp9OMQ/YA9cXLtvHrVae6/lVQ06AzgUc54fziQYv6jIieuaxLb MIME-Version: 1.0 X-Received: by 10.221.44.73 with SMTP id uf9mr5794048vcb.9.1403309837587; Fri, 20 Jun 2014 17:17:17 -0700 (PDT) Received: by 10.52.102.133 with HTTP; Fri, 20 Jun 2014 17:17:17 -0700 (PDT) In-Reply-To: References: Date: Sat, 21 Jun 2014 00:17:00 -0000 Message-ID: Subject: Re: [PATCH x86_64] Optimize access to globals in "-fpie -pie" builds with copy relocations From: Sriraman Tallam To: GCC Patches , David Li , Cary Coutant , Ian Lance Taylor , Paul Pluzhnikov Content-Type: multipart/mixed; boundary=001a11337e4261536404fc4d8860 X-IsSubscribed: yes X-SW-Source: 2014-06/txt/msg01650.txt.bz2 --001a11337e4261536404fc4d8860 Content-Type: text/plain; charset=UTF-8 Content-length: 2872 Patch Updated. Sri On Mon, Jun 9, 2014 at 3:55 PM, Sriraman Tallam wrote: > Ping. > > On Mon, May 19, 2014 at 11:11 AM, Sriraman Tallam wrote: >> Ping. >> >> On Thu, May 15, 2014 at 11:34 AM, Sriraman Tallam wrote: >>> Optimize access to globals with -fpie, x86_64 only: >>> >>> Currently, with -fPIE/-fpie, GCC accesses globals that are extern to the module >>> using the GOT. This is two instructions, one to get the address of the global >>> from the GOT and the other to get the value. If it turns out that the global >>> gets defined in the executable at link-time, it still needs to go through the >>> GOT as it is too late then to generate a direct access. >>> >>> Examples: >>> >>> foo.cc >>> ------ >>> int a_glob; >>> int main () { >>> return a_glob; // defined in this file >>> } >>> >>> With -O2 -fpie -pie, the generated code directly accesses the global via >>> PC-relative insn: >>> >>> 5e0
: >>> mov 0x165a(%rip),%eax # 1c40 >>> >>> foo.cc >>> ------ >>> >>> extern int a_glob; >>> int main () { >>> return a_glob; // defined in this file >>> } >>> >>> With -O2 -fpie -pie, the generated code accesses global via GOT using two >>> memory loads: >>> >>> 6f0
: >>> mov 0x1609(%rip),%rax # 1d00 <_DYNAMIC+0x230> >>> mov (%rax),%eax >>> >>> This is true even if in the latter case the global was defined in the >>> executable through a different file. >>> >>> Some experiments on google benchmarks shows that the extra memory loads affects >>> performance by 1% to 5%. >>> >>> >>> Solution - Copy Relocations: >>> >>> When the linker supports copy relocations, GCC can always assume that the >>> global will be defined in the executable. For globals that are truly extern >>> (come from shared objects), the linker will create copy relocations and have >>> them defined in the executable. Result is that no global access needs to go >>> through the GOT and hence improves performance. >>> >>> This patch to the gold linker : >>> https://sourceware.org/ml/binutils/2014-05/msg00092.html >>> submitted recently allows gold to generate copy relocations for -pie mode when >>> necessary. >>> >>> I have added option -mld-pie-copyrelocs which when combined with -fpie would do >>> this. Note that the BFD linker does not support pie copyrelocs yet and this >>> option cannot be used there. >>> >>> Please review. >>> >>> >>> ChangeLog: >>> >>> * config/i386/i36.opt (mld-pie-copyrelocs): New option. >>> * config/i386/i386.c (legitimate_pic_address_disp_p): Check if this >>> address is still legitimate in the presence of copy relocations >>> and -fpie. >>> * testsuite/gcc.target/i386/ld-pie-copyrelocs-1.c: New test. >>> * testsuite/gcc.target/i386/ld-pie-copyrelocs-2.c: New test. >>> >>> >>> >>> Patch attached. >>> Thanks >>> Sri --001a11337e4261536404fc4d8860 Content-Type: text/plain; charset=UTF-8; name="gcc_pie_copyrelocs_patch.txt" Content-Disposition: attachment; filename="gcc_pie_copyrelocs_patch.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_hwo6fm860 Content-length: 8215 T3B0aW1pemUgYWNjZXNzIHRvIGdsb2JhbHMgd2l0aCAtZnBpZSwgeDg2XzY0 IG9ubHk6CgpDdXJyZW50bHksIHdpdGggLWZQSUUvLWZwaWUsIEdDQyBhY2Nl c3NlcyBnbG9iYWxzIHRoYXQgYXJlIGV4dGVybiB0byB0aGUgbW9kdWxlCnVz aW5nIHRoZSBHT1QuICBUaGlzIGlzIHR3byBpbnN0cnVjdGlvbnMsIG9uZSB0 byBnZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdsb2JhbApmcm9tIHRoZSBHT1Qg YW5kIHRoZSBvdGhlciB0byBnZXQgdGhlIHZhbHVlLiAgSWYgaXQgdHVybnMg b3V0IHRoYXQgdGhlIGdsb2JhbApnZXRzIGRlZmluZWQgaW4gdGhlIGV4ZWN1 dGFibGUgYXQgbGluay10aW1lLCBpdCBzdGlsbCBuZWVkcyB0byBnbyB0aHJv dWdoIHRoZQpHT1QgYXMgaXQgaXMgdG9vIGxhdGUgdGhlbiB0byBnZW5lcmF0 ZSBhIGRpcmVjdCBhY2Nlc3MuIAoKRXhhbXBsZXM6Cgpmb28uY2MKLS0tLS0t CmludCBhX2dsb2I7CmludCBtYWluICgpIHsKIMKgcmV0dXJuIGFfZ2xvYjsg Ly8gZGVmaW5lZCBpbiB0aGlzIGZpbGUKfQoKV2l0aCAtTzIgLWZwaWUgLXBp ZSwgdGhlIGdlbmVyYXRlZCBjb2RlIGRpcmVjdGx5IGFjY2Vzc2VzIHRoZSBn bG9iYWwgdmlhClBDLXJlbGF0aXZlIGluc246Cgo1ZTAgwqDCoDxtYWluPjoK IMKgwqBtb3YgwqDCoMKgMHgxNjVhKCVyaXApLCVlYXggwqDCoMKgwqDCoMKg wqAjIDFjNDAgPGFfZ2xvYj4KCmZvby5jYwotLS0tLS0KCmV4dGVybiBpbnQg YV9nbG9iOwppbnQgbWFpbiAoKSB7CiDCoHJldHVybiBhX2dsb2I7IC8vIGRl ZmluZWQgaW4gdGhpcyBmaWxlCn0KCldpdGggLU8yIC1mcGllIC1waWUsIHRo ZSBnZW5lcmF0ZWQgY29kZSBhY2Nlc3NlcyBnbG9iYWwgdmlhIEdPVCB1c2lu ZyB0d28KbWVtb3J5IGxvYWRzOgoKNmYwIMKgPG1haW4+OgogwqDCoG1vdiDC oMKgwqAweDE2MDkoJXJpcCksJXJheCDCoMKgIyAxZDAwIDxfRFlOQU1JQysw eDIzMD4KIMKgwqBtb3YgwqDCoMKgKCVyYXgpLCVlYXgKClRoaXMgaXMgdHJ1 ZSBldmVuIGlmIGluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgZ2xvYmFsIHdhcyBk ZWZpbmVkIGluIHRoZQpleGVjdXRhYmxlIHRocm91Z2ggYSBkaWZmZXJlbnQg ZmlsZS4KClNvbWUgZXhwZXJpbWVudHMgb24gZ29vZ2xlIGJlbmNobWFya3Mg c2hvd3MgdGhhdCB0aGUgZXh0cmEgbWVtb3J5IGxvYWRzIGFmZmVjdHMKcGVy Zm9ybWFuY2UgYnkgMSUgdG8gNSUuIAoKClNvbHV0aW9uIC0gQ29weSBSZWxv Y2F0aW9uczoKCldoZW4gdGhlIGxpbmtlciBzdXBwb3J0cyBjb3B5IHJlbG9j YXRpb25zLCBHQ0MgY2FuIGFsd2F5cyBhc3N1bWUgdGhhdCB0aGUKZ2xvYmFs IHdpbGwgYmUgZGVmaW5lZCBpbiB0aGUgZXhlY3V0YWJsZS4gIEZvciBnbG9i YWxzIHRoYXQgYXJlIHRydWx5IGV4dGVybgooY29tZSBmcm9tIHNoYXJlZCBv YmplY3RzKSwgdGhlIGxpbmtlciB3aWxsIGNyZWF0ZSBjb3B5IHJlbG9jYXRp b25zIGFuZCBoYXZlCnRoZW0gZGVmaW5lZCBpbiB0aGUgZXhlY3V0YWJsZS4g UmVzdWx0IGlzIHRoYXQgbm8gZ2xvYmFsIGFjY2VzcyBuZWVkcyB0byBnbwp0 aHJvdWdoIHRoZSBHT1QgYW5kIGhlbmNlIGltcHJvdmVzIHBlcmZvcm1hbmNl LgoKVGhpcyBwYXRjaCB0byB0aGUgZ29sZCBsaW5rZXIgOgpodHRwczovL3Nv dXJjZXdhcmUub3JnL21sL2JpbnV0aWxzLzIwMTQtMDUvbXNnMDAwOTIuaHRt bApzdWJtaXR0ZWQgcmVjZW50bHkgYWxsb3dzIGdvbGQgdG8gZ2VuZXJhdGUg Y29weSByZWxvY2F0aW9ucyBmb3IgLXBpZSBtb2RlIHdoZW4KbmVjZXNzYXJ5 LgoKSSBoYXZlIGFkZGVkIG9wdGlvbiAtbWNvcHlyZWxvY3Mgd2hpY2ggd2hl biBjb21iaW5lZCB3aXRoIC1mcGllIHdvdWxkIGRvCnRoaXMuICBOb3RlIHRo YXQgdGhlIEJGRCBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCBwaWUgY29weXJl bG9jcyB5ZXQgYW5kIHRoaXMKb3B0aW9uIGNhbm5vdCBiZSB1c2VkIHRoZXJl LgoKUGxlYXNlIHJldmlldy4KCgpDaGFuZ2VMb2c6CgoJKiBjb25maWcvaTM4 Ni9pMzYub3B0IChtY29weXJlbG9jcyk6IE5ldyBvcHRpb24uCgkqIGNvbmZp Zy9pMzg2L2kzODYuYyAobGVnaXRpbWF0ZV9waWNfYWRkcmVzc19kaXNwX3Ap OiBDaGVjayBpZiB0aGlzCgkgIGFkZHJlc3MgaXMgc3RpbGwgbGVnaXRpbWF0 ZSBpbiB0aGUgcHJlc2VuY2Ugb2YgY29weSByZWxvY2F0aW9ucwoJICBhbmQg LWZwaWUuCgkqIGRvYy9pbnZva2UudGV4aSAobWNvcHlyZWxvY3MpOiBEb2N1 bWVudC4KCSogdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9sZC1waWUtY29w eXJlbG9jcy0xLmM6IE5ldyB0ZXN0LgoJKiB0ZXN0c3VpdGUvZ2NjLnRhcmdl dC9pMzg2L2xkLXBpZS1jb3B5cmVsb2NzLTIuYzogTmV3IHRlc3QuCgoKSW5k ZXg6IGNvbmZpZy9pMzg2L2kzODYuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBjb25maWcvaTM4Ni9pMzg2LmMJKHJldmlzaW9uIDIxMTgyNikKKysr IGNvbmZpZy9pMzg2L2kzODYuYwkod29ya2luZyBjb3B5KQpAQCAtMTI2OTEs NyArMTI2OTEsOSBAQCBsZWdpdGltYXRlX3BpY19hZGRyZXNzX2Rpc3BfcCAo cnR4IGRpc3ApCiAJCXJldHVybiB0cnVlOwogCSAgICB9CiAJICBlbHNlIGlm ICghU1lNQk9MX1JFRl9GQVJfQUREUl9QIChvcDApCi0JCSAgICYmIFNZTUJP TF9SRUZfTE9DQUxfUCAob3AwKQorCQkgICAmJiAoU1lNQk9MX1JFRl9MT0NB TF9QIChvcDApCisJCSAgICAgICB8fCAoVEFSR0VUXzY0QklUICYmIGl4ODZf Y29weXJlbG9jcyAmJiBmbGFnX3BpZQorCQkJICAgJiYgIVNZTUJPTF9SRUZf RlVOQ1RJT05fUCAob3AwKSkpCiAJCSAgICYmIGl4ODZfY21vZGVsICE9IENN X0xBUkdFX1BJQykKIAkgICAgcmV0dXJuIHRydWU7CiAJICBicmVhazsKSW5k ZXg6IGNvbmZpZy9pMzg2L2kzODYub3B0Cj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KLS0tIGNvbmZpZy9pMzg2L2kzODYub3B0CShyZXZpc2lvbiAyMTE4MjYp CisrKyBjb25maWcvaTM4Ni9pMzg2Lm9wdAkod29ya2luZyBjb3B5KQpAQCAt MTA4LDYgKzEwOCwxMCBAQCBpbnQgeF9peDg2X2R1bXBfdHVuZXMKIFRhcmdl dFNhdmUKIGludCB4X2l4ODZfZm9yY2VfYWxpZ25fYXJnX3BvaW50ZXIKIAor OzsgLW1jb3B5cmVsb2NzCitUYXJnZXRTYXZlCitpbnQgeF9peDg2X2NvcHly ZWxvY3MKKwogOzsgLW1mb3JjZS1kcmFwPSAKIFRhcmdldFNhdmUKIGludCB4 X2l4ODZfZm9yY2VfZHJhcApAQCAtMjkxLDYgKzI5NSwxMCBAQCBtZmFuY3kt bWF0aC0zODcKIFRhcmdldCBSZWplY3ROZWdhdGl2ZSBSZXBvcnQgSW52ZXJz ZU1hc2soTk9fRkFOQ1lfTUFUSF8zODcsIFVTRV9GQU5DWV9NQVRIXzM4Nykg U2F2ZQogR2VuZXJhdGUgc2luLCBjb3MsIHNxcnQgZm9yIEZQVQogCittY29w eXJlbG9jcworVGFyZ2V0IFJlcG9ydCBWYXIoaXg4Nl9jb3B5cmVsb2NzKSBJ bml0KDApCitVc2UgY29weSByZWxvY2F0aW9ucyBmb3IgcGllIHdoZW4gcG9z c2libGUKKwogbWZvcmNlLWRyYXAKIFRhcmdldCBSZXBvcnQgVmFyKGl4ODZf Zm9yY2VfZHJhcCkKIEFsd2F5cyB1c2UgRHluYW1pYyBSZWFsaWduZWQgQXJn dW1lbnQgUG9pbnRlciAoRFJBUCkgdG8gcmVhbGlnbiBzdGFjawpJbmRleDog dGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9sZC1waWUtY29weXJlbG9jcy0x LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9sZC1waWUtY29weXJlbG9jcy0xLmMJKHJldmlzaW9uIDAp CisrKyB0ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2xkLXBpZS1jb3B5cmVs b2NzLTEuYwkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMyBAQAorLyogVGVz dCBpZiAtbWNvcHlyZWxvY3MgZG9lcyB0aGUgcmlnaHQgdGhpbmcuICovCisv KiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIg LWZwaWUgLW1jb3B5cmVsb2NzIiB9ICovCisKK2V4dGVybiBpbnQgZ2xvYl9h OworCitpbnQgZm9vICgpCit7CisgIHJldHVybiBnbG9iX2E7Cit9CisKKy8q IGdsb2JfYSBzaG91bGQgbmV2ZXIgYmUgYWNjZXNzZWQgd2l0aCBhIEdPVFBD UkVMICAqLyAKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci1ub3Qg Imdsb2JfYVxcQEdPVFBDUkVMIiB7IHRhcmdldCB7IHg4Nl82NC0qLSogfSB9 IH0gfSAqLwpJbmRleDogdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9sZC1w aWUtY29weXJlbG9jcy0yLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g dGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9sZC1waWUtY29weXJlbG9jcy0y LmMJKHJldmlzaW9uIDApCisrKyB0ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2 L2xkLXBpZS1jb3B5cmVsb2NzLTIuYwkocmV2aXNpb24gMCkKQEAgLTAsMCAr MSwxMyBAQAorLyogVGVzdCBpZiAtbW5vaS1jb3B5cmVsb2NzIGRvZXMgdGhl IHJpZ2h0IHRoaW5nLiAqLworLyogeyBkZy1kbyBjb21waWxlIH0gKi8KKy8q IHsgZGctb3B0aW9ucyAiLU8yIC1mcGllIC1tbm8tY29weXJlbG9jcyIgfSAq LworCitleHRlcm4gaW50IGdsb2JfYTsKKworaW50IGZvbyAoKQoreworICBy ZXR1cm4gZ2xvYl9hOworfQorCisvKiBnbG9iX2Egc2hvdWxkIGFsd2F5cyBi ZSBhY2Nlc3NlZCB2aWEgR09UICAqLyAKKy8qIHsgZGctZmluYWwgeyBzY2Fu LWFzc2VtYmxlciAiZ2xvYl9hXFxAR09UIiB7IHRhcmdldCB7IHg4Nl82NC0q LSogfSB9IH0gfSAqLwpJbmRleDogZG9jL2ludm9rZS50ZXhpCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KLS0tIGRvYy9pbnZva2UudGV4aQkocmV2aXNpb24g MjExODI2KQorKysgZG9jL2ludm9rZS50ZXhpCSh3b3JraW5nIGNvcHkpCkBA IC02ODgsNyArNjg4LDggQEAgT2JqZWN0aXZlLUMgYW5kIE9iamVjdGl2ZS1D KysgRGlhbGVjdHN9LgogLW0zMiAtbTY0IC1teDMyIC1tMTYgLW1sYXJnZS1k YXRhLXRocmVzaG9sZD1AdmFye251bX0gQGdvbAogLW1zc2UyYXZ4IC1tZmVu dHJ5IC1tOGJpdC1pZGl2IEBnb2wKIC1tYXZ4MjU2LXNwbGl0LXVuYWxpZ25l ZC1sb2FkIC1tYXZ4MjU2LXNwbGl0LXVuYWxpZ25lZC1zdG9yZSBAZ29sCi0t bXN0YWNrLXByb3RlY3Rvci1ndWFyZD1AdmFye2d1YXJkfX0KKy1tc3RhY2st cHJvdGVjdG9yLWd1YXJkPUB2YXJ7Z3VhcmR9IEBnb2wKKy1tY29weXJlbG9j c30KIAogQGVtcGh7aTM4NiBhbmQgeDg2LTY0IFdpbmRvd3MgT3B0aW9uc30K IEBnY2NvcHRsaXN0ey1tY29uc29sZSAtbWN5Z3dpbiAtbW5vLWN5Z3dpbiAt bWRsbCBAZ29sCkBAIC0xNTgwMiw2ICsxNTgwMywxNSBAQCBsb2NhdGlvbnMg YXJlIEBzYW1we2dsb2JhbH0gZm9yIGdsb2JhbCBjYW5hcnkgb3IgQAogY2Fu YXJ5IGluIHRoZSBUTFMgYmxvY2sgKHRoZSBkZWZhdWx0KS4gIFRoaXMgb3B0 aW9uIGhhcyBlZmZlY3Qgb25seSB3aGVuCiBAb3B0aW9uey1mc3RhY2stcHJv dGVjdG9yfSBvciBAb3B0aW9uey1mc3RhY2stcHJvdGVjdG9yLWFsbH0gaXMg c3BlY2lmaWVkLgogCitAaXRlbSAtbWNvcHlyZWxvY3MKK0BpdGVteCAtbW5v LWNvcHlyZWxvY3MKK0BvcGluZGV4IG1jb3B5cmVsb2NzCitAb3BpbmRleCBt bm8tY29weXJlbG9jcworV2l0aCBAb3B0aW9uey1mcGllfSBhbmQgQG9wdGlv bntmUElFfSwgY29weSByZWxvY2F0aW9ucyBzdXBwb3J0IGFsbG93cyB0aGUK K2NvbXBpbGVyIHRvIGFzc3VtZSB0aGF0IGFsbCBzeW1ib2wgcmVmZXJlbmNl cyBhcmUgbG9jYWwuICBUaGlzIGFsbG93cyB0aGUKK2NvbXBpbGVyIHRvIHNr aXAgdGhlIEdPVCBmb3IgZ2xvYmFsIGFjY2Vzc2VzIGFuZCB0aGlzIGFwcGxp ZXMgb25seSB0byB0aGUKK3g4Ni02NCBhcmNoaXRlY3R1cmUuCisKIEBlbmQg dGFibGUKIAogVGhlc2UgQHNhbXB7LW19IHN3aXRjaGVzIGFyZSBzdXBwb3J0 ZWQgaW4gYWRkaXRpb24gdG8gdGhlIGFib3ZlCg== --001a11337e4261536404fc4d8860--