Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wALW7-002I8g-1a for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 05:31:55 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wALW5-0055nN-33 for pgsql-hackers@arkaria.postgresql.org; Wed, 08 Apr 2026 05:31:54 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wALW5-0055nF-0v for pgsql-hackers@lists.postgresql.org; Wed, 08 Apr 2026 05:31:54 +0000 Received: from mail-yx1-xb12b.google.com ([2607:f8b0:4864:20::b12b]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wALW3-00000001AO6-0qTD for pgsql-hackers@postgresql.org; Wed, 08 Apr 2026 05:31:52 +0000 Received: by mail-yx1-xb12b.google.com with SMTP id 956f58d0204a3-6505ef94043so3293080d50.2 for ; Tue, 07 Apr 2026 22:31:51 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1775626311; cv=none; d=google.com; s=arc-20240605; b=HqQUzhIujH8Gz8mwN5glkrr4/xGEEUF6k7pIUl/VyVsKrx6LR0XBLl7zBDdOizkpYx 871Px0QtYwcF4CR6osbYLzD2kHesjS1CL7TbkaQctxLu1L9qRT7SzJ76L9uGVeClDq1n TkXv+pn92xrXnX2yUKteIbPBsAZf4ePWjbmdQbgC9DSiev1m6s+gvhBiuj1KRKCIRxHG Pkuwrc+HoJy7t9m9C+A6WQDTYp52Stq9CbBmfox2PJSoKbTeNOpXn2gz8jwfBlrtq2mt qldFt5tpF/HjYxqQo/sczAbfAf3fN5xGeUFC127Ji3eK0TKI3cQiGWTPEKbcQi9Xdst0 STSw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=to:subject:message-id:date:from:mime-version:dkim-signature; bh=Ee/eHkTuyAk2PJlLNqMrN7EkF70lgoW8/LmDJbB8gOI=; fh=FIa6CnAOcDlblDMIqVQXhn30ONA1aoHzZ0tfczHgg8I=; b=UX9WkQEIF7fTtBOfj1RIsDrV5a8d4tjU6uWGAahMPCQwwGx6mfIyjDz8jCXx38oLQ6 dvYPYfFVGMKI6R+ydSjeud/pN7F+8tOnQ03/soaVCHwe4UAN18oDi7JW2l0zF5FDlGNs ZzAc++RrQGPOXwT54MnWWEZjBKCy3sG1Ft5TZdGx6LR2lw8TgIK43iqXMdEvaJcgqSiS D0ww5faaccwQMxO6y7GSBh+4yCsFTcGgAdcj1b7VMZLakD2soxPXOytDWivjbvbxb+CT jmuF3nyhh/jhYUWtlQAWlA9GFYWd3WlbE3IwwnShdrxasLKqC32JV72a1smjr+n4wUyu O7ZA==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1775626311; x=1776231111; darn=postgresql.org; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=Ee/eHkTuyAk2PJlLNqMrN7EkF70lgoW8/LmDJbB8gOI=; b=BhYLgmOA0kPLfbSsHl7hlKSj+/MwPZVtSHc3mPOLyYLgb863ZWcmC7rZULzXzvmNq9 Zn36Ao2mjZ0kMKn2DXvmrlXkAtyxmFuGaFmGxuzZ3c1Wud3y/L5J1RXPwBgpy8N17+vH jgSRzdM10Qdp2Sb8QYcmJ7cOA7PNFbEAJ2V4buNYUqBlEwBnqFkvh0lYb1umdKxdePMm 1lJ6bZl3W15ceQCHk6Q9HbhcLvFgjbLDvDty1lvY33sEzcboazNHrNmVVI09lBzF+aWG OHKy2HbvZ8u+A7DvJT3NOugJDe9GFAdMMw9AdoPOiHO/vZ6hXUPZsp1gsQVyncjDin6m bD5g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1775626311; x=1776231111; h=to:subject:message-id:date:from:mime-version:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Ee/eHkTuyAk2PJlLNqMrN7EkF70lgoW8/LmDJbB8gOI=; b=KSWsrTvx8buesq0COhygQgoBRxKDYOXntHIzG8QKQjwdcQKjyb1lSwzBecjRcLDgUR ZMVL/aDG2M4UzxfQVjChBjLqR3nEbYb5fOVZupVmShOA39/wz0FOIl7JMLbkremX4zEB lNYyL606CwmQPlFBboZd47XfZ75P2E39CYYBtgOGWux2611q9fLiPdiPSX+WU7Ob+jnm D+HOGsrZO690ZiYsD6fms9q3ZnaOYfqxhbUDxYhdtd/ENGyAI/iXk3KJGWieILmVw3Ma 81YzpElfhgksQv1R592c0ubEuLQWacjC0OLkMD9AzFYMkUui2Rd9MCb/rBgSt3y40FwN cGPA== X-Gm-Message-State: AOJu0Yymq9j9pAqYX7kv8prUv3J0znvuOUJFoIWm7B24OH5Yz2CDdfum QHWl6Rk/Uq6Du368MfAA2+GMwoWa336GFAyeQWyTzer5ILuQXEu5VZ7ex4KMk23l7k5j0CcM1HH VMVYF9MNC9Hk5Tp81vHNie2d+aIZraK+72u95 X-Gm-Gg: AeBDiescd61KdkfysmYiigJhLGF17AH/qR/OOCL0UDrswUbFPVXmWYYCoRNhBHR1u/C ZWX8MMokUWFCN7xQ8T/YDiAmeJ/UnaOFIxQaYLJilAkEUvOUDSF3ni9+Z0XzCsEv+DbrlYnU9/S uINpSuH1BEFChiWN91+38gEHOzgZ23f/2bXS50Sic9MvujdElEijZCAtp3uscVhmXmU7/VfuxB7 1nnROfX9tmCRlGO2EWaL1XXklCWvx4LgbpHsmmv515JXndKMCruy1PxLkB9ahXLIwCY1Rp6Sxmi /1lfm4t+fH2JRHRgqvAfqdSSBFYE6Fpz/kqtcdlhO2gGGs+oWeo= X-Received: by 2002:a05:690e:1509:b0:64c:97ae:2e75 with SMTP id 956f58d0204a3-650488b7195mr18520173d50.69.1775626310655; Tue, 07 Apr 2026 22:31:50 -0700 (PDT) MIME-Version: 1.0 From: Haibo Yan Date: Tue, 7 Apr 2026 22:31:39 -0700 X-Gm-Features: AQROBzAXdpIaBkJMWjTYecJ0w2C4CJrOtrCZooGMZq7xJprHMoj7v6lm7y8LnvI Message-ID: Subject: [PATCH] DISTINCT in plain aggregate window functions To: PostgreSQL-development Content-Type: multipart/mixed; boundary="0000000000008052e7064eec3726" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000008052e7064eec3726 Content-Type: multipart/alternative; boundary="0000000000008052e6064eec3724" --0000000000008052e6064eec3724 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Hackers I=E2=80=99d like to start a patch series to add support for DISTINCT in pla= in aggregate window functions. PostgreSQL currently rejects cases such as: ---------------------------------------------------------------------------= ------------------------------ count(DISTINCT x) OVER (PARTITION BY p) sum(DISTINCT x) OVER () ---------------------------------------------------------------------------= ------------------------------ My plan is to implement this incrementally, by frame class and by feature dimension, rather than trying to solve every case in a single patch. For the first step, I=E2=80=99m posting patches 1-2 only and would apprecia= te your review on those. Patch 1 is intentionally very small: - add parse/deparse plumbing for DISTINCT in plain aggregate window functions - carry the information through WindowFunc - preserve it in ruleutils / deparse - but still reject execution Patch 1 by itself does not add user-visible execution support, so I think it is best reviewed together with patch 2. Patch 2 adds the first real executor support: - plain aggregate window functions only - single-argument DISTINCT only - whole-partition frames only That means support for cases where the frame is effectively the entire partition, for example: ---------------------------------------------------------------------------= ------------------------------ count(DISTINCT x) OVER (PARTITION BY p) sum(DISTINCT x) OVER () avg(DISTINCT x) OVER ( PARTITION BY p ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) ---------------------------------------------------------------------------= ------------------------------ The executor approach in patch 2 is deliberately conservative: - collect the partition=E2=80=99s aggregate inputs - sort and deduplicate them - feed the distinct values into the aggregate transition function - finalize once - reuse the cached result for all rows in the partition This avoids the much harder moving-frame cases for now. My proposed overall roadmap is below: Patch 1 - parse/deparse plumbing only - allow DISTINCT to be represented on plain aggregate window functions - preserve it through deparse / view definition - still reject execution Patch 2 - executor support for whole-partition frames - plain aggregate window functions only - single-argument DISTINCT only - sort-and-dedup implementation Patch 3 - executor support for non-shrinking frames - frames starting at UNBOUNDED PRECEDING with no EXCLUDE - incremental hash-based seen-set - covers default ORDER BY frame and supported ... CURRENT ROW / ... FOLLOWING cases Patch 4 - executor support for sliding ROWS frames - refcounted DISTINCT state - add/remove distinct contributions as rows enter and leave the frame - fallback to restart/recompute for aggregates without inverse transition support Patch 5 - extend the sliding DISTINCT machinery to sliding RANGE and GROUPS - keep the same refcounted model - no EXCLUDE yet Patch 6 - support EXCLUDE clauses - likely correctness-first, with restart/recompute where incremental maintenance is too awkward Patch 7 - support multi-argument DISTINCT - upgrade DISTINCT keys from single datum to tuple/composite key representation Patch 8 - support aggregate ORDER BY inside window aggregates - left until last because it is orthogonal to frame-shape support and substantially complicates both parse representation and executor behavio= r In short, the roadmap is: 1. plumbing 2. whole-partition 3. non-shrinking 4. sliding ROWS 5. sliding RANGE / GROUPS 6. EXCLUDE 7. multi-arg DISTINCT 8. aggregate ORDER BY For this posting, I=E2=80=99d especially appreciate feedback on: - whether patch 1 + patch 2 is a reasonable first split - whether whole-partition-only executor support is a good first executable step - whether the proposed long-term breakdown seems sensible Thanks in advance for any review or comments. Best regards, Haibo Yan --0000000000008052e6064eec3724 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable

Hi Hackers

I=E2=80=99d like = to start a patch series to add support for DISTINC= T in plain aggregate window functions.

PostgreSQL currently rejects cases such as:

-----------------------------------------------------------= ----------------------------------------------

count(DISTINCT x) OVER (PARTITION BY p)

sum(DISTINCT x) <= span class=3D"gmail-Apple-converted-space">=C2=A0 OVER ()

----------------------------= ---------------------------------------------------------------------------= --

My plan is to implement this incrementally, by = frame class and by feature dimension, rather than trying to solve every cas= e in a single patch.

For the first step, I=E2=80= =99m posting patches 1-2 only and would appreciate your review on those.

Patch 1 is intentionally very small:

  • add parse/deparse plu= mbing for DISTINCT in plain aggregate windo= w functions
  • carry the information through = WindowFunc
  • preserve it in ruleutils / deparse
  • but st= ill reject execution

Patch 1 by itself does = not add user-visible execution support, so I think it is best reviewed toge= ther with patch 2.

Patch 2 adds the first real exe= cutor support:

  • plain aggregate window functions only
  • single-argument DISTINCT only
  • whole-partition frames on= ly

That means support for cases where the frame is e= ffectively the entire partition, for example:

----= ---------------------------------------------------------------------------= --------------------------

count(DISTINCT x) OVER = (PARTITION BY p)
sum(DISTINCT x) =C2=A0 OVER ()
avg(DISTINCT x) =C2= =A0 OVER (
=C2=A0 =C2=A0 PARTITION BY p
=C2=A0 =C2=A0 ROWS BETWEEN UN= BOUNDED PRECEDING AND UNBOUNDED FOLLOWING
)

---= ---------------------------------------------------------------------------= ---------------------------

The executor approach = in patch 2 is deliberately conservative:

  • collect the partition=E2=80=99s aggregat= e inputs
  • sort and deduplicate them
  • feed the distinct values= into the aggregate transition function
  • finalize once
  • reuse= the cached result for all rows in the partition

This avoids the much harder moving-frame cases fo= r now.

My proposed overall roadmap is below:

Patch 1

  • parse/deparse plumbing only
  • allow DISTINCT to be represented on plain aggregate window f= unctions
  • preserve it through deparse / view definition
  • stil= l reject execution

Patch 2

  • executor support for wh= ole-partition frames
  • plain aggregate window functions only
  • = single-argument DISTINCT only
  • sort-= and-dedup implementation

Patch 3

  • executor support = for non-shrinking frames
  • frames starting at UNBOUNDED PRECEDING with no EXCLUDE
  • incremental hash-based seen-set
  • covers default ORDER BY frame and supported ... CURRENT ROW / ... FOLLOWING cas= es

Patch 4

  • executor support for sliding ROWS frames
  • refcounted DISTINCT state
  • add/remove distinct contributions as rows enter and leave the framefallback to restart/recompute for aggregates without inverse transition s= upport

Patch 5

  • extend the sliding DISTINCT machine= ry to sliding RANGE and GROUPS
  • keep the same refcounted model
  • no EXCLUDE yet
  • =

Patch 6

  • support EXCLUDE clauses
  • likely correctness-first, with restart/recompute where in= cremental maintenance is too awkward

Patch 7=

  • suppo= rt multi-argument DISTINCT
  • upgrade = DISTINCT keys from single datum to tuple/composite key representation
  • <= /ul>

    Patch 8

    • support aggregate ORDE= R BY inside window aggregates
    • left until last because it is = orthogonal to frame-shape support and substantially complicates both parse = representation and executor behavior

    In shor= t, the roadmap is:

    1. plumbing
    2. whole-partition
    3. non-shrinking
    4. sliding ROWS
    5. sliding RANGE / GROUPS
    6. EXCLUDE
    7. multi-arg DISTINCT
    8. aggregate ORDER BY

    For this posting, I=E2=80=99d especially appreciate feedback on:

    • whether = patch 1 + patch 2 is a reasonable first split
    • whether whole-partiti= on-only executor support is a good first executable step
    • whether th= e proposed long-term breakdown seems sensible

    Thanks in advance for any review or comments.

    Be= st regards,

    Haibo Yan


--0000000000008052e6064eec3724-- --0000000000008052e7064eec3726 Content-Type: application/octet-stream; name="v1-0001-Support-parsing-and-deparsing-DISTINCT-in-window-.patch" Content-Disposition: attachment; filename="v1-0001-Support-parsing-and-deparsing-DISTINCT-in-window-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnplyupn0 RnJvbSAwMjU5ZmRiMWM1YTcyNWNkOWY2YjU4N2I4MDI5OGJhZjllM2I2MjIwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYWlibyBZYW4gPGhhaWJvLnlhbkBhcHBsZS5jb20+CkRhdGU6 IE1vbiwgNiBBcHIgMjAyNiAyMzo1MDo1MCAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggdjEgMS81XSBT dXBwb3J0IHBhcnNpbmcgYW5kIGRlcGFyc2luZyBESVNUSU5DVCBpbiB3aW5kb3cKIGFnZ3JlZ2F0 ZSBjYWxscwoKUG9zdGdyZVNRTCBoYXMgbG9uZyByZWplY3RlZCBzeW50YXggbGlrZQoKICBjb3Vu dChESVNUSU5DVCB4KSBPVkVSICguLi4pCiAgc3VtKERJU1RJTkNUIHgpIE9WRVIgKC4uLikKCmF0 IHBhcnNlIHRpbWUgd2l0aDoKCiAgRElTVElOQ1QgaXMgbm90IGltcGxlbWVudGVkIGZvciB3aW5k b3cgZnVuY3Rpb25zCgpUaGF0IHBhcnNlci10aW1lIHJlamVjdGlvbiBtYWtlcyBpdCBpbXBvc3Np YmxlIHRvIGNhcnJ5IHRoZSBzeW50YXgKdGhyb3VnaCBwYXJzZSBhbmFseXNpcywgbm9kZSBzZXJp YWxpemF0aW9uLCBydWxldXRpbHMgZGVwYXJzZSwgb3Igdmlldwpyb3VuZC10cmlwcGluZywgYW5k IGl0IGFsc28gZm9yY2VzIGFsbCBmdXR1cmUgd29yayBvbiBleGVjdXRpb24gc3VwcG9ydAp0byBz dGFydCBieSByZW9wZW5pbmcgdGhlIHBhcnNlciBkZWNpc2lvbi4KClRoaXMgcGF0Y2ggZG9lcyBu b3QgaW1wbGVtZW50IGV4ZWN1dGlvbiBzZW1hbnRpY3MgZm9yIERJU1RJTkNUIGluIHdpbmRvdwph Z2dyZWdhdGVzIHlldC4gIEluc3RlYWQsIGl0IHBlcmZvcm1zIHRoZSBmaXJzdCwgaW50ZW50aW9u YWxseSBuYXJyb3csCnN0ZXA6IHByZXNlcnZlIHRoZSBzeW50YXggaW4gdGhlIHBhcnNlIHRyZWUg YW5kIG1vdmUgdGhlIHJlamVjdGlvbiB0bwpleGVjdXRvciBpbml0aWFsaXphdGlvbi4KClNwZWNp ZmljYWxseSwgdGhpcyBwYXRjaDoKCiogYWRkcyBhIG5ldyBib29sZWFuIGZpZWxkLCBgd2luZGlz dGluY3RgLCB0byBgV2luZG93RnVuY2AsIHJlY29yZGluZwogIHdoZXRoZXIgRElTVElOQ1Qgd2Fz IHN5bnRhY3RpY2FsbHkgc3BlY2lmaWVkIG9uIGEgd2luZG93IGFnZ3JlZ2F0ZQogIGNhbGw7Cgoq IHJlbW92ZXMgdGhlIGV4aXN0aW5nIHBhcnNlci10aW1lIEZFQVRVUkVfTk9UX1NVUFBPUlRFRCBl cnJvciBpbgogIGBwYXJzZV9mdW5jLmNgIGZvciBESVNUSU5DVCBvbiB3aW5kb3cgYWdncmVnYXRl cywgYW5kIHNldHMKICBgd2Z1bmMtPndpbmRpc3RpbmN0YCBpbnN0ZWFkOwoKKiB0ZWFjaGVzIGBy dWxldXRpbHMuY2AgdG8gcHJpbnQgRElTVElOQ1QgZm9yIGBXaW5kb3dGdW5jYCBub2RlcyB3aXRo CiAgYHdpbmRpc3RpbmN0ID0gdHJ1ZWAsIHNvIHN0b3JlZCBydWxlcyBhbmQgYHBnX2dldF92aWV3 ZGVmKClgIHByZXNlcnZlCiAgdGhlIG9yaWdpbmFsIHN5bnRheDsKCiogYWRkcyBhIHRlbXBvcmFy eSBleGVjdXRvci1zaWRlIEZFQVRVUkVfTk9UX1NVUFBPUlRFRCBlcnJvciBpbiB0aGUKICBXaW5k b3dBZ2cgaW5pdGlhbGl6YXRpb24gcGF0aDoKCiAgICBESVNUSU5DVCBpcyBub3QgeWV0IGltcGxl bWVudGVkIGZvciB3aW5kb3cgYWdncmVnYXRlcwoKICBzbyBleGVjdXRpb24gc3RpbGwgZmFpbHMg Y2xlYW5seSB1bnRpbCByZWFsIGV4ZWN1dG9yIHN1cHBvcnQgaXMgYWRkZWQuCgpBcyBhIHJlc3Vs dCwgcXVlcmllcyB1c2luZyBESVNUSU5DVCBpbiB3aW5kb3cgYWdncmVnYXRlIGNhbGxzIG5vdyBw YXJzZQpzdWNjZXNzZnVsbHksIGNhbiBiZSBwcmVzZXJ2ZWQgaW4gc3RvcmVkIHJlcHJlc2VudGF0 aW9ucywgYW5kIGRlcGFyc2UKY29ycmVjdGx5LCBidXQgc3RpbGwgZmFpbCBhdCBleGVjdXRpb24g dGltZSByYXRoZXIgdGhhbiBwYXJzZSB0aW1lLgoKVGhpcyBwYXRjaCBpcyBpbnRlbnRpb25hbGx5 IGV4ZWN1dG9yLXN0cmF0ZWd5LWFnbm9zdGljLiAgSW4gcGFydGljdWxhciwKaXQgZG9lcyBub3Qg eWV0IGRlY2lkZSBhbnkgb2YgdGhlIGZvbGxvd2luZzoKCiogd2hldGhlciB2MSBleGVjdXRpb24g c3VwcG9ydCBzaG91bGQgYmUgbGltaXRlZCB0byB3aG9sZS1wYXJ0aXRpb24KICBmcmFtZXMsIG9y IGFsc28gaW5jbHVkZSBncm93LW9ubHkgZnJhbWVzOwoKKiB3aGV0aGVyIERJU1RJTkNUIHRyYWNr aW5nIHNob3VsZCBiZSBzb3J0LWJhc2VkLCBoYXNoLWJhc2VkLCBvciBhCiAgaHlicmlkIGRlcGVu ZGluZyBvbiBmcmFtZSBzaGFwZSBhbmQgdHlwZSBjYXBhYmlsaXRpZXM7CgoqIHdoZXRoZXIgYW55 IGZ1dHVyZSBleGVjdXRpb24gcGF0aCBzaG91bGQgaW1wb3NlIGhhc2hhYmlsaXR5CiAgcmVzdHJp Y3Rpb25zIGZvciBzb21lIGZyYW1lIGNsYXNzZXMuCgpEZWZlcnJpbmcgdGhvc2UgcXVlc3Rpb25z IGtlZXBzIHRoaXMgcGF0Y2ggc21hbGwgYW5kIHJldmlld2FibGUsIHdoaWxlCmNyZWF0aW5nIHRo ZSBtaW5pbWFsIGluZnJhc3RydWN0dXJlIG5lZWRlZCBmb3IgZm9sbG93LXVwIGV4ZWN1dG9yIHdv cmsuCgpSZWdyZXNzaW9uIHRlc3RzIGNvdmVyOgoKKiBzdWNjZXNzZnVsIHBhcnNpbmcgb2YgYSBE SVNUSU5DVCB3aW5kb3cgYWdncmVnYXRlIGNhbGw7CiogcHJlc2VydmF0aW9uIG9mIERJU1RJTkNU IHRocm91Z2ggZGVwYXJzZSAvIHZpZXcgZGVmaW5pdGlvbiBvdXRwdXQ7CiogdGhlIG5ldyBleGVj dXRvci1zaWRlIEZFQVRVUkVfTk9UX1NVUFBPUlRFRCBmYWlsdXJlLgoKRnV0dXJlIHdvcmsgd2ls bCByZXBsYWNlIHRoZSB0ZW1wb3JhcnkgZXhlY3V0b3Itc2lkZSByZWplY3Rpb24gd2l0aCByZWFs CldpbmRvd0FnZyBzdXBwb3J0IGZvciBESVNUSU5DVCBzZW1hbnRpY3MuCi0tLQogc3JjL2JhY2tl bmQvZXhlY3V0b3Ivbm9kZVdpbmRvd0FnZy5jIHwgIDkgKysrKysrKysrCiBzcmMvYmFja2VuZC9v cHRpbWl6ZXIvdXRpbC9jbGF1c2VzLmMgfCAgMSArCiBzcmMvYmFja2VuZC9wYXJzZXIvcGFyc2Vf ZnVuYy5jICAgICAgfCAgNiArKysrLS0KIHNyYy9iYWNrZW5kL3V0aWxzL2FkdC9ydWxldXRpbHMu YyAgICB8ICAyICsrCiBzcmMvaW5jbHVkZS9ub2Rlcy9wcmltbm9kZXMuaCAgICAgICAgfCAgMiAr Kwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC93aW5kb3cub3V0IHwgMjMgKysrKysrKysrKysr KysrKysrKysrKysKIHNyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwgICAgICB8IDE4ICsr KysrKysrKysrKysrKysrKwogNyBmaWxlcyBjaGFuZ2VkLCA1OSBpbnNlcnRpb25zKCspLCAyIGRl bGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVXaW5kb3dB Z2cuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVXaW5kb3dBZ2cuYwppbmRleCA3ODRjZWVi ODI0Ni4uOTQzMWNhZTlhZTAgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVX aW5kb3dBZ2cuYworKysgYi9zcmMvYmFja2VuZC9leGVjdXRvci9ub2RlV2luZG93QWdnLmMKQEAg LTI5MDgsNiArMjkwOCwxNSBAQCBpbml0aWFsaXplX3BlcmFnZyhXaW5kb3dBZ2dTdGF0ZSAqd2lu c3RhdGUsIFdpbmRvd0Z1bmMgKndmdW5jLAogCWludAkJCWk7CiAJTGlzdENlbGwgICAqbGM7CiAK KwkvKgorCSAqIFRlbXBvcmFyeTogcmVqZWN0IERJU1RJTkNUIHdpbmRvdyBhZ2dyZWdhdGVzIHVu dGlsIGV4ZWN1dG9yIHN1cHBvcnQKKwkgKiBsYW5kcy4gIFBhdGNoIDIgd2lsbCByZXBsYWNlIHRo aXMgd2l0aCBhY3R1YWwgRElTVElOQ1QgaGFuZGxpbmcuCisJICovCisJaWYgKHdmdW5jLT53aW5k aXN0aW5jdCkKKwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVf Tk9UX1NVUFBPUlRFRCksCisJCQkJIGVycm1zZygiRElTVElOQ1QgaXMgbm90IHlldCBpbXBsZW1l bnRlZCBmb3Igd2luZG93IGFnZ3JlZ2F0ZXMiKSkpOworCiAJbnVtQXJndW1lbnRzID0gbGlzdF9s ZW5ndGgod2Z1bmMtPmFyZ3MpOwogCiAJaSA9IDA7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9v cHRpbWl6ZXIvdXRpbC9jbGF1c2VzLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9jbGF1 c2VzLmMKaW5kZXggOWZiMjY2ZDA4OWQuLjk3NDkwNTZlMmQzIDEwMDY0NAotLS0gYS9zcmMvYmFj a2VuZC9vcHRpbWl6ZXIvdXRpbC9jbGF1c2VzLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3V0aWwvY2xhdXNlcy5jCkBAIC0yODE0LDYgKzI4MTQsNyBAQCBldmFsX2NvbnN0X2V4cHJlc3Np b25zX211dGF0b3IoTm9kZSAqbm9kZSwKIAkJCQluZXdleHByLT53aW5yZWYgPSBleHByLT53aW5y ZWY7CiAJCQkJbmV3ZXhwci0+d2luc3RhciA9IGV4cHItPndpbnN0YXI7CiAJCQkJbmV3ZXhwci0+ d2luYWdnID0gZXhwci0+d2luYWdnOworCQkJCW5ld2V4cHItPndpbmRpc3RpbmN0ID0gZXhwci0+ d2luZGlzdGluY3Q7CiAJCQkJbmV3ZXhwci0+aWdub3JlX251bGxzID0gZXhwci0+aWdub3JlX251 bGxzOwogCQkJCW5ld2V4cHItPmxvY2F0aW9uID0gZXhwci0+bG9jYXRpb247CiAKZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL3BhcnNlci9wYXJzZV9mdW5jLmMgYi9zcmMvYmFja2VuZC9wYXJzZXIv cGFyc2VfZnVuYy5jCmluZGV4IDM1ZmY2NDI3MTQ3Li5kMjE2ZDUzZTUzMCAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvcGFyc2VyL3BhcnNlX2Z1bmMuYworKysgYi9zcmMvYmFja2VuZC9wYXJzZXIv cGFyc2VfZnVuYy5jCkBAIC04NDcsNiArODQ3LDcgQEAgUGFyc2VGdW5jT3JDb2x1bW4oUGFyc2VT dGF0ZSAqcHN0YXRlLCBMaXN0ICpmdW5jbmFtZSwgTGlzdCAqZmFyZ3MsCiAJCS8qIHdpbnJlZiB3 aWxsIGJlIHNldCBieSB0cmFuc2Zvcm1XaW5kb3dGdW5jQ2FsbCAqLwogCQl3ZnVuYy0+d2luc3Rh ciA9IGFnZ19zdGFyOwogCQl3ZnVuYy0+d2luYWdnID0gKGZkcmVzdWx0ID09IEZVTkNERVRBSUxf QUdHUkVHQVRFKTsKKwkJd2Z1bmMtPndpbmRpc3RpbmN0ID0gYWdnX2Rpc3RpbmN0OwogCQl3ZnVu Yy0+YWdnZmlsdGVyID0gYWdnX2ZpbHRlcjsKIAkJd2Z1bmMtPmlnbm9yZV9udWxscyA9IGlnbm9y ZV9udWxsczsKIAkJd2Z1bmMtPnJ1bkNvbmRpdGlvbiA9IE5JTDsKQEAgLTg1NCwxMSArODU1LDEy IEBAIFBhcnNlRnVuY09yQ29sdW1uKFBhcnNlU3RhdGUgKnBzdGF0ZSwgTGlzdCAqZnVuY25hbWUs IExpc3QgKmZhcmdzLAogCiAJCS8qCiAJCSAqIGFnZ19zdGFyIGlzIGFsbG93ZWQgZm9yIGFnZ3Jl Z2F0ZSBmdW5jdGlvbnMgYnV0IGRpc3RpbmN0IGlzbid0CisJCSAqIGFsbG93ZWQgZm9yIG5vbi1h Z2dyZWdhdGUgd2luZG93IGZ1bmN0aW9ucy4KIAkJICovCi0JCWlmIChhZ2dfZGlzdGluY3QpCisJ CWlmIChhZ2dfZGlzdGluY3QgJiYgIXdmdW5jLT53aW5hZ2cpCiAJCQllcmVwb3J0KEVSUk9SLAog CQkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCi0JCQkJCSBlcnJt c2coIkRJU1RJTkNUIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3Igd2luZG93IGZ1bmN0aW9ucyIpLAor CQkJCQkgZXJybXNnKCJESVNUSU5DVCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIG5vbi1hZ2dyZWdh dGUgd2luZG93IGZ1bmN0aW9ucyIpLAogCQkJCQkgcGFyc2VyX2VycnBvc2l0aW9uKHBzdGF0ZSwg bG9jYXRpb24pKSk7CiAKIAkJLyoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9y dWxldXRpbHMuYyBiL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9ydWxldXRpbHMuYwppbmRleCAzNTA4 M2ZjYzczMy4uNjAyNDQ2ZWVmYWQgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL2FkdC9y dWxldXRpbHMuYworKysgYi9zcmMvYmFja2VuZC91dGlscy9hZHQvcnVsZXV0aWxzLmMKQEAgLTEx NjU5LDYgKzExNjU5LDggQEAgZ2V0X3dpbmRvd2Z1bmNfZXhwcl9oZWxwZXIoV2luZG93RnVuYyAq d2Z1bmMsIGRlcGFyc2VfY29udGV4dCAqY29udGV4dCwKIAkJYXBwZW5kU3RyaW5nSW5mb0NoYXIo YnVmLCAnKicpOwogCWVsc2UKIAl7CisJCWlmICh3ZnVuYy0+d2luZGlzdGluY3QpCisJCQlhcHBl bmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIkRJU1RJTkNUICIpOwogCQlpZiAoaXNfanNvbl9vYmpl Y3RhZ2cpCiAJCXsKIAkJCWdldF9ydWxlX2V4cHIoKE5vZGUgKikgbGluaXRpYWwod2Z1bmMtPmFy Z3MpLCBjb250ZXh0LCBmYWxzZSk7CmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS9ub2Rlcy9wcmlt bm9kZXMuaCBiL3NyYy9pbmNsdWRlL25vZGVzL3ByaW1ub2Rlcy5oCmluZGV4IDZkZmM5NDZjMjBi Li4xZTk4NGRmYmZkYSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvcHJpbW5vZGVzLmgK KysrIGIvc3JjL2luY2x1ZGUvbm9kZXMvcHJpbW5vZGVzLmgKQEAgLTYxNCw2ICs2MTQsOCBAQCB0 eXBlZGVmIHN0cnVjdCBXaW5kb3dGdW5jCiAJYm9vbAkJd2luc3RhciBwZ19ub2RlX2F0dHIocXVl cnlfanVtYmxlX2lnbm9yZSk7CiAJLyogaXMgZnVuY3Rpb24gYSBzaW1wbGUgYWdncmVnYXRlPyAq LwogCWJvb2wJCXdpbmFnZyBwZ19ub2RlX2F0dHIocXVlcnlfanVtYmxlX2lnbm9yZSk7CisJLyog dHJ1ZSBpZiBhZ2dyZWdhdGUgYXJndW1lbnRzIHdlcmUgbWFya2VkIERJU1RJTkNUICovCisJYm9v bAkJd2luZGlzdGluY3Q7CiAJLyogaWdub3JlIG51bGxzLiBPbmUgb2YgdGhlIE51bGwgVHJlYXRt ZW50IG9wdGlvbnMgKi8KIAlpbnQJCQlpZ25vcmVfbnVsbHM7CiAJLyogdG9rZW4gbG9jYXRpb24s IG9yIC0xIGlmIHVua25vd24gKi8KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvd2luZG93Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvd2luZG93Lm91dAppbmRl eCA3YTA0ZDNhN2E5Zi4uMGY0ZGMyZmU5NmYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mv ZXhwZWN0ZWQvd2luZG93Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3dpbmRv dy5vdXQKQEAgLTU4NzYsMyArNTg3NiwyNiBAQCBXSU5ET1cgdyBBUyAoT1JERVIgQlkgeCBST1dT IEJFVFdFRU4gMiBQUkVDRURJTkcgQU5EIDIgRk9MTE9XSU5HKTsKIC0tY2xlYW51cAogRFJPUCBU QUJMRSBwbGFuZXRzIENBU0NBREU7CiBOT1RJQ0U6ICBkcm9wIGNhc2NhZGVzIHRvIHZpZXcgcGxh bmV0c192aWV3CistLQorLS0gVGVzdCBESVNUSU5DVCBpbiB3aW5kb3cgYWdncmVnYXRlcyAocGFy c2UvZGVwYXJzZSBwbHVtYmluZyBvbmx5OworLS0gZXhlY3V0aW9uIHN1cHBvcnQgaXMgbm90IHll dCBpbXBsZW1lbnRlZCkKKy0tCistLSBTaG91bGQgcGFyc2Ugc3VjY2Vzc2Z1bGx5IGFuZCByb3Vu ZC10cmlwIHRocm91Z2ggYSB2aWV3IGRlZmluaXRpb24KK0NSRUFURSBURU1QIFZJRVcgd2luZG93 X2Rpc3RpbmN0X3ZpZXcgQVMKK1NFTEVDVCBjb3VudChESVNUSU5DVCBmb3VyKSBPVkVSIChQQVJU SVRJT04gQlkgdGVuKSBBUyBjbnQKK0ZST00gdGVuazE7CitTRUxFQ1QgcGdfZ2V0X3ZpZXdkZWYo J3dpbmRvd19kaXN0aW5jdF92aWV3JykgTElLRSAnJURJU1RJTkNUJScgQVMgaGFzX2Rpc3RpbmN0 OworIGhhc19kaXN0aW5jdCAKKy0tLS0tLS0tLS0tLS0tCisgdAorKDEgcm93KQorCitEUk9QIFZJ RVcgd2luZG93X2Rpc3RpbmN0X3ZpZXc7CistLSBESVNUSU5DVCBvbiBhIG5vbi1hZ2dyZWdhdGUg d2luZG93IGZ1bmN0aW9uIGlzIHN0aWxsIGEgcGFyc2UgZXJyb3IKK1NFTEVDVCBudGlsZShESVNU SU5DVCA0KSBPVkVSICgpIEZST00gdGVuazE7IC0tIGVycm9yCitFUlJPUjogIERJU1RJTkNUIGlz IG5vdCBpbXBsZW1lbnRlZCBmb3Igbm9uLWFnZ3JlZ2F0ZSB3aW5kb3cgZnVuY3Rpb25zCitMSU5F IDE6IFNFTEVDVCBudGlsZShESVNUSU5DVCA0KSBPVkVSICgpIEZST00gdGVuazE7CisgICAgICAg ICAgICAgICBeCistLSBFeGVjdXRpb24gZmFpbHMgd2l0aCBhIGNsZWFyIGV4ZWN1dG9yLXNpZGUg ZXJyb3IKK1NFTEVDVCBjb3VudChESVNUSU5DVCBmb3VyKSBPVkVSIChQQVJUSVRJT04gQlkgdGVu KSBGUk9NIHRlbmsxOyAtLSBlcnJvcgorRVJST1I6ICBESVNUSU5DVCBpcyBub3QgeWV0IGltcGxl bWVudGVkIGZvciB3aW5kb3cgYWdncmVnYXRlcwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz cy9zcWwvd2luZG93LnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwKaW5kZXgg MzdkODM3YTJmNjYuLmJlNDViZDVmMTRmIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3Nx bC93aW5kb3cuc3FsCisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwKQEAgLTIx MzMsMyArMjEzMywyMSBAQCBXSU5ET1cgdyBBUyAoT1JERVIgQlkgeCBST1dTIEJFVFdFRU4gMiBQ UkVDRURJTkcgQU5EIDIgRk9MTE9XSU5HKTsKIAogLS1jbGVhbnVwCiBEUk9QIFRBQkxFIHBsYW5l dHMgQ0FTQ0FERTsKKworLS0KKy0tIFRlc3QgRElTVElOQ1QgaW4gd2luZG93IGFnZ3JlZ2F0ZXMg KHBhcnNlL2RlcGFyc2UgcGx1bWJpbmcgb25seTsKKy0tIGV4ZWN1dGlvbiBzdXBwb3J0IGlzIG5v dCB5ZXQgaW1wbGVtZW50ZWQpCistLQorCistLSBTaG91bGQgcGFyc2Ugc3VjY2Vzc2Z1bGx5IGFu ZCByb3VuZC10cmlwIHRocm91Z2ggYSB2aWV3IGRlZmluaXRpb24KK0NSRUFURSBURU1QIFZJRVcg d2luZG93X2Rpc3RpbmN0X3ZpZXcgQVMKK1NFTEVDVCBjb3VudChESVNUSU5DVCBmb3VyKSBPVkVS IChQQVJUSVRJT04gQlkgdGVuKSBBUyBjbnQKK0ZST00gdGVuazE7CitTRUxFQ1QgcGdfZ2V0X3Zp ZXdkZWYoJ3dpbmRvd19kaXN0aW5jdF92aWV3JykgTElLRSAnJURJU1RJTkNUJScgQVMgaGFzX2Rp c3RpbmN0OworRFJPUCBWSUVXIHdpbmRvd19kaXN0aW5jdF92aWV3OworCistLSBESVNUSU5DVCBv biBhIG5vbi1hZ2dyZWdhdGUgd2luZG93IGZ1bmN0aW9uIGlzIHN0aWxsIGEgcGFyc2UgZXJyb3IK K1NFTEVDVCBudGlsZShESVNUSU5DVCA0KSBPVkVSICgpIEZST00gdGVuazE7IC0tIGVycm9yCisK Ky0tIEV4ZWN1dGlvbiBmYWlscyB3aXRoIGEgY2xlYXIgZXhlY3V0b3Itc2lkZSBlcnJvcgorU0VM RUNUIGNvdW50KERJU1RJTkNUIGZvdXIpIE9WRVIgKFBBUlRJVElPTiBCWSB0ZW4pIEZST00gdGVu azE7IC0tIGVycm9yCi0tIAoyLjUyLjAKCg== --0000000000008052e7064eec3726 Content-Type: application/octet-stream; name="v1-0002-Implement-executor-support-for-DISTINCT-in-whole-.patch" Content-Disposition: attachment; filename="v1-0002-Implement-executor-support-for-DISTINCT-in-whole-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mnplyupu1 RnJvbSBlZTdjYTZkNmEyN2IxODcyYzdmYTBkNDNkMmRmOTA2MzFiNWRmMWIwIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIYWlibyBZYW4gPGhhaWJvLnlhbkBhcHBsZS5jb20+CkRhdGU6 IFR1ZSwgNyBBcHIgMjAyNiAxMTo1Nzo1MCAtMDcwMApTdWJqZWN0OiBbUEFUQ0ggdjEgMi81XSBJ bXBsZW1lbnQgZXhlY3V0b3Igc3VwcG9ydCBmb3IgRElTVElOQ1QgaW4KIHdob2xlLXBhcnRpdGlv biB3aW5kb3cgYWdncmVnYXRlcwoKUGF0Y2ggMSB0YXVnaHQgUG9zdGdyZVNRTCB0byBwYXJzZSBh bmQgZGVwYXJzZSBESVNUSU5DVCBpbiB3aW5kb3cKYWdncmVnYXRlIGNhbGxzLCB3aGlsZSBzdGls bCByZWplY3RpbmcgZXhlY3V0aW9uIHdpdGggYSB0ZW1wb3JhcnkKRkVBVFVSRV9OT1RfU1VQUE9S VEVEIGVycm9yLgoKVGhpcyBwYXRjaCBpbXBsZW1lbnRzIHRoZSBmaXJzdCBleGVjdXRvciBzdXBw b3J0IGZvciB0aGF0IGZlYXR1cmUsIGJ1dAprZWVwcyB0aGUgc2NvcGUgaW50ZW50aW9uYWxseSBu YXJyb3c6IERJU1RJTkNUIGlzIG5vdyBzdXBwb3J0ZWQgZm9yCnBsYWluIGFnZ3JlZ2F0ZSB3aW5k b3cgZnVuY3Rpb25zIG9ubHkgd2hlbiB0aGUgZWZmZWN0aXZlIHdpbmRvdyBmcmFtZSBpcwplcXVp dmFsZW50IHRvIHRoZSBlbnRpcmUgcGFydGl0aW9uLgoKRXhhbXBsZXMgbm93IHN1cHBvcnRlZCBp bmNsdWRlOgoKICBjb3VudChESVNUSU5DVCB4KSBPVkVSIChQQVJUSVRJT04gQlkgcCkKICBzdW0o RElTVElOQ1QgeCkgICBPVkVSIChQQVJUSVRJT04gQlkgcCkKICBhdmcoRElTVElOQ1QgeCkgICBP VkVSICgpCiAgY291bnQoRElTVElOQ1QgeCkgT1ZFUiAoCiAgICAgIFBBUlRJVElPTiBCWSBwCiAg ICAgIFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFORCBVTkJPVU5ERUQgRk9MTE9X SU5HKQoKVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHlldCBzdXBwb3J0OgoKICBjb3VudChE SVNUSU5DVCB4KSBPVkVSIChQQVJUSVRJT04gQlkgcCBPUkRFUiBCWSBvKQogIGNvdW50KERJU1RJ TkNUIHgpIE9WRVIgKAogICAgICBQQVJUSVRJT04gQlkgcAogICAgICBPUkRFUiBCWSBvCiAgICAg IFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFORCBDVVJSRU5UIFJPVykKICBjb3Vu dChESVNUSU5DVCB4KSBPVkVSICgKICAgICAgUEFSVElUSU9OIEJZIHAKICAgICAgUk9XUyBCRVRX RUVOIDMgUFJFQ0VESU5HIEFORCBDVVJSRU5UIFJPVykKCm5vciBhbnkgb3RoZXIgbW92aW5nL2dy b3ctb25seS9zbGlkaW5nIGZyYW1lIGNhc2VzLCBFWENMVURFIGNsYXVzZXMsCmFnZ3JlZ2F0ZSBP UkRFUiBCWSB3aXRoaW4gd2luZG93IGZ1bmN0aW9ucywgb3IgbXVsdGktYXJndW1lbnQgRElTVElO Q1QuCgpUaGUga2V5IGRlc2lnbiBjaG9pY2UgaXMgdG8gY3V0IHNjb3BlIGJ5IGZyYW1lIHNoYXBl IHJhdGhlciB0aGFuIGJ5CmFnZ3JlZ2F0ZSBraW5kLiAgVGhlIGhhcmQgcGFydCBvZiBESVNUSU5D VCBpbiB3aW5kb3cgYWdncmVnYXRlcyBpcyBub3QKd2hldGhlciB0aGUgYWdncmVnYXRlIGlzIGNv dW50KCksIHN1bSgpLCBvciBhdmcoKSwgYnV0IHdoZXRoZXIgdGhlCndpbmRvdyBmcmFtZSBjaGFu Z2VzIGZyb20gcm93IHRvIHJvdy4gIE9uY2UgdGhlIGZyYW1lIGNhbiBtb3ZlLCBESVNUSU5DVApu ZWVkcyBpbmNyZW1lbnRhbCBtZW1iZXJzaGlwIHRyYWNraW5nIGFuZCwgZm9yIHRydWUgc2xpZGlu ZyBmcmFtZXMsCmNvcnJlY3QgaGFuZGxpbmcgb2YgdmFsdWVzIGxlYXZpbmcgdGhlIGZyYW1lLiAg VGhhdCBpcyBhIG11Y2ggbGFyZ2VyCmV4ZWN1dG9yIHByb2JsZW0uCgpGb3IgZnJhbWVzIGVxdWl2 YWxlbnQgdG8gdGhlIHdob2xlIHBhcnRpdGlvbiwgdGhlIHNlbWFudGljcyBhcmUgbXVjaApjbGVh bmVyOiB0aGUgRElTVElOQ1QgYWdncmVnYXRlIHJlc3VsdCBpcyBjb25zdGFudCBmb3IgZXZlcnkg cm93IGluIHRoZQpwYXJ0aXRpb24uICBUaGUgZXhlY3V0b3IgY2FuIHRoZXJlZm9yZToKCiAgMS4g Y29sbGVjdCB0aGUgYWdncmVnYXRlIGlucHV0IHZhbHVlcyBmb3IgdGhlIHBhcnRpdGlvbiwKICAy LiBhcHBseSBGSUxURVIgZHVyaW5nIGNvbGxlY3Rpb24sCiAgMy4gc29ydCB0aGUgY29sbGVjdGVk IHZhbHVlcywKICA0LiBkZWR1cGxpY2F0ZSB0aGVtLAogIDUuIGludm9rZSB0aGUgYWdncmVnYXRl IHRyYW5zaXRpb24gZnVuY3Rpb24gb25jZSBwZXIgZGlzdGluY3QgdmFsdWUsCiAgNi4gZmluYWxp emUgb25jZSwgYW5kCiAgNy4gcmV1c2UgdGhlIGNhY2hlZCBmaW5hbCByZXN1bHQgZm9yIGFsbCBy b3dzIGluIHRoZSBwYXJ0aXRpb24uCgpUaGlzIHBhdGNoIGltcGxlbWVudHMgdGhhdCBtb2RlbCBp bnNpZGUgV2luZG93QWdnIHVzaW5nIGEgZGVkaWNhdGVkCnNvcnQtYW5kLWRlZHVwIHBhdGggZm9y IERJU1RJTkNUIGFnZ3JlZ2F0ZXMgaW4gc2NvcGUuICBFeGlzdGluZwpmaW5hbGl6YXRpb24gYW5k IHJlc3VsdCBjYWNoaW5nIGxvZ2ljIGlzIHJldXNlZC4gIE9yZGluYXJ5IG5vbi1ESVNUSU5DVAp3 aW5kb3cgYWdncmVnYXRlcyBjb250aW51ZSB0byB1c2UgdGhlIGV4aXN0aW5nIHJvdy1ieS1yb3cg YWNjdW11bGF0aW9uCnBhdGgsIHNvIG1peGVkIHF1ZXJpZXMgY29udGFpbmluZyBib3RoIERJU1RJ TkNUIGFuZCBub24tRElTVElOQ1Qgd2luZG93CmFnZ3JlZ2F0ZXMgYXJlIHN1cHBvcnRlZC4KClRo ZSBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBzaW5nbGUtYXJndW1lbnQg RElTVElOQ1QuClRoYXQga2VlcHMgdGhlIGZpcnN0IGV4ZWN1dG9yIHBhdGNoIHNtYWxsIGFuZCBh dm9pZHMgaW50cm9kdWNpbmcgdHVwbGUtCnNvcnRpbmcgYW5kIG11bHRpLWNvbHVtbiBlcXVhbGl0 eSBtYWNoaW5lcnkgaW50byB0aGlzIHN0ZXAuICBNdWx0aS0KYXJndW1lbnQgRElTVElOQ1QgY2Fu IGJlIGFkZGVkIGxhdGVyIGFzIGEgZm9sbG93LXVwLgoKT3V0LW9mLXNjb3BlIGNhc2VzIGNvbnRp bnVlIHRvIGZhaWwgYXQgZXhlY3V0b3IgaW5pdCB0aW1lIHdpdGgKRkVBVFVSRV9OT1RfU1VQUE9S VEVELCByZXBsYWNpbmcgdGhlIHRlbXBvcmFyeSBibGFua2V0IHJlamVjdGlvbiBmcm9tClBhdGNo IDEgd2l0aCBhIG5hcnJvd2VyIHNjb3BlIGNoZWNrLgoKUmVncmVzc2lvbiB0ZXN0cyBjb3ZlcjoK CiogYmFzaWMgY291bnQvc3VtL2F2ZyBESVNUSU5DVCB3aW5kb3cgYWdncmVnYXRlIGV4ZWN1dGlv bjsKKiBkZWZhdWx0IG5vLU9SREVSLUJZIHdob2xlLXBhcnRpdGlvbiBmcmFtZXM7CiogZXhwbGlj aXQgd2hvbGUtcGFydGl0aW9uIGZyYW1lczsKKiBOVUxMIGFuZCBkdXBsaWNhdGUtaGVhdnkgaW5w dXRzOwoqIG1peGVkIERJU1RJTkNUIGFuZCBub24tRElTVElOQ1Qgd2luZG93IGFnZ3JlZ2F0ZXM7 CiogbXVsdGlwbGUgRElTVElOQ1Qgd2luZG93IGFnZ3JlZ2F0ZXMgaW4gdGhlIHNhbWUgcXVlcnk7 IGFuZAoqIHJlamVjdGlvbiBvZiBPUkRFUiBCWSBkZWZhdWx0LWZyYW1lLCBST1dTIENVUlJFTlQg Uk9XLCBzbGlkaW5nLCBFWENMVURFLAogIGFuZCBtdWx0aS1hcmd1bWVudCBESVNUSU5DVCBjYXNl cy4KClRoaXMgaXMgaW50ZW5kZWQgYXMgdGhlIGZpcnN0IGV4ZWN1dG9yIHN0ZXAgZm9yIERJU1RJ TkNUIGluIHdpbmRvdwphZ2dyZWdhdGVzLiAgTW9yZSBjb21wbGV4IGZyYW1lIGNsYXNzZXMgY2Fu IGJlIGFkZGVkIGluIGxhdGVyIHBhdGNoZXMuCi0tLQogc3JjL2JhY2tlbmQvZXhlY3V0b3Ivbm9k ZVdpbmRvd0FnZy5jIHwgMzkzICsrKysrKysrKysrKysrKysrKysrKysrKysrLQogc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC93aW5kb3cub3V0IHwgMTY2ICsrKysrKysrKystCiBzcmMvdGVzdC9y ZWdyZXNzL3NxbC93aW5kb3cuc3FsICAgICAgfCAgNjQgKysrKy0KIDMgZmlsZXMgY2hhbmdlZCwg NjA5IGluc2VydGlvbnMoKyksIDE0IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNr ZW5kL2V4ZWN1dG9yL25vZGVXaW5kb3dBZ2cuYyBiL3NyYy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVX aW5kb3dBZ2cuYwppbmRleCA5NDMxY2FlOWFlMC4uOWU5MTE1MTQxYjcgMTAwNjQ0Ci0tLSBhL3Ny Yy9iYWNrZW5kL2V4ZWN1dG9yL25vZGVXaW5kb3dBZ2cuYworKysgYi9zcmMvYmFja2VuZC9leGVj dXRvci9ub2RlV2luZG93QWdnLmMKQEAgLTQ2LDYgKzQ2LDcgQEAKICNpbmNsdWRlICJvcHRpbWl6 ZXIvb3B0aW1pemVyLmgiCiAjaW5jbHVkZSAicGFyc2VyL3BhcnNlX2FnZy5oIgogI2luY2x1ZGUg InBhcnNlci9wYXJzZV9jb2VyY2UuaCIKKyNpbmNsdWRlICJwYXJzZXIvcGFyc2Vfb3Blci5oIgog I2luY2x1ZGUgInV0aWxzL2FjbC5oIgogI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5zLmgiCiAjaW5j bHVkZSAidXRpbHMvZGF0dW0uaCIKQEAgLTU0LDYgKzU1LDcgQEAKICNpbmNsdWRlICJ1dGlscy9t ZW11dGlscy5oIgogI2luY2x1ZGUgInV0aWxzL3JlZ3Byb2MuaCIKICNpbmNsdWRlICJ1dGlscy9z eXNjYWNoZS5oIgorI2luY2x1ZGUgInV0aWxzL3R1cGxlc29ydC5oIgogI2luY2x1ZGUgInV0aWxz L3R1cGxlc3RvcmUuaCIKICNpbmNsdWRlICJ3aW5kb3dhcGkuaCIKIApAQCAtMTcwLDYgKzE3Miwx NCBAQCB0eXBlZGVmIHN0cnVjdCBXaW5kb3dTdGF0ZVBlckFnZ0RhdGEKIAogCS8qIERhdGEgbG9j YWwgdG8gZXZhbF93aW5kb3dhZ2dyZWdhdGVzKCkgKi8KIAlib29sCQlyZXN0YXJ0OwkJLyogbmVl ZCB0byByZXN0YXJ0IHRoaXMgYWdnIGluIHRoaXMgY3ljbGU/ICovCisKKwkvKiBESVNUSU5DVCBz dXBwb3J0ICovCisJYm9vbAkJd2luZGlzdGluY3Q7CS8qIERJU1RJTkNUIHNwZWNpZmllZCBvbiB0 aGlzIGFnZ3JlZ2F0ZSAqLworCU9pZAkJCWlucHV0dHlwZU9pZDsJLyogT0lEIG9mIHRoZSBzaW5n bGUgRElTVElOQ1QgYXJndW1lbnQgdHlwZSAqLworCU9pZAkJCXNvcnRPcGVyYXRvcjsJLyogYnRy ZWUgPCBvcGVyYXRvciBmb3Igc29ydGluZyAqLworCU9pZAkJCXNvcnRDb2xsYXRpb247CS8qIGNv bGxhdGlvbiBmb3Igc29ydC9lcXVhbGl0eSAqLworCWJvb2wJCXNvcnROdWxsc0ZpcnN0OyAvKiBO VUxMUyBGSVJTVD8gKi8KKwlGbWdySW5mbwllcXVhbGZuOwkJLyogZXF1YWxpdHkgY29tcGFyaXNv biBmdW5jdGlvbiAqLwogfSBXaW5kb3dTdGF0ZVBlckFnZ0RhdGE7CiAKIHN0YXRpYyB2b2lkIGlu aXRpYWxpemVfd2luZG93YWdncmVnYXRlKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwKQEAgLTIw Niw2ICsyMTYsMTEgQEAgc3RhdGljIFdpbmRvd1N0YXRlUGVyQWdnRGF0YSAqaW5pdGlhbGl6ZV9w ZXJhZ2coV2luZG93QWdnU3RhdGUgKndpbnN0YXRlLAogCQkJCQkJCQkJCQkJV2luZG93U3RhdGVQ ZXJBZ2cgcGVyYWdnc3RhdGUpOwogc3RhdGljIERhdHVtIEdldEFnZ0luaXRWYWwoRGF0dW0gdGV4 dEluaXRWYWwsIE9pZCB0cmFuc3R5cGUpOwogCitzdGF0aWMgYm9vbCBpc193aG9sZV9wYXJ0aXRp b25fZnJhbWUoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlKTsKK3N0YXRpYyB2b2lkIGV2YWxfd2lu ZG93YWdncmVnYXRlX2Rpc3RpbmN0KFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwKKwkJCQkJCQkJ CQkgIFdpbmRvd1N0YXRlUGVyRnVuYyBwZXJmdW5jc3RhdGUsCisJCQkJCQkJCQkJICBXaW5kb3dT dGF0ZVBlckFnZyBwZXJhZ2dzdGF0ZSk7CisKIHN0YXRpYyBib29sIGFyZV9wZWVycyhXaW5kb3dB Z2dTdGF0ZSAqd2luc3RhdGUsIFR1cGxlVGFibGVTbG90ICpzbG90MSwKIAkJCQkJICBUdXBsZVRh YmxlU2xvdCAqc2xvdDIpOwogc3RhdGljIGJvb2wgd2luZG93X2dldHR1cGxlc2xvdChXaW5kb3dP YmplY3Qgd2lub2JqLCBpbnQ2NCBwb3MsCkBAIC02OTMsNiArNzA4LDI5NyBAQCBmaW5hbGl6ZV93 aW5kb3dhZ2dyZWdhdGUoV2luZG93QWdnU3RhdGUgKndpbnN0YXRlLAogCU1lbW9yeUNvbnRleHRT d2l0Y2hUbyhvbGRDb250ZXh0KTsKIH0KIAorLyoKKyAqIGlzX3dob2xlX3BhcnRpdGlvbl9mcmFt ZQorICoKKyAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgd2luZG93IGZyYW1lIGlzIGd1YXJhbnRlZWQg dG8gY292ZXIgdGhlIGVudGlyZQorICogcGFydGl0aW9uLiAgVGhpcyBpcyB0aGUgY2FzZSB3aGVu IHRoZSBzdGFydCBpcyBVTkJPVU5ERUQgUFJFQ0VESU5HLAorICogdGhlcmUgaXMgbm8gRVhDTFVT SU9OIGNsYXVzZSwgYW5kIHRoZSBlbmQgaXMgZWl0aGVyIFVOQk9VTkRFRCBGT0xMT1dJTkcKKyAq IG9yIENVUlJFTlQgUk9XIHdpdGggbm8gT1JERVIgQlkgaW4gUkFOR0Ugb3IgR1JPVVBTIG1vZGUg KHdoaWNoIG1lYW5zCisgKiBhbGwgcm93cyBhcmUgcGVlcnMsIHNvIENVUlJFTlQgUk9XIGV4dGVu ZHMgdG8gdGhlIHBhcnRpdGlvbiBib3VuZGFyeSkuCisgKiBJbiBST1dTIG1vZGUsIENVUlJFTlQg Uk9XIGFsd2F5cyBtZWFucyBleGFjdGx5IHRoZSBjdXJyZW50IHJvdy4KKyAqLworc3RhdGljIGJv b2wKK2lzX3dob2xlX3BhcnRpdGlvbl9mcmFtZShXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUpCit7 CisJV2luZG93QWdnICAqbm9kZSA9IChXaW5kb3dBZ2cgKikgd2luc3RhdGUtPnNzLnBzLnBsYW47 CisJaW50CQkJZnJhbWVPcHRpb25zID0gd2luc3RhdGUtPmZyYW1lT3B0aW9uczsKKworCS8qIE11 c3Qgc3RhcnQgYXQgVU5CT1VOREVEIFBSRUNFRElORyAqLworCWlmICghKGZyYW1lT3B0aW9ucyAm IEZSQU1FT1BUSU9OX1NUQVJUX1VOQk9VTkRFRF9QUkVDRURJTkcpKQorCQlyZXR1cm4gZmFsc2U7 CisKKwkvKiBNdXN0IG5vdCBoYXZlIGFuIEVYQ0xVU0lPTiBjbGF1c2UgKi8KKwlpZiAoZnJhbWVP cHRpb25zICYgRlJBTUVPUFRJT05fRVhDTFVTSU9OKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBF bmQgbXVzdCBiZSBVTkJPVU5ERUQgRk9MTE9XSU5HIC4uLiAqLworCWlmIChmcmFtZU9wdGlvbnMg JiBGUkFNRU9QVElPTl9FTkRfVU5CT1VOREVEX0ZPTExPV0lORykKKwkJcmV0dXJuIHRydWU7CisK KwkvKgorCSAqIC4uLiBvciBDVVJSRU5UIFJPVyB3aXRoIG5vIE9SREVSIEJZIChhbGwgcm93cyBh cmUgcGVlcnMpLCBidXQgb25seQorCSAqIGZvciBSQU5HRSBvciBHUk9VUFMgbW9kZS4gIEluIFJP V1MgbW9kZSwgQ1VSUkVOVCBST1cgbWVhbnMgZXhhY3RseQorCSAqIHRoZSBjdXJyZW50IHJvdyBy ZWdhcmRsZXNzIG9mIHBlZXJzLgorCSAqLworCWlmICgoZnJhbWVPcHRpb25zICYgRlJBTUVPUFRJ T05fRU5EX0NVUlJFTlRfUk9XKSAmJgorCQkhKGZyYW1lT3B0aW9ucyAmIEZSQU1FT1BUSU9OX1JP V1MpICYmCisJCW5vZGUtPm9yZE51bUNvbHMgPT0gMCkKKwkJcmV0dXJuIHRydWU7CisKKwlyZXR1 cm4gZmFsc2U7Cit9CisKKy8qCisgKiBldmFsX3dpbmRvd2FnZ3JlZ2F0ZV9kaXN0aW5jdAorICoK KyAqIENvbXB1dGUgYSBzaW5nbGUtYXJndW1lbnQgRElTVElOQ1Qgd2luZG93IGFnZ3JlZ2F0ZSBv dmVyIHRoZSB3aG9sZQorICogcGFydGl0aW9uLiAgV2UgY29sbGVjdCBhbGwgYXJndW1lbnQgdmFs dWVzIChhcHBseWluZyBhbnkgRklMVEVSIGNsYXVzZSksCisgKiBzb3J0IHRoZW0sIHNraXAgZHVw bGljYXRlcywgYW5kIGZlZWQgdGhlIGRpc3RpbmN0IHZhbHVlcyBpbnRvIHRoZQorICogYWdncmVn YXRlJ3MgdHJhbnNpdGlvbiBmdW5jdGlvbi4KKyAqCisgKiBUaGlzIGZvbGxvd3MgdGhlIHBhdHRl cm4gb2YgcHJvY2Vzc19vcmRlcmVkX2FnZ3JlZ2F0ZV9zaW5nbGUoKSBpbgorICogbm9kZUFnZy5j LgorICovCitzdGF0aWMgdm9pZAorZXZhbF93aW5kb3dhZ2dyZWdhdGVfZGlzdGluY3QoV2luZG93 QWdnU3RhdGUgKndpbnN0YXRlLAorCQkJCQkJCSAgV2luZG93U3RhdGVQZXJGdW5jIHBlcmZ1bmNz dGF0ZSwKKwkJCQkJCQkgIFdpbmRvd1N0YXRlUGVyQWdnIHBlcmFnZ3N0YXRlKQoreworCVdpbmRv d09iamVjdCBhZ2dfd2lub2JqID0gd2luc3RhdGUtPmFnZ193aW5vYmo7CisJVHVwbGVUYWJsZVNs b3QgKnRlbXBfc2xvdCA9IHdpbnN0YXRlLT50ZW1wX3Nsb3RfMTsKKwlFeHByQ29udGV4dCAqZWNv bnRleHQgPSB3aW5zdGF0ZS0+dG1wY29udGV4dDsKKwlXaW5kb3dGdW5jRXhwclN0YXRlICp3ZnVu Y3N0YXRlID0gcGVyZnVuY3N0YXRlLT53ZnVuY3N0YXRlOworCUV4cHJTdGF0ZSAgKmZpbHRlciA9 IHdmdW5jc3RhdGUtPmFnZ2ZpbHRlcjsKKwlpbnQJCQludW1Bcmd1bWVudHMgPSBwZXJmdW5jc3Rh dGUtPm51bUFyZ3VtZW50czsKKwlMT0NBTF9GQ0lORk8oZmNpbmZvLCBGVU5DX01BWF9BUkdTKTsK KwlUdXBsZXNvcnRzdGF0ZSAqc29ydHN0YXRlOworCURhdHVtCQluZXdWYWw7CisJYm9vbAkJbmV3 SXNOdWxsOworCURhdHVtCQluZXdBYmJyZXZWYWw7CisJRGF0dW0JCW9sZFZhbCA9IChEYXR1bSkg MDsKKwlib29sCQlvbGRJc051bGwgPSB0cnVlOworCWJvb2wJCWhhdmVPbGRWYWwgPSBmYWxzZTsK KwlEYXR1bQkJb2xkQWJicmV2VmFsID0gKERhdHVtKSAwOworCU1lbW9yeUNvbnRleHQgb2xkQ29u dGV4dDsKKwlpbnQ2NAkJdG90YWxfcm93czsKKwlpbnQ2NAkJcm93OworCisJLyogRW5zdXJlIGFs bCBwYXJ0aXRpb24gcm93cyBhcmUgc3Bvb2xlZCAqLworCXNwb29sX3R1cGxlcyh3aW5zdGF0ZSwg LTEpOworCXRvdGFsX3Jvd3MgPSB3aW5zdGF0ZS0+c3Bvb2xlZF9yb3dzOworCisJLyogQ3JlYXRl IGEgdHVwbGVzb3J0IGZvciB0aGUgc2luZ2xlIERJU1RJTkNUIGFyZ3VtZW50ICovCisJc29ydHN0 YXRlID0gdHVwbGVzb3J0X2JlZ2luX2RhdHVtKHBlcmFnZ3N0YXRlLT5pbnB1dHR5cGVPaWQsCisJ CQkJCQkJCQkgIHBlcmFnZ3N0YXRlLT5zb3J0T3BlcmF0b3IsCisJCQkJCQkJCQkgIHBlcmFnZ3N0 YXRlLT5zb3J0Q29sbGF0aW9uLAorCQkJCQkJCQkJICBwZXJhZ2dzdGF0ZS0+c29ydE51bGxzRmly c3QsCisJCQkJCQkJCQkgIHdvcmtfbWVtLCBOVUxMLCBUVVBMRVNPUlRfTk9ORSk7CisKKwkvKgor CSAqIExvb3Agb3ZlciBhbGwgcm93cyBpbiB0aGUgcGFydGl0aW9uLCBldmFsdWF0ZSBGSUxURVIg YW5kIHRoZSBhcmd1bWVudCwKKwkgKiBhbmQgZmVlZCB2YWx1ZXMgaW50byB0aGUgc29ydC4KKwkg Ki8KKwlmb3IgKHJvdyA9IDA7IHJvdyA8IHRvdGFsX3Jvd3M7IHJvdysrKQorCXsKKwkJaWYgKCF3 aW5kb3dfZ2V0dHVwbGVzbG90KGFnZ193aW5vYmosIHJvdywgdGVtcF9zbG90KSkKKwkJCWJyZWFr OworCisJCWVjb250ZXh0LT5lY3h0X291dGVydHVwbGUgPSB0ZW1wX3Nsb3Q7CisKKwkJb2xkQ29u dGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhlY29udGV4dC0+ZWN4dF9wZXJfdHVwbGVfbWVt b3J5KTsKKworCQkvKiBTa2lwIGFueXRoaW5nIEZJTFRFUmVkIG91dCAqLworCQlpZiAoZmlsdGVy KQorCQl7CisJCQlib29sCQlpc251bGw7CisJCQlEYXR1bQkJcmVzID0gRXhlY0V2YWxFeHByKGZp bHRlciwgZWNvbnRleHQsICZpc251bGwpOworCisJCQlpZiAoaXNudWxsIHx8ICFEYXR1bUdldEJv b2wocmVzKSkKKwkJCXsKKwkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkQ29udGV4dCk7CisJ CQkJUmVzZXRFeHByQ29udGV4dChlY29udGV4dCk7CisJCQkJRXhlY0NsZWFyVHVwbGUodGVtcF9z bG90KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCS8qIEV2YWx1YXRlIHRoZSBzaW5n bGUgYXJndW1lbnQgKi8KKwkJeworCQkJRXhwclN0YXRlICAqYXJnc3RhdGUgPSAoRXhwclN0YXRl ICopIGxpbml0aWFsKHdmdW5jc3RhdGUtPmFyZ3MpOworCQkJRGF0dW0JCXZhbDsKKwkJCWJvb2wJ CWlzbnVsbDsKKworCQkJdmFsID0gRXhlY0V2YWxFeHByKGFyZ3N0YXRlLCBlY29udGV4dCwgJmlz bnVsbCk7CisKKwkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRDb250ZXh0KTsKKworCQkJLyog RmVlZCBpbnRvIHNvcnQgKi8KKwkJCXR1cGxlc29ydF9wdXRkYXR1bShzb3J0c3RhdGUsIHZhbCwg aXNudWxsKTsKKwkJfQorCisJCVJlc2V0RXhwckNvbnRleHQoZWNvbnRleHQpOworCQlFeGVjQ2xl YXJUdXBsZSh0ZW1wX3Nsb3QpOworCX0KKworCS8qIFNvcnQgKi8KKwl0dXBsZXNvcnRfcGVyZm9y bXNvcnQoc29ydHN0YXRlKTsKKworCS8qCisJICogUmVhZCBiYWNrIHNvcnRlZCB2YWx1ZXMsIHNr aXAgZHVwbGljYXRlcywgYW5kIGZlZWQgZGlzdGluY3QgdmFsdWVzCisJICogaW50byB0aGUgdHJh bnNpdGlvbiBmdW5jdGlvbi4gIFRoaXMgbWlycm9ycworCSAqIHByb2Nlc3Nfb3JkZXJlZF9hZ2dy ZWdhdGVfc2luZ2xlKCkgaW4gbm9kZUFnZy5jLgorCSAqLworCXdoaWxlICh0dXBsZXNvcnRfZ2V0 ZGF0dW0oc29ydHN0YXRlLCB0cnVlLCBmYWxzZSwKKwkJCQkJCQkgICZuZXdWYWwsICZuZXdJc051 bGwsICZuZXdBYmJyZXZWYWwpKQorCXsKKwkJUmVzZXRFeHByQ29udGV4dChlY29udGV4dCk7CisJ CW9sZENvbnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oZWNvbnRleHQtPmVjeHRfcGVyX3R1 cGxlX21lbW9yeSk7CisKKwkJLyoKKwkJICogSWYgRElTVElOQ1QgbW9kZSwgc2tpcCBpZiBub3Qg ZGlzdGluY3QgZnJvbSBwcmlvciB2YWx1ZS4KKwkJICovCisJCWlmIChoYXZlT2xkVmFsICYmCisJ CQkoKG9sZElzTnVsbCAmJiBuZXdJc051bGwpIHx8CisJCQkgKCFvbGRJc051bGwgJiYgIW5ld0lz TnVsbCAmJgorCQkJICBvbGRBYmJyZXZWYWwgPT0gbmV3QWJicmV2VmFsICYmCisJCQkgIERhdHVt R2V0Qm9vbChGdW5jdGlvbkNhbGwyQ29sbCgmcGVyYWdnc3RhdGUtPmVxdWFsZm4sCisJCQkJCQkJ CQkJCSBwZXJhZ2dzdGF0ZS0+c29ydENvbGxhdGlvbiwKKwkJCQkJCQkJCQkJIG9sZFZhbCwgbmV3 VmFsKSkpKSkKKwkJeworCQkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZENvbnRleHQpOworCQkJ Y29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBBZHZhbmNlIHRoZSB0cmFuc2l0aW9uIGZ1bmN0 aW9uIHdpdGggdGhpcyBkaXN0aW5jdCB2YWx1ZS4KKwkJICogVGhpcyByZXBsaWNhdGVzIHRoZSBz dHJpY3QtZnVuY3Rpb24gaGFuZGxpbmcgZnJvbQorCQkgKiBhZHZhbmNlX3dpbmRvd2FnZ3JlZ2F0 ZSgpLgorCQkgKi8KKwkJaWYgKHBlcmFnZ3N0YXRlLT50cmFuc2ZuLmZuX3N0cmljdCkKKwkJewor CQkJLyogRm9yIHN0cmljdCB0cmFuc2ZuLCBza2lwIE5VTEwgaW5wdXRzICovCisJCQlpZiAobmV3 SXNOdWxsKQorCQkJeworCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhvbGRDb250ZXh0KTsKKwkJ CQlnb3RvIHJlbWVtYmVyX3ZhbHVlOworCQkJfQorCisJCQkvKgorCQkJICogRm9yIHN0cmljdCB0 cmFuc2l0aW9uIGZ1bmN0aW9ucyB3aXRoIGluaXRpYWwgdmFsdWUgTlVMTCwKKwkJCSAqIHVzZSB0 aGUgZmlyc3Qgbm9uLU5VTEwgaW5wdXQgYXMgdGhlIGluaXRpYWwgc3RhdGUuCisJCQkgKi8KKwkJ CWlmIChwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZUNvdW50ID09IDAgJiYKKwkJCQlwZXJhZ2dzdGF0 ZS0+dHJhbnNWYWx1ZUlzTnVsbCkKKwkJCXsKKwkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ocGVy YWdnc3RhdGUtPmFnZ2NvbnRleHQpOworCQkJCXBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlID0gZGF0 dW1Db3B5KG5ld1ZhbCwKKwkJCQkJCQkJCQkJCQlwZXJhZ2dzdGF0ZS0+dHJhbnN0eXBlQnlWYWws CisJCQkJCQkJCQkJCQkJcGVyYWdnc3RhdGUtPnRyYW5zdHlwZUxlbik7CisJCQkJcGVyYWdnc3Rh dGUtPnRyYW5zVmFsdWVJc051bGwgPSBmYWxzZTsKKwkJCQlwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1 ZUNvdW50ID0gMTsKKwkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkQ29udGV4dCk7CisJCQkJ Z290byByZW1lbWJlcl92YWx1ZTsKKwkJCX0KKworCQkJaWYgKHBlcmFnZ3N0YXRlLT50cmFuc1Zh bHVlSXNOdWxsKQorCQkJeworCQkJCS8qCisJCQkJICogRG9uJ3QgY2FsbCBhIHN0cmljdCBmdW5j dGlvbiB3aXRoIE5VTEwgaW5wdXRzLgorCQkJCSAqLworCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hU byhvbGRDb250ZXh0KTsKKwkJCQlnb3RvIHJlbWVtYmVyX3ZhbHVlOworCQkJfQorCQl9CisKKwkJ LyogT0sgdG8gY2FsbCB0aGUgdHJhbnNpdGlvbiBmdW5jdGlvbiAqLworCQlJbml0RnVuY3Rpb25D YWxsSW5mb0RhdGEoKmZjaW5mbywgJihwZXJhZ2dzdGF0ZS0+dHJhbnNmbiksCisJCQkJCQkJCSBu dW1Bcmd1bWVudHMgKyAxLAorCQkJCQkJCQkgcGVyZnVuY3N0YXRlLT53aW5Db2xsYXRpb24sCisJ CQkJCQkJCSAoTm9kZSAqKSB3aW5zdGF0ZSwgTlVMTCk7CisJCWZjaW5mby0+YXJnc1swXS52YWx1 ZSA9IHBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlOworCQlmY2luZm8tPmFyZ3NbMF0uaXNudWxsID0g cGVyYWdnc3RhdGUtPnRyYW5zVmFsdWVJc051bGw7CisJCWZjaW5mby0+YXJnc1sxXS52YWx1ZSA9 IG5ld1ZhbDsKKwkJZmNpbmZvLT5hcmdzWzFdLmlzbnVsbCA9IG5ld0lzTnVsbDsKKwkJd2luc3Rh dGUtPmN1cmFnZ2NvbnRleHQgPSBwZXJhZ2dzdGF0ZS0+YWdnY29udGV4dDsKKworCQl7CisJCQlE YXR1bQkJcmVzdWx0OworCisJCQlyZXN1bHQgPSBGdW5jdGlvbkNhbGxJbnZva2UoZmNpbmZvKTsK KwkJCXdpbnN0YXRlLT5jdXJhZ2djb250ZXh0ID0gTlVMTDsKKworCQkJcGVyYWdnc3RhdGUtPnRy YW5zVmFsdWVDb3VudCsrOworCisJCQkvKgorCQkJICogSWYgcGFzcy1ieS1yZWYgZGF0YXR5cGUs IG11c3QgY29weSB0aGUgbmV3IHZhbHVlIGludG8KKwkJCSAqIGFnZ2NvbnRleHQgYW5kIGZyZWUg dGhlIHByaW9yIHRyYW5zVmFsdWUuICBCdXQgaWYgdHJhbnNmbgorCQkJICogcmV0dXJuZWQgYSBw b2ludGVyIHRvIGl0cyBmaXJzdCBpbnB1dCwgd2UgZG9uJ3QgbmVlZCB0byBkbworCQkJICogYW55 dGhpbmcuICBBbHNvLCBpZiB0cmFuc2ZuIHJldHVybmVkIGEgcG9pbnRlciB0byBhIFIvVworCQkJ ICogZXhwYW5kZWQgb2JqZWN0IHRoYXQgaXMgYWxyZWFkeSBhIGNoaWxkIG9mIHRoZSBhZ2djb250 ZXh0LAorCQkJICogYXNzdW1lIHdlIGNhbiBhZG9wdCB0aGF0IHZhbHVlIHdpdGhvdXQgY29weWlu ZyBpdC4KKwkJCSAqCisJCQkgKiBUaGlzIG11c3QgbWF0Y2ggYWR2YW5jZV93aW5kb3dhZ2dyZWdh dGUncyBsb2dpYyBleGFjdGx5LgorCQkJICovCisJCQlpZiAoIXBlcmFnZ3N0YXRlLT50cmFuc3R5 cGVCeVZhbCAmJgorCQkJCURhdHVtR2V0UG9pbnRlcihyZXN1bHQpICE9IERhdHVtR2V0UG9pbnRl cihwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZSkpCisJCQl7CisJCQkJaWYgKCFmY2luZm8tPmlzbnVs bCkKKwkJCQl7CisJCQkJCU1lbW9yeUNvbnRleHRTd2l0Y2hUbyhwZXJhZ2dzdGF0ZS0+YWdnY29u dGV4dCk7CisJCQkJCWlmIChEYXR1bUlzUmVhZFdyaXRlRXhwYW5kZWRPYmplY3QocmVzdWx0LAor CQkJCQkJCQkJCQkJCSAgIGZhbHNlLAorCQkJCQkJCQkJCQkJCSAgIHBlcmFnZ3N0YXRlLT50cmFu c3R5cGVMZW4pICYmCisJCQkJCQlNZW1vcnlDb250ZXh0R2V0UGFyZW50KERhdHVtR2V0RU9IUChy ZXN1bHQpLT5lb2hfY29udGV4dCkgPT0gQ3VycmVudE1lbW9yeUNvbnRleHQpCisJCQkJCQkgLyog ZG8gbm90aGluZyAqLyA7CisJCQkJCWVsc2UKKwkJCQkJCXJlc3VsdCA9IGRhdHVtQ29weShyZXN1 bHQsCisJCQkJCQkJCQkJICAgcGVyYWdnc3RhdGUtPnRyYW5zdHlwZUJ5VmFsLAorCQkJCQkJCQkJ CSAgIHBlcmFnZ3N0YXRlLT50cmFuc3R5cGVMZW4pOworCQkJCX0KKwkJCQlpZiAoIXBlcmFnZ3N0 YXRlLT50cmFuc1ZhbHVlSXNOdWxsKQorCQkJCXsKKwkJCQkJaWYgKERhdHVtSXNSZWFkV3JpdGVF eHBhbmRlZE9iamVjdChwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZSwKKwkJCQkJCQkJCQkJCQkgICBm YWxzZSwKKwkJCQkJCQkJCQkJCQkgICBwZXJhZ2dzdGF0ZS0+dHJhbnN0eXBlTGVuKSkKKwkJCQkJ CURlbGV0ZUV4cGFuZGVkT2JqZWN0KHBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlKTsKKwkJCQkJZWxz ZQorCQkJCQkJcGZyZWUoRGF0dW1HZXRQb2ludGVyKHBlcmFnZ3N0YXRlLT50cmFuc1ZhbHVlKSk7 CisJCQkJfQorCQkJfQorCisJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkQ29udGV4dCk7CisJ CQlwZXJhZ2dzdGF0ZS0+dHJhbnNWYWx1ZSA9IHJlc3VsdDsKKwkJCXBlcmFnZ3N0YXRlLT50cmFu c1ZhbHVlSXNOdWxsID0gZmNpbmZvLT5pc251bGw7CisJCX0KKworcmVtZW1iZXJfdmFsdWU6CisJ CS8qCisJCSAqIFJlbWVtYmVyIHRoZSBjdXJyZW50IHZhbHVlIGZvciBzdWJzZXF1ZW50IGR1cGxp Y2F0ZSBjaGVja3MuCisJCSAqLworCQlpZiAoIXBlcmFnZ3N0YXRlLT5pbnB1dHR5cGVCeVZhbCkK KwkJeworCQkJaWYgKCFvbGRJc051bGwpCisJCQkJcGZyZWUoRGF0dW1HZXRQb2ludGVyKG9sZFZh bCkpOworCQkJaWYgKCFuZXdJc051bGwpCisJCQkJb2xkVmFsID0gZGF0dW1Db3B5KG5ld1ZhbCwg cGVyYWdnc3RhdGUtPmlucHV0dHlwZUJ5VmFsLAorCQkJCQkJCQkgICBwZXJhZ2dzdGF0ZS0+aW5w dXR0eXBlTGVuKTsKKwkJCWVsc2UKKwkJCQlvbGRWYWwgPSAoRGF0dW0pIDA7CisJCX0KKwkJZWxz ZQorCQkJb2xkVmFsID0gbmV3VmFsOworCQlvbGRBYmJyZXZWYWwgPSBuZXdBYmJyZXZWYWw7CisJ CW9sZElzTnVsbCA9IG5ld0lzTnVsbDsKKwkJaGF2ZU9sZFZhbCA9IHRydWU7CisJfQorCisJaWYg KCFvbGRJc051bGwgJiYgIXBlcmFnZ3N0YXRlLT5pbnB1dHR5cGVCeVZhbCkKKwkJcGZyZWUoRGF0 dW1HZXRQb2ludGVyKG9sZFZhbCkpOworCisJdHVwbGVzb3J0X2VuZChzb3J0c3RhdGUpOworfQor CiAvKgogICogZXZhbF93aW5kb3dhZ2dyZWdhdGVzCiAgKiBldmFsdWF0ZSBwbGFpbiBhZ2dyZWdh dGVzIGJlaW5nIHVzZWQgYXMgd2luZG93IGZ1bmN0aW9ucwpAQCAtOTQ2LDYgKzEyNTIsMjIgQEAg ZXZhbF93aW5kb3dhZ2dyZWdhdGVzKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSkKIAkJfQogCX0K IAorCS8qCisJICogQ29tcHV0ZSBESVNUSU5DVCBhZ2dyZWdhdGVzIGZvciB0aGUgd2hvbGUgcGFy dGl0aW9uLiAgVGhlc2UgYXJlIGhhbmRsZWQKKwkgKiBzZXBhcmF0ZWx5IHZpYSBzb3J0LWJhc2Vk IGRlZHVwbGljYXRpb24gcmF0aGVyIHRoYW4gdGhlIG1haW4KKwkgKiBhY2N1bXVsYXRpb24gbG9v cCBiZWxvdy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtYWdnczsgaSsrKQorCXsKKwkJcGVy YWdnc3RhdGUgPSAmd2luc3RhdGUtPnBlcmFnZ1tpXTsKKwkJaWYgKCFwZXJhZ2dzdGF0ZS0+d2lu ZGlzdGluY3QgfHwgIXBlcmFnZ3N0YXRlLT5yZXN0YXJ0KQorCQkJY29udGludWU7CisJCXdmdW5j bm8gPSBwZXJhZ2dzdGF0ZS0+d2Z1bmNubzsKKwkJZXZhbF93aW5kb3dhZ2dyZWdhdGVfZGlzdGlu Y3Qod2luc3RhdGUsCisJCQkJCQkJCQkgICZ3aW5zdGF0ZS0+cGVyZnVuY1t3ZnVuY25vXSwKKwkJ CQkJCQkJCSAgcGVyYWdnc3RhdGUpOworCX0KKwogCS8qCiAJICogTm9uLXJlc3RhcnRlZCBhZ2dy ZWdhdGVzIG5vdyBjb250YWluIHRoZSByb3dzIGJldHdlZW4gYWdncmVnYXRlZGJhc2UKIAkgKiAo aS5lLiwgZnJhbWVoZWFkcG9zKSBhbmQgYWdncmVnYXRlZHVwdG8sIHdoaWxlIHJlc3RhcnRlZCBh Z2dyZWdhdGVzCkBAIC0xMDAyLDYgKzEzMjQsMTAgQEAgZXZhbF93aW5kb3dhZ2dyZWdhdGVzKFdp bmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSkKIAkJewogCQkJcGVyYWdnc3RhdGUgPSAmd2luc3RhdGUt PnBlcmFnZ1tpXTsKIAorCQkJLyogRElTVElOQ1QgYWdncmVnYXRlcyBhcmUgaGFuZGxlZCBzZXBh cmF0ZWx5ICovCisJCQlpZiAocGVyYWdnc3RhdGUtPndpbmRpc3RpbmN0KQorCQkJCWNvbnRpbnVl OworCiAJCQkvKiBOb24tcmVzdGFydGVkIGFnZ3Mgc2tpcCB1bnRpbCBhZ2dyZWdhdGVkdXB0b19u b25yZXN0YXJ0ZWQgKi8KIAkJCWlmICghcGVyYWdnc3RhdGUtPnJlc3RhcnQgJiYKIAkJCQl3aW5z dGF0ZS0+YWdncmVnYXRlZHVwdG8gPCBhZ2dyZWdhdGVkdXB0b19ub25yZXN0YXJ0ZWQpCkBAIC0x MTY5LDYgKzE0OTUsMjYgQEAgcHJlcGFyZV90dXBsZXN0b3JlKFdpbmRvd0FnZ1N0YXRlICp3aW5z dGF0ZSkKIAkJCXJlYWRwdHJfZmxhZ3MgfD0gRVhFQ19GTEFHX0JBQ0tXQVJEOwogCQl9CiAKKwkJ LyoKKwkJICogSWYgYW55IGFnZ3JlZ2F0ZSB1c2VzIERJU1RJTkNULCB0aGUgcmVhZCBwb2ludGVy IGFsc28gbmVlZHMKKwkJICogQkFDS1dBUkQgY2FwYWJpbGl0eS4gIFRoZSBESVNUSU5DVCBoZWxw ZXIgcmVhZHMgdGhyb3VnaCB0aGUKKwkJICogZW50aXJlIHBhcnRpdGlvbiB0byBjb2xsZWN0IHZh bHVlcyBmb3Igc29ydGluZywgd2hpY2ggYWR2YW5jZXMKKwkJICogdGhlIHJlYWQgcG9pbnRlciB0 byB0aGUgZW5kLiAgVGhlIG1haW4gYWNjdW11bGF0aW9uIGxvb3AgKGZvcgorCQkgKiBub24tRElT VElOQ1QgYWdncmVnYXRlcyBpbiB0aGUgc2FtZSBXaW5kb3dBZ2cgbm9kZSkgdGhlbiBuZWVkcwor CQkgKiB0byByZXdpbmQgYmFjayB0byB0aGUgZnJhbWUgaGVhZC4KKwkJICovCisJCWlmICghKHJl YWRwdHJfZmxhZ3MgJiBFWEVDX0ZMQUdfQkFDS1dBUkQpKQorCQl7CisJCQlmb3IgKGludCBpID0g MDsgaSA8IHdpbnN0YXRlLT5udW1hZ2dzOyBpKyspCisJCQl7CisJCQkJaWYgKHdpbnN0YXRlLT5w ZXJhZ2dbaV0ud2luZGlzdGluY3QpCisJCQkJeworCQkJCQlyZWFkcHRyX2ZsYWdzIHw9IEVYRUNf RkxBR19CQUNLV0FSRDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKIAkJYWdnX3dp bm9iai0+cmVhZHB0ciA9IHR1cGxlc3RvcmVfYWxsb2NfcmVhZF9wb2ludGVyKHdpbnN0YXRlLT5i dWZmZXIsCiAJCQkJCQkJCQkJCQkJCQlyZWFkcHRyX2ZsYWdzKTsKIAl9CkBAIC0yODgyLDcgKzMy MjgsOCBAQCBFeGVjUmVTY2FuV2luZG93QWdnKFdpbmRvd0FnZ1N0YXRlICpub2RlKQogLyoKICAq IGluaXRpYWxpemVfcGVyYWdnCiAgKgotICogQWxtb3N0IHNhbWUgYXMgaW4gbm9kZUFnZy5jLCBl eGNlcHQgd2UgZG9uJ3Qgc3VwcG9ydCBESVNUSU5DVCBjdXJyZW50bHkuCisgKiBBbG1vc3Qgc2Ft ZSBhcyBpbiBub2RlQWdnLmMsIGV4Y2VwdCB3ZSBvbmx5IHN1cHBvcnQgRElTVElOQ1QgZm9yCisg KiB3aG9sZS1wYXJ0aXRpb24gZnJhbWVzIGFuZCBzaW5nbGUtYXJndW1lbnQgYWdncmVnYXRlcy4K ICAqLwogc3RhdGljIFdpbmRvd1N0YXRlUGVyQWdnRGF0YSAqCiBpbml0aWFsaXplX3BlcmFnZyhX aW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFdpbmRvd0Z1bmMgKndmdW5jLApAQCAtMjkwOSwxMyAr MzI1NiwyMCBAQCBpbml0aWFsaXplX3BlcmFnZyhXaW5kb3dBZ2dTdGF0ZSAqd2luc3RhdGUsIFdp bmRvd0Z1bmMgKndmdW5jLAogCUxpc3RDZWxsICAgKmxjOwogCiAJLyoKLQkgKiBUZW1wb3Jhcnk6 IHJlamVjdCBESVNUSU5DVCB3aW5kb3cgYWdncmVnYXRlcyB1bnRpbCBleGVjdXRvciBzdXBwb3J0 Ci0JICogbGFuZHMuICBQYXRjaCAyIHdpbGwgcmVwbGFjZSB0aGlzIHdpdGggYWN0dWFsIERJU1RJ TkNUIGhhbmRsaW5nLgorCSAqIFZhbGlkYXRlIERJU1RJTkNUIHVzYWdlLiAgQ3VycmVudGx5IHdl IG9ubHkgc3VwcG9ydCBESVNUSU5DVCBmb3IKKwkgKiB3aG9sZS1wYXJ0aXRpb24gZnJhbWVzICh3 aGVyZSB0aGUgcmVzdWx0IGlzIGNvbnN0YW50IGFjcm9zcyB0aGUKKwkgKiBwYXJ0aXRpb24pIGFu ZCBzaW5nbGUtYXJndW1lbnQgYWdncmVnYXRlcyBvbmx5LgogCSAqLwotCWlmICh3ZnVuYy0+d2lu ZGlzdGluY3QpCisJaWYgKHdmdW5jLT53aW5kaXN0aW5jdCAmJiAhaXNfd2hvbGVfcGFydGl0aW9u X2ZyYW1lKHdpbnN0YXRlKSkKIAkJZXJlcG9ydChFUlJPUiwKIAkJCQkoZXJyY29kZShFUlJDT0RF X0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCi0JCQkJIGVycm1zZygiRElTVElOQ1QgaXMgbm90IHll dCBpbXBsZW1lbnRlZCBmb3Igd2luZG93IGFnZ3JlZ2F0ZXMiKSkpOworCQkJCSBlcnJtc2coIkRJ U1RJTkNUIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB3aW5kb3cgZnVuY3Rpb25zIHdpdGggYSBmcmFt ZSB0aGF0IGNvdmVycyB0aGUgZW50aXJlIHBhcnRpdGlvbiIpLAorCQkJCSBlcnJoaW50KCJSZW1v dmUgT1JERVIgQlkgZnJvbSB0aGUgd2luZG93IGRlZmluaXRpb24sIG9yIHVzZSBST1dTIEJFVFdF RU4gVU5CT1VOREVEIFBSRUNFRElORyBBTkQgVU5CT1VOREVEIEZPTExPV0lORy4iKSkpOworCisJ aWYgKHdmdW5jLT53aW5kaXN0aW5jdCAmJiBsaXN0X2xlbmd0aCh3ZnVuYy0+YXJncykgIT0gMSkK KwkJZXJlcG9ydChFUlJPUiwKKwkJCQkoZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBP UlRFRCksCisJCQkJIGVycm1zZygiRElTVElOQ1QgaXMgbm90IHN1cHBvcnRlZCBmb3Igd2luZG93 IGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IikpKTsKIAog CW51bUFyZ3VtZW50cyA9IGxpc3RfbGVuZ3RoKHdmdW5jLT5hcmdzKTsKIApAQCAtMzE2MSw2ICsz NTE1LDM1IEBAIGluaXRpYWxpemVfcGVyYWdnKFdpbmRvd0FnZ1N0YXRlICp3aW5zdGF0ZSwgV2lu ZG93RnVuYyAqd2Z1bmMsCiAJZWxzZQogCQlwZXJhZ2dzdGF0ZS0+YWdnY29udGV4dCA9IHdpbnN0 YXRlLT5hZ2djb250ZXh0OwogCisJLyoKKwkgKiBTZXQgdXAgRElTVElOQ1Qgc3RhdGUgaWYgbmVl ZGVkLiAgV2UgbmVlZCBzb3J0IGFuZCBlcXVhbGl0eSBvcGVyYXRvcnMKKwkgKiBmb3IgdGhlIHNp bmdsZSBhcmd1bWVudCB0eXBlLCBwbHVzIGl0cyB0eXBlIGxlbmd0aCBhbmQgYnktdmFsdWUgaW5m bworCSAqIGZvciBkYXR1bSBjb3B5aW5nIGR1cmluZyB0aGUgZGVkdXAgbG9vcC4KKwkgKi8KKwlp ZiAod2Z1bmMtPndpbmRpc3RpbmN0KQorCXsKKwkJT2lkCQkJbHRPcHIsCisJCQkJCWVxT3ByOwor CQlPaWQJCQlpbnB1dFR5cGUgPSBpbnB1dFR5cGVzWzBdOworCisJCXBlcmFnZ3N0YXRlLT53aW5k aXN0aW5jdCA9IHRydWU7CisJCXBlcmFnZ3N0YXRlLT5pbnB1dHR5cGVPaWQgPSBpbnB1dFR5cGU7 CisKKwkJZ2V0X3NvcnRfZ3JvdXBfb3BlcmF0b3JzKGlucHV0VHlwZSwKKwkJCQkJCQkJIHRydWUs IHRydWUsIGZhbHNlLAorCQkJCQkJCQkgJmx0T3ByLCAmZXFPcHIsIE5VTEwsCisJCQkJCQkJCSBO VUxMKTsKKworCQlwZXJhZ2dzdGF0ZS0+c29ydE9wZXJhdG9yID0gbHRPcHI7CisJCXBlcmFnZ3N0 YXRlLT5zb3J0Q29sbGF0aW9uID0gd2Z1bmMtPmlucHV0Y29sbGlkOworCQlwZXJhZ2dzdGF0ZS0+ c29ydE51bGxzRmlyc3QgPSBmYWxzZTsKKwkJZm1ncl9pbmZvKGdldF9vcGNvZGUoZXFPcHIpLCAm cGVyYWdnc3RhdGUtPmVxdWFsZm4pOworCisJCWdldF90eXBsZW5ieXZhbChpbnB1dFR5cGUsCisJ CQkJCQkmcGVyYWdnc3RhdGUtPmlucHV0dHlwZUxlbiwKKwkJCQkJCSZwZXJhZ2dzdGF0ZS0+aW5w dXR0eXBlQnlWYWwpOworCX0KKwogCVJlbGVhc2VTeXNDYWNoZShhZ2dUdXBsZSk7CiAKIAlyZXR1 cm4gcGVyYWdnc3RhdGU7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3dp bmRvdy5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3dpbmRvdy5vdXQKaW5kZXggMGY0 ZGMyZmU5NmYuLmQyZGIwOWY4M2I4IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL3dpbmRvdy5vdXQKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC93aW5kb3cub3V0 CkBAIC01ODc3LDggKzU4NzcsNyBAQCBXSU5ET1cgdyBBUyAoT1JERVIgQlkgeCBST1dTIEJFVFdF RU4gMiBQUkVDRURJTkcgQU5EIDIgRk9MTE9XSU5HKTsKIERST1AgVEFCTEUgcGxhbmV0cyBDQVND QURFOwogTk9USUNFOiAgZHJvcCBjYXNjYWRlcyB0byB2aWV3IHBsYW5ldHNfdmlldwogLS0KLS0t IFRlc3QgRElTVElOQ1QgaW4gd2luZG93IGFnZ3JlZ2F0ZXMgKHBhcnNlL2RlcGFyc2UgcGx1bWJp bmcgb25seTsKLS0tIGV4ZWN1dGlvbiBzdXBwb3J0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQpCist LSBUZXN0IERJU1RJTkNUIGluIHdpbmRvdyBhZ2dyZWdhdGVzCiAtLQogLS0gU2hvdWxkIHBhcnNl IHN1Y2Nlc3NmdWxseSBhbmQgcm91bmQtdHJpcCB0aHJvdWdoIGEgdmlldyBkZWZpbml0aW9uCiBD UkVBVEUgVEVNUCBWSUVXIHdpbmRvd19kaXN0aW5jdF92aWV3IEFTCkBAIC01ODk2LDYgKzU4OTUs MTYzIEBAIFNFTEVDVCBudGlsZShESVNUSU5DVCA0KSBPVkVSICgpIEZST00gdGVuazE7IC0tIGVy cm9yCiBFUlJPUjogIERJU1RJTkNUIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3Igbm9uLWFnZ3JlZ2F0 ZSB3aW5kb3cgZnVuY3Rpb25zCiBMSU5FIDE6IFNFTEVDVCBudGlsZShESVNUSU5DVCA0KSBPVkVS ICgpIEZST00gdGVuazE7CiAgICAgICAgICAgICAgICBeCi0tLSBFeGVjdXRpb24gZmFpbHMgd2l0 aCBhIGNsZWFyIGV4ZWN1dG9yLXNpZGUgZXJyb3IKLVNFTEVDVCBjb3VudChESVNUSU5DVCBmb3Vy KSBPVkVSIChQQVJUSVRJT04gQlkgdGVuKSBGUk9NIHRlbmsxOyAtLSBlcnJvcgotRVJST1I6ICBE SVNUSU5DVCBpcyBub3QgeWV0IGltcGxlbWVudGVkIGZvciB3aW5kb3cgYWdncmVnYXRlcworLS0g QmFzaWMgRElTVElOQ1Qgd2hvbGUtcGFydGl0aW9uIGNhc2VzIChzaG91bGQgc3VjY2VlZCkKK1NF TEVDVCBjb3VudChESVNUSU5DVCBmb3VyKSBPVkVSIChQQVJUSVRJT04gQlkgdGVuKQorRlJPTSB0 ZW5rMSBMSU1JVCAyMDsKKyBjb3VudCAKKy0tLS0tLS0KKyAgICAgMgorICAgICAyCisgICAgIDIK KyAgICAgMgorICAgICAyCisgICAgIDIKKyAgICAgMgorICAgICAyCisgICAgIDIKKyAgICAgMgor ICAgICAyCisgICAgIDIKKyAgICAgMgorICAgICAyCisgICAgIDIKKyAgICAgMgorICAgICAyCisg ICAgIDIKKyAgICAgMgorICAgICAyCisoMjAgcm93cykKKworLS0gRElTVElOQ1Qgd2l0aCBubyBQ QVJUSVRJT04gQlkgKHdob2xlIHNpbmdsZSBwYXJ0aXRpb24pCitTRUxFQ1QgeCwgc3VtKERJU1RJ TkNUIHggJSAzKSBPVkVSICgpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCA5KSBnKHgpOworIHgg fCBzdW0gCistLS0rLS0tLS0KKyAxIHwgICAzCisgMiB8ICAgMworIDMgfCAgIDMKKyA0IHwgICAz CisgNSB8ICAgMworIDYgfCAgIDMKKyA3IHwgICAzCisgOCB8ICAgMworIDkgfCAgIDMKKyg5IHJv d3MpCisKKy0tIERJU1RJTkNUIHdpdGggZXhwbGljaXQgVU5CT1VOREVEIFBSRUNFRElORyB0byBV TkJPVU5ERUQgRk9MTE9XSU5HCitTRUxFQ1QgeCwgYXZnKERJU1RJTkNUIHggJSA0KSBPVkVSIChQ QVJUSVRJT04gQlkgeCA+IDUKKyAgUk9XUyBCRVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5E IFVOQk9VTkRFRCBGT0xMT1dJTkcpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsK KyB4ICB8ICAgICAgICBhdmcgICAgICAgICAKKy0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAg MSB8IDEuNTAwMDAwMDAwMDAwMDAwMAorICAyIHwgMS41MDAwMDAwMDAwMDAwMDAwCisgIDMgfCAx LjUwMDAwMDAwMDAwMDAwMDAKKyAgNCB8IDEuNTAwMDAwMDAwMDAwMDAwMAorICA1IHwgMS41MDAw MDAwMDAwMDAwMDAwCisgIDYgfCAxLjUwMDAwMDAwMDAwMDAwMDAKKyAgNyB8IDEuNTAwMDAwMDAw MDAwMDAwMAorICA4IHwgMS41MDAwMDAwMDAwMDAwMDAwCisgIDkgfCAxLjUwMDAwMDAwMDAwMDAw MDAKKyAxMCB8IDEuNTAwMDAwMDAwMDAwMDAwMAorKDEwIHJvd3MpCisKKy0tIERJU1RJTkNUIHdp dGggRklMVEVSCitTRUxFQ1QgeCwKKyAgICAgICBjb3VudChESVNUSU5DVCB4ICUgMykgRklMVEVS IChXSEVSRSB4ID4gMykgT1ZFUiAoUEFSVElUSU9OIEJZIHggPiA1KQorRlJPTSBnZW5lcmF0ZV9z ZXJpZXMoMSwgMTApIGcoeCk7CisgeCAgfCBjb3VudCAKKy0tLS0rLS0tLS0tLQorICAxIHwgICAg IDIKKyAgMiB8ICAgICAyCisgIDMgfCAgICAgMgorICA0IHwgICAgIDIKKyAgNSB8ICAgICAyCisg IDYgfCAgICAgMworICA3IHwgICAgIDMKKyAgOCB8ICAgICAzCisgIDkgfCAgICAgMworIDEwIHwg ICAgIDMKKygxMCByb3dzKQorCistLSBOVUxMIGhhbmRsaW5nCitTRUxFQ1QgeCwKKyAgICAgICBj b3VudChESVNUSU5DVCB4KSBPVkVSICgpCitGUk9NIChWQUxVRVMgKDEpLCgyKSwoTlVMTCksKDIp LChOVUxMKSwoMSksKDMpKSB2KHgpOworIHggfCBjb3VudCAKKy0tLSstLS0tLS0tCisgMSB8ICAg ICAzCisgMiB8ICAgICAzCisgICB8ICAgICAzCisgMiB8ICAgICAzCisgICB8ICAgICAzCisgMSB8 ICAgICAzCisgMyB8ICAgICAzCisoNyByb3dzKQorCistLSBNaXhlZCBESVNUSU5DVCBhbmQgbm9u LURJU1RJTkNUIGFnZ3JlZ2F0ZXMgaW4gc2FtZSB3aW5kb3cKK1NFTEVDVCB4LAorICAgICAgIGNv dW50KERJU1RJTkNUIHggJSAzKSBPVkVSIHcsCisgICAgICAgc3VtKHgpIE9WRVIgdworRlJPTSBn ZW5lcmF0ZV9zZXJpZXMoMSwgOSkgZyh4KQorV0lORE9XIHcgQVMgKFBBUlRJVElPTiBCWSB4ID4g NSk7CisgeCB8IGNvdW50IHwgc3VtIAorLS0tKy0tLS0tLS0rLS0tLS0KKyAxIHwgICAgIDMgfCAg MTUKKyAyIHwgICAgIDMgfCAgMTUKKyAzIHwgICAgIDMgfCAgMTUKKyA0IHwgICAgIDMgfCAgMTUK KyA1IHwgICAgIDMgfCAgMTUKKyA2IHwgICAgIDMgfCAgMzAKKyA3IHwgICAgIDMgfCAgMzAKKyA4 IHwgICAgIDMgfCAgMzAKKyA5IHwgICAgIDMgfCAgMzAKKyg5IHJvd3MpCisKKy0tIE11bHRpcGxl IERJU1RJTkNUIGFnZ3JlZ2F0ZXMgaW4gc2FtZSBxdWVyeQorU0VMRUNUIHgsCisgICAgICAgY291 bnQoRElTVElOQ1QgeCAlIDIpIE9WRVIgKFBBUlRJVElPTiBCWSB4ID4gNSksCisgICAgICAgc3Vt KERJU1RJTkNUIHggJSAzKSBPVkVSIChQQVJUSVRJT04gQlkgeCA+IDUpCitGUk9NIGdlbmVyYXRl X3NlcmllcygxLCAxMCkgZyh4KTsKKyB4ICB8IGNvdW50IHwgc3VtIAorLS0tLSstLS0tLS0tKy0t LS0tCisgIDEgfCAgICAgMiB8ICAgMworICAyIHwgICAgIDIgfCAgIDMKKyAgMyB8ICAgICAyIHwg ICAzCisgIDQgfCAgICAgMiB8ICAgMworICA1IHwgICAgIDIgfCAgIDMKKyAgNiB8ICAgICAyIHwg ICAzCisgIDcgfCAgICAgMiB8ICAgMworICA4IHwgICAgIDIgfCAgIDMKKyAgOSB8ICAgICAyIHwg ICAzCisgMTAgfCAgICAgMiB8ICAgMworKDEwIHJvd3MpCisKKy0tIEVycm9yOiBub24td2hvbGUt cGFydGl0aW9uIGZyYW1lIChoYXMgT1JERVIgQlkgLT4gUkFOR0UgVU5CT1VOREVEIFBSRUNFRElO RyB0byBDVVJSRU5UIFJPVykKK1NFTEVDVCBjb3VudChESVNUSU5DVCB4KSBPVkVSIChQQVJUSVRJ T04gQlkgeCA+IDUgT1JERVIgQlkgeCkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBnKHgp OyAtLSBlcnJvcgorRVJST1I6ICBESVNUSU5DVCBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igd2luZG93 IGZ1bmN0aW9ucyB3aXRoIGEgZnJhbWUgdGhhdCBjb3ZlcnMgdGhlIGVudGlyZSBwYXJ0aXRpb24K K0hJTlQ6ICBSZW1vdmUgT1JERVIgQlkgZnJvbSB0aGUgd2luZG93IGRlZmluaXRpb24sIG9yIHVz ZSBST1dTIEJFVFdFRU4gVU5CT1VOREVEIFBSRUNFRElORyBBTkQgVU5CT1VOREVEIEZPTExPV0lO Ry4KKy0tIEVycm9yOiBwYXJ0aWFsIFJPV1MgZnJhbWUKK1NFTEVDVCBjb3VudChESVNUSU5DVCB4 KSBPVkVSIChST1dTIDMgUFJFQ0VESU5HKQorRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTApIGco eCk7IC0tIGVycm9yCitFUlJPUjogIERJU1RJTkNUIGlzIG9ubHkgc3VwcG9ydGVkIGZvciB3aW5k b3cgZnVuY3Rpb25zIHdpdGggYSBmcmFtZSB0aGF0IGNvdmVycyB0aGUgZW50aXJlIHBhcnRpdGlv bgorSElOVDogIFJlbW92ZSBPUkRFUiBCWSBmcm9tIHRoZSB3aW5kb3cgZGVmaW5pdGlvbiwgb3Ig dXNlIFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJFQ0VESU5HIEFORCBVTkJPVU5ERUQgRk9MTE9X SU5HLgorLS0gRXJyb3I6IEVYQ0xVREUgY2xhdXNlCitTRUxFQ1QgY291bnQoRElTVElOQ1QgeCkg T1ZFUiAoUk9XUyBCRVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5EIFVOQk9VTkRFRCBGT0xM T1dJTkcgRVhDTFVERSBDVVJSRU5UIFJPVykKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBn KHgpOyAtLSBlcnJvcgorRVJST1I6ICBESVNUSU5DVCBpcyBvbmx5IHN1cHBvcnRlZCBmb3Igd2lu ZG93IGZ1bmN0aW9ucyB3aXRoIGEgZnJhbWUgdGhhdCBjb3ZlcnMgdGhlIGVudGlyZSBwYXJ0aXRp b24KK0hJTlQ6ICBSZW1vdmUgT1JERVIgQlkgZnJvbSB0aGUgd2luZG93IGRlZmluaXRpb24sIG9y IHVzZSBST1dTIEJFVFdFRU4gVU5CT1VOREVEIFBSRUNFRElORyBBTkQgVU5CT1VOREVEIEZPTExP V0lORy4KKy0tIEVycm9yOiBST1dTIEJFVFdFRU4gVU5CT1VOREVEIFBSRUNFRElORyBBTkQgQ1VS UkVOVCBST1cgKG5vdCB3aG9sZS1wYXJ0aXRpb24KKy0tIGV2ZW4gd2l0aG91dCBPUkRFUiBCWSwg YmVjYXVzZSBST1dTIENVUlJFTlQgUk9XIG1lYW5zIGV4YWN0bHkgb25lIHJvdykKK1NFTEVDVCB4 LAorICAgICAgIGNvdW50KERJU1RJTkNUIHggJSAzKSBPVkVSICgKKyAgICAgICAgICAgUk9XUyBC RVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5EIENVUlJFTlQgUk9XCisgICAgICAgKQorRlJP TSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTApIGcoeCk7IC0tIGVycm9yCitFUlJPUjogIERJU1RJTkNU IGlzIG9ubHkgc3VwcG9ydGVkIGZvciB3aW5kb3cgZnVuY3Rpb25zIHdpdGggYSBmcmFtZSB0aGF0 IGNvdmVycyB0aGUgZW50aXJlIHBhcnRpdGlvbgorSElOVDogIFJlbW92ZSBPUkRFUiBCWSBmcm9t IHRoZSB3aW5kb3cgZGVmaW5pdGlvbiwgb3IgdXNlIFJPV1MgQkVUV0VFTiBVTkJPVU5ERUQgUFJF Q0VESU5HIEFORCBVTkJPVU5ERUQgRk9MTE9XSU5HLgorLS0gRXJyb3I6IG11bHRpLWFyZ3VtZW50 IERJU1RJTkNUIHdpbmRvdyBhZ2dyZWdhdGUgKG5vdCB5ZXQgc3VwcG9ydGVkKQorU0VMRUNUIHN0 cmluZ19hZ2coRElTVElOQ1QgZm91cjo6dGV4dCwgJywnKSBPVkVSIChQQVJUSVRJT04gQlkgdGVu KQorRlJPTSB0ZW5rMTsgLS0gZXJyb3IKK0VSUk9SOiAgRElTVElOQ1QgaXMgbm90IHN1cHBvcnRl ZCBmb3Igd2luZG93IGFnZ3JlZ2F0ZSBmdW5jdGlvbnMgd2l0aCBtb3JlIHRoYW4gb25lIGFyZ3Vt ZW50CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC93aW5kb3cuc3FsIGIvc3JjL3Rl c3QvcmVncmVzcy9zcWwvd2luZG93LnNxbAppbmRleCBiZTQ1YmQ1ZjE0Zi4uOWMwNWM3NzgxMDgg MTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3dpbmRvdy5zcWwKKysrIGIvc3JjL3Rl c3QvcmVncmVzcy9zcWwvd2luZG93LnNxbApAQCAtMjEzNSw4ICsyMTM1LDcgQEAgV0lORE9XIHcg QVMgKE9SREVSIEJZIHggUk9XUyBCRVRXRUVOIDIgUFJFQ0VESU5HIEFORCAyIEZPTExPV0lORyk7 CiBEUk9QIFRBQkxFIHBsYW5ldHMgQ0FTQ0FERTsKIAogLS0KLS0tIFRlc3QgRElTVElOQ1QgaW4g d2luZG93IGFnZ3JlZ2F0ZXMgKHBhcnNlL2RlcGFyc2UgcGx1bWJpbmcgb25seTsKLS0tIGV4ZWN1 dGlvbiBzdXBwb3J0IGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQpCistLSBUZXN0IERJU1RJTkNUIGlu IHdpbmRvdyBhZ2dyZWdhdGVzCiAtLQogCiAtLSBTaG91bGQgcGFyc2Ugc3VjY2Vzc2Z1bGx5IGFu ZCByb3VuZC10cmlwIHRocm91Z2ggYSB2aWV3IGRlZmluaXRpb24KQEAgLTIxNDksNSArMjE0OCw2 MiBAQCBEUk9QIFZJRVcgd2luZG93X2Rpc3RpbmN0X3ZpZXc7CiAtLSBESVNUSU5DVCBvbiBhIG5v bi1hZ2dyZWdhdGUgd2luZG93IGZ1bmN0aW9uIGlzIHN0aWxsIGEgcGFyc2UgZXJyb3IKIFNFTEVD VCBudGlsZShESVNUSU5DVCA0KSBPVkVSICgpIEZST00gdGVuazE7IC0tIGVycm9yCiAKLS0tIEV4 ZWN1dGlvbiBmYWlscyB3aXRoIGEgY2xlYXIgZXhlY3V0b3Itc2lkZSBlcnJvcgotU0VMRUNUIGNv dW50KERJU1RJTkNUIGZvdXIpIE9WRVIgKFBBUlRJVElPTiBCWSB0ZW4pIEZST00gdGVuazE7IC0t IGVycm9yCistLSBCYXNpYyBESVNUSU5DVCB3aG9sZS1wYXJ0aXRpb24gY2FzZXMgKHNob3VsZCBz dWNjZWVkKQorU0VMRUNUIGNvdW50KERJU1RJTkNUIGZvdXIpIE9WRVIgKFBBUlRJVElPTiBCWSB0 ZW4pCitGUk9NIHRlbmsxIExJTUlUIDIwOworCistLSBESVNUSU5DVCB3aXRoIG5vIFBBUlRJVElP TiBCWSAod2hvbGUgc2luZ2xlIHBhcnRpdGlvbikKK1NFTEVDVCB4LCBzdW0oRElTVElOQ1QgeCAl IDMpIE9WRVIgKCkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDkpIGcoeCk7CisKKy0tIERJU1RJ TkNUIHdpdGggZXhwbGljaXQgVU5CT1VOREVEIFBSRUNFRElORyB0byBVTkJPVU5ERUQgRk9MTE9X SU5HCitTRUxFQ1QgeCwgYXZnKERJU1RJTkNUIHggJSA0KSBPVkVSIChQQVJUSVRJT04gQlkgeCA+ IDUKKyAgUk9XUyBCRVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJTkcgQU5EIFVOQk9VTkRFRCBGT0xM T1dJTkcpCitGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAxMCkgZyh4KTsKKworLS0gRElTVElOQ1Qg d2l0aCBGSUxURVIKK1NFTEVDVCB4LAorICAgICAgIGNvdW50KERJU1RJTkNUIHggJSAzKSBGSUxU RVIgKFdIRVJFIHggPiAzKSBPVkVSIChQQVJUSVRJT04gQlkgeCA+IDUpCitGUk9NIGdlbmVyYXRl X3NlcmllcygxLCAxMCkgZyh4KTsKKworLS0gTlVMTCBoYW5kbGluZworU0VMRUNUIHgsCisgICAg ICAgY291bnQoRElTVElOQ1QgeCkgT1ZFUiAoKQorRlJPTSAoVkFMVUVTICgxKSwoMiksKE5VTEwp LCgyKSwoTlVMTCksKDEpLCgzKSkgdih4KTsKKworLS0gTWl4ZWQgRElTVElOQ1QgYW5kIG5vbi1E SVNUSU5DVCBhZ2dyZWdhdGVzIGluIHNhbWUgd2luZG93CitTRUxFQ1QgeCwKKyAgICAgICBjb3Vu dChESVNUSU5DVCB4ICUgMykgT1ZFUiB3LAorICAgICAgIHN1bSh4KSBPVkVSIHcKK0ZST00gZ2Vu ZXJhdGVfc2VyaWVzKDEsIDkpIGcoeCkKK1dJTkRPVyB3IEFTIChQQVJUSVRJT04gQlkgeCA+IDUp OworCistLSBNdWx0aXBsZSBESVNUSU5DVCBhZ2dyZWdhdGVzIGluIHNhbWUgcXVlcnkKK1NFTEVD VCB4LAorICAgICAgIGNvdW50KERJU1RJTkNUIHggJSAyKSBPVkVSIChQQVJUSVRJT04gQlkgeCA+ IDUpLAorICAgICAgIHN1bShESVNUSU5DVCB4ICUgMykgT1ZFUiAoUEFSVElUSU9OIEJZIHggPiA1 KQorRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTApIGcoeCk7CisKKy0tIEVycm9yOiBub24td2hv bGUtcGFydGl0aW9uIGZyYW1lIChoYXMgT1JERVIgQlkgLT4gUkFOR0UgVU5CT1VOREVEIFBSRUNF RElORyB0byBDVVJSRU5UIFJPVykKK1NFTEVDVCBjb3VudChESVNUSU5DVCB4KSBPVkVSIChQQVJU SVRJT04gQlkgeCA+IDUgT1JERVIgQlkgeCkKK0ZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDEwKSBn KHgpOyAtLSBlcnJvcgorCistLSBFcnJvcjogcGFydGlhbCBST1dTIGZyYW1lCitTRUxFQ1QgY291 bnQoRElTVElOQ1QgeCkgT1ZFUiAoUk9XUyAzIFBSRUNFRElORykKK0ZST00gZ2VuZXJhdGVfc2Vy aWVzKDEsIDEwKSBnKHgpOyAtLSBlcnJvcgorCistLSBFcnJvcjogRVhDTFVERSBjbGF1c2UKK1NF TEVDVCBjb3VudChESVNUSU5DVCB4KSBPVkVSIChST1dTIEJFVFdFRU4gVU5CT1VOREVEIFBSRUNF RElORyBBTkQgVU5CT1VOREVEIEZPTExPV0lORyBFWENMVURFIENVUlJFTlQgUk9XKQorRlJPTSBn ZW5lcmF0ZV9zZXJpZXMoMSwgMTApIGcoeCk7IC0tIGVycm9yCisKKy0tIEVycm9yOiBST1dTIEJF VFdFRU4gVU5CT1VOREVEIFBSRUNFRElORyBBTkQgQ1VSUkVOVCBST1cgKG5vdCB3aG9sZS1wYXJ0 aXRpb24KKy0tIGV2ZW4gd2l0aG91dCBPUkRFUiBCWSwgYmVjYXVzZSBST1dTIENVUlJFTlQgUk9X IG1lYW5zIGV4YWN0bHkgb25lIHJvdykKK1NFTEVDVCB4LAorICAgICAgIGNvdW50KERJU1RJTkNU IHggJSAzKSBPVkVSICgKKyAgICAgICAgICAgUk9XUyBCRVRXRUVOIFVOQk9VTkRFRCBQUkVDRURJ TkcgQU5EIENVUlJFTlQgUk9XCisgICAgICAgKQorRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMTAp IGcoeCk7IC0tIGVycm9yCisKKy0tIEVycm9yOiBtdWx0aS1hcmd1bWVudCBESVNUSU5DVCB3aW5k b3cgYWdncmVnYXRlIChub3QgeWV0IHN1cHBvcnRlZCkKK1NFTEVDVCBzdHJpbmdfYWdnKERJU1RJ TkNUIGZvdXI6OnRleHQsICcsJykgT1ZFUiAoUEFSVElUSU9OIEJZIHRlbikKK0ZST00gdGVuazE7 IC0tIGVycm9yCi0tIAoyLjUyLjAKCg== --0000000000008052e7064eec3726--