From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x635.google.com (mail-ej1-x635.google.com [IPv6:2a00:1450:4864:20::635]) by sourceware.org (Postfix) with ESMTPS id 57D683856241 for ; Mon, 23 May 2022 08:48:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 57D683856241 Received: by mail-ej1-x635.google.com with SMTP id y13so26510948eje.2 for ; Mon, 23 May 2022 01:48:18 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to; bh=WmLqQTlWxEW6wa54ux7s/vuCNFhdQ5QLavr56VLem28=; b=fRYvAOuqoAJ98Ut+0C2xt7IVXyB4PYUWymxdpY1YWELETFmklcnR9YTTVpysGmfTcg kv0tG8UVNJtYkt8An8J+idNZ7bPn43aaJnOvZ9U8Gu1QFnSX1uO/6OC27rVljy0UqEHn VP0FtDsZAEqITgsXRjL33/vHRkJYmiQEcUCVfMbb+Xa2HtiO0csNpnxJxpQolgoGbPAN K6hg+PkBwQiAOi3Zk8RYQh9rMPMvW/TLIGhX5XC7eSzMGnHEC2bsWApxK1Z4KPvJa6/j 5+zdcXOwJKKpnTTZ1Pqr21XRp2lAptBSokvofFJsseQwydsjJ4pR+l4MmNOyTvvWEcXi JzPw== X-Gm-Message-State: AOAM533vg0tUorTRud9PORwilUeYE0d2n7WaOZyUDt45x89im6L9Cnm3 rDipdYPfCKLwtBNveXWEZbn+GkvZM/thRSIiZvizNA== X-Google-Smtp-Source: ABdhPJw8Abe0hhiWGuiqYYNSbC9mL8EqPWgatGFyRyEQSJETEkrH4/ZsFUkCrBBqwbVOpbbIDtIX83/MMDEftv2Pjys= X-Received: by 2002:a17:907:160e:b0:6f4:54c0:657e with SMTP id hb14-20020a170907160e00b006f454c0657emr19122157ejc.253.1653295697085; Mon, 23 May 2022 01:48:17 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Prathamesh Kulkarni Date: Mon, 23 May 2022 14:17:41 +0530 Message-ID: Subject: Re: [0/9] [middle-end] Add param to vec_perm_const hook to specify mode of input operand To: Prathamesh Kulkarni , gcc Patches , richard.sandiford@arm.com Content-Type: multipart/mixed; boundary="000000000000bc021005dfa9e67b" X-Spam-Status: No, score=-8.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SCC_5_SHORT_WORD_LINES, 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 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: Mon, 23 May 2022 08:48:22 -0000 --000000000000bc021005dfa9e67b Content-Type: text/plain; charset="UTF-8" On Wed, 18 May 2022 at 17:27, Richard Sandiford wrote: > > Prathamesh Kulkarni writes: > > Hi, > > The attached patch adds another parameter machine_mode op_mode to vec_perm_const > > hook to specify mode of input operands. The motivation for doing this > > is PR96463, > > where we create vec_perm_expr of the form: > > lhs = vec_perm_expr > > where lhs and rhs have different vector types but same element type > > (lhs is SVE and rhs is corresponding advsimd vector). > > > > It seems the following targets were affected: aarch64, i386, arm, ia64, > > mips, rs6000, s390, sparc, gcn. > > > > Bootstrapped+tested on x86_64-linux-gnu, aarch64-linux-gnu. > > For other targets, I did make all-gcc stage1, which seems to build OK. > > > > Thanks, > > Prathamesh > > > > diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi > > index c5006afc00d..31ff6ef3f92 100644 > > --- a/gcc/doc/tm.texi > > +++ b/gcc/doc/tm.texi > > @@ -6088,7 +6088,7 @@ for the given scalar type @var{type}. @var{is_packed} is false if the scalar > > access using @var{type} is known to be naturally aligned. > > @end deftypefn > > > > -@deftypefn {Target Hook} bool TARGET_VECTORIZE_VEC_PERM_CONST (machine_mode @var{mode}, rtx @var{output}, rtx @var{in0}, rtx @var{in1}, const vec_perm_indices @var{&sel}) > > +@deftypefn {Target Hook} bool TARGET_VECTORIZE_VEC_PERM_CONST (machine_mode @var{mode}, machine_mode @var{op_mode}, rtx @var{output}, rtx @var{in0}, rtx @var{in1}, const vec_perm_indices @var{&sel}) > > This hook is used to test whether the target can permute up to two > > vectors of mode @var{mode} using the permutation vector @code{sel}, and > > also to emit such a permutation. In the former case @var{in0}, @var{in1} > > Like Andre says, the documentation should describe op_mode (and mode). > > > diff --git a/gcc/optabs-query.cc b/gcc/optabs-query.cc > > index 68dc679cc6a..aef9d4c5d28 100644 > > --- a/gcc/optabs-query.cc > > +++ b/gcc/optabs-query.cc > > @@ -417,8 +417,8 @@ can_vec_perm_var_p (machine_mode mode) > > with here. */ > > > > bool > > -can_vec_perm_const_p (machine_mode mode, const vec_perm_indices &sel, > > - bool allow_variable_p) > > +can_vec_perm_const_p (machine_mode mode, machine_mode op_mode, > > + const vec_perm_indices &sel, bool allow_variable_p) > > { > > The function comment should describe the new parameter. > > > /* If the target doesn't implement a vector mode for the vector type, > > then no operations are supported. */ > > @@ -448,7 +448,7 @@ can_vec_perm_const_p (machine_mode mode, const vec_perm_indices &sel, > > > > if (targetm.vectorize.vec_perm_const != NULL) > > { > > - if (targetm.vectorize.vec_perm_const (mode, NULL_RTX, NULL_RTX, > > + if (targetm.vectorize.vec_perm_const (mode, op_mode, NULL_RTX, NULL_RTX, > > NULL_RTX, sel)) > > return true; > > > > @@ -462,6 +462,13 @@ can_vec_perm_const_p (machine_mode mode, const vec_perm_indices &sel, > > return false; > > } > > > > +bool > > +can_vec_perm_const_p (machine_mode mode, const vec_perm_indices &sel, > > + bool allow_variable_p) > > +{ > > + return can_vec_perm_const_p (mode, mode, sel, allow_variable_p); > > +} > > + > > I can understand why you went for this, but now that we've opened > the door to mismatched modes, I think it would be better if all callers > specified the input mode explicitly. > > > diff --git a/gcc/optabs.cc b/gcc/optabs.cc > > index 3d8fa3abdfe..55f10c41789 100644 > > --- a/gcc/optabs.cc > > +++ b/gcc/optabs.cc > > @@ -6250,7 +6250,9 @@ expand_vec_perm_const (machine_mode mode, rtx v0, rtx v1, > > if (single_arg_p) > > v1 = v0; > > > > - if (targetm.vectorize.vec_perm_const (mode, target, v0, v1, indices)) > > + gcc_checking_assert (GET_MODE (v0) == GET_MODE (v1)); > > + machine_mode op_mode = GET_MODE (v0); > > + if (targetm.vectorize.vec_perm_const (mode, op_mode, target, v0, v1, indices)) > > return target; > > } > > > > (FWIW, I agree the assert is worth having.) Hi, I updated the patch with doc and adjusted callers to explicitly pass op_mode. Bootstrapped + tested on x86_64-linux-gnu and aarch64-linux-gnu. Does it look OK to commit ? Thanks, Prathamesh > > Thanks, > Richard > > > @@ -6264,7 +6266,7 @@ expand_vec_perm_const (machine_mode mode, rtx v0, rtx v1, > > v0_qi = gen_lowpart (qimode, v0); > > v1_qi = gen_lowpart (qimode, v1); > > if (targetm.vectorize.vec_perm_const != NULL > > - && targetm.vectorize.vec_perm_const (qimode, target_qi, v0_qi, > > + && targetm.vectorize.vec_perm_const (qimode, qimode, target_qi, v0_qi, > > v1_qi, qimode_indices)) > > return gen_lowpart (mode, target_qi); > > } > > diff --git a/gcc/target.def b/gcc/target.def > > index d85adf36a39..2713c31dc3f 100644 > > --- a/gcc/target.def > > +++ b/gcc/target.def > > @@ -1894,7 +1894,7 @@ try the equivalent byte operation. If that also fails, it will try forcing\n\ > > the selector into a register and using the @var{vec_perm@var{mode}}\n\ > > instruction pattern. There is no need for the hook to handle these two\n\ > > implementation approaches itself.", > > - bool, (machine_mode mode, rtx output, rtx in0, rtx in1, > > + bool, (machine_mode mode, machine_mode op_mode, rtx output, rtx in0, rtx in1, > > const vec_perm_indices &sel), > > NULL) > > --000000000000bc021005dfa9e67b Content-Type: text/plain; charset="US-ASCII"; name="vec-perm-const-2-midend.txt" Content-Disposition: attachment; filename="vec-perm-const-2-midend.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_l3gz86an0 ZGlmZiAtLWdpdCBhL2djYy9kb2MvdG0udGV4aSBiL2djYy9kb2MvdG0udGV4aQppbmRleCBjNTAw NmFmYzAwZC4uZjUzMDY4YzVjNTMgMTAwNjQ0Ci0tLSBhL2djYy9kb2MvdG0udGV4aQorKysgYi9n Y2MvZG9jL3RtLnRleGkKQEAgLTYwODgsMTMgKzYwODgsMTMgQEAgZm9yIHRoZSBnaXZlbiBzY2Fs YXIgdHlwZSBAdmFye3R5cGV9LiAgQHZhcntpc19wYWNrZWR9IGlzIGZhbHNlIGlmIHRoZSBzY2Fs YXIKIGFjY2VzcyB1c2luZyBAdmFye3R5cGV9IGlzIGtub3duIHRvIGJlIG5hdHVyYWxseSBhbGln bmVkLgogQGVuZCBkZWZ0eXBlZm4KIAotQGRlZnR5cGVmbiB7VGFyZ2V0IEhvb2t9IGJvb2wgVEFS R0VUX1ZFQ1RPUklaRV9WRUNfUEVSTV9DT05TVCAobWFjaGluZV9tb2RlIEB2YXJ7bW9kZX0sIHJ0 eCBAdmFye291dHB1dH0sIHJ0eCBAdmFye2luMH0sIHJ0eCBAdmFye2luMX0sIGNvbnN0IHZlY19w ZXJtX2luZGljZXMgQHZhcnsmc2VsfSkKK0BkZWZ0eXBlZm4ge1RhcmdldCBIb29rfSBib29sIFRB UkdFVF9WRUNUT1JJWkVfVkVDX1BFUk1fQ09OU1QgKG1hY2hpbmVfbW9kZSBAdmFye21vZGV9LCBt YWNoaW5lX21vZGUgQHZhcntvcF9tb2RlfSwgcnR4IEB2YXJ7b3V0cHV0fSwgcnR4IEB2YXJ7aW4w fSwgcnR4IEB2YXJ7aW4xfSwgY29uc3QgdmVjX3Blcm1faW5kaWNlcyBAdmFyeyZzZWx9KQogVGhp cyBob29rIGlzIHVzZWQgdG8gdGVzdCB3aGV0aGVyIHRoZSB0YXJnZXQgY2FuIHBlcm11dGUgdXAg dG8gdHdvCi12ZWN0b3JzIG9mIG1vZGUgQHZhcnttb2RlfSB1c2luZyB0aGUgcGVybXV0YXRpb24g dmVjdG9yIEBjb2Rle3NlbH0sIGFuZAordmVjdG9ycyBvZiBtb2RlIEB2YXJ7b3BfbW9kZX0gdXNp bmcgdGhlIHBlcm11dGF0aW9uIHZlY3RvciBAY29kZXtzZWx9LCBhbmQKIGFsc28gdG8gZW1pdCBz dWNoIGEgcGVybXV0YXRpb24uICBJbiB0aGUgZm9ybWVyIGNhc2UgQHZhcntpbjB9LCBAdmFye2lu MX0KIGFuZCBAdmFye291dH0gYXJlIGFsbCBudWxsLiAgSW4gdGhlIGxhdHRlciBjYXNlIEB2YXJ7 aW4wfSBhbmQgQHZhcntpbjF9IGFyZQotdGhlIHNvdXJjZSB2ZWN0b3JzIGFuZCBAdmFye291dH0g aXMgdGhlIGRlc3RpbmF0aW9uIHZlY3RvcjsgYWxsIHRocmVlIGFyZQotb3BlcmFuZHMgb2YgbW9k ZSBAdmFye21vZGV9LiAgQHZhcntpbjF9IGlzIHRoZSBzYW1lIGFzIEB2YXJ7aW4wfSBpZgordGhl IHNvdXJjZSB2ZWN0b3JzIG9mIG1vZGUgQHZhcntvcF9tb2RlfSBhbmQgQHZhcntvdXR9IGlzIHRo ZSBkZXN0aW5hdGlvbiB2ZWN0b3IKK29mIG1vZGUgQHZhcnttb2RlfS4gIEB2YXJ7aW4xfSBpcyB0 aGUgc2FtZSBhcyBAdmFye2luMH0gaWYKIEB2YXJ7c2VsfSBkZXNjcmliZXMgYSBwZXJtdXRhdGlv biBvbiBvbmUgdmVjdG9yIGluc3RlYWQgb2YgdHdvLgogCiBSZXR1cm4gdHJ1ZSBpZiB0aGUgb3Bl cmF0aW9uIGlzIHBvc3NpYmxlLCBlbWl0dGluZyBpbnN0cnVjdGlvbnMgZm9yIGl0CmRpZmYgLS1n aXQgYS9nY2MvbWF0Y2gucGQgYi9nY2MvbWF0Y2gucGQKaW5kZXggZjVlZmE3NzU2MGMuLmIwNmQ3 MDEzNjAzIDEwMDY0NAotLS0gYS9nY2MvbWF0Y2gucGQKKysrIGIvZ2NjL21hdGNoLnBkCkBAIC03 NzAzLDEyICs3NzAzLDE0IEBAIGFuZCwKIAkgICAgICAgMi1hcmd1bWVudCB2ZXJzaW9uLiAgKi8K IAkgICAgdHJlZSBvbGRvcDIgPSBvcDI7CiAJICAgIGlmIChzZWwubmlucHV0cyAoKSA9PSAyCi0J ICAgICAgIHx8IGNhbl92ZWNfcGVybV9jb25zdF9wIChUWVBFX01PREUgKHR5cGUpLCBzZWwsIGZh bHNlKSkKKwkgICAgICAgfHwgY2FuX3ZlY19wZXJtX2NvbnN0X3AgKFRZUEVfTU9ERSAodHlwZSks IFRZUEVfTU9ERSAodHlwZSksCisJCQkJCXNlbCwgZmFsc2UpKQogCSAgICAgIG9wMiA9IHZlY19w ZXJtX2luZGljZXNfdG9fdHJlZSAoVFJFRV9UWVBFIChvcDIpLCBzZWwpOwogCSAgICBlbHNlCiAJ ICAgICAgewogCSAgICAgICAgdmVjX3Blcm1faW5kaWNlcyBzZWwyIChidWlsZGVyLCAyLCBuZWx0 cyk7Ci0JICAgICAgICBpZiAoY2FuX3ZlY19wZXJtX2NvbnN0X3AgKFRZUEVfTU9ERSAodHlwZSks IHNlbDIsIGZhbHNlKSkKKwkJaWYgKGNhbl92ZWNfcGVybV9jb25zdF9wIChUWVBFX01PREUgKHR5 cGUpLCBUWVBFX01PREUgKHR5cGUpLAorCQkJCQkgIHNlbDIsIGZhbHNlKSkKIAkgICAgICAgICAg b3AyID0gdmVjX3Blcm1faW5kaWNlc190b190cmVlIChUUkVFX1RZUEUgKG9wMiksIHNlbDIpOwog CSAgICAgICAgZWxzZQogCSAgICAgICAgICAvKiBOb3QgZGlyZWN0bHkgc3VwcG9ydGVkIHdpdGgg ZWl0aGVyIGVuY29kaW5nLApkaWZmIC0tZ2l0IGEvZ2NjL29wdGFicy1xdWVyeS5jYyBiL2djYy9v cHRhYnMtcXVlcnkuY2MKaW5kZXggNjhkYzY3OWNjNmEuLjgwOTQ4MmI4MDkyIDEwMDY0NAotLS0g YS9nY2Mvb3B0YWJzLXF1ZXJ5LmNjCisrKyBiL2djYy9vcHRhYnMtcXVlcnkuY2MKQEAgLTQwNyw5 ICs0MDcsOSBAQCBjYW5fdmVjX3Blcm1fdmFyX3AgKG1hY2hpbmVfbW9kZSBtb2RlKQogfQogCiAv KiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGRpcmVjdGx5IHN1cHBvcnRzIFZFQ19QRVJNX0VY UFJzIG9uIHZlY3RvcnMKLSAgIG9mIG1vZGUgTU9ERSB1c2luZyB0aGUgc2VsZWN0b3IgU0VMLiAg QUxMT1dfVkFSSUFCTEVfUCBpcyB0cnVlIGlmIGl0Ci0gICBpcyBhY2NlcHRhYmxlIHRvIGZvcmNl IHRoZSBzZWxlY3RvciBpbnRvIGEgcmVnaXN0ZXIgYW5kIHVzZSBhIHZhcmlhYmxlCi0gICBwZXJt dXRlIChpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIHRoYXQpLgorICAgb2YgbW9kZSBPUF9NT0RFIGFu ZCByZXN1bHQgdmVjdG9yIG9mIG1vZGUgTU9ERSB1c2luZyB0aGUgc2VsZWN0b3IgU0VMLgorICAg QUxMT1dfVkFSSUFCTEVfUCBpcyB0cnVlIGlmIGl0IGlzIGFjY2VwdGFibGUgdG8gZm9yY2UgdGhl IHNlbGVjdG9yIGludG8gYQorICAgcmVnaXN0ZXIgYW5kIHVzZSBhIHZhcmlhYmxlIHBlcm11dGUg KGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgdGhhdCkuCiAKICAgIE5vdGUgdGhhdCBhZGRpdGlvbmFs IHBlcm11dGF0aW9ucyByZXByZXNlbnRpbmcgd2hvbGUtdmVjdG9yIHNoaWZ0cyBtYXkKICAgIGFs c28gYmUgaGFuZGxlZCB2aWEgdGhlIHZlY19zaHIgb3IgdmVjX3NobCBvcHRhYiwgYnV0IG9ubHkg d2hlcmUgdGhlCkBAIC00MTcsOCArNDE3LDggQEAgY2FuX3ZlY19wZXJtX3Zhcl9wIChtYWNoaW5l X21vZGUgbW9kZSkKICAgIHdpdGggaGVyZS4gICovCiAKIGJvb2wKLWNhbl92ZWNfcGVybV9jb25z dF9wIChtYWNoaW5lX21vZGUgbW9kZSwgY29uc3QgdmVjX3Blcm1faW5kaWNlcyAmc2VsLAotCQkg ICAgICBib29sIGFsbG93X3ZhcmlhYmxlX3ApCitjYW5fdmVjX3Blcm1fY29uc3RfcCAobWFjaGlu ZV9tb2RlIG1vZGUsIG1hY2hpbmVfbW9kZSBvcF9tb2RlLAorCQkgICAgICBjb25zdCB2ZWNfcGVy bV9pbmRpY2VzICZzZWwsIGJvb2wgYWxsb3dfdmFyaWFibGVfcCkKIHsKICAgLyogSWYgdGhlIHRh cmdldCBkb2Vzbid0IGltcGxlbWVudCBhIHZlY3RvciBtb2RlIGZvciB0aGUgdmVjdG9yIHR5cGUs CiAgICAgIHRoZW4gbm8gb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLiAgKi8KQEAgLTQ0OCw3ICs0 NDgsNyBAQCBjYW5fdmVjX3Blcm1fY29uc3RfcCAobWFjaGluZV9tb2RlIG1vZGUsIGNvbnN0IHZl Y19wZXJtX2luZGljZXMgJnNlbCwKIAogICBpZiAodGFyZ2V0bS52ZWN0b3JpemUudmVjX3Blcm1f Y29uc3QgIT0gTlVMTCkKICAgICB7Ci0gICAgICBpZiAodGFyZ2V0bS52ZWN0b3JpemUudmVjX3Bl cm1fY29uc3QgKG1vZGUsIE5VTExfUlRYLCBOVUxMX1JUWCwKKyAgICAgIGlmICh0YXJnZXRtLnZl Y3Rvcml6ZS52ZWNfcGVybV9jb25zdCAobW9kZSwgb3BfbW9kZSwgTlVMTF9SVFgsIE5VTExfUlRY LAogCQkJCQkgICAgTlVMTF9SVFgsIHNlbCkpCiAJcmV0dXJuIHRydWU7CiAKQEAgLTUzNCw3ICs1 MzQsNyBAQCBjYW5fbXVsdF9oaWdocGFydF9wIChtYWNoaW5lX21vZGUgbW9kZSwgYm9vbCB1bnNf cCkKIAkJCSAgICArIChpICYgfjEpCiAJCQkgICAgKyAoKGkgJiAxKSA/IG51bml0cyA6IDApKTsK IAkgIHZlY19wZXJtX2luZGljZXMgaW5kaWNlcyAoc2VsLCAyLCBudW5pdHMpOwotCSAgaWYgKGNh bl92ZWNfcGVybV9jb25zdF9wIChtb2RlLCBpbmRpY2VzKSkKKwkgIGlmIChjYW5fdmVjX3Blcm1f Y29uc3RfcCAobW9kZSwgbW9kZSwgaW5kaWNlcykpCiAJICAgIHJldHVybiAyOwogCX0KICAgICB9 CkBAIC01NTAsNyArNTUwLDcgQEAgY2FuX211bHRfaGlnaHBhcnRfcCAobWFjaGluZV9tb2RlIG1v ZGUsIGJvb2wgdW5zX3ApCiAJICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDM7ICsraSkK IAkgICAgc2VsLnF1aWNrX3B1c2ggKDIgKiBpICsgKEJZVEVTX0JJR19FTkRJQU4gPyAwIDogMSkp OwogCSAgdmVjX3Blcm1faW5kaWNlcyBpbmRpY2VzIChzZWwsIDIsIG51bml0cyk7Ci0JICBpZiAo Y2FuX3ZlY19wZXJtX2NvbnN0X3AgKG1vZGUsIGluZGljZXMpKQorCSAgaWYgKGNhbl92ZWNfcGVy bV9jb25zdF9wIChtb2RlLCBtb2RlLCBpbmRpY2VzKSkKIAkgICAgcmV0dXJuIDM7CiAJfQogICAg IH0KZGlmZiAtLWdpdCBhL2djYy9vcHRhYnMtcXVlcnkuaCBiL2djYy9vcHRhYnMtcXVlcnkuaApp bmRleCBiOWM5ZmQ2ZjY0ZC4uMzJlNTJiMjAxMDkgMTAwNjQ0Ci0tLSBhL2djYy9vcHRhYnMtcXVl cnkuaAorKysgYi9nY2Mvb3B0YWJzLXF1ZXJ5LmgKQEAgLTE3OCw3ICsxNzgsNyBAQCBib29sIGNh bl9jb25kaXRpb25hbGx5X21vdmVfcCAobWFjaGluZV9tb2RlIG1vZGUpOwogb3B0X21hY2hpbmVf bW9kZSBxaW1vZGVfZm9yX3ZlY19wZXJtIChtYWNoaW5lX21vZGUpOwogYm9vbCBzZWxlY3Rvcl9m aXRzX21vZGVfcCAobWFjaGluZV9tb2RlLCBjb25zdCB2ZWNfcGVybV9pbmRpY2VzICYpOwogYm9v bCBjYW5fdmVjX3Blcm1fdmFyX3AgKG1hY2hpbmVfbW9kZSk7Ci1ib29sIGNhbl92ZWNfcGVybV9j b25zdF9wIChtYWNoaW5lX21vZGUsIGNvbnN0IHZlY19wZXJtX2luZGljZXMgJiwKK2Jvb2wgY2Fu X3ZlY19wZXJtX2NvbnN0X3AgKG1hY2hpbmVfbW9kZSwgbWFjaGluZV9tb2RlLCBjb25zdCB2ZWNf cGVybV9pbmRpY2VzICYsCiAJCQkgICBib29sID0gdHJ1ZSk7CiAvKiBGaW5kIGEgd2lkZW5pbmcg b3B0YWIgZXZlbiBpZiBpdCBkb2Vzbid0IHdpZGVuIGFzIG11Y2ggYXMgd2Ugd2FudC4gICovCiAj ZGVmaW5lIGZpbmRfd2lkZW5pbmdfb3B0YWJfaGFuZGxlcihBLCBCLCBDKSBcCmRpZmYgLS1naXQg YS9nY2Mvb3B0YWJzLmNjIGIvZ2NjL29wdGFicy5jYwppbmRleCAzZDhmYTNhYmRmZS4uYzBhNjg0 NzFkMmQgMTAwNjQ0Ci0tLSBhL2djYy9vcHRhYnMuY2MKKysrIGIvZ2NjL29wdGFicy5jYwpAQCAt NjI1MCw3ICs2MjUwLDEwIEBAIGV4cGFuZF92ZWNfcGVybV9jb25zdCAobWFjaGluZV9tb2RlIG1v ZGUsIHJ0eCB2MCwgcnR4IHYxLAogICAgICAgaWYgKHNpbmdsZV9hcmdfcCkKIAl2MSA9IHYwOwog Ci0gICAgICBpZiAodGFyZ2V0bS52ZWN0b3JpemUudmVjX3Blcm1fY29uc3QgKG1vZGUsIHRhcmdl dCwgdjAsIHYxLCBpbmRpY2VzKSkKKyAgICAgIGdjY19jaGVja2luZ19hc3NlcnQgKEdFVF9NT0RF ICh2MCkgPT0gR0VUX01PREUgKHYxKSk7CisgICAgICBtYWNoaW5lX21vZGUgb3BfbW9kZSA9IEdF VF9NT0RFICh2MCk7CisgICAgICBpZiAodGFyZ2V0bS52ZWN0b3JpemUudmVjX3Blcm1fY29uc3Qg KG1vZGUsIG9wX21vZGUsIHRhcmdldCwgdjAsIHYxLAorCQkJCQkgICAgaW5kaWNlcykpCiAJcmV0 dXJuIHRhcmdldDsKICAgICB9CiAKQEAgLTYyNjQsNyArNjI2Nyw3IEBAIGV4cGFuZF92ZWNfcGVy bV9jb25zdCAobWFjaGluZV9tb2RlIG1vZGUsIHJ0eCB2MCwgcnR4IHYxLAogICAgICAgdjBfcWkg PSBnZW5fbG93cGFydCAocWltb2RlLCB2MCk7CiAgICAgICB2MV9xaSA9IGdlbl9sb3dwYXJ0IChx aW1vZGUsIHYxKTsKICAgICAgIGlmICh0YXJnZXRtLnZlY3Rvcml6ZS52ZWNfcGVybV9jb25zdCAh PSBOVUxMCi0JICAmJiB0YXJnZXRtLnZlY3Rvcml6ZS52ZWNfcGVybV9jb25zdCAocWltb2RlLCB0 YXJnZXRfcWksIHYwX3FpLAorCSAgJiYgdGFyZ2V0bS52ZWN0b3JpemUudmVjX3Blcm1fY29uc3Qg KHFpbW9kZSwgcWltb2RlLCB0YXJnZXRfcWksIHYwX3FpLAogCQkJCQkgICAgICAgdjFfcWksIHFp bW9kZV9pbmRpY2VzKSkKIAlyZXR1cm4gZ2VuX2xvd3BhcnQgKG1vZGUsIHRhcmdldF9xaSk7CiAg ICAgfQpkaWZmIC0tZ2l0IGEvZ2NjL3RhcmdldC5kZWYgYi9nY2MvdGFyZ2V0LmRlZgppbmRleCBk ODVhZGYzNmEzOS4uZTg1MzdiM2VhZjQgMTAwNjQ0Ci0tLSBhL2djYy90YXJnZXQuZGVmCisrKyBi L2djYy90YXJnZXQuZGVmCkBAIC0xODc4LDExICsxODc4LDExIEBAIGFjY2VzcyB1c2luZyBAdmFy e3R5cGV9IGlzIGtub3duIHRvIGJlIG5hdHVyYWxseSBhbGlnbmVkLiIsCiBERUZIT09LCiAodmVj X3Blcm1fY29uc3QsCiAgIlRoaXMgaG9vayBpcyB1c2VkIHRvIHRlc3Qgd2hldGhlciB0aGUgdGFy Z2V0IGNhbiBwZXJtdXRlIHVwIHRvIHR3b1xuXAotdmVjdG9ycyBvZiBtb2RlIEB2YXJ7bW9kZX0g dXNpbmcgdGhlIHBlcm11dGF0aW9uIHZlY3RvciBAY29kZXtzZWx9LCBhbmRcblwKK3ZlY3RvcnMg b2YgbW9kZSBAdmFye29wX21vZGV9IHVzaW5nIHRoZSBwZXJtdXRhdGlvbiB2ZWN0b3IgQGNvZGV7 c2VsfSwgYW5kXG5cCiBhbHNvIHRvIGVtaXQgc3VjaCBhIHBlcm11dGF0aW9uLiAgSW4gdGhlIGZv cm1lciBjYXNlIEB2YXJ7aW4wfSwgQHZhcntpbjF9XG5cCiBhbmQgQHZhcntvdXR9IGFyZSBhbGwg bnVsbC4gIEluIHRoZSBsYXR0ZXIgY2FzZSBAdmFye2luMH0gYW5kIEB2YXJ7aW4xfSBhcmVcblwK LXRoZSBzb3VyY2UgdmVjdG9ycyBhbmQgQHZhcntvdXR9IGlzIHRoZSBkZXN0aW5hdGlvbiB2ZWN0 b3I7IGFsbCB0aHJlZSBhcmVcblwKLW9wZXJhbmRzIG9mIG1vZGUgQHZhcnttb2RlfS4gIEB2YXJ7 aW4xfSBpcyB0aGUgc2FtZSBhcyBAdmFye2luMH0gaWZcblwKK3RoZSBzb3VyY2UgdmVjdG9ycyBv ZiBtb2RlIEB2YXJ7b3BfbW9kZX0gYW5kIEB2YXJ7b3V0fSBpcyB0aGUgZGVzdGluYXRpb24gdmVj dG9yXG5cCitvZiBtb2RlIEB2YXJ7bW9kZX0uICBAdmFye2luMX0gaXMgdGhlIHNhbWUgYXMgQHZh cntpbjB9IGlmXG5cCiBAdmFye3NlbH0gZGVzY3JpYmVzIGEgcGVybXV0YXRpb24gb24gb25lIHZl Y3RvciBpbnN0ZWFkIG9mIHR3by5cblwKIFxuXAogUmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhdGlv biBpcyBwb3NzaWJsZSwgZW1pdHRpbmcgaW5zdHJ1Y3Rpb25zIGZvciBpdFxuXApAQCAtMTg5NCw3 ICsxODk0LDcgQEAgdHJ5IHRoZSBlcXVpdmFsZW50IGJ5dGUgb3BlcmF0aW9uLiAgSWYgdGhhdCBh bHNvIGZhaWxzLCBpdCB3aWxsIHRyeSBmb3JjaW5nXG5cCiB0aGUgc2VsZWN0b3IgaW50byBhIHJl Z2lzdGVyIGFuZCB1c2luZyB0aGUgQHZhcnt2ZWNfcGVybUB2YXJ7bW9kZX19XG5cCiBpbnN0cnVj dGlvbiBwYXR0ZXJuLiAgVGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhlIGhvb2sgdG8gaGFuZGxlIHRo ZXNlIHR3b1xuXAogaW1wbGVtZW50YXRpb24gYXBwcm9hY2hlcyBpdHNlbGYuIiwKLSBib29sLCAo bWFjaGluZV9tb2RlIG1vZGUsIHJ0eCBvdXRwdXQsIHJ0eCBpbjAsIHJ0eCBpbjEsCisgYm9vbCwg KG1hY2hpbmVfbW9kZSBtb2RlLCBtYWNoaW5lX21vZGUgb3BfbW9kZSwgcnR4IG91dHB1dCwgcnR4 IGluMCwgcnR4IGluMSwKIAljb25zdCB2ZWNfcGVybV9pbmRpY2VzICZzZWwpLAogIE5VTEwpCiAK ZGlmZiAtLWdpdCBhL2djYy90cmVlLXNzYS1mb3J3cHJvcC5jYyBiL2djYy90cmVlLXNzYS1mb3J3 cHJvcC5jYwppbmRleCA0OGNhYjU4NDRlMC4uZTI1M2U4NDg3OTYgMTAwNjQ0Ci0tLSBhL2djYy90 cmVlLXNzYS1mb3J3cHJvcC5jYworKysgYi9nY2MvdHJlZS1zc2EtZm9yd3Byb3AuY2MKQEAgLTMw MTYsNyArMzAxNiw4IEBAIHNpbXBsaWZ5X3ZlY3Rvcl9jb25zdHJ1Y3RvciAoZ2ltcGxlX3N0bXRf aXRlcmF0b3IgKmdzaSkKIAkJCTogKGVsdHNbMF0uc2Vjb25kID09IDAgJiYgZWx0c1swXS5maXJz dCA9PSAwCiAJCQkgICA/IDAgOiByZWZuZWx0cykgKyBpKTsKICAgICAgIHZlY19wZXJtX2luZGlj ZXMgaW5kaWNlcyAoc2VsLCBvcmlnWzFdID8gMiA6IDEsIHJlZm5lbHRzKTsKLSAgICAgIGlmICgh Y2FuX3ZlY19wZXJtX2NvbnN0X3AgKFRZUEVfTU9ERSAocGVybV90eXBlKSwgaW5kaWNlcykpCisg ICAgICBtYWNoaW5lX21vZGUgdm1vZGUgPSBUWVBFX01PREUgKHBlcm1fdHlwZSk7CisgICAgICBp ZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wICh2bW9kZSwgdm1vZGUsIGluZGljZXMpKQogCXJldHVy biBmYWxzZTsKICAgICAgIG1hc2tfdHlwZQogCT0gYnVpbGRfdmVjdG9yX3R5cGUgKGJ1aWxkX25v bnN0YW5kYXJkX2ludGVnZXJfdHlwZSAoZWxlbV9zaXplLCAxKSwKQEAgLTMwNjUsNyArMzA2Niw4 IEBAIHNpbXBsaWZ5X3ZlY3Rvcl9jb25zdHJ1Y3RvciAoZ2ltcGxlX3N0bXRfaXRlcmF0b3IgKmdz aSkKIAkgICAgc2VsLnF1aWNrX3B1c2ggKGVsdHNbaV0uZmlyc3QKIAkJCSAgICA/IGVsdHNbaV0u c2Vjb25kICsgbmVsdHMgOiBpKTsKIAkgIHZlY19wZXJtX2luZGljZXMgaW5kaWNlcyAoc2VsLCAy LCBuZWx0cyk7Ci0JICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wIChUWVBFX01PREUgKHR5cGUp LCBpbmRpY2VzKSkKKwkgIG1hY2hpbmVfbW9kZSB2bW9kZSA9IFRZUEVfTU9ERSAodHlwZSk7CisJ ICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wICh2bW9kZSwgdm1vZGUsIGluZGljZXMpKQogCSAg ICByZXR1cm4gZmFsc2U7CiAJICBtYXNrX3R5cGUKIAkgICAgPSBidWlsZF92ZWN0b3JfdHlwZSAo YnVpbGRfbm9uc3RhbmRhcmRfaW50ZWdlcl90eXBlIChlbGVtX3NpemUsIDEpLApkaWZmIC0tZ2l0 IGEvZ2NjL3RyZWUtdmVjdC1kYXRhLXJlZnMuY2MgYi9nY2MvdHJlZS12ZWN0LWRhdGEtcmVmcy5j YwppbmRleCAwOTIyM2JhZjcxOC4uZDIwYTEwYTE1MjQgMTAwNjQ0Ci0tLSBhL2djYy90cmVlLXZl Y3QtZGF0YS1yZWZzLmNjCisrKyBiL2djYy90cmVlLXZlY3QtZGF0YS1yZWZzLmNjCkBAIC01MzQ3 LDcgKzUzNDcsNyBAQCB2ZWN0X2dyb3VwZWRfc3RvcmVfc3VwcG9ydGVkICh0cmVlIHZlY3R5cGUs IHVuc2lnbmVkIEhPU1RfV0lERV9JTlQgY291bnQpCiAJCSAgICBzZWxbMyAqIGkgKyBuZWx0Ml0g PSAwOwogCQl9CiAJICAgICAgaW5kaWNlcy5uZXdfdmVjdG9yIChzZWwsIDIsIG5lbHQpOwotCSAg ICAgIGlmICghY2FuX3ZlY19wZXJtX2NvbnN0X3AgKG1vZGUsIGluZGljZXMpKQorCSAgICAgIGlm ICghY2FuX3ZlY19wZXJtX2NvbnN0X3AgKG1vZGUsIG1vZGUsIGluZGljZXMpKQogCQl7CiAJCSAg aWYgKGR1bXBfZW5hYmxlZF9wICgpKQogCQkgICAgZHVtcF9wcmludGYgKE1TR19NSVNTRURfT1BU SU1JWkFUSU9OLApAQCAtNTM2NSw3ICs1MzY1LDcgQEAgdmVjdF9ncm91cGVkX3N0b3JlX3N1cHBv cnRlZCAodHJlZSB2ZWN0eXBlLCB1bnNpZ25lZCBIT1NUX1dJREVfSU5UIGNvdW50KQogCQkgICAg c2VsWzMgKiBpICsgbmVsdDJdID0gbmVsdCArIGoyKys7CiAJCX0KIAkgICAgICBpbmRpY2VzLm5l d192ZWN0b3IgKHNlbCwgMiwgbmVsdCk7Ci0JICAgICAgaWYgKCFjYW5fdmVjX3Blcm1fY29uc3Rf cCAobW9kZSwgaW5kaWNlcykpCisJICAgICAgaWYgKCFjYW5fdmVjX3Blcm1fY29uc3RfcCAobW9k ZSwgbW9kZSwgaW5kaWNlcykpCiAJCXsKIAkJICBpZiAoZHVtcF9lbmFibGVkX3AgKCkpCiAJCSAg ICBkdW1wX3ByaW50ZiAoTVNHX01JU1NFRF9PUFRJTUlaQVRJT04sCkBAIC01MzkwLDEyICs1Mzkw LDEyIEBAIHZlY3RfZ3JvdXBlZF9zdG9yZV9zdXBwb3J0ZWQgKHRyZWUgdmVjdHlwZSwgdW5zaWdu ZWQgSE9TVF9XSURFX0lOVCBjb3VudCkKIAkgICAgICBzZWxbaSAqIDIgKyAxXSA9IGkgKyBuZWx0 OwogCSAgICB9CiAJICB2ZWNfcGVybV9pbmRpY2VzIGluZGljZXMgKHNlbCwgMiwgbmVsdCk7Ci0J ICBpZiAoY2FuX3ZlY19wZXJtX2NvbnN0X3AgKG1vZGUsIGluZGljZXMpKQorCSAgaWYgKGNhbl92 ZWNfcGVybV9jb25zdF9wIChtb2RlLCBtb2RlLCBpbmRpY2VzKSkKIAkgICAgewogCSAgICAgIGZv ciAoaSA9IDA7IGkgPCA2OyBpKyspCiAJCXNlbFtpXSArPSBleGFjdF9kaXYgKG5lbHQsIDIpOwog CSAgICAgIGluZGljZXMubmV3X3ZlY3RvciAoc2VsLCAyLCBuZWx0KTsKLQkgICAgICBpZiAoY2Fu X3ZlY19wZXJtX2NvbnN0X3AgKG1vZGUsIGluZGljZXMpKQorCSAgICAgIGlmIChjYW5fdmVjX3Bl cm1fY29uc3RfcCAobW9kZSwgbW9kZSwgaW5kaWNlcykpCiAJCXJldHVybiB0cnVlOwogCSAgICB9 CiAJfQpAQCAtNTk2Myw3ICs1OTYzLDcgQEAgdmVjdF9ncm91cGVkX2xvYWRfc3VwcG9ydGVkICh0 cmVlIHZlY3R5cGUsIGJvb2wgc2luZ2xlX2VsZW1lbnRfcCwKIAkJZWxzZQogCQkgIHNlbFtpXSA9 IDA7CiAJICAgICAgaW5kaWNlcy5uZXdfdmVjdG9yIChzZWwsIDIsIG5lbHQpOwotCSAgICAgIGlm ICghY2FuX3ZlY19wZXJtX2NvbnN0X3AgKG1vZGUsIGluZGljZXMpKQorCSAgICAgIGlmICghY2Fu X3ZlY19wZXJtX2NvbnN0X3AgKG1vZGUsIG1vZGUsIGluZGljZXMpKQogCQl7CiAJCSAgaWYgKGR1 bXBfZW5hYmxlZF9wICgpKQogCQkgICAgZHVtcF9wcmludGZfbG9jIChNU0dfTUlTU0VEX09QVElN SVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKQEAgLTU5NzcsNyArNTk3Nyw3IEBAIHZlY3RfZ3JvdXBl ZF9sb2FkX3N1cHBvcnRlZCAodHJlZSB2ZWN0eXBlLCBib29sIHNpbmdsZV9lbGVtZW50X3AsCiAJ CWVsc2UKIAkJICBzZWxbaV0gPSBuZWx0ICsgKChuZWx0ICsgaykgJSAzKSArIDMgKiAoaisrKTsK IAkgICAgICBpbmRpY2VzLm5ld192ZWN0b3IgKHNlbCwgMiwgbmVsdCk7Ci0JICAgICAgaWYgKCFj YW5fdmVjX3Blcm1fY29uc3RfcCAobW9kZSwgaW5kaWNlcykpCisJICAgICAgaWYgKCFjYW5fdmVj X3Blcm1fY29uc3RfcCAobW9kZSwgbW9kZSwgaW5kaWNlcykpCiAJCXsKIAkJICBpZiAoZHVtcF9l bmFibGVkX3AgKCkpCiAJCSAgICBkdW1wX3ByaW50Zl9sb2MgKE1TR19NSVNTRURfT1BUSU1JWkFU SU9OLCB2ZWN0X2xvY2F0aW9uLApAQCAtNjAwMCwxMiArNjAwMCwxMiBAQCB2ZWN0X2dyb3VwZWRf bG9hZF9zdXBwb3J0ZWQgKHRyZWUgdmVjdHlwZSwgYm9vbCBzaW5nbGVfZWxlbWVudF9wLAogCSAg Zm9yIChpID0gMDsgaSA8IDM7IGkrKykKIAkgICAgc2VsW2ldID0gaSAqIDI7CiAJICB2ZWNfcGVy bV9pbmRpY2VzIGluZGljZXMgKHNlbCwgMiwgbmVsdCk7Ci0JICBpZiAoY2FuX3ZlY19wZXJtX2Nv bnN0X3AgKG1vZGUsIGluZGljZXMpKQorCSAgaWYgKGNhbl92ZWNfcGVybV9jb25zdF9wIChtb2Rl LCBtb2RlLCBpbmRpY2VzKSkKIAkgICAgewogCSAgICAgIGZvciAoaSA9IDA7IGkgPCAzOyBpKysp CiAJCXNlbFtpXSA9IGkgKiAyICsgMTsKIAkgICAgICBpbmRpY2VzLm5ld192ZWN0b3IgKHNlbCwg MiwgbmVsdCk7Ci0JICAgICAgaWYgKGNhbl92ZWNfcGVybV9jb25zdF9wIChtb2RlLCBpbmRpY2Vz KSkKKwkgICAgICBpZiAoY2FuX3ZlY19wZXJtX2NvbnN0X3AgKG1vZGUsIG1vZGUsIGluZGljZXMp KQogCQlyZXR1cm4gdHJ1ZTsKIAkgICAgfQogICAgICAgICB9CkBAIC02MzI3LDYgKzYzMjcsNyBA QCB2ZWN0X3NoaWZ0X3Blcm11dGVfbG9hZF9jaGFpbiAodmVjX2luZm8gKnZpbmZvLCB2ZWM8dHJl ZT4gZHJfY2hhaW4sCiAgIGdpbXBsZSAqcGVybV9zdG10OwogCiAgIHRyZWUgdmVjdHlwZSA9IFNU TVRfVklORk9fVkVDVFlQRSAoc3RtdF9pbmZvKTsKKyAgbWFjaGluZV9tb2RlIHZtb2RlID0gVFlQ RV9NT0RFICh2ZWN0eXBlKTsKICAgdW5zaWduZWQgaW50IGk7CiAgIGxvb3BfdmVjX2luZm8gbG9v cF92aW5mbyA9IGR5bl9jYXN0IDxsb29wX3ZlY19pbmZvPiAodmluZm8pOwogCkBAIC02MzUxLDcg KzYzNTIsNyBAQCB2ZWN0X3NoaWZ0X3Blcm11dGVfbG9hZF9jaGFpbiAodmVjX2luZm8gKnZpbmZv LCB2ZWM8dHJlZT4gZHJfY2hhaW4sCiAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmVsdCAvIDI7ICsr aSkKIAlzZWxbbmVsdCAvIDIgKyBpXSA9IGkgKiAyICsgMTsKICAgICAgIHZlY19wZXJtX2luZGlj ZXMgaW5kaWNlcyAoc2VsLCAyLCBuZWx0KTsKLSAgICAgIGlmICghY2FuX3ZlY19wZXJtX2NvbnN0 X3AgKFRZUEVfTU9ERSAodmVjdHlwZSksIGluZGljZXMpKQorICAgICAgaWYgKCFjYW5fdmVjX3Bl cm1fY29uc3RfcCAodm1vZGUsIHZtb2RlLCBpbmRpY2VzKSkKIAl7CiAJICBpZiAoZHVtcF9lbmFi bGVkX3AgKCkpCiAJICAgIGR1bXBfcHJpbnRmX2xvYyAoTVNHX01JU1NFRF9PUFRJTUlaQVRJT04s IHZlY3RfbG9jYXRpb24sCkBAIC02MzY2LDcgKzYzNjcsNyBAQCB2ZWN0X3NoaWZ0X3Blcm11dGVf bG9hZF9jaGFpbiAodmVjX2luZm8gKnZpbmZvLCB2ZWM8dHJlZT4gZHJfY2hhaW4sCiAgICAgICBm b3IgKGkgPSAwOyBpIDwgbmVsdCAvIDI7ICsraSkKIAlzZWxbbmVsdCAvIDIgKyBpXSA9IGkgKiAy OwogICAgICAgaW5kaWNlcy5uZXdfdmVjdG9yIChzZWwsIDIsIG5lbHQpOwotICAgICAgaWYgKCFj YW5fdmVjX3Blcm1fY29uc3RfcCAoVFlQRV9NT0RFICh2ZWN0eXBlKSwgaW5kaWNlcykpCisgICAg ICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wICh2bW9kZSwgdm1vZGUsIGluZGljZXMpKQogCXsK IAkgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKIAkgICAgZHVtcF9wcmludGZfbG9jIChNU0dfTUlT U0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKQEAgLTYzODEsNyArNjM4Miw3IEBAIHZl Y3Rfc2hpZnRfcGVybXV0ZV9sb2FkX2NoYWluICh2ZWNfaW5mbyAqdmluZm8sIHZlYzx0cmVlPiBk cl9jaGFpbiwKICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZWx0OyBpKyspCiAJc2VsW2ldID0gbmVs dCAvIDIgKyBpOwogICAgICAgaW5kaWNlcy5uZXdfdmVjdG9yIChzZWwsIDIsIG5lbHQpOwotICAg ICAgaWYgKCFjYW5fdmVjX3Blcm1fY29uc3RfcCAoVFlQRV9NT0RFICh2ZWN0eXBlKSwgaW5kaWNl cykpCisgICAgICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wICh2bW9kZSwgdm1vZGUsIGluZGlj ZXMpKQogCXsKIAkgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKIAkgICAgZHVtcF9wcmludGZfbG9j IChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKQEAgLTYzOTcsNyArNjM5 OCw3IEBAIHZlY3Rfc2hpZnRfcGVybXV0ZV9sb2FkX2NoYWluICh2ZWNfaW5mbyAqdmluZm8sIHZl Yzx0cmVlPiBkcl9jaGFpbiwKICAgICAgIGZvciAoaSA9IG5lbHQgLyAyOyBpIDwgbmVsdDsgaSsr KQogCXNlbFtpXSA9IG5lbHQgKyBpOwogICAgICAgaW5kaWNlcy5uZXdfdmVjdG9yIChzZWwsIDIs IG5lbHQpOwotICAgICAgaWYgKCFjYW5fdmVjX3Blcm1fY29uc3RfcCAoVFlQRV9NT0RFICh2ZWN0 eXBlKSwgaW5kaWNlcykpCisgICAgICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wICh2bW9kZSwg dm1vZGUsIGluZGljZXMpKQogCXsKIAkgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKIAkgICAgZHVt cF9wcmludGZfbG9jIChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKQEAg LTY0NjEsNyArNjQ2Miw3IEBAIHZlY3Rfc2hpZnRfcGVybXV0ZV9sb2FkX2NoYWluICh2ZWNfaW5m byAqdmluZm8sIHZlYzx0cmVlPiBkcl9jaGFpbiwKIAkgIGsrKzsKIAl9CiAgICAgICB2ZWNfcGVy bV9pbmRpY2VzIGluZGljZXMgKHNlbCwgMiwgbmVsdCk7Ci0gICAgICBpZiAoIWNhbl92ZWNfcGVy bV9jb25zdF9wIChUWVBFX01PREUgKHZlY3R5cGUpLCBpbmRpY2VzKSkKKyAgICAgIGlmICghY2Fu X3ZlY19wZXJtX2NvbnN0X3AgKHZtb2RlLCB2bW9kZSwgaW5kaWNlcykpCiAJewogCSAgaWYgKGR1 bXBfZW5hYmxlZF9wICgpKQogCSAgICBkdW1wX3ByaW50Zl9sb2MgKE1TR19NSVNTRURfT1BUSU1J WkFUSU9OLCB2ZWN0X2xvY2F0aW9uLApAQCAtNjQ3Niw3ICs2NDc3LDcgQEAgdmVjdF9zaGlmdF9w ZXJtdXRlX2xvYWRfY2hhaW4gKHZlY19pbmZvICp2aW5mbywgdmVjPHRyZWU+IGRyX2NoYWluLAog ICAgICAgZm9yIChpID0gMDsgaSA8IG5lbHQ7IGkrKykKIAlzZWxbaV0gPSAyICogKG5lbHQgLyAz KSArIChuZWx0ICUgMykgKyBpOwogICAgICAgaW5kaWNlcy5uZXdfdmVjdG9yIChzZWwsIDIsIG5l bHQpOwotICAgICAgaWYgKCFjYW5fdmVjX3Blcm1fY29uc3RfcCAoVFlQRV9NT0RFICh2ZWN0eXBl KSwgaW5kaWNlcykpCisgICAgICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wICh2bW9kZSwgdm1v ZGUsIGluZGljZXMpKQogCXsKIAkgIGlmIChkdW1wX2VuYWJsZWRfcCAoKSkKIAkgICAgZHVtcF9w cmludGZfbG9jIChNU0dfTUlTU0VEX09QVElNSVpBVElPTiwgdmVjdF9sb2NhdGlvbiwKQEAgLTY0 OTAsNyArNjQ5MSw3IEBAIHZlY3Rfc2hpZnRfcGVybXV0ZV9sb2FkX2NoYWluICh2ZWNfaW5mbyAq dmluZm8sIHZlYzx0cmVlPiBkcl9jaGFpbiwKICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZWx0OyBp KyspCiAJc2VsW2ldID0gMiAqIChuZWx0IC8gMykgKyAxICsgaTsKICAgICAgIGluZGljZXMubmV3 X3ZlY3RvciAoc2VsLCAyLCBuZWx0KTsKLSAgICAgIGlmICghY2FuX3ZlY19wZXJtX2NvbnN0X3Ag KFRZUEVfTU9ERSAodmVjdHlwZSksIGluZGljZXMpKQorICAgICAgaWYgKCFjYW5fdmVjX3Blcm1f Y29uc3RfcCAodm1vZGUsIHZtb2RlLCBpbmRpY2VzKSkKIAl7CiAJICBpZiAoZHVtcF9lbmFibGVk X3AgKCkpCiAJICAgIGR1bXBfcHJpbnRmX2xvYyAoTVNHX01JU1NFRF9PUFRJTUlaQVRJT04sIHZl Y3RfbG9jYXRpb24sCkBAIC02NTA0LDcgKzY1MDUsNyBAQCB2ZWN0X3NoaWZ0X3Blcm11dGVfbG9h ZF9jaGFpbiAodmVjX2luZm8gKnZpbmZvLCB2ZWM8dHJlZT4gZHJfY2hhaW4sCiAgICAgICBmb3Ig KGkgPSAwOyBpIDwgbmVsdDsgaSsrKQogCXNlbFtpXSA9IChuZWx0IC8gMykgKyAobmVsdCAlIDMp IC8gMiArIGk7CiAgICAgICBpbmRpY2VzLm5ld192ZWN0b3IgKHNlbCwgMiwgbmVsdCk7Ci0gICAg ICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wIChUWVBFX01PREUgKHZlY3R5cGUpLCBpbmRpY2Vz KSkKKyAgICAgIGlmICghY2FuX3ZlY19wZXJtX2NvbnN0X3AgKHZtb2RlLCB2bW9kZSwgaW5kaWNl cykpCiAJewogCSAgaWYgKGR1bXBfZW5hYmxlZF9wICgpKQogCSAgICBkdW1wX3ByaW50Zl9sb2Mg KE1TR19NSVNTRURfT1BUSU1JWkFUSU9OLCB2ZWN0X2xvY2F0aW9uLApAQCAtNjUxOCw3ICs2NTE5 LDcgQEAgdmVjdF9zaGlmdF9wZXJtdXRlX2xvYWRfY2hhaW4gKHZlY19pbmZvICp2aW5mbywgdmVj PHRyZWU+IGRyX2NoYWluLAogICAgICAgZm9yIChpID0gMDsgaSA8IG5lbHQ7IGkrKykKIAlzZWxb aV0gPSAyICogKG5lbHQgLyAzKSArIChuZWx0ICUgMykgLyAyICsgaTsKICAgICAgIGluZGljZXMu bmV3X3ZlY3RvciAoc2VsLCAyLCBuZWx0KTsKLSAgICAgIGlmICghY2FuX3ZlY19wZXJtX2NvbnN0 X3AgKFRZUEVfTU9ERSAodmVjdHlwZSksIGluZGljZXMpKQorICAgICAgaWYgKCFjYW5fdmVjX3Bl cm1fY29uc3RfcCAodm1vZGUsIHZtb2RlLCBpbmRpY2VzKSkKIAl7CiAJICBpZiAoZHVtcF9lbmFi bGVkX3AgKCkpCiAJICAgIGR1bXBfcHJpbnRmX2xvYyAoTVNHX01JU1NFRF9PUFRJTUlaQVRJT04s IHZlY3RfbG9jYXRpb24sCmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0LWdlbmVyaWMuY2MgYi9n Y2MvdHJlZS12ZWN0LWdlbmVyaWMuY2MKaW5kZXggZDk5ZTMyMDdmYmUuLjE3ZGUzMzc1MTI3IDEw MDY0NAotLS0gYS9nY2MvdHJlZS12ZWN0LWdlbmVyaWMuY2MKKysrIGIvZ2NjL3RyZWUtdmVjdC1n ZW5lcmljLmNjCkBAIC0xNTI3LDcgKzE1MjcsOCBAQCBsb3dlcl92ZWNfcGVybSAoZ2ltcGxlX3N0 bXRfaXRlcmF0b3IgKmdzaSkKICAgICAgICYmIHRyZWVfdG9fdmVjX3Blcm1fYnVpbGRlciAoJnNl bF9pbnQsIG1hc2spKQogICAgIHsKICAgICAgIHZlY19wZXJtX2luZGljZXMgaW5kaWNlcyAoc2Vs X2ludCwgMiwgZWxlbWVudHMpOwotICAgICAgaWYgKGNhbl92ZWNfcGVybV9jb25zdF9wIChUWVBF X01PREUgKHZlY3RfdHlwZSksIGluZGljZXMpKQorICAgICAgbWFjaGluZV9tb2RlIHZtb2RlID0g VFlQRV9NT0RFICh2ZWN0X3R5cGUpOworICAgICAgaWYgKGNhbl92ZWNfcGVybV9jb25zdF9wICh2 bW9kZSwgdm1vZGUsIGluZGljZXMpKQogCXsKIAkgIGdpbXBsZV9hc3NpZ25fc2V0X3JoczMgKHN0 bXQsIG1hc2spOwogCSAgdXBkYXRlX3N0bXQgKHN0bXQpOwpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUt dmVjdC1sb29wLW1hbmlwLmNjIGIvZ2NjL3RyZWUtdmVjdC1sb29wLW1hbmlwLmNjCmluZGV4IDFk NDMzN2ViMjYxLi4xMWRjNmNiZjU3NiAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtdmVjdC1sb29wLW1h bmlwLmNjCisrKyBiL2djYy90cmVlLXZlY3QtbG9vcC1tYW5pcC5jYwpAQCAtMzEyLDcgKzMxMiw4 IEBAIGludGVybGVhdmVfc3VwcG9ydGVkX3AgKHZlY19wZXJtX2luZGljZXMgKmluZGljZXMsIHRy ZWUgdmVjdHlwZSwKICAgICAgIHNlbC5xdWlja19wdXNoIChiYXNlICsgaSArIG5lbHRzKTsKICAg ICB9CiAgIGluZGljZXMtPm5ld192ZWN0b3IgKHNlbCwgMiwgbmVsdHMpOwotICByZXR1cm4gY2Fu X3ZlY19wZXJtX2NvbnN0X3AgKFRZUEVfTU9ERSAodmVjdHlwZSksICppbmRpY2VzKTsKKyAgcmV0 dXJuIGNhbl92ZWNfcGVybV9jb25zdF9wIChUWVBFX01PREUgKHZlY3R5cGUpLCBUWVBFX01PREUg KHZlY3R5cGUpLAorCQkJICAgICAgICppbmRpY2VzKTsKIH0KIAogLyogVHJ5IHRvIHVzZSBwZXJt dXRlcyB0byBkZWZpbmUgdGhlIG1hc2tzIGluIERFU1RfUkdNIHVzaW5nIHRoZSBtYXNrcwpkaWZm IC0tZ2l0IGEvZ2NjL3RyZWUtdmVjdC1sb29wLmNjIGIvZ2NjL3RyZWUtdmVjdC1sb29wLmNjCmlu ZGV4IGFiN2RhZGUxYzc0Li43YWM5MzhiM2M3YiAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtdmVjdC1s b29wLmNjCisrKyBiL2djYy90cmVlLXZlY3QtbG9vcC5jYwpAQCAtNDUyNyw3ICs0NTI3LDcgQEAg aGF2ZV93aG9sZV92ZWN0b3Jfc2hpZnQgKG1hY2hpbmVfbW9kZSBtb2RlKQogICAgIHsKICAgICAg IGNhbGNfdmVjX3Blcm1fbWFza19mb3Jfc2hpZnQgKGksIG5lbHQsICZzZWwpOwogICAgICAgaW5k aWNlcy5uZXdfdmVjdG9yIChzZWwsIDIsIG5lbHQpOwotICAgICAgaWYgKCFjYW5fdmVjX3Blcm1f Y29uc3RfcCAobW9kZSwgaW5kaWNlcywgZmFsc2UpKQorICAgICAgaWYgKCFjYW5fdmVjX3Blcm1f Y29uc3RfcCAobW9kZSwgbW9kZSwgaW5kaWNlcywgZmFsc2UpKQogCXJldHVybiBmYWxzZTsKICAg ICB9CiAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvZ2NjL3RyZWUtdmVjdC1wYXR0ZXJucy5j YyBiL2djYy90cmVlLXZlY3QtcGF0dGVybnMuY2MKaW5kZXggOGM2MWViOTY1YTYuLjUxODAzZWM5 N2MyIDEwMDY0NAotLS0gYS9nY2MvdHJlZS12ZWN0LXBhdHRlcm5zLmNjCisrKyBiL2djYy90cmVl LXZlY3QtcGF0dGVybnMuY2MKQEAgLTI2NDMsNyArMjY0Myw4IEBAIHZlY3RfcmVjb2dfcm90YXRl X3BhdHRlcm4gKHZlY19pbmZvICp2aW5mbywKIAogCSAgdmVjX3Blcm1faW5kaWNlcyBpbmRpY2Vz IChlbHRzLCAxLAogCQkJCSAgICBUWVBFX1ZFQ1RPUl9TVUJQQVJUUyAoY2hhcl92ZWN0eXBlKSk7 Ci0JICBpZiAoY2FuX3ZlY19wZXJtX2NvbnN0X3AgKFRZUEVfTU9ERSAoY2hhcl92ZWN0eXBlKSwg aW5kaWNlcykpCisJICBtYWNoaW5lX21vZGUgdm1vZGUgPSBUWVBFX01PREUgKGNoYXJfdmVjdHlw ZSk7CisJICBpZiAoY2FuX3ZlY19wZXJtX2NvbnN0X3AgKHZtb2RlLCB2bW9kZSwgaW5kaWNlcykp CiAJICAgIHsKIAkgICAgICAvKiB2ZWN0b3JpemFibGVfYnN3YXAgY2FuIGhhbmRsZSB0aGUgX19i dWlsdGluX2Jzd2FwMTYgaWYgd2UKIAkJIHVuZG8gdGhlIGFyZ3VtZW50IHByb21vdGlvbi4gICov CmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0LXNscC5jYyBiL2djYy90cmVlLXZlY3Qtc2xwLmNj CmluZGV4IGNkZmZmMWFiOWY2Li5mZTkzNjFjMzM4ZSAxMDA2NDQKLS0tIGEvZ2NjL3RyZWUtdmVj dC1zbHAuY2MKKysrIGIvZ2NjL3RyZWUtdmVjdC1zbHAuY2MKQEAgLTQyMCw4ICs0MjAsOSBAQCBj YW5fZHVwbGljYXRlX2FuZF9pbnRlcmxlYXZlX3AgKHZlY19pbmZvICp2aW5mbywgdW5zaWduZWQg aW50IGNvdW50LAogCQl9CiAJICAgICAgdmVjX3Blcm1faW5kaWNlcyBpbmRpY2VzMSAoc2VsMSwg MiwgbmVsdHMpOwogCSAgICAgIHZlY19wZXJtX2luZGljZXMgaW5kaWNlczIgKHNlbDIsIDIsIG5l bHRzKTsKLQkgICAgICBpZiAoY2FuX3ZlY19wZXJtX2NvbnN0X3AgKFRZUEVfTU9ERSAodmVjdG9y X3R5cGUpLCBpbmRpY2VzMSkKLQkJICAmJiBjYW5fdmVjX3Blcm1fY29uc3RfcCAoVFlQRV9NT0RF ICh2ZWN0b3JfdHlwZSksIGluZGljZXMyKSkKKwkgICAgICBtYWNoaW5lX21vZGUgdm1vZGUgPSBU WVBFX01PREUgKHZlY3Rvcl90eXBlKTsKKwkgICAgICBpZiAoY2FuX3ZlY19wZXJtX2NvbnN0X3Ag KHZtb2RlLCB2bW9kZSwgaW5kaWNlczEpCisJCSAgJiYgY2FuX3ZlY19wZXJtX2NvbnN0X3AgKHZt b2RlLCB2bW9kZSwgaW5kaWNlczIpKQogCQl7CiAJCSAgaWYgKG52ZWN0b3JzX291dCkKIAkJICAg ICpudmVjdG9yc19vdXQgPSBudmVjdG9yczsKQEAgLTY3NjIsNyArNjc2Myw3IEBAIHZlY3RfdHJh bnNmb3JtX3NscF9wZXJtX2xvYWQgKHZlY19pbmZvICp2aW5mbywKICAgICAgIGlmIChpbmRleCA9 PSBjb3VudCAmJiAhbm9vcF9wKQogCXsKIAkgIGluZGljZXMubmV3X3ZlY3RvciAobWFzaywgc2Vj b25kX3ZlY19pbmRleCA9PSAtMSA/IDEgOiAyLCBudW5pdHMpOwotCSAgaWYgKCFjYW5fdmVjX3Bl cm1fY29uc3RfcCAobW9kZSwgaW5kaWNlcykpCisJICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9w IChtb2RlLCBtb2RlLCBpbmRpY2VzKSkKIAkgICAgewogCSAgICAgIGlmIChkdW1wX2VuYWJsZWRf cCAoKSkKIAkJewpAQCAtNzEyMiw4ICs3MTIzLDkgQEAgdmVjdG9yaXphYmxlX3NscF9wZXJtdXRh dGlvbiAodmVjX2luZm8gKnZpbmZvLCBnaW1wbGVfc3RtdF9pdGVyYXRvciAqZ3NpLAogCXsKIAkg IGluZGljZXMubmV3X3ZlY3RvciAobWFzaywgc2Vjb25kX3ZlYy5maXJzdCA9PSAtMVUgPyAxIDog MiwgbnVuaXRzKTsKIAkgIGJvb2wgaWRlbnRpdHlfcCA9IGluZGljZXMuc2VyaWVzX3AgKDAsIDEs IDAsIDEpOworCSAgbWFjaGluZV9tb2RlIHZtb2RlID0gVFlQRV9NT0RFICh2ZWN0eXBlKTsKIAkg IGlmICghaWRlbnRpdHlfcAotCSAgICAgICYmICFjYW5fdmVjX3Blcm1fY29uc3RfcCAoVFlQRV9N T0RFICh2ZWN0eXBlKSwgaW5kaWNlcykpCisJICAgICAgJiYgIWNhbl92ZWNfcGVybV9jb25zdF9w ICh2bW9kZSwgdm1vZGUsIGluZGljZXMpKQogCSAgICB7CiAJICAgICAgaWYgKGR1bXBfZW5hYmxl ZF9wICgpKQogCQl7CmRpZmYgLS1naXQgYS9nY2MvdHJlZS12ZWN0LXN0bXRzLmNjIGIvZ2NjL3Ry ZWUtdmVjdC1zdG10cy5jYwppbmRleCA4MzI3ZTlkMDQ3ZS4uMjA3ZDEwOTdkNWIgMTAwNjQ0Ci0t LSBhL2djYy90cmVlLXZlY3Qtc3RtdHMuY2MKKysrIGIvZ2NjL3RyZWUtdmVjdC1zdG10cy5jYwpA QCAtMjAxNiw3ICsyMDE2LDcgQEAgcGVybV9tYXNrX2Zvcl9yZXZlcnNlICh0cmVlIHZlY3R5cGUp CiAgICAgc2VsLnF1aWNrX3B1c2ggKG51bml0cyAtIDEgLSBpKTsKIAogICB2ZWNfcGVybV9pbmRp Y2VzIGluZGljZXMgKHNlbCwgMSwgbnVuaXRzKTsKLSAgaWYgKCFjYW5fdmVjX3Blcm1fY29uc3Rf cCAoVFlQRV9NT0RFICh2ZWN0eXBlKSwgaW5kaWNlcykpCisgIGlmICghY2FuX3ZlY19wZXJtX2Nv bnN0X3AgKFRZUEVfTU9ERSAodmVjdHlwZSksIFRZUEVfTU9ERSAodmVjdHlwZSksIGluZGljZXMp KQogICAgIHJldHVybiBOVUxMX1RSRUU7CiAgIHJldHVybiB2ZWN0X2dlbl9wZXJtX21hc2tfY2hl Y2tlZCAodmVjdHlwZSwgaW5kaWNlcyk7CiB9CkBAIC0zMTY4LDcgKzMxNjgsOCBAQCB2ZWN0b3Jp emFibGVfYnN3YXAgKHZlY19pbmZvICp2aW5mbywKICAgICAgIGVsdHMucXVpY2tfcHVzaCAoKGkg KyAxKSAqIHdvcmRfYnl0ZXMgLSBqIC0gMSk7CiAKICAgdmVjX3Blcm1faW5kaWNlcyBpbmRpY2Vz IChlbHRzLCAxLCBudW1fYnl0ZXMpOwotICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wIChUWVBF X01PREUgKGNoYXJfdmVjdHlwZSksIGluZGljZXMpKQorICBtYWNoaW5lX21vZGUgdm1vZGUgPSBU WVBFX01PREUgKGNoYXJfdmVjdHlwZSk7CisgIGlmICghY2FuX3ZlY19wZXJtX2NvbnN0X3AgKHZt b2RlLCB2bW9kZSwgaW5kaWNlcykpCiAgICAgcmV0dXJuIGZhbHNlOwogCiAgIGlmICghIHZlY19z dG10KQpAQCAtNjcxMiw3ICs2NzEzLDcgQEAgc2Nhbl9zdG9yZV9jYW5fcGVybV9wICh0cmVlIHZl Y3R5cGUsIHRyZWUgaW5pdCwKIAkgICAgc2VsW2pdID0gbnVuaXRzICsgazsKIAl9CiAgICAgICB2 ZWNfcGVybV9pbmRpY2VzIGluZGljZXMgKHNlbCwgaSA9PSB1bml0c19sb2cyID8gMSA6IDIsIG51 bml0cyk7Ci0gICAgICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wICh2ZWNfbW9kZSwgaW5kaWNl cykpCisgICAgICBpZiAoIWNhbl92ZWNfcGVybV9jb25zdF9wICh2ZWNfbW9kZSwgdmVjX21vZGUs IGluZGljZXMpKQogCXsKIAkgIGlmIChpID09IHVuaXRzX2xvZzIpCiAJICAgIHJldHVybiAtMTsK QEAgLTg1ODIsNyArODU4Myw4IEBAIHZlY3RfZ2VuX3Blcm1fbWFza19hbnkgKHRyZWUgdmVjdHlw ZSwgY29uc3QgdmVjX3Blcm1faW5kaWNlcyAmc2VsKQogdHJlZQogdmVjdF9nZW5fcGVybV9tYXNr X2NoZWNrZWQgKHRyZWUgdmVjdHlwZSwgY29uc3QgdmVjX3Blcm1faW5kaWNlcyAmc2VsKQogewot ICBnY2NfYXNzZXJ0IChjYW5fdmVjX3Blcm1fY29uc3RfcCAoVFlQRV9NT0RFICh2ZWN0eXBlKSwg c2VsKSk7CisgIG1hY2hpbmVfbW9kZSB2bW9kZSA9IFRZUEVfTU9ERSAodmVjdHlwZSk7CisgIGdj Y19hc3NlcnQgKGNhbl92ZWNfcGVybV9jb25zdF9wICh2bW9kZSwgdm1vZGUsIHNlbCkpOwogICBy ZXR1cm4gdmVjdF9nZW5fcGVybV9tYXNrX2FueSAodmVjdHlwZSwgc2VsKTsKIH0KIAo= --000000000000bc021005dfa9e67b--