From mboxrd@z Thu Jan  1 00:00:00 1970
Return-Path: <pbs-devel-bounces@lists.proxmox.com>
Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9])
	by lore.proxmox.com (Postfix) with ESMTPS id EB4831FF15C
	for <inbox@lore.proxmox.com>; Wed, 26 Mar 2025 11:04:01 +0100 (CET)
Received: from firstgate.proxmox.com (localhost [127.0.0.1])
	by firstgate.proxmox.com (Proxmox) with ESMTP id 6ED7232FFF;
	Wed, 26 Mar 2025 11:03:55 +0100 (CET)
From: Christian Ebner <c.ebner@proxmox.com>
To: pbs-devel@lists.proxmox.com
Date: Wed, 26 Mar 2025 11:03:32 +0100
Message-Id: <20250326100333.116722-5-c.ebner@proxmox.com>
X-Mailer: git-send-email 2.39.5
In-Reply-To: <20250326100333.116722-1-c.ebner@proxmox.com>
References: <20250326100333.116722-1-c.ebner@proxmox.com>
MIME-Version: 1.0
X-SPAM-LEVEL: Spam detection results:  0
 AWL 0.031 Adjusted score from AWL reputation of From: address
 BAYES_00                 -1.9 Bayes spam probability is 0 to 1%
 DMARC_MISSING             0.1 Missing DMARC policy
 KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment
 SPF_HELO_NONE           0.001 SPF: HELO does not publish an SPF Record
 SPF_PASS               -0.001 SPF: sender matches SPF record
Subject: [pbs-devel] [PATCH v5 proxmox-backup 4/5] garbage collection:
 generate index file list via datastore iterators
X-BeenThere: pbs-devel@lists.proxmox.com
X-Mailman-Version: 2.1.29
Precedence: list
List-Id: Proxmox Backup Server development discussion
 <pbs-devel.lists.proxmox.com>
List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=unsubscribe>
List-Archive: <http://lists.proxmox.com/pipermail/pbs-devel/>
List-Post: <mailto:pbs-devel@lists.proxmox.com>
List-Help: <mailto:pbs-devel-request@lists.proxmox.com?subject=help>
List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel>, 
 <mailto:pbs-devel-request@lists.proxmox.com?subject=subscribe>
Reply-To: Proxmox Backup Server development discussion
 <pbs-devel@lists.proxmox.com>
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: base64
Errors-To: pbs-devel-bounces@lists.proxmox.com
Sender: "pbs-devel" <pbs-devel-bounces@lists.proxmox.com>

SW5zdGVhZCBvZiBpdGVyYXRpbmcgb3ZlciBhbGwgaW5kZXggZmlsZXMgZm91bmQgaW4gdGhlIGRh
dGFzdG9yZSBpbgphbiB1bnN0cnVjdHVyZWQgbWFubmVyLCB1c2UgdGhlIGRhdGFzdG9yZSBpdGVy
YXRvcnMgdG8gbG9naWNhbGx5Cml0ZXJhdGUgb3ZlciB0aGVtIGFzIG90aGVyIGRhdGFzdG9yZSBv
cGVyYXRpb25zIHdpbGwuCgpUaGlzIGFsbG93cyB0byBiZXR0ZXIgZGlzdGluZ3Vpc2ggaW5kZXgg
ZmlsZXMgaW4gdW5leHBlY3RlZCBsb2NhdGlvbnMKZnJvbSBvbmVzIGluIHRoZWlyIGV4cGVjdGVk
IGxvY2F0aW9uLCB3YXJuaW5nIHRoZSB1c2VyIG9mIHVuZXhwZWN0ZWQKb25lcyB0byBhbGxvdyB0
byBhY3Qgb24gcG9zc2libGUgbWlzc2NvbmZpZ3VyYXRpb25zLiBGdXJ0aGVyLCB0aGlzCndpbGwg
YWxsb3cgdG8gaW50ZWdyYXRlIG1hcmtpbmcgb2Ygc25hcHNob3RzIHdpdGggbWlzc2luZyBjaHVu
a3MgYXMKaW5jb21wbGV0ZS9jb3JydXB0IG1vcmUgZWFzaWx5IGFuZCBoZWxwcyBpbXByb3ZlIGNh
Y2hlIGhpdHMgd2hlbgppbnRyb2R1Y2luZyBMUlUgY2FjaGluZyB0byBhdm9pZCBtdWx0aXBsZSBh
dGltZSB1cGRhdGVzIGluIHBoYXNlIDEgb2YKZ2FyYmFnZSBjb2xsZWN0aW9uLgoKVGhpcyBub3cg
aXRlcmF0ZXMgdHdpY2Ugb3ZlciB0aGUgaW5kZXggZmlsZXMsIGFzIGluZGljZXMgaW4KdW5leHBl
Y3RlZCBsb2NhdGlvbnMgYXJlIHN0aWxsIGNvbnNpZGVyZWQgYnkgZ2VuZXJhdGluZyB0aGUgbGlz
dCBvZgphbGwgaW5kZXggZmlsZXMgdG8gYmUgZm91bmQgaW4gdGhlIGRhdGFzdG9yZSBhbmQgcmVt
b3ZpbmcgcmVndWxhcgppbmRleCBmaWxlcyBmcm9tIHRoYXQgbGlzdCwgbGVhdmluZyB1bmV4cGVj
dGVkIG9uZXMgYmVoaW5kLgoKRnVydGhlciwgYWxpZ24gdGVybWlub2xvZ3kgYnkgcmVuYW1pbmcg
dGhlIGBsaXN0X2ltYWdlc2AgbWV0aG9kIHRvCmEgbW9yZSBmaXR0aW5nIGBsaXN0X2luZGV4X2Zp
bGVzYCBhbmQgdGhlIHZhcmlhYmxlIG5hbWVzIGFjY29yZGluZ2x5LgoKVGhpcyB3aWxsIHJlZHVj
ZSBwb3NzaWJsZSBjb25mdXNpb24gc2luY2UgdGhyb3VnaG91dCB0aGUgY29kZWJhc2UgYW5kCmlu
IHRoZSBkb2N1bWVudGF0aW9uIGZpbGVzIHJlZmVyZW5jaW5nIHRoZSBkYXRhIGNodW5rcyBhcmUg
cmVmZXJyZWQKdG8gYXMgaW5kZXggZmlsZXMuIFRoZSB0ZXJtIGltYWdlIG9uIHRoZSBvdGhlciBo
YW5kIGlzIGFzc29jaWF0ZWQKd2l0aCB2aXJ0dWFsIG1hY2hpbmUgaW1hZ2VzIGFuZCBvdGhlciBs
YXJnZSBiaW5hcnkgZGF0YSBzdG9yZWQgYXMKZml4ZWQtc2l6ZSBjaHVua3MuCgpCYXNpYyBiZW5j
aG1hcmtpbmc6CgpUb3RhbCBHQyBydW50aW1lIHNob3dzIG5vIHNpZ25pZmljYXRuIGNoYW5nZSAo
YXZlcmFnZSBvZiAzIHJ1bnMpOgp1bnBhdGNoZWQ6IDE1NS40IMKxIDIuNiBzCnBhdGNoZWQ6ICAg
MTU1LjQgwrEgMy41IHMKClZtUGVhayBtZWFzdXJlZCB2aWEgL3Byb2Mvc2VsZi9zdGF0dXMgYmVm
b3JlIGFuZCBhZnRlcgpgbWFya191c2VkX2NodW5rc2AgKHByb3htb3gtYmFja3VwLXByb3h5IHdh
cyByZXN0YXJ0ZWQgaW4gYmV0d2Vlbgpmb3Igbm9ybWFsaXphdGlvbiwgbm8gY2hhbmdlcyBmb3Ig
YWxsIDMgcnVucyk6CnVucGF0Y2hlZCBiZWZvcmU6IDExOTYwMzIga0IKdW5wYXRjaGVkIGFmdGVy
OiAgMTE5NjAzMiBrQgoKcGF0Y2hlZCBiZWZvcmU6IDExOTYwMjgga0IKcGF0Y2hlZCBhZnRlcjog
IDExOTYwMjgga0IKCkxpc3QgaW1hZ2Ugc2hvd3MgYSBzbGlnaHQgaW5jcmVhc2UgZHVlIHRvIHRo
ZSBzd2l0Y2ggdG8gYSBIYXNoU2V0CihhdmVyYWdlIG9mIDMgcnVucyk6CnVucGF0Y2hlZDogNjQu
MiDCsSA4LjQgbXMKcGF0Y2hlZDogICA3Mi44IMKxIDMuNyBtcwoKRGVzY3JpcHRpb24gb2YgdGhl
IFBCUyBob3N0IGFuZCBkYXRhc3RvcmU6CkNQVTogSW50ZWwgWGVvbiBFNS0yNjIwCkRhdGFzdG9y
ZSBiYWNraW5nIHN0b3JhZ2U6IFpGUyBSQUlEIDEwIHdpdGggMyBtaXJyb3JzIG9mIDJ4ClNUMTYw
MDBOTTAwMUcsIG1pcnJvciBvZiAyeCBTQU1TVU5HX01aMUxCMVQ5SEFMUyBhcyBzcGVjaWFsCgpO
YW1lc3BhY2VzOiA0NQpHcm91cHM6IDE4MgpTbmFwc2hvdHM6IDMxODQKSW5kZXggZmlsZXM6IDY4
NzUKRGVkdXBsaWNhdGlvbiBmYWN0b3I6IDQ0LjU0CgpPcmlnaW5hbCBkYXRhIHVzYWdlOiAxMjAu
NzQyIFRpQgpPbi1EaXNrIHVzYWdlOiAyLjcxMSBUaUIgKDIuMjUlKQpPbi1EaXNrIGNodW5rczog
MTQ5NDcyNwpBdmVyYWdlIGNodW5rIHNpemU6IDEuOTAyIE1pQgoKRGlzdHJpYnV0aW9uIG9mIHNu
YXBzaG90cyAoYmlubmVkIGJ5IG1vbnRoKToKMjAyMy0xMQkxMQoyMDIzLTEyCTE2CjIwMjQtMDEJ
MzAKMjAyNC0wMgkzOAoyMDI0LTAzCTE3CjIwMjQtMDQJMzcKMjAyNC0wNQkxNwoyMDI0LTA2CTU5
CjIwMjQtMDcJOTkKMjAyNC0wOAk5NgoyMDI0LTA5CTExNQoyMDI0LTEwCTM1CjIwMjQtMTEJNDIK
MjAyNC0xMgkzNwoyMDI1LTAxCTE2MgoyMDI1LTAyCTQ4OQoyMDI1LTAzCTE4ODQKClNpZ25lZC1v
ZmYtYnk6IENocmlzdGlhbiBFYm5lciA8Yy5lYm5lckBwcm94bW94LmNvbT4KLS0tCmNoYW5nZXMg
c2luY2UgdmVyc2lvbiA0OgotIGV4dGVuZGVkIGNvbW1pdCBtZXNzYWdlCgogcGJzLWRhdGFzdG9y
ZS9zcmMvZGF0YXN0b3JlLnJzIHwgMTA0ICsrKysrKysrKysrKysrKysrKysrKystLS0tLS0tLS0t
LQogMSBmaWxlIGNoYW5nZWQsIDcwIGluc2VydGlvbnMoKyksIDM0IGRlbGV0aW9ucygtKQoKZGlm
ZiAtLWdpdCBhL3Bicy1kYXRhc3RvcmUvc3JjL2RhdGFzdG9yZS5ycyBiL3Bicy1kYXRhc3RvcmUv
c3JjL2RhdGFzdG9yZS5ycwppbmRleCA2YzMwNDZmZjYuLjhjZTk4ZjFiMyAxMDA2NDQKLS0tIGEv
cGJzLWRhdGFzdG9yZS9zcmMvZGF0YXN0b3JlLnJzCisrKyBiL3Bicy1kYXRhc3RvcmUvc3JjL2Rh
dGFzdG9yZS5ycwpAQCAtMjUsNyArMjUsNyBAQCB1c2UgcGJzX2FwaV90eXBlczo6ewogICAgIE1h
aW50ZW5hbmNlTW9kZSwgTWFpbnRlbmFuY2VUeXBlLCBPcGVyYXRpb24sIFVQSUQsCiB9OwogCi11
c2UgY3JhdGU6OmJhY2t1cF9pbmZvOjp7QmFja3VwRGlyLCBCYWNrdXBHcm91cH07Cit1c2UgY3Jh
dGU6OmJhY2t1cF9pbmZvOjp7QmFja3VwRGlyLCBCYWNrdXBHcm91cCwgQmFja3VwSW5mb307CiB1
c2UgY3JhdGU6OmNodW5rX3N0b3JlOjpDaHVua1N0b3JlOwogdXNlIGNyYXRlOjpkeW5hbWljX2lu
ZGV4Ojp7RHluYW1pY0luZGV4UmVhZGVyLCBEeW5hbWljSW5kZXhXcml0ZXJ9OwogdXNlIGNyYXRl
OjpmaXhlZF9pbmRleDo6e0ZpeGVkSW5kZXhSZWFkZXIsIEZpeGVkSW5kZXhXcml0ZXJ9OwpAQCAt
OTcwLDEwICs5NzAsMTUgQEAgaW1wbCBEYXRhU3RvcmUgewogICAgICAgICBMaXN0R3JvdXBzOjpu
ZXcoQXJjOjpjbG9uZShzZWxmKSwgbnMpPy5jb2xsZWN0KCkKICAgICB9CiAKLSAgICBmbiBsaXN0
X2ltYWdlcygmc2VsZikgLT4gUmVzdWx0PFZlYzxQYXRoQnVmPiwgRXJyb3I+IHsKKyAgICAvLy8g
TG9va3VwIGFsbCBpbmRleCBmaWxlcyB0byBiZSBmb3VuZCBpbiB0aGUgZGF0YXN0b3JlIHdpdGhv
dXQgdGFraW5nIGFueSBsb2dpY2FsIGl0ZXJhdGlvbgorICAgIC8vLyBpbnRvIGFjY291bnQuCisg
ICAgLy8vIFRoZSBmaWxlc3lzdGVtIGlzIHdhbGtlZCByZWN1cnNldmx5IHRvIGRldGVjdCBpbmRl
eCBmaWxlcyBiYXNlZCBvbiB0aGVpciBhcmNoaXZlIHR5cGUgYmFzZWQKKyAgICAvLy8gb24gdGhl
IGZpbGVuYW1lLiBUaGlzIGhvd2V2ZXIgZXhjbHVkZXMgdGhlIGNodW5rcyBmb2xkZXIsIGhpZGRl
biBmaWxlcyBhbmQgZG9lcyBub3QgZm9sbG93CisgICAgLy8vIHN5bWxpbmtzLgorICAgIGZuIGxp
c3RfaW5kZXhfZmlsZXMoJnNlbGYpIC0+IFJlc3VsdDxIYXNoU2V0PFBhdGhCdWY+LCBFcnJvcj4g
ewogICAgICAgICBsZXQgYmFzZSA9IHNlbGYuYmFzZV9wYXRoKCk7CiAKLSAgICAgICAgbGV0IG11
dCBsaXN0ID0gdmVjIVtdOworICAgICAgICBsZXQgbXV0IGxpc3QgPSBIYXNoU2V0OjpuZXcoKTsK
IAogICAgICAgICB1c2Ugd2Fsa2Rpcjo6V2Fsa0RpcjsKIApAQCAtMTAyMSw3ICsxMDI2LDcgQEAg
aW1wbCBEYXRhU3RvcmUgewogICAgICAgICAgICAgICAgIGlmIGFyY2hpdmVfdHlwZSA9PSBBcmNo
aXZlVHlwZTo6Rml4ZWRJbmRleAogICAgICAgICAgICAgICAgICAgICB8fCBhcmNoaXZlX3R5cGUg
PT0gQXJjaGl2ZVR5cGU6OkR5bmFtaWNJbmRleAogICAgICAgICAgICAgICAgIHsKLSAgICAgICAg
ICAgICAgICAgICAgbGlzdC5wdXNoKHBhdGgpOworICAgICAgICAgICAgICAgICAgICBsaXN0Lmlu
c2VydChwYXRoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0K
QEAgLTExMDcsNDQgKzExMTIsNzUgQEAgaW1wbCBEYXRhU3RvcmUgewogICAgICAgICBzdGF0dXM6
ICZtdXQgR2FyYmFnZUNvbGxlY3Rpb25TdGF0dXMsCiAgICAgICAgIHdvcmtlcjogJmR5biBXb3Jr
ZXJUYXNrQ29udGV4dCwKICAgICApIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKLSAgICAgICAgbGV0
IGltYWdlX2xpc3QgPSBzZWxmLmxpc3RfaW1hZ2VzKCk/OwotICAgICAgICBsZXQgaW1hZ2VfY291
bnQgPSBpbWFnZV9saXN0LmxlbigpOwotCisgICAgICAgIC8vIEl0ZXJhdGUgdHdpY2Ugb3ZlciB0
aGUgZGF0YXN0b3JlIHRvIGZldGNoIGluZGV4IGZpbGVzLCBldmVuIGlmIHRoaXMgY29tZXMgd2l0
aCBhbgorICAgICAgICAvLyBhZGRpdGlvbmFsIHJ1bnRpbWUgY29zdDoKKyAgICAgICAgLy8gLSBG
aXJzdCBpdGVyYXRpb24gdG8gZmluZCBhbGwgaW5kZXggZmlsZXMsIG5vIG1hdHRlciBpZiB0aGV5
IGFyZSBpbiBhIGxvY2F0aW9uIGV4cGVjdGVkCisgICAgICAgIC8vICAgYnkgdGhlIGRhdGFzdG9y
ZSdzIGhpZXJhcmNoeQorICAgICAgICAvLyAtIEl0ZXJhdGUgdXNpbmcgdGhlIGRhdGFzdG9yZSdz
IGhlbHBlcnMsIHNvIHRoZSBuYW1lc3BhY2VzLCBncm91cHMgYW5kIHNuYXBzaG90cyBhcmUKKyAg
ICAgICAgLy8gICBsb29rZWQgdXAgZ2l2ZW4gdGhlIGV4cGVjdGVkIGhpZXJhcmNoeSBhbmQgaXRl
cmF0b3IgbG9naWMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQnkgdGhpcyBpdCBpcyBhc3N1cmVk
IHRoYXQgYWxsIGluZGV4IGZpbGVzIGFyZSB1c2VkLCBldmVuIGlmIHRoZXkgd291bGQgbm90IGhh
dmUgYmVlbgorICAgICAgICAvLyBzZWVuIGJ5IHRoZSByZWd1bGFyIGxvZ2ljIGFuZCB0aGUgdXNl
ciBpcyBpbmZvcm1lZCBieSB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uIHJ1biBhYm91dAorICAgICAg
ICAvLyB0aGUgZGV0ZWN0ZWQgaW5kZXggZmlsZXMgbm90IGZvbGxvd2luZyB0aGUgaXRlcmF0b3Jz
IGxvZ2ljLgorCisgICAgICAgIGxldCBtdXQgdW5wcm9jZXNzZWRfaW5kZXhfbGlzdCA9IHNlbGYu
bGlzdF9pbmRleF9maWxlcygpPzsKKyAgICAgICAgbGV0IGluZGV4X2NvdW50ID0gdW5wcm9jZXNz
ZWRfaW5kZXhfbGlzdC5sZW4oKTsKKworICAgICAgICBsZXQgbXV0IHByb2Nlc3NlZF9pbmRleF9m
aWxlcyA9IDA7CiAgICAgICAgIGxldCBtdXQgbGFzdF9wZXJjZW50YWdlOiB1c2l6ZSA9IDA7CiAK
LSAgICAgICAgbGV0IG11dCBzdHJhbmdlX3BhdGhzX2NvdW50OiB1NjQgPSAwOwotCi0gICAgICAg
IGZvciAoaSwgaW1nKSBpbiBpbWFnZV9saXN0LmludG9faXRlcigpLmVudW1lcmF0ZSgpIHsKLSAg
ICAgICAgICAgIHdvcmtlci5jaGVja19hYm9ydCgpPzsKLSAgICAgICAgICAgIHdvcmtlci5mYWls
X29uX3NodXRkb3duKCk/OwotCi0gICAgICAgICAgICBpZiBsZXQgU29tZShiYWNrdXBfZGlyX3Bh
dGgpID0gaW1nLnBhcmVudCgpIHsKLSAgICAgICAgICAgICAgICBsZXQgYmFja3VwX2Rpcl9wYXRo
ID0gYmFja3VwX2Rpcl9wYXRoLnN0cmlwX3ByZWZpeChzZWxmLmJhc2VfcGF0aCgpKT87Ci0gICAg
ICAgICAgICAgICAgaWYgbGV0IFNvbWUoYmFja3VwX2Rpcl9zdHIpID0gYmFja3VwX2Rpcl9wYXRo
LnRvX3N0cigpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgcGJzX2FwaV90eXBlczo6cGFyc2Vf
bnNfYW5kX3NuYXBzaG90KGJhY2t1cF9kaXJfc3RyKS5pc19lcnIoKSB7Ci0gICAgICAgICAgICAg
ICAgICAgICAgICBzdHJhbmdlX3BhdGhzX2NvdW50ICs9IDE7CisgICAgICAgIGxldCBhcmNfc2Vs
ZiA9IEFyYzo6bmV3KHNlbGYuY2xvbmUoKSk7CisgICAgICAgIGZvciBuYW1lc3BhY2UgaW4gYXJj
X3NlbGYKKyAgICAgICAgICAgIC5yZWN1cnNpdmVfaXRlcl9iYWNrdXBfbnMoQmFja3VwTmFtZXNw
YWNlOjpyb290KCkpCisgICAgICAgICAgICAuY29udGV4dCgiY3JlYXRpbmcgbmFtZXNwYWNlIGl0
ZXJhdG9yIGZhaWxlZCIpPworICAgICAgICB7CisgICAgICAgICAgICBsZXQgbmFtZXNwYWNlID0g
bmFtZXNwYWNlLmNvbnRleHQoIml0ZXJhdGluZyBuYW1lc3BhY2VzIGZhaWxlZCIpPzsKKyAgICAg
ICAgICAgIGZvciBncm91cCBpbiBhcmNfc2VsZi5pdGVyX2JhY2t1cF9ncm91cHMobmFtZXNwYWNl
KT8geworICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGdyb3VwLmNvbnRleHQoIml0ZXJhdGlu
ZyBiYWNrdXAgZ3JvdXBzIGZhaWxlZCIpPzsKKyAgICAgICAgICAgICAgICBsZXQgbXV0IHNuYXBz
aG90cyA9IGdyb3VwLmxpc3RfYmFja3VwcygpLmNvbnRleHQoImxpc3Rpbmcgc25hcHNob3RzIGZh
aWxlZCIpPzsKKyAgICAgICAgICAgICAgICAvLyBTb3J0IGJ5IHNuYXBzaG90IHRpbWVzdGFtcCB0
byBpdGVyYXRlIG92ZXIgY29uc2VjdXRpdmUgc25hcHNob3RzIGZvciBlYWNoIGltYWdlLgorICAg
ICAgICAgICAgICAgIEJhY2t1cEluZm86OnNvcnRfbGlzdCgmbXV0IHNuYXBzaG90cywgdHJ1ZSk7
CisgICAgICAgICAgICAgICAgZm9yIHNuYXBzaG90IGluIHNuYXBzaG90cyB7CisgICAgICAgICAg
ICAgICAgICAgIGZvciBmaWxlIGluIHNuYXBzaG90LmZpbGVzIHsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHdvcmtlci5jaGVja19hYm9ydCgpPzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdv
cmtlci5mYWlsX29uX3NodXRkb3duKCk/OworCisgICAgICAgICAgICAgICAgICAgICAgICBsZXQg
bXV0IHBhdGggPSBzbmFwc2hvdC5iYWNrdXBfZGlyLmZ1bGxfcGF0aCgpOworICAgICAgICAgICAg
ICAgICAgICAgICAgcGF0aC5wdXNoKGZpbGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBs
ZXQgaW5kZXggPSBtYXRjaCBzZWxmLm9wZW5faW5kZXhfcmVhZGVyKCZwYXRoKT8geworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFNvbWUoaW5kZXgpID0+IGluZGV4LAorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIE5vbmUgPT4gY29udGludWUsCisgICAgICAgICAgICAgICAgICAgICAg
ICB9OworICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pbmRleF9tYXJrX3VzZWRfY2h1bmtz
KGluZGV4LCAmcGF0aCwgc3RhdHVzLCB3b3JrZXIpPzsKKworICAgICAgICAgICAgICAgICAgICAg
ICAgdW5wcm9jZXNzZWRfaW5kZXhfbGlzdC5yZW1vdmUoJnBhdGgpOworCisgICAgICAgICAgICAg
ICAgICAgICAgICBsZXQgcGVyY2VudGFnZSA9IChwcm9jZXNzZWRfaW5kZXhfZmlsZXMgKyAxKSAq
IDEwMCAvIGluZGV4X2NvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgcGVyY2VudGFn
ZSA+IGxhc3RfcGVyY2VudGFnZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mbyEo
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXJrZWQge3BlcmNlbnRhZ2V9JSAo
e30gb2Yge2luZGV4X2NvdW50fSBpbmRleCBmaWxlcykiLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBwcm9jZXNzZWRfaW5kZXhfZmlsZXMgKyAxLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdF9wZXJjZW50YWdl
ID0gcGVyY2VudGFnZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICAgICAgICAgIHByb2Nlc3NlZF9pbmRleF9maWxlcyArPSAxOwogICAgICAgICAgICAgICAgICAg
ICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiBs
ZXQgU29tZShpbmRleCkgPSBzZWxmLm9wZW5faW5kZXhfcmVhZGVyKCZpbWcpPyB7Ci0gICAgICAg
ICAgICAgICAgc2VsZi5pbmRleF9tYXJrX3VzZWRfY2h1bmtzKGluZGV4LCAmaW1nLCBzdGF0dXMs
IHdvcmtlcik/OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsZXQgcGVyY2VudGFnZSA9
IChpICsgMSkgKiAxMDAgLyBpbWFnZV9jb3VudDsKLSAgICAgICAgICAgIGlmIHBlcmNlbnRhZ2Ug
PiBsYXN0X3BlcmNlbnRhZ2UgewotICAgICAgICAgICAgICAgIGluZm8hKAotICAgICAgICAgICAg
ICAgICAgICAibWFya2VkIHtwZXJjZW50YWdlfSUgKHt9IG9mIHtpbWFnZV9jb3VudH0gaW5kZXgg
ZmlsZXMpIiwKLSAgICAgICAgICAgICAgICAgICAgaSArIDEsCi0gICAgICAgICAgICAgICAgKTsK
LSAgICAgICAgICAgICAgICBsYXN0X3BlcmNlbnRhZ2UgPSBwZXJjZW50YWdlOwotICAgICAgICAg
ICAgfQogICAgICAgICB9CiAKKyAgICAgICAgbGV0IHN0cmFuZ2VfcGF0aHNfY291bnQgPSB1bnBy
b2Nlc3NlZF9pbmRleF9saXN0LmxlbigpOwogICAgICAgICBpZiBzdHJhbmdlX3BhdGhzX2NvdW50
ID4gMCB7Ci0gICAgICAgICAgICBpbmZvISgKLSAgICAgICAgICAgICAgICAiZm91bmQgKGFuZCBt
YXJrZWQpIHtzdHJhbmdlX3BhdGhzX2NvdW50fSBpbmRleCBmaWxlcyBvdXRzaWRlIG9mIGV4cGVj
dGVkIGRpcmVjdG9yeSBzY2hlbWUiCi0gICAgICAgICAgICApOworICAgICAgICAgICAgd2FybiEo
ImZvdW5kIHtzdHJhbmdlX3BhdGhzX2NvdW50fSBpbmRleCBmaWxlcyBvdXRzaWRlIG9mIGV4cGVj
dGVkIGRpcmVjdG9yeSBzY2hlbWUiKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgcGF0aCBpbiB1
bnByb2Nlc3NlZF9pbmRleF9saXN0IHsKKyAgICAgICAgICAgIGxldCBpbmRleCA9IG1hdGNoIHNl
bGYub3Blbl9pbmRleF9yZWFkZXIoJnBhdGgpPyB7CisgICAgICAgICAgICAgICAgU29tZShpbmRl
eCkgPT4gaW5kZXgsCisgICAgICAgICAgICAgICAgTm9uZSA9PiBjb250aW51ZSwKKyAgICAgICAg
ICAgIH07CisgICAgICAgICAgICBzZWxmLmluZGV4X21hcmtfdXNlZF9jaHVua3MoaW5kZXgsICZw
YXRoLCBzdGF0dXMsIHdvcmtlcik/OworICAgICAgICAgICAgd2FybiEoIk1hcmtlZCBjaHVua3Mg
Zm9yIHVuZXhwZWN0ZWQgaW5kZXggZmlsZSBhdCAne3BhdGg6P30nIik7CiAgICAgICAgIH0KIAog
ICAgICAgICBPaygoKSkKLS0gCjIuMzkuNQoKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX19fX19fX19fX19fX19fXwpwYnMtZGV2ZWwgbWFpbGluZyBsaXN0CnBicy1kZXZlbEBsaXN0
cy5wcm94bW94LmNvbQpodHRwczovL2xpc3RzLnByb3htb3guY29tL2NnaS1iaW4vbWFpbG1hbi9s
aXN0aW5mby9wYnMtZGV2ZWwK