From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd32.google.com (mail-io1-xd32.google.com [IPv6:2607:f8b0:4864:20::d32]) by sourceware.org (Postfix) with ESMTPS id DF4033857C69 for ; Tue, 26 Jan 2021 05:27:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org DF4033857C69 Received: by mail-io1-xd32.google.com with SMTP id y19so31401584iov.2 for ; Mon, 25 Jan 2021 21:27:53 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=V6e2VKeELTm4vvo70F9gciMhGOE6wAP2pFw6sWL9XNU=; b=UcibdiDzS7S+GAe+m3M9mIirnLNpxf/nGXl3QKf8Kn3oTkjGft3tESiENV3tQyCITP Zp4QnsAWtRIY3Z4LNNT/JtPaL5hA9o+hFjkOJWR0cyTXf1eFbfBhEAEpOKlhxSVuDVYs X3IEQDvN+ET/PX4KRZ6MtlPVPk9f588caWs09Omg/sMnFH4rxNnoWfvV48Kr0X1rTj84 7MnTWEnmVFqs8xIJWdDEO6mdkSIORq2yaCmhu1UvpTAlc/eWkUHfme9GUz6dlBf4P8Y2 qg1wKQYCzB/kjYzkSD49ApnWagnJtKGWbBEXoUNZ41mYcVx3hEGaMrzGwlFz0gjx0gG0 i+WA== X-Gm-Message-State: AOAM531tUmu/cZZsE/LbYkP3Hh6WwZiTlWDXfa3Z139RamnSGW9CHzmM viQeS6UaO+HIgS3oCgz3YS0C5RTIE5OV/g/yIQA= X-Google-Smtp-Source: ABdhPJy9kcpLAUsXhX87dnzKj/nHUm7KzzjXh4K5J8eSJC3YKGabAXequzoLrDiCHiG0dLiQRmfPMkqTWuNFoOagh4k= X-Received: by 2002:a6b:b356:: with SMTP id c83mr2971485iof.208.1611638873372; Mon, 25 Jan 2021 21:27:53 -0800 (PST) MIME-Version: 1.0 References: <20210106143931.GC725145@tucnak> In-Reply-To: From: Hongtao Liu Date: Tue, 26 Jan 2021 13:30:49 +0800 Message-ID: Subject: Re: [PATCH] [AVX512] Fix ICE: Convert integer mask to vector in ix86_expand_fp_vec_cmp/ix86_expand_int_vec_cmp [PR98537] To: Jakub Jelinek Cc: GCC Patches , Kirill Yukhin , "H. J. Lu" Content-Type: multipart/mixed; boundary="0000000000008de21c05b9c6ea54" X-Spam-Status: No, score=-10.2 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 autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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, 26 Jan 2021 05:27:56 -0000 --0000000000008de21c05b9c6ea54 Content-Type: text/plain; charset="UTF-8" On Thu, Jan 14, 2021 at 7:16 PM Hongtao Liu wrote: > > ping. > > On Thu, Jan 7, 2021 at 1:22 PM Hongtao Liu wrote: > > > > On Wed, Jan 6, 2021 at 10:39 PM Jakub Jelinek wrote: > > > > > > On Wed, Jan 06, 2021 at 02:49:13PM +0800, Hongtao Liu wrote: > > > > ix86_expand_fp_vec_cmp/ix86_expand_int_vec_cmp are used by vec_cmpmn > > > > for vector comparison to vector mask, but ix86_expand_sse_cmp(which is > > > > called in upper 2 functions.) may return integer mask whenever integer > > > > mask is available, so convert integer mask back to vector mask if > > > > needed. > > > > > > > > gcc/ChangeLog: > > > > > > > > PR target/98537 > > > > * config/i386/i386-expand.c (ix86_expand_fp_vec_cmp): > > > > When cmp is integer mask, convert it to vector. > > > > (ix86_expand_int_vec_cmp): Ditto. > > > > > > > > gcc/testsuite/ChangeLog: > > > > > > > > PR target/98537 > > > > * g++.target/i386/avx512bw-pr98537-1.C: New test. > > > > * g++.target/i386/avx512vl-pr98537-1.C: New test. > > > > * g++.target/i386/avx512vl-pr98537-2.C: New test. > > > > > > Do we optimize it then to an AVX/AVX2 comparison if possible? A new patch is proposed to solve a series of performance and correctness regressions brought by r10-5250. Integer mask comparison will only be used for 512-bit vectors, and 128/256-bit vcondmn(excluding the case where op_true/op_false is all 1s or 0s, it is actually a vec_cmpmn). in ix86_expand_sse_cmp/ix86_expand_int_sse_cmp - if (ix86_valid_mask_cmp_mode (cmp_ops_mode)) + if (GET_MODE_SIZE (mode) == 64 + || (ix86_valid_mask_cmp_mode (cmp_ops_mode) + /* When op_true and op_false is NULL, vector dest is required. */ + && op_true && op_false + /* Gimple sometimes transforms vec_cmpmn to vcondmn with + op_true/op_false as constm1_rtx/const0_rtx. + Don't generate integer mask comparison then. */ + && !((vector_all_ones_operand (op_true, GET_MODE (op_true)) + && CONST0_RTX (GET_MODE (op_false)) == op_false) + || (vector_all_ones_operand (op_false, GET_MODE (op_false)) + && CONST0_RTX (GET_MODE (op_true)) == op_true)))) Bootstrapped and regtested on x86_64-linux-gnu{-m32,}. Ok for trunk? Ok for backport to gcc10? gcc/ChangeLog: PR target/98537 * config/i386/i386-expand.c (ix86_expand_sse_cmp): Don't generate integer mask comparison for 128/256-bits vector when op_true/op_false is NULL_RTX or CONSTM1_RTX/CONST0_RTX. Also delete redundant !maskcmp condition. (ix86_expand_int_vec_cmp): Ditto but no redundant deletion here. (ix86_expand_sse_movcc): Delete definition of maskcmp, add the condition directly to if (maskcmp), add extra check for cmpmode, it should be MODE_INT. (ix86_expand_fp_vec_cmp): Pass NULL to ix86_expand_sse_cmp's parameters op_true/op_false. gcc/testsuite/ChangeLog: PR target/98537 * g++.target/i386/avx512bw-pr98537-1.C: New test. * g++.target/i386/avx512vl-pr98537-1.C: New test. * g++.target/i386/avx512vl-pr98537-2.C: New test. * gcc.target/i386/avx512vl-pr88547-1.c: Adjust testcase, integer mask comparison should not be generated. * gcc.target/i386/avx512vl-pr92686-vpcmp-1.c: This test is used to guard code generation of integer mask comparison, but for vector comparison to vector dest, integer mask comparison is disliked, so detele this useless test. * gcc.target/i386/avx512vl-pr92686-vpcmp-2.c: Ditto. * gcc.target/i386/avx512vl-pr92686-vpcmp-intelasm-1.c: Ditto. -- BR, Hongtao --0000000000008de21c05b9c6ea54 Content-Type: text/x-patch; charset="US-ASCII"; name="0001-Fix-ICE-Don-t-generate-integer-mask-comparision-for-.patch" Content-Disposition: attachment; filename="0001-Fix-ICE-Don-t-generate-integer-mask-comparision-for-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kkdk60mz0 RnJvbSAyYjY0OGVkZDA2ZGFhNDMyY2U2NTM5Nzc2OGUyNWFiNTRmNDcwNzU5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBsaXVob25ndCA8aG9uZ3Rhby5saXVAaW50ZWwuY29tPgpEYXRl OiBUaHUsIDcgSmFuIDIwMjEgMTA6MTU6MzMgKzA4MDAKU3ViamVjdDogW1BBVENIXSBGaXggSUNF OiBEb24ndCBnZW5lcmF0ZSBpbnRlZ2VyIG1hc2sgY29tcGFyaXNpb24gZm9yCiAxMjgvMjU2LWJp dHMgdmVjdG9yIHdoZW4gb3BfdHJ1ZS9vcF9mYWxzZSBhcmUgTlVMTCBvciBjb25zdG0xX3J0eC9j b25zdDBfcnR4CiBbUFI5ODUzN10KCmluIGl4ODZfZXhwYW5kX3NzZV9jbXAvaXg4Nl9leHBhbmRf aW50X3NzZV9jbXAKCi0gIGlmIChpeDg2X3ZhbGlkX21hc2tfY21wX21vZGUgKGNtcF9vcHNfbW9k ZSkpCisgIGlmIChHRVRfTU9ERV9TSVpFIChtb2RlKSA9PSA2NAorICAgICAgfHwgKGl4ODZfdmFs aWRfbWFza19jbXBfbW9kZSAoY21wX29wc19tb2RlKQorCSAgLyogV2hlbiBvcF90cnVlIGFuZCBv cF9mYWxzZSBpcyBOVUxMLCB2ZWN0b3IgZGVzdCBpcyByZXF1aXJlZC4gICovCisJICAmJiBvcF90 cnVlICYmIG9wX2ZhbHNlCisJICAvKiBHaW1wbGUgc29tZXRpbWVzIHRyYW5zZm9ybXMgdmVjX2Nt cG1uIHRvIHZjb25kbW4gd2l0aAorCSAgICAgb3BfdHJ1ZS9vcF9mYWxzZSBhcyBjb25zdG0xX3J0 eC9jb25zdDBfcnR4LgorCSAgICAgRG9uJ3QgZ2VuZXJhdGUgaW50ZWdlciBtYXNrIGNvbXBhcmlz b24gdGhlbi4gICovCisJICAmJiAhKCh2ZWN0b3JfYWxsX29uZXNfb3BlcmFuZCAob3BfdHJ1ZSwg R0VUX01PREUgKG9wX3RydWUpKQorCQkmJiBDT05TVDBfUlRYIChHRVRfTU9ERSAob3BfZmFsc2Up KSA9PSBvcF9mYWxzZSkKKwkgICAgICAgfHwgKHZlY3Rvcl9hbGxfb25lc19vcGVyYW5kIChvcF9m YWxzZSwgR0VUX01PREUgKG9wX2ZhbHNlKSkKKwkJICAgJiYgQ09OU1QwX1JUWCAoR0VUX01PREUg KG9wX3RydWUpKSA9PSBvcF90cnVlKSkpKQoKZ2NjL0NoYW5nZUxvZzoKCglQUiB0YXJnZXQvOTg1 MzcKCSogY29uZmlnL2kzODYvaTM4Ni1leHBhbmQuYyAoaXg4Nl9leHBhbmRfc3NlX2NtcCk6IERv bid0CglnZW5lcmF0ZSBpbnRlZ2VyIG1hc2sgY29tcGFyaXNvbiBmb3IgMTI4LzI1Ni1iaXRzIHZl Y3RvciB3aGVuCglvcF90cnVlL29wX2ZhbHNlIGlzIE5VTExfUlRYIG9yIENPTlNUTTFfUlRYL0NP TlNUMF9SVFguIEFsc28KCWRlbGV0ZSByZWR1bmRhbnQgIW1hc2tjbXAgY29uZGl0aW9uLgoJKGl4 ODZfZXhwYW5kX2ludF92ZWNfY21wKTogRGl0dG8gYnV0IG5vIHJlZHVuZGFudCBkZWxldGlvbgoJ aGVyZS4KCShpeDg2X2V4cGFuZF9zc2VfbW92Y2MpOiBEZWxldGUgZGVmaW5pdGlvbiBvZiBtYXNr Y21wLCBhZGQgdGhlCgljb25kaXRpb24gZGlyZWN0bHkgdG8gaWYgKG1hc2tjbXApLCBhZGQgZXh0 cmEgY2hlY2sgZm9yCgljbXBtb2RlLCBpdCBzaG91bGQgYmUgTU9ERV9JTlQuCgkoaXg4Nl9leHBh bmRfZnBfdmVjX2NtcCk6IFBhc3MgTlVMTCB0byBpeDg2X2V4cGFuZF9zc2VfY21wJ3MKCXBhcmFt ZXRlcnMgb3BfdHJ1ZS9vcF9mYWxzZS4KCmdjYy90ZXN0c3VpdGUvQ2hhbmdlTG9nOgoKCVBSIHRh cmdldC85ODUzNwoJKiBnKysudGFyZ2V0L2kzODYvYXZ4NTEyYnctcHI5ODUzNy0xLkM6IE5ldyB0 ZXN0LgoJKiBnKysudGFyZ2V0L2kzODYvYXZ4NTEydmwtcHI5ODUzNy0xLkM6IE5ldyB0ZXN0LgoJ KiBnKysudGFyZ2V0L2kzODYvYXZ4NTEydmwtcHI5ODUzNy0yLkM6IE5ldyB0ZXN0LgoJKiBnY2Mu dGFyZ2V0L2kzODYvYXZ4NTEydmwtcHI4ODU0Ny0xLmM6IEFkanVzdCB0ZXN0Y2FzZSwKCWludGVn ZXIgbWFzayBjb21wYXJpc29uIHNob3VsZCBub3QgYmUgZ2VuZXJhdGVkLgoJKiBnY2MudGFyZ2V0 L2kzODYvYXZ4NTEydmwtcHI5MjY4Ni12cGNtcC0xLmM6IFRoaXMgdGVzdCBpcwoJdXNlZCB0byBn dWFyZCBjb2RlIGdlbmVyYXRpb24gb2YgaW50ZWdlciBtYXNrIGNvbXBhcmlzb24sIGJ1dAoJZm9y IHZlY3RvciBjb21wYXJpc29uIHRvIHZlY3RvciBkZXN0LCBpbnRlZ2VyIG1hc2sgY29tcGFyaXNv bgoJaXMgZGlzbGlrZWQsIHNvIGRldGVsZSB0aGlzIHVzZWxlc3MgdGVzdC4KCSogZ2NjLnRhcmdl dC9pMzg2L2F2eDUxMnZsLXByOTI2ODYtdnBjbXAtMi5jOiBEaXR0by4KCSogZ2NjLnRhcmdldC9p Mzg2L2F2eDUxMnZsLXByOTI2ODYtdnBjbXAtaW50ZWxhc20tMS5jOiBEaXR0by4KLS0tCiBnY2Mv Y29uZmlnL2kzODYvaTM4Ni1leHBhbmQuYyAgICAgICAgICAgICAgICAgfCAgMzggKysrKy0tCiAu Li4vZysrLnRhcmdldC9pMzg2L2F2eDUxMmJ3LXByOTg1MzctMS5DICAgICAgfCAgMTEgKysKIC4u Li9nKysudGFyZ2V0L2kzODYvYXZ4NTEydmwtcHI5ODUzNy0xLkMgICAgICB8ICA0MCArKysrKysr CiAuLi4vZysrLnRhcmdldC9pMzg2L2F2eDUxMnZsLXByOTg1MzctMi5DICAgICAgfCAgIDggKysK IC4uLi9nY2MudGFyZ2V0L2kzODYvYXZ4NTEydmwtcHI4ODU0Ny0xLmMgICAgICB8ICAxMCArLQog Li4uL2kzODYvYXZ4NTEydmwtcHI5MjY4Ni12cGNtcC0xLmMgICAgICAgICAgIHwgMTEyIC0tLS0t LS0tLS0tLS0tLS0tLQogLi4uL2kzODYvYXZ4NTEydmwtcHI5MjY4Ni12cGNtcC0yLmMgICAgICAg ICAgIHwgIDkxIC0tLS0tLS0tLS0tLS0tCiAuLi4vaTM4Ni9hdng1MTJ2bC1wcjkyNjg2LXZwY21w LWludGVsYXNtLTEuYyAgfCAxMTEgLS0tLS0tLS0tLS0tLS0tLS0KIDggZmlsZXMgY2hhbmdlZCwg OTQgaW5zZXJ0aW9ucygrKSwgMzI3IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGdj Yy90ZXN0c3VpdGUvZysrLnRhcmdldC9pMzg2L2F2eDUxMmJ3LXByOTg1MzctMS5DCiBjcmVhdGUg bW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nKysudGFyZ2V0L2kzODYvYXZ4NTEydmwtcHI5ODUz Ny0xLkMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2crKy50YXJnZXQvaTM4Ni9h dng1MTJ2bC1wcjk4NTM3LTIuQwogZGVsZXRlIG1vZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2Nj LnRhcmdldC9pMzg2L2F2eDUxMnZsLXByOTI2ODYtdnBjbXAtMS5jCiBkZWxldGUgbW9kZSAxMDA2 NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4NTEydmwtcHI5MjY4Ni12cGNtcC0y LmMKIGRlbGV0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1 MTJ2bC1wcjkyNjg2LXZwY21wLWludGVsYXNtLTEuYwoKZGlmZiAtLWdpdCBhL2djYy9jb25maWcv aTM4Ni9pMzg2LWV4cGFuZC5jIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYtZXhwYW5kLmMKaW5kZXgg ZDY0YjRhY2M3ZGMuLjk3NTgyOTRlNDkyIDEwMDY0NAotLS0gYS9nY2MvY29uZmlnL2kzODYvaTM4 Ni1leHBhbmQuYworKysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni1leHBhbmQuYwpAQCAtMzQ4NSw3 ICszNDg1LDE3IEBAIGl4ODZfZXhwYW5kX3NzZV9jbXAgKHJ0eCBkZXN0LCBlbnVtIHJ0eF9jb2Rl IGNvZGUsIHJ0eCBjbXBfb3AwLCBydHggY21wX29wMSwKICAgYm9vbCBtYXNrY21wID0gZmFsc2U7 CiAgIHJ0eCB4OwogCi0gIGlmIChpeDg2X3ZhbGlkX21hc2tfY21wX21vZGUgKGNtcF9vcHNfbW9k ZSkpCisgIGlmIChHRVRfTU9ERV9TSVpFIChtb2RlKSA9PSA2NAorICAgICAgfHwgKGl4ODZfdmFs aWRfbWFza19jbXBfbW9kZSAoY21wX29wc19tb2RlKQorCSAgLyogV2hlbiBvcF90cnVlIGFuZCBv cF9mYWxzZSBpcyBOVUxMLCB2ZWN0b3IgZGVzdCBpcyByZXF1aXJlZC4gICovCisJICAmJiBvcF90 cnVlICYmIG9wX2ZhbHNlCisJICAvKiBHaW1wbGUgc29tZXRpbWVzIHRyYW5zZm9ybXMgdmVjX2Nt cG1uIHRvIHZjb25kbW4gd2l0aAorCSAgICAgb3BfdHJ1ZS9vcF9mYWxzZSBhcyBjb25zdG0xX3J0 eC9jb25zdDBfcnR4LgorCSAgICAgRG9uJ3QgZ2VuZXJhdGUgaW50ZWdlciBtYXNrIGNvbXBhcmlz b24gdGhlbi4gICovCisJICAmJiAhKCh2ZWN0b3JfYWxsX29uZXNfb3BlcmFuZCAob3BfdHJ1ZSwg R0VUX01PREUgKG9wX3RydWUpKQorCQkmJiBDT05TVDBfUlRYIChHRVRfTU9ERSAob3BfZmFsc2Up KSA9PSBvcF9mYWxzZSkKKwkgICAgICAgfHwgKHZlY3Rvcl9hbGxfb25lc19vcGVyYW5kIChvcF9m YWxzZSwgR0VUX01PREUgKG9wX2ZhbHNlKSkKKwkJICAgJiYgQ09OU1QwX1JUWCAoR0VUX01PREUg KG9wX3RydWUpKSA9PSBvcF90cnVlKSkpKQogICAgIHsKICAgICAgIHVuc2lnbmVkIGludCBuYml0 cyA9IEdFVF9NT0RFX05VTklUUyAoY21wX29wc19tb2RlKTsKICAgICAgIG1hc2tjbXAgPSB0cnVl OwpAQCAtMzUxNyw3ICszNTI3LDcgQEAgaXg4Nl9leHBhbmRfc3NlX2NtcCAocnR4IGRlc3QsIGVu dW0gcnR4X2NvZGUgY29kZSwgcnR4IGNtcF9vcDAsIHJ0eCBjbXBfb3AxLAogCiAgIHggPSBnZW5f cnR4X2ZtdF9lZSAoY29kZSwgY21wX21vZGUsIGNtcF9vcDAsIGNtcF9vcDEpOwogCi0gIGlmIChj bXBfbW9kZSAhPSBtb2RlICYmICFtYXNrY21wKQorICBpZiAoY21wX21vZGUgIT0gbW9kZSkKICAg ICB7CiAgICAgICB4ID0gZm9yY2VfcmVnIChjbXBfb3BzX21vZGUsIHgpOwogICAgICAgY29udmVy dF9tb3ZlIChkZXN0LCB4LCBmYWxzZSk7CkBAIC0zNTQ0LDkgKzM1NTQsNiBAQCBpeDg2X2V4cGFu ZF9zc2VfbW92Y2MgKHJ0eCBkZXN0LCBydHggY21wLCBydHggb3BfdHJ1ZSwgcnR4IG9wX2ZhbHNl KQogICAgICAgcmV0dXJuOwogICAgIH0KIAotICAvKiBJbiBBVlg1MTJGIHRoZSByZXN1bHQgb2Yg Y29tcGFyaXNvbiBpcyBhbiBpbnRlZ2VyIG1hc2suICAqLwotICBib29sIG1hc2tjbXAgPSBtb2Rl ICE9IGNtcG1vZGUgJiYgaXg4Nl92YWxpZF9tYXNrX2NtcF9tb2RlIChtb2RlKTsKLQogICBydHgg dDIsIHQzLCB4OwogCiAgIC8qIElmIHdlIGhhdmUgYW4gaW50ZWdlciBtYXNrIGFuZCBGUCB2YWx1 ZSB0aGVuIHdlIG5lZWQKQEAgLTM1NTcsNyArMzU2NCwxMCBAQCBpeDg2X2V4cGFuZF9zc2VfbW92 Y2MgKHJ0eCBkZXN0LCBydHggY21wLCBydHggb3BfdHJ1ZSwgcnR4IG9wX2ZhbHNlKQogICAgICAg Y21wID0gZ2VuX3J0eF9TVUJSRUcgKG1vZGUsIGNtcCwgMCk7CiAgICAgfQogCi0gIGlmIChtYXNr Y21wKQorICAvKiBJbiBBVlg1MTJGIHRoZSByZXN1bHQgb2YgY29tcGFyaXNvbiBpcyBhbiBpbnRl Z2VyIG1hc2suICAqLworICBpZiAobW9kZSAhPSBjbXBtb2RlCisgICAgICAmJiBHRVRfTU9ERV9D TEFTUyAoY21wbW9kZSkgPT0gTU9ERV9JTlQKKyAgICAgICYmIGl4ODZfdmFsaWRfbWFza19jbXBf bW9kZSAobW9kZSkpCiAgICAgewogICAgICAgLyogVXNpbmcgdmVjdG9yIG1vdmUgd2l0aCBtYXNr IHJlZ2lzdGVyLiAgKi8KICAgICAgIGNtcCA9IGZvcmNlX3JlZyAoY21wbW9kZSwgY21wKTsKQEAg LTQwMTYsNyArNDAyNiw3IEBAIGl4ODZfZXhwYW5kX2ZwX3ZlY19jbXAgKHJ0eCBvcGVyYW5kc1td KQogICAgIH0KICAgZWxzZQogICAgIGNtcCA9IGl4ODZfZXhwYW5kX3NzZV9jbXAgKG9wZXJhbmRz WzBdLCBjb2RlLCBvcGVyYW5kc1syXSwgb3BlcmFuZHNbM10sCi0JCQkgICAgICAgb3BlcmFuZHNb MV0sIG9wZXJhbmRzWzJdKTsKKwkJCSAgICAgICBOVUxMLCBOVUxMKTsKIAogICBpZiAob3BlcmFu ZHNbMF0gIT0gY21wKQogICAgIGVtaXRfbW92ZV9pbnNuIChvcGVyYW5kc1swXSwgY21wKTsKQEAg LTQwNDEsOCArNDA1MSwxOCBAQCBpeDg2X2V4cGFuZF9pbnRfc3NlX2NtcCAocnR4IGRlc3QsIGVu dW0gcnR4X2NvZGUgY29kZSwgcnR4IGNvcDAsIHJ0eCBjb3AxLAogICAgIDsKICAgLyogQVZYNTEy RiBzdXBwb3J0cyBhbGwgb2YgdGhlIGNvbXBhcnNpb25zCiAgICAgIG9uIGFsbCAxMjgvMjU2LzUx Mi1iaXQgdmVjdG9yIGludCB0eXBlcy4gICovCi0gIGVsc2UgaWYgKGl4ODZfdmFsaWRfbWFza19j bXBfbW9kZSAobW9kZSkpCi0gICAgOworICBlbHNlIGlmIChHRVRfTU9ERV9TSVpFIChtb2RlKSA9 PSA2NAorCSAgIHx8IChpeDg2X3ZhbGlkX21hc2tfY21wX21vZGUgKG1vZGUpCisJICAgICAgIC8q IFdoZW4gb3BfdHJ1ZSBhbmQgb3BfZmFsc2UgaXMgTlVMTCwgdmVjdG9yIGRlc3QgaXMgcmVxdWly ZWQuICAqLworCSAgICAgICAmJiBvcF90cnVlICYmIG9wX2ZhbHNlCisJICAgICAgIC8qIEdpbXBs ZSBzb21ldGltZXMgdHJhbnNmb3JtcyB2ZWNfY21wbW4gdG8gdmNvbmRtbiB3aXRoCisJCSAgb3Bf dHJ1ZS9vcF9mYWxzZSBhcyBjb25zdG0xX3J0eC9jb25zdDBfcnR4LgorCQkgIERvbid0IGdlbmVy YXRlIGludGVnZXIgbWFzayBjb21wYXJpc29uIHRoZW4uICAqLworCSAgICAgICAmJiAhKCh2ZWN0 b3JfYWxsX29uZXNfb3BlcmFuZCAob3BfdHJ1ZSwgR0VUX01PREUgKG9wX3RydWUpKQorCQkgICAg ICYmIENPTlNUMF9SVFggKEdFVF9NT0RFIChvcF9mYWxzZSkpID09IG9wX2ZhbHNlKQorCQkgICAg fHwgKHZlY3Rvcl9hbGxfb25lc19vcGVyYW5kIChvcF9mYWxzZSwgR0VUX01PREUgKG9wX2ZhbHNl KSkKKwkJCSYmIENPTlNUMF9SVFggKEdFVF9NT0RFIChvcF90cnVlKSkgPT0gb3BfdHJ1ZSkpKSkK KwkgICA7CiAgIGVsc2UKICAgICB7CiAgICAgICAvKiBDYW5vbmljYWxpemUgdGhlIGNvbXBhcmlz b24gdG8gRVEsIEdULCBHVFUuICAqLwpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nKysudGFy Z2V0L2kzODYvYXZ4NTEyYnctcHI5ODUzNy0xLkMgYi9nY2MvdGVzdHN1aXRlL2crKy50YXJnZXQv aTM4Ni9hdng1MTJidy1wcjk4NTM3LTEuQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw MDAwMDAwMC4uOTY5Njg0YTIyMmIKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2cr Ky50YXJnZXQvaTM4Ni9hdng1MTJidy1wcjk4NTM3LTEuQwpAQCAtMCwwICsxLDExIEBACisvKiBQ UiB0YXJnZXQvOTg1MzcgKi8KKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlv bnMgIi1PMiAtbWFyY2g9eDg2LTY0IC1zdGQ9YysrMTEiIH0gKi8KKworI2RlZmluZSBUWVBFViBj aGFyCisjZGVmaW5lIFRZUEVXIHNob3J0CisKKyNkZWZpbmUgVF9BUlIJCQkJCQlcCisgIF9fYXR0 cmlidXRlX18gKCh0YXJnZXQgKCJhdng1MTJ2bCxhdng1MTJidyIpKSkKKworI2luY2x1ZGUgImF2 eDUxMnZsLXByOTg1MzctMS5DIgpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nKysudGFyZ2V0 L2kzODYvYXZ4NTEydmwtcHI5ODUzNy0xLkMgYi9nY2MvdGVzdHN1aXRlL2crKy50YXJnZXQvaTM4 Ni9hdng1MTJ2bC1wcjk4NTM3LTEuQwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMC4uYjJiYTkxMTExZGEKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2crKy50 YXJnZXQvaTM4Ni9hdng1MTJ2bC1wcjk4NTM3LTEuQwpAQCAtMCwwICsxLDQwIEBACisvKiBQUiB0 YXJnZXQvOTg1MzcgKi8KKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMg Ii1PMiAtbWFyY2g9eDg2LTY0IC1zdGQ9YysrMTEiIH0gKi8KKworI2lmbmRlZiBUWVBFVgorI2Rl ZmluZSBUWVBFViBpbnQKKyNlbmRpZgorCisjaWZuZGVmIFRZUEVXCisjZGVmaW5lIFRZUEVXIGxv bmcgbG9uZworI2VuZGlmCisKKyNpZm5kZWYgVF9BUlIKKyNkZWZpbmUgVF9BUlIJCQkJCVwKKyAg X19hdHRyaWJ1dGVfXyAoKHRhcmdldCAoImF2eDUxMnZsIikpKQorI2VuZGlmCisKK3R5cGVkZWYg VFlQRVYgViBfX2F0dHJpYnV0ZV9fKChfX3ZlY3Rvcl9zaXplX18oMzIpKSk7Cit0eXBlZGVmIFRZ UEVXIFcgX19hdHRyaWJ1dGVfXygoX192ZWN0b3Jfc2l6ZV9fKDMyKSkpOworCitXIGMsIGQ7Citz dHJ1Y3QgQiB7fTsKK0IgZTsKK3N0cnVjdCBDIHsgVyBpOyB9Owordm9pZCBmb28gKEMpOworCitD CitvcGVyYXRvcj09IChCLCBCKQoreworICBXIHIgPSAoViljID09IChWKWQ7CisgIHJldHVybiB7 cn07Cit9CisKK3ZvaWQKK1RfQVJSCitiYXIgKCkKK3sKKyAgQiBhOworICBmb28gKGEgPT0gZSk7 Cit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2crKy50YXJnZXQvaTM4Ni9hdng1MTJ2bC1w cjk4NTM3LTIuQyBiL2djYy90ZXN0c3VpdGUvZysrLnRhcmdldC9pMzg2L2F2eDUxMnZsLXByOTg1 MzctMi5DCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi40MmM5NjgyNzQ2 ZAotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZysrLnRhcmdldC9pMzg2L2F2eDUx MnZsLXByOTg1MzctMi5DCkBAIC0wLDAgKzEsOCBAQAorLyogUFIgdGFyZ2V0Lzk4NTM3ICovCisv KiB7IGRnLWRvIGNvbXBpbGUgfSAqLworLyogeyBkZy1vcHRpb25zICItTzIgLW1hcmNoPXg4Ni02 NCAtc3RkPWMrKzExIiB9ICovCisKKyNkZWZpbmUgVFlQRVYgZmxvYXQKKyNkZWZpbmUgVFlQRVcg ZG91YmxlCisKKyNpbmNsdWRlICJhdng1MTJ2bC1wcjk4NTM3LTEuQyIKZGlmZiAtLWdpdCBhL2dj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMnZsLXByODg1NDctMS5jIGIvZ2NjL3Rl c3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4NTEydmwtcHI4ODU0Ny0xLmMKaW5kZXggYTNmZmVj YTQzNTQuLmFmMTVhNjM2NGE0IDEwMDY0NAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9hdng1MTJ2bC1wcjg4NTQ3LTEuYworKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9hdng1MTJ2bC1wcjg4NTQ3LTEuYwpAQCAtMSwxMiArMSwxNCBAQAogLyogUFIgdGFyZ2V0 Lzg4NTQ3ICovCiAvKiB7IGRnLWRvIGNvbXBpbGUgfSAqLwotLyogeyBkZy1vcHRpb25zICItTzIg LW1uby14b3AgLW1hdng1MTJ2bCAtbW5vLWF2eDUxMmJ3IC1tbm8tYXZ4NTEyZHEiIH0gKi8KKy8q IHsgZGctb3B0aW9ucyAiLU8yIC1tbm8teG9wIC1tYXZ4NTEydmwgLW1hdng1MTJidyAtbWF2eDUx MmRxIiB9ICovCiAvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICJ2cG1pbmd0XFti d2RxXVxbXHQgXSIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItbm90ICIl a1xbMC05XF0iIH0gfSAqLwogLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2 cG1pbnViXFtcdCBdIiAyIH0gfSAqLwogLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRp bWVzICJ2cG1pbnNiXFtcdCBdIiAyIH0gfSAqLwogLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1i bGVyLXRpbWVzICJ2cG1pbnV3XFtcdCBdIiAyIH0gfSAqLwogLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLXRpbWVzICJ2cG1pbnN3XFtcdCBdIiAyIH0gfSAqLwotLyogeyBkZy1maW5hbCB7 IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2cGNtcFxbZHFcXVxbXHQgXSIgNCB9IH0gKi8KLS8qIHsg ZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidnBjbXB1XFtkcVxdXFtcdCBdIiA0IH0g fSAqLwotLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2cHRlcm5sb2dcW3Fk XF1cW1x0IF0iIDggfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMg InZwbWludWRcW1x0IF0iIDIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXIt dGltZXMgInZwbWluc2RcW1x0IF0iIDIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItdGltZXMgInZwbWludXFcW1x0IF0iIDIgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nh bi1hc3NlbWJsZXItdGltZXMgInZwbWluc3FcW1x0IF0iIDIgfSB9ICovCiAjaW5jbHVkZSAiYXZ4 Mi1wcjg4NTQ3LTEuYyIKZGlmZiAtLWdpdCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2 L2F2eDUxMnZsLXByOTI2ODYtdnBjbXAtMS5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvYXZ4NTEydmwtcHI5MjY4Ni12cGNtcC0xLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDViNzlkNGQzNmY5Li4wMDAwMDAwMDAwMAotLS0gYS9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvaTM4Ni9hdng1MTJ2bC1wcjkyNjg2LXZwY21wLTEuYworKysgL2Rldi9udWxsCkBAIC0xLDEx MiArMCwwIEBACi0vKiBQUiB0YXJnZXQvODg1NDcgKi8KLS8qIHsgZGctZG8gY29tcGlsZSB9ICov Ci0vKiB7IGRnLW9wdGlvbnMgIi1PMiAtbWF2eDUxMmJ3IC1tYXZ4NTEydmwgLW1uby1hdng1MTJk cSAtbW5vLXhvcCIgfSAqLwotLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2 cGNtcFxbYndkcVxdXFtcdCBdIiA4IH0gfSAqLwotLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1i bGVyLXRpbWVzICJ2cGNtcHVcW2J3ZHFcXVxbXHQgXSIgOCB9IH0gKi8KLS8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci10aW1lcyAidnBtb3ZtMlxbYndcXVxbXHQgXSIgOCB9IH0gKi8KLS8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidnB0ZXJubG9nXFtkcVxdXFtcdCBd IiA4IH0gfSAqLwotCi10eXBlZGVmIHNpZ25lZCBjaGFyIHYzMnFpIF9fYXR0cmlidXRlX18oKHZl Y3Rvcl9zaXplKDMyKSkpOwotdHlwZWRlZiB1bnNpZ25lZCBjaGFyIHYzMnVxaSBfX2F0dHJpYnV0 ZV9fKCh2ZWN0b3Jfc2l6ZSgzMikpKTsKLXR5cGVkZWYgc2hvcnQgdjE2aGkgX19hdHRyaWJ1dGVf XygodmVjdG9yX3NpemUoMzIpKSk7Ci10eXBlZGVmIHVuc2lnbmVkIHNob3J0IHYxNnVoaSBfX2F0 dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgzMikpKTsKLXR5cGVkZWYgaW50IHY4c2kgX19hdHRyaWJ1 dGVfXygodmVjdG9yX3NpemUoMzIpKSk7Ci10eXBlZGVmIHVuc2lnbmVkIHY4dXNpIF9fYXR0cmli dXRlX18oKHZlY3Rvcl9zaXplKDMyKSkpOwotdHlwZWRlZiBsb25nIGxvbmcgdjRkaSBfX2F0dHJp YnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgzMikpKTsKLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHY0 dWRpIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9zaXplKDMyKSkpOwotCi1fX2F0dHJpYnV0ZV9fKChu b2lwYSkpIHYzMnFpCi1mMSAodjMycWkgeCwgdjMycWkgeSkKLXsKLSAgcmV0dXJuIHggPj0geTsK LX0KLQotX19hdHRyaWJ1dGVfXygobm9pcGEpKSB2MzJ1cWkKLWYyICh2MzJ1cWkgeCwgdjMydXFp IHkpCi17Ci0gIHJldHVybiB4ID49IHk7Ci19Ci0KLV9fYXR0cmlidXRlX18oKG5vaXBhKSkgdjMy cWkKLWYzICh2MzJxaSB4LCB2MzJxaSB5KQotewotICByZXR1cm4geCA8PSB5OwotfQotCi1fX2F0 dHJpYnV0ZV9fKChub2lwYSkpIHYzMnVxaQotZjQgKHYzMnVxaSB4LCB2MzJ1cWkgeSkKLXsKLSAg cmV0dXJuIHggPD0geTsKLX0KLQotX19hdHRyaWJ1dGVfXygobm9pcGEpKSB2MTZoaQotZjUgKHYx NmhpIHgsIHYxNmhpIHkpCi17Ci0gIHJldHVybiB4ID49IHk7Ci19Ci0KLV9fYXR0cmlidXRlX18o KG5vaXBhKSkgdjE2dWhpCi1mNiAodjE2dWhpIHgsIHYxNnVoaSB5KQotewotICByZXR1cm4geCA+ PSB5OwotfQotCi1fX2F0dHJpYnV0ZV9fKChub2lwYSkpIHYxNmhpCi1mNyAodjE2aGkgeCwgdjE2 aGkgeSkKLXsKLSAgcmV0dXJuIHggPD0geTsKLX0KLQotX19hdHRyaWJ1dGVfXygobm9pcGEpKSB2 MTZ1aGkKLWY4ICh2MTZ1aGkgeCwgdjE2dWhpIHkpCi17Ci0gIHJldHVybiB4IDw9IHk7Ci19Ci0K LV9fYXR0cmlidXRlX18oKG5vaXBhKSkgdjhzaQotZjkgKHY4c2kgeCwgdjhzaSB5KQotewotICBy ZXR1cm4geCA+PSB5OwotfQotCi1fX2F0dHJpYnV0ZV9fKChub2lwYSkpIHY4dXNpCi1mMTAgKHY4 dXNpIHgsIHY4dXNpIHkpCi17Ci0gIHJldHVybiB4ID49IHk7Ci19Ci0KLV9fYXR0cmlidXRlX18o KG5vaXBhKSkgdjhzaQotZjExICh2OHNpIHgsIHY4c2kgeSkKLXsKLSAgcmV0dXJuIHggPD0geTsK LX0KLQotX19hdHRyaWJ1dGVfXygobm9pcGEpKSB2OHVzaQotZjEyICh2OHVzaSB4LCB2OHVzaSB5 KQotewotICByZXR1cm4geCA8PSB5OwotfQotCi1fX2F0dHJpYnV0ZV9fKChub2lwYSkpIHY0ZGkK LWYxMyAodjRkaSB4LCB2NGRpIHkpCi17Ci0gIHJldHVybiB4ID49IHk7Ci19Ci0KLV9fYXR0cmli dXRlX18oKG5vaXBhKSkgdjR1ZGkKLWYxNCAodjR1ZGkgeCwgdjR1ZGkgeSkKLXsKLSAgcmV0dXJu IHggPj0geTsKLX0KLQotX19hdHRyaWJ1dGVfXygobm9pcGEpKSB2NGRpCi1mMTUgKHY0ZGkgeCwg djRkaSB5KQotewotICByZXR1cm4geCA8PSB5OwotfQotCi1fX2F0dHJpYnV0ZV9fKChub2lwYSkp IHY0dWRpCi1mMTYgKHY0dWRpIHgsIHY0dWRpIHkpCi17Ci0gIHJldHVybiB4IDw9IHk7Ci19CmRp ZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1MTJ2bC1wcjkyNjg2 LXZwY21wLTIuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMnZsLXByOTI2 ODYtdnBjbXAtMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmUyNGZmMzBmNC4u MDAwMDAwMDAwMDAKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4NTEydmwt cHI5MjY4Ni12cGNtcC0yLmMKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKiB7IGRn LWRvIHJ1biB9ICovCi0vKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBhdng1MTJidyB9 ICovCi0vKiB7IGRnLXJlcXVpcmUtZWZmZWN0aXZlLXRhcmdldCBhdng1MTJ2bCB9ICovCi0vKiB7 IGRnLW9wdGlvbnMgIi1PMiAtbWF2eDUxMmJ3IC1tYXZ4NTEydmwiIH0gKi8KLQotI2lmbmRlZiBD SEVDSwotI2RlZmluZSBDSEVDSyAiYXZ4NTEyZi1oZWxwZXIuaCIKLSNlbmRpZgotCi0jaW5jbHVk ZSBDSEVDSwotCi0jaWZuZGVmIFRFU1QKLSNkZWZpbmUgVEVTVCBhdng1MTJ2bF90ZXN0Ci0jZW5k aWYKLQotI2luY2x1ZGUgImF2eDUxMnZsLXByOTI2ODYtdnBjbXAtMS5jIgotCi0jZGVmaW5lIE5V TSAyNTYKLQotI2RlZmluZSBURVNUX1NJR05FRCh2dHlwZSwgdHlwZSwgTiwgZm4sIG9wKSBcCi1k bwkJCQkJCQkJXAotICB7CQkJCQkJCQlcCi0gICAgdW5pb24geyB2dHlwZSB4W05VTSAvIE5dOyB0 eXBlIGlbTlVNXTsgfSBkc3QsIHNyYzEsIHNyYzI7CVwKLSAgICBpbnQgaSwgc2lnbiA9IDE7CQkJ CQkJXAotICAgIHR5cGUgcmVzOwkJCQkJCQlcCi0gICAgZm9yIChpID0gMDsgaSA8IE5VTTsgaSsr KQkJCQkJXAotICAgICAgewkJCQkJCQkJXAotCXNyYzEuaVtpXSA9IGkgKiBpICogc2lnbjsJCQkJ XAotCXNyYzIuaVtpXSA9IChpICsgMjApICogc2lnbjsJCQkJXAotCXNpZ24gPSAtc2lnbjsJCQkJ CQlcCi0gICAgICB9CQkJCQkJCQlcCi0gICAgZm9yIChpID0gMDsgaSA8IE5VTTsgaSArPSBOKQkJ CQlcCi0gICAgICBkc3QueFtpIC8gTl0gPSBmbiAoc3JjMS54W2kgLyBOXSwgc3JjMi54W2kgLyBO XSk7CQlcCi0JCQkJCQkJCVwKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNOyBpKyspCQkJCQlcCi0g ICAgICB7CQkJCQkJCQlcCi0JcmVzID0gc3JjMS5pW2ldIG9wIHNyYzIuaVtpXSA/IC0xIDogMDsJ CQlcCi0JaWYgKHJlcyAhPSBkc3QuaVtpXSkJCQkJCVwKLQkgIGFib3J0ICgpOwkJCQkJCVwKLSAg ICAgIH0JCQkJCQkJCVwKLSAgfQkJCQkJCQkJXAotd2hpbGUgKDApCi0KLSNkZWZpbmUgVEVTVF9V TlNJR05FRCh2dHlwZSwgdHlwZSwgTiwgZm4sIG9wKSBcCi1kbwkJCQkJCQkJXAotICB7CQkJCQkJ CQlcCi0gICAgdW5pb24geyB2dHlwZSB4W05VTSAvIE5dOyB0eXBlIGlbTlVNXTsgfSBkc3QsIHNy YzEsIHNyYzI7CVwKLSAgICBpbnQgaTsJCQkJCQkJXAotICAgIHR5cGUgcmVzOwkJCQkJCQlcCi0J CQkJCQkJCVwKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNOyBpKyspCQkJCQlcCi0gICAgICB7CQkJ CQkJCQlcCi0Jc3JjMS5pW2ldID0gaSAqIGk7CQkJCQlcCi0Jc3JjMi5pW2ldID0gaSArIDIwOwkJ CQkJXAotCWlmICgoaSAlIDQpKQkJCQkJCVwKLQkgIHNyYzIuaVtpXSB8PSAoMVVMTCA8PCAoc2l6 ZW9mICh0eXBlKQkJCVwKLQkJCQkgKiBfX0NIQVJfQklUX18gLSAxKSk7CQlcCi0gICAgICB9CQkJ CQkJCQlcCi0JCQkJCQkJCVwKLSAgICBmb3IgKGkgPSAwOyBpIDwgTlVNOyBpICs9IE4pCQkJCVwK LSAgICAgIGRzdC54W2kgLyBOXSA9IGZuIChzcmMxLnhbaSAvIE5dLCBzcmMyLnhbaSAvIE5dKTsJ CVwKLQkJCQkJCQkJXAotICAgIGZvciAoaSA9IDA7IGkgPCBOVU07IGkrKykJCQkJCVwKLSAgICAg IHsJCQkJCQkJCVwKLQlyZXMgPSBzcmMxLmlbaV0gb3Agc3JjMi5pW2ldID8gLTEgOiAwOwkJCVwK LQlpZiAocmVzICE9IGRzdC5pW2ldKQkJCQkJXAotCSAgYWJvcnQgKCk7CQkJCQkJXAotICAgICAg fQkJCQkJCQkJXAotICB9CQkJCQkJCQlcCi13aGlsZSAoMCkKLQotc3RhdGljIHZvaWQKLVRFU1Qg KHZvaWQpCi17Ci0gIFRFU1RfU0lHTkVEICh2MzJxaSwgc2lnbmVkIGNoYXIsIDMyLCBmMSwgPj0p OwotICBURVNUX1VOU0lHTkVEICh2MzJ1cWksIHVuc2lnbmVkIGNoYXIsIDMyLCBmMiwgPj0pOwot ICBURVNUX1NJR05FRCAodjMycWksIHNpZ25lZCBjaGFyLCAzMiwgZjMsIDw9KTsKLSAgVEVTVF9V TlNJR05FRCAodjMydXFpLCB1bnNpZ25lZCBjaGFyLCAzMiwgZjQsIDw9KTsKLSAgVEVTVF9TSUdO RUQgKHYxNmhpLCBzaG9ydCBpbnQsIDE2LCBmNSwgPj0pOwotICBURVNUX1VOU0lHTkVEICh2MTZ1 aGksIHVuc2lnbmVkIHNob3J0IGludCwgMTYsIGY2LCA+PSk7Ci0gIFRFU1RfU0lHTkVEICh2MTZo aSwgc2hvcnQgaW50LCAxNiwgZjcsIDw9KTsKLSAgVEVTVF9VTlNJR05FRCAodjE2dWhpLCB1bnNp Z25lZCBzaG9ydCBpbnQsIDE2LCBmOCwgPD0pOwotICBURVNUX1NJR05FRCAodjhzaSwgaW50LCA4 LCBmOSwgPj0pOwotICBURVNUX1VOU0lHTkVEICh2OHVzaSwgdW5zaWduZWQgaW50LCA4LCBmMTAs ID49KTsKLSAgVEVTVF9TSUdORUQgKHY4c2ksIGludCwgOCwgZjExLCA8PSk7Ci0gIFRFU1RfVU5T SUdORUQgKHY4dXNpLCB1bnNpZ25lZCBpbnQsIDgsIGYxMiwgPD0pOwotICBURVNUX1NJR05FRCAo djRkaSwgbG9uZyBsb25nIGludCwgNCwgZjEzLCA+PSk7Ci0gIFRFU1RfVU5TSUdORUQgKHY0dWRp LCB1bnNpZ25lZCBsb25nIGxvbmcgaW50LCA0LCBmMTQsID49KTsKLSAgVEVTVF9TSUdORUQgKHY0 ZGksIGxvbmcgbG9uZyBpbnQsIDQsIGYxNSwgPD0pOwotICBURVNUX1VOU0lHTkVEICh2NHVkaSwg dW5zaWduZWQgbG9uZyBsb25nIGludCwgNCwgZjE2LCA8PSk7Ci19CmRpZmYgLS1naXQgYS9nY2Mv dGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1MTJ2bC1wcjkyNjg2LXZwY21wLWludGVsYXNt LTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMnZsLXByOTI2ODYtdnBj bXAtaW50ZWxhc20tMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDczODZkYjA4 Yi4uMDAwMDAwMDAwMDAKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4NTEy dmwtcHI5MjY4Ni12cGNtcC1pbnRlbGFzbS0xLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAs MCBAQAotLyogUFIgdGFyZ2V0Lzg4NTQ3ICovCi0vKiB7IGRnLWRvIGFzc2VtYmxlIH0gKi8KLS8q IHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IG1hc21faW50ZWwgfSAqLwotLyogeyBkZy1v cHRpb25zICItTzIgLW1hdng1MTJidyAtbWF2eDUxMnZsIC1tbm8tYXZ4NTEyZHEgLW1uby14b3Ag LW1hc209aW50ZWwiIH0gKi8KLS8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGF2eDUx MmJ3IH0gKi8KLS8qIHsgZGctcmVxdWlyZS1lZmZlY3RpdmUtdGFyZ2V0IGF2eDUxMnZsIH0gKi8K LQotdHlwZWRlZiBzaWduZWQgY2hhciB2MzJxaSBfX2F0dHJpYnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgz MikpKTsKLXR5cGVkZWYgdW5zaWduZWQgY2hhciB2MzJ1cWkgX19hdHRyaWJ1dGVfXygodmVjdG9y X3NpemUoMzIpKSk7Ci10eXBlZGVmIHNob3J0IHYxNmhpIF9fYXR0cmlidXRlX18oKHZlY3Rvcl9z aXplKDMyKSkpOwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCB2MTZ1aGkgX19hdHRyaWJ1dGVfXygo dmVjdG9yX3NpemUoMzIpKSk7Ci10eXBlZGVmIGludCB2OHNpIF9fYXR0cmlidXRlX18oKHZlY3Rv cl9zaXplKDMyKSkpOwotdHlwZWRlZiB1bnNpZ25lZCB2OHVzaSBfX2F0dHJpYnV0ZV9fKCh2ZWN0 b3Jfc2l6ZSgzMikpKTsKLXR5cGVkZWYgbG9uZyBsb25nIHY0ZGkgX19hdHRyaWJ1dGVfXygodmVj dG9yX3NpemUoMzIpKSk7Ci10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB2NHVkaSBfX2F0dHJp YnV0ZV9fKCh2ZWN0b3Jfc2l6ZSgzMikpKTsKLQotX19hdHRyaWJ1dGVfXygobm9pcGEpKSB2MzJx aQotZjEgKHYzMnFpIHgsIHYzMnFpIHkpCi17Ci0gIHJldHVybiB4ID49IHk7Ci19Ci0KLV9fYXR0 cmlidXRlX18oKG5vaXBhKSkgdjMydXFpCi1mMiAodjMydXFpIHgsIHYzMnVxaSB5KQotewotICBy ZXR1cm4geCA+PSB5OwotfQotCi1fX2F0dHJpYnV0ZV9fKChub2lwYSkpIHYzMnFpCi1mMyAodjMy cWkgeCwgdjMycWkgeSkKLXsKLSAgcmV0dXJuIHggPD0geTsKLX0KLQotX19hdHRyaWJ1dGVfXygo bm9pcGEpKSB2MzJ1cWkKLWY0ICh2MzJ1cWkgeCwgdjMydXFpIHkpCi17Ci0gIHJldHVybiB4IDw9 IHk7Ci19Ci0KLV9fYXR0cmlidXRlX18oKG5vaXBhKSkgdjE2aGkKLWY1ICh2MTZoaSB4LCB2MTZo aSB5KQotewotICByZXR1cm4geCA+PSB5OwotfQotCi1fX2F0dHJpYnV0ZV9fKChub2lwYSkpIHYx NnVoaQotZjYgKHYxNnVoaSB4LCB2MTZ1aGkgeSkKLXsKLSAgcmV0dXJuIHggPj0geTsKLX0KLQot X19hdHRyaWJ1dGVfXygobm9pcGEpKSB2MTZoaQotZjcgKHYxNmhpIHgsIHYxNmhpIHkpCi17Ci0g IHJldHVybiB4IDw9IHk7Ci19Ci0KLV9fYXR0cmlidXRlX18oKG5vaXBhKSkgdjE2dWhpCi1mOCAo djE2dWhpIHgsIHYxNnVoaSB5KQotewotICByZXR1cm4geCA8PSB5OwotfQotCi1fX2F0dHJpYnV0 ZV9fKChub2lwYSkpIHY4c2kKLWY5ICh2OHNpIHgsIHY4c2kgeSkKLXsKLSAgcmV0dXJuIHggPj0g eTsKLX0KLQotX19hdHRyaWJ1dGVfXygobm9pcGEpKSB2OHVzaQotZjEwICh2OHVzaSB4LCB2OHVz aSB5KQotewotICByZXR1cm4geCA+PSB5OwotfQotCi1fX2F0dHJpYnV0ZV9fKChub2lwYSkpIHY4 c2kKLWYxMSAodjhzaSB4LCB2OHNpIHkpCi17Ci0gIHJldHVybiB4IDw9IHk7Ci19Ci0KLV9fYXR0 cmlidXRlX18oKG5vaXBhKSkgdjh1c2kKLWYxMiAodjh1c2kgeCwgdjh1c2kgeSkKLXsKLSAgcmV0 dXJuIHggPD0geTsKLX0KLQotX19hdHRyaWJ1dGVfXygobm9pcGEpKSB2NGRpCi1mMTMgKHY0ZGkg eCwgdjRkaSB5KQotewotICByZXR1cm4geCA+PSB5OwotfQotCi1fX2F0dHJpYnV0ZV9fKChub2lw YSkpIHY0dWRpCi1mMTQgKHY0dWRpIHgsIHY0dWRpIHkpCi17Ci0gIHJldHVybiB4ID49IHk7Ci19 Ci0KLV9fYXR0cmlidXRlX18oKG5vaXBhKSkgdjRkaQotZjE1ICh2NGRpIHgsIHY0ZGkgeSkKLXsK LSAgcmV0dXJuIHggPD0geTsKLX0KLQotX19hdHRyaWJ1dGVfXygobm9pcGEpKSB2NHVkaQotZjE2 ICh2NHVkaSB4LCB2NHVkaSB5KQotewotICByZXR1cm4geCA8PSB5OwotfQotLSAKMi4xOC4xCgo= --0000000000008de21c05b9c6ea54--