From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Philipp Stephani Newsgroups: gmane.emacs.devel Subject: Re: JSON/YAML/TOML/etc. parsing performance Date: Sun, 08 Oct 2017 17:58:14 +0000 Message-ID: References: <87poaqhc63.fsf@lifelogs.com> <8360ceh5f1.fsf@gnu.org> <83h8vl5lf9.fsf@gnu.org> <83r2um3fqi.fsf@gnu.org> <43520b71-9e25-926c-d744-78098dad6441@cs.ucla.edu> NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="001a113cc1e80c3be8055b0cd26f" X-Trace: blaine.gmane.org 1507485547 19350 195.159.176.226 (8 Oct 2017 17:59:07 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 8 Oct 2017 17:59:07 +0000 (UTC) Cc: emacs-devel@gnu.org To: Paul Eggert , Eli Zaretskii Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Sun Oct 08 19:58:54 2017 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1e1Fqd-0002RM-Gv for ged-emacs-devel@m.gmane.org; Sun, 08 Oct 2017 19:58:44 +0200 Original-Received: from localhost ([::1]:54608 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1Fqk-0004k9-Ro for ged-emacs-devel@m.gmane.org; Sun, 08 Oct 2017 13:58:50 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:58107) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1e1FqX-0004jp-8W for emacs-devel@gnu.org; Sun, 08 Oct 2017 13:58:42 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1e1FqS-0007Dd-Bc for emacs-devel@gnu.org; Sun, 08 Oct 2017 13:58:37 -0400 Original-Received: from mail-oi0-x234.google.com ([2607:f8b0:4003:c06::234]:45299) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1e1FqM-0007Br-FJ; Sun, 08 Oct 2017 13:58:26 -0400 Original-Received: by mail-oi0-x234.google.com with SMTP id f3so36434427oia.2; Sun, 08 Oct 2017 10:58:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=ndGnryT4tg9tXrRuihUv8FpYd8upw2Rv7DCybn5GqP8=; b=nS3AnJXq4gd2BeOURTW8lpHLVbyr328CG5Jv/VA5tO0IIEnwLEic/X0PtZo49lpoSX eH+19Yt07i6tPngjX8K/mugwj248w/YfU+oh1vu/AUBwm6P+jD3ytxWP4M/NKbtznZeF p0wRXVKboXySELqgECkkJX47jB4r4jE/yeEl+y8MJj86LPFXijDtBULDsP+iqXDBtaFs /aJiFGMwdGEzYavyANFgtv3CeZH1gMdARsevHC5sngdulvrppq+Rm4sqXBsngZDjPGo5 Jqfv/rB1B/j6Qv1TN+KtC3tGmOs6T2JEUlKByI3IWgQa9zpbHXL9c3nUiL7XwWb3rPyS 4N1A== 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=ndGnryT4tg9tXrRuihUv8FpYd8upw2Rv7DCybn5GqP8=; b=bSKJ9VgU+ZshX9do9HhJGUAovHBCUlp5VLrN5NX2FW4Vcq8ON3qIsxE1dsnSX+fDhh bQukBx3amWHRlr43cxqjTBGlS3CIslBBoI1rKNzi+3+25xwFYDDpDLlPMTkBT2grqnsp 5tpolnRpmv5ge3IG/CQsA+fscVrqh2Y6jQAZ5xJ30RPOCcmapK7IMCrKymE7LCVgaG1w ahrl8lF/MB6YszpQOhtt6IIlGFSweSU6bp4gsvVZ52Vbgu9sm0+SYxdKoW2GlfdDxcDN /6sqq+wJ959Dl4UrLrD71HGumonsAWLyaRyRWxDaD2x7l4/s+DoqAtsrmcb8s5JgdcZK eKjA== X-Gm-Message-State: AMCzsaWTuCLRR6naecPmJybVCbIsXo6udD55AqzpS4NVQwRUSRuxxg05 GJj1TfMWqcpbDvYQjGF4kX752NmmTOM5gcmzsWg= X-Google-Smtp-Source: AOwi7QBYUJjaLtgWfE2l1i00rjPTsW9EGN9k5j5lcI9dbfgcpij+JxSLZo0QxUPEOa284f2RqdOt45IcqGSeyMfW0KE= X-Received: by 10.202.61.65 with SMTP id k62mr4238917oia.418.1507485505292; Sun, 08 Oct 2017 10:58:25 -0700 (PDT) In-Reply-To: <43520b71-9e25-926c-d744-78098dad6441@cs.ucla.edu> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2607:f8b0:4003:c06::234 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: "Emacs-devel" Xref: news.gmane.org gmane.emacs.devel:219263 Archived-At: --001a113cc1e80c3be8055b0cd26f Content-Type: multipart/alternative; boundary="001a113cc1e80c3be0055b0cd26d" --001a113cc1e80c3be0055b0cd26d Content-Type: text/plain; charset="UTF-8" Paul Eggert schrieb am Di., 3. Okt. 2017 um 22:52 Uhr: > On 10/03/2017 05:26 AM, Philipp Stephani wrote: > > > > +#if __has_attribute (warn_unused_result) > > > +# define ATTRIBUTE_WARN_UNUSED_RESULT __attribute__ > > ((__warn_unused_result__)) > > > +#else > > > +# define ATTRIBUTE_WARN_UNUSED_RESULT > > > +#endif > > > > Hmm... why do we need this attribute? You use it with 2 static > > functions, so this sounds like a left-over from the development stage? > > > > It's not strictly needed (and if you don't like it, I can remove it), > > but it helps catching memory leaks. > > I've found __warn_unused_result__ to be more trouble than it's worth in > library functions. Emacs has lib/ignore-value.h in order to work around > __warn_unused_result__ brain damage, for example. For static functions > the problem is less, but still, I mildly favor leaving it out. > OK, I'll remove it. > > > > > And btw, how can size be greater than SIZE_MAX in this case? This is > > a valid Lisp object, isn't it? (There are more such tests in the > > patch, e.g. in lisp_to_json, and I think they, too, are redundant.) > > > > > > Depends on the range of ptrdiff_t and size_t. IIUC nothing in the C > > standard guarantees PTRDIFF_MAX <= SIZE_MAX. If we want to guarantee > > that, we should probably add at least a static assertion. > > There should be no need for that. No Lisp object can exceed min > (PTRDIFF_MAX, SIZE_MAX) bytes; alloc.c guarantees this, so that Emacs > should work even on oddball platforms where SIZE_MAX < PTRDIFF_MAX, and > there is no need for a runtime check here. > Should I at least add an eassert to document this? > > > > + if (buffer_and_size->size > PTRDIFF_MAX) > > > + xsignal1 (Qoverflow_error, build_string ("buffer too large")); > > > + insert (buffer_and_size->buffer, buffer_and_size->size); > > > > I don't think we need this test here, as 'insert' already has the > > equivalent test in one of its subroutines. > > > > It can't, because it takes the byte length as ptrdiff_t. We need to > > check before whether the size is actually in the valid range of > ptrdiff_t. > > A PTRDIFF_MAX test is needed if the JSON library can return strings > longer than PTRDIFF_MAX. Please just use buffer_overflow () to signal > the error, though. > Done. > > > > + case JSON_INTEGER: > > > + { > > > + json_int_t value = json_integer_value (json); > > > + if (FIXNUM_OVERFLOW_P (value)) > > > + xsignal1 (Qoverflow_error, > > > + build_string ("JSON integer is too large")); > > > + return make_number (value); > > > > This overflow test is also redundant, as make_number already does it. > > > > It can't, because json_int_t can be larger than EMACS_INT. Also, > > make_number doesn't contain any checks. > > You're right that a test is needed. However, elsewhere we just use > xsignal0 (Qoverflow_error) for this sort of thing, and I suggest being > consistent and doing that here as well. Similarly for other calls to > xsignal1 with Qoverflow_error. > Done. > > > > + case JSON_STRING: > > > + { > > > + size_t size = json_string_length (json); > > > + if (FIXNUM_OVERFLOW_P (size)) > > > + xsignal1 (Qoverflow_error, build_string ("JSON string is > > too long")); > > > + return json_make_string (json_string_value (json), size); > > > > Once again, the overflow test is redundant, as make_specified_string > > (called by json_make_string) already includes an equivalent test. > > > > And once again, we need to check at least whether the size fits into > > ptrdiff_t. > You're right, a test is needed. However, I suggest using string_overflow > () to signal string overflows. > > Done. I've attached a new patch (which currently segfaults on decode_coding_gap, but the call to that function doesn't seem to be required anyway). --001a113cc1e80c3be0055b0cd26d Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable


Paul E= ggert <eggert@cs.ucla.edu> = schrieb am Di., 3. Okt. 2017 um 22:52=C2=A0Uhr:
On 10/03/2017 05:26 AM, Philipp Stephani wrote:

> > +#if __has_attribute (warn_unused_result)
> > +# define ATTRIBUTE_WARN_UNUSED_RESULT __attribute__
> ((__warn_unused_result__))
> > +#else
> > +# define ATTRIBUTE_WARN_UNUSED_RESULT
> > +#endif
>
> Hmm... why do we need this attribute?=C2=A0 You use it with 2 static > functions, so this sounds like a left-over from the development stage?=
>
> It's not strictly needed (and if you don't like it, I can remo= ve it),
> but it helps catching memory leaks.

I've found __warn_unused_result__ to be more trouble than it's wort= h in
library functions. Emacs has lib/ignore-value.h in order to work around
__warn_unused_result__ brain damage, for example. For static functions
the problem is less, but still, I mildly favor leaving it out.

OK, I'll remove it.
=C2=A0

>
>=C2=A0 =C2=A0 =C2=A0And btw, how can size be greater than SIZE_MAX in t= his case? This is
>=C2=A0 =C2=A0 =C2=A0a valid Lisp object, isn't it?=C2=A0 (There are= more such tests in the
>=C2=A0 =C2=A0 =C2=A0patch, e.g. in lisp_to_json, and I think they, too,= are redundant.)
>
>
> Depends on the range of ptrdiff_t and size_t. IIUC nothing in the C > standard guarantees PTRDIFF_MAX <=3D SIZE_MAX. If we want to guaran= tee
> that, we should probably add at least a static assertion.

There should be no need for that. No Lisp object can exceed min
(PTRDIFF_MAX, SIZE_MAX) bytes; alloc.c guarantees this, so that Emacs
should work even on oddball platforms where SIZE_MAX < PTRDIFF_MAX, and<= br> there is no need for a runtime check here.

<= div>Should I at least add an eassert to document this?

=


> > +=C2=A0 if (buffer_and_size->size > PTRDIFF_MAX)
> > +=C2=A0 =C2=A0 xsignal1 (Qoverflow_error, build_string ("buf= fer too large"));
> > +=C2=A0 insert (buffer_and_size->buffer, buffer_and_size->s= ize);
>
> I don't think we need this test here, as 'insert' already = has the
> equivalent test in one of its subroutines.
>
> It can't, because it takes the byte length as ptrdiff_t. We need t= o
> check before whether the size is actually in the valid range of ptrdif= f_t.

A PTRDIFF_MAX test is needed if the JSON library can return strings
longer than PTRDIFF_MAX. Please just use buffer_overflow () to signal
the error, though.

Done.
=C2= =A0

> > +=C2=A0 =C2=A0 case JSON_INTEGER:
> > +=C2=A0 =C2=A0 =C2=A0 {
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 json_int_t value =3D json_integer_va= lue (json);
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (FIXNUM_OVERFLOW_P (value))
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 xsignal1 (Qoverflow_error, > > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 build_string ("JSON integer is too large"));
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return make_number (value);
>
> This overflow test is also redundant, as make_number already does it.<= br> >
> It can't, because json_int_t can be larger than EMACS_INT. Also, > make_number doesn't contain any checks.

You're right that a test is needed. However, elsewhere we just use
xsignal0 (Qoverflow_error) for this sort of thing, and I suggest being
consistent and doing that here as well. Similarly for other calls to
xsignal1 with Qoverflow_error.

Done.
=C2=A0

> > +=C2=A0 =C2=A0 case JSON_STRING:
> > +=C2=A0 =C2=A0 =C2=A0 {
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 size_t size =3D json_string_length (= json);
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if (FIXNUM_OVERFLOW_P (size))
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 xsignal1 (Qoverflow_error, bu= ild_string ("JSON string is
> too long"));
> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return json_make_string (json_string= _value (json), size);
>
> Once again, the overflow test is redundant, as make_specified_string > (called by json_make_string) already includes an equivalent test.
>
> And once again, we need to check at least whether the size fits into > ptrdiff_t.
You're right, a test is needed. However, I suggest using string_overflo= w
() to signal string overflows.


Done. I've attached a new patch (w= hich currently segfaults on decode_coding_gap, but the call to that functio= n doesn't seem to be required anyway).=C2=A0
--001a113cc1e80c3be0055b0cd26d-- --001a113cc1e80c3be8055b0cd26f Content-Type: text/plain; charset="UTF-8"; name="0001-Implement-native-JSON-support-using-Jansson.txt" Content-Disposition: attachment; filename="0001-Implement-native-JSON-support-using-Jansson.txt" Content-Transfer-Encoding: base64 Content-ID: <15efd2319721bd849ac1> X-Attachment-Id: 15efd2319721bd849ac1 RnJvbSAxNjkxOWY3ZmZkYTdmYjA1N2Q0YzQ0ODZmOTIzOTZkYWI2MzZlNWI4IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBQaGlsaXBwIFN0ZXBoYW5pIDxwaHN0QGdvb2dsZS5jb20+CkRh dGU6IE1vbiwgMTggU2VwIDIwMTcgMTA6NTE6MzkgKzAyMDAKU3ViamVjdDogW1BBVENIXSBJbXBs ZW1lbnQgbmF0aXZlIEpTT04gc3VwcG9ydCB1c2luZyBKYW5zc29uCgoqIGNvbmZpZ3VyZS5hYzog TmV3IG9wdGlvbiAtLXdpdGgtanNvbi4KCiogc3JjL2pzb24uYyAoRmpzb25fc2VyaWFsaXplLCBG anNvbl9pbnNlcnQsIEZqc29uX3BhcnNlX3N0cmluZykKKEZqc29uX3BhcnNlX2J1ZmZlcik6IE5l dyBkZWZ1bnMuCihqc29uX2hhc19wcmVmaXgsIGpzb25faGFzX3N1ZmZpeCwganNvbl9tYWtlX3N0 cmluZykKKGpzb25fYnVpbGRfc3RyaW5nLCBqc29uX2VuY29kZSwganNvbl9vdXRfb2ZfbWVtb3J5 LCBqc29uX3BhcnNlX2Vycm9yKQooanNvbl9yZWxlYXNlX29iamVjdCwgY2hlY2tfc3RyaW5nX3dp dGhvdXRfZW1iZWRkZWRfbnVsbHMsIGpzb25fY2hlY2spCihsaXNwX3RvX2pzb24sIGxpc3BfdG9f anNvbl90b3BsZXZlbCwgbGlzcF90b19qc29uX3RvcGxldmVsXzEpCihqc29uX2luc2VydCwganNv bl9pbnNlcnRfY2FsbGJhY2ssIGpzb25fdG9fbGlzcCkKKGpzb25fcmVhZF9idWZmZXJfY2FsbGJh Y2ssIEZqc29uX3BhcnNlX2J1ZmZlciwgZGVmaW5lX2Vycm9yKTogTmV3CmhlbHBlciBmdW5jdGlv bnMuCihzeW1zX29mX2pzb24pOiBOZXcgZmlsZS4KCiogc3JjL2xpc3AuaDogRGVjbGFyYXRpb24g Zm9yIHN5bXNfb2ZfanNvbi4KCiogc3JjL2NvbmZfcG9zdC5oIChBVFRSSUJVVEVfV0FSTl9VTlVT RURfUkVTVUxUKTogTmV3IGF0dHJpYnV0ZSBtYWNyby4KCiogc3JjL2VtYWNzLmMgKG1haW4pOiBF bmFibGUgSlNPTiBmdW5jdGlvbnMuCgoqIHNyYy9ldmFsLmMgKGludGVybmFsX2NhdGNoX2FsbCwg aW50ZXJuYWxfY2F0Y2hfYWxsXzEpOiBOZXcgaGVscGVyCmZ1bmN0aW9ucyB0byBjYXRjaCBhbGwg c2lnbmFscy4KKHN5bXNfb2ZfZXZhbCk6IEFkZCB1bmludGVybmVkIHN5bWJvbCB0byBzaWduaWZ5 IG91dCBvZiBtZW1vcnkuCgoqIHNyYy9NYWtlZmlsZS5pbiAoSlNPTl9MSUJTLCBKU09OX0NGTEFH UywgSlNPTl9PQkosIEVNQUNTX0NGTEFHUykKKGJhc2Vfb2JqLCBMSUJFUyk6IENvbXBpbGUganNv bi5jIGlmIC0td2l0aC1qc29uIGlzIGVuYWJsZWQuCgoqIHRlc3Qvc3JjL2pzb24tdGVzdHMuZWwg KGpzb24tc2VyaWFsaXplL3JvdW5kdHJpcCkKKGpzb24tc2VyaWFsaXplL29iamVjdCwganNvbi1w YXJzZS1zdHJpbmcvb2JqZWN0KQooanNvbi1wYXJzZS1zdHJpbmcvc3RyaW5nLCBqc29uLXNlcmlh bGl6ZS9zdHJpbmcpCihqc29uLXBhcnNlLXN0cmluZy9pbmNvbXBsZXRlLCBqc29uLXBhcnNlLXN0 cmluZy90cmFpbGluZykKKGpzb24tcGFyc2UtYnVmZmVyL2luY29tcGxldGUsIGpzb24tcGFyc2Ut YnVmZmVyL3RyYWlsaW5nKTogTmV3IHVuaXQKdGVzdHMuCi0tLQogY29uZmlndXJlLmFjICAgICAg ICAgICB8ICAyMCArLQogZXRjL05FV1MgICAgICAgICAgICAgICB8ICAgNyArCiBzcmMvTWFrZWZp bGUuaW4gICAgICAgIHwgIDExICstCiBzcmMvY29uZl9wb3N0LmggICAgICAgIHwgICA2ICsKIHNy Yy9lbWFjcy5jICAgICAgICAgICAgfCAgIDQgKwogc3JjL2V2YWwuYyAgICAgICAgICAgICB8ICA1 NCArKysrKwogc3JjL2pzb24uYyAgICAgICAgICAgICB8IDU0MiArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBzcmMvbGlzcC5oICAgICAgICAgICAgIHwg ICA2ICsKIHRlc3Qvc3JjL2pzb24tdGVzdHMuZWwgfCAgOTcgKysrKysrKysrCiA5IGZpbGVzIGNo YW5nZWQsIDc0MyBpbnNlcnRpb25zKCspLCA0IGRlbGV0aW9ucygtKQogY3JlYXRlIG1vZGUgMTAw NjQ0IHNyYy9qc29uLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCB0ZXN0L3NyYy9qc29uLXRlc3RzLmVs CgpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmFjIGIvY29uZmlndXJlLmFjCmluZGV4IDYyN2EzOTJh NWIuLjdkMTkxYTMyY2QgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5hYworKysgYi9jb25maWd1cmUu YWMKQEAgLTM1NSw2ICszNTUsNyBAQCBBQ19ERUZVTgogT1BUSU9OX0RFRkFVTFRfT0ZGKFtjYWly b10sW2NvbXBpbGUgd2l0aCBDYWlybyBkcmF3aW5nIChleHBlcmltZW50YWwpXSkKIE9QVElPTl9E RUZBVUxUX09OKFt4bWwyXSxbZG9uJ3QgY29tcGlsZSB3aXRoIFhNTCBwYXJzaW5nIHN1cHBvcnRd KQogT1BUSU9OX0RFRkFVTFRfT04oW2ltYWdlbWFnaWNrXSxbZG9uJ3QgY29tcGlsZSB3aXRoIElt YWdlTWFnaWNrIGltYWdlIHN1cHBvcnRdKQorT1BUSU9OX0RFRkFVTFRfT04oW2pzb25dLCBbZG9u J3QgY29tcGlsZSB3aXRoIG5hdGl2ZSBKU09OIHN1cHBvcnRdKQogCiBPUFRJT05fREVGQVVMVF9P TihbeGZ0XSxbZG9uJ3QgdXNlIFhGVCBmb3IgYW50aSBhbGlhc2VkIGZvbnRzXSkKIE9QVElPTl9E RUZBVUxUX09OKFtsaWJvdGZdLFtkb24ndCB1c2UgbGlib3RmIGZvciBPcGVuVHlwZSBmb250IHN1 cHBvcnRdKQpAQCAtMjg1OSw2ICsyODYwLDIyIEBAIEFDX0RFRlVOCiBBQ19TVUJTVChMSUJTWVNU RU1EX0xJQlMpCiBBQ19TVUJTVChMSUJTWVNURU1EX0NGTEFHUykKIAorSEFWRV9KU09OPW5vCitK U09OX09CSj0KKworaWYgdGVzdCAiJHt3aXRoX2pzb259IiA9IHllczsgdGhlbgorICBFTUFDU19D SEVDS19NT0RVTEVTKFtKU09OXSwgW2phbnNzb24gPj0gMi41XSwKKyAgICBbSEFWRV9KU09OPXll c10sIFtIQVZFX0pTT049bm9dKQorICBpZiB0ZXN0ICIke0hBVkVfSlNPTn0iID0geWVzOyB0aGVu CisgICAgQUNfREVGSU5FKEhBVkVfSlNPTiwgMSwgW0RlZmluZSBpZiB1c2luZyBKYW5zc29uLl0p CisgICAgSlNPTl9PQko9anNvbi5vCisgIGZpCitmaQorCitBQ19TVUJTVChKU09OX0xJQlMpCitB Q19TVUJTVChKU09OX0NGTEFHUykKK0FDX1NVQlNUKEpTT05fT0JKKQorCiBOT1RJRllfT0JKPQog Tk9USUZZX1NVTU1BUlk9bm8KIApAQCAtNTM3MCw3ICs1Mzg3LDcgQEAgQUNfREVGVU4KIGZvciBv cHQgaW4gWEFXM0QgWFBNIEpQRUcgVElGRiBHSUYgUE5HIFJTVkcgQ0FJUk8gSU1BR0VNQUdJQ0sg U09VTkQgR1BNIERCVVMgXAogICBHQ09ORiBHU0VUVElOR1MgTk9USUZZIEFDTCBMSUJTRUxJTlVY IEdOVVRMUyBMSUJYTUwyIEZSRUVUWVBFIE0xN05fRkxUIFwKICAgTElCT1RGIFhGVCBaTElCIFRP T0xLSVRfU0NST0xMX0JBUlMgWF9UT09MS0lUIE9MRFhNRU5VIFgxMSBOUyBNT0RVTEVTIFwKLSAg WFdJREdFVFMgTElCU1lTVEVNRCBDQU5OT1RfRFVNUCBMQ01TMjsgZG8KKyAgWFdJREdFVFMgTElC U1lTVEVNRCBKU09OIENBTk5PVF9EVU1QIExDTVMyOyBkbwogCiAgICAgY2FzZSAkb3B0IGluCiAg ICAgICBDQU5OT1RfRFVNUCkgZXZhbCB2YWw9XCR7JG9wdH0gOzsKQEAgLTU0MjAsNiArNTQzNyw3 IEBAIEFDX0RFRlVOCiAgIERvZXMgRW1hY3MgdXNlIC1sb3RmPyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgJHtIQVZFX0xJQk9URn0KICAgRG9lcyBFbWFjcyB1c2UgLWx4ZnQ/ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke0hBVkVfWEZUfQogICBEb2VzIEVtYWNz IHVzZSAtbHN5c3RlbWQ/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7SEFWRV9MSUJT WVNURU1EfQorICBEb2VzIEVtYWNzIHVzZSAtbGphbnNzb24/ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICR7SEFWRV9KU09OfQogICBEb2VzIEVtYWNzIGRpcmVjdGx5IHVzZSB6bGliPyAg ICAgICAgICAgICAgICAgICAgICAgICAgICR7SEFWRV9aTElCfQogICBEb2VzIEVtYWNzIGhhdmUg ZHluYW1pYyBtb2R1bGVzIHN1cHBvcnQ/ICAgICAgICAgICAgICAgICR7SEFWRV9NT0RVTEVTfQog ICBEb2VzIEVtYWNzIHVzZSB0b29sa2l0IHNjcm9sbCBiYXJzPyAgICAgICAgICAgICAgICAgICAg ICR7VVNFX1RPT0xLSVRfU0NST0xMX0JBUlN9CmRpZmYgLS1naXQgYS9ldGMvTkVXUyBiL2V0Yy9O RVdTCmluZGV4IDc1YTk4ZDE1MDAuLjRhOTk3NjgyOGIgMTAwNjQ0Ci0tLSBhL2V0Yy9ORVdTCisr KyBiL2V0Yy9ORVdTCkBAIC0yNSw2ICsyNSwxMyBAQCBXaGVuIHlvdSBhZGQgYSBuZXcgaXRlbSwg dXNlIHRoZSBhcHByb3ByaWF0ZSBtYXJrIGlmIHlvdSBhcmUgc3VyZSBpdCBhcHBsaWVzLAogDAog KiBJbnN0YWxsYXRpb24gQ2hhbmdlcyBpbiBFbWFjcyAyNy4xCiAKKyoqIFRoZSBuZXcgY29uZmln dXJlIG9wdGlvbiAnLS13aXRoLWpzb24nIGFkZHMgc3VwcG9ydCBmb3IgSlNPTiB1c2luZwordGhl IEphbnNzb24gbGlicmFyeS4gIEl0IGlzIG9uIGJ5IGRlZmF1bHQ7IHVzZSAnY29uZmlndXJlCist LXdpdGgtanNvbj1ubycgdG8gYnVpbGQgd2l0aG91dCBKYW5zc29uIHN1cHBvcnQuICBUaGUgbmV3 IEpTT04KK2Z1bmN0aW9ucyAnanNvbi1zZXJpYWxpemUnLCAnanNvbi1pbnNlcnQnLCAnanNvbi1w YXJzZS1zdHJpbmcnLCBhbmQKKydqc29uLXBhcnNlLWJ1ZmZlcicgYXJlIHR5cGljYWxseSBtdWNo IGZhc3RlciB0aGFuIHRoZWlyIExpc3AKK2NvdW50ZXJwYXJ0cyBmcm9tIGpzb24uZWwuCisKIAwK ICogU3RhcnR1cCBDaGFuZ2VzIGluIEVtYWNzIDI3LjEKIApkaWZmIC0tZ2l0IGEvc3JjL01ha2Vm aWxlLmluIGIvc3JjL01ha2VmaWxlLmluCmluZGV4IDlhOGM5Yzg1ZjAuLmIzOTU2Mjc4OTMgMTAw NjQ0Ci0tLSBhL3NyYy9NYWtlZmlsZS5pbgorKysgYi9zcmMvTWFrZWZpbGUuaW4KQEAgLTMxMiw2 ICszMTIsMTAgQEAgTElCR05VVExTX0NGTEFHUyA9CiBMSUJTWVNURU1EX0xJQlMgPSBATElCU1lT VEVNRF9MSUJTQAogTElCU1lTVEVNRF9DRkxBR1MgPSBATElCU1lTVEVNRF9DRkxBR1NACiAKK0pT T05fTElCUyA9IEBKU09OX0xJQlNACitKU09OX0NGTEFHUyA9IEBKU09OX0NGTEFHU0AKK0pTT05f T0JKID0gQEpTT05fT0JKQAorCiBJTlRFUlZBTFNfSCA9IGRpc3BleHRlcm4uaCBpbnRlcnZhbHMu aCBjb21wb3NpdGUuaAogCiBHRVRMT0FEQVZHX0xJQlMgPSBAR0VUTE9BREFWR19MSUJTQApAQCAt MzYzLDcgKzM2Nyw3IEBAIEVNQUNTX0NGTEFHUz0KICAgJChXRUJLSVRfQ0ZMQUdTKSBcCiAgICQo U0VUVElOR1NfQ0ZMQUdTKSAkKEZSRUVUWVBFX0NGTEFHUykgJChGT05UQ09ORklHX0NGTEFHUykg XAogICAkKExJQk9URl9DRkxBR1MpICQoTTE3Tl9GTFRfQ0ZMQUdTKSAkKERFUEZMQUdTKSBcCi0g ICQoTElCU1lTVEVNRF9DRkxBR1MpIFwKKyAgJChMSUJTWVNURU1EX0NGTEFHUykgJChKU09OX0NG TEFHUykgXAogICAkKExJQkdOVVRMU19DRkxBR1MpICQoTk9USUZZX0NGTEFHUykgJChDQUlST19D RkxBR1MpIFwKICAgJChXRVJST1JfQ0ZMQUdTKQogQUxMX0NGTEFHUyA9ICQoRU1BQ1NfQ0ZMQUdT KSAkKFdBUk5fQ0ZMQUdTKSAkKENGTEFHUykKQEAgLTM5Nyw3ICs0MDEsNyBAQCBiYXNlX29iaiA9 CiAJdGhyZWFkLm8gc3lzdGhyZWFkLm8gXAogCSQoaWYgJChIWUJSSURfTUFMTE9DKSxzaGVhcC5v KSBcCiAJJChNU0RPU19PQkopICQoTVNET1NfWF9PQkopICQoTlNfT0JKKSAkKENZR1dJTl9PQkop ICQoRk9OVF9PQkopIFwKLQkkKFczMl9PQkopICQoV0lORE9XX1NZU1RFTV9PQkopICQoWEdTRUxP QkopCisJJChXMzJfT0JKKSAkKFdJTkRPV19TWVNURU1fT0JKKSAkKFhHU0VMT0JKKSAkKEpTT05f T0JKKQogb2JqID0gJChiYXNlX29iaikgJChOU19PQkpDX09CSikKIAogIyMgT2JqZWN0IGZpbGVz IHVzZWQgb24gc29tZSBtYWNoaW5lIG9yIG90aGVyLgpAQCAtNDkzLDcgKzQ5Nyw4IEBAIExJQkVT ID0KICAgICQoTElCU19URVJNQ0FQKSAkKEdFVExPQURBVkdfTElCUykgJChTRVRUSU5HU19MSUJT KSAkKExJQlNFTElOVVhfTElCUykgXAogICAgJChGUkVFVFlQRV9MSUJTKSAkKEZPTlRDT05GSUdf TElCUykgJChMSUJPVEZfTElCUykgJChNMTdOX0ZMVF9MSUJTKSBcCiAgICAkKExJQkdOVVRMU19M SUJTKSAkKExJQl9QVEhSRUFEKSAkKEdFVEFERFJJTkZPX0FfTElCUykgJChMSUJMQ01TMikgXAot ICAgJChOT1RJRllfTElCUykgJChMSUJfTUFUSCkgJChMSUJaKSAkKExJQk1PRFVMRVMpICQoTElC U1lTVEVNRF9MSUJTKQorICAgJChOT1RJRllfTElCUykgJChMSUJfTUFUSCkgJChMSUJaKSAkKExJ Qk1PRFVMRVMpICQoTElCU1lTVEVNRF9MSUJTKSBcCisgICAkKEpTT05fTElCUykKIAogIyMgRk9S Q0UgaXQgc28gdGhhdCBhZG1pbi91bmlkYXRhIGNhbiBkZWNpZGUgd2hldGhlciB0aGVzZSBmaWxl cwogIyMgYXJlIHVwLXRvLWRhdGUuICBBbHRob3VnaCBzaW5jZSBjaGFycHJvcCBkZXBlbmRzIG9u IGJvb3RzdHJhcC1lbWFjcywKZGlmZiAtLWdpdCBhL3NyYy9jb25mX3Bvc3QuaCBiL3NyYy9jb25m X3Bvc3QuaAppbmRleCBmZWJkYjhiOGJmLi4xYTdmNTFmYTUxIDEwMDY0NAotLS0gYS9zcmMvY29u Zl9wb3N0LmgKKysrIGIvc3JjL2NvbmZfcG9zdC5oCkBAIC0zMzgsNiArMzM4LDEyIEBAIGV4dGVy biBpbnQgZW1hY3Nfc2V0ZW52X1RaIChjaGFyIGNvbnN0ICopOwogIyBkZWZpbmUgQVRUUklCVVRF X05PX1NBTklUSVpFX0FERFJFU1MKICNlbmRpZgogCisjaWYgX19oYXNfYXR0cmlidXRlICh3YXJu X3VudXNlZF9yZXN1bHQpCisjIGRlZmluZSBBVFRSSUJVVEVfV0FSTl9VTlVTRURfUkVTVUxUIF9f YXR0cmlidXRlX18gKChfX3dhcm5fdW51c2VkX3Jlc3VsdF9fKSkKKyNlbHNlCisjIGRlZmluZSBB VFRSSUJVVEVfV0FSTl9VTlVTRURfUkVTVUxUCisjZW5kaWYKKwogLyogZ2NjIC1mc2FuaXRpemU9 YWRkcmVzcyBkb2VzIG5vdCB3b3JrIHdpdGggdmZvcmsgaW4gRmVkb3JhIDI1IHg4Ni02NC4KICAg IEZvciBub3csIGFzc3VtZSB0aGF0IHRoaXMgcHJvYmxlbSBvY2N1cnMgb24gYWxsIHBsYXRmb3Jt cy4gICovCiAjaWYgQUREUkVTU19TQU5JVElaRVIgJiYgIWRlZmluZWQgdmZvcmsKZGlmZiAtLWdp dCBhL3NyYy9lbWFjcy5jIGIvc3JjL2VtYWNzLmMKaW5kZXggMGZlN2Q5MTEzYi4uMzk3NjEwMTZl ZiAxMDA2NDQKLS0tIGEvc3JjL2VtYWNzLmMKKysrIGIvc3JjL2VtYWNzLmMKQEAgLTE2MTAsNiAr MTYxMCwxMCBAQCBVc2luZyBhbiBFbWFjcyBjb25maWd1cmVkIHdpdGggLS13aXRoLXgtdG9vbGtp dD1sdWNpZCBkb2VzIG5vdCBoYXZlIHRoaXMgcHJvYmxlbQogICAgICAgc3ltc19vZl90aHJlYWRz ICgpOwogICAgICAgc3ltc19vZl9wcm9maWxlciAoKTsKIAorI2lmZGVmIEhBVkVfSlNPTgorICAg ICAgc3ltc19vZl9qc29uICgpOworI2VuZGlmCisKICAgICAgIGtleXNfb2ZfY2FzZWZpZGRsZSAo KTsKICAgICAgIGtleXNfb2ZfY21kcyAoKTsKICAgICAgIGtleXNfb2ZfYnVmZmVyICgpOwpkaWZm IC0tZ2l0IGEvc3JjL2V2YWwuYyBiL3NyYy9ldmFsLmMKaW5kZXggYWNkYTY0ZTdmMC4uMTE4MDRk MTgxOSAxMDA2NDQKLS0tIGEvc3JjL2V2YWwuYworKysgYi9zcmMvZXZhbC5jCkBAIC0xNDE2LDYg KzE0MTYsNTcgQEAgaW50ZXJuYWxfY29uZGl0aW9uX2Nhc2VfbiAoTGlzcF9PYmplY3QgKCpiZnVu KSAocHRyZGlmZl90LCBMaXNwX09iamVjdCAqKSwKICAgICB9CiB9CiAKK3N0YXRpYyBMaXNwX09i amVjdAoraW50ZXJuYWxfY2F0Y2hfYWxsXzEgKExpc3BfT2JqZWN0ICgqZnVuY3Rpb24pICh2b2lk ICopLCB2b2lkICphcmd1bWVudCkKK3sKKyAgc3RydWN0IGhhbmRsZXIgKmMgPSBwdXNoX2hhbmRs ZXJfbm9zaWduYWwgKFF0LCBDQVRDSEVSX0FMTCk7CisgIGlmIChjID09IE5VTEwpCisgICAgcmV0 dXJuIFFjYXRjaF9hbGxfbWVtb3J5X2Z1bGw7CisKKyAgaWYgKHN5c19zZXRqbXAgKGMtPmptcCkg PT0gMCkKKyAgICB7CisgICAgICBMaXNwX09iamVjdCB2YWwgPSBmdW5jdGlvbiAoYXJndW1lbnQp OworICAgICAgZWFzc2VydCAoaGFuZGxlcmxpc3QgPT0gYyk7CisgICAgICBoYW5kbGVybGlzdCA9 IGMtPm5leHQ7CisgICAgICByZXR1cm4gdmFsOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAg IGVhc3NlcnQgKGhhbmRsZXJsaXN0ID09IGMpOworICAgICAgTGlzcF9PYmplY3QgdmFsID0gYy0+ dmFsOworICAgICAgaGFuZGxlcmxpc3QgPSBjLT5uZXh0OworICAgICAgRnNpZ25hbCAoUW5vX2Nh dGNoLCB2YWwpOworICAgIH0KK30KKworLyogTGlrZSBhIGNvbWJpbmF0aW9uIG9mIGludGVybmFs X2NvbmRpdGlvbl9jYXNlXzEgYW5kIGludGVybmFsX2NhdGNoLgorICAgQ2F0Y2hlcyBhbGwgc2ln bmFscyBhbmQgdGhyb3dzLiAgTmV2ZXIgZXhpdHMgbm9ubG9jYWxseTsgcmV0dXJucworICAgUWNh dGNoX2FsbF9tZW1vcnlfZnVsbCBpZiBubyBoYW5kbGVyIGNvdWxkIGJlIGFsbG9jYXRlZC4gICov CisKK0xpc3BfT2JqZWN0CitpbnRlcm5hbF9jYXRjaF9hbGwgKExpc3BfT2JqZWN0ICgqZnVuY3Rp b24pICh2b2lkICopLCB2b2lkICphcmd1bWVudCwKKyAgICAgICAgICAgICAgICAgICAgTGlzcF9P YmplY3QgKCpoYW5kbGVyKSAoTGlzcF9PYmplY3QpKQoreworICBzdHJ1Y3QgaGFuZGxlciAqYyA9 IHB1c2hfaGFuZGxlcl9ub3NpZ25hbCAoUXQsIENPTkRJVElPTl9DQVNFKTsKKyAgaWYgKGMgPT0g TlVMTCkKKyAgICByZXR1cm4gUWNhdGNoX2FsbF9tZW1vcnlfZnVsbDsKKworICBpZiAoc3lzX3Nl dGptcCAoYy0+am1wKSA9PSAwKQorICAgIHsKKyAgICAgIExpc3BfT2JqZWN0IHZhbCA9IGludGVy bmFsX2NhdGNoX2FsbF8xIChmdW5jdGlvbiwgYXJndW1lbnQpOworICAgICAgZWFzc2VydCAoaGFu ZGxlcmxpc3QgPT0gYyk7CisgICAgICBoYW5kbGVybGlzdCA9IGMtPm5leHQ7CisgICAgICByZXR1 cm4gdmFsOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGVhc3NlcnQgKGhhbmRsZXJsaXN0 ID09IGMpOworICAgICAgTGlzcF9PYmplY3QgdmFsID0gYy0+dmFsOworICAgICAgaGFuZGxlcmxp c3QgPSBjLT5uZXh0OworICAgICAgcmV0dXJuIGhhbmRsZXIgKHZhbCk7CisgICAgfQorfQorCiBz dHJ1Y3QgaGFuZGxlciAqCiBwdXNoX2hhbmRsZXIgKExpc3BfT2JqZWN0IHRhZ19jaF92YWwsIGVu dW0gaGFuZGxlcnR5cGUgaGFuZGxlcnR5cGUpCiB7CkBAIC00MDY1LDYgKzQxMTYsOSBAQCBhbGlz dCBvZiBhY3RpdmUgbGV4aWNhbCBiaW5kaW5ncy4gICovKTsKIAogICBpbmhpYml0X2xpc3BfY29k ZSA9IFFuaWw7CiAKKyAgREVGU1lNIChRY2F0Y2hfYWxsX21lbW9yeV9mdWxsLCAiY2F0Y2gtYWxs LW1lbW9yeS1mdWxsIik7CisgIEZ1bmludGVybiAoUWNhdGNoX2FsbF9tZW1vcnlfZnVsbCwgUW5p bCk7CisKICAgZGVmc3ViciAoJlNvcik7CiAgIGRlZnN1YnIgKCZTYW5kKTsKICAgZGVmc3ViciAo JlNpZik7CmRpZmYgLS1naXQgYS9zcmMvanNvbi5jIGIvc3JjL2pzb24uYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi5mNzA0NDc5ZGQ3Ci0tLSAvZGV2L251bGwKKysrIGIv c3JjL2pzb24uYwpAQCAtMCwwICsxLDU0MiBAQAorLyogSlNPTiBwYXJzaW5nIGFuZCBzZXJpYWxp emF0aW9uLgorCitDb3B5cmlnaHQgKEMpIDIwMTcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ bmMuCisKK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBFbWFjcy4KKworR05VIEVtYWNzIGlzIGZy ZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKK2l0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5Cit0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9m IHRoZSBMaWNlbnNlLCBvciAoYXQKK3lvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKwor R05VIEVtYWNzIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm dWwsCitidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3 YXJyYW50eSBvZgorTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFLiAgU2VlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0 YWlscy4KKworWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UKK2Fsb25nIHdpdGggR05VIEVtYWNzLiAgSWYgbm90LCBzZWUgPGh0 dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCisKKyNpbmNsdWRlIDxjb25maWcuaD4K KworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8 amFuc3Nvbi5oPgorCisjaW5jbHVkZSAibGlzcC5oIgorI2luY2x1ZGUgImJ1ZmZlci5oIgorI2lu Y2x1ZGUgImNvZGluZy5oIgorCitzdGF0aWMgYm9vbAoranNvbl9oYXNfcHJlZml4IChjb25zdCBj aGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKyAgc2l6ZV90IHN0cmluZ19sZW4g PSBzdHJsZW4gKHN0cmluZyk7CisgIHNpemVfdCBwcmVmaXhfbGVuID0gc3RybGVuIChwcmVmaXgp OworICByZXR1cm4gc3RyaW5nX2xlbiA+PSBwcmVmaXhfbGVuICYmIG1lbWNtcCAoc3RyaW5nLCBw cmVmaXgsIHByZWZpeF9sZW4pID09IDA7Cit9CisKK3N0YXRpYyBib29sCitqc29uX2hhc19zdWZm aXggKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqc3VmZml4KQoreworICBzaXplX3Qg c3RyaW5nX2xlbiA9IHN0cmxlbiAoc3RyaW5nKTsKKyAgc2l6ZV90IHN1ZmZpeF9sZW4gPSBzdHJs ZW4gKHN1ZmZpeCk7CisgIHJldHVybiBzdHJpbmdfbGVuID49IHN1ZmZpeF9sZW4KKyAgICAmJiBt ZW1jbXAgKHN0cmluZyArIHN0cmluZ19sZW4gLSBzdWZmaXhfbGVuLCBzdWZmaXgsIHN1ZmZpeF9s ZW4pID09IDA7Cit9CisKK3N0YXRpYyBMaXNwX09iamVjdAoranNvbl9tYWtlX3N0cmluZyAoY29u c3QgY2hhciAqZGF0YSwgcHRyZGlmZl90IHNpemUpCit7CisgIHJldHVybiBtYWtlX3NwZWNpZmll ZF9zdHJpbmcgKGRhdGEsIC0xLCBzaXplLCB0cnVlKTsKK30KKworc3RhdGljIExpc3BfT2JqZWN0 Citqc29uX2J1aWxkX3N0cmluZyAoY29uc3QgY2hhciAqZGF0YSkKK3sKKyAgc2l6ZV90IHNpemUg PSBzdHJsZW4gKGRhdGEpOworICBpZiAoRklYTlVNX09WRVJGTE9XX1AgKHNpemUpKQorICAgIHN0 cmluZ19vdmVyZmxvdyAoKTsKKyAgcmV0dXJuIGpzb25fbWFrZV9zdHJpbmcgKGRhdGEsIHNpemUp OworfQorCitzdGF0aWMgTGlzcF9PYmplY3QKK2pzb25fZW5jb2RlIChMaXNwX09iamVjdCBzdHJp bmcpCit7CisgIHJldHVybiBjb2RlX2NvbnZlcnRfc3RyaW5nIChzdHJpbmcsIFF1dGZfOF91bml4 LCBRdCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBfTm9yZXR1cm4gdm9pZAoranNv bl9vdXRfb2ZfbWVtb3J5ICh2b2lkKQoreworICB4c2lnbmFsMCAoUWpzb25fb3V0X29mX21lbW9y eSk7Cit9CisKK3N0YXRpYyBfTm9yZXR1cm4gdm9pZAoranNvbl9wYXJzZV9lcnJvciAoY29uc3Qg anNvbl9lcnJvcl90ICplcnJvcikKK3sKKyAgTGlzcF9PYmplY3Qgc3ltYm9sOworICAvKiBGSVhN RTogVXBzdHJlYW0gSmFuc3NvbiBzaG91bGQgaGF2ZSBhIHdheSB0byByZXR1cm4gZXJyb3IgY29k ZXMKKyAgICAgd2l0aG91dCBwYXJzaW5nIHRoZSBlcnJvciBtZXNzYWdlcy4gIFNlZQorICAgICBo dHRwczovL2dpdGh1Yi5jb20vYWtoZXJvbi9qYW5zc29uL2lzc3Vlcy8zNTIuICAqLworICBpZiAo anNvbl9oYXNfc3VmZml4IChlcnJvci0+dGV4dCwgImV4cGVjdGVkIG5lYXIgZW5kIG9mIGZpbGUi KSkKKyAgICBzeW1ib2wgPSBRanNvbl9lbmRfb2ZfZmlsZTsKKyAgZWxzZSBpZiAoanNvbl9oYXNf cHJlZml4IChlcnJvci0+dGV4dCwgImVuZCBvZiBmaWxlIGV4cGVjdGVkIikpCisgICAgc3ltYm9s ID0gUWpzb25fdHJhaWxpbmdfY29udGVudDsKKyAgZWxzZQorICAgIHN5bWJvbCA9IFFqc29uX3Bh cnNlX2Vycm9yOworICB4c2lnbmFsIChzeW1ib2wsCisgICAgICAgICAgIGxpc3Q1IChqc29uX2J1 aWxkX3N0cmluZyAoZXJyb3ItPnRleHQpLAorICAgICAgICAgICAgICAgICAganNvbl9idWlsZF9z dHJpbmcgKGVycm9yLT5zb3VyY2UpLCBtYWtlX25hdG51bSAoZXJyb3ItPmxpbmUpLAorICAgICAg ICAgICAgICAgICAgbWFrZV9uYXRudW0gKGVycm9yLT5jb2x1bW4pLCBtYWtlX25hdG51bSAoZXJy b3ItPnBvc2l0aW9uKSkpOworfQorCitzdGF0aWMgdm9pZAoranNvbl9yZWxlYXNlX29iamVjdCAo dm9pZCAqb2JqZWN0KQoreworICBqc29uX2RlY3JlZiAob2JqZWN0KTsKK30KKworc3RhdGljIHZv aWQKK2NoZWNrX3N0cmluZ193aXRob3V0X2VtYmVkZGVkX251bGxzIChMaXNwX09iamVjdCBvYmpl Y3QpCit7CisgIENIRUNLX1NUUklORyAob2JqZWN0KTsKKyAgQ0hFQ0tfVFlQRSAobWVtY2hyIChT REFUQSAob2JqZWN0KSwgJ1wwJywgU0JZVEVTIChvYmplY3QpKSA9PSBOVUxMLAorICAgICAgICAg ICAgICBRc3RyaW5nX3dpdGhvdXRfZW1iZWRkZWRfbnVsbHNfcCwgb2JqZWN0KTsKK30KKworc3Rh dGljIGpzb25fdCAqCitqc29uX2NoZWNrIChqc29uX3QgKm9iamVjdCkKK3sKKyAgaWYgKG9iamVj dCA9PSBOVUxMKQorICAgIGpzb25fb3V0X29mX21lbW9yeSAoKTsKKyAgcmV0dXJuIG9iamVjdDsK K30KKworc3RhdGljIGpzb25fdCAqbGlzcF90b19qc29uIChMaXNwX09iamVjdCk7CisKKy8qIFRo aXMgcmV0dXJucyBMaXNwX09iamVjdCBzbyB3ZSBjYW4gdXNlIHVuYmluZF90by4gIFRoZSByZXR1 cm4gdmFsdWUKKyAgIGlzIGFsd2F5cyBuaWwuICAqLworCitzdGF0aWMgX0dMX0FSR19OT05OVUxM ICgoMikpIExpc3BfT2JqZWN0CitsaXNwX3RvX2pzb25fdG9wbGV2ZWxfMSAoTGlzcF9PYmplY3Qg bGlzcCwganNvbl90ICoqanNvbikKK3sKKyAgaWYgKFZFQ1RPUlAgKGxpc3ApKQorICAgIHsKKyAg ICAgIHB0cmRpZmZfdCBzaXplID0gQVNJWkUgKGxpc3ApOworICAgICAgZWFzc2VydCAoc2l6ZSA+ PSAwKTsKKyAgICAgIGVhc3NlcnQgKHNpemUgPD0gU0laRV9NQVgpOworICAgICAgKmpzb24gPSBq c29uX2NoZWNrIChqc29uX2FycmF5ICgpKTsKKyAgICAgIHB0cmRpZmZfdCBjb3VudCA9IFNQRUNQ RExfSU5ERVggKCk7CisgICAgICByZWNvcmRfdW53aW5kX3Byb3RlY3RfcHRyIChqc29uX3JlbGVh c2Vfb2JqZWN0LCBqc29uKTsKKyAgICAgIGZvciAocHRyZGlmZl90IGkgPSAwOyBpIDwgc2l6ZTsg KytpKQorICAgICAgICB7CisgICAgICAgICAgaW50IHN0YXR1cworICAgICAgICAgICAgPSBqc29u X2FycmF5X2FwcGVuZF9uZXcgKCpqc29uLCBsaXNwX3RvX2pzb24gKEFSRUYgKGxpc3AsIGkpKSk7 CisgICAgICAgICAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICAgICAgICAgIGpzb25fb3V0X29mX21l bW9yeSAoKTsKKyAgICAgICAgICBlYXNzZXJ0IChzdGF0dXMgPT0gMCk7CisgICAgICAgIH0KKyAg ICAgIGVhc3NlcnQgKGpzb25fYXJyYXlfc2l6ZSAoKmpzb24pID09IHNpemUpOworICAgICAgY2xl YXJfdW53aW5kX3Byb3RlY3QgKGNvdW50KTsKKyAgICAgIHJldHVybiB1bmJpbmRfdG8gKGNvdW50 LCBRbmlsKTsKKyAgICB9CisgIGVsc2UgaWYgKEhBU0hfVEFCTEVfUCAobGlzcCkpCisgICAgewor ICAgICAgc3RydWN0IExpc3BfSGFzaF9UYWJsZSAqaCA9IFhIQVNIX1RBQkxFIChsaXNwKTsKKyAg ICAgICpqc29uID0ganNvbl9jaGVjayAoanNvbl9vYmplY3QgKCkpOworICAgICAgcHRyZGlmZl90 IGNvdW50ID0gU1BFQ1BETF9JTkRFWCAoKTsKKyAgICAgIHJlY29yZF91bndpbmRfcHJvdGVjdF9w dHIgKGpzb25fcmVsZWFzZV9vYmplY3QsICpqc29uKTsKKyAgICAgIGZvciAocHRyZGlmZl90IGkg PSAwOyBpIDwgSEFTSF9UQUJMRV9TSVpFIChoKTsgKytpKQorICAgICAgICBpZiAoIU5JTFAgKEhB U0hfSEFTSCAoaCwgaSkpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIExpc3BfT2JqZWN0IGtl eSA9IGpzb25fZW5jb2RlIChIQVNIX0tFWSAoaCwgaSkpOworICAgICAgICAgICAgLyogV2UgY2Fu 4oCZdCBzcGVjaWZ5IHRoZSBsZW5ndGgsIHNvIHRoZSBzdHJpbmcgbXVzdCBiZQorICAgICAgICAg ICAgICAgbnVsbC10ZXJtaW5hdGVkLiAgKi8KKyAgICAgICAgICAgIGNoZWNrX3N0cmluZ193aXRo b3V0X2VtYmVkZGVkX251bGxzIChrZXkpOworICAgICAgICAgICAgaW50IHN0YXR1cyA9IGpzb25f b2JqZWN0X3NldF9uZXcgKCpqc29uLCBTU0RBVEEgKGtleSksCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzcF90b19qc29uIChIQVNIX1ZBTFVFIChoLCBp KSkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAtMSkKKyAgICAgICAgICAgICAganNvbl9v dXRfb2ZfbWVtb3J5ICgpOworICAgICAgICAgICAgZWFzc2VydCAoc3RhdHVzID09IDApOworICAg ICAgICAgIH0KKyAgICAgIGNsZWFyX3Vud2luZF9wcm90ZWN0IChjb3VudCk7CisgICAgICByZXR1 cm4gdW5iaW5kX3RvIChjb3VudCwgUW5pbCk7CisgICAgfQorICB3cm9uZ190eXBlX2FyZ3VtZW50 IChRanNvbl92YWx1ZV9wLCBsaXNwKTsKK30KKworc3RhdGljIGpzb25fdCAqCitsaXNwX3RvX2pz b25fdG9wbGV2ZWwgKExpc3BfT2JqZWN0IGxpc3ApCit7CisgIGlmICgrK2xpc3BfZXZhbF9kZXB0 aCA+IG1heF9saXNwX2V2YWxfZGVwdGgpCisgICAgeHNpZ25hbDAgKFFqc29uX29iamVjdF90b29f ZGVlcCk7CisgIGpzb25fdCAqanNvbjsKKyAgbGlzcF90b19qc29uX3RvcGxldmVsXzEgKGxpc3As ICZqc29uKTsKKyAgLS1saXNwX2V2YWxfZGVwdGg7CisgIHJldHVybiBqc29uOworfQorCitzdGF0 aWMganNvbl90ICoKK2xpc3BfdG9fanNvbiAoTGlzcF9PYmplY3QgbGlzcCkKK3sKKyAgaWYgKEVR IChsaXNwLCBRQ251bGwpKQorICAgIHJldHVybiBqc29uX2NoZWNrIChqc29uX251bGwgKCkpOwor ICBlbHNlIGlmIChFUSAobGlzcCwgUUNmYWxzZSkpCisgICAgcmV0dXJuIGpzb25fY2hlY2sgKGpz b25fZmFsc2UgKCkpOworICBlbHNlIGlmIChFUSAobGlzcCwgUXQpKQorICAgIHJldHVybiBqc29u X2NoZWNrIChqc29uX3RydWUgKCkpOworICBlbHNlIGlmIChJTlRFR0VSUCAobGlzcCkpCisgICAg eworICAgICAgQ0hFQ0tfVFlQRV9SQU5HRURfSU5URUdFUiAoanNvbl9pbnRfdCwgbGlzcCk7Cisg ICAgICByZXR1cm4ganNvbl9jaGVjayAoanNvbl9pbnRlZ2VyIChYSU5UIChsaXNwKSkpOworICAg IH0KKyAgZWxzZSBpZiAoRkxPQVRQIChsaXNwKSkKKyAgICByZXR1cm4ganNvbl9jaGVjayAoanNv bl9yZWFsIChYRkxPQVRfREFUQSAobGlzcCkpKTsKKyAgZWxzZSBpZiAoU1RSSU5HUCAobGlzcCkp CisgICAgeworICAgICAgTGlzcF9PYmplY3QgZW5jb2RlZCA9IGpzb25fZW5jb2RlIChsaXNwKTsK KyAgICAgIHB0cmRpZmZfdCBzaXplID0gU0JZVEVTIChlbmNvZGVkKTsKKyAgICAgIGVhc3NlcnQg KHNpemUgPj0gMCk7CisgICAgICBlYXNzZXJ0IChzaXplIDw9IFNJWkVfTUFYKTsKKyAgICAgIHJl dHVybiBqc29uX2NoZWNrIChqc29uX3N0cmluZ24gKFNTREFUQSAoZW5jb2RlZCksIHNpemUpKTsK KyAgICB9CisKKyAgLyogTElTUCBub3cgbXVzdCBiZSBhIHZlY3RvciBvciBoYXNodGFibGUuICAq LworICByZXR1cm4gbGlzcF90b19qc29uX3RvcGxldmVsIChsaXNwKTsKK30KKworREVGVU4gKCJq c29uLXNlcmlhbGl6ZSIsIEZqc29uX3NlcmlhbGl6ZSwgU2pzb25fc2VyaWFsaXplLCAxLCAxLCBO VUxMLAorICAgICAgIGRvYzogLyogUmV0dXJuIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIE9C SkVDVCBhcyBhIHN0cmluZy4KK09CSkVDVCBtdXN0IGJlIGEgdmVjdG9yIG9yIGhhc2h0YWJsZSwg YW5kIGl0cyBlbGVtZW50cyBjYW4gcmVjdXJzaXZlbHkKK2NvbnRhaW4gYDpudWxsJywgYDpmYWxz ZScsIHQsIG51bWJlcnMsIHN0cmluZ3MsIG9yIG90aGVyIHZlY3RvcnMgYW5kCitoYXNodGFibGVz LiAgYDpudWxsJywgYDpmYWxzZScsIGFuZCB0IHdpbGwgYmUgY29udmVydGVkIHRvIEpTT04gbnVs bCwKK2ZhbHNlLCBhbmQgdHJ1ZSB2YWx1ZXMsIHJlc3BlY3RpdmVseS4gIFZlY3RvcnMgd2lsbCBi ZSBjb252ZXJ0ZWQgdG8KK0pTT04gYXJyYXlzLCBhbmQgaGFzaHRhYmxlcyB0byBKU09OIG9iamVj dHMuICBIYXNodGFibGUga2V5cyBtdXN0IGJlCitzdHJpbmdzIHdpdGhvdXQgZW1iZWRkZWQgbnVs bCBjaGFyYWN0ZXJzIGFuZCBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4KK2VhY2ggb2JqZWN0LiAgKi8p CisgIChMaXNwX09iamVjdCBvYmplY3QpCit7CisgIHB0cmRpZmZfdCBjb3VudCA9IFNQRUNQRExf SU5ERVggKCk7CisKKyAganNvbl90ICpqc29uID0gbGlzcF90b19qc29uX3RvcGxldmVsIChvYmpl Y3QpOworICByZWNvcmRfdW53aW5kX3Byb3RlY3RfcHRyIChqc29uX3JlbGVhc2Vfb2JqZWN0LCBq c29uKTsKKworICBjaGFyICpzdHJpbmcgPSBqc29uX2R1bXBzIChqc29uLCBKU09OX0NPTVBBQ1Qp OworICBpZiAoc3RyaW5nID09IE5VTEwpCisgICAganNvbl9vdXRfb2ZfbWVtb3J5ICgpOworICBy ZWNvcmRfdW53aW5kX3Byb3RlY3RfcHRyIChmcmVlLCBzdHJpbmcpOworCisgIHJldHVybiB1bmJp bmRfdG8gKGNvdW50LCBqc29uX2J1aWxkX3N0cmluZyAoc3RyaW5nKSk7Cit9CisKK3N0cnVjdCBq c29uX2J1ZmZlcl9hbmRfc2l6ZQoreworICBjb25zdCBjaGFyICpidWZmZXI7CisgIHNpemVfdCBu Ynl0ZXM7CisgIHB0cmRpZmZfdCBuY2hhcnM7Cit9OworCitzdGF0aWMgTGlzcF9PYmplY3QKK2pz b25faW5zZXJ0ICh2b2lkICpkYXRhKQoreworICBzdHJ1Y3QganNvbl9idWZmZXJfYW5kX3NpemUg KmJ1ZmZlcl9hbmRfc2l6ZSA9IGRhdGE7CisgIHNpemVfdCBuYnl0ZXMgPSBidWZmZXJfYW5kX3Np emUtPm5ieXRlczsKKyAgaWYgKG5ieXRlcyA9PSAwKQorICAgIHJldHVybiBRbmlsOworICBpZiAo bmJ5dGVzID4gUFRSRElGRl9NQVgpCisgICAgYnVmZmVyX292ZXJmbG93ICgpOworICBjb25zdCBj aGFyICpidWZmZXIgPSBidWZmZXJfYW5kX3NpemUtPmJ1ZmZlcjsKKyAgcHRyZGlmZl90IG5jaGFy cworICAgID0gY2hhcnNfaW5fdGV4dCAoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgYnVmZmVyX2Fu ZF9zaXplLT5idWZmZXIsIG5ieXRlcyk7CisgIGluc2VydF8xX2JvdGggKGJ1ZmZlciwgbmNoYXJz LCBuYnl0ZXMsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworICBidWZmZXJfYW5kX3NpemUtPm5jaGFy cyA9IG5jaGFyczsKKyAgcmV0dXJuIFFuaWw7Cit9CisKK3N0cnVjdCBqc29uX2luc2VydF9kYXRh Cit7CisgIC8qIG5pbCBpZiBqc29uX2luc2VydCBzdWNjZWVkZWQsIG90aGVyd2lzZSB0aGUgc3lt Ym9sCisgICAgIFFjYXRjaF9hbGxfbWVtb3J5X2Z1bGwgb3IgYSBjb25zIChFUlJPUi1TWU1CT0wg LiBFUlJPUi1EQVRBKS4gICovCisgIExpc3BfT2JqZWN0IGVycm9yOworICBwdHJkaWZmX3QgbmNo YXJzOworICBwdHJkaWZmX3QgbmJ5dGVzOworfTsKKworc3RhdGljIGludAoranNvbl9pbnNlcnRf Y2FsbGJhY2sgKGNvbnN0IGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHZvaWQgKmRhdGEpCit7 CisgIC8qIFRoaXMgZnVuY3Rpb24gbWF5IG5vdCBleGl0IG5vbmxvY2FsbHkuICAqLworICBzdHJ1 Y3QganNvbl9pbnNlcnRfZGF0YSAqZCA9IGRhdGE7CisgIHN0cnVjdCBqc29uX2J1ZmZlcl9hbmRf c2l6ZSBidWZmZXJfYW5kX3NpemUKKyAgICA9IHsuYnVmZmVyID0gYnVmZmVyLCAubmJ5dGVzID0g c2l6ZSwgLm5jaGFycyA9IDB9OworICBkLT5lcnJvciA9IGludGVybmFsX2NhdGNoX2FsbCAoanNv bl9pbnNlcnQsICZidWZmZXJfYW5kX3NpemUsIEZpZGVudGl0eSk7CisgIGJvb2wgb3ZlcmZsb3cg PSBJTlRfQUREX1dSQVBWIChkLT5uY2hhcnMsIGJ1ZmZlcl9hbmRfc2l6ZS5uY2hhcnMsICZkLT5u Y2hhcnMpOworICBlYXNzZXJ0ICghb3ZlcmZsb3cpOworICBvdmVyZmxvdyA9IElOVF9BRERfV1JB UFYgKGQtPm5ieXRlcywgc2l6ZSwgJmQtPm5ieXRlcyk7CisgIGVhc3NlcnQgKCFvdmVyZmxvdyk7 CisgIHJldHVybiBOSUxQIChkLT5lcnJvcikgPyAwIDogLTE7Cit9CisKK0RFRlVOICgianNvbi1p bnNlcnQiLCBGanNvbl9pbnNlcnQsIFNqc29uX2luc2VydCwgMSwgMSwgTlVMTCwKKyAgICAgICBk b2M6IC8qIEluc2VydCB0aGUgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBPQkpFQ1QgYmVmb3JlIHBv aW50LgorVGhpcyBpcyB0aGUgc2FtZSBhcyAoaW5zZXJ0IChqc29uLXNlcmlhbGl6ZSBPQkpFQ1Qp KSwgYnV0IHBvdGVudGlhbGx5CitmYXN0ZXIuICBTZWUgdGhlIGZ1bmN0aW9uIGBqc29uLXNlcmlh bGl6ZScgZm9yIGFsbG93ZWQgdmFsdWVzIG9mCitPQkpFQ1QuICAqLykKKyAgKExpc3BfT2JqZWN0 IG9iamVjdCkKK3sKKyAgcHRyZGlmZl90IGNvdW50ID0gU1BFQ1BETF9JTkRFWCAoKTsKKworICBq c29uX3QgKmpzb24gPSBsaXNwX3RvX2pzb24gKG9iamVjdCk7CisgIHJlY29yZF91bndpbmRfcHJv dGVjdF9wdHIgKGpzb25fcmVsZWFzZV9vYmplY3QsIGpzb24pOworCisgIHB0cmRpZmZfdCBvcG9p bnQgPSBQVDsKKyAgcHJlcGFyZV90b19tb2RpZnlfYnVmZmVyIChvcG9pbnQsIG9wb2ludCwgTlVM TCk7CisKKyAgc3RydWN0IGpzb25faW5zZXJ0X2RhdGEgZGF0YTsKKyAgaW50IHN0YXR1cworICAg ID0ganNvbl9kdW1wX2NhbGxiYWNrIChqc29uLCBqc29uX2luc2VydF9jYWxsYmFjaywgJmRhdGEs IEpTT05fQ09NUEFDVCk7CisgIGlmIChzdGF0dXMgPT0gLTEpCisgICAgeworICAgICAgaWYgKENP TlNQIChkYXRhLmVycm9yKSkKKyAgICAgICAgeHNpZ25hbCAoWENBUiAoZGF0YS5lcnJvciksIFhD RFIgKGRhdGEuZXJyb3IpKTsKKyAgICAgIGVsc2UKKyAgICAgICAganNvbl9vdXRfb2ZfbWVtb3J5 ICgpOworICAgIH0KKyAgZWFzc2VydCAoc3RhdHVzID09IDApOworICBlYXNzZXJ0IChOSUxQIChk YXRhLmVycm9yKSk7CisKKyAgc3RydWN0IGNvZGluZ19zeXN0ZW0gY29kaW5nOworICBzZXR1cF9j b2Rpbmdfc3lzdGVtIChRdXRmXzhfdW5peCwgJmNvZGluZyk7CisgIGVhc3NlcnQgKFBUID09IEdQ VCk7CisgIGRlY29kZV9jb2RpbmdfZ2FwICgmY29kaW5nLCBkYXRhLm5jaGFycywgZGF0YS5uYnl0 ZXMpOworCisgIHNpZ25hbF9hZnRlcl9jaGFuZ2UgKG9wb2ludCwgMCwgZGF0YS5uY2hhcnMpOwor ICB1cGRhdGVfY29tcG9zaXRpb25zIChvcG9pbnQsIFBULCBDSEVDS19CT1JERVIpOworICByZXR1 cm4gdW5iaW5kX3RvIChjb3VudCwgUW5pbCk7Cit9CisKK3N0YXRpYyBfR0xfQVJHX05PTk5VTEwg KCgxKSkgTGlzcF9PYmplY3QKK2pzb25fdG9fbGlzcCAoanNvbl90ICpqc29uKQoreworICBzd2l0 Y2ggKGpzb25fdHlwZW9mIChqc29uKSkKKyAgICB7CisgICAgY2FzZSBKU09OX05VTEw6CisgICAg ICByZXR1cm4gUUNudWxsOworICAgIGNhc2UgSlNPTl9GQUxTRToKKyAgICAgIHJldHVybiBRQ2Zh bHNlOworICAgIGNhc2UgSlNPTl9UUlVFOgorICAgICAgcmV0dXJuIFF0OworICAgIGNhc2UgSlNP Tl9JTlRFR0VSOgorICAgICAgeworICAgICAgICBqc29uX2ludF90IHZhbHVlID0ganNvbl9pbnRl Z2VyX3ZhbHVlIChqc29uKTsKKyAgICAgICAgaWYgKEZJWE5VTV9PVkVSRkxPV19QICh2YWx1ZSkp CisgICAgICAgICAgeHNpZ25hbDAgKFFvdmVyZmxvd19lcnJvcik7CisgICAgICAgIHJldHVybiBt YWtlX251bWJlciAodmFsdWUpOworICAgICAgfQorICAgIGNhc2UgSlNPTl9SRUFMOgorICAgICAg cmV0dXJuIG1ha2VfZmxvYXQgKGpzb25fcmVhbF92YWx1ZSAoanNvbikpOworICAgIGNhc2UgSlNP Tl9TVFJJTkc6CisgICAgICB7CisgICAgICAgIHNpemVfdCBzaXplID0ganNvbl9zdHJpbmdfbGVu Z3RoIChqc29uKTsKKyAgICAgICAgaWYgKEZJWE5VTV9PVkVSRkxPV19QIChzaXplKSkKKyAgICAg ICAgICBzdHJpbmdfb3ZlcmZsb3cgKCk7CisgICAgICAgIHJldHVybiBqc29uX21ha2Vfc3RyaW5n IChqc29uX3N0cmluZ192YWx1ZSAoanNvbiksIHNpemUpOworICAgICAgfQorICAgIGNhc2UgSlNP Tl9BUlJBWToKKyAgICAgIHsKKyAgICAgICAgaWYgKCsrbGlzcF9ldmFsX2RlcHRoID4gbWF4X2xp c3BfZXZhbF9kZXB0aCkKKyAgICAgICAgICB4c2lnbmFsMCAoUWpzb25fb2JqZWN0X3Rvb19kZWVw KTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBqc29uX2FycmF5X3NpemUgKGpzb24pOworICAgICAg ICBpZiAoRklYTlVNX09WRVJGTE9XX1AgKHNpemUpKQorICAgICAgICAgIHhzaWduYWwwIChRb3Zl cmZsb3dfZXJyb3IpOworICAgICAgICBMaXNwX09iamVjdCByZXN1bHQgPSBGbWFrZV92ZWN0b3Ig KG1ha2VfbmF0bnVtIChzaXplKSwgUXVuYm91bmQpOworICAgICAgICBmb3IgKHB0cmRpZmZfdCBp ID0gMDsgaSA8IHNpemU7ICsraSkKKyAgICAgICAgICBBU0VUIChyZXN1bHQsIGksCisgICAgICAg ICAgICAgICAganNvbl90b19saXNwIChqc29uX2FycmF5X2dldCAoanNvbiwgaSkpKTsKKyAgICAg ICAgLS1saXNwX2V2YWxfZGVwdGg7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9Cisg ICAgY2FzZSBKU09OX09CSkVDVDoKKyAgICAgIHsKKyAgICAgICAgaWYgKCsrbGlzcF9ldmFsX2Rl cHRoID4gbWF4X2xpc3BfZXZhbF9kZXB0aCkKKyAgICAgICAgICB4c2lnbmFsMCAoUWpzb25fb2Jq ZWN0X3Rvb19kZWVwKTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBqc29uX29iamVjdF9zaXplIChq c29uKTsKKyAgICAgICAgaWYgKEZJWE5VTV9PVkVSRkxPV19QIChzaXplKSkKKyAgICAgICAgICB4 c2lnbmFsMCAoUW92ZXJmbG93X2Vycm9yKTsKKyAgICAgICAgTGlzcF9PYmplY3QgcmVzdWx0ID0g Q0FMTE4gKEZtYWtlX2hhc2hfdGFibGUsIFFDdGVzdCwgUWVxdWFsLAorICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgUUNzaXplLCBtYWtlX25hdG51bSAoc2l6ZSkpOworICAgICAg ICBzdHJ1Y3QgTGlzcF9IYXNoX1RhYmxlICpoID0gWEhBU0hfVEFCTEUgKHJlc3VsdCk7CisgICAg ICAgIGNvbnN0IGNoYXIgKmtleV9zdHI7CisgICAgICAgIGpzb25fdCAqdmFsdWU7CisgICAgICAg IGpzb25fb2JqZWN0X2ZvcmVhY2ggKGpzb24sIGtleV9zdHIsIHZhbHVlKQorICAgICAgICAgIHsK KyAgICAgICAgICAgIExpc3BfT2JqZWN0IGtleSA9IGpzb25fYnVpbGRfc3RyaW5nIChrZXlfc3Ry KTsKKyAgICAgICAgICAgIEVNQUNTX1VJTlQgaGFzaDsKKyAgICAgICAgICAgIHB0cmRpZmZfdCBp ID0gaGFzaF9sb29rdXAgKGgsIGtleSwgJmhhc2gpOworICAgICAgICAgICAgZWFzc2VydCAoaSA8 IDApOworICAgICAgICAgICAgaGFzaF9wdXQgKGgsIGtleSwganNvbl90b19saXNwICh2YWx1ZSks IGhhc2gpOworICAgICAgICAgIH0KKyAgICAgICAgLS1saXNwX2V2YWxfZGVwdGg7CisgICAgICAg IHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorICAvKiBDYW7igJl0IGdldCBoZXJlLiAg Ki8KKyAgZW1hY3NfYWJvcnQgKCk7Cit9CisKK0RFRlVOICgianNvbi1wYXJzZS1zdHJpbmciLCBG anNvbl9wYXJzZV9zdHJpbmcsIFNqc29uX3BhcnNlX3N0cmluZywgMSwgMSwgTlVMTCwKKyAgICAg ICBkb2M6IC8qIFBhcnNlIHRoZSBKU09OIFNUUklORyBpbnRvIGEgTGlzcCBvYmplY3QuCitUaGlz IGlzIGVzc2VudGlhbGx5IHRoZSByZXZlcnNlIG9wZXJhdGlvbiBvZiBganNvbi1zZXJpYWxpemUn LCB3aGljaAorc2VlLiAgVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlIGEgdmVjdG9yIG9yIGhh c2h0YWJsZS4gIEl0cyBlbGVtZW50cword2lsbCBiZSBgOm51bGwnLCBgOmZhbHNlJywgdCwgbnVt YmVycywgc3RyaW5ncywgb3IgZnVydGhlciB2ZWN0b3JzIGFuZAoraGFzaHRhYmxlcy4gIElmIHRo ZXJlIGFyZSBkdXBsaWNhdGUga2V5cyBpbiBhbiBvYmplY3QsIGFsbCBidXQgdGhlCitsYXN0IG9u ZSBhcmUgaWdub3JlZC4gIElmIFNUUklORyBkb2Vzbid0IGNvbnRhaW4gYSB2YWxpZCBKU09OIG9i amVjdCwKK2FuIGVycm9yIG9mIHR5cGUgYGpzb24tcGFyc2UtZXJyb3InIGlzIHNpZ25hbGVkLiAg Ki8pCisgIChMaXNwX09iamVjdCBzdHJpbmcpCit7CisgIHB0cmRpZmZfdCBjb3VudCA9IFNQRUNQ RExfSU5ERVggKCk7CisgIExpc3BfT2JqZWN0IGVuY29kZWQgPSBqc29uX2VuY29kZSAoc3RyaW5n KTsKKyAgY2hlY2tfc3RyaW5nX3dpdGhvdXRfZW1iZWRkZWRfbnVsbHMgKGVuY29kZWQpOworCisg IGpzb25fZXJyb3JfdCBlcnJvcjsKKyAganNvbl90ICpvYmplY3QgPSBqc29uX2xvYWRzIChTU0RB VEEgKGVuY29kZWQpLCAwLCAmZXJyb3IpOworICBpZiAob2JqZWN0ID09IE5VTEwpCisgICAganNv bl9wYXJzZV9lcnJvciAoJmVycm9yKTsKKworICAvKiBBdm9pZCBsZWFraW5nIHRoZSBvYmplY3Qg aW4gY2FzZSBvZiBmdXJ0aGVyIGVycm9ycy4gICovCisgIGlmIChvYmplY3QgIT0gTlVMTCkKKyAg ICByZWNvcmRfdW53aW5kX3Byb3RlY3RfcHRyIChqc29uX3JlbGVhc2Vfb2JqZWN0LCBvYmplY3Qp OworCisgIHJldHVybiB1bmJpbmRfdG8gKGNvdW50LCBqc29uX3RvX2xpc3AgKG9iamVjdCkpOwor fQorCitzdHJ1Y3QganNvbl9yZWFkX2J1ZmZlcl9kYXRhCit7CisgIHB0cmRpZmZfdCBwb2ludDsK K307CisKK3N0YXRpYyBzaXplX3QKK2pzb25fcmVhZF9idWZmZXJfY2FsbGJhY2sgKHZvaWQgKmJ1 ZmZlciwgc2l6ZV90IGJ1Zmxlbiwgdm9pZCAqZGF0YSkKK3sKKyAgc3RydWN0IGpzb25fcmVhZF9i dWZmZXJfZGF0YSAqZCA9IGRhdGE7CisKKyAgLyogRmlyc3QsIHBhcnNlIGZyb20gcG9pbnQgdG8g dGhlIGdhcCBvciB0aGUgZW5kIG9mIHRoZSBhY2Nlc3NpYmxlCisgICAgIHBvcnRpb24sIHdoYXRl dmVyIGlzIGNsb3Nlci4gICovCisgIHB0cmRpZmZfdCBwb2ludCA9IGQtPnBvaW50OworICBwdHJk aWZmX3QgZW5kOworICB7CisgICAgYm9vbCBvdmVyZmxvdyA9IElOVF9BRERfV1JBUFYgKEJVRkZF Ul9DRUlMSU5HX09GIChwb2ludCksIDEsICZlbmQpOworICAgIGVhc3NlcnQgKCFvdmVyZmxvdyk7 CisgIH0KKyAgc2l6ZV90IGNvdW50OworICB7CisgICAgYm9vbCBvdmVyZmxvdyA9IElOVF9TVUJU UkFDVF9XUkFQViAoZW5kLCBwb2ludCwgJmNvdW50KTsKKyAgICBlYXNzZXJ0ICghb3ZlcmZsb3cp OworICB9CisgIGlmIChidWZsZW4gPCBjb3VudCkKKyAgICBjb3VudCA9IGJ1ZmxlbjsKKyAgbWVt Y3B5IChidWZmZXIsIEJZVEVfUE9TX0FERFIgKHBvaW50KSwgY291bnQpOworICB7CisgICAgYm9v bCBvdmVyZmxvdyA9IElOVF9BRERfV1JBUFYgKGQtPnBvaW50LCBjb3VudCwgJmQtPnBvaW50KTsK KyAgICBlYXNzZXJ0ICghb3ZlcmZsb3cpOworICB9CisgIHJldHVybiBjb3VudDsKK30KKworREVG VU4gKCJqc29uLXBhcnNlLWJ1ZmZlciIsIEZqc29uX3BhcnNlX2J1ZmZlciwgU2pzb25fcGFyc2Vf YnVmZmVyLAorICAgICAgIDAsIDAsIE5VTEwsCisgICAgICAgZG9jOiAvKiBSZWFkIEpTT04gb2Jq ZWN0IGZyb20gY3VycmVudCBidWZmZXIgc3RhcnRpbmcgYXQgcG9pbnQuCitUaGlzIGlzIHNpbWls YXIgdG8gYGpzb24tcGFyc2Utc3RyaW5nJywgd2hpY2ggc2VlLiAgTW92ZSBwb2ludCBhZnRlcgor dGhlIGVuZCBvZiB0aGUgb2JqZWN0IGlmIHBhcnNpbmcgd2FzIHN1Y2Nlc3NmdWwuICBPbiBlcnJv ciwgcG9pbnQgaXMKK25vdCBtb3ZlZC4gICovKQorICAodm9pZCkKK3sKKyAgcHRyZGlmZl90IGNv dW50ID0gU1BFQ1BETF9JTkRFWCAoKTsKKworICBwdHJkaWZmX3QgcG9pbnQgPSBQVF9CWVRFOwor ICBzdHJ1Y3QganNvbl9yZWFkX2J1ZmZlcl9kYXRhIGRhdGEgPSB7LnBvaW50ID0gcG9pbnR9Owor ICBqc29uX2Vycm9yX3QgZXJyb3I7CisgIGpzb25fdCAqb2JqZWN0ID0ganNvbl9sb2FkX2NhbGxi YWNrIChqc29uX3JlYWRfYnVmZmVyX2NhbGxiYWNrLCAmZGF0YSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIEpTT05fRElTQUJMRV9FT0ZfQ0hFQ0ssICZlcnJvcik7CisK KyAgaWYgKG9iamVjdCA9PSBOVUxMKQorICAgIGpzb25fcGFyc2VfZXJyb3IgKCZlcnJvcik7CisK KyAgLyogQXZvaWQgbGVha2luZyB0aGUgb2JqZWN0IGluIGNhc2Ugb2YgZnVydGhlciBlcnJvcnMu ICAqLworICByZWNvcmRfdW53aW5kX3Byb3RlY3RfcHRyIChqc29uX3JlbGVhc2Vfb2JqZWN0LCBv YmplY3QpOworCisgIC8qIENvbnZlcnQgYW5kIHRoZW4gbW92ZSBwb2ludCBvbmx5IGlmIGV2ZXJ5 dGhpbmcgc3VjY2VlZGVkLiAgKi8KKyAgTGlzcF9PYmplY3QgbGlzcCA9IGpzb25fdG9fbGlzcCAo b2JqZWN0KTsKKworICB7CisgICAgLyogQWRqdXN0IHBvaW50IGJ5IGhvdyBtdWNoIHdlIGp1c3Qg cmVhZC4gIERvIHRoaXMgaGVyZSBiZWNhdXNlCisgICAgICAgdG9rZW5lci0+Y2hhcl9vZmZzZXQg YmVjb21lcyBpbmNvcnJlY3QgYmVsb3cuICAqLworICAgIGJvb2wgb3ZlcmZsb3cgPSBJTlRfQURE X1dSQVBWIChwb2ludCwgZXJyb3IucG9zaXRpb24sICZwb2ludCk7CisgICAgZWFzc2VydCAoIW92 ZXJmbG93KTsKKyAgICBlYXNzZXJ0IChwb2ludCA8PSBaVl9CWVRFKTsKKyAgICBTRVRfUFRfQk9U SCAoQllURV9UT19DSEFSIChwb2ludCksIHBvaW50KTsKKyAgfQorCisgIHJldHVybiB1bmJpbmRf dG8gKGNvdW50LCBsaXNwKTsKK30KKworLyogU2ltcGxpZmllZCB2ZXJzaW9uIG9mIOKAmGRlZmlu ZS1lcnJvcuKAmSB0aGF0IHdvcmtzIHdpdGggcHVyZQorICAgb2JqZWN0cy4gICovCisKK3N0YXRp YyB2b2lkCitkZWZpbmVfZXJyb3IgKExpc3BfT2JqZWN0IG5hbWUsIGNvbnN0IGNoYXIgKm1lc3Nh Z2UsIExpc3BfT2JqZWN0IHBhcmVudCkKK3sKKyAgZWFzc2VydCAoU1lNQk9MUCAobmFtZSkpOwor ICBlYXNzZXJ0IChTWU1CT0xQIChwYXJlbnQpKTsKKyAgTGlzcF9PYmplY3QgcGFyZW50X2NvbmRp dGlvbnMgPSBGZ2V0IChwYXJlbnQsIFFlcnJvcl9jb25kaXRpb25zKTsKKyAgZWFzc2VydCAoQ09O U1AgKHBhcmVudF9jb25kaXRpb25zKSk7CisgIGVhc3NlcnQgKCFOSUxQIChGbWVtcSAocGFyZW50 LCBwYXJlbnRfY29uZGl0aW9ucykpKTsKKyAgZWFzc2VydCAoTklMUCAoRm1lbXEgKG5hbWUsIHBh cmVudF9jb25kaXRpb25zKSkpOworICBGcHV0IChuYW1lLCBRZXJyb3JfY29uZGl0aW9ucywgcHVy ZV9jb25zIChuYW1lLCBwYXJlbnRfY29uZGl0aW9ucykpOworICBGcHV0IChuYW1lLCBRZXJyb3Jf bWVzc2FnZSwgYnVpbGRfcHVyZV9jX3N0cmluZyAobWVzc2FnZSkpOworfQorCit2b2lkCitzeW1z X29mX2pzb24gKHZvaWQpCit7CisgIERFRlNZTSAoUUNudWxsLCAiOm51bGwiKTsKKyAgREVGU1lN IChRQ2ZhbHNlLCAiOmZhbHNlIik7CisKKyAgREVGU1lNIChRc3RyaW5nX3dpdGhvdXRfZW1iZWRk ZWRfbnVsbHNfcCwgInN0cmluZy13aXRob3V0LWVtYmVkZGVkLW51bGxzLXAiKTsKKyAgREVGU1lN IChRanNvbl92YWx1ZV9wLCAianNvbi12YWx1ZS1wIik7CisKKyAgREVGU1lNIChRdXRmXzhfdW5p eCwgInV0Zi04LXVuaXgiKTsKKworICBERUZTWU0gKFFqc29uX2Vycm9yLCAianNvbi1lcnJvciIp OworICBERUZTWU0gKFFqc29uX291dF9vZl9tZW1vcnksICJqc29uLW91dC1vZi1tZW1vcnkiKTsK KyAgREVGU1lNIChRanNvbl9wYXJzZV9lcnJvciwgImpzb24tcGFyc2UtZXJyb3IiKTsKKyAgREVG U1lNIChRanNvbl9lbmRfb2ZfZmlsZSwgImpzb24tZW5kLW9mLWZpbGUiKTsKKyAgREVGU1lNIChR anNvbl90cmFpbGluZ19jb250ZW50LCAianNvbi10cmFpbGluZy1jb250ZW50Iik7CisgIERFRlNZ TSAoUWpzb25fb2JqZWN0X3Rvb19kZWVwLCAianNvbi1vYmplY3QtdG9vLWRlZXAiKTsKKyAgZGVm aW5lX2Vycm9yIChRanNvbl9lcnJvciwgImdlbmVyaWMgSlNPTiBlcnJvciIsIFFlcnJvcik7Cisg IGRlZmluZV9lcnJvciAoUWpzb25fb3V0X29mX21lbW9yeSwKKyAgICAgICAgICAgICAgICAibm90 IGVub3VnaCBtZW1vcnkgZm9yIGNyZWF0aW5nIEpTT04gb2JqZWN0IiwgUWpzb25fZXJyb3IpOwor ICBkZWZpbmVfZXJyb3IgKFFqc29uX3BhcnNlX2Vycm9yLCAiY291bGQgbm90IHBhcnNlIEpTT04g c3RyZWFtIiwKKyAgICAgICAgICAgICAgICBRanNvbl9lcnJvcik7CisgIGRlZmluZV9lcnJvciAo UWpzb25fZW5kX29mX2ZpbGUsICJlbmQgb2YgSlNPTiBzdHJlYW0iLCBRanNvbl9wYXJzZV9lcnJv cik7CisgIGRlZmluZV9lcnJvciAoUWpzb25fdHJhaWxpbmdfY29udGVudCwgInRyYWlsaW5nIGNv bnRlbnQgYWZ0ZXIgSlNPTiBzdHJlYW0iLAorICAgICAgICAgICAgICAgIFFqc29uX3BhcnNlX2Vy cm9yKTsKKyAgZGVmaW5lX2Vycm9yIChRanNvbl9vYmplY3RfdG9vX2RlZXAsCisgICAgICAgICAg ICAgICAgIm9iamVjdCBjeWNsaWMgb3IgTGlzcCBldmFsdWF0aW9uIHRvbyBkZWVwIiwgUWpzb25f ZXJyb3IpOworCisgIERFRlNZTSAoUXB1cmUsICJwdXJlIik7CisgIERFRlNZTSAoUXNpZGVfZWZm ZWN0X2ZyZWUsICJzaWRlLWVmZmVjdC1mcmVlIik7CisKKyAgREVGU1lNIChRanNvbl9zZXJpYWxp emUsICJqc29uLXNlcmlhbGl6ZSIpOworICBERUZTWU0gKFFqc29uX3BhcnNlX3N0cmluZywgImpz b24tcGFyc2Utc3RyaW5nIik7CisgIEZwdXQgKFFqc29uX3NlcmlhbGl6ZSwgUXB1cmUsIFF0KTsK KyAgRnB1dCAoUWpzb25fc2VyaWFsaXplLCBRc2lkZV9lZmZlY3RfZnJlZSwgUXQpOworICBGcHV0 IChRanNvbl9wYXJzZV9zdHJpbmcsIFFwdXJlLCBRdCk7CisgIEZwdXQgKFFqc29uX3BhcnNlX3N0 cmluZywgUXNpZGVfZWZmZWN0X2ZyZWUsIFF0KTsKKworICBkZWZzdWJyICgmU2pzb25fc2VyaWFs aXplKTsKKyAgZGVmc3ViciAoJlNqc29uX2luc2VydCk7CisgIGRlZnN1YnIgKCZTanNvbl9wYXJz ZV9zdHJpbmcpOworICBkZWZzdWJyICgmU2pzb25fcGFyc2VfYnVmZmVyKTsKK30KZGlmZiAtLWdp dCBhL3NyYy9saXNwLmggYi9zcmMvbGlzcC5oCmluZGV4IDI2NjM3MDMzM2YuLjNhYjhmZGM0ZjMg MTAwNjQ0Ci0tLSBhL3NyYy9saXNwLmgKKysrIGIvc3JjL2xpc3AuaApAQCAtMzQ0MSw2ICszNDQx LDExIEBAIGV4dGVybiBpbnQgeF9iaXRtYXBfbWFzayAoc3RydWN0IGZyYW1lICosIHB0cmRpZmZf dCk7CiBleHRlcm4gdm9pZCByZXNldF9pbWFnZV90eXBlcyAodm9pZCk7CiBleHRlcm4gdm9pZCBz eW1zX29mX2ltYWdlICh2b2lkKTsKIAorI2lmZGVmIEhBVkVfSlNPTgorLyogRGVmaW5lZCBpbiBq c29uLmMuICAqLworZXh0ZXJuIHZvaWQgc3ltc19vZl9qc29uICh2b2lkKTsKKyNlbmRpZgorCiAv KiBEZWZpbmVkIGluIGluc2RlbC5jLiAgKi8KIGV4dGVybiB2b2lkIG1vdmVfZ2FwX2JvdGggKHB0 cmRpZmZfdCwgcHRyZGlmZl90KTsKIGV4dGVybiBfTm9yZXR1cm4gdm9pZCBidWZmZXJfb3ZlcmZs b3cgKHZvaWQpOwpAQCAtMzg2NCw2ICszODY5LDcgQEAgZXh0ZXJuIExpc3BfT2JqZWN0IGludGVy bmFsX2NvbmRpdGlvbl9jYXNlXzIgKExpc3BfT2JqZWN0ICgqKSAoTGlzcF9PYmplY3QsIExpc3AK IGV4dGVybiBMaXNwX09iamVjdCBpbnRlcm5hbF9jb25kaXRpb25fY2FzZV9uCiAgICAgKExpc3Bf T2JqZWN0ICgqKSAocHRyZGlmZl90LCBMaXNwX09iamVjdCAqKSwgcHRyZGlmZl90LCBMaXNwX09i amVjdCAqLAogICAgICBMaXNwX09iamVjdCwgTGlzcF9PYmplY3QgKCopIChMaXNwX09iamVjdCwg cHRyZGlmZl90LCBMaXNwX09iamVjdCAqKSk7CitleHRlcm4gTGlzcF9PYmplY3QgaW50ZXJuYWxf Y2F0Y2hfYWxsIChMaXNwX09iamVjdCAoKikgKHZvaWQgKiksIHZvaWQgKiwgTGlzcF9PYmplY3Qg KCopIChMaXNwX09iamVjdCkpOwogZXh0ZXJuIHN0cnVjdCBoYW5kbGVyICpwdXNoX2hhbmRsZXIg KExpc3BfT2JqZWN0LCBlbnVtIGhhbmRsZXJ0eXBlKTsKIGV4dGVybiBzdHJ1Y3QgaGFuZGxlciAq cHVzaF9oYW5kbGVyX25vc2lnbmFsIChMaXNwX09iamVjdCwgZW51bSBoYW5kbGVydHlwZSk7CiBl eHRlcm4gdm9pZCBzcGVjYmluZCAoTGlzcF9PYmplY3QsIExpc3BfT2JqZWN0KTsKZGlmZiAtLWdp dCBhL3Rlc3Qvc3JjL2pzb24tdGVzdHMuZWwgYi90ZXN0L3NyYy9qc29uLXRlc3RzLmVsCm5ldyBm aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjVkM2M4NGExMzYKLS0tIC9kZXYvbnVs bAorKysgYi90ZXN0L3NyYy9qc29uLXRlc3RzLmVsCkBAIC0wLDAgKzEsOTcgQEAKKzs7OyBqc29u LXRlc3RzLmVsIC0tLSB1bml0IHRlc3RzIGZvciBqc29uLmMgICAgICAgICAgLSotIGxleGljYWwt YmluZGluZzogdDsgLSotCisKKzs7IENvcHlyaWdodCAoQykgMjAxNyBGcmVlIFNvZnR3YXJlIEZv dW5kYXRpb24sIEluYy4KKworOzsgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEVtYWNzLgorCis7 OyBHTlUgRW1hY3MgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQorOzsgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKzs7IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCis7OyAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgorCis7OyBHTlUgRW1hY3MgaXMgZGlzdHJpYnV0ZWQgaW4g dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKzs7IGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCis7OyBNRVJDSEFOVEFC SUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCis7OyBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCis7OyBZb3Ugc2hv dWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZQorOzsgYWxvbmcgd2l0aCBHTlUgRW1hY3MuICBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251 Lm9yZy9saWNlbnNlcy8+LgorCis7OzsgQ29tbWVudGFyeToKKworOzsgVW5pdCB0ZXN0cyBmb3Ig c3JjL2pzb24uYy4KKworOzs7IENvZGU6CisKKyhyZXF1aXJlICdjbC1saWIpCisocmVxdWlyZSAn bWFwKQorCisoZXJ0LWRlZnRlc3QganNvbi1zZXJpYWxpemUvcm91bmR0cmlwICgpCisgIChsZXQg KChsaXNwIFs6bnVsbCA6ZmFsc2UgdCAwIDEyMyAtNDU2IDMuNzUgImFiY86xzrLOsyJdKQorICAg ICAgICAoanNvbiAiW251bGwsZmFsc2UsdHJ1ZSwwLDEyMywtNDU2LDMuNzUsXCJhYmPOsc6yzrNc Il0iKSkKKyAgICAoc2hvdWxkIChlcXVhbCAoanNvbi1zZXJpYWxpemUgbGlzcCkganNvbikpCisg ICAgKHdpdGgtdGVtcC1idWZmZXIKKyAgICAgIChqc29uLWluc2VydCBsaXNwKQorICAgICAgKHNo b3VsZCAoZXF1YWwgKGJ1ZmZlci1zdHJpbmcpIGpzb24pKQorICAgICAgKHNob3VsZCAoZW9icCkp KQorICAgIChzaG91bGQgKGVxdWFsIChqc29uLXBhcnNlLXN0cmluZyBqc29uKSBsaXNwKSkKKyAg ICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgICAgKGluc2VydCBqc29uKQorICAgICAgKGdvdG8tY2hh ciAxKQorICAgICAgKHNob3VsZCAoZXF1YWwgKGpzb24tcGFyc2UtYnVmZmVyKSBsaXNwKSkKKyAg ICAgIChzaG91bGQgKGVvYnApKSkpKQorCisoZXJ0LWRlZnRlc3QganNvbi1zZXJpYWxpemUvb2Jq ZWN0ICgpCisgIChsZXQgKCh0YWJsZSAobWFrZS1oYXNoLXRhYmxlIDp0ZXN0ICMnZXF1YWwpKSkK KyAgICAocHV0aGFzaCAiYWJjIiBbMSAyIHRdIHRhYmxlKQorICAgIChwdXRoYXNoICJkZWYiIDpu dWxsIHRhYmxlKQorICAgIChzaG91bGQgKGVxdWFsIChqc29uLXNlcmlhbGl6ZSB0YWJsZSkKKyAg ICAgICAgICAgICAgICAgICAie1wiYWJjXCI6WzEsMix0cnVlXSxcImRlZlwiOm51bGx9IikpKSkK KworKGVydC1kZWZ0ZXN0IGpzb24tcGFyc2Utc3RyaW5nL29iamVjdCAoKQorICAobGV0ICgoYWN0 dWFsCisgICAgICAgICAoanNvbi1wYXJzZS1zdHJpbmcKKyAgICAgICAgICAieyBcImFiY1wiIDog WzEsIDIsIHRydWVdLCBcImRlZlwiIDogbnVsbCwgXCJhYmNcIiA6IFs5LCBmYWxzZV0gfVxuIikp KQorICAgIChzaG91bGQgKGhhc2gtdGFibGUtcCBhY3R1YWwpKQorICAgIChzaG91bGQgKGVxdWFs IChoYXNoLXRhYmxlLWNvdW50IGFjdHVhbCkgMikpCisgICAgKHNob3VsZCAoZXF1YWwgKGNsLXNv cnQgKG1hcC1wYWlycyBhY3R1YWwpICMnc3RyaW5nPCA6a2V5ICMnY2FyKQorICAgICAgICAgICAg ICAgICAgICcoKCJhYmMiIC4gWzkgOmZhbHNlXSkgKCJkZWYiIC4gOm51bGwpKSkpKSkKKworKGVy dC1kZWZ0ZXN0IGpzb24tcGFyc2Utc3RyaW5nL3N0cmluZyAoKQorICAoc2hvdWxkLWVycm9yIChq c29uLXBhcnNlLXN0cmluZyAiW1wiZm9ybWZlZWRcZlwiXSIpIDp0eXBlICdqc29uLXBhcnNlLWVy cm9yKQorICAoc2hvdWxkIChlcXVhbCAoanNvbi1wYXJzZS1zdHJpbmcgIltcImZvbyBcXFwiYmFy XFxcIlwiXSIpIFsiZm9vIFwiYmFyXCIiXSkpCisgIChzaG91bGQgKGVxdWFsIChqc29uLXBhcnNl LXN0cmluZyAiW1wiYWJjzrHOss6zXCJdIikgWyJhYmPOsc6yzrMiXSkpCisgIChzaG91bGQgKGVx dWFsIChqc29uLXBhcnNlLXN0cmluZyAiW1wiXFxuYXNkXFx1MDQ0NFxcdTA0NGJcXHUwNDMyZmdo XFx0XCJdIikKKyAgICAgICAgICAgICAgICAgWyJcbmFzZNGE0YvQsmZnaFx0Il0pKQorICAoc2hv dWxkIChlcXVhbCAoanNvbi1wYXJzZS1zdHJpbmcgIltcIlxcdUQ4MzRcXHVERDFFXCJdIikgWyJc VTAwMDFEMTFFIl0pKQorICAoc2hvdWxkLWVycm9yIChqc29uLXBhcnNlLXN0cmluZyAiZm9vIikg OnR5cGUgJ2pzb24tcGFyc2UtZXJyb3IpKQorCisoZXJ0LWRlZnRlc3QganNvbi1zZXJpYWxpemUv c3RyaW5nICgpCisgIChzaG91bGQgKGVxdWFsIChqc29uLXNlcmlhbGl6ZSBbImZvbyJdKSAiW1wi Zm9vXCJdIikpCisgIChzaG91bGQgKGVxdWFsIChqc29uLXNlcmlhbGl6ZSBbImFcblxmYiJdKSAi W1wiYVxcblxcZmJcIl0iKSkKKyAgKHNob3VsZCAoZXF1YWwgKGpzb24tc2VyaWFsaXplIFsiXG5h c2TRhNGL0LJcdTAwMWZcdTAwN2ZmZ2hcdCJdKQorICAgICAgICAgICAgICAgICAiW1wiXFxuYXNk 0YTRi9CyXFx1MDAxRlx1MDA3ZmZnaFxcdFwiXSIpKSkKKworKGVydC1kZWZ0ZXN0IGpzb24tcGFy c2Utc3RyaW5nL2luY29tcGxldGUgKCkKKyAgKHNob3VsZC1lcnJvciAoanNvbi1wYXJzZS1zdHJp bmcgIlsxMjMiKSA6dHlwZSAnanNvbi1lbmQtb2YtZmlsZSkpCisKKyhlcnQtZGVmdGVzdCBqc29u LXBhcnNlLXN0cmluZy90cmFpbGluZyAoKQorICAoc2hvdWxkLWVycm9yIChqc29uLXBhcnNlLXN0 cmluZyAiWzEyM10gWzQ1Nl0iKSA6dHlwZSAnanNvbi10cmFpbGluZy1jb250ZW50KSkKKworKGVy dC1kZWZ0ZXN0IGpzb24tcGFyc2UtYnVmZmVyL2luY29tcGxldGUgKCkKKyAgKHdpdGgtdGVtcC1i dWZmZXIKKyAgICAoaW5zZXJ0ICJbMTIzIikKKyAgICAoZ290by1jaGFyIDEpCisgICAgKHNob3Vs ZC1lcnJvciAoanNvbi1wYXJzZS1idWZmZXIpIDp0eXBlICdqc29uLWVuZC1vZi1maWxlKQorICAg IChzaG91bGQgKGJvYnApKSkpCisKKyhlcnQtZGVmdGVzdCBqc29uLXBhcnNlLWJ1ZmZlci90cmFp bGluZyAoKQorICAod2l0aC10ZW1wLWJ1ZmZlcgorICAgIChpbnNlcnQgIlsxMjNdIFs0NTZdIikK KyAgICAoZ290by1jaGFyIDEpCisgICAgKHNob3VsZCAoZXF1YWwgKGpzb24tcGFyc2UtYnVmZmVy KSBbMTIzXSkpCisgICAgKHNob3VsZC1ub3QgKGJvYnApKQorICAgIChzaG91bGQgKGxvb2tpbmct YXQtcCAocnggIiBbNDU2XSIgZW9zKSkpKSkKKworKHByb3ZpZGUgJ2pzb24tdGVzdHMpCis7Ozsg anNvbi10ZXN0cy5lbCBlbmRzIGhlcmUKLS0gCjIuMTQuMgoK --001a113cc1e80c3be8055b0cd26f--