From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32a.google.com (mail-wm1-x32a.google.com [IPv6:2a00:1450:4864:20::32a]) by sourceware.org (Postfix) with ESMTPS id 36CE43858D28 for ; Tue, 15 Mar 2022 13:52:35 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 36CE43858D28 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=embecosm.com Received: by mail-wm1-x32a.google.com with SMTP id v2-20020a7bcb42000000b0037b9d960079so1485900wmj.0 for ; Tue, 15 Mar 2022 06:52:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=mime-version:from:date:message-id:subject:to; bh=LDMdaSY2BBCgMqN+OzVbO1YLGx13d0T2gmeXlMV7ZVA=; b=Kkx3nuDOajjfXnnTcSJ0cIAfpbOOS39rG5q3vfhgimuKosjzR75Wdxm94vLLlVm0XT gQAYJmZxJGRkH03dM5cdplYyyDYwIVJqmAF34QxWNNVNWExbU1gZfqRHUxYfkgkiaUGQ KgvXyCjr3vMy344+HMeSg6M4nkS+NQ22bmqisdj3MHA1uRls9gD57BZVOcRzZIw2yHWt riqvVNXlglyYPJ1fAukGokN8qgLc7wGqwVJ7I1hKmI1f0aOouABRoioW8z0iFwuB8CHX Z3fvKf1swZOrYfrtkFB9kvN5vUUxvM3kX/C/tz7yPmuNkCS/Esuh4gQiJ2CtsTmo6tT/ osJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=LDMdaSY2BBCgMqN+OzVbO1YLGx13d0T2gmeXlMV7ZVA=; b=lR1n9cRPzWtHKuB8AJvjZa81HQxuX0ePWXavUbw6iO/BAw3NEsXE6DnEIIeRscffGO ddaabppKcvy/EUTBaVw1yHlPthRC9KBsjti1R3bhMqwlnF6kMbBe0YsYMY1RwrYE4Mbr BPQDMiQBg+HYVuQioFndqG2L/YODAmJHTWF1lRLPIKe+9BxVAyqeaE74SDahYQoxunya PFwyk6fPwEUWNtW9TEkFhoMRZVt5W+Mz4b+M9qhf2XKjuCrTq7EJ+kSsWj0CT8ls+3Yn Npnk73BP9jrtsJurR+74xmTPzg/SbxETGwtq3DwCB9UMwr2Jc8iFfJsZWNdyMxI1c8eI t6ng== X-Gm-Message-State: AOAM532CatpRnKSWCdw1Wmz4rtwbPPTbLxZUxLVbcMbfSBqP4I+gJG7b 9floEglvZSp/Gv+7Ufrs+a2F+5qP1b2R8gMH9eSIfICOfnTo2w== X-Google-Smtp-Source: ABdhPJzUDar8Vzoc499shBNQtv7eNIYOr+tE+7GlPN8MNG8s7H2YwzfVh32cUXNz/Dt0D5CEIAgWmIYRlLxOu8uVzl8= X-Received: by 2002:a1c:f009:0:b0:387:6fea:8ebc with SMTP id a9-20020a1cf009000000b003876fea8ebcmr3452489wmb.84.1647352352865; Tue, 15 Mar 2022 06:52:32 -0700 (PDT) MIME-Version: 1.0 From: Joern Rennecke Date: Tue, 15 Mar 2022 13:52:22 +0000 Message-ID: Subject: semi-finished patch: dead zero/sign extension elimination To: GCC Patches Content-Type: multipart/mixed; boundary="000000000000d0346805da421b6a" X-Spam-Status: No, score=-10.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 15 Mar 2022 13:52:38 -0000 --000000000000d0346805da421b6a Content-Type: text/plain; charset="UTF-8" This misses some documentation and testing, but it appears to work well with 64 bit RISC-V. -fext-dce is best used with aggressive unrolling and/or inlining. It deletes zero/sign extensiions where the part of the register that the zero/sign extension pertains to is dead. This is not about multi-word registers (although there might be some overlap on targets with somewhat narrow words), but mainly about parts of a register within a word. So, using BITS_LITTLE_ENDIAN nomenclature, we consider liveness of the lowest 8 bits, i.e. 0..7, the next more significant 8 bits, i.e. bits 8..15, then bits 16..31, and finally bits 32..BITS_PER_WORD-1 . -fext-dce-pre works better for less aggressive optimization, like a plain -O3. It inserts extensions for return values on edges leading to predecessors of the exit block where a highpart might be live, before performing the same dead extension elimination as -fext-dce . --000000000000d0346805da421b6a Content-Type: text/plain; charset="US-ASCII"; name="ext-dce-diff.txt" Content-Disposition: attachment; filename="ext-dce-diff.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l0s6m1zd0 ZGlmZiAtLWdpdCBhL2djYy9NYWtlZmlsZS5pbiBiL2djYy9NYWtlZmlsZS5pbgppbmRleCAzMWZm OTU1MDBjOS4uNmU3YWQ1ZmY5NjYgMTAwNjQ0Ci0tLSBhL2djYy9NYWtlZmlsZS5pbgorKysgYi9n Y2MvTWFrZWZpbGUuaW4KQEAgLTEzNzQsNiArMTM3NCw3IEBAIE9CSlMgPSBcCiAJZXhwbG93Lm8g XAogCWV4cG1lZC5vIFwKIAlleHByLm8gXAorCWV4dC1kY2UubyBcCiAJZmlib25hY2NpX2hlYXAu byBcCiAJZmlsZS1wcmVmaXgtbWFwLm8gXAogCWZpbmFsLm8gXApkaWZmIC0tZ2l0IGEvZ2NjL2Nv bW1vbi5vcHQgYi9nY2MvY29tbW9uLm9wdAppbmRleCA4YjY1MTNkZTQ3Yy4uODA4MzNiZWEyODUg MTAwNjQ0Ci0tLSBhL2djYy9jb21tb24ub3B0CisrKyBiL2djYy9jb21tb24ub3B0CkBAIC0zNjA3 LDQgKzM2MDcsMTIgQEAgZmlwYS1yYQogQ29tbW9uIFZhcihmbGFnX2lwYV9yYSkgT3B0aW1pemF0 aW9uCiBVc2UgY2FsbGVyIHNhdmUgcmVnaXN0ZXIgYWNyb3NzIGNhbGxzIGlmIHBvc3NpYmxlLgog CitmZXh0LWRjZQorQ29tbW9uIFZhcihmbGFnX2V4dF9kY2UsIDEpIE9wdGltaXphdGlvbiBJbml0 KDApCitQZXJmb3JtIGRlYWQgY29kZSBlbGltaW5hdGlvbiBvbiB6ZXJvIGFuZCBzaWduIGV4dGVu c2lvbnMgd2l0aCBzcGVjaWFsIGRhdGFmbG93IGFuYWx5c2lzLgorCitmZXh0LWRjZS1wcmUKK0Nv bW1vbiBWYXIoZmxhZ19leHRfZGNlLCAyKQorUGVyZm9ybSBkZWFkIGNvZGUgZWxpbWluYXRpb24g b24gemVybyBhbmQgc2lnbiBleHRlbnNpb25zIHdpdGggc3BlY2lhbCBkYXRhZmxvdyBhbmFseXNp cy4gIEluc2VydCBleHRlbnNpb25zIG9uIGVkZ2VzIGZvciBwYXJ0aWFsIHJlZHVuZGFuY3kgZWxp bWluYXRpb24uCisKIDsgVGhpcyBjb21tZW50IGlzIHRvIGVuc3VyZSB3ZSByZXRhaW4gdGhlIGJs YW5rIGxpbmUgYWJvdmUuCmRpZmYgLS1naXQgYS9nY2MvZGYtc2Nhbi5jYyBiL2djYy9kZi1zY2Fu LmNjCmluZGV4IDliMjM3NWQ1NjFiLi41OWIwYTgyZGNjOSAxMDA2NDQKLS0tIGEvZ2NjL2RmLXNj YW4uY2MKKysrIGIvZ2NjL2RmLXNjYW4uY2MKQEAgLTc4LDcgKzc4LDYgQEAgc3RhdGljIHZvaWQg ZGZfZ2V0X2VoX2Jsb2NrX2FydGlmaWNpYWxfdXNlcyAoYml0bWFwKTsKIAogc3RhdGljIHZvaWQg ZGZfcmVjb3JkX2VudHJ5X2Jsb2NrX2RlZnMgKGJpdG1hcCk7CiBzdGF0aWMgdm9pZCBkZl9yZWNv cmRfZXhpdF9ibG9ja191c2VzIChiaXRtYXApOwotc3RhdGljIHZvaWQgZGZfZ2V0X2V4aXRfYmxv Y2tfdXNlX3NldCAoYml0bWFwKTsKIHN0YXRpYyB2b2lkIGRmX2dldF9lbnRyeV9ibG9ja19kZWZf c2V0IChiaXRtYXApOwogc3RhdGljIHZvaWQgZGZfZ3Jvd19yZWZfaW5mbyAoc3RydWN0IGRmX3Jl Zl9pbmZvICosIHVuc2lnbmVkIGludCk7CiBzdGF0aWMgdm9pZCBkZl9yZWZfY2hhaW5fZGVsZXRl X2R1X2NoYWluIChkZl9yZWYpOwpAQCAtMzYzOCw3ICszNjM3LDcgQEAgZGZfZXBpbG9ndWVfdXNl c19wICh1bnNpZ25lZCBpbnQgcmVnbm8pCiAKIC8qIFNldCB0aGUgYml0IGZvciByZWdzIHRoYXQg YXJlIGNvbnNpZGVyZWQgYmVpbmcgdXNlZCBhdCB0aGUgZXhpdC4gKi8KIAotc3RhdGljIHZvaWQK K3ZvaWQKIGRmX2dldF9leGl0X2Jsb2NrX3VzZV9zZXQgKGJpdG1hcCBleGl0X2Jsb2NrX3VzZXMp CiB7CiAgIHVuc2lnbmVkIGludCBpOwpkaWZmIC0tZ2l0IGEvZ2NjL2RmLmggYi9nY2MvZGYuaApp bmRleCBiZDMyOTIwNWQwOC4uOTgwN2EzZTg3ZjkgMTAwNjQ0Ci0tLSBhL2djYy9kZi5oCisrKyBi L2djYy9kZi5oCkBAIC0xMDkwLDYgKzEwOTAsNyBAQCBleHRlcm4gYm9vbCBkZl9lcGlsb2d1ZV91 c2VzX3AgKHVuc2lnbmVkIGludCk7CiBleHRlcm4gdm9pZCBkZl9zZXRfcmVnc19ldmVyX2xpdmUg KHVuc2lnbmVkIGludCwgYm9vbCk7CiBleHRlcm4gdm9pZCBkZl9jb21wdXRlX3JlZ3NfZXZlcl9s aXZlIChib29sKTsKIGV4dGVybiB2b2lkIGRmX3NjYW5fdmVyaWZ5ICh2b2lkKTsKK2V4dGVybiB2 b2lkIGRmX2dldF9leGl0X2Jsb2NrX3VzZV9zZXQgKGJpdG1hcCk7CiAKIAwKIC8qLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZ2NjL2V4dC1kY2UuY2MgYi9nY2MvZXh0LWRjZS5jYwpu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uOWQyNjQ5NzJjN2YKLS0tIC9k ZXYvbnVsbAorKysgYi9nY2MvZXh0LWRjZS5jYwpAQCAtMCwwICsxLDU0NSBAQAorLyogUlRMIGRl YWQgemVyby9zaWduIGV4dGVuc2lvbiAoY29kZSkgZWxpbWluYXRpb24uCisgICBDb3B5cmlnaHQg KEMpIDIwMDAtMjAyMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworVGhpcyBmaWxl IGlzIHBhcnQgb2YgR0NDLgorCitHQ0MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgordGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZv dW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy Cit2ZXJzaW9uLgorCitHQ0MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs IGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCitXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp bXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCitmb3Ig bW9yZSBkZXRhaWxzLgorCitZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorYWxvbmcgd2l0aCBHQ0M7IHNlZSB0aGUgZmlsZSBD T1BZSU5HMy4gIElmIG5vdCBzZWUKKzxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICov CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJzeXN0ZW0uaCIKKyNpbmNsdWRlICJj b3JldHlwZXMuaCIKKyNpbmNsdWRlICJiYWNrZW5kLmgiCisjaW5jbHVkZSAicnRsLmgiCisjaW5j bHVkZSAidHJlZS5oIgorI2luY2x1ZGUgIm1lbW1vZGVsLmgiCisjaW5jbHVkZSAiaW5zbi1jb25m aWcuaCIKKyNpbmNsdWRlICJlbWl0LXJ0bC5oIgorI2luY2x1ZGUgInJlY29nLmgiCisjaW5jbHVk ZSAiY2ZnYW5hbC5oIgorI2luY2x1ZGUgInRyZWUtcGFzcy5oIgorI2luY2x1ZGUgImNmZ3J0bC5o IgorI2luY2x1ZGUgInJ0bC1pdGVyLmgiCisjaW5jbHVkZSAiZGYuaCIKKworLyogV2UgY29uc2lk ZXIgZm91ciBiaXQgZ3JvdXBzIGZvciBsaXZlbmVzczoKKyAgIGJpdCAwLi43ICAgKGxlYXN0IHNp Z25pZmljYW50IGJ5dGUpCisgICBiaXQgOC4uMTUgIChzZWNvbmQgbGVhc3Qgc2lnbmlmaWNhbnQg Ynl0ZSkKKyAgIGJpdCAxNi4uMzEKKyAgIGJpdCAzMi4uQklUU19QRVJfV09SRC0xICAqLworCiti aXRtYXAKK2V4dF9kY2VfcHJvY2Vzc19iYiAoYmFzaWNfYmxvY2sgYmIsIGJpdG1hcCBsaXZlbm93 LCBib29sIG1vZGlmeSkKK3sKKyAgcnR4X2luc24gKmluc247CisKKyAgRk9SX0JCX0lOU05TX1JF VkVSU0UgKGJiLCBpbnNuKQorICAgIHsKKyAgICAgIHN1YnJ0eF9pdGVyYXRvcjo6YXJyYXlfdHlw ZSBhcnJheTsKKworICAgICAgaWYgKCFJTlNOX1AgKGluc24pKQorCWNvbnRpbnVlOworCisgICAg ICBiaXRtYXAgbGl2ZV90bXAgPSBCSVRNQVBfQUxMT0MgKE5VTEwpOworICAgICAgaW50IHNlZW5f ZnVzYWdlID0gMDsKKworICAgICAgLyogRmlyc3QsIHByb2Nlc3MgdGhlIHNldHMuICAqLworICAg ICAgZm9yIChydHggcGF0ID0gUEFUVEVSTiAoaW5zbik7OykKKwl7CisJICBGT1JfRUFDSF9TVUJS VFggKGl0ZXIsIGFycmF5LCBwYXQsIE5PTkNPTlNUKQorCSAgICB7CisJICAgICAgY29uc3RfcnR4 IHggPSAqaXRlcjsKKwkgICAgICAvKiBBbiBFWFBSX0xJU1QgKGZyb20gY2FsbCBmdXNhZ2UpIGVu ZHMgaW4gTlVMTF9SVFguICAqLworCSAgICAgIGlmICh4ID09IE5VTExfUlRYKQorCQljb250aW51 ZTsKKwkgICAgICBpZiAoR0VUX0NPREUgKHgpID09IFNFVCB8fCBHRVRfQ09ERSAoeCkgPT0gQ0xP QkJFUikKKwkJeworCQkgIHVuc2lnbmVkIGJpdCA9IDA7CisJCSAgeCA9IFNFVF9ERVNUICh4KTsK KwkJICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIG1hc2sgPSBHRVRfTU9ERV9NQVNLIChHRVRfTU9E RSAoeCkpOworCQkgIGlmIChHRVRfQ09ERSAoeCkgPT0gU1VCUkVHKQorCQkgICAgeworCQkgICAg ICBiaXQgPSBTVUJSRUdfQllURSAoeCkudG9fY29uc3RhbnQgKCkgKiBCSVRTX1BFUl9VTklUOwor CQkgICAgICBpZiAoV09SRFNfQklHX0VORElBTikKKwkJCWJpdCA9IChHRVRfTU9ERV9CSVRTSVpF IChHRVRfTU9ERSAoeCkpLnRvX2NvbnN0YW50ICgpCisJCQkgICAgICAgLSBCSVRTX1BFUl9XT1JE IC0gYml0KTsKKwkJICAgICAgbWFzayA9IEdFVF9NT0RFX01BU0sgKEdFVF9NT0RFIChTVUJSRUdf UkVHICh4KSkpIDw8IGJpdDsKKwkJICAgICAgaWYgKCFtYXNrKQorCQkJbWFzayA9IC0weDEwMDAw MDAwMFVMTDsKKwkJICAgICAgeCA9IFNVQlJFR19SRUcgKHgpOworCQkgICAgfQorCQkgIGVsc2Ug aWYgKEdFVF9DT0RFICh4KSA9PSBTVFJJQ1RfTE9XX1BBUlQpCisJCSAgICB7CisJCSAgICAgIHgg PSBYRVhQICh4LCAwKTsKKwkJICAgIH0KKwkJICBlbHNlIGlmIChHRVRfQ09ERSAoeCkgPT0gWkVS T19FWFRSQUNUKQorCQkgICAgeworCQkgICAgICAgLyogSWYgd2UgYXJlIG5vdCBzdXJlIHdoYXQg aXMgYmVpbmcgb3ZlcndyaXR0ZW4sCisJCQkgIGFzc3VtZSBub3RoaW5nIGlzLiAgKi8KKwkJICAg ICAgaWYgKCFDT05TVF9JTlRfUCAoWEVYUCAoeCwgMSkpCisJCQkgIHx8ICFDT05TVF9JTlRfUCAo WEVYUCAoeCwgMikpKQorCQkJY29udGludWU7CisJCSAgICAgIG1hc2sgPSAoMVVMTCA8PCBJTlRW QUwgKFhFWFAgKHgsIDEpKSkgLSAxOworCQkgICAgICBiaXQgPSBJTlRWQUwgKFhFWFAgKHgsIDIp KTsKKwkJICAgICAgaWYgKEJJVFNfQklHX0VORElBTikKKwkJCWJpdCA9IChHRVRfTU9ERV9CSVRT SVpFIChHRVRfTU9ERSAoeCkpCisJCQkgICAgICAgLSBJTlRWQUwgKFhFWFAgKHgsIDEpKSAtIGJp dCkudG9fY29uc3RhbnQgKCk7CisJCSAgICAgIHggPSBYRVhQICh4LCAwKTsKKwkJICAgIH0KKwkJ ICBpZiAoUkVHX1AgKHgpKQorCQkgICAgeworCQkgICAgICBIT1NUX1dJREVfSU5UIHJuID0gUkVH Tk8gKHgpOworCQkgICAgICBmb3IgKEhPU1RfV0lERV9JTlQgaSA9IDQgKiBybjsgaSA8IDQgKiBy biArIDQ7IGkrKykKKwkJCWlmIChiaXRtYXBfYml0X3AgKGxpdmVub3csIGkpKQorCQkJICBiaXRt YXBfc2V0X2JpdCAobGl2ZV90bXAsIGkpOworCQkgICAgICBpbnQgc3RhcnQgPSAoYml0ID09IDAg PyAwIDogYml0ID09IDggPyAxCisJCQkJICAgOiBiaXQgPT0gMTYgPyAyIDogMyk7CisJCSAgICAg IGludCBlbmQgPSAoKG1hc2sgJiB+MHhmZmZmZmZmZlVMTCkgPyA0CisJCQkJIDogKG1hc2sgJiAw eGZmZmYwMDAwVUxMKSA/IDMKKwkJCQkgOiAobWFzayAmIDB4ZmYwMCkgPyAyIDogMSk7CisJCSAg ICAgIGJpdG1hcF9jbGVhcl9yYW5nZSAobGl2ZW5vdywgNCAqIHJuICsgc3RhcnQsIGVuZCAtIHN0 YXJ0KTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICBnY2NfYXNzZXJ0IChNRU1fUCAoeCkgfHwg eCA9PSBwY19ydHgKKwkJCQl8fCBHRVRfQ09ERSAoeCkgPT0gU0NSQVRDSCk7CisJCSAgaXRlci5z a2lwX3N1YnJ0eGVzICgpOworCQl9CisJICAgICAgZWxzZSBpZiAoR0VUX0NPREUgKHgpID09IENP TkRfRVhFQykKKwkJeworCQkgIGl0ZXIuc2tpcF9zdWJydHhlcyAoKTsKKwkJfQorCSAgICB9CisJ ICBpZiAoR0VUX0NPREUgKGluc24pICE9IENBTExfSU5TTiB8fCBzZWVuX2Z1c2FnZSA+IDApCisJ ICAgIGJyZWFrOworCSAgcGF0ID0gQ0FMTF9JTlNOX0ZVTkNUSU9OX1VTQUdFIChpbnNuKTsKKwkg IHNlZW5fZnVzYWdlKys7CisJfQorICAgICAgLyogTm93LCBwcm9jZXNzIHRoZSB1c2VzLiAgKi8K KyAgICAgIGlmIChKVU1QX1AgKGluc24pICYmIGZpbmRfcmVnX25vdGUgKGluc24sIFJFR19OT05f TE9DQUxfR09UTywgTlVMTF9SVFgpKQorCXsKKwkgIC8qIFRoZSBmcmFtZSBwdHIgaXMgdXNlZCBi eSBhIG5vbi1sb2NhbCBnb3RvLiAgKi8KKwkgIGJpdG1hcF9zZXRfcmFuZ2UgKGxpdmVub3csIEZS QU1FX1BPSU5URVJfUkVHTlVNICogNCwgNCk7CisJICBpZiAoIUhBUkRfRlJBTUVfUE9JTlRFUl9J U19GUkFNRV9QT0lOVEVSKQorCSAgICBiaXRtYXBfc2V0X3JhbmdlIChsaXZlbm93LCBIQVJEX0ZS QU1FX1BPSU5URVJfUkVHTlVNICogNCwgNCk7CisJfQorCisgICAgICBmb3IgKHJ0eCBwYXQgPSBQ QVRURVJOIChpbnNuKTs7KQorCXsKKwkgIHN1YnJ0eF92YXJfaXRlcmF0b3I6OmFycmF5X3R5cGUg YXJyYXlfdmFyOworCSAgRk9SX0VBQ0hfU1VCUlRYX1ZBUiAoaXRlciwgYXJyYXlfdmFyLCBwYXQs IE5PTkNPTlNUKQorCSAgICB7CisJICAgICAgcnR4IHggPSAqaXRlcjsKKwkgICAgICAvKiBBbiBF WFBSX0xJU1QgKGZyb20gY2FsbCBmdXNhZ2UpIGVuZHMgaW4gTlVMTF9SVFguICAqLworCSAgICAg IGlmICh4ID09IE5VTExfUlRYKQorCQljb250aW51ZTsKKwkgICAgICBlbnVtIHJ0eF9jb2RlIHhj b2RlID0gR0VUX0NPREUgKHgpOworCisJICAgICAgaWYgKEdFVF9DT0RFICh4KSA9PSBTRVQpCisJ CXsKKwkJICBjb25zdF9ydHggZHN0ID0gU0VUX0RFU1QgKHgpOworCQkgIHJ0eCBzcmMgPSBTRVRf U1JDICh4KTsKKwkJICBjb25zdF9ydHggeTsKKwkJICB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGJp dCA9IDA7CisJCSAgZW51bSBydHhfY29kZSBjb2RlID0gR0VUX0NPREUgKHNyYyk7CisJCSAgaWYg KEdFVF9DT0RFIChkc3QpID09IFNVQlJFRykKKwkJICAgIHsKKwkJICAgICAgYml0ID0gU1VCUkVH X0JZVEUgKGRzdCkudG9fY29uc3RhbnQgKCkgKiBCSVRTX1BFUl9VTklUOworCQkgICAgICBpZiAo V09SRFNfQklHX0VORElBTikKKwkJCWJpdCA9IChHRVRfTU9ERV9CSVRTSVpFIChHRVRfTU9ERSAo ZHN0KSkudG9fY29uc3RhbnQgKCkKKwkJCSAgICAgICAtIEJJVFNfUEVSX1dPUkQgLSBiaXQpOwor CQkgICAgICBpZiAoYml0ID49IEhPU1RfQklUU19QRVJfV0lERV9JTlQpCisJCQliaXQgPSBIT1NU X0JJVFNfUEVSX1dJREVfSU5UIC0gMTsKKwkJICAgICAgZHN0ID0gU1VCUkVHX1JFRyAoZHN0KTsK KwkJICAgIH0KKwkJICBlbHNlIGlmIChHRVRfQ09ERSAoZHN0KSA9PSBaRVJPX0VYVFJBQ1QKKwkJ CSAgIHx8IEdFVF9DT0RFIChkc3QpID09IFNUUklDVF9MT1dfUEFSVCkKKwkJICAgIGRzdCA9IFhF WFAgKGRzdCwgMCk7CisJCSAgaWYgKFJFR19QIChkc3QpCisJCSAgICAgICYmIChjb2RlID09IFBM VVMgfHwgY29kZSA9PSBNSU5VUyB8fCBjb2RlID09IE1VTFQKKwkJCSAgfHwgY29kZSA9PSBBU0hJ RlQKKwkJCSAgfHwgY29kZSA9PSBaRVJPX0VYVEVORCB8fCBjb2RlID09IFNJR05fRVhURU5ECisJ CQkgIHx8IGNvZGUgPT0gQU5EIHx8IGNvZGUgPT0gSU9SIHx8IGNvZGUgPT0gWE9SCisJCQkgIHx8 IGNvZGUgPT0gUkVHCisJCQkgIHx8IChjb2RlID09IFNVQlJFRyAmJiBSRUdfUCAoU1VCUkVHX1JF RyAoc3JjKSkpKSkKKwkJICAgIHsKKwkJICAgICAgdW5zaWduZWQgSE9TVF9XSURFX0lOVCBtYXNr X2FycmF5W10KKwkJCT0geyAweGZmLCAweGZmMDAsIDB4ZmZmZjAwMDBVTEwsIC0weDEwMDAwMDAw MFVMTCB9OworCQkgICAgICBIT1NUX1dJREVfSU5UIG1hc2sgPSAwOworCQkgICAgICBIT1NUX1dJ REVfSU5UIHJuID0gUkVHTk8gKGRzdCk7CisJCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsg aSsrKQorCQkJaWYgKGJpdG1hcF9iaXRfcCAobGl2ZV90bXAsIDQgKiBybiArIGkpKQorCQkJICBt YXNrIHw9IG1hc2tfYXJyYXlbaV07CisJCSAgICAgIG1hc2sgPj49IGJpdDsKKworCQkgICAgICAv KiA/Pz8gQ291bGQgYWxzbyBoYW5kbGUgWkVST19FWFRSQUNUIC8gU0lHTl9FWFRSQUNUCisJCQkg b2YgdGhlIHNvdXJjZSBzcGVjaWFsbHkgdG8gaW1wcm92ZSBvcHRpbWl6YXRpb24uICAqLworCisJ CSAgICAgIGlmIChjb2RlID09IFNJR05fRVhURU5EIHx8IGNvZGUgPT0gWkVST19FWFRFTkQpCisJ CQl7CisJCQkgIHJ0eCBpbm5lciA9IFhFWFAgKHNyYywgMCk7CisJCQkgIEhPU1RfV0lERV9JTlQg bWFzazIKKwkJCSAgICA9IEdFVF9NT0RFX01BU0sgKEdFVF9NT0RFIChpbm5lcikpOworCisJCQkg IC8qIERlbGV0ZSBkZWFkIHNpZ24gLyB6ZXJvIGV4dGVuc2lvbnMuICAqLworICAgICAgaWYgKDAg JiYgbW9kaWZ5KQoreworZGVidWdfcnR4KGluc24pOworZGVidWdfYml0bWFwICAgICAobGl2ZV90 bXApOworCWZwcmludGYgKHN0ZGVyciwgIm0gIiBIT1NUX1dJREVfSU5UX1BSSU5UX0hFWCAiIG0y ICIgSE9TVF9XSURFX0lOVF9QUklOVF9IRVggIlxuIiwgbWFzaywgbWFzazIpOworfQorCQkJICBp ZiAobW9kaWZ5ICYmIChtYXNrICYgfm1hc2syKSA9PSAwKQorCQkJICAgIHZhbGlkYXRlX2NoYW5n ZQorCQkJICAgICAgKGluc24sICZTRVRfU1JDICh4KSwKKwkJCSAgICAgICBzaW1wbGlmeV9nZW5f c3VicmVnCisJCQkJIChHRVRfTU9ERSAoc3JjKSwgaW5uZXIsIEdFVF9NT0RFIChpbm5lciksIDAp LAorCQkJICAgICAgIGZhbHNlKTsKKworCQkJICBtYXNrICY9IG1hc2syOworCQkJICBzcmMgPSBY RVhQIChzcmMsIDApOworCQkJICBjb2RlID0gR0VUX0NPREUgKHNyYyk7CisJCQl9CisJCSAgICAg IGlmIChjb2RlID09IFBMVVMgfHwgY29kZSA9PSBNSU5VUyB8fCBjb2RlID09IE1VTFQKKwkJCSAg fHwgY29kZSA9PSBBU0hJRlQpCisJCQltYXNrID0gbWFzayA/ICgoMlVMTCA8PCBmbG9vcl9sb2cy IChtYXNrKSkgLSAxKSA6IDA7CisJCSAgICAgIGlmIChCSU5BUllfUCAoc3JjKSkKKwkJCXkgPSBY RVhQIChzcmMsIDApOworCQkgICAgICBlbHNlCisJCQl5ID0gc3JjOworCQkgICAgICBmb3IgKDs7 KQorCQkJeworCQkJICBpZiAoR0VUX0NPREUgKHkpID09IFNVQlJFRykKKwkJCSAgICB7CisJCQkg ICAgICBiaXQgPSAoU1VCUkVHX0JZVEUgKHkpLnRvX2NvbnN0YW50ICgpCisJCQkJICAgICAqIEJJ VFNfUEVSX1VOSVQpOworCQkJICAgICAgaWYgKFdPUkRTX0JJR19FTkRJQU4pCisJCQkJYml0ID0g KEdFVF9NT0RFX0JJVFNJWkUKKwkJCQkJKEdFVF9NT0RFICh5KSkudG9fY29uc3RhbnQgKCkKKwkJ CQkJIC0gQklUU19QRVJfV09SRCAtIGJpdCk7CisJCQkgICAgICBpZiAobWFzaykKKwkJCQl7CisJ CQkJICBtYXNrIDw8PSBiaXQ7CisJCQkJICBpZiAoIW1hc2spCisJCQkJICAgIG1hc2sgPSAtMHgx MDAwMDAwMDBVTEw7CisJCQkJfQorCQkJICAgICAgeSA9IFNVQlJFR19SRUcgKHkpOworCQkJICAg IH0KKwkJCSAgaWYgKFJFR19QICh5KSkKKwkJCSAgICB7CisJCQkgICAgICBybiA9IDQgKiBSRUdO TyAoeSk7CisJCQkgICAgICBpZiAobWFzayAmIDB4ZmYpCisJCQkJYml0bWFwX3NldF9iaXQgKGxp dmVub3csIHJuKTsKKwkJCSAgICAgIGlmIChtYXNrICYgMHhmZjAwKQorCQkJCWJpdG1hcF9zZXRf Yml0IChsaXZlbm93LCBybisxKTsKKwkJCSAgICAgIGlmIChtYXNrICYgMHhmZmZmMDAwMFVMTCkK KwkJCQliaXRtYXBfc2V0X2JpdCAobGl2ZW5vdywgcm4rMik7CisJCQkgICAgICBpZiAobWFzayAm IC0weDEwMDAwMDAwMFVMTCkKKwkJCQliaXRtYXBfc2V0X2JpdCAobGl2ZW5vdywgcm4rMyk7CisJ CQkgICAgfQorCQkJICBlbHNlIGlmICghQ09OU1RBTlRfUCAoeSkpCisJCQkgICAgYnJlYWs7CisJ CQkgIGlmICghQklOQVJZX1AgKHNyYykpCisJCQkgICAgYnJlYWs7CisJCQkgIHkgPSBYRVhQIChz cmMsIDEpLCBzcmMgPSBwY19ydHg7CisJCQl9CisJCSAgICAgIGlmIChSRUdfUCAoeSkgfHwgQ09O U1RBTlRfUCAoeSkpCisJCQlpdGVyLnNraXBfc3VicnR4ZXMgKCk7CisJCSAgICB9CisJCSAgZWxz ZSBpZiAoUkVHX1AgKGRzdCkpCisJCSAgICBpdGVyLnN1YnN0aXR1dGUgKHNyYyk7CisJCX0KKwkg ICAgICBlbHNlIGlmICh4Y29kZSA9PSBTVUJSRUcKKwkJICAgICAgICYmIEdFVF9NT0RFX0JJVFNJ WkUgKEdFVF9NT0RFICAoeCkpLnRvX2NvbnN0YW50ICgpIDw9IDMyCisJCSAgICAgICAmJiBTVUJS RUdfQllURSAoeCkudG9fY29uc3RhbnQgKCkgPT0gMAorCQkgICAgICAgJiYgUkVHX1AgKFNVQlJF R19SRUcgKHgpKSkKKwkJeworCQkgIEhPU1RfV0lERV9JTlQgc2l6ZQorCQkgICAgPSBHRVRfTU9E RV9CSVRTSVpFIChHRVRfTU9ERSAgKHgpKS50b19jb25zdGFudCAoKTsKKwkJICBIT1NUX1dJREVf SU5UIHJuID0gNCAqIFJFR05PIChTVUJSRUdfUkVHICh4KSk7CisJCSAgYml0bWFwX3NldF9iaXQg KGxpdmVub3csIHJuKTsKKwkJICBpZiAoc2l6ZSA+IDgpCisJCSAgICBiaXRtYXBfc2V0X2JpdCAo bGl2ZW5vdywgcm4rMSk7CisJCSAgaWYgKHNpemUgPiAxNikKKwkJICAgIGJpdG1hcF9zZXRfYml0 IChsaXZlbm93LCBybisyKTsKKwkJICBpdGVyLnNraXBfc3VicnR4ZXMgKCk7CisJCX0KKwkgICAg ICBlbHNlIGlmIChSRUdfUCAoeCkpCisJCWJpdG1hcF9zZXRfcmFuZ2UgKGxpdmVub3csIFJFR05P ICh4KSAqIDQsIDQpOworCSAgICAgIGVsc2UgaWYgKEdFVF9DT0RFICh4KSA9PSBDTE9CQkVSKQor CQljb250aW51ZTsKKwkgICAgfQorCSAgaWYgKEdFVF9DT0RFIChpbnNuKSAhPSBDQUxMX0lOU04g fHwgc2Vlbl9mdXNhZ2UgPiAxKQorCSAgICBicmVhazsKKwkgIHBhdCA9IENBTExfSU5TTl9GVU5D VElPTl9VU0FHRSAoaW5zbik7CisJICBzZWVuX2Z1c2FnZSsrOworCSAgaWYgKCFGQUtFX0NBTExf UCAoaW5zbikpCisJICAgIGJpdG1hcF9zZXRfcmFuZ2UgKGxpdmVub3csIFNUQUNLX1BPSU5URVJf UkVHTlVNICogNCwgNCk7CisJICAvKiBVbmxlc3MgdGhpcyBpcyBhIGNhbGwgdG8gYSBjb25zdCBm dW5jdGlvbiwgaXQgY2FuIHJlYWQgYW55CisJICAgICBnbG9iYWwgcmVnaXN0ZXIuICAqLworCSAg aWYgKFJUTF9DT05TVF9DQUxMX1AgKGluc24pKQorCSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBp IDwgRklSU1RfUFNFVURPX1JFR0lTVEVSOyBpKyspCisJICAgICAgaWYgKGdsb2JhbF9yZWdzW2ld KQorCQliaXRtYXBfc2V0X3JhbmdlIChsaXZlbm93LCBpICogNCwgNCk7CisJfQorICAgICAgLy9C SVRNQVBfRlJFRSAobGl2ZV90bXApOworICAgIH0KKyAgcmV0dXJuIGxpdmVub3c7Cit9CisKK3Zv aWQKK2V4dF9kY2UgKHZvaWQpCit7CisgIC8qIFByb3BlciBQUkUgaXMgaGFyZCwgc28gZm9yIG5v dyBqdXN0IGV4dGVuZCByZXR1cm4gdmFsdWVzIHdpdGhvdXQKKyAgICBjaGVja2luZyBpZiB0aGF0 J2xsIGhlbHAuCisgICAgKFRvIGNoZWNrIGlmIGl0J2QgaGVscCwgd2UnZCBoYXZlIHRvIGRvIGEg ZGF0YWZsb3cgY29tcHV0YXRpb24gdG8gY2hlY2sKKyAgICAgaWYgYSBoaWdocGFydCBjb21wdXRl ZCBmcm9tIGFuIGV4dGVuc2lvbiB0aGF0IGNvdWxkIGJlIGNoYW5nZWQgaW50byBhCisgICAgIG5v LW9wIG1vdmUgcmVhY2hlcyB0aGUgcmV0dXJuIHZhbHVlIGNvcHkuKQorICAgIElmIGEgZnVuY3Rp b24gaXMgaW5saW5lZCwgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYWxyZWFkeSBiZSB1c2VkCisg ICAganVzdCBpbiB0aGUgbW9kZSBuZWVkZWQsIHNvIG5vcm1hbCBleHQtZGNlIHNob3VsZCB3b3Jr IGp1c3QgZmluZS4gICovCisgIGlmIChmbGFnX2V4dF9kY2UgPT0gMikKKyAgICB7CisgICAgICBl ZGdlX2l0ZXJhdG9yIGVpOworICAgICAgZWRnZSBlOworICAgICAgcnR4X2luc24gKmluc247Cisg ICAgICBib29sIG5lZWRfY29tbWl0ID0gZmFsc2U7CisKKyAgICAgIEZPUl9FQUNIX0VER0UgKGUs IGVpLCBFWElUX0JMT0NLX1BUUl9GT1JfRk4gKGNmdW4pLT5wcmVkcykKKwlGT1JfQkJfSU5TTlMg KGUtPnNyYywgaW5zbikKKwkgIHsKKwkgICAgcnR4IHNldCA9IHNpbmdsZV9zZXQgKGluc24pOwor CSAgICBpZiAoIXNldAorCQl8fCAhUkVHX1AgKFNFVF9TUkMgKHNldCkpCisJCXx8ICFSRUdfUCAo U0VUX0RFU1QgKHNldCkpKQorCSAgICAgIGNvbnRpbnVlOworCSAgICB0cmVlIGRlY2wgPSBSRUdf RVhQUiAoU0VUX1NSQyAoc2V0KSk7CisJICAgIGlmICghZGVjbCB8fCBUUkVFX0NPREUgKGRlY2wp ICE9IFJFU1VMVF9ERUNMCisJCXx8IFRSRUVfQ09ERSAoVFJFRV9UWVBFIChkZWNsKSkgIT0gSU5U RUdFUl9UWVBFCisJCXx8IG1heWJlX2dlIChUWVBFX1BSRUNJU0lPTiAoVFJFRV9UWVBFIChkZWNs KSksCisJCQkgICAgIEdFVF9NT0RFX0JJVFNJWkUgKEdFVF9NT0RFIChTRVRfU1JDIChzZXQpKSkp KQorCSAgICAgIGNvbnRpbnVlOworCisJICAgIHJ0eCBleHQgPSBnZW5fcnR4X1NVQlJFRyAoVFlQ RV9NT0RFIChUUkVFX1RZUEUgKGRlY2wpKSwKKwkJCQkgICAgICBTRVRfU1JDIChzZXQpLCAwKTsK KwkgICAgZXh0ID0gZ2VuX3J0eF9mbXRfZSAoKFRZUEVfVU5TSUdORUQgKFRSRUVfVFlQRSAoZGVj bCkpCisJCQkJICA/IFpFUk9fRVhURU5EIDogU0lHTl9FWFRFTkQpLAorCQkJCSBHRVRfTU9ERSAo U0VUX0RFU1QgKHNldCkpLCBleHQpOworCisJICAgIC8qIEZpbHRlciBvdXQgYSB0cml2aWFsIGNh c2Ugb2YgYSB1c2VsZXNzIGV4dGVuc2lvbjoKKwkgICAgICAgaWYgdGhlIHJlZ2lzdGVyIHdhcyBq dXN0IHNldCB0byBhIGNvbnN0YW50IG9yIG1lbW9yeSB2YWx1ZS4gICovCisJICAgIHJ0eF9pbnNu ICpwcmV2ID0gcHJldl9ub25ub3RlX25vbmRlYnVnX2luc24gKGluc24pOworCSAgICBpZiAoKCFw cmV2IHx8IExBQkVMX1AgKHByZXYpKSAmJiAhYmJfaGFzX2Fibm9ybWFsX3ByZWQgKGUtPnNyYykp CisJICAgICAgeworCQllZGdlX2l0ZXJhdG9yIGVpMjsKKwkJZWRnZSBlMjsKKwkJYXV0b192ZWM8 ZWRnZT4gbGl2ZV9wcmVkczsKKworCQlGT1JfRUFDSF9FREdFIChlMiwgZWkyLCBlLT5zcmMtPnBy ZWRzKQorCQkgIHsKKwkJICAgIHByZXYgPSBCQl9FTkQgKGUyLT5zcmMpOworCQkgICAgaWYgKE5P VEVfUCAocHJldikgfHwgREVCVUdfSU5TTl9QIChwcmV2KSkKKwkJICAgICAgcHJldiA9IHByZXZf bm9ubm90ZV9ub25kZWJ1Z19pbnNuIChwcmV2KTsKKwkJICAgIHJ0eCBwcmV2X3NldCA9IE5VTExf UlRYOworCQkgICAgaWYgKHByZXYpCisJCSAgICAgIHByZXZfc2V0ID0gc2luZ2xlX3NldCAocHJl dik7CisJCSAgICBpZiAocHJldl9zZXQKKwkJCSYmIHJ0eF9lcXVhbF9wIChTRVRfREVTVCAocHJl dl9zZXQpLCBTRVRfU1JDIChzZXQpKQorCQkJJiYgKENPTlNUQU5UX1AgKFNFVF9TUkMgKHByZXZf c2V0KSkKKwkJCSAgICB8fCBNRU1fUCAoU0VUX1NSQyAocHJldikpKSkKKwkJICAgICAgY29udGlu dWU7CisJCSAgICBsaXZlX3ByZWRzLnNhZmVfcHVzaCAoZTIpOworCQkgIH0KKwkJaWYgKCFsaXZl X3ByZWRzLmxlbmd0aCAoKSkKKwkJICBjb250aW51ZTsKKworCQlzdGFydF9zZXF1ZW5jZSAoKTsK KwkJcnR4X2luc24gKmV4dF9pbnNuCisJCSAgPSBlbWl0X2luc24gKGdlbl9ydHhfU0VUIChTRVRf U1JDIChzZXQpLCBleHQpKTsKKwkJaWYgKHJlY29nIChQQVRURVJOIChleHRfaW5zbiksIGV4dF9p bnNuLCBOVUxMKSA8IDApCisJCSAgZXh0X2luc24gPSBOVUxMOworCQllbmRfc2VxdWVuY2UgKCk7 CisKKwkJaWYgKGV4dF9pbnNuCisJCSAgICAmJiBsaXZlX3ByZWRzLmxlbmd0aCAoKSA8IEVER0Vf Q09VTlQgKGUtPnNyYy0+cHJlZHMpCisJCSAgICAmJiBmaW5kX3JlZ25vX25vdGUgKGluc24sIFJF R19ERUFELCBSRUdOTyAoU0VUX1NSQyAoc2V0KSkpKQorCQkgIHsKKwkJICAgIHVuc2lnbmVkIGlu dCBpOworCQkgICAgRk9SX0VBQ0hfVkVDX0VMVCAobGl2ZV9wcmVkcywgaSwgZTIpCisJCSAgICAg IGluc2VydF9pbnNuX29uX2VkZ2UgKGNvcHlfcnR4IChQQVRURVJOIChleHRfaW5zbikpLCBlMik7 CisJCSAgICBuZWVkX2NvbW1pdCA9IHRydWU7CisJCSAgICBjb250aW51ZTsKKwkJICB9CisJICAg ICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQlydHggcHJldl9zZXQgPSBOVUxMX1JUWDsKKwkJ aWYgKHByZXYpCisJCSAgcHJldl9zZXQgPSBzaW5nbGVfc2V0IChwcmV2KTsKKwkJaWYgKHByZXZf c2V0CisJCSAgICAmJiBydHhfZXF1YWxfcCAoU0VUX0RFU1QgKHByZXZfc2V0KSwgU0VUX1NSQyAo c2V0KSkKKwkJICAgICYmIChDT05TVEFOVF9QIChTRVRfU1JDIChwcmV2X3NldCkpCisJCQl8fCBN RU1fUCAoU0VUX1NSQyAocHJldikpKSkKKwkJICBjb250aW51ZTsKKwkgICAgICB9CisKKwkgICAg dmFsaWRhdGVfY2hhbmdlIChpbnNuLCAmU0VUX1NSQyAoc2V0KSwgZXh0LCBmYWxzZSk7CisJICB9 CisgICAgICBpZiAobmVlZF9jb21taXQpCisJY29tbWl0X2VkZ2VfaW5zZXJ0aW9ucygpOworICAg IH0KKworICBiYXNpY19ibG9jayBiYiwgKndvcmtsaXN0LCAqcWluLCAqcW91dCwgKnFlbmQ7Cisg IHVuc2lnbmVkIGludCBxbGVuOworICB2ZWM8Yml0bWFwX2hlYWQ+IGxpdmVpbjsKKyAgYml0bWFw IGxpdmVub3c7CisKKyAgbGl2ZWluLmNyZWF0ZSAobGFzdF9iYXNpY19ibG9ja19mb3JfZm4gKGNm dW4pKTsKKyAgbGl2ZWluLnF1aWNrX2dyb3cgKGxhc3RfYmFzaWNfYmxvY2tfZm9yX2ZuIChjZnVu KSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbGFzdF9iYXNpY19ibG9ja19mb3JfZm4gKGNmdW4p OyBpKyspCisgICAgYml0bWFwX2luaXRpYWxpemUgKCZsaXZlaW5baV0sICZiaXRtYXBfZGVmYXVs dF9vYnN0YWNrKTsKKworICBhdXRvX2JpdG1hcCByZWZzICgmYml0bWFwX2RlZmF1bHRfb2JzdGFj ayk7CisgIGRmX2dldF9leGl0X2Jsb2NrX3VzZV9zZXQgKHJlZnMpOworCisgIHVuc2lnbmVkIGk7 CisgIGJpdG1hcF9pdGVyYXRvciBiaTsKKyAgRVhFQ1VURV9JRl9TRVRfSU5fQklUTUFQIChyZWZz LCAwLCBpLCBiaSkKKyAgICB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDQ7IGorKykKKwli aXRtYXBfc2V0X2JpdCAoJmxpdmVpbltFWElUX0JMT0NLXSwgaSAqIDQgKyBqKTsKKyAgICB9CisK KyAgbGl2ZW5vdyA9IEJJVE1BUF9BTExPQyAoTlVMTCk7CisKKyAgd29ya2xpc3QKKyAgICA9IFhO RVdWRUMgKGJhc2ljX2Jsb2NrLCBuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKGNmdW4pIC0gTlVNX0ZJ WEVEX0JMT0NLUyk7CisKKyAgaW50IG1vZGlmeSA9IDA7CisKKyAgZG8KKyAgICB7CisgICAgICBx aW4gPSBxb3V0ID0gd29ya2xpc3Q7CisKKyAgICAgIC8qIFB1dCBldmVyeSBibG9jayBvbiB0aGUg d29ya2xpc3QuICAqLworICAgICAgYXV0b192ZWM8aW50LCAyMD4gcG9zdG9yZGVyOworICAgICAg aW52ZXJ0ZWRfcG9zdF9vcmRlcl9jb21wdXRlICgmcG9zdG9yZGVyKTsKKyAgICAgIGZvciAodW5z aWduZWQgaW50IGkgPSAwOyBpIDwgcG9zdG9yZGVyLmxlbmd0aCAoKTsgKytpKQorCXsKKwkgIGJi ID0gQkFTSUNfQkxPQ0tfRk9SX0ZOIChjZnVuLCBwb3N0b3JkZXJbaV0pOworCSAgaWYgKGJiID09 IEVYSVRfQkxPQ0tfUFRSX0ZPUl9GTiAoY2Z1bikKKwkgICAgICB8fCBiYiA9PSBFTlRSWV9CTE9D S19QVFJfRk9SX0ZOIChjZnVuKSkKKwkgICAgY29udGludWU7CisJICAqcWluKysgPSBiYjsKKwkg IGJiLT5hdXggPSBiYjsKKwl9CisKKyAgICAgIHFpbiA9IHdvcmtsaXN0OworICAgICAgcWVuZCA9 ICZ3b3JrbGlzdFtuX2Jhc2ljX2Jsb2Nrc19mb3JfZm4gKGNmdW4pIC0gTlVNX0ZJWEVEX0JMT0NL U107CisgICAgICBxbGVuID0gbl9iYXNpY19ibG9ja3NfZm9yX2ZuIChjZnVuKSAtIE5VTV9GSVhF RF9CTE9DS1M7CisKKyAgICAgIC8qIEl0ZXJhdGUgdW50aWwgdGhlIHdvcmtsaXN0IGlzIGVtcHR5 LiAgKi8KKyAgICAgIHdoaWxlIChxbGVuKQorCXsKKwkgIC8qIFRha2UgdGhlIGZpcnN0IGVudHJ5 IG9mZiB0aGUgd29ya2xpc3QuICAqLworCSAgYmIgPSAqcW91dCsrOworCSAgcWxlbi0tOworCisJ ICBpZiAocW91dCA+PSBxZW5kKQorCSAgICBxb3V0ID0gd29ya2xpc3Q7CisKKwkgIC8qIENsZWFy IHRoZSBhdXggZmllbGQgb2YgdGhpcyBibG9jayBzbyB0aGF0IGl0IGNhbiBiZSBhZGRlZCB0bwor CSAgICAgdGhlIHdvcmtsaXN0IGFnYWluIGlmIG5lY2Vzc2FyeS4gICovCisJICBiYi0+YXV4ID0g TlVMTDsKKworCSAgYml0bWFwX2NsZWFyIChsaXZlbm93KTsKKwkgIC8qIE1ha2UgZXZlcnl0aGlu ZyBsaXZlIHRoYXQncyBsaXZlIGluIHRoZSBzdWNjZXNzb3JzLiAgKi8KKwkgIGVkZ2VfaXRlcmF0 b3IgZWk7CisJICBlZGdlIGU7CisKKwkgIEZPUl9FQUNIX0VER0UgKGUsIGVpLCBiYi0+c3VjY3Mp CisJICAgIGJpdG1hcF9pb3JfaW50byAobGl2ZW5vdywgJmxpdmVpbltlLT5kZXN0LT5pbmRleF0p OworCisJICBsaXZlbm93ID0gZXh0X2RjZV9wcm9jZXNzX2JiIChiYiwgbGl2ZW5vdywgbW9kaWZ5 ID4gMCk7CisKKwkgIGlmICghYml0bWFwX2VxdWFsX3AgKCZsaXZlaW5bYmItPmluZGV4XSwgbGl2 ZW5vdykpCisJICAgIHsKKwkgICAgICBnY2NfYXNzZXJ0ICghbW9kaWZ5KTsKKwkgICAgICBiaXRt YXAgdG1wID0gQklUTUFQX0FMTE9DIChOVUxMKTsKKwkgICAgICBnY2NfYXNzZXJ0ICghYml0bWFw X2FuZF9jb21wbCAodG1wLCAmbGl2ZWluW2JiLT5pbmRleF0sIGxpdmVub3cpKTsKKworCSAgICAg IGJpdG1hcF9jb3B5ICgmbGl2ZWluW2JiLT5pbmRleF0sIGxpdmVub3cpOworCisJICAgICAgZWRn ZV9pdGVyYXRvciBlaTsKKwkgICAgICBlZGdlIGU7CisKKwkgICAgICBGT1JfRUFDSF9FREdFIChl LCBlaSwgYmItPnByZWRzKQorCQlpZiAoIWUtPnNyYy0+YXV4ICYmIGUtPnNyYyAhPSBFTlRSWV9C TE9DS19QVFJfRk9SX0ZOIChjZnVuKSkKKwkJICB7CisJCSAgICAqcWluKysgPSBlLT5zcmM7CisJ CSAgICBlLT5zcmMtPmF1eCA9IGU7CisJCSAgICBxbGVuKys7CisJCSAgICBpZiAocWluID49IHFl bmQpCisJCSAgICAgIHFpbiA9IHdvcmtsaXN0OworCQkgIH0KKwkgICAgfQorCX0KKyAgICB9IHdo aWxlICghbW9kaWZ5KyspOworCisgIC8qIENsZWFuIHVwLiAgKi8KKyAgQklUTUFQX0ZSRUUgKGxp dmVub3cpOworICB1bnNpZ25lZCBsZW4gPSBsaXZlaW4ubGVuZ3RoICgpOworICBmb3IgKHVuc2ln bmVkIGkgPSAwOyBpIDwgbGVuOyBpKyspCisgICAgYml0bWFwX2NsZWFyICgmbGl2ZWluW2ldKTsK KyAgbGl2ZWluLnJlbGVhc2UgKCk7CisgIGNsZWFyX2F1eF9mb3JfYmxvY2tzICgpOworICBmcmVl ICh3b3JrbGlzdCk7Cit9CisKK25hbWVzcGFjZSB7CisKK2NvbnN0IHBhc3NfZGF0YSBwYXNzX2Rh dGFfZXh0X2RjZSA9Cit7CisgIFJUTF9QQVNTLCAvKiB0eXBlICovCisgICJleHRfZGNlIiwgLyog bmFtZSAqLworICBPUFRHUk9VUF9OT05FLCAvKiBvcHRpbmZvX2ZsYWdzICovCisgIFRWX05PTkUs IC8qIHR2X2lkICovCisgIFBST1BfY2ZnbGF5b3V0LCAvKiBwcm9wZXJ0aWVzX3JlcXVpcmVkICov CisgIDAsIC8qIHByb3BlcnRpZXNfcHJvdmlkZWQgKi8KKyAgMCwgLyogcHJvcGVydGllc19kZXN0 cm95ZWQgKi8KKyAgMCwgLyogdG9kb19mbGFnc19zdGFydCAqLworICBUT0RPX2RmX2ZpbmlzaCwg LyogdG9kb19mbGFnc19maW5pc2ggKi8KK307CisKK2NsYXNzIHBhc3NfZXh0X2RjZSA6IHB1Ymxp YyBydGxfb3B0X3Bhc3MKK3sKK3B1YmxpYzoKKyAgcGFzc19leHRfZGNlIChnY2M6OmNvbnRleHQg KmN0eHQpCisgICAgOiBydGxfb3B0X3Bhc3MgKHBhc3NfZGF0YV9leHRfZGNlLCBjdHh0KQorICB7 fQorCisgIC8qIG9wdF9wYXNzIG1ldGhvZHM6ICovCisgIHZpcnR1YWwgYm9vbCBnYXRlIChmdW5j dGlvbiAqKSB7IHJldHVybiBmbGFnX2V4dF9kY2UgIT0gMDsgfQorICB2aXJ0dWFsIHVuc2lnbmVk IGludCBleGVjdXRlIChmdW5jdGlvbiAqKQorICAgIHsKKyAgICAgIGV4dF9kY2UgKCk7CisgICAg ICByZXR1cm4gMDsKKyAgICB9CisKK307IC8vIGNsYXNzIHBhc3NfY29tYmluZQorCit9IC8vIGFu b24gbmFtZXNwYWNlCisKK3J0bF9vcHRfcGFzcyAqCittYWtlX3Bhc3NfZXh0X2RjZSAoZ2NjOjpj b250ZXh0ICpjdHh0KQoreworICByZXR1cm4gbmV3IHBhc3NfZXh0X2RjZSAoY3R4dCk7Cit9CmRp ZmYgLS1naXQgYS9nY2MvcGFzc2VzLmRlZiBiL2djYy9wYXNzZXMuZGVmCmluZGV4IGY3NzE4MTgx MDM4Li5kNmM2MGNiMWNlZiAxMDA2NDQKLS0tIGEvZ2NjL3Bhc3Nlcy5kZWYKKysrIGIvZ2NjL3Bh c3Nlcy5kZWYKQEAgLTQ3MSw2ICs0NzEsNyBAQCBhbG9uZyB3aXRoIEdDQzsgc2VlIHRoZSBmaWxl IENPUFlJTkczLiAgSWYgbm90IHNlZQogICAgICAgTkVYVF9QQVNTIChwYXNzX2luY19kZWMpOwog ICAgICAgTkVYVF9QQVNTIChwYXNzX2luaXRpYWxpemVfcmVncyk7CiAgICAgICBORVhUX1BBU1Mg KHBhc3NfdWRfcnRsX2RjZSk7CisgICAgICBORVhUX1BBU1MgKHBhc3NfZXh0X2RjZSk7CiAgICAg ICBORVhUX1BBU1MgKHBhc3NfY29tYmluZSk7CiAgICAgICBORVhUX1BBU1MgKHBhc3NfaWZfYWZ0 ZXJfY29tYmluZSk7CiAgICAgICBORVhUX1BBU1MgKHBhc3NfanVtcF9hZnRlcl9jb21iaW5lKTsK ZGlmZiAtLWdpdCBhL2djYy90cmVlLXBhc3MuaCBiL2djYy90cmVlLXBhc3MuaAppbmRleCA2MDZk MWQ2MGI4NS4uNGIyNTgxNGUyZWQgMTAwNjQ0Ci0tLSBhL2djYy90cmVlLXBhc3MuaAorKysgYi9n Y2MvdHJlZS1wYXNzLmgKQEAgLTU4Miw2ICs1ODIsNyBAQCBleHRlcm4gcnRsX29wdF9wYXNzICpt YWtlX3Bhc3NfcmVnaW5mb19pbml0IChnY2M6OmNvbnRleHQgKmN0eHQpOwogZXh0ZXJuIHJ0bF9v cHRfcGFzcyAqbWFrZV9wYXNzX2luY19kZWMgKGdjYzo6Y29udGV4dCAqY3R4dCk7CiBleHRlcm4g cnRsX29wdF9wYXNzICptYWtlX3Bhc3Nfc3RhY2tfcHRyX21vZCAoZ2NjOjpjb250ZXh0ICpjdHh0 KTsKIGV4dGVybiBydGxfb3B0X3Bhc3MgKm1ha2VfcGFzc19pbml0aWFsaXplX3JlZ3MgKGdjYzo6 Y29udGV4dCAqY3R4dCk7CitleHRlcm4gcnRsX29wdF9wYXNzICptYWtlX3Bhc3NfZXh0X2RjZSAo Z2NjOjpjb250ZXh0ICpjdHh0KTsKIGV4dGVybiBydGxfb3B0X3Bhc3MgKm1ha2VfcGFzc19jb21i aW5lIChnY2M6OmNvbnRleHQgKmN0eHQpOwogZXh0ZXJuIHJ0bF9vcHRfcGFzcyAqbWFrZV9wYXNz X2lmX2FmdGVyX2NvbWJpbmUgKGdjYzo6Y29udGV4dCAqY3R4dCk7CiBleHRlcm4gcnRsX29wdF9w YXNzICptYWtlX3Bhc3NfanVtcF9hZnRlcl9jb21iaW5lIChnY2M6OmNvbnRleHQgKmN0eHQpOwo= --000000000000d0346805da421b6a--