Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sBk8d-000zxe-3N for pgsql-hackers@arkaria.postgresql.org; Mon, 27 May 2024 23:52:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1sBk8c-0083EJ-WB for pgsql-hackers@arkaria.postgresql.org; Mon, 27 May 2024 23:52:23 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1sBk8c-0083EB-Ie for pgsql-hackers@lists.postgresql.org; Mon, 27 May 2024 23:52:22 +0000 Received: from mail-lj1-x22e.google.com ([2a00:1450:4864:20::22e]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.94.2) (envelope-from ) id 1sBk8Y-0015mQ-CH for pgsql-hackers@lists.postgresql.org; Mon, 27 May 2024 23:52:21 +0000 Received: by mail-lj1-x22e.google.com with SMTP id 38308e7fff4ca-2e73359b8fbso1946001fa.2 for ; Mon, 27 May 2024 16:52:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1716853937; x=1717458737; darn=lists.postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=jNOkM+wzP7OfhptoT3n/2FdcjNJObLDs5Vf4hOO11pM=; b=FrC3w7pzu3tQDidtxv1IROZR68XYX+CYw7GwuCMIr2l+gkTiL9bwSX8ntqbsCfLbFJ +PODbwtEX9AWUER7igbx5Vf8w2hsFeDPakzD9EfBl+GZuYc5H54A/vwtN8IZxqtoTfge 7iSFpSte/daoWT4SY1wHfxYLPhKlYbiNuQoBlYJ+HwnZwMhskvtP47FxiZaolcv3fSPr CeeeVzvxII+8xa7EdcRdZ7FnQ4mju8hhcmT+5/HGfyrRTjgpIR3+D4uvZaV+oZ6/dfaa UVsN08Rr+t/Npk02RG8/IOhXelnZCQdB6LyURgT7Ff9WI5vohSNoALSVu38wOeR4f49q 9CBw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1716853937; x=1717458737; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=jNOkM+wzP7OfhptoT3n/2FdcjNJObLDs5Vf4hOO11pM=; b=C5BC8JfyLwGHUI8CDOjWTNf23GMrVnCWsPR48Z5BRrQQ0UJyDAEjI//Kaswu/qJ7bV ZMaxNya11jvkmU+uBHvspDmEZB6bXUfJhh7qs+jIJFHDMlFvIUPw3ncdzHDoaE0GCgp6 L3orpDvkdQMlpJuSSyeqnpRM36ZWZRjG9bUx5asZIBcAW+jOGzXwc/N6N4sHzlbMv8S1 E9wM1JormHKdZ8Eze+VVvWzGqbYQnRrZbVBW0+WsBMwuurSLUMX4laLQhQLLUKRY5PPe ZO0c7VEz3tOvr4ngfTtz3RQ1liXXCXj2xWf7r1zMe4+j0yyyihfEQi5p09OxMQNjcvog vpNw== X-Forwarded-Encrypted: i=1; AJvYcCUWRYGct/uV4rTh0DwCSMlWaXtBsAo+0CijvSKwV3UXAEj2Q4qHoWNow4C0/dBB3a8TDMA6+upX7CAk6StjAT/wodu8wwjy/jzpidWTiO+o3HG/ X-Gm-Message-State: AOJu0YzvkOYJgE6sjzZ0mhgSj6aVYrjFEnMjdCRkU2h8N3/nJATFoMNZ ptwXgza9OFIqP2umpu9KPgOtuU/NPO8IPH0/m00DS5guPxUSAU70 X-Google-Smtp-Source: AGHT+IF+DPCLWE2JmIzmLti1zEloMcUyNjxAWMyqQVr70YfEUxpoUyb3AYFcttsMbHbAChZ7MF916Q== X-Received: by 2002:a2e:3610:0:b0:2e9:816b:da67 with SMTP id 38308e7fff4ca-2e9816bdc81mr18321431fa.6.1716853936425; Mon, 27 May 2024 16:52:16 -0700 (PDT) Received: from ?IPV6:2a01:4b00:c00c:a500:9e12:254:4924:825a? ([2a01:4b00:c00c:a500:9e12:254:4924:825a]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-42100f1399asm155789055e9.11.2024.05.27.16.52.15 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 27 May 2024 16:52:15 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------5pjSR2798GAoXN6eF47sh1Xz" Message-ID: <76a11eea-c5ae-4034-971d-c8a2df0bb14d@gmail.com> Date: Tue, 28 May 2024 00:52:15 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: CREATE INDEX CONCURRENTLY on partitioned index To: Alexander Pyhalov Cc: Justin Pryzby , pgsql-hackers@lists.postgresql.org, Masahiko Sawada , Michael Paquier , =?UTF-8?B?5p2O5p2wKOaFjui/vSk=?= References: <20210226182019.GU20769@telsasoft.com> <04657227cc37b6353cf0c72bedac70cc@postgrespro.ru> <20220628183309.GD28130@telsasoft.com> <20221121030011.GU11463@telsasoft.com> <5bafee07d0e1b3ce5359d1656c90b4836d7cb6a1.camel@gmail.com> <20221204190935.GD14156@telsasoft.com> <37d3f0a984a15f6465b83027eed8c588@postgrespro.ru> <8fe0027c-a4f9-43a0-afc1-20362c159d07@gmail.com> Content-Language: en-US From: Ilya Gladyshev In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------5pjSR2798GAoXN6eF47sh1Xz Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 24.05.2024 10:04, Alexander Pyhalov wrote: > Ilya Gladyshev писал(а) 2024-05-24 00:14: >> Hi, > > Hi. > >> >> I think it's well worth the effort to revive the patch, so I rebased >> it on master, updated it and will return it back to the commitfest. >> Alexander, Justin feel free to add yourselves as authors >> >> On 29.01.2024 12:43, Alexander Pyhalov wrote: >>> Hi. >>> >>> I've rebased patch on master and it'seems to me there's one more >>> issue - >>> >>> when we call DefineIndexConcurrentInternal() in partitioned case, it >>> waits for transactions, locking tableId, not tabrelid - heaprelid >>> LockRelId is constructed for parent index relation, not for child >>> index relation. >>> >>> Attaching fixed version. >>> >>> Also I'm not sure what to do with locking of child relations. If we >>> don't do anything, you can drop one of the partitioned table childs >>> while CIC is in progress, and get error >>> >>> ERROR:  cache lookup failed for index 16399 >> I agree that we need to do something about it, in particular, I think >> we should lock all the partitions inside the transaction that builds >> the catalog entries. Fixed this in the new version. >>> If you try to lock all child tables in CIC session, you'll get >>> deadlocks. >> >> Do you mean the deadlock between the transaction that drops a >> partition and the transaction doing CIC? I think this is unavoidable >> and can be reproduced even without partitioning. > > Yes, it seems we trade this error for possible deadlock between > transaction, dropping a partition, and CIC. > >> >> Also not sure why a list of children relation was obtained with >> ShareLock that CIC is supposed to avoid not to block writes, changed >> that to ShareUpdateExclusive. >> > > I expect that it wasn't an issue due to the fact that it's held for a > brief period until DefineIndexConcurrentInternal() commits for the > first time. But it seems, it's more correct to use > ShareUpdateExclusive lock here. > > > Also I'd like to note that in new patch version there's a strange > wording in documentation: > > "This can be very convenient as not only will all existing partitions be >  indexed, but any future partitions will be as well. >  CREATE INDEX ... CONCURRENTLY can incur long lock > times >  on huge partitioned tables, to avoid that you can >  use CREATE INDEX ON ONLY the partitioned table, which >  creates the new index marked as invalid, preventing automatic > application >  to existing partitions." > > All the point of CIC is to avoid long lock times. So it seems this > paragraph should be rewritten in the following way: > > "To avoid long lock times, you can use CREATE INDEX CONCURRENTLY or > CREATE INDEX ON ONLY the partitioned table..." True, the current wording doesn't look right. Right now CREATE INDEX ON ONLY is described as a workaround for the missing CIC. I think it rather makes sense to say that it gives more fine-grained control of partition locking than both CIC and ordinary CREATE INDEX. See the updated patch. --------------5pjSR2798GAoXN6eF47sh1Xz Content-Type: text/x-patch; charset=UTF-8; name="v3-0001-Allow-CREATE-INDEX-CONCURRENTLY-on-partitioned-ta.patch" Content-Disposition: attachment; filename*0="v3-0001-Allow-CREATE-INDEX-CONCURRENTLY-on-partitioned-ta.pa"; filename*1="tch" Content-Transfer-Encoding: base64 RnJvbSA3Njg3YjRjM2JhMTBmYzFkZjVjYTRjOGY1MDE5OGRmYjI2OWJlOGJiIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiBJbHlhIEdsYWR5c2hldiA8aWx5YS52LmdsYWR5c2hl dkBnbWFpbC5jb20+CkRhdGU6IFRodSwgMjMgTWF5IDIwMjQgMTg6MTM6NDEgKzAxMDAKU3Vi amVjdDogW1BBVENIIHYzXSBBbGxvdyBDUkVBVEUgSU5ERVggQ09OQ1VSUkVOVExZIG9uIHBh cnRpdGlvbmVkIHRhYmxlCgotLS0KIGRvYy9zcmMvc2dtbC9kZGwuc2dtbCAgICAgICAgICAg ICAgICAgIHwgIDEwICstCiBkb2Mvc3JjL3NnbWwvcmVmL2NyZWF0ZV9pbmRleC5zZ21sICAg ICB8ICAxNCArLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMgICAgICAgfCAy OTMgKysrKysrKysrKysrKysrKysrLS0tLS0tLQogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3Rl ZC9pbmRleGluZy5vdXQgfCAxMjcgKysrKysrKysrKy0KIHNyYy90ZXN0L3JlZ3Jlc3Mvc3Fs L2luZGV4aW5nLnNxbCAgICAgIHwgIDI2ICsrLQogNSBmaWxlcyBjaGFuZ2VkLCAzNjggaW5z ZXJ0aW9ucygrKSwgMTAyIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dt bC9kZGwuc2dtbCBiL2RvYy9zcmMvc2dtbC9kZGwuc2dtbAppbmRleCA2YWFiNzllOTAxLi45 MDQ5NzhjNmU1IDEwMDY0NAotLS0gYS9kb2Mvc3JjL3NnbWwvZGRsLnNnbWwKKysrIGIvZG9j L3NyYy9zZ21sL2RkbC5zZ21sCkBAIC00MzE0LDE0ICs0MzE0LDEyIEBAIEFMVEVSIFRBQkxF IG1lYXN1cmVtZW50IEFUVEFDSCBQQVJUSVRJT04gbWVhc3VyZW1lbnRfeTIwMDhtMDIKICAg ICAgQXMgbWVudGlvbmVkIGVhcmxpZXIsIGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBpbmRl eGVzIG9uIHBhcnRpdGlvbmVkCiAgICAgIHRhYmxlcyBzbyB0aGF0IHRoZXkgYXJlIGFwcGxp ZWQgYXV0b21hdGljYWxseSB0byB0aGUgZW50aXJlIGhpZXJhcmNoeS4KICAgICAgVGhpcyBj YW4gYmUgdmVyeSBjb252ZW5pZW50IGFzIG5vdCBvbmx5IHdpbGwgYWxsIGV4aXN0aW5nIHBh cnRpdGlvbnMgYmUKLSAgICAgaW5kZXhlZCwgYnV0IGFueSBmdXR1cmUgcGFydGl0aW9ucyB3 aWxsIGJlIGFzIHdlbGwuICBIb3dldmVyLCBvbmUKLSAgICAgbGltaXRhdGlvbiB3aGVuIGNy ZWF0aW5nIG5ldyBpbmRleGVzIG9uIHBhcnRpdGlvbmVkIHRhYmxlcyBpcyB0aGF0IGl0Ci0g ICAgIGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIDxsaXRlcmFsPkNPTkNVUlJFTlRMWTwv bGl0ZXJhbD4KLSAgICAgcXVhbGlmaWVyLCB3aGljaCBjb3VsZCBsZWFkIHRvIGxvbmcgbG9j ayB0aW1lcy4gIFRvIGF2b2lkIHRoaXMsIHlvdSBjYW4KLSAgICAgdXNlIDxjb21tYW5kPkNS RUFURSBJTkRFWCBPTiBPTkxZPC9jb21tYW5kPiB0aGUgcGFydGl0aW9uZWQgdGFibGUsIHdo aWNoCisgICAgIGluZGV4ZWQsIGJ1dCBhbnkgZnV0dXJlIHBhcnRpdGlvbnMgd2lsbCBiZSBh cyB3ZWxsLiBGb3IgbW9yZSBjb250cm9sIG92ZXIKKyAgICAgbG9ja2luZyBvZiB0aGUgcGFy dGl0aW9ucyB5b3UgY2FuIHVzZSA8Y29tbWFuZD5DUkVBVEUgSU5ERVggT04gT05MWTwvY29t bWFuZD4KKyAgICAgb24gdGhlIHBhcnRpdGlvbmVkIHRhYmxlLCB3aGljaAogICAgICBjcmVh dGVzIHRoZSBuZXcgaW5kZXggbWFya2VkIGFzIGludmFsaWQsIHByZXZlbnRpbmcgYXV0b21h dGljIGFwcGxpY2F0aW9uCiAgICAgIHRvIGV4aXN0aW5nIHBhcnRpdGlvbnMuICBJbnN0ZWFk LCBpbmRleGVzIGNhbiB0aGVuIGJlIGNyZWF0ZWQgaW5kaXZpZHVhbGx5Ci0gICAgIG9uIGVh Y2ggcGFydGl0aW9uIHVzaW5nIDxsaXRlcmFsPkNPTkNVUlJFTlRMWTwvbGl0ZXJhbD4gYW5k CisgICAgIG9uIGVhY2ggcGFydGl0aW9uIGFuZAogICAgICA8Zmlyc3R0ZXJtPmF0dGFjaGVk PC9maXJzdHRlcm0+IHRvIHRoZSBwYXJ0aXRpb25lZCBpbmRleCBvbiB0aGUgcGFyZW50CiAg ICAgIHVzaW5nIDxjb21tYW5kPkFMVEVSIElOREVYIC4uLiBBVFRBQ0ggUEFSVElUSU9OPC9j b21tYW5kPi4gIE9uY2UgaW5kZXhlcyBmb3IKICAgICAgYWxsIHRoZSBwYXJ0aXRpb25zIGFy ZSBhdHRhY2hlZCB0byB0aGUgcGFyZW50IGluZGV4LCB0aGUgcGFyZW50IGluZGV4IHdpbGwK ZGlmZiAtLWdpdCBhL2RvYy9zcmMvc2dtbC9yZWYvY3JlYXRlX2luZGV4LnNnbWwgYi9kb2Mv c3JjL3NnbWwvcmVmL2NyZWF0ZV9pbmRleC5zZ21sCmluZGV4IDYyMWJjMGUyNTMuLjIzNjZj ZmQ5YjUgMTAwNjQ0Ci0tLSBhL2RvYy9zcmMvc2dtbC9yZWYvY3JlYXRlX2luZGV4LnNnbWwK KysrIGIvZG9jL3NyYy9zZ21sL3JlZi9jcmVhdGVfaW5kZXguc2dtbApAQCAtNjQ1LDcgKzY0 NSwxMCBAQCBDUkVBVEUgWyBVTklRVUUgXSBJTkRFWCBbIENPTkNVUlJFTlRMWSBdIFsgWyBJ RiBOT1QgRVhJU1RTIF0gPHJlcGxhY2VhYmxlIGNsYXNzPQogICAgPHBhcmE+CiAgICAgSWYg YSBwcm9ibGVtIGFyaXNlcyB3aGlsZSBzY2FubmluZyB0aGUgdGFibGUsIHN1Y2ggYXMgYSBk ZWFkbG9jayBvciBhCiAgICAgdW5pcXVlbmVzcyB2aW9sYXRpb24gaW4gYSB1bmlxdWUgaW5k ZXgsIHRoZSA8Y29tbWFuZD5DUkVBVEUgSU5ERVg8L2NvbW1hbmQ+Ci0gICAgY29tbWFuZCB3 aWxsIGZhaWwgYnV0IGxlYXZlIGJlaGluZCBhbiA8cXVvdGU+aW52YWxpZDwvcXVvdGU+IGlu ZGV4LiBUaGlzIGluZGV4CisgICAgY29tbWFuZCB3aWxsIGZhaWwgYnV0IGxlYXZlIGJlaGlu ZCBhbiA8cXVvdGU+aW52YWxpZDwvcXVvdGU+IGluZGV4LgorICAgIElmIHRoaXMgaGFwcGVu cyB3aGlsZSBidWlsZCBhbiBpbmRleCBjb25jdXJyZW50bHkgb24gYSBwYXJ0aXRpb25lZAor ICAgIHRhYmxlLCB0aGUgY29tbWFuZCBjYW4gYWxzbyBsZWF2ZSBiZWhpbmQgPHF1b3RlPnZh bGlkPC9xdW90ZT4gb3IKKyAgICA8cXVvdGU+aW52YWxpZDwvcXVvdGU+IGluZGV4ZXMgb24g dGFibGUgcGFydGl0aW9ucy4gIFRoZSBpbnZhbGlkIGluZGV4CiAgICAgd2lsbCBiZSBpZ25v cmVkIGZvciBxdWVyeWluZyBwdXJwb3NlcyBiZWNhdXNlIGl0IG1pZ2h0IGJlIGluY29tcGxl dGU7CiAgICAgaG93ZXZlciBpdCB3aWxsIHN0aWxsIGNvbnN1bWUgdXBkYXRlIG92ZXJoZWFk LiBUaGUgPGFwcGxpY2F0aW9uPnBzcWw8L2FwcGxpY2F0aW9uPgogICAgIDxjb21tYW5kPlxk PC9jb21tYW5kPiBjb21tYW5kIHdpbGwgcmVwb3J0IHN1Y2ggYW4gaW5kZXggYXMgPGxpdGVy YWw+SU5WQUxJRDwvbGl0ZXJhbD46CkBAIC02OTIsMTUgKzY5NSw2IEBAIEluZGV4ZXM6CiAg ICAgY2Fubm90LgogICAgPC9wYXJhPgogCi0gICA8cGFyYT4KLSAgICBDb25jdXJyZW50IGJ1 aWxkcyBmb3IgaW5kZXhlcyBvbiBwYXJ0aXRpb25lZCB0YWJsZXMgYXJlIGN1cnJlbnRseSBu b3QKLSAgICBzdXBwb3J0ZWQuICBIb3dldmVyLCB5b3UgbWF5IGNvbmN1cnJlbnRseSBidWls ZCB0aGUgaW5kZXggb24gZWFjaAotICAgIHBhcnRpdGlvbiBpbmRpdmlkdWFsbHkgYW5kIHRo ZW4gZmluYWxseSBjcmVhdGUgdGhlIHBhcnRpdGlvbmVkIGluZGV4Ci0gICAgbm9uLWNvbmN1 cnJlbnRseSBpbiBvcmRlciB0byByZWR1Y2UgdGhlIHRpbWUgd2hlcmUgd3JpdGVzIHRvIHRo ZQotICAgIHBhcnRpdGlvbmVkIHRhYmxlIHdpbGwgYmUgbG9ja2VkIG91dC4gIEluIHRoaXMg Y2FzZSwgYnVpbGRpbmcgdGhlCi0gICAgcGFydGl0aW9uZWQgaW5kZXggaXMgYSBtZXRhZGF0 YSBvbmx5IG9wZXJhdGlvbi4KLSAgIDwvcGFyYT4KLQogICA8L3JlZnNlY3QyPgogIDwvcmVm c2VjdDE+CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2luZGV4Y21kcy5j IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKaW5kZXggMzA5Mzg5ZTIwZC4u NTgwNmVlYjhlZiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRz LmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvaW5kZXhjbWRzLmMKQEAgLTk1LDYgKzk1 LDExIEBAIHN0YXRpYyBjaGFyICpDaG9vc2VJbmRleE5hbWUoY29uc3QgY2hhciAqdGFibmFt ZSwgT2lkIG5hbWVzcGFjZUlkLAogCQkJCQkJCSBib29sIHByaW1hcnksIGJvb2wgaXNjb25z dHJhaW50KTsKIHN0YXRpYyBjaGFyICpDaG9vc2VJbmRleE5hbWVBZGRpdGlvbihjb25zdCBM aXN0ICpjb2xuYW1lcyk7CiBzdGF0aWMgTGlzdCAqQ2hvb3NlSW5kZXhDb2x1bW5OYW1lcyhj b25zdCBMaXN0ICppbmRleEVsZW1zKTsKK3N0YXRpYyB2b2lkIERlZmluZUluZGV4Q29uY3Vy cmVudEludGVybmFsKE9pZCByZWxhdGlvbklkLAorCQkJCQkJCQkJCSAgT2lkIGluZGV4UmVs YXRpb25JZCwKKwkJCQkJCQkJCQkgIEluZGV4SW5mbyAqaW5kZXhJbmZvLAorCQkJCQkJCQkJ CSAgTE9DS1RBRyBoZWFwbG9ja3RhZywKKwkJCQkJCQkJCQkgIExvY2tSZWxJZCAqaGVhcHJl bGlkKTsKIHN0YXRpYyB2b2lkIFJlaW5kZXhJbmRleChjb25zdCBSZWluZGV4U3RtdCAqc3Rt dCwgY29uc3QgUmVpbmRleFBhcmFtcyAqcGFyYW1zLAogCQkJCQkJIGJvb2wgaXNUb3BMZXZl bCk7CiBzdGF0aWMgdm9pZCBSYW5nZVZhckNhbGxiYWNrRm9yUmVpbmRleEluZGV4KGNvbnN0 IFJhbmdlVmFyICpyZWxhdGlvbiwKQEAgLTU2MSw3ICs1NjYsNiBAQCBEZWZpbmVJbmRleChP aWQgdGFibGVJZCwKIAlib29sCQlhbWlzc3VtbWFyaXppbmc7CiAJYW1vcHRpb25zX2Z1bmN0 aW9uIGFtb3B0aW9uczsKIAlib29sCQlwYXJ0aXRpb25lZDsKLQlib29sCQlzYWZlX2luZGV4 OwogCURhdHVtCQlyZWxvcHRpb25zOwogCWludDE2CSAgICpjb2xvcHRpb25zOwogCUluZGV4 SW5mbyAgKmluZGV4SW5mbzsKQEAgLTU2OSwxMiArNTczLDEwIEBAIERlZmluZUluZGV4KE9p ZCB0YWJsZUlkLAogCWJpdHMxNgkJY29uc3RyX2ZsYWdzOwogCWludAkJCW51bWJlck9mQXR0 cmlidXRlczsKIAlpbnQJCQludW1iZXJPZktleUF0dHJpYnV0ZXM7Ci0JVHJhbnNhY3Rpb25J ZCBsaW1pdFhtaW47CiAJT2JqZWN0QWRkcmVzcyBhZGRyZXNzOwogCUxvY2tSZWxJZAloZWFw cmVsaWQ7CiAJTE9DS1RBRwkJaGVhcGxvY2t0YWc7CiAJTE9DS01PREUJbG9ja21vZGU7Ci0J U25hcHNob3QJc25hcHNob3Q7CiAJT2lkCQkJcm9vdF9zYXZlX3VzZXJpZDsKIAlpbnQJCQly b290X3NhdmVfc2VjX2NvbnRleHQ7CiAJaW50CQkJcm9vdF9zYXZlX25lc3RsZXZlbDsKQEAg LTcwNiwyMCArNzA4LDYgQEAgRGVmaW5lSW5kZXgoT2lkIHRhYmxlSWQsCiAJICogcGFydGl0 aW9uLgogCSAqLwogCXBhcnRpdGlvbmVkID0gcmVsLT5yZF9yZWwtPnJlbGtpbmQgPT0gUkVM S0lORF9QQVJUSVRJT05FRF9UQUJMRTsKLQlpZiAocGFydGl0aW9uZWQpCi0JewotCQkvKgot CQkgKiBOb3RlOiB3ZSBjaGVjayAnc3RtdC0+Y29uY3VycmVudCcgcmF0aGVyIHRoYW4gJ2Nv bmN1cnJlbnQnLCBzbyB0aGF0Ci0JCSAqIHRoZSBlcnJvciBpcyB0aHJvd24gYWxzbyBmb3Ig dGVtcG9yYXJ5IHRhYmxlcy4gIFNlZW1zIGJldHRlciB0byBiZQotCQkgKiBjb25zaXN0ZW50 LCBldmVuIHRob3VnaCB3ZSBjb3VsZCBkbyBpdCBvbiB0ZW1wb3JhcnkgdGFibGUgYmVjYXVz ZQotCQkgKiB3ZSdyZSBub3QgYWN0dWFsbHkgZG9pbmcgaXQgY29uY3VycmVudGx5LgotCQkg Ki8KLQkJaWYgKHN0bXQtPmNvbmN1cnJlbnQpCi0JCQllcmVwb3J0KEVSUk9SLAotCQkJCQko ZXJyY29kZShFUlJDT0RFX0ZFQVRVUkVfTk9UX1NVUFBPUlRFRCksCi0JCQkJCSBlcnJtc2co ImNhbm5vdCBjcmVhdGUgaW5kZXggb24gcGFydGl0aW9uZWQgdGFibGUgXCIlc1wiIGNvbmN1 cnJlbnRseSIsCi0JCQkJCQkJUmVsYXRpb25HZXRSZWxhdGlvbk5hbWUocmVsKSkpKTsKLQl9 CiAKIAkvKgogCSAqIERvbid0IHRyeSB0byBDUkVBVEUgSU5ERVggb24gdGVtcCB0YWJsZXMg b2Ygb3RoZXIgYmFja2VuZHMuCkBAIC0xMTE2LDEwICsxMTA0LDYgQEAgRGVmaW5lSW5kZXgo T2lkIHRhYmxlSWQsCiAJCX0KIAl9CiAKLQkvKiBJcyBpbmRleCBzYWZlIGZvciBvdGhlcnMg dG8gaWdub3JlPyAgU2VlIHNldF9pbmRleHNhZmVfcHJvY2ZsYWdzKCkgKi8KLQlzYWZlX2lu ZGV4ID0gaW5kZXhJbmZvLT5paV9FeHByZXNzaW9ucyA9PSBOSUwgJiYKLQkJaW5kZXhJbmZv LT5paV9QcmVkaWNhdGUgPT0gTklMOwotCiAJLyoKIAkgKiBSZXBvcnQgaW5kZXggY3JlYXRp b24gaWYgYXBwcm9wcmlhdGUgKGRlbGF5IHRoaXMgdGlsbCBhZnRlciBtb3N0IG9mIHRoZQog CSAqIGVycm9yIGNoZWNrcykKQEAgLTExODQsNiArMTE2OCwxMSBAQCBEZWZpbmVJbmRleChP aWQgdGFibGVJZCwKIAkJaWYgKHBkLT5ucGFydHMgIT0gMCkKIAkJCWZsYWdzIHw9IElOREVY X0NSRUFURV9JTlZBTElEOwogCX0KKwllbHNlIGlmIChjb25jdXJyZW50ICYmIE9pZElzVmFs aWQocGFyZW50SW5kZXhJZCkpCisJeworCQkvKiBJZiBjb25jdXJyZW50LCBpbml0aWFsbHkg YnVpbGQgaW5kZXggcGFydGl0aW9ucyBhcyAiaW52YWxpZCIgKi8KKwkJZmxhZ3MgfD0gSU5E RVhfQ1JFQVRFX0lOVkFMSUQ7CisJfQogCiAJaWYgKHN0bXQtPmRlZmVycmFibGUpCiAJCWNv bnN0cl9mbGFncyB8PSBJTkRFWF9DT05TVFJfQ1JFQVRFX0RFRkVSUkFCTEU7CkBAIC0xNTMz LDIxICsxNTIyLDcgQEAgRGVmaW5lSW5kZXgoT2lkIHRhYmxlSWQsCiAJCQkgKi8KIAkJCWlm IChpbnZhbGlkYXRlX3BhcmVudCkKIAkJCXsKLQkJCQlSZWxhdGlvbglwZ19pbmRleCA9IHRh YmxlX29wZW4oSW5kZXhSZWxhdGlvbklkLCBSb3dFeGNsdXNpdmVMb2NrKTsKLQkJCQlIZWFw VHVwbGUJdHVwLAotCQkJCQkJCW5ld3R1cDsKLQotCQkJCXR1cCA9IFNlYXJjaFN5c0NhY2hl MShJTkRFWFJFTElELAotCQkJCQkJCQkJICBPYmplY3RJZEdldERhdHVtKGluZGV4UmVsYXRp b25JZCkpOwotCQkJCWlmICghSGVhcFR1cGxlSXNWYWxpZCh0dXApKQotCQkJCQllbG9nKEVS Uk9SLCAiY2FjaGUgbG9va3VwIGZhaWxlZCBmb3IgaW5kZXggJXUiLAotCQkJCQkJIGluZGV4 UmVsYXRpb25JZCk7Ci0JCQkJbmV3dHVwID0gaGVhcF9jb3B5dHVwbGUodHVwKTsKLQkJCQko KEZvcm1fcGdfaW5kZXgpIEdFVFNUUlVDVChuZXd0dXApKS0+aW5kaXN2YWxpZCA9IGZhbHNl OwotCQkJCUNhdGFsb2dUdXBsZVVwZGF0ZShwZ19pbmRleCwgJnR1cC0+dF9zZWxmLCBuZXd0 dXApOwotCQkJCVJlbGVhc2VTeXNDYWNoZSh0dXApOwotCQkJCXRhYmxlX2Nsb3NlKHBnX2lu ZGV4LCBSb3dFeGNsdXNpdmVMb2NrKTsKLQkJCQloZWFwX2ZyZWV0dXBsZShuZXd0dXApOwor CQkJCWluZGV4X3NldF9zdGF0ZV9mbGFncyhpbmRleFJlbGF0aW9uSWQsIElOREVYX0RST1Bf Q0xFQVJfVkFMSUQpOwogCiAJCQkJLyoKIAkJCQkgKiBDQ0kgaGVyZSB0byBtYWtlIHRoaXMg dXBkYXRlIHZpc2libGUsIGluIGNhc2UgdGhpcyByZWN1cnNlcwpAQCAtMTU1OSwzNyArMTUz NCw0OSBAQCBEZWZpbmVJbmRleChPaWQgdGFibGVJZCwKIAogCQkvKgogCQkgKiBJbmRleGVz IG9uIHBhcnRpdGlvbmVkIHRhYmxlcyBhcmUgbm90IHRoZW1zZWx2ZXMgYnVpbHQsIHNvIHdl J3JlCi0JCSAqIGRvbmUgaGVyZS4KKwkJICogZG9uZSBoZXJlIGluIHRoZSBub24tY29uY3Vy cmVudCBjYXNlLgogCQkgKi8KLQkJQXRFT1hhY3RfR1VDKGZhbHNlLCByb290X3NhdmVfbmVz dGxldmVsKTsKLQkJU2V0VXNlcklkQW5kU2VjQ29udGV4dChyb290X3NhdmVfdXNlcmlkLCBy b290X3NhdmVfc2VjX2NvbnRleHQpOwotCQl0YWJsZV9jbG9zZShyZWwsIE5vTG9jayk7Ci0J CWlmICghT2lkSXNWYWxpZChwYXJlbnRJbmRleElkKSkKLQkJCXBnc3RhdF9wcm9ncmVzc19l bmRfY29tbWFuZCgpOwotCQllbHNlCisJCWlmICghY29uY3VycmVudCkKIAkJewotCQkJLyog VXBkYXRlIHByb2dyZXNzIGZvciBhbiBpbnRlcm1lZGlhdGUgcGFydGl0aW9uZWQgaW5kZXgg aXRzZWxmICovCi0JCQlwZ3N0YXRfcHJvZ3Jlc3NfaW5jcl9wYXJhbShQUk9HUkVTU19DUkVB VEVJRFhfUEFSVElUSU9OU19ET05FLCAxKTsKLQkJfQorCQkJQXRFT1hhY3RfR1VDKGZhbHNl LCByb290X3NhdmVfbmVzdGxldmVsKTsKKwkJCVNldFVzZXJJZEFuZFNlY0NvbnRleHQocm9v dF9zYXZlX3VzZXJpZCwgcm9vdF9zYXZlX3NlY19jb250ZXh0KTsKKwkJCXRhYmxlX2Nsb3Nl KHJlbCwgTm9Mb2NrKTsKIAotCQlyZXR1cm4gYWRkcmVzczsKKwkJCWlmICghT2lkSXNWYWxp ZChwYXJlbnRJbmRleElkKSkKKwkJCQlwZ3N0YXRfcHJvZ3Jlc3NfZW5kX2NvbW1hbmQoKTsK KwkJCWVsc2UKKwkJCXsKKwkJCQkvKgorCQkJCSAqIFVwZGF0ZSBwcm9ncmVzcyBmb3IgYW4g aW50ZXJtZWRpYXRlIHBhcnRpdGlvbmVkIGluZGV4CisJCQkJICogaXRzZWxmCisJCQkJICov CisJCQkJcGdzdGF0X3Byb2dyZXNzX2luY3JfcGFyYW0oUFJPR1JFU1NfQ1JFQVRFSURYX1BB UlRJVElPTlNfRE9ORSwgMSk7CisJCQl9CisKKwkJCXJldHVybiBhZGRyZXNzOworCQl9CiAJ fQogCiAJQXRFT1hhY3RfR1VDKGZhbHNlLCByb290X3NhdmVfbmVzdGxldmVsKTsKIAlTZXRV c2VySWRBbmRTZWNDb250ZXh0KHJvb3Rfc2F2ZV91c2VyaWQsIHJvb3Rfc2F2ZV9zZWNfY29u dGV4dCk7CiAKLQlpZiAoIWNvbmN1cnJlbnQpCisJLyoKKwkgKiBBbGwgZG9uZSBpbiB0aGUg bm9uLWNvbmN1cnJlbnQgY2FzZSwgYW5kIHdoZW4gYnVpbGRpbmcgY2F0YWxvZyBlbnRyaWVz CisJICogb2YgcGFydGl0aW9ucyBmb3IgQ0lDLgorCSAqLworCWlmICghY29uY3VycmVudCB8 fCBPaWRJc1ZhbGlkKHBhcmVudEluZGV4SWQpKQogCXsKLQkJLyogQ2xvc2UgdGhlIGhlYXAg YW5kIHdlJ3JlIGRvbmUsIGluIHRoZSBub24tY29uY3VycmVudCBjYXNlICovCiAJCXRhYmxl X2Nsb3NlKHJlbCwgTm9Mb2NrKTsKIAogCQkvKgogCQkgKiBJZiB0aGlzIGlzIHRoZSB0b3At bGV2ZWwgaW5kZXgsIHRoZSBjb21tYW5kIGlzIGRvbmUgb3ZlcmFsbDsKLQkJICogb3RoZXJ3 aXNlLCBpbmNyZW1lbnQgcHJvZ3Jlc3MgdG8gcmVwb3J0IG9uZSBjaGlsZCBpbmRleCBpcyBk b25lLgorCQkgKiBvdGhlcndpc2UgKHdoZW4gYmVpbmcgY2FsbGVkIHJlY3Vyc2l2ZWx5KSwg aW5jcmVtZW50IHByb2dyZXNzIHRvCisJCSAqIHJlcG9ydCB0aGF0IG9uZSBjaGlsZCBpbmRl eCBpcyBkb25lLiAgRXhjZXB0IGluIHRoZSBjb25jdXJyZW50CisJCSAqIChjYXRhbG9nLW9u bHkpIGNhc2UsIHdoaWNoIGlzIGhhbmRsZWQgbGF0ZXIuCiAJCSAqLwogCQlpZiAoIU9pZElz VmFsaWQocGFyZW50SW5kZXhJZCkpCiAJCQlwZ3N0YXRfcHJvZ3Jlc3NfZW5kX2NvbW1hbmQo KTsKLQkJZWxzZQorCQllbHNlIGlmICghY29uY3VycmVudCkKIAkJCXBnc3RhdF9wcm9ncmVz c19pbmNyX3BhcmFtKFBST0dSRVNTX0NSRUFURUlEWF9QQVJUSVRJT05TX0RPTkUsIDEpOwog CiAJCXJldHVybiBhZGRyZXNzOwpAQCAtMTYwMCwyOCArMTU4NywxODAgQEAgRGVmaW5lSW5k ZXgoT2lkIHRhYmxlSWQsCiAJU0VUX0xPQ0tUQUdfUkVMQVRJT04oaGVhcGxvY2t0YWcsIGhl YXByZWxpZC5kYklkLCBoZWFwcmVsaWQucmVsSWQpOwogCXRhYmxlX2Nsb3NlKHJlbCwgTm9M b2NrKTsKIAotCS8qCi0JICogRm9yIGEgY29uY3VycmVudCBidWlsZCwgaXQncyBpbXBvcnRh bnQgdG8gbWFrZSB0aGUgY2F0YWxvZyBlbnRyaWVzCi0JICogdmlzaWJsZSB0byBvdGhlciB0 cmFuc2FjdGlvbnMgYmVmb3JlIHdlIHN0YXJ0IHRvIGJ1aWxkIHRoZSBpbmRleC4gVGhhdAot CSAqIHdpbGwgcHJldmVudCB0aGVtIGZyb20gbWFraW5nIGluY29tcGF0aWJsZSBIT1QgdXBk YXRlcy4gIFRoZSBuZXcgaW5kZXgKLQkgKiB3aWxsIGJlIG1hcmtlZCBub3QgaW5kaXNyZWFk eSBhbmQgbm90IGluZGlzdmFsaWQsIHNvIHRoYXQgbm8gb25lIGVsc2UKLQkgKiB0cmllcyB0 byBlaXRoZXIgaW5zZXJ0IGludG8gaXQgb3IgdXNlIGl0IGZvciBxdWVyaWVzLgotCSAqCi0J ICogV2UgbXVzdCBjb21taXQgb3VyIGN1cnJlbnQgdHJhbnNhY3Rpb24gc28gdGhhdCB0aGUg aW5kZXggYmVjb21lcwotCSAqIHZpc2libGU7IHRoZW4gc3RhcnQgYW5vdGhlci4gIE5vdGUg dGhhdCBhbGwgdGhlIGRhdGEgc3RydWN0dXJlcyB3ZSBqdXN0Ci0JICogYnVpbHQgYXJlIGxv c3QgaW4gdGhlIGNvbW1pdC4gIFRoZSBvbmx5IGRhdGEgd2Uga2VlcCBwYXN0IGhlcmUgYXJl IHRoZQotCSAqIHJlbGF0aW9uIElEcy4KLQkgKgotCSAqIEJlZm9yZSBjb21taXR0aW5nLCBn ZXQgYSBzZXNzaW9uLWxldmVsIGxvY2sgb24gdGhlIHRhYmxlLCB0byBlbnN1cmUKLQkgKiB0 aGF0IG5laXRoZXIgaXQgbm9yIHRoZSBpbmRleCBjYW4gYmUgZHJvcHBlZCBiZWZvcmUgd2Ug ZmluaXNoLiBUaGlzCi0JICogY2Fubm90IGJsb2NrLCBldmVuIGlmIHNvbWVvbmUgZWxzZSBp cyB3YWl0aW5nIGZvciBhY2Nlc3MsIGJlY2F1c2Ugd2UKLQkgKiBhbHJlYWR5IGhhdmUgdGhl IHNhbWUgbG9jayB3aXRoaW4gb3VyIHRyYW5zYWN0aW9uLgotCSAqCi0JICogTm90ZTogd2Ug ZG9uJ3QgY3VycmVudGx5IGJvdGhlciB3aXRoIGEgc2Vzc2lvbiBsb2NrIG9uIHRoZSBpbmRl eCwKLQkgKiBiZWNhdXNlIHRoZXJlIGFyZSBubyBvcGVyYXRpb25zIHRoYXQgY291bGQgY2hh bmdlIGl0cyBzdGF0ZSB3aGlsZSB3ZQotCSAqIGhvbGQgbG9jayBvbiB0aGUgcGFyZW50IHRh YmxlLiAgVGhpcyBtaWdodCBuZWVkIHRvIGNoYW5nZSBsYXRlci4KLQkgKi8KLQlMb2NrUmVs YXRpb25JZEZvclNlc3Npb24oJmhlYXByZWxpZCwgU2hhcmVVcGRhdGVFeGNsdXNpdmVMb2Nr KTsKKwlpZiAoIXBhcnRpdGlvbmVkKQorCXsKKwkJLyoKKwkJICogRm9yIGEgY29uY3VycmVu dCBidWlsZCwgaXQncyBpbXBvcnRhbnQgdG8gbWFrZSB0aGUgY2F0YWxvZyBlbnRyaWVzCisJ CSAqIHZpc2libGUgdG8gb3RoZXIgdHJhbnNhY3Rpb25zIGJlZm9yZSB3ZSBzdGFydCB0byBi dWlsZCB0aGUgaW5kZXguCisJCSAqIFRoYXQgd2lsbCBwcmV2ZW50IHRoZW0gZnJvbSBtYWtp bmcgaW5jb21wYXRpYmxlIEhPVCB1cGRhdGVzLiAgVGhlCisJCSAqIG5ldyBpbmRleCB3aWxs IGJlIG1hcmtlZCBub3QgaW5kaXNyZWFkeSBhbmQgbm90IGluZGlzdmFsaWQsIHNvIHRoYXQK KwkJICogbm8gb25lIGVsc2UgdHJpZXMgdG8gZWl0aGVyIGluc2VydCBpbnRvIGl0IG9yIHVz ZSBpdCBmb3IgcXVlcmllcy4KKwkJICoKKwkJICogRGVmaW5lSW5kZXhDb25jdXJyZW50SW50 ZXJuYWwgd2lsbCBjb21taXQgb3VyIGN1cnJlbnQgdHJhbnNhY3Rpb24KKwkJICogc28gdGhh dCB0aGUgaW5kZXggYmVjb21lcyB2aXNpYmxlOyB0aGVuIHN0YXJ0IGFub3RoZXIuICBOb3Rl IHRoYXQKKwkJICogYWxsIHRoZSBkYXRhIHN0cnVjdHVyZXMgd2UganVzdCBidWlsdCBhcmUg bG9zdCBpbiB0aGUgY29tbWl0LiAgVGhlCisJCSAqIG9ubHkgZGF0YSB3ZSBrZWVwIHBhc3Qg aGVyZSBhcmUgdGhlIHJlbGF0aW9uIElEcy4KKwkJICoKKwkJICogQmVmb3JlIGNvbW1pdHRp bmcsIGdldCBhIHNlc3Npb24tbGV2ZWwgbG9jayBvbiB0aGUgdGFibGUsIHRvIGVuc3VyZQor CQkgKiB0aGF0IG5laXRoZXIgaXQgbm9yIHRoZSBpbmRleCBjYW4gYmUgZHJvcHBlZCBiZWZv cmUgd2UgZmluaXNoLiBUaGlzCisJCSAqIGNhbm5vdCBibG9jaywgZXZlbiBpZiBzb21lb25l IGVsc2UgaXMgd2FpdGluZyBmb3IgYWNjZXNzLCBiZWNhdXNlCisJCSAqIHdlIGFscmVhZHkg aGF2ZSB0aGUgc2FtZSBsb2NrIHdpdGhpbiBvdXIgdHJhbnNhY3Rpb24uCisJCSAqCisJCSAq IE5vdGU6IHdlIGRvbid0IGN1cnJlbnRseSBib3RoZXIgd2l0aCBhIHNlc3Npb24gbG9jayBv biB0aGUgaW5kZXgsCisJCSAqIGJlY2F1c2UgdGhlcmUgYXJlIG5vIG9wZXJhdGlvbnMgdGhh dCBjb3VsZCBjaGFuZ2UgaXRzIHN0YXRlIHdoaWxlCisJCSAqIHdlIGhvbGQgbG9jayBvbiB0 aGUgcGFyZW50IHRhYmxlLiAgVGhpcyBtaWdodCBuZWVkIHRvIGNoYW5nZSBsYXRlci4KKwkJ ICovCisKKwkJTG9ja1JlbGF0aW9uSWRGb3JTZXNzaW9uKCZoZWFwcmVsaWQsIFNoYXJlVXBk YXRlRXhjbHVzaXZlTG9jayk7CisKKwkJLyogQ1JFQVRFIElOREVYIENPTkNVUlJFTlRMWSBv biBhIG5vbnBhcnRpdGlvbmVkIHRhYmxlICovCisJCURlZmluZUluZGV4Q29uY3VycmVudElu dGVybmFsKHRhYmxlSWQsIGluZGV4UmVsYXRpb25JZCwKKwkJCQkJCQkJCSAgaW5kZXhJbmZv LCBoZWFwbG9ja3RhZywgJmhlYXByZWxpZCk7CisJCXBnc3RhdF9wcm9ncmVzc19lbmRfY29t bWFuZCgpOworCQlyZXR1cm4gYWRkcmVzczsKKwl9CisJZWxzZQorCXsKKwkJLyoKKwkJICog Rm9yIENJQyBvbiBhIHBhcnRpdGlvbmVkIHRhYmxlLCBmaW5pc2ggYnkgYnVpbGRpbmcgaW5k ZXhlcyBvbgorCQkgKiBwYXJ0aXRpb25zCisJCSAqLworCisJCUxpc3RDZWxsICAgKmxjOwor CQlMaXN0Q2VsbCAgICpsYzI7CisJCUxpc3QJICAgKmNoaWxkczsKKwkJTGlzdAkgICAqcGFy dF9pZHhzID0gTklMOworCQlMaXN0CSAgICpsZWFmX2lkeHMgPSBOSUw7CisJCUxpc3QJICAg KmxlYWZfaWR4X2xvY2tpZHMgPSBOSUw7CisJCUxpc3QJICAgKnBhcnRfaWR4X2xvY2tpZHMg PSBOSUw7CisJCU1lbW9yeUNvbnRleHQgY2ljX2NvbnRleHQsCisJCQkJCW9sZF9jb250ZXh0 OworCisJCS8qIENyZWF0ZSBzcGVjaWFsIG1lbW9yeSBjb250ZXh0IGZvciBjcm9zcy10cmFu c2FjdGlvbiBzdG9yYWdlICovCisJCWNpY19jb250ZXh0ID0gQWxsb2NTZXRDb250ZXh0Q3Jl YXRlKFBvcnRhbENvbnRleHQsCisJCQkJCQkJCQkJCSJDcmVhdGUgaW5kZXggY29uY3VycmVu dGx5IiwKKwkJCQkJCQkJCQkJQUxMT0NTRVRfREVGQVVMVF9TSVpFUyk7CisKKwkJb2xkX2Nv bnRleHQgPSBNZW1vcnlDb250ZXh0U3dpdGNoVG8oY2ljX2NvbnRleHQpOworCQljaGlsZHMg PSBmaW5kX2FsbF9pbmhlcml0b3JzKGluZGV4UmVsYXRpb25JZCwgU2hhcmVVcGRhdGVFeGNs dXNpdmVMb2NrLCBOVUxMKTsKKwkJTWVtb3J5Q29udGV4dFN3aXRjaFRvKG9sZF9jb250ZXh0 KTsKKworCQlmb3JlYWNoKGxjLCBjaGlsZHMpCisJCXsKKwkJCU9pZAkJCWluZHJlbGlkID0g bGZpcnN0X29pZChsYyk7CisJCQljaGFyCQlyZWxraW5kOworCQkJTG9ja1JlbElkICAqbG9j a3JlbGlkOworCQkJT2lkCQkJdGFicmVsaWQ7CisKKwkJCS8qCisJCQkgKiBQcmUtZXhpc3Rp bmcgcGFydGl0aW9ucyB3aGljaCB3ZXJlIEFUVEFDSEVEIHdlcmUgYWxyZWFkeQorCQkJICog Y291bnRlZCBpbiB0aGUgcHJvZ3Jlc3MgcmVwb3J0LgorCQkJICovCisJCQlpZiAoZ2V0X2lu ZGV4X2lzdmFsaWQoaW5kcmVsaWQpKQorCQkJCWNvbnRpbnVlOworCisJCQl0YWJyZWxpZCA9 IEluZGV4R2V0UmVsYXRpb24oaW5kcmVsaWQsIGZhbHNlKTsKKwkJCXJlbCA9IHRhYmxlX29w ZW4odGFicmVsaWQsIFNoYXJlVXBkYXRlRXhjbHVzaXZlTG9jayk7CisJCQlsb2NrcmVsaWQg PSBwYWxsb2Nfb2JqZWN0KExvY2tSZWxJZCk7CisJCQkqbG9ja3JlbGlkID0gcmVsLT5yZF9s b2NrSW5mby5sb2NrUmVsSWQ7CisJCQl0YWJsZV9jbG9zZShyZWwsIFNoYXJlVXBkYXRlRXhj bHVzaXZlTG9jayk7CisKKwkJCS8qCisJCQkgKiBTcGxpdCBwYXJ0aXRpb25zIGluIDIgbGlz dHM6IHBhcnRpdGlvbmVkIHRhYmxlcyB0aGF0IGp1c3QgbmVlZAorCQkJICogdG8gYmUgbWFy a2VkIGFzIHZhbGlkIGFuZCBsZWFmIHRhYmxlcyB0aGF0IGFjdHVhbGx5IG5lZWQgdG8KKwkJ CSAqIGhhdmUgdGhlaXIgaW5kZXhlcyBidWlsdC4KKwkJCSAqLworCQkJcmVsa2luZCA9IGdl dF9yZWxfcmVsa2luZChpbmRyZWxpZCk7CisJCQlpZiAoIVJFTEtJTkRfSEFTX1NUT1JBR0Uo cmVsa2luZCkpCisJCQl7CisJCQkJLyogVGhlIHRvcGxldmVsIGluZGV4IGRvZXNuJ3QgY291 bnQgdG93YXJkcyAicGFydGl0aW9ucyBkb25lIiAqLworCQkJCWlmIChpbmRyZWxpZCAhPSBp bmRleFJlbGF0aW9uSWQpCisJCQkJCXBnc3RhdF9wcm9ncmVzc19pbmNyX3BhcmFtKFBST0dS RVNTX0NSRUFURUlEWF9QQVJUSVRJT05TX0RPTkUsIDEpOworCisJCQkJLyoKKwkJCQkgKiBC dWlsZCB1cCBhIGxpc3Qgb2YgYWxsIHRoZSBpbnRlcm1lZGlhdGUgcGFydGl0aW9uZWQgdGFi bGVzCisJCQkJICogd2hpY2ggd2lsbCBsYXRlciBuZWVkIHRvIGJlIHNldCB2YWxpZC4KKwkJ CQkgKi8KKwkJCQlvbGRfY29udGV4dCA9IE1lbW9yeUNvbnRleHRTd2l0Y2hUbyhjaWNfY29u dGV4dCk7CisJCQkJcGFydF9pZHhzID0gbGFwcGVuZF9vaWQocGFydF9pZHhzLCBpbmRyZWxp ZCk7CisJCQkJcGFydF9pZHhfbG9ja2lkcyA9IGxhcHBlbmQocGFydF9pZHhfbG9ja2lkcywg bG9ja3JlbGlkKTsKKwkJCQlNZW1vcnlDb250ZXh0U3dpdGNoVG8ob2xkX2NvbnRleHQpOwor CQkJfQorCQkJZWxzZQorCQkJeworCQkJCW9sZF9jb250ZXh0ID0gTWVtb3J5Q29udGV4dFN3 aXRjaFRvKGNpY19jb250ZXh0KTsKKworCQkJCWxlYWZfaWR4cyA9IGxhcHBlbmRfb2lkKGxl YWZfaWR4cywgaW5kcmVsaWQpOworCQkJCWxlYWZfaWR4X2xvY2tpZHMgPSBsYXBwZW5kKGxl YWZfaWR4X2xvY2tpZHMsIGxvY2tyZWxpZCk7CisKKwkJCQlNZW1vcnlDb250ZXh0U3dpdGNo VG8ob2xkX2NvbnRleHQpOworCisJCQl9CisKKwkJCS8qCisJCQkgKiBBbGwgcGFydGl0aW9u cywgaW5jbHVkaW5nIHRvcC1sZXZlbCBwYXJlbnQsIG5lZWQgdG8gYmUgbG9ja2VkCisJCQkg KiBmb3IgdGhlIHNlc3Npb24gYmVmb3JlIHByb2NlZWRpbmcgd2l0aCBhbnkgaW5kZXggcmVi dWlsZHMgYXMKKwkJCSAqIGVhY2ggb2YgdGhvc2UgYXJlIGRvbmUgaW4gYSBzZXBhcmF0ZSB0 cmFuc2FjdGlvbi4gQWZ0ZXIgZWFjaAorCQkJICogbGVhZiBpbmRleCBpcyBidWlsdCwgaXRz IGNvcnJlc3BvbmRpbmcgdGFibGUgd2lsbCBiZSB1bmxvY2tlZCwKKwkJCSAqIGFsbCB0aGUg cGFydGl0aW9uZWQgdGFibGVzIHdpbGwgYmUgdW5sb2NrZWQgYXQgdGhlIHZlcnkgZW5kLgor CQkJICovCisKKwkJCUxvY2tSZWxhdGlvbklkRm9yU2Vzc2lvbihsb2NrcmVsaWQsIFNoYXJl VXBkYXRlRXhjbHVzaXZlTG9jayk7CisKKwkJfQorCisJCWZvcmJvdGgobGMsIGxlYWZfaWR4 cywgbGMyLCBsZWFmX2lkeF9sb2NraWRzKQorCQl7CisJCQlPaWQJCQlpbmRyZWxpZCA9IGxm aXJzdF9vaWQobGMpOworCQkJTG9ja1JlbElkICAqaGVhcHJlbGlkID0gbGZpcnN0KGxjMik7 CisJCQlPaWQJCQl0YWJyZWxpZCA9IEluZGV4R2V0UmVsYXRpb24oaW5kcmVsaWQsIGZhbHNl KTsKKworCQkJU0VUX0xPQ0tUQUdfUkVMQVRJT04oaGVhcGxvY2t0YWcsIGhlYXByZWxpZC0+ ZGJJZCwgaGVhcHJlbGlkLT5yZWxJZCk7CisKKwkJCS8qIFByb2Nlc3MgZWFjaCBwYXJ0aXRp b24gaW4gYSBzZXBhcmF0ZSB0cmFuc2FjdGlvbiAqLworCQkJRGVmaW5lSW5kZXhDb25jdXJy ZW50SW50ZXJuYWwodGFicmVsaWQsIGluZHJlbGlkLCBpbmRleEluZm8sCisJCQkJCQkJCQkJ ICBoZWFwbG9ja3RhZywgaGVhcHJlbGlkKTsKKworCQkJUHVzaEFjdGl2ZVNuYXBzaG90KEdl dFRyYW5zYWN0aW9uU25hcHNob3QoKSk7CisJCQlwZ3N0YXRfcHJvZ3Jlc3NfaW5jcl9wYXJh bShQUk9HUkVTU19DUkVBVEVJRFhfUEFSVElUSU9OU19ET05FLCAxKTsKKwkJfQorCisJCS8q IFNldCBhcyB2YWxpZCBhbGwgcGFydGl0aW9uZWQgaW5kZXhlcywgaW5jbHVkaW5nIHRoZSBw YXJlbnQgKi8KKwkJZm9yZWFjaChsYywgcGFydF9pZHhzKQorCQl7CisJCQlPaWQJCQlpbmRy ZWxpZCA9IGxmaXJzdF9vaWQobGMpOworCisJCQlpbmRleF9zZXRfc3RhdGVfZmxhZ3MoaW5k cmVsaWQsIElOREVYX0NSRUFURV9TRVRfUkVBRFkpOworCQkJQ29tbWFuZENvdW50ZXJJbmNy ZW1lbnQoKTsKKwkJCWluZGV4X3NldF9zdGF0ZV9mbGFncyhpbmRyZWxpZCwgSU5ERVhfQ1JF QVRFX1NFVF9WQUxJRCk7CisJCX0KKworCQlmb3JlYWNoKGxjLCBwYXJ0X2lkeF9sb2NraWRz KQorCQl7CisJCQlMb2NrUmVsSWQgICpsb2NrcmVsaWQgPSBsZmlyc3QobGMpOworCisJCQlV bmxvY2tSZWxhdGlvbklkRm9yU2Vzc2lvbihsb2NrcmVsaWQsIFNoYXJlVXBkYXRlRXhjbHVz aXZlTG9jayk7CisJCX0KKworCisJCU1lbW9yeUNvbnRleHREZWxldGUoY2ljX2NvbnRleHQp OworCQlwZ3N0YXRfcHJvZ3Jlc3NfZW5kX2NvbW1hbmQoKTsKKwkJUG9wQWN0aXZlU25hcHNo b3QoKTsKKwkJcmV0dXJuIGFkZHJlc3M7CisJfQorfQorCisKK3N0YXRpYyB2b2lkCitEZWZp bmVJbmRleENvbmN1cnJlbnRJbnRlcm5hbChPaWQgdGFibGVJZCwgT2lkIGluZGV4UmVsYXRp b25JZCwgSW5kZXhJbmZvICppbmRleEluZm8sCisJCQkJCQkJICBMT0NLVEFHIGhlYXBsb2Nr dGFnLCBMb2NrUmVsSWQgKmhlYXByZWxpZCkKK3sKKwlUcmFuc2FjdGlvbklkIGxpbWl0WG1p bjsKKwlTbmFwc2hvdAlzbmFwc2hvdDsKKworCS8qIElzIGluZGV4IHNhZmUgZm9yIG90aGVy cyB0byBpZ25vcmU/ICBTZWUgc2V0X2luZGV4c2FmZV9wcm9jZmxhZ3MoKSAqLworCWJvb2wJ CXNhZmVfaW5kZXggPSBpbmRleEluZm8tPmlpX0V4cHJlc3Npb25zID09IE5JTCAmJgorCQlp bmRleEluZm8tPmlpX1ByZWRpY2F0ZSA9PSBOSUw7CiAKIAlQb3BBY3RpdmVTbmFwc2hvdCgp OwogCUNvbW1pdFRyYW5zYWN0aW9uQ29tbWFuZCgpOwpAQCAtMTc4OSwxNiArMTkyOCwxMiBA QCBEZWZpbmVJbmRleChPaWQgdGFibGVJZCwKIAkgKiB3b3VsZCBiZSB1c2VmdWwuICAoTm90 ZSB0aGF0IG91ciBlYXJsaWVyIGNvbW1pdHMgZGlkIG5vdCBjcmVhdGUgcmVhc29ucwogCSAq IHRvIHJlcGxhbjsgc28gcmVsY2FjaGUgZmx1c2ggb24gdGhlIGluZGV4IGl0c2VsZiB3YXMg c3VmZmljaWVudC4pCiAJICovCi0JQ2FjaGVJbnZhbGlkYXRlUmVsY2FjaGVCeVJlbGlkKGhl YXByZWxpZC5yZWxJZCk7CisJQ2FjaGVJbnZhbGlkYXRlUmVsY2FjaGVCeVJlbGlkKGhlYXBy ZWxpZC0+cmVsSWQpOwogCiAJLyoKIAkgKiBMYXN0IHRoaW5nIHRvIGRvIGlzIHJlbGVhc2Ug dGhlIHNlc3Npb24tbGV2ZWwgbG9jayBvbiB0aGUgcGFyZW50IHRhYmxlLgogCSAqLwotCVVu bG9ja1JlbGF0aW9uSWRGb3JTZXNzaW9uKCZoZWFwcmVsaWQsIFNoYXJlVXBkYXRlRXhjbHVz aXZlTG9jayk7Ci0KLQlwZ3N0YXRfcHJvZ3Jlc3NfZW5kX2NvbW1hbmQoKTsKLQotCXJldHVy biBhZGRyZXNzOworCVVubG9ja1JlbGF0aW9uSWRGb3JTZXNzaW9uKGhlYXByZWxpZCwgU2hh cmVVcGRhdGVFeGNsdXNpdmVMb2NrKTsKIH0KIAogCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9y ZWdyZXNzL2V4cGVjdGVkL2luZGV4aW5nLm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvaW5kZXhpbmcub3V0CmluZGV4IGYyNTcyM2RhOTIuLjQ0YTZjZjM5ZGYgMTAwNjQ0Ci0t LSBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvaW5kZXhpbmcub3V0CisrKyBiL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvaW5kZXhpbmcub3V0CkBAIC01MCwxMSArNTAsMTMwIEBA IHNlbGVjdCByZWxuYW1lLCByZWxraW5kLCByZWxoYXNzdWJjbGFzcywgaW5ocGFyZW50Ojpy ZWdjbGFzcwogKDggcm93cykKIAogZHJvcCB0YWJsZSBpZHhwYXJ0OwotLS0gU29tZSB1bnN1 cHBvcnRlZCBmZWF0dXJlcworLS0gQ0lDIG9uIHBhcnRpdGlvbmVkIHRhYmxlCiBjcmVhdGUg dGFibGUgaWR4cGFydCAoYSBpbnQsIGIgaW50LCBjIHRleHQpIHBhcnRpdGlvbiBieSByYW5n ZSAoYSk7Ci1jcmVhdGUgdGFibGUgaWR4cGFydDEgcGFydGl0aW9uIG9mIGlkeHBhcnQgZm9y IHZhbHVlcyBmcm9tICgwKSB0byAoMTApOwotY3JlYXRlIGluZGV4IGNvbmN1cnJlbnRseSBv biBpZHhwYXJ0IChhKTsKLUVSUk9SOiAgY2Fubm90IGNyZWF0ZSBpbmRleCBvbiBwYXJ0aXRp b25lZCB0YWJsZSAiaWR4cGFydCIgY29uY3VycmVudGx5CitjcmVhdGUgdGFibGUgaWR4cGFy dDEgcGFydGl0aW9uIG9mIGlkeHBhcnQgZm9yIHZhbHVlcyBmcm9tICgwKSB0byAoMTApIHBh cnRpdGlvbiBieSByYW5nZShhKTsKK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0MTEgcGFydGl0aW9u IG9mIGlkeHBhcnQxIGZvciB2YWx1ZXMgZnJvbSAoMCkgdG8gKDEwKSBwYXJ0aXRpb24gYnkg cmFuZ2UoYSk7CitjcmVhdGUgdGFibGUgaWR4cGFydDExMSBwYXJ0aXRpb24gb2YgaWR4cGFy dDExIGRlZmF1bHQgcGFydGl0aW9uIGJ5IHJhbmdlKGEpOworY3JlYXRlIHRhYmxlIGlkeHBh cnQxMTExIHBhcnRpdGlvbiBvZiBpZHhwYXJ0MTExIGRlZmF1bHQgcGFydGl0aW9uIGJ5IHJh bmdlKGEpOworY3JlYXRlIHRhYmxlIGlkeHBhcnQyIHBhcnRpdGlvbiBvZiBpZHhwYXJ0IGZv ciB2YWx1ZXMgZnJvbSAoMTApIHRvICgyMCk7CitjcmVhdGUgdGFibGUgaWR4cGFydDMgcGFy dGl0aW9uIG9mIGlkeHBhcnQgZm9yIHZhbHVlcyBmcm9tICgzMCkgdG8gKDQwKSBwYXJ0aXRp b24gYnkgcmFuZ2UoYSk7CitjcmVhdGUgdGFibGUgaWR4cGFydDMxIHBhcnRpdGlvbiBvZiBp ZHhwYXJ0MyBkZWZhdWx0OworaW5zZXJ0IGludG8gaWR4cGFydDIgdmFsdWVzKDEwKSwoMTAp OyAtLSBub3QgdW5pcXVlCitjcmVhdGUgaW5kZXggY29uY3VycmVudGx5IG9uIGlkeHBhcnQx MSAoYSk7IC0tIHBhcnRpdGlvbmVkIGFuZCBwYXJ0aXRpb24sIHdpdGggbm8gbGVhdmVzCitj cmVhdGUgaW5kZXggY29uY3VycmVudGx5IG9uIGlkeHBhcnQxIChhKTsgLS0gcGFydGl0aW9u ZWQgYW5kIHBhcnRpdGlvbgorY3JlYXRlIGluZGV4IGNvbmN1cnJlbnRseSBvbiBpZHhwYXJ0 MiAoYSk7IC0tIGxlYWYKK2NyZWF0ZSBpbmRleCBjb25jdXJyZW50bHkgb24gaWR4cGFydCAo YSk7IC0tIHBhcnRpdGlvbmVkCitjcmVhdGUgdW5pcXVlIGluZGV4IGNvbmN1cnJlbnRseSBv biBpZHhwYXJ0IChhKTsgLS0gcGFydGl0aW9uZWQsIHVuaXF1ZSBmYWlsdXJlCitFUlJPUjog IGNvdWxkIG5vdCBjcmVhdGUgdW5pcXVlIGluZGV4ICJpZHhwYXJ0Ml9hX2lkeDEiCitERVRB SUw6ICBLZXkgKGEpPSgxMCkgaXMgZHVwbGljYXRlZC4KK1xkIGlkeHBhcnQKKyAgICAgICAg UGFydGl0aW9uZWQgdGFibGUgInB1YmxpYy5pZHhwYXJ0IgorIENvbHVtbiB8ICBUeXBlICAg fCBDb2xsYXRpb24gfCBOdWxsYWJsZSB8IERlZmF1bHQgCistLS0tLS0tLSstLS0tLS0tLS0r LS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0KKyBhICAgICAgfCBpbnRlZ2VyIHwg ICAgICAgICAgIHwgICAgICAgICAgfCAKKyBiICAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAg IHwgICAgICAgICAgfCAKKyBjICAgICAgfCB0ZXh0ICAgIHwgICAgICAgICAgIHwgICAgICAg ICAgfCAKK1BhcnRpdGlvbiBrZXk6IFJBTkdFIChhKQorSW5kZXhlczoKKyAgICAiaWR4cGFy dF9hX2lkeCIgYnRyZWUgKGEpCisgICAgImlkeHBhcnRfYV9pZHgxIiBVTklRVUUsIGJ0cmVl IChhKSBJTlZBTElECitOdW1iZXIgb2YgcGFydGl0aW9uczogMyAoVXNlIFxkKyB0byBsaXN0 IHRoZW0uKQorCitcZCBpZHhwYXJ0MQorICAgICAgICBQYXJ0aXRpb25lZCB0YWJsZSAicHVi bGljLmlkeHBhcnQxIgorIENvbHVtbiB8ICBUeXBlICAgfCBDb2xsYXRpb24gfCBOdWxsYWJs ZSB8IERlZmF1bHQgCistLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0t LSstLS0tLS0tLS0KKyBhICAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAg fCAKKyBiICAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCAKKyBjICAg ICAgfCB0ZXh0ICAgIHwgICAgICAgICAgIHwgICAgICAgICAgfCAKK1BhcnRpdGlvbiBvZjog aWR4cGFydCBGT1IgVkFMVUVTIEZST00gKDApIFRPICgxMCkKK1BhcnRpdGlvbiBrZXk6IFJB TkdFIChhKQorSW5kZXhlczoKKyAgICAiaWR4cGFydDFfYV9pZHgiIGJ0cmVlIChhKQorICAg ICJpZHhwYXJ0MV9hX2lkeDEiIFVOSVFVRSwgYnRyZWUgKGEpIElOVkFMSUQKK051bWJlciBv ZiBwYXJ0aXRpb25zOiAxIChVc2UgXGQrIHRvIGxpc3QgdGhlbS4pCisKK1xkIGlkeHBhcnQx MQorICAgICAgIFBhcnRpdGlvbmVkIHRhYmxlICJwdWJsaWMuaWR4cGFydDExIgorIENvbHVt biB8ICBUeXBlICAgfCBDb2xsYXRpb24gfCBOdWxsYWJsZSB8IERlZmF1bHQgCistLS0tLS0t LSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0KKyBhICAgICAg fCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCAKKyBiICAgICAgfCBpbnRlZ2Vy IHwgICAgICAgICAgIHwgICAgICAgICAgfCAKKyBjICAgICAgfCB0ZXh0ICAgIHwgICAgICAg ICAgIHwgICAgICAgICAgfCAKK1BhcnRpdGlvbiBvZjogaWR4cGFydDEgRk9SIFZBTFVFUyBG Uk9NICgwKSBUTyAoMTApCitQYXJ0aXRpb24ga2V5OiBSQU5HRSAoYSkKK0luZGV4ZXM6Cisg ICAgImlkeHBhcnQxMV9hX2lkeCIgYnRyZWUgKGEpCisgICAgImlkeHBhcnQxMV9hX2lkeDEi IFVOSVFVRSwgYnRyZWUgKGEpIElOVkFMSUQKK051bWJlciBvZiBwYXJ0aXRpb25zOiAxIChV c2UgXGQrIHRvIGxpc3QgdGhlbS4pCisKK1xkIGlkeHBhcnQxMTEKKyAgICAgICBQYXJ0aXRp b25lZCB0YWJsZSAicHVibGljLmlkeHBhcnQxMTEiCisgQ29sdW1uIHwgIFR5cGUgICB8IENv bGxhdGlvbiB8IE51bGxhYmxlIHwgRGVmYXVsdCAKKy0tLS0tLS0tKy0tLS0tLS0tLSstLS0t LS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLQorIGEgICAgICB8IGludGVnZXIgfCAgICAg ICAgICAgfCAgICAgICAgICB8IAorIGIgICAgICB8IGludGVnZXIgfCAgICAgICAgICAgfCAg ICAgICAgICB8IAorIGMgICAgICB8IHRleHQgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8 IAorUGFydGl0aW9uIG9mOiBpZHhwYXJ0MTEgREVGQVVMVAorUGFydGl0aW9uIGtleTogUkFO R0UgKGEpCitJbmRleGVzOgorICAgICJpZHhwYXJ0MTExX2FfaWR4IiBidHJlZSAoYSkKKyAg ICAiaWR4cGFydDExMV9hX2lkeDEiIFVOSVFVRSwgYnRyZWUgKGEpIElOVkFMSUQKK051bWJl ciBvZiBwYXJ0aXRpb25zOiAxIChVc2UgXGQrIHRvIGxpc3QgdGhlbS4pCisKK1xkIGlkeHBh cnQxMTExCisgICAgICBQYXJ0aXRpb25lZCB0YWJsZSAicHVibGljLmlkeHBhcnQxMTExIgor IENvbHVtbiB8ICBUeXBlICAgfCBDb2xsYXRpb24gfCBOdWxsYWJsZSB8IERlZmF1bHQgCist LS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0KKyBh ICAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCAKKyBiICAgICAgfCBp bnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCAKKyBjICAgICAgfCB0ZXh0ICAgIHwg ICAgICAgICAgIHwgICAgICAgICAgfCAKK1BhcnRpdGlvbiBvZjogaWR4cGFydDExMSBERUZB VUxUCitQYXJ0aXRpb24ga2V5OiBSQU5HRSAoYSkKK0luZGV4ZXM6CisgICAgImlkeHBhcnQx MTExX2FfaWR4IiBidHJlZSAoYSkKKyAgICAiaWR4cGFydDExMTFfYV9pZHgxIiBVTklRVUUs IGJ0cmVlIChhKSBJTlZBTElECitOdW1iZXIgb2YgcGFydGl0aW9uczogMAorCitcZCBpZHhw YXJ0MgorICAgICAgICAgICAgICBUYWJsZSAicHVibGljLmlkeHBhcnQyIgorIENvbHVtbiB8 ICBUeXBlICAgfCBDb2xsYXRpb24gfCBOdWxsYWJsZSB8IERlZmF1bHQgCistLS0tLS0tLSst LS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0KKyBhICAgICAgfCBp bnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCAKKyBiICAgICAgfCBpbnRlZ2VyIHwg ICAgICAgICAgIHwgICAgICAgICAgfCAKKyBjICAgICAgfCB0ZXh0ICAgIHwgICAgICAgICAg IHwgICAgICAgICAgfCAKK1BhcnRpdGlvbiBvZjogaWR4cGFydCBGT1IgVkFMVUVTIEZST00g KDEwKSBUTyAoMjApCitJbmRleGVzOgorICAgICJpZHhwYXJ0Ml9hX2lkeCIgYnRyZWUgKGEp CisgICAgImlkeHBhcnQyX2FfaWR4MSIgVU5JUVVFLCBidHJlZSAoYSkgSU5WQUxJRAorCitc ZCBpZHhwYXJ0MworICAgICAgICBQYXJ0aXRpb25lZCB0YWJsZSAicHVibGljLmlkeHBhcnQz IgorIENvbHVtbiB8ICBUeXBlICAgfCBDb2xsYXRpb24gfCBOdWxsYWJsZSB8IERlZmF1bHQg CistLS0tLS0tLSstLS0tLS0tLS0rLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0K KyBhICAgICAgfCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCAKKyBiICAgICAg fCBpbnRlZ2VyIHwgICAgICAgICAgIHwgICAgICAgICAgfCAKKyBjICAgICAgfCB0ZXh0ICAg IHwgICAgICAgICAgIHwgICAgICAgICAgfCAKK1BhcnRpdGlvbiBvZjogaWR4cGFydCBGT1Ig VkFMVUVTIEZST00gKDMwKSBUTyAoNDApCitQYXJ0aXRpb24ga2V5OiBSQU5HRSAoYSkKK0lu ZGV4ZXM6CisgICAgImlkeHBhcnQzX2FfaWR4IiBidHJlZSAoYSkKKyAgICAiaWR4cGFydDNf YV9pZHgxIiBVTklRVUUsIGJ0cmVlIChhKSBJTlZBTElECitOdW1iZXIgb2YgcGFydGl0aW9u czogMSAoVXNlIFxkKyB0byBsaXN0IHRoZW0uKQorCitcZCBpZHhwYXJ0MzEKKyAgICAgICAg ICAgICBUYWJsZSAicHVibGljLmlkeHBhcnQzMSIKKyBDb2x1bW4gfCAgVHlwZSAgIHwgQ29s bGF0aW9uIHwgTnVsbGFibGUgfCBEZWZhdWx0IAorLS0tLS0tLS0rLS0tLS0tLS0tKy0tLS0t LS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tCisgYSAgICAgIHwgaW50ZWdlciB8ICAgICAg ICAgICB8ICAgICAgICAgIHwgCisgYiAgICAgIHwgaW50ZWdlciB8ICAgICAgICAgICB8ICAg ICAgICAgIHwgCisgYyAgICAgIHwgdGV4dCAgICB8ICAgICAgICAgICB8ICAgICAgICAgIHwg CitQYXJ0aXRpb24gb2Y6IGlkeHBhcnQzIERFRkFVTFQKK0luZGV4ZXM6CisgICAgImlkeHBh cnQzMV9hX2lkeCIgYnRyZWUgKGEpCisgICAgImlkeHBhcnQzMV9hX2lkeDEiIFVOSVFVRSwg YnRyZWUgKGEpIElOVkFMSUQKKwogZHJvcCB0YWJsZSBpZHhwYXJ0OwogLS0gVmVyaWZ5IGJ1 Z2ZpeCB3aXRoIHF1ZXJ5IG9uIGluZGV4ZWQgcGFydGl0aW9uZWQgdGFibGUgd2l0aCBubyBw YXJ0aXRpb25zCiAtLSBodHRwczovL3Bvc3Rnci5lcy9tLzIwMTgwMTI0MTYyMDA2LnBtYXBm aXpuaGduZ3d0amZAYWx2aGVycmUucGdzcWwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jl c3Mvc3FsL2luZGV4aW5nLnNxbCBiL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL2luZGV4aW5nLnNx bAppbmRleCA1ZjFmNGI4MGM5Li4zOGE3MzBkODc3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9y ZWdyZXNzL3NxbC9pbmRleGluZy5zcWwKKysrIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvaW5k ZXhpbmcuc3FsCkBAIC0yOSwxMCArMjksMzAgQEAgc2VsZWN0IHJlbG5hbWUsIHJlbGtpbmQs IHJlbGhhc3N1YmNsYXNzLCBpbmhwYXJlbnQ6OnJlZ2NsYXNzCiAJd2hlcmUgcmVsbmFtZSBs aWtlICdpZHhwYXJ0JScgb3JkZXIgYnkgcmVsbmFtZTsKIGRyb3AgdGFibGUgaWR4cGFydDsK IAotLS0gU29tZSB1bnN1cHBvcnRlZCBmZWF0dXJlcworLS0gQ0lDIG9uIHBhcnRpdGlvbmVk IHRhYmxlCiBjcmVhdGUgdGFibGUgaWR4cGFydCAoYSBpbnQsIGIgaW50LCBjIHRleHQpIHBh cnRpdGlvbiBieSByYW5nZSAoYSk7Ci1jcmVhdGUgdGFibGUgaWR4cGFydDEgcGFydGl0aW9u IG9mIGlkeHBhcnQgZm9yIHZhbHVlcyBmcm9tICgwKSB0byAoMTApOwotY3JlYXRlIGluZGV4 IGNvbmN1cnJlbnRseSBvbiBpZHhwYXJ0IChhKTsKK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0MSBw YXJ0aXRpb24gb2YgaWR4cGFydCBmb3IgdmFsdWVzIGZyb20gKDApIHRvICgxMCkgcGFydGl0 aW9uIGJ5IHJhbmdlKGEpOworY3JlYXRlIHRhYmxlIGlkeHBhcnQxMSBwYXJ0aXRpb24gb2Yg aWR4cGFydDEgZm9yIHZhbHVlcyBmcm9tICgwKSB0byAoMTApIHBhcnRpdGlvbiBieSByYW5n ZShhKTsKK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0MTExIHBhcnRpdGlvbiBvZiBpZHhwYXJ0MTEg ZGVmYXVsdCBwYXJ0aXRpb24gYnkgcmFuZ2UoYSk7CitjcmVhdGUgdGFibGUgaWR4cGFydDEx MTEgcGFydGl0aW9uIG9mIGlkeHBhcnQxMTEgZGVmYXVsdCBwYXJ0aXRpb24gYnkgcmFuZ2Uo YSk7CitjcmVhdGUgdGFibGUgaWR4cGFydDIgcGFydGl0aW9uIG9mIGlkeHBhcnQgZm9yIHZh bHVlcyBmcm9tICgxMCkgdG8gKDIwKTsKK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0MyBwYXJ0aXRp b24gb2YgaWR4cGFydCBmb3IgdmFsdWVzIGZyb20gKDMwKSB0byAoNDApIHBhcnRpdGlvbiBi eSByYW5nZShhKTsKK2NyZWF0ZSB0YWJsZSBpZHhwYXJ0MzEgcGFydGl0aW9uIG9mIGlkeHBh cnQzIGRlZmF1bHQ7CisKK2luc2VydCBpbnRvIGlkeHBhcnQyIHZhbHVlcygxMCksKDEwKTsg LS0gbm90IHVuaXF1ZQorY3JlYXRlIGluZGV4IGNvbmN1cnJlbnRseSBvbiBpZHhwYXJ0MTEg KGEpOyAtLSBwYXJ0aXRpb25lZCBhbmQgcGFydGl0aW9uLCB3aXRoIG5vIGxlYXZlcworY3Jl YXRlIGluZGV4IGNvbmN1cnJlbnRseSBvbiBpZHhwYXJ0MSAoYSk7IC0tIHBhcnRpdGlvbmVk IGFuZCBwYXJ0aXRpb24KK2NyZWF0ZSBpbmRleCBjb25jdXJyZW50bHkgb24gaWR4cGFydDIg KGEpOyAtLSBsZWFmCitjcmVhdGUgaW5kZXggY29uY3VycmVudGx5IG9uIGlkeHBhcnQgKGEp OyAtLSBwYXJ0aXRpb25lZAorY3JlYXRlIHVuaXF1ZSBpbmRleCBjb25jdXJyZW50bHkgb24g aWR4cGFydCAoYSk7IC0tIHBhcnRpdGlvbmVkLCB1bmlxdWUgZmFpbHVyZQorXGQgaWR4cGFy dAorXGQgaWR4cGFydDEKK1xkIGlkeHBhcnQxMQorXGQgaWR4cGFydDExMQorXGQgaWR4cGFy dDExMTEKK1xkIGlkeHBhcnQyCitcZCBpZHhwYXJ0MworXGQgaWR4cGFydDMxCiBkcm9wIHRh YmxlIGlkeHBhcnQ7CiAKIC0tIFZlcmlmeSBidWdmaXggd2l0aCBxdWVyeSBvbiBpbmRleGVk IHBhcnRpdGlvbmVkIHRhYmxlIHdpdGggbm8gcGFydGl0aW9ucwotLSAKMi4zNC4xCgo= --------------5pjSR2798GAoXN6eF47sh1Xz--