From mboxrd@z Thu Jan  1 00:00:00 1970
Received: from pigeon.gentoo.org ([69.77.167.62] helo=lists.gentoo.org)
	by finch.gentoo.org with esmtp (Exim 4.60)
	(envelope-from <gentoo-soc+bounces-305-garchives=archives.gentoo.org@lists.gentoo.org>)
	id 1KW0Yd-0004qf-Pi
	for garchives@archives.gentoo.org; Thu, 21 Aug 2008 03:09:58 +0000
Received: from pigeon.gentoo.org (localhost [127.0.0.1])
	by pigeon.gentoo.org (Postfix) with SMTP id 58708E0311;
	Thu, 21 Aug 2008 03:09:55 +0000 (UTC)
Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183])
	by pigeon.gentoo.org (Postfix) with ESMTP id B7F53E0311
	for <gentoo-soc@lists.gentoo.org>; Thu, 21 Aug 2008 03:09:54 +0000 (UTC)
Received: from localhost (localhost [127.0.0.1])
	by smtp.gentoo.org (Postfix) with ESMTP id EB54865095
	for <gentoo-soc@lists.gentoo.org>; Thu, 21 Aug 2008 03:09:53 +0000 (UTC)
X-Virus-Scanned: amavisd-new at gentoo.org
X-Spam-Score: -1.529
X-Spam-Level: 
X-Spam-Status: No, score=-1.529 required=5.5 tests=[AWL=1.070,
	BAYES_00=-2.599]
Received: from smtp.gentoo.org ([127.0.0.1])
	by localhost (smtp.gentoo.org [127.0.0.1]) (amavisd-new, port 10024)
	with ESMTP id ap86e2IgsGIn for <gentoo-soc@lists.gentoo.org>;
	Thu, 21 Aug 2008 03:09:46 +0000 (UTC)
Received: from an-out-0708.google.com (an-out-0708.google.com [209.85.132.241])
	by smtp.gentoo.org (Postfix) with ESMTP id 7A21F66506
	for <gentoo-soc@gentoo.org>; Thu, 21 Aug 2008 03:09:46 +0000 (UTC)
Received: by an-out-0708.google.com with SMTP id c3so138748ana.43
        for <gentoo-soc@gentoo.org>; Wed, 20 Aug 2008 20:09:45 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=gamma;
        h=domainkey-signature:received:received:message-id:date:from:sender
         :to:subject:cc:mime-version:content-type:x-google-sender-auth;
        bh=H4ZxrvH9o4rC1dIZz4J5mLm5JrE4lBAD3zoGqOUjQhE=;
        b=Vng5newmTK1Kc73pmwYfZVN4DMRoNCDTVfpU2KCN7JafigEGAUNX2L/0n3CE/I9ZWm
         5mJL2o2R2dwC1s6JIBJ1CwHuHV0cezkqyAjn9769DVZmppddijpv+u2q246uhbY35YNY
         zQNPnzPIxaUGsE66USA8qL2+F4K+FZ5rkPGQw=
DomainKey-Signature: a=rsa-sha1; c=nofws;
        d=gmail.com; s=gamma;
        h=message-id:date:from:sender:to:subject:cc:mime-version:content-type
         :x-google-sender-auth;
        b=LNuZ+1gMOUFTEAUnHiv275b8UFunDc6IsAMs5dkNfhazOOH6k77kO3BgPH0wKrZXVJ
         dxhRVJYYb/qEsEfSma3WzOuGJNx5NGVLHWNQ/4g/2u3PAJQJFpkqkKMZfPCecq7h/v7D
         bCAqIKl2Jj9hbBSN4uVACXaitmwj87j30lD84=
Received: by 10.100.247.14 with SMTP id u14mr1193165anh.89.1219288185503;
        Wed, 20 Aug 2008 20:09:45 -0700 (PDT)
Received: by 10.100.93.4 with HTTP; Wed, 20 Aug 2008 20:09:45 -0700 (PDT)
Message-ID: <c4cdc1420808202009g121e10f9m5e79f741ab8d3918@mail.gmail.com>
Date: Wed, 20 Aug 2008 22:09:45 -0500
From: "Lucian Poston" <lucianposton@gmail.com>
Sender: lucian.poston@gmail.com
To: gentoo-soc@lists.gentoo.org
Subject: [gentoo-soc] Progress Report - Revdep-rebuild
Cc: "Marius Mauch" <google-soc@genone.de>
Precedence: bulk
List-Post: <mailto:gentoo-soc@lists.gentoo.org>
List-Help: <mailto:gentoo-soc+help@lists.gentoo.org>
List-Unsubscribe: <mailto:gentoo-soc+unsubscribe@lists.gentoo.org>
List-Subscribe: <mailto:gentoo-soc+subscribe@lists.gentoo.org>
List-Id: Gentoo Linux mail <gentoo-soc.gentoo.org>
X-BeenThere: gentoo-soc@lists.gentoo.org
Reply-to: gentoo-soc@lists.gentoo.org
MIME-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_54009_27571114.1219288185481"
X-Google-Sender-Auth: a9ba5947eb75e545
X-Archives-Salt: 42567ce1-5b8a-4321-b340-e0631af01d70
X-Archives-Hash: 0c8488708530cc97b807e8b0225dea7c

------=_Part_54009_27571114.1219288185481
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Last week's work was interesting.  As mentioned in the last report, I
significantly modified LinkageMap to utilize path's inodes rather
os.path.realpath for path comparisons -- basically, reducing the
amount of filesystem access.  It turned out to improve its efficiency,
which in turn improved the efficiency of MisingLibraryConsumerSet as
it relies on LinkageMap.listBrokenBinaries.

I previously mentioned there would be problems in cases where
LinkageMap is rebuilt when files have been removed but the /var/db/pkg
database has not been updated accordingly.  I got around this by
falling back on os.path.realpath for missing files (or more generally,
when os.stat fails).

For future endeavors, I will explore adding a new entry into
/var/db/pkg to catalog libtool libraries (similar in nature to
NEEDED.ELF.2).  Currently, the contents of all packages are searched
in order to find libtool libraries, so having them available in the
vdb_path will speed things up.

Here are the known problems:

1) I've noticed that on my older systems, I had to re-emerge several
packages, which appeared broken due older/incomplete NEEDED.ELF.2
entries.  They appeared to be missing entries for various files.  I
suppose this is due to modifications to the scripts that generate
these files as those systems had been using older versions of portage.
 Everything worked fine after updating these files.

2) In certain situations, packages may be ordered such that a second
emerge is necessary.  This is due to dependency neglection in portage.
[1]  The flag --complete-graph can be used to properly order packages
in these situations.

3) In the last report [2], I mentioned the functionality to emerge the
set of packages containing consumers of libraries matched by a regular
expression.  The libraries returned by LinkageMap.listLibraryObjects()
are matched against that regular expression.  Consequently, only files
cataloged in LinkageMap will be considered.  Since symlinks aren't
entered into NEEDED.ELF.2 files, LinkageMap doesn't catalog them.  So
if /usr/lib were a symlink to /usr/lib64 and the regular expression
were /usr/lib/libfoo*, nothing would be matched (libfoo would work
however).  This can be fixed by adding symlink entries into
LinkageMap, searching CONTENTS files for symlinks, or utilizing the
find utility.  I'll decide to search CONTENTS files to resolve this.

4) As masks are used to filter out specially evaluated binaries, there
is always the potential for false positives until the correct masks
are added.

Attached are three patches[3] for portage-2.2_rc8 for the files:
/usr/lib/portage/pym/portage/dbapi/vartree.py
/usr/lib/portage/pym/portage/sets/libs.py
/usr/share/portage/config/sets.conf

Lucian


[1] http://dev.gentoo.org/~zmedico/portage/doc/portage.html#dependency-resolution-package-modeling-dependency-neglection
[2] http://archives.gentoo.org/gentoo-soc/msg_b8a874ceac9b58c1badf86f3eaff4803.xml
[3] http://repo.or.cz/w/revdep-rebuild-reimplementation.git?a=shortlog;h=refs/heads/rc3

------=_Part_54009_27571114.1219288185481
Content-Type: application/octet-stream; name=libs.py.2.2_rc8.patch
Content-Transfer-Encoding: base64
X-Attachment-Id: f_fk4q1mlz0
Content-Disposition: attachment; filename=libs.py.2.2_rc8.patch

LS0tIGxpYnMucHkuMi4yX3JjOAkyMDA4LTA4LTE0IDE1OjQ1OjMwLjAwMDAwMDAwMCAtMDUwMAor
KysgcHltL3BvcnRhZ2Uvc2V0cy9saWJzLnB5CTIwMDgtMDgtMTggMDQ6MjU6MzIuMDAwMDAwMDAw
IC0wNTAwCkBAIC0yLDEwICsyLDE4IEBACiAjIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdjIKICMgJElkOiBsaWJzLnB5IDEwNzU5
IDIwMDgtMDYtMjIgMDQ6MDQ6NTBaIHptZWRpY28gJAogCitpbXBvcnQgb3MKK2ltcG9ydCByZQor
aW1wb3J0IHRpbWUKK2Zyb20gcG9ydGFnZS5kYmFwaS52YXJ0cmVlIGltcG9ydCBkYmxpbmsKK2Zy
b20gcG9ydGFnZS52ZXJzaW9ucyBpbXBvcnQgY2F0c3BsaXQKIGZyb20gcG9ydGFnZS5zZXRzLmJh
c2UgaW1wb3J0IFBhY2thZ2VTZXQKIGZyb20gcG9ydGFnZS5zZXRzIGltcG9ydCBnZXRfYm9vbGVh
bgogZnJvbSBwb3J0YWdlLnZlcnNpb25zIGltcG9ydCBjYXRwa2dzcGxpdAogCitfX2FsbF9fID0g
WyJMaWJyYXJ5Q29uc3VtZXJTZXQiLCAiUHJlc2VydmVkTGlicmFyeUNvbnN1bWVyU2V0IiwKKwkJ
Ik1pc3NpbmdMaWJyYXJ5Q29uc3VtZXJTZXQiXQorCiBjbGFzcyBMaWJyYXJ5Q29uc3VtZXJTZXQo
UGFja2FnZVNldCk6CiAJX29wZXJhdGlvbnMgPSBbIm1lcmdlIiwgInVubWVyZ2UiXQogCkBAIC00
NSwzICs1MywzMjQgQEAKIAkJZGVidWcgPSBnZXRfYm9vbGVhbihvcHRpb25zLCAiZGVidWciLCBG
YWxzZSkKIAkJcmV0dXJuIFByZXNlcnZlZExpYnJhcnlDb25zdW1lclNldCh0cmVlc1sidmFydHJl
ZSJdLmRiYXBpLCBkZWJ1ZykKIAlzaW5nbGVCdWlsZGVyID0gY2xhc3NtZXRob2Qoc2luZ2xlQnVp
bGRlcikKKworCitjbGFzcyBNaXNzaW5nTGlicmFyeUNvbnN1bWVyU2V0KExpYnJhcnlDb25zdW1l
clNldCk6CisKKwkiIiIKKwlUaGlzIGNsYXNzIGlzIHRoZSBzZXQgb2YgcGFja2FnZXMgdG8gZW1l
cmdlIGR1ZSB0byBtaXNzaW5nIGxpYnJhcmllcy4KKworCVRoaXMgY2xhc3Mgc2NhbnMgYmluYXJp
ZXMgZm9yIG1pc3NpbmcgYW5kIGJyb2tlbiBzaGFyZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMKKwlh
bmQgZml4ZXMgdGhlbSBieSBlbWVyZ2luZyB0aGUgcGFja2FnZXMgY29udGFpbmluZyB0aGUgYnJv
a2VuIGJpbmFyaWVzLgorCisJVGhlIHVzZXIgbWF5IGFsc28gZW1lcmdlIHBhY2thZ2VzIGNvbnRh
aW5pbmcgY29uc3VtZXJzIG9mIHNwZWNpZmllZAorCWxpYnJhcmllcyBieSBwYXNzaW5nIHRoZSBu
YW1lIG9yIGEgcHl0aG9uIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aHJvdWdoIHRoZQorCWVudmlyb25t
ZW50IHZhcmlhYmxlLCBMSUJSQVJZLiAgRHVlIHRvIGEgbGltaXRhdGlvbiBpbiBwYXNzaW5nIGZs
YWdzIHRvCisJcGFja2FnZSBzZXRzIHRocm91Z2ggdGhlIHBvcnRhZ2UgY2xpLCB0aGUgdXNlciBt
dXN0IHNldCBlbnZpcm9ubWVudAorCXZhcmlhYmxlcyB0byBtb2RpZnkgdGhlIGJlaGF2aW91ciBv
ZiB0aGlzIHBhY2thZ2Ugc2V0LiAgU28gaWYgdGhlCisJZW52aXJvbm1lbnQgdmFyaWFibGUgTElC
UkFSWSBpcyBzZXQsIHRoZSBiZWhhdmlvdXIgb2YgdGhpcyBzZXQgY2hhbmdlcy4KKworCSIiIgor
CisJZGVzY3JpcHRpb24gPSAiVGhlIHNldCBvZiBwYWNrYWdlcyB0byBlbWVyZ2UgZHVlIHRvIG1p
c3NpbmcgbGlicmFyaWVzLiIKKwlfb3BlcmF0aW9ucyA9IFsibWVyZ2UiXQorCisJZGVmIF9faW5p
dF9fKHNlbGYsIHZhcmRiYXBpLCBkZWJ1Zz1GYWxzZSk6CisJCXN1cGVyKE1pc3NpbmdMaWJyYXJ5
Q29uc3VtZXJTZXQsIHNlbGYpLl9faW5pdF9fKHZhcmRiYXBpLCBkZWJ1ZykKKwkJIyBGSVhNRSBT
aW5jZSB3ZSBjYW4ndCBnZXQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmcm9tIHRoZSB1c2VyLCB0
aGUKKwkJIyBzb25hbWUgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIGFuIGVudmlyb25tZW50IHZhcmlh
YmxlIGZvciBub3cuCisJCXNlbGYubGlicmFyeVJlZ2V4cCA9IG9zLmdldGVudigiTElCUkFSWSIp
CisJCXNlbGYucm9vdCA9IHNlbGYuZGJhcGkucm9vdAorCQlzZWxmLmxpbmttYXAgPSBzZWxmLmRi
YXBpLmxpbmttYXAKKworCWRlZiBsb2FkKHNlbGYpOgorCQkjIGJyb2tlbkRlcGVuZGVuY2llczog
b2JqZWN0IC0+IHNldC1vZi11bnNhdGlzZmllZC1kZXBlbmRlbmNpZXMsIHdoZXJlCisJCSMgb2Jq
ZWN0IGlzIGFuIGluc3RhbGxlZCBiaW5hcnkvbGlicmFyeSBhbmQKKwkJIyBzZXQtb2YtdW5zYXRp
c2ZpZWQtZGVwZW5kZW5jaWVzIGFyZSBzb25hbWVzIG9yIGxpYnJhcmllcyByZXF1aXJlZCBieQor
CQkjIHRoZSBvYmplY3QgYnV0IGhhdmUgbm8gY29ycmVzcG9uZGluZyBsaWJyYXJpZXMgdG8gZnVs
ZmlsbCB0aGUKKwkJIyBkZXBlbmRlbmN5LgorCQlicm9rZW5EZXBlbmRlbmNpZXMgPSB7fQorCQlh
dG9tcyA9IHNldCgpCisKKwkJIyBJZiB0aGUgTElCUkFSWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBp
cyBzZXQsIHRoZSByZXN1bHRpbmcgcGFja2FnZSBzZXQKKwkJIyB3aWxsIGJlIHBhY2thZ2VzIGNv
bnRhaW5pbmcgY29uc3VtZXJzIG9mIHRoZSBsaWJyYXJpZXMgbWF0Y2hlZCBieSB0aGUKKwkJIyB2
YXJpYWJsZS4KKwkJaWYgc2VsZi5saWJyYXJ5UmVnZXhwOgorCQkJYXRvbXMgPSBzZWxmLmZpbmRB
dG9tc09mTGlicmFyeUNvbnN1bWVycyhzZWxmLmxpYnJhcnlSZWdleHApCisJCQlzZWxmLl9zZXRB
dG9tcyhhdG9tcykKKwkJCWlmIHNlbGYuZGVidWc6CisJCQkJcHJpbnQKKwkJCQlwcmludCAiYXRv
bXMgdG8gYmUgZW1lcmdlZDoiCisJCQkJZm9yIHggaW4gc29ydGVkKGF0b21zKToKKwkJCQkJcHJp
bnQgeAorCQkJcmV0dXJuCisKKwkJIyBSZWJ1aWxkIExpbmthZ2VNYXAuCisJCWlmIHNlbGYuZGVi
dWc6CisJCQl0aW1lU3RhcnQgPSB0aW1lLnRpbWUoKQorCQlzZWxmLmxpbmttYXAucmVidWlsZCgp
CisJCWlmIHNlbGYuZGVidWc6CisJCQl0aW1lUmVidWlsZCA9IHRpbWUudGltZSgpIC0gdGltZVN0
YXJ0CisKKwkJIyBHZXQgdGhlIGxpc3Qgb2YgYnJva2VuIGRlcGVuZGVuY2llcyBmcm9tIExpbmth
Z2VNYXAuCisJCWlmIHNlbGYuZGVidWc6CisJCQl0aW1lU3RhcnQgPSB0aW1lLnRpbWUoKQorCQli
cm9rZW5EZXBlbmRlbmNpZXMgPSBzZWxmLmxpbmttYXAubGlzdEJyb2tlbkJpbmFyaWVzKHNlbGYu
ZGVidWcpCisJCWlmIHNlbGYuZGVidWc6CisJCQl0aW1lTGlzdEJyb2tlbkJpbmFyaWVzID0gdGlt
ZS50aW1lKCkgLSB0aW1lU3RhcnQKKworCQkjIEFkZCBicm9rZW4gbGlidG9vbCBsaWJyYXJpZXMg
aW50byB0aGUgYnJva2VuRGVwZW5kZW5jaWVzIGRpY3QuCisJCWlmIHNlbGYuZGVidWc6CisJCQl0
aW1lU3RhcnQgPSB0aW1lLnRpbWUoKQorCQlicm9rZW5EZXBlbmRlbmNpZXMudXBkYXRlKHNlbGYu
bGlzdEJyb2tlbkxpYnRvb2xMaWJyYXJpZXMoKSkKKwkJaWYgc2VsZi5kZWJ1ZzoKKwkJCXRpbWVM
aWJ0b29sID0gdGltZS50aW1lKCkgLSB0aW1lU3RhcnQKKworCQkjIEZJWE1FIFRvbyBtYW55IGF0
b21zIG1heSBiZSBlbWVyZ2VkIGJlY2F1c2UgbGlicmFyaWVzIGluIGJpbmFyeQorCQkjIHBhY2th
Z2VzIGFyZSBub3QgYmVpbmcgaGFuZGxlZCBwcm9wZXJseSBlZyBvcGVub2ZmaWNlLCBudmlkaWEt
ZHJpdmVycywKKwkJIyBzdW4tamRrLiAgQ2VydGFpbiBiaW5hcmllcyBhcmUgcnVuIGluIGFuIGVu
dmlyb25tZW50IHdoZXJlIGFkZGl0aW9uYWwKKwkJIyBsaWJyYXJ5IHBhdGhzIGFyZSBhZGRlZCB2
aWEgTERfTElCUkFSWV9QQVRILiAgU2luY2UgdGhlc2UgcGF0aHMgYXJlbid0CisJCSMgcmVnaXN0
ZXJlZCBpbiBfb2JqX3Byb3BlcnRpZXMsIHRoZXkgYXBwZWFyIGJyb2tlbiAoYW5kIGFyZSBpZiBu
b3QgcnVuCisJCSMgaW4gdGhlIGNvcnJlY3QgZW52aXJvbm1lbnQpLiAgSSBoYXZlIHRvIGRldGVy
bWluZSBpZiBsaWJyYXJpZXMgYW5kIGxpYgorCQkjIHBhdGhzIHNob3VsZCBiZSBtYXNrZWQgdXNp
bmcgL2V0Yy9yZXZkZXAtcmVidWlsZC8qIGFzIGRvbmUgaW4KKwkJIyByZXZkZXAtcmVidWlsZCBv
ciBpZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8gaWRlbnRpZnkgYW5kIGRlYWwgd2l0aAorCQkj
IHRoZXNlIHByb2JsZW1hdGljIHBhY2thZ2VzIChvciBpZiBzb21ldGhpbmcgZW50aXJlbHkgZGlm
ZmVyZW50IHNob3VsZAorCQkjIGJlIGRvbmUpLiAgRm9yIG5vdyBkaXJlY3RvcnkgYW5kIGxpYnJh
cnkgbWFza3MgYXJlIHVzZWQuCisKKwkJIyBSZW1vdmUgbWFza2VkIGRpcmVjdG9yaWVzIGFuZCBs
aWJyYXJpZXMuCisJCWlmIHNlbGYuZGVidWc6CisJCQl0aW1lU3RhcnQgPSB0aW1lLnRpbWUoKQor
CQlpZiBicm9rZW5EZXBlbmRlbmNpZXM6CisJCQlicm9rZW5EZXBlbmRlbmNpZXMgPSBzZWxmLnJl
bW92ZU1hc2tlZERlcGVuZGVuY2llcyhicm9rZW5EZXBlbmRlbmNpZXMpCisJCWlmIHNlbGYuZGVi
dWc6CisJCQl0aW1lTWFzayA9IHRpbWUudGltZSgpIC0gdGltZVN0YXJ0CisKKwkJIyBEZXRlcm1p
bmUgYXRvbXMgdG8gZW1lcmdlIGJhc2VkIG9uIGJyb2tlbiBvYmplY3RzIGluCisJCSMgYnJva2Vu
RGVwZW5kZW5jaWVzLgorCQlpZiBzZWxmLmRlYnVnOgorCQkJdGltZVN0YXJ0ID0gdGltZS50aW1l
KCkKKwkJaWYgYnJva2VuRGVwZW5kZW5jaWVzOgorCQkJYXRvbXMgPSBzZWxmLm1hcFBhdGhzVG9B
dG9tcyhzZXQoYnJva2VuRGVwZW5kZW5jaWVzLmtleXMoKSkpCisJCWlmIHNlbGYuZGVidWc6CisJ
CQl0aW1lQXRvbXMgPSB0aW1lLnRpbWUoKSAtIHRpbWVTdGFydAorCisJCSMgRGVidWcgb3V0cHV0
CisJCWlmIHNlbGYuZGVidWc6CisJCQlwcmludAorCQkJcHJpbnQgbGVuKGJyb2tlbkRlcGVuZGVu
Y2llcyksICJicm9rZW5EZXBlbmRlbmNpZXM6IgorCQkJZm9yIHggaW4gc29ydGVkKGJyb2tlbkRl
cGVuZGVuY2llcy5rZXlzKCkpOgorCQkJCXByaW50CisJCQkJcHJpbnQgeCwgIi0+IgorCQkJCXBy
aW50ICdcdCcsIGJyb2tlbkRlcGVuZGVuY2llc1t4XQorCQkJcHJpbnQKKwkJCXByaW50ICJhdG9t
cyB0byBiZSBlbWVyZ2VkOiIKKwkJCWZvciB4IGluIHNvcnRlZChhdG9tcyk6CisJCQkJcHJpbnQg
eAorCQkJcHJpbnQKKwkJCXByaW50ICJSZWJ1aWxkIHRpbWU6IiwgdGltZVJlYnVpbGQKKwkJCXBy
aW50ICJCcm9rZW4gYmluYXJpZXMgdGltZToiLCB0aW1lTGlzdEJyb2tlbkJpbmFyaWVzCisJCQlw
cmludCAiQnJva2VuIGxpYnRvb2wgdGltZToiLCB0aW1lTGlidG9vbAorCQkJcHJpbnQgIlJlbW92
ZSBtYXNrIHRpbWU6IiwgdGltZU1hc2sKKwkJCXByaW50ICJtYXBQYXRoc1RvQXRvbXMgdGltZToi
LCB0aW1lQXRvbXMKKwkJCXByaW50CisKKwkJc2VsZi5fc2V0QXRvbXMoYXRvbXMpCisKKwlkZWYg
cmVtb3ZlTWFza2VkRGVwZW5kZW5jaWVzKHNlbGYsIGRlcGVuZGVuY2llcyk6CisJCSIiIgorCQlS
ZW1vdmUgYWxsIG1hc2tlZCBkZXBlbmRlbmNpZXMgYW5kIHJldHVybiB0aGUgdXBkYXRlZCBtYXBw
aW5nLgorCisJCUBwYXJhbSBkZXBlbmRlbmNpZXM6IGRlcGVuZGVuY2llcyBmcm9tIHdoaWNoIHRv
IHJlbW92ZWQgbWFza2VkCisJCQlkZXBlbmRlbmNpZXMKKwkJQHR5cGUgZGVwZW5kZW5jaWVzOiBk
aWN0IChleGFtcGxlOiB7Jy91c3IvYmluL2Zvbyc6IHNldChbJ2xpYmZvby5zbyddKX0pCisJCUBy
dHlwZTogZGljdAorCQlAcmV0dXJuOiBzaGFsbG93IGNvcHkgb2YgZGVwZW5kZW5jaWVzIHdpdGgg
bWFza2VkIGl0ZW1zIHJlbW92ZWQKKworCQkiIiIKKwkJclZhbHVlID0gZGVwZW5kZW5jaWVzLmNv
cHkoKQorCQlkaXJNYXNrLCBsaWJNYXNrID0gc2VsZi5nZXREZXBlbmRlbmN5TWFza3MoKQorCisJ
CSMgUmVtb3ZlIGVudHJpZXMgdGhhdCBhcmUgbWFza2VkLgorCQlpZiBkaXJNYXNrIG9yIGxpYk1h
c2s6CisJCQlpZiBzZWxmLmRlYnVnOgorCQkJCXByaW50ICJUaGUgZm9sbG93aW5nIGFyZSBtYXNr
ZWQ6IgorCQkJZm9yIGJpbmFyeSwgbGliU2V0IGluIHJWYWx1ZS5pdGVtcygpOgorCQkJCWZvciBk
aXJlY3RvcnkgaW4gZGlyTWFzazoKKwkJCQkJIyBDaGVjayBpZiB0aGUgYnJva2VuIGJpbmFyeSBs
aWVzIHdpdGhpbiB0aGUgbWFza2VkIGRpcmVjdG9yeSBvcgorCQkJCQkjIGl0cyBzdWJkaXJlY3Rv
cmllcy4KKwkJCQkJIyBYWFggUGVyaGFwcyB3ZSBzaG91bGQgYWxsb3cgcmVnZXhwcyBhcyBtYXNr
cy4KKwkJCQkJaWYgYmluYXJ5LnN0YXJ0c3dpdGgoZGlyZWN0b3J5KToKKwkJCQkJCWRlbCByVmFs
dWVbYmluYXJ5XQorCQkJCQkJaWYgc2VsZi5kZWJ1ZzoKKwkJCQkJCQlwcmludCAiZGlyTWFzazoi
LGJpbmFyeQorCQkJCQkJYnJlYWsKKwkJCQkjIENoZWNrIGlmIGFsbCB0aGUgcmVxdWlyZWQgbGli
cmFyaWVzIGFyZSBtYXNrZWQuCisJCQkJaWYgYmluYXJ5IGluIHJWYWx1ZSBhbmQgbGliU2V0Lmlz
c3Vic2V0KGxpYk1hc2spOgorCQkJCQlkZWwgclZhbHVlW2JpbmFyeV0KKwkJCQkJaWYgc2VsZi5k
ZWJ1ZzoKKwkJCQkJCXByaW50ICJsaWJNYXNrOiIsIGJpbmFyeSwgbGliU2V0ICYgbGliTWFzawor
CisJCWlmIHNlbGYuZGVidWc6CisJCQlwcmludAorCQkJcHJpbnQgIkRpcmVjdG9yeSBtYXNrOiIs
IGRpck1hc2sKKwkJCXByaW50CisJCQlwcmludCAiTGlicmFyeSBtYXNrOiIsIGxpYk1hc2sKKwor
CQlyZXR1cm4gclZhbHVlCisKKwlkZWYgZ2V0RGVwZW5kZW5jeU1hc2tzKHNlbGYpOgorCQkiIiIK
KwkJUmV0dXJuIGFsbCBkZXBlbmRlbmN5IG1hc2tzIGFzIGEgdHVwbGUuCisKKwkJQHJ0eXBlOiAy
LXR1cGxlIG9mIHNldHMgb2Ygc3RyaW5ncworCQlAcmV0dXJuOiAyLXR1cGxlIGluIHdoaWNoIHRo
ZSBmaXJzdCBjb21wb25lbnQgaXMgYSBzZXQgb2YgZGlyZWN0b3J5CisJCQltYXNrcyBhbmQgdGhl
IHNlY29uZCBjb21wb25lbnQgaXMgYSBzZXQgb2YgbGlicmFyeSBtYXNrcworCisJCSIiIgorCQlk
aXJNYXNrID0gc2V0KCkKKwkJbGliTWFzayA9IHNldCgpCisJCV9kaXJNYXNrX3JlID0gcmUuY29t
cGlsZShyJ1NFQVJDSF9ESVJTX01BU0tccyo9XHMqIihbXiJdKikiJykKKwkJX2xpYk1hc2tfcmUg
PSByZS5jb21waWxlKHInTERfTElCUkFSWV9NQVNLXHMqPVxzKiIoW14iXSopIicpCisJCWxpbmVz
ID0gW10KKworCQkjIFJlYWRzIHRoZSBjb250ZW50cyBvZiAvZXRjL3JldmRlcC1yZWJ1aWxkLyoK
KwkJbGliTWFza0RpciA9IG9zLnBhdGguam9pbihzZWxmLnJvb3QsICJldGMiLCAicmV2ZGVwLXJl
YnVpbGQiKQorCQlpZiBvcy5wYXRoLmV4aXN0cyhsaWJNYXNrRGlyKToKKwkJCWZvciBmaWxlIGlu
IG9zLmxpc3RkaXIobGliTWFza0Rpcik6CisJCQkJdHJ5OgorCQkJCQlmID0gb3Blbihvcy5wYXRo
LmpvaW4obGliTWFza0RpciwgZmlsZSksICJyIikKKwkJCQkJdHJ5OgorCQkJCQkJbGluZXMuZXh0
ZW5kKGYucmVhZGxpbmVzKCkpCisJCQkJCWZpbmFsbHk6CisJCQkJCQlmLmNsb3NlKCkKKwkJCQll
eGNlcHQgSU9FcnJvcjogIyBPU0Vycm9yPworCQkJCQljb250aW51ZQorCQkJIyBUaGUgZm9sbG93
aW5nIHBhcnNlcyBTRUFSQ0hfRElSU19NQVNLIGFuZCBMRF9MSUJSQVJZX01BU0sgdmFyaWFibGVz
CisJCQkjIGZyb20gL2V0Yy9yZXZkZXAtcmVidWlsZC8qCisJCQlmb3IgbGluZSBpbiBsaW5lczoK
KwkJCQltYXRjaERpciA9IF9kaXJNYXNrX3JlLm1hdGNoKGxpbmUpCisJCQkJbWF0Y2hMaWIgPSBf
bGliTWFza19yZS5tYXRjaChsaW5lKQorCQkJCWlmIG1hdGNoRGlyOgorCQkJCQlkaXJNYXNrLnVw
ZGF0ZShzZXQobWF0Y2hEaXIuZ3JvdXAoMSkuc3BsaXQoKSkpCisJCQkJaWYgbWF0Y2hMaWI6CisJ
CQkJCWxpYk1hc2sudXBkYXRlKHNldChtYXRjaExpYi5ncm91cCgxKS5zcGxpdCgpKSkKKworCQkj
IFRoZXNlIGRpcmVjdG9yaWVzIGNvbnRhaW4gc3BlY2lhbGx5IGV2YWx1YXRlZCBsaWJyYXJpZXMu
CisJCSMgYXBwLWVtdWxhdGlvbi92bXdhcmUtd29ya3N0YXRpb24tNi4wLjEuNTUwMTcKKwkJZGly
TWFzay5hZGQoJy9vcHQvdm13YXJlL3dvcmtzdGF0aW9uL2xpYicpCisJCSMgYXBwLWVtdWxhdGlv
bi92bXdhcmUtc2VydmVyLWNvbnNvbGUtMS4wLjYuOTE4OTEKKwkJZGlyTWFzay5hZGQoJy9vcHQv
dm13YXJlL3NlcnZlci9jb25zb2xlL2xpYicpCisJCSMgd3d3LWNsaWVudC9tb3ppbGxhLWZpcmVm
b3gtMi4wLjAuMTUKKwkJZGlyTWFzay5hZGQoJy91c3IvbGliL21vemlsbGEtZmlyZWZveC9wbHVn
aW5zJykKKwkJZGlyTWFzay5hZGQoJy91c3IvbGliNjQvbW96aWxsYS1maXJlZm94L3BsdWdpbnMn
KQorCQkjIGFwcC1vZmZpY2Uvb3Blbm9mZmljZS0yLjQuMQorCQlkaXJNYXNrLmFkZCgnL29wdC9P
cGVuT2ZmaWNlJykKKwkJZGlyTWFzay5hZGQoJy91c3IvbGliL29wZW5vZmZpY2UnKQorCQkjIGRl
di1saWJzL2xpYm1peC0yLjA1ICBsaWJtaXguc28gaXMgbWlzc2luZyBzb25hbWUgZW50cnkKKwkJ
bGliTWFzay5hZGQoJ2xpYm1peC5zbycpCisJCSMgYXBwLWFjY2Vzc2liaWxpdHkvc3BlZWNoLXRv
b2xzLTEuMi45Nl9iZXRhICBtaXNzaW5nIHNvbmFtZXMKKwkJbGliTWFzay5hZGQoJ2xpYmVzdG9v
bHMuc28nKQorCQlsaWJNYXNrLmFkZCgnbGliZXN0YmFzZS5zbycpCisJCWxpYk1hc2suYWRkKCds
aWJlc3RzdHJpbmcuc28nKQorCQkjIGFwcC1lbXVsYXRpb24vZW11bC1saW51eC14ODYtc291bmRs
aWJzLTIwMDgwNDE4CisJCWRpck1hc2suYWRkKCcvdXNyL2tkZS8zLjUvbGliMzInKQorCisJCXJl
dHVybiAoZGlyTWFzaywgbGliTWFzaykKKworCWRlZiBsaXN0QnJva2VuTGlidG9vbExpYnJhcmll
cyhzZWxmKToKKwkJIiIiCisJCUZpbmQgYnJva2VuIGxpYnRvb2wgbGlicmFyaWVzIGFuZCB0aGVp
ciBtaXNzaW5nIGRlcGVuZGVuY2llcy4KKworCQlAcnR5cGU6IGRpY3QgKGV4YW1wbGU6IHsnL2xp
Yi9saWJmb28ubGEnOiBzZXQoWycvbGliL2xpYmJhci5sYSddKX0pCisJCUByZXR1cm46IFRoZSBy
ZXR1cm4gdmFsdWUgaXMgYSBsaWJyYXJ5IC0+IHNldC1vZi1saWJyYXJpZXMgbWFwcGluZywgd2hl
cmUKKwkJCWxpYnJhcnkgaXMgYSBicm9rZW4gbGlicmFyeSBhbmQgdGhlIHNldCBjb25zaXN0cyBv
ZiBkZXBlbmRlbmNpZXMKKwkJCW5lZWRlZCBieSBsaWJyYXJ5IHRoYXQgZG8gbm90IGV4aXN0IG9u
IHRoZSBmaWxlc3lzdGVtLgorCisJCSIiIgorCQlyVmFsdWUgPSB7fQorCQlsaW5lcyA9IFtdCisJ
CWRlcGVuZGVuY2llcyA9IFtdCisJCV9sYV9yZSA9IHJlLmNvbXBpbGUociIuKlwubGEkIikKKwkJ
X2RlcGVuZGVuY3lfbGlic19yZSA9IHJlLmNvbXBpbGUociJeZGVwZW5kZW5jeV9saWJzXHMqPVxz
KicoLiopJyIpCisKKwkJIyBMb29wIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGFsbCBwYWNrYWdlcy4K
KwkJZm9yIGNwdiBpbiBzZWxmLmRiYXBpLmNwdl9hbGwoKToKKwkJCW15c3BsaXQgPSBjYXRzcGxp
dChjcHYpCisJCQlsaW5rID0gZGJsaW5rKG15c3BsaXRbMF0sIG15c3BsaXRbMV0sIG15cm9vdD1z
ZWxmLmRiYXBpLnJvb3QsIFwKKwkJCQkJbXlzZXR0aW5ncz1zZWxmLmRiYXBpLnNldHRpbmdzLCB0
cmVldHlwZT0ndmFydHJlZScsIFwKKwkJCQkJdmFydHJlZT1zZWxmLmRiYXBpLnZhcnRyZWUpCisJ
CQlmb3IgZmlsZSBpbiBsaW5rLmdldGNvbnRlbnRzKCk6CisJCQkJIyBDaGVjayBpZiB0aGUgZmls
ZSBlbmRzIHdpdGggJy5sYScuCisJCQkJbWF0Y2hMaWIgPSBfbGFfcmUubWF0Y2goZmlsZSkKKwkJ
CQlpZiBtYXRjaExpYjoKKwkJCQkJIyBSZWFkIHRoZSBsaW5lcyBmcm9tIHRoZSBsaWJyYXJ5Lgor
CQkJCQlsaW5lcyA9IFtdCisJCQkJCXRyeToKKwkJCQkJCWYgPSBvcGVuKGZpbGUsICJyIikKKwkJ
CQkJCXRyeToKKwkJCQkJCQlsaW5lcy5leHRlbmQoZi5yZWFkbGluZXMoKSkKKwkJCQkJCWZpbmFs
bHk6CisJCQkJCQkJZi5jbG9zZSgpCisJCQkJCWV4Y2VwdCBJT0Vycm9yOgorCQkJCQkJY29udGlu
dWUKKwkJCQkJIyBGaW5kIHRoZSBsaW5lIGxpc3RpbmcgdGhlIGRlcGVuZGVuY2llcy4KKwkJCQkJ
Zm9yIGxpbmUgaW4gbGluZXM6CisJCQkJCQltYXRjaExpbmUgPSBfZGVwZW5kZW5jeV9saWJzX3Jl
Lm1hdGNoKGxpbmUpCisJCQkJCQlpZiBtYXRjaExpbmU6CisJCQkJCQkJZGVwZW5kZW5jaWVzID0g
bWF0Y2hMaW5lLmdyb3VwKDEpLnNwbGl0KCkKKwkJCQkJCQkjIEZvciBlYWNoIGRlcGVuZGVuY3kg
dGhhdCBpcyBhIHBhdGhuYW1lIChiZWdpbnMgd2l0aAorCQkJCQkJCSMgb3Muc2VwKSwgY2hlY2sg
dGhhdCBpdCBleGlzdHMgb24gdGhlIGZpbGVzeXN0ZW0uICBJZiBpdAorCQkJCQkJCSMgZG9lcyBu
b3QgZXhpc3QsIHRoZW4gYWRkIHRoZSBsaWJyYXJ5IGFuZCB0aGUgbWlzc2luZworCQkJCQkJCSMg
ZGVwZW5kZW5jeSB0byByVmFsdWUuCisJCQkJCQkJZm9yIGRlcGVuZGVuY3kgaW4gZGVwZW5kZW5j
aWVzOgorCQkJCQkJCQlpZiBkZXBlbmRlbmN5WzBdID09IG9zLnNlcCBhbmQgXAorCQkJCQkJCQkJ
CW5vdCBvcy5wYXRoLmlzZmlsZShkZXBlbmRlbmN5KToKKwkJCQkJCQkJCXJWYWx1ZS5zZXRkZWZh
dWx0KGZpbGUsIHNldCgpKS5hZGQoZGVwZW5kZW5jeSkKKworCQlyZXR1cm4gclZhbHVlCisKKwlk
ZWYgZmluZEF0b21zT2ZMaWJyYXJ5Q29uc3VtZXJzKHNlbGYsIHNlYXJjaFN0cmluZyk6CisJCSIi
IgorCQlSZXR1cm4gYXRvbXMgY29udGFpbmluZyBjb25zdW1lcnMgb2YgbGlicmFyaWVzIG1hdGNo
aW5nIHRoZSBhcmd1bWVudC4KKworCQlAcGFyYW0gc2VhcmNoU3RyaW5nOiBhIHN0cmluZyB1c2Vk
IHRvIHNlYXJjaCBmb3IgbGlicmFyaWVzCisJCUB0eXBlIHNlYXJjaFN0cmluZzogc3RyaW5nIHRv
IGJlIGNvbXBpbGVkIGFzIGEgcmVndWxhciBleHByZXNzaW9uCisJCQkoZXhhbXBsZTogJ2xpYmZv
by4qJykKKwkJQHJ0eXBlOiBzZXQgb2Ygc3RyaW5ncworCQlAcmV0dXJuOiB0aGUgcmV0dXJuZWQg
c2V0IG9mIGF0b21zIGFyZSB2YWxpZCB0byBiZSB1c2VkIGJ5IHBhY2thZ2Ugc2V0cworCisJCSIi
IgorCQlhdG9tcyA9IHNldCgpCisJCWNvbnN1bWVycyA9IHNldCgpCisJCW1hdGNoZWRMaWJyYXJp
ZXMgPSBzZXQoKQorCQlsaWJyYXJ5T2JqZWN0cyA9IHNlbGYubGlua21hcC5saXN0TGlicmFyeU9i
amVjdHMoKQorCQlfbGlicmFyeVNlYXJjaF9yZSA9IHJlLmNvbXBpbGUoc2VhcmNoU3RyaW5nKQor
CisJCSMgRmluZCBsaWJyYXJpZXMgbWF0Y2hpbmcgc2VhcmNoU3RyaW5nLgorCQlmb3IgbGlicmFy
eSBpbiBsaWJyYXJ5T2JqZWN0czoKKwkJCW0gPSBfbGlicmFyeVNlYXJjaF9yZS5zZWFyY2gobGli
cmFyeSkKKwkJCWlmIG06CisJCQkJbWF0Y2hlZExpYnJhcmllcy5hZGQobGlicmFyeSkKKwkJCQlj
b25zdW1lcnMudXBkYXRlKHNlbGYubGlua21hcC5maW5kQ29uc3VtZXJzKGxpYnJhcnkpKQorCisJ
CWlmIHNlbGYuZGVidWc6CisJCQlwcmludAorCQkJcHJpbnQgIkNvbnN1bWVycyBvZiB0aGUgZm9s
bG93aW5nIGxpYnJhcmllcyB3aWxsIGJlIGVtZXJnZWQ6IgorCQkJZm9yIHggaW4gbWF0Y2hlZExp
YnJhcmllczoKKwkJCQlwcmludCB4CisKKwkJaWYgY29uc3VtZXJzOgorCQkJIyBUaGUgZm9sbG93
aW5nIHByZXZlbnRzIGVtZXJnaW5nIHRoZSBwYWNrYWdlcyB0aGF0IG93biB0aGUgbWF0Y2hlZAor
CQkJIyBsaWJyYXJpZXMuICBOb3RlIHRoYXQgdGhpcyB3aWxsIHByZXZlbnQgdXBkYXRpbmcgdGhl
IHBhY2thZ2VzIG93bmluZworCQkJIyB0aGUgbGlicmFyaWVzIGlmIHRoZXJlIGFyZSBuZXdlciB2
ZXJzaW9ucyBhdmFpbGFibGUgaW4gdGhlIGluc3RhbGxlZAorCQkJIyBzbG90LiAgU2VlIGJ1ZyAj
MzAwOTUKKwkJCWF0b21zID0gc2VsZi5tYXBQYXRoc1RvQXRvbXMoY29uc3VtZXJzKQorCQkJbGli
cmFyeU93bmVycyA9IHNlbGYubWFwUGF0aHNUb0F0b21zKG1hdGNoZWRMaWJyYXJpZXMpCisJCQlh
dG9tcy5kaWZmZXJlbmNlX3VwZGF0ZShsaWJyYXJ5T3duZXJzKQorCisJCXJldHVybiBhdG9tcwor
CisJZGVmIHNpbmdsZUJ1aWxkZXIoc2VsZiwgb3B0aW9ucywgc2V0dGluZ3MsIHRyZWVzKToKKwkJ
ZGVidWcgPSBnZXRfYm9vbGVhbihvcHRpb25zLCAiZGVidWciLCBGYWxzZSkKKwkJcmV0dXJuIE1p
c3NpbmdMaWJyYXJ5Q29uc3VtZXJTZXQodHJlZXNbInZhcnRyZWUiXS5kYmFwaSwgZGVidWcpCisJ
c2luZ2xlQnVpbGRlciA9IGNsYXNzbWV0aG9kKHNpbmdsZUJ1aWxkZXIpCg==
------=_Part_54009_27571114.1219288185481
Content-Type: application/octet-stream; name=vartree.py.2.2_rc8.patch
Content-Transfer-Encoding: base64
X-Attachment-Id: f_fk4q1yuq1
Content-Disposition: attachment; filename=vartree.py.2.2_rc8.patch

LS0tIHZhcnRyZWUucHkuMi4yX3JjOAkyMDA4LTA4LTE3IDIxOjExOjQxLjAwMDAwMDAwMCAtMDUw
MAorKysgcHltL3BvcnRhZ2UvZGJhcGkvdmFydHJlZS5weQkyMDA4LTA4LTE4IDA0OjEzOjMzLjAw
MDAwMDAwMCAtMDUwMApAQCAtMTQzLDEwICsxNDMsMTIgQEAKIAkJc2VsZi5fZGJhcGkgPSB2YXJk
YmFwaQogCQlzZWxmLl9saWJzID0ge30KIAkJc2VsZi5fb2JqX3Byb3BlcnRpZXMgPSB7fQotCQlz
ZWxmLl9kZWZwYXRoID0gZ2V0bGlicGF0aHMoKQotCQorCQlzZWxmLl9kZWZwYXRoID0gc2V0KGdl
dGxpYnBhdGhzKCkpCisJCXNlbGYuX29ial9rZXlfY2FjaGUgPSB7fQorCiAJZGVmIHJlYnVpbGQo
c2VsZiwgaW5jbHVkZV9maWxlPU5vbmUpOgogCQlsaWJzID0ge30KKwkJb2JqX2tleV9jYWNoZSA9
IHt9CiAJCW9ial9wcm9wZXJ0aWVzID0ge30KIAkJbGluZXMgPSBbXQogCQlmb3IgY3B2IGluIHNl
bGYuX2RiYXBpLmNwdl9hbGwoKToKQEAgLTE3NiwyOSArMTc4LDYxIEBACiAJCQkJIyBpbnN1ZmZp
Y2llbnQgZmllbGQgbGVuZ3RoCiAJCQkJY29udGludWUKIAkJCWFyY2ggPSBmaWVsZHNbMF0KLQkJ
CW9iaiA9IG9zLnBhdGgucmVhbHBhdGgoZmllbGRzWzFdKQorCQkJb2JqID0gZmllbGRzWzFdCisJ
CQlvYmpfa2V5ID0gc2VsZi5fZ2VuZXJhdGVPYmpLZXkob2JqKQogCQkJc29uYW1lID0gZmllbGRz
WzJdCi0JCQlwYXRoID0gZmlsdGVyKE5vbmUsIGZpZWxkc1szXS5yZXBsYWNlKAorCQkJcGF0aCA9
IHNldChbbm9ybWFsaXplX3BhdGgoeCkKKwkJCQlmb3IgeCBpbiBmaWx0ZXIoTm9uZSwgZmllbGRz
WzNdLnJlcGxhY2UoCiAJCQkJIiR7T1JJR0lOfSIsIG9zLnBhdGguZGlybmFtZShvYmopKS5yZXBs
YWNlKAotCQkJCSIkT1JJR0lOIiwgb3MucGF0aC5kaXJuYW1lKG9iaikpLnNwbGl0KCI6IikpCisJ
CQkJIiRPUklHSU4iLCBvcy5wYXRoLmRpcm5hbWUob2JqKSkuc3BsaXQoIjoiKSldKQogCQkJbmVl
ZGVkID0gZmlsdGVyKE5vbmUsIGZpZWxkc1s0XS5zcGxpdCgiLCIpKQogCQkJaWYgc29uYW1lOgot
CQkJCWxpYnMuc2V0ZGVmYXVsdChzb25hbWUsIHthcmNoOiB7InByb3ZpZGVycyI6IFtdLCAiY29u
c3VtZXJzIjogW119fSkKLQkJCQlsaWJzW3NvbmFtZV0uc2V0ZGVmYXVsdChhcmNoLCB7InByb3Zp
ZGVycyI6IFtdLCAiY29uc3VtZXJzIjogW119KQotCQkJCWxpYnNbc29uYW1lXVthcmNoXVsicHJv
dmlkZXJzIl0uYXBwZW5kKG9iaikKKwkJCQlsaWJzLnNldGRlZmF1bHQoc29uYW1lLCBcCisJCQkJ
CQl7YXJjaDogeyJwcm92aWRlcnMiOiBzZXQoKSwgImNvbnN1bWVycyI6IHNldCgpfX0pCisJCQkJ
bGlic1tzb25hbWVdLnNldGRlZmF1bHQoYXJjaCwgXAorCQkJCQkJeyJwcm92aWRlcnMiOiBzZXQo
KSwgImNvbnN1bWVycyI6IHNldCgpfSkKKwkJCQlsaWJzW3NvbmFtZV1bYXJjaF1bInByb3ZpZGVy
cyJdLmFkZChvYmpfa2V5KQogCQkJZm9yIHggaW4gbmVlZGVkOgotCQkJCWxpYnMuc2V0ZGVmYXVs
dCh4LCB7YXJjaDogeyJwcm92aWRlcnMiOiBbXSwgImNvbnN1bWVycyI6IFtdfX0pCi0JCQkJbGli
c1t4XS5zZXRkZWZhdWx0KGFyY2gsIHsicHJvdmlkZXJzIjogW10sICJjb25zdW1lcnMiOiBbXX0p
Ci0JCQkJbGlic1t4XVthcmNoXVsiY29uc3VtZXJzIl0uYXBwZW5kKG9iaikKLQkJCW9ial9wcm9w
ZXJ0aWVzW29ial0gPSAoYXJjaCwgbmVlZGVkLCBwYXRoLCBzb25hbWUpCi0JCQorCQkJCWxpYnMu
c2V0ZGVmYXVsdCh4LCBcCisJCQkJCQl7YXJjaDogeyJwcm92aWRlcnMiOiBzZXQoKSwgImNvbnN1
bWVycyI6IHNldCgpfX0pCisJCQkJbGlic1t4XS5zZXRkZWZhdWx0KGFyY2gsIHsicHJvdmlkZXJz
Ijogc2V0KCksICJjb25zdW1lcnMiOiBzZXQoKX0pCisJCQkJbGlic1t4XVthcmNoXVsiY29uc3Vt
ZXJzIl0uYWRkKG9ial9rZXkpCisJCQlvYmpfa2V5X2NhY2hlLnNldGRlZmF1bHQob2JqLCBvYmpf
a2V5KQorCQkJIyBBbGwgb2JqZWN0IHBhdGhzIGFyZSBhZGRlZCBpbnRvIHRoZSBvYmpfcHJvcGVy
dGllcyB0dXBsZQorCQkJb2JqX3Byb3BlcnRpZXMuc2V0ZGVmYXVsdChvYmpfa2V5LCBcCisJCQkJ
CShhcmNoLCBuZWVkZWQsIHBhdGgsIHNvbmFtZSwgc2V0KCkpKVs0XS5hZGQob2JqKQorCiAJCXNl
bGYuX2xpYnMgPSBsaWJzCiAJCXNlbGYuX29ial9wcm9wZXJ0aWVzID0gb2JqX3Byb3BlcnRpZXMK
KwkJc2VsZi5fb2JqX2tleV9jYWNoZSA9IG9ial9rZXlfY2FjaGUKIAotCWRlZiBsaXN0QnJva2Vu
QmluYXJpZXMoc2VsZik6CisJZGVmIF9nZW5lcmF0ZU9iaktleShzZWxmLCBvYmopOgorCQkiIiIK
KwkJR2VuZXJhdGUgb2JqIGtleSBmb3IgYSBnaXZlbiBvYmplY3QuCisKKwkJQHBhcmFtIG9iajog
cGF0aCB0byBhbiBleGlzdGluZyBmaWxlCisJCUB0eXBlIG9iajogc3RyaW5nIChleGFtcGxlOiAn
L3Vzci9iaW4vYmFyJykKKwkJQHJ0eXBlOiAyLXR1cGxlIG9mIGxvbmdzIGlmIG9iaiBleGlzdHMu
IHN0cmluZyBpZiBvYmogZG9lcyBub3QgZXhpc3QuCisJCUByZXR1cm46CisJCQkxLiAyLXR1cGxl
IG9mIG9iaidzIGlub2RlIGFuZCBkZXZpY2UgZnJvbSBhIHN0YXQgY2FsbCwgaWYgb2JqIGV4aXN0
cy4KKwkJCTIuIHJlYWxwYXRoIG9mIG9iamVjdCBpZiBvYmogZG9lcyBub3QgZXhpc3QuCisKKwkJ
IiIiCisJCXRyeToKKwkJCW9ial9zdCA9IG9zLnN0YXQob2JqKQorCQlleGNlcHQgT1NFcnJvcjoK
KwkJCSMgVXNlIHRoZSByZWFscGF0aCBhcyB0aGUga2V5IGlmIHRoZSBmaWxlIGRvZXMgbm90IGV4
aXN0cyBvbiB0aGUKKwkJCSMgZmlsZXN5c3RlbS4KKwkJCXJldHVybiBvcy5wYXRoLnJlYWxwYXRo
KG9iaikKKwkJIyBSZXR1cm4gYSB0dXBsZSBvZiB0aGUgZGV2aWNlIGFuZCBpbm9kZS4KKwkJcmV0
dXJuIChvYmpfc3Quc3RfZGV2LCBvYmpfc3Quc3RfaW5vKQorCisJZGVmIGxpc3RCcm9rZW5CaW5h
cmllcyhzZWxmLCBkZWJ1Zz1GYWxzZSk6CiAJCSIiIgogCQlGaW5kIGJpbmFyaWVzIGFuZCB0aGVp
ciBuZWVkZWQgc29uYW1lcywgd2hpY2ggaGF2ZSBubyBwcm92aWRlcnMuCiAKKwkJQHBhcmFtIGRl
YnVnOiBCb29sZWFuIHRvIGVuYWJsZSBkZWJ1ZyBvdXRwdXQKKwkJQHR5cGUgZGVidWc6IEJvb2xl
YW4KIAkJQHJ0eXBlOiBkaWN0IChleGFtcGxlOiB7Jy91c3IvYmluL2Zvbyc6IHNldChbJ2xpYmJh
ci5zbyddKX0pCiAJCUByZXR1cm46IFRoZSByZXR1cm4gdmFsdWUgaXMgYW4gb2JqZWN0IC0+IHNl
dC1vZi1zb25hbWVzIG1hcHBpbmcsIHdoZXJlCiAJCQlvYmplY3QgaXMgYSBicm9rZW4gYmluYXJ5
IGFuZCB0aGUgc2V0IGNvbnNpc3RzIG9mIHNvbmFtZXMgbmVlZGVkIGJ5CkBAIC0yMDgsNjUgKzI0
Miw2NiBAQAogCQljbGFzcyBMaWJyYXJ5Q2FjaGUob2JqZWN0KToKIAogCQkJIiIiCi0JCQlDYWNo
ZXMgc29uYW1lcyBhbmQgcmVhbHBhdGhzIGFzc29jaWF0ZWQgd2l0aCBwYXRocy4KKwkJCUNhY2hl
cyBwcm9wZXJ0aWVzIGFzc29jaWF0ZWQgd2l0aCBwYXRocy4KIAogCQkJVGhlIHB1cnBvc2Ugb2Yg
dGhpcyBjbGFzcyBpcyB0byBwcmV2ZW50IG11bHRpcGxlIGNhbGxzIG9mCi0JCQlvcy5wYXRoLnJl
YWxwYXRoIGFuZCBvcy5wYXRoLmlzZmlsZSBvbiB0aGUgc2FtZSBwYXRocy4KKwkJCV9nZW5lcmF0
ZU9iaktleSBvbiB0aGUgc2FtZSBwYXRocy4KIAogCQkJIiIiCiAKIAkJCWRlZiBfX2luaXRfXyhj
YWNoZV9zZWxmKToKIAkJCQljYWNoZV9zZWxmLmNhY2hlID0ge30KIAotCQkJZGVmIGdldChjYWNo
ZV9zZWxmLCBwYXRoKToKKwkJCWRlZiBnZXQoY2FjaGVfc2VsZiwgb2JqKToKIAkJCQkiIiIKLQkJ
CQlDYWNoZXMgYW5kIHJldHVybnMgdGhlIHNvbmFtZSBhbmQgcmVhbHBhdGggZm9yIGEgcGF0aC4K
KwkJCQlDYWNoZXMgYW5kIHJldHVybnMgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggYW4gb2Jq
ZWN0LgogCi0JCQkJQHBhcmFtIHBhdGg6IGFic29sdXRlIHBhdGggKGNhbiBiZSBzeW1saW5rKQot
CQkJCUB0eXBlIHBhdGg6IHN0cmluZyAoZXhhbXBsZTogJy91c3IvbGliL2xpYmZvby5zbycpCi0J
CQkJQHJ0eXBlOiAzLXR1cGxlIHdpdGggdHlwZXMgKHN0cmluZyBvciBOb25lLCBzdHJpbmcsIGJv
b2xlYW4pCi0JCQkJQHJldHVybjogMy10dXBsZSB3aXRoIHRoZSBmb2xsb3dpbmcgY29tcG9uZW50
czoKLQkJCQkJMS4gc29uYW1lIGFzIGEgc3RyaW5nIG9yIE5vbmUgaWYgaXQgZG9lcyBub3QgZXhp
c3QsCi0JCQkJCTIuIHJlYWxwYXRoIGFzIGEgc3RyaW5nLAotCQkJCQkzLiB0aGUgcmVzdWx0IG9m
IG9zLnBhdGguaXNmaWxlKHJlYWxwYXRoKQotCQkJCQkoZXhhbXBsZTogKCdsaWJmb28uc28uMScs
ICcvdXNyL2xpYi9saWJmb28uc28uMS41LjEnLCBUcnVlKSkKKwkJCQlAcGFyYW0gb2JqOiBhYnNv
bHV0ZSBwYXRoIChjYW4gYmUgc3ltbGluaykKKwkJCQlAdHlwZSBvYmo6IHN0cmluZyAoZXhhbXBs
ZTogJy91c3IvbGliL2xpYmZvby5zbycpCisJCQkJQHJ0eXBlOiA0LXR1cGxlIHdpdGggdHlwZXMK
KwkJCQkJKHN0cmluZyBvciBOb25lLCBzdHJpbmcgb3IgTm9uZSwgMi10dXBsZSwgQm9vbGVhbikK
KwkJCQlAcmV0dXJuOiA0LXR1cGxlIHdpdGggdGhlIGZvbGxvd2luZyBjb21wb25lbnRzOgorCQkJ
CQkxLiBhcmNoIGFzIGEgc3RyaW5nIG9yIE5vbmUgaWYgaXQgZG9lcyBub3QgZXhpc3QsCisJCQkJ
CTIuIHNvbmFtZSBhcyBhIHN0cmluZyBvciBOb25lIGlmIGl0IGRvZXMgbm90IGV4aXN0LAorCQkJ
CQkzLiBvYmpfa2V5IGFzIDItdHVwbGUsCisJCQkJCTQuIEJvb2xlYW4gcmVwcmVzZW50aW5nIHdo
ZXRoZXIgdGhlIG9iamVjdCBleGlzdHMuCisJCQkJCShleGFtcGxlOiAoJ2xpYmZvby5zby4xJywg
KDEyM0wsIDQ1NkwpLCBUcnVlKSkKIAogCQkJCSIiIgotCQkJCWlmIHBhdGggaW4gY2FjaGVfc2Vs
Zi5jYWNoZToKLQkJCQkJcmV0dXJuIGNhY2hlX3NlbGYuY2FjaGVbcGF0aF0KKwkJCQlpZiBvYmog
aW4gY2FjaGVfc2VsZi5jYWNoZToKKwkJCQkJcmV0dXJuIGNhY2hlX3NlbGYuY2FjaGVbb2JqXQog
CQkJCWVsc2U6Ci0JCQkJCXJlYWxwYXRoID0gb3MucGF0aC5yZWFscGF0aChwYXRoKQorCQkJCQlp
ZiBvYmogaW4gc2VsZi5fb2JqX2tleV9jYWNoZToKKwkJCQkJCW9ial9rZXkgPSBzZWxmLl9vYmpf
a2V5X2NhY2hlLmdldChvYmopCisJCQkJCWVsc2U6CisJCQkJCQlvYmpfa2V5ID0gc2VsZi5fZ2Vu
ZXJhdGVPYmpLZXkob2JqKQogCQkJCQkjIENoZWNrIHRoYXQgdGhlIGxpYnJhcnkgZXhpc3RzIG9u
IHRoZSBmaWxlc3lzdGVtLgotCQkJCQlpZiBvcy5wYXRoLmlzZmlsZShyZWFscGF0aCk6Ci0JCQkJ
CQkjIEdldCB0aGUgc29uYW1lIGZyb20gTGlua2FnZU1hcC5fb2JqX3Byb3BlcnRpZXMgaWYgaXQK
LQkJCQkJCSMgZXhpc3RzLiBPdGhlcndpc2UsIE5vbmUuCi0JCQkJCQlzb25hbWUgPSBzZWxmLl9v
YmpfcHJvcGVydGllcy5nZXQocmVhbHBhdGgsIChOb25lLCkqMylbM10KLQkJCQkJCSMgQm90aCBw
YXRoIGFuZCByZWFscGF0aCBhcmUgY2FjaGVkIGFuZCB0aGUgcmVzdWx0IGlzCi0JCQkJCQkjIHJl
dHVybmVkLgotCQkJCQkJY2FjaGVfc2VsZi5jYWNoZS5zZXRkZWZhdWx0KHJlYWxwYXRoLCBcCi0J
CQkJCQkJCShzb25hbWUsIHJlYWxwYXRoLCBUcnVlKSkKLQkJCQkJCXJldHVybiBjYWNoZV9zZWxm
LmNhY2hlLnNldGRlZmF1bHQocGF0aCwgXAotCQkJCQkJCQkoc29uYW1lLCByZWFscGF0aCwgVHJ1
ZSkpCisJCQkJCWlmIGlzaW5zdGFuY2Uob2JqX2tleSwgdHVwbGUpOgorCQkJCQkJIyBHZXQgdGhl
IGFyY2ggYW5kIHNvbmFtZSBmcm9tIExpbmthZ2VNYXAuX29ial9wcm9wZXJ0aWVzIGlmCisJCQkJ
CQkjIGl0IGV4aXN0cy4gT3RoZXJ3aXNlLCBOb25lLgorCQkJCQkJYXJjaCwgXywgXywgc29uYW1l
LCBfID0gXAorCQkJCQkJCQlzZWxmLl9vYmpfcHJvcGVydGllcy5nZXQob2JqX2tleSwgKE5vbmUs
KSo1KQorCQkJCQkJcmV0dXJuIGNhY2hlX3NlbGYuY2FjaGUuc2V0ZGVmYXVsdChvYmosIFwKKwkJ
CQkJCQkJKGFyY2gsIHNvbmFtZSwgb2JqX2tleSwgVHJ1ZSkpCiAJCQkJCWVsc2U6Ci0JCQkJCQkj
IHJlYWxwYXRoIGlzIG5vdCBjYWNoZWQgaGVyZSwgYmVjYXVzZSB0aGUgbWFqb3JpdHkgb2YgY2Fz
ZXMKLQkJCQkJCSMgd2hlcmUgcmVhbHBhdGggaXMgbm90IGEgZmlsZSwgcGF0aCBpcyB0aGUgc2Ft
ZSBhcyByZWFscGF0aC4KLQkJCQkJCSMgVGh1cyBzdG9yaW5nIHR3aWNlIHNsb3dzIGRvd24gdGhl
IGNhY2hlIHBlcmZvcm1hbmNlLgotCQkJCQkJcmV0dXJuIGNhY2hlX3NlbGYuY2FjaGUuc2V0ZGVm
YXVsdChwYXRoLCBcCi0JCQkJCQkJCShOb25lLCByZWFscGF0aCwgRmFsc2UpKQorCQkJCQkJcmV0
dXJuIGNhY2hlX3NlbGYuY2FjaGUuc2V0ZGVmYXVsdChvYmosIFwKKwkJCQkJCQkJKE5vbmUsIE5v
bmUsIG9ial9rZXksIEZhbHNlKSkKIAotCQlkZWJ1ZyA9IEZhbHNlCiAJCXJWYWx1ZSA9IHt9CiAJ
CWNhY2hlID0gTGlicmFyeUNhY2hlKCkKIAkJcHJvdmlkZXJzID0gc2VsZi5saXN0UHJvdmlkZXJz
KCkKIAotCQkjIEl0ZXJhdGUgb3ZlciBhbGwgYmluYXJpZXMgYW5kIHRoZWlyIHByb3ZpZGVycy4K
LQkJZm9yIG9iaiwgc29uYW1lcyBpbiBwcm92aWRlcnMuaXRlbXMoKToKKwkJIyBJdGVyYXRlIG92
ZXIgYWxsIG9ial9rZXlzIGFuZCB0aGVpciBwcm92aWRlcnMuCisJCWZvciBvYmpfa2V5LCBzb25h
bWVzIGluIHByb3ZpZGVycy5pdGVtcygpOgorCQkJYXJjaCwgXywgcGF0aCwgXywgb2JqcyA9IHNl
bGYuX29ial9wcm9wZXJ0aWVzW29ial9rZXldCisJCQlwYXRoID0gcGF0aC51bmlvbihzZWxmLl9k
ZWZwYXRoKQogCQkJIyBJdGVyYXRlIG92ZXIgZWFjaCBuZWVkZWQgc29uYW1lIGFuZCB0aGUgc2V0
IG9mIGxpYnJhcnkgcGF0aHMgdGhhdAogCQkJIyBmdWxmaWxsIHRoZSBzb25hbWUgdG8gZGV0ZXJt
aW5lIGlmIHRoZSBkZXBlbmRlbmN5IGlzIGJyb2tlbi4KIAkJCWZvciBzb25hbWUsIGxpYnJhcmll
cyBpbiBzb25hbWVzLml0ZW1zKCk6CiAJCQkJIyB2YWxpZExpYnJhcmllcyBpcyB1c2VkIHRvIHN0
b3JlIGxpYnJhcmllcywgd2hpY2ggc2F0aXNmeSBzb25hbWUsCiAJCQkJIyBzbyBpZiBubyB2YWxp
ZCBsaWJyYXJpZXMgYXJlIGZvdW5kLCB0aGUgc29uYW1lIGlzIG5vdCBzYXRpc2ZpZWQKLQkJCQkj
IGZvciBvYmouICBUaHVzIG9iaiBtdXN0IGJlIGVtZXJnZWQuCisJCQkJIyBmb3Igb2JqX2tleS4g
IElmIHVuc2F0aXNmaWVkLCBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCBvYmpfa2V5CisJCQkJIyBt
dXN0IGJlIGVtZXJnZWQuCiAJCQkJdmFsaWRMaWJyYXJpZXMgPSBzZXQoKQogCQkJCSMgSXQgY291
bGQgYmUgdGhlIGNhc2UgdGhhdCB0aGUgbGlicmFyeSB0byBzYXRpc2Z5IHRoZSBzb25hbWUgaXMK
IAkJCQkjIG5vdCBpbiB0aGUgb2JqJ3MgcnVucGF0aCwgYnV0IGEgc3ltbGluayB0byB0aGUgbGli
cmFyeSBpcyAoZWcKQEAgLTI3NCw2NyArMzA5LDYwIEBACiAJCQkJIyBkb2VzIG5vdCBjYXRhbG9n
IHN5bWxpbmtzLCBicm9rZW4gb3IgbWlzc2luZyBzeW1saW5rcyBtYXkgZ28KIAkJCQkjIHVubm90
aWNlZC4gIEFzIGEgcmVzdWx0IG9mIHRoZXNlIGNhc2VzLCBjaGVjayB0aGF0IGEgZmlsZSB3aXRo
CiAJCQkJIyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzb25hbWUgZXhpc3RzIGluIG9iaidzIHJ1bnBh
dGguCi0JCQkJcGF0aCA9IHNlbGYuX29ial9wcm9wZXJ0aWVzW29ial1bMl0gKyBzZWxmLl9kZWZw
YXRoCi0JCQkJZm9yIGQgaW4gcGF0aDoKLQkJCQkJY2FjaGVkU29uYW1lLCBjYWNoZWRSZWFscGF0
aCwgY2FjaGVkRXhpc3RzID0gXAotCQkJCQkJCWNhY2hlLmdldChvcy5wYXRoLmpvaW4oZCwgc29u
YW1lKSkKLQkJCQkJIyBDaGVjayB0aGF0IHRoZSB0aGlzIGxpYnJhcnkgcHJvdmlkZXMgdGhlIG5l
ZWRlZCBzb25hbWUuICBEb2luZworCQkJCSMgWFhYIElmIHdlIGNhdGFsb2cgc3ltbGlua3MgaW4g
TGlua2FnZU1hcCwgdGhpcyBjb3VsZCBiZSBpbXByb3ZlZC4KKwkJCQlmb3IgZGlyZWN0b3J5IGlu
IHBhdGg6CisJCQkJCWNhY2hlZEFyY2gsIGNhY2hlZFNvbmFtZSwgY2FjaGVkS2V5LCBjYWNoZWRF
eGlzdHMgPSBcCisJCQkJCQkJY2FjaGUuZ2V0KG9zLnBhdGguam9pbihkaXJlY3RvcnksIHNvbmFt
ZSkpCisJCQkJCSMgQ2hlY2sgdGhhdCB0aGlzIGxpYnJhcnkgcHJvdmlkZXMgdGhlIG5lZWRlZCBz
b25hbWUuICBEb2luZwogCQkJCQkjIHRoaXMsIGhvd2V2ZXIsIHdpbGwgY2F1c2UgY29uc3VtZXJz
IG9mIGxpYnJhcmllcyBtaXNzaW5nCiAJCQkJCSMgc29uYW1lcyB0byBiZSB1bm5lY2Vzc2FyaWx5
IGVtZXJnZWQuIChlZyBsaWJtaXguc28pCi0JCQkJCWlmIGNhY2hlZFNvbmFtZSA9PSBzb25hbWU6
Ci0JCQkJCQl2YWxpZExpYnJhcmllcy5hZGQoY2FjaGVkUmVhbHBhdGgpCi0JCQkJCQlpZiBkZWJ1
ZyBhbmQgY2FjaGVkUmVhbHBhdGggbm90IGluIGxpYnJhcmllczoKKwkJCQkJaWYgY2FjaGVkU29u
YW1lID09IHNvbmFtZSBhbmQgY2FjaGVkQXJjaCA9PSBhcmNoOgorCQkJCQkJdmFsaWRMaWJyYXJp
ZXMuYWRkKGNhY2hlZEtleSkKKwkJCQkJCWlmIGRlYnVnIGFuZCBjYWNoZWRLZXkgbm90IGluIFwK
KwkJCQkJCQkJc2V0KG1hcChzZWxmLl9vYmpfa2V5X2NhY2hlLmdldCwgbGlicmFyaWVzKSk6CisJ
CQkJCQkJIyBYWFggVGhpcyBpcyBtb3N0IG9mdGVuIGR1ZSB0byBzb25hbWUgc3ltbGlua3Mgbm90
IGluCisJCQkJCQkJIyBhIGxpYnJhcnkncyBkaXJlY3RvcnkuICBXZSBjb3VsZCBjYXRhbG9nIHN5
bWxpbmtzIGluCisJCQkJCQkJIyBMaW5rYWdlTWFwIHRvIGF2b2lkIGNoZWNraW5nIGZvciB0aGlz
IGVkZ2UgY2FzZSBoZXJlLgogCQkJCQkJCXByaW50ICJGb3VuZCBwcm92aWRlciBvdXRzaWRlIG9m
IGZpbmRQcm92aWRlcnM6IiwgXAotCQkJCQkJCQkJb3MucGF0aC5qb2luKGQsIHNvbmFtZSksICIt
PiIsIGNhY2hlZFJlYWxwYXRoCisJCQkJCQkJCQlvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCBzb25h
bWUpLCAiLT4iLCBcCisJCQkJCQkJCQlzZWxmLl9vYmpfcHJvcGVydGllc1tjYWNoZWRLZXldWzRd
LCBsaWJyYXJpZXMKIAkJCQkJCSMgQSB2YWxpZCBsaWJyYXJ5IGhhcyBiZWVuIGZvdW5kLCBzbyB0
aGVyZSBpcyBubyBuZWVkIHRvCiAJCQkJCQkjIGNvbnRpbnVlLgogCQkJCQkJYnJlYWsKLQkJCQkJ
aWYgZGVidWcgYW5kIGNhY2hlZFJlYWxwYXRoIGluIHNlbGYuX29ial9wcm9wZXJ0aWVzOgorCQkJ
CQlpZiBkZWJ1ZyBhbmQgY2FjaGVkQXJjaCA9PSBhcmNoIGFuZCBcCisJCQkJCQkJY2FjaGVkS2V5
IGluIHNlbGYuX29ial9wcm9wZXJ0aWVzOgogCQkJCQkJcHJpbnQgIkJyb2tlbiBzeW1saW5rIG9y
IG1pc3NpbmcvYmFkIHNvbmFtZToiLCBcCi0JCQkJCQkJCW9zLnBhdGguam9pbihkLCBzb25hbWUp
LCAnLT4nLCBjYWNoZWRSZWFscGF0aCwgXAotCQkJCQkJCQkid2l0aCBzb25hbWUiLCBjYWNoZWRT
b25hbWUsICJidXQgZXhwZWN0aW5nIiwgc29uYW1lCisJCQkJCQkJCW9zLnBhdGguam9pbihkaXJl
Y3RvcnksIHNvbmFtZSksICctPicsIFwKKwkJCQkJCQkJc2VsZi5fb2JqX3Byb3BlcnRpZXNbY2Fj
aGVkS2V5XSwgIndpdGggc29uYW1lIiwgXAorCQkJCQkJCQljYWNoZWRTb25hbWUsICJidXQgZXhw
ZWN0aW5nIiwgc29uYW1lCiAJCQkJIyBUaGlzIGNvbmRpdGlvbmFsIGNoZWNrcyBpZiB0aGVyZSBh
cmUgbm8gbGlicmFyaWVzIHRvIHNhdGlzZnkgdGhlCiAJCQkJIyBzb25hbWUgKGVtcHR5IHNldCku
CiAJCQkJaWYgbm90IHZhbGlkTGlicmFyaWVzOgotCQkJCQlyVmFsdWUuc2V0ZGVmYXVsdChvYmos
IHNldCgpKS5hZGQoc29uYW1lKQorCQkJCQlmb3Igb2JqIGluIG9ianM6CisJCQkJCQlyVmFsdWUu
c2V0ZGVmYXVsdChvYmosIHNldCgpKS5hZGQoc29uYW1lKQogCQkJCQkjIElmIG5vIHZhbGlkIGxp
YnJhcmllcyBoYXZlIGJlZW4gZm91bmQgYnkgdGhpcyBwb2ludCwgdGhlbgogCQkJCQkjIHRoZXJl
IGFyZSBubyBmaWxlcyBuYW1lZCB3aXRoIHRoZSBzb25hbWUgd2l0aGluIG9iaidzIHJ1bnBhdGgs
CiAJCQkJCSMgYnV0IGlmIHRoZXJlIGFyZSBsaWJyYXJpZXMgKGZyb20gdGhlIHByb3ZpZGVycyBt
YXBwaW5nKSwgaXQgaXMKLQkJCQkJIyBsaWtlbHkgdGhhdCBzeW1saW5rcyBvciB0aGUgYWN0dWFs
IGxpYnJhcmllcyBhcmUgbWlzc2luZy4KLQkJCQkJIyBUaHVzIHBvc3NpYmxlIHN5bWxpbmtzIGFu
ZCBtaXNzaW5nIGxpYnJhcmllcyBhcmUgYWRkZWQgdG8KLQkJCQkJIyByVmFsdWUgaW4gb3JkZXIg
dG8gZW1lcmdlIGNvcnJ1cHQgbGlicmFyeSBwYWNrYWdlcy4KKwkJCQkJIyBsaWtlbHkgdGhhdCBz
b25hbWUgc3ltbGlua3Mgb3IgdGhlIGFjdHVhbCBsaWJyYXJpZXMgYXJlCisJCQkJCSMgbWlzc2lu
ZyBvciBicm9rZW4uICBUaHVzIHRob3NlIGxpYnJhcmllcyBhcmUgYWRkZWQgdG8gclZhbHVlCisJ
CQkJCSMgaW4gb3JkZXIgdG8gZW1lcmdlIGNvcnJ1cHQgbGlicmFyeSBwYWNrYWdlcy4KIAkJCQkJ
Zm9yIGxpYiBpbiBsaWJyYXJpZXM6Ci0JCQkJCQljYWNoZWRTb25hbWUsIGNhY2hlZFJlYWxwYXRo
LCBjYWNoZWRFeGlzdHMgPSBjYWNoZS5nZXQobGliKQotCQkJCQkJaWYgbm90IGNhY2hlZEV4aXN0
czoKLQkJCQkJCQkjIFRoZSBsaWJyYXJ5J3MgcGFja2FnZSBuZWVkcyB0byBiZSBlbWVyZ2VkIHRv
IHJlcGFpciB0aGUKLQkJCQkJCQkjIG1pc3NpbmcgbGlicmFyeS4KLQkJCQkJCQlyVmFsdWUuc2V0
ZGVmYXVsdChsaWIsIHNldCgpKS5hZGQoc29uYW1lKQotCQkJCQkJZWxzZToKLQkJCQkJCQkjIEEg
bGlicmFyeSBwcm92aWRpbmcgdGhlIHNvbmFtZSBleGlzdHMgaW4gdGhlIG9iaidzCi0JCQkJCQkJ
IyBydW5wYXRoLCBidXQgbm8gZmlsZSBuYW1lZCBhcyB0aGUgc29uYW1lIGV4aXN0cywgc28gYWRk
Ci0JCQkJCQkJIyB0aGUgcGF0aCBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsaWIncyBkaXJlY3Rvcnkg
YW5kIHRoZQotCQkJCQkJCSMgc29uYW1lIHRvIHJWYWx1ZSB0byBmaXggY2FzZXMgb2YgdmFuaXNo
aW5nIChvciBtb2RpZmllZCkKLQkJCQkJCQkjIHN5bWxpbmtzLiAgVGhpcyBwYXRoIGlzIG5vdCBn
dWFyYW50ZWVkIHRvIGV4aXN0LCBidXQgaXQKLQkJCQkJCQkjIGZvbGxvd3MgdGhlIHN5bWxpbmsg
Y29udmVudGlvbiBmb3VuZCBpbiB0aGUgbWFqb3JpdHkgb2YKLQkJCQkJCQkjIHBhY2thZ2VzLgot
CQkJCQkJCXJWYWx1ZS5zZXRkZWZhdWx0KG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUobGli
KSwgXAotCQkJCQkJCQkJc29uYW1lKSwgc2V0KCkpLmFkZChzb25hbWUpCisJCQkJCQlyVmFsdWUu
c2V0ZGVmYXVsdChsaWIsIHNldCgpKS5hZGQoc29uYW1lKQogCQkJCQkJaWYgZGVidWc6Ci0JCQkJ
CQkJaWYgbm90IGNhY2hlZEV4aXN0czoKKwkJCQkJCQlpZiBub3Qgb3MucGF0aC5pc2ZpbGUobGli
KToKIAkJCQkJCQkJcHJpbnQgIk1pc3NpbmcgbGlicmFyeToiLCBsaWIKIAkJCQkJCQllbHNlOgog
CQkJCQkJCQlwcmludCAiUG9zc2libHkgbWlzc2luZyBzeW1saW5rOiIsIFwKIAkJCQkJCQkJCQlv
cy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKGxpYiksIHNvbmFtZSkKLQogCQlyZXR1cm4gclZh
bHVlCiAKIAlkZWYgbGlzdFByb3ZpZGVycyhzZWxmKToKIAkJIiIiCi0JCUZpbmQgdGhlIHByb3Zp
ZGVycyBmb3IgYWxsIGJpbmFyaWVzLgorCQlGaW5kIHRoZSBwcm92aWRlcnMgZm9yIGFsbCBvYmpl
Y3Qga2V5cyBpbiBMaW5rYWdlTWFwLgogCiAJCUBydHlwZTogZGljdCAoZXhhbXBsZToKLQkJCXsn
L3Vzci9iaW4vZm9vJzogeydsaWJiYXIuc28nOiBzZXQoWycvbGliL2xpYmJhci5zby4xLjUnXSl9
fSkKLQkJQHJldHVybjogVGhlIHJldHVybiB2YWx1ZSBpcyBhbiBvYmplY3QgLT4gcHJvdmlkZXJz
IG1hcHBpbmcsIHdoZXJlCisJCQl7KDEyM0wsIDQ1NkwpOiB7J2xpYmJhci5zbyc6IHNldChbJy9s
aWIvbGliYmFyLnNvLjEuNSddKX19KQorCQlAcmV0dXJuOiBUaGUgcmV0dXJuIHZhbHVlIGlzIGFu
IG9iamVjdCBrZXkgLT4gcHJvdmlkZXJzIG1hcHBpbmcsIHdoZXJlCiAJCQlwcm92aWRlcnMgaXMg
YSBtYXBwaW5nIG9mIHNvbmFtZSAtPiBzZXQtb2YtbGlicmFyeS1wYXRocyByZXR1cm5lZAogCQkJ
ZnJvbSB0aGUgZmluZFByb3ZpZGVycyBtZXRob2QuCiAKQEAgLTM0MiwxMTggKzM3MCwxODggQEAK
IAkJclZhbHVlID0ge30KIAkJaWYgbm90IHNlbGYuX2xpYnM6CiAJCQlzZWxmLnJlYnVpbGQoKQot
CQkjIEl0ZXJhdGUgb3ZlciBhbGwgYmluYXJpZXMgd2l0aGluIExpbmthZ2VNYXAuCi0JCWZvciBv
YmogaW4gc2VsZi5fb2JqX3Byb3BlcnRpZXM6Ci0JCQlyVmFsdWUuc2V0ZGVmYXVsdChvYmosIHNl
bGYuZmluZFByb3ZpZGVycyhvYmopKQorCQkjIEl0ZXJhdGUgb3ZlciBhbGwgb2JqZWN0IGtleXMg
d2l0aGluIExpbmthZ2VNYXAuCisJCWZvciBvYmpfa2V5IGluIHNlbGYuX29ial9wcm9wZXJ0aWVz
OgorCQkJclZhbHVlLnNldGRlZmF1bHQob2JqX2tleSwgc2VsZi5maW5kUHJvdmlkZXJzKG9ial9r
ZXk9b2JqX2tleSkpCiAJCXJldHVybiByVmFsdWUKIAogCWRlZiBpc01hc3Rlckxpbmsoc2VsZiwg
b2JqKToKKwkJIiIiCisJCURldGVybWluZSB3aGV0aGVyIGFuIG9iamVjdCBpcyBhIG1hc3RlciBs
aW5rLgorCisJCUBwYXJhbSBvYmo6IGFic29sdXRlIHBhdGggdG8gYW4gb2JqZWN0CisJCUB0eXBl
IG9iajogc3RyaW5nIChleGFtcGxlOiAnL3Vzci9iaW4vZm9vJykKKwkJQHJ0eXBlOiBCb29sZWFu
CisJCUByZXR1cm46CisJCQkxLiBUcnVlIGlmIG9iaiBpcyBhIG1hc3RlciBsaW5rCisJCQkyLiBG
YWxzZSBpZiBvYmogaXMgbm90IGEgbWFzdGVyIGxpbmsKKworCQkiIiIKIAkJYmFzZW5hbWUgPSBv
cy5wYXRoLmJhc2VuYW1lKG9iaikKLQkJaWYgb2JqIG5vdCBpbiBzZWxmLl9vYmpfcHJvcGVydGll
czoKLQkJCW9iaiA9IG9zLnBhdGgucmVhbHBhdGgob2JqKQotCQkJaWYgb2JqIG5vdCBpbiBzZWxm
Ll9vYmpfcHJvcGVydGllczoKLQkJCQlyYWlzZSBLZXlFcnJvcigiJXMgbm90IGluIG9iamVjdCBs
aXN0IiAlIG9iaikKLQkJc29uYW1lID0gc2VsZi5fb2JqX3Byb3BlcnRpZXNbb2JqXVszXQorCQlv
Ympfa2V5ID0gc2VsZi5fZ2VuZXJhdGVPYmpLZXkob2JqKQorCQlpZiBvYmpfa2V5IG5vdCBpbiBz
ZWxmLl9vYmpfcHJvcGVydGllczoKKwkJCXJhaXNlIEtleUVycm9yKCIlcyAoJXMpIG5vdCBpbiBv
YmplY3QgbGlzdCIgJSAob2JqX2tleSwgb2JqKSkKKwkJc29uYW1lID0gc2VsZi5fb2JqX3Byb3Bl
cnRpZXNbb2JqX2tleV1bM10KIAkJcmV0dXJuIChsZW4oYmFzZW5hbWUpIDwgbGVuKHNvbmFtZSkp
Ci0JCQorCiAJZGVmIGxpc3RMaWJyYXJ5T2JqZWN0cyhzZWxmKToKKwkJIiIiCisJCVJldHVybiBh
IGxpc3Qgb2YgbGlicmFyeSBvYmplY3RzLgorCisJCUtub3duIGxpbWl0YXRpb246IGxpYnJhcnkg
b2JqZWN0cyBsYWNraW5nIGFuIHNvbmFtZSBhcmUgbm90IGluY2x1ZGVkLgorCisJCUBydHlwZTog
bGlzdCBvZiBzdHJpbmdzCisJCUByZXR1cm46IGxpc3Qgb2YgcGF0aHMgdG8gYWxsIHByb3ZpZGVy
cworCisJCSIiIgogCQlyVmFsdWUgPSBbXQogCQlpZiBub3Qgc2VsZi5fbGliczoKIAkJCXNlbGYu
cmVidWlsZCgpCiAJCWZvciBzb25hbWUgaW4gc2VsZi5fbGliczoKIAkJCWZvciBhcmNoIGluIHNl
bGYuX2xpYnNbc29uYW1lXToKLQkJCQlyVmFsdWUuZXh0ZW5kKHNlbGYuX2xpYnNbc29uYW1lXVth
cmNoXVsicHJvdmlkZXJzIl0pCisJCQkJZm9yIG9ial9rZXkgaW4gc2VsZi5fbGlic1tzb25hbWVd
W2FyY2hdWyJwcm92aWRlcnMiXToKKwkJCQkJclZhbHVlLmV4dGVuZChzZWxmLl9vYmpfcHJvcGVy
dGllc1tvYmpfa2V5XVs0XSkKIAkJcmV0dXJuIHJWYWx1ZQogCiAJZGVmIGdldFNvbmFtZShzZWxm
LCBvYmopOgorCQkiIiIKKwkJUmV0dXJuIHRoZSBzb25hbWUgYXNzb2NpYXRlZCB3aXRoIGFuIG9i
amVjdC4KKworCQlAcGFyYW0gb2JqOiBhYnNvbHV0ZSBwYXRoIHRvIGFuIG9iamVjdAorCQlAdHlw
ZSBvYmo6IHN0cmluZyAoZXhhbXBsZTogJy91c3IvYmluL2JhcicpCisJCUBydHlwZTogc3RyaW5n
CisJCUByZXR1cm46IHNvbmFtZSBhcyBhIHN0cmluZworCisJCSIiIgogCQlpZiBub3Qgc2VsZi5f
bGliczoKIAkJCXNlbGYucmVidWlsZCgpCi0JCWlmIG9iaiBub3QgaW4gc2VsZi5fb2JqX3Byb3Bl
cnRpZXM6Ci0JCQlvYmogPSBvcy5wYXRoLnJlYWxwYXRoKG9iaikKLQkJCWlmIG9iaiBub3QgaW4g
c2VsZi5fb2JqX3Byb3BlcnRpZXM6Ci0JCQkJcmFpc2UgS2V5RXJyb3IoIiVzIG5vdCBpbiBvYmpl
Y3QgbGlzdCIgJSBvYmopCi0JCWFyY2gsIG5lZWRlZCwgcGF0aCwgc29uYW1lID0gc2VsZi5fb2Jq
X3Byb3BlcnRpZXNbb2JqXQotCQlyZXR1cm4gc29uYW1lCisJCWlmIG9iaiBub3QgaW4gc2VsZi5f
b2JqX2tleV9jYWNoZToKKwkJCXJhaXNlIEtleUVycm9yKCIlcyBub3QgaW4gb2JqZWN0IGxpc3Qi
ICUgb2JqKQorCQlyZXR1cm4gc2VsZi5fb2JqX3Byb3BlcnRpZXNbc2VsZi5fb2JqX2tleV9jYWNo
ZVtvYmpdXVszXQorCisJZGVmIGZpbmRQcm92aWRlcnMoc2VsZiwgb2JqPU5vbmUsIG9ial9rZXk9
Tm9uZSk6CisJCSIiIgorCQlGaW5kIHByb3ZpZGVycyBmb3IgYW4gb2JqZWN0IG9yIG9iamVjdCBr
ZXkuCisKKwkJVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCB3aXRoIGVpdGhlciBhbiBvYmog
b3Igb2JqX2tleS4gIElmIGNhbGxlZAorCQl3aXRoIGJvdGgsIHRoZSBvYmpfa2V5IGlzIGlnbm9y
ZWQuICBJZiBjYWxsZWQgd2l0aCBuZWl0aGVyLCBLZXlFcnJvciBpcworCQlyYWlzZWQgYXMgaWYg
YW4gaW52YWxpZCBvYmogd2FzIHBhc3NlZC4KKworCQlJbiBzb21lIGNhc2VzLCBub3QgYWxsIHZh
bGlkIGxpYnJhcmllcyBhcmUgcmV0dXJuZWQuICBUaGlzIG1heSBvY2N1ciB3aGVuCisJCWFuIHNv
bmFtZSBzeW1saW5rIHJlZmVyZW5jaW5nIGEgbGlicmFyeSBpcyBpbiBhbiBvYmplY3QncyBydW5w
YXRoIHdoaWxlCisJCXRoZSBhY3R1YWwgbGlicmFyeSBpcyBub3QuCisKKwkJQHBhcmFtIG9iajog
YWJzb2x1dGUgcGF0aCB0byBhbiBvYmplY3QKKwkJQHR5cGUgb2JqOiBzdHJpbmcgKGV4YW1wbGU6
ICcvdXNyL2Jpbi9iYXInKQorCQlAcGFyYW0gb2JqX2tleToga2V5IGZyb20gTGlua2FnZU1hcC5f
Z2VuZXJhdGVPYmpLZXkKKwkJQHR5cGUgb2JqX2tleTogMi10dXBsZSBvZiBsb25ncyBvciBzdHJp
bmcKKwkJQHJ0eXBlOiBkaWN0IChleGFtcGxlOiB7J2xpYmJhci5zbyc6IHNldChbJy9saWIvbGli
YmFyLnNvLjEuNSddKX0pCisJCUByZXR1cm46IFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzb25hbWUg
LT4gc2V0LW9mLWxpYnJhcnktcGF0aHMsIHdoZXJlCisJCXNldC1vZi1saWJyYXJ5LXBhdGhzIHNh
dGlzZnkgc29uYW1lLgorCisJCSIiIgorCQlyVmFsdWUgPSB7fQogCi0JZGVmIGZpbmRQcm92aWRl
cnMoc2VsZiwgb2JqKToKIAkJaWYgbm90IHNlbGYuX2xpYnM6CiAJCQlzZWxmLnJlYnVpbGQoKQog
Ci0JCXJlYWxwYXRoX2NhY2hlID0ge30KLQkJZGVmIHJlYWxwYXRoKHApOgotCQkJcmVhbF9wYXRo
ID0gcmVhbHBhdGhfY2FjaGUuZ2V0KHApCi0JCQlpZiByZWFsX3BhdGggaXMgTm9uZToKLQkJCQly
ZWFsX3BhdGggPSBvcy5wYXRoLnJlYWxwYXRoKHApCi0JCQkJcmVhbHBhdGhfY2FjaGVbcF0gPSBy
ZWFsX3BhdGgKLQkJCXJldHVybiByZWFsX3BhdGgKLQotCQlyVmFsdWUgPSB7fQotCQlpZiBvYmog
bm90IGluIHNlbGYuX29ial9wcm9wZXJ0aWVzOgotCQkJb2JqID0gcmVhbHBhdGgob2JqKQotCQkJ
aWYgb2JqIG5vdCBpbiBzZWxmLl9vYmpfcHJvcGVydGllczoKLQkJCQlyYWlzZSBLZXlFcnJvcigi
JXMgbm90IGluIG9iamVjdCBsaXN0IiAlIG9iaikKLQkJYXJjaCwgbmVlZGVkLCBwYXRoLCBzb25h
bWUgPSBzZWxmLl9vYmpfcHJvcGVydGllc1tvYmpdCi0JCXBhdGggPSBwYXRoWzpdCi0JCXBhdGgu
ZXh0ZW5kKHNlbGYuX2RlZnBhdGgpCi0JCXBhdGggPSBzZXQocmVhbHBhdGgoeCkgZm9yIHggaW4g
cGF0aCkKLQkJZm9yIHggaW4gbmVlZGVkOgotCQkJclZhbHVlW3hdID0gc2V0KCkKLQkJCWlmIHgg
bm90IGluIHNlbGYuX2xpYnMgb3IgYXJjaCBub3QgaW4gc2VsZi5fbGlic1t4XToKLQkJCQljb250
aW51ZQotCQkJZm9yIHkgaW4gc2VsZi5fbGlic1t4XVthcmNoXVsicHJvdmlkZXJzIl06Ci0JCQkJ
aWYgeFswXSA9PSBvcy5zZXAgYW5kIHJlYWxwYXRoKHgpID09IHJlYWxwYXRoKHkpOgotCQkJCQly
VmFsdWVbeF0uYWRkKHkpCi0JCQkJZWxpZiByZWFscGF0aChvcy5wYXRoLmRpcm5hbWUoeSkpIGlu
IHBhdGg6Ci0JCQkJCXJWYWx1ZVt4XS5hZGQoeSkKKwkJIyBEZXRlcm1pbmUgdGhlIG9ial9rZXkg
ZnJvbSB0aGUgYXJndW1lbnRzLgorCQlpZiBvYmogaXMgbm90IE5vbmU6CisJCQlvYmpfa2V5ID0g
c2VsZi5fb2JqX2tleV9jYWNoZS5nZXQob2JqKQorCQkJaWYgb2JqX2tleSBub3QgaW4gc2VsZi5f
b2JqX3Byb3BlcnRpZXM6CisJCQkJb2JqX2tleSA9IHNlbGYuX2dlbmVyYXRlT2JqS2V5KG9iaikK
KwkJCQlpZiBvYmpfa2V5IG5vdCBpbiBzZWxmLl9vYmpfcHJvcGVydGllczoKKwkJCQkJcmFpc2Ug
S2V5RXJyb3IoIiVzICglcykgbm90IGluIG9iamVjdCBsaXN0IiAlIChvYmpfa2V5LCBvYmopKQor
CQllbGlmIG9ial9rZXkgbm90IGluIHNlbGYuX29ial9wcm9wZXJ0aWVzOgorCQkJcmFpc2UgS2V5
RXJyb3IoIiVzIG5vdCBpbiBvYmplY3QgbGlzdCIgJSBvYmpfa2V5KQorCisJCWFyY2gsIG5lZWRl
ZCwgcGF0aCwgXywgXyA9IHNlbGYuX29ial9wcm9wZXJ0aWVzW29ial9rZXldCisJCXBhdGggPSBw
YXRoLnVuaW9uKHNlbGYuX2RlZnBhdGgpCisJCWZvciBzb25hbWUgaW4gbmVlZGVkOgorCQkJclZh
bHVlW3NvbmFtZV0gPSBzZXQoKQorCQkJaWYgc29uYW1lIG5vdCBpbiBzZWxmLl9saWJzIG9yIGFy
Y2ggbm90IGluIHNlbGYuX2xpYnNbc29uYW1lXToKKwkJCQljb250aW51ZQorCQkJIyBGb3IgZWFj
aCBwb3RlbnRpYWwgcHJvdmlkZXIgb2YgdGhlIHNvbmFtZSwgYWRkIGl0IHRvIHJWYWx1ZSBpZiBp
dAorCQkJIyByZXNpZGVzIGluIHRoZSBvYmoncyBydW5wYXRoLgorCQkJZm9yIHByb3ZpZGVyX2tl
eSBpbiBzZWxmLl9saWJzW3NvbmFtZV1bYXJjaF1bInByb3ZpZGVycyJdOgorCQkJCXByb3ZpZGVy
cyA9IHNlbGYuX29ial9wcm9wZXJ0aWVzW3Byb3ZpZGVyX2tleV1bNF0KKwkJCQlmb3IgcHJvdmlk
ZXIgaW4gcHJvdmlkZXJzOgorCQkJCQlpZiBvcy5wYXRoLmRpcm5hbWUocHJvdmlkZXIpIGluIHBh
dGg6CisJCQkJCQlyVmFsdWVbc29uYW1lXS5hZGQocHJvdmlkZXIpCiAJCXJldHVybiByVmFsdWUK
LQkKLQlkZWYgZmluZENvbnN1bWVycyhzZWxmLCBvYmopOgorCisJZGVmIGZpbmRDb25zdW1lcnMo
c2VsZiwgb2JqPU5vbmUsIG9ial9rZXk9Tm9uZSk6CisJCSIiIgorCQlGaW5kIGNvbnN1bWVycyBv
ZiBhbiBvYmplY3Qgb3Igb2JqZWN0IGtleS4KKworCQlUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2Fs
bGVkIHdpdGggZWl0aGVyIGFuIG9iaiBvciBvYmpfa2V5LiAgSWYgY2FsbGVkCisJCXdpdGggYm90
aCwgdGhlIG9ial9rZXkgaXMgaWdub3JlZC4gIElmIGNhbGxlZCB3aXRoIG5laXRoZXIsIEtleUVy
cm9yIGlzCisJCXJhaXNlZCBhcyBpZiBhbiBpbnZhbGlkIG9iaiB3YXMgcGFzc2VkLgorCisJCUlu
IHNvbWUgY2FzZXMsIG5vdCBhbGwgY29uc3VtZXJzIGFyZSByZXR1cm5lZC4gIFRoaXMgbWF5IG9j
Y3VyIHdoZW4KKwkJYW4gc29uYW1lIHN5bWxpbmsgcmVmZXJlbmNpbmcgYSBsaWJyYXJ5IGlzIGlu
IGFuIG9iamVjdCdzIHJ1bnBhdGggd2hpbGUKKwkJdGhlIGFjdHVhbCBsaWJyYXJ5IGlzIG5vdC4K
KworCQlAcGFyYW0gb2JqOiBhYnNvbHV0ZSBwYXRoIHRvIGFuIG9iamVjdAorCQlAdHlwZSBvYmo6
IHN0cmluZyAoZXhhbXBsZTogJy91c3IvYmluL2JhcicpCisJCUBwYXJhbSBvYmpfa2V5OiBrZXkg
ZnJvbSBMaW5rYWdlTWFwLl9nZW5lcmF0ZU9iaktleQorCQlAdHlwZSBvYmpfa2V5OiAyLXR1cGxl
IG9mIGxvbmdzIG9yIHN0cmluZworCQlAcnR5cGU6IHNldCBvZiBzdHJpbmdzIChleGFtcGxlOiAp
CisJCUByZXR1cm46IFRoZSByZXR1cm4gdmFsdWUgaXMgYSBzb25hbWUgLT4gc2V0LW9mLWxpYnJh
cnktcGF0aHMsIHdoZXJlCisJCXNldC1vZi1saWJyYXJ5LXBhdGhzIHNhdGlzZnkgc29uYW1lLgor
CisJCSIiIgorCQlyVmFsdWUgPSBzZXQoKQorCiAJCWlmIG5vdCBzZWxmLl9saWJzOgogCQkJc2Vs
Zi5yZWJ1aWxkKCkKIAotCQlyZWFscGF0aF9jYWNoZSA9IHt9Ci0JCWRlZiByZWFscGF0aChwKToK
LQkJCXJlYWxfcGF0aCA9IHJlYWxwYXRoX2NhY2hlLmdldChwKQotCQkJaWYgcmVhbF9wYXRoIGlz
IE5vbmU6Ci0JCQkJcmVhbF9wYXRoID0gb3MucGF0aC5yZWFscGF0aChwKQotCQkJCXJlYWxwYXRo
X2NhY2hlW3BdID0gcmVhbF9wYXRoCi0JCQlyZXR1cm4gcmVhbF9wYXRoCi0KLQkJaWYgb2JqIG5v
dCBpbiBzZWxmLl9vYmpfcHJvcGVydGllczoKLQkJCW9iaiA9IHJlYWxwYXRoKG9iaikKLQkJCWlm
IG9iaiBub3QgaW4gc2VsZi5fb2JqX3Byb3BlcnRpZXM6Ci0JCQkJcmFpc2UgS2V5RXJyb3IoIiVz
IG5vdCBpbiBvYmplY3QgbGlzdCIgJSBvYmopCisJCSMgRGV0ZXJtaW5lIHRoZSBvYmpfa2V5IGFu
ZCB0aGUgc2V0IG9mIG9iamVjdHMgbWF0Y2hpbmcgdGhlIGFyZ3VtZW50cy4KKwkJaWYgb2JqIGlz
IG5vdCBOb25lOgorCQkJb2JqcyA9IHNldChbb2JqXSkKKwkJCW9ial9rZXkgPSBzZWxmLl9vYmpf
a2V5X2NhY2hlLmdldChvYmopCisJCQlpZiBvYmpfa2V5IG5vdCBpbiBzZWxmLl9vYmpfcHJvcGVy
dGllczoKKwkJCQlvYmpfa2V5ID0gc2VsZi5fZ2VuZXJhdGVPYmpLZXkob2JqKQorCQkJCWlmIG9i
al9rZXkgbm90IGluIHNlbGYuX29ial9wcm9wZXJ0aWVzOgorCQkJCQlyYWlzZSBLZXlFcnJvcigi
JXMgKCVzKSBub3QgaW4gb2JqZWN0IGxpc3QiICUgKG9ial9rZXksIG9iaikpCisJCWVsc2U6CisJ
CQlpZiBvYmpfa2V5IG5vdCBpbiBzZWxmLl9vYmpfcHJvcGVydGllczoKKwkJCQlyYWlzZSBLZXlF
cnJvcigiJXMgbm90IGluIG9iamVjdCBsaXN0IiAlIG9ial9rZXkpCisJCQlvYmpzID0gc2VsZi5f
b2JqX3Byb3BlcnRpZXNbb2JqX2tleV1bNF0KKworCQkjIERldGVybWluZSB0aGUgZGlyZWN0b3J5
KGllcykgZnJvbSB0aGUgc2V0IG9mIG9iamVjdHMuCisJCW9ianNfZGlycyA9IHNldChbb3MucGF0
aC5kaXJuYW1lKHgpIGZvciB4IGluIG9ianNdKQogCiAJCSMgSWYgdGhlcmUgaXMgYW5vdGhlciB2
ZXJzaW9uIG9mIHRoaXMgbGliIHdpdGggdGhlCiAJCSMgc2FtZSBzb25hbWUgYW5kIHRoZSBtYXN0
ZXIgbGluayBwb2ludHMgdG8gdGhhdAogCQkjIG90aGVyIHZlcnNpb24sIHRoaXMgbGliIHdpbGwg
YmUgc2hhZG93ZWQgYW5kIHdvbid0CiAJCSMgaGF2ZSBhbnkgY29uc3VtZXJzLgotCQlhcmNoLCBu
ZWVkZWQsIHBhdGgsIHNvbmFtZSA9IHNlbGYuX29ial9wcm9wZXJ0aWVzW29ial0KLQkJb2JqX2Rp
ciA9IG9zLnBhdGguZGlybmFtZShvYmopCi0JCW1hc3Rlcl9saW5rID0gb3MucGF0aC5qb2luKG9i
al9kaXIsIHNvbmFtZSkKLQkJdHJ5OgotCQkJbWFzdGVyX3N0ID0gb3Muc3RhdChtYXN0ZXJfbGlu
aykKLQkJCW9ial9zdCA9IG9zLnN0YXQob2JqKQotCQlleGNlcHQgT1NFcnJvcjoKLQkJCXBhc3MK
LQkJZWxzZToKLQkJCWlmIChvYmpfc3Quc3RfZGV2LCBvYmpfc3Quc3RfaW5vKSAhPSBcCi0JCQkJ
KG1hc3Rlcl9zdC5zdF9kZXYsIG1hc3Rlcl9zdC5zdF9pbm8pOgotCQkJCXJldHVybiBzZXQoKQot
Ci0JCXJWYWx1ZSA9IHNldCgpCi0JCWZvciBzb25hbWUgaW4gc2VsZi5fbGliczoKLQkJCWZvciBh
cmNoIGluIHNlbGYuX2xpYnNbc29uYW1lXToKLQkJCQlpZiBvYmogaW4gc2VsZi5fbGlic1tzb25h
bWVdW2FyY2hdWyJwcm92aWRlcnMiXToKLQkJCQkJZm9yIHggaW4gc2VsZi5fbGlic1tzb25hbWVd
W2FyY2hdWyJjb25zdW1lcnMiXToKLQkJCQkJCXBhdGggPSBzZWxmLl9vYmpfcHJvcGVydGllc1t4
XVsyXQotCQkJCQkJcGF0aCA9IFtyZWFscGF0aCh5KSBmb3IgeSBpbiBwYXRoK3NlbGYuX2RlZnBh
dGhdCi0JCQkJCQlpZiBzb25hbWVbMF0gPT0gb3Muc2VwIGFuZCByZWFscGF0aChzb25hbWUpID09
IHJlYWxwYXRoKG9iaik6Ci0JCQkJCQkJclZhbHVlLmFkZCh4KQotCQkJCQkJZWxpZiByZWFscGF0
aChvYmpfZGlyKSBpbiBwYXRoOgotCQkJCQkJCXJWYWx1ZS5hZGQoeCkKKwkJaWYgb2JqIGlzIG5v
dCBOb25lOgorCQkJc29uYW1lID0gc2VsZi5fb2JqX3Byb3BlcnRpZXNbb2JqX2tleV1bM10KKwkJ
CW9ial9kaXIgPSBvcy5wYXRoLmRpcm5hbWUob2JqKQorCQkJbWFzdGVyX2xpbmsgPSBvcy5wYXRo
LmpvaW4ob2JqX2Rpciwgc29uYW1lKQorCQkJdHJ5OgorCQkJCW1hc3Rlcl9zdCA9IG9zLnN0YXQo
bWFzdGVyX2xpbmspCisJCQkJb2JqX3N0ID0gb3Muc3RhdChvYmopCisJCQlleGNlcHQgT1NFcnJv
cjoKKwkJCQlwYXNzCisJCQllbHNlOgorCQkJCWlmIChvYmpfc3Quc3RfZGV2LCBvYmpfc3Quc3Rf
aW5vKSAhPSBcCisJCQkJCShtYXN0ZXJfc3Quc3RfZGV2LCBtYXN0ZXJfc3Quc3RfaW5vKToKKwkJ
CQkJcmV0dXJuIHNldCgpCisKKwkJYXJjaCwgXywgXywgc29uYW1lLCBfID0gc2VsZi5fb2JqX3By
b3BlcnRpZXNbb2JqX2tleV0KKwkJaWYgc29uYW1lIGluIHNlbGYuX2xpYnMgYW5kIGFyY2ggaW4g
c2VsZi5fbGlic1tzb25hbWVdOgorCQkJIyBGb3IgZWFjaCBwb3RlbnRpYWwgY29uc3VtZXIsIGFk
ZCBpdCB0byByVmFsdWUgaWYgYW4gb2JqZWN0IGZyb20gdGhlCisJCQkjIGFyZ3VtZW50cyByZXNp
ZGVzIGluIHRoZSBjb25zdW1lcidzIHJ1bnBhdGguCisJCQlmb3IgY29uc3VtZXJfa2V5IGluIHNl
bGYuX2xpYnNbc29uYW1lXVthcmNoXVsiY29uc3VtZXJzIl06CisJCQkJXywgXywgcGF0aCwgXywg
Y29uc3VtZXJfb2JqcyA9IFwKKwkJCQkJCXNlbGYuX29ial9wcm9wZXJ0aWVzW2NvbnN1bWVyX2tl
eV0KKwkJCQlwYXRoID0gcGF0aC51bmlvbihzZWxmLl9kZWZwYXRoKQorCQkJCWlmIG9ianNfZGly
cy5pbnRlcnNlY3Rpb24ocGF0aCk6CisJCQkJCXJWYWx1ZS51cGRhdGUoY29uc3VtZXJfb2JqcykK
IAkJcmV0dXJuIHJWYWx1ZQotCQkJCQkKKwogY2xhc3MgdmFyZGJhcGkoZGJhcGkpOgogCiAJX2V4
Y2x1ZGVkX2RpcnMgPSBbIkNWUyIsICJsb3N0K2ZvdW5kIl0K
------=_Part_54009_27571114.1219288185481
Content-Type: application/octet-stream; name=sets.conf.2.2_rc8.patch
Content-Transfer-Encoding: base64
X-Attachment-Id: f_fk4q20hw2
Content-Disposition: attachment; filename=sets.conf.2.2_rc8.patch

LS0tIHNldHMuY29uZi4yLjJfcmM4CTIwMDgtMDgtMTQgMTU6NDY6MjAuMDAwMDAwMDAwIC0wNTAw
CisrKyAvdXNyL3NoYXJlL3BvcnRhZ2UvY29uZmlnL3NldHMuY29uZgkyMDA4LTA4LTE0IDE1OjU2
OjE4LjAwMDAwMDAwMCAtMDUwMApAQCAtNjMsMyArNjMsOCBAQAogW2Rvd25ncmFkZV0KIGNsYXNz
ID0gcG9ydGFnZS5zZXRzLmRiYXBpLkRvd25ncmFkZVNldAogd29ybGQtY2FuZGlkYXRlID0gRmFs
c2UKKworIyBQYWNrYWdlcyB0byByZWJ1aWxkIGJyb2tlbiBsaWJyYXJ5IGRlcGVuZGVuY2llcy4K
K1ttaXNzaW5nLXJlYnVpbGRdCitjbGFzcyA9IHBvcnRhZ2Uuc2V0cy5saWJzLk1pc3NpbmdMaWJy
YXJ5Q29uc3VtZXJTZXQKK3dvcmxkLWNhbmRpZGF0ZSA9IEZhbHNlCg==
------=_Part_54009_27571114.1219288185481--