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.96) (envelope-from ) id 1wPP5v-000iIX-2i for pgsql-hackers@arkaria.postgresql.org; Tue, 19 May 2026 18:23:08 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wPP4t-004p7o-1f for pgsql-hackers@arkaria.postgresql.org; Tue, 19 May 2026 18:22:04 +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.96) (envelope-from ) id 1wPP4t-004p7g-06 for pgsql-hackers@lists.postgresql.org; Tue, 19 May 2026 18:22:04 +0000 Received: from mail-ot1-x32d.google.com ([2607:f8b0:4864:20::32d]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wPP4r-00000000PwF-2SD1 for pgsql-hackers@lists.postgresql.org; Tue, 19 May 2026 18:22:03 +0000 Received: by mail-ot1-x32d.google.com with SMTP id 46e09a7af769-7dbec19732eso4652026a34.3 for ; Tue, 19 May 2026 11:22:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779214918; cv=none; d=google.com; s=arc-20240605; b=Y9o7wCpGebnF/3ahq0/AqsIaNdiPwbJMZi8cE6t/ukbMh42yI3C2thzpdkU2acpLMX A0d6PQsWCIwmMOmr8lPBjlCrE6ZCX7Q5cNmxp4gUkFxvD+okeEImCYEYBTdDSielvuod +LSuhwYVqXdVG/4ppRlSr6bNHAyKqBTBlNgL7Mjs2vwC0yCNuSyAXbF4eEsHXuyd+fXX lJdBTaE5J6jDf12xkkEvJphN9suSqqbPREXNQ9zFr1QaM1Y3wF1c8gGfvOIx/RNROApX 8tLn1sZIvmKDaW+BI8JtVGhWu2s1FkoLQLLYGsCz/exLF5wvJw5t3tyvX/wOxI564RWK OCWw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=oASlLWmG8cdMLv+Qfcoz86sUIQRs6T4kchpOCTV5WHU=; fh=vqC7nHVAx7W1H9R1nBtWfuQkNngZyIg42DkBycP7EWk=; b=MefngJoU23RnPKpn7ep2F2ko/14k/xQWGe/0D56ZoaLumr4BJf7bEqFQQrsrlXf6zW xrTVRV7c1F8nh0scDVsrL3XnpUND8Hc1BRP2qYKb+9VrgZyXGtjBlfetu+1XMTC/YdjO aoxtCDB5x9uit2rNoXAnpvi2UzT30XI4sybxn8LkycWQr0NSIC8t7nkH0ceRiRppSU3S PRGut09+zXt5eLyVfADBbf/792AAxEShhjLgJ4kibHc89F6LNkqyVGHgrbYVi/RGteb9 6XZ/bPPd/bScl80hTJDGi1q7pidAvBWblNt60ymHQD4msEb5RDowVyJYjE93cUvTB471 gCTg==; darn=lists.postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779214918; x=1779819718; darn=lists.postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=oASlLWmG8cdMLv+Qfcoz86sUIQRs6T4kchpOCTV5WHU=; b=HxvqEu+V3z6ERy8LKjnoOyJkmXSlep2MIPqIZfjDxO9xIHYrezlgT71EW0FDTBkfwK jv0FkVEHAnBH/wAfhMhr74UFXXIzUph5cyEZ/bQLXWJO1jaAzcD/oXvy9Ev0U6JDxbJB AzmPcZw/OCVtY5NOEQXMUbOvQ9qIPODewBx8eyVTzaAA+a9MRsvaVA99Y/E2i4Op4FI7 jnTVzP149IO/lk5Cs8nH1TQZ97BcHAtkqJjKsfFWMi+i9WsGbDJgi025jYKHVIACmvYa JiRbX5snhjkp/pEzvYYVXiJdD2FwBb71ePjyYTw9xRNgXr+Q6vqUbKVv/J21Au3DZiGS sBoA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779214918; x=1779819718; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=oASlLWmG8cdMLv+Qfcoz86sUIQRs6T4kchpOCTV5WHU=; b=s2mJKetbnULfM+9gYiybo+P0sjLQcl3lijpeCtxNkN/tzWWx3XDOKFJ9gyRJM1U+5l XHgCIDen12mFuOstcs+ZmsYCbExgQfg0s8mfrCICZpudEHzxd8632n+ae7glSFMHIbW8 NuVuOOzcaDEun26JKiXqy5nTOwV9f/qqpFNnECkvkwJNWoDByDob09GcpZMlQCvKlGbE 5IXlBsiQ1ZeLn3+Z8qY6/ZdrzSCepRpiIyY0a/IBor9owSVokQBBdyK0/lZ222Z7HXKF cCEok9AnznJVd/FNJKBXrmlqlupfRf9wLlyQbDag6a2sml0hvaRmdZdCuHtfOFIEjfRw LPhw== X-Forwarded-Encrypted: i=1; AFNElJ9bftTHJJR7FMwnI9LlvM+UCttsHTIYr/54ImqfSJH+pEWCyniKRDUS042kIUWJ/bwSPmGT7K2GfI63Aiv9@lists.postgresql.org X-Gm-Message-State: AOJu0YyiA7Lq5IwRjyDDAMlmh8obbFhECyCio4isiAPR39Nn1tnNP7Uh qQPiGed3TKx39aiNiUECT73JRbp3agr6yUM+PY8qHVLdJ6W9MzImsrvIirMLhURe46h1WRnkFg4 S/C+jPNbaicqcIfo4B7roaJ2jwUF1qn0= X-Gm-Gg: Acq92OE4q5iqSEFAW5+NSebP78DUbutud5+LfbOomrvjd5v4IA4cbitMznhmz+Kvwcf xiQN7tibxqbEUJM+0AWBjFyFTbY1BZjRGSc2OxX5oa6yxTGEztQ+3a4pbhkhKKrQafy5RTWTNQT 0VF9JVMe7KKmbJzAks3cngAEaK+SJk2G9XZMdi4jgn3yRgizd+atoyeEorp8/PDgTfhewsLpXPD FqzFAHugBO35/5TkoQqTij9OfUrWT10zvMyeGnmCzKVb1fCkZV6uKJptlp3dQ47GiLZkhlxTdRB f2dtQK3qeF5yLu8kPPwxy+36VHZ+y6+tihBLLPmDQSxCzgNuwG90YvOVdQ66IZOcZJCf+CI0Nrq 9YXnqivneYwAvwoR4FNUpUeAicgzO5/+T9vJmYlHFWpecf6PbBkZWJJmUmkTwgg== X-Received: by 2002:a05:6820:150b:b0:696:2cf3:3bdb with SMTP id 006d021491bc7-69c943686d8mr12615077eaf.37.1779214917996; Tue, 19 May 2026 11:21:57 -0700 (PDT) MIME-Version: 1.0 References: <202508051955.sao7ucalcce7@alvherre.pgsql> <7e2abeb3ea9bc7ca024f4e457dce33f5@postgrespro.ru> In-Reply-To: From: Alexander Korotkov Date: Tue, 19 May 2026 21:21:45 +0300 X-Gm-Features: AVHnY4JyhNvF3hgT2MfHfVsmGOi-lt1_6kYj72OYP5VINhzrvt7xd9HBIRtNzVU Message-ID: Subject: Re: Function scan FDW pushdown To: Alexander Pyhalov Cc: solaimurugan vellaipandiyan , =?UTF-8?Q?=C3=81lvaro_Herrera?= , g.kashkin@postgrespro.ru, Ashutosh Bapat , PostgreSQL Hackers Content-Type: multipart/mixed; boundary="0000000000002adb0106522fc134" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000002adb0106522fc134 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Good evening! On Tue, May 19, 2026 at 6:25=E2=80=AFPM Alexander Pyhalov wrote: > > Found one more issue in whole row var deparsing. It can appear on a > nullable outer side, and we should use the same logic as when deparsing > table column reference. Otherwise we get records from nulls instead of > nulls (for example, "(NULL, NULL)" instead of NULL). Good catch, accepted. > Also I wonder if it is possible for get_tupdesc_for_join_scan_tuples() > to get NULL rtfuncdata when it looks at RTE_FUNCTION RTE here: > > 1759 else if (rte->rtekind =3D=3D RTE_FUNCTION && rtfuncd= ata > !=3D NIL) > 1760 { > 1761 /* > 1762 * A whole-row Var points at a FUNCTION RTE > absorbed into the > 1763 * foreign join. Synthesize an anonymous > composite TupleDesc from > 1764 * the per-function return-type metadata we > saved at plan time; > 1765 * the deparser emits these as > ROW(f.c1, f.c2, ...). > 1766 */ > 1767 List *funcdata; > 1768 TupleDesc rte_tupdesc; > 1769 int num_funcs; > 1770 int attnum; > 1771 ListCell *lc1, > > ? I don't see how that's possible. I think it would be safer to just assert rtfuncdata/funcdata are not NULL. Revised patch is attached. ------ Regards, Alexander Korotkov Supabase --0000000000002adb0106522fc134 Content-Type: application/octet-stream; name="v8-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign-.patch" Content-Disposition: attachment; filename="v8-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpcylmmm0 RnJvbSBmYTZlMDkwZTYwMGFjZjUyN2RjMmU4ODc3YzRlNjFjNjk4MjU4NDA5IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogVHVlLCAxOSBNYXkgMjAyNiAxNjoyODoyMiArMDMwMApTdWJqZWN0OiBb UEFUQ0ggdjhdIHBvc3RncmVzX2ZkdzogcHVzaCBkb3duIEZVTkNUSU9OIFJURSBpbnRvIGZvcmVp Z24gam9pbnMKCkEgZm9yZWlnbiBqb2luIHBsYW5uaW5nIGhvb2sgbm93IGNvbnNpZGVycyBhIChm b3JlaWduLXRhYmxlIHggZnVuY3Rpb24tUlRFKQpJTk5FUiBqb2luIGFzIGEgcHVzaC1kb3duIGNh bmRpZGF0ZSB3aGVuIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGlzCklNTVVUQUJMRSBhbmQgb3Ro ZXJ3aXNlIHNoaXBwYWJsZS4gIFRoZSByZW1vdGUgcXVlcnkgYWJzb3JicyB0aGUgZnVuY3Rpb24K Y2FsbCBhcyBhIEZST00tbGlzdCBpdGVtIChlLmcuIHVubmVzdCguLi4pIEFTIGY8cnRpPihjMSwg YzIsIC4uLikpLCBzbyB0aGUKZm9yZWlnbiBzaWRlIHJldHVybnMgb25seSByb3dzIHRoYXQgbWF0 Y2ggdGhlIGZ1bmN0aW9uLXByb2R1Y2VkIHNldCBhbmQgdGhlCmpvaW4gZXhlY3V0ZXMgZW50aXJl bHkgb24gdGhlIHJlbW90ZS4KCkFuIElNTVVUQUJMRSBmdW5jdGlvbiBnaXZlcyB0aGUgc2FtZSBy ZXN1bHQgb24gYW55IHNlcnZlciwgc28gdGhlIHNhbWUKZnVuY3Rpb24gUlRFIGNhbiBiZSBhIHB1 c2gtZG93biBjYW5kaWRhdGUgZm9yIHNldmVyYWwgZGlzdGluY3QgZm9yZWlnbgpzZXJ2ZXJzIHdp dGhvdXQgc2VtYW50aWMgcmlzay4gIFRvIGtlZXAgdGhlIHBsYW5uZXIgc3RhdGUgY29uc2lzdGVu dAphY3Jvc3MgdGhvc2UgaW5kZXBlbmRlbnQgYXR0ZW1wdHMsIHRoZSBwZXItY2FsbCBzdHViIGZw aW5mbyBmb3IgdGhlCmZ1bmN0aW9uIHNpZGUgbGl2ZXMgb24gdGhlIGpvaW5yZWwncyBQZ0Zkd1Jl bGF0aW9uSW5mbyAobmV3Cm91dGVyX2Z1bmNfZnBpbmZvIC8gaW5uZXJfZnVuY19mcGluZm8pLCBu ZXZlciBvbiB0aGUgZnVuY3Rpb24gcmVsIGl0c2VsZiwKYW5kIHRoZSBmdW5jdGlvbiBzaWRlIGlz IGRldGVjdGVkIHZpYSBydGVraW5kIHJhdGhlciB0aGFuIGZkd19wcml2YXRlLgoKc2V0X2ZvcmVp Z25fcmVsX3Byb3BlcnRpZXMoKSBwcm9wYWdhdGVzIGZkd3JvdXRpbmUgb250byBhIGpvaW5yZWwg dGhhdApwYWlycyBhIGZvcmVpZ24gcmVsIHdpdGggYW4gUlRFX0ZVTkNUSU9OIHJlbCBzbyBHZXRG b3JlaWduSm9pblBhdGhzIGdldHMKY2FsbGVkOyB0aGUgRkRXIHJldGFpbnMgZnVsbCBjb250cm9s IG92ZXIgd2hldGhlciB0byBhY3R1YWxseSBnZW5lcmF0ZSBhCnBhdGguICBkZXBhcnNlUmFuZ2VU YmxSZWYgYW5kIGRlcGFyc2VDb2x1bW5SZWYgZ2FpbiBhIEZVTkNUSU9OLVJURSBicmFuY2gKdGhh dCBlbWl0cyB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBhbmQgcmVzb2x2ZXMgVmFycyB0byB0aGUg Z2VuZXJhdGVkCmNvbHVtbiBhbGlhc2VzLgotLS0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFy c2UuYyAgICAgICAgICAgICAgICB8IDEzMiArKysrLQogLi4uL3Bvc3RncmVzX2Zkdy9leHBlY3Rl ZC9wb3N0Z3Jlc19mZHcub3V0ICAgIHwgNDQxICsrKysrKysrKysrKysrKysrCiBjb250cmliL3Bv c3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyAgICAgICAgICAgfCA0NjEgKysrKysrKysrKysrKysr KystCiBjb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaCAgICAgICAgICAgfCAgMTAg KwogY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwgICAgIHwgMTgzICsr KysrKysKIHNyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYyAgICAgICAgICB8ICAy NCArCiA2IGZpbGVzIGNoYW5nZWQsIDEyMjcgaW5zZXJ0aW9ucygrKSwgMjQgZGVsZXRpb25zKC0p CgpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jIGIvY29udHJpYi9w b3N0Z3Jlc19mZHcvZGVwYXJzZS5jCmluZGV4IDJkY2M2YzhhZjFiLi41NTY3ZmRiOGVkOSAxMDA2 NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvZGVwYXJzZS5jCisrKyBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L2RlcGFyc2UuYwpAQCAtMTEyLDYgKzExMiw3IEBAIHR5cGVkZWYgc3RydWN0IGRl cGFyc2VfZXhwcl9jeHQKIAkJYXBwZW5kU3RyaW5nSW5mbygoYnVmKSwgIiVzJWQuIiwgUkVMX0FM SUFTX1BSRUZJWCwgKHZhcm5vKSkKICNkZWZpbmUgU1VCUVVFUllfUkVMX0FMSUFTX1BSRUZJWAki cyIKICNkZWZpbmUgU1VCUVVFUllfQ09MX0FMSUFTX1BSRUZJWAkiYyIKKyNkZWZpbmUgRlVOQ1RJ T05fUkVMX0FMSUFTX1BSRUZJWAkiZiIKIAogLyoKICAqIEZ1bmN0aW9ucyB0byBkZXRlcm1pbmUg d2hldGhlciBhbiBleHByZXNzaW9uIGNhbiBiZSBldmFsdWF0ZWQgc2FmZWx5IG9uCkBAIC0yMDMw LDYgKzIwMzEsNzIgQEAgZGVwYXJzZUZyb21FeHByRm9yUmVsKFN0cmluZ0luZm8gYnVmLCBQbGFu bmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqZm9yZWlnbnJlbCwKIAl9CiB9CiAKKy8qCisgKiBE ZXBhcnNlIGEgRlVOQ1RJT04gUlRFIGFic29yYmVkIGludG8gYSBmb3JlaWduIGpvaW4uICBUaGUg ZnVuY3Rpb24gY2FsbChzKQorICogYXJlIGVtaXR0ZWQgYXMgYSBGUk9NLWxpc3QgaXRlbToKKyAq CisgKiAgIDxmdW5jZXhwcj4gQVMgZjxydGk+KGMxLCBjMiwgLi4uLCBjTikKKyAqCisgKiBGb3Ig bXVsdGktZnVuY3Rpb24gUlRFcyAoU1FMIFJPV1MgRlJPTSAoZjEoKSwgZjIoKSwgLi4uKSksIGVh Y2gKKyAqIGZ1bmN0aW9uIGNhbGwgYXBwZWFycyBjb21tYS1zZXBhcmF0ZWQgaW5zaWRlIFJPV1Mg RlJPTSguLi4pLiAgQ29sdW1uCisgKiBhbGlhc2VzIGMxLi5jTiBjb3ZlciB0aGUgdW5pb24gb2Yg ZXZlcnkgZnVuY3Rpb24ncyBjb2x1bW5zLCBpbiB0aGUKKyAqIG9yZGVyIHRoZXkgYXBwZWFyOyB0 aGF0IG1hdGNoZXMgdGhlIGNvbHVtbiBvcmRlcmluZyBvZiB0aGUgUlRFLgorICovCitzdGF0aWMg dm9pZAorZGVwYXJzZUZ1bmN0aW9uUmFuZ2VUYmxSZWYoU3RyaW5nSW5mbyBidWYsIFBsYW5uZXJJ bmZvICpyb290LAorCQkJCQkJICAgUmVsT3B0SW5mbyAqZm9yZWlnbnJlbCwgUmVsT3B0SW5mbyAq c2NhbnJlbCwKKwkJCQkJCSAgIExpc3QgKipwYXJhbXNfbGlzdCkKK3sKKwlSYW5nZVRibEVudHJ5 ICpydGUgPSBwbGFubmVyX3J0X2ZldGNoKGZvcmVpZ25yZWwtPnJlbGlkLCByb290KTsKKwlkZXBh cnNlX2V4cHJfY3h0IGNvbnRleHQ7CisJTGlzdENlbGwgICAqbGM7CisJYm9vbAkJbXVsdGlfZnVu YzsKKwlpbnQJCQl0b3RhbF9jb2xzID0gMDsKKwlpbnQJCQlpOworCisJQXNzZXJ0KHJ0ZS0+cnRl a2luZCA9PSBSVEVfRlVOQ1RJT04pOworCUFzc2VydCghcnRlLT5mdW5jb3JkaW5hbGl0eSk7CisJ QXNzZXJ0KGxpc3RfbGVuZ3RoKHJ0ZS0+ZnVuY3Rpb25zKSA+PSAxKTsKKworCW11bHRpX2Z1bmMg PSBsaXN0X2xlbmd0aChydGUtPmZ1bmN0aW9ucykgPiAxOworCisJY29udGV4dC5idWYgPSBidWY7 CisJY29udGV4dC5yb290ID0gcm9vdDsKKwljb250ZXh0LmZvcmVpZ25yZWwgPSBzY2FucmVsOwor CWNvbnRleHQuc2NhbnJlbCA9IHNjYW5yZWw7CisJY29udGV4dC5wYXJhbXNfbGlzdCA9IHBhcmFt c19saXN0OworCisJaWYgKG11bHRpX2Z1bmMpCisJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVm LCAiUk9XUyBGUk9NICgiKTsKKworCWZvcmVhY2gobGMsIHJ0ZS0+ZnVuY3Rpb25zKQorCXsKKwkJ UmFuZ2VUYmxGdW5jdGlvbiAqcnRmdW5jID0gKFJhbmdlVGJsRnVuY3Rpb24gKikgbGZpcnN0KGxj KTsKKworCQlpZiAoZm9yZWFjaF9jdXJyZW50X2luZGV4KGxjKSA+IDApCisJCQlhcHBlbmRTdHJp bmdJbmZvU3RyaW5nKGJ1ZiwgIiwgIik7CisJCWRlcGFyc2VFeHByKChFeHByICopIHJ0ZnVuYy0+ ZnVuY2V4cHIsICZjb250ZXh0KTsKKwkJdG90YWxfY29scyArPSBydGZ1bmMtPmZ1bmNjb2xjb3Vu dDsKKwl9CisKKwlpZiAobXVsdGlfZnVuYykKKwkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAn KScpOworCisJLyogQWxpYXMgKyBnZW5lcmF0ZWQgY29sdW1uLW5hbWUgbGlzdC4gKi8KKwlhcHBl bmRTdHJpbmdJbmZvKGJ1ZiwgIiAlcyVkIiwgRlVOQ1RJT05fUkVMX0FMSUFTX1BSRUZJWCwgZm9y ZWlnbnJlbC0+cmVsaWQpOworCWlmICh0b3RhbF9jb2xzID4gMCkKKwl7CisJCWFwcGVuZFN0cmlu Z0luZm9DaGFyKGJ1ZiwgJygnKTsKKwkJZm9yIChpID0gMTsgaSA8PSB0b3RhbF9jb2xzOyBpKysp CisJCXsKKwkJCWlmIChpID4gMSkKKwkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiwg Iik7CisJCQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiVzJWQiLCBTVUJRVUVSWV9DT0xfQUxJQVNf UFJFRklYLCBpKTsKKwkJfQorCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcpJyk7CisJfQor fQorCiAvKgogICogQXBwZW5kIEZST00gY2xhdXNlIGVudHJ5IGZvciB0aGUgZ2l2ZW4gcmVsYXRp b24gaW50byBidWYuCiAgKiBDb25kaXRpb25zIGZyb20gbG93ZXItbGV2ZWwgU0VNSS1KT0lOcyBh cmUgYXBwZW5kZWQgdG8gYWRkaXRpb25hbF9jb25kcwpAQCAtMjA0MCw3ICsyMTA3LDIyIEBAIGRl cGFyc2VSYW5nZVRibFJlZihTdHJpbmdJbmZvIGJ1ZiwgUGxhbm5lckluZm8gKnJvb3QsIFJlbE9w dEluZm8gKmZvcmVpZ25yZWwsCiAJCQkJICAgYm9vbCBtYWtlX3N1YnF1ZXJ5LCBJbmRleCBpZ25v cmVfcmVsLCBMaXN0ICoqaWdub3JlX2NvbmRzLAogCQkJCSAgIExpc3QgKiphZGRpdGlvbmFsX2Nv bmRzLCBMaXN0ICoqcGFyYW1zX2xpc3QpCiB7Ci0JUGdGZHdSZWxhdGlvbkluZm8gKmZwaW5mbyA9 IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmb3JlaWducmVsLT5mZHdfcHJpdmF0ZTsKKwlQZ0Zkd1Jl bGF0aW9uSW5mbyAqZnBpbmZvOworCisJLyoKKwkgKiBGb3IgYSBmdW5jdGlvbiBSVEUgYWJzb3Ji ZWQgaW50byBhIGZvcmVpZ24gam9pbiwgZGVwYXJzZSB0aGUgZnVuY3Rpb24KKwkgKiBleHByZXNz aW9uIGFzIGEgRlJPTS1saXN0IGl0ZW0gYW5kIHJldHVybi4gIFRoZSBzdHViIGZwaW5mbyBzZXQg dXAgYnkKKwkgKiBmb3JlaWduX2pvaW5fb2soKSBtYXkgb3IgbWF5IG5vdCBiZSBwcmVzZW50IGhl cmUuCisJICovCisJaWYgKGZvcmVpZ25yZWwtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OKQorCXsK KwkJQXNzZXJ0KCFtYWtlX3N1YnF1ZXJ5KTsKKwkJZGVwYXJzZUZ1bmN0aW9uUmFuZ2VUYmxSZWYo YnVmLCByb290LCBmb3JlaWducmVsLCBmb3JlaWducmVsLAorCQkJCQkJCQkgICBwYXJhbXNfbGlz dCk7CisJCXJldHVybjsKKwl9CisKKwlmcGluZm8gPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgZm9y ZWlnbnJlbC0+ZmR3X3ByaXZhdGU7CiAKIAkvKiBTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhl c2UgY2FzZXMuICovCiAJQXNzZXJ0KElTX1NJTVBMRV9SRUwoZm9yZWlnbnJlbCkgfHwgSVNfSk9J Tl9SRUwoZm9yZWlnbnJlbCkpOwpAQCAtMjcxMiw2ICsyNzk0LDU0IEBAIHN0YXRpYyB2b2lkCiBk ZXBhcnNlQ29sdW1uUmVmKFN0cmluZ0luZm8gYnVmLCBpbnQgdmFybm8sIGludCB2YXJhdHRubywg UmFuZ2VUYmxFbnRyeSAqcnRlLAogCQkJCSBib29sIHF1YWxpZnlfY29sKQogeworCS8qCisJICog RnVuY3Rpb24gUlRFIGNvbHVtbnM6IGVtaXQgYXMgZjx2YXJubz4uYzx2YXJhdHRubz4sIG1hdGNo aW5nIHRoZQorCSAqIGFsaWFzZXMgZ2VuZXJhdGVkIGJ5IGRlcGFyc2VGdW5jdGlvblJhbmdlVGJs UmVmKCkuICBBIHdob2xlLXJvdyBWYXIKKwkgKiAodmFyYXR0bm8gPT0gMCkgaXMgcmVuZGVyZWQg YXMgUk9XKGY8dmFybm8+LmMxLCAuLi4sIGY8dmFybm8+LmM8Tj4pCisJICogd2hlcmUgTiBpcyB0 aGUgdG90YWwgY29sdW1uIGNvdW50IG9mIHRoZSBmdW5jdGlvbiBSVEUgKGluY2x1ZGluZyBhbGwK KwkgKiBST1dTIEZST00gKC4uLikgbWVtYmVycykuICBTeXN0ZW0gYXR0cmlidXRlcyBzdWNoIGFz IGN0aWQgaGF2ZSBubworCSAqIG1lYW5pbmcgZm9yIGZ1bmN0aW9uIFJURXMgYW5kIGFyZSByZWpl Y3RlZC4KKwkgKi8KKwlpZiAocnRlLT5ydGVraW5kID09IFJURV9GVU5DVElPTikKKwl7CisJCWlm ICh2YXJhdHRubyA9PSAwKQorCQl7CisJCQlpbnQJCQluY29scyA9IGxpc3RfbGVuZ3RoKHJ0ZS0+ ZXJlZi0+Y29sbmFtZXMpOworCQkJaW50CQkJaTsKKworCQkJaWYgKHF1YWxpZnlfY29sKQorCQkJ eworCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiQ0FTRSBXSEVOICgiKTsKKwkJCQlh cHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiVzJWQuIiwgRlVOQ1RJT05fUkVMX0FMSUFTX1BSRUZJWCwg dmFybm8pOworCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiKik6OnRleHQgSVMgTk9U IE5VTEwgVEhFTiAiKTsKKwkJCX0KKworCQkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYsICJS T1coIik7CisJCQlmb3IgKGkgPSAxOyBpIDw9IG5jb2xzOyBpKyspCisJCQl7CisJCQkJaWYgKGkg PiAxKQorCQkJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5nKGJ1ZiwgIiwgIik7CisJCQkJYXBwZW5k U3RyaW5nSW5mbyhidWYsICIlcyVkLiVzJWQiLAorCQkJCQkJCQkgRlVOQ1RJT05fUkVMX0FMSUFT X1BSRUZJWCwgdmFybm8sCisJCQkJCQkJCSBTVUJRVUVSWV9DT0xfQUxJQVNfUFJFRklYLCBpKTsK KwkJCX0KKwkJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyknKTsKKworCQkJaWYgKHF1YWxp ZnlfY29sKQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiIEVORCIpOworCQkJcmV0 dXJuOworCQl9CisKKwkJaWYgKHZhcmF0dG5vIDwgMCkKKwkJCWVsb2coRVJST1IsCisJCQkJICJz eXN0ZW0gYXR0cmlidXRlIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uIFJURSBpcyBub3Qgc3VwcG9y dGVkIGluIGZvcmVpZ24gam9pbiBwdXNoZG93biIpOworCisJCWlmIChxdWFsaWZ5X2NvbCkKKwkJ CWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZC4iLCBGVU5DVElPTl9SRUxfQUxJQVNfUFJFRklY LCB2YXJubyk7CisJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZCIsIFNVQlFVRVJZX0NPTF9B TElBU19QUkVGSVgsIHZhcmF0dG5vKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIFdlIHN1cHBvcnQg ZmV0Y2hpbmcgdGhlIHJlbW90ZSBzaWRlJ3MgQ1RJRCBhbmQgT0lELiAqLwogCWlmICh2YXJhdHRu byA9PSBTZWxmSXRlbVBvaW50ZXJBdHRyaWJ1dGVOdW1iZXIpCiAJewpkaWZmIC0tZ2l0IGEvY29u dHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5kZXggZTkwMjg5ZTRhYjEuLmE2 MjZiNWU1YWNlIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0 Z3Jlc19mZHcub3V0CisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVz X2Zkdy5vdXQKQEAgLTI4ODUsNiArMjg4NSw0NDcgQEAgU0VMRUNUIHQxLmMxLCB0Mi5jMiBGUk9N IHY0IHQxIExFRlQgSk9JTiBmdDUgdDIgT04gKHQxLmMxID0gdDIuYzEpIE9SREVSIEJZIHQxLmMK ICgxMCByb3dzKQogCiBBTFRFUiBWSUVXIHY0IE9XTkVSIFRPIHJlZ3Jlc3Nfdmlld19vd25lcjsK Ky0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT0KKy0tIEZvcmVpZ24tam9pbiB3aXRoIEZVTkNUSU9OIFJURSBwdXNoZG93 biAoSU1NVVRBQkxFIGZ1bmN0aW9ucyBvbmx5KQorLS0gPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gSU1NVVRBQkxF IGZ1bmN0aW9uOiB1bm5lc3Qgb2YgY29uc3RhbnQgYXJyYXkgY2FuIGJlIHB1c2hlZCBkb3duCitF WFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZST00gZnQx IHQxLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUg dDEuYzEgPSB1LmlkIE9SREVSIEJZIHQxLmMxOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBPdXRwdXQ6IHQx LmMxLCB0MS5jMworICAgU29ydCBLZXk6IHQxLmMxCisgICAtPiAgRm9yZWlnbiBTY2FuCisgICAg ICAgICBPdXRwdXQ6IHQxLmMxLCB0MS5jMworICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0 MSB0MSkgSU5ORVIgSk9JTiAoRnVuY3Rpb24gdSkKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVD VCByMS4iQyAxIiwgcjEuYzMgRlJPTSAoIlMgMSIuIlQgMSIgcjEgSU5ORVIgSk9JTiB1bm5lc3Qo J3sxLDUsMTAsMTAwfSc6OmludGVnZXJbXSkgZjIoYzEpIE9OICgoKHIxLiJDIDEiID0gZjIuYzEp KSkpCisoNyByb3dzKQorCitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZST00gZnQxIHQxLCB1bm5lc3Qo QVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1Lmlk IE9SREVSIEJZIHQxLmMxOworIGMxICB8ICBjMyAgIAorLS0tLS0rLS0tLS0tLQorICAgMSB8IDAw MDAxCisgICA1IHwgMDAwMDUKKyAgMTAgfCAwMDAxMAorIDEwMCB8IDAwMTAwCisoNCByb3dzKQor CistLSBJTU1VVEFCTEUgZnVuY3Rpb246IGdlbmVyYXRlX3NlcmllcyB3aXRoIGNvbnN0YW50IGFy Z3MKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSBGUk9NIGZ0MSB0 MSwgZ2VuZXJhdGVfc2VyaWVzKDEsIDQpIEFTIGcoaWQpCitXSEVSRSB0MS5jMSA9IGcuaWQgT1JE RVIgQlkgdDEuYzE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBPdXRwdXQ6 IHQxLmMxCisgICBTb3J0IEtleTogdDEuYzEKKyAgIC0+ICBGb3JlaWduIFNjYW4KKyAgICAgICAg IE91dHB1dDogdDEuYzEKKyAgICAgICAgIFJlbGF0aW9uczogKHB1YmxpYy5mdDEgdDEpIElOTkVS IEpPSU4gKEZ1bmN0aW9uIGcpCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgcjEuIkMgMSIg RlJPTSAoIlMgMSIuIlQgMSIgcjEgSU5ORVIgSk9JTiBnZW5lcmF0ZV9zZXJpZXMoMSwgNCkgZjIo YzEpIE9OICgoKHIxLiJDIDEiID0gZjIuYzEpKSkpCisoNyByb3dzKQorCitTRUxFQ1QgdDEuYzEg RlJPTSBmdDEgdDEsIGdlbmVyYXRlX3NlcmllcygxLCA0KSBBUyBnKGlkKQorV0hFUkUgdDEuYzEg PSBnLmlkIE9SREVSIEJZIHQxLmMxOworIGMxIAorLS0tLQorICAxCisgIDIKKyAgMworICA0Ciso NCByb3dzKQorCistLSBWT0xBVElMRSBmdW5jdGlvbiAocmFuZG9tKSBtdXN0IE5PVCBiZSBwdXNo ZWQgZG93bgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmMxIEZST00g ZnQxIHQxLCBnZW5lcmF0ZV9zZXJpZXMoMSwgNCArIChyYW5kb20oKSAqIDApOjppbnQpIEFTIGco aWQpCitXSEVSRSB0MS5jMSA9IGcuaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIEhhc2gg Sm9pbgorICAgT3V0cHV0OiB0MS5jMQorICAgSGFzaCBDb25kOiAoZy5pZCA9IHQxLmMxKQorICAg LT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0YWxvZy5nZW5lcmF0ZV9zZXJpZXMgZworICAgICAg ICAgT3V0cHV0OiBnLmlkCisgICAgICAgICBGdW5jdGlvbiBDYWxsOiBnZW5lcmF0ZV9zZXJpZXMo MSwgKDQgKyAoKHJhbmRvbSgpICogJzAnOjpkb3VibGUgcHJlY2lzaW9uKSk6OmludGVnZXIpKQor ICAgLT4gIEhhc2gKKyAgICAgICAgIE91dHB1dDogdDEuYzEKKyAgICAgICAgIC0+ICBGb3JlaWdu IFNjYW4gb24gcHVibGljLmZ0MSB0MQorICAgICAgICAgICAgICAgT3V0cHV0OiB0MS5jMQorICAg ICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiIEZST00gIlMgMSIuIlQgMSIKKygx MSByb3dzKQorCistLSBXSVRIIE9SRElOQUxJVFkgbXVzdCBOT1QgYmUgcHVzaGVkIGRvd24gKGxp bWl0YXRpb24gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbikKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RT IE9GRikKK1NFTEVDVCB0MS5jMSwgdS5vcmQKK0ZST00gZnQxIHQxLCB1bm5lc3QoQVJSQVlbMSwg NSwgMTBdOjppbnRbXSkgV0lUSCBPUkRJTkFMSVRZIEFTIHUoaWQsIG9yZCkKK1dIRVJFIHQxLmMx ID0gdS5pZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tCisgSGFzaCBKb2luCisgICBPdXRwdXQ6IHQxLmMxLCB1Lm9yZAor ICAgSGFzaCBDb25kOiAodDEuYzEgPSB1LmlkKQorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJs aWMuZnQxIHQxCisgICAgICAgICBPdXRwdXQ6IHQxLmMxCisgICAgICAgICBSZW1vdGUgU1FMOiBT RUxFQ1QgIkMgMSIgRlJPTSAiUyAxIi4iVCAxIgorICAgLT4gIEhhc2gKKyAgICAgICAgIE91dHB1 dDogdS5vcmQsIHUuaWQKKyAgICAgICAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cu dW5uZXN0IHUKKyAgICAgICAgICAgICAgIE91dHB1dDogdS5vcmQsIHUuaWQKKyAgICAgICAgICAg ICAgIEZ1bmN0aW9uIENhbGw6IHVubmVzdCgnezEsNSwxMH0nOjppbnRlZ2VyW10pCisoMTEgcm93 cykKKworLS0gU2FtZSBmdW5jdGlvbiBSVEUgam9pbmVkIHdpdGggdHdvIGRpZmZlcmVudCBmb3Jl aWduIHNlcnZlcnM6IHBsYW5uZXIgcGlja3MKKy0tIG9uZSBhYnNvcnB0aW9uICsgYSBsb2NhbCBq b2luIHdpdGggdGhlIHNlY29uZCBmb3JlaWduIHNlcnZlci4gIFRoZSBmYWN0CistLSB0aGF0IHRo ZSBmdW5jdGlvbiBpcyBJTU1VVEFCTEUgbWFrZXMgdGhpcyBzYWZlIGV2ZW4gaWYgYm90aCBzaWRl cyBjaG9zZSB0bworLS0gYWJzb3JiIGl0IGluZGVwZW5kZW50bHkuCitFWFBMQUlOIChWRVJCT1NF LCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQyLmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1 bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEg PSB1LmlkIEFORCB0Mi5jMSA9IHUuaWQgT1JERVIgQlkgdDEuYzE7CisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVFUlkg UExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIEpv aW4KKyAgIE91dHB1dDogdDEuYzEsIHQyLmMxCisgICBNZXJnZSBDb25kOiAodDEuYzEgPSB1Lmlk KQorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMuZnQxIHQxCisgICAgICAgICBPdXRwdXQ6 IHQxLmMxCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgIkMgMSIgRlJPTSAiUyAxIi4iVCAx IiBPUkRFUiBCWSAiQyAxIiBBU0MgTlVMTFMgTEFTVAorICAgLT4gIFNvcnQKKyAgICAgICAgIE91 dHB1dDogdDIuYzEsIHUuaWQKKyAgICAgICAgIFNvcnQgS2V5OiB0Mi5jMQorICAgICAgICAgLT4g IEZvcmVpZ24gU2NhbgorICAgICAgICAgICAgICAgT3V0cHV0OiB0Mi5jMSwgdS5pZAorICAgICAg ICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0NiB0MikgSU5ORVIgSk9JTiAoRnVuY3Rpb24g dSkKKyAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCByMi5jMSwgZjMuYzEgRlJPTSAo IlMgMSIuIlQgNCIgcjIgSU5ORVIgSk9JTiB1bm5lc3QoJ3sxLDUsMTAsMTAwfSc6OmludGVnZXJb XSkgZjMoYzEpIE9OICgoKHIyLmMxID0gZjMuYzEpKSkpCisoMTMgcm93cykKKworLS0gQ29zdC1i YXNlZCBzZWxlY3Rpb24gYmV0d2VlbiB0d28gZm9yZWlnbiBzZXJ2ZXJzOiBmdDEgKCJTIDEiLiJU IDEiKSBoYXMKKy0tIDEwMDAgcm93cywgZnQ2ICgiUyAxIi4iVCA0IikgaGFzIH4zMyByb3dzLiAg VGhlIHNhbWUgcXVlcnkgc2hhcGUgZ2V0cyBhCistLSBkaWZmZXJlbnQgcHVzaC1kb3duIHRhcmdl dCBkZXBlbmRpbmcgb24gYSBwcmVkaWNhdGUgdGhhdCBjaGFuZ2VzIHRoZQorLS0gZWZmZWN0aXZl IGNhcmRpbmFsaXR5IG9mIG9uZSBzaWRlIC0tIHRoZSBmdW5jdGlvbiAianVtcHMiIHRvIHdoaWNo ZXZlcgorLS0gZm9yZWlnbiBzY2FuIGJlbmVmaXRzIG1vcmUgZnJvbSBiZWluZyBwcmUtZmlsdGVy ZWQuCitBTkFMWVpFIGZ0MTsKK0FOQUxZWkUgZnQ2OworLS0gTm8gZXh0cmEgcHJlZGljYXRlOiBm dDEgaXMgdGhlIGJpZ2dlciBzaWRlLCBmdW5jdGlvbiBhYnNvcmJlZCB0aGVyZS4KK0VYUExBSU4g KFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdDIuYzEKK0ZST00gZnQxIHQxLCBm dDYgdDIsIHVubmVzdChBUlJBWVszLCA2LCA5LCAxMiwgMTUsIDE4XTo6aW50W10pIEFTIHUoaWQp CitXSEVSRSB0MS5jMSA9IHUuaWQgQU5EIHQyLmMxID0gdS5pZDsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZ IFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBI YXNoIEpvaW4KKyAgIE91dHB1dDogdDEuYzEsIHQyLmMxCisgICBIYXNoIENvbmQ6ICh0MS5jMSA9 IHQyLmMxKQorICAgLT4gIEZvcmVpZ24gU2NhbgorICAgICAgICAgT3V0cHV0OiB0MS5jMSwgdS5p ZAorICAgICAgICAgUmVsYXRpb25zOiAocHVibGljLmZ0MSB0MSkgSU5ORVIgSk9JTiAoRnVuY3Rp b24gdSkKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCByMS4iQyAxIiwgZjMuYzEgRlJPTSAo IlMgMSIuIlQgMSIgcjEgSU5ORVIgSk9JTiB1bm5lc3QoJ3szLDYsOSwxMiwxNSwxOH0nOjppbnRl Z2VyW10pIGYzKGMxKSBPTiAoKChyMS4iQyAxIiA9IGYzLmMxKSkpKQorICAgLT4gIEhhc2gKKyAg ICAgICAgIE91dHB1dDogdDIuYzEKKyAgICAgICAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGlj LmZ0NiB0MgorICAgICAgICAgICAgICAgT3V0cHV0OiB0Mi5jMQorICAgICAgICAgICAgICAgUmVt b3RlIFNRTDogU0VMRUNUIGMxIEZST00gIlMgMSIuIlQgNCIKKygxMiByb3dzKQorCistLSBTZWxl Y3RpdmUgcHJlZGljYXRlIG9uIGZ0MS5jMyAobm90IGluIHRoZSBlcWNsYXNzKSBzaHJpbmtzIGZ0 MSB0byBhCistLSBoYW5kZnVsIG9mIHJlbW90ZSByb3dzOyBub3cgZnQ2IGlzIGVmZmVjdGl2ZWx5 IHRoZSBiaWdnZXIgc2lkZSBhbmQgdGhlCistLSBmdW5jdGlvbiBpcyBhYnNvcmJlZCBpbnRvIGZ0 NiBpbnN0ZWFkLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmMxLCB0 Mi5jMQorRlJPTSBmdDEgdDEsIGZ0NiB0MiwgdW5uZXN0KEFSUkFZWzMsIDYsIDksIDEyLCAxNSwg MThdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBBTkQgdDIuYzEgPSB1Lmlk IEFORCB0MS5jMyA8ICcwMDAxMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTmVzdGVkIExvb3AKKyAgIE91 dHB1dDogdDEuYzEsIHQyLmMxCisgICBKb2luIEZpbHRlcjogKHQxLmMxID0gdS5pZCkKKyAgIC0+ ICBGb3JlaWduIFNjYW4gb24gcHVibGljLmZ0MSB0MQorICAgICAgICAgT3V0cHV0OiB0MS5jMQor ICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUICJDIDEiIEZST00gIlMgMSIuIlQgMSIgV0hFUkUg KChjMyA8ICcwMDAxMCcpKQorICAgLT4gIE1hdGVyaWFsaXplCisgICAgICAgICBPdXRwdXQ6IHQy LmMxLCB1LmlkCisgICAgICAgICAtPiAgRm9yZWlnbiBTY2FuCisgICAgICAgICAgICAgICBPdXRw dXQ6IHQyLmMxLCB1LmlkCisgICAgICAgICAgICAgICBSZWxhdGlvbnM6IChwdWJsaWMuZnQ2IHQy KSBJTk5FUiBKT0lOIChGdW5jdGlvbiB1KQorICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VM RUNUIHIyLmMxLCBmMy5jMSBGUk9NICgiUyAxIi4iVCA0IiByMiBJTk5FUiBKT0lOIHVubmVzdCgn ezMsNiw5LDEyLDE1LDE4fSc6OmludGVnZXJbXSkgZjMoYzEpIE9OICgoKHIyLmMxID0gZjMuYzEp KSkpCisoMTIgcm93cykKKworLS0gVGhlIHJlbWFpbmluZyBzY2VuYXJpb3MgcmV1c2UgYSBkZWRp Y2F0ZWQgZm9yZWlnbiB0YWJsZSB0byBjb3ZlciB0aGUKKy0tIGNvcm5lciBjYXNlcyBvZiBGVU5D VElPTiBSVEUgcHVzaC1kb3duOiBmdW5jdGlvbi1maXJzdCBGUk9NLCByZWNvcmQKKy0tIHJldHVy biB0eXBlIHJlamVjdGlvbiwgd2hvbGUtcm93IHJlZmVyZW5jZSwgVVBEQVRFLi4uRlJPTS4uLiwg YW5kCistLSBtdWx0aS1mdW5jdGlvbiBST1dTIEZST00uCitDUkVBVEUgVEFCTEUgYmFzZV90Ymxf Zm4gKGEgaW50LCBiIGludCk7CitJTlNFUlQgSU5UTyBiYXNlX3RibF9mbgorICBTRUxFQ1QgZywg ZyArIDEwMCBGUk9NIGdlbmVyYXRlX3NlcmllcygxLCAzMCkgZzsKK0NSRUFURSBGT1JFSUdOIFRB QkxFIHJlbW90ZV90YmwgKGEgaW50LCBiIGludCkKKyAgU0VSVkVSIGxvb3BiYWNrIE9QVElPTlMg KHRhYmxlX25hbWUgJ2Jhc2VfdGJsX2ZuJyk7CistLSBUaGUgZnVuY3Rpb24gUlRFIGFwcGVhcnMg Zmlyc3QgaW4gRlJPTTsgdGhlIGZvcmVpZ24gcmVsYXRpb24gbXVzdCBiZQorLS0gZm91bmQgYnkg c2Nhbm5pbmcgZnNfYmFzZV9yZWxpZHMgZm9yIGFuIFJURV9SRUxBVElPTiByYXRoZXIgdGhhbgor LS0gdXNpbmcgc2Nhbi0+ZnNfcmVsaWQgYmxpbmRseS4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RT IE9GRikKK1NFTEVDVCAqIEZST00gdW5uZXN0KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJs IHIgV0hFUkUgci5hID0gbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tCisgRm9yZWlnbiBTY2FuCisgICBPdXRwdXQ6IG4ubiwgci5hLCByLmIKKyAg IFJlbGF0aW9uczogKEZ1bmN0aW9uIG4pIElOTkVSIEpPSU4gKHB1YmxpYy5yZW1vdGVfdGJsIHIp CisgICBSZW1vdGUgU1FMOiBTRUxFQ1QgZjEuYzEsIHIyLmEsIHIyLmIgRlJPTSAodW5uZXN0KCd7 MiwzLDR9Jzo6aW50ZWdlcltdKSBmMShjMSkgSU5ORVIgSk9JTiBwdWJsaWMuYmFzZV90YmxfZm4g cjIgT04gKCgoZjEuYzEgPSByMi5hKSkpKQorKDQgcm93cykKKworU0VMRUNUICogRlJPTSB1bm5l c3QoYXJyYXlbMiwgMywgNF0pIG4sIHJlbW90ZV90YmwgcgorV0hFUkUgci5hID0gbiBPUkRFUiBC WSByLmE7CisgbiB8IGEgfCAgYiAgCistLS0rLS0tKy0tLS0tCisgMiB8IDIgfCAxMDIKKyAzIHwg MyB8IDEwMworIDQgfCA0IHwgMTA0CisoMyByb3dzKQorCistLSBBIGZ1bmN0aW9uIHJldHVybmlu ZyByZWNvcmQgKGNvbXBvc2l0ZSkgaXMgZm9yYmlkZGVuOyBwdXNoaW5nIGl0CistLSB3b3VsZCB5 aWVsZCBhIHJlbW90ZSAiY29sdW1uIGRlZmluaXRpb24gbGlzdCBpcyByZXF1aXJlZCIgZXJyb3Iu CistLSBmdW5jdGlvbl9ydGVfcHVzaGRvd25fb2soKSByZWplY3RzIGl0IHZpYSBUWVBFRlVOQ19T Q0FMQVIuCitDUkVBVEUgT1IgUkVQTEFDRSBGVU5DVElPTiBmX3JldF9yZWNvcmQoKSBSRVRVUk5T IHJlY29yZCBBUyAkJAorICBTRUxFQ1QgKDEsIDIpOjpyZWNvcmQKKyQkIExBTkdVQUdFIFNRTCBJ TU1VVEFCTEU7CitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgcyBGUk9NIHJl bW90ZV90YmwgcnQsIGZfcmV0X3JlY29yZCgpIEFTIHMoYSBpbnQsIGIgaW50KQorV0hFUkUgcy5h ID0gcnQuYTsKKyAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAg ICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tCisgSGFzaCBKb2luCisgICBPdXRwdXQ6IHMuKgorICAgSGFzaCBDb25kOiAocnQuYSA9 IHMuYSkKKyAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLnJlbW90ZV90YmwgcnQKKyAgICAg ICAgIE91dHB1dDogcnQuYSwgcnQuYgorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEgRlJP TSBwdWJsaWMuYmFzZV90YmxfZm4KKyAgIC0+ICBIYXNoCisgICAgICAgICBPdXRwdXQ6IHMuKiwg cy5hCisgICAgICAgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBwdWJsaWMuZl9yZXRfcmVjb3JkIHMK KyAgICAgICAgICAgICAgIE91dHB1dDogcy4qLCBzLmEKKyAgICAgICAgICAgICAgIEZ1bmN0aW9u IENhbGw6IGZfcmV0X3JlY29yZCgpCisoMTEgcm93cykKKworRFJPUCBGVU5DVElPTiBmX3JldF9y ZWNvcmQoKTsKKy0tIFVQREFURSAuLi4gRlJPTSB1bm5lc3QoKSB3aXRoIGEgY29tcGxleCBlbGVt ZW50IHR5cGU7IGFyZWEoYm94KQorLS0geWllbGRzIHRoZSB2YWx1ZSB0byBtYXRjaC4gIFRoZSBs b2NraW5nIG1hY2hpbmVyeSBmb3IgdGhlCistLSBub24tcmVsYXRpb24gUlRFIGdlbmVyYXRlcyBh IHdob2xlLXJvdyBWYXIgdGhhdCBkZXBhcnNlQ29sdW1uUmVmCistLSBlbWl0cyBhcyBST1coZjxy dGk+LmMxLCAuLi4pLgorVVBEQVRFIHJlbW90ZV90YmwgciBTRVQgYiA9IDk5OQorRlJPTSB1bm5l c3QoYXJyYXlbYm94ICcoKDIsMyksKC0yLC0zKSknXSkgQVMgdChieCkKK1dIRVJFIHIuYSA9IGFy ZWEodC5ieCk7CitTRUxFQ1QgKiBGUk9NIHJlbW90ZV90YmwgV0hFUkUgYSBJTiAoMjMsIDI0LCAy NSkgT1JERVIgQlkgYTsKKyBhICB8ICBiICAKKy0tLS0rLS0tLS0KKyAyMyB8IDEyMworIDI0IHwg OTk5CisgMjUgfCAxMjUKKygzIHJvd3MpCisKKy0tIFRoZSBzYW1lIHNoYXBlIHdpdGggQ0FTRSBh bmQgUkVUVVJOSU5HOyBleGVyY2lzZXMgdGhlIERpcmVjdE1vZGlmeQorLS0gcGF0aCBhbmQgdGhl IGV4ZWN1dG9yJ3MgdHVwbGUtZGVzYyByZWNvbnN0cnVjdGlvbi4KK1VQREFURSByZW1vdGVfdGJs IHIKKyAgIFNFVCBiID0gQ0FTRSBXSEVOIHJhbmRvbSgpID49IDAgVEhFTiA1IEVMU0UgMCBFTkQK KyAgRlJPTSB1bm5lc3QoYXJyYXlbYm94ICcoKDIsMyksKC0yLC0zKSknXSkgQVMgdChieCkKKyBX SEVSRSByLmEgPSBhcmVhKHQuYngpIFJFVFVSTklORyBhLCBiOworIGEgIHwgYiAKKy0tLS0rLS0t CisgMjQgfCA1CisoMSByb3cpCisKKy0tIFJFVFVSTklORyBhIHdob2xlLXJvdyByZWZlcmVuY2Ug dG8gdGhlIGZ1bmN0aW9uIFJURS4gIFdpdGhvdXQgdGhlCistLSBwZXItUlRFIGZ1bmN0aW9uIG1l dGFkYXRhIGJlaW5nIHByZXNlcnZlZCBvbiB0aGUgRGlyZWN0TW9kaWZ5IHBhdGgKKy0tIChGZHdE aXJlY3RNb2RpZnlQcml2YXRlRnVuY3Rpb25zIC8gRmR3RGlyZWN0TW9kaWZ5UHJpdmF0ZU1pblJU SW5kZXgpLAorLS0gdGhpcyB3b3VsZCBmYWlsIHdpdGggImlucHV0IG9mIGFub255bW91cyBjb21w b3NpdGUgdHlwZXMgaXMgbm90CistLSBpbXBsZW1lbnRlZCIuCitVUERBVEUgcmVtb3RlX3RibCBy IFNFVCBiID0gNworICBGUk9NIHVubmVzdChhcnJheVtib3ggJygoMiwzKSwoLTIsLTMpKSddLAor ICAgICAgICAgICAgICBhcnJheVtpbnQgJzEnXSkgQVMgdChieCwgaSkKKyBXSEVSRSByLmEgPSBh cmVhKHQuYngpIFJFVFVSTklORyBhLCBiLCB0OworIGEgIHwgYiB8ICAgICAgICAgIHQgICAgICAg ICAgCistLS0tKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAyNCB8IDcgfCAoIigyLDMpLCgt MiwtMykiLDEpCisoMSByb3cpCisKKy0tIFJPV1MgRlJPTSAoLi4uKSB3aXRoIHNldmVyYWwgZnVu Y3Rpb25zLiAgRm9yY2UgcHVzaGRvd24gYmVjYXVzZSB0aGUKKy0tIGNvc3QgbW9kZWwgb3RoZXJ3 aXNlIHBpY2tzIGEgbG9jYWwgcGxhbi4KK1NFVCBlbmFibGVfaGFzaGpvaW4gPSBvZmY7CitTRVQg ZW5hYmxlX21lcmdlam9pbiA9IG9mZjsKK1NFVCBlbmFibGVfbmVzdGxvb3AgPSBvZmY7CitFWFBM QUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hLCB0Lm4sIHQucworICBGUk9NIHJl bW90ZV90YmwgciwgUk9XUyBGUk9NICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAorICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgQVMgdChuLCBz KQorIFdIRVJFIHIuYSA9IHQubiBPUkRFUiBCWSByLmE7CisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQorIFNvcnQKKyAgIE91dHB1dDogci5hLCB0Lm4sIHQucworICAgU29ydCBLZXk6 IHIuYQorICAgLT4gIEZvcmVpZ24gU2NhbgorICAgICAgICAgT3V0cHV0OiByLmEsIHQubiwgdC5z CisgICAgICAgICBSZWxhdGlvbnM6IChwdWJsaWMucmVtb3RlX3RibCByKSBJTk5FUiBKT0lOIChG dW5jdGlvbiB0KQorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIHIxLmEsIGYyLmMxLCBmMi5j MiBGUk9NIChwdWJsaWMuYmFzZV90YmxfZm4gcjEgSU5ORVIgSk9JTiBST1dTIEZST00gKHVubmVz dCgnezMsNiw5fSc6OmludGVnZXJbXSksIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBmMihjMSwg YzIpIE9OICgoKHIxLmEgPSBmMi5jMSkpKSkKKyg3IHJvd3MpCisKK1NFTEVDVCByLmEsIHQubiwg dC5zCisgIEZST00gcmVtb3RlX3RibCByLCBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5 XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwg MTMpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5uIE9SREVSIEJZIHIuYTsKKyBhIHwgbiB8 IHMgIAorLS0tKy0tLSstLS0tCisgMyB8IDMgfCAxMQorIDYgfCA2IHwgMTIKKyA5IHwgOSB8IDEz CisoMyByb3dzKQorCistLSBXaG9sZS1yb3cgVmFyIG9uIHRoZSBhYnNvcmJlZCBmdW5jdGlvbiBz aWRlIChlLmcuIHZpYSBhIGNhc3QgdG8KKy0tIHRleHQpLiAgRXhlcmNpc2VzIGJvdGggZGVwYXJz ZUNvbHVtblJlZiB3aG9sZS1yb3cgYnJhbmNoIGFuZCB0aGUKKy0tIGdldF90dXBkZXNjX2Zvcl9q b2luX3NjYW5fdHVwbGVzKCkgUlRFX0ZVTkNUSU9OIG1ldGFkYXRhIHBhdGguCitFWFBMQUlOIChW RVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVtb3RlX3Ri bCByLCBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hF UkUgci5hID0gdC5uIE9SREVSIEJZIHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBTb3J0CisgICBP dXRwdXQ6ICgodC4qKTo6dGV4dCksIHIuYQorICAgU29ydCBLZXk6IHIuYQorICAgLT4gIEZvcmVp Z24gU2NhbgorICAgICAgICAgT3V0cHV0OiAodC4qKTo6dGV4dCwgci5hCisgICAgICAgICBSZWxh dGlvbnM6IChwdWJsaWMucmVtb3RlX3RibCByKSBJTk5FUiBKT0lOIChGdW5jdGlvbiB0KQorICAg ICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIENBU0UgV0hFTiAoZjIuKik6OnRleHQgSVMgTk9UIE5V TEwgVEhFTiBST1coZjIuYzEsIGYyLmMyKSBFTkQsIHIxLmEgRlJPTSAocHVibGljLmJhc2VfdGJs X2ZuIHIxIElOTkVSIEpPSU4gUk9XUyBGUk9NICh1bm5lc3QoJ3szLDYsOX0nOjppbnRlZ2VyW10p LCBnZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgZjIoYzEsIGMyKSBPTiAoKChyMS5hID0gZjIuYzEp KSkpCisoNyByb3dzKQorCitTRUxFQ1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVtb3RlX3RibCBy LCBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hFUkUg ci5hID0gdC5uIE9SREVSIEJZIHIuYTsKKyAgIHQgICAgfCBhIAorLS0tLS0tLS0rLS0tCisgKDMs MTEpIHwgMworICg2LDEyKSB8IDYKKyAoOSwxMykgfCA5CisoMyByb3dzKQorCistLSBDaGVjayB3 aG9sZS1yb3cgVmFyIHJlcHJlc2VudGVkIGJ5IGZ1bmN0aW9uIG9uIHRoZSBudWxsYWJsZQorLS0g bGVmdCBqb2luIHNpZGUKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB1LCBm dDUuYzEsIGZ0NS5jMiwgZnQ0LmMxLCBmdDQuYzIgRlJPTSBmdDUgTEVGVCBKT0lOCisoZnQ0IEpP SU4gdW5uZXN0KGFycmF5WzEsMl0sIGFycmF5WzMsNF0pIGFzIHUgKHUxLCB1MikgT04gZnQ0LmMx PXUxKQorT04gZnQ1LmMxID0gZnQ0LmMxIFdIRVJFIGZ0NS5jMSA8IDEwIE9SREVSIEJZIGZ0NS5j MTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLQorIEZvcmVpZ24gU2NhbgorICAgT3V0cHV0OiB1LiosIGZ0NS5jMSwg ZnQ1LmMyLCBmdDQuYzEsIGZ0NC5jMgorICAgUmVsYXRpb25zOiAocHVibGljLmZ0NSkgTEVGVCBK T0lOICgocHVibGljLmZ0NCkgSU5ORVIgSk9JTiAoRnVuY3Rpb24gdSkpCisgICBSZW1vdGUgU1FM OiBTRUxFQ1QgQ0FTRSBXSEVOIChmMy4qKTo6dGV4dCBJUyBOT1QgTlVMTCBUSEVOIFJPVyhmMy5j MSwgZjMuYzIpIEVORCwgcjEuYzEsIHIxLmMyLCByMi5jMSwgcjIuYzIgRlJPTSAoIlMgMSIuIlQg NCIgcjEgTEVGVCBKT0lOICgiUyAxIi4iVCAzIiByMiBJTk5FUiBKT0lOIFJPV1MgRlJPTSAodW5u ZXN0KCd7MSwyfSc6OmludGVnZXJbXSksIHVubmVzdCgnezMsNH0nOjppbnRlZ2VyW10pKSBmMyhj MSwgYzIpIE9OICgoKHIyLmMxID0gZjMuYzEpKSkpIE9OICgoKHIxLmMxID0gcjIuYzEpKSkpIFdI RVJFICgocjEuYzEgPCAxMCkpIE9SREVSIEJZIHIxLmMxIEFTQyBOVUxMUyBMQVNUCisoNCByb3dz KQorCitTRUxFQ1QgdSwgZnQ1LmMxLCBmdDUuYzIsIGZ0NC5jMSwgZnQ0LmMyIEZST00gZnQ1IExF RlQgSk9JTgorKGZ0NCBKT0lOIHVubmVzdChhcnJheVsxLDJdLCBhcnJheVszLDRdKSBhcyB1ICh1 MSwgdTIpIE9OIGZ0NC5jMT11MSkKK09OIGZ0NS5jMSA9IGZ0NC5jMSBXSEVSRSBmdDUuYzEgPCAx MCBPUkRFUiBCWSBmdDUuYzE7CisgdSB8IGMxIHwgYzIgfCBjMSB8IGMyIAorLS0tKy0tLS0rLS0t LSstLS0tKy0tLS0KKyAgIHwgIDMgfCAgNCB8ICAgIHwgICAKKyAgIHwgIDYgfCAgNyB8ICAgIHwg ICAKKyAgIHwgIDkgfCAxMCB8ICAgIHwgICAKKygzIHJvd3MpCisKK1JFU0VUIGVuYWJsZV9oYXNo am9pbjsKK1JFU0VUIGVuYWJsZV9tZXJnZWpvaW47CitSRVNFVCBlbmFibGVfbmVzdGxvb3A7Cist LSBWb2xhdGlsZSBmdW5jdGlvbiBpbiBST1dTIEZST00gZGlzcXVhbGlmaWVzIHRoZSB3aG9sZSBS VEUuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hIEZST00gcmVtb3Rl X3RibCByLAorICAgICAgICAgICAgICAgIFJPV1MgRlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDld KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxLCA0ICsgKHJh bmRvbSgpICogMCk6OmludCkpIEFTIHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm47CisgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVVF UlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIEpvaW4KKyAgIE91dHB1dDog ci5hCisgICBNZXJnZSBDb25kOiAodC5uID0gci5hKQorICAgLT4gIFNvcnQKKyAgICAgICAgIE91 dHB1dDogdC5uCisgICAgICAgICBTb3J0IEtleTogdC5uCisgICAgICAgICAtPiAgRnVuY3Rpb24g U2NhbiBvbiB0CisgICAgICAgICAgICAgICBPdXRwdXQ6IHQubgorICAgICAgICAgICAgICAgRnVu Y3Rpb24gQ2FsbDogdW5uZXN0KCd7Myw2LDl9Jzo6aW50ZWdlcltdKSwgZ2VuZXJhdGVfc2VyaWVz KDEsICg0ICsgKChyYW5kb20oKSAqICcwJzo6ZG91YmxlIHByZWNpc2lvbikpOjppbnRlZ2VyKSkK KyAgIC0+ICBTb3J0CisgICAgICAgICBPdXRwdXQ6IHIuYQorICAgICAgICAgU29ydCBLZXk6IHIu YQorICAgICAgICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMucmVtb3RlX3RibCByCisgICAg ICAgICAgICAgICBPdXRwdXQ6IHIuYQorICAgICAgICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNU IGEgRlJPTSBwdWJsaWMuYmFzZV90YmxfZm4KKygxNSByb3dzKQorCistLSBMQVRFUkFMIGZ1bmN0 aW9uIHJlZmVyZW5jaW5nIGEgZm9yZWlnbiBWYXI6IHBvc3RncmVzX2ZkdydzCistLSBmb3JlaWdu LWpvaW4gcHVzaGRvd24gcmVqZWN0cyB0aGlzIHZpYSB0aGUgam9pbnJlbC0+bGF0ZXJhbF9yZWxp ZHMKKy0tIGNoZWNrOyB0aGUgcGxhbiBpcyB0aGVyZWZvcmUgYSBsb2NhbCBOZXN0TG9vcCArIEZ1 bmN0aW9uU2Nhbi4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCByLmEsIHQu eCBGUk9NIHJlbW90ZV90YmwgciwgTEFURVJBTCB1bm5lc3QoYXJyYXlbci5hXSkgQVMgdCh4KQor V0hFUkUgci5hIDw9IDMgT1JERVIgQlkgci5hOworICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQor IE5lc3RlZCBMb29wCisgICBPdXRwdXQ6IHIuYSwgdC54CisgICAtPiAgRm9yZWlnbiBTY2FuIG9u IHB1YmxpYy5yZW1vdGVfdGJsIHIKKyAgICAgICAgIE91dHB1dDogci5hLCByLmIKKyAgICAgICAg IFJlbW90ZSBTUUw6IFNFTEVDVCBhIEZST00gcHVibGljLmJhc2VfdGJsX2ZuIFdIRVJFICgoYSA8 PSAzKSkgT1JERVIgQlkgYSBBU0MgTlVMTFMgTEFTVAorICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24g cGdfY2F0YWxvZy51bm5lc3QgdAorICAgICAgICAgT3V0cHV0OiB0LngKKyAgICAgICAgIEZ1bmN0 aW9uIENhbGw6IHVubmVzdChBUlJBWVtyLmFdKQorKDggcm93cykKKworLS0gT3V0ZXIgam9pbnMg d2l0aCB0aGUgZnVuY3Rpb24gUlRFIGFyZSBub3QgcHVzaGVkIGRvd24gKG9ubHkgSU5ORVIKKy0t IGpvaW5zIGFyZSBzdXBwb3J0ZWQgYnkgZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKCkpLgorRVhQ TEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSwgdC5uIEZST00gcmVtb3RlX3Ri bCByCisgICAgIExFRlQgSk9JTiB1bm5lc3QoYXJyYXlbMSwgMiwgM10pIEFTIHQobikgT04gci5h ID0gdC5uCisgV0hFUkUgci5hIDw9IDUgT1JERVIgQlkgci5hOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQorIE1lcmdlIExlZnQgSm9pbgorICAgT3V0cHV0OiByLmEsIHQubgorICAgTWVyZ2Ug Q29uZDogKHIuYSA9IHQubikKKyAgIC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLnJlbW90ZV90 YmwgcgorICAgICAgICAgT3V0cHV0OiByLmEsIHIuYgorICAgICAgICAgUmVtb3RlIFNRTDogU0VM RUNUIGEgRlJPTSBwdWJsaWMuYmFzZV90YmxfZm4gV0hFUkUgKChhIDw9IDUpKSBPUkRFUiBCWSBh IEFTQyBOVUxMUyBMQVNUCisgICAtPiAgU29ydAorICAgICAgICAgT3V0cHV0OiB0Lm4KKyAgICAg ICAgIFNvcnQgS2V5OiB0Lm4KKyAgICAgICAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFs b2cudW5uZXN0IHQKKyAgICAgICAgICAgICAgIE91dHB1dDogdC5uCisgICAgICAgICAgICAgICBG dW5jdGlvbiBDYWxsOiB1bm5lc3QoJ3sxLDIsM30nOjppbnRlZ2VyW10pCisoMTIgcm93cykKKwor LS0gU0VNSSBqb2luIChFWElTVFMpIHdpdGggYSBmdW5jdGlvbiBSVEUgaXMgYWxzbyBub3QgcHVz aGVkIGRvd24uCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hIEZST00g cmVtb3RlX3RibCByCisgV0hFUkUgRVhJU1RTIChTRUxFQ1QgMSBGUk9NIHVubmVzdChhcnJheVsz LCA2LCA5XSkgQVMgdChuKSBXSEVSRSB0Lm4gPSByLmEpCisgT1JERVIgQlkgci5hOworICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgTWVyZ2UgU2VtaSBK b2luCisgICBPdXRwdXQ6IHIuYQorICAgTWVyZ2UgQ29uZDogKHIuYSA9IHQubikKKyAgIC0+ICBG b3JlaWduIFNjYW4gb24gcHVibGljLnJlbW90ZV90YmwgcgorICAgICAgICAgT3V0cHV0OiByLmEs IHIuYgorICAgICAgICAgUmVtb3RlIFNRTDogU0VMRUNUIGEgRlJPTSBwdWJsaWMuYmFzZV90Ymxf Zm4gT1JERVIgQlkgYSBBU0MgTlVMTFMgTEFTVAorICAgLT4gIFNvcnQKKyAgICAgICAgIE91dHB1 dDogdC5uCisgICAgICAgICBTb3J0IEtleTogdC5uCisgICAgICAgICAtPiAgRnVuY3Rpb24gU2Nh biBvbiBwZ19jYXRhbG9nLnVubmVzdCB0CisgICAgICAgICAgICAgICBPdXRwdXQ6IHQubgorICAg ICAgICAgICAgICAgRnVuY3Rpb24gQ2FsbDogdW5uZXN0KCd7Myw2LDl9Jzo6aW50ZWdlcltdKQor KDEyIHJvd3MpCisKK0RST1AgRk9SRUlHTiBUQUJMRSByZW1vdGVfdGJsOworRFJPUCBUQUJMRSBi YXNlX3RibF9mbjsKIC0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAtLSBDaGVjayB0aGF0IHVzZXJpZCB0byB1c2Ug d2hlbiBxdWVyeWluZyB0aGUgcmVtb3RlIHRhYmxlIGlzIGNvcnJlY3RseQogLS0gcHJvcGFnYXRl ZCBpbnRvIGZvcmVpZ24gcmVscyBwcmVzZW50IGluIHN1YnF1ZXJpZXMgdW5kZXIgYW4gVU5JT04g QUxMCmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYyBiL2Nv bnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCmluZGV4IDBhNTg5ZjhkYjc0Li45MGQy NGFjNGQ1NiAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMK KysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMKQEAgLTMxLDYgKzMxLDcg QEAKICNpbmNsdWRlICJub2Rlcy9tYWtlZnVuY3MuaCIKICNpbmNsdWRlICJub2Rlcy9ub2RlRnVu Y3MuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvYXBwZW5kaW5mby5oIgorI2luY2x1ZGUgIm9wdGlt aXplci9jbGF1c2VzLmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL2Nvc3QuaCIKICNpbmNsdWRlICJv cHRpbWl6ZXIvaW5oZXJpdC5oIgogI2luY2x1ZGUgIm9wdGltaXplci9vcHRpbWl6ZXIuaCIKQEAg LTg4LDYgKzg5LDIyIEBAIGVudW0gRmR3U2NhblByaXZhdGVJbmRleAogCSAqIG9mIGpvaW4sIGFk ZGVkIHdoZW4gdGhlIHNjYW4gaXMgam9pbgogCSAqLwogCUZkd1NjYW5Qcml2YXRlUmVsYXRpb25z LAorCisJLyoKKwkgKiBMaXN0IG9mIHBlci1SVEUgZnVuY3Rpb24gbWV0YWRhdGEsIGluZGV4ZWQg YnkgYmFzZSBSVEkgb2Zmc2V0LiAgRWFjaAorCSAqIGVsZW1lbnQgaXMgZWl0aGVyIE5VTEwgKGZv ciBub24tUlRFX0ZVTkNUSU9OIHJlbHMgaW4gdGhpcyBzY2FuKSBvciBhCisJICogbGlzdCBvZiB0 aHJlZS1lbGVtZW50IGxpc3RzIChmdW5jaWQsIGZ1bmNyZXR0eXBlLCBmdW5jY29sbGF0aW9uKSAt LSBvbmUKKwkgKiBpbm5lciBsaXN0IHBlciBmdW5jdGlvbiBpbiB0aGUgUlRFLiAgQWxsb3dzIHRo ZSBleGVjdXRvciB0byByZWJ1aWxkCisJICogVHVwbGVEZXNjIGVudHJpZXMgZm9yIHdob2xlLXJv dyByZWZlcmVuY2VzIHRvIGZ1bmN0aW9uIFJURXMuCisJICovCisJRmR3U2NhblByaXZhdGVGdW5j dGlvbnMsCisKKwkvKgorCSAqIEludGVnZXIgbm9kZTogbWluaW11bSBiYXNlIFJUIGluZGV4IGNv dmVyZWQgYnkgdGhlIHNjYW4sIHVzZWQgdG8KKwkgKiB0cmFuc2xhdGUgc2Nhbi1sb2NhbCBpbmRl eGVzIHRvIGVzdGF0ZS1ydGFibGUgaW5kZXhlcyBhZnRlciBzZXRyZWZzLmMKKwkgKiBmbGF0dGVu cyBydGFibGVzLgorCSAqLworCUZkd1NjYW5Qcml2YXRlTWluUlRJbmRleCwKIH07CiAKIC8qCkBA IC0xMjQsNiArMTQxLDExIEBAIGVudW0gRmR3TW9kaWZ5UHJpdmF0ZUluZGV4CiAgKiAyKSBCb29s ZWFuIGZsYWcgc2hvd2luZyBpZiB0aGUgcmVtb3RlIHF1ZXJ5IGhhcyBhIFJFVFVSTklORyBjbGF1 c2UKICAqIDMpIEludGVnZXIgbGlzdCBvZiBhdHRyaWJ1dGUgbnVtYmVycyByZXRyaWV2ZWQgYnkg UkVUVVJOSU5HLCBpZiBhbnkKICAqIDQpIEJvb2xlYW4gZmxhZyBzaG93aW5nIGlmIHdlIHNldCB0 aGUgY29tbWFuZCBlc19wcm9jZXNzZWQKKyAqIDUpIFBlci1SVEUgZnVuY3Rpb24gbWV0YWRhdGEg KG1pcnJvcnMgRmR3U2NhblByaXZhdGVGdW5jdGlvbnM7IGxldHMKKyAqICAgIHRoZSBleGVjdXRv ciByZWJ1aWxkIFR1cGxlRGVzYyBlbnRyaWVzIGZvciB3aG9sZS1yb3cgVmFycyBvdmVyCisgKiAg ICBmdW5jdGlvbiBSVEVzIGFic29yYmVkIGludG8gYSBmb3JlaWduIGpvaW4pCisgKiA2KSBJbnRl Z2VyIG5vZGU6IG1pbmltdW0gYmFzZSBSVCBpbmRleCBvZiB0aGUgc2NhbiAobWlycm9ycworICog ICAgRmR3U2NhblByaXZhdGVNaW5SVEluZGV4KQogICovCiBlbnVtIEZkd0RpcmVjdE1vZGlmeVBy aXZhdGVJbmRleAogewpAQCAtMTM1LDYgKzE1NywxMCBAQCBlbnVtIEZkd0RpcmVjdE1vZGlmeVBy aXZhdGVJbmRleAogCUZkd0RpcmVjdE1vZGlmeVByaXZhdGVSZXRyaWV2ZWRBdHRycywKIAkvKiBz ZXQtcHJvY2Vzc2VkIGZsYWcgKGFzIGEgQm9vbGVhbiBub2RlKSAqLwogCUZkd0RpcmVjdE1vZGlm eVByaXZhdGVTZXRQcm9jZXNzZWQsCisJLyogUGVyLVJURSBmdW5jdGlvbiBtZXRhZGF0YSwgaW5k ZXhlZCBieSBiYXNlIFJUSSBvZmZzZXQgKi8KKwlGZHdEaXJlY3RNb2RpZnlQcml2YXRlRnVuY3Rp b25zLAorCS8qIEludGVnZXIgbm9kZTogbWluaW11bSBiYXNlIFJUIGluZGV4IGluIHRoZSBzY2Fu ICovCisJRmR3RGlyZWN0TW9kaWZ5UHJpdmF0ZU1pblJUSW5kZXgsCiB9OwogCiAvKgpAQCAtNzQx LDYgKzc2Nyw5IEBAIHN0YXRpYyBib29sIGZvcmVpZ25fZ3JvdXBpbmdfb2soUGxhbm5lckluZm8g KnJvb3QsIFJlbE9wdEluZm8gKmdyb3VwZWRfcmVsLAogc3RhdGljIExpc3QgKmdldF91c2VmdWxf cGF0aGtleXNfZm9yX3JlbGF0aW9uKFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJCQkgIFJl bE9wdEluZm8gKnJlbCk7CiBzdGF0aWMgTGlzdCAqZ2V0X3VzZWZ1bF9lY3NfZm9yX3JlbGF0aW9u KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOworc3RhdGljIFJlbGlkcyBnZXRf YmFzZV9yZWxpZHMoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7CitzdGF0aWMg aW50CWdldF9taW5fYmFzZV9ydGkoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCk7 CitzdGF0aWMgTGlzdCAqZ2V0X2Z1bmN0aW9uc19kYXRhKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpyZWwpOwogc3RhdGljIHZvaWQgYWRkX3BhdGhzX3dpdGhfcGF0aGtleXNfZm9yX3Jl bChQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAogCQkJCQkJCQkJCQlQYXRoICpl cHFfcGF0aCwgTGlzdCAqcmVzdHJpY3RsaXN0KTsKIHN0YXRpYyB2b2lkIGFkZF9mb3JlaWduX2dy b3VwaW5nX3BhdGhzKFBsYW5uZXJJbmZvICpyb290LApAQCAtMTYzNSw5ICsxNjY0LDI2IEBAIHBv c3RncmVzR2V0Rm9yZWlnblBsYW4oUGxhbm5lckluZm8gKnJvb3QsCiAJZmR3X3ByaXZhdGUgPSBs aXN0X21ha2UzKG1ha2VTdHJpbmcoc3FsLmRhdGEpLAogCQkJCQkJCSByZXRyaWV2ZWRfYXR0cnMs CiAJCQkJCQkJIG1ha2VJbnRlZ2VyKGZwaW5mby0+ZmV0Y2hfc2l6ZSkpOworCisJLyoKKwkgKiBQ b3NpdGlvbiBGZHdTY2FuUHJpdmF0ZVJlbGF0aW9uczogZWl0aGVyIHRoZSBFWFBMQUlOIHJlbGF0 aW9uIHN0cmluZworCSAqIChqb2lucy91cHBlciByZWxzKSBvciBhIE5VTEwgcGxhY2Vob2xkZXIs IHNvIHRoYXQgc3Vic2VxdWVudCBpbmRleGVzCisJICogc3RheSB2YWxpZCBmb3IgdGhlIGJhc2Ut cmVsIHNjYW4gY2FzZS4KKwkgKi8KIAlpZiAoSVNfSk9JTl9SRUwoZm9yZWlnbnJlbCkgfHwgSVNf VVBQRVJfUkVMKGZvcmVpZ25yZWwpKQogCQlmZHdfcHJpdmF0ZSA9IGxhcHBlbmQoZmR3X3ByaXZh dGUsCiAJCQkJCQkJICBtYWtlU3RyaW5nKGZwaW5mby0+cmVsYXRpb25fbmFtZSkpOworCWVsc2UK KwkJZmR3X3ByaXZhdGUgPSBsYXBwZW5kKGZkd19wcml2YXRlLCBOVUxMKTsKKworCS8qCisJICog RmR3U2NhblByaXZhdGVGdW5jdGlvbnMgLyBGZHdTY2FuUHJpdmF0ZU1pblJUSW5kZXggY2Fycnkg dGhlIG1ldGFkYXRhCisJICogdGhlIGV4ZWN1dG9yIG5lZWRzIHRvIHJlYnVpbGQgVHVwbGVEZXNj IGVudHJpZXMgZm9yIHdob2xlLXJvdyBWYXJzCisJICogcG9pbnRpbmcgYXQgUlRFX0ZVTkNUSU9O IHJlbHMgYWJzb3JiZWQgaW50byB0aGUgZm9yZWlnbiBzY2FuLgorCSAqLworCWZkd19wcml2YXRl ID0gbGFwcGVuZChmZHdfcHJpdmF0ZSwgZ2V0X2Z1bmN0aW9uc19kYXRhKHJvb3QsIGZvcmVpZ25y ZWwpKTsKKwlmZHdfcHJpdmF0ZSA9IGxhcHBlbmQoZmR3X3ByaXZhdGUsCisJCQkJCQkgIG1ha2VJ bnRlZ2VyKGdldF9taW5fYmFzZV9ydGkocm9vdCwgZm9yZWlnbnJlbCkpKTsKIAogCS8qCiAJICog Q3JlYXRlIHRoZSBGb3JlaWduU2NhbiBub2RlIGZvciB0aGUgZ2l2ZW4gcmVsYXRpb24uCkBAIC0x NjU4LDkgKzE3MDQsMTUgQEAgcG9zdGdyZXNHZXRGb3JlaWduUGxhbihQbGFubmVySW5mbyAqcm9v dCwKIAogLyoKICAqIENvbnN0cnVjdCBhIHR1cGxlIGRlc2NyaXB0b3IgZm9yIHRoZSBzY2FuIHR1 cGxlcyBoYW5kbGVkIGJ5IGEgZm9yZWlnbiBqb2luLgorICoKKyAqICdydGZ1bmNkYXRhJyBpcyB0 aGUgRmR3U2NhblByaXZhdGVGdW5jdGlvbnMgbGlzdCBzYXZlZCBhdCBwbGFuIHRpbWUsIGFuZAor ICogJ3J0b2Zmc2V0JyBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBleGVjdXRvcidzIFJU IGluZGV4ZXMgYW5kIHRoZQorICogc2Nhbi1sb2NhbCBSVCBpbmRleGVzIGNhcHR1cmVkIGluIHRo YXQgbGlzdC4gIEJvdGggbWF5IGJlIDAvTklMIHdoZW4gdGhlCisgKiBzY2FuIGhhcyBubyBSVEVf RlVOQ1RJT04gZGVwZW5kZW50cy4KICAqLwogc3RhdGljIFR1cGxlRGVzYwotZ2V0X3R1cGRlc2Nf Zm9yX2pvaW5fc2Nhbl90dXBsZXMoRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSkKK2dldF90dXBkZXNj X2Zvcl9qb2luX3NjYW5fdHVwbGVzKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsCisJCQkJCQkJCSBM aXN0ICpydGZ1bmNkYXRhLCBpbnQgcnRvZmZzZXQpCiB7CiAJRm9yZWlnblNjYW4gKmZzcGxhbiA9 IChGb3JlaWduU2NhbiAqKSBub2RlLT5zcy5wcy5wbGFuOwogCUVTdGF0ZQkgICAqZXN0YXRlID0g bm9kZS0+c3MucHMuc3RhdGU7CkBAIC0xNjk2LDEzICsxNzQ4LDY4IEBAIGdldF90dXBkZXNjX2Zv cl9qb2luX3NjYW5fdHVwbGVzKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUpCiAJCWlmICghSXNBKHZh ciwgVmFyKSB8fCB2YXItPnZhcmF0dG5vICE9IDApCiAJCQljb250aW51ZTsKIAkJcnRlID0gbGlz dF9udGgoZXN0YXRlLT5lc19yYW5nZV90YWJsZSwgdmFyLT52YXJubyAtIDEpOwotCQlpZiAocnRl LT5ydGVraW5kICE9IFJURV9SRUxBVElPTikKLQkJCWNvbnRpbnVlOwotCQlyZWx0eXBlID0gZ2V0 X3JlbF90eXBlX2lkKHJ0ZS0+cmVsaWQpOwotCQlpZiAoIU9pZElzVmFsaWQocmVsdHlwZSkpCi0J CQljb250aW51ZTsKLQkJYXR0LT5hdHR0eXBpZCA9IHJlbHR5cGU7Ci0JCS8qIHNob3VsZG4ndCBu ZWVkIHRvIGNoYW5nZSBhbnl0aGluZyBlbHNlICovCisKKwkJaWYgKHJ0ZS0+cnRla2luZCA9PSBS VEVfUkVMQVRJT04pCisJCXsKKwkJCXJlbHR5cGUgPSBnZXRfcmVsX3R5cGVfaWQocnRlLT5yZWxp ZCk7CisJCQlpZiAoIU9pZElzVmFsaWQocmVsdHlwZSkpCisJCQkJY29udGludWU7CisJCQlhdHQt PmF0dHR5cGlkID0gcmVsdHlwZTsKKwkJCS8qIHNob3VsZG4ndCBuZWVkIHRvIGNoYW5nZSBhbnl0 aGluZyBlbHNlICovCisJCX0KKwkJZWxzZSBpZiAocnRlLT5ydGVraW5kID09IFJURV9GVU5DVElP TikKKwkJeworCQkJLyoKKwkJCSAqIEEgd2hvbGUtcm93IFZhciBwb2ludHMgYXQgYSBGVU5DVElP TiBSVEUgYWJzb3JiZWQgaW50byB0aGUKKwkJCSAqIGZvcmVpZ24gam9pbi4gIFN5bnRoZXNpemUg YW4gYW5vbnltb3VzIGNvbXBvc2l0ZSBUdXBsZURlc2MgZnJvbQorCQkJICogdGhlIHBlci1mdW5j dGlvbiByZXR1cm4tdHlwZSBtZXRhZGF0YSB3ZSBzYXZlZCBhdCBwbGFuIHRpbWU7CisJCQkgKiB0 aGUgZGVwYXJzZXIgZW1pdHMgdGhlc2UgYXMgUk9XKGY8cnRpPi5jMSwgZjxydGk+LmMyLCAuLi4p LgorCQkJICoKKwkJCSAqIEZvciBhbiB1cHBlcnJlbCBzY2FuICh0aGUgb25seSBwYXRoIHRoYXQg cmVhY2hlcyBoZXJlKQorCQkJICogcG9zdGdyZXNHZXRGb3JlaWduUGxhbiBhbHdheXMgYnVpbGRz IHJ0ZnVuY2RhdGEgdmlhCisJCQkgKiBnZXRfZnVuY3Rpb25zX2RhdGEoKSwgc28gaXQgaXMgbmV2 ZXIgTklMOyB0aGUgcGVyLVJURSBzbG90IGZvcgorCQkJICogdGhlIGZ1bmN0aW9uIFJURSByZWZl cmVuY2VkIGJ5IHRoaXMgVmFyIG11c3QgbGlrZXdpc2UgYmUKKwkJCSAqIHBvcHVsYXRlZC4KKwkJ CSAqLworCQkJTGlzdAkgICAqZnVuY2RhdGE7CisJCQlUdXBsZURlc2MJcnRlX3R1cGRlc2M7CisJ CQlpbnQJCQludW1fZnVuY3M7CisJCQlpbnQJCQlhdHRudW07CisJCQlMaXN0Q2VsbCAgICpsYzEs CisJCQkJCSAgICpsYzI7CisKKwkJCUFzc2VydChydGZ1bmNkYXRhICE9IE5JTCk7CisJCQlmdW5j ZGF0YSA9IGxpc3RfbnRoKHJ0ZnVuY2RhdGEsIHZhci0+dmFybm8gLSBydG9mZnNldCk7CisJCQlB c3NlcnQoZnVuY2RhdGEgIT0gTklMKTsKKwkJCW51bV9mdW5jcyA9IGxpc3RfbGVuZ3RoKGZ1bmNk YXRhKTsKKwkJCUFzc2VydChudW1fZnVuY3MgPT0gbGlzdF9sZW5ndGgocnRlLT5lcmVmLT5jb2xu YW1lcykpOworCQkJcnRlX3R1cGRlc2MgPSBDcmVhdGVUZW1wbGF0ZVR1cGxlRGVzYyhudW1fZnVu Y3MpOworCisJCQlhdHRudW0gPSAxOworCQkJZm9yYm90aChsYzEsIGZ1bmNkYXRhLCBsYzIsIHJ0 ZS0+ZXJlZi0+Y29sbmFtZXMpCisJCQl7CisJCQkJTGlzdAkgICAqZmRhdGEgPSBsZmlyc3Rfbm9k ZShMaXN0LCBsYzEpOworCQkJCWNoYXIJICAgKmNvbG5hbWUgPSBzdHJWYWwobGZpcnN0KGxjMikp OworCQkJCU9pZAkJCWZ1bmNyZXR0eXBlOworCQkJCU9pZAkJCWZ1bmNjb2xsYXRpb247CisKKwkJ CQlmdW5jcmV0dHlwZSA9IGxzZWNvbmRfbm9kZShJbnRlZ2VyLCBmZGF0YSktPml2YWw7CisJCQkJ ZnVuY2NvbGxhdGlvbiA9IGx0aGlyZF9ub2RlKEludGVnZXIsIGZkYXRhKS0+aXZhbDsKKworCQkJ CWlmICghT2lkSXNWYWxpZChmdW5jcmV0dHlwZSkgfHwgZnVuY3JldHR5cGUgPT0gUkVDT1JET0lE KQorCQkJCQllbG9nKEVSUk9SLAorCQkJCQkJICJjb3VsZCBub3QgZGV0ZXJtaW5lIHJldHVybiB0 eXBlIGZvciBmdW5jdGlvbiBpbiBmb3JlaWduIHNjYW4iKTsKKworCQkJCVR1cGxlRGVzY0luaXRF bnRyeShydGVfdHVwZGVzYywgKEF0dHJOdW1iZXIpIGF0dG51bSwgY29sbmFtZSwKKwkJCQkJCQkJ ICAgZnVuY3JldHR5cGUsIC0xLCAwKTsKKwkJCQlUdXBsZURlc2NJbml0RW50cnlDb2xsYXRpb24o cnRlX3R1cGRlc2MsIChBdHRyTnVtYmVyKSBhdHRudW0sCisJCQkJCQkJCQkJCWZ1bmNjb2xsYXRp b24pOworCQkJCWF0dG51bSsrOworCQkJfQorCisJCQlhc3NpZ25fcmVjb3JkX3R5cGVfdHlwbW9k KHJ0ZV90dXBkZXNjKTsKKwkJCWF0dC0+YXR0dHlwbW9kID0gcnRlX3R1cGRlc2MtPnRkdHlwbW9k OworCQl9CiAJfQogCXJldHVybiB0dXBkZXNjOwogfQpAQCAtMTczOCwxNCArMTg0NSwzMCBAQCBw b3N0Z3Jlc0JlZ2luRm9yZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSwgaW50IGVmbGFn cykKIAogCS8qCiAJICogSWRlbnRpZnkgd2hpY2ggdXNlciB0byBkbyB0aGUgcmVtb3RlIGFjY2Vz cyBhcy4gIFRoaXMgc2hvdWxkIG1hdGNoIHdoYXQKLQkgKiBFeGVjQ2hlY2tQZXJtaXNzaW9ucygp IGRvZXMuCisJICogRXhlY0NoZWNrUGVybWlzc2lvbnMoKSBkb2VzLiAgRm9yIGEgam9pbiwgc2Nh biB0aGUgYmFzZSByZWxpZHMgdW50aWwgd2UKKwkgKiBmaW5kIGFuIFJURV9SRUxBVElPTiAodGhl IGZvcmVpZ24tdGFibGUgc2lkZSk7IGlnbm9yZSBhbnkgUlRFX0ZVTkNUSU9OCisJICogYWJzb3Ji ZWQgaW50byB0aGUgam9pbiwgd2hpY2ggY29udHJpYnV0ZXMgbm8gcmVsYXRpb24gT0lEIHRvIGxv b2sgdXAuCiAJICovCiAJdXNlcmlkID0gT2lkSXNWYWxpZChmc3BsYW4tPmNoZWNrQXNVc2VyKSA/ IGZzcGxhbi0+Y2hlY2tBc1VzZXIgOiBHZXRVc2VySWQoKTsKKwlydGUgPSBOVUxMOwogCWlmIChm c3BsYW4tPnNjYW4uc2NhbnJlbGlkID4gMCkKKwl7CiAJCXJ0aW5kZXggPSBmc3BsYW4tPnNjYW4u c2NhbnJlbGlkOworCQlydGUgPSBleGVjX3J0X2ZldGNoKHJ0aW5kZXgsIGVzdGF0ZSk7CisJfQog CWVsc2UKLQkJcnRpbmRleCA9IGJtc19uZXh0X21lbWJlcihmc3BsYW4tPmZzX2Jhc2VfcmVsaWRz LCAtMSk7Ci0JcnRlID0gZXhlY19ydF9mZXRjaChydGluZGV4LCBlc3RhdGUpOworCXsKKwkJcnRp bmRleCA9IC0xOworCQl3aGlsZSAoKHJ0aW5kZXggPSBibXNfbmV4dF9tZW1iZXIoZnNwbGFuLT5m c19iYXNlX3JlbGlkcywgcnRpbmRleCkpID49IDApCisJCXsKKwkJCXJ0ZSA9IGV4ZWNfcnRfZmV0 Y2gocnRpbmRleCwgZXN0YXRlKTsKKwkJCWlmIChydGUgIT0gTlVMTCAmJiBydGUtPnJ0ZWtpbmQg PT0gUlRFX1JFTEFUSU9OKQorCQkJCWJyZWFrOworCQkJcnRlID0gTlVMTDsKKwkJfQorCQlpZiAo cnRlID09IE5VTEwpCisJCQllbG9nKEVSUk9SLCAiY291bGQgbm90IGxvY2F0ZSBhIGZvcmVpZ24g cmVsYXRpb24gUlRFIGluIGZvcmVpZ24gc2NhbiIpOworCX0KIAogCS8qIEdldCBpbmZvIGFib3V0 IGZvcmVpZ24gdGFibGUuICovCiAJdGFibGUgPSBHZXRGb3JlaWduVGFibGUocnRlLT5yZWxpZCk7 CkBAIC0xNzg4LDggKzE5MTEsMTkgQEAgcG9zdGdyZXNCZWdpbkZvcmVpZ25TY2FuKEZvcmVpZ25T Y2FuU3RhdGUgKm5vZGUsIGludCBlZmxhZ3MpCiAJfQogCWVsc2UKIAl7CisJCUxpc3QJICAgKnJ0 ZnVuY2RhdGEgPSAoTGlzdCAqKSBsaXN0X250aChmc3BsYW4tPmZkd19wcml2YXRlLAorCQkJCQkJ CQkJCQkJICAgRmR3U2NhblByaXZhdGVGdW5jdGlvbnMpOworCQlpbnQJCQltaW5fYmFzZV9ydGkg PSBpbnRWYWwobGlzdF9udGgoZnNwbGFuLT5mZHdfcHJpdmF0ZSwKKwkJCQkJCQkJCQkJCSAgIEZk d1NjYW5Qcml2YXRlTWluUlRJbmRleCkpOworCQlpbnQJCQlydG9mZnNldCA9IGJtc19uZXh0X21l bWJlcihmc3BsYW4tPmZzX2Jhc2VfcmVsaWRzLCAtMSkgLQorCQkJbWluX2Jhc2VfcnRpOworCisJ CUFzc2VydChtaW5fYmFzZV9ydGkgPiAwKTsKKwkJQXNzZXJ0KHJ0b2Zmc2V0ID49IDApOworCiAJ CWZzc3RhdGUtPnJlbCA9IE5VTEw7Ci0JCWZzc3RhdGUtPnR1cGRlc2MgPSBnZXRfdHVwZGVzY19m b3Jfam9pbl9zY2FuX3R1cGxlcyhub2RlKTsKKwkJZnNzdGF0ZS0+dHVwZGVzYyA9IGdldF90dXBk ZXNjX2Zvcl9qb2luX3NjYW5fdHVwbGVzKG5vZGUsIHJ0ZnVuY2RhdGEsCisJCQkJCQkJCQkJCQkJ CQlydG9mZnNldCk7CiAJfQogCiAJZnNzdGF0ZS0+YXR0aW5tZXRhID0gVHVwbGVEZXNjR2V0QXR0 SW5NZXRhZGF0YShmc3N0YXRlLT50dXBkZXNjKTsKQEAgLTI4MjksNiArMjk2MywxMCBAQCBwb3N0 Z3Jlc1BsYW5EaXJlY3RNb2RpZnkoUGxhbm5lckluZm8gKnJvb3QsCiAJCQkJCQkJCQltYWtlQm9v bGVhbigocmV0cmlldmVkX2F0dHJzICE9IE5JTCkpLAogCQkJCQkJCQkJcmV0cmlldmVkX2F0dHJz LAogCQkJCQkJCQkJbWFrZUJvb2xlYW4ocGxhbi0+Y2FuU2V0VGFnKSk7CisJZnNjYW4tPmZkd19w cml2YXRlID0gbGFwcGVuZChmc2Nhbi0+ZmR3X3ByaXZhdGUsCisJCQkJCQkJCSBnZXRfZnVuY3Rp b25zX2RhdGEocm9vdCwgZm9yZWlnbnJlbCkpOworCWZzY2FuLT5mZHdfcHJpdmF0ZSA9IGxhcHBl bmQoZnNjYW4tPmZkd19wcml2YXRlLAorCQkJCQkJCQkgbWFrZUludGVnZXIoZ2V0X21pbl9iYXNl X3J0aShyb290LCBmb3JlaWducmVsKSkpOwogCiAJLyoKIAkgKiBVcGRhdGUgdGhlIGZvcmVpZ24t am9pbi1yZWxhdGVkIGZpZWxkcy4KQEAgLTI5NDIsNyArMzA4MCwyNiBAQCBwb3N0Z3Jlc0JlZ2lu RGlyZWN0TW9kaWZ5KEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsIGludCBlZmxhZ3MpCiAJCVR1cGxl RGVzYwl0dXBkZXNjOwogCiAJCWlmIChmc3BsYW4tPnNjYW4uc2NhbnJlbGlkID09IDApCi0JCQl0 dXBkZXNjID0gZ2V0X3R1cGRlc2NfZm9yX2pvaW5fc2Nhbl90dXBsZXMobm9kZSk7CisJCXsKKwkJ CS8qCisJCQkgKiBEaXJlY3RNb2RpZnkgb24gYSBmb3JlaWduIGpvaW46IHVzZSB0aGUgcGVyLVJU RSBmdW5jdGlvbgorCQkJICogbWV0YWRhdGEgc2F2ZWQgYXQgcGxhbiB0aW1lIHNvIGEgd2hvbGUt cm93IFZhciBwb2ludGluZyBhdCBhCisJCQkgKiBmdW5jdGlvbiBSVEUgYWJzb3JiZWQgaW50byB0 aGUgam9pbiBjYW4gYmUgcmVidWlsdCBpbnRvIGEKKwkJCSAqIHVzYWJsZSBUdXBsZURlc2MgKGUu Zy4gUkVUVVJOSU5HIHQgZm9yIGEgam9pbiB3aXRoIFVOTkVTVCguLi4sCisJCQkgKiAuLi4pIEFT IHQoYngsIGkpKS4KKwkJCSAqLworCQkJTGlzdAkgICAqcnRmdW5jZGF0YSA9IChMaXN0ICopIGxp c3RfbnRoKGZzcGxhbi0+ZmR3X3ByaXZhdGUsCisJCQkJCQkJCQkJCQkJICAgRmR3RGlyZWN0TW9k aWZ5UHJpdmF0ZUZ1bmN0aW9ucyk7CisJCQlpbnQJCQltaW5fYmFzZV9ydGkgPSBpbnRWYWwobGlz dF9udGgoZnNwbGFuLT5mZHdfcHJpdmF0ZSwKKwkJCQkJCQkJCQkJCQkgICBGZHdEaXJlY3RNb2Rp ZnlQcml2YXRlTWluUlRJbmRleCkpOworCQkJaW50CQkJcnRvZmZzZXQgPSBibXNfbmV4dF9tZW1i ZXIoZnNwbGFuLT5mc19iYXNlX3JlbGlkcywgLTEpIC0KKwkJCQltaW5fYmFzZV9ydGk7CisKKwkJ CUFzc2VydChtaW5fYmFzZV9ydGkgPiAwKTsKKwkJCUFzc2VydChydG9mZnNldCA+PSAwKTsKKwor CQkJdHVwZGVzYyA9IGdldF90dXBkZXNjX2Zvcl9qb2luX3NjYW5fdHVwbGVzKG5vZGUsIHJ0ZnVu Y2RhdGEsIHJ0b2Zmc2V0KTsKKwkJfQogCQllbHNlCiAJCQl0dXBkZXNjID0gUmVsYXRpb25HZXRE ZXNjcihkbXN0YXRlLT5yZWwpOwogCkBAIC0zMDU1LDcgKzMyMTIsOCBAQCBwb3N0Z3Jlc0V4cGxh aW5Gb3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpub2RlLCBFeHBsYWluU3RhdGUgKmVzKQog CSAqIFdlIGRvIHRoYXQgaGVyZSwgbm90IHdoZW4gdGhlIHBsYW4gaXMgY3JlYXRlZCwgYmVjYXVz ZSB3ZSBjYW4ndCBrbm93CiAJICogd2hhdCBhbGlhc2VzIHJ1bGV1dGlscy5jIHdpbGwgYXNzaWdu IGF0IHBsYW4gY3JlYXRpb24gdGltZS4KIAkgKi8KLQlpZiAobGlzdF9sZW5ndGgoZmR3X3ByaXZh dGUpID4gRmR3U2NhblByaXZhdGVSZWxhdGlvbnMpCisJaWYgKGxpc3RfbGVuZ3RoKGZkd19wcml2 YXRlKSA+IEZkd1NjYW5Qcml2YXRlUmVsYXRpb25zICYmCisJCWxpc3RfbnRoKGZkd19wcml2YXRl LCBGZHdTY2FuUHJpdmF0ZVJlbGF0aW9ucykgIT0gTlVMTCkKIAl7CiAJCVN0cmluZ0luZm9EYXRh IHJlbGF0aW9uczsKIAkJY2hhcgkgICAqcmF3cmVsYXRpb25zOwpAQCAtMzEwNSw2ICszMjYzLDIy IEBAIHBvc3RncmVzRXhwbGFpbkZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsIEV4 cGxhaW5TdGF0ZSAqZXMpCiAJCQkJcnRpICs9IHJ0b2Zmc2V0OwogCQkJCUFzc2VydChibXNfaXNf bWVtYmVyKHJ0aSwgcGxhbi0+ZnNfYmFzZV9yZWxpZHMpKTsKIAkJCQlydGUgPSBydF9mZXRjaChy dGksIGVzLT5ydGFibGUpOworCisJCQkJLyoKKwkJCQkgKiBJZiBhIGZ1bmN0aW9uIFJURSB3YXMg YWJzb3JiZWQgaW50byB0aGUgZm9yZWlnbiBqb2luLAorCQkJCSAqIHJlbmRlciBpdCBhcyAiRnVu Y3Rpb24gPGFsaWFzPiIgc2luY2Ugd2UgaGF2ZSBubyBmb3JlaWduCisJCQkJICogcmVsaWQuCisJ CQkJICovCisJCQkJaWYgKHJ0ZS0+cnRla2luZCA9PSBSVEVfRlVOQ1RJT04pCisJCQkJeworCQkJ CQlyZWZuYW1lID0gKGNoYXIgKikgbGlzdF9udGgoZXMtPnJ0YWJsZV9uYW1lcywgcnRpIC0gMSk7 CisJCQkJCWlmIChyZWZuYW1lID09IE5VTEwpCisJCQkJCQlyZWZuYW1lID0gcnRlLT5lcmVmLT5h bGlhc25hbWU7CisJCQkJCWFwcGVuZFN0cmluZ0luZm8oJnJlbGF0aW9ucywgIkZ1bmN0aW9uICVz IiwKKwkJCQkJCQkJCSBxdW90ZV9pZGVudGlmaWVyKHJlZm5hbWUpKTsKKwkJCQkJY29udGludWU7 CisJCQkJfQorCiAJCQkJQXNzZXJ0KHJ0ZS0+cnRla2luZCA9PSBSVEVfUkVMQVRJT04pOwogCQkJ CS8qIFRoaXMgbG9naWMgc2hvdWxkIGFncmVlIHdpdGggZXhwbGFpbi5jJ3MgRXhwbGFpblRhcmdl dFJlbCAqLwogCQkJCXJlbG5hbWUgPSBnZXRfcmVsX25hbWUocnRlLT5yZWxpZCk7CkBAIC0zNDgw LDggKzM2NTQsMTcgQEAgZXN0aW1hdGVfcGF0aF9jb3N0X3NpemUoUGxhbm5lckluZm8gKnJvb3Qs CiAJCQkvKiBGb3Igam9pbiB3ZSBleHBlY3QgaW5uZXIgYW5kIG91dGVyIHJlbGF0aW9ucyBzZXQg Ki8KIAkJCUFzc2VydChmcGluZm8tPmlubmVycmVsICYmIGZwaW5mby0+b3V0ZXJyZWwpOwogCi0J CQlmcGluZm9faSA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmcGluZm8tPmlubmVycmVsLT5mZHdf cHJpdmF0ZTsKLQkJCWZwaW5mb19vID0gKFBnRmR3UmVsYXRpb25JbmZvICopIGZwaW5mby0+b3V0 ZXJyZWwtPmZkd19wcml2YXRlOworCQkJLyoKKwkJCSAqIEZvciBhIEZVTkNUSU9OIFJURSBhYnNv cmJlZCBpbnRvIHRoZSBqb2luLCB1c2UgdGhlIHN0dWIgZnBpbmZvCisJCQkgKiB3ZSBidWlsdCBp biBmb3JlaWduX2pvaW5fb2soKSwgc2luY2UgdGhlIGZ1bmN0aW9uIHJlbCBpdHNlbGYKKwkJCSAq IGhhcyBubyBmZHdfcHJpdmF0ZS4KKwkJCSAqLworCQkJZnBpbmZvX2kgPSBmcGluZm8tPmlubmVy X2Z1bmNfZnBpbmZvID8KKwkJCQlmcGluZm8tPmlubmVyX2Z1bmNfZnBpbmZvIDoKKwkJCQkoUGdG ZHdSZWxhdGlvbkluZm8gKikgZnBpbmZvLT5pbm5lcnJlbC0+ZmR3X3ByaXZhdGU7CisJCQlmcGlu Zm9fbyA9IGZwaW5mby0+b3V0ZXJfZnVuY19mcGluZm8gPworCQkJCWZwaW5mby0+b3V0ZXJfZnVu Y19mcGluZm8gOgorCQkJCShQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmcGluZm8tPm91dGVycmVsLT5m ZHdfcHJpdmF0ZTsKIAogCQkJLyogRXN0aW1hdGUgb2YgbnVtYmVyIG9mIHJvd3MgaW4gY3Jvc3Mg cHJvZHVjdCAqLwogCQkJbnJvd3MgPSBmcGluZm9faS0+cm93cyAqIGZwaW5mb19vLT5yb3dzOwpA QCAtNjYzOSw2ICs2ODIyLDE4MSBAQCBzZW1pam9pbl90YXJnZXRfb2soUGxhbm5lckluZm8gKnJv b3QsIFJlbE9wdEluZm8gKmpvaW5yZWwsIFJlbE9wdEluZm8gKm91dGVycmVsLAogCXJldHVybiBv azsKIH0KIAorLyoKKyAqIGdldF9iYXNlX3JlbGlkcworICoJCVJldHVybiB0aGUgc2V0IG9mIGJh c2UgcmVsaWRzIHJlZmVyZW5jZWQgYnkgYSBmb3JlaWduIHNjYW4gcmVsLgorICoKKyAqIEZvciBh biB1cHBlciByZWwgd2UgdXNlIHRoZSBhbGwtcXVlcnkgcmVsaWRzIG1pbnVzIHRoZSBvdXRlciBq b2luczsKKyAqIG90aGVyd2lzZSB0aGUgcmVsJ3Mgb3duIHJlbGlkcyBtaW51cyB0aGUgb3V0ZXIg am9pbnMuICBUaGUgcmVzdWx0IG1hdGNoZXMKKyAqIHRoZSByZWxpZHMgdGhhdCBjcmVhdGVfZm9y ZWlnbnNjYW5fcGxhbigpIHVsdGltYXRlbHkgdXNlcyBmb3IKKyAqIEZvcmVpZ25TY2FuLmZzX2Jh c2VfcmVsaWRzLCBzbyBpdCBpcyBzdWl0YWJsZSBmb3IgYW55IHRhZ2dpbmcgd2Ugd2FudCB0bwor ICogc3RvcmUgdmlhIHBsYW4tcHJpdmF0ZSBzdGF0ZS4KKyAqLworc3RhdGljIFJlbGlkcworZ2V0 X2Jhc2VfcmVsaWRzKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpCit7CisJUmVs aWRzCQlyZWxpZHM7CisKKwlpZiAocmVsLT5yZWxvcHRraW5kID09IFJFTE9QVF9VUFBFUl9SRUwp CisJCXJlbGlkcyA9IHJvb3QtPmFsbF9xdWVyeV9yZWxzOworCWVsc2UKKwkJcmVsaWRzID0gcmVs LT5yZWxpZHM7CisKKwlyZXR1cm4gYm1zX2RpZmZlcmVuY2UocmVsaWRzLCByb290LT5vdXRlcl9q b2luX3JlbHMpOworfQorCisvKgorICogZ2V0X21pbl9iYXNlX3J0aQorICoJCUxvd2VzdCBiYXNl IFJUIGluZGV4IGluIHRoZSBmb3JlaWduIHNjYW4gcmVsLgorICoKKyAqIEFmdGVyIHNldHJlZnMu YyBmbGF0dGVucyB0aGUgcnRhYmxlLCB0aGUgc2Nhbi1sb2NhbCBpbmRleGVzIHNhdmVkIGluCisg KiBwbGFuLXByaXZhdGUgZGF0YSBjYW4gYmUgdHJhbnNsYXRlZCB0byBlc3RhdGUgaW5kZXhlcyBi eSBhZGRpbmcKKyAqIChGb3JlaWduU2Nhbi5mc19iYXNlX3JlbGlkcyBtaW4gLSB0aGlzIHZhbHVl KS4gIENhcHR1cmVkIGF0IHBsYW4gdGltZQorICogYmVjYXVzZSBjcmVhdGVfZm9yZWlnbnNjYW5f cGxhbigpIGNvbXB1dGVzIHRoZSBzYW1lIHZhbHVlIGludGVybmFsbHkuCisgKi8KK3N0YXRpYyBp bnQKK2dldF9taW5fYmFzZV9ydGkoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCkK K3sKKwlSZWxpZHMJCXJlbGlkcyA9IGdldF9iYXNlX3JlbGlkcyhyb290LCByZWwpOworCisJcmV0 dXJuIGJtc19uZXh0X21lbWJlcihyZWxpZHMsIC0xKTsKK30KKworLyoKKyAqIGdldF9mdW5jdGlv bnNfZGF0YQorICoJCUJ1aWxkIHRoZSBwZXItUlRFIGZ1bmN0aW9uIG1ldGFkYXRhIGxpc3Qgc2F2 ZWQgYXMKKyAqCQlGZHdTY2FuUHJpdmF0ZUZ1bmN0aW9ucy4KKyAqCisgKiBUaGUgcmVzdWx0IGxp c3QgaXMgaW5kZXhlZCBieSBiYXNlIFJUIGluZGV4IHJlbGF0aXZlIHRvIHRoZSBsb3dlc3QgYmFz ZQorICogUlQgaW5kZXggb2YgdGhlIHNjYW4uICBFYWNoIGVsZW1lbnQgaXMgZWl0aGVyIE5VTEwg KGZvciBub24tUlRFX0ZVTkNUSU9OCisgKiBiYXNlIHJlbHMgaW4gdGhpcyBzY2FuKSBvciBhIExp c3Qgb2YgTGlzdCBvZiB0aHJlZSBJbnRlZ2VyIG5vZGVzOgorICogKGZ1bmNpZCwgZnVuY3JldHR5 cGUsIGZ1bmNjb2xsYXRpb24pIC0tIG9uZSBpbm5lciBsaXN0IHBlciBSYW5nZVRibEZ1bmN0aW9u LgorICoKKyAqIE9ubHkgUlRFX0ZVTkNUSU9OIHJlbGlkcyBhY3R1YWxseSBhcHBlYXJpbmcgaW4g dGhlIGZvcmVpZ24gc2NhbidzCisgKiBmc19iYXNlX3JlbGlkcyBjb250cmlidXRlOyBvdGhlcnMg YXJlIHBsYWNlaG9sZGVycyBzbyB0aGF0IHRoZSBjb25zdW1lcgorICogY2FuIGluZGV4IGludG8g dGhlIHJlc3VsdCBieSBSVEkgb2Zmc2V0LgorICovCitzdGF0aWMgTGlzdCAqCitnZXRfZnVuY3Rp b25zX2RhdGEoUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCkKK3sKKwlMaXN0CSAg ICpydGZ1bmNkYXRhID0gTklMOworCVJlbGlkcwkJZnNjYW5fcmVsaWRzID0gZ2V0X2Jhc2VfcmVs aWRzKHJvb3QsIHJlbCk7CisJaW50CQkJaTsKKworCWZvciAoaSA9IDA7IGkgPCByb290LT5zaW1w bGVfcmVsX2FycmF5X3NpemU7IGkrKykKKwl7CisJCVJhbmdlVGJsRW50cnkgKnJ0ZSA9IHJvb3Qt PnNpbXBsZV9ydGVfYXJyYXlbaV07CisJCUxpc3QJICAgKmZ1bmNkYXRhID0gTklMOworCQlMaXN0 Q2VsbCAgICpsYzsKKworCQlpZiAocnRlID09IE5VTEwgfHwgaSA9PSAwIHx8CisJCQkhYm1zX2lz X21lbWJlcihpLCBmc2Nhbl9yZWxpZHMpIHx8CisJCQlydGUtPnJ0ZWtpbmQgIT0gUlRFX0ZVTkNU SU9OKQorCQl7CisJCQlydGZ1bmNkYXRhID0gbGFwcGVuZChydGZ1bmNkYXRhLCBOVUxMKTsKKwkJ CWNvbnRpbnVlOworCQl9CisKKwkJZm9yZWFjaChsYywgcnRlLT5mdW5jdGlvbnMpCisJCXsKKwkJ CVJhbmdlVGJsRnVuY3Rpb24gKnJ0ZnVuYyA9IChSYW5nZVRibEZ1bmN0aW9uICopIGxmaXJzdChs Yyk7CisJCQlPaWQJCQlmdW5jcmV0dHlwZTsKKwkJCU9pZAkJCWZ1bmNjb2xsYXRpb247CisJCQlU dXBsZURlc2MJdHVwZGVzYzsKKwkJCU9pZAkJCWZ1bmNpZCA9IEludmFsaWRPaWQ7CisKKwkJCWdl dF9leHByX3Jlc3VsdF90eXBlKHJ0ZnVuYy0+ZnVuY2V4cHIsICZmdW5jcmV0dHlwZSwgJnR1cGRl c2MpOworCisJCQlpZiAoIU9pZElzVmFsaWQoZnVuY3JldHR5cGUpIHx8IGZ1bmNyZXR0eXBlID09 IFJFQ09SRE9JRCkKKwkJCQllbG9nKEVSUk9SLAorCQkJCQkgImNvdWxkIG5vdCBkZXRlcm1pbmUg cmV0dXJuIHR5cGUgZm9yIGZ1bmN0aW9uIGluIGZvcmVpZ24gc2NhbiIpOworCisJCQlmdW5jY29s bGF0aW9uID0gZXhwckNvbGxhdGlvbihydGZ1bmMtPmZ1bmNleHByKTsKKworCQkJaWYgKElzQShy dGZ1bmMtPmZ1bmNleHByLCBGdW5jRXhwcikpCisJCQkJZnVuY2lkID0gKChGdW5jRXhwciAqKSBy dGZ1bmMtPmZ1bmNleHByKS0+ZnVuY2lkOworCisJCQlmdW5jZGF0YSA9IGxhcHBlbmQoZnVuY2Rh dGEsCisJCQkJCQkJICAgbGlzdF9tYWtlMyhtYWtlSW50ZWdlcihmdW5jaWQpLAorCQkJCQkJCQkJ CSAgbWFrZUludGVnZXIoZnVuY3JldHR5cGUpLAorCQkJCQkJCQkJCSAgbWFrZUludGVnZXIoZnVu Y2NvbGxhdGlvbikpKTsKKwkJfQorCisJCXJ0ZnVuY2RhdGEgPSBsYXBwZW5kKHJ0ZnVuY2RhdGEs IGZ1bmNkYXRhKTsKKwl9CisKKwlyZXR1cm4gcnRmdW5jZGF0YTsKK30KKworLyoKKyAqIENoZWNr IGlmIGEgcmVsYXRpb24gaXMgYSBGVU5DVElPTiBSVEUgdGhhdCBjYW4gYmUgYWJzb3JiZWQgaW50 byBhIHJlbW90ZQorICogam9pbi4gIEV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBSVEUgbXVzdAorICoK KyAqICAgLSByZXR1cm4gYSB3ZWxsLWRlZmluZWQgc2NhbGFyIHR5cGUgLS0gd2UgZG9uJ3Qgc2hp cCByZWNvcmRzL2NvbXBvc2l0ZQorICogICAgIHNpbmNlIHRoZSByZW1vdGUgc2VydmVyIGNhbm5v dCByZWNvbnN0cnVjdCBhIGNvbHVtbiBkZWZpbml0aW9uIGxpc3QKKyAqICAgICBhbmQgb3VyIGRl cGFyc2VyIGRvZXMgbm90IGVtaXQgb25lOworICogICAtIGhhdmUgYSBzaGlwcGFibGUgZXhwcmVz c2lvbiB3aXRoIG5vIG11dGFibGUgc3Vibm9kZXMgLS0gaXNfZm9yZWlnbl9leHByKCkKKyAqICAg ICByZWplY3RzIHZvbGF0aWxlL3N0YWJsZSBmdW5jdGlvbnMgdGhyb3VnaCBjb250YWluX211dGFi bGVfZnVuY3Rpb25zKCksCisgKiAgICAgc28gdGhlIElNTVVUQUJMRS1vbmx5IHJlc3RyaWN0aW9u IGlzIGltcGxpY2l0OworICogICAtIG5vdCBjb250YWluIFN1YlBsYW5zIC0tIHdlJ2Qgb3RoZXJ3 aXNlIG5lZWQgdG8gc2hpcCBzdWItcmVzdWx0cyB0bworICogICAgIHRoZSByZW1vdGUsIHdoaWNo IHdlIGRvIG5vdCBpbXBsZW1lbnQuCisgKgorICogV0lUSCBPUkRJTkFMSVRZIGlzIG5vdCBzdXBw b3J0ZWQgeWV0LgorICovCitzdGF0aWMgYm9vbAorZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKFBs YW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwsCisJCQkJCQkgUmVsT3B0SW5mbyAqZmR3 cmVsKQoreworCVJhbmdlVGJsRW50cnkgKnJ0ZTsKKwlMaXN0Q2VsbCAgICpsYzsKKworCWlmIChy ZWwtPnJ0ZWtpbmQgIT0gUlRFX0ZVTkNUSU9OKQorCQlyZXR1cm4gZmFsc2U7CisJcnRlID0gcGxh bm5lcl9ydF9mZXRjaChyZWwtPnJlbGlkLCByb290KTsKKwlpZiAocnRlLT5ydGVraW5kICE9IFJU RV9GVU5DVElPTikKKwkJcmV0dXJuIGZhbHNlOworCWlmIChydGUtPmZ1bmNvcmRpbmFsaXR5KQor CQlyZXR1cm4gZmFsc2U7CisKKwkvKgorCSAqIFJlamVjdCB1cC1mcm9udCBhbnkgZnVuY3Rpb24g UlRFIHRoYXQgbGF0ZXJhbC1yZWZlcmVuY2VzIGFub3RoZXIKKwkgKiByZWxhdGlvbjogZm9yZWln bi1qb2luIHB1c2gtZG93biB3b3VsZCBuZWVkIHRvIHBhcmFtZXRlcmlzZSB0aGUgcmVtb3RlCisJ ICogcXVlcnkgcGVyIG91dGVyIHJvdywgd2hpY2ggd2UgZG9uJ3Qgc3VwcG9ydCwgYW5kIGV2ZW4g Y29uc2lkZXJpbmcgdGhlCisJICogcGF0aCBpcyBleHBlbnNpdmUgb24gdGhlIHBsYW5uZXIgc2lk ZS4gIFRoZSBzdXJyb3VuZGluZyBsYXRlcmFsX3JlbGlkcworCSAqIGNoZWNrIGluIHBvc3RncmVz R2V0Rm9yZWlnbkpvaW5QYXRocygpIHdvdWxkIG5vcm1hbGx5IGJhaWwgb3V0IGZvciB0aGUKKwkg KiBqb2lucmVsLCBidXQgZG9pbmcgdGhlIGNoZWNrIGhlcmUgYXZvaWRzIHdhbGtpbmcgdGhlIGZ1 bmN0aW9uCisJICogZXhwcmVzc2lvbiBlbnRpcmVseS4KKwkgKi8KKwlpZiAoIWJtc19pc19lbXB0 eShyZWwtPmxhdGVyYWxfcmVsaWRzKSkKKwkJcmV0dXJuIGZhbHNlOworCisJQXNzZXJ0KGxpc3Rf bGVuZ3RoKHJ0ZS0+ZnVuY3Rpb25zKSA+PSAxKTsKKworCWZvcmVhY2gobGMsIHJ0ZS0+ZnVuY3Rp b25zKQorCXsKKwkJUmFuZ2VUYmxGdW5jdGlvbiAqcnRmdW5jID0gKFJhbmdlVGJsRnVuY3Rpb24g KikgbGZpcnN0KGxjKTsKKwkJVHlwZUZ1bmNDbGFzcyBmdW5jdHlwY2xhc3M7CisJCU9pZAkJCWZ1 bmNyZXR0eXBlOworCQlUdXBsZURlc2MJdHVwZGVzYzsKKworCQlmdW5jdHlwY2xhc3MgPSBnZXRf ZXhwcl9yZXN1bHRfdHlwZShydGZ1bmMtPmZ1bmNleHByLAorCQkJCQkJCQkJCQkmZnVuY3JldHR5 cGUsICZ0dXBkZXNjKTsKKwkJaWYgKGZ1bmN0eXBjbGFzcyAhPSBUWVBFRlVOQ19TQ0FMQVIpCisJ CQlyZXR1cm4gZmFsc2U7CisJCWlmICghT2lkSXNWYWxpZChmdW5jcmV0dHlwZSkgfHwKKwkJCWZ1 bmNyZXR0eXBlID09IFJFQ09SRE9JRCB8fAorCQkJZnVuY3JldHR5cGUgPT0gVk9JRE9JRCkKKwkJ CXJldHVybiBmYWxzZTsKKworCQlpZiAoY29udGFpbl9zdWJwbGFucyhydGZ1bmMtPmZ1bmNleHBy KSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKCFpc19mb3JlaWduX2V4cHIocm9vdCwgZmR3cmVs LCAoRXhwciAqKSBydGZ1bmMtPmZ1bmNleHByKSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwly ZXR1cm4gdHJ1ZTsKK30KKwogLyoKICAqIEFzc2VzcyB3aGV0aGVyIHRoZSBqb2luIGJldHdlZW4g aW5uZXIgYW5kIG91dGVyIHJlbGF0aW9ucyBjYW4gYmUgcHVzaGVkIGRvd24KICAqIHRvIHRoZSBm b3JlaWduIHNlcnZlci4gQXMgYSBzaWRlIGVmZmVjdCwgc2F2ZSBpbmZvcm1hdGlvbiB3ZSBvYnRh aW4gaW4gdGhpcwpAQCAtNjY1NCw2ICs3MDEyLDggQEAgZm9yZWlnbl9qb2luX29rKFBsYW5uZXJJ bmZvICpyb290LCBSZWxPcHRJbmZvICpqb2lucmVsLCBKb2luVHlwZSBqb2ludHlwZSwKIAlQZ0Zk d1JlbGF0aW9uSW5mbyAqZnBpbmZvX2k7CiAJTGlzdENlbGwgICAqbGM7CiAJTGlzdAkgICAqam9p bmNsYXVzZXM7CisJYm9vbAkJb3V0ZXJfaXNfZnVuY3Rpb24gPSBmYWxzZTsKKwlib29sCQlpbm5l cl9pc19mdW5jdGlvbiA9IGZhbHNlOwogCiAJLyoKIAkgKiBXZSBzdXBwb3J0IHB1c2hpbmcgZG93 biBJTk5FUiwgTEVGVCwgUklHSFQsIEZVTEwgT1VURVIgYW5kIFNFTUkgam9pbnMuCkBAIC02Njcy LDE1ICs3MDMyLDcwIEBAIGZvcmVpZ25fam9pbl9vayhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqam9pbnJlbCwgSm9pblR5cGUgam9pbnR5cGUsCiAJCXJldHVybiBmYWxzZTsKIAogCS8q Ci0JICogSWYgZWl0aGVyIG9mIHRoZSBqb2luaW5nIHJlbGF0aW9ucyBpcyBtYXJrZWQgYXMgdW5z YWZlIHRvIHB1c2hkb3duLCB0aGUKLQkgKiBqb2luIGNhbiBub3QgYmUgcHVzaGVkIGRvd24uCisJ ICogRGV0ZWN0IG1peGVkIChmb3JlaWduIHggZnVuY3Rpb24tUlRFKSBjYXNlcy4gIE9ubHkgSU5O RVIgam9pbnMgYXJlCisJICogc3VwcG9ydGVkIGluaXRpYWxseS4gIFdlIGRpc3BhdGNoIG9uIHJ0 ZWtpbmQgaGVyZSBzbyB0aGF0IHRoZSBzYW1lCisJICogZnVuY3Rpb24gUlRFIGNhbiBiZSBhYnNv cmJlZCBpbnRvIGpvaW5zIG9uIG11bHRpcGxlIGZvcmVpZ24gc2VydmVycworCSAqIChlYWNoIGNh bGwgZ2V0cyBpdHMgb3duIHN0dWIgZnBpbmZvIGFuZCByZWNoZWNrcyBzaGlwcGFiaWxpdHkgZm9y IHRoZQorCSAqIHNwZWNpZmljIHNlcnZlcikuCiAJICovCiAJZnBpbmZvID0gKFBnRmR3UmVsYXRp b25JbmZvICopIGpvaW5yZWwtPmZkd19wcml2YXRlOwotCWZwaW5mb19vID0gKFBnRmR3UmVsYXRp b25JbmZvICopIG91dGVycmVsLT5mZHdfcHJpdmF0ZTsKLQlmcGluZm9faSA9IChQZ0Zkd1JlbGF0 aW9uSW5mbyAqKSBpbm5lcnJlbC0+ZmR3X3ByaXZhdGU7Ci0JaWYgKCFmcGluZm9fbyB8fCAhZnBp bmZvX28tPnB1c2hkb3duX3NhZmUgfHwKLQkJIWZwaW5mb19pIHx8ICFmcGluZm9faS0+cHVzaGRv d25fc2FmZSkKLQkJcmV0dXJuIGZhbHNlOworCWlmIChqb2ludHlwZSA9PSBKT0lOX0lOTkVSICYm IGlubmVycmVsLT5ydGVraW5kID09IFJURV9GVU5DVElPTiAmJgorCQkoZnBpbmZvX28gPSAoUGdG ZHdSZWxhdGlvbkluZm8gKikgb3V0ZXJyZWwtPmZkd19wcml2YXRlKSAmJgorCQlmcGluZm9fby0+ cHVzaGRvd25fc2FmZSAmJgorCQlmdW5jdGlvbl9ydGVfcHVzaGRvd25fb2socm9vdCwgaW5uZXJy ZWwsIG91dGVycmVsKSkKKwl7CisJCWlubmVyX2lzX2Z1bmN0aW9uID0gdHJ1ZTsKKwl9CisJZWxz ZSBpZiAoam9pbnR5cGUgPT0gSk9JTl9JTk5FUiAmJiBvdXRlcnJlbC0+cnRla2luZCA9PSBSVEVf RlVOQ1RJT04gJiYKKwkJCSAoZnBpbmZvX2kgPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgaW5uZXJy ZWwtPmZkd19wcml2YXRlKSAmJgorCQkJIGZwaW5mb19pLT5wdXNoZG93bl9zYWZlICYmCisJCQkg ZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKHJvb3QsIG91dGVycmVsLCBpbm5lcnJlbCkpCisJewor CQlvdXRlcl9pc19mdW5jdGlvbiA9IHRydWU7CisJfQorCWVsc2UKKwl7CisJCWZwaW5mb19vID0g KFBnRmR3UmVsYXRpb25JbmZvICopIG91dGVycmVsLT5mZHdfcHJpdmF0ZTsKKwkJZnBpbmZvX2kg PSAoUGdGZHdSZWxhdGlvbkluZm8gKikgaW5uZXJyZWwtPmZkd19wcml2YXRlOworCQlpZiAoIWZw aW5mb19vIHx8ICFmcGluZm9fby0+cHVzaGRvd25fc2FmZSB8fAorCQkJIWZwaW5mb19pIHx8ICFm cGluZm9faS0+cHVzaGRvd25fc2FmZSkKKwkJCXJldHVybiBmYWxzZTsKKwl9CisKKwkvKgorCSAq IElmIG9uZSBzaWRlIGlzIGEgZnVuY3Rpb24gUlRFLCBhbGxvY2F0ZSBhIHN0dWIgZnBpbmZvIHNv IHRoZSByZXN0IG9mCisJICogdGhpcyBmdW5jdGlvbiBhbmQgdGhlIGNvc3QgZXN0aW1hdG9yIGNh biB0cmVhdCBpdCB1bmlmb3JtbHkuICBXZSBoYW5kCisJICogdGhlIHN0dWIgdG8gdGhlIGpvaW5y ZWwncyBkZXBhcnNlciB2aWEgdGhlIHNhbWUgcGF0aCB0aGUgZm9yZWlnbiBzaWRlCisJICogdXNl cywgYnV0IHdlIG5ldmVyIHBlcm1hbmVudGx5IGF0dGFjaCBpdCB0byB0aGUgZnVuY3Rpb24gcmVs J3MKKwkgKiBmZHdfcHJpdmF0ZSAoZGlmZmVyZW50IGpvaW5yZWxzIG1heSBwYWlyIHRoZSBzYW1l IGZ1bmN0aW9uIFJURSB3aXRoCisJICogZGlmZmVyZW50IGZvcmVpZ24gc2VydmVycykuCisJICov CisJaWYgKGlubmVyX2lzX2Z1bmN0aW9uKQorCXsKKwkJZnBpbmZvX2kgPSBwYWxsb2MwX29iamVj dChQZ0Zkd1JlbGF0aW9uSW5mbyk7CisJCWZwaW5mb19pLT5wdXNoZG93bl9zYWZlID0gdHJ1ZTsK KwkJZnBpbmZvX2ktPnNlcnZlciA9IGZwaW5mb19vLT5zZXJ2ZXI7CisJCWZwaW5mb19pLT5yZWxh dGlvbl9uYW1lID0gcHNwcmludGYoIiV1IiwgaW5uZXJyZWwtPnJlbGlkKTsKKwkJZnBpbmZvX2kt PnJvd3MgPSBpbm5lcnJlbC0+cm93czsKKwkJZnBpbmZvX2ktPndpZHRoID0gaW5uZXJyZWwtPnJl bHRhcmdldC0+d2lkdGg7CisJCWZwaW5mb19pLT5yZXRyaWV2ZWRfcm93cyA9IGlubmVycmVsLT5y b3dzOworCQlmcGluZm9faS0+cmVsX3N0YXJ0dXBfY29zdCA9IDA7CisJCWZwaW5mb19pLT5yZWxf dG90YWxfY29zdCA9IDA7CisJCWZwaW5mby0+aW5uZXJfZnVuY19mcGluZm8gPSBmcGluZm9faTsK Kwl9CisJZWxzZSBpZiAob3V0ZXJfaXNfZnVuY3Rpb24pCisJeworCQlmcGluZm9fbyA9IHBhbGxv YzBfb2JqZWN0KFBnRmR3UmVsYXRpb25JbmZvKTsKKwkJZnBpbmZvX28tPnB1c2hkb3duX3NhZmUg PSB0cnVlOworCQlmcGluZm9fby0+c2VydmVyID0gZnBpbmZvX2ktPnNlcnZlcjsKKwkJZnBpbmZv X28tPnJlbGF0aW9uX25hbWUgPSBwc3ByaW50ZigiJXUiLCBvdXRlcnJlbC0+cmVsaWQpOworCQlm cGluZm9fby0+cm93cyA9IG91dGVycmVsLT5yb3dzOworCQlmcGluZm9fby0+d2lkdGggPSBvdXRl cnJlbC0+cmVsdGFyZ2V0LT53aWR0aDsKKwkJZnBpbmZvX28tPnJldHJpZXZlZF9yb3dzID0gb3V0 ZXJyZWwtPnJvd3M7CisJCWZwaW5mb19vLT5yZWxfc3RhcnR1cF9jb3N0ID0gMDsKKwkJZnBpbmZv X28tPnJlbF90b3RhbF9jb3N0ID0gMDsKKwkJZnBpbmZvLT5vdXRlcl9mdW5jX2ZwaW5mbyA9IGZw aW5mb19vOworCX0KIAogCS8qCiAJICogSWYgam9pbmluZyByZWxhdGlvbnMgaGF2ZSBsb2NhbCBj b25kaXRpb25zLCB0aG9zZSBjb25kaXRpb25zIGFyZQpkaWZmIC0tZ2l0IGEvY29udHJpYi9wb3N0 Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmggYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jlc19m ZHcuaAppbmRleCBhMmJiMWZmMzUyYy4uNWIyZmZjZjA2ZjcgMTAwNjQ0Ci0tLSBhL2NvbnRyaWIv cG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oCisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bv c3RncmVzX2Zkdy5oCkBAIC0xMDYsNiArMTA2LDE2IEBAIHR5cGVkZWYgc3RydWN0IFBnRmR3UmVs YXRpb25JbmZvCiAJLyogam9pbmNsYXVzZXMgY29udGFpbnMgb25seSBKT0lOL09OIGNvbmRpdGlv bnMgZm9yIGFuIG91dGVyIGpvaW4gKi8KIAlMaXN0CSAgICpqb2luY2xhdXNlczsJLyogTGlzdCBv ZiBSZXN0cmljdEluZm8gKi8KIAorCS8qCisJICogSWYgYSBGVU5DVElPTiBSVEUgd2FzIGFic29y YmVkIGludG8gdGhpcyBqb2luLCB0aGVzZSBwb2ludCBhdCB0aGUgc3R1YgorCSAqIFBnRmR3UmVs YXRpb25JbmZvIGZvciB0aGUgZnVuY3Rpb24gc2lkZSAocGFpcmVkIHdpdGggdGhlCisJICogb3V0 ZXJyZWwvaW5uZXJyZWwpLCBzbyB0aGUgY29zdCBlc3RpbWF0b3IgYW5kIGRlcGFyc2VyIGNhbiBm aW5kIGl0CisJICogd2l0aG91dCBjb25zdWx0aW5nIHRoZSBmdW5jdGlvbiByZWwncyBmZHdfcHJp dmF0ZS4gIEF0IG1vc3Qgb25lIG9mCisJICogb3V0ZXJfZnVuY19mcGluZm8vaW5uZXJfZnVuY19m cGluZm8gaXMgc2V0LgorCSAqLworCXN0cnVjdCBQZ0Zkd1JlbGF0aW9uSW5mbyAqb3V0ZXJfZnVu Y19mcGluZm87CisJc3RydWN0IFBnRmR3UmVsYXRpb25JbmZvICppbm5lcl9mdW5jX2ZwaW5mbzsK KwogCS8qIFVwcGVyIHJlbGF0aW9uIGluZm9ybWF0aW9uICovCiAJVXBwZXJSZWxhdGlvbktpbmQg c3RhZ2U7CiAKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19m ZHcuc3FsIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVzX2Zkdy5zcWwKaW5kZXgg ZGZjNThiZWIwZDIuLmVjNzkxZTIxMjdkIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zk dy9zcWwvcG9zdGdyZXNfZmR3LnNxbAorKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9z dGdyZXNfZmR3LnNxbApAQCAtNzkwLDYgKzc5MCwxODkgQEAgU0VMRUNUIHQxLmMxLCB0Mi5jMiBG Uk9NIHY0IHQxIExFRlQgSk9JTiBmdDUgdDIgT04gKHQxLmMxID0gdDIuYzEpIE9SREVSIEJZIHQx LmMKIFNFTEVDVCB0MS5jMSwgdDIuYzIgRlJPTSB2NCB0MSBMRUZUIEpPSU4gZnQ1IHQyIE9OICh0 MS5jMSA9IHQyLmMxKSBPUkRFUiBCWSB0MS5jMSwgdDIuYzEgT0ZGU0VUIDEwIExJTUlUIDEwOwog QUxURVIgVklFVyB2NCBPV05FUiBUTyByZWdyZXNzX3ZpZXdfb3duZXI7CiAKKy0tID09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KKy0tIEZvcmVpZ24tam9pbiB3aXRoIEZVTkNUSU9OIFJURSBwdXNoZG93biAoSU1NVVRBQkxF IGZ1bmN0aW9ucyBvbmx5KQorLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0gSU1NVVRBQkxFIGZ1bmN0aW9uOiB1 bm5lc3Qgb2YgY29uc3RhbnQgYXJyYXkgY2FuIGJlIHB1c2hlZCBkb3duCitFWFBMQUlOIChWRVJC T1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQxLmMzIEZST00gZnQxIHQxLCB1bm5lc3Qo QVJSQVlbMSwgNSwgMTAsIDEwMF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1Lmlk IE9SREVSIEJZIHQxLmMxOworU0VMRUNUIHQxLmMxLCB0MS5jMyBGUk9NIGZ0MSB0MSwgdW5uZXN0 KEFSUkFZWzEsIDUsIDEwLCAxMDBdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5p ZCBPUkRFUiBCWSB0MS5jMTsKKworLS0gSU1NVVRBQkxFIGZ1bmN0aW9uOiBnZW5lcmF0ZV9zZXJp ZXMgd2l0aCBjb25zdGFudCBhcmdzCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxF Q1QgdDEuYzEgRlJPTSBmdDEgdDEsIGdlbmVyYXRlX3NlcmllcygxLCA0KSBBUyBnKGlkKQorV0hF UkUgdDEuYzEgPSBnLmlkIE9SREVSIEJZIHQxLmMxOworU0VMRUNUIHQxLmMxIEZST00gZnQxIHQx LCBnZW5lcmF0ZV9zZXJpZXMoMSwgNCkgQVMgZyhpZCkKK1dIRVJFIHQxLmMxID0gZy5pZCBPUkRF UiBCWSB0MS5jMTsKKworLS0gVk9MQVRJTEUgZnVuY3Rpb24gKHJhbmRvbSkgbXVzdCBOT1QgYmUg cHVzaGVkIGRvd24KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSBG Uk9NIGZ0MSB0MSwgZ2VuZXJhdGVfc2VyaWVzKDEsIDQgKyAocmFuZG9tKCkgKiAwKTo6aW50KSBB UyBnKGlkKQorV0hFUkUgdDEuYzEgPSBnLmlkOworCistLSBXSVRIIE9SRElOQUxJVFkgbXVzdCBO T1QgYmUgcHVzaGVkIGRvd24gKGxpbWl0YXRpb24gb2YgdGhpcyBpbXBsZW1lbnRhdGlvbikKK0VY UExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0MS5jMSwgdS5vcmQKK0ZST00gZnQx IHQxLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTBdOjppbnRbXSkgV0lUSCBPUkRJTkFMSVRZIEFTIHUo aWQsIG9yZCkKK1dIRVJFIHQxLmMxID0gdS5pZDsKKworLS0gU2FtZSBmdW5jdGlvbiBSVEUgam9p bmVkIHdpdGggdHdvIGRpZmZlcmVudCBmb3JlaWduIHNlcnZlcnM6IHBsYW5uZXIgcGlja3MKKy0t IG9uZSBhYnNvcnB0aW9uICsgYSBsb2NhbCBqb2luIHdpdGggdGhlIHNlY29uZCBmb3JlaWduIHNl cnZlci4gIFRoZSBmYWN0CistLSB0aGF0IHRoZSBmdW5jdGlvbiBpcyBJTU1VVEFCTEUgbWFrZXMg dGhpcyBzYWZlIGV2ZW4gaWYgYm90aCBzaWRlcyBjaG9zZSB0bworLS0gYWJzb3JiIGl0IGluZGVw ZW5kZW50bHkuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHQy LmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1bm5lc3QoQVJSQVlbMSwgNSwgMTAsIDEwMF06Omlu dFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1LmlkIEFORCB0Mi5jMSA9IHUuaWQgT1JERVIg QlkgdDEuYzE7CisKKy0tIENvc3QtYmFzZWQgc2VsZWN0aW9uIGJldHdlZW4gdHdvIGZvcmVpZ24g c2VydmVyczogZnQxICgiUyAxIi4iVCAxIikgaGFzCistLSAxMDAwIHJvd3MsIGZ0NiAoIlMgMSIu IlQgNCIpIGhhcyB+MzMgcm93cy4gIFRoZSBzYW1lIHF1ZXJ5IHNoYXBlIGdldHMgYQorLS0gZGlm ZmVyZW50IHB1c2gtZG93biB0YXJnZXQgZGVwZW5kaW5nIG9uIGEgcHJlZGljYXRlIHRoYXQgY2hh bmdlcyB0aGUKKy0tIGVmZmVjdGl2ZSBjYXJkaW5hbGl0eSBvZiBvbmUgc2lkZSAtLSB0aGUgZnVu Y3Rpb24gImp1bXBzIiB0byB3aGljaGV2ZXIKKy0tIGZvcmVpZ24gc2NhbiBiZW5lZml0cyBtb3Jl IGZyb20gYmVpbmcgcHJlLWZpbHRlcmVkLgorQU5BTFlaRSBmdDE7CitBTkFMWVpFIGZ0NjsKKy0t IE5vIGV4dHJhIHByZWRpY2F0ZTogZnQxIGlzIHRoZSBiaWdnZXIgc2lkZSwgZnVuY3Rpb24gYWJz b3JiZWQgdGhlcmUuCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEs IHQyLmMxCitGUk9NIGZ0MSB0MSwgZnQ2IHQyLCB1bm5lc3QoQVJSQVlbMywgNiwgOSwgMTIsIDE1 LCAxOF06OmludFtdKSBBUyB1KGlkKQorV0hFUkUgdDEuYzEgPSB1LmlkIEFORCB0Mi5jMSA9IHUu aWQ7CistLSBTZWxlY3RpdmUgcHJlZGljYXRlIG9uIGZ0MS5jMyAobm90IGluIHRoZSBlcWNsYXNz KSBzaHJpbmtzIGZ0MSB0byBhCistLSBoYW5kZnVsIG9mIHJlbW90ZSByb3dzOyBub3cgZnQ2IGlz IGVmZmVjdGl2ZWx5IHRoZSBiaWdnZXIgc2lkZSBhbmQgdGhlCistLSBmdW5jdGlvbiBpcyBhYnNv cmJlZCBpbnRvIGZ0NiBpbnN0ZWFkLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VM RUNUIHQxLmMxLCB0Mi5jMQorRlJPTSBmdDEgdDEsIGZ0NiB0MiwgdW5uZXN0KEFSUkFZWzMsIDYs IDksIDEyLCAxNSwgMThdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBBTkQg dDIuYzEgPSB1LmlkIEFORCB0MS5jMyA8ICcwMDAxMCc7CisKKy0tIFRoZSByZW1haW5pbmcgc2Nl bmFyaW9zIHJldXNlIGEgZGVkaWNhdGVkIGZvcmVpZ24gdGFibGUgdG8gY292ZXIgdGhlCistLSBj b3JuZXIgY2FzZXMgb2YgRlVOQ1RJT04gUlRFIHB1c2gtZG93bjogZnVuY3Rpb24tZmlyc3QgRlJP TSwgcmVjb3JkCistLSByZXR1cm4gdHlwZSByZWplY3Rpb24sIHdob2xlLXJvdyByZWZlcmVuY2Us IFVQREFURS4uLkZST00uLi4sIGFuZAorLS0gbXVsdGktZnVuY3Rpb24gUk9XUyBGUk9NLgorQ1JF QVRFIFRBQkxFIGJhc2VfdGJsX2ZuIChhIGludCwgYiBpbnQpOworSU5TRVJUIElOVE8gYmFzZV90 YmxfZm4KKyAgU0VMRUNUIGcsIGcgKyAxMDAgRlJPTSBnZW5lcmF0ZV9zZXJpZXMoMSwgMzApIGc7 CitDUkVBVEUgRk9SRUlHTiBUQUJMRSByZW1vdGVfdGJsIChhIGludCwgYiBpbnQpCisgIFNFUlZF UiBsb29wYmFjayBPUFRJT05TICh0YWJsZV9uYW1lICdiYXNlX3RibF9mbicpOworCistLSBUaGUg ZnVuY3Rpb24gUlRFIGFwcGVhcnMgZmlyc3QgaW4gRlJPTTsgdGhlIGZvcmVpZ24gcmVsYXRpb24g bXVzdCBiZQorLS0gZm91bmQgYnkgc2Nhbm5pbmcgZnNfYmFzZV9yZWxpZHMgZm9yIGFuIFJURV9S RUxBVElPTiByYXRoZXIgdGhhbgorLS0gdXNpbmcgc2Nhbi0+ZnNfcmVsaWQgYmxpbmRseS4KK0VY UExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCAqIEZST00gdW5uZXN0KGFycmF5WzIs IDMsIDRdKSBuLCByZW1vdGVfdGJsIHIgV0hFUkUgci5hID0gbjsKK1NFTEVDVCAqIEZST00gdW5u ZXN0KGFycmF5WzIsIDMsIDRdKSBuLCByZW1vdGVfdGJsIHIKK1dIRVJFIHIuYSA9IG4gT1JERVIg Qlkgci5hOworCistLSBBIGZ1bmN0aW9uIHJldHVybmluZyByZWNvcmQgKGNvbXBvc2l0ZSkgaXMg Zm9yYmlkZGVuOyBwdXNoaW5nIGl0CistLSB3b3VsZCB5aWVsZCBhIHJlbW90ZSAiY29sdW1uIGRl ZmluaXRpb24gbGlzdCBpcyByZXF1aXJlZCIgZXJyb3IuCistLSBmdW5jdGlvbl9ydGVfcHVzaGRv d25fb2soKSByZWplY3RzIGl0IHZpYSBUWVBFRlVOQ19TQ0FMQVIuCitDUkVBVEUgT1IgUkVQTEFD RSBGVU5DVElPTiBmX3JldF9yZWNvcmQoKSBSRVRVUk5TIHJlY29yZCBBUyAkJAorICBTRUxFQ1Qg KDEsIDIpOjpyZWNvcmQKKyQkIExBTkdVQUdFIFNRTCBJTU1VVEFCTEU7CitFWFBMQUlOIChWRVJC T1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgcyBGUk9NIHJlbW90ZV90YmwgcnQsIGZfcmV0X3JlY29y ZCgpIEFTIHMoYSBpbnQsIGIgaW50KQorV0hFUkUgcy5hID0gcnQuYTsKK0RST1AgRlVOQ1RJT04g Zl9yZXRfcmVjb3JkKCk7CisKKy0tIFVQREFURSAuLi4gRlJPTSB1bm5lc3QoKSB3aXRoIGEgY29t cGxleCBlbGVtZW50IHR5cGU7IGFyZWEoYm94KQorLS0geWllbGRzIHRoZSB2YWx1ZSB0byBtYXRj aC4gIFRoZSBsb2NraW5nIG1hY2hpbmVyeSBmb3IgdGhlCistLSBub24tcmVsYXRpb24gUlRFIGdl bmVyYXRlcyBhIHdob2xlLXJvdyBWYXIgdGhhdCBkZXBhcnNlQ29sdW1uUmVmCistLSBlbWl0cyBh cyBST1coZjxydGk+LmMxLCAuLi4pLgorVVBEQVRFIHJlbW90ZV90YmwgciBTRVQgYiA9IDk5OQor RlJPTSB1bm5lc3QoYXJyYXlbYm94ICcoKDIsMyksKC0yLC0zKSknXSkgQVMgdChieCkKK1dIRVJF IHIuYSA9IGFyZWEodC5ieCk7CitTRUxFQ1QgKiBGUk9NIHJlbW90ZV90YmwgV0hFUkUgYSBJTiAo MjMsIDI0LCAyNSkgT1JERVIgQlkgYTsKKworLS0gVGhlIHNhbWUgc2hhcGUgd2l0aCBDQVNFIGFu ZCBSRVRVUk5JTkc7IGV4ZXJjaXNlcyB0aGUgRGlyZWN0TW9kaWZ5CistLSBwYXRoIGFuZCB0aGUg ZXhlY3V0b3IncyB0dXBsZS1kZXNjIHJlY29uc3RydWN0aW9uLgorVVBEQVRFIHJlbW90ZV90Ymwg cgorICAgU0VUIGIgPSBDQVNFIFdIRU4gcmFuZG9tKCkgPj0gMCBUSEVOIDUgRUxTRSAwIEVORAor ICBGUk9NIHVubmVzdChhcnJheVtib3ggJygoMiwzKSwoLTIsLTMpKSddKSBBUyB0KGJ4KQorIFdI RVJFIHIuYSA9IGFyZWEodC5ieCkgUkVUVVJOSU5HIGEsIGI7CisKKy0tIFJFVFVSTklORyBhIHdo b2xlLXJvdyByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIFJURS4gIFdpdGhvdXQgdGhlCistLSBw ZXItUlRFIGZ1bmN0aW9uIG1ldGFkYXRhIGJlaW5nIHByZXNlcnZlZCBvbiB0aGUgRGlyZWN0TW9k aWZ5IHBhdGgKKy0tIChGZHdEaXJlY3RNb2RpZnlQcml2YXRlRnVuY3Rpb25zIC8gRmR3RGlyZWN0 TW9kaWZ5UHJpdmF0ZU1pblJUSW5kZXgpLAorLS0gdGhpcyB3b3VsZCBmYWlsIHdpdGggImlucHV0 IG9mIGFub255bW91cyBjb21wb3NpdGUgdHlwZXMgaXMgbm90CistLSBpbXBsZW1lbnRlZCIuCitV UERBVEUgcmVtb3RlX3RibCByIFNFVCBiID0gNworICBGUk9NIHVubmVzdChhcnJheVtib3ggJygo MiwzKSwoLTIsLTMpKSddLAorICAgICAgICAgICAgICBhcnJheVtpbnQgJzEnXSkgQVMgdChieCwg aSkKKyBXSEVSRSByLmEgPSBhcmVhKHQuYngpIFJFVFVSTklORyBhLCBiLCB0OworCistLSBST1dT IEZST00gKC4uLikgd2l0aCBzZXZlcmFsIGZ1bmN0aW9ucy4gIEZvcmNlIHB1c2hkb3duIGJlY2F1 c2UgdGhlCistLSBjb3N0IG1vZGVsIG90aGVyd2lzZSBwaWNrcyBhIGxvY2FsIHBsYW4uCitTRVQg ZW5hYmxlX2hhc2hqb2luID0gb2ZmOworU0VUIGVuYWJsZV9tZXJnZWpvaW4gPSBvZmY7CitTRVQg ZW5hYmxlX25lc3Rsb29wID0gb2ZmOworRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VM RUNUIHIuYSwgdC5uLCB0LnMKKyAgRlJPTSByZW1vdGVfdGJsIHIsIFJPV1MgRlJPTSAodW5uZXN0 KGFycmF5WzMsIDYsIDldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJh dGVfc2VyaWVzKDExLCAxMykpIEFTIHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm4gT1JERVIgQlkg ci5hOworU0VMRUNUIHIuYSwgdC5uLCB0LnMKKyAgRlJPTSByZW1vdGVfdGJsIHIsIFJPV1MgRlJP TSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgZ2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIEFTIHQobiwgcykKKyBXSEVSRSByLmEgPSB0Lm4g T1JERVIgQlkgci5hOworCistLSBXaG9sZS1yb3cgVmFyIG9uIHRoZSBhYnNvcmJlZCBmdW5jdGlv biBzaWRlIChlLmcuIHZpYSBhIGNhc3QgdG8KKy0tIHRleHQpLiAgRXhlcmNpc2VzIGJvdGggZGVw YXJzZUNvbHVtblJlZiB3aG9sZS1yb3cgYnJhbmNoIGFuZCB0aGUKKy0tIGdldF90dXBkZXNjX2Zv cl9qb2luX3NjYW5fdHVwbGVzKCkgUlRFX0ZVTkNUSU9OIG1ldGFkYXRhIHBhdGguCitFWFBMQUlO IChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVtb3Rl X3RibCByLCBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisg V0hFUkUgci5hID0gdC5uIE9SREVSIEJZIHIuYTsKK1NFTEVDVCB0Ojp0ZXh0LCByLmEKKyAgRlJP TSByZW1vdGVfdGJsIHIsIFJPV1MgRlJPTSAodW5uZXN0KGFycmF5WzMsIDYsIDldKSwKKyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWVzKDExLCAxMykpIEFTIHQo biwgcykKKyBXSEVSRSByLmEgPSB0Lm4gT1JERVIgQlkgci5hOworCistLSBDaGVjayB3aG9sZS1y b3cgVmFyIHJlcHJlc2VudGVkIGJ5IGZ1bmN0aW9uIG9uIHRoZSBudWxsYWJsZQorLS0gbGVmdCBq b2luIHNpZGUKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB1LCBmdDUuYzEs IGZ0NS5jMiwgZnQ0LmMxLCBmdDQuYzIgRlJPTSBmdDUgTEVGVCBKT0lOCisoZnQ0IEpPSU4gdW5u ZXN0KGFycmF5WzEsMl0sIGFycmF5WzMsNF0pIGFzIHUgKHUxLCB1MikgT04gZnQ0LmMxPXUxKQor T04gZnQ1LmMxID0gZnQ0LmMxIFdIRVJFIGZ0NS5jMSA8IDEwIE9SREVSIEJZIGZ0NS5jMTsKK1NF TEVDVCB1LCBmdDUuYzEsIGZ0NS5jMiwgZnQ0LmMxLCBmdDQuYzIgRlJPTSBmdDUgTEVGVCBKT0lO CisoZnQ0IEpPSU4gdW5uZXN0KGFycmF5WzEsMl0sIGFycmF5WzMsNF0pIGFzIHUgKHUxLCB1Mikg T04gZnQ0LmMxPXUxKQorT04gZnQ1LmMxID0gZnQ0LmMxIFdIRVJFIGZ0NS5jMSA8IDEwIE9SREVS IEJZIGZ0NS5jMTsKK1JFU0VUIGVuYWJsZV9oYXNoam9pbjsKK1JFU0VUIGVuYWJsZV9tZXJnZWpv aW47CitSRVNFVCBlbmFibGVfbmVzdGxvb3A7CisKKy0tIFZvbGF0aWxlIGZ1bmN0aW9uIGluIFJP V1MgRlJPTSBkaXNxdWFsaWZpZXMgdGhlIHdob2xlIFJURS4KK0VYUExBSU4gKFZFUkJPU0UsIENP U1RTIE9GRikKK1NFTEVDVCByLmEgRlJPTSByZW1vdGVfdGJsIHIsCisgICAgICAgICAgICAgICAg Uk9XUyBGUk9NICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAorICAgICAgICAgICAgICAgICAgICAg ICAgICAgZ2VuZXJhdGVfc2VyaWVzKDEsIDQgKyAocmFuZG9tKCkgKiAwKTo6aW50KSkgQVMgdChu LCBzKQorIFdIRVJFIHIuYSA9IHQubjsKKworLS0gTEFURVJBTCBmdW5jdGlvbiByZWZlcmVuY2lu ZyBhIGZvcmVpZ24gVmFyOiBwb3N0Z3Jlc19mZHcncworLS0gZm9yZWlnbi1qb2luIHB1c2hkb3du IHJlamVjdHMgdGhpcyB2aWEgdGhlIGpvaW5yZWwtPmxhdGVyYWxfcmVsaWRzCistLSBjaGVjazsg dGhlIHBsYW4gaXMgdGhlcmVmb3JlIGEgbG9jYWwgTmVzdExvb3AgKyBGdW5jdGlvblNjYW4uCitF WFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hLCB0LnggRlJPTSByZW1vdGVf dGJsIHIsIExBVEVSQUwgdW5uZXN0KGFycmF5W3IuYV0pIEFTIHQoeCkKK1dIRVJFIHIuYSA8PSAz IE9SREVSIEJZIHIuYTsKKworLS0gT3V0ZXIgam9pbnMgd2l0aCB0aGUgZnVuY3Rpb24gUlRFIGFy ZSBub3QgcHVzaGVkIGRvd24gKG9ubHkgSU5ORVIKKy0tIGpvaW5zIGFyZSBzdXBwb3J0ZWQgYnkg ZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKCkpLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZG KQorU0VMRUNUIHIuYSwgdC5uIEZST00gcmVtb3RlX3RibCByCisgICAgIExFRlQgSk9JTiB1bm5l c3QoYXJyYXlbMSwgMiwgM10pIEFTIHQobikgT04gci5hID0gdC5uCisgV0hFUkUgci5hIDw9IDUg T1JERVIgQlkgci5hOworCistLSBTRU1JIGpvaW4gKEVYSVNUUykgd2l0aCBhIGZ1bmN0aW9uIFJU RSBpcyBhbHNvIG5vdCBwdXNoZWQgZG93bi4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikK K1NFTEVDVCByLmEgRlJPTSByZW1vdGVfdGJsIHIKKyBXSEVSRSBFWElTVFMgKFNFTEVDVCAxIEZS T00gdW5uZXN0KGFycmF5WzMsIDYsIDldKSBBUyB0KG4pIFdIRVJFIHQubiA9IHIuYSkKKyBPUkRF UiBCWSByLmE7CisKK0RST1AgRk9SRUlHTiBUQUJMRSByZW1vdGVfdGJsOworRFJPUCBUQUJMRSBi YXNlX3RibF9mbjsKKwogLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC0tIENoZWNrIHRoYXQgdXNlcmlkIHRvIHVz ZSB3aGVuIHF1ZXJ5aW5nIHRoZSByZW1vdGUgdGFibGUgaXMgY29ycmVjdGx5CiAtLSBwcm9wYWdh dGVkIGludG8gZm9yZWlnbiByZWxzIHByZXNlbnQgaW4gc3VicXVlcmllcyB1bmRlciBhbiBVTklP TiBBTEwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYyBi L3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUuYwppbmRleCAzZmMyYzJmNzFkMC4u ZjIxYWUxYmFlYjIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5v ZGUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRpbC9yZWxub2RlLmMKQEAgLTc0Niw2 ICs3NDYsMzAgQEAgc2V0X2ZvcmVpZ25fcmVsX3Byb3BlcnRpZXMoUmVsT3B0SW5mbyAqam9pbnJl bCwgUmVsT3B0SW5mbyAqb3V0ZXJfcmVsLAogCQkJam9pbnJlbC0+ZmR3cm91dGluZSA9IG91dGVy X3JlbC0+ZmR3cm91dGluZTsKIAkJfQogCX0KKwllbHNlIGlmIChPaWRJc1ZhbGlkKG91dGVyX3Jl bC0+c2VydmVyaWQpICYmCisJCQkgaW5uZXJfcmVsLT5ydGVraW5kID09IFJURV9GVU5DVElPTikK Kwl7CisJCS8qCisJCSAqIE9uZSBzaWRlIGlzIGEgZm9yZWlnbiByZWxhdGlvbiwgdGhlIG90aGVy IHNpZGUgaXMgYSBmdW5jdGlvbiBSVEUuCisJCSAqIElmIHRoZSBmdW5jdGlvbiBpcyBJTU1VVEFC TEUsIHRoZSBGRFcgY2FuIGFic29yYiB0aGUgZnVuY3Rpb24gY2FsbAorCQkgKiBpbnRvIHRoZSBy ZW1vdGUgcXVlcnkgKHRoZSByZXN1bHQgaXMgaWRlbnRpY2FsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2gK KwkJICogc2VydmVyIGV2YWx1YXRlcyBpdCkuICBMZXQgdGhlIEZEVyBkZWNpZGUgd2hldGhlciB0 aGUgam9pbiBpcworCQkgKiBhY3R1YWxseSBzaGlwcGFibGU7IGhlcmUgd2UganVzdCBwcm9wYWdh dGUgdGhlIEZEVyByb3V0aW5lIHNvIHRoZQorCQkgKiBGRFcgZ2V0cyBhIGNoYW5jZS4KKwkJICov CisJCWpvaW5yZWwtPnNlcnZlcmlkID0gb3V0ZXJfcmVsLT5zZXJ2ZXJpZDsKKwkJam9pbnJlbC0+ dXNlcmlkID0gb3V0ZXJfcmVsLT51c2VyaWQ7CisJCWpvaW5yZWwtPnVzZXJpZGlzY3VycmVudCA9 IG91dGVyX3JlbC0+dXNlcmlkaXNjdXJyZW50OworCQlqb2lucmVsLT5mZHdyb3V0aW5lID0gb3V0 ZXJfcmVsLT5mZHdyb3V0aW5lOworCX0KKwllbHNlIGlmIChPaWRJc1ZhbGlkKGlubmVyX3JlbC0+ c2VydmVyaWQpICYmCisJCQkgb3V0ZXJfcmVsLT5ydGVraW5kID09IFJURV9GVU5DVElPTikKKwl7 CisJCWpvaW5yZWwtPnNlcnZlcmlkID0gaW5uZXJfcmVsLT5zZXJ2ZXJpZDsKKwkJam9pbnJlbC0+ dXNlcmlkID0gaW5uZXJfcmVsLT51c2VyaWQ7CisJCWpvaW5yZWwtPnVzZXJpZGlzY3VycmVudCA9 IGlubmVyX3JlbC0+dXNlcmlkaXNjdXJyZW50OworCQlqb2lucmVsLT5mZHdyb3V0aW5lID0gaW5u ZXJfcmVsLT5mZHdyb3V0aW5lOworCX0KIH0KIAogLyoKLS0gCjIuMzkuNSAoQXBwbGUgR2l0LTE1 NCkKCg== --0000000000002adb0106522fc134--