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 1wPK4b-000eMW-1r for pgsql-hackers@arkaria.postgresql.org; Tue, 19 May 2026 13:01:26 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wPK4Z-004Ixu-1m for pgsql-hackers@arkaria.postgresql.org; Tue, 19 May 2026 13:01:24 +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 1wPK4Z-004Ixl-0U for pgsql-hackers@lists.postgresql.org; Tue, 19 May 2026 13:01:24 +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 1wPK4X-00000000NGX-2pBR for pgsql-hackers@lists.postgresql.org; Tue, 19 May 2026 13:01:23 +0000 Received: by mail-ot1-x32d.google.com with SMTP id 46e09a7af769-7de4a9cb8eeso3512757a34.0 for ; Tue, 19 May 2026 06:01:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1779195679; cv=none; d=google.com; s=arc-20240605; b=VNvidMcUcuQK4AFDbyXoFWda+l2T+Zq+xqIsxP8xgMl62zqBE53j3Fzw1MGVHH8sqx DgNE0UMADYANbxHreJchBykKTNg+h6bGZcDHiss6FKtgwuINCkktXW6BqtremrUxEhfy h8keZ2JKvjSLKc7fmA2roI+zrXfqWyjPmNJaW79/7zCzvrbUny+DpLne16tnVJrFKetz ezpsPn5d63I9r0OZ6g3V99gAOCuwpstyNIEDgQJaEAqXDNCEYuM6k9cwQHgu9kfzwQ6Y GfQ/1SUm5D/YR6zs+EO86rb4eamhSLT/sS8AvXV1HBFqwta1PC7zbmOkediSlrQH+8vA Ft9w== 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=slDhe1bi2yOy6kv+ItkLR2ClkzdF+QKA+EW/WiOVMOc=; fh=tSgTJ1CqMK10d0mXw/BniN0VcwyI27TDQcZDNmyuyg4=; b=Zbvtbi0dW4U35IEuxPeNb3JZ1Nuvs6HfgeBan8DB3sICKkdXfQGoPmpiAbLuO27zg3 xjVVsVcUTzsz8kwbPEHDOlG+z1H77v3MQlPb+HJoaGsbqSe/U0FE4q3fIzDlf19xEVnr ImKoQtS6CZ2N4nuLxF7+7CKfRffeas1zz/AtWC0oVI6j3P+HSAajvPgJsAMajdbntIGT DfF2DfUwfZrip/o5e+EvML28lkU2npMEE0vj5iDy7SyaTp1lCB0dx0Vnit6SUE+yAjFU No1JDQ9X9+mT/TCcKPYUx3qFliH6OwjGdLzQDo7LOk6CNuOhCi9EaUU9qwVcBuulv7GE 2Ymg==; 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=1779195679; x=1779800479; 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=slDhe1bi2yOy6kv+ItkLR2ClkzdF+QKA+EW/WiOVMOc=; b=svXY38m6Mo6BX1zsnsue1qNamoCVqCzBGSUfJbn/alDI7Tfbbiw0rh0cFED0PXre0X 58P+a/O7Y9EVy8ZAMTxbcc6Yjgk3ctctc9+qME5Yr5RjHke58Co9ds+dkGtnxQHHMhGH xADt4AGkIvSsEmnNBzjlkE3sZx4gy1+dG5f7pVFWtSSRrMYCI8IiSF8lf3RtEEj75EiX v2/dexWH/m1oCMTP7XkBvV3JiFTq55x8kyHuLYSb5fGPJXHKW2es9P/QEZrEpJOnY3K1 9Jb7A5A70jjK1GFrAhzGp1Fc3wSnJR0La8IFI8VzGBr3j57f8I1fFS3w87xiE7WVU5Ba Cb2A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779195679; x=1779800479; 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=slDhe1bi2yOy6kv+ItkLR2ClkzdF+QKA+EW/WiOVMOc=; b=lpYxh4DtjF+qindVNYTHI1CNXqpG6l/5qiLWxSprbEnGus1MLjU8aCGrJ7UIHMQpIT 6w0bH7HUy/1albztDqZZVNqKLd4pUeOh8LL9KuIavsA9DTTkMAziQ5FIDvgFyjOCFsJi S3vuhPbj9Fiuv6n2lHEofs3ca/th9GzMdUkeGMBt+Ds9dkoX0h7jzycwDAAai9c3m4aR hJ3o0G0BEn5IWUZVcjoIBTNo7fn9wKNMiGbTLQBTJ08qvwzncl6Pks8zYQ0inAA+Ea4c olUEX2y8zif/TWPHoqAzGmUp5xnwfkQI9bSfR47O5NXzbSfoFGC6NgdeXGaLhDWLEI0Z z2cg== X-Forwarded-Encrypted: i=1; AFNElJ+sL//MBpNxRRBsJvo99/TJU8JUHUDj+il87gGdkluq+wAsqkI9rLNPqohTXNSXod2Vk1+DAoS1oM7t62CN@lists.postgresql.org X-Gm-Message-State: AOJu0YwfxQX9j/u93CBcbT+0QK42o7/d2pqIiQjqwUrutpTISnGGmg1V Gj+wcFUrnQhAHAOmvNrCnctWaRSfFlYPmMoUIQbr4fyUtUnS+lqqYxPQtWplIxO9PO6XOT6TN6Y icAKxGj2AKEYsUH+q3hZp7mwD6ql14DU= X-Gm-Gg: Acq92OF6nfuEPIAIhKTt1Tl+YN0UYWDTjuyywp3GVoQ13TRUILRZIJmsqiMZ/TLxdpW qRAf6iSah05owZn1TvqEKna3WV5lyviKF4FyAJDS43OIXc9fJ5XrR06VAI3T2gmVox2wOn4rukY TxiyvblSRr8vxNmIWzed3Us/n5MY/7U8/JgHRvaXVUDO/08cNopxmqPfYHrB5UNWdGM+Hn54F9w 9e8bnW8oAem8YLS/k8H3ar6jrUMQd6NhZXD4QiiF5izDsTw9e258i/KzpJhoahek4cpaWrZCd1f BxxtGNrrChQWZ7DHCAWpFTbslOlogvfPjc79tJ4lLg2bBNcngc+Jr3JHwLvaluv/1SPhA1B31pk ZYmRzIZ1wuE/kZtjfJy1W6iddeGZnnlhE2kRaz+q0 X-Received: by 2002:a05:6830:3c10:b0:7d9:d2b6:1568 with SMTP id 46e09a7af769-7e4f2b3e8ccmr13750881a34.17.1779195671654; Tue, 19 May 2026 06:01:11 -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 16:00:58 +0300 X-Gm-Features: AVHnY4KBN2ehzkj39PwpFu3RGFprMYWvis45ZDWtvl2loVA81luNSFaQCDn8NuU 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="000000000000ff450806522b45c4" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ff450806522b45c4 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, Alexander. On Mon, May 18, 2026 at 11:06=E2=80=AFPM Alexander Pyhalov wrote: > Hi. I am a bit confused about this comment (and code): > > /* > * DirectModify on a foreign join: pass NIL/0 for > the function > * metadata. We don't currently push function > RTEs through the > * direct-modify path, so there are no whole-row > Vars pointing at > * function-RTE tuples to reconstruct. > */ > tupdesc =3D get_tupdesc_for_join_scan_tuples(node= , > NIL, 0); > > We evidently go through this code path when executing example > > UPDATE remote_tbl r SET b=3D5 FROM UNNEST(array[box '((2,3),(-2,-3))']) A= S > t (bx) WHERE r.a =3D area(t.bx) > RETURNING a,b; > > But don't need whole row var in returning list.... However, we still can > step on this issue. Yes, we go through this code path, and it works as long as whole-row var is not needed. > UPDATE remote_tbl r SET b=3D5 FROM UNNEST(array[box '((2,3),(-2,-3))'], > array[int '1']) AS t (bx, i) WHERE r.a =3D area(t.bx) > RETURNING a,b,t; > > ERROR: input of anonymous composite types is not implemented > CONTEXT: whole-row reference to foreign table "t" But if whole row var is actually used, then the assumption is broken. So, we need to build a whole-row var anyway. I've fixed this in the attached patch, and added your sample query as a regression test case. ------ Regards, Alexander Korotkov Supabase --000000000000ff450806522b45c4 Content-Type: application/octet-stream; name="v6-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign-.patch" Content-Disposition: attachment; filename="v6-0001-postgres_fdw-push-down-FUNCTION-RTE-into-foreign-.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mpcn5cfu0 RnJvbSAwMzk5ODk1NTNlZTVkYWNiOTQ0ODM5ZmZjN2E5MmExOWM2NjEwZjVjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBbGV4YW5kZXIgS29yb3Rrb3YgPGFrb3JvdGtvdkBwb3N0Z3Jl c3FsLm9yZz4KRGF0ZTogU3VuLCAxMCBNYXkgMjAyNiAxNzoxNToyMSArMDMwMApTdWJqZWN0OiBb UEFUQ0ggdjZdIHBvc3RncmVzX2ZkdzogcHVzaCBkb3duIEZVTkNUSU9OIFJURSBpbnRvIGZvcmVp Z24gam9pbnMKCkEgZm9yZWlnbiBqb2luIHBsYW5uaW5nIGhvb2sgbm93IGNvbnNpZGVycyBhIChm b3JlaWduLXRhYmxlIHggZnVuY3Rpb24tUlRFKQpJTk5FUiBqb2luIGFzIGEgcHVzaC1kb3duIGNh bmRpZGF0ZSB3aGVuIHRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGlzCklNTVVUQUJMRSBhbmQgb3Ro ZXJ3aXNlIHNoaXBwYWJsZS4gIFRoZSByZW1vdGUgcXVlcnkgYWJzb3JicyB0aGUgZnVuY3Rpb24K Y2FsbCBhcyBhIEZST00tbGlzdCBpdGVtIChlLmcuIHVubmVzdCguLi4pIEFTIGY8cnRpPihjMSwg YzIsIC4uLikpLCBzbyB0aGUKZm9yZWlnbiBzaWRlIHJldHVybnMgb25seSByb3dzIHRoYXQgbWF0 Y2ggdGhlIGZ1bmN0aW9uLXByb2R1Y2VkIHNldCBhbmQgdGhlCmpvaW4gZXhlY3V0ZXMgZW50aXJl bHkgb24gdGhlIHJlbW90ZS4KCkFuIElNTVVUQUJMRSBmdW5jdGlvbiBnaXZlcyB0aGUgc2FtZSBy ZXN1bHQgb24gYW55IHNlcnZlciwgc28gdGhlIHNhbWUKZnVuY3Rpb24gUlRFIGNhbiBiZSBhIHB1 c2gtZG93biBjYW5kaWRhdGUgZm9yIHNldmVyYWwgZGlzdGluY3QgZm9yZWlnbgpzZXJ2ZXJzIHdp dGhvdXQgc2VtYW50aWMgcmlzay4gIFRvIGtlZXAgdGhlIHBsYW5uZXIgc3RhdGUgY29uc2lzdGVu dAphY3Jvc3MgdGhvc2UgaW5kZXBlbmRlbnQgYXR0ZW1wdHMsIHRoZSBwZXItY2FsbCBzdHViIGZw aW5mbyBmb3IgdGhlCmZ1bmN0aW9uIHNpZGUgbGl2ZXMgb24gdGhlIGpvaW5yZWwncyBQZ0Zkd1Jl bGF0aW9uSW5mbyAobmV3Cm91dGVyX2Z1bmNfZnBpbmZvIC8gaW5uZXJfZnVuY19mcGluZm8pLCBu ZXZlciBvbiB0aGUgZnVuY3Rpb24gcmVsIGl0c2VsZiwKYW5kIHRoZSBmdW5jdGlvbiBzaWRlIGlz IGRldGVjdGVkIHZpYSBydGVraW5kIHJhdGhlciB0aGFuIGZkd19wcml2YXRlLgoKc2V0X2ZvcmVp Z25fcmVsX3Byb3BlcnRpZXMoKSBwcm9wYWdhdGVzIGZkd3JvdXRpbmUgb250byBhIGpvaW5yZWwg dGhhdApwYWlycyBhIGZvcmVpZ24gcmVsIHdpdGggYW4gUlRFX0ZVTkNUSU9OIHJlbCBzbyBHZXRG b3JlaWduSm9pblBhdGhzIGdldHMKY2FsbGVkOyB0aGUgRkRXIHJldGFpbnMgZnVsbCBjb250cm9s IG92ZXIgd2hldGhlciB0byBhY3R1YWxseSBnZW5lcmF0ZSBhCnBhdGguICBkZXBhcnNlUmFuZ2VU YmxSZWYgYW5kIGRlcGFyc2VDb2x1bW5SZWYgZ2FpbiBhIEZVTkNUSU9OLVJURSBicmFuY2gKdGhh dCBlbWl0cyB0aGUgZnVuY3Rpb24gZXhwcmVzc2lvbiBhbmQgcmVzb2x2ZXMgVmFycyB0byB0aGUg Z2VuZXJhdGVkCmNvbHVtbiBhbGlhc2VzLgotLS0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L2RlcGFy c2UuYyAgICAgICAgICAgICAgICB8IDEyMiArKysrLQogLi4uL3Bvc3RncmVzX2Zkdy9leHBlY3Rl ZC9wb3N0Z3Jlc19mZHcub3V0ICAgIHwgNDE3ICsrKysrKysrKysrKysrKysKIGNvbnRyaWIvcG9z dGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jICAgICAgICAgICB8IDQ1NSArKysrKysrKysrKysrKysr Ky0KIGNvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5oICAgICAgICAgICB8ICAxMCAr CiBjb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNxbCAgICAgfCAxNzMgKysr KysrKwogc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvcmVsbm9kZS5jICAgICAgICAgIHwgIDI0 ICsKIDYgZmlsZXMgY2hhbmdlZCwgMTE3NyBpbnNlcnRpb25zKCspLCAyNCBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMgYi9jb250cmliL3Bv c3RncmVzX2Zkdy9kZXBhcnNlLmMKaW5kZXggMmRjYzZjOGFmMWIuLmY0MGZlNTJlYTViIDEwMDY0 NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9kZXBhcnNlLmMKKysrIGIvY29udHJpYi9wb3N0 Z3Jlc19mZHcvZGVwYXJzZS5jCkBAIC0xMTIsNiArMTEyLDcgQEAgdHlwZWRlZiBzdHJ1Y3QgZGVw YXJzZV9leHByX2N4dAogCQlhcHBlbmRTdHJpbmdJbmZvKChidWYpLCAiJXMlZC4iLCBSRUxfQUxJ QVNfUFJFRklYLCAodmFybm8pKQogI2RlZmluZSBTVUJRVUVSWV9SRUxfQUxJQVNfUFJFRklYCSJz IgogI2RlZmluZSBTVUJRVUVSWV9DT0xfQUxJQVNfUFJFRklYCSJjIgorI2RlZmluZSBGVU5DVElP Tl9SRUxfQUxJQVNfUFJFRklYCSJmIgogCiAvKgogICogRnVuY3Rpb25zIHRvIGRldGVybWluZSB3 aGV0aGVyIGFuIGV4cHJlc3Npb24gY2FuIGJlIGV2YWx1YXRlZCBzYWZlbHkgb24KQEAgLTIwMzAs NiArMjAzMSw3MiBAQCBkZXBhcnNlRnJvbUV4cHJGb3JSZWwoU3RyaW5nSW5mbyBidWYsIFBsYW5u ZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpmb3JlaWducmVsLAogCX0KIH0KIAorLyoKKyAqIERl cGFyc2UgYSBGVU5DVElPTiBSVEUgYWJzb3JiZWQgaW50byBhIGZvcmVpZ24gam9pbi4gIFRoZSBm dW5jdGlvbiBjYWxsKHMpCisgKiBhcmUgZW1pdHRlZCBhcyBhIEZST00tbGlzdCBpdGVtOgorICoK KyAqICAgPGZ1bmNleHByPiBBUyBmPHJ0aT4oYzEsIGMyLCAuLi4sIGNOKQorICoKKyAqIEZvciBt dWx0aS1mdW5jdGlvbiBSVEVzIChTUUwgUk9XUyBGUk9NIChmMSgpLCBmMigpLCAuLi4pKSwgZWFj aAorICogZnVuY3Rpb24gY2FsbCBhcHBlYXJzIGNvbW1hLXNlcGFyYXRlZCBpbnNpZGUgUk9XUyBG Uk9NKC4uLikuICBDb2x1bW4KKyAqIGFsaWFzZXMgYzEuLmNOIGNvdmVyIHRoZSB1bmlvbiBvZiBl dmVyeSBmdW5jdGlvbidzIGNvbHVtbnMsIGluIHRoZQorICogb3JkZXIgdGhleSBhcHBlYXI7IHRo YXQgbWF0Y2hlcyB0aGUgY29sdW1uIG9yZGVyaW5nIG9mIHRoZSBSVEUuCisgKi8KK3N0YXRpYyB2 b2lkCitkZXBhcnNlRnVuY3Rpb25SYW5nZVRibFJlZihTdHJpbmdJbmZvIGJ1ZiwgUGxhbm5lcklu Zm8gKnJvb3QsCisJCQkJCQkgICBSZWxPcHRJbmZvICpmb3JlaWducmVsLCBSZWxPcHRJbmZvICpz Y2FucmVsLAorCQkJCQkJICAgTGlzdCAqKnBhcmFtc19saXN0KQoreworCVJhbmdlVGJsRW50cnkg KnJ0ZSA9IHBsYW5uZXJfcnRfZmV0Y2goZm9yZWlnbnJlbC0+cmVsaWQsIHJvb3QpOworCWRlcGFy c2VfZXhwcl9jeHQgY29udGV4dDsKKwlMaXN0Q2VsbCAgICpsYzsKKwlib29sCQltdWx0aV9mdW5j OworCWludAkJCXRvdGFsX2NvbHMgPSAwOworCWludAkJCWk7CisKKwlBc3NlcnQocnRlLT5ydGVr aW5kID09IFJURV9GVU5DVElPTik7CisJQXNzZXJ0KCFydGUtPmZ1bmNvcmRpbmFsaXR5KTsKKwlB c3NlcnQobGlzdF9sZW5ndGgocnRlLT5mdW5jdGlvbnMpID49IDEpOworCisJbXVsdGlfZnVuYyA9 IGxpc3RfbGVuZ3RoKHJ0ZS0+ZnVuY3Rpb25zKSA+IDE7CisKKwljb250ZXh0LmJ1ZiA9IGJ1ZjsK Kwljb250ZXh0LnJvb3QgPSByb290OworCWNvbnRleHQuZm9yZWlnbnJlbCA9IHNjYW5yZWw7CisJ Y29udGV4dC5zY2FucmVsID0gc2NhbnJlbDsKKwljb250ZXh0LnBhcmFtc19saXN0ID0gcGFyYW1z X2xpc3Q7CisKKwlpZiAobXVsdGlfZnVuYykKKwkJYXBwZW5kU3RyaW5nSW5mb1N0cmluZyhidWYs ICJST1dTIEZST00gKCIpOworCisJZm9yZWFjaChsYywgcnRlLT5mdW5jdGlvbnMpCisJeworCQlS YW5nZVRibEZ1bmN0aW9uICpydGZ1bmMgPSAoUmFuZ2VUYmxGdW5jdGlvbiAqKSBsZmlyc3QobGMp OworCisJCWlmIChmb3JlYWNoX2N1cnJlbnRfaW5kZXgobGMpID4gMCkKKwkJCWFwcGVuZFN0cmlu Z0luZm9TdHJpbmcoYnVmLCAiLCAiKTsKKwkJZGVwYXJzZUV4cHIoKEV4cHIgKikgcnRmdW5jLT5m dW5jZXhwciwgJmNvbnRleHQpOworCQl0b3RhbF9jb2xzICs9IHJ0ZnVuYy0+ZnVuY2NvbGNvdW50 OworCX0KKworCWlmIChtdWx0aV9mdW5jKQorCQlhcHBlbmRTdHJpbmdJbmZvQ2hhcihidWYsICcp Jyk7CisKKwkvKiBBbGlhcyArIGdlbmVyYXRlZCBjb2x1bW4tbmFtZSBsaXN0LiAqLworCWFwcGVu ZFN0cmluZ0luZm8oYnVmLCAiICVzJWQiLCBGVU5DVElPTl9SRUxfQUxJQVNfUFJFRklYLCBmb3Jl aWducmVsLT5yZWxpZCk7CisJaWYgKHRvdGFsX2NvbHMgPiAwKQorCXsKKwkJYXBwZW5kU3RyaW5n SW5mb0NoYXIoYnVmLCAnKCcpOworCQlmb3IgKGkgPSAxOyBpIDw9IHRvdGFsX2NvbHM7IGkrKykK KwkJeworCQkJaWYgKGkgPiAxKQorCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiLCAi KTsKKwkJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZCIsIFNVQlFVRVJZX0NPTF9BTElBU19Q UkVGSVgsIGkpOworCQl9CisJCWFwcGVuZFN0cmluZ0luZm9DaGFyKGJ1ZiwgJyknKTsKKwl9Cit9 CisKIC8qCiAgKiBBcHBlbmQgRlJPTSBjbGF1c2UgZW50cnkgZm9yIHRoZSBnaXZlbiByZWxhdGlv biBpbnRvIGJ1Zi4KICAqIENvbmRpdGlvbnMgZnJvbSBsb3dlci1sZXZlbCBTRU1JLUpPSU5zIGFy ZSBhcHBlbmRlZCB0byBhZGRpdGlvbmFsX2NvbmRzCkBAIC0yMDQwLDcgKzIxMDcsMjIgQEAgZGVw YXJzZVJhbmdlVGJsUmVmKFN0cmluZ0luZm8gYnVmLCBQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0 SW5mbyAqZm9yZWlnbnJlbCwKIAkJCQkgICBib29sIG1ha2Vfc3VicXVlcnksIEluZGV4IGlnbm9y ZV9yZWwsIExpc3QgKippZ25vcmVfY29uZHMsCiAJCQkJICAgTGlzdCAqKmFkZGl0aW9uYWxfY29u ZHMsIExpc3QgKipwYXJhbXNfbGlzdCkKIHsKLQlQZ0Zkd1JlbGF0aW9uSW5mbyAqZnBpbmZvID0g KFBnRmR3UmVsYXRpb25JbmZvICopIGZvcmVpZ25yZWwtPmZkd19wcml2YXRlOworCVBnRmR3UmVs YXRpb25JbmZvICpmcGluZm87CisKKwkvKgorCSAqIEZvciBhIGZ1bmN0aW9uIFJURSBhYnNvcmJl ZCBpbnRvIGEgZm9yZWlnbiBqb2luLCBkZXBhcnNlIHRoZSBmdW5jdGlvbgorCSAqIGV4cHJlc3Np b24gYXMgYSBGUk9NLWxpc3QgaXRlbSBhbmQgcmV0dXJuLiAgVGhlIHN0dWIgZnBpbmZvIHNldCB1 cCBieQorCSAqIGZvcmVpZ25fam9pbl9vaygpIG1heSBvciBtYXkgbm90IGJlIHByZXNlbnQgaGVy ZS4KKwkgKi8KKwlpZiAoZm9yZWlnbnJlbC0+cnRla2luZCA9PSBSVEVfRlVOQ1RJT04pCisJewor CQlBc3NlcnQoIW1ha2Vfc3VicXVlcnkpOworCQlkZXBhcnNlRnVuY3Rpb25SYW5nZVRibFJlZihi dWYsIHJvb3QsIGZvcmVpZ25yZWwsIGZvcmVpZ25yZWwsCisJCQkJCQkJCSAgIHBhcmFtc19saXN0 KTsKKwkJcmV0dXJuOworCX0KKworCWZwaW5mbyA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmb3Jl aWducmVsLT5mZHdfcHJpdmF0ZTsKIAogCS8qIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiB0aGVz ZSBjYXNlcy4gKi8KIAlBc3NlcnQoSVNfU0lNUExFX1JFTChmb3JlaWducmVsKSB8fCBJU19KT0lO X1JFTChmb3JlaWducmVsKSk7CkBAIC0yNzEyLDYgKzI3OTQsNDQgQEAgc3RhdGljIHZvaWQKIGRl cGFyc2VDb2x1bW5SZWYoU3RyaW5nSW5mbyBidWYsIGludCB2YXJubywgaW50IHZhcmF0dG5vLCBS YW5nZVRibEVudHJ5ICpydGUsCiAJCQkJIGJvb2wgcXVhbGlmeV9jb2wpCiB7CisJLyoKKwkgKiBG dW5jdGlvbiBSVEUgY29sdW1uczogZW1pdCBhcyBmPHZhcm5vPi5jPHZhcmF0dG5vPiwgbWF0Y2hp bmcgdGhlCisJICogYWxpYXNlcyBnZW5lcmF0ZWQgYnkgZGVwYXJzZUZ1bmN0aW9uUmFuZ2VUYmxS ZWYoKS4gIEEgd2hvbGUtcm93IFZhcgorCSAqICh2YXJhdHRubyA9PSAwKSBpcyByZW5kZXJlZCBh cyBST1coZjx2YXJubz4uYzEsIC4uLiwgZjx2YXJubz4uYzxOPikKKwkgKiB3aGVyZSBOIGlzIHRo ZSB0b3RhbCBjb2x1bW4gY291bnQgb2YgdGhlIGZ1bmN0aW9uIFJURSAoaW5jbHVkaW5nIGFsbAor CSAqIFJPV1MgRlJPTSAoLi4uKSBtZW1iZXJzKS4gIFN5c3RlbSBhdHRyaWJ1dGVzIHN1Y2ggYXMg Y3RpZCBoYXZlIG5vCisJICogbWVhbmluZyBmb3IgZnVuY3Rpb24gUlRFcyBhbmQgYXJlIHJlamVj dGVkLgorCSAqLworCWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OKQorCXsKKwkJaWYg KHZhcmF0dG5vID09IDApCisJCXsKKwkJCWludAkJCW5jb2xzID0gbGlzdF9sZW5ndGgocnRlLT5l cmVmLT5jb2xuYW1lcyk7CisJCQlpbnQJCQlpOworCisJCQlhcHBlbmRTdHJpbmdJbmZvU3RyaW5n KGJ1ZiwgIlJPVygiKTsKKwkJCWZvciAoaSA9IDE7IGkgPD0gbmNvbHM7IGkrKykKKwkJCXsKKwkJ CQlpZiAoaSA+IDEpCisJCQkJCWFwcGVuZFN0cmluZ0luZm9TdHJpbmcoYnVmLCAiLCAiKTsKKwkJ CQlhcHBlbmRTdHJpbmdJbmZvKGJ1ZiwgIiVzJWQuJXMlZCIsCisJCQkJCQkJCSBGVU5DVElPTl9S RUxfQUxJQVNfUFJFRklYLCB2YXJubywKKwkJCQkJCQkJIFNVQlFVRVJZX0NPTF9BTElBU19QUkVG SVgsIGkpOworCQkJfQorCQkJYXBwZW5kU3RyaW5nSW5mb0NoYXIoYnVmLCAnKScpOworCQkJcmV0 dXJuOworCQl9CisKKwkJaWYgKHZhcmF0dG5vIDwgMCkKKwkJCWVsb2coRVJST1IsCisJCQkJICJz eXN0ZW0gYXR0cmlidXRlIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uIFJURSBpcyBub3Qgc3VwcG9y dGVkIGluIGZvcmVpZ24gam9pbiBwdXNoZG93biIpOworCisJCWlmIChxdWFsaWZ5X2NvbCkKKwkJ CWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZC4iLCBGVU5DVElPTl9SRUxfQUxJQVNfUFJFRklY LCB2YXJubyk7CisJCWFwcGVuZFN0cmluZ0luZm8oYnVmLCAiJXMlZCIsIFNVQlFVRVJZX0NPTF9B TElBU19QUkVGSVgsIHZhcmF0dG5vKTsKKwkJcmV0dXJuOworCX0KKwogCS8qIFdlIHN1cHBvcnQg ZmV0Y2hpbmcgdGhlIHJlbW90ZSBzaWRlJ3MgQ1RJRCBhbmQgT0lELiAqLwogCWlmICh2YXJhdHRu byA9PSBTZWxmSXRlbVBvaW50ZXJBdHRyaWJ1dGVOdW1iZXIpCiAJewpkaWZmIC0tZ2l0IGEvY29u dHJpYi9wb3N0Z3Jlc19mZHcvZXhwZWN0ZWQvcG9zdGdyZXNfZmR3Lm91dCBiL2NvbnRyaWIvcG9z dGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVzX2Zkdy5vdXQKaW5kZXggZTkwMjg5ZTRhYjEuLjM0 MmVlZmJiOWNjIDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3RncmVzX2Zkdy9leHBlY3RlZC9wb3N0 Z3Jlc19mZHcub3V0CisrKyBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L2V4cGVjdGVkL3Bvc3RncmVz X2Zkdy5vdXQKQEAgLTI4ODUsNiArMjg4NSw0MjMgQEAgU0VMRUNUIHQxLmMxLCB0Mi5jMiBGUk9N 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 ICAgIFFVRVJZIFBMQU4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCistLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLQorIFNvcnQKKyAgIE91dHB1dDogKCh0LiopOjp0ZXh0KSwgci5hCisgICBT b3J0IEtleTogci5hCisgICAtPiAgRm9yZWlnbiBTY2FuCisgICAgICAgICBPdXRwdXQ6ICh0Liop Ojp0ZXh0LCByLmEKKyAgICAgICAgIFJlbGF0aW9uczogKHB1YmxpYy5yZW1vdGVfdGJsIHIpIElO TkVSIEpPSU4gKEZ1bmN0aW9uIHQpCisgICAgICAgICBSZW1vdGUgU1FMOiBTRUxFQ1QgUk9XKGYy LmMxLCBmMi5jMiksIHIxLmEgRlJPTSAocHVibGljLmJhc2VfdGJsX2ZuIHIxIElOTkVSIEpPSU4g Uk9XUyBGUk9NICh1bm5lc3QoJ3szLDYsOX0nOjppbnRlZ2VyW10pLCBnZW5lcmF0ZV9zZXJpZXMo MTEsIDEzKSkgZjIoYzEsIGMyKSBPTiAoKChyMS5hID0gZjIuYzEpKSkpCisoNyByb3dzKQorCitT RUxFQ1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVtb3RlX3RibCByLCBST1dTIEZST00gKHVubmVz dChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVy YXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5uIE9SREVSIEJZ IHIuYTsKKyAgIHQgICAgfCBhIAorLS0tLS0tLS0rLS0tCisgKDMsMTEpIHwgMworICg2LDEyKSB8 IDYKKyAoOSwxMykgfCA5CisoMyByb3dzKQorCitSRVNFVCBlbmFibGVfaGFzaGpvaW47CitSRVNF VCBlbmFibGVfbWVyZ2Vqb2luOworUkVTRVQgZW5hYmxlX25lc3Rsb29wOworLS0gVm9sYXRpbGUg ZnVuY3Rpb24gaW4gUk9XUyBGUk9NIGRpc3F1YWxpZmllcyB0aGUgd2hvbGUgUlRFLgorRVhQTEFJ TiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSBGUk9NIHJlbW90ZV90YmwgciwKKyAg ICAgICAgICAgICAgICBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAg ICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpZXMoMSwgNCArIChyYW5kb20oKSAqIDAp OjppbnQpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5uOworICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFVRVJZIFBMQU4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBNZXJnZSBKb2luCisgICBPdXRwdXQ6IHIuYQorICAgTWVy Z2UgQ29uZDogKHQubiA9IHIuYSkKKyAgIC0+ICBTb3J0CisgICAgICAgICBPdXRwdXQ6IHQubgor ICAgICAgICAgU29ydCBLZXk6IHQubgorICAgICAgICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gdAor ICAgICAgICAgICAgICAgT3V0cHV0OiB0Lm4KKyAgICAgICAgICAgICAgIEZ1bmN0aW9uIENhbGw6 IHVubmVzdCgnezMsNiw5fSc6OmludGVnZXJbXSksIGdlbmVyYXRlX3NlcmllcygxLCAoNCArICgo cmFuZG9tKCkgKiAnMCc6OmRvdWJsZSBwcmVjaXNpb24pKTo6aW50ZWdlcikpCisgICAtPiAgU29y dAorICAgICAgICAgT3V0cHV0OiByLmEKKyAgICAgICAgIFNvcnQgS2V5OiByLmEKKyAgICAgICAg IC0+ICBGb3JlaWduIFNjYW4gb24gcHVibGljLnJlbW90ZV90YmwgcgorICAgICAgICAgICAgICAg T3V0cHV0OiByLmEKKyAgICAgICAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhIEZST00gcHVi bGljLmJhc2VfdGJsX2ZuCisoMTUgcm93cykKKworLS0gTEFURVJBTCBmdW5jdGlvbiByZWZlcmVu Y2luZyBhIGZvcmVpZ24gVmFyOiBwb3N0Z3Jlc19mZHcncworLS0gZm9yZWlnbi1qb2luIHB1c2hk b3duIHJlamVjdHMgdGhpcyB2aWEgdGhlIGpvaW5yZWwtPmxhdGVyYWxfcmVsaWRzCistLSBjaGVj azsgdGhlIHBsYW4gaXMgdGhlcmVmb3JlIGEgbG9jYWwgTmVzdExvb3AgKyBGdW5jdGlvblNjYW4u CitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qgci5hLCB0LnggRlJPTSByZW1v dGVfdGJsIHIsIExBVEVSQUwgdW5uZXN0KGFycmF5W3IuYV0pIEFTIHQoeCkKK1dIRVJFIHIuYSA8 PSAzIE9SREVSIEJZIHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBOZXN0ZWQgTG9v cAorICAgT3V0cHV0OiByLmEsIHQueAorICAgLT4gIEZvcmVpZ24gU2NhbiBvbiBwdWJsaWMucmVt b3RlX3RibCByCisgICAgICAgICBPdXRwdXQ6IHIuYSwgci5iCisgICAgICAgICBSZW1vdGUgU1FM OiBTRUxFQ1QgYSBGUk9NIHB1YmxpYy5iYXNlX3RibF9mbiBXSEVSRSAoKGEgPD0gMykpIE9SREVS IEJZIGEgQVNDIE5VTExTIExBU1QKKyAgIC0+ICBGdW5jdGlvbiBTY2FuIG9uIHBnX2NhdGFsb2cu dW5uZXN0IHQKKyAgICAgICAgIE91dHB1dDogdC54CisgICAgICAgICBGdW5jdGlvbiBDYWxsOiB1 bm5lc3QoQVJSQVlbci5hXSkKKyg4IHJvd3MpCisKKy0tIE91dGVyIGpvaW5zIHdpdGggdGhlIGZ1 bmN0aW9uIFJURSBhcmUgbm90IHB1c2hlZCBkb3duIChvbmx5IElOTkVSCistLSBqb2lucyBhcmUg c3VwcG9ydGVkIGJ5IGZ1bmN0aW9uX3J0ZV9wdXNoZG93bl9vaygpKS4KK0VYUExBSU4gKFZFUkJP U0UsIENPU1RTIE9GRikKK1NFTEVDVCByLmEsIHQubiBGUk9NIHJlbW90ZV90YmwgcgorICAgICBM RUZUIEpPSU4gdW5uZXN0KGFycmF5WzEsIDIsIDNdKSBBUyB0KG4pIE9OIHIuYSA9IHQubgorIFdI RVJFIHIuYSA8PSA1IE9SREVSIEJZIHIuYTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBRVUVSWSBQTEFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBN ZXJnZSBMZWZ0IEpvaW4KKyAgIE91dHB1dDogci5hLCB0Lm4KKyAgIE1lcmdlIENvbmQ6IChyLmEg PSB0Lm4pCisgICAtPiAgRm9yZWlnbiBTY2FuIG9uIHB1YmxpYy5yZW1vdGVfdGJsIHIKKyAgICAg ICAgIE91dHB1dDogci5hLCByLmIKKyAgICAgICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhIEZST00g cHVibGljLmJhc2VfdGJsX2ZuIFdIRVJFICgoYSA8PSA1KSkgT1JERVIgQlkgYSBBU0MgTlVMTFMg TEFTVAorICAgLT4gIFNvcnQKKyAgICAgICAgIE91dHB1dDogdC5uCisgICAgICAgICBTb3J0IEtl eTogdC5uCisgICAgICAgICAtPiAgRnVuY3Rpb24gU2NhbiBvbiBwZ19jYXRhbG9nLnVubmVzdCB0 CisgICAgICAgICAgICAgICBPdXRwdXQ6IHQubgorICAgICAgICAgICAgICAgRnVuY3Rpb24gQ2Fs bDogdW5uZXN0KCd7MSwyLDN9Jzo6aW50ZWdlcltdKQorKDEyIHJvd3MpCisKKy0tIFNFTUkgam9p biAoRVhJU1RTKSB3aXRoIGEgZnVuY3Rpb24gUlRFIGlzIGFsc28gbm90IHB1c2hlZCBkb3duLgor RVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSBGUk9NIHJlbW90ZV90Ymwg cgorIFdIRVJFIEVYSVNUUyAoU0VMRUNUIDEgRlJPTSB1bm5lc3QoYXJyYXlbMywgNiwgOV0pIEFT IHQobikgV0hFUkUgdC5uID0gci5hKQorIE9SREVSIEJZIHIuYTsKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgUVVFUlkgUExBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIE1lcmdlIFNlbWkgSm9pbgorICAgT3V0 cHV0OiByLmEKKyAgIE1lcmdlIENvbmQ6IChyLmEgPSB0Lm4pCisgICAtPiAgRm9yZWlnbiBTY2Fu IG9uIHB1YmxpYy5yZW1vdGVfdGJsIHIKKyAgICAgICAgIE91dHB1dDogci5hLCByLmIKKyAgICAg ICAgIFJlbW90ZSBTUUw6IFNFTEVDVCBhIEZST00gcHVibGljLmJhc2VfdGJsX2ZuIE9SREVSIEJZ IGEgQVNDIE5VTExTIExBU1QKKyAgIC0+ICBTb3J0CisgICAgICAgICBPdXRwdXQ6IHQubgorICAg ICAgICAgU29ydCBLZXk6IHQubgorICAgICAgICAgLT4gIEZ1bmN0aW9uIFNjYW4gb24gcGdfY2F0 YWxvZy51bm5lc3QgdAorICAgICAgICAgICAgICAgT3V0cHV0OiB0Lm4KKyAgICAgICAgICAgICAg IEZ1bmN0aW9uIENhbGw6IHVubmVzdCgnezMsNiw5fSc6OmludGVnZXJbXSkKKygxMiByb3dzKQor CitEUk9QIEZPUkVJR04gVEFCTEUgcmVtb3RlX3RibDsKK0RST1AgVEFCTEUgYmFzZV90YmxfZm47 CiAtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQogLS0gQ2hlY2sgdGhhdCB1c2VyaWQgdG8gdXNlIHdoZW4gcXVlcnlp bmcgdGhlIHJlbW90ZSB0YWJsZSBpcyBjb3JyZWN0bHkKIC0tIHByb3BhZ2F0ZWQgaW50byBmb3Jl aWduIHJlbHMgcHJlc2VudCBpbiBzdWJxdWVyaWVzIHVuZGVyIGFuIFVOSU9OIEFMTApkaWZmIC0t Z2l0IGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmMgYi9jb250cmliL3Bvc3Rn cmVzX2Zkdy9wb3N0Z3Jlc19mZHcuYwppbmRleCAwYTU4OWY4ZGI3NC4uOWNiNmExNzcyZDkgMTAw NjQ0Ci0tLSBhL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCisrKyBiL2NvbnRy aWIvcG9zdGdyZXNfZmR3L3Bvc3RncmVzX2Zkdy5jCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVk ZSAibm9kZXMvbWFrZWZ1bmNzLmgiCiAjaW5jbHVkZSAibm9kZXMvbm9kZUZ1bmNzLmgiCiAjaW5j bHVkZSAib3B0aW1pemVyL2FwcGVuZGluZm8uaCIKKyNpbmNsdWRlICJvcHRpbWl6ZXIvY2xhdXNl cy5oIgogI2luY2x1ZGUgIm9wdGltaXplci9jb3N0LmgiCiAjaW5jbHVkZSAib3B0aW1pemVyL2lu aGVyaXQuaCIKICNpbmNsdWRlICJvcHRpbWl6ZXIvb3B0aW1pemVyLmgiCkBAIC04OCw2ICs4OSwy MiBAQCBlbnVtIEZkd1NjYW5Qcml2YXRlSW5kZXgKIAkgKiBvZiBqb2luLCBhZGRlZCB3aGVuIHRo ZSBzY2FuIGlzIGpvaW4KIAkgKi8KIAlGZHdTY2FuUHJpdmF0ZVJlbGF0aW9ucywKKworCS8qCisJ ICogTGlzdCBvZiBwZXItUlRFIGZ1bmN0aW9uIG1ldGFkYXRhLCBpbmRleGVkIGJ5IGJhc2UgUlRJ IG9mZnNldC4gIEVhY2gKKwkgKiBlbGVtZW50IGlzIGVpdGhlciBOVUxMIChmb3Igbm9uLVJURV9G VU5DVElPTiByZWxzIGluIHRoaXMgc2Nhbikgb3IgYQorCSAqIGxpc3Qgb2YgdGhyZWUtZWxlbWVu dCBsaXN0cyAoZnVuY2lkLCBmdW5jcmV0dHlwZSwgZnVuY2NvbGxhdGlvbikgLS0gb25lCisJICog aW5uZXIgbGlzdCBwZXIgZnVuY3Rpb24gaW4gdGhlIFJURS4gIEFsbG93cyB0aGUgZXhlY3V0b3Ig dG8gcmVidWlsZAorCSAqIFR1cGxlRGVzYyBlbnRyaWVzIGZvciB3aG9sZS1yb3cgcmVmZXJlbmNl cyB0byBmdW5jdGlvbiBSVEVzLgorCSAqLworCUZkd1NjYW5Qcml2YXRlRnVuY3Rpb25zLAorCisJ LyoKKwkgKiBJbnRlZ2VyIG5vZGU6IG1pbmltdW0gYmFzZSBSVCBpbmRleCBjb3ZlcmVkIGJ5IHRo ZSBzY2FuLCB1c2VkIHRvCisJICogdHJhbnNsYXRlIHNjYW4tbG9jYWwgaW5kZXhlcyB0byBlc3Rh dGUtcnRhYmxlIGluZGV4ZXMgYWZ0ZXIgc2V0cmVmcy5jCisJICogZmxhdHRlbnMgcnRhYmxlcy4K KwkgKi8KKwlGZHdTY2FuUHJpdmF0ZU1pblJUSW5kZXgsCiB9OwogCiAvKgpAQCAtMTI0LDYgKzE0 MSwxMSBAQCBlbnVtIEZkd01vZGlmeVByaXZhdGVJbmRleAogICogMikgQm9vbGVhbiBmbGFnIHNo b3dpbmcgaWYgdGhlIHJlbW90ZSBxdWVyeSBoYXMgYSBSRVRVUk5JTkcgY2xhdXNlCiAgKiAzKSBJ bnRlZ2VyIGxpc3Qgb2YgYXR0cmlidXRlIG51bWJlcnMgcmV0cmlldmVkIGJ5IFJFVFVSTklORywg aWYgYW55CiAgKiA0KSBCb29sZWFuIGZsYWcgc2hvd2luZyBpZiB3ZSBzZXQgdGhlIGNvbW1hbmQg ZXNfcHJvY2Vzc2VkCisgKiA1KSBQZXItUlRFIGZ1bmN0aW9uIG1ldGFkYXRhIChtaXJyb3JzIEZk d1NjYW5Qcml2YXRlRnVuY3Rpb25zOyBsZXRzCisgKiAgICB0aGUgZXhlY3V0b3IgcmVidWlsZCBU dXBsZURlc2MgZW50cmllcyBmb3Igd2hvbGUtcm93IFZhcnMgb3ZlcgorICogICAgZnVuY3Rpb24g UlRFcyBhYnNvcmJlZCBpbnRvIGEgZm9yZWlnbiBqb2luKQorICogNikgSW50ZWdlciBub2RlOiBt aW5pbXVtIGJhc2UgUlQgaW5kZXggb2YgdGhlIHNjYW4gKG1pcnJvcnMKKyAqICAgIEZkd1NjYW5Q cml2YXRlTWluUlRJbmRleCkKICAqLwogZW51bSBGZHdEaXJlY3RNb2RpZnlQcml2YXRlSW5kZXgK IHsKQEAgLTEzNSw2ICsxNTcsMTAgQEAgZW51bSBGZHdEaXJlY3RNb2RpZnlQcml2YXRlSW5kZXgK IAlGZHdEaXJlY3RNb2RpZnlQcml2YXRlUmV0cmlldmVkQXR0cnMsCiAJLyogc2V0LXByb2Nlc3Nl ZCBmbGFnIChhcyBhIEJvb2xlYW4gbm9kZSkgKi8KIAlGZHdEaXJlY3RNb2RpZnlQcml2YXRlU2V0 UHJvY2Vzc2VkLAorCS8qIFBlci1SVEUgZnVuY3Rpb24gbWV0YWRhdGEsIGluZGV4ZWQgYnkgYmFz ZSBSVEkgb2Zmc2V0ICovCisJRmR3RGlyZWN0TW9kaWZ5UHJpdmF0ZUZ1bmN0aW9ucywKKwkvKiBJ bnRlZ2VyIG5vZGU6IG1pbmltdW0gYmFzZSBSVCBpbmRleCBpbiB0aGUgc2NhbiAqLworCUZkd0Rp cmVjdE1vZGlmeVByaXZhdGVNaW5SVEluZGV4LAogfTsKIAogLyoKQEAgLTc0MSw2ICs3NjcsOSBA QCBzdGF0aWMgYm9vbCBmb3JlaWduX2dyb3VwaW5nX29rKFBsYW5uZXJJbmZvICpyb290LCBSZWxP cHRJbmZvICpncm91cGVkX3JlbCwKIHN0YXRpYyBMaXN0ICpnZXRfdXNlZnVsX3BhdGhrZXlzX2Zv cl9yZWxhdGlvbihQbGFubmVySW5mbyAqcm9vdCwKIAkJCQkJCQkJCQkJICBSZWxPcHRJbmZvICpy ZWwpOwogc3RhdGljIExpc3QgKmdldF91c2VmdWxfZWNzX2Zvcl9yZWxhdGlvbihQbGFubmVySW5m byAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKTsKK3N0YXRpYyBSZWxpZHMgZ2V0X2Jhc2VfcmVsaWRz KFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOworc3RhdGljIGludAlnZXRfbWlu X2Jhc2VfcnRpKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpOworc3RhdGljIExp c3QgKmdldF9mdW5jdGlvbnNfZGF0YShQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVs KTsKIHN0YXRpYyB2b2lkIGFkZF9wYXRoc193aXRoX3BhdGhrZXlzX2Zvcl9yZWwoUGxhbm5lcklu Zm8gKnJvb3QsIFJlbE9wdEluZm8gKnJlbCwKIAkJCQkJCQkJCQkJUGF0aCAqZXBxX3BhdGgsIExp c3QgKnJlc3RyaWN0bGlzdCk7CiBzdGF0aWMgdm9pZCBhZGRfZm9yZWlnbl9ncm91cGluZ19wYXRo cyhQbGFubmVySW5mbyAqcm9vdCwKQEAgLTE2MzUsOSArMTY2NCwyNiBAQCBwb3N0Z3Jlc0dldEZv cmVpZ25QbGFuKFBsYW5uZXJJbmZvICpyb290LAogCWZkd19wcml2YXRlID0gbGlzdF9tYWtlMyht YWtlU3RyaW5nKHNxbC5kYXRhKSwKIAkJCQkJCQkgcmV0cmlldmVkX2F0dHJzLAogCQkJCQkJCSBt YWtlSW50ZWdlcihmcGluZm8tPmZldGNoX3NpemUpKTsKKworCS8qCisJICogUG9zaXRpb24gRmR3 U2NhblByaXZhdGVSZWxhdGlvbnM6IGVpdGhlciB0aGUgRVhQTEFJTiByZWxhdGlvbiBzdHJpbmcK KwkgKiAoam9pbnMvdXBwZXIgcmVscykgb3IgYSBOVUxMIHBsYWNlaG9sZGVyLCBzbyB0aGF0IHN1 YnNlcXVlbnQgaW5kZXhlcworCSAqIHN0YXkgdmFsaWQgZm9yIHRoZSBiYXNlLXJlbCBzY2FuIGNh c2UuCisJICovCiAJaWYgKElTX0pPSU5fUkVMKGZvcmVpZ25yZWwpIHx8IElTX1VQUEVSX1JFTChm b3JlaWducmVsKSkKIAkJZmR3X3ByaXZhdGUgPSBsYXBwZW5kKGZkd19wcml2YXRlLAogCQkJCQkJ CSAgbWFrZVN0cmluZyhmcGluZm8tPnJlbGF0aW9uX25hbWUpKTsKKwllbHNlCisJCWZkd19wcml2 YXRlID0gbGFwcGVuZChmZHdfcHJpdmF0ZSwgTlVMTCk7CisKKwkvKgorCSAqIEZkd1NjYW5Qcml2 YXRlRnVuY3Rpb25zIC8gRmR3U2NhblByaXZhdGVNaW5SVEluZGV4IGNhcnJ5IHRoZSBtZXRhZGF0 YQorCSAqIHRoZSBleGVjdXRvciBuZWVkcyB0byByZWJ1aWxkIFR1cGxlRGVzYyBlbnRyaWVzIGZv ciB3aG9sZS1yb3cgVmFycworCSAqIHBvaW50aW5nIGF0IFJURV9GVU5DVElPTiByZWxzIGFic29y YmVkIGludG8gdGhlIGZvcmVpZ24gc2Nhbi4KKwkgKi8KKwlmZHdfcHJpdmF0ZSA9IGxhcHBlbmQo ZmR3X3ByaXZhdGUsIGdldF9mdW5jdGlvbnNfZGF0YShyb290LCBmb3JlaWducmVsKSk7CisJZmR3 X3ByaXZhdGUgPSBsYXBwZW5kKGZkd19wcml2YXRlLAorCQkJCQkJICBtYWtlSW50ZWdlcihnZXRf bWluX2Jhc2VfcnRpKHJvb3QsIGZvcmVpZ25yZWwpKSk7CiAKIAkvKgogCSAqIENyZWF0ZSB0aGUg Rm9yZWlnblNjYW4gbm9kZSBmb3IgdGhlIGdpdmVuIHJlbGF0aW9uLgpAQCAtMTY1OCw5ICsxNzA0 LDE1IEBAIHBvc3RncmVzR2V0Rm9yZWlnblBsYW4oUGxhbm5lckluZm8gKnJvb3QsCiAKIC8qCiAg KiBDb25zdHJ1Y3QgYSB0dXBsZSBkZXNjcmlwdG9yIGZvciB0aGUgc2NhbiB0dXBsZXMgaGFuZGxl ZCBieSBhIGZvcmVpZ24gam9pbi4KKyAqCisgKiAncnRmdW5jZGF0YScgaXMgdGhlIEZkd1NjYW5Q cml2YXRlRnVuY3Rpb25zIGxpc3Qgc2F2ZWQgYXQgcGxhbiB0aW1lLCBhbmQKKyAqICdydG9mZnNl dCcgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZXhlY3V0b3IncyBSVCBpbmRleGVzIGFu ZCB0aGUKKyAqIHNjYW4tbG9jYWwgUlQgaW5kZXhlcyBjYXB0dXJlZCBpbiB0aGF0IGxpc3QuICBC b3RoIG1heSBiZSAwL05JTCB3aGVuIHRoZQorICogc2NhbiBoYXMgbm8gUlRFX0ZVTkNUSU9OIGRl cGVuZGVudHMuCiAgKi8KIHN0YXRpYyBUdXBsZURlc2MKLWdldF90dXBkZXNjX2Zvcl9qb2luX3Nj YW5fdHVwbGVzKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUpCitnZXRfdHVwZGVzY19mb3Jfam9pbl9z Y2FuX3R1cGxlcyhGb3JlaWduU2NhblN0YXRlICpub2RlLAorCQkJCQkJCQkgTGlzdCAqcnRmdW5j ZGF0YSwgaW50IHJ0b2Zmc2V0KQogewogCUZvcmVpZ25TY2FuICpmc3BsYW4gPSAoRm9yZWlnblNj YW4gKikgbm9kZS0+c3MucHMucGxhbjsKIAlFU3RhdGUJICAgKmVzdGF0ZSA9IG5vZGUtPnNzLnBz LnN0YXRlOwpAQCAtMTY5NiwxMyArMTc0OCw2MiBAQCBnZXRfdHVwZGVzY19mb3Jfam9pbl9zY2Fu X3R1cGxlcyhGb3JlaWduU2NhblN0YXRlICpub2RlKQogCQlpZiAoIUlzQSh2YXIsIFZhcikgfHwg dmFyLT52YXJhdHRubyAhPSAwKQogCQkJY29udGludWU7CiAJCXJ0ZSA9IGxpc3RfbnRoKGVzdGF0 ZS0+ZXNfcmFuZ2VfdGFibGUsIHZhci0+dmFybm8gLSAxKTsKLQkJaWYgKHJ0ZS0+cnRla2luZCAh PSBSVEVfUkVMQVRJT04pCi0JCQljb250aW51ZTsKLQkJcmVsdHlwZSA9IGdldF9yZWxfdHlwZV9p ZChydGUtPnJlbGlkKTsKLQkJaWYgKCFPaWRJc1ZhbGlkKHJlbHR5cGUpKQotCQkJY29udGludWU7 Ci0JCWF0dC0+YXR0dHlwaWQgPSByZWx0eXBlOwotCQkvKiBzaG91bGRuJ3QgbmVlZCB0byBjaGFu Z2UgYW55dGhpbmcgZWxzZSAqLworCisJCWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX1JFTEFUSU9O KQorCQl7CisJCQlyZWx0eXBlID0gZ2V0X3JlbF90eXBlX2lkKHJ0ZS0+cmVsaWQpOworCQkJaWYg KCFPaWRJc1ZhbGlkKHJlbHR5cGUpKQorCQkJCWNvbnRpbnVlOworCQkJYXR0LT5hdHR0eXBpZCA9 IHJlbHR5cGU7CisJCQkvKiBzaG91bGRuJ3QgbmVlZCB0byBjaGFuZ2UgYW55dGhpbmcgZWxzZSAq LworCQl9CisJCWVsc2UgaWYgKHJ0ZS0+cnRla2luZCA9PSBSVEVfRlVOQ1RJT04gJiYgcnRmdW5j ZGF0YSAhPSBOSUwpCisJCXsKKwkJCS8qCisJCQkgKiBBIHdob2xlLXJvdyBWYXIgcG9pbnRzIGF0 IGEgRlVOQ1RJT04gUlRFIGFic29yYmVkIGludG8gdGhlCisJCQkgKiBmb3JlaWduIGpvaW4uICBT eW50aGVzaXplIGFuIGFub255bW91cyBjb21wb3NpdGUgVHVwbGVEZXNjIGZyb20KKwkJCSAqIHRo ZSBwZXItZnVuY3Rpb24gcmV0dXJuLXR5cGUgbWV0YWRhdGEgd2Ugc2F2ZWQgYXQgcGxhbiB0aW1l OworCQkJICogdGhlIGRlcGFyc2VyIGVtaXRzIHRoZXNlIGFzIFJPVyhmPHJ0aT4uYzEsIGY8cnRp Pi5jMiwgLi4uKS4KKwkJCSAqLworCQkJTGlzdAkgICAqZnVuY2RhdGE7CisJCQlUdXBsZURlc2MJ cnRlX3R1cGRlc2M7CisJCQlpbnQJCQludW1fZnVuY3M7CisJCQlpbnQJCQlhdHRudW07CisJCQlM aXN0Q2VsbCAgICpsYzEsCisJCQkJCSAgICpsYzI7CisKKwkJCWZ1bmNkYXRhID0gbGlzdF9udGgo cnRmdW5jZGF0YSwgdmFyLT52YXJubyAtIHJ0b2Zmc2V0KTsKKwkJCWlmIChmdW5jZGF0YSA9PSBO SUwpCisJCQkJY29udGludWU7CisJCQludW1fZnVuY3MgPSBsaXN0X2xlbmd0aChmdW5jZGF0YSk7 CisJCQlBc3NlcnQobnVtX2Z1bmNzID09IGxpc3RfbGVuZ3RoKHJ0ZS0+ZXJlZi0+Y29sbmFtZXMp KTsKKwkJCXJ0ZV90dXBkZXNjID0gQ3JlYXRlVGVtcGxhdGVUdXBsZURlc2MobnVtX2Z1bmNzKTsK KworCQkJYXR0bnVtID0gMTsKKwkJCWZvcmJvdGgobGMxLCBmdW5jZGF0YSwgbGMyLCBydGUtPmVy ZWYtPmNvbG5hbWVzKQorCQkJeworCQkJCUxpc3QJICAgKmZkYXRhID0gbGZpcnN0X25vZGUoTGlz dCwgbGMxKTsKKwkJCQljaGFyCSAgICpjb2xuYW1lID0gc3RyVmFsKGxmaXJzdChsYzIpKTsKKwkJ CQlPaWQJCQlmdW5jcmV0dHlwZTsKKwkJCQlPaWQJCQlmdW5jY29sbGF0aW9uOworCisJCQkJZnVu Y3JldHR5cGUgPSBsc2Vjb25kX25vZGUoSW50ZWdlciwgZmRhdGEpLT5pdmFsOworCQkJCWZ1bmNj b2xsYXRpb24gPSBsdGhpcmRfbm9kZShJbnRlZ2VyLCBmZGF0YSktPml2YWw7CisKKwkJCQlpZiAo IU9pZElzVmFsaWQoZnVuY3JldHR5cGUpIHx8IGZ1bmNyZXR0eXBlID09IFJFQ09SRE9JRCkKKwkJ CQkJZWxvZyhFUlJPUiwKKwkJCQkJCSAiY291bGQgbm90IGRldGVybWluZSByZXR1cm4gdHlwZSBm b3IgZnVuY3Rpb24gaW4gZm9yZWlnbiBzY2FuIik7CisKKwkJCQlUdXBsZURlc2NJbml0RW50cnko cnRlX3R1cGRlc2MsIChBdHRyTnVtYmVyKSBhdHRudW0sIGNvbG5hbWUsCisJCQkJCQkJCSAgIGZ1 bmNyZXR0eXBlLCAtMSwgMCk7CisJCQkJVHVwbGVEZXNjSW5pdEVudHJ5Q29sbGF0aW9uKHJ0ZV90 dXBkZXNjLCAoQXR0ck51bWJlcikgYXR0bnVtLAorCQkJCQkJCQkJCQlmdW5jY29sbGF0aW9uKTsK KwkJCQlhdHRudW0rKzsKKwkJCX0KKworCQkJYXNzaWduX3JlY29yZF90eXBlX3R5cG1vZChydGVf dHVwZGVzYyk7CisJCQlhdHQtPmF0dHR5cG1vZCA9IHJ0ZV90dXBkZXNjLT50ZHR5cG1vZDsKKwkJ fQogCX0KIAlyZXR1cm4gdHVwZGVzYzsKIH0KQEAgLTE3MzgsMTQgKzE4MzksMzAgQEAgcG9zdGdy ZXNCZWdpbkZvcmVpZ25TY2FuKEZvcmVpZ25TY2FuU3RhdGUgKm5vZGUsIGludCBlZmxhZ3MpCiAK IAkvKgogCSAqIElkZW50aWZ5IHdoaWNoIHVzZXIgdG8gZG8gdGhlIHJlbW90ZSBhY2Nlc3MgYXMu ICBUaGlzIHNob3VsZCBtYXRjaCB3aGF0Ci0JICogRXhlY0NoZWNrUGVybWlzc2lvbnMoKSBkb2Vz LgorCSAqIEV4ZWNDaGVja1Blcm1pc3Npb25zKCkgZG9lcy4gIEZvciBhIGpvaW4sIHNjYW4gdGhl IGJhc2UgcmVsaWRzIHVudGlsIHdlCisJICogZmluZCBhbiBSVEVfUkVMQVRJT04gKHRoZSBmb3Jl aWduLXRhYmxlIHNpZGUpOyBpZ25vcmUgYW55IFJURV9GVU5DVElPTgorCSAqIGFic29yYmVkIGlu dG8gdGhlIGpvaW4sIHdoaWNoIGNvbnRyaWJ1dGVzIG5vIHJlbGF0aW9uIE9JRCB0byBsb29rIHVw LgogCSAqLwogCXVzZXJpZCA9IE9pZElzVmFsaWQoZnNwbGFuLT5jaGVja0FzVXNlcikgPyBmc3Bs YW4tPmNoZWNrQXNVc2VyIDogR2V0VXNlcklkKCk7CisJcnRlID0gTlVMTDsKIAlpZiAoZnNwbGFu LT5zY2FuLnNjYW5yZWxpZCA+IDApCisJewogCQlydGluZGV4ID0gZnNwbGFuLT5zY2FuLnNjYW5y ZWxpZDsKKwkJcnRlID0gZXhlY19ydF9mZXRjaChydGluZGV4LCBlc3RhdGUpOworCX0KIAllbHNl Ci0JCXJ0aW5kZXggPSBibXNfbmV4dF9tZW1iZXIoZnNwbGFuLT5mc19iYXNlX3JlbGlkcywgLTEp OwotCXJ0ZSA9IGV4ZWNfcnRfZmV0Y2gocnRpbmRleCwgZXN0YXRlKTsKKwl7CisJCXJ0aW5kZXgg PSAtMTsKKwkJd2hpbGUgKChydGluZGV4ID0gYm1zX25leHRfbWVtYmVyKGZzcGxhbi0+ZnNfYmFz ZV9yZWxpZHMsIHJ0aW5kZXgpKSA+PSAwKQorCQl7CisJCQlydGUgPSBleGVjX3J0X2ZldGNoKHJ0 aW5kZXgsIGVzdGF0ZSk7CisJCQlpZiAocnRlICE9IE5VTEwgJiYgcnRlLT5ydGVraW5kID09IFJU RV9SRUxBVElPTikKKwkJCQlicmVhazsKKwkJCXJ0ZSA9IE5VTEw7CisJCX0KKwkJaWYgKHJ0ZSA9 PSBOVUxMKQorCQkJZWxvZyhFUlJPUiwgImNvdWxkIG5vdCBsb2NhdGUgYSBmb3JlaWduIHJlbGF0 aW9uIFJURSBpbiBmb3JlaWduIHNjYW4iKTsKKwl9CiAKIAkvKiBHZXQgaW5mbyBhYm91dCBmb3Jl aWduIHRhYmxlLiAqLwogCXRhYmxlID0gR2V0Rm9yZWlnblRhYmxlKHJ0ZS0+cmVsaWQpOwpAQCAt MTc4OCw4ICsxOTA1LDE5IEBAIHBvc3RncmVzQmVnaW5Gb3JlaWduU2NhbihGb3JlaWduU2NhblN0 YXRlICpub2RlLCBpbnQgZWZsYWdzKQogCX0KIAllbHNlCiAJeworCQlMaXN0CSAgICpydGZ1bmNk YXRhID0gKExpc3QgKikgbGlzdF9udGgoZnNwbGFuLT5mZHdfcHJpdmF0ZSwKKwkJCQkJCQkJCQkJ CSAgIEZkd1NjYW5Qcml2YXRlRnVuY3Rpb25zKTsKKwkJaW50CQkJbWluX2Jhc2VfcnRpID0gaW50 VmFsKGxpc3RfbnRoKGZzcGxhbi0+ZmR3X3ByaXZhdGUsCisJCQkJCQkJCQkJCQkgICBGZHdTY2Fu UHJpdmF0ZU1pblJUSW5kZXgpKTsKKwkJaW50CQkJcnRvZmZzZXQgPSBibXNfbmV4dF9tZW1iZXIo ZnNwbGFuLT5mc19iYXNlX3JlbGlkcywgLTEpIC0KKwkJCW1pbl9iYXNlX3J0aTsKKworCQlBc3Nl cnQobWluX2Jhc2VfcnRpID4gMCk7CisJCUFzc2VydChydG9mZnNldCA+PSAwKTsKKwogCQlmc3N0 YXRlLT5yZWwgPSBOVUxMOwotCQlmc3N0YXRlLT50dXBkZXNjID0gZ2V0X3R1cGRlc2NfZm9yX2pv aW5fc2Nhbl90dXBsZXMobm9kZSk7CisJCWZzc3RhdGUtPnR1cGRlc2MgPSBnZXRfdHVwZGVzY19m b3Jfam9pbl9zY2FuX3R1cGxlcyhub2RlLCBydGZ1bmNkYXRhLAorCQkJCQkJCQkJCQkJCQkJcnRv ZmZzZXQpOwogCX0KIAogCWZzc3RhdGUtPmF0dGlubWV0YSA9IFR1cGxlRGVzY0dldEF0dEluTWV0 YWRhdGEoZnNzdGF0ZS0+dHVwZGVzYyk7CkBAIC0yODI5LDYgKzI5NTcsMTAgQEAgcG9zdGdyZXNQ bGFuRGlyZWN0TW9kaWZ5KFBsYW5uZXJJbmZvICpyb290LAogCQkJCQkJCQkJbWFrZUJvb2xlYW4o KHJldHJpZXZlZF9hdHRycyAhPSBOSUwpKSwKIAkJCQkJCQkJCXJldHJpZXZlZF9hdHRycywKIAkJ CQkJCQkJCW1ha2VCb29sZWFuKHBsYW4tPmNhblNldFRhZykpOworCWZzY2FuLT5mZHdfcHJpdmF0 ZSA9IGxhcHBlbmQoZnNjYW4tPmZkd19wcml2YXRlLAorCQkJCQkJCQkgZ2V0X2Z1bmN0aW9uc19k YXRhKHJvb3QsIGZvcmVpZ25yZWwpKTsKKwlmc2Nhbi0+ZmR3X3ByaXZhdGUgPSBsYXBwZW5kKGZz Y2FuLT5mZHdfcHJpdmF0ZSwKKwkJCQkJCQkJIG1ha2VJbnRlZ2VyKGdldF9taW5fYmFzZV9ydGko cm9vdCwgZm9yZWlnbnJlbCkpKTsKIAogCS8qCiAJICogVXBkYXRlIHRoZSBmb3JlaWduLWpvaW4t cmVsYXRlZCBmaWVsZHMuCkBAIC0yOTQyLDcgKzMwNzQsMjYgQEAgcG9zdGdyZXNCZWdpbkRpcmVj dE1vZGlmeShGb3JlaWduU2NhblN0YXRlICpub2RlLCBpbnQgZWZsYWdzKQogCQlUdXBsZURlc2MJ dHVwZGVzYzsKIAogCQlpZiAoZnNwbGFuLT5zY2FuLnNjYW5yZWxpZCA9PSAwKQotCQkJdHVwZGVz YyA9IGdldF90dXBkZXNjX2Zvcl9qb2luX3NjYW5fdHVwbGVzKG5vZGUpOworCQl7CisJCQkvKgor CQkJICogRGlyZWN0TW9kaWZ5IG9uIGEgZm9yZWlnbiBqb2luOiB1c2UgdGhlIHBlci1SVEUgZnVu Y3Rpb24KKwkJCSAqIG1ldGFkYXRhIHNhdmVkIGF0IHBsYW4gdGltZSBzbyBhIHdob2xlLXJvdyBW YXIgcG9pbnRpbmcgYXQgYQorCQkJICogZnVuY3Rpb24gUlRFIGFic29yYmVkIGludG8gdGhlIGpv aW4gY2FuIGJlIHJlYnVpbHQgaW50byBhCisJCQkgKiB1c2FibGUgVHVwbGVEZXNjIChlLmcuIFJF VFVSTklORyB0IGZvciBhIGpvaW4gd2l0aCBVTk5FU1QoLi4uLAorCQkJICogLi4uKSBBUyB0KGJ4 LCBpKSkuCisJCQkgKi8KKwkJCUxpc3QJICAgKnJ0ZnVuY2RhdGEgPSAoTGlzdCAqKSBsaXN0X250 aChmc3BsYW4tPmZkd19wcml2YXRlLAorCQkJCQkJCQkJCQkJCSAgIEZkd0RpcmVjdE1vZGlmeVBy aXZhdGVGdW5jdGlvbnMpOworCQkJaW50CQkJbWluX2Jhc2VfcnRpID0gaW50VmFsKGxpc3RfbnRo KGZzcGxhbi0+ZmR3X3ByaXZhdGUsCisJCQkJCQkJCQkJCQkJICAgRmR3RGlyZWN0TW9kaWZ5UHJp dmF0ZU1pblJUSW5kZXgpKTsKKwkJCWludAkJCXJ0b2Zmc2V0ID0gYm1zX25leHRfbWVtYmVyKGZz cGxhbi0+ZnNfYmFzZV9yZWxpZHMsIC0xKSAtCisJCQkJbWluX2Jhc2VfcnRpOworCisJCQlBc3Nl cnQobWluX2Jhc2VfcnRpID4gMCk7CisJCQlBc3NlcnQocnRvZmZzZXQgPj0gMCk7CisKKwkJCXR1 cGRlc2MgPSBnZXRfdHVwZGVzY19mb3Jfam9pbl9zY2FuX3R1cGxlcyhub2RlLCBydGZ1bmNkYXRh LCBydG9mZnNldCk7CisJCX0KIAkJZWxzZQogCQkJdHVwZGVzYyA9IFJlbGF0aW9uR2V0RGVzY3Io ZG1zdGF0ZS0+cmVsKTsKIApAQCAtMzA1NSw3ICszMjA2LDggQEAgcG9zdGdyZXNFeHBsYWluRm9y ZWlnblNjYW4oRm9yZWlnblNjYW5TdGF0ZSAqbm9kZSwgRXhwbGFpblN0YXRlICplcykKIAkgKiBX ZSBkbyB0aGF0IGhlcmUsIG5vdCB3aGVuIHRoZSBwbGFuIGlzIGNyZWF0ZWQsIGJlY2F1c2Ugd2Ug Y2FuJ3Qga25vdwogCSAqIHdoYXQgYWxpYXNlcyBydWxldXRpbHMuYyB3aWxsIGFzc2lnbiBhdCBw bGFuIGNyZWF0aW9uIHRpbWUuCiAJICovCi0JaWYgKGxpc3RfbGVuZ3RoKGZkd19wcml2YXRlKSA+ IEZkd1NjYW5Qcml2YXRlUmVsYXRpb25zKQorCWlmIChsaXN0X2xlbmd0aChmZHdfcHJpdmF0ZSkg PiBGZHdTY2FuUHJpdmF0ZVJlbGF0aW9ucyAmJgorCQlsaXN0X250aChmZHdfcHJpdmF0ZSwgRmR3 U2NhblByaXZhdGVSZWxhdGlvbnMpICE9IE5VTEwpCiAJewogCQlTdHJpbmdJbmZvRGF0YSByZWxh dGlvbnM7CiAJCWNoYXIJICAgKnJhd3JlbGF0aW9uczsKQEAgLTMxMDUsNiArMzI1NywyMiBAQCBw b3N0Z3Jlc0V4cGxhaW5Gb3JlaWduU2NhbihGb3JlaWduU2NhblN0YXRlICpub2RlLCBFeHBsYWlu U3RhdGUgKmVzKQogCQkJCXJ0aSArPSBydG9mZnNldDsKIAkJCQlBc3NlcnQoYm1zX2lzX21lbWJl cihydGksIHBsYW4tPmZzX2Jhc2VfcmVsaWRzKSk7CiAJCQkJcnRlID0gcnRfZmV0Y2gocnRpLCBl cy0+cnRhYmxlKTsKKworCQkJCS8qCisJCQkJICogSWYgYSBmdW5jdGlvbiBSVEUgd2FzIGFic29y YmVkIGludG8gdGhlIGZvcmVpZ24gam9pbiwKKwkJCQkgKiByZW5kZXIgaXQgYXMgIkZ1bmN0aW9u IDxhbGlhcz4iIHNpbmNlIHdlIGhhdmUgbm8gZm9yZWlnbgorCQkJCSAqIHJlbGlkLgorCQkJCSAq LworCQkJCWlmIChydGUtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNUSU9OKQorCQkJCXsKKwkJCQkJcmVm bmFtZSA9IChjaGFyICopIGxpc3RfbnRoKGVzLT5ydGFibGVfbmFtZXMsIHJ0aSAtIDEpOworCQkJ CQlpZiAocmVmbmFtZSA9PSBOVUxMKQorCQkJCQkJcmVmbmFtZSA9IHJ0ZS0+ZXJlZi0+YWxpYXNu YW1lOworCQkJCQlhcHBlbmRTdHJpbmdJbmZvKCZyZWxhdGlvbnMsICJGdW5jdGlvbiAlcyIsCisJ CQkJCQkJCQkgcXVvdGVfaWRlbnRpZmllcihyZWZuYW1lKSk7CisJCQkJCWNvbnRpbnVlOworCQkJ CX0KKwogCQkJCUFzc2VydChydGUtPnJ0ZWtpbmQgPT0gUlRFX1JFTEFUSU9OKTsKIAkJCQkvKiBU aGlzIGxvZ2ljIHNob3VsZCBhZ3JlZSB3aXRoIGV4cGxhaW4uYydzIEV4cGxhaW5UYXJnZXRSZWwg Ki8KIAkJCQlyZWxuYW1lID0gZ2V0X3JlbF9uYW1lKHJ0ZS0+cmVsaWQpOwpAQCAtMzQ4MCw4ICsz NjQ4LDE3IEBAIGVzdGltYXRlX3BhdGhfY29zdF9zaXplKFBsYW5uZXJJbmZvICpyb290LAogCQkJ LyogRm9yIGpvaW4gd2UgZXhwZWN0IGlubmVyIGFuZCBvdXRlciByZWxhdGlvbnMgc2V0ICovCiAJ CQlBc3NlcnQoZnBpbmZvLT5pbm5lcnJlbCAmJiBmcGluZm8tPm91dGVycmVsKTsKIAotCQkJZnBp bmZvX2kgPSAoUGdGZHdSZWxhdGlvbkluZm8gKikgZnBpbmZvLT5pbm5lcnJlbC0+ZmR3X3ByaXZh dGU7Ci0JCQlmcGluZm9fbyA9IChQZ0Zkd1JlbGF0aW9uSW5mbyAqKSBmcGluZm8tPm91dGVycmVs LT5mZHdfcHJpdmF0ZTsKKwkJCS8qCisJCQkgKiBGb3IgYSBGVU5DVElPTiBSVEUgYWJzb3JiZWQg aW50byB0aGUgam9pbiwgdXNlIHRoZSBzdHViIGZwaW5mbworCQkJICogd2UgYnVpbHQgaW4gZm9y ZWlnbl9qb2luX29rKCksIHNpbmNlIHRoZSBmdW5jdGlvbiByZWwgaXRzZWxmCisJCQkgKiBoYXMg bm8gZmR3X3ByaXZhdGUuCisJCQkgKi8KKwkJCWZwaW5mb19pID0gZnBpbmZvLT5pbm5lcl9mdW5j X2ZwaW5mbyA/CisJCQkJZnBpbmZvLT5pbm5lcl9mdW5jX2ZwaW5mbyA6CisJCQkJKFBnRmR3UmVs YXRpb25JbmZvICopIGZwaW5mby0+aW5uZXJyZWwtPmZkd19wcml2YXRlOworCQkJZnBpbmZvX28g PSBmcGluZm8tPm91dGVyX2Z1bmNfZnBpbmZvID8KKwkJCQlmcGluZm8tPm91dGVyX2Z1bmNfZnBp bmZvIDoKKwkJCQkoUGdGZHdSZWxhdGlvbkluZm8gKikgZnBpbmZvLT5vdXRlcnJlbC0+ZmR3X3By aXZhdGU7CiAKIAkJCS8qIEVzdGltYXRlIG9mIG51bWJlciBvZiByb3dzIGluIGNyb3NzIHByb2R1 Y3QgKi8KIAkJCW5yb3dzID0gZnBpbmZvX2ktPnJvd3MgKiBmcGluZm9fby0+cm93czsKQEAgLTY2 MzksNiArNjgxNiwxODEgQEAgc2VtaWpvaW5fdGFyZ2V0X29rKFBsYW5uZXJJbmZvICpyb290LCBS ZWxPcHRJbmZvICpqb2lucmVsLCBSZWxPcHRJbmZvICpvdXRlcnJlbCwKIAlyZXR1cm4gb2s7CiB9 CiAKKy8qCisgKiBnZXRfYmFzZV9yZWxpZHMKKyAqCQlSZXR1cm4gdGhlIHNldCBvZiBiYXNlIHJl bGlkcyByZWZlcmVuY2VkIGJ5IGEgZm9yZWlnbiBzY2FuIHJlbC4KKyAqCisgKiBGb3IgYW4gdXBw ZXIgcmVsIHdlIHVzZSB0aGUgYWxsLXF1ZXJ5IHJlbGlkcyBtaW51cyB0aGUgb3V0ZXIgam9pbnM7 CisgKiBvdGhlcndpc2UgdGhlIHJlbCdzIG93biByZWxpZHMgbWludXMgdGhlIG91dGVyIGpvaW5z LiAgVGhlIHJlc3VsdCBtYXRjaGVzCisgKiB0aGUgcmVsaWRzIHRoYXQgY3JlYXRlX2ZvcmVpZ25z Y2FuX3BsYW4oKSB1bHRpbWF0ZWx5IHVzZXMgZm9yCisgKiBGb3JlaWduU2Nhbi5mc19iYXNlX3Jl bGlkcywgc28gaXQgaXMgc3VpdGFibGUgZm9yIGFueSB0YWdnaW5nIHdlIHdhbnQgdG8KKyAqIHN0 b3JlIHZpYSBwbGFuLXByaXZhdGUgc3RhdGUuCisgKi8KK3N0YXRpYyBSZWxpZHMKK2dldF9iYXNl X3JlbGlkcyhQbGFubmVySW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsKQoreworCVJlbGlkcwkJ cmVsaWRzOworCisJaWYgKHJlbC0+cmVsb3B0a2luZCA9PSBSRUxPUFRfVVBQRVJfUkVMKQorCQly ZWxpZHMgPSByb290LT5hbGxfcXVlcnlfcmVsczsKKwllbHNlCisJCXJlbGlkcyA9IHJlbC0+cmVs aWRzOworCisJcmV0dXJuIGJtc19kaWZmZXJlbmNlKHJlbGlkcywgcm9vdC0+b3V0ZXJfam9pbl9y ZWxzKTsKK30KKworLyoKKyAqIGdldF9taW5fYmFzZV9ydGkKKyAqCQlMb3dlc3QgYmFzZSBSVCBp bmRleCBpbiB0aGUgZm9yZWlnbiBzY2FuIHJlbC4KKyAqCisgKiBBZnRlciBzZXRyZWZzLmMgZmxh dHRlbnMgdGhlIHJ0YWJsZSwgdGhlIHNjYW4tbG9jYWwgaW5kZXhlcyBzYXZlZCBpbgorICogcGxh bi1wcml2YXRlIGRhdGEgY2FuIGJlIHRyYW5zbGF0ZWQgdG8gZXN0YXRlIGluZGV4ZXMgYnkgYWRk aW5nCisgKiAoRm9yZWlnblNjYW4uZnNfYmFzZV9yZWxpZHMgbWluIC0gdGhpcyB2YWx1ZSkuICBD YXB0dXJlZCBhdCBwbGFuIHRpbWUKKyAqIGJlY2F1c2UgY3JlYXRlX2ZvcmVpZ25zY2FuX3BsYW4o KSBjb21wdXRlcyB0aGUgc2FtZSB2YWx1ZSBpbnRlcm5hbGx5LgorICovCitzdGF0aWMgaW50Citn ZXRfbWluX2Jhc2VfcnRpKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpCit7CisJ UmVsaWRzCQlyZWxpZHMgPSBnZXRfYmFzZV9yZWxpZHMocm9vdCwgcmVsKTsKKworCXJldHVybiBi bXNfbmV4dF9tZW1iZXIocmVsaWRzLCAtMSk7Cit9CisKKy8qCisgKiBnZXRfZnVuY3Rpb25zX2Rh dGEKKyAqCQlCdWlsZCB0aGUgcGVyLVJURSBmdW5jdGlvbiBtZXRhZGF0YSBsaXN0IHNhdmVkIGFz CisgKgkJRmR3U2NhblByaXZhdGVGdW5jdGlvbnMuCisgKgorICogVGhlIHJlc3VsdCBsaXN0IGlz IGluZGV4ZWQgYnkgYmFzZSBSVCBpbmRleCByZWxhdGl2ZSB0byB0aGUgbG93ZXN0IGJhc2UKKyAq IFJUIGluZGV4IG9mIHRoZSBzY2FuLiAgRWFjaCBlbGVtZW50IGlzIGVpdGhlciBOVUxMIChmb3Ig bm9uLVJURV9GVU5DVElPTgorICogYmFzZSByZWxzIGluIHRoaXMgc2Nhbikgb3IgYSBMaXN0IG9m IExpc3Qgb2YgdGhyZWUgSW50ZWdlciBub2RlczoKKyAqIChmdW5jaWQsIGZ1bmNyZXR0eXBlLCBm dW5jY29sbGF0aW9uKSAtLSBvbmUgaW5uZXIgbGlzdCBwZXIgUmFuZ2VUYmxGdW5jdGlvbi4KKyAq CisgKiBPbmx5IFJURV9GVU5DVElPTiByZWxpZHMgYWN0dWFsbHkgYXBwZWFyaW5nIGluIHRoZSBm b3JlaWduIHNjYW4ncworICogZnNfYmFzZV9yZWxpZHMgY29udHJpYnV0ZTsgb3RoZXJzIGFyZSBw bGFjZWhvbGRlcnMgc28gdGhhdCB0aGUgY29uc3VtZXIKKyAqIGNhbiBpbmRleCBpbnRvIHRoZSBy ZXN1bHQgYnkgUlRJIG9mZnNldC4KKyAqLworc3RhdGljIExpc3QgKgorZ2V0X2Z1bmN0aW9uc19k YXRhKFBsYW5uZXJJbmZvICpyb290LCBSZWxPcHRJbmZvICpyZWwpCit7CisJTGlzdAkgICAqcnRm dW5jZGF0YSA9IE5JTDsKKwlSZWxpZHMJCWZzY2FuX3JlbGlkcyA9IGdldF9iYXNlX3JlbGlkcyhy b290LCByZWwpOworCWludAkJCWk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcm9vdC0+c2ltcGxlX3Jl bF9hcnJheV9zaXplOyBpKyspCisJeworCQlSYW5nZVRibEVudHJ5ICpydGUgPSByb290LT5zaW1w bGVfcnRlX2FycmF5W2ldOworCQlMaXN0CSAgICpmdW5jZGF0YSA9IE5JTDsKKwkJTGlzdENlbGwg ICAqbGM7CisKKwkJaWYgKHJ0ZSA9PSBOVUxMIHx8IGkgPT0gMCB8fAorCQkJIWJtc19pc19tZW1i ZXIoaSwgZnNjYW5fcmVsaWRzKSB8fAorCQkJcnRlLT5ydGVraW5kICE9IFJURV9GVU5DVElPTikK KwkJeworCQkJcnRmdW5jZGF0YSA9IGxhcHBlbmQocnRmdW5jZGF0YSwgTlVMTCk7CisJCQljb250 aW51ZTsKKwkJfQorCisJCWZvcmVhY2gobGMsIHJ0ZS0+ZnVuY3Rpb25zKQorCQl7CisJCQlSYW5n ZVRibEZ1bmN0aW9uICpydGZ1bmMgPSAoUmFuZ2VUYmxGdW5jdGlvbiAqKSBsZmlyc3QobGMpOwor CQkJT2lkCQkJZnVuY3JldHR5cGU7CisJCQlPaWQJCQlmdW5jY29sbGF0aW9uOworCQkJVHVwbGVE ZXNjCXR1cGRlc2M7CisJCQlPaWQJCQlmdW5jaWQgPSBJbnZhbGlkT2lkOworCisJCQlnZXRfZXhw cl9yZXN1bHRfdHlwZShydGZ1bmMtPmZ1bmNleHByLCAmZnVuY3JldHR5cGUsICZ0dXBkZXNjKTsK KworCQkJaWYgKCFPaWRJc1ZhbGlkKGZ1bmNyZXR0eXBlKSB8fCBmdW5jcmV0dHlwZSA9PSBSRUNP UkRPSUQpCisJCQkJZWxvZyhFUlJPUiwKKwkJCQkJICJjb3VsZCBub3QgZGV0ZXJtaW5lIHJldHVy biB0eXBlIGZvciBmdW5jdGlvbiBpbiBmb3JlaWduIHNjYW4iKTsKKworCQkJZnVuY2NvbGxhdGlv biA9IGV4cHJDb2xsYXRpb24ocnRmdW5jLT5mdW5jZXhwcik7CisKKwkJCWlmIChJc0EocnRmdW5j LT5mdW5jZXhwciwgRnVuY0V4cHIpKQorCQkJCWZ1bmNpZCA9ICgoRnVuY0V4cHIgKikgcnRmdW5j LT5mdW5jZXhwciktPmZ1bmNpZDsKKworCQkJZnVuY2RhdGEgPSBsYXBwZW5kKGZ1bmNkYXRhLAor CQkJCQkJCSAgIGxpc3RfbWFrZTMobWFrZUludGVnZXIoZnVuY2lkKSwKKwkJCQkJCQkJCQkgIG1h a2VJbnRlZ2VyKGZ1bmNyZXR0eXBlKSwKKwkJCQkJCQkJCQkgIG1ha2VJbnRlZ2VyKGZ1bmNjb2xs YXRpb24pKSk7CisJCX0KKworCQlydGZ1bmNkYXRhID0gbGFwcGVuZChydGZ1bmNkYXRhLCBmdW5j ZGF0YSk7CisJfQorCisJcmV0dXJuIHJ0ZnVuY2RhdGE7Cit9CisKKy8qCisgKiBDaGVjayBpZiBh IHJlbGF0aW9uIGlzIGEgRlVOQ1RJT04gUlRFIHRoYXQgY2FuIGJlIGFic29yYmVkIGludG8gYSBy ZW1vdGUKKyAqIGpvaW4uICBFdmVyeSBmdW5jdGlvbiBpbiB0aGUgUlRFIG11c3QKKyAqCisgKiAg IC0gcmV0dXJuIGEgd2VsbC1kZWZpbmVkIHNjYWxhciB0eXBlIC0tIHdlIGRvbid0IHNoaXAgcmVj b3Jkcy9jb21wb3NpdGUKKyAqICAgICBzaW5jZSB0aGUgcmVtb3RlIHNlcnZlciBjYW5ub3QgcmVj b25zdHJ1Y3QgYSBjb2x1bW4gZGVmaW5pdGlvbiBsaXN0CisgKiAgICAgYW5kIG91ciBkZXBhcnNl ciBkb2VzIG5vdCBlbWl0IG9uZTsKKyAqICAgLSBoYXZlIGEgc2hpcHBhYmxlIGV4cHJlc3Npb24g d2l0aCBubyBtdXRhYmxlIHN1Ym5vZGVzIC0tIGlzX2ZvcmVpZ25fZXhwcigpCisgKiAgICAgcmVq ZWN0cyB2b2xhdGlsZS9zdGFibGUgZnVuY3Rpb25zIHRocm91Z2ggY29udGFpbl9tdXRhYmxlX2Z1 bmN0aW9ucygpLAorICogICAgIHNvIHRoZSBJTU1VVEFCTEUtb25seSByZXN0cmljdGlvbiBpcyBp bXBsaWNpdDsKKyAqICAgLSBub3QgY29udGFpbiBTdWJQbGFucyAtLSB3ZSdkIG90aGVyd2lzZSBu ZWVkIHRvIHNoaXAgc3ViLXJlc3VsdHMgdG8KKyAqICAgICB0aGUgcmVtb3RlLCB3aGljaCB3ZSBk byBub3QgaW1wbGVtZW50LgorICoKKyAqIFdJVEggT1JESU5BTElUWSBpcyBub3Qgc3VwcG9ydGVk IHlldC4KKyAqLworc3RhdGljIGJvb2wKK2Z1bmN0aW9uX3J0ZV9wdXNoZG93bl9vayhQbGFubmVy SW5mbyAqcm9vdCwgUmVsT3B0SW5mbyAqcmVsLAorCQkJCQkJIFJlbE9wdEluZm8gKmZkd3JlbCkK K3sKKwlSYW5nZVRibEVudHJ5ICpydGU7CisJTGlzdENlbGwgICAqbGM7CisKKwlpZiAocmVsLT5y dGVraW5kICE9IFJURV9GVU5DVElPTikKKwkJcmV0dXJuIGZhbHNlOworCXJ0ZSA9IHBsYW5uZXJf cnRfZmV0Y2gocmVsLT5yZWxpZCwgcm9vdCk7CisJaWYgKHJ0ZS0+cnRla2luZCAhPSBSVEVfRlVO Q1RJT04pCisJCXJldHVybiBmYWxzZTsKKwlpZiAocnRlLT5mdW5jb3JkaW5hbGl0eSkKKwkJcmV0 dXJuIGZhbHNlOworCisJLyoKKwkgKiBSZWplY3QgdXAtZnJvbnQgYW55IGZ1bmN0aW9uIFJURSB0 aGF0IGxhdGVyYWwtcmVmZXJlbmNlcyBhbm90aGVyCisJICogcmVsYXRpb246IGZvcmVpZ24tam9p biBwdXNoLWRvd24gd291bGQgbmVlZCB0byBwYXJhbWV0ZXJpc2UgdGhlIHJlbW90ZQorCSAqIHF1 ZXJ5IHBlciBvdXRlciByb3csIHdoaWNoIHdlIGRvbid0IHN1cHBvcnQsIGFuZCBldmVuIGNvbnNp ZGVyaW5nIHRoZQorCSAqIHBhdGggaXMgZXhwZW5zaXZlIG9uIHRoZSBwbGFubmVyIHNpZGUuICBU aGUgc3Vycm91bmRpbmcgbGF0ZXJhbF9yZWxpZHMKKwkgKiBjaGVjayBpbiBwb3N0Z3Jlc0dldEZv cmVpZ25Kb2luUGF0aHMoKSB3b3VsZCBub3JtYWxseSBiYWlsIG91dCBmb3IgdGhlCisJICogam9p bnJlbCwgYnV0IGRvaW5nIHRoZSBjaGVjayBoZXJlIGF2b2lkcyB3YWxraW5nIHRoZSBmdW5jdGlv bgorCSAqIGV4cHJlc3Npb24gZW50aXJlbHkuCisJICovCisJaWYgKCFibXNfaXNfZW1wdHkocmVs LT5sYXRlcmFsX3JlbGlkcykpCisJCXJldHVybiBmYWxzZTsKKworCUFzc2VydChsaXN0X2xlbmd0 aChydGUtPmZ1bmN0aW9ucykgPj0gMSk7CisKKwlmb3JlYWNoKGxjLCBydGUtPmZ1bmN0aW9ucykK Kwl7CisJCVJhbmdlVGJsRnVuY3Rpb24gKnJ0ZnVuYyA9IChSYW5nZVRibEZ1bmN0aW9uICopIGxm aXJzdChsYyk7CisJCVR5cGVGdW5jQ2xhc3MgZnVuY3R5cGNsYXNzOworCQlPaWQJCQlmdW5jcmV0 dHlwZTsKKwkJVHVwbGVEZXNjCXR1cGRlc2M7CisKKwkJZnVuY3R5cGNsYXNzID0gZ2V0X2V4cHJf cmVzdWx0X3R5cGUocnRmdW5jLT5mdW5jZXhwciwKKwkJCQkJCQkJCQkJJmZ1bmNyZXR0eXBlLCAm dHVwZGVzYyk7CisJCWlmIChmdW5jdHlwY2xhc3MgIT0gVFlQRUZVTkNfU0NBTEFSKQorCQkJcmV0 dXJuIGZhbHNlOworCQlpZiAoIU9pZElzVmFsaWQoZnVuY3JldHR5cGUpIHx8CisJCQlmdW5jcmV0 dHlwZSA9PSBSRUNPUkRPSUQgfHwKKwkJCWZ1bmNyZXR0eXBlID09IFZPSURPSUQpCisJCQlyZXR1 cm4gZmFsc2U7CisKKwkJaWYgKGNvbnRhaW5fc3VicGxhbnMocnRmdW5jLT5mdW5jZXhwcikpCisJ CQlyZXR1cm4gZmFsc2U7CisJCWlmICghaXNfZm9yZWlnbl9leHByKHJvb3QsIGZkd3JlbCwgKEV4 cHIgKikgcnRmdW5jLT5mdW5jZXhwcikpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJcmV0dXJu IHRydWU7Cit9CisKIC8qCiAgKiBBc3Nlc3Mgd2hldGhlciB0aGUgam9pbiBiZXR3ZWVuIGlubmVy IGFuZCBvdXRlciByZWxhdGlvbnMgY2FuIGJlIHB1c2hlZCBkb3duCiAgKiB0byB0aGUgZm9yZWln biBzZXJ2ZXIuIEFzIGEgc2lkZSBlZmZlY3QsIHNhdmUgaW5mb3JtYXRpb24gd2Ugb2J0YWluIGlu IHRoaXMKQEAgLTY2NTQsNiArNzAwNiw4IEBAIGZvcmVpZ25fam9pbl9vayhQbGFubmVySW5mbyAq cm9vdCwgUmVsT3B0SW5mbyAqam9pbnJlbCwgSm9pblR5cGUgam9pbnR5cGUsCiAJUGdGZHdSZWxh dGlvbkluZm8gKmZwaW5mb19pOwogCUxpc3RDZWxsICAgKmxjOwogCUxpc3QJICAgKmpvaW5jbGF1 c2VzOworCWJvb2wJCW91dGVyX2lzX2Z1bmN0aW9uID0gZmFsc2U7CisJYm9vbAkJaW5uZXJfaXNf ZnVuY3Rpb24gPSBmYWxzZTsKIAogCS8qCiAJICogV2Ugc3VwcG9ydCBwdXNoaW5nIGRvd24gSU5O RVIsIExFRlQsIFJJR0hULCBGVUxMIE9VVEVSIGFuZCBTRU1JIGpvaW5zLgpAQCAtNjY3MiwxNSAr NzAyNiw3MCBAQCBmb3JlaWduX2pvaW5fb2soUGxhbm5lckluZm8gKnJvb3QsIFJlbE9wdEluZm8g KmpvaW5yZWwsIEpvaW5UeXBlIGpvaW50eXBlLAogCQlyZXR1cm4gZmFsc2U7CiAKIAkvKgotCSAq IElmIGVpdGhlciBvZiB0aGUgam9pbmluZyByZWxhdGlvbnMgaXMgbWFya2VkIGFzIHVuc2FmZSB0 byBwdXNoZG93biwgdGhlCi0JICogam9pbiBjYW4gbm90IGJlIHB1c2hlZCBkb3duLgorCSAqIERl dGVjdCBtaXhlZCAoZm9yZWlnbiB4IGZ1bmN0aW9uLVJURSkgY2FzZXMuICBPbmx5IElOTkVSIGpv aW5zIGFyZQorCSAqIHN1cHBvcnRlZCBpbml0aWFsbHkuICBXZSBkaXNwYXRjaCBvbiBydGVraW5k IGhlcmUgc28gdGhhdCB0aGUgc2FtZQorCSAqIGZ1bmN0aW9uIFJURSBjYW4gYmUgYWJzb3JiZWQg aW50byBqb2lucyBvbiBtdWx0aXBsZSBmb3JlaWduIHNlcnZlcnMKKwkgKiAoZWFjaCBjYWxsIGdl dHMgaXRzIG93biBzdHViIGZwaW5mbyBhbmQgcmVjaGVja3Mgc2hpcHBhYmlsaXR5IGZvciB0aGUK KwkgKiBzcGVjaWZpYyBzZXJ2ZXIpLgogCSAqLwogCWZwaW5mbyA9IChQZ0Zkd1JlbGF0aW9uSW5m byAqKSBqb2lucmVsLT5mZHdfcHJpdmF0ZTsKLQlmcGluZm9fbyA9IChQZ0Zkd1JlbGF0aW9uSW5m byAqKSBvdXRlcnJlbC0+ZmR3X3ByaXZhdGU7Ci0JZnBpbmZvX2kgPSAoUGdGZHdSZWxhdGlvbklu Zm8gKikgaW5uZXJyZWwtPmZkd19wcml2YXRlOwotCWlmICghZnBpbmZvX28gfHwgIWZwaW5mb19v LT5wdXNoZG93bl9zYWZlIHx8Ci0JCSFmcGluZm9faSB8fCAhZnBpbmZvX2ktPnB1c2hkb3duX3Nh ZmUpCi0JCXJldHVybiBmYWxzZTsKKwlpZiAoam9pbnR5cGUgPT0gSk9JTl9JTk5FUiAmJiBpbm5l cnJlbC0+cnRla2luZCA9PSBSVEVfRlVOQ1RJT04gJiYKKwkJKGZwaW5mb19vID0gKFBnRmR3UmVs YXRpb25JbmZvICopIG91dGVycmVsLT5mZHdfcHJpdmF0ZSkgJiYKKwkJZnBpbmZvX28tPnB1c2hk b3duX3NhZmUgJiYKKwkJZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKHJvb3QsIGlubmVycmVsLCBv dXRlcnJlbCkpCisJeworCQlpbm5lcl9pc19mdW5jdGlvbiA9IHRydWU7CisJfQorCWVsc2UgaWYg KGpvaW50eXBlID09IEpPSU5fSU5ORVIgJiYgb3V0ZXJyZWwtPnJ0ZWtpbmQgPT0gUlRFX0ZVTkNU SU9OICYmCisJCQkgKGZwaW5mb19pID0gKFBnRmR3UmVsYXRpb25JbmZvICopIGlubmVycmVsLT5m ZHdfcHJpdmF0ZSkgJiYKKwkJCSBmcGluZm9faS0+cHVzaGRvd25fc2FmZSAmJgorCQkJIGZ1bmN0 aW9uX3J0ZV9wdXNoZG93bl9vayhyb290LCBvdXRlcnJlbCwgaW5uZXJyZWwpKQorCXsKKwkJb3V0 ZXJfaXNfZnVuY3Rpb24gPSB0cnVlOworCX0KKwllbHNlCisJeworCQlmcGluZm9fbyA9IChQZ0Zk d1JlbGF0aW9uSW5mbyAqKSBvdXRlcnJlbC0+ZmR3X3ByaXZhdGU7CisJCWZwaW5mb19pID0gKFBn RmR3UmVsYXRpb25JbmZvICopIGlubmVycmVsLT5mZHdfcHJpdmF0ZTsKKwkJaWYgKCFmcGluZm9f byB8fCAhZnBpbmZvX28tPnB1c2hkb3duX3NhZmUgfHwKKwkJCSFmcGluZm9faSB8fCAhZnBpbmZv X2ktPnB1c2hkb3duX3NhZmUpCisJCQlyZXR1cm4gZmFsc2U7CisJfQorCisJLyoKKwkgKiBJZiBv bmUgc2lkZSBpcyBhIGZ1bmN0aW9uIFJURSwgYWxsb2NhdGUgYSBzdHViIGZwaW5mbyBzbyB0aGUg cmVzdCBvZgorCSAqIHRoaXMgZnVuY3Rpb24gYW5kIHRoZSBjb3N0IGVzdGltYXRvciBjYW4gdHJl YXQgaXQgdW5pZm9ybWx5LiAgV2UgaGFuZAorCSAqIHRoZSBzdHViIHRvIHRoZSBqb2lucmVsJ3Mg ZGVwYXJzZXIgdmlhIHRoZSBzYW1lIHBhdGggdGhlIGZvcmVpZ24gc2lkZQorCSAqIHVzZXMsIGJ1 dCB3ZSBuZXZlciBwZXJtYW5lbnRseSBhdHRhY2ggaXQgdG8gdGhlIGZ1bmN0aW9uIHJlbCdzCisJ ICogZmR3X3ByaXZhdGUgKGRpZmZlcmVudCBqb2lucmVscyBtYXkgcGFpciB0aGUgc2FtZSBmdW5j dGlvbiBSVEUgd2l0aAorCSAqIGRpZmZlcmVudCBmb3JlaWduIHNlcnZlcnMpLgorCSAqLworCWlm IChpbm5lcl9pc19mdW5jdGlvbikKKwl7CisJCWZwaW5mb19pID0gcGFsbG9jMF9vYmplY3QoUGdG ZHdSZWxhdGlvbkluZm8pOworCQlmcGluZm9faS0+cHVzaGRvd25fc2FmZSA9IHRydWU7CisJCWZw aW5mb19pLT5zZXJ2ZXIgPSBmcGluZm9fby0+c2VydmVyOworCQlmcGluZm9faS0+cmVsYXRpb25f bmFtZSA9IHBzcHJpbnRmKCIldSIsIGlubmVycmVsLT5yZWxpZCk7CisJCWZwaW5mb19pLT5yb3dz ID0gaW5uZXJyZWwtPnJvd3M7CisJCWZwaW5mb19pLT53aWR0aCA9IGlubmVycmVsLT5yZWx0YXJn ZXQtPndpZHRoOworCQlmcGluZm9faS0+cmV0cmlldmVkX3Jvd3MgPSBpbm5lcnJlbC0+cm93czsK KwkJZnBpbmZvX2ktPnJlbF9zdGFydHVwX2Nvc3QgPSAwOworCQlmcGluZm9faS0+cmVsX3RvdGFs X2Nvc3QgPSAwOworCQlmcGluZm8tPmlubmVyX2Z1bmNfZnBpbmZvID0gZnBpbmZvX2k7CisJfQor CWVsc2UgaWYgKG91dGVyX2lzX2Z1bmN0aW9uKQorCXsKKwkJZnBpbmZvX28gPSBwYWxsb2MwX29i amVjdChQZ0Zkd1JlbGF0aW9uSW5mbyk7CisJCWZwaW5mb19vLT5wdXNoZG93bl9zYWZlID0gdHJ1 ZTsKKwkJZnBpbmZvX28tPnNlcnZlciA9IGZwaW5mb19pLT5zZXJ2ZXI7CisJCWZwaW5mb19vLT5y ZWxhdGlvbl9uYW1lID0gcHNwcmludGYoIiV1Iiwgb3V0ZXJyZWwtPnJlbGlkKTsKKwkJZnBpbmZv X28tPnJvd3MgPSBvdXRlcnJlbC0+cm93czsKKwkJZnBpbmZvX28tPndpZHRoID0gb3V0ZXJyZWwt PnJlbHRhcmdldC0+d2lkdGg7CisJCWZwaW5mb19vLT5yZXRyaWV2ZWRfcm93cyA9IG91dGVycmVs LT5yb3dzOworCQlmcGluZm9fby0+cmVsX3N0YXJ0dXBfY29zdCA9IDA7CisJCWZwaW5mb19vLT5y ZWxfdG90YWxfY29zdCA9IDA7CisJCWZwaW5mby0+b3V0ZXJfZnVuY19mcGluZm8gPSBmcGluZm9f bzsKKwl9CiAKIAkvKgogCSAqIElmIGpvaW5pbmcgcmVsYXRpb25zIGhhdmUgbG9jYWwgY29uZGl0 aW9ucywgdGhvc2UgY29uZGl0aW9ucyBhcmUKZGlmZiAtLWdpdCBhL2NvbnRyaWIvcG9zdGdyZXNf ZmR3L3Bvc3RncmVzX2Zkdy5oIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvcG9zdGdyZXNfZmR3LmgK aW5kZXggYTJiYjFmZjM1MmMuLjViMmZmY2YwNmY3IDEwMDY0NAotLS0gYS9jb250cmliL3Bvc3Rn cmVzX2Zkdy9wb3N0Z3Jlc19mZHcuaAorKysgYi9jb250cmliL3Bvc3RncmVzX2Zkdy9wb3N0Z3Jl c19mZHcuaApAQCAtMTA2LDYgKzEwNiwxNiBAQCB0eXBlZGVmIHN0cnVjdCBQZ0Zkd1JlbGF0aW9u SW5mbwogCS8qIGpvaW5jbGF1c2VzIGNvbnRhaW5zIG9ubHkgSk9JTi9PTiBjb25kaXRpb25zIGZv ciBhbiBvdXRlciBqb2luICovCiAJTGlzdAkgICAqam9pbmNsYXVzZXM7CS8qIExpc3Qgb2YgUmVz dHJpY3RJbmZvICovCiAKKwkvKgorCSAqIElmIGEgRlVOQ1RJT04gUlRFIHdhcyBhYnNvcmJlZCBp bnRvIHRoaXMgam9pbiwgdGhlc2UgcG9pbnQgYXQgdGhlIHN0dWIKKwkgKiBQZ0Zkd1JlbGF0aW9u SW5mbyBmb3IgdGhlIGZ1bmN0aW9uIHNpZGUgKHBhaXJlZCB3aXRoIHRoZQorCSAqIG91dGVycmVs L2lubmVycmVsKSwgc28gdGhlIGNvc3QgZXN0aW1hdG9yIGFuZCBkZXBhcnNlciBjYW4gZmluZCBp dAorCSAqIHdpdGhvdXQgY29uc3VsdGluZyB0aGUgZnVuY3Rpb24gcmVsJ3MgZmR3X3ByaXZhdGUu ICBBdCBtb3N0IG9uZSBvZgorCSAqIG91dGVyX2Z1bmNfZnBpbmZvL2lubmVyX2Z1bmNfZnBpbmZv IGlzIHNldC4KKwkgKi8KKwlzdHJ1Y3QgUGdGZHdSZWxhdGlvbkluZm8gKm91dGVyX2Z1bmNfZnBp bmZvOworCXN0cnVjdCBQZ0Zkd1JlbGF0aW9uSW5mbyAqaW5uZXJfZnVuY19mcGluZm87CisKIAkv KiBVcHBlciByZWxhdGlvbiBpbmZvcm1hdGlvbiAqLwogCVVwcGVyUmVsYXRpb25LaW5kIHN0YWdl OwogCmRpZmYgLS1naXQgYS9jb250cmliL3Bvc3RncmVzX2Zkdy9zcWwvcG9zdGdyZXNfZmR3LnNx bCBiL2NvbnRyaWIvcG9zdGdyZXNfZmR3L3NxbC9wb3N0Z3Jlc19mZHcuc3FsCmluZGV4IGRmYzU4 YmViMGQyLi45NWI0ZDc2NDZmYSAxMDA2NDQKLS0tIGEvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3Fs L3Bvc3RncmVzX2Zkdy5zcWwKKysrIGIvY29udHJpYi9wb3N0Z3Jlc19mZHcvc3FsL3Bvc3RncmVz X2Zkdy5zcWwKQEAgLTc5MCw2ICs3OTAsMTc5IEBAIFNFTEVDVCB0MS5jMSwgdDIuYzIgRlJPTSB2 NCB0MSBMRUZUIEpPSU4gZnQ1IHQyIE9OICh0MS5jMSA9IHQyLmMxKSBPUkRFUiBCWSB0MS5jCiBT RUxFQ1QgdDEuYzEsIHQyLmMyIEZST00gdjQgdDEgTEVGVCBKT0lOIGZ0NSB0MiBPTiAodDEuYzEg PSB0Mi5jMSkgT1JERVIgQlkgdDEuYzEsIHQyLmMxIE9GRlNFVCAxMCBMSU1JVCAxMDsKIEFMVEVS IFZJRVcgdjQgT1dORVIgVE8gcmVncmVzc192aWV3X293bmVyOwogCistLSA9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cist LSBGb3JlaWduLWpvaW4gd2l0aCBGVU5DVElPTiBSVEUgcHVzaGRvd24gKElNTVVUQUJMRSBmdW5j dGlvbnMgb25seSkKKy0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tIElNTVVUQUJMRSBmdW5jdGlvbjogdW5uZXN0 IG9mIGNvbnN0YW50IGFycmF5IGNhbiBiZSBwdXNoZWQgZG93bgorRVhQTEFJTiAoVkVSQk9TRSwg Q09TVFMgT0ZGKQorU0VMRUNUIHQxLmMxLCB0MS5jMyBGUk9NIGZ0MSB0MSwgdW5uZXN0KEFSUkFZ WzEsIDUsIDEwLCAxMDBdOjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBPUkRF UiBCWSB0MS5jMTsKK1NFTEVDVCB0MS5jMSwgdDEuYzMgRlJPTSBmdDEgdDEsIHVubmVzdChBUlJB WVsxLCA1LCAxMCwgMTAwXTo6aW50W10pIEFTIHUoaWQpCitXSEVSRSB0MS5jMSA9IHUuaWQgT1JE RVIgQlkgdDEuYzE7CisKKy0tIElNTVVUQUJMRSBmdW5jdGlvbjogZ2VuZXJhdGVfc2VyaWVzIHdp dGggY29uc3RhbnQgYXJncworRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQx LmMxIEZST00gZnQxIHQxLCBnZW5lcmF0ZV9zZXJpZXMoMSwgNCkgQVMgZyhpZCkKK1dIRVJFIHQx LmMxID0gZy5pZCBPUkRFUiBCWSB0MS5jMTsKK1NFTEVDVCB0MS5jMSBGUk9NIGZ0MSB0MSwgZ2Vu ZXJhdGVfc2VyaWVzKDEsIDQpIEFTIGcoaWQpCitXSEVSRSB0MS5jMSA9IGcuaWQgT1JERVIgQlkg dDEuYzE7CisKKy0tIFZPTEFUSUxFIGZ1bmN0aW9uIChyYW5kb20pIG11c3QgTk9UIGJlIHB1c2hl ZCBkb3duCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEgRlJPTSBm dDEgdDEsIGdlbmVyYXRlX3NlcmllcygxLCA0ICsgKHJhbmRvbSgpICogMCk6OmludCkgQVMgZyhp ZCkKK1dIRVJFIHQxLmMxID0gZy5pZDsKKworLS0gV0lUSCBPUkRJTkFMSVRZIG11c3QgTk9UIGJl IHB1c2hlZCBkb3duIChsaW1pdGF0aW9uIG9mIHRoaXMgaW1wbGVtZW50YXRpb24pCitFWFBMQUlO IChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgdDEuYzEsIHUub3JkCitGUk9NIGZ0MSB0MSwg dW5uZXN0KEFSUkFZWzEsIDUsIDEwXTo6aW50W10pIFdJVEggT1JESU5BTElUWSBBUyB1KGlkLCBv cmQpCitXSEVSRSB0MS5jMSA9IHUuaWQ7CisKKy0tIFNhbWUgZnVuY3Rpb24gUlRFIGpvaW5lZCB3 aXRoIHR3byBkaWZmZXJlbnQgZm9yZWlnbiBzZXJ2ZXJzOiBwbGFubmVyIHBpY2tzCistLSBvbmUg YWJzb3JwdGlvbiArIGEgbG9jYWwgam9pbiB3aXRoIHRoZSBzZWNvbmQgZm9yZWlnbiBzZXJ2ZXIu ICBUaGUgZmFjdAorLS0gdGhhdCB0aGUgZnVuY3Rpb24gaXMgSU1NVVRBQkxFIG1ha2VzIHRoaXMg c2FmZSBldmVuIGlmIGJvdGggc2lkZXMgY2hvc2UgdG8KKy0tIGFic29yYiBpdCBpbmRlcGVuZGVu dGx5LgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmMxLCB0Mi5jMQor RlJPTSBmdDEgdDEsIGZ0NiB0MiwgdW5uZXN0KEFSUkFZWzEsIDUsIDEwLCAxMDBdOjppbnRbXSkg QVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBBTkQgdDIuYzEgPSB1LmlkIE9SREVSIEJZIHQx LmMxOworCistLSBDb3N0LWJhc2VkIHNlbGVjdGlvbiBiZXR3ZWVuIHR3byBmb3JlaWduIHNlcnZl cnM6IGZ0MSAoIlMgMSIuIlQgMSIpIGhhcworLS0gMTAwMCByb3dzLCBmdDYgKCJTIDEiLiJUIDQi KSBoYXMgfjMzIHJvd3MuICBUaGUgc2FtZSBxdWVyeSBzaGFwZSBnZXRzIGEKKy0tIGRpZmZlcmVu dCBwdXNoLWRvd24gdGFyZ2V0IGRlcGVuZGluZyBvbiBhIHByZWRpY2F0ZSB0aGF0IGNoYW5nZXMg dGhlCistLSBlZmZlY3RpdmUgY2FyZGluYWxpdHkgb2Ygb25lIHNpZGUgLS0gdGhlIGZ1bmN0aW9u ICJqdW1wcyIgdG8gd2hpY2hldmVyCistLSBmb3JlaWduIHNjYW4gYmVuZWZpdHMgbW9yZSBmcm9t IGJlaW5nIHByZS1maWx0ZXJlZC4KK0FOQUxZWkUgZnQxOworQU5BTFlaRSBmdDY7CistLSBObyBl eHRyYSBwcmVkaWNhdGU6IGZ0MSBpcyB0aGUgYmlnZ2VyIHNpZGUsIGZ1bmN0aW9uIGFic29yYmVk IHRoZXJlLgorRVhQTEFJTiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQxLmMxLCB0Mi5j MQorRlJPTSBmdDEgdDEsIGZ0NiB0MiwgdW5uZXN0KEFSUkFZWzMsIDYsIDksIDEyLCAxNSwgMThd OjppbnRbXSkgQVMgdShpZCkKK1dIRVJFIHQxLmMxID0gdS5pZCBBTkQgdDIuYzEgPSB1LmlkOwor LS0gU2VsZWN0aXZlIHByZWRpY2F0ZSBvbiBmdDEuYzMgKG5vdCBpbiB0aGUgZXFjbGFzcykgc2hy aW5rcyBmdDEgdG8gYQorLS0gaGFuZGZ1bCBvZiByZW1vdGUgcm93czsgbm93IGZ0NiBpcyBlZmZl Y3RpdmVseSB0aGUgYmlnZ2VyIHNpZGUgYW5kIHRoZQorLS0gZnVuY3Rpb24gaXMgYWJzb3JiZWQg aW50byBmdDYgaW5zdGVhZC4KK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCB0 MS5jMSwgdDIuYzEKK0ZST00gZnQxIHQxLCBmdDYgdDIsIHVubmVzdChBUlJBWVszLCA2LCA5LCAx MiwgMTUsIDE4XTo6aW50W10pIEFTIHUoaWQpCitXSEVSRSB0MS5jMSA9IHUuaWQgQU5EIHQyLmMx ID0gdS5pZCBBTkQgdDEuYzMgPCAnMDAwMTAnOworCistLSBUaGUgcmVtYWluaW5nIHNjZW5hcmlv cyByZXVzZSBhIGRlZGljYXRlZCBmb3JlaWduIHRhYmxlIHRvIGNvdmVyIHRoZQorLS0gY29ybmVy IGNhc2VzIG9mIEZVTkNUSU9OIFJURSBwdXNoLWRvd246IGZ1bmN0aW9uLWZpcnN0IEZST00sIHJl Y29yZAorLS0gcmV0dXJuIHR5cGUgcmVqZWN0aW9uLCB3aG9sZS1yb3cgcmVmZXJlbmNlLCBVUERB VEUuLi5GUk9NLi4uLCBhbmQKKy0tIG11bHRpLWZ1bmN0aW9uIFJPV1MgRlJPTS4KK0NSRUFURSBU QUJMRSBiYXNlX3RibF9mbiAoYSBpbnQsIGIgaW50KTsKK0lOU0VSVCBJTlRPIGJhc2VfdGJsX2Zu CisgIFNFTEVDVCBnLCBnICsgMTAwIEZST00gZ2VuZXJhdGVfc2VyaWVzKDEsIDMwKSBnOworQ1JF QVRFIEZPUkVJR04gVEFCTEUgcmVtb3RlX3RibCAoYSBpbnQsIGIgaW50KQorICBTRVJWRVIgbG9v cGJhY2sgT1BUSU9OUyAodGFibGVfbmFtZSAnYmFzZV90YmxfZm4nKTsKKworLS0gVGhlIGZ1bmN0 aW9uIFJURSBhcHBlYXJzIGZpcnN0IGluIEZST007IHRoZSBmb3JlaWduIHJlbGF0aW9uIG11c3Qg YmUKKy0tIGZvdW5kIGJ5IHNjYW5uaW5nIGZzX2Jhc2VfcmVsaWRzIGZvciBhbiBSVEVfUkVMQVRJ T04gcmF0aGVyIHRoYW4KKy0tIHVzaW5nIHNjYW4tPmZzX3JlbGlkIGJsaW5kbHkuCitFWFBMQUlO IChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1QgKiBGUk9NIHVubmVzdChhcnJheVsyLCAzLCA0 XSkgbiwgcmVtb3RlX3RibCByIFdIRVJFIHIuYSA9IG47CitTRUxFQ1QgKiBGUk9NIHVubmVzdChh cnJheVsyLCAzLCA0XSkgbiwgcmVtb3RlX3RibCByCitXSEVSRSByLmEgPSBuIE9SREVSIEJZIHIu YTsKKworLS0gQSBmdW5jdGlvbiByZXR1cm5pbmcgcmVjb3JkIChjb21wb3NpdGUpIGlzIGZvcmJp ZGRlbjsgcHVzaGluZyBpdAorLS0gd291bGQgeWllbGQgYSByZW1vdGUgImNvbHVtbiBkZWZpbml0 aW9uIGxpc3QgaXMgcmVxdWlyZWQiIGVycm9yLgorLS0gZnVuY3Rpb25fcnRlX3B1c2hkb3duX29r KCkgcmVqZWN0cyBpdCB2aWEgVFlQRUZVTkNfU0NBTEFSLgorQ1JFQVRFIE9SIFJFUExBQ0UgRlVO Q1RJT04gZl9yZXRfcmVjb3JkKCkgUkVUVVJOUyByZWNvcmQgQVMgJCQKKyAgU0VMRUNUICgxLCAy KTo6cmVjb3JkCiskJCBMQU5HVUFHRSBTUUwgSU1NVVRBQkxFOworRVhQTEFJTiAoVkVSQk9TRSwg Q09TVFMgT0ZGKQorU0VMRUNUIHMgRlJPTSByZW1vdGVfdGJsIHJ0LCBmX3JldF9yZWNvcmQoKSBB UyBzKGEgaW50LCBiIGludCkKK1dIRVJFIHMuYSA9IHJ0LmE7CitEUk9QIEZVTkNUSU9OIGZfcmV0 X3JlY29yZCgpOworCistLSBVUERBVEUgLi4uIEZST00gdW5uZXN0KCkgd2l0aCBhIGNvbXBsZXgg ZWxlbWVudCB0eXBlOyBhcmVhKGJveCkKKy0tIHlpZWxkcyB0aGUgdmFsdWUgdG8gbWF0Y2guICBU aGUgbG9ja2luZyBtYWNoaW5lcnkgZm9yIHRoZQorLS0gbm9uLXJlbGF0aW9uIFJURSBnZW5lcmF0 ZXMgYSB3aG9sZS1yb3cgVmFyIHRoYXQgZGVwYXJzZUNvbHVtblJlZgorLS0gZW1pdHMgYXMgUk9X KGY8cnRpPi5jMSwgLi4uKS4KK1VQREFURSByZW1vdGVfdGJsIHIgU0VUIGIgPSA5OTkKK0ZST00g dW5uZXN0KGFycmF5W2JveCAnKCgyLDMpLCgtMiwtMykpJ10pIEFTIHQoYngpCitXSEVSRSByLmEg PSBhcmVhKHQuYngpOworU0VMRUNUICogRlJPTSByZW1vdGVfdGJsIFdIRVJFIGEgSU4gKDIzLCAy NCwgMjUpIE9SREVSIEJZIGE7CisKKy0tIFRoZSBzYW1lIHNoYXBlIHdpdGggQ0FTRSBhbmQgUkVU VVJOSU5HOyBleGVyY2lzZXMgdGhlIERpcmVjdE1vZGlmeQorLS0gcGF0aCBhbmQgdGhlIGV4ZWN1 dG9yJ3MgdHVwbGUtZGVzYyByZWNvbnN0cnVjdGlvbi4KK1VQREFURSByZW1vdGVfdGJsIHIKKyAg IFNFVCBiID0gQ0FTRSBXSEVOIHJhbmRvbSgpID49IDAgVEhFTiA1IEVMU0UgMCBFTkQKKyAgRlJP TSB1bm5lc3QoYXJyYXlbYm94ICcoKDIsMyksKC0yLC0zKSknXSkgQVMgdChieCkKKyBXSEVSRSBy LmEgPSBhcmVhKHQuYngpIFJFVFVSTklORyBhLCBiOworCistLSBSRVRVUk5JTkcgYSB3aG9sZS1y b3cgcmVmZXJlbmNlIHRvIHRoZSBmdW5jdGlvbiBSVEUuICBXaXRob3V0IHRoZQorLS0gcGVyLVJU RSBmdW5jdGlvbiBtZXRhZGF0YSBiZWluZyBwcmVzZXJ2ZWQgb24gdGhlIERpcmVjdE1vZGlmeSBw YXRoCistLSAoRmR3RGlyZWN0TW9kaWZ5UHJpdmF0ZUZ1bmN0aW9ucyAvIEZkd0RpcmVjdE1vZGlm eVByaXZhdGVNaW5SVEluZGV4KSwKKy0tIHRoaXMgd291bGQgZmFpbCB3aXRoICJpbnB1dCBvZiBh bm9ueW1vdXMgY29tcG9zaXRlIHR5cGVzIGlzIG5vdAorLS0gaW1wbGVtZW50ZWQiLgorVVBEQVRF IHJlbW90ZV90YmwgciBTRVQgYiA9IDcKKyAgRlJPTSB1bm5lc3QoYXJyYXlbYm94ICcoKDIsMyks KC0yLC0zKSknXSwKKyAgICAgICAgICAgICAgYXJyYXlbaW50ICcxJ10pIEFTIHQoYngsIGkpCisg V0hFUkUgci5hID0gYXJlYSh0LmJ4KSBSRVRVUk5JTkcgYSwgYiwgdDsKKworLS0gUk9XUyBGUk9N ICguLi4pIHdpdGggc2V2ZXJhbCBmdW5jdGlvbnMuICBGb3JjZSBwdXNoZG93biBiZWNhdXNlIHRo ZQorLS0gY29zdCBtb2RlbCBvdGhlcndpc2UgcGlja3MgYSBsb2NhbCBwbGFuLgorU0VUIGVuYWJs ZV9oYXNoam9pbiA9IG9mZjsKK1NFVCBlbmFibGVfbWVyZ2Vqb2luID0gb2ZmOworU0VUIGVuYWJs ZV9uZXN0bG9vcCA9IG9mZjsKK0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCBy LmEsIHQubiwgdC5zCisgIEZST00gcmVtb3RlX3RibCByLCBST1dTIEZST00gKHVubmVzdChhcnJh eVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3Nl cmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5uIE9SREVSIEJZIHIuYTsK K1NFTEVDVCByLmEsIHQubiwgdC5zCisgIEZST00gcmVtb3RlX3RibCByLCBST1dTIEZST00gKHVu bmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdl bmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMpCisgV0hFUkUgci5hID0gdC5uIE9SREVS IEJZIHIuYTsKKworLS0gV2hvbGUtcm93IFZhciBvbiB0aGUgYWJzb3JiZWQgZnVuY3Rpb24gc2lk ZSAoZS5nLiB2aWEgYSBjYXN0IHRvCistLSB0ZXh0KS4gIEV4ZXJjaXNlcyBib3RoIGRlcGFyc2VD b2x1bW5SZWYgd2hvbGUtcm93IGJyYW5jaCBhbmQgdGhlCistLSBnZXRfdHVwZGVzY19mb3Jfam9p bl9zY2FuX3R1cGxlcygpIFJURV9GVU5DVElPTiBtZXRhZGF0YSBwYXRoLgorRVhQTEFJTiAoVkVS Qk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHQ6OnRleHQsIHIuYQorICBGUk9NIHJlbW90ZV90Ymwg ciwgUk9XUyBGUk9NICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAorICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBnZW5lcmF0ZV9zZXJpZXMoMTEsIDEzKSkgQVMgdChuLCBzKQorIFdIRVJF IHIuYSA9IHQubiBPUkRFUiBCWSByLmE7CitTRUxFQ1QgdDo6dGV4dCwgci5hCisgIEZST00gcmVt b3RlX3RibCByLCBST1dTIEZST00gKHVubmVzdChhcnJheVszLCA2LCA5XSksCisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX3NlcmllcygxMSwgMTMpKSBBUyB0KG4sIHMp CisgV0hFUkUgci5hID0gdC5uIE9SREVSIEJZIHIuYTsKK1JFU0VUIGVuYWJsZV9oYXNoam9pbjsK K1JFU0VUIGVuYWJsZV9tZXJnZWpvaW47CitSRVNFVCBlbmFibGVfbmVzdGxvb3A7CisKKy0tIFZv bGF0aWxlIGZ1bmN0aW9uIGluIFJPV1MgRlJPTSBkaXNxdWFsaWZpZXMgdGhlIHdob2xlIFJURS4K K0VYUExBSU4gKFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCByLmEgRlJPTSByZW1vdGVfdGJs IHIsCisgICAgICAgICAgICAgICAgUk9XUyBGUk9NICh1bm5lc3QoYXJyYXlbMywgNiwgOV0pLAor ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGVfc2VyaWVzKDEsIDQgKyAocmFuZG9t KCkgKiAwKTo6aW50KSkgQVMgdChuLCBzKQorIFdIRVJFIHIuYSA9IHQubjsKKworLS0gTEFURVJB TCBmdW5jdGlvbiByZWZlcmVuY2luZyBhIGZvcmVpZ24gVmFyOiBwb3N0Z3Jlc19mZHcncworLS0g Zm9yZWlnbi1qb2luIHB1c2hkb3duIHJlamVjdHMgdGhpcyB2aWEgdGhlIGpvaW5yZWwtPmxhdGVy YWxfcmVsaWRzCistLSBjaGVjazsgdGhlIHBsYW4gaXMgdGhlcmVmb3JlIGEgbG9jYWwgTmVzdExv b3AgKyBGdW5jdGlvblNjYW4uCitFWFBMQUlOIChWRVJCT1NFLCBDT1NUUyBPRkYpCitTRUxFQ1Qg ci5hLCB0LnggRlJPTSByZW1vdGVfdGJsIHIsIExBVEVSQUwgdW5uZXN0KGFycmF5W3IuYV0pIEFT IHQoeCkKK1dIRVJFIHIuYSA8PSAzIE9SREVSIEJZIHIuYTsKKworLS0gT3V0ZXIgam9pbnMgd2l0 aCB0aGUgZnVuY3Rpb24gUlRFIGFyZSBub3QgcHVzaGVkIGRvd24gKG9ubHkgSU5ORVIKKy0tIGpv aW5zIGFyZSBzdXBwb3J0ZWQgYnkgZnVuY3Rpb25fcnRlX3B1c2hkb3duX29rKCkpLgorRVhQTEFJ TiAoVkVSQk9TRSwgQ09TVFMgT0ZGKQorU0VMRUNUIHIuYSwgdC5uIEZST00gcmVtb3RlX3RibCBy CisgICAgIExFRlQgSk9JTiB1bm5lc3QoYXJyYXlbMSwgMiwgM10pIEFTIHQobikgT04gci5hID0g dC5uCisgV0hFUkUgci5hIDw9IDUgT1JERVIgQlkgci5hOworCistLSBTRU1JIGpvaW4gKEVYSVNU Uykgd2l0aCBhIGZ1bmN0aW9uIFJURSBpcyBhbHNvIG5vdCBwdXNoZWQgZG93bi4KK0VYUExBSU4g KFZFUkJPU0UsIENPU1RTIE9GRikKK1NFTEVDVCByLmEgRlJPTSByZW1vdGVfdGJsIHIKKyBXSEVS RSBFWElTVFMgKFNFTEVDVCAxIEZST00gdW5uZXN0KGFycmF5WzMsIDYsIDldKSBBUyB0KG4pIFdI RVJFIHQubiA9IHIuYSkKKyBPUkRFUiBCWSByLmE7CisKK0RST1AgRk9SRUlHTiBUQUJMRSByZW1v dGVfdGJsOworRFJPUCBUQUJMRSBiYXNlX3RibF9mbjsKKwogLS0gPT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC0tIENo ZWNrIHRoYXQgdXNlcmlkIHRvIHVzZSB3aGVuIHF1ZXJ5aW5nIHRoZSByZW1vdGUgdGFibGUgaXMg Y29ycmVjdGx5CiAtLSBwcm9wYWdhdGVkIGludG8gZm9yZWlnbiByZWxzIHByZXNlbnQgaW4gc3Vi cXVlcmllcyB1bmRlciBhbiBVTklPTiBBTEwKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGlt aXplci91dGlsL3JlbG5vZGUuYyBiL3NyYy9iYWNrZW5kL29wdGltaXplci91dGlsL3JlbG5vZGUu YwppbmRleCAzZmMyYzJmNzFkMC4uZjIxYWUxYmFlYjIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L29wdGltaXplci91dGlsL3JlbG5vZGUuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6ZXIvdXRp bC9yZWxub2RlLmMKQEAgLTc0Niw2ICs3NDYsMzAgQEAgc2V0X2ZvcmVpZ25fcmVsX3Byb3BlcnRp ZXMoUmVsT3B0SW5mbyAqam9pbnJlbCwgUmVsT3B0SW5mbyAqb3V0ZXJfcmVsLAogCQkJam9pbnJl bC0+ZmR3cm91dGluZSA9IG91dGVyX3JlbC0+ZmR3cm91dGluZTsKIAkJfQogCX0KKwllbHNlIGlm IChPaWRJc1ZhbGlkKG91dGVyX3JlbC0+c2VydmVyaWQpICYmCisJCQkgaW5uZXJfcmVsLT5ydGVr aW5kID09IFJURV9GVU5DVElPTikKKwl7CisJCS8qCisJCSAqIE9uZSBzaWRlIGlzIGEgZm9yZWln biByZWxhdGlvbiwgdGhlIG90aGVyIHNpZGUgaXMgYSBmdW5jdGlvbiBSVEUuCisJCSAqIElmIHRo ZSBmdW5jdGlvbiBpcyBJTU1VVEFCTEUsIHRoZSBGRFcgY2FuIGFic29yYiB0aGUgZnVuY3Rpb24g Y2FsbAorCQkgKiBpbnRvIHRoZSByZW1vdGUgcXVlcnkgKHRoZSByZXN1bHQgaXMgaWRlbnRpY2Fs IHJlZ2FyZGxlc3Mgb2Ygd2hpY2gKKwkJICogc2VydmVyIGV2YWx1YXRlcyBpdCkuICBMZXQgdGhl IEZEVyBkZWNpZGUgd2hldGhlciB0aGUgam9pbiBpcworCQkgKiBhY3R1YWxseSBzaGlwcGFibGU7 IGhlcmUgd2UganVzdCBwcm9wYWdhdGUgdGhlIEZEVyByb3V0aW5lIHNvIHRoZQorCQkgKiBGRFcg Z2V0cyBhIGNoYW5jZS4KKwkJICovCisJCWpvaW5yZWwtPnNlcnZlcmlkID0gb3V0ZXJfcmVsLT5z ZXJ2ZXJpZDsKKwkJam9pbnJlbC0+dXNlcmlkID0gb3V0ZXJfcmVsLT51c2VyaWQ7CisJCWpvaW5y ZWwtPnVzZXJpZGlzY3VycmVudCA9IG91dGVyX3JlbC0+dXNlcmlkaXNjdXJyZW50OworCQlqb2lu cmVsLT5mZHdyb3V0aW5lID0gb3V0ZXJfcmVsLT5mZHdyb3V0aW5lOworCX0KKwllbHNlIGlmIChP aWRJc1ZhbGlkKGlubmVyX3JlbC0+c2VydmVyaWQpICYmCisJCQkgb3V0ZXJfcmVsLT5ydGVraW5k ID09IFJURV9GVU5DVElPTikKKwl7CisJCWpvaW5yZWwtPnNlcnZlcmlkID0gaW5uZXJfcmVsLT5z ZXJ2ZXJpZDsKKwkJam9pbnJlbC0+dXNlcmlkID0gaW5uZXJfcmVsLT51c2VyaWQ7CisJCWpvaW5y ZWwtPnVzZXJpZGlzY3VycmVudCA9IGlubmVyX3JlbC0+dXNlcmlkaXNjdXJyZW50OworCQlqb2lu cmVsLT5mZHdyb3V0aW5lID0gaW5uZXJfcmVsLT5mZHdyb3V0aW5lOworCX0KIH0KIAogLyoKLS0g CjIuMzkuNSAoQXBwbGUgR2l0LTE1NCkKCg== --000000000000ff450806522b45c4--