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 1rZPEy-0044Ur-Dd for pgsql-hackers@arkaria.postgresql.org; Mon, 12 Feb 2024 05:52:29 +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 1rZPEv-007LXN-J2 for pgsql-hackers@arkaria.postgresql.org; Mon, 12 Feb 2024 05:52:25 +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 1rZPEv-007LX9-0V for pgsql-hackers@lists.postgresql.org; Mon, 12 Feb 2024 05:52:25 +0000 Received: from mail.postgrespro.ru ([93.174.131.139]) by magus.postgresql.org with esmtps (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rZPEr-006l7h-74 for pgsql-hackers@postgresql.org; Mon, 12 Feb 2024 05:52:23 +0000 Received: from [172.30.0.166] (unknown [172.30.0.166]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client did not present a certificate) (Authenticated sender: a.lepikhov@postgrespro.ru) by mail.postgrespro.ru (Postfix/587) with ESMTPSA id 9384EE20E92; Mon, 12 Feb 2024 08:52:15 +0300 (MSK) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=postgrespro.ru; s=mx2023; t=1707717138; bh=o+8tJ2Lte98EXB0ZlWiXYPeaZizRW2HGjCeZ+LFKn+c=; h=Message-ID:Date:User-Agent:Subject:To:Cc:References:From: In-Reply-To:From; b=cKWtNSi4rBpXl77sbdiNlWaCo0XszxSVq8TbweK8qeZmsSV8eWP/sSkyOH4qmFHsp SNYlRi5wiBTfZNYGb9/SYf/nmtRoBghkKECA8D/VNWtf0aKprkJiUw+c6w8lFnhUn9 QSP0R3pShn2Zc0sP4+BT9HZlxlUXRNq5LqGwjPtxH2213d0OZE6qkj+L5DRgx++3G6 77fkkLHFUq+LfNf1J5zcf4caTyQTqtr0yfaV1MBEcBmabWNJozv7zSnBGgBoNf86AK WzUaJSXBgK1JGpXnl6gBsyFASV+c734v1SsjnBDKHKCFX7uZty7/3QRbVrCPRIGi/J APm8PlToTuDiw== Content-Type: multipart/mixed; boundary="------------FpDJ3gahTHoopmQBrg0t99Kq" Message-ID: Date: Mon, 12 Feb 2024 12:52:13 +0700 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: POC, WIP: OR-clause support for indexes To: jian he Cc: Alena Rybakina , Alexander Korotkov , Robert Haas , pgsql-hackers@postgresql.org, Peter Geoghegan , "Finnerty, Jim" , Marcos Pegoraro , teodor@sigaev.ru, Ranier Vilela , Tomas Vondra , Peter Eisentraut References: <567ED6CA.2040504@sigaev.ru> <04ef16eb-46c1-4ce7-9f68-d1c80ef0be81@postgrespro.ru> <59e67a40-95a8-4d74-ae4e-027ea0f59084@postgrespro.ru> <59b77a8a-29d6-4727-bf26-4a30a6a9719a@postgrespro.ru> <32d23d97-d07f-4d44-9933-ba3295fb3ed8@postgrespro.ru> <7e11e27b-7ab9-4d59-af0a-a921861a9206@postgrespro.ru> <13ad923a-33df-4b44-9e00-c9323cd4c37d@postgrespro.ru> Content-Language: en-US From: Andrei Lepikhov Organization: Postgres Professional 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. --------------FpDJ3gahTHoopmQBrg0t99Kq Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Thanks for the review! It was the first version for discussion. Of course, refactoring and polishing cycles will be needed, even so we can discuss the general idea earlier. On 10/2/2024 12:00, jian he wrote: > On Thu, Feb 8, 2024 at 1:34 PM Andrei Lepikhov > 1235 | PredicatesData *pd; Thanks > + if (!predicate_implied_by(index->indpred, list_make1(rinfo1), true)) > + elog(ERROR, "Logical mistake in OR <-> ANY transformation code"); > the error message seems not clear? Yeah, have rewritten > static List * > build_paths_for_SAOP(PlannerInfo *root, RelOptInfo *rel, RestrictInfo *rinfo, > List *other_clauses) > I am not sure what's `other_clauses`, and `rinfo` refers to? adding > some comments would be great. > > struct PredicatesData needs some comments, I think. Added, not so much though > > +bool > +saop_covered_by_predicates(ScalarArrayOpExpr *saop, List *predicate_lists) > +{ > + ListCell *lc; > + PredIterInfoData clause_info; > + bool result = false; > + bool isConstArray; > + > + Assert(IsA(saop, ScalarArrayOpExpr)); > is this Assert necessary? Not sure. Moved it into another routine. > > For the function build_paths_for_SAOP, I think I understand the first > part of the code. > But I am not 100% sure of the second part of the `foreach(lc, > predicate_lists)` code. > more comments in `foreach(lc, predicate_lists)` would be helpful. Done > > do you need to add `PredicatesData` to src/tools/pgindent/typedefs.list? Done > > I also did some minor refactoring of generate_saop_pathlist. Partially agree > > instead of let it go to `foreach (lc, entries)`, > we can reject the Const array at `foreach(lc, expr->args)` Yeah, I just think we can go further and transform two const arrays into a new one if we have the same clause and operator. In that case, we should allow it to pass through this cycle down to the classification stage. > > also `foreach(lc, expr->args)` do we need to reject cases like > `contain_subplans((Node *) nconst_expr)`? > maybe let the nconst_expr be a Var node would be far more easier. It's contradictory. On the one hand, we simplify the comparison procedure and can avoid expr jumbling at all. On the other hand - we restrict the feature. IMO, it would be better to unite such clauses complex_clause1 IN (..) OR complex_clause1 IN (..) into complex_clause1 IN (.., ..) and don't do duplicated work computing complex clauses. In the attachment - the next version of the second patch. -- regards, Andrei Lepikhov Postgres Professional --------------FpDJ3gahTHoopmQBrg0t99Kq Content-Type: text/plain; charset=UTF-8; name="0002-Teach-generate_bitmap_or_paths-to-build-BitmapOr-pat-20240212.patch" Content-Disposition: attachment; filename*0="0002-Teach-generate_bitmap_or_paths-to-build-BitmapOr-pat-20"; filename*1="240212.patch" Content-Transfer-Encoding: base64 RnJvbSBjMWU1ZmMzNTc3OGFjZDAxY2NhNjdlNjNmZGY4MGM1NjA1YWYwM2YyIE1vbiBTZXAg MTcgMDA6MDA6MDAgMjAwMQpGcm9tOiAiQW5kcmV5IFYuIExlcGlraG92IiA8YS5sZXBpa2hv dkBwb3N0Z3Jlc3Byby5ydT4KRGF0ZTogV2VkLCAyNCBKYW4gMjAyNCAxNDowNzoxNyArMDcw MApTdWJqZWN0OiBbUEFUQ0ggMi8yXSBUZWFjaCBnZW5lcmF0ZV9iaXRtYXBfb3JfcGF0aHMg dG8gYnVpbGQgQml0bWFwT3IgcGF0aHMKIG92ZXIgU0FPUCBjbGF1c2VzLgoKTGlrZXdpc2Ug T1IgY2xhdXNlcywgZGlzY292ZXIgU0FPUCBhcnJheSBhbmQgdHJ5IHRvIHNwbGl0IGl0cyBl bGVtZW50cwpiZXR3ZWVuIHNtYWxsZXIgc2l6ZWQgYXJyYXlzIHRvIGZpdCBhIHNldCBvZiBw YXJ0aWFsIGluZGV4ZXMuCi0tLQogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBh dGguYyAgICAgfCAzMDQgKysrKysrKysrKysrKysrKysrLS0tLQogc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3V0aWwvcHJlZHRlc3QuYyAgICAgfCAgNDYgKysrKwogc3JjL2JhY2tlbmQvb3B0 aW1pemVyL3V0aWwvcmVzdHJpY3RpbmZvLmMgfCAgMTMgKwogc3JjL2luY2x1ZGUvb3B0aW1p emVyL29wdGltaXplci5oICAgICAgICAgfCAgMTYgKysKIHNyYy9pbmNsdWRlL29wdGltaXpl ci9yZXN0cmljdGluZm8uaCAgICAgIHwgICAxICsKIHNyYy90ZXN0L3JlZ3Jlc3MvZXhwZWN0 ZWQvc2VsZWN0Lm91dCAgICAgIHwgMjgyICsrKysrKysrKysrKysrKysrKysrCiBzcmMvdGVz dC9yZWdyZXNzL3NxbC9zZWxlY3Quc3FsICAgICAgICAgICB8ICA4MiArKysrKysKIHNyYy90 b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0ICAgICAgICAgIHwgICAxICsKIDggZmlsZXMg Y2hhbmdlZCwgNjkyIGluc2VydGlvbnMoKyksIDUzIGRlbGV0aW9ucygtKQoKZGlmZiAtLWdp dCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMgYi9zcmMvYmFja2Vu ZC9vcHRpbWl6ZXIvcGF0aC9pbmR4cGF0aC5jCmluZGV4IDMyYzZhOGJiZGMuLjUzODNjYjc2 ZGMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2luZHhwYXRoLmMK KysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvaW5keHBhdGguYwpAQCAtMzIsNiAr MzIsNyBAQAogI2luY2x1ZGUgIm9wdGltaXplci9wYXRocy5oIgogI2luY2x1ZGUgIm9wdGlt aXplci9wcmVwLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL3Jlc3RyaWN0aW5mby5oIgorI2lu Y2x1ZGUgInV0aWxzL2FycmF5LmgiCiAjaW5jbHVkZSAidXRpbHMvbHN5c2NhY2hlLmgiCiAj aW5jbHVkZSAidXRpbHMvc2VsZnVuY3MuaCIKIApAQCAtMTIyMCwxMSArMTIyMSwxNzcgQEAg YnVpbGRfcGF0aHNfZm9yX09SKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWws CiAJcmV0dXJuIHJlc3VsdDsKIH0KIAorLyoKKyAqIEJ1aWxkaW5nIGluZGV4IHBhdGhzIG92 ZXIgU0FPUCBjbGF1c2UgZGlmZmVycyBmcm9tIHRoZSBsb2dpYyBvZiBPUiBjbGF1c2VzLgor ICogSGVyZSB3ZSBpdGVyYXRlIGFjcm9zcyBhbGwgdGhlIGFycmF5IGVsZW1lbnRzIGFuZCBz cGxpdCB0aGVtIHRvIFNBT1BzLAorICogY29ycmVzcG9uZGluZyB0byBkaWZmZXJlbnQgaW5k ZXhlcy4gV2UgbXVzdCBtYXRjaCBlYWNoIGVsZW1lbnQgdG8gYW4gaW5kZXguCisgKi8KK3N0 YXRpYyBMaXN0ICoKK2J1aWxkX3BhdGhzX2Zvcl9TQU9QKFBsYW5uZXJJbmZvICpyb290LCBS ZWxPcHRJbmZvICpyZWwsIFJlc3RyaWN0SW5mbyAqcmluZm8sCisJCQkJCSBMaXN0ICpvdGhl cl9jbGF1c2VzKQoreworCUxpc3QJCQkgICAqcmVzdWx0ID0gTklMOworCUxpc3QJCQkgICAq cHJlZGljYXRlX2xpc3RzID0gTklMOworCUxpc3RDZWxsCQkgICAqbGM7CisJUHJlZGljYXRl c0RhdGEJICAgKnBkOworCVNjYWxhckFycmF5T3BFeHByICAqc2FvcCA9IChTY2FsYXJBcnJh eU9wRXhwciAqKSByaW5mby0+Y2xhdXNlOworCisJQXNzZXJ0KElzQShzYW9wLCBTY2FsYXJB cnJheU9wRXhwcikgJiYgc2FvcC0+dXNlT3IpOworCisJaWYgKCFJc0EobHNlY29uZChzYW9w LT5hcmdzKSwgQ29uc3QpKQorCQkvKgorCQkgKiBIYXMgaXQgcHJhY3RpY2FsIG91dGNvbWUg dG8gbWVyZ2UgYXJyYXlzIHdoaWNoIGNvdWxkbid0IGNvbnN0YW50aWZpZWQKKwkJICogYmVm b3JlIHRoYXQgc3RlcD8KKwkJICovCisJCXJldHVybiBOSUw7CisKKwkvKiBDb2xsZWN0IHBy ZWRpY2F0ZXMgKi8KKwlmb3JlYWNoKGxjLCByZWwtPmluZGV4bGlzdCkKKwl7CisJCUluZGV4 T3B0SW5mbyAqaW5kZXggPSAoSW5kZXhPcHRJbmZvICopIGxmaXJzdChsYyk7CisKKwkJLyog VGFrZSBpbnRvIGNvbnNpZGVyYXRpb24gcGFydGlhbCBpbmRleGVzIHN1cHBvcnRpbmcgYml0 bWFwIHNjYW5zICovCisJCWlmICghaW5kZXgtPmFtaGFzZ2V0Yml0bWFwIHx8IGluZGV4LT5p bmRwcmVkID09IE5JTCB8fCBpbmRleC0+cHJlZE9LKQorCQkJY29udGludWU7CisKKwkJcGQg PSBwYWxsb2MwKHNpemVvZihQcmVkaWNhdGVzRGF0YSkpOworCQlwZC0+aWQgPSBmb3JlYWNo X2N1cnJlbnRfaW5kZXgobGMpOworCQkvKiBUaGUgdHJpY2sgd2l0aCByZWR1Y2luZyByZWN1 cnNpb24gaXMgc3RvbGVuIGZyb20gcHJlZGljYXRlX2ltcGxpZWRfYnkgKi8KKwkJcGQtPnBy ZWRpY2F0ZSA9IGxpc3RfbGVuZ3RoKGluZGV4LT5pbmRwcmVkKSA9PSAxID8KKwkJCQkJCQkJ CQkoTm9kZSAqKSBsaW5pdGlhbChpbmRleC0+aW5kcHJlZCkgOgorCQkJCQkJCQkJCShOb2Rl ICopIGluZGV4LT5pbmRwcmVkOworCQlwcmVkaWNhdGVfbGlzdHMgPSBsYXBwZW5kKHByZWRp Y2F0ZV9saXN0cywgKHZvaWQgKikgcGQpOworCX0KKworCS8qIFNwbGl0IHRoZSBhcnJheSBk YXRhIGFjY29yZGluZyB0byBpbmRleCBwcmVkaWNhdGVzLiAqLworCWlmIChwcmVkaWNhdGVf bGlzdHMgPT0gTklMIHx8CisJCSFzYW9wX2NvdmVyZWRfYnlfcHJlZGljYXRlcyhzYW9wLCBw cmVkaWNhdGVfbGlzdHMpKQorCQlyZXR1cm4gTklMOworCisJb3RoZXJfY2xhdXNlcyA9IGxp c3RfZGVsZXRlX3B0cihvdGhlcl9jbGF1c2VzLCByaW5mbyk7CisKKwkvKgorCSAqIEhhdmlu ZyBpbmNvbWluZyBTQU9QIHNwbGl0IHRvIHNldCBvZiBzbWFsbGVyIFNBT1BzIHdoaWNoIGNh biBiZSBhcHBsaWVkCisJICogdG8gcGFydGlhbCBpbmRleGVzLCBnZW5lcmF0ZSBwYXRocyBm b3IgZWFjaCBvbmUuCisJICovCisJZm9yZWFjaChsYywgcHJlZGljYXRlX2xpc3RzKQorCXsK KwkJSW5kZXhPcHRJbmZvICAgKmluZGV4OworCQlJbmRleENsYXVzZVNldAljbGF1c2VzZXQ7 CisJCUxpc3QJCSAgICppbmRleHBhdGhzOworCQlSZXN0cmljdEluZm8gICAqcmluZm8xID0g TlVMTDsKKwkJRXhwcgkJICAgKmNsYXVzZTsKKworCQlwZCA9IChQcmVkaWNhdGVzRGF0YSAq KSBsZmlyc3QobGMpOworCQlpZiAocGQtPmVsZW1zID09IE5JTCkKKwkJCS8qIFRoZSBpbmRl eCBkb2Vzbid0IHBhcnRpY2lwYXRlIGluIHRoaXMgb3BlcmF0aW9uICovCisJCQljb250aW51 ZTsKKwkJZWxzZQorCQl7CisJCQlBcnJheVR5cGUJCSAgICphcnJheXZhbCA9IE5VTEw7CisJ CQlBcnJheUV4cHIJCSAgICphcnIgPSBOVUxMOworCQkJQ29uc3QJCQkgICAqYXJyYXljb25z dCA9IGxzZWNvbmRfbm9kZShDb25zdCwgc2FvcC0+YXJncyk7CisJCQlTY2FsYXJBcnJheU9w RXhwciAgKmRlc3QgPSBtYWtlTm9kZShTY2FsYXJBcnJheU9wRXhwcik7CisKKwkJCS8qIE1h a2UgdXAgbmV3IGFycmF5ICovCisJCQlhcnJheXZhbCA9IERhdHVtR2V0QXJyYXlUeXBlUChh cnJheWNvbnN0LT5jb25zdHZhbHVlKTsKKwkJCWFyciA9IG1ha2VOb2RlKEFycmF5RXhwcik7 CisJCQlhcnItPmFycmF5X2NvbGxpZCA9IGFycmF5Y29uc3QtPmNvbnN0Y29sbGlkOworCQkJ YXJyLT5hcnJheV90eXBlaWQgPSBhcnJheWNvbnN0LT5jb25zdHR5cGU7CisJCQlhcnItPmVs ZW1lbnRfdHlwZWlkID0gYXJyYXl2YWwtPmVsZW10eXBlOworCQkJYXJyLT5lbGVtZW50cyA9 IHBkLT5lbGVtczsKKwkJCWFyci0+bG9jYXRpb24gPSAtMTsKKwkJCWFyci0+bXVsdGlkaW1z ID0gZmFsc2U7CisKKwkJCS8qIENvbXBvc2UgbmV3IFNBT1AsIHBhcnRpYWxseSBjb3Zlcmlu ZyB0aGUgc291cmNlIG9uZSAqLworCQkJbWVtY3B5KGRlc3QsIHNhb3AsIHNpemVvZihTY2Fs YXJBcnJheU9wRXhwcikpOworCQkJZGVzdC0+YXJncyA9IGxpc3RfbWFrZTIobGluaXRpYWwo c2FvcC0+YXJncyksIGFycik7CisKKwkJCWNsYXVzZSA9IChFeHByICopIGVzdGltYXRlX2V4 cHJlc3Npb25fdmFsdWUocm9vdCwgKE5vZGUgKikgZGVzdCk7CisKKwkJCS8qCisJCQkgKiBD cmVhdGUgbmV3IFJlc3RyaWN0SW5mby4gSXQgbWF5YmUgbW9yZSBoZWF2eSB0aGFuIGp1c3Qg Y29weSBub2RlLAorCQkJICogYnV0IHJlbWVtYmVyIHNvbWUgaW50ZXJuYWxzOiB0aGUgc2Vy aWFsIG51bWJlciwgc2VsZWN0aXZpdHkKKwkJCSAqIGNhY2hlIGV0Yy4KKwkJCSAqLworCQkJ cmluZm8xID0gbWFrZV9yZXN0cmljdGluZm8ocm9vdCwgY2xhdXNlLAorCQkJCQkJCQkJICAg cmluZm8tPmlzX3B1c2hlZF9kb3duLAorCQkJCQkJCQkJICAgcmluZm8tPmhhc19jbG9uZSwK KwkJCQkJCQkJCSAgIHJpbmZvLT5pc19jbG9uZSwKKwkJCQkJCQkJCSAgIHJpbmZvLT5wc2V1 ZG9jb25zdGFudCwKKwkJCQkJCQkJCSAgIHJpbmZvLT5zZWN1cml0eV9sZXZlbCwKKwkJCQkJ CQkJCSAgIHJpbmZvLT5yZXF1aXJlZF9yZWxpZHMsCisJCQkJCQkJCQkgICByaW5mby0+aW5j b21wYXRpYmxlX3JlbGlkcywKKwkJCQkJCQkJCSAgIHJpbmZvLT5vdXRlcl9yZWxpZHMpOwor CQl9CisKKwkJaW5kZXggPSBsaXN0X250aChyZWwtPmluZGV4bGlzdCwgcGQtPmlkKTsKKwkJ QXNzZXJ0KHByZWRpY2F0ZV9pbXBsaWVkX2J5KGluZGV4LT5pbmRwcmVkLCBsaXN0X21ha2Ux KHJpbmZvMSksIHRydWUpKTsKKworCQkvKiBFeGNsdWRpbmcgcGFydGlhbCBpbmRleGVzIHdp dGggcHJlZE9LIHdlIG1ha2UgdGhpcyBzdGF0ZW1lbnQgZmFsc2UgKi8KKwkJQXNzZXJ0KCFw cmVkaWNhdGVfaW1wbGllZF9ieShpbmRleC0+aW5kcHJlZCwgb3RoZXJfY2xhdXNlcywgZmFs c2UpKTsKKworCQkvKiBUaW1lIHRvIGdlbmVyYXRlIGluZGV4IHBhdGhzICovCisKKwkJTWVt U2V0KCZjbGF1c2VzZXQsIDAsIHNpemVvZihjbGF1c2VzZXQpKTsKKwkJbWF0Y2hfY2xhdXNl c190b19pbmRleChyb290LCBsaXN0X21ha2UxKHJpbmZvMSksIGluZGV4LCAmY2xhdXNlc2V0 KTsKKwkJbWF0Y2hfY2xhdXNlc190b19pbmRleChyb290LCBvdGhlcl9jbGF1c2VzLCBpbmRl eCwgJmNsYXVzZXNldCk7CisKKwkJLyogUHJlZGljYXRlIGhhcyBmb3VuZCBhbHJlYWR5LiBT bywgaXQgaXMgb2sgZm9yIHRoZSBlbXB0eSBtYXRjaCAqLworCisJCWluZGV4cGF0aHMgPSBi dWlsZF9pbmRleF9wYXRocyhyb290LCByZWwsCisJCQkJCQkJCQkgICBpbmRleCwgJmNsYXVz ZXNldCwKKwkJCQkJCQkJCSAgIHRydWUsCisJCQkJCQkJCQkgICBTVF9CSVRNQVBTQ0FOLAor CQkJCQkJCQkJICAgTlVMTCwKKwkJCQkJCQkJCSAgIE5VTEwpOworCQlBc3NlcnQoaW5kZXhw YXRocyAhPSBOSUwpOworCQlyZXN1bHQgPSBsYXBwZW5kKHJlc3VsdCwgaW5kZXhwYXRocyk7 CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBMaXN0ICoKK2dlbmVyYXRlX3Nh b3BfcGF0aGxpc3QoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKKwkJCQkJ ICAgUmVzdHJpY3RJbmZvICpyaW5mbywgTGlzdCAqYWxsX2NsYXVzZXMpCit7CisJTGlzdAkg ICAqcGF0aGxpc3QgPSBOSUw7CisJUGF0aAkgICAqYml0bWFwcXVhbDsKKwlMaXN0CSAgICpp bmRsaXN0OworCUxpc3RDZWxsICAgKmxjOworCisJaWYgKCFlbmFibGVfb3JfdHJhbnNmb3Jt YXRpb24pCisJCXJldHVybiBOSUw7CisKKwkvKgorCSAqIFdlIG11c3QgYmUgYWJsZSB0byBt YXRjaCBhdCBsZWFzdCBvbmUgaW5kZXggdG8gZWFjaCBlbGVtZW50IG9mCisJICogdGhlIGFy cmF5LCBlbHNlIHdlIGNhbid0IHVzZSBpdC4KKwkgKi8KKwlpbmRsaXN0ID0gYnVpbGRfcGF0 aHNfZm9yX1NBT1Aocm9vdCwgcmVsLCByaW5mbywgYWxsX2NsYXVzZXMpOworCWlmIChpbmRs aXN0ID09IE5JTCkKKwkJcmV0dXJuIE5JTDsKKworCS8qCisJICogT0ssIHBpY2sgdGhlIG1v c3QgcHJvbWlzaW5nIEFORCBjb21iaW5hdGlvbiwgYW5kIGFkZCBpdCB0bworCSAqIHBhdGhs aXN0LgorCSAqLworCWZvcmVhY2ggKGxjLCBpbmRsaXN0KQorCXsKKwkJTGlzdCAqcGxpc3Qg PSBsZmlyc3Rfbm9kZShMaXN0LCBsYyk7CisKKwkJYml0bWFwcXVhbCA9IGNob29zZV9iaXRt YXBfYW5kKHJvb3QsIHJlbCwgcGxpc3QpOworCQlwYXRobGlzdCA9IGxhcHBlbmQocGF0aGxp c3QsIGJpdG1hcHF1YWwpOworCX0KKworCXJldHVybiBwYXRobGlzdDsKK30KKwogLyoKICAq IGdlbmVyYXRlX2JpdG1hcF9vcl9wYXRocwotICoJCUxvb2sgdGhyb3VnaCB0aGUgbGlzdCBv ZiBjbGF1c2VzIHRvIGZpbmQgT1IgY2xhdXNlcywgYW5kIGdlbmVyYXRlCi0gKgkJYSBCaXRt YXBPclBhdGggZm9yIGVhY2ggb25lIHdlIGNhbiBoYW5kbGUgdGhhdCB3YXkuICBSZXR1cm4g YSBsaXN0Ci0gKgkJb2YgdGhlIGdlbmVyYXRlZCBCaXRtYXBPclBhdGhzLgorICoJCUxvb2sg dGhyb3VnaCB0aGUgbGlzdCBvZiBjbGF1c2VzIHRvIGZpbmQgT1IgYW5kIFNBT1AgY2xhdXNl cywgYW5kCisgKgkJRWFjaCBzYW9wIGNsYXVzZSBhcmUgc3BsaXR0ZWQgdG8gYmUgY292ZXJl ZCBieSBwYXJ0aWFsIGluZGV4ZXMuCisgKgkJZ2VuZXJhdGUgYSBCaXRtYXBPclBhdGggZm9y IGVhY2ggb25lIHdlIGNhbiBoYW5kbGUgdGhhdCB3YXkuCisgKgkJUmV0dXJuIGEgbGlzdCBv ZiB0aGUgZ2VuZXJhdGVkIEJpdG1hcE9yUGF0aHMuCiAgKgogICogb3RoZXJfY2xhdXNlcyBp cyBhIGxpc3Qgb2YgYWRkaXRpb25hbCBjbGF1c2VzIHRoYXQgY2FuIGJlIGFzc3VtZWQgdHJ1 ZQogICogZm9yIHRoZSBwdXJwb3NlIG9mIGdlbmVyYXRpbmcgaW5kZXhxdWFscywgYnV0IGFy ZSBub3QgdG8gYmUgc2VhcmNoZWQgZm9yCkBAIC0xMjQ3LDY4ICsxNDE0LDk5IEBAIGdlbmVy YXRlX2JpdG1hcF9vcl9wYXRocyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVs LAogCWZvcmVhY2gobGMsIGNsYXVzZXMpCiAJewogCQlSZXN0cmljdEluZm8gKnJpbmZvID0g bGZpcnN0X25vZGUoUmVzdHJpY3RJbmZvLCBsYyk7Ci0JCUxpc3QJICAgKnBhdGhsaXN0Owor CQlMaXN0CSAgICpwYXRobGlzdCA9IE5JTDsKIAkJUGF0aAkgICAqYml0bWFwcXVhbDsKIAkJ TGlzdENlbGwgICAqajsKIAotCQkvKiBJZ25vcmUgUmVzdHJpY3RJbmZvcyB0aGF0IGFyZW4n dCBPUnMgKi8KLQkJaWYgKCFyZXN0cmljdGlvbl9pc19vcl9jbGF1c2UocmluZm8pKQorCQlp ZiAocmVzdHJpY3Rpb25faXNfc2FvcF9jbGF1c2UocmluZm8pKQorCQl7CisJCQlwYXRobGlz dCA9IGdlbmVyYXRlX3Nhb3BfcGF0aGxpc3Qocm9vdCwgcmVsLCByaW5mbywKKwkJCQkJCQkJ CQkJICBhbGxfY2xhdXNlcyk7CisJCX0KKwkJZWxzZSBpZiAoIXJlc3RyaWN0aW9uX2lzX29y X2NsYXVzZShyaW5mbykpCisJCQkvKiBJZ25vcmUgUmVzdHJpY3RJbmZvcyB0aGF0IGFyZW4n dCBPUnMgKi8KIAkJCWNvbnRpbnVlOwotCi0JCS8qCi0JCSAqIFdlIG11c3QgYmUgYWJsZSB0 byBtYXRjaCBhdCBsZWFzdCBvbmUgaW5kZXggdG8gZWFjaCBvZiB0aGUgYXJtcyBvZgotCQkg KiB0aGUgT1IsIGVsc2Ugd2UgY2FuJ3QgdXNlIGl0LgotCQkgKi8KLQkJcGF0aGxpc3QgPSBO SUw7Ci0JCWZvcmVhY2goaiwgKChCb29sRXhwciAqKSByaW5mby0+b3JjbGF1c2UpLT5hcmdz KQorCQllbHNlCiAJCXsKLQkJCU5vZGUJICAgKm9yYXJnID0gKE5vZGUgKikgbGZpcnN0KGop OwotCQkJTGlzdAkgICAqaW5kbGlzdDsKLQotCQkJLyogT1IgYXJndW1lbnRzIHNob3VsZCBi ZSBBTkRzIG9yIHN1Yi1SZXN0cmljdEluZm9zICovCi0JCQlpZiAoaXNfYW5kY2xhdXNlKG9y YXJnKSkKKwkJCS8qCisJCQkgKiBXZSBtdXN0IGJlIGFibGUgdG8gbWF0Y2ggYXQgbGVhc3Qg b25lIGluZGV4IHRvIGVhY2ggb2YgdGhlIGFybXMgb2YKKwkJCSAqIHRoZSBPUiwgZWxzZSB3 ZSBjYW4ndCB1c2UgaXQuCisJCQkgKi8KKwkJCWZvcmVhY2goaiwgKChCb29sRXhwciAqKSBy aW5mby0+b3JjbGF1c2UpLT5hcmdzKQogCQkJewotCQkJCUxpc3QJICAgKmFuZGFyZ3MgPSAo KEJvb2xFeHByICopIG9yYXJnKS0+YXJnczsKKwkJCQlOb2RlCSAgICpvcmFyZyA9IChOb2Rl ICopIGxmaXJzdChqKTsKKwkJCQlMaXN0CSAgICppbmRsaXN0OwogCi0JCQkJaW5kbGlzdCA9 IGJ1aWxkX3BhdGhzX2Zvcl9PUihyb290LCByZWwsCi0JCQkJCQkJCQkJCSBhbmRhcmdzLAot CQkJCQkJCQkJCQkgYWxsX2NsYXVzZXMpOworCQkJCS8qIE9SIGFyZ3VtZW50cyBzaG91bGQg YmUgQU5EcyBvciBzdWItUmVzdHJpY3RJbmZvcyAqLworCQkJCWlmIChpc19hbmRjbGF1c2Uo b3JhcmcpKQorCQkJCXsKKwkJCQkJTGlzdAkgICAqYW5kYXJncyA9ICgoQm9vbEV4cHIgKikg b3JhcmcpLT5hcmdzOwogCi0JCQkJLyogUmVjdXJzZSBpbiBjYXNlIHRoZXJlIGFyZSBzdWIt T1JzICovCi0JCQkJaW5kbGlzdCA9IGxpc3RfY29uY2F0KGluZGxpc3QsCi0JCQkJCQkJCQkg IGdlbmVyYXRlX2JpdG1hcF9vcl9wYXRocyhyb290LCByZWwsCi0JCQkJCQkJCQkJCQkJCQkg ICBhbmRhcmdzLAotCQkJCQkJCQkJCQkJCQkJICAgYWxsX2NsYXVzZXMpKTsKLQkJCX0KLQkJ CWVsc2UKLQkJCXsKLQkJCQlSZXN0cmljdEluZm8gKnJpID0gY2FzdE5vZGUoUmVzdHJpY3RJ bmZvLCBvcmFyZyk7Ci0JCQkJTGlzdAkgICAqb3JhcmdzOworCQkJCQlpbmRsaXN0ID0gYnVp bGRfcGF0aHNfZm9yX09SKHJvb3QsIHJlbCwKKwkJCQkJCQkJCQkJCSBhbmRhcmdzLAorCQkJ CQkJCQkJCQkJIGFsbF9jbGF1c2VzKTsKIAotCQkJCUFzc2VydCghcmVzdHJpY3Rpb25faXNf b3JfY2xhdXNlKHJpKSk7Ci0JCQkJb3JhcmdzID0gbGlzdF9tYWtlMShyaSk7CisJCQkJCS8q IFJlY3Vyc2UgaW4gY2FzZSB0aGVyZSBhcmUgc3ViLU9ScyAqLworCQkJCQlpbmRsaXN0ID0g bGlzdF9jb25jYXQoaW5kbGlzdCwKKwkJCQkJCQkJCQkgIGdlbmVyYXRlX2JpdG1hcF9vcl9w YXRocyhyb290LCByZWwsCisJCQkJCQkJCQkJCQkJCQkJICAgYW5kYXJncywKKwkJCQkJCQkJ CQkJCQkJCQkgICBhbGxfY2xhdXNlcykpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJ CQlSZXN0cmljdEluZm8gKnJpID0gY2FzdE5vZGUoUmVzdHJpY3RJbmZvLCBvcmFyZyk7CisJ CQkJCUxpc3QJICAgKm9yYXJnczsKIAotCQkJCWluZGxpc3QgPSBidWlsZF9wYXRoc19mb3Jf T1Iocm9vdCwgcmVsLAotCQkJCQkJCQkJCQkgb3JhcmdzLAotCQkJCQkJCQkJCQkgYWxsX2Ns YXVzZXMpOwotCQkJfQorCQkJCQlBc3NlcnQoIXJlc3RyaWN0aW9uX2lzX29yX2NsYXVzZShy aSkpOwogCi0JCQkvKgotCQkJICogSWYgbm90aGluZyBtYXRjaGVkIHRoaXMgYXJtLCB3ZSBj YW4ndCBkbyBhbnl0aGluZyB3aXRoIHRoaXMgT1IKLQkJCSAqIGNsYXVzZS4KLQkJCSAqLwot CQkJaWYgKGluZGxpc3QgPT0gTklMKQotCQkJewotCQkJCXBhdGhsaXN0ID0gTklMOwotCQkJ CWJyZWFrOwotCQkJfQorCQkJCQlvcmFyZ3MgPSBsaXN0X21ha2UxKHJpKTsKIAotCQkJLyoK LQkJCSAqIE9LLCBwaWNrIHRoZSBtb3N0IHByb21pc2luZyBBTkQgY29tYmluYXRpb24sIGFu ZCBhZGQgaXQgdG8KLQkJCSAqIHBhdGhsaXN0LgotCQkJICovCi0JCQliaXRtYXBxdWFsID0g Y2hvb3NlX2JpdG1hcF9hbmQocm9vdCwgcmVsLCBpbmRsaXN0KTsKLQkJCXBhdGhsaXN0ID0g bGFwcGVuZChwYXRobGlzdCwgYml0bWFwcXVhbCk7CisJCQkJCWlmIChyZXN0cmljdGlvbl9p c19zYW9wX2NsYXVzZShyaSkpCisJCQkJCXsKKwkJCQkJCUxpc3QgKnBhdGhzOworCisJCQkJ CQlwYXRocyA9IGdlbmVyYXRlX3Nhb3BfcGF0aGxpc3Qocm9vdCwgcmVsLCByaSwKKwkJCQkJ CQkJCQkJCQkJIGFsbF9jbGF1c2VzKTsKKworCQkJCQkJaWYgKHBhdGhzICE9IE5JTCkKKwkJ CQkJCXsKKwkJCQkJCQkvKgorCQkJCQkJCSAqIEFkZCBwYXRocyB0byBwYXRobGlzdCBhbmQg aW1tZWRpYXRlbHkganVtcCB0byB0aGUKKwkJCQkJCQkgKiBuZXh0IGVsZW1lbnQgb2YgdGhl IE9SIGNsYXVzZS4KKwkJCQkJCQkgKi8KKwkJCQkJCQlwYXRobGlzdCA9IGxpc3RfY29uY2F0 KHBhdGhsaXN0LCBwYXRocyk7CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisKKwkJCQkJ CS8qCisJCQkJCQkgKiBQYXNzIGRvd24gb3V0IG9mIHRoaXMgaWYgY29uc3RydWN0aW9uOgor CQkJCQkJICogSWYgc2FvcCBpc24ndCBjb3ZlcmVkIGJ5IHBhcnRpYWwgaW5kZXhlcywgdHJ5 IHRvCisJCQkJCQkgKiBidWlsZCBzY2FuIHBhdGggZm9yIHRoZSBzYW9wIGFzIGEgd2hvbGUu CisJCQkJCQkgKi8KKwkJCQkJfQorCisJCQkJCWluZGxpc3QgPSBidWlsZF9wYXRoc19mb3Jf T1Iocm9vdCwgcmVsLAorCQkJCQkJCQkJCQkJIG9yYXJncywKKwkJCQkJCQkJCQkJCSBhbGxf Y2xhdXNlcyk7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBJZiBub3RoaW5nIG1hdGNoZWQg dGhpcyBhcm0sIHdlIGNhbid0IGRvIGFueXRoaW5nIHdpdGggdGhpcyBPUgorCQkJCSAqIGNs YXVzZS4KKwkJCQkgKi8KKwkJCQlpZiAoaW5kbGlzdCA9PSBOSUwpCisJCQkJeworCQkJCQlw YXRobGlzdCA9IE5JTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJLyoKKwkJCQkgKiBP SywgcGljayB0aGUgbW9zdCBwcm9taXNpbmcgQU5EIGNvbWJpbmF0aW9uLCBhbmQgYWRkIGl0 IHRvCisJCQkJICogcGF0aGxpc3QuCisJCQkJICovCisJCQkJYml0bWFwcXVhbCA9IGNob29z ZV9iaXRtYXBfYW5kKHJvb3QsIHJlbCwgaW5kbGlzdCk7CisJCQkJcGF0aGxpc3QgPSBsYXBw ZW5kKHBhdGhsaXN0LCBiaXRtYXBxdWFsKTsKKwkJCX0KIAkJfQogCiAJCS8qCmRpZmYgLS1n aXQgYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wcmVkdGVzdC5jIGIvc3JjL2JhY2tl bmQvb3B0aW1pemVyL3V0aWwvcHJlZHRlc3QuYwppbmRleCBjMzdiNDE2ZTI0Li44ZWQ4MGE3 OGI0IDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9wcmVkdGVzdC5j CisrKyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3ByZWR0ZXN0LmMKQEAgLTExMiw2 ICsxMTIsNTIgQEAgc3RhdGljIE9pZAlnZXRfYnRyZWVfdGVzdF9vcChPaWQgcHJlZF9vcCwg T2lkIGNsYXVzZV9vcCwgYm9vbCByZWZ1dGVfaXQpOwogc3RhdGljIHZvaWQgSW52YWxpZGF0 ZU9wclByb29mQ2FjaGVDYWxsQmFjayhEYXR1bSBhcmcsIGludCBjYWNoZWlkLCB1aW50MzIg aGFzaHZhbHVlKTsKIAogCisvKgorICogQ291bGQgdGhpcyBBTlkgKCkgZXhwcmVzc2lvbiBj YW4gYmUgc3BsaXQgaW50byBhIHNldCBvZiBBTllzIG92ZXIgcGFydGlhbAorICogaW5kZXhl cz8gSWYgeWVzLCByZXR1cm4gdGhlc2Ugc2FvcHMgaW4gdGhlIFByZWRpY2F0ZXNEYXRhIHN0 cnVjdHVyZS4KKyAqLworYm9vbAorc2FvcF9jb3ZlcmVkX2J5X3ByZWRpY2F0ZXMoU2NhbGFy QXJyYXlPcEV4cHIgKnNhb3AsIExpc3QgKnByZWRpY2F0ZV9saXN0cykKK3sKKwlMaXN0Q2Vs bAkJICAgKmxjOworCVByZWRJdGVySW5mb0RhdGEJY2xhdXNlX2luZm87CisJYm9vbAkJCQly ZXN1bHQgPSBmYWxzZTsKKworCWlmIChwcmVkaWNhdGVfY2xhc3NpZnkoKE5vZGUgKikgc2Fv cCwgJmNsYXVzZV9pbmZvKSAhPSBDTEFTU19PUikKKwkJcmV0dXJuIGZhbHNlOworCisJaXRl cmF0ZV9iZWdpbihwaXRlbSwgKE5vZGUgKikgc2FvcCwgY2xhdXNlX2luZm8pCisJeworCQly ZXN1bHQgPSBmYWxzZTsKKworCQlmb3JlYWNoKGxjLCBwcmVkaWNhdGVfbGlzdHMpCisJCXsK KwkJCVByZWRpY2F0ZXNEYXRhICpwZCA9IChQcmVkaWNhdGVzRGF0YSAqKSBsZmlyc3QobGMp OworCisJCQlpZiAoIXByZWRpY2F0ZV9pbXBsaWVkX2J5X3JlY3Vyc2UocGl0ZW0sIHBkLT5w cmVkaWNhdGUsIGZhbHNlKSkKKwkJCQljb250aW51ZTsKKworCQkJLyogUHJlZGljYXRlIGlz IGZvdW5kLiBBZGQgdGhlIGVsZW0gdG8gdGhlIHNhb3AgY2xhdXNlICovCisJCQlBc3NlcnQo SXNBKHBpdGVtLCBPcEV4cHIpKTsKKworCQkJLyogRXh0cmFjdCBjb25zdGFudCBmcm9tIHRo ZSBleHByZXNzaW9uICovCisJCQlwZC0+ZWxlbXMgPSBsYXBwZW5kKHBkLT5lbGVtcywKKwkJ CQkJY29weU9iamVjdChsc2Vjb25kX25vZGUoQ29uc3QsICgoT3BFeHByICopIHBpdGVtKS0+ YXJncykpKTsKKwkJCXJlc3VsdCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJCWlmICgh cmVzdWx0KQorCQkJLyoKKwkJCSAqIFRoZSBlbGVtZW50IGRvZXNuJ3QgZml0IGFueSBpbmRl eC4gSW50ZXJydXB0IHRoZSBwcm9jZXNzIGltbWVkaWF0ZWx5CisJCQkgKi8KKwkJCWJyZWFr OworCX0KKwlpdGVyYXRlX2VuZChjbGF1c2VfaW5mbyk7CisKKwlyZXR1cm4gcmVzdWx0Owor fQorCiAvKgogICogcHJlZGljYXRlX2ltcGxpZWRfYnkKICAqCSAgUmVjdXJzaXZlbHkgY2hl Y2tzIHdoZXRoZXIgdGhlIGNsYXVzZXMgaW4gY2xhdXNlX2xpc3QgaW1wbHkgdGhhdCB0aGUK ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3Jlc3RyaWN0aW5mby5j IGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVzdHJpY3RpbmZvLmMKaW5kZXggMGI0 MDZlOTMzNC4uNjI3NTk2YTM0YyAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvb3B0aW1pemVy L3V0aWwvcmVzdHJpY3RpbmZvLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwv cmVzdHJpY3RpbmZvLmMKQEAgLTQyMSw2ICs0MjEsMTkgQEAgcmVzdHJpY3Rpb25faXNfb3Jf Y2xhdXNlKFJlc3RyaWN0SW5mbyAqcmVzdHJpY3RpbmZvKQogCQlyZXR1cm4gZmFsc2U7CiB9 CiAKK2Jvb2wKK3Jlc3RyaWN0aW9uX2lzX3Nhb3BfY2xhdXNlKFJlc3RyaWN0SW5mbyAqcmVz dHJpY3RpbmZvKQoreworCWlmIChJc0EocmVzdHJpY3RpbmZvLT5jbGF1c2UsIFNjYWxhckFy cmF5T3BFeHByKSkKKwl7CisJCVNjYWxhckFycmF5T3BFeHByICpzYW9wID0gKFNjYWxhckFy cmF5T3BFeHByICopIHJlc3RyaWN0aW5mby0+Y2xhdXNlOworCisJCWlmIChzYW9wLT51c2VP cikKKwkJCXJldHVybiB0cnVlOworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKIC8qCiAgKiBy ZXN0cmljdGlvbl9pc19zZWN1cmVseV9wcm9tb3RhYmxlCiAgKgpkaWZmIC0tZ2l0IGEvc3Jj L2luY2x1ZGUvb3B0aW1pemVyL29wdGltaXplci5oIGIvc3JjL2luY2x1ZGUvb3B0aW1pemVy L29wdGltaXplci5oCmluZGV4IDM1YWI1Nzc1MDEuLjIzMmFmY2QwMGMgMTAwNjQ0Ci0tLSBh L3NyYy9pbmNsdWRlL29wdGltaXplci9vcHRpbWl6ZXIuaAorKysgYi9zcmMvaW5jbHVkZS9v cHRpbWl6ZXIvb3B0aW1pemVyLmgKQEAgLTE2MCw2ICsxNjAsMjIgQEAgZXh0ZXJuIExpc3Qg KmV4cGFuZF9mdW5jdGlvbl9hcmd1bWVudHMoTGlzdCAqYXJncywgYm9vbCBpbmNsdWRlX291 dF9hcmd1bWVudHMsCiAKIC8qIGluIHV0aWwvcHJlZHRlc3QuYzogKi8KIAorLyoKKyAqIENv bnRhaW5zIGluZm9ybWF0aW9uIG5lZWRlZCB0byBleHRyYWN0IGZyb20gc2FvcCBhIHNldCBv ZiBlbGVtZW50cyB3aGljaCBjYW4KKyAqIGJlIGNvdmVyZWQgYnkgdGhlIHBhcnRpYWwgaW5k ZXg6CisgKiBpZCAtIGNhbGxlcidzIGlkZW50aWZpY2F0aW9uIG9mIHRoZSBpbmRleC4KKyAq IHByZWRpY2F0ZSAtIHByZWRpY2F0ZSBleHByZXNzaW9uIG9mIHRoZSBpbmRleAorICogZWxl bXMgLSByZXR1cm5pbmcgbGlzdCBvZiBhcnJheSBlbGVtZW50cyB3aGljaCBjb3JyZXNwb25k cyB0byB0aGlzIHByZWRpY2F0ZQorICovCit0eXBlZGVmIHN0cnVjdCBQcmVkaWNhdGVzRGF0 YQoreworCWludAkJaWQ7CisJTm9kZSAgICpwcmVkaWNhdGU7CisJTGlzdCAgICplbGVtczsK K30gUHJlZGljYXRlc0RhdGE7CisKK2V4dGVybiBib29sIHNhb3BfY292ZXJlZF9ieV9wcmVk aWNhdGVzKFNjYWxhckFycmF5T3BFeHByICpzYW9wLAorCQkJCQkJCQkJICBMaXN0ICpwcmVk aWNhdGVfbGlzdHMpOwogZXh0ZXJuIGJvb2wgcHJlZGljYXRlX2ltcGxpZWRfYnkoTGlzdCAq cHJlZGljYXRlX2xpc3QsIExpc3QgKmNsYXVzZV9saXN0LAogCQkJCQkJCQkgYm9vbCB3ZWFr KTsKIGV4dGVybiBib29sIHByZWRpY2F0ZV9yZWZ1dGVkX2J5KExpc3QgKnByZWRpY2F0ZV9s aXN0LCBMaXN0ICpjbGF1c2VfbGlzdCwKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wdGlt aXplci9yZXN0cmljdGluZm8uaCBiL3NyYy9pbmNsdWRlL29wdGltaXplci9yZXN0cmljdGlu Zm8uaAppbmRleCAxYjQyYzgzMmM1Li4yY2Q1ZmJmOTQzIDEwMDY0NAotLS0gYS9zcmMvaW5j bHVkZS9vcHRpbWl6ZXIvcmVzdHJpY3RpbmZvLmgKKysrIGIvc3JjL2luY2x1ZGUvb3B0aW1p emVyL3Jlc3RyaWN0aW5mby5oCkBAIC0zNCw2ICszNCw3IEBAIGV4dGVybiBSZXN0cmljdElu Zm8gKm1ha2VfcmVzdHJpY3RpbmZvKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJICAg UmVsaWRzIG91dGVyX3JlbGlkcyk7CiBleHRlcm4gUmVzdHJpY3RJbmZvICpjb21tdXRlX3Jl c3RyaWN0aW5mbyhSZXN0cmljdEluZm8gKnJpbmZvLCBPaWQgY29tbV9vcCk7CiBleHRlcm4g Ym9vbCByZXN0cmljdGlvbl9pc19vcl9jbGF1c2UoUmVzdHJpY3RJbmZvICpyZXN0cmljdGlu Zm8pOworZXh0ZXJuIGJvb2wgcmVzdHJpY3Rpb25faXNfc2FvcF9jbGF1c2UoUmVzdHJpY3RJ bmZvICpyZXN0cmljdGluZm8pOwogZXh0ZXJuIGJvb2wgcmVzdHJpY3Rpb25faXNfc2VjdXJl bHlfcHJvbW90YWJsZShSZXN0cmljdEluZm8gKnJlc3RyaWN0aW5mbywKIAkJCQkJCQkJCQkJ ICAgUmVsT3B0SW5mbyAqcmVsKTsKIGV4dGVybiBMaXN0ICpnZXRfYWN0dWFsX2NsYXVzZXMo TGlzdCAqcmVzdHJpY3RpbmZvX2xpc3QpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvcmVncmVz cy9leHBlY3RlZC9zZWxlY3Qub3V0IGIvc3JjL3Rlc3QvcmVncmVzcy9leHBlY3RlZC9zZWxl Y3Qub3V0CmluZGV4IDMzYTZkY2ViMGUuLjA3MDIwMmIwZjAgMTAwNjQ0Ci0tLSBhL3NyYy90 ZXN0L3JlZ3Jlc3MvZXhwZWN0ZWQvc2VsZWN0Lm91dAorKysgYi9zcmMvdGVzdC9yZWdyZXNz L2V4cGVjdGVkL3NlbGVjdC5vdXQKQEAgLTkwNyw2ICs5MDcsMjg4IEBAIHNlbGVjdCB1bmlx dWUxLCB1bmlxdWUyIGZyb20gb25lazIKICAgICAgICAwIHwgICAgIDk5OAogKDIgcm93cykK IAorU0VUIGVuYWJsZV9zZXFzY2FuIFRPIG9mZjsKK1NFVCBlbmFibGVfaW5kZXhzY2FuIFRP IG9mZjsgLS0gT25seSBCaXRtYXBTY2FuIGlzIGEgc3ViamVjdCBtYXR0ZXIgaGVyZQorU0VU IGVuYWJsZV9vcl90cmFuc2Zvcm1hdGlvbiA9ICdvZmYnOworZXhwbGFpbiAoY29zdHMgb2Zm KQorU0VMRUNUIGNvdW50KCopIEZST00gb25lazIgV0hFUkUgc3RyaW5ndTEgPSAnQScgT1Ig c3RyaW5ndTEgPSAnSic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIG9uZWsyCisg ICAgICAgICBSZWNoZWNrIENvbmQ6ICgoc3RyaW5ndTEgPCAnQic6Om5hbWUpIE9SIChzdHJp bmd1MSA9ICdKJzo6bmFtZSkpCisgICAgICAgICBGaWx0ZXI6ICgoc3RyaW5ndTEgPSAnQSc6 Om5hbWUpIE9SIChzdHJpbmd1MSA9ICdKJzo6bmFtZSkpCisgICAgICAgICAtPiAgQml0bWFw T3IKKyAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl91Ml9w cnRsCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gb25lazJfc3R1 MV9wcnRsCisgICAgICAgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoc3RyaW5ndTEgPSAn Sic6Om5hbWUpCisoOCByb3dzKQorCistLSBXaXRob3V0IHRoZSB0cmFuc2Zvcm1hdGlvbiBv bmx5IHNlcXNjYW4gcG9zc2libGUgaGVyZQorZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNU IHVuaXF1ZTIsIHN0cmluZ3UxIEZST00gb25lazIKK1dIRVJFIHVuaXF1ZTIgPCAxIEFORCBz dHJpbmd1MSBJTiAoJ0EnLCdKJykgQU5EIHN0cmluZ3UxIDwgJ1onOworICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBvbmVrMgorICAgRmlsdGVyOiAoKHVuaXF1 ZTIgPCAxKSBBTkQgKHN0cmluZ3UxID0gQU5ZICgne0EsSn0nOjpuYW1lW10pKSBBTkQgKHN0 cmluZ3UxIDwgJ1onOjpuYW1lKSkKKygyIHJvd3MpCisKKy0tIFVzZSBwYXJ0aWFsIGluZGV4 ZXMKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCBjb3VudCgqKSBGUk9NIG9uZWsyCitX SEVSRSBzdHJpbmd1MSBJTiAoJ0InLCdKJykgQU5EIChzdHJpbmd1MSA9ICdBJyBPUiB1bmlx dWUxID0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg QWdncmVnYXRlCisgICAtPiAgQml0bWFwIEhlYXAgU2NhbiBvbiBvbmVrMgorICAgICAgICAg UmVjaGVjayBDb25kOiAoKHN0cmluZ3UxIDwgJ0InOjpuYW1lKSBPUiAodW5pcXVlMSA9IDEp KQorICAgICAgICAgRmlsdGVyOiAoKHN0cmluZ3UxID0gQU5ZICgne0IsSn0nOjpuYW1lW10p KSBBTkQgKChzdHJpbmd1MSA9ICdBJzo6bmFtZSkgT1IgKHVuaXF1ZTEgPSAxKSkpCisgICAg ICAgICAtPiAgQml0bWFwT3IKKyAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2Nh biBvbiBvbmVrMl91Ml9wcnRsCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNj YW4gb24gb25lazJfdTFfcHJ0bAorICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDog KHVuaXF1ZTEgPSAxKQorKDggcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNU IHVuaXF1ZTIsIHN0cmluZ3UxIEZST00gb25lazIKK1dIRVJFIHVuaXF1ZTEgPCAxIE9SIChz dHJpbmd1MSA9ICdBJyBPUiBzdHJpbmd1MSA9ICdKJyk7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQml0bWFw IEhlYXAgU2NhbiBvbiBvbmVrMgorICAgUmVjaGVjayBDb25kOiAoKHVuaXF1ZTEgPCAxKSBP UiAoc3RyaW5ndTEgPCAnQic6Om5hbWUpIE9SIChzdHJpbmd1MSA9ICdKJzo6bmFtZSkpCisg ICBGaWx0ZXI6ICgodW5pcXVlMSA8IDEpIE9SIChzdHJpbmd1MSA9ICdBJzo6bmFtZSkgT1Ig KHN0cmluZ3UxID0gJ0onOjpuYW1lKSkKKyAgIC0+ICBCaXRtYXBPcgorICAgICAgICAgLT4g IEJpdG1hcCBJbmRleCBTY2FuIG9uIG9uZWsyX3UxX3BydGwKKyAgICAgICAgICAgICAgIElu ZGV4IENvbmQ6ICh1bmlxdWUxIDwgMSkKKyAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2Nh biBvbiBvbmVrMl91Ml9wcnRsCisgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24g b25lazJfc3R1MV9wcnRsCisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoc3RyaW5ndTEg PSAnSic6Om5hbWUpCisoOSByb3dzKQorCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1Qg dW5pcXVlMiwgc3RyaW5ndTEgRlJPTSBvbmVrMgorV0hFUkUgdW5pcXVlMSA9IDEgT1IgdW5p cXVlMiA9IFBJKCk6OmludGVnZXI7CisgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBTZXEgU2NhbiBvbiBvbmVrMgorICAgRmlsdGVyOiAoKHVuaXF1ZTEgPSAxKSBP UiAodW5pcXVlMiA9IDMpKQorKDIgcm93cykKKworUkVTRVQgZW5hYmxlX29yX3RyYW5zZm9y bWF0aW9uOworLS0gT1IgPC0+IEFOWSB0cmFuc2Zvcm1hdGlvbiBtdXN0IGZpbmQgYSBwYXRo IHdpdGggcGFydGlhbCBpbmRleGVzIHNjYW4KKy0tIHJlZ2FyZGxlc3MgdGhlIGNsYXVzZSBy ZXByZXNlbnRhdGlvbi4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCBjb3VudCgqKSBG Uk9NIG9uZWsyIFdIRVJFIHN0cmluZ3UxID0gJ0EnIE9SIHN0cmluZ3UxID0gJ0onOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIG9uZWsyCisg ICAgICAgICBSZWNoZWNrIENvbmQ6ICgoc3RyaW5ndTEgPSBBTlkgKCd7Sn0nOjpuYW1lW10p KSBPUiAoc3RyaW5ndTEgPCAnQic6Om5hbWUpKQorICAgICAgICAgRmlsdGVyOiAoc3RyaW5n dTEgPSBBTlkgKCd7QSxKfSc6Om5hbWVbXSkpCisgICAgICAgICAtPiAgQml0bWFwT3IKKyAg ICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl9zdHUxX3BydGwK KyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChzdHJpbmd1MSA9IEFOWSAoJ3tK fSc6Om5hbWVbXSkpCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24g b25lazJfdTJfcHJ0bAorKDggcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNU IGNvdW50KCopIEZST00gb25lazIgV0hFUkUgc3RyaW5ndTEgSU4gKCdBJywnSicpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIG9uZWsyCisg ICAgICAgICBSZWNoZWNrIENvbmQ6ICgoc3RyaW5ndTEgPSBBTlkgKCd7Sn0nOjpuYW1lW10p KSBPUiAoc3RyaW5ndTEgPCAnQic6Om5hbWUpKQorICAgICAgICAgRmlsdGVyOiAoc3RyaW5n dTEgPSBBTlkgKCd7QSxKfSc6Om5hbWVbXSkpCisgICAgICAgICAtPiAgQml0bWFwT3IKKyAg ICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl9zdHUxX3BydGwK KyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChzdHJpbmd1MSA9IEFOWSAoJ3tK fSc6Om5hbWVbXSkpCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24g b25lazJfdTJfcHJ0bAorKDggcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNU IGNvdW50KCopIEZST00gb25lazIgV0hFUkUgc3RyaW5ndTEgPSBBTlkgKCd7QSxKfScpOwor ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBCaXRtYXAgSGVhcCBTY2FuIG9uIG9uZWsy CisgICAgICAgICBSZWNoZWNrIENvbmQ6ICgoc3RyaW5ndTEgPSBBTlkgKCd7Sn0nOjpuYW1l W10pKSBPUiAoc3RyaW5ndTEgPCAnQic6Om5hbWUpKQorICAgICAgICAgRmlsdGVyOiAoc3Ry aW5ndTEgPSBBTlkgKCd7QSxKfSc6Om5hbWVbXSkpCisgICAgICAgICAtPiAgQml0bWFwT3IK KyAgICAgICAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl9zdHUxX3By dGwKKyAgICAgICAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChzdHJpbmd1MSA9IEFOWSAo J3tKfSc6Om5hbWVbXSkpCisgICAgICAgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4g b24gb25lazJfdTJfcHJ0bAorKDggcm93cykKKworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VM RUNUIGNvdW50KCopIEZST00gb25lazIgV0hFUkUgc3RyaW5ndTEgSU4gKCdBJykgT1Igc3Ry aW5ndTEgSU4gKCdKJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg UVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJpdG1hcCBI ZWFwIFNjYW4gb24gb25lazIKKyAgICAgICAgIFJlY2hlY2sgQ29uZDogKChzdHJpbmd1MSA9 IEFOWSAoJ3tKfSc6Om5hbWVbXSkpIE9SIChzdHJpbmd1MSA8ICdCJzo6bmFtZSkpCisgICAg ICAgICBGaWx0ZXI6IChzdHJpbmd1MSA9IEFOWSAoJ3tBLEp9Jzo6bmFtZVtdKSkKKyAgICAg ICAgIC0+ICBCaXRtYXBPcgorICAgICAgICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2Fu IG9uIG9uZWsyX3N0dTFfcHJ0bAorICAgICAgICAgICAgICAgICAgICAgSW5kZXggQ29uZDog KHN0cmluZ3UxID0gQU5ZICgne0p9Jzo6bmFtZVtdKSkKKyAgICAgICAgICAgICAgIC0+ICBC aXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl91Ml9wcnRsCisoOCByb3dzKQorCistLSBEb24n dCBzY2FuIHBhcnRpYWwgaW5kZXhlcyBiZWNhdXNlIG9mIGV4dHJhIHZhbHVlLgorZXhwbGFp biAoY29zdHMgb2ZmKQorU0VMRUNUIGNvdW50KCopIEZST00gb25lazIgV0hFUkUgc3RyaW5n dTEgSU4gKCdBJywgJ0onLCAnQycpOworICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBM QU4gICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBBZ2dyZWdhdGUKKyAgIC0+ICBTZXEgU2Nh biBvbiBvbmVrMgorICAgICAgICAgRmlsdGVyOiAoc3RyaW5ndTEgPSBBTlkgKCd7QSxKLEN9 Jzo6bmFtZVtdKSkKKygzIHJvd3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCB1 bmlxdWUyIEZST00gb25lazIKK1dIRVJFIHN0cmluZ3UxIElOICgnQScsICdBJykgQU5EIChz dHJpbmd1MSA9ICdBJyBPUiBzdHJpbmd1MSA9ICdBJyk7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEJp dG1hcCBIZWFwIFNjYW4gb24gb25lazIKKyAgIFJlY2hlY2sgQ29uZDogKHN0cmluZ3UxIDwg J0InOjpuYW1lKQorICAgRmlsdGVyOiAoKHN0cmluZ3UxID0gQU5ZICgne0EsQX0nOjpuYW1l W10pKSBBTkQgKHN0cmluZ3UxID0gQU5ZICgne0EsQX0nOjpuYW1lW10pKSkKKyAgIC0+ICBC aXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl91Ml9wcnRsCisoNCByb3dzKQorCitleHBsYWlu IChjb3N0cyBvZmYpCitTRUxFQ1QgdW5pcXVlMiwgc3RyaW5ndTEgRlJPTSBvbmVrMgorV0hF UkUgdW5pcXVlMiA8IDEgQU5EIHN0cmluZ3UxIElOICgnQScsJ0onKSBBTkQgc3RyaW5ndTEg PCAnWic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQml0 bWFwIEhlYXAgU2NhbiBvbiBvbmVrMgorICAgUmVjaGVjayBDb25kOiAoKChzdHJpbmd1MSA9 IEFOWSAoJ3tKfSc6Om5hbWVbXSkpIEFORCAoc3RyaW5ndTEgPCAnWic6Om5hbWUpKSBPUiAo KHVuaXF1ZTIgPCAxKSBBTkQgKHN0cmluZ3UxIDwgJ0InOjpuYW1lKSkpCisgICBGaWx0ZXI6 ICgodW5pcXVlMiA8IDEpIEFORCAoc3RyaW5ndTEgPSBBTlkgKCd7QSxKfSc6Om5hbWVbXSkp KQorICAgLT4gIEJpdG1hcE9yCisgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24g b25lazJfc3R1MV9wcnRsCisgICAgICAgICAgICAgICBJbmRleCBDb25kOiAoKHN0cmluZ3Ux ID0gQU5ZICgne0p9Jzo6bmFtZVtdKSkgQU5EIChzdHJpbmd1MSA8ICdaJzo6bmFtZSkpCisg ICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gb25lazJfdTJfcHJ0bAorICAgICAg ICAgICAgICAgSW5kZXggQ29uZDogKHVuaXF1ZTIgPCAxKQorKDggcm93cykKKworZXhwbGFp biAoY29zdHMgb2ZmKQorU0VMRUNUIHVuaXF1ZTIsIHN0cmluZ3UxIEZST00gb25lazIKK1dI RVJFIHVuaXF1ZTEgPSAxIE9SIHVuaXF1ZTEgPSBQSSgpOjppbnRlZ2VyOworICAgICAgICAg ICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgQml0bWFwIEhlYXAg U2NhbiBvbiBvbmVrMgorICAgUmVjaGVjayBDb25kOiAoKHVuaXF1ZTEgPSAzKSBPUiAodW5p cXVlMSA9IDEpKQorICAgLT4gIEJpdG1hcE9yCisgICAgICAgICAtPiAgQml0bWFwIEluZGV4 IFNjYW4gb24gb25lazJfdTFfcHJ0bAorICAgICAgICAgICAgICAgSW5kZXggQ29uZDogKHVu aXF1ZTEgPSAzKQorICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIG9uZWsyX3Ux X3BydGwKKyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUxID0gMSkKKyg3IHJv d3MpCisKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCB1bmlxdWUyLCBzdHJpbmd1MSBG Uk9NIG9uZWsyCitXSEVSRSB1bmlxdWUxIElOICgxLCBQSSgpOjppbnRlZ2VyKTsgLS0gVE9E Tzogd2h5IGl0IGlzIGRpZmZlcnMgZnJvbSBwcmV2aW91cyBleGFtcGxlPworICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgIAorLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LQorIEJpdG1hcCBIZWFwIFNjYW4gb24gb25lazIKKyAgIFJlY2hlY2sgQ29uZDogKHVuaXF1 ZTEgPSBBTlkgKCd7MSwzfSc6OmludGVnZXJbXSkpCisgICAtPiAgQml0bWFwIEluZGV4IFNj YW4gb24gb25lazJfdTFfcHJ0bAorICAgICAgICAgSW5kZXggQ29uZDogKHVuaXF1ZTEgPSBB TlkgKCd7MSwzfSc6OmludGVnZXJbXSkpCisoNCByb3dzKQorCistLSBEb24ndCBhcHBseSB0 aGUgb3B0aW1pemF0aW9uIHRvIGNsYXVzZXMsIGNvbnRhaW5pbmcgdm9sYXRpbGUgZnVuY3Rp b25zCitFWFBMQUlOIChDT1NUUyBPRkYpCitTRUxFQ1QgdW5pcXVlMixzdHJpbmd1MSBGUk9N IG9uZWsyCitXSEVSRSB1bmlxdWUxID0gKHJhbmRvbSgpKjIpOjppbnRlZ2VyIE9SIHVuaXF1 ZTEgPSAocmFuZG9tKCkqMyk6OmludGVnZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAK Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIFNlcSBTY2FuIG9uIG9uZWsyCisgICBGaWx0 ZXI6ICgodW5pcXVlMSA9ICgocmFuZG9tKCkgKiAnMic6OmRvdWJsZSBwcmVjaXNpb24pKTo6 aW50ZWdlcikgT1IgKHVuaXF1ZTEgPSAoKHJhbmRvbSgpICogJzMnOjpkb3VibGUgcHJlY2lz aW9uKSk6OmludGVnZXIpKQorKDIgcm93cykKKworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VM RUNUIHVuaXF1ZTIsc3RyaW5ndTEgRlJPTSBvbmVrMgorV0hFUkUgdW5pcXVlMSBJTiAoKHJh bmRvbSgpKjIpOjppbnRlZ2VyLCAocmFuZG9tKCkqMyk6OmludGVnZXIpOworICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVS WSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTZXEgU2NhbiBvbiBvbmVr MgorICAgRmlsdGVyOiAodW5pcXVlMSA9IEFOWSAoQVJSQVlbKChyYW5kb20oKSAqICcyJzo6 ZG91YmxlIHByZWNpc2lvbikpOjppbnRlZ2VyLCAoKHJhbmRvbSgpICogJzMnOjpkb3VibGUg cHJlY2lzaW9uKSk6OmludGVnZXJdKSkKKygyIHJvd3MpCisKKy0tIENvbWJpbmUgZGlmZmVy ZW50IHNhb3BzLiBTb2Ugb2YgdGhlbSBkb2VzbnQnIGZpdCBhIHNldCBvZiBwYXJ0aWFsIGlu ZGV4ZXMsCistLSBidXQgb3RoZXIgZml0cy4KKy0tIFVuZm9ydHVuYXRlbHksIHdlIGRvbid0 IGNvbWJpbmUgc2FvcCBhbmQgT1IgY2xhdXNlcyBzbyBmYXIuCitFWFBMQUlOIChDT1NUUyBP RkYpCitTRUxFQ1QgdW5pcXVlMixzdHJpbmd1MSBGUk9NIG9uZWsyCitXSEVSRQorICB1bmlx dWUxIElOICgxLDIsMjEpIEFORAorICAoc3RyaW5ndTEgSU4gKCdBJywnSicpIE9SIHVuaXF1 ZTEgSU4gKDMsNCkgT1Igc3RyaW5ndTEgPSAnSicpOworICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEJpdG1hcCBIZWFwIFNj YW4gb24gb25lazIKKyAgIFJlY2hlY2sgQ29uZDogKChzdHJpbmd1MSA9IEFOWSAoJ3tKfSc6 Om5hbWVbXSkpIE9SIChzdHJpbmd1MSA8ICdCJzo6bmFtZSkgT1IgKCh1bmlxdWUxID0gQU5Z ICgnezMsNH0nOjppbnRlZ2VyW10pKSBBTkQgKHVuaXF1ZTEgPSBBTlkgKCd7MSwyLDIxfSc6 OmludGVnZXJbXSkpKSBPUiAoc3RyaW5ndTEgPSAnSic6Om5hbWUpKQorICAgRmlsdGVyOiAo KHVuaXF1ZTEgPSBBTlkgKCd7MSwyLDIxfSc6OmludGVnZXJbXSkpIEFORCAoKHN0cmluZ3Ux ID0gQU5ZICgne0EsSn0nOjpuYW1lW10pKSBPUiAodW5pcXVlMSA9IEFOWSAoJ3szLDR9Jzo6 aW50ZWdlcltdKSkgT1IgKHN0cmluZ3UxID0gJ0onOjpuYW1lKSkpCisgICAtPiAgQml0bWFw T3IKKyAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl9zdHUxX3BydGwK KyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChzdHJpbmd1MSA9IEFOWSAoJ3tKfSc6Om5h bWVbXSkpCisgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gb25lazJfdTJfcHJ0 bAorICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIG9uZWsyX3UxX3BydGwKKyAg ICAgICAgICAgICAgIEluZGV4IENvbmQ6ICgodW5pcXVlMSA9IEFOWSAoJ3szLDR9Jzo6aW50 ZWdlcltdKSkgQU5EICh1bmlxdWUxID0gQU5ZICgnezEsMiwyMX0nOjppbnRlZ2VyW10pKSkK KyAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl9zdHUxX3BydGwKKyAg ICAgICAgICAgICAgIEluZGV4IENvbmQ6IChzdHJpbmd1MSA9ICdKJzo6bmFtZSkKKygxMSBy b3dzKQorCistLSBDaGVjayByZWN1cnNpdmUgY29tYmluYXRpb24gb2YgT1IgYW5kIFNBT1Ag ZXhwcmVzc2lvbnMKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCB1bmlxdWUyLCBzdHJp bmd1MSBGUk9NIG9uZWsyCitXSEVSRSB1bmlxdWUxIDwgMSBPUiAoc3RyaW5ndTEgPSAnQScg T1Igc3RyaW5ndTEgPSAnSicpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisg Qml0bWFwIEhlYXAgU2NhbiBvbiBvbmVrMgorICAgUmVjaGVjayBDb25kOiAoKHN0cmluZ3Ux ID0gQU5ZICgne0p9Jzo6bmFtZVtdKSkgT1IgKHN0cmluZ3UxIDwgJ0InOjpuYW1lKSBPUiAo dW5pcXVlMSA8IDEpKQorICAgRmlsdGVyOiAoKHN0cmluZ3UxID0gQU5ZICgne0EsSn0nOjpu YW1lW10pKSBPUiAodW5pcXVlMSA8IDEpKQorICAgLT4gIEJpdG1hcE9yCisgICAgICAgICAt PiAgQml0bWFwIEluZGV4IFNjYW4gb24gb25lazJfc3R1MV9wcnRsCisgICAgICAgICAgICAg ICBJbmRleCBDb25kOiAoc3RyaW5ndTEgPSBBTlkgKCd7Sn0nOjpuYW1lW10pKQorICAgICAg ICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIG9uZWsyX3UyX3BydGwKKyAgICAgICAgIC0+ ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl91MV9wcnRsCisgICAgICAgICAgICAgICBJ bmRleCBDb25kOiAodW5pcXVlMSA8IDEpCisoOSByb3dzKQorCitleHBsYWluIChjb3N0cyBv ZmYpCitTRUxFQ1QgdW5pcXVlMiwgc3RyaW5ndTEgRlJPTSBvbmVrMgorV0hFUkUgKHVuaXF1 ZTEgPCAxIE9SIHN0cmluZ3UxIElOICgnQScsJ0onKSk7CisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KKyBCaXRtYXAgSGVhcCBTY2FuIG9uIG9uZWsyCisgICBSZWNoZWNrIENv bmQ6ICgoc3RyaW5ndTEgPSBBTlkgKCd7Sn0nOjpuYW1lW10pKSBPUiAoc3RyaW5ndTEgPCAn Qic6Om5hbWUpIE9SICh1bmlxdWUxIDwgMSkpCisgICBGaWx0ZXI6ICgoc3RyaW5ndTEgPSBB TlkgKCd7QSxKfSc6Om5hbWVbXSkpIE9SICh1bmlxdWUxIDwgMSkpCisgICAtPiAgQml0bWFw T3IKKyAgICAgICAgIC0+ICBCaXRtYXAgSW5kZXggU2NhbiBvbiBvbmVrMl9zdHUxX3BydGwK KyAgICAgICAgICAgICAgIEluZGV4IENvbmQ6IChzdHJpbmd1MSA9IEFOWSAoJ3tKfSc6Om5h bWVbXSkpCisgICAgICAgICAtPiAgQml0bWFwIEluZGV4IFNjYW4gb24gb25lazJfdTJfcHJ0 bAorICAgICAgICAgLT4gIEJpdG1hcCBJbmRleCBTY2FuIG9uIG9uZWsyX3UxX3BydGwKKyAg ICAgICAgICAgICAgIEluZGV4IENvbmQ6ICh1bmlxdWUxIDwgMSkKKyg5IHJvd3MpCisKKy0t IEFsdGhvdWdoIFNBT1AgZG9lc24ndCBmaXQgcGFydGlhbCBpbmRleGVzIGZ1bGx5LCB3ZSBj YW4gdXNlIGFuZGVkIE9SIGNsYXVzZQorLS0gdG8gc2NhbiBhbm90aGVyIGNvdXBsZSBvZiBw YXJ0aWFsIGluZGV4ZXMuCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgY291bnQoKikg RlJPTSBvbmVrMgorV0hFUkUgc3RyaW5ndTEgSU4gKCdCJywnSicpIEFORCAoc3RyaW5ndTEg PSAnQScgT1IgdW5pcXVlMSA9IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIEFnZ3JlZ2F0ZQorICAgLT4gIEJpdG1hcCBIZWFwIFNjYW4gb24gb25l azIKKyAgICAgICAgIFJlY2hlY2sgQ29uZDogKChzdHJpbmd1MSA8ICdCJzo6bmFtZSkgT1Ig KHVuaXF1ZTEgPSAxKSkKKyAgICAgICAgIEZpbHRlcjogKChzdHJpbmd1MSA9IEFOWSAoJ3tC LEp9Jzo6bmFtZVtdKSkgQU5EICgoc3RyaW5ndTEgPSAnQSc6Om5hbWUpIE9SICh1bmlxdWUx ID0gMSkpKQorICAgICAgICAgLT4gIEJpdG1hcE9yCisgICAgICAgICAgICAgICAtPiAgQml0 bWFwIEluZGV4IFNjYW4gb24gb25lazJfdTJfcHJ0bAorICAgICAgICAgICAgICAgLT4gIEJp dG1hcCBJbmRleCBTY2FuIG9uIG9uZWsyX3UxX3BydGwKKyAgICAgICAgICAgICAgICAgICAg IEluZGV4IENvbmQ6ICh1bmlxdWUxID0gMSkKKyg4IHJvd3MpCisKK1JFU0VUIGVuYWJsZV9p bmRleHNjYW47CitSRVNFVCBlbmFibGVfc2Vxc2NhbjsKIC0tCiAtLSBUZXN0IHNvbWUgY29y bmVyIGNhc2VzIHRoYXQgaGF2ZSBiZWVuIGtub3duIHRvIGNvbmZ1c2UgdGhlIHBsYW5uZXIK IC0tCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zZWxlY3Quc3FsIGIvc3Jj L3Rlc3QvcmVncmVzcy9zcWwvc2VsZWN0LnNxbAppbmRleCAwMTlmMWU3NjczLi4wZTY1MGEy MzAxIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9yZWdyZXNzL3NxbC9zZWxlY3Quc3FsCisrKyBi L3NyYy90ZXN0L3JlZ3Jlc3Mvc3FsL3NlbGVjdC5zcWwKQEAgLTIzNCw2ICsyMzQsODggQEAg c2VsZWN0IHVuaXF1ZTEsIHVuaXF1ZTIgZnJvbSBvbmVrMgogc2VsZWN0IHVuaXF1ZTEsIHVu aXF1ZTIgZnJvbSBvbmVrMgogICB3aGVyZSAodW5pcXVlMiA9IDExIGFuZCBzdHJpbmd1MSA8 ICdCJykgb3IgdW5pcXVlMSA9IDA7CiAKK1NFVCBlbmFibGVfc2Vxc2NhbiBUTyBvZmY7CitT RVQgZW5hYmxlX2luZGV4c2NhbiBUTyBvZmY7IC0tIE9ubHkgQml0bWFwU2NhbiBpcyBhIHN1 YmplY3QgbWF0dGVyIGhlcmUKK1NFVCBlbmFibGVfb3JfdHJhbnNmb3JtYXRpb24gPSAnb2Zm JzsKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCBjb3VudCgqKSBGUk9NIG9uZWsyIFdI RVJFIHN0cmluZ3UxID0gJ0EnIE9SIHN0cmluZ3UxID0gJ0onOworLS0gV2l0aG91dCB0aGUg dHJhbnNmb3JtYXRpb24gb25seSBzZXFzY2FuIHBvc3NpYmxlIGhlcmUKK2V4cGxhaW4gKGNv c3RzIG9mZikKK1NFTEVDVCB1bmlxdWUyLCBzdHJpbmd1MSBGUk9NIG9uZWsyCitXSEVSRSB1 bmlxdWUyIDwgMSBBTkQgc3RyaW5ndTEgSU4gKCdBJywnSicpIEFORCBzdHJpbmd1MSA8ICda JzsKKy0tIFVzZSBwYXJ0aWFsIGluZGV4ZXMKK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVD VCBjb3VudCgqKSBGUk9NIG9uZWsyCitXSEVSRSBzdHJpbmd1MSBJTiAoJ0InLCdKJykgQU5E IChzdHJpbmd1MSA9ICdBJyBPUiB1bmlxdWUxID0gMSk7CitleHBsYWluIChjb3N0cyBvZmYp CitTRUxFQ1QgdW5pcXVlMiwgc3RyaW5ndTEgRlJPTSBvbmVrMgorV0hFUkUgdW5pcXVlMSA8 IDEgT1IgKHN0cmluZ3UxID0gJ0EnIE9SIHN0cmluZ3UxID0gJ0onKTsKK2V4cGxhaW4gKGNv c3RzIG9mZikKK1NFTEVDVCB1bmlxdWUyLCBzdHJpbmd1MSBGUk9NIG9uZWsyCitXSEVSRSB1 bmlxdWUxID0gMSBPUiB1bmlxdWUyID0gUEkoKTo6aW50ZWdlcjsKK1JFU0VUIGVuYWJsZV9v cl90cmFuc2Zvcm1hdGlvbjsKKworLS0gT1IgPC0+IEFOWSB0cmFuc2Zvcm1hdGlvbiBtdXN0 IGZpbmQgYSBwYXRoIHdpdGggcGFydGlhbCBpbmRleGVzIHNjYW4KKy0tIHJlZ2FyZGxlc3Mg dGhlIGNsYXVzZSByZXByZXNlbnRhdGlvbi4KK2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVD VCBjb3VudCgqKSBGUk9NIG9uZWsyIFdIRVJFIHN0cmluZ3UxID0gJ0EnIE9SIHN0cmluZ3Ux ID0gJ0onOworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIGNvdW50KCopIEZST00gb25l azIgV0hFUkUgc3RyaW5ndTEgSU4gKCdBJywnSicpOworZXhwbGFpbiAoY29zdHMgb2ZmKQor U0VMRUNUIGNvdW50KCopIEZST00gb25lazIgV0hFUkUgc3RyaW5ndTEgPSBBTlkgKCd7QSxK fScpOworZXhwbGFpbiAoY29zdHMgb2ZmKQorU0VMRUNUIGNvdW50KCopIEZST00gb25lazIg V0hFUkUgc3RyaW5ndTEgSU4gKCdBJykgT1Igc3RyaW5ndTEgSU4gKCdKJyk7CisKKy0tIERv bid0IHNjYW4gcGFydGlhbCBpbmRleGVzIGJlY2F1c2Ugb2YgZXh0cmEgdmFsdWUuCitleHBs YWluIChjb3N0cyBvZmYpCitTRUxFQ1QgY291bnQoKikgRlJPTSBvbmVrMiBXSEVSRSBzdHJp bmd1MSBJTiAoJ0EnLCAnSicsICdDJyk7CitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1Qg dW5pcXVlMiBGUk9NIG9uZWsyCitXSEVSRSBzdHJpbmd1MSBJTiAoJ0EnLCAnQScpIEFORCAo c3RyaW5ndTEgPSAnQScgT1Igc3RyaW5ndTEgPSAnQScpOworCitleHBsYWluIChjb3N0cyBv ZmYpCitTRUxFQ1QgdW5pcXVlMiwgc3RyaW5ndTEgRlJPTSBvbmVrMgorV0hFUkUgdW5pcXVl MiA8IDEgQU5EIHN0cmluZ3UxIElOICgnQScsJ0onKSBBTkQgc3RyaW5ndTEgPCAnWic7Citl eHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgdW5pcXVlMiwgc3RyaW5ndTEgRlJPTSBvbmVr MgorV0hFUkUgdW5pcXVlMSA9IDEgT1IgdW5pcXVlMSA9IFBJKCk6OmludGVnZXI7CitleHBs YWluIChjb3N0cyBvZmYpCitTRUxFQ1QgdW5pcXVlMiwgc3RyaW5ndTEgRlJPTSBvbmVrMgor V0hFUkUgdW5pcXVlMSBJTiAoMSwgUEkoKTo6aW50ZWdlcik7IC0tIFRPRE86IHdoeSBpdCBp cyBkaWZmZXJzIGZyb20gcHJldmlvdXMgZXhhbXBsZT8KKworLS0gRG9uJ3QgYXBwbHkgdGhl IG9wdGltaXphdGlvbiB0byBjbGF1c2VzLCBjb250YWluaW5nIHZvbGF0aWxlIGZ1bmN0aW9u cworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNUIHVuaXF1ZTIsc3RyaW5ndTEgRlJPTSBv bmVrMgorV0hFUkUgdW5pcXVlMSA9IChyYW5kb20oKSoyKTo6aW50ZWdlciBPUiB1bmlxdWUx ID0gKHJhbmRvbSgpKjMpOjppbnRlZ2VyOworRVhQTEFJTiAoQ09TVFMgT0ZGKQorU0VMRUNU IHVuaXF1ZTIsc3RyaW5ndTEgRlJPTSBvbmVrMgorV0hFUkUgdW5pcXVlMSBJTiAoKHJhbmRv bSgpKjIpOjppbnRlZ2VyLCAocmFuZG9tKCkqMyk6OmludGVnZXIpOworCistLSBDb21iaW5l IGRpZmZlcmVudCBzYW9wcy4gU29lIG9mIHRoZW0gZG9lc250JyBmaXQgYSBzZXQgb2YgcGFy dGlhbCBpbmRleGVzLAorLS0gYnV0IG90aGVyIGZpdHMuCistLSBVbmZvcnR1bmF0ZWx5LCB3 ZSBkb24ndCBjb21iaW5lIHNhb3AgYW5kIE9SIGNsYXVzZXMgc28gZmFyLgorRVhQTEFJTiAo Q09TVFMgT0ZGKQorU0VMRUNUIHVuaXF1ZTIsc3RyaW5ndTEgRlJPTSBvbmVrMgorV0hFUkUK KyAgdW5pcXVlMSBJTiAoMSwyLDIxKSBBTkQKKyAgKHN0cmluZ3UxIElOICgnQScsJ0onKSBP UiB1bmlxdWUxIElOICgzLDQpIE9SIHN0cmluZ3UxID0gJ0onKTsKKworLS0gQ2hlY2sgcmVj dXJzaXZlIGNvbWJpbmF0aW9uIG9mIE9SIGFuZCBTQU9QIGV4cHJlc3Npb25zCitleHBsYWlu IChjb3N0cyBvZmYpCitTRUxFQ1QgdW5pcXVlMiwgc3RyaW5ndTEgRlJPTSBvbmVrMgorV0hF UkUgdW5pcXVlMSA8IDEgT1IgKHN0cmluZ3UxID0gJ0EnIE9SIHN0cmluZ3UxID0gJ0onKTsK K2V4cGxhaW4gKGNvc3RzIG9mZikKK1NFTEVDVCB1bmlxdWUyLCBzdHJpbmd1MSBGUk9NIG9u ZWsyCitXSEVSRSAodW5pcXVlMSA8IDEgT1Igc3RyaW5ndTEgSU4gKCdBJywnSicpKTsKKy0t IEFsdGhvdWdoIFNBT1AgZG9lc24ndCBmaXQgcGFydGlhbCBpbmRleGVzIGZ1bGx5LCB3ZSBj YW4gdXNlIGFuZGVkIE9SIGNsYXVzZQorLS0gdG8gc2NhbiBhbm90aGVyIGNvdXBsZSBvZiBw YXJ0aWFsIGluZGV4ZXMuCitleHBsYWluIChjb3N0cyBvZmYpCitTRUxFQ1QgY291bnQoKikg RlJPTSBvbmVrMgorV0hFUkUgc3RyaW5ndTEgSU4gKCdCJywnSicpIEFORCAoc3RyaW5ndTEg PSAnQScgT1IgdW5pcXVlMSA9IDEpOworCitSRVNFVCBlbmFibGVfaW5kZXhzY2FuOworUkVT RVQgZW5hYmxlX3NlcXNjYW47CisKIC0tCiAtLSBUZXN0IHNvbWUgY29ybmVyIGNhc2VzIHRo YXQgaGF2ZSBiZWVuIGtub3duIHRvIGNvbmZ1c2UgdGhlIHBsYW5uZXIKIC0tCmRpZmYgLS1n aXQgYS9zcmMvdG9vbHMvcGdpbmRlbnQvdHlwZWRlZnMubGlzdCBiL3NyYy90b29scy9wZ2lu ZGVudC90eXBlZGVmcy5saXN0CmluZGV4IGFkYWU2NjhiMzcuLmExZDQzMjgzZGIgMTAwNjQ0 Ci0tLSBhL3NyYy90b29scy9wZ2luZGVudC90eXBlZGVmcy5saXN0CisrKyBiL3NyYy90b29s cy9wZ2luZGVudC90eXBlZGVmcy5saXN0CkBAIC0yMTM4LDYgKzIxMzgsNyBAQCBQcmVkSXRl ckluZm9EYXRhCiBQcmVkWGFjdExpc3QKIFByZWRpY2F0ZUxvY2tEYXRhCiBQcmVkaWNhdGVM b2NrVGFyZ2V0VHlwZQorUHJlZGljYXRlc0RhdGEKIFByZWZldGNoQnVmZmVyUmVzdWx0CiBQ cmVwUGFyYWxsZWxSZXN0b3JlUHRyVHlwZQogUHJlcGFyZVN0bXQKLS0gCjIuNDMuMAoK --------------FpDJ3gahTHoopmQBrg0t99Kq--