From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 52F501FF179 for ; Wed, 7 Jan 2026 10:15:19 +0100 (CET) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id CC7937058; Wed, 7 Jan 2026 10:16:06 +0100 (CET) From: Kefu Chai To: pve-devel@lists.proxmox.com Date: Tue, 6 Jan 2026 22:24:33 +0800 Message-ID: <20260106142440.2368585-10-k.chai@proxmox.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20260106142440.2368585-1-k.chai@proxmox.com> References: <20260106142440.2368585-1-k.chai@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1767709491788 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.171 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 URIBL_SBL_A 0.1 Contains URL's A record listed in the Spamhaus SBL blocklist [188.114.97.3, 188.114.96.3] X-Mailman-Approved-At: Wed, 07 Jan 2026 10:16:04 +0100 Subject: [pve-devel] [PATCH pve-cluster 09/15] pmxcfs-rs: add pmxcfs-ipc crate X-BeenThere: pve-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox VE development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox VE development discussion Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pve-devel-bounces@lists.proxmox.com Sender: "pve-devel" QWRkIGxpYnFiLWNvbXBhdGlibGUgSVBDIHNlcnZlciBpbXBsZW1lbnRhdGlvbjoKLSBRQl9JUENf U0hNIHByb3RvY29sIChzaGFyZWQgbWVtb3J5IHJpbmcgYnVmZmVycykKLSBBYnN0cmFjdCBVbml4 IHNvY2tldCAoQHB2ZTIpIGZvciBoYW5kc2hha2UKLSBMb2NrLWZyZWUgU1BTQyByaW5nIGJ1ZmZl cnMKLSBBdXRoZW50aWNhdGlvbiB2aWEgU09fUEFTU0NSRUQgKHVpZC9naWQvcGlkKQotIDEzIElQ QyBvcGVyYXRpb25zIChHRVRfRlNfVkVSU0lPTiwgR0VUX0NMVVNURVJfSU5GTywgZXRjLikKClRo aXMgaXMgYW4gaW5kZXBlbmRlbnQgY3JhdGUgd2l0aCBubyBpbnRlcm5hbCBkZXBlbmRlbmNpZXMs Cm9ubHkgcmVxdWlyaW5nIHRva2lvLCBuaXgsIGFuZCBtZW1tYXAyLiBJdCBwcm92aWRlcyB3aXJl LQpjb21wYXRpYmxlIElQQyB3aXRoIHRoZSBDIGltcGxlbWVudGF0aW9uJ3MgbGlicWItYmFzZWQg c2VydmVyLAphbGxvd2luZyBleGlzdGluZyBjbGllbnRzIHRvIHdvcmsgdW5jaGFuZ2VkLgoKSW5j bHVkZXMgd2lyZSBwcm90b2NvbCBjb21wYXRpYmlsaXR5IHRlc3RzIChyZXF1aXJlIHJvb3QgdG8g cnVuKS4KClNpZ25lZC1vZmYtYnk6IEtlZnUgQ2hhaSA8ay5jaGFpQHByb3htb3guY29tPgotLS0K IHNyYy9wbXhjZnMtcnMvQ2FyZ28udG9tbCAgICAgICAgICAgICAgICAgICAgICB8ICAgIDEgKwog c3JjL3BteGNmcy1ycy9wbXhjZnMtaXBjL0NhcmdvLnRvbWwgICAgICAgICAgIHwgICA0NCArCiBz cmMvcG14Y2ZzLXJzL3BteGNmcy1pcGMvUkVBRE1FLm1kICAgICAgICAgICAgfCAgMTgyICsrKwog Li4uL3BteGNmcy1pcGMvZXhhbXBsZXMvdGVzdF9zZXJ2ZXIucnMgICAgICAgIHwgICA5MiArKwog c3JjL3BteGNmcy1ycy9wbXhjZnMtaXBjL3NyYy9jb25uZWN0aW9uLnJzICAgIHwgIDY1NyArKysr KysrKysrCiBzcmMvcG14Y2ZzLXJzL3BteGNmcy1pcGMvc3JjL2hhbmRsZXIucnMgICAgICAgfCAg IDkzICsrCiBzcmMvcG14Y2ZzLXJzL3BteGNmcy1pcGMvc3JjL2xpYi5ycyAgICAgICAgICAgfCAg IDM3ICsKIHNyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy9zcmMvcHJvdG9jb2wucnMgICAgICB8ICAz MzIgKysrKysKIHNyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy9zcmMvcmluZ2J1ZmZlci5ycyAgICB8 IDExNTggKysrKysrKysrKysrKysrKysKIHNyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy9zcmMvc2Vy dmVyLnJzICAgICAgICB8ICAyNzggKysrKwogc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBjL3NyYy9z b2NrZXQucnMgICAgICAgIHwgICA4NCArKwogc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBjL3Rlc3Rz L2F1dGhfdGVzdC5ycyAgIHwgIDQ1MCArKysrKysrCiAuLi4vcG14Y2ZzLWlwYy90ZXN0cy9xYl93 aXJlX2NvbXBhdC5ycyAgICAgICAgfCAgNDEzICsrKysrKwogMTMgZmlsZXMgY2hhbmdlZCwgMzgy MSBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3BteGNmcy1ycy9wbXhjZnMt aXBjL0NhcmdvLnRvbWwKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvcG14Y2ZzLXJzL3BteGNmcy1p cGMvUkVBRE1FLm1kCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBj L2V4YW1wbGVzL3Rlc3Rfc2VydmVyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3BteGNmcy1y cy9wbXhjZnMtaXBjL3NyYy9jb25uZWN0aW9uLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL3Bt eGNmcy1ycy9wbXhjZnMtaXBjL3NyYy9oYW5kbGVyLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQgc3Jj L3BteGNmcy1ycy9wbXhjZnMtaXBjL3NyYy9saWIucnMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMv cG14Y2ZzLXJzL3BteGNmcy1pcGMvc3JjL3Byb3RvY29sLnJzCiBjcmVhdGUgbW9kZSAxMDA2NDQg c3JjL3BteGNmcy1ycy9wbXhjZnMtaXBjL3NyYy9yaW5nYnVmZmVyLnJzCiBjcmVhdGUgbW9kZSAx MDA2NDQgc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBjL3NyYy9zZXJ2ZXIucnMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBzcmMvcG14Y2ZzLXJzL3BteGNmcy1pcGMvc3JjL3NvY2tldC5ycwogY3JlYXRlIG1v ZGUgMTAwNjQ0IHNyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy90ZXN0cy9hdXRoX3Rlc3QucnMKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBzcmMvcG14Y2ZzLXJzL3BteGNmcy1pcGMvdGVzdHMvcWJfd2lyZV9j b21wYXQucnMKCmRpZmYgLS1naXQgYS9zcmMvcG14Y2ZzLXJzL0NhcmdvLnRvbWwgYi9zcmMvcG14 Y2ZzLXJzL0NhcmdvLnRvbWwKaW5kZXggYjAwY2E2OGYuLmY0NDk3ZDU4IDEwMDY0NAotLS0gYS9z cmMvcG14Y2ZzLXJzL0NhcmdvLnRvbWwKKysrIGIvc3JjL3BteGNmcy1ycy9DYXJnby50b21sCkBA IC05LDYgKzksNyBAQCBtZW1iZXJzID0gWwogICAgICJwbXhjZnMtc3RhdHVzIiwgICAgICMgU3Rh dHVzIG1vbml0b3JpbmcgYW5kIFJSRCBkYXRhIG1hbmFnZW1lbnQKICAgICAicG14Y2ZzLXRlc3Qt dXRpbHMiLCAjIFRlc3QgdXRpbGl0aWVzIGFuZCBoZWxwZXJzIChkZXYtb25seSkKICAgICAicG14 Y2ZzLXNlcnZpY2VzIiwgICAjIFNlcnZpY2UgZnJhbWV3b3JrIGZvciBhdXRvbWF0aWMgcmV0cnkg YW5kIGxpZmVjeWNsZSBtYW5hZ2VtZW50CisgICAgInBteGNmcy1pcGMiLCAgICAgICAgIyBsaWJx Yi1jb21wYXRpYmxlIElQQyBzZXJ2ZXIKIF0KIHJlc29sdmVyID0gIjIiCiAKZGlmZiAtLWdpdCBh L3NyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy9DYXJnby50b21sIGIvc3JjL3BteGNmcy1ycy9wbXhj ZnMtaXBjL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLmRi ZWUyZTlhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBjL0Nhcmdv LnRvbWwKQEAgLTAsMCArMSw0NCBAQAorW3BhY2thZ2VdCituYW1lID0gInBteGNmcy1pcGMiCitk ZXNjcmlwdGlvbiA9ICJsaWJxYi1jb21wYXRpYmxlIElQQyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24g aW4gcHVyZSBSdXN0IgorCit2ZXJzaW9uLndvcmtzcGFjZSA9IHRydWUKK2VkaXRpb24ud29ya3Nw YWNlID0gdHJ1ZQorYXV0aG9ycy53b3Jrc3BhY2UgPSB0cnVlCitsaWNlbnNlLndvcmtzcGFjZSA9 IHRydWUKK3JlcG9zaXRvcnkud29ya3NwYWNlID0gdHJ1ZQorCitbbGludHNdCit3b3Jrc3BhY2Ug PSB0cnVlCisKKyMgU3lzdGVtIGRlcGVuZGVuY2llczoKKyMgLSBsaWJxYiAocnVudGltZSkgLSBR QiBJUEMgbGlicmFyeSBmb3IgY2xpZW50IGNvbXBhdGliaWxpdHkKKyMgLSBsaWJxYi1kZXYgKGJ1 aWxkL3Rlc3Qgb25seSkgLSBSZXF1aXJlZCB0byBydW4gd2lyZSBwcm90b2NvbCB0ZXN0cworCitb ZGVwZW5kZW5jaWVzXQorIyBFcnJvciBoYW5kbGluZworYW55aG93LndvcmtzcGFjZSA9IHRydWUK KworIyBBc3luYyBydW50aW1lCit0b2tpby53b3Jrc3BhY2UgPSB0cnVlCit0b2tpby11dGlsLndv cmtzcGFjZSA9IHRydWUKKworIyBDb25jdXJyZW5jeSBwcmltaXRpdmVzCitwYXJraW5nX2xvdC53 b3Jrc3BhY2UgPSB0cnVlCisKKyMgU3lzdGVtIGludGVncmF0aW9uCitsaWJjLndvcmtzcGFjZSA9 IHRydWUKK25peC53b3Jrc3BhY2UgPSB0cnVlCittZW1tYXAyID0gIjAuOSIKKworIyBMb2dnaW5n Cit0cmFjaW5nLndvcmtzcGFjZSA9IHRydWUKKworIyBBc3luYyB0cmFpdCBzdXBwb3J0Cithc3lu Yy10cmFpdC53b3Jrc3BhY2UgPSB0cnVlCisKK1tkZXYtZGVwZW5kZW5jaWVzXQorcG14Y2ZzLXRl c3QtdXRpbHMgPSB7IHBhdGggPSAiLi4vcG14Y2ZzLXRlc3QtdXRpbHMiIH0KK3RlbXBmaWxlLndv cmtzcGFjZSA9IHRydWUKK3Rva2lvID0geyB3b3Jrc3BhY2UgPSB0cnVlLCBmZWF0dXJlcyA9IFsi cnQiLCAibWFjcm9zIl0gfQordHJhY2luZy1zdWJzY3JpYmVyLndvcmtzcGFjZSA9IHRydWUKZGlm ZiAtLWdpdCBhL3NyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy9SRUFETUUubWQgYi9zcmMvcG14Y2Zz LXJzL3BteGNmcy1pcGMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwLi41YjViOThhZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wbXhjZnMtcnMvcG14Y2ZzLWlw Yy9SRUFETUUubWQKQEAgLTAsMCArMSwxODIgQEAKKyMgcG14Y2ZzLWlwYzogbGlicWItQ29tcGF0 aWJsZSBJUEMgU2VydmVyCisKKyoqUnVzdCBpbXBsZW1lbnRhdGlvbiBvZiBsaWJxYiBJUEMgc2Vy dmVyIGZvciBwbXhjZnMgdXNpbmcgc2hhcmVkIG1lbW9yeSByaW5nIGJ1ZmZlcnMqKgorCitUaGlz IGNyYXRlIHByb3ZpZGVzIGEgd2lyZS1jb21wYXRpYmxlIElQQyBzZXJ2ZXIgdGhhdCB3b3JrcyB3 aXRoIGxpYnFiIGNsaWVudHMgKEMgYHFiX2lwY2NfKmAgQVBJKSB3aXRob3V0IGRlcGVuZGluZyBv biB0aGUgbGlicWIgQyBsaWJyYXJ5LgorCisjIyBUYWJsZSBvZiBDb250ZW50cworCistIFtPdmVy dmlld10oI292ZXJ2aWV3KQorLSBbQXJjaGl0ZWN0dXJlXSgjYXJjaGl0ZWN0dXJlKQorLSBbUHJv dG9jb2wgSW1wbGVtZW50YXRpb25dKCNwcm90b2NvbC1pbXBsZW1lbnRhdGlvbikKKy0gW1VzYWdl XSgjdXNhZ2UpCistIFtUZXN0aW5nXSgjdGVzdGluZykKKy0gW1JlZmVyZW5jZXNdKCNyZWZlcmVu Y2VzKQorCistLS0KKworIyMgT3ZlcnZpZXcKKworcG14Y2ZzIHVzZXMgbGlicWIgZm9yIElQQyBj b21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGRhZW1vbiBhbmQgY2xpZW50IHRvb2xzIChgcHZlY21g LCBgcHZlbm9kZWAsIGV0Yy4pLiBUaGlzIGNyYXRlIGltcGxlbWVudHMgYSBzZXJ2ZXIgdXNpbmcg UUJfSVBDX1NITSAoc2hhcmVkIG1lbW9yeSByaW5nIGJ1ZmZlcnMpIHRoYXQgaXMgd2lyZS1jb21w YXRpYmxlIHdpdGggbGlicWIgY2xpZW50cywgZW5hYmxpbmcgdGhlIFJ1c3QgcG14Y2ZzIGltcGxl bWVudGF0aW9uIHRvIGNvbW11bmljYXRlIHdpdGggZXhpc3RpbmcgQy1iYXNlZCB0b29scy4KKwor KipLZXkgRmVhdHVyZXMqKjoKKy0gV2lyZS1jb21wYXRpYmxlIHdpdGggbGlicWIgY2xpZW50cwor LSBRQl9JUENfU0hNIHRyYW5zcG9ydCAoc2hhcmVkIG1lbW9yeSByaW5nIGJ1ZmZlcnMpCistIEFz eW5jIEkvTyB2aWEgdG9raW8KKy0gTG9jay1mcmVlIFNQU0MgcmluZyBidWZmZXJzCistIFN1cHBv cnRzIGF1dGhlbnRpY2F0aW9uIHZpYSB1aWQvZ2lkCistIFBlci1jb25uZWN0aW9uIGNvbnRleHQg KHVpZCwgZ2lkLCBwaWQsIHJlYWQtb25seSBmbGFnKQorLSBDb25uZWN0aW9uIHN0YXRpc3RpY3Mg dHJhY2tpbmcKKy0gQWJzdHJhY3QgVW5peCBzb2NrZXRzIGZvciBzZXR1cCBoYW5kc2hha2UgKExp bnV4LXNwZWNpZmljKQorCistLS0KKworIyMgQXJjaGl0ZWN0dXJlCisKKyMjIyBUcmFuc3BvcnQ6 IFFCX0lQQ19TSE0gKFNoYXJlZCBNZW1vcnkgUmluZyBCdWZmZXJzKQorCisqKlJ1c3QgcG14Y2Zz IHVzZXMqKjogYFFCX0lQQ19TSE1gIChzaGFyZWQgbWVtb3J5IHJpbmcgYnVmZmVycykKKworV2Ug aW1wbGVtZW50ZWQgc2hhcmVkIG1lbW9yeSB0cmFuc3BvcnQgdXNpbmcgbG9jay1mcmVlIFNQU0Mg KHNpbmdsZS1wcm9kdWNlciBzaW5nbGUtY29uc3VtZXIpIHJpbmcgYnVmZmVycy4gVGhpcyBwcm92 aWRlczoKKworLSAqKldpcmUgY29tcGF0aWJpbGl0eSoqOiBTYW1lIGhhbmRzaGFrZSBwcm90b2Nv bCBhcyBsaWJxYgorLSAqKkFzeW5jIEkvTyoqOiBJbnRlZ3JhdGlvbiB3aXRoIHRva2lvIGVjb3N5 c3RlbQorCisqKlJpbmcgQnVmZmVyIERlc2lnbioqOgorLSBFYWNoIGNvbm5lY3Rpb24gaGFzIDMg cmluZyBidWZmZXJzOgorICAxLiAqKlJlcXVlc3QgcmluZyoqOiBDbGllbnQgd3JpdGVzLCBzZXJ2 ZXIgcmVhZHMKKyAgMi4gKipSZXNwb25zZSByaW5nKio6IFNlcnZlciB3cml0ZXMsIGNsaWVudCBy ZWFkcworICAzLiAqKkV2ZW50IHJpbmcqKjogU2VydmVyIHdyaXRlcywgY2xpZW50IHJlYWRzIChm b3IgYXN5bmMgbm90aWZpY2F0aW9ucykKKy0gUmluZyBidWZmZXJzIHN0b3JlZCBpbiBgL2Rldi9z aG1gIChMaW51eCBzaGFyZWQgbWVtb3J5KQorLSBDaHVuay1iYXNlZCBwcm90b2NvbCBtYXRjaGlu ZyBsaWJxYgorCisjIyMgU2VydmVyIFN0cnVjdHVyZQorCisjIyMgQ29ubmVjdGlvbiBTdGF0aXN0 aWNzCisKK1RyYWNrcyBzdGF0aXN0aWNzIGZvciBDIGNvbXBhdGliaWxpdHkgKG1hdGNoaW5nIGBx Yl9pcGNzX3N0YXRzYCkuCisKKy0tLQorCisjIyBQcm90b2NvbCBJbXBsZW1lbnRhdGlvbgorCisj IyMgQ29ubmVjdGlvbiBIYW5kc2hha2UKKworU2VydmVyIGNyZWF0ZXMgYW4gYWJzdHJhY3QgVW5p eCBzb2NrZXQgYEBwdmUyYCAoQCBwcmVmaXggaW5kaWNhdGVzIGFic3RyYWN0IG5hbWVzcGFjZSkg Zm9yIGluaXRpYWwgY29ubmVjdGlvbiBzZXR1cC4KKworIyMjIFJlcXVlc3QvUmVzcG9uc2UgQ29t bXVuaWNhdGlvbgorCitBZnRlciBoYW5kc2hha2UsIGNvbW11bmljYXRpb24gaGFwcGVucyB2aWEg c2hhcmVkIG1lbW9yeSByaW5nIGJ1ZmZlcnMgdXNpbmcgbGlicWItY29tcGF0aWJsZSBjaHVuayBm b3JtYXQuCisKKyMjIyBXaXJlIEZvcm1hdCBTdHJ1Y3R1cmVzCisKK0FsbCBzdHJ1Y3R1cmVzIHVz ZSBgI1tyZXByKEMsIGFsaWduKDgpKV1gIHRvIG1hdGNoIEMncyBhbGlnbm1lbnQgcmVxdWlyZW1l bnRzLgorCitFcnJvciBjb2RlcyBtdXN0IGJlIG5lZ2F0aXZlIGVycm5vIHZhbHVlcyAoZS5nLiwg YC1FUEVSTWAsIGAtRUlOVkFMYCkgdG8gbWF0Y2ggbGlicWIgY29udmVudGlvbi4KKworLS0tCisK KyMjIFRlc3RpbmcKKworUmVxdWlyZXMgQ29yb3N5bmMgcnVubmluZyBmb3IgaW50ZWdyYXRpb24g dGVzdHMuIFNlZSBgdGVzdHMvYCBkaXJlY3RvcnkgZm9yIEMgY2xpZW50IEZGSSBjb21wYXRpYmls aXR5IHRlc3RzLgorCisjIyBJbXBsZW1lbnRhdGlvbiBTdGF0dXMKKworIyMjIEltcGxlbWVudGVk CisKKy0gQ29ubmVjdGlvbiBoYW5kc2hha2UgKFNPQ0tfU1RSRUFNIHNldHVwIHNvY2tldCkKKy0g QXV0aGVudGljYXRpb24gdmlhIFNPX1BBU1NDUkVEICh1aWQvZ2lkL3BpZCkKKy0gUUJfSVBDX1NI TSB0cmFuc3BvcnQgKHNoYXJlZCBtZW1vcnkgcmluZyBidWZmZXJzKQorLSBMb2NrLWZyZWUgU1BT QyByaW5nIGJ1ZmZlcnMKKy0gQXN5bmMgSS9PIHZpYSB0b2tpbworLSBBYnN0cmFjdCBVbml4IHNv Y2tldHMgZm9yIHNldHVwIGhhbmRzaGFrZQorLSBNZXNzYWdlIGhlYWRlciBwYXJzaW5nIChyZXF1 ZXN0L3Jlc3BvbnNlKQorLSBFcnJvciBjb2RlIHByb3BhZ2F0aW9uIChuZWdhdGl2ZSBlcnJubykK Ky0gUmluZyBidWZmZXIgZmlsZSBtYW5hZ2VtZW50IChjcmVhdGlvbi9jbGVhbnVwKQorLSBFdmVu dCBjaGFubmVsIHJpbmcgYnVmZmVycyAoY3JlYXRlZCwgbm90IGFjdGl2ZWx5IHVzZWQpCistIENv bm5lY3Rpb24gc3RhdGlzdGljcyB0cmFja2luZworLSBEaXNjb25uZWN0IGRldGVjdGlvbgorLSBS ZWFkLW9ubHkgZmxhZyBiYXNlZCBvbiBnaWQKKworIyMjIE5vdCBJbXBsZW1lbnRlZAorCistIEV2 ZW50IGNoYW5uZWwgbWVzc2FnZSBzZW5kaW5nIChwbXhjZnMgZG9lc24ndCB1c2UgZXZlbnRzIHll dCkKKworIyMgQXBwbGljYXRpb24tTGV2ZWwgSVBDIE9wZXJhdGlvbnMKKworIyMjIE9wZXJhdGlv biBTdW1tYXJ5CisKK1RoZSBmb2xsb3dpbmcgSVBDIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCAo ZGVmaW5lZCBpbiBwbXhjZnMpOgorCit8IE9wZXJhdGlvbiB8IFJlcXVlc3QgRGF0YSB8IFJlc3Bv bnNlIERhdGEgfCBEZXNjcmlwdGlvbiB8Cit8LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0t LS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwKK3wgR0VUX0ZTX1ZFUlNJT04gfCBFbXB0eSB8IHVp bnQzMl90IHZlcnNpb24gfCBHZXQgZmlsZXN5c3RlbSB2ZXJzaW9uIG51bWJlciB8Cit8IEdFVF9D TFVTVEVSX0lORk8gfCBFbXB0eSB8IEpTT04gc3RyaW5nIHwgR2V0IGNsdXN0ZXIgaW5mb3JtYXRp b24gfAorfCBHRVRfR1VFU1RfTElTVCB8IEVtcHR5IHwgSlNPTiBhcnJheSB8IEdldCBsaXN0IG9m IGFsbCBWTXMvY29udGFpbmVycyB8Cit8IFNFVF9TVEFUVVMgfCBuYW1lICsgZGF0YSB8IEVtcHR5 IHwgU2V0IHN0YXR1cyBrZXktdmFsdWUgcGFpciB8Cit8IEdFVF9TVEFUVVMgfCBuYW1lIHwgQmlu YXJ5IGRhdGEgfCBHZXQgc3RhdHVzIHZhbHVlIGJ5IG5hbWUgfAorfCBHRVRfQ09ORklHIHwgbmFt ZSB8IEZpbGUgY29udGVudHMgfCBSZWFkIGNvbmZpZ3VyYXRpb24gZmlsZSB8Cit8IExPR19DTFVT VEVSX01TRyB8IHByaW9yaXR5ICsgbXNnIHwgRW1wdHkgfCBBZGQgY2x1c3RlciBsb2cgZW50cnkg fAorfCBHRVRfQ0xVU1RFUl9MT0cgfCBtYXhfZW50cmllcyB8IEpTT04gYXJyYXkgfCBHZXQgY2x1 c3RlciBsb2cgZW50cmllcyB8Cit8IEdFVF9SUkRfRFVNUCB8IEVtcHR5IHwgUlJEIGR1bXAgdGV4 dCB8IEdldCBhbGwgUlJEIGRhdGEgfAorfCBHRVRfR1VFU1RfQ09ORklHX1BST1BFUlRZIHwgdm1p ZCArIGtleSB8IFN0cmluZyB2YWx1ZSB8IEdldCBzaW5nbGUgVk0gY29uZmlnIHByb3BlcnR5IHwK K3wgR0VUX0dVRVNUX0NPTkZJR19QUk9QRVJUSUVTIHwgdm1pZCB8IEpTT04gb2JqZWN0IHwgR2V0 IGFsbCBWTSBjb25maWcgcHJvcGVydGllcyB8Cit8IFZFUklGWV9UT0tFTiB8IHVzZXJpZCArIHRv a2VuIHwgQm9vbGVhbiB8IFZlcmlmeSBBUEkgdG9rZW4gdmFsaWRpdHkgfAorCisjIyMgQ29tbW9u IENsaWVudHMKKworVGhlIGZvbGxvd2luZyBQcm94bW94IGNvbXBvbmVudHMgdXNlIHRoZSBJUEMg aW50ZXJmYWNlOgorCistICoqcHZlc3RhdGQqKjogVXBkYXRlcyBub2RlL1ZNL3N0b3JhZ2UgbWV0 cmljcyAoU0VUX1NUQVRVUywgR0VUX1NUQVRVUykKKy0gKipwdmUtaGEtY3JtKio6IEhBIGNsdXN0 ZXIgcmVzb3VyY2UgbWFuYWdlciAoR0VUX0NMVVNURVJfSU5GTywgR0VUX0dVRVNUX0xJU1QpCist ICoqcHZlLWhhLWxybSoqOiBIQSBsb2NhbCByZXNvdXJjZSBtYW5hZ2VyIChHRVRfQ09ORklHLCBM T0dfQ0xVU1RFUl9NU0cpCistICoqcHZlY20qKjogQ2x1c3RlciBtYW5hZ2VtZW50IENMSSAoR0VU X0NMVVNURVJfSU5GTywgR0VUX0NMVVNURVJfTE9HKQorLSAqKnB2ZWRhZW1vbioqOiBQVkUgQVBJ IGRhZW1vbiAoQWxsIHF1ZXJ5IG9wZXJhdGlvbnMpCisKKyMjIyBQZXJtaXNzaW9uIE1vZGVsCisK KyoqV3JpdGUgT3BlcmF0aW9ucyoqIChyZXF1aXJlIHJvb3QpOgorLSBTRVRfU1RBVFVTCistIExP R19DTFVTVEVSX01TRworCisqKlJlYWQgT3BlcmF0aW9ucyoqIChhbnkgYXV0aGVudGljYXRlZCB1 c2VyKToKKy0gQWxsIEdFVF8qIG9wZXJhdGlvbnMKKy0gVkVSSUZZX1RPS0VOCisKKy0tLQorCisj IyBSZWZlcmVuY2VzCisKKyMjIyBsaWJxYiBTb3VyY2UKKworUmVmZXJlbmNlIGltcGxlbWVudGF0 aW9uIG9mIFFCIElQQyBwcm90b2NvbCAoYXZhaWxhYmxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9D bHVzdGVyTGFicy9saWJxYik6CisKKy0gYGxpYnFiL2xpYi9yaW5nYnVmZmVyLmNgIC0gUmluZyBi dWZmZXIgaW1wbGVtZW50YXRpb24KKy0gYGxpYnFiL2xpYi9pcGNfc2htLmNgIC0gU2hhcmVkIG1l bW9yeSB0cmFuc3BvcnQKKy0gYGxpYnFiL2xpYi9pcGNfc2V0dXAuY2AgLSBDb25uZWN0aW9uIHNl dHVwL2hhbmRzaGFrZQorLSBgbGlicWIvaW5jbHVkZS9xYi9xYmlwY19jb21tb24uaGAgLSBXaXJl IHByb3RvY29sIHN0cnVjdHVyZXMKKworIyMjIEMgcG14Y2ZzIChwdmUtY2x1c3RlcikKKworLSBg c3JjL3BteGNmcy9zZXJ2ZXIuY2AgLSBDIElQQyBzZXJ2ZXIgdXNpbmcgbGlicWIKKy0gYHNyYy9w bXhjZnMvY2ZzLWlwYy1vcHMuaGAgLSBwbXhjZnMgSVBDIG9wZXJhdGlvbiBjb2RlcworCisjIyMg UmVsYXRlZCBEb2N1bWVudGF0aW9uCisKKy0gYC4uL0NfQ09NUEFUSUJJTElUWS5tZGAgLSBHZW5l cmFsIEMgY29tcGF0aWJpbGl0eSBub3RlcyAoaWYgZXhpc3RzKQorCistLS0KKworIyMgTm90ZXMK KworIyMjIFJpbmcgQnVmZmVyIE5hbWluZyBDb252ZW50aW9uCisKK1JpbmcgYnVmZmVyIGZpbGVz IGFyZSBjcmVhdGVkIGluIGAvZGV2L3NobWAgd2l0aCBuYW1lcyBiYXNlZCBvbiBjb25uZWN0aW9u IGRlc2NyaXB0b3IgYW5kIHJpbmcgdHlwZSAocmVxdWVzdC9yZXNwb25zZS9ldmVudCkuCisKKyMj IyBFcnJvciBIYW5kbGluZworCitBbHdheXMgdXNlICoqbmVnYXRpdmUgZXJybm8gdmFsdWVzKiog Zm9yIGVycm9ycyB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggbGlicWIgY2xpZW50cy4K KworIyMjIEFsaWdubWVudCBhbmQgUGFkZGluZworCitBbGwgd2lyZSBmb3JtYXQgc3RydWN0dXJl cyBtdXN0IHVzZSBgI1tyZXByKEMsIGFsaWduKDgpKV1gIHRvIGVuc3VyZSA4LWJ5dGUgYWxpZ25t ZW50IG1hdGNoaW5nIEMncyByZXF1aXJlbWVudHMuCmRpZmYgLS1naXQgYS9zcmMvcG14Y2ZzLXJz L3BteGNmcy1pcGMvZXhhbXBsZXMvdGVzdF9zZXJ2ZXIucnMgYi9zcmMvcG14Y2ZzLXJzL3BteGNm cy1pcGMvZXhhbXBsZXMvdGVzdF9zZXJ2ZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAuLjZiOTY5NWNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BteGNmcy1ycy9wbXhj ZnMtaXBjL2V4YW1wbGVzL3Rlc3Rfc2VydmVyLnJzCkBAIC0wLDAgKzEsOTIgQEAKKy8vISBTaW1w bGUgdGVzdCBzZXJ2ZXIgZm9yIGRlYnVnZ2luZyBsaWJxYiBjb25uZWN0aXZpdHkKKwordXNlIGFz eW5jX3RyYWl0Ojphc3luY190cmFpdDsKK3VzZSBwbXhjZnNfaXBjOjp7SGFuZGxlciwgUGVybWlz c2lvbnMsIFJlcXVlc3QsIFJlc3BvbnNlLCBTZXJ2ZXJ9OworCisvLy8gRXhhbXBsZSBoYW5kbGVy IGltcGxlbWVudGF0aW9uCitzdHJ1Y3QgVGVzdEhhbmRsZXI7CisKKyNbYXN5bmNfdHJhaXRdCitp bXBsIEhhbmRsZXIgZm9yIFRlc3RIYW5kbGVyIHsKKyAgICBmbiBhdXRoZW50aWNhdGUoJnNlbGYs IHVpZDogdTMyLCBnaWQ6IHUzMikgLT4gT3B0aW9uPFBlcm1pc3Npb25zPiB7CisgICAgICAgIC8v IEFjY2VwdCByb290IHdpdGggcmVhZC13cml0ZSBhY2Nlc3MKKyAgICAgICAgaWYgdWlkID09IDAg eworICAgICAgICAgICAgZXByaW50bG4hKCJBdXRoZW50aWNhdGVkIHVpZD17dWlkfSwgZ2lkPXtn aWR9IGFzIHJvb3QgKHJlYWQtd3JpdGUpIik7CisgICAgICAgICAgICByZXR1cm4gU29tZShQZXJt aXNzaW9uczo6UmVhZFdyaXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjY2VwdCBhbGwg b3RoZXIgdXNlcnMgd2l0aCByZWFkLW9ubHkgYWNjZXNzIGZvciB0ZXN0aW5nCisgICAgICAgIGVw cmludGxuISgiQXV0aGVudGljYXRlZCB1aWQ9e3VpZH0sIGdpZD17Z2lkfSBhcyByZWd1bGFyIHVz ZXIgKHJlYWQtb25seSkiKTsKKyAgICAgICAgU29tZShQZXJtaXNzaW9uczo6UmVhZE9ubHkpCisg ICAgfQorCisgICAgYXN5bmMgZm4gaGFuZGxlKCZzZWxmLCByZXF1ZXN0OiBSZXF1ZXN0KSAtPiBS ZXNwb25zZSB7CisgICAgICAgIGVwcmludGxuISgKKyAgICAgICAgICAgICJSZWNlaXZlZCByZXF1 ZXN0OiBpZD17fSwgZGF0YV9sZW49e30sIGNvbm49e30sIHVpZD17fSwgZ2lkPXt9LCBwaWQ9e30s IHJlYWRfb25seT17fSIsCisgICAgICAgICAgICByZXF1ZXN0Lm1zZ19pZCwKKyAgICAgICAgICAg IHJlcXVlc3QuZGF0YS5sZW4oKSwKKyAgICAgICAgICAgIHJlcXVlc3QuY29ubl9pZCwKKyAgICAg ICAgICAgIHJlcXVlc3QudWlkLAorICAgICAgICAgICAgcmVxdWVzdC5naWQsCisgICAgICAgICAg ICByZXF1ZXN0LnBpZCwKKyAgICAgICAgICAgIHJlcXVlc3QuaXNfcmVhZF9vbmx5CisgICAgICAg ICk7CisKKyAgICAgICAgbWF0Y2ggcmVxdWVzdC5tc2dfaWQgeworICAgICAgICAgICAgMSA9PiB7 CisgICAgICAgICAgICAgICAgLy8gQ0ZTX0lQQ19HRVRfRlNfVkVSU0lPTgorICAgICAgICAgICAg ICAgIGxldCByZXNwb25zZV9zdHIgPSByIyJ7InZlcnNpb24iOjEsInByb3RvY29sIjoxfSIjOwor ICAgICAgICAgICAgICAgIGVwcmludGxuISgiUmVzcG9uZGluZyB3aXRoOiB7cmVzcG9uc2Vfc3Ry fSIpOworICAgICAgICAgICAgICAgIFJlc3BvbnNlOjpvayhyZXNwb25zZV9zdHIuYXNfYnl0ZXMo KS50b192ZWMoKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIDIgPT4geworICAgICAgICAg ICAgICAgIC8vIENGU19JUENfR0VUX0NMVVNURVJfSU5GTworICAgICAgICAgICAgICAgIGxldCBy ZXNwb25zZV9zdHIgPSByIyJ7Im5vZGVzIjpbIm5vZGUxIiwibm9kZTIiXSwicXVvcmF0ZSI6dHJ1 ZX0iIzsKKyAgICAgICAgICAgICAgICBlcHJpbnRsbiEoIlJlc3BvbmRpbmcgd2l0aDoge3Jlc3Bv bnNlX3N0cn0iKTsKKyAgICAgICAgICAgICAgICBSZXNwb25zZTo6b2socmVzcG9uc2Vfc3RyLmFz X2J5dGVzKCkudG9fdmVjKCkpCisgICAgICAgICAgICB9CisgICAgICAgICAgICAzID0+IHsKKyAg ICAgICAgICAgICAgICAvLyBDRlNfSVBDX0dFVF9HVUVTVF9MSVNUCisgICAgICAgICAgICAgICAg bGV0IHJlc3BvbnNlX3N0ciA9IHIjInsiZGF0YSI6W3sidm1pZCI6MTAwfV19IiM7CisgICAgICAg ICAgICAgICAgZXByaW50bG4hKCJSZXNwb25kaW5nIHdpdGg6IHtyZXNwb25zZV9zdHJ9Iik7Cisg ICAgICAgICAgICAgICAgUmVzcG9uc2U6Om9rKHJlc3BvbnNlX3N0ci5hc19ieXRlcygpLnRvX3Zl YygpKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgXyA9PiB7CisgICAgICAgICAgICAgICAg ZXByaW50bG4hKCJVbmtub3duIG1lc3NhZ2UgaWQ6IHt9IiwgcmVxdWVzdC5tc2dfaWQpOworICAg ICAgICAgICAgICAgIFJlc3BvbnNlOjplcnIoLWxpYmM6OkVJTlZBTCkKKyAgICAgICAgICAgIH0K KyAgICAgICAgfQorICAgIH0KK30KKworI1t0b2tpbzo6bWFpbl0KK2FzeW5jIGZuIG1haW4oKSB7 CisgICAgLy8gSW5pdGlhbGl6ZSB0cmFjaW5nCisgICAgdHJhY2luZ19zdWJzY3JpYmVyOjpmbXQo KQorICAgICAgICAud2l0aF9tYXhfbGV2ZWwodHJhY2luZzo6TGV2ZWw6OkRFQlVHKQorICAgICAg ICAud2l0aF90YXJnZXQodHJ1ZSkKKyAgICAgICAgLmluaXQoKTsKKworICAgIHByaW50bG4hKCJT dGFydGluZyBRQiBJUEMgdGVzdCBzZXJ2ZXIgb24gJ3B2ZTInLi4uIik7CisKKyAgICAvLyBDcmVh dGUgaGFuZGxlciBhbmQgc2VydmVyCisgICAgbGV0IGhhbmRsZXIgPSBUZXN0SGFuZGxlcjsKKyAg ICBsZXQgbXV0IHNlcnZlciA9IFNlcnZlcjo6bmV3KCJwdmUyIiwgaGFuZGxlcik7CisKKyAgICBw cmludGxuISgiU2VydmVyIGNyZWF0ZWQsIHN0YXJ0aW5nLi4uIik7CisKKyAgICBpZiBsZXQgRXJy KGUpID0gc2VydmVyLnN0YXJ0KCkgeworICAgICAgICBlcHJpbnRsbiEoIkZhaWxlZCB0byBzdGFy dCBzZXJ2ZXI6IHtlfSIpOworICAgICAgICBzdGQ6OnByb2Nlc3M6OmV4aXQoMSk7CisgICAgfQor CisgICAgcHJpbnRsbiEoIlNlcnZlciBzdGFydGVkIHN1Y2Nlc3NmdWxseSEiKTsKKyAgICBwcmlu dGxuISgiV2FpdGluZyBmb3IgY29ubmVjdGlvbnMuLi4iKTsKKworICAgIC8vIEtlZXAgc2VydmVy IHJ1bm5pbmcKKyAgICB0b2tpbzo6c2lnbmFsOjpjdHJsX2MoKQorICAgICAgICAuYXdhaXQKKyAg ICAgICAgLmV4cGVjdCgiRmFpbGVkIHRvIHdhaXQgZm9yIEN0cmwtQyIpOworCisgICAgcHJpbnRs biEoIlNodXR0aW5nIGRvd24uLi4iKTsKK30KZGlmZiAtLWdpdCBhL3NyYy9wbXhjZnMtcnMvcG14 Y2ZzLWlwYy9zcmMvY29ubmVjdGlvbi5ycyBiL3NyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy9zcmMv Y29ubmVjdGlvbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uZDZkNzdl NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG14Y2ZzLXJzL3BteGNmcy1pcGMvc3JjL2Nvbm5l Y3Rpb24ucnMKQEAgLTAsMCArMSw2NTcgQEAKKy8vLyBQZXItY29ubmVjdGlvbiBoYW5kbGluZyBm b3IgbGlicWIgSVBDIHdpdGggc2hhcmVkIG1lbW9yeSByaW5nIGJ1ZmZlcnMKKy8vLworLy8vIFRo aXMgbW9kdWxlIGNvbnRhaW5zIGFsbCBjb25uZWN0aW9uLXNwZWNpZmljIGxvZ2ljIGluY2x1ZGlu ZyBjb25uZWN0aW9uCisvLy8gZXN0YWJsaXNobWVudCwgYXV0aGVudGljYXRpb24sIHJlcXVlc3Qg aGFuZGxpbmcsIGFuZCBzaGFyZWQgbWVtb3J5IHJpbmcgYnVmZmVyIG1hbmFnZW1lbnQuCit1c2Ug YW55aG93Ojp7Q29udGV4dCwgUmVzdWx0fTsKK3VzZSBzdGQ6Om9zOjp1bml4Ojppbzo6QXNSYXdG ZDsKK3VzZSBzdGQ6OnBhdGg6OlBhdGhCdWY7Cit1c2Ugc3RkOjpzeW5jOjpBcmM7Cit1c2UgdG9r aW86OmlvOjp7QXN5bmNSZWFkRXh0LCBBc3luY1dyaXRlRXh0fTsKK3VzZSB0b2tpbzo6bmV0OjpV bml4U3RyZWFtOwordXNlIHRva2lvX3V0aWw6OnN5bmM6OkNhbmNlbGxhdGlvblRva2VuOworCit1 c2Ugc3VwZXI6OmhhbmRsZXI6OntIYW5kbGVyLCBQZXJtaXNzaW9uc307Cit1c2Ugc3VwZXI6OnBy b3RvY29sOjoqOwordXNlIHN1cGVyOjpyaW5nYnVmZmVyOjp7Rmxvd0NvbnRyb2wsIFJpbmdCdWZm ZXJ9OworCisvLy8gUGVyLWNvbm5lY3Rpb24gc3RhdGUgdXNpbmcgc2hhcmVkIG1lbW9yeSByaW5n IGJ1ZmZlcnMKKy8vLworLy8vIFVzZXMgU0hNIHRyYW5zcG9ydCAoc2hhcmVkIG1lbW9yeSByaW5n IGJ1ZmZlcnMpLgorI1thbGxvdyhkZWFkX2NvZGUpXSAvLyBGaWVsZHMgYXJlIGludGVudGlvbmFs bHkgc3RvcmVkIGZvciBsaWZlY3ljbGUgbWFuYWdlbWVudAorcHViKHN1cGVyKSBzdHJ1Y3QgUWJD b25uZWN0aW9uIHsKKyAgICAvLy8gQ29ubmVjdGlvbiBJRCBmb3IgbG9nZ2luZyBhbmQgZGVidWdn aW5nCisgICAgY29ubl9pZDogdTY0LAorCisgICAgLy8vIENsaWVudCBwcm9jZXNzIElEIChmcm9t IFNPX1BFRVJDUkVEKQorICAgIHBpZDogdTMyLAorCisgICAgLy8vIENsaWVudCB1c2VyIElEIChm cm9tIFNPX1BFRVJDUkVEKQorICAgIHVpZDogdTMyLAorCisgICAgLy8vIENsaWVudCBncm91cCBJ RCAoZnJvbSBTT19QRUVSQ1JFRCkKKyAgICBnaWQ6IHUzMiwKKworICAgIC8vLyBXaGV0aGVyIHRo aXMgY29ubmVjdGlvbiBoYXMgcmVhZC1vbmx5IGFjY2VzcyAoZGV0ZXJtaW5lZCBieSBIYW5kbGVy OjphdXRoZW50aWNhdGUpCisgICAgcHViKHN1cGVyKSByZWFkX29ubHk6IGJvb2wsCisKKyAgICAv Ly8gU2V0dXAgc29ja2V0IChrZXB0IG9wZW4gZm9yIGRpc2Nvbm5lY3QgZGV0ZWN0aW9uKQorICAg IF9zZXR1cF9zdHJlYW06IFVuaXhTdHJlYW0sCisKKyAgICAvLy8gUmluZyBidWZmZXJzIGZvciBz aGFyZWQgbWVtb3J5IElQQworICAgIC8vLyBSZXF1ZXN0IHJpbmc6IGNsaWVudCB3cml0ZXMsIHNl cnZlciByZWFkcworICAgIHJlcXVlc3RfcmI6IE9wdGlvbjxSaW5nQnVmZmVyPiwKKyAgICAvLy8g UmVzcG9uc2UgcmluZzogc2VydmVyIHdyaXRlcywgY2xpZW50IHJlYWRzCisgICAgcmVzcG9uc2Vf cmI6IE9wdGlvbjxSaW5nQnVmZmVyPiwKKyAgICAvLy8gRXZlbnQgcmluZzogc2VydmVyIHdyaXRl cywgY2xpZW50IHJlYWRzIChmb3IgYXN5bmMgbm90aWZpY2F0aW9ucykKKyAgICAvLy8gTk9URTog VGhlIGV4aXN0aW5nIFBWRS9JUENDLnhzIFBlcmwgY2xpZW50IG9ubHkgdXNlcyBxYl9pcGNjX3Nl bmR2X3JlY3YoKQorICAgIC8vLyBhbmQgbmV2ZXIgY2FsbHMgcWJfaXBjY19ldmVudF9yZWN2KCks IHNvIHRoaXMgcmluZyBidWZmZXIgaXMgY3JlYXRlZAorICAgIC8vLyBmb3IgbGlicWIgY29tcGF0 aWJpbGl0eSBidXQgcmVtYWlucyB1bnVzZWQgaW4gcHJhY3RpY2UuCisgICAgX2V2ZW50X3JiOiBP cHRpb248UmluZ0J1ZmZlcj4sCisKKyAgICAvLy8gUGF0aHMgdG8gcmluZyBidWZmZXIgZGF0YSBm aWxlcyAoZm9yIGRlYnVnZ2luZy9jbGVhbnVwKQorICAgIHB1YihzdXBlcikgcmluZ19idWZmZXJf cGF0aHM6IFZlYzxQYXRoQnVmPiwKKworICAgIC8vLyBUYXNrIGhhbmRsZSBmb3IgcmVxdWVzdCBo YW5kbGVyIChhdXRvLWFib3J0ZWQgb24gZHJvcCkKKyAgICBwdWIoc3VwZXIpIHRhc2tfaGFuZGxl OiBPcHRpb248dG9raW86OnRhc2s6OkpvaW5IYW5kbGU8KCk+PiwKK30KKworaW1wbCBRYkNvbm5l Y3Rpb24geworICAgIC8vLyBBY2NlcHQgYSBuZXcgY29ubmVjdGlvbiBmcm9tIHRoZSBzZXR1cCBz b2NrZXQKKyAgICAvLy8KKyAgICAvLy8gUGVyZm9ybXMgYXV0aGVudGljYXRpb24sIGNyZWF0ZXMg cmluZyBidWZmZXJzLCBzcGF3bnMgcmVxdWVzdCBoYW5kbGVyIHRhc2ssCisgICAgLy8vIGFuZCBy ZXR1cm5zIHRoZSBjb25uZWN0aW9uIG9iamVjdC4KKyAgICBwdWIoc3VwZXIpIGFzeW5jIGZuIGFj Y2VwdCgKKyAgICAgICAgbXV0IHN0cmVhbTogVW5peFN0cmVhbSwKKyAgICAgICAgY29ubl9pZDog dTY0LAorICAgICAgICBzZXJ2aWNlX25hbWU6ICZzdHIsCisgICAgICAgIGhhbmRsZXI6IEFyYzxk eW4gSGFuZGxlcj4sCisgICAgICAgIGNhbmNlbGxhdGlvbl90b2tlbjogQ2FuY2VsbGF0aW9uVG9r ZW4sCisgICAgKSAtPiBSZXN1bHQ8U2VsZj4geworICAgICAgICAvLyBSZWFkIGNvbm5lY3Rpb24g cmVxdWVzdAorICAgICAgICBsZXQgZmQgPSBzdHJlYW0uYXNfcmF3X2ZkKCk7CisgICAgICAgIGxl dCBtdXQgcmVxX2J5dGVzID0gdmVjIVswdTg7IHN0ZDo6bWVtOjpzaXplX29mOjo8Q29ubmVjdGlv blJlcXVlc3Q+KCldOworICAgICAgICBzdHJlYW0KKyAgICAgICAgICAgIC5yZWFkX2V4YWN0KCZt dXQgcmVxX2J5dGVzKQorICAgICAgICAgICAgLmF3YWl0CisgICAgICAgICAgICAuY29udGV4dCgi RmFpbGVkIHRvIHJlYWQgY29ubmVjdGlvbiByZXF1ZXN0Iik/OworCisgICAgICAgIHRyYWNpbmc6 OmRlYnVnISgKKyAgICAgICAgICAgICJDb25uZWN0aW9uIHJlcXVlc3QgcmF3IGJ5dGVzICh7fSBi eXRlcyk6IHs6MDJ4P30iLAorICAgICAgICAgICAgcmVxX2J5dGVzLmxlbigpLAorICAgICAgICAg ICAgcmVxX2J5dGVzCisgICAgICAgICk7CisKKyAgICAgICAgbGV0IHJlcSA9CisgICAgICAgICAg ICB1bnNhZmUgeyBzdGQ6OnB0cjo6cmVhZF91bmFsaWduZWQocmVxX2J5dGVzLmFzX3B0cigpIGFz ICpjb25zdCBDb25uZWN0aW9uUmVxdWVzdCkgfTsKKworICAgICAgICB0cmFjaW5nOjpkZWJ1ZyEo CisgICAgICAgICAgICAiQ29ubmVjdGlvbiByZXF1ZXN0OiBpZD17fSwgc2l6ZT17fSwgbWF4X21z Z19zaXplPXt9IiwKKyAgICAgICAgICAgICpyZXEuaGRyLmlkLAorICAgICAgICAgICAgKnJlcS5o ZHIuc2l6ZSwKKyAgICAgICAgICAgIHJlcS5tYXhfbXNnX3NpemUKKyAgICAgICAgKTsKKworICAg ICAgICAvLyBHZXQgcGVlciBjcmVkZW50aWFscyAoU09fUEVFUkNSRUQgb24gTGludXgpCisgICAg ICAgIGxldCAodWlkLCBnaWQsIHBpZCkgPSBnZXRfcGVlcl9jcmVkZW50aWFscyhmZCk/OworCisg ICAgICAgIC8vIEF1dGhlbnRpY2F0ZSB1c2luZyBIYW5kbGVyIHRyYWl0CisgICAgICAgIGxldCBy ZWFkX29ubHkgPSBtYXRjaCBoYW5kbGVyLmF1dGhlbnRpY2F0ZSh1aWQsIGdpZCkgeworICAgICAg ICAgICAgU29tZShQZXJtaXNzaW9uczo6UmVhZFdyaXRlKSA9PiB7CisgICAgICAgICAgICAgICAg dHJhY2luZzo6aW5mbyEocGlkLCB1aWQsIGdpZCwgIkNvbm5lY3Rpb24gYWNjZXB0ZWQgd2l0aCBy ZWFkLXdyaXRlIGFjY2VzcyIpOworICAgICAgICAgICAgICAgIGZhbHNlCisgICAgICAgICAgICB9 CisgICAgICAgICAgICBTb21lKFBlcm1pc3Npb25zOjpSZWFkT25seSkgPT4geworICAgICAgICAg ICAgICAgIHRyYWNpbmc6OmluZm8hKHBpZCwgdWlkLCBnaWQsICJDb25uZWN0aW9uIGFjY2VwdGVk IHdpdGggcmVhZC1vbmx5IGFjY2VzcyIpOworICAgICAgICAgICAgICAgIHRydWUKKyAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgIHRyYWNpbmc6Ondh cm4hKAorICAgICAgICAgICAgICAgICAgICBwaWQsCisgICAgICAgICAgICAgICAgICAgIHVpZCwK KyAgICAgICAgICAgICAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgICAgICAiQ29ubmVjdGlv biByZWplY3RlZCBieSBhdXRoZW50aWNhdGlvbiBwb2xpY3kiCisgICAgICAgICAgICAgICAgKTsK KyAgICAgICAgICAgICAgICBzZW5kX2Nvbm5lY3Rpb25fcmVzcG9uc2UoJm11dCBzdHJlYW0sIC1s aWJjOjpFUEVSTSwgY29ubl9pZCwgMCwgIiIsICIiLCAiIikuYXdhaXQ/OworICAgICAgICAgICAg ICAgIGFueWhvdzo6YmFpbCEoIkNvbm5lY3Rpb24gYXV0aGVudGljYXRpb24gZmFpbGVkIik7Cisg ICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gQ3JlYXRlIGNvbm5lY3Rpb24g ZGVzY3JpcHRvciBmb3IgcmluZyBidWZmZXIgbmFtaW5nCisgICAgICAgIGxldCBjb25uX2Rlc2Mg PSBmb3JtYXQhKCJ7fS17fS17fSIsIHN0ZDo6cHJvY2Vzczo6aWQoKSwgcGlkLCBjb25uX2lkKTsK KyAgICAgICAgbGV0IG1heF9tc2dfc2l6ZSA9IHJlcS5tYXhfbXNnX3NpemUubWF4KDgxOTIpOwor CisgICAgICAgIC8vIENyZWF0ZSByaW5nIGJ1ZmZlcnMgaW4gL2Rldi9zaG0KKyAgICAgICAgLy8g UGFzcyBtYXhfbXNnX3NpemUgZGlyZWN0bHkgLSBSaW5nQnVmZmVyOjpuZXcoKSB3aWxsIGFkZCBR Ql9SQl9DSFVOS19NQVJHSU4gYW5kIHJvdW5kIHVwCisgICAgICAgIC8vIChqdXN0IGxpa2UgcWJf cmJfb3BlbigpIGRvZXMgb24gdGhlIGNsaWVudCBzaWRlKQorICAgICAgICBsZXQgcmluZ19zaXpl ID0gbWF4X21zZ19zaXplIGFzIHVzaXplOworCisgICAgICAgIHRyYWNpbmc6OmRlYnVnISgKKyAg ICAgICAgICAgICJDcmVhdGluZyByaW5nIGJ1ZmZlcnMgZm9yIGNvbm5lY3Rpb24ge306IHNpemU9 e30gYnl0ZXMiLAorICAgICAgICAgICAgY29ubl9pZCwKKyAgICAgICAgICAgIHJpbmdfc2l6ZQor ICAgICAgICApOworCisgICAgICAgIC8vIFJlcXVlc3QgcmluZzogY2xpZW50IHdyaXRlcywgc2Vy dmVyIHJlYWRzCisgICAgICAgIC8vIFJlcXVlc3QgcmluZyBuZWVkcyBzaXplb2YoaW50MzJfdCkg Zm9yIGZsb3cgY29udHJvbCAoc2hhcmVkX3VzZXJfZGF0YSkKKyAgICAgICAgbGV0IHJlcXVlc3Rf cmJfbmFtZSA9IGZvcm1hdCEoIntjb25uX2Rlc2N9LXtzZXJ2aWNlX25hbWV9LXJlcXVlc3QiKTsK KyAgICAgICAgbGV0IHJlcXVlc3RfcmIgPSBSaW5nQnVmZmVyOjpuZXcoCisgICAgICAgICAgICAi L2Rldi9zaG0iLAorICAgICAgICAgICAgJnJlcXVlc3RfcmJfbmFtZSwKKyAgICAgICAgICAgIHJp bmdfc2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6bWVtOjpzaXplX29mOjo8aTMyPigpLAorICAgICAg ICApCisgICAgICAgIC5jb250ZXh0KCJGYWlsZWQgdG8gY3JlYXRlIHJlcXVlc3QgcmluZyBidWZm ZXIiKT87CisKKyAgICAgICAgLy8gUmVzcG9uc2UgcmluZzogc2VydmVyIHdyaXRlcywgY2xpZW50 IHJlYWRzCisgICAgICAgIC8vIFJlc3BvbnNlIHJpbmcgZG9lc24ndCBuZWVkIHNoYXJlZF91c2Vy X2RhdGEKKyAgICAgICAgbGV0IHJlc3BvbnNlX3JiX25hbWUgPSBmb3JtYXQhKCJ7Y29ubl9kZXNj fS17c2VydmljZV9uYW1lfS1yZXNwb25zZSIpOworICAgICAgICBsZXQgcmVzcG9uc2VfcmIgPSBS aW5nQnVmZmVyOjpuZXcoIi9kZXYvc2htIiwgJnJlc3BvbnNlX3JiX25hbWUsIHJpbmdfc2l6ZSwg MCkKKyAgICAgICAgICAgIC5jb250ZXh0KCJGYWlsZWQgdG8gY3JlYXRlIHJlc3BvbnNlIHJpbmcg YnVmZmVyIik/OworCisgICAgICAgIC8vIEV2ZW50IHJpbmc6IHNlcnZlciB3cml0ZXMsIGNsaWVu dCByZWFkcyAoZm9yIGFzeW5jIG5vdGlmaWNhdGlvbnMpCisgICAgICAgIC8vIEV2ZW50IHJpbmcg ZG9lc24ndCBuZWVkIHNoYXJlZF91c2VyX2RhdGEKKyAgICAgICAgbGV0IGV2ZW50X3JiX25hbWUg PSBmb3JtYXQhKCJ7Y29ubl9kZXNjfS17c2VydmljZV9uYW1lfS1ldmVudCIpOworICAgICAgICBs ZXQgZXZlbnRfcmIgPSBSaW5nQnVmZmVyOjpuZXcoIi9kZXYvc2htIiwgJmV2ZW50X3JiX25hbWUs IHJpbmdfc2l6ZSwgMCkKKyAgICAgICAgICAgIC5jb250ZXh0KCJGYWlsZWQgdG8gY3JlYXRlIGV2 ZW50IHJpbmcgYnVmZmVyIik/OworCisgICAgICAgIC8vIENvbGxlY3QgZnVsbCBwYXRocyBmb3Ig Y2xlYW51cCB0cmFja2luZworICAgICAgICBsZXQgcmVxdWVzdF9kYXRhX3BhdGggPSBQYXRoQnVm Ojpmcm9tKGZvcm1hdCEoIi9kZXYvc2htL3FiLXtyZXF1ZXN0X3JiX25hbWV9LWRhdGEiKSk7Cisg ICAgICAgIGxldCByZXNwb25zZV9kYXRhX3BhdGggPSBQYXRoQnVmOjpmcm9tKGZvcm1hdCEoIi9k ZXYvc2htL3FiLXtyZXNwb25zZV9yYl9uYW1lfS1kYXRhIikpOworICAgICAgICBsZXQgZXZlbnRf ZGF0YV9wYXRoID0gUGF0aEJ1Zjo6ZnJvbShmb3JtYXQhKCIvZGV2L3NobS9xYi17ZXZlbnRfcmJf bmFtZX0tZGF0YSIpKTsKKworICAgICAgICAvLyBTZW5kIGNvbm5lY3Rpb24gcmVzcG9uc2Ugd2l0 aCByaW5nIGJ1ZmZlciBCQVNFIE5BTUVTIChub3QgZnVsbCBwYXRocykKKyAgICAgICAgLy8gbGli cWIgY2xpZW50IGV4cGVjdHMgYmFzZSBuYW1lcyAoZS5nLiwgIjEyMy00NTYtMS1wdmUyLXJlcXVl c3QiKQorICAgICAgICAvLyBJdCB3aWxsIGludGVybmFsbHkgcHJlcGVuZCAiL2Rldi9zaG0vcWIt IiBhbmQgYXBwZW5kICItaGVhZGVyIiBvciAiLWRhdGEiCisgICAgICAgIHNlbmRfY29ubmVjdGlv bl9yZXNwb25zZSgKKyAgICAgICAgICAgICZtdXQgc3RyZWFtLAorICAgICAgICAgICAgMCwKKyAg ICAgICAgICAgIGNvbm5faWQsCisgICAgICAgICAgICBtYXhfbXNnX3NpemUsCisgICAgICAgICAg ICAmcmVxdWVzdF9yYl9uYW1lLAorICAgICAgICAgICAgJnJlc3BvbnNlX3JiX25hbWUsCisgICAg ICAgICAgICAmZXZlbnRfcmJfbmFtZSwKKyAgICAgICAgKQorICAgICAgICAuYXdhaXQ/OworCisg ICAgICAgIC8vIFNwYXduIHJlcXVlc3QgaGFuZGxlciB0YXNrCisgICAgICAgIGxldCBoYW5kbGVy X2Zvcl90YXNrID0gaGFuZGxlci5jbG9uZSgpOworICAgICAgICBsZXQgY2FuY2VsbGF0aW9uX2Zv cl90YXNrID0gY2FuY2VsbGF0aW9uX3Rva2VuLmNoaWxkX3Rva2VuKCk7CisKKyAgICAgICAgbGV0 IHRhc2tfaGFuZGxlID0gdG9raW86OnNwYXduKGFzeW5jIG1vdmUgeworICAgICAgICAgICAgU2Vs Zjo6aGFuZGxlX3JlcXVlc3RzKAorICAgICAgICAgICAgICAgIHJlcXVlc3RfcmIsCisgICAgICAg ICAgICAgICAgcmVzcG9uc2VfcmIsCisgICAgICAgICAgICAgICAgaGFuZGxlcl9mb3JfdGFzaywK KyAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25fZm9yX3Rhc2ssCisgICAgICAgICAgICAgICAg Y29ubl9pZCwKKyAgICAgICAgICAgICAgICB1aWQsCisgICAgICAgICAgICAgICAgZ2lkLAorICAg ICAgICAgICAgICAgIHBpZCwKKyAgICAgICAgICAgICAgICByZWFkX29ubHksCisgICAgICAgICAg ICApCisgICAgICAgICAgICAuYXdhaXQ7CisgICAgICAgIH0pOworCisgICAgICAgIHRyYWNpbmc6 OmluZm8hKCJDb25uZWN0aW9uIHt9IGVzdGFibGlzaGVkIChTSE0gdHJhbnNwb3J0KSIsIGNvbm5f aWQpOworCisgICAgICAgIE9rKFNlbGYgeworICAgICAgICAgICAgY29ubl9pZCwKKyAgICAgICAg ICAgIHBpZCwKKyAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgIGdpZCwKKyAgICAgICAgICAg IHJlYWRfb25seSwKKyAgICAgICAgICAgIF9zZXR1cF9zdHJlYW06IHN0cmVhbSwKKyAgICAgICAg ICAgIHJlcXVlc3RfcmI6IE5vbmUsICAvLyBNb3ZlZCB0byB0YXNrCisgICAgICAgICAgICByZXNw b25zZV9yYjogTm9uZSwgLy8gTW92ZWQgdG8gdGFzaworICAgICAgICAgICAgX2V2ZW50X3JiOiBT b21lKGV2ZW50X3JiKSwKKyAgICAgICAgICAgIHJpbmdfYnVmZmVyX3BhdGhzOiB2ZWMhW3JlcXVl c3RfZGF0YV9wYXRoLCByZXNwb25zZV9kYXRhX3BhdGgsIGV2ZW50X2RhdGFfcGF0aF0sCisgICAg ICAgICAgICB0YXNrX2hhbmRsZTogU29tZSh0YXNrX2hhbmRsZSksCisgICAgICAgIH0pCisgICAg fQorCisgICAgLy8vIFJlcXVlc3QgaGFuZGxlciBsb29wIC0gcmVjZWl2ZXMgYW5kIHByb2Nlc3Nl cyBtZXNzYWdlcyB2aWEgcmluZyBidWZmZXJzCisgICAgLy8vCisgICAgLy8vIFJ1bnMgaW4gYSBi YWNrZ3JvdW5kIGFzeW5jIHRhc2ssIHJlY2VpdmluZyByZXF1ZXN0cyBhbmQgc2VuZGluZyByZXNw b25zZXMKKyAgICAvLy8gdGhyb3VnaCBzaGFyZWQgbWVtb3J5IHJpbmcgYnVmZmVycy4KKyAgICAv Ly8KKyAgICAvLy8gVXNlcyB0b2tpbyBjaGFubmVscyB0byBpbXBsZW1lbnQgYSB3b3JrcXVldWUg d2l0aCBmbG93IGNvbnRyb2w6CisgICAgLy8vIC0gRmxvd0NvbnRyb2w6Ok9LOiBQcm9jZWVkIHdp dGggc2VuZGluZworICAgIC8vLyAtIEZsb3dDb250cm9sOjpTTE9XX0RPV046IFJlZHVjZSBzZW5k IHJhdGUKKyAgICAvLy8gLSBGbG93Q29udHJvbDo6U1RPUDogRG8gbm90IHNlbmQKKyAgICAvLy8K KyAgICAvLy8gQXJjaGl0ZWN0dXJlOiBUaHJlZSBjb25jdXJyZW50IHRhc2tzIGNvbW11bmljYXRp bmcgdmlhIHRva2lvIGNoYW5uZWxzOgorICAgIC8vLyAxLiBSZXF1ZXN0IHJlY2VpdmVyOiByZWFk cyBmcm9tIHJlcXVlc3QgcmluZyBidWZmZXIsIHF1ZXVlcyB3b3JrCisgICAgLy8vIDIuIFdvcmtl cjogcHJvY2Vzc2VzIHJlcXVlc3RzIGZyb20gd29yayBxdWV1ZSwgc2VuZHMgdG8gcmVzcG9uc2Ug cXVldWUKKyAgICAvLy8gMy4gUmVzcG9uc2Ugc2VuZGVyOiB3cml0ZXMgcmVzcG9uc2VzIGZyb20g cmVzcG9uc2UgcXVldWUgdG8gcmVzcG9uc2UgcmluZyBidWZmZXIKKyAgICAjW2FsbG93KGNsaXBw eTo6dG9vX21hbnlfYXJndW1lbnRzKV0KKyAgICBhc3luYyBmbiBoYW5kbGVfcmVxdWVzdHMoCisg ICAgICAgIG11dCByZXF1ZXN0X3JiOiBSaW5nQnVmZmVyLAorICAgICAgICBtdXQgcmVzcG9uc2Vf cmI6IFJpbmdCdWZmZXIsCisgICAgICAgIGhhbmRsZXI6IEFyYzxkeW4gSGFuZGxlcj4sCisgICAg ICAgIGNhbmNlbGxhdGlvbl90b2tlbjogQ2FuY2VsbGF0aW9uVG9rZW4sCisgICAgICAgIGNvbm5f aWQ6IHU2NCwKKyAgICAgICAgdWlkOiB1MzIsCisgICAgICAgIGdpZDogdTMyLAorICAgICAgICBw aWQ6IHUzMiwKKyAgICAgICAgcmVhZF9vbmx5OiBib29sLAorICAgICkgeworICAgICAgICB0cmFj aW5nOjpkZWJ1ZyEoIlJlcXVlc3QgaGFuZGxlciBzdGFydGVkIGZvciBjb25uZWN0aW9uIHt9Iiwg Y29ubl9pZCk7CisKKyAgICAgICAgLy8gV29ya3F1ZXVlIGNhcGFjaXR5IGFuZCBmbG93IGNvbnRy b2wgdGhyZXNob2xkcworICAgICAgICAvLworICAgICAgICAvLyBOT1RFOiBUaGUgQyBpbXBsZW1l bnRhdGlvbiAodXNpbmcgbGlicWIpIHByb2Nlc3NlcyByZXF1ZXN0cyBzeW5jaHJvbm91c2x5Cisg ICAgICAgIC8vIGluIHRoZSBldmVudCBsb29wIGNhbGxiYWNrIChzZXJ2ZXIuYzoxNTkgczFfbXNn X3Byb2Nlc3NfZm4pLCBzbyB0aGVyZSdzCisgICAgICAgIC8vIG5vIGV4cGxpY2l0IHF1ZXVlLiBX ZSBhZGQgYXN5bmMgcXVldWVpbmcgaW4gUnVzdCB0byBhbGxvdyBub24tYmxvY2tpbmcKKyAgICAg ICAgLy8gcmVxdWVzdCBoYW5kbGluZyB3aXRoIHRva2lvLgorICAgICAgICAvLworICAgICAgICAv LyBRdWV1ZSBjYXBhY2l0eSBvZiA4IGlzIGNob3NlbiBhcyBhIHJlYXNvbmFibGUgZGVmYXVsdCBm b3I6CisgICAgICAgIC8vIC0gVHlwaWNhbCBQVkUgd29ya2xvYWRzOiBNb3N0IElQQyBvcGVyYXRp b25zIGFyZSBmYXN0IChmaWxlIHJlYWRzL3dyaXRlcykKKyAgICAgICAgLy8gLSBNZW1vcnkgZWZm aWNpZW5jeTogRWFjaCBxdWV1ZWQgaXRlbSA9IH4xS0IgKHJlcXVlc3QgaGVhZGVyICsgZGF0YSkK KyAgICAgICAgLy8gLSBCYWNrcHJlc3N1cmU6IFNtYWxsIHF1ZXVlIGVuY291cmFnZXMgZmxvdyBj b250cm9sIHRvIGFjdGl2YXRlIHF1aWNrbHkKKyAgICAgICAgLy8gLSBUZXN0aW5nOiBGbG93IGNv bnRyb2wgdGVzdCAoMDItZmxvdy1jb250cm9sLnNoKSB2ZXJpZmllcyAyMCBjb25jdXJyZW50Cisg ICAgICAgIC8vICAgb3BlcmF0aW9ucyB3b3JrIGNvcnJlY3RseSB3aXRoIGNhcGFjaXR5IDgKKyAg ICAgICAgLy8KKyAgICAgICAgLy8gRmxvdyBjb250cm9sIHRocmVzaG9sZHMgbWF0Y2ggbGlicWIn cyByYXRlIGxpbWl0aW5nIChpcGNzLmM6MTk5LTIwMyk6CisgICAgICAgIC8vIC0gRmxvd0NvbnRy b2w6Ok9LICgwKTogUHJvY2VlZCB3aXRoIHNlbmRpbmcgKFFCX0lQQ1NfUkFURV9OT1JNQUwpCisg ICAgICAgIC8vIC0gRmxvd0NvbnRyb2w6OlNMT1dfRE9XTiAoMSk6IFJlZHVjZSBzZW5kIHJhdGUg KFFCX0lQQ1NfUkFURV9PRkYpCisgICAgICAgIC8vIC0gRmxvd0NvbnRyb2w6OlNUT1AgKDIpOiBE byBub3Qgc2VuZCAoUUJfSVBDU19SQVRFX09GRl8yKQorICAgICAgICBjb25zdCBNQVhfUEVORElO R19SRVFVRVNUUzogdXNpemUgPSA4OworCisgICAgICAgIC8vIFNldCBTTE9XX0RPV04gd2hlbiBx dWV1ZSByZWFjaGVzIDc1JSBjYXBhY2l0eSAoNi84IGl0ZW1zKQorICAgICAgICAvLyBUaGlzIHBy b3ZpZGVzIGVhcmx5IHdhcm5pbmcgYmVmb3JlIHRoZSBxdWV1ZSBmaWxscyBjb21wbGV0ZWx5LAor ICAgICAgICAvLyBhbGxvd2luZyBjbGllbnRzIHRvIHRocm90dGxlIGJlZm9yZSBoaXR0aW5nIFNU T1AKKyAgICAgICAgY29uc3QgRkNfV0FSTklOR19USFJFU0hPTEQ6IHVzaXplID0gNjsKKworICAg ICAgICAvLyBXb3JrIHF1ZXVlOiAoaGVhZGVyLCByZXF1ZXN0KSAtPiB3b3JrZXIKKyAgICAgICAg bGV0ICh3b3JrX3R4LCBtdXQgd29ya19yeCkgPQorICAgICAgICAgICAgdG9raW86OnN5bmM6Om1w c2M6OmNoYW5uZWw6OjwoUmVxdWVzdEhlYWRlciwgUmVxdWVzdCk+KE1BWF9QRU5ESU5HX1JFUVVF U1RTKTsKKworICAgICAgICAvLyBSZXNwb25zZSBxdWV1ZTogd29ya2VyIC0+IHJlc3BvbnNlIHNl bmRlcgorICAgICAgICAvLyBVbmJvdW5kZWQgYmVjYXVzZSByZXNwb25zZXMgbXVzdCBub3QgYmxv Y2sgdGhlIHdvcmtlcgorICAgICAgICBsZXQgKHJlc3BvbnNlX3R4LCBtdXQgcmVzcG9uc2Vfcngp ID0KKyAgICAgICAgICAgIHRva2lvOjpzeW5jOjptcHNjOjp1bmJvdW5kZWRfY2hhbm5lbDo6PChS ZXF1ZXN0SGVhZGVyLCBSZXNwb25zZSk+KCk7CisKKyAgICAgICAgLy8gU3Bhd24gd29ya2VyIHRh c2sgdG8gcHJvY2VzcyByZXF1ZXN0cworICAgICAgICBsZXQgd29ya2VyX2hhbmRsZXIgPSBoYW5k bGVyLmNsb25lKCk7CisgICAgICAgIGxldCB3b3JrZXJfcmVzcG9uc2VfdHggPSByZXNwb25zZV90 eC5jbG9uZSgpOworICAgICAgICBsZXQgd29ya2VyX3Rhc2sgPSB0b2tpbzo6c3Bhd24oYXN5bmMg bW92ZSB7CisgICAgICAgICAgICB3aGlsZSBsZXQgU29tZSgoaGVhZGVyLCByZXF1ZXN0KSkgPSB3 b3JrX3J4LnJlY3YoKS5hd2FpdCB7CisgICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJfcmVzcG9u c2UgPSB3b3JrZXJfaGFuZGxlci5oYW5kbGUocmVxdWVzdCkuYXdhaXQ7CisgICAgICAgICAgICAg ICAgLy8gU2VuZCB0byByZXNwb25zZSBxdWV1ZSAodW5ib3VuZGVkLCBuZXZlciBibG9ja3MpCisg ICAgICAgICAgICAgICAgbGV0IF8gPSB3b3JrZXJfcmVzcG9uc2VfdHguc2VuZCgoaGVhZGVyLCBo YW5kbGVyX3Jlc3BvbnNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAg IC8vIFNwYXduIHJlc3BvbnNlIHNlbmRlciB0YXNrCisgICAgICAgIGxldCByZXNwb25zZV90YXNr ID0gdG9raW86OnNwYXduKGFzeW5jIG1vdmUgeworICAgICAgICAgICAgd2hpbGUgbGV0IFNvbWUo KGhlYWRlciwgaGFuZGxlcl9yZXNwb25zZSkpID0gcmVzcG9uc2VfcngucmVjdigpLmF3YWl0IHsK KyAgICAgICAgICAgICAgICBTZWxmOjpzZW5kX3Jlc3BvbnNlKCZtdXQgcmVzcG9uc2VfcmIsIGhl YWRlciwgaGFuZGxlcl9yZXNwb25zZSkuYXdhaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0p OworCisgICAgICAgIC8vIE1haW4gcmVxdWVzdCByZWNlaXZlciBsb29wCisgICAgICAgIGxvb3Ag eworICAgICAgICAgICAgLy8gV2FpdCBmb3IgaW5jb21pbmcgcmVxdWVzdCAoYXN5bmMsIHlpZWxk cyB0byB0b2tpbyBzY2hlZHVsZXIpCisgICAgICAgICAgICBsZXQgcmVxdWVzdF9kYXRhID0gdG9r aW86OnNlbGVjdCEgeworICAgICAgICAgICAgICAgIF8gPSBjYW5jZWxsYXRpb25fdG9rZW4uY2Fu Y2VsbGVkKCkgPT4geworICAgICAgICAgICAgICAgICAgICB0cmFjaW5nOjpkZWJ1ZyEoIlJlcXVl c3QgaGFuZGxlciBjYW5jZWxsZWQgZm9yIGNvbm5lY3Rpb24ge30iLCBjb25uX2lkKTsKKyAgICAg ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg IHJlc3VsdCA9IHJlcXVlc3RfcmIucmVjdigpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbWF0 Y2ggcmVzdWx0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9rKGRhdGEpID0+IGRhdGEsCisg ICAgICAgICAgICAgICAgICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgICAgICAgICAg ICAgICAgIHRyYWNpbmc6OmVycm9yISgiRXJyb3IgcmVjZWl2aW5nIHJlcXVlc3Qgb24gY29ubiB7 fToge30iLCBjb25uX2lkLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsK KyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIEFmdGVyIHJlY2Vp dmluZyBmcm9tIHJpbmcgYnVmZmVyLCBmbG93IGNvbnRyb2wgaXMgYWxyZWFkeSBzZXQgdG8gMAor ICAgICAgICAgICAgLy8gYnkgUmluZ0J1ZmZlclNoYXJlZDo6cmVhZF9jaHVuaygpCisKKyAgICAg ICAgICAgIC8vIFBhcnNlIHJlcXVlc3QgaGVhZGVyCisgICAgICAgICAgICBpZiByZXF1ZXN0X2Rh dGEubGVuKCkgPCBzdGQ6Om1lbTo6c2l6ZV9vZjo6PFJlcXVlc3RIZWFkZXI+KCkgeworICAgICAg ICAgICAgICAgIHRyYWNpbmc6Ondhcm4hKAorICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCB0 b28gc21hbGw6IHt9IGJ5dGVzIChuZWVkIHt9IGZvciBoZWFkZXIpIiwKKyAgICAgICAgICAgICAg ICAgICAgcmVxdWVzdF9kYXRhLmxlbigpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1lbTo6 c2l6ZV9vZjo6PFJlcXVlc3RIZWFkZXI+KCkKKyAgICAgICAgICAgICAgICApOworICAgICAgICAg ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgaGVhZGVy ID0KKyAgICAgICAgICAgICAgICB1bnNhZmUgeyBzdGQ6OnB0cjo6cmVhZF91bmFsaWduZWQocmVx dWVzdF9kYXRhLmFzX3B0cigpIGFzICpjb25zdCBSZXF1ZXN0SGVhZGVyKSB9OworCisgICAgICAg ICAgICB0cmFjaW5nOjpkZWJ1ZyEoCisgICAgICAgICAgICAgICAgIlJlY2VpdmVkIHJlcXVlc3Qg b24gY29ubiB7fTogaWQ9e30sIHNpemU9e30iLAorICAgICAgICAgICAgICAgIGNvbm5faWQsCisg ICAgICAgICAgICAgICAgKmhlYWRlci5pZCwKKyAgICAgICAgICAgICAgICAqaGVhZGVyLnNpemUK KyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIC8vIEV4dHJhY3QgbWVzc2FnZSBkYXRhIChh ZnRlciBoZWFkZXIpCisgICAgICAgICAgICBsZXQgaGVhZGVyX3NpemUgPSBzdGQ6Om1lbTo6c2l6 ZV9vZjo6PFJlcXVlc3RIZWFkZXI+KCk7CisgICAgICAgICAgICBsZXQgbXNnX2RhdGEgPSAmcmVx dWVzdF9kYXRhW2hlYWRlcl9zaXplLi5dOworCisgICAgICAgICAgICAvLyBCdWlsZCByZXF1ZXN0 IG9iamVjdCB3aXRoIGZ1bGwgY29udGV4dAorICAgICAgICAgICAgbGV0IHJlcXVlc3QgPSBSZXF1 ZXN0IHsKKyAgICAgICAgICAgICAgICBtc2dfaWQ6ICpoZWFkZXIuaWQsCisgICAgICAgICAgICAg ICAgZGF0YTogbXNnX2RhdGEudG9fdmVjKCksCisgICAgICAgICAgICAgICAgaXNfcmVhZF9vbmx5 OiByZWFkX29ubHksCisgICAgICAgICAgICAgICAgY29ubl9pZCwKKyAgICAgICAgICAgICAgICB1 aWQsCisgICAgICAgICAgICAgICAgZ2lkLAorICAgICAgICAgICAgICAgIHBpZCwKKyAgICAgICAg ICAgIH07CisKKyAgICAgICAgICAgIC8vIFNlbmQgdG8gd29ya3F1ZXVlIC0gaW1wbGVtZW50cyBi YWNrcHJlc3N1cmUgdmlhIGZsb3cgY29udHJvbAorICAgICAgICAgICAgbWF0Y2ggd29ya190eC50 cnlfc2VuZCgoaGVhZGVyLCByZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgIE9rKCgpKSA9PiB7 CisgICAgICAgICAgICAgICAgICAgIC8vIFJlcXVlc3QgcXVldWVkIHN1Y2Nlc3NmdWxseQorCisg ICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBmbG93IGNvbnRyb2wgYmFzZWQgb24gcXVldWUg ZGVwdGgKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXRjaGVzIGxpYnFiJ3MgcmF0ZSBs aW1pdGluZyBiZWhhdmlvcgorICAgICAgICAgICAgICAgICAgICBsZXQgcXVldWVfbGVuID0gTUFY X1BFTkRJTkdfUkVRVUVTVFMgLSB3b3JrX3R4LmNhcGFjaXR5KCk7CisgICAgICAgICAgICAgICAg ICAgIGxldCBmY192YWx1ZSA9IGlmIHF1ZXVlX2xlbiA+PSBNQVhfUEVORElOR19SRVFVRVNUUyB7 CisgICAgICAgICAgICAgICAgICAgICAgICBGbG93Q29udHJvbDo6U1RPUCAvLyBRdWV1ZSBmdWxs IC0gc3RvcCBzZW5kaW5nCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiBxdWV1ZV9sZW4g Pj0gRkNfV0FSTklOR19USFJFU0hPTEQgeworICAgICAgICAgICAgICAgICAgICAgICAgRmxvd0Nv bnRyb2w6OlNMT1dfRE9XTiAvLyBRdWV1ZSBhcHByb2FjaGluZyBmdWxsIC0gc2xvdyBkb3duCisg ICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGbG93 Q29udHJvbDo6T0sgLy8gUXVldWUgaGFzIHNwYWNlIC0gT0sgdG8gc2VuZAorICAgICAgICAgICAg ICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIGlmIGZjX3ZhbHVlID4gRmxvd0NvbnRy b2w6Ok9LIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNpbmc6OmRlYnVnISgKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAiU2V0dGluZyBmbG93IGNvbnRyb2wgdG8ge30gKHF1ZXVl OiB7fS97fSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjX3ZhbHVlLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAg ICAgICBNQVhfUEVORElOR19SRVFVRVNUUworICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAg ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JiLmZsb3df Y29udHJvbC5zZXQoZmNfdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg ICBFcnIodG9raW86OnN5bmM6Om1wc2M6OmVycm9yOjpUcnlTZW5kRXJyb3I6OkZ1bGwoXykpID0+ IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUXVldWUgaXMgZnVsbCAtIHNldCBmbG93IGNvbnRy b2wgdG8gU1RPUCBhbmQgc2VuZCBFQUdBSU4KKyAgICAgICAgICAgICAgICAgICAgdHJhY2luZzo6 d2FybiEoIldvcmsgcXVldWUgZnVsbCBvbiBjb25uIHt9LCBzZW5kaW5nIEVBR0FJTiIsIGNvbm5f aWQpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0X3JiLmZsb3dfY29udHJvbC5zZXQoRmxv d0NvbnRyb2w6OlNUT1ApOworCisgICAgICAgICAgICAgICAgICAgIGxldCBlcnJvcl9yZXNwb25z ZSA9IFJlc3BvbnNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGU6IC1saWJj OjpFQUdBSU4sCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBWZWM6Om5ldygpLAorICAg ICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGVycm9yIHJl c3BvbnNlIGRpcmVjdGx5IChieXBhc3NpbmcgcXVldWUpCisgICAgICAgICAgICAgICAgICAgIGxl dCBfID0gcmVzcG9uc2VfdHguc2VuZCgoaGVhZGVyLCBlcnJvcl9yZXNwb25zZSkpOworICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIodG9raW86OnN5bmM6Om1wc2M6OmVycm9y OjpUcnlTZW5kRXJyb3I6OkNsb3NlZChfKSkgPT4geworICAgICAgICAgICAgICAgICAgICB0cmFj aW5nOjplcnJvciEoIldvcmsgcXVldWUgY2xvc2VkIG9uIGNvbm4ge30iLCBjb25uX2lkKTsKKyAg ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg fQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2xlYW51cDogZHJvcCBjaGFubmVscyB0byBzaWdu YWwgdGFza3MgdG8gZXhpdAorICAgICAgICBkcm9wKHdvcmtfdHgpOworICAgICAgICBkcm9wKHJl c3BvbnNlX3R4KTsKKyAgICAgICAgbGV0IF8gPSB3b3JrZXJfdGFzay5hd2FpdDsKKyAgICAgICAg bGV0IF8gPSByZXNwb25zZV90YXNrLmF3YWl0OworCisgICAgICAgIHRyYWNpbmc6OmRlYnVnISgi UmVxdWVzdCBoYW5kbGVyIGZpbmlzaGVkIGZvciBjb25uZWN0aW9uIHt9IiwgY29ubl9pZCk7Cisg ICAgfQorCisgICAgLy8vIFNlbmQgYSByZXNwb25zZSB0byB0aGUgY2xpZW50CisgICAgYXN5bmMg Zm4gc2VuZF9yZXNwb25zZSgKKyAgICAgICAgcmVzcG9uc2VfcmI6ICZtdXQgUmluZ0J1ZmZlciwK KyAgICAgICAgaGVhZGVyOiBSZXF1ZXN0SGVhZGVyLAorICAgICAgICBoYW5kbGVyX3Jlc3BvbnNl OiBSZXNwb25zZSwKKyAgICApIHsKKyAgICAgICAgLy8gQnVpbGQgYW5kIHNlcmlhbGl6ZSByZXNw b25zZTogW2hlYWRlcl1bZGF0YV0KKyAgICAgICAgbGV0IHJlc3BvbnNlX3NpemUgPSBzdGQ6Om1l bTo6c2l6ZV9vZjo6PFJlc3BvbnNlSGVhZGVyPigpICsgaGFuZGxlcl9yZXNwb25zZS5kYXRhLmxl bigpOworICAgICAgICBsZXQgbXV0IHJlc3BvbnNlX2J5dGVzID0gVmVjOjp3aXRoX2NhcGFjaXR5 KHJlc3BvbnNlX3NpemUpOworCisgICAgICAgIGxldCByZXNwb25zZV9oZWFkZXIgPSBSZXNwb25z ZUhlYWRlciB7CisgICAgICAgICAgICBpZDogaGVhZGVyLmlkLAorICAgICAgICAgICAgc2l6ZTog KHJlc3BvbnNlX3NpemUgYXMgaTMyKS5pbnRvKCksCisgICAgICAgICAgICBlcnJvcjogaGFuZGxl cl9yZXNwb25zZS5lcnJvcl9jb2RlLmludG8oKSwKKyAgICAgICAgfTsKKworICAgICAgICByZXNw b25zZV9ieXRlcy5leHRlbmRfZnJvbV9zbGljZSh1bnNhZmUgeworICAgICAgICAgICAgc3RkOjpz bGljZTo6ZnJvbV9yYXdfcGFydHMoCisgICAgICAgICAgICAgICAgJnJlc3BvbnNlX2hlYWRlciBh cyAqY29uc3QgXyBhcyAqY29uc3QgdTgsCisgICAgICAgICAgICAgICAgc3RkOjptZW06OnNpemVf b2Y6OjxSZXNwb25zZUhlYWRlcj4oKSwKKyAgICAgICAgICAgICkKKyAgICAgICAgfSk7CisgICAg ICAgIHJlc3BvbnNlX2J5dGVzLmV4dGVuZF9mcm9tX3NsaWNlKCZoYW5kbGVyX3Jlc3BvbnNlLmRh dGEpOworCisgICAgICAgIHRyYWNpbmc6OmRlYnVnISgiUmVzcG9uc2UgaGVhZGVyIGJ5dGVzICgy NCk6IHs6MDJ4P30iLCAmcmVzcG9uc2VfYnl0ZXNbLi4yNF0pOworCisgICAgICAgIC8vIFNlbmQg cmVzcG9uc2UgKGFzeW5jLCB5aWVsZHMgaWYgYnVmZmVyIGZ1bGwpCisgICAgICAgIG1hdGNoIHJl c3BvbnNlX3JiLnNlbmQoJnJlc3BvbnNlX2J5dGVzKS5hd2FpdCB7CisgICAgICAgICAgICBPaygo KSkgPT4geworICAgICAgICAgICAgICAgIC8vIFJlc3BvbnNlIHNlbnQgc3VjY2Vzc2Z1bGx5Cisg ICAgICAgICAgICB9CisgICAgICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgICAgIHRy YWNpbmc6OmVycm9yISgiRmFpbGVkIHRvIHNlbmQgcmVzcG9uc2U6IHt9IiwgZSk7CisgICAgICAg ICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBHZXQgcGVlciBjcmVkZW50aWFscyBm cm9tIFVuaXggc29ja2V0CitmbiBnZXRfcGVlcl9jcmVkZW50aWFscyhmZDogaTMyKSAtPiBSZXN1 bHQ8KHUzMiwgdTMyLCB1MzIpPiB7CisgICAgI1tjZmcodGFyZ2V0X29zID0gImxpbnV4IildCisg ICAgeworICAgICAgICBsZXQgbXV0IHVjcmVkOiBsaWJjOjp1Y3JlZCA9IHVuc2FmZSB7IHN0ZDo6 bWVtOjp6ZXJvZWQoKSB9OworICAgICAgICBsZXQgbXV0IHVjcmVkX3NpemUgPSBzdGQ6Om1lbTo6 c2l6ZV9vZjo6PGxpYmM6OnVjcmVkPigpIGFzIGxpYmM6OnNvY2tsZW5fdDsKKworICAgICAgICBs ZXQgcmVzID0gdW5zYWZlIHsKKyAgICAgICAgICAgIGxpYmM6OmdldHNvY2tvcHQoCisgICAgICAg ICAgICAgICAgZmQsCisgICAgICAgICAgICAgICAgbGliYzo6U09MX1NPQ0tFVCwKKyAgICAgICAg ICAgICAgICBsaWJjOjpTT19QRUVSQ1JFRCwKKyAgICAgICAgICAgICAgICAmbXV0IHVjcmVkIGFz ICptdXQgXyBhcyAqbXV0IGxpYmM6OmNfdm9pZCwKKyAgICAgICAgICAgICAgICAmbXV0IHVjcmVk X3NpemUsCisgICAgICAgICAgICApCisgICAgICAgIH07CisKKyAgICAgICAgaWYgcmVzICE9IDAg eworICAgICAgICAgICAgYW55aG93OjpiYWlsISgKKyAgICAgICAgICAgICAgICAiZ2V0c29ja29w dCBTT19QRUVSQ1JFRCBmYWlsZWQ6IHt9IiwKKyAgICAgICAgICAgICAgICBzdGQ6OmlvOjpFcnJv cjo6bGFzdF9vc19lcnJvcigpCisgICAgICAgICAgICApOworICAgICAgICB9CisKKyAgICAgICAg T2soKHVjcmVkLnVpZCwgdWNyZWQuZ2lkLCB1Y3JlZC5waWQgYXMgdTMyKSkKKyAgICB9CisKKyAg ICAjW2NmZyhub3QodGFyZ2V0X29zID0gImxpbnV4IikpXQorICAgIHsKKyAgICAgICAgYW55aG93 OjpiYWlsISgiUGVlciBjcmVkZW50aWFscyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0i KTsKKyAgICB9Cit9CisKKy8vLyBTZW5kIGNvbm5lY3Rpb24gcmVzcG9uc2UgdG8gY2xpZW50Cith c3luYyBmbiBzZW5kX2Nvbm5lY3Rpb25fcmVzcG9uc2UoCisgICAgc3RyZWFtOiAmbXV0IFVuaXhT dHJlYW0sCisgICAgZXJyb3I6IGkzMiwKKyAgICBjb25uX2lkOiB1NjQsCisgICAgbWF4X21zZ19z aXplOiB1MzIsCisgICAgcmVxdWVzdF9wYXRoOiAmc3RyLAorICAgIHJlc3BvbnNlX3BhdGg6ICZz dHIsCisgICAgZXZlbnRfcGF0aDogJnN0ciwKKykgLT4gUmVzdWx0PCgpPiB7CisgICAgbGV0IG11 dCByZXNwb25zZSA9IENvbm5lY3Rpb25SZXNwb25zZSB7CisgICAgICAgIGhkcjogUmVzcG9uc2VI ZWFkZXIgeworICAgICAgICAgICAgaWQ6IE1TR19BVVRIRU5USUNBVEUuaW50bygpLAorICAgICAg ICAgICAgc2l6ZTogKHN0ZDo6bWVtOjpzaXplX29mOjo8Q29ubmVjdGlvblJlc3BvbnNlPigpIGFz IGkzMikuaW50bygpLAorICAgICAgICAgICAgZXJyb3I6IGVycm9yLmludG8oKSwKKyAgICAgICAg fSwKKyAgICAgICAgY29ubmVjdGlvbl90eXBlOiBDT05ORUNUSU9OX1RZUEVfU0hNLCAvLyBTaGFy ZWQgbWVtb3J5IHRyYW5zcG9ydAorICAgICAgICBtYXhfbXNnX3NpemUsCisgICAgICAgIGNvbm5l Y3Rpb246IGNvbm5faWQgYXMgdXNpemUsCisgICAgICAgIHJlcXVlc3Q6IFswdTg7IFBBVEhfTUFY XSwKKyAgICAgICAgcmVzcG9uc2U6IFswdTg7IFBBVEhfTUFYXSwKKyAgICAgICAgZXZlbnQ6IFsw dTg7IFBBVEhfTUFYXSwKKyAgICB9OworCisgICAgLy8gSGVscGVyIHRvIGNvcHkgcGF0aCBzdHJp bmdzIGludG8gZml4ZWQtc2l6ZSBidWZmZXJzCisgICAgbGV0IGNvcHlfcGF0aCA9IHxkZXN0OiAm bXV0IFt1ODsgUEFUSF9NQVhdLCBzcmM6ICZzdHJ8IHsKKyAgICAgICAgaWYgIXNyYy5pc19lbXB0 eSgpIHsKKyAgICAgICAgICAgIGxldCBsZW4gPSBzcmMubGVuKCkubWluKFBBVEhfTUFYIC0gMSk7 CisgICAgICAgICAgICBkZXN0Wy4ubGVuXS5jb3B5X2Zyb21fc2xpY2UoJnNyYy5hc19ieXRlcygp Wy4ubGVuXSk7CisgICAgICAgICAgICB0cmFjaW5nOjpkZWJ1ZyEoIkNvbm5lY3Rpb24gcmVzcG9u c2UgcGF0aDogJ3t9JyIsIHNyYyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgY29weV9wYXRo KCZtdXQgcmVzcG9uc2UucmVxdWVzdCwgcmVxdWVzdF9wYXRoKTsKKyAgICBjb3B5X3BhdGgoJm11 dCByZXNwb25zZS5yZXNwb25zZSwgcmVzcG9uc2VfcGF0aCk7CisgICAgY29weV9wYXRoKCZtdXQg cmVzcG9uc2UuZXZlbnQsIGV2ZW50X3BhdGgpOworCisgICAgLy8gU2VyaWFsaXplIGFuZCBzZW5k CisgICAgbGV0IHJlc3BvbnNlX2J5dGVzID0gdW5zYWZlIHsKKyAgICAgICAgc3RkOjpzbGljZTo6 ZnJvbV9yYXdfcGFydHMoCisgICAgICAgICAgICAmcmVzcG9uc2UgYXMgKmNvbnN0IF8gYXMgKmNv bnN0IHU4LAorICAgICAgICAgICAgc3RkOjptZW06OnNpemVfb2Y6OjxDb25uZWN0aW9uUmVzcG9u c2U+KCksCisgICAgICAgICkKKyAgICB9OworCisgICAgc3RyZWFtCisgICAgICAgIC53cml0ZV9h bGwocmVzcG9uc2VfYnl0ZXMpCisgICAgICAgIC5hd2FpdAorICAgICAgICAuY29udGV4dCgiRmFp bGVkIHRvIHNlbmQgY29ubmVjdGlvbiByZXNwb25zZSIpPzsKKworICAgIHRyYWNpbmc6OmRlYnVn ISgKKyAgICAgICAgIlNlbnQgY29ubmVjdGlvbiByZXNwb25zZTogZXJyb3I9e30sIGNvbm5lY3Rp b25fdHlwZT1TSE0iLAorICAgICAgICBlcnJvcgorICAgICk7CisKKyAgICBPaygoKSkKK30KKwor I1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVz dF0KKyAgICBmbiB0ZXN0X21hbGZvcm1lZF9yZXF1ZXN0X3NpemVfdmFsaWRhdGlvbigpIHsKKyAg ICAgICAgLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoZSBzaXplIHZhbGlkYXRpb24gbG9naWMgZm9y IG1hbGZvcm1lZCByZXF1ZXN0cworICAgICAgICAvLyBUaGUgYWN0dWFsIHZhbGlkYXRpb24gaGFw cGVucyBpbiBoYW5kbGVfcmVxdWVzdHMoKSBhdCBsaW5lIDI0Ny0yNTQKKworICAgICAgICBsZXQg aGVhZGVyX3NpemUgPSBzdGQ6Om1lbTo6c2l6ZV9vZjo6PFJlcXVlc3RIZWFkZXI+KCk7CisgICAg ICAgIGFzc2VydF9lcSEoaGVhZGVyX3NpemUsIDE2LCAiUmVxdWVzdEhlYWRlciBzaG91bGQgYmUg MTYgYnl0ZXMiKTsKKworICAgICAgICAvLyBUZXN0IGNhc2UgMTogUmVxdWVzdCB0b28gc21hbGwg KHdvdWxkIGJlIHJlamVjdGVkKQorICAgICAgICBsZXQgdG9vX3NtYWxsX2RhdGEgPSBbMHgwMSwg MHgwMiwgMHgwM107IC8vIE9ubHkgMyBieXRlcworICAgICAgICBhc3NlcnQhKAorICAgICAgICAg ICAgdG9vX3NtYWxsX2RhdGEubGVuKCkgPCBoZWFkZXJfc2l6ZSwKKyAgICAgICAgICAgICJNYWxm b3JtZWQgcmVxdWVzdCB3aXRoIHt9IGJ5dGVzIHNob3VsZCBiZSBsZXNzIHRoYW4gaGVhZGVyIHNp emUge30iLAorICAgICAgICAgICAgdG9vX3NtYWxsX2RhdGEubGVuKCksCisgICAgICAgICAgICBo ZWFkZXJfc2l6ZQorICAgICAgICApOworCisgICAgICAgIC8vIFRlc3QgY2FzZSAyOiBNb3JlIHJl YWxpc3RpYyB0b28tc21hbGwgY2FzZXMKKyAgICAgICAgbGV0IHRlc3RfY2FzZXMgPSB2ZWMhWwor ICAgICAgICAgICAgKHZlYyFbMHU4OyAwXSwgMCksICAgLy8gRW1wdHkgcmVxdWVzdAorICAgICAg ICAgICAgKHZlYyFbMHU4OyAxXSwgMSksICAgLy8gMSBieXRlCisgICAgICAgICAgICAodmVjIVsw dTg7IDhdLCA4KSwgICAvLyA4IGJ5dGVzIChoYWxmIGhlYWRlcikKKyAgICAgICAgICAgICh2ZWMh WzB1ODsgMTVdLCAxNSksIC8vIDE1IGJ5dGVzIChqdXN0IHNob3J0IG9mIGhlYWRlcikKKyAgICAg ICAgXTsKKworICAgICAgICBmb3IgKGRhdGEsIGV4cGVjdGVkX2xlbikgaW4gdGVzdF9jYXNlcyB7 CisgICAgICAgICAgICBhc3NlcnRfZXEhKGRhdGEubGVuKCksIGV4cGVjdGVkX2xlbik7CisgICAg ICAgICAgICBhc3NlcnQhKAorICAgICAgICAgICAgICAgIGRhdGEubGVuKCkgPCBoZWFkZXJfc2l6 ZSwKKyAgICAgICAgICAgICAgICAiUmVxdWVzdCB3aXRoIHt9IGJ5dGVzIHNob3VsZCBiZSByZWpl Y3RlZCAobmVlZCB7fSkiLAorICAgICAgICAgICAgICAgIGRhdGEubGVuKCksCisgICAgICAgICAg ICAgICAgaGVhZGVyX3NpemUKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAv LyBUZXN0IGNhc2UgMzogVmFsaWQgc2l6ZSByZXF1ZXN0cyAod291bGQgcGFzcyBzaXplIGNoZWNr KQorICAgICAgICBsZXQgdmFsaWRfY2FzZXMgPSB2ZWMhWworICAgICAgICAgICAgdmVjIVswdTg7 IDE2XSwgICAvLyBFeGFjdCBoZWFkZXIgc2l6ZQorICAgICAgICAgICAgdmVjIVswdTg7IDMyXSwg ICAvLyBIZWFkZXIgKyBkYXRhCisgICAgICAgICAgICB2ZWMhWzB1ODsgMTAyNF0sIC8vIExhcmdl IHJlcXVlc3QKKyAgICAgICAgXTsKKworICAgICAgICBmb3IgZGF0YSBpbiB2YWxpZF9jYXNlcyB7 CisgICAgICAgICAgICBhc3NlcnQhKAorICAgICAgICAgICAgICAgIGRhdGEubGVuKCkgPj0gaGVh ZGVyX3NpemUsCisgICAgICAgICAgICAgICAgIlJlcXVlc3Qgd2l0aCB7fSBieXRlcyBzaG91bGQg cGFzcyBzaXplIGNoZWNrIiwKKyAgICAgICAgICAgICAgICBkYXRhLmxlbigpCisgICAgICAgICAg ICApOworICAgICAgICB9CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfbWFsZm9y bWVkX2hlYWRlcl9zdHJ1Y3R1cmUoKSB7CisgICAgICAgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0 aGF0IHRoZSBoZWFkZXIgc3RydWN0dXJlIGlzIGNvcnJlY3RseSBkZWZpbmVkCisgICAgICAgIC8v IGFuZCB0aGF0IHdlIGNhbiBzYWZlbHkgcGFyc2UgdmFyaW91cyBoZWFkZXIgcGF0dGVybnMKKwor ICAgICAgICBsZXQgaGVhZGVyX3NpemUgPSBzdGQ6Om1lbTo6c2l6ZV9vZjo6PFJlcXVlc3RIZWFk ZXI+KCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgdmFsaWQtc2l6ZWQgYnVmZmVyIHdpdGggdmFy aW91cyBwYXR0ZXJucworICAgICAgICBsZXQgcGF0dGVybnMgPSB2ZWMhWworICAgICAgICAgICAg dmVjIVsweDAwOyBoZWFkZXJfc2l6ZV0sIC8vIEFsbCB6ZXJvcworICAgICAgICAgICAgdmVjIVsw eEZGOyBoZWFkZXJfc2l6ZV0sIC8vIEFsbCBvbmVzCisgICAgICAgICAgICB2ZWMhWzB4QUE7IGhl YWRlcl9zaXplXSwgLy8gQWx0ZXJuYXRpbmcgcGF0dGVybgorICAgICAgICBdOworCisgICAgICAg IGZvciBwYXR0ZXJuIGluIHBhdHRlcm5zIHsKKyAgICAgICAgICAgIGFzc2VydF9lcSEocGF0dGVy bi5sZW4oKSwgaGVhZGVyX3NpemUpOworCisgICAgICAgICAgICAvLyBQYXJzZSBoZWFkZXIgKHNh bWUgdW5zYWZlIGNvZGUgYXMgaW4gaGFuZGxlX3JlcXVlc3RzOjI1Ni0yNTgpCisgICAgICAgICAg ICBsZXQgaGVhZGVyID0KKyAgICAgICAgICAgICAgICB1bnNhZmUgeyBzdGQ6OnB0cjo6cmVhZF91 bmFsaWduZWQocGF0dGVybi5hc19wdHIoKSBhcyAqY29uc3QgUmVxdWVzdEhlYWRlcikgfTsKKwor ICAgICAgICAgICAgLy8gVGhlIHBhcnNpbmcgc2hvdWxkIG5vdCBjcmFzaCwgcmVnYXJkbGVzcyBv ZiB2YWx1ZXMKKyAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgdmFsdWVzIGRvbid0IG1hdHRlciBm b3IgdGhpcyBzYWZldHkgdGVzdAorICAgICAgICAgICAgbGV0IF9pZCA9ICpoZWFkZXIuaWQ7Cisg ICAgICAgICAgICBsZXQgX3NpemUgPSAqaGVhZGVyLnNpemU7CisgICAgICAgIH0KKyAgICB9CisK KyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9yZXF1ZXN0X2hlYWRlcl9hbGlnbm1lbnQoKSB7Cisg ICAgICAgIC8vIFZlcmlmeSB0aGF0IFJlcXVlc3RIZWFkZXIgY2FuIGJlIHJlYWQgd2l0aCByZWFk X3VuYWxpZ25lZAorICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIGRhdGEgZnJv bSByaW5nIGJ1ZmZlcnMgbWF5IG5vdCBiZSBhbGlnbmVkCisKKyAgICAgICAgbGV0IGhlYWRlcl9z aXplID0gc3RkOjptZW06OnNpemVfb2Y6OjxSZXF1ZXN0SGVhZGVyPigpOworCisgICAgICAgIC8v IENyZWF0ZSBtaXNhbGlnbmVkIGJ1ZmZlciAob2Zmc2V0IGJ5IDEgYnl0ZSB0byB0ZXN0IHVuYWxp Z25lZCBhY2Nlc3MpCisgICAgICAgIGxldCBtdXQgYnVmZmVyID0gdmVjIVswdTg7IGhlYWRlcl9z aXplICsgMV07CisgICAgICAgIGJ1ZmZlclsxLi5dLmZpbGwoMHg0Mik7CisKKyAgICAgICAgLy8g UmVhZCBmcm9tIG1pc2FsaWduZWQgb2Zmc2V0ICh0aGlzIGlzIHdoYXQgcmVhZF91bmFsaWduZWQg aXMgZm9yKQorICAgICAgICBsZXQgaGVhZGVyID0KKyAgICAgICAgICAgIHVuc2FmZSB7IHN0ZDo6 cHRyOjpyZWFkX3VuYWxpZ25lZCgmYnVmZmVyWzFdIGFzICpjb25zdCB1OCBhcyAqY29uc3QgUmVx dWVzdEhlYWRlcikgfTsKKworICAgICAgICAvLyBTaG91bGQgc3VjY2Vzc2Z1bGx5IHJlYWQgd2l0 aG91dCBjcmFzaGluZworICAgICAgICBsZXQgX2lkID0gKmhlYWRlci5pZDsKKyAgICAgICAgbGV0 IF9zaXplID0gKmhlYWRlci5zaXplOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0 X2Nvbm5lY3Rpb25fcmVxdWVzdF9zdHJ1Y3R1cmUoKSB7CisgICAgICAgIC8vIFZlcmlmeSBDb25u ZWN0aW9uUmVxdWVzdCBzdHJ1Y3R1cmUgZm9yIGNvbm5lY3Rpb24gc2V0dXAKKworICAgICAgICBs ZXQgY29ubl9yZXFfc2l6ZSA9IHN0ZDo6bWVtOjpzaXplX29mOjo8Q29ubmVjdGlvblJlcXVlc3Q+ KCk7CisKKyAgICAgICAgLy8gQ29ubmVjdGlvblJlcXVlc3Qgc2hvdWxkIGJlIHByb3Blcmx5IHNp emVkCisgICAgICAgIGFzc2VydCEoCisgICAgICAgICAgICBjb25uX3JlcV9zaXplID4gc3RkOjpt ZW06OnNpemVfb2Y6OjxSZXF1ZXN0SGVhZGVyPigpLAorICAgICAgICAgICAgIkNvbm5lY3Rpb25S ZXF1ZXN0IHNob3VsZCBpbmNsdWRlIGhlYWRlciBwbHVzIGFkZGl0aW9uYWwgZmllbGRzIgorICAg ICAgICApOworCisgICAgICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcGFyc2UgYSB6ZXJvLWZpbGxl ZCBjb25uZWN0aW9uIHJlcXVlc3QKKyAgICAgICAgbGV0IGRhdGEgPSB2ZWMhWzB1ODsgY29ubl9y ZXFfc2l6ZV07CisgICAgICAgIGxldCBjb25uX3JlcSA9CisgICAgICAgICAgICB1bnNhZmUgeyBz dGQ6OnB0cjo6cmVhZF91bmFsaWduZWQoZGF0YS5hc19wdHIoKSBhcyAqY29uc3QgQ29ubmVjdGlv blJlcXVlc3QpIH07CisKKyAgICAgICAgLy8gU2hvdWxkIG5vdCBjcmFzaCB3aGVuIGFjY2Vzc2lu ZyBmaWVsZHMKKyAgICAgICAgbGV0IF9pZCA9ICpjb25uX3JlcS5oZHIuaWQ7CisgICAgICAgIGxl dCBfc2l6ZSA9ICpjb25uX3JlcS5oZHIuc2l6ZTsKKyAgICAgICAgbGV0IF9tYXhfbXNnX3NpemUg PSBjb25uX3JlcS5tYXhfbXNnX3NpemU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3BteGNm cy1ycy9wbXhjZnMtaXBjL3NyYy9oYW5kbGVyLnJzIGIvc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBj L3NyYy9oYW5kbGVyLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi4xMmI0 MGNkNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy9zcmMvaGFu ZGxlci5ycwpAQCAtMCwwICsxLDkzIEBACisvLyEgSGFuZGxlciB0cmFpdCBmb3IgcHJvY2Vzc2lu ZyBJUEMgcmVxdWVzdHMKKy8vIQorLy8hIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIGNvcmUgYEhh bmRsZXJgIHRyYWl0IHRoYXQgdXNlcnMgaW1wbGVtZW50IHRvIHByb2Nlc3MKKy8vISBJUEMgcmVx dWVzdHMuIFRoZSB0cmFpdC1iYXNlZCBhcHByb2FjaCBwcm92aWRlcyBhIG1vcmUgaWRpb21hdGlj IGFuZCBleHRlbnNpYmxlCisvLyEgQVBJIGNvbXBhcmVkIHRvIHJhdyBmdW5jdGlvbiBjbG9zdXJl cy4KKwordXNlIGNyYXRlOjpwcm90b2NvbDo6e1JlcXVlc3QsIFJlc3BvbnNlfTsKK3VzZSBhc3lu Y190cmFpdDo6YXN5bmNfdHJhaXQ7CisKKy8vLyBQZXJtaXNzaW9ucyBmb3IgSVBDIGNvbm5lY3Rp b25zCisvLy8KKy8vLyBEZXRlcm1pbmVzIHRoZSBhY2Nlc3MgbGV2ZWwgZm9yIGF1dGhlbnRpY2F0 ZWQgY29ubmVjdGlvbnMuCisjW2Rlcml2ZShEZWJ1ZywgQ2xvbmUsIENvcHksIFBhcnRpYWxFcSwg RXEpXQorcHViIGVudW0gUGVybWlzc2lvbnMgeworICAgIC8vLyBSZWFkLW9ubHkgYWNjZXNzCisg ICAgUmVhZE9ubHksCisgICAgLy8vIFJlYWQtd3JpdGUgYWNjZXNzCisgICAgUmVhZFdyaXRlLAor fQorCisvLy8gSGFuZGxlciB0cmFpdCBmb3IgcHJvY2Vzc2luZyBJUEMgcmVxdWVzdHMgYW5kIGF1 dGhlbnRpY2F0aW9uCisvLy8KKy8vLyBJbXBsZW1lbnQgdGhpcyB0cmFpdCB0byBkZWZpbmUgY3Vz dG9tIHJlcXVlc3QgaGFuZGxpbmcgbG9naWMgYW5kIGF1dGhlbnRpY2F0aW9uCisvLy8gcG9saWN5 IGZvciB5b3VyIElQQyBzZXJ2ZXIuIFRoZSBoYW5kbGVyIHJlY2VpdmVzIGEgYFJlcXVlc3RgIGNv bnRhaW5pbmcgdGhlCisvLy8gbWVzc2FnZSBJRCwgcGF5bG9hZCBkYXRhLCBhbmQgY29ubmVjdGlv biBjb250ZXh0LCBhbmQgcmV0dXJucyBhIGBSZXNwb25zZWAgd2l0aAorLy8vIGFuIGVycm9yIGNv ZGUgYW5kIHJlc3BvbnNlIGRhdGEuCisvLy8KKy8vLyAjIyBBdXRoZW50aWNhdGlvbgorLy8vCisv Ly8gVGhlIGBhdXRoZW50aWNhdGVgIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIGNvbm5lY3Rpb24g c2V0dXAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIKKy8vLyBhIGNsaWVudCB3aXRoIGdpdmVuIGNyZWRl bnRpYWxzIHNob3VsZCBiZSBhY2NlcHRlZC4gVGhpcyBhbGxvd3MgdGhlIGhhbmRsZXIgdG8KKy8v LyBpbXBsZW1lbnQgYXBwbGljYXRpb24tc3BlY2lmaWMgYXV0aGVudGljYXRpb24gcG9saWNpZXMu CisvLy8KKy8vLyAjIyBBc3luYyBTdXBwb3J0CisvLy8KKy8vLyBUaGUgYGhhbmRsZWAgbWV0aG9k IGlzIGFzeW5jLCBhbGxvd2luZyB5b3UgdG8gcGVyZm9ybSBJL08gb3BlcmF0aW9ucywgZGF0YWJh c2UKKy8vLyBxdWVyaWVzLCBvciBvdGhlciBhc3luYyB3b3JrIHdpdGhpbiB5b3VyIGhhbmRsZXIu CisvLy8KKy8vLyAjIyBUaHJlYWQgU2FmZXR5CisvLy8KKy8vLyBIYW5kbGVycyBtdXN0IGJlIGBT ZW5kICsgU3luY2AgYXMgdGhleSBtYXkgYmUgY2FsbGVkIGZyb20gbXVsdGlwbGUgdG9raW8gdGFz a3MKKy8vLyBjb25jdXJyZW50bHkuIFVzZSBgQXJjPE11dGV4PFQ+PmAgb3Igb3RoZXIgc3luY2hy b25pemF0aW9uIHByaW1pdGl2ZXMgaWYgeW91IG5lZWQKKy8vLyBtdXRhYmxlIHNoYXJlZCBzdGF0 ZS4KKy8vLworLy8vICMjIEVycm9yIEhhbmRsaW5nCisvLy8KKy8vLyBSZXR1cm4gbmVnYXRpdmUg ZXJybm8gdmFsdWVzIGluIGBSZXNwb25zZTo6ZXJyb3JfY29kZWAgdG8gaW5kaWNhdGUgZXJyb3Jz LgorLy8vIFVzZSAwIGZvciBzdWNjZXNzLiBTZWUgYGxpYmM6OipgIGNvbnN0YW50cyBmb3Igc3Rh bmRhcmQgZXJybm8gdmFsdWVzLgorI1thc3luY190cmFpdF0KK3B1YiB0cmFpdCBIYW5kbGVyOiBT ZW5kICsgU3luYyB7CisgICAgLy8vIEF1dGhlbnRpY2F0ZSBhIGNvbm5lY3RpbmcgY2xpZW50IGFu ZCBkZXRlcm1pbmUgYWNjZXNzIGxldmVsCisgICAgLy8vCisgICAgLy8vIENhbGxlZCBkdXJpbmcg Y29ubmVjdGlvbiBzZXR1cCB0byBkZXRlcm1pbmUgd2hldGhlciB0byBhY2NlcHQgdGhlIGNvbm5l Y3Rpb24KKyAgICAvLy8gYW5kIHdoYXQgYWNjZXNzIGxldmVsIHRvIGdyYW50LgorICAgIC8vLwor ICAgIC8vLyAjIEFyZ3VtZW50cworICAgIC8vLworICAgIC8vLyAqIGB1aWRgIC0gQ2xpZW50IHVz ZXIgSUQgKGZyb20gU09fUEVFUkNSRUQpCisgICAgLy8vICogYGdpZGAgLSBDbGllbnQgZ3JvdXAg SUQgKGZyb20gU09fUEVFUkNSRUQpCisgICAgLy8vCisgICAgLy8vICMgUmV0dXJucworICAgIC8v LworICAgIC8vLyAtIGBTb21lKFBlcm1pc3Npb25zOjpSZWFkV3JpdGUpYCB0byBhY2NlcHQgd2l0 aCByZWFkLXdyaXRlIGFjY2VzcworICAgIC8vLyAtIGBTb21lKFBlcm1pc3Npb25zOjpSZWFkT25s eSlgIHRvIGFjY2VwdCB3aXRoIHJlYWQtb25seSBhY2Nlc3MKKyAgICAvLy8gLSBgTm9uZWAgdG8g cmVqZWN0IHRoZSBjb25uZWN0aW9uCisgICAgZm4gYXV0aGVudGljYXRlKCZzZWxmLCB1aWQ6IHUz MiwgZ2lkOiB1MzIpIC0+IE9wdGlvbjxQZXJtaXNzaW9ucz47CisKKyAgICAvLy8gSGFuZGxlIGFu IElQQyByZXF1ZXN0CisgICAgLy8vCisgICAgLy8vICMgQXJndW1lbnRzCisgICAgLy8vCisgICAg Ly8vICogYHJlcXVlc3RgIC0gVGhlIGluY29taW5nIHJlcXVlc3Qgd2l0aCBtZXNzYWdlIElELCBk YXRhLCBhbmQgY29ubmVjdGlvbiBjb250ZXh0CisgICAgLy8vCisgICAgLy8vICMgUmV0dXJucwor ICAgIC8vLworICAgIC8vLyBBIGBSZXNwb25zZWAgY29udGFpbmluZyB0aGUgZXJyb3IgY29kZSAo MCA9IHN1Y2Nlc3MsIG5lZ2F0aXZlID0gZXJybm8pIGFuZAorICAgIC8vLyBvcHRpb25hbCByZXNw b25zZSBkYXRhIHRvIHNlbmQgYmFjayB0byB0aGUgY2xpZW50LgorICAgIGFzeW5jIGZuIGhhbmRs ZSgmc2VsZiwgcmVxdWVzdDogUmVxdWVzdCkgLT4gUmVzcG9uc2U7Cit9CisKKy8vLyBCbGFua2V0 IGltcGxlbWVudGF0aW9uIGZvciBBcmM8VD4gd2hlcmUgVDogSGFuZGxlcgorLy8vCisvLy8gVGhp cyBhbGxvd3MgcGFzc2luZyBgQXJjPE15SGFuZGxlcj5gIGRpcmVjdGx5IHRvIGBTZXJ2ZXI6Om5l dygpYC4KKyNbYXN5bmNfdHJhaXRdCitpbXBsPFQ6IEhhbmRsZXI+IEhhbmRsZXIgZm9yIHN0ZDo6 c3luYzo6QXJjPFQ+IHsKKyAgICBmbiBhdXRoZW50aWNhdGUoJnNlbGYsIHVpZDogdTMyLCBnaWQ6 IHUzMikgLT4gT3B0aW9uPFBlcm1pc3Npb25zPiB7CisgICAgICAgICgqKnNlbGYpLmF1dGhlbnRp Y2F0ZSh1aWQsIGdpZCkKKyAgICB9CisKKyAgICBhc3luYyBmbiBoYW5kbGUoJnNlbGYsIHJlcXVl c3Q6IFJlcXVlc3QpIC0+IFJlc3BvbnNlIHsKKyAgICAgICAgKCoqc2VsZikuaGFuZGxlKHJlcXVl c3QpLmF3YWl0CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBj L3NyYy9saWIucnMgYi9zcmMvcG14Y2ZzLXJzL3BteGNmcy1pcGMvc3JjL2xpYi5ycwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMC4uOTIzYzM1OWUKLS0tIC9kZXYvbnVsbAorKysg Yi9zcmMvcG14Y2ZzLXJzL3BteGNmcy1pcGMvc3JjL2xpYi5ycwpAQCAtMCwwICsxLDM3IEBACisv Ly8gbGlicWItY29tcGF0aWJsZSBJUEMgc2VydmVyIGltcGxlbWVudGF0aW9uIGluIHB1cmUgUnVz dAorLy8vCisvLy8gVGhpcyBjcmF0ZSBpbXBsZW1lbnRzIGEgbWluaW1hbCBsaWJxYiBJUEMgc2Vy dmVyIHRoYXQgaXMgd2lyZS1jb21wYXRpYmxlCisvLy8gd2l0aCBsaWJxYiBjbGllbnRzIChxYl9p cGNjXyopLCB3aXRob3V0IGRlcGVuZGluZyBvbiB0aGUgbGlicWIgQyBsaWJyYXJ5LgorLy8vCisv Ly8gIyMgUHJvdG9jb2wgT3ZlcnZpZXcKKy8vLworLy8vIDEuICoqQ29ubmVjdGlvbiBIYW5kc2hh a2UqKiAoU09DS19TVFJFQU0pOgorLy8vICAgIC0gU2VydmVyIGxpc3RlbnMgb24gYC92YXIvcnVu L3tzZXJ2aWNlX25hbWV9YAorLy8vICAgIC0gQ2xpZW50IGNvbm5lY3RzIGFuZCBzZW5kcyBgcWJf aXBjX2Nvbm5lY3Rpb25fcmVxdWVzdGAKKy8vLyAgICAtIFNlcnZlciBhdXRoZW50aWNhdGVzICh1 aWQvZ2lkKSwgY3JlYXRlcyBwZXItY29ubmVjdGlvbiBkYXRhZ3JhbSBzb2NrZXRzCisvLy8gICAg LSBTZXJ2ZXIgc2VuZHMgYHFiX2lwY19jb25uZWN0aW9uX3Jlc3BvbnNlYCB3aXRoIHNvY2tldCBw YXRocworLy8vCisvLy8gMi4gKipSZXF1ZXN0L1Jlc3BvbnNlKiogKFNPQ0tfREdSQU0pOgorLy8v ICAgIC0gQ2xpZW50IHNlbmRzIHJlcXVlc3RzIG9uIGRhdGFncmFtIHNvY2tldAorLy8vICAgIC0g U2VydmVyIHJlY2VpdmVzLCBwcm9jZXNzZXMsIGFuZCBzZW5kcyByZXNwb25zZXMKKy8vLworLy8v ICMjIE1vZHVsZSBTdHJ1Y3R1cmUKKy8vLworLy8vIC0gYHByb3RvY29sYCAtIFdpcmUgcHJvdG9j b2wgc3RydWN0dXJlcyBhbmQgY29uc3RhbnRzCisvLy8gLSBgc29ja2V0YCAtIEFic3RyYWN0IFVu aXggc29ja2V0IHV0aWxpdGllcworLy8vIC0gYGNvbm5lY3Rpb25gIC0gUGVyLWNvbm5lY3Rpb24g aGFuZGxpbmcgYW5kIHJlcXVlc3QgcHJvY2Vzc2luZworLy8vIC0gYHNlcnZlcmAgLSBNYWluIElQ QyBzZXJ2ZXIgYW5kIGNvbm5lY3Rpb24gYWNjZXB0YW5jZQorLy8vCisvLy8gUmVmZXJlbmNlczoK Ky8vLyAtIGxpYnFiIHNvdXJjZTogfi9kZXYvbGlicWIvbGliL2lwY19zb2NrZXQuYywgaXBjX3Nl dHVwLmMKK21vZCBjb25uZWN0aW9uOworbW9kIGhhbmRsZXI7Cittb2QgcHJvdG9jb2w7Cittb2Qg cmluZ2J1ZmZlcjsKK21vZCBzZXJ2ZXI7Cittb2Qgc29ja2V0OworCisvLyBQdWJsaWMgQVBJCitw dWIgdXNlIGhhbmRsZXI6OntIYW5kbGVyLCBQZXJtaXNzaW9uc307CitwdWIgdXNlIHByb3RvY29s Ojp7UmVxdWVzdCwgUmVzcG9uc2V9OworcHViIHVzZSBzZXJ2ZXI6OlNlcnZlcjsKZGlmZiAtLWdp dCBhL3NyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy9zcmMvcHJvdG9jb2wucnMgYi9zcmMvcG14Y2Zz LXJzL3BteGNmcy1pcGMvc3JjL3Byb3RvY29sLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAwLi40NjkwOTlmMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wbXhjZnMtcnMvcG14 Y2ZzLWlwYy9zcmMvcHJvdG9jb2wucnMKQEAgLTAsMCArMSwzMzIgQEAKKy8vISBsaWJxYiB3aXJl IHByb3RvY29sIHN0cnVjdHVyZXMgYW5kIGNvbnN0YW50cworLy8hCisvLyEgVGhpcyBtb2R1bGUg Y29udGFpbnMgdGhlIGxvdy1sZXZlbCBwcm90b2NvbCBkZWZpbml0aW9ucyBmb3IgbGlicWIgSVBD IGNvbW11bmljYXRpb24uCisvLyEgQWxsIHN0cnVjdHVyZXMgbXVzdCBtYXRjaCB0aGUgQyBjb3Vu dGVycGFydHMgZXhhY3RseSBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkuCisKKy8vLyBNZXNzYWdl IElEIGZvciBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cyAobWF0Y2hlcyBsaWJxYidzIFFCX0lQQ19N U0dfQVVUSEVOVElDQVRFKQorcHViKHN1cGVyKSBjb25zdCBNU0dfQVVUSEVOVElDQVRFOiBpMzIg PSAxOworCisvLy8gQ29ubmVjdGlvbiB0eXBlIGZvciBzaGFyZWQgbWVtb3J5IHRyYW5zcG9ydCAo bWF0Y2hlcyBsaWJxYidzIFFCX0lQQ19TSE0pCitwdWIoc3VwZXIpIGNvbnN0IENPTk5FQ1RJT05f VFlQRV9TSE06IHUzMiA9IDE7CisKKy8vLyBNYXhpbXVtIHBhdGggbGVuZ3RoIC0gdXNlZCBpbiBj b25uZWN0aW9uIHJlc3BvbnNlCitwdWIoc3VwZXIpIGNvbnN0IFBBVEhfTUFYOiB1c2l6ZSA9IDQw OTY7CisKKy8vLyBXcmFwcGVyIGZvciBpMzIgdGhhdCBhbGlnbnMgdG8gOC1ieXRlIGJvdW5kYXJ5 IHdpdGggZXhwbGljaXQgcGFkZGluZworLy8vCisvLy8gU2ltdWxhdGVzIEMncyBgX19hdHRyaWJ1 dGVfXyAoKGFsaWduZWQoOCkpKWAgb24gaW5kaXZpZHVhbCBpMzIgZmllbGRzLgorLy8vIFRoaXMg aXMgdXNlZCB0byBtYXRjaCBsaWJxYidzIHBlci1maWVsZCBhbGlnbm1lbnQgYmVoYXZpb3IuCisv Ly8KKy8vLyBNZW1vcnkgbGF5b3V0OgorLy8vIC0gQnl0ZXMgMC0zOiBpMzIgdmFsdWUKKy8vLyAt IEJ5dGVzIDQtNzogemVybyBwYWRkaW5nCisvLy8gLSBUb3RhbDogOCBieXRlcworI1tyZXByKEMs IGFsaWduKDgpKV0KKyNbZGVyaXZlKERlYnVnLCBDb3B5LCBDbG9uZSwgUGFydGlhbEVxLCBFcSld CitwdWIgc3RydWN0IEFsaWduOCB7CisgICAgcHViIHZhbHVlOiBpMzIsCisgICAgX3BhZDogdTMy LCAvLyA0IGJ5dGVzIHBhZGRpbmcgZm9yIGkzMiAtPiA4IGJ5dGVzIHRvdGFsCit9CisKK2ltcGwg QWxpZ244IHsKKyAgICAjW2lubGluZV0KKyAgICBwdWIgY29uc3QgZm4gbmV3KHZhbHVlOiBpMzIp IC0+IFNlbGYgeworICAgICAgICBBbGlnbjggeyB2YWx1ZSwgX3BhZDogMCB9CisgICAgfQorfQor CitpbXBsIHN0ZDo6b3BzOjpEZXJlZiBmb3IgQWxpZ244IHsKKyAgICB0eXBlIFRhcmdldCA9IGkz MjsKKworICAgICNbaW5saW5lXQorICAgIGZuIGRlcmVmKCZzZWxmKSAtPiAmaTMyIHsKKyAgICAg ICAgJnNlbGYudmFsdWUKKyAgICB9Cit9CisKK2ltcGwgc3RkOjpvcHM6OkRlcmVmTXV0IGZvciBB bGlnbjggeworICAgICNbaW5saW5lXQorICAgIGZuIGRlcmVmX211dCgmbXV0IHNlbGYpIC0+ICZt dXQgaTMyIHsKKyAgICAgICAgJm11dCBzZWxmLnZhbHVlCisgICAgfQorfQorCitpbXBsIEZyb208 aTMyPiBmb3IgQWxpZ244IHsKKyAgICAjW2lubGluZV0KKyAgICBmbiBmcm9tKHZhbHVlOiBpMzIp IC0+IFNlbGYgeworICAgICAgICBBbGlnbjg6Om5ldyh2YWx1ZSkKKyAgICB9Cit9CisKK2ltcGwg RGVmYXVsdCBmb3IgQWxpZ244IHsKKyAgICAjW2lubGluZV0KKyAgICBmbiBkZWZhdWx0KCkgLT4g U2VsZiB7CisgICAgICAgIEFsaWduODo6bmV3KDApCisgICAgfQorfQorCisvLy8gUmVxdWVzdCBo ZWFkZXIgKG1hdGNoZXMgbGlicWIncyBxYl9pcGNfcmVxdWVzdF9oZWFkZXIpCisvLy8KKy8vLyBF YWNoIGZpZWxkIGlzIDgtYnl0ZSBhbGlnbmVkIHRvIG1hdGNoIEMncyBfX2F0dHJpYnV0ZV9fICgo YWxpZ25lZCg4KSkpCisjW3JlcHIoQywgYWxpZ24oOCkpXQorI1tkZXJpdmUoRGVidWcsIENvcHks IENsb25lKV0KK3B1YiBzdHJ1Y3QgUmVxdWVzdEhlYWRlciB7CisgICAgcHViIGlkOiBBbGlnbjgs CisgICAgcHViIHNpemU6IEFsaWduOCwKK30KKworLy8vIFJlc3BvbnNlIGhlYWRlciAobWF0Y2hl cyBsaWJxYidzIHFiX2lwY19yZXNwb25zZV9oZWFkZXIpCisjW3JlcHIoQywgYWxpZ24oOCkpXQor I1tkZXJpdmUoRGVidWcsIENvcHksIENsb25lKV0KK3B1YiBzdHJ1Y3QgUmVzcG9uc2VIZWFkZXIg eworICAgIHB1YiBpZDogQWxpZ244LAorICAgIHB1YiBzaXplOiBBbGlnbjgsCisgICAgcHViIGVy cm9yOiBBbGlnbjgsCit9CisKKy8vLyBDb25uZWN0aW9uIHJlcXVlc3Qgc2VudCBieSBjbGllbnQg ZHVyaW5nIGhhbmRzaGFrZSAobWF0Y2hlcyBsaWJxYidzIHFiX2lwY19jb25uZWN0aW9uX3JlcXVl c3QpCisjW3JlcHIoQyldCisjW2Rlcml2ZShEZWJ1ZywgQ29weSwgQ2xvbmUpXQorcHViKHN1cGVy KSBzdHJ1Y3QgQ29ubmVjdGlvblJlcXVlc3QgeworICAgIHB1YiBoZHI6IFJlcXVlc3RIZWFkZXIs CisgICAgcHViIG1heF9tc2dfc2l6ZTogdTMyLAorfQorCisvLy8gQ29ubmVjdGlvbiByZXNwb25z ZSBzZW50IGJ5IHNlcnZlciBkdXJpbmcgaGFuZHNoYWtlIChtYXRjaGVzIGxpYnFiJ3MgcWJfaXBj X2Nvbm5lY3Rpb25fcmVzcG9uc2UpCisjW3JlcHIoQywgYWxpZ24oOCkpXQorI1tkZXJpdmUoRGVi dWcpXQorcHViKHN1cGVyKSBzdHJ1Y3QgQ29ubmVjdGlvblJlc3BvbnNlIHsKKyAgICBwdWIgaGRy OiBSZXNwb25zZUhlYWRlciwKKyAgICBwdWIgY29ubmVjdGlvbl90eXBlOiB1MzIsCisgICAgcHVi IG1heF9tc2dfc2l6ZTogdTMyLAorICAgIHB1YiBjb25uZWN0aW9uOiB1c2l6ZSwKKyAgICBwdWIg cmVxdWVzdDogW3U4OyBQQVRIX01BWF0sCisgICAgcHViIHJlc3BvbnNlOiBbdTg7IFBBVEhfTUFY XSwKKyAgICBwdWIgZXZlbnQ6IFt1ODsgUEFUSF9NQVhdLAorfQorCisvLy8gUmVxdWVzdCBwYXNz ZWQgdG8gaGFuZGxlcnMKKy8vLworLy8vIENvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBh biBJUEMgcmVxdWVzdCBpbmNsdWRpbmcgdGhlIG1lc3NhZ2UgSUQsCisvLy8gcGF5bG9hZCBkYXRh LCBhbmQgY29ubmVjdGlvbiBjb250ZXh0ICh1aWQsIGdpZCwgcGlkLCBwZXJtaXNzaW9ucykuCisj W2Rlcml2ZShEZWJ1ZywgQ2xvbmUpXQorcHViIHN0cnVjdCBSZXF1ZXN0IHsKKyAgICAvLy8gTWVz c2FnZSBJRCBpZGVudGlmeWluZyB0aGUgb3BlcmF0aW9uIChhcHBsaWNhdGlvbi1kZWZpbmVkKQor ICAgIHB1YiBtc2dfaWQ6IGkzMiwKKworICAgIC8vLyBSZXF1ZXN0IHBheWxvYWQgZGF0YQorICAg IHB1YiBkYXRhOiBWZWM8dTg+LAorCisgICAgLy8vIFdoZXRoZXIgdGhpcyBjb25uZWN0aW9uIGhh cyByZWFkLW9ubHkgYWNjZXNzCisgICAgcHViIGlzX3JlYWRfb25seTogYm9vbCwKKworICAgIC8v LyBDb25uZWN0aW9uIElEIChmb3IgbG9nZ2luZy9kZWJ1Z2dpbmcpCisgICAgcHViIGNvbm5faWQ6 IHU2NCwKKworICAgIC8vLyBDbGllbnQgdXNlciBJRCAoZnJvbSBTT19QRUVSQ1JFRCkKKyAgICBw dWIgdWlkOiB1MzIsCisKKyAgICAvLy8gQ2xpZW50IGdyb3VwIElEIChmcm9tIFNPX1BFRVJDUkVE KQorICAgIHB1YiBnaWQ6IHUzMiwKKworICAgIC8vLyBDbGllbnQgcHJvY2VzcyBJRCAoZnJvbSBT T19QRUVSQ1JFRCkKKyAgICBwdWIgcGlkOiB1MzIsCit9CisKKy8vLyBSZXNwb25zZSBmcm9tIGhh bmRsZXJzCisvLy8KKy8vLyBDb250YWlucyB0aGUgZXJyb3IgY29kZSBhbmQgcmVzcG9uc2UgZGF0 YSB0byBzZW5kIGJhY2sgdG8gdGhlIGNsaWVudC4KKyNbZGVyaXZlKERlYnVnLCBDbG9uZSldCitw dWIgc3RydWN0IFJlc3BvbnNlIHsKKyAgICAvLy8gRXJyb3IgY29kZSAoMCA9IHN1Y2Nlc3MsIG5l Z2F0aXZlID0gZXJybm8pCisgICAgcHViIGVycm9yX2NvZGU6IGkzMiwKKworICAgIC8vLyBSZXNw b25zZSBwYXlsb2FkIGRhdGEKKyAgICBwdWIgZGF0YTogVmVjPHU4PiwKK30KKworaW1wbCBSZXNw b25zZSB7CisgICAgLy8vIENyZWF0ZSBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2Ugd2l0aCBkYXRhCisg ICAgcHViIGZuIG9rKGRhdGE6IFZlYzx1OD4pIC0+IFNlbGYgeworICAgICAgICBTZWxmIHsKKyAg ICAgICAgICAgIGVycm9yX2NvZGU6IDAsCisgICAgICAgICAgICBkYXRhLAorICAgICAgICB9Cisg ICAgfQorCisgICAgLy8vIENyZWF0ZSBhbiBlcnJvciByZXNwb25zZSB3aXRoIGVycm5vCisgICAg cHViIGZuIGVycihlcnJvcl9jb2RlOiBpMzIpIC0+IFNlbGYgeworICAgICAgICBTZWxmIHsKKyAg ICAgICAgICAgIGVycm9yX2NvZGUsCisgICAgICAgICAgICBkYXRhOiBWZWM6Om5ldygpLAorICAg ICAgICB9CisgICAgfQorCisgICAgLy8vIENyZWF0ZSBhbiBlcnJvciByZXNwb25zZSB3aXRoIGVy cm5vIGFuZCBvcHRpb25hbCBkYXRhCisgICAgcHViIGZuIHdpdGhfZXJyb3IoZXJyb3JfY29kZTog aTMyLCBkYXRhOiBWZWM8dTg+KSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZiB7IGVycm9yX2NvZGUs IGRhdGEgfQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBz dXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2hlYWRlcl9zaXplcygpIHsKKyAg ICAgICAgYXNzZXJ0X2VxIShzdGQ6Om1lbTo6c2l6ZV9vZjo6PFJlcXVlc3RIZWFkZXI+KCksIDE2 KTsKKyAgICAgICAgYXNzZXJ0X2VxIShzdGQ6Om1lbTo6YWxpZ25fb2Y6OjxSZXF1ZXN0SGVhZGVy PigpLCA4KTsKKyAgICAgICAgYXNzZXJ0X2VxIShzdGQ6Om1lbTo6c2l6ZV9vZjo6PFJlc3BvbnNl SGVhZGVyPigpLCAyNCk7CisgICAgICAgIGFzc2VydF9lcSEoc3RkOjptZW06OmFsaWduX29mOjo8 UmVzcG9uc2VIZWFkZXI+KCksIDgpOworICAgICAgICBhc3NlcnRfZXEhKHN0ZDo6bWVtOjpzaXpl X29mOjo8Q29ubmVjdGlvblJlcXVlc3Q+KCksIDI0KTsgLy8gMTYgKGhlYWRlcikgKyA0IChtYXhf bXNnX3NpemUpICsgNCAocGFkZGluZykKKworICAgICAgICBwcmludGxuISgKKyAgICAgICAgICAg ICJDb25uZWN0aW9uUmVzcG9uc2Ugc2l6ZToge30iLAorICAgICAgICAgICAgc3RkOjptZW06OnNp emVfb2Y6OjxDb25uZWN0aW9uUmVzcG9uc2U+KCkKKyAgICAgICAgKTsKKyAgICAgICAgcHJpbnRs biEoCisgICAgICAgICAgICAiQ29ubmVjdGlvblJlc3BvbnNlIGFsaWduOiB7fSIsCisgICAgICAg ICAgICBzdGQ6Om1lbTo6YWxpZ25fb2Y6OjxDb25uZWN0aW9uUmVzcG9uc2U+KCkKKyAgICAgICAg KTsKKyAgICAgICAgcHJpbnRsbiEoIlBBVEhfTUFYOiB7UEFUSF9NQVh9Iik7CisKKyAgICAgICAg Ly8gQyBleHBlY3RzOiAyNCAoaGVhZGVyKSArIDQgKGNvbm5lY3Rpb25fdHlwZSkgKyA0IChtYXhf bXNnX3NpemUpICsgOCAoY29ubmVjdGlvbiBwb2ludGVyKSArIDMqNDA5NiAocGF0aHMpID0gMTIz MjgKKyAgICAgICAgYXNzZXJ0X2VxIShzdGQ6Om1lbTo6c2l6ZV9vZjo6PENvbm5lY3Rpb25SZXNw b25zZT4oKSwgMTIzMjgpOworICAgIH0KKworICAgIC8vID09PT09IEFsaWduOCBUZXN0cyA9PT09 PQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfYWxpZ244X3NpemVfYW5kX2FsaWdubWVudCgp IHsKKyAgICAgICAgLy8gVmVyaWZ5IEFsaWduOCBpcyBleGFjdGx5IDggYnl0ZXMKKyAgICAgICAg YXNzZXJ0X2VxIShzdGQ6Om1lbTo6c2l6ZV9vZjo6PEFsaWduOD4oKSwgOCk7CisgICAgICAgIGFz c2VydF9lcSEoc3RkOjptZW06OmFsaWduX29mOjo8QWxpZ244PigpLCA4KTsKKyAgICB9CisKKyAg ICAjW3Rlc3RdCisgICAgZm4gdGVzdF9hbGlnbjhfY3JlYXRpb25fYW5kX3ZhbHVlX2FjY2Vzcygp IHsKKyAgICAgICAgbGV0IGEgPSBBbGlnbjg6Om5ldyg0Mik7CisgICAgICAgIGFzc2VydF9lcSEo YS52YWx1ZSwgNDIpOworICAgICAgICBhc3NlcnRfZXEhKCphLCA0Mik7IC8vIFRlc3QgRGVyZWYK KyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9hbGlnbjhfZnJvbV9pMzIoKSB7Cisg ICAgICAgIGxldCBhOiBBbGlnbjggPSAoLTEwMCkuaW50bygpOworICAgICAgICBhc3NlcnRfZXEh KGEudmFsdWUsIC0xMDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2FsaWdu OF9kZWZhdWx0KCkgeworICAgICAgICBsZXQgYSA9IEFsaWduODo6ZGVmYXVsdCgpOworICAgICAg ICBhc3NlcnRfZXEhKGEudmFsdWUsIDApOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0 ZXN0X2FsaWduOF9kZXJlZl9tdXQoKSB7CisgICAgICAgIGxldCBtdXQgYSA9IEFsaWduODo6bmV3 KDEwKTsKKyAgICAgICAgKmEgPSAyMDsgLy8gVGVzdCBEZXJlZk11dAorICAgICAgICBhc3NlcnRf ZXEhKGEudmFsdWUsIDIwKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9hbGln bjhfcGFkZGluZ19pc196ZXJvKCkgeworICAgICAgICBsZXQgYSA9IEFsaWduODo6bmV3KDEyMyk7 CisgICAgICAgIC8vIFBhZGRpbmcgc2hvdWxkIGFsd2F5cyBiZSAwCisgICAgICAgIGFzc2VydF9l cSEoYS5fcGFkLCAwKTsKKyAgICB9CisKKyAgICAvLyA9PT09PSBSZXNwb25zZSBUZXN0cyA9PT09 PQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcmVzcG9uc2Vfb2tfY3JlYXRpb24oKSB7Cisg ICAgICAgIGxldCBkYXRhID0gYiJ0ZXN0IGRhdGEiLnRvX3ZlYygpOworICAgICAgICBsZXQgcmVz cCA9IFJlc3BvbnNlOjpvayhkYXRhLmNsb25lKCkpOworCisgICAgICAgIGFzc2VydF9lcSEocmVz cC5lcnJvcl9jb2RlLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXNwLmRhdGEsIGRhdGEpOwor ICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3Jlc3BvbnNlX2Vycl9jcmVhdGlvbigp IHsKKyAgICAgICAgbGV0IHJlc3AgPSBSZXNwb25zZTo6ZXJyKC01KTsgLy8gRVJSTk8gbGlrZSBF SU8KKworICAgICAgICBhc3NlcnRfZXEhKHJlc3AuZXJyb3JfY29kZSwgLTUpOworICAgICAgICBh c3NlcnQhKHJlc3AuZGF0YS5pc19lbXB0eSgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAg Zm4gdGVzdF9yZXNwb25zZV93aXRoX2Vycm9yX2FuZF9kYXRhKCkgeworICAgICAgICBsZXQgZGF0 YSA9IGIiZXJyb3IgZGV0YWlscyIudG9fdmVjKCk7CisgICAgICAgIGxldCByZXNwID0gUmVzcG9u c2U6OndpdGhfZXJyb3IoLTIyLCBkYXRhLmNsb25lKCkpOyAvLyBFSU5WQUwKKworICAgICAgICBh c3NlcnRfZXEhKHJlc3AuZXJyb3JfY29kZSwgLTIyKTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXNw LmRhdGEsIGRhdGEpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3Jlc3BvbnNl X2Vycm9yX2NvZGVzKCkgeworICAgICAgICAvLyBUZXN0IHZhcmlvdXMgZXJybm8gdmFsdWVzCisg ICAgICAgIGxldCB0ZXN0X2Nhc2VzID0gdmVjIVsKKyAgICAgICAgICAgICgwLCAic3VjY2VzcyIp LAorICAgICAgICAgICAgKC0xLCAiRVBFUk0iKSwKKyAgICAgICAgICAgICgtMiwgIkVOT0VOVCIp LAorICAgICAgICAgICAgKC0xMywgIkVBQ0NFUyIpLAorICAgICAgICAgICAgKC0yMiwgIkVJTlZB TCIpLAorICAgICAgICBdOworCisgICAgICAgIGZvciAoY29kZSwgX25hbWUpIGluIHRlc3RfY2Fz ZXMgeworICAgICAgICAgICAgbGV0IHJlc3AgPSBSZXNwb25zZTo6ZXJyKGNvZGUpOworICAgICAg ICAgICAgYXNzZXJ0X2VxIShyZXNwLmVycm9yX2NvZGUsIGNvZGUpOworICAgICAgICB9CisgICAg fQorCisgICAgLy8gPT09PT0gUmVxdWVzdCBUZXN0cyA9PT09PQorCisgICAgI1t0ZXN0XQorICAg IGZuIHRlc3RfcmVxdWVzdF9jcmVhdGlvbigpIHsKKyAgICAgICAgbGV0IHJlcSA9IFJlcXVlc3Qg eworICAgICAgICAgICAgbXNnX2lkOiAxMDAsCisgICAgICAgICAgICBkYXRhOiBiInBheWxvYWQi LnRvX3ZlYygpLAorICAgICAgICAgICAgaXNfcmVhZF9vbmx5OiBmYWxzZSwKKyAgICAgICAgICAg IGNvbm5faWQ6IDEyMzQ1LAorICAgICAgICAgICAgdWlkOiAwLAorICAgICAgICAgICAgZ2lkOiAw LAorICAgICAgICAgICAgcGlkOiA5OTksCisgICAgICAgIH07CisKKyAgICAgICAgYXNzZXJ0X2Vx IShyZXEubXNnX2lkLCAxMDApOworICAgICAgICBhc3NlcnRfZXEhKHJlcS5kYXRhLCBiInBheWxv YWQiKTsKKyAgICAgICAgYXNzZXJ0ISghcmVxLmlzX3JlYWRfb25seSk7CisgICAgICAgIGFzc2Vy dF9lcSEocmVxLmNvbm5faWQsIDEyMzQ1KTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXEudWlkLCAw KTsKKyAgICAgICAgYXNzZXJ0X2VxIShyZXEuZ2lkLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShy ZXEucGlkLCA5OTkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3JlcXVlc3Rf cmVhZF9vbmx5X2ZsYWcoKSB7CisgICAgICAgIGxldCByZXFfcm8gPSBSZXF1ZXN0IHsKKyAgICAg ICAgICAgIG1zZ19pZDogMSwKKyAgICAgICAgICAgIGRhdGE6IHZlYyFbXSwKKyAgICAgICAgICAg IGlzX3JlYWRfb25seTogdHJ1ZSwKKyAgICAgICAgICAgIGNvbm5faWQ6IDEsCisgICAgICAgICAg ICB1aWQ6IDMzLAorICAgICAgICAgICAgZ2lkOiAzMywKKyAgICAgICAgICAgIHBpZDogMTAwMCwK KyAgICAgICAgfTsKKworICAgICAgICBsZXQgcmVxX3J3ID0gUmVxdWVzdCB7CisgICAgICAgICAg ICBtc2dfaWQ6IDEsCisgICAgICAgICAgICBkYXRhOiB2ZWMhW10sCisgICAgICAgICAgICBpc19y ZWFkX29ubHk6IGZhbHNlLAorICAgICAgICAgICAgY29ubl9pZDogMiwKKyAgICAgICAgICAgIHVp ZDogMCwKKyAgICAgICAgICAgIGdpZDogMCwKKyAgICAgICAgICAgIHBpZDogMTAwMSwKKyAgICAg ICAgfTsKKworICAgICAgICBhc3NlcnQhKHJlcV9yby5pc19yZWFkX29ubHkpOworICAgICAgICBh c3NlcnQhKCFyZXFfcncuaXNfcmVhZF9vbmx5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMv cG14Y2ZzLXJzL3BteGNmcy1pcGMvc3JjL3JpbmdidWZmZXIucnMgYi9zcmMvcG14Y2ZzLXJzL3Bt eGNmcy1pcGMvc3JjL3JpbmdidWZmZXIucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAw MDAwMDAuLjk2ZGQxOTJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BteGNmcy1ycy9wbXhjZnMt aXBjL3NyYy9yaW5nYnVmZmVyLnJzCkBAIC0wLDAgKzEsMTE1OCBAQAorLy8vIExvY2stZnJlZSBy aW5nIGJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBjb21wYXRpYmxlIHdpdGggbGlicWIncyBzaGFyZWQg bWVtb3J5IElQQworLy8vCisvLy8gVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIFNQU0MgKHNpbmds ZS1wcm9kdWNlciBzaW5nbGUtY29uc3VtZXIpIHJpbmcgYnVmZmVyCisvLy8gdXNpbmcgc2hhcmVk IG1lbW9yeSwgbWF0Y2hpbmcgbGlicWIncyB3aXJlIHByb3RvY29sIGFuZCBtZW1vcnkgbGF5b3V0 LgorLy8vCisvLy8gIyMgRGVzaWduCisvLy8KKy8vLyAtICoqU2hhcmVkIE1lbW9yeSoqOiBUd28g bW1hcCdkIGZpbGVzIChoZWFkZXIgKyBkYXRhKSBpbiAvZGV2L3NobQorLy8vIC0gKipMb2NrLUZy ZWUqKjogVXNlcyBhdG9taWMgb3BlcmF0aW9ucyBmb3IgcmVhZF9wdC93cml0ZV9wdCBzeW5jaHJv bml6YXRpb24KKy8vLyAtICoqQ2h1bmstQmFzZWQqKjogTWVzc2FnZXMgc3RvcmVkIGFzIFtzaXpl XVttYWdpY11bZGF0YV0gY2h1bmtzCisvLy8gLSAqKldpcmUtQ29tcGF0aWJsZSoqOiBNYXRjaGVz IGxpYnFiJ3MgcWJfcmluZ2J1ZmZlcl9zaGFyZWRfcyBsYXlvdXQKK3VzZSBhbnlob3c6OntDb250 ZXh0LCBSZXN1bHR9OwordXNlIG1lbW1hcDI6Ok1tYXBNdXQ7Cit1c2Ugc3RkOjpmczo6T3Blbk9w dGlvbnM7Cit1c2Ugc3RkOjpvczo6ZmQ6OkFzUmF3RmQ7Cit1c2Ugc3RkOjpwYXRoOjpQYXRoOwor dXNlIHN0ZDo6c3luYzo6QXJjOwordXNlIHN0ZDo6c3luYzo6YXRvbWljOjp7QXRvbWljSTMyLCBB dG9taWNVMzIsIE9yZGVyaW5nfTsKK3VzZSB0b2tpbzo6c3luYzo6Tm90aWZ5OworCisvLy8gQ2ly Y3VsYXIgbW1hcCB3cmFwcGVyIGZvciByaW5nIGJ1ZmZlciBkYXRhCisvLy8KKy8vLyBUaGlzIHN0 cnVjdCBtYW5hZ2VzIGEgY2lyY3VsYXIgbWVtb3J5IG1hcHBpbmcgd2hlcmUgdGhlIHNhbWUgZmls ZSBpcyBtYXBwZWQKKy8vLyB0d2ljZSBpbiBjb25zZWN1dGl2ZSB2aXJ0dWFsIGFkZHJlc3Nlcy4g VGhpcyBhbGxvd3MgcmluZyBidWZmZXIgb3BlcmF0aW9ucworLy8vIHRvIHdyYXAgYXJvdW5kIG5h dHVyYWxseSB3aXRob3V0IG1vZHVsbyBhcml0aG1ldGljLgorLy8vCisvLy8gTWF0Y2hlcyBsaWJx YidzIHFiX3N5c19jaXJjdWxhcl9tbWFwKCkgYmVoYXZpb3IuCitzdHJ1Y3QgQ2lyY3VsYXJNbWFw IHsKKyAgICAvLy8gU3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgMnggY2lyY3VsYXIgbWFwcGluZwor ICAgIGFkZHI6ICptdXQgbGliYzo6Y192b2lkLAorICAgIC8vLyBTaXplIG9mIHRoZSBmaWxlICh2 aXJ0dWFsIG1hcHBpbmcgaXMgMnggdGhpcyBzaXplKQorICAgIHNpemU6IHVzaXplLAorfQorCitp bXBsIENpcmN1bGFyTW1hcCB7CisgICAgLy8vIENyZWF0ZSBhIGNpcmN1bGFyIG1tYXAgZnJvbSBh IGZpbGUgZGVzY3JpcHRvcgorICAgIC8vLworICAgIC8vLyBNYXBzIHRoZSBmaWxlIFRXSUNFIGlu IGNvbnNlY3V0aXZlIHZpcnR1YWwgYWRkcmVzc2VzLCBhbGxvd2luZyByaW5nIGJ1ZmZlcgorICAg IC8vLyB3cmFwYXJvdW5kIHdpdGhvdXQgbW9kdWxvIGFyaXRobWV0aWMuIE1hdGNoZXMgbGlicWIn cyBxYl9zeXNfY2lyY3VsYXJfbW1hcCgpLgorICAgIC8vLworICAgIC8vLyAjIEFyZ3VtZW50cwor ICAgIC8vLyAtIGBmZGA6IEZpbGUgZGVzY3JpcHRvciBvZiB0aGUgZGF0YSBmaWxlIChtdXN0IGJl IHNpemVkIHRvIGBzaXplYCBieXRlcykKKyAgICAvLy8gLSBgc2l6ZWA6IFNpemUgb2YgdGhlIGZp bGUgaW4gYnl0ZXMgKHZpcnR1YWwgbWFwcGluZyB3aWxsIGJlIDJ4IHRoaXMpCisgICAgLy8vCisg ICAgLy8vICMgU2FmZXR5CisgICAgLy8vIFRoZSBmaWxlIG11c3QgYmUgcHJvcGVybHkgc2l6ZWQg YmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICB1bnNhZmUgZm4gbmV3KGZkOiBpMzIs IHNpemU6IHVzaXplKSAtPiBSZXN1bHQ8U2VsZj4geworICAgICAgICAvLyBTQUZFVFk6IEFsbCBv cGVyYXRpb25zIGluIHRoaXMgZnVuY3Rpb24gYXJlIGluaGVyZW50bHkgdW5zYWZlIGFzIHRoZXkK KyAgICAgICAgLy8gbWFuaXB1bGF0ZSByYXcgbWVtb3J5IG1hcHBpbmdzLiBUaGUgY2FsbGVyIG11 c3QgZW5zdXJlIHRoZSBmZCBpcyB2YWxpZAorICAgICAgICAvLyBhbmQgdGhlIGZpbGUgaXMgcHJv cGVybHkgc2l6ZWQuCisgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAgICAvLyBTdGVwIDE6IFJl c2VydmUgMnggc3BhY2Ugd2l0aCBhbm9ueW1vdXMgbW1hcAorICAgICAgICAgICAgbGV0IGFkZHJf b3JpZyA9IGxpYmM6Om1tYXAoCisgICAgICAgICAgICAgICAgc3RkOjpwdHI6Om51bGxfbXV0KCks CisgICAgICAgICAgICAgICAgc2l6ZSAqIDIsCisgICAgICAgICAgICAgICAgbGliYzo6UFJPVF9O T05FLAorICAgICAgICAgICAgICAgIGxpYmM6Ok1BUF9BTk9OWU1PVVMgfCBsaWJjOjpNQVBfUFJJ VkFURSwKKyAgICAgICAgICAgICAgICAtMSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAg ICAgKTsKKworICAgICAgICAgICAgaWYgYWRkcl9vcmlnID09IGxpYmM6Ok1BUF9GQUlMRUQgewor ICAgICAgICAgICAgICAgIGFueWhvdzo6YmFpbCEoCisgICAgICAgICAgICAgICAgICAgICJGYWls ZWQgdG8gcmVzZXJ2ZSBjaXJjdWxhciBtbWFwIHNwYWNlOiB7fSIsCisgICAgICAgICAgICAgICAg ICAgIHN0ZDo6aW86OkVycm9yOjpsYXN0X29zX2Vycm9yKCkKKyAgICAgICAgICAgICAgICApOwor ICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdGVwIDI6IE1hcCB0aGUgZmlsZSBhdCB0 aGUgc3RhcnQgb2YgcmVzZXJ2ZWQgc3BhY2UKKyAgICAgICAgICAgIGxldCBhZGRyMSA9IGxpYmM6 Om1tYXAoCisgICAgICAgICAgICAgICAgYWRkcl9vcmlnLAorICAgICAgICAgICAgICAgIHNpemUs CisgICAgICAgICAgICAgICAgbGliYzo6UFJPVF9SRUFEIHwgbGliYzo6UFJPVF9XUklURSwKKyAg ICAgICAgICAgICAgICBsaWJjOjpNQVBfRklYRUQgfCBsaWJjOjpNQVBfU0hBUkVELAorICAgICAg ICAgICAgICAgIGZkLAorICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICApOworCisgICAg ICAgICAgICBpZiBhZGRyMSAhPSBhZGRyX29yaWcgeworICAgICAgICAgICAgICAgIGxpYmM6Om11 bm1hcChhZGRyX29yaWcsIHNpemUgKiAyKTsKKyAgICAgICAgICAgICAgICBhbnlob3c6OmJhaWwh KAorICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIG1hcCBmaXJzdCBoYWxmIG9mIGNpcmN1 bGFyIGJ1ZmZlcjoge30iLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmlvOjpFcnJvcjo6bGFz dF9vc19lcnJvcigpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAg ICAgICAgLy8gU3RlcCAzOiBNYXAgdGhlIFNBTUUgZmlsZSBhZ2FpbiByaWdodCBhZnRlcgorICAg ICAgICAgICAgbGV0IGFkZHJfbmV4dCA9IChhZGRyX29yaWcgYXMgKm11dCB1OCkuYWRkKHNpemUp IGFzICptdXQgbGliYzo6Y192b2lkOworICAgICAgICAgICAgbGV0IGFkZHIyID0gbGliYzo6bW1h cCgKKyAgICAgICAgICAgICAgICBhZGRyX25leHQsCisgICAgICAgICAgICAgICAgc2l6ZSwKKyAg ICAgICAgICAgICAgICBsaWJjOjpQUk9UX1JFQUQgfCBsaWJjOjpQUk9UX1dSSVRFLAorICAgICAg ICAgICAgICAgIGxpYmM6Ok1BUF9GSVhFRCB8IGxpYmM6Ok1BUF9TSEFSRUQsCisgICAgICAgICAg ICAgICAgZmQsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICk7CisKKyAgICAgICAg ICAgIGlmIGFkZHIyICE9IGFkZHJfbmV4dCB7CisgICAgICAgICAgICAgICAgbGliYzo6bXVubWFw KGFkZHJfb3JpZywgc2l6ZSAqIDIpOworICAgICAgICAgICAgICAgIGFueWhvdzo6YmFpbCEoCisg ICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gbWFwIHNlY29uZCBoYWxmIG9mIGNpcmN1bGFy IGJ1ZmZlcjoge30iLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmlvOjpFcnJvcjo6bGFzdF9v c19lcnJvcigpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAg ICAgdHJhY2luZzo6ZGVidWchKAorICAgICAgICAgICAgICAgICJDcmVhdGVkIGNpcmN1bGFyIG1t YXA6IHs6cH0sIHt9IGJ5dGVzICgyeCB7fSBieXRlcyBmaWxlKSIsCisgICAgICAgICAgICAgICAg YWRkcl9vcmlnLAorICAgICAgICAgICAgICAgIHNpemUgKiAyLAorICAgICAgICAgICAgICAgIHNp emUKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIE9rKFNlbGYgeworICAgICAgICAgICAg ICAgIGFkZHI6IGFkZHJfb3JpZywKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAg fSkKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGJhc2UgYWRkcmVzcyBhcyBh IG11dGFibGUgcG9pbnRlciB0byB1MzIKKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyB0aGUgbW9z dCBjb21tb24gdXNlIGNhc2UgZm9yIHJpbmcgYnVmZmVycyB3aGljaCB3b3JrIHdpdGggdTMyIHdv cmRzLgorICAgIGZuIGFzX211dF9wdHIoJnNlbGYpIC0+ICptdXQgdTMyIHsKKyAgICAgICAgc2Vs Zi5hZGRyIGFzICptdXQgdTMyCisgICAgfQorCisgICAgLy8vIFplcm8taW5pdGlhbGl6ZSB0aGUg Y2lyY3VsYXIgbWFwcGluZworICAgIC8vLworICAgIC8vLyBPbmx5IG5lZWRzIHRvIHdyaXRlIHRv IHRoZSBmaXJzdCBoYWxmIGR1ZSB0byB0aGUgY2lyY3VsYXIgbmF0dXJlLgorICAgIC8vLworICAg IC8vLyAjIFNhZmV0eQorICAgIC8vLyBUaGUgY2lyY3VsYXIgbW1hcCBtdXN0IGJlIHByb3Blcmx5 IGluaXRpYWxpemVkIGFuZCB0aGUgYWRkcmVzcyB2YWxpZC4KKyAgICB1bnNhZmUgZm4gemVyb19p bml0aWFsaXplKCZtdXQgc2VsZikgeworICAgICAgICAvLyBTQUZFVFk6IENhbGxlciBlbnN1cmVz IHRoZSBjaXJjdWxhciBtbWFwIGlzIHZhbGlkIGFuZCBtYXBwZWQKKyAgICAgICAgdW5zYWZlIHsK KyAgICAgICAgICAgIHN0ZDo6cHRyOjp3cml0ZV9ieXRlcyhzZWxmLmFkZHIgYXMgKm11dCB1OCwg MCwgc2VsZi5zaXplKTsKKyAgICAgICAgfQorICAgIH0KK30KKworaW1wbCBEcm9wIGZvciBDaXJj dWxhck1tYXAgeworICAgIGZuIGRyb3AoJm11dCBzZWxmKSB7CisgICAgICAgIC8vIE11bm1hcCB0 aGUgMnggY2lyY3VsYXIgbWFwcGluZworICAgICAgICAvLyBNYXRjaGVzIGxpYnFiJ3MgY2xlYW51 cCBpbiBxYl9yYl9jbG9zZV9oZWxwZXIKKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIGxp YmM6Om11bm1hcChzZWxmLmFkZHIsIHNlbGYuc2l6ZSAqIDIpOworICAgICAgICB9CisgICAgICAg IHRyYWNpbmc6OmRlYnVnISgKKyAgICAgICAgICAgICJVbm1hcHBlZCBjaXJjdWxhciBidWZmZXI6 IHs6cH0sIHt9IGJ5dGVzICgyeCB7fSBieXRlcyBmaWxlKSIsCisgICAgICAgICAgICBzZWxmLmFk ZHIsCisgICAgICAgICAgICBzZWxmLnNpemUgKiAyLAorICAgICAgICAgICAgc2VsZi5zaXplCisg ICAgICAgICk7CisgICAgfQorfQorCisvLy8gUHJvY2Vzcy1zaGFyZWQgUE9TSVggc2VtYXBob3Jl IHdyYXBwZXIKKy8vLworLy8vIFRoaXMgd3JhcHMgdGhlIG5hdGl2ZSBMaW51eCBzZW1fdCAoMzIg Ynl0ZXMgb24geDg2XzY0KSBmb3IgaW50ZXItcHJvY2VzcworLy8vIHN5bmNocm9uaXphdGlvbiBp biB0aGUgcmluZyBidWZmZXIuCisvLy8KKy8vLyAqKmxpYnFiIGNvbXBhdGliaWxpdHkgbm90ZSoq OiBUaGlzIGNvcnJlc3BvbmRzIHRvIGxpYnFiJ3MgYHJwbF9zZW1fdGAgdHlwZS4KKy8vLyBPbiBM aW51eCB3aXRoIEhBVkVfU0VNX1RJTUVEV0FJVCBkZWZpbmVkLCBycGxfc2VtX3QgaXMganVzdCBh biBhbGlhcyBmb3IKKy8vLyB0aGUgbmF0aXZlIHNlbV90LiBUaGUgInJwbCIgcHJlZml4IHN0YW5k cyBmb3IgInJlcGxhY2VtZW50IiAtIGxpYnFiIHByb3ZpZGVzCisvLy8gYSBmYWxsYmFjayBpbXBs ZW1lbnRhdGlvbiB1c2luZyBtdXRleGVzL2NvbmR2YXJzIG9uIHN5c3RlbXMgd2l0aG91dCBwcm9w ZXIKKy8vLyBQT1NJWCBzZW1hcGhvcmUgc3VwcG9ydCAobGlrZSBCU0QpLiBTaW5jZSB3ZSBvbmx5 IHRhcmdldCBMaW51eCwgd2UgdXNlIHRoZQorLy8vIG5hdGl2ZSBzZW1fdCBkaXJlY3RseS4KKyNb cmVwcihDKV0KK3N0cnVjdCBQb3NpeFNlbSB7CisgICAgLy8vIFJhdyBzZW1fdCBzdG9yYWdlICgz MiBieXRlcyBvbiBMaW51eCB4ODZfNjQpCisgICAgX3NlbTogW3U4OyAzMl0sCit9CisKK2ltcGwg UG9zaXhTZW0geworICAgIC8vLyBJbml0aWFsaXplIGEgUE9TSVggc2VtYXBob3JlIGluLXBsYWNl IGluIHNoYXJlZCBtZW1vcnkKKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpbml0aWFsaXplcyB0aGUg c2VtYXBob3JlIGF0IGl0cyBjdXJyZW50IG1lbW9yeSBsb2NhdGlvbiwgd2hpY2ggaXMKKyAgICAv Ly8gY3JpdGljYWwgZm9yIHByb2Nlc3Mtc2hhcmVkIHNlbWFwaG9yZXMgaW4gbW1hcCdkIG1lbW9y eS4gVGhlIHNlbWFwaG9yZQorICAgIC8vLyBtdXN0IG5vdCBiZSBtb3ZlZCBhZnRlciBpbml0aWFs aXphdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHNlbWFwaG9yZSBpcyBhbHdheXMgaW5pdGlh bGl6ZWQgYXM6CisgICAgLy8vIC0gKipQcm9jZXNzLXNoYXJlZCoqIChwc2hhcmVkPTEpOiBTaGFy ZWQgYmV0d2VlbiBwcm9jZXNzZXMgdmlhIG1tYXAKKyAgICAvLy8gLSAqKkluaXRpYWwgdmFsdWUg MCoqOiBObyBkYXRhIGF2YWlsYWJsZSBpbml0aWFsbHkKKyAgICAvLy8KKyAgICAvLy8gTWF0Y2hl cyBsaWJxYidzIHNlbWFwaG9yZSBpbml0aWFsaXphdGlvbiBpbiBgcWJfcmJfY3JlYXRlX2Zyb21f ZmlsZWAuCisgICAgLy8vCisgICAgLy8vICMgU2FmZXR5CisgICAgLy8vIFRoZSBzZW1hcGhvcmUg bXVzdCByZW1haW4gYXQgaXRzIGN1cnJlbnQgbWVtb3J5IGxvY2F0aW9uIGFuZCBtdXN0IG5vdAor ICAgIC8vLyBiZSBtb3ZlZCBvciBjb3BpZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCisgICAgdW5z YWZlIGZuIGluaXRfaW5fcGxhY2UoJm11dCBzZWxmKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAg bGV0IHNlbV9wdHIgPSBzZWxmLl9zZW0uYXNfbXV0X3B0cigpIGFzICptdXQgbGliYzo6c2VtX3Q7 CisKKyAgICAgICAgLy8gcHNoYXJlZD0xOiBQcm9jZXNzLXNoYXJlZCBzZW1hcGhvcmUgKGZvciBj cm9zcy1wcm9jZXNzIElQQykKKyAgICAgICAgLy8gaW5pdGlhbF92YWx1ZT0wOiBObyBkYXRhIGF2 YWlsYWJsZSBpbml0aWFsbHkgKHByb2R1Y2VycyB3aWxsIHBvc3QpCisgICAgICAgIGNvbnN0IFBT SEFSRUQ6IGxpYmM6OmNfaW50ID0gMTsKKyAgICAgICAgY29uc3QgSU5JVElBTF9WQUxVRTogbGli Yzo6Y191aW50ID0gMDsKKworICAgICAgICAvLyBTQUZFVFk6IENhbGxlciBlbnN1cmVzIHRoZSBz ZW1hcGhvcmUgbWVtb3J5IGlzIHZhbGlkIGFuZCB3aWxsIHJlbWFpbgorICAgICAgICAvLyBhdCB0 aGlzIGxvY2F0aW9uIGZvciBpdHMgbGlmZXRpbWUKKyAgICAgICAgbGV0IHJldCA9IHVuc2FmZSB7 IGxpYmM6OnNlbV9pbml0KHNlbV9wdHIsIFBTSEFSRUQsIElOSVRJQUxfVkFMVUUpIH07CisKKyAg ICAgICAgaWYgcmV0ICE9IDAgeworICAgICAgICAgICAgYW55aG93OjpiYWlsISgic2VtX2luaXQg ZmFpbGVkOiB7fSIsIHN0ZDo6aW86OkVycm9yOjpsYXN0X29zX2Vycm9yKCkpOworICAgICAgICB9 CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8vIERlc3Ryb3kgdGhlIHNlbWFwaG9y ZQorICAgIC8vLworICAgIC8vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgc2VtYXBo b3JlIGlzIG5vIGxvbmdlciBuZWVkZWQuCisgICAgLy8vIE1hdGNoZXMgbGlicWIncyBycGxfc2Vt X2Rlc3Ryb3kgKHdoaWNoIGlzIHNlbV9kZXN0cm95IG9uIExpbnV4KS4KKyAgICAvLy8KKyAgICAv Ly8gIyBTYWZldHkKKyAgICAvLy8gVGhlIHNlbWFwaG9yZSBtdXN0IGhhdmUgYmVlbiBwcm9wZXJs eSBpbml0aWFsaXplZCBhbmQgbm8gdGhyZWFkcyBzaG91bGQKKyAgICAvLy8gYmUgd2FpdGluZyBv biBpdC4KKyAgICB1bnNhZmUgZm4gZGVzdHJveSgmbXV0IHNlbGYpIC0+IFJlc3VsdDwoKT4gewor ICAgICAgICBsZXQgc2VtX3B0ciA9IHNlbGYuX3NlbS5hc19tdXRfcHRyKCkgYXMgKm11dCBsaWJj OjpzZW1fdDsKKworICAgICAgICAvLyBTQUZFVFk6IENhbGxlciBlbnN1cmVzIHRoZSBzZW1hcGhv cmUgaXMgaW5pdGlhbGl6ZWQgYW5kIG5vdCBpbiB1c2UKKyAgICAgICAgbGV0IHJldCA9IHVuc2Fm ZSB7IGxpYmM6OnNlbV9kZXN0cm95KHNlbV9wdHIpIH07CisKKyAgICAgICAgaWYgcmV0ICE9IDAg eworICAgICAgICAgICAgYW55aG93OjpiYWlsISgic2VtX2Rlc3Ryb3kgZmFpbGVkOiB7fSIsIHN0 ZDo6aW86OkVycm9yOjpsYXN0X29zX2Vycm9yKCkpOworICAgICAgICB9CisKKyAgICAgICAgT2so KCkpCisgICAgfQorCisgICAgLy8vIFBvc3QgdG8gdGhlIHNlbWFwaG9yZSAoaW5jcmVtZW50KQor ICAgIC8vLworICAgIC8vLyBNYXRjaGVzIGxpYnFiJ3MgcnBsX3NlbV9wb3N0ICh3aGljaCBpcyBz ZW1fcG9zdCBvbiBMaW51eCkuCisgICAgdW5zYWZlIGZuIHBvc3QoJnNlbGYpIC0+IFJlc3VsdDwo KT4geworICAgICAgICBsZXQgcmV0ID0gdW5zYWZlIHsgbGliYzo6c2VtX3Bvc3Qoc2VsZi5fc2Vt LmFzX3B0cigpIGFzICptdXQgbGliYzo6c2VtX3QpIH07CisKKyAgICAgICAgaWYgcmV0ICE9IDAg eworICAgICAgICAgICAgYW55aG93OjpiYWlsISgic2VtX3Bvc3QgZmFpbGVkOiB7fSIsIHN0ZDo6 aW86OkVycm9yOjpsYXN0X29zX2Vycm9yKCkpOworICAgICAgICB9CisKKyAgICAgICAgT2soKCkp CisgICAgfQorCisgICAgLy8vIFdhaXQgb24gdGhlIHNlbWFwaG9yZSBhc3luY2hyb25vdXNseSAo ZGVjcmVtZW50LCBibG9ja2luZykKKyAgICAvLy8KKyAgICAvLy8gVXNlcyBgc3Bhd25fYmxvY2tp bmdgIHRvIHdhaXQgb24gdGhlIHNlbWFwaG9yZSB3aXRob3V0IGJsb2NraW5nIHRoZSB0b2tpbwor ICAgIC8vLyBydW50aW1lLiBUaGlzIHByb3ZpZGVzIHRydWUgZXZlbnQtZHJpdmVuIGJlaGF2aW9y IHdoaWxlIG1haW50YWluaW5nCisgICAgLy8vIGNvbXBhdGliaWxpdHkgd2l0aCBsaWJxYidzIHNl bWFwaG9yZS1iYXNlZCBub3RpZmljYXRpb24gbWVjaGFuaXNtLgorICAgIC8vLworICAgIC8vLyBN YXRjaGVzIGxpYnFiJ3MgYG15X3Bvc2l4X3NlbV90aW1lZHdhaXRgIC8gYHNlbV93YWl0YCBiZWhh dmlvci4KKyAgICAvLy8KKyAgICAvLy8gIyBTYWZldHkKKyAgICAvLy8gVGhlIHNlbWFwaG9yZSBt dXN0IGJlIHByb3Blcmx5IGluaXRpYWxpemVkIGFuZCByZW1haW4gdmFsaWQgZm9yIHRoZQorICAg IC8vLyBkdXJhdGlvbiBvZiB0aGUgd2FpdCBvcGVyYXRpb24uCisgICAgYXN5bmMgdW5zYWZlIGZu IHdhaXQoJnNlbGYpIC0+IFJlc3VsdDwoKT4geworICAgICAgICAvLyBHZXQgcmF3IHBvaW50ZXIg dG8gc2VtYXBob3JlCisgICAgICAgIGxldCBzZW1fcHRyID0gc2VsZi5fc2VtLmFzX3B0cigpIGFz ICptdXQgbGliYzo6c2VtX3Q7CisKKyAgICAgICAgLy8gQ29udmVydCB0byB1c2l6ZSBmb3Igc2Fm ZSB0cmFuc2ZlciBiZXR3ZWVuIHRocmVhZHMKKyAgICAgICAgLy8gVGhpcyBpcyBzYWZlIGJlY2F1 c2U6CisgICAgICAgIC8vIDEuIFRoZSBzZW1hcGhvcmUgaXMgaW4gcHJvY2Vzcy1zaGFyZWQgbWVt b3J5IChtbWFwJ2QgZmlsZSkKKyAgICAgICAgLy8gMi4gVGhlIG1lbW9yeSByZW1haW5zIHZhbGlk IGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlCisgICAgICAgIC8v IDMuIFdlJ3JlIG9ubHkgdXNpbmcgdGhlIHBvaW50ZXIgb24gdGhlIGJsb2NraW5nIHRocmVhZCBw b29sCisgICAgICAgIGxldCBzZW1fcHRyX2FkZHIgPSBzZW1fcHRyIGFzIHVzaXplOworCisgICAg ICAgIC8vIFVzZSBzcGF3bl9ibG9ja2luZyB0byB3YWl0IG9uIHRoZSBzZW1hcGhvcmUgd2l0aG91 dCBibG9ja2luZyB0b2tpbyBydW50aW1lCisgICAgICAgIC8vIFRoaXMgb2ZmbG9hZHMgdGhlIGJs b2NraW5nIHNlbV93YWl0IHRvIHRva2lvJ3MgZGVkaWNhdGVkIGJsb2NraW5nIHRocmVhZCBwb29s CisgICAgICAgIHRva2lvOjp0YXNrOjpzcGF3bl9ibG9ja2luZyhtb3ZlIHx8IHsKKyAgICAgICAg ICAgIC8vIFJlY29uc3RydWN0IHRoZSBwb2ludGVyIG9uIHRoZSBibG9ja2luZyB0aHJlYWQKKyAg ICAgICAgICAgIC8vIFNBRkVUWTogVGhlIHNlbWFwaG9yZSBpcyBpbiBzaGFyZWQgbWVtb3J5IGFu ZCByZW1haW5zIHZhbGlkLgorICAgICAgICAgICAgLy8gV2UncmUgY2FsbGluZyBzZW1fd2FpdCBv biBhIHByb2Nlc3Mtc2hhcmVkIHNlbWFwaG9yZSBmcm9tIGEgdGhyZWFkCisgICAgICAgICAgICAv LyBpbiB0aGUgc2FtZSBwcm9jZXNzLCB3aGljaCBpcyBzYWZlLgorICAgICAgICAgICAgbGV0IHNl bV9wdHIgPSBzZW1fcHRyX2FkZHIgYXMgKm11dCBsaWJjOjpzZW1fdDsKKyAgICAgICAgICAgIGxl dCByZXQgPSB1bnNhZmUgeyBsaWJjOjpzZW1fd2FpdChzZW1fcHRyKSB9OworCisgICAgICAgICAg ICBpZiByZXQgIT0gMCB7CisgICAgICAgICAgICAgICAgbGV0IGVyciA9IHN0ZDo6aW86OkVycm9y OjpsYXN0X29zX2Vycm9yKCk7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlIEVJTlRSIGJ5IHJl dHVybmluZyBhbiBlcnJvciB0aGF0IGNhdXNlcyByZXRyeQorICAgICAgICAgICAgICAgIGlmIGVy ci5yYXdfb3NfZXJyb3IoKSA9PSBTb21lKGxpYmM6OkVJTlRSKSB7CisgICAgICAgICAgICAgICAg ICAgIGFueWhvdzo6YmFpbCEoInNlbV93YWl0IGludGVycnVwdGVkIChFSU5UUiksIHdpbGwgcmV0 cnkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYW55aG93OjpiYWlsISgi c2VtX3dhaXQgZmFpbGVkOiB7ZXJyfSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBP aygoKSkKKyAgICAgICAgfSkKKyAgICAgICAgLmF3YWl0CisgICAgICAgIC5jb250ZXh0KCJzcGF3 bl9ibG9ja2luZyB0YXNrIGZhaWxlZCIpPz87CisKKyAgICAgICAgT2soKCkpCisgICAgfQorfQor CisvLy8gU2hhcmVkIG1lbW9yeSBoZWFkZXIgbWF0Y2hpbmcgbGlicWIncyBxYl9yaW5nYnVmZmVy X3NoYXJlZF9zIGxheW91dAorLy8vCisvLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgbW1hcCdkIGFuZCBz aGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMuCisvLy8gRmllbGQgb3JkZXIgYW5kIGFsaWdubWVudCBt dXN0IGV4YWN0bHkgbWF0Y2ggbGlicWIgZm9yIGNvbXBhdGliaWxpdHkuCisvLy8KKy8vLyBOb3Rl OiBsaWJxYidzIHN0cnVjdCBoYXMgYGNoYXIgdXNlcl9kYXRhWzFdYCB3aGljaCBjb250cmlidXRl cyAxIGJ5dGUgdG8gc2l6ZW9mKCksCisvLy8gdGhlbiB0aGUgc3RydWN0IGlzIHBhZGRlZCB0byA4 LWJ5dGUgYWxpZ25tZW50ICg3IGJ5dGVzIHBhZGRpbmcpLgorLy8vIEFkZGl0aW9uYWwgc2hhcmVk X3VzZXJfZGF0YV9zaXplIGJ5dGVzIGFyZSBhbGxvY2F0ZWQgYmV5b25kIHNpemVvZigpLgorI1ty ZXByKEMsIGFsaWduKDgpKV0KK3N0cnVjdCBSaW5nQnVmZmVyU2hhcmVkIHsKKyAgICAvLy8gV3Jp dGUgcG9pbnRlciAod29yZCBpbmRleCwgbm90IGJ5dGUgb2Zmc2V0KQorICAgIHdyaXRlX3B0OiBB dG9taWNVMzIsCisgICAgLy8vIFJlYWQgcG9pbnRlciAod29yZCBpbmRleCwgbm90IGJ5dGUgb2Zm c2V0KQorICAgIHJlYWRfcHQ6IEF0b21pY1UzMiwKKyAgICAvLy8gUmluZyBidWZmZXIgc2l6ZSBp biB3b3JkcyAodTMyIHVuaXRzKQorICAgIHdvcmRfc2l6ZTogdTMyLAorICAgIC8vLyBQYXRoIHRv IGhlYWRlciBmaWxlCisgICAgaGRyX3BhdGg6IFt1ODsgbGliYzo6UEFUSF9NQVggYXMgdXNpemVd LAorICAgIC8vLyBQYXRoIHRvIGRhdGEgZmlsZQorICAgIGRhdGFfcGF0aDogW3U4OyBsaWJjOjpQ QVRIX01BWCBhcyB1c2l6ZV0sCisgICAgLy8vIFJlZmVyZW5jZSBjb3VudCAoZm9yIGNsZWFudXAp CisgICAgcmVmX2NvdW50OiBBdG9taWNVMzIsCisgICAgLy8vIFByb2Nlc3Mtc2hhcmVkIHNlbWFw aG9yZSBmb3Igbm90aWZpY2F0aW9uCisgICAgcG9zaXhfc2VtOiBQb3NpeFNlbSwKKyAgICAvLy8g RmxleGlibGUgYXJyYXkgbWVtYmVyIHBsYWNlaG9sZGVyIChtYXRjaGVzIEMncyBjaGFyIHVzZXJf ZGF0YVsxXSkKKyAgICAvLy8gQWN0dWFsIHVzZXJfZGF0YSBzdGFydHMgaGVyZSBhbmQgY29udGlu dWVzIGJleW9uZCBzaXplb2YoUmluZ0J1ZmZlclNoYXJlZCkKKyAgICB1c2VyX2RhdGE6IFt1ODsg MV0sCisgICAgLy8gNyBieXRlcyBvZiBwYWRkaW5nIGFkZGVkIGJ5IGFsaWduKDgpIHRvIHJlYWNo IDgyNDggYnl0ZXMgdG90YWwKK30KKworaW1wbCBSaW5nQnVmZmVyU2hhcmVkIHsKKyAgICAvLy8g Q2h1bmsgaGVhZGVyIHNpemUgaW4gMzItYml0IHdvcmRzIChtYXRjaGluZyBsaWJxYikKKyAgICBj b25zdCBDSFVOS19IRUFERVJfV09SRFM6IHVzaXplID0gMjsKKworICAgIC8vLyBDaHVuayBtYWdp YyBudW1iZXJzIChtYXRjaGluZyBsaWJxYiBxYl9yaW5nYnVmZmVyX2ludC5oKQorICAgIGNvbnN0 IENIVU5LX01BR0lDOiB1MzIgPSAweEExQTFBMUExOyAvLyBWYWxpZCBhbGxvY2F0ZWQgY2h1bmsK KyAgICBjb25zdCBDSFVOS19NQUdJQ19ERUFEOiB1MzIgPSAweEQwRDBEMEQwOyAvLyBSZWNsYWlt ZWQvZGVhZCBjaHVuaworICAgIGNvbnN0IENIVU5LX01BR0lDX0FMTE9DOiB1MzIgPSAweEExMTBD RUQwOyAvLyBDaHVuayBiZWluZyBhbGxvY2F0ZWQKKworICAgIC8vLyBDYWxjdWxhdGUgdGhlIG5l eHQgcG9pbnRlciBwb3NpdGlvbiBhZnRlciBhIGNodW5rIG9mIGdpdmVuIHNpemUKKyAgICAvLy8K KyAgICAvLy8gVGhpcyBpbXBsZW1lbnRzIGxpYnFiJ3MgcWJfcmJfY2h1bmtfc3RlcCBsb2dpYyAo cmluZ2J1ZmZlci5jOjQ2NC00ODQpOgorICAgIC8vLyAxLiBTa2lwIGNodW5rIGhlYWRlciAoQ0hV TktfSEVBREVSX1dPUkRTKQorICAgIC8vLyAyLiBTa2lwIHVzZXIgZGF0YSAocm91bmRlZCB1cCB0 byB3b3JkIGJvdW5kYXJ5KQorICAgIC8vLyAzLiBXcmFwIGFyb3VuZCBpZiBuZWVkZWQKKyAgICAv Ly8KKyAgICAvLy8gIyBBcmd1bWVudHMKKyAgICAvLy8gLSBgY3VycmVudF9wdGA6IEN1cnJlbnQg cmVhZCBvciB3cml0ZSBwb2ludGVyIChpbiB3b3JkcykKKyAgICAvLy8gLSBgZGF0YV9zaXplX2J5 dGVzYDogU2l6ZSBvZiB0aGUgZGF0YSBwYXlsb2FkIGluIGJ5dGVzCisgICAgLy8vCisgICAgLy8v ICMgUmV0dXJucworICAgIC8vLyBOZXcgcG9pbnRlciBwb3NpdGlvbiAoaW4gd29yZHMpLCB3cmFw cGVkIHRvIFswLCB3b3JkX3NpemUpCisgICAgZm4gY2h1bmtfc3RlcCgmc2VsZiwgY3VycmVudF9w dDogdTMyLCBkYXRhX3NpemVfYnl0ZXM6IHVzaXplKSAtPiB1MzIgeworICAgICAgICBsZXQgd29y ZF9zaXplID0gc2VsZi53b3JkX3NpemUgYXMgdXNpemU7CisKKyAgICAgICAgLy8gQ29udmVydCBi eXRlcyB0byB3b3Jkcywgcm91bmRpbmcgdXAgdG8gd29yZCBib3VuZGFyeQorICAgICAgICAvLyBU aGlzIG1hdGNoZXMgbGlicWIncyBsb2dpYzoKKyAgICAgICAgLy8gICBwb2ludGVyICs9IChjaHVu a19zaXplIC8gc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgICAgIC8vICAgaWYgKChjaHVua19zaXpl ICUgKHNpemVvZih1aW50MzJfdCkgKiBRQl9SQl9XT1JEX0FMSUdOKSkgIT0gMCkgcG9pbnRlcisr OworICAgICAgICBsZXQgZGF0YV93b3JkcyA9IGRhdGFfc2l6ZV9ieXRlcy5kaXZfY2VpbChzdGQ6 Om1lbTo6c2l6ZV9vZjo6PHUzMj4oKSk7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIG5ldyBwb3Np dGlvbjogY3VycmVudCArIGhlYWRlciArIGRhdGEgKGluIHdvcmRzKQorICAgICAgICBsZXQgbmV3 X3B0ID0gKGN1cnJlbnRfcHQgYXMgdXNpemUgKyBTZWxmOjpDSFVOS19IRUFERVJfV09SRFMgKyBk YXRhX3dvcmRzKSAlIHdvcmRfc2l6ZTsKKworICAgICAgICBuZXdfcHQgYXMgdTMyCisgICAgfQor CisgICAgLy8vIEluaXRpYWxpemUgYSBSaW5nQnVmZmVyU2hhcmVkIHN0cnVjdHVyZSBpbi1wbGFj ZSBpbiBzaGFyZWQgbWVtb3J5CisgICAgLy8vCisgICAgLy8vIFRoaXMgaW5pdGlhbGl6ZXMgdGhl IHJpbmcgYnVmZmVyIGhlYWRlciBhdCBpdHMgY3VycmVudCBtZW1vcnkgbG9jYXRpb24sIHdoaWNo IGlzCisgICAgLy8vIGNyaXRpY2FsIGZvciBwcm9jZXNzLXNoYXJlZCBkYXRhIHN0cnVjdHVyZXMg aW4gbW1hcCdkIG1lbW9yeS4gVGhlIHN0cnVjdHVyZQorICAgIC8vLyBtdXN0IG5vdCBiZSBtb3Zl ZCBhZnRlciBpbml0aWFsaXphdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gIyBBcmd1bWVudHMKKyAg ICAvLy8gLSBgd29yZF9zaXplYDogU2l6ZSBvZiByaW5nIGJ1ZmZlciBpbiAzMi1iaXQgd29yZHMK KyAgICAvLy8gLSBgaGRyX3BhdGhgOiBQYXRoIHRvIHRoZSBoZWFkZXIgZmlsZSAod2lsbCBiZSBj b3BpZWQgaW50byB0aGUgc3RydWN0dXJlKQorICAgIC8vLyAtIGBkYXRhX3BhdGhgOiBQYXRoIHRv IHRoZSBkYXRhIGZpbGUgKHdpbGwgYmUgY29waWVkIGludG8gdGhlIHN0cnVjdHVyZSkKKyAgICAv Ly8KKyAgICAvLy8gIyBTYWZldHkKKyAgICAvLy8gVGhlIFJpbmdCdWZmZXJTaGFyZWQgbXVzdCBy ZW1haW4gYXQgaXRzIGN1cnJlbnQgbWVtb3J5IGxvY2F0aW9uIGFuZCBtdXN0IG5vdAorICAgIC8v LyBiZSBtb3ZlZCBvciBjb3BpZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCisgICAgdW5zYWZlIGZu IGluaXRfaW5fcGxhY2UoCisgICAgICAgICZtdXQgc2VsZiwKKyAgICAgICAgd29yZF9zaXplOiB1 MzIsCisgICAgICAgIGhkcl9wYXRoOiAmc3RkOjpwYXRoOjpQYXRoLAorICAgICAgICBkYXRhX3Bh dGg6ICZzdGQ6OnBhdGg6OlBhdGgsCisgICAgKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgLy8g U0FGRVRZOiBDYWxsZXIgZW5zdXJlcyB0aGlzIHN0cnVjdHVyZSBpcyBpbiBzaGFyZWQgbWVtb3J5 IGFuZCB3aWxsIHJlbWFpbgorICAgICAgICAvLyBhdCB0aGlzIGxvY2F0aW9uIGZvciBpdHMgbGlm ZXRpbWUKKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIC8vIFplcm8taW5pdGlhbGl6ZSB0 aGUgZW50aXJlIHN0cnVjdHVyZSBmaXJzdAorICAgICAgICAgICAgc3RkOjpwdHI6OndyaXRlX2J5 dGVzKHNlbGYgYXMgKm11dCBTZWxmLCAwLCAxKTsKKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6 ZSBhdG9taWMgZmllbGRzCisgICAgICAgICAgICBzZWxmLndyaXRlX3B0ID0gQXRvbWljVTMyOjpu ZXcoMCk7CisgICAgICAgICAgICBzZWxmLnJlYWRfcHQgPSBBdG9taWNVMzI6Om5ldygwKTsKKyAg ICAgICAgICAgIHNlbGYud29yZF9zaXplID0gd29yZF9zaXplOworICAgICAgICAgICAgc2VsZi5y ZWZfY291bnQgPSBBdG9taWNVMzI6Om5ldygxKTsKKworICAgICAgICAgICAgLy8gSW5pdGlhbGl6 ZSBzZW1hcGhvcmUgaW4tcGxhY2UgaW4gc2hhcmVkIG1lbW9yeQorICAgICAgICAgICAgLy8gVGhp cyBpcyBjcml0aWNhbCAtIHRoZSBzZW1hcGhvcmUgbXVzdCBiZSBpbml0aWFsaXplZCBhdCBpdHMg ZmluYWwgbG9jYXRpb24KKyAgICAgICAgICAgIHNlbGYucG9zaXhfc2VtCisgICAgICAgICAgICAg ICAgLmluaXRfaW5fcGxhY2UoKQorICAgICAgICAgICAgICAgIC5jb250ZXh0KCJGYWlsZWQgdG8g aW5pdGlhbGl6ZSBzZW1hcGhvcmUiKT87CisKKyAgICAgICAgICAgIC8vIENvcHkgaGVhZGVyIHBh dGggaW50byBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGxldCBoZHJfcGF0aF9zdHIgPSBoZHJfcGF0 aC50b19zdHJpbmdfbG9zc3koKTsKKyAgICAgICAgICAgIGxldCBoZHJfcGF0aF9ieXRlcyA9IGhk cl9wYXRoX3N0ci5hc19ieXRlcygpOworICAgICAgICAgICAgbGV0IGxlbiA9IGhkcl9wYXRoX2J5 dGVzLmxlbigpLm1pbihsaWJjOjpQQVRIX01BWCBhcyB1c2l6ZSAtIDEpOworICAgICAgICAgICAg c2VsZi5oZHJfcGF0aFsuLmxlbl0uY29weV9mcm9tX3NsaWNlKCZoZHJfcGF0aF9ieXRlc1suLmxl bl0pOworCisgICAgICAgICAgICAvLyBDb3B5IGRhdGEgcGF0aCBpbnRvIHN0cnVjdHVyZQorICAg ICAgICAgICAgbGV0IGRhdGFfcGF0aF9zdHIgPSBkYXRhX3BhdGgudG9fc3RyaW5nX2xvc3N5KCk7 CisgICAgICAgICAgICBsZXQgZGF0YV9wYXRoX2J5dGVzID0gZGF0YV9wYXRoX3N0ci5hc19ieXRl cygpOworICAgICAgICAgICAgbGV0IGxlbiA9IGRhdGFfcGF0aF9ieXRlcy5sZW4oKS5taW4obGli Yzo6UEFUSF9NQVggYXMgdXNpemUgLSAxKTsKKyAgICAgICAgICAgIHNlbGYuZGF0YV9wYXRoWy4u bGVuXS5jb3B5X2Zyb21fc2xpY2UoJmRhdGFfcGF0aF9ieXRlc1suLmxlbl0pOworICAgICAgICB9 CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8vIENhbGN1bGF0ZSBmcmVlIHNwYWNl IGluIHRoZSByaW5nIGJ1ZmZlciAoaW4gd29yZHMpCisgICAgLy8vCisgICAgLy8vIFJldHVybnMg dGhlIG51bWJlciBvZiBmcmVlIHdvcmRzICh1MzIgdW5pdHMpIGF2YWlsYWJsZSBmb3IgYWxsb2Nh dGlvbi4KKyAgICAvLy8gVGhpcyB1c2VzIGF0b21pYyBsb2FkcyB0byByZWFkIHRoZSBwb2ludGVy cyBzYWZlbHkuCisgICAgZm4gc3BhY2VfZnJlZV93b3Jkcygmc2VsZikgLT4gdXNpemUgeworICAg ICAgICBsZXQgd3JpdGVfcHQgPSBzZWxmLndyaXRlX3B0LmxvYWQoT3JkZXJpbmc6OkFjcXVpcmUp OworICAgICAgICBsZXQgcmVhZF9wdCA9IHNlbGYucmVhZF9wdC5sb2FkKE9yZGVyaW5nOjpBY3F1 aXJlKTsKKyAgICAgICAgbGV0IHdvcmRfc2l6ZSA9IHNlbGYud29yZF9zaXplIGFzIHVzaXplOwor CisgICAgICAgIGlmIHdyaXRlX3B0ID49IHJlYWRfcHQgeworICAgICAgICAgICAgaWYgd3JpdGVf cHQgPT0gcmVhZF9wdCB7CisgICAgICAgICAgICAgICAgd29yZF9zaXplIC8vIEJ1ZmZlciBpcyBl bXB0eSwgYWxsIHNwYWNlIGF2YWlsYWJsZQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAg ICAgICAgICAocmVhZF9wdCBhcyB1c2l6ZSArIHdvcmRfc2l6ZSAtIHdyaXRlX3B0IGFzIHVzaXpl KSAtIDEKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIChyZWFk X3B0IGFzIHVzaXplIC0gd3JpdGVfcHQgYXMgdXNpemUpIC0gMQorICAgICAgICB9CisgICAgfQor CisgICAgLy8vIENhbGN1bGF0ZSBmcmVlIHNwYWNlIGluIGJ5dGVzCisgICAgLy8vCisgICAgLy8v IENvbnZlcnRzIHRoZSB3b3JkIGNvdW50IHRvIGJ5dGVzIGJ5IG11bHRpcGx5aW5nIGJ5IHNpemVv Zih1aW50MzJfdCkuCisgICAgLy8vIE1hdGNoZXMgbGlicWIncyBxYl9yYl9zcGFjZV9mcmVlIChy aW5nYnVmZmVyLmM6MzczKS4KKyAgICBmbiBzcGFjZV9mcmVlX2J5dGVzKCZzZWxmKSAtPiB1c2l6 ZSB7CisgICAgICAgIHNlbGYuc3BhY2VfZnJlZV93b3JkcygpICogc3RkOjptZW06OnNpemVfb2Y6 Ojx1MzI+KCkKKyAgICB9CisKKyAgICAvLy8gQ2hlY2sgaWYgYSBjaHVuayBvZiBnaXZlbiBzaXpl IChpbiBieXRlcykgY2FuIGZpdCBpbiB0aGUgYnVmZmVyCisgICAgLy8vCisgICAgLy8vIEluY2x1 ZGVzIGNodW5rIGhlYWRlciBvdmVyaGVhZCBhbmQgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4KKyAg ICBmbiBjaHVua19maXRzKCZzZWxmLCBtZXNzYWdlX3NpemU6IHVzaXplLCBjaHVua19tYXJnaW46 IHVzaXplKSAtPiBib29sIHsKKyAgICAgICAgbGV0IHJlcXVpcmVkX2J5dGVzID0gbWVzc2FnZV9z aXplICsgY2h1bmtfbWFyZ2luOworICAgICAgICBzZWxmLnNwYWNlX2ZyZWVfYnl0ZXMoKSA+PSBy ZXF1aXJlZF9ieXRlcworICAgIH0KKworICAgIC8vLyBXcml0ZSBhIGNodW5rIHRvIHRoZSByaW5n IGJ1ZmZlcgorICAgIC8vLworICAgIC8vLyBUaGlzIHBlcmZvcm1zIHRoZSBjb21wbGV0ZSBjaHVu ayB3cml0ZSBvcGVyYXRpb246CisgICAgLy8vIDEuIEFsbG9jYXRlIHNwYWNlIGluIHRoZSByaW5n IGJ1ZmZlcgorICAgIC8vLyAyLiBXcml0ZSB0aGUgbWVzc2FnZSBkYXRhIChoYW5kbGluZyB3cmFw YXJvdW5kKQorICAgIC8vLyAzLiBDb21taXQgdGhlIGNodW5rICh1cGRhdGUgd3JpdGVfcHQsIHNl dCBtYWdpYykKKyAgICAvLy8gNC4gUG9zdCB0byBzZW1hcGhvcmUgdG8gd2FrZSByZWFkZXJzCisg ICAgLy8vCisgICAgLy8vICMgU2FmZXR5CisgICAgLy8vIENhbGxlciBtdXN0IGVuc3VyZToKKyAg ICAvLy8gLSBzaGFyZWRfZGF0YSBwb2ludHMgdG8gdmFsaWQgcmluZyBidWZmZXIgZGF0YQorICAg IC8vLyAtIFRoZXJlIGlzIHN1ZmZpY2llbnQgc3BhY2UgKGNoZWNrZWQgdmlhIGNodW5rX2ZpdHMp CisgICAgLy8vIC0gTm8gb3RoZXIgdGhyZWFkIGlzIHdyaXRpbmcgY29uY3VycmVudGx5CisgICAg dW5zYWZlIGZuIHdyaXRlX2NodW5rKCZzZWxmLCBzaGFyZWRfZGF0YTogKm11dCB1MzIsIG1lc3Nh Z2U6ICZbdThdKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IG1zZ19sZW4gPSBtZXNzYWdl LmxlbigpOworICAgICAgICBsZXQgd29yZF9zaXplID0gc2VsZi53b3JkX3NpemUgYXMgdXNpemU7 CisKKyAgICAgICAgLy8gR2V0IGN1cnJlbnQgd3JpdGUgcG9pbnRlcgorICAgICAgICBsZXQgd3Jp dGVfcHQgPSBzZWxmLndyaXRlX3B0LmxvYWQoT3JkZXJpbmc6OkFjcXVpcmUpOworCisgICAgICAg IC8vIFdyaXRlIGNodW5rIGhlYWRlcjogW3NpemU9MF1bbWFnaWM9QUxMT0NdCisgICAgICAgIC8v IE1hdGNoZXMgbGlicWIncyBxYl9yYl9jaHVua19hbGxvYyAocmluZ2J1ZmZlci5jOjQzOS00NDAp CisgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAgICAqc2hhcmVkX2RhdGEuYWRkKHdyaXRlX3B0 IGFzIHVzaXplKSA9IDA7IC8vIFNpemUgaXMgMCBkdXJpbmcgYWxsb2NhdGlvbgorICAgICAgICAg ICAgKnNoYXJlZF9kYXRhLmFkZCgod3JpdGVfcHQgYXMgdXNpemUgKyAxKSAlIHdvcmRfc2l6ZSkg PSBTZWxmOjpDSFVOS19NQUdJQ19BTExPQzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdyaXRl IG1lc3NhZ2UgZGF0YQorICAgICAgICBsZXQgZGF0YV9vZmZzZXQgPSAod3JpdGVfcHQgYXMgdXNp emUgKyBTZWxmOjpDSFVOS19IRUFERVJfV09SRFMpICUgd29yZF9zaXplOworICAgICAgICBsZXQg ZGF0YV9wdHIgPSB1bnNhZmUgeyBzaGFyZWRfZGF0YS5hZGQoZGF0YV9vZmZzZXQpIGFzICptdXQg dTggfTsKKworICAgICAgICAvLyBIYW5kbGUgd3JhcGFyb3VuZCAtIGNhbGN1bGF0ZSByZW1haW5p bmcgYnl0ZXMgaW4gYnVmZmVyIGJlZm9yZSB3cmFwYXJvdW5kCisgICAgICAgIGxldCByZW1haW5p bmcgPSAod29yZF9zaXplIC0gZGF0YV9vZmZzZXQpICogc3RkOjptZW06OnNpemVfb2Y6Ojx1MzI+ KCk7CisgICAgICAgIGlmIG1zZ19sZW4gPD0gcmVtYWluaW5nIHsKKyAgICAgICAgICAgIC8vIE5v IHdyYXBhcm91bmQgbmVlZGVkCisgICAgICAgICAgICB1bnNhZmUgeworICAgICAgICAgICAgICAg IHN0ZDo6cHRyOjpjb3B5X25vbm92ZXJsYXBwaW5nKG1lc3NhZ2UuYXNfcHRyKCksIGRhdGFfcHRy LCBtc2dfbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg IC8vIE5lZWQgdG8gd3JhcCBhcm91bmQKKyAgICAgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAg ICAgICAgc3RkOjpwdHI6OmNvcHlfbm9ub3ZlcmxhcHBpbmcobWVzc2FnZS5hc19wdHIoKSwgZGF0 YV9wdHIsIHJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgc3RkOjpwdHI6OmNvcHlfbm9ub3Zl cmxhcHBpbmcoCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXNfcHRyKCkuYWRkKHJlbWFp bmluZyksCisgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9kYXRhIGFzICptdXQgdTgsCisgICAg ICAgICAgICAgICAgICAgIG1zZ19sZW4gLSByZW1haW5pbmcsCisgICAgICAgICAgICAgICAgKTsK KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgd3Jp dGUgcG9pbnRlciAtIG1hdGNoZXMgbGlicWIncyBxYl9yYl9jaHVua19zdGVwIGxvZ2ljCisgICAg ICAgIGxldCBuZXdfd3JpdGVfcHQgPSBzZWxmLmNodW5rX3N0ZXAod3JpdGVfcHQsIG1zZ19sZW4p OworCisgICAgICAgIC8vIENvbW1pdDogd3JpdGUgc2l6ZSwgdXBkYXRlIHdyaXRlIHBvaW50ZXIs IHRoZW4gc2V0IG1hZ2ljIHdpdGggYXRvbWljIFJFTEVBU0UKKyAgICAgICAgLy8gVGhpcyBtYXRj aGVzIGxpYnFiJ3MgcWJfcmJfY2h1bmtfY29tbWl0IGJlaGF2aW9yIChyaW5nYnVmZmVyLmM6NDk3 LTUwNCkKKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIC8vIDEuIFdyaXRlIGNodW5rIHNp emUKKyAgICAgICAgICAgICpzaGFyZWRfZGF0YS5hZGQod3JpdGVfcHQgYXMgdXNpemUpID0gbXNn X2xlbiBhcyB1MzI7CisKKyAgICAgICAgICAgIC8vIDIuIFVwZGF0ZSB3cml0ZSBwb2ludGVyCisg ICAgICAgICAgICBzZWxmLndyaXRlX3B0LnN0b3JlKG5ld193cml0ZV9wdCwgT3JkZXJpbmc6OlJl bGF4ZWQpOworCisgICAgICAgICAgICAvLyAzLiBTZXQgbWFnaWMgd2l0aCBSRUxFQVNFCisgICAg ICAgICAgICAvLyBSRUxFQVNFIGVuc3VyZXMgYWxsIHByZXZpb3VzIHdyaXRlcyAoZGF0YSwgc2l6 ZSwgd3JpdGVfcHQpIGFyZSB2aXNpYmxlIGJlZm9yZSBtYWdpYworICAgICAgICAgICAgbGV0IG1h Z2ljX29mZnNldCA9ICh3cml0ZV9wdCBhcyB1c2l6ZSArIDEpICUgd29yZF9zaXplOworICAgICAg ICAgICAgbGV0IG1hZ2ljX3B0ciA9IHNoYXJlZF9kYXRhLmFkZChtYWdpY19vZmZzZXQpIGFzICpt dXQgQXRvbWljVTMyOworICAgICAgICAgICAgKCptYWdpY19wdHIpLnN0b3JlKFNlbGY6OkNIVU5L X01BR0lDLCBPcmRlcmluZzo6UmVsZWFzZSk7CisKKyAgICAgICAgICAgIC8vIDQuIFBvc3QgdG8g c2VtYXBob3JlIHRvIHdha2UgdXAgd2FpdGluZyByZWFkZXJzCisgICAgICAgICAgICBzZWxmLnBv c2l4X3NlbQorICAgICAgICAgICAgICAgIC5wb3N0KCkKKyAgICAgICAgICAgICAgICAuY29udGV4 dCgiRmFpbGVkIHRvIHBvc3QgdG8gc2VtYXBob3JlIik/OworICAgICAgICB9CisKKyAgICAgICAg dHJhY2luZzo6ZGVidWchKAorICAgICAgICAgICAgIldyb3RlIGNodW5rOiB7fSBieXRlcywgd3Jp dGVfcHQge30gLT4ge30iLAorICAgICAgICAgICAgbXNnX2xlbiwKKyAgICAgICAgICAgIHdyaXRl X3B0LAorICAgICAgICAgICAgbmV3X3dyaXRlX3B0CisgICAgICAgICk7CisKKyAgICAgICAgT2so KCkpCisgICAgfQorCisgICAgLy8vIFJlYWQgYSBjaHVuayBmcm9tIHRoZSByaW5nIGJ1ZmZlcgor ICAgIC8vLworICAgIC8vLyBUaGlzIHJlYWRzIHRoZSBjaHVuayBhdCB0aGUgY3VycmVudCByZWFk IHBvaW50ZXIsIHZhbGlkYXRlcyBpdCwKKyAgICAvLy8gY29waWVzIHRoZSBkYXRhLCBhbmQgcmVj bGFpbXMgdGhlIGNodW5rLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIE5vbmUgaWYgdGhlIGJ1 ZmZlciBpcyBlbXB0eSAocmVhZF9wdCA9PSB3cml0ZV9wdCkuCisgICAgLy8vCisgICAgLy8vICMg U2FmZXR5CisgICAgLy8vIENhbGxlciBtdXN0IGVuc3VyZToKKyAgICAvLy8gLSBzaGFyZWRfZGF0 YSBwb2ludHMgdG8gdmFsaWQgcmluZyBidWZmZXIgZGF0YQorICAgIC8vLyAtIGZsb3dfY29udHJv bF9wdHIgKGlmIFNvbWUpIHBvaW50cyB0byB2YWxpZCBpMzIKKyAgICAvLy8gLSBObyBvdGhlciB0 aHJlYWQgaXMgcmVhZGluZyBjb25jdXJyZW50bHkKKyAgICB1bnNhZmUgZm4gcmVhZF9jaHVuaygK KyAgICAgICAgJnNlbGYsCisgICAgICAgIHNoYXJlZF9kYXRhOiAqbXV0IHUzMiwKKyAgICAgICAg Zmxvd19jb250cm9sX3B0cjogT3B0aW9uPCptdXQgaTMyPiwKKyAgICApIC0+IFJlc3VsdDxPcHRp b248VmVjPHU4Pj4+IHsKKyAgICAgICAgbGV0IHdvcmRfc2l6ZSA9IHNlbGYud29yZF9zaXplIGFz IHVzaXplOworCisgICAgICAgIC8vIEdldCBjdXJyZW50IHJlYWQgcG9pbnRlcgorICAgICAgICBs ZXQgcmVhZF9wdCA9IHNlbGYucmVhZF9wdC5sb2FkKE9yZGVyaW5nOjpBY3F1aXJlKTsKKyAgICAg ICAgbGV0IHdyaXRlX3B0ID0gc2VsZi53cml0ZV9wdC5sb2FkKE9yZGVyaW5nOjpBY3F1aXJlKTsK KworICAgICAgICAvLyBDaGVjayBpZiBidWZmZXIgaXMgZW1wdHkKKyAgICAgICAgaWYgcmVhZF9w dCA9PSB3cml0ZV9wdCB7CisgICAgICAgICAgICByZXR1cm4gT2soTm9uZSk7CisgICAgICAgIH0K KworICAgICAgICAvLyBSZWFkIGNodW5rIGhlYWRlciB3aXRoIEFDUVVJUkUgdG8gc2VlIGFsbCB3 cml0ZXMKKyAgICAgICAgbGV0IG1hZ2ljX29mZnNldCA9IChyZWFkX3B0IGFzIHVzaXplICsgMSkg JSB3b3JkX3NpemU7CisgICAgICAgIGxldCBtYWdpY19wdHIgPSB1bnNhZmUgeyBzaGFyZWRfZGF0 YS5hZGQobWFnaWNfb2Zmc2V0KSBhcyAqY29uc3QgQXRvbWljVTMyIH07CisgICAgICAgIGxldCBj aHVua19tYWdpYyA9IHVuc2FmZSB7ICgqbWFnaWNfcHRyKS5sb2FkKE9yZGVyaW5nOjpBY3F1aXJl KSB9OworCisgICAgICAgIC8vIFJlYWQgY2h1bmsgc2l6ZQorICAgICAgICBsZXQgY2h1bmtfc2l6 ZSA9IHVuc2FmZSB7ICpzaGFyZWRfZGF0YS5hZGQocmVhZF9wdCBhcyB1c2l6ZSkgfTsKKworICAg ICAgICB0cmFjaW5nOjpkZWJ1ZyEoCisgICAgICAgICAgICAiUmVhZGluZyBjaHVuazogcmVhZF9w dD17fSwgd3JpdGVfcHQ9e30sIHNpemU9e30sIG1hZ2ljPTB4ezowOHh9IiwKKyAgICAgICAgICAg IHJlYWRfcHQsCisgICAgICAgICAgICB3cml0ZV9wdCwKKyAgICAgICAgICAgIGNodW5rX3NpemUs CisgICAgICAgICAgICBjaHVua19tYWdpYworICAgICAgICApOworCisgICAgICAgIC8vIFZlcmlm eSBtYWdpYworICAgICAgICBpZiBjaHVua19tYWdpYyAhPSBTZWxmOjpDSFVOS19NQUdJQyB7Cisg ICAgICAgICAgICBhbnlob3c6OmJhaWwhKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIGNodW5r IG1hZ2ljIGF0IHJlYWRfcHQ9e306IGV4cGVjdGVkIDB4ezowOHh9LCBnb3QgMHh7OjA4eH0iLAor ICAgICAgICAgICAgICAgIHJlYWRfcHQsCisgICAgICAgICAgICAgICAgU2VsZjo6Q0hVTktfTUFH SUMsCisgICAgICAgICAgICAgICAgY2h1bmtfbWFnaWMKKyAgICAgICAgICAgICk7CisgICAgICAg IH0KKworICAgICAgICAvLyBSZWFkIG1lc3NhZ2UgZGF0YQorICAgICAgICBsZXQgZGF0YV9vZmZz ZXQgPSAocmVhZF9wdCBhcyB1c2l6ZSArIFNlbGY6OkNIVU5LX0hFQURFUl9XT1JEUykgJSB3b3Jk X3NpemU7CisgICAgICAgIGxldCBkYXRhX3B0ciA9IHVuc2FmZSB7IHNoYXJlZF9kYXRhLmFkZChk YXRhX29mZnNldCkgYXMgKmNvbnN0IHU4IH07CisKKyAgICAgICAgbGV0IG11dCBtZXNzYWdlID0g dmVjIVswdTg7IGNodW5rX3NpemUgYXMgdXNpemVdOworCisgICAgICAgIC8vIEhhbmRsZSB3cmFw YXJvdW5kIC0gY2FsY3VsYXRlIHJlbWFpbmluZyBieXRlcyBpbiBidWZmZXIgYmVmb3JlIHdyYXBh cm91bmQKKyAgICAgICAgbGV0IHJlbWFpbmluZyA9ICh3b3JkX3NpemUgLSBkYXRhX29mZnNldCkg KiBzdGQ6Om1lbTo6c2l6ZV9vZjo6PHUzMj4oKTsKKyAgICAgICAgaWYgY2h1bmtfc2l6ZSBhcyB1 c2l6ZSA8PSByZW1haW5pbmcgeworICAgICAgICAgICAgLy8gTm8gd3JhcGFyb3VuZAorICAgICAg ICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnB0cjo6Y29weV9ub25vdmVybGFw cGluZyhkYXRhX3B0ciwgbWVzc2FnZS5hc19tdXRfcHRyKCksIGNodW5rX3NpemUgYXMgdXNpemUp OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV3JhcGFy b3VuZAorICAgICAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnB0cjo6Y29w eV9ub25vdmVybGFwcGluZyhkYXRhX3B0ciwgbWVzc2FnZS5hc19tdXRfcHRyKCksIHJlbWFpbmlu Zyk7CisgICAgICAgICAgICAgICAgc3RkOjpwdHI6OmNvcHlfbm9ub3ZlcmxhcHBpbmcoCisgICAg ICAgICAgICAgICAgICAgIHNoYXJlZF9kYXRhIGFzICpjb25zdCB1OCwKKyAgICAgICAgICAgICAg ICAgICAgbWVzc2FnZS5hc19tdXRfcHRyKCkuYWRkKHJlbWFpbmluZyksCisgICAgICAgICAgICAg ICAgICAgIGNodW5rX3NpemUgYXMgdXNpemUgLSByZW1haW5pbmcsCisgICAgICAgICAgICAgICAg KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY2xhaW0gY2h1bms6 IGNsZWFyIGhlYWRlciBhbmQgdXBkYXRlIHJlYWQgcG9pbnRlcgorICAgICAgICBsZXQgbmV3X3Jl YWRfcHQgPSBzZWxmLmNodW5rX3N0ZXAocmVhZF9wdCwgY2h1bmtfc2l6ZSBhcyB1c2l6ZSk7CisK KyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIC8vIENsZWFyIGNodW5rIHNpemUKKyAgICAg ICAgICAgICpzaGFyZWRfZGF0YS5hZGQocmVhZF9wdCBhcyB1c2l6ZSkgPSAwOworCisgICAgICAg ICAgICAvLyBTZXQgbWFnaWMgdG8gREVBRCB3aXRoIFJFTEVBU0UKKyAgICAgICAgICAgIGxldCBt YWdpY19wdHIgPSBzaGFyZWRfZGF0YS5hZGQobWFnaWNfb2Zmc2V0KSBhcyAqbXV0IEF0b21pY1Uz MjsKKyAgICAgICAgICAgICgqbWFnaWNfcHRyKS5zdG9yZShTZWxmOjpDSFVOS19NQUdJQ19ERUFE LCBPcmRlcmluZzo6UmVsZWFzZSk7CisKKyAgICAgICAgICAgIC8vIFVwZGF0ZSByZWFkX3B0Cisg ICAgICAgICAgICBzZWxmLnJlYWRfcHQuc3RvcmUobmV3X3JlYWRfcHQsIE9yZGVyaW5nOjpSZWxh eGVkKTsKKworICAgICAgICAgICAgLy8gU2lnbmFsIGZsb3cgY29udHJvbCAtIHNlcnZlciBpcyBy ZWFkeSBmb3IgbmV4dCByZXF1ZXN0CisgICAgICAgICAgICBpZiBsZXQgU29tZShmY19wdHIpID0g Zmxvd19jb250cm9sX3B0ciB7CisgICAgICAgICAgICAgICAgbGV0IHJlZmNvdW50ID0gc2VsZi5y ZWZfY291bnQubG9hZChPcmRlcmluZzo6QWNxdWlyZSk7CisgICAgICAgICAgICAgICAgaWYgcmVm Y291bnQgPT0gMiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBmY19hdG9taWMgPSBmY19wdHIg YXMgKm11dCBBdG9taWNJMzI7CisgICAgICAgICAgICAgICAgICAgICgqZmNfYXRvbWljKS5zdG9y ZSgwLCBPcmRlcmluZzo6UmVsYXhlZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg fQorICAgICAgICB9CisKKyAgICAgICAgT2soU29tZShtZXNzYWdlKSkKKyAgICB9Cit9CisKKy8v LyBGbG93IGNvbnRyb2wgbWVjaGFuaXNtIGZvciByaW5nIGJ1ZmZlciBiYWNrcHJlc3N1cmUKKy8v LworLy8vIEltcGxlbWVudHMgbGlicWIncyBmbG93IGNvbnRyb2wgcHJvdG9jb2wgZm9yIElQQyBj b21tdW5pY2F0aW9uLgorLy8vIFRoZSBzZXJ2ZXIgd3JpdGVzIGZsb3cgY29udHJvbCB2YWx1ZXMg dG8gc2hhcmVkIG1lbW9yeSwgYW5kIGNsaWVudHMKKy8vLyByZWFkIHRoZXNlIHZhbHVlcyB0byBk ZXRlcm1pbmUgaWYgdGhleSBzaG91bGQgYmFjayBvZmYuCisvLy8KKy8vLyBGbG93IGNvbnRyb2wg dmFsdWVzIChtYXRjaGluZyBsaWJxYidzIHJhdGUgbGltaXRpbmcpOgorLy8vIC0gYE9LYDogUHJv Y2VlZCB3aXRoIHNlbmRpbmcgKFFCX0lQQ1NfUkFURV9OT1JNQUwpCisvLy8gLSBgU0xPV19ET1dO YDogQXBwcm9hY2hpbmcgY2FwYWNpdHksIHJlZHVjZSBzZW5kIHJhdGUgKFFCX0lQQ1NfUkFURV9P RkYpCisvLy8gLSBgU1RPUGA6IFF1ZXVlIGZ1bGwsIGRvIG5vdCBzZW5kIChRQl9JUENTX1JBVEVf T0ZGXzIpCisvLy8KKy8vLyAjIyBEaXNhYmxlZCBGbG93IENvbnRyb2wKKy8vLworLy8vIFdoZW4g Y29uc3RydWN0ZWQgd2l0aCBhIG51bGwgZmNfcHRyLCBmbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQg YW5kIGFsbAorLy8vIG9wZXJhdGlvbnMgYmVjb21lIG5vLW9wcy4gVGhpcyBtYXRjaGVzIGxpYnFi J3MgYmVoYXZpb3IgZm9yIHJlc3BvbnNlL2V2ZW50CisvLy8gcmluZ3Mgd2hpY2ggZG9uJ3QgbmVl ZCBiYWNrcHJlc3N1cmUgc2lnbmFsaW5nLgorLy8vCisvLy8gTWF0Y2hlcyBsaWJxYidzIHFiX2lw Y19zaG1fZmNfZ2V0L3FiX2lwY19zaG1fZmNfc2V0IChpcGNfc2htLmM6MTc2LTE5NSkKK3B1YiBz dHJ1Y3QgRmxvd0NvbnRyb2wgeworICAgIC8vLyBQb2ludGVyIHRvIGZsb3cgY29udHJvbCBmaWVs ZCBpbiBzaGFyZWQgbWVtb3J5IChpMzIgYXRvbWljKQorICAgIC8vLyBMb2NhdGVkIGluIHNoYXJl ZF91c2VyX2RhdGEgYXJlYSBvZiBSaW5nQnVmZmVyU2hhcmVkCisgICAgLy8vIElmIG51bGwsIGZs b3cgY29udHJvbCBpcyBkaXNhYmxlZCAobm8tb3AgbW9kZSkKKyAgICBmY19wdHI6ICptdXQgaTMy LAorICAgIC8vLyBQb2ludGVyIHRvIHNoYXJlZCBoZWFkZXIgZm9yIHJlZmNvdW50IGNoZWNrcwor ICAgIC8vLyBJZiBudWxsLCBmbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQgKG5vLW9wIG1vZGUpCisg ICAgc2hhcmVkX2hkcjogKm11dCBSaW5nQnVmZmVyU2hhcmVkLAorfQorCitpbXBsIEZsb3dDb250 cm9sIHsKKyAgICAvLy8gT0sgdG8gc2VuZCAtIHF1ZXVlIGhhcyBzcGFjZSAoUUJfSVBDU19SQVRF X05PUk1BTCkKKyAgICBwdWIgY29uc3QgT0s6IGkzMiA9IDA7CisKKyAgICAvLy8gU2xvdyBkb3du IC0gcXVldWUgYXBwcm9hY2hpbmcgZnVsbCAoUUJfSVBDU19SQVRFX09GRikKKyAgICBwdWIgY29u c3QgU0xPV19ET1dOOiBpMzIgPSAxOworCisgICAgLy8vIFN0b3Agc2VuZGluZyAtIHF1ZXVlIGZ1 bGwgKFFCX0lQQ1NfUkFURV9PRkZfMikKKyAgICBwdWIgY29uc3QgU1RPUDogaTMyID0gMjsKKwor ICAgIC8vLyBDcmVhdGUgYSBuZXcgRmxvd0NvbnRyb2wgaW5zdGFuY2UKKyAgICAvLy8KKyAgICAv Ly8gUGFzcyBudWxsIHBvaW50ZXJzIHRvIGNyZWF0ZSBhIGRpc2FibGVkIChuby1vcCkgZmxvdyBj b250cm9sIGluc3RhbmNlLgorICAgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIHJlc3BvbnNlL2V2ZW50 IHJpbmdzIHRoYXQgZG9uJ3QgbmVlZCBiYWNrcHJlc3N1cmUuCisgICAgLy8vCisgICAgLy8vICMg U2FmZXR5CisgICAgLy8vIC0gSWYgZmNfcHRyIGlzIG5vbi1udWxsLCBpdCBtdXN0IHBvaW50IHRv IHZhbGlkIHNoYXJlZCBtZW1vcnkgZm9yIGFuIGkzMgorICAgIC8vLyAtIElmIHNoYXJlZF9oZHIg aXMgbm9uLW51bGwsIGl0IG11c3QgcG9pbnQgdG8gdmFsaWQgUmluZ0J1ZmZlclNoYXJlZAorICAg IC8vLyAtIEJvdGggbXVzdCByZW1haW4gdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiBGbG93Q29u dHJvbCAoaWYgbm9uLW51bGwpCisgICAgdW5zYWZlIGZuIG5ldyhmY19wdHI6ICptdXQgaTMyLCBz aGFyZWRfaGRyOiAqbXV0IFJpbmdCdWZmZXJTaGFyZWQpIC0+IFNlbGYgeworICAgICAgICAvLyBJ bml0aWFsaXplIHRvIDAgaWYgZW5hYmxlZCAtIHNlcnZlciBpcyByZWFkeSBmb3IgcmVxdWVzdHMK KyAgICAgICAgLy8gbGlicWIgY2xpZW50cyBjaGVjazogaWYgKGZjID4gMCAmJiBmYyA8PSBmY19l bmFibGVfbWF4KSByZXR1cm4gRUFHQUlOCisgICAgICAgIC8vIFNvIDAgbWVhbnMgInJlYWR5IHRv IHRyYW5zbWl0IiwgPiAwIG1lYW5zICJmbG93IGNvbnRyb2wgYWN0aXZlL2Jsb2NrZWQiCisgICAg ICAgIGlmICFmY19wdHIuaXNfbnVsbCgpIHsKKyAgICAgICAgICAgIGxldCBmY19hdG9taWMgPSBm Y19wdHIgYXMgKm11dCBBdG9taWNJMzI7CisgICAgICAgICAgICB1bnNhZmUgeworICAgICAgICAg ICAgICAgICgqZmNfYXRvbWljKS5zdG9yZSgwLCBPcmRlcmluZzo6UmVsYXhlZCk7CisgICAgICAg ICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTZWxmIHsgZmNfcHRyLCBzaGFyZWRfaGRyIH0K KyAgICB9CisKKyAgICAvLy8gQ2hlY2sgaWYgZmxvdyBjb250cm9sIGlzIGVuYWJsZWQKKyAgICAj W2lubGluZV0KKyAgICBmbiBpc19lbmFibGVkKCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgIXNl bGYuZmNfcHRyLmlzX251bGwoKQorICAgIH0KKworICAgIC8vLyBHZXQgdGhlIHJhdyBmbG93IGNv bnRyb2wgcG9pbnRlciAoZm9yIGludGVybmFsIHVzZSkKKyAgICAjW2lubGluZV0KKyAgICBmbiBm Y19wdHIoJnNlbGYpIC0+ICptdXQgaTMyIHsKKyAgICAgICAgc2VsZi5mY19wdHIKKyAgICB9CisK KyAgICAvLy8gR2V0IGZsb3cgY29udHJvbCB2YWx1ZQorICAgIC8vLworICAgIC8vLyBNYXRjaGVz IGxpYnFiJ3MgcWJfaXBjX3NobV9mY19nZXQgKGlwY19zaG0uYzoxODUtMTk1KS4KKyAgICAvLy8g UmV0dXJuczoKKyAgICAvLy8gLSAwOiBSZWFkeSBmb3IgcmVxdWVzdHMgKG9yIGZsb3cgY29udHJv bCBkaXNhYmxlZCkKKyAgICAvLy8gLSA+MDogRmxvdyBjb250cm9sIGFjdGl2ZSAoY2xpZW50IHNo b3VsZCByZXRyeSkKKyAgICAvLy8gLSA8MDogRXJyb3IgKG5vdCBjb25uZWN0ZWQpCisgICAgLy8v CisgICAgLy8vIE5vdGU6IFRoaXMgbWV0aG9kIGlzIHByaW1hcmlseSBmb3IgbGlicWIgY2xpZW50 cywgbm90IHVzZWQgaW50ZXJuYWxseSBieSBzZXJ2ZXIKKyAgICAjW2FsbG93KGRlYWRfY29kZSld CisgICAgcHViIGZuIGdldCgmc2VsZikgLT4gaTMyIHsKKyAgICAgICAgaWYgIXNlbGYuaXNfZW5h YmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAvLyBEaXNhYmxlZCA9IGFsd2F5cyByZWFk eQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgYm90aCBjbGllbnQgYW5kIHNlcnZl ciBhcmUgY29ubmVjdGVkIChyZWZjb3VudCA9PSAyKQorICAgICAgICBsZXQgcmVmY291bnQgPSB1 bnNhZmUgeyAoKnNlbGYuc2hhcmVkX2hkcikucmVmX2NvdW50LmxvYWQoT3JkZXJpbmc6OkFjcXVp cmUpIH07CisgICAgICAgIGlmIHJlZmNvdW50ICE9IDIgeworICAgICAgICAgICAgcmV0dXJuIC1s aWJjOjpFTk9UQ09OTjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlYWQgZmxvdyBjb250cm9s IHZhbHVlIGF0b21pY2FsbHkKKyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIGxldCBmY19h dG9taWMgPSBzZWxmLmZjX3B0ciBhcyAqY29uc3QgQXRvbWljSTMyOworICAgICAgICAgICAgKCpm Y19hdG9taWMpLmxvYWQoT3JkZXJpbmc6OlJlbGF4ZWQpCisgICAgICAgIH0KKyAgICB9CisKKyAg ICAvLy8gU2V0IGZsb3cgY29udHJvbCB2YWx1ZQorICAgIC8vLworICAgIC8vLyBNYXRjaGVzIGxp YnFiJ3MgcWJfaXBjX3NobV9mY19zZXQgKGlwY19zaG0uYzoxNzYtMTgyKS4KKyAgICAvLy8gLSBm Y19lbmFibGUgPSAwOiBSZWFkeSBmb3IgcmVxdWVzdHMKKyAgICAvLy8gLSBmY19lbmFibGUgPiAw OiBGbG93IGNvbnRyb2wgYWN0aXZlIChiYWNrcHJlc3N1cmUpCisgICAgLy8vCisgICAgLy8vIE5v LW9wIGlmIGZsb3cgY29udHJvbCBpcyBkaXNhYmxlZC4KKyAgICBwdWIgZm4gc2V0KCZzZWxmLCBm Y19lbmFibGU6IGkzMikgeworICAgICAgICBpZiAhc2VsZi5pc19lbmFibGVkKCkgeworICAgICAg ICAgICAgcmV0dXJuOyAvLyBEaXNhYmxlZCA9IG5vLW9wCisgICAgICAgIH0KKworICAgICAgICB0 cmFjaW5nOjp0cmFjZSEoIlNldHRpbmcgZmxvdyBjb250cm9sIHRvIHt9IiwgZmNfZW5hYmxlKTsK KyAgICAgICAgdW5zYWZlIHsKKyAgICAgICAgICAgIGxldCBmY19hdG9taWMgPSBzZWxmLmZjX3B0 ciBhcyAqbXV0IEF0b21pY0kzMjsKKyAgICAgICAgICAgICgqZmNfYXRvbWljKS5zdG9yZShmY19l bmFibGUsIE9yZGVyaW5nOjpSZWxheGVkKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gU2Fm ZXR5OiBGbG93Q29udHJvbCB1c2VzIGF0b21pYyBvcGVyYXRpb25zIGZvciBzeW5jaHJvbml6YXRp b24KK3Vuc2FmZSBpbXBsIFNlbmQgZm9yIEZsb3dDb250cm9sIHt9Cit1bnNhZmUgaW1wbCBTeW5j IGZvciBGbG93Q29udHJvbCB7fQorCisvLy8gUmluZyBidWZmZXIgaGFuZGxlCisvLy8KKy8vLyBP d25zIHRoZSBtbWFwJ2QgbWVtb3J5IHJlZ2lvbnMgYW5kIHByb3ZpZGVzIGFzeW5jIG1lc3NhZ2Ut cGFzc2luZyBBUEkuCitwdWIgc3RydWN0IFJpbmdCdWZmZXIgeworICAgIC8vLyBNbWFwIG9mIHNo YXJlZCBoZWFkZXIKKyAgICBfbW1hcF9oZHI6IE1tYXBNdXQsCisgICAgLy8vIENpcmN1bGFyIG1t YXAgb2Ygc2hhcmVkIGRhdGEgKDJ4IHZpcnR1YWwgbWFwcGluZykKKyAgICBfbW1hcF9kYXRhOiBD aXJjdWxhck1tYXAsCisgICAgLy8vIFBvaW50ZXIgdG8gc2hhcmVkIGhlYWRlciAoaW5zaWRlIF9t bWFwX2hkcikKKyAgICBzaGFyZWRfaGRyOiAqbXV0IFJpbmdCdWZmZXJTaGFyZWQsCisgICAgLy8v IFBvaW50ZXIgdG8gc2hhcmVkIGRhdGEgYXJyYXkgKGluc2lkZSBfbW1hcF9kYXRhKQorICAgIHNo YXJlZF9kYXRhOiAqbXV0IHUzMiwKKyAgICAvLy8gRmxvdyBjb250cm9sIG1lY2hhbmlzbQorICAg IC8vLyBBbHdheXMgcHJlc2VudCwgYnV0IG1heSBiZSBkaXNhYmxlZCAobm8tb3ApIGZvciByZXNw b25zZS9ldmVudCByaW5ncworICAgIHB1YiBmbG93X2NvbnRyb2w6IEZsb3dDb250cm9sLAorICAg IC8vLyBOb3RpZmllciBmb3Igd2hlbiBkYXRhIGJlY29tZXMgYXZhaWxhYmxlIChmb3IgY29uc3Vt ZXJzKQorICAgIGRhdGFfYXZhaWxhYmxlOiBBcmM8Tm90aWZ5PiwKKyAgICAvLy8gTm90aWZpZXIg Zm9yIHdoZW4gc3BhY2UgYmVjb21lcyBhdmFpbGFibGUgKGZvciBwcm9kdWNlcnMpCisgICAgc3Bh Y2VfYXZhaWxhYmxlOiBBcmM8Tm90aWZ5PiwKKyAgICAvLy8gV2hldGhlciB0aGlzIGluc3RhbmNl IGNyZWF0ZWQgdGhlIHJpbmcgYnVmZmVyIChhbmQgdGh1cyBvd25zIGNsZWFudXApCisgICAgLy8v IE1hdGNoZXMgbGlicWIncyBRQl9SQl9GTEFHX0NSRUFURSBmbGFnCisgICAgaXNfY3JlYXRvcjog Ym9vbCwKK30KKworLy8gU2FmZXR5OiBSaW5nQnVmZmVyIHVzZXMgYXRvbWljIG9wZXJhdGlvbnMg Zm9yIHN5bmNocm9uaXphdGlvbgordW5zYWZlIGltcGwgU2VuZCBmb3IgUmluZ0J1ZmZlciB7fQor dW5zYWZlIGltcGwgU3luYyBmb3IgUmluZ0J1ZmZlciB7fQorCitpbXBsIFJpbmdCdWZmZXIgewor ICAgIC8vLyBDaHVuayBtYXJnaW4gZm9yIHNwYWNlIGNhbGN1bGF0aW9ucyAoaW4gYnl0ZXMpCisg ICAgLy8vIE1hdGNoZXMgbGlicWI6IHNpemVvZih1aW50MzJfdCkgKiAoQ0hVTktfSEVBREVSX1dP UkRTICsgV09SRF9BTElHTiArIENBQ0hFX0xJTkVfV09SRFMpCisgICAgLy8vIFdlIGRvbid0IHVz ZSBjYWNoZSBsaW5lIGFsaWdubWVudCwgc28gQ0FDSEVfTElORV9XT1JEUyA9IDAKKyAgICBjb25z dCBDSFVOS19NQVJHSU46IHVzaXplID0gNCAqIChSaW5nQnVmZmVyU2hhcmVkOjpDSFVOS19IRUFE RVJfV09SRFMgKyAxKTsKKworICAgIC8vLyBDcmVhdGUgYSBuZXcgcmluZyBidWZmZXIgaW4gc2hh cmVkIG1lbW9yeQorICAgIC8vLworICAgIC8vLyBDcmVhdGVzIHR3byBmaWxlcyBpbiBgL2Rldi9z aG1gOgorICAgIC8vLyAtIGB7YmFzZV9kaXJ9L3FiLXtuYW1lfS1oZWFkZXJgCisgICAgLy8vIC0g YHtiYXNlX2Rpcn0vcWIte25hbWV9LWRhdGFgCisgICAgLy8vCisgICAgLy8vICMgQXJndW1lbnRz CisgICAgLy8vIC0gYGJhc2VfZGlyYDogRGlyZWN0b3J5IGZvciBzaGFyZWQgbWVtb3J5IGZpbGVz ICh0eXBpY2FsbHkgIi9kZXYvc2htIikKKyAgICAvLy8gLSBgbmFtZWA6IFJpbmcgYnVmZmVyIG5h bWUKKyAgICAvLy8gLSBgc2l6ZV9ieXRlc2A6IFNpemUgb2YgcmluZyBidWZmZXIgZGF0YSBpbiBi eXRlcworICAgIC8vLyAtIGBzaGFyZWRfdXNlcl9kYXRhX3NpemVgOiBFeHRyYSBieXRlcyB0byBh bGxvY2F0ZSBhZnRlciBSaW5nQnVmZmVyU2hhcmVkIGZvciBmbG93IGNvbnRyb2wKKyAgICAvLy8K KyAgICAvLy8gVGhlIGhlYWRlciBmaWxlIHNpemUgd2lsbCBiZTogc2l6ZW9mKFJpbmdCdWZmZXJT aGFyZWQpICsgc2hhcmVkX3VzZXJfZGF0YV9zaXplCisgICAgLy8vIFRoaXMgbWF0Y2hlcyBsaWJx YidzIGJlaGF2aW9yOiBzaXplb2YocWJfcmluZ2J1ZmZlcl9zaGFyZWRfcykgKyBzaGFyZWRfdXNl cl9kYXRhX3NpemUKKyAgICBwdWIgZm4gbmV3KAorICAgICAgICBiYXNlX2RpcjogaW1wbCBBc1Jl ZjxQYXRoPiwKKyAgICAgICAgbmFtZTogJnN0ciwKKyAgICAgICAgc2l6ZV9ieXRlczogdXNpemUs CisgICAgICAgIHNoYXJlZF91c2VyX2RhdGFfc2l6ZTogdXNpemUsCisgICAgKSAtPiBSZXN1bHQ8 U2VsZj4geworICAgICAgICBsZXQgYmFzZV9kaXIgPSBiYXNlX2Rpci5hc19yZWYoKTsKKworICAg ICAgICAvLyBNYXRjaCBsaWJxYidzIHNpemUgY2FsY3VsYXRpb24gZXhhY3RseToKKyAgICAgICAg Ly8gMS4gQWRkIENIVU5LX01BUkdJTiArIDEgKDEzIGJ5dGVzKQorICAgICAgICAvLyAgICBDSFVO S19NQVJHSU4gPSBzaXplb2YodWludDMyX3QpICogKENIVU5LX0hFQURFUl9XT1JEUyArIFdPUkRf QUxJR04gKyBDQUNIRV9MSU5FX1dPUkRTKQorICAgICAgICAvLyAgICA9IDQgKiAoMiArIDEgKyAw KSA9IDEyIGJ5dGVzICh3aXRob3V0IGNhY2hlIGxpbmUgYWxpZ25tZW50KQorICAgICAgICBsZXQg c2l6ZSA9IHNpemVfYnl0ZXMgKyBTZWxmOjpDSFVOS19NQVJHSU4gKyAxOworCisgICAgICAgIC8v IDIuIFJvdW5kIHVwIHRvIHBhZ2Ugc2l6ZSAodHlwaWNhbGx5IDQwOTYpCisgICAgICAgIGxldCBw YWdlX3NpemUgPSA0MDk2OyAvLyBTdGFuZGFyZCBwYWdlIHNpemUgb24gTGludXgKKyAgICAgICAg bGV0IHJlYWxfc2l6ZSA9IHNpemUuZGl2X2NlaWwocGFnZV9zaXplKSAqIHBhZ2Vfc2l6ZTsKKwor ICAgICAgICAvLyAzLiBDYWxjdWxhdGUgd29yZF9zaXplIGZyb20gcm91bmRlZCBzaXplCisgICAg ICAgIGxldCB3b3JkX3NpemUgPSByZWFsX3NpemUgLyA0OworCisgICAgICAgIHRyYWNpbmc6Omlu Zm8hKAorICAgICAgICAgICAgIkNyZWF0aW5nIHJpbmcgYnVmZmVyICd7fSc6IHNpemVfYnl0ZXM9 e30sIHJlYWxfc2l6ZT17fSwgd29yZF9zaXplPXt9ICh7fXdvcmRzID0ge30gYnl0ZXMpIiwKKyAg ICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICBzaXplX2J5dGVzLAorICAgICAgICAgICAgcmVh bF9zaXplLAorICAgICAgICAgICAgd29yZF9zaXplLAorICAgICAgICAgICAgd29yZF9zaXplLAor ICAgICAgICAgICAgcmVhbF9zaXplCisgICAgICAgICk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGhl YWRlciBmaWxlCisgICAgICAgIGxldCBoZHJfZmlsZW5hbWUgPSBmb3JtYXQhKCJxYi17bmFtZX0t aGVhZGVyIik7CisgICAgICAgIGxldCBoZHJfcGF0aCA9IGJhc2VfZGlyLmpvaW4oJmhkcl9maWxl bmFtZSk7CisKKyAgICAgICAgbGV0IGhkcl9maWxlID0gT3Blbk9wdGlvbnM6Om5ldygpCisgICAg ICAgICAgICAucmVhZCh0cnVlKQorICAgICAgICAgICAgLndyaXRlKHRydWUpCisgICAgICAgICAg ICAuY3JlYXRlKHRydWUpCisgICAgICAgICAgICAudHJ1bmNhdGUodHJ1ZSkKKyAgICAgICAgICAg IC5vcGVuKCZoZHJfcGF0aCkKKyAgICAgICAgICAgIC5jb250ZXh0KCJGYWlsZWQgdG8gY3JlYXRl IGhlYWRlciBmaWxlIik/OworCisgICAgICAgIC8vIFJlc2l6ZSB0byBmaXQgUmluZ0J1ZmZlclNo YXJlZCBzdHJ1Y3R1cmUgKyBzaGFyZWRfdXNlcl9kYXRhCisgICAgICAgIC8vIFRoaXMgbWF0Y2hl cyBsaWJxYjogc2l6ZW9mKHFiX3JpbmdidWZmZXJfc2hhcmVkX3MpICsgc2hhcmVkX3VzZXJfZGF0 YV9zaXplCisgICAgICAgIGxldCBoZHJfc2l6ZSA9IHN0ZDo6bWVtOjpzaXplX29mOjo8UmluZ0J1 ZmZlclNoYXJlZD4oKSArIHNoYXJlZF91c2VyX2RhdGFfc2l6ZTsKKyAgICAgICAgaGRyX2ZpbGUK KyAgICAgICAgICAgIC5zZXRfbGVuKGhkcl9zaXplIGFzIHU2NCkKKyAgICAgICAgICAgIC5jb250 ZXh0KCJGYWlsZWQgdG8gcmVzaXplIGhlYWRlciBmaWxlIik/OworCisgICAgICAgIC8vIE1tYXAg aGVhZGVyCisgICAgICAgIGxldCBtdXQgbW1hcF9oZHIgPQorICAgICAgICAgICAgdW5zYWZlIHsg TW1hcE11dDo6bWFwX211dCgmaGRyX2ZpbGUpIH0uY29udGV4dCgiRmFpbGVkIHRvIG1tYXAgaGVh ZGVyIik/OworCisgICAgICAgIC8vIENyZWF0ZSBkYXRhIGZpbGUgcGF0aCAobmVlZGVkIGZvciBp bml0X2luX3BsYWNlKQorICAgICAgICBsZXQgZGF0YV9maWxlbmFtZSA9IGZvcm1hdCEoInFiLXtu YW1lfS1kYXRhIik7CisgICAgICAgIGxldCBkYXRhX3BhdGggPSBiYXNlX2Rpci5qb2luKCZkYXRh X2ZpbGVuYW1lKTsKKworICAgICAgICAvLyBJbml0aWFsaXplIHNoYXJlZCBoZWFkZXIKKyAgICAg ICAgbGV0IHNoYXJlZF9oZHIgPSBtbWFwX2hkci5hc19tdXRfcHRyKCkgYXMgKm11dCBSaW5nQnVm ZmVyU2hhcmVkOworCisgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAgICAoKnNoYXJlZF9oZHIp LmluaXRfaW5fcGxhY2Uod29yZF9zaXplIGFzIHUzMiwgJmhkcl9wYXRoLCAmZGF0YV9wYXRoKT87 CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgZGF0YSBmaWxlCisgICAgICAgIGxldCBk YXRhX2ZpbGUgPSBPcGVuT3B0aW9uczo6bmV3KCkKKyAgICAgICAgICAgIC5yZWFkKHRydWUpCisg ICAgICAgICAgICAud3JpdGUodHJ1ZSkKKyAgICAgICAgICAgIC5jcmVhdGUodHJ1ZSkKKyAgICAg ICAgICAgIC50cnVuY2F0ZSh0cnVlKQorICAgICAgICAgICAgLm9wZW4oJmRhdGFfcGF0aCkKKyAg ICAgICAgICAgIC5jb250ZXh0KCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgZmlsZSIpPzsKKworICAg ICAgICAvLyBDcmVhdGUgZGF0YSBmaWxlIHdpdGggcmVhbF9zaXplIChOT1QgMnggcmVhbF9zaXpl ISkKKyAgICAgICAgLy8gbGlicWIgY3JlYXRlcyB0aGUgZmlsZSB3aXRoIHJlYWxfc2l6ZSwgdGhl biB1c2VzIGNpcmN1bGFyIG1tYXAgdG8gbWFwIGl0IFRXSUNFCisgICAgICAgIC8vIGluIGNvbnNl Y3V0aXZlIHZpcnR1YWwgYWRkcmVzcyBzcGFjZS4gVGhlIGZpbGUgaXRzZWxmIGlzIG9ubHkgcmVh bF9zaXplIGJ5dGVzLgorICAgICAgICAvLyBEdXJpbmcgY2xlYW51cCwgbGlicWIgdW5tYXBzIDIq cmVhbF9zaXplIGJ5dGVzICh0aGUgY2lyY3VsYXIgbW1hcCksIGJ1dCB0aGUKKyAgICAgICAgLy8g ZmlsZSBpdHNlbGYgcmVtYWlucyByZWFsX3NpemUgYnl0ZXMuCisgICAgICAgIGRhdGFfZmlsZQor ICAgICAgICAgICAgLnNldF9sZW4ocmVhbF9zaXplIGFzIHU2NCkKKyAgICAgICAgICAgIC5jb250 ZXh0KCJGYWlsZWQgdG8gcmVzaXplIGRhdGEgZmlsZSIpPzsKKworICAgICAgICAvLyBDcmVhdGUg Y2lyY3VsYXIgbW1hcCAtIG1hcHMgdGhlIGZpbGUgVFdJQ0UgaW4gY29uc2VjdXRpdmUgdmlydHVh bCBtZW1vcnkKKyAgICAgICAgLy8gVGhpcyBtYXRjaGVzIGxpYnFiJ3MgcWJfc3lzX2NpcmN1bGFy X21tYXAgaW1wbGVtZW50YXRpb24KKyAgICAgICAgbGV0IGRhdGFfZmQgPSBkYXRhX2ZpbGUuYXNf cmF3X2ZkKCk7CisgICAgICAgIGxldCBtdXQgbW1hcF9kYXRhID0gdW5zYWZlIHsKKyAgICAgICAg ICAgIENpcmN1bGFyTW1hcDo6bmV3KGRhdGFfZmQsIHJlYWxfc2l6ZSkuY29udGV4dCgiRmFpbGVk IHRvIGNyZWF0ZSBjaXJjdWxhciBtbWFwIik/CisgICAgICAgIH07CisKKyAgICAgICAgLy8gWmVy by1pbml0aWFsaXplIHRoZSBkYXRhIChvbmx5IG5lZWQgdG8gemVybyBmaXJzdCBoYWxmIGR1ZSB0 byBjaXJjdWxhciBtYXBwaW5nKQorICAgICAgICB1bnNhZmUgeworICAgICAgICAgICAgbW1hcF9k YXRhLnplcm9faW5pdGlhbGl6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IHNoYXJlZF9k YXRhID0gbW1hcF9kYXRhLmFzX211dF9wdHIoKTsKKworICAgICAgICAvLyBXcml0ZSBzZW50aW5l bCB2YWx1ZSBhdCBlbmQgb2YgYnVmZmVyIChtYXRjaGVzIGxpYnFiIGJlaGF2aW9yKQorICAgICAg ICAvLyBUaGlzIHdvcmtzIG5vdyBiZWNhdXNlIHdlIGhhdmUgY2lyY3VsYXIgbW1hcCB3aXRoIDJ4 IHZpcnR1YWwgc3BhY2UhCisgICAgICAgIHVuc2FmZSB7CisgICAgICAgICAgICAqc2hhcmVkX2Rh dGEuYWRkKHdvcmRfc2l6ZSkgPSA1OworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6 ZSBmbG93IGNvbnRyb2wKKyAgICAgICAgLy8gSWYgc2hhcmVkX3VzZXJfZGF0YV9zaXplID49IHNp emVvZihpMzIpLCBmbG93IGNvbnRyb2wgaXMgZW5hYmxlZCAoZm9yIHJlcXVlc3QgcmluZykKKyAg ICAgICAgLy8gT3RoZXJ3aXNlLCBmbG93IGNvbnRyb2wgaXMgZGlzYWJsZWQgKGZvciByZXNwb25z ZS9ldmVudCByaW5ncykKKyAgICAgICAgbGV0IGZsb3dfY29udHJvbCA9IGlmIHNoYXJlZF91c2Vy X2RhdGFfc2l6ZSA+PSBzdGQ6Om1lbTo6c2l6ZV9vZjo6PGkzMj4oKSB7CisgICAgICAgICAgICB1 bnNhZmUgeworICAgICAgICAgICAgICAgIC8vIEdldCBwb2ludGVyIHRvIHVzZXJfZGF0YSBmaWVs ZCB3aXRoaW4gdGhlIHN0cnVjdHVyZQorICAgICAgICAgICAgICAgIC8vIFRoaXMgbWF0Y2hlcyBs aWJxYidzOiByZXR1cm4gcmItPnNoYXJlZF9oZHItPnVzZXJfZGF0YTsKKyAgICAgICAgICAgICAg ICBsZXQgZmNfcHRyID0gc3RkOjpwdHI6OmFkZHJfb2ZfbXV0ISgoKnNoYXJlZF9oZHIpLnVzZXJf ZGF0YSkgYXMgKm11dCBpMzI7CisgICAgICAgICAgICAgICAgRmxvd0NvbnRyb2w6Om5ldyhmY19w dHIsIHNoYXJlZF9oZHIpCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg ICAgICAvLyBEaXNhYmxlZCBmbG93IGNvbnRyb2wgKG51bGwgcG9pbnRlcnMgPSBuby1vcCBtb2Rl KQorICAgICAgICAgICAgdW5zYWZlIHsgRmxvd0NvbnRyb2w6Om5ldyhzdGQ6OnB0cjo6bnVsbF9t dXQoKSwgc3RkOjpwdHI6Om51bGxfbXV0KCkpIH0KKyAgICAgICAgfTsKKworICAgICAgICBPayhT ZWxmIHsKKyAgICAgICAgICAgIF9tbWFwX2hkcjogbW1hcF9oZHIsCisgICAgICAgICAgICBfbW1h cF9kYXRhOiBtbWFwX2RhdGEsCisgICAgICAgICAgICBzaGFyZWRfaGRyLAorICAgICAgICAgICAg c2hhcmVkX2RhdGEsCisgICAgICAgICAgICBmbG93X2NvbnRyb2wsCisgICAgICAgICAgICBkYXRh X2F2YWlsYWJsZTogQXJjOjpuZXcoTm90aWZ5OjpuZXcoKSksCisgICAgICAgICAgICBzcGFjZV9h dmFpbGFibGU6IEFyYzo6bmV3KE5vdGlmeTo6bmV3KCkpLAorICAgICAgICAgICAgaXNfY3JlYXRv cjogdHJ1ZSwgLy8gVGhpcyBpbnN0YW5jZSBjcmVhdGVkIHRoZSByaW5nIGJ1ZmZlcgorICAgICAg ICB9KQorICAgIH0KKworICAgIC8vLyBTZW5kIGEgbWVzc2FnZSBpbnRvIHRoZSByaW5nIGJ1ZmZl ciAoYXN5bmMpCisgICAgLy8vCisgICAgLy8vIEFsbG9jYXRlcyBhIGNodW5rLCB3cml0ZXMgdGhl IG1lc3NhZ2UgZGF0YSwgYW5kIGNvbW1pdHMgdGhlIGNodW5rLgorICAgIC8vLyBBd2FpdHMgaWYg dGhlcmUncyBpbnN1ZmZpY2llbnQgc3BhY2UuCisgICAgcHViIGFzeW5jIGZuIHNlbmQoJm11dCBz ZWxmLCBtZXNzYWdlOiAmW3U4XSkgLT4gUmVzdWx0PCgpPiB7CisgICAgICAgIGxvb3AgeworICAg ICAgICAgICAgbWF0Y2ggc2VsZi50cnlfc2VuZChtZXNzYWdlKSB7CisgICAgICAgICAgICAgICAg T2soKCkpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm90aWZ5IGNvbnN1bWVycyB0aGF0 IGRhdGEgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YV9hdmFpbGFi bGUubm90aWZ5X29uZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2soKCkpOworICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIoZSkgaWYgZS50b19zdHJpbmcoKS5j b250YWlucygiSW5zdWZmaWNpZW50IHNwYWNlIikgPT4geworICAgICAgICAgICAgICAgICAgICAv LyBXYWl0IGZvciBzcGFjZSB0byBiZWNvbWUgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAg IHNlbGYuc3BhY2VfYXZhaWxhYmxlLm5vdGlmaWVkKCkuYXdhaXQ7CisgICAgICAgICAgICAgICAg ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIoZSkg PT4gcmV0dXJuIEVycihlKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAg IC8vLyBUcnkgdG8gc2VuZCBhIG1lc3NhZ2Ugd2l0aG91dCBibG9ja2luZworICAgIC8vLworICAg IC8vLyBSZXR1cm5zIGFuIGVycm9yIGlmIHRoZXJlJ3MgaW5zdWZmaWNpZW50IHNwYWNlLgorICAg IHB1YiBmbiB0cnlfc2VuZCgmbXV0IHNlbGYsIG1lc3NhZ2U6ICZbdThdKSAtPiBSZXN1bHQ8KCk+ IHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBlbm91Z2ggc3BhY2UKKyAgICAgICAgaWYg IXVuc2FmZSB7ICgqc2VsZi5zaGFyZWRfaGRyKS5jaHVua19maXRzKG1lc3NhZ2UubGVuKCksIFNl bGY6OkNIVU5LX01BUkdJTikgfSB7CisgICAgICAgICAgICBsZXQgc3BhY2VfZnJlZSA9IHNlbGYu c3BhY2VfZnJlZSgpOworICAgICAgICAgICAgbGV0IHJlcXVpcmVkID0gU2VsZjo6Q0hVTktfTUFS R0lOICsgbWVzc2FnZS5sZW4oKTsKKyAgICAgICAgICAgIGFueWhvdzo6YmFpbCEoCisgICAgICAg ICAgICAgICAgIkluc3VmZmljaWVudCBzcGFjZTogbmVlZCB7cmVxdWlyZWR9IGJ5dGVzLCBoYXZl IHtzcGFjZV9mcmVlfSBieXRlcyBmcmVlIgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisg ICAgICAgIC8vIFdyaXRlIHRoZSBjaHVuayB1c2luZyBSaW5nQnVmZmVyU2hhcmVkCisgICAgICAg IHVuc2FmZSB7ICgqc2VsZi5zaGFyZWRfaGRyKS53cml0ZV9jaHVuayhzZWxmLnNoYXJlZF9kYXRh LCBtZXNzYWdlKT8gfTsKKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLy8gUmVjZWl2 ZSBhIG1lc3NhZ2UgZnJvbSB0aGUgcmluZyBidWZmZXIgKGFzeW5jKQorICAgIC8vLworICAgIC8v LyBBd2FpdHMgaWYgbm8gbWVzc2FnZSBpcyBhdmFpbGFibGUuCisgICAgLy8vIEFmdGVyIHByb2Nl c3NpbmcsIHRoZSBjaHVuayBpcyBhdXRvbWF0aWNhbGx5IHJlY2xhaW1lZC4KKyAgICAvLy8KKyAg ICAvLy8gIyMgSW1wbGVtZW50YXRpb24gTm90ZQorICAgIC8vLworICAgIC8vLyBsaWJxYiB1c2Vz IHNlbWFwaG9yZS1iYXNlZCBibG9ja2luZyAoc2VtX3RpbWVkd2FpdCkgdG8gd2FpdCBmb3IgZGF0 YQorICAgIC8vLyAoc2VlIHFiX3JiX2NodW5rX3BlZWsgaW4gbGlicWIvbGliL3JpbmdidWZmZXIu YykuCisgICAgLy8vCisgICAgLy8vIFdlIHVzZSB0b2tpbydzIGBzcGF3bl9ibG9ja2luZ2AgdG8g d2FpdCBvbiB0aGUgUE9TSVggc2VtYXBob3JlIHdpdGhvdXQKKyAgICAvLy8gYmxvY2tpbmcgdGhl IGFzeW5jIHJ1bnRpbWUuIFRoaXMgcHJvdmlkZXMgdHJ1ZSBldmVudC1kcml2ZW4gYmVoYXZpb3Ig d2l0aAorICAgIC8vLyB6ZXJvIHBvbGxpbmcgb3ZlcmhlYWQsIHdoaWxlIG1haW50YWluaW5nIGNv bXBhdGliaWxpdHkgd2l0aCBsaWJxYiBjbGllbnRzLgorICAgIHB1YiBhc3luYyBmbiByZWN2KCZt dXQgc2VsZikgLT4gUmVzdWx0PFZlYzx1OD4+IHsKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAg ICAvLyBXYWl0IG9uIFBPU0lYIHNlbWFwaG9yZSBhc3luY2hyb25vdXNseQorICAgICAgICAgICAg Ly8gVGhpcyBtYXRjaGVzIGxpYnFiJ3MgdGltZWR3YWl0X2ZuIGJlaGF2aW9yIGluIHFiX3JiX2No dW5rX3BlZWsKKyAgICAgICAgICAgIC8vIFNBRkVUWTogVGhlIHNlbWFwaG9yZSBpcyBwcm9wZXJs eSBpbml0aWFsaXplZCBpbiBuZXcoKSBhbmQgcmVtYWlucworICAgICAgICAgICAgLy8gdmFsaWQg Zm9yIHRoZSBsaWZldGltZSBvZiBSaW5nQnVmZmVyCisgICAgICAgICAgICB1bnNhZmUgeyAoKnNl bGYuc2hhcmVkX2hkcikucG9zaXhfc2VtLndhaXQoKS5hd2FpdD8gfTsKKworICAgICAgICAgICAg Ly8gU2VtYXBob3JlIHdhcyBkZWNyZW1lbnRlZCwgZGF0YSBzaG91bGQgYmUgYXZhaWxhYmxlCisg ICAgICAgICAgICAvLyBSZWFkIGFuZCByZWNsYWltIHRoZSBjaHVuaworICAgICAgICAgICAgbWF0 Y2ggc2VsZi5yZWN2X2FmdGVyX3NlbXdhaXQoKT8geworICAgICAgICAgICAgICAgIFNvbWUoZGF0 YSkgPT4geworICAgICAgICAgICAgICAgICAgICAvLyBOb3RpZnkgcHJvZHVjZXJzIHRoYXQgc3Bh Y2UgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3BhY2VfYXZhaWxhYmxl Lm5vdGlmeV9vbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9rKGRhdGEpOworICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAg ICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwIG9yIHJhY2UgY29uZGl0aW9uIC0gc2VtYXBob3JlIHdh cyBkZWNyZW1lbnRlZAorICAgICAgICAgICAgICAgICAgICAvLyBidXQgbm8gdmFsaWQgZGF0YSBm b3VuZC4gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGluIG5vcm1hbCBvcGVyYXRpb24uCisgICAgICAg ICAgICAgICAgICAgIHRyYWNpbmc6Ondhcm4hKCJTcHVyaW91cyBzZW1hcGhvcmUgd2FrZXVwIGRl dGVjdGVkLCByZXRyeWluZyIpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8g UmVjZWl2ZSBhIG1lc3NhZ2UgYWZ0ZXIgc2VtYXBob3JlIGhhcyBiZWVuIGRlY3JlbWVudGVkCisg ICAgLy8vCisgICAgLy8vIFRoaXMgaXMgY2FsbGVkIGFmdGVyIGBQb3NpeFNlbTo6d2FpdCgpYCBo YXMgc3VjY2Vzc2Z1bGx5IGRlY3JlbWVudGVkCisgICAgLy8vIHRoZSBzZW1hcGhvcmUuIEl0IHJl YWRzIHRoZSBjaHVuayBkYXRhIGFuZCByZWNsYWltcyB0aGUgY2h1bmsuCisgICAgLy8vCisgICAg Ly8vIFJldHVybnMgYE5vbmVgIGlmIHRoZSBidWZmZXIgaXMgZW1wdHkgZGVzcGl0ZSBzZW1hcGhv cmUgYmVpbmcgZGVjcmVtZW50ZWQKKyAgICAvLy8gKHdoaWNoIGluZGljYXRlcyBhIGJ1ZyBvciBy YWNlIGNvbmRpdGlvbikuCisgICAgZm4gcmVjdl9hZnRlcl9zZW13YWl0KCZtdXQgc2VsZikgLT4g UmVzdWx0PE9wdGlvbjxWZWM8dTg+Pj4geworICAgICAgICAvLyBHZXQgZmNfcHRyIGlmIGZsb3cg Y29udHJvbCBpcyBlbmFibGVkLCBvdGhlcndpc2UgbnVsbAorICAgICAgICBsZXQgZmNfcHRyID0g aWYgc2VsZi5mbG93X2NvbnRyb2wuaXNfZW5hYmxlZCgpIHsKKyAgICAgICAgICAgIFNvbWUoc2Vs Zi5mbG93X2NvbnRyb2wuZmNfcHRyKCkpCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBO b25lCisgICAgICAgIH07CisgICAgICAgIHVuc2FmZSB7ICgqc2VsZi5zaGFyZWRfaGRyKS5yZWFk X2NodW5rKHNlbGYuc2hhcmVkX2RhdGEsIGZjX3B0cikgfQorICAgIH0KKworICAgIC8vLyBDYWxj dWxhdGUgZnJlZSBzcGFjZSBpbiB0aGUgcmluZyBidWZmZXIgKGluIGJ5dGVzKQorICAgIGZuIHNw YWNlX2ZyZWUoJnNlbGYpIC0+IHVzaXplIHsKKyAgICAgICAgdW5zYWZlIHsgKCpzZWxmLnNoYXJl ZF9oZHIpLnNwYWNlX2ZyZWVfYnl0ZXMoKSB9CisgICAgfQorfQorCitpbXBsIERyb3AgZm9yIFJp bmdCdWZmZXIgeworICAgIGZuIGRyb3AoJm11dCBzZWxmKSB7CisgICAgICAgIC8vIERlY3JlbWVu dCByZWYgY291bnQKKyAgICAgICAgbGV0IHJlZl9jb3VudCA9IHVuc2FmZSB7ICgqc2VsZi5zaGFy ZWRfaGRyKS5yZWZfY291bnQuZmV0Y2hfc3ViKDEsIE9yZGVyaW5nOjpBY3FSZWwpIH07CisKKyAg ICAgICAgdHJhY2luZzo6ZGVidWchKAorICAgICAgICAgICAgIkRyb3BwaW5nIHJpbmcgYnVmZmVy LCByZWZfY291bnQ6IHt9IC0+IHt9IiwKKyAgICAgICAgICAgIHJlZl9jb3VudCwKKyAgICAgICAg ICAgIHJlZl9jb3VudCAtIDEKKyAgICAgICAgKTsKKworICAgICAgICAvLyBJZiBsYXN0IHJlZmVy ZW5jZSBBTkQgd2UgY3JlYXRlZCBpdCwgY2xlYW4gdXAgc2VtYXBob3JlIGFuZCBmaWxlcworICAg ICAgICAvLyBUaGlzIG1hdGNoZXMgbGlicWIncyBiZWhhdmlvcjogb25seSB0aGUgY3JlYXRvciAo UUJfUkJfRkxBR19DUkVBVEUpIGRlc3Ryb3lzIHRoZSBzZW1hcGhvcmUKKyAgICAgICAgaWYgcmVm X2NvdW50ID09IDEgJiYgc2VsZi5pc19jcmVhdG9yIHsKKyAgICAgICAgICAgIHVuc2FmZSB7Cisg ICAgICAgICAgICAgICAgLy8gRGVzdHJveSB0aGUgc2VtYXBob3JlIGJlZm9yZSBjbGVhbmluZyB1 cCB0aGUgbW1hcAorICAgICAgICAgICAgICAgIC8vIE1hdGNoZXMgbGlicWIncyBjbGVhbnVwIGlu IHFiX3JiX2Nsb3NlX2hlbHBlcgorICAgICAgICAgICAgICAgIGlmIGxldCBFcnIoZSkgPSAoKnNl bGYuc2hhcmVkX2hkcikucG9zaXhfc2VtLmRlc3Ryb3koKSB7CisgICAgICAgICAgICAgICAgICAg IHRyYWNpbmc6Ondhcm4hKCJGYWlsZWQgdG8gZGVzdHJveSBzZW1hcGhvcmU6IHt9IiwgZSk7Cisg ICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbGV0IGhkcl9wYXRoID0KKyAgICAg ICAgICAgICAgICAgICAgc3RkOjpmZmk6OkNTdHI6OmZyb21fcHRyKCgqc2VsZi5zaGFyZWRfaGRy KS5oZHJfcGF0aC5hc19wdHIoKSBhcyAqY29uc3QgaTgpOworICAgICAgICAgICAgICAgIGxldCBk YXRhX3BhdGggPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OmZmaTo6Q1N0cjo6ZnJvbV9wdHIo KCpzZWxmLnNoYXJlZF9oZHIpLmRhdGFfcGF0aC5hc19wdHIoKSBhcyAqY29uc3QgaTgpOworCisg ICAgICAgICAgICAgICAgaWYgbGV0IE9rKGhkcl9wYXRoX3N0cikgPSBoZHJfcGF0aC50b19zdHIo KQorICAgICAgICAgICAgICAgICAgICAmJiAhaGRyX3BhdGhfc3RyLmlzX2VtcHR5KCkKKyAgICAg ICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxldCBfID0gc3RkOjpmczo6cmVtb3Zl X2ZpbGUoaGRyX3BhdGhfc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2luZzo6ZGVidWch KCJSZW1vdmVkIGhlYWRlciBmaWxlOiB7fSIsIGhkcl9wYXRoX3N0cik7CisgICAgICAgICAgICAg ICAgfQorCisgICAgICAgICAgICAgICAgaWYgbGV0IE9rKGRhdGFfcGF0aF9zdHIpID0gZGF0YV9w YXRoLnRvX3N0cigpCisgICAgICAgICAgICAgICAgICAgICYmICFkYXRhX3BhdGhfc3RyLmlzX2Vt cHR5KCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGxldCBfID0gc3Rk Ojpmczo6cmVtb3ZlX2ZpbGUoZGF0YV9wYXRoX3N0cik7CisgICAgICAgICAgICAgICAgICAgIHRy YWNpbmc6OmRlYnVnISgiUmVtb3ZlZCBkYXRhIGZpbGU6IHt9IiwgZGF0YV9wYXRoX3N0cik7Cisg ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisj W2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0b2tp bzo6dGVzdF0KKyAgICBhc3luYyBmbiB0ZXN0X3JpbmdidWZmZXJfYmFzaWMoKSAtPiBSZXN1bHQ8 KCk+IHsKKyAgICAgICAgbGV0IHRlbXBfZGlyID0gdGVtcGZpbGU6OnRlbXBkaXIoKT87CisgICAg ICAgIGxldCBtdXQgcmIgPSBSaW5nQnVmZmVyOjpuZXcodGVtcF9kaXIucGF0aCgpLCAidGVzdCIs IDQwOTYsIDApPzsKKworICAgICAgICAvLyBTZW5kIGEgbWVzc2FnZQorICAgICAgICByYi5zZW5k KGIiaGVsbG8gd29ybGQiKS5hd2FpdD87CisKKyAgICAgICAgLy8gUmVjZWl2ZSB0aGUgbWVzc2Fn ZQorICAgICAgICBsZXQgbXNnID0gcmIucmVjdigpLmF3YWl0PzsKKyAgICAgICAgYXNzZXJ0X2Vx IShtc2csIGIiaGVsbG8gd29ybGQiKTsKKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAj W3Rva2lvOjp0ZXN0XQorICAgIGFzeW5jIGZuIHRlc3RfcmluZ2J1ZmZlcl9tdWx0aXBsZV9tZXNz YWdlcygpIC0+IFJlc3VsdDwoKT4geworICAgICAgICBsZXQgdGVtcF9kaXIgPSB0ZW1wZmlsZTo6 dGVtcGRpcigpPzsKKyAgICAgICAgbGV0IG11dCByYiA9IFJpbmdCdWZmZXI6Om5ldyh0ZW1wX2Rp ci5wYXRoKCksICJ0ZXN0IiwgNDA5NiwgMCk/OworCisgICAgICAgIC8vIFNlbmQgbXVsdGlwbGUg bWVzc2FnZXMKKyAgICAgICAgcmIuc2VuZChiIm1lc3NhZ2UgMSIpLmF3YWl0PzsKKyAgICAgICAg cmIuc2VuZChiIm1lc3NhZ2UgMiIpLmF3YWl0PzsKKyAgICAgICAgcmIuc2VuZChiIm1lc3NhZ2Ug MyIpLmF3YWl0PzsKKworICAgICAgICAvLyBSZWNlaXZlIGluIG9yZGVyCisgICAgICAgIGFzc2Vy dF9lcSEocmIucmVjdigpLmF3YWl0PywgYiJtZXNzYWdlIDEiKTsKKyAgICAgICAgYXNzZXJ0X2Vx IShyYi5yZWN2KCkuYXdhaXQ/LCBiIm1lc3NhZ2UgMiIpOworICAgICAgICBhc3NlcnRfZXEhKHJi LnJlY3YoKS5hd2FpdD8sIGIibWVzc2FnZSAzIik7CisKKyAgICAgICAgT2soKCkpCisgICAgfQor CisgICAgI1t0b2tpbzo6dGVzdF0KKyAgICBhc3luYyBmbiB0ZXN0X3JpbmdidWZmZXJfbm9uYmxv Y2tpbmdfc2VuZCgpIC0+IFJlc3VsdDwoKT4geworICAgICAgICBsZXQgdGVtcF9kaXIgPSB0ZW1w ZmlsZTo6dGVtcGRpcigpPzsKKyAgICAgICAgbGV0IG11dCByYiA9IFJpbmdCdWZmZXI6Om5ldyh0 ZW1wX2Rpci5wYXRoKCksICJ0ZXN0IiwgNDA5NiwgMCk/OworCisgICAgICAgIC8vIFRlc3QgdHJ5 X3NlbmQgKG5vbi1ibG9ja2luZyBzZW5kKSB3aXRoIGFzeW5jIHJlY3YKKyAgICAgICAgcmIudHJ5 X3NlbmQoYiJkYXRhIik/OworICAgICAgICBsZXQgbXNnID0gcmIucmVjdigpLmF3YWl0PzsKKyAg ICAgICAgYXNzZXJ0X2VxIShtc2csIGIiZGF0YSIpOworCisgICAgICAgIE9rKCgpKQorICAgIH0K KworICAgICNbdG9raW86OnRlc3RdCisgICAgYXN5bmMgZm4gdGVzdF9yaW5nYnVmZmVyX3dyYXBh cm91bmQoKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICAgICAgbGV0IHRlbXBfZGlyID0gdGVtcGZpbGU6 OnRlbXBkaXIoKT87CisgICAgICAgIGxldCBtdXQgcmIgPSBSaW5nQnVmZmVyOjpuZXcodGVtcF9k aXIucGF0aCgpLCAidGVzdCIsIDI1NiwgMCk/OworCisgICAgICAgIC8vIEZpbGwgYW5kIGRyYWlu IHRvIGZvcmNlIHdyYXBhcm91bmQKKyAgICAgICAgZm9yIF8gaW4gMC4uMTAgeworICAgICAgICAg ICAgcmIuc2VuZChiImRhdGEiKS5hd2FpdD87CisgICAgICAgICAgICByYi5yZWN2KCkuYXdhaXQ/ OworICAgICAgICB9CisKKyAgICAgICAgLy8gU2hvdWxkIHN0aWxsIHdvcmsKKyAgICAgICAgcmIu c2VuZChiImFmdGVyIHdyYXAiKS5hd2FpdD87CisgICAgICAgIGFzc2VydF9lcSEocmIucmVjdigp LmF3YWl0PywgYiJhZnRlciB3cmFwIik7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorfQpkaWZm IC0tZ2l0IGEvc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBjL3NyYy9zZXJ2ZXIucnMgYi9zcmMvcG14 Y2ZzLXJzL3BteGNmcy1pcGMvc3JjL3NlcnZlci5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMC4uNzNkNjNkZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG14Y2ZzLXJzL3Bt eGNmcy1pcGMvc3JjL3NlcnZlci5ycwpAQCAtMCwwICsxLDI3OCBAQAorLy8vIE1haW4gbGlicWIg SVBDIHNlcnZlciBpbXBsZW1lbnRhdGlvbgorLy8vCisvLy8gVGhpcyBtb2R1bGUgY29udGFpbnMg dGhlIFNlcnZlciBzdHJ1Y3QgYW5kIGl0cyBpbXBsZW1lbnRhdGlvbiwKKy8vLyBpbmNsdWRpbmcg Y29ubmVjdGlvbiBhY2NlcHRhbmNlIGFuZCBzZXJ2ZXIgbGlmZWN5Y2xlIG1hbmFnZW1lbnQuCit1 c2UgYW55aG93Ojp7Q29udGV4dCwgUmVzdWx0fTsKK3VzZSBwYXJraW5nX2xvdDo6TXV0ZXg7Cit1 c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKK3VzZSBzdGQ6OnN5bmM6OkFyYzsKK3VzZSBz dGQ6OnN5bmM6OmF0b21pYzo6e0F0b21pY1U2NCwgQXRvbWljVXNpemUsIE9yZGVyaW5nfTsKK3Vz ZSB0b2tpbzo6bmV0OjpVbml4TGlzdGVuZXI7Cit1c2UgdG9raW9fdXRpbDo6c3luYzo6Q2FuY2Vs bGF0aW9uVG9rZW47CisKK3VzZSBzdXBlcjo6Y29ubmVjdGlvbjo6UWJDb25uZWN0aW9uOwordXNl IHN1cGVyOjpoYW5kbGVyOjpIYW5kbGVyOwordXNlIHN1cGVyOjpzb2NrZXQ6OmJpbmRfYWJzdHJh Y3Rfc29ja2V0OworCisvLy8gU2VydmVyLWxldmVsIGNvbm5lY3Rpb24gc3RhdGlzdGljcyAobWF0 Y2hlcyBsaWJxYiBxYl9pcGNzX3N0YXRzKQorI1tkZXJpdmUoRGVidWcsIERlZmF1bHQpXQorcHVi IHN0cnVjdCBTZXJ2ZXJTdGF0cyB7CisgICAgLy8vIE51bWJlciBvZiBjdXJyZW50bHkgYWN0aXZl IGNvbm5lY3Rpb25zCisgICAgcHViIGFjdGl2ZV9jb25uZWN0aW9uczogQXRvbWljVXNpemUsCisg ICAgLy8vIFRvdGFsIG51bWJlciBvZiBjbG9zZWQgY29ubmVjdGlvbnMgc2luY2Ugc2VydmVyIHN0 YXJ0CisgICAgcHViIGNsb3NlZF9jb25uZWN0aW9uczogQXRvbWljVXNpemUsCit9CisKK2ltcGwg U2VydmVyU3RhdHMgeworICAgIGZuIG5ldygpIC0+IFNlbGYgeworICAgICAgICBTZWxmIHsKKyAg ICAgICAgICAgIGFjdGl2ZV9jb25uZWN0aW9uczogQXRvbWljVXNpemU6Om5ldygwKSwKKyAgICAg ICAgICAgIGNsb3NlZF9jb25uZWN0aW9uczogQXRvbWljVXNpemU6Om5ldygwKSwKKyAgICAgICAg fQorICAgIH0KKworICAgIC8vLyBJbmNyZW1lbnQgYWN0aXZlIGNvbm5lY3Rpb25zIGNvdW50IChu ZXcgY29ubmVjdGlvbiBlc3RhYmxpc2hlZCkKKyAgICBmbiBjb25uZWN0aW9uX2NyZWF0ZWQoJnNl bGYpIHsKKyAgICAgICAgc2VsZi5hY3RpdmVfY29ubmVjdGlvbnMuZmV0Y2hfYWRkKDEsIE9yZGVy aW5nOjpSZWxheGVkKTsKKyAgICAgICAgdHJhY2luZzo6ZGVidWchKAorICAgICAgICAgICAgYWN0 aXZlID0gc2VsZi5hY3RpdmVfY29ubmVjdGlvbnMubG9hZChPcmRlcmluZzo6UmVsYXhlZCksCisg ICAgICAgICAgICBjbG9zZWQgPSBzZWxmLmNsb3NlZF9jb25uZWN0aW9ucy5sb2FkKE9yZGVyaW5n OjpSZWxheGVkKSwKKyAgICAgICAgICAgICJDb25uZWN0aW9uIGNyZWF0ZWQiCisgICAgICAgICk7 CisgICAgfQorCisgICAgLy8vIERlY3JlbWVudCBhY3RpdmUsIGluY3JlbWVudCBjbG9zZWQgKGNv bm5lY3Rpb24gdGVybWluYXRlZCkKKyAgICBmbiBjb25uZWN0aW9uX2Nsb3NlZCgmc2VsZikgewor ICAgICAgICBzZWxmLmFjdGl2ZV9jb25uZWN0aW9ucy5mZXRjaF9zdWIoMSwgT3JkZXJpbmc6OlJl bGF4ZWQpOworICAgICAgICBzZWxmLmNsb3NlZF9jb25uZWN0aW9ucy5mZXRjaF9hZGQoMSwgT3Jk ZXJpbmc6OlJlbGF4ZWQpOworICAgICAgICB0cmFjaW5nOjpkZWJ1ZyEoCisgICAgICAgICAgICBh Y3RpdmUgPSBzZWxmLmFjdGl2ZV9jb25uZWN0aW9ucy5sb2FkKE9yZGVyaW5nOjpSZWxheGVkKSwK KyAgICAgICAgICAgIGNsb3NlZCA9IHNlbGYuY2xvc2VkX2Nvbm5lY3Rpb25zLmxvYWQoT3JkZXJp bmc6OlJlbGF4ZWQpLAorICAgICAgICAgICAgIkNvbm5lY3Rpb24gY2xvc2VkIgorICAgICAgICAp OworICAgIH0KKworICAgIC8vLyBHZXQgY3VycmVudCBzdGF0aXN0aWNzIChmb3IgbW9uaXRvcmlu Zy9kZWJ1Z2dpbmcpCisgICAgcHViIGZuIGdldCgmc2VsZikgLT4gKHVzaXplLCB1c2l6ZSkgewor ICAgICAgICAoCisgICAgICAgICAgICBzZWxmLmFjdGl2ZV9jb25uZWN0aW9ucy5sb2FkKE9yZGVy aW5nOjpSZWxheGVkKSwKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkX2Nvbm5lY3Rpb25zLmxvYWQo T3JkZXJpbmc6OlJlbGF4ZWQpLAorICAgICAgICApCisgICAgfQorfQorCisvLy8gbGlicWItY29t cGF0aWJsZSBJUEMgc2VydmVyCitwdWIgc3RydWN0IFNlcnZlciB7CisgICAgc2VydmljZV9uYW1l OiBTdHJpbmcsCisKKyAgICAvLyBTZXR1cCBzb2NrZXQgKFNPQ0tfU1RSRUFNKSAtIGFjY2VwdHMg bmV3IGNvbm5lY3Rpb25zCisgICAgc2V0dXBfbGlzdGVuZXI6IE9wdGlvbjxBcmM8VW5peExpc3Rl bmVyPj4sCisKKyAgICAvLyBQZXItY29ubmVjdGlvbiBzdGF0ZQorICAgIGNvbm5lY3Rpb25zOiBB cmM8TXV0ZXg8SGFzaE1hcDx1NjQsIFFiQ29ubmVjdGlvbj4+PiwKKyAgICBuZXh0X2Nvbm5faWQ6 IEFyYzxBdG9taWNVNjQ+LAorCisgICAgLy8gQ29ubmVjdGlvbiBzdGF0aXN0aWNzIChtYXRjaGVz IGxpYnFiIGJlaGF2aW9yKQorICAgIHN0YXRzOiBBcmM8U2VydmVyU3RhdHM+LAorCisgICAgLy8g TWVzc2FnZSBoYW5kbGVyICh0cmFpdCBvYmplY3QsIGFsc28gaGFuZGxlcyBhdXRoZW50aWNhdGlv bikKKyAgICBoYW5kbGVyOiBBcmM8ZHluIEhhbmRsZXI+LAorCisgICAgLy8gQ2FuY2VsbGF0aW9u IHRva2VuIGZvciBncmFjZWZ1bCBzaHV0ZG93bgorICAgIGNhbmNlbGxhdGlvbl90b2tlbjogQ2Fu Y2VsbGF0aW9uVG9rZW4sCit9CisKK2ltcGwgU2VydmVyIHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3 IGxpYnFiLWNvbXBhdGlibGUgSVBDIHNlcnZlcgorICAgIC8vLworICAgIC8vLyBVc2VzIExpbnV4 IGFic3RyYWN0IFVuaXggc29ja2V0cyBmb3IgSVBDIChubyBmaWxlc3lzdGVtIHBhdGhzIG5lZWRl ZCkuCisgICAgLy8vCisgICAgLy8vICMgQXJndW1lbnRzCisgICAgLy8vICogYHNlcnZpY2VfbmFt ZWAgLSBTZXJ2aWNlIG5hbWUgKGUuZy4sICJwdmUyIiksIHVzZWQgYXMgYWJzdHJhY3Qgc29ja2V0 IG5hbWUKKyAgICAvLy8gKiBgaGFuZGxlcmAgLSBIYW5kbGVyIGltcGxlbWVudGluZyB0aGUgSGFu ZGxlciB0cmFpdCAoaGFuZGxlcyBib3RoIGF1dGhlbnRpY2F0aW9uIGFuZCByZXF1ZXN0cykKKyAg ICBwdWIgZm4gbmV3KHNlcnZpY2VfbmFtZTogJnN0ciwgaGFuZGxlcjogaW1wbCBIYW5kbGVyICsg J3N0YXRpYykgLT4gU2VsZiB7CisgICAgICAgIFNlbGYgeworICAgICAgICAgICAgc2VydmljZV9u YW1lOiBzZXJ2aWNlX25hbWUudG9fc3RyaW5nKCksCisgICAgICAgICAgICBzZXR1cF9saXN0ZW5l cjogTm9uZSwKKyAgICAgICAgICAgIGNvbm5lY3Rpb25zOiBBcmM6Om5ldyhNdXRleDo6bmV3KEhh c2hNYXA6Om5ldygpKSksCisgICAgICAgICAgICBuZXh0X2Nvbm5faWQ6IEFyYzo6bmV3KEF0b21p Y1U2NDo6bmV3KDEpKSwKKyAgICAgICAgICAgIHN0YXRzOiBBcmM6Om5ldyhTZXJ2ZXJTdGF0czo6 bmV3KCkpLAorICAgICAgICAgICAgaGFuZGxlcjogQXJjOjpuZXcoaGFuZGxlciksCisgICAgICAg ICAgICBjYW5jZWxsYXRpb25fdG9rZW46IENhbmNlbGxhdGlvblRva2VuOjpuZXcoKSwKKyAgICAg ICAgfQorICAgIH0KKworICAgIC8vLyBTdGFydCB0aGUgSVBDIHNlcnZlcgorICAgIC8vLworICAg IC8vLyBDcmVhdGVzIGFic3RyYWN0IFVuaXggc29ja2V0IHRoYXQgbGlicWIgY2xpZW50cyBjYW4g Y29ubmVjdCB0bworICAgIHB1YiBmbiBzdGFydCgmbXV0IHNlbGYpIC0+IFJlc3VsdDwoKT4gewor ICAgICAgICB0cmFjaW5nOjppbmZvISgKKyAgICAgICAgICAgICJTdGFydGluZyBsaWJxYi1jb21w YXRpYmxlIElQQyBzZXJ2ZXI6IHt9IiwKKyAgICAgICAgICAgIHNlbGYuc2VydmljZV9uYW1lCisg ICAgICAgICk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGFic3RyYWN0IFVuaXggc29ja2V0IChubyBm aWxlc3lzdGVtIHBhdGhzIG5lZWRlZCkKKyAgICAgICAgbGV0IHN0ZF9saXN0ZW5lciA9CisgICAg ICAgICAgICBiaW5kX2Fic3RyYWN0X3NvY2tldCgmc2VsZi5zZXJ2aWNlX25hbWUpLmNvbnRleHQo IkZhaWxlZCB0byBiaW5kIGFic3RyYWN0IHNvY2tldCIpPzsKKworICAgICAgICAvLyBDb252ZXJ0 IHRvIHRva2lvIGxpc3RlbmVyCisgICAgICAgIHN0ZF9saXN0ZW5lci5zZXRfbm9uYmxvY2tpbmco dHJ1ZSk/OworICAgICAgICBsZXQgbGlzdGVuZXIgPSBVbml4TGlzdGVuZXI6OmZyb21fc3RkKHN0 ZF9saXN0ZW5lcik/OworCisgICAgICAgIHRyYWNpbmc6OmluZm8hKCJCb3VuZCBhYnN0cmFjdCBV bml4IHNvY2tldDogQHt9Iiwgc2VsZi5zZXJ2aWNlX25hbWUpOworCisgICAgICAgIGxldCBsaXN0 ZW5lcl9hcmMgPSBBcmM6Om5ldyhsaXN0ZW5lcik7CisgICAgICAgIHNlbGYuc2V0dXBfbGlzdGVu ZXIgPSBTb21lKGxpc3RlbmVyX2FyYy5jbG9uZSgpKTsKKworICAgICAgICAvLyBTdGFydCBjb25u ZWN0aW9uIGFjY2VwdG9yIHRhc2sKKyAgICAgICAgbGV0IGNvbnRleHQgPSBBY2NlcHRvckNvbnRl eHQgeworICAgICAgICAgICAgbGlzdGVuZXI6IGxpc3RlbmVyX2FyYywKKyAgICAgICAgICAgIHNl cnZpY2VfbmFtZTogc2VsZi5zZXJ2aWNlX25hbWUuY2xvbmUoKSwKKyAgICAgICAgICAgIGNvbm5l Y3Rpb25zOiBzZWxmLmNvbm5lY3Rpb25zLmNsb25lKCksCisgICAgICAgICAgICBuZXh0X2Nvbm5f aWQ6IHNlbGYubmV4dF9jb25uX2lkLmNsb25lKCksCisgICAgICAgICAgICBzdGF0czogc2VsZi5z dGF0cy5jbG9uZSgpLAorICAgICAgICAgICAgaGFuZGxlcjogc2VsZi5oYW5kbGVyLmNsb25lKCks CisgICAgICAgICAgICBjYW5jZWxsYXRpb25fdG9rZW46IHNlbGYuY2FuY2VsbGF0aW9uX3Rva2Vu LmNoaWxkX3Rva2VuKCksCisgICAgICAgIH07CisKKyAgICAgICAgdG9raW86OnNwYXduKGFzeW5j IG1vdmUgeworICAgICAgICAgICAgY29udGV4dC5ydW4oKS5hd2FpdDsKKyAgICAgICAgfSk7CisK KyAgICAgICAgdHJhY2luZzo6aW5mbyEoImxpYnFiIElQQyBzZXJ2ZXIgc3RhcnRlZDoge30iLCBz ZWxmLnNlcnZpY2VfbmFtZSk7CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBTdG9w IHRoZSBJUEMgc2VydmVyCisgICAgcHViIGZuIHN0b3AoJm11dCBzZWxmKSB7CisgICAgICAgIHRy YWNpbmc6OmluZm8hKCJTdG9wcGluZyBsaWJxYiBJUEMgc2VydmVyOiB7fSIsIHNlbGYuc2Vydmlj ZV9uYW1lKTsKKworICAgICAgICAvLyBTaWduYWwgYWxsIHRhc2tzIHRvIHN0b3AKKyAgICAgICAg c2VsZi5jYW5jZWxsYXRpb25fdG9rZW4uY2FuY2VsKCk7CisKKyAgICAgICAgLy8gQ2xvc2UgYWxs IGNvbm5lY3Rpb25zCisgICAgICAgIGxldCBjb25uZWN0aW9ucyA9IHN0ZDo6bWVtOjp0YWtlKCZt dXQgKnNlbGYuY29ubmVjdGlvbnMubG9jaygpKTsKKyAgICAgICAgbGV0IG51bV9jb25uZWN0aW9u cyA9IGNvbm5lY3Rpb25zLmxlbigpOworCisgICAgICAgIGZvciAoX2lkLCBjb25uKSBpbiBjb25u ZWN0aW9ucyB7CisgICAgICAgICAgICAvLyBDbGVhbiB1cCByaW5nIGJ1ZmZlciBmaWxlcworICAg ICAgICAgICAgZm9yIHJiX3BhdGggaW4gJmNvbm4ucmluZ19idWZmZXJfcGF0aHMgeworICAgICAg ICAgICAgICAgIGlmIGxldCBFcnIoZSkgPSBzdGQ6OmZzOjpyZW1vdmVfZmlsZShyYl9wYXRoKSB7 CisgICAgICAgICAgICAgICAgICAgIHRyYWNpbmc6OmRlYnVnISgKKyAgICAgICAgICAgICAgICAg ICAgICAgICJGYWlsZWQgdG8gcmVtb3ZlIHJpbmcgYnVmZmVyIGZpbGUge30gKG1heSBhbHJlYWR5 IGJlIGNsZWFuZWQgdXApOiB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICByYl9wYXRoLmRp c3BsYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICAgICAg KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFVw ZGF0ZSBzdGF0aXN0aWNzCisgICAgICAgICAgICBzZWxmLnN0YXRzLmNvbm5lY3Rpb25fY2xvc2Vk KCk7CisKKyAgICAgICAgICAgIC8vIFRhc2sgaGFuZGxlcyB3aWxsIGJlIGFib3J0ZWQgd2hlbiBk cm9wcGVkCisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5hbCBzdGF0cworICAgICAgICBpZiBu dW1fY29ubmVjdGlvbnMgPiAwIHsKKyAgICAgICAgICAgIGxldCAoYWN0aXZlLCBjbG9zZWQpID0g c2VsZi5zdGF0cy5nZXQoKTsKKyAgICAgICAgICAgIHRyYWNpbmc6OmluZm8hKAorICAgICAgICAg ICAgICAgICJDbG9zZWQge30gY29ubmVjdGlvbnMgKGZpbmFsIHN0YXRzOiBhY3RpdmU9e30sIGNs b3NlZD17fSkiLAorICAgICAgICAgICAgICAgIG51bV9jb25uZWN0aW9ucywKKyAgICAgICAgICAg ICAgICBhY3RpdmUsCisgICAgICAgICAgICAgICAgY2xvc2VkCisgICAgICAgICAgICApOworICAg ICAgICB9CisKKyAgICAgICAgc2VsZi5zZXR1cF9saXN0ZW5lciA9IE5vbmU7CisKKyAgICAgICAg dHJhY2luZzo6aW5mbyEoImxpYnFiIElQQyBzZXJ2ZXIgc3RvcHBlZCIpOworICAgIH0KK30KKwor aW1wbCBEcm9wIGZvciBTZXJ2ZXIgeworICAgIGZuIGRyb3AoJm11dCBzZWxmKSB7CisgICAgICAg IHNlbGYuc3RvcCgpOworICAgIH0KK30KKworLy8vIENvbnRleHQgZm9yIHRoZSBjb25uZWN0aW9u IGFjY2VwdG9yIHRhc2sKKy8vLworLy8vIEJ1bmRsZXMgYWxsIHRoZSBzdGF0ZSBuZWVkZWQgYnkg dGhlIGFjY2VwdG9yIGxvb3AgdG8gYXZvaWQgcGFzc2luZyBtYW55IHBhcmFtZXRlcnMuCitzdHJ1 Y3QgQWNjZXB0b3JDb250ZXh0IHsKKyAgICBsaXN0ZW5lcjogQXJjPFVuaXhMaXN0ZW5lcj4sCisg ICAgc2VydmljZV9uYW1lOiBTdHJpbmcsCisgICAgY29ubmVjdGlvbnM6IEFyYzxNdXRleDxIYXNo TWFwPHU2NCwgUWJDb25uZWN0aW9uPj4+LAorICAgIG5leHRfY29ubl9pZDogQXJjPEF0b21pY1U2 ND4sCisgICAgc3RhdHM6IEFyYzxTZXJ2ZXJTdGF0cz4sCisgICAgaGFuZGxlcjogQXJjPGR5biBI YW5kbGVyPiwKKyAgICBjYW5jZWxsYXRpb25fdG9rZW46IENhbmNlbGxhdGlvblRva2VuLAorfQor CitpbXBsIEFjY2VwdG9yQ29udGV4dCB7CisgICAgLy8vIFJ1biB0aGUgY29ubmVjdGlvbiBhY2Nl cHRvciBsb29wCisgICAgLy8vCisgICAgLy8vIEFjY2VwdHMgbmV3IGNvbm5lY3Rpb25zIGFuZCBz cGF3bnMgaGFuZGxlciB0YXNrcyBmb3IgZWFjaC4KKyAgICBhc3luYyBmbiBydW4oc2VsZikgewor ICAgICAgICB0cmFjaW5nOjpkZWJ1ZyEoImxpYnFiIElQQyBjb25uZWN0aW9uIGFjY2VwdG9yIHN0 YXJ0ZWQiKTsKKworICAgICAgICBsb29wIHsKKyAgICAgICAgICAgIC8vIEFjY2VwdCBuZXcgY29u bmVjdGlvbiB3aXRoIGNhbmNlbGxhdGlvbiBzdXBwb3J0CisgICAgICAgICAgICBsZXQgYWNjZXB0 X3Jlc3VsdCA9IHRva2lvOjpzZWxlY3QhIHsKKyAgICAgICAgICAgICAgICBfID0gc2VsZi5jYW5j ZWxsYXRpb25fdG9rZW4uY2FuY2VsbGVkKCkgPT4geworICAgICAgICAgICAgICAgICAgICB0cmFj aW5nOjpkZWJ1ZyEoIkNvbm5lY3Rpb24gYWNjZXB0b3IgY2FuY2VsbGVkIik7CisgICAgICAgICAg ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXN1 bHQgPSBzZWxmLmxpc3RlbmVyLmFjY2VwdCgpID0+IHJlc3VsdCwKKyAgICAgICAgICAgIH07CisK KyAgICAgICAgICAgIGxldCAoc3RyZWFtLCBfYWRkcikgPSBtYXRjaCBhY2NlcHRfcmVzdWx0IHsK KyAgICAgICAgICAgICAgICBPaygoc3RyZWFtLCBhZGRyKSkgPT4gKHN0cmVhbSwgYWRkciksCisg ICAgICAgICAgICAgICAgRXJyKGUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgIXNlbGYu Y2FuY2VsbGF0aW9uX3Rva2VuLmlzX2NhbmNlbGxlZCgpIHsKKyAgICAgICAgICAgICAgICAgICAg ICAgIHRyYWNpbmc6OmVycm9yISgiRXJyb3IgYWNjZXB0aW5nIGNvbm5lY3Rpb246IHt9IiwgZSk7 CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg ICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgdHJhY2luZzo6ZGVi dWchKCJBY2NlcHRlZCBuZXcgc2V0dXAgY29ubmVjdGlvbiIpOworCisgICAgICAgICAgICAvLyBI YW5kbGUgY29ubmVjdGlvbgorICAgICAgICAgICAgbGV0IGNvbm5faWQgPSBzZWxmLm5leHRfY29u bl9pZC5mZXRjaF9hZGQoMSwgT3JkZXJpbmc6OlNlcUNzdCk7CisgICAgICAgICAgICBtYXRjaCBR YkNvbm5lY3Rpb246OmFjY2VwdCgKKyAgICAgICAgICAgICAgICBzdHJlYW0sCisgICAgICAgICAg ICAgICAgY29ubl9pZCwKKyAgICAgICAgICAgICAgICAmc2VsZi5zZXJ2aWNlX25hbWUsCisgICAg ICAgICAgICAgICAgc2VsZi5oYW5kbGVyLmNsb25lKCksCisgICAgICAgICAgICAgICAgc2VsZi5j YW5jZWxsYXRpb25fdG9rZW4uY2hpbGRfdG9rZW4oKSwKKyAgICAgICAgICAgICkKKyAgICAgICAg ICAgIC5hd2FpdAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIE9rKGNvbm4pID0+IHsK KyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb25uZWN0aW9ucy5sb2NrKCkuaW5zZXJ0KGNvbm5f aWQsIGNvbm4pOworICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgc3RhdGlzdGljcworICAg ICAgICAgICAgICAgICAgICBzZWxmLnN0YXRzLmNvbm5lY3Rpb25fY3JlYXRlZCgpOworICAgICAg ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIoZSkgPT4geworICAgICAgICAgICAgICAg ICAgICB0cmFjaW5nOjplcnJvciEoIkZhaWxlZCB0byBhY2NlcHQgY29ubmVjdGlvbiB7fToge30i LCBjb25uX2lkLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg IH0KKworICAgICAgICB0cmFjaW5nOjpkZWJ1ZyEoImxpYnFiIElQQyBjb25uZWN0aW9uIGFjY2Vw dG9yIGZpbmlzaGVkIik7CisgICAgfQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7Cisg ICAgdXNlIGNyYXRlOjpwcm90b2NvbDo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2hl YWRlcl9zaXplcygpIHsKKyAgICAgICAgLy8gVmVyaWZ5IEMgc3RydWN0IGNvbXBhdGliaWxpdHkK KyAgICAgICAgYXNzZXJ0X2VxIShzdGQ6Om1lbTo6c2l6ZV9vZjo6PFJlcXVlc3RIZWFkZXI+KCks IDE2KTsKKyAgICAgICAgYXNzZXJ0X2VxIShzdGQ6Om1lbTo6YWxpZ25fb2Y6OjxSZXF1ZXN0SGVh ZGVyPigpLCA4KTsKKyAgICAgICAgYXNzZXJ0X2VxIShzdGQ6Om1lbTo6c2l6ZV9vZjo6PFJlc3Bv bnNlSGVhZGVyPigpLCAyNCk7CisgICAgICAgIGFzc2VydF9lcSEoc3RkOjptZW06OmFsaWduX29m Ojo8UmVzcG9uc2VIZWFkZXI+KCksIDgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9wbXhj ZnMtcnMvcG14Y2ZzLWlwYy9zcmMvc29ja2V0LnJzIGIvc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBj L3NyYy9zb2NrZXQucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAuLjU4MzFi MzI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3BteGNmcy1ycy9wbXhjZnMtaXBjL3NyYy9zb2Nr ZXQucnMKQEAgLTAsMCArMSw4NCBAQAorLy8vIEFic3RyYWN0IFVuaXggc29ja2V0IHV0aWxpdGll cworLy8vCisvLy8gVGhpcyBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdp dGggTGludXggYWJzdHJhY3QgVW5peCBzb2NrZXRzLAorLy8vIHdoaWNoIGFyZSB1c2VkIGJ5IGxp YnFiIGZvciBJUEMgY29tbXVuaWNhdGlvbi4KK3VzZSBhbnlob3c6OlJlc3VsdDsKK3VzZSBzdGQ6 Om9zOjp1bml4Ojppbzo6RnJvbVJhd0ZkOwordXNlIHN0ZDo6b3M6OnVuaXg6Om5ldDo6VW5peExp c3RlbmVyOworCisvLy8gQmluZCB0byBhbiBhYnN0cmFjdCBVbml4IHNvY2tldCAoTGludXgtc3Bl Y2lmaWMpCisvLy8KKy8vLyBBYnN0cmFjdCBzb2NrZXRzIGFyZSBpZGVudGlmaWVkIGJ5IGEgbmFt ZSBpbiB0aGUga2VybmVsJ3Mgc29ja2V0IG5hbWVzcGFjZSwKKy8vLyBub3QgYSBmaWxlc3lzdGVt IHBhdGguIFRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB3aGVuIGFsbCByZWZlcmVuY2Vz IGFyZSBjbG9zZWQuCisvLy8KKy8vLyBsaWJxYiBjbGllbnRzIGNyZWF0ZSBhYnN0cmFjdCBzb2Nr ZXRzIHdpdGggRlVMTCAxMDgtYnl0ZSBzdW5fcGF0aCAobnVsbC1wYWRkZWQpLgorLy8vIExpbnV4 IGFic3RyYWN0IHNvY2tldHMgYXJlIGxlbmd0aC1zZW5zaXRpdmUsIHNvIHdlIG11c3QgbWF0Y2gg ZXhhY3RseS4KK3B1YihzdXBlcikgZm4gYmluZF9hYnN0cmFjdF9zb2NrZXQobmFtZTogJnN0cikg LT4gUmVzdWx0PFVuaXhMaXN0ZW5lcj4geworICAgIC8vIENyZWF0ZSBhIFVuaXggc29ja2V0IHVz aW5nIGxpYmMgZGlyZWN0bHkKKyAgICBsZXQgc29ja19mZCA9IHVuc2FmZSB7IGxpYmM6OnNvY2tl dChsaWJjOjpBRl9VTklYLCBsaWJjOjpTT0NLX1NUUkVBTSwgMCkgfTsKKyAgICBpZiBzb2NrX2Zk IDwgMCB7CisgICAgICAgIGFueWhvdzo6YmFpbCEoCisgICAgICAgICAgICAiRmFpbGVkIHRvIGNy ZWF0ZSBVbml4IHNvY2tldDoge30iLAorICAgICAgICAgICAgc3RkOjppbzo6RXJyb3I6Omxhc3Rf b3NfZXJyb3IoKQorICAgICAgICApOworICAgIH0KKworICAgIC8vIFJBSUkgZ3VhcmQgdG8gZW5z dXJlIHNvY2tldCBpcyBjbG9zZWQgb24gZXJyb3IKKyAgICBzdHJ1Y3QgU29ja2V0R3VhcmQoaTMy KTsKKyAgICBpbXBsIERyb3AgZm9yIFNvY2tldEd1YXJkIHsKKyAgICAgICAgZm4gZHJvcCgmbXV0 IHNlbGYpIHsKKyAgICAgICAgICAgIHVuc2FmZSB7IGxpYmM6OmNsb3NlKHNlbGYuMCkgfTsKKyAg ICAgICAgfQorICAgIH0KKyAgICBsZXQgZ3VhcmQgPSBTb2NrZXRHdWFyZChzb2NrX2ZkKTsKKwor ICAgIC8vIENyZWF0ZSBzb2NrYWRkcl91biB3aXRoIGZ1bGwgMTA4LWJ5dGUgYWJzdHJhY3QgYWRk cmVzcyAobWF0Y2hpbmcgbGlicWIpCisgICAgLy8gbGlicWIgZm9ybWF0OiBzdW5fcGF0aFswXSA9 ICdcMCcsIHN1bl9wYXRoWzEuLl0gPSAibmFtZVwwXDAuLi4iIChudWxsLXBhZGRlZCkKKyAgICBs ZXQgbXV0IGFkZHI6IGxpYmM6OnNvY2thZGRyX3VuID0gdW5zYWZlIHsgc3RkOjptZW06Onplcm9l ZCgpIH07CisgICAgYWRkci5zdW5fZmFtaWx5ID0gbGliYzo6QUZfVU5JWCBhcyBsaWJjOjpzYV9m YW1pbHlfdDsKKworICAgIC8vIHN1bl9wYXRoWzBdIGlzIGFscmVhZHkgMCAoYWJzdHJhY3Qgc29j a2V0IG1hcmtlcikKKyAgICAvLyBDb3B5IG5hbWUgc3RhcnRpbmcgYXQgc3VuX3BhdGhbMV0KKyAg ICBsZXQgbmFtZV9ieXRlcyA9IG5hbWUuYXNfYnl0ZXMoKTsKKyAgICBsZXQgY29weV9sZW4gPSBu YW1lX2J5dGVzLmxlbigpLm1pbigxMDcpOyAvLyBMZWF2ZSByb29tIGZvciBpbml0aWFsIFwwCisg ICAgdW5zYWZlIHsKKyAgICAgICAgc3RkOjpwdHI6OmNvcHlfbm9ub3ZlcmxhcHBpbmcoCisgICAg ICAgICAgICBuYW1lX2J5dGVzLmFzX3B0cigpLAorICAgICAgICAgICAgYWRkci5zdW5fcGF0aC5h c19tdXRfcHRyKCkub2Zmc2V0KDEpIGFzICptdXQgdTgsCisgICAgICAgICAgICBjb3B5X2xlbiwK KyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvLyBVc2UgRlVMTCBzb2NrYWRkcl91biBsZW5ndGgg Zm9yIGxpYnFiIGNvbXBhdGliaWxpdHkhCisgICAgLy8gbGlicWIgY2xpZW50cyB1c2UgdGhlIGZ1 bGwgMTEwLWJ5dGUgc3RydWN0dXJlICgyICsgMTA4KSB3aGVuIGNvbm5lY3RpbmcsCisgICAgLy8g c28gd2UgTVVTVCBiaW5kIHdpdGggdGhlIHNhbWUgbGVuZ3RoLiBWZXJpZmllZCB2aWEgc3RyYWNl LgorICAgIGxldCBhZGRyX2xlbiA9IHN0ZDo6bWVtOjpzaXplX29mOjo8bGliYzo6c29ja2FkZHJf dW4+KCkgYXMgbGliYzo6c29ja2xlbl90OworICAgIGxldCBiaW5kX3JlcyA9IHVuc2FmZSB7Cisg ICAgICAgIGxpYmM6OmJpbmQoCisgICAgICAgICAgICBzb2NrX2ZkLAorICAgICAgICAgICAgJmFk ZHIgYXMgKmNvbnN0IF8gYXMgKmNvbnN0IGxpYmM6OnNvY2thZGRyLAorICAgICAgICAgICAgYWRk cl9sZW4sCisgICAgICAgICkKKyAgICB9OworICAgIGlmIGJpbmRfcmVzIDwgMCB7CisgICAgICAg IGFueWhvdzo6YmFpbCEoCisgICAgICAgICAgICAiRmFpbGVkIHRvIGJpbmQgYWJzdHJhY3Qgc29j a2V0OiB7fSIsCisgICAgICAgICAgICBzdGQ6OmlvOjpFcnJvcjo6bGFzdF9vc19lcnJvcigpCisg ICAgICAgICk7CisgICAgfQorCisgICAgLy8gU2V0IHNvY2tldCB0byBsaXN0ZW4gbW9kZSAoYmFj a2xvZyA9IDEyOCkKKyAgICBsZXQgbGlzdGVuX3JlcyA9IHVuc2FmZSB7IGxpYmM6Omxpc3Rlbihz b2NrX2ZkLCAxMjgpIH07CisgICAgaWYgbGlzdGVuX3JlcyA8IDAgeworICAgICAgICBhbnlob3c6 OmJhaWwhKAorICAgICAgICAgICAgIkZhaWxlZCB0byBsaXN0ZW4gb24gc29ja2V0OiB7fSIsCisg ICAgICAgICAgICBzdGQ6OmlvOjpFcnJvcjo6bGFzdF9vc19lcnJvcigpCisgICAgICAgICk7Cisg ICAgfQorCisgICAgLy8gQ29udmVydCByYXcgZmQgdG8gVW5peExpc3RlbmVyICh0YWtlcyBvd25l cnNoaXAsIGZvcmdldCBndWFyZCkKKyAgICBzdGQ6Om1lbTo6Zm9yZ2V0KGd1YXJkKTsKKyAgICBs ZXQgbGlzdGVuZXIgPSB1bnNhZmUgeyBVbml4TGlzdGVuZXI6OmZyb21fcmF3X2ZkKHNvY2tfZmQp IH07CisKKyAgICBPayhsaXN0ZW5lcikKK30KZGlmZiAtLWdpdCBhL3NyYy9wbXhjZnMtcnMvcG14 Y2ZzLWlwYy90ZXN0cy9hdXRoX3Rlc3QucnMgYi9zcmMvcG14Y2ZzLXJzL3BteGNmcy1pcGMvdGVz dHMvYXV0aF90ZXN0LnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwLi5mOGU1 NDFiMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9wbXhjZnMtcnMvcG14Y2ZzLWlwYy90ZXN0cy9h dXRoX3Rlc3QucnMKQEAgLTAsMCArMSw0NTAgQEAKKy8vISBBdXRoZW50aWNhdGlvbiB0ZXN0cyBm b3IgcG14Y2ZzLWlwYworLy8hCisvLyEgVGhlc2UgdGVzdHMgdmVyaWZ5IHRoYXQgdGhlIEhhbmRs ZXI6OmF1dGhlbnRpY2F0ZSgpIG1lY2hhbmlzbSB3b3JrcyBjb3JyZWN0bHkKKy8vISBmb3IgZGlm ZmVyZW50IGF1dGhlbnRpY2F0aW9uIHBvbGljaWVzLgorLy8hCisvLyEgTm90ZTogVGhlc2UgdGVz dHMgdXNlIHJlYWwgVW5peCBzb2NrZXRzLCBzbyB0aGV5IHRlc3QgYXV0aGVudGljYXRpb24gYmVo YXZpb3IKKy8vISBmcm9tIHRoZSBzZXJ2ZXIncyBwZXJzcGVjdGl2ZS4gVGhlIFVJRC9HSUQgd2ls bCBiZSB0aGUgdGVzdCBwcm9jZXNzJ3MgY3JlZGVudGlhbHMsCisvLyEgc28gd2UgdGVzdCB0aGUg SGFuZGxlciBsb2dpYyByYXRoZXIgdGhhbiBPUy1sZXZlbCBjcmVkZW50aWFsIGNoZWNraW5nLgor dXNlIGFzeW5jX3RyYWl0Ojphc3luY190cmFpdDsKK3VzZSBwbXhjZnNfaXBjOjp7SGFuZGxlciwg UGVybWlzc2lvbnMsIFJlcXVlc3QsIFJlc3BvbnNlLCBTZXJ2ZXJ9OwordXNlIHBteGNmc190ZXN0 X3V0aWxzOjp3YWl0X2Zvcl9jb25kaXRpb25fYmxvY2tpbmc7Cit1c2Ugc3RkOjpzeW5jOjpBcmM7 Cit1c2Ugc3RkOjpzeW5jOjphdG9taWM6OntBdG9taWNVMzIsIE9yZGVyaW5nfTsKK3VzZSBzdGQ6 OnRocmVhZDsKK3VzZSBzdGQ6OnRpbWU6OkR1cmF0aW9uOworCisvLy8gSGVscGVyIHRvIGNyZWF0 ZSBhIHVuaXF1ZSBzZXJ2aWNlIG5hbWUgZm9yIGVhY2ggdGVzdAorZm4gdW5pcXVlX3NlcnZpY2Vf bmFtZSgpIC0+IFN0cmluZyB7CisgICAgc3RhdGljIENPVU5URVI6IEF0b21pY1UzMiA9IEF0b21p Y1UzMjo6bmV3KDApOworICAgIGZvcm1hdCEoImF1dGgtdGVzdC17fSIsIENPVU5URVIuZmV0Y2hf YWRkKDEsIE9yZGVyaW5nOjpTZXFDc3QpKQorfQorCisvLy8gSGVscGVyIHRvIGNvbm5lY3QgdXNp bmcgdGhlIHFiX3dpcmVfY29tcGF0IEZGSSBjbGllbnQKKy8vLyBSZXR1cm5zIHRydWUgaWYgY29u bmVjdGlvbiBzdWNjZWVkZWQsIGZhbHNlIGlmIHJlamVjdGVkCitmbiB0cnlfY29ubmVjdChzZXJ2 aWNlX25hbWU6ICZzdHIpIC0+IGJvb2wgeworICAgIHVzZSBzdGQ6OmZmaTo6Q1N0cmluZzsKKwor ICAgICNbcmVwcihDKV0KKyAgICBzdHJ1Y3QgUWJJcGNjQ29ubmVjdGlvbiB7CisgICAgICAgIF9w cml2YXRlOiBbdTg7IDBdLAorICAgIH0KKworICAgICNbbGluayhuYW1lID0gInFiIildCisgICAg dW5zYWZlIGV4dGVybiAiQyIgeworICAgICAgICBmbiBxYl9pcGNjX2Nvbm5lY3QobmFtZTogKmNv bnN0IGxpYmM6OmNfY2hhciwgbWF4X21zZ19zaXplOiB1c2l6ZSkKKyAgICAgICAgLT4gKm11dCBR YklwY2NDb25uZWN0aW9uOworICAgICAgICBmbiBxYl9pcGNjX2Rpc2Nvbm5lY3QoY29ubjogKm11 dCBRYklwY2NDb25uZWN0aW9uKTsKKyAgICB9CisKKyAgICBsZXQgbmFtZSA9IENTdHJpbmc6Om5l dyhzZXJ2aWNlX25hbWUpLmV4cGVjdCgiSW52YWxpZCBzZXJ2aWNlIG5hbWUiKTsKKyAgICBsZXQg Y29ubiA9IHVuc2FmZSB7IHFiX2lwY2NfY29ubmVjdChuYW1lLmFzX3B0cigpLCA4MTkyKSB9Owor CisgICAgbGV0IHN1Y2Nlc3MgPSAhY29ubi5pc19udWxsKCk7CisKKyAgICBpZiBzdWNjZXNzIHsK KyAgICAgICAgdW5zYWZlIHsgcWJfaXBjY19kaXNjb25uZWN0KGNvbm4pIH07CisgICAgfQorCisg ICAgc3VjY2VzcworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUZXN0IEhhbmRsZXJz IHdpdGggRGlmZmVyZW50IEF1dGhlbnRpY2F0aW9uIFBvbGljaWVzCisvLyA9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09CisKKy8vLyBIYW5kbGVyIHRoYXQgYWNjZXB0cyBhbGwgY29ubmVjdGlvbnMgd2l0aCBy ZWFkLXdyaXRlIGFjY2Vzcworc3RydWN0IEFjY2VwdEFsbEhhbmRsZXI7CisKKyNbYXN5bmNfdHJh aXRdCitpbXBsIEhhbmRsZXIgZm9yIEFjY2VwdEFsbEhhbmRsZXIgeworICAgIGZuIGF1dGhlbnRp Y2F0ZSgmc2VsZiwgX3VpZDogdTMyLCBfZ2lkOiB1MzIpIC0+IE9wdGlvbjxQZXJtaXNzaW9ucz4g eworICAgICAgICBTb21lKFBlcm1pc3Npb25zOjpSZWFkV3JpdGUpCisgICAgfQorCisgICAgYXN5 bmMgZm4gaGFuZGxlKCZzZWxmLCBfcmVxdWVzdDogUmVxdWVzdCkgLT4gUmVzcG9uc2UgeworICAg ICAgICBSZXNwb25zZTo6b2soYiJ0ZXN0Ii50b192ZWMoKSkKKyAgICB9Cit9CisKKy8vLyBIYW5k bGVyIHRoYXQgcmVqZWN0cyBhbGwgY29ubmVjdGlvbnMKK3N0cnVjdCBSZWplY3RBbGxIYW5kbGVy OworCisjW2FzeW5jX3RyYWl0XQoraW1wbCBIYW5kbGVyIGZvciBSZWplY3RBbGxIYW5kbGVyIHsK KyAgICBmbiBhdXRoZW50aWNhdGUoJnNlbGYsIF91aWQ6IHUzMiwgX2dpZDogdTMyKSAtPiBPcHRp b248UGVybWlzc2lvbnM+IHsKKyAgICAgICAgTm9uZQorICAgIH0KKworICAgIGFzeW5jIGZuIGhh bmRsZSgmc2VsZiwgX3JlcXVlc3Q6IFJlcXVlc3QpIC0+IFJlc3BvbnNlIHsKKyAgICAgICAgUmVz cG9uc2U6Om9rKGIidGVzdCIudG9fdmVjKCkpCisgICAgfQorfQorCisvLy8gSGFuZGxlciB0aGF0 IG9ubHkgYWNjZXB0cyByb290ICh1aWQ9MCkKK3N0cnVjdCBSb290T25seUhhbmRsZXI7CisKKyNb YXN5bmNfdHJhaXRdCitpbXBsIEhhbmRsZXIgZm9yIFJvb3RPbmx5SGFuZGxlciB7CisgICAgZm4g YXV0aGVudGljYXRlKCZzZWxmLCB1aWQ6IHUzMiwgX2dpZDogdTMyKSAtPiBPcHRpb248UGVybWlz c2lvbnM+IHsKKyAgICAgICAgaWYgdWlkID09IDAgeworICAgICAgICAgICAgU29tZShQZXJtaXNz aW9uczo6UmVhZFdyaXRlKQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTm9uZQorICAg ICAgICB9CisgICAgfQorCisgICAgYXN5bmMgZm4gaGFuZGxlKCZzZWxmLCBfcmVxdWVzdDogUmVx dWVzdCkgLT4gUmVzcG9uc2UgeworICAgICAgICBSZXNwb25zZTo6b2soYiJ0ZXN0Ii50b192ZWMo KSkKKyAgICB9Cit9CisKKy8vLyBIYW5kbGVyIHRoYXQgdHJhY2tzIGF1dGhlbnRpY2F0aW9uIGNh bGxzCitzdHJ1Y3QgVHJhY2tpbmdIYW5kbGVyIHsKKyAgICBjYWxsX2NvdW50OiBBcmM8QXRvbWlj VTMyPiwKKyAgICBsYXN0X3VpZDogQXJjPEF0b21pY1UzMj4sCisgICAgbGFzdF9naWQ6IEFyYzxB dG9taWNVMzI+LAorfQorCitpbXBsIFRyYWNraW5nSGFuZGxlciB7CisgICAgZm4gbmV3KCkgLT4g KFNlbGYsIEFyYzxBdG9taWNVMzI+LCBBcmM8QXRvbWljVTMyPiwgQXJjPEF0b21pY1UzMj4pIHsK KyAgICAgICAgbGV0IGNhbGxfY291bnQgPSBBcmM6Om5ldyhBdG9taWNVMzI6Om5ldygwKSk7Cisg ICAgICAgIGxldCBsYXN0X3VpZCA9IEFyYzo6bmV3KEF0b21pY1UzMjo6bmV3KDApKTsKKyAgICAg ICAgbGV0IGxhc3RfZ2lkID0gQXJjOjpuZXcoQXRvbWljVTMyOjpuZXcoMCkpOworCisgICAgICAg ICgKKyAgICAgICAgICAgIFNlbGYgeworICAgICAgICAgICAgICAgIGNhbGxfY291bnQ6IGNhbGxf Y291bnQuY2xvbmUoKSwKKyAgICAgICAgICAgICAgICBsYXN0X3VpZDogbGFzdF91aWQuY2xvbmUo KSwKKyAgICAgICAgICAgICAgICBsYXN0X2dpZDogbGFzdF9naWQuY2xvbmUoKSwKKyAgICAgICAg ICAgIH0sCisgICAgICAgICAgICBjYWxsX2NvdW50LAorICAgICAgICAgICAgbGFzdF91aWQsCisg ICAgICAgICAgICBsYXN0X2dpZCwKKyAgICAgICAgKQorICAgIH0KK30KKworI1thc3luY190cmFp dF0KK2ltcGwgSGFuZGxlciBmb3IgVHJhY2tpbmdIYW5kbGVyIHsKKyAgICBmbiBhdXRoZW50aWNh dGUoJnNlbGYsIHVpZDogdTMyLCBnaWQ6IHUzMikgLT4gT3B0aW9uPFBlcm1pc3Npb25zPiB7Cisg ICAgICAgIHNlbGYuY2FsbF9jb3VudC5mZXRjaF9hZGQoMSwgT3JkZXJpbmc6OlNlcUNzdCk7Cisg ICAgICAgIHNlbGYubGFzdF91aWQuc3RvcmUodWlkLCBPcmRlcmluZzo6U2VxQ3N0KTsKKyAgICAg ICAgc2VsZi5sYXN0X2dpZC5zdG9yZShnaWQsIE9yZGVyaW5nOjpTZXFDc3QpOworICAgICAgICBT b21lKFBlcm1pc3Npb25zOjpSZWFkV3JpdGUpCisgICAgfQorCisgICAgYXN5bmMgZm4gaGFuZGxl KCZzZWxmLCBfcmVxdWVzdDogUmVxdWVzdCkgLT4gUmVzcG9uc2UgeworICAgICAgICBSZXNwb25z ZTo6b2soYiJ0ZXN0Ii50b192ZWMoKSkKKyAgICB9Cit9CisKKy8vLyBIYW5kbGVyIHRoYXQgZ3Jh bnRzIHJlYWQtb25seSBhY2Nlc3MgdG8gbm9uLXJvb3QKK3N0cnVjdCBSZWFkT25seUZvck5vblJv b3RIYW5kbGVyOworCisjW2FzeW5jX3RyYWl0XQoraW1wbCBIYW5kbGVyIGZvciBSZWFkT25seUZv ck5vblJvb3RIYW5kbGVyIHsKKyAgICBmbiBhdXRoZW50aWNhdGUoJnNlbGYsIHVpZDogdTMyLCBf Z2lkOiB1MzIpIC0+IE9wdGlvbjxQZXJtaXNzaW9ucz4geworICAgICAgICBpZiB1aWQgPT0gMCB7 CisgICAgICAgICAgICBTb21lKFBlcm1pc3Npb25zOjpSZWFkV3JpdGUpCisgICAgICAgIH0gZWxz ZSB7CisgICAgICAgICAgICBTb21lKFBlcm1pc3Npb25zOjpSZWFkT25seSkKKyAgICAgICAgfQor ICAgIH0KKworICAgIGFzeW5jIGZuIGhhbmRsZSgmc2VsZiwgcmVxdWVzdDogUmVxdWVzdCkgLT4g UmVzcG9uc2UgeworICAgICAgICAvLyByZWFkX29ubHkgZmllbGQgaXMgdmlzaWJsZSB0byB0aGUg aGFuZGxlciB2aWEgdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgLy8gRm9yIHRlc3RpbmcgcHVycG9z ZXMsIGp1c3QgYWNjZXB0IHJlcXVlc3RzCisgICAgICAgIFJlc3BvbnNlOjpvayhmb3JtYXQhKCJo YW5kbGVkIG1zZ19pZCB7fSIsIHJlcXVlc3QubXNnX2lkKS5pbnRvX2J5dGVzKCkpCisgICAgfQor fQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBIZWxwZXIgdG8gc3RhcnQgc2VydmVyIGlu IGJhY2tncm91bmQgdGhyZWFkCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2ZuIHN0YXJ0X3Nl cnZlcjxIOiBIYW5kbGVyICsgJ3N0YXRpYz4oc2VydmljZV9uYW1lOiBTdHJpbmcsIGhhbmRsZXI6 IEgpIC0+IHRocmVhZDo6Sm9pbkhhbmRsZTwoKT4geworICAgIHRocmVhZDo6c3Bhd24obW92ZSB8 fCB7CisgICAgICAgIGxldCBydCA9IHRva2lvOjpydW50aW1lOjpSdW50aW1lOjpuZXcoKS5leHBl Y3QoIkZhaWxlZCB0byBjcmVhdGUgdG9raW8gcnVudGltZSIpOworICAgICAgICBydC5ibG9ja19v bihhc3luYyB7CisgICAgICAgICAgICBsZXQgbXV0IHNlcnZlciA9IFNlcnZlcjo6bmV3KCZzZXJ2 aWNlX25hbWUsIGhhbmRsZXIpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCkuZXhwZWN0KCJT ZXJ2ZXIgc3RhcnR1cCBmYWlsZWQiKTsKKyAgICAgICAgICAgIHN0ZDo6ZnV0dXJlOjpwZW5kaW5n Ojo8KCk+KCkuYXdhaXQ7CisgICAgICAgIH0pOworICAgIH0pCit9CisKKy8vLyBXYWl0IGZvciBz ZXJ2ZXIgdG8gYmUgcmVhZHkgYnkgY2hlY2tpbmcgaWYgc29ja2V0IGZpbGUgZXhpc3RzCitmbiB3 YWl0X2Zvcl9zZXJ2ZXJfcmVhZHkoc2VydmljZV9uYW1lOiAmc3RyKSB7CisgICAgLy8gVGhlIHNv Y2tldCBpcyBjcmVhdGVkIGluIC9kZXYvc2htL3FiLXtzZXJ2aWNlX25hbWV9LSoKKyAgICAvLyBX ZSdsbCBqdXN0IHRyeSB0byBjb25uZWN0IHJlcGVhdGVkbHkgdW50aWwgc3VjY2Vzc2Z1bCBvciB0 aW1lb3V0CisgICAgYXNzZXJ0ISgKKyAgICAgICAgd2FpdF9mb3JfY29uZGl0aW9uX2Jsb2NraW5n KAorICAgICAgICAgICAgfHwgeworICAgICAgICAgICAgICAgIC8vIFRyeSBhIHF1aWNrIGNvbm5l Y3Rpb24gYXR0ZW1wdAorICAgICAgICAgICAgICAgIC8vIEZvciBzZXJ2ZXJzIHRoYXQgYWNjZXB0 IGNvbm5lY3Rpb25zLCB0aGlzIHdpbGwgc3VjY2VlZAorICAgICAgICAgICAgICAgIC8vIEZvciBz ZXJ2ZXJzIHRoYXQgcmVqZWN0LCB0aGUgc29ja2V0IHdpbGwgYXQgbGVhc3QgZXhpc3QKKworICAg ICAgICAgICAgICAgIGxldCBzb2NrZXRfcGF0dGVybiA9IGZvcm1hdCEoIi9kZXYvc2htL3FiLXtz ZXJ2aWNlX25hbWV9LSIpOworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGFueSBzb2NrZXQg ZmlsZSBtYXRjaGluZyB0aGUgcGF0dGVybiBleGlzdHMKKyAgICAgICAgICAgICAgICBpZiBsZXQg T2soZW50cmllcykgPSBzdGQ6OmZzOjpyZWFkX2RpcigiL2Rldi9zaG0iKSB7CisgICAgICAgICAg ICAgICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzLmZsYXR0ZW4oKSB7CisgICAgICAgICAgICAg ICAgICAgICAgICBpZiBsZXQgT2sobmFtZSkgPSBlbnRyeS5maWxlX25hbWUoKS5pbnRvX3N0cmlu ZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmFtZS5zdGFydHNfd2l0aCgmc29j a2V0X3BhdHRlcm4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAg ICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmFs c2UKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBEdXJhdGlvbjo6ZnJvbV9zZWNzKDUpLAor ICAgICAgICAgICAgRHVyYXRpb246OmZyb21fbWlsbGlzKDEwKSwKKyAgICAgICAgKSwKKyAgICAg ICAgIlNlcnZlciBzaG91bGQgYmUgcmVhZHkgd2l0aGluIDUgc2Vjb25kcyIKKyAgICApOworfQor CisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUZXN0cworLy8gPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQorCisjW3Rlc3RdCisjW2lnbm9yZV0gLy8gUmVxdWlyZXMgbGlicWItZGV2CitmbiB0ZXN0X2Fj Y2VwdF9hbGxfaGFuZGxlcigpIHsKKyAgICBsZXQgc2VydmljZV9uYW1lID0gdW5pcXVlX3NlcnZp Y2VfbmFtZSgpOworICAgIGxldCBfc2VydmVyID0gc3RhcnRfc2VydmVyKHNlcnZpY2VfbmFtZS5j bG9uZSgpLCBBY2NlcHRBbGxIYW5kbGVyKTsKKworICAgIHdhaXRfZm9yX3NlcnZlcl9yZWFkeSgm c2VydmljZV9uYW1lKTsKKworICAgIGFzc2VydCEoCisgICAgICAgIHRyeV9jb25uZWN0KCZzZXJ2 aWNlX25hbWUpLAorICAgICAgICAiQWNjZXB0QWxsSGFuZGxlciBzaG91bGQgYWNjZXB0IGNvbm5l Y3Rpb24iCisgICAgKTsKK30KKworI1t0ZXN0XQorI1tpZ25vcmVdIC8vIFJlcXVpcmVzIGxpYnFi LWRldgorZm4gdGVzdF9yZWplY3RfYWxsX2hhbmRsZXIoKSB7CisgICAgbGV0IHNlcnZpY2VfbmFt ZSA9IHVuaXF1ZV9zZXJ2aWNlX25hbWUoKTsKKyAgICBsZXQgX3NlcnZlciA9IHN0YXJ0X3NlcnZl cihzZXJ2aWNlX25hbWUuY2xvbmUoKSwgUmVqZWN0QWxsSGFuZGxlcik7CisKKyAgICB3YWl0X2Zv cl9zZXJ2ZXJfcmVhZHkoJnNlcnZpY2VfbmFtZSk7CisKKyAgICBhc3NlcnQhKAorICAgICAgICAh dHJ5X2Nvbm5lY3QoJnNlcnZpY2VfbmFtZSksCisgICAgICAgICJSZWplY3RBbGxIYW5kbGVyIHNo b3VsZCByZWplY3QgY29ubmVjdGlvbiIKKyAgICApOworfQorCisjW3Rlc3RdCisjW2lnbm9yZV0g Ly8gUmVxdWlyZXMgbGlicWItZGV2CitmbiB0ZXN0X3Jvb3Rfb25seV9oYW5kbGVyKCkgeworICAg IGxldCBzZXJ2aWNlX25hbWUgPSB1bmlxdWVfc2VydmljZV9uYW1lKCk7CisgICAgbGV0IF9zZXJ2 ZXIgPSBzdGFydF9zZXJ2ZXIoc2VydmljZV9uYW1lLmNsb25lKCksIFJvb3RPbmx5SGFuZGxlcik7 CisKKyAgICB3YWl0X2Zvcl9zZXJ2ZXJfcmVhZHkoJnNlcnZpY2VfbmFtZSk7CisKKyAgICBsZXQg Y29ubmVjdGVkID0gdHJ5X2Nvbm5lY3QoJnNlcnZpY2VfbmFtZSk7CisKKyAgICAvLyBHZXQgY3Vy cmVudCB1aWQKKyAgICBsZXQgY3VycmVudF91aWQgPSB1bnNhZmUgeyBsaWJjOjpnZXR1aWQoKSB9 OworCisgICAgaWYgY3VycmVudF91aWQgPT0gMCB7CisgICAgICAgIGFzc2VydCEoCisgICAgICAg ICAgICBjb25uZWN0ZWQsCisgICAgICAgICAgICAiUm9vdE9ubHlIYW5kbGVyIHNob3VsZCBhY2Nl cHQgY29ubmVjdGlvbiB3aGVuIHJ1bm5pbmcgYXMgcm9vdCIKKyAgICAgICAgKTsKKyAgICB9IGVs c2UgeworICAgICAgICBhc3NlcnQhKAorICAgICAgICAgICAgIWNvbm5lY3RlZCwKKyAgICAgICAg ICAgICJSb290T25seUhhbmRsZXIgc2hvdWxkIHJlamVjdCBjb25uZWN0aW9uIHdoZW4gbm90IHJ1 bm5pbmcgYXMgcm9vdCAodWlkPXtjdXJyZW50X3VpZH0pIgorICAgICAgICApOworICAgIH0KK30K KworI1t0ZXN0XQorI1tpZ25vcmVdIC8vIFJlcXVpcmVzIGxpYnFiLWRldgorZm4gdGVzdF9hdXRo ZW50aWNhdGlvbl9jYWxsZWRfd2l0aF9jcmVkZW50aWFscygpIHsKKyAgICBsZXQgc2VydmljZV9u YW1lID0gdW5pcXVlX3NlcnZpY2VfbmFtZSgpOworICAgIGxldCAoaGFuZGxlciwgY2FsbF9jb3Vu dCwgbGFzdF91aWQsIGxhc3RfZ2lkKSA9IFRyYWNraW5nSGFuZGxlcjo6bmV3KCk7CisgICAgbGV0 IF9zZXJ2ZXIgPSBzdGFydF9zZXJ2ZXIoc2VydmljZV9uYW1lLmNsb25lKCksIGhhbmRsZXIpOwor CisgICAgd2FpdF9mb3Jfc2VydmVyX3JlYWR5KCZzZXJ2aWNlX25hbWUpOworCisgICAgbGV0IGN1 cnJlbnRfdWlkID0gdW5zYWZlIHsgbGliYzo6Z2V0dWlkKCkgfTsKKyAgICBsZXQgY3VycmVudF9n aWQgPSB1bnNhZmUgeyBsaWJjOjpnZXRnaWQoKSB9OworCisgICAgYXNzZXJ0X2VxISgKKyAgICAg ICAgY2FsbF9jb3VudC5sb2FkKE9yZGVyaW5nOjpTZXFDc3QpLAorICAgICAgICAwLAorICAgICAg ICAiU2hvdWxkIG5vdCBiZSBjYWxsZWQgeWV0IgorICAgICk7CisKKyAgICBsZXQgY29ubmVjdGVk ID0gdHJ5X2Nvbm5lY3QoJnNlcnZpY2VfbmFtZSk7CisKKyAgICBhc3NlcnQhKGNvbm5lY3RlZCwg IlRyYWNraW5nSGFuZGxlciBzaG91bGQgYWNjZXB0IGNvbm5lY3Rpb24iKTsKKyAgICBhc3NlcnRf ZXEhKAorICAgICAgICBjYWxsX2NvdW50LmxvYWQoT3JkZXJpbmc6OlNlcUNzdCksCisgICAgICAg IDEsCisgICAgICAgICJhdXRoZW50aWNhdGUoKSBzaG91bGQgYmUgY2FsbGVkIG9uY2UiCisgICAg KTsKKyAgICBhc3NlcnRfZXEhKAorICAgICAgICBsYXN0X3VpZC5sb2FkKE9yZGVyaW5nOjpTZXFD c3QpLAorICAgICAgICBjdXJyZW50X3VpZCwKKyAgICAgICAgImF1dGhlbnRpY2F0ZSgpIHNob3Vs ZCByZWNlaXZlIGNvcnJlY3QgdWlkIgorICAgICk7CisgICAgYXNzZXJ0X2VxISgKKyAgICAgICAg bGFzdF9naWQubG9hZChPcmRlcmluZzo6U2VxQ3N0KSwKKyAgICAgICAgY3VycmVudF9naWQsCisg ICAgICAgICJhdXRoZW50aWNhdGUoKSBzaG91bGQgcmVjZWl2ZSBjb3JyZWN0IGdpZCIKKyAgICAp OworfQorCisjW3Rlc3RdCisjW2lnbm9yZV0gLy8gUmVxdWlyZXMgbGlicWItZGV2CitmbiB0ZXN0 X211bHRpcGxlX2Nvbm5lY3Rpb25zX2NhbGxfYXV0aGVudGljYXRlX2VhY2hfdGltZSgpIHsKKyAg ICBsZXQgc2VydmljZV9uYW1lID0gdW5pcXVlX3NlcnZpY2VfbmFtZSgpOworICAgIGxldCAoaGFu ZGxlciwgY2FsbF9jb3VudCwgXywgXykgPSBUcmFja2luZ0hhbmRsZXI6Om5ldygpOworICAgIGxl dCBfc2VydmVyID0gc3RhcnRfc2VydmVyKHNlcnZpY2VfbmFtZS5jbG9uZSgpLCBoYW5kbGVyKTsK KworICAgIHdhaXRfZm9yX3NlcnZlcl9yZWFkeSgmc2VydmljZV9uYW1lKTsKKworICAgIC8vIEZp cnN0IGNvbm5lY3Rpb24KKyAgICBhc3NlcnQhKHRyeV9jb25uZWN0KCZzZXJ2aWNlX25hbWUpKTsK KyAgICBhc3NlcnRfZXEhKGNhbGxfY291bnQubG9hZChPcmRlcmluZzo6U2VxQ3N0KSwgMSk7CisK KyAgICAvLyBTZWNvbmQgY29ubmVjdGlvbgorICAgIGFzc2VydCEodHJ5X2Nvbm5lY3QoJnNlcnZp Y2VfbmFtZSkpOworICAgIGFzc2VydF9lcSEoY2FsbF9jb3VudC5sb2FkKE9yZGVyaW5nOjpTZXFD c3QpLCAyKTsKKworICAgIC8vIFRoaXJkIGNvbm5lY3Rpb24KKyAgICBhc3NlcnQhKHRyeV9jb25u ZWN0KCZzZXJ2aWNlX25hbWUpKTsKKyAgICBhc3NlcnRfZXEhKGNhbGxfY291bnQubG9hZChPcmRl cmluZzo6U2VxQ3N0KSwgMyk7Cit9CisKKyNbdGVzdF0KKyNbaWdub3JlXSAvLyBSZXF1aXJlcyBs aWJxYi1kZXYKK2ZuIHRlc3RfcmVhZF9vbmx5X3Blcm1pc3Npb25zX2FjY2VwdGVkKCkgeworICAg IGxldCBzZXJ2aWNlX25hbWUgPSB1bmlxdWVfc2VydmljZV9uYW1lKCk7CisgICAgbGV0IF9zZXJ2 ZXIgPSBzdGFydF9zZXJ2ZXIoc2VydmljZV9uYW1lLmNsb25lKCksIFJlYWRPbmx5Rm9yTm9uUm9v dEhhbmRsZXIpOworCisgICAgd2FpdF9mb3Jfc2VydmVyX3JlYWR5KCZzZXJ2aWNlX25hbWUpOwor CisgICAgLy8gQ29ubmVjdGlvbiBzaG91bGQgc3VjY2VlZCByZWdhcmRsZXNzIG9mIHdoZXRoZXIg d2UgZ2V0IFJlYWRPbmx5IG9yIFJlYWRXcml0ZQorICAgIC8vIChib3RoIGFyZSBhY2NlcHRlZCwg anVzdCB3aXRoIGRpZmZlcmVudCBwZXJtaXNzaW9ucykKKyAgICBhc3NlcnQhKAorICAgICAgICB0 cnlfY29ubmVjdCgmc2VydmljZV9uYW1lKSwKKyAgICAgICAgIlJlYWRPbmx5Rm9yTm9uUm9vdEhh bmRsZXIgc2hvdWxkIGFjY2VwdCBjb25uZWN0aW9ucyB3aXRoIGFwcHJvcHJpYXRlIHBlcm1pc3Np b25zIgorICAgICk7Cit9CisKKy8vLyBUZXN0IHRoYXQgZGVtb25zdHJhdGVzIHRoZSBhdXRoZW50 aWNhdGlvbiBwb2xpY3kgaXMgZW5mb3JjZWQgYXQgY29ubmVjdGlvbiB0aW1lCisjW3Rlc3RdCisj W2lnbm9yZV0gLy8gUmVxdWlyZXMgbGlicWItZGV2CitmbiB0ZXN0X2F1dGhlbnRpY2F0aW9uX2Vu Zm9yY2VkX2F0X2Nvbm5lY3Rpb25fdGltZSgpIHsKKyAgICAvLyBUaGlzIHRlc3QgdmVyaWZpZXMg dGhhdCBhdXRoZW50aWNhdGlvbiBoYXBwZW5zIGR1cmluZyBjb25uZWN0aW9uIHNldHVwLAorICAg IC8vIG5vdCBkdXJpbmcgcmVxdWVzdCBoYW5kbGluZworICAgIGxldCBzZXJ2aWNlX25hbWUgPSB1 bmlxdWVfc2VydmljZV9uYW1lKCk7CisgICAgbGV0IF9zZXJ2ZXIgPSBzdGFydF9zZXJ2ZXIoc2Vy dmljZV9uYW1lLmNsb25lKCksIFJlamVjdEFsbEhhbmRsZXIpOworCisgICAgd2FpdF9mb3Jfc2Vy dmVyX3JlYWR5KCZzZXJ2aWNlX25hbWUpOworCisgICAgLy8gQ29ubmVjdGlvbiBzaG91bGQgZmFp bCBpbW1lZGlhdGVseSwgYmVmb3JlIGFueSByZXF1ZXN0IGlzIHNlbnQKKyAgICBsZXQgc3RhcnQg PSBzdGQ6OnRpbWU6Okluc3RhbnQ6Om5vdygpOworICAgIGxldCBjb25uZWN0ZWQgPSB0cnlfY29u bmVjdCgmc2VydmljZV9uYW1lKTsKKyAgICBsZXQgZHVyYXRpb24gPSBzdGFydC5lbGFwc2VkKCk7 CisKKyAgICBhc3NlcnQhKCFjb25uZWN0ZWQsICJDb25uZWN0aW9uIHNob3VsZCBiZSByZWplY3Rl ZCIpOworICAgIGFzc2VydCEoCisgICAgICAgIGR1cmF0aW9uIDwgRHVyYXRpb246OmZyb21fbWls bGlzKDEwMCksCisgICAgICAgICJSZWplY3Rpb24gc2hvdWxkIGhhcHBlbiBxdWlja2x5IGR1cmlu ZyBoYW5kc2hha2UsIG5vdCBkdXJpbmcgcmVxdWVzdCBwcm9jZXNzaW5nIgorICAgICk7Cit9CisK KyNbY2ZnKHRlc3QpXQorbW9kIHBvbGljeV9leGFtcGxlcyB7CisgICAgdXNlIHN1cGVyOjoqOwor CisgICAgLy8vIEV4YW1wbGU6IEhhbmRsZXIgdGhhdCBtaW1pY3MgUHJveG1veCBWRSBhdXRoZW50 aWNhdGlvbiBwb2xpY3kKKyAgICAvLy8gLSBSb290ICh1aWQ9MCkgZ2V0cyByZWFkLXdyaXRlCisg ICAgLy8vIC0gd3d3LWRhdGEgKHVpZD0zMykgZ2V0cyByZWFkLW9ubHkgKGZvciB3ZWIgVUkpCisg ICAgLy8vIC0gT3RoZXJzIGFyZSByZWplY3RlZAorICAgIHN0cnVjdCBQcm94bW94U3R5bGVIYW5k bGVyOworCisgICAgI1thc3luY190cmFpdF0KKyAgICBpbXBsIEhhbmRsZXIgZm9yIFByb3htb3hT dHlsZUhhbmRsZXIgeworICAgICAgICBmbiBhdXRoZW50aWNhdGUoJnNlbGYsIHVpZDogdTMyLCBf Z2lkOiB1MzIpIC0+IE9wdGlvbjxQZXJtaXNzaW9ucz4geworICAgICAgICAgICAgbWF0Y2ggdWlk IHsKKyAgICAgICAgICAgICAgICAwID0+IFNvbWUoUGVybWlzc2lvbnM6OlJlYWRXcml0ZSksIC8v IHJvb3QKKyAgICAgICAgICAgICAgICAzMyA9PiBTb21lKFBlcm1pc3Npb25zOjpSZWFkT25seSks IC8vIHd3dy1kYXRhCisgICAgICAgICAgICAgICAgXyA9PiBOb25lLCAgICAgICAgICAgICAgICAg ICAgICAgICAvLyByZWplY3Qgb3RoZXJzCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAg ICAgICBhc3luYyBmbiBoYW5kbGUoJnNlbGYsIHJlcXVlc3Q6IFJlcXVlc3QpIC0+IFJlc3BvbnNl IHsKKyAgICAgICAgICAgIC8vIEluIHJlYWwgaW1wbGVtZW50YXRpb24sIHdvdWxkIGNoZWNrIHJl cXVlc3QucmVhZF9vbmx5CisgICAgICAgICAgICAvLyB0byBlbmZvcmNlIHJlYWQtb25seSByZXN0 cmljdGlvbnMKKyAgICAgICAgICAgIFJlc3BvbnNlOjpvayhmb3JtYXQhKCJtc2dfaWQge30iLCBy ZXF1ZXN0Lm1zZ19pZCkuaW50b19ieXRlcygpKQorICAgICAgICB9CisgICAgfQorCisgICAgI1t0 ZXN0XQorICAgICNbaWdub3JlXSAvLyBSZXF1aXJlcyBsaWJxYi1kZXYKKyAgICBmbiB0ZXN0X3By b3htb3hfc3R5bGVfcG9saWN5KCkgeworICAgICAgICBsZXQgc2VydmljZV9uYW1lID0gdW5pcXVl X3NlcnZpY2VfbmFtZSgpOworICAgICAgICBsZXQgX3NlcnZlciA9IHN0YXJ0X3NlcnZlcihzZXJ2 aWNlX25hbWUuY2xvbmUoKSwgUHJveG1veFN0eWxlSGFuZGxlcik7CisKKyAgICAgICAgd2FpdF9m b3Jfc2VydmVyX3JlYWR5KCZzZXJ2aWNlX25hbWUpOworCisgICAgICAgIGxldCBjdXJyZW50X3Vp ZCA9IHVuc2FmZSB7IGxpYmM6OmdldHVpZCgpIH07CisgICAgICAgIGxldCBjb25uZWN0ZWQgPSB0 cnlfY29ubmVjdCgmc2VydmljZV9uYW1lKTsKKworICAgICAgICBtYXRjaCBjdXJyZW50X3VpZCB7 CisgICAgICAgICAgICAwID0+IGFzc2VydCEoY29ubmVjdGVkLCAiUm9vdCBzaG91bGQgYmUgYWNj ZXB0ZWQiKSwKKyAgICAgICAgICAgIDMzID0+IGFzc2VydCEoY29ubmVjdGVkLCAid3d3LWRhdGEg c2hvdWxkIGJlIGFjY2VwdGVkIiksCisgICAgICAgICAgICBfID0+IGFzc2VydCEoIWNvbm5lY3Rl ZCwgIk90aGVyIHVzZXJzIHNob3VsZCBiZSByZWplY3RlZCIpLAorICAgICAgICB9CisgICAgfQor CisgICAgLy8vIEV4YW1wbGU6IEhhbmRsZXIgdGhhdCB1c2VzIGdyb3VwLWJhc2VkIGF1dGhlbnRp Y2F0aW9uCisgICAgc3RydWN0IEdyb3VwQmFzZWRIYW5kbGVyIHsKKyAgICAgICAgYWxsb3dlZF9n aWQ6IHUzMiwKKyAgICB9CisKKyAgICBpbXBsIEdyb3VwQmFzZWRIYW5kbGVyIHsKKyAgICAgICAg Zm4gbmV3KGFsbG93ZWRfZ2lkOiB1MzIpIC0+IFNlbGYgeworICAgICAgICAgICAgU2VsZiB7IGFs bG93ZWRfZ2lkIH0KKyAgICAgICAgfQorICAgIH0KKworICAgICNbYXN5bmNfdHJhaXRdCisgICAg aW1wbCBIYW5kbGVyIGZvciBHcm91cEJhc2VkSGFuZGxlciB7CisgICAgICAgIGZuIGF1dGhlbnRp Y2F0ZSgmc2VsZiwgX3VpZDogdTMyLCBnaWQ6IHUzMikgLT4gT3B0aW9uPFBlcm1pc3Npb25zPiB7 CisgICAgICAgICAgICBpZiBnaWQgPT0gc2VsZi5hbGxvd2VkX2dpZCB7CisgICAgICAgICAgICAg ICAgU29tZShQZXJtaXNzaW9uczo6UmVhZFdyaXRlKQorICAgICAgICAgICAgfSBlbHNlIHsKKyAg ICAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBh c3luYyBmbiBoYW5kbGUoJnNlbGYsIF9yZXF1ZXN0OiBSZXF1ZXN0KSAtPiBSZXNwb25zZSB7Cisg ICAgICAgICAgICBSZXNwb25zZTo6b2soYiJvayIudG9fdmVjKCkpCisgICAgICAgIH0KKyAgICB9 CisKKyAgICAjW3Rlc3RdCisgICAgI1tpZ25vcmVdIC8vIFJlcXVpcmVzIGxpYnFiLWRldgorICAg IGZuIHRlc3RfZ3JvdXBfYmFzZWRfYXV0aGVudGljYXRpb24oKSB7CisgICAgICAgIGxldCBzZXJ2 aWNlX25hbWUgPSB1bmlxdWVfc2VydmljZV9uYW1lKCk7CisgICAgICAgIGxldCBjdXJyZW50X2dp ZCA9IHVuc2FmZSB7IGxpYmM6OmdldGdpZCgpIH07CisgICAgICAgIGxldCBfc2VydmVyID0gc3Rh cnRfc2VydmVyKHNlcnZpY2VfbmFtZS5jbG9uZSgpLCBHcm91cEJhc2VkSGFuZGxlcjo6bmV3KGN1 cnJlbnRfZ2lkKSk7CisKKyAgICAgICAgd2FpdF9mb3Jfc2VydmVyX3JlYWR5KCZzZXJ2aWNlX25h bWUpOworCisgICAgICAgIGFzc2VydCEoCisgICAgICAgICAgICB0cnlfY29ubmVjdCgmc2Vydmlj ZV9uYW1lKSwKKyAgICAgICAgICAgICJTaG91bGQgYWNjZXB0IGNvbm5lY3Rpb24gZnJvbSBzYW1l IGdyb3VwIgorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9wbXhjZnMtcnMv cG14Y2ZzLWlwYy90ZXN0cy9xYl93aXJlX2NvbXBhdC5ycyBiL3NyYy9wbXhjZnMtcnMvcG14Y2Zz LWlwYy90ZXN0cy9xYl93aXJlX2NvbXBhdC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMC4uOGMwZGI5NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvcG14Y2ZzLXJzL3BteGNm cy1pcGMvdGVzdHMvcWJfd2lyZV9jb21wYXQucnMKQEAgLTAsMCArMSw0MTMgQEAKKy8vISBXaXJl IHByb3RvY29sIGNvbXBhdGliaWxpdHkgdGVzdCB3aXRoIGxpYnFiIEMgY2xpZW50cworLy8hCisv LyEgVGhpcyBpbnRlZ3JhdGlvbiB0ZXN0IHZlcmlmaWVzIHRoYXQgb3VyIFJ1c3QgU2VydmVyIGlz IGZ1bGx5IGNvbXBhdGlibGUKKy8vISB3aXRoIHJlYWwgbGlicWIgQyBjbGllbnRzIGJ5IHVzaW5n IGxpYnFiJ3MgY2xpZW50IEFQSSB2aWEgRkZJLgorLy8hCisvLyEgUnVuIHdpdGg6IGNhcmdvIHRl c3QgLS1wYWNrYWdlIHBteGNmcy1pcGMgLS10ZXN0IHFiX3dpcmVfY29tcGF0IC0tIC0taWdub3Jl ZCAtLW5vY2FwdHVyZQorLy8hCisvLyEgUmVxdWlyZXM6IGxpYnFiLWRldiBpbnN0YWxsZWQKKwor dXNlIHBteGNmc190ZXN0X3V0aWxzOjp3YWl0X2Zvcl9jb25kaXRpb25fYmxvY2tpbmc7Cit1c2Ug c3RkOjpmZmk6OkNTdHJpbmc7Cit1c2Ugc3RkOjp0aHJlYWQ7Cit1c2Ugc3RkOjp0aW1lOjpEdXJh dGlvbjsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTWluaW1hbCBsaWJxYiBGRkkgYmlu ZGluZ3MgKGNsaWVudC1zaWRlIG9ubHkpCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vLyBs aWJxYiByZXF1ZXN0IGhlYWRlciBtYXRjaGluZyBDJ3MgX19hdHRyaWJ1dGVfXyAoKGFsaWduZWQo OCkpKQorLy8vIEVhY2ggZmllbGQgaXMgaTMyIHdpdGggOC1ieXRlIGFsaWdubWVudCwgYWNoaWV2 ZWQgdmlhIGV4cGxpY2l0IHBhZGRpbmcKKyNbcmVwcihDLCBhbGlnbig4KSldCisjW2Rlcml2ZShE ZWJ1ZywgQ29weSwgQ2xvbmUpXQorc3RydWN0IFFiSXBjUmVxdWVzdEhlYWRlciB7CisgICAgaWQ6 IGkzMiwgICAgLy8gNCBieXRlcworICAgIF9wYWQxOiB1MzIsIC8vIDQgYnl0ZXMgcGFkZGluZwor ICAgIHNpemU6IGkzMiwgIC8vIDQgYnl0ZXMKKyAgICBfcGFkMjogdTMyLCAvLyA0IGJ5dGVzIHBh ZGRpbmcKK30KKworLy8vIGxpYnFiIHJlc3BvbnNlIGhlYWRlciBtYXRjaGluZyBDJ3MgX19hdHRy aWJ1dGVfXyAoKGFsaWduZWQoOCkpKQorLy8vIEVhY2ggZmllbGQgaXMgaTMyIHdpdGggOC1ieXRl IGFsaWdubWVudCwgYWNoaWV2ZWQgdmlhIGV4cGxpY2l0IHBhZGRpbmcKKyNbcmVwcihDLCBhbGln big4KSldCisjW2Rlcml2ZShEZWJ1ZywgQ29weSwgQ2xvbmUpXQorc3RydWN0IFFiSXBjUmVzcG9u c2VIZWFkZXIgeworICAgIGlkOiBpMzIsICAgIC8vIDQgYnl0ZXMKKyAgICBfcGFkMTogdTMyLCAv LyA0IGJ5dGVzIHBhZGRpbmcKKyAgICBzaXplOiBpMzIsICAvLyA0IGJ5dGVzCisgICAgX3BhZDI6 IHUzMiwgLy8gNCBieXRlcyBwYWRkaW5nCisgICAgZXJyb3I6IGkzMiwgLy8gNCBieXRlcworICAg IF9wYWQzOiB1MzIsIC8vIDQgYnl0ZXMgcGFkZGluZworfQorCisvLyBPcGFxdWUgdHlwZSBmb3Ig Y29ubmVjdGlvbiBoYW5kbGUKKyNbcmVwcihDKV0KK3N0cnVjdCBRYklwY2NDb25uZWN0aW9uIHsK KyAgICBfcHJpdmF0ZTogW3U4OyAwXSwKK30KKworI1tsaW5rKG5hbWUgPSAicWIiKV0KK3Vuc2Fm ZSBleHRlcm4gIkMiIHsKKyAgICAvLy8gQ29ubmVjdCB0byBhIFFCIElQQyBzZXJ2aWNlCisgICAg Ly8vIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlCisgICAgZm4gcWJfaXBjY19jb25uZWN0KG5hbWU6 ICpjb25zdCBsaWJjOjpjX2NoYXIsIG1heF9tc2dfc2l6ZTogdXNpemUpIC0+ICptdXQgUWJJcGNj Q29ubmVjdGlvbjsKKworICAgIC8vLyBTZW5kIHJlcXVlc3QgYW5kIHJlY2VpdmUgcmVzcG9uc2Ug KHdpdGggaW92ZWMpCisgICAgLy8vIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHJlY2VpdmVkLCBv ciBuZWdhdGl2ZSBlcnJubyBvbiBlcnJvcgorICAgIGZuIHFiX2lwY2Nfc2VuZHZfcmVjdigKKyAg ICAgICAgY29ubjogKm11dCBRYklwY2NDb25uZWN0aW9uLAorICAgICAgICBpb3Y6ICpjb25zdCBs aWJjOjppb3ZlYywKKyAgICAgICAgaW92X2xlbjogdTMyLAorICAgICAgICByZXNfYnVmOiAqbXV0 IGxpYmM6OmNfdm9pZCwKKyAgICAgICAgcmVzX2J1Zl9zaXplOiB1c2l6ZSwKKyAgICAgICAgdGlt ZW91dF9tczogaTMyLAorICAgICkgLT4gbGliYzo6c3NpemVfdDsKKworICAgIC8vLyBEaXNjb25u ZWN0IGZyb20gc2VydmljZQorICAgIGZuIHFiX2lwY2NfZGlzY29ubmVjdChjb25uOiAqbXV0IFFi SXBjY0Nvbm5lY3Rpb24pOworCisgICAgLy8vIEluaXRpYWxpemUgbGlicWIgbG9nZ2luZworICAg IGZuIHFiX2xvZ19pbml0KG5hbWU6ICpjb25zdCBsaWJjOjpjX2NoYXIsIGZhY2lsaXR5OiBpMzIs IHByaW9yaXR5OiBpMzIpOworCisgICAgLy8vIENvbnRyb2wgbG9nIHRhcmdldHMKKyAgICBmbiBx Yl9sb2dfY3RsKHRhcmdldDogaTMyLCBjb25mOiBpMzIsIGFyZzogaTMyKSAtPiBpMzI7CisKKyAg ICAvLy8gRmlsdGVyIGNvbnRyb2wKKyAgICBmbiBxYl9sb2dfZmlsdGVyX2N0bCgKKyAgICAgICAg dGFyZ2V0OiBpMzIsCisgICAgICAgIG9wOiBpMzIsCisgICAgICAgIHR5cGVfOiBpMzIsCisgICAg ICAgIHRleHQ6ICpjb25zdCBsaWJjOjpjX2NoYXIsCisgICAgICAgIHByaW9yaXR5OiBpMzIsCisg ICAgKSAtPiBpMzI7Cit9CisKKy8vIExvZyB0YXJnZXRzCitjb25zdCBRQl9MT0dfU1RERVJSOiBp MzIgPSAyOworCisvLyBMb2cgY29udHJvbCBvcGVyYXRpb25zCitjb25zdCBRQl9MT0dfQ09ORl9F TkFCTEVEOiBpMzIgPSAxOworCisvLyBMb2cgZmlsdGVyIG9wZXJhdGlvbnMKK2NvbnN0IFFCX0xP R19GSUxURVJfQUREOiBpMzIgPSAwOworY29uc3QgUUJfTE9HX0ZJTFRFUl9GSUxFOiBpMzIgPSAx OworCisvLyBMb2cgbGV2ZWxzIChmcm9tIHN5c2xvZy5oKQorY29uc3QgTE9HX1RSQUNFOiBpMzIg PSA4OyAvLyBMT0dfREVCVUcgKyAxCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIFNhZmUg UnVzdCB3cmFwcGVyIGFyb3VuZCBsaWJxYiBjbGllbnQKKy8vID09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K Kworc3RydWN0IFFiSXBjQ2xpZW50IHsKKyAgICBjb25uOiAqbXV0IFFiSXBjY0Nvbm5lY3Rpb24s Cit9CisKK2ltcGwgUWJJcGNDbGllbnQgeworICAgIGZuIGNvbm5lY3Qoc2VydmljZV9uYW1lOiAm c3RyLCBtYXhfbXNnX3NpemU6IHVzaXplKSAtPiBSZXN1bHQ8U2VsZiwgU3RyaW5nPiB7CisgICAg ICAgIGxldCBuYW1lID0gQ1N0cmluZzo6bmV3KHNlcnZpY2VfbmFtZSkubWFwX2Vycih8ZXwgZm9y bWF0ISgiSW52YWxpZCBzZXJ2aWNlIG5hbWU6IHtlfSIpKT87CisKKyAgICAgICAgbGV0IGNvbm4g PSB1bnNhZmUgeyBxYl9pcGNjX2Nvbm5lY3QobmFtZS5hc19wdHIoKSwgbWF4X21zZ19zaXplKSB9 OworCisgICAgICAgIGlmIGNvbm4uaXNfbnVsbCgpIHsKKyAgICAgICAgICAgIGxldCBlcnJubyA9 IHVuc2FmZSB7ICpsaWJjOjpfX2Vycm5vX2xvY2F0aW9uKCkgfTsKKyAgICAgICAgICAgIGxldCBl cnJvcl9zdHIgPSB1bnNhZmUgeworICAgICAgICAgICAgICAgIGxldCBlcnJfcHRyID0gbGliYzo6 c3RyZXJyb3IoZXJybm8pOworICAgICAgICAgICAgICAgIHN0ZDo6ZmZpOjpDU3RyOjpmcm9tX3B0 cihlcnJfcHRyKQorICAgICAgICAgICAgICAgICAgICAudG9fc3RyaW5nX2xvc3N5KCkKKyAgICAg ICAgICAgICAgICAgICAgLnRvX3N0cmluZygpCisgICAgICAgICAgICB9OworICAgICAgICAgICAg RXJyKGZvcm1hdCEoCisgICAgICAgICAgICAgICAgInFiX2lwY2NfY29ubmVjdCByZXR1cm5lZCBO VUxMIChlcnJubz17ZXJybm99OiB7ZXJyb3Jfc3RyfSkiCisgICAgICAgICAgICApKQorICAgICAg ICB9IGVsc2UgeworICAgICAgICAgICAgT2soU2VsZiB7IGNvbm4gfSkKKyAgICAgICAgfQorICAg IH0KKworICAgIGZuIHNlbmRfcmVjdigKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHJlcXVlc3Rf aWQ6IGkzMiwKKyAgICAgICAgcmVxdWVzdF9kYXRhOiAmW3U4XSwKKyAgICAgICAgdGltZW91dF9t czogaTMyLAorICAgICkgLT4gUmVzdWx0PChpMzIsIFZlYzx1OD4pLCBTdHJpbmc+IHsKKyAgICAg ICAgLy8gQnVpbGQgcmVxdWVzdAorICAgICAgICBsZXQgcmVxX2hlYWRlciA9IFFiSXBjUmVxdWVz dEhlYWRlciB7CisgICAgICAgICAgICBpZDogcmVxdWVzdF9pZCwKKyAgICAgICAgICAgIF9wYWQx OiAwLAorICAgICAgICAgICAgc2l6ZTogKHN0ZDo6bWVtOjpzaXplX29mOjo8UWJJcGNSZXF1ZXN0 SGVhZGVyPigpICsgcmVxdWVzdF9kYXRhLmxlbigpKSBhcyBpMzIsCisgICAgICAgICAgICBfcGFk MjogMCwKKyAgICAgICAgfTsKKworICAgICAgICAvLyBTZXR1cCBpb3ZlYworICAgICAgICBsZXQg bXV0IGlvdiA9IHZlYyFbbGliYzo6aW92ZWMgeworICAgICAgICAgICAgaW92X2Jhc2U6ICZyZXFf aGVhZGVyIGFzICpjb25zdCBfIGFzICptdXQgbGliYzo6Y192b2lkLAorICAgICAgICAgICAgaW92 X2xlbjogc3RkOjptZW06OnNpemVfb2Y6OjxRYklwY1JlcXVlc3RIZWFkZXI+KCksCisgICAgICAg IH1dOworCisgICAgICAgIGlmICFyZXF1ZXN0X2RhdGEuaXNfZW1wdHkoKSB7CisgICAgICAgICAg ICBpb3YucHVzaChsaWJjOjppb3ZlYyB7CisgICAgICAgICAgICAgICAgaW92X2Jhc2U6IHJlcXVl c3RfZGF0YS5hc19wdHIoKSBhcyAqbXV0IGxpYmM6OmNfdm9pZCwKKyAgICAgICAgICAgICAgICBp b3ZfbGVuOiByZXF1ZXN0X2RhdGEubGVuKCksCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQor CisgICAgICAgIC8vIFJlc3BvbnNlIGJ1ZmZlcgorICAgICAgICBjb25zdCBNQVhfUkVTUE9OU0U6 IHVzaXplID0gODE5MiAqIDEyODsKKyAgICAgICAgbGV0IG11dCByZXNwX2J1ZiA9IHZlYyFbMHU4 OyBNQVhfUkVTUE9OU0VdOworCisgICAgICAgIC8vIFNlbmQgYW5kIHJlY2VpdmUKKyAgICAgICAg bGV0IHJlc3VsdCA9IHVuc2FmZSB7CisgICAgICAgICAgICBxYl9pcGNjX3NlbmR2X3JlY3YoCisg ICAgICAgICAgICAgICAgc2VsZi5jb25uLAorICAgICAgICAgICAgICAgIGlvdi5hc19wdHIoKSwK KyAgICAgICAgICAgICAgICBpb3YubGVuKCkgYXMgdTMyLAorICAgICAgICAgICAgICAgIHJlc3Bf YnVmLmFzX211dF9wdHIoKSBhcyAqbXV0IGxpYmM6OmNfdm9pZCwKKyAgICAgICAgICAgICAgICBy ZXNwX2J1Zi5sZW4oKSwKKyAgICAgICAgICAgICAgICB0aW1lb3V0X21zLAorICAgICAgICAgICAg KQorICAgICAgICB9OworCisgICAgICAgIGlmIHJlc3VsdCA8IDAgeworICAgICAgICAgICAgcmV0 dXJuIEVycihmb3JtYXQhKCJxYl9pcGNjX3NlbmR2X3JlY3YgZmFpbGVkOiB7fSIsIC1yZXN1bHQp KTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBieXRlc19yZWNlaXZlZCA9IHJlc3VsdCBhcyB1 c2l6ZTsKKworICAgICAgICAvLyBQYXJzZSByZXNwb25zZSBoZWFkZXIKKyAgICAgICAgaWYgYnl0 ZXNfcmVjZWl2ZWQgPCBzdGQ6Om1lbTo6c2l6ZV9vZjo6PFFiSXBjUmVzcG9uc2VIZWFkZXI+KCkg eworICAgICAgICAgICAgcmV0dXJuIEVycigiUmVzcG9uc2UgdG9vIHNob3J0Ii50b19zdHJpbmco KSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgcmVzcF9oZWFkZXIgPSB1bnNhZmUgeyAqKHJl c3BfYnVmLmFzX3B0cigpIGFzICpjb25zdCBRYklwY1Jlc3BvbnNlSGVhZGVyKSB9OworCisgICAg ICAgIC8vIFZlcmlmeSByZXNwb25zZSBJRCBtYXRjaGVzIHJlcXVlc3QKKyAgICAgICAgaWYgcmVz cF9oZWFkZXIuaWQgIT0gcmVxdWVzdF9pZCB7CisgICAgICAgICAgICByZXR1cm4gRXJyKGZvcm1h dCEoCisgICAgICAgICAgICAgICAgIlJlc3BvbnNlIElEIG1pc21hdGNoOiBleHBlY3RlZCB7fSwg Z290IHt9IiwKKyAgICAgICAgICAgICAgICByZXF1ZXN0X2lkLCByZXNwX2hlYWRlci5pZAorICAg ICAgICAgICAgKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBFeHRyYWN0IGRhdGEKKyAgICAg ICAgbGV0IGRhdGFfc3RhcnQgPSBzdGQ6Om1lbTo6c2l6ZV9vZjo6PFFiSXBjUmVzcG9uc2VIZWFk ZXI+KCk7CisgICAgICAgIGxldCBkYXRhID0gcmVzcF9idWZbZGF0YV9zdGFydC4uYnl0ZXNfcmVj ZWl2ZWRdLnRvX3ZlYygpOworCisgICAgICAgIE9rKChyZXNwX2hlYWRlci5lcnJvciwgZGF0YSkp CisgICAgfQorfQorCitpbXBsIERyb3AgZm9yIFFiSXBjQ2xpZW50IHsKKyAgICBmbiBkcm9wKCZt dXQgc2VsZikgeworICAgICAgICB1bnNhZmUgeworICAgICAgICAgICAgcWJfaXBjY19kaXNjb25u ZWN0KHNlbGYuY29ubik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vID09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KKy8vIEludGVncmF0aW9uIFRlc3QKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworI1t0 ZXN0XQorI1tpZ25vcmVdIC8vIFJ1biB3aXRoOiBjYXJnbyB0ZXN0IC0tIC0taWdub3JlZAorZm4g dGVzdF9saWJxYl93aXJlX3Byb3RvY29sX2NvbXBhdGliaWxpdHkoKSB7CisgICAgZXByaW50bG4h KCLwn6eqIFN0YXJ0aW5nIHdpcmUgcHJvdG9jb2wgY29tcGF0aWJpbGl0eSB0ZXN0Iik7CisKKyAg ICAvLyBDaGVjayBpZiBsaWJxYiBpcyBhdmFpbGFibGUKKyAgICBlcHJpbnRsbiEoIvCflI0gQ2hl Y2tpbmcgaWYgbGlicWIgaXMgYXZhaWxhYmxlLi4uIik7CisgICAgaWYgIWNoZWNrX2xpYnFiX2F2 YWlsYWJsZSgpIHsKKyAgICAgICAgZXByaW50bG4hKCLij63vuI8gIFNLSVA6IGxpYnFiIG5vdCBp bnN0YWxsZWQiKTsKKyAgICAgICAgZXByaW50bG4hKCIgICBJbnN0YWxsIHdpdGg6IHN1ZG8gYXB0 LWdldCBpbnN0YWxsIGxpYnFiLWRldiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGVw cmludGxuISgi4pyTIGxpYnFiIGlzIGF2YWlsYWJsZSIpOworCisgICAgLy8gU3RhcnQgdGVzdCBz ZXJ2ZXIKKyAgICBlcHJpbnRsbiEoIvCfmoAgU3RhcnRpbmcgdGVzdCBzZXJ2ZXIuLi4iKTsKKyAg ICBsZXQgc2VydmVyX2hhbmRsZSA9IHN0YXJ0X3Rlc3Rfc2VydmVyKCk7CisgICAgZXByaW50bG4h KCLinJMgU2VydmVyIHRocmVhZCBzcGF3bmVkIik7CisKKyAgICAvLyBXYWl0IGZvciBzZXJ2ZXIg dG8gYmUgcmVhZHkKKyAgICBlcHJpbnRsbiEoIuKPsyBXYWl0aW5nIGZvciBzZXJ2ZXIgaW5pdGlh bGl6YXRpb24uLi4iKTsKKyAgICB3YWl0X2Zvcl9zZXJ2ZXJfcmVhZHkoInB2ZTIiKTsKKyAgICBl cHJpbnRsbiEoIuKckyBTZXJ2ZXIgaXMgcmVhZHkiKTsKKworICAgIC8vIFJ1biB0ZXN0cworICAg IGVwcmludGxuISgi8J+nqiBSdW5uaW5nIGNsaWVudCB0ZXN0cy4uLiIpOworICAgIGxldCB0ZXN0 X3Jlc3VsdCA9IHJ1bl9jbGllbnRfdGVzdHMoKTsKKworICAgIC8vIENsZWFudXAKKyAgICBkcm9w KHNlcnZlcl9oYW5kbGUpOworCisgICAgLy8gQXNzZXJ0IHJlc3VsdHMKKyAgICBhc3NlcnQhKAor ICAgICAgICB0ZXN0X3Jlc3VsdC5pc19vaygpLAorICAgICAgICAiQ2xpZW50IHRlc3RzIGZhaWxl ZDogezo/fSIsCisgICAgICAgIHRlc3RfcmVzdWx0LmVycigpCisgICAgKTsKK30KKworZm4gY2hl Y2tfbGlicWJfYXZhaWxhYmxlKCkgLT4gYm9vbCB7CisgICAgc3RkOjpwcm9jZXNzOjpDb21tYW5k OjpuZXcoInBrZy1jb25maWciKQorICAgICAgICAuYXJncyhbIi0tZXhpc3RzIiwgImxpYnFiIl0p CisgICAgICAgIC5zdGF0dXMoKQorICAgICAgICAubWFwKHxzfCBzLnN1Y2Nlc3MoKSkKKyAgICAg ICAgLnVud3JhcF9vcihmYWxzZSkKK30KKworZm4gc3RhcnRfdGVzdF9zZXJ2ZXIoKSAtPiB0aHJl YWQ6OkpvaW5IYW5kbGU8KCk+IHsKKyAgICB1c2UgYXN5bmNfdHJhaXQ6OmFzeW5jX3RyYWl0Owor ICAgIHVzZSBwbXhjZnNfaXBjOjp7SGFuZGxlciwgUmVxdWVzdCwgUmVzcG9uc2UsIFNlcnZlcn07 CisKKyAgICAvLyBDcmVhdGUgdGVzdCBoYW5kbGVyCisgICAgc3RydWN0IFRlc3RIYW5kbGVyOwor CisgICAgI1thc3luY190cmFpdF0KKyAgICBpbXBsIEhhbmRsZXIgZm9yIFRlc3RIYW5kbGVyIHsK KyAgICAgICAgZm4gYXV0aGVudGljYXRlKCZzZWxmLCBfdWlkOiB1MzIsIF9naWQ6IHUzMikgLT4g T3B0aW9uPHBteGNmc19pcGM6OlBlcm1pc3Npb25zPiB7CisgICAgICAgICAgICAvLyBBY2NlcHQg YWxsIGNvbm5lY3Rpb25zIHdpdGggcmVhZC13cml0ZSBhY2Nlc3MgZm9yIHRlc3RpbmcKKyAgICAg ICAgICAgIFNvbWUocG14Y2ZzX2lwYzo6UGVybWlzc2lvbnM6OlJlYWRXcml0ZSkKKyAgICAgICAg fQorCisgICAgICAgIGFzeW5jIGZuIGhhbmRsZSgmc2VsZiwgcmVxdWVzdDogUmVxdWVzdCkgLT4g UmVzcG9uc2UgeworICAgICAgICAgICAgbWF0Y2ggcmVxdWVzdC5tc2dfaWQgeworICAgICAgICAg ICAgICAgIDEgPT4geworICAgICAgICAgICAgICAgICAgICAvLyBDRlNfSVBDX0dFVF9GU19WRVJT SU9OCisgICAgICAgICAgICAgICAgICAgIGxldCByZXNwb25zZV9zdHIgPSByIyJ7InZlcnNpb24i OjEsInByb3RvY29sIjoxfSIjOworICAgICAgICAgICAgICAgICAgICBSZXNwb25zZTo6b2socmVz cG9uc2Vfc3RyLmFzX2J5dGVzKCkudG9fdmVjKCkpCisgICAgICAgICAgICAgICAgfQorICAgICAg ICAgICAgICAgIDIgPT4geworICAgICAgICAgICAgICAgICAgICAvLyBDRlNfSVBDX0dFVF9DTFVT VEVSX0lORk8KKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3BvbnNlX3N0ciA9IHIjInsibm9k ZXMiOltdLCJxdW9yYXRlIjpmYWxzZX0iIzsKKyAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2U6 Om9rKHJlc3BvbnNlX3N0ci5hc19ieXRlcygpLnRvX3ZlYygpKQorICAgICAgICAgICAgICAgIH0K KyAgICAgICAgICAgICAgICAzID0+IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ0ZTX0lQQ19H RVRfR1VFU1RfTElTVAorICAgICAgICAgICAgICAgICAgICBsZXQgcmVzcG9uc2Vfc3RyID0gciMi eyJkYXRhIjpbXX0iIzsKKyAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2U6Om9rKHJlc3BvbnNl X3N0ci5hc19ieXRlcygpLnRvX3ZlYygpKQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg ICAgICBfID0+IFJlc3BvbnNlOjplcnIoLWxpYmM6OkVJTlZBTCksCisgICAgICAgICAgICB9Cisg ICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTcGF3biBzZXJ2ZXIgdGhyZWFkIHdpdGggdG9raW8g cnVudGltZQorICAgIHRocmVhZDo6c3Bhd24obW92ZSB8fCB7CisgICAgICAgIC8vIEluaXRpYWxp emUgdHJhY2luZyBmb3Igc2VydmVyIChXQVJOIGxldmVsIC0gc2lsZW50IG9uIHN1Y2Nlc3MpCisg ICAgICAgIHRyYWNpbmdfc3Vic2NyaWJlcjo6Zm10KCkKKyAgICAgICAgICAgIC53aXRoX21heF9s ZXZlbCh0cmFjaW5nOjpMZXZlbDo6V0FSTikKKyAgICAgICAgICAgIC53aXRoX3RhcmdldChmYWxz ZSkKKyAgICAgICAgICAgIC5pbml0KCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRva2lvIHJ1bnRp bWUgZm9yIGFzeW5jIHNlcnZlcgorICAgICAgICBsZXQgcnQgPSB0b2tpbzo6cnVudGltZTo6UnVu dGltZTo6bmV3KCkuZXhwZWN0KCJGYWlsZWQgdG8gY3JlYXRlIHRva2lvIHJ1bnRpbWUiKTsKKwor ICAgICAgICBydC5ibG9ja19vbihhc3luYyB7CisgICAgICAgICAgICBsZXQgbXV0IHNlcnZlciA9 IFNlcnZlcjo6bmV3KCJwdmUyIiwgVGVzdEhhbmRsZXIpOworCisgICAgICAgICAgICAvLyBTZXJ2 ZXIgdXNlcyBhYnN0cmFjdCBVbml4IHNvY2tldCAoTGludXgtc3BlY2lmaWMpCisgICAgICAgICAg ICBpZiBsZXQgRXJyKGUpID0gc2VydmVyLnN0YXJ0KCkgeworICAgICAgICAgICAgICAgIGVwcmlu dGxuISgiU2VydmVyIHN0YXJ0dXAgZmFpbGVkOiB7ZX0iKTsKKyAgICAgICAgICAgICAgICBlcHJp bnRsbiEoIkVycm9yIGRldGFpbHM6IHtlOj99Iik7CisgICAgICAgICAgICAgICAgcGFuaWMhKCJT ZXJ2ZXIgc3RhcnR1cCBmYWlsZWQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8g R2l2ZSB0b2tpbyBhIGNoYW5jZSB0byBzdGFydCB0aGUgYWNjZXB0b3IgdGFzaworICAgICAgICAg ICAgdG9raW86OnRhc2s6OnlpZWxkX25vdygpLmF3YWl0OworCisgICAgICAgICAgICAvLyBCbG9j ayBmb3JldmVyIHRvIGtlZXAgc2VydmVyIGFsaXZlCisgICAgICAgICAgICBzdGQ6OmZ1dHVyZTo6 cGVuZGluZzo6PCgpPigpLmF3YWl0OworICAgICAgICB9KTsKKyAgICB9KQorfQorCisvLy8gV2Fp dCBmb3Igc2VydmVyIHRvIGJlIHJlYWR5IGJ5IGNoZWNraW5nIGlmIHNvY2tldCBmaWxlIGV4aXN0 cworZm4gd2FpdF9mb3Jfc2VydmVyX3JlYWR5KHNlcnZpY2VfbmFtZTogJnN0cikgeworICAgIGFz c2VydCEoCisgICAgICAgIHdhaXRfZm9yX2NvbmRpdGlvbl9ibG9ja2luZygKKyAgICAgICAgICAg IHx8IHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBzb2NrZXQgZmlsZSBleGlzdHMgaW4g L2Rldi9zaG0KKyAgICAgICAgICAgICAgICBsZXQgc29ja2V0X3BhdHRlcm4gPSBmb3JtYXQhKCIv ZGV2L3NobS9xYi17c2VydmljZV9uYW1lfS0iKTsKKyAgICAgICAgICAgICAgICBpZiBsZXQgT2so ZW50cmllcykgPSBzdGQ6OmZzOjpyZWFkX2RpcigiL2Rldi9zaG0iKSB7CisgICAgICAgICAgICAg ICAgICAgIGZvciBlbnRyeSBpbiBlbnRyaWVzLmZsYXR0ZW4oKSB7CisgICAgICAgICAgICAgICAg ICAgICAgICBpZiBsZXQgT2sobmFtZSkgPSBlbnRyeS5maWxlX25hbWUoKS5pbnRvX3N0cmluZygp CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbmFtZS5zdGFydHNfd2l0aCgmc29ja2V0 X3BhdHRlcm4pCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmFsc2UK KyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBEdXJhdGlvbjo6ZnJvbV9zZWNzKDUpLAorICAg ICAgICAgICAgRHVyYXRpb246OmZyb21fbWlsbGlzKDEwKSwKKyAgICAgICAgKSwKKyAgICAgICAg IlNlcnZlciBzaG91bGQgYmUgcmVhZHkgd2l0aGluIDUgc2Vjb25kcyIKKyAgICApOworfQorCitm biBydW5fY2xpZW50X3Rlc3RzKCkgLT4gUmVzdWx0PCgpLCBTdHJpbmc+IHsKKyAgICAvLyBFbmFi bGUgbGlicWIgZGVidWcgbG9nZ2luZyB0byBzZWUgd2hhdCdzIGhhcHBlbmluZworICAgIGVwcmlu dGxuISgi8J+UpyBFbmFibGluZyBsaWJxYiBkZWJ1ZyBsb2dnaW5nLi4uIik7CisgICAgdW5zYWZl IHsKKyAgICAgICAgbGV0IG5hbWUgPSBDU3RyaW5nOjpuZXcoInFiX3Rlc3QiKS51bndyYXAoKTsK KyAgICAgICAgcWJfbG9nX2luaXQobmFtZS5hc19wdHIoKSwgbGliYzo6TE9HX1VTRVIsIExPR19U UkFDRSk7CisgICAgICAgIHFiX2xvZ19jdGwoUUJfTE9HX1NUREVSUiwgUUJfTE9HX0NPTkZfRU5B QkxFRCwgMSk7CisgICAgICAgIC8vIEVuYWJsZSBhbGwgbG9nIG1lc3NhZ2VzIGZyb20gYWxsIGZp bGVzIGF0IFRSQUNFIGxldmVsCisgICAgICAgIGxldCBhbGxfZmlsZXMgPSBDU3RyaW5nOjpuZXco IioiKS51bndyYXAoKTsKKyAgICAgICAgcWJfbG9nX2ZpbHRlcl9jdGwoCisgICAgICAgICAgICBR Ql9MT0dfU1RERVJSLAorICAgICAgICAgICAgUUJfTE9HX0ZJTFRFUl9BREQsCisgICAgICAgICAg ICBRQl9MT0dfRklMVEVSX0ZJTEUsCisgICAgICAgICAgICBhbGxfZmlsZXMuYXNfcHRyKCksCisg ICAgICAgICAgICBMT0dfVFJBQ0UsCisgICAgICAgICk7CisgICAgfQorICAgIGVwcmludGxuISgi 4pyTIGxpYnFiIGxvZ2dpbmcgZW5hYmxlZCAoVFJBQ0UgbGV2ZWwpIik7CisKKyAgICBlcHJpbnRs biEoIvCfk6EgQ29ubmVjdGluZyB0byBzZXJ2ZXIuLi4iKTsKKyAgICAvLyBDb25uZWN0IHRvIGFi c3RyYWN0IHNvY2tldCAicHZlMiIKKyAgICAvLyBVc2UgYSB2ZXJ5IGxhcmdlIGJ1ZmZlciBzaXpl IHRvIHJ1bGUgb3V0IHNwYWNlIGlzc3VlcworICAgIGxldCBjbGllbnQgPSBRYklwY0NsaWVudDo6 Y29ubmVjdCgicHZlMiIsIDgxOTIgKiAxMDI0KT87IC8vIDhNQiBpbnN0ZWFkIG9mIDFNQgorICAg IGVwcmludGxuISgi4pyTIENvbm5lY3RlZCBzdWNjZXNzZnVsbHkiKTsKKworICAgIGVwcmludGxu ISgi8J+nqiBUZXN0IDE6IEdFVF9GU19WRVJTSU9OIik7CisgICAgLy8gVGVzdCAxOiBHRVRfRlNf VkVSU0lPTgorICAgIGxldCAoZXJyb3IsIGRhdGEpID0gY2xpZW50LnNlbmRfcmVjdigxLCAmW10s IDUwMDApPzsKKyAgICBlcHJpbnRsbiEoIuKckyBHb3QgcmVzcG9uc2U6IGVycm9yPXt9LCBkYXRh X2xlbj17fSIsIGVycm9yLCBkYXRhLmxlbigpKTsKKyAgICBpZiBlcnJvciA9PSAwIHsKKyAgICAg ICAgbGV0IHJlc3BvbnNlID0gU3RyaW5nOjpmcm9tX3V0ZjhfbG9zc3koJmRhdGEpOworICAgICAg ICBlcHJpbnRsbiEoIiAgUmVzcG9uc2U6IHtyZXNwb25zZX0iKTsKKyAgICAgICAgYXNzZXJ0ISgK KyAgICAgICAgICAgIHJlc3BvbnNlLmNvbnRhaW5zKCJ2ZXJzaW9uIiksCisgICAgICAgICAgICAi UmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gdmVyc2lvbiBmaWVsZCIKKyAgICAgICAgKTsKKyAgICB9 CisKKyAgICBlcHJpbnRsbiEoIvCfp6ogVGVzdCAyOiBHRVRfQ0xVU1RFUl9JTkZPIik7CisgICAg Ly8gVGVzdCAyOiBHRVRfQ0xVU1RFUl9JTkZPCisgICAgbGV0IChlcnJvciwgZGF0YSkgPSBjbGll bnQuc2VuZF9yZWN2KDIsICZbXSwgNTAwMCk/OworICAgIGVwcmludGxuISgi4pyTIEdvdCByZXNw b25zZTogZXJyb3I9e30sIGRhdGFfbGVuPXt9IiwgZXJyb3IsIGRhdGEubGVuKCkpOworICAgIGlm IGVycm9yID09IDAgeworICAgICAgICBsZXQgcmVzcG9uc2UgPSBTdHJpbmc6OmZyb21fdXRmOF9s b3NzeSgmZGF0YSk7CisgICAgICAgIGVwcmludGxuISgiICBSZXNwb25zZToge3Jlc3BvbnNlfSIp OworICAgICAgICBhc3NlcnQhKAorICAgICAgICAgICAgcmVzcG9uc2UuY29udGFpbnMoIm5vZGVz IiksCisgICAgICAgICAgICAiUmVzcG9uc2Ugc2hvdWxkIGNvbnRhaW4gbm9kZXMgZmllbGQiCisg ICAgICAgICk7CisgICAgfQorCisgICAgZXByaW50bG4hKCLwn6eqIFRlc3QgMzogUmVxdWVzdCB3 aXRoIGRhdGEgcGF5bG9hZCIpOworICAgIC8vIFRlc3QgMzogUmVxdWVzdCB3aXRoIGRhdGEgcGF5 bG9hZAorICAgIGxldCB0ZXN0X3BheWxvYWQgPSBiInRlc3RfcGF5bG9hZF9kYXRhIjsKKyAgICBs ZXQgKF9lcnJvciwgX2RhdGEpID0gY2xpZW50LnNlbmRfcmVjdigxLCB0ZXN0X3BheWxvYWQsIDUw MDApPzsKKyAgICBlcHJpbnRsbiEoIuKckyBSZXF1ZXN0IHdpdGggcGF5bG9hZCBzdWNjZWVkZWQi KTsKKworICAgIGVwcmludGxuISgi8J+nqiBUZXN0IDQ6IEdFVF9HVUVTVF9MSVNUIik7CisgICAg Ly8gVGVzdCA0OiBHRVRfR1VFU1RfTElTVAorICAgIGxldCAoX2Vycm9yLCBfZGF0YSkgPSBjbGll bnQuc2VuZF9yZWN2KDMsICZbXSwgNTAwMCk/OworICAgIGVwcmludGxuISgi4pyTIEdFVF9HVUVT VF9MSVNUIHN1Y2NlZWRlZCIpOworCisgICAgT2soKCkpCit9Ci0tIAoyLjQ3LjMKCgoKX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KcHZlLWRldmVsIG1haWxp bmcgbGlzdApwdmUtZGV2ZWxAbGlzdHMucHJveG1veC5jb20KaHR0cHM6Ly9saXN0cy5wcm94bW94 LmNvbS9jZ2ktYmluL21haWxtYW4vbGlzdGluZm8vcHZlLWRldmVsCg==