delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2022/03/18/00:24:20

X-Recipient: archive-cygwin AT delorie DOT com
X-Original-To: cygwin AT cygwin DOT com
Delivered-To: cygwin AT cygwin DOT com
DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 518E6388451F
Authentication-Results: sourceware.org;
dmarc=fail (p=none dis=none) header.from=nifty.ne.jp
Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=nifty.ne.jp
DKIM-Filter: OpenDKIM Filter v2.10.3 conssluserg-05.nifty.com 22I4NPpj006802
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.ne.jp;
s=dec2015msa; t=1647577405;
bh=P2KU1+ytmd2YPMuEF8PcXIa9ig4qqw1/dzHUEqhakbg=;
h=Date:From:To:Cc:Subject:In-Reply-To:References:From;
b=VmB6goziijGupiMl4ReQy11kOetLlkG1AX+Ipzptlg/hQyB4i/9Tx9SbkvAI3U0SJ
wwsB9jqmEUt/pXou42aZu+af6mSjoRAl/FssHbhGdJLfObAGYlFH69Ad1TiWkrZCvZ
RPtH5gpxBSTKHnC6gqaf9VMnInePfwB9iYZOgLW8VTIVbjoCPX6m8bwyQbxZ1M0gT0
7eLiBk06W83ZQsgZPcKm+mTk1EF9uv6diSkW7ZZQQTgp1c5AfdOn480y2gSviyRDV+
x2K5qE9EjNx3g7MRTB5zzigLjZzT6vuO/lnGR87YDX1sGfBkyIjUjeNw5lWXvWOopi
+WNWx4b+nBEvA==
X-Nifty-SrcIP: [119.150.36.16]
Date: Fri, 18 Mar 2022 13:23:35 +0900
From: Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
To: cygwin AT cygwin DOT com
Subject: Re: Typed characters are mis-ordered when CPU usage is high
Message-Id: <20220318132335.d5635fe9fc782ed53bddf7bc@nifty.ne.jp>
In-Reply-To: <CAGHpTBLe0D9gQaK=4A91w5eravsygpWe001DhcB=hhrcLx6YWA@mail.gmail.com>
References: <CAGHpTBKbqxWQ+WOc=UZH1a155gHhNc4ogVE0sP=rCw7q5xoNpQ AT mail DOT gmail DOT com>
<20220227235303 DOT 5d6239724ed83b145772134b AT nifty DOT ne DOT jp>
<20220302081259 DOT 2a7e522ef1a9e3e6da0aa259 AT nifty DOT ne DOT jp>
<CAGHpTBLc9waVzjKWb84C5KS+s9uKENrOMAxxfBBrvPR-zKKtPQ AT mail DOT gmail DOT com>
<20220303090208 DOT 4a04e35756b7868fe9b4701d AT nifty DOT ne DOT jp>
<CAGHpTBKU5XQJ6mjsvb94LnbJb5xj3uoRMtt3KgsMx1NjpM5hSg AT mail DOT gmail DOT com>
<20220312063625 DOT 9ca3d42d4e2e941a13fa7909 AT nifty DOT ne DOT jp>
<CAGHpTBLe0D9gQaK=4A91w5eravsygpWe001DhcB=hhrcLx6YWA AT mail DOT gmail DOT com>
X-Mailer: Sylpheed 3.7.0 (GTK+ 2.24.30; i686-pc-mingw32)
Mime-Version: 1.0
X-Spam-Status: No, score=-4.7 required=5.0 tests=BAYES_00, DKIM_SIGNED,
DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, KAM_LOTSOFHASH, NICE_REPLY_A,
RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP,
T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.4
X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on
server2.sourceware.org
X-BeenThere: cygwin AT cygwin DOT com
X-Mailman-Version: 2.1.29
List-Id: General Cygwin discussions and problem reports <cygwin.cygwin.com>
List-Unsubscribe: <https://cygwin.com/mailman/options/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=unsubscribe>
List-Archive: <https://cygwin.com/pipermail/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-request AT cygwin DOT com?subject=help>
List-Subscribe: <https://cygwin.com/mailman/listinfo/cygwin>,
<mailto:cygwin-request AT cygwin DOT com?subject=subscribe>
Cc: Orgad Shaneh <orgads AT gmail DOT com>
Errors-To: cygwin-bounces+archive-cygwin=delorie DOT com AT cygwin DOT com
Sender: "Cygwin" <cygwin-bounces+archive-cygwin=delorie DOT com AT cygwin DOT com>

This is a multi-part message in MIME format.

--Multipart=_Fri__18_Mar_2022_13_23_35_+0900_dijPPCXjUHVx7/Qg
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit

On Thu, 17 Mar 2022 20:40:15 +0200
Orgad Shaneh wrote:
> On Fri, Mar 11, 2022 at 11:36 PM Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp> wrote:
> > I looked into this problem and found the cause.
> > This seems to be due to a bug of fsync(). Cygwin's fsync()
> > flushes the console input buffer unlike linux.
> >
> > I will propose a patch for this issue.
> >
> > --
> > Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
> 
> Thank you very much. Looks better now.
> 
> I'm sorry for nudging, but on msys2 I still get frequent mistypes when
> typing fast.
> 
> I (still) don't have a consistent reproduction, but if I get it
> correctly, it looks like one or more characters I type right when the
> prompt appears show up before the buffered characters.
> 
> For instance, I run git fetch, and while it is running I type git
> status, *sometimes* 1-2 characters "pop" to the left, so I get
> something like tgit satus.
> 
> I wasn't able to reproduce it with cygwin, but on msys2 (with cygwin
> 3.3 branch merged in) it happens to me all the time :/

Thansk for the report.

I cloned the msys2-runtime repository from
https://github.com/msys2/msys2-runtime
and applied patches in cygwin-3_3-branch against msys2-3_3_4-release
branch. The patches applied are listed in cygwin-3_3-branch-merged.log
attached. A few patches, which are not actually in cygwin-3_3-branch,
are also applied just for avoiding conflict easily.

However, I cannot reproduce your problem. Have you surely applied the
following patches especially important for this issue?

Could you please also check if the code of cons_master_thread() in
fhandler_console.cc exactly matches with cons_master_thread.cc attached?

commit 4d0721a66f94427fa14601d0c58a0762709b5bf2
Author: Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
Date:   Fri Feb 25 17:10:03 2022 +0900

    Cygwin: console: Prevent the order of typeahead input from swapped.

    - If a lot of keys are typed very quickly in the app which does
      not read console, the order of input keys in console input buffer
      occasionally swapped. Although this extremely rarely happens,
      is obviously a bug of cons_master_thread. This patch fixes the
      issue.

commit f48870148c7ebcaf8163b08a040d15ef048f4e94
Author: Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
Date:   Mon Feb 28 20:02:01 2022 +0900

    Cygwin: console: Improve the code to avoid typeahead key swapping.

    - The commit "Cygwin: console: Prevent the order of typeahead input
      from swapped." did not fully resolve the issue. If keys are typed
      during input buffer fix, the order of key event may be swapped.
      This patch fixes the issue again.

commit 6e872adb9f153ba0504c898a91ac8dcf0ed7e68a
Author: Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
Date:   Wed Mar 2 09:55:52 2022 +0900

    Cygwin: console: Prevent special keys processing from drop.

    - There was a potential risk to drop special key processing when
      process_input_messsage() is called intermittently. This patch
      fixes the issue.

commit d88768187a72662d1692ee279e7dea3e948d256e
Author: Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
Date:   Wed Mar 2 11:08:27 2022 +0900

    Cygwin: console: Fix a bug from comparison between int and DWORD.

commit cef38f41f2ce0510855bb4b872c7f6514f6deca5
Author: Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>
Date:   Wed Mar 2 16:00:31 2022 +0900

    Cygwin: console, pty: Revamp the acquire/release_attach_mutex timing.

    - This patch revises the acquiring/releasing timing for attach_mutex
      to make the period in which it is being acquired shorter. Further,
      acquiring/releasing are added to where they are missing but needed.

-- 
Takashi Yano <takashi DOT yano AT nifty DOT ne DOT jp>

--Multipart=_Fri__18_Mar_2022_13_23_35_+0900_dijPPCXjUHVx7/Qg
Content-Type: application/octet-stream;
 name="cygwin-3_3-branch-merged.log"
Content-Disposition: attachment;
 filename="cygwin-3_3-branch-merged.log"
Content-Transfer-Encoding: base64

Y29tbWl0IDE5MGVlMzU2YTExNDI0MTQ1ZTU2NzgzYjEyMjFhZGU0OWQyMTZkM2UKQXV0aG9yOiBU
YWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5qcD4KRGF0ZTogICBGcmkgTWFyIDEx
IDE3OjI2OjMwIDIwMjIgKzA5MDAKCiAgICBDeWd3aW46IHBhdGg6IEFkZCBmYWxsYmFjayBmb3Ig
REZTIG1vdW50ZWQgZHJpdmUuCiAgICAKICAgIC0gSWYgVU5DIHBhdGggZm9yIERGUyBpcyBtb3Vu
dGVkIHRvIGEgZHJpdmUgd2l0aCBkcml2ZSBsZXR0ZXIsIHRoZQogICAgICBlcnJvciAiVG9vIG1h
bnkgbGV2ZWxzIG9mIHN5bWJvbGljIGxpbmtzIiBvY2N1cnMgd2hlbiBhY2Nlc3NpbmcKICAgICAg
dG8gdGhhdCBkcml2ZS4gVGhpcyBpcyBiZWNhdXNlIEdldERvc0RldmljZVcoKSByZXR1cm5zIHVu
ZXhwZWN0ZWQKICAgICAgc3RyaW5nIHN1Y2ggYXMgIlxEZXZpY2VcTXVwXERmc0NsaWVudFw7Wjow
MDAwMDAwMDAwMDNmYjg5XGRmc3NlcnZlcgogICAgICBcZGZzXGxpbmtuYW1lIiBmb3IgdGhlIG1v
dW50ZWQgVU5DIHBhdGggIlw/P1xVTkNcZmlsZXNlcnZlclxzaGFyZSIuCiAgICAgIFRoaXMgcGF0
Y2ggYWRkcyBhIHdvcmthcm91bmQgZm9yIHRoaXMgaXNzdWUuCiAgICAKICAgICAgQWRkcmVzc2Vz
OiBodHRwczovL2N5Z3dpbi5jb20vcGlwZXJtYWlsL2N5Z3dpbi8yMDIyLU1hcmNoLzI1MDk3OS5o
dG1sCgpjb21taXQgZDZlNzVmZTQ1YWNhYjZiM2Y4ZjQ2MWYyNDNhNGQwMGEzNWU5YWNhMgpBdXRo
b3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRlOiAgIFNhdCBN
YXIgMTIgMDY6MTk6NTMgMjAyMiArMDkwMAoKICAgIEN5Z3dpbjogZnN5bmM6IFJldHVybiBFSU5W
QUwgZm9yIHNwZWNpYWwgZmlsZXMuCiAgICAKICAgIC0gVW5saWtlIGxpbnV4LCBmc3luYygpIGNh
bGxzIEZsdXNoRmlsZUJ1ZmZlcnMoKSBldmVuIGZvciBzcGVjaWFsCiAgICAgIGZpbGVzLiBUaGlz
IGNhdXNlcyB0aGUgcHJvYmxlbSByZXBvcnRlZCBpbjoKICAgICAgICBodHRwczovL2N5Z3dpbi5j
b20vcGlwZXJtYWlsL2N5Z3dpbi8yMDIyLU1hcmNoLzI1MTAyMi5odG1sCiAgICAgIFRoaXMgcGF0
Y2ggZml4ZXMgdGhlIGlzc3VlLgoKY29tbWl0IDc5YjI1Mjc2N2M0YWE0ODFjMjZhMWQwMTNjNzYz
YzU1YTE5YTYzNjIKQXV0aG9yOiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5q
cD4KRGF0ZTogICBUaHUgTWFyIDEwIDIwOjIwOjAwIDIwMjIgKzA5MDAKCiAgICBDeWd3aW46IGNv
bnNvbGUsIHB0eTogRml4IHNlZ2ZhdWx0IGluIGNoaWxkX2luZm9fc3Bhd246OndvcmtlcigpLgog
ICAgCiAgICAtIEFmdGVyIHRoZSBjb21taXQgIkN5Z3dpbjogcHR5LCBjb25zb2xlOiBGaXggaGFu
ZGxlIGxlYWsgd2hpY2gKICAgICAgb2NjdXJzIG9uIGV4ZWMoKSBlcnJvci4iLCBzdGFydHh3aW4g
Y2Fubm90IHN0YXJ0IFggZHVlIHRvIHRoZQogICAgICBlcnJvciAiRmFpbGVkIHRvIGFjdGl2YXRl
IHZpcnR1YWwgY29yZSBrZXlib2FyZDogMiIuIFRoZSBwcm9ibGVtCiAgICAgIGlzIGFjY2VzcyB2
aW9sYXRpb24gaW4gdGhlIGNvZGUgcmV0cmlldmluZyB0aGUgcGdpZCBvZiB0aGUgY3R0eS4KICAg
ICAgVGhpcyBwYXRjaCBmaXhlcyB0aGUgaXNzdWUuCiAgICAKICAgICAgQWRkcmVzc2VzOiBodHRw
czovL2N5Z3dpbi5jb20vcGlwZXJtYWlsL2N5Z3dpbi8yMDIyLU1hcmNoLzI1MTAxMy5odG1sCgpj
b21taXQgNTYxNDg1MmJlZTkyMTIwZDkwZTJiNWMzMGRmNTcxMmY3ZDA3MTBjMQpBdXRob3I6IFRh
a2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRlOiAgIFNhdCBNYXIgNSAw
OTozOToyNiAyMDIyICswOTAwCgogICAgQ3lnd2luOiBwdHk6IEFkb3B0IHRoZSB2YXJpYWJsZSBu
YW1lIHRvIHRoZSBuYW1lIGdlbmVyYWxseSB1c2VkLgogICAgCiAgICAtIEdlbmVyYWxseSwgJ1xu
JyBpcyBjYWxsZWQgImxpbmUgZmVlZCIgKG5vdCAibmV3IGxpbmUiKSwgc28gdGhlCiAgICAgIHZh
cmlhYmxlIG5hbWUgcF9ubCBoYXMgYmVlbiBjaGFuZ2VkIHRvIHBfbGYuCgpjb21taXQgOTZkNWMy
YTU0NTVlOTA4YTY5Nzk5NzA0NTZjODE4MTMxYzZkMDE1MwpBdXRob3I6IFRha2FzaGkgWWFubyA8
dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRlOiAgIFNhdCBNYXIgNSAwODozOTowNSAyMDIy
ICswOTAwCgogICAgQ3lnd2luOiBwdHk6IEFkZCBzZXZlcmFsIGZ1cnRoZXIgY29tbWVudHMgdG8g
dGhlIHB0eSBjb2RlLgoKY29tbWl0IDdmMzAwYTVhNzE3Y2QxM2Q3NTYyZDZkMDA3NDIwYmMyMzlh
MDA4NDkKQXV0aG9yOiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5qcD4KRGF0
ZTogICBGcmkgTWFyIDQgMjM6NTc6MTIgMjAyMiArMDkwMAoKICAgIEN5Z3dpbjogcHR5OiBUYWtl
IGFjY291bnQgb2YgQ1IrTkwgbGluZSBmZWVkIGluIGlucHV0LgogICAgCiAgICAtIEN1cnJlbnRs
eSwgaW5kaXZpZHVhbCBDUiBvciBOTCBpcyB0cmVhdGVkIGFzIGxpbmUgZmVlZCBpbgogICAgICBh
Y2NlcHRfaW5wdXQoKSBhbmQgdHJhbnNmZXJfaW5wdXQoKS4gVGhpcyBwYXRjaCB0YWtlcyBhY2Nv
dW50CiAgICAgIG9mIENSK05MIGFzIHdlbGwuCgpjb21taXQgYzlkZWEyZjUxOTJjNzQxNmYzZDhm
MDIyYjcxZDAyYmQ1Y2QwMzc0YwpBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5p
ZnR5Lm5lLmpwPgpEYXRlOiAgIEZyaSBNYXIgNCAyMjowMjozNSAyMDIyICswOTAwCgogICAgQ3ln
d2luOiBwdHk6IEZpeCBhIHBvc3NpYmxlIHJhY2UgaXNzdWUgaW4gaW5pdGlhbGl6YXRpb24gb2Yg
cGNvbi4KICAgIAogICAgLSBDdXJyZW50bHksIHR0eTo6cGNvbl9zdGFydCBmbGFnIGlzIGNsZWFy
ZWQgYmVmb3JlIHRyYW5zZmVyX2lucHV0KCkKICAgICAgaW4gbWFzdGVyOjp3cml0ZSgpLCBob3dl
dmVyLCB0aGUgY29kZSBpbiBzZXR1cF9wc2V1ZG9jb25zb2xlKCkKICAgICAgd2FpdHMgZm9yIHRy
YW5zZmVyX2lucHV0KCkgdXNpbmcgdHR5OjpwY29uX3N0YXJ0LiBUaGlzIHBvc3NpYmx5CiAgICAg
IGNhdXNlcyB0aGUgcmFjZSBpc3N1ZS4gVGhlIHBhdGNoIGZpeGVzIHRoaXMgcG90ZW50aWFsIGlz
c3VlLgoKY29tbWl0IDc5MTUzYTExNGU3ZDBlMmI1MmRmMmQyYmU1ZmZjNzk3Mjc2NWY0ZmMKQXV0
aG9yOiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5qcD4KRGF0ZTogICBGcmkg
TWFyIDQgMjI6MDA6MjQgMjAyMiArMDkwMAoKICAgIEN5Z3dpbjogcHR5OiBVcGRhdGUgc29tZSBj
b21tZW50cyBpbiBwdHkgY29kZS4KCmNvbW1pdCBiZjQwMmU5ZDQ3NjU4NTgzNzU4ZTI3ODljZjk2
OWU3ZDhmNTljOTUxCkF1dGhvcjogVGFrYXNoaSBZYW5vIDx0YWthc2hpLnlhbm9AbmlmdHkubmUu
anA+CkRhdGU6ICAgRnJpIE1hciA0IDE4OjU0OjE4IDIwMjIgKzA5MDAKCiAgICBDeWd3aW46IHB0
eTogT21pdCB0cmFuc2Zlcl9pbnB1dCgpIGNhbGwgd2hlcmUgaXQgaXMgbm8gbG9uZ2VyIG5lZWRl
ZC4KICAgIAogICAgLSBUaGlzIHBhdGNoIHJlbW92ZXMgdGhlIG9sZCBjb2RlIHdoaWNoIGNhbGxz
IHRyYW5zZmVyX2lucHV0KCkgYnV0CiAgICAgIGlzIG5vIGxvbmdlciBuZWVkZWQuIFRoZXNlIGNv
ZGUgd2FzIG5lY2Vzc2FyeSBpbmRlZWQgaW4gdGhlIHBhc3QsCiAgICAgIGhvd2V2ZXIsIGFzIGEg
cmVzdWx0IG9mIHJlY2VudCBmcmVxdWVudCBjb2RlIGNoYW5nZXMsIGl0IGlzIG5vCiAgICAgIGxv
bmdlciBuZWVkZWQuCgpjb21taXQgOTQ5MGI5Yzc2Njg0MWI0ZDdmNzAwNzQ3NmJmNmRhOTBkZTJh
N2M5ZApBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRl
OiAgIEZyaSBNYXIgNCAxNDo0Mjo0NiAyMDIyICswOTAwCgogICAgQ3lnd2luOiBwdHk6IFJlYXJy
YW5nZSByZXNldF9zd2l0Y2hfdG9fbmF0X3BpcGUoKSBjYWxscy4KICAgIAogICAgLSBQcmV2aW91
c2x5LCByZXNldF9zd2l0Y2hfdG9fbmF0X3BpcGUoKSBpcyBjYWxsZWQgZnJvbSBtYW55IHBsYWNl
cwogICAgICBpbiBwdHkgY29kZS4gVGhpcyBwYXRjaCByZW9yZ2FuaXplcyB0aGF0LiBXaXRoIHRo
aXMgcGF0Y2gsIGl0IGlzCiAgICAgIGNhbGxlZCBvbmx5IGZyb20gYmdfY2hlY2soKSBhbmQgc2V0
cGdpZF9hdXgoKS4gVGhlIGNhbGxzIHdoaWNoCiAgICAgIGRvZXMgbm90IGhhdmUgZW5vdWdoIHJl
YXNvbiBoYXZlIGJlZW4gb21pdHRlZC4KCmNvbW1pdCBkYzgxNDM4MjZiNWU1YjY0MTgyNGUzYjYy
ZjMwNDI3ZjI5ZTIyM2UxCkF1dGhvcjogVGFrYXNoaSBZYW5vIDx0YWthc2hpLnlhbm9AbmlmdHku
bmUuanA+CkRhdGU6ICAgRnJpIE1hciA0IDE2OjA1OjM1IDIwMjIgKzA5MDAKCiAgICBDeWd3aW46
IHB0eTogVHJlYXQgYm90aCBDUiBhbmQgTkwgYXMgbGluZSBmZWVkIGluIHRyYW5zZmVyX2lucHVw
KCkuCiAgICAKICAgIC0gVG8gbWFrZSByZWFkKCkgd29yayBwcm9wZXJseSBpbiBjYW5vbmljYWwg
bW9kZSwgd3JpdGluZyB0byB0aGUgcHR5CiAgICAgIHBpcGUgc2hvdWxkIGJlIGRvbmUgbGluZSBi
eSBsaW5lLiBIb3dldmVyLCBvbmx5IENSIHdhcyB0cmVhdGVkIGFzCiAgICAgIGxpbmUgc2VwYXJh
dG9yIHByZXZpb3VzbHkgaW4gdHJhbnNmZXJfaW5wdXQoKS4gVGhpcyBwYXRjaCBmaXhlcwogICAg
ICB0aGUgaXNzdWUuCgpjb21taXQgOTM4NWFkYmQzZDhkMWU1MThjNmIyNjEyMjE0NDhiNGNhZTE4
NDBmNwpBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRl
OiAgIFRodSBNYXIgMyAxMTo0MzowNyAyMDIyICswOTAwCgogICAgQ3lnd2luOiBwdHk6IFN0b3Ag
dG8gdXNlIFBJRF9ORVdfUEcgZmxhZyBhcyBhIG1hcmtlciBmb3IgR0RCLgogICAgCiAgICAtIFBy
ZXZpb3VzbHksIHRoZSBQSURfTkVXX1BHIGZsYWcgd2FzIGFsc28gdXNlZCBhcyBhIG1hcmtlciBm
b3IgR0RCCiAgICAgIHdpdGggbm9uLWN5Z3dpbiBpbmZlcmlvciwgdW5saWtlIGl0cyBvcmlnaW5h
bCBtZWFuaW5nLiBXaXRoIHRoaXMKICAgICAgcGF0Y2gsIHRoZSBjb25kaXRpb24gZXhlY19kd1By
b2Nlc3NJZCA9PSBkd1Byb2Nlc3NJZCBpcyB1c2VkIGFzIGEKICAgICAgbWFya2VyIGZvciB0aGF0
IGluc3RlYWQuCgpjb21taXQgYjUyOTQzMzU4YTM2ZDFkZDdkYmYyMDlmYzRiZjA1NjAxNmU3ODA2
ZApBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRlOiAg
IFRodSBNYXIgMyAxMDo1NToxMiAyMDIyICswOTAwCgogICAgQ3lnd2luOiBwdHk6IFNpbXBsaWZ5
IHRoZSBzZXR1cCBjb2RlIGZvciBHREIgYSBiaXQuCiAgICAKICAgIC0gVGhpcyBwYXRjaCBvbWl0
cyB0aGUgdW5uZWNlc3NhcnkgY29kZSBwYXRoIGZvciBzZXR1cCBmb3IgR0RCLgoKY29tbWl0IGM2
OWYyYWU4YjEzN2FlMTNmZGExYThiZjQ0YWRhMDdkZjQxOTNlODkKQXV0aG9yOiBUYWthc2hpIFlh
bm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5qcD4KRGF0ZTogICBUaHUgTWFyIDMgMTA6Mzg6MDUg
MjAyMiArMDkwMAoKICAgIEN5Z3dpbjogcHR5OiBSZW5hbWUgbmF0X3BpcGVfb3duZXJfYWxpdmUo
KSB0byBwcm9jZXNzX2FsaXZlKCkuCiAgICAKICAgIC0gVGhlIGZ1bmN0aW9uIG5hdF9waXBlX293
bmVyX2FsaXZlKCkgaXMgdXNlZCBldmVuIGZvciB0aGUgcHJvY2VzcwogICAgICB3aGljaCBpcyBu
b3QgYSBuYXQgcGlwZSBvd25lciwgc28sIGl0IGlzIHJlbmFtZWQgdG8gcHJvY2Vzc19hbGl2ZSgp
LgoKY29tbWl0IDI5NzE0Y2VjZDZlNDk0MTQ0YmVkNjQ3ZDYzOWIyZDNmZjc3MTlkZTgKQXV0aG9y
OiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5qcD4KRGF0ZTogICBUaHUgTWFy
IDMgMDQ6MDY6MzggMjAyMiArMDkwMAoKICAgIEN5Z3dpbjogcHR5OiBBZGQgc3RpbGwgbWlzc2lu
ZyBhY3F1aXJlL3JlbGVhc2VfYXR0YWNoX211dGV4LgogICAgCiAgICAtIHRyYW5zZmVyX2lucHV0
KCkgZnVuY3Rpb24gdXNlcyBjb25zb2xlIGFwaSwgc28gaXQgc2hvdWxkIGJlIGd1YXJkZWQKICAg
ICAgYnkgYXR0YWNoX211dGV4LiBIb3dldmVyLCBpbiBtb3N0IGNhc2VzLCBpdCBpcyBtaXNzaW5n
LiBUaGlzIHBhdGNoCiAgICAgIGZpeGVzIHRoZSBpc3N1ZS4KCmNvbW1pdCAxOGE5NmFjNGEyMjVj
YmUxNTIxZWYzZWQwMDkwMjUxYTAwODg1ZDk3CkF1dGhvcjogVGFrYXNoaSBZYW5vIDx0YWthc2hp
Lnlhbm9AbmlmdHkubmUuanA+CkRhdGU6ICAgV2VkIE1hciAyIDIxOjM1OjQwIDIwMjIgKzA5MDAK
CiAgICBDeWd3aW46IHB0eTogQ29tbXVuYWxpemUgdGhlIGNvZGUgZm9yIHRlbXBvcmFyeSBhdHRh
Y2ggdG8gY29uc29sZS4KICAgIAogICAgLSBUaGlzIHBhdGNoIGNvbW11bmFsaXplcyB0aGUgY29k
ZSBmb3IgYXR0YWNoaW5nIGFub3RoZXIgY29uc29sZQogICAgICB0ZW1wb3JhcmlseSBhbmQgcmVz
dW1pbmcgdG8gdGhlIG9yaWdpbmFsIGF0dGFjaCBzdGF0ZSwgYmVjYXVzZQogICAgICB0aGVyZSB3
ZXJlIGEgcGx1cmFsaXR5IG9mIHNpbWlsYXIgY29kZXMgdGhyb3VnaG91dC4KCmNvbW1pdCBjZWYz
OGY0MWYyY2UwNTEwODU1YmI0Yjg3MmM3ZjY1MTRmNmRlY2E1CkF1dGhvcjogVGFrYXNoaSBZYW5v
IDx0YWthc2hpLnlhbm9AbmlmdHkubmUuanA+CkRhdGU6ICAgV2VkIE1hciAyIDE2OjAwOjMxIDIw
MjIgKzA5MDAKCiAgICBDeWd3aW46IGNvbnNvbGUsIHB0eTogUmV2YW1wIHRoZSBhY3F1aXJlL3Jl
bGVhc2VfYXR0YWNoX211dGV4IHRpbWluZy4KICAgIAogICAgLSBUaGlzIHBhdGNoIHJldmlzZXMg
dGhlIGFjcXVpcmluZy9yZWxlYXNpbmcgdGltaW5nIGZvciBhdHRhY2hfbXV0ZXgKICAgICAgdG8g
bWFrZSB0aGUgcGVyaW9kIGluIHdoaWNoIGl0IGlzIGJlaW5nIGFjcXVpcmVkIHNob3J0ZXIuIEZ1
cnRoZXIsCiAgICAgIGFjcXVpcmluZy9yZWxlYXNpbmcgYXJlIGFkZGVkIHRvIHdoZXJlIHRoZXkg
YXJlIG1pc3NpbmcgYnV0IG5lZWRlZC4KCmNvbW1pdCBkODg3NjgxODdhNzI2NjJkMTY5MmVlMjc5
ZTdkZWEzZTk0OGQyNTZlCkF1dGhvcjogVGFrYXNoaSBZYW5vIDx0YWthc2hpLnlhbm9AbmlmdHku
bmUuanA+CkRhdGU6ICAgV2VkIE1hciAyIDExOjA4OjI3IDIwMjIgKzA5MDAKCiAgICBDeWd3aW46
IGNvbnNvbGU6IEZpeCBhIGJ1ZyBmcm9tIGNvbXBhcmlzb24gYmV0d2VlbiBpbnQgYW5kIERXT1JE
LgoKY29tbWl0IDZlODcyYWRiOWYxNTNiYTA1MDRjODk4YTkxYWM4ZGNmMGVkN2U2OGEKQXV0aG9y
OiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5qcD4KRGF0ZTogICBXZWQgTWFy
IDIgMDk6NTU6NTIgMjAyMiArMDkwMAoKICAgIEN5Z3dpbjogY29uc29sZTogUHJldmVudCBzcGVj
aWFsIGtleXMgcHJvY2Vzc2luZyBmcm9tIGRyb3AuCiAgICAKICAgIC0gVGhlcmUgd2FzIGEgcG90
ZW50aWFsIHJpc2sgdG8gZHJvcCBzcGVjaWFsIGtleSBwcm9jZXNzaW5nIHdoZW4KICAgICAgcHJv
Y2Vzc19pbnB1dF9tZXNzc2FnZSgpIGlzIGNhbGxlZCBpbnRlcm1pdHRlbnRseS4gVGhpcyBwYXRj
aAogICAgICBmaXhlcyB0aGUgaXNzdWUuCgpjb21taXQgZDM1M2M3YTFhZTA1N2YwODEzZWNkYWYw
YTM0N2EzZmJmZDEyMWZjMwpBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5
Lm5lLmpwPgpEYXRlOiAgIFdlZCBNYXIgMiAwODozNTowOSAyMDIyICswOTAwCgogICAgQ3lnd2lu
OiBjb25zb2xlOiBTdG9wIHRvIGNyZWF0ZSBzdHJ1Y3QgaW5zdGFuY2Ugd2hpY2ggaXMgbm90IG5l
ZWRlZC4KICAgIAogICAgLSBJbiBmaGFuZGxlcl9jb25zb2xlOjpjb25zX21hc3Rlcl90aHJlYWQo
KSwgYSBzdHJ1Y3Qgd2hpY2ggaGFzCiAgICAgIG9ubHkgYSBzdGF0aWMgZnVuY3Rpb24gaXMgdXNl
ZC4gSW4gdGhpcyBjYXNlLCBzdHJ1Y3QgaW5zdGFuY2UKICAgICAgaXMgbm90IG5lY2Vzc2FyeS4g
U28gd2l0aCB0aGlzIHBhdGNoLCB0aGUgc3RhdGljIGZ1bmN0aW9uIGlzCiAgICAgIGludm9rZWQg
d2l0aG91dCBjcmVhdGluZyBpbnN0YW5jZS4KCmNvbW1pdCAzOTU5MmZkMDA1ZGJlOTYzODgyM2Qy
NTNiNmUwMGM3NDcwMmZmMzRhCkF1dGhvcjogVGFrYXNoaSBZYW5vIDx0YWthc2hpLnlhbm9Abmlm
dHkubmUuanA+CkRhdGU6ICAgVHVlIE1hciAxIDIyOjA5OjAxIDIwMjIgKzA5MDAKCiAgICBDeWd3
aW46IHB0eTogUmVuYW1lIHNvbWUgZnVuY3Rpb25zL3ZhcmlhYmxlcyB3aXRoIHRoZSBuYW1lICpw
Y29uKi4KICAgIAogICAgLSBXaXRoIHRoaXMgcGF0Y2gsIHNvbWUgcHR5IGZ1bmN0aW9ucy92YXJp
YWJsZXMgaGF2ZSBiZWVuIHJlbmFtZWQKICAgICAgc28gdGhhdCB0aGUgbmFtZSAqcGNvbiogaXMg
bm90IHVzZWQgZm9yIHRob3NlIHRoYXQgYXJlIGNhbGxlZAogICAgICBldmVuIHdoZW4gdGhlIHBz
ZXVkbyBjb25zb2xlIGlzIG5vdCBhY3RpdmUuCgpjb21taXQgYTZiMmM3MDU1Mjg2ZmFlZGUwZDg2
MzU2YjE1ZWUyNDIyMmZhMmQ4MgpBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5p
ZnR5Lm5lLmpwPgpEYXRlOiAgIFR1ZSBNYXIgMSAxODowNDozNSAyMDIyICswOTAwCgogICAgQ3ln
d2luOiBwdHk6IFJlb3JnYW5pemUgdGhlIGNvZGUgcGF0aCBvZiBzZXR0aW5nIHVwIGFuZCBjbG9z
aW5nIHBjb24uCiAgICAKICAgIC0gVGhpcyBwYXRjaCByZW9yZ2FuaXplcyB0aGUgY29kZSBwYXRo
IG9mIHNldHRpbmctdXAgYW5kIGNsZWFuaW5nLXVwCiAgICAgIG9mIHRoZSBwc2V1ZG8gY29uc29s
ZSB0byBpbXByb3ZlIHJlYWRhYmlsaXR5IGFuZCBtYWludGFpbmFiaWxpdHkKICAgICAgb2YgcHR5
IGNvZGUuCgpjb21taXQgYTQ2OTdhMDkyODNmY2Y1M2U0ZTkwMTQ0ZmI5MzNiODkwMjg1ZmYxZApB
dXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRlOiAgIFR1
ZSBNYXIgMSAxMTozNDoxNiAyMDIyICswOTAwCgogICAgQ3lnd2luOiBwdHk6IEF2b2lkIGN1dHRp
bmcgdGhlIGJyYW5jaCB0aGUgcHR5IG1hc3RlciBpcyBzaXR0aW5nIG9uLgogICAgCiAgICAtIFdo
ZW4gQ3RybC1DIHRlcm1pbmF0ZXMgYSBub24tY3lnd2luIHByb2Nlc3Mgb24gYSBwc2V1ZG8gY29u
c29sZSwKICAgICAgcHR5IG1hc3RlciBhdHRhY2hlcyB0byB0aGUgcHNldWRvIGNvbnNvbGUgZmly
c3QsIGFuZCBzZW5kCiAgICAgIENUUkxfQ19FVkVOVC4gSWYgdGhlIG5vbi1jeWd3aW4gcHJvY2Vz
cyBjbG9zZXMgdGhlIHBzZXVkbyBjb25zb2xlCiAgICAgIGJlZm9yZSB0aGUgcHR5IG1hc3RlciBj
YWxscyBGcmVlQ29uc29sZSgpLCB0aGUgcHR5IG1hc3RlciBwcm9jZXNzCiAgICAgIHdpbGwgY3Jh
c2guIFdpdGggdGhpcyBwYXRjaCwgcHR5IG1hc3RlciBwcm9jZXNzIHRha2VzIG92ZXIgdGhlCiAg
ICAgIG93bmVyc2hpcCBvZiB0aGUgcHNldWRvIGNvbnNvbGUsIGFuZCBjbG9zZXMgaXQgYnkgbXlz
ZWxmLgoKY29tbWl0IDE2MmU0MDkzOGRkMzVjYWI2YzMwZTM4NjJiYzJjYWU5YzRkZWIwZGUKQXV0
aG9yOiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5qcD4KRGF0ZTogICBNb24g
RmViIDI4IDIwOjI1OjA5IDIwMjIgKzA5MDAKCiAgICBDeWd3aW46IHB0eTogSXNvbGF0ZSBDVFJM
X0NfRVZFTlRzIGJldHdlZW4gcHR5cy4KICAgIAogICAgLSBXaXRoIHRoaXMgcGF0Y2gsIHVuaXF1
ZSBpbnZpc2libGUgY29uc29sZXMgYXJlIGNyZWF0ZWQgZm9yIGVhY2ggcHR5CiAgICAgIHRvIGlz
b2xhdGUgQ1RSTF9DX0VWRU5UcyBiZXR3ZWVuIHB0eXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGJ5IEN0
cmwtQwogICAgICBoYW5kbGluZyBpbiBmaGFuZGxlcl90ZXJtaW9zOjpwcm9jZXNzX3NpZ3MoKSBm
b3Igbm9uLWN5Z3dpbiBhcHBzCiAgICAgIHN0YXJ0ZWQgaW4gcHR5IGlmIHRoZSBwc2V1ZG8gY29u
c29sZSBpcyBkaXNhYmxlZC4KCmNvbW1pdCBmNDg4NzAxNDhjN2ViY2FmODE2M2IwOGEwNDBkMTVl
ZjA0OGY0ZTk0CkF1dGhvcjogVGFrYXNoaSBZYW5vIDx0YWthc2hpLnlhbm9AbmlmdHkubmUuanA+
CkRhdGU6ICAgTW9uIEZlYiAyOCAyMDowMjowMSAyMDIyICswOTAwCgogICAgQ3lnd2luOiBjb25z
b2xlOiBJbXByb3ZlIHRoZSBjb2RlIHRvIGF2b2lkIHR5cGVhaGVhZCBrZXkgc3dhcHBpbmcuCiAg
ICAKICAgIC0gVGhlIGNvbW1pdCAiQ3lnd2luOiBjb25zb2xlOiBQcmV2ZW50IHRoZSBvcmRlciBv
ZiB0eXBlYWhlYWQgaW5wdXQKICAgICAgZnJvbSBzd2FwcGVkLiIgZGlkIG5vdCBmdWxseSByZXNv
bHZlIHRoZSBpc3N1ZS4gSWYga2V5cyBhcmUgdHlwZWQKICAgICAgZHVyaW5nIGlucHV0IGJ1ZmZl
ciBmaXgsIHRoZSBvcmRlciBvZiBrZXkgZXZlbnQgbWF5IGJlIHN3YXBwZWQuCiAgICAgIFRoaXMg
cGF0Y2ggZml4ZXMgdGhlIGlzc3VlIGFnYWluLgoKY29tbWl0IDM2MmJmNjliZDQyNzQyYmFlN2Jk
OGJmMWMwYTM3YzlmZmFlNzg1MDAKQXV0aG9yOiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0Bu
aWZ0eS5uZS5qcD4KRGF0ZTogICBTYXQgRmViIDI2IDE1OjEzOjEzIDIwMjIgKzA5MDAKCiAgICBD
eWd3aW46IHBpbmZvOiBGaXggZXhpdCBjb2RlIGZvciBub24tY3lnd2luIGFwcHMgd2hpY2ggcmVh
ZHMgY29uc29sZS4KICAgIAogICAgLSBUaGUgcmVjZW50IGNvbW1pdCAiQ3lnd2luOiBwaW5mbzog
Rml4IGV4aXQgY29kZSB3aGVuIG5vbi1jeWd3aW4gYXBwCiAgICAgIGV4aXRzIGJ5IEN0cmwtQy4i
IGRpZCBub3QgZml4IGVub3VnaCB0aGUgaXNzdWUuIElmIGEgbm9uLWN5Z3dpbiBhcHAKICAgICAg
aXMgcmVhZGluZyB0aGUgY29uc29sZSwgaXQgd2lsbCBub3QgcmV0dXJuIFNUQVRVU19DT05UUk9M
X0NfRVhJVAogICAgICBldmVuIGlmIGl0IGlzIHRlcm1pbmF0ZWQgYnkgQ3RybC1DLiBBcyBhIHJl
c3VsdCwgdGhlIHByZXZpb3VzIHBhdGNoCiAgICAgIGRvZXMgbm90IHRha2UgZWZmZWN0LgogICAg
ICBUaGlzIHBhdGNoIHNvbHZlcyB0aGlzIGlzc3VlIGJ5IHNldHRpbmcgc2lnRXhlY2VkIHRvIFNJ
R0lOVCBpbgogICAgICBjdHJsX2NfaGFuZGxlcigpLiBJbiBhZGRpdGlvbiwgc2lnRXhlY2VkIHdp
bGwgYmUgY2xlYXJlZCBpZiB0aGUgYXBwCiAgICAgIGRvZXMgbm90IHRlcm1pbmF0ZWQgd2l0aGlu
IHByZWRldGVybWluZWQgdGltZSBwZXJpb2QuIFRoZSByZWFzb24gaXMKICAgICAgdGhhdCB0aGUg
YXBwIGRvZXMgbm90IHNlZW0gdG8gYmUgdGVybWluYXRlZCBieSB0aGUgc2lnbmFsIHNpZ0V4ZWNl
ZC4KCmNvbW1pdCA2ZGM0ZGM4MzU4MmFmODdjNGQ3MmJhMDY1MzNhNzVmZjg0OWVkYjViCkF1dGhv
cjogVGFrYXNoaSBZYW5vIDx0YWthc2hpLnlhbm9AbmlmdHkubmUuanA+CkRhdGU6ICAgTW9uIEZl
YiAyOCAwNzoyNDo0NSAyMDIyICswOTAwCgogICAgQ3lnd2luOiB0ZXJtaW9zOiBFbnN1cmUgZGV0
ZWN0aW9uIG9mIEdEQiBpbmZlcmlvciBpbiBwcm9jZXNzX3NpZ3MoKS4KICAgIAogICAgLSBJbiBz
b21lIHNpdHVhdGlvbnMsIHNvbWUgY3lnd2luIHByb2Nlc3NlcyBtaWdodCB3cm9uZ2x5IGlkZW50
aWZpZWQKICAgICAgYXMgR0RCIGluZmVyaW9yLiBUaGlzIHBhdGNoIGVuc3VyZXMgdGhlIGRldGVj
dGlvbiBvZiBHREIgaW5mZXJpb3IuCgpjb21taXQgNDY4MjgyNTdkYzhhMTk5YmJiOWI4MWNlMGZk
ZTA2ZDhiZWY4MjM0ZQpBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5l
LmpwPgpEYXRlOiAgIFN1biBGZWIgMjcgMjA6NDA6MjQgMjAyMiArMDkwMAoKICAgIEN5Z3dpbjog
dGVybWlvczogQWRkIGNvbW1lbnRzIHRvIHRoZSBjb2RlIHJlZmFjdG9yZWQgcmVjZW50bHkuCiAg
ICAKICAgIC0gVGhpcyBwYXRjaCBhZGRzIHNvbWUgY29tbWVudHMgdG8gdGhlIHNvdXJjZSBjb2Rl
IHdob3NlIGludGVudCBtYXkKICAgICAgbm90IGJlIGNsZWFyIGVub3VnaCBmcm9tIHRoZSBjb2Rl
IHdoaWNoIGlzIHJlZmFjdG9yZWQgcmVjZW50bHkuCgpjb21taXQgYWY1MGJjYjg2ZjI0NDcxMTQy
YzUxYzU1YTk4ODQ5NjhhYmM4NWY3ZgpBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5v
QG5pZnR5Lm5lLmpwPgpEYXRlOiAgIFN1biBGZWIgMjcgMTI6MzM6MDggMjAyMiArMDkwMAoKICAg
IEN5Z3dpbjogY29uc29sZTogQ29ycmVjdCB0aGUgcGFzdCBmaXggZm9yIGFwcHMgd2hpY2ggb3Bl
biBwdHkuCiAgICAKICAgIC0gVGhlIGNvbW1pdCAiQ3lnd2luOiBjb25zb2xlOiBGaXggaXNzdWVz
IG9mIGFwcHMgd2hpY2ggb3BlbiBwdHkuIgogICAgICBkaWQgbm90IGZpeCB0aGUgc2Vjb25kIHBy
b2JsZW0gY29ycmVjdGx5LiBUaGF0IGNvbW1pdCBsb29rZWQgdG8KICAgICAgZml4IHRoZSBpc3N1
ZSwgYnV0IHRoZSBhY3R1YWwgcHJvYmxlbSB3YXMgdGhhdCBjdHJsX2NfaGFuZGxlcigpCiAgICAg
IHNob3VsZCBiZSByZXJlZ2lzdGVyZWQgKkFGVEVSKiBGcmVlQ29uc29sZSgpL0F0dGFjaENvbnNv
bGUoKS4KICAgICAgVGhpcyBwYXRjaCBjb3JyZWN0IHRoYXQuCgpjb21taXQgZDgwZWNkZDVjMmI5
MjBiYjA1ODU2YjIyMTM5N2VjZGMyMTFhNGJiMgpBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNo
aS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRlOiAgIFNhdCBGZWIgMjYgMjM6MzE6NTkgMjAyMiArMDkw
MAoKICAgIEN5Z3dpbjogY29uc29sZTogUmV2ZXJ0IGV4cGVyaW1lbnRhbCBjb2RlIG1peGVkIGFj
Y2lkZW50YWxseS4KICAgIAogICAgLSBUaGUgY29tbWl0ICJDeWd3aW46IGNvbnNvbGU6IFJlc3Rv
cmUgQ1RSTF9CUkVBS19FVkVOVCBoYW5kbGluZy4iCiAgICAgIHdhcyBhY2NpZGVudGFsbHkgbWl4
ZWQgd2l0aCBleHBlcmltZW50YWwgY29kZSBpbiBleGNlcHRpb25zLmNjLgogICAgICBEdWUgdG8g
dGhpcywgbm9uLWN5Z3dpbiBhcHAgcmVjZWl2ZXMgQ1RSTF9DX0VWRU5UIHR3aWNlIGluIHRoZQog
ICAgICBmb2xsb3dpbmcgc2NlbmFyaW8uCiAgICAgICAxKSBSdW4gJ3NsZWVwIDEwIHwgPG5vbi1j
eWd3aW4gYXBwPicKICAgICAgIDIpIEhpdCBDdHJsLUMuCiAgICAgICAzKSBUaGUgbm9uLWN5Z3dp
biBhcHAgcmVjZWl2ZXMgQ1RSTF9DX0VWRU5UIHR3aWNlLgogICAgICBUaGlzIHBhdGNoIHJldmVy
dHMgdGhlIGNvZGUgd2l0aCB0aGUgcHJvYmxlbS4KCmNvbW1pdCA0ZDA3MjFhNjZmOTQ0MjdmYTE0
NjAxZDBjNThhMDc2MjcwOWI1YmYyCkF1dGhvcjogVGFrYXNoaSBZYW5vIDx0YWthc2hpLnlhbm9A
bmlmdHkubmUuanA+CkRhdGU6ICAgRnJpIEZlYiAyNSAxNzoxMDowMyAyMDIyICswOTAwCgogICAg
Q3lnd2luOiBjb25zb2xlOiBQcmV2ZW50IHRoZSBvcmRlciBvZiB0eXBlYWhlYWQgaW5wdXQgZnJv
bSBzd2FwcGVkLgogICAgCiAgICAtIElmIGEgbG90IG9mIGtleXMgYXJlIHR5cGVkIHZlcnkgcXVp
Y2tseSBpbiB0aGUgYXBwIHdoaWNoIGRvZXMKICAgICAgbm90IHJlYWQgY29uc29sZSwgdGhlIG9y
ZGVyIG9mIGlucHV0IGtleXMgaW4gY29uc29sZSBpbnB1dCBidWZmZXIKICAgICAgb2NjYXNpb25h
bGx5IHN3YXBwZWQuIEFsdGhvdWdoIHRoaXMgZXh0cmVtZWx5IHJhcmVseSBoYXBwZW5zLAogICAg
ICBpcyBvYnZpb3VzbHkgYSBidWcgb2YgY29uc19tYXN0ZXJfdGhyZWFkLiBUaGlzIHBhdGNoIGZp
eGVzIHRoZQogICAgICBpc3N1ZS4KCmNvbW1pdCA3MmFjMmE3YmEzMTgzYmQ2OGQzNmYyNzNjMGQz
ZjVjODE1ZGJlMmUxCkF1dGhvcjogVGFrYXNoaSBZYW5vIDx0YWthc2hpLnlhbm9AbmlmdHkubmUu
anA+CkRhdGU6ICAgU2F0IEZlYiAyNiAwNDoxOTowMyAyMDIyICswOTAwCgogICAgQ3lnd2luOiBw
dHk6IFN0b3AgdG8gc2VuZCBDVFJMX0NfRVZFTlQgaWYgcGNvbiBhY3RpdmF0ZWQuCiAgICAKICAg
IC0gVGhlIGNvbW1pdCAiQ3lnd2luOiBjb25zb2xlOiBSZWRlc2lnbiBoYW5kbGluZyBvZiBzcGVj
aWFsIGtleXMuIgogICAgICByZW1vdmVzIHNwZWNpYWwgdHJlYXRtZW50IGZvciBwdHkgaW4gd2l0
aCBwc2V1ZG8gY29uc29sZSBhY3RpdmF0ZWQsCiAgICAgIGhvd2V2ZXIsIGl0IGlzIG5lY2Vzc2Fy
eSBvbiBzZWNvbmQgdGhvdWdodC4gVGhpcyBpcyBiZWNhdXNlIHNlbmRpbmcKICAgICAgQ1RSTF9D
X0VWRU5UIHRvIG5vbi1jeWd3aW4gYXBwcyB3aWxsIGJlIGRvbmUgaW4gcHNldWRvIGNvbnNvbGUs
CiAgICAgIHRoZXJlZm9yZSwgc2VuZGluZyBpdCBpbiBmaGFuZGxlcl9wdHlfbWFzdGVyOjp3cml0
ZSgpIGR1cGxpY2F0ZXMKICAgICAgdGhhdCBldmVudCBmb3Igbm9uLWN5Z3dpbiBhcHBzLgoKY29t
bWl0IGU0MDA3YzMxNmI0ZWNmNjNhOGEyODIwMTAxNDllOThkOTIwZjRmZGYKQXV0aG9yOiBUYWth
c2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5qcD4KRGF0ZTogICBGcmkgRmViIDI1IDE2
OjIzOjU4IDIwMjIgKzA5MDAKCiAgICBDeWd3aW46IGNvbnNvbGU6IEZpeCBpc3N1ZXMgb2YgYXBw
cyB3aGljaCBvcGVuIHB0eS4KICAgIAogICAgLSBBZnRlciBzb21lIHJlY2VudCBjaGFuZ2VzIGZv
ciBzcGVjaWFsIGtleXMgaGFuZGxpbmcgYnJlYWsgdGhlCiAgICAgIGFwcHMgd2hpY2ggb3BlbiBw
dHkgKHN1Y2ggYXMgc2NyaXB0IGNvbW1hbmQpLiBJZiB0aGUgYXBwIHdoaWNoCiAgICAgIG9wZW5z
IHB0eSBpcyBleGVjdXRlZCBpbiBjb25zb2xlLCB0aGUgZm9sbG93aW5nIGlzc3VlcyBvY2N1ci4K
ICAgICAgICAxKSBJZiB0aGUgc2NyaXB0IGNvbW1hbmQgd2FzIHN0YXJ0ZWQgZnJvbSBub24tY3ln
d2luIHNoZWxsCiAgICAgICAgICAgKHN1Y2ggYXMgY21kLmV4ZSksIGFub3RoZXIgY3lnd2luIGFw
cCBzdGFydGVkIGluIHB0eSBzbGF2ZQogICAgICAgICAgIGNhbm5vdCByZWNlaXZlIEN0cmwtQy4K
ICAgICAgICAyKSBJZiBub24tY3lnd2luIGFwcCBpcyBleGVjdXRlZCBpbiBwdHkgc2xhdmUsIHRo
ZSBhcHAgd2hpY2gKICAgICAgICAgICBvcGVuZWQgdGhlIHB0eSAoZS5nLiBzY3JpcHQgY29tbWFu
ZCkgY3Jhc2hlcyBieSBDdHJsLUMuCiAgICAgIFRoaXMgcGF0Y2ggZml4ZXMgdGhlc2UgaXNzdWVz
LgoKY29tbWl0IGIyZjJmMzhjNTNhOGFkNWFmNTQwYTQ5OGZlNGY3NmVhYWVmZDRmNjYKQXV0aG9y
OiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0BuaWZ0eS5uZS5qcD4KRGF0ZTogICBUaHUgRmVi
IDI0IDIxOjA0OjQ5IDIwMjIgKzA5MDAKCiAgICBDeWd3aW46IHBpbmZvOiBGaXggZXhpdCBjb2Rl
IHdoZW4gbm9uLWN5Z3dpbiBhcHAgZXhpdHMgYnkgQ3RybC1DLgogICAgCiAgICAtIFByZXZpb3Vz
bHksIGlmIG5vbi1jeWd3aW4gYXBwIGV4aXRzIGJ5IEN0cmwtQywgZXhpdCBjb2RlIHdhcwogICAg
ICAweDAwMDA3ZjAwLiBXaXRoIHRoaXMgcGF0Y2gsIHRoZSBleGl0IGNvZGUgd2lsbCBiZSAweDAw
MDAwMDAyLAogICAgICB3aGljaCBtZWFucyBwcm9jZXNzIGV4aXRlZCBieSBTSUdJTlQuCgpjb21t
aXQgMjhmYTQ5M2JhZWFmY2UyZmMyNzIwNjI2NDZkNjliMDQ3MGI0NDY2YgpBdXRob3I6IFRha2Fz
aGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRlOiAgIFRodSBGZWIgMjQgMTc6
Mjg6MzIgMjAyMiArMDkwMAoKICAgIEN5Z3dpbjogY29uc29sZTogUmVzdG9yZSBDVFJMX0JSRUFL
X0VWRU5UIGhhbmRsaW5nLgogICAgCiAgICAtIFRoZSByZWNlbnQgY2hhbmdlIGJ5IHRoZSBjb21t
aXQgIkN5Z3dpbjogY29uc29sZTogUmVkZXNpZ24gaGFuZGxpbmcKICAgICAgb2Ygc3BlY2lhbCBr
ZXlzLiIgYnJlYWtzIHRoZSBoYW5kbGluZyBvZiBDVFJMX0JSRUFLX0VWRU5ULiBUaGUgbG9naW4K
ICAgICAgc2hlbGwgaW4gY29uc29sZSBleGl0cyBvbiBDdHJsLUJyZWFrIGtleS4gVGhpcyBwYXRj
aCBmaXhlcyB0aGUgaXNzdWUuCgpjb21taXQgOTI2YzAxOWRjMzE0Mzc0ZmI5NmEzNDExYmQxNzU4
Mjg1NGI3MmFlNApBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpw
PgpEYXRlOiAgIFRodSBGZWIgMjQgMDA6NTc6MzcgMjAyMiArMDkwMAoKICAgIEN5Z3dpbjogcHR5
LCBjb25zb2xlOiBBZGQgYSB3b3JrYXJvdW5kIGZvciBHREIgU0lHSU5UIGhhbmRsaW5nLgogICAg
CiAgICAtIFRoZSBpbmZlcmlvciBvZiB0aGUgR0RCIGNhbm5vdCBiZSBjb250aW51ZWQgYWZ0ZXIg
U0lHSU5UIGV2ZW4KICAgICAgdGhvdWdoIG5vcGFzcyBvcHRpb24gaXMgc2V0LiBUaGlzIHNlZW1z
IGJlY2F1c2UgY3lnd2luIEdEQiBkb2VzCiAgICAgIG5vdCBzdXBwb3J0IGhvb2tpbmcgY3lnd2lu
IHNpZ25hbC4gVGhlcmVmb3JlLCBhIHdvcmthcm91bmQgZm9yCiAgICAgIEdEQiBpcyBhZGRlZC4g
V2l0aCB0aGlzIHBhdGNoLCBvbmx5IENUUkxfQ19FVkVOVCBpcyBzZW50IHRvIHRoZQogICAgICBH
REIgaW5mZXJpb3IgYnkgQ3RybC1DIGFuZCBzZW5kaW5nIFNJR0lOVCBpcyBvbWl0dGVkLiBOb3Rl
IHRoYXQKICAgICAgImhhbmRsZSBTSUdJTlQgKG5vKXBhc3MiIGNvbW1hbmQgZG9lcyBub3QgdGFr
ZSBlZmZlY3QgZXZlbiB3aXRoCiAgICAgIG9yIHdpdGhvdXQgdGhpcyBwYXRjaC4KCmNvbW1pdCA2
ZmY3YWFiNGE0ZTcwZDIwZmVhODVmNjNiZGE2NjRhN2U4NTEzZWJlCkF1dGhvcjogVGFrYXNoaSBZ
YW5vIDx0YWthc2hpLnlhbm9AbmlmdHkubmUuanA+CkRhdGU6ICAgV2VkIEZlYiAyMyAxMzoyNDoz
OSAyMDIyICswOTAwCgogICAgQ3lnd2luOiBjb25zb2xlOiBSZWRlc2lnbiBoYW5kbGluZyBvZiBz
cGVjaWFsIGtleXMuCiAgICAKICAgIC0gVGhpcyBwYXRjaCByZWFycmFuZ2VzIHRoZSBjb29wZXJh
dGlvbiBiZXR3ZWVuIGNvbnNfbWFzdGVyX3RocmVhZCwKICAgICAgbGluZV9lZGl0LCBhbmQgY3Ry
bF9jX2hhbmRsZXIgc28gdGhhdCBvbmx5IG9uZSBvZiB0aGVtIG9wZXJhdGVzCiAgICAgIGF0IHRo
ZSBzYW1lIHRpbWUuIFNpbmNlIHRoZXNlIGhhbmRsZSBDdHJsLUMgaW5kaXZpZHVhbGx5LCBzbyB0
aGUKICAgICAgc2lnbmFsIG1heSBiZSBzZW50IG11bHRpcGxlIHRpbWVzIHRvIHRoZSBwcm9jZXNz
LiBUaGlzIHBhdGNoIGZpeGVzCiAgICAgIHRoZSBpc3N1ZS4KCmNvbW1pdCA4MDYxODk4MzM0ZjM4
NDJlNzM3MjA2ZjhmMDBiMGJjYTRkYjZmZTY1CkF1dGhvcjogVGFrYXNoaSBZYW5vIDx0YWthc2hp
Lnlhbm9AbmlmdHkubmUuanA+CkRhdGU6ICAgTW9uIEZlYiAyMSAyMjo0MDo0OCAyMDIyICswOTAw
CgogICAgQ3lnd2luOiBwdHk6IEVuY2Fwc3VsYXRlIHB0eSBjb2RlIGluIHR0eTo6c2V0cGdpZCgp
LgogICAgCiAgICAtIFRoaXMgcGF0Y2ggaGlkZXMgY29tcGxleCBwdHkgY29kZXMgaW4gdHR5Ojpz
ZXRwZ2lkKCkgdG8gdHJhbnNmZXIKICAgICAgaW5wdXQgaW50byB0aGUgY2xhc3MgZmhhbmRsZXJf
cHR5X3NsYXZlIGJ5IGVuY2Fwc3VsYXRpbmcgaXQuCgpjb21taXQgY2E0ZGZkYjEyMTRhODUxMzVh
NmNkYjhhMTdlNTQ2MGE0NTk4MTBhNApBdXRob3I6IFRha2FzaGkgWWFubyA8dGFrYXNoaS55YW5v
QG5pZnR5Lm5lLmpwPgpEYXRlOiAgIE1vbiBGZWIgMjEgMjE6MjA6NDggMjAyMiArMDkwMAoKICAg
IEN5Z3dpbjogcHR5LCBjb25zb2xlOiBGaXggaGFuZGxlIGxlYWsgd2hpY2ggb2NjdXJzIG9uIGV4
ZWMoKSBlcnJvci4KICAgIAogICAgLSBUaGlzIHBhdGNoIGZpeGVzIHRoZSBoYW5kbGUgbGVhayB3
aGljaCBvY2N1cnMgd2hlbiBleGVjKCkgZmFpbHMKICAgICAgd2l0aCBhbiBlcnJvci4gVGhlIGR1
cGxpY2F0ZWQgaGFuZGxlcyB3aWxsIGJlIGNsb3NlZCB3aGVuIHRoZQogICAgICBleGVjJ2VkIHBy
b2Nlc3MgaXMgdGVybWluYXRlZC4gSG93ZXZlciwgaWYgZXhlYygpIGZhaWxzLCB0aGUgY29kZQog
ICAgICBwYXRoIGRvZXMgbm90IHJlYWNoIHRvIHRoZSBjb2RlIGNsb3NpbmcgdGhlIGR1cGxpY2F0
ZWQgaGFuZGxlcy4KICAgICAgVG8gaW1wbGVtZW50IHRoaXMgZml4IG1vcmUgYXBwcm9wcmlhdGVs
eSwgdGhlIHNldHVwLCBjbGVhbnVwIGFuZAogICAgICBjbG9zaW5nIHB0eSBjb2RlcyB3aGljaCB3
YXMgcHJldmlvdXNseSBsb2NhdGVkIGluIHNwYXduLmNjIGFyZQogICAgICBlbmNhcHN1bGF0ZWQg
aW50byB0aGUgZmhhbmRsZXJfcHR5X3NsYXZlIGNsYXNzIGZ1bmN0aW9ucy4KCmNvbW1pdCA3NWVm
NWU2ZWNiMTQ1OWQ3NmFjMzkyMGM5Nzg1ZTMwMzY5MWY0OGU5CkF1dGhvcjogVGFrYXNoaSBZYW5v
IDx0YWthc2hpLnlhbm9AbmlmdHkubmUuanA+CkRhdGU6ICAgV2VkIEZlYiAxNiAxNTo0Mzo0MiAy
MDIyICswOTAwCgogICAgQ3lnd2luOiBjb25zb2xlOiBSZWFycmFuZ2Ugc2V0XyhpbnxvdXQpcHV0
X21vZGUoKSBjYWxscy4KICAgIAogICAgLSBXaXRoIHRoaXMgcGF0Y2gsIGFsbCBzZXRfKGlufG91
dClwdXRfbW9kZSgpIGNhbGxzIGFyZSByZWFycmFuZ2VkCiAgICAgIGFzIGZvbGxvd3MuCiAgICAK
ICAgICAgMSkgU2V0dXAgZm9yIGN5Z3dpbiBhcHBzLCBzdGFydGVkIGZyb20gbm9uLWN5Z3dpbiBh
cHAsIGlzIGRvbmUKICAgICAgICAgaW4gZmhhbmRsZXJfY29uc29sZTo6cG9zdF9vcGVuX3NldHVw
KCksIHdoaWNoIG92ZXJyaWRlcwogICAgICAgICBmaGFuZGxlcl9iYXNlOjpwb3N0X29wZW5fc2V0
dXAoKSBjYWxsZWQgZnJvbSBkdGFibGUuY2MuCiAgICAgIDIpIENsZWFudXAgZm9yIGN5Z3dpbiBh
cHAgaXMgZG9uZSBpbiBmaGFuZGxlcl9jb25zb2xlOjpjbG9zZSgpLgogICAgICAzKSBTZXR1cCBm
b3IgY3lnd2luIGFwcHMgaXMgYWxzbyBpbiBmaGFuZGxlcl9jb25zb2xlOjpiZ19jaGVjaygpLAog
ICAgICAgICB3aGljaCBvdmVycmlkZXMgZmhhbmRsZXJfdGVybWlvczo6YmdfY2hlY2soKS4gVGhp
cyBpcyBjYWxsZWQKICAgICAgICAgb24gcmVhZCgpLCB3cml0ZSgpIGFuZCBzZWxlY3QoKSBmb3Ig
Y29uc29sZS4gSXQgaXMgbmVjZXNzYXJ5CiAgICAgICAgIGlmIGN5Z3dpbiBhbmQgbm9uLWN5Z3dp
biBhcHBzIGFyZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5IGluCiAgICAgICAgIHRoZSBzYW1lIHBy
b2Nlc3MgZ3JvdXAuCiAgICAgIDQpIFNldHVwIGZvciBub24tY3lnd2luIGFwcHMgaXMgZG9uZSBp
biBzcGF3bi5jYyB2aWEKICAgICAgICAgZmhhbmRsZXJfY29uc29sZTo6c2V0dXBfY29uc29sZV9m
b3Jfbm9uX2N5Z3dpbl9hcHAoKS4KICAgICAgNSkgQ2xlYW51cCBmb3Igbm9uLWN5Z3dpbiBhcHAg
aXMgZG9uZSBpbiBzcGF3bi5jYyB2aWQKICAgICAgICAgZmhhbmRsZXJfY29uc29sZTo6Y2xlYW51
cF9jb25zb2xlX2Zvcl9ub25fY3lnd2luX2FwcCgpLgogICAgICA2KSBTZXR1cCBmb3Igbm9uLWN5
Z3dpbiBhcHAgc3RhcnRlZCBieSBHREIgaXMgZG9uZSBpbgogICAgICAgICBmaGFuZGxlcl9jb25z
b2xlOjpzZXRfY29uc29sZV9tb2RlX3RvX25hdGl2ZSgpLgogICAgICA3KSBObyBleHBsaWNpdCBj
bGVhbnVwIGZvciBub24tY3lnd2luIGFwcCBzdGFydGVkIGJ5IEdEQiwgYmVjYXVzZQogICAgICAg
ICBjb25zb2xlIG1vZGUgaXMgYXV0b21hdGljYWxseSByZXNldCB0byB0dHk6OmN5Z3dpbiBvbiBy
ZWFkKCkvCiAgICAgICAgIHdyaXRlKCkgaW4gR0RCIHRoYW5rcyB0byAzKS4KCmNvbW1pdCA2NWNh
NmE2Y2FmMzljZThmYjUyMmJjZDlhNzUyYzAxYTJlNGQxNDEwCkF1dGhvcjogVGFrYXNoaSBZYW5v
IDx0YWthc2hpLnlhbm9AbmlmdHkubmUuanA+CkRhdGU6ICAgVHVlIEZlYiAxNSAyMzoyMzo1MCAy
MDIyICswOTAwCgogICAgQ3lnd2luOiBwdHksIGNvbnNvbGU6IFJlZmFjdG9yIHRoZSBjb2RlIHBy
b2Nlc3Npbmcgc3BlY2lhbCBrZXlzLgogICAgCiAgICAtIFRoaXMgcGF0Y2ggY29tbW9uaXplIHRo
ZSBjb2RlIHdoaWNoIHByb2Nlc3NlcyBzcGVjaWFsIGtleXMgaW4gcHR5CiAgICAgIGFuZCBjb25z
b2xlIHRvIGltcHJvdmUgbWFpbnRhbmFuY2liaWxpdHkuIEFzIGEgcmVzdWx0LCBzb21lIHNtYWxs
CiAgICAgIGJ1Z3MgaGF2ZSBiZWVuIGZpeGVkLgoKY29tbWl0IDJkZTNkZDE0YTViNjc1ZGViNmNk
YTZkNmU0MGNlODg5NmRjNmRjMDMKQXV0aG9yOiBUYWthc2hpIFlhbm8gPHRha2FzaGkueWFub0Bu
aWZ0eS5uZS5qcD4KRGF0ZTogICBTYXQgRmViIDUgMTY6NTI6MzMgMjAyMiArMDkwMAoKICAgIEN5
Z3dpbjogY29uc29sZTogUmVtb3ZlIHVubmVjZXNzYXJ5IChyZWR1bmRhbnQpIGNvZGUuCgpjb21t
aXQgZmZhMDhiZDliMDE1ZTk3MWU3ODhjNDRlYWY3ODhmZmYyYjg5NGQ5ZApBdXRob3I6IFRha2Fz
aGkgWWFubyA8dGFrYXNoaS55YW5vQG5pZnR5Lm5lLmpwPgpEYXRlOiAgIFRodSBGZWIgMyAyMTow
OTo0NCAyMDIyICswOTAwCgogICAgQ3lnd2luOiBjb25zb2xlOiBGaXggSUwvREwgZXNjYXBlIHNl
cXVlbmNlIG9uIHRoZSBsYXN0IGxpbmUuCiAgICAKICAgIC0gQ3VycmVudGx5LCBlc2NhcGUgc2Vx
dWVuY2UgSUwvREwgKENTSSBQcyBMLCBDU0kgUHMgTSkgZG9lcyBub3QKICAgICAgd29yayBjb3Jy
ZWN0bHkgYXQgdGhlIGxhc3QgKGJvdHRvbSBlbmQpIGxpbmUuIFRoaXMgcGF0Y2ggZml4ZXMKICAg
ICAgdGhlIGlzc3VlLgogICAgCiAgICBBZGRyZXNzZXM6CiAgICAgIGh0dHBzOi8vY3lnd2luLmNv
bS9waXBlcm1haWwvY3lnd2luLzIwMjItRmVicnVhcnkvMjUwNzM2Lmh0bWwKCmNvbW1pdCAzYWNm
Y2M3YjYzM2FhYjEwYWEyZGNhMmJjM2JlMjVkODFjMTQ4Mjk5CkF1dGhvcjogVGFrYXNoaSBZYW5v
IDx0YWthc2hpLnlhbm9AbmlmdHkubmUuanA+CkRhdGU6ICAgVGh1IEZlYiAzIDEyOjAwOjE0IDIw
MjIgKzA5MDAKCiAgICBDeWd3aW46IHBhdGg6IEZpeCBVTkMgcGF0aCBoYW5kbGluZyBmb3IgU01C
MyBtb3VudGVkIHRvIGEgZHJpdmUuCiAgICAKICAgIC0gSWYgYW4gVU5DIHBhdGggaXMgbW91bnRl
ZCB0byBhIGRyaXZlIHVzaW5nIFNNQjMuMTEsIGFjY2Vzc2luZyB0bwogICAgICB0aGUgZHJpdmUg
ZmFpbHMgd2l0aCBlcnJvciAiVG9vIG1hbnkgbGV2ZWxzIG9mIHN5bWJvbGljIGxpbmtzLiIKICAg
ICAgVGhpcyBwYXRjaCBmaXhlcyB0aGUgaXNzdWUuCg==

--Multipart=_Fri__18_Mar_2022_13_23_35_+0900_dijPPCXjUHVx7/Qg
Content-Type: text/x-c++src;
 name="cons_master_thread.cc"
Content-Disposition: attachment;
 filename="cons_master_thread.cc"
Content-Transfer-Encoding: 7bit

/* This thread processes signals derived from input messages.
   Without this thread, those signals can be handled only when
   the process calls read() or select(). This thread reads input
   records, processes signals and removes corresponding record.
   The other input records are kept back for read() or select(). */
void
fhandler_console::cons_master_thread (handle_set_t *p, tty *ttyp)
{
  const int additional_space = 128; /* Possible max number of incoming events
				       during the process. Additional space
				       should be left for writeback fix. */
  const int inrec_size = INREC_SIZE + additional_space;
  struct m
  {
    inline static size_t bytes (size_t n)
      {
	return sizeof (INPUT_RECORD) * n;
      }
  };
  termios &ti = ttyp->ti;
  while (con.owner == myself->pid)
    {
      DWORD total_read, n, i;
      INPUT_RECORD input_rec[inrec_size];

      if (con.disable_master_thread)
	{
	  cygwait (40);
	  continue;
	}

      WaitForSingleObject (p->input_mutex, mutex_timeout);
      total_read = 0;
      bool nowait = false;
      switch (cygwait (p->input_handle, (DWORD) 0))
	{
	case WAIT_OBJECT_0:
	  acquire_attach_mutex (mutex_timeout);
	  ReadConsoleInputW (p->input_handle,
			     input_rec, INREC_SIZE, &total_read);
	  if (total_read == INREC_SIZE /* Working space full */
	      && cygwait (p->input_handle, (DWORD) 0) == WAIT_OBJECT_0)
	    {
	      const int incr = min (con.num_processed, additional_space);
	      ReadConsoleInputW (p->input_handle,
				 input_rec + total_read, incr, &n);
	      /* Discard oldest n events. */
	      memmove (input_rec, input_rec + n, m::bytes (total_read));
	      con.num_processed -= n;
	      nowait = true;
	    }
	  release_attach_mutex ();
	  break;
	case WAIT_TIMEOUT:
	  con.num_processed = 0;
	case WAIT_SIGNALED:
	case WAIT_CANCELED:
	  break;
	default: /* Error */
	  ReleaseMutex (p->input_mutex);
	  return;
	}
      /* If ENABLE_VIRTUAL_TERMINAL_INPUT is not set, changing
	 window height does not generate WINDOW_BUFFER_SIZE_EVENT.
	 Therefore, check windows size every time here. */
      if (!wincap.has_con_24bit_colors () || con_is_legacy)
	{
	  SHORT y = con.dwWinSize.Y;
	  SHORT x = con.dwWinSize.X;
	  con.fillin (p->output_handle);
	  if (y != con.dwWinSize.Y || x != con.dwWinSize.X)
	    {
	      con.scroll_region.Top = 0;
	      con.scroll_region.Bottom = -1;
	      ttyp->kill_pgrp (SIGWINCH);
	    }
	}
      for (i = con.num_processed; i < total_read; i++)
	{
	  wchar_t wc;
	  char c;
	  bool processed = false;
	  switch (input_rec[i].EventType)
	    {
	    case KEY_EVENT:
	      if (!input_rec[i].Event.KeyEvent.bKeyDown)
		continue;
	      wc = input_rec[i].Event.KeyEvent.uChar.UnicodeChar;
	      if (!wc || (wint_t) wc >= 0x80)
		continue;
	      c = (char) wc;
	      switch (process_sigs (c, ttyp, NULL))
		{
		case signalled:
		case not_signalled_but_done:
		case done_with_debugger:
		  processed = true;
		  ttyp->output_stopped = false;
		  if (ti.c_lflag & NOFLSH)
		    goto remove_record;
		  con.num_processed = 0;
		  goto skip_writeback;
		default: /* not signalled */
		  break;
		}
	      processed = process_stop_start (c, ttyp);
	      break;
	    case WINDOW_BUFFER_SIZE_EVENT:
	      SHORT y = con.dwWinSize.Y;
	      SHORT x = con.dwWinSize.X;
	      con.fillin (p->output_handle);
	      if (y != con.dwWinSize.Y || x != con.dwWinSize.X)
		{
		  con.scroll_region.Top = 0;
		  con.scroll_region.Bottom = -1;
		  if (wincap.has_con_24bit_colors () && !con_is_legacy)
		    fix_tab_position (p->output_handle);
		  ttyp->kill_pgrp (SIGWINCH);
		}
	      processed = true;
	      break;
	    }
remove_record:
	  if (processed)
	    { /* Remove corresponding record. */
	      if (total_read > i + 1)
		memmove (input_rec + i, input_rec + i + 1,
			 m::bytes (total_read - i - 1));
	      total_read--;
	      i--;
	    }
	}
      con.num_processed = total_read;
      if (total_read)
	{
	  do
	    {
	      INPUT_RECORD tmp[inrec_size];
	      /* Writeback input records other than interrupt. */
	      acquire_attach_mutex (mutex_timeout);
	      WriteConsoleInputW (p->input_handle, input_rec, total_read, &n);
	      /* Check if writeback was successfull. */
	      PeekConsoleInputW (p->input_handle, tmp, inrec_size, &n);
	      release_attach_mutex ();
	      if (n < total_read)
		break; /* Someone has read input without acquiring
			  input_mutex. ConEmu cygwin-connector? */
	      if (memcmp (input_rec, tmp, m::bytes (total_read)) == 0)
		break; /* OK */
	      /* Try to fix */
	      DWORD incr = n - total_read;
	      DWORD ofst;
	      for (ofst = 1; ofst <= incr; ofst++)
		if (memcmp (input_rec, tmp + ofst, m::bytes (total_read)) == 0)
		  {
		    acquire_attach_mutex (mutex_timeout);
		    ReadConsoleInputW (p->input_handle, tmp, inrec_size, &n);
		    release_attach_mutex ();
		    memcpy (input_rec, tmp + ofst, m::bytes (total_read));
		    memcpy (input_rec + total_read, tmp, m::bytes (ofst));
		    if (n > ofst + total_read)
		      memcpy (input_rec + total_read + ofst,
			      tmp + ofst + total_read,
			      m::bytes (n - (ofst + total_read)));
		    total_read = n;
		    break;
		  }
	      if (ofst > incr)
		break; /* Writeback was not atomic. Or someone has read
			  input without acquiring input_mutex.
			  Giving up because hard to fix. */
	    }
	  while (true);
	}
skip_writeback:
      ReleaseMutex (p->input_mutex);
      if (!nowait)
	cygwait (40);
    }
}

--Multipart=_Fri__18_Mar_2022_13_23_35_+0900_dijPPCXjUHVx7/Qg
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Disposition: inline


-- 
Problem reports:      https://cygwin.com/problems.html
FAQ:                  https://cygwin.com/faq/
Documentation:        https://cygwin.com/docs.html
Unsubscribe info:     https://cygwin.com/ml/#unsubscribe-simple

--Multipart=_Fri__18_Mar_2022_13_23_35_+0900_dijPPCXjUHVx7/Qg--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019