From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x62b.google.com (mail-ej1-x62b.google.com [IPv6:2a00:1450:4864:20::62b]) by sourceware.org (Postfix) with ESMTPS id 333013858D1E for ; Wed, 1 Nov 2023 09:45:51 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 333013858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 333013858D1E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2a00:1450:4864:20::62b ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698831961; cv=none; b=o2gd0lEdG4U3+D36KoN2LuCawY+dl6ZLw2bVgaMS2442PAtHivOJBvzLE331cfdUAfYkPSGI4b/oyRufrbm5xKN9I7xtcLbHkj+DrvElHYUaqR6nR2cF5CngEsZoY8q1hVVkQ0Y1GQdqtFJxjBt0UGBDPvok0QUTFXFBtcnGxbY= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698831961; c=relaxed/simple; bh=cBzjQ9PlLnPo2oW1CMqF0qHuZTTlQP1Gdaw5u8BHpOg=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=vF09kmVM/Wvsyk9j0L7TQ5WkSdHYc7qz/fATqA9FTXL1oJVM36zY+e0qEnU5zB4obG3K7KoncivcijfceWuk6tap8odHtV6y8PN0Lm3aBwD3BNM47bX0rFSz+05ujBDuLS2hjr1ofja0Si/syOnf6vVWrb73UzzLFtuRgi5SiEU= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-ej1-x62b.google.com with SMTP id a640c23a62f3a-9be02fcf268so962497866b.3 for ; Wed, 01 Nov 2023 02:45:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1698831949; x=1699436749; darn=gcc.gnu.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=eSDi4/o6xbHAunr1lMltUuWoKUx0OQhVZOTk2OwrXnc=; b=SoinyinCqmM0uwPbp1UwJYo/JOR2XX59lNJ/aHufyqZJsUdomU4erKpw8Ql0CikWdJ WqdD35bxlbu9Ly4JNbhDhatONcxbRO4GQdtdcIJQt6qyJWGA8A9JaQhQSZ9eqYJ1GQr1 bxpD6UkOJZ22X6uoDaJBGgN8qR7Jc2r5g6kj3YI7TkMCTEjHsG2s0qJ1da82gVdniruO EG2k6sdGtGQE4YEBkDOHI7OK2rqqEkADs32YHA0Qs2lUGwMbjFQEGqLAIUt8bCg2xR/u 3lUFFb31naE5Vipl7NiormOBbFqEh6J4LKrVXAE/9ufrCg0eDgCL4Usa6d9UwWI34rCR gsnA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698831949; x=1699436749; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=eSDi4/o6xbHAunr1lMltUuWoKUx0OQhVZOTk2OwrXnc=; b=dG5SVJXB6a0DmElohTupYMZudp+DVEtKI9tJ9hooUAZhH3VlVY3nD8UHqO2x5C9NxE UdyDKBVp9/XndGWQC37BvzU6wNJb6yO3GG4xOMBbCn7gadypQj4qgWZJKsFzPoFdo+7b yRhjPKoVAd/fxNDlQbDKr2sOgW4uSz4ANssdjkeOWXTUkNqV+VPWCZEZvq3kmZqBUbDN ATtE6y6/BcK+pma+lba32MAMCUsJtI00k5dS7cLJYaMi8O5qNcG+4XMJJvHw0u/kfrdA 8s6kazRAsvejvi+mE1NK9uI2sWqr9mM/QE4pQ3hpN4g9RrmP/Dd/gpiA82JOUbvAE+dg 2hfg== X-Gm-Message-State: AOJu0YyTQit8fMeD8WB3ThKx4SqNxbJxYFw6k/cLWG2AsZvCZBNBJ8Kd GtTRqonn7GfRR0nUKJaT5GN4BOEa736aNcapIrJuCB1IKE+5TQ== X-Google-Smtp-Source: AGHT+IHmMa+2H6kWb7UsMdoaUGEds61jz2eMZRr8PZri4AKSz+3j3KkbKnLHj7qZyBnscUH7Z8voQskH4VapwUeFT+0= X-Received: by 2002:a17:907:934d:b0:9d3:ccd1:a911 with SMTP id bv13-20020a170907934d00b009d3ccd1a911mr1415961ejc.76.1698831948572; Wed, 01 Nov 2023 02:45:48 -0700 (PDT) MIME-Version: 1.0 From: Uros Bizjak Date: Wed, 1 Nov 2023 10:45:37 +0100 Message-ID: Subject: [PUSHED] i386: Improve stack protector patterns and peephole2s To: "gcc-patches@gcc.gnu.org" Content-Type: multipart/mixed; boundary="000000000000d406ad060914226a" X-Spam-Status: No, score=-8.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000d406ad060914226a Content-Type: text/plain; charset="UTF-8" Improve stack protector patterns and peephole2s to substitute stack protector scratch register clear with unrelated subsequent register initialization in several ways: a. Explicitly generate scratch register as named pseudo. This allows optimizers to eventually reuse the zero value in the register. b. Allow scratch register in different mode (SWI48) than PTR mode: d000: 65 48 8b 04 25 28 00 mov %gs:0x28,%rax d007: 00 00 d009: 48 89 44 24 08 mov %rax,0x8(%rsp) d00e: 8b 87 e0 01 00 00 mov 0x1e0(%rdi),%eax SImode moves on x86 zero-extend to the whole DImode register, so stack protector paranoia is not compromised. c. Relax peephole2 constraint that stack protector scratch register must match new initialized register. This relaxation substantially improves peephole2 opportunities, and generates sequences like: a310: 65 4c 8b 34 25 28 00 mov %gs:0x28,%r14 a317: 00 00 a319: 4c 89 74 24 08 mov %r14,0x8(%rsp) a31e: 4c 8b b7 98 00 00 00 mov 0x98(%rdi),%r14 We have to ensure the new scratch is dead in front of the sequence. The patch also fixes omission of earlyclobbers for all alternatives of new initialized register in *stack_protect_set_3, avoiding the need for reg_overlap_mentioned_p constraint. Earlyclobbers are per alternative, not per operand. Also, instructions are already valid in peephole2 pass, so we don't have to explicitly re-check their operands for validity. gcc/ChangeLog: * config/i386/i386.md (stack_protect_set): Explicitly generate scratch register in word mode. (@stack_protect_set_1_): Rename to ... (@stack_protect_set_1__): ... this. Use SWI48 mode iterator to match scratch register. (stack_protexct_set_1 peephole2): Use PTR, W and SWI48 mode iterators to match peephole sequence. Use general_operand predicate for operand 4. Allow different operand 2 and operand 3 registers and use peep2_reg_dead_p to ensure new scratch register is dead before peephole seqeunce. Use peep2_reg_dead_p to ensure old scratch register is dead after peephole sequence. (*stack_protect_set_2_): Rename to ... (*stack_protect_set_2__si): .. this. (*stack_protect_set_3): Rename to ... (*stack_protect_set_2__di): ... this. Use PTR mode iterator to match stack protector memory move. Use earlyclobber for all alternatives of operand 1. (stack_protexct_set_2 peephole2): Use PTR, W and SWI48 mode iterators to match peephole sequence. Use general_operand predicate for operand 4. Allow different operand 2 and operand 3 registers and use peep2_reg_dead_p to ensure new scratch register is dead before peephole seqeunce. Use peep2_reg_dead_p to ensure old scratch register is dead after peephole sequence. Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}. Uros. --000000000000d406ad060914226a Content-Type: text/plain; charset="US-ASCII"; name="p.diff.txt" Content-Disposition: attachment; filename="p.diff.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lofko4yn0 ZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9pMzg2Lm1kIGIvZ2NjL2NvbmZpZy9pMzg2L2kz ODYubWQKaW5kZXggNzVkZDRiNDA2MWYuLjM1ZDA3M2M5YTIxIDEwMDY0NAotLS0gYS9nY2MvY29u ZmlnL2kzODYvaTM4Ni5tZAorKysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5tZApAQCAtMjU2NTMs NDAgKzI1NjUzLDU4IEBAIChkZWZpbmVfZXhwYW5kICJzdGFja19wcm90ZWN0X3NldCIKICAgICht YXRjaF9vcGVyYW5kIDEgIm1lbW9yeV9vcGVyYW5kIildCiAgICIiCiB7CisgIHJ0eCBzY3JhdGNo ID0gZ2VuX3JlZ19ydHggKHdvcmRfbW9kZSk7CisKICAgZW1pdF9pbnNuIChnZW5fc3RhY2tfcHJv dGVjdF9zZXRfMQotCSAgICAgKHB0cl9tb2RlLCBvcGVyYW5kc1swXSwgb3BlcmFuZHNbMV0pKTsK KwkgICAgIChwdHJfbW9kZSwgd29yZF9tb2RlLCBvcGVyYW5kc1swXSwgb3BlcmFuZHNbMV0sIHNj cmF0Y2gpKTsKICAgRE9ORTsKIH0pCiAKLShkZWZpbmVfaW5zbiAiQHN0YWNrX3Byb3RlY3Rfc2V0 XzFfPG1vZGU+IgorKGRlZmluZV9pbnNuICJAc3RhY2tfcHJvdGVjdF9zZXRfMV88UFRSOm1vZGU+ XzxTV0k0ODptb2RlPiIKICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6UFRSIDAgIm1lbW9yeV9vcGVy YW5kIiAiPW0iKQogCSh1bnNwZWM6UFRSIFsobWF0Y2hfb3BlcmFuZDpQVFIgMSAibWVtb3J5X29w ZXJhbmQiICJtIildCiAJCSAgICBVTlNQRUNfU1BfU0VUKSkKLSAgIChzZXQgKG1hdGNoX3NjcmF0 Y2g6UFRSIDIgIj0mciIpIChjb25zdF9pbnQgMCkpCisgICAoc2V0IChtYXRjaF9vcGVyYW5kOlNX STQ4IDIgInJlZ2lzdGVyX29wZXJhbmQiICI9JnIiKSAoY29uc3RfaW50IDApKQogICAgKGNsb2Ji ZXIgKHJlZzpDQyBGTEFHU19SRUcpKV0KICAgIiIKIHsKLSAgb3V0cHV0X2FzbV9pbnNuICgibW92 ezxpbW9kZXN1ZmZpeD59XHR7JTEsICUyfCUyLCAlMX0iLCBvcGVyYW5kcyk7Ci0gIG91dHB1dF9h c21faW5zbiAoIm1vdns8aW1vZGVzdWZmaXg+fVx0eyUyLCAlMHwlMCwgJTJ9Iiwgb3BlcmFuZHMp OworICBvdXRwdXRfYXNtX2luc24gKCJtb3Z7PFBUUjppbW9kZXN1ZmZpeD59XHR7JTEsICU8UFRS Oms+MnwlPFBUUjprPjIsICUxfSIsCisJCSAgIG9wZXJhbmRzKTsKKyAgb3V0cHV0X2FzbV9pbnNu ICgibW92ezxQVFI6aW1vZGVzdWZmaXg+fVx0eyU8UFRSOms+MiwgJTB8JTAsICU8UFRSOms+Mn0i LAorCQkgICBvcGVyYW5kcyk7CiAgIHJldHVybiAieG9ye2x9XHQlazIsICVrMiI7CiB9CiAgIFso c2V0X2F0dHIgInR5cGUiICJtdWx0aSIpXSkKIAogOzsgUGF0dGVybnMgYW5kIHBlZXBob2xlMnMg dG8gb3B0aW1pemUgc3RhY2tfcHJvdGVjdF9zZXRfMV88bW9kZT4KLTs7IGltbWVkaWF0ZWx5IGZv bGxvd2VkIGJ5ICptb3Z7cyxkfWlfaW50ZXJuYWwgdG8gdGhlIHNhbWUgcmVnaXN0ZXIsCi07OyB3 aGVyZSB3ZSBjYW4gYXZvaWQgdGhlIHhvcntsfSBhYm92ZS4gIFdlIGRvbid0IHNwbGl0IHRoaXMs IHNvIHRoYXQKLTs7IHNjaGVkdWxpbmcgb3IgYW55dGhpbmcgZWxzZSBkb2Vzbid0IHNlcGFyYXRl IHRoZSAqc3RhY2tfcHJvdGVjdF9zZXQqCi07OyBwYXR0ZXJuIGZyb20gdGhlIHNldCBvZiB0aGUg cmVnaXN0ZXIgdGhhdCBvdmVyd3JpdGVzIHRoZSByZWdpc3RlcgotOzsgd2l0aCBhIG5ldyB2YWx1 ZS4KLShkZWZpbmVfaW5zbiAiKnN0YWNrX3Byb3RlY3Rfc2V0XzJfPG1vZGU+IgorOzsgaW1tZWRp YXRlbHkgZm9sbG93ZWQgYnkgKm1vdntzLGR9aV9pbnRlcm5hbCwgd2hlcmUgd2UgY2FuIGF2b2lk Cis7OyB0aGUgeG9ye2x9IGFib3ZlLiAgV2UgZG9uJ3Qgc3BsaXQgdGhpcywgc28gdGhhdCBzY2hl ZHVsaW5nIG9yCis7OyBhbnl0aGluZyBlbHNlIGRvZXNuJ3Qgc2VwYXJhdGUgdGhlICpzdGFja19w cm90ZWN0X3NldCogcGF0dGVybiBmcm9tCis7OyB0aGUgc2V0IG9mIHRoZSByZWdpc3RlciB0aGF0 IG92ZXJ3cml0ZXMgdGhlIHJlZ2lzdGVyIHdpdGggYSBuZXcgdmFsdWUuCisKKyhkZWZpbmVfcGVl cGhvbGUyCisgIFsocGFyYWxsZWwgWyhzZXQgKG1hdGNoX29wZXJhbmQ6UFRSIDAgIm1lbW9yeV9v cGVyYW5kIikKKwkJICAgKHVuc3BlYzpQVFIgWyhtYXRjaF9vcGVyYW5kOlBUUiAxICJtZW1vcnlf b3BlcmFuZCIpXQorCQkJICAgICAgIFVOU1BFQ19TUF9TRVQpKQorCSAgICAgIChzZXQgKG1hdGNo X29wZXJhbmQ6VyAyICJnZW5lcmFsX3JlZ19vcGVyYW5kIikgKGNvbnN0X2ludCAwKSkKKwkgICAg ICAoY2xvYmJlciAocmVnOkNDIEZMQUdTX1JFRykpXSkKKyAgIChwYXJhbGxlbCBbKHNldCAobWF0 Y2hfb3BlcmFuZDpTV0k0OCAzICJnZW5lcmFsX3JlZ19vcGVyYW5kIikKKwkJICAgKG1hdGNoX29w ZXJhbmQ6U1dJNDggNCAiY29uc3QwX29wZXJhbmQiKSkKKwkgICAgICAoY2xvYmJlciAocmVnOkND IEZMQUdTX1JFRykpXSldCisgICJwZWVwMl9yZWdfZGVhZF9wICgwLCBvcGVyYW5kc1szXSkKKyAg ICYmIHBlZXAyX3JlZ19kZWFkX3AgKDEsIG9wZXJhbmRzWzJdKSIKKyAgWyhwYXJhbGxlbCBbKHNl dCAobWF0Y2hfZHVwIDApCisJCSAgICh1bnNwZWM6UFRSIFsobWF0Y2hfZHVwIDEpXSBVTlNQRUNf U1BfU0VUKSkKKwkgICAgICAoc2V0IChtYXRjaF9kdXAgMykgKGNvbnN0X2ludCAwKSkKKwkgICAg ICAoY2xvYmJlciAocmVnOkNDIEZMQUdTX1JFRykpXSldKQorCisoZGVmaW5lX2luc24gIipzdGFj a19wcm90ZWN0X3NldF8yXzxtb2RlPl9zaSIKICAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6UFRSIDAg Im1lbW9yeV9vcGVyYW5kIiAiPW0iKQogCSh1bnNwZWM6UFRSIFsobWF0Y2hfb3BlcmFuZDpQVFIg MyAibWVtb3J5X29wZXJhbmQiICJtIildCiAJCSAgICBVTlNQRUNfU1BfU0VUKSkKICAgIChzZXQg KG1hdGNoX29wZXJhbmQ6U0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIj0mciIpCi0JKG1hdGNoX29w ZXJhbmQ6U0kgMiAiZ2VuZXJhbF9vcGVyYW5kIiAiZyIpKQotICAgKGNsb2JiZXIgKHJlZzpDQyBG TEFHU19SRUcpKV0KLSAgInJlbG9hZF9jb21wbGV0ZWQKLSAgICYmICFyZWdfb3ZlcmxhcF9tZW50 aW9uZWRfcCAob3BlcmFuZHNbMV0sIG9wZXJhbmRzWzJdKSIKKwkobWF0Y2hfb3BlcmFuZDpTSSAy ICJnZW5lcmFsX29wZXJhbmQiICJnIikpXQorICAicmVsb2FkX2NvbXBsZXRlZCIKIHsKICAgb3V0 cHV0X2FzbV9pbnNuICgibW92ezxpbW9kZXN1ZmZpeD59XHR7JTMsICU8az4xfCU8az4xLCAlM30i LCBvcGVyYW5kcyk7CiAgIG91dHB1dF9hc21faW5zbiAoIm1vdns8aW1vZGVzdWZmaXg+fVx0eyU8 az4xLCAlMHwlMCwgJTxrPjF9Iiwgb3BlcmFuZHMpOwpAQCAtMjU2OTksMzggKzI1NzE3LDE2IEBA IChkZWZpbmVfaW5zbiAiKnN0YWNrX3Byb3RlY3Rfc2V0XzJfPG1vZGU+IgogICBbKHNldF9hdHRy ICJ0eXBlIiAibXVsdGkiKQogICAgKHNldF9hdHRyICJsZW5ndGgiICIyNCIpXSkKIAotKGRlZmlu ZV9wZWVwaG9sZTIKLSBbKHBhcmFsbGVsIFsoc2V0IChtYXRjaF9vcGVyYW5kOlBUUiAwICJtZW1v cnlfb3BlcmFuZCIpCi0JCSAgKHVuc3BlYzpQVFIgWyhtYXRjaF9vcGVyYW5kOlBUUiAxICJtZW1v cnlfb3BlcmFuZCIpXQotCQkJICAgICAgVU5TUEVDX1NQX1NFVCkpCi0JICAgICAoc2V0IChtYXRj aF9vcGVyYW5kOlBUUiAyICJnZW5lcmFsX3JlZ19vcGVyYW5kIikgKGNvbnN0X2ludCAwKSkKLQkg ICAgIChjbG9iYmVyIChyZWc6Q0MgRkxBR1NfUkVHKSldKQotICAoc2V0IChtYXRjaF9vcGVyYW5k OlNJIDMgImdlbmVyYWxfcmVnX29wZXJhbmQiKQotICAgICAgIChtYXRjaF9vcGVyYW5kOlNJIDQp KV0KLSAiUkVHTk8gKG9wZXJhbmRzWzJdKSA9PSBSRUdOTyAob3BlcmFuZHNbM10pCi0gICYmIGdl bmVyYWxfb3BlcmFuZCAob3BlcmFuZHNbNF0sIFNJbW9kZSkKLSAgJiYgKGdlbmVyYWxfcmVnX29w ZXJhbmQgKG9wZXJhbmRzWzRdLCBTSW1vZGUpCi0gICAgICB8fCBtZW1vcnlfb3BlcmFuZCAob3Bl cmFuZHNbNF0sIFNJbW9kZSkKLSAgICAgIHx8IGltbWVkaWF0ZV9vcGVyYW5kIChvcGVyYW5kc1s0 XSwgU0ltb2RlKSkKLSAgJiYgIXJlZ19vdmVybGFwX21lbnRpb25lZF9wIChvcGVyYW5kc1szXSwg b3BlcmFuZHNbNF0pIgotIFsocGFyYWxsZWwgWyhzZXQgKG1hdGNoX2R1cCAwKQotCQkgICh1bnNw ZWM6UFRSIFsobWF0Y2hfZHVwIDEpXSBVTlNQRUNfU1BfU0VUKSkKLQkgICAgIChzZXQgKG1hdGNo X2R1cCAzKSAobWF0Y2hfZHVwIDQpKQotCSAgICAgKGNsb2JiZXIgKHJlZzpDQyBGTEFHU19SRUcp KV0pXSkKLQotKGRlZmluZV9pbnNuICIqc3RhY2tfcHJvdGVjdF9zZXRfMyIKLSAgWyhzZXQgKG1h dGNoX29wZXJhbmQ6REkgMCAibWVtb3J5X29wZXJhbmQiICI9bSxtLG0iKQotCSh1bnNwZWM6REkg WyhtYXRjaF9vcGVyYW5kOkRJIDMgIm1lbW9yeV9vcGVyYW5kIiAibSxtLG0iKV0KLQkJICAgVU5T UEVDX1NQX1NFVCkpCi0gICAoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDEgInJlZ2lzdGVyX29wZXJh bmQiICI9JnIscixyIikKLQkobWF0Y2hfb3BlcmFuZDpESSAyICJnZW5lcmFsX29wZXJhbmQiICJa LHJlbSxpIikpCi0gICAoY2xvYmJlciAocmVnOkNDIEZMQUdTX1JFRykpXQotICAiVEFSR0VUXzY0 QklUCi0gICAmJiByZWxvYWRfY29tcGxldGVkCi0gICAmJiAhcmVnX292ZXJsYXBfbWVudGlvbmVk X3AgKG9wZXJhbmRzWzFdLCBvcGVyYW5kc1syXSkiCisoZGVmaW5lX2luc24gIipzdGFja19wcm90 ZWN0X3NldF8yXzxtb2RlPl9kaSIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6UFRSIDAgIm1lbW9y eV9vcGVyYW5kIiAiPW0sbSxtIikKKwkodW5zcGVjOlBUUiBbKG1hdGNoX29wZXJhbmQ6UFRSIDMg Im1lbW9yeV9vcGVyYW5kIiAibSxtLG0iKV0KKwkJICAgIFVOU1BFQ19TUF9TRVQpKQorICAgKHNl dCAobWF0Y2hfb3BlcmFuZDpESSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAiPSZyLCZyLCZyIikKKwko bWF0Y2hfb3BlcmFuZDpESSAyICJnZW5lcmFsX29wZXJhbmQiICJaLHJlbSxpIikpXQorICAiVEFS R0VUXzY0QklUICYmIHJlbG9hZF9jb21wbGV0ZWQiCiB7Ci0gIG91dHB1dF9hc21faW5zbiAoIm1v dntxfVx0eyUzLCAlMXwlMSwgJTN9Iiwgb3BlcmFuZHMpOwotICBvdXRwdXRfYXNtX2luc24gKCJt b3Z7cX1cdHslMSwgJTB8JTAsICUxfSIsIG9wZXJhbmRzKTsKKyAgb3V0cHV0X2FzbV9pbnNuICgi bW92ezxpbW9kZXN1ZmZpeD59XHR7JTMsICU8az4xfCU8az4xLCAlM30iLCBvcGVyYW5kcyk7Cisg IG91dHB1dF9hc21faW5zbiAoIm1vdns8aW1vZGVzdWZmaXg+fVx0eyU8az4xLCAlMHwlMCwgJTxr PjF9Iiwgb3BlcmFuZHMpOwogICBpZiAocGljXzMyYml0X29wZXJhbmQgKG9wZXJhbmRzWzJdLCBE SW1vZGUpKQogICAgIHJldHVybiAibGVhe3F9XHR7JUUyLCAlMXwlMSwgJUUyfSI7CiAgIGVsc2Ug aWYgKHdoaWNoX2FsdGVybmF0aXZlID09IDApCkBAIC0yNTc0NiwyNSArMjU3NDIsMTggQEAgKGRl ZmluZV9pbnNuICIqc3RhY2tfcHJvdGVjdF9zZXRfMyIKICAgIChzZXRfYXR0ciAibGVuZ3RoIiAi MjQiKV0pCiAKIChkZWZpbmVfcGVlcGhvbGUyCi0gWyhwYXJhbGxlbCBbKHNldCAobWF0Y2hfb3Bl cmFuZDpESSAwICJtZW1vcnlfb3BlcmFuZCIpCi0JCSAgKHVuc3BlYzpESSBbKG1hdGNoX29wZXJh bmQ6REkgMSAibWVtb3J5X29wZXJhbmQiKV0KLQkJCSAgICAgVU5TUEVDX1NQX1NFVCkpCi0JICAg ICAoc2V0IChtYXRjaF9vcGVyYW5kOkRJIDIgImdlbmVyYWxfcmVnX29wZXJhbmQiKSAoY29uc3Rf aW50IDApKQotCSAgICAgKGNsb2JiZXIgKHJlZzpDQyBGTEFHU19SRUcpKV0pCi0gIChzZXQgKG1h dGNoX2R1cCAyKSAobWF0Y2hfb3BlcmFuZDpESSAzKSldCi0gIlRBUkdFVF82NEJJVAotICAmJiBn ZW5lcmFsX29wZXJhbmQgKG9wZXJhbmRzWzNdLCBESW1vZGUpCi0gICYmIChnZW5lcmFsX3JlZ19v cGVyYW5kIChvcGVyYW5kc1szXSwgREltb2RlKQotICAgICAgfHwgbWVtb3J5X29wZXJhbmQgKG9w ZXJhbmRzWzNdLCBESW1vZGUpCi0gICAgICB8fCB4ODZfNjRfemV4dF9pbW1lZGlhdGVfb3BlcmFu ZCAob3BlcmFuZHNbM10sIERJbW9kZSkKLSAgICAgIHx8IHg4Nl82NF9pbW1lZGlhdGVfb3BlcmFu ZCAob3BlcmFuZHNbM10sIERJbW9kZSkKLSAgICAgIHx8IChDT05TVEFOVF9QIChvcGVyYW5kc1sz XSkKLQkgICYmICghZmxhZ19waWMgfHwgTEVHSVRJTUFURV9QSUNfT1BFUkFORF9QIChvcGVyYW5k c1szXSkpKSkKLSAgJiYgIXJlZ19vdmVybGFwX21lbnRpb25lZF9wIChvcGVyYW5kc1syXSwgb3Bl cmFuZHNbM10pIgotIFsocGFyYWxsZWwgWyhzZXQgKG1hdGNoX2R1cCAwKQotCQkgICh1bnNwZWM6 UFRSIFsobWF0Y2hfZHVwIDEpXSBVTlNQRUNfU1BfU0VUKSkKLQkgICAgIChzZXQgKG1hdGNoX2R1 cCAyKSAobWF0Y2hfZHVwIDMpKQotCSAgICAgKGNsb2JiZXIgKHJlZzpDQyBGTEFHU19SRUcpKV0p XSkKKyAgWyhwYXJhbGxlbCBbKHNldCAobWF0Y2hfb3BlcmFuZDpQVFIgMCAibWVtb3J5X29wZXJh bmQiKQorCQkgICAodW5zcGVjOlBUUiBbKG1hdGNoX29wZXJhbmQ6UFRSIDEgIm1lbW9yeV9vcGVy YW5kIildCisJCQkgICAgICAgVU5TUEVDX1NQX1NFVCkpCisJICAgICAgKHNldCAobWF0Y2hfb3Bl cmFuZDpXIDIgImdlbmVyYWxfcmVnX29wZXJhbmQiKSAoY29uc3RfaW50IDApKQorCSAgICAgIChj bG9iYmVyIChyZWc6Q0MgRkxBR1NfUkVHKSldKQorICAgKHNldCAobWF0Y2hfb3BlcmFuZDpTV0k0 OCAzICJnZW5lcmFsX3JlZ19vcGVyYW5kIikKKwkobWF0Y2hfb3BlcmFuZDpTV0k0OCA0ICJnZW5l cmFsX29wZXJhbmQiKSldCisgICJwZWVwMl9yZWdfZGVhZF9wICgwLCBvcGVyYW5kc1szXSkKKyAg ICYmIHBlZXAyX3JlZ19kZWFkX3AgKDEsIG9wZXJhbmRzWzJdKSIKKyAgWyhwYXJhbGxlbCBbKHNl dCAobWF0Y2hfZHVwIDApCisJCSAgICh1bnNwZWM6UFRSIFsobWF0Y2hfZHVwIDEpXSBVTlNQRUNf U1BfU0VUKSkKKwkgICAgICAoc2V0IChtYXRjaF9kdXAgMykgKG1hdGNoX2R1cCA0KSldKV0pCiAK IChkZWZpbmVfZXhwYW5kICJzdGFja19wcm90ZWN0X3Rlc3QiCiAgIFsobWF0Y2hfb3BlcmFuZCAw ICJtZW1vcnlfb3BlcmFuZCIpCg== --000000000000d406ad060914226a--