Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rAmFj-008Ad7-4g for pgsql-hackers@arkaria.postgresql.org; Wed, 06 Dec 2023 07:23:28 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rAmFh-0082ly-CT for pgsql-hackers@arkaria.postgresql.org; Wed, 06 Dec 2023 07:23:25 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rAmFf-0082lp-8u for pgsql-hackers@lists.postgresql.org; Wed, 06 Dec 2023 07:23:25 +0000 Received: from wout4-smtp.messagingengine.com ([64.147.123.20]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rAmFY-0092fr-48 for pgsql-hackers@lists.postgresql.org; Wed, 06 Dec 2023 07:23:21 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailout.west.internal (Postfix) with ESMTP id 93B643200AC7; Wed, 6 Dec 2023 02:23:12 -0500 (EST) Received: from imap49 ([10.202.2.99]) by compute2.internal (MEProxy); Wed, 06 Dec 2023 02:23:13 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eulerto.com; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:sender :subject:subject:to:to; s=fm2; t=1701847392; x=1701933792; bh=CP ZwTqOvfX0ixhBdMNmowf1NAwXrXq3g+ezighlT4Bk=; b=CHOa1qzQjP/NBGNb/Z ON2q/MW3qE8gn6bMmb+AiVmKfXjeYFuTG6RcAaucC9vwe0ybuLoI/qLdshiwk9oQ bRT2I6k8Ex2U2NIDZ/6D/NbAN8mll0MaXY+lT3UkhEaFaTyV71Z7PCmscpwGOd2s 1xGYZiFwcj//zLIPy3zx13ItlXgxMvDsz+N321Y6BqyeUWA2tJ4zls05pg2x6+J9 m4JEKU7RWdAVoq9qZXasXkutp3MvuG/py63G04kcDlvRt5SfOfM3glXl0ieN35AK yvnZ/RTXFIEqcM2BF3olQ0wNy/pnGPQqrvRvPW0FoOBmqMLO8m87QEDwf450Elws kvzA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:sender:subject :subject:to:to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender :x-sasl-enc; s=fm1; t=1701847392; x=1701933792; bh=CPZwTqOvfX0ix hBdMNmowf1NAwXrXq3g+ezighlT4Bk=; b=QIO/2OqOLr/YpxG0beXs8ng5TV6Ap eDNhi8KXmVSjd0h52z1o3iODFrRcKPcVw5WSqfFnE77kSSJn73nUumZm9rIP0iA8 NNKOSlsijJUXfl07LvczGksBGHurgBLxPEXW7rCsdqmQqmiyh3wq4lPJ9A5Sf0tf Hj/VHTeUelDXVx8W+taUXG47laKEUSevI9pkDU44bFOrIWZgertmUlfiprFFheNu 5ddY74vb//EK7sZSKDhp8kxlzAsYmY3qtiKfBeaoDxQ636ToJgn7/7jMu54mj4ix QUYQnvcqP2F5VKA5OqwK0UjZF0tXm1x3qTky8cuQgmm0G6whRuYVuTlRQ== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvkedrudejledgleefucetufdoteggodetrfdotf fvucfrrhhofhhilhgvmecuhfgrshhtofgrihhlpdfqfgfvpdfurfetoffkrfgpnffqhgen uceurghilhhouhhtmecufedttdenucesvcftvggtihhpihgvnhhtshculddquddttddmne cujfgurhepofgfggfkjghffffhvfevufgtsehmtderreerredtnecuhfhrohhmpedfgfhu lhgvrhcuvfgrvhgvihhrrgdfuceovghulhgvrhesvghulhgvrhhtohdrtghomheqnecugg ftrfgrthhtvghrnhepfffggfettdeggffhteekveefieevueefieduieeiteeggeefueej ffeltefghedtnecuffhomhgrihhnpehpohhsthhgrhdrvghspdgvnhhtvghrphhrihhsvg gusgdrtghomhenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgrihhlfhhr ohhmpegvuhhlvghrsegvuhhlvghrthhordgtohhm X-ME-Proxy: Feedback-ID: i0c21471d:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id 2178615A0091; Wed, 6 Dec 2023 02:23:11 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.9.0-alpha0-1178-geeaf0069a7-fm-20231114.001-geeaf0069 MIME-Version: 1.0 Message-Id: In-Reply-To: References: <5ac50071-f2ed-4ace-a8fd-b892cffd33eb@www.fastmail.com> <4710d895-689a-4ae6-b8e3-344286dbf970@app.fastmail.com> <96e3b739-d63d-4d35-90a3-7869465b7167@eisentraut.org> Date: Wed, 06 Dec 2023 04:21:44 -0300 From: "Euler Taveira" To: "Michael Paquier" , "Peter Eisentraut" Cc: pgsql-hackers@lists.postgresql.org, "Amit Kapila" , "Andres Freund" , "Ashutosh Bapat" Subject: Re: speed up a logical replica setup Content-Type: multipart/mixed; boundary=f7e5406a42f348e09bd227f4dc389312 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --f7e5406a42f348e09bd227f4dc389312 Content-Type: multipart/alternative; boundary=a0771c86708142a29114facbf42b8a68 --a0771c86708142a29114facbf42b8a68 Content-Type: text/plain On Thu, Nov 9, 2023, at 8:12 PM, Michael Paquier wrote: > On Thu, Nov 09, 2023 at 03:41:53PM +0100, Peter Eisentraut wrote: > > On 08.11.23 00:12, Michael Paquier wrote: > >> - Should the subdirectory pg_basebackup be renamed into something more > >> generic at this point? All these things are frontend tools that deal > >> in some way with the replication protocol to do their work. Say > >> a replication_tools? > > > > Seems like unnecessary churn. Nobody has complained about any of the other > > tools in there. > > Not sure. We rename things across releases in the tree from time to > time, and here that's straight-forward. Based on this discussion it seems we have a consensus that this tool should be in the pg_basebackup directory. (If/when we agree with the directory renaming, it could be done in a separate patch.) Besides this move, the v3 provides a dry run mode. It basically executes every routine but skip when should do modifications. It is an useful option to check if you will be able to run it without having issues with connectivity, permission, and existing objects (replication slots, publications, subscriptions). Tests were slightly improved. Messages were changed to *not* provide INFO messages by default and --verbose provides INFO messages and --verbose --verbose also provides DEBUG messages. I also refactored the connect_database() function into which the connection will always use the logical replication mode. A bug was fixed in the transient replication slot name. Ashutosh review [1] was included. The code was also indented. There are a few suggestions from Ashutosh [2] that I will reply in another email. I'm still planning to work on the following points: 1. improve the cleanup routine to point out leftover objects if there is any connection issue. 2. remove the physical replication slot if the standby is using one (primary_slot_name). 3. provide instructions to promote the logical replica into primary, I mean, stop the replication between the nodes and remove the replication setup (publications, subscriptions, replication slots). Or even include another action to do it. We could add both too. Point 1 should be done. Points 2 and 3 aren't essential but will provide a nice UI for users that would like to use it. [1] https://postgr.es/m/CAExHW5sCAU3NvPKd7msScQKvrBN-x_AdDQD-ZYAwOxuWG%3Doz1w%40mail.gmail.com [2] https://postgr.es/m/CAExHW5vHFemFvTUHe+7XWphVZJxrEXz5H3dD4UQi7CwmdMJQYg@mail.gmail.com -- Euler Taveira EDB https://www.enterprisedb.com/ --a0771c86708142a29114facbf42b8a68 Content-Type: text/html Content-Transfer-Encoding: quoted-printable
On Thu, Nov 9, = 2023, at 8:12 PM, Michael Paquier wrote:
On Thu, Nov 09, 2023 at 03:41:53PM +0100, = Peter Eisentraut wrote:
> On 08.11.23 00:12, Michael Pa= quier wrote:
>> - Should the subdirectory pg_basebac= kup be renamed into something more
>> generic at thi= s point?  All these things are frontend tools that deal
>> in some way with the replication protocol to do their work.&= nbsp; Say
>> a replication_tools?
>=  
> Seems like unnecessary churn.  Nobody has= complained about any of the other
> tools in there.

Not sure.  We rename things across relea= ses in the tree from time to
time, and here that's straigh= t-forward.

Based on this discu= ssion it seems we have a consensus that this tool should be
in the pg_basebackup directory. (If/when we agree with the directory r= enaming,
it could be done in a separate patch.) Besides th= is move, the v3 provides a dry
run mode. It basically exec= utes every routine but skip when should do
modifications. = It is an useful option to check if you will be able to run it
<= div>without having issues with connectivity, permission, and existing ob= jects
(replication slots, publications, subscriptions). Te= sts were slightly improved.
Messages were changed to *not*= provide INFO messages by default and --verbose
provides I= NFO messages and --verbose --verbose also provides DEBUG messages. I
=
also refactored the connect_database() function into which th= e connection will
always use the logical replication mode.= A bug was fixed in the transient
replication slot name. A= shutosh review [1] was included. The code was also indented.

There are a few suggestions from Ashutosh [2] that I w= ill reply in another
email.

I= 'm still planning to work on the following points:

1. improve the cleanup routine to point out leftover objects if = there is any
   connection issue.
= 2. remove the physical replication slot if the standby is using one
<= /div>
   (primary_slot_name).
3. provide ins= tructions to promote the logical replica into primary, I mean,
=
   stop the replication between the nodes and remove the = replication setup
   (publications, subscription= s, replication slots). Or even include another
  = ; action to do it. We could add both too.

P= oint 1 should be done. Points 2 and 3 aren't essential but will provide = a nice
UI for users that would like to use it.




--
Euler T= aveira

--a0771c86708142a29114facbf42b8a68-- --f7e5406a42f348e09bd227f4dc389312 Content-Disposition: attachment; filename*0="v3-0001-Creates-a-new-logical-replica-from-a-standby-serv.pat"; filename*1="ch" Content-Type: text/x-patch; name="=?UTF-8?Q?v3-0001-Creates-a-new-logical-replica-from-a-standby-serv.patc?= =?UTF-8?Q?h?=" Content-Transfer-Encoding: BASE64 RnJvbSAwMDMyNTViNjQ5MTBjZTczZjE1OTMxYTQzZGVmMjVjMzdiZTk2YjgxIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBFdWxlciBUYXZlaXJhIDxldWxlci50YXZlaXJhQGVu dGVycHJpc2VkYi5jb20+CkRhdGU6IE1vbiwgNSBKdW4gMjAyMyAxNDozOTo0MCAtMDQwMApT dWJqZWN0OiBbUEFUQ0ggdjNdIENyZWF0ZXMgYSBuZXcgbG9naWNhbCByZXBsaWNhIGZyb20g YSBzdGFuZGJ5IHNlcnZlcgoKQSBuZXcgdG9vbCBjYWxsZWQgcGdfc3Vic2NyaWJlciBjYW4g Y29udmVydCBhIHBoeXNpY2FsIHJlcGxpY2EgaW50byBhCmxvZ2ljYWwgcmVwbGljYS4gSXQg cnVucyBvbiB0aGUgdGFyZ2V0IHNlcnZlciBhbmQgc2hvdWxkIGJlIGFibGUgdG8KY29ubmVj dCB0byB0aGUgc291cmNlIHNlcnZlciAocHVibGlzaGVyKSBhbmQgdGhlIHRhcmdldCBzZXJ2 ZXIKKHN1YnNjcmliZXIpLgoKVGhlIGNvbnZlcnNpb24gcmVxdWlyZXMgYSBmZXcgc3RlcHMu IENoZWNrIGlmIHRoZSB0YXJnZXQgZGF0YSBkaXJlY3RvcnkKaGFzIHRoZSBzYW1lIHN5c3Rl bSBpZGVudGlmaWVyIHRoYW4gdGhlIHNvdXJjZSBkYXRhIGRpcmVjdG9yeS4gU3RvcCB0aGUK dGFyZ2V0IHNlcnZlciBpZiBpdCBpcyBydW5uaW5nIGFzIGEgc3RhbmRieSBzZXJ2ZXIuIENy ZWF0ZSBvbmUKcmVwbGljYXRpb24gc2xvdCBwZXIgc3BlY2lmaWVkIGRhdGFiYXNlIG9uIHRo ZSBzb3VyY2Ugc2VydmVyLiBPbmUKYWRkaXRpb25hbCByZXBsaWNhdGlvbiBzbG90IGlzIGNy ZWF0ZWQgYXQgdGhlIGVuZCB0byBnZXQgdGhlIGNvbnNpc3RlbnQKTFNOIChUaGlzIGNvbnNp c3RlbnQgTFNOIHdpbGwgYmUgdXNlZCBhcyAoYSkgYSBzdG9wcGluZyBwb2ludCBmb3IgdGhl CnJlY292ZXJ5IHByb2Nlc3MgYW5kIChiKSBhIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgc3Vi c2NyaXB0aW9ucykuIFdyaXRlCnJlY292ZXJ5IHBhcmFtZXRlcnMgaW50byB0aGUgdGFyZ2V0 IGRhdGEgZGlyZWN0b3J5IGFuZCBzdGFydCB0aGUgdGFyZ2V0CnNlcnZlciAoV2FpdCB1bnRp bCB0aGUgdGFyZ2V0IHNlcnZlciBpcyBwcm9tb3RlZCkuIENyZWF0ZSBvbmUKcHVibGljYXRp b24gKEZPUiBBTEwgVEFCTEVTKSBwZXIgc3BlY2lmaWVkIGRhdGFiYXNlIG9uIHRoZSBzb3Vy Y2UKc2VydmVyLiBDcmVhdGUgb25lIHN1YnNjcmlwdGlvbiBwZXIgc3BlY2lmaWVkIGRhdGFi YXNlIG9uIHRoZSB0YXJnZXQKc2VydmVyIChVc2UgcmVwbGljYXRpb24gc2xvdCBhbmQgcHVi bGljYXRpb24gY3JlYXRlZCBpbiBhIHByZXZpb3VzIHN0ZXAuCkRvbid0IGVuYWJsZSB0aGUg c3Vic2NyaXB0aW9ucyB5ZXQpLiBTZXRzIHRoZSByZXBsaWNhdGlvbiBwcm9ncmVzcyB0bwp0 aGUgY29uc2lzdGVudCBMU04gdGhhdCB3YXMgZ290IGluIGEgcHJldmlvdXMgc3RlcC4gRW5h YmxlIHRoZQpzdWJzY3JpcHRpb24gZm9yIGVhY2ggc3BlY2lmaWVkIGRhdGFiYXNlIG9uIHRo ZSB0YXJnZXQgc2VydmVyLiBSZW1vdmUKdGhlIGFkZGl0aW9uYWwgcmVwbGljYXRpb24gc2xv dCB0aGF0IHdhcyB1c2VkIHRvIGdldCB0aGUgY29uc2lzdGVudCBMU04uClN0b3AgdGhlIHRh cmdldCBzZXJ2ZXIuIENoYW5nZSB0aGUgc3lzdGVtIGlkZW50aWZpZXIgZnJvbSB0aGUgdGFy Z2V0CnNlcnZlci4KCkRlcGVuZGluZyBvbiB5b3VyIHdvcmtsb2FkIGFuZCBkYXRhYmFzZSBz aXplLCBjcmVhdGluZyBhIGxvZ2ljYWwgcmVwbGljYQpjb3VsZG4ndCBiZSBhbiBvcHRpb24g ZHVlIHRvIHJlc291cmNlIGNvbnN0cmFpbnRzIChXQUwgYmFja2xvZyBzaG91bGQgYmUKYXZh aWxhYmxlIHVudGlsIGFsbCB0YWJsZSBkYXRhIGlzIHN5bmNocm9uaXplZCkuIFRoZSBpbml0 aWFsIGRhdGEgY29weQphbmQgdGhlIHJlcGxpY2F0aW9uIHByb2dyZXNzIHRlbmRzIHRvIGJl IGZhc3RlciBvbiBhIHBoeXNpY2FsIHJlcGxpY2EuClRoZSBwdXJwb3NlIG9mIHRoaXMgdG9v bCBpcyB0byBzcGVlZCB1cCBhIGxvZ2ljYWwgcmVwbGljYSBzZXR1cC4KLS0tCiBkb2Mvc3Jj L3NnbWwvcmVmL2FsbGZpbGVzLnNnbWwgICAgICAgICAgICAgICAgfCAgICAxICsKIGRvYy9z cmMvc2dtbC9yZWYvcGdfc3Vic2NyaWJlci5zZ21sICAgICAgICAgICB8ICAyODQgKysrCiBk b2Mvc3JjL3NnbWwvcmVmZXJlbmNlLnNnbWwgICAgICAgICAgICAgICAgICAgfCAgICAxICsK IHNyYy9iaW4vcGdfYmFzZWJhY2t1cC9NYWtlZmlsZSAgICAgICAgICAgICAgICB8ICAgIDgg Ky0KIHNyYy9iaW4vcGdfYmFzZWJhY2t1cC9tZXNvbi5idWlsZCAgICAgICAgICAgICB8ICAg MTkgKwogc3JjL2Jpbi9wZ19iYXNlYmFja3VwL3BnX3N1YnNjcmliZXIuYyAgICAgICAgIHwg MTUxNyArKysrKysrKysrKysrKysrKwogc3JjL2Jpbi9wZ19iYXNlYmFja3VwL3QvMDQwX3Bn X3N1YnNjcmliZXIucGwgIHwgICA0NCArCiAuLi4vdC8wNDFfcGdfc3Vic2NyaWJlcl9zdGFu ZGJ5LnBsICAgICAgICAgICAgfCAgMTM5ICsrCiBzcmMvdG9vbHMvbXN2Yy9Na3ZjYnVpbGQu cG0gICAgICAgICAgICAgICAgICAgfCAgICAyICstCiA5IGZpbGVzIGNoYW5nZWQsIDIwMTMg aW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkb2Mv c3JjL3NnbWwvcmVmL3BnX3N1YnNjcmliZXIuc2dtbAogY3JlYXRlIG1vZGUgMTAwNjQ0IHNy Yy9iaW4vcGdfYmFzZWJhY2t1cC9wZ19zdWJzY3JpYmVyLmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBzcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wNDBfcGdfc3Vic2NyaWJlci5wbAogY3JlYXRl IG1vZGUgMTAwNjQ0IHNyYy9iaW4vcGdfYmFzZWJhY2t1cC90LzA0MV9wZ19zdWJzY3JpYmVy X3N0YW5kYnkucGwKCmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcmVmL2FsbGZpbGVzLnNn bWwgYi9kb2Mvc3JjL3NnbWwvcmVmL2FsbGZpbGVzLnNnbWwKaW5kZXggNTRiNWYyMmQ2ZS4u ZTJlY2I0Zjk0NCAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL3JlZi9hbGxmaWxlcy5zZ21s CisrKyBiL2RvYy9zcmMvc2dtbC9yZWYvYWxsZmlsZXMuc2dtbApAQCAtMjEzLDYgKzIxMyw3 IEBAIENvbXBsZXRlIGxpc3Qgb2YgdXNhYmxlIHNnbWwgc291cmNlIGZpbGVzIGluIHRoaXMg ZGlyZWN0b3J5LgogPCFFTlRJVFkgcGdSZXNldHdhbCAgICAgICAgIFNZU1RFTSAicGdfcmVz ZXR3YWwuc2dtbCI+CiA8IUVOVElUWSBwZ1Jlc3RvcmUgICAgICAgICAgU1lTVEVNICJwZ19y ZXN0b3JlLnNnbWwiPgogPCFFTlRJVFkgcGdSZXdpbmQgICAgICAgICAgIFNZU1RFTSAicGdf cmV3aW5kLnNnbWwiPgorPCFFTlRJVFkgcGdTdWJzY3JpYmVyICAgICAgIFNZU1RFTSAicGdf c3Vic2NyaWJlci5zZ21sIj4KIDwhRU5USVRZIHBnVmVyaWZ5QmFja3VwICAgICBTWVNURU0g InBnX3ZlcmlmeWJhY2t1cC5zZ21sIj4KIDwhRU5USVRZIHBndGVzdGZzeW5jICAgICAgICBT WVNURU0gInBndGVzdGZzeW5jLnNnbWwiPgogPCFFTlRJVFkgcGd0ZXN0dGltaW5nICAgICAg IFNZU1RFTSAicGd0ZXN0dGltaW5nLnNnbWwiPgpkaWZmIC0tZ2l0IGEvZG9jL3NyYy9zZ21s L3JlZi9wZ19zdWJzY3JpYmVyLnNnbWwgYi9kb2Mvc3JjL3NnbWwvcmVmL3BnX3N1YnNjcmli ZXIuc2dtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwLi41NTMxODVj MzVmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jL3NyYy9zZ21sL3JlZi9wZ19zdWJzY3JpYmVy LnNnbWwKQEAgLTAsMCArMSwyODQgQEAKKzwhLS0KK2RvYy9zcmMvc2dtbC9yZWYvcGdfc3Vi c2NyaWJlci5zZ21sCitQb3N0Z3JlU1FMIGRvY3VtZW50YXRpb24KKy0tPgorCis8cmVmZW50 cnkgaWQ9ImFwcC1wZ3N1YnNjcmliZXIiPgorIDxpbmRleHRlcm0gem9uZT0iYXBwLXBnc3Vi c2NyaWJlciI+CisgIDxwcmltYXJ5PnBnX3N1YnNjcmliZXI8L3ByaW1hcnk+CisgPC9pbmRl eHRlcm0+CisKKyA8cmVmbWV0YT4KKyAgPHJlZmVudHJ5dGl0bGU+PGFwcGxpY2F0aW9uPnBn X3N1YnNjcmliZXI8L2FwcGxpY2F0aW9uPjwvcmVmZW50cnl0aXRsZT4KKyAgPG1hbnZvbG51 bT4xPC9tYW52b2xudW0+CisgIDxyZWZtaXNjaW5mbz5BcHBsaWNhdGlvbjwvcmVmbWlzY2lu Zm8+CisgPC9yZWZtZXRhPgorCisgPHJlZm5hbWVkaXY+CisgIDxyZWZuYW1lPnBnX3N1YnNj cmliZXI8L3JlZm5hbWU+CisgIDxyZWZwdXJwb3NlPmNyZWF0ZSBhIG5ldyBsb2dpY2FsIHJl cGxpY2EgZnJvbSBhIHN0YW5kYnkgc2VydmVyPC9yZWZwdXJwb3NlPgorIDwvcmVmbmFtZWRp dj4KKworIDxyZWZzeW5vcHNpc2Rpdj4KKyAgPGNtZHN5bm9wc2lzPgorICAgPGNvbW1hbmQ+ cGdfc3Vic2NyaWJlcjwvY29tbWFuZD4KKyAgIDxhcmcgcmVwPSJyZXBlYXQiPjxyZXBsYWNl YWJsZT5vcHRpb248L3JlcGxhY2VhYmxlPjwvYXJnPgorICA8L2NtZHN5bm9wc2lzPgorIDwv cmVmc3lub3BzaXNkaXY+CisKKyA8cmVmc2VjdDE+CisgIDx0aXRsZT5EZXNjcmlwdGlvbjwv dGl0bGU+CisgIDxwYXJhPgorICAgPGFwcGxpY2F0aW9uPnBnX3N1YnNjcmliZXI8L2FwcGxp Y2F0aW9uPiB0YWtlcyB0aGUgcHVibGlzaGVyIGFuZCBzdWJzY3JpYmVyCisgICBjb25uZWN0 aW9uIHN0cmluZ3MsIGEgY2x1c3RlciBkaXJlY3RvcnkgZnJvbSBhIHN0YW5kYnkgc2VydmVy IGFuZCBhIGxpc3Qgb2YKKyAgIGRhdGFiYXNlIG5hbWVzIGFuZCBpdCBzZXRzIHVwIGEgbmV3 IGxvZ2ljYWwgcmVwbGljYSB1c2luZyB0aGUgcGh5c2ljYWwKKyAgIHJlY292ZXJ5IHByb2Nl c3MuCisgIDwvcGFyYT4KKworICA8cGFyYT4KKyAgIFRoZSA8YXBwbGljYXRpb24+cGdfc3Vi c2NyaWJlcjwvYXBwbGljYXRpb24+IHNob3VsZCBiZSBydW4gYXQgdGhlIHRhcmdldAorICAg c2VydmVyLiBUaGUgc291cmNlIHNlcnZlciAoa25vd24gYXMgcHVibGlzaGVyIHNlcnZlcikg c2hvdWxkIGFjY2VwdCBsb2dpY2FsCisgICByZXBsaWNhdGlvbiBjb25uZWN0aW9ucyBmcm9t IHRoZSB0YXJnZXQgc2VydmVyIChrbm93biBhcyBzdWJzY3JpYmVyIHNlcnZlcikuCisgICBU aGUgdGFyZ2V0IHNlcnZlciBzaG91bGQgYWNjZXB0IGxvY2FsIGxvZ2ljYWwgcmVwbGljYXRp b24gY29ubmVjdGlvbi4KKyAgPC9wYXJhPgorIDwvcmVmc2VjdDE+CisKKyA8cmVmc2VjdDE+ CisgIDx0aXRsZT5PcHRpb25zPC90aXRsZT4KKworICAgPHBhcmE+CisgICAgPGFwcGxpY2F0 aW9uPnBnX3N1YnNjcmliZXI8L2FwcGxpY2F0aW9uPiBhY2NlcHRzIHRoZSBmb2xsb3dpbmcK KyAgICBjb21tYW5kLWxpbmUgYXJndW1lbnRzOgorCisgICAgPHZhcmlhYmxlbGlzdD4KKyAg ICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LUQgPHJlcGxhY2VhYmxl IGNsYXNzPSJwYXJhbWV0ZXIiPmRpcmVjdG9yeTwvcmVwbGFjZWFibGU+PC9vcHRpb24+PC90 ZXJtPgorICAgICAgPHRlcm0+PG9wdGlvbj4tLXBnZGF0YT08cmVwbGFjZWFibGUgY2xhc3M9 InBhcmFtZXRlciI+ZGlyZWN0b3J5PC9yZXBsYWNlYWJsZT48L29wdGlvbj48L3Rlcm0+Cisg ICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBhcmE+CisgICAgICAgIFRoZSB0YXJnZXQgZGly ZWN0b3J5IHRoYXQgY29udGFpbnMgYSBjbHVzdGVyIGRpcmVjdG9yeSBmcm9tIGEgc3RhbmRi eQorICAgICAgICBzZXJ2ZXIuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4K KyAgICAgPC92YXJsaXN0ZW50cnk+CisKKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgIDx0 ZXJtPjxvcHRpb24+LVAgIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jb25uaW5m bzwvcmVwbGFjZWFibGU+PC9vcHRpb24+PC90ZXJtPgorICAgICAgPHRlcm0+PG9wdGlvbj4t LXB1Ymxpc2hlci1jb25uaW5mbz08cmVwbGFjZWFibGUgY2xhc3M9InBhcmFtZXRlciI+Y29u bmluZm88L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDxsaXN0aXRlbT4K KyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGNvbm5lY3Rpb24gc3RyaW5nIHRvIHRoZSBw dWJsaXNoZXIuIEZvciBkZXRhaWxzIHNlZSA8eHJlZiBsaW5rZW5kPSJsaWJwcS1jb25uc3Ry aW5nIi8+LgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwvdmFy bGlzdGVudHJ5PgorCisgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICA8dGVybT48b3B0aW9u Pi1TIDxyZXBsYWNlYWJsZSBjbGFzcz0icGFyYW1ldGVyIj5jb25uaW5mbzwvcmVwbGFjZWFi bGU+PC9vcHRpb24+PC90ZXJtPgorICAgICAgPHRlcm0+PG9wdGlvbj4tLXN1YnNjcmliZXIt Y29ubmluZm89PHJlcGxhY2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmNvbm5pbmZvPC9yZXBs YWNlYWJsZT48L29wdGlvbj48L3Rlcm0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBh cmE+CisgICAgICAgIFRoZSBjb25uZWN0aW9uIHN0cmluZyB0byB0aGUgc3Vic2NyaWJlci4g Rm9yIGRldGFpbHMgc2VlIDx4cmVmIGxpbmtlbmQ9ImxpYnBxLWNvbm5zdHJpbmciLz4uCisg ICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4KKyAgICAgPC92YXJsaXN0ZW50cnk+ CisKKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+LWQgPHJlcGxh Y2VhYmxlIGNsYXNzPSJwYXJhbWV0ZXIiPmRibmFtZTwvcmVwbGFjZWFibGU+PC9vcHRpb24+ PC90ZXJtPgorICAgICAgPHRlcm0+PG9wdGlvbj4tLWRhdGFiYXNlPTxyZXBsYWNlYWJsZSBj bGFzcz0icGFyYW1ldGVyIj5kYm5hbWU8L3JlcGxhY2VhYmxlPjwvb3B0aW9uPjwvdGVybT4K KyAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGRhdGFiYXNl IG5hbWUgdG8gY3JlYXRlIHRoZSBzdWJzY3JpcHRpb24uIE11bHRpcGxlIGRhdGFiYXNlcyBj YW4gYmUKKyAgICAgICAgc2VsZWN0ZWQgYnkgd3JpdGluZyBtdWx0aXBsZSA8b3B0aW9uPi1k PC9vcHRpb24+IHN3aXRjaGVzLgorICAgICAgIDwvcGFyYT4KKyAgICAgIDwvbGlzdGl0ZW0+ CisgICAgIDwvdmFybGlzdGVudHJ5PgorCisgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICA8 dGVybT48b3B0aW9uPi1uPC9vcHRpb24+PC90ZXJtPgorICAgICAgPHRlcm0+PG9wdGlvbj4t LWRyeS1ydW48L29wdGlvbj48L3Rlcm0+CisgICAgICA8bGlzdGl0ZW0+CisgICAgICAgPHBh cmE+CisgICAgICAgIERvIGV2ZXJ5dGhpbmcgZXhjZXB0IGFjdHVhbGx5IG1vZGlmeWluZyB0 aGUgdGFyZ2V0IGRpcmVjdG9yeS4KKyAgICAgICA8L3BhcmE+CisgICAgICA8L2xpc3RpdGVt PgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICA8dmFybGlzdGVudHJ5PgorICAgICAg PHRlcm0+PG9wdGlvbj4tdjwvb3B0aW9uPjwvdGVybT4KKyAgICAgIDx0ZXJtPjxvcHRpb24+ LS12ZXJib3NlPC9vcHRpb24+PC90ZXJtPgorICAgICAgPGxpc3RpdGVtPgorICAgICAgIDxw YXJhPgorICAgICAgICBFbmFibGVzIHZlcmJvc2UgbW9kZS4gVGhpcyB3aWxsIGNhdXNlCisg ICAgICAgIDxhcHBsaWNhdGlvbj5wZ19zdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4gdG8gb3V0 cHV0IHByb2dyZXNzIG1lc3NhZ2VzCisgICAgICAgIGFuZCBkZXRhaWxlZCBpbmZvcm1hdGlv biBhYm91dCBlYWNoIHN0ZXAuCisgICAgICAgPC9wYXJhPgorICAgICAgPC9saXN0aXRlbT4K KyAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgPC92YXJpYWJsZWxpc3Q+CisgICA8L3BhcmE+ CisKKyAgIDxwYXJhPgorICAgIE90aGVyIG9wdGlvbnMgYXJlIGFsc28gYXZhaWxhYmxlOgor CisgICAgPHZhcmlhYmxlbGlzdD4KKyAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICA8dGVy bT48b3B0aW9uPi1WPC9vcHRpb24+PC90ZXJtPgorICAgICAgIDx0ZXJtPjxvcHRpb24+LS12 ZXJzaW9uPC9vcHRpb24+PC90ZXJtPgorICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICA8cGFy YT4KKyAgICAgICBQcmludCB0aGUgPGFwcGxpY2F0aW9uPnBnX3N1YnNjcmliZXI8L2FwcGxp Y2F0aW9uPiB2ZXJzaW9uIGFuZCBleGl0LgorICAgICAgIDwvcGFyYT4KKyAgICAgICA8L2xp c3RpdGVtPgorICAgICA8L3Zhcmxpc3RlbnRyeT4KKworICAgICA8dmFybGlzdGVudHJ5Pgor ICAgICAgIDx0ZXJtPjxvcHRpb24+LT88L29wdGlvbj48L3Rlcm0+CisgICAgICAgPHRlcm0+ PG9wdGlvbj4tLWhlbHA8L29wdGlvbj48L3Rlcm0+CisgICAgICAgPGxpc3RpdGVtPgorICAg ICAgIDxwYXJhPgorICAgICAgIFNob3cgaGVscCBhYm91dCA8YXBwbGljYXRpb24+cGdfc3Vi c2NyaWJlcjwvYXBwbGljYXRpb24+IGNvbW1hbmQKKyAgICAgICBsaW5lIGFyZ3VtZW50cywg YW5kIGV4aXQuCisgICAgICAgPC9wYXJhPgorICAgICAgIDwvbGlzdGl0ZW0+CisgICAgIDwv dmFybGlzdGVudHJ5PgorCisgICAgPC92YXJpYWJsZWxpc3Q+CisgICA8L3BhcmE+CisKKyA8 L3JlZnNlY3QxPgorCisgPHJlZnNlY3QxPgorICA8dGl0bGU+Tm90ZXM8L3RpdGxlPgorCisg IDxwYXJhPgorICAgVGhlIHRyYW5zZm9ybWF0aW9uIHByb2NlZWRzIGluIHRoZSBmb2xsb3dp bmcgc3RlcHM6CisgIDwvcGFyYT4KKworICA8cHJvY2VkdXJlPgorICAgPHN0ZXA+CisgICAg PHBhcmE+CisgICAgIDxhcHBsaWNhdGlvbj5wZ19zdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4g Y2hlY2tzIGlmIHRoZSBnaXZlbiB0YXJnZXQgZGF0YQorICAgICBkaXJlY3RvcnkgaGFzIHRo ZSBzYW1lIHN5c3RlbSBpZGVudGlmaWVyIHRoYW4gdGhlIHNvdXJjZSBkYXRhIGRpcmVjdG9y eS4KKyAgICAgU2luY2UgaXQgdXNlcyB0aGUgcmVjb3ZlcnkgcHJvY2VzcyBhcyBvbmUgb2Yg dGhlIHN0ZXBzLCBpdCBzdGFydHMgdGhlCisgICAgIHRhcmdldCBzZXJ2ZXIgYXMgYSByZXBs aWNhIGZyb20gdGhlIHNvdXJjZSBzZXJ2ZXIuIElmIHRoZSBzeXN0ZW0KKyAgICAgaWRlbnRp ZmllciBpcyBub3QgdGhlIHNhbWUsIDxhcHBsaWNhdGlvbj5wZ19zdWJzY3JpYmVyPC9hcHBs aWNhdGlvbj4gd2lsbAorICAgICB0ZXJtaW5hdGUgd2l0aCBhbiBlcnJvci4KKyAgICA8L3Bh cmE+CisgICA8L3N0ZXA+CisKKyAgIDxzdGVwPgorICAgIDxwYXJhPgorICAgICA8YXBwbGlj YXRpb24+cGdfc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IGNoZWNrcyBpZiB0aGUgdGFyZ2V0 IGRhdGEKKyAgICAgZGlyZWN0b3J5IGlzIHVzZWQgYnkgYSBzdGFuZGJ5IHNlcnZlci4gU3Rv cCB0aGUgc3RhbmRieSBzZXJ2ZXIgaWYgaXQgaXMKKyAgICAgcnVubmluZy4gT25lIG9mIHRo ZSBuZXh0IHN0ZXBzIGlzIHRvIGFkZCBzb21lIHJlY292ZXJ5IHBhcmFtZXRlcnMgdGhhdAor ICAgICByZXF1aXJlcyBhIHNlcnZlciBzdGFydC4gVGhpcyBzdGVwIGF2b2lkcyBhbiBlcnJv ci4KKyAgICA8L3BhcmE+CisgICA8L3N0ZXA+CisKKyAgIDxzdGVwPgorICAgIDxwYXJhPgor ICAgICA8YXBwbGljYXRpb24+cGdfc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IGNyZWF0ZXMg b25lIHJlcGxpY2F0aW9uIHNsb3QgZm9yCisgICAgIGVhY2ggc3BlY2lmaWVkIGRhdGFiYXNl IG9uIHRoZSBzb3VyY2Ugc2VydmVyLiBUaGUgcmVwbGljYXRpb24gc2xvdCBuYW1lCisgICAg IGNvbnRhaW5zIGEgPGxpdGVyYWw+cGdfc3Vic2NyaWJlcjwvbGl0ZXJhbD4gcHJlZml4LiBU aGVzZSByZXBsaWNhdGlvbgorICAgICBzbG90cyB3aWxsIGJlIHVzZWQgYnkgdGhlIHN1YnNj cmlwdGlvbnMgaW4gYSBmdXR1cmUgc3RlcC4gIEFub3RoZXIKKyAgICAgcmVwbGljYXRpb24g c2xvdCBpcyB1c2VkIHRvIGdldCBhIGNvbnNpc3RlbnQgc3RhcnQgbG9jYXRpb24uIFRoaXMK KyAgICAgY29uc2lzdGVudCBMU04gd2lsbCBiZSB1c2VkIGFzIGEgc3RvcHBpbmcgcG9pbnQg aW4gdGhlIDx4cmVmCisgICAgIGxpbmtlbmQ9Imd1Yy1yZWNvdmVyeS10YXJnZXQtbHNuIi8+ IHBhcmFtZXRlciBhbmQgYnkgdGhlCisgICAgIHN1YnNjcmlwdGlvbnMgYXMgYSByZXBsaWNh dGlvbiBzdGFydGluZyBwb2ludC4gSXQgZ3VhcmFudGVlcyB0aGF0IG5vCisgICAgIHRyYW5z YWN0aW9uIHdpbGwgYmUgbG9zdC4KKyAgICA8L3BhcmE+CisgICA8L3N0ZXA+CisKKyAgIDxz dGVwPgorICAgIDxwYXJhPgorICAgICA8YXBwbGljYXRpb24+cGdfc3Vic2NyaWJlcjwvYXBw bGljYXRpb24+IHdyaXRlcyByZWNvdmVyeSBwYXJhbWV0ZXJzIGludG8KKyAgICAgdGhlIHRh cmdldCBkYXRhIGRpcmVjdG9yeSBhbmQgc3RhcnQgdGhlIHRhcmdldCBzZXJ2ZXIuIEl0IHNw ZWNpZmllcyBhIExTTgorICAgICAoY29uc2lzdGVudCBMU04gdGhhdCB3YXMgb2J0YWluZWQg aW4gdGhlIHByZXZpb3VzIHN0ZXApIG9mIHdyaXRlLWFoZWFkCisgICAgIGxvZyBsb2NhdGlv biB1cCB0byB3aGljaCByZWNvdmVyeSB3aWxsIHByb2NlZWQuIEl0IGFsc28gc3BlY2lmaWVz CisgICAgIDxsaXRlcmFsPnByb21vdGU8L2xpdGVyYWw+IGFzIHRoZSBhY3Rpb24gdGhhdCB0 aGUgc2VydmVyIHNob3VsZCB0YWtlIG9uY2UKKyAgICAgdGhlIHJlY292ZXJ5IHRhcmdldCBp cyByZWFjaGVkLiBUaGlzIHN0ZXAgZmluaXNoZXMgb25jZSB0aGUgc2VydmVyIGVuZHMKKyAg ICAgc3RhbmRieSBtb2RlIGFuZCBpcyBhY2NlcHRpbmcgcmVhZC13cml0ZSBvcGVyYXRpb25z LgorICAgIDwvcGFyYT4KKyAgIDwvc3RlcD4KKworICAgPHN0ZXA+CisgICAgPHBhcmE+Cisg ICAgIE5leHQsIDxhcHBsaWNhdGlvbj5wZ19zdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4gY3Jl YXRlcyBvbmUgcHVibGljYXRpb24KKyAgICAgZm9yIGVhY2ggc3BlY2lmaWVkIGRhdGFiYXNl IG9uIHRoZSBzb3VyY2Ugc2VydmVyLiBFYWNoIHB1YmxpY2F0aW9uCisgICAgIHJlcGxpY2F0 ZXMgY2hhbmdlcyBmb3IgYWxsIHRhYmxlcyBpbiB0aGUgZGF0YWJhc2UuIFRoZSBwdWJsaWNh dGlvbiBuYW1lCisgICAgIGNvbnRhaW5zIGEgPGxpdGVyYWw+cGdfc3Vic2NyaWJlcjwvbGl0 ZXJhbD4gcHJlZml4LiBUaGVzZSBwdWJsaWNhdGlvbgorICAgICB3aWxsIGJlIHVzZWQgYnkg YSBjb3JyZXNwb25kaW5nIHN1YnNjcmlwdGlvbiBpbiBhIG5leHQgc3RlcC4KKyAgICA8L3Bh cmE+CisgICA8L3N0ZXA+CisKKyAgIDxzdGVwPgorICAgIDxwYXJhPgorICAgICA8YXBwbGlj YXRpb24+cGdfc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IGNyZWF0ZXMgb25lIHN1YnNjcmlw dGlvbiBmb3IKKyAgICAgZWFjaCBzcGVjaWZpZWQgZGF0YWJhc2Ugb24gdGhlIHRhcmdldCBz ZXJ2ZXIuIEVhY2ggc3Vic2NyaXB0aW9uIG5hbWUKKyAgICAgY29udGFpbnMgYSA8bGl0ZXJh bD5wZ19zdWJzY3JpYmVyPC9saXRlcmFsPiBwcmVmaXguIFRoZSByZXBsaWNhdGlvbiBzbG90 CisgICAgIG5hbWUgaXMgaWRlbnRpY2FsIHRvIHRoZSBzdWJzY3JpcHRpb24gbmFtZS4gSXQg ZG9lcyBub3QgY29weSBleGlzdGluZyBkYXRhCisgICAgIGZyb20gdGhlIHNvdXJjZSBzZXJ2 ZXIuIEl0IGRvZXMgbm90IGNyZWF0ZSBhIHJlcGxpY2F0aW9uIHNsb3QuIEluc3RlYWQsIGl0 CisgICAgIHVzZXMgdGhlIHJlcGxpY2F0aW9uIHNsb3QgdGhhdCB3YXMgY3JlYXRlZCBpbiBh IHByZXZpb3VzIHN0ZXAuIFRoZQorICAgICBzdWJzY3JpcHRpb24gaXMgY3JlYXRlZCBidXQg aXQgaXMgbm90IGVuYWJsZWQgeWV0LiBUaGUgcmVhc29uIGlzIHRoZQorICAgICByZXBsaWNh dGlvbiBwcm9ncmVzcyBtdXN0IGJlIHNldCB0byB0aGUgY29uc2lzdGVudCBMU04gYnV0IHJl cGxpY2F0aW9uCisgICAgIG9yaWdpbiBuYW1lIGNvbnRhaW5zIHRoZSBzdWJzY3JpcHRpb24g b2lkIGluIGl0cyBuYW1lLiBIZW5jZSwgdGhlCisgICAgIHN1YnNjcmlwdGlvbiB3aWxsIGJl IGVuYWJsZWQgaW4gYSBzZXBhcmF0ZSBzdGVwLgorICAgIDwvcGFyYT4KKyAgIDwvc3RlcD4K KworICAgPHN0ZXA+CisgICAgPHBhcmE+CisgICAgIDxhcHBsaWNhdGlvbj5wZ19zdWJzY3Jp YmVyPC9hcHBsaWNhdGlvbj4gc2V0cyB0aGUgcmVwbGljYXRpb24gcHJvZ3Jlc3MgdG8KKyAg ICAgdGhlIGNvbnNpc3RlbnQgTFNOIHRoYXQgd2FzIG9idGFpbmVkIGluIGEgcHJldmlvdXMg c3RlcC4gV2hlbiB0aGUgdGFyZ2V0CisgICAgIHNlcnZlciBzdGFydGVkIHRoZSByZWNvdmVy eSBwcm9jZXNzLCBpdCBjYXVnaHQgdXAgdG8gdGhlIGNvbnNpc3RlbnQgTFNOLgorICAgICBU aGlzIGlzIHRoZSBleGFjdCBMU04gdG8gYmUgdXNlZCBhcyBhIGluaXRpYWwgbG9jYXRpb24g Zm9yIGVhY2gKKyAgICAgc3Vic2NyaXB0aW9uLgorICAgIDwvcGFyYT4KKyAgIDwvc3RlcD4K KworICAgPHN0ZXA+CisgICAgPHBhcmE+CisgICAgIEZpbmFsbHksIDxhcHBsaWNhdGlvbj5w Z19zdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4gZW5hYmxlcyB0aGUgc3Vic2NyaXB0aW9uCisg ICAgIGZvciBlYWNoIHNwZWNpZmllZCBkYXRhYmFzZSBvbiB0aGUgdGFyZ2V0IHNlcnZlci4g VGhlIHN1YnNjcmlwdGlvbiBzdGFydHMKKyAgICAgc3RyZWFtaW5nIGZyb20gdGhlIGNvbnNp c3RlbnQgTFNOLgorICAgIDwvcGFyYT4KKyAgIDwvc3RlcD4KKworICAgPHN0ZXA+CisgICAg PHBhcmE+CisgICAgIDxhcHBsaWNhdGlvbj5wZ19zdWJzY3JpYmVyPC9hcHBsaWNhdGlvbj4g cmVtb3ZlcyB0aGUgYWRkaXRpb25hbCByZXBsaWNhdGlvbgorICAgICBzbG90IHRoYXQgd2Fz IHVzZWQgdG8gZ2V0IHRoZSBjb25zaXN0ZW50IExTTiBvbiB0aGUgc291cmNlIHNlcnZlci4K KyAgICA8L3BhcmE+CisgICA8L3N0ZXA+CisKKyAgIDxzdGVwPgorICAgIDxwYXJhPgorICAg ICA8YXBwbGljYXRpb24+cGdfc3Vic2NyaWJlcjwvYXBwbGljYXRpb24+IHN0b3BzIHRoZSB0 YXJnZXQgc2VydmVyIHRvIGNoYW5nZQorICAgICBpdHMgc3lzdGVtIGlkZW50aWZpZXIuCisg ICAgPC9wYXJhPgorICAgPC9zdGVwPgorICA8L3Byb2NlZHVyZT4KKyA8L3JlZnNlY3QxPgor CisgPHJlZnNlY3QxPgorICA8dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgorCisgIDxwYXJhPgor ICAgVG8gY3JlYXRlIGEgbG9naWNhbCByZXBsaWNhIGZvciBkYXRhYmFzZXMgPGxpdGVyYWw+ aHI8L2xpdGVyYWw+IGFuZAorICAgPGxpdGVyYWw+ZmluYW5jZTwvbGl0ZXJhbD4gZnJvbSBh IHN0YW5kYnkgc2VydmVyIGF0IDxsaXRlcmFsPmZvbzwvbGl0ZXJhbD46Cis8c2NyZWVuPgor PHByb21wdD4kPC9wcm9tcHQ+IDx1c2VyaW5wdXQ+cGdfc3Vic2NyaWJlciAtRCAvdXNyL2xv Y2FsL3Bnc3FsL2RhdGEgLVAgImhvc3Q9Zm9vIiAtUyAiaG9zdD1sb2NhbGhvc3QiIC1kIGhy IC1kIGZpbmFuY2U8L3VzZXJpbnB1dD4KKzwvc2NyZWVuPgorICA8L3BhcmE+CisKKyA8L3Jl ZnNlY3QxPgorCisgPHJlZnNlY3QxPgorICA8dGl0bGU+U2VlIEFsc288L3RpdGxlPgorCisg IDxzaW1wbGVsaXN0IHR5cGU9ImlubGluZSI+CisgICA8bWVtYmVyPjx4cmVmIGxpbmtlbmQ9 ImFwcC1wZ2Jhc2ViYWNrdXAiLz48L21lbWJlcj4KKyAgPC9zaW1wbGVsaXN0PgorIDwvcmVm c2VjdDE+CisKKzwvcmVmZW50cnk+CmRpZmYgLS1naXQgYS9kb2Mvc3JjL3NnbWwvcmVmZXJl bmNlLnNnbWwgYi9kb2Mvc3JjL3NnbWwvcmVmZXJlbmNlLnNnbWwKaW5kZXggZTExYjRiNjEz MC4uNjdlMjU3NDM2YiAxMDA2NDQKLS0tIGEvZG9jL3NyYy9zZ21sL3JlZmVyZW5jZS5zZ21s CisrKyBiL2RvYy9zcmMvc2dtbC9yZWZlcmVuY2Uuc2dtbApAQCAtMjU3LDYgKzI1Nyw3IEBA CiAgICAmcGdSZWNlaXZld2FsOwogICAgJnBnUmVjdmxvZ2ljYWw7CiAgICAmcGdSZXN0b3Jl OworICAgJnBnU3Vic2NyaWJlcjsKICAgICZwZ1ZlcmlmeUJhY2t1cDsKICAgICZwc3FsUmVm OwogICAgJnJlaW5kZXhkYjsKZGlmZiAtLWdpdCBhL3NyYy9iaW4vcGdfYmFzZWJhY2t1cC9N YWtlZmlsZSBiL3NyYy9iaW4vcGdfYmFzZWJhY2t1cC9NYWtlZmlsZQppbmRleCA3NGRjMWRk ZDZkLi5iYzAxMTU2NWJiIDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvTWFr ZWZpbGUKKysrIGIvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL01ha2VmaWxlCkBAIC00Nyw3ICs0 Nyw3IEBAIEJCT0JKUyA9IFwKIAliYnN0cmVhbWVyX3Rhci5vIFwKIAliYnN0cmVhbWVyX3pz dGQubwogCi1hbGw6IHBnX2Jhc2ViYWNrdXAgcGdfcmVjZWl2ZXdhbCBwZ19yZWN2bG9naWNh bAorYWxsOiBwZ19iYXNlYmFja3VwIHBnX3JlY2VpdmV3YWwgcGdfcmVjdmxvZ2ljYWwgcGdf c3Vic2NyaWJlcgogCiBwZ19iYXNlYmFja3VwOiAkKEJCT0JKUykgJChPQkpTKSB8IHN1Ym1h a2UtbGlicHEgc3VibWFrZS1saWJwZ3BvcnQgc3VibWFrZS1saWJwZ2ZldXRpbHMKIAkkKEND KSAkKENGTEFHUykgJChCQk9CSlMpICQoT0JKUykgJChMREZMQUdTKSAkKExERkxBR1NfRVgp ICQoTElCUykgLW8gJEAkKFgpCkBAIC01OCwxMCArNTgsMTQgQEAgcGdfcmVjZWl2ZXdhbDog cGdfcmVjZWl2ZXdhbC5vICQoT0JKUykgfCBzdWJtYWtlLWxpYnBxIHN1Ym1ha2UtbGlicGdw b3J0IHN1Ym1ha2UKIHBnX3JlY3Zsb2dpY2FsOiBwZ19yZWN2bG9naWNhbC5vICQoT0JKUykg fCBzdWJtYWtlLWxpYnBxIHN1Ym1ha2UtbGlicGdwb3J0IHN1Ym1ha2UtbGlicGdmZXV0aWxz CiAJJChDQykgJChDRkxBR1MpIHBnX3JlY3Zsb2dpY2FsLm8gJChPQkpTKSAkKExERkxBR1Mp ICQoTERGTEFHU19FWCkgJChMSUJTKSAtbyAkQCQoWCkKIAorcGdfc3Vic2NyaWJlcjogJChX SU4zMlJFUykgcGdfc3Vic2NyaWJlci5vIHwgc3VibWFrZS1saWJwcSBzdWJtYWtlLWxpYnBn cG9ydCBzdWJtYWtlLWxpYnBnZmV1dGlscworCSQoQ0MpICQoQ0ZMQUdTKSAkXiAkKExERkxB R1MpICQoTERGTEFHU19FWCkgJChMSUJTKSAtbyAkQCQoWCkKKwogaW5zdGFsbDogYWxsIGlu c3RhbGxkaXJzCiAJJChJTlNUQUxMX1BST0dSQU0pIHBnX2Jhc2ViYWNrdXAkKFgpICckKERF U1RESVIpJChiaW5kaXIpL3BnX2Jhc2ViYWNrdXAkKFgpJwogCSQoSU5TVEFMTF9QUk9HUkFN KSBwZ19yZWNlaXZld2FsJChYKSAnJChERVNURElSKSQoYmluZGlyKS9wZ19yZWNlaXZld2Fs JChYKScKIAkkKElOU1RBTExfUFJPR1JBTSkgcGdfcmVjdmxvZ2ljYWwkKFgpICckKERFU1RE SVIpJChiaW5kaXIpL3BnX3JlY3Zsb2dpY2FsJChYKScKKwkkKElOU1RBTExfUFJPR1JBTSkg cGdfc3Vic2NyaWJlciQoWCkgJyQoREVTVERJUikkKGJpbmRpcikvcGdfc3Vic2NyaWJlciQo WCknCiAKIGluc3RhbGxkaXJzOgogCSQoTUtESVJfUCkgJyQoREVTVERJUikkKGJpbmRpcikn CkBAIC03MCwxMCArNzQsMTIgQEAgdW5pbnN0YWxsOgogCXJtIC1mICckKERFU1RESVIpJChi aW5kaXIpL3BnX2Jhc2ViYWNrdXAkKFgpJwogCXJtIC1mICckKERFU1RESVIpJChiaW5kaXIp L3BnX3JlY2VpdmV3YWwkKFgpJwogCXJtIC1mICckKERFU1RESVIpJChiaW5kaXIpL3BnX3Jl Y3Zsb2dpY2FsJChYKScKKwlybSAtZiAnJChERVNURElSKSQoYmluZGlyKS9wZ19zdWJzY3Jp YmVyJChYKScKIAogY2xlYW4gZGlzdGNsZWFuOgogCXJtIC1mIHBnX2Jhc2ViYWNrdXAkKFgp IHBnX3JlY2VpdmV3YWwkKFgpIHBnX3JlY3Zsb2dpY2FsJChYKSBcCiAJCSQoQkJPQkpTKSBw Z19yZWNlaXZld2FsLm8gcGdfcmVjdmxvZ2ljYWwubyBcCisJCXBnX3N1YnNjcmliZXIkKFgp IHBnX3N1YnNjcmliZXIubyBcCiAJCSQoT0JKUykKIAlybSAtcmYgdG1wX2NoZWNrCiAKZGlm ZiAtLWdpdCBhL3NyYy9iaW4vcGdfYmFzZWJhY2t1cC9tZXNvbi5idWlsZCBiL3NyYy9iaW4v cGdfYmFzZWJhY2t1cC9tZXNvbi5idWlsZAppbmRleCBjNDI2MTczZGIzLi42MDE1MTdjMDk2 IDEwMDY0NAotLS0gYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvbWVzb24uYnVpbGQKKysrIGIv c3JjL2Jpbi9wZ19iYXNlYmFja3VwL21lc29uLmJ1aWxkCkBAIC03NSw2ICs3NSwyMyBAQCBw Z19yZWN2bG9naWNhbCA9IGV4ZWN1dGFibGUoJ3BnX3JlY3Zsb2dpY2FsJywKICkKIGJpbl90 YXJnZXRzICs9IHBnX3JlY3Zsb2dpY2FsCiAKK3BnX3N1YnNjcmliZXJfc291cmNlcyA9IGZp bGVzKAorICAncGdfc3Vic2NyaWJlci5jJworKQorCitpZiBob3N0X3N5c3RlbSA9PSAnd2lu ZG93cycKKyAgcGdfc3Vic2NyaWJlcl9zb3VyY2VzICs9IHJjX2Jpbl9nZW4ucHJvY2Vzcyh3 aW4zMnZlcl9yYywgZXh0cmFfYXJnczogWworCSctLU5BTUUnLCAncGdfc3Vic2NyaWJlcics CisJJy0tRklMRURFU0MnLCAncGdfc3Vic2NyaWJlciAtIGNyZWF0ZSBhIG5ldyBsb2dpY2Fs IHJlcGxpY2EgZnJvbSBhIHN0YW5kYnkgc2VydmVyJyxdKQorZW5kaWYKKworcGdfc3Vic2Ny aWJlciA9IGV4ZWN1dGFibGUoJ3BnX3N1YnNjcmliZXInLAorICBwZ19zdWJzY3JpYmVyX3Nv dXJjZXMsCisgIGRlcGVuZGVuY2llczogW2Zyb250ZW5kX2NvZGUsIGxpYnBxXSwKKyAga3dh cmdzOiBkZWZhdWx0X2Jpbl9hcmdzLAorKQorYmluX3RhcmdldHMgKz0gcGdfc3Vic2NyaWJl cgorCiB0ZXN0cyArPSB7CiAgICduYW1lJzogJ3BnX2Jhc2ViYWNrdXAnLAogICAnc2QnOiBt ZXNvbi5jdXJyZW50X3NvdXJjZV9kaXIoKSwKQEAgLTg5LDYgKzEwNiw4IEBAIHRlc3RzICs9 IHsKICAgICAgICd0LzAxMV9pbl9wbGFjZV90YWJsZXNwYWNlLnBsJywKICAgICAgICd0LzAy MF9wZ19yZWNlaXZld2FsLnBsJywKICAgICAgICd0LzAzMF9wZ19yZWN2bG9naWNhbC5wbCcs CisgICAgICAndC8wNDBfcGdfc3Vic2NyaWJlci5wbCcsCisgICAgICAndC8wNDFfcGdfc3Vi c2NyaWJlcl9zdGFuZGJ5LnBsJywKICAgICBdLAogICB9LAogfQpkaWZmIC0tZ2l0IGEvc3Jj L2Jpbi9wZ19iYXNlYmFja3VwL3BnX3N1YnNjcmliZXIuYyBiL3NyYy9iaW4vcGdfYmFzZWJh Y2t1cC9wZ19zdWJzY3JpYmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMC4uYjk2Y2UyNmVkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9iaW4vcGdfYmFzZWJh Y2t1cC9wZ19zdWJzY3JpYmVyLmMKQEAgLTAsMCArMSwxNTE3IEBACisvKi0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyAqCisgKiBwZ19zdWJzY3JpYmVyLmMKKyAqCSAgQ3JlYXRlIGEgbmV3IGxv Z2ljYWwgcmVwbGljYSBmcm9tIGEgc3RhbmRieSBzZXJ2ZXIKKyAqCisgKiBDb3B5cmlnaHQg KEMpIDIwMjMsIFBvc3RncmVTUUwgR2xvYmFsIERldmVsb3BtZW50IEdyb3VwCisgKgorICog SURFTlRJRklDQVRJT04KKyAqCQlzcmMvYmluL3BnX3N1YnNjcmliZXIvcGdfc3Vic2NyaWJl ci5jCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKyNpbmNsdWRlICJwb3N0Z3Jl c19mZS5oIgorCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4K KyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVk ZSA8dGltZS5oPgorCisjaW5jbHVkZSAiYWNjZXNzL3hsb2dkZWZzLmgiCisjaW5jbHVkZSAi Y2F0YWxvZy9wZ19jb250cm9sLmgiCisjaW5jbHVkZSAiY29tbW9uL2Nvbm5lY3QuaCIKKyNp bmNsdWRlICJjb21tb24vY29udHJvbGRhdGFfdXRpbHMuaCIKKyNpbmNsdWRlICJjb21tb24v ZmlsZV91dGlscy5oIgorI2luY2x1ZGUgImNvbW1vbi9sb2dnaW5nLmgiCisjaW5jbHVkZSAi ZmVfdXRpbHMvcmVjb3ZlcnlfZ2VuLmgiCisjaW5jbHVkZSAiZmVfdXRpbHMvc2ltcGxlX2xp c3QuaCIKKyNpbmNsdWRlICJnZXRvcHRfbG9uZy5oIgorI2luY2x1ZGUgInV0aWxzL3BpZGZp bGUuaCIKKwordHlwZWRlZiBzdHJ1Y3QgTG9naWNhbFJlcEluZm8KK3sKKwlPaWQJCQlvaWQ7 CQkJLyogZGF0YWJhc2UgT0lEICovCisJY2hhcgkgICAqZGJuYW1lOwkJCS8qIGRhdGFiYXNl IG5hbWUgKi8KKwljaGFyCSAgICpwdWJjb25uaW5mbzsJLyogcHVibGljYXRpb24gY29ubmVj dGlvbiBzdHJpbmcgZm9yIGxvZ2ljYWwKKwkJCQkJCQkJICogcmVwbGljYXRpb24gKi8KKwlj aGFyCSAgICpzdWJjb25uaW5mbzsJLyogc3Vic2NyaXB0aW9uIGNvbm5lY3Rpb24gc3RyaW5n IGZvciBsb2dpY2FsCisJCQkJCQkJCSAqIHJlcGxpY2F0aW9uICovCisJY2hhcgkgICAqcHVi bmFtZTsJCS8qIHB1YmxpY2F0aW9uIG5hbWUgKi8KKwljaGFyCSAgICpzdWJuYW1lOwkJLyog c3Vic2NyaXB0aW9uIG5hbWUgKGFsc28gcmVwbGljYXRpb24gc2xvdAorCQkJCQkJCQkgKiBu YW1lKSAqLworCisJYm9vbAkJbWFkZV9yZXBsc2xvdDsJLyogcmVwbGljYXRpb24gc2xvdCB3 YXMgY3JlYXRlZCAqLworCWJvb2wJCW1hZGVfcHVibGljYXRpb247CS8qIHB1YmxpY2F0aW9u IHdhcyBjcmVhdGVkICovCisJYm9vbAkJbWFkZV9zdWJzY3JpcHRpb247CS8qIHN1YnNjcmlw dGlvbiB3YXMgY3JlYXRlZCAqLworfSBMb2dpY2FsUmVwSW5mbzsKKworc3RhdGljIHZvaWQg Y2xlYW51cF9vYmplY3RzX2F0ZXhpdCh2b2lkKTsKK3N0YXRpYyB2b2lkIHVzYWdlKCk7Citz dGF0aWMgY2hhciAqZ2V0X2Jhc2VfY29ubmluZm8oY2hhciAqY29ubmluZm8sIGNoYXIgKmRi bmFtZSwKKwkJCQkJCQkgICBjb25zdCBjaGFyICpub2Rlcm9sZSk7CitzdGF0aWMgYm9vbCBn ZXRfZXhlY19wYXRoKGNvbnN0IGNoYXIgKnBhdGgpOworc3RhdGljIGJvb2wgY2hlY2tfZGF0 YV9kaXJlY3RvcnkoY29uc3QgY2hhciAqZGF0YWRpcik7CitzdGF0aWMgY2hhciAqY29uY2F0 X2Nvbm5pbmZvX2RibmFtZShjb25zdCBjaGFyICpjb25uaW5mbywgY29uc3QgY2hhciAqZGJu YW1lKTsKK3N0YXRpYyBMb2dpY2FsUmVwSW5mbyAqc3RvcmVfcHViX3N1Yl9pbmZvKGNvbnN0 IGNoYXIgKnB1Yl9iYXNlX2Nvbm5pbmZvLCBjb25zdCBjaGFyICpzdWJfYmFzZV9jb25uaW5m byk7CitzdGF0aWMgUEdjb25uICpjb25uZWN0X2RhdGFiYXNlKGNvbnN0IGNoYXIgKmNvbm5p bmZvKTsKK3N0YXRpYyB2b2lkIGRpc2Nvbm5lY3RfZGF0YWJhc2UoUEdjb25uICpjb25uKTsK K3N0YXRpYyB1aW50NjQgZ2V0X3N5c2lkX2Zyb21fY29ubihjb25zdCBjaGFyICpjb25uaW5m byk7CitzdGF0aWMgdWludDY0IGdldF9jb250cm9sX2Zyb21fZGF0YWRpcihjb25zdCBjaGFy ICpkYXRhZGlyKTsKK3N0YXRpYyB2b2lkIG1vZGlmeV9zeXNpZChjb25zdCBjaGFyICpwZ19y ZXNldHdhbF9wYXRoLCBjb25zdCBjaGFyICpkYXRhZGlyKTsKK3N0YXRpYyBib29sIGNyZWF0 ZV9hbGxfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90cyhMb2dpY2FsUmVwSW5mbyAqZGJpbmZv KTsKK3N0YXRpYyBjaGFyICpjcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KFBHY29u biAqY29ubiwgTG9naWNhbFJlcEluZm8gKmRiaW5mbywKKwkJCQkJCQkJCQkJIGNoYXIgKnNs b3RfbmFtZSk7CitzdGF0aWMgdm9pZCBkcm9wX3JlcGxpY2F0aW9uX3Nsb3QoUEdjb25uICpj b25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvLCBjb25zdCBjaGFyICpzbG90X25hbWUpOwor c3RhdGljIHZvaWQgcGdfY3RsX3N0YXR1cyhjb25zdCBjaGFyICpwZ19jdGxfY21kLCBpbnQg cmMsIGludCBhY3Rpb24pOworc3RhdGljIHZvaWQgd2FpdF9mb3JfZW5kX3JlY292ZXJ5KGNv bnN0IGNoYXIgKmNvbm5pbmZvKTsKK3N0YXRpYyB2b2lkIGNyZWF0ZV9wdWJsaWNhdGlvbihQ R2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJbmZvICpkYmluZm8pOworc3RhdGljIHZvaWQgZHJv cF9wdWJsaWNhdGlvbihQR2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJbmZvICpkYmluZm8pOwor c3RhdGljIHZvaWQgY3JlYXRlX3N1YnNjcmlwdGlvbihQR2Nvbm4gKmNvbm4sIExvZ2ljYWxS ZXBJbmZvICpkYmluZm8pOworc3RhdGljIHZvaWQgZHJvcF9zdWJzY3JpcHRpb24oUEdjb25u ICpjb25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKTsKK3N0YXRpYyB2b2lkIHNldF9yZXBs aWNhdGlvbl9wcm9ncmVzcyhQR2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJbmZvICpkYmluZm8s IGNvbnN0IGNoYXIgKmxzbik7CitzdGF0aWMgdm9pZCBlbmFibGVfc3Vic2NyaXB0aW9uKFBH Y29ubiAqY29ubiwgTG9naWNhbFJlcEluZm8gKmRiaW5mbyk7CisKKyNkZWZpbmUJVVNFQ19Q RVJfU0VDCTEwMDAwMDAKKyNkZWZpbmUJV0FJVF9JTlRFUlZBTAkxCQkvKiAxIHNlY29uZCAq LworCisvKiBPcHRpb25zICovCitzdGF0aWMgY29uc3QgY2hhciAqcHJvZ25hbWU7CisKK3N0 YXRpYyBjaGFyICpzdWJzY3JpYmVyX2RpciA9IE5VTEw7CitzdGF0aWMgY2hhciAqcHViX2Nv bm5pbmZvX3N0ciA9IE5VTEw7CitzdGF0aWMgY2hhciAqc3ViX2Nvbm5pbmZvX3N0ciA9IE5V TEw7CitzdGF0aWMgU2ltcGxlU3RyaW5nTGlzdCBkYXRhYmFzZV9uYW1lcyA9IHtOVUxMLCBO VUxMfTsKK3N0YXRpYyBib29sIGRyeV9ydW4gPSBmYWxzZTsKKworc3RhdGljIGJvb2wgc3Vj Y2VzcyA9IGZhbHNlOworCitzdGF0aWMgY2hhciAqcGdfY3RsX3BhdGggPSBOVUxMOworc3Rh dGljIGNoYXIgKnBnX3Jlc2V0d2FsX3BhdGggPSBOVUxMOworCitzdGF0aWMgTG9naWNhbFJl cEluZm8gKmRiaW5mbzsKK3N0YXRpYyBpbnQJbnVtX2RicyA9IDA7CisKK3N0YXRpYyBjaGFy IHRlbXBfcmVwbHNsb3RbTkFNRURBVEFMRU5dID0gezB9Oworc3RhdGljIGJvb2wgbWFkZV90 cmFuc2llbnRfcmVwbHNsb3QgPSBmYWxzZTsKKworZW51bSBXYWl0UE1SZXN1bHQKK3sKKwlQ T1NUTUFTVEVSX1JFQURZLAorCVBPU1RNQVNURVJfU1RBTkRCWSwKKwlQT1NUTUFTVEVSX1NU SUxMX1NUQVJUSU5HLAorCVBPU1RNQVNURVJfRkFJTEVECit9OworCisKKy8qCisgKiBDbGVh bnVwIG9iamVjdHMgdGhhdCB3ZXJlIGNyZWF0ZWQgYnkgcGdfc3Vic2NyaWJlciBpZiB0aGVy ZSBpcyBhbiBlcnJvci4KKyAqCisgKiBSZXBsaWNhdGlvbiBzbG90cywgcHVibGljYXRpb25z IGFuZCBzdWJzY3JpcHRpb25zIGFyZSBjcmVhdGVkLiBEZXBlbmRpbmcgb24KKyAqIHRoZSBz dGVwIGl0IGZhaWxlZCwgaXQgc2hvdWxkIHJlbW92ZSB0aGUgYWxyZWFkeSBjcmVhdGVkIG9i amVjdHMgaWYgaXQgaXMKKyAqIHBvc3NpYmxlIChzb21ldGltZXMgaXQgd29uJ3Qgd29yayBk dWUgdG8gYSBjb25uZWN0aW9uIGlzc3VlKS4KKyAqLworc3RhdGljIHZvaWQKK2NsZWFudXBf b2JqZWN0c19hdGV4aXQodm9pZCkKK3sKKwlQR2Nvbm4JICAgKmNvbm47CisJaW50CQkJaTsK KworCWlmIChzdWNjZXNzKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2Ri czsgaSsrKQorCXsKKwkJaWYgKGRiaW5mb1tpXS5tYWRlX3N1YnNjcmlwdGlvbikKKwkJewor CQkJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvW2ldLnN1YmNvbm5pbmZvKTsKKwkJ CWlmIChjb25uICE9IE5VTEwpCisJCQl7CisJCQkJZHJvcF9zdWJzY3JpcHRpb24oY29ubiwg JmRiaW5mb1tpXSk7CisJCQkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uKTsKKwkJCX0KKwkJ fQorCisJCWlmIChkYmluZm9baV0ubWFkZV9wdWJsaWNhdGlvbiB8fCBkYmluZm9baV0ubWFk ZV9yZXBsc2xvdCkKKwkJeworCQkJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvW2ld LnB1YmNvbm5pbmZvKTsKKwkJCWlmIChjb25uICE9IE5VTEwpCisJCQl7CisJCQkJaWYgKGRi aW5mb1tpXS5tYWRlX3B1YmxpY2F0aW9uKQorCQkJCQlkcm9wX3B1YmxpY2F0aW9uKGNvbm4s ICZkYmluZm9baV0pOworCQkJCWlmIChkYmluZm9baV0ubWFkZV9yZXBsc2xvdCkKKwkJCQkJ ZHJvcF9yZXBsaWNhdGlvbl9zbG90KGNvbm4sICZkYmluZm9baV0sIE5VTEwpOworCQkJCWRp c2Nvbm5lY3RfZGF0YWJhc2UoY29ubik7CisJCQl9CisJCX0KKwl9CisKKwlpZiAobWFkZV90 cmFuc2llbnRfcmVwbHNsb3QpCisJeworCQljb25uID0gY29ubmVjdF9kYXRhYmFzZShkYmlu Zm9bMF0ucHViY29ubmluZm8pOworCQlkcm9wX3JlcGxpY2F0aW9uX3Nsb3QoY29ubiwgJmRi aW5mb1swXSwgdGVtcF9yZXBsc2xvdCk7CisJCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubik7 CisJfQorfQorCitzdGF0aWMgdm9pZAordXNhZ2Uodm9pZCkKK3sKKwlwcmludGYoXygiJXMg Y3JlYXRlcyBhIG5ldyBsb2dpY2FsIHJlcGxpY2EgZnJvbSBhIHN0YW5kYnkgc2VydmVyLlxu XG4iKSwKKwkJICAgcHJvZ25hbWUpOworCXByaW50ZihfKCJVc2FnZTpcbiIpKTsKKwlwcmlu dGYoXygiICAlcyBbT1BUSU9OXS4uLlxuIiksIHByb2duYW1lKTsKKwlwcmludGYoXygiXG5P cHRpb25zOlxuIikpOworCXByaW50ZihfKCIgLUQsIC0tcGdkYXRhPURBVEFESVIgICAgICAg ICAgICAgICAgbG9jYXRpb24gZm9yIHRoZSBzdWJzY3JpYmVyIGRhdGEgZGlyZWN0b3J5XG4i KSk7CisJcHJpbnRmKF8oIiAtUCwgLS1wdWJsaXNoZXItY29ubmluZm89Q09OTklORk8gICBw dWJsaXNoZXIgY29ubmVjdGlvbiBzdHJpbmdcbiIpKTsKKwlwcmludGYoXygiIC1TLCAtLXN1 YnNjcmliZXItY29ubmluZm89Q09OTklORk8gIHN1YnNjcmliZXIgY29ubmVjdGlvbiBzdHJp bmdcbiIpKTsKKwlwcmludGYoXygiIC1kLCAtLWRhdGFiYXNlPURCTkFNRSAgICAgICAgICAg ICAgIGRhdGFiYXNlIHRvIGNyZWF0ZSBhIHN1YnNjcmlwdGlvblxuIikpOworCXByaW50Zihf KCIgLW4sIC0tZHJ5LXJ1biAgICAgICAgICAgICAgICAgICAgICAgc3RvcCBiZWZvcmUgbW9k aWZ5aW5nIGFueXRoaW5nXG4iKSk7CisJcHJpbnRmKF8oIiAtdiwgLS12ZXJib3NlICAgICAg ICAgICAgICAgICAgICAgICBvdXRwdXQgdmVyYm9zZSBtZXNzYWdlc1xuIikpOworCXByaW50 ZihfKCIgLVYsIC0tdmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHZlcnNp b24gaW5mb3JtYXRpb24sIHRoZW4gZXhpdFxuIikpOworCXByaW50ZihfKCIgLT8sIC0taGVs cCAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdyB0aGlzIGhlbHAsIHRoZW4gZXhpdFxu IikpOworCXByaW50ZihfKCJcblJlcG9ydCBidWdzIHRvIDwlcz4uXG4iKSwgUEFDS0FHRV9C VUdSRVBPUlQpOworCXByaW50ZihfKCIlcyBob21lIHBhZ2U6IDwlcz5cbiIpLCBQQUNLQUdF X05BTUUsIFBBQ0tBR0VfVVJMKTsKK30KKworLyoKKyAqIFZhbGlkYXRlIGEgY29ubmVjdGlv biBzdHJpbmcuIFJldHVybnMgYSBiYXNlIGNvbm5lY3Rpb24gc3RyaW5nIHRoYXQgaXMgYQor ICogY29ubmVjdGlvbiBzdHJpbmcgd2l0aG91dCBhIGRhdGFiYXNlIG5hbWUgcGx1cyBhIGZh bGxiYWNrIGFwcGxpY2F0aW9uIG5hbWUuCisgKiBTaW5jZSB3ZSBtaWdodCBwcm9jZXNzIG11 bHRpcGxlIGRhdGFiYXNlcywgZWFjaCBkYXRhYmFzZSBuYW1lIHdpbGwgYmUKKyAqIGFwcGVu ZGVkIHRvIHRoaXMgYmFzZSBjb25uZWN0aW9uIHN0cmluZyB0byBwcm92aWRlIGEgZmluYWwg Y29ubmVjdGlvbiBzdHJpbmcuCisgKiBJZiB0aGUgc2Vjb25kIGFyZ3VtZW50IChkYm5hbWUp IGlzIG5vdCBudWxsLCByZXR1cm5zIGRibmFtZSBpZiB0aGUgcHJvdmlkZWQKKyAqIGNvbm5l Y3Rpb24gc3RyaW5nIGNvbnRhaW5zIGl0LiBJZiBvcHRpb24gLS1kYXRhYmFzZSBpcyBub3Qg cHJvdmlkZWQsIHVzZXMKKyAqIGRibmFtZSBhcyB0aGUgb25seSBkYXRhYmFzZSB0byBzZXR1 cCB0aGUgbG9naWNhbCByZXBsaWNhLgorICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNp YmlsaXR5IHRvIGZyZWUgdGhlIHJldHVybmVkIGNvbm5lY3Rpb24gc3RyaW5nIGFuZAorICog ZGJuYW1lLgorICovCitzdGF0aWMgY2hhciAqCitnZXRfYmFzZV9jb25uaW5mbyhjaGFyICpj b25uaW5mbywgY2hhciAqZGJuYW1lLCBjb25zdCBjaGFyICpub2Rlcm9sZSkKK3sKKwlQUUV4 cEJ1ZmZlciBidWYgPSBjcmVhdGVQUUV4cEJ1ZmZlcigpOworCVBRY29ubmluZm9PcHRpb24g KmNvbm5fb3B0cyA9IE5VTEw7CisJUFFjb25uaW5mb09wdGlvbiAqY29ubl9vcHQ7CisJY2hh cgkgICAqZXJybXNnID0gTlVMTDsKKwljaGFyCSAgICpyZXQ7CisJaW50CQkJaTsKKworCXBn X2xvZ19pbmZvKCJ2YWxpZGF0aW5nIGNvbm5lY3Rpb24gc3RyaW5nIG9uICVzIiwgbm9kZXJv bGUpOworCisJY29ubl9vcHRzID0gUFFjb25uaW5mb1BhcnNlKGNvbm5pbmZvLCAmZXJybXNn KTsKKwlpZiAoY29ubl9vcHRzID09IE5VTEwpCisJeworCQlwZ19sb2dfZXJyb3IoImNvdWxk IG5vdCBwYXJzZSBjb25uZWN0aW9uIHN0cmluZzogJXMiLCBlcnJtc2cpOworCQlyZXR1cm4g TlVMTDsKKwl9CisKKwlpID0gMDsKKwlmb3IgKGNvbm5fb3B0ID0gY29ubl9vcHRzOyBjb25u X29wdC0+a2V5d29yZCAhPSBOVUxMOyBjb25uX29wdCsrKQorCXsKKwkJaWYgKHN0cmNtcChj b25uX29wdC0+a2V5d29yZCwgImRibmFtZSIpID09IDAgJiYgY29ubl9vcHQtPnZhbCAhPSBO VUxMKQorCQl7CisJCQlpZiAoZGJuYW1lKQorCQkJCWRibmFtZSA9IHBnX3N0cmR1cChjb25u X29wdC0+dmFsKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNvbm5fb3B0LT52YWwg IT0gTlVMTCAmJiBjb25uX29wdC0+dmFsWzBdICE9ICdcMCcpCisJCXsKKwkJCWlmIChpID4g MCkKKwkJCQlhcHBlbmRQUUV4cEJ1ZmZlckNoYXIoYnVmLCAnICcpOworCQkJYXBwZW5kUFFF eHBCdWZmZXIoYnVmLCAiJXM9JXMiLCBjb25uX29wdC0+a2V5d29yZCwgY29ubl9vcHQtPnZh bCk7CisJCQlpKys7CisJCX0KKwl9CisKKwlpZiAoaSA+IDApCisJCWFwcGVuZFBRRXhwQnVm ZmVyQ2hhcihidWYsICcgJyk7CisJYXBwZW5kUFFFeHBCdWZmZXIoYnVmLCAiZmFsbGJhY2tf YXBwbGljYXRpb25fbmFtZT0lcyIsIHByb2duYW1lKTsKKworCXJldCA9IHBnX3N0cmR1cChi dWYtPmRhdGEpOworCisJZGVzdHJveVBRRXhwQnVmZmVyKGJ1Zik7CisJUFFjb25uaW5mb0Zy ZWUoY29ubl9vcHRzKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHZXQgdGhlIGFi c29sdXRlIHBhdGggZnJvbSBvdGhlciBQb3N0Z3JlU1FMIGJpbmFyaWVzIChwZ19jdGwgYW5k CisgKiBwZ19yZXNldHdhbCkgdGhhdCBpcyB1c2VkIGJ5IGl0LgorICovCitzdGF0aWMgYm9v bAorZ2V0X2V4ZWNfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCWludAkJCXJjOworCisJ cGdfY3RsX3BhdGggPSBwZ19tYWxsb2MoTUFYUEdQQVRIKTsKKwlyYyA9IGZpbmRfb3RoZXJf ZXhlYyhwYXRoLCAicGdfY3RsIiwKKwkJCQkJCSAicGdfY3RsIChQb3N0Z3JlU1FMKSAiIFBH X1ZFUlNJT04gIlxuIiwKKwkJCQkJCSBwZ19jdGxfcGF0aCk7CisJaWYgKHJjIDwgMCkKKwl7 CisJCWNoYXIJCWZ1bGxfcGF0aFtNQVhQR1BBVEhdOworCisJCWlmIChmaW5kX215X2V4ZWMo cGF0aCwgZnVsbF9wYXRoKSA8IDApCisJCQlzdHJsY3B5KGZ1bGxfcGF0aCwgcHJvZ25hbWUs IHNpemVvZihmdWxsX3BhdGgpKTsKKwkJaWYgKHJjID09IC0xKQorCQkJcGdfbG9nX2Vycm9y KCJUaGUgcHJvZ3JhbSBcIiVzXCIgaXMgbmVlZGVkIGJ5ICVzIGJ1dCB3YXMgbm90IGZvdW5k IGluIHRoZVxuIgorCQkJCQkJICJzYW1lIGRpcmVjdG9yeSBhcyBcIiVzXCIuXG4iCisJCQkJ CQkgIkNoZWNrIHlvdXIgaW5zdGFsbGF0aW9uLiIsCisJCQkJCQkgInBnX2N0bCIsIHByb2du YW1lLCBmdWxsX3BhdGgpOworCQllbHNlCisJCQlwZ19sb2dfZXJyb3IoIlRoZSBwcm9ncmFt IFwiJXNcIiB3YXMgZm91bmQgYnkgXCIlc1wiXG4iCisJCQkJCQkgImJ1dCB3YXMgbm90IHRo ZSBzYW1lIHZlcnNpb24gYXMgJXMuXG4iCisJCQkJCQkgIkNoZWNrIHlvdXIgaW5zdGFsbGF0 aW9uLiIsCisJCQkJCQkgInBnX2N0bCIsIGZ1bGxfcGF0aCwgcHJvZ25hbWUpOworCQlyZXR1 cm4gZmFsc2U7CisJfQorCisJcGdfbG9nX2RlYnVnKCJwZ19jdGwgcGF0aCBpczogJXMiLCBw Z19jdGxfcGF0aCk7CisKKwlwZ19yZXNldHdhbF9wYXRoID0gcGdfbWFsbG9jKE1BWFBHUEFU SCk7CisJcmMgPSBmaW5kX290aGVyX2V4ZWMocGF0aCwgInBnX3Jlc2V0d2FsIiwKKwkJCQkJ CSAicGdfcmVzZXR3YWwgKFBvc3RncmVTUUwpICIgUEdfVkVSU0lPTiAiXG4iLAorCQkJCQkJ IHBnX3Jlc2V0d2FsX3BhdGgpOworCWlmIChyYyA8IDApCisJeworCQljaGFyCQlmdWxsX3Bh dGhbTUFYUEdQQVRIXTsKKworCQlpZiAoZmluZF9teV9leGVjKHBhdGgsIGZ1bGxfcGF0aCkg PCAwKQorCQkJc3RybGNweShmdWxsX3BhdGgsIHByb2duYW1lLCBzaXplb2YoZnVsbF9wYXRo KSk7CisJCWlmIChyYyA9PSAtMSkKKwkJCXBnX2xvZ19lcnJvcigiVGhlIHByb2dyYW0gXCIl c1wiIGlzIG5lZWRlZCBieSAlcyBidXQgd2FzIG5vdCBmb3VuZCBpbiB0aGVcbiIKKwkJCQkJ CSAic2FtZSBkaXJlY3RvcnkgYXMgXCIlc1wiLlxuIgorCQkJCQkJICJDaGVjayB5b3VyIGlu c3RhbGxhdGlvbi4iLAorCQkJCQkJICJwZ19yZXNldHdhbCIsIHByb2duYW1lLCBmdWxsX3Bh dGgpOworCQllbHNlCisJCQlwZ19sb2dfZXJyb3IoIlRoZSBwcm9ncmFtIFwiJXNcIiB3YXMg Zm91bmQgYnkgXCIlc1wiXG4iCisJCQkJCQkgImJ1dCB3YXMgbm90IHRoZSBzYW1lIHZlcnNp b24gYXMgJXMuXG4iCisJCQkJCQkgIkNoZWNrIHlvdXIgaW5zdGFsbGF0aW9uLiIsCisJCQkJ CQkgInBnX3Jlc2V0d2FsIiwgZnVsbF9wYXRoLCBwcm9nbmFtZSk7CisJCXJldHVybiBmYWxz ZTsKKwl9CisKKwlwZ19sb2dfZGVidWcoInBnX3Jlc2V0d2FsIHBhdGggaXM6ICVzIiwgcGdf cmVzZXR3YWxfcGF0aCk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIElzIGl0IGEg Y2x1c3RlciBkaXJlY3Rvcnk/IFRoZXNlIGFyZSBwcmVsaW1pbmFyeSBjaGVja3MuIEl0IGlz IGZhciBmcm9tCisgKiBtYWtpbmcgYW4gYWNjdXJhdGUgY2hlY2suIElmIGl0IGlzIG5vdCBh IGNsb25lIGZyb20gdGhlIHB1Ymxpc2hlciwgaXQgd2lsbAorICogZXZlbnR1YWxseSBmYWls IGluIGEgZnV0dXJlIHN0ZXAuCisgKi8KK3N0YXRpYyBib29sCitjaGVja19kYXRhX2RpcmVj dG9yeShjb25zdCBjaGFyICpkYXRhZGlyKQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJ Y2hhcgkJdmVyc2lvbmZpbGVbTUFYUEdQQVRIXTsKKworCXBnX2xvZ19pbmZvKCJjaGVja2lu ZyBpZiBkaXJlY3RvcnkgXCIlc1wiIGlzIGEgY2x1c3RlciBkYXRhIGRpcmVjdG9yeSIsCisJ CQkJZGF0YWRpcik7CisKKwlpZiAoc3RhdChkYXRhZGlyLCAmc3RhdGJ1ZikgIT0gMCkKKwl7 CisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQlwZ19sb2dfZXJyb3IoImRhdGEgZGlyZWN0 b3J5IFwiJXNcIiBkb2VzIG5vdCBleGlzdCIsIGRhdGFkaXIpOworCQllbHNlCisJCQlwZ19s b2dfZXJyb3IoImNvdWxkIG5vdCBhY2Nlc3MgZGlyZWN0b3J5IFwiJXNcIjogJXMiLCBkYXRh ZGlyLCBzdHJlcnJvcihlcnJubykpOworCisJCXJldHVybiBmYWxzZTsKKwl9CisKKwlzbnBy aW50Zih2ZXJzaW9uZmlsZSwgTUFYUEdQQVRILCAiJXMvUEdfVkVSU0lPTiIsIGRhdGFkaXIp OworCWlmIChzdGF0KHZlcnNpb25maWxlLCAmc3RhdGJ1ZikgIT0gMCAmJiBlcnJubyA9PSBF Tk9FTlQpCisJeworCQlwZ19sb2dfZXJyb3IoImRpcmVjdG9yeSBcIiVzXCIgaXMgbm90IGEg ZGF0YWJhc2UgY2x1c3RlciBkaXJlY3RvcnkiLCBkYXRhZGlyKTsKKwkJcmV0dXJuIGZhbHNl OworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKgorICogQXBwZW5kIGRhdGFiYXNlIG5h bWUgaW50byBhIGJhc2UgY29ubmVjdGlvbiBzdHJpbmcuCisgKgorICogZGJuYW1lIGlzIHRo ZSBvbmx5IHBhcmFtZXRlciB0aGF0IGNoYW5nZXMgc28gaXQgaXMgbm90IGluY2x1ZGVkIGlu IHRoZSBiYXNlCisgKiBjb25uZWN0aW9uIHN0cmluZy4gVGhpcyBmdW5jdGlvbiBjb25jYXRl bmF0ZXMgZGJuYW1lIHRvIGJ1aWxkIGEgInJlYWwiCisgKiBjb25uZWN0aW9uIHN0cmluZy4K KyAqLworc3RhdGljIGNoYXIgKgorY29uY2F0X2Nvbm5pbmZvX2RibmFtZShjb25zdCBjaGFy ICpjb25uaW5mbywgY29uc3QgY2hhciAqZGJuYW1lKQoreworCVBRRXhwQnVmZmVyIGJ1ZiA9 IGNyZWF0ZVBRRXhwQnVmZmVyKCk7CisJY2hhcgkgICAqcmV0OworCisJQXNzZXJ0KGNvbm5p bmZvICE9IE5VTEwpOworCisJYXBwZW5kUFFFeHBCdWZmZXJTdHIoYnVmLCBjb25uaW5mbyk7 CisJYXBwZW5kUFFFeHBCdWZmZXIoYnVmLCAiIGRibmFtZT0lcyIsIGRibmFtZSk7CisKKwly ZXQgPSBwZ19zdHJkdXAoYnVmLT5kYXRhKTsKKwlkZXN0cm95UFFFeHBCdWZmZXIoYnVmKTsK KworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBTdG9yZSBwdWJsaWNhdGlvbiBhbmQgc3Vi c2NyaXB0aW9uIGluZm9ybWF0aW9uLgorICovCitzdGF0aWMgTG9naWNhbFJlcEluZm8gKgor c3RvcmVfcHViX3N1Yl9pbmZvKGNvbnN0IGNoYXIgKnB1Yl9iYXNlX2Nvbm5pbmZvLCBjb25z dCBjaGFyICpzdWJfYmFzZV9jb25uaW5mbykKK3sKKwlMb2dpY2FsUmVwSW5mbyAqZGJpbmZv OworCVNpbXBsZVN0cmluZ0xpc3RDZWxsICpjZWxsOworCWludAkJCWkgPSAwOworCisJZGJp bmZvID0gKExvZ2ljYWxSZXBJbmZvICopIHBnX21hbGxvYyhudW1fZGJzICogc2l6ZW9mKExv Z2ljYWxSZXBJbmZvKSk7CisKKwlmb3IgKGNlbGwgPSBkYXRhYmFzZV9uYW1lcy5oZWFkOyBj ZWxsOyBjZWxsID0gY2VsbC0+bmV4dCkKKwl7CisJCWNoYXIJICAgKmNvbm5pbmZvOworCisJ CS8qIFB1Ymxpc2hlci4gKi8KKwkJY29ubmluZm8gPSBjb25jYXRfY29ubmluZm9fZGJuYW1l KHB1Yl9iYXNlX2Nvbm5pbmZvLCBjZWxsLT52YWwpOworCQlkYmluZm9baV0ucHViY29ubmlu Zm8gPSBjb25uaW5mbzsKKwkJZGJpbmZvW2ldLmRibmFtZSA9IGNlbGwtPnZhbDsKKwkJZGJp bmZvW2ldLm1hZGVfcmVwbHNsb3QgPSBmYWxzZTsKKwkJZGJpbmZvW2ldLm1hZGVfcHVibGlj YXRpb24gPSBmYWxzZTsKKwkJZGJpbmZvW2ldLm1hZGVfc3Vic2NyaXB0aW9uID0gZmFsc2U7 CisJCS8qIG90aGVyIHN0cnVjdCBmaWVsZHMgd2lsbCBiZSBmaWxsZWQgbGF0ZXIuICovCisK KwkJLyogU3Vic2NyaWJlci4gKi8KKwkJY29ubmluZm8gPSBjb25jYXRfY29ubmluZm9fZGJu YW1lKHN1Yl9iYXNlX2Nvbm5pbmZvLCBjZWxsLT52YWwpOworCQlkYmluZm9baV0uc3ViY29u bmluZm8gPSBjb25uaW5mbzsKKworCQlpKys7CisJfQorCisJcmV0dXJuIGRiaW5mbzsKK30K Kworc3RhdGljIFBHY29ubiAqCitjb25uZWN0X2RhdGFiYXNlKGNvbnN0IGNoYXIgKmNvbm5p bmZvKQoreworCVBHY29ubgkgICAqY29ubjsKKwlQR3Jlc3VsdCAgICpyZXM7CisJY29uc3Qg Y2hhciAqcmNvbm5pbmZvOworCisJLyogbG9naWNhbCByZXBsaWNhdGlvbiBtb2RlICovCisJ cmNvbm5pbmZvID0gcHNwcmludGYoIiVzIHJlcGxpY2F0aW9uPWRhdGFiYXNlIiwgY29ubmlu Zm8pOworCisJY29ubiA9IFBRY29ubmVjdGRiKHJjb25uaW5mbyk7CisJaWYgKFBRc3RhdHVz KGNvbm4pICE9IENPTk5FQ1RJT05fT0spCisJeworCQlwZ19sb2dfZXJyb3IoImNvbm5lY3Rp b24gdG8gZGF0YWJhc2UgZmFpbGVkOiAlcyIsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsKKwkJ cmV0dXJuIE5VTEw7CisJfQorCisJLyogc2VjdXJlIHNlYXJjaF9wYXRoICovCisJcmVzID0g UFFleGVjKGNvbm4sIEFMV0FZU19TRUNVUkVfU0VBUkNIX1BBVEhfU1FMKTsKKwlpZiAoUFFy ZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJeworCQlwZ19sb2dfZXJy b3IoImNvdWxkIG5vdCBjbGVhciBzZWFyY2hfcGF0aDogJXMiLCBQUXJlc3VsdEVycm9yTWVz c2FnZShyZXMpKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCVBRY2xlYXIocmVzKTsKKworCXJl dHVybiBjb25uOworfQorCitzdGF0aWMgdm9pZAorZGlzY29ubmVjdF9kYXRhYmFzZShQR2Nv bm4gKmNvbm4pCit7CisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlQUWZpbmlzaChjb25u KTsKK30KKworLyoKKyAqIE9idGFpbiB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdXNpbmcgdGhl IHByb3ZpZGVkIGNvbm5lY3Rpb24uIEl0IHdpbGwgYmUgdXNlZAorICogdG8gY29tcGFyZSBp ZiBhIGRhdGEgZGlyZWN0b3J5IGlzIGEgY2xvbmUgb2YgYW5vdGhlciBvbmUuCisgKi8KK3N0 YXRpYyB1aW50NjQKK2dldF9zeXNpZF9mcm9tX2Nvbm4oY29uc3QgY2hhciAqY29ubmluZm8p Cit7CisJUEdjb25uCSAgICpjb25uOworCVBHcmVzdWx0ICAgKnJlczsKKwl1aW50NjQJCXN5 c2lkOworCisJcGdfbG9nX2luZm8oImdldHRpbmcgc3lzdGVtIGlkZW50aWZpZXIgZnJvbSBw dWJsaXNoZXIiKTsKKworCWNvbm4gPSBjb25uZWN0X2RhdGFiYXNlKGNvbm5pbmZvKTsKKwlp ZiAoY29ubiA9PSBOVUxMKQorCQlleGl0KDEpOworCisJcmVzID0gUFFleGVjKGNvbm4sICJJ REVOVElGWV9TWVNURU0iKTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19U VVBMRVNfT0spCisJeworCQlwZ19sb2dfZXJyb3IoImNvdWxkIG5vdCBzZW5kIHJlcGxpY2F0 aW9uIGNvbW1hbmQgXCIlc1wiOiAlcyIsCisJCQkJCSAiSURFTlRJRllfU1lTVEVNIiwgUFFy ZXN1bHRFcnJvck1lc3NhZ2UocmVzKSk7CisJCVBRY2xlYXIocmVzKTsKKwkJZGlzY29ubmVj dF9kYXRhYmFzZShjb25uKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKFBRbnR1cGxlcyhyZXMp ICE9IDEgfHwgUFFuZmllbGRzKHJlcykgPCAzKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb3Vs ZCBub3QgaWRlbnRpZnkgc3lzdGVtOiBnb3QgJWQgcm93cyBhbmQgJWQgZmllbGRzLCBleHBl Y3RlZCAlZCByb3dzIGFuZCAlZCBvciBtb3JlIGZpZWxkcyIsCisJCQkJCSBQUW50dXBsZXMo cmVzKSwgUFFuZmllbGRzKHJlcyksIDEsIDMpOworCisJCVBRY2xlYXIocmVzKTsKKwkJZGlz Y29ubmVjdF9kYXRhYmFzZShjb25uKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlzeXNpZCA9IHN0 cnRvdTY0KFBRZ2V0dmFsdWUocmVzLCAwLCAwKSwgTlVMTCwgMTApOworCisJcGdfbG9nX2lu Zm8oInN5c3RlbSBpZGVudGlmaWVyIGlzICVsZCBvbiBwdWJsaXNoZXIiLCBzeXNpZCk7CisK KwlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4pOworCisJcmV0dXJuIHN5c2lkOworfQorCisv KgorICogT2J0YWluIHRoZSBzeXN0ZW0gaWRlbnRpZmllciBmcm9tIGNvbnRyb2wgZmlsZS4g SXQgd2lsbCBiZSB1c2VkIHRvIGNvbXBhcmUKKyAqIGlmIGEgZGF0YSBkaXJlY3RvcnkgaXMg YSBjbG9uZSBvZiBhbm90aGVyIG9uZS4gVGhpcyByb3V0aW5lIGlzIHVzZWQgbG9jYWxseQor ICogYW5kIGF2b2lkcyBhIHJlcGxpY2F0aW9uIGNvbm5lY3Rpb24uCisgKi8KK3N0YXRpYyB1 aW50NjQKK2dldF9jb250cm9sX2Zyb21fZGF0YWRpcihjb25zdCBjaGFyICpkYXRhZGlyKQor eworCUNvbnRyb2xGaWxlRGF0YSAqY2Y7CisJYm9vbAkJY3JjX29rOworCXVpbnQ2NAkJc3lz aWQ7CisKKwlwZ19sb2dfaW5mbygiZ2V0dGluZyBzeXN0ZW0gaWRlbnRpZmllciBmcm9tIHN1 YnNjcmliZXIiKTsKKworCWNmID0gZ2V0X2NvbnRyb2xmaWxlKGRhdGFkaXIsICZjcmNfb2sp OworCWlmICghY3JjX29rKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjb250cm9sIGZpbGUgYXBw ZWFycyB0byBiZSBjb3JydXB0Iik7CisJCWV4aXQoMSk7CisJfQorCisJc3lzaWQgPSBjZi0+ c3lzdGVtX2lkZW50aWZpZXI7CisKKwlwZ19sb2dfaW5mbygic3lzdGVtIGlkZW50aWZpZXIg aXMgJWxkIG9uIHN1YnNjcmliZXIiLCBzeXNpZCk7CisKKwlwZnJlZShjZik7CisKKwlyZXR1 cm4gc3lzaWQ7Cit9CisKKy8qCisgKiBNb2RpZnkgdGhlIHN5c3RlbSBpZGVudGlmaWVyLiBT aW5jZSBhIHN0YW5kYnkgc2VydmVyIHByZXNlcnZlcyB0aGUgc3lzdGVtCisgKiBpZGVudGlm aWVyLCBpdCBtYWtlcyBzZW5zZSB0byBjaGFuZ2UgaXQgdG8gYXZvaWQgc2l0dWF0aW9ucyBp biB3aGljaCBXQUwKKyAqIGZpbGVzIGZyb20gb25lIG9mIHRoZSBzeXN0ZW1zIG1pZ2h0IGJl IHVzZWQgaW4gdGhlIG90aGVyIG9uZS4KKyAqLworc3RhdGljIHZvaWQKK21vZGlmeV9zeXNp ZChjb25zdCBjaGFyICpwZ19yZXNldHdhbF9wYXRoLCBjb25zdCBjaGFyICpkYXRhZGlyKQor eworCUNvbnRyb2xGaWxlRGF0YSAqY2Y7CisJYm9vbAkJY3JjX29rOworCXN0cnVjdCB0aW1l dmFsIHR2OworCisJY2hhcgkgICAqY21kX3N0cjsKKwlpbnQJCQlyYzsKKworCXBnX2xvZ19p bmZvKCJtb2RpZnlpbmcgc3lzdGVtIGlkZW50aWZpZXIgZnJvbSBzdWJzY3JpYmVyIik7CisK KwljZiA9IGdldF9jb250cm9sZmlsZShkYXRhZGlyLCAmY3JjX29rKTsKKwlpZiAoIWNyY19v aykKKwl7CisJCXBnX2xvZ19lcnJvcigiY29udHJvbCBmaWxlIGFwcGVhcnMgdG8gYmUgY29y cnVwdCIpOworCQlleGl0KDEpOworCX0KKworCS8qCisJICogU2VsZWN0IGEgbmV3IHN5c3Rl bSBpZGVudGlmaWVyLgorCSAqCisJICogWFhYIHRoaXMgY29kZSB3YXMgZXh0cmFjdGVkIGZy b20gQm9vdFN0cmFwWExPRygpLgorCSAqLworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwor CWNmLT5zeXN0ZW1faWRlbnRpZmllciA9ICgodWludDY0KSB0di50dl9zZWMpIDw8IDMyOwor CWNmLT5zeXN0ZW1faWRlbnRpZmllciB8PSAoKHVpbnQ2NCkgdHYudHZfdXNlYykgPDwgMTI7 CisJY2YtPnN5c3RlbV9pZGVudGlmaWVyIHw9IGdldHBpZCgpICYgMHhGRkY7CisKKwlpZiAo IWRyeV9ydW4pCisJCXVwZGF0ZV9jb250cm9sZmlsZShkYXRhZGlyLCBjZiwgdHJ1ZSk7CisK KwlwZ19sb2dfaW5mbygic3lzdGVtIGlkZW50aWZpZXIgaXMgJWxkIG9uIHN1YnNjcmliZXIi LCBjZi0+c3lzdGVtX2lkZW50aWZpZXIpOworCisJcGdfbG9nX2luZm8oInJ1bm5pbmcgcGdf cmVzZXR3YWwgb24gdGhlIHN1YnNjcmliZXIiKTsKKworCWNtZF9zdHIgPSBwc3ByaW50Zigi XCIlc1wiIC1EIFwiJXNcIiIsIHBnX3Jlc2V0d2FsX3BhdGgsIGRhdGFkaXIpOworCisJcGdf bG9nX2RlYnVnKCJjb21tYW5kIGlzOiAlcyIsIGNtZF9zdHIpOworCisJaWYgKCFkcnlfcnVu KQorCXsKKwkJcmMgPSBzeXN0ZW0oY21kX3N0cik7CisJCWlmIChyYyA9PSAwKQorCQkJcGdf bG9nX2luZm8oInN1YnNjcmliZXIgc3VjY2Vzc2Z1bGx5IGNoYW5nZWQgdGhlIHN5c3RlbSBp ZGVudGlmaWVyIik7CisJCWVsc2UKKwkJCXBnX2xvZ19lcnJvcigic3Vic2NyaWJlciBmYWls ZWQgdG8gY2hhbmdlIHN5c3RlbSBpZGVudGlmaWVyOiBleGl0IGNvZGU6ICVkIiwgcmMpOwor CX0KKworCXBmcmVlKGNmKTsKK30KKworc3RhdGljIGJvb2wKK2NyZWF0ZV9hbGxfbG9naWNh bF9yZXBsaWNhdGlvbl9zbG90cyhMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKQoreworCWludAkJ CWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RiczsgaSsrKQorCXsKKwkJUEdjb25uCSAg ICpjb25uOworCQlQR3Jlc3VsdCAgICpyZXM7CisJCWNoYXIJCXJlcGxzbG90bmFtZVtOQU1F REFUQUxFTl07CisKKwkJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvW2ldLnB1YmNv bm5pbmZvKTsKKwkJaWYgKGNvbm4gPT0gTlVMTCkKKwkJCWV4aXQoMSk7CisKKwkJcmVzID0g UFFleGVjKGNvbm4sCisJCQkJCSAiU0VMRUNUIG9pZCBGUk9NIHBnX2NhdGFsb2cucGdfZGF0 YWJhc2UgV0hFUkUgZGF0bmFtZSA9IGN1cnJlbnRfZGF0YWJhc2UoKSIpOworCQlpZiAoUFFy ZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJCXsKKwkJCXBnX2xvZ19l cnJvcigiY291bGQgbm90IG9idGFpbiBkYXRhYmFzZSBPSUQ6ICVzIiwgUFFyZXN1bHRFcnJv ck1lc3NhZ2UocmVzKSk7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKworCQlpZiAoUFFudHVw bGVzKHJlcykgIT0gMSkKKwkJeworCQkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3Qgb2J0YWlu IGRhdGFiYXNlIE9JRDogZ290ICVkIHJvd3MsIGV4cGVjdGVkICVkIHJvd3MiLAorCQkJCQkJ IFBRbnR1cGxlcyhyZXMpLCAxKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJCS8qIFJl bWVtYmVyIGRhdGFiYXNlIE9JRC4gKi8KKwkJZGJpbmZvW2ldLm9pZCA9IHN0cnRvdWwoUFFn ZXR2YWx1ZShyZXMsIDAsIDApLCBOVUxMLCAxMCk7CisKKwkJUFFjbGVhcihyZXMpOworCisJ CS8qCisJCSAqIEJ1aWxkIHRoZSByZXBsaWNhdGlvbiBzbG90IG5hbWUuIFRoZSBuYW1lIG11 c3Qgbm90IGV4Y2VlZAorCQkgKiBOQU1FREFUQUxFTiAtIDEuIFRoaXMgY3VycmVudCBzY2hl bWEgdXNlcyBhIG1heGltdW0gb2YgMzYKKwkJICogY2hhcmFjdGVycyAoMTQgKyAxMCArIDEg KyAxMCArICdcMCcpLiBTeXN0ZW0gaWRlbnRpZmllciBpcyBpbmNsdWRlZAorCQkgKiB0byBy ZWR1Y2UgdGhlIHByb2JhYmlsaXR5IG9mIGNvbGxpc2lvbi4gQnkgZGVmYXVsdCwgc3Vic2Ny aXB0aW9uCisJCSAqIG5hbWUgaXMgdXNlZCBhcyByZXBsaWNhdGlvbiBzbG90IG5hbWUuCisJ CSAqLworCQlzbnByaW50ZihyZXBsc2xvdG5hbWUsIHNpemVvZihyZXBsc2xvdG5hbWUpLAor CQkJCSAicGdfc3Vic2NyaWJlcl8ldV8lZCIsCisJCQkJIGRiaW5mb1tpXS5vaWQsCisJCQkJ IChpbnQpIGdldHBpZCgpKTsKKwkJZGJpbmZvW2ldLnN1Ym5hbWUgPSBwZ19zdHJkdXAocmVw bHNsb3RuYW1lKTsKKworCQkvKiBDcmVhdGUgcmVwbGljYXRpb24gc2xvdCBvbiBwdWJsaXNo ZXIuICovCisJCWlmIChjcmVhdGVfbG9naWNhbF9yZXBsaWNhdGlvbl9zbG90KGNvbm4sICZk YmluZm9baV0sIHJlcGxzbG90bmFtZSkgIT0gTlVMTCB8fCBkcnlfcnVuKQorCQkJcGdfbG9n X2luZm8oImNyZWF0ZSByZXBsaWNhdGlvbiBzbG90IFwiJXNcIiBvbiBwdWJsaXNoZXIiLCBy ZXBsc2xvdG5hbWUpOworCQllbHNlCisJCQlyZXR1cm4gZmFsc2U7CisKKwkJZGlzY29ubmVj dF9kYXRhYmFzZShjb25uKTsKKwl9CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoKKyAqIENy ZWF0ZSBhIGxvZ2ljYWwgcmVwbGljYXRpb24gc2xvdCBhbmQgcmV0dXJucyBhIGNvbnNpc3Rl bnQgTFNOLiBUaGUgcmV0dXJuZWQKKyAqIExTTiBtaWdodCBiZSB1c2VkIHRvIGNhdGNoIHVw IHRoZSBzdWJzY3JpYmVyIHVwIHRvIHRoZSByZXF1aXJlZCBwb2ludC4KKyAqCisgKiBDcmVh dGVSZXBsaWNhdGlvblNsb3QoKSBpcyBub3QgdXNlZCBiZWNhdXNlIGl0IGRvZXMgbm90IHBy b3ZpZGUgdGhlIG9uZS1yb3cKKyAqIHJlc3VsdCBzZXQgdGhhdCBjb250YWlucyB0aGUgY29u c2lzdGVudCBMU04uCisgKi8KK3N0YXRpYyBjaGFyICoKK2NyZWF0ZV9sb2dpY2FsX3JlcGxp Y2F0aW9uX3Nsb3QoUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvLAorCQkJ CQkJCQljaGFyICpzbG90X25hbWUpCit7CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFF eHBCdWZmZXIoKTsKKwlQR3Jlc3VsdCAgICpyZXM7CisJY2hhcgkgICAqbHNuID0gTlVMTDsK Kwlib29sCQl0cmFuc2llbnRfcmVwbHNsb3QgPSBmYWxzZTsKKworCUFzc2VydChjb25uICE9 IE5VTEwpOworCisJLyoKKwkgKiBJZiBubyBzbG90IG5hbWUgaXMgaW5mb3JtZWQsIGl0IGlz IGEgdHJhbnNpZW50IHJlcGxpY2F0aW9uIHNsb3QgdXNlZAorCSAqIG9ubHkgZm9yIGNhdGNo IHVwIHB1cnBvc2VzLgorCSAqLworCWlmIChzbG90X25hbWVbMF0gPT0gJ1wwJykKKwl7CisJ CXNucHJpbnRmKHNsb3RfbmFtZSwgTkFNRURBVEFMRU4sICJwZ19zdWJzY3JpYmVyXyVkX3N0 YXJ0cG9pbnQiLAorCQkJCSAoaW50KSBnZXRwaWQoKSk7CisJCXRyYW5zaWVudF9yZXBsc2xv dCA9IHRydWU7CisJfQorCisJcGdfbG9nX2luZm8oImNyZWF0aW5nIHRoZSByZXBsaWNhdGlv biBzbG90IFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVzXCIiLCBzbG90X25hbWUsIGRiaW5mby0+ ZGJuYW1lKTsKKworCWFwcGVuZFBRRXhwQnVmZmVyKHN0ciwgIkNSRUFURV9SRVBMSUNBVElP Tl9TTE9UIFwiJXNcIiIsIHNsb3RfbmFtZSk7CisJYXBwZW5kUFFFeHBCdWZmZXJTdHIoc3Ry LCAiIExPR0lDQUwgXCJwZ291dHB1dFwiIE5PRVhQT1JUX1NOQVBTSE9UIik7CisKKwlwZ19s b2dfZGVidWcoImNvbW1hbmQgaXM6ICVzIiwgc3RyLT5kYXRhKTsKKworCWlmICghZHJ5X3J1 bikKKwl7CisJCXJlcyA9IFBRZXhlYyhjb25uLCBzdHItPmRhdGEpOworCQlpZiAoUFFyZXN1 bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNfT0spCisJCXsKKwkJCXBnX2xvZ19lcnJv cigiY291bGQgbm90IGNyZWF0ZSByZXBsaWNhdGlvbiBzbG90IFwiJXNcIiBvbiBkYXRhYmFz ZSBcIiVzXCI6ICVzIiwgc2xvdF9uYW1lLCBkYmluZm8tPmRibmFtZSwKKwkJCQkJCSBQUXJl c3VsdEVycm9yTWVzc2FnZShyZXMpKTsKKwkJCXJldHVybiBsc247CisJCX0KKwl9CisKKwkv KiBmb3IgY2xlYW51cCBwdXJwb3NlcyAqLworCWlmICh0cmFuc2llbnRfcmVwbHNsb3QpCisJ CW1hZGVfdHJhbnNpZW50X3JlcGxzbG90ID0gdHJ1ZTsKKwllbHNlCisJCWRiaW5mby0+bWFk ZV9yZXBsc2xvdCA9IHRydWU7CisKKwlpZiAoIWRyeV9ydW4pCisJeworCQlsc24gPSBwZ19z dHJkdXAoUFFnZXR2YWx1ZShyZXMsIDAsIDEpKTsKKwkJUFFjbGVhcihyZXMpOworCX0KKwor CWRlc3Ryb3lQUUV4cEJ1ZmZlcihzdHIpOworCisJcmV0dXJuIGxzbjsKK30KKworc3RhdGlj IHZvaWQKK2Ryb3BfcmVwbGljYXRpb25fc2xvdChQR2Nvbm4gKmNvbm4sIExvZ2ljYWxSZXBJ bmZvICpkYmluZm8sIGNvbnN0IGNoYXIgKnNsb3RfbmFtZSkKK3sKKwlQUUV4cEJ1ZmZlciBz dHIgPSBjcmVhdGVQUUV4cEJ1ZmZlcigpOworCVBHcmVzdWx0ICAgKnJlczsKKworCUFzc2Vy dChjb25uICE9IE5VTEwpOworCisJcGdfbG9nX2luZm8oImRyb3BwaW5nIHRoZSByZXBsaWNh dGlvbiBzbG90IFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVzXCIiLCBzbG90X25hbWUsIGRiaW5m by0+ZGJuYW1lKTsKKworCWFwcGVuZFBRRXhwQnVmZmVyKHN0ciwgIkRST1BfUkVQTElDQVRJ T05fU0xPVCBcIiVzXCIiLCBzbG90X25hbWUpOworCisJcGdfbG9nX2RlYnVnKCJjb21tYW5k IGlzOiAlcyIsIHN0ci0+ZGF0YSk7CisKKwlpZiAoIWRyeV9ydW4pCisJeworCQlyZXMgPSBQ UWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKwkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0g UEdSRVNfQ09NTUFORF9PSykKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IGRyb3AgcmVw bGljYXRpb24gc2xvdCBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiOiAlcyIsIHNsb3RfbmFt ZSwgZGJpbmZvLT5kYm5hbWUsCisJCQkJCQkgUFFlcnJvck1lc3NhZ2UoY29ubikpOworCisJ CVBRY2xlYXIocmVzKTsKKwl9CisKKwlkZXN0cm95UFFFeHBCdWZmZXIoc3RyKTsKK30KKwor LyoKKyAqIFJlcG9ydHMgYSBzdWl0YWJsZSBtZXNzYWdlIGlmIHBnX2N0bCBmYWlscy4KKyAq Lworc3RhdGljIHZvaWQKK3BnX2N0bF9zdGF0dXMoY29uc3QgY2hhciAqcGdfY3RsX2NtZCwg aW50IHJjLCBpbnQgYWN0aW9uKQoreworCWlmIChyYyAhPSAwKQorCXsKKwkJaWYgKFdJRkVY SVRFRChyYykpCisJCXsKKwkJCXBnX2xvZ19lcnJvcigicGdfY3RsIGZhaWxlZCB3aXRoIGV4 aXQgY29kZSAlZCIsIFdFWElUU1RBVFVTKHJjKSk7CisJCX0KKwkJZWxzZSBpZiAoV0lGU0lH TkFMRUQocmMpKQorCQl7CisjaWYgZGVmaW5lZChXSU4zMikKKwkJCXBnX2xvZ19lcnJvcigi cGdfY3RsIHdhcyB0ZXJtaW5hdGVkIGJ5IGV4Y2VwdGlvbiAweCVYIiwgV1RFUk1TSUcocmMp KTsKKwkJCXBnX2xvZ19lcnJvcl9kZXRhaWwoIlNlZSBDIGluY2x1ZGUgZmlsZSBcIm50c3Rh dHVzLmhcIiBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgaGV4YWRlY2ltYWwgdmFsdWUuIik7 CisjZWxzZQorCQkJcGdfbG9nX2Vycm9yKCJwZ19jdGwgd2FzIHRlcm1pbmF0ZWQgYnkgc2ln bmFsICVkOiAlcyIsCisJCQkJCQkgV1RFUk1TSUcocmMpLCBwZ19zdHJzaWduYWwoV1RFUk1T SUcocmMpKSk7CisjZW5kaWYKKwkJfQorCQllbHNlCisJCXsKKwkJCXBnX2xvZ19lcnJvcigi cGdfY3RsIGV4aXRlZCB3aXRoIHVucmVjb2duaXplZCBzdGF0dXMgJWQiLCByYyk7CisJCX0K KworCQlwZ19sb2dfZXJyb3JfZGV0YWlsKCJUaGUgZmFpbGVkIGNvbW1hbmQgd2FzOiAlcyIs IHBnX2N0bF9jbWQpOworCQlleGl0KDEpOworCX0KKworCWlmIChhY3Rpb24pCisJCXBnX2xv Z19pbmZvKCJwb3N0bWFzdGVyIHdhcyBzdGFydGVkIik7CisJZWxzZQorCQlwZ19sb2dfaW5m bygicG9zdG1hc3RlciB3YXMgc3RvcHBlZCIpOworfQorCisvKgorICogUmV0dXJucyBhZnRl ciB0aGUgc2VydmVyIGZpbmlzaGVzIHRoZSByZWNvdmVyeSBwcm9jZXNzLgorICovCitzdGF0 aWMgdm9pZAord2FpdF9mb3JfZW5kX3JlY292ZXJ5KGNvbnN0IGNoYXIgKmNvbm5pbmZvKQor eworCVBHY29ubgkgICAqY29ubjsKKwlQR3Jlc3VsdCAgICpyZXM7CisJaW50CQkJc3RhdHVz ID0gUE9TVE1BU1RFUl9TVElMTF9TVEFSVElORzsKKworCXBnX2xvZ19pbmZvKCJ3YWl0aW5n IHRoZSBwb3N0bWFzdGVyIHRvIHJlYWNoIHRoZSBjb25zaXN0ZW50IHN0YXRlIik7CisKKwlj b25uID0gY29ubmVjdF9kYXRhYmFzZShjb25uaW5mbyk7CisJaWYgKGNvbm4gPT0gTlVMTCkK KwkJZXhpdCgxKTsKKworCWZvciAoOzspCisJeworCQlib29sCQlpbl9yZWNvdmVyeTsKKwor CQlyZXMgPSBQUWV4ZWMoY29ubiwgIlNFTEVDVCBwZ19jYXRhbG9nLnBnX2lzX2luX3JlY292 ZXJ5KCkiKTsKKworCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQR1JFU19UVVBMRVNf T0spCisJCXsKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IG9idGFpbiByZWNvdmVyeSBw cm9ncmVzcyIpOworCQkJZXhpdCgxKTsKKwkJfQorCisJCWlmIChQUW50dXBsZXMocmVzKSAh PSAxKQorCQl7CisJCQlwZ19sb2dfZXJyb3IoInVuZXhwZWN0ZWQgcmVzdWx0IGZyb20gcGdf aXNfaW5fcmVjb3ZlcnkgZnVuY3Rpb24iKTsKKwkJCWV4aXQoMSk7CisJCX0KKworCQlpbl9y ZWNvdmVyeSA9IChzdHJjbXAoUFFnZXR2YWx1ZShyZXMsIDAsIDApLCAidCIpID09IDApOwor CisJCVBRY2xlYXIocmVzKTsKKworCQkvKgorCQkgKiBEb2VzIHRoZSByZWNvdmVyeSBwcm9j ZXNzIGZpbmlzaD8gSW4gZHJ5IHJ1biBtb2RlLCB0aGVyZSBpcyBubworCQkgKiByZWNvdmVy eSBtb2RlLiBCYWlsIG91dCBhcyB0aGUgcmVjb3ZlcnkgcHJvY2VzcyBoYXMgZW5kZWQuCisJ CSAqLworCQlpZiAoIWluX3JlY292ZXJ5IHx8IGRyeV9ydW4pCisJCXsKKwkJCXN0YXR1cyA9 IFBPU1RNQVNURVJfUkVBRFk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIEtlZXAgd2FpdGlu Zy4gKi8KKwkJcGdfdXNsZWVwKFdBSVRfSU5URVJWQUwgKiBVU0VDX1BFUl9TRUMpOworCX0K KworCWRpc2Nvbm5lY3RfZGF0YWJhc2UoY29ubik7CisKKwlpZiAoc3RhdHVzID09IFBPU1RN QVNURVJfU1RJTExfU1RBUlRJTkcpCisJeworCQlwZ19sb2dfZXJyb3IoInNlcnZlciBkaWQg bm90IGVuZCByZWNvdmVyeSIpOworCQlleGl0KDEpOworCX0KKworCXBnX2xvZ19pbmZvKCJw b3N0bWFzdGVyIHJlYWNoZWQgdGhlIGNvbnNpc3RlbnQgc3RhdGUiKTsKK30KKworLyoKKyAq IENyZWF0ZSBhIHB1YmxpY2F0aW9uIHRoYXQgaW5jbHVkZXMgYWxsIHRhYmxlcyBpbiB0aGUg ZGF0YWJhc2UuCisgKi8KK3N0YXRpYyB2b2lkCitjcmVhdGVfcHVibGljYXRpb24oUEdjb25u ICpjb25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKQoreworCVBRRXhwQnVmZmVyIHN0ciA9 IGNyZWF0ZVBRRXhwQnVmZmVyKCk7CisJUEdyZXN1bHQgICAqcmVzOworCisJQXNzZXJ0KGNv bm4gIT0gTlVMTCk7CisKKwkvKiBDaGVjayBpZiB0aGUgcHVibGljYXRpb24gbmVlZHMgdG8g YmUgY3JlYXRlZC4gKi8KKwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIsCisJCQkJCSAgIlNFTEVD VCBwdWJhbGx0YWJsZXMgRlJPTSBwZ19jYXRhbG9nLnBnX3B1YmxpY2F0aW9uIFdIRVJFIHB1 Ym5hbWUgPSAnJXMnIiwKKwkJCQkJICBkYmluZm8tPnB1Ym5hbWUpOworCXJlcyA9IFBRZXhl Yyhjb25uLCBzdHItPmRhdGEpOworCWlmIChQUXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVT X1RVUExFU19PSykKKwl7CisJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IG9idGFpbiBwdWJs aWNhdGlvbiBpbmZvcm1hdGlvbjogJXMiLAorCQkJCQkgUFFyZXN1bHRFcnJvck1lc3NhZ2Uo cmVzKSk7CisJCVBRY2xlYXIocmVzKTsKKwkJUFFmaW5pc2goY29ubik7CisJCWV4aXQoMSk7 CisJfQorCisJaWYgKFBRbnR1cGxlcyhyZXMpID09IDEpCisJeworCQkvKgorCQkgKiBJZiBw dWJsaWNhdGlvbiBuYW1lIGFscmVhZHkgZXhpc3RzIGFuZCBwdWJhbGx0YWJsZXMgaXMgdHJ1 ZSwgbGV0J3MKKwkJICogdXNlIGl0LiBBIHByZXZpb3VzIHJ1biBvZiBwZ19zdWJzY3JpYmVy IG11c3QgaGF2ZSBjcmVhdGVkIHRoaXMKKwkJICogcHVibGljYXRpb24uIEJhaWwgb3V0Lgor CQkgKi8KKwkJaWYgKHN0cmNtcChQUWdldHZhbHVlKHJlcywgMCwgMCksICJ0IikgPT0gMCkK KwkJeworCQkJcGdfbG9nX2luZm8oInB1YmxpY2F0aW9uIFwiJXNcIiBhbHJlYWR5IGV4aXN0 cyIsIGRiaW5mby0+cHVibmFtZSk7CisJCQlyZXR1cm47CisJCX0KKwkJZWxzZQorCQl7CisJ CQkvKgorCQkJICogVW5mb3J0dW5hdGVseSwgaWYgaXQgcmVhY2hlcyB0aGlzIGNvZGUgcGF0 aCwgaXQgd2lsbCBhbHdheXMKKwkJCSAqIGZhaWwgKHVubGVzcyB5b3UgZGVjaWRlIHRvIGNo YW5nZSB0aGUgZXhpc3RpbmcgcHVibGljYXRpb24KKwkJCSAqIG5hbWUpLiBUaGF0J3MgYmFk IGJ1dCBpdCBpcyB2ZXJ5IHVubGlrZWx5IHRoYXQgdGhlIHVzZXIgd2lsbAorCQkJICogY2hv b3NlIGEgbmFtZSB3aXRoIHBnX3N1YnNjcmliZXJfIHByZWZpeCBmb2xsb3dlZCBieSB0aGUg ZXhhY3QKKwkJCSAqIGRhdGFiYXNlIG9pZCBpbiB3aGljaCBwdWJhbGx0YWJsZXMgaXMgZmFs c2UuCisJCQkgKi8KKwkJCXBnX2xvZ19lcnJvcigicHVibGljYXRpb24gXCIlc1wiIGRvZXMg bm90IHJlcGxpY2F0ZSBjaGFuZ2VzIGZvciBhbGwgdGFibGVzIiwKKwkJCQkJCSBkYmluZm8t PnB1Ym5hbWUpOworCQkJcGdfbG9nX2Vycm9yX2hpbnQoIkNvbnNpZGVyIHJlbmFtaW5nIHRo aXMgcHVibGljYXRpb24uIik7CisJCQlQUWNsZWFyKHJlcyk7CisJCQlQUWZpbmlzaChjb25u KTsKKwkJCWV4aXQoMSk7CisJCX0KKwl9CisKKwlQUWNsZWFyKHJlcyk7CisJcmVzZXRQUUV4 cEJ1ZmZlcihzdHIpOworCisJcGdfbG9nX2luZm8oImNyZWF0aW5nIHB1YmxpY2F0aW9uIFwi JXNcIiBvbiBkYXRhYmFzZSBcIiVzXCIiLCBkYmluZm8tPnB1Ym5hbWUsIGRiaW5mby0+ZGJu YW1lKTsKKworCWFwcGVuZFBRRXhwQnVmZmVyKHN0ciwgIkNSRUFURSBQVUJMSUNBVElPTiAl cyBGT1IgQUxMIFRBQkxFUyIsIGRiaW5mby0+cHVibmFtZSk7CisKKwlwZ19sb2dfZGVidWco ImNvbW1hbmQgaXM6ICVzIiwgc3RyLT5kYXRhKTsKKworCWlmICghZHJ5X3J1bikKKwl7CisJ CXJlcyA9IFBRZXhlYyhjb25uLCBzdHItPmRhdGEpOworCQlpZiAoUFFyZXN1bHRTdGF0dXMo cmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQl7CisJCQlwZ19sb2dfZXJyb3IoImNvdWxk IG5vdCBjcmVhdGUgcHVibGljYXRpb24gXCIlc1wiIG9uIGRhdGFiYXNlIFwiJXNcIjogJXMi LAorCQkJCQkJIGRiaW5mby0+cHVibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBRZXJyb3JNZXNz YWdlKGNvbm4pKTsKKwkJCVBRZmluaXNoKGNvbm4pOworCQkJZXhpdCgxKTsKKwkJfQorCX0K KworCS8qIGZvciBjbGVhbnVwIHB1cnBvc2VzICovCisJZGJpbmZvLT5tYWRlX3B1YmxpY2F0 aW9uID0gdHJ1ZTsKKworCWlmICghZHJ5X3J1bikKKwkJUFFjbGVhcihyZXMpOworCisJZGVz dHJveVBRRXhwQnVmZmVyKHN0cik7Cit9CisKKy8qCisgKiBSZW1vdmUgcHVibGljYXRpb24g aWYgaXQgY291bGRuJ3QgZmluaXNoIGFsbCBzdGVwcy4KKyAqLworc3RhdGljIHZvaWQKK2Ry b3BfcHVibGljYXRpb24oUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvKQor eworCVBRRXhwQnVmZmVyIHN0ciA9IGNyZWF0ZVBRRXhwQnVmZmVyKCk7CisJUEdyZXN1bHQg ICAqcmVzOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlwZ19sb2dfaW5mbygiZHJv cHBpbmcgcHVibGljYXRpb24gXCIlc1wiIG9uIGRhdGFiYXNlIFwiJXNcIiIsIGRiaW5mby0+ cHVibmFtZSwgZGJpbmZvLT5kYm5hbWUpOworCisJYXBwZW5kUFFFeHBCdWZmZXIoc3RyLCAi RFJPUCBQVUJMSUNBVElPTiAlcyIsIGRiaW5mby0+cHVibmFtZSk7CisKKwlwZ19sb2dfZGVi dWcoImNvbW1hbmQgaXM6ICVzIiwgc3RyLT5kYXRhKTsKKworCWlmICghZHJ5X3J1bikKKwl7 CisJCXJlcyA9IFBRZXhlYyhjb25uLCBzdHItPmRhdGEpOworCQlpZiAoUFFyZXN1bHRTdGF0 dXMocmVzKSAhPSBQR1JFU19DT01NQU5EX09LKQorCQkJcGdfbG9nX2Vycm9yKCJjb3VsZCBu b3QgZHJvcCBwdWJsaWNhdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiOiAlcyIsIGRi aW5mby0+cHVibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsK KworCQlQUWNsZWFyKHJlcyk7CisJfQorCisJZGVzdHJveVBRRXhwQnVmZmVyKHN0cik7Cit9 CisKKy8qCisgKiBDcmVhdGUgYSBzdWJzY3JpcHRpb24gd2l0aCBzb21lIHByZWRlZmluZWQg b3B0aW9ucy4KKyAqCisgKiBBIHJlcGxpY2F0aW9uIHNsb3Qgd2FzIGFscmVhZHkgY3JlYXRl ZCBpbiBhIHByZXZpb3VzIHN0ZXAuIExldCdzIHVzZSBpdC4gQnkKKyAqIGRlZmF1bHQsIHRo ZSBzdWJzY3JpcHRpb24gbmFtZSBpcyB1c2VkIGFzIHJlcGxpY2F0aW9uIHNsb3QgbmFtZS4g SXQgaXMKKyAqIG5vdCByZXF1aXJlZCB0byBjb3B5IGRhdGEuIFRoZSBzdWJzY3JpcHRpb24g d2lsbCBiZSBjcmVhdGVkIGJ1dCBpdCB3aWxsIG5vdAorICogYmUgZW5hYmxlZCBub3cuIFRo YXQncyBiZWNhdXNlIHRoZSByZXBsaWNhdGlvbiBwcm9ncmVzcyBtdXN0IGJlIHNldCBhbmQg dGhlCisgKiByZXBsaWNhdGlvbiBvcmlnaW4gbmFtZSAob25lIG9mIHRoZSBmdW5jdGlvbiBh cmd1bWVudHMpIGNvbnRhaW5zIHRoZQorICogc3Vic2NyaXB0aW9uIE9JRCBpbiBpdHMgbmFt ZS4gT25jZSB0aGUgc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQsCisgKiBzZXRfcmVwbGljYXRp b25fcHJvZ3Jlc3MoKSBjYW4gb2J0YWluIHRoZSBjaG9zZW4gb3JpZ2luIG5hbWUgYW5kIHNl dCB1cCBpdHMKKyAqIGluaXRpYWwgbG9jYXRpb24uCisgKi8KK3N0YXRpYyB2b2lkCitjcmVh dGVfc3Vic2NyaXB0aW9uKFBHY29ubiAqY29ubiwgTG9naWNhbFJlcEluZm8gKmRiaW5mbykK K3sKKwlQUUV4cEJ1ZmZlciBzdHIgPSBjcmVhdGVQUUV4cEJ1ZmZlcigpOworCVBHcmVzdWx0 ICAgKnJlczsKKworCUFzc2VydChjb25uICE9IE5VTEwpOworCisJcGdfbG9nX2luZm8oImNy ZWF0aW5nIHN1YnNjcmlwdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIlc1wiIiwgZGJpbmZv LT5zdWJuYW1lLCBkYmluZm8tPmRibmFtZSk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihzdHIs CisJCQkJCSAgIkNSRUFURSBTVUJTQ1JJUFRJT04gJXMgQ09OTkVDVElPTiAnJXMnIFBVQkxJ Q0FUSU9OICVzICIKKwkJCQkJICAiV0lUSCAoY3JlYXRlX3Nsb3QgPSBmYWxzZSwgY29weV9k YXRhID0gZmFsc2UsIGVuYWJsZWQgPSBmYWxzZSkiLAorCQkJCQkgIGRiaW5mby0+c3VibmFt ZSwgZGJpbmZvLT5wdWJjb25uaW5mbywgZGJpbmZvLT5wdWJuYW1lKTsKKworCXBnX2xvZ19k ZWJ1ZygiY29tbWFuZCBpczogJXMiLCBzdHItPmRhdGEpOworCisJaWYgKCFkcnlfcnVuKQor CXsKKwkJcmVzID0gUFFleGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJCWlmIChQUXJlc3VsdFN0 YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spCisJCXsKKwkJCXBnX2xvZ19lcnJvcigi Y291bGQgbm90IGNyZWF0ZSBzdWJzY3JpcHRpb24gXCIlc1wiIG9uIGRhdGFiYXNlIFwiJXNc IjogJXMiLAorCQkJCQkJIGRiaW5mby0+c3VibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBRZXJy b3JNZXNzYWdlKGNvbm4pKTsKKwkJCVBRZmluaXNoKGNvbm4pOworCQkJZXhpdCgxKTsKKwkJ fQorCX0KKworCS8qIGZvciBjbGVhbnVwIHB1cnBvc2VzICovCisJZGJpbmZvLT5tYWRlX3N1 YnNjcmlwdGlvbiA9IHRydWU7CisKKwlpZiAoIWRyeV9ydW4pCisJCVBRY2xlYXIocmVzKTsK KworCWRlc3Ryb3lQUUV4cEJ1ZmZlcihzdHIpOworfQorCisvKgorICogUmVtb3ZlIHN1YnNj cmlwdGlvbiBpZiBpdCBjb3VsZG4ndCBmaW5pc2ggYWxsIHN0ZXBzLgorICovCitzdGF0aWMg dm9pZAorZHJvcF9zdWJzY3JpcHRpb24oUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAq ZGJpbmZvKQoreworCVBRRXhwQnVmZmVyIHN0ciA9IGNyZWF0ZVBRRXhwQnVmZmVyKCk7CisJ UEdyZXN1bHQgICAqcmVzOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlwZ19sb2df aW5mbygiZHJvcHBpbmcgc3Vic2NyaXB0aW9uIFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVzXCIi LCBkYmluZm8tPnN1Ym5hbWUsIGRiaW5mby0+ZGJuYW1lKTsKKworCWFwcGVuZFBRRXhwQnVm ZmVyKHN0ciwgIkRST1AgU1VCU0NSSVBUSU9OICVzIiwgZGJpbmZvLT5zdWJuYW1lKTsKKwor CXBnX2xvZ19kZWJ1ZygiY29tbWFuZCBpczogJXMiLCBzdHItPmRhdGEpOworCisJaWYgKCFk cnlfcnVuKQorCXsKKwkJcmVzID0gUFFleGVjKGNvbm4sIHN0ci0+ZGF0YSk7CisJCWlmIChQ UXJlc3VsdFN0YXR1cyhyZXMpICE9IFBHUkVTX0NPTU1BTkRfT0spCisJCQlwZ19sb2dfZXJy b3IoImNvdWxkIG5vdCBkcm9wIHN1YnNjcmlwdGlvbiBcIiVzXCIgb24gZGF0YWJhc2UgXCIl c1wiOiAlcyIsIGRiaW5mby0+c3VibmFtZSwgZGJpbmZvLT5kYm5hbWUsIFBRZXJyb3JNZXNz YWdlKGNvbm4pKTsKKworCQlQUWNsZWFyKHJlcyk7CisJfQorCisJZGVzdHJveVBRRXhwQnVm ZmVyKHN0cik7Cit9CisKKy8qCisgKiBTZXRzIHRoZSByZXBsaWNhdGlvbiBwcm9ncmVzcyB0 byB0aGUgY29uc2lzdGVudCBMU04uCisgKgorICogVGhlIHN1YnNjcmliZXIgY2F1Z2h0IHVw IHRvIHRoZSBjb25zaXN0ZW50IExTTiBwcm92aWRlZCBieSB0aGUgdGVtcG9yYXJ5CisgKiBy ZXBsaWNhdGlvbiBzbG90LiBUaGUgZ29hbCBpcyB0byBzZXQgdXAgdGhlIGluaXRpYWwgbG9j YXRpb24gZm9yIHRoZSBsb2dpY2FsCisgKiByZXBsaWNhdGlvbiB0aGF0IGlzIHRoZSBleGFj dCBMU04gdGhhdCB0aGUgc3Vic2NyaWJlciB3YXMgcHJvbW90ZWQuIE9uY2UgdGhlCisgKiBz dWJzY3JpcHRpb24gaXMgZW5hYmxlZCBpdCB3aWxsIHN0YXJ0IHN0cmVhbWluZyBmcm9tIHRo YXQgbG9jYXRpb24gb253YXJkcy4KKyAqIEluIGRyeSBydW4gbW9kZSwgdGhlIHN1YnNjcmlw dGlvbiBPSUQgYW5kIExTTiBhcmUgc2V0IHRvIGludmFsaWQgdmFsdWVzIGZvcgorICogcHJp bnRpbmcgcHVycG9zZXMuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRfcmVwbGljYXRpb25fcHJv Z3Jlc3MoUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAqZGJpbmZvLCBjb25zdCBjaGFy ICpsc24pCit7CisJUFFFeHBCdWZmZXIgc3RyID0gY3JlYXRlUFFFeHBCdWZmZXIoKTsKKwlQ R3Jlc3VsdCAgICpyZXM7CisJT2lkCQkJc3Vib2lkOworCWNoYXIJCW9yaWdpbm5hbWVbTkFN RURBVEFMRU5dOworCWNoYXIJCWxzbnN0clsxNyArIDFdOyAvKiBNQVhQR19MU05MRU4gPSAx NyAqLworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlhcHBlbmRQUUV4cEJ1ZmZlcihz dHIsCisJCQkJCSAgIlNFTEVDVCBvaWQgRlJPTSBwZ19jYXRhbG9nLnBnX3N1YnNjcmlwdGlv biBXSEVSRSBzdWJuYW1lID0gJyVzJyIsIGRiaW5mby0+c3VibmFtZSk7CisKKwlyZXMgPSBQ UWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsKKwlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQ R1JFU19UVVBMRVNfT0spCisJeworCQlwZ19sb2dfZXJyb3IoImNvdWxkIG5vdCBvYnRhaW4g c3Vic2NyaXB0aW9uIE9JRDogJXMiLAorCQkJCQkgUFFyZXN1bHRFcnJvck1lc3NhZ2UocmVz KSk7CisJCVBRY2xlYXIocmVzKTsKKwkJUFFmaW5pc2goY29ubik7CisJCWV4aXQoMSk7CisJ fQorCisJaWYgKFBRbnR1cGxlcyhyZXMpICE9IDEgJiYgIWRyeV9ydW4pCisJeworCQlwZ19s b2dfZXJyb3IoImNvdWxkIG5vdCBvYnRhaW4gc3Vic2NyaXB0aW9uIE9JRDogZ290ICVkIHJv d3MsIGV4cGVjdGVkICVkIHJvd3MiLAorCQkJCQkgUFFudHVwbGVzKHJlcyksIDEpOworCQlQ UWNsZWFyKHJlcyk7CisJCVBRZmluaXNoKGNvbm4pOworCQlleGl0KDEpOworCX0KKworCWlm IChkcnlfcnVuKQorCXsKKwkJc3Vib2lkID0gSW52YWxpZE9pZDsKKwkJc25wcmludGYobHNu c3RyLCBzaXplb2YobHNuc3RyKSwgIiVYLyVYIiwgTFNOX0ZPUk1BVF9BUkdTKChYTG9nUmVj UHRyKSBJbnZhbGlkWExvZ1JlY1B0cikpOworCX0KKwllbHNlCisJeworCQlzdWJvaWQgPSBz dHJ0b3VsKFBRZ2V0dmFsdWUocmVzLCAwLCAwKSwgTlVMTCwgMTApOworCQlzbnByaW50Zihs c25zdHIsIHNpemVvZihsc25zdHIpLCAiJXMiLCBsc24pOworCX0KKworCS8qCisJICogVGhl IG9yaWdpbiBuYW1lIGlzIGRlZmluZWQgYXMgcGdfJXUuICV1IGlzIHRoZSBzdWJzY3JpcHRp b24gT0lELiBTZWUKKwkgKiBBcHBseVdvcmtlck1haW4oKS4KKwkgKi8KKwlzbnByaW50Zihv cmlnaW5uYW1lLCBzaXplb2Yob3JpZ2lubmFtZSksICJwZ18ldSIsIHN1Ym9pZCk7CisKKwlQ UWNsZWFyKHJlcyk7CisKKwlwZ19sb2dfaW5mbygic2V0dGluZyB0aGUgcmVwbGljYXRpb24g cHJvZ3Jlc3MgKG5vZGUgbmFtZSBcIiVzXCIgOyBMU04gJXMpIG9uIGRhdGFiYXNlIFwiJXNc IiIsCisJCQkJb3JpZ2lubmFtZSwgbHNuc3RyLCBkYmluZm8tPmRibmFtZSk7CisKKwlyZXNl dFBRRXhwQnVmZmVyKHN0cik7CisJYXBwZW5kUFFFeHBCdWZmZXIoc3RyLAorCQkJCQkgICJT RUxFQ1QgcGdfY2F0YWxvZy5wZ19yZXBsaWNhdGlvbl9vcmlnaW5fYWR2YW5jZSgnJXMnLCAn JXMnKSIsIG9yaWdpbm5hbWUsIGxzbnN0cik7CisKKwlwZ19sb2dfZGVidWcoImNvbW1hbmQg aXM6ICVzIiwgc3RyLT5kYXRhKTsKKworCWlmICghZHJ5X3J1bikKKwl7CisJCXJlcyA9IFBR ZXhlYyhjb25uLCBzdHItPmRhdGEpOworCQlpZiAoUFFyZXN1bHRTdGF0dXMocmVzKSAhPSBQ R1JFU19UVVBMRVNfT0spCisJCXsKKwkJCXBnX2xvZ19lcnJvcigiY291bGQgbm90IHNldCBy ZXBsaWNhdGlvbiBwcm9ncmVzcyBmb3IgdGhlIHN1YnNjcmlwdGlvbiBcIiVzXCI6ICVzIiwK KwkJCQkJCSBkYmluZm8tPnN1Ym5hbWUsIFBRcmVzdWx0RXJyb3JNZXNzYWdlKHJlcykpOwor CQkJUFFmaW5pc2goY29ubik7CisJCQlleGl0KDEpOworCQl9CisKKwkJUFFjbGVhcihyZXMp OworCX0KKworCWRlc3Ryb3lQUUV4cEJ1ZmZlcihzdHIpOworfQorCisvKgorICogRW5hYmxl cyB0aGUgc3Vic2NyaXB0aW9uLgorICoKKyAqIFRoZSBzdWJzY3JpcHRpb24gd2FzIGNyZWF0 ZWQgaW4gYSBwcmV2aW91cyBzdGVwIGJ1dCBpdCB3YXMgZGlzYWJsZWQuIEFmdGVyCisgKiBh ZGp1c3RpbmcgdGhlIGluaXRpYWwgbG9jYXRpb24sIGVuYWJsaW5nIHRoZSBzdWJzY3JpcHRp b24gaXMgdGhlIGxhc3Qgc3RlcAorICogb2YgdGhpcyBzZXR1cC4KKyAqLworc3RhdGljIHZv aWQKK2VuYWJsZV9zdWJzY3JpcHRpb24oUEdjb25uICpjb25uLCBMb2dpY2FsUmVwSW5mbyAq ZGJpbmZvKQoreworCVBRRXhwQnVmZmVyIHN0ciA9IGNyZWF0ZVBRRXhwQnVmZmVyKCk7CisJ UEdyZXN1bHQgICAqcmVzOworCisJQXNzZXJ0KGNvbm4gIT0gTlVMTCk7CisKKwlwZ19sb2df aW5mbygiZW5hYmxpbmcgc3Vic2NyaXB0aW9uIFwiJXNcIiBvbiBkYXRhYmFzZSBcIiVzXCIi LCBkYmluZm8tPnN1Ym5hbWUsIGRiaW5mby0+ZGJuYW1lKTsKKworCWFwcGVuZFBRRXhwQnVm ZmVyKHN0ciwgIkFMVEVSIFNVQlNDUklQVElPTiAlcyBFTkFCTEUiLCBkYmluZm8tPnN1Ym5h bWUpOworCisJcGdfbG9nX2RlYnVnKCJjb21tYW5kIGlzOiAlcyIsIHN0ci0+ZGF0YSk7CisK KwlpZiAoIWRyeV9ydW4pCisJeworCQlyZXMgPSBQUWV4ZWMoY29ubiwgc3RyLT5kYXRhKTsK KwkJaWYgKFBRcmVzdWx0U3RhdHVzKHJlcykgIT0gUEdSRVNfQ09NTUFORF9PSykKKwkJewor CQkJcGdfbG9nX2Vycm9yKCJjb3VsZCBub3QgZW5hYmxlIHN1YnNjcmlwdGlvbiBcIiVzXCI6 ICVzIiwgZGJpbmZvLT5zdWJuYW1lLAorCQkJCQkJIFBRZXJyb3JNZXNzYWdlKGNvbm4pKTsK KwkJCVBRZmluaXNoKGNvbm4pOworCQkJZXhpdCgxKTsKKwkJfQorCisJCVBRY2xlYXIocmVz KTsKKwl9CisKKwlkZXN0cm95UFFFeHBCdWZmZXIoc3RyKTsKK30KKworaW50CittYWluKGlu dCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgc3RydWN0IG9wdGlvbiBsb25nX29w dGlvbnNbXSA9CisJeworCQl7ImhlbHAiLCBub19hcmd1bWVudCwgTlVMTCwgJz8nfSwKKwkJ eyJ2ZXJzaW9uIiwgbm9fYXJndW1lbnQsIE5VTEwsICdWJ30sCisJCXsicGdkYXRhIiwgcmVx dWlyZWRfYXJndW1lbnQsIE5VTEwsICdEJ30sCisJCXsicHVibGlzaGVyLWNvbm5pbmZvIiwg cmVxdWlyZWRfYXJndW1lbnQsIE5VTEwsICdQJ30sCisJCXsic3Vic2NyaWJlci1jb25uaW5m byIsIHJlcXVpcmVkX2FyZ3VtZW50LCBOVUxMLCAnUyd9LAorCQl7ImRhdGFiYXNlIiwgcmVx dWlyZWRfYXJndW1lbnQsIE5VTEwsICdkJ30sCisJCXsiZHJ5LXJ1biIsIG5vX2FyZ3VtZW50 LCBOVUxMLCAnbid9LAorCQl7InZlcmJvc2UiLCBub19hcmd1bWVudCwgTlVMTCwgJ3YnfSwK KwkJe05VTEwsIDAsIE5VTEwsIDB9CisJfTsKKworCWludAkJCWM7CisJaW50CQkJb3B0aW9u X2luZGV4OworCWludAkJCXJjOworCisJY2hhcgkgICAqcGdfY3RsX2NtZDsKKworCWNoYXIJ ICAgKnB1Yl9iYXNlX2Nvbm5pbmZvID0gTlVMTDsKKwljaGFyCSAgICpzdWJfYmFzZV9jb25u aW5mbyA9IE5VTEw7CisJY2hhcgkgICAqZGJuYW1lX2Nvbm5pbmZvID0gTlVMTDsKKworCXVp bnQ2NAkJcHViX3N5c2lkOworCXVpbnQ2NAkJc3ViX3N5c2lkOworCXN0cnVjdCBzdGF0IHN0 YXRidWY7CisKKwlQR2Nvbm4JICAgKmNvbm47CisJY2hhcgkgICAqY29uc2lzdGVudF9sc247 CisKKwlQUUV4cEJ1ZmZlciByZWNvdmVyeWNvbmZjb250ZW50cyA9IE5VTEw7CisKKwljaGFy CQlwaWRmaWxlW01BWFBHUEFUSF07CisKKwlpbnQJCQlpOworCisJcGdfbG9nZ2luZ19pbml0 KGFyZ3ZbMF0pOworCXBnX2xvZ2dpbmdfc2V0X2xldmVsKFBHX0xPR19XQVJOSU5HKTsKKwlw cm9nbmFtZSA9IGdldF9wcm9nbmFtZShhcmd2WzBdKTsKKwlzZXRfcGdsb2NhbGVfcGdzZXJ2 aWNlKGFyZ3ZbMF0sIFBHX1RFWFRET01BSU4oInBnX3N1YnNjcmliZXIiKSk7CisKKwlpZiAo YXJnYyA+IDEpCisJeworCQlpZiAoc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSA9PSAwIHx8 IHN0cmNtcChhcmd2WzFdLCAiLT8iKSA9PSAwKQorCQl7CisJCQl1c2FnZSgpOworCQkJZXhp dCgwKTsKKwkJfQorCQllbHNlIGlmIChzdHJjbXAoYXJndlsxXSwgIi1WIikgPT0gMAorCQkJ CSB8fCBzdHJjbXAoYXJndlsxXSwgIi0tdmVyc2lvbiIpID09IDApCisJCXsKKwkJCXB1dHMo InBnX3N1YnNjcmliZXIgKFBvc3RncmVTUUwpICIgUEdfVkVSU0lPTik7CisJCQlleGl0KDAp OworCQl9CisJfQorCisJYXRleGl0KGNsZWFudXBfb2JqZWN0c19hdGV4aXQpOworCisJLyoK KwkgKiBEb24ndCBhbGxvdyBpdCB0byBiZSBydW4gYXMgcm9vdC4gSXQgdXNlcyBwZ19jdGwg d2hpY2ggZG9lcyBub3QgYWxsb3cKKwkgKiBpdCBlaXRoZXIuCisJICovCisjaWZuZGVmIFdJ TjMyCisJaWYgKGdldGV1aWQoKSA9PSAwKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJjYW5ub3Qg YmUgZXhlY3V0ZWQgYnkgXCJyb290XCIiKTsKKwkJcGdfbG9nX2Vycm9yX2hpbnQoIllvdSBt dXN0IHJ1biAlcyBhcyB0aGUgUG9zdGdyZVNRTCBzdXBlcnVzZXIuIiwKKwkJCQkJCSAgcHJv Z25hbWUpOworCQlleGl0KDEpOworCX0KKyNlbmRpZgorCisJd2hpbGUgKChjID0gZ2V0b3B0 X2xvbmcoYXJnYywgYXJndiwgIkQ6UDpTOmQ6dDp2IiwKKwkJCQkJCQlsb25nX29wdGlvbnMs ICZvcHRpb25faW5kZXgpKSAhPSAtMSkKKwl7CisJCXN3aXRjaCAoYykKKwkJeworCQkJY2Fz ZSAnRCc6CisJCQkJc3Vic2NyaWJlcl9kaXIgPSBwZ19zdHJkdXAob3B0YXJnKTsKKwkJCQli cmVhazsKKwkJCWNhc2UgJ1AnOgorCQkJCXB1Yl9jb25uaW5mb19zdHIgPSBwZ19zdHJkdXAo b3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgorCQkJCXN1Yl9jb25uaW5mb19z dHIgPSBwZ19zdHJkdXAob3B0YXJnKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2QnOgorCQkJ CXNpbXBsZV9zdHJpbmdfbGlzdF9hcHBlbmQoJmRhdGFiYXNlX25hbWVzLCBvcHRhcmcpOwor CQkJCW51bV9kYnMrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nOgorCQkJCWRyeV9ydW4g PSB0cnVlOworCQkJCWJyZWFrOworCQkJY2FzZSAndic6CisJCQkJcGdfbG9nZ2luZ19pbmNy ZWFzZV92ZXJib3NpdHkoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogZ2V0 b3B0X2xvbmcgYWxyZWFkeSBlbWl0dGVkIGEgY29tcGxhaW50ICovCisJCQkJcGdfbG9nX2Vy cm9yX2hpbnQoIlRyeSBcIiVzIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsIHBy b2duYW1lKTsKKwkJCQlleGl0KDEpOworCQl9CisJfQorCisJLyoKKwkgKiBBbnkgbm9uLW9w dGlvbiBhcmd1bWVudHM/CisJICovCisJaWYgKG9wdGluZCA8IGFyZ2MpCisJeworCQlwZ19s b2dfZXJyb3IoInRvbyBtYW55IGNvbW1hbmQtbGluZSBhcmd1bWVudHMgKGZpcnN0IGlzIFwi JXNcIikiLAorCQkJCQkgYXJndltvcHRpbmRdKTsKKwkJcGdfbG9nX2Vycm9yX2hpbnQoIlRy eSBcIiVzIC0taGVscFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsIHByb2duYW1lKTsKKwkJ ZXhpdCgxKTsKKwl9CisKKwkvKgorCSAqIFJlcXVpcmVkIGFyZ3VtZW50cworCSAqLworCWlm IChzdWJzY3JpYmVyX2RpciA9PSBOVUxMKQorCXsKKwkJcGdfbG9nX2Vycm9yKCJubyBzdWJz Y3JpYmVyIGRhdGEgZGlyZWN0b3J5IHNwZWNpZmllZCIpOworCQlwZ19sb2dfZXJyb3JfaGlu dCgiVHJ5IFwiJXMgLS1oZWxwXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiwgcHJvZ25hbWUp OworCQlleGl0KDEpOworCX0KKworCS8qCisJICogUGFyc2UgY29ubmVjdGlvbiBzdHJpbmcu IEJ1aWxkIGEgYmFzZSBjb25uZWN0aW9uIHN0cmluZyB0aGF0IG1pZ2h0IGJlCisJICogcmV1 c2VkIGJ5IG11bHRpcGxlIGRhdGFiYXNlcy4KKwkgKi8KKwlpZiAocHViX2Nvbm5pbmZvX3N0 ciA9PSBOVUxMKQorCXsKKwkJLyoKKwkJICogVE9ETyB1c2UgcHJpbWFyeV9jb25uaW5mbyAo aWYgYXZhaWxhYmxlKSBmcm9tIHN1YnNjcmliZXIgYW5kCisJCSAqIGV4dHJhY3QgcHVibGlz aGVyIGNvbm5lY3Rpb24gc3RyaW5nLiBBc3N1bWUgdGhhdCB0aGVyZSBhcmUKKwkJICogaWRl bnRpY2FsIGVudHJpZXMgZm9yIHBoeXNpY2FsIGFuZCBsb2dpY2FsIHJlcGxpY2F0aW9uLiBJ ZiB0aGVyZSBpcworCQkgKiBub3QsIHdlIHdvdWxkIGZhaWwgYW55d2F5LgorCQkgKi8KKwkJ cGdfbG9nX2Vycm9yKCJubyBwdWJsaXNoZXIgY29ubmVjdGlvbiBzdHJpbmcgc3BlY2lmaWVk Iik7CisJCXBnX2xvZ19lcnJvcl9oaW50KCJUcnkgXCIlcyAtLWhlbHBcIiBmb3IgbW9yZSBp bmZvcm1hdGlvbi4iLCBwcm9nbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCXB1Yl9iYXNlX2Nv bm5pbmZvID0gZ2V0X2Jhc2VfY29ubmluZm8ocHViX2Nvbm5pbmZvX3N0ciwgZGJuYW1lX2Nv bm5pbmZvLAorCQkJCQkJCQkJCSAgInB1Ymxpc2hlciIpOworCWlmIChwdWJfYmFzZV9jb25u aW5mbyA9PSBOVUxMKQorCQlleGl0KDEpOworCisJaWYgKHN1Yl9jb25uaW5mb19zdHIgPT0g TlVMTCkKKwl7CisJCXBnX2xvZ19lcnJvcigibm8gc3Vic2NyaWJlciBjb25uZWN0aW9uIHN0 cmluZyBzcGVjaWZpZWQiKTsKKwkJcGdfbG9nX2Vycm9yX2hpbnQoIlRyeSBcIiVzIC0taGVs cFwiIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsIHByb2duYW1lKTsKKwkJZXhpdCgxKTsKKwl9 CisJc3ViX2Jhc2VfY29ubmluZm8gPSBnZXRfYmFzZV9jb25uaW5mbyhzdWJfY29ubmluZm9f c3RyLCBOVUxMLCAic3Vic2NyaWJlciIpOworCWlmIChzdWJfYmFzZV9jb25uaW5mbyA9PSBO VUxMKQorCQlleGl0KDEpOworCisJaWYgKGRhdGFiYXNlX25hbWVzLmhlYWQgPT0gTlVMTCkK Kwl7CisJCXBnX2xvZ19pbmZvKCJubyBkYXRhYmFzZSB3YXMgc3BlY2lmaWVkIik7CisKKwkJ LyoKKwkJICogSWYgLS1kYXRhYmFzZSBvcHRpb24gaXMgbm90IHByb3ZpZGVkLCB0cnkgdG8g b2J0YWluIHRoZSBkYm5hbWUgZnJvbQorCQkgKiB0aGUgcHVibGlzaGVyIGNvbm5pbmZvLiBJ ZiBkYm5hbWUgcGFyYW1ldGVyIGlzIG5vdCBhdmFpbGFibGUsIGVycm9yCisJCSAqIG91dC4K KwkJICovCisJCWlmIChkYm5hbWVfY29ubmluZm8pCisJCXsKKwkJCXNpbXBsZV9zdHJpbmdf bGlzdF9hcHBlbmQoJmRhdGFiYXNlX25hbWVzLCBkYm5hbWVfY29ubmluZm8pOworCQkJbnVt X2RicysrOworCisJCQlwZ19sb2dfaW5mbygiZGF0YWJhc2UgXCIlc1wiIHdhcyBleHRyYWN0 ZWQgZnJvbSB0aGUgcHVibGlzaGVyIGNvbm5lY3Rpb24gc3RyaW5nIiwKKwkJCQkJCWRibmFt ZV9jb25uaW5mbyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlwZ19sb2dfZXJyb3IoIm5vIGRh dGFiYXNlIG5hbWUgc3BlY2lmaWVkIik7CisJCQlwZ19sb2dfZXJyb3JfaGludCgiVHJ5IFwi JXMgLS1oZWxwXCIgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiwgcHJvZ25hbWUpOworCQkJZXhp dCgxKTsKKwkJfQorCX0KKworCS8qCisJICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHBn X2N0bCBhbmQgcGdfcmVzZXR3YWwgb24gdGhlIHN1YnNjcmliZXIuCisJICovCisJaWYgKCFn ZXRfZXhlY19wYXRoKGFyZ3ZbMF0pKQorCQlleGl0KDEpOworCisJLyogcnVkaW1lbnRhcnkg Y2hlY2sgZm9yIGEgZGF0YSBkaXJlY3RvcnkuICovCisJaWYgKCFjaGVja19kYXRhX2RpcmVj dG9yeShzdWJzY3JpYmVyX2RpcikpCisJCWV4aXQoMSk7CisKKwkvKiBTdG9yZSBkYXRhYmFz ZSBpbmZvcm1hdGlvbiBmb3IgcHVibGlzaGVyIGFuZCBzdWJzY3JpYmVyLiAqLworCWRiaW5m byA9IHN0b3JlX3B1Yl9zdWJfaW5mbyhwdWJfYmFzZV9jb25uaW5mbywgc3ViX2Jhc2VfY29u bmluZm8pOworCisJLyoKKwkgKiBDaGVjayBpZiB0aGUgc3Vic2NyaWJlciBkYXRhIGRpcmVj dG9yeSBoYXMgdGhlIHNhbWUgc3lzdGVtIGlkZW50aWZpZXIKKwkgKiB0aGFuIHRoZSBwdWJs aXNoZXIgZGF0YSBkaXJlY3RvcnkuCisJICovCisJcHViX3N5c2lkID0gZ2V0X3N5c2lkX2Zy b21fY29ubihkYmluZm9bMF0ucHViY29ubmluZm8pOworCXN1Yl9zeXNpZCA9IGdldF9jb250 cm9sX2Zyb21fZGF0YWRpcihzdWJzY3JpYmVyX2Rpcik7CisJaWYgKHB1Yl9zeXNpZCAhPSBz dWJfc3lzaWQpCisJeworCQlwZ19sb2dfZXJyb3IoInN1YnNjcmliZXIgZGF0YSBkaXJlY3Rv cnkgaXMgbm90IGEgY29weSBvZiB0aGUgc291cmNlIGRhdGFiYXNlIGNsdXN0ZXIiKTsKKwkJ ZXhpdCgxKTsKKwl9CisKKwkvKiBzdWJzY3JpYmVyIFBJRCBmaWxlLiAqLworCXNucHJpbnRm KHBpZGZpbGUsIE1BWFBHUEFUSCwgIiVzL3Bvc3RtYXN0ZXIucGlkIiwgc3Vic2NyaWJlcl9k aXIpOworCisJLyoKKwkgKiBTdG9wIHRoZSBzdWJzY3JpYmVyIGlmIGl0IGlzIGEgc3RhbmRi eSBzZXJ2ZXIuIEJlZm9yZSBleGVjdXRpbmcgdGhlCisJICogdHJhbnNmb3JtYXRpb24gc3Rl cHMsIG1ha2Ugc3VyZSB0aGUgc3Vic2NyaWJlciBpcyBub3QgcnVubmluZyBiZWNhdXNlCisJ ICogb25lIG9mIHRoZSBzdGVwcyBpcyB0byBtb2RpZnkgc29tZSByZWNvdmVyeSBwYXJhbWV0 ZXJzIHRoYXQgcmVxdWlyZSBhCisJICogcmVzdGFydC4KKwkgKi8KKwlpZiAoc3RhdChwaWRm aWxlLCAmc3RhdGJ1ZikgPT0gMCkKKwl7CisJCXBnX2xvZ19pbmZvKCJzdWJzY3JpYmVyIGlz IHVwIGFuZCBydW5uaW5nIik7CisJCXBnX2xvZ19pbmZvKCJzdG9wcGluZyB0aGUgc2VydmVy IHRvIHN0YXJ0IHRoZSB0cmFuc2Zvcm1hdGlvbiBzdGVwcyIpOworCisJCXBnX2N0bF9jbWQg PSBwc3ByaW50ZigiXCIlc1wiIHN0b3AgLUQgXCIlc1wiIC1zIiwgcGdfY3RsX3BhdGgsIHN1 YnNjcmliZXJfZGlyKTsKKwkJcmMgPSBzeXN0ZW0ocGdfY3RsX2NtZCk7CisJCXBnX2N0bF9z dGF0dXMocGdfY3RsX2NtZCwgcmMsIDApOworCX0KKworCS8qCisJICogQ3JlYXRlIGEgcmVw bGljYXRpb24gc2xvdCBmb3IgZWFjaCBkYXRhYmFzZSBvbiB0aGUgcHVibGlzaGVyLgorCSAq LworCWlmICghY3JlYXRlX2FsbF9sb2dpY2FsX3JlcGxpY2F0aW9uX3Nsb3RzKGRiaW5mbykp CisJCWV4aXQoMSk7CisKKwkvKgorCSAqIENyZWF0ZSBhIGxvZ2ljYWwgcmVwbGljYXRpb24g c2xvdCB0byBnZXQgYSBjb25zaXN0ZW50IExTTi4KKwkgKgorCSAqIFRoaXMgY29uc2lzdGVu dCBMU04gd2lsbCBiZSB1c2VkIGxhdGVyIHRvIGFkdmFuY2VkIHRoZSByZWNlbnRseSBjcmVh dGVkCisJICogcmVwbGljYXRpb24gc2xvdHMuIFdlIGNhbm5vdCB1c2UgdGhlIGxhc3QgY3Jl YXRlZCByZXBsaWNhdGlvbiBzbG90CisJICogYmVjYXVzZSB0aGUgY29uc2lzdGVudCBMU04g c2hvdWxkIGJlIG9idGFpbmVkICphZnRlciogdGhlIGJhc2UgYmFja3VwCisJICogZmluaXNo ZXMgKGFuZCB0aGUgYmFzZSBiYWNrdXAgc2hvdWxkIGluY2x1ZGUgdGhlIGxvZ2ljYWwgcmVw bGljYXRpb24KKwkgKiBzbG90cykuCisJICoKKwkgKiBYWFggd2Ugc2hvdWxkIHByb2JhYmx5 IHVzZSB0aGUgbGFzdCBjcmVhdGVkIHJlcGxpY2F0aW9uIHNsb3QgdG8gZ2V0IGEKKwkgKiBj b25zaXN0ZW50IExTTiBidXQgaXQgc2hvdWxkIGJlIGNoYW5nZWQgYWZ0ZXIgYWRkaW5nIHBn X2Jhc2ViYWNrdXAKKwkgKiBzdXBwb3J0LgorCSAqCisJICogQSB0ZW1wb3JhcnkgcmVwbGlj YXRpb24gc2xvdCBpcyBub3QgdXNlZCBoZXJlIHRvIGF2b2lkIGtlZXBpbmcgYQorCSAqIHJl cGxpY2F0aW9uIGNvbm5lY3Rpb24gb3BlbiAoZGVwZW5kaW5nIHdoZW4gYmFzZSBiYWNrdXAg d2FzIHRha2VuLCB0aGUKKwkgKiBjb25uZWN0aW9uIHNob3VsZCBiZSBvcGVuIGZvciBhIGZl dyBob3VycykuCisJICovCisJY29ubiA9IGNvbm5lY3RfZGF0YWJhc2UoZGJpbmZvWzBdLnB1 YmNvbm5pbmZvKTsKKwlpZiAoY29ubiA9PSBOVUxMKQorCQlleGl0KDEpOworCWNvbnNpc3Rl bnRfbHNuID0gY3JlYXRlX2xvZ2ljYWxfcmVwbGljYXRpb25fc2xvdChjb25uLCAmZGJpbmZv WzBdLAorCQkJCQkJCQkJCQkJCSB0ZW1wX3JlcGxzbG90KTsKKworCS8qCisJICogV3JpdGUg cmVjb3ZlcnkgcGFyYW1ldGVycy4KKwkgKgorCSAqIERlc3BpdGUgb2YgdGhlIHJlY292ZXJ5 IHBhcmFtZXRlcnMgd2lsbCBiZSB3cml0dGVuIHRvIHRoZSBzdWJzY3JpYmVyLAorCSAqIHVz ZSBhIHB1Ymxpc2hlciBjb25uZWN0aW9uIGZvciB0aGUgZm9sbHdpbmcgcmVjb3ZlcnkgZnVu Y3Rpb25zLiBUaGUKKwkgKiBjb25uZWN0aW9uIGlzIG9ubHkgdXNlZCB0byBjaGVjayB0aGUg Y3VycmVudCBzZXJ2ZXIgdmVyc2lvbiAocGh5c2ljYWwKKwkgKiByZXBsaWNhLCBzYW1lIHNl cnZlciB2ZXJzaW9uKS4gVGhlIHN1YnNjcmliZXIgaXMgbm90IHJ1bm5pbmcgeWV0LiBJbgor CSAqIGRyeSBydW4gbW9kZSwgdGhlIHJlY292ZXJ5IHBhcmFtZXRlcnMgKndvbid0KiBiZSB3 cml0dGVuLiBBbiBpbnZhbGlkCisJICogTFNOIGlzIHVzZWQgZm9yIHByaW50aW5nIHB1cnBv c2VzLgorCSAqLworCXJlY292ZXJ5Y29uZmNvbnRlbnRzID0gR2VuZXJhdGVSZWNvdmVyeUNv bmZpZyhjb25uLCBOVUxMKTsKKwlhcHBlbmRQUUV4cEJ1ZmZlcihyZWNvdmVyeWNvbmZjb250 ZW50cywgInJlY292ZXJ5X3RhcmdldF9pbmNsdXNpdmUgPSB0cnVlXG4iKTsKKwlhcHBlbmRQ UUV4cEJ1ZmZlcihyZWNvdmVyeWNvbmZjb250ZW50cywgInJlY292ZXJ5X3RhcmdldF9hY3Rp b24gPSBwcm9tb3RlXG4iKTsKKworCWlmIChkcnlfcnVuKQorCXsKKwkJYXBwZW5kUFFFeHBC dWZmZXIocmVjb3Zlcnljb25mY29udGVudHMsICIjIGRyeSBydW4gbW9kZSIpOworCQlhcHBl bmRQUUV4cEJ1ZmZlcihyZWNvdmVyeWNvbmZjb250ZW50cywgInJlY292ZXJ5X3RhcmdldF9s c24gPSAnJVgvJVgnXG4iLAorCQkJCQkJICBMU05fRk9STUFUX0FSR1MoKFhMb2dSZWNQdHIp IEludmFsaWRYTG9nUmVjUHRyKSk7CisJfQorCWVsc2UKKwl7CisJCWFwcGVuZFBRRXhwQnVm ZmVyKHJlY292ZXJ5Y29uZmNvbnRlbnRzLCAicmVjb3ZlcnlfdGFyZ2V0X2xzbiA9ICclcydc biIsCisJCQkJCQkgIGNvbnNpc3RlbnRfbHNuKTsKKwkJV3JpdGVSZWNvdmVyeUNvbmZpZyhj b25uLCBzdWJzY3JpYmVyX2RpciwgcmVjb3Zlcnljb25mY29udGVudHMpOworCX0KKwlkaXNj b25uZWN0X2RhdGFiYXNlKGNvbm4pOworCisJcGdfbG9nX2RlYnVnKCJyZWNvdmVyeSBwYXJh bWV0ZXJzOlxuJXMiLCByZWNvdmVyeWNvbmZjb250ZW50cy0+ZGF0YSk7CisKKwkvKgorCSAq IFN0YXJ0IHN1YnNjcmliZXIgYW5kIHdhaXQgdW50aWwgYWNjZXB0aW5nIGNvbm5lY3Rpb25z LgorCSAqLworCXBnX2xvZ19pbmZvKCJzdGFydGluZyB0aGUgc3Vic2NyaWJlciIpOworCisJ cGdfY3RsX2NtZCA9IHBzcHJpbnRmKCJcIiVzXCIgc3RhcnQgLUQgXCIlc1wiIC1zIiwgcGdf Y3RsX3BhdGgsIHN1YnNjcmliZXJfZGlyKTsKKwlyYyA9IHN5c3RlbShwZ19jdGxfY21kKTsK KwlwZ19jdGxfc3RhdHVzKHBnX2N0bF9jbWQsIHJjLCAxKTsKKworCS8qCisJICogV2FpdGlu ZyB0aGUgc3Vic2NyaWJlciB0byBiZSBwcm9tb3RlZC4KKwkgKi8KKwl3YWl0X2Zvcl9lbmRf cmVjb3ZlcnkoZGJpbmZvWzBdLnN1YmNvbm5pbmZvKTsKKworCS8qCisJICogQ3JlYXRlIGEg cHVibGljYXRpb24gZm9yIGVhY2ggZGF0YWJhc2UuIFRoaXMgc3RlcCBzaG91bGQgYmUgZXhl Y3V0ZWQKKwkgKiBhZnRlciBwcm9tb3RpbmcgdGhlIHN1YnNjcmliZXIgdG8gYXZvaWQgcmVw bGljYXRpbmcgdW5uZWNlc3NhcnkKKwkgKiBvYmplY3RzLgorCSAqLworCWZvciAoaSA9IDA7 IGkgPCBudW1fZGJzOyBpKyspCisJeworCQljaGFyCQlwdWJuYW1lW05BTUVEQVRBTEVOXTsK KworCQkvKiBDb25uZWN0IHRvIHB1Ymxpc2hlci4gKi8KKwkJY29ubiA9IGNvbm5lY3RfZGF0 YWJhc2UoZGJpbmZvW2ldLnB1YmNvbm5pbmZvKTsKKwkJaWYgKGNvbm4gPT0gTlVMTCkKKwkJ CWV4aXQoMSk7CisKKwkJLyoKKwkJICogQnVpbGQgdGhlIHB1YmxpY2F0aW9uIG5hbWUuIFRo ZSBuYW1lIG11c3Qgbm90IGV4Y2VlZCBOQU1FREFUQUxFTiAtCisJCSAqIDEuIFRoaXMgY3Vy cmVudCBzY2hlbWEgdXNlcyBhIG1heGltdW0gb2YgMzUgY2hhcmFjdGVycyAoMTQgKyAxMCAr CisJCSAqICdcMCcpLgorCQkgKi8KKwkJc25wcmludGYocHVibmFtZSwgc2l6ZW9mKHB1Ym5h bWUpLCAicGdfc3Vic2NyaWJlcl8ldSIsIGRiaW5mb1tpXS5vaWQpOworCQlkYmluZm9baV0u cHVibmFtZSA9IHBnX3N0cmR1cChwdWJuYW1lKTsKKworCQljcmVhdGVfcHVibGljYXRpb24o Y29ubiwgJmRiaW5mb1tpXSk7CisKKwkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uKTsKKwl9 CisKKwkvKgorCSAqIENyZWF0ZSBhIHN1YnNjcmlwdGlvbiBmb3IgZWFjaCBkYXRhYmFzZS4K KwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RiczsgaSsrKQorCXsKKwkJLyogQ29ubmVj dCB0byBzdWJzY3JpYmVyLiAqLworCQljb25uID0gY29ubmVjdF9kYXRhYmFzZShkYmluZm9b aV0uc3ViY29ubmluZm8pOworCQlpZiAoY29ubiA9PSBOVUxMKQorCQkJZXhpdCgxKTsKKwor CQljcmVhdGVfc3Vic2NyaXB0aW9uKGNvbm4sICZkYmluZm9baV0pOworCisJCS8qIFNldCB0 aGUgcmVwbGljYXRpb24gcHJvZ3Jlc3MgdG8gdGhlIGNvcnJlY3QgTFNOLiAqLworCQlzZXRf cmVwbGljYXRpb25fcHJvZ3Jlc3MoY29ubiwgJmRiaW5mb1tpXSwgY29uc2lzdGVudF9sc24p OworCisJCS8qIEVuYWJsZSBzdWJzY3JpcHRpb24uICovCisJCWVuYWJsZV9zdWJzY3JpcHRp b24oY29ubiwgJmRiaW5mb1tpXSk7CisKKwkJZGlzY29ubmVjdF9kYXRhYmFzZShjb25uKTsK Kwl9CisKKwkvKgorCSAqIFRoZSB0cmFuc2llbnQgcmVwbGljYXRpb24gc2xvdCBpcyBubyBs b25nZXIgcmVxdWlyZWQuIERyb3AgaXQuCisJICoKKwkgKiBYWFggd2UgbWlnaHQgbm90IGZh aWwgaGVyZS4gSW5zdGVhZCwgd2UgcHJvdmlkZSBhIHdhcm5pbmcgc28gdGhlIHVzZXIKKwkg KiBldmVudHVhbGx5IGRyb3BzIHRoZSByZXBsaWNhdGlvbiBzbG90IGxhdGVyLgorCSAqLwor CWNvbm4gPSBjb25uZWN0X2RhdGFiYXNlKGRiaW5mb1swXS5wdWJjb25uaW5mbyk7CisJaWYg KGNvbm4gPT0gTlVMTCkKKwl7CisJCXBnX2xvZ193YXJuaW5nKCJjb3VsZCBub3QgZHJvcCB0 cmFuc2llbnQgcmVwbGljYXRpb24gc2xvdCBcIiVzXCIgb24gcHVibGlzaGVyIiwgdGVtcF9y ZXBsc2xvdCk7CisJCXBnX2xvZ193YXJuaW5nX2hpbnQoIkRyb3AgdGhpcyByZXBsaWNhdGlv biBzbG90IHNvb24gdG8gYXZvaWQgcmV0ZW50aW9uIG9mIFdBTCBmaWxlcy4iKTsKKwl9CisJ ZWxzZQorCXsKKwkJZHJvcF9yZXBsaWNhdGlvbl9zbG90KGNvbm4sICZkYmluZm9bMF0sIHRl bXBfcmVwbHNsb3QpOworCQlkaXNjb25uZWN0X2RhdGFiYXNlKGNvbm4pOworCX0KKworCS8q CisJICogU3RvcCB0aGUgc3Vic2NyaWJlci4KKwkgKi8KKwlwZ19sb2dfaW5mbygic3RvcHBp bmcgdGhlIHN1YnNjcmliZXIiKTsKKworCXBnX2N0bF9jbWQgPSBwc3ByaW50ZigiXCIlc1wi IHN0b3AgLUQgXCIlc1wiIC1zIiwgcGdfY3RsX3BhdGgsIHN1YnNjcmliZXJfZGlyKTsKKwly YyA9IHN5c3RlbShwZ19jdGxfY21kKTsKKwlwZ19jdGxfc3RhdHVzKHBnX2N0bF9jbWQsIHJj LCAwKTsKKworCS8qCisJICogQ2hhbmdlIHN5c3RlbSBpZGVudGlmaWVyLgorCSAqLworCW1v ZGlmeV9zeXNpZChwZ19yZXNldHdhbF9wYXRoLCBzdWJzY3JpYmVyX2Rpcik7CisKKwlzdWNj ZXNzID0gdHJ1ZTsKKworCXBnX2xvZ19pbmZvKCJEb25lISIpOworCisJcmV0dXJuIDA7Cit9 CmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wNDBfcGdfc3Vic2NyaWJl ci5wbCBiL3NyYy9iaW4vcGdfYmFzZWJhY2t1cC90LzA0MF9wZ19zdWJzY3JpYmVyLnBsCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAuLjlkMjA4NDdkYzIKLS0tIC9k ZXYvbnVsbAorKysgYi9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8wNDBfcGdfc3Vic2NyaWJl ci5wbApAQCAtMCwwICsxLDQ0IEBACisjIENvcHlyaWdodCAoYykgMjAyMywgUG9zdGdyZVNR TCBHbG9iYWwgRGV2ZWxvcG1lbnQgR3JvdXAKKworIworIyBUZXN0IGNoZWNraW5nIG9wdGlv bnMgb2YgcGdfc3Vic2NyaWJlci4KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsK K3VzZSBQb3N0Z3JlU1FMOjpUZXN0OjpVdGlsczsKK3VzZSBUZXN0OjpNb3JlOworCitwcm9n cmFtX2hlbHBfb2soJ3BnX3N1YnNjcmliZXInKTsKK3Byb2dyYW1fdmVyc2lvbl9vaygncGdf c3Vic2NyaWJlcicpOworcHJvZ3JhbV9vcHRpb25zX2hhbmRsaW5nX29rKCdwZ19zdWJzY3Jp YmVyJyk7CisKK215ICRkYXRhZGlyID0gUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM6OnRlbXBk aXI7CisKK2NvbW1hbmRfZmFpbHMoWydwZ19zdWJzY3JpYmVyJ10sCisJJ25vIHN1YnNjcmli ZXIgZGF0YSBkaXJlY3Rvcnkgc3BlY2lmaWVkJyk7Citjb21tYW5kX2ZhaWxzKAorCVsKKwkJ J3BnX3N1YnNjcmliZXInLAorCQknLS1wZ2RhdGEnLCAkZGF0YWRpcgorCV0sCisJJ25vIHB1 Ymxpc2hlciBjb25uZWN0aW9uIHN0cmluZyBzcGVjaWZpZWQnKTsKK2NvbW1hbmRfZmFpbHMo CisJWworCQkncGdfc3Vic2NyaWJlcicsCisJCSctLWRyeS1ydW4nLAorCQknLS1wZ2RhdGEn LCAkZGF0YWRpciwKKwkJJy0tcHVibGlzaGVyLWNvbm5pbmZvJywgJ2RibmFtZT1wb3N0Z3Jl cycKKwldLAorCSdubyBzdWJzY3JpYmVyIGNvbm5lY3Rpb24gc3RyaW5nIHNwZWNpZmllZCcp OworY29tbWFuZF9mYWlscygKKwlbCisJCSdwZ19zdWJzY3JpYmVyJywKKwkJJy0tdmVyYm9z ZScsCisJCSctLXBnZGF0YScsICRkYXRhZGlyLAorCQknLS1wdWJsaXNoZXItY29ubmluZm8n LCAnZGJuYW1lPXBvc3RncmVzJywKKwkJJy0tc3Vic2NyaWJlci1jb25uaW5mbycsICdkYm5h bWU9cG9zdGdyZXMnCisJXSwKKwknbm8gZGF0YWJhc2UgbmFtZSBzcGVjaWZpZWQnKTsKKwor ZG9uZV90ZXN0aW5nKCk7CmRpZmYgLS1naXQgYS9zcmMvYmluL3BnX2Jhc2ViYWNrdXAvdC8w NDFfcGdfc3Vic2NyaWJlcl9zdGFuZGJ5LnBsIGIvc3JjL2Jpbi9wZ19iYXNlYmFja3VwL3Qv MDQxX3BnX3N1YnNjcmliZXJfc3RhbmRieS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwLi5jZTI1NjA4YzY4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2Jpbi9w Z19iYXNlYmFja3VwL3QvMDQxX3BnX3N1YnNjcmliZXJfc3RhbmRieS5wbApAQCAtMCwwICsx LDEzOSBAQAorIyBDb3B5cmlnaHQgKGMpIDIwMjMsIFBvc3RncmVTUUwgR2xvYmFsIERldmVs b3BtZW50IEdyb3VwCisKKyMKKyMgVGVzdCB1c2luZyBhIHN0YW5kYnkgc2VydmVyIGFzIHRo ZSBzdWJzY3JpYmVyLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOwordXNlIFBvc3Rn cmVTUUw6OlRlc3Q6OkNsdXN0ZXI7Cit1c2UgUG9zdGdyZVNRTDo6VGVzdDo6VXRpbHM7Cit1 c2UgVGVzdDo6TW9yZTsKKworbXkgJG5vZGVfcDsKK215ICRub2RlX2Y7CitteSAkbm9kZV9z OworbXkgJHJlc3VsdDsKKworIyBTZXQgdXAgbm9kZSBQIGFzIHByaW1hcnkKKyRub2RlX3Ag PSBQb3N0Z3JlU1FMOjpUZXN0OjpDbHVzdGVyLT5uZXcoJ25vZGVfcCcpOworJG5vZGVfcC0+ aW5pdChhbGxvd3Nfc3RyZWFtaW5nID0+ICdsb2dpY2FsJyk7Ciskbm9kZV9wLT5zdGFydDsK KworIyBTZXQgdXAgbm9kZSBGIGFzIGFib3V0LXRvLWZhaWwgbm9kZQorIyBUaGUgZXh0cmEg b3B0aW9uIGZvcmNlcyBpdCB0byBpbml0aWFsaXplIGEgbmV3IGNsdXN0ZXIgaW5zdGVhZCBv ZiBjb3B5aW5nIGEKKyMgcHJldmlvdXNseSBpbml0ZGIncyBjbHVzdGVyLgorJG5vZGVfZiA9 IFBvc3RncmVTUUw6OlRlc3Q6OkNsdXN0ZXItPm5ldygnbm9kZV9mJyk7Ciskbm9kZV9mLT5p bml0KGFsbG93c19zdHJlYW1pbmcgPT4gJ2xvZ2ljYWwnLCBleHRyYSA9PiBbICctLW5vLWlu c3RydWN0aW9ucycgXSk7Ciskbm9kZV9mLT5zdGFydDsKKworIyBPbiBub2RlIFAKKyMgLSBj cmVhdGUgZGF0YWJhc2VzCisjIC0gY3JlYXRlIHRlc3QgdGFibGVzCisjIC0gaW5zZXJ0IGEg cm93Ciskbm9kZV9wLT5zYWZlX3BzcWwoCisJJ3Bvc3RncmVzJywgcSgKKwlDUkVBVEUgREFU QUJBU0UgcGcxOworCUNSRUFURSBEQVRBQkFTRSBwZzI7CispKTsKKyRub2RlX3AtPnNhZmVf cHNxbCgncGcxJywgJ0NSRUFURSBUQUJMRSB0YmwxIChhIHRleHQpJyk7Ciskbm9kZV9wLT5z YWZlX3BzcWwoJ3BnMScsICJJTlNFUlQgSU5UTyB0YmwxIFZBTFVFUygnZmlyc3Qgcm93Jyki KTsKKyRub2RlX3AtPnNhZmVfcHNxbCgncGcyJywgJ0NSRUFURSBUQUJMRSB0YmwyIChhIHRl eHQpJyk7CisKKyMgU2V0IHVwIG5vZGUgUyBhcyBzdGFuZGJ5IGxpbmtpbmcgdG8gbm9kZSBQ Ciskbm9kZV9wLT5iYWNrdXAoJ2JhY2t1cF8xJyk7Ciskbm9kZV9zID0gUG9zdGdyZVNRTDo6 VGVzdDo6Q2x1c3Rlci0+bmV3KCdub2RlX3MnKTsKKyRub2RlX3MtPmluaXRfZnJvbV9iYWNr dXAoJG5vZGVfcCwgJ2JhY2t1cF8xJywgaGFzX3N0cmVhbWluZyA9PiAxKTsKKyRub2RlX3Mt PmFwcGVuZF9jb25mKCdwb3N0Z3Jlc3FsLmNvbmYnLCAnbG9nX21pbl9tZXNzYWdlcyA9IGRl YnVnMicpOworJG5vZGVfcy0+c2V0X3N0YW5kYnlfbW9kZSgpOworJG5vZGVfcy0+c3RhcnQ7 CisKKyMgSW5zZXJ0IGFub3RoZXIgcm93IG9uIG5vZGUgUCBhbmQgd2FpdCBub2RlIFMgdG8g Y2F0Y2ggdXAKKyRub2RlX3AtPnNhZmVfcHNxbCgncGcxJywgIklOU0VSVCBJTlRPIHRibDEg VkFMVUVTKCdzZWNvbmQgcm93JykiKTsKKyRub2RlX3AtPndhaXRfZm9yX3JlcGxheV9jYXRj aHVwKCRub2RlX3MpOworCisjIFJ1biBwZ19zdWJzY3JpYmVyIG9uIGFib3V0LXRvLWZhaWwg bm9kZSBGCitjb21tYW5kX2ZhaWxzKAorCVsKKwkJJ3BnX3N1YnNjcmliZXInLCAnLS12ZXJi b3NlJywKKwkJJy0tcGdkYXRhJywgJG5vZGVfZi0+ZGF0YV9kaXIsCisJCSctLXB1Ymxpc2hl ci1jb25uaW5mbycsICRub2RlX3AtPmNvbm5zdHIoJ3BnMScpLAorCQknLS1zdWJzY3JpYmVy LWNvbm5pbmZvJywgJG5vZGVfZi0+Y29ubnN0cigncGcxJyksCisJCSctLWRhdGFiYXNlJywg J3BnMScsCisJCSctLWRhdGFiYXNlJywgJ3BnMicKKwldLAorCSdzdWJzY3JpYmVyIGRhdGEg ZGlyZWN0b3J5IGlzIG5vdCBhIGNvcHkgb2YgdGhlIHNvdXJjZSBkYXRhYmFzZSBjbHVzdGVy Jyk7CisKKyMgZHJ5IHJ1biBtb2RlIG9uIG5vZGUgUworY29tbWFuZF9vaygKKwlbCisJCSdw Z19zdWJzY3JpYmVyJywgJy0tdmVyYm9zZScsICctLWRyeS1ydW4nLAorCQknLS1wZ2RhdGEn LCAkbm9kZV9zLT5kYXRhX2RpciwKKwkJJy0tcHVibGlzaGVyLWNvbm5pbmZvJywgJG5vZGVf cC0+Y29ubnN0cigncGcxJyksCisJCSctLXN1YnNjcmliZXItY29ubmluZm8nLCAkbm9kZV9z LT5jb25uc3RyKCdwZzEnKSwKKwkJJy0tZGF0YWJhc2UnLCAncGcxJywKKwkJJy0tZGF0YWJh c2UnLCAncGcyJworCV0sCisJJ3J1biBwZ19zdWJzY3JpYmVyIC0tZHJ5LXJ1biBvbiBub2Rl IFMnKTsKKworIyBQSUQgc2V0cyB0byB1bmRlZmluZWQgYmVjYXVzZSBzdWJzY3JpYmVyIHdh cyBzdG9wcGVkIGJlaGluZCB0aGUgc2NlbmVzLgorIyBTdGFydCBzdWJzY3JpYmVyCiskbm9k ZV9zLT57X3BpZH0gPSB1bmRlZjsKKyRub2RlX3MtPnN0YXJ0OworIyBDaGVjayBpZiBub2Rl IFMgaXMgc3RpbGwgYSBzdGFuZGJ5Citpcygkbm9kZV9zLT5zYWZlX3BzcWwoJ3Bvc3RncmVz JywgJ1NFTEVDVCBwZ19pc19pbl9yZWNvdmVyeSgpJyksCisJJ3QnLCAnc3RhbmRieSBpcyBp biByZWNvdmVyeScpOworCisjIFJ1biBwZ19zdWJzY3JpYmVyIG9uIG5vZGUgUworY29tbWFu ZF9vaygKKwlbCisJCSdwZ19zdWJzY3JpYmVyJywgJy0tdmVyYm9zZScsCisJCSctLXBnZGF0 YScsICRub2RlX3MtPmRhdGFfZGlyLAorCQknLS1wdWJsaXNoZXItY29ubmluZm8nLCAkbm9k ZV9wLT5jb25uc3RyKCdwZzEnKSwKKwkJJy0tc3Vic2NyaWJlci1jb25uaW5mbycsICRub2Rl X3MtPmNvbm5zdHIoJ3BnMScpLAorCQknLS1kYXRhYmFzZScsICdwZzEnLAorCQknLS1kYXRh YmFzZScsICdwZzInCisJXSwKKwkncnVuIHBnX3N1YnNjcmliZXIgb24gbm9kZSBTJyk7CisK KyMgSW5zZXJ0IHJvd3Mgb24gUAorJG5vZGVfcC0+c2FmZV9wc3FsKCdwZzEnLCAiSU5TRVJU IElOVE8gdGJsMSBWQUxVRVMoJ3RoaXJkIHJvdycpIik7Ciskbm9kZV9wLT5zYWZlX3BzcWwo J3BnMicsICJJTlNFUlQgSU5UTyB0YmwyIFZBTFVFUygncm93IDEnKSIpOworCisjIFBJRCBz ZXRzIHRvIHVuZGVmaW5lZCBiZWNhdXNlIHN1YnNjcmliZXIgd2FzIHN0b3BwZWQgYmVoaW5k IHRoZSBzY2VuZXMuCisjIFN0YXJ0IHN1YnNjcmliZXIKKyRub2RlX3MtPntfcGlkfSA9IHVu ZGVmOworJG5vZGVfcy0+c3RhcnQ7CisKKyMgR2V0IHN1YnNjcmlwdGlvbiBuYW1lcworJHJl c3VsdCA9ICRub2RlX3MtPnNhZmVfcHNxbCgKKwkncG9zdGdyZXMnLCBxcSgKKwlTRUxFQ1Qg c3VibmFtZSBGUk9NIHBnX3N1YnNjcmlwdGlvbiBXSEVSRSBzdWJuYW1lIH4gJ15wZ19zdWJz Y3JpYmVyXycKKykpOworbXkgQHN1Ym5hbWVzID0gc3BsaXQoIlxuIiwgJHJlc3VsdCk7CisK KyMgV2FpdCBzdWJzY3JpYmVyIHRvIGNhdGNoIHVwCiskbm9kZV9zLT53YWl0X2Zvcl9zdWJz Y3JpcHRpb25fc3luYygkbm9kZV9wLCAkc3VibmFtZXNbMF0pOworJG5vZGVfcy0+d2FpdF9m b3Jfc3Vic2NyaXB0aW9uX3N5bmMoJG5vZGVfcCwgJHN1Ym5hbWVzWzFdKTsKKworIyBDaGVj ayByZXN1bHQgb24gZGF0YWJhc2UgcGcxCiskcmVzdWx0ID0gJG5vZGVfcy0+c2FmZV9wc3Fs KCdwZzEnLCAnU0VMRUNUICogRlJPTSB0YmwxJyk7CitpcyggJHJlc3VsdCwgcXEoZmlyc3Qg cm93CitzZWNvbmQgcm93Cit0aGlyZCByb3cpLAorCSdsb2dpY2FsIHJlcGxpY2F0aW9uIHdv cmtzIG9uIGRhdGFiYXNlIHBnMScpOworCisjIENoZWNrIHJlc3VsdCBvbiBkYXRhYmFzZSBw ZzIKKyRyZXN1bHQgPSAkbm9kZV9zLT5zYWZlX3BzcWwoJ3BnMicsICdTRUxFQ1QgKiBGUk9N IHRibDInKTsKK2lzKCAkcmVzdWx0LCBxcShyb3cgMSksCisJJ2xvZ2ljYWwgcmVwbGljYXRp b24gd29ya3Mgb24gZGF0YWJhc2UgcGcyJyk7CisKKyMgRGlmZmVyZW50IHN5c3RlbSBpZGVu dGlmaWVyPworbXkgJHN5c2lkX3AgPSAkbm9kZV9wLT5zYWZlX3BzcWwoJ3Bvc3RncmVzJywg J1NFTEVDVCBzeXN0ZW1faWRlbnRpZmllciBGUk9NIHBnX2NvbnRyb2xfc3lzdGVtKCknKTsK K215ICRzeXNpZF9zID0gJG5vZGVfcy0+c2FmZV9wc3FsKCdwb3N0Z3JlcycsICdTRUxFQ1Qg c3lzdGVtX2lkZW50aWZpZXIgRlJPTSBwZ19jb250cm9sX3N5c3RlbSgpJyk7Citvaygkc3lz aWRfcCAhPSAkc3lzaWRfcywgJ3N5c3RlbSBpZGVudGlmaWVyIHdhcyBjaGFuZ2VkJyk7CisK KyMgY2xlYW4gdXAKKyRub2RlX3AtPnRlYXJkb3duX25vZGU7Ciskbm9kZV9zLT50ZWFyZG93 bl9ub2RlOworCitkb25lX3Rlc3RpbmcoKTsKZGlmZiAtLWdpdCBhL3NyYy90b29scy9tc3Zj L01rdmNidWlsZC5wbSBiL3NyYy90b29scy9tc3ZjL01rdmNidWlsZC5wbQppbmRleCA0NmRm MDFjYzhkLi42OGFmOTIzYTI5IDEwMDY0NAotLS0gYS9zcmMvdG9vbHMvbXN2Yy9Na3ZjYnVp bGQucG0KKysrIGIvc3JjL3Rvb2xzL21zdmMvTWt2Y2J1aWxkLnBtCkBAIC01NSw3ICs1NSw3 IEBAIG15IEBjb250cmliX2V4Y2x1ZGVzID0gKAogIyBTZXQgb2YgdmFyaWFibGVzIGZvciBm cm9udGVuZCBtb2R1bGVzCiBteSAkZnJvbnRlbmRfZGVmaW5lcyA9IHsgJ3BnYmVuY2gnID0+ ICdGRF9TRVRTSVpFPTEwMjQnIH07CiBteSBAZnJvbnRlbmRfdXNlbGlicHEgPQotICAoJ3Bn X2FtY2hlY2snLCAncGdfY3RsJywgJ3BnX3VwZ3JhZGUnLCAncGdiZW5jaCcsICdwc3FsJywg J2luaXRkYicpOworICAoJ3BnX2FtY2hlY2snLCAncGdfY3RsJywgJ3BnX3VwZ3JhZGUnLCAn cGdiZW5jaCcsICdwc3FsJywgJ2luaXRkYicsICdwZ19zdWJzY3JpYmVyJyk7CiBteSBAZnJv bnRlbmRfdXNlbGlicGdwb3J0ID0gKAogCSdwZ19hbWNoZWNrJywgJ3BnX2FyY2hpdmVjbGVh bnVwJywKIAkncGdfdGVzdF9mc3luYycsICdwZ190ZXN0X3RpbWluZycsCi0tIAoyLjMwLjIK Cg== --f7e5406a42f348e09bd227f4dc389312--