Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nM7XJ-0006PC-Au for pgsql-hackers@arkaria.postgresql.org; Mon, 21 Feb 2022 12:11:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1nM7XH-0001T5-VN for pgsql-hackers@arkaria.postgresql.org; Mon, 21 Feb 2022 12:11:23 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nM7XG-0001Sw-Gf for pgsql-hackers@lists.postgresql.org; Mon, 21 Feb 2022 12:11:23 +0000 Received: from out5-smtp.messagingengine.com ([66.111.4.29]) by magus.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nM7X9-0006nY-Ut for pgsql-hackers@lists.postgresql.org; Mon, 21 Feb 2022 12:11:22 +0000 Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id C03585C00CC for ; Mon, 21 Feb 2022 07:11:13 -0500 (EST) Received: from imap49 ([10.202.2.99]) by compute4.internal (MEProxy); Mon, 21 Feb 2022 07:11:13 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eulerto.com; h= cc:content-type:date:date:from:from:in-reply-to:message-id :mime-version:reply-to:sender:subject:subject:to:to; s=fm1; bh=B w+XIW0ZZjHdflc7hnLMPVJ4rg5IChhUvRyuzNIhB8g=; b=UARSULMVc9+uZdtPh n+27vpaGV0TUMi1LdVzWP/50ViCkxYlLi2Wj2TcAylNEKc8QkXqyon4moggiQUjP 3tl0ihRUO3CmVTbHIIs7HCSudqGrhtlYbaCCZuYuYD8nyIaNI/QyExjcOVkN/qFJ l5DcuYDUzeYbLX+vK7JMNrtKRqpjM/TsBxLNH3mPKQalzCvpSRoSwytQlxKrGljj FcUchocS45vk0mLbLyi5bYFQFXnxfyQcfU1qO6BmGdRcZi3sUaw/uqyyeYjyiKdd NZVN+bBu3pQqnNKxwv9tOz8UHqKrRPI0eT/dcG/QuJKi/yMabaNw60aKmy9qSE6n vJMRg== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:content-type:date:date:from:from :in-reply-to:message-id:mime-version:reply-to:sender:subject :subject:to:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm2; bh=Bw+XIW0ZZjHdflc7hnLMPVJ4rg5IChhUvRyuzNIhB 8g=; b=NP94XjdldpM3kLr55+nVcc7JDSVG/Pbbtyl5WP40nfQhHJVN1lIWRpdNl urGGCbvY3U8znjP2xkDhlzFquoBMqop7qudAEcaVX1X2nomDkFdCDkmGQKWcLzoI rDulwYWbOy5ceQQXQh7HyVhvUjizmWfyJWymesutlOzQLMw2jYsVGBN82WR6Ef2z +3GwRSVn1ZPjQANZZhz5Du7Gjj0utjqvXbiixs2lyfkgLpu1lyNHfaFWQozebiGU Gm/a4hW6Lzbz4aw3RydX4kAQ5c2OoI3juv/t5l9ScgwiW5dYeYZ8NV1jDggnoEtn 60FGwjRLBqfMxooBGrF5tmJ/k8+QQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvvddrkeeigdefhecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecunecujfgurhepofgfggfkfffhvffutgesmhdtreerre ertdenucfhrhhomhepfdfguhhlvghrucfvrghvvghirhgrfdcuoegvuhhlvghrsegvuhhl vghrthhordgtohhmqeenucggtffrrghtthgvrhhnpeettedvkefhffeutddthffhvdduke fhieetkeevieeuhfekhffhvdehheegfeejudenucffohhmrghinhepghhithhhuhgsrdgt ohhmpdgvnhhtvghrphhrihhsvggusgdrtghomhenucevlhhushhtvghrufhiiigvpedtne curfgrrhgrmhepmhgrihhlfhhrohhmpegvuhhlvghrsegvuhhlvghrthhordgtohhm X-ME-Proxy: Received: by mailuser.nyi.internal (Postfix, from userid 501) id 7689BF6007E; Mon, 21 Feb 2022 07:11:13 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.5.0-alpha0-4778-g14fba9972e-fm-20220217.001-g14fba997 Mime-Version: 1.0 Message-Id: <5ac50071-f2ed-4ace-a8fd-b892cffd33eb@www.fastmail.com> Date: Mon, 21 Feb 2022 09:09:12 -0300 From: "Euler Taveira" To: pgsql-hackers@lists.postgresql.org Subject: speed up a logical replica setup Content-Type: multipart/mixed; boundary=e6195eae3ac747b7a59e5b5e0808269d List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --e6195eae3ac747b7a59e5b5e0808269d Content-Type: multipart/alternative; boundary=5345b2834c5943489e6eab1fed69d389 --5345b2834c5943489e6eab1fed69d389 Content-Type: text/plain Hi, Logical replication has been used to migration with minimal downtime. However, if you are dealing with a big database, the amount of required resources (disk -- due to WAL retention) increases as the backlog (WAL) increases. Unless you have a generous amount of resources and can wait for long period of time until the new replica catches up, creating a logical replica is impracticable on large databases. The general idea is to create and convert a physical replica or a base backup (archived WAL files available) into a logical replica. The initial data copy and catchup tends to be faster on a physical replica. This technique has been successfully used in pglogical_create_subscriber [1]. A new tool called pg_subscriber does this conversion and is tightly integrated with Postgres. DESIGN The conversion requires 8 steps. 1. Check if the target data directory has the same system identifier than the source data directory. 2. Stop the target server if it is running as a standby server. (Modify recovery parameters requires a restart.) 3. Create one replication slot per specified database on the source server. One additional replication slot is created at the end to get the consistent LSN (This consistent LSN will be used as (a) a stopping point for the recovery process and (b) a starting point for the subscriptions). 4. Write recovery parameters into the target data directory and start the target server (Wait until the target server is promoted). 5. Create one publication (FOR ALL TABLES) per specified database on the source server. 6. Create one subscription per specified database on the target server (Use replication slot and publication created in a previous step. Don't enable the subscriptions yet). 7. Sets the replication progress to the consistent LSN that was got in a previous step. 8. Enable the subscription for each specified database on the target server. This tool does not take a base backup. It can certainly be included later. There is already a tool do it: pg_basebackup. There is a --subscriber-conninfo option to inform the subscriber connection string, however, we could remove it since this tool runs on the subscriber and we can build a connection string. NAME I'm not sure about the proposed name. I came up with this one because it is not so long. The last added tools uses pg_ prefix, verb (action) and object. pg_initsubscriber and pg_createsubscriber are names that I thought but I'm not excited about it. DOCUMENTATION It is available and describes this tool. TESTS Basic tests are included. It requires some tests to exercise this tool. Comments? [1] https://github.com/2ndQuadrant/pglogical -- Euler Taveira EDB https://www.enterprisedb.com/ --5345b2834c5943489e6eab1fed69d389 Content-Type: text/html Content-Transfer-Encoding: quoted-printable
Hi,

Logical replication has been used to migration with mi= nimal downtime. However,
if you are dealing with a big dat= abase, the amount of required resources (disk
-- due to WA= L retention) increases as the backlog (WAL) increases. Unless you
have a generous amount of resources and can wait for long period= of time until
the new replica catches up, creating a logi= cal replica is impracticable on
large databases.
=

The general idea is to create and convert a physical= replica or a base backup
(archived WAL files available) i= nto a logical replica. The initial data copy
and catchup t= ends to be faster on a physical replica. This technique has been
successfully used in pglogical_create_subscriber [1].

A new tool called pg_subscriber does this conversion a= nd is tightly integrated
with Postgres.

=
DESIGN

The conversion requires 8= steps.

1. Check if the target data directo= ry has the same system identifier than the
source data dir= ectory.
2. Stop the target server if it is running as a st= andby server. (Modify
recovery parameters requires a resta= rt.)
3. Create one replication slot per specified database= on the source server. One
additional replication slot is = created at the end to get the consistent LSN
(This consist= ent LSN will be used as (a) a stopping point for the recovery
<= div>process and (b) a starting point for the subscriptions).
4. Write recovery parameters into the target data directory and start= the
target server (Wait until the target server is promot= ed).
5. Create one publication (FOR ALL TABLES) per specif= ied database on the source
server.
6. Create= one subscription per specified database on the target server (Use
replication slot and publication created in a previous step. Do= n't enable the
subscriptions yet).
7. Sets t= he replication progress to the consistent LSN that was got in a
previous step.
8. Enable the subscription for each s= pecified database on the target server.

Thi= s tool does not take a base backup. It can certainly be included later.<= br>
There is already a tool do it: pg_basebackup.

There is a --subscriber-conninfo option to inform the s= ubscriber connection
string, however, we could remove it s= ince this tool runs on the subscriber and
we can build a c= onnection string.

NAME

I'm not sure about the proposed name. I came up with this one b= ecause it is not
so long. The last added tools uses pg_ pr= efix, verb (action) and object.
pg_initsubscriber and pg_c= reatesubscriber are names that I thought but I'm not
excit= ed about it.

DOCUMENTATION
It is available and describes this tool.

=
TESTS

Basic tests are included. = It requires some tests to exercise this tool.


Comments?



--
Eul= er Taveira

--5345b2834c5943489e6eab1fed69d389-- --e6195eae3ac747b7a59e5b5e0808269d Content-Disposition: attachment;filename="v1-0001-Move-readfile-and-free_readfile-to-file_utils.h.patch" Content-Type: text/x-patch; name="v1-0001-Move-readfile-and-free_readfile-to-file_utils.h.patch" Content-Transfer-Encoding: BASE64 RnJvbSA1ODI3MjQ1YjhhMDZmOTA2ZjYwMzEwMGM4ZmIyN2JlNTMzYTZjMGExIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBFdWxlciBUYXZlaXJhIDxldWxlci50YXZlaXJhQGVu dGVycHJpc2VkYi5jb20+CkRhdGU6IEZyaSwgMTEgRmViIDIwMjIgMDM6MDU6NTggLTAzMDAK U3ViamVjdDogW1BBVENIIHYxIDEvMl0gTW92ZSByZWFkZmlsZSgpIGFuZCBmcmVlX3JlYWRm aWxlKCkgdG8gZmlsZV91dGlscy5oCgpBbGxvdyB0aGVzZSBmdW5jdGlvbnMgdG8gYmUgdXNl ZCBieSBvdGhlciBiaW5hcmllcy4KClRoZXJlIGlzIGEgc3RhdGljIGZ1bmN0aW9uIGNhbGxl ZCByZWFkZmlsZSgpIGluIGluaXRkYi5jIHRvby4gUmVuYW1lIGl0CnRvIGF2b2lkIGNvbmZs aWN0aW5nIHdpdGggdGhlIGV4cG9zZWQgZnVuY3Rpb24uCi0tLQogc3JjL2Jpbi9pbml0ZGIv aW5pdGRiLmMgICAgICAgICB8ICAyNiArKystLS0tCiBzcmMvYmluL3BnX2N0bC9wZ19jdGwu YyAgICAgICAgIHwgMTIyICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBzcmMv Y29tbW9uL2ZpbGVfdXRpbHMuYyAgICAgICAgIHwgMTE5ICsrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysKIHNyYy9pbmNsdWRlL2NvbW1vbi9maWxlX3V0aWxzLmggfCAgIDMgKwog NCBmaWxlcyBjaGFuZ2VkLCAxMzYgaW5zZXJ0aW9ucygrKSwgMTM0IGRlbGV0aW9ucygtKQoK ZGlmZiAtLWdpdCBhL3NyYy9iaW4vaW5pdGRiL2luaXRkYi5jIGIvc3JjL2Jpbi9pbml0ZGIv aW5pdGRiLmMKaW5kZXggOTdmMTU5NzFlMi4uYTRjYmZlYjk1NCAxMDA2NDQKLS0tIGEvc3Jj L2Jpbi9pbml0ZGIvaW5pdGRiLmMKKysrIGIvc3JjL2Jpbi9pbml0ZGIvaW5pdGRiLmMKQEAg LTI0Myw4ICsyNDMsOCBAQCBzdGF0aWMgY2hhciAqKnJlcGxhY2VfdG9rZW4oY2hhciAqKmxp bmVzLAogI2lmbmRlZiBIQVZFX1VOSVhfU09DS0VUUwogc3RhdGljIGNoYXIgKipmaWx0ZXJf bGluZXNfd2l0aF90b2tlbihjaGFyICoqbGluZXMsIGNvbnN0IGNoYXIgKnRva2VuKTsKICNl bmRpZgotc3RhdGljIGNoYXIgKipyZWFkZmlsZShjb25zdCBjaGFyICpwYXRoKTsKLXN0YXRp YyB2b2lkIHdyaXRlZmlsZShjaGFyICpwYXRoLCBjaGFyICoqbGluZXMpOworc3RhdGljIGNo YXIgKipyZWFkX3RleHRfZmlsZShjb25zdCBjaGFyICpwYXRoKTsKK3N0YXRpYyB2b2lkIHdy aXRlX3RleHRfZmlsZShjaGFyICpwYXRoLCBjaGFyICoqbGluZXMpOwogc3RhdGljIEZJTEUg KnBvcGVuX2NoZWNrKGNvbnN0IGNoYXIgKmNvbW1hbmQsIGNvbnN0IGNoYXIgKm1vZGUpOwog c3RhdGljIGNoYXIgKmdldF9pZCh2b2lkKTsKIHN0YXRpYyBpbnQJZ2V0X2VuY29kaW5nX2lk KGNvbnN0IGNoYXIgKmVuY29kaW5nX25hbWUpOwpAQCAtNDUzLDcgKzQ1Myw3IEBAIGZpbHRl cl9saW5lc193aXRoX3Rva2VuKGNoYXIgKipsaW5lcywgY29uc3QgY2hhciAqdG9rZW4pCiAg KiBnZXQgdGhlIGxpbmVzIGZyb20gYSB0ZXh0IGZpbGUKICAqLwogc3RhdGljIGNoYXIgKioK LXJlYWRmaWxlKGNvbnN0IGNoYXIgKnBhdGgpCityZWFkX3RleHRfZmlsZShjb25zdCBjaGFy ICpwYXRoKQogewogCWNoYXIJICAqKnJlc3VsdDsKIAlGSUxFCSAgICppbmZpbGU7CkBAIC01 MDAsNyArNTAwLDcgQEAgcmVhZGZpbGUoY29uc3QgY2hhciAqcGF0aCkKICAqIHNvIHRoYXQg dGhlIHJlc3VsdGluZyBjb25maWd1cmF0aW9uIGZpbGVzIGFyZSBuaWNlbHkgZWRpdGFibGUg b24gV2luZG93cy4KICAqLwogc3RhdGljIHZvaWQKLXdyaXRlZmlsZShjaGFyICpwYXRoLCBj aGFyICoqbGluZXMpCit3cml0ZV90ZXh0X2ZpbGUoY2hhciAqcGF0aCwgY2hhciAqKmxpbmVz KQogewogCUZJTEUJICAgKm91dF9maWxlOwogCWNoYXIJICAqKmxpbmU7CkBAIC0xMDYzLDcg KzEwNjMsNyBAQCBzZXR1cF9jb25maWcodm9pZCkKIAogCS8qIHBvc3RncmVzcWwuY29uZiAq LwogCi0JY29uZmxpbmVzID0gcmVhZGZpbGUoY29uZl9maWxlKTsKKwljb25mbGluZXMgPSBy ZWFkX3RleHRfZmlsZShjb25mX2ZpbGUpOwogCiAJc25wcmludGYocmVwbHRvaywgc2l6ZW9m KHJlcGx0b2spLCAibWF4X2Nvbm5lY3Rpb25zID0gJWQiLCBuX2Nvbm5lY3Rpb25zKTsKIAlj b25mbGluZXMgPSByZXBsYWNlX3Rva2VuKGNvbmZsaW5lcywgIiNtYXhfY29ubmVjdGlvbnMg PSAxMDAiLCByZXBsdG9rKTsKQEAgLTEyMTQsNyArMTIxNCw3IEBAIHNldHVwX2NvbmZpZyh2 b2lkKQogCiAJc25wcmludGYocGF0aCwgc2l6ZW9mKHBhdGgpLCAiJXMvcG9zdGdyZXNxbC5j b25mIiwgcGdfZGF0YSk7CiAKLQl3cml0ZWZpbGUocGF0aCwgY29uZmxpbmVzKTsKKwl3cml0 ZV90ZXh0X2ZpbGUocGF0aCwgY29uZmxpbmVzKTsKIAlpZiAoY2htb2QocGF0aCwgcGdfZmls ZV9jcmVhdGVfbW9kZSkgIT0gMCkKIAl7CiAJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGNo YW5nZSBwZXJtaXNzaW9ucyBvZiBcIiVzXCI6ICVtIiwgcGF0aCk7CkBAIC0xMjMzLDcgKzEy MzMsNyBAQCBzZXR1cF9jb25maWcodm9pZCkKIAogCXNwcmludGYocGF0aCwgIiVzL3Bvc3Rn cmVzcWwuYXV0by5jb25mIiwgcGdfZGF0YSk7CiAKLQl3cml0ZWZpbGUocGF0aCwgYXV0b2Nv bmZsaW5lcyk7CisJd3JpdGVfdGV4dF9maWxlKHBhdGgsIGF1dG9jb25mbGluZXMpOwogCWlm IChjaG1vZChwYXRoLCBwZ19maWxlX2NyZWF0ZV9tb2RlKSAhPSAwKQogCXsKIAkJcGdfbG9n X2Vycm9yKCJjb3VsZCBub3QgY2hhbmdlIHBlcm1pc3Npb25zIG9mIFwiJXNcIjogJW0iLCBw YXRoKTsKQEAgLTEyNDUsNyArMTI0NSw3IEBAIHNldHVwX2NvbmZpZyh2b2lkKQogCiAJLyog cGdfaGJhLmNvbmYgKi8KIAotCWNvbmZsaW5lcyA9IHJlYWRmaWxlKGhiYV9maWxlKTsKKwlj b25mbGluZXMgPSByZWFkX3RleHRfZmlsZShoYmFfZmlsZSk7CiAKICNpZm5kZWYgSEFWRV9V TklYX1NPQ0tFVFMKIAljb25mbGluZXMgPSBmaWx0ZXJfbGluZXNfd2l0aF90b2tlbihjb25m bGluZXMsICJAcmVtb3ZlLWxpbmUtZm9yLW5vbG9jYWxAIik7CkBAIC0xMzE5LDcgKzEzMTks NyBAQCBzZXR1cF9jb25maWcodm9pZCkKIAogCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRo KSwgIiVzL3BnX2hiYS5jb25mIiwgcGdfZGF0YSk7CiAKLQl3cml0ZWZpbGUocGF0aCwgY29u ZmxpbmVzKTsKKwl3cml0ZV90ZXh0X2ZpbGUocGF0aCwgY29uZmxpbmVzKTsKIAlpZiAoY2ht b2QocGF0aCwgcGdfZmlsZV9jcmVhdGVfbW9kZSkgIT0gMCkKIAl7CiAJCXBnX2xvZ19lcnJv cigiY291bGQgbm90IGNoYW5nZSBwZXJtaXNzaW9ucyBvZiBcIiVzXCI6ICVtIiwgcGF0aCk7 CkBAIC0xMzMwLDExICsxMzMwLDExIEBAIHNldHVwX2NvbmZpZyh2b2lkKQogCiAJLyogcGdf aWRlbnQuY29uZiAqLwogCi0JY29uZmxpbmVzID0gcmVhZGZpbGUoaWRlbnRfZmlsZSk7CisJ Y29uZmxpbmVzID0gcmVhZF90ZXh0X2ZpbGUoaWRlbnRfZmlsZSk7CiAKIAlzbnByaW50Zihw YXRoLCBzaXplb2YocGF0aCksICIlcy9wZ19pZGVudC5jb25mIiwgcGdfZGF0YSk7CiAKLQl3 cml0ZWZpbGUocGF0aCwgY29uZmxpbmVzKTsKKwl3cml0ZV90ZXh0X2ZpbGUocGF0aCwgY29u ZmxpbmVzKTsKIAlpZiAoY2htb2QocGF0aCwgcGdfZmlsZV9jcmVhdGVfbW9kZSkgIT0gMCkK IAl7CiAJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGNoYW5nZSBwZXJtaXNzaW9ucyBvZiBc IiVzXCI6ICVtIiwgcGF0aCk7CkBAIC0xMzYyLDcgKzEzNjIsNyBAQCBib290c3RyYXBfdGVt cGxhdGUxKHZvaWQpCiAJcHJpbnRmKF8oInJ1bm5pbmcgYm9vdHN0cmFwIHNjcmlwdCAuLi4g IikpOwogCWZmbHVzaChzdGRvdXQpOwogCi0JYmtpX2xpbmVzID0gcmVhZGZpbGUoYmtpX2Zp bGUpOworCWJraV9saW5lcyA9IHJlYWRfdGV4dF9maWxlKGJraV9maWxlKTsKIAogCS8qIENo ZWNrIHRoYXQgYmtpIGZpbGUgYXBwZWFycyB0byBiZSBvZiB0aGUgcmlnaHQgdmVyc2lvbiAq LwogCkBAIC0xNTQ3LDcgKzE1NDcsNyBAQCBzZXR1cF9ydW5fZmlsZShGSUxFICpjbWRmZCwg Y29uc3QgY2hhciAqZmlsZW5hbWUpCiB7CiAJY2hhcgkgICoqbGluZXM7CiAKLQlsaW5lcyA9 IHJlYWRmaWxlKGZpbGVuYW1lKTsKKwlsaW5lcyA9IHJlYWRfdGV4dF9maWxlKGZpbGVuYW1l KTsKIAogCWZvciAoY2hhciAqKmxpbmUgPSBsaW5lczsgKmxpbmUgIT0gTlVMTDsgbGluZSsr KQogCXsKZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdfY3RsL3BnX2N0bC5jIGIvc3JjL2Jpbi9w Z19jdGwvcGdfY3RsLmMKaW5kZXggM2MxODJjOTdkNC4uYjg3YmViNzM4MCAxMDA2NDQKLS0t IGEvc3JjL2Jpbi9wZ19jdGwvcGdfY3RsLmMKKysrIGIvc3JjL2Jpbi9wZ19jdGwvcGdfY3Rs LmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjYXRhbG9nL3BnX2NvbnRyb2wuaCIK ICNpbmNsdWRlICJjb21tb24vY29udHJvbGRhdGFfdXRpbHMuaCIKICNpbmNsdWRlICJjb21t b24vZmlsZV9wZXJtLmgiCisjaW5jbHVkZSAiY29tbW9uL2ZpbGVfdXRpbHMuaCIKICNpbmNs dWRlICJjb21tb24vbG9nZ2luZy5oIgogI2luY2x1ZGUgImNvbW1vbi9zdHJpbmcuaCIKICNp bmNsdWRlICJnZXRvcHRfbG9uZy5oIgpAQCAtMTUwLDggKzE1MSw2IEBAIHN0YXRpYyBQVE9L RU5fUFJJVklMRUdFUyBHZXRQcml2aWxlZ2VzVG9EZWxldGUoSEFORExFIGhUb2tlbik7CiAj ZW5kaWYKIAogc3RhdGljIHBncGlkX3QgZ2V0X3BncGlkKGJvb2wgaXNfc3RhdHVzX3JlcXVl c3QpOwotc3RhdGljIGNoYXIgKipyZWFkZmlsZShjb25zdCBjaGFyICpwYXRoLCBpbnQgKm51 bWxpbmVzKTsKLXN0YXRpYyB2b2lkIGZyZWVfcmVhZGZpbGUoY2hhciAqKm9wdGxpbmVzKTsK IHN0YXRpYyBwZ3BpZF90IHN0YXJ0X3Bvc3RtYXN0ZXIodm9pZCk7CiBzdGF0aWMgdm9pZCBy ZWFkX3Bvc3Rfb3B0cyh2b2lkKTsKIApAQCAtMzA3LDEyNSArMzA2LDYgQEAgZ2V0X3BncGlk KGJvb2wgaXNfc3RhdHVzX3JlcXVlc3QpCiB9CiAKIAotLyoKLSAqIGdldCB0aGUgbGluZXMg ZnJvbSBhIHRleHQgZmlsZSAtIHJldHVybiBOVUxMIGlmIGZpbGUgY2FuJ3QgYmUgb3BlbmVk Ci0gKgotICogVHJhaWxpbmcgbmV3bGluZXMgYXJlIGRlbGV0ZWQgZnJvbSB0aGUgbGluZXMg KHRoaXMgaXMgYSBjaGFuZ2UgZnJvbSBwcmUtdjEwKQotICoKLSAqICpudW1saW5lcyBpcyBz ZXQgdG8gdGhlIG51bWJlciBvZiBsaW5lIHBvaW50ZXJzIHJldHVybmVkOyB0aGVyZSBpcwot ICogYWxzbyBhbiBhZGRpdGlvbmFsIE5VTEwgcG9pbnRlciBhZnRlciB0aGUgbGFzdCByZWFs IGxpbmUuCi0gKi8KLXN0YXRpYyBjaGFyICoqCi1yZWFkZmlsZShjb25zdCBjaGFyICpwYXRo LCBpbnQgKm51bWxpbmVzKQotewotCWludAkJCWZkOwotCWludAkJCW5saW5lczsKLQljaGFy CSAgKipyZXN1bHQ7Ci0JY2hhcgkgICAqYnVmZmVyOwotCWNoYXIJICAgKmxpbmViZWdpbjsK LQlpbnQJCQlpOwotCWludAkJCW47Ci0JaW50CQkJbGVuOwotCXN0cnVjdCBzdGF0IHN0YXRi dWY7Ci0KLQkqbnVtbGluZXMgPSAwOwkJCQkvKiBpbiBjYXNlIG9mIGZhaWx1cmUgb3IgZW1w dHkgZmlsZSAqLwotCi0JLyoKLQkgKiBTbHVycCB0aGUgZmlsZSBpbnRvIG1lbW9yeS4KLQkg KgotCSAqIFRoZSBmaWxlIGNhbiBjaGFuZ2UgY29uY3VycmVudGx5LCBzbyB3ZSByZWFkIHRo ZSB3aG9sZSBmaWxlIGludG8gbWVtb3J5Ci0JICogd2l0aCBhIHNpbmdsZSByZWFkKCkgY2Fs bC4gVGhhdCdzIG5vdCBndWFyYW50ZWVkIHRvIGdldCBhbiBhdG9taWMKLQkgKiBzbmFwc2hv dCwgYnV0IGluIHByYWN0aWNlLCBmb3IgYSBzbWFsbCBmaWxlLCBpdCdzIGNsb3NlIGVub3Vn aCBmb3IgdGhlCi0JICogY3VycmVudCB1c2UuCi0JICovCi0JZmQgPSBvcGVuKHBhdGgsIE9f UkRPTkxZIHwgUEdfQklOQVJZLCAwKTsKLQlpZiAoZmQgPCAwKQotCQlyZXR1cm4gTlVMTDsK LQlpZiAoZnN0YXQoZmQsICZzdGF0YnVmKSA8IDApCi0JewotCQljbG9zZShmZCk7Ci0JCXJl dHVybiBOVUxMOwotCX0KLQlpZiAoc3RhdGJ1Zi5zdF9zaXplID09IDApCi0JewotCQkvKiBl bXB0eSBmaWxlICovCi0JCWNsb3NlKGZkKTsKLQkJcmVzdWx0ID0gKGNoYXIgKiopIHBnX21h bGxvYyhzaXplb2YoY2hhciAqKSk7Ci0JCSpyZXN1bHQgPSBOVUxMOwotCQlyZXR1cm4gcmVz dWx0OwotCX0KLQlidWZmZXIgPSBwZ19tYWxsb2Moc3RhdGJ1Zi5zdF9zaXplICsgMSk7Ci0K LQlsZW4gPSByZWFkKGZkLCBidWZmZXIsIHN0YXRidWYuc3Rfc2l6ZSArIDEpOwotCWNsb3Nl KGZkKTsKLQlpZiAobGVuICE9IHN0YXRidWYuc3Rfc2l6ZSkKLQl7Ci0JCS8qIG9vcHMsIHRo ZSBmaWxlIHNpemUgY2hhbmdlZCBiZXR3ZWVuIGZzdGF0IGFuZCByZWFkICovCi0JCWZyZWUo YnVmZmVyKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCi0JLyoKLQkgKiBDb3VudCBuZXdsaW5l cy4gV2UgZXhwZWN0IHRoZXJlIHRvIGJlIGEgbmV3bGluZSBhZnRlciBlYWNoIGZ1bGwgbGlu ZSwKLQkgKiBpbmNsdWRpbmcgb25lIGF0IHRoZSBlbmQgb2YgZmlsZS4gSWYgdGhlcmUgaXNu J3QgYSBuZXdsaW5lIGF0IHRoZSBlbmQsCi0JICogYW55IGNoYXJhY3RlcnMgYWZ0ZXIgdGhl IGxhc3QgbmV3bGluZSB3aWxsIGJlIGlnbm9yZWQuCi0JICovCi0JbmxpbmVzID0gMDsKLQlm b3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCi0JewotCQlpZiAoYnVmZmVyW2ldID09ICdcbicp Ci0JCQlubGluZXMrKzsKLQl9Ci0KLQkvKiBzZXQgdXAgdGhlIHJlc3VsdCBidWZmZXIgKi8K LQlyZXN1bHQgPSAoY2hhciAqKikgcGdfbWFsbG9jKChubGluZXMgKyAxKSAqIHNpemVvZihj aGFyICopKTsKLQkqbnVtbGluZXMgPSBubGluZXM7Ci0KLQkvKiBub3cgc3BsaXQgdGhlIGJ1 ZmZlciBpbnRvIGxpbmVzICovCi0JbGluZWJlZ2luID0gYnVmZmVyOwotCW4gPSAwOwotCWZv ciAoaSA9IDA7IGkgPCBsZW47IGkrKykKLQl7Ci0JCWlmIChidWZmZXJbaV0gPT0gJ1xuJykK LQkJewotCQkJaW50CQkJc2xlbiA9ICZidWZmZXJbaV0gLSBsaW5lYmVnaW47Ci0JCQljaGFy CSAgICpsaW5lYnVmID0gcGdfbWFsbG9jKHNsZW4gKyAxKTsKLQotCQkJbWVtY3B5KGxpbmVi dWYsIGxpbmViZWdpbiwgc2xlbik7Ci0JCQkvKiB3ZSBhbHJlYWR5IGRyb3BwZWQgdGhlIFxu LCBidXQgZ2V0IHJpZCBvZiBhbnkgXHIgdG9vICovCi0JCQlpZiAoc2xlbiA+IDAgJiYgbGlu ZWJ1ZltzbGVuIC0gMV0gPT0gJ1xyJykKLQkJCQlzbGVuLS07Ci0JCQlsaW5lYnVmW3NsZW5d ID0gJ1wwJzsKLQkJCXJlc3VsdFtuKytdID0gbGluZWJ1ZjsKLQkJCWxpbmViZWdpbiA9ICZi dWZmZXJbaSArIDFdOwotCQl9Ci0JfQotCXJlc3VsdFtuXSA9IE5VTEw7Ci0KLQlmcmVlKGJ1 ZmZlcik7Ci0KLQlyZXR1cm4gcmVzdWx0OwotfQotCi0KLS8qCi0gKiBGcmVlIG1lbW9yeSBh bGxvY2F0ZWQgZm9yIG9wdGxpbmVzIHRocm91Z2ggcmVhZGZpbGUoKQotICovCi1zdGF0aWMg dm9pZAotZnJlZV9yZWFkZmlsZShjaGFyICoqb3B0bGluZXMpCi17Ci0JY2hhcgkgICAqY3Vy cl9saW5lID0gTlVMTDsKLQlpbnQJCQlpID0gMDsKLQotCWlmICghb3B0bGluZXMpCi0JCXJl dHVybjsKLQotCXdoaWxlICgoY3Vycl9saW5lID0gb3B0bGluZXNbaSsrXSkpCi0JCWZyZWUo Y3Vycl9saW5lKTsKLQotCWZyZWUob3B0bGluZXMpOwotfQotCiAvKgogICogc3RhcnQvdGVz dC9zdG9wIHJvdXRpbmVzCiAgKi8KZGlmZiAtLWdpdCBhL3NyYy9jb21tb24vZmlsZV91dGls cy5jIGIvc3JjL2NvbW1vbi9maWxlX3V0aWxzLmMKaW5kZXggNzEzODA2ODYzMy4uMWY1M2Yw ODhjNiAxMDA2NDQKLS0tIGEvc3JjL2NvbW1vbi9maWxlX3V0aWxzLmMKKysrIGIvc3JjL2Nv bW1vbi9maWxlX3V0aWxzLmMKQEAgLTM5OCw2ICszOTgsMTI1IEBAIGR1cmFibGVfcmVuYW1l KGNvbnN0IGNoYXIgKm9sZGZpbGUsIGNvbnN0IGNoYXIgKm5ld2ZpbGUpCiAJcmV0dXJuIDA7 CiB9CiAKKy8qCisgKiBnZXQgdGhlIGxpbmVzIGZyb20gYSB0ZXh0IGZpbGUgLSByZXR1cm4g TlVMTCBpZiBmaWxlIGNhbid0IGJlIG9wZW5lZAorICoKKyAqIFRyYWlsaW5nIG5ld2xpbmVz IGFyZSBkZWxldGVkIGZyb20gdGhlIGxpbmVzICh0aGlzIGlzIGEgY2hhbmdlIGZyb20gcHJl LXYxMCkKKyAqCisgKiAqbnVtbGluZXMgaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgbGluZSBw b2ludGVycyByZXR1cm5lZDsgdGhlcmUgaXMKKyAqIGFsc28gYW4gYWRkaXRpb25hbCBOVUxM IHBvaW50ZXIgYWZ0ZXIgdGhlIGxhc3QgcmVhbCBsaW5lLgorICovCitjaGFyICoqCityZWFk ZmlsZShjb25zdCBjaGFyICpwYXRoLCBpbnQgKm51bWxpbmVzKQoreworCWludAkJCWZkOwor CWludAkJCW5saW5lczsKKwljaGFyCSAgKipyZXN1bHQ7CisJY2hhcgkgICAqYnVmZmVyOwor CWNoYXIJICAgKmxpbmViZWdpbjsKKwlpbnQJCQlpOworCWludAkJCW47CisJaW50CQkJbGVu OworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwkqbnVtbGluZXMgPSAwOwkJCQkvKiBpbiBj YXNlIG9mIGZhaWx1cmUgb3IgZW1wdHkgZmlsZSAqLworCisJLyoKKwkgKiBTbHVycCB0aGUg ZmlsZSBpbnRvIG1lbW9yeS4KKwkgKgorCSAqIFRoZSBmaWxlIGNhbiBjaGFuZ2UgY29uY3Vy cmVudGx5LCBzbyB3ZSByZWFkIHRoZSB3aG9sZSBmaWxlIGludG8gbWVtb3J5CisJICogd2l0 aCBhIHNpbmdsZSByZWFkKCkgY2FsbC4gVGhhdCdzIG5vdCBndWFyYW50ZWVkIHRvIGdldCBh biBhdG9taWMKKwkgKiBzbmFwc2hvdCwgYnV0IGluIHByYWN0aWNlLCBmb3IgYSBzbWFsbCBm aWxlLCBpdCdzIGNsb3NlIGVub3VnaCBmb3IgdGhlCisJICogY3VycmVudCB1c2UuCisJICov CisJZmQgPSBvcGVuKHBhdGgsIE9fUkRPTkxZIHwgUEdfQklOQVJZLCAwKTsKKwlpZiAoZmQg PCAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZnN0YXQoZmQsICZzdGF0YnVmKSA8IDApCisJ eworCQljbG9zZShmZCk7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoc3RhdGJ1Zi5zdF9z aXplID09IDApCisJeworCQkvKiBlbXB0eSBmaWxlICovCisJCWNsb3NlKGZkKTsKKwkJcmVz dWx0ID0gKGNoYXIgKiopIHBnX21hbGxvYyhzaXplb2YoY2hhciAqKSk7CisJCSpyZXN1bHQg PSBOVUxMOworCQlyZXR1cm4gcmVzdWx0OworCX0KKwlidWZmZXIgPSBwZ19tYWxsb2Moc3Rh dGJ1Zi5zdF9zaXplICsgMSk7CisKKwlsZW4gPSByZWFkKGZkLCBidWZmZXIsIHN0YXRidWYu c3Rfc2l6ZSArIDEpOworCWNsb3NlKGZkKTsKKwlpZiAobGVuICE9IHN0YXRidWYuc3Rfc2l6 ZSkKKwl7CisJCS8qIG9vcHMsIHRoZSBmaWxlIHNpemUgY2hhbmdlZCBiZXR3ZWVuIGZzdGF0 IGFuZCByZWFkICovCisJCWZyZWUoYnVmZmVyKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJ LyoKKwkgKiBDb3VudCBuZXdsaW5lcy4gV2UgZXhwZWN0IHRoZXJlIHRvIGJlIGEgbmV3bGlu ZSBhZnRlciBlYWNoIGZ1bGwgbGluZSwKKwkgKiBpbmNsdWRpbmcgb25lIGF0IHRoZSBlbmQg b2YgZmlsZS4gSWYgdGhlcmUgaXNuJ3QgYSBuZXdsaW5lIGF0IHRoZSBlbmQsCisJICogYW55 IGNoYXJhY3RlcnMgYWZ0ZXIgdGhlIGxhc3QgbmV3bGluZSB3aWxsIGJlIGlnbm9yZWQuCisJ ICovCisJbmxpbmVzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJeworCQlp ZiAoYnVmZmVyW2ldID09ICdcbicpCisJCQlubGluZXMrKzsKKwl9CisKKwkvKiBzZXQgdXAg dGhlIHJlc3VsdCBidWZmZXIgKi8KKwlyZXN1bHQgPSAoY2hhciAqKikgcGdfbWFsbG9jKChu bGluZXMgKyAxKSAqIHNpemVvZihjaGFyICopKTsKKwkqbnVtbGluZXMgPSBubGluZXM7CisK KwkvKiBub3cgc3BsaXQgdGhlIGJ1ZmZlciBpbnRvIGxpbmVzICovCisJbGluZWJlZ2luID0g YnVmZmVyOworCW4gPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwl7CisJCWlm IChidWZmZXJbaV0gPT0gJ1xuJykKKwkJeworCQkJaW50CQkJc2xlbiA9ICZidWZmZXJbaV0g LSBsaW5lYmVnaW47CisJCQljaGFyCSAgICpsaW5lYnVmID0gcGdfbWFsbG9jKHNsZW4gKyAx KTsKKworCQkJbWVtY3B5KGxpbmVidWYsIGxpbmViZWdpbiwgc2xlbik7CisJCQkvKiB3ZSBh bHJlYWR5IGRyb3BwZWQgdGhlIFxuLCBidXQgZ2V0IHJpZCBvZiBhbnkgXHIgdG9vICovCisJ CQlpZiAoc2xlbiA+IDAgJiYgbGluZWJ1ZltzbGVuIC0gMV0gPT0gJ1xyJykKKwkJCQlzbGVu LS07CisJCQlsaW5lYnVmW3NsZW5dID0gJ1wwJzsKKwkJCXJlc3VsdFtuKytdID0gbGluZWJ1 ZjsKKwkJCWxpbmViZWdpbiA9ICZidWZmZXJbaSArIDFdOworCQl9CisJfQorCXJlc3VsdFtu XSA9IE5VTEw7CisKKwlmcmVlKGJ1ZmZlcik7CisKKwlyZXR1cm4gcmVzdWx0OworfQorCisK Ky8qCisgKiBGcmVlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIG9wdGxpbmVzIHRocm91Z2ggcmVh ZGZpbGUoKQorICovCit2b2lkCitmcmVlX3JlYWRmaWxlKGNoYXIgKipvcHRsaW5lcykKK3sK KwljaGFyCSAgICpjdXJyX2xpbmUgPSBOVUxMOworCWludAkJCWkgPSAwOworCisJaWYgKCFv cHRsaW5lcykKKwkJcmV0dXJuOworCisJd2hpbGUgKChjdXJyX2xpbmUgPSBvcHRsaW5lc1tp KytdKSkKKwkJZnJlZShjdXJyX2xpbmUpOworCisJZnJlZShvcHRsaW5lcyk7Cit9CisKICNl bmRpZgkJCQkJCQkvKiBGUk9OVEVORCAqLwogCiAvKgpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1 ZGUvY29tbW9uL2ZpbGVfdXRpbHMuaCBiL3NyYy9pbmNsdWRlL2NvbW1vbi9maWxlX3V0aWxz LmgKaW5kZXggMjgxMTc0NGMxMi4uMjc3MzZlM2RkNyAxMDA2NDQKLS0tIGEvc3JjL2luY2x1 ZGUvY29tbW9uL2ZpbGVfdXRpbHMuaAorKysgYi9zcmMvaW5jbHVkZS9jb21tb24vZmlsZV91 dGlscy5oCkBAIC0zMCw2ICszMCw5IEBAIGV4dGVybiB2b2lkIGZzeW5jX3BnZGF0YShjb25z dCBjaGFyICpwZ19kYXRhLCBpbnQgc2VydmVyVmVyc2lvbik7CiBleHRlcm4gdm9pZCBmc3lu Y19kaXJfcmVjdXJzZShjb25zdCBjaGFyICpkaXIpOwogZXh0ZXJuIGludAlkdXJhYmxlX3Jl bmFtZShjb25zdCBjaGFyICpvbGRmaWxlLCBjb25zdCBjaGFyICpuZXdmaWxlKTsKIGV4dGVy biBpbnQJZnN5bmNfcGFyZW50X3BhdGgoY29uc3QgY2hhciAqZm5hbWUpOworCitleHRlcm4g Y2hhciAqKnJlYWRmaWxlKGNvbnN0IGNoYXIgKnBhdGgsIGludCAqbnVtbGluZXMpOworZXh0 ZXJuIHZvaWQgZnJlZV9yZWFkZmlsZShjaGFyICoqb3B0bGluZXMpOwogI2VuZGlmCiAKIGV4 dGVybiBQR0ZpbGVUeXBlIGdldF9kaXJlbnRfdHlwZShjb25zdCBjaGFyICpwYXRoLAotLSAK Mi4zMC4yCgo= --e6195eae3ac747b7a59e5b5e0808269d Content-Disposition: attachment;filename="v1-0002-Create-a-new-logical-replica-from-a-base-backup-o.patch" Content-Type: text/x-patch; name="v1-0002-Create-a-new-logical-replica-from-a-base-backup-o.patch" Content-Transfer-Encoding: BASE64 RnJvbSA4MTc4OGRlMTU4YWJiZTFmZmIzNzhmZmIwODg0Yjk0MzIzMmU1MWIwIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBFdWxlciBUYXZlaXJhIDxldWxlci50YXZlaXJhQGVu dGVycHJpc2VkYi5jb20+CkRhdGU6IEZyaSwgMTEgRmViIDIwMjIgMDM6MTc6NTcgLTAzMDAK U3ViamVjdDogW1BBVENIIHYxIDIvMl0gQ3JlYXRlIGEgbmV3IGxvZ2ljYWwgcmVwbGljYSBm cm9tIGEgYmFzZSBiYWNrdXAgb3IKIHN0YW5kYnkgc2VydmVyLgoKQSBuZXcgdG9vbCBjYWxs ZWQgcGdfc3Vic2NyaWJlciBjYW4gY29udmVydCBhIHBoeXNpY2FsIHJlcGxpY2Egb3IgYSBi YXNlCmJhY2t1cCBpbnRvIGEgbG9naWNhbCByZXBsaWNhLiBJdCBydW5zIG9uIHRoZSB0YXJn ZXQgc2VydmVyIGFuZCBzaG91bGQKYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoZSBzb3VyY2Ug c2VydmVyIChwdWJsaXNoZXIpIGFuZCB0aGUgdGFyZ2V0CnNlcnZlciAoc3Vic2NyaWJlciku CgpUaGUgY29udmVyc2lvbiByZXF1aXJlcyBlaWdodCBzdGVwcy4gQ2hlY2sgaWYgdGhlIHRh cmdldCBkYXRhIGRpcmVjdG9yeQpoYSB0aGUgc2FtZSBzeXN0ZW0gaWRlbnRpZmllciB0aGFu IHRoZSBzb3VyY2UgZGF0YSBkaXJlY3RvcnkuIFN0b3AgdGhlCnRhcmdldCBzZXJ2ZXIgaWYg aXQgaXMgcnVubmluZyBhcyBhIHN0YW5kYnkgc2VydmVyLiBDcmVhdGUgb25lCnJlcGxpY2F0 aW9uIHNsb3QgcGVyIHNwZWNpZmllZCBkYXRhYmFzZSBvbiB0aGUgc291cmNlIHNlcnZlci4g T25lCmFkZGl0aW9uYWwgcmVwbGljYXRpb24gc2xvdCBpcyBjcmVhdGVkIGF0IHRoZSBlbmQg dG8gZ2V0IHRoZSBjb25zaXN0ZW50CkxTTiAoVGhpcyBjb25zaXN0ZW50IExTTiB3aWxsIGJl IHVzZWQgYXMgKGEpIGEgc3RvcHBpbmcgcG9pbnQgZm9yIHRoZQpyZWNvdmVyeSBwcm9jZXNz IGFuZCAoYikgYSBzdGFydGluZyBwb2ludCBmb3IgdGhlIHN1YnNjcmlwdGlvbnMpLiBXcml0 ZQpyZWNvdmVyeSBwYXJhbWV0ZXJzIGludG8gdGhlIHRhcmdldCBkYXRhIGRpcmVjdG9yeSBh bmQgc3RhcnQgdGhlIHRhcmdldApzZXJ2ZXIgKFdhaXQgdW50aWwgdGhlIHRhcmdldCBzZXJ2 ZXIgaXMgcHJvbW90ZWQpLiBDcmVhdGUgb25lCnB1YmxpY2F0aW9uIChGT1IgQUxMIFRBQkxF UykgcGVyIHNwZWNpZmllZCBkYXRhYmFzZSBvbiB0aGUgc291cmNlCnNlcnZlci4gQ3JlYXRl IG9uZSBzdWJzY3JpcHRpb24gcGVyIHNwZWNpZmllZCBkYXRhYmFzZSBvbiB0aGUgdGFyZ2V0 CnNlcnZlciAoVXNlIHJlcGxpY2F0aW9uIHNsb3QgYW5kIHB1YmxpY2F0aW9uIGNyZWF0ZWQg aW4gYSBwcmV2aW91cyBzdGVwLgpEb24ndCBlbmFibGUgdGhlIHN1YnNjcmlwdGlvbnMgeWV0 KS4gU2V0cyB0aGUgcmVwbGljYXRpb24gcHJvZ3Jlc3MgdG8KdGhlIGNvbnNpc3RlbnQgTFNO IHRoYXQgd2FzIGdvdCBpbiBhIHByZXZpb3VzIHN0ZXAuIEVuYWJsZSB0aGUKc3Vic2NyaXB0 aW9uIGZvciBlYWNoIHNwZWNpZmllZCBkYXRhYmFzZSBvbiB0aGUgdGFyZ2V0IHNlcnZlci4K CkRlcGVuZGluZyBvbiB5b3VyIHdvcmtsb2FkIGFuZCBkYXRhYmFzZSBzaXplLCBjcmVhdGlu ZyBhIGxvZ2ljYWwgcmVwbGljYQpjb3VsZG4ndCBiZSBhbiBvcHRpb24gZHVlIHRvIHJlc291 cmNlIGNvbnRyYWludHMgKFdBTCBiYWNrbG9nIHNob3VsZCBiZQphdmFpbGFibGUgdW50aWwg YWxsIHRhYmxlIGRhdGEgaXMgc3luY2hyb25pemVkKS4gVGhlIGluaXRpYWwgZGF0YSBjb3B5 CmFuZCB0aGUgcmVwbGljYXRpb24gcHJvZ3Jlc3MgdGVuZHMgdG8gYmUgZmFzdGVyIG9uIGEg cGh5c2ljYWwgcmVwbGljYS4KVGhlIHB1cnBvc2Ugb2YgdGhpcyB0b29sIGlzIHRvIHNwZWVk IHVwIGEgbG9naWNhbCByZXBsaWNhIHNldHVwLgotLS0KIGRvYy9zcmMvc2dtbC9yZWYvYWxs ZmlsZXMuc2dtbCAgICAgICAgfCAgICAxICsKIGRvYy9zcmMvc2dtbC9yZWYvcGdfc3Vic2Ny aWJlci5zZ21sICAgfCAgMjQyICsrKysKIGRvYy9zcmMvc2dtbC9yZWZlcmVuY2Uuc2dtbCAg ICAgICAgICAgfCAgICAxICsKIHNyYy9iaW4vTWFrZWZpbGUgICAgICAgICAgICAgICAgICAg ICAgfCAgICAxICsKIHNyYy9iaW4vcGdfc3Vic2NyaWJlci9NYWtlZmlsZSAgICAgICAgfCAg IDM5ICsKIHNyYy9iaW4vcGdfc3Vic2NyaWJlci9wZ19zdWJzY3JpYmVyLmMgfCAxNDYzICsr KysrKysrKysrKysrKysrKysrKysrKysKIHNyYy9iaW4vcGdfc3Vic2NyaWJlci90LzAwMV9i YXNpYy5wbCAgfCAgIDQxICsKIHNyYy90b29scy9tc3ZjL01rdmNidWlsZC5wbSAgICAgICAg ICAgfCAgICAyICstCiA4IGZpbGVzIGNoYW5nZWQsIDE3ODkgaW5zZXJ0aW9ucygrKSwgMSBk ZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRvYy9zcmMvc2dtbC9yZWYvcGdfc3Vi c2NyaWJlci5zZ21sCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2Jpbi9wZ19zdWJzY3JpYmVy L01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL2Jpbi9wZ19zdWJzY3JpYmVyL3Bn X3N1YnNjcmliZXIuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IHNyYy9iaW4vcGdfc3Vic2NyaWJl ci90LzAwMV9iYXNpYy5wbAoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9yZWYvYWxsZmls ZXMuc2dtbCBiL2RvYy9zcmMvc2dtbC9yZWYvYWxsZmlsZXMuc2dtbAppbmRleCBkNjcyNzBj Y2MzLi5lYWI3ZjJmNjE2IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvcmVmL2FsbGZpbGVz LnNnbWwKKysrIGIvZG9jL3NyYy9zZ21sL3JlZi9hbGxmaWxlcy5zZ21sCkBAIC0yMTIsNiAr MjEyLDcgQEAgQ29tcGxldGUgbGlzdCBvZiB1c2FibGUgc2dtbCBzb3VyY2UgZmlsZXMgaW4g dGhpcyBkaXJlY3RvcnkuCiA8IUVOVElUWSBwZ1Jlc2V0d2FsICAgICAgICAgU1lTVEVNICJw Z19yZXNldHdhbC5zZ21sIj4KIDwhRU5USVRZIHBnUmVzdG9yZSAgICAgICAgICBTWVNURU0g InBnX3Jlc3RvcmUuc2dtbCI+CiA8IUVOVElUWSBwZ1Jld2luZCAgICAgICAgICAgU1lTVEVN ICJwZ19yZXdpbmQuc2dtbCI+Cis8IUVOVElUWSBwZ1N1YnNjcmliZXIgICAgICAgU1lTVEVN ICJwZ19zdWJzY3JpYmVyLnNnbWwiPgogPCFFTlRJVFkgcGdWZXJpZnlCYWNrdXAgICAgIFNZ U1RFTSAicGdfdmVyaWZ5YmFja3VwLnNnbWwiPgogPCFFTlRJVFkgcGd0ZXN0ZnN5bmMgICAg ICAgIFNZU1RFTSAicGd0ZXN0ZnN5bmMuc2dtbCI+CiA8IUVOVElUWSBwZ3Rlc3R0aW1pbmcg ICAgICAgU1lTVEVNICJwZ3Rlc3R0aW1pbmcuc2dtbCI+CmRpZmYgLS1naXQgYS9kb2Mvc3Jj L3NnbWwvcmVmL3BnX3N1YnNjcmliZXIuc2dtbCBiL2RvYy9zcmMvc2dtbC9yZWYvcGdfc3Vi c2NyaWJlci5zZ21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLmU2 OGExOTA5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2Mvc3JjL3NnbWwvcmVmL3BnX3N1YnNj cmliZXIuc2dtbApAQCAtMCwwICsxLDI0MiBAQAorPCEtLQorZG9jL3NyYy9zZ21sL3JlZi9w Z19zdWJzY3JpYmVyLnNnbWwKK1Bvc3RncmVTUUwgZG9jdW1lbnRhdGlvbgorLS0+CisKKzxy ZWZlbnRyeSBpZD0iYXBwLXBnc3Vic2NyaWJlciI+CisgPGluZGV4dGVybSB6b25lPSJhcHAt cGdzdWJzY3JpYmVyIj4KKyAgPHByaW1hcnk+cGdfc3Vic2NyaWJlcjwvcHJpbWFyeT4KKyA8 L2luZGV4dGVybT4KKworIDxyZWZtZXRhPgorICA8cmVmZW50cnl0aXRsZT48YXBwbGljYXRp b24+cGdfc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+PC9yZWZlbnRyeXRpdGxlPgorICA8bWFu dm9sbnVtPjE8L21hbnZvbG51bT4KKyAgPHJlZm1pc2NpbmZvPkFwcGxpY2F0aW9uPC9yZWZt aXNjaW5mbz4KKyA8L3JlZm1ldGE+CisKKyA8cmVmbmFtZWRpdj4KKyAgPHJlZm5hbWU+cGdf c3Vic2NyaWJlcjwvcmVmbmFtZT4KKyAgPHJlZnB1cnBvc2U+Y3JlYXRlIGEgbmV3IGxvZ2lj YWwgcmVwbGljYSBmcm9tIGEgYmFzZSBiYWNrdXAgb2YgYQorICA8cHJvZHVjdG5hbWU+UG9z dGdyZVNRTDwvcHJvZHVjdG5hbWU+IGNsdXN0ZXIgb3IgYSBzdGFuZGJ5CisgIHNlcnZlcjwv cmVmcHVycG9zZT4KKyA8L3JlZm5hbWVkaXY+CisKKyA8cmVmc3lub3BzaXNkaXY+CisgIDxj bWRzeW5vcHNpcz4KKyAgIDxjb21tYW5kPnBnX3N1YnNjcmliZXI8L2NvbW1hbmQ+CisgICA8 YXJnIHJlcD0icmVwZWF0Ij48cmVwbGFjZWFibGU+b3B0aW9uPC9yZXBsYWNlYWJsZT48L2Fy Zz4KKyAgPC9jbWRzeW5vcHNpcz4KKyA8L3JlZnN5bm9wc2lzZGl2PgorCisgPHJlZnNlY3Qx PgorICA8dGl0bGU+RGVzY3JpcHRpb248L3RpdGxlPgorICA8cGFyYT4KKyAgIDxhcHBsaWNh dGlvbj5wZ19zdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4gdGFrZXMgdGhlIHB1Ymxpc2hlciBh bmQgc3Vic2NyaWJlcgorICAgY29ubmVjdGlvbiBzdHJpbmdzLCBhIGJhc2UgYmFja3VwIGRp cmVjdG9yeSBhbmQgYSBsaXN0IG9mIGRhdGFiYXNlIG5hbWVzIGFuZAorICAgaXQgc2V0cyB1 cCBhIG5ldyBsb2dpY2FsIHJlcGxpY2EgdXNpbmcgdGhlIHBoeXNpY2FsIHJlY292ZXJ5IHBy b2Nlc3MuIEEKKyAgIHN0YW5kYnkgc2VydmVyIGNhbiBhbHNvIGJlIHVzZWQuCisgIDwvcGFy YT4KKworICA8cGFyYT4KKyAgIFRoZSA8YXBwbGljYXRpb24+cGdfc3Vic2NyaWJlcjwvYXBw bGljYXRpb24+IHNob3VsZCBiZSBydW4gYXQgdGhlIHRhcmdldAorICAgc2VydmVyLiBUaGUg c291cmNlIHNlcnZlciAoa25vd24gYXMgcHVibGlzaGVyIHNlcnZlcikgc2hvdWxkIGFjY2Vw dCBsb2dpY2FsCisgICByZXBsaWNhdGlvbiBjb25uZWN0aW9ucyBmcm9tIHRoZSB0YXJnZXQg c2VydmVyIChrbm93biBhcyBzdWJzY3JpYmVyIHNlcnZlcikuCisgICBUaGUgdGFyZ2V0IHNl cnZlciBzaG91bGQgYWNjZXB0IGxvY2FsIGxvZ2ljYWwgcmVwbGljYXRpb24gY29ubmVjdGlv bi4KKyAgPC9wYXJhPgorCisgIDxwYXJhPgorICAgVGhlIHRyYW5zZm9ybWF0aW9uIHByb2Nl ZWRzIGluIGVpZ2h0IHN0ZXBzLiBGaXJzdCwKKyAgIDxhcHBsaWNhdGlvbj5wZ19zdWJzY3Jp YmVyPC9hcHBsaWNhdGlvbj4gY2hlY2tzIGlmIHRoZSBnaXZlbiB0YXJnZXQgZGF0YQorICAg ZGlyZWN0b3J5IGhhcyB0aGUgc2FtZSBzeXN0ZW0gaWRlbnRpZmllciB0aGFuIHRoZSBzb3Vy Y2UgZGF0YSBkaXJlY3RvcnkuCisgICBTaW5jZSBpdCB1c2VzIHRoZSByZWNvdmVyeSBwcm9j ZXNzIGFzIG9uZSBvZiB0aGUgc3RlcHMsIGl0IHN0YXJ0cyB0aGUgdGFyZ2V0CisgICBzZXJ2 ZXIgYXMgYSByZXBsaWNhIGZyb20gdGhlIHNvdXJjZSBzZXJ2ZXIuIElmIHRoZSBzeXN0ZW0g aWRlbnRpZmllciBpcyBub3QKKyAgIHRoZSBzYW1lLCA8YXBwbGljYXRpb24+cGdfc3Vic2Ny aWJlcjwvYXBwbGljYXRpb24+IHdpbGwgdGVybWluYXRlIHdpdGggYW4KKyAgIGVycm9yLgor ICA8L3BhcmE+CisKKyAgPHBhcmE+CisgICBTZWNvbmQsIDxhcHBsaWNhdGlvbj5wZ19zdWJz Y3JpYmVyPC9hcHBsaWNhdGlvbj4gY2hlY2tzIGlmIHRoZSB0YXJnZXQgZGF0YQorICAgZGly ZWN0b3J5IGlzIHVzZWQgYnkgYSBzdGFuZGJ5IHNlcnZlci4gU3RvcCB0aGUgc3RhbmRieSBz ZXJ2ZXIgaWYgaXQgaXMKKyAgIHJ1bm5pbmcuIE9uZSBvZiB0aGUgbmV4dCBzdGVwcyBpcyB0 byBhZGQgc29tZSByZWNvdmVyeSBwYXJhbWV0ZXJzIHRoYXQKKyAgIHJlcXVpcmVzIGEgc2Vy dmVyIHN0YXJ0LiBUaGlzIHN0ZXAgYXZvaWRzIGFuIGVycm9yLgorICA8L3BhcmE+CisKKyAg PHBhcmE+CisgICBOZXh0LCA8YXBwbGljYXRpb24+cGdfc3Vic2NyaWJlcjwvYXBwbGljYXRp b24+IGNyZWF0ZXMgb25lIHJlcGxpY2F0aW9uIHNsb3QKKyAgIGZvciBlYWNoIHNwZWNpZmll ZCBkYXRhYmFzZSBvbiB0aGUgc291cmNlIHNlcnZlci4gVGhlIHJlcGxpY2F0aW9uIHNsb3Qg bmFtZQorICAgY29udGFpbnMgYSA8bGl0ZXJhbD5wZ19zdWJzY3JpYmVyPC9saXRlcmFsPiBw cmVmaXguIFRoZXNlIHJlcGxpY2F0aW9uIHNsb3RzCisgICB3aWxsIGJlIHVzZWQgYnkgdGhl IHN1YnNjcmlwdGlvbnMgaW4gYSBmdXR1cmUgc3RlcC4gIEFub3RoZXIgcmVwbGljYXRpb24K KyAgIHNsb3QgaXMgdXNlZCB0byBnZXQgYSBjb25zaXN0ZW50IHN0YXJ0IGxvY2F0aW9uLiBU aGlzIGNvbnNpc3RlbnQgTFNOIHdpbGwgYmUKKyAgIHVzZWQgKGEpIGFzIGEgc3RvcHBpbmcg cG9pbnQgaW4gdGhlIDx4cmVmCisgICBsaW5rZW5kPSJndWMtcmVjb3ZlcnktdGFyZ2V0LWxz biIvPiBwYXJhbWV0ZXIgYW5kIChiKSBieSB0aGUgc3Vic2NyaXB0aW9ucworICAgYXMgYSBy ZXBsaWNhdGlvbiBzdGFydGluZyBwb2ludC4gSXQgZ3VhcmFudGVlcyB0aGF0IG5vIHRyYW5z YWN0aW9uIHdpbGwgYmUKKyAgIGxvc3QuCisgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgIE5l eHQsIHdyaXRlIHJlY292ZXJ5IHBhcmFtZXRlcnMgaW50byB0aGUgdGFyZ2V0IGRhdGEgZGly ZWN0b3J5IGFuZCBzdGFydCB0aGUKKyAgIHRhcmdldCBzZXJ2ZXIuIEl0IHNwZWNpZmllcyBh IExTTiAoY29uc2lzdGVudCBMU04gdGhhdCB3YXMgb2J0YWluZWQgaW4gdGhlCisgICBwcmV2 aW91cyBzdGVwKSBvZiB3cml0ZS1haGVhZCBsb2cgbG9jYXRpb24gdXAgdG8gd2hpY2ggcmVj b3Zlcnkgd2lsbAorICAgcHJvY2VlZC4gSXQgYWxzbyBzcGVjaWZpZXMgPGxpdGVyYWw+cHJv bW90ZTwvbGl0ZXJhbD4gYXMgdGhlIGFjdGlvbiB0aGF0IHRoZQorICAgc2VydmVyIHNob3Vs ZCB0YWtlIG9uY2UgdGhlIHJlY292ZXJ5IHRhcmdldCBpcyByZWFjaGVkLiBUaGlzIHN0ZXAg ZmluaXNoZXMKKyAgIG9uY2UgdGhlIHNlcnZlciBlbmRzIHN0YW5kYnkgbW9kZSBhbmQgaXMg YWNjZXB0aW5nIHJlYWQtd3JpdGUgb3BlcmF0aW9ucy4KKyAgPC9wYXJhPgorCisgIDxwYXJh PgorICAgTmV4dCwgPGFwcGxpY2F0aW9uPnBnX3N1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiBj cmVhdGVzIG9uZSBwdWJsaWNhdGlvbiBmb3IKKyAgIGVhY2ggc3BlY2lmaWVkIGRhdGFiYXNl IG9uIHRoZSBzb3VyY2Ugc2VydmVyLiBFYWNoIHB1YmxpY2F0aW9uIHJlcGxpY2F0ZXMKKyAg IGNoYW5nZXMgZm9yIGFsbCB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlLiBUaGUgcHVibGljYXRp b24gbmFtZSBjb250YWlucyBhCisgICA8bGl0ZXJhbD5wZ19zdWJzY3JpYmVyPC9saXRlcmFs PiBwcmVmaXguIFRoZXNlIHB1YmxpY2F0aW9uIHdpbGwgYmUgdXNlZCBieSBhCisgICBjb3Jy ZXNwb25kaW5nIHN1YnNjcmlwdGlvbiBpbiBhIG5leHQgc3RlcC4KKyAgPC9wYXJhPgorCisg IDxwYXJhPgorICAgTmV4dCwgPGFwcGxpY2F0aW9uPnBnX3N1YnNjcmliZXI8L2FwcGxpY2F0 aW9uPiBjcmVhdGVzIG9uZSBzdWJzY3JpcHRpb24gZm9yCisgICBlYWNoIHNwZWNpZmllZCBk YXRhYmFzZSBvbiB0aGUgdGFyZ2V0IHNlcnZlci4gRWFjaCBzdWJzY3JpcHRpb24gbmFtZQor ICAgY29udGFpbnMgYSA8bGl0ZXJhbD5wZ19zdWJzY3JpYmVyPC9saXRlcmFsPiBwcmVmaXgu IFRoZSByZXBsaWNhdGlvbiBzbG90CisgICBuYW1lIGlzIGlkZW50aWNhbCB0byB0aGUgc3Vi c2NyaXB0aW9uIG5hbWUuIEl0IGFsc28gZG9lcyBub3QgY29weSBleGlzdGluZworICAgZGF0 YSBmcm9tIHRoZSBzb3VyY2Ugc2VydmVyLiBJdCBkb2VzIG5vdCBjcmVhdGUgYSByZXBsaWNh dGlvbiBzbG90LiBJbnN0ZWFkLAorICAgaXQgdXNlcyB0aGUgcmVwbGljYXRpb24gc2xvdCB0 aGF0IHdhcyBjcmVhdGVkIGluIGEgcHJldmlvdXMgc3RlcC4gVGhlCisgICBzdWJzY3JpcHRp b24gaXMgY3JlYXRlZCBidXQgaXQgaXMgbm90IGVuYWJsZWQgeWV0LiBUaGUgcmVhc29uIGlz IHRoZQorICAgcmVwbGljYXRpb24gcHJvZ3Jlc3MgbXVzdCBiZSBzZXQgdG8gdGhlIGNvbnNp c3RlbnQgTFNOIGJ1dCByZXBsaWNhdGlvbgorICAgb3JpZ2luIG5hbWUgY29udGFpbnMgdGhl IHN1YnNjcmlwdGlvbiBvaWQgaW4gaXRzIG5hbWUuIEhlbmNlLCB0aGUKKyAgIHN1YnNjcmlw dGlvbiB3aWxsIGJlIGVuYWJsZWQgaW4gYSBzZXBhcmF0ZSBzdGVwLgorICA8L3BhcmE+CisK KyAgPHBhcmE+CisgICBOZXh0LCA8YXBwbGljYXRpb24+cGdfc3Vic2NyaWJlcjwvYXBwbGlj YXRpb24+IHNldHMgdGhlIHJlcGxpY2F0aW9uIHByb2dyZXNzCisgICB0byB0aGUgY29uc2lz dGVudCBMU04gdGhhdCB3YXMgb2J0YWluZWQgaW4gYSBwcmV2aW91cyBzdGVwLiBXaGVuIHRo ZSB0YXJnZXQKKyAgIHNlcnZlciBzdGFydGVkIHRoZSByZWNvdmVyeSBwcm9jZXNzLCBpdCBj YXVnaHQgdXAgdG8gdGhlIGNvbnNpc3RlbnQgTFNOLgorICAgVGhpcyBpcyB0aGUgZXhhY3Qg TFNOIHRvIGJlIHVzZWQgYXMgYSBpbml0aWFsIGxvY2F0aW9uIGZvciB0aGUgbG9naWNhbAor ICAgcmVwbGljYXRpb24uCisgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgIEZpbmFsbHksIDxh cHBsaWNhdGlvbj5wZ19zdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4gZW5hYmxlcyB0aGUgc3Vi c2NyaXB0aW9uCisgICBmb3IgZWFjaCBzcGVjaWZpZWQgZGF0YWJhc2Ugb24gdGhlIHRhcmdl dCBzZXJ2ZXIuIFRoZSBzdWJzY3JpcHRpb24gc3RhcnRzCisgICBzdHJlYW1pbmcgZnJvbSB0 aGUgY29uc2lzdGVudCBMU04uCisgIDwvcGFyYT4KKyA8L3JlZnNlY3QxPgorCisgPHJlZnNl Y3QxPgorICA8dGl0bGU+T3B0aW9uczwvdGl0bGU+CisKKyAgIDxwYXJhPgorICAgIDxhcHBs aWNhdGlvbj5wZ19zdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4gYWNjZXB0cyB0aGUgZm9sbG93 aW5nCisgICAgY29tbWFuZC1saW5lIGFyZ3VtZW50czoKKworICAgIDx2YXJpYWJsZWxpc3Q+ CisgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICA8dGVybT48b3B0aW9uPi1EIDxyZXBsYWNl YWJsZSBjbGFzcz0icGFyYW1ldGVyIj5kaXJlY3Rvcnk8L3JlcGxhY2VhYmxlPjwvb3B0aW9u PjwvdGVybT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LS1wZ2RhdGE9PHJlcGxhY2VhYmxlIGNs YXNzPSJwYXJhbWV0ZXIiPmRpcmVjdG9yeTwvcmVwbGFjZWFibGU+PC9vcHRpb24+PC90ZXJt PgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBUaGUgdGFyZ2V0 IGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGEgYmFzZSBiYWNrdXAuIEl0IGNhbiBhbHNvIGJl IGEKKyAgICAgICAgY2x1c3RlciBkaXJlY3RvcnkgZnJvbSBhIHN0YW5kYnkgc2VydmVyLgor ICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlzdGVudHJ5 PgorICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgPHRlcm0+PG9wdGlvbj4tUCAgPHJlcGxh Y2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmNvbm5pbmZvPC9yZXBsYWNlYWJsZT48L29wdGlv bj48L3Rlcm0+CisgICAgICA8dGVybT48b3B0aW9uPi0tcHVibGlzaGVyLWNvbm5pbmZvPTxy ZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jb25uaW5mbzwvcmVwbGFjZWFibGU+PC9v cHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAg ICBUaGUgY29ubmVjdGlvbiBzdHJpbmcgdG8gdGhlIHB1Ymxpc2hlci4gRm9yIGRldGFpbHMg c2VlIDx4cmVmIGxpbmtlbmQ9ImxpYnBxLWNvbm5zdHJpbmciLz4uCisgICAgICAgPC9wYXJh PgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgIDx2YXJs aXN0ZW50cnk+CisgICAgICA8dGVybT48b3B0aW9uPi1TIDxyZXBsYWNlYWJsZSBjbGFzcz0i cGFyYW1ldGVyIj5jb25uaW5mbzwvcmVwbGFjZWFibGU+PC9vcHRpb24+PC90ZXJtPgorICAg ICAgPHRlcm0+PG9wdGlvbj4tLXN1YnNjcmliZXItY29ubmluZm89PHJlcGxhY2VhYmxlIGNs YXNzPSJwYXJhbWV0ZXIiPmNvbm5pbmZvPC9yZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+ CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIFRoZSBjb25uZWN0 aW9uIHN0cmluZyB0byB0aGUgc3Vic2NyaWJlci4gRm9yIGRldGFpbHMgc2VlIDx4cmVmIGxp bmtlbmQ9ImxpYnBxLWNvbm5zdHJpbmciLz4uCisgICAgICAgPC9wYXJhPgorICAgICAgPC9s aXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgIDx2YXJsaXN0ZW50cnk+Cisg ICAgICA8dGVybT48b3B0aW9uPi1kIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5k Ym5hbWU8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDx0ZXJtPjxvcHRp b24+LS1kYXRhYmFzZT08cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+ZGJuYW1lPC9y ZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAg PHBhcmE+CisgICAgICAgIFRoZSBkYXRhYmFzZSBuYW1lIHRvIGNyZWF0ZSB0aGUgc3Vic2Ny aXB0aW9uLiBNdWx0aXBsZSBkYXRhYmFzZXMgY2FuIGJlCisgICAgICAgIHNlbGVjdGVkIGJ5 IHdyaXRpbmcgbXVsdGlwbGUgPG9wdGlvbj4tZDwvb3B0aW9uPiBzd2l0Y2hlcy4KKyAgICAg ICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKwor ICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgPHRlcm0+PG9wdGlvbj4tdjwvb3B0aW9uPjwv dGVybT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LS12ZXJib3NlPC9vcHRpb24+PC90ZXJtPgor ICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgICBFbmFibGVzIHZlcmJv c2UgbW9kZS4gVGhpcyB3aWxsIGNhdXNlCisgICAgICAgIDxhcHBsaWNhdGlvbj5wZ19zdWJz Y3JpYmVyPC9hcHBsaWNhdGlvbj4gdG8gb3V0cHV0IHByb2dyZXNzIG1lc3NhZ2VzCisgICAg ICAgIGFuZCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHN0ZXAuCisgICAgICAg PC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+CisgICAg PC92YXJpYWJsZWxpc3Q+CisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgIE90aGVyIG9w dGlvbnMgYXJlIGFsc28gYXZhaWxhYmxlOgorCisgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAg PHZhcmxpc3RlbnRyeT4KKyAgICAgICA8dGVybT48b3B0aW9uPi1WPC9vcHRpb24+PC90ZXJt PgorICAgICAgIDx0ZXJtPjxvcHRpb24+LS12ZXJzaW9uPC9vcHRpb24+PC90ZXJtPgorICAg ICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICBQcmludCB0aGUgPGFwcGxp Y2F0aW9uPnBnX3N1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiB2ZXJzaW9uIGFuZCBleGl0Lgor ICAgICAgIDwvcGFyYT4KKyAgICAgICA8L2xpc3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRy eT4KKworICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgIDx0ZXJtPjxvcHRpb24+LT88L29w dGlvbj48L3Rlcm0+CisgICAgICAgPHRlcm0+PG9wdGlvbj4tLWhlbHA8L29wdGlvbj48L3Rl cm0+CisgICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxwYXJhPgorICAgICAgIFNob3cgaGVs cCBhYm91dCA8YXBwbGljYXRpb24+cGdfc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IGNvbW1h bmQKKyAgICAgICBsaW5lIGFyZ3VtZW50cywgYW5kIGV4aXQuCisgICAgICAgPC9wYXJhPgor ICAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgPC92YXJp YWJsZWxpc3Q+CisgICA8L3BhcmE+CisKKyA8L3JlZnNlY3QxPgorCisgPHJlZnNlY3QxPgor ICA8dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgorCisgIDxwYXJhPgorICAgVG8gY3JlYXRlIGEg bG9naWNhbCByZXBsaWNhIGZvciBkYXRhYmFzZSA8bGl0ZXJhbD5iYXI8L2xpdGVyYWw+IGZy b20gYSBiYXNlCisgICBiYWNrdXAgb2YgdGhlIHNlcnZlciBhdCA8bGl0ZXJhbD5mb288L2xp dGVyYWw+OgorPHNjcmVlbj4KKzxwcm9tcHQ+JDwvcHJvbXB0PiA8dXNlcmlucHV0PnBnX2Jh c2ViYWNrdXAgLWggZm9vIC1EIC91c3IvbG9jYWwvcGdzcWwvZGF0YTwvdXNlcmlucHV0Pgor PHByb21wdD4kPC9wcm9tcHQ+IDx1c2VyaW5wdXQ+cGdfc3Vic2NyaWJlciAtRCAvdXNyL2xv Y2FsL3Bnc3FsL2RhdGEgLVAgImhvc3Q9Zm9vIiAtUyAiaG9zdD1sb2NhbGhvc3QiIC1kIGJh cjwvdXNlcmlucHV0PgorPC9zY3JlZW4+CisgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgIFRv IGNyZWF0ZSBhIGxvZ2ljYWwgcmVwbGljYSBmb3IgZGF0YWJhc2VzIDxsaXRlcmFsPmhyPC9s aXRlcmFsPiBhbmQKKyAgIDxsaXRlcmFsPmZpbmFuY2U8L2xpdGVyYWw+IGZyb20gYSBzdGFu ZGJ5IHNlcnZlciBhdCA8bGl0ZXJhbD5mb288L2xpdGVyYWw+OgorPHNjcmVlbj4KKzxwcm9t cHQ+JDwvcHJvbXB0PiA8dXNlcmlucHV0PnBnX3N1YnNjcmliZXIgLUQgL3Vzci9sb2NhbC9w Z3NxbC9kYXRhIC1QICJob3N0PWZvbyIgLVMgImhvc3Q9bG9jYWxob3N0IiAtZCBociAtZCBm aW5hbmNlPC91c2VyaW5wdXQ+Cis8L3NjcmVlbj4KKyAgPC9wYXJhPgorCisgPC9yZWZzZWN0 MT4KKworIDxyZWZzZWN0MT4KKyAgPHRpdGxlPlNlZSBBbHNvPC90aXRsZT4KKworICA8c2lt cGxlbGlzdCB0eXBlPSJpbmxpbmUiPgorICAgPG1lbWJlcj48eHJlZiBsaW5rZW5kPSJhcHAt cGdiYXNlYmFja3VwIi8+PC9tZW1iZXI+CisgIDwvc2ltcGxlbGlzdD4KKyA8L3JlZnNlY3Qx PgorCis8L3JlZmVudHJ5PgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21sL3JlZmVyZW5jZS5z Z21sIGIvZG9jL3NyYy9zZ21sL3JlZmVyZW5jZS5zZ21sCmluZGV4IGRhNDIxZmYyNGUuLjM1 NjZjNjA1MGMgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9yZWZlcmVuY2Uuc2dtbAorKysg Yi9kb2Mvc3JjL3NnbWwvcmVmZXJlbmNlLnNnbWwKQEAgLTI1Niw2ICsyNTYsNyBAQAogICAg JnBnUmVjZWl2ZXdhbDsKICAgICZwZ1JlY3Zsb2dpY2FsOwogICAgJnBnUmVzdG9yZTsKKyAg ICZwZ1N1YnNjcmliZXI7CiAgICAmcGdWZXJpZnlCYWNrdXA7CiAgICAmcHNxbFJlZjsKICAg ICZyZWluZGV4ZGI7CmRpZmYgLS1naXQgYS9zcmMvYmluL01ha2VmaWxlIGIvc3JjL2Jpbi9N YWtlZmlsZQppbmRleCA3ZjlkZGU5MjRlLi42YzRkM2MxZmZlIDEwMDY0NAotLS0gYS9zcmMv YmluL01ha2VmaWxlCisrKyBiL3NyYy9iaW4vTWFrZWZpbGUKQEAgLTI1LDYgKzI1LDcgQEAg U1VCRElSUyA9IFwKIAlwZ19kdW1wIFwKIAlwZ19yZXNldHdhbCBcCiAJcGdfcmV3aW5kIFwK KwlwZ19zdWJzY3JpYmVyIFwKIAlwZ190ZXN0X2ZzeW5jIFwKIAlwZ190ZXN0X3RpbWluZyBc CiAJcGdfdXBncmFkZSBcCmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX3N1YnNjcmliZXIvTWFr ZWZpbGUgYi9zcmMvYmluL3BnX3N1YnNjcmliZXIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uYzQ4ZGNhNmU0OQotLS0gL2Rldi9udWxsCisrKyBi L3NyYy9iaW4vcGdfc3Vic2NyaWJlci9NYWtlZmlsZQpAQCAtMCwwICsxLDM5IEBACisjIHNy Yy9iaW4vcGdfc3Vic2NyaWJlci9NYWtlZmlsZQorCitQR0ZJTEVERVNDID0gInBnX3N1YnNj cmliZXIgLSBjcmVhdGUgYSBuZXcgbG9naWNhbCByZXBsaWNhIGZyb20gYSBiYXNlIGJhY2t1 cCBvciBhIHN0YW5kYnkgc2VydmVyIgorUEdBUFBJQ09OPXdpbjMyCisKK3N1YmRpciA9IHNy Yy9iaW4vcGdfc3Vic2NyaWJlcgordG9wX2J1aWxkZGlyID0gLi4vLi4vLi4KK2luY2x1ZGUg JCh0b3BfYnVpbGRkaXIpL3NyYy9NYWtlZmlsZS5nbG9iYWwKKworb3ZlcnJpZGUgQ1BQRkxB R1MgOj0gLUkkKGxpYnBxX3NyY2RpcikgJChDUFBGTEFHUykKK0xERkxBR1NfSU5URVJOQUwg Kz0gLUwkKHRvcF9idWlsZGRpcikvc3JjL2ZlX3V0aWxzIC1scGdmZXV0aWxzICQobGlicHFf cGdwb3J0KQorCitPQkpTID0gXAorCSQoV0lOMzJSRVMpIFwKKwlwZ19zdWJzY3JpYmVyLm8K KworYWxsOiBwZ19zdWJzY3JpYmVyCisKK3BnX3N1YnNjcmliZXI6ICQoT0JKUykgfCBzdWJt YWtlLWxpYnBxIHN1Ym1ha2UtbGlicGdwb3J0IHN1Ym1ha2UtbGlicGdmZXV0aWxzCisJJChD QykgJChDRkxBR1MpICReICQoTERGTEFHUykgJChMREZMQUdTX0VYKSAkKExJQlMpIC1vICRA JChYKQorCitpbnN0YWxsOiBhbGwgaW5zdGFsbGRpcnMKKwkkKElOU1RBTExfUFJPR1JBTSkg cGdfc3Vic2NyaWJlciQoWCkgJyQoREVTVERJUikkKGJpbmRpcikvcGdfc3Vic2NyaWJlciQo WCknCisKK2luc3RhbGxkaXJzOgorCSQoTUtESVJfUCkgJyQoREVTVERJUikkKGJpbmRpcikn CisKK3VuaW5zdGFsbDoKKwlybSAtZiAnJChERVNURElSKSQoYmluZGlyKS9wZ19zdWJzY3Jp YmVyJChYKScKKworY2xlYW4gZGlzdGNsZWFuIG1haW50YWluZXItY2xlYW46CisJcm0gLWYg cGdfc3Vic2NyaWJlciQoWCkgJChPQkpTKQorCXJtIC1yZiB0bXBfY2hlY2sKKworY2hlY2s6 CisJJChwcm92ZV9jaGVjaykKKworaW5zdGFsbGNoZWNrOgorCSQocHJvdmVfaW5zdGFsbGNo ZWNrKQpkaWZmIC0tZ2l0IGEvc3JjL2Jpbi9wZ19zdWJzY3JpYmVyL3BnX3N1YnNjcmliZXIu YyBiL3NyYy9iaW4vcGdfc3Vic2NyaWJlci9wZ19zdWJzY3JpYmVyLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMC4uNzU2NTk1MGEwOAotLS0gL2Rldi9udWxsCisr KyBiL3NyYy9iaW4vcGdfc3Vic2NyaWJlci9wZ19zdWJzY3JpYmVyLmMKQEAgLTAsMCArMSwx NDYzIEBACisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBwZ19zdWJzY3JpYmVyLmMK KyAqCSAgQ3JlYXRlIGEgbmV3IGxvZ2ljYWwgcmVwbGljYSBmcm9tIGEgYmFzZSBiYWNrdXAg b3IgYSBzdGFuZGJ5IHNlcnZlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMiwgUG9zdGdy ZVNRTCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKyAqCisgKiBJREVOVElGSUNBVElPTgor ICoJCXNyYy9iaW4vcGdfc3Vic2NyaWJlci9wZ19zdWJzY3JpYmVyLmMKKyAqCisgKi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyAqLworI2luY2x1ZGUgInBvc3RncmVzX2ZlLmgiCisKKyNpbmNs dWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy93 YWl0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiY2F0YWxvZy9wZ19jb250 cm9sLmgiCisjaW5jbHVkZSAiY29tbW9uL2Nvbm5lY3QuaCIKKyNpbmNsdWRlICJjb21tb24v Y29udHJvbGRhdGFfdXRpbHMuaCIKKyNpbmNsdWRlICJjb21tb24vZmlsZV91dGlscy5oIgor I2luY2x1ZGUgImNvbW1vbi9sb2dnaW5nLmgiCisjaW5jbHVkZSAiZmVfdXRpbHMvcmVjb3Zl cnlfZ2VuLmgiCisjaW5jbHVkZSAiZmVfdXRpbHMvc2ltcGxlX2xpc3QuaCIKKyNpbmNsdWRl ICJnZXRvcHRfbG9uZy5oIgorI2luY2x1ZGUgInV0aWxzL3BpZGZpbGUuaCIKKwordHlwZWRl ZiBzdHJ1Y3QgTG9naWNhbFJlcEluZm8KK3sKKwlPaWQJCQlvaWQ7CQkJLyogZGF0YWJhc2Ug T0lEICovCisJY2hhcgkgICAqZGJuYW1lOwkJCS8qIGRhdGFiYXNlIG5hbWUgKi8KKwljaGFy CSAgICpwdWJjb25uaW5mbzsJLyogcHVibGljYXRpb24gY29ubmVjdGlvbiBzdHJpbmcgZm9y IGxvZ2ljYWwKKwkJCQkJCQkJICogcmVwbGljYXRpb24gKi8KKwljaGFyCSAgICpzdWJjb25u aW5mbzsJLyogc3Vic2NyaXB0aW9uIGNvbm5lY3Rpb24gc3RyaW5nIGZvciBsb2dpY2FsCisJ CQkJCQkJCSAqIHJlcGxpY2F0aW9uICovCisJY2hhcgkgICAqcHVibmFtZTsJCS8qIHB1Ymxp Y2F0aW9uIG5hbWUgKi8KKwljaGFyCSAgICpzdWJuYW1lOwkJLyogc3Vic2NyaXB0aW9uIG5h bWUgKGFsc28gcmVwbGljYXRpb24gc2xvdAorCQkJCQkJCQkgKiBuYW1lKSAqLworCisJYm9v bAkJbWFkZV9yZXBsc2xvdDsJCS8qIHJlcGxpY2F0aW9uIHNsb3Qgd2FzIGNyZWF0ZWQgKi8K Kwlib29sCQltYWRlX3B1YmxpY2F0aW9uOwkvKiBwdWJsaWNhdGlvbiB3YXMgY3JlYXRlZCAq LworCWJvb2wJCW1hZGVfc3Vic2NyaXB0aW9uOwkvKiBzdWJzY3JpcHRpb24gd2FzIGNyZWF0 ZWQgKi8KK30JCQlMb2dpY2FsUmVwSW5mbzsKKworc3RhdGljIHZvaWQgY2xlYW51cF9vYmpl Y3RzX2F0ZXhpdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHVzYWdlKCk7CitzdGF0aWMgY2hhciAq Z2V0X2Jhc2VfY29ubmluZm8oY2hhciAqY29ubmluZm8sIGNoYXIgKmRibmFtZSwKKwkJCQkJ CQkgICBjb25zdCBjaGFyICpub2Rlcm9sZSk7CitzdGF0aWMgYm9vbCBjaGVja19kYXRhX2Rp cmVjdG9yeShjb25zdCBjaGFyICpkYXRhZGlyKTsKK3N0YXRpYyBjaGFyICpjb25jYXRfY29u bmluZm9fZGJuYW1lKGNvbnN0IGNoYXIgKmNvbm5pbmZvLCBjb25zdCBjaGFyICpkYm5hbWUp Oworc3RhdGljIFBHY29ubiAqY29ubmVjdF9kYXRhYmFzZShjb25zdCBjaGFyICpjb25uaW5m bywgYm9vbCBzZWN1cmVfc2VhcmNoX3BhdGgpOworc3RhdGljIHZvaWQgZGlzY29ubmVjdF9k YXRhYmFzZShQR2Nvbm4gKmNvbm4pOworc3RhdGljIGNoYXIgKmdldF9zeXNpZF9mcm9tX2Nv bm4oY29uc3QgY2hhciAqY29ubmluZm8pOworc3RhdGljIGNoYXIgKmdldF9jb250cm9sX2Zy b21fZGF0YWRpcihjb25zdCBjaGFyICpkYXRhZGlyKTsKK3N0YXRpYyBjaGFyICpjcmVhdGVf bG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KFBHY29ubiAqY29ubiwgTG9naWNhbFJlcEluZm8g KmRiaW5mbywKKwkJCQkJCQkJCQkJIGNvbnN0IGNoYXIgKnNsb3RfbmFtZSk7CitzdGF0aWMg dm9pZCBkcm9wX3JlcGxpY2F0aW9uX3Nsb3QoUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5m byAqZGJpbmZvLCBjb25zdCBjaGFyICpzbG90X25hbWUpOworc3RhdGljIHZvaWQgcGdfY3Rs X3N0YXR1cyhjb25zdCBjaGFyICpwZ19jdGxfY21kLCBpbnQgcmMsIGludCBhY3Rpb24pOwor c3RhdGljIGJvb2wgcG9zdG1hc3Rlcl9pc19hbGl2ZShwaWRfdCBwaWQpOworc3RhdGljIHZv aWQgd2FpdF9wb3N0bWFzdGVyX2Nvbm5lY3Rpb24oY29uc3QgY2hhciAqY29ubmluZm8pOwor c3RhdGljIHZvaWQgd2FpdF9mb3JfZW5kX3JlY292ZXJ5KGNvbnN0IGNoYXIgKmNvbm5pbmZv KTsKK3N0YXRpYyB2b2lkIGNyZWF0ZV9wdWJsaWNhdGlvbihQR2Nvbm4gKmNvbm4sIExvZ2lj YWxSZXBJbmZvICpkYmluZm8pOworc3RhdGljIHZvaWQgZHJvcF9wdWJsaWNhdGlvbihQR2Nv bm4gKmNvbm4sIExvZ2ljYWxSZXBJbmZvICpkYmluZm8pOworc3RhdGljIHZvaWQgY3JlYXRl X3N1YnNjcmlwdGlvbihQR2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJbmZvICpkYmluZm8pOwor c3RhdGljIHZvaWQgZHJvcF9zdWJzY3JpcHRpb24oUEdjb25uICpjb25uLCBMb2dpY2FsUmVw SW5mbyAqZGJpbmZvKTsKK3N0YXRpYyB2b2lkIHNldF9yZXBsaWNhdGlvbl9wcm9ncmVzcyhQ R2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJbmZvICpkYmluZm8sIGNvbnN0IGNoYXIgKmxzbik7 CitzdGF0aWMgdm9pZCBlbmFibGVfc3Vic2NyaXB0aW9uKFBHY29ubiAqY29ubiwgTG9naWNh bFJlcEluZm8gKmRiaW5mbyk7CisKKyNkZWZpbmUJVVNFQ19QRVJfU0VDCTEwMDAwMDAKKyNk ZWZpbmUJV0FJVF9JTlRFUlZBTAkxCQkvKiAxIHNlY29uZCAqLworCisvKiBPcHRpb25zICov Citjb25zdCBjaGFyICpwcm9nbmFtZTsKK3N0YXRpYyBjaGFyICpzdWJzY3JpYmVyX2RpciA9 IE5VTEw7CitzdGF0aWMgY2hhciAqcHViX2Nvbm5pbmZvX3N0ciA9IE5VTEw7CitzdGF0aWMg Y2hhciAqc3ViX2Nvbm5pbmZvX3N0ciA9IE5VTEw7CitzdGF0aWMgU2ltcGxlU3RyaW5nTGlz dCBkYXRhYmFzZV9uYW1lcyA9IHtOVUxMLCBOVUxMfTsKK3N0YXRpYyBpbnQJdmVyYm9zZSA9 IDA7CitzdGF0aWMgYm9vbAlzdWNjZXNzID0gZmFsc2U7CisKK3N0YXRpYyBMb2dpY2FsUmVw SW5mbyAgKmRiaW5mbzsKKworc3RhdGljIGludAkJbnVtX2RicyA9IDA7CisKK3N0YXRpYyBj aGFyCQl0ZW1wX3JlcGxzbG90W05BTUVEQVRBTEVOXTsKK3N0YXRpYyBib29sCQltYWRlX3Rl bXBfcmVwbHNsb3QgPSBmYWxzZTsKKworY2hhcgkJcGlkZmlsZVtNQVhQR1BBVEhdOyAvKiBz dWJzY3JpYmVyIFBJRCBmaWxlICovCisKK2VudW0gV2FpdFBNUmVzdWx0Cit7CisJUE9TVE1B U1RFUl9SRUFEWSwKKwlQT1NUTUFTVEVSX1NUQU5EQlksCisJUE9TVE1BU1RFUl9TVElMTF9T VEFSVElORywKKwlQT1NUTUFTVEVSX0ZBSUxFRAorfTsKKworCisvKgorICogQ2xlYW51cCBv YmplY3RzIHRoYXQgd2VyZSBjcmVhdGVkIGJ5IHBnX3N1YnNjcmliZXIgaWYgdGhlcmUgaXMg YW4gZXJyb3IuCisgKgorICogUmVwbGljYXRpb24gc2xvdHMsIHB1YmxpY2F0aW9ucyBhbmQg c3Vic2NyaXB0aW9ucyBhcmUgY3JlYXRlZC4gRGVwZW5kaW5kIG9uCisgKiB0aGUgc3RlcCBp dCBmYWlsZWQsIGl0IHNob3VsZCByZW1vdmUgdGhlIGFscmVhZHkgY3JlYXRlZCBvYmplY3Rz IGlmIGl0IGlzCisgKiBwb3NzaWJsZSAoc29tZXRpbWVzIGl0IHdvbid0IHdvcmsgZHVlIHRv IGEgY29ubmVjdGlvbiBpc3N1ZSkuCisgKi8KK3N0YXRpYyB2b2lkCitjbGVhbnVwX29iamVj dHNfYXRleGl0KHZvaWQpCit7CisJUEdjb25uCSpjb25uOworCWludAkJaTsKKworCWlmIChz dWNjZXNzKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RiczsgaSsrKQor CXsKKwkJaWYgKGRiaW5mb1tpXS5tYWRlX3N1YnNjcmlwdGlvbikKKwkJeworCQkJY29ubiA9 IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvW2ldLnN1YmNvbm5pbmZvLCB0cnVlKTsKKwkJCWlm IChjb25uICE9IE5VTEwpCisJCQl7CisJCQkJZHJvcF9zdWJzY3JpcHRpb24oY29ubiwgJmRi aW5mb1tpXSk7CisJCQkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uKTsKKwkJCX0KKwkJfQor CisJCWlmIChkYmluZm9baV0ubWFkZV9wdWJsaWNhdGlvbiB8fCBkYmluZm9baV0ubWFkZV9y ZXBsc2xvdCkKKwkJeworCQkJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvW2ldLnB1 YmNvbm5pbmZvLCB0cnVlKTsKKwkJCWlmIChjb25uICE9IE5VTEwpCisJCQl7CisJCQkJaWYg KGRiaW5mb1tpXS5tYWRlX3B1YmxpY2F0aW9uKQorCQkJCQlkcm9wX3B1YmxpY2F0aW9uKGNv bm4sICZkYmluZm9baV0pOworCQkJCWlmIChkYmluZm9baV0ubWFkZV9yZXBsc2xvdCkKKwkJ CQkJZHJvcF9yZXBsaWNhdGlvbl9zbG90KGNvbm4sICZkYmluZm9baV0sIE5VTEwpOworCQkJ CWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubik7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobWFk ZV90ZW1wX3JlcGxzbG90KQorCXsKKwkJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZv WzBdLnB1YmNvbm5pbmZvLCB0cnVlKTsKKwkJZHJvcF9yZXBsaWNhdGlvbl9zbG90KGNvbm4s ICZkYmluZm9bMF0sIHRlbXBfcmVwbHNsb3QpOworCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNv bm4pOworCX0KK30KKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJcHJpbnRmKF8o IiVzIGNyZWF0ZXMgYSBuZXcgbG9naWNhbCByZXBsaWNhIGZyb20gYSBiYXNlIGJhY2t1cCBv ciBhIHN0YW5kYnkgc2VydmVyLlxuXG4iKSwKKwkJICAgcHJvZ25hbWUpOworCXByaW50Zihf KCJVc2FnZTpcbiIpKTsKKwlwcmludGYoXygiICAlcyBbT1BUSU9OXS4uLlxuIiksIHByb2du YW1lKTsKKwlwcmludGYoXygiXG5PcHRpb25zOlxuIikpOworCXByaW50ZihfKCIgLUQsIC0t cGdkYXRhPURBVEFESVIgICAgICAgICAgICAgICAgbG9jYXRpb24gZm9yIHRoZSBzdWJzY3Jp YmVyIGRhdGEgZGlyZWN0b3J5XG4iKSk7CisJcHJpbnRmKF8oIiAtUCwgLS1wdWJsaXNoZXIt Y29ubmluZm89Q09OTklORk8gICBwdWJsaXNoZXIgY29ubmVjdGlvbiBzdHJpbmdcbiIpKTsK KwlwcmludGYoXygiIC1TLCAtLXN1YnNjcmliZXItY29ubmluZm89Q09OTklORk8gIHN1YnNj cmliZXIgY29ubmVjdGlvbiBzdHJpbmdcbiIpKTsKKwlwcmludGYoXygiIC1kLCAtLWRhdGFi YXNlPURCTkFNRSAgICAgICAgICAgICAgIGRhdGFiYXNlIHRvIGNyZWF0ZSBhIHN1YnNjcmlw dGlvblxuIikpOworCXByaW50ZihfKCIgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgICAgICAg ICAgICAgb3V0cHV0IHZlcmJvc2UgbWVzc2FnZXNcbiIpKTsKKwlwcmludGYoXygiIC1WLCAt LXZlcnNpb24gICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCB2ZXJzaW9uIGluZm9ybWF0 aW9uLCB0aGVuIGV4aXRcbiIpKTsKKwlwcmludGYoXygiIC0/LCAtLWhlbHAgICAgICAgICAg ICAgICAgICAgICAgICAgIHNob3cgdGhpcyBoZWxwLCB0aGVuIGV4aXRcbiIpKTsKKwlwcmlu dGYoXygiXG5SZXBvcnQgYnVncyB0byA8JXM+LlxuIiksIFBBQ0tBR0VfQlVHUkVQT1JUKTsK KwlwcmludGYoXygiJXMgaG9tZSBwYWdlOiA8JXM+XG4iKSwgUEFDS0FHRV9OQU1FLCBQQUNL QUdFX1VSTCk7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSBhIGNvbm5lY3Rpb24gc3RyaW5nLiBS ZXR1cm5zIGEgYmFzZSBjb25uZWN0aW9uIHN0cmluZyB0aGF0IGlzIGEKKyAqIGNvbm5lY3Rp b24gc3RyaW5nIHdpdGhvdXQgYSBkYXRhYmFzZSBuYW1lIHBsdXMgYSBmYWxsYmFjayBhcHBs aWNhdGlvbiBuYW1lLgorICogU2luY2Ugd2UgbWlnaHQgcHJvY2VzcyBtdWx0aXBsZSBkYXRh YmFzZXMsIGVhY2ggZGF0YWJhc2UgbmFtZSB3aWxsIGJlCisgKiBhcHBlbmRlZCB0byB0aGlz IGJhc2UgY29ubmVjdGlvbiBzdHJpbmcgdG8gcHJvdmlkZSBhIGZpbmFsIGNvbm5lY3Rpb24g c3RyaW5nLgorICogSWYgdGhlIHNlY29uZCBhcmd1bWVudCAoZGJuYW1lKSBpcyBub3QgbnVs bCwgcmV0dXJucyBkYm5hbWUgaWYgdGhlIHByb3ZpZGVkCisgKiBjb25uZWN0aW9uIHN0cmlu ZyBjb250YWlucyBpdC4gSWYgb3B0aW9uIC0tZGF0YWJhc2UgaXMgbm90IHByb3ZpZGVkLCB1 c2VzCisgKiBkYm5hbWUgYXMgdGhlIG9ubHkgZGF0YWJhc2UgdG8gc2V0dXAgdGhlIGxvZ2lj YWwgcmVwbGljYS4KKyAqIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBm cmVlIHRoZSByZXR1cm5lZCBjb25uZWN0aW9uIHN0cmluZyBhbmQKKyAqIGRibmFtZS4KKyAq Lworc3RhdGljIGNoYXIgKgorZ2V0X2Jhc2VfY29ubmluZm8oY2hhciAqY29ubmluZm8sIGNo YXIgKmRibmFtZSwgY29uc3QgY2hhciAqbm9kZXJvbGUpCit7CisJUFFFeHBCdWZmZXIgYnVm ID0gY3JlYXRlUFFFeHBCdWZmZXIoKTsKKwlQUWNvbm5pbmZvT3B0aW9uICpjb25uX29wdHMg PSBOVUxMOworCVBRY29ubmluZm9PcHRpb24gKmNvbm5fb3B0OworCWNoYXIJICAgKmVycm1z ZyA9IE5VTEw7CisJY2hhcgkgICAqcmV0OworCWludAkJCWk7CisKKwlpZiAodmVyYm9zZSkK KwkJcGdfbG9nX2luZm8oInZhbGlkYXRpbmcgY29ubmVjdGlvbiBzdHJpbmcgb24gJXMiLCBu b2Rlcm9sZSk7CisKKwljb25uX29wdHMgPSBQUWNvbm5pbmZvUGFyc2UoY29ubmluZm8sICZl cnJtc2cpOworCWlmIChjb25uX29wdHMgPT0gTlVMTCkKKwl7CisJCXBnX2xvZ19lcnJvcigi Y291bGQgbm90IHBhcnNlIGNvbm5lY3Rpb24gc3RyaW5nOiAlcyIsIGVycm1zZyk7CisJCXJl dHVybiBOVUxMOworCX0KKworCWkgPSAwOworCWZvciAoY29ubl9vcHQgPSBjb25uX29wdHM7 IGNvbm5fb3B0LT5rZXl3b3JkICE9IE5VTEw7IGNvbm5fb3B0KyspCisJeworCQlpZiAoc3Ry Y21wKGNvbm5fb3B0LT5rZXl3b3JkLCAiZGJuYW1lIikgPT0gMCAmJiBjb25uX29wdC0+dmFs ICE9IE5VTEwpCisJCXsKKwkJCWlmIChkYm5hbWUpCisJCQkJZGJuYW1lID0gcGdfc3RyZHVw KGNvbm5fb3B0LT52YWwpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoY29ubl9vcHQt PnZhbCAhPSBOVUxMICYmIGNvbm5fb3B0LT52YWxbMF0gIT0gJ1wwJykKKwkJeworCQkJaWYg KGkgPiAwKQorCQkJCWFwcGVuZFBRRXhwQnVmZmVyQ2hhcihidWYsICcgJyk7CisJCQlhcHBl bmRQUUV4cEJ1ZmZlcihidWYsICIlcz0lcyIsIGNvbm5fb3B0LT5rZXl3b3JkLCBjb25uX29w dC0+dmFsKTsKKwkJCWkrKzsKKwkJfQorCX0KKworCWlmIChpID4gMCkKKwkJYXBwZW5kUFFF eHBCdWZmZXJDaGFyKGJ1ZiwgJyAnKTsKKwlhcHBlbmRQUUV4cEJ1ZmZlcihidWYsICJmYWxs YmFja19hcHBsaWNhdGlvbl9uYW1lPSVzIiwgcHJvZ25hbWUpOworCisJcmV0ID0gcGdfc3Ry ZHVwKGJ1Zi0+ZGF0YSk7CisKKwlkZXN0cm95UFFFeHBCdWZmZXIoYnVmKTsKKwlQUWNvbm5p bmZvRnJlZShjb25uX29wdHMpOworCisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIElzIGl0 IGEgY2x1c3RlciBkaXJlY3Rvcnk/IFRoZXNlIGFyZSBwcmVsaW1pbmFyeSBjaGVja3MuIEl0 IGlzIGZhciBmcm9tCisgKiBtYWtpbmcgYW4gYWNjdXJhdGUgY2hlY2suIElmIGl0IGlzIG5v dCBhIGNsb25lIGZyb20gdGhlIHB1Ymxpc2hlciwgaXQgd2lsbAorICogZXZlbnR1YWxseSBm YWlsIGluIGEgZnV0dXJlIHN0ZXAuCisgKi8KK3N0YXRpYyBib29sCitjaGVja19kYXRhX2Rp cmVjdG9yeShjb25zdCBjaGFyICpkYXRhZGlyKQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7 CisJY2hhcgkJdmVyc2lvbmZpbGVbTUFYUEdQQVRIXTsKKworCWlmICh2ZXJib3NlKQorCQlw Z19sb2dfaW5mbygiY2hlY2tpbmcgaWYgZGlyZWN0b3J5IFwiJXNcIiBpcyBhIGNsdXN0ZXIg ZGF0YSBkaXJlY3RvcnkiLAorCQkJCQlkYXRhZGlyKTsKKworCWlmIChzdGF0KGRhdGFkaXIs ICZzdGF0YnVmKSAhPSAwKQorCXsKKwkJaWYgKGVycm5vID09IEVOT0VOVCkKKwkJCXBnX2xv Z19lcnJvcigiZGF0YSBkaXJlY3RvcnkgXCIlc1wiIGRvZXMgbm90IGV4aXN0IiwgZGF0YWRp cik7CisJCWVsc2UKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGFjY2VzcyBkaXJlY3Rv cnkgXCIlc1wiOiAlcyIsIGRhdGFkaXIsIHN0cmVycm9yKGVycm5vKSk7CisKKwkJcmV0dXJu IGZhbHNlOworCX0KKworCXNucHJpbnRmKHZlcnNpb25maWxlLCBNQVhQR1BBVEgsICIlcy9Q R19WRVJTSU9OIiwgZGF0YWRpcik7CisJaWYgKHN0YXQodmVyc2lvbmZpbGUsICZzdGF0YnVm KSAhPSAwICYmIGVycm5vID09IEVOT0VOVCkKKwl7CisJCXBnX2xvZ19lcnJvcigiZGlyZWN0 b3J5IFwiJXNcIiBpcyBub3QgYSBkYXRhYmFzZSBjbHVzdGVyIGRpcmVjdG9yeSIsIGRhdGFk aXIpOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisg KiBBcHBlbmQgZGF0YWJhc2UgbmFtZSBpbnRvIGEgYmFzZSBjb25uZWN0aW9uIHN0cmluZy4K KyAqCisgKiBkYm5hbWUgaXMgdGhlIG9ubHkgcGFyYW1ldGVyIHRoYXQgY2hhbmdlcyBzbyBp dCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGJhc2UKKyAqIGNvbm5lY3Rpb24gc3RyaW5nLiBU aGlzIGZ1bmN0aW9uIGNvbmNhdGVuYXRlcyBkYm5hbWUgdG8gYnVpbGQgYSAicmVhbCIKKyAq IGNvbm5lY3Rpb24gc3RyaW5nLgorICovCitzdGF0aWMgY2hhciAqCitjb25jYXRfY29ubmlu Zm9fZGJuYW1lKGNvbnN0IGNoYXIgKmNvbm5pbmZvLCBjb25zdCBjaGFyICpkYm5hbWUpCit7 CisJUFFFeHBCdWZmZXIgYnVmID0gY3JlYXRlUFFFeHBCdWZmZXIoKTsKKwljaGFyCSAgICpy ZXQ7CisKKwlBc3NlcnQoY29ubmluZm8gIT0gTlVMTCk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZl clN0cihidWYsIGNvbm5pbmZvKTsKKwlhcHBlbmRQUUV4cEJ1ZmZlcihidWYsICIgZGJuYW1l PSVzIiwgZGJuYW1lKTsKKwlhcHBlbmRQUUV4cEJ1ZmZlclN0cihidWYsICIgcmVwbGljYXRp b249ZGF0YWJhc2UiKTsKKworCXJldCA9IHBnX3N0cmR1cChidWYtPmRhdGEpOworCWRlc3Ry b3lQUUV4cEJ1ZmZlcihidWYpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIFBHY29u biAqCitjb25uZWN0X2RhdGFiYXNlKGNvbnN0IGNoYXIgKmNvbm5pbmZvLCBib29sIHNlY3Vy ZV9zZWFyY2hfcGF0aCkKK3sKKwlQR2Nvbm4JICAgKmNvbm47CisKKwljb25uID0gUFFjb25u ZWN0ZGIoY29ubmluZm8pOworCWlmIChQUXN0YXR1cyhjb25uKSAhPSBDT05ORUNUSU9OX09L KQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb25uZWN0aW9uIHRvIGRhdGFiYXNlIGZhaWxlZDog JXMiLCBQUWVycm9yTWVzc2FnZShjb25uKSk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8q IHNlY3VyZSBzZWFyY2hfcGF0aCAqLworCWlmIChzZWN1cmVfc2VhcmNoX3BhdGgpCisJewor CQlQR3Jlc3VsdCAgICpyZXM7CisKKwkJcmVzID0gUFFleGVjKGNvbm4sIEFMV0FZU19TRUNV UkVfU0VBUkNIX1BBVEhfU1FMKTsKKwkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdS RVNfVFVQTEVTX09LKQorCQl7CisJCQlwZ19sb2dfZXJyb3IoImNvdWxkIG5vdCBjbGVhciBz ZWFyY2hfcGF0aDogJXMiLCBQUXJlc3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJCXJldHVy biBOVUxMOworCQl9CisJCVBRY2xlYXIocmVzKTsKKwl9CisKKwlyZXR1cm4gY29ubjsKK30K Kworc3RhdGljIHZvaWQKK2Rpc2Nvbm5lY3RfZGF0YWJhc2UoUEdjb25uICpjb25uKQorewor CUFzc2VydChjb25uICE9IE5VTEwpOworCisJUFFmaW5pc2goY29ubik7Cit9CisKKy8qCisg KiBPYnRhaW4gdGhlIHN5c3RlbSBpZGVudGlmaWVyIHVzaW5nIHRoZSBwcm92aWRlZCBjb25u ZWN0aW9uLiBJdCB3aWxsIGJlIHVzZWQKKyAqIHRvIGNvbXBhcmUgaWYgYSBkYXRhIGRpcmVj dG9yeSBpcyBhIGNsb25lIG9mIGFub3RoZXIgb25lLgorICovCitzdGF0aWMgY2hhciAqCitn ZXRfc3lzaWRfZnJvbV9jb25uKGNvbnN0IGNoYXIgKmNvbm5pbmZvKQoreworCVBHY29ubgkg ICAqY29ubjsKKwlQR3Jlc3VsdCAgICpyZXM7CisJY2hhcgkgICAqcmVwY29ubmluZm87CisJ Y2hhcgkgICAqc3lzaWQgPSBOVUxMOworCisJaWYgKHZlcmJvc2UpCisJCXBnX2xvZ19pbmZv KCJnZXR0aW5nIHN5c3RlbSBpZGVudGlmaWVyIGZyb20gcHVibGlzaGVyIik7CisKKwlyZXBj b25uaW5mbyA9IHBzcHJpbnRmKCIlcyByZXBsaWNhdGlvbj1kYXRhYmFzZSIsIGNvbm5pbmZv KTsKKwljb25uID0gY29ubmVjdF9kYXRhYmFzZShyZXBjb25uaW5mbywgZmFsc2UpOworCWlm IChjb25uID09IE5VTEwpCisJCWV4aXQoMSk7CisKKwlyZXMgPSBQUWV4ZWMoY29ubiwgIklE RU5USUZZX1NZU1RFTSIpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX1RV UExFU19PSykKKwl7CisJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IHNlbmQgcmVwbGljYXRp b24gY29tbWFuZCBcIiVzXCI6ICVzIiwKKwkJCQkJICJJREVOVElGWV9TWVNURU0iLCBQUXJl c3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJUFFjbGVhcihyZXMpOworCQlyZXR1cm4gTlVM TDsKKwl9CisJaWYgKFBRbnR1cGxlcyhyZXMpICE9IDEgfHwgUFFuZmllbGRzKHJlcykgPCAz KQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3QgaWRlbnRpZnkgc3lzdGVtOiBnb3Qg JWQgcm93cyBhbmQgJWQgZmllbGRzLCBleHBlY3RlZCAlZCByb3dzIGFuZCAlZCBvciBtb3Jl IGZpZWxkcyIsCisJCQkJCSBQUW50dXBsZXMocmVzKSwgUFFuZmllbGRzKHJlcyksIDEsIDMp OworCisJCVBRY2xlYXIocmVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3lzaWQgPSBw Z19zdHJkdXAoUFFnZXR2YWx1ZShyZXMsIDAsIDApKTsKKworCWRpc2Nvbm5lY3RfZGF0YWJh c2UoY29ubik7CisKKwlyZXR1cm4gc3lzaWQ7Cit9CisKKy8qCisgKiBPYnRhaW4gdGhlIHN5 c3RlbSBpZGVudGlmaWVyIGZyb20gY29udHJvbCBmaWxlLiBJdCB3aWxsIGJlIHVzZWQgdG8g Y29tcGFyZQorICogaWYgYSBkYXRhIGRpcmVjdG9yeSBpcyBhIGNsb25lIG9mIGFub3RoZXIg b25lLiBUaGlzIHJvdXRpbmUgaXMgdXNlZCBsb2NhbGx5CisgKiBhbmQgYXZvaWRzIGEgcmVw bGljYXRpb24gY29ubmVjdGlvbi4KKyAqLworc3RhdGljIGNoYXIgKgorZ2V0X2NvbnRyb2xf ZnJvbV9kYXRhZGlyKGNvbnN0IGNoYXIgKmRhdGFkaXIpCit7CisJQ29udHJvbEZpbGVEYXRh ICpjZjsKKwlib29sCQljcmNfb2s7CisJY2hhcgkgICAqc3lzaWQgPSBwZ19tYWxsb2MoMzIp OworCisJaWYgKHZlcmJvc2UpCisJCXBnX2xvZ19pbmZvKCJnZXR0aW5nIHN5c3RlbSBpZGVu dGlmaWVyIGZyb20gc3Vic2NyaWJlciIpOworCisJY2YgPSBnZXRfY29udHJvbGZpbGUoZGF0 YWRpciwgJmNyY19vayk7CisJaWYgKCFjcmNfb2spCisJeworCQlwZ19sb2dfZXJyb3IoImNv bnRyb2wgZmlsZSBhcHBlYXJzIHRvIGJlIGNvcnJ1cHQiKTsKKwkJZXhpdCgxKTsKKwl9CisK KwlzbnByaW50ZihzeXNpZCwgMzIsIFVJTlQ2NF9GT1JNQVQsIGNmLT5zeXN0ZW1faWRlbnRp Zmllcik7CisKKwlwZnJlZShjZik7CisKKwlyZXR1cm4gc3lzaWQ7Cit9CisKKy8qCisgKiBD cmVhdGUgYSBsb2dpY2FsIHJlcGxpY2F0aW9uIHNsb3QgYW5kIHJldHVybnMgYSBjb25zaXN0 ZW50IExTTi4gVGhlIHJldHVybmVkCisgKiBMU04gbWlnaHQgYmUgdXNlZCB0byBjYXRjaCB1 cCB0aGUgc3Vic2NyaWJlciB1cCB0byB0aGUgcmVxdWlyZWQgcG9pbnQuCisgKgorICogWFhY IENyZWF0ZVJlcGxpY2F0aW9uU2xvdCgpIGlzIG5vdCB1c2VkIGJlY2F1c2UgaXQgZG9lcyBu b3QgcHJvdmlkZSB0aGUgb25lLXJvdworICogcmVzdWx0IHNldCB0aGF0IGNvbnRhaW5zIHRo ZSBjb25zaXN0ZW50IExTTi4KKyAqLworc3RhdGljIGNoYXIgKgorY3JlYXRlX2xvZ2ljYWxf cmVwbGljYXRpb25fc2xvdChQR2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJbmZvICpkYmluZm8s CisJCQkJCQkJCWNvbnN0IGNoYXIgKnNsb3RfbmFtZSkKK3sKKwlQUUV4cEJ1ZmZlciBzdHIg PSBjcmVhdGVQUUV4cEJ1ZmZlcigpOworCVBHcmVzdWx0ICAgKnJlczsKKwljaGFyCSAgICps c24gPSBOVUxMOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlpZiAodmVyYm9zZSkK KwkJcGdfbG9nX2luZm8oImNyZWF0aW5nIHRoZSByZXBsaWNhdGlvbiBzbG90IFwiJXNcIiBv biBkYXRhYmFzZSBcIiVzXCIiLCBzbG90X25hbWUsIGRiaW5mby0+ZGJuYW1lKTsKKworCWFw cGVuZFBRRXhwQnVmZmVyKHN0ciwgIkNSRUFURV9SRVBMSUNBVElPTl9TTE9UIFwiJXNcIiIs IHNsb3RfbmFtZSk7CisJYXBwZW5kUFFFeHBCdWZmZXJTdHIoc3RyLCAiIExPR0lDQUwgXCJw Z291dHB1dFwiIE5PRVhQT1JUX1NOQVBTSE9UIik7CisKKwlpZiAodmVyYm9zZSkKKwkJcGdf bG9nX2luZm8oImNvbW1hbmQgaXM6ICVzIiwgc3RyLT5kYXRhKTsKKworCXJlcyA9IFBRZXhl Yyhjb25uLCBzdHItPmRhdGEpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVT X1RVUExFU19PSykKKwl7CisJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGNyZWF0ZSByZXBs aWNhdGlvbiBzbG90IFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVzXCI6ICVzIiwgc2xvdF9uYW1l LCBkYmluZm8tPmRibmFtZSwKKwkJCQkJIFBRcmVzdWx0RXJyb3JNZXNzYWdlKHJlcykpOwor CQlyZXR1cm4gbHNuOworCX0KKworCS8qIGZvciBjbGVhbnVwIHB1cnBvc2VzICovCisJaWYg KHNsb3RfbmFtZSA9PSBOVUxMKQorCQlkYmluZm8tPm1hZGVfcmVwbHNsb3QgPSB0cnVlOwor CWVsc2UKKwkJbWFkZV90ZW1wX3JlcGxzbG90ID0gdHJ1ZTsKKworCWxzbiA9IHBnX3N0cmR1 cChQUWdldHZhbHVlKHJlcywgMCwgMSkpOworCisJUFFjbGVhcihyZXMpOworCWRlc3Ryb3lQ UUV4cEJ1ZmZlcihzdHIpOworCisJcmV0dXJuIGxzbjsKK30KKworc3RhdGljIHZvaWQKK2Ry b3BfcmVwbGljYXRpb25fc2xvdChQR2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJbmZvICpkYmlu Zm8sIGNvbnN0IGNoYXIgKnNsb3RfbmFtZSkKK3sKKwlQUUV4cEJ1ZmZlciBzdHIgPSBjcmVh dGVQUUV4cEJ1ZmZlcigpOworCVBHcmVzdWx0ICAgKnJlczsKKworCUFzc2VydChjb25uICE9 IE5VTEwpOworCisJaWYgKHZlcmJvc2UpCisJCXBnX2xvZ19pbmZvKCJkcm9wcGluZyB0aGUg cmVwbGljYXRpb24gc2xvdCBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiIiwgc2xvdF9uYW1l LCBkYmluZm8tPmRibmFtZSk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIsICJEUk9QX1JF UExJQ0FUSU9OX1NMT1QgXCIlc1wiIiwgc2xvdF9uYW1lKTsKKworCXJlcyA9IFBRZXhlYyhj b25uLCBzdHItPmRhdGEpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NP TU1BTkRfT0spCisJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGRyb3AgcmVwbGljYXRpb24g c2xvdCBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiOiAlcyIsIHNsb3RfbmFtZSwgZGJpbmZv LT5kYm5hbWUsCisJCQkJCSBQUWVycm9yTWVzc2FnZShjb25uKSk7CisKKwlQUWNsZWFyKHJl cyk7CisJZGVzdHJveVBRRXhwQnVmZmVyKHN0cik7Cit9CisKKy8qCisgKiBSZXBvcnRzIGEg c3VpdGFibGUgbWVzc2FnZSBpZiBwZ19jdGwgZmFpbHMuCisgKi8KK3N0YXRpYyB2b2lkCitw Z19jdGxfc3RhdHVzKGNvbnN0IGNoYXIgKnBnX2N0bF9jbWQsIGludCByYywgaW50IGFjdGlv bikKK3sKKwlpZiAocmMgIT0gMCkKKwl7CisJCWlmIChXSUZFWElURUQocmMpKQorCQl7CisJ CQlwZ19sb2dfZXJyb3IoInBnX2N0bCBmYWlsZWQgd2l0aCBleGl0IGNvZGUgJWQiLCBXRVhJ VFNUQVRVUyhyYykpOworCQl9CisJCWVsc2UgaWYgKFdJRlNJR05BTEVEKHJjKSkKKwkJewor I2lmIGRlZmluZWQoV0lOMzIpCisJCQlwZ19sb2dfZXJyb3IoInBnX2N0bCB3YXMgdGVybWlu YXRlZCBieSBleGNlcHRpb24gMHglWCIsIFdURVJNU0lHKHJjKSk7CisJCQlmcHJpbnRmKHN0 ZGVyciwKKwkJCQkJIlNlZSBDIGluY2x1ZGUgZmlsZSBcIm50c3RhdHVzLmhcIiBmb3IgYSBk ZXNjcmlwdGlvbiBvZiB0aGUgaGV4YWRlY2ltYWwgdmFsdWUuXG4iKTsKKyNlbHNlCisJCQlw Z19sb2dfZXJyb3IoInBnX2N0bCB3YXMgdGVybWluYXRlZCBieSBzaWduYWwgJWQ6ICVzIiwK KwkJCQkJCSBXVEVSTVNJRyhyYyksIHBnX3N0cnNpZ25hbChXVEVSTVNJRyhyYykpKTsKKyNl bmRpZgorCQl9CisJCWVsc2UKKwkJeworCQkJcGdfbG9nX2Vycm9yKCJwZ19jdGwgZXhpdGVk IHdpdGggdW5yZWNvZ25pemVkIHN0YXR1cyAlZCIsIHJjKTsKKwkJfQorCisJCWZwcmludGYo c3RkZXJyLCAiVGhlIGZhaWxlZCBjb21tYW5kIHdhczogJXNcbiIsIHBnX2N0bF9jbWQpOwor CQlleGl0KDEpOworCX0KKworCWlmICh2ZXJib3NlKQorCXsKKwkJaWYgKGFjdGlvbikKKwkJ CXBnX2xvZ19pbmZvKCJwb3N0bWFzdGVyIHdhcyBzdGFydGVkIik7CisJCWVsc2UKKwkJCXBn X2xvZ19pbmZvKCJwb3N0bWFzdGVyIHdhcyBzdG9wcGVkIik7CisJfQorfQorCisvKgorICog WFhYIFRoaXMgZnVuY3Rpb24gd2FzIGNvcGllZCBmcm9tIHBnX2N0bC5jLgorICoKKyAqIFdl IHNob3VsZCBwcm9iYWJseSBtb3ZlIGl0IHRvIGEgY29tbW9uIHBsYWNlLgorICovCitzdGF0 aWMgYm9vbAorcG9zdG1hc3Rlcl9pc19hbGl2ZShwaWRfdCBwaWQpCit7CisJLyoKKwkgKiBU ZXN0IHRvIHNlZSBpZiB0aGUgcHJvY2VzcyBpcyBzdGlsbCB0aGVyZS4gIE5vdGUgdGhhdCB3 ZSBkbyBub3QKKwkgKiBjb25zaWRlciBhbiBFUEVSTSBmYWlsdXJlIHRvIG1lYW4gdGhhdCB0 aGUgcHJvY2VzcyBpcyBzdGlsbCB0aGVyZTsKKwkgKiBFUEVSTSBtdXN0IG1lYW4gdGhhdCB0 aGUgZ2l2ZW4gUElEIGJlbG9uZ3MgdG8gc29tZSBvdGhlciB1c2VyaWQsIGFuZAorCSAqIGNv bnNpZGVyaW5nIHRoZSBwZXJtaXNzaW9ucyBvbiAkUEdEQVRBLCB0aGF0IG1lYW5zIGl0J3Mg bm90IHRoZQorCSAqIHBvc3RtYXN0ZXIgd2UgYXJlIGFmdGVyLgorCSAqCisJICogRG9uJ3Qg YmVsaWV2ZSB0aGF0IG91ciBvd24gUElEIG9yIHBhcmVudCBzaGVsbCdzIFBJRCBpcyB0aGUg cG9zdG1hc3RlciwKKwkgKiBlaXRoZXIuICAoV2luZG93cyBoYXNuJ3QgZ290IGdldHBwaWQo KSwgdGhvdWdoLikKKwkgKi8KKwlpZiAocGlkID09IGdldHBpZCgpKQorCQlyZXR1cm4gZmFs c2U7CisjaWZuZGVmIFdJTjMyCisJaWYgKHBpZCA9PSBnZXRwcGlkKCkpCisJCXJldHVybiBm YWxzZTsKKyNlbmRpZgorCWlmIChraWxsKHBpZCwgMCkgPT0gMCkKKwkJcmV0dXJuIHRydWU7 CisJcmV0dXJuIGZhbHNlOworfQorCisvKgorICogUmV0dXJucyBhZnRlciBwb3N0bWFzdGVy IGlzIGFjY2VwdGluZyBjb25uZWN0aW9ucy4KKyAqLworc3RhdGljIHZvaWQKK3dhaXRfcG9z dG1hc3Rlcl9jb25uZWN0aW9uKGNvbnN0IGNoYXIgKmNvbm5pbmZvKQoreworCVBHUGluZwkJ cmV0OworCWxvbmcJCXBtcGlkOworCWludAkJCXN0YXR1cyA9IFBPU1RNQVNURVJfU1RJTExf U1RBUlRJTkc7CisKKwlpZiAodmVyYm9zZSkKKwkJcGdfbG9nX2luZm8oIndhaXRpbmcgZm9y IHRoZSBwb3N0bWFzdGVyIHRvIGFsbG93IGNvbm5lY3Rpb25zIC4uLiIpOworCisJLyoKKwkg KiBXYWl0IHBvc3RtYXN0ZXIgdG8gY29tZSB1cC4gWFhYIHRoaXMgY29kZSBwYXRoIGlzIGEg bW9kaWZpZWQgdmVyc2lvbiBvZgorCSAqIHdhaXRfZm9yX3Bvc3RtYXN0ZXIoKS4KKwkgKi8K Kwlmb3IgKDs7KQorCXsKKwkJY2hhcgkgICoqb3B0bGluZXM7CisJCWludAkJCW51bWxpbmVz OworCisJCWlmICgob3B0bGluZXMgPSByZWFkZmlsZShwaWRmaWxlLCAmbnVtbGluZXMpKSAh PSBOVUxMICYmCisJCQludW1saW5lcyA+PSBMT0NLX0ZJTEVfTElORV9QTV9TVEFUVVMpCisJ CXsKKwkJCS8qCisJCQkgKiBDaGVjayB0aGUgc3RhdHVzIGxpbmUgKHRoaXMgYXNzdW1lcyBh IHYxMCBvciBsYXRlciBzZXJ2ZXIpLgorCQkJICovCisJCQljaGFyCSAgICpwbXN0YXR1cyA9 IG9wdGxpbmVzW0xPQ0tfRklMRV9MSU5FX1BNX1NUQVRVUyAtIDFdOworCisJCQlwbXBpZCA9 IGF0b2wob3B0bGluZXNbTE9DS19GSUxFX0xJTkVfUElEIC0gMV0pOworCisJCQlpZiAoc3Ry Y21wKHBtc3RhdHVzLCBQTV9TVEFUVVNfUkVBRFkpID09IDApCisJCQl7CisJCQkJZnJlZV9y ZWFkZmlsZShvcHRsaW5lcyk7CisJCQkJc3RhdHVzID0gUE9TVE1BU1RFUl9SRUFEWTsKKwkJ CQlicmVhazsKKwkJCX0KKwkJCWVsc2UgaWYgKHN0cmNtcChwbXN0YXR1cywgUE1fU1RBVFVT X1NUQU5EQlkpID09IDApCisJCQl7CisJCQkJZnJlZV9yZWFkZmlsZShvcHRsaW5lcyk7CisJ CQkJc3RhdHVzID0gUE9TVE1BU1RFUl9TVEFOREJZOworCQkJCWJyZWFrOworCQkJfQorCQl9 CisKKwkJZnJlZV9yZWFkZmlsZShvcHRsaW5lcyk7CisKKwkJcGdfdXNsZWVwKFdBSVRfSU5U RVJWQUwgKiBVU0VDX1BFUl9TRUMpOworCX0KKworCWlmICh2ZXJib3NlKQorCQlwZ19sb2df aW5mbygicG9zdG1hc3Rlci5waWQgaXMgYXZhaWxhYmxlIik7CisKKwlpZiAoc3RhdHVzID09 IFBPU1RNQVNURVJfU1RJTExfU1RBUlRJTkcpCisJeworCQlwZ19sb2dfZXJyb3IoInNlcnZl ciBkaWQgbm90IHN0YXJ0IGluIHRpbWUiKTsKKwkJZXhpdCgxKTsKKwl9CisJZWxzZSBpZiAo c3RhdHVzID09IFBPU1RNQVNURVJfU1RBTkRCWSkKKwl7CisJCXBnX2xvZ19lcnJvcigic2Vy dmVyIGlzIHJ1bm5pbmcgYnV0IGhvdCBzdGFuZGJ5IG1vZGUgaXMgbm90IGVuYWJsZWQiKTsK KwkJZXhpdCgxKTsKKwl9CisJZWxzZSBpZiAoc3RhdHVzID09IFBPU1RNQVNURVJfRkFJTEVE KQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3Qgc3RhcnQgc2VydmVyIik7CisJCWZw cmludGYoc3RkZXJyLCAiRXhhbWluZSB0aGUgbG9nIG91dHB1dC5cbiIpOworCQlleGl0KDEp OworCX0KKworCWlmICh2ZXJib3NlKQorCXsKKwkJcGdfbG9nX2luZm8oInBvc3RtYXN0ZXIg aXMgdXAgYW5kIHJ1bm5pbmciKTsKKwkJcGdfbG9nX2luZm8oIndhaXRpbmcgdW50aWwgdGhl IHBvc3RtYXN0ZXIgYWNjZXB0cyBjb25uZWN0aW9ucyAuLi4iKTsKKwl9CisKKwkvKiBQb3N0 bWFzdGVyIGlzIHVwLiBMZXQncyB3YWl0IGZvciBpdCB0byBhY2NlcHQgY29ubmVjdGlvbnMu ICovCisJZm9yICg7OykKKwl7CisJCXJldCA9IFBRcGluZyhjb25uaW5mbyk7CisJCWlmIChy ZXQgPT0gUFFQSU5HX09LKQorCQkJYnJlYWs7CisJCWVsc2UgaWYgKHJldCA9PSBQUVBJTkdf Tk9fQVRURU1QVCkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIFBvc3RtYXN0ZXIgc3RhcnRl ZCBidXQgZm9yIHNvbWUgcmVhc29uIGl0IGNyYXNoZWQgbGVhdmluZyBhCisJCSAqIHBvc3Rt YXN0ZXIucGlkLgorCQkgKi8KKwkJaWYgKCFwb3N0bWFzdGVyX2lzX2FsaXZlKChwaWRfdCkg cG1waWQpKQorCQl7CisJCQlwZ19sb2dfZXJyb3IoImNvdWxkIG5vdCBzdGFydCBzZXJ2ZXIi KTsKKwkJCWZwcmludGYoc3RkZXJyLCAiRXhhbWluZSB0aGUgbG9nIG91dHB1dC5cbiIpOwor CQkJZXhpdCgxKTsKKwkJfQorCisJCXBnX3VzbGVlcChXQUlUX0lOVEVSVkFMICogVVNFQ19Q RVJfU0VDKTsKKwl9CisKKwlpZiAodmVyYm9zZSkKKwkJcGdfbG9nX2luZm8oInBvc3RtYXN0 ZXIgaXMgYWNjZXB0aW5nIGNvbm5lY3Rpb25zIik7Cit9CisKKy8qCisgKiBSZXR1cm5zIGFm dGVyIHRoZSBzZXJ2ZXIgZmluaXNoZXMgdGhlIHJlY292ZXJ5IHByb2Nlc3MuCisgKi8KK3N0 YXRpYyB2b2lkCit3YWl0X2Zvcl9lbmRfcmVjb3ZlcnkoY29uc3QgY2hhciAqY29ubmluZm8p Cit7CisJUEdjb25uCSAgICpjb25uOworCVBHcmVzdWx0ICAgKnJlczsKKwlpbnQJCQlzdGF0 dXMgPSBQT1NUTUFTVEVSX1NUSUxMX1NUQVJUSU5HOworCisJaWYgKHZlcmJvc2UpCisJCXBn X2xvZ19pbmZvKCJ3YWl0aW5nIHRoZSBwb3N0bWFzdGVyIHRvIHJlYWNoIHRoZSBjb25zaXN0 ZW50IHN0YXRlIC4uLiIpOworCisJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoY29ubmluZm8s IHRydWUpOworCWlmIChjb25uID09IE5VTEwpCisJCWV4aXQoMSk7CisKKwlmb3IgKDs7KQor CXsKKwkJYm9vbAkJaW5fcmVjb3Zlcnk7CisKKwkJcmVzID0gUFFleGVjKGNvbm4sICJTRUxF Q1QgcGdfY2F0YWxvZy5wZ19pc19pbl9yZWNvdmVyeSgpIik7CisKKwkJaWYgKFBRcmVzdWx0 U3RhdHVzKHJlcykgIT0gUEdSRVNfVFVQTEVTX09LKQorCQl7CisJCQlwZ19sb2dfZXJyb3Io ImNvdWxkIG5vdCBvYnRhaW4gcmVjb3ZlcnkgcHJvZ3Jlc3MiKTsKKwkJCWV4aXQoMSk7CisJ CX0KKworCQlpZiAoUFFudHVwbGVzKHJlcykgIT0gMSkKKwkJeworCQkJcGdfbG9nX2Vycm9y KCJ1bmV4cGVjdGVkIHJlc3VsdCBmcm9tIHBnX2lzX2luX3JlY292ZXJ5IGZ1bmN0aW9uIik7 CisJCQlleGl0KDEpOworCQl9CisKKwkJaW5fcmVjb3ZlcnkgPSAoc3RyY21wKFBRZ2V0dmFs dWUocmVzLCAwLCAwKSwgInQiKSA9PSAwKTsKKworCQlQUWNsZWFyKHJlcyk7CisKKwkJLyog RG9lcyB0aGUgcmVjb3ZlcnkgcHJvY2VzcyBmaW5pc2g/ICovCisJCWlmICghaW5fcmVjb3Zl cnkpCisJCXsKKwkJCXN0YXR1cyA9IFBPU1RNQVNURVJfUkVBRFk7CisJCQlicmVhazsKKwkJ fQorCisJCS8qIEtlZXAgd2FpdGluZy4gKi8KKwkJcGdfdXNsZWVwKFdBSVRfSU5URVJWQUwg KiBVU0VDX1BFUl9TRUMpOworCX0KKworCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubik7CisK KwlpZiAoc3RhdHVzID09IFBPU1RNQVNURVJfU1RJTExfU1RBUlRJTkcpCisJeworCQlwZ19s b2dfZXJyb3IoInNlcnZlciBkaWQgbm90IGVuZCByZWNvdmVyeSIpOworCQlleGl0KDEpOwor CX0KKworCWlmICh2ZXJib3NlKQorCQlwZ19sb2dfaW5mbygicG9zdG1hc3RlciByZWFjaGVk IHRoZSBjb25zaXN0ZW50IHN0YXRlIik7Cit9CisKKy8qCisgKiBDcmVhdGUgYSBwdWJsaWNh dGlvbiB0aGF0IGluY2x1ZGVzIGFsbCB0YWJsZXMgaW4gdGhlIGRhdGFiYXNlLgorICovCitz dGF0aWMgdm9pZAorY3JlYXRlX3B1YmxpY2F0aW9uKFBHY29ubiAqY29ubiwgTG9naWNhbFJl cEluZm8gKmRiaW5mbykKK3sKKwlQUUV4cEJ1ZmZlciBzdHIgPSBjcmVhdGVQUUV4cEJ1ZmZl cigpOworCVBHcmVzdWx0ICAgKnJlczsKKworCUFzc2VydChjb25uICE9IE5VTEwpOworCisJ LyogQ2hlY2sgaWYgdGhlIHB1YmxpY2F0aW9uIG5lZWRzIHRvIGJlIGNyZWF0ZWQuICovCisJ YXBwZW5kUFFFeHBCdWZmZXIoc3RyLAorCQkJCQkgICJTRUxFQ1QgcHViYWxsdGFibGVzIEZS T00gcGdfY2F0YWxvZy5wZ19wdWJsaWNhdGlvbiBXSEVSRSBwdWJuYW1lID0gJyVzJyIsCisJ CQkJCSAgZGJpbmZvLT5wdWJuYW1lKTsKKwlyZXMgPSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRh KTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJewor CQlwZ19sb2dfZXJyb3IoImNvdWxkIG5vdCBvYnRhaW4gcHVibGljYXRpb24gaW5mb3JtYXRp b246ICVzIiwKKwkJCQkJIFBRcmVzdWx0RXJyb3JNZXNzYWdlKHJlcykpOworCQlQUWNsZWFy KHJlcyk7CisJCVBRZmluaXNoKGNvbm4pOworCQlleGl0KDEpOworCX0KKworCWlmIChQUW50 dXBsZXMocmVzKSA9PSAxKQorCXsKKwkJLyoKKwkJICogSWYgcHVibGljYXRpb24gbmFtZSBh bHJlYWR5IGV4aXN0cyBhbmQgcHViYWxsdGFibGVzIGlzIHRydWUsIGxldCdzCisJCSAqIHVz ZSBpdC4gQSBwcmV2aW91cyBydW4gb2YgcGdfc3Vic2NyaWJlciBtdXN0IGhhdmUgY3JlYXRl ZCB0aGlzCisJCSAqIHB1YmxpY2F0aW9uLiBCYWlsIG91dC4KKwkJICovCisJCWlmIChzdHJj bXAoUFFnZXR2YWx1ZShyZXMsIDAsIDApLCAidCIpID09IDApCisJCXsKKwkJCWlmICh2ZXJi b3NlKQorCQkJCXBnX2xvZ19pbmZvKCJwdWJsaWNhdGlvbiBcIiVzXCIgYWxyZWFkeSBleGlz dHMiLCBkYmluZm8tPnB1Ym5hbWUpOworCQkJcmV0dXJuOworCQl9CisJCWVsc2UKKwkJewor CQkJLyoKKwkJCSAqIFhYWCBVbmZvcnR1bmF0ZWx5LCBpZiBpdCByZWFjaGVzIHRoaXMgY29k ZSBwYXRoLCBwZ19zdWJzY3JpYmVyCisJCQkgKiB3aWxsIGFsd2F5cyBmYWlsIGhlcmUuIFRo YXQncyBiYWQgYnV0IGl0IGlzIG5vdCBleHBlY3RlZCB0aGF0CisJCQkgKiB0aGUgdXNlciBj aG9vc2UgYSBuYW1lIHdpdGggcGdfc3Vic2NyaWJlcl8gcHJlZml4IGZvbGxvd2VkIGJ5CisJ CQkgKiB0aGUgZXhhY3QgZGF0YWJhc2Ugb2lkIGluIHdoaWNoIHB1YmFsbHRhYmxlcyBpcyBm YWxzZS4KKwkJCSAqLworCQkJcGdfbG9nX2Vycm9yKCJwdWJsaWNhdGlvbiBcIiVzXCIgZG9l cyBub3QgcmVwbGljYXRlIGNoYW5nZXMgZm9yIGFsbCB0YWJsZXMiLAorCQkJCQkJIGRiaW5m by0+cHVibmFtZSk7CisJCQlQUWNsZWFyKHJlcyk7CisJCQlQUWZpbmlzaChjb25uKTsKKwkJ CWV4aXQoMSk7CisJCX0KKwl9CisKKwlQUWNsZWFyKHJlcyk7CisJcmVzZXRQUUV4cEJ1ZmZl cihzdHIpOworCisJaWYgKHZlcmJvc2UpCisJCXBnX2xvZ19pbmZvKCJjcmVhdGluZyBwdWJs aWNhdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiIiwgZGJpbmZvLT5wdWJuYW1lLCBk YmluZm8tPmRibmFtZSk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIsICJDUkVBVEUgUFVC TElDQVRJT04gJXMgRk9SIEFMTCBUQUJMRVMiLCBkYmluZm8tPnB1Ym5hbWUpOworCisJaWYg KHZlcmJvc2UpCisJCXBnX2xvZ19pbmZvKCJjb21tYW5kIGlzOiAlcyIsIHN0ci0+ZGF0YSk7 CisKKwlyZXMgPSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKwlpZiAoUFFyZXN1bHRTdGF0 dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb3Vs ZCBub3QgY3JlYXRlIHB1YmxpY2F0aW9uIFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVzXCI6ICVz IiwKKwkJCQkJIGRiaW5mby0+cHVibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBRZXJyb3JNZXNz YWdlKGNvbm4pKTsKKwkJUFFmaW5pc2goY29ubik7CisJCWV4aXQoMSk7CisJfQorCisJLyog Zm9yIGNsZWFudXAgcHVycG9zZXMgKi8KKwlkYmluZm8tPm1hZGVfcHVibGljYXRpb24gPSB0 cnVlOworCisJUFFjbGVhcihyZXMpOworCWRlc3Ryb3lQUUV4cEJ1ZmZlcihzdHIpOworfQor CisvKgorICogUmVtb3ZlIHB1YmxpY2F0aW9uIGlmIGl0IGNvdWxkbid0IGZpbmlzaCBhbGwg c3RlcHMuCisgKi8KK3N0YXRpYyB2b2lkCitkcm9wX3B1YmxpY2F0aW9uKFBHY29ubiAqY29u biwgTG9naWNhbFJlcEluZm8gKmRiaW5mbykKK3sKKwlQUUV4cEJ1ZmZlciBzdHIgPSBjcmVh dGVQUUV4cEJ1ZmZlcigpOworCVBHcmVzdWx0ICAgKnJlczsKKworCUFzc2VydChjb25uICE9 IE5VTEwpOworCisJaWYgKHZlcmJvc2UpCisJCXBnX2xvZ19pbmZvKCJkcm9wcGluZyBwdWJs aWNhdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiIiwgZGJpbmZvLT5wdWJuYW1lLCBk YmluZm8tPmRibmFtZSk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIsICJEUk9QIFBVQkxJ Q0FUSU9OICVzIiwgZGJpbmZvLT5wdWJuYW1lKTsKKworCWlmICh2ZXJib3NlKQorCQlwZ19s b2dfaW5mbygiY29tbWFuZCBpczogJXMiLCBzdHItPmRhdGEpOworCisJcmVzID0gUFFleGVj KGNvbm4sIHN0ci0+ZGF0YSk7CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNf Q09NTUFORF9PSykKKwkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3QgZHJvcCBwdWJsaWNhdGlv biBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiOiAlcyIsIGRiaW5mby0+cHVibmFtZSwgZGJp bmZvLT5kYm5hbWUsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKworCVBRY2xlYXIocmVzKTsK KwlkZXN0cm95UFFFeHBCdWZmZXIoc3RyKTsKK30KKworLyoKKyAqIENyZWF0ZSBhIHN1YnNj cmlwdGlvbiB3aXRoIHNvbWUgcHJlZGVmaW5lZCBvcHRpb25zLgorICoKKyAqIEEgcmVwbGlj YXRpb24gc2xvdCB3YXMgYWxyZWFkeSBjcmVhdGVkIGluIGEgcHJldmlvdXMgc3RlcC4gTGV0 J3MgdXNlIGl0LiBCeQorICogZGVmYXVsdCwgdGhlIHN1YnNjcmlwdGlvbiBuYW1lIGlzIHVz ZWQgYXMgcmVwbGljYXRpb24gc2xvdCBuYW1lLiBJdCBpcworICogbm90IHJlcXVpcmVkIHRv IGNvcHkgZGF0YS4gVGhlIHN1YnNjcmlwdGlvbiB3aWxsIGJlIGNyZWF0ZWQgYnV0IGl0IHdp bGwgbm90CisgKiBiZSBlbmFibGVkIG5vdy4gVGhhdCdzIGJlY2F1c2UgdGhlIHJlcGxpY2F0 aW9uIHByb2dyZXNzIG11c3QgYmUgc2V0IGFuZCB0aGUKKyAqIHJlcGxpY2F0aW9uIG9yaWdp biBuYW1lIChvbmUgb2YgdGhlIGZ1bmN0aW9uIGFyZ3VtZW50cykgY29udGFpbnMgdGhlCisg KiBzdWJzY3JpcHRpb24gT0lEIGluIGl0cyBuYW1lLiBPbmNlIHRoZSBzdWJzY3JpcHRpb24g aXMgY3JlYXRlZCwKKyAqIHNldF9yZXBsaWNhdGlvbl9wcm9ncmVzcygpIGNhbiBvYnRhaW4g dGhlIGNob3NlbiBvcmlnaW4gbmFtZSBhbmQgc2V0IHVwIGl0cworICogaW5pdGlhbCBsb2Nh dGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2NyZWF0ZV9zdWJzY3JpcHRpb24oUEdjb25uICpj b25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKQoreworCVBRRXhwQnVmZmVyIHN0ciA9IGNy ZWF0ZVBRRXhwQnVmZmVyKCk7CisJUEdyZXN1bHQgICAqcmVzOworCisJQXNzZXJ0KGNvbm4g IT0gTlVMTCk7CisKKwlpZiAodmVyYm9zZSkKKwkJcGdfbG9nX2luZm8oImNyZWF0aW5nIHN1 YnNjcmlwdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiIiwgZGJpbmZvLT5zdWJuYW1l LCBkYmluZm8tPmRibmFtZSk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIsCisJCQkJCSAg IkNSRUFURSBTVUJTQ1JJUFRJT04gJXMgQ09OTkVDVElPTiAnJXMnIFBVQkxJQ0FUSU9OICVz ICIKKwkJCQkJICAiV0lUSCAoY3JlYXRlX3Nsb3QgPSBmYWxzZSwgY29weV9kYXRhID0gZmFs c2UsIGVuYWJsZWQgPSBmYWxzZSkiLAorCQkJCQkgIGRiaW5mby0+c3VibmFtZSwgZGJpbmZv LT5wdWJjb25uaW5mbywgZGJpbmZvLT5wdWJuYW1lKTsKKworCWlmICh2ZXJib3NlKQorCQlw Z19sb2dfaW5mbygiY29tbWFuZCBpczogJXMiLCBzdHItPmRhdGEpOworCisJcmVzID0gUFFl eGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdS RVNfQ09NTUFORF9PSykKKwl7CisJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGNyZWF0ZSBz dWJzY3JpcHRpb24gXCIlc1wiIG9uIGRhdGFiYXNlIFwiJXNcIjogJXMiLAorCQkJCQkgZGJp bmZvLT5zdWJuYW1lLCBkYmluZm8tPmRibmFtZSwgUFFlcnJvck1lc3NhZ2UoY29ubikpOwor CQlQUWZpbmlzaChjb25uKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKiBmb3IgY2xlYW51cCBw dXJwb3NlcyAqLworCWRiaW5mby0+bWFkZV9zdWJzY3JpcHRpb24gPSB0cnVlOworCisJUFFj bGVhcihyZXMpOworCWRlc3Ryb3lQUUV4cEJ1ZmZlcihzdHIpOworfQorCisvKgorICogUmVt b3ZlIHN1YnNjcmlwdGlvbiBpZiBpdCBjb3VsZG4ndCBmaW5pc2ggYWxsIHN0ZXBzLgorICov CitzdGF0aWMgdm9pZAorZHJvcF9zdWJzY3JpcHRpb24oUEdjb25uICpjb25uLCBMb2dpY2Fs UmVwSW5mbyAqZGJpbmZvKQoreworCVBRRXhwQnVmZmVyIHN0ciA9IGNyZWF0ZVBRRXhwQnVm ZmVyKCk7CisJUEdyZXN1bHQgICAqcmVzOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisK KwlpZiAodmVyYm9zZSkKKwkJcGdfbG9nX2luZm8oImRyb3BwaW5nIHN1YnNjcmlwdGlvbiBc IiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiIiwgZGJpbmZvLT5zdWJuYW1lLCBkYmluZm8tPmRi bmFtZSk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIsICJEUk9QIFNVQlNDUklQVElPTiAl cyIsIGRiaW5mby0+c3VibmFtZSk7CisKKwlpZiAodmVyYm9zZSkKKwkJcGdfbG9nX2luZm8o ImNvbW1hbmQgaXM6ICVzIiwgc3RyLT5kYXRhKTsKKworCXJlcyA9IFBRZXhlYyhjb25uLCBz dHItPmRhdGEpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRf T0spCisJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGRyb3Agc3Vic2NyaXB0aW9uIFwiJXNc IiBvbiBkYXRhYmFzZSBcIiVzXCI6ICVzIiwgZGJpbmZvLT5zdWJuYW1lLCBkYmluZm8tPmRi bmFtZSwgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCisJUFFjbGVhcihyZXMpOworCWRlc3Ry b3lQUUV4cEJ1ZmZlcihzdHIpOworfQorCisvKgorICogU2V0cyB0aGUgcmVwbGljYXRpb24g cHJvZ3Jlc3MgdG8gdGhlIGNvbnNpc3RlbnQgTFNOLgorICoKKyAqIFRoZSBzdWJzY3JpYmVy IGNhdWdodCB1cCB0byB0aGUgY29uc2lzdGVudCBMU04gcHJvdmlkZWQgYnkgdGhlIHRlbXBv cmFyeQorICogcmVwbGljYXRpb24gc2xvdC4gVGhlIGdvYWwgaXMgdG8gc2V0IHVwIHRoZSBp bml0aWFsIGxvY2F0aW9uIGZvciB0aGUgbG9naWNhbAorICogcmVwbGljYXRpb24gdGhhdCBp cyB0aGUgZXhhY3QgTFNOIHRoYXQgdGhlIHN1YnNjcmliZXIgd2FzIHByb21vdGVkLiBPbmNl IHRoZQorICogc3Vic2NyaXB0aW9uIGlzIGVuYWJsZWQgaXQgd2lsbCBzdGFydCBzdHJlYW1p bmcgZnJvbSB0aGF0IGxvY2F0aW9uIG9ud2FyZHMuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRf cmVwbGljYXRpb25fcHJvZ3Jlc3MoUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAqZGJp bmZvLCBjb25zdCBjaGFyICpsc24pCit7CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFF eHBCdWZmZXIoKTsKKwlQR3Jlc3VsdCAgICpyZXM7CisJT2lkCQkJc3Vib2lkOworCWNoYXIJ CW9yaWdpbm5hbWVbTkFNRURBVEFMRU5dOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisK KwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIsCisJCQkJCSAgIlNFTEVDVCBvaWQgRlJPTSBwZ19j YXRhbG9nLnBnX3N1YnNjcmlwdGlvbiBXSEVSRSBzdWJuYW1lID0gJyVzJyIsIGRiaW5mby0+ c3VibmFtZSk7CisKKwlyZXMgPSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKwlpZiAoUFFy ZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJeworCQlwZ19sb2dfZXJy b3IoImNvdWxkIG5vdCBvYnRhaW4gc3Vic2NyaXB0aW9uIE9JRDogJXMiLAorCQkJCQkgUFFy ZXN1bHRFcnJvck1lc3NhZ2UocmVzKSk7CisJCVBRY2xlYXIocmVzKTsKKwkJUFFmaW5pc2go Y29ubik7CisJCWV4aXQoMSk7CisJfQorCisJaWYgKFBRbnR1cGxlcyhyZXMpICE9IDEpCisJ eworCQlwZ19sb2dfZXJyb3IoImNvdWxkIG5vdCBvYnRhaW4gc3Vic2NyaXB0aW9uIE9JRDog Z290ICVkIHJvd3MsIGV4cGVjdGVkICVkIHJvd3MiLAorCQkJCQkgUFFudHVwbGVzKHJlcyks IDEpOworCQlQUWNsZWFyKHJlcyk7CisJCVBRZmluaXNoKGNvbm4pOworCQlleGl0KDEpOwor CX0KKworCS8qCisJICogVGhlIG9yaWdpbiBuYW1lIGlzIGRlZmluZWQgYXMgcGdfJXUuICV1 IGlzIHRoZSBzdWJzY3JpcHRpb24gT0lELiBTZWUKKwkgKiBBcHBseVdvcmtlck1haW4oKS4K KwkgKi8KKwlzdWJvaWQgPSBzdHJ0b3VsKFBRZ2V0dmFsdWUocmVzLCAwLCAwKSwgTlVMTCwg MTApOworCXNucHJpbnRmKG9yaWdpbm5hbWUsIHNpemVvZihvcmlnaW5uYW1lKSwgInBnXyV1 Iiwgc3Vib2lkKTsKKworCVBRY2xlYXIocmVzKTsKKworCWlmICh2ZXJib3NlKQorCQlwZ19s b2dfaW5mbygic2V0dGluZyB0aGUgcmVwbGljYXRpb24gcHJvZ3Jlc3MgKG5vZGUgbmFtZSBc IiVzXCIgOyBMU04gJXMpIG9uIGRhdGFiYXNlIFwiJXNcIiIsCisJCQkJCW9yaWdpbm5hbWUs IGxzbiwgZGJpbmZvLT5kYm5hbWUpOworCisJcmVzZXRQUUV4cEJ1ZmZlcihzdHIpOworCWFw cGVuZFBRRXhwQnVmZmVyKHN0ciwKKwkJCQkJICAiU0VMRUNUIHBnX2NhdGFsb2cucGdfcmVw bGljYXRpb25fb3JpZ2luX2FkdmFuY2UoJyVzJywgJyVzJykiLCBvcmlnaW5uYW1lLCBsc24p OworCisJaWYgKHZlcmJvc2UpCisJCXBnX2xvZ19pbmZvKCJjb21tYW5kIGlzOiAlcyIsIHN0 ci0+ZGF0YSk7CisKKwlyZXMgPSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKwlpZiAoUFFy ZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJeworCQlwZ19sb2dfZXJy b3IoImNvdWxkIG5vdCBzZXQgcmVwbGljYXRpb24gcHJvZ3Jlc3MgZm9yIHRoZSBzdWJzY3Jp cHRpb24gXCIlc1wiOiAlcyIsCisJCQkJCSBkYmluZm8tPnN1Ym5hbWUsIFBRcmVzdWx0RXJy b3JNZXNzYWdlKHJlcykpOworCQlQUWZpbmlzaChjb25uKTsKKwkJZXhpdCgxKTsKKwl9CisK KwlQUWNsZWFyKHJlcyk7CisJZGVzdHJveVBRRXhwQnVmZmVyKHN0cik7Cit9CisKKy8qCisg KiBFbmFibGVzIHRoZSBzdWJzY3JpcHRpb24uCisgKgorICogVGhlIHN1YnNjcmlwdGlvbiB3 YXMgY3JlYXRlZCBpbiBhIHByZXZpb3VzIHN0ZXAgYnV0IGl0IHdhcyBkaXNhYmxlZC4gQWZ0 ZXIKKyAqIGFkanVzdGluZyB0aGUgaW5pdGlhbCBsb2NhdGlvbiwgZW5hYmxpbmcgdGhlIHN1 YnNjcmlwdGlvbiBpcyB0aGUgbGFzdCBzdGVwCisgKiBvZiB0aGlzIHNldHVwLgorICovCitz dGF0aWMgdm9pZAorZW5hYmxlX3N1YnNjcmlwdGlvbihQR2Nvbm4gKmNvbm4sIExvZ2ljYWxS ZXBJbmZvICpkYmluZm8pCit7CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFFeHBCdWZm ZXIoKTsKKwlQR3Jlc3VsdCAgICpyZXM7CisKKwlBc3NlcnQoY29ubiAhPSBOVUxMKTsKKwor CWlmICh2ZXJib3NlKQorCQlwZ19sb2dfaW5mbygiZW5hYmxpbmcgc3Vic2NyaXB0aW9uIFwi JXNcIiBvbiBkYXRhYmFzZSBcIiVzXCIiLCBkYmluZm8tPnN1Ym5hbWUsIGRiaW5mby0+ZGJu YW1lKTsKKworCWFwcGVuZFBRRXhwQnVmZmVyKHN0ciwgIkFMVEVSIFNVQlNDUklQVElPTiAl cyBFTkFCTEUiLCBkYmluZm8tPnN1Ym5hbWUpOworCisJaWYgKHZlcmJvc2UpCisJCXBnX2xv Z19pbmZvKCJjb21tYW5kIGlzOiAlcyIsIHN0ci0+ZGF0YSk7CisKKwlyZXMgPSBQUWV4ZWMo Y29ubiwgc3RyLT5kYXRhKTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19D T01NQU5EX09LKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3QgZW5hYmxlIHN1YnNj cmlwdGlvbiBcIiVzXCI6ICVzIiwgZGJpbmZvLT5zdWJuYW1lLAorCQkJCQkgUFFlcnJvck1l c3NhZ2UoY29ubikpOworCQlQUWZpbmlzaChjb25uKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlQ UWNsZWFyKHJlcyk7CisJZGVzdHJveVBRRXhwQnVmZmVyKHN0cik7Cit9CisKK2ludAorbWFp bihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9u Z19vcHRpb25zW10gPQorCXsKKwkJeyJoZWxwIiwgbm9fYXJndW1lbnQsIE5VTEwsICc/J30s CisJCXsidmVyc2lvbiIsIG5vX2FyZ3VtZW50LCBOVUxMLCAnVid9LAorCQl7InBnZGF0YSIs IHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnRCd9LAorCQl7InB1Ymxpc2hlci1jb25uaW5m byIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUCd9LAorCQl7InN1YnNjcmliZXItY29u bmluZm8iLCByZXF1aXJlZF9hcmd1bWVudCwgTlVMTCwgJ1MnfSwKKwkJeyJkYXRhYmFzZSIs IHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnZCd9LAorCQl7InZlcmJvc2UiLCBub19hcmd1 bWVudCwgTlVMTCwgJ3YnfSwKKwkJeyJzdG9wLXN1YnNjcmliZXIiLCBub19hcmd1bWVudCwg TlVMTCwgMX0sCisJCXtOVUxMLCAwLCBOVUxMLCAwfQorCX07CisKKwlpbnQJCQljOworCWlu dAkJCW9wdGlvbl9pbmRleDsKKworCWNoYXIJICAgKnBnX2N0bF9wYXRoOworCWNoYXIJICAg KnBnX2N0bF9jbWQ7CisJaW50CQkJcmM7CisKKwlTaW1wbGVTdHJpbmdMaXN0Q2VsbCAqY2Vs bDsKKworCWNoYXIJICAgKnB1Yl9iYXNlX2Nvbm5pbmZvID0gTlVMTDsKKwljaGFyCSAgICpz dWJfYmFzZV9jb25uaW5mbyA9IE5VTEw7CisJY2hhcgkgICAqZGJuYW1lX2Nvbm5pbmZvOwor CisJY2hhcgkgICAqcHViX3N5c2lkOworCWNoYXIJICAgKnN1Yl9zeXNpZDsKKwlzdHJ1Y3Qg c3RhdCBzdGF0YnVmOworCisJUEdjb25uCSAgICpjb25uOworCWNoYXIJICAgKmNvbnNpc3Rl bnRfbHNuOworCisJUFFFeHBCdWZmZXIgcmVjb3Zlcnljb25mY29udGVudHMgPSBOVUxMOwor CisJaW50CQkJaTsKKworCXBnX2xvZ2dpbmdfaW5pdChhcmd2WzBdKTsKKwlwcm9nbmFtZSA9 IGdldF9wcm9nbmFtZShhcmd2WzBdKTsKKwlzZXRfcGdsb2NhbGVfcGdzZXJ2aWNlKGFyZ3Zb MF0sIFBHX1RFWFRET01BSU4oInBnX3N1YnNjcmliZXIiKSk7CisKKwlpZiAoYXJnYyA+IDEp CisJeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwIHx8IHN0cmNtcChh cmd2WzFdLCAiLT8iKSA9PSAwKQorCQl7CisJCQl1c2FnZSgpOworCQkJZXhpdCgwKTsKKwkJ fQorCQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIi1WIikgPT0gMAorCQkJCSB8fCBzdHJj bXAoYXJndlsxXSwgIi0tdmVyc2lvbiIpID09IDApCisJCXsKKwkJCXB1dHMoInBnX3N1YnNj cmliZXIgKFBvc3RncmVTUUwpICIgUEdfVkVSU0lPTik7CisJCQlleGl0KDApOworCQl9CisJ fQorCisJYXRleGl0KGNsZWFudXBfb2JqZWN0c19hdGV4aXQpOworCisJLyoKKwkgKiBEb24n dCBhbGxvdyBpdCB0byBiZSBydW4gYXMgcm9vdC4gSXQgdXNlcyBwZ19jdGwgd2hpY2ggZG9l cyBub3QgYWxsb3cKKwkgKiBpdCBlaXRoZXIuCisJICovCisjaWZuZGVmIFdJTjMyCisJaWYg KGdldGV1aWQoKSA9PSAwKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjYW5ub3QgYmUgZXhlY3V0 ZWQgYnkgXCJyb290XCIiKTsKKwkJZnByaW50ZihzdGRlcnIsIF8oIllvdSBtdXN0IHJ1biAl cyBhcyB0aGUgUG9zdGdyZVNRTCBzdXBlcnVzZXIuXG4iKSwKKwkJCQlwcm9nbmFtZSk7CisJ CWV4aXQoMSk7CisJfQorI2VuZGlmCisKKwl3aGlsZSAoKGMgPSBnZXRvcHRfbG9uZyhhcmdj LCBhcmd2LCAiRDpQOlM6ZDp0OnYiLAorCQkJCQkJCWxvbmdfb3B0aW9ucywgJm9wdGlvbl9p bmRleCkpICE9IC0xKQorCXsKKwkJc3dpdGNoIChjKQorCQl7CisJCQljYXNlICdEJzoKKwkJ CQlzdWJzY3JpYmVyX2RpciA9IHBnX3N0cmR1cChvcHRhcmcpOworCQkJCWJyZWFrOworCQkJ Y2FzZSAnUCc6CisJCQkJcHViX2Nvbm5pbmZvX3N0ciA9IHBnX3N0cmR1cChvcHRhcmcpOwor CQkJCWJyZWFrOworCQkJY2FzZSAnUyc6CisJCQkJc3ViX2Nvbm5pbmZvX3N0ciA9IHBnX3N0 cmR1cChvcHRhcmcpOworCQkJCWJyZWFrOworCQkJY2FzZSAnZCc6CisJCQkJc2ltcGxlX3N0 cmluZ19saXN0X2FwcGVuZCgmZGF0YWJhc2VfbmFtZXMsIG9wdGFyZyk7CisJCQkJbnVtX2Ri cysrOworCQkJCWJyZWFrOworCQkJY2FzZSAndic6CisJCQkJdmVyYm9zZSsrOworCQkJCWJy ZWFrOworCQkJZGVmYXVsdDoKKworCQkJCS8qCisJCQkJICogZ2V0b3B0X2xvbmcgYWxyZWFk eSBlbWl0dGVkIGEgY29tcGxhaW50CisJCQkJICovCisJCQkJZnByaW50ZihzdGRlcnIsIF8o IlRyeSBcIiVzIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuIiksCisJCQkJCQlw cm9nbmFtZSk7CisJCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCS8qCisJICogQW55IG5vbi1v cHRpb24gYXJndW1lbnRzPworCSAqLworCWlmIChvcHRpbmQgPCBhcmdjKQorCXsKKwkJcGdf bG9nX2Vycm9yKCJ0b28gbWFueSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIChmaXJzdCBpcyBc IiVzXCIpIiwKKwkJCQkJIGFyZ3Zbb3B0aW5kXSk7CisJCWZwcmludGYoc3RkZXJyLCBfKCJU cnkgXCIlcyAtLWhlbHBcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpLAorCQkJCXByb2du YW1lKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIFJlcXVpcmVkIGFyZ3VtZW50cwor CSAqLworCWlmIChzdWJzY3JpYmVyX2RpciA9PSBOVUxMKQorCXsKKwkJcGdfbG9nX2Vycm9y KCJubyBzdWJzY3JpYmVyIGRhdGEgZGlyZWN0b3J5IHNwZWNpZmllZCIpOworCQlmcHJpbnRm KHN0ZGVyciwgXygiVHJ5IFwiJXMgLS1oZWxwXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4i KSwKKwkJCQlwcm9nbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCisJLyoKKwkgKiBQYXJzZSBj b25uZWN0aW9uIHN0cmluZy4gQnVpbGQgYSBiYXNlIGNvbm5lY3Rpb24gc3RyaW5nIHRoYXQg bWlnaHQgYmUKKwkgKiByZXVzZWQgYnkgbXVsdGlwbGUgZGF0YWJhc2VzLgorCSAqLworCWlm IChwdWJfY29ubmluZm9fc3RyID09IE5VTEwpCisJeworCQkvKgorCQkgKiBGSVhNRSB1c2Ug cHJpbWFyeV9jb25uaW5mbyAoaWYgYXZhaWxhYmxlKSBmcm9tIHN1YnNjcmliZXIgYW5kCisJ CSAqIGV4dHJhY3QgcHVibGlzaGVyIGNvbm5lY3Rpb24gc3RyaW5nLiBBc3N1bWUgdGhhdCB0 aGVyZSBhcmUKKwkJICogaWRlbnRpY2FsIGVudHJpZXMgZm9yIHBoeXNpY2FsIGFuZCBsb2dp Y2FsIHJlcGxpY2F0aW9uLiBJZiB0aGVyZSBpcworCQkgKiBub3QsIHdlIHdvdWxkIGZhaWwg YW55d2F5LgorCQkgKi8KKwkJcGdfbG9nX2Vycm9yKCJubyBwdWJsaXNoZXIgY29ubmVjdGlv biBzdHJpbmcgc3BlY2lmaWVkIik7CisJCWZwcmludGYoc3RkZXJyLCBfKCJUcnkgXCIlcyAt LWhlbHBcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpLAorCQkJCXByb2duYW1lKTsKKwkJ ZXhpdCgxKTsKKwl9CisJZGJuYW1lX2Nvbm5pbmZvID0gcGdfbWFsbG9jKE5BTUVEQVRBTEVO KTsKKwlwdWJfYmFzZV9jb25uaW5mbyA9IGdldF9iYXNlX2Nvbm5pbmZvKHB1Yl9jb25uaW5m b19zdHIsIGRibmFtZV9jb25uaW5mbywKKwkJCQkJCQkJCQkgICJwdWJsaXNoZXIiKTsKKwlp ZiAocHViX2Jhc2VfY29ubmluZm8gPT0gTlVMTCkKKwkJZXhpdCgxKTsKKworCWlmIChzdWJf Y29ubmluZm9fc3RyID09IE5VTEwpCisJeworCQlwZ19sb2dfZXJyb3IoIm5vIHN1YnNjcmli ZXIgY29ubmVjdGlvbiBzdHJpbmcgc3BlY2lmaWVkIik7CisJCWZwcmludGYoc3RkZXJyLCBf KCJUcnkgXCIlcyAtLWhlbHBcIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiIpLAorCQkJCXBy b2duYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJc3ViX2Jhc2VfY29ubmluZm8gPSBnZXRfYmFz ZV9jb25uaW5mbyhzdWJfY29ubmluZm9fc3RyLCBOVUxMLCAic3Vic2NyaWJlciIpOworCWlm IChzdWJfYmFzZV9jb25uaW5mbyA9PSBOVUxMKQorCQlleGl0KDEpOworCisJaWYgKGRhdGFi YXNlX25hbWVzLmhlYWQgPT0gTlVMTCkKKwl7CisJCWlmICh2ZXJib3NlKQorCQkJcGdfbG9n X2luZm8oIm5vIGRhdGFiYXNlIHdhcyBzcGVjaWZpZWQiKTsKKworCQkvKgorCQkgKiBJZiAt LWRhdGFiYXNlIG9wdGlvbiBpcyBub3QgcHJvdmlkZWQsIHRyeSB0byBvYnRhaW4gdGhlIGRi bmFtZSBmcm9tCisJCSAqIHRoZSBwdWJsaXNoZXIgY29ubmluZm8uIElmIGRibmFtZSBwYXJh bWV0ZXIgaXMgbm90IGF2YWlsYWJsZSwgZXJyb3IKKwkJICogb3V0LgorCQkgKi8KKwkJaWYg KGRibmFtZV9jb25uaW5mbykKKwkJeworCQkJc2ltcGxlX3N0cmluZ19saXN0X2FwcGVuZCgm ZGF0YWJhc2VfbmFtZXMsIGRibmFtZV9jb25uaW5mbyk7CisJCQludW1fZGJzKys7CisKKwkJ CWlmICh2ZXJib3NlKQorCQkJCXBnX2xvZ19pbmZvKCJkYXRhYmFzZSBcIiVzXCIgd2FzIGV4 dHJhY3RlZCBmcm9tIHRoZSBwdWJsaXNoZXIgY29ubmVjdGlvbiBzdHJpbmciLAorCQkJCQkJ CWRibmFtZV9jb25uaW5mbyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwZ19sb2dfZXJyb3Io Im5vIGRhdGFiYXNlIG5hbWUgc3BlY2lmaWVkIik7CisJCQlmcHJpbnRmKHN0ZGVyciwgXygi VHJ5IFwiJXMgLS1oZWxwXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4iKSwKKwkJCQkJcHJv Z25hbWUpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCS8qCisJICogR2V0IHRoZSBhYnNv bHV0ZSBwZ19jdGwgcGF0aCBvbiB0aGUgc3Vic2NyaWJlci4KKwkgKi8KKwlwZ19jdGxfcGF0 aCA9IHBnX21hbGxvYyhNQVhQR1BBVEgpOworCXJjID0gZmluZF9vdGhlcl9leGVjKGFyZ3Zb MF0sICJwZ19jdGwiLAorCQkJCQkJICJwZ19jdGwgKFBvc3RncmVTUUwpICIgUEdfVkVSU0lP TiAiXG4iLAorCQkJCQkJIHBnX2N0bF9wYXRoKTsKKwlpZiAocmMgPCAwKQorCXsKKwkJY2hh cgkJZnVsbF9wYXRoW01BWFBHUEFUSF07CisKKwkJaWYgKGZpbmRfbXlfZXhlYyhhcmd2WzBd LCBmdWxsX3BhdGgpIDwgMCkKKwkJCXN0cmxjcHkoZnVsbF9wYXRoLCBwcm9nbmFtZSwgc2l6 ZW9mKGZ1bGxfcGF0aCkpOworCQlpZiAocmMgPT0gLTEpCisJCQlwZ19sb2dfZXJyb3IoIlRo ZSBwcm9ncmFtIFwiJXNcIiBpcyBuZWVkZWQgYnkgJXMgYnV0IHdhcyBub3QgZm91bmQgaW4g dGhlXG4iCisJCQkJCQkgInNhbWUgZGlyZWN0b3J5IGFzIFwiJXNcIi5cbiIKKwkJCQkJCSAi Q2hlY2sgeW91ciBpbnN0YWxsYXRpb24uIiwKKwkJCQkJCSAicGdfY3RsIiwgcHJvZ25hbWUs IGZ1bGxfcGF0aCk7CisJCWVsc2UKKwkJCXBnX2xvZ19lcnJvcigiVGhlIHByb2dyYW0gXCIl c1wiIHdhcyBmb3VuZCBieSBcIiVzXCJcbiIKKwkJCQkJCSAiYnV0IHdhcyBub3QgdGhlIHNh bWUgdmVyc2lvbiBhcyAlcy5cbiIKKwkJCQkJCSAiQ2hlY2sgeW91ciBpbnN0YWxsYXRpb24u IiwKKwkJCQkJCSAicGdfY3RsIiwgZnVsbF9wYXRoLCBwcm9nbmFtZSk7CisJCWV4aXQoMSk7 CisJfQorCisJaWYgKHZlcmJvc2UpCisJCXBnX2xvZ19pbmZvKCJwZ19jdGwgcGF0aCBpczog JXMiLCBwZ19jdGxfcGF0aCk7CisKKwkvKiBydWRpbWVudGFyeSBjaGVjayBmb3IgYSBkYXRh IGRpcmVjdG9yeS4gKi8KKwlpZiAoIWNoZWNrX2RhdGFfZGlyZWN0b3J5KHN1YnNjcmliZXJf ZGlyKSkKKwkJZXhpdCgxKTsKKworCS8qIHN1YnNjcmliZXIgUElEIGZpbGUuICovCisJc25w cmludGYocGlkZmlsZSwgTUFYUEdQQVRILCAiJXMvcG9zdG1hc3Rlci5waWQiLCBzdWJzY3Jp YmVyX2Rpcik7CisKKwkvKiBTdG9yZSBkYXRhYmFzZSBpbmZvcm1hdGlvbiBmb3IgcHVibGlz aGVyIGFuZCBzdWJzY3JpYmVyLiAqLworCWRiaW5mbyA9IChMb2dpY2FsUmVwSW5mbyAqKSBw Z19tYWxsb2MobnVtX2RicyAqIHNpemVvZihMb2dpY2FsUmVwSW5mbykpOworCWkgPSAwOwor CWZvciAoY2VsbCA9IGRhdGFiYXNlX25hbWVzLmhlYWQ7IGNlbGw7IGNlbGwgPSBjZWxsLT5u ZXh0KQorCXsKKwkJY2hhcgkgICAqY29ubmluZm87CisKKwkJLyogUHVibGlzaGVyLiAqLwor CQljb25uaW5mbyA9IGNvbmNhdF9jb25uaW5mb19kYm5hbWUocHViX2Jhc2VfY29ubmluZm8s IGNlbGwtPnZhbCk7CisJCWRiaW5mb1tpXS5wdWJjb25uaW5mbyA9IGNvbm5pbmZvOworCQlk YmluZm9baV0uZGJuYW1lID0gY2VsbC0+dmFsOworCQlkYmluZm9baV0ubWFkZV9yZXBsc2xv dCA9IGZhbHNlOworCQlkYmluZm9baV0ubWFkZV9wdWJsaWNhdGlvbiA9IGZhbHNlOworCQlk YmluZm9baV0ubWFkZV9zdWJzY3JpcHRpb24gPSBmYWxzZTsKKwkJLyogb3RoZXIgc3RydWN0 IGZpZWxkcyB3aWxsIGJlIGZpbGxlZCBsYXRlci4gKi8KKworCQkvKiBTdWJzY3JpYmVyLiAq LworCQljb25uaW5mbyA9IGNvbmNhdF9jb25uaW5mb19kYm5hbWUoc3ViX2Jhc2VfY29ubmlu Zm8sIGNlbGwtPnZhbCk7CisJCWRiaW5mb1tpXS5zdWJjb25uaW5mbyA9IGNvbm5pbmZvOwor CisJCWkrKzsKKwl9CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZSBzdWJzY3JpYmVyIGRhdGEg ZGlyZWN0b3J5IGhhcyB0aGUgc2FtZSBzeXN0ZW0gaWRlbnRpZmllcgorCSAqIHRoYW4gdGhl IHB1Ymxpc2hlciBkYXRhIGRpcmVjdG9yeS4KKwkgKi8KKwlwdWJfc3lzaWQgPSBwZ19tYWxs b2MoMzIpOworCXB1Yl9zeXNpZCA9IGdldF9zeXNpZF9mcm9tX2Nvbm4oZGJpbmZvWzBdLnB1 YmNvbm5pbmZvKTsKKwlzdWJfc3lzaWQgPSBwZ19tYWxsb2MoMzIpOworCXN1Yl9zeXNpZCA9 IGdldF9jb250cm9sX2Zyb21fZGF0YWRpcihzdWJzY3JpYmVyX2Rpcik7CisJaWYgKHN0cmNt cChwdWJfc3lzaWQsIHN1Yl9zeXNpZCkgIT0gMCkKKwl7CisJCXBnX2xvZ19lcnJvcigic3Vi c2NyaWJlciBkYXRhIGRpcmVjdG9yeSBpcyBub3QgYSBiYXNlIGJhY2t1cCBmcm9tIHRoZSBw dWJsaXNoZXIiKTsKKwkJZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIFN0b3AgdGhlIHN1YnNj cmliZXIgaWYgaXQgaXMgYSBzdGFuZGJ5IHNlcnZlci4gQmVmb3JlIGV4ZWN1dGluZyB0aGUK KwkgKiB0cmFuc2Zvcm1hdGlvbiBzdGVwcywgbWFrZSBzdXJlIHRoZSBzdWJzY3JpYmVyIGlz IG5vdCBydW5uaW5nIGJlY2F1c2UKKwkgKiBvbmUgb2YgdGhlIHN0ZXBzIGlzIHRvIG1vZGlm eSBzb21lIHJlY292ZXJ5IHBhcmFtZXRlcnMgdGhhdCByZXF1aXJlIGEKKwkgKiByZXN0YXJ0 LgorCSAqLworCWlmIChzdGF0KHBpZGZpbGUsICZzdGF0YnVmKSA9PSAwKQorCXsKKwkJaWYg KHZlcmJvc2UpCisJCXsKKwkJCXBnX2xvZ19pbmZvKCJzdWJzY3JpYmVyIGlzIHVwIGFuZCBy dW5uaW5nIik7CisJCQlwZ19sb2dfaW5mbygic3RvcHBpbmcgdGhlIHNlcnZlciB0byBzdGFy dCB0aGUgdHJhbnNmb3JtYXRpb24gc3RlcHMiKTsKKwkJfQorCisJCXBnX2N0bF9jbWQgPSBw c3ByaW50ZigiXCIlc1wiIHN0b3AgLUQgXCIlc1wiIC1zIiwgcGdfY3RsX3BhdGgsIHN1YnNj cmliZXJfZGlyKTsKKwkJcmMgPSBzeXN0ZW0ocGdfY3RsX2NtZCk7CisJCXBnX2N0bF9zdGF0 dXMocGdfY3RsX2NtZCwgcmMsIDApOworCX0KKworCS8qCisJICogQ3JlYXRlIGEgcmVwbGlj YXRpb24gc2xvdCBmb3IgZWFjaCBkYXRhYmFzZSBvbiB0aGUgcHVibGlzaGVyLgorCSAqLwor CWZvciAoaSA9IDA7IGkgPCBudW1fZGJzOyBpKyspCisJeworCQlQR3Jlc3VsdCAgICpyZXM7 CisJCWNoYXIJCXJlcGxzbG90bmFtZVtOQU1FREFUQUxFTl07CisKKwkJY29ubiA9IGNvbm5l Y3RfZGF0YWJhc2UoZGJpbmZvW2ldLnB1YmNvbm5pbmZvLCB0cnVlKTsKKwkJaWYgKGNvbm4g PT0gTlVMTCkKKwkJCWV4aXQoMSk7CisKKwkJcmVzID0gUFFleGVjKGNvbm4sCisJCQkJCSAi U0VMRUNUIG9pZCBGUk9NIHBnX2NhdGFsb2cucGdfZGF0YWJhc2UgV0hFUkUgZGF0bmFtZSA9 IGN1cnJlbnRfZGF0YWJhc2UoKSIpOworCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQ R1JFU19UVVBMRVNfT0spCisJCXsKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IG9idGFp biBkYXRhYmFzZSBPSUQ6ICVzIiwgUFFyZXN1bHRFcnJvck1lc3NhZ2UocmVzKSk7CisJCQlQ UWNsZWFyKHJlcyk7CisJCQlQUWZpbmlzaChjb25uKTsKKwkJCWV4aXQoMSk7CisJCX0KKwor CQlpZiAoUFFudHVwbGVzKHJlcykgIT0gMSkKKwkJeworCQkJcGdfbG9nX2Vycm9yKCJjb3Vs ZCBub3Qgb2J0YWluIGRhdGFiYXNlIE9JRDogZ290ICVkIHJvd3MsIGV4cGVjdGVkICVkIHJv d3MiLAorCQkJCQkJIFBRbnR1cGxlcyhyZXMpLCAxKTsKKwkJCVBRY2xlYXIocmVzKTsKKwkJ CVBRZmluaXNoKGNvbm4pOworCQkJZXhpdCgxKTsKKwkJfQorCisJCS8qIFJlbWVtYmVyIGRh dGFiYXNlIE9JRC4gKi8KKwkJZGJpbmZvW2ldLm9pZCA9IHN0cnRvdWwoUFFnZXR2YWx1ZShy ZXMsIDAsIDApLCBOVUxMLCAxMCk7CisKKwkJUFFjbGVhcihyZXMpOworCisJCS8qCisJCSAq IEJ1aWxkIHRoZSByZXBsaWNhdGlvbiBzbG90IG5hbWUuIFRoZSBuYW1lIG11c3Qgbm90IGV4 Y2VlZAorCQkgKiBOQU1FREFUQUxFTiAtIDEuIFRoaXMgY3VycmVudCBzY2hlbWEgdXNlcyBh IG1heGltdW0gb2YgMzYKKwkJICogY2hhcmFjdGVycyAoMTQgKyAxMCArIDEgKyAxMCArICdc MCcpLiBTeXN0ZW0gaWRlbnRpZmllciBpcyBpbmNsdWRlZAorCQkgKiB0byByZWR1Y2UgdGhl IHByb2JhYmlsaXR5IG9mIGNvbGxpc2lvbi4gQnkgZGVmYXVsdCwgc3Vic2NyaXB0aW9uCisJ CSAqIG5hbWUgaXMgdXNlZCBhcyByZXBsaWNhdGlvbiBzbG90IG5hbWUuCisJCSAqLworCQlz bnByaW50ZihyZXBsc2xvdG5hbWUsIHNpemVvZihyZXBsc2xvdG5hbWUpLAorCQkJCSAicGdf c3Vic2NyaWJlcl8ldV8lZCIsCisJCQkJIGRiaW5mb1tpXS5vaWQsCisJCQkJIChpbnQpIGdl dHBpZCgpKTsKKwkJZGJpbmZvW2ldLnN1Ym5hbWUgPSBwZ19zdHJkdXAocmVwbHNsb3RuYW1l KTsKKworCQkvKiBDcmVhdGUgcmVwbGljYXRpb24gc2xvdCBvbiBwdWJsaXNoZXIuICovCisJ CWlmIChjcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KGNvbm4sICZkYmluZm9baV0s IHJlcGxzbG90bmFtZSkgIT0gTlVMTCkKKwkJCXBnX2xvZ19pbmZvKCJjcmVhdGUgcmVwbGlj YXRpb24gc2xvdCBcIiVzXCIgb24gcHVibGlzaGVyIiwgcmVwbHNsb3RuYW1lKTsKKwkJZWxz ZQorCQkJZXhpdCgxKTsKKworCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4pOworCX0KKwor CS8qCisJICogQ3JlYXRlIGEgdGVtcG9yYXJ5IGxvZ2ljYWwgcmVwbGljYXRpb24gc2xvdCB0 byBnZXQgYSBjb25zaXN0ZW50IExTTi4KKwkgKgorCSAqIFRoaXMgY29uc2lzdGVudCBMU04g d2lsbCBiZSB1c2VkIGxhdGVyIHRvIGFkdmFuY2VkIHRoZSByZWNlbnRseSBjcmVhdGVkCisJ ICogcmVwbGljYXRpb24gc2xvdHMuIFdlIGNvdWxkIHByb2JhYmx5IHVzZSB0aGUgbGFzdCBj cmVhdGVkIHJlcGxpY2F0aW9uCisJICogc2xvdCwgaG93ZXZlciwgaWYgdGhpcyB0b29sIGRl Y2lkZXMgdG8gc3VwcG9ydCBjbG9uaW5nIHRoZSBwdWJsaXNoZXIKKwkgKiAodmlhIHBnX2Jh c2ViYWNrdXAgLS0gYWZ0ZXIgY3JlYXRpbmcgdGhlIHJlcGxpY2F0aW9uIHNsb3RzKSwgdGhl CisJICogY29uc2lzdGVudCBwb2ludCBzaG91bGQgYmUgYWZ0ZXIgdGhlIHBnX2Jhc2ViYWNr dXAgZmluaXNoZXMuCisJICovCisJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvWzBd LnB1YmNvbm5pbmZvLCBmYWxzZSk7CisJaWYgKGNvbm4gPT0gTlVMTCkKKwkJZXhpdCgxKTsK KwlzbnByaW50Zih0ZW1wX3JlcGxzbG90LCBzaXplb2YodGVtcF9yZXBsc2xvdCksICJwZ19z dWJzY3JpYmVyXyVkX3RtcCIsCisJCQkgKGludCkgZ2V0cGlkKCkpOworCWNvbnNpc3RlbnRf bHNuID0gY3JlYXRlX2xvZ2ljYWxfcmVwbGljYXRpb25fc2xvdChjb25uLCAmZGJpbmZvWzBd LAorCQkJCQkJCQkJCQkJCSB0ZW1wX3JlcGxzbG90KTsKKworCS8qCisJICogV3JpdGUgcmVj b3ZlcnkgcGFyYW1ldGVycy4KKwkgKgorCSAqIERlc3BpdGUgb2YgdGhlIHJlY292ZXJ5IHBh cmFtZXRlcnMgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBzdWJzY3JpYmVyLAorCSAqIHVzZSBh IHB1Ymxpc2hlciBjb25uZWN0aW9uIGZvciB0aGUgZm9sbHdpbmcgcmVjb3ZlcnkgZnVuY3Rp b25zLiBUaGUKKwkgKiBjb25uZWN0aW9uIGlzIG9ubHkgdXNlZCB0byBjaGVjayB0aGUgY3Vy cmVudCBzZXJ2ZXIgdmVyc2lvbiAocGh5c2ljYWwKKwkgKiByZXBsaWNhLCBzYW1lIHNlcnZl ciB2ZXJzaW9uKS4gVGhlIHN1YnNjcmliZXIgaXMgbm90IHJ1bm5pbmcgeWV0LgorCSAqLwor CXJlY292ZXJ5Y29uZmNvbnRlbnRzID0gR2VuZXJhdGVSZWNvdmVyeUNvbmZpZyhjb25uLCBO VUxMKTsKKwlhcHBlbmRQUUV4cEJ1ZmZlcihyZWNvdmVyeWNvbmZjb250ZW50cywgInJlY292 ZXJ5X3RhcmdldF9sc24gPSAnJXMnXG4iLAorCQkJCQkgIGNvbnNpc3RlbnRfbHNuKTsKKwlh cHBlbmRQUUV4cEJ1ZmZlcihyZWNvdmVyeWNvbmZjb250ZW50cywgInJlY292ZXJ5X3Rhcmdl dF9pbmNsdXNpdmUgPSB0cnVlXG4iKTsKKwlhcHBlbmRQUUV4cEJ1ZmZlcihyZWNvdmVyeWNv bmZjb250ZW50cywgInJlY292ZXJ5X3RhcmdldF9hY3Rpb24gPSBwcm9tb3RlXG4iKTsKKwor CVdyaXRlUmVjb3ZlcnlDb25maWcoY29ubiwgc3Vic2NyaWJlcl9kaXIsIHJlY292ZXJ5Y29u ZmNvbnRlbnRzKTsKKwlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4pOworCisJLyoKKwkgKiBT dGFydCBzdWJzY3JpYmVyIGFuZCB3YWl0IHVudGlsIGFjY2VwdGluZyBjb25uZWN0aW9ucy4K KwkgKi8KKwlpZiAodmVyYm9zZSkKKwkJcGdfbG9nX2luZm8oInN0YXJ0aW5nIHRoZSBzdWJz Y3JpYmVyIik7CisKKwlwZ19jdGxfY21kID0gcHNwcmludGYoIlwiJXNcIiBzdGFydCAtRCBc IiVzXCIgLXMiLCBwZ19jdGxfcGF0aCwgc3Vic2NyaWJlcl9kaXIpOworCXJjID0gc3lzdGVt KHBnX2N0bF9jbWQpOworCXBnX2N0bF9zdGF0dXMocGdfY3RsX2NtZCwgcmMsIDEpOworCXdh aXRfcG9zdG1hc3Rlcl9jb25uZWN0aW9uKGRiaW5mb1swXS5zdWJjb25uaW5mbyk7CisKKwkv KgorCSAqIFdhaXRpbmcgdGhlIHN1YnNjcmliZXIgdG8gYmUgcHJvbW90ZWQuCisJICovCisJ d2FpdF9mb3JfZW5kX3JlY292ZXJ5KGRiaW5mb1swXS5zdWJjb25uaW5mbyk7CisKKwkvKgor CSAqIENyZWF0ZSBhIHB1YmxpY2F0aW9uIGZvciBlYWNoIGRhdGFiYXNlLiBUaGlzIHN0ZXAg c2hvdWxkIGJlIGV4ZWN1dGVkCisJICogYWZ0ZXIgcHJvbW90aW5nIHRoZSBzdWJzY3JpYmVy IHRvIGF2b2lkIHJlcGxpY2F0aW5nIHVubmVjZXNzYXJ5CisJICogb2JqZWN0cy4KKwkgKi8K Kwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RiczsgaSsrKQorCXsKKwkJY2hhcgkJcHVibmFtZVtO QU1FREFUQUxFTl07CisKKwkJLyogQ29ubmVjdCB0byBwdWJsaXNoZXIuICovCisJCWNvbm4g PSBjb25uZWN0X2RhdGFiYXNlKGRiaW5mb1tpXS5wdWJjb25uaW5mbywgdHJ1ZSk7CisJCWlm IChjb25uID09IE5VTEwpCisJCQlleGl0KDEpOworCisJCS8qCisJCSAqIEJ1aWxkIHRoZSBw dWJsaWNhdGlvbiBuYW1lLiBUaGUgbmFtZSBtdXN0IG5vdCBleGNlZWQgTkFNRURBVEFMRU4g LQorCQkgKiAxLiBUaGlzIGN1cnJlbnQgc2NoZW1hIHVzZXMgYSBtYXhpbXVtIG9mIDM1IGNo YXJhY3RlcnMgKDE0ICsgMTAgKworCQkgKiAnXDAnKS4KKwkJICovCisJCXNucHJpbnRmKHB1 Ym5hbWUsIHNpemVvZihwdWJuYW1lKSwgInBnX3N1YnNjcmliZXJfJXUiLCBkYmluZm9baV0u b2lkKTsKKwkJZGJpbmZvW2ldLnB1Ym5hbWUgPSBwZ19zdHJkdXAocHVibmFtZSk7CisKKwkJ Y3JlYXRlX3B1YmxpY2F0aW9uKGNvbm4sICZkYmluZm9baV0pOworCisJCWRpc2Nvbm5lY3Rf ZGF0YWJhc2UoY29ubik7CisJfQorCisJLyoKKwkgKiBDcmVhdGUgYSBzdWJzY3JpcHRpb24g Zm9yIGVhY2ggZGF0YWJhc2UuCisJICovCisJZm9yIChpID0gMDsgaSA8IG51bV9kYnM7IGkr KykKKwl7CisJCS8qIENvbm5lY3QgdG8gc3Vic2NyaWJlci4gKi8KKwkJY29ubiA9IGNvbm5l Y3RfZGF0YWJhc2UoZGJpbmZvW2ldLnN1YmNvbm5pbmZvLCB0cnVlKTsKKwkJaWYgKGNvbm4g PT0gTlVMTCkKKwkJCWV4aXQoMSk7CisKKwkJY3JlYXRlX3N1YnNjcmlwdGlvbihjb25uLCAm ZGJpbmZvW2ldKTsKKworCQkvKiBTZXQgdGhlIHJlcGxpY2F0aW9uIHByb2dyZXNzIHRvIHRo ZSBjb3JyZWN0IExTTi4gKi8KKwkJc2V0X3JlcGxpY2F0aW9uX3Byb2dyZXNzKGNvbm4sICZk YmluZm9baV0sIGNvbnNpc3RlbnRfbHNuKTsKKworCQkvKiBFbmFibGUgc3Vic2NyaXB0aW9u LiAqLworCQllbmFibGVfc3Vic2NyaXB0aW9uKGNvbm4sICZkYmluZm9baV0pOworCisJCWRp c2Nvbm5lY3RfZGF0YWJhc2UoY29ubik7CisJfQorCisJLyoKKwkgKiBUaGUgdGVtcG9yYXJ5 IHJlcGxpY2F0aW9uIHNsb3QgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkLiBEcm9wIGl0LgorCSAq IFhYWCB3ZSBtaWdodCBub3QgZmFpbCBoZXJlLiBJbnN0ZWFkLCBwcm92aWRlIGEgd2Fybmlu ZyBzbyB0aGUgdXNlcgorCSAqIFhYWCBldmVudHVhbGx5IGRyb3BzIHRoZSByZXBsaWNhdGlv biBzbG90IGxhdGVyLgorCSAqLworCWNvbm4gPSBjb25uZWN0X2RhdGFiYXNlKGRiaW5mb1sw XS5wdWJjb25uaW5mbywgdHJ1ZSk7CisJaWYgKGNvbm4gPT0gTlVMTCkKKwkJZXhpdCgxKTsK Kwlkcm9wX3JlcGxpY2F0aW9uX3Nsb3QoY29ubiwgJmRiaW5mb1swXSwgdGVtcF9yZXBsc2xv dCk7CisJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uKTsKKworCS8qCisJICogU3RvcCB0aGUg c3Vic2NyaWJlci4KKwkgKi8KKwlpZiAodmVyYm9zZSkKKwkJcGdfbG9nX2luZm8oInN0b3Bw aW5nIHRoZSBzdWJzY3JpYmVyIik7CisKKwlwZ19jdGxfY21kID0gcHNwcmludGYoIlwiJXNc IiBzdG9wIC1EIFwiJXNcIiAtcyIsIHBnX2N0bF9wYXRoLCBzdWJzY3JpYmVyX2Rpcik7CisJ cmMgPSBzeXN0ZW0ocGdfY3RsX2NtZCk7CisJcGdfY3RsX3N0YXR1cyhwZ19jdGxfY21kLCBy YywgMCk7CisKKwlzdWNjZXNzID0gdHJ1ZTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0 IGEvc3JjL2Jpbi9wZ19zdWJzY3JpYmVyL3QvMDAxX2Jhc2ljLnBsIGIvc3JjL2Jpbi9wZ19z dWJzY3JpYmVyL3QvMDAxX2Jhc2ljLnBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwMDAuLjgyNGU3ZDc5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvYmluL3BnX3N1 YnNjcmliZXIvdC8wMDFfYmFzaWMucGwKQEAgLTAsMCArMSw0MSBAQAorIyBDb3B5cmlnaHQg KGMpIDIwMjIsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisKK3VzZSBz dHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2UgQ3dkOwordXNlIENvbmZpZzsKK3VzZSBGaWxl OjpCYXNlbmFtZSBxdyhiYXNlbmFtZSBkaXJuYW1lKTsKK3VzZSBGaWxlOjpQYXRoIHF3KHJt dHJlZSk7Cit1c2UgRmNudGwgcXcoOnNlZWspOwordXNlIFBvc3RncmVTUUw6OlRlc3Q6OkNs dXN0ZXI7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1c2UgVGVzdDo6TW9yZTsK KworcHJvZ3JhbV9oZWxwX29rKCdwZ19zdWJzY3JpYmVyJyk7Citwcm9ncmFtX3ZlcnNpb25f b2soJ3BnX3N1YnNjcmliZXInKTsKK3Byb2dyYW1fb3B0aW9uc19oYW5kbGluZ19vaygncGdf c3Vic2NyaWJlcicpOworCitteSAkdGVtcGRpciA9IFBvc3RncmVTUUw6OlRlc3Q6OlV0aWxz Ojp0ZW1wZGlyOworCitteSAkbm9kZSA9IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5l dygncHVibGlzaGVyJyk7Ciskbm9kZS0+aW5pdChhbGxvd3Nfc3RyZWFtaW5nID0+ICdsb2dp Y2FsJyk7Ciskbm9kZS0+c3RhcnQ7CisKKyRub2RlLT5jb21tYW5kX2ZhaWxzX2xpa2UoCisJ WydwZ19zdWJzY3JpYmVyJ10sCisJcXIvbm8gc3Vic2NyaWJlciBkYXRhIGRpcmVjdG9yeSBz cGVjaWZpZWQvLAorCSd0YXJnZXQgZGlyZWN0b3J5IG11c3QgYmUgc3BlY2lmaWVkJyk7Cisk bm9kZS0+Y29tbWFuZF9mYWlsc19saWtlKAorCVsncGdfc3Vic2NyaWJlcicsICctRCcsICR0 ZW1wZGlyXSwKKwlxci9ubyBwdWJsaXNoZXIgY29ubmVjdGlvbiBzdHJpbmcgc3BlY2lmaWVk LywKKwkncHVibGlzaGVyIGNvbm5lY3Rpb24gc3RyaW5nIG11c3QgYmUgc3BlY2lmaWVkJyk7 Ciskbm9kZS0+Y29tbWFuZF9mYWlsc19saWtlKAorCVsncGdfc3Vic2NyaWJlcicsICctRCcs ICR0ZW1wZGlyLCAnLVAnLCAnZGJuYW1lPXBvc3RncmVzJ10sCisJcXIvbm8gc3Vic2NyaWJl ciBjb25uZWN0aW9uIHN0cmluZyBzcGVjaWZpZWQvLAorCSdzdWJzY3JpYmVyIGNvbm5lY3Rp b24gc3RyaW5nIG11c3QgYmUgc3BlY2lmaWVkJyk7Ciskbm9kZS0+Y29tbWFuZF9mYWlsc19s aWtlKAorCVsncGdfc3Vic2NyaWJlcicsICctRCcsICR0ZW1wZGlyLCAnLVAnLCAnZGJuYW1l PXBvc3RncmVzJywgJy1TJywgJ2RibmFtZT1wb3N0Z3JlcyddLAorCXFyL2lzIG5vdCBhIGRh dGFiYXNlIGNsdXN0ZXIgZGlyZWN0b3J5LywKKwknZGlyZWN0b3J5IG11c3QgYmUgYSByZWFs IGRhdGFiYXNlIGNsdXN0ZXIgZGlyZWN0b3J5Jyk7CisKK2RvbmVfdGVzdGluZygpOwpkaWZm IC0tZ2l0IGEvc3JjL3Rvb2xzL21zdmMvTWt2Y2J1aWxkLnBtIGIvc3JjL3Rvb2xzL21zdmMv TWt2Y2J1aWxkLnBtCmluZGV4IDEwNWY1YzcyYTIuLjMzMGQzMTJlZTYgMTAwNjQ0Ci0tLSBh L3NyYy90b29scy9tc3ZjL01rdmNidWlsZC5wbQorKysgYi9zcmMvdG9vbHMvbXN2Yy9Na3Zj YnVpbGQucG0KQEAgLTU1LDcgKzU1LDcgQEAgbXkgQGNvbnRyaWJfZXhjbHVkZXMgPSAoCiAj IFNldCBvZiB2YXJpYWJsZXMgZm9yIGZyb250ZW5kIG1vZHVsZXMKIG15ICRmcm9udGVuZF9k ZWZpbmVzID0geyAnaW5pdGRiJyA9PiAnRlJPTlRFTkQnIH07CiBteSBAZnJvbnRlbmRfdXNl bGlicHEgPQotICAoJ3BnX2FtY2hlY2snLCAncGdfY3RsJywgJ3BnX3VwZ3JhZGUnLCAncGdi ZW5jaCcsICdwc3FsJywgJ2luaXRkYicpOworICAoJ3BnX2FtY2hlY2snLCAncGdfY3RsJywg J3BnX3VwZ3JhZGUnLCAncGdiZW5jaCcsICdwc3FsJywgJ2luaXRkYicsICdwZ19zdWJzY3Jp YmVyJyk7CiBteSBAZnJvbnRlbmRfdXNlbGlicGdwb3J0ID0gKAogCSdwZ19hbWNoZWNrJywg ICAgJ3BnX2FyY2hpdmVjbGVhbnVwJywKIAkncGdfdGVzdF9mc3luYycsICdwZ190ZXN0X3Rp bWluZycsCi0tIAoyLjMwLjIKCg== --e6195eae3ac747b7a59e5b5e0808269d--