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 1tvejJ-006not-34 for pgsql-hackers@arkaria.postgresql.org; Fri, 21 Mar 2025 15:56:17 +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 1tvejH-00AMGV-PU for pgsql-hackers@arkaria.postgresql.org; Fri, 21 Mar 2025 15:56:15 +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 1tvejH-00AMGK-D4 for pgsql-hackers@lists.postgresql.org; Fri, 21 Mar 2025 15:56:15 +0000 Received: from mail-wr1-x432.google.com ([2a00:1450:4864:20::432]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1tvejF-000LSZ-0Y for pgsql-hackers@postgresql.org; Fri, 21 Mar 2025 15:56:15 +0000 Received: by mail-wr1-x432.google.com with SMTP id ffacd0b85a97d-391342fc1f6so1769905f8f.1 for ; Fri, 21 Mar 2025 08:56:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1742572571; x=1743177371; darn=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=Vw086E8H/2c6FFD25ieWrmjomLMSy9MDQKi9z95ncoI=; b=cOw28ApsYEtyYqC2BH8piGzgERtmIzK9Upqhv8jzHjMx5K+4R+6DM1aB7ZG1FNVyvc kW/jWG7CMGL89hZ3JwanTpyMFq2/8UZFFFGJ9K6GtILEX48eu/KRrnFMtUIFgrOeVCuv rgd+trgj6iEkhRqbTv6eiklzC8NqVdoizxOLcLr6xulEq0V8pBDHkEA4nrwgwnFNPPnR EmfzWZNl2sCRQ3RU63QEfakM9XvEjx8AFaV4Iv+ErWTvIvHzjMDxc42zq13dWvoBkcDe o+jKOzxcqKIWap2HM/sfZEOmtpb4kSJr8geUhuPOEzPw2KYTvVe35wIYdymbTt0Vk7vB X25Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1742572571; x=1743177371; 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=Vw086E8H/2c6FFD25ieWrmjomLMSy9MDQKi9z95ncoI=; b=kgkjb+Oxhif74Dx3g3PACFpx2bFkvsZ4ZhgtZeXqOfOjjom8sm2RbQ1iVEXvvZMULV aX3up1wTaXHhRCF6beB/T2E5omEbyY3RdXnjpMNFkuYLqd7t0uLaRMEKPFk9+j6l9NYj l3jtUhKS18Jv5YWa6qu2AUnv7QLlQxIGg/nAfd+dZ5SbRncZ1ad3f3yo16YLt0ghQH7u rTtz7+4M7lXconHyvuzSH9lby3ehRShcvGdEmHsl7Qp9hFYM3yJFKv3or2n4pvTlXa4O HQzKxA/jJtd82dOmmnKqhRYMHTpaMzopQmXJw69XK5eTVndIm0sHZKtzbimnlhrt612U mXgA== X-Gm-Message-State: AOJu0Yw8lw71VRlQREMT1aMXTiNk6Gs7ZkC8QjZt7cCvBWtKaMNPL4Ra 7nFuhPfhN1VjILhs0QiXc1CprxT5+P+w6dB/4cU+3P3g8stlMNoS X-Gm-Gg: ASbGncvCcB/iYem6RqFX7KxTO/F00HKLD4b97zNnOcKK91MqYpREq3wkWbypKjov/zE fhiCLuLrbemdftyRV1CXltnZ9ULvlm204T6Yuh6UoF7KZ1dz6g7oosqsGS01VQuKKQvyxNYMJty l6IBlqqdlA5mW0+suKFptJ6Wps26Ju7G4jmptXW0P1nMwkqNI+cuZLRYaALyzKYbQlPS4/X0eNN 0qjseVUh4QSWHe59VwoxLm1m3TgQ+Jf1hjDXrHrOve3WqW59wFsbhQuc0P5Q71m4b2pIYq/ry/d F9Reo5UNbsSxGWIRIvdgfuRkBplfqajKbX23ilnKtXxHc+BUaduvswSPj/Wdosek7c3dLofyBQ= = X-Google-Smtp-Source: AGHT+IFOmpnMGW1dwmzDAhK1LweiYcOm9TA9MYEvd3Icc2JtUo037zEVmWcjm6/cu/Bzaktvcl25oQ== X-Received: by 2002:a5d:64af:0:b0:391:2bcc:11f2 with SMTP id ffacd0b85a97d-3997f8f8321mr4243216f8f.1.1742572570968; Fri, 21 Mar 2025 08:56:10 -0700 (PDT) Received: from [10.225.143.200] ([85.184.94.138]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3997f9956b4sm2684611f8f.7.2025.03.21.08.56.10 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 21 Mar 2025 08:56:10 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------keb5gZCTUZEfA462F0rXPmL9" Message-ID: Date: Fri, 21 Mar 2025 16:56:09 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Memoize ANTI and SEMI JOIN inner To: David Rowley Cc: PostgreSQL-development References: <60bf8d26-7c7e-4915-b544-afdb9020011d@gmail.com> <95586c5d-2632-4f1c-bfb9-4c391f260de4@gmail.com> Content-Language: en-US From: Andrei Lepikhov 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. --------------keb5gZCTUZEfA462F0rXPmL9 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 20/3/2025 07:02, David Rowley wrote: > On Thu, 20 Mar 2025 at 06:16, Andrei Lepikhov wrote: >> How can we be sure that semi or anti-join needs only one tuple? I think >> it would be enough to control the absence of join clauses and filters in >> the join. Unfortunately, we only have such a guarantee in the plan >> creation stage (maybe even setrefs.c). So, it seems we need to invent an >> approach like AlternativeSubplan. > > I suggest looking at what 9e215378d did. You might be able to also > allow semi and anti-joins providing the cache keys cover the entire > join condition. I think this might be safe as Nested Loop will only > ask its inner subnode for the first match before skipping to the next > outer row and with anti-join, there's no reason to look for additional > rows after the first. Semi-join and unique joins do the same thing in > nodeNestloop.c. To save doing additional checks at run-time, the code > does: Thank you for the clue! I almost took the wrong direction. I have attached the new patch, which includes corrected comments for better clarification of the changes, as well as some additional tests. I now feel much more confident about this version since I have resolved that concern. -- regards, Andrei Lepikhov --------------keb5gZCTUZEfA462F0rXPmL9 Content-Type: text/plain; charset=UTF-8; name="v1-0001-Memoise-the-inner-of-SEMI-and-ANTI-join.patch" Content-Disposition: attachment; filename="v1-0001-Memoise-the-inner-of-SEMI-and-ANTI-join.patch" Content-Transfer-Encoding: base64 RnJvbSBjNTg5N2UzMWQyYTk1ZGUwNGZhMGU2NDFhZWZmNDNmMzExOGJjY2VkIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmVpIFYuIExlcGlraG92IiA8bGVwaWhvdkBn bWFpbC5jb20+CkRhdGU6IEZyaSwgMjEgTWFyIDIwMjUgMTU6NTU6NDAgKzAxMDAKU3ViamVj dDogW1BBVENIIHYxXSBNZW1vaXNlIHRoZSBpbm5lciBvZiBTRU1JLSBhbmQgQU5USS1qb2lu LgoKVG8gcHJvZHVjZSB0aGUgcmVzdWx0IG9mIHNlbWktam9pbiBvciBhbnRpLWpvaW4sIHdl IG9ubHkgbmVlZCBvbmUgdHVwbGUgZnJvbQp0aGUgcGFyYW1ldGVyaXNlZCBpbm5lci4gVGhl IFBvc3RncmVzIGNvcmUgYWxyZWFkeSBpbmNsdWRlcyBNZW1vaXplJ3MKc2luZ2xlX3JvdyBt b2RlIGZvciB0aGUgY2FzZSB3aGVuIGl0IGlzIHByb3ZlZCB0aGF0IGlubmVyIHJldHVybnMg b25seSBhIHNpbmdsZQp2YWx1ZS4gVGh1cywgaW1wbGVtZW50aW5nIHNpbWlsYXIgbG9naWMg Zm9yIHNlbWktam9pbnMgYW5kIGFudGktam9pbnMgaXMKcXVpdGUgZG9hYmxlLgoKVXN1YWxs eSwgdGhlc2UgdHlwZXMgb2Ygam9pbiBuZWVkIG9ubHkgc2luZ2xlIHR1cGxlIGZyb20gdGhl IGlubmVyIHRvIHByb2R1Y2UKcmVzdWx0IGZvciBlYWNoIG91dGVyIHR1cGxlLiBCdXQgaWYg YWZ0ZXIgcHVzaGluZyBwYXJhbWV0ZXJpc2VkIGNsYXVzZXMgZG93biB0bwp0aGUgaW5uZXIg dGhlIE5lc3RMb29wIHN0aWxsIGhhdmUgc29tZSBqb2luIGNsYXVzZXMgb3IgZmlsdGVycywg aXQgbWF5IHJlamVjdApzb21lIGlubmVyIHR1cGxlcyBkdXJpbmcgZXhlY3V0aW9uIGFuZCBj YWxsIHRoZSBpbm5lciBtb3JlIHRoYW4gb25jZS4gVG8gcHJldmVudAp0aGF0IHdlIGNoZWNr IHRoYXQgYWxsIHRoZSByZXN0cmljdGlvbnMgaGF2ZSBiZWVuIHB1c2hlZCB0byB0aGUgaW5u ZXIuCi0tLQogc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jICAgICAgICAgIHwgICA0 ICsKIHNyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMgICB8ICAgMiArLQog c3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvam9pbnBhdGguYyAgIHwgIDIxICsrKy0tCiBz cmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wYXRobm9kZS5jICAgfCAgIDIgKy0KIHNyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQgICAgICB8ICAgMyArLQogc3JjL3Rlc3Qv cmVncmVzcy9leHBlY3RlZC9tZW1vaXplLm91dCAgIHwgMTAyICsrKysrKysrKysrKysrKysr KysrKysrKwogc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0IHwgICAz ICstCiBzcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1vaXplLnNxbCAgICAgICAgfCAgNDkgKysr KysrKysrKysrCiA4IGZpbGVzIGNoYW5nZWQsIDE3NCBpbnNlcnRpb25zKCspLCAxMiBkZWxl dGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMg Yi9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMKaW5kZXggMzkxYjM0YTJhZjIuLjFi NGIzYjc0MGFiIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9leHBsYWluLmMK KysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvZXhwbGFpbi5jCkBAIC0zNjI4LDYgKzM2Mjgs MTAgQEAgc2hvd19tZW1vaXplX2luZm8oTWVtb2l6ZVN0YXRlICptc3RhdGUsIExpc3QgKmFu Y2VzdG9ycywgRXhwbGFpblN0YXRlICplcykKIAlFeHBsYWluUHJvcGVydHlUZXh0KCJDYWNo ZSBLZXkiLCBrZXlzdHIuZGF0YSwgZXMpOwogCUV4cGxhaW5Qcm9wZXJ0eVRleHQoIkNhY2hl IE1vZGUiLCBtc3RhdGUtPmJpbmFyeV9tb2RlID8gImJpbmFyeSIgOiAibG9naWNhbCIsIGVz KTsKIAorCS8qIFJlcG9ydCBvbmx5IGluIHRoZSBzaW5nbGUgbW9kZSBjYXNlIHRvIG5vdCBi cmVhayBjdXJyZW50IHRlc3RzICovCisJaWYgKG1zdGF0ZS0+c2luZ2xlcm93KQorCQlFeHBs YWluUHJvcGVydHlUZXh0KCJTdG9yZSBNb2RlIiwgInNpbmdsZXJvdyIsIGVzKTsKKwogCXBm cmVlKGtleXN0ci5kYXRhKTsKIAogCWlmICghZXMtPmFuYWx5emUpCmRpZmYgLS1naXQgYS9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jIGIvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvY29zdHNpemUuYwppbmRleCBmNmY3N2I4ZmUxOS4uOTQxYmE2ZTFkNDkg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMKKysr IGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY29zdHNpemUuYwpAQCAtMjU0NSw3ICsy NTQ1LDcgQEAgY29zdF9tZW1vaXplX3Jlc2NhbihQbGFubmVySW5mbyAqcm9vdCwgTWVtb2l6 ZVBhdGggKm1wYXRoLAogCUxpc3RDZWxsICAgKmxjOwogCUNvc3QJCWlucHV0X3N0YXJ0dXBf Y29zdCA9IG1wYXRoLT5zdWJwYXRoLT5zdGFydHVwX2Nvc3Q7CiAJQ29zdAkJaW5wdXRfdG90 YWxfY29zdCA9IG1wYXRoLT5zdWJwYXRoLT50b3RhbF9jb3N0OwotCWRvdWJsZQkJdHVwbGVz ID0gbXBhdGgtPnN1YnBhdGgtPnJvd3M7CisJZG91YmxlCQl0dXBsZXMgPSBtcGF0aC0+c2lu Z2xlcm93ID8gMSA6IG1wYXRoLT5zdWJwYXRoLT5yb3dzOwogCWRvdWJsZQkJY2FsbHMgPSBt cGF0aC0+Y2FsbHM7CiAJaW50CQkJd2lkdGggPSBtcGF0aC0+c3VicGF0aC0+cGF0aHRhcmdl dC0+d2lkdGg7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2pv aW5wYXRoLmMgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9qb2lucGF0aC5jCmluZGV4 IDE4ODkxY2U5MTU2Li5jNzU0MDhmNTUyYiAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3BhdGgvam9pbnBhdGguYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0 aC9qb2lucGF0aC5jCkBAIC02ODIsNiArNjgyLDcgQEAgZ2V0X21lbW9pemVfcGF0aChQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqaW5uZXJyZWwsCiAJTGlzdENlbGwgICAqbGM7 CiAJYm9vbAkJYmluYXJ5X21vZGU7CiAJTGlzdAkgICAqcGhfbGF0ZXJhbF92YXJzOworCWJv b2wJCXNpbmdsZV9tb2RlID0gZmFsc2U7CiAKIAkvKiBPYnZpb3VzbHkgbm90IGlmIGl0J3Mg ZGlzYWJsZWQgKi8KIAlpZiAoIWVuYWJsZV9tZW1vaXplKQpAQCAtNzE1LDIzICs3MTYsMjcg QEAgZ2V0X21lbW9pemVfcGF0aChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqaW5u ZXJyZWwsCiAJCXJldHVybiBOVUxMOwogCiAJLyoKLQkgKiBDdXJyZW50bHkgd2UgZG9uJ3Qg ZG8gdGhpcyBmb3IgU0VNSSBhbmQgQU5USSBqb2lucyB1bmxlc3MgdGhleSdyZQotCSAqIG1h cmtlZCBhcyBpbm5lcl91bmlxdWUuICBUaGlzIGlzIGJlY2F1c2UgbmVzdGVkIGxvb3AgU0VN SS9BTlRJIGpvaW5zCi0JICogZG9uJ3Qgc2NhbiB0aGUgaW5uZXIgbm9kZSB0byBjb21wbGV0 aW9uLCB3aGljaCB3aWxsIG1lYW4gbWVtb2l6ZSBjYW5ub3QKLQkgKiBtYXJrIHRoZSBjYWNo ZSBlbnRyeSBhcyBjb21wbGV0ZS4KKwkgKiBXZSBtYXkgZG8gdGhpcyBmb3IgU0VNSSBvciBB TlRJIGpvaW5zIHdoZW4gdGhleSBuZWVkIG9ubHkgb25lIHR1cGxlIGZyb20KKwkgKiB0aGUg aW5uZXIgc2lkZSB0byBwcm9kdWNlIHRoZSByZXN1bHQuIEZvbGxvd2luZyBpZiBjb25kaXRp b24gY2hlY2tzIHRoYXQKKwkgKiBydWxlLgogCSAqCiAJICogWFhYIEN1cnJlbnRseSB3ZSBk b24ndCBhdHRlbXB0IHRvIG1hcmsgU0VNSS9BTlRJIGpvaW5zIGFzIGlubmVyX3VuaXF1ZQog CSAqID0gdHJ1ZS4gIFNob3VsZCB3ZT8gIFNlZSBhZGRfcGF0aHNfdG9fam9pbnJlbCgpCiAJ ICovCiAJaWYgKCFleHRyYS0+aW5uZXJfdW5pcXVlICYmIChqb2ludHlwZSA9PSBKT0lOX1NF TUkgfHwKIAkJCQkJCQkJIGpvaW50eXBlID09IEpPSU5fQU5USSkpCi0JCXJldHVybiBOVUxM OworCQlzaW5nbGVfbW9kZSA9IHRydWU7CiAKIAkvKgogCSAqIE1lbW9pemUgbm9ybWFsbHkg bWFya3MgY2FjaGUgZW50cmllcyBhcyBjb21wbGV0ZSB3aGVuIGl0IHJ1bnMgb3V0IG9mCiAJ ICogdHVwbGVzIHRvIHJlYWQgZnJvbSBpdHMgc3VicGxhbi4gIEhvd2V2ZXIsIHdpdGggdW5p cXVlIGpvaW5zLCBOZXN0ZWQKIAkgKiBMb29wIHdpbGwgc2tpcCB0byB0aGUgbmV4dCBvdXRl ciB0dXBsZSBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBtYXRjaGluZwotCSAqIGlubmVyIHR1 cGxlLiAgVGhpcyBtZWFucyB0aGF0IHdlIG1heSBub3QgcmVhZCB0aGUgaW5uZXIgc2lkZSBv ZiB0aGUKKwkgKiBpbm5lciB0dXBsZS4gQW5vdGhlciBjYXNlIGlzIGEgc2VtaSBvciBhbnRp IGpvaW4uIElmIG51bWJlciBvZiBqb2luCisJICogY2xhdXNlcywgcHVzaGVkIHRvIHRoZSBp bm5lciBhcyBwYXJhbWV0ZXJpc2VkIGZpbHRlciBubyBsZXNzIHRoYW4gdGhlCisJICogbnVt YmVyIG9mIGpvaW4gY2xhdXNlcywgdGhhdCBtZWFucyBhbGwgdGhlIGNsYXVzZXMgaGF2ZSBi ZWVuIHB1c2hlZCB0bworCSAqIHRoZSBpbm5lciBhbmQgYW55IHR1cGxlIGNvbWluZyBmcm9t IHRoZSBpbm5lciBzaWRlIHdpbGwgYmUgc3VjY2Vzc2Z1bGx5CisJICogdXNlZCB0byBidWls ZCB0aGUgam9pbiByZXN1bHQuCisJICogVGhpcyBtZWFucyB0aGF0IHdlIG1heSBub3QgcmVh ZCB0aGUgaW5uZXIgc2lkZSBvZiB0aGUKIAkgKiBqb2luIHRvIGNvbXBsZXRpb24gd2hpY2gg bGVhdmVzIG5vIG9wcG9ydHVuaXR5IHRvIG1hcmsgdGhlIGNhY2hlIGVudHJ5CiAJICogYXMg Y29tcGxldGUuICBUbyB3b3JrIGFyb3VuZCB0aGF0LCB3aGVuIHRoZSBqb2luIGlzIHVuaXF1 ZSB3ZQogCSAqIGF1dG9tYXRpY2FsbHkgbWFyayBjYWNoZSBlbnRyaWVzIGFzIGNvbXBsZXRl IGFmdGVyIGZldGNoaW5nIHRoZSBmaXJzdApAQCAtNzUzLDcgKzc1OCw3IEBAIGdldF9tZW1v aXplX3BhdGgoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKmlubmVycmVsLAogCSAq IHRoZSBpbm5lciBzY2FuJ3MgZmlsdGVyIGluc3RlYWQgb2YgdGhlIGpvaW4gZmlsdGVyLiAg TWF5YmUgaXQncyB3b3J0aAogCSAqIGNvbnNpZGVyaW5nIGRvaW5nIHRoYXQ/CiAJICovCi0J aWYgKGV4dHJhLT5pbm5lcl91bmlxdWUgJiYKKwlpZiAoKGV4dHJhLT5pbm5lcl91bmlxdWUg fHwgc2luZ2xlX21vZGUpICYmCiAJCShpbm5lcl9wYXRoLT5wYXJhbV9pbmZvID09IE5VTEwg fHwKIAkJIGJtc19udW1fbWVtYmVycyhpbm5lcl9wYXRoLT5wYXJhbV9pbmZvLT5wcGlfc2Vy aWFscykgPAogCQkgbGlzdF9sZW5ndGgoZXh0cmEtPnJlc3RyaWN0bGlzdCkpKQpAQCAtODA4 LDcgKzgxMyw3IEBAIGdldF9tZW1vaXplX3BhdGgoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9w dEluZm8gKmlubmVycmVsLAogCQkJCQkJCQkJCQlpbm5lcl9wYXRoLAogCQkJCQkJCQkJCQlw YXJhbV9leHBycywKIAkJCQkJCQkJCQkJaGFzaF9vcGVyYXRvcnMsCi0JCQkJCQkJCQkJCWV4 dHJhLT5pbm5lcl91bmlxdWUsCisJCQkJCQkJCQkJCWV4dHJhLT5pbm5lcl91bmlxdWUgfHwg c2luZ2xlX21vZGUsCiAJCQkJCQkJCQkJCWJpbmFyeV9tb2RlLAogCQkJCQkJCQkJCQlvdXRl cl9wYXRoLT5yb3dzKTsKIAl9CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIv dXRpbC9wYXRobm9kZS5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcGF0aG5vZGUu YwppbmRleCA5M2U3M2NiNDRkYi4uOWI0YzBmOTYxOTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL29wdGltaXplci91dGlsL3BhdGhub2RlLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3V0aWwvcGF0aG5vZGUuYwpAQCAtMTcwNyw3ICsxNzA3LDcgQEAgY3JlYXRlX21lbW9p emVfcGF0aChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLCBQYXRoICpzdWJw YXRoLAogCSAqLwogCXBhdGhub2RlLT5wYXRoLnN0YXJ0dXBfY29zdCA9IHN1YnBhdGgtPnN0 YXJ0dXBfY29zdCArIGNwdV90dXBsZV9jb3N0OwogCXBhdGhub2RlLT5wYXRoLnRvdGFsX2Nv c3QgPSBzdWJwYXRoLT50b3RhbF9jb3N0ICsgY3B1X3R1cGxlX2Nvc3Q7Ci0JcGF0aG5vZGUt PnBhdGgucm93cyA9IHN1YnBhdGgtPnJvd3M7CisJcGF0aG5vZGUtPnBhdGgucm93cyA9IChw YXRobm9kZS0+c2luZ2xlcm93KSA/IDEgOiBzdWJwYXRoLT5yb3dzOwogCiAJcmV0dXJuIHBh dGhub2RlOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9qb2lu Lm91dCBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQKaW5kZXggYTU3YmIx OGMyNGYuLmU4MjkzYzNjODdkIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVj dGVkL2pvaW4ub3V0CisrKyBiL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvam9pbi5vdXQK QEAgLTY0NjksMTAgKzY0NjksMTEgQEAgc2VsZWN0ICogZnJvbSBzaiB0MQogICAgLT4gIE1l bW9pemUKICAgICAgICAgIENhY2hlIEtleTogdDEuYSwgdDEuYgogICAgICAgICAgQ2FjaGUg TW9kZTogYmluYXJ5CisgICAgICAgICBTdG9yZSBNb2RlOiBzaW5nbGVyb3cKICAgICAgICAg IC0+ICBTYW1wbGUgU2NhbiBvbiBzagogICAgICAgICAgICAgICAgU2FtcGxpbmc6IHN5c3Rl bSAodDEuYikKICAgICAgICAgICAgICAgIEZpbHRlcjogKHQxLmEgPSBhKQotKDggcm93cykK Kyg5IHJvd3MpCiAKIC0tIEVuc3VyZSB0aGF0IFNKRSBkb2VzIG5vdCBmb3JtIGEgc2VsZi1y ZWZlcmVudGlhbCBsYXRlcmFsIGRlcGVuZGVuY3kKIGV4cGxhaW4gKGNvc3RzIG9mZikKZGlm ZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvbWVtb2l6ZS5vdXQgYi9zcmMv dGVzdC9yZWdyZXNzL2V4cGVjdGVkL21lbW9pemUub3V0CmluZGV4IDM4ZGZhZjAyMWM5Li4z YWQ0NzNiMjExZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9tZW1v aXplLm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL21lbW9pemUub3V0CkBA IC01MDAsMyArNTAwLDEwNSBAQCBSRVNFVCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0 aGVyOwogUkVTRVQgcGFyYWxsZWxfdHVwbGVfY29zdDsKIFJFU0VUIHBhcmFsbGVsX3NldHVw X2Nvc3Q7CiBSRVNFVCBtaW5fcGFyYWxsZWxfdGFibGVfc2Nhbl9zaXplOworLS0KKy0tIFRl c3RzIG9uIE1lbW9pemUgdW5kZXIgU0VNSSBhbmQgQU5USSBqb2lucy4KKy0tCitDUkVBVEUg VEFCTEUgbWVtX3NlbWlfaW5uZXJfYSAoeCBpbnQsIHogaW50KTsKK0NSRUFURSBUQUJMRSBt ZW1fc2VtaV9pbm5lcl9iICh4IGludCwgeSBpbnQpOworQ1JFQVRFIFRBQkxFIG1lbV9zZW1p X2lubmVyX2MgKHggaW50LCB5IGludCwgeiBpbnQpOworSU5TRVJUIElOVE8gbWVtX3NlbWlf aW5uZXJfYSAoeCx6KQorICAoU0VMRUNUIHZhbHVlJTIsIC00MiBGUk9NIGdlbmVyYXRlX3Nl cmllcygxLDEwKSBBUyB2YWx1ZSk7CitJTlNFUlQgSU5UTyBtZW1fc2VtaV9pbm5lcl9iICh4 LHkpCisgIChTRUxFQ1QgdmFsdWUlNSwgLXZhbHVlJTUtMSBGUk9NIGdlbmVyYXRlX3Nlcmll cygxLDEwKSBBUyB2YWx1ZSk7CitJTlNFUlQgSU5UTyBtZW1fc2VtaV9pbm5lcl9jICh4LHks eikKKyAgKFNFTEVDVCB2YWx1ZSU1MCwgdmFsdWUsIC00MiBGUk9NIGdlbmVyYXRlX3Nlcmll cygxLDEwMCkgQVMgdmFsdWUpOworQ1JFQVRFIElOREVYIE9OIG1lbV9zZW1pX2lubmVyX2Io eCk7CitDUkVBVEUgSU5ERVggT04gbWVtX3NlbWlfaW5uZXJfYyh4LHopOworVkFDVVVNIEFO QUxZWkUgbWVtX3NlbWlfaW5uZXJfYSxtZW1fc2VtaV9pbm5lcl9iLG1lbV9zZW1pX2lubmVy X2M7CistLSBGb3JjZSBOZXN0TG9vcCBhbmQgSW5kZXhTY2FuLiBIb3BlLCB0aGUgTWVtb2l6 ZSBub2RlIHdpbiB0aGUgY29zdAorLS0gY29tcGV0aXRpb24gb24gdGhlIGlubmVyIGMgdGFi bGUgc2Nhbi4KK1NFVCBlbmFibGVfaGFzaGpvaW4gPSAnb2ZmJzsKK1NFVCBlbmFibGVfbWVy Z2Vqb2luID0gJ29mZic7CitTRVQgZW5hYmxlX3NlcXNjYW4gPSAnb2ZmJzsKKy0tIFByaW1p dGl2ZSBleGFtcGxlIG9mIHNlbWkgYW5kIGFudGkgam9pbiBjYWNoaW5nIHRoZSBpbm5lcidz IHJlc3VsdAorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGEueCBGUk9NIG1lbV9zZW1p X2lubmVyX2EgYQorV0hFUkUgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIG1lbV9zZW1pX2lubmVy X2MgYyBXSEVSRSBjLng9YS54KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBTZW1pIEpvaW4KKyAg IC0+ICBTZXEgU2NhbiBvbiBtZW1fc2VtaV9pbm5lcl9hIGEKKyAgICAgICAgIERpc2FibGVk OiB0cnVlCisgICAtPiAgTWVtb2l6ZQorICAgICAgICAgQ2FjaGUgS2V5OiBhLngKKyAgICAg ICAgIENhY2hlIE1vZGU6IGxvZ2ljYWwKKyAgICAgICAgIFN0b3JlIE1vZGU6IHNpbmdsZXJv dworICAgICAgICAgLT4gIEluZGV4IE9ubHkgU2NhbiB1c2luZyBtZW1fc2VtaV9pbm5lcl9j X3hfel9pZHggb24gbWVtX3NlbWlfaW5uZXJfYyBjCisgICAgICAgICAgICAgICBJbmRleCBD b25kOiAoeCA9IGEueCkKKyg5IHJvd3MpCisKK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVD VCBhLnggRlJPTSBtZW1fc2VtaV9pbm5lcl9hIGEKK1dIRVJFIE5PVCBFWElTVFMgKFNFTEVD VCAxIEZST00gbWVtX3NlbWlfaW5uZXJfYyBjIFdIRVJFIGMueD1hLngpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE5l c3RlZCBMb29wIEFudGkgSm9pbgorICAgLT4gIFNlcSBTY2FuIG9uIG1lbV9zZW1pX2lubmVy X2EgYQorICAgICAgICAgRGlzYWJsZWQ6IHRydWUKKyAgIC0+ICBNZW1vaXplCisgICAgICAg ICBDYWNoZSBLZXk6IGEueAorICAgICAgICAgQ2FjaGUgTW9kZTogbG9naWNhbAorICAgICAg ICAgU3RvcmUgTW9kZTogc2luZ2xlcm93CisgICAgICAgICAtPiAgSW5kZXggT25seSBTY2Fu IHVzaW5nIG1lbV9zZW1pX2lubmVyX2NfeF96X2lkeCBvbiBtZW1fc2VtaV9pbm5lcl9jIGMK KyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh4ID0gYS54KQorKDkgcm93cykKKworLS0g Q2hlY2sgdGhlIHF1ZXJ5IHBsYW5zIGNvbnRhaW4gdGhlIE1lbW9pemUgbm9kZSBvdmVyIHRo ZSAiU2NhbiBiIiBvcGVyYXRvcgorLS0gYW5kIGRvZXMgbm90IGNvbnRhaW4gbWVtb2l6ZSBv dmVyICJTY2FuIGMiLgorRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGEueCwgYi54IEZS T00gbWVtX3NlbWlfaW5uZXJfYSBhCisgIExFRlQgSk9JTiBtZW1fc2VtaV9pbm5lcl9iIGIg T04gKGEueD1iLngpCitXSEVSRSBFWElTVFMgKAorICBTRUxFQ1QgMSBGUk9NIG1lbV9zZW1p X2lubmVyX2MgYyBXSEVSRSBjLng9YS54IEFORCBjLnk9Yi55IEFORCBjLno9YS56KTsKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t CisgTmVzdGVkIExvb3AgU2VtaSBKb2luCisgICBKb2luIEZpbHRlcjogKChjLnggPSBhLngp IEFORCAoYy56ID0gYS56KSkKKyAgIC0+ICBOZXN0ZWQgTG9vcAorICAgICAgICAgLT4gIFNl cSBTY2FuIG9uIG1lbV9zZW1pX2lubmVyX2EgYQorICAgICAgICAgICAgICAgRGlzYWJsZWQ6 IHRydWUKKyAgICAgICAgIC0+ICBNZW1vaXplCisgICAgICAgICAgICAgICBDYWNoZSBLZXk6 IGEueAorICAgICAgICAgICAgICAgQ2FjaGUgTW9kZTogbG9naWNhbAorICAgICAgICAgICAg ICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgbWVtX3NlbWlfaW5uZXJfYl94X2lkeCBvbiBtZW1f c2VtaV9pbm5lcl9iIGIKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh4ID0g YS54KQorICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgbWVtX3NlbWlfaW5uZXJfY194X3pfaWR4 IG9uIG1lbV9zZW1pX2lubmVyX2MgYworICAgICAgICAgSW5kZXggQ29uZDogKHggPSBiLngp CisgICAgICAgICBGaWx0ZXI6ICh5ID0gYi55KQorKDEzIHJvd3MpCisKK0VYUExBSU4gKENP U1RTIE9GRikKK1NFTEVDVCBhLngsIGIueCBGUk9NIG1lbV9zZW1pX2lubmVyX2EgYQorICBM RUZUIEpPSU4gbWVtX3NlbWlfaW5uZXJfYiBiIE9OIChhLng9Yi54KQorV0hFUkUgTk9UIEVY SVNUUyAoCisgIFNFTEVDVCAxIEZST00gbWVtX3NlbWlfaW5uZXJfYyBjIFdIRVJFIGMueD1h LnggQU5EIGMueT1iLnkgQU5EIGMuej1hLnopOworICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9vcCBBbnRpIEpv aW4KKyAgIEpvaW4gRmlsdGVyOiAoYy55ID0gYi55KQorICAgLT4gIE5lc3RlZCBMb29wIExl ZnQgSm9pbgorICAgICAgICAgLT4gIFNlcSBTY2FuIG9uIG1lbV9zZW1pX2lubmVyX2EgYQor ICAgICAgICAgICAgICAgRGlzYWJsZWQ6IHRydWUKKyAgICAgICAgIC0+ICBNZW1vaXplCisg ICAgICAgICAgICAgICBDYWNoZSBLZXk6IGEueAorICAgICAgICAgICAgICAgQ2FjaGUgTW9k ZTogbG9naWNhbAorICAgICAgICAgICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgbWVtX3Nl bWlfaW5uZXJfYl94X2lkeCBvbiBtZW1fc2VtaV9pbm5lcl9iIGIKKyAgICAgICAgICAgICAg ICAgICAgIEluZGV4IENvbmQ6ICh4ID0gYS54KQorICAgLT4gIEluZGV4IFNjYW4gdXNpbmcg bWVtX3NlbWlfaW5uZXJfY194X3pfaWR4IG9uIG1lbV9zZW1pX2lubmVyX2MgYworICAgICAg ICAgSW5kZXggQ29uZDogKCh4ID0gYS54KSBBTkQgKHogPSBhLnopKQorKDEyIHJvd3MpCisK K0RST1AgVEFCTEUgbWVtX3NlbWlfaW5uZXJfYSxtZW1fc2VtaV9pbm5lcl9iLG1lbV9zZW1p X2lubmVyX2M7CitSRVNFVCBlbmFibGVfaGFzaGpvaW47CitSRVNFVCBlbmFibGVfbWVyZ2Vq b2luOworUkVTRVQgZW5hYmxlX3NlcXNjYW47CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdy ZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5vdXQgYi9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVk L3N1YnNlbGVjdC5vdXQKaW5kZXggZDBkYjhhNDEyZmYuLjVhYjU2ZjhkNzFmIDEwMDY0NAot LS0gYS9zcmMvdGVzdC9yZWdyZXNzL2V4cGVjdGVkL3N1YnNlbGVjdC5vdXQKKysrIGIvc3Jj L3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zdWJzZWxlY3Qub3V0CkBAIC0yNjQyLDYgKzI2NDIs NyBAQCBPTiBCLmh1bmRyZWQgaW4gKFNFTEVDVCBtaW4oYy5odW5kcmVkKSBGUk9NIHRlbmsy IEMgV0hFUkUgYy5vZGQgPSBiLm9kZCk7CiAgICAgICAgICAgICAgICAtPiAgTWVtb2l6ZQog ICAgICAgICAgICAgICAgICAgICAgQ2FjaGUgS2V5OiBiLmh1bmRyZWQsIGIub2RkCiAgICAg ICAgICAgICAgICAgICAgICBDYWNoZSBNb2RlOiBiaW5hcnkKKyAgICAgICAgICAgICAgICAg ICAgIFN0b3JlIE1vZGU6IHNpbmdsZXJvdwogICAgICAgICAgICAgICAgICAgICAgLT4gIFN1 YnF1ZXJ5IFNjYW4gb24gIkFOWV9zdWJxdWVyeSIKICAgICAgICAgICAgICAgICAgICAgICAg ICAgIEZpbHRlcjogKGIuaHVuZHJlZCA9ICJBTllfc3VicXVlcnkiLm1pbikKICAgICAgICAg ICAgICAgICAgICAgICAgICAgIC0+ICBSZXN1bHQKQEAgLTI2NTAsNSArMjY1MSw1IEBAIE9O IEIuaHVuZHJlZCBpbiAoU0VMRUNUIG1pbihjLmh1bmRyZWQpIEZST00gdGVuazIgQyBXSEVS RSBjLm9kZCA9IGIub2RkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgLT4gIEluZGV4IFNjYW4gdXNpbmcgdGVuazJfaHVuZHJlZCBvbiB0ZW5rMiBjCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGV4IENv bmQ6IChodW5kcmVkIElTIE5PVCBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBGaWx0ZXI6IChvZGQgPSBiLm9kZCkKLSgxNiByb3dzKQor KDE3IHJvd3MpCiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL21lbW9pemUu c3FsIGIvc3JjL3Rlc3QvcmVncmVzcy9zcWwvbWVtb2l6ZS5zcWwKaW5kZXggYzBkNDdmYTg3 NWEuLjA0OGM4ZTkwYWQwIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1v aXplLnNxbAorKysgYi9zcmMvdGVzdC9yZWdyZXNzL3NxbC9tZW1vaXplLnNxbApAQCAtMjQ0 LDMgKzI0NCw1MiBAQCBSRVNFVCBtYXhfcGFyYWxsZWxfd29ya2Vyc19wZXJfZ2F0aGVyOwog UkVTRVQgcGFyYWxsZWxfdHVwbGVfY29zdDsKIFJFU0VUIHBhcmFsbGVsX3NldHVwX2Nvc3Q7 CiBSRVNFVCBtaW5fcGFyYWxsZWxfdGFibGVfc2Nhbl9zaXplOworCistLQorLS0gVGVzdHMg b24gTWVtb2l6ZSB1bmRlciBTRU1JIGFuZCBBTlRJIGpvaW5zLgorLS0KKworQ1JFQVRFIFRB QkxFIG1lbV9zZW1pX2lubmVyX2EgKHggaW50LCB6IGludCk7CitDUkVBVEUgVEFCTEUgbWVt X3NlbWlfaW5uZXJfYiAoeCBpbnQsIHkgaW50KTsKK0NSRUFURSBUQUJMRSBtZW1fc2VtaV9p bm5lcl9jICh4IGludCwgeSBpbnQsIHogaW50KTsKK0lOU0VSVCBJTlRPIG1lbV9zZW1pX2lu bmVyX2EgKHgseikKKyAgKFNFTEVDVCB2YWx1ZSUyLCAtNDIgRlJPTSBnZW5lcmF0ZV9zZXJp ZXMoMSwxMCkgQVMgdmFsdWUpOworSU5TRVJUIElOVE8gbWVtX3NlbWlfaW5uZXJfYiAoeCx5 KQorICAoU0VMRUNUIHZhbHVlJTUsIC12YWx1ZSU1LTEgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwxMCkgQVMgdmFsdWUpOworSU5TRVJUIElOVE8gbWVtX3NlbWlfaW5uZXJfYyAoeCx5LHop CisgIChTRUxFQ1QgdmFsdWUlNTAsIHZhbHVlLCAtNDIgRlJPTSBnZW5lcmF0ZV9zZXJpZXMo MSwxMDApIEFTIHZhbHVlKTsKK0NSRUFURSBJTkRFWCBPTiBtZW1fc2VtaV9pbm5lcl9iKHgp OworQ1JFQVRFIElOREVYIE9OIG1lbV9zZW1pX2lubmVyX2MoeCx6KTsKK1ZBQ1VVTSBBTkFM WVpFIG1lbV9zZW1pX2lubmVyX2EsbWVtX3NlbWlfaW5uZXJfYixtZW1fc2VtaV9pbm5lcl9j OworCistLSBGb3JjZSBOZXN0TG9vcCBhbmQgSW5kZXhTY2FuLiBIb3BlLCB0aGUgTWVtb2l6 ZSBub2RlIHdpbiB0aGUgY29zdAorLS0gY29tcGV0aXRpb24gb24gdGhlIGlubmVyIGMgdGFi bGUgc2Nhbi4KK1NFVCBlbmFibGVfaGFzaGpvaW4gPSAnb2ZmJzsKK1NFVCBlbmFibGVfbWVy Z2Vqb2luID0gJ29mZic7CitTRVQgZW5hYmxlX3NlcXNjYW4gPSAnb2ZmJzsKKworLS0gUHJp bWl0aXZlIGV4YW1wbGUgb2Ygc2VtaSBhbmQgYW50aSBqb2luIGNhY2hpbmcgdGhlIGlubmVy J3MgcmVzdWx0CitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgYS54IEZST00gbWVtX3Nl bWlfaW5uZXJfYSBhCitXSEVSRSBFWElTVFMgKFNFTEVDVCAxIEZST00gbWVtX3NlbWlfaW5u ZXJfYyBjIFdIRVJFIGMueD1hLngpOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIGEu eCBGUk9NIG1lbV9zZW1pX2lubmVyX2EgYQorV0hFUkUgTk9UIEVYSVNUUyAoU0VMRUNUIDEg RlJPTSBtZW1fc2VtaV9pbm5lcl9jIGMgV0hFUkUgYy54PWEueCk7CisKKy0tIENoZWNrIHRo ZSBxdWVyeSBwbGFucyBjb250YWluIHRoZSBNZW1vaXplIG5vZGUgb3ZlciB0aGUgIlNjYW4g YiIgb3BlcmF0b3IKKy0tIGFuZCBkb2VzIG5vdCBjb250YWluIG1lbW9pemUgb3ZlciAiU2Nh biBjIi4KK0VYUExBSU4gKENPU1RTIE9GRikKK1NFTEVDVCBhLngsIGIueCBGUk9NIG1lbV9z ZW1pX2lubmVyX2EgYQorICBMRUZUIEpPSU4gbWVtX3NlbWlfaW5uZXJfYiBiIE9OIChhLng9 Yi54KQorV0hFUkUgRVhJU1RTICgKKyAgU0VMRUNUIDEgRlJPTSBtZW1fc2VtaV9pbm5lcl9j IGMgV0hFUkUgYy54PWEueCBBTkQgYy55PWIueSBBTkQgYy56PWEueik7CitFWFBMQUlOIChD T1NUUyBPRkYpCitTRUxFQ1QgYS54LCBiLnggRlJPTSBtZW1fc2VtaV9pbm5lcl9hIGEKKyAg TEVGVCBKT0lOIG1lbV9zZW1pX2lubmVyX2IgYiBPTiAoYS54PWIueCkKK1dIRVJFIE5PVCBF WElTVFMgKAorICBTRUxFQ1QgMSBGUk9NIG1lbV9zZW1pX2lubmVyX2MgYyBXSEVSRSBjLng9 YS54IEFORCBjLnk9Yi55IEFORCBjLno9YS56KTsKKworRFJPUCBUQUJMRSBtZW1fc2VtaV9p bm5lcl9hLG1lbV9zZW1pX2lubmVyX2IsbWVtX3NlbWlfaW5uZXJfYzsKK1JFU0VUIGVuYWJs ZV9oYXNoam9pbjsKK1JFU0VUIGVuYWJsZV9tZXJnZWpvaW47CitSRVNFVCBlbmFibGVfc2Vx c2NhbjsKLS0gCjIuNDguMQoK --------------keb5gZCTUZEfA462F0rXPmL9--